{"report_id":"206f0d80-ee74-43d4-bd7e-6cf563b6bfaf","version":0,"status":"done","tags":[],"date":"2026-07-27T10:23:50Z","url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":0,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"final":{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"title":"Crypto Koin - Home","dom":{"size":3768,"mime_type":"text/html; charset=utf-8","magic":"HTML document, ASCII text, with very long lines (565)","md5":"4b4199df2931a46360857dee9aa92003","sha1":"9335e3096a9b97e703775ec24b949a239b21a75a","sha256":"facb023a4b99314ec31a89516cb6f6be1e51224220823fb9a4af3013c7155508","sha512":"e619093f056775f8da34d7aa77d31efe2d8eaa60ed3297d868f518c7e32dabec412dfc3b07b41c5a3e457b09fb9f5044669546def4f70fc804f9bca3ef26a369","ssdeep":"","tlshash":"147184075ab0940593545524b4e7b418cfb6464be13c8e70f29c0a6c1fe0badd4f792e","dom_hash":"domhash4fd2882731962e655af56bbeb8911cde","first_seen":"2026-07-27T07:51:04.640281Z","last_seen":"2026-07-27T10:24:01.430855Z","times_seen":3,"resource_available":false,"data":null}},"submit":{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":0,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"tags":null,"meta":null},"settings":{"access":"public","device_type":"desktop","expires_at":"2027-08-31T10:23:50Z","useragent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0","referer":"","cookies":null,"exit_node":"qguvgzjxzsgb3vs"},"stats":{"alert_count":{"ids":0,"urlquery":0,"analyzer":0}},"detection":{"ids":null,"analyzer":null,"urlquery":null},"summary":[{"fqdn":"cyptokion.vip","ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"domain_registered":"2025-09-23","domain_rank":0,"first_seen":"2026-07-27T07:51:00.523391Z","last_seen":"2026-07-27T07:51:00.523391Z","alert_count":0,"request_count":74,"received_data":4315261,"sent_data":88217,"comment":"","tags":null,"fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]},{"name":"Bootstrap","description":"Bootstrap is a free and open-source CSS framework directed at responsive, mobile-first front-end web development. It contains CSS and JavaScript-based design templates for typography, forms, buttons, navigation, and other interface components.","website":"https://getbootstrap.com","common_platform_enumeration":"cpe:2.3:a:getbootstrap:bootstrap:*:*:*:*:*:*:*:*","icon":"Bootstrap.svg","categories":["UI frameworks"]},{"name":"Easy Pie Chart","description":"Lightweight jQuery plugin to render and animate nice pie charts with the HTML5 canvas element.","website":"https://rendro.github.io/easy-pie-chart/","common_platform_enumeration":"","icon":"","categories":["JavaScript libraries"]},{"name":"OWL Carousel","description":"OWL Carousel is an enabled jQuery plugin that lets you create responsive carousel sliders.","website":"https://owlcarousel2.github.io/OwlCarousel2/","common_platform_enumeration":"","icon":"OWL Carousel.png","categories":["JavaScript libraries"]},{"name":"jQuery:3.2.1","description":"jQuery is a JavaScript library which is a free, open-source software designed to simplify HTML DOM tree traversal and manipulation, as well as event handling, CSS animation, and Ajax.","website":"https://jquery.com","common_platform_enumeration":"cpe:2.3:a:jquery:jquery:*:*:*:*:*:*:*:*","icon":"jQuery.svg","categories":["JavaScript libraries"]},{"name":"Modernizr","description":"Modernizr is a JavaScript library that detects the features available in a user's browser.","website":"https://modernizr.com","common_platform_enumeration":"","icon":"Modernizr.svg","categories":["JavaScript libraries"]},{"name":"jQuery UI","description":"jQuery UI is a collection of GUI widgets, animated visual effects, and themes implemented with jQuery, Cascading Style Sheets, and HTML.","website":"https://jqueryui.com","common_platform_enumeration":"cpe:2.3:a:jquery:jquery_ui:*:*:*:*:*:*:*:*","icon":"jQuery UI.svg","categories":["JavaScript libraries"]},{"name":"Three.js","description":"Three.js is a cross-browser JavaScript library and application programming interface used to create and display animated 3D computer graphics in a web browser using WebGL.","website":"https://threejs.org","common_platform_enumeration":"","icon":"Three.js.svg","categories":["JavaScript graphics"]},{"name":"WOW","description":"Reveal CSS animation as you scroll down a page.","website":"https://www.delac.io/WOW","common_platform_enumeration":"","icon":"","categories":["JavaScript frameworks","Web frameworks","JavaScript graphics"]}]},{"fqdn":"fonts.gstatic.com","ip":{"addr":"142.250.178.67","port":443,"asn":15169,"as":"GOOGLE","country":"United States","country_code":"US"},"domain_registered":"2008-02-11","domain_rank":0,"first_seen":"2014-04-02T10:51:04Z","last_seen":"2026-07-26T22:19:52.505461Z","alert_count":0,"request_count":1,"received_data":24393,"sent_data":545,"comment":"","tags":null,"fingerprints":null},{"fqdn":"fonts.googleapis.com","ip":{"addr":"142.250.178.106","port":443,"asn":15169,"as":"GOOGLE","country":"United States","country_code":"US"},"domain_registered":"2005-01-25","domain_rank":313,"first_seen":"2012-05-23T12:41:44Z","last_seen":"2026-07-26T22:23:14.439231Z","alert_count":0,"request_count":1,"received_data":6157,"sent_data":524,"comment":"","tags":null,"fingerprints":[{"name":"HSTS","description":"HTTP Strict Transport Security (HSTS) informs browsers that the site should only be accessed using HTTPS.","website":"https://www.rfc-editor.org/rfc/rfc6797#section-6.1","common_platform_enumeration":"","icon":"","categories":["Security"]}]},{"fqdn":"cdn.gtranslate.net","ip":{"addr":"172.67.68.204","port":443,"asn":13335,"as":"CLOUDFLARENET","country":"","country_code":"zz"},"domain_registered":"2011-05-26","domain_rank":101861,"first_seen":"2022-11-07T21:49:20Z","last_seen":"2026-07-24T01:31:43.488627Z","alert_count":0,"request_count":1,"received_data":23856,"sent_data":470,"comment":"","tags":null,"fingerprints":[{"name":"Cloudflare","description":"Cloudflare is a web-infrastructure and website-security company, providing content-delivery-network services, DDoS mitigation, Internet security, and distributed domain-name-server services.","website":"https://www.cloudflare.com","common_platform_enumeration":"","icon":"CloudFlare.svg","categories":["CDN"]}]}],"files":null,"artifacts":{"windows_shortcuts":null,"files":null,"telegram":null,"pdfs":null,"clipboard":null},"sensors":{"ids":null,"analyzer":null,"urlquery":null},"javascript":{"script":[{"url":{"schema":"https","addr":"cyptokion.vip/js/vendor/modernizr-2.8.3.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"introduction_type":"scriptElement","is_inline":false,"md5":"baa31b73aedd668e9ab4b706b79b9cb2","sha1":"f543cb4bffc7525eb65fd7bb0d9fb6faad5bdf5c","sha256":"d5448f267dc6b4a999e770b3438b3cedff09bd09f606028a8e031c46eb90caff","sha512":"6a8db463c38a9ba3b89e1eda35f540a43622189cec098b165e72ea5a279c49dfde8be57f9651a9235efb26218995b212f4dc1558c44d1ba65e1adaf7205ffcf8","ssdeep":"384:AEDDCHW519TpJGd+xedmAnx6KQoZRY5y60Hh5pD:ACDtjecAgKr25y60H5","tlshash":"2562facdb153b1168397607a61bf460ff23e9899a8184854e059c5ecbe74ca8473bf1e","size":15524,"data":"","first_seen":"2025-01-06T16:40:49.922215Z","last_seen":"2026-08-11T00:25:55.223715Z","times_seen":53,"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"introduction_type":"scriptElement","is_inline":true,"md5":"334e5250a9201b2046be2a8dfc1ece09","sha1":"95499334dc0339e5468d67d08f249ba7c5174707","sha256":"833eb3f4d586962f6d9293dfa108fe7ab777b0e05e6df42e6be6ecf02f072329","sha512":"8618429b6581c71ed8b436316b6a90e15ce970727a6d91c9dc3a44c0d97c344401a34c0d736ffe9fe1af08280fb676e7a71294073be8f191566e633e2fc1a2a7","ssdeep":"","tlshash":"7ec02b2751f17f84440ea103f20a006c3b4809c491305436167c3d0c07ef1f8abd3494","size":145,"data":"","first_seen":"2025-08-09T18:04:55.070325Z","last_seen":"2026-08-08T04:36:58.848428Z","times_seen":15,"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"introduction_type":"scriptElement","is_inline":true,"md5":"d2d25f4aecaa1bf5c5186803ada8d7ae","sha1":"9e84ee24a300aeee22e41ac81bf1a5435d307044","sha256":"bb635e200e1aa8c46fc0f30fbd37a90f2996696ef79f8cbba970d38974b1c9f2","sha512":"449c98f2cab088515101d38d76ffbf9658615a0435a6ad376d4aab802f57cbd0ab7ac6c493b332ee4545923632495ea85a26e67c293ca3ad7442f6e4c7dbb137","ssdeep":"","tlshash":"34e06f3d3c3580944ba200b881bbe2283e1a30704084d95798aa88696cf0fcaae029d9","size":376,"data":"","first_seen":"2026-06-09T23:03:31.299351Z","last_seen":"2026-07-27T10:24:01.524436Z","times_seen":4,"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"introduction_type":"scriptElement","is_inline":true,"md5":"c439ae0de4442cd21d54a7a73124a530","sha1":"ff954d8061286930d33cbe7100bee009e439d510","sha256":"2ae7dc5974378f0928f66503a6893d1a884cd7769e2ff809f865e84d9ad36f16","sha512":"fd8aa559a6a13d59b3c1a0ba6e6e129db0132a689fa9a801c521dc8e3dcb3340e8f60bed6fe18aaf1b2e43563ba263b8124e82a85a5f81c53cdbc73e43adcaff","ssdeep":"","tlshash":"6ae0f13c3c30808587e200f8c0bbe6383e1730604044d943a4da882d1cf0fdd7d02894","size":416,"data":"","first_seen":"2026-07-27T07:51:04.768005Z","last_seen":"2026-07-27T10:24:01.525233Z","times_seen":3,"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"introduction_type":"scriptElement","is_inline":true,"md5":"55a72d25082d7e5ea402482b47b3ed14","sha1":"457d69e8fe7837c7c6a44130285be5e86e4f88e2","sha256":"d4fdb81fac4508f0515e822f46b015dc0d5dcfa77c68badf1867c65ae7bbc207","sha512":"13d8f382370318934e109495f737b467b6d98d150a28f366ab4da8f1d30fcb0c385c25c3f745f261f75b7833a219ac420ca9b94da41a7e9ea46005041f4f2b27","ssdeep":"","tlshash":"eec08c0a10346cbc274e320caa953e40943804b815203d28b3eb82064bc6003474a503","size":163,"data":"","first_seen":"2025-04-12T16:55:02.103647Z","last_seen":"2026-08-11T00:25:55.29566Z","times_seen":51,"alerts":{"ids":null,"analyzer":null,"urlquery":null}}],"eval":null,"write":null,"console":null},"http":[{"url":{"schema":"https","addr":"cyptokion.vip/css/animate.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.266Z","timestamp":1785147795266,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/animate.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 3988\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":70824,"size_decoded":4525,"mime_type":"text/css","magic":"ASCII text","md5":"d3ccf779936eba398a67c290f6ebfb42","sha1":"ec7949d1375f27c2dfd35df4bad80449f52a7072","sha256":"2f44e16894d98604375a790448f4aad765c148fee23b878971496c2ac5374f9f","sha512":"6159a55d279928a7ef1f920f6004d431bb0f2489d45b896f7f4f1132591845c982792311968b7d44ede513327c21a28cf57990079d8913203dca7737f27ca68e","ssdeep":"384:xzHuaubH2fqftulucfwf7l3laGPGF+1fHf7SpS/fjfHqDxbe3NxdV2PVrib:ZHuauqfqftulucfwfk+1fHf7SpS/fjfp","tlshash":"e3631f6d2991118457238a5d83df9e68273ce573182a9cef73c2488bdf86fac67c5207","first_seen":"2023-04-05T14:01:52Z","last_seen":"2026-08-11T00:25:55.207439Z","times_seen":668,"resource_available":false,"data":"QGNoYXJzZXQgIlVURi04IjsKCi8qIQpBbmltYXRlLmNzcyAtIGh0dHA6Ly9kYW5lZGVuLm1lL2FuaW1hdGUKVmVyc2lvbiAtIDMuNC4wCkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAtIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKCkNvcHlyaWdodCAoYykgMjAxNSBEYW5pZWwgRWRlbgoqLwoKLmFuaW1hdGVkIHsKICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7CiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxczsKICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7CiAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDsKfQoKLmFuaW1hdGVkLmluZmluaXRlIHsKICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwp9CgouYW5pbWF0ZWQuaGluZ2UgewogIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAyczsKICBhbmltYXRpb24tZHVyYXRpb246IDJzOwp9CgouYW5pbWF0ZWQuYm91bmNlSW4sCi5hbmltYXRlZC5ib3VuY2VPdXQgewogIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAuNzVzOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjc1czsKfQoKLmFuaW1hdGVkLmZsaXBPdXRYLAouYW5pbWF0ZWQuZmxpcE91dFkgewogIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAuNzVzOwogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjc1czsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZSB7CiAgZnJvbSwgMjAlLCA1MyUsIDgwJSwgdG8gewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTsKICB9CgogIDQwJSwgNDMlIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNzU1LCAwLjA1MCwgMC44NTUsIDAuMDYwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjc1NSwgMC4wNTAsIDAuODU1LCAwLjA2MCk7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTMwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzBweCwgMCk7CiAgfQoKICA3MCUgewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUwLCAwLjg1NSwgMC4wNjApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNzU1LCAwLjA1MCwgMC44NTUsIDAuMDYwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTVweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xNXB4LCAwKTsKICB9CgogIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwtNHB4LDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLC00cHgsMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIGJvdW5jZSB7CiAgZnJvbSwgMjAlLCA1MyUsIDgwJSwgdG8gewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTsKICB9CgogIDQwJSwgNDMlIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNzU1LCAwLjA1MCwgMC44NTUsIDAuMDYwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjc1NSwgMC4wNTAsIDAuODU1LCAwLjA2MCk7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTMwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzBweCwgMCk7CiAgfQoKICA3MCUgewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUwLCAwLjg1NSwgMC4wNjApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNzU1LCAwLjA1MCwgMC44NTUsIDAuMDYwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTVweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xNXB4LCAwKTsKICB9CgogIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwtNHB4LDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLC00cHgsMCk7CiAgfQp9CgouYm91bmNlIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2U7CiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZTsKICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBib3R0b207CiAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGJvdHRvbTsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZsYXNoIHsKICBmcm9tLCA1MCUsIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICAyNSUsIDc1JSB7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKQGtleWZyYW1lcyBmbGFzaCB7CiAgZnJvbSwgNTAlLCB0byB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgMjUlLCA3NSUgewogICAgb3BhY2l0eTogMDsKICB9Cn0KCi5mbGFzaCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmxhc2g7CiAgYW5pbWF0aW9uLW5hbWU6IGZsYXNoOwp9CgovKiBvcmlnaW5hbGx5IGF1dGhvcmVkIGJ5IE5pY2sgUGV0dGl0IC0gaHR0cHM6Ly9naXRodWIuY29tL25pY2twZXR0aXQvZ2xpZGUgKi8KCkAtd2Via2l0LWtleWZyYW1lcyBwdWxzZSB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICB9CgogIDUwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjA1LCAxLjA1LCAxLjA1KTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjA1LCAxLjA1LCAxLjA1KTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KfQoKQGtleWZyYW1lcyBwdWxzZSB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICB9CgogIDUwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjA1LCAxLjA1LCAxLjA1KTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjA1LCAxLjA1LCAxLjA1KTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KfQoKLnB1bHNlIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBwdWxzZTsKICBhbmltYXRpb24tbmFtZTogcHVsc2U7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBydWJiZXJCYW5kIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KCiAgMzAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEuMjUsIDAuNzUsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMjUsIDAuNzUsIDEpOwogIH0KCiAgNDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDEuMjUsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDEuMjUsIDEpOwogIH0KCiAgNTAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEuMTUsIDAuODUsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMTUsIDAuODUsIDEpOwogIH0KCiAgNjUlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC45NSwgMS4wNSwgMSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjk1LCAxLjA1LCAxKTsKICB9CgogIDc1JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjA1LCAuOTUsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMDUsIC45NSwgMSk7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICB9Cn0KCkBrZXlmcmFtZXMgcnViYmVyQmFuZCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICB9CgogIDMwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjI1LCAwLjc1LCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjI1LCAwLjc1LCAxKTsKICB9CgogIDQwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAxLjI1LCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAxLjI1LCAxKTsKICB9CgogIDUwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjE1LCAwLjg1LCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjE1LCAwLjg1LCAxKTsKICB9CgogIDY1JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguOTUsIDEuMDUsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC45NSwgMS4wNSwgMSk7CiAgfQoKICA3NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMS4wNSwgLjk1LCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjA1LCAuOTUsIDEpOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMSwgMSwgMSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMSwgMSwgMSk7CiAgfQp9CgoucnViYmVyQmFuZCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcnViYmVyQmFuZDsKICBhbmltYXRpb24tbmFtZTogcnViYmVyQmFuZDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHNoYWtlIHsKICBmcm9tLCB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KCiAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwcHgsIDAsIDApOwogIH0KCiAgMjAlLCA0MCUsIDYwJSwgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTBweCwgMCwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIHNoYWtlIHsKICBmcm9tLCB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KCiAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwcHgsIDAsIDApOwogIH0KCiAgMjAlLCA0MCUsIDYwJSwgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTBweCwgMCwgMCk7CiAgfQp9Cgouc2hha2UgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHNoYWtlOwogIGFuaW1hdGlvbi1uYW1lOiBzaGFrZTsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHN3aW5nIHsKICAyMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDE1ZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgMTVkZWcpOwogIH0KCiAgNDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtMTBkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtMTBkZWcpOwogIH0KCiAgNjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA1ZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNWRlZyk7CiAgfQoKICA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC01ZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTVkZWcpOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDBkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAwZGVnKTsKICB9Cn0KCkBrZXlmcmFtZXMgc3dpbmcgewogIDIwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgMTVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAxNWRlZyk7CiAgfQoKICA0MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC0xMGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC0xMGRlZyk7CiAgfQoKICA2MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA1ZGVnKTsKICB9CgogIDgwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNWRlZyk7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgMGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDBkZWcpOwogIH0KfQoKLnN3aW5nIHsKICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHRvcCBjZW50ZXI7CiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGNlbnRlcjsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBzd2luZzsKICBhbmltYXRpb24tbmFtZTogc3dpbmc7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyB0YWRhIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KCiAgMTAlLCAyMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjksIC45LCAuOSkgcm90YXRlM2QoMCwgMCwgMSwgLTNkZWcpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC45LCAuOSwgLjkpIHJvdGF0ZTNkKDAsIDAsIDEsIC0zZGVnKTsKICB9CgogIDMwJSwgNTAlLCA3MCUsIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjEsIDEuMSwgMS4xKSByb3RhdGUzZCgwLCAwLCAxLCAzZGVnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjEsIDEuMSwgMS4xKSByb3RhdGUzZCgwLCAwLCAxLCAzZGVnKTsKICB9CgogIDQwJSwgNjAlLCA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMS4xLCAxLjEsIDEuMSkgcm90YXRlM2QoMCwgMCwgMSwgLTNkZWcpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMSwgMS4xLCAxLjEpIHJvdGF0ZTNkKDAsIDAsIDEsIC0zZGVnKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KfQoKQGtleWZyYW1lcyB0YWRhIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KCiAgMTAlLCAyMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjksIC45LCAuOSkgcm90YXRlM2QoMCwgMCwgMSwgLTNkZWcpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC45LCAuOSwgLjkpIHJvdGF0ZTNkKDAsIDAsIDEsIC0zZGVnKTsKICB9CgogIDMwJSwgNTAlLCA3MCUsIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjEsIDEuMSwgMS4xKSByb3RhdGUzZCgwLCAwLCAxLCAzZGVnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjEsIDEuMSwgMS4xKSByb3RhdGUzZCgwLCAwLCAxLCAzZGVnKTsKICB9CgogIDQwJSwgNjAlLCA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMS4xLCAxLjEsIDEuMSkgcm90YXRlM2QoMCwgMCwgMSwgLTNkZWcpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMSwgMS4xLCAxLjEpIHJvdGF0ZTNkKDAsIDAsIDEsIC0zZGVnKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KfQoKLnRhZGEgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHRhZGE7CiAgYW5pbWF0aW9uLW5hbWU6IHRhZGE7Cn0KCi8qIG9yaWdpbmFsbHkgYXV0aG9yZWQgYnkgTmljayBQZXR0aXQgLSBodHRwczovL2dpdGh1Yi5jb20vbmlja3BldHRpdC9nbGlkZSAqLwoKQC13ZWJraXQta2V5ZnJhbWVzIHdvYmJsZSB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9CgogIDE1JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTI1JSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgLTVkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjUlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAtNWRlZyk7CiAgfQoKICAzMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgM2RlZyk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgM2RlZyk7CiAgfQoKICA0NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xNSUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIC0zZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTE1JSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgLTNkZWcpOwogIH0KCiAgNjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMCUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIDJkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMCUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIDJkZWcpOwogIH0KCiAgNzUlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNSUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIC0xZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTUlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAtMWRlZyk7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCkBrZXlmcmFtZXMgd29iYmxlIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KCiAgMTUlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjUlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAtNWRlZyk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yNSUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIC01ZGVnKTsKICB9CgogIDMwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjAlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAzZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjAlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAzZGVnKTsKICB9CgogIDQ1JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTE1JSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgLTNkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTUlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAtM2RlZyk7CiAgfQoKICA2MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgMmRlZyk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgMmRlZyk7CiAgfQoKICA3NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC01JSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgLTFkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNSUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIC0xZGVnKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKLndvYmJsZSB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogd29iYmxlOwogIGFuaW1hdGlvbi1uYW1lOiB3b2JibGU7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBqZWxsbyB7CiAgZnJvbSwgMTEuMSUsIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KCiAgMjIuMiUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7CiAgICB0cmFuc2Zvcm06IHNrZXdYKC0xMi41ZGVnKSBza2V3WSgtMTIuNWRlZyk7CiAgfQoKICAzMy4zJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7CiAgICB0cmFuc2Zvcm06IHNrZXdYKDYuMjVkZWcpIHNrZXdZKDYuMjVkZWcpOwogIH0KCiAgNDQuNCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0zLjEyNWRlZykgc2tld1koLTMuMTI1ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpOwogIH0KCiAgNTUuNSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKDEuNTYyNWRlZykgc2tld1koMS41NjI1ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpOwogIH0KCiAgNjYuNiUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0wLjc4MTI1ZGVnKSBza2V3WSgtMC43ODEyNWRlZyk7CiAgICB0cmFuc2Zvcm06IHNrZXdYKC0wLjc4MTI1ZGVnKSBza2V3WSgtMC43ODEyNWRlZyk7CiAgfQoKICA3Ny43JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goMC4zOTA2MjVkZWcpIHNrZXdZKDAuMzkwNjI1ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goMC4zOTA2MjVkZWcpIHNrZXdZKDAuMzkwNjI1ZGVnKTsKICB9CgogIDg4LjglIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgtMC4xOTUzMTI1ZGVnKSBza2V3WSgtMC4xOTUzMTI1ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goLTAuMTk1MzEyNWRlZykgc2tld1koLTAuMTk1MzEyNWRlZyk7CiAgfQp9CgpAa2V5ZnJhbWVzIGplbGxvIHsKICBmcm9tLCAxMS4xJSwgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQoKICAyMi4yJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goLTEyLjVkZWcpIHNrZXdZKC0xMi41ZGVnKTsKICB9CgogIDMzLjMlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCg2LjI1ZGVnKSBza2V3WSg2LjI1ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goNi4yNWRlZykgc2tld1koNi4yNWRlZyk7CiAgfQoKICA0NC40JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goLTMuMTI1ZGVnKSBza2V3WSgtMy4xMjVkZWcpOwogICAgdHJhbnNmb3JtOiBza2V3WCgtMy4xMjVkZWcpIHNrZXdZKC0zLjEyNWRlZyk7CiAgfQoKICA1NS41JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goMS41NjI1ZGVnKSBza2V3WSgxLjU2MjVkZWcpOwogICAgdHJhbnNmb3JtOiBza2V3WCgxLjU2MjVkZWcpIHNrZXdZKDEuNTYyNWRlZyk7CiAgfQoKICA2Ni42JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goLTAuNzgxMjVkZWcpIHNrZXdZKC0wLjc4MTI1ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goLTAuNzgxMjVkZWcpIHNrZXdZKC0wLjc4MTI1ZGVnKTsKICB9CgogIDc3LjclIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpOwogICAgdHJhbnNmb3JtOiBza2V3WCgwLjM5MDYyNWRlZykgc2tld1koMC4zOTA2MjVkZWcpOwogIH0KCiAgODguOCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC0wLjE5NTMxMjVkZWcpIHNrZXdZKC0wLjE5NTMxMjVkZWcpOwogICAgdHJhbnNmb3JtOiBza2V3WCgtMC4xOTUzMTI1ZGVnKSBza2V3WSgtMC4xOTUzMTI1ZGVnKTsKICB9Cn0KCi5qZWxsbyB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogamVsbG87CiAgYW5pbWF0aW9uLW5hbWU6IGplbGxvOwogIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluIHsKICBmcm9tLCAyMCUsIDQwJSwgNjAlLCA4MCUsIHRvIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgfQoKICAwJSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjMsIC4zLCAuMyk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjMsIC4zLCAuMyk7CiAgfQoKICAyMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMS4xLCAxLjEsIDEuMSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMS4xLCAxLjEsIDEuMSk7CiAgfQoKICA0MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjksIC45LCAuOSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjksIC45LCAuOSk7CiAgfQoKICA2MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEuMDMsIDEuMDMsIDEuMDMpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMDMsIDEuMDMsIDEuMDMpOwogIH0KCiAgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC45NywgLjk3LCAuOTcpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC45NywgLjk3LCAuOTcpOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEsIDEsIDEpOwogIH0KfQoKQGtleWZyYW1lcyBib3VuY2VJbiB7CiAgZnJvbSwgMjAlLCA0MCUsIDYwJSwgODAlLCB0byB7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogIH0KCiAgMCUgewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogIH0KCiAgMjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEuMSwgMS4xLCAxLjEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMSwgMS4xLCAxLjEpOwogIH0KCiAgNDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC45LCAuOSwgLjkpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC45LCAuOSwgLjkpOwogIH0KCiAgNjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLjAzLCAxLjAzLCAxLjAzKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLjAzLCAxLjAzLCAxLjAzKTsKICB9CgogIDgwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguOTcsIC45NywgLjk3KTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguOTcsIC45NywgLjk3KTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCgxLCAxLCAxKTsKICB9Cn0KCi5ib3VuY2VJbiB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogYm91bmNlSW47CiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZUluOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5Eb3duIHsKICBmcm9tLCA2MCUsIDc1JSwgOTAlLCB0byB7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogIH0KCiAgMCUgewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTMwMDBweCwgMCk7CiAgfQoKICA2MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyNXB4LCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMjVweCwgMCk7CiAgfQoKICA3NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwcHgsIDApOwogIH0KCiAgOTAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCA1cHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCA1cHgsIDApOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgpAa2V5ZnJhbWVzIGJvdW5jZUluRG93biB7CiAgZnJvbSwgNjAlLCA3NSUsIDkwJSwgdG8gewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICB9CgogIDAlIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTMwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDAwcHgsIDApOwogIH0KCiAgNjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMjVweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDI1cHgsIDApOwogIH0KCiAgNzUlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMHB4LCAwKTsKICB9CgogIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgNXB4LCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgNXB4LCAwKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKLmJvdW5jZUluRG93biB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogYm91bmNlSW5Eb3duOwogIGFuaW1hdGlvbi1uYW1lOiBib3VuY2VJbkRvd247Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJbkxlZnQgewogIGZyb20sIDYwJSwgNzUlLCA5MCUsIHRvIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgfQoKICAwJSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0zMDAwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMzAwMHB4LCAwLCAwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDI1cHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgyNXB4LCAwLCAwKTsKICB9CgogIDc1JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTBweCwgMCwgMCk7CiAgfQoKICA5MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDVweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDVweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCkBrZXlmcmFtZXMgYm91bmNlSW5MZWZ0IHsKICBmcm9tLCA2MCUsIDc1JSwgOTAlLCB0byB7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogIH0KCiAgMCUgewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMzAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTMwMDBweCwgMCwgMCk7CiAgfQoKICA2MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgyNXB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjVweCwgMCwgMCk7CiAgfQoKICA3NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwcHgsIDAsIDApOwogIH0KCiAgOTAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCg1cHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCg1cHgsIDAsIDApOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgouYm91bmNlSW5MZWZ0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VJbkxlZnQ7CiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZUluTGVmdDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluUmlnaHQgewogIGZyb20sIDYwJSwgNzUlLCA5MCUsIHRvIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgfQoKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMzAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMzAwMHB4LCAwLCAwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yNXB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTI1cHgsIDAsIDApOwogIH0KCiAgNzUlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTBweCwgMCwgMCk7CiAgfQoKICA5MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC01cHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNXB4LCAwLCAwKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKQGtleWZyYW1lcyBib3VuY2VJblJpZ2h0IHsKICBmcm9tLCA2MCUsIDc1JSwgOTAlLCB0byB7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjIxNSwgMC42MTAsIDAuMzU1LCAxLjAwMCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogIH0KCiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDMwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDMwMDBweCwgMCwgMCk7CiAgfQoKICA2MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjVweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yNXB4LCAwLCAwKTsKICB9CgogIDc1JSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwcHgsIDAsIDApOwogIH0KCiAgOTAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNXB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTVweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCi5ib3VuY2VJblJpZ2h0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblJpZ2h0OwogIGFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblJpZ2h0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5VcCB7CiAgZnJvbSwgNjAlLCA3NSUsIDkwJSwgdG8gewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICB9CgogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAzMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAzMDAwcHgsIDApOwogIH0KCiAgNjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7CiAgfQoKICA3NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKTsKICB9CgogIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTVweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICB9Cn0KCkBrZXlmcmFtZXMgYm91bmNlSW5VcCB7CiAgZnJvbSwgNjAlLCA3NSUsIDkwJSwgdG8gewogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEwLCAwLjM1NSwgMS4wMDApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxMCwgMC4zNTUsIDEuMDAwKTsKICB9CgogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAzMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAzMDAwcHgsIDApOwogIH0KCiAgNjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7CiAgfQoKICA3NSUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKTsKICB9CgogIDkwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTVweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC01cHgsIDApOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICB9Cn0KCi5ib3VuY2VJblVwIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblVwOwogIGFuaW1hdGlvbi1uYW1lOiBib3VuY2VJblVwOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0IHsKICAyMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjksIC45LCAuOSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjksIC45LCAuOSk7CiAgfQoKICA1MCUsIDU1JSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMS4xLCAxLjEsIDEuMSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMS4xLCAxLjEsIDEuMSk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjMsIC4zLCAuMyk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjMsIC4zLCAuMyk7CiAgfQp9CgpAa2V5ZnJhbWVzIGJvdW5jZU91dCB7CiAgMjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC45LCAuOSwgLjkpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC45LCAuOSwgLjkpOwogIH0KCiAgNTAlLCA1NSUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDEuMSwgMS4xLCAxLjEpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKDEuMSwgMS4xLCAxLjEpOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogIH0KfQoKLmJvdW5jZU91dCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogYm91bmNlT3V0OwogIGFuaW1hdGlvbi1uYW1lOiBib3VuY2VPdXQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXREb3duIHsKICAyMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKTsKICB9CgogIDQwJSwgNDUlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwMDBweCwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIGJvdW5jZU91dERvd24gewogIDIwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApOwogIH0KCiAgNDAlLCA0NSUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMHB4LCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMjAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMjAwMHB4LCAwKTsKICB9Cn0KCi5ib3VuY2VPdXREb3duIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBib3VuY2VPdXREb3duOwogIGFuaW1hdGlvbi1uYW1lOiBib3VuY2VPdXREb3duOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0TGVmdCB7CiAgMjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwcHgsIDAsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIGJvdW5jZU91dExlZnQgewogIDIwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgyMHB4LCAwLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMDAwcHgsIDAsIDApOwogIH0KfQoKLmJvdW5jZU91dExlZnQgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGJvdW5jZU91dExlZnQ7CiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZU91dExlZnQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXRSaWdodCB7CiAgMjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjBweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIGJvdW5jZU91dFJpZ2h0IHsKICAyMCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMHB4LCAwLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjAwMHB4LCAwLCAwKTsKICB9Cn0KCi5ib3VuY2VPdXRSaWdodCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogYm91bmNlT3V0UmlnaHQ7CiAgYW5pbWF0aW9uLW5hbWU6IGJvdW5jZU91dFJpZ2h0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0VXAgewogIDIwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTBweCwgMCk7CiAgfQoKICA0MCUsIDQ1JSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMHB4LCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMDAwcHgsIDApOwogIH0KfQoKQGtleWZyYW1lcyBib3VuY2VPdXRVcCB7CiAgMjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMHB4LCAwKTsKICB9CgogIDQwJSwgNDUlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMjBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwcHgsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgfQp9CgouYm91bmNlT3V0VXAgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGJvdW5jZU91dFVwOwogIGFuaW1hdGlvbi1uYW1lOiBib3VuY2VPdXRVcDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbiB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZUluIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogIH0KfQoKLmZhZGVJbiB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZUluOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlSW47Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgpAa2V5ZnJhbWVzIGZhZGVJbkRvd24gewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCi5mYWRlSW5Eb3duIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYWRlSW5Eb3duOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5Eb3duOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluRG93bkJpZyB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjAwMHB4LCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZUluRG93bkJpZyB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjAwMHB4LCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCi5mYWRlSW5Eb3duQmlnIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYWRlSW5Eb3duQmlnOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5Eb3duQmlnOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluTGVmdCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlSW5MZWZ0IHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgouZmFkZUluTGVmdCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZUluTGVmdDsKICBhbmltYXRpb24tbmFtZTogZmFkZUluTGVmdDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgpAa2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgouZmFkZUluTGVmdEJpZyB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZUluTGVmdEJpZzsKICBhbmltYXRpb24tbmFtZTogZmFkZUluTGVmdEJpZzsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblJpZ2h0IHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlSW5SaWdodCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCi5mYWRlSW5SaWdodCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZUluUmlnaHQ7CiAgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblJpZ2h0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluUmlnaHRCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgyMDAwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgyMDAwcHgsIDAsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlSW5SaWdodEJpZyB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgouZmFkZUluUmlnaHRCaWcgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhZGVJblJpZ2h0QmlnOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5SaWdodEJpZzsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblVwIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTAwJSwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlSW5VcCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICB9Cn0KCi5mYWRlSW5VcCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZUluVXA7CiAgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluVXBCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlSW5VcEJpZyB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwMDBweCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgouZmFkZUluVXBCaWcgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwQmlnOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcEJpZzsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXQgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgfQp9CgpAa2V5ZnJhbWVzIGZhZGVPdXQgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgfQp9CgouZmFkZU91dCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZU91dDsKICBhbmltYXRpb24tbmFtZTogZmFkZU91dDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXREb3duIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZU91dERvd24gewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTAwJSwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogIH0KfQoKLmZhZGVPdXREb3duIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0RG93bjsKICBhbmltYXRpb24tbmFtZTogZmFkZU91dERvd247Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0RG93bkJpZyB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlT3V0RG93bkJpZyB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogIH0KfQoKLmZhZGVPdXREb3duQmlnIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0RG93bkJpZzsKICBhbmltYXRpb24tbmFtZTogZmFkZU91dERvd25CaWc7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0TGVmdCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZU91dExlZnQgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7CiAgfQp9CgouZmFkZU91dExlZnQgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZhZGVPdXRMZWZ0OwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0TGVmdDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRMZWZ0QmlnIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMDAwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMjAwMHB4LCAwLCAwKTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZU91dExlZnRCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMDAwcHgsIDAsIDApOwogIH0KfQoKLmZhZGVPdXRMZWZ0QmlnIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0TGVmdEJpZzsKICBhbmltYXRpb24tbmFtZTogZmFkZU91dExlZnRCaWc7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0UmlnaHQgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlT3V0UmlnaHQgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogIH0KfQoKLmZhZGVPdXRSaWdodCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZU91dFJpZ2h0OwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0UmlnaHQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0UmlnaHRCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMjAwMHB4LCAwLCAwKTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0QmlnIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgfQp9CgouZmFkZU91dFJpZ2h0QmlnIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0UmlnaHRCaWc7CiAgYW5pbWF0aW9uLW5hbWU6IGZhZGVPdXRSaWdodEJpZzsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRVcCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKTsKICB9Cn0KCkBrZXlmcmFtZXMgZmFkZU91dFVwIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApOwogIH0KfQoKLmZhZGVPdXRVcCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZU91dFVwOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0VXA7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0VXBCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMDAwcHgsIDApOwogIH0KfQoKQGtleWZyYW1lcyBmYWRlT3V0VXBCaWcgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0yMDAwcHgsIDApOwogIH0KfQoKLmZhZGVPdXRVcEJpZyB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmFkZU91dFVwQmlnOwogIGFuaW1hdGlvbi1uYW1lOiBmYWRlT3V0VXBCaWc7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmbGlwIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgLTM2MGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMzYwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKICB9CgogIDQwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTkwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTkwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKICB9CgogIDUwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTcwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTcwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgfQoKICA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSBzY2FsZTNkKC45NSwgLjk1LCAuOTUpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsIC45NSwgLjk1KTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogIH0KfQoKQGtleWZyYW1lcyBmbGlwIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgLTM2MGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMzYwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKICB9CgogIDQwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTkwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTkwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKICB9CgogIDUwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTcwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsIDAsIDE1MHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTcwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgfQoKICA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSBzY2FsZTNkKC45NSwgLjk1LCAuOTUpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsIC45NSwgLjk1KTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogIH0KfQoKLmFuaW1hdGVkLmZsaXAgewogIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogdmlzaWJsZTsKICBiYWNrZmFjZS12aXNpYmlsaXR5OiB2aXNpYmxlOwogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZsaXA7CiAgYW5pbWF0aW9uLW5hbWU6IGZsaXA7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmbGlwSW5YIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIG9wYWNpdHk6IDA7CiAgfQoKICA0MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAtMjBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTIwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgfQoKICA2MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAxMGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAxMGRlZyk7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTVkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTVkZWcpOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogIH0KfQoKQGtleWZyYW1lcyBmbGlwSW5YIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIG9wYWNpdHk6IDA7CiAgfQoKICA0MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAtMjBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTIwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgfQoKICA2MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAxMGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAxMGRlZyk7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTVkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTVkZWcpOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogIH0KfQoKLmZsaXBJblggewogIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50OwogIGJhY2tmYWNlLXZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmbGlwSW5YOwogIGFuaW1hdGlvbi1uYW1lOiBmbGlwSW5YOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgZmxpcEluWSB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIDkwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIDkwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgNDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgLTIwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC0yMGRlZyk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogIH0KCiAgNjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgMTBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgMTBkZWcpOwogICAgb3BhY2l0eTogMTsKICB9CgogIDgwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC01ZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC01ZGVnKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICB9Cn0KCkBrZXlmcmFtZXMgZmxpcEluWSB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIDkwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIDkwZGVnKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgNDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgLTIwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC0yMGRlZyk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogIH0KCiAgNjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgMTBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgMTBkZWcpOwogICAgb3BhY2l0eTogMTsKICB9CgogIDgwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC01ZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC01ZGVnKTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICB9Cn0KCi5mbGlwSW5ZIHsKICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsKICBiYWNrZmFjZS12aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmxpcEluWTsKICBhbmltYXRpb24tbmFtZTogZmxpcEluWTsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIGZsaXBPdXRYIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICB9CgogIDMwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsIDAsIDAsIC0yMGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAtMjBkZWcpOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgOTBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgZmxpcE91dFggewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogIH0KCiAgMzAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwgMCwgMCwgLTIwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsIDAsIDAsIC0yMGRlZyk7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCA5MGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCA5MGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKLmZsaXBPdXRYIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmbGlwT3V0WDsKICBhbmltYXRpb24tbmFtZTogZmxpcE91dFg7CiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgYmFja2ZhY2UtdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFkgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogIH0KCiAgMzAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgLTE1ZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIC0xNWRlZyk7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLCAxLCAwLCA5MGRlZyk7CiAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLCAxLCAwLCA5MGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKQGtleWZyYW1lcyBmbGlwT3V0WSB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCk7CiAgfQoKICAzMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLCAxLCAwLCAtMTVkZWcpOwogICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwgMSwgMCwgLTE1ZGVnKTsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIDkwZGVnKTsKICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsIDEsIDAsIDkwZGVnKTsKICAgIG9wYWNpdHk6IDA7CiAgfQp9CgouZmxpcE91dFkgewogIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50OwogIGJhY2tmYWNlLXZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmbGlwT3V0WTsKICBhbmltYXRpb24tbmFtZTogZmxpcE91dFk7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBsaWdodFNwZWVkSW4gewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIHNrZXdYKC0zMGRlZyk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIHNrZXdYKC0zMGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgNjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgyMGRlZyk7CiAgICB0cmFuc2Zvcm06IHNrZXdYKDIwZGVnKTsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNrZXdYKC01ZGVnKTsKICAgIHRyYW5zZm9ybTogc2tld1goLTVkZWcpOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogICAgb3BhY2l0eTogMTsKICB9Cn0KCkBrZXlmcmFtZXMgbGlnaHRTcGVlZEluIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKSBza2V3WCgtMzBkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKSBza2V3WCgtMzBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9CgogIDYwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2tld1goMjBkZWcpOwogICAgdHJhbnNmb3JtOiBza2V3WCgyMGRlZyk7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WCgtNWRlZyk7CiAgICB0cmFuc2Zvcm06IHNrZXdYKC01ZGVnKTsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIG9wYWNpdHk6IDE7CiAgfQp9CgoubGlnaHRTcGVlZEluIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBsaWdodFNwZWVkSW47CiAgYW5pbWF0aW9uLW5hbWU6IGxpZ2h0U3BlZWRJbjsKICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0OwogIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZE91dCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIHNrZXdYKDMwZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCkgc2tld1goMzBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgbGlnaHRTcGVlZE91dCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIHNrZXdYKDMwZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCkgc2tld1goMzBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCi5saWdodFNwZWVkT3V0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBsaWdodFNwZWVkT3V0OwogIGFuaW1hdGlvbi1uYW1lOiBsaWdodFNwZWVkT3V0OwogIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlSW4gewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTIwMGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC0yMDBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBvcGFjaXR5OiAxOwogIH0KfQoKQGtleWZyYW1lcyByb3RhdGVJbiB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtMjAwZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTIwMGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIG9wYWNpdHk6IDE7CiAgfQp9Cgoucm90YXRlSW4gewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJvdGF0ZUluOwogIGFuaW1hdGlvbi1uYW1lOiByb3RhdGVJbjsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluRG93bkxlZnQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC00NWRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC00NWRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBvcGFjaXR5OiAxOwogIH0KfQoKQGtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNDVkZWcpOwogICAgb3BhY2l0eTogMDsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogICAgb3BhY2l0eTogMTsKICB9Cn0KCi5yb3RhdGVJbkRvd25MZWZ0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByb3RhdGVJbkRvd25MZWZ0OwogIGFuaW1hdGlvbi1uYW1lOiByb3RhdGVJbkRvd25MZWZ0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlSW5Eb3duUmlnaHQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA0NWRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIG9wYWNpdHk6IDE7CiAgfQp9CgpAa2V5ZnJhbWVzIHJvdGF0ZUluRG93blJpZ2h0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDQ1ZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNDVkZWcpOwogICAgb3BhY2l0eTogMDsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBvcGFjaXR5OiAxOwogIH0KfQoKLnJvdGF0ZUluRG93blJpZ2h0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByb3RhdGVJbkRvd25SaWdodDsKICBhbmltYXRpb24tbmFtZTogcm90YXRlSW5Eb3duUmlnaHQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJblVwTGVmdCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA0NWRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBvcGFjaXR5OiAxOwogIH0KfQoKQGtleWZyYW1lcyByb3RhdGVJblVwTGVmdCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA0NWRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBvcGFjaXR5OiAxOwogIH0KfQoKLnJvdGF0ZUluVXBMZWZ0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByb3RhdGVJblVwTGVmdDsKICBhbmltYXRpb24tbmFtZTogcm90YXRlSW5VcExlZnQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJblVwUmlnaHQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTkwZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTkwZGVnKTsKICAgIG9wYWNpdHk6IDA7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogICAgb3BhY2l0eTogMTsKICB9Cn0KCkBrZXlmcmFtZXMgcm90YXRlSW5VcFJpZ2h0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC05MGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC05MGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIG9wYWNpdHk6IDE7CiAgfQp9Cgoucm90YXRlSW5VcFJpZ2h0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByb3RhdGVJblVwUmlnaHQ7CiAgYW5pbWF0aW9uLW5hbWU6IHJvdGF0ZUluVXBSaWdodDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAyMDBkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAyMDBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgcm90YXRlT3V0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDIwMGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDIwMGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKLnJvdGF0ZU91dCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcm90YXRlT3V0OwogIGFuaW1hdGlvbi1uYW1lOiByb3RhdGVPdXQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVPdXREb3duTGVmdCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDQ1ZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNDVkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA0NWRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDQ1ZGVnKTsKICAgIG9wYWNpdHk6IDA7CiAgfQp9Cgoucm90YXRlT3V0RG93bkxlZnQgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJvdGF0ZU91dERvd25MZWZ0OwogIGFuaW1hdGlvbi1uYW1lOiByb3RhdGVPdXREb3duTGVmdDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dERvd25SaWdodCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGJvdHRvbTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNDVkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgcm90YXRlT3V0RG93blJpZ2h0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC00NWRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIC00NWRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKLnJvdGF0ZU91dERvd25SaWdodCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcm90YXRlT3V0RG93blJpZ2h0OwogIGFuaW1hdGlvbi1uYW1lOiByb3RhdGVPdXREb3duUmlnaHQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVPdXRVcExlZnQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNDVkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAtNDVkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgcm90YXRlT3V0VXBMZWZ0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGJvdHRvbTsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTQ1ZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgLTQ1ZGVnKTsKICAgIG9wYWNpdHk6IDA7CiAgfQp9Cgoucm90YXRlT3V0VXBMZWZ0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByb3RhdGVPdXRVcExlZnQ7CiAgYW5pbWF0aW9uLW5hbWU6IHJvdGF0ZU91dFVwTGVmdDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dFVwUmlnaHQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBib3R0b207CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgOTBkZWcpOwogICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA5MGRlZyk7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKQGtleWZyYW1lcyByb3RhdGVPdXRVcFJpZ2h0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgYm90dG9tOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDkwZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgOTBkZWcpOwogICAgb3BhY2l0eTogMDsKICB9Cn0KCi5yb3RhdGVPdXRVcFJpZ2h0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByb3RhdGVPdXRVcFJpZ2h0OwogIGFuaW1hdGlvbi1uYW1lOiByb3RhdGVPdXRVcFJpZ2h0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgaGluZ2UgewogIDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsKICB9CgogIDIwJSwgNjAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA4MGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDgwZGVnKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsKICB9CgogIDQwJSwgODAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCA2MGRlZyk7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDYwZGVnKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgNzAwcHgsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCA3MDBweCwgMCk7CiAgICBvcGFjaXR5OiAwOwogIH0KfQoKQGtleWZyYW1lcyBoaW5nZSB7CiAgMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0OwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0OwogIH0KCiAgMjAlLCA2MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDgwZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgODBkZWcpOwogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0OwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0OwogIH0KCiAgNDAlLCA4MCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZTNkKDAsIDAsIDEsIDYwZGVnKTsKICAgIHRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgNjBkZWcpOwogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0OwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0OwogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCA3MDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDcwMHB4LCAwKTsKICAgIG9wYWNpdHk6IDA7CiAgfQp9CgouaGluZ2UgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGhpbmdlOwogIGFuaW1hdGlvbi1uYW1lOiBoaW5nZTsKfQoKLyogb3JpZ2luYWxseSBhdXRob3JlZCBieSBOaWNrIFBldHRpdCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWNrcGV0dGl0L2dsaWRlICovCgpALXdlYmtpdC1rZXlmcmFtZXMgcm9sbEluIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIC0xMjBkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgLTEyMGRlZyk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgfQp9CgpAa2V5ZnJhbWVzIHJvbGxJbiB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAtMTIwZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDEsIC0xMjBkZWcpOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNmb3JtOiBub25lOwogIH0KfQoKLnJvbGxJbiB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcm9sbEluOwogIGFuaW1hdGlvbi1uYW1lOiByb2xsSW47Cn0KCi8qIG9yaWdpbmFsbHkgYXV0aG9yZWQgYnkgTmljayBQZXR0aXQgLSBodHRwczovL2dpdGh1Yi5jb20vbmlja3BldHRpdC9nbGlkZSAqLwoKQC13ZWJraXQta2V5ZnJhbWVzIHJvbGxPdXQgewogIGZyb20gewogICAgb3BhY2l0eTogMTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgMTIwZGVnKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCkgcm90YXRlM2QoMCwgMCwgMSwgMTIwZGVnKTsKICB9Cn0KCkBrZXlmcmFtZXMgcm9sbE91dCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAxMjBkZWcpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKSByb3RhdGUzZCgwLCAwLCAxLCAxMjBkZWcpOwogIH0KfQoKLnJvbGxPdXQgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJvbGxPdXQ7CiAgYW5pbWF0aW9uLW5hbWU6IHJvbGxPdXQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyB6b29tSW4gewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogIH0KCiAgNTAlIHsKICAgIG9wYWNpdHk6IDE7CiAgfQp9CgpAa2V5ZnJhbWVzIHpvb21JbiB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjMsIC4zLCAuMyk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjMsIC4zLCAuMyk7CiAgfQoKICA1MCUgewogICAgb3BhY2l0eTogMTsKICB9Cn0KCi56b29tSW4gewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHpvb21JbjsKICBhbmltYXRpb24tbmFtZTogem9vbUluOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluRG93biB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgLTEwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgLTEwMDBweCwgMCk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogIH0KCiAgNjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCA2MHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCA2MHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKQGtleWZyYW1lcyB6b29tSW5Eb3duIHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgwLCAtMTAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgwLCAtMTAwMHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgfQoKICA2MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDAsIDYwcHgsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDAsIDYwcHgsIDApOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyMCwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyMCwgMSk7CiAgfQp9Cgouem9vbUluRG93biB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogem9vbUluRG93bjsKICBhbmltYXRpb24tbmFtZTogem9vbUluRG93bjsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbkxlZnQgewogIGZyb20gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC4xLCAuMSwgLjEpIHRyYW5zbGF0ZTNkKC0xMDAwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC4xLCAuMSwgLjEpIHRyYW5zbGF0ZTNkKC0xMDAwcHgsIDAsIDApOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwgMCwgMCk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE3NSwgMC44ODUsIDAuMzIwLCAxKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE3NSwgMC44ODUsIDAuMzIwLCAxKTsKICB9Cn0KCkBrZXlmcmFtZXMgem9vbUluTGVmdCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwgMCwgMCk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogIH0KCiAgNjAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LCAwLCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKLnpvb21JbkxlZnQgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHpvb21JbkxlZnQ7CiAgYW5pbWF0aW9uLW5hbWU6IHpvb21JbkxlZnQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyB6b29tSW5SaWdodCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMTAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgxMDAwcHgsIDAsIDApOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoLTEwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LCAwLCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKQGtleWZyYW1lcyB6b29tSW5SaWdodCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMTAwMHB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgxMDAwcHgsIDAsIDApOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoLTEwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LCAwLCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKLnpvb21JblJpZ2h0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiB6b29tSW5SaWdodDsKICBhbmltYXRpb24tbmFtZTogem9vbUluUmlnaHQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyB6b29tSW5VcCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgMTAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgwLCAxMDAwcHgsIDApOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoMCwgLTYwcHgsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDAsIC02MHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKQGtleWZyYW1lcyB6b29tSW5VcCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgMTAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgwLCAxMDAwcHgsIDApOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICB9CgogIDYwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoMCwgLTYwcHgsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDAsIC02MHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKLnpvb21JblVwIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiB6b29tSW5VcDsKICBhbmltYXRpb24tbmFtZTogem9vbUluVXA7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0IHsKICBmcm9tIHsKICAgIG9wYWNpdHk6IDE7CiAgfQoKICA1MCUgewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC4zLCAuMywgLjMpOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICB9Cn0KCkBrZXlmcmFtZXMgem9vbU91dCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAxOwogIH0KCiAgNTAlIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguMywgLjMsIC4zKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMywgLjMsIC4zKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgfQp9Cgouem9vbU91dCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogem9vbU91dDsKICBhbmltYXRpb24tbmFtZTogem9vbU91dDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXREb3duIHsKICA0MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDAsIC02MHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCAtNjBweCwgMCk7CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41NTAsIDAuMDU1LCAwLjY3NSwgMC4xOTApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC4xLCAuMSwgLjEpIHRyYW5zbGF0ZTNkKDAsIDIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgMjAwMHB4LCAwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGJvdHRvbTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBib3R0b207CiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE3NSwgMC44ODUsIDAuMzIwLCAxKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE3NSwgMC44ODUsIDAuMzIwLCAxKTsKICB9Cn0KCkBrZXlmcmFtZXMgem9vbU91dERvd24gewogIDQwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoMCwgLTYwcHgsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDAsIC02MHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgMjAwMHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguMSwgLjEsIC4xKSB0cmFuc2xhdGUzZCgwLCAyMDAwcHgsIDApOwogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgYm90dG9tOwogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGJvdHRvbTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMjAsIDEpOwogIH0KfQoKLnpvb21PdXREb3duIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiB6b29tT3V0RG93bjsKICBhbmltYXRpb24tbmFtZTogem9vbU91dERvd247Cn0KCkAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0TGVmdCB7CiAgNDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCg0MnB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCg0MnB4LCAwLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoLjEpIHRyYW5zbGF0ZTNkKC0yMDAwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgfQp9CgpAa2V5ZnJhbWVzIHpvb21PdXRMZWZ0IHsKICA0MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsIDAsIDApOwogIH0KCiAgdG8gewogICAgb3BhY2l0eTogMDsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LCAwLCAwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICB9Cn0KCi56b29tT3V0TGVmdCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogem9vbU91dExlZnQ7CiAgYW5pbWF0aW9uLW5hbWU6IHpvb21PdXRMZWZ0Owp9CgpALXdlYmtpdC1rZXlmcmFtZXMgem9vbU91dFJpZ2h0IHsKICA0MCUgewogICAgb3BhY2l0eTogMTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LCAwLCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgtNDJweCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LCAwLCAwKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogIH0KfQoKQGtleWZyYW1lcyB6b29tT3V0UmlnaHQgewogIDQwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjQ3NSwgLjQ3NSwgLjQ3NSkgdHJhbnNsYXRlM2QoLTQycHgsIDAsIDApOwogICAgdHJhbnNmb3JtOiBzY2FsZTNkKC40NzUsIC40NzUsIC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LCAwLCAwKTsKICB9CgogIHRvIHsKICAgIG9wYWNpdHk6IDA7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoLjEpIHRyYW5zbGF0ZTNkKDIwMDBweCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsIDAsIDApOwogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgfQp9Cgouem9vbU91dFJpZ2h0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiB6b29tT3V0UmlnaHQ7CiAgYW5pbWF0aW9uLW5hbWU6IHpvb21PdXRSaWdodDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXRVcCB7CiAgNDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCA2MHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCA2MHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgYm90dG9tOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyMCwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyMCwgMSk7CiAgfQp9CgpAa2V5ZnJhbWVzIHpvb21PdXRVcCB7CiAgNDAlIHsKICAgIG9wYWNpdHk6IDE7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCA2MHB4LCAwKTsKICAgIHRyYW5zZm9ybTogc2NhbGUzZCguNDc1LCAuNDc1LCAuNDc1KSB0cmFuc2xhdGUzZCgwLCA2MHB4LCAwKTsKICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUwLCAwLjA1NSwgMC42NzUsIDAuMTkwKTsKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjU1MCwgMC4wNTUsIDAuNjc1LCAwLjE5MCk7CiAgfQoKICB0byB7CiAgICBvcGFjaXR5OiAwOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlM2QoLjEsIC4xLCAuMSkgdHJhbnNsYXRlM2QoMCwgLTIwMDBweCwgMCk7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBib3R0b207CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgYm90dG9tOwogICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyMCwgMSk7CiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyMCwgMSk7CiAgfQp9Cgouem9vbU91dFVwIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiB6b29tT3V0VXA7CiAgYW5pbWF0aW9uLW5hbWU6IHpvb21PdXRVcDsKfQoKQC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5Eb3duIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KfQoKQGtleWZyYW1lcyBzbGlkZUluRG93biB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIH0KCiAgdG8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICB9Cn0KCi5zbGlkZUluRG93biB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogc2xpZGVJbkRvd247CiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlSW5Eb3duOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVJbkxlZnQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApOwogICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICB9CgogIHRvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIHNsaWRlSW5MZWZ0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KfQoKLnNsaWRlSW5MZWZ0IHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBzbGlkZUluTGVmdDsKICBhbmltYXRpb24tbmFtZTogc2xpZGVJbkxlZnQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KfQoKQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KfQoKLnNsaWRlSW5SaWdodCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogc2xpZGVJblJpZ2h0OwogIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUluUmlnaHQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluVXAgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KfQoKQGtleWZyYW1lcyBzbGlkZUluVXAgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgfQoKICB0byB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KfQoKLnNsaWRlSW5VcCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogc2xpZGVJblVwOwogIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUluVXA7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dERvd24gewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICB9CgogIHRvIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTAwJSwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIHNsaWRlT3V0RG93biB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KCiAgdG8gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKTsKICB9Cn0KCi5zbGlkZU91dERvd24gewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHNsaWRlT3V0RG93bjsKICBhbmltYXRpb24tbmFtZTogc2xpZGVPdXREb3duOwp9CgpALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXRMZWZ0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIHNsaWRlT3V0TGVmdCB7CiAgZnJvbSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogIH0KCiAgdG8gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApOwogIH0KfQoKLnNsaWRlT3V0TGVmdCB7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogc2xpZGVPdXRMZWZ0OwogIGFuaW1hdGlvbi1uYW1lOiBzbGlkZU91dExlZnQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dFJpZ2h0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogIH0KfQoKQGtleWZyYW1lcyBzbGlkZU91dFJpZ2h0IHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApOwogIH0KfQoKLnNsaWRlT3V0UmlnaHQgewogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHNsaWRlT3V0UmlnaHQ7CiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlT3V0UmlnaHQ7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dFVwIHsKICBmcm9tIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgfQoKICB0byB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTEwMCUsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgfQp9CgpAa2V5ZnJhbWVzIHNsaWRlT3V0VXAgewogIGZyb20gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICB9CgogIHRvIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKTsKICB9Cn0KCi5zbGlkZU91dFVwIHsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBzbGlkZU91dFVwOwogIGFuaW1hdGlvbi1uYW1lOiBzbGlkZU91dFVwOwp9"}},"time_used":153,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":153,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/font-awesome.min.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.277Z","timestamp":1785147795277,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/font-awesome.min.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 6673\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":31077,"size_decoded":7210,"mime_type":"text/css","magic":"ASCII text, with very long lines (30914)","md5":"5cd0f9704ad017f42dc3d97656c52756","sha1":"5eec77689a34e05508e50c159cd7c277a046132b","sha256":"c0c73bf0429c18a7e0e4d357b43851229f16f7017c762ba859bdadec5d93b578","sha512":"a3548c0a064ebf59b6b49f1b8d4e36120f45f5744dbc46dd86d0b9250bc5c1102fbda0e237a257b577b637cdd20dbe4e0f3732d976a851560088947c7cde86a8","ssdeep":"384:vHu5yWeTUKW+KlkJ5de2UYDyVfwYUas2l8yQ/8dwmaU8G:vwlr+Klk3Yi+fwYUf2l8yQ/e9vf","tlshash":"f5d242e8e54c01d66731c48bff81b36862b6fb3dd5854da9f01f290c29d22a512c5fba","first_seen":"2025-06-25T11:59:30.644923Z","last_seen":"2026-07-27T10:24:01.485294Z","times_seen":12,"resource_available":false,"data":"LyohCiAqICBGb250IEF3ZXNvbWUgNC43LjAgYnkgQGRhdmVnYW5keSAtIGh0dHA6Ly9mb250YXdlc29tZS5pbyAtIEBmb250YXdlc29tZQogKiAgTGljZW5zZSAtIGh0dHA6Ly9mb250YXdlc29tZS5pby9saWNlbnNlIChGb250OiBTSUwgT0ZMIDEuMSwgQ1NTOiBNSVQgTGljZW5zZSkKICovQGZvbnQtZmFjZXtmb250LWZhbWlseTonRm9udEF3ZXNvbWUnO3NyYzp1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQzZTZlM2U2ZTNlNmUuaHRtbD92PTQuNy4wJyk7c3JjOnVybCgnLi4vZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udGQ0MWRkNDFkZDQxZC5odG1sPyNpZWZpeCZ2PTQuNy4wJykgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLHVybCgnLi4vZm9udHMvZm9udGF3ZXNvbWUtd2ViZm9udDNlNmUzZTZlM2U2ZS0yLmh0bWw/dj00LjcuMCcpIGZvcm1hdCgnd29mZjInKSx1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQzZTZlM2U2ZTNlNmUtMy5odG1sP3Y9NC43LjAnKSBmb3JtYXQoJ3dvZmYnKSx1cmwoJy4uL2ZvbnRzL2ZvbnRhd2Vzb21lLXdlYmZvbnQzZTZlM2U2ZTNlNmUudHRmP3Y9NC43LjAnKSBmb3JtYXQoJ3RydWV0eXBlJyksdXJsKCcuLi9mb250cy9mb250YXdlc29tZS13ZWJmb250M2U2ZTNlNmUzZTZlLnN2Zz92PTQuNy4wI2ZvbnRhd2Vzb21lcmVndWxhcicpIGZvcm1hdCgnc3ZnJyk7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsfS5mYXtkaXNwbGF5OmlubGluZS1ibG9jaztmb250Om5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtmb250LXNpemU6aW5oZXJpdDt0ZXh0LXJlbmRlcmluZzphdXRvOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlfS5mYS1sZ3tmb250LXNpemU6MS4zMzMzMzMzM2VtO2xpbmUtaGVpZ2h0Oi43NWVtO3ZlcnRpY2FsLWFsaWduOi0xNSV9LmZhLTJ4e2ZvbnQtc2l6ZToyZW19LmZhLTN4e2ZvbnQtc2l6ZTozZW19LmZhLTR4e2ZvbnQtc2l6ZTo0ZW19LmZhLTV4e2ZvbnQtc2l6ZTo1ZW19LmZhLWZ3e3dpZHRoOjEuMjg1NzE0MjllbTt0ZXh0LWFsaWduOmNlbnRlcn0uZmEtdWx7cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWxlZnQ6Mi4xNDI4NTcxNGVtO2xpc3Qtc3R5bGUtdHlwZTpub25lfS5mYS11bD5saXtwb3NpdGlvbjpyZWxhdGl2ZX0uZmEtbGl7cG9zaXRpb246YWJzb2x1dGU7bGVmdDotMi4xNDI4NTcxNGVtO3dpZHRoOjIuMTQyODU3MTRlbTt0b3A6LjE0Mjg1NzE0ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LmZhLWxpLmZhLWxne2xlZnQ6LTEuODU3MTQyODZlbX0uZmEtYm9yZGVye3BhZGRpbmc6LjJlbSAuMjVlbSAuMTVlbTtib3JkZXI6c29saWQgLjA4ZW0gI2VlZTtib3JkZXItcmFkaXVzOi4xZW19LmZhLXB1bGwtbGVmdHtmbG9hdDpsZWZ0fS5mYS1wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0fS5mYS5mYS1wdWxsLWxlZnR7bWFyZ2luLXJpZ2h0Oi4zZW19LmZhLmZhLXB1bGwtcmlnaHR7bWFyZ2luLWxlZnQ6LjNlbX0ucHVsbC1yaWdodHtmbG9hdDpyaWdodH0ucHVsbC1sZWZ0e2Zsb2F0OmxlZnR9LmZhLnB1bGwtbGVmdHttYXJnaW4tcmlnaHQ6LjNlbX0uZmEucHVsbC1yaWdodHttYXJnaW4tbGVmdDouM2VtfS5mYS1zcGluey13ZWJraXQtYW5pbWF0aW9uOmZhLXNwaW4gMnMgaW5maW5pdGUgbGluZWFyO2FuaW1hdGlvbjpmYS1zcGluIDJzIGluZmluaXRlIGxpbmVhcn0uZmEtcHVsc2V7LXdlYmtpdC1hbmltYXRpb246ZmEtc3BpbiAxcyBpbmZpbml0ZSBzdGVwcyg4KTthbmltYXRpb246ZmEtc3BpbiAxcyBpbmZpbml0ZSBzdGVwcyg4KX1ALXdlYmtpdC1rZXlmcmFtZXMgZmEtc3BpbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNTlkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzU5ZGVnKX19QGtleWZyYW1lcyBmYS1zcGluezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM1OWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNTlkZWcpfX0uZmEtcm90YXRlLTkwey1tcy1maWx0ZXI6InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTEpIjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0uZmEtcm90YXRlLTE4MHstbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yKSI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDE4MGRlZyk7LW1zLXRyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9LmZhLXJvdGF0ZS0yNzB7LW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkJhc2ljSW1hZ2Uocm90YXRpb249MykiOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKDI3MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfS5mYS1mbGlwLWhvcml6b250YWx7LW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkJhc2ljSW1hZ2Uocm90YXRpb249MCwgbWlycm9yPTEpIjstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgtMSwgMSk7LW1zLXRyYW5zZm9ybTpzY2FsZSgtMSwgMSk7dHJhbnNmb3JtOnNjYWxlKC0xLCAxKX0uZmEtZmxpcC12ZXJ0aWNhbHstbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yLCBtaXJyb3I9MSkiOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEsIC0xKTstbXMtdHJhbnNmb3JtOnNjYWxlKDEsIC0xKTt0cmFuc2Zvcm06c2NhbGUoMSwgLTEpfTpyb290IC5mYS1yb3RhdGUtOTAsOnJvb3QgLmZhLXJvdGF0ZS0xODAsOnJvb3QgLmZhLXJvdGF0ZS0yNzAsOnJvb3QgLmZhLWZsaXAtaG9yaXpvbnRhbCw6cm9vdCAuZmEtZmxpcC12ZXJ0aWNhbHtmaWx0ZXI6bm9uZX0uZmEtc3RhY2t7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MmVtO2hlaWdodDoyZW07bGluZS1oZWlnaHQ6MmVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZmEtc3RhY2stMXgsLmZhLXN0YWNrLTJ4e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyfS5mYS1zdGFjay0xeHtsaW5lLWhlaWdodDppbmhlcml0fS5mYS1zdGFjay0yeHtmb250LXNpemU6MmVtfS5mYS1pbnZlcnNle2NvbG9yOiNmZmZ9LmZhLWdsYXNzOmJlZm9yZXtjb250ZW50OiJcZjAwMCJ9LmZhLW11c2ljOmJlZm9yZXtjb250ZW50OiJcZjAwMSJ9LmZhLXNlYXJjaDpiZWZvcmV7Y29udGVudDoiXGYwMDIifS5mYS1lbnZlbG9wZS1vOmJlZm9yZXtjb250ZW50OiJcZjAwMyJ9LmZhLWhlYXJ0OmJlZm9yZXtjb250ZW50OiJcZjAwNCJ9LmZhLXN0YXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDA1In0uZmEtc3Rhci1vOmJlZm9yZXtjb250ZW50OiJcZjAwNiJ9LmZhLXVzZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMDA3In0uZmEtZmlsbTpiZWZvcmV7Y29udGVudDoiXGYwMDgifS5mYS10aC1sYXJnZTpiZWZvcmV7Y29udGVudDoiXGYwMDkifS5mYS10aDpiZWZvcmV7Y29udGVudDoiXGYwMGEifS5mYS10aC1saXN0OmJlZm9yZXtjb250ZW50OiJcZjAwYiJ9LmZhLWNoZWNrOmJlZm9yZXtjb250ZW50OiJcZjAwYyJ9LmZhLXJlbW92ZTpiZWZvcmUsLmZhLWNsb3NlOmJlZm9yZSwuZmEtdGltZXM6YmVmb3Jle2NvbnRlbnQ6IlxmMDBkIn0uZmEtc2VhcmNoLXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMDBlIn0uZmEtc2VhcmNoLW1pbnVzOmJlZm9yZXtjb250ZW50OiJcZjAxMCJ9LmZhLXBvd2VyLW9mZjpiZWZvcmV7Y29udGVudDoiXGYwMTEifS5mYS1zaWduYWw6YmVmb3Jle2NvbnRlbnQ6IlxmMDEyIn0uZmEtZ2VhcjpiZWZvcmUsLmZhLWNvZzpiZWZvcmV7Y29udGVudDoiXGYwMTMifS5mYS10cmFzaC1vOmJlZm9yZXtjb250ZW50OiJcZjAxNCJ9LmZhLWhvbWU6YmVmb3Jle2NvbnRlbnQ6IlxmMDE1In0uZmEtZmlsZS1vOmJlZm9yZXtjb250ZW50OiJcZjAxNiJ9LmZhLWNsb2NrLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDE3In0uZmEtcm9hZDpiZWZvcmV7Y29udGVudDoiXGYwMTgifS5mYS1kb3dubG9hZDpiZWZvcmV7Y29udGVudDoiXGYwMTkifS5mYS1hcnJvdy1jaXJjbGUtby1kb3duOmJlZm9yZXtjb250ZW50OiJcZjAxYSJ9LmZhLWFycm93LWNpcmNsZS1vLXVwOmJlZm9yZXtjb250ZW50OiJcZjAxYiJ9LmZhLWluYm94OmJlZm9yZXtjb250ZW50OiJcZjAxYyJ9LmZhLXBsYXktY2lyY2xlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDFkIn0uZmEtcm90YXRlLXJpZ2h0OmJlZm9yZSwuZmEtcmVwZWF0OmJlZm9yZXtjb250ZW50OiJcZjAxZSJ9LmZhLXJlZnJlc2g6YmVmb3Jle2NvbnRlbnQ6IlxmMDIxIn0uZmEtbGlzdC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDIyIn0uZmEtbG9jazpiZWZvcmV7Y29udGVudDoiXGYwMjMifS5mYS1mbGFnOmJlZm9yZXtjb250ZW50OiJcZjAyNCJ9LmZhLWhlYWRwaG9uZXM6YmVmb3Jle2NvbnRlbnQ6IlxmMDI1In0uZmEtdm9sdW1lLW9mZjpiZWZvcmV7Y29udGVudDoiXGYwMjYifS5mYS12b2x1bWUtZG93bjpiZWZvcmV7Y29udGVudDoiXGYwMjcifS5mYS12b2x1bWUtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMDI4In0uZmEtcXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZjAyOSJ9LmZhLWJhcmNvZGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDJhIn0uZmEtdGFnOmJlZm9yZXtjb250ZW50OiJcZjAyYiJ9LmZhLXRhZ3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDJjIn0uZmEtYm9vazpiZWZvcmV7Y29udGVudDoiXGYwMmQifS5mYS1ib29rbWFyazpiZWZvcmV7Y29udGVudDoiXGYwMmUifS5mYS1wcmludDpiZWZvcmV7Y29udGVudDoiXGYwMmYifS5mYS1jYW1lcmE6YmVmb3Jle2NvbnRlbnQ6IlxmMDMwIn0uZmEtZm9udDpiZWZvcmV7Y29udGVudDoiXGYwMzEifS5mYS1ib2xkOmJlZm9yZXtjb250ZW50OiJcZjAzMiJ9LmZhLWl0YWxpYzpiZWZvcmV7Y29udGVudDoiXGYwMzMifS5mYS10ZXh0LWhlaWdodDpiZWZvcmV7Y29udGVudDoiXGYwMzQifS5mYS10ZXh0LXdpZHRoOmJlZm9yZXtjb250ZW50OiJcZjAzNSJ9LmZhLWFsaWduLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDM2In0uZmEtYWxpZ24tY2VudGVyOmJlZm9yZXtjb250ZW50OiJcZjAzNyJ9LmZhLWFsaWduLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjAzOCJ9LmZhLWFsaWduLWp1c3RpZnk6YmVmb3Jle2NvbnRlbnQ6IlxmMDM5In0uZmEtbGlzdDpiZWZvcmV7Y29udGVudDoiXGYwM2EifS5mYS1kZWRlbnQ6YmVmb3JlLC5mYS1vdXRkZW50OmJlZm9yZXtjb250ZW50OiJcZjAzYiJ9LmZhLWluZGVudDpiZWZvcmV7Y29udGVudDoiXGYwM2MifS5mYS12aWRlby1jYW1lcmE6YmVmb3Jle2NvbnRlbnQ6IlxmMDNkIn0uZmEtcGhvdG86YmVmb3JlLC5mYS1pbWFnZTpiZWZvcmUsLmZhLXBpY3R1cmUtbzpiZWZvcmV7Y29udGVudDoiXGYwM2UifS5mYS1wZW5jaWw6YmVmb3Jle2NvbnRlbnQ6IlxmMDQwIn0uZmEtbWFwLW1hcmtlcjpiZWZvcmV7Y29udGVudDoiXGYwNDEifS5mYS1hZGp1c3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMDQyIn0uZmEtdGludDpiZWZvcmV7Y29udGVudDoiXGYwNDMifS5mYS1lZGl0OmJlZm9yZSwuZmEtcGVuY2lsLXNxdWFyZS1vOmJlZm9yZXtjb250ZW50OiJcZjA0NCJ9LmZhLXNoYXJlLXNxdWFyZS1vOmJlZm9yZXtjb250ZW50OiJcZjA0NSJ9LmZhLWNoZWNrLXNxdWFyZS1vOmJlZm9yZXtjb250ZW50OiJcZjA0NiJ9LmZhLWFycm93czpiZWZvcmV7Y29udGVudDoiXGYwNDcifS5mYS1zdGVwLWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA0OCJ9LmZhLWZhc3QtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDQ5In0uZmEtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDRhIn0uZmEtcGxheTpiZWZvcmV7Y29udGVudDoiXGYwNGIifS5mYS1wYXVzZTpiZWZvcmV7Y29udGVudDoiXGYwNGMifS5mYS1zdG9wOmJlZm9yZXtjb250ZW50OiJcZjA0ZCJ9LmZhLWZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDRlIn0uZmEtZmFzdC1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZjA1MCJ9LmZhLXN0ZXAtZm9yd2FyZDpiZWZvcmV7Y29udGVudDoiXGYwNTEifS5mYS1lamVjdDpiZWZvcmV7Y29udGVudDoiXGYwNTIifS5mYS1jaGV2cm9uLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDUzIn0uZmEtY2hldnJvbi1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYwNTQifS5mYS1wbHVzLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYwNTUifS5mYS1taW51cy1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDU2In0uZmEtdGltZXMtY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZjA1NyJ9LmZhLWNoZWNrLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYwNTgifS5mYS1xdWVzdGlvbi1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDU5In0uZmEtaW5mby1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMDVhIn0uZmEtY3Jvc3NoYWlyczpiZWZvcmV7Y29udGVudDoiXGYwNWIifS5mYS10aW1lcy1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDoiXGYwNWMifS5mYS1jaGVjay1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDoiXGYwNWQifS5mYS1iYW46YmVmb3Jle2NvbnRlbnQ6IlxmMDVlIn0uZmEtYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDoiXGYwNjAifS5mYS1hcnJvdy1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYwNjEifS5mYS1hcnJvdy11cDpiZWZvcmV7Y29udGVudDoiXGYwNjIifS5mYS1hcnJvdy1kb3duOmJlZm9yZXtjb250ZW50OiJcZjA2MyJ9LmZhLW1haWwtZm9yd2FyZDpiZWZvcmUsLmZhLXNoYXJlOmJlZm9yZXtjb250ZW50OiJcZjA2NCJ9LmZhLWV4cGFuZDpiZWZvcmV7Y29udGVudDoiXGYwNjUifS5mYS1jb21wcmVzczpiZWZvcmV7Y29udGVudDoiXGYwNjYifS5mYS1wbHVzOmJlZm9yZXtjb250ZW50OiJcZjA2NyJ9LmZhLW1pbnVzOmJlZm9yZXtjb250ZW50OiJcZjA2OCJ9LmZhLWFzdGVyaXNrOmJlZm9yZXtjb250ZW50OiJcZjA2OSJ9LmZhLWV4Y2xhbWF0aW9uLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYwNmEifS5mYS1naWZ0OmJlZm9yZXtjb250ZW50OiJcZjA2YiJ9LmZhLWxlYWY6YmVmb3Jle2NvbnRlbnQ6IlxmMDZjIn0uZmEtZmlyZTpiZWZvcmV7Y29udGVudDoiXGYwNmQifS5mYS1leWU6YmVmb3Jle2NvbnRlbnQ6IlxmMDZlIn0uZmEtZXllLXNsYXNoOmJlZm9yZXtjb250ZW50OiJcZjA3MCJ9LmZhLXdhcm5pbmc6YmVmb3JlLC5mYS1leGNsYW1hdGlvbi10cmlhbmdsZTpiZWZvcmV7Y29udGVudDoiXGYwNzEifS5mYS1wbGFuZTpiZWZvcmV7Y29udGVudDoiXGYwNzIifS5mYS1jYWxlbmRhcjpiZWZvcmV7Y29udGVudDoiXGYwNzMifS5mYS1yYW5kb206YmVmb3Jle2NvbnRlbnQ6IlxmMDc0In0uZmEtY29tbWVudDpiZWZvcmV7Y29udGVudDoiXGYwNzUifS5mYS1tYWduZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMDc2In0uZmEtY2hldnJvbi11cDpiZWZvcmV7Y29udGVudDoiXGYwNzcifS5mYS1jaGV2cm9uLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxmMDc4In0uZmEtcmV0d2VldDpiZWZvcmV7Y29udGVudDoiXGYwNzkifS5mYS1zaG9wcGluZy1jYXJ0OmJlZm9yZXtjb250ZW50OiJcZjA3YSJ9LmZhLWZvbGRlcjpiZWZvcmV7Y29udGVudDoiXGYwN2IifS5mYS1mb2xkZXItb3BlbjpiZWZvcmV7Y29udGVudDoiXGYwN2MifS5mYS1hcnJvd3MtdjpiZWZvcmV7Y29udGVudDoiXGYwN2QifS5mYS1hcnJvd3MtaDpiZWZvcmV7Y29udGVudDoiXGYwN2UifS5mYS1iYXItY2hhcnQtbzpiZWZvcmUsLmZhLWJhci1jaGFydDpiZWZvcmV7Y29udGVudDoiXGYwODAifS5mYS10d2l0dGVyLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYwODEifS5mYS1mYWNlYm9vay1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDgyIn0uZmEtY2FtZXJhLXJldHJvOmJlZm9yZXtjb250ZW50OiJcZjA4MyJ9LmZhLWtleTpiZWZvcmV7Y29udGVudDoiXGYwODQifS5mYS1nZWFyczpiZWZvcmUsLmZhLWNvZ3M6YmVmb3Jle2NvbnRlbnQ6IlxmMDg1In0uZmEtY29tbWVudHM6YmVmb3Jle2NvbnRlbnQ6IlxmMDg2In0uZmEtdGh1bWJzLW8tdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMDg3In0uZmEtdGh1bWJzLW8tZG93bjpiZWZvcmV7Y29udGVudDoiXGYwODgifS5mYS1zdGFyLWhhbGY6YmVmb3Jle2NvbnRlbnQ6IlxmMDg5In0uZmEtaGVhcnQtbzpiZWZvcmV7Y29udGVudDoiXGYwOGEifS5mYS1zaWduLW91dDpiZWZvcmV7Y29udGVudDoiXGYwOGIifS5mYS1saW5rZWRpbi1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDhjIn0uZmEtdGh1bWItdGFjazpiZWZvcmV7Y29udGVudDoiXGYwOGQifS5mYS1leHRlcm5hbC1saW5rOmJlZm9yZXtjb250ZW50OiJcZjA4ZSJ9LmZhLXNpZ24taW46YmVmb3Jle2NvbnRlbnQ6IlxmMDkwIn0uZmEtdHJvcGh5OmJlZm9yZXtjb250ZW50OiJcZjA5MSJ9LmZhLWdpdGh1Yi1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDkyIn0uZmEtdXBsb2FkOmJlZm9yZXtjb250ZW50OiJcZjA5MyJ9LmZhLWxlbW9uLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDk0In0uZmEtcGhvbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDk1In0uZmEtc3F1YXJlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMDk2In0uZmEtYm9va21hcmstbzpiZWZvcmV7Y29udGVudDoiXGYwOTcifS5mYS1waG9uZS1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMDk4In0uZmEtdHdpdHRlcjpiZWZvcmV7Y29udGVudDoiXGYwOTkifS5mYS1mYWNlYm9vay1mOmJlZm9yZSwuZmEtZmFjZWJvb2s6YmVmb3Jle2NvbnRlbnQ6IlxmMDlhIn0uZmEtZ2l0aHViOmJlZm9yZXtjb250ZW50OiJcZjA5YiJ9LmZhLXVubG9jazpiZWZvcmV7Y29udGVudDoiXGYwOWMifS5mYS1jcmVkaXQtY2FyZDpiZWZvcmV7Y29udGVudDoiXGYwOWQifS5mYS1mZWVkOmJlZm9yZSwuZmEtcnNzOmJlZm9yZXtjb250ZW50OiJcZjA5ZSJ9LmZhLWhkZC1vOmJlZm9yZXtjb250ZW50OiJcZjBhMCJ9LmZhLWJ1bGxob3JuOmJlZm9yZXtjb250ZW50OiJcZjBhMSJ9LmZhLWJlbGw6YmVmb3Jle2NvbnRlbnQ6IlxmMGYzIn0uZmEtY2VydGlmaWNhdGU6YmVmb3Jle2NvbnRlbnQ6IlxmMGEzIn0uZmEtaGFuZC1vLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjBhNCJ9LmZhLWhhbmQtby1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjBhNSJ9LmZhLWhhbmQtby11cDpiZWZvcmV7Y29udGVudDoiXGYwYTYifS5mYS1oYW5kLW8tZG93bjpiZWZvcmV7Y29udGVudDoiXGYwYTcifS5mYS1hcnJvdy1jaXJjbGUtbGVmdDpiZWZvcmV7Y29udGVudDoiXGYwYTgifS5mYS1hcnJvdy1jaXJjbGUtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGE5In0uZmEtYXJyb3ctY2lyY2xlLXVwOmJlZm9yZXtjb250ZW50OiJcZjBhYSJ9LmZhLWFycm93LWNpcmNsZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZjBhYiJ9LmZhLWdsb2JlOmJlZm9yZXtjb250ZW50OiJcZjBhYyJ9LmZhLXdyZW5jaDpiZWZvcmV7Y29udGVudDoiXGYwYWQifS5mYS10YXNrczpiZWZvcmV7Y29udGVudDoiXGYwYWUifS5mYS1maWx0ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMGIwIn0uZmEtYnJpZWZjYXNlOmJlZm9yZXtjb250ZW50OiJcZjBiMSJ9LmZhLWFycm93cy1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGIyIn0uZmEtZ3JvdXA6YmVmb3JlLC5mYS11c2VyczpiZWZvcmV7Y29udGVudDoiXGYwYzAifS5mYS1jaGFpbjpiZWZvcmUsLmZhLWxpbms6YmVmb3Jle2NvbnRlbnQ6IlxmMGMxIn0uZmEtY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGMyIn0uZmEtZmxhc2s6YmVmb3Jle2NvbnRlbnQ6IlxmMGMzIn0uZmEtY3V0OmJlZm9yZSwuZmEtc2Npc3NvcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMGM0In0uZmEtY29weTpiZWZvcmUsLmZhLWZpbGVzLW86YmVmb3Jle2NvbnRlbnQ6IlxmMGM1In0uZmEtcGFwZXJjbGlwOmJlZm9yZXtjb250ZW50OiJcZjBjNiJ9LmZhLXNhdmU6YmVmb3JlLC5mYS1mbG9wcHktbzpiZWZvcmV7Y29udGVudDoiXGYwYzcifS5mYS1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGM4In0uZmEtbmF2aWNvbjpiZWZvcmUsLmZhLXJlb3JkZXI6YmVmb3JlLC5mYS1iYXJzOmJlZm9yZXtjb250ZW50OiJcZjBjOSJ9LmZhLWxpc3QtdWw6YmVmb3Jle2NvbnRlbnQ6IlxmMGNhIn0uZmEtbGlzdC1vbDpiZWZvcmV7Y29udGVudDoiXGYwY2IifS5mYS1zdHJpa2V0aHJvdWdoOmJlZm9yZXtjb250ZW50OiJcZjBjYyJ9LmZhLXVuZGVybGluZTpiZWZvcmV7Y29udGVudDoiXGYwY2QifS5mYS10YWJsZTpiZWZvcmV7Y29udGVudDoiXGYwY2UifS5mYS1tYWdpYzpiZWZvcmV7Y29udGVudDoiXGYwZDAifS5mYS10cnVjazpiZWZvcmV7Y29udGVudDoiXGYwZDEifS5mYS1waW50ZXJlc3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMGQyIn0uZmEtcGludGVyZXN0LXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYwZDMifS5mYS1nb29nbGUtcGx1cy1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMGQ0In0uZmEtZ29vZ2xlLXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMGQ1In0uZmEtbW9uZXk6YmVmb3Jle2NvbnRlbnQ6IlxmMGQ2In0uZmEtY2FyZXQtZG93bjpiZWZvcmV7Y29udGVudDoiXGYwZDcifS5mYS1jYXJldC11cDpiZWZvcmV7Y29udGVudDoiXGYwZDgifS5mYS1jYXJldC1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjBkOSJ9LmZhLWNhcmV0LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjBkYSJ9LmZhLWNvbHVtbnM6YmVmb3Jle2NvbnRlbnQ6IlxmMGRiIn0uZmEtdW5zb3J0ZWQ6YmVmb3JlLC5mYS1zb3J0OmJlZm9yZXtjb250ZW50OiJcZjBkYyJ9LmZhLXNvcnQtZG93bjpiZWZvcmUsLmZhLXNvcnQtZGVzYzpiZWZvcmV7Y29udGVudDoiXGYwZGQifS5mYS1zb3J0LXVwOmJlZm9yZSwuZmEtc29ydC1hc2M6YmVmb3Jle2NvbnRlbnQ6IlxmMGRlIn0uZmEtZW52ZWxvcGU6YmVmb3Jle2NvbnRlbnQ6IlxmMGUwIn0uZmEtbGlua2VkaW46YmVmb3Jle2NvbnRlbnQ6IlxmMGUxIn0uZmEtcm90YXRlLWxlZnQ6YmVmb3JlLC5mYS11bmRvOmJlZm9yZXtjb250ZW50OiJcZjBlMiJ9LmZhLWxlZ2FsOmJlZm9yZSwuZmEtZ2F2ZWw6YmVmb3Jle2NvbnRlbnQ6IlxmMGUzIn0uZmEtZGFzaGJvYXJkOmJlZm9yZSwuZmEtdGFjaG9tZXRlcjpiZWZvcmV7Y29udGVudDoiXGYwZTQifS5mYS1jb21tZW50LW86YmVmb3Jle2NvbnRlbnQ6IlxmMGU1In0uZmEtY29tbWVudHMtbzpiZWZvcmV7Y29udGVudDoiXGYwZTYifS5mYS1mbGFzaDpiZWZvcmUsLmZhLWJvbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGU3In0uZmEtc2l0ZW1hcDpiZWZvcmV7Y29udGVudDoiXGYwZTgifS5mYS11bWJyZWxsYTpiZWZvcmV7Y29udGVudDoiXGYwZTkifS5mYS1wYXN0ZTpiZWZvcmUsLmZhLWNsaXBib2FyZDpiZWZvcmV7Y29udGVudDoiXGYwZWEifS5mYS1saWdodGJ1bGItbzpiZWZvcmV7Y29udGVudDoiXGYwZWIifS5mYS1leGNoYW5nZTpiZWZvcmV7Y29udGVudDoiXGYwZWMifS5mYS1jbG91ZC1kb3dubG9hZDpiZWZvcmV7Y29udGVudDoiXGYwZWQifS5mYS1jbG91ZC11cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGVlIn0uZmEtdXNlci1tZDpiZWZvcmV7Y29udGVudDoiXGYwZjAifS5mYS1zdGV0aG9zY29wZTpiZWZvcmV7Y29udGVudDoiXGYwZjEifS5mYS1zdWl0Y2FzZTpiZWZvcmV7Y29udGVudDoiXGYwZjIifS5mYS1iZWxsLW86YmVmb3Jle2NvbnRlbnQ6IlxmMGEyIn0uZmEtY29mZmVlOmJlZm9yZXtjb250ZW50OiJcZjBmNCJ9LmZhLWN1dGxlcnk6YmVmb3Jle2NvbnRlbnQ6IlxmMGY1In0uZmEtZmlsZS10ZXh0LW86YmVmb3Jle2NvbnRlbnQ6IlxmMGY2In0uZmEtYnVpbGRpbmctbzpiZWZvcmV7Y29udGVudDoiXGYwZjcifS5mYS1ob3NwaXRhbC1vOmJlZm9yZXtjb250ZW50OiJcZjBmOCJ9LmZhLWFtYnVsYW5jZTpiZWZvcmV7Y29udGVudDoiXGYwZjkifS5mYS1tZWRraXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGZhIn0uZmEtZmlnaHRlci1qZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMGZiIn0uZmEtYmVlcjpiZWZvcmV7Y29udGVudDoiXGYwZmMifS5mYS1oLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYwZmQifS5mYS1wbHVzLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYwZmUifS5mYS1hbmdsZS1kb3VibGUtbGVmdDpiZWZvcmV7Y29udGVudDoiXGYxMDAifS5mYS1hbmdsZS1kb3VibGUtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTAxIn0uZmEtYW5nbGUtZG91YmxlLXVwOmJlZm9yZXtjb250ZW50OiJcZjEwMiJ9LmZhLWFuZ2xlLWRvdWJsZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZjEwMyJ9LmZhLWFuZ2xlLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTA0In0uZmEtYW5nbGUtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTA1In0uZmEtYW5nbGUtdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTA2In0uZmEtYW5nbGUtZG93bjpiZWZvcmV7Y29udGVudDoiXGYxMDcifS5mYS1kZXNrdG9wOmJlZm9yZXtjb250ZW50OiJcZjEwOCJ9LmZhLWxhcHRvcDpiZWZvcmV7Y29udGVudDoiXGYxMDkifS5mYS10YWJsZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTBhIn0uZmEtbW9iaWxlLXBob25lOmJlZm9yZSwuZmEtbW9iaWxlOmJlZm9yZXtjb250ZW50OiJcZjEwYiJ9LmZhLWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OiJcZjEwYyJ9LmZhLXF1b3RlLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTBkIn0uZmEtcXVvdGUtcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTBlIn0uZmEtc3Bpbm5lcjpiZWZvcmV7Y29udGVudDoiXGYxMTAifS5mYS1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMTExIn0uZmEtbWFpbC1yZXBseTpiZWZvcmUsLmZhLXJlcGx5OmJlZm9yZXtjb250ZW50OiJcZjExMiJ9LmZhLWdpdGh1Yi1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTEzIn0uZmEtZm9sZGVyLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTE0In0uZmEtZm9sZGVyLW9wZW4tbzpiZWZvcmV7Y29udGVudDoiXGYxMTUifS5mYS1zbWlsZS1vOmJlZm9yZXtjb250ZW50OiJcZjExOCJ9LmZhLWZyb3duLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTE5In0uZmEtbWVoLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTFhIn0uZmEtZ2FtZXBhZDpiZWZvcmV7Y29udGVudDoiXGYxMWIifS5mYS1rZXlib2FyZC1vOmJlZm9yZXtjb250ZW50OiJcZjExYyJ9LmZhLWZsYWctbzpiZWZvcmV7Y29udGVudDoiXGYxMWQifS5mYS1mbGFnLWNoZWNrZXJlZDpiZWZvcmV7Y29udGVudDoiXGYxMWUifS5mYS10ZXJtaW5hbDpiZWZvcmV7Y29udGVudDoiXGYxMjAifS5mYS1jb2RlOmJlZm9yZXtjb250ZW50OiJcZjEyMSJ9LmZhLW1haWwtcmVwbHktYWxsOmJlZm9yZSwuZmEtcmVwbHktYWxsOmJlZm9yZXtjb250ZW50OiJcZjEyMiJ9LmZhLXN0YXItaGFsZi1lbXB0eTpiZWZvcmUsLmZhLXN0YXItaGFsZi1mdWxsOmJlZm9yZSwuZmEtc3Rhci1oYWxmLW86YmVmb3Jle2NvbnRlbnQ6IlxmMTIzIn0uZmEtbG9jYXRpb24tYXJyb3c6YmVmb3Jle2NvbnRlbnQ6IlxmMTI0In0uZmEtY3JvcDpiZWZvcmV7Y29udGVudDoiXGYxMjUifS5mYS1jb2RlLWZvcms6YmVmb3Jle2NvbnRlbnQ6IlxmMTI2In0uZmEtdW5saW5rOmJlZm9yZSwuZmEtY2hhaW4tYnJva2VuOmJlZm9yZXtjb250ZW50OiJcZjEyNyJ9LmZhLXF1ZXN0aW9uOmJlZm9yZXtjb250ZW50OiJcZjEyOCJ9LmZhLWluZm86YmVmb3Jle2NvbnRlbnQ6IlxmMTI5In0uZmEtZXhjbGFtYXRpb246YmVmb3Jle2NvbnRlbnQ6IlxmMTJhIn0uZmEtc3VwZXJzY3JpcHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTJiIn0uZmEtc3Vic2NyaXB0OmJlZm9yZXtjb250ZW50OiJcZjEyYyJ9LmZhLWVyYXNlcjpiZWZvcmV7Y29udGVudDoiXGYxMmQifS5mYS1wdXp6bGUtcGllY2U6YmVmb3Jle2NvbnRlbnQ6IlxmMTJlIn0uZmEtbWljcm9waG9uZTpiZWZvcmV7Y29udGVudDoiXGYxMzAifS5mYS1taWNyb3Bob25lLXNsYXNoOmJlZm9yZXtjb250ZW50OiJcZjEzMSJ9LmZhLXNoaWVsZDpiZWZvcmV7Y29udGVudDoiXGYxMzIifS5mYS1jYWxlbmRhci1vOmJlZm9yZXtjb250ZW50OiJcZjEzMyJ9LmZhLWZpcmUtZXh0aW5ndWlzaGVyOmJlZm9yZXtjb250ZW50OiJcZjEzNCJ9LmZhLXJvY2tldDpiZWZvcmV7Y29udGVudDoiXGYxMzUifS5mYS1tYXhjZG46YmVmb3Jle2NvbnRlbnQ6IlxmMTM2In0uZmEtY2hldnJvbi1jaXJjbGUtbGVmdDpiZWZvcmV7Y29udGVudDoiXGYxMzcifS5mYS1jaGV2cm9uLWNpcmNsZS1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYxMzgifS5mYS1jaGV2cm9uLWNpcmNsZS11cDpiZWZvcmV7Y29udGVudDoiXGYxMzkifS5mYS1jaGV2cm9uLWNpcmNsZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZjEzYSJ9LmZhLWh0bWw1OmJlZm9yZXtjb250ZW50OiJcZjEzYiJ9LmZhLWNzczM6YmVmb3Jle2NvbnRlbnQ6IlxmMTNjIn0uZmEtYW5jaG9yOmJlZm9yZXtjb250ZW50OiJcZjEzZCJ9LmZhLXVubG9jay1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTNlIn0uZmEtYnVsbHNleWU6YmVmb3Jle2NvbnRlbnQ6IlxmMTQwIn0uZmEtZWxsaXBzaXMtaDpiZWZvcmV7Y29udGVudDoiXGYxNDEifS5mYS1lbGxpcHNpcy12OmJlZm9yZXtjb250ZW50OiJcZjE0MiJ9LmZhLXJzcy1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTQzIn0uZmEtcGxheS1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMTQ0In0uZmEtdGlja2V0OmJlZm9yZXtjb250ZW50OiJcZjE0NSJ9LmZhLW1pbnVzLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxNDYifS5mYS1taW51cy1zcXVhcmUtbzpiZWZvcmV7Y29udGVudDoiXGYxNDcifS5mYS1sZXZlbC11cDpiZWZvcmV7Y29udGVudDoiXGYxNDgifS5mYS1sZXZlbC1kb3duOmJlZm9yZXtjb250ZW50OiJcZjE0OSJ9LmZhLWNoZWNrLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxNGEifS5mYS1wZW5jaWwtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE0YiJ9LmZhLWV4dGVybmFsLWxpbmstc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjE0YyJ9LmZhLXNoYXJlLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxNGQifS5mYS1jb21wYXNzOmJlZm9yZXtjb250ZW50OiJcZjE0ZSJ9LmZhLXRvZ2dsZS1kb3duOmJlZm9yZSwuZmEtY2FyZXQtc3F1YXJlLW8tZG93bjpiZWZvcmV7Y29udGVudDoiXGYxNTAifS5mYS10b2dnbGUtdXA6YmVmb3JlLC5mYS1jYXJldC1zcXVhcmUtby11cDpiZWZvcmV7Y29udGVudDoiXGYxNTEifS5mYS10b2dnbGUtcmlnaHQ6YmVmb3JlLC5mYS1jYXJldC1zcXVhcmUtby1yaWdodDpiZWZvcmV7Y29udGVudDoiXGYxNTIifS5mYS1ldXJvOmJlZm9yZSwuZmEtZXVyOmJlZm9yZXtjb250ZW50OiJcZjE1MyJ9LmZhLWdicDpiZWZvcmV7Y29udGVudDoiXGYxNTQifS5mYS1kb2xsYXI6YmVmb3JlLC5mYS11c2Q6YmVmb3Jle2NvbnRlbnQ6IlxmMTU1In0uZmEtcnVwZWU6YmVmb3JlLC5mYS1pbnI6YmVmb3Jle2NvbnRlbnQ6IlxmMTU2In0uZmEtY255OmJlZm9yZSwuZmEtcm1iOmJlZm9yZSwuZmEteWVuOmJlZm9yZSwuZmEtanB5OmJlZm9yZXtjb250ZW50OiJcZjE1NyJ9LmZhLXJ1YmxlOmJlZm9yZSwuZmEtcm91YmxlOmJlZm9yZSwuZmEtcnViOmJlZm9yZXtjb250ZW50OiJcZjE1OCJ9LmZhLXdvbjpiZWZvcmUsLmZhLWtydzpiZWZvcmV7Y29udGVudDoiXGYxNTkifS5mYS1iaXRjb2luOmJlZm9yZSwuZmEtYnRjOmJlZm9yZXtjb250ZW50OiJcZjE1YSJ9LmZhLWZpbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMTViIn0uZmEtZmlsZS10ZXh0OmJlZm9yZXtjb250ZW50OiJcZjE1YyJ9LmZhLXNvcnQtYWxwaGEtYXNjOmJlZm9yZXtjb250ZW50OiJcZjE1ZCJ9LmZhLXNvcnQtYWxwaGEtZGVzYzpiZWZvcmV7Y29udGVudDoiXGYxNWUifS5mYS1zb3J0LWFtb3VudC1hc2M6YmVmb3Jle2NvbnRlbnQ6IlxmMTYwIn0uZmEtc29ydC1hbW91bnQtZGVzYzpiZWZvcmV7Y29udGVudDoiXGYxNjEifS5mYS1zb3J0LW51bWVyaWMtYXNjOmJlZm9yZXtjb250ZW50OiJcZjE2MiJ9LmZhLXNvcnQtbnVtZXJpYy1kZXNjOmJlZm9yZXtjb250ZW50OiJcZjE2MyJ9LmZhLXRodW1icy11cDpiZWZvcmV7Y29udGVudDoiXGYxNjQifS5mYS10aHVtYnMtZG93bjpiZWZvcmV7Y29udGVudDoiXGYxNjUifS5mYS15b3V0dWJlLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxNjYifS5mYS15b3V0dWJlOmJlZm9yZXtjb250ZW50OiJcZjE2NyJ9LmZhLXhpbmc6YmVmb3Jle2NvbnRlbnQ6IlxmMTY4In0uZmEteGluZy1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTY5In0uZmEteW91dHViZS1wbGF5OmJlZm9yZXtjb250ZW50OiJcZjE2YSJ9LmZhLWRyb3Bib3g6YmVmb3Jle2NvbnRlbnQ6IlxmMTZiIn0uZmEtc3RhY2stb3ZlcmZsb3c6YmVmb3Jle2NvbnRlbnQ6IlxmMTZjIn0uZmEtaW5zdGFncmFtOmJlZm9yZXtjb250ZW50OiJcZjE2ZCJ9LmZhLWZsaWNrcjpiZWZvcmV7Y29udGVudDoiXGYxNmUifS5mYS1hZG46YmVmb3Jle2NvbnRlbnQ6IlxmMTcwIn0uZmEtYml0YnVja2V0OmJlZm9yZXtjb250ZW50OiJcZjE3MSJ9LmZhLWJpdGJ1Y2tldC1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTcyIn0uZmEtdHVtYmxyOmJlZm9yZXtjb250ZW50OiJcZjE3MyJ9LmZhLXR1bWJsci1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTc0In0uZmEtbG9uZy1hcnJvdy1kb3duOmJlZm9yZXtjb250ZW50OiJcZjE3NSJ9LmZhLWxvbmctYXJyb3ctdXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTc2In0uZmEtbG9uZy1hcnJvdy1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjE3NyJ9LmZhLWxvbmctYXJyb3ctcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTc4In0uZmEtYXBwbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMTc5In0uZmEtd2luZG93czpiZWZvcmV7Y29udGVudDoiXGYxN2EifS5mYS1hbmRyb2lkOmJlZm9yZXtjb250ZW50OiJcZjE3YiJ9LmZhLWxpbnV4OmJlZm9yZXtjb250ZW50OiJcZjE3YyJ9LmZhLWRyaWJiYmxlOmJlZm9yZXtjb250ZW50OiJcZjE3ZCJ9LmZhLXNreXBlOmJlZm9yZXtjb250ZW50OiJcZjE3ZSJ9LmZhLWZvdXJzcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMTgwIn0uZmEtdHJlbGxvOmJlZm9yZXtjb250ZW50OiJcZjE4MSJ9LmZhLWZlbWFsZTpiZWZvcmV7Y29udGVudDoiXGYxODIifS5mYS1tYWxlOmJlZm9yZXtjb250ZW50OiJcZjE4MyJ9LmZhLWdpdHRpcDpiZWZvcmUsLmZhLWdyYXRpcGF5OmJlZm9yZXtjb250ZW50OiJcZjE4NCJ9LmZhLXN1bi1vOmJlZm9yZXtjb250ZW50OiJcZjE4NSJ9LmZhLW1vb24tbzpiZWZvcmV7Y29udGVudDoiXGYxODYifS5mYS1hcmNoaXZlOmJlZm9yZXtjb250ZW50OiJcZjE4NyJ9LmZhLWJ1ZzpiZWZvcmV7Y29udGVudDoiXGYxODgifS5mYS12azpiZWZvcmV7Y29udGVudDoiXGYxODkifS5mYS13ZWlibzpiZWZvcmV7Y29udGVudDoiXGYxOGEifS5mYS1yZW5yZW46YmVmb3Jle2NvbnRlbnQ6IlxmMThiIn0uZmEtcGFnZWxpbmVzOmJlZm9yZXtjb250ZW50OiJcZjE4YyJ9LmZhLXN0YWNrLWV4Y2hhbmdlOmJlZm9yZXtjb250ZW50OiJcZjE4ZCJ9LmZhLWFycm93LWNpcmNsZS1vLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjE4ZSJ9LmZhLWFycm93LWNpcmNsZS1vLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMTkwIn0uZmEtdG9nZ2xlLWxlZnQ6YmVmb3JlLC5mYS1jYXJldC1zcXVhcmUtby1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZjE5MSJ9LmZhLWRvdC1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDoiXGYxOTIifS5mYS13aGVlbGNoYWlyOmJlZm9yZXtjb250ZW50OiJcZjE5MyJ9LmZhLXZpbWVvLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxOTQifS5mYS10dXJraXNoLWxpcmE6YmVmb3JlLC5mYS10cnk6YmVmb3Jle2NvbnRlbnQ6IlxmMTk1In0uZmEtcGx1cy1zcXVhcmUtbzpiZWZvcmV7Y29udGVudDoiXGYxOTYifS5mYS1zcGFjZS1zaHV0dGxlOmJlZm9yZXtjb250ZW50OiJcZjE5NyJ9LmZhLXNsYWNrOmJlZm9yZXtjb250ZW50OiJcZjE5OCJ9LmZhLWVudmVsb3BlLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxOTkifS5mYS13b3JkcHJlc3M6YmVmb3Jle2NvbnRlbnQ6IlxmMTlhIn0uZmEtb3BlbmlkOmJlZm9yZXtjb250ZW50OiJcZjE5YiJ9LmZhLWluc3RpdHV0aW9uOmJlZm9yZSwuZmEtYmFuazpiZWZvcmUsLmZhLXVuaXZlcnNpdHk6YmVmb3Jle2NvbnRlbnQ6IlxmMTljIn0uZmEtbW9ydGFyLWJvYXJkOmJlZm9yZSwuZmEtZ3JhZHVhdGlvbi1jYXA6YmVmb3Jle2NvbnRlbnQ6IlxmMTlkIn0uZmEteWFob286YmVmb3Jle2NvbnRlbnQ6IlxmMTllIn0uZmEtZ29vZ2xlOmJlZm9yZXtjb250ZW50OiJcZjFhMCJ9LmZhLXJlZGRpdDpiZWZvcmV7Y29udGVudDoiXGYxYTEifS5mYS1yZWRkaXQtc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjFhMiJ9LmZhLXN0dW1ibGV1cG9uLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYxYTMifS5mYS1zdHVtYmxldXBvbjpiZWZvcmV7Y29udGVudDoiXGYxYTQifS5mYS1kZWxpY2lvdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMWE1In0uZmEtZGlnZzpiZWZvcmV7Y29udGVudDoiXGYxYTYifS5mYS1waWVkLXBpcGVyLXBwOmJlZm9yZXtjb250ZW50OiJcZjFhNyJ9LmZhLXBpZWQtcGlwZXItYWx0OmJlZm9yZXtjb250ZW50OiJcZjFhOCJ9LmZhLWRydXBhbDpiZWZvcmV7Y29udGVudDoiXGYxYTkifS5mYS1qb29tbGE6YmVmb3Jle2NvbnRlbnQ6IlxmMWFhIn0uZmEtbGFuZ3VhZ2U6YmVmb3Jle2NvbnRlbnQ6IlxmMWFiIn0uZmEtZmF4OmJlZm9yZXtjb250ZW50OiJcZjFhYyJ9LmZhLWJ1aWxkaW5nOmJlZm9yZXtjb250ZW50OiJcZjFhZCJ9LmZhLWNoaWxkOmJlZm9yZXtjb250ZW50OiJcZjFhZSJ9LmZhLXBhdzpiZWZvcmV7Y29udGVudDoiXGYxYjAifS5mYS1zcG9vbjpiZWZvcmV7Y29udGVudDoiXGYxYjEifS5mYS1jdWJlOmJlZm9yZXtjb250ZW50OiJcZjFiMiJ9LmZhLWN1YmVzOmJlZm9yZXtjb250ZW50OiJcZjFiMyJ9LmZhLWJlaGFuY2U6YmVmb3Jle2NvbnRlbnQ6IlxmMWI0In0uZmEtYmVoYW5jZS1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWI1In0uZmEtc3RlYW06YmVmb3Jle2NvbnRlbnQ6IlxmMWI2In0uZmEtc3RlYW0tc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjFiNyJ9LmZhLXJlY3ljbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMWI4In0uZmEtYXV0b21vYmlsZTpiZWZvcmUsLmZhLWNhcjpiZWZvcmV7Y29udGVudDoiXGYxYjkifS5mYS1jYWI6YmVmb3JlLC5mYS10YXhpOmJlZm9yZXtjb250ZW50OiJcZjFiYSJ9LmZhLXRyZWU6YmVmb3Jle2NvbnRlbnQ6IlxmMWJiIn0uZmEtc3BvdGlmeTpiZWZvcmV7Y29udGVudDoiXGYxYmMifS5mYS1kZXZpYW50YXJ0OmJlZm9yZXtjb250ZW50OiJcZjFiZCJ9LmZhLXNvdW5kY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMWJlIn0uZmEtZGF0YWJhc2U6YmVmb3Jle2NvbnRlbnQ6IlxmMWMwIn0uZmEtZmlsZS1wZGYtbzpiZWZvcmV7Y29udGVudDoiXGYxYzEifS5mYS1maWxlLXdvcmQtbzpiZWZvcmV7Y29udGVudDoiXGYxYzIifS5mYS1maWxlLWV4Y2VsLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWMzIn0uZmEtZmlsZS1wb3dlcnBvaW50LW86YmVmb3Jle2NvbnRlbnQ6IlxmMWM0In0uZmEtZmlsZS1waG90by1vOmJlZm9yZSwuZmEtZmlsZS1waWN0dXJlLW86YmVmb3JlLC5mYS1maWxlLWltYWdlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWM1In0uZmEtZmlsZS16aXAtbzpiZWZvcmUsLmZhLWZpbGUtYXJjaGl2ZS1vOmJlZm9yZXtjb250ZW50OiJcZjFjNiJ9LmZhLWZpbGUtc291bmQtbzpiZWZvcmUsLmZhLWZpbGUtYXVkaW8tbzpiZWZvcmV7Y29udGVudDoiXGYxYzcifS5mYS1maWxlLW1vdmllLW86YmVmb3JlLC5mYS1maWxlLXZpZGVvLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWM4In0uZmEtZmlsZS1jb2RlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWM5In0uZmEtdmluZTpiZWZvcmV7Y29udGVudDoiXGYxY2EifS5mYS1jb2RlcGVuOmJlZm9yZXtjb250ZW50OiJcZjFjYiJ9LmZhLWpzZmlkZGxlOmJlZm9yZXtjb250ZW50OiJcZjFjYyJ9LmZhLWxpZmUtYm91eTpiZWZvcmUsLmZhLWxpZmUtYnVveTpiZWZvcmUsLmZhLWxpZmUtc2F2ZXI6YmVmb3JlLC5mYS1zdXBwb3J0OmJlZm9yZSwuZmEtbGlmZS1yaW5nOmJlZm9yZXtjb250ZW50OiJcZjFjZCJ9LmZhLWNpcmNsZS1vLW5vdGNoOmJlZm9yZXtjb250ZW50OiJcZjFjZSJ9LmZhLXJhOmJlZm9yZSwuZmEtcmVzaXN0YW5jZTpiZWZvcmUsLmZhLXJlYmVsOmJlZm9yZXtjb250ZW50OiJcZjFkMCJ9LmZhLWdlOmJlZm9yZSwuZmEtZW1waXJlOmJlZm9yZXtjb250ZW50OiJcZjFkMSJ9LmZhLWdpdC1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWQyIn0uZmEtZ2l0OmJlZm9yZXtjb250ZW50OiJcZjFkMyJ9LmZhLXktY29tYmluYXRvci1zcXVhcmU6YmVmb3JlLC5mYS15Yy1zcXVhcmU6YmVmb3JlLC5mYS1oYWNrZXItbmV3czpiZWZvcmV7Y29udGVudDoiXGYxZDQifS5mYS10ZW5jZW50LXdlaWJvOmJlZm9yZXtjb250ZW50OiJcZjFkNSJ9LmZhLXFxOmJlZm9yZXtjb250ZW50OiJcZjFkNiJ9LmZhLXdlY2hhdDpiZWZvcmUsLmZhLXdlaXhpbjpiZWZvcmV7Y29udGVudDoiXGYxZDcifS5mYS1zZW5kOmJlZm9yZSwuZmEtcGFwZXItcGxhbmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWQ4In0uZmEtc2VuZC1vOmJlZm9yZSwuZmEtcGFwZXItcGxhbmUtbzpiZWZvcmV7Y29udGVudDoiXGYxZDkifS5mYS1oaXN0b3J5OmJlZm9yZXtjb250ZW50OiJcZjFkYSJ9LmZhLWNpcmNsZS10aGluOmJlZm9yZXtjb250ZW50OiJcZjFkYiJ9LmZhLWhlYWRlcjpiZWZvcmV7Y29udGVudDoiXGYxZGMifS5mYS1wYXJhZ3JhcGg6YmVmb3Jle2NvbnRlbnQ6IlxmMWRkIn0uZmEtc2xpZGVyczpiZWZvcmV7Y29udGVudDoiXGYxZGUifS5mYS1zaGFyZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMWUwIn0uZmEtc2hhcmUtYWx0LXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYxZTEifS5mYS1ib21iOmJlZm9yZXtjb250ZW50OiJcZjFlMiJ9LmZhLXNvY2Nlci1iYWxsLW86YmVmb3JlLC5mYS1mdXRib2wtbzpiZWZvcmV7Y29udGVudDoiXGYxZTMifS5mYS10dHk6YmVmb3Jle2NvbnRlbnQ6IlxmMWU0In0uZmEtYmlub2N1bGFyczpiZWZvcmV7Y29udGVudDoiXGYxZTUifS5mYS1wbHVnOmJlZm9yZXtjb250ZW50OiJcZjFlNiJ9LmZhLXNsaWRlc2hhcmU6YmVmb3Jle2NvbnRlbnQ6IlxmMWU3In0uZmEtdHdpdGNoOmJlZm9yZXtjb250ZW50OiJcZjFlOCJ9LmZhLXllbHA6YmVmb3Jle2NvbnRlbnQ6IlxmMWU5In0uZmEtbmV3c3BhcGVyLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWVhIn0uZmEtd2lmaTpiZWZvcmV7Y29udGVudDoiXGYxZWIifS5mYS1jYWxjdWxhdG9yOmJlZm9yZXtjb250ZW50OiJcZjFlYyJ9LmZhLXBheXBhbDpiZWZvcmV7Y29udGVudDoiXGYxZWQifS5mYS1nb29nbGUtd2FsbGV0OmJlZm9yZXtjb250ZW50OiJcZjFlZSJ9LmZhLWNjLXZpc2E6YmVmb3Jle2NvbnRlbnQ6IlxmMWYwIn0uZmEtY2MtbWFzdGVyY2FyZDpiZWZvcmV7Y29udGVudDoiXGYxZjEifS5mYS1jYy1kaXNjb3ZlcjpiZWZvcmV7Y29udGVudDoiXGYxZjIifS5mYS1jYy1hbWV4OmJlZm9yZXtjb250ZW50OiJcZjFmMyJ9LmZhLWNjLXBheXBhbDpiZWZvcmV7Y29udGVudDoiXGYxZjQifS5mYS1jYy1zdHJpcGU6YmVmb3Jle2NvbnRlbnQ6IlxmMWY1In0uZmEtYmVsbC1zbGFzaDpiZWZvcmV7Y29udGVudDoiXGYxZjYifS5mYS1iZWxsLXNsYXNoLW86YmVmb3Jle2NvbnRlbnQ6IlxmMWY3In0uZmEtdHJhc2g6YmVmb3Jle2NvbnRlbnQ6IlxmMWY4In0uZmEtY29weXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZjFmOSJ9LmZhLWF0OmJlZm9yZXtjb250ZW50OiJcZjFmYSJ9LmZhLWV5ZWRyb3BwZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMWZiIn0uZmEtcGFpbnQtYnJ1c2g6YmVmb3Jle2NvbnRlbnQ6IlxmMWZjIn0uZmEtYmlydGhkYXktY2FrZTpiZWZvcmV7Y29udGVudDoiXGYxZmQifS5mYS1hcmVhLWNoYXJ0OmJlZm9yZXtjb250ZW50OiJcZjFmZSJ9LmZhLXBpZS1jaGFydDpiZWZvcmV7Y29udGVudDoiXGYyMDAifS5mYS1saW5lLWNoYXJ0OmJlZm9yZXtjb250ZW50OiJcZjIwMSJ9LmZhLWxhc3RmbTpiZWZvcmV7Y29udGVudDoiXGYyMDIifS5mYS1sYXN0Zm0tc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjIwMyJ9LmZhLXRvZ2dsZS1vZmY6YmVmb3Jle2NvbnRlbnQ6IlxmMjA0In0uZmEtdG9nZ2xlLW9uOmJlZm9yZXtjb250ZW50OiJcZjIwNSJ9LmZhLWJpY3ljbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMjA2In0uZmEtYnVzOmJlZm9yZXtjb250ZW50OiJcZjIwNyJ9LmZhLWlveGhvc3Q6YmVmb3Jle2NvbnRlbnQ6IlxmMjA4In0uZmEtYW5nZWxsaXN0OmJlZm9yZXtjb250ZW50OiJcZjIwOSJ9LmZhLWNjOmJlZm9yZXtjb250ZW50OiJcZjIwYSJ9LmZhLXNoZWtlbDpiZWZvcmUsLmZhLXNoZXFlbDpiZWZvcmUsLmZhLWlsczpiZWZvcmV7Y29udGVudDoiXGYyMGIifS5mYS1tZWFucGF0aDpiZWZvcmV7Y29udGVudDoiXGYyMGMifS5mYS1idXlzZWxsYWRzOmJlZm9yZXtjb250ZW50OiJcZjIwZCJ9LmZhLWNvbm5lY3RkZXZlbG9wOmJlZm9yZXtjb250ZW50OiJcZjIwZSJ9LmZhLWRhc2hjdWJlOmJlZm9yZXtjb250ZW50OiJcZjIxMCJ9LmZhLWZvcnVtYmVlOmJlZm9yZXtjb250ZW50OiJcZjIxMSJ9LmZhLWxlYW5wdWI6YmVmb3Jle2NvbnRlbnQ6IlxmMjEyIn0uZmEtc2VsbHN5OmJlZm9yZXtjb250ZW50OiJcZjIxMyJ9LmZhLXNoaXJ0c2luYnVsazpiZWZvcmV7Y29udGVudDoiXGYyMTQifS5mYS1zaW1wbHlidWlsdDpiZWZvcmV7Y29udGVudDoiXGYyMTUifS5mYS1za3lhdGxhczpiZWZvcmV7Y29udGVudDoiXGYyMTYifS5mYS1jYXJ0LXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMjE3In0uZmEtY2FydC1hcnJvdy1kb3duOmJlZm9yZXtjb250ZW50OiJcZjIxOCJ9LmZhLWRpYW1vbmQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjE5In0uZmEtc2hpcDpiZWZvcmV7Y29udGVudDoiXGYyMWEifS5mYS11c2VyLXNlY3JldDpiZWZvcmV7Y29udGVudDoiXGYyMWIifS5mYS1tb3RvcmN5Y2xlOmJlZm9yZXtjb250ZW50OiJcZjIxYyJ9LmZhLXN0cmVldC12aWV3OmJlZm9yZXtjb250ZW50OiJcZjIxZCJ9LmZhLWhlYXJ0YmVhdDpiZWZvcmV7Y29udGVudDoiXGYyMWUifS5mYS12ZW51czpiZWZvcmV7Y29udGVudDoiXGYyMjEifS5mYS1tYXJzOmJlZm9yZXtjb250ZW50OiJcZjIyMiJ9LmZhLW1lcmN1cnk6YmVmb3Jle2NvbnRlbnQ6IlxmMjIzIn0uZmEtaW50ZXJzZXg6YmVmb3JlLC5mYS10cmFuc2dlbmRlcjpiZWZvcmV7Y29udGVudDoiXGYyMjQifS5mYS10cmFuc2dlbmRlci1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjI1In0uZmEtdmVudXMtZG91YmxlOmJlZm9yZXtjb250ZW50OiJcZjIyNiJ9LmZhLW1hcnMtZG91YmxlOmJlZm9yZXtjb250ZW50OiJcZjIyNyJ9LmZhLXZlbnVzLW1hcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMjI4In0uZmEtbWFycy1zdHJva2U6YmVmb3Jle2NvbnRlbnQ6IlxmMjI5In0uZmEtbWFycy1zdHJva2UtdjpiZWZvcmV7Y29udGVudDoiXGYyMmEifS5mYS1tYXJzLXN0cm9rZS1oOmJlZm9yZXtjb250ZW50OiJcZjIyYiJ9LmZhLW5ldXRlcjpiZWZvcmV7Y29udGVudDoiXGYyMmMifS5mYS1nZW5kZXJsZXNzOmJlZm9yZXtjb250ZW50OiJcZjIyZCJ9LmZhLWZhY2Vib29rLW9mZmljaWFsOmJlZm9yZXtjb250ZW50OiJcZjIzMCJ9LmZhLXBpbnRlcmVzdC1wOmJlZm9yZXtjb250ZW50OiJcZjIzMSJ9LmZhLXdoYXRzYXBwOmJlZm9yZXtjb250ZW50OiJcZjIzMiJ9LmZhLXNlcnZlcjpiZWZvcmV7Y29udGVudDoiXGYyMzMifS5mYS11c2VyLXBsdXM6YmVmb3Jle2NvbnRlbnQ6IlxmMjM0In0uZmEtdXNlci10aW1lczpiZWZvcmV7Y29udGVudDoiXGYyMzUifS5mYS1ob3RlbDpiZWZvcmUsLmZhLWJlZDpiZWZvcmV7Y29udGVudDoiXGYyMzYifS5mYS12aWFjb2luOmJlZm9yZXtjb250ZW50OiJcZjIzNyJ9LmZhLXRyYWluOmJlZm9yZXtjb250ZW50OiJcZjIzOCJ9LmZhLXN1YndheTpiZWZvcmV7Y29udGVudDoiXGYyMzkifS5mYS1tZWRpdW06YmVmb3Jle2NvbnRlbnQ6IlxmMjNhIn0uZmEteWM6YmVmb3JlLC5mYS15LWNvbWJpbmF0b3I6YmVmb3Jle2NvbnRlbnQ6IlxmMjNiIn0uZmEtb3B0aW4tbW9uc3RlcjpiZWZvcmV7Y29udGVudDoiXGYyM2MifS5mYS1vcGVuY2FydDpiZWZvcmV7Y29udGVudDoiXGYyM2QifS5mYS1leHBlZGl0ZWRzc2w6YmVmb3Jle2NvbnRlbnQ6IlxmMjNlIn0uZmEtYmF0dGVyeS00OmJlZm9yZSwuZmEtYmF0dGVyeTpiZWZvcmUsLmZhLWJhdHRlcnktZnVsbDpiZWZvcmV7Y29udGVudDoiXGYyNDAifS5mYS1iYXR0ZXJ5LTM6YmVmb3JlLC5mYS1iYXR0ZXJ5LXRocmVlLXF1YXJ0ZXJzOmJlZm9yZXtjb250ZW50OiJcZjI0MSJ9LmZhLWJhdHRlcnktMjpiZWZvcmUsLmZhLWJhdHRlcnktaGFsZjpiZWZvcmV7Y29udGVudDoiXGYyNDIifS5mYS1iYXR0ZXJ5LTE6YmVmb3JlLC5mYS1iYXR0ZXJ5LXF1YXJ0ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMjQzIn0uZmEtYmF0dGVyeS0wOmJlZm9yZSwuZmEtYmF0dGVyeS1lbXB0eTpiZWZvcmV7Y29udGVudDoiXGYyNDQifS5mYS1tb3VzZS1wb2ludGVyOmJlZm9yZXtjb250ZW50OiJcZjI0NSJ9LmZhLWktY3Vyc29yOmJlZm9yZXtjb250ZW50OiJcZjI0NiJ9LmZhLW9iamVjdC1ncm91cDpiZWZvcmV7Y29udGVudDoiXGYyNDcifS5mYS1vYmplY3QtdW5ncm91cDpiZWZvcmV7Y29udGVudDoiXGYyNDgifS5mYS1zdGlja3ktbm90ZTpiZWZvcmV7Y29udGVudDoiXGYyNDkifS5mYS1zdGlja3ktbm90ZS1vOmJlZm9yZXtjb250ZW50OiJcZjI0YSJ9LmZhLWNjLWpjYjpiZWZvcmV7Y29udGVudDoiXGYyNGIifS5mYS1jYy1kaW5lcnMtY2x1YjpiZWZvcmV7Y29udGVudDoiXGYyNGMifS5mYS1jbG9uZTpiZWZvcmV7Y29udGVudDoiXGYyNGQifS5mYS1iYWxhbmNlLXNjYWxlOmJlZm9yZXtjb250ZW50OiJcZjI0ZSJ9LmZhLWhvdXJnbGFzcy1vOmJlZm9yZXtjb250ZW50OiJcZjI1MCJ9LmZhLWhvdXJnbGFzcy0xOmJlZm9yZSwuZmEtaG91cmdsYXNzLXN0YXJ0OmJlZm9yZXtjb250ZW50OiJcZjI1MSJ9LmZhLWhvdXJnbGFzcy0yOmJlZm9yZSwuZmEtaG91cmdsYXNzLWhhbGY6YmVmb3Jle2NvbnRlbnQ6IlxmMjUyIn0uZmEtaG91cmdsYXNzLTM6YmVmb3JlLC5mYS1ob3VyZ2xhc3MtZW5kOmJlZm9yZXtjb250ZW50OiJcZjI1MyJ9LmZhLWhvdXJnbGFzczpiZWZvcmV7Y29udGVudDoiXGYyNTQifS5mYS1oYW5kLWdyYWItbzpiZWZvcmUsLmZhLWhhbmQtcm9jay1vOmJlZm9yZXtjb250ZW50OiJcZjI1NSJ9LmZhLWhhbmQtc3RvcC1vOmJlZm9yZSwuZmEtaGFuZC1wYXBlci1vOmJlZm9yZXtjb250ZW50OiJcZjI1NiJ9LmZhLWhhbmQtc2Npc3NvcnMtbzpiZWZvcmV7Y29udGVudDoiXGYyNTcifS5mYS1oYW5kLWxpemFyZC1vOmJlZm9yZXtjb250ZW50OiJcZjI1OCJ9LmZhLWhhbmQtc3BvY2stbzpiZWZvcmV7Y29udGVudDoiXGYyNTkifS5mYS1oYW5kLXBvaW50ZXItbzpiZWZvcmV7Y29udGVudDoiXGYyNWEifS5mYS1oYW5kLXBlYWNlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjViIn0uZmEtdHJhZGVtYXJrOmJlZm9yZXtjb250ZW50OiJcZjI1YyJ9LmZhLXJlZ2lzdGVyZWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjVkIn0uZmEtY3JlYXRpdmUtY29tbW9uczpiZWZvcmV7Y29udGVudDoiXGYyNWUifS5mYS1nZzpiZWZvcmV7Y29udGVudDoiXGYyNjAifS5mYS1nZy1jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMjYxIn0uZmEtdHJpcGFkdmlzb3I6YmVmb3Jle2NvbnRlbnQ6IlxmMjYyIn0uZmEtb2Rub2tsYXNzbmlraTpiZWZvcmV7Y29udGVudDoiXGYyNjMifS5mYS1vZG5va2xhc3NuaWtpLXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYyNjQifS5mYS1nZXQtcG9ja2V0OmJlZm9yZXtjb250ZW50OiJcZjI2NSJ9LmZhLXdpa2lwZWRpYS13OmJlZm9yZXtjb250ZW50OiJcZjI2NiJ9LmZhLXNhZmFyaTpiZWZvcmV7Y29udGVudDoiXGYyNjcifS5mYS1jaHJvbWU6YmVmb3Jle2NvbnRlbnQ6IlxmMjY4In0uZmEtZmlyZWZveDpiZWZvcmV7Y29udGVudDoiXGYyNjkifS5mYS1vcGVyYTpiZWZvcmV7Y29udGVudDoiXGYyNmEifS5mYS1pbnRlcm5ldC1leHBsb3JlcjpiZWZvcmV7Y29udGVudDoiXGYyNmIifS5mYS10djpiZWZvcmUsLmZhLXRlbGV2aXNpb246YmVmb3Jle2NvbnRlbnQ6IlxmMjZjIn0uZmEtY29udGFvOmJlZm9yZXtjb250ZW50OiJcZjI2ZCJ9LmZhLTUwMHB4OmJlZm9yZXtjb250ZW50OiJcZjI2ZSJ9LmZhLWFtYXpvbjpiZWZvcmV7Y29udGVudDoiXGYyNzAifS5mYS1jYWxlbmRhci1wbHVzLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjcxIn0uZmEtY2FsZW5kYXItbWludXMtbzpiZWZvcmV7Y29udGVudDoiXGYyNzIifS5mYS1jYWxlbmRhci10aW1lcy1vOmJlZm9yZXtjb250ZW50OiJcZjI3MyJ9LmZhLWNhbGVuZGFyLWNoZWNrLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjc0In0uZmEtaW5kdXN0cnk6YmVmb3Jle2NvbnRlbnQ6IlxmMjc1In0uZmEtbWFwLXBpbjpiZWZvcmV7Y29udGVudDoiXGYyNzYifS5mYS1tYXAtc2lnbnM6YmVmb3Jle2NvbnRlbnQ6IlxmMjc3In0uZmEtbWFwLW86YmVmb3Jle2NvbnRlbnQ6IlxmMjc4In0uZmEtbWFwOmJlZm9yZXtjb250ZW50OiJcZjI3OSJ9LmZhLWNvbW1lbnRpbmc6YmVmb3Jle2NvbnRlbnQ6IlxmMjdhIn0uZmEtY29tbWVudGluZy1vOmJlZm9yZXtjb250ZW50OiJcZjI3YiJ9LmZhLWhvdXp6OmJlZm9yZXtjb250ZW50OiJcZjI3YyJ9LmZhLXZpbWVvOmJlZm9yZXtjb250ZW50OiJcZjI3ZCJ9LmZhLWJsYWNrLXRpZTpiZWZvcmV7Y29udGVudDoiXGYyN2UifS5mYS1mb250aWNvbnM6YmVmb3Jle2NvbnRlbnQ6IlxmMjgwIn0uZmEtcmVkZGl0LWFsaWVuOmJlZm9yZXtjb250ZW50OiJcZjI4MSJ9LmZhLWVkZ2U6YmVmb3Jle2NvbnRlbnQ6IlxmMjgyIn0uZmEtY3JlZGl0LWNhcmQtYWx0OmJlZm9yZXtjb250ZW50OiJcZjI4MyJ9LmZhLWNvZGllcGllOmJlZm9yZXtjb250ZW50OiJcZjI4NCJ9LmZhLW1vZHg6YmVmb3Jle2NvbnRlbnQ6IlxmMjg1In0uZmEtZm9ydC1hd2Vzb21lOmJlZm9yZXtjb250ZW50OiJcZjI4NiJ9LmZhLXVzYjpiZWZvcmV7Y29udGVudDoiXGYyODcifS5mYS1wcm9kdWN0LWh1bnQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjg4In0uZmEtbWl4Y2xvdWQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjg5In0uZmEtc2NyaWJkOmJlZm9yZXtjb250ZW50OiJcZjI4YSJ9LmZhLXBhdXNlLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYyOGIifS5mYS1wYXVzZS1jaXJjbGUtbzpiZWZvcmV7Y29udGVudDoiXGYyOGMifS5mYS1zdG9wLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYyOGQifS5mYS1zdG9wLWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OiJcZjI4ZSJ9LmZhLXNob3BwaW5nLWJhZzpiZWZvcmV7Y29udGVudDoiXGYyOTAifS5mYS1zaG9wcGluZy1iYXNrZXQ6YmVmb3Jle2NvbnRlbnQ6IlxmMjkxIn0uZmEtaGFzaHRhZzpiZWZvcmV7Y29udGVudDoiXGYyOTIifS5mYS1ibHVldG9vdGg6YmVmb3Jle2NvbnRlbnQ6IlxmMjkzIn0uZmEtYmx1ZXRvb3RoLWI6YmVmb3Jle2NvbnRlbnQ6IlxmMjk0In0uZmEtcGVyY2VudDpiZWZvcmV7Y29udGVudDoiXGYyOTUifS5mYS1naXRsYWI6YmVmb3Jle2NvbnRlbnQ6IlxmMjk2In0uZmEtd3BiZWdpbm5lcjpiZWZvcmV7Y29udGVudDoiXGYyOTcifS5mYS13cGZvcm1zOmJlZm9yZXtjb250ZW50OiJcZjI5OCJ9LmZhLWVudmlyYTpiZWZvcmV7Y29udGVudDoiXGYyOTkifS5mYS11bml2ZXJzYWwtYWNjZXNzOmJlZm9yZXtjb250ZW50OiJcZjI5YSJ9LmZhLXdoZWVsY2hhaXItYWx0OmJlZm9yZXtjb250ZW50OiJcZjI5YiJ9LmZhLXF1ZXN0aW9uLWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OiJcZjI5YyJ9LmZhLWJsaW5kOmJlZm9yZXtjb250ZW50OiJcZjI5ZCJ9LmZhLWF1ZGlvLWRlc2NyaXB0aW9uOmJlZm9yZXtjb250ZW50OiJcZjI5ZSJ9LmZhLXZvbHVtZS1jb250cm9sLXBob25lOmJlZm9yZXtjb250ZW50OiJcZjJhMCJ9LmZhLWJyYWlsbGU6YmVmb3Jle2NvbnRlbnQ6IlxmMmExIn0uZmEtYXNzaXN0aXZlLWxpc3RlbmluZy1zeXN0ZW1zOmJlZm9yZXtjb250ZW50OiJcZjJhMiJ9LmZhLWFzbC1pbnRlcnByZXRpbmc6YmVmb3JlLC5mYS1hbWVyaWNhbi1zaWduLWxhbmd1YWdlLWludGVycHJldGluZzpiZWZvcmV7Y29udGVudDoiXGYyYTMifS5mYS1kZWFmbmVzczpiZWZvcmUsLmZhLWhhcmQtb2YtaGVhcmluZzpiZWZvcmUsLmZhLWRlYWY6YmVmb3Jle2NvbnRlbnQ6IlxmMmE0In0uZmEtZ2xpZGU6YmVmb3Jle2NvbnRlbnQ6IlxmMmE1In0uZmEtZ2xpZGUtZzpiZWZvcmV7Y29udGVudDoiXGYyYTYifS5mYS1zaWduaW5nOmJlZm9yZSwuZmEtc2lnbi1sYW5ndWFnZTpiZWZvcmV7Y29udGVudDoiXGYyYTcifS5mYS1sb3ctdmlzaW9uOmJlZm9yZXtjb250ZW50OiJcZjJhOCJ9LmZhLXZpYWRlbzpiZWZvcmV7Y29udGVudDoiXGYyYTkifS5mYS12aWFkZW8tc3F1YXJlOmJlZm9yZXtjb250ZW50OiJcZjJhYSJ9LmZhLXNuYXBjaGF0OmJlZm9yZXtjb250ZW50OiJcZjJhYiJ9LmZhLXNuYXBjaGF0LWdob3N0OmJlZm9yZXtjb250ZW50OiJcZjJhYyJ9LmZhLXNuYXBjaGF0LXNxdWFyZTpiZWZvcmV7Y29udGVudDoiXGYyYWQifS5mYS1waWVkLXBpcGVyOmJlZm9yZXtjb250ZW50OiJcZjJhZSJ9LmZhLWZpcnN0LW9yZGVyOmJlZm9yZXtjb250ZW50OiJcZjJiMCJ9LmZhLXlvYXN0OmJlZm9yZXtjb250ZW50OiJcZjJiMSJ9LmZhLXRoZW1laXNsZTpiZWZvcmV7Y29udGVudDoiXGYyYjIifS5mYS1nb29nbGUtcGx1cy1jaXJjbGU6YmVmb3JlLC5mYS1nb29nbGUtcGx1cy1vZmZpY2lhbDpiZWZvcmV7Y29udGVudDoiXGYyYjMifS5mYS1mYTpiZWZvcmUsLmZhLWZvbnQtYXdlc29tZTpiZWZvcmV7Y29udGVudDoiXGYyYjQifS5mYS1oYW5kc2hha2UtbzpiZWZvcmV7Y29udGVudDoiXGYyYjUifS5mYS1lbnZlbG9wZS1vcGVuOmJlZm9yZXtjb250ZW50OiJcZjJiNiJ9LmZhLWVudmVsb3BlLW9wZW4tbzpiZWZvcmV7Y29udGVudDoiXGYyYjcifS5mYS1saW5vZGU6YmVmb3Jle2NvbnRlbnQ6IlxmMmI4In0uZmEtYWRkcmVzcy1ib29rOmJlZm9yZXtjb250ZW50OiJcZjJiOSJ9LmZhLWFkZHJlc3MtYm9vay1vOmJlZm9yZXtjb250ZW50OiJcZjJiYSJ9LmZhLXZjYXJkOmJlZm9yZSwuZmEtYWRkcmVzcy1jYXJkOmJlZm9yZXtjb250ZW50OiJcZjJiYiJ9LmZhLXZjYXJkLW86YmVmb3JlLC5mYS1hZGRyZXNzLWNhcmQtbzpiZWZvcmV7Y29udGVudDoiXGYyYmMifS5mYS11c2VyLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGYyYmQifS5mYS11c2VyLWNpcmNsZS1vOmJlZm9yZXtjb250ZW50OiJcZjJiZSJ9LmZhLXVzZXItbzpiZWZvcmV7Y29udGVudDoiXGYyYzAifS5mYS1pZC1iYWRnZTpiZWZvcmV7Y29udGVudDoiXGYyYzEifS5mYS1kcml2ZXJzLWxpY2Vuc2U6YmVmb3JlLC5mYS1pZC1jYXJkOmJlZm9yZXtjb250ZW50OiJcZjJjMiJ9LmZhLWRyaXZlcnMtbGljZW5zZS1vOmJlZm9yZSwuZmEtaWQtY2FyZC1vOmJlZm9yZXtjb250ZW50OiJcZjJjMyJ9LmZhLXF1b3JhOmJlZm9yZXtjb250ZW50OiJcZjJjNCJ9LmZhLWZyZWUtY29kZS1jYW1wOmJlZm9yZXtjb250ZW50OiJcZjJjNSJ9LmZhLXRlbGVncmFtOmJlZm9yZXtjb250ZW50OiJcZjJjNiJ9LmZhLXRoZXJtb21ldGVyLTQ6YmVmb3JlLC5mYS10aGVybW9tZXRlcjpiZWZvcmUsLmZhLXRoZXJtb21ldGVyLWZ1bGw6YmVmb3Jle2NvbnRlbnQ6IlxmMmM3In0uZmEtdGhlcm1vbWV0ZXItMzpiZWZvcmUsLmZhLXRoZXJtb21ldGVyLXRocmVlLXF1YXJ0ZXJzOmJlZm9yZXtjb250ZW50OiJcZjJjOCJ9LmZhLXRoZXJtb21ldGVyLTI6YmVmb3JlLC5mYS10aGVybW9tZXRlci1oYWxmOmJlZm9yZXtjb250ZW50OiJcZjJjOSJ9LmZhLXRoZXJtb21ldGVyLTE6YmVmb3JlLC5mYS10aGVybW9tZXRlci1xdWFydGVyOmJlZm9yZXtjb250ZW50OiJcZjJjYSJ9LmZhLXRoZXJtb21ldGVyLTA6YmVmb3JlLC5mYS10aGVybW9tZXRlci1lbXB0eTpiZWZvcmV7Y29udGVudDoiXGYyY2IifS5mYS1zaG93ZXI6YmVmb3Jle2NvbnRlbnQ6IlxmMmNjIn0uZmEtYmF0aHR1YjpiZWZvcmUsLmZhLXMxNTpiZWZvcmUsLmZhLWJhdGg6YmVmb3Jle2NvbnRlbnQ6IlxmMmNkIn0uZmEtcG9kY2FzdDpiZWZvcmV7Y29udGVudDoiXGYyY2UifS5mYS13aW5kb3ctbWF4aW1pemU6YmVmb3Jle2NvbnRlbnQ6IlxmMmQwIn0uZmEtd2luZG93LW1pbmltaXplOmJlZm9yZXtjb250ZW50OiJcZjJkMSJ9LmZhLXdpbmRvdy1yZXN0b3JlOmJlZm9yZXtjb250ZW50OiJcZjJkMiJ9LmZhLXRpbWVzLXJlY3RhbmdsZTpiZWZvcmUsLmZhLXdpbmRvdy1jbG9zZTpiZWZvcmV7Y29udGVudDoiXGYyZDMifS5mYS10aW1lcy1yZWN0YW5nbGUtbzpiZWZvcmUsLmZhLXdpbmRvdy1jbG9zZS1vOmJlZm9yZXtjb250ZW50OiJcZjJkNCJ9LmZhLWJhbmRjYW1wOmJlZm9yZXtjb250ZW50OiJcZjJkNSJ9LmZhLWdyYXY6YmVmb3Jle2NvbnRlbnQ6IlxmMmQ2In0uZmEtZXRzeTpiZWZvcmV7Y29udGVudDoiXGYyZDcifS5mYS1pbWRiOmJlZm9yZXtjb250ZW50OiJcZjJkOCJ9LmZhLXJhdmVscnk6YmVmb3Jle2NvbnRlbnQ6IlxmMmQ5In0uZmEtZWVyY2FzdDpiZWZvcmV7Y29udGVudDoiXGYyZGEifS5mYS1taWNyb2NoaXA6YmVmb3Jle2NvbnRlbnQ6IlxmMmRiIn0uZmEtc25vd2ZsYWtlLW86YmVmb3Jle2NvbnRlbnQ6IlxmMmRjIn0uZmEtc3VwZXJwb3dlcnM6YmVmb3Jle2NvbnRlbnQ6IlxmMmRkIn0uZmEtd3BleHBsb3JlcjpiZWZvcmV7Y29udGVudDoiXGYyZGUifS5mYS1tZWV0dXA6YmVmb3Jle2NvbnRlbnQ6IlxmMmUwIn0uc3Itb25seXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDtwYWRkaW5nOjA7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO2NsaXA6cmVjdCgwLCAwLCAwLCAwKTtib3JkZXI6MH0uc3Itb25seS1mb2N1c2FibGU6YWN0aXZlLC5zci1vbmx5LWZvY3VzYWJsZTpmb2N1c3twb3NpdGlvbjpzdGF0aWM7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXJnaW46MDtvdmVyZmxvdzp2aXNpYmxlO2NsaXA6YXV0b30K"}},"time_used":294,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":294,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/smooth-scroll.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.308Z","timestamp":1785147795308,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/smooth-scroll.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:38 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 1486\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":3503,"size_decoded":2030,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (3357)","md5":"2f8e7caf6c8e20c70a46d09408a6e5e6","sha1":"9b8deec36d290156ed5f0eb35b420713fa1b3a85","sha256":"73533a19a59294f7b1938892bb28b37cd1a2272a959de3c1757faadedfee578f","sha512":"f34e596853d0b327fef857695b972cb46d7b2200d558908ba69b6f8597e93fbe0215fabe26b5ba8fdb6034d8eec4e95d818eab48c3a61db64234530047ba06dd","ssdeep":"","tlshash":"5c71bbe53910b0764af791f5a82f534aa335c651344e5400816dccd22c7cdbe90f7f5a","first_seen":"2025-05-31T01:51:37.379315Z","last_seen":"2026-08-11T00:25:55.157382Z","times_seen":32,"resource_available":true,"data":"LyoqIHNtb290aC1zY3JvbGwgdjUuMi4wLCBieSBDaHJpcyBGZXJkaW5hbmRpIHwgaHR0cDovL2dpdGh1Yi5jb20vY2ZlcmRpbmFuZGkvc21vb3RoLXNjcm9sbCB8IExpY2Vuc2VkIHVuZGVyIE1JVDogaHR0cDovL2dvbWFrZXRoaW5ncy5jb20vbWl0LyAqLwohZnVuY3Rpb24odCxlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSgic21vb3RoU2Nyb2xsIixlKHQpKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZSh0KTp0LnNtb290aFNjcm9sbD1lKHQpfSh3aW5kb3d8fHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlLG49e30sbz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3ImJiEhdC5hZGRFdmVudExpc3RlbmVyLHI9e3NwZWVkOjUwMCxlYXNpbmc6ImVhc2VJbk91dEN1YmljIixvZmZzZXQ6MCx1cGRhdGVVUkw6ITAsY2FsbGJhY2tCZWZvcmU6ZnVuY3Rpb24oKXt9LGNhbGxiYWNrQWZ0ZXI6ZnVuY3Rpb24oKXt9fSxhPWZ1bmN0aW9uKHQsZSxuKXtpZigiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSlmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5jYWxsKG4sdFtvXSxvLHQpO2Vsc2UgZm9yKHZhciByPTAsYT10Lmxlbmd0aDthPnI7cisrKWUuY2FsbChuLHRbcl0scix0KX0sYz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiBhKHQsZnVuY3Rpb24oZSxvKXtuW29dPXRbb119KSxhKGUsZnVuY3Rpb24odCxvKXtuW29dPWVbb119KSxufSx1PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuY2hhckF0KDApO3QmJnQhPT1kb2N1bWVudDt0PXQucGFyZW50Tm9kZSlpZigiLiI9PT1uKXtpZih0LmNsYXNzTGlzdC5jb250YWlucyhlLnN1YnN0cigxKSkpcmV0dXJuIHR9ZWxzZSBpZigiIyI9PT1uKXtpZih0LmlkPT09ZS5zdWJzdHIoMSkpcmV0dXJuIHR9ZWxzZSBpZigiWyI9PT1uJiZ0Lmhhc0F0dHJpYnV0ZShlLnN1YnN0cigxLGUubGVuZ3RoLTIpKSlyZXR1cm4gdDtyZXR1cm4hMX0saT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj1TdHJpbmcodCksbz1uLmxlbmd0aCxyPS0xLGE9IiIsYz1uLmNoYXJDb2RlQXQoMCk7KytyPG87KXtpZihlPW4uY2hhckNvZGVBdChyKSwwPT09ZSl0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckVycm9yKCJJbnZhbGlkIGNoYXJhY3RlcjogdGhlIGlucHV0IGNvbnRhaW5zIFUrMDAwMC4iKTthKz1lPj0xJiYzMT49ZXx8MTI3PT1lfHwwPT09ciYmZT49NDgmJjU3Pj1lfHwxPT09ciYmZT49NDgmJjU3Pj1lJiY0NT09PWM/IlxcIitlLnRvU3RyaW5nKDE2KSsiICI6ZT49MTI4fHw0NT09PWV8fDk1PT09ZXx8ZT49NDgmJjU3Pj1lfHxlPj02NSYmOTA+PWV8fGU+PTk3JiYxMjI+PWU/bi5jaGFyQXQocik6IlxcIituLmNoYXJBdChyKX1yZXR1cm4gYX0scz1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiJlYXNlSW5RdWFkIj09PXQmJihuPWUqZSksImVhc2VPdXRRdWFkIj09PXQmJihuPWUqKDItZSkpLCJlYXNlSW5PdXRRdWFkIj09PXQmJihuPS41PmU/MiplKmU6LTErKDQtMiplKSplKSwiZWFzZUluQ3ViaWMiPT09dCYmKG49ZSplKmUpLCJlYXNlT3V0Q3ViaWMiPT09dCYmKG49LS1lKmUqZSsxKSwiZWFzZUluT3V0Q3ViaWMiPT09dCYmKG49LjU+ZT80KmUqZSplOihlLTEpKigyKmUtMikqKDIqZS0yKSsxKSwiZWFzZUluUXVhcnQiPT09dCYmKG49ZSplKmUqZSksImVhc2VPdXRRdWFydCI9PT10JiYobj0xLSAtLWUqZSplKmUpLCJlYXNlSW5PdXRRdWFydCI9PT10JiYobj0uNT5lPzgqZSplKmUqZToxLTgqLS1lKmUqZSplKSwiZWFzZUluUXVpbnQiPT09dCYmKG49ZSplKmUqZSplKSwiZWFzZU91dFF1aW50Ij09PXQmJihuPTErLS1lKmUqZSplKmUpLCJlYXNlSW5PdXRRdWludCI9PT10JiYobj0uNT5lPzE2KmUqZSplKmUqZToxKzE2Ki0tZSplKmUqZSplKSxufHxlfSxmPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz0wO2lmKHQub2Zmc2V0UGFyZW50KWRvIG8rPXQub2Zmc2V0VG9wLHQ9dC5vZmZzZXRQYXJlbnQ7d2hpbGUodCk7cmV0dXJuIG89by1lLW4sbz49MD9vOjB9LGw9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpfSxkPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIEpTT04mJiJmdW5jdGlvbiI9PXR5cGVvZiBKU09OLnBhcnNlP0pTT04ucGFyc2UodCk6e319LGg9ZnVuY3Rpb24odCxlKXtoaXN0b3J5LnB1c2hTdGF0ZSYmKGV8fCJ0cnVlIj09PWUpJiZoaXN0b3J5LnB1c2hTdGF0ZSh7cG9zOnQuaWR9LCIiLHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSt0KX07bi5hbmltYXRlU2Nyb2xsPWZ1bmN0aW9uKGUsbixvKXt2YXIgYT1jKGF8fHIsb3x8e30pLHU9ZChlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLW9wdGlvbnMiKTpudWxsKTthPWMoYSx1KSxuPSIjIitpKG4uc3Vic3RyKDEpKTt2YXIgcCxtLGIsdj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4pLGc9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW2RhdGEtc2Nyb2xsLWhlYWRlcl0iKSxPPW51bGw9PT1nPzA6Zy5vZmZzZXRIZWlnaHQrZy5vZmZzZXRUb3AseT10LnBhZ2VZT2Zmc2V0LEk9Zih2LE8scGFyc2VJbnQoYS5vZmZzZXQsMTApKSxTPUkteSx3PWwoKSxBPTA7aChuLGEudXBkYXRlVVJMKTt2YXIgUT1mdW5jdGlvbihvLHIsYyl7dmFyIHU9dC5wYWdlWU9mZnNldDsobz09cnx8dT09cnx8dC5pbm5lckhlaWdodCt1Pj13KSYmKGNsZWFySW50ZXJ2YWwoYyksdi5mb2N1cygpLGEuY2FsbGJhY2tBZnRlcihlLG4pKX0sQz1mdW5jdGlvbigpe0ErPTE2LG09QS9wYXJzZUludChhLnNwZWVkLDEwKSxtPW0+MT8xOm0sYj15K1MqcyhhLmVhc2luZyxtKSx0LnNjcm9sbFRvKDAsTWF0aC5mbG9vcihiKSksUShiLEkscCl9LEg9ZnVuY3Rpb24oKXthLmNhbGxiYWNrQmVmb3JlKGUsbikscD1zZXRJbnRlcnZhbChDLDE2KX07MD09PXQucGFnZVlPZmZzZXQmJnQuc2Nyb2xsVG8oMCwwKSxIKCl9O3ZhciBwPWZ1bmN0aW9uKHQpe3ZhciBvPXUodC50YXJnZXQsIltkYXRhLXNjcm9sbF0iKTtvJiYiYSI9PT1vLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmKHQucHJldmVudERlZmF1bHQoKSxuLmFuaW1hdGVTY3JvbGwobyxvLmhhc2gsZSx0KSl9O3JldHVybiBuLmRlc3Ryb3k9ZnVuY3Rpb24oKXtlJiYoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHAsITEpLGU9bnVsbCl9LG4uaW5pdD1mdW5jdGlvbih0KXtvJiYobi5kZXN0cm95KCksZT1jKHIsdHx8e30pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixwLCExKSl9LG59KTs="}},"time_used":569,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":569,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/7.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.542Z","timestamp":1785147795542,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/7.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1407\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1407,"size_decoded":1881,"mime_type":"image/png","magic":"PNG image data, 55 x 47, 8-bit colormap, non-interlaced","md5":"50a1479dd71df2d50ed3de44bdcc4cfd","sha1":"1bee1d63dbdf30dc4f463466288eb541fc2d82e3","sha256":"773ec5413104c31d948141fee0ee4016b9ab7b3805087a5a82f2e8897cb3773d","sha512":"93da3e219b68be450b60a5d05b170add30f8c1f2c6135796628d1e03637861174aa20acd90e23e6c9432632520a0d3b4833801ad40020be4bfe0806b98607c5c","ssdeep":"","tlshash":"5e21679303407c9d8d5d75a79494e71197d3bf092dd54261720a78539ffa2211b60495","first_seen":"2025-05-31T01:51:37.472932Z","last_seen":"2026-08-11T00:25:55.260533Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAADcAAAAvCAMAAABwgKKCAAAB/lBMVEX////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Jr2U3AAAAqXRSTlMAAQIDBAUGBwkKCwwNDg8REhUXGBkaGxweHyIjJCUnKCkrLC0vMDIzNDg5Ojs9P0BBQkNFRkdJSktOT1JTVFVYWVtcXV9gYmNlZmdsb3Bxc3d4eXp7fH6AgYKHiImOkJKTlJaXmJmcn6Gio6SlqaqsrrCys7S1tre6u73Aw8XGx8nMzs/Q0dLT1dbX2N3e3+Hk5ebn6Onq7e7v8PHy8/T19vf4+fr7/P3+PuvbagAAAodJREFUSImVlndbE0EQxjeFGAGRiA0TERAbVoKKYIldLCQiiFEUGxZEAUURRUUUERAFLIBRDBJMbr6luzeX3F0ue+X9I5nZe3/P3M6WhJDMcoaureQ80lUTwHMTNtvBgF2ZZ30DGDXBHQFoz1LkB4BqqzF3itq63XLey7h+myHnaKO+viXJ1CswDs4YF7Rdp74Bj5Q1ixj89hmDJEyNgy4xdP1ADt4tNgHW0ZcrFKMAJNWhM8XcnveNK1hweOgqjrxMcXCbDx6jj+NPapzJPK9CkDlo5YK+adEwecnBst2vEqDSfRcPXHp2UHQcp3GDAOnqy+fPcdOdCEAlIdUaiurzZj5Isg/56eeHTBzMB+06JNXqjBh7Vy+xFaonWhI6L2o7jbfxOJgLD8DsvXIZy4lIT+LFhJRyOUkjweRWzP8rDSUo5/huBMJ8+xoEd1xpFlXFkkZDDuDPXm1jXD06wNBH/I6WaMEWHW4fKb87y4JnGsw9w8fG2SLmttEo4UnnTuiUa8L9EaXhznTuNR/7h/ep/ReN/WnYep1yXWjxs7gojbupw0nd76BhfC6swrIjfOwLbu1lMTFbUHEndco1oKUeM/VKvJVt0ZnxaeWaLBRgV8YwrVFia8WhqccX9hTj/WcvKNtf/2CYXRwxPAtViE04lZxPgPiNLdoj+gnNI8GygLTv1W0htd0BDUR1Tj3TSYiuymTTqqIzLmNdzl3rzGEUlLlHZq5+SZ6v2NOfE52V5ilie5qh+SZUh1irRWwjbq1RCxNjysPli22wwORcrD0tXSohK7Ueptrfa/wfQdbRFDa13Eq5sSQmVFvBSFEL/qTCLUsY1aLAC3qKht3GTo28l9+Uakf/A7rEW5IUf61gAAAAAElFTkSuQmCC"}},"time_used":346,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":344,"receive":2,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/2.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.546Z","timestamp":1785147795546,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/2.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16776\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16776,"size_decoded":17251,"mime_type":"image/png","magic":"PNG image data, 145 x 40, 8-bit/color RGBA, non-interlaced","md5":"29e54ea1835e2dae29ee8daf178d9918","sha1":"429f812df37bd45e61af9a2500d8f9a16f728232","sha256":"a9d1a7d67f90aa8708c44ec6f539b1e1ce35b7fc8fdf7f971b374584cd69cb8c","sha512":"02169eef8ba259fbcb9c29dffe544dff77f40866379abd088b8f00891a41918c99dd8d3f66d6ac8301e548c9071a8730be8158ebf43801100660e01c947b32dc","ssdeep":"96:nSmkEWRrNNN7xNX1qhqWqcqRsc5LshqvO6bLl/xSJuTnul9CW5gvVJf5y0:nSmkthn9HqhqWqcqahqvOGdxSJual9u","tlshash":"2f721856fdf235e1a86ad2319ce5081d5d6309439ac2ac85fecc0d8a3f11bdd0c1f692","first_seen":"2025-05-31T01:51:37.475835Z","last_seen":"2026-08-11T00:25:55.265193Z","times_seen":25,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAJEAAAAoCAYAAAD+HRieAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4JWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNTo1MiswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjU6NTIrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6ZmRjYmY0MWQtYTBmNi0xYjQxLWFkZWUtOWRjYTExNDc3OWZiPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmZkY2JmNDFkLWEwZjYtMWI0MS1hZGVlLTlkY2ExMTQ3NzlmYjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmZkY2JmNDFkLWEwZjYtMWI0MS1hZGVlLTlkY2ExMTQ3NzlmYjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpmZGNiZjQxZC1hMGY2LTFiNDEtYWRlZS05ZGNhMTE0Nzc5ZmI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTQ1PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4c2dykAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAjdSURBVHja7Jx/kNVVFcA/77GwuIg4/FhAEl3WMZJVMCAtdSeo0dFKCIOtaRrC8gcpkUiFJqA0ljNgqZFWBk1TE2YhWtLYmFD8CIiMiBVCAVHG/UHgIj8Wll339Mc73/F45vve+759+5bdt+/M3Hn3e+65P773nnt+3ft9MRGhjVAOTALGAueZBFAD1GraDPwBeJ0C5CXEMmSiUuBO4LNARYZ9VQOrgMeAQ4Wp735MdDZwNzBX89nAMWAx8EPgeGEJugcTTQEeBwa3c98HgduAZwvL0LUhnorBgIXA73PAQIFqfAaYX1iG/JREZwG/BKZ20Dh+B0wHThaWJD+YKAb8tgMZyDLStMKS5Ic6W3AGGAjts6Da8kASTVEbKHaGxiM6hoKx3UWZ6GxgTwQj+giwG3gbOOx+e2g7/YFLgNHA0DZ4beUd7P4vAsYBI4GngHu7IS/M1g38KjALOBV964sEaaFEg5+aOlHSlSLypIi0SHSYn2Ef2aQRru8bO7DvzpK+7Obg9kzqx427PTdHHL4ZuAUYrxIsCnwTGNhBO/Bqp043dEMp9An3fKIthvUsso9Ep4NtQCWwIwJtX+DrHTSBV5n8TlXL3Q2eBVo0/4Kq9IyZaHKWg1gNNKgds12N82uT2DtTgdMR2pxyBiTRum5qG68EhgMjgOuB5kwqF6kRW5HlIC4AztX8ZZpuAp4DPu+MtN0kzs2+nabNUUAZ7X/6f7VKxBJl+g+ZsvUhm+yTwARVrzXAX0LoLJylCzEa6KO4d4C/qmoPW6CJwHXAIN2MzwNrU8z1JF2zvkA9sFE3cqOhO0837KXq8OzU+N+b3rkCPq28AHBUHaUA+gNXajvvAk0qrf9McJAuInMkMwgzrKtT0D8YQv/BiH3NbkfjcYaI7EzT3/mGfpSIbEtCt0pEern24yJyl4gcSdH+MRG5wNQZJyJrktAudO33UlxTEvrJhvZuEWkMoWkWka+6dsc7mrGKj4nIFhFpTdJfg4hMEBEQkd/kmIlOi0hZSJ3/RuhrRTswT0xEFkfoa7+pUyEih9LQLzb0PSLOY5OI9NY6E0TkVAraFhEZrrTFIrIpBe0bOgZEZEmaMbwrIpebsd9lyo6adkZFeJ+3RCQezyCOc0DF8b6Qsj3AKyY1mbKewEdC6uyK0OfQdlBfi5znuQuYA8zQmFcAG4w6Wg0M0OfDauRXOe/yVmNT3gN8wZT9U/u8Hvi3wW9V1X6ZGrPFil+m3msFUKe4Hsbo/5GqlABWAJ/R8q8BM1XVVJG4smPfaRJwh1GjceArhuYak9+k7Xh8i77vF4EtTmVegYjsjiiB5mWw+71kWhBC80SEPl/NUgoNc2J9vYgUaVmJi13dpvj7nOS41LQ3xY1vsIgMdBJlhVN1B0zZ9xT3nMH9IMXc3aRxNgvfSvKuvUWkxtBVu3H8ypS9ZPAHDf47Bm8l6xqDn+jGc12c96605hKGh+BOdIAkukclSyBRphlXdqzudi+Jbja4n7uQxH7X/mDd/YFEOQl8w3if5cAHnOF+oRqyAK3A99VA/hSJQ+hRWnYcWOMk3OvAkiTvOtHN10znBb9l8iX6O1KN+TDHotLk/2byvV2/tUUaYMs1hB1hDIp4lpYNXOtUQK15tir2bfVeRqhHGMAzrr0L3XOdMqNVY/Xm+eMm36pe1AyjBmNqJhS7dpuVmRuAGwx+i7aT7l0btS8L55j86ZDwRhPwD82XAcNCNhjAGHcEVl2kE9s3woJU6S5ZCyx3ZfOdRPPSbX9Ie0Mi9FmbJROdb/KvuLLxJr9RGbbU0bzhnkebfL3GvfoY3FFHb5lou5YPd+51sZPOq4H7gNcUVxyy+GHQ39l9ntkqHTN6u2erCcVUOntoc5K42kagtUhjHxdHWJAxmhpDmKjKiOEwWBsSf7k8Qp817SgN+7hnK4n2mkVNtjAD1EAN4Gn9bXCMOVDjJ2Ua+/GBzBaDe0cPPv+n6qbaGLZh0jjVUVAshQS/0a3PH0OYaH0SY/tfxvSIAx/zdeLtvFBhsEF3oYUrIqqzbMdmJck01edx4HanthrMsUerqxMcwywzHlsziY8NfJS7VL3XXerJhdkbrxlcP2WkP+kciQY/7T2vHU5l3WAWtMyoqR1uw48ztt+TpuxFHcswNwfrkkgtq8oqdMzvf6ccBxuPiMjIEPqfRexrTpbe2eOuvUPOgwngEVNnnSs7ICInHW6mixG9FOFdSo3HeMKVvSki+zQYKW7Opoe0VW/GdIvSfdgFBptFZK+rVyci5Upf5WJS5yh+SIog5h0G3xh4f2ijuWCilSZYhgvkRb0WUp4lEw3RiUsH61w0/ViKQN39SdzreSLydw1LrHRzssvR35xmDiod/bIUtPcauiVpApJjDO1SU/aywU919QaashVhbn+R2gPVWZ6fPa2isY7Epabtqks9nAv82rnWyaDa2CpthTq1Ux5S+6SnusmPqlr5saq8Te5s7xISX7pcpWdVNXoL4UEXPAzglPbxkD730nkIYJWjX67ls3XeB6gB/R/1kPY4+lv1zO5OtV/7qQre6tzvuWoEz1K6En2fF3Rsjc6zet4cwGIM+Rc1v4/3f2h6WMtEwx8E6gwR+W6WkihKGqo7NSos6gKXuS7WC12DDW6QiDzljn0uyudLbXETVs/VddTeasjuBD6aQVxpaRe4QrEA+IWGImp019aqtxrAoyGSJa8gYKKDKSKhHkrUI4ilcDUvUs/mJ6pSnjBXRaLAEh1TZ4b+vPdVTEyjxQOcql4OzCPPoS0X9W0s4pi6qEfV3uinzFKcxZjqlQk7+3f6PYEvkbhvdI3OX0yj39vU3lpDN4DO+MnQ50KOGwrQBdSZPSt64AyO54ECA3V9SRTo9zP1GXUVHXMgXIAcSqJApUzXRe1IBppeYKD8YSJI3IupAu7P8cKK9lFF4R9B8kqdecjVn1zVk7jaWbCBugETBe5/e/3d3nEScaCHKfzdXrdiogBKSZzLTKbtf/y5lM4fSCxADpnIQrq/IA7SyyQ+YtxbmO78hP8PAHCFYuxRmvTkAAAAAElFTkSuQmCC"}},"time_used":698,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":390,"receive":308,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/jquery-ui.min.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.268Z","timestamp":1785147795268,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/jquery-ui.min.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 7095\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":31083,"size_decoded":7632,"mime_type":"text/css","magic":"ASCII text, with very long lines (29471)","md5":"0ee9323c5306c2fa8087721b0c2d9812","sha1":"65fe09359265b3949bf855c6cd434235c00f5aff","sha256":"fc1ef4412b2caeb52e8235f3eb028714dd5fa5172bd820838d9dd83ec72a730f","sha512":"459e8199a483d924e33b7ce0adf0b01a5ab61fafb9a4b400f7214b5dded9de45e9f8aba7c9c94073d569079c1d44ac4d7875e1844ebf510223873b0d7630e909","ssdeep":"384:UCREnR8lOXH51egBMzymUh+466G0Og6Sc7nfZBhVtQ:UhjXH9BMznUR66G0OgeBhY","tlshash":"52d24330e4c2253dfe33d13061e11ef4523bc142eda25fbda09af65952e98e4857b9b1","first_seen":"2025-06-25T11:59:30.653097Z","last_seen":"2026-08-11T00:25:55.164798Z","times_seen":21,"resource_available":false,"data":"LyohIGpRdWVyeSBVSSAtIHYxLjEyLjEgLSAyMDE3LTA4LTIwCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBkcmFnZ2FibGUuY3NzLCBjb3JlLmNzcywgcmVzaXphYmxlLmNzcywgc2VsZWN0YWJsZS5jc3MsIHNvcnRhYmxlLmNzcywgYWNjb3JkaW9uLmNzcywgYXV0b2NvbXBsZXRlLmNzcywgbWVudS5jc3MsIGJ1dHRvbi5jc3MsIGNvbnRyb2xncm91cC5jc3MsIGNoZWNrYm94cmFkaW8uY3NzLCBkYXRlcGlja2VyLmNzcywgZGlhbG9nLmNzcywgcHJvZ3Jlc3NiYXIuY3NzLCBzZWxlY3RtZW51LmNzcywgc2xpZGVyLmNzcywgc3Bpbm5lci5jc3MsIHRhYnMuY3NzLCB0b29sdGlwLmNzcywgdGhlbWUuY3NzCiogVG8gdmlldyBhbmQgbW9kaWZ5IHRoaXMgdGhlbWUsIHZpc2l0IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvP3Njb3BlPSZmb2xkZXJOYW1lPWJhc2UmY29ybmVyUmFkaXVzU2hhZG93PThweCZvZmZzZXRMZWZ0U2hhZG93PTBweCZvZmZzZXRUb3BTaGFkb3c9MHB4JnRoaWNrbmVzc1NoYWRvdz01cHgmb3BhY2l0eVNoYWRvdz0zMCZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZiZ1RleHR1cmVTaGFkb3c9ZmxhdCZiZ0NvbG9yU2hhZG93PTY2NjY2NiZvcGFjaXR5T3ZlcmxheT0zMCZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmYmdUZXh0dXJlT3ZlcmxheT1mbGF0JmJnQ29sb3JPdmVybGF5PWFhYWFhYSZpY29uQ29sb3JFcnJvcj1jYzAwMDAmZmNFcnJvcj01ZjNmM2YmYm9yZGVyQ29sb3JFcnJvcj1mMWE4OTkmYmdUZXh0dXJlRXJyb3I9ZmxhdCZiZ0NvbG9yRXJyb3I9ZmRkZmRmJmljb25Db2xvckhpZ2hsaWdodD03Nzc2MjAmZmNIaWdobGlnaHQ9Nzc3NjIwJmJvcmRlckNvbG9ySGlnaGxpZ2h0PWRhZDU1ZSZiZ1RleHR1cmVIaWdobGlnaHQ9ZmxhdCZiZ0NvbG9ySGlnaGxpZ2h0PWZmZmE5MCZpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmZjQWN0aXZlPWZmZmZmZiZib3JkZXJDb2xvckFjdGl2ZT0wMDNlZmYmYmdUZXh0dXJlQWN0aXZlPWZsYXQmYmdDb2xvckFjdGl2ZT0wMDdmZmYmaWNvbkNvbG9ySG92ZXI9NTU1NTU1JmZjSG92ZXI9MmIyYjJiJmJvcmRlckNvbG9ySG92ZXI9Y2NjY2NjJmJnVGV4dHVyZUhvdmVyPWZsYXQmYmdDb2xvckhvdmVyPWVkZWRlZCZpY29uQ29sb3JEZWZhdWx0PTc3Nzc3NyZmY0RlZmF1bHQ9NDU0NTQ1JmJvcmRlckNvbG9yRGVmYXVsdD1jNWM1YzUmYmdUZXh0dXJlRGVmYXVsdD1mbGF0JmJnQ29sb3JEZWZhdWx0PWY2ZjZmNiZpY29uQ29sb3JDb250ZW50PTQ0NDQ0NCZmY0NvbnRlbnQ9MzMzMzMzJmJvcmRlckNvbG9yQ29udGVudD1kZGRkZGQmYmdUZXh0dXJlQ29udGVudD1mbGF0JmJnQ29sb3JDb250ZW50PWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9NDQ0NDQ0JmZjSGVhZGVyPTMzMzMzMyZib3JkZXJDb2xvckhlYWRlcj1kZGRkZGQmYmdUZXh0dXJlSGVhZGVyPWZsYXQmYmdDb2xvckhlYWRlcj1lOWU5ZTkmY29ybmVyUmFkaXVzPTNweCZmd0RlZmF1bHQ9bm9ybWFsJmZzRGVmYXVsdD0xZW0mZmZEZWZhdWx0PUFyaWFsJTJDSGVsdmV0aWNhJTJDc2Fucy1zZXJpZgoqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCi51aS1kcmFnZ2FibGUtaGFuZGxley1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktaGVscGVyLWhpZGRlbntkaXNwbGF5Om5vbmV9LnVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweH0udWktaGVscGVyLXJlc2V0e21hcmdpbjowO3BhZGRpbmc6MDtib3JkZXI6MDtvdXRsaW5lOjA7bGluZS1oZWlnaHQ6MS4zO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMDAlO2xpc3Qtc3R5bGU6bm9uZX0udWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwudWktaGVscGVyLWNsZWFyZml4OmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9LnVpLWhlbHBlci1jbGVhcmZpeDphZnRlcntjbGVhcjpib3RofS51aS1oZWxwZXItemZpeHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MCl9LnVpLWZyb250e3otaW5kZXg6MTAwfS51aS1zdGF0ZS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX0udWktaWNvbntkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLXRvcDotLjI1ZW07cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTk5cHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0udWktd2lkZ2V0LWljb24tYmxvY2t7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweDtkaXNwbGF5OmJsb2NrfS51aS13aWRnZXQtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udWktcmVzaXphYmxle3Bvc2l0aW9uOnJlbGF0aXZlfS51aS1yZXNpemFibGUtaGFuZGxle3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtc2l6ZTowLjFweDtkaXNwbGF5OmJsb2NrOy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGV7ZGlzcGxheTpub25lfS51aS1yZXNpemFibGUtbntjdXJzb3I6bi1yZXNpemU7aGVpZ2h0OjdweDt3aWR0aDoxMDAlO3RvcDotNXB4O2xlZnQ6MH0udWktcmVzaXphYmxlLXN7Y3Vyc29yOnMtcmVzaXplO2hlaWdodDo3cHg7d2lkdGg6MTAwJTtib3R0b206LTVweDtsZWZ0OjB9LnVpLXJlc2l6YWJsZS1le2N1cnNvcjplLXJlc2l6ZTt3aWR0aDo3cHg7cmlnaHQ6LTVweDt0b3A6MDtoZWlnaHQ6MTAwJX0udWktcmVzaXphYmxlLXd7Y3Vyc29yOnctcmVzaXplO3dpZHRoOjdweDtsZWZ0Oi01cHg7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXJlc2l6YWJsZS1zZXtjdXJzb3I6c2UtcmVzaXplO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7cmlnaHQ6MXB4O2JvdHRvbToxcHh9LnVpLXJlc2l6YWJsZS1zd3tjdXJzb3I6c3ctcmVzaXplO3dpZHRoOjlweDtoZWlnaHQ6OXB4O2xlZnQ6LTVweDtib3R0b206LTVweH0udWktcmVzaXphYmxlLW53e2N1cnNvcjpudy1yZXNpemU7d2lkdGg6OXB4O2hlaWdodDo5cHg7bGVmdDotNXB4O3RvcDotNXB4fS51aS1yZXNpemFibGUtbmV7Y3Vyc29yOm5lLXJlc2l6ZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtyaWdodDotNXB4O3RvcDotNXB4fS51aS1zZWxlY3RhYmxley1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2VsZWN0YWJsZS1oZWxwZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDA7Ym9yZGVyOjFweCBkb3R0ZWQgYmxhY2t9LnVpLXNvcnRhYmxlLWhhbmRsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWhlYWRlcntkaXNwbGF5OmJsb2NrO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjoycHggMCAwIDA7cGFkZGluZzouNWVtIC41ZW0gLjVlbSAuN2VtO2ZvbnQtc2l6ZToxMDAlfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1jb250ZW50e3BhZGRpbmc6MWVtIDIuMmVtO2JvcmRlci10b3A6MDtvdmVyZmxvdzphdXRvfS51aS1hdXRvY29tcGxldGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2N1cnNvcjpkZWZhdWx0fS51aS1tZW51e2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjA7ZGlzcGxheTpibG9jaztvdXRsaW5lOjB9LnVpLW1lbnUgLnVpLW1lbnV7cG9zaXRpb246YWJzb2x1dGV9LnVpLW1lbnUgLnVpLW1lbnUtaXRlbXttYXJnaW46MDtjdXJzb3I6cG9pbnRlcjtsaXN0LXN0eWxlLWltYWdlOnVybCgiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3Iil9LnVpLW1lbnUgLnVpLW1lbnUtaXRlbS13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6M3B4IDFlbSAzcHggLjRlbX0udWktbWVudSAudWktbWVudS1kaXZpZGVye21hcmdpbjo1cHggMDtoZWlnaHQ6MDtmb250LXNpemU6MDtsaW5lLWhlaWdodDowO2JvcmRlci13aWR0aDoxcHggMCAwIDB9LnVpLW1lbnUgLnVpLXN0YXRlLWZvY3VzLC51aS1tZW51IC51aS1zdGF0ZS1hY3RpdmV7bWFyZ2luOi0xcHh9LnVpLW1lbnUtaWNvbnN7cG9zaXRpb246cmVsYXRpdmV9LnVpLW1lbnUtaWNvbnMgLnVpLW1lbnUtaXRlbS13cmFwcGVye3BhZGRpbmctbGVmdDoyZW19LnVpLW1lbnUgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDouMmVtO21hcmdpbjphdXRvIDB9LnVpLW1lbnUgLnVpLW1lbnUtaWNvbntsZWZ0OmF1dG87cmlnaHQ6MH0udWktYnV0dG9ue3BhZGRpbmc6LjRlbSAxZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7bGluZS1oZWlnaHQ6bm9ybWFsO21hcmdpbi1yaWdodDouMWVtO2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7b3ZlcmZsb3c6dmlzaWJsZX0udWktYnV0dG9uLC51aS1idXR0b246bGluaywudWktYnV0dG9uOnZpc2l0ZWQsLnVpLWJ1dHRvbjpob3ZlciwudWktYnV0dG9uOmFjdGl2ZXt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktYnV0dG9uLWljb24tb25seXt3aWR0aDoyZW07Ym94LXNpemluZzpib3JkZXItYm94O3RleHQtaW5kZW50Oi05OTk5cHg7d2hpdGUtc3BhY2U6bm93cmFwfWlucHV0LnVpLWJ1dHRvbi51aS1idXR0b24taWNvbi1vbmx5e3RleHQtaW5kZW50OjB9LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW4tdG9wOi04cHg7bWFyZ2luLWxlZnQ6LThweH0udWktYnV0dG9uLnVpLWljb24tbm90ZXh0IC51aS1pY29ue3BhZGRpbmc6MDt3aWR0aDoyLjFlbTtoZWlnaHQ6Mi4xZW07dGV4dC1pbmRlbnQ6LTk5OTlweDt3aGl0ZS1zcGFjZTpub3dyYXB9aW5wdXQudWktYnV0dG9uLnVpLWljb24tbm90ZXh0IC51aS1pY29ue3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87dGV4dC1pbmRlbnQ6MDt3aGl0ZS1zcGFjZTpub3JtYWw7cGFkZGluZzouNGVtIDFlbX1pbnB1dC51aS1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsYnV0dG9uLnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MDtwYWRkaW5nOjB9LnVpLWNvbnRyb2xncm91cHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLWNvbnRyb2xncm91cCA+IC51aS1jb250cm9sZ3JvdXAtaXRlbXtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9LnVpLWNvbnRyb2xncm91cCA+IC51aS1jb250cm9sZ3JvdXAtaXRlbTpmb2N1cywudWktY29udHJvbGdyb3VwID4gLnVpLWNvbnRyb2xncm91cC1pdGVtLnVpLXZpc3VhbC1mb2N1c3t6LWluZGV4Ojk5OTl9LnVpLWNvbnRyb2xncm91cC12ZXJ0aWNhbCA+IC51aS1jb250cm9sZ3JvdXAtaXRlbXtkaXNwbGF5OmJsb2NrO2Zsb2F0Om5vbmU7d2lkdGg6MTAwJTttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO3RleHQtYWxpZ246bGVmdH0udWktY29udHJvbGdyb3VwLXZlcnRpY2FsIC51aS1jb250cm9sZ3JvdXAtaXRlbXtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnVpLWNvbnRyb2xncm91cCAudWktY29udHJvbGdyb3VwLWxhYmVse3BhZGRpbmc6LjRlbSAxZW19LnVpLWNvbnRyb2xncm91cCAudWktY29udHJvbGdyb3VwLWxhYmVsIHNwYW57Zm9udC1zaXplOjgwJX0udWktY29udHJvbGdyb3VwLWhvcml6b250YWwgLnVpLWNvbnRyb2xncm91cC1sYWJlbCArIC51aS1jb250cm9sZ3JvdXAtaXRlbXtib3JkZXItbGVmdDpub25lfS51aS1jb250cm9sZ3JvdXAtdmVydGljYWwgLnVpLWNvbnRyb2xncm91cC1sYWJlbCArIC51aS1jb250cm9sZ3JvdXAtaXRlbXtib3JkZXItdG9wOm5vbmV9LnVpLWNvbnRyb2xncm91cC1ob3Jpem9udGFsIC51aS1jb250cm9sZ3JvdXAtbGFiZWwudWktd2lkZ2V0LWNvbnRlbnR7Ym9yZGVyLXJpZ2h0Om5vbmV9LnVpLWNvbnRyb2xncm91cC12ZXJ0aWNhbCAudWktY29udHJvbGdyb3VwLWxhYmVsLnVpLXdpZGdldC1jb250ZW50e2JvcmRlci1ib3R0b206bm9uZX0udWktY29udHJvbGdyb3VwLXZlcnRpY2FsIC51aS1zcGlubmVyLWlucHV0e3dpZHRoOjc1JTt3aWR0aDpjYWxjKCAxMDAlIC0gMi40ZW0gKX0udWktY29udHJvbGdyb3VwLXZlcnRpY2FsIC51aS1zcGlubmVyIC51aS1zcGlubmVyLXVwe2JvcmRlci10b3Atc3R5bGU6c29saWR9LnVpLWNoZWNrYm94cmFkaW8tbGFiZWwgLnVpLWljb24tYmFja2dyb3VuZHtib3gtc2hhZG93Omluc2V0IDFweCAxcHggMXB4ICNjY2M7Ym9yZGVyLXJhZGl1czouMTJlbTtib3JkZXI6bm9uZX0udWktY2hlY2tib3hyYWRpby1yYWRpby1sYWJlbCAudWktaWNvbi1iYWNrZ3JvdW5ke3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyLXJhZGl1czoxZW07b3ZlcmZsb3c6dmlzaWJsZTtib3JkZXI6bm9uZX0udWktY2hlY2tib3hyYWRpby1yYWRpby1sYWJlbC51aS1jaGVja2JveHJhZGlvLWNoZWNrZWQgLnVpLWljb24sLnVpLWNoZWNrYm94cmFkaW8tcmFkaW8tbGFiZWwudWktY2hlY2tib3hyYWRpby1jaGVja2VkOmhvdmVyIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6bm9uZTt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItd2lkdGg6NHB4O2JvcmRlci1zdHlsZTpzb2xpZH0udWktY2hlY2tib3hyYWRpby1kaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lfS51aS1kYXRlcGlja2Vye3dpZHRoOjE3ZW07cGFkZGluZzouMmVtIC4yZW0gMDtkaXNwbGF5Om5vbmV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItaGVhZGVye3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6LjJlbSAwfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYsLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MnB4O3dpZHRoOjEuOGVtO2hlaWdodDoxLjhlbX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyLC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXJ7dG9wOjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2e2xlZnQ6MnB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHR7cmlnaHQ6MnB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXJ7bGVmdDoxcHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlcntyaWdodDoxcHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiBzcGFuLC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQgc3BhbntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi04cHg7dG9wOjUwJTttYXJnaW4tdG9wOi04cHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGV7bWFyZ2luOjAgMi4zZW07bGluZS1oZWlnaHQ6MS44ZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGUgc2VsZWN0e2ZvbnQtc2l6ZToxZW07bWFyZ2luOjFweCAwfS51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLC51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJ7d2lkdGg6NDUlfS51aS1kYXRlcGlja2VyIHRhYmxle3dpZHRoOjEwMCU7Zm9udC1zaXplOi45ZW07Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbjowIDAgLjRlbX0udWktZGF0ZXBpY2tlciB0aHtwYWRkaW5nOi43ZW0gLjNlbTt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkO2JvcmRlcjowfS51aS1kYXRlcGlja2VyIHRke2JvcmRlcjowO3BhZGRpbmc6MXB4fS51aS1kYXRlcGlja2VyIHRkIHNwYW4sLnVpLWRhdGVwaWNrZXIgdGQgYXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6LjJlbTt0ZXh0LWFsaWduOnJpZ2h0O3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmV7YmFja2dyb3VuZC1pbWFnZTpub25lO21hcmdpbjouN2VtIDAgMCAwO3BhZGRpbmc6MCAuMmVtO2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbTowfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9ue2Zsb2F0OnJpZ2h0O21hcmdpbjouNWVtIC4yZW0gLjRlbTtjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOi4yZW0gLjZlbSAuM2VtIC42ZW07d2lkdGg6YXV0bztvdmVyZmxvdzp2aXNpYmxlfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudHtmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLnVpLWRhdGVwaWNrZXItbXVsdGl7d2lkdGg6YXV0b30udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cHtmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwIHRhYmxle3dpZHRoOjk1JTttYXJnaW46MCBhdXRvIC40ZW19LnVpLWRhdGVwaWNrZXItbXVsdGktMiAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDo1MCV9LnVpLWRhdGVwaWNrZXItbXVsdGktMyAudWktZGF0ZXBpY2tlci1ncm91cHt3aWR0aDozMy4zJX0udWktZGF0ZXBpY2tlci1tdWx0aS00IC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjI1JX0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVye2JvcmRlci1sZWZ0LXdpZHRoOjB9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtjbGVhcjpsZWZ0fS51aS1kYXRlcGlja2VyLXJvdy1icmVha3tjbGVhcjpib3RoO3dpZHRoOjEwMCU7Zm9udC1zaXplOjB9LnVpLWRhdGVwaWNrZXItcnRse2RpcmVjdGlvbjpydGx9LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXZ7cmlnaHQ6MnB4O2xlZnQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dHtsZWZ0OjJweDtyaWdodDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2OmhvdmVye3JpZ2h0OjFweDtsZWZ0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHQ6aG92ZXJ7bGVmdDoxcHg7cmlnaHQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtjbGVhcjpyaWdodH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b257ZmxvYXQ6bGVmdH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50LC51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cHtmbG9hdDpyaWdodH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCAudWktZGF0ZXBpY2tlci1oZWFkZXIsLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXJ7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4fS51aS1kYXRlcGlja2VyIC51aS1pY29ue2Rpc3BsYXk6YmxvY2s7dGV4dC1pbmRlbnQ6LTk5OTk5cHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtsZWZ0Oi41ZW07dG9wOi4zZW19LnVpLWRpYWxvZ3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cGFkZGluZzouMmVtO291dGxpbmU6MH0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXJ7cGFkZGluZzouNGVtIDFlbTtwb3NpdGlvbjpyZWxhdGl2ZX0udWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGV7ZmxvYXQ6bGVmdDttYXJnaW46LjFlbSAwO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDo5MCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi4zZW07dG9wOjUwJTt3aWR0aDoyMHB4O21hcmdpbjotMTBweCAwIDAgMDtwYWRkaW5nOjFweDtoZWlnaHQ6MjBweH0udWktZGlhbG9nIC51aS1kaWFsb2ctY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXI6MDtwYWRkaW5nOi41ZW0gMWVtO2JhY2tncm91bmQ6bm9uZTtvdmVyZmxvdzphdXRvfS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5le3RleHQtYWxpZ246bGVmdDtib3JkZXItd2lkdGg6MXB4IDAgMCAwO2JhY2tncm91bmQtaW1hZ2U6bm9uZTttYXJnaW4tdG9wOi41ZW07cGFkZGluZzouM2VtIDFlbSAuNWVtIC40ZW19LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgLnVpLWRpYWxvZy1idXR0b25zZXR7ZmxvYXQ6cmlnaHR9LnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9ue21hcmdpbjouNWVtIC40ZW0gLjVlbSAwO2N1cnNvcjpwb2ludGVyfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1ue2hlaWdodDoycHg7dG9wOjB9LnVpLWRpYWxvZyAudWktcmVzaXphYmxlLWV7d2lkdGg6MnB4O3JpZ2h0OjB9LnVpLWRpYWxvZyAudWktcmVzaXphYmxlLXN7aGVpZ2h0OjJweDtib3R0b206MH0udWktZGlhbG9nIC51aS1yZXNpemFibGUtd3t3aWR0aDoycHg7bGVmdDowfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZSwudWktZGlhbG9nIC51aS1yZXNpemFibGUtc3csLnVpLWRpYWxvZyAudWktcmVzaXphYmxlLW5lLC51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1ud3t3aWR0aDo3cHg7aGVpZ2h0OjdweH0udWktZGlhbG9nIC51aS1yZXNpemFibGUtc2V7cmlnaHQ6MDtib3R0b206MH0udWktZGlhbG9nIC51aS1yZXNpemFibGUtc3d7bGVmdDowO2JvdHRvbTowfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1uZXtyaWdodDowO3RvcDowfS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1ud3tsZWZ0OjA7dG9wOjB9LnVpLWRyYWdnYWJsZSAudWktZGlhbG9nLXRpdGxlYmFye2N1cnNvcjptb3ZlfS51aS1wcm9ncmVzc2JhcntoZWlnaHQ6MmVtO3RleHQtYWxpZ246bGVmdDtvdmVyZmxvdzpoaWRkZW59LnVpLXByb2dyZXNzYmFyIC51aS1wcm9ncmVzc2Jhci12YWx1ZXttYXJnaW46LTFweDtoZWlnaHQ6MTAwJX0udWktcHJvZ3Jlc3NiYXIgLnVpLXByb2dyZXNzYmFyLW92ZXJsYXl7YmFja2dyb3VuZDp1cmwoImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEtBQW9BSUFCQUFBQUFQLy8veUgvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRSkFRQUJBQ3dBQUFBQUtBQW9BQUFDa1l3TnFYcmRDNTJEUzA2YTdNRlpJKzRGSEJDS29EZVdLWHF5bVBxR3F4dkpyWFpiTXg3VHRjK3c5WGdVMkZCM2xPeVFSV0VUMklGR2lVOW0xZnJEVnB4WlpjNmJmSHd2NGMxWVhQNmsxVmR5MjkyRmI2VWt1dkZ0WHB2V1N6QStIeWNYSkhVWGlHWUlpTWcyUjZXNDU5Z25XR2ZITmRqSXFEV1ZxZW1IMmVrcE9ia3BPbHBwV1VxWmlxcjZlZHFxV1FBQUlma0VDUUVBQVFBc0FBQUFBQ2dBS0FBQUFwU01nWm5HZmFxY2cxRTJ1dXpEbW1IVUJSOFFpbDk1aGlQS3FXbjNhcXRMc1MxOHk3RzFTek5lb3dXQkVOdFFkK1QxSmt0UDA1bnpQVGRKWmxSNnZVeE5XV2pWK3ZVV2hXTmtXRnd4bDlWcFpSZWRZY2ZsSU9MYWZhYTI4WGRzSC95bmxjYzF1UFZEWnhRSVIwSzI1K2NJQ0Ntb3FDZTVtR2haT2ZlWVNVaDV5SmNKeXJrWldXcGFSOGRvSjJvNE5ZcTYybEFBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLVkRJNFl5MjJabklOUk5xb3N3MEJ2N2kxZ3lIVWtGajdvU2FXbHUzb3ZDOEd4TnNvNWZsdXozcUxWaEJWZVQvTHo3WlRIeXhMNWREYWxRV1BWT3NRV3RSbnV3WGFGVGo5alZWaDhwbWE5SmpaNHpZU2o1Wk95bWE3dXVvbGZmaCtJUjVhVzk3Y0h1QlVYS0dLWGxLam4rRGlIV01jWUphaDROMGxZQ01sSk9YaXBHUnI1cWRnb1NUcnFXU3E2V0ZsMnlwb2FVQUFBSWZrRUNRRUFBUUFzQUFBQUFDZ0FLQUFBQXBhRWI2SExnZC9pTzdGTld0Y0ZXZSt1Zk9ER2pSZm9pSjJha1NoYnVlYjB3dEk1MHptMDJwYnZ3ZldFTVdCUTF6S0dsTEloc2tpRVBtOVI2dlJYeFY0WnpXVDJ5SE9HcFdNeW9yYmxLbE5wOEhtSEViL2xDWGpjVzdibXRYUDhYdDIyOU9WV1IxZm9kMmVXcU5mSHVNalhDUGtJR05pbGVPaUltVm1DT0Vtb1NmbjN5WGxKV21vSEdocXA2aWxZdVdZcG1UcUtVZ0FBSWZrRUNRRUFBUUFzQUFBQUFDZ0FLQUFBQXBpRUg2a2I1OGJpUTNGTld0TUZXVzNlTlZjb2p1RkdmcW5acVNlYnVTMDZ3NVY4MC9YMDJwS2U4ekZ3UDZFRldPVDFsREZrOHJHRVJoMVRUTk9vY1E2MUhtNFhtMlZleFVIcHpqeW1WaUhyRmJpRUxzZWZWcm42WEtmbnQyUTlHLytYZGllNDk5WEhkMmc0aDdpb09HaFhHSmJvR0FuWFNCbm9Cd0tZeWZpb3ViWkoySG4wUnVSWmFmbFpPaWw1NlpwNmlpb0tTWHBVQUFBaCtRUUpBUUFCQUN3QUFBQUFLQUFvQUFBQ2tvUVJxUnZueHVJN2tVMWExVVU1YmQ1dG5TZU9aWGhtbjVsV0szcU5UV3ZSZFF4UDhxdmFDKy95YVlRelhPN0JNdmFVRW1KUmQzVHNpTUFnc3dtTllyU2daZFlyVFg2dFNIR1pPNzNlenVBdzJ1eHVRK0JiZVpmTXhzZXhZMzUrL1FlNEoxaW5WMGc0eDNXSHVNaElsMmpYT0tUMlErVlU1ZmdvU1VJNTJWZlp5ZmtKR2toYTZqbVkrYWFZZGlycStsUUFBQ0g1QkFrQkFBRUFMQUFBQUFBb0FDZ0FBQUtXQklLcFllMEwzWU5LVG9xc3dVbHZ6bmlnZDR3aVI0S2hackt0OVVwcWlwNjFpOUUzdk12eFJkSGxiRUZpRVhmazlZQVJZeE9aWkQ2VlEycFV1bkJtdFJYbzFMZjhoTVZWY05sOEphZlYzOGFNMi9GdTVWMTZCbjYzcjZ4dDk3ajA5K01YU0ZpNEJuaUdGYWUzaHpiSDkraFlCemtwdVVoNWFabUh1YW5aT1pnSXV2YkdpTmVvbUNuYXh4YXAydXBhQ1pzcSsxa0FBQ0g1QkFrQkFBRUFMQUFBQUFBb0FDZ0FBQUtYakk4Qnk1emY0a094VFZyWE5WbHYxWDBkOElHWkdLTG5OcFl0bThMcjljcVZldU9TdmZPVzc5RDlhREhpek5oREppZEZaaE55ZEVhaE9hREg2bm9tdEpqcDF0dXRLb05Xa3ZBNkpxZlJWTEhVL1FVZmF1OWwyeDdHNTRkMWZsOTk1eGNJR0FkWHFNZkJOYWRvWXJoSCtNZzJLQmxwVnBibHVDaVhtTW5aMlNoNEdCcUorY2tJT3FxSjZMbUtTbGxabXNvcTZ3cFFBQUFoK1FRSkFRQUJBQ3dBQUFBQUtBQW9BQUFDbFl4L29Mdm94dUpEa1UxYTFZVVpiSjU5blNkMlpYaFdxYlJhMi9nRjhHdTJEWTNpcXM3eXJxK3hCWUVrWXZGU004YVNTT2JFK1pnUmwxQkhGWk5yN3BSQ2F2WjVCVzIxNDJoWTNBTi96V3RzbWYxMnA5WHh4RmwybHBMbjFyc2V6dGZYWmpkSVdJZjJzNWRJdHdqWUtCZ285eWc1cEhnekpYVEVlR2xadWVucHlQbXBHUW9LT1drWW1TcGFTbnFLaWxlSTJGQUFBQ0g1QkFrQkFBRUFMQUFBQUFBb0FDZ0FBQUtWakIrZ3Urakc0a09SVFZyVmhSbHNubjJkSjNabGVGYXB0RnJiK0NYbU85T296ZUw1VmZQOTlIdkFXaHBpVWRjd2twQkgzODI1QXdZZFU4eFRxbExHaHRDb3NBcktNcHZmYTFtTVJhZTlWdldaZmVCMlhmUGtlTG1tMThsVWNCaitwNWRuTjhqWFozWUlHRWhZdU9VbjQ1YW9DRGtwMTZobDVJallKdmpXS2Nub0dRcHF5UGxwT2hyM2FFbGFxcnE1NkJxN1ZBQUFPdz09Iik7aGVpZ2h0OjEwMCU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MjUpO29wYWNpdHk6MC4yNX0udWktcHJvZ3Jlc3NiYXItaW5kZXRlcm1pbmF0ZSAudWktcHJvZ3Jlc3NiYXItdmFsdWV7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS1zZWxlY3RtZW51LW1lbnV7cGFkZGluZzowO21hcmdpbjowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtkaXNwbGF5Om5vbmV9LnVpLXNlbGVjdG1lbnUtbWVudSAudWktbWVudXtvdmVyZmxvdzphdXRvO292ZXJmbG93LXg6aGlkZGVuO3BhZGRpbmctYm90dG9tOjFweH0udWktc2VsZWN0bWVudS1tZW51IC51aS1tZW51IC51aS1zZWxlY3RtZW51LW9wdGdyb3Vwe2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxLjU7cGFkZGluZzoycHggMC40ZW07bWFyZ2luOjAuNWVtIDAgMCAwO2hlaWdodDphdXRvO2JvcmRlcjowfS51aS1zZWxlY3RtZW51LW9wZW57ZGlzcGxheTpibG9ja30udWktc2VsZWN0bWVudS10ZXh0e2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXJpZ2h0OjIwcHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LnVpLXNlbGVjdG1lbnUtYnV0dG9uLnVpLWJ1dHRvbnt0ZXh0LWFsaWduOmxlZnQ7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjE0ZW19LnVpLXNlbGVjdG1lbnUtaWNvbi51aS1pY29ue2Zsb2F0OnJpZ2h0O21hcmdpbi10b3A6MH0udWktc2xpZGVye3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246bGVmdH0udWktc2xpZGVyIC51aS1zbGlkZXItaGFuZGxle3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt3aWR0aDoxLjJlbTtoZWlnaHQ6MS4yZW07Y3Vyc29yOmRlZmF1bHQ7LW1zLXRvdWNoLWFjdGlvbjpub25lO3RvdWNoLWFjdGlvbjpub25lfS51aS1zbGlkZXIgLnVpLXNsaWRlci1yYW5nZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7Zm9udC1zaXplOi43ZW07ZGlzcGxheTpibG9jaztib3JkZXI6MDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH0udWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItaGFuZGxlLC51aS1zbGlkZXIudWktc3RhdGUtZGlzYWJsZWQgLnVpLXNsaWRlci1yYW5nZXtmaWx0ZXI6aW5oZXJpdH0udWktc2xpZGVyLWhvcml6b250YWx7aGVpZ2h0Oi44ZW19LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItaGFuZGxle3RvcDotLjNlbTttYXJnaW4tbGVmdDotLjZlbX0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZXt0b3A6MDtoZWlnaHQ6MTAwJX0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1taW57bGVmdDowfS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLXJhbmdlLW1heHtyaWdodDowfS51aS1zbGlkZXItdmVydGljYWx7d2lkdGg6LjhlbTtoZWlnaHQ6MTAwcHh9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLWhhbmRsZXtsZWZ0Oi0uM2VtO21hcmdpbi1sZWZ0OjA7bWFyZ2luLWJvdHRvbTotLjZlbX0udWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2V7bGVmdDowO3dpZHRoOjEwMCV9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1pbntib3R0b206MH0udWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2UtbWF4e3RvcDowfS51aS1zcGlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS1zcGlubmVyLWlucHV0e2JvcmRlcjpub25lO2JhY2tncm91bmQ6bm9uZTtjb2xvcjppbmhlcml0O3BhZGRpbmc6LjIyMmVtIDA7bWFyZ2luOi4yZW0gMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6LjRlbTttYXJnaW4tcmlnaHQ6MmVtfS51aS1zcGlubmVyLWJ1dHRvbnt3aWR0aDoxLjZlbTtoZWlnaHQ6NTAlO2ZvbnQtc2l6ZTouNWVtO3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6ZGVmYXVsdDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtyaWdodDowfS51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b257Ym9yZGVyLXRvcC1zdHlsZTpub25lO2JvcmRlci1ib3R0b20tc3R5bGU6bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX0udWktc3Bpbm5lci11cHt0b3A6MH0udWktc3Bpbm5lci1kb3due2JvdHRvbTowfS51aS10YWJze3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6LjJlbX0udWktdGFicyAudWktdGFicy1uYXZ7bWFyZ2luOjA7cGFkZGluZzouMmVtIC4yZW0gMH0udWktdGFicyAudWktdGFicy1uYXYgbGl7bGlzdC1zdHlsZTpub25lO2Zsb2F0OmxlZnQ7cG9zaXRpb246cmVsYXRpdmU7dG9wOjA7bWFyZ2luOjFweCAuMmVtIDAgMDtib3JkZXItYm90dG9tLXdpZHRoOjA7cGFkZGluZzowO3doaXRlLXNwYWNlOm5vd3JhcH0udWktdGFicyAudWktdGFicy1uYXYgLnVpLXRhYnMtYW5jaG9ye2Zsb2F0OmxlZnQ7cGFkZGluZzouNWVtIDFlbTt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmV7bWFyZ2luLWJvdHRvbTotMXB4O3BhZGRpbmctYm90dG9tOjFweH0udWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgLnVpLXRhYnMtYW5jaG9yLC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1kaXNhYmxlZCAudWktdGFicy1hbmNob3IsLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtbG9hZGluZyAudWktdGFicy1hbmNob3J7Y3Vyc29yOnRleHR9LnVpLXRhYnMtY29sbGFwc2libGUgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIC51aS10YWJzLWFuY2hvcntjdXJzb3I6cG9pbnRlcn0udWktdGFicyAudWktdGFicy1wYW5lbHtkaXNwbGF5OmJsb2NrO2JvcmRlci13aWR0aDowO3BhZGRpbmc6MWVtIDEuNGVtO2JhY2tncm91bmQ6bm9uZX0udWktdG9vbHRpcHtwYWRkaW5nOjhweDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTk7bWF4LXdpZHRoOjMwMHB4fWJvZHkgLnVpLXRvb2x0aXB7Ym9yZGVyLXdpZHRoOjJweH0udWktd2lkZ2V0e2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldCAudWktd2lkZ2V0e2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldCBpbnB1dCwudWktd2lkZ2V0IHNlbGVjdCwudWktd2lkZ2V0IHRleHRhcmVhLC51aS13aWRnZXQgYnV0dG9ue2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxZW19LnVpLXdpZGdldC51aS13aWRnZXQtY29udGVudHtib3JkZXI6MXB4IHNvbGlkICNjNWM1YzV9LnVpLXdpZGdldC1jb250ZW50e2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzMzM30udWktd2lkZ2V0LWNvbnRlbnQgYXtjb2xvcjojMzMzfS51aS13aWRnZXQtaGVhZGVye2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNlOWU5ZTk7Y29sb3I6IzMzMztmb250LXdlaWdodDpib2xkfS51aS13aWRnZXQtaGVhZGVyIGF7Y29sb3I6IzMzM30udWktc3RhdGUtZGVmYXVsdCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHQsLnVpLWJ1dHRvbixodG1sIC51aS1idXR0b24udWktc3RhdGUtZGlzYWJsZWQ6aG92ZXIsaHRtbCAudWktYnV0dG9uLnVpLXN0YXRlLWRpc2FibGVkOmFjdGl2ZXtib3JkZXI6MXB4IHNvbGlkICNjNWM1YzU7YmFja2dyb3VuZDojZjZmNmY2O2ZvbnQtd2VpZ2h0Om5vcm1hbDtjb2xvcjojNDU0NTQ1fS51aS1zdGF0ZS1kZWZhdWx0IGEsLnVpLXN0YXRlLWRlZmF1bHQgYTpsaW5rLC51aS1zdGF0ZS1kZWZhdWx0IGE6dmlzaXRlZCxhLnVpLWJ1dHRvbixhOmxpbmsudWktYnV0dG9uLGE6dmlzaXRlZC51aS1idXR0b24sLnVpLWJ1dHRvbntjb2xvcjojNDU0NTQ1O3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1ob3ZlciwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhvdmVyLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1ob3ZlciwudWktc3RhdGUtZm9jdXMsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1mb2N1cywudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZm9jdXMsLnVpLWJ1dHRvbjpob3ZlciwudWktYnV0dG9uOmZvY3Vze2JvcmRlcjoxcHggc29saWQgI2NjYztiYWNrZ3JvdW5kOiNlZGVkZWQ7Zm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOiMyYjJiMmJ9LnVpLXN0YXRlLWhvdmVyIGEsLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIsLnVpLXN0YXRlLWhvdmVyIGE6bGluaywudWktc3RhdGUtaG92ZXIgYTp2aXNpdGVkLC51aS1zdGF0ZS1mb2N1cyBhLC51aS1zdGF0ZS1mb2N1cyBhOmhvdmVyLC51aS1zdGF0ZS1mb2N1cyBhOmxpbmssLnVpLXN0YXRlLWZvY3VzIGE6dmlzaXRlZCxhLnVpLWJ1dHRvbjpob3ZlcixhLnVpLWJ1dHRvbjpmb2N1c3tjb2xvcjojMmIyYjJiO3RleHQtZGVjb3JhdGlvbjpub25lfS51aS12aXN1YWwtZm9jdXN7Ym94LXNoYWRvdzowIDAgM3B4IDFweCByZ2IoOTQsMTU4LDIxNCl9LnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZlLGEudWktYnV0dG9uOmFjdGl2ZSwudWktYnV0dG9uOmFjdGl2ZSwudWktYnV0dG9uLnVpLXN0YXRlLWFjdGl2ZTpob3Zlcntib3JkZXI6MXB4IHNvbGlkICMwMDNlZmY7YmFja2dyb3VuZDojMDA3ZmZmO2ZvbnQtd2VpZ2h0Om5vcm1hbDtjb2xvcjojZmZmfS51aS1pY29uLWJhY2tncm91bmQsLnVpLXN0YXRlLWFjdGl2ZSAudWktaWNvbi1iYWNrZ3JvdW5ke2JvcmRlcjojMDAzZWZmO2JhY2tncm91bmQtY29sb3I6I2ZmZn0udWktc3RhdGUtYWN0aXZlIGEsLnVpLXN0YXRlLWFjdGl2ZSBhOmxpbmssLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWR7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtaGlnaGxpZ2h0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHR7Ym9yZGVyOjFweCBzb2xpZCAjZGFkNTVlO2JhY2tncm91bmQ6I2ZmZmE5MDtjb2xvcjojNzc3NjIwfS51aS1zdGF0ZS1jaGVja2Vke2JvcmRlcjoxcHggc29saWQgI2RhZDU1ZTtiYWNrZ3JvdW5kOiNmZmZhOTB9LnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhe2NvbG9yOiM3Nzc2MjB9LnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9ye2JvcmRlcjoxcHggc29saWQgI2YxYTg5OTtiYWNrZ3JvdW5kOiNmZGRmZGY7Y29sb3I6IzVmM2YzZn0udWktc3RhdGUtZXJyb3IgYSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yIGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIGF7Y29sb3I6IzVmM2YzZn0udWktc3RhdGUtZXJyb3ItdGV4dCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLXRleHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHR7Y29sb3I6IzVmM2YzZn0udWktcHJpb3JpdHktcHJpbWFyeSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXByaW1hcnksLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXByaW1hcnl7Zm9udC13ZWlnaHQ6Ym9sZH0udWktcHJpb3JpdHktc2Vjb25kYXJ5LC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktc2Vjb25kYXJ5LC51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1zZWNvbmRhcnl7b3BhY2l0eTouNztmaWx0ZXI6QWxwaGEoT3BhY2l0eT03MCk7Zm9udC13ZWlnaHQ6bm9ybWFsfS51aS1zdGF0ZS1kaXNhYmxlZCwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRpc2FibGVkLC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kaXNhYmxlZHtvcGFjaXR5Oi4zNTtmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS1zdGF0ZS1kaXNhYmxlZCAudWktaWNvbntmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSl9LnVpLWljb257d2lkdGg6MTZweDtoZWlnaHQ6MTZweH0udWktaWNvbiwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoIi4uL3dlYnN0cm90LmNvbS9odG1sL2JpdG1vbmV5L2xhbmRpbmdfcGFnZS9jc3MvaW1hZ2VzL3VpLWljb25zXzQ0NDQ0NF8yNTZ4MjQwLmh0bWwiKX0udWktd2lkZ2V0LWhlYWRlciAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiLi4vd2Vic3Ryb3QuY29tL2h0bWwvYml0bW9uZXkvbGFuZGluZ19wYWdlL2Nzcy9pbWFnZXMvdWktaWNvbnNfNDQ0NDQ0XzI1NngyNDAuaHRtbCIpfS51aS1zdGF0ZS1ob3ZlciAudWktaWNvbiwudWktc3RhdGUtZm9jdXMgLnVpLWljb24sLnVpLWJ1dHRvbjpob3ZlciAudWktaWNvbiwudWktYnV0dG9uOmZvY3VzIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCIuLi93ZWJzdHJvdC5jb20vaHRtbC9iaXRtb25leS9sYW5kaW5nX3BhZ2UvY3NzL2ltYWdlcy91aS1pY29uc181NTU1NTVfMjU2eDI0MC5odG1sIil9LnVpLXN0YXRlLWFjdGl2ZSAudWktaWNvbiwudWktYnV0dG9uOmFjdGl2ZSAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiLi4vd2Vic3Ryb3QuY29tL2h0bWwvYml0bW9uZXkvbGFuZGluZ19wYWdlL2Nzcy9pbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAuaHRtbCIpfS51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb24sLnVpLWJ1dHRvbiAudWktc3RhdGUtaGlnaGxpZ2h0LnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoIi4uL3dlYnN0cm90LmNvbS9odG1sL2JpdG1vbmV5L2xhbmRpbmdfcGFnZS9jc3MvaW1hZ2VzL3VpLWljb25zXzc3NzYyMF8yNTZ4MjQwLmh0bWwiKX0udWktc3RhdGUtZXJyb3IgLnVpLWljb24sLnVpLXN0YXRlLWVycm9yLXRleHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoIi4uL3dlYnN0cm90LmNvbS9odG1sL2JpdG1vbmV5L2xhbmRpbmdfcGFnZS9jc3MvaW1hZ2VzL3VpLWljb25zX2NjMDAwMF8yNTZ4MjQwLmh0bWwiKX0udWktYnV0dG9uIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCIuLi93ZWJzdHJvdC5jb20vaHRtbC9iaXRtb25leS9sYW5kaW5nX3BhZ2UvY3NzL2ltYWdlcy91aS1pY29uc183Nzc3NzdfMjU2eDI0MC5odG1sIil9LnVpLWljb24tYmxhbmt7YmFja2dyb3VuZC1wb3NpdGlvbjoxNnB4IDE2cHh9LnVpLWljb24tY2FyZXQtMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAwfS51aS1pY29uLWNhcmV0LTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAwfS51aS1pY29uLWNhcmV0LTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IDB9LnVpLWljb24tY2FyZXQtMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IDB9LnVpLWljb24tY2FyZXQtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY1cHggMH0udWktaWNvbi1jYXJldC0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggMH0udWktaWNvbi1jYXJldC0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAwfS51aS1pY29uLWNhcmV0LTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggMH0udWktaWNvbi1jYXJldC0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAwfS51aS1pY29uLWNhcmV0LTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IDB9LnVpLWljb24tdHJpYW5nbGUtMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NXB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xNnB4fS51aS1pY29uLWFycm93LTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTMycHh9LnVpLWljb24tYXJyb3ctMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjVweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTMycHh9LnVpLWljb24tYXJyb3ctMS13e2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtMzJweH0udWktaWNvbi1hcnJvdy0yLW5lLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItZS13e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTIwOHB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMzJweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOjFweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC00OHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13e2JhY2tncm91bmQtcG9zaXRpb246MCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtNjRweH0udWktaWNvbi1hcnJvdy00e2JhY2tncm91bmQtcG9zaXRpb246MCAtODBweH0udWktaWNvbi1hcnJvdy00LWRpYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtODBweH0udWktaWNvbi1leHRsaW5re2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTgwcHh9LnVpLWljb24tbmV3d2lue2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTgwcHh9LnVpLWljb24tcmVmcmVzaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC04MHB4fS51aS1pY29uLXNodWZmbGV7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtODBweH0udWktaWNvbi10cmFuc2Zlci1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtODBweH0udWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtODBweH0udWktaWNvbi1mb2xkZXItY29sbGFwc2Vke2JhY2tncm91bmQtcG9zaXRpb246MCAtOTZweH0udWktaWNvbi1mb2xkZXItb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC05NnB4fS51aS1pY29uLWRvY3VtZW50e2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTk2cHh9LnVpLWljb24tZG9jdW1lbnQtYntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC05NnB4fS51aS1pY29uLW5vdGV7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtOTZweH0udWktaWNvbi1tYWlsLWNsb3NlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC05NnB4fS51aS1pY29uLW1haWwtb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC05NnB4fS51aS1pY29uLXN1aXRjYXNle2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC05NnB4fS51aS1pY29uLWNvbW1lbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTk2cHh9LnVpLWljb24tcGVyc29ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC05NnB4fS51aS1pY29uLXByaW50e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC05NnB4fS51aS1pY29uLXRyYXNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC05NnB4fS51aS1pY29uLWxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtOTZweH0udWktaWNvbi11bmxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtOTZweH0udWktaWNvbi1ib29rbWFya3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtOTZweH0udWktaWNvbi10YWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTk2cHh9LnVpLWljb24taG9tZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExMnB4fS51aS1pY29uLWZsYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTEycHh9LnVpLWljb24tY2FsZW5kYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTEycHh9LnVpLWljb24tY2FydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMTJweH0udWktaWNvbi1wZW5jaWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTEycHh9LnVpLWljb24tY2xvY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTEycHh9LnVpLWljb24tZGlza3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xMTJweH0udWktaWNvbi1jYWxjdWxhdG9ye2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xMTJweH0udWktaWNvbi16b29taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTExMnB4fS51aS1pY29uLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTExMnB4fS51aS1pY29uLXNlYXJjaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTEycHh9LnVpLWljb24td3JlbmNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMTJweH0udWktaWNvbi1nZWFye2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMTJweH0udWktaWNvbi1oZWFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTEycHh9LnVpLWljb24tc3RhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMTEycHh9LnVpLWljb24tbGlua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTEycHh9LnVpLWljb24tY2FuY2Vse2JhY2tncm91bmQtcG9zaXRpb246MCAtMTI4cHh9LnVpLWljb24tcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xMjhweH0udWktaWNvbi1wbHVzdGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTI4cHh9LnVpLWljb24tbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTI4cHh9LnVpLWljb24tbWludXN0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXRoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTEyOHB4fS51aS1pY29uLWtleXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTI4cHh9LnVpLWljb24tbGlnaHRidWxie2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xMjhweH0udWktaWNvbi1zY2lzc29yc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTI4cHh9LnVpLWljb24tY2xpcGJvYXJke2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xMjhweH0udWktaWNvbi1jb3B5e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMjhweH0udWktaWNvbi1jb250YWN0e2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMjhweH0udWktaWNvbi1pbWFnZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTI4cHh9LnVpLWljb24tdmlkZW97YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTEyOHB4fS51aS1pY29uLXNjcmlwdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTI4cHh9LnVpLWljb24tYWxlcnR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNDRweH0udWktaWNvbi1pbmZve2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE0NHB4fS51aS1pY29uLW5vdGljZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNDRweH0udWktaWNvbi1oZWxwe2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE0NHB4fS51aS1pY29uLWNoZWNre2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE0NHB4fS51aS1pY29uLWJ1bGxldHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE0NHB4fS51aS1pY29uLXBpbi13e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNDRweH0udWktaWNvbi1waW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTQ0cHh9LnVpLWljb24tcGxheXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2MHB4fS51aS1pY29uLXBhdXNle2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2MHB4fS51aS1pY29uLXNlZWstbmV4dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNjBweH0udWktaWNvbi1zZWVrLXByZXZ7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTYwcHh9LnVpLWljb24tc2Vlay1lbmR7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTYwcHh9LnVpLWljb24tc2Vlay1zdGFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNjBweH0udWktaWNvbi1zZWVrLWZpcnN0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2MHB4fS51aS1pY29uLXN0b3B7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTYwcHh9LnVpLWljb24tZWplY3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTYwcHh9LnVpLWljb24tcG93ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzZweH0udWktaWNvbi1zaWduYWwtZGlhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNzZweH0udWktaWNvbi1zaWduYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0we2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTJ7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0ze2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE3NnB4fS51aS1pY29uLWNpcmNsZS1wbHVze2JhY2tncm91bmQtcG9zaXRpb246MCAtMTkycHh9LnVpLWljb24tY2lyY2xlLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21pbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlc21hbGwtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjA4cHh9LnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMjRweH0udWktaWNvbi1ncmlwLWRvdHRlZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIyNHB4fS51aS1pY29uLWdyaXAtc29saWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTIyNHB4fS51aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0yMjRweH0udWktaWNvbi1ncmlwLWRpYWdvbmFsLXNle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTIyNHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItbGVmdCwudWktY29ybmVyLXRse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItcmlnaHQsLnVpLWNvcm5lci10cntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1sZWZ0LC51aS1jb3JuZXItYmx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1yaWdodCwudWktY29ybmVyLWJye2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweH0udWktd2lkZ2V0LW92ZXJsYXl7YmFja2dyb3VuZDojYWFhO29wYWNpdHk6LjM7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MzApfS51aS13aWRnZXQtc2hhZG93ey13ZWJraXQtYm94LXNoYWRvdzowIDAgNXB4ICM2NjY7Ym94LXNoYWRvdzowIDAgNXB4ICM2NjZ9"}},"time_used":302,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":302,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/three.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.287Z","timestamp":1785147795287,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/three.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:24 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 202813\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1071493,"size_decoded":203359,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text","md5":"8f75687a1e3910cd7fd2200768d6bdcd","sha1":"0f45e1175c0d57b2ba859f128ed3eb1483eab87b","sha256":"61210a30265d44aff7fe2e3ef890d08e7753c17f432b6e996725a0f2b4a46ea3","sha512":"5b4b5d67175a9fd6ad4489ccedb65340618cd3241364801324b55f2c5035599a5e7d8300743625400b8e5285de6ae7ad0af96d1ba98adf7e1404136c5abd51d7","ssdeep":"24576:F1Zdia9KJsour1OxpcgUqOUqIn0EvDJa+omRdQvCjKWJItdt:Tia9KJsour1OxpcgUqOUqIn0EvNa+bRY","tlshash":"4625b6c56bbd111eca237298956d10c9a53c9477a10584bfbc1ce5ea68e083c837ef7e","first_seen":"2025-08-08T07:13:08.742601Z","last_seen":"2026-08-11T00:25:55.220694Z","times_seen":19,"resource_available":false,"data":"KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOgoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CgkoZmFjdG9yeSgoZ2xvYmFsLlRIUkVFID0ge30pKSk7Cn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsKCgkvLyBQb2x5ZmlsbHMKCglpZiAoIE51bWJlci5FUFNJTE9OID09PSB1bmRlZmluZWQgKSB7CgoJCU51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTsKCgl9CgoJaWYgKCBOdW1iZXIuaXNJbnRlZ2VyID09PSB1bmRlZmluZWQgKSB7CgoJCS8vIE1pc3NpbmcgaW4gSUUKCQkvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9OdW1iZXIvaXNJbnRlZ2VyCgoJCU51bWJlci5pc0ludGVnZXIgPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoIHZhbHVlICkgJiYgTWF0aC5mbG9vciggdmFsdWUgKSA9PT0gdmFsdWU7CgoJCX07CgoJfQoKCS8vCgoJaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHsKCgkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9zaWduCgoJCU1hdGguc2lnbiA9IGZ1bmN0aW9uICggeCApIHsKCgkJCXJldHVybiAoIHggPCAwICkgPyAtIDEgOiAoIHggPiAwICkgPyAxIDogKyB4OwoKCQl9OwoKCX0KCglpZiAoICduYW1lJyBpbiBGdW5jdGlvbi5wcm90b3R5cGUgPT09IGZhbHNlICkgewoKCQkvLyBNaXNzaW5nIGluIElFCgkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZQoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIEZ1bmN0aW9uLnByb3RvdHlwZSwgJ25hbWUnLCB7CgoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKCAvXlxzKmZ1bmN0aW9uXHMqKFteXChcc10qKS8gKVsgMSBdOwoKCQkJfQoKCQl9ICk7CgoJfQoKCWlmICggT2JqZWN0LmFzc2lnbiA9PT0gdW5kZWZpbmVkICkgewoKCQkvLyBNaXNzaW5nIGluIElFCgkJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbgoKCQkoIGZ1bmN0aW9uICgpIHsKCgkJCU9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHsKCgkJCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHsKCgkJCQkJdGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTsKCgkJCQl9CgoJCQkJdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7CgoJCQkJZm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHsKCgkJCQkJdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1sgaW5kZXggXTsKCgkJCQkJaWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7CgoJCQkJCQlmb3IgKCB2YXIgbmV4dEtleSBpbiBzb3VyY2UgKSB7CgoJCQkJCQkJaWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHNvdXJjZSwgbmV4dEtleSApICkgewoKCQkJCQkJCQlvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBdOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCgkJCQlyZXR1cm4gb3V0cHV0OwoKCQkJfTsKCgkJfSApKCk7CgoJfQoKCS8qKgoJICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi9ldmVudGRpc3BhdGNoZXIuanMvCgkgKi8KCglmdW5jdGlvbiBFdmVudERpc3BhdGNoZXIoKSB7fQoKCU9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHsKCgkJYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHsKCgkJCWlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTsKCgkJCXZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CgoJCQlpZiAoIGxpc3RlbmVyc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7CgoJCQkJbGlzdGVuZXJzWyB0eXBlIF0gPSBbXTsKCgkJCX0KCgkJCWlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkgewoKCQkJCWxpc3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7CgoJCQl9CgoJCX0sCgoJCWhhc0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7CgoJCQlpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlOwoKCQkJdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyczsKCgkJCXJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTsKCgkJfSwKCgkJcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHsKCgkJCWlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47CgoJCQl2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwoJCQl2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdOwoKCQkJaWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJdmFyIGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApOwoKCQkJCWlmICggaW5kZXggIT09IC0gMSApIHsKCgkJCQkJbGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQlkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkgewoKCQkJaWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCgkJCXZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CgkJCXZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVudC50eXBlIF07CgoJCQlpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCQlldmVudC50YXJnZXQgPSB0aGlzOwoKCQkJCXZhciBhcnJheSA9IGxpc3RlbmVyQXJyYXkuc2xpY2UoIDAgKTsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQlhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgoJCQkJfQoKCQkJfQoKCQl9CgoJfSApOwoKCXZhciBSRVZJU0lPTiA9ICc4OSc7Cgl2YXIgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIgfTsKCXZhciBDdWxsRmFjZU5vbmUgPSAwOwoJdmFyIEN1bGxGYWNlQmFjayA9IDE7Cgl2YXIgQ3VsbEZhY2VGcm9udCA9IDI7Cgl2YXIgQ3VsbEZhY2VGcm9udEJhY2sgPSAzOwoJdmFyIEZyb250RmFjZURpcmVjdGlvbkNXID0gMDsKCXZhciBGcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSAxOwoJdmFyIEJhc2ljU2hhZG93TWFwID0gMDsKCXZhciBQQ0ZTaGFkb3dNYXAgPSAxOwoJdmFyIFBDRlNvZnRTaGFkb3dNYXAgPSAyOwoJdmFyIEZyb250U2lkZSA9IDA7Cgl2YXIgQmFja1NpZGUgPSAxOwoJdmFyIERvdWJsZVNpZGUgPSAyOwoJdmFyIEZsYXRTaGFkaW5nID0gMTsKCXZhciBTbW9vdGhTaGFkaW5nID0gMjsKCXZhciBOb0NvbG9ycyA9IDA7Cgl2YXIgRmFjZUNvbG9ycyA9IDE7Cgl2YXIgVmVydGV4Q29sb3JzID0gMjsKCXZhciBOb0JsZW5kaW5nID0gMDsKCXZhciBOb3JtYWxCbGVuZGluZyA9IDE7Cgl2YXIgQWRkaXRpdmVCbGVuZGluZyA9IDI7Cgl2YXIgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7Cgl2YXIgTXVsdGlwbHlCbGVuZGluZyA9IDQ7Cgl2YXIgQ3VzdG9tQmxlbmRpbmcgPSA1OwoJdmFyIEFkZEVxdWF0aW9uID0gMTAwOwoJdmFyIFN1YnRyYWN0RXF1YXRpb24gPSAxMDE7Cgl2YXIgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAxMDI7Cgl2YXIgTWluRXF1YXRpb24gPSAxMDM7Cgl2YXIgTWF4RXF1YXRpb24gPSAxMDQ7Cgl2YXIgWmVyb0ZhY3RvciA9IDIwMDsKCXZhciBPbmVGYWN0b3IgPSAyMDE7Cgl2YXIgU3JjQ29sb3JGYWN0b3IgPSAyMDI7Cgl2YXIgT25lTWludXNTcmNDb2xvckZhY3RvciA9IDIwMzsKCXZhciBTcmNBbHBoYUZhY3RvciA9IDIwNDsKCXZhciBPbmVNaW51c1NyY0FscGhhRmFjdG9yID0gMjA1OwoJdmFyIERzdEFscGhhRmFjdG9yID0gMjA2OwoJdmFyIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7Cgl2YXIgRHN0Q29sb3JGYWN0b3IgPSAyMDg7Cgl2YXIgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTsKCXZhciBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwOwoJdmFyIE5ldmVyRGVwdGggPSAwOwoJdmFyIEFsd2F5c0RlcHRoID0gMTsKCXZhciBMZXNzRGVwdGggPSAyOwoJdmFyIExlc3NFcXVhbERlcHRoID0gMzsKCXZhciBFcXVhbERlcHRoID0gNDsKCXZhciBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7Cgl2YXIgR3JlYXRlckRlcHRoID0gNjsKCXZhciBOb3RFcXVhbERlcHRoID0gNzsKCXZhciBNdWx0aXBseU9wZXJhdGlvbiA9IDA7Cgl2YXIgTWl4T3BlcmF0aW9uID0gMTsKCXZhciBBZGRPcGVyYXRpb24gPSAyOwoJdmFyIE5vVG9uZU1hcHBpbmcgPSAwOwoJdmFyIExpbmVhclRvbmVNYXBwaW5nID0gMTsKCXZhciBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjsKCXZhciBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcgPSAzOwoJdmFyIENpbmVvblRvbmVNYXBwaW5nID0gNDsKCXZhciBVVk1hcHBpbmcgPSAzMDA7Cgl2YXIgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nID0gMzAxOwoJdmFyIEN1YmVSZWZyYWN0aW9uTWFwcGluZyA9IDMwMjsKCXZhciBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMzsKCXZhciBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA9IDMwNDsKCXZhciBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyA9IDMwNTsKCXZhciBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA9IDMwNjsKCXZhciBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNzsKCXZhciBSZXBlYXRXcmFwcGluZyA9IDEwMDA7Cgl2YXIgQ2xhbXBUb0VkZ2VXcmFwcGluZyA9IDEwMDE7Cgl2YXIgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7Cgl2YXIgTmVhcmVzdEZpbHRlciA9IDEwMDM7Cgl2YXIgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0OwoJdmFyIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1OwoJdmFyIExpbmVhckZpbHRlciA9IDEwMDY7Cgl2YXIgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7Cgl2YXIgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwODsKCXZhciBVbnNpZ25lZEJ5dGVUeXBlID0gMTAwOTsKCXZhciBCeXRlVHlwZSA9IDEwMTA7Cgl2YXIgU2hvcnRUeXBlID0gMTAxMTsKCXZhciBVbnNpZ25lZFNob3J0VHlwZSA9IDEwMTI7Cgl2YXIgSW50VHlwZSA9IDEwMTM7Cgl2YXIgVW5zaWduZWRJbnRUeXBlID0gMTAxNDsKCXZhciBGbG9hdFR5cGUgPSAxMDE1OwoJdmFyIEhhbGZGbG9hdFR5cGUgPSAxMDE2OwoJdmFyIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTc7Cgl2YXIgVW5zaWduZWRTaG9ydDU1NTFUeXBlID0gMTAxODsKCXZhciBVbnNpZ25lZFNob3J0NTY1VHlwZSA9IDEwMTk7Cgl2YXIgVW5zaWduZWRJbnQyNDhUeXBlID0gMTAyMDsKCXZhciBBbHBoYUZvcm1hdCA9IDEwMjE7Cgl2YXIgUkdCRm9ybWF0ID0gMTAyMjsKCXZhciBSR0JBRm9ybWF0ID0gMTAyMzsKCXZhciBMdW1pbmFuY2VGb3JtYXQgPSAxMDI0OwoJdmFyIEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTsKCXZhciBSR0JFRm9ybWF0ID0gUkdCQUZvcm1hdDsKCXZhciBEZXB0aEZvcm1hdCA9IDEwMjY7Cgl2YXIgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNzsKCXZhciBSR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IDIwMDE7Cgl2YXIgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMjAwMjsKCXZhciBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAyMDAzOwoJdmFyIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCA9IDIwMDQ7Cgl2YXIgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAyMTAwOwoJdmFyIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMjEwMTsKCXZhciBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAyMTAyOwoJdmFyIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDIxMDM7Cgl2YXIgUkdCX0VUQzFfRm9ybWF0ID0gMjE1MTsKCXZhciBMb29wT25jZSA9IDIyMDA7Cgl2YXIgTG9vcFJlcGVhdCA9IDIyMDE7Cgl2YXIgTG9vcFBpbmdQb25nID0gMjIwMjsKCXZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDsKCXZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7Cgl2YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyOwoJdmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwOwoJdmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7Cgl2YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7Cgl2YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwOwoJdmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7Cgl2YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7Cgl2YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwOwoJdmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7Cgl2YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7Cgl2YXIgUkdCRUVuY29kaW5nID0gMzAwMjsKCXZhciBMb2dMdXZFbmNvZGluZyA9IDMwMDM7Cgl2YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7Cgl2YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1OwoJdmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7Cgl2YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwOwoJdmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxOwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCgl2YXIgX01hdGggPSB7CgoJCURFRzJSQUQ6IE1hdGguUEkgLyAxODAsCgkJUkFEMkRFRzogMTgwIC8gTWF0aC5QSSwKCgkJZ2VuZXJhdGVVVUlEOiAoIGZ1bmN0aW9uICgpIHsKCgkJCS8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTk2MzEzNiMyMTk2MzEzNgoKCQkJdmFyIGx1dCA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgMjU2OyBpICsrICkgewoKCQkJCWx1dFsgaSBdID0gKCBpIDwgMTYgPyAnMCcgOiAnJyApICsgKCBpICkudG9TdHJpbmcoIDE2ICkudG9VcHBlckNhc2UoKTsKCgkJCX0KCgkJCXJldHVybiBmdW5jdGlvbiAoKSB7CgoJCQkJdmFyIGQwID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwOwoJCQkJdmFyIGQxID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwOwoJCQkJdmFyIGQyID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwOwoJCQkJdmFyIGQzID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwOwoJCQkJcmV0dXJuIGx1dFsgZDAgJiAweGZmIF0gKyBsdXRbIGQwID4+IDggJiAweGZmIF0gKyBsdXRbIGQwID4+IDE2ICYgMHhmZiBdICsgbHV0WyBkMCA+PiAyNCAmIDB4ZmYgXSArICctJyArCgkJCQkJbHV0WyBkMSAmIDB4ZmYgXSArIGx1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArCgkJCQkJbHV0WyBkMiAmIDB4M2YgfCAweDgwIF0gKyBsdXRbIGQyID4+IDggJiAweGZmIF0gKyAnLScgKyBsdXRbIGQyID4+IDE2ICYgMHhmZiBdICsgbHV0WyBkMiA+PiAyNCAmIDB4ZmYgXSArCgkJCQkJbHV0WyBkMyAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQzID4+IDI0ICYgMHhmZiBdOwoKCQkJfTsKCgkJfSApKCksCgoJCWNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHsKCgkJCXJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7CgoJCX0sCgoJCS8vIGNvbXB1dGUgZXVjbGlkaWFuIG1vZHVsbyBvZiBtICUgbgoJCS8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vZHVsb19vcGVyYXRpb24KCgkJZXVjbGlkZWFuTW9kdWxvOiBmdW5jdGlvbiAoIG4sIG0gKSB7CgoJCQlyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtOwoKCQl9LAoKCQkvLyBMaW5lYXIgbWFwcGluZyBmcm9tIHJhbmdlIDxhMSwgYTI+IHRvIHJhbmdlIDxiMSwgYjI+CgoJCW1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHsKCgkJCXJldHVybiBiMSArICggeCAtIGExICkgKiAoIGIyIC0gYjEgKSAvICggYTIgLSBhMSApOwoKCQl9LAoKCQkvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfaW50ZXJwb2xhdGlvbgoKCQlsZXJwOiBmdW5jdGlvbiAoIHgsIHksIHQgKSB7CgoJCQlyZXR1cm4gKCAxIC0gdCApICogeCArIHQgKiB5OwoKCQl9LAoKCQkvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXAKCgkJc21vb3Roc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHsKCgkJCWlmICggeCA8PSBtaW4gKSByZXR1cm4gMDsKCQkJaWYgKCB4ID49IG1heCApIHJldHVybiAxOwoKCQkJeCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTsKCgkJCXJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7CgoJCX0sCgoJCXNtb290aGVyc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHsKCgkJCWlmICggeCA8PSBtaW4gKSByZXR1cm4gMDsKCQkJaWYgKCB4ID49IG1heCApIHJldHVybiAxOwoKCQkJeCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTsKCgkJCXJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7CgoJCX0sCgoJCS8vIFJhbmRvbSBpbnRlZ2VyIGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWwKCgkJcmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7CgoJCQlyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApOwoKCQl9LAoKCQkvLyBSYW5kb20gZmxvYXQgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbAoKCQlyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkgewoKCQkJcmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTsKCgkJfSwKCgkJLy8gUmFuZG9tIGZsb2F0IGZyb20gPC1yYW5nZS8yLCByYW5nZS8yPiBpbnRlcnZhbAoKCQlyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7CgoJCQlyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTsKCgkJfSwKCgkJZGVnVG9SYWQ6IGZ1bmN0aW9uICggZGVncmVlcyApIHsKCgkJCXJldHVybiBkZWdyZWVzICogX01hdGguREVHMlJBRDsKCgkJfSwKCgkJcmFkVG9EZWc6IGZ1bmN0aW9uICggcmFkaWFucyApIHsKCgkJCXJldHVybiByYWRpYW5zICogX01hdGguUkFEMkRFRzsKCgkJfSwKCgkJaXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJcmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7CgoJCX0sCgoJCWNlaWxQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJcmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmNlaWwoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApOwoKCQl9LAoKCQlmbG9vclBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQlyZXR1cm4gTWF0aC5wb3coIDIsIE1hdGguZmxvb3IoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApOwoKCQl9CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnLwoJICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS8KCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKCSAqLwoKCWZ1bmN0aW9uIFZlY3RvcjIoIHgsIHkgKSB7CgoJCXRoaXMueCA9IHggfHwgMDsKCQl0aGlzLnkgPSB5IHx8IDA7CgoJfQoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwgewoKCQkid2lkdGgiOiB7CgoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQlyZXR1cm4gdGhpcy54OwoKCQkJfSwKCgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQl0aGlzLnggPSB2YWx1ZTsKCgkJCX0KCgkJfSwKCgkJImhlaWdodCI6IHsKCgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiB0aGlzLnk7CgoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCXRoaXMueSA9IHZhbHVlOwoKCQkJfQoKCQl9CgoJfSApOwoKCU9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7CgoJCWlzVmVjdG9yMjogdHJ1ZSwKCgkJc2V0OiBmdW5jdGlvbiAoIHgsIHkgKSB7CgoJCQl0aGlzLnggPSB4OwoJCQl0aGlzLnkgPSB5OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgoJCQl0aGlzLnggPSBzY2FsYXI7CgkJCXRoaXMueSA9IHNjYWxhcjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRYOiBmdW5jdGlvbiAoIHggKSB7CgoJCQl0aGlzLnggPSB4OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFk6IGZ1bmN0aW9uICggeSApIHsKCgkJCXRoaXMueSA9IHk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHsKCgkJCXN3aXRjaCAoIGluZGV4ICkgewoKCQkJCWNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrOwoJCQkJY2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7CgkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCXN3aXRjaCAoIGluZGV4ICkgewoKCQkJCWNhc2UgMDogcmV0dXJuIHRoaXMueDsKCQkJCWNhc2UgMTogcmV0dXJuIHRoaXMueTsKCQkJCWRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7CgoJCQl9CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggdiApIHsKCgkJCXRoaXMueCA9IHYueDsKCQkJdGhpcy55ID0gdi55OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWFkZDogZnVuY3Rpb24gKCB2LCB3ICkgewoKCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKCQkJCXJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTsKCgkJCX0KCgkJCXRoaXMueCArPSB2Lng7CgkJCXRoaXMueSArPSB2Lnk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CgoJCQl0aGlzLnggKz0gczsKCQkJdGhpcy55ICs9IHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKCQkJdGhpcy54ID0gYS54ICsgYi54OwoJCQl0aGlzLnkgPSBhLnkgKyBiLnk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7CgoJCQl0aGlzLnggKz0gdi54ICogczsKCQkJdGhpcy55ICs9IHYueSAqIHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7CgoJCQlpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOwoJCQkJcmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApOwoKCQkJfQoKCQkJdGhpcy54IC09IHYueDsKCQkJdGhpcy55IC09IHYueTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKCgkJCXRoaXMueCAtPSBzOwoJCQl0aGlzLnkgLT0gczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgoJCQl0aGlzLnggPSBhLnggLSBiLng7CgkJCXRoaXMueSA9IGEueSAtIGIueTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltdWx0aXBseTogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy54ICo9IHYueDsKCQkJdGhpcy55ICo9IHYueTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgoJCQl0aGlzLnggKj0gc2NhbGFyOwoJCQl0aGlzLnkgKj0gc2NhbGFyOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWRpdmlkZTogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy54IC89IHYueDsKCQkJdGhpcy55IC89IHYueTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTsKCgkJfSwKCgkJYXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7CgoJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueTsKCQkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKCQkJdGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF07CgkJCXRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1pbjogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7CgkJCXRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1heDogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7CgkJCXRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgewoKCQkJLy8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2UKCgkJCXRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOwoJCQl0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIG1pbiA9IG5ldyBWZWN0b3IyKCk7CgkJCXZhciBtYXggPSBuZXcgVmVjdG9yMigpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHsKCgkJCQltaW4uc2V0KCBtaW5WYWwsIG1pblZhbCApOwoJCQkJbWF4LnNldCggbWF4VmFsLCBtYXhWYWwgKTsKCgkJCQlyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTsKCgkJCX07CgoJCX0oKSwKCgkJY2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CgoJCQl2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTsKCgkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApOwoKCQl9LAoKCQlmbG9vcjogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7CgkJCXRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNlaWw6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7CgkJCXRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJcm91bmQ6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApOwoJCQl0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7CgkJCXRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW5lZ2F0ZTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gLSB0aGlzLng7CgkJCXRoaXMueSA9IC0gdGhpcy55OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWRvdDogZnVuY3Rpb24gKCB2ICkgewoKCQkJcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTsKCgkJfSwKCgkJbGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7CgoJCX0sCgoJCWxlbmd0aDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7CgoJCX0sCgoJCW1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTsKCgkJfSwKCgkJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApOwoKCQl9LAoKCQlhbmdsZTogZnVuY3Rpb24gKCkgewoKCQkJLy8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXMKCgkJCXZhciBhbmdsZSA9IE1hdGguYXRhbjIoIHRoaXMueSwgdGhpcy54ICk7CgoJCQlpZiAoIGFuZ2xlIDwgMCApIGFuZ2xlICs9IDIgKiBNYXRoLlBJOwoKCQkJcmV0dXJuIGFuZ2xlOwoKCQl9LAoKCQlkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQlyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTsKCgkJfSwKCgkJZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHsKCgkJCXZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7CgkJCXJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKCgkJfSwKCgkJbWFuaGF0dGFuRGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkgewoKCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTsKCgkJfSwKCgkJc2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHsKCgkJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTsKCgkJfSwKCgkJbGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHsKCgkJCXRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7CgkJCXRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHsKCgkJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQlyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7CgoJCX0sCgoJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQl0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07CgkJCXRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQlhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7CgkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7CgoJCQlyZXR1cm4gYXJyYXk7CgoJCX0sCgoJCWZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwoKCQkJfQoKCQkJdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CgkJCXRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkgewoKCQkJdmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApOwoKCQkJdmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDsKCQkJdmFyIHkgPSB0aGlzLnkgLSBjZW50ZXIueTsKCgkJCXRoaXMueCA9IHggKiBjIC0geSAqIHMgKyBjZW50ZXIueDsKCQkJdGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay8KCSAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvCgkgKiBAYXV0aG9yIGpvcmRpX3JvcyAvIGh0dHA6Ly9wbGF0dHNvZnQuY29tCgkgKiBAYXV0aG9yIEQxcGxvMWQgLyBodHRwOi8vZ2l0aHViLmNvbS9EMXBsbzFkCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3IgdGlta25pcCAvIGh0dHA6Ly93d3cuZmxvb3JwbGFubmVyLmNvbS8KCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICovCgoJZnVuY3Rpb24gTWF0cml4NCgpIHsKCgkJdGhpcy5lbGVtZW50cyA9IFsKCgkJCTEsIDAsIDAsIDAsCgkJCTAsIDEsIDAsIDAsCgkJCTAsIDAsIDEsIDAsCgkJCTAsIDAsIDAsIDEKCgkJXTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTsKCgkJfQoKCX0KCglPYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwgewoKCQlpc01hdHJpeDQ6IHRydWUsCgoJCXNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKCQkJdGVbIDAgXSA9IG4xMTsgdGVbIDQgXSA9IG4xMjsgdGVbIDggXSA9IG4xMzsgdGVbIDEyIF0gPSBuMTQ7CgkJCXRlWyAxIF0gPSBuMjE7IHRlWyA1IF0gPSBuMjI7IHRlWyA5IF0gPSBuMjM7IHRlWyAxMyBdID0gbjI0OwoJCQl0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7CgkJCXRlWyAzIF0gPSBuNDE7IHRlWyA3IF0gPSBuNDI7IHRlWyAxMSBdID0gbjQzOyB0ZVsgMTUgXSA9IG40NDsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlpZGVudGl0eTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5zZXQoCgoJCQkJMSwgMCwgMCwgMCwKCQkJCTAsIDEsIDAsIDAsCgkJCQkwLCAwLCAxLCAwLAoJCQkJMCwgMCwgMCwgMQoKCQkJKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggbSApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgkJCXZhciBtZSA9IG0uZWxlbWVudHM7CgoJCQl0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOyB0ZVsgMyBdID0gbWVbIDMgXTsKCQkJdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07CgkJCXRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTsKCQkJdGVbIDEyIF0gPSBtZVsgMTIgXTsgdGVbIDEzIF0gPSBtZVsgMTMgXTsgdGVbIDE0IF0gPSBtZVsgMTQgXTsgdGVbIDE1IF0gPSBtZVsgMTUgXTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50czsKCgkJCXRlWyAxMiBdID0gbWVbIDEyIF07CgkJCXRlWyAxMyBdID0gbWVbIDEzIF07CgkJCXRlWyAxNCBdID0gbWVbIDE0IF07CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXh0cmFjdEJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7CgoJCQl4QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAwICk7CgkJCXlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTsKCQkJekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1ha2VCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkgewoKCQkJdGhpcy5zZXQoCgkJCQl4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLAoJCQkJeEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCwKCQkJCXhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsCgkJCQkwLCAwLCAwLCAxCgkJCSk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXh0cmFjdFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGV4dHJhY3RSb3RhdGlvbiggbSApIHsKCgkJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoJCQkJdmFyIG1lID0gbS5lbGVtZW50czsKCgkJCQl2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTsKCQkJCXZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpOwoJCQkJdmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7CgoJCQkJdGVbIDAgXSA9IG1lWyAwIF0gKiBzY2FsZVg7CgkJCQl0ZVsgMSBdID0gbWVbIDEgXSAqIHNjYWxlWDsKCQkJCXRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYOwoKCQkJCXRlWyA0IF0gPSBtZVsgNCBdICogc2NhbGVZOwoJCQkJdGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7CgkJCQl0ZVsgNiBdID0gbWVbIDYgXSAqIHNjYWxlWTsKCgkJCQl0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjsKCQkJCXRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaOwoJCQkJdGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJbWFrZVJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkgewoKCQkJaWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTsKCgkJCX0KCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgoJCQl2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejsKCQkJdmFyIGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTsKCQkJdmFyIGMgPSBNYXRoLmNvcyggeSApLCBkID0gTWF0aC5zaW4oIHkgKTsKCQkJdmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTsKCgkJCWlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkgewoKCQkJCXZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmOwoKCQkJCXRlWyAwIF0gPSBjICogZTsKCQkJCXRlWyA0IF0gPSAtIGMgKiBmOwoJCQkJdGVbIDggXSA9IGQ7CgoJCQkJdGVbIDEgXSA9IGFmICsgYmUgKiBkOwoJCQkJdGVbIDUgXSA9IGFlIC0gYmYgKiBkOwoJCQkJdGVbIDkgXSA9IC0gYiAqIGM7CgoJCQkJdGVbIDIgXSA9IGJmIC0gYWUgKiBkOwoJCQkJdGVbIDYgXSA9IGJlICsgYWYgKiBkOwoJCQkJdGVbIDEwIF0gPSBhICogYzsKCgkJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVhaJyApIHsKCgkJCQl2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjsKCgkJCQl0ZVsgMCBdID0gY2UgKyBkZiAqIGI7CgkJCQl0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7CgkJCQl0ZVsgOCBdID0gYSAqIGQ7CgoJCQkJdGVbIDEgXSA9IGEgKiBmOwoJCQkJdGVbIDUgXSA9IGEgKiBlOwoJCQkJdGVbIDkgXSA9IC0gYjsKCgkJCQl0ZVsgMiBdID0gY2YgKiBiIC0gZGU7CgkJCQl0ZVsgNiBdID0gZGYgKyBjZSAqIGI7CgkJCQl0ZVsgMTAgXSA9IGEgKiBjOwoKCQkJfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkgewoKCQkJCXZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmOwoKCQkJCXRlWyAwIF0gPSBjZSAtIGRmICogYjsKCQkJCXRlWyA0IF0gPSAtIGEgKiBmOwoJCQkJdGVbIDggXSA9IGRlICsgY2YgKiBiOwoKCQkJCXRlWyAxIF0gPSBjZiArIGRlICogYjsKCQkJCXRlWyA1IF0gPSBhICogZTsKCQkJCXRlWyA5IF0gPSBkZiAtIGNlICogYjsKCgkJCQl0ZVsgMiBdID0gLSBhICogZDsKCQkJCXRlWyA2IF0gPSBiOwoJCQkJdGVbIDEwIF0gPSBhICogYzsKCgkJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHsKCgkJCQl2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjsKCgkJCQl0ZVsgMCBdID0gYyAqIGU7CgkJCQl0ZVsgNCBdID0gYmUgKiBkIC0gYWY7CgkJCQl0ZVsgOCBdID0gYWUgKiBkICsgYmY7CgoJCQkJdGVbIDEgXSA9IGMgKiBmOwoJCQkJdGVbIDUgXSA9IGJmICogZCArIGFlOwoJCQkJdGVbIDkgXSA9IGFmICogZCAtIGJlOwoKCQkJCXRlWyAyIF0gPSAtIGQ7CgkJCQl0ZVsgNiBdID0gYiAqIGM7CgkJCQl0ZVsgMTAgXSA9IGEgKiBjOwoKCQkJfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWlgnICkgewoKCQkJCXZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkOwoKCQkJCXRlWyAwIF0gPSBjICogZTsKCQkJCXRlWyA0IF0gPSBiZCAtIGFjICogZjsKCQkJCXRlWyA4IF0gPSBiYyAqIGYgKyBhZDsKCgkJCQl0ZVsgMSBdID0gZjsKCQkJCXRlWyA1IF0gPSBhICogZTsKCQkJCXRlWyA5IF0gPSAtIGIgKiBlOwoKCQkJCXRlWyAyIF0gPSAtIGQgKiBlOwoJCQkJdGVbIDYgXSA9IGFkICogZiArIGJjOwoJCQkJdGVbIDEwIF0gPSBhYyAtIGJkICogZjsKCgkJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHsKCgkJCQl2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDsKCgkJCQl0ZVsgMCBdID0gYyAqIGU7CgkJCQl0ZVsgNCBdID0gLSBmOwoJCQkJdGVbIDggXSA9IGQgKiBlOwoKCQkJCXRlWyAxIF0gPSBhYyAqIGYgKyBiZDsKCQkJCXRlWyA1IF0gPSBhICogZTsKCQkJCXRlWyA5IF0gPSBhZCAqIGYgLSBiYzsKCgkJCQl0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7CgkJCQl0ZVsgNiBdID0gYiAqIGU7CgkJCQl0ZVsgMTAgXSA9IGJkICogZiArIGFjOwoKCQkJfQoKCQkJLy8gbGFzdCBjb2x1bW4KCQkJdGVbIDMgXSA9IDA7CgkJCXRlWyA3IF0gPSAwOwoJCQl0ZVsgMTEgXSA9IDA7CgoJCQkvLyBib3R0b20gcm93CgkJCXRlWyAxMiBdID0gMDsKCQkJdGVbIDEzIF0gPSAwOwoJCQl0ZVsgMTQgXSA9IDA7CgkJCXRlWyAxNSBdID0gMTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXZhciB4ID0gcS5feCwgeSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdzsKCQkJdmFyIHgyID0geCArIHgsIHkyID0geSArIHksIHoyID0geiArIHo7CgkJCXZhciB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6ID0geCAqIHoyOwoJCQl2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6MjsKCQkJdmFyIHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7CgoJCQl0ZVsgMCBdID0gMSAtICggeXkgKyB6eiApOwoJCQl0ZVsgNCBdID0geHkgLSB3ejsKCQkJdGVbIDggXSA9IHh6ICsgd3k7CgoJCQl0ZVsgMSBdID0geHkgKyB3ejsKCQkJdGVbIDUgXSA9IDEgLSAoIHh4ICsgenogKTsKCQkJdGVbIDkgXSA9IHl6IC0gd3g7CgoJCQl0ZVsgMiBdID0geHogLSB3eTsKCQkJdGVbIDYgXSA9IHl6ICsgd3g7CgkJCXRlWyAxMCBdID0gMSAtICggeHggKyB5eSApOwoKCQkJLy8gbGFzdCBjb2x1bW4KCQkJdGVbIDMgXSA9IDA7CgkJCXRlWyA3IF0gPSAwOwoJCQl0ZVsgMTEgXSA9IDA7CgoJCQkvLyBib3R0b20gcm93CgkJCXRlWyAxMiBdID0gMDsKCQkJdGVbIDEzIF0gPSAwOwoJCQl0ZVsgMTQgXSA9IDA7CgkJCXRlWyAxNSBdID0gMTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlsb29rQXQ6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB4ID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHkgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgeiA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7CgoJCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCQl6LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7CgoJCQkJaWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7CgoJCQkJCS8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbgoKCQkJCQl6LnogPSAxOwoKCQkJCX0KCgkJCQl6Lm5vcm1hbGl6ZSgpOwoJCQkJeC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7CgoJCQkJaWYgKCB4Lmxlbmd0aFNxKCkgPT09IDAgKSB7CgoJCQkJCS8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbAoKCQkJCQlpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEgKSB7CgoJCQkJCQl6LnggKz0gMC4wMDAxOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJei56ICs9IDAuMDAwMTsKCgkJCQkJfQoKCQkJCQl6Lm5vcm1hbGl6ZSgpOwoJCQkJCXguY3Jvc3NWZWN0b3JzKCB1cCwgeiApOwoKCQkJCX0KCgkJCQl4Lm5vcm1hbGl6ZSgpOwoJCQkJeS5jcm9zc1ZlY3RvcnMoIHosIHggKTsKCgkJCQl0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54OwoJCQkJdGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTsKCQkJCXRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56OwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQltdWx0aXBseTogZnVuY3Rpb24gKCBtLCBuICkgewoKCQkJaWYgKCBuICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApOwoJCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApOwoKCQl9LAoKCQlwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkgewoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApOwoKCQl9LAoKCQltdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgoJCQl2YXIgYWUgPSBhLmVsZW1lbnRzOwoJCQl2YXIgYmUgPSBiLmVsZW1lbnRzOwoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKCQkJdmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdOwoJCQl2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDUgXSwgYTIzID0gYWVbIDkgXSwgYTI0ID0gYWVbIDEzIF07CgkJCXZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07CgkJCXZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07CgoJCQl2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07CgkJCXZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsgMTMgXTsKCQkJdmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBiMzQgPSBiZVsgMTQgXTsKCQkJdmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTsKCgkJCXRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7CgkJCXRlWyA0IF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzIgKyBhMTQgKiBiNDI7CgkJCXRlWyA4IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7CgkJCXRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0OwoKCQkJdGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTsKCQkJdGVbIDUgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0MjsKCQkJdGVbIDkgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMyArIGEyNCAqIGI0MzsKCQkJdGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7CgoJCQl0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxOwoJCQl0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyICsgYTM0ICogYjQyOwoJCQl0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0MzsKCQkJdGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7CgoJCQl0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxOwoJCQl0ZVsgNyBdID0gYTQxICogYjEyICsgYTQyICogYjIyICsgYTQzICogYjMyICsgYTQ0ICogYjQyOwoJCQl0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0MzsKCQkJdGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgoJCQl0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzOwoJCQl0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzOwoJCQl0ZVsgMiBdICo9IHM7IHRlWyA2IF0gKj0gczsgdGVbIDEwIF0gKj0gczsgdGVbIDE0IF0gKj0gczsKCQkJdGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHsKCgkJCQkJdjEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7CgkJCQkJdjEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7CgkJCQkJdjEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7CgoJCQkJCXYxLmFwcGx5TWF0cml4NCggdGhpcyApOwoKCQkJCQlhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7CgoJCQkJfQoKCQkJCXJldHVybiBhdHRyaWJ1dGU7CgoJCQl9OwoKCQl9KCksCgoJCWRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKCQkJdmFyIG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRlWyA0IF0sIG4xMyA9IHRlWyA4IF0sIG4xNCA9IHRlWyAxMiBdOwoJCQl2YXIgbjIxID0gdGVbIDEgXSwgbjIyID0gdGVbIDUgXSwgbjIzID0gdGVbIDkgXSwgbjI0ID0gdGVbIDEzIF07CgkJCXZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07CgkJCXZhciBuNDEgPSB0ZVsgMyBdLCBuNDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07CgoJCQkvL1RPRE86IG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudAoJCQkvLyggYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtICkKCgkJCXJldHVybiAoCgkJCQluNDEgKiAoCgkJCQkJKyBuMTQgKiBuMjMgKiBuMzIKCQkJCQkgLSBuMTMgKiBuMjQgKiBuMzIKCQkJCQkgLSBuMTQgKiBuMjIgKiBuMzMKCQkJCQkgKyBuMTIgKiBuMjQgKiBuMzMKCQkJCQkgKyBuMTMgKiBuMjIgKiBuMzQKCQkJCQkgLSBuMTIgKiBuMjMgKiBuMzQKCQkJCSkgKwoJCQkJbjQyICogKAoJCQkJCSsgbjExICogbjIzICogbjM0CgkJCQkJIC0gbjExICogbjI0ICogbjMzCgkJCQkJICsgbjE0ICogbjIxICogbjMzCgkJCQkJIC0gbjEzICogbjIxICogbjM0CgkJCQkJICsgbjEzICogbjI0ICogbjMxCgkJCQkJIC0gbjE0ICogbjIzICogbjMxCgkJCQkpICsKCQkJCW40MyAqICgKCQkJCQkrIG4xMSAqIG4yNCAqIG4zMgoJCQkJCSAtIG4xMSAqIG4yMiAqIG4zNAoJCQkJCSAtIG4xNCAqIG4yMSAqIG4zMgoJCQkJCSArIG4xMiAqIG4yMSAqIG4zNAoJCQkJCSArIG4xNCAqIG4yMiAqIG4zMQoJCQkJCSAtIG4xMiAqIG4yNCAqIG4zMQoJCQkJKSArCgkJCQluNDQgKiAoCgkJCQkJLSBuMTMgKiBuMjIgKiBuMzEKCQkJCQkgLSBuMTEgKiBuMjMgKiBuMzIKCQkJCQkgKyBuMTEgKiBuMjIgKiBuMzMKCQkJCQkgKyBuMTMgKiBuMjEgKiBuMzIKCQkJCQkgLSBuMTIgKiBuMjEgKiBuMzMKCQkJCQkgKyBuMTIgKiBuMjMgKiBuMzEKCQkJCSkKCgkJCSk7CgoJCX0sCgoJCXRyYW5zcG9zZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCQkJdmFyIHRtcDsKCgkJCXRtcCA9IHRlWyAxIF07IHRlWyAxIF0gPSB0ZVsgNCBdOyB0ZVsgNCBdID0gdG1wOwoJCQl0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDsKCQkJdG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7CgoJCQl0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wOwoJCQl0bXAgPSB0ZVsgNyBdOyB0ZVsgNyBdID0gdGVbIDEzIF07IHRlWyAxMyBdID0gdG1wOwoJCQl0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0UG9zaXRpb246IGZ1bmN0aW9uICggdiApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgoJCQl0ZVsgMTIgXSA9IHYueDsKCQkJdGVbIDEzIF0gPSB2Lnk7CgkJCXRlWyAxNCBdID0gdi56OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7CgoJCQkvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG0KCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50cywKCQkJCW1lID0gbS5lbGVtZW50cywKCgkJCQluMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLAoJCQkJbjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSwKCQkJCW4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSwKCQkJCW4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLAoKCQkJCXQxMSA9IG4yMyAqIG4zNCAqIG40MiAtIG4yNCAqIG4zMyAqIG40MiArIG4yNCAqIG4zMiAqIG40MyAtIG4yMiAqIG4zNCAqIG40MyAtIG4yMyAqIG4zMiAqIG40NCArIG4yMiAqIG4zMyAqIG40NCwKCQkJCXQxMiA9IG4xNCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCwKCQkJCXQxMyA9IG4xMyAqIG4yNCAqIG40MiAtIG4xNCAqIG4yMyAqIG40MiArIG4xNCAqIG4yMiAqIG40MyAtIG4xMiAqIG4yNCAqIG40MyAtIG4xMyAqIG4yMiAqIG40NCArIG4xMiAqIG4yMyAqIG40NCwKCQkJCXQxNCA9IG4xNCAqIG4yMyAqIG4zMiAtIG4xMyAqIG4yNCAqIG4zMiAtIG4xNCAqIG4yMiAqIG4zMyArIG4xMiAqIG4yNCAqIG4zMyArIG4xMyAqIG4yMiAqIG4zNCAtIG4xMiAqIG4yMyAqIG4zNDsKCgkJCXZhciBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7CgoJCQlpZiAoIGRldCA9PT0gMCApIHsKCgkJCQl2YXIgbXNnID0gIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCI7CgoJCQkJaWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHsKCgkJCQkJdGhyb3cgbmV3IEVycm9yKCBtc2cgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQljb25zb2xlLndhcm4oIG1zZyApOwoKCQkJCX0KCgkJCQlyZXR1cm4gdGhpcy5pZGVudGl0eSgpOwoKCQkJfQoKCQkJdmFyIGRldEludiA9IDEgLyBkZXQ7CgoJCQl0ZVsgMCBdID0gdDExICogZGV0SW52OwoJCQl0ZVsgMSBdID0gKCBuMjQgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzEgKiBuNDMgKyBuMjEgKiBuMzQgKiBuNDMgKyBuMjMgKiBuMzEgKiBuNDQgLSBuMjEgKiBuMzMgKiBuNDQgKSAqIGRldEludjsKCQkJdGVbIDIgXSA9ICggbjIyICogbjM0ICogbjQxIC0gbjI0ICogbjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0gbjIyICogbjMxICogbjQ0ICsgbjIxICogbjMyICogbjQ0ICkgKiBkZXRJbnY7CgkJCXRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52OwoKCQkJdGVbIDQgXSA9IHQxMiAqIGRldEludjsKCQkJdGVbIDUgXSA9ICggbjEzICogbjM0ICogbjQxIC0gbjE0ICogbjMzICogbjQxICsgbjE0ICogbjMxICogbjQzIC0gbjExICogbjM0ICogbjQzIC0gbjEzICogbjMxICogbjQ0ICsgbjExICogbjMzICogbjQ0ICkgKiBkZXRJbnY7CgkJCXRlWyA2IF0gPSAoIG4xNCAqIG4zMiAqIG40MSAtIG4xMiAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMSAqIG40MiArIG4xMSAqIG4zNCAqIG40MiArIG4xMiAqIG4zMSAqIG40NCAtIG4xMSAqIG4zMiAqIG40NCApICogZGV0SW52OwoJCQl0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjsKCgkJCXRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7CgkJCXRlWyA5IF0gPSAoIG4xNCAqIG4yMyAqIG40MSAtIG4xMyAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMSAqIG40MyArIG4xMSAqIG4yNCAqIG40MyArIG4xMyAqIG4yMSAqIG40NCAtIG4xMSAqIG4yMyAqIG40NCApICogZGV0SW52OwoJCQl0ZVsgMTAgXSA9ICggbjEyICogbjI0ICogbjQxIC0gbjE0ICogbjIyICogbjQxICsgbjE0ICogbjIxICogbjQyIC0gbjExICogbjI0ICogbjQyIC0gbjEyICogbjIxICogbjQ0ICsgbjExICogbjIyICogbjQ0ICkgKiBkZXRJbnY7CgkJCXRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjsKCgkJCXRlWyAxMiBdID0gdDE0ICogZGV0SW52OwoJCQl0ZVsgMTMgXSA9ICggbjEzICogbjI0ICogbjMxIC0gbjE0ICogbjIzICogbjMxICsgbjE0ICogbjIxICogbjMzIC0gbjExICogbjI0ICogbjMzIC0gbjEzICogbjIxICogbjM0ICsgbjExICogbjIzICogbjM0ICkgKiBkZXRJbnY7CgkJCXRlWyAxNCBdID0gKCBuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQgLSBuMTEgKiBuMjIgKiBuMzQgKSAqIGRldEludjsKCQkJdGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNjYWxlOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoJCQl2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejsKCgkJCXRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7CgkJCXRlWyAxIF0gKj0geDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7CgkJCXRlWyAyIF0gKj0geDsgdGVbIDYgXSAqPSB5OyB0ZVsgMTAgXSAqPSB6OwoJCQl0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlnZXRNYXhTY2FsZU9uQXhpczogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXZhciBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsgMiBdICogdGVbIDIgXTsKCQkJdmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdOwoJCQl2YXIgc2NhbGVaU3EgPSB0ZVsgOCBdICogdGVbIDggXSArIHRlWyA5IF0gKiB0ZVsgOSBdICsgdGVbIDEwIF0gKiB0ZVsgMTAgXTsKCgkJCXJldHVybiBNYXRoLnNxcnQoIE1hdGgubWF4KCBzY2FsZVhTcSwgc2NhbGVZU3EsIHNjYWxlWlNxICkgKTsKCgkJfSwKCgkJbWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CgoJCQl0aGlzLnNldCgKCgkJCQkxLCAwLCAwLCB4LAoJCQkJMCwgMSwgMCwgeSwKCQkJCTAsIDAsIDEsIHosCgkJCQkwLCAwLCAwLCAxCgoJCQkpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1ha2VSb3RhdGlvblg6IGZ1bmN0aW9uICggdGhldGEgKSB7CgoJCQl2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7CgoJCQl0aGlzLnNldCgKCgkJCQkxLCAwLCAwLCAwLAoJCQkJMCwgYywgLSBzLCAwLAoJCQkJMCwgcywgYywgMCwKCQkJCTAsIDAsIDAsIDEKCgkJCSk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbWFrZVJvdGF0aW9uWTogZnVuY3Rpb24gKCB0aGV0YSApIHsKCgkJCXZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTsKCgkJCXRoaXMuc2V0KAoKCQkJCSBjLCAwLCBzLCAwLAoJCQkJIDAsIDEsIDAsIDAsCgkJCQktIHMsIDAsIGMsIDAsCgkJCQkgMCwgMCwgMCwgMQoKCQkJKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkgewoKCQkJdmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApOwoKCQkJdGhpcy5zZXQoCgoJCQkJYywgLSBzLCAwLCAwLAoJCQkJcywgYywgMCwgMCwKCQkJCTAsIDAsIDEsIDAsCgkJCQkwLCAwLCAwLCAxCgoJCQkpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1ha2VSb3RhdGlvbkF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CgoJCQkvLyBCYXNlZCBvbiBodHRwOi8vd3d3LmdhbWVkZXYubmV0L3JlZmVyZW5jZS9hcnRpY2xlcy9hcnRpY2xlMTE5OS5hc3AKCgkJCXZhciBjID0gTWF0aC5jb3MoIGFuZ2xlICk7CgkJCXZhciBzID0gTWF0aC5zaW4oIGFuZ2xlICk7CgkJCXZhciB0ID0gMSAtIGM7CgkJCXZhciB4ID0gYXhpcy54LCB5ID0gYXhpcy55LCB6ID0gYXhpcy56OwoJCQl2YXIgdHggPSB0ICogeCwgdHkgPSB0ICogeTsKCgkJCXRoaXMuc2V0KAoKCQkJCXR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICogeSwgMCwKCQkJCXR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCwKCQkJCXR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCwKCQkJCTAsIDAsIDAsIDEKCgkJCSk7CgoJCQkgcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKCQkJdGhpcy5zZXQoCgoJCQkJeCwgMCwgMCwgMCwKCQkJCTAsIHksIDAsIDAsCgkJCQkwLCAwLCB6LCAwLAoJCQkJMCwgMCwgMCwgMQoKCQkJKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltYWtlU2hlYXI6IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKCgkJCXRoaXMuc2V0KAoKCQkJCTEsIHksIHosIDAsCgkJCQl4LCAxLCB6LCAwLAoJCQkJeCwgeSwgMSwgMCwKCQkJCTAsIDAsIDAsIDEKCgkJCSk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY29tcG9zZTogZnVuY3Rpb24gKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7CgoJCQl0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CgkJCXRoaXMuc2NhbGUoIHNjYWxlICk7CgkJCXRoaXMuc2V0UG9zaXRpb24oIHBvc2l0aW9uICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7CgoJCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCQl2YXIgc3ggPSB2ZWN0b3Iuc2V0KCB0ZVsgMCBdLCB0ZVsgMSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7CgkJCQl2YXIgc3kgPSB2ZWN0b3Iuc2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7CgkJCQl2YXIgc3ogPSB2ZWN0b3Iuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpOwoKCQkJCS8vIGlmIGRldGVybWluZSBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBpbnZlcnQgb25lIHNjYWxlCgkJCQl2YXIgZGV0ID0gdGhpcy5kZXRlcm1pbmFudCgpOwoJCQkJaWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4OwoKCQkJCXBvc2l0aW9uLnggPSB0ZVsgMTIgXTsKCQkJCXBvc2l0aW9uLnkgPSB0ZVsgMTMgXTsKCQkJCXBvc2l0aW9uLnogPSB0ZVsgMTQgXTsKCgkJCQkvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydAoJCQkJbWF0cml4LmNvcHkoIHRoaXMgKTsKCgkJCQl2YXIgaW52U1ggPSAxIC8gc3g7CgkJCQl2YXIgaW52U1kgPSAxIC8gc3k7CgkJCQl2YXIgaW52U1ogPSAxIC8gc3o7CgoJCQkJbWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7CgkJCQltYXRyaXguZWxlbWVudHNbIDEgXSAqPSBpbnZTWDsKCQkJCW1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGludlNYOwoKCQkJCW1hdHJpeC5lbGVtZW50c1sgNCBdICo9IGludlNZOwoJCQkJbWF0cml4LmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7CgkJCQltYXRyaXguZWxlbWVudHNbIDYgXSAqPSBpbnZTWTsKCgkJCQltYXRyaXguZWxlbWVudHNbIDggXSAqPSBpbnZTWjsKCQkJCW1hdHJpeC5lbGVtZW50c1sgOSBdICo9IGludlNaOwoJCQkJbWF0cml4LmVsZW1lbnRzWyAxMCBdICo9IGludlNaOwoKCQkJCXF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTsKCgkJCQlzY2FsZS54ID0gc3g7CgkJCQlzY2FsZS55ID0gc3k7CgkJCQlzY2FsZS56ID0gc3o7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCW1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHsKCgkJCWlmICggZmFyID09PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLicgKTsKCgkJCX0KCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgkJCXZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApOwoJCQl2YXIgeSA9IDIgKiBuZWFyIC8gKCB0b3AgLSBib3R0b20gKTsKCgkJCXZhciBhID0gKCByaWdodCArIGxlZnQgKSAvICggcmlnaHQgLSBsZWZ0ICk7CgkJCXZhciBiID0gKCB0b3AgKyBib3R0b20gKSAvICggdG9wIC0gYm90dG9tICk7CgkJCXZhciBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApOwoJCQl2YXIgZCA9IC0gMiAqIGZhciAqIG5lYXIgLyAoIGZhciAtIG5lYXIgKTsKCgkJCXRlWyAwIF0gPSB4Owl0ZVsgNCBdID0gMDsJdGVbIDggXSA9IGE7CXRlWyAxMiBdID0gMDsKCQkJdGVbIDEgXSA9IDA7CXRlWyA1IF0gPSB5Owl0ZVsgOSBdID0gYjsJdGVbIDEzIF0gPSAwOwoJCQl0ZVsgMiBdID0gMDsJdGVbIDYgXSA9IDA7CXRlWyAxMCBdID0gYzsJdGVbIDE0IF0gPSBkOwoJCQl0ZVsgMyBdID0gMDsJdGVbIDcgXSA9IDA7CXRlWyAxMSBdID0gLSAxOwl0ZVsgMTUgXSA9IDA7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbWFrZU9ydGhvZ3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgkJCXZhciB3ID0gMS4wIC8gKCByaWdodCAtIGxlZnQgKTsKCQkJdmFyIGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApOwoJCQl2YXIgcCA9IDEuMCAvICggZmFyIC0gbmVhciApOwoKCQkJdmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdzsKCQkJdmFyIHkgPSAoIHRvcCArIGJvdHRvbSApICogaDsKCQkJdmFyIHogPSAoIGZhciArIG5lYXIgKSAqIHA7CgoJCQl0ZVsgMCBdID0gMiAqIHc7CXRlWyA0IF0gPSAwOwl0ZVsgOCBdID0gMDsJdGVbIDEyIF0gPSAtIHg7CgkJCXRlWyAxIF0gPSAwOwl0ZVsgNSBdID0gMiAqIGg7CXRlWyA5IF0gPSAwOwl0ZVsgMTMgXSA9IC0geTsKCQkJdGVbIDIgXSA9IDA7CXRlWyA2IF0gPSAwOwl0ZVsgMTAgXSA9IC0gMiAqIHA7CXRlWyAxNCBdID0gLSB6OwoJCQl0ZVsgMyBdID0gMDsJdGVbIDcgXSA9IDA7CXRlWyAxMSBdID0gMDsJdGVbIDE1IF0gPSAxOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoJCQl2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHsKCgkJCQlpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7CgoJCQl9CgoJCQlyZXR1cm4gdHJ1ZTsKCgkJfSwKCgkJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgoJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkgewoKCQkJCXRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKCQkJYXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTsKCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07CgkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdOwoJCQlhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTsKCgkJCWFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdOwoJCQlhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTsKCQkJYXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07CgkJCWFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdOwoKCQkJYXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07CgkJCWFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdOwoJCQlhcnJheVsgb2Zmc2V0ICsgMTAgXSA9IHRlWyAxMCBdOwoJCQlhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdOwoKCQkJYXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTsKCQkJYXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTsKCQkJYXJyYXlbIG9mZnNldCArIDE0IF0gPSB0ZVsgMTQgXTsKCQkJYXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTsKCgkJCXJldHVybiBhcnJheTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCgkgKi8KCglmdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkgewoKCQl0aGlzLl94ID0geCB8fCAwOwoJCXRoaXMuX3kgPSB5IHx8IDA7CgkJdGhpcy5feiA9IHogfHwgMDsKCQl0aGlzLl93ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxOwoKCX0KCglPYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLCB7CgoJCXNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7CgoJCQlyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTsKCgkJfSwKCgkJc2xlcnBGbGF0OiBmdW5jdGlvbiAoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxLCB0ICkgewoKCQkJLy8gZnV6ei1mcmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNMRVJQIG9wZXJhdGlvbgoKCQkJdmFyIHgwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDAgXSwKCQkJCXkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXSwKCQkJCXowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXSwKCQkJCXcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXSwKCgkJCQl4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sCgkJCQl5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sCgkJCQl6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sCgkJCQl3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07CgoJCQlpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHsKCgkJCQl2YXIgcyA9IDEgLSB0LAoKCQkJCQljb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLAoKCQkJCQlkaXIgPSAoIGNvcyA+PSAwID8gMSA6IC0gMSApLAoJCQkJCXNxclNpbiA9IDEgLSBjb3MgKiBjb3M7CgoJCQkJLy8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczoKCQkJCWlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7CgoJCQkJCXZhciBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLAoJCQkJCQlsZW4gPSBNYXRoLmF0YW4yKCBzaW4sIGNvcyAqIGRpciApOwoKCQkJCQlzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjsKCQkJCQl0ID0gTWF0aC5zaW4oIHQgKiBsZW4gKSAvIHNpbjsKCgkJCQl9CgoJCQkJdmFyIHREaXIgPSB0ICogZGlyOwoKCQkJCXgwID0geDAgKiBzICsgeDEgKiB0RGlyOwoJCQkJeTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7CgkJCQl6MCA9IHowICogcyArIHoxICogdERpcjsKCQkJCXcwID0gdzAgKiBzICsgdzEgKiB0RGlyOwoKCQkJCS8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDoKCQkJCWlmICggcyA9PT0gMSAtIHQgKSB7CgoJCQkJCXZhciBmID0gMSAvIE1hdGguc3FydCggeDAgKiB4MCArIHkwICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApOwoKCQkJCQl4MCAqPSBmOwoJCQkJCXkwICo9IGY7CgkJCQkJejAgKj0gZjsKCQkJCQl3MCAqPSBmOwoKCQkJCX0KCgkJCX0KCgkJCWRzdFsgZHN0T2Zmc2V0IF0gPSB4MDsKCQkJZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDsKCQkJZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDsKCQkJZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MDsKCgkJfQoKCX0gKTsKCglPYmplY3QuZGVmaW5lUHJvcGVydGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHsKCgkJeDogewoKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuX3g7CgoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCXRoaXMuX3ggPSB2YWx1ZTsKCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwoKCQkJfQoKCQl9LAoKCQl5OiB7CgoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQlyZXR1cm4gdGhpcy5feTsKCgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJdGhpcy5feSA9IHZhbHVlOwoJCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CgoJCQl9CgoJCX0sCgoJCXo6IHsKCgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiB0aGlzLl96OwoKCQkJfSwKCgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQl0aGlzLl96ID0gdmFsdWU7CgkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCX0KCgkJfSwKCgkJdzogewoKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuX3c7CgoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCXRoaXMuX3cgPSB2YWx1ZTsKCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwoKCQkJfQoKCQl9CgoJfSApOwoKCU9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24ucHJvdG90eXBlLCB7CgoJCXNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkgewoKCQkJdGhpcy5feCA9IHg7CgkJCXRoaXMuX3kgPSB5OwoJCQl0aGlzLl96ID0gejsKCQkJdGhpcy5fdyA9IHc7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl93ICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHsKCgkJCXRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7CgkJCXRoaXMuX3kgPSBxdWF0ZXJuaW9uLnk7CgkJCXRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7CgkJCXRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHsKCgkJCWlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHsKCgkJCQl0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7CgoJCQl9CgoJCQl2YXIgeCA9IGV1bGVyLl94LCB5ID0gZXVsZXIuX3ksIHogPSBldWxlci5feiwgb3JkZXIgPSBldWxlci5vcmRlcjsKCgkJCS8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS8KCQkJLy8gCTIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzLwoJCQkvLwljb250ZW50L1NwaW5DYWxjLm0KCgkJCXZhciBjb3MgPSBNYXRoLmNvczsKCQkJdmFyIHNpbiA9IE1hdGguc2luOwoKCQkJdmFyIGMxID0gY29zKCB4IC8gMiApOwoJCQl2YXIgYzIgPSBjb3MoIHkgLyAyICk7CgkJCXZhciBjMyA9IGNvcyggeiAvIDIgKTsKCgkJCXZhciBzMSA9IHNpbiggeCAvIDIgKTsKCQkJdmFyIHMyID0gc2luKCB5IC8gMiApOwoJCQl2YXIgczMgPSBzaW4oIHogLyAyICk7CgoJCQlpZiAoIG9yZGVyID09PSAnWFlaJyApIHsKCgkJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzOwoJCQkJdGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMzsKCQkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CgkJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzOwoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkgewoKCQkJCXRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7CgkJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOwoJCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMzsKCQkJCXRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7CgoJCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7CgoJCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKCQkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7CgkJCQl0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzOwoJCQkJdGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKCgkJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHsKCgkJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzOwoJCQkJdGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMzsKCQkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CgkJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzOwoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkgewoKCQkJCXRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7CgkJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzOwoJCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMzsKCQkJCXRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7CgoJCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7CgoJCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKCQkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CgkJCQl0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzOwoJCQkJdGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKCgkJCX0KCgkJCWlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CgoJCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtCgoJCQkvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZAoKCQkJdmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTsKCgkJCXRoaXMuX3ggPSBheGlzLnggKiBzOwoJCQl0aGlzLl95ID0gYXhpcy55ICogczsKCQkJdGhpcy5feiA9IGF4aXMueiAqIHM7CgkJCXRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKCgkJCS8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb1F1YXRlcm5pb24vaW5kZXguaHRtCgoJCQkvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKQoKCQkJdmFyIHRlID0gbS5lbGVtZW50cywKCgkJCQltMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLAoJCQkJbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSwKCQkJCW0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLAoKCQkJCXRyYWNlID0gbTExICsgbTIyICsgbTMzLAoJCQkJczsKCgkJCWlmICggdHJhY2UgPiAwICkgewoKCQkJCXMgPSAwLjUgLyBNYXRoLnNxcnQoIHRyYWNlICsgMS4wICk7CgoJCQkJdGhpcy5fdyA9IDAuMjUgLyBzOwoJCQkJdGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzOwoJCQkJdGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzOwoJCQkJdGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzOwoKCQkJfSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHsKCgkJCQlzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTsKCgkJCQl0aGlzLl93ID0gKCBtMzIgLSBtMjMgKSAvIHM7CgkJCQl0aGlzLl94ID0gMC4yNSAqIHM7CgkJCQl0aGlzLl95ID0gKCBtMTIgKyBtMjEgKSAvIHM7CgkJCQl0aGlzLl96ID0gKCBtMTMgKyBtMzEgKSAvIHM7CgoJCQl9IGVsc2UgaWYgKCBtMjIgPiBtMzMgKSB7CgoJCQkJcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7CgoJCQkJdGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzOwoJCQkJdGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzOwoJCQkJdGhpcy5feSA9IDAuMjUgKiBzOwoJCQkJdGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzOwoKCQkJfSBlbHNlIHsKCgkJCQlzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMzMgLSBtMTEgLSBtMjIgKTsKCgkJCQl0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7CgkJCQl0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7CgkJCQl0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7CgkJCQl0aGlzLl96ID0gMC4yNSAqIHM7CgoJCQl9CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZAoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHI7CgoJCQl2YXIgRVBTID0gMC4wMDAwMDE7CgoJCQlyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkgewoKCQkJCWlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCQlyID0gdkZyb20uZG90KCB2VG8gKSArIDE7CgoJCQkJaWYgKCByIDwgRVBTICkgewoKCQkJCQlyID0gMDsKCgkJCQkJaWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHsKCgkJCQkJCXYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQl2MS5zZXQoIDAsIC0gdkZyb20ueiwgdkZyb20ueSApOwoKCQkJCQl9CgoJCQkJfSBlbHNlIHsKCgkJCQkJdjEuY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7CgoJCQkJfQoKCQkJCXRoaXMuX3ggPSB2MS54OwoJCQkJdGhpcy5feSA9IHYxLnk7CgkJCQl0aGlzLl96ID0gdjEuejsKCQkJCXRoaXMuX3cgPSByOwoKCQkJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgpOwoKCQkJfTsKCgkJfSgpLAoKCQlpbnZlcnNlOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5jb25qdWdhdGUoKS5ub3JtYWxpemUoKTsKCgkJfSwKCgkJY29uanVnYXRlOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLl94ICo9IC0gMTsKCQkJdGhpcy5feSAqPSAtIDE7CgkJCXRoaXMuX3ogKj0gLSAxOwoKCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZG90OiBmdW5jdGlvbiAoIHYgKSB7CgoJCQlyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7CgoJCX0sCgoJCWxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7CgoJCX0sCgoJCWxlbmd0aDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTsKCgkJfSwKCgkJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgbCA9IHRoaXMubGVuZ3RoKCk7CgoJCQlpZiAoIGwgPT09IDAgKSB7CgoJCQkJdGhpcy5feCA9IDA7CgkJCQl0aGlzLl95ID0gMDsKCQkJCXRoaXMuX3ogPSAwOwoJCQkJdGhpcy5fdyA9IDE7CgoJCQl9IGVsc2UgewoKCQkJCWwgPSAxIC8gbDsKCgkJCQl0aGlzLl94ID0gdGhpcy5feCAqIGw7CgkJCQl0aGlzLl95ID0gdGhpcy5feSAqIGw7CgkJCQl0aGlzLl96ID0gdGhpcy5feiAqIGw7CgkJCQl0aGlzLl93ID0gdGhpcy5fdyAqIGw7CgoJCQl9CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkgewoKCQkJaWYgKCBwICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuJyApOwoJCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgcCApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggdGhpcywgcSApOwoKCQl9LAoKCQlwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkgewoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApOwoKCQl9LAoKCQltdWx0aXBseVF1YXRlcm5pb25zOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgoJCQkvLyBmcm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG0KCgkJCXZhciBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93OwoJCQl2YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdzsKCgkJCXRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7CgkJCXRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7CgkJCXRoaXMuX3ogPSBxYXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7CgkJCXRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzbGVycDogZnVuY3Rpb24gKCBxYiwgdCApIHsKCgkJCWlmICggdCA9PT0gMCApIHJldHVybiB0aGlzOwoJCQlpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApOwoKCQkJdmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93OwoKCQkJLy8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC8KCgkJCXZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7CgoJCQlpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7CgoJCQkJdGhpcy5fdyA9IC0gcWIuX3c7CgkJCQl0aGlzLl94ID0gLSBxYi5feDsKCQkJCXRoaXMuX3kgPSAtIHFiLl95OwoJCQkJdGhpcy5feiA9IC0gcWIuX3o7CgoJCQkJY29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7CgoJCQl9IGVsc2UgewoKCQkJCXRoaXMuY29weSggcWIgKTsKCgkJCX0KCgkJCWlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHsKCgkJCQl0aGlzLl93ID0gdzsKCQkJCXRoaXMuX3ggPSB4OwoJCQkJdGhpcy5feSA9IHk7CgkJCQl0aGlzLl96ID0gejsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX0KCgkJCXZhciBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YSApOwoKCQkJaWYgKCBNYXRoLmFicyggc2luSGFsZlRoZXRhICkgPCAwLjAwMSApIHsKCgkJCQl0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApOwoJCQkJdGhpcy5feCA9IDAuNSAqICggeCArIHRoaXMuX3ggKTsKCQkJCXRoaXMuX3kgPSAwLjUgKiAoIHkgKyB0aGlzLl95ICk7CgkJCQl0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfQoKCQkJdmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7CgkJCXZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsCgkJCQlyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhOwoKCQkJdGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTsKCQkJdGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTsKCQkJdGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0IgKTsKCQkJdGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTsKCgkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWVxdWFsczogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkgewoKCQkJcmV0dXJuICggcXVhdGVybmlvbi5feCA9PT0gdGhpcy5feCApICYmICggcXVhdGVybmlvbi5feSA9PT0gdGhpcy5feSApICYmICggcXVhdGVybmlvbi5feiA9PT0gdGhpcy5feiApICYmICggcXVhdGVybmlvbi5fdyA9PT0gdGhpcy5fdyApOwoKCQl9LAoKCQlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCgkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKCQkJdGhpcy5feCA9IGFycmF5WyBvZmZzZXQgXTsKCQkJdGhpcy5feSA9IGFycmF5WyBvZmZzZXQgKyAxIF07CgkJCXRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdOwoJCQl0aGlzLl93ID0gYXJyYXlbIG9mZnNldCArIDMgXTsKCgkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCgkJCWlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107CgkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKCQkJYXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDsKCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7CgkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96OwoJCQlhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdzsKCgkJCXJldHVybiBhcnJheTsKCgkJfSwKCgkJb25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjazsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvCgkgKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnLwoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqLwoKCWZ1bmN0aW9uIFZlY3RvcjMoIHgsIHksIHogKSB7CgoJCXRoaXMueCA9IHggfHwgMDsKCQl0aGlzLnkgPSB5IHx8IDA7CgkJdGhpcy56ID0geiB8fCAwOwoKCX0KCglPYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwgewoKCQlpc1ZlY3RvcjM6IHRydWUsCgoJCXNldDogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKCQkJdGhpcy54ID0geDsKCQkJdGhpcy55ID0geTsKCQkJdGhpcy56ID0gejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJdGhpcy54ID0gc2NhbGFyOwoJCQl0aGlzLnkgPSBzY2FsYXI7CgkJCXRoaXMueiA9IHNjYWxhcjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRYOiBmdW5jdGlvbiAoIHggKSB7CgoJCQl0aGlzLnggPSB4OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFk6IGZ1bmN0aW9uICggeSApIHsKCgkJCXRoaXMueSA9IHk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0WjogZnVuY3Rpb24gKCB6ICkgewoKCQkJdGhpcy56ID0gejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkgewoKCQkJc3dpdGNoICggaW5kZXggKSB7CgoJCQkJY2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7CgkJCQljYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhazsKCQkJCWNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrOwoJCQkJZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7CgoJCQlzd2l0Y2ggKCBpbmRleCApIHsKCgkJCQljYXNlIDA6IHJldHVybiB0aGlzLng7CgkJCQljYXNlIDE6IHJldHVybiB0aGlzLnk7CgkJCQljYXNlIDI6IHJldHVybiB0aGlzLno7CgkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwoKCQkJfQoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56ICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggdiApIHsKCgkJCXRoaXMueCA9IHYueDsKCQkJdGhpcy55ID0gdi55OwoJCQl0aGlzLnogPSB2Lno7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7CgoJCQlpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOwoJCQkJcmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApOwoKCQkJfQoKCQkJdGhpcy54ICs9IHYueDsKCQkJdGhpcy55ICs9IHYueTsKCQkJdGhpcy56ICs9IHYuejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKCgkJCXRoaXMueCArPSBzOwoJCQl0aGlzLnkgKz0gczsKCQkJdGhpcy56ICs9IHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKCQkJdGhpcy54ID0gYS54ICsgYi54OwoJCQl0aGlzLnkgPSBhLnkgKyBiLnk7CgkJCXRoaXMueiA9IGEueiArIGIuejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHsKCgkJCXRoaXMueCArPSB2LnggKiBzOwoJCQl0aGlzLnkgKz0gdi55ICogczsKCQkJdGhpcy56ICs9IHYueiAqIHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7CgoJCQlpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOwoJCQkJcmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApOwoKCQkJfQoKCQkJdGhpcy54IC09IHYueDsKCQkJdGhpcy55IC09IHYueTsKCQkJdGhpcy56IC09IHYuejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKCgkJCXRoaXMueCAtPSBzOwoJCQl0aGlzLnkgLT0gczsKCQkJdGhpcy56IC09IHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKCQkJdGhpcy54ID0gYS54IC0gYi54OwoJCQl0aGlzLnkgPSBhLnkgLSBiLnk7CgkJCXRoaXMueiA9IGEueiAtIGIuejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltdWx0aXBseTogZnVuY3Rpb24gKCB2LCB3ICkgewoKCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CgkJCQlyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTsKCgkJCX0KCgkJCXRoaXMueCAqPSB2Lng7CgkJCXRoaXMueSAqPSB2Lnk7CgkJCXRoaXMueiAqPSB2Lno7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJdGhpcy54ICo9IHNjYWxhcjsKCQkJdGhpcy55ICo9IHNjYWxhcjsKCQkJdGhpcy56ICo9IHNjYWxhcjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltdWx0aXBseVZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHsKCgkJCXRoaXMueCA9IGEueCAqIGIueDsKCQkJdGhpcy55ID0gYS55ICogYi55OwoJCQl0aGlzLnogPSBhLnogKiBiLno7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYXBwbHlFdWxlcjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGFwcGx5RXVsZXIoIGV1bGVyICkgewoKCQkJCWlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHsKCgkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7CgoJCQkJfQoKCQkJCXJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyICkgKTsKCgkJCX07CgoJCX0oKSwKCgkJYXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKCgkJCXJldHVybiBmdW5jdGlvbiBhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7CgoJCQkJcmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTsKCgkJCX07CgoJCX0oKSwKCgkJYXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7CgoJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejsKCQkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKCQkJdGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6OwoJCQl0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7CgkJCXRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHsKCgkJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OwoJCQl2YXIgZSA9IG0uZWxlbWVudHM7CgoJCQl2YXIgdyA9IDEgLyAoIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7CgoJCQl0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKSAqIHc7CgkJCXRoaXMueSA9ICggZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSApICogdzsKCQkJdGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKCgkJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OwoJCQl2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7CgoJCQkvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvcgoKCQkJdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5OwoJCQl2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7CgkJCXZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDsKCQkJdmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7CgoJCQkvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0CgoJCQl0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5OwoJCQl0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6OwoJCQl0aGlzLnogPSBpeiAqIHF3ICsgaXcgKiAtIHF6ICsgaXggKiAtIHF5IC0gaXkgKiAtIHF4OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXByb2plY3Q6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHByb2plY3QoIGNhbWVyYSApIHsKCgkJCQltYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApOwoJCQkJcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKCgkJCX07CgoJCX0oKSwKCgkJdW5wcm9qZWN0OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCgkJCXJldHVybiBmdW5jdGlvbiB1bnByb2plY3QoIGNhbWVyYSApIHsKCgkJCQltYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkLCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKSApOwoJCQkJcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKCgkJCX07CgoJCX0oKSwKCgkJdHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7CgoJCQkvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4CgkJCS8vIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvbgoKCQkJdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7CgkJCXZhciBlID0gbS5lbGVtZW50czsKCgkJCXRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejsKCQkJdGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6OwoJCQl0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6OwoKCQkJcmV0dXJuIHRoaXMubm9ybWFsaXplKCk7CgoJCX0sCgoJCWRpdmlkZTogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy54IC89IHYueDsKCQkJdGhpcy55IC89IHYueTsKCQkJdGhpcy56IC89IHYuejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTsKCgkJfSwKCgkJbWluOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQl0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTsKCQkJdGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7CgkJCXRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW1heDogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7CgkJCXRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApOwoJCQl0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKCgkJCS8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlCgoJCQl0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTsKCQkJdGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7CgkJCXRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5taW4oIG1heC56LCB0aGlzLnogKSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgbWluID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIG1heCA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkgewoKCQkJCW1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTsKCQkJCW1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTsKCgkJCQlyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTsKCgkJCX07CgoJCX0oKSwKCgkJY2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CgoJCQl2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTsKCgkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApOwoKCQl9LAoKCQlmbG9vcjogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7CgkJCXRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApOwoJCQl0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljZWlsOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApOwoJCQl0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApOwoJCQl0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXJvdW5kOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTsKCQkJdGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7CgkJCXRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTsKCQkJdGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7CgkJCXRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW5lZ2F0ZTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gLSB0aGlzLng7CgkJCXRoaXMueSA9IC0gdGhpcy55OwoJCQl0aGlzLnogPSAtIHRoaXMuejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkb3Q6IGZ1bmN0aW9uICggdiApIHsKCgkJCXJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2Lno7CgoJCX0sCgoJCS8vIFRPRE8gbGVuZ3RoU3F1YXJlZD8KCgkJbGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7CgoJCX0sCgoJCWxlbmd0aDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICk7CgoJCX0sCgoJCW1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTsKCgkJfSwKCgkJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApOwoKCQl9LAoKCQlzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkgewoKCQkJcmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApOwoKCQl9LAoKCQlsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkgewoKCQkJdGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTsKCQkJdGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTsKCQkJdGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkgewoKCQkJcmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApOwoKCQl9LAoKCQljcm9zczogZnVuY3Rpb24gKCB2LCB3ICkgewoKCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CgkJCQlyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHYsIHcgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdGhpcywgdiApOwoKCQl9LAoKCQljcm9zc1ZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHsKCgkJCXZhciBheCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56OwoJCQl2YXIgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejsKCgkJCXRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5OwoJCQl0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejsKCQkJdGhpcy56ID0gYXggKiBieSAtIGF5ICogYng7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJcHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKCgkJCXZhciBzY2FsYXIgPSB2ZWN0b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTsKCgkJCXJldHVybiB0aGlzLmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTsKCgkJfSwKCgkJcHJvamVjdE9uUGxhbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkgewoKCQkJCXYxLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7CgoJCQkJcmV0dXJuIHRoaXMuc3ViKCB2MSApOwoKCQkJfTsKCgkJfSgpLAoKCQlyZWZsZWN0OiBmdW5jdGlvbiAoKSB7CgoJCQkvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWwKCQkJLy8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aAoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiByZWZsZWN0KCBub3JtYWwgKSB7CgoJCQkJcmV0dXJuIHRoaXMuc3ViKCB2MS5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7CgoJCQl9OwoKCQl9KCksCgoJCWFuZ2xlVG86IGZ1bmN0aW9uICggdiApIHsKCgkJCXZhciB0aGV0YSA9IHRoaXMuZG90KCB2ICkgLyAoIE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICkgKTsKCgkJCS8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1zCgoJCQlyZXR1cm4gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGhldGEsIC0gMSwgMSApICk7CgoJCX0sCgoJCWRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHsKCgkJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApOwoKCQl9LAoKCQlkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkgewoKCQkJdmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7CgoJCQlyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6OwoKCQl9LAoKCQltYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApICsgTWF0aC5hYnMoIHRoaXMueiAtIHYueiApOwoKCQl9LAoKCQlzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7CgoJCQl2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHMucGhpICkgKiBzLnJhZGl1czsKCgkJCXRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7CgkJCXRoaXMueSA9IE1hdGguY29zKCBzLnBoaSApICogcy5yYWRpdXM7CgkJCXRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGguY29zKCBzLnRoZXRhICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7CgoJCQl0aGlzLnggPSBjLnJhZGl1cyAqIE1hdGguc2luKCBjLnRoZXRhICk7CgkJCXRoaXMueSA9IGMueTsKCQkJdGhpcy56ID0gYy5yYWRpdXMgKiBNYXRoLmNvcyggYy50aGV0YSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21NYXRyaXhQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkgewoKCQkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKCQkJdGhpcy54ID0gZVsgMTIgXTsKCQkJdGhpcy55ID0gZVsgMTMgXTsKCQkJdGhpcy56ID0gZVsgMTQgXTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHsKCgkJCXZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpOwoJCQl2YXIgc3kgPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTsKCQkJdmFyIHN6ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7CgoJCQl0aGlzLnggPSBzeDsKCQkJdGhpcy55ID0gc3k7CgkJCXRoaXMueiA9IHN6OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7CgoJCQlyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApOwoKCQl9LAoKCQllcXVhbHM6IGZ1bmN0aW9uICggdiApIHsKCgkJCXJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICk7CgoJCX0sCgoJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQl0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07CgkJCXRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07CgkJCXRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQlhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7CgkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7CgkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7CgoJCQlyZXR1cm4gYXJyYXk7CgoJCX0sCgoJCWZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwoKCQkJfQoKCQkJdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CgkJCXRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApOwoJCQl0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwoJICogQGF1dGhvciB0c2NodwoJICovCgoJZnVuY3Rpb24gTWF0cml4MygpIHsKCgkJdGhpcy5lbGVtZW50cyA9IFsKCgkJCTEsIDAsIDAsCgkJCTAsIDEsIDAsCgkJCTAsIDAsIDEKCgkJXTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTsKCgkJfQoKCX0KCglPYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwgewoKCQlpc01hdHJpeDM6IHRydWUsCgoJCXNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7CgkJCXRlWyAzIF0gPSBuMTI7IHRlWyA0IF0gPSBuMjI7IHRlWyA1IF0gPSBuMzI7CgkJCXRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJaWRlbnRpdHk6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuc2V0KAoKCQkJCTEsIDAsIDAsCgkJCQkwLCAxLCAwLAoJCQkJMCwgMCwgMQoKCQkJKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggbSApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgkJCXZhciBtZSA9IG0uZWxlbWVudHM7CgoJCQl0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOwoJCQl0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOwoJCQl0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07IHRlWyA4IF0gPSBtZVsgOCBdOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21NYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7CgoJCQl2YXIgbWUgPSBtLmVsZW1lbnRzOwoKCQkJdGhpcy5zZXQoCgoJCQkJbWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSwKCQkJCW1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sCgkJCQltZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXQoKCQkJKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgewoKCQkJCQl2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTsKCQkJCQl2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTsKCQkJCQl2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTsKCgkJCQkJdjEuYXBwbHlNYXRyaXgzKCB0aGlzICk7CgoJCQkJCWF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTsKCgkJCQl9CgoJCQkJcmV0dXJuIGF0dHJpYnV0ZTsKCgkJCX07CgoJCX0oKSwKCgkJbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHsKCgkJCXJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTsKCgkJfSwKCgkJcHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHsKCgkJCXJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTsKCgkJfSwKCgkJbXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkgewoKCQkJdmFyIGFlID0gYS5lbGVtZW50czsKCQkJdmFyIGJlID0gYi5lbGVtZW50czsKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXZhciBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgMyBdLCBhMTMgPSBhZVsgNiBdOwoJCQl2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTsKCQkJdmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07CgoJCQl2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTsKCQkJdmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA0IF0sIGIyMyA9IGJlWyA3IF07CgkJCXZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNSBdLCBiMzMgPSBiZVsgOCBdOwoKCQkJdGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTsKCQkJdGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjsKCQkJdGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMzsKCgkJCXRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7CgkJCXRlWyA0IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzI7CgkJCXRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7CgoJCQl0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxOwoJCQl0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyOwoJCQl0ZVsgOCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKCQkJdGVbIDAgXSAqPSBzOyB0ZVsgMyBdICo9IHM7IHRlWyA2IF0gKj0gczsKCQkJdGVbIDEgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA3IF0gKj0gczsKCQkJdGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXZhciBhID0gdGVbIDAgXSwgYiA9IHRlWyAxIF0sIGMgPSB0ZVsgMiBdLAoJCQkJZCA9IHRlWyAzIF0sIGUgPSB0ZVsgNCBdLCBmID0gdGVbIDUgXSwKCQkJCWcgPSB0ZVsgNiBdLCBoID0gdGVbIDcgXSwgaSA9IHRlWyA4IF07CgoJCQlyZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnOwoKCQl9LAoKCQlnZXRJbnZlcnNlOiBmdW5jdGlvbiAoIG1hdHJpeCwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7CgoJCQlpZiAoIG1hdHJpeCAmJiBtYXRyaXguaXNNYXRyaXg0ICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIG5vIGxvbmdlciB0YWtlcyBhIE1hdHJpeDQgYXJndW1lbnQuIiApOwoKCQkJfQoKCQkJdmFyIG1lID0gbWF0cml4LmVsZW1lbnRzLAoJCQkJdGUgPSB0aGlzLmVsZW1lbnRzLAoKCQkJCW4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sCgkJCQluMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLAoJCQkJbjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSwKCgkJCQl0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsCgkJCQl0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsCgkJCQl0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsCgoJCQkJZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzOwoKCQkJaWYgKCBkZXQgPT09IDAgKSB7CgoJCQkJdmFyIG1zZyA9ICJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiOwoKCQkJCWlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7CgoJCQkJCXRocm93IG5ldyBFcnJvciggbXNnICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJY29uc29sZS53YXJuKCBtc2cgKTsKCgkJCQl9CgoJCQkJcmV0dXJuIHRoaXMuaWRlbnRpdHkoKTsKCgkJCX0KCgkJCXZhciBkZXRJbnYgPSAxIC8gZGV0OwoKCQkJdGVbIDAgXSA9IHQxMSAqIGRldEludjsKCQkJdGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7CgkJCXRlWyAyIF0gPSAoIG4zMiAqIG4yMSAtIG4zMSAqIG4yMiApICogZGV0SW52OwoKCQkJdGVbIDMgXSA9IHQxMiAqIGRldEludjsKCQkJdGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7CgkJCXRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52OwoKCQkJdGVbIDYgXSA9IHQxMyAqIGRldEludjsKCQkJdGVbIDcgXSA9ICggbjIxICogbjEzIC0gbjIzICogbjExICkgKiBkZXRJbnY7CgkJCXRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXRyYW5zcG9zZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHRtcCwgbSA9IHRoaXMuZWxlbWVudHM7CgoJCQl0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wOwoJCQl0bXAgPSBtWyAyIF07IG1bIDIgXSA9IG1bIDYgXTsgbVsgNiBdID0gdG1wOwoJCQl0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldE5vcm1hbE1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXg0ICkgewoKCQkJcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQoIG1hdHJpeDQgKS5nZXRJbnZlcnNlKCB0aGlzICkudHJhbnNwb3NlKCk7CgoJCX0sCgoJCXRyYW5zcG9zZUludG9BcnJheTogZnVuY3Rpb24gKCByICkgewoKCQkJdmFyIG0gPSB0aGlzLmVsZW1lbnRzOwoKCQkJclsgMCBdID0gbVsgMCBdOwoJCQlyWyAxIF0gPSBtWyAzIF07CgkJCXJbIDIgXSA9IG1bIDYgXTsKCQkJclsgMyBdID0gbVsgMSBdOwoJCQlyWyA0IF0gPSBtWyA0IF07CgkJCXJbIDUgXSA9IG1bIDcgXTsKCQkJclsgNiBdID0gbVsgMiBdOwoJCQlyWyA3IF0gPSBtWyA1IF07CgkJCXJbIDggXSA9IG1bIDggXTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRVdlRyYW5zZm9ybTogZnVuY3Rpb24gKCB0eCwgdHksIHN4LCBzeSwgcm90YXRpb24sIGN4LCBjeSApIHsKCgkJCXZhciBjID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7CgkJCXZhciBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7CgoJCQl0aGlzLnNldCgKCQkJCXN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsCgkJCQktIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSwKCQkJCTAsIDAsIDEKCQkJKTsKCgkJfSwKCgkJc2NhbGU6IGZ1bmN0aW9uICggc3gsIHN5ICkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXRlWyAwIF0gKj0gc3g7IHRlWyAzIF0gKj0gc3g7IHRlWyA2IF0gKj0gc3g7CgkJCXRlWyAxIF0gKj0gc3k7IHRlWyA0IF0gKj0gc3k7IHRlWyA3IF0gKj0gc3k7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJcm90YXRlOiBmdW5jdGlvbiAoIHRoZXRhICkgewoKCQkJdmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKTsKCQkJdmFyIHMgPSBNYXRoLnNpbiggdGhldGEgKTsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgoJCQl2YXIgYTExID0gdGVbIDAgXSwgYTEyID0gdGVbIDMgXSwgYTEzID0gdGVbIDYgXTsKCQkJdmFyIGEyMSA9IHRlWyAxIF0sIGEyMiA9IHRlWyA0IF0sIGEyMyA9IHRlWyA3IF07CgoJCQl0ZVsgMCBdID0gYyAqIGExMSArIHMgKiBhMjE7CgkJCXRlWyAzIF0gPSBjICogYTEyICsgcyAqIGEyMjsKCQkJdGVbIDYgXSA9IGMgKiBhMTMgKyBzICogYTIzOwoKCQkJdGVbIDEgXSA9IC0gcyAqIGExMSArIGMgKiBhMjE7CgkJCXRlWyA0IF0gPSAtIHMgKiBhMTIgKyBjICogYTIyOwoJCQl0ZVsgNyBdID0gLSBzICogYTEzICsgYyAqIGEyMzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl0cmFuc2xhdGU6IGZ1bmN0aW9uICggdHgsIHR5ICkgewoKCQkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCgkJCXRlWyAwIF0gKz0gdHggKiB0ZVsgMiBdOyB0ZVsgMyBdICs9IHR4ICogdGVbIDUgXTsgdGVbIDYgXSArPSB0eCAqIHRlWyA4IF07CgkJCXRlWyAxIF0gKz0gdHkgKiB0ZVsgMiBdOyB0ZVsgNCBdICs9IHR5ICogdGVbIDUgXTsgdGVbIDcgXSArPSB0eSAqIHRlWyA4IF07CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCgkJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgkJCXZhciBtZSA9IG1hdHJpeC5lbGVtZW50czsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CgoJCQkJaWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlOwoKCQkJfQoKCQkJcmV0dXJuIHRydWU7CgoJCX0sCgoJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkgewoKCQkJCXRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKCQkJYXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTsKCQkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07CgkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdOwoKCQkJYXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07CgkJCWFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdOwoJCQlhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTsKCgkJCWFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdOwoJCQlhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTsKCQkJYXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07CgoJCQlyZXR1cm4gYXJyYXk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay8KCSAqLwoKCXZhciB0ZXh0dXJlSWQgPSAwOwoKCWZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkgewoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IHRleHR1cmVJZCArKyB9ICk7CgoJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKCQl0aGlzLm5hbWUgPSAnJzsKCgkJdGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQgPyBpbWFnZSA6IFRleHR1cmUuREVGQVVMVF9JTUFHRTsKCQl0aGlzLm1pcG1hcHMgPSBbXTsKCgkJdGhpcy5tYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HOwoKCQl0aGlzLndyYXBTID0gd3JhcFMgIT09IHVuZGVmaW5lZCA/IHdyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZzsKCQl0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZzsKCgkJdGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjsKCQl0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOwoKCQl0aGlzLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgPyBhbmlzb3Ryb3B5IDogMTsKCgkJdGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7CgkJdGhpcy50eXBlID0gdHlwZSAhPT0gdW5kZWZpbmVkID8gdHlwZSA6IFVuc2lnbmVkQnl0ZVR5cGU7CgoJCXRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTsKCQl0aGlzLnJlcGVhdCA9IG5ldyBWZWN0b3IyKCAxLCAxICk7CgkJdGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMCwgMCApOwoJCXRoaXMucm90YXRpb24gPSAwOwoKCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlOwoJCXRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTsKCgkJdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSB0cnVlOwoJCXRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlOwoJCXRoaXMuZmxpcFkgPSB0cnVlOwoJCXRoaXMudW5wYWNrQWxpZ25tZW50ID0gNDsJLy8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpCgoJCS8vIFZhbHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLgoJCS8vCgkJLy8gQWxzbyBjaGFuZ2luZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3QgYXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbAoJCS8vIHVwZGF0ZS4gIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS4KCQl0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7CgoJCXRoaXMudmVyc2lvbiA9IDA7CgkJdGhpcy5vblVwZGF0ZSA9IG51bGw7CgoJfQoKCVRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5lZDsKCVRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nOwoKCVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBUZXh0dXJlLAoKCQlpc1RleHR1cmU6IHRydWUsCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CgoJCQl0aGlzLmltYWdlID0gc291cmNlLmltYWdlOwoJCQl0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApOwoKCQkJdGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7CgoJCQl0aGlzLndyYXBTID0gc291cmNlLndyYXBTOwoJCQl0aGlzLndyYXBUID0gc291cmNlLndyYXBUOwoKCQkJdGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyOwoJCQl0aGlzLm1pbkZpbHRlciA9IHNvdXJjZS5taW5GaWx0ZXI7CgoJCQl0aGlzLmFuaXNvdHJvcHkgPSBzb3VyY2UuYW5pc290cm9weTsKCgkJCXRoaXMuZm9ybWF0ID0gc291cmNlLmZvcm1hdDsKCQkJdGhpcy50eXBlID0gc291cmNlLnR5cGU7CgoJCQl0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7CgkJCXRoaXMucmVwZWF0LmNvcHkoIHNvdXJjZS5yZXBlYXQgKTsKCQkJdGhpcy5jZW50ZXIuY29weSggc291cmNlLmNlbnRlciApOwoJCQl0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uOwoKCQkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7CgkJCXRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTsKCgkJCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFwczsKCQkJdGhpcy5wcmVtdWx0aXBseUFscGhhID0gc291cmNlLnByZW11bHRpcGx5QWxwaGE7CgkJCXRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7CgkJCXRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0FsaWdubWVudDsKCQkJdGhpcy5lbmNvZGluZyA9IHNvdXJjZS5lbmNvZGluZzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCgkJCXZhciBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTsKCgkJCWlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHsKCgkJCQlyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07CgoJCQl9CgoJCQlmdW5jdGlvbiBnZXREYXRhVVJMKCBpbWFnZSApIHsKCgkJCQl2YXIgY2FudmFzOwoKCQkJCWlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHsKCgkJCQkJY2FudmFzID0gaW1hZ2U7CgoJCQkJfSBlbHNlIHsKCgkJCQkJY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7CgkJCQkJY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7CgkJCQkJY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDsKCgkJCQkJdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApOwoKCQkJCQlpZiAoIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhICkgewoKCQkJCQkJY29udGV4dC5wdXRJbWFnZURhdGEoIGltYWdlLCAwLCAwICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQljb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQlpZiAoIGNhbnZhcy53aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7CgoJCQkJCXJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApOwoKCQkJCX0KCgkJCX0KCgkJCXZhciBvdXRwdXQgPSB7CgkJCQltZXRhZGF0YTogewoJCQkJCXZlcnNpb246IDQuNSwKCQkJCQl0eXBlOiAnVGV4dHVyZScsCgkJCQkJZ2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nCgkJCQl9LAoKCQkJCXV1aWQ6IHRoaXMudXVpZCwKCQkJCW5hbWU6IHRoaXMubmFtZSwKCgkJCQltYXBwaW5nOiB0aGlzLm1hcHBpbmcsCgoJCQkJcmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSwKCQkJCW9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sCgkJCQljZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLAoJCQkJcm90YXRpb246IHRoaXMucm90YXRpb24sCgoJCQkJd3JhcDogWyB0aGlzLndyYXBTLCB0aGlzLndyYXBUIF0sCgoJCQkJbWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlciwKCQkJCW1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsCgkJCQlhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksCgoJCQkJZmxpcFk6IHRoaXMuZmxpcFkKCQkJfTsKCgkJCWlmICggdGhpcy5pbWFnZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCS8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2UKCgkJCQl2YXIgaW1hZ2UgPSB0aGlzLmltYWdlOwoKCQkJCWlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQlpbWFnZS51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSAoKCQkJCX0KCgkJCQlpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9IHsKCQkJCQkJdXVpZDogaW1hZ2UudXVpZCwKCQkJCQkJdXJsOiBnZXREYXRhVVJMKCBpbWFnZSApCgkJCQkJfTsKCgkJCQl9CgoJCQkJb3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDsKCgkJCX0KCgkJCWlmICggISBpc1Jvb3RPYmplY3QgKSB7CgoJCQkJbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7CgoJCQl9CgoJCQlyZXR1cm4gb3V0cHV0OwoKCQl9LAoKCQlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsKCgkJfSwKCgkJdHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7CgoJCQlpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuOwoKCQkJdXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApOwoKCQkJaWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHsKCgkJCQlzd2l0Y2ggKCB0aGlzLndyYXBTICkgewoKCQkJCQljYXNlIFJlcGVhdFdyYXBwaW5nOgoKCQkJCQkJdXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CgoJCQkJCQl1di54ID0gdXYueCA8IDAgPyAwIDogMTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzoKCgkJCQkJCWlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHsKCgkJCQkJCQl1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54OwoKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQl1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTsKCgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHsKCgkJCQlzd2l0Y2ggKCB0aGlzLndyYXBUICkgewoKCQkJCQljYXNlIFJlcGVhdFdyYXBwaW5nOgoKCQkJCQkJdXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CgoJCQkJCQl1di55ID0gdXYueSA8IDAgPyAwIDogMTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzoKCgkJCQkJCWlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHsKCgkJCQkJCQl1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55OwoKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQl1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTsKCgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCB0aGlzLmZsaXBZICkgewoKCQkJCXV2LnkgPSAxIC0gdXYueTsKCgkJCX0KCgkJfQoKCX0gKTsKCglPYmplY3QuZGVmaW5lUHJvcGVydHkoIFRleHR1cmUucHJvdG90eXBlLCAibmVlZHNVcGRhdGUiLCB7CgoJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCWlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrLwoJICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tLwoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKi8KCglmdW5jdGlvbiBWZWN0b3I0KCB4LCB5LCB6LCB3ICkgewoKCQl0aGlzLnggPSB4IHx8IDA7CgkJdGhpcy55ID0geSB8fCAwOwoJCXRoaXMueiA9IHogfHwgMDsKCQl0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7CgoJCWlzVmVjdG9yNDogdHJ1ZSwKCgkJc2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7CgoJCQl0aGlzLnggPSB4OwoJCQl0aGlzLnkgPSB5OwoJCQl0aGlzLnogPSB6OwoJCQl0aGlzLncgPSB3OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgoJCQl0aGlzLnggPSBzY2FsYXI7CgkJCXRoaXMueSA9IHNjYWxhcjsKCQkJdGhpcy56ID0gc2NhbGFyOwoJCQl0aGlzLncgPSBzY2FsYXI7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0WDogZnVuY3Rpb24gKCB4ICkgewoKCQkJdGhpcy54ID0geDsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRZOiBmdW5jdGlvbiAoIHkgKSB7CgoJCQl0aGlzLnkgPSB5OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFo6IGZ1bmN0aW9uICggeiApIHsKCgkJCXRoaXMueiA9IHo7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0VzogZnVuY3Rpb24gKCB3ICkgewoKCQkJdGhpcy53ID0gdzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkgewoKCQkJc3dpdGNoICggaW5kZXggKSB7CgoJCQkJY2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7CgkJCQljYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhazsKCQkJCWNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrOwoJCQkJY2FzZSAzOiB0aGlzLncgPSB2YWx1ZTsgYnJlYWs7CgkJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCXN3aXRjaCAoIGluZGV4ICkgewoKCQkJCWNhc2UgMDogcmV0dXJuIHRoaXMueDsKCQkJCWNhc2UgMTogcmV0dXJuIHRoaXMueTsKCQkJCWNhc2UgMjogcmV0dXJuIHRoaXMuejsKCQkJCWNhc2UgMzogcmV0dXJuIHRoaXMudzsKCQkJCWRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7CgoJCQl9CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyApOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIHYgKSB7CgoJCQl0aGlzLnggPSB2Lng7CgkJCXRoaXMueSA9IHYueTsKCQkJdGhpcy56ID0gdi56OwoJCQl0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWFkZDogZnVuY3Rpb24gKCB2LCB3ICkgewoKCQkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKCQkJCXJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTsKCgkJCX0KCgkJCXRoaXMueCArPSB2Lng7CgkJCXRoaXMueSArPSB2Lnk7CgkJCXRoaXMueiArPSB2Lno7CgkJCXRoaXMudyArPSB2Lnc7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CgoJCQl0aGlzLnggKz0gczsKCQkJdGhpcy55ICs9IHM7CgkJCXRoaXMueiArPSBzOwoJCQl0aGlzLncgKz0gczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgoJCQl0aGlzLnggPSBhLnggKyBiLng7CgkJCXRoaXMueSA9IGEueSArIGIueTsKCQkJdGhpcy56ID0gYS56ICsgYi56OwoJCQl0aGlzLncgPSBhLncgKyBiLnc7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7CgoJCQl0aGlzLnggKz0gdi54ICogczsKCQkJdGhpcy55ICs9IHYueSAqIHM7CgkJCXRoaXMueiArPSB2LnogKiBzOwoJCQl0aGlzLncgKz0gdi53ICogczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzdWI6IGZ1bmN0aW9uICggdiwgdyApIHsKCgkJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CgkJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7CgoJCQl9CgoJCQl0aGlzLnggLT0gdi54OwoJCQl0aGlzLnkgLT0gdi55OwoJCQl0aGlzLnogLT0gdi56OwoJCQl0aGlzLncgLT0gdi53OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKCQkJdGhpcy54IC09IHM7CgkJCXRoaXMueSAtPSBzOwoJCQl0aGlzLnogLT0gczsKCQkJdGhpcy53IC09IHM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKCQkJdGhpcy54ID0gYS54IC0gYi54OwoJCQl0aGlzLnkgPSBhLnkgLSBiLnk7CgkJCXRoaXMueiA9IGEueiAtIGIuejsKCQkJdGhpcy53ID0gYS53IC0gYi53OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKCgkJCXRoaXMueCAqPSBzY2FsYXI7CgkJCXRoaXMueSAqPSBzY2FsYXI7CgkJCXRoaXMueiAqPSBzY2FsYXI7CgkJCXRoaXMudyAqPSBzY2FsYXI7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7CgoJCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRoaXMudzsKCQkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKCQkJdGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7CgkJCXRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3OwoJCQl0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSAqIHc7CgkJCXRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTsKCgkJfSwKCgkJc2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKCgkJCS8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9xdWF0ZXJuaW9uVG9BbmdsZS9pbmRleC5odG0KCgkJCS8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCgoJCQl0aGlzLncgPSAyICogTWF0aC5hY29zKCBxLncgKTsKCgkJCXZhciBzID0gTWF0aC5zcXJ0KCAxIC0gcS53ICogcS53ICk7CgoJCQlpZiAoIHMgPCAwLjAwMDEgKSB7CgoJCQkJdGhpcy54ID0gMTsKCQkJCXRoaXMueSA9IDA7CgkJCQl0aGlzLnogPSAwOwoKCQkJfSBlbHNlIHsKCgkJCQl0aGlzLnggPSBxLnggLyBzOwoJCQkJdGhpcy55ID0gcS55IC8gczsKCQkJCXRoaXMueiA9IHEueiAvIHM7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CgoJCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9BbmdsZS9pbmRleC5odG0KCgkJCS8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpCgoJCQl2YXIgYW5nbGUsIHgsIHksIHosCQkvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdAoJCQkJZXBzaWxvbiA9IDAuMDEsCQkvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9ycwoJCQkJZXBzaWxvbjIgPSAwLjEsCQkvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVlcwoKCQkJCXRlID0gbS5lbGVtZW50cywKCgkJCQltMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLAoJCQkJbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSwKCQkJCW0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdOwoKCQkJaWYgKCAoIE1hdGguYWJzKCBtMTIgLSBtMjEgKSA8IGVwc2lsb24gKSAmJgoJCQkgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmCgkJCSAgICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7CgoJCQkJLy8gc2luZ3VsYXJpdHkgZm91bmQKCQkJCS8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXMKCQkJCS8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXMKCgkJCQlpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwgZXBzaWxvbjIgKSAmJgoJCQkJICAgICAoIE1hdGguYWJzKCBtMTMgKyBtMzEgKSA8IGVwc2lsb24yICkgJiYKCQkJCSAgICAgKCBNYXRoLmFicyggbTIzICsgbTMyICkgPCBlcHNpbG9uMiApICYmCgkJCQkgICAgICggTWF0aC5hYnMoIG0xMSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkgKSB7CgoJCQkJCS8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMAoKCQkJCQl0aGlzLnNldCggMSwgMCwgMCwgMCApOwoKCQkJCQlyZXR1cm4gdGhpczsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXMKCgkJCQl9CgoJCQkJLy8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODAKCgkJCQlhbmdsZSA9IE1hdGguUEk7CgoJCQkJdmFyIHh4ID0gKCBtMTEgKyAxICkgLyAyOwoJCQkJdmFyIHl5ID0gKCBtMjIgKyAxICkgLyAyOwoJCQkJdmFyIHp6ID0gKCBtMzMgKyAxICkgLyAyOwoJCQkJdmFyIHh5ID0gKCBtMTIgKyBtMjEgKSAvIDQ7CgkJCQl2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDsKCQkJCXZhciB5eiA9ICggbTIzICsgbTMyICkgLyA0OwoKCQkJCWlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7CgoJCQkJCS8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtCgoJCQkJCWlmICggeHggPCBlcHNpbG9uICkgewoKCQkJCQkJeCA9IDA7CgkJCQkJCXkgPSAwLjcwNzEwNjc4MTsKCQkJCQkJeiA9IDAuNzA3MTA2NzgxOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJeCA9IE1hdGguc3FydCggeHggKTsKCQkJCQkJeSA9IHh5IC8geDsKCQkJCQkJeiA9IHh6IC8geDsKCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIHl5ID4genogKSB7CgoJCQkJCS8vIG0yMiBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtCgoJCQkJCWlmICggeXkgPCBlcHNpbG9uICkgewoKCQkJCQkJeCA9IDAuNzA3MTA2NzgxOwoJCQkJCQl5ID0gMDsKCQkJCQkJeiA9IDAuNzA3MTA2NzgxOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJeSA9IE1hdGguc3FydCggeXkgKTsKCQkJCQkJeCA9IHh5IC8geTsKCQkJCQkJeiA9IHl6IC8geTsKCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgoJCQkJCS8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXMKCgkJCQkJaWYgKCB6eiA8IGVwc2lsb24gKSB7CgoJCQkJCQl4ID0gMC43MDcxMDY3ODE7CgkJCQkJCXkgPSAwLjcwNzEwNjc4MTsKCQkJCQkJeiA9IDA7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQl6ID0gTWF0aC5zcXJ0KCB6eiApOwoJCQkJCQl4ID0geHogLyB6OwoJCQkJCQl5ID0geXogLyB6OwoKCQkJCQl9CgoJCQkJfQoKCQkJCXRoaXMuc2V0KCB4LCB5LCB6LCBhbmdsZSApOwoKCQkJCXJldHVybiB0aGlzOyAvLyByZXR1cm4gMTgwIGRlZyByb3RhdGlvbgoKCQkJfQoKCQkJLy8gYXMgd2UgaGF2ZSByZWFjaGVkIGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxseQoKCQkJdmFyIHMgPSBNYXRoLnNxcnQoICggbTMyIC0gbTIzICkgKiAoIG0zMiAtIG0yMyApICsKCQkJICAgICAgICAgICAgICAgICAgICggbTEzIC0gbTMxICkgKiAoIG0xMyAtIG0zMSApICsKCQkJICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplCgoJCQlpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxOwoKCQkJLy8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZQoJCQkvLyBjYXVnaHQgYnkgc2luZ3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2UKCgkJCXRoaXMueCA9ICggbTMyIC0gbTIzICkgLyBzOwoJCQl0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gczsKCQkJdGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7CgkJCXRoaXMudyA9IE1hdGguYWNvcyggKCBtMTEgKyBtMjIgKyBtMzMgLSAxICkgLyAyICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbWluOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQl0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTsKCQkJdGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7CgkJCXRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApOwoJCQl0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltYXg6IGZ1bmN0aW9uICggdiApIHsKCgkJCXRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApOwoJCQl0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTsKCQkJdGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7CgkJCXRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgewoKCQkJLy8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2UKCgkJCXRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOwoJCQl0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTsKCQkJdGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7CgkJCXRoaXMudyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1heC53LCB0aGlzLncgKSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgbWluLCBtYXg7CgoJCQlyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkgewoKCQkJCWlmICggbWluID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCW1pbiA9IG5ldyBWZWN0b3I0KCk7CgkJCQkJbWF4ID0gbmV3IFZlY3RvcjQoKTsKCgkJCQl9CgoJCQkJbWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7CgkJCQltYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTsKCgkJCQlyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTsKCgkJCX07CgoJCX0oKSwKCgkJY2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CgoJCQl2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTsKCgkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApOwoKCQl9LAoKCQlmbG9vcjogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7CgkJCXRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApOwoJCQl0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTsKCQkJdGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY2VpbDogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTsKCQkJdGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTsKCQkJdGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTsKCQkJdGhpcy53ID0gTWF0aC5jZWlsKCB0aGlzLncgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlyb3VuZDogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7CgkJCXRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApOwoJCQl0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTsKCQkJdGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJcm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApOwoJCQl0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTsKCQkJdGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7CgkJCXRoaXMudyA9ICggdGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW5lZ2F0ZTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy54ID0gLSB0aGlzLng7CgkJCXRoaXMueSA9IC0gdGhpcy55OwoJCQl0aGlzLnogPSAtIHRoaXMuejsKCQkJdGhpcy53ID0gLSB0aGlzLnc7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZG90OiBmdW5jdGlvbiAoIHYgKSB7CgoJCQlyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53OwoKCQl9LAoKCQlsZW5ndGhTcTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudzsKCgkJfSwKCgkJbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTsKCgkJfSwKCgkJbWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApOwoKCQl9LAoKCQlub3JtYWxpemU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7CgoJCX0sCgoJCXNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7CgoJCQlyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7CgoJCX0sCgoJCWxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7CgoJCQl0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhOwoJCQl0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhOwoJCQl0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhOwoJCQl0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7CgoJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7CgoJCX0sCgoJCWVxdWFsczogZnVuY3Rpb24gKCB2ICkgewoKCQkJcmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgJiYgKCB2LncgPT09IHRoaXMudyApICk7CgoJCX0sCgoJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQl0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07CgkJCXRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07CgkJCXRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CgkJCXRoaXMudyA9IGFycmF5WyBvZmZzZXQgKyAzIF07CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQlhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7CgkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7CgkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7CgkJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7CgoJCQlyZXR1cm4gYXJyYXk7CgoJCX0sCgoJCWZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwoKCQkJfQoKCQkJdGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7CgkJCXRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApOwoJCQl0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTsKCQkJdGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIE1hcml1cyBLaW50ZWwgLyBodHRwczovL2dpdGh1Yi5jb20va2ludGVsCgkgKi8KCgkvKgoJIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OgoJICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZQoJICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnMKCSovCglmdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHsKCgkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgoJCXRoaXMud2lkdGggPSB3aWR0aDsKCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKCgkJdGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKCQl0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7CgoJCXRoaXMudmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApOwoKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJaWYgKCBvcHRpb25zLm1pbkZpbHRlciA9PT0gdW5kZWZpbmVkICkgb3B0aW9ucy5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CgoJCXRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTsKCgkJdGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlOwoJCXRoaXMuc3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogdHJ1ZTsKCQl0aGlzLmRlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IG51bGw7CgoJfQoKCVdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogV2ViR0xSZW5kZXJUYXJnZXQsCgoJCWlzV2ViR0xSZW5kZXJUYXJnZXQ6IHRydWUsCgoJCXNldFNpemU6IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCApIHsKCgkJCWlmICggdGhpcy53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IGhlaWdodCApIHsKCgkJCQl0aGlzLndpZHRoID0gd2lkdGg7CgkJCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKCgkJCQl0aGlzLmRpc3Bvc2UoKTsKCgkJCX0KCgkJCXRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CgkJCXRoaXMuc2Npc3Nvci5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKCgkJfSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCgkJfSwKCgkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCQl0aGlzLndpZHRoID0gc291cmNlLndpZHRoOwoJCQl0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7CgoJCQl0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApOwoKCQkJdGhpcy50ZXh0dXJlID0gc291cmNlLnRleHR1cmUuY2xvbmUoKTsKCgkJCXRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7CgkJCXRoaXMuc3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5zdGVuY2lsQnVmZmVyOwoJCQl0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmU7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZGlzcG9zZTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tCgkgKi8KCglmdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7CgoJCVdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTsKCgkJdGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7IC8vIFBYIDAsIE5YIDEsIFBZIDIsIE5ZIDMsIFBaIDQsIE5aIDUKCQl0aGlzLmFjdGl2ZU1pcE1hcExldmVsID0gMDsKCgl9CgoJV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSApOwoJV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTsKCglXZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID0gdHJ1ZTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBEYXRhVGV4dHVyZSggZGF0YSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKCgkJVGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7CgoJCXRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTsKCgkJdGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CgkJdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CgoJCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CgkJdGhpcy5mbGlwWSA9IGZhbHNlOwoJCXRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTsKCgl9CgoJRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTsKCURhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlOwoKCURhdGFUZXh0dXJlLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlID0gdHJ1ZTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBDdWJlVGV4dHVyZSggaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkgewoKCQlpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdOwoJCW1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOwoKCQlUZXh0dXJlLmNhbGwoIHRoaXMsIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApOwoKCQl0aGlzLmZsaXBZID0gZmFsc2U7CgoJfQoKCUN1YmVUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CglDdWJlVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlVGV4dHVyZTsKCglDdWJlVGV4dHVyZS5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdWJlVGV4dHVyZS5wcm90b3R5cGUsICdpbWFnZXMnLCB7CgoJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuaW1hZ2U7CgoJCX0sCgoJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMuaW1hZ2UgPSB2YWx1ZTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgdHNjaHcKCSAqCgkgKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uCgkgKiBUaG9zZSBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHNwZWNpYWwgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgdGhlIHJvb3QsCgkgKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKScuCgkgKgoJICoKCSAqIFByb3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOgoJICoKCSAqIC5zZXEgLSBhcnJheSBvZiBuZXN0ZWQgdW5pZm9ybXMKCSAqIC5tYXAgLSBuZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZQoJICoKCSAqCgkgKiBNZXRob2RzIG9mIGFsbCBub2RlcyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6CgkgKgoJICogLnNldFZhbHVlKCBnbCwgdmFsdWUsIFtyZW5kZXJlcl0gKQoJICoKCSAqIAkJdXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocykKCSAqICAJdGhlICdyZW5kZXJlcicgcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3Igc2FtcGxlciB1bmlmb3JtcwoJICoKCSAqCgkgKiBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMpOgoJICoKCSAqIC51cGxvYWQoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKQoJICoKCSAqIAkJc2V0cyB1bmlmb3JtcyBpbiAnc2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZScKCSAqCgkgKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXEKCSAqCgkgKiAJCWZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzCgkgKgoJICoKCSAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKToKCSAqCgkgKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApCgkgKgoJICogCQlzZXRzIHVuaWZvcm0gd2l0aCAgbmFtZSAnbmFtZScgdG8gJ3ZhbHVlJwoJICoKCSAqIC5zZXQoIGdsLCBvYmosIHByb3AgKQoJICoKCSAqIAkJc2V0cyB1bmlmb3JtIGZyb20gb2JqZWN0IGFuZCBwcm9wZXJ0eSB3aXRoIHNhbWUgbmFtZSB0aGFuIHVuaWZvcm0KCSAqCgkgKiAuc2V0T3B0aW9uYWwoIGdsLCBvYmosIHByb3AgKQoJICoKCSAqIAkJbGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0CgkgKgoJICovCgoJdmFyIGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7Cgl2YXIgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpOwoKCS8vIC0tLSBCYXNlIGZvciBpbm5lciBub2RlcyAoaW5jbHVkaW5nIHRoZSByb290KSAtLS0KCglmdW5jdGlvbiBVbmlmb3JtQ29udGFpbmVyKCkgewoKCQl0aGlzLnNlcSA9IFtdOwoJCXRoaXMubWFwID0ge307CgoJfQoKCS8vIC0tLSBVdGlsaXRpZXMgLS0tCgoJLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpCgoJdmFyIGFycmF5Q2FjaGVGMzIgPSBbXTsKCXZhciBhcnJheUNhY2hlSTMyID0gW107CgoJLy8gRmxvYXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zCgoJdmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7Cgl2YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApOwoKCS8vIEZsYXR0ZW5pbmcgZm9yIGFycmF5cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlcwoKCWZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7CgoJCXZhciBmaXJzdEVsZW0gPSBhcnJheVsgMCBdOwoKCQlpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7CgkJLy8gdW5vcHRpbWl6ZWQ6ICEgaXNOYU4oIGZpcnN0RWxlbSApCgkJLy8gc2VlIGh0dHA6Ly9qYWNrc29uZHVuc3Rhbi5jb20vYXJ0aWNsZXMvOTgzCgoJCXZhciBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZSwKCQkJciA9IGFycmF5Q2FjaGVGMzJbIG4gXTsKCgkJaWYgKCByID09PSB1bmRlZmluZWQgKSB7CgoJCQlyID0gbmV3IEZsb2F0MzJBcnJheSggbiApOwoJCQlhcnJheUNhY2hlRjMyWyBuIF0gPSByOwoKCQl9CgoJCWlmICggbkJsb2NrcyAhPT0gMCApIHsKCgkJCWZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7CgoJCQlmb3IgKCB2YXIgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7CgoJCQkJb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKCQkJCWFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7CgoJCQl9CgoJCX0KCgkJcmV0dXJuIHI7CgoJfQoKCS8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uCgoJZnVuY3Rpb24gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKSB7CgoJCXZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdOwoKCQlpZiAoIHIgPT09IHVuZGVmaW5lZCApIHsKCgkJCXIgPSBuZXcgSW50MzJBcnJheSggbiApOwoJCQlhcnJheUNhY2hlSTMyWyBuIF0gPSByOwoKCQl9CgoJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApCgkJCXJbIGkgXSA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTsKCgkJcmV0dXJuIHI7CgoJfQoKCS8vIC0tLSBTZXR0ZXJzIC0tLQoKCS8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaAoJLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS4KCgkvLyBTaW5nbGUgc2NhbGFyCgoJZnVuY3Rpb24gc2V0VmFsdWUxZiggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm0xZiggdGhpcy5hZGRyLCB2ICk7CgoJfQoKCWZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkgewoKCQlnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdiApOwoKCX0KCgkvLyBTaW5nbGUgZmxvYXQgdmVjdG9yIChmcm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuVmVjdG9yTikKCglmdW5jdGlvbiBzZXRWYWx1ZTJmdiggZ2wsIHYgKSB7CgoJCWlmICggdi54ID09PSB1bmRlZmluZWQgKSB7CgoJCQlnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIHYgKTsKCgkJfSBlbHNlIHsKCgkJCWdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApOwoKCQl9CgoJfQoKCWZ1bmN0aW9uIHNldFZhbHVlM2Z2KCBnbCwgdiApIHsKCgkJaWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHsKCgkJCWdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7CgoJCX0gZWxzZSBpZiAoIHYuciAhPT0gdW5kZWZpbmVkICkgewoKCQkJZ2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYuciwgdi5nLCB2LmIgKTsKCgkJfSBlbHNlIHsKCgkJCWdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgdiApOwoKCQl9CgoJfQoKCWZ1bmN0aW9uIHNldFZhbHVlNGZ2KCBnbCwgdiApIHsKCgkJaWYgKCB2LnggPT09IHVuZGVmaW5lZCApIHsKCgkJCWdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApOwoKCQl9IGVsc2UgewoKCQkJIGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTsKCgkJfQoKCX0KCgkvLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgTWF0cml4TikKCglmdW5jdGlvbiBzZXRWYWx1ZTJmbSggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYuZWxlbWVudHMgfHwgdiApOwoKCX0KCglmdW5jdGlvbiBzZXRWYWx1ZTNmbSggZ2wsIHYgKSB7CgoJCWlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkgewoKCQkJZ2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApOwoKCQl9IGVsc2UgewoKCQkJbWF0M2FycmF5LnNldCggdi5lbGVtZW50cyApOwoJCQlnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRWYWx1ZTRmbSggZ2wsIHYgKSB7CgoJCWlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkgewoKCQkJZ2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApOwoKCQl9IGVsc2UgewoKCQkJbWF0NGFycmF5LnNldCggdi5lbGVtZW50cyApOwoJCQlnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkgKTsKCgkJfQoKCX0KCgkvLyBTaW5nbGUgdGV4dHVyZSAoMkQgLyBDdWJlKQoKCWZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHsKCgkJdmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7CgkJZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKCQlyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHYgfHwgZW1wdHlUZXh0dXJlLCB1bml0ICk7CgoJfQoKCWZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHsKCgkJdmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7CgkJZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKCQlyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7CgoJfQoKCS8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2YgKGFsd2F5cyBmbGF0IGFycmF5cykKCglmdW5jdGlvbiBzZXRWYWx1ZTJpdiggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApOwoKCX0KCglmdW5jdGlvbiBzZXRWYWx1ZTNpdiggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApOwoKCX0KCglmdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApOwoKCX0KCgkvLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciB0aGUgc2luZ3VsYXIgY2FzZQoKCWZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkgewoKCQlzd2l0Y2ggKCB0eXBlICkgewoKCQkJY2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmOyAvLyBGTE9BVAoJCQljYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlMmZ2OyAvLyBfVkVDMgoJCQljYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlM2Z2OyAvLyBfVkVDMwoJCQljYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlNGZ2OyAvLyBfVkVDNAoKCQkJY2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZTJmbTsgLy8gX01BVDIKCQkJY2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDMKCQkJY2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZTRmbTsgLy8gX01BVDQKCgkJCWNhc2UgMHg4YjVlOiBjYXNlIDB4OGQ2NjogcmV0dXJuIHNldFZhbHVlVDE7IC8vIFNBTVBMRVJfMkQsIFNBTVBMRVJfRVhURVJOQUxfT0VTCgkJCWNhc2UgMHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNjsgLy8gU0FNUExFUl9DVUJFCgoJCQljYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpOyAvLyBJTlQsIEJPT0wKCQkJY2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyCgkJCWNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDMwoJCQljYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzQKCgkJfQoKCX0KCgkvLyBBcnJheSBvZiBzY2FsYXJzCgoJZnVuY3Rpb24gc2V0VmFsdWUxZnYoIGdsLCB2ICkgewoKCQlnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTsKCgl9CglmdW5jdGlvbiBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdiApOwoKCX0KCgkvLyBBcnJheSBvZiB2ZWN0b3JzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc3NlcykKCglmdW5jdGlvbiBzZXRWYWx1ZVYyYSggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAyICkgKTsKCgl9CgoJZnVuY3Rpb24gc2V0VmFsdWVWM2EoIGdsLCB2ICkgewoKCQlnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMyApICk7CgoJfQoKCWZ1bmN0aW9uIHNldFZhbHVlVjRhKCBnbCwgdiApIHsKCgkJZ2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApOwoKCX0KCgkvLyBBcnJheSBvZiBtYXRyaWNlcyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNlcykKCglmdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7CgoJCWdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApICk7CgoJfQoKCWZ1bmN0aW9uIHNldFZhbHVlTTNhKCBnbCwgdiApIHsKCgkJZ2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICkgKTsKCgl9CgoJZnVuY3Rpb24gc2V0VmFsdWVNNGEoIGdsLCB2ICkgewoKCQlnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDE2ICkgKTsKCgl9CgoJLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSkKCglmdW5jdGlvbiBzZXRWYWx1ZVQxYSggZ2wsIHYsIHJlbmRlcmVyICkgewoKCQl2YXIgbiA9IHYubGVuZ3RoLAoJCQl1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7CgoJCWdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTsKCgkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgewoKCQkJcmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7CgoJCX0KCgl9CgoJZnVuY3Rpb24gc2V0VmFsdWVUNmEoIGdsLCB2LCByZW5kZXJlciApIHsKCgkJdmFyIG4gPSB2Lmxlbmd0aCwKCQkJdW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApOwoKCQlnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7CgoJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCXJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApOwoKCQl9CgoJfQoKCS8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheQoKCWZ1bmN0aW9uIGdldFB1cmVBcnJheVNldHRlciggdHlwZSApIHsKCgkJc3dpdGNoICggdHlwZSApIHsKCgkJCWNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZnY7IC8vIEZMT0FUCgkJCWNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyCgkJCWNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWVWM2E7IC8vIF9WRUMzCgkJCWNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGE7IC8vIF9WRUM0CgoJCQljYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTJhOyAvLyBfTUFUMgoJCQljYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUMwoJCQljYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTRhOyAvLyBfTUFUNAoKCQkJY2FzZSAweDhiNWU6IHJldHVybiBzZXRWYWx1ZVQxYTsgLy8gU0FNUExFUl8yRAoJCQljYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDZhOyAvLyBTQU1QTEVSX0NVQkUKCgkJCWNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWl2OyAvLyBJTlQsIEJPT0wKCQkJY2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyCgkJCWNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDMwoJCQljYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzQKCgkJfQoKCX0KCgkvLyAtLS0gVW5pZm9ybSBDbGFzc2VzIC0tLQoKCWZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgewoKCQl0aGlzLmlkID0gaWQ7CgkJdGhpcy5hZGRyID0gYWRkcjsKCQl0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApOwoKCQkvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHCgoJfQoKCWZ1bmN0aW9uIFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgewoKCQl0aGlzLmlkID0gaWQ7CgkJdGhpcy5hZGRyID0gYWRkcjsKCQl0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7CgkJdGhpcy5zZXRWYWx1ZSA9IGdldFB1cmVBcnJheVNldHRlciggYWN0aXZlSW5mby50eXBlICk7CgoJCS8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUcKCgl9CgoJZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0oIGlkICkgewoKCQl0aGlzLmlkID0gaWQ7CgoJCVVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOyAvLyBtaXgtaW4KCgl9CgoJU3RydWN0dXJlZFVuaWZvcm0ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgdmFsdWUgKSB7CgoJCS8vIE5vdGU6IERvbid0IG5lZWQgYW4gZXh0cmEgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIsIHNpbmNlIHNhbXBsZXJzCgkJLy8gYXJlIG5vdCBhbGxvd2VkIGluIHN0cnVjdHVyZWQgdW5pZm9ybXMuCgoJCXZhciBzZXEgPSB0aGlzLnNlcTsKCgkJZm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCXZhciB1ID0gc2VxWyBpIF07CgkJCXUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdICk7CgoJCX0KCgl9OwoKCS8vIC0tLSBUb3AtbGV2ZWwgLS0tCgoJLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5ncwoKCXZhciBSZVBhdGhQYXJ0ID0gLyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7CgoJLy8gZXh0cmFjdHMKCS8vIAktIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleCkKCS8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpCgkvLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdCkKCS8vCgkvLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZAoJLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXMKCS8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLgoKCWZ1bmN0aW9uIGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCApIHsKCgkJY29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7CgkJY29udGFpbmVyLm1hcFsgdW5pZm9ybU9iamVjdC5pZCBdID0gdW5pZm9ybU9iamVjdDsKCgl9CgoJZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7CgoJCXZhciBwYXRoID0gYWN0aXZlSW5mby5uYW1lLAoJCQlwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGg7CgoJCS8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW4KCQlSZVBhdGhQYXJ0Lmxhc3RJbmRleCA9IDA7CgoJCWZvciAoIDsgOyApIHsKCgkJCXZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLAoJCQkJbWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCwKCgkJCQlpZCA9IG1hdGNoWyAxIF0sCgkJCQlpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAnXScsCgkJCQlzdWJzY3JpcHQgPSBtYXRjaFsgMyBdOwoKCQkJaWYgKCBpZElzSW5kZXggKSBpZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyCgoJCQlpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHsKCgkJCQkvLyBiYXJlIG5hbWUgb3IgInB1cmUiIGJvdHRvbS1sZXZlbCBhcnJheSAiWzBdIiBzdWZmaXgKCgkJCQlhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkID8KCQkJCQluZXcgU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSA6CgkJCQkJbmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTsKCgkJCQlicmVhazsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gc3RlcCBpbnRvIGlubmVyIG5vZGUgLyBjcmVhdGUgaXQgaW4gY2FzZSBpdCBkb2Vzbid0IGV4aXN0CgoJCQkJdmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07CgoJCQkJaWYgKCBuZXh0ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCW5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7CgkJCQkJYWRkVW5pZm9ybSggY29udGFpbmVyLCBuZXh0ICk7CgoJCQkJfQoKCQkJCWNvbnRhaW5lciA9IG5leHQ7CgoJCQl9CgoJCX0KCgl9CgoJLy8gUm9vdCBDb250YWluZXIKCglmdW5jdGlvbiBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKSB7CgoJCVVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOwoKCQl0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7CgoJCXZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TICk7CgoJCWZvciAoIHZhciBpID0gMDsgaSA8IG47ICsrIGkgKSB7CgoJCQl2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0oIHByb2dyYW0sIGkgKSwKCQkJCXBhdGggPSBpbmZvLm5hbWUsCgkJCQlhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBwYXRoICk7CgoJCQlwYXJzZVVuaWZvcm0oIGluZm8sIGFkZHIsIHRoaXMgKTsKCgkJfQoKCX0KCglXZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkgewoKCQl2YXIgdSA9IHRoaXMubWFwWyBuYW1lIF07CgoJCWlmICggdSAhPT0gdW5kZWZpbmVkICkgdS5zZXRWYWx1ZSggZ2wsIHZhbHVlLCB0aGlzLnJlbmRlcmVyICk7CgoJfTsKCglXZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHsKCgkJdmFyIHYgPSBvYmplY3RbIG5hbWUgXTsKCgkJaWYgKCB2ICE9PSB1bmRlZmluZWQgKSB0aGlzLnNldFZhbHVlKCBnbCwgbmFtZSwgdiApOwoKCX07CgoKCS8vIFN0YXRpYyBpbnRlcmZhY2UKCglXZWJHTFVuaWZvcm1zLnVwbG9hZCA9IGZ1bmN0aW9uICggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApIHsKCgkJZm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCXZhciB1ID0gc2VxWyBpIF0sCgkJCQl2ID0gdmFsdWVzWyB1LmlkIF07CgoJCQlpZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkgewoKCQkJCS8vIG5vdGU6IGFsd2F5cyB1cGRhdGluZyB3aGVuIC5uZWVkc1VwZGF0ZSBpcyB1bmRlZmluZWQKCQkJCXUuc2V0VmFsdWUoIGdsLCB2LnZhbHVlLCByZW5kZXJlciApOwoKCQkJfQoKCQl9CgoJfTsKCglXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7CgoJCXZhciByID0gW107CgoJCWZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQl2YXIgdSA9IHNlcVsgaSBdOwoJCQlpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7CgoJCX0KCgkJcmV0dXJuIHI7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCgl2YXIgQ29sb3JLZXl3b3JkcyA9IHsgJ2FsaWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgwMEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLAoJCSdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMiwKCQknYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsCgkJJ2Nvcm5mbG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFuJzogMHgwMDhCOEIsCgkJJ2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsCgkJJ2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4RiwKCQknZGFya3NsYXRlYmx1ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQwMEQzLAoJCSdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLAoJCSdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLAoJCSdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCwKCQknaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLAoJCSdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsCgkJJ2xpZ2h0Z3JlZW4nOiAweDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICdsaWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRza3libHVlJzogMHg4N0NFRkEsCgkJJ2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMiwKCQknbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsCgkJJ21lZGl1bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNsYXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1bXR1cnF1b2lzZSc6IDB4NDhEMUNDLAoJCSdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELAoJCSduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsCgkJJ3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hpcCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksCgkJJ3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4RiwKCQkncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSwKCQknc2llbm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwgJ3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXknOiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSwKCQknc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLAoJCSd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07CgoJZnVuY3Rpb24gQ29sb3IoIHIsIGcsIGIgKSB7CgoJCWlmICggZyA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIHIgaXMgVEhSRUUuQ29sb3IsIGhleCBvciBzdHJpbmcKCQkJcmV0dXJuIHRoaXMuc2V0KCByICk7CgoJCX0KCgkJcmV0dXJuIHRoaXMuc2V0UkdCKCByLCBnLCBiICk7CgoJfQoKCU9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwgewoKCQlpc0NvbG9yOiB0cnVlLAoKCQlyOiAxLCBnOiAxLCBiOiAxLAoKCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQlpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7CgoJCQkJdGhpcy5jb3B5KCB2YWx1ZSApOwoKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHsKCgkJCQl0aGlzLnNldEhleCggdmFsdWUgKTsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7CgoJCQkJdGhpcy5zZXRTdHlsZSggdmFsdWUgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJdGhpcy5yID0gc2NhbGFyOwoJCQl0aGlzLmcgPSBzY2FsYXI7CgkJCXRoaXMuYiA9IHNjYWxhcjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkgewoKCQkJaGV4ID0gTWF0aC5mbG9vciggaGV4ICk7CgoJCQl0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1OwoJCQl0aGlzLmcgPSAoIGhleCA+PiA4ICYgMjU1ICkgLyAyNTU7CgkJCXRoaXMuYiA9ICggaGV4ICYgMjU1ICkgLyAyNTU7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0UkdCOiBmdW5jdGlvbiAoIHIsIGcsIGIgKSB7CgoJCQl0aGlzLnIgPSByOwoJCQl0aGlzLmcgPSBnOwoJCQl0aGlzLmIgPSBiOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEhTTDogZnVuY3Rpb24gKCkgewoKCQkJZnVuY3Rpb24gaHVlMnJnYiggcCwgcSwgdCApIHsKCgkJCQlpZiAoIHQgPCAwICkgdCArPSAxOwoJCQkJaWYgKCB0ID4gMSApIHQgLT0gMTsKCQkJCWlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDsKCQkJCWlmICggdCA8IDEgLyAyICkgcmV0dXJuIHE7CgkJCQlpZiAoIHQgPCAyIC8gMyApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqICggMiAvIDMgLSB0ICk7CgkJCQlyZXR1cm4gcDsKCgkJCX0KCgkJCXJldHVybiBmdW5jdGlvbiBzZXRIU0woIGgsIHMsIGwgKSB7CgoJCQkJLy8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjAKCQkJCWggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTsKCQkJCXMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApOwoJCQkJbCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7CgoJCQkJaWYgKCBzID09PSAwICkgewoKCQkJCQl0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7CgkJCQkJdmFyIHEgPSAoIDIgKiBsICkgLSBwOwoKCQkJCQl0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTsKCQkJCQl0aGlzLmcgPSBodWUycmdiKCBxLCBwLCBoICk7CgkJCQkJdGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7CgoJCQkJfQoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQlzZXRTdHlsZTogZnVuY3Rpb24gKCBzdHlsZSApIHsKCgkJCWZ1bmN0aW9uIGhhbmRsZUFscGhhKCBzdHJpbmcgKSB7CgoJCQkJaWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCgkJCQlpZiAoIHBhcnNlRmxvYXQoIHN0cmluZyApIDwgMSApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7CgoJCQkJfQoKCQkJfQoKCgkJCXZhciBtOwoKCQkJaWYgKCBtID0gL14oKD86cmdifGhzbClhPylcKFxzKihbXlwpXSopXCkvLmV4ZWMoIHN0eWxlICkgKSB7CgoJCQkJLy8gcmdiIC8gaHNsCgoJCQkJdmFyIGNvbG9yOwoJCQkJdmFyIG5hbWUgPSBtWyAxIF07CgkJCQl2YXIgY29tcG9uZW50cyA9IG1bIDIgXTsKCgkJCQlzd2l0Y2ggKCBuYW1lICkgewoKCQkJCQljYXNlICdyZ2InOgoJCQkJCWNhc2UgJ3JnYmEnOgoKCQkJCQkJaWYgKCBjb2xvciA9IC9eKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7CgoJCQkJCQkJLy8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpCgkJCQkJCQl0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1OwoJCQkJCQkJdGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTsKCQkJCQkJCXRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7CgoJCQkJCQkJaGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTsKCgkJCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkJCX0KCgkJCQkJCWlmICggY29sb3IgPSAvXihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkgewoKCQkJCQkJCS8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KQoJCQkJCQkJdGhpcy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDsKCQkJCQkJCXRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDA7CgkJCQkJCQl0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwOwoKCQkJCQkJCWhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7CgoJCQkJCQkJcmV0dXJuIHRoaXM7CgoJCQkJCQl9CgoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnaHNsJzoKCQkJCQljYXNlICdoc2xhJzoKCgkJCQkJCWlmICggY29sb3IgPSAvXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHsKCgkJCQkJCQkvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KQoJCQkJCQkJdmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7CgkJCQkJCQl2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwOwoJCQkJCQkJdmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDsKCgkJCQkJCQloYW5kbGVBbHBoYSggY29sb3JbIDUgXSApOwoKCQkJCQkJCXJldHVybiB0aGlzLnNldEhTTCggaCwgcywgbCApOwoKCQkJCQkJfQoKCQkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggbSA9IC9eXCMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7CgoJCQkJLy8gaGV4IGNvbG9yCgoJCQkJdmFyIGhleCA9IG1bIDEgXTsKCQkJCXZhciBzaXplID0gaGV4Lmxlbmd0aDsKCgkJCQlpZiAoIHNpemUgPT09IDMgKSB7CgoJCQkJCS8vICNmZjAKCQkJCQl0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMCApLCAxNiApIC8gMjU1OwoJCQkJCXRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAxICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7CgkJCQkJdGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTsKCgkJCQkJcmV0dXJuIHRoaXM7CgoJCQkJfSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHsKCgkJCQkJLy8gI2ZmMDAwMAoJCQkJCXRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7CgkJCQkJdGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDMgKSwgMTYgKSAvIDI1NTsKCQkJCQl0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggNCApICsgaGV4LmNoYXJBdCggNSApLCAxNiApIC8gMjU1OwoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHN0eWxlICYmIHN0eWxlLmxlbmd0aCA+IDAgKSB7CgoJCQkJLy8gY29sb3Iga2V5d29yZHMKCQkJCXZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdOwoKCQkJCWlmICggaGV4ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCS8vIHJlZAoJCQkJCXRoaXMuc2V0SGV4KCBoZXggKTsKCgkJCQl9IGVsc2UgewoKCQkJCQkvLyB1bmtub3duIGNvbG9yCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgJyArIHN0eWxlICk7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuciwgdGhpcy5nLCB0aGlzLmIgKTsKCgkJfSwKCgkJY29weTogZnVuY3Rpb24gKCBjb2xvciApIHsKCgkJCXRoaXMuciA9IGNvbG9yLnI7CgkJCXRoaXMuZyA9IGNvbG9yLmc7CgkJCXRoaXMuYiA9IGNvbG9yLmI7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY29weUdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkgewoKCQkJaWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7CgoJCQl0aGlzLnIgPSBNYXRoLnBvdyggY29sb3IuciwgZ2FtbWFGYWN0b3IgKTsKCQkJdGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7CgkJCXRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBnYW1tYUZhY3RvciApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHsKCgkJCWlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wOwoKCQkJdmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDsKCgkJCXRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApOwoJCQl0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgc2FmZUludmVyc2UgKTsKCQkJdGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY29udmVydEdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iOwoKCQkJdGhpcy5yID0gciAqIHI7CgkJCXRoaXMuZyA9IGcgKiBnOwoJCQl0aGlzLmIgPSBiICogYjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljb252ZXJ0TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5yID0gTWF0aC5zcXJ0KCB0aGlzLnIgKTsKCQkJdGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTsKCQkJdGhpcy5iID0gTWF0aC5zcXJ0KCB0aGlzLmIgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlnZXRIZXg6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwOwoKCQl9LAoKCQlnZXRIZXhTdHJpbmc6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiAoICcwMDAwMDAnICsgdGhpcy5nZXRIZXgoKS50b1N0cmluZyggMTYgKSApLnNsaWNlKCAtIDYgKTsKCgkJfSwKCgkJZ2V0SFNMOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJLy8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjAKCgkJCXZhciBoc2wgPSBvcHRpb25hbFRhcmdldCB8fCB7IGg6IDAsIHM6IDAsIGw6IDAgfTsKCgkJCXZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iOwoKCQkJdmFyIG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7CgkJCXZhciBtaW4gPSBNYXRoLm1pbiggciwgZywgYiApOwoKCQkJdmFyIGh1ZSwgc2F0dXJhdGlvbjsKCQkJdmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7CgoJCQlpZiAoIG1pbiA9PT0gbWF4ICkgewoKCQkJCWh1ZSA9IDA7CgkJCQlzYXR1cmF0aW9uID0gMDsKCgkJCX0gZWxzZSB7CgoJCQkJdmFyIGRlbHRhID0gbWF4IC0gbWluOwoKCQkJCXNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTsKCgkJCQlzd2l0Y2ggKCBtYXggKSB7CgoJCQkJCWNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7CgkJCQkJY2FzZSBnOiBodWUgPSAoIGIgLSByICkgLyBkZWx0YSArIDI7IGJyZWFrOwoJCQkJCWNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhazsKCgkJCQl9CgoJCQkJaHVlIC89IDY7CgoJCQl9CgoJCQloc2wuaCA9IGh1ZTsKCQkJaHNsLnMgPSBzYXR1cmF0aW9uOwoJCQloc2wubCA9IGxpZ2h0bmVzczsKCgkJCXJldHVybiBoc2w7CgoJCX0sCgoJCWdldFN0eWxlOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknOwoKCQl9LAoKCQlvZmZzZXRIU0w6IGZ1bmN0aW9uICggaCwgcywgbCApIHsKCgkJCXZhciBoc2wgPSB0aGlzLmdldEhTTCgpOwoKCQkJaHNsLmggKz0gaDsgaHNsLnMgKz0gczsgaHNsLmwgKz0gbDsKCgkJCXRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkOiBmdW5jdGlvbiAoIGNvbG9yICkgewoKCQkJdGhpcy5yICs9IGNvbG9yLnI7CgkJCXRoaXMuZyArPSBjb2xvci5nOwoJCQl0aGlzLmIgKz0gY29sb3IuYjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhZGRDb2xvcnM6IGZ1bmN0aW9uICggY29sb3IxLCBjb2xvcjIgKSB7CgoJCQl0aGlzLnIgPSBjb2xvcjEuciArIGNvbG9yMi5yOwoJCQl0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nOwoJCQl0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKCQkJdGhpcy5yICs9IHM7CgkJCXRoaXMuZyArPSBzOwoJCQl0aGlzLmIgKz0gczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7CgoJCQl0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApOwoJCQl0aGlzLmcgPSBNYXRoLm1heCggMCwgdGhpcy5nIC0gY29sb3IuZyApOwoJCQl0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW11bHRpcGx5OiBmdW5jdGlvbiAoIGNvbG9yICkgewoKCQkJdGhpcy5yICo9IGNvbG9yLnI7CgkJCXRoaXMuZyAqPSBjb2xvci5nOwoJCQl0aGlzLmIgKj0gY29sb3IuYjsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKCQkJdGhpcy5yICo9IHM7CgkJCXRoaXMuZyAqPSBzOwoJCQl0aGlzLmIgKj0gczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHsKCgkJCXRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhOwoJCQl0aGlzLmcgKz0gKCBjb2xvci5nIC0gdGhpcy5nICkgKiBhbHBoYTsKCQkJdGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIGMgKSB7CgoJCQlyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7CgoJCX0sCgoJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQl0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07CgkJCXRoaXMuZyA9IGFycmF5WyBvZmZzZXQgKyAxIF07CgkJCXRoaXMuYiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQlhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7CgkJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7CgkJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLmI7CgoJCQlyZXR1cm4gYXJyYXk7CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0SGV4KCk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBVbmlmb3JtcyBsaWJyYXJ5IGZvciBzaGFyZWQgd2ViZ2wgc2hhZGVycwoJICovCgoJdmFyIFVuaWZvcm1zTGliID0gewoKCQljb21tb246IHsKCgkJCWRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LAoJCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSwKCgkJCW1hcDogeyB2YWx1ZTogbnVsbCB9LAoJCQl1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9LAoKCQkJYWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSwKCgkJfSwKCgkJc3BlY3VsYXJtYXA6IHsKCgkJCXNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sCgoJCX0sCgoJCWVudm1hcDogewoKCQkJZW52TWFwOiB7IHZhbHVlOiBudWxsIH0sCgkJCWZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LAoJCQlyZWZsZWN0aXZpdHk6IHsgdmFsdWU6IDEuMCB9LAoJCQlyZWZyYWN0aW9uUmF0aW86IHsgdmFsdWU6IDAuOTggfQoKCQl9LAoKCQlhb21hcDogewoKCQkJYW9NYXA6IHsgdmFsdWU6IG51bGwgfSwKCQkJYW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfQoKCQl9LAoKCQlsaWdodG1hcDogewoKCQkJbGlnaHRNYXA6IHsgdmFsdWU6IG51bGwgfSwKCQkJbGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfQoKCQl9LAoKCQllbWlzc2l2ZW1hcDogewoKCQkJZW1pc3NpdmVNYXA6IHsgdmFsdWU6IG51bGwgfQoKCQl9LAoKCQlidW1wbWFwOiB7CgoJCQlidW1wTWFwOiB7IHZhbHVlOiBudWxsIH0sCgkJCWJ1bXBTY2FsZTogeyB2YWx1ZTogMSB9CgoJCX0sCgoJCW5vcm1hbG1hcDogewoKCQkJbm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sCgkJCW5vcm1hbFNjYWxlOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiggMSwgMSApIH0KCgkJfSwKCgkJZGlzcGxhY2VtZW50bWFwOiB7CgoJCQlkaXNwbGFjZW1lbnRNYXA6IHsgdmFsdWU6IG51bGwgfSwKCQkJZGlzcGxhY2VtZW50U2NhbGU6IHsgdmFsdWU6IDEgfSwKCQkJZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9CgoJCX0sCgoJCXJvdWdobmVzc21hcDogewoKCQkJcm91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0KCgkJfSwKCgkJbWV0YWxuZXNzbWFwOiB7CgoJCQltZXRhbG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfQoKCQl9LAoKCQlncmFkaWVudG1hcDogewoKCQkJZ3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfQoKCQl9LAoKCQlmb2c6IHsKCgkJCWZvZ0RlbnNpdHk6IHsgdmFsdWU6IDAuMDAwMjUgfSwKCQkJZm9nTmVhcjogeyB2YWx1ZTogMSB9LAoJCQlmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSwKCQkJZm9nQ29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhmZmZmZmYgKSB9CgoJCX0sCgoJCWxpZ2h0czogewoKCQkJYW1iaWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sCgoJCQlkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKCQkJCWRpcmVjdGlvbjoge30sCgkJCQljb2xvcjoge30sCgoJCQkJc2hhZG93OiB7fSwKCQkJCXNoYWRvd0JpYXM6IHt9LAoJCQkJc2hhZG93UmFkaXVzOiB7fSwKCQkJCXNoYWRvd01hcFNpemU6IHt9CgkJCX0gfSwKCgkJCWRpcmVjdGlvbmFsU2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LAoJCQlkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSwKCgkJCXNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7CgkJCQljb2xvcjoge30sCgkJCQlwb3NpdGlvbjoge30sCgkJCQlkaXJlY3Rpb246IHt9LAoJCQkJZGlzdGFuY2U6IHt9LAoJCQkJY29uZUNvczoge30sCgkJCQlwZW51bWJyYUNvczoge30sCgkJCQlkZWNheToge30sCgoJCQkJc2hhZG93OiB7fSwKCQkJCXNoYWRvd0JpYXM6IHt9LAoJCQkJc2hhZG93UmFkaXVzOiB7fSwKCQkJCXNoYWRvd01hcFNpemU6IHt9CgkJCX0gfSwKCgkJCXNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sCgkJCXNwb3RTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sCgoJCQlwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKCQkJCWNvbG9yOiB7fSwKCQkJCXBvc2l0aW9uOiB7fSwKCQkJCWRlY2F5OiB7fSwKCQkJCWRpc3RhbmNlOiB7fSwKCgkJCQlzaGFkb3c6IHt9LAoJCQkJc2hhZG93Qmlhczoge30sCgkJCQlzaGFkb3dSYWRpdXM6IHt9LAoJCQkJc2hhZG93TWFwU2l6ZToge30sCgkJCQlzaGFkb3dDYW1lcmFOZWFyOiB7fSwKCQkJCXNoYWRvd0NhbWVyYUZhcjoge30KCQkJfSB9LAoKCQkJcG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sCgkJCXBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LAoKCQkJaGVtaXNwaGVyZUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKCQkJCWRpcmVjdGlvbjoge30sCgkJCQlza3lDb2xvcjoge30sCgkJCQlncm91bmRDb2xvcjoge30KCQkJfSB9LAoKCQkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgQlJERiBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGZyb20gZXhhbXBsZSB0byBtYWluIHNyYwoJCQlyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKCQkJCWNvbG9yOiB7fSwKCQkJCXBvc2l0aW9uOiB7fSwKCQkJCXdpZHRoOiB7fSwKCQkJCWhlaWdodDoge30KCQkJfSB9CgoJCX0sCgoJCXBvaW50czogewoKCQkJZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sCgkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LAoJCQlzaXplOiB7IHZhbHVlOiAxLjAgfSwKCQkJc2NhbGU6IHsgdmFsdWU6IDEuMCB9LAoJCQltYXA6IHsgdmFsdWU6IG51bGwgfSwKCQkJdXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfQoKCQl9CgoJfTsKCgkvKioKCSAqIFVuaWZvcm0gVXRpbGl0aWVzCgkgKi8KCgl2YXIgVW5pZm9ybXNVdGlscyA9IHsKCgkJbWVyZ2U6IGZ1bmN0aW9uICggdW5pZm9ybXMgKSB7CgoJCQl2YXIgbWVyZ2VkID0ge307CgoJCQlmb3IgKCB2YXIgdSA9IDA7IHUgPCB1bmlmb3Jtcy5sZW5ndGg7IHUgKysgKSB7CgoJCQkJdmFyIHRtcCA9IHRoaXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTsKCgkJCQlmb3IgKCB2YXIgcCBpbiB0bXAgKSB7CgoJCQkJCW1lcmdlZFsgcCBdID0gdG1wWyBwIF07CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIG1lcmdlZDsKCgkJfSwKCgkJY2xvbmU6IGZ1bmN0aW9uICggdW5pZm9ybXNfc3JjICkgewoKCQkJdmFyIHVuaWZvcm1zX2RzdCA9IHt9OwoKCQkJZm9yICggdmFyIHUgaW4gdW5pZm9ybXNfc3JjICkgewoKCQkJCXVuaWZvcm1zX2RzdFsgdSBdID0ge307CgoJCQkJZm9yICggdmFyIHAgaW4gdW5pZm9ybXNfc3JjWyB1IF0gKSB7CgoJCQkJCXZhciBwYXJhbWV0ZXJfc3JjID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTsKCgkJCQkJaWYgKCBwYXJhbWV0ZXJfc3JjICYmICggcGFyYW1ldGVyX3NyYy5pc0NvbG9yIHx8CgkJCQkJCXBhcmFtZXRlcl9zcmMuaXNNYXRyaXgzIHx8IHBhcmFtZXRlcl9zcmMuaXNNYXRyaXg0IHx8CgkJCQkJCXBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8CgkJCQkJCXBhcmFtZXRlcl9zcmMuaXNUZXh0dXJlICkgKSB7CgoJCQkJCQl1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5jbG9uZSgpOwoKCQkJCQl9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJfc3JjICkgKSB7CgoJCQkJCQl1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5zbGljZSgpOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJdW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gdW5pZm9ybXNfZHN0OwoKCQl9CgoJfTsKCgl2YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmXG4iOwoKCXZhciBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XG4jZW5kaWZcbiI7CgoJdmFyIGFscGhhdGVzdF9mcmFnbWVudCA9ICIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmXG4iOwoKCXZhciBhb21hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKVxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmXG4iOwoKCXZhciBhb21hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiOwoKCXZhciBiZWdpbl92ZXJ0ZXggPSAiXG52ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcbiI7CgoJdmFyIGJlZ2lubm9ybWFsX3ZlcnRleCA9ICJcbnZlYzMgb2JqZWN0Tm9ybWFsID0gdmVjMyggbm9ybWFsICk7XG4iOwoKCXZhciBic2RmcyA9ICJmbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcblx0aWYoIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxuXHRcdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0XHRmbG9hdCBtYXhEaXN0YW5jZUN1dG9mZkZhY3RvciA9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7XG5cdFx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZiAqIG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yO1xuI2Vsc2Vcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG4jZW5kaWZcblx0fVxuXHRyZXR1cm4gMS4wO1xufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgPSAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgdGhldGEgPSBhY29zKCBkb3QoIE4sIFYgKSApO1xuXHR2ZWMyIHV2ID0gdmVjMihcblx0XHRzcXJ0KCBzYXR1cmF0ZSggcm91Z2huZXNzICkgKSxcblx0XHRzYXR1cmF0ZSggdGhldGEgLyAoIDAuNSAqIFBJICkgKSApO1xuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSA9IGFicyggeCApO1xuXHRmbG9hdCBhID0gMC44NjI2NyArICgwLjQ5Nzg4ICsgMC4wMTQzNiAqIHkgKSAqIHk7XG5cdGZsb2F0IGIgPSAzLjQ1MDY4ICsgKDQuMTg4MTQgKyB5KSAqIHk7XG5cdGZsb2F0IHYgPSBhIC8gYjtcblx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoeCA+IDAuMCkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIDEuMCAtIHggKiB4ICkgLSB2O1xuXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XG59XG52ZWMzIExUQ19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZlYzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSApIHtcblx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcblx0dmVjMyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTtcblx0dmVjMyBsaWdodE5vcm1hbCA9IGNyb3NzKCB2MSwgdjIgKTtcblx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcblx0dmVjMyBUMSwgVDI7XG5cdFQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7XG5cdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcblx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlTWF0MyggbWF0MyggVDEsIFQyLCBOICkgKTtcblx0dmVjMyBjb29yZHNbIDQgXTtcblx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcblx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTtcblx0Y29vcmRzWyAyIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDIgXSAtIFAgKTtcblx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcblx0Y29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XG5cdGNvb3Jkc1sgMSBdID0gbm9ybWFsaXplKCBjb29yZHNbIDEgXSApO1xuXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcblx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XG5cdHZlYzMgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAuMCApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMiBdLCBjb29yZHNbIDMgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XG5cdHZlYzMgcmVzdWx0ID0gdmVjMyggTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHZlYzIgQUIgPSB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuIjsKCgl2YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQlVNUE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcblx0dmVjMiBkSGR4eV9md2QoKSB7XG5cdFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xuXHRcdHZlYzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcblx0XHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XG5cdFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XG5cdFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XG5cdFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XG5cdH1cblx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSApIHtcblx0XHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdk4gPSBzdXJmX25vcm07XG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcblx0XHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApO1xuXHRcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xuXHRcdHJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcblx0fVxuI2VuZGlmXG4iOwoKCXZhciBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgKysgaSApIHtcblx0XHR2ZWM0IHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHRcdFxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCA9IHRydWU7XG5cdFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyArKyBpICkge1xuXHRcdFx0dmVjNCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkID0gKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdFxuXHQjZW5kaWZcbiNlbmRpZlxuIjsKCgl2YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZlxuIjsKCgl2YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4iOwoKCXZhciBjbGlwcGluZ19wbGFuZXNfdmVydGV4ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmXG4iOwoKCXZhciBjb2xvcl9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xuI2VuZGlmIjsKCgl2YXIgY29sb3JfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XG4jZW5kaWZcbiI7CgoJdmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiI7CgoJdmFyIGNvbG9yX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogPSBjb2xvci54eXo7XG4jZW5kaWYiOwoKCXZhciBjb21tb24gPSAiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgPSBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XG5cdG1hdDMgdG1wO1xuXHR0bXBbIDAgXSA9IHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcblx0dG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XG5cdHRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xuXHRyZXR1cm4gdG1wO1xufVxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcblx0dmVjMyB3ZWlnaHRzID0gdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xuXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcbn1cbiI7CgoJdmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9ICIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSA9IC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzID0gZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyA9IGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSA9IGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCA9IG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsID0gMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgPSByb3VnaG5lc3NMZXZlbCA+IGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCA9IGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkID0gdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgPSByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0ID0gMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcblx0c2NhbGUgPSAgYlJlcyAmJiAoc2NhbGUgPCBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgPSBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSA9IDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSA9PSAwKSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSA9PSAxKSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDIpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDQpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyID0gbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCA9IDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzID0gKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdobmVzc1ZhbCA9IHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSA9IGZsb29yKHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyID0gcjEgKyAxLjA7XG5cdGZsb2F0IHQgPSBmcmFjdChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyA9IG1pcEluZm8ueTtcblx0ZmxvYXQgbGV2ZWwwID0gbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XG5cdGxldmVsMSA9IGxldmVsMSA+IDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICs9IG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1bHQgPSBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XG59XG4jZW5kaWZcbiI7CgoJdmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gInZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiI7CgoJdmFyIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XG5cdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7XG5cdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhcztcbiNlbmRpZlxuIjsKCgl2YXIgZGlzcGxhY2VtZW50bWFwX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArPSBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWZcbiI7CgoJdmFyIGVtaXNzaXZlbWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcblx0dmVjNCBlbWlzc2l2ZUNvbG9yID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdlV2ICk7XG5cdGVtaXNzaXZlQ29sb3IucmdiID0gZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xuXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XG4jZW5kaWZcbiI7CgoJdmFyIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZlxuIjsKCgl2YXIgZW5jb2RpbmdzX2ZyYWdtZW50ID0gIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG4iOwoKCXZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9ICJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnh5eiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS53ICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLncgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS53ICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCA9IG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNICAgICAgPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gICAgICAgICAgICA9IGNlaWwoIE0gKiAyNTUuMCApIC8gMjU1LjA7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBtYXhSYW5nZSApLCBNICk7XG59XG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoICggbWF4UmFuZ2UgLyAyNTUuMCApIC8gdmFsdWUuYSApLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JEKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBEICAgICAgPSBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCAgICAgICAgICAgID0gbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSA9IG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xuXHR2ZWMzIFhwX1lfWFlacCA9IHZhbHVlLnJnYiAqIGNMb2dMdXZNO1xuXHRYcF9ZX1hZWnAgPSBtYXgoWHBfWV9YWVpwLCB2ZWMzKDFlLTYsIDFlLTYsIDFlLTYpKTtcblx0dmVjNCB2UmVzdWx0O1xuXHR2UmVzdWx0Lnh5ID0gWHBfWV9YWVpwLnh5IC8gWHBfWV9YWVpwLno7XG5cdGZsb2F0IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcblx0dlJlc3VsdC53ID0gZnJhY3QoTGUpO1xuXHR2UmVzdWx0LnogPSAoTGUgLSAoZmxvb3IodlJlc3VsdC53KjI1NS4wKSkvMjU1LjApLzI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSA9IGV4cDIoKExlIC0gMTI3LjApIC8gMi4wKTtcblx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XG5cdFhwX1lfWFlacC54ID0gdmFsdWUueCAqIFhwX1lfWFlacC56O1xuXHR2ZWMzIHZSR0IgPSBYcF9ZX1hZWnAucmdiICogY0xvZ0x1dkludmVyc2VNO1xuXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCApO1xufVxuIjsKCgl2YXIgZW52bWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbHNlXG5cdFx0dmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7XG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXG5cdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCByZWZsZWN0VmVjICk7XG5cdFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCByZWZsZWN0VmVjLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0XHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcblx0XHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCByZWZsZWN0VmVjICk7XG5cdFx0dmVjMyByZWZsZWN0VmlldyA9IG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsIDAuMCwgMS4wICkgKTtcblx0XHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41ICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xuXHQjZW5kaWZcblx0ZW52Q29sb3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xuXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXG5cdFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfTUlYIClcblx0XHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApXG5cdFx0b3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5O1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKCgl2YXIgZW52bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAoIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgKVxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHQjZW5kaWZcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKCgl2YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWZcbiI7CgoJdmFyIGVudm1hcF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcblx0XHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xuXHQjZWxzZVxuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxuIjsKCgl2YXIgZm9nX3ZlcnRleCA9ICJcbiNpZmRlZiBVU0VfRk9HXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiOwoKCXZhciBmb2dfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9GT0dcbiAgdmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZlxuIjsKCgl2YXIgZm9nX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRk9HXG5cdCNpZmRlZiBGT0dfRVhQMlxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7XG5cdCNlbmRpZlxuXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XG4jZW5kaWZcbiI7CgoJdmFyIGZvZ19wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWZcbiI7CgoJdmFyIGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFRPT05cblx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XG5cdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xuXHRcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XG5cdFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gKCBjb29yZC54IDwgMC43ICkgPyB2ZWMzKCAwLjcgKSA6IHZlYzMoIDEuMCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiI7CgoJdmFyIGxpZ2h0bWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmXG4iOwoKCXZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTElHSFRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XG5cdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiOwoKCXZhciBsaWdodHNfbGFtYmVydF92ZXJ0ZXggPSAidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIC1tdlBvc2l0aW9uLnh5eiApO1xuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcbmJhY2tHZW9tZXRyeS5ub3JtYWwgPSAtZ2VvbWV0cnkubm9ybWFsO1xuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuZmxvYXQgZG90Tkw7XG52ZWMzIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4iOwoKCXZhciBsaWdodHNfcGFycyA9ICJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyA+IHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y01hdDtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y01hZztcblx0dW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdO1xuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIHNreUNvbG9yO1xuXHRcdHZlYzMgZ3JvdW5kQ29sb3I7XG5cdH07XG5cdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xuXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XG5cdFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGlycmFkaWFuY2U7XG5cdH1cbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9uZW50ICkgKyAxLjAgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGZsb2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLWdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYocXVlcnlSZWZsZWN0VmVjLCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoYmxpbm5TaGluaW5lc3NFeHBvbmVudCkpO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWZcbiI7CgoJdmFyIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9ICJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcbiI7CgoJdmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdFx0c3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHQjaWZkZWYgVE9PTlxuXHRcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApXG4iOwoKCXZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSAiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBTVEFOREFSRFxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XHRtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBjbGFtcCggY2xlYXJDb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuIjsKCgl2YXIgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSAic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdGZsb2F0IGNsZWFyQ29hdDtcblx0XHRmbG9hdCBjbGVhckNvYXRSb3VnaG5lc3M7XG5cdCNlbmRpZlxufTtcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XG4jZGVmaW5lIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4wNFxuZmxvYXQgY2xlYXJDb2F0REhSQXBwcm94KCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkge1xuXHRyZXR1cm4gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCArICggMS4wIC0gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApICogKCBwb3coIDEuMCAtIGRvdE5MLCA1LjAgKSAqIHBvdyggMS4wIC0gcm91Z2huZXNzLCAyLjAgKSApO1xufVxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0XHR2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0XHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xuXHRcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHR2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcblx0XHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yO1xuXHRcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzO1xuXHRcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xuXHRcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcdFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBub3JtID0gdGV4dHVyZTJEKCBsdGNNYWcsIHV2ICkuYTtcblx0XHR2ZWM0IHQgPSB0ZXh0dXJlMkQoIGx0Y01hdCwgdXYgKTtcblx0XHRtYXQzIG1JbnYgPSBtYXQzKFxuXHRcdFx0dmVjMyggICAxLCAgIDAsIHQueSApLFxuXHRcdFx0dmVjMyggICAwLCB0LnosICAgMCApLFxuXHRcdFx0dmVjMyggdC53LCAgIDAsIHQueCApXG5cdFx0KTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIG5vcm0gKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzICk7XG5cdCNlbmRpZlxufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmbmRlZiBTVEFOREFSRFxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdE5WO1xuXHRcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyQ29hdERIUiA9IDAuMDtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBjbGVhckNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbiNkZWZpbmUgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKVxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn1cbiI7CgoJdmFyIGxpZ2h0c190ZW1wbGF0ZSA9ICJcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBzcG90TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWZkZWYgVVNFX1NIQURPV01BUFxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XG5cdFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCA4ICk7XG5cdCNlbmRpZlxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0dmVjMyByYWRpYW5jZSA9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSwgOCApO1xuXHQjaWZuZGVmIFNUQU5EQVJEXG5cdFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIDggKTtcblx0I2Vsc2Vcblx0XHR2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlID0gdmVjMyggMC4wICk7XG5cdCNlbmRpZlxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgY2xlYXJDb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuIjsKCgl2YXIgbG9nZGVwdGhidWZfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHRnbF9GcmFnRGVwdGhFWFQgPSBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIjsKCgl2YXIgbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdCNlbmRpZlxuI2VuZGlmXG4iOwoKCXZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZW5kaWZcblx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuI2VuZGlmIjsKCgl2YXIgbG9nZGVwdGhidWZfdmVydGV4ID0gIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcblx0I2Vsc2Vcblx0XHRnbF9Qb3NpdGlvbi56ID0gbG9nMiggbWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkgKSAqIGxvZ0RlcHRoQnVmRkMgLSAxLjA7XG5cdFx0Z2xfUG9zaXRpb24ueiAqPSBnbF9Qb3NpdGlvbi53O1xuXHQjZW5kaWZcbiNlbmRpZlxuIjsKCgl2YXIgbWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XG4jZW5kaWZcbiI7CgoJdmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZlxuIjsKCgl2YXIgbWFwX3BhcnRpY2xlX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqPSBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmXG4iOwoKCXZhciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZlxuIjsKCgl2YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gImZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzcztcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXG5cdHZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XG5cdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xuI2VuZGlmXG4iOwoKCXZhciBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiOwoKCXZhciBtb3JwaG5vcm1hbF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZlxuIjsKCgl2YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07XG5cdCNlbHNlXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdCNlbmRpZlxuI2VuZGlmIjsKCgl2YXIgbW9ycGh0YXJnZXRfdmVydGV4ID0gIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmXG4iOwoKCXZhciBub3JtYWxfZnJhZ21lbnQgPSAiI2lmZGVmIEZMQVRfU0hBREVEXG5cdHZlYzMgZmR4ID0gdmVjMyggZEZkeCggdlZpZXdQb3NpdGlvbi54ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XG4jZWxzZVxuXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0bm9ybWFsID0gbm9ybWFsICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0bm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwgKTtcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZlxuIjsKCgl2YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0gKSB7XG5cdFx0dmVjMyBxMCA9IHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHExID0gdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzIgc3QwID0gZEZkeCggdlV2LnN0ICk7XG5cdFx0dmVjMiBzdDEgPSBkRmR5KCB2VXYuc3QgKTtcblx0XHR2ZWMzIFMgPSBub3JtYWxpemUoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICk7XG5cdFx0dmVjMyBUID0gbm9ybWFsaXplKCAtcTAgKiBzdDEucyArIHExICogc3QwLnMgKTtcblx0XHR2ZWMzIE4gPSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSA9IG5vcm1hbFNjYWxlICogbWFwTi54eTtcblx0XHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdH1cbiNlbmRpZlxuIjsKCgl2YXIgcGFja2luZyA9ICJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59XG4iOwoKCXZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXG5cdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XG4jZW5kaWZcbiI7CgoJdmFyIHByb2plY3RfdmVydGV4ID0gInZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XG4iOwoKCXZhciBkaXRoZXJpbmdfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIERJVEhFUklORyApXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZlxuIjsKCgl2YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIERJVEhFUklORyApXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmXG4iOwoKCXZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSAiZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWZcbiI7CgoJdmFyIHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiI7CgoJdmFyIHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdGZsb2F0IHRleHR1cmUyRFNoYWRvd0xlcnAoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgc2l6ZSwgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRjb25zdCB2ZWMyIG9mZnNldCA9IHZlYzIoIDAuMCwgMS4wICk7XG5cdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNpemU7XG5cdFx0dmVjMiBjZW50cm9pZFVWID0gZmxvb3IoIHV2ICogc2l6ZSArIDAuNSApIC8gc2l6ZTtcblx0XHRmbG9hdCBsYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IGx0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh5LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcmIgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBydCA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eSwgY29tcGFyZSApO1xuXHRcdHZlYzIgZiA9IGZyYWN0KCB1diAqIHNpemUgKyAwLjUgKTtcblx0XHRmbG9hdCBhID0gbWl4KCBsYiwgbHQsIGYueSApO1xuXHRcdGZsb2F0IGIgPSBtaXgoIHJiLCBydCwgZi55ICk7XG5cdFx0ZmxvYXQgYyA9IG1peCggYSwgYiwgZi54ICk7XG5cdFx0cmV0dXJuIGM7XG5cdH1cblx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcblx0XHRmbG9hdCBzaGFkb3cgPSAxLjA7XG5cdFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7XG5cdFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xuXHRcdGJ2ZWM0IGluRnJ1c3R1bVZlYyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBzaGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcblx0XHRib29sIGluRnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XG5cdFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMgPSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xuXHRcdGJvb2wgZnJ1c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XG5cdFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcblx0XHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcblx0XHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViA9IGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKj0gc2NhbGVUb0N1YmU7XG5cdFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyID0gdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiA+IDAuMCApXG5cdFx0XHRcdHBsYW5hci54ID0gNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwID0gKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICs9IHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4iOwoKCXZhciBzaGFkb3dtYXBfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0I2VuZGlmXG4jZW5kaWZcbiI7CgoJdmFyIHNoYWRvd21hcF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG4jZW5kaWZcbiI7CgoJdmFyIHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCA9ICJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgPSAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKj0gYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICo9IGJvb2woIHNwb3RMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn1cbiI7CgoJdmFyIHNraW5iYXNlX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xuXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcblx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XG5cdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xuI2VuZGlmIjsKCgl2YXIgc2tpbm5pbmdfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xuXHQjaWZkZWYgQk9ORV9URVhUVVJFXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XG5cdFx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdGZsb2F0IGogPSBpICogNC4wO1xuXHRcdFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCB5ID0gZmxvb3IoIGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHR5ID0gZHkgKiAoIHkgKyAwLjUgKTtcblx0XHRcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjMgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcblx0XHRcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0bWF0NCBib25lID0gYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWZcbiI7CgoJdmFyIHNraW5uaW5nX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdHZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApO1xuXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xuXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcblx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcbiNlbmRpZlxuIjsKCgl2YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0Wjtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0Vztcblx0c2tpbk1hdHJpeCAgPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xuXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcbiNlbmRpZlxuIjsKCgl2YXIgc3BlY3VsYXJtYXBfZnJhZ21lbnQgPSAiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlV2ICk7XG5cdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XG4jZWxzZVxuXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xuI2VuZGlmIjsKCgl2YXIgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xuI2VuZGlmIjsKCgl2YXIgdG9uZW1hcHBpbmdfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmXG4iOwoKCXZhciB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50ID0gIiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxuIjsKCgl2YXIgdXZfcGFyc19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiI7CgoJdmFyIHV2X3BhcnNfdmVydGV4ID0gIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG4jZW5kaWZcbiI7CgoJdmFyIHV2X3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcblx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiI7CgoJdmFyIHV2Ml9wYXJzX2ZyYWdtZW50ID0gIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiI7CgoJdmFyIHV2Ml9wYXJzX3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiI7CgoJdmFyIHV2Ml92ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgPSB1djI7XG4jZW5kaWYiOwoKCXZhciB3b3JsZHBvc192ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcblx0dmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG4jZW5kaWZcbiI7CgoJdmFyIGN1YmVfZnJhZyA9ICJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbnZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBvc2l0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcbn1cbiI7CgoJdmFyIGN1YmVfdmVydCA9ICJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XG59XG4iOwoKCXZhciBkZXB0aF9mcmFnID0gIiNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0XHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcblx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxXG5cdFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBnbF9GcmFnQ29vcmQueiApO1xuXHQjZW5kaWZcbn1cbiI7CgoJdmFyIGRlcHRoX3ZlcnQgPSAiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cbn1cbiI7CgoJdmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gIiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0ID0gc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59XG4iOwoKCXZhciBkaXN0YW5jZVJHQkFfdmVydCA9ICIjZGVmaW5lIERJU1RBTkNFXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xufVxuIjsKCgl2YXIgZXF1aXJlY3RfZnJhZyA9ICJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRzYW1wbGVVVi54ID0gYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG59XG4iOwoKCXZhciBlcXVpcmVjdF92ZXJ0ID0gInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxufVxuIjsKCgl2YXIgbGluZWRhc2hlZF9mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcbnVuaWZvcm0gZmxvYXQgdG90YWxTaXplO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xuXHRcdGRpc2NhcmQ7XG5cdH1cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59XG4iOwoKCXZhciBsaW5lZGFzaGVkX3ZlcnQgPSAidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOwoKCXZhciBtZXNoYmFzaWNfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufVxuIjsKCgl2YXIgbWVzaGJhc2ljX3ZlcnQgPSAiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CgoJdmFyIG1lc2hsYW1iZXJ0X2ZyYWcgPSAidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaW5jbHVkZSA8bGlnaHRtYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn1cbiI7CgoJdmFyIG1lc2hsYW1iZXJ0X3ZlcnQgPSAiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CgoJdmFyIG1lc2hwaG9uZ19mcmFnID0gIiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfdGVtcGxhdGU+XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn1cbiI7CgoJdmFyIG1lc2hwaG9uZ192ZXJ0ID0gIiNkZWZpbmUgUEhPTkdcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CgoJdmFyIG1lc2hwaHlzaWNhbF9mcmFnID0gIiNkZWZpbmUgUEhZU0lDQUxcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgU1RBTkRBUkRcblx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXQ7XG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfdGVtcGxhdGU+XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn1cbiI7CgoJdmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gIiNkZWZpbmUgUEhZU0lDQUxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59XG4iOwoKCXZhciBub3JtYWxfZnJhZyA9ICIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufVxuIjsKCgl2YXIgbm9ybWFsX3ZlcnQgPSAiI2RlZmluZSBOT1JNQUxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn1cbiI7CgoJdmFyIHBvaW50c19mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfcGFydGljbGVfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59XG4iOwoKCXZhciBwb2ludHNfdmVydCA9ICJ1bmlmb3JtIGZsb2F0IHNpemU7XG51bmlmb3JtIGZsb2F0IHNjYWxlO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGdsX1BvaW50U2l6ZSA9IHNpemUgKiAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTtcblx0I2Vsc2Vcblx0XHRnbF9Qb2ludFNpemUgPSBzaXplO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn1cbiI7CgoJdmFyIHNoYWRvd19mcmFnID0gInVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufVxuIjsKCgl2YXIgc2hhZG93X3ZlcnQgPSAiI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufVxuIjsKCgl2YXIgU2hhZGVyQ2h1bmsgPSB7CgkJYWxwaGFtYXBfZnJhZ21lbnQ6IGFscGhhbWFwX2ZyYWdtZW50LAoJCWFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsCgkJYWxwaGF0ZXN0X2ZyYWdtZW50OiBhbHBoYXRlc3RfZnJhZ21lbnQsCgkJYW9tYXBfZnJhZ21lbnQ6IGFvbWFwX2ZyYWdtZW50LAoJCWFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsCgkJYmVnaW5fdmVydGV4OiBiZWdpbl92ZXJ0ZXgsCgkJYmVnaW5ub3JtYWxfdmVydGV4OiBiZWdpbm5vcm1hbF92ZXJ0ZXgsCgkJYnNkZnM6IGJzZGZzLAoJCWJ1bXBtYXBfcGFyc19mcmFnbWVudDogYnVtcG1hcF9wYXJzX2ZyYWdtZW50LAoJCWNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50LAoJCWNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCwKCQljbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCwKCQljbGlwcGluZ19wbGFuZXNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfdmVydGV4LAoJCWNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCwKCQljb2xvcl9wYXJzX2ZyYWdtZW50OiBjb2xvcl9wYXJzX2ZyYWdtZW50LAoJCWNvbG9yX3BhcnNfdmVydGV4OiBjb2xvcl9wYXJzX3ZlcnRleCwKCQljb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCwKCQljb21tb246IGNvbW1vbiwKCQljdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCwKCQlkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsCgkJZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgsCgkJZGlzcGxhY2VtZW50bWFwX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3ZlcnRleCwKCQllbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsCgkJZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDogZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCwKCQllbmNvZGluZ3NfZnJhZ21lbnQ6IGVuY29kaW5nc19mcmFnbWVudCwKCQllbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsCgkJZW52bWFwX2ZyYWdtZW50OiBlbnZtYXBfZnJhZ21lbnQsCgkJZW52bWFwX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LAoJCWVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LAoJCWVudm1hcF92ZXJ0ZXg6IGVudm1hcF92ZXJ0ZXgsCgkJZm9nX3ZlcnRleDogZm9nX3ZlcnRleCwKCQlmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCwKCQlmb2dfZnJhZ21lbnQ6IGZvZ19mcmFnbWVudCwKCQlmb2dfcGFyc19mcmFnbWVudDogZm9nX3BhcnNfZnJhZ21lbnQsCgkJZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCwKCQlsaWdodG1hcF9mcmFnbWVudDogbGlnaHRtYXBfZnJhZ21lbnQsCgkJbGlnaHRtYXBfcGFyc19mcmFnbWVudDogbGlnaHRtYXBfcGFyc19mcmFnbWVudCwKCQlsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCwKCQlsaWdodHNfcGFyczogbGlnaHRzX3BhcnMsCgkJbGlnaHRzX3Bob25nX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfZnJhZ21lbnQsCgkJbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LAoJCWxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LAoJCWxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCwKCQlsaWdodHNfdGVtcGxhdGU6IGxpZ2h0c190ZW1wbGF0ZSwKCQlsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9nZGVwdGhidWZfZnJhZ21lbnQsCgkJbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCwKCQlsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDogbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgsCgkJbG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgsCgkJbWFwX2ZyYWdtZW50OiBtYXBfZnJhZ21lbnQsCgkJbWFwX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJzX2ZyYWdtZW50LAoJCW1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2ZyYWdtZW50LAoJCW1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCwKCQltZXRhbG5lc3NtYXBfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9mcmFnbWVudCwKCQltZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQsCgkJbW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsCgkJbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LAoJCW1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LAoJCW5vcm1hbF9mcmFnbWVudDogbm9ybWFsX2ZyYWdtZW50LAoJCW5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCwKCQlwYWNraW5nOiBwYWNraW5nLAoJCXByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsCgkJcHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LAoJCWRpdGhlcmluZ19mcmFnbWVudDogZGl0aGVyaW5nX2ZyYWdtZW50LAoJCWRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCwKCQlyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCwKCQlyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQsCgkJc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LAoJCXNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LAoJCXNoYWRvd21hcF92ZXJ0ZXg6IHNoYWRvd21hcF92ZXJ0ZXgsCgkJc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsCgkJc2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsCgkJc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IHNraW5uaW5nX3BhcnNfdmVydGV4LAoJCXNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LAoJCXNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCwKCQlzcGVjdWxhcm1hcF9mcmFnbWVudDogc3BlY3VsYXJtYXBfZnJhZ21lbnQsCgkJc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCwKCQl0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsCgkJdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDogdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCwKCQl1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LAoJCXV2X3BhcnNfdmVydGV4OiB1dl9wYXJzX3ZlcnRleCwKCQl1dl92ZXJ0ZXg6IHV2X3ZlcnRleCwKCQl1djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsCgkJdXYyX3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsCgkJdXYyX3ZlcnRleDogdXYyX3ZlcnRleCwKCQl3b3JsZHBvc192ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCwKCgkJY3ViZV9mcmFnOiBjdWJlX2ZyYWcsCgkJY3ViZV92ZXJ0OiBjdWJlX3ZlcnQsCgkJZGVwdGhfZnJhZzogZGVwdGhfZnJhZywKCQlkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LAoJCWRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZywKCQlkaXN0YW5jZVJHQkFfdmVydDogZGlzdGFuY2VSR0JBX3ZlcnQsCgkJZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZywKCQllcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LAoJCWxpbmVkYXNoZWRfZnJhZzogbGluZWRhc2hlZF9mcmFnLAoJCWxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LAoJCW1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZywKCQltZXNoYmFzaWNfdmVydDogbWVzaGJhc2ljX3ZlcnQsCgkJbWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZywKCQltZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LAoJCW1lc2hwaG9uZ19mcmFnOiBtZXNocGhvbmdfZnJhZywKCQltZXNocGhvbmdfdmVydDogbWVzaHBob25nX3ZlcnQsCgkJbWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLAoJCW1lc2hwaHlzaWNhbF92ZXJ0OiBtZXNocGh5c2ljYWxfdmVydCwKCQlub3JtYWxfZnJhZzogbm9ybWFsX2ZyYWcsCgkJbm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LAoJCXBvaW50c19mcmFnOiBwb2ludHNfZnJhZywKCQlwb2ludHNfdmVydDogcG9pbnRzX3ZlcnQsCgkJc2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLAoJCXNoYWRvd192ZXJ0OiBzaGFkb3dfdmVydAoJfTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqLwoKCXZhciBTaGFkZXJMaWIgPSB7CgoJCWJhc2ljOiB7CgoJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWwoJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAoJCQkJVW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsCgkJCQlVbmlmb3Jtc0xpYi5lbnZtYXAsCgkJCQlVbmlmb3Jtc0xpYi5hb21hcCwKCQkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAoJCQkJVW5pZm9ybXNMaWIuZm9nCgkJCV0gKSwKCgkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX3ZlcnQsCgkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZwoKCQl9LAoKCQlsYW1iZXJ0OiB7CgoJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWwoJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAoJCQkJVW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsCgkJCQlVbmlmb3Jtc0xpYi5lbnZtYXAsCgkJCQlVbmlmb3Jtc0xpYi5hb21hcCwKCQkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAoJCQkJVW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsCgkJCQlVbmlmb3Jtc0xpYi5mb2csCgkJCQlVbmlmb3Jtc0xpYi5saWdodHMsCgkJCQl7CgkJCQkJZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9CgkJCQl9CgkJCV0gKSwKCgkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfdmVydCwKCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWcKCgkJfSwKCgkJcGhvbmc6IHsKCgkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCgkJCQlVbmlmb3Jtc0xpYi5jb21tb24sCgkJCQlVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCwKCQkJCVVuaWZvcm1zTGliLmVudm1hcCwKCQkJCVVuaWZvcm1zTGliLmFvbWFwLAoJCQkJVW5pZm9ybXNMaWIubGlnaHRtYXAsCgkJCQlVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKCQkJCVVuaWZvcm1zTGliLmJ1bXBtYXAsCgkJCQlVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsCgkJCQlVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCgkJCQlVbmlmb3Jtc0xpYi5ncmFkaWVudG1hcCwKCQkJCVVuaWZvcm1zTGliLmZvZywKCQkJCVVuaWZvcm1zTGliLmxpZ2h0cywKCQkJCXsKCQkJCQllbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sCgkJCQkJc3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LAoJCQkJCXNoaW5pbmVzczogeyB2YWx1ZTogMzAgfQoJCQkJfQoJCQldICksCgoJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LAoJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX2ZyYWcKCgkJfSwKCgkJc3RhbmRhcmQ6IHsKCgkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCgkJCQlVbmlmb3Jtc0xpYi5jb21tb24sCgkJCQlVbmlmb3Jtc0xpYi5lbnZtYXAsCgkJCQlVbmlmb3Jtc0xpYi5hb21hcCwKCQkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAoJCQkJVW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsCgkJCQlVbmlmb3Jtc0xpYi5idW1wbWFwLAoJCQkJVW5pZm9ybXNMaWIubm9ybWFsbWFwLAoJCQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLAoJCQkJVW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLAoJCQkJVW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLAoJCQkJVW5pZm9ybXNMaWIuZm9nLAoJCQkJVW5pZm9ybXNMaWIubGlnaHRzLAoJCQkJewoJCQkJCWVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSwKCQkJCQlyb3VnaG5lc3M6IHsgdmFsdWU6IDAuNSB9LAoJCQkJCW1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sCgkJCQkJZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0gLy8gdGVtcG9yYXJ5CgkJCQl9CgkJCV0gKSwKCgkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsCgkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZwoKCQl9LAoKCQlwb2ludHM6IHsKCgkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCgkJCQlVbmlmb3Jtc0xpYi5wb2ludHMsCgkJCQlVbmlmb3Jtc0xpYi5mb2cKCQkJXSApLAoKCQkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfdmVydCwKCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c19mcmFnCgoJCX0sCgoJCWRhc2hlZDogewoKCQkJdW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFsKCQkJCVVuaWZvcm1zTGliLmNvbW1vbiwKCQkJCVVuaWZvcm1zTGliLmZvZywKCQkJCXsKCQkJCQlzY2FsZTogeyB2YWx1ZTogMSB9LAoJCQkJCWRhc2hTaXplOiB7IHZhbHVlOiAxIH0sCgkJCQkJdG90YWxTaXplOiB7IHZhbHVlOiAyIH0KCQkJCX0KCQkJXSApLAoKCQkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX3ZlcnQsCgkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWcKCgkJfSwKCgkJZGVwdGg6IHsKCgkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCgkJCQlVbmlmb3Jtc0xpYi5jb21tb24sCgkJCQlVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAKCQkJXSApLAoKCQkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LAoJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfZnJhZwoKCQl9LAoKCQlub3JtYWw6IHsKCgkJCXVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbCgkJCQlVbmlmb3Jtc0xpYi5jb21tb24sCgkJCQlVbmlmb3Jtc0xpYi5idW1wbWFwLAoJCQkJVW5pZm9ybXNMaWIubm9ybWFsbWFwLAoJCQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLAoJCQkJewoJCQkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CgkJCQl9CgkJCV0gKSwKCgkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsCgkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfZnJhZwoKCQl9LAoKCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJLy8JQ3ViZSBtYXAgc2hhZGVyCgkJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkJY3ViZTogewoKCQkJdW5pZm9ybXM6IHsKCQkJCXRDdWJlOiB7IHZhbHVlOiBudWxsIH0sCgkJCQl0RmxpcDogeyB2YWx1ZTogLSAxIH0sCgkJCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfQoJCQl9LAoKCQkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsCgkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWcKCgkJfSwKCgkJZXF1aXJlY3Q6IHsKCgkJCXVuaWZvcm1zOiB7CgkJCQl0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSwKCQkJfSwKCgkJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfdmVydCwKCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X2ZyYWcKCgkJfSwKCgkJZGlzdGFuY2VSR0JBOiB7CgoJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWwoJCQkJVW5pZm9ybXNMaWIuY29tbW9uLAoJCQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLAoJCQkJewoJCQkJCXJlZmVyZW5jZVBvc2l0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMygpIH0sCgkJCQkJbmVhckRpc3RhbmNlOiB7IHZhbHVlOiAxIH0sCgkJCQkJZmFyRGlzdGFuY2U6IHsgdmFsdWU6IDEwMDAgfQoJCQkJfQoJCQldICksCgoJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV92ZXJ0LAoJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWcKCgkJfSwKCgkJc2hhZG93OiB7CgoJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWwoJCQkJVW5pZm9ybXNMaWIubGlnaHRzLAoJCQkJVW5pZm9ybXNMaWIuZm9nLAoJCQkJewoJCQkJCWNvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAgKSB9LAoJCQkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CgkJCQl9LAoJCQldICksCgoJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd192ZXJ0LAoJCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X2ZyYWcKCgkJfQoKCX07CgoJU2hhZGVyTGliLnBoeXNpY2FsID0gewoKCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggWwoJCQlTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsCgkJCXsKCQkJCWNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LAoJCQkJY2xlYXJDb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH0KCQkJfQoJCV0gKSwKCgkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCwKCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWcKCgl9OwoKCS8qKgoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwoJICovCgoJZnVuY3Rpb24gQm94MiggbWluLCBtYXggKSB7CgoJCXRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTsKCQl0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IyKCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7CgoJfQoKCU9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7CgoJCXNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKCgkJCXRoaXMubWluLmNvcHkoIG1pbiApOwoJCQl0aGlzLm1heC5jb3B5KCBtYXggKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHsKCgkJCXRoaXMubWFrZUVtcHR5KCk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjIoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkgewoKCQkJCXZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7CgkJCQl0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7CgkJCQl0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJdGhpcy5taW4uY29weSggYm94Lm1pbiApOwoJCQl0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9ICsgSW5maW5pdHk7CgkJCXRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlpc0VtcHR5OiBmdW5jdGlvbiAoKSB7CgoJCQkvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlcwoKCQkJcmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICk7CgoJCX0sCgoJCWdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOwoJCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwICkgOiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKCQl9LAoKCQlnZXRTaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7CgkJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTsKCgkJfSwKCgkJZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCgkJCXRoaXMubWluLm1pbiggcG9pbnQgKTsKCQkJdGhpcy5tYXgubWF4KCBwb2ludCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKCgkJCXRoaXMubWluLnN1YiggdmVjdG9yICk7CgkJCXRoaXMubWF4LmFkZCggdmVjdG9yICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJdGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApOwoJCQl0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgoJCQlyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHwKCQkJCXBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlOwoKCQl9LAoKCQljb250YWluc0JveDogZnVuY3Rpb24gKCBib3ggKSB7CgoJCQlyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiYKCQkJCXRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55OwoKCQl9LAoKCQlnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJLy8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3gKCQkJLy8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC4KCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOwoKCQkJcmV0dXJuIHJlc3VsdC5zZXQoCgkJCQkoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksCgkJCQkoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICkKCQkJKTsKCgkJfSwKCgkJaW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7CgoJCQkvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucwoKCQkJcmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fAoJCQkJYm94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlOwoKCQl9LAoKCQljbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOwoJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApOwoKCQl9LAoKCQlkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IyKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHsKCgkJCQl2YXIgY2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7CgkJCQlyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTsKCgkJCX07CgoJCX0oKSwKCgkJaW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHsKCgkJCXRoaXMubWluLm1heCggYm94Lm1pbiApOwoJCQl0aGlzLm1heC5taW4oIGJveC5tYXggKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7CgoJCQl0aGlzLm1pbi5taW4oIGJveC5taW4gKTsKCQkJdGhpcy5tYXgubWF4KCBib3gubWF4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHsKCgkJCXRoaXMubWluLmFkZCggb2Zmc2V0ICk7CgkJCXRoaXMubWF4LmFkZCggb2Zmc2V0ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHsKCgkJCXJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gV2ViR0xGbGFyZVJlbmRlcmVyKCByZW5kZXJlciwgZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICkgewoKCQl2YXIgdmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyOwoJCXZhciBzaGFkZXIsIHByb2dyYW0sIGF0dHJpYnV0ZXMsIHVuaWZvcm1zOwoKCQl2YXIgdGVtcFRleHR1cmUsIG9jY2x1c2lvblRleHR1cmU7CgoJCWZ1bmN0aW9uIGluaXQoKSB7CgoJCQl2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbCgkJCQktIDEsIC0gMSwgMCwgMCwKCQkJCSAgMSwgLSAxLCAxLCAwLAoJCQkJICAxLCAxLCAxLCAxLAoJCQkJLSAxLCAxLCAwLCAxCgkJCV0gKTsKCgkJCXZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggWwoJCQkJMCwgMSwgMiwKCQkJCTAsIDIsIDMKCQkJXSApOwoKCQkJLy8gYnVmZmVycwoKCQkJdmVydGV4QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CgkJCWVsZW1lbnRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTsKCgkJCWdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7CgkJCWdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7CgoJCQlnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApOwoJCQlnbC5idWZmZXJEYXRhKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZmFjZXMsIGdsLlNUQVRJQ19EUkFXICk7CgoJCQkvLyB0ZXh0dXJlcwoKCQkJdGVtcFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CgkJCW9jY2x1c2lvblRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CgoJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1cmUgKTsKCQkJZ2wudGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCLCAxNiwgMTYsIDAsIGdsLlJHQiwgZ2wuVU5TSUdORURfQllURSwgbnVsbCApOwoJCQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSApOwoJCQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSApOwoJCQlnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTsKCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7CgoJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgb2NjbHVzaW9uVGV4dHVyZSApOwoJCQlnbC50ZXhJbWFnZTJEKCBnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCAxNiwgMTYsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwgKTsKCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UgKTsKCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UgKTsKCQkJZ2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7CgkJCWdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApOwoKCQkJc2hhZGVyID0gewoKCQkJCXZlcnRleFNoYWRlcjogWwoKCQkJCQkndW5pZm9ybSBsb3dwIGludCByZW5kZXJUeXBlOycsCgoJCQkJCSd1bmlmb3JtIHZlYzMgc2NyZWVuUG9zaXRpb247JywKCQkJCQkndW5pZm9ybSB2ZWMyIHNjYWxlOycsCgkJCQkJJ3VuaWZvcm0gZmxvYXQgcm90YXRpb247JywKCgkJCQkJJ3VuaWZvcm0gc2FtcGxlcjJEIG9jY2x1c2lvbk1hcDsnLAoKCQkJCQknYXR0cmlidXRlIHZlYzIgcG9zaXRpb247JywKCQkJCQknYXR0cmlidXRlIHZlYzIgdXY7JywKCgkJCQkJJ3ZhcnlpbmcgdmVjMiB2VVY7JywKCQkJCQkndmFyeWluZyBmbG9hdCB2VmlzaWJpbGl0eTsnLAoKCQkJCQkndm9pZCBtYWluKCkgeycsCgoJCQkJCScJdlVWID0gdXY7JywKCgkJCQkJJwl2ZWMyIHBvcyA9IHBvc2l0aW9uOycsCgoJCQkJCScJaWYgKCByZW5kZXJUeXBlID09IDIgKSB7JywKCgkJCQkJJwkJdmVjNCB2aXNpYmlsaXR5ID0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC4xICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC4xICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC4xICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC41ICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC45ICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC45ICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC45ICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC41ICkgKTsnLAoJCQkJCScJCXZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC41ICkgKTsnLAoKCQkJCQknCQl2VmlzaWJpbGl0eSA9ICAgICAgICB2aXNpYmlsaXR5LnIgLyA5LjA7JywKCQkJCQknCQl2VmlzaWJpbGl0eSAqPSAxLjAgLSB2aXNpYmlsaXR5LmcgLyA5LjA7JywKCQkJCQknCQl2VmlzaWJpbGl0eSAqPSAgICAgICB2aXNpYmlsaXR5LmIgLyA5LjA7JywKCQkJCQknCQl2VmlzaWJpbGl0eSAqPSAxLjAgLSB2aXNpYmlsaXR5LmEgLyA5LjA7JywKCgkJCQkJJwkJcG9zLnggPSBjb3MoIHJvdGF0aW9uICkgKiBwb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogcG9zaXRpb24ueTsnLAoJCQkJCScJCXBvcy55ID0gc2luKCByb3RhdGlvbiApICogcG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIHBvc2l0aW9uLnk7JywKCgkJCQkJJwl9JywKCgkJCQkJJwlnbF9Qb3NpdGlvbiA9IHZlYzQoICggcG9zICogc2NhbGUgKyBzY3JlZW5Qb3NpdGlvbi54eSApLnh5LCBzY3JlZW5Qb3NpdGlvbi56LCAxLjAgKTsnLAoKCQkJCQknfScKCgkJCQldLmpvaW4oICdcbicgKSwKCgkJCQlmcmFnbWVudFNoYWRlcjogWwoKCQkJCQkndW5pZm9ybSBsb3dwIGludCByZW5kZXJUeXBlOycsCgoJCQkJCSd1bmlmb3JtIHNhbXBsZXIyRCBtYXA7JywKCQkJCQkndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsCgkJCQkJJ3VuaWZvcm0gdmVjMyBjb2xvcjsnLAoKCQkJCQkndmFyeWluZyB2ZWMyIHZVVjsnLAoJCQkJCSd2YXJ5aW5nIGZsb2F0IHZWaXNpYmlsaXR5OycsCgoJCQkJCSd2b2lkIG1haW4oKSB7JywKCgkJCQkJLy8gcGluayBzcXVhcmUKCgkJCQkJJwlpZiAoIHJlbmRlclR5cGUgPT0gMCApIHsnLAoKCQkJCQknCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMS4wLCAwLjAgKTsnLAoKCQkJCQkvLyByZXN0b3JlCgoJCQkJCScJfSBlbHNlIGlmICggcmVuZGVyVHlwZSA9PSAxICkgeycsCgoJCQkJCScJCWdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VVYgKTsnLAoKCQkJCQkvLyBmbGFyZQoKCQkJCQknCX0gZWxzZSB7JywKCgkJCQkJJwkJdmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApOycsCgkJCQkJJwkJdGV4dHVyZS5hICo9IG9wYWNpdHkgKiB2VmlzaWJpbGl0eTsnLAoJCQkJCScJCWdsX0ZyYWdDb2xvciA9IHRleHR1cmU7JywKCQkJCQknCQlnbF9GcmFnQ29sb3IucmdiICo9IGNvbG9yOycsCgoJCQkJCScJfScsCgoJCQkJCSd9JwoKCQkJCV0uam9pbiggJ1xuJyApCgoJCQl9OwoKCQkJcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oIHNoYWRlciApOwoKCQkJYXR0cmlidXRlcyA9IHsKCQkJCXZlcnRleDogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICdwb3NpdGlvbicgKSwKCQkJCXV2OiBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgJ3V2JyApCgkJCX07CgoJCQl1bmlmb3JtcyA9IHsKCQkJCXJlbmRlclR5cGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3JlbmRlclR5cGUnICksCgkJCQltYXA6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21hcCcgKSwKCQkJCW9jY2x1c2lvbk1hcDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnb2NjbHVzaW9uTWFwJyApLAoJCQkJb3BhY2l0eTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnb3BhY2l0eScgKSwKCQkJCWNvbG9yOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdjb2xvcicgKSwKCQkJCXNjYWxlOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdzY2FsZScgKSwKCQkJCXJvdGF0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdyb3RhdGlvbicgKSwKCQkJCXNjcmVlblBvc2l0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdzY3JlZW5Qb3NpdGlvbicgKQoJCQl9OwoKCQl9CgoJCS8qCgkJICogUmVuZGVyIGxlbnMgZmxhcmVzCgkJICogTWV0aG9kOiByZW5kZXJzIDE2eDE2IDB4ZmYwMGZmLWNvbG9yZWQgcG9pbnRzIHNjYXR0ZXJlZCBvdmVyIHRoZSBsaWdodCBzb3VyY2UgYXJlYSwKCQkgKiAgICAgICAgIHJlYWRzIHRoZXNlIGJhY2sgYW5kIGNhbGN1bGF0ZXMgb2NjbHVzaW9uLgoJCSAqLwoKCQl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggZmxhcmVzLCBzY2VuZSwgY2FtZXJhLCB2aWV3cG9ydCApIHsKCgkJCWlmICggZmxhcmVzLmxlbmd0aCA9PT0gMCApIHJldHVybjsKCgkJCXZhciB0ZW1wUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOwoKCQkJdmFyIGludkFzcGVjdCA9IHZpZXdwb3J0LncgLyB2aWV3cG9ydC56LAoJCQkJaGFsZlZpZXdwb3J0V2lkdGggPSB2aWV3cG9ydC56ICogMC41LAoJCQkJaGFsZlZpZXdwb3J0SGVpZ2h0ID0gdmlld3BvcnQudyAqIDAuNTsKCgkJCXZhciBzaXplID0gMTYgLyB2aWV3cG9ydC53LAoJCQkJc2NhbGUgPSBuZXcgVmVjdG9yMiggc2l6ZSAqIGludkFzcGVjdCwgc2l6ZSApOwoKCQkJdmFyIHNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoIDEsIDEsIDAgKSwKCQkJCXNjcmVlblBvc2l0aW9uUGl4ZWxzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKCgkJCXZhciB2YWxpZEFyZWEgPSBuZXcgQm94MigpOwoKCQkJdmFsaWRBcmVhLm1pbi5zZXQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnkgKTsKCQkJdmFsaWRBcmVhLm1heC5zZXQoIHZpZXdwb3J0LnggKyAoIHZpZXdwb3J0LnogLSAxNiApLCB2aWV3cG9ydC55ICsgKCB2aWV3cG9ydC53IC0gMTYgKSApOwoKCQkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CgoJCQkJaW5pdCgpOwoKCQkJfQoKCQkJc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbSApOwoKCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnZlcnRleCApOwoJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMudXYgKTsKCQkJc3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTsKCgkJCS8vIGxvb3AgdGhyb3VnaCBhbGwgbGVucyBmbGFyZXMgdG8gdXBkYXRlIHRoZWlyIG9jY2x1c2lvbiBhbmQgcG9zaXRpb25zCgkJCS8vIHNldHVwIGdsIGFuZCBjb21tb24gdXNlZCBhdHRyaWJzL3VuaWZvcm1zCgoJCQlnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm9jY2x1c2lvbk1hcCwgMCApOwoJCQlnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMSApOwoKCQkJZ2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTsKCQkJZ2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy52ZXJ0ZXgsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTsKCQkJZ2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgOCApOwoKCQkJZ2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTsKCgkJCXN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApOwoJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIGZhbHNlICk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmbGFyZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQlzaXplID0gMTYgLyB2aWV3cG9ydC53OwoJCQkJc2NhbGUuc2V0KCBzaXplICogaW52QXNwZWN0LCBzaXplICk7CgoJCQkJLy8gY2FsYyBvYmplY3Qgc2NyZWVuIHBvc2l0aW9uCgoJCQkJdmFyIGZsYXJlID0gZmxhcmVzWyBpIF07CgoJCQkJdGVtcFBvc2l0aW9uLnNldCggZmxhcmUubWF0cml4V29ybGQuZWxlbWVudHNbIDEyIF0sIGZsYXJlLm1hdHJpeFdvcmxkLmVsZW1lbnRzWyAxMyBdLCBmbGFyZS5tYXRyaXhXb3JsZC5lbGVtZW50c1sgMTQgXSApOwoKCQkJCXRlbXBQb3NpdGlvbi5hcHBseU1hdHJpeDQoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKCQkJCXRlbXBQb3NpdGlvbi5hcHBseU1hdHJpeDQoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7CgoJCQkJLy8gc2V0dXAgYXJyYXlzIGZvciBnbCBwcm9ncmFtcwoKCQkJCXNjcmVlblBvc2l0aW9uLmNvcHkoIHRlbXBQb3NpdGlvbiApOwoKCQkJCS8vIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBwaXhlbHMgdG8gY29weQoKCQkJCXNjcmVlblBvc2l0aW9uUGl4ZWxzLnggPSB2aWV3cG9ydC54ICsgKCBzY3JlZW5Qb3NpdGlvbi54ICogaGFsZlZpZXdwb3J0V2lkdGggKSArIGhhbGZWaWV3cG9ydFdpZHRoIC0gODsKCQkJCXNjcmVlblBvc2l0aW9uUGl4ZWxzLnkgPSB2aWV3cG9ydC55ICsgKCBzY3JlZW5Qb3NpdGlvbi55ICogaGFsZlZpZXdwb3J0SGVpZ2h0ICkgKyBoYWxmVmlld3BvcnRIZWlnaHQgLSA4OwoKCQkJCS8vIHNjcmVlbiBjdWxsCgoJCQkJaWYgKCB2YWxpZEFyZWEuY29udGFpbnNQb2ludCggc2NyZWVuUG9zaXRpb25QaXhlbHMgKSA9PT0gdHJ1ZSApIHsKCgkJCQkJLy8gc2F2ZSBjdXJyZW50IFJHQiB0byB0ZW1wIHRleHR1cmUKCgkJCQkJc3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTsKCQkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgbnVsbCApOwoJCQkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUxICk7CgkJCQkJc3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIHRlbXBUZXh0dXJlICk7CgkJCQkJZ2wuY29weVRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQiwgc2NyZWVuUG9zaXRpb25QaXhlbHMueCwgc2NyZWVuUG9zaXRpb25QaXhlbHMueSwgMTYsIDE2LCAwICk7CgoKCQkJCQkvLyByZW5kZXIgcGluayBxdWFkCgoJCQkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMCApOwoJCQkJCWdsLnVuaWZvcm0yZiggdW5pZm9ybXMuc2NhbGUsIHNjYWxlLngsIHNjYWxlLnkgKTsKCQkJCQlnbC51bmlmb3JtM2YoIHVuaWZvcm1zLnNjcmVlblBvc2l0aW9uLCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55LCBzY3JlZW5Qb3NpdGlvbi56ICk7CgoJCQkJCXN0YXRlLmRpc2FibGUoIGdsLkJMRU5EICk7CgkJCQkJc3RhdGUuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7CgoJCQkJCWdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApOwoKCgkJCQkJLy8gY29weSByZXN1bHQgdG8gb2NjbHVzaW9uTWFwCgoJCQkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7CgkJCQkJc3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIG9jY2x1c2lvblRleHR1cmUgKTsKCQkJCQlnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgc2NyZWVuUG9zaXRpb25QaXhlbHMueCwgc2NyZWVuUG9zaXRpb25QaXhlbHMueSwgMTYsIDE2LCAwICk7CgoKCQkJCQkvLyByZXN0b3JlIGdyYXBoaWNzCgoJCQkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMSApOwoJCQkJCXN0YXRlLmRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTsKCgkJCQkJc3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTEgKTsKCQkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1cmUgKTsKCQkJCQlnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTsKCgoJCQkJCS8vIHVwZGF0ZSBvYmplY3QgcG9zaXRpb25zCgoJCQkJCWZsYXJlLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHNjcmVlblBvc2l0aW9uICk7CgoJCQkJCWlmICggZmxhcmUuY3VzdG9tVXBkYXRlQ2FsbGJhY2sgKSB7CgoJCQkJCQlmbGFyZS5jdXN0b21VcGRhdGVDYWxsYmFjayggZmxhcmUgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWZsYXJlLnVwZGF0ZUxlbnNGbGFyZXMoKTsKCgkJCQkJfQoKCQkJCQkvLyByZW5kZXIgZmxhcmVzCgoJCQkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMiApOwoJCQkJCXN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTsKCgkJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGZsYXJlLmxlbnNGbGFyZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgoJCQkJCQl2YXIgc3ByaXRlID0gZmxhcmUubGVuc0ZsYXJlc1sgaiBdOwoKCQkJCQkJaWYgKCBzcHJpdGUub3BhY2l0eSA+IDAuMDAxICYmIHNwcml0ZS5zY2FsZSA+IDAuMDAxICkgewoKCQkJCQkJCXNjcmVlblBvc2l0aW9uLnggPSBzcHJpdGUueDsKCQkJCQkJCXNjcmVlblBvc2l0aW9uLnkgPSBzcHJpdGUueTsKCQkJCQkJCXNjcmVlblBvc2l0aW9uLnogPSBzcHJpdGUuejsKCgkJCQkJCQlzaXplID0gc3ByaXRlLnNpemUgKiBzcHJpdGUuc2NhbGUgLyB2aWV3cG9ydC53OwoKCQkJCQkJCXNjYWxlLnggPSBzaXplICogaW52QXNwZWN0OwoJCQkJCQkJc2NhbGUueSA9IHNpemU7CgoJCQkJCQkJZ2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5zY3JlZW5Qb3NpdGlvbiwgc2NyZWVuUG9zaXRpb24ueCwgc2NyZWVuUG9zaXRpb24ueSwgc2NyZWVuUG9zaXRpb24ueiApOwoJCQkJCQkJZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUueCwgc2NhbGUueSApOwoJCQkJCQkJZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgc3ByaXRlLnJvdGF0aW9uICk7CgoJCQkJCQkJZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBzcHJpdGUub3BhY2l0eSApOwoJCQkJCQkJZ2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgc3ByaXRlLmNvbG9yLnIsIHNwcml0ZS5jb2xvci5nLCBzcHJpdGUuY29sb3IuYiApOwoKCQkJCQkJCXN0YXRlLnNldEJsZW5kaW5nKCBzcHJpdGUuYmxlbmRpbmcsIHNwcml0ZS5ibGVuZEVxdWF0aW9uLCBzcHJpdGUuYmxlbmRTcmMsIHNwcml0ZS5ibGVuZERzdCApOwoKCQkJCQkJCXRleHR1cmVzLnNldFRleHR1cmUyRCggc3ByaXRlLnRleHR1cmUsIDEgKTsKCgkJCQkJCQlnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCS8vIHJlc3RvcmUgZ2wKCgkJCXN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CgkJCXN0YXRlLmVuYWJsZSggZ2wuREVQVEhfVEVTVCApOwoJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTsKCgkJCXN0YXRlLnJlc2V0KCk7CgoJCX07CgoJCWZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oIHNoYWRlciApIHsKCgkJCXZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOwoKCQkJdmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTsKCQkJdmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApOwoKCQkJdmFyIHByZWZpeCA9ICdwcmVjaXNpb24gJyArIGNhcGFiaWxpdGllcy5wcmVjaXNpb24gKyAnIGZsb2F0O1xuJzsKCgkJCWdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIHByZWZpeCArIHNoYWRlci5mcmFnbWVudFNoYWRlciApOwoJCQlnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgcHJlZml4ICsgc2hhZGVyLnZlcnRleFNoYWRlciApOwoKCQkJZ2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTsKCQkJZ2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7CgoJCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7CgkJCWdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7CgoJCQlnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApOwoKCQkJcmV0dXJuIHByb2dyYW07CgoJCX0KCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7CgoJCVRleHR1cmUuY2FsbCggdGhpcywgY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTsKCgkJdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJfQoKCUNhbnZhc1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTsKCUNhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTsKCgkvKioKCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gV2ViR0xTcHJpdGVSZW5kZXJlciggcmVuZGVyZXIsIGdsLCBzdGF0ZSwgdGV4dHVyZXMsIGNhcGFiaWxpdGllcyApIHsKCgkJdmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjsKCQl2YXIgcHJvZ3JhbSwgYXR0cmlidXRlcywgdW5pZm9ybXM7CgoJCXZhciB0ZXh0dXJlOwoKCQkvLyBkZWNvbXBvc2UgbWF0cml4V29ybGQKCgkJdmFyIHNwcml0ZVBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKCQl2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpOwoJCXZhciBzcHJpdGVTY2FsZSA9IG5ldyBWZWN0b3IzKCk7CgoJCWZ1bmN0aW9uIGluaXQoKSB7CgoJCQl2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbCgkJCQktIDAuNSwgLSAwLjUsIDAsIDAsCgkJCQkgIDAuNSwgLSAwLjUsIDEsIDAsCgkJCQkgIDAuNSwgMC41LCAxLCAxLAoJCQkJLSAwLjUsIDAuNSwgMCwgMQoJCQldICk7CgoJCQl2YXIgZmFjZXMgPSBuZXcgVWludDE2QXJyYXkoIFsKCQkJCTAsIDEsIDIsCgkJCQkwLCAyLCAzCgkJCV0gKTsKCgkJCXZlcnRleEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwoJCQllbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CgoJCQlnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApOwoJCQlnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyApOwoKCQkJZ2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTsKCQkJZ2wuYnVmZmVyRGF0YSggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApOwoKCQkJcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oKTsKCgkJCWF0dHJpYnV0ZXMgPSB7CgkJCQlwb3NpdGlvbjogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICdwb3NpdGlvbicgKSwKCQkJCXV2OiBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgJ3V2JyApCgkJCX07CgoJCQl1bmlmb3JtcyA9IHsKCQkJCXV2T2Zmc2V0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcgKSwKCQkJCXV2U2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksCgoJCQkJcm90YXRpb246IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3JvdGF0aW9uJyApLAoJCQkJc2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3NjYWxlJyApLAoKCQkJCWNvbG9yOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdjb2xvcicgKSwKCQkJCW1hcDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbWFwJyApLAoJCQkJb3BhY2l0eTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnb3BhY2l0eScgKSwKCgkJCQltb2RlbFZpZXdNYXRyaXg6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21vZGVsVmlld01hdHJpeCcgKSwKCQkJCXByb2plY3Rpb25NYXRyaXg6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3Byb2plY3Rpb25NYXRyaXgnICksCgoJCQkJZm9nVHlwZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nVHlwZScgKSwKCQkJCWZvZ0RlbnNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksCgkJCQlmb2dOZWFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLAoJCQkJZm9nRmFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksCgkJCQlmb2dDb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksCgkJCQlmb2dEZXB0aDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVwdGgnICksCgoJCQkJYWxwaGFUZXN0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdhbHBoYVRlc3QnICkKCQkJfTsKCgkJCXZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTsKCQkJY2FudmFzLndpZHRoID0gODsKCQkJY2FudmFzLmhlaWdodCA9IDg7CgoJCQl2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7CgkJCWNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJzsKCQkJY29udGV4dC5maWxsUmVjdCggMCwgMCwgOCwgOCApOwoKCQkJdGV4dHVyZSA9IG5ldyBDYW52YXNUZXh0dXJlKCBjYW52YXMgKTsKCgkJfQoKCQl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc3ByaXRlcywgc2NlbmUsIGNhbWVyYSApIHsKCgkJCWlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47CgoJCQkvLyBzZXR1cCBnbAoKCQkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CgoJCQkJaW5pdCgpOwoKCQkJfQoKCQkJc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbSApOwoKCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7CgkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy51diApOwoJCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOwoKCQkJc3RhdGUuZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7CgkJCXN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTsKCgkJCWdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7CgkJCWdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMucG9zaXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTsKCQkJZ2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgOCApOwoKCQkJZ2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTsKCgkJCWdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLnByb2plY3Rpb25NYXRyaXgsIGZhbHNlLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyApOwoKCQkJc3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTsKCQkJZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDAgKTsKCgkJCXZhciBvbGRGb2dUeXBlID0gMDsKCQkJdmFyIHNjZW5lRm9nVHlwZSA9IDA7CgkJCXZhciBmb2cgPSBzY2VuZS5mb2c7CgoJCQlpZiAoIGZvZyApIHsKCgkJCQlnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmZvZ0NvbG9yLCBmb2cuY29sb3IuciwgZm9nLmNvbG9yLmcsIGZvZy5jb2xvci5iICk7CgoJCQkJaWYgKCBmb2cuaXNGb2cgKSB7CgoJCQkJCWdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nTmVhciwgZm9nLm5lYXIgKTsKCQkJCQlnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApOwoKCQkJCQlnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDEgKTsKCQkJCQlvbGRGb2dUeXBlID0gMTsKCQkJCQlzY2VuZUZvZ1R5cGUgPSAxOwoKCQkJCX0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7CgoJCQkJCWdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nRGVuc2l0eSwgZm9nLmRlbnNpdHkgKTsKCgkJCQkJZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7CgkJCQkJb2xkRm9nVHlwZSA9IDI7CgkJCQkJc2NlbmVGb2dUeXBlID0gMjsKCgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCWdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMCApOwoJCQkJb2xkRm9nVHlwZSA9IDA7CgkJCQlzY2VuZUZvZ1R5cGUgPSAwOwoKCQkJfQoKCgkJCS8vIHVwZGF0ZSBwb3NpdGlvbnMgYW5kIHNvcnQKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdOwoKCQkJCXNwcml0ZS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgc3ByaXRlLm1hdHJpeFdvcmxkICk7CgkJCQlzcHJpdGUueiA9IC0gc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50c1sgMTQgXTsKCgkJCX0KCgkJCXNwcml0ZXMuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTsKCgkJCS8vIHJlbmRlciBhbGwgc3ByaXRlcwoKCQkJdmFyIHNjYWxlID0gW107CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTsKCQkJCXZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDsKCgkJCQlpZiAoIG1hdGVyaWFsLnZpc2libGUgPT09IGZhbHNlICkgY29udGludWU7CgoJCQkJc3ByaXRlLm9uQmVmb3JlUmVuZGVyKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgdW5kZWZpbmVkLCBtYXRlcmlhbCwgdW5kZWZpbmVkICk7CgoJCQkJZ2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApOwoJCQkJZ2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApOwoKCQkJCXNwcml0ZS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHNwcml0ZVBvc2l0aW9uLCBzcHJpdGVSb3RhdGlvbiwgc3ByaXRlU2NhbGUgKTsKCgkJCQlzY2FsZVsgMCBdID0gc3ByaXRlU2NhbGUueDsKCQkJCXNjYWxlWyAxIF0gPSBzcHJpdGVTY2FsZS55OwoKCQkJCXZhciBmb2dUeXBlID0gMDsKCgkJCQlpZiAoIHNjZW5lLmZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7CgoJCQkJCWZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7CgoJCQkJfQoKCQkJCWlmICggb2xkRm9nVHlwZSAhPT0gZm9nVHlwZSApIHsKCgkJCQkJZ2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCBmb2dUeXBlICk7CgkJCQkJb2xkRm9nVHlwZSA9IGZvZ1R5cGU7CgoJCQkJfQoKCQkJCWlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkgewoKCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zmc2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApOwoJCQkJCWdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZTY2FsZSwgbWF0ZXJpYWwubWFwLnJlcGVhdC54LCBtYXRlcmlhbC5tYXAucmVwZWF0LnkgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQlnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCAwLCAwICk7CgkJCQkJZ2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCAxLCAxICk7CgoJCQkJfQoKCQkJCWdsLnVuaWZvcm0xZiggdW5pZm9ybXMub3BhY2l0eSwgbWF0ZXJpYWwub3BhY2l0eSApOwoJCQkJZ2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgbWF0ZXJpYWwuY29sb3IuciwgbWF0ZXJpYWwuY29sb3IuZywgbWF0ZXJpYWwuY29sb3IuYiApOwoKCQkJCWdsLnVuaWZvcm0xZiggdW5pZm9ybXMucm90YXRpb24sIG1hdGVyaWFsLnJvdGF0aW9uICk7CgkJCQlnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTsKCgkJCQlzdGF0ZS5zZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKTsKCQkJCXN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7CgkJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTsKCQkJCXN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApOwoKCQkJCXRleHR1cmVzLnNldFRleHR1cmUyRCggbWF0ZXJpYWwubWFwIHx8IHRleHR1cmUsIDAgKTsKCgkJCQlnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTsKCgkJCQlzcHJpdGUub25BZnRlclJlbmRlciggcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIHVuZGVmaW5lZCwgbWF0ZXJpYWwsIHVuZGVmaW5lZCApOwoKCQkJfQoKCQkJLy8gcmVzdG9yZSBnbAoKCQkJc3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTsKCgkJCXN0YXRlLnJlc2V0KCk7CgoJCX07CgoJCWZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oKSB7CgoJCQl2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKCgkJCXZhciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTsKCQkJdmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTsKCgkJCWdsLnNoYWRlclNvdXJjZSggdmVydGV4U2hhZGVyLCBbCgoJCQkJJ3ByZWNpc2lvbiAnICsgY2FwYWJpbGl0aWVzLnByZWNpc2lvbiArICcgZmxvYXQ7JywKCgkJCQknI2RlZmluZSBTSEFERVJfTkFNRSAnICsgJ1Nwcml0ZU1hdGVyaWFsJywKCgkJCQkndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLAoJCQkJJ3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsCgkJCQkndW5pZm9ybSBmbG9hdCByb3RhdGlvbjsnLAoJCQkJJ3VuaWZvcm0gdmVjMiBzY2FsZTsnLAoJCQkJJ3VuaWZvcm0gdmVjMiB1dk9mZnNldDsnLAoJCQkJJ3VuaWZvcm0gdmVjMiB1dlNjYWxlOycsCgoJCQkJJ2F0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOycsCgkJCQknYXR0cmlidXRlIHZlYzIgdXY7JywKCgkJCQkndmFyeWluZyB2ZWMyIHZVVjsnLAoJCQkJJ3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JywKCgkJCQkndm9pZCBtYWluKCkgeycsCgoJCQkJJwl2VVYgPSB1dk9mZnNldCArIHV2ICogdXZTY2FsZTsnLAoKCQkJCScJdmVjMiBhbGlnbmVkUG9zaXRpb24gPSBwb3NpdGlvbiAqIHNjYWxlOycsCgoJCQkJJwl2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLAoJCQkJJwlyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JywKCQkJCScJcm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsCgoJCQkJJwl2ZWM0IG12UG9zaXRpb247JywKCgkJCQknCW12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLAoJCQkJJwltdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsnLAoKCQkJCScJZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsnLAoKCQkJCScJZm9nRGVwdGggPSAtIG12UG9zaXRpb24uejsnLAoKCQkJCSd9JwoKCQkJXS5qb2luKCAnXG4nICkgKTsKCgkJCWdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIFsKCgkJCQkncHJlY2lzaW9uICcgKyBjYXBhYmlsaXRpZXMucHJlY2lzaW9uICsgJyBmbG9hdDsnLAoKCQkJCScjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLAoKCQkJCSd1bmlmb3JtIHZlYzMgY29sb3I7JywKCQkJCSd1bmlmb3JtIHNhbXBsZXIyRCBtYXA7JywKCQkJCSd1bmlmb3JtIGZsb2F0IG9wYWNpdHk7JywKCgkJCQkndW5pZm9ybSBpbnQgZm9nVHlwZTsnLAoJCQkJJ3VuaWZvcm0gdmVjMyBmb2dDb2xvcjsnLAoJCQkJJ3VuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTsnLAoJCQkJJ3VuaWZvcm0gZmxvYXQgZm9nTmVhcjsnLAoJCQkJJ3VuaWZvcm0gZmxvYXQgZm9nRmFyOycsCgkJCQkndW5pZm9ybSBmbG9hdCBhbHBoYVRlc3Q7JywKCgkJCQkndmFyeWluZyB2ZWMyIHZVVjsnLAoJCQkJJ3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JywKCgkJCQkndm9pZCBtYWluKCkgeycsCgoJCQkJJwl2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7JywKCgkJCQknCWdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yICogdGV4dHVyZS54eXosIHRleHR1cmUuYSAqIG9wYWNpdHkgKTsnLAoKCQkJCScJaWYgKCBnbF9GcmFnQ29sb3IuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7JywKCgkJCQknCWlmICggZm9nVHlwZSA+IDAgKSB7JywKCgkJCQknCQlmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JywKCgkJCQknCQlpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLAoKCQkJCScJCQlmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7JywKCgkJCQknCQl9IGVsc2UgeycsCgoJCQkJJwkJCWNvbnN0IGZsb2F0IExPRzIgPSAxLjQ0MjY5NTsnLAoJCQkJJwkJCWZvZ0ZhY3RvciA9IGV4cDIoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICogTE9HMiApOycsCgkJCQknCQkJZm9nRmFjdG9yID0gMS4wIC0gY2xhbXAoIGZvZ0ZhY3RvciwgMC4wLCAxLjAgKTsnLAoKCQkJCScJCX0nLAoKCQkJCScJCWdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTsnLAoKCQkJCScJfScsCgoJCQkJJ30nCgoJCQldLmpvaW4oICdcbicgKSApOwoKCQkJZ2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7CgkJCWdsLmNvbXBpbGVTaGFkZXIoIGZyYWdtZW50U2hhZGVyICk7CgoJCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApOwoJCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7CgoJCQlnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApOwoKCQkJcmV0dXJuIHByb2dyYW07CgoJCX0KCgkJZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7CgoJCQlpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7CgoJCQkJcmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyOwoKCQkJfSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7CgoJCQkJcmV0dXJuIGIueiAtIGEuejsKCgkJCX0gZWxzZSB7CgoJCQkJcmV0dXJuIGIuaWQgLSBhLmlkOwoKCQkJfQoKCQl9CgoJfQoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCgl2YXIgbWF0ZXJpYWxJZCA9IDA7CgoJZnVuY3Rpb24gTWF0ZXJpYWwoKSB7CgoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogbWF0ZXJpYWxJZCArKyB9ICk7CgoJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKCQl0aGlzLm5hbWUgPSAnJzsKCQl0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnOwoKCQl0aGlzLmZvZyA9IHRydWU7CgkJdGhpcy5saWdodHMgPSB0cnVlOwoKCQl0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7CgkJdGhpcy5zaWRlID0gRnJvbnRTaWRlOwoJCXRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTsKCQl0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzCgoJCXRoaXMub3BhY2l0eSA9IDE7CgkJdGhpcy50cmFuc3BhcmVudCA9IGZhbHNlOwoKCQl0aGlzLmJsZW5kU3JjID0gU3JjQWxwaGFGYWN0b3I7CgkJdGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7CgkJdGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247CgkJdGhpcy5ibGVuZFNyY0FscGhhID0gbnVsbDsKCQl0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsOwoJCXRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDsKCgkJdGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDsKCQl0aGlzLmRlcHRoVGVzdCA9IHRydWU7CgkJdGhpcy5kZXB0aFdyaXRlID0gdHJ1ZTsKCgkJdGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7CgkJdGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7CgkJdGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlOwoKCQl0aGlzLmNvbG9yV3JpdGUgPSB0cnVlOwoKCQl0aGlzLnByZWNpc2lvbiA9IG51bGw7IC8vIG92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsCgoJCXRoaXMucG9seWdvbk9mZnNldCA9IGZhbHNlOwoJCXRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7CgkJdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwOwoKCQl0aGlzLmRpdGhlcmluZyA9IGZhbHNlOwoKCQl0aGlzLmFscGhhVGVzdCA9IDA7CgkJdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTsKCgkJdGhpcy5vdmVyZHJhdyA9IDA7IC8vIE92ZXJkcmF3biBwaXhlbHMgKHR5cGljYWxseSBiZXR3ZWVuIDAgYW5kIDEpIGZvciBmaXhpbmcgYW50aWFsaWFzaW5nIGdhcHMgaW4gQ2FudmFzUmVuZGVyZXIKCgkJdGhpcy52aXNpYmxlID0gdHJ1ZTsKCgkJdGhpcy51c2VyRGF0YSA9IHt9OwoKCQl0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgl9CgoJTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBNYXRlcmlhbCwKCgkJaXNNYXRlcmlhbDogdHJ1ZSwKCgkJb25CZWZvcmVDb21waWxlOiBmdW5jdGlvbiAoKSB7fSwKCgkJc2V0VmFsdWVzOiBmdW5jdGlvbiAoIHZhbHVlcyApIHsKCgkJCWlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47CgoJCQlmb3IgKCB2YXIga2V5IGluIHZhbHVlcyApIHsKCgkJCQl2YXIgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdOwoKCQkJCWlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAiVEhSRUUuTWF0ZXJpYWw6ICciICsga2V5ICsgIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4iICk7CgkJCQkJY29udGludWU7CgoJCQkJfQoKCQkJCS8vIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IGlmIHNoYWRpbmcgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcgoJCQkJaWYgKCBrZXkgPT09ICdzaGFkaW5nJyApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7CgkJCQkJdGhpcy5mbGF0U2hhZGluZyA9ICggbmV3VmFsdWUgPT09IEZsYXRTaGFkaW5nICkgPyB0cnVlIDogZmFsc2U7CgkJCQkJY29udGludWU7CgoJCQkJfQoKCQkJCXZhciBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTsKCgkJCQlpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQljb25zb2xlLndhcm4oICJUSFJFRS4iICsgdGhpcy50eXBlICsgIjogJyIgKyBrZXkgKyAiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIgKTsKCQkJCQljb250aW51ZTsKCgkJCQl9CgoJCQkJaWYgKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzQ29sb3IgKSB7CgoJCQkJCWN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7CgoJCQkJfSBlbHNlIGlmICggKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICggbmV3VmFsdWUgJiYgbmV3VmFsdWUuaXNWZWN0b3IzICkgKSB7CgoJCQkJCWN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApOwoKCQkJCX0gZWxzZSBpZiAoIGtleSA9PT0gJ292ZXJkcmF3JyApIHsKCgkJCQkJLy8gZW5zdXJlIG92ZXJkcmF3IGlzIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggbGVnYWN5IGJvb2xlYW4gdHlwZQoJCQkJCXRoaXNbIGtleSBdID0gTnVtYmVyKCBuZXdWYWx1ZSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXRoaXNbIGtleSBdID0gbmV3VmFsdWU7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCgkJCXZhciBpc1Jvb3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTsKCgkJCWlmICggaXNSb290ICkgewoKCQkJCW1ldGEgPSB7CgkJCQkJdGV4dHVyZXM6IHt9LAoJCQkJCWltYWdlczoge30KCQkJCX07CgoJCQl9CgoJCQl2YXIgZGF0YSA9IHsKCQkJCW1ldGFkYXRhOiB7CgkJCQkJdmVyc2lvbjogNC41LAoJCQkJCXR5cGU6ICdNYXRlcmlhbCcsCgkJCQkJZ2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJwoJCQkJfQoJCQl9OwoKCQkJLy8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvbgoJCQlkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7CgkJCWRhdGEudHlwZSA9IHRoaXMudHlwZTsKCgkJCWlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTsKCgkJCWlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTsKCgkJCWlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7CgkJCWlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7CgoJCQlpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7CgkJCWlmICggdGhpcy5lbWlzc2l2ZUludGVuc2l0eSAhPT0gMSApIGRhdGEuZW1pc3NpdmVJbnRlbnNpdHkgPSB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5OwoKCQkJaWYgKCB0aGlzLnNwZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvciApIGRhdGEuc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyLmdldEhleCgpOwoJCQlpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzOwoJCQlpZiAoIHRoaXMuY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdCA9IHRoaXMuY2xlYXJDb2F0OwoJCQlpZiAoIHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdFJvdWdobmVzcyA9IHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzOwoKCQkJaWYgKCB0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc1RleHR1cmUgKSBkYXRhLm1hcCA9IHRoaXMubWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgkJCWlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgkJCWlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgkJCWlmICggdGhpcy5idW1wTWFwICYmIHRoaXMuYnVtcE1hcC5pc1RleHR1cmUgKSB7CgoJCQkJZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgkJCQlkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlOwoKCQkJfQoJCQlpZiAoIHRoaXMubm9ybWFsTWFwICYmIHRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSApIHsKCgkJCQlkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgkJCQlkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7CgoJCQl9CgkJCWlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkgewoKCQkJCWRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDsKCQkJCWRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlOwoJCQkJZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzOwoKCQkJfQoJCQlpZiAoIHRoaXMucm91Z2huZXNzTWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDsKCQkJaWYgKCB0aGlzLm1ldGFsbmVzc01hcCAmJiB0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLm1ldGFsbmVzc01hcCA9IHRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgoJCQlpZiAoIHRoaXMuZW1pc3NpdmVNYXAgJiYgdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUgKSBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oIG1ldGEgKS51dWlkOwoJCQlpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkOwoKCQkJaWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7CgoJCQkJZGF0YS5lbnZNYXAgPSB0aGlzLmVudk1hcC50b0pTT04oIG1ldGEgKS51dWlkOwoJCQkJZGF0YS5yZWZsZWN0aXZpdHkgPSB0aGlzLnJlZmxlY3Rpdml0eTsgLy8gU2NhbGUgYmVoaW5kIGVudk1hcAoKCQkJfQoKCQkJaWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlICkgewoKCQkJCWRhdGEuZ3JhZGllbnRNYXAgPSB0aGlzLmdyYWRpZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CgoJCQl9CgoJCQlpZiAoIHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplID0gdGhpcy5zaXplOwoJCQlpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uOwoKCQkJaWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nOwoJCQlpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZzsKCQkJaWYgKCB0aGlzLnNpZGUgIT09IEZyb250U2lkZSApIGRhdGEuc2lkZSA9IHRoaXMuc2lkZTsKCQkJaWYgKCB0aGlzLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSBkYXRhLnZlcnRleENvbG9ycyA9IHRoaXMudmVydGV4Q29sb3JzOwoKCQkJaWYgKCB0aGlzLm9wYWNpdHkgPCAxICkgZGF0YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5OwoJCQlpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDsKCgkJCWRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7CgkJCWRhdGEuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3Q7CgkJCWRhdGEuZGVwdGhXcml0ZSA9IHRoaXMuZGVwdGhXcml0ZTsKCgkJCS8vIHJvdGF0aW9uIChTcHJpdGVNYXRlcmlhbCkKCQkJaWYgKCB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247CgoJCQlpZiAoIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDsKCQkJaWYgKCB0aGlzLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmRhc2hTaXplID0gdGhpcy5kYXNoU2l6ZTsKCQkJaWYgKCB0aGlzLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZ2FwU2l6ZSA9IHRoaXMuZ2FwU2l6ZTsKCQkJaWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTsKCgkJCWlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7CgoJCQlpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7CgkJCWlmICggdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSA9IHRoaXMucHJlbXVsdGlwbGllZEFscGhhOwoKCQkJaWYgKCB0aGlzLndpcmVmcmFtZSA9PT0gdHJ1ZSApIGRhdGEud2lyZWZyYW1lID0gdGhpcy53aXJlZnJhbWU7CgkJCWlmICggdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPiAxICkgZGF0YS53aXJlZnJhbWVMaW5ld2lkdGggPSB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aDsKCQkJaWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7CgkJCWlmICggdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWpvaW4gPSB0aGlzLndpcmVmcmFtZUxpbmVqb2luOwoKCQkJaWYgKCB0aGlzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIGRhdGEubW9ycGhUYXJnZXRzID0gdHJ1ZTsKCQkJaWYgKCB0aGlzLnNraW5uaW5nID09PSB0cnVlICkgZGF0YS5za2lubmluZyA9IHRydWU7CgoJCQlpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBkYXRhLnZpc2libGUgPSBmYWxzZTsKCQkJaWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7CgoJCQkvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT04KCgkJCWZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkgewoKCQkJCXZhciB2YWx1ZXMgPSBbXTsKCgkJCQlmb3IgKCB2YXIga2V5IGluIGNhY2hlICkgewoKCQkJCQl2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTsKCQkJCQlkZWxldGUgZGF0YS5tZXRhZGF0YTsKCQkJCQl2YWx1ZXMucHVzaCggZGF0YSApOwoKCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoKCQkJfQoKCQkJaWYgKCBpc1Jvb3QgKSB7CgoJCQkJdmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApOwoJCQkJdmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7CgoJCQkJaWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzOwoJCQkJaWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzOwoKCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CgoJCQl0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CgkJCXRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0czsKCgkJCXRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7CgkJCXRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlOwoJCQl0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nOwoJCQl0aGlzLnZlcnRleENvbG9ycyA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnM7CgoJCQl0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0eTsKCQkJdGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDsKCgkJCXRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7CgkJCXRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7CgkJCXRoaXMuYmxlbmRFcXVhdGlvbiA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uOwoJCQl0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTsKCQkJdGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7CgkJCXRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gc291cmNlLmJsZW5kRXF1YXRpb25BbHBoYTsKCgkJCXRoaXMuZGVwdGhGdW5jID0gc291cmNlLmRlcHRoRnVuYzsKCQkJdGhpcy5kZXB0aFRlc3QgPSBzb3VyY2UuZGVwdGhUZXN0OwoJCQl0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTsKCgkJCXRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlOwoKCQkJdGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uOwoKCQkJdGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7CgkJCXRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yOwoJCQl0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0VW5pdHM7CgoJCQl0aGlzLmRpdGhlcmluZyA9IHNvdXJjZS5kaXRoZXJpbmc7CgoJCQl0aGlzLmFscGhhVGVzdCA9IHNvdXJjZS5hbHBoYVRlc3Q7CgkJCXRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTsKCgkJCXRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7CgoJCQl0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTsKCQkJdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApOwoKCQkJdGhpcy5jbGlwU2hhZG93cyA9IHNvdXJjZS5jbGlwU2hhZG93czsKCQkJdGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gc291cmNlLmNsaXBJbnRlcnNlY3Rpb247CgoJCQl2YXIgc3JjUGxhbmVzID0gc291cmNlLmNsaXBwaW5nUGxhbmVzLAoJCQkJZHN0UGxhbmVzID0gbnVsbDsKCgkJCWlmICggc3JjUGxhbmVzICE9PSBudWxsICkgewoKCQkJCXZhciBuID0gc3JjUGxhbmVzLmxlbmd0aDsKCQkJCWRzdFBsYW5lcyA9IG5ldyBBcnJheSggbiApOwoKCQkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApCgkJCQkJZHN0UGxhbmVzWyBpIF0gPSBzcmNQbGFuZXNbIGkgXS5jbG9uZSgpOwoKCQkJfQoKCQkJdGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBsYW5lczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHBzOi8vY2xhcmEuaW8KCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICoKCSAqIHBhcmFtZXRlcnMgPSB7CgkgKgoJICogIG9wYWNpdHk6IDxmbG9hdD4sCgkgKgoJICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKCSAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAoJICoKCSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKCSAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4KCSAqIH0KCSAqLwoKCWZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKCQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7CgoJCXRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7CgoJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwoKCQl0aGlzLm1hcCA9IG51bGw7CgoJCXRoaXMuYWxwaGFNYXAgPSBudWxsOwoKCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CgkJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CgkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKCgkJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CgoJCXRoaXMuZm9nID0gZmFsc2U7CgkJdGhpcy5saWdodHMgPSBmYWxzZTsKCgkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCgl9CgoJTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CglNZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDsKCglNZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGVwdGhNYXRlcmlhbCA9IHRydWU7CgoJTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZzsKCgkJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgoJCXRoaXMubWFwID0gc291cmNlLm1hcDsKCgkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCgkJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwoJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CgkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CgoJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgoJCXJldHVybiB0aGlzOwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICoKCSAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PiwKCSAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sCgkgKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sCgkgKgoJICogIHNraW5uaW5nOiA8Ym9vbD4sCgkgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCgkgKgoJICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKCSAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+CgkgKgoJICogfQoJICovCgoJZnVuY3Rpb24gTWVzaERpc3RhbmNlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ01lc2hEaXN0YW5jZU1hdGVyaWFsJzsKCgkJdGhpcy5yZWZlcmVuY2VQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy5uZWFyRGlzdGFuY2UgPSAxOwoJCXRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwOwoKCQl0aGlzLnNraW5uaW5nID0gZmFsc2U7CgkJdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsKCgkJdGhpcy5tYXAgPSBudWxsOwoKCQl0aGlzLmFscGhhTWFwID0gbnVsbDsKCgkJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwoJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwoJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CgoJCXRoaXMuZm9nID0gZmFsc2U7CgkJdGhpcy5saWdodHMgPSBmYWxzZTsKCgkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCgl9CgoJTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CglNZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDsKCglNZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7CgoJTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7CgkJdGhpcy5uZWFyRGlzdGFuY2UgPSBzb3VyY2UubmVhckRpc3RhbmNlOwoJCXRoaXMuZmFyRGlzdGFuY2UgPSBzb3VyY2UuZmFyRGlzdGFuY2U7CgoJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CgkJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwoKCQl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CgoJCXRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CgoJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKCQl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwoJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKi8KCglmdW5jdGlvbiBCb3gzKCBtaW4sIG1heCApIHsKCgkJdGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApOwoJCXRoaXMubWF4ID0gKCBtYXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHsKCgkJaXNCb3gzOiB0cnVlLAoKCQlzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CgoJCQl0aGlzLm1pbi5jb3B5KCBtaW4gKTsKCQkJdGhpcy5tYXguY29weSggbWF4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0RnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkgewoKCQkJdmFyIG1pblggPSArIEluZmluaXR5OwoJCQl2YXIgbWluWSA9ICsgSW5maW5pdHk7CgkJCXZhciBtaW5aID0gKyBJbmZpbml0eTsKCgkJCXZhciBtYXhYID0gLSBJbmZpbml0eTsKCQkJdmFyIG1heFkgPSAtIEluZmluaXR5OwoJCQl2YXIgbWF4WiA9IC0gSW5maW5pdHk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJdmFyIHggPSBhcnJheVsgaSBdOwoJCQkJdmFyIHkgPSBhcnJheVsgaSArIDEgXTsKCQkJCXZhciB6ID0gYXJyYXlbIGkgKyAyIF07CgoJCQkJaWYgKCB4IDwgbWluWCApIG1pblggPSB4OwoJCQkJaWYgKCB5IDwgbWluWSApIG1pblkgPSB5OwoJCQkJaWYgKCB6IDwgbWluWiApIG1pblogPSB6OwoKCQkJCWlmICggeCA+IG1heFggKSBtYXhYID0geDsKCQkJCWlmICggeSA+IG1heFkgKSBtYXhZID0geTsKCQkJCWlmICggeiA+IG1heFogKSBtYXhaID0gejsKCgkJCX0KCgkJCXRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApOwoJCQl0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHsKCgkJCXZhciBtaW5YID0gKyBJbmZpbml0eTsKCQkJdmFyIG1pblkgPSArIEluZmluaXR5OwoJCQl2YXIgbWluWiA9ICsgSW5maW5pdHk7CgoJCQl2YXIgbWF4WCA9IC0gSW5maW5pdHk7CgkJCXZhciBtYXhZID0gLSBJbmZpbml0eTsKCQkJdmFyIG1heFogPSAtIEluZmluaXR5OwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7CgkJCQl2YXIgeSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7CgkJCQl2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7CgoJCQkJaWYgKCB4IDwgbWluWCApIG1pblggPSB4OwoJCQkJaWYgKCB5IDwgbWluWSApIG1pblkgPSB5OwoJCQkJaWYgKCB6IDwgbWluWiApIG1pblogPSB6OwoKCQkJCWlmICggeCA+IG1heFggKSBtYXhYID0geDsKCQkJCWlmICggeSA+IG1heFkgKSBtYXhZID0geTsKCQkJCWlmICggeiA+IG1heFogKSBtYXhaID0gejsKCgkJCX0KCgkJCXRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApOwoJCQl0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHsKCgkJCXRoaXMubWFrZUVtcHR5KCk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkgewoKCQkJCXZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7CgoJCQkJdGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApOwoJCQkJdGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQlzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHsKCgkJCXRoaXMubWFrZUVtcHR5KCk7CgoJCQlyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdCggb2JqZWN0ICk7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJdGhpcy5taW4uY29weSggYm94Lm1pbiApOwoJCQl0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSArIEluZmluaXR5OwoJCQl0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWlzRW1wdHk6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzCgoJCQlyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKSB8fCAoIHRoaXMubWF4LnogPCB0aGlzLm1pbi56ICk7CgoJCX0sCgoJCWdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoJCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwLCAwICkgOiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKCQl9LAoKCQlnZXRTaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgkJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTsKCgkJfSwKCgkJZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCgkJCXRoaXMubWluLm1pbiggcG9pbnQgKTsKCQkJdGhpcy5tYXgubWF4KCBwb2ludCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKCgkJCXRoaXMubWluLnN1YiggdmVjdG9yICk7CgkJCXRoaXMubWF4LmFkZCggdmVjdG9yICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKCQkJdGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApOwoJCQl0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWV4cGFuZEJ5T2JqZWN0OiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBDb21wdXRlcyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBvZiBhbiBvYmplY3QgKGluY2x1ZGluZyBpdHMgY2hpbGRyZW4pLAoJCQkvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXMKCgkJCXZhciBzY29wZSwgaSwgbDsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CgoJCQlmdW5jdGlvbiB0cmF2ZXJzZSggbm9kZSApIHsKCgkJCQl2YXIgZ2VvbWV0cnkgPSBub2RlLmdlb21ldHJ5OwoKCQkJCWlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKCQkJCQkJdmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7CgoJCQkJCQlmb3IgKCBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCQkJdjEuY29weSggdmVydGljZXNbIGkgXSApOwoJCQkJCQkJdjEuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7CgoJCQkJCQkJc2NvcGUuZXhwYW5kQnlQb2ludCggdjEgKTsKCgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJCXZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwoKCQkJCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQlmb3IgKCBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCQkJCXYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApOwoKCQkJCQkJCQlzY29wZS5leHBhbmRCeVBvaW50KCB2MSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkgewoKCQkJCXNjb3BlID0gdGhpczsKCgkJCQlvYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCQlvYmplY3QudHJhdmVyc2UoIHRyYXZlcnNlICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgoJCQlyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHwKCQkJCXBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55IHx8CgkJCQlwb2ludC56IDwgdGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTsKCgkJfSwKCgkJY29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJcmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmCgkJCQl0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJgoJCQkJdGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7CgoJCX0sCgoJCWdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQkvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveAoJCQkvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLgoKCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gcmVzdWx0LnNldCgKCQkJCSggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSwKCQkJCSggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSwKCQkJCSggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRoaXMubWluLnogKQoJCQkpOwoKCQl9LAoKCQlpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHsKCgkJCS8vIHVzaW5nIDYgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zLgoJCQlyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8CgkJCQlib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgfHwKCQkJCWJveC5tYXgueiA8IHRoaXMubWluLnogfHwgYm94Lm1pbi56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTsKCgkJfSwKCgkJaW50ZXJzZWN0c1NwaGVyZTogKCBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgY2xvc2VzdFBvaW50ID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7CgoJCQkJLy8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci4KCQkJCXRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50ICk7CgoJCQkJLy8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuCgkJCQlyZXR1cm4gY2xvc2VzdFBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApOwoKCQkJfTsKCgkJfSApKCksCgoJCWludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHsKCgkJCS8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXMKCQkJLy8gYXJlIG9uIHRoZSBzYW1lIHNpZGUgKGJhY2sgb3IgZnJvbnQpIG9mIHRoZSBwbGFuZSwgdGhlbiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uCgoJCQl2YXIgbWluLCBtYXg7CgoJCQlpZiAoIHBsYW5lLm5vcm1hbC54ID4gMCApIHsKCgkJCQltaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7CgkJCQltYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7CgoJCQl9IGVsc2UgewoKCQkJCW1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDsKCQkJCW1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDsKCgkJCX0KCgkJCWlmICggcGxhbmUubm9ybWFsLnkgPiAwICkgewoKCQkJCW1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7CgkJCQltYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55OwoKCQkJfSBlbHNlIHsKCgkJCQltaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55OwoJCQkJbWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTsKCgkJCX0KCgkJCWlmICggcGxhbmUubm9ybWFsLnogPiAwICkgewoKCQkJCW1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7CgkJCQltYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56OwoKCQkJfSBlbHNlIHsKCgkJCQltaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56OwoJCQkJbWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejsKCgkJCX0KCgkJCXJldHVybiAoIG1pbiA8PSBwbGFuZS5jb25zdGFudCAmJiBtYXggPj0gcGxhbmUuY29uc3RhbnQgKTsKCgkJfSwKCgkJY2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCQkJcmV0dXJuIHJlc3VsdC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTsKCgkJfSwKCgkJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7CgoJCQkJdmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApOwoJCQkJcmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7CgoJCQl9OwoKCQl9KCksCgoJCWdldEJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGdldEJvdW5kaW5nU3BoZXJlKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFNwaGVyZSgpOwoKCQkJCXRoaXMuZ2V0Q2VudGVyKCByZXN1bHQuY2VudGVyICk7CgoJCQkJcmVzdWx0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggdjEgKS5sZW5ndGgoKSAqIDAuNTsKCgkJCQlyZXR1cm4gcmVzdWx0OwoKCQkJfTsKCgkJfSgpLAoKCQlpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJdGhpcy5taW4ubWF4KCBib3gubWluICk7CgkJCXRoaXMubWF4Lm1pbiggYm94Lm1heCApOwoKCQkJLy8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLgoJCQlpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7CgoJCQl0aGlzLm1pbi5taW4oIGJveC5taW4gKTsKCQkJdGhpcy5tYXgubWF4KCBib3gubWF4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgcG9pbnRzID0gWwoJCQkJbmV3IFZlY3RvcjMoKSwKCQkJCW5ldyBWZWN0b3IzKCksCgkJCQluZXcgVmVjdG9yMygpLAoJCQkJbmV3IFZlY3RvcjMoKSwKCQkJCW5ldyBWZWN0b3IzKCksCgkJCQluZXcgVmVjdG9yMygpLAoJCQkJbmV3IFZlY3RvcjMoKSwKCQkJCW5ldyBWZWN0b3IzKCkKCQkJXTsKCgkJCXJldHVybiBmdW5jdGlvbiBhcHBseU1hdHJpeDQoIG1hdHJpeCApIHsKCgkJCQkvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC4KCQkJCWlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpczsKCgkJCQkvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvdwoJCQkJcG9pbnRzWyAwIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAwCgkJCQlwb2ludHNbIDEgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDEKCQkJCXBvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMAoJCQkJcG9pbnRzWyAzIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDExCgkJCQlwb2ludHNbIDQgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDAKCQkJCXBvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMQoJCQkJcG9pbnRzWyA2IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTEwCgkJCQlwb2ludHNbIDcgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOwkvLyAxMTEKCgkJCQl0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQl0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkgewoKCQkJdGhpcy5taW4uYWRkKCBvZmZzZXQgKTsKCQkJdGhpcy5tYXguYWRkKCBvZmZzZXQgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQllcXVhbHM6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJcmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFNwaGVyZSggY2VudGVyLCByYWRpdXMgKSB7CgoJCXRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTsKCQl0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDA7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIGNlbnRlciwgcmFkaXVzICkgewoKCQkJdGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7CgkJCXRoaXMucmFkaXVzID0gcmFkaXVzOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBib3ggPSBuZXcgQm94MygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Qb2ludHMoIHBvaW50cywgb3B0aW9uYWxDZW50ZXIgKSB7CgoJCQkJdmFyIGNlbnRlciA9IHRoaXMuY2VudGVyOwoKCQkJCWlmICggb3B0aW9uYWxDZW50ZXIgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJY2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJYm94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7CgoJCQkJfQoKCQkJCXZhciBtYXhSYWRpdXNTcSA9IDA7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJbWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnRzWyBpIF0gKSApOwoKCQkJCX0KCgkJCQl0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCgkJfSwKCgkJY29weTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CgoJCQl0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7CgkJCXRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1czsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQllbXB0eTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuICggdGhpcy5yYWRpdXMgPD0gMCApOwoKCQl9LAoKCQljb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKCQkJcmV0dXJuICggcG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKTsKCgkJfSwKCgkJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKCQkJcmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7CgoJCX0sCgoJCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKCQkJdmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1czsKCgkJCXJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7CgoJCX0sCgoJCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJcmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7CgoJCX0sCgoJCWludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHsKCgkJCXJldHVybiBNYXRoLmFicyggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLmNlbnRlciApICkgPD0gdGhpcy5yYWRpdXM7CgoJCX0sCgoJCWNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIGRlbHRhTGVuZ3RoU3EgPSB0aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoKCQkJcmVzdWx0LmNvcHkoIHBvaW50ICk7CgoJCQlpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHsKCgkJCQlyZXN1bHQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpOwoJCQkJcmVzdWx0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTsKCgkJCX0KCgkJCXJldHVybiByZXN1bHQ7CgoJCX0sCgoJCWdldEJvdW5kaW5nQm94OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIGJveCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBCb3gzKCk7CgoJCQlib3guc2V0KCB0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIgKTsKCQkJYm94LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApOwoKCQkJcmV0dXJuIGJveDsKCgkJfSwKCgkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCgkJCXRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7CgkJCXRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkgewoKCQkJdGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQllcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKCQkJcmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KCSAqLwoKCWZ1bmN0aW9uIFBsYW5lKCBub3JtYWwsIGNvbnN0YW50ICkgewoKCQkvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCgoJCXRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTsKCQl0aGlzLmNvbnN0YW50ID0gKCBjb25zdGFudCAhPT0gdW5kZWZpbmVkICkgPyBjb25zdGFudCA6IDA7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwgewoKCQlzZXQ6IGZ1bmN0aW9uICggbm9ybWFsLCBjb25zdGFudCApIHsKCgkJCXRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApOwoJCQl0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0Q29tcG9uZW50czogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkgewoKCQkJdGhpcy5ub3JtYWwuc2V0KCB4LCB5LCB6ICk7CgkJCXRoaXMuY29uc3RhbnQgPSB3OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OiBmdW5jdGlvbiAoIG5vcm1hbCwgcG9pbnQgKSB7CgoJCQl0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTsKCQkJdGhpcy5jb25zdGFudCA9IC0gcG9pbnQuZG90KCB0aGlzLm5vcm1hbCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21Db3BsYW5hclBvaW50czogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHYyID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7CgoJCQkJdmFyIG5vcm1hbCA9IHYxLnN1YlZlY3RvcnMoIGMsIGIgKS5jcm9zcyggdjIuc3ViVmVjdG9ycyggYSwgYiApICkubm9ybWFsaXplKCk7CgoJCQkJLy8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT8KCgkJCQl0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBub3JtYWwsIGEgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCgkJfSwKCgkJY29weTogZnVuY3Rpb24gKCBwbGFuZSApIHsKCgkJCXRoaXMubm9ybWFsLmNvcHkoIHBsYW5lLm5vcm1hbCApOwoJCQl0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUgaXMgaW52YWxpZC4KCgkJCXZhciBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7CgkJCXRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7CgkJCXRoaXMuY29uc3RhbnQgKj0gaW52ZXJzZU5vcm1hbExlbmd0aDsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQluZWdhdGU6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuY29uc3RhbnQgKj0gLSAxOwoJCQl0aGlzLm5vcm1hbC5uZWdhdGUoKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgoJCQlyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDsKCgkJfSwKCgkJZGlzdGFuY2VUb1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CgoJCQlyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7CgoJCX0sCgoJCXByb2plY3RQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiByZXN1bHQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSApLmFkZCggcG9pbnQgKTsKCgkJfSwKCgkJaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJCQl2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTsKCgkJCQl2YXIgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRpcmVjdGlvbiApOwoKCQkJCWlmICggZGVub21pbmF0b3IgPT09IDAgKSB7CgoJCQkJCS8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW4KCQkJCQlpZiAoIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICkgPT09IDAgKSB7CgoJCQkJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIGxpbmUuc3RhcnQgKTsKCgkJCQkJfQoKCQkJCQkvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS4KCQkJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkJCX0KCgkJCQl2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yOwoKCQkJCWlmICggdCA8IDAgfHwgdCA+IDEgKSB7CgoJCQkJCXJldHVybiB1bmRlZmluZWQ7CgoJCQkJfQoKCQkJCXJldHVybiByZXN1bHQuY29weSggZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIGxpbmUuc3RhcnQgKTsKCgkJCX07CgoJCX0oKSwKCgkJaW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHsKCgkJCS8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LgoKCQkJdmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7CgkJCXZhciBlbmRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuZW5kICk7CgoJCQlyZXR1cm4gKCBzdGFydFNpZ24gPCAwICYmIGVuZFNpZ24gPiAwICkgfHwgKCBlbmRTaWduIDwgMCAmJiBzdGFydFNpZ24gPiAwICk7CgoJCX0sCgoJCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJcmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTsKCgkJfSwKCgkJaW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CgoJCQlyZXR1cm4gc3BoZXJlLmludGVyc2VjdHNQbGFuZSggdGhpcyApOwoKCQl9LAoKCQljb3BsYW5hclBvaW50OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApOwoKCQl9LAoKCQlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciBtMSA9IG5ldyBNYXRyaXgzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkgewoKCQkJCXZhciBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBtMS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOwoKCQkJCXZhciByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggdjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOwoKCQkJCXZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwoKCQkJCXRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7CgoJCQl0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKCQkJcmV0dXJuIHBsYW5lLm5vcm1hbC5lcXVhbHMoIHRoaXMubm9ybWFsICkgJiYgKCBwbGFuZS5jb25zdGFudCA9PT0gdGhpcy5jb25zdGFudCApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCgkgKi8KCglmdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkgewoKCQl0aGlzLnBsYW5lcyA9IFsKCgkJCSggcDAgIT09IHVuZGVmaW5lZCApID8gcDAgOiBuZXcgUGxhbmUoKSwKCQkJKCBwMSAhPT0gdW5kZWZpbmVkICkgPyBwMSA6IG5ldyBQbGFuZSgpLAoJCQkoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksCgkJCSggcDMgIT09IHVuZGVmaW5lZCApID8gcDMgOiBuZXcgUGxhbmUoKSwKCQkJKCBwNCAhPT0gdW5kZWZpbmVkICkgPyBwNCA6IG5ldyBQbGFuZSgpLAoJCQkoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKCkKCgkJXTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggRnJ1c3R1bS5wcm90b3R5cGUsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7CgoJCQl2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CgoJCQlwbGFuZXNbIDAgXS5jb3B5KCBwMCApOwoJCQlwbGFuZXNbIDEgXS5jb3B5KCBwMSApOwoJCQlwbGFuZXNbIDIgXS5jb3B5KCBwMiApOwoJCQlwbGFuZXNbIDMgXS5jb3B5KCBwMyApOwoJCQlwbGFuZXNbIDQgXS5jb3B5KCBwNCApOwoJCQlwbGFuZXNbIDUgXS5jb3B5KCBwNSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHsKCgkJCXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJcGxhbmVzWyBpIF0uY29weSggZnJ1c3R1bS5wbGFuZXNbIGkgXSApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKCgkJCXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKCQkJdmFyIG1lID0gbS5lbGVtZW50czsKCQkJdmFyIG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07CgkJCXZhciBtZTQgPSBtZVsgNCBdLCBtZTUgPSBtZVsgNSBdLCBtZTYgPSBtZVsgNiBdLCBtZTcgPSBtZVsgNyBdOwoJCQl2YXIgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07CgkJCXZhciBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07CgoJCQlwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTsKCQkJcGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7CgkJCXBsYW5lc1sgMiBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMyApLm5vcm1hbGl6ZSgpOwoJCQlwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTsKCQkJcGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpOwoJCQlwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTIsIG1lNyArIG1lNiwgbWUxMSArIG1lMTAsIG1lMTUgKyBtZTE0ICkubm9ybWFsaXplKCk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJaW50ZXJzZWN0c09iamVjdDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7CgoJCQkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwoKCQkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKQoJCQkJCWdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJCXNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApCgkJCQkJLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7CgoJCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7CgoJCQl9OwoKCQl9KCksCgoJCWludGVyc2VjdHNTcHJpdGU6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkgewoKCQkJCXNwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7CgkJCQlzcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2OwoJCQkJc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7CgoJCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7CgoJCQl9OwoKCQl9KCksCgoJCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKCQkJdmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOwoJCQl2YXIgY2VudGVyID0gc3BoZXJlLmNlbnRlcjsKCQkJdmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1czsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJdmFyIGRpc3RhbmNlID0gcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKTsKCgkJCQlpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkgewoKCQkJCQlyZXR1cm4gZmFsc2U7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRydWU7CgoJCX0sCgoJCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBwMSA9IG5ldyBWZWN0b3IzKCksCgkJCQlwMiA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkgewoKCQkJCXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKCQkJCQl2YXIgcGxhbmUgPSBwbGFuZXNbIGkgXTsKCgkJCQkJcDEueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5taW4ueCA6IGJveC5tYXgueDsKCQkJCQlwMi54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1heC54IDogYm94Lm1pbi54OwoJCQkJCXAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBib3gubWF4Lnk7CgkJCQkJcDIueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5tYXgueSA6IGJveC5taW4ueTsKCQkJCQlwMS56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1pbi56IDogYm94Lm1heC56OwoJCQkJCXAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7CgoJCQkJCXZhciBkMSA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggcDEgKTsKCQkJCQl2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7CgoJCQkJCS8vIGlmIGJvdGggb3V0c2lkZSBwbGFuZSwgbm8gaW50ZXJzZWN0aW9uCgoJCQkJCWlmICggZDEgPCAwICYmIGQyIDwgMCApIHsKCgkJCQkJCXJldHVybiBmYWxzZTsKCgkJCQkJfQoKCQkJCX0KCgkJCQlyZXR1cm4gdHJ1ZTsKCgkJCX07CgoJCX0oKSwKCgkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCgkJCXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJaWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkgewoKCQkJCQlyZXR1cm4gZmFsc2U7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRydWU7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFdlYkdMU2hhZG93TWFwKCBfcmVuZGVyZXIsIF9vYmplY3RzLCBtYXhUZXh0dXJlU2l6ZSApIHsKCgkJdmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSwKCQkJX3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLAoKCQkJX3NoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMigpLAoJCQlfbWF4U2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCBtYXhUZXh0dXJlU2l6ZSwgbWF4VGV4dHVyZVNpemUgKSwKCgkJCV9sb29rVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSwKCQkJX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksCgoJCQlfTW9ycGhpbmdGbGFnID0gMSwKCQkJX1NraW5uaW5nRmxhZyA9IDIsCgoJCQlfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzID0gKCBfTW9ycGhpbmdGbGFnIHwgX1NraW5uaW5nRmxhZyApICsgMSwKCgkJCV9kZXB0aE1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyApLAoJCQlfZGlzdGFuY2VNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSwKCgkJCV9tYXRlcmlhbENhY2hlID0ge307CgoJCXZhciBjdWJlRGlyZWN0aW9ucyA9IFsKCQkJbmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLAoJCQluZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKQoJCV07CgoJCXZhciBjdWJlVXBzID0gWwoJCQluZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLAoJCQluZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLAluZXcgVmVjdG9yMyggMCwgMCwgLSAxICkKCQldOwoKCQl2YXIgY3ViZTJEVmlld1BvcnRzID0gWwoJCQluZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLAoJCQluZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpCgkJXTsKCgkJLy8gaW5pdAoKCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHM7ICsrIGkgKSB7CgoJCQl2YXIgdXNlTW9ycGhpbmcgPSAoIGkgJiBfTW9ycGhpbmdGbGFnICkgIT09IDA7CgkJCXZhciB1c2VTa2lubmluZyA9ICggaSAmIF9Ta2lubmluZ0ZsYWcgKSAhPT0gMDsKCgkJCXZhciBkZXB0aE1hdGVyaWFsID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKCB7CgoJCQkJZGVwdGhQYWNraW5nOiBSR0JBRGVwdGhQYWNraW5nLAoKCQkJCW1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsCgkJCQlza2lubmluZzogdXNlU2tpbm5pbmcKCgkJCX0gKTsKCgkJCV9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDsKCgkJCS8vCgoJCQl2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCggewoKCQkJCW1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsCgkJCQlza2lubmluZzogdXNlU2tpbm5pbmcKCgkJCX0gKTsKCgkJCV9kaXN0YW5jZU1hdGVyaWFsc1sgaSBdID0gZGlzdGFuY2VNYXRlcmlhbDsKCgkJfQoKCQkvLwoKCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQl0aGlzLmVuYWJsZWQgPSBmYWxzZTsKCgkJdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKCQl0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7CgoJCXRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDsKCgkJdGhpcy5yZW5kZXJSZXZlcnNlU2lkZWQgPSB0cnVlOwoJCXRoaXMucmVuZGVyU2luZ2xlU2lkZWQgPSB0cnVlOwoKCQl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggbGlnaHRzLCBzY2VuZSwgY2FtZXJhICkgewoKCQkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKCQkJaWYgKCBzY29wZS5hdXRvVXBkYXRlID09PSBmYWxzZSAmJiBzY29wZS5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQlpZiAoIGxpZ2h0cy5sZW5ndGggPT09IDAgKSByZXR1cm47CgoJCQkvLyBUT0RPIENsZWFuIHVwIChuZWVkZWQgaW4gY2FzZSBvZiBjb250ZXh0bG9zdCkKCQkJdmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0OwoJCQl2YXIgX3N0YXRlID0gX3JlbmRlcmVyLnN0YXRlOwoKCQkJLy8gU2V0IEdMIHN0YXRlIGZvciBkZXB0aCBtYXAuCgkJCV9zdGF0ZS5kaXNhYmxlKCBfZ2wuQkxFTkQgKTsKCQkJX3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTsKCQkJX3N0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApOwoJCQlfc3RhdGUuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7CgoJCQkvLyByZW5kZXIgZGVwdGggbWFwCgoJCQl2YXIgZmFjZUNvdW50OwoKCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTsKCQkJCXZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7CgkJCQl2YXIgaXNQb2ludExpZ2h0ID0gbGlnaHQgJiYgbGlnaHQuaXNQb2ludExpZ2h0OwoKCQkJCWlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7CgkJCQkJY29udGludWU7CgoJCQkJfQoKCQkJCXZhciBzaGFkb3dDYW1lcmEgPSBzaGFkb3cuY2FtZXJhOwoKCQkJCV9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7CgkJCQlfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7CgoJCQkJaWYgKCBpc1BvaW50TGlnaHQgKSB7CgoJCQkJCXZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDsKCQkJCQl2YXIgdnBIZWlnaHQgPSBfc2hhZG93TWFwU2l6ZS55OwoKCQkJCQkvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGUKCQkJCQkvLyBmb2xsb3dpbmcgb3JpZW50YXRpb246CgkJCQkJLy8KCQkJCQkvLyAgeHpYWgoJCQkJCS8vICAgeSBZCgkJCQkJLy8KCQkJCQkvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb24KCQkJCQkvLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb24KCQkJCQkvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb24KCQkJCQkvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb24KCQkJCQkvLyBaIC0gUG9zaXRpdmUgeiBkaXJlY3Rpb24KCQkJCQkvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb24KCgkJCQkJLy8gcG9zaXRpdmUgWAoJCQkJCWN1YmUyRFZpZXdQb3J0c1sgMCBdLnNldCggdnBXaWR0aCAqIDIsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApOwoJCQkJCS8vIG5lZ2F0aXZlIFgKCQkJCQljdWJlMkRWaWV3UG9ydHNbIDEgXS5zZXQoIDAsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApOwoJCQkJCS8vIHBvc2l0aXZlIFoKCQkJCQljdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKCQkJCQkvLyBuZWdhdGl2ZSBaCgkJCQkJY3ViZTJEVmlld1BvcnRzWyAzIF0uc2V0KCB2cFdpZHRoLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKCQkJCQkvLyBwb3NpdGl2ZSBZCgkJCQkJY3ViZTJEVmlld1BvcnRzWyA0IF0uc2V0KCB2cFdpZHRoICogMywgMCwgdnBXaWR0aCwgdnBIZWlnaHQgKTsKCQkJCQkvLyBuZWdhdGl2ZSBZCgkJCQkJY3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApOwoKCQkJCQlfc2hhZG93TWFwU2l6ZS54ICo9IDQuMDsKCQkJCQlfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDsKCgkJCQl9CgoJCQkJaWYgKCBzaGFkb3cubWFwID09PSBudWxsICkgewoKCQkJCQl2YXIgcGFycyA9IHsgbWluRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBtYWdGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIGZvcm1hdDogUkdCQUZvcm1hdCB9OwoKCQkJCQlzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7CgkJCQkJc2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgIi5zaGFkb3dNYXAiOwoKCQkJCQlzaGFkb3dDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKCQkJCX0KCgkJCQlpZiAoIHNoYWRvdy5pc1Nwb3RMaWdodFNoYWRvdyApIHsKCgkJCQkJc2hhZG93LnVwZGF0ZSggbGlnaHQgKTsKCgkJCQl9CgoJCQkJdmFyIHNoYWRvd01hcCA9IHNoYWRvdy5tYXA7CgkJCQl2YXIgc2hhZG93TWF0cml4ID0gc2hhZG93Lm1hdHJpeDsKCgkJCQlfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKCQkJCXNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7CgoJCQkJaWYgKCBpc1BvaW50TGlnaHQgKSB7CgoJCQkJCWZhY2VDb3VudCA9IDY7CgoJCQkJCS8vIGZvciBwb2ludCBsaWdodHMgd2Ugc2V0IHRoZSBzaGFkb3cgbWF0cml4IHRvIGJlIGEgdHJhbnNsYXRpb24tb25seSBtYXRyaXgKCQkJCQkvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uCgoJCQkJCXNoYWRvd01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIF9saWdodFBvc2l0aW9uV29ybGQueSwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnogKTsKCgkJCQl9IGVsc2UgewoKCQkJCQlmYWNlQ291bnQgPSAxOwoKCQkJCQlfbG9va1RhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApOwoJCQkJCXNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7CgkJCQkJc2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgoJCQkJCS8vIGNvbXB1dGUgc2hhZG93IG1hdHJpeAoKCQkJCQlzaGFkb3dNYXRyaXguc2V0KAoJCQkJCQkwLjUsIDAuMCwgMC4wLCAwLjUsCgkJCQkJCTAuMCwgMC41LCAwLjAsIDAuNSwKCQkJCQkJMC4wLCAwLjAsIDAuNSwgMC41LAoJCQkJCQkwLjAsIDAuMCwgMC4wLCAxLjAKCQkJCQkpOwoKCQkJCQlzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7CgkJCQkJc2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CgoJCQkJfQoKCQkJCV9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApOwoJCQkJX3JlbmRlcmVyLmNsZWFyKCk7CgoJCQkJLy8gcmVuZGVyIHNoYWRvdyBtYXAgZm9yIGVhY2ggY3ViZSBmYWNlIChpZiBvbW5pLWRpcmVjdGlvbmFsKSBvcgoJCQkJLy8gcnVuIGEgc2luZ2xlIHBhc3MgaWYgbm90CgoJCQkJZm9yICggdmFyIGZhY2UgPSAwOyBmYWNlIDwgZmFjZUNvdW50OyBmYWNlICsrICkgewoKCQkJCQlpZiAoIGlzUG9pbnRMaWdodCApIHsKCgkJCQkJCV9sb29rVGFyZ2V0LmNvcHkoIHNoYWRvd0NhbWVyYS5wb3NpdGlvbiApOwoJCQkJCQlfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTsKCQkJCQkJc2hhZG93Q2FtZXJhLnVwLmNvcHkoIGN1YmVVcHNbIGZhY2UgXSApOwoJCQkJCQlzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApOwoJCQkJCQlzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTsKCgkJCQkJCXZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTsKCQkJCQkJX3N0YXRlLnZpZXdwb3J0KCB2cERpbWVuc2lvbnMgKTsKCgkJCQkJfQoKCQkJCQkvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtCgoJCQkJCV9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CgkJCQkJX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTsKCgkJCQkJLy8gc2V0IG9iamVjdCBtYXRyaWNlcyAmIGZydXN0dW0gY3VsbGluZwoKCQkJCQlyZW5kZXJPYmplY3QoIHNjZW5lLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICk7CgoJCQkJfQoKCQkJfQoKCQkJc2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTsKCgkJfTsKCgkJZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciApIHsKCgkJCXZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTsKCgkJCXZhciByZXN1bHQgPSBudWxsOwoKCQkJdmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7CgkJCXZhciBjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EZXB0aE1hdGVyaWFsOwoKCQkJaWYgKCBpc1BvaW50TGlnaHQgKSB7CgoJCQkJbWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFsczsKCQkJCWN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7CgoJCQl9CgoJCQlpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7CgoJCQkJdmFyIHVzZU1vcnBoaW5nID0gZmFsc2U7CgoJCQkJaWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7CgoJCQkJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJCXVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoID4gMDsKCgkJCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCgkJCQkJCXVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmcgPT09IGZhbHNlICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7CgoJCQkJfQoKCQkJCXZhciB1c2VTa2lubmluZyA9IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nOwoKCQkJCXZhciB2YXJpYW50SW5kZXggPSAwOwoKCQkJCWlmICggdXNlTW9ycGhpbmcgKSB2YXJpYW50SW5kZXggfD0gX01vcnBoaW5nRmxhZzsKCQkJCWlmICggdXNlU2tpbm5pbmcgKSB2YXJpYW50SW5kZXggfD0gX1NraW5uaW5nRmxhZzsKCgkJCQlyZXN1bHQgPSBtYXRlcmlhbFZhcmlhbnRzWyB2YXJpYW50SW5kZXggXTsKCgkJCX0gZWxzZSB7CgoJCQkJcmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7CgoJCQl9CgoJCQlpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJgoJCQkJCW1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmCgkJCQkJbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMubGVuZ3RoICE9PSAwICkgewoKCQkJCS8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlCgkJCQkvLyBhcHByb3ByaWF0ZSBzdGF0ZQoKCQkJCXZhciBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkOwoKCQkJCXZhciBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTsKCgkJCQlpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJbWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9OwoJCQkJCV9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50OwoKCQkJCX0KCgkJCQl2YXIgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07CgoJCQkJaWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQljYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpOwoJCQkJCW1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsOwoKCQkJCX0KCgkJCQlyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDsKCgkJCX0KCgkJCXJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTsKCQkJcmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTsKCgkJCXZhciBzaWRlID0gbWF0ZXJpYWwuc2lkZTsKCgkJCWlmICggc2NvcGUucmVuZGVyU2luZ2xlU2lkZWQgJiYgc2lkZSA9PSBEb3VibGVTaWRlICkgewoKCQkJCXNpZGUgPSBGcm9udFNpZGU7CgoJCQl9CgoJCQlpZiAoIHNjb3BlLnJlbmRlclJldmVyc2VTaWRlZCApIHsKCgkJCQlpZiAoIHNpZGUgPT09IEZyb250U2lkZSApIHNpZGUgPSBCYWNrU2lkZTsKCQkJCWVsc2UgaWYgKCBzaWRlID09PSBCYWNrU2lkZSApIHNpZGUgPSBGcm9udFNpZGU7CgoJCQl9CgoJCQlyZXN1bHQuc2lkZSA9IHNpZGU7CgoJCQlyZXN1bHQuY2xpcFNoYWRvd3MgPSBtYXRlcmlhbC5jbGlwU2hhZG93czsKCQkJcmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7CgkJCXJlc3VsdC5jbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbjsKCgkJCXJlc3VsdC53aXJlZnJhbWVMaW5ld2lkdGggPSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGg7CgkJCXJlc3VsdC5saW5ld2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7CgoJCQlpZiAoIGlzUG9pbnRMaWdodCAmJiByZXN1bHQuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCApIHsKCgkJCQlyZXN1bHQucmVmZXJlbmNlUG9zaXRpb24uY29weSggbGlnaHRQb3NpdGlvbldvcmxkICk7CgkJCQlyZXN1bHQubmVhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhTmVhcjsKCQkJCXJlc3VsdC5mYXJEaXN0YW5jZSA9IHNoYWRvd0NhbWVyYUZhcjsKCgkJCX0KCgkJCXJldHVybiByZXN1bHQ7CgoJCX0KCgkJZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7CgoJCQlpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCgkJCXZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7CgoJCQlpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7CgoJCQkJaWYgKCBvYmplY3QuY2FzdFNoYWRvdyAmJiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSApIHsKCgkJCQkJb2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTsKCgkJCQkJdmFyIGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTsKCQkJCQl2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CgoJCQkJCWlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHsKCgkJCQkJCXZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CgoJCQkJCQlmb3IgKCB2YXIgayA9IDAsIGtsID0gZ3JvdXBzLmxlbmd0aDsgayA8IGtsOyBrICsrICkgewoKCQkJCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgayBdOwoJCQkJCQkJdmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdOwoKCQkJCQkJCWlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7CgoJCQkJCQkJCXZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7CgkJCQkJCQkJX3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBncm91cCApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHsKCgkJCQkJCXZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBfbGlnaHRQb3NpdGlvbldvcmxkLCBzaGFkb3dDYW1lcmEubmVhciwgc2hhZG93Q2FtZXJhLmZhciApOwoJCQkJCQlfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCXZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJcmVuZGVyT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICk7CgoJCQl9CgoJCX0KCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCApIHsKCgkJdmFyIGJ1ZmZlcnMgPSB7fTsKCgkJZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7CgoJCQl2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7CgkJCXZhciB1c2FnZSA9IGF0dHJpYnV0ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7CgoJCQl2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CgoJCQlnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTsKCQkJZ2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIHVzYWdlICk7CgoJCQlhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpOwoKCQkJdmFyIHR5cGUgPSBnbC5GTE9BVDsKCgkJCWlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgKSB7CgoJCQkJdHlwZSA9IGdsLkZMT0FUOwoKCQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4nICk7CgoJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkgewoKCQkJCXR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDsKCgkJCX0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSApIHsKCgkJCQl0eXBlID0gZ2wuU0hPUlQ7CgoJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkgewoKCQkJCXR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7CgoJCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgKSB7CgoJCQkJdHlwZSA9IGdsLklOVDsKCgkJCX0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5ICkgewoKCQkJCXR5cGUgPSBnbC5CWVRFOwoKCQkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkgewoKCQkJCXR5cGUgPSBnbC5VTlNJR05FRF9CWVRFOwoKCQkJfQoKCQkJcmV0dXJuIHsKCQkJCWJ1ZmZlcjogYnVmZmVyLAoJCQkJdHlwZTogdHlwZSwKCQkJCWJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsCgkJCQl2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvbgoJCQl9OwoKCQl9CgoJCWZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7CgoJCQl2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7CgkJCXZhciB1cGRhdGVSYW5nZSA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZTsKCgkJCWdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApOwoKCQkJaWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7CgoJCQkJZ2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIGdsLlNUQVRJQ19EUkFXICk7CgoJCQl9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gLSAxICkgewoKCQkJCS8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzCgoJCQkJZ2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTsKCgkJCX0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAwICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LicgKTsKCgkJCX0gZWxzZSB7CgoJCQkJZ2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsCgkJCQkJYXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApOwoKCQkJCXVwZGF0ZVJhbmdlLmNvdW50ID0gLSAxOyAvLyByZXNldCByYW5nZQoKCQkJfQoKCQl9CgoJCS8vCgoJCWZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkgewoKCQkJaWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhOwoKCQkJcmV0dXJuIGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07CgoJCX0KCgkJZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7CgoJCQlpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7CgoJCQl2YXIgZGF0YSA9IGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07CgoJCQlpZiAoIGRhdGEgKSB7CgoJCQkJZ2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApOwoKCQkJCWRlbGV0ZSBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHVwZGF0ZSggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgewoKCQkJaWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhOwoKCQkJdmFyIGRhdGEgPSBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdOwoKCQkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7CgoJCQkJYnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXSA9IGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICk7CgoJCQl9IGVsc2UgaWYgKCBkYXRhLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHsKCgkJCQl1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTsKCgkJCQlkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjsKCgkJCX0KCgkJfQoKCQlyZXR1cm4gewoKCQkJZ2V0OiBnZXQsCgkJCXJlbW92ZTogcmVtb3ZlLAoJCQl1cGRhdGU6IHVwZGF0ZQoKCQl9OwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KCSAqLwoKCWZ1bmN0aW9uIEV1bGVyKCB4LCB5LCB6LCBvcmRlciApIHsKCgkJdGhpcy5feCA9IHggfHwgMDsKCQl0aGlzLl95ID0geSB8fCAwOwoJCXRoaXMuX3ogPSB6IHx8IDA7CgkJdGhpcy5fb3JkZXIgPSBvcmRlciB8fCBFdWxlci5EZWZhdWx0T3JkZXI7CgoJfQoKCUV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07CgoJRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7CgoJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwgewoKCQl4OiB7CgoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQlyZXR1cm4gdGhpcy5feDsKCgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJdGhpcy5feCA9IHZhbHVlOwoJCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CgoJCQl9CgoJCX0sCgoJCXk6IHsKCgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiB0aGlzLl95OwoKCQkJfSwKCgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQl0aGlzLl95ID0gdmFsdWU7CgkJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCX0KCgkJfSwKCgkJejogewoKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuX3o7CgoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCXRoaXMuX3ogPSB2YWx1ZTsKCQkJCXRoaXMub25DaGFuZ2VDYWxsYmFjaygpOwoKCQkJfQoKCQl9LAoKCQlvcmRlcjogewoKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuX29yZGVyOwoKCQkJfSwKCgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQl0aGlzLl9vcmRlciA9IHZhbHVlOwoJCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CgoJCQl9CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7CgoJCWlzRXVsZXI6IHRydWUsCgoJCXNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCBvcmRlciApIHsKCgkJCXRoaXMuX3ggPSB4OwoJCQl0aGlzLl95ID0geTsKCQkJdGhpcy5feiA9IHo7CgkJCXRoaXMuX29yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIGV1bGVyICkgewoKCQkJdGhpcy5feCA9IGV1bGVyLl94OwoJCQl0aGlzLl95ID0gZXVsZXIuX3k7CgkJCXRoaXMuX3ogPSBldWxlci5fejsKCQkJdGhpcy5fb3JkZXIgPSBldWxlci5fb3JkZXI7CgoJCQl0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHsKCgkJCXZhciBjbGFtcCA9IF9NYXRoLmNsYW1wOwoKCQkJLy8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZCkKCgkJCXZhciB0ZSA9IG0uZWxlbWVudHM7CgkJCXZhciBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdOwoJCQl2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTsKCQkJdmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdOwoKCQkJb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjsKCgkJCWlmICggb3JkZXIgPT09ICdYWVonICkgewoKCQkJCXRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7CgoJCQkJaWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5ICkgewoKCQkJCQl0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApOwoJCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJdGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7CgkJCQkJdGhpcy5feiA9IDA7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkgewoKCQkJCXRoaXMuX3ggPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0yMywgLSAxLCAxICkgKTsKCgkJCQlpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTkgKSB7CgoJCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApOwoJCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7CgkJCQkJdGhpcy5feiA9IDA7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkgewoKCQkJCXRoaXMuX3ggPSBNYXRoLmFzaW4oIGNsYW1wKCBtMzIsIC0gMSwgMSApICk7CgoJCQkJaWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5ICkgewoKCQkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0zMyApOwoJCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJdGhpcy5feSA9IDA7CgkJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkgewoKCQkJCXRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTsKCgkJCQlpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTkgKSB7CgoJCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApOwoJCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXRoaXMuX3ggPSAwOwoJCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkgewoKCQkJCXRoaXMuX3ogPSBNYXRoLmFzaW4oIGNsYW1wKCBtMjEsIC0gMSwgMSApICk7CgoJCQkJaWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5ICkgewoKCQkJCQl0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0yMiApOwoJCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJdGhpcy5feCA9IDA7CgkJCQkJdGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkgewoKCQkJCXRoaXMuX3ogPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0xMiwgLSAxLCAxICkgKTsKCgkJCQlpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTkgKSB7CgoJCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApOwoJCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7CgkJCQkJdGhpcy5feSA9IDA7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTsKCgkJCX0KCgkJCXRoaXMuX29yZGVyID0gb3JkZXI7CgoJCQlpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVF1YXRlcm5pb24oIHEsIG9yZGVyLCB1cGRhdGUgKSB7CgoJCQkJbWF0cml4Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7CgoJCQkJcmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTsKCgkJCX07CgoJCX0oKSwKCgkJc2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiwgb3JkZXIgKSB7CgoJCQlyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7CgoJCX0sCgoJCXJlb3JkZXI6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIFdBUk5JTkc6IHRoaXMgZGlzY2FyZHMgcmV2b2x1dGlvbiBpbmZvcm1hdGlvbiAtYmhvdXN0b24KCgkJCXZhciBxID0gbmV3IFF1YXRlcm5pb24oKTsKCgkJCXJldHVybiBmdW5jdGlvbiByZW9yZGVyKCBuZXdPcmRlciApIHsKCgkJCQlxLnNldEZyb21FdWxlciggdGhpcyApOwoKCQkJCXJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBxLCBuZXdPcmRlciApOwoKCQkJfTsKCgkJfSgpLAoKCQllcXVhbHM6IGZ1bmN0aW9uICggZXVsZXIgKSB7CgoJCQlyZXR1cm4gKCBldWxlci5feCA9PT0gdGhpcy5feCApICYmICggZXVsZXIuX3kgPT09IHRoaXMuX3kgKSAmJiAoIGV1bGVyLl96ID09PSB0aGlzLl96ICkgJiYgKCBldWxlci5fb3JkZXIgPT09IHRoaXMuX29yZGVyICk7CgoJCX0sCgoJCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHsKCgkJCXRoaXMuX3ggPSBhcnJheVsgMCBdOwoJCQl0aGlzLl95ID0gYXJyYXlbIDEgXTsKCQkJdGhpcy5feiA9IGFycmF5WyAyIF07CgkJCWlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdOwoKCQkJdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKCQkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgoJCQlhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94OwoJCQlhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTsKCQkJYXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7CgkJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjsKCgkJCXJldHVybiBhcnJheTsKCgkJfSwKCgkJdG9WZWN0b3IzOiBmdW5jdGlvbiAoIG9wdGlvbmFsUmVzdWx0ICkgewoKCQkJaWYgKCBvcHRpb25hbFJlc3VsdCApIHsKCgkJCQlyZXR1cm4gb3B0aW9uYWxSZXN1bHQuc2V0KCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7CgoJCQl9IGVsc2UgewoKCQkJCXJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApOwoKCQkJfQoKCQl9LAoKCQlvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCgkJCXRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW9uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIExheWVycygpIHsKCgkJdGhpcy5tYXNrID0gMSB8IDA7CgoJfQoKCU9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7CgoJCQl0aGlzLm1hc2sgPSAxIDw8IGNoYW5uZWwgfCAwOwoKCQl9LAoKCQllbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKCgkJCXRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwOwoKCQl9LAoKCQl0b2dnbGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKCgkJCXRoaXMubWFzayBePSAxIDw8IGNoYW5uZWwgfCAwOwoKCQl9LAoKCQlkaXNhYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7CgoJCQl0aGlzLm1hc2sgJj0gfiAoIDEgPDwgY2hhbm5lbCB8IDAgKTsKCgkJfSwKCgkJdGVzdDogZnVuY3Rpb24gKCBsYXllcnMgKSB7CgoJCQlyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoCgkgKi8KCgl2YXIgb2JqZWN0M0RJZCA9IDA7CgoJZnVuY3Rpb24gT2JqZWN0M0QoKSB7CgoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogb2JqZWN0M0RJZCArKyB9ICk7CgoJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKCQl0aGlzLm5hbWUgPSAnJzsKCQl0aGlzLnR5cGUgPSAnT2JqZWN0M0QnOwoKCQl0aGlzLnBhcmVudCA9IG51bGw7CgkJdGhpcy5jaGlsZHJlbiA9IFtdOwoKCQl0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7CgoJCXZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7CgkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwoJCXZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCAxLCAxLCAxICk7CgoJCWZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7CgoJCQlxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7CgoJCX0KCgkJZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkgewoKCQkJcm90YXRpb24uc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2UgKTsKCgkJfQoKCQlyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApOwoJCXF1YXRlcm5pb24ub25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywgewoJCQlwb3NpdGlvbjogewoJCQkJZW51bWVyYWJsZTogdHJ1ZSwKCQkJCXZhbHVlOiBwb3NpdGlvbgoJCQl9LAoJCQlyb3RhdGlvbjogewoJCQkJZW51bWVyYWJsZTogdHJ1ZSwKCQkJCXZhbHVlOiByb3RhdGlvbgoJCQl9LAoJCQlxdWF0ZXJuaW9uOiB7CgkJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQkJdmFsdWU6IHF1YXRlcm5pb24KCQkJfSwKCQkJc2NhbGU6IHsKCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQl2YWx1ZTogc2NhbGUKCQkJfSwKCQkJbW9kZWxWaWV3TWF0cml4OiB7CgkJCQl2YWx1ZTogbmV3IE1hdHJpeDQoKQoJCQl9LAoJCQlub3JtYWxNYXRyaXg6IHsKCQkJCXZhbHVlOiBuZXcgTWF0cml4MygpCgkJCX0KCQl9ICk7CgoJCXRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCQl0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTsKCgkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7CgkJdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CgoJCXRoaXMubGF5ZXJzID0gbmV3IExheWVycygpOwoJCXRoaXMudmlzaWJsZSA9IHRydWU7CgoJCXRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlOwoJCXRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlOwoKCQl0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlOwoJCXRoaXMucmVuZGVyT3JkZXIgPSAwOwoKCQl0aGlzLnVzZXJEYXRhID0ge307CgoJfQoKCU9iamVjdDNELkRlZmF1bHRVcCA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7CglPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7CgoJT2JqZWN0M0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBPYmplY3QzRCwKCgkJaXNPYmplY3QzRDogdHJ1ZSwKCgkJb25CZWZvcmVSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LAoJCW9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LAoKCQlhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7CgoJCQl0aGlzLm1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIHRoaXMubWF0cml4ICk7CgoJCQl0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApOwoKCQl9LAoKCQlhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKCgkJCXRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHsKCgkJCS8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkCgoJCQl0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTsKCgkJfSwKCgkJc2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7CgoJCQl0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApOwoKCQl9LAoKCQlzZXRSb3RhdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKCgkJCS8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpCgoJCQl0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7CgoJCX0sCgoJCXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKCgkJCS8vIGFzc3VtZXMgcSBpcyBub3JtYWxpemVkCgoJCQl0aGlzLnF1YXRlcm5pb24uY29weSggcSApOwoKCQl9LAoKCQlyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2UKCQkJLy8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQKCgkJCXZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25BeGlzKCBheGlzLCBhbmdsZSApIHsKCgkJCQlxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApOwoKCQkJCXRoaXMucXVhdGVybmlvbi5tdWx0aXBseSggcTEgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJcm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZQoJCQkvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAoJCQkvLyBtZXRob2QgYXNzdW1lcyBubyByb3RhdGVkIHBhcmVudAoKCQkJdmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTsKCgkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVPbldvcmxkQXhpcyggYXhpcywgYW5nbGUgKSB7CgoJCQkJcTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTsKCgkJCQl0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHExICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCXJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7CgoJCQkJcmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTsKCgkJCX07CgoJCX0oKSwKCgkJcm90YXRlWTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTsKCgkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHsKCgkJCQlyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApOwoKCQkJfTsKCgkJfSgpLAoKCQlyb3RhdGVaOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkgewoKCQkJCXJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7CgoJCQl9OwoKCQl9KCksCgoJCXRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCkgewoKCQkJLy8gdHJhbnNsYXRlIG9iamVjdCBieSBkaXN0YW5jZSBhbG9uZyBheGlzIGluIG9iamVjdCBzcGFjZQoJCQkvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgewoKCQkJCXYxLmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiApOwoKCQkJCXRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQl0cmFuc2xhdGVYOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVgoIGRpc3RhbmNlICkgewoKCQkJCXJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7CgoJCQl9OwoKCQl9KCksCgoJCXRyYW5zbGF0ZVk6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWSggZGlzdGFuY2UgKSB7CgoJCQkJcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTsKCgkJCX07CgoJCX0oKSwKCgkJdHJhbnNsYXRlWjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTsKCgkJCXJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHsKCgkJCQlyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApOwoKCQkJfTsKCgkJfSgpLAoKCQlsb2NhbFRvV29ybGQ6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsKCgkJfSwKCgkJd29ybGRUb0xvY2FsOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHdvcmxkVG9Mb2NhbCggdmVjdG9yICkgewoKCQkJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtMS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICkgKTsKCgkJCX07CgoJCX0oKSwKCgkJbG9va0F0OiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgd2l0aCByb3RhdGVkIGFuZC9vciB0cmFuc2xhdGVkIHBhcmVudChzKQoKCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKCQkJdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB4LCB5LCB6ICkgewoKCQkJCWlmICggeC5pc1ZlY3RvcjMgKSB7CgoJCQkJCXZlY3Rvci5jb3B5KCB4ICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJdmVjdG9yLnNldCggeCwgeSwgeiApOwoKCQkJCX0KCgkJCQlpZiAoIHRoaXMuaXNDYW1lcmEgKSB7CgoJCQkJCW0xLmxvb2tBdCggdGhpcy5wb3NpdGlvbiwgdmVjdG9yLCB0aGlzLnVwICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJbTEubG9va0F0KCB2ZWN0b3IsIHRoaXMucG9zaXRpb24sIHRoaXMudXAgKTsKCgkJCQl9CgoJCQkJdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbTEgKTsKCgkJCX07CgoJCX0oKSwKCgkJYWRkOiBmdW5jdGlvbiAoIG9iamVjdCApIHsKCgkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7CgoJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHsKCgkJCQkJdGhpcy5hZGQoIGFyZ3VtZW50c1sgaSBdICk7CgoJCQkJfQoKCQkJCXJldHVybiB0aGlzOwoKCQkJfQoKCQkJaWYgKCBvYmplY3QgPT09IHRoaXMgKSB7CgoJCQkJY29uc29sZS5lcnJvciggIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsIG9iamVjdCApOwoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9CgoJCQlpZiAoICggb2JqZWN0ICYmIG9iamVjdC5pc09iamVjdDNEICkgKSB7CgoJCQkJaWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkgewoKCQkJCQlvYmplY3QucGFyZW50LnJlbW92ZSggb2JqZWN0ICk7CgoJCQkJfQoKCQkJCW9iamVjdC5wYXJlbnQgPSB0aGlzOwoJCQkJb2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2FkZGVkJyB9ICk7CgoJCQkJdGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTsKCgkJCX0gZWxzZSB7CgoJCQkJY29uc29sZS5lcnJvciggIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLCBvYmplY3QgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlyZW1vdmU6IGZ1bmN0aW9uICggb2JqZWN0ICkgewoKCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkgewoKCQkJCQl0aGlzLnJlbW92ZSggYXJndW1lbnRzWyBpIF0gKTsKCgkJCQl9CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9CgoJCQl2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoIG9iamVjdCApOwoKCQkJaWYgKCBpbmRleCAhPT0gLSAxICkgewoKCQkJCW9iamVjdC5wYXJlbnQgPSBudWxsOwoKCQkJCW9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7CgoJCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZ2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHsKCgkJCXJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7CgoJCX0sCgoJCWdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7CgoJCX0sCgoJCWdldE9iamVjdEJ5UHJvcGVydHk6IGZ1bmN0aW9uICggbmFtZSwgdmFsdWUgKSB7CgoJCQlpZiAoIHRoaXNbIG5hbWUgXSA9PT0gdmFsdWUgKSByZXR1cm4gdGhpczsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuWyBpIF07CgkJCQl2YXIgb2JqZWN0ID0gY2hpbGQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTsKCgkJCQlpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlyZXR1cm4gb2JqZWN0OwoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgoJCX0sCgoJCWdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCXJldHVybiByZXN1bHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CgoJCX0sCgoJCWdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFF1YXRlcm5pb24oIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUXVhdGVybmlvbigpOwoKCQkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCQl0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHJlc3VsdCwgc2NhbGUgKTsKCgkJCQlyZXR1cm4gcmVzdWx0OwoKCQkJfTsKCgkJfSgpLAoKCQlnZXRXb3JsZFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRSb3RhdGlvbiggb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBFdWxlcigpOwoKCQkJCXRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CgoJCQkJcmV0dXJuIHJlc3VsdC5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdGhpcy5yb3RhdGlvbi5vcmRlciwgZmFsc2UgKTsKCgkJCX07CgoJCX0oKSwKCgkJZ2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkU2NhbGUoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoKCQkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCQl0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHJlc3VsdCApOwoKCQkJCXJldHVybiByZXN1bHQ7CgoJCQl9OwoKCQl9KCksCgoJCWdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoKCQkJCXRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7CgoJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTsKCgkJCX07CgoJCX0oKSwKCgkJcmF5Y2FzdDogZnVuY3Rpb24gKCkge30sCgoJCXRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgewoKCQkJY2FsbGJhY2soIHRoaXMgKTsKCgkJCXZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCWNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7CgoJCQl9CgoJCX0sCgoJCXRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCgkJCWlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCgkJCWNhbGxiYWNrKCB0aGlzICk7CgoJCQl2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQljaGlsZHJlblsgaSBdLnRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKTsKCgkJCX0KCgkJfSwKCgkJdHJhdmVyc2VBbmNlc3RvcnM6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CgoJCQl2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CgoJCQlpZiAoIHBhcmVudCAhPT0gbnVsbCApIHsKCgkJCQljYWxsYmFjayggcGFyZW50ICk7CgoJCQkJcGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApOwoKCQkJfQoKCQl9LAoKCQl1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMubWF0cml4LmNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApOwoKCQkJdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJfSwKCgkJdXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CgoJCQlpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7CgoJCQlpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHsKCgkJCQlpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgewoKCQkJCQl0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJdGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTsKCgkJCQl9CgoJCQkJdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CgoJCQkJZm9yY2UgPSB0cnVlOwoKCQkJfQoKCQkJLy8gdXBkYXRlIGNoaWxkcmVuCgoJCQl2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQljaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApOwoKCQkJfQoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCgkJCS8vIG1ldGEgaXMgYSBzdHJpbmcgd2hlbiBjYWxsZWQgZnJvbSBKU09OLnN0cmluZ2lmeQoJCQl2YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7CgoJCQl2YXIgb3V0cHV0ID0ge307CgoJCQkvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNvbGxlY3QgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLgoJCQkvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdAoJCQkvLyBiZWluZyBzZXJpYWxpemVkLgoJCQlpZiAoIGlzUm9vdE9iamVjdCApIHsKCgkJCQkvLyBpbml0aWFsaXplIG1ldGEgb2JqCgkJCQltZXRhID0gewoJCQkJCWdlb21ldHJpZXM6IHt9LAoJCQkJCW1hdGVyaWFsczoge30sCgkJCQkJdGV4dHVyZXM6IHt9LAoJCQkJCWltYWdlczoge30sCgkJCQkJc2hhcGVzOiB7fQoJCQkJfTsKCgkJCQlvdXRwdXQubWV0YWRhdGEgPSB7CgkJCQkJdmVyc2lvbjogNC41LAoJCQkJCXR5cGU6ICdPYmplY3QnLAoJCQkJCWdlbmVyYXRvcjogJ09iamVjdDNELnRvSlNPTicKCQkJCX07CgoJCQl9CgoJCQkvLyBzdGFuZGFyZCBPYmplY3QzRCBzZXJpYWxpemF0aW9uCgoJCQl2YXIgb2JqZWN0ID0ge307CgoJCQlvYmplY3QudXVpZCA9IHRoaXMudXVpZDsKCQkJb2JqZWN0LnR5cGUgPSB0aGlzLnR5cGU7CgoJCQlpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBvYmplY3QubmFtZSA9IHRoaXMubmFtZTsKCQkJaWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7CgkJCWlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlOwoJCQlpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlOwoJCQlpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBvYmplY3QudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhOwoKCQkJb2JqZWN0Lm1hdHJpeCA9IHRoaXMubWF0cml4LnRvQXJyYXkoKTsKCgkJCS8vCgoJCQlmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7CgoJCQkJaWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQlsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7CgoJCQkJfQoKCQkJCXJldHVybiBlbGVtZW50LnV1aWQ7CgoJCQl9CgoJCQlpZiAoIHRoaXMuZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHsKCgkJCQlvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUoIG1ldGEuZ2VvbWV0cmllcywgdGhpcy5nZW9tZXRyeSApOwoKCQkJCXZhciBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzOwoKCQkJCWlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtZXRlcnMuc2hhcGVzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCXZhciBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlczsKCgkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQkJCXZhciBzaGFwZSA9IHNoYXBlc1sgaSBdOwoKCQkJCQkJCXNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlICk7CgoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCWlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggQXJyYXkuaXNBcnJheSggdGhpcy5tYXRlcmlhbCApICkgewoKCQkJCQl2YXIgdXVpZHMgPSBbXTsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQkJdXVpZHMucHVzaCggc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbFsgaSBdICkgKTsKCgkJCQkJfQoKCQkJCQlvYmplY3QubWF0ZXJpYWwgPSB1dWlkczsKCgkJCQl9IGVsc2UgewoKCQkJCQlvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7CgoJCQkJfQoKCQkJfQoKCQkJLy8KCgkJCWlmICggdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICkgewoKCQkJCW9iamVjdC5jaGlsZHJlbiA9IFtdOwoKCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkgewoKCQkJCQlvYmplY3QuY2hpbGRyZW4ucHVzaCggdGhpcy5jaGlsZHJlblsgaSBdLnRvSlNPTiggbWV0YSApLm9iamVjdCApOwoKCQkJCX0KCgkJCX0KCgkJCWlmICggaXNSb290T2JqZWN0ICkgewoKCQkJCXZhciBnZW9tZXRyaWVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5nZW9tZXRyaWVzICk7CgkJCQl2YXIgbWF0ZXJpYWxzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5tYXRlcmlhbHMgKTsKCQkJCXZhciB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTsKCQkJCXZhciBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApOwoJCQkJdmFyIHNoYXBlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuc2hhcGVzICk7CgoJCQkJaWYgKCBnZW9tZXRyaWVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7CgkJCQlpZiAoIG1hdGVyaWFscy5sZW5ndGggPiAwICkgb3V0cHV0Lm1hdGVyaWFscyA9IG1hdGVyaWFsczsKCQkJCWlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIG91dHB1dC50ZXh0dXJlcyA9IHRleHR1cmVzOwoJCQkJaWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIG91dHB1dC5pbWFnZXMgPSBpbWFnZXM7CgkJCQlpZiAoIHNoYXBlcy5sZW5ndGggPiAwICkgb3V0cHV0LnNoYXBlcyA9IHNoYXBlczsKCgkJCX0KCgkJCW91dHB1dC5vYmplY3QgPSBvYmplY3Q7CgoJCQlyZXR1cm4gb3V0cHV0OwoKCQkJLy8gZXh0cmFjdCBkYXRhIGZyb20gdGhlIGNhY2hlIGhhc2gKCQkJLy8gcmVtb3ZlIG1ldGFkYXRhIG9uIGVhY2ggaXRlbQoJCQkvLyBhbmQgcmV0dXJuIGFzIGFycmF5CgkJCWZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkgewoKCQkJCXZhciB2YWx1ZXMgPSBbXTsKCQkJCWZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7CgoJCQkJCXZhciBkYXRhID0gY2FjaGVbIGtleSBdOwoJCQkJCWRlbGV0ZSBkYXRhLm1ldGFkYXRhOwoJCQkJCXZhbHVlcy5wdXNoKCBkYXRhICk7CgoJCQkJfQoJCQkJcmV0dXJuIHZhbHVlczsKCgkJCX0KCgkJfSwKCgkJY2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CgoJCQlpZiAoIHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkICkgcmVjdXJzaXZlID0gdHJ1ZTsKCgkJCXRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOwoKCQkJdGhpcy51cC5jb3B5KCBzb3VyY2UudXAgKTsKCgkJCXRoaXMucG9zaXRpb24uY29weSggc291cmNlLnBvc2l0aW9uICk7CgkJCXRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApOwoJCQl0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5zY2FsZSApOwoKCQkJdGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApOwoJCQl0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZCApOwoKCQkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7CgkJCXRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlOwoKCQkJdGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzazsKCQkJdGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7CgoJCQl0aGlzLmNhc3RTaGFkb3cgPSBzb3VyY2UuY2FzdFNoYWRvdzsKCQkJdGhpcy5yZWNlaXZlU2hhZG93ID0gc291cmNlLnJlY2VpdmVTaGFkb3c7CgoJCQl0aGlzLmZydXN0dW1DdWxsZWQgPSBzb3VyY2UuZnJ1c3R1bUN1bGxlZDsKCQkJdGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjsKCgkJCXRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTsKCgkJCWlmICggcmVjdXJzaXZlID09PSB0cnVlICkgewoKCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHNvdXJjZS5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCXZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdOwoJCQkJCXRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJKi8KCglmdW5jdGlvbiBDYW1lcmEoKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0NhbWVyYSc7CgoJCXRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKCQl0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpOwoKCX0KCglDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IENhbWVyYSwKCgkJaXNDYW1lcmE6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CgoJCQlPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApOwoKCQkJdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApOwoJCQl0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkRGlyZWN0aW9uKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJCQl0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApOwoKCQkJCXJldHVybiByZXN1bHQuc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTsKCgkJCX07CgoJCX0oKSwKCgkJdXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CgoJCQlPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTsKCgkJCXRoaXMubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTsKCgkJfSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIGFyb3NlIC8gaHR0cDovL2dpdGh1Yi5jb20vYXJvc2UKCSAqLwoKCWZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVyYSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7CgoJCUNhbWVyYS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnOwoKCQl0aGlzLnpvb20gPSAxOwoJCXRoaXMudmlldyA9IG51bGw7CgoJCXRoaXMubGVmdCA9IGxlZnQ7CgkJdGhpcy5yaWdodCA9IHJpZ2h0OwoJCXRoaXMudG9wID0gdG9wOwoJCXRoaXMuYm90dG9tID0gYm90dG9tOwoKCQl0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDAuMTsKCQl0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDIwMDA7CgoJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKCX0KCglPcnRob2dyYXBoaWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBPcnRob2dyYXBoaWNDYW1lcmEsCgoJCWlzT3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkgewoKCQkJQ2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7CgoJCQl0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDsKCQkJdGhpcy5yaWdodCA9IHNvdXJjZS5yaWdodDsKCQkJdGhpcy50b3AgPSBzb3VyY2UudG9wOwoJCQl0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207CgkJCXRoaXMubmVhciA9IHNvdXJjZS5uZWFyOwoJCQl0aGlzLmZhciA9IHNvdXJjZS5mYXI7CgoJCQl0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTsKCQkJdGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7CgoJCQlpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHsKCgkJCQl0aGlzLnZpZXcgPSB7CgkJCQkJZW5hYmxlZDogdHJ1ZSwKCQkJCQlmdWxsV2lkdGg6IDEsCgkJCQkJZnVsbEhlaWdodDogMSwKCQkJCQlvZmZzZXRYOiAwLAoJCQkJCW9mZnNldFk6IDAsCgkJCQkJd2lkdGg6IDEsCgkJCQkJaGVpZ2h0OiAxCgkJCQl9OwoKCQkJfQoKCQkJdGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlOwoJCQl0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoOwoJCQl0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7CgkJCXRoaXMudmlldy5vZmZzZXRYID0geDsKCQkJdGhpcy52aWV3Lm9mZnNldFkgPSB5OwoJCQl0aGlzLnZpZXcud2lkdGggPSB3aWR0aDsKCQkJdGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDsKCgkJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKCQl9LAoKCQljbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy52aWV3ICE9PSBudWxsICkgewoKCQkJCXRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7CgoJCQl9CgoJCQl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCgkJfSwKCgkJdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTsKCQkJdmFyIGR5ID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyAoIDIgKiB0aGlzLnpvb20gKTsKCQkJdmFyIGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyOwoJCQl2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7CgoJCQl2YXIgbGVmdCA9IGN4IC0gZHg7CgkJCXZhciByaWdodCA9IGN4ICsgZHg7CgkJCXZhciB0b3AgPSBjeSArIGR5OwoJCQl2YXIgYm90dG9tID0gY3kgLSBkeTsKCgkJCWlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkgewoKCQkJCXZhciB6b29tVyA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LndpZHRoIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCApOwoJCQkJdmFyIHpvb21IID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcuaGVpZ2h0IC8gdGhpcy52aWV3LmZ1bGxIZWlnaHQgKTsKCQkJCXZhciBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmlldy53aWR0aDsKCQkJCXZhciBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMudmlldy5oZWlnaHQ7CgoJCQkJbGVmdCArPSBzY2FsZVcgKiAoIHRoaXMudmlldy5vZmZzZXRYIC8gem9vbVcgKTsKCQkJCXJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqICggdGhpcy52aWV3LndpZHRoIC8gem9vbVcgKTsKCQkJCXRvcCAtPSBzY2FsZUggKiAoIHRoaXMudmlldy5vZmZzZXRZIC8gem9vbUggKTsKCQkJCWJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqICggdGhpcy52aWV3LmhlaWdodCAvIHpvb21IICk7CgoJCQl9CgoJCQl0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgewoKCQkJdmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKCgkJCWRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207CgkJCWRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7CgkJCWRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDsKCQkJZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7CgkJCWRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tOwoJCQlkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyOwoJCQlkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjsKCgkJCWlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTsKCgkJCXJldHVybiBkYXRhOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHsKCgkJdGhpcy5hID0gYTsKCQl0aGlzLmIgPSBiOwoJCXRoaXMuYyA9IGM7CgoJCXRoaXMubm9ybWFsID0gKCBub3JtYWwgJiYgbm9ybWFsLmlzVmVjdG9yMyApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoKTsKCQl0aGlzLnZlcnRleE5vcm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdOwoKCQl0aGlzLmNvbG9yID0gKCBjb2xvciAmJiBjb2xvci5pc0NvbG9yICkgPyBjb2xvciA6IG5ldyBDb2xvcigpOwoJCXRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107CgoJCXRoaXMubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwOwoKCX0KCglPYmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHsKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCgkJfSwKCgkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCQl0aGlzLmEgPSBzb3VyY2UuYTsKCQkJdGhpcy5iID0gc291cmNlLmI7CgkJCXRoaXMuYyA9IHNvdXJjZS5jOwoKCQkJdGhpcy5ub3JtYWwuY29weSggc291cmNlLm5vcm1hbCApOwoJCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKCQkJdGhpcy5tYXRlcmlhbEluZGV4ID0gc291cmNlLm1hdGVyaWFsSW5kZXg7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdGhpcy52ZXJ0ZXhOb3JtYWxzWyBpIF0gPSBzb3VyY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7CgoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleENvbG9ycy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KCSAqLwoKCXZhciBnZW9tZXRyeUlkID0gMDsgLy8gR2VvbWV0cnkgdXNlcyBldmVuIG51bWJlcnMgYXMgSWQKCglmdW5jdGlvbiBHZW9tZXRyeSgpIHsKCgkJT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBnZW9tZXRyeUlkICs9IDIgfSApOwoKCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKCgkJdGhpcy5uYW1lID0gJyc7CgkJdGhpcy50eXBlID0gJ0dlb21ldHJ5JzsKCgkJdGhpcy52ZXJ0aWNlcyA9IFtdOwoJCXRoaXMuY29sb3JzID0gW107CgkJdGhpcy5mYWNlcyA9IFtdOwoJCXRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07CgoJCXRoaXMubW9ycGhUYXJnZXRzID0gW107CgkJdGhpcy5tb3JwaE5vcm1hbHMgPSBbXTsKCgkJdGhpcy5za2luV2VpZ2h0cyA9IFtdOwoJCXRoaXMuc2tpbkluZGljZXMgPSBbXTsKCgkJdGhpcy5saW5lRGlzdGFuY2VzID0gW107CgoJCXRoaXMuYm91bmRpbmdCb3ggPSBudWxsOwoJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwoKCQkvLyB1cGRhdGUgZmxhZ3MKCgkJdGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTsKCQl0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlOwoJCXRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlOwoJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTsKCQl0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTsKCQl0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7CgkJdGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7CgoJfQoKCUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogR2VvbWV0cnksCgoJCWlzR2VvbWV0cnk6IHRydWUsCgoJCWFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCgkJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdOwoJCQkJdmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4ICk7CgoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTsKCQkJCWZhY2Uubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgoJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCgkJCQkJZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF0uYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CgoJCQkJdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTsKCgkJCX0KCgkJCWlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJfQoKCQkJdGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSB0cnVlOwoJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlyb3RhdGVYOiBmdW5jdGlvbiAoKSB7CgoJCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpcwoKCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKCgkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHsKCgkJCQltMS5tYWtlUm90YXRpb25YKCBhbmdsZSApOwoKCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCXJvdGF0ZVk6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzCgoJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkgewoKCQkJCW0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7CgoJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJcm90YXRlWjogZnVuY3Rpb24gKCkgewoKCQkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXMKCgkJCXZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7CgoJCQkJbTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTsKCgkJCQl0aGlzLmFwcGx5TWF0cml4KCBtMSApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQl0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHRyYW5zbGF0ZSBnZW9tZXRyeQoKCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKCgkJCXJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7CgoJCQkJbTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7CgoJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJc2NhbGU6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHNjYWxlIGdlb21ldHJ5CgoJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkgewoKCQkJCW0xLm1ha2VTY2FsZSggeCwgeSwgeiApOwoKCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCWxvb2tBdDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkgewoKCQkJCW9iai5sb29rQXQoIHZlY3RvciApOwoKCQkJCW9iai51cGRhdGVNYXRyaXgoKTsKCgkJCQl0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7CgoJCQl9OwoKCQl9KCksCgoJCWZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKCgkJCXZhciBzY29wZSA9IHRoaXM7CgoJCQl2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4ICE9PSBudWxsID8gZ2VvbWV0cnkuaW5kZXguYXJyYXkgOiB1bmRlZmluZWQ7CgkJCXZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKCgkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwoJCQl2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheSA6IHVuZGVmaW5lZDsKCQkJdmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7CgkJCXZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkOwoJCQl2YXIgdXZzMiA9IGF0dHJpYnV0ZXMudXYyICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2Mi5hcnJheSA6IHVuZGVmaW5lZDsKCgkJCWlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBbXTsKCgkJCXZhciB0ZW1wTm9ybWFscyA9IFtdOwoJCQl2YXIgdGVtcFVWcyA9IFtdOwoJCQl2YXIgdGVtcFVWczIgPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMsIGogKz0gMiApIHsKCgkJCQlzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9zaXRpb25zWyBpIF0sIHBvc2l0aW9uc1sgaSArIDEgXSwgcG9zaXRpb25zWyBpICsgMiBdICkgKTsKCgkJCQlpZiAoIG5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJdGVtcE5vcm1hbHMucHVzaCggbmV3IFZlY3RvcjMoIG5vcm1hbHNbIGkgXSwgbm9ybWFsc1sgaSArIDEgXSwgbm9ybWFsc1sgaSArIDIgXSApICk7CgoJCQkJfQoKCQkJCWlmICggY29sb3JzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCXNjb3BlLmNvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgaSBdLCBjb2xvcnNbIGkgKyAxIF0sIGNvbG9yc1sgaSArIDIgXSApICk7CgoJCQkJfQoKCQkJCWlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCXRlbXBVVnMucHVzaCggbmV3IFZlY3RvcjIoIHV2c1sgaiBdLCB1dnNbIGogKyAxIF0gKSApOwoKCQkJCX0KCgkJCQlpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJdGVtcFVWczIucHVzaCggbmV3IFZlY3RvcjIoIHV2czJbIGogXSwgdXZzMlsgaiArIDEgXSApICk7CgoJCQkJfQoKCQkJfQoKCQkJZnVuY3Rpb24gYWRkRmFjZSggYSwgYiwgYywgbWF0ZXJpYWxJbmRleCApIHsKCgkJCQl2YXIgdmVydGV4Tm9ybWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107CgkJCQl2YXIgdmVydGV4Q29sb3JzID0gY29sb3JzICE9PSB1bmRlZmluZWQgPyBbIHNjb3BlLmNvbG9yc1sgYSBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYiBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXSA6IFtdOwoKCQkJCXZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhDb2xvcnMsIG1hdGVyaWFsSW5kZXggKTsKCgkJCQlzY29wZS5mYWNlcy5wdXNoKCBmYWNlICk7CgoJCQkJaWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJc2NvcGUuZmFjZVZlcnRleFV2c1sgMCBdLnB1c2goIFsgdGVtcFVWc1sgYSBdLmNsb25lKCksIHRlbXBVVnNbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzWyBjIF0uY2xvbmUoKSBdICk7CgoJCQkJfQoKCQkJCWlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTsKCgkJCQl9CgoJCQl9CgoJCQl2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKCQkJaWYgKCBncm91cHMubGVuZ3RoID4gMCApIHsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICsrICkgewoKCQkJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKCgkJCQkJdmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7CgkJCQkJdmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7CgoJCQkJCWZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7CgoJCQkJCQlpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQlhZGRGYWNlKCBpbmRpY2VzWyBqIF0sIGluZGljZXNbIGogKyAxIF0sIGluZGljZXNbIGogKyAyIF0sIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJYWRkRmFjZSggaiwgaiArIDEsIGogKyAyLCBncm91cC5tYXRlcmlhbEluZGV4ICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCWlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkgewoKCQkJCQkJYWRkRmFjZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7CgoJCQkJCX0KCgkJCQl9IGVsc2UgewoKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSArPSAzICkgewoKCQkJCQkJYWRkRmFjZSggaSwgaSArIDEsIGkgKyAyICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQl0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpOwoKCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgoJCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY2VudGVyOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOwoKCQkJdmFyIG9mZnNldCA9IHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCkubmVnYXRlKCk7CgoJCQl0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApOwoKCQkJcmV0dXJuIG9mZnNldDsKCgkJfSwKCgkJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJdmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyOwoJCQl2YXIgcmFkaXVzID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM7CgoJCQl2YXIgcyA9IHJhZGl1cyA9PT0gMCA/IDEgOiAxLjAgLyByYWRpdXM7CgoJCQl2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCQkJbWF0cml4LnNldCgKCQkJCXMsIDAsIDAsIC0gcyAqIGNlbnRlci54LAoJCQkJMCwgcywgMCwgLSBzICogY2VudGVyLnksCgkJCQkwLCAwLCBzLCAtIHMgKiBjZW50ZXIueiwKCQkJCTAsIDAsIDAsIDEKCQkJKTsKCgkJCXRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpOwoKCQkJZm9yICggdmFyIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgoJCQkJdmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CgoJCQkJdmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07CgkJCQl2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTsKCQkJCXZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdOwoKCQkJCWNiLnN1YlZlY3RvcnMoIHZDLCB2QiApOwoJCQkJYWIuc3ViVmVjdG9ycyggdkEsIHZCICk7CgkJCQljYi5jcm9zcyggYWIgKTsKCgkJCQljYi5ub3JtYWxpemUoKTsKCgkJCQlmYWNlLm5vcm1hbC5jb3B5KCBjYiApOwoKCQkJfQoKCQl9LAoKCQljb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCBhcmVhV2VpZ2h0ZWQgKSB7CgoJCQlpZiAoIGFyZWFXZWlnaHRlZCA9PT0gdW5kZWZpbmVkICkgYXJlYVdlaWdodGVkID0gdHJ1ZTsKCgkJCXZhciB2LCB2bCwgZiwgZmwsIGZhY2UsIHZlcnRpY2VzOwoKCQkJdmVydGljZXMgPSBuZXcgQXJyYXkoIHRoaXMudmVydGljZXMubGVuZ3RoICk7CgoJCQlmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkgewoKCQkJCXZlcnRpY2VzWyB2IF0gPSBuZXcgVmVjdG9yMygpOwoKCQkJfQoKCQkJaWYgKCBhcmVhV2VpZ2h0ZWQgKSB7CgoJCQkJLy8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXMKCQkJCS8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG0KCgkJCQl2YXIgdkEsIHZCLCB2QzsKCQkJCXZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTsKCgkJCQlmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgewoKCQkJCQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOwoKCQkJCQl2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdOwoJCQkJCXZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07CgkJCQkJdkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTsKCgkJCQkJY2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7CgkJCQkJYWIuc3ViVmVjdG9ycyggdkEsIHZCICk7CgkJCQkJY2IuY3Jvc3MoIGFiICk7CgoJCQkJCXZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGNiICk7CgkJCQkJdmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTsKCQkJCQl2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBjYiApOwoKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJdGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTsKCgkJCQlmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgewoKCQkJCQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOwoKCQkJCQl2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBmYWNlLm5vcm1hbCApOwoJCQkJCXZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7CgkJCQkJdmVydGljZXNbIGZhY2UuYyBdLmFkZCggZmFjZS5ub3JtYWwgKTsKCgkJCQl9CgoJCQl9CgoJCQlmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkgewoKCQkJCXZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7CgoJCQl9CgoJCQlmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgewoKCQkJCWZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CgoJCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CgoJCQkJaWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHsKCgkJCQkJdmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApOwoJCQkJCXZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTsKCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggdmVydGljZXNbIGZhY2UuYyBdICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJdmVydGV4Tm9ybWFsc1sgMCBdID0gdmVydGljZXNbIGZhY2UuYSBdLmNsb25lKCk7CgkJCQkJdmVydGV4Tm9ybWFsc1sgMSBdID0gdmVydGljZXNbIGZhY2UuYiBdLmNsb25lKCk7CgkJCQkJdmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7CgoJCQkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7CgoJCQl9CgoJCX0sCgoJCWNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGYsIGZsLCBmYWNlOwoKCQkJdGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTsKCgkJCWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgoJCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKCgkJCQl2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFsczsKCgkJCQlpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkgewoKCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggZmFjZS5ub3JtYWwgKTsKCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTsKCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggZmFjZS5ub3JtYWwgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQl2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpOwoJCQkJCXZlcnRleE5vcm1hbHNbIDEgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7CgkJCQkJdmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHsKCgkJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTsKCgkJCX0KCgkJfSwKCgkJY29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGksIGlsLCBmLCBmbCwgZmFjZTsKCgkJCS8vIHNhdmUgb3JpZ2luYWwgbm9ybWFscwoJCQkvLyAtIGNyZWF0ZSB0ZW1wIHZhcmlhYmxlcyBvbiBmaXJzdCBhY2Nlc3MKCQkJLy8gICBvdGhlcndpc2UganVzdCBjb3B5IChmb3IgZmFzdGVyIHJlcGVhdGVkIGNhbGxzKQoKCQkJZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCgkJCQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOwoKCQkJCWlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkgewoKCQkJCQlmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwuY2xvbmUoKTsKCgkJCQl9IGVsc2UgewoKCQkJCQlmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CgoJCQkJfQoKCQkJCWlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzICkgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyA9IFtdOwoKCQkJCWZvciAoIGkgPSAwLCBpbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJaWYgKCAhIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSApIHsKCgkJCQkJCWZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCS8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGgKCgkJCXZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTsKCQkJdG1wR2VvLmZhY2VzID0gdGhpcy5mYWNlczsKCgkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCS8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3MKCgkJCQlpZiAoICEgdGhpcy5tb3JwaE5vcm1hbHNbIGkgXSApIHsKCgkJCQkJdGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9OwoJCQkJCXRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgPSBbXTsKCQkJCQl0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgPSBbXTsKCgkJCQkJdmFyIGRzdE5vcm1hbHNGYWNlID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsczsKCQkJCQl2YXIgZHN0Tm9ybWFsc1ZlcnRleCA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFsczsKCgkJCQkJdmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7CgoJCQkJCWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgoJCQkJCQlmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKCQkJCQkJdmVydGV4Tm9ybWFscyA9IHsgYTogbmV3IFZlY3RvcjMoKSwgYjogbmV3IFZlY3RvcjMoKSwgYzogbmV3IFZlY3RvcjMoKSB9OwoKCQkJCQkJZHN0Tm9ybWFsc0ZhY2UucHVzaCggZmFjZU5vcm1hbCApOwoJCQkJCQlkc3ROb3JtYWxzVmVydGV4LnB1c2goIHZlcnRleE5vcm1hbHMgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQl2YXIgbW9ycGhOb3JtYWxzID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXTsKCgkJCQkvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0CgoJCQkJdG1wR2VvLnZlcnRpY2VzID0gdGhpcy5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlczsKCgkJCQkvLyBjb21wdXRlIG1vcnBoIG5vcm1hbHMKCgkJCQl0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7CgkJCQl0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKCgkJCQkvLyBzdG9yZSBtb3JwaCBub3JtYWxzCgoJCQkJdmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7CgoJCQkJZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCgkJCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKCgkJCQkJZmFjZU5vcm1hbCA9IG1vcnBoTm9ybWFscy5mYWNlTm9ybWFsc1sgZiBdOwoJCQkJCXZlcnRleE5vcm1hbHMgPSBtb3JwaE5vcm1hbHMudmVydGV4Tm9ybWFsc1sgZiBdOwoKCQkJCQlmYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CgoJCQkJCXZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApOwoJCQkJCXZlcnRleE5vcm1hbHMuYi5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDEgXSApOwoJCQkJCXZlcnRleE5vcm1hbHMuYy5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDIgXSApOwoKCQkJCX0KCgkJCX0KCgkJCS8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFscwoKCQkJZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCgkJCQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOwoKCQkJCWZhY2Uubm9ybWFsID0gZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbDsKCQkJCWZhY2UudmVydGV4Tm9ybWFscyA9IGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHM7CgoJCQl9CgoJCX0sCgoJCWNvbXB1dGVMaW5lRGlzdGFuY2VzOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgZCA9IDA7CgkJCXZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJaWYgKCBpID4gMCApIHsKCgkJCQkJZCArPSB2ZXJ0aWNlc1sgaSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIC0gMSBdICk7CgoJCQkJfQoKCQkJCXRoaXMubGluZURpc3RhbmNlc1sgaSBdID0gZDsKCgkJCX0KCgkJfSwKCgkJY29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7CgoJCQkJdGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7CgoJCQl9CgoJCQl0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTsKCgkJfSwKCgkJY29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7CgoJCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTsKCgkJCX0KCgkJCXRoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApOwoKCQl9LAoKCQltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgewoKCQkJaWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCXZhciBub3JtYWxNYXRyaXgsCgkJCQl2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCwKCQkJCXZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsCgkJCQl2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcywKCQkJCWZhY2VzMSA9IHRoaXMuZmFjZXMsCgkJCQlmYWNlczIgPSBnZW9tZXRyeS5mYWNlcywKCQkJCXV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSwKCQkJCXV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF0sCgkJCQljb2xvcnMxID0gdGhpcy5jb2xvcnMsCgkJCQljb2xvcnMyID0gZ2VvbWV0cnkuY29sb3JzOwoKCQkJaWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDsKCgkJCWlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOwoKCQkJfQoKCQkJLy8gdmVydGljZXMKCgkJCWZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdmFyIHZlcnRleCA9IHZlcnRpY2VzMlsgaSBdOwoKCQkJCXZhciB2ZXJ0ZXhDb3B5ID0gdmVydGV4LmNsb25lKCk7CgoJCQkJaWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRleENvcHkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKCgkJCQl2ZXJ0aWNlczEucHVzaCggdmVydGV4Q29weSApOwoKCQkJfQoKCQkJLy8gY29sb3JzCgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29sb3JzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQljb2xvcnMxLnB1c2goIGNvbG9yczJbIGkgXS5jbG9uZSgpICk7CgoJCQl9CgoJCQkvLyBmYWNlcwoKCQkJZm9yICggaSA9IDAsIGlsID0gZmFjZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXZhciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLAoJCQkJCWZhY2VWZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLAoJCQkJCWZhY2VWZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9yczsKCgkJCQlmYWNlQ29weSA9IG5ldyBGYWNlMyggZmFjZS5hICsgdmVydGV4T2Zmc2V0LCBmYWNlLmIgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYyArIHZlcnRleE9mZnNldCApOwoJCQkJZmFjZUNvcHkubm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7CgoJCQkJaWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJZmFjZUNvcHkubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgoJCQkJfQoKCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCgkJCQkJbm9ybWFsID0gZmFjZVZlcnRleE5vcm1hbHNbIGogXS5jbG9uZSgpOwoKCQkJCQlpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJbm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgoJCQkJCX0KCgkJCQkJZmFjZUNvcHkudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTsKCgkJCQl9CgoJCQkJZmFjZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApOwoKCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Q29sb3JzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKCQkJCQljb2xvciA9IGZhY2VWZXJ0ZXhDb2xvcnNbIGogXTsKCQkJCQlmYWNlQ29weS52ZXJ0ZXhDb2xvcnMucHVzaCggY29sb3IuY2xvbmUoKSApOwoKCQkJCX0KCgkJCQlmYWNlQ29weS5tYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNldDsKCgkJCQlmYWNlczEucHVzaCggZmFjZUNvcHkgKTsKCgkJCX0KCgkJCS8vIHV2cwoKCQkJZm9yICggaSA9IDAsIGlsID0gdXZzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl2YXIgdXYgPSB1dnMyWyBpIF0sIHV2Q29weSA9IFtdOwoKCQkJCWlmICggdXYgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJY29udGludWU7CgoJCQkJfQoKCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSB1di5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCgkJCQkJdXZDb3B5LnB1c2goIHV2WyBqIF0uY2xvbmUoKSApOwoKCQkJCX0KCgkJCQl1dnMxLnB1c2goIHV2Q29weSApOwoKCQkJfQoKCQl9LAoKCQltZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHsKCgkJCWlmICggISAoIG1lc2ggJiYgbWVzaC5pc01lc2ggKSApIHsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnkubWVyZ2VNZXNoKCk6IG1lc2ggbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk1lc2guJywgbWVzaCApOwoJCQkJcmV0dXJuOwoKCQkJfQoKCQkJbWVzaC5tYXRyaXhBdXRvVXBkYXRlICYmIG1lc2gudXBkYXRlTWF0cml4KCk7CgoJCQl0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApOwoKCQl9LAoKCQkvKgoJCSAqIENoZWNrcyBmb3IgZHVwbGljYXRlIHZlcnRpY2VzIHdpdGggaGFzaG1hcC4KCQkgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkCgkJICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC4KCQkgKi8KCgkJbWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHZlcnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9zaXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpCgkJCXZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdOwoKCQkJdmFyIHYsIGtleTsKCQkJdmFyIHByZWNpc2lvblBvaW50cyA9IDQ7IC8vIG51bWJlciBvZiBkZWNpbWFsIHBvaW50cywgZS5nLiA0IGZvciBlcHNpbG9uIG9mIDAuMDAwMQoJCQl2YXIgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTsKCQkJdmFyIGksIGlsLCBmYWNlOwoJCQl2YXIgaW5kaWNlcywgaiwgamw7CgoJCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXYgPSB0aGlzLnZlcnRpY2VzWyBpIF07CgkJCQlrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7CgoJCQkJaWYgKCB2ZXJ0aWNlc01hcFsga2V5IF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJdmVydGljZXNNYXBbIGtleSBdID0gaTsKCQkJCQl1bmlxdWUucHVzaCggdGhpcy52ZXJ0aWNlc1sgaSBdICk7CgkJCQkJY2hhbmdlc1sgaSBdID0gdW5pcXVlLmxlbmd0aCAtIDE7CgoJCQkJfSBlbHNlIHsKCgkJCQkJLy9jb25zb2xlLmxvZygnRHVwbGljYXRlIHZlcnRleCBmb3VuZC4gJywgaSwgJyBjb3VsZCBiZSB1c2luZyAnLCB2ZXJ0aWNlc01hcFtrZXldKTsKCQkJCQljaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTsKCgkJCQl9CgoJCQl9CgoKCQkJLy8gaWYgZmFjZXMgYXJlIGNvbXBsZXRlbHkgZGVnZW5lcmF0ZSBhZnRlciBtZXJnaW5nIHZlcnRpY2VzLCB3ZQoJCQkvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LgoJCQl2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdOwoKCQkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQlmYWNlID0gdGhpcy5mYWNlc1sgaSBdOwoKCQkJCWZhY2UuYSA9IGNoYW5nZXNbIGZhY2UuYSBdOwoJCQkJZmFjZS5iID0gY2hhbmdlc1sgZmFjZS5iIF07CgkJCQlmYWNlLmMgPSBjaGFuZ2VzWyBmYWNlLmMgXTsKCgkJCQlpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07CgoJCQkJLy8gaWYgYW55IGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhcmUgZm91bmQgaW4gYSBGYWNlMwoJCQkJLy8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWQKCQkJCWZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7CgoJCQkJCWlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7CgoJCQkJCQlmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTsKCQkJCQkJYnJlYWs7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQlmb3IgKCBpID0gZmFjZUluZGljZXNUb1JlbW92ZS5sZW5ndGggLSAxOyBpID49IDA7IGkgLS0gKSB7CgoJCQkJdmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTsKCgkJCQl0aGlzLmZhY2VzLnNwbGljZSggaWR4LCAxICk7CgoJCQkJZm9yICggaiA9IDAsIGpsID0gdGhpcy5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKCQkJCQl0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApOwoKCQkJCX0KCgkJCX0KCgkJCS8vIFVzZSB1bmlxdWUgc2V0IG9mIHZlcnRpY2VzCgoJCQl2YXIgZGlmZiA9IHRoaXMudmVydGljZXMubGVuZ3RoIC0gdW5pcXVlLmxlbmd0aDsKCQkJdGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTsKCQkJcmV0dXJuIGRpZmY7CgoJCX0sCgoJCXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkgewoKCQkJdGhpcy52ZXJ0aWNlcyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIHBvaW50ID0gcG9pbnRzWyBpIF07CgkJCQl0aGlzLnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGZhY2VzID0gdGhpcy5mYWNlczsKCQkJdmFyIGxlbmd0aCA9IGZhY2VzLmxlbmd0aDsKCgkJCS8vIHRhZyBmYWNlcwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkgewoKCQkJCWZhY2VzWyBpIF0uX2lkID0gaTsKCgkJCX0KCgkJCS8vIHNvcnQgZmFjZXMKCgkJCWZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkgewoKCQkJCXJldHVybiBhLm1hdGVyaWFsSW5kZXggLSBiLm1hdGVyaWFsSW5kZXg7CgoJCQl9CgoJCQlmYWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApOwoKCQkJLy8gc29ydCB1dnMKCgkJCXZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07CgkJCXZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07CgoJCQl2YXIgbmV3VXZzMSwgbmV3VXZzMjsKCgkJCWlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdOwoJCQlpZiAoIHV2czIgJiYgdXZzMi5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czIgPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKCgkJCQl2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDsKCgkJCQlpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTsKCQkJCWlmICggbmV3VXZzMiApIG5ld1V2czIucHVzaCggdXZzMlsgaWQgXSApOwoKCQkJfQoKCQkJaWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxOwoJCQlpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGRhdGEgPSB7CgkJCQltZXRhZGF0YTogewoJCQkJCXZlcnNpb246IDQuNSwKCQkJCQl0eXBlOiAnR2VvbWV0cnknLAoJCQkJCWdlbmVyYXRvcjogJ0dlb21ldHJ5LnRvSlNPTicKCQkJCX0KCQkJfTsKCgkJCS8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb24KCgkJCWRhdGEudXVpZCA9IHRoaXMudXVpZDsKCQkJZGF0YS50eXBlID0gdGhpcy50eXBlOwoJCQlpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7CgoJCQlpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwoKCQkJCWZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsKCgkJCQkJaWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTsKCgkJCQl9CgoJCQkJcmV0dXJuIGRhdGE7CgoJCQl9CgoJCQl2YXIgdmVydGljZXMgPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkgewoKCQkJCXZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07CgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQl9CgoJCQl2YXIgZmFjZXMgPSBbXTsKCQkJdmFyIG5vcm1hbHMgPSBbXTsKCQkJdmFyIG5vcm1hbHNIYXNoID0ge307CgkJCXZhciBjb2xvcnMgPSBbXTsKCQkJdmFyIGNvbG9yc0hhc2ggPSB7fTsKCQkJdmFyIHV2cyA9IFtdOwoJCQl2YXIgdXZzSGFzaCA9IHt9OwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5mYWNlcy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJdmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07CgoJCQkJdmFyIGhhc01hdGVyaWFsID0gdHJ1ZTsKCQkJCXZhciBoYXNGYWNlVXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZAoJCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDsKCQkJCXZhciBoYXNGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwubGVuZ3RoKCkgPiAwOwoJCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDsKCQkJCXZhciBoYXNGYWNlQ29sb3IgPSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAhPT0gMTsKCQkJCXZhciBoYXNGYWNlVmVydGV4Q29sb3IgPSBmYWNlLnZlcnRleENvbG9ycy5sZW5ndGggPiAwOwoKCQkJCXZhciBmYWNlVHlwZSA9IDA7CgoJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZAoJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApOwoJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTsKCQkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7CgkJCQlmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTsKCQkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApOwoJCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTsKCQkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7CgoJCQkJZmFjZXMucHVzaCggZmFjZVR5cGUgKTsKCQkJCWZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTsKCQkJCWZhY2VzLnB1c2goIGZhY2UubWF0ZXJpYWxJbmRleCApOwoKCQkJCWlmICggaGFzRmFjZVZlcnRleFV2ICkgewoKCQkJCQl2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07CgoJCQkJCWZhY2VzLnB1c2goCgkJCQkJCWdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDAgXSApLAoJCQkJCQlnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSwKCQkJCQkJZ2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdICkKCQkJCQkpOwoKCQkJCX0KCgkJCQlpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7CgoJCQkJCWZhY2VzLnB1c2goIGdldE5vcm1hbEluZGV4KCBmYWNlLm5vcm1hbCApICk7CgoJCQkJfQoKCQkJCWlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKCgkJCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CgoJCQkJCWZhY2VzLnB1c2goCgkJCQkJCWdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSwKCQkJCQkJZ2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLAoJCQkJCQlnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMiBdICkKCQkJCQkpOwoKCQkJCX0KCgkJCQlpZiAoIGhhc0ZhY2VDb2xvciApIHsKCgkJCQkJZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCggZmFjZS5jb2xvciApICk7CgoJCQkJfQoKCQkJCWlmICggaGFzRmFjZVZlcnRleENvbG9yICkgewoKCQkJCQl2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7CgoJCQkJCWZhY2VzLnB1c2goCgkJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksCgkJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMSBdICksCgkJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMiBdICkKCQkJCQkpOwoKCQkJCX0KCgkJCX0KCgkJCWZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkgewoKCQkJCXJldHVybiBlbmFibGVkID8gdmFsdWUgfCAoIDEgPDwgcG9zaXRpb24gKSA6IHZhbHVlICYgKCB+ICggMSA8PCBwb3NpdGlvbiApICk7CgoJCQl9CgoJCQlmdW5jdGlvbiBnZXROb3JtYWxJbmRleCggbm9ybWFsICkgewoKCQkJCXZhciBoYXNoID0gbm9ybWFsLngudG9TdHJpbmcoKSArIG5vcm1hbC55LnRvU3RyaW5nKCkgKyBub3JtYWwuei50b1N0cmluZygpOwoKCQkJCWlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTsKCgkJCQl9CgoJCQkJbm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMzsKCQkJCW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOwoKCQkJCXJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdOwoKCQkJfQoKCQkJZnVuY3Rpb24gZ2V0Q29sb3JJbmRleCggY29sb3IgKSB7CgoJCQkJdmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7CgoJCQkJaWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJcmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTsKCgkJCQl9CgoJCQkJY29sb3JzSGFzaFsgaGFzaCBdID0gY29sb3JzLmxlbmd0aDsKCQkJCWNvbG9ycy5wdXNoKCBjb2xvci5nZXRIZXgoKSApOwoKCQkJCXJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07CgoJCQl9CgoJCQlmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHsKCgkJCQl2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2LnkudG9TdHJpbmcoKTsKCgkJCQlpZiAoIHV2c0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlyZXR1cm4gdXZzSGFzaFsgaGFzaCBdOwoKCQkJCX0KCgkJCQl1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjsKCQkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7CgoJCQkJcmV0dXJuIHV2c0hhc2hbIGhhc2ggXTsKCgkJCX0KCgkJCWRhdGEuZGF0YSA9IHt9OwoKCQkJZGF0YS5kYXRhLnZlcnRpY2VzID0gdmVydGljZXM7CgkJCWRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFsczsKCQkJaWYgKCBjb2xvcnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS5jb2xvcnMgPSBjb2xvcnM7CgkJCWlmICggdXZzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEudXZzID0gWyB1dnMgXTsgLy8gdGVtcG9yYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eQoJCQlkYXRhLmRhdGEuZmFjZXMgPSBmYWNlczsKCgkJCXJldHVybiBkYXRhOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJLyoKCQkJIC8vIEhhbmRsZSBwcmltaXRpdmVzCgoJCQkgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CgoJCQkgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkgdmFyIHZhbHVlcyA9IFtdOwoKCQkJIGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsKCgkJCSB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTsKCgkJCSB9CgoJCQkgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTsKCQkJIHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTsKCQkJIHJldHVybiBnZW9tZXRyeTsKCgkJCSB9CgoJCQkgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoJCQkgKi8KCgkJCXJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJdmFyIGksIGlsLCBqLCBqbCwgaywga2w7CgoJCQkvLyByZXNldAoKCQkJdGhpcy52ZXJ0aWNlcyA9IFtdOwoJCQl0aGlzLmNvbG9ycyA9IFtdOwoJCQl0aGlzLmZhY2VzID0gW107CgkJCXRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07CgkJCXRoaXMubW9ycGhUYXJnZXRzID0gW107CgkJCXRoaXMubW9ycGhOb3JtYWxzID0gW107CgkJCXRoaXMuc2tpbldlaWdodHMgPSBbXTsKCQkJdGhpcy5za2luSW5kaWNlcyA9IFtdOwoJCQl0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTsKCQkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CgkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwoKCQkJLy8gbmFtZQoKCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CgoJCQkvLyB2ZXJ0aWNlcwoKCQkJdmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzOwoKCQkJZm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTsKCgkJCX0KCgkJCS8vIGNvbG9ycwoKCQkJdmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7CgoJCQlmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdGhpcy5jb2xvcnMucHVzaCggY29sb3JzWyBpIF0uY2xvbmUoKSApOwoKCQkJfQoKCQkJLy8gZmFjZXMKCgkJCXZhciBmYWNlcyA9IHNvdXJjZS5mYWNlczsKCgkJCWZvciAoIGkgPSAwLCBpbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7CgoJCQl9CgoJCQkvLyBmYWNlIHZlcnRleCB1dnMKCgkJCWZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXZhciBmYWNlVmVydGV4VXZzID0gc291cmNlLmZhY2VWZXJ0ZXhVdnNbIGkgXTsKCgkJCQlpZiAoIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCXRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107CgoJCQkJfQoKCQkJCWZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgoJCQkJCXZhciB1dnMgPSBmYWNlVmVydGV4VXZzWyBqIF0sIHV2c0NvcHkgPSBbXTsKCgkJCQkJZm9yICggayA9IDAsIGtsID0gdXZzLmxlbmd0aDsgayA8IGtsOyBrICsrICkgewoKCQkJCQkJdmFyIHV2ID0gdXZzWyBrIF07CgoJCQkJCQl1dnNDb3B5LnB1c2goIHV2LmNsb25lKCkgKTsKCgkJCQkJfQoKCQkJCQl0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXS5wdXNoKCB1dnNDb3B5ICk7CgoJCQkJfQoKCQkJfQoKCQkJLy8gbW9ycGggdGFyZ2V0cwoKCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgoJCQlmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdmFyIG1vcnBoVGFyZ2V0ID0ge307CgkJCQltb3JwaFRhcmdldC5uYW1lID0gbW9ycGhUYXJnZXRzWyBpIF0ubmFtZTsKCgkJCQkvLyB2ZXJ0aWNlcwoKCQkJCWlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJbW9ycGhUYXJnZXQudmVydGljZXMgPSBbXTsKCgkJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgoJCQkJCQltb3JwaFRhcmdldC52ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQkvLyBub3JtYWxzCgoJCQkJaWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCW1vcnBoVGFyZ2V0Lm5vcm1hbHMgPSBbXTsKCgkJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCgkJCQkJCW1vcnBoVGFyZ2V0Lm5vcm1hbHMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFsc1sgaiBdLmNsb25lKCkgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQl0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApOwoKCQkJfQoKCQkJLy8gbW9ycGggbm9ybWFscwoKCQkJdmFyIG1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7CgoJCQlmb3IgKCBpID0gMCwgaWwgPSBtb3JwaE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdmFyIG1vcnBoTm9ybWFsID0ge307CgoJCQkJLy8gdmVydGV4IG5vcm1hbHMKCgkJCQlpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJbW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscyA9IFtdOwoKCQkJCQlmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKCQkJCQkJdmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTsKCQkJCQkJdmFyIGRlc3RWZXJ0ZXhOb3JtYWwgPSB7fTsKCgkJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYSA9IHNyY1ZlcnRleE5vcm1hbC5hLmNsb25lKCk7CgkJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYiA9IHNyY1ZlcnRleE5vcm1hbC5iLmNsb25lKCk7CgkJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7CgoJCQkJCQltb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQkvLyBmYWNlIG5vcm1hbHMKCgkJCQlpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCW1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107CgoJCQkJCWZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKCQkJCQkJbW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7CgoJCQkJCX0KCgkJCQl9CgoJCQkJdGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTsKCgkJCX0KCgkJCS8vIHNraW4gd2VpZ2h0cwoKCQkJdmFyIHNraW5XZWlnaHRzID0gc291cmNlLnNraW5XZWlnaHRzOwoKCQkJZm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgaSBdLmNsb25lKCkgKTsKCgkJCX0KCgkJCS8vIHNraW4gaW5kaWNlcwoKCQkJdmFyIHNraW5JbmRpY2VzID0gc291cmNlLnNraW5JbmRpY2VzOwoKCQkJZm9yICggaSA9IDAsIGlsID0gc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTsKCgkJCX0KCgkJCS8vIGxpbmUgZGlzdGFuY2VzCgoJCQl2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzOwoKCQkJZm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNlc1sgaSBdICk7CgoJCQl9CgoJCQkvLyBib3VuZGluZyBib3gKCgkJCXZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDsKCgkJCWlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CgoJCQkJdGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7CgoJCQl9CgoJCQkvLyBib3VuZGluZyBzcGhlcmUKCgkJCXZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTsKCgkJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgoJCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CgoJCQl9CgoJCQkvLyB1cGRhdGUgZmxhZ3MKCgkJCXRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTsKCQkJdGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBzb3VyY2UudmVydGljZXNOZWVkVXBkYXRlOwoJCQl0aGlzLnV2c05lZWRVcGRhdGUgPSBzb3VyY2UudXZzTmVlZFVwZGF0ZTsKCQkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTsKCQkJdGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gc291cmNlLmNvbG9yc05lZWRVcGRhdGU7CgkJCXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBzb3VyY2UubGluZURpc3RhbmNlc05lZWRVcGRhdGU7CgkJCXRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKCQlpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7CgoJCQl0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7CgoJCX0KCgkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgkJdGhpcy5uYW1lID0gJyc7CgoJCXRoaXMuYXJyYXkgPSBhcnJheTsKCQl0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7CgkJdGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6IDA7CgkJdGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTsKCgkJdGhpcy5keW5hbWljID0gZmFsc2U7CgkJdGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07CgoJCXRoaXMub25VcGxvYWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9OwoKCQl0aGlzLnZlcnNpb24gPSAwOwoKCX0KCglPYmplY3QuZGVmaW5lUHJvcGVydHkoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKzsKCgkJfQoKCX0gKTsKCglPYmplY3QuYXNzaWduKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7CgoJCWlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLAoKCQlzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHsKCgkJCWlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHsKCgkJCQl0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7CgoJCQl9CgoJCQl0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuaXRlbVNpemUgOiAwOwoJCQl0aGlzLmFycmF5ID0gYXJyYXk7CgoJCX0sCgoJCXNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLmR5bmFtaWMgPSB2YWx1ZTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCXRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTsKCQkJdGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTsKCQkJdGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDsKCQkJdGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7CgoJCQl0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHsKCgkJCWluZGV4MSAqPSB0aGlzLml0ZW1TaXplOwoJCQlpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkgewoKCQkJdGhpcy5hcnJheS5zZXQoIGFycmF5ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNvbG9ycyApIHsKCgkJCXZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgY29sb3IgPSBjb2xvcnNbIGkgXTsKCgkJCQlpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApOwoJCQkJCWNvbG9yID0gbmV3IENvbG9yKCk7CgoJCQkJfQoKCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7CgkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nOwoJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuYjsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljb3B5SW5kaWNlc0FycmF5OiBmdW5jdGlvbiAoIGluZGljZXMgKSB7CgoJCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciBpbmRleCA9IGluZGljZXNbIGkgXTsKCgkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5hOwoJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gaW5kZXguYjsKCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IGluZGV4LmM7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJY29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHsKCgkJCXZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTsKCgkJCQlpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTsKCQkJCQl2ZWN0b3IgPSBuZXcgVmVjdG9yMigpOwoKCQkJCX0KCgkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDsKCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55OwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7CgoJCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CgoJCQkJaWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7CgkJCQkJdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKCgkJCQl9CgoJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7CgkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56OwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7CgoJCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CgoJCQkJaWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7CgkJCQkJdmVjdG9yID0gbmV3IFZlY3RvcjQoKTsKCgkJCQl9CgoJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7CgkJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKCQkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56OwoJCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnc7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7CgoJCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCgkJCXRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZ2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCXJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTsKCgkJfSwKCgkJc2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHsKCgkJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkgewoKCQkJcmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXTsKCgkJfSwKCgkJc2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHsKCgkJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZ2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCXJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF07CgoJCX0sCgoJCXNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7CgoJCQl0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gPSB6OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7CgoJCQlyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdOwoKCQl9LAoKCQlzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkgewoKCQkJdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHsKCgkJCWluZGV4ICo9IHRoaXMuaXRlbVNpemU7CgoJCQl0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CgkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7CgoJCQlpbmRleCAqPSB0aGlzLml0ZW1TaXplOwoKCQkJdGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4OwoJCQl0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CgkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkgewoKCQkJaW5kZXggKj0gdGhpcy5pdGVtU2l6ZTsKCgkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKCQkJdGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5OwoJCQl0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7CgkJCXRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdzsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCgkJCXRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7CgoJCX0KCgl9ICk7CgoJLy8KCglmdW5jdGlvbiBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgoJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKCX0KCglJbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKCUludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTsKCgoJZnVuY3Rpb24gVWludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHsKCgkJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKCX0KCglVaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CglVaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0ZTsKCgoJZnVuY3Rpb24gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgoJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7CgoJfQoKCVVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CglVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlOwoKCglmdW5jdGlvbiBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKCQlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7CgoJfQoKCUludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKCUludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDE2QnVmZmVyQXR0cmlidXRlOwoKCglmdW5jdGlvbiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHsKCgkJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTsKCgl9CgoJVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKCVVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7CgoKCWZ1bmN0aW9uIEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgoJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTsKCgl9CgoJSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOwoJSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7CgoKCWZ1bmN0aW9uIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKCQlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKCX0KCglVaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOwoJVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTsKCgoJZnVuY3Rpb24gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKCQlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTsKCgl9CgoJRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CglGbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7CgoKCWZ1bmN0aW9uIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHsKCgkJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7CgoJfQoKCUZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOwoJRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIERpcmVjdEdlb21ldHJ5KCkgewoKCQl0aGlzLmluZGljZXMgPSBbXTsKCQl0aGlzLnZlcnRpY2VzID0gW107CgkJdGhpcy5ub3JtYWxzID0gW107CgkJdGhpcy5jb2xvcnMgPSBbXTsKCQl0aGlzLnV2cyA9IFtdOwoJCXRoaXMudXZzMiA9IFtdOwoKCQl0aGlzLmdyb3VwcyA9IFtdOwoKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9OwoKCQl0aGlzLnNraW5XZWlnaHRzID0gW107CgkJdGhpcy5za2luSW5kaWNlcyA9IFtdOwoKCQkvLyB0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTsKCgkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CgkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7CgoJCS8vIHVwZGF0ZSBmbGFncwoKCQl0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlOwoJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTsKCQl0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTsKCQl0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKCQl0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7CgoJCWNvbXB1dGVHcm91cHM6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CgoJCQl2YXIgZ3JvdXA7CgkJCXZhciBncm91cHMgPSBbXTsKCQkJdmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7CgoJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHsKCgkJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgoJCQkJLy8gbWF0ZXJpYWxzCgoJCQkJaWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7CgoJCQkJCW1hdGVyaWFsSW5kZXggPSBmYWNlLm1hdGVyaWFsSW5kZXg7CgoJCQkJCWlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCWdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7CgkJCQkJCWdyb3Vwcy5wdXNoKCBncm91cCApOwoKCQkJCQl9CgoJCQkJCWdyb3VwID0gewoJCQkJCQlzdGFydDogaSAqIDMsCgkJCQkJCW1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXgKCQkJCQl9OwoKCQkJCX0KCgkJCX0KCgkJCWlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHsKCgkJCQlncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0OwoJCQkJZ3JvdXBzLnB1c2goIGdyb3VwICk7CgoJCQl9CgoJCQl0aGlzLmdyb3VwcyA9IGdyb3VwczsKCgkJfSwKCgkJZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkgewoKCQkJdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CgkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwoJCQl2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnM7CgoJCQl2YXIgaGFzRmFjZVZlcnRleFV2ID0gZmFjZVZlcnRleFV2c1sgMCBdICYmIGZhY2VWZXJ0ZXhVdnNbIDAgXS5sZW5ndGggPiAwOwoJCQl2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDsKCgkJCS8vIG1vcnBocwoKCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKCQkJdmFyIG1vcnBoVGFyZ2V0c0xlbmd0aCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7CgoJCQl2YXIgbW9ycGhUYXJnZXRzUG9zaXRpb247CgoJCQlpZiAoIG1vcnBoVGFyZ2V0c0xlbmd0aCA+IDAgKSB7CgoJCQkJbW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaFRhcmdldHNMZW5ndGg7IGkgKysgKSB7CgoJCQkJCW1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTsKCgkJCQl9CgoJCQkJdGhpcy5tb3JwaFRhcmdldHMucG9zaXRpb24gPSBtb3JwaFRhcmdldHNQb3NpdGlvbjsKCgkJCX0KCgkJCXZhciBtb3JwaE5vcm1hbHMgPSBnZW9tZXRyeS5tb3JwaE5vcm1hbHM7CgkJCXZhciBtb3JwaE5vcm1hbHNMZW5ndGggPSBtb3JwaE5vcm1hbHMubGVuZ3RoOwoKCQkJdmFyIG1vcnBoVGFyZ2V0c05vcm1hbDsKCgkJCWlmICggbW9ycGhOb3JtYWxzTGVuZ3RoID4gMCApIHsKCgkJCQltb3JwaFRhcmdldHNOb3JtYWwgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7CgoJCQkJCW1vcnBoVGFyZ2V0c05vcm1hbFsgaSBdID0gW107CgoJCQkJfQoKCQkJCXRoaXMubW9ycGhUYXJnZXRzLm5vcm1hbCA9IG1vcnBoVGFyZ2V0c05vcm1hbDsKCgkJCX0KCgkJCS8vIHNraW5zCgoJCQl2YXIgc2tpbkluZGljZXMgPSBnZW9tZXRyeS5za2luSW5kaWNlczsKCQkJdmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7CgoJCQl2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDsKCQkJdmFyIGhhc1NraW5XZWlnaHRzID0gc2tpbldlaWdodHMubGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGg7CgoJCQkvLwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkgewoKCQkJCXZhciBmYWNlID0gZmFjZXNbIGkgXTsKCgkJCQl0aGlzLnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBmYWNlLmEgXSwgdmVydGljZXNbIGZhY2UuYiBdLCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKTsKCgkJCQl2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFsczsKCgkJCQlpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkgewoKCQkJCQl0aGlzLm5vcm1hbHMucHVzaCggdmVydGV4Tm9ybWFsc1sgMCBdLCB2ZXJ0ZXhOb3JtYWxzWyAxIF0sIHZlcnRleE5vcm1hbHNbIDIgXSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDsKCgkJCQkJdGhpcy5ub3JtYWxzLnB1c2goIG5vcm1hbCwgbm9ybWFsLCBub3JtYWwgKTsKCgkJCQl9CgoJCQkJdmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzOwoKCQkJCWlmICggdmVydGV4Q29sb3JzLmxlbmd0aCA9PT0gMyApIHsKCgkJCQkJdGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXZhciBjb2xvciA9IGZhY2UuY29sb3I7CgoJCQkJCXRoaXMuY29sb3JzLnB1c2goIGNvbG9yLCBjb2xvciwgY29sb3IgKTsKCgkJCQl9CgoJCQkJaWYgKCBoYXNGYWNlVmVydGV4VXYgPT09IHRydWUgKSB7CgoJCQkJCXZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTsKCgkJCQkJaWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXRoaXMudXZzLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgJywgaSApOwoKCQkJCQkJdGhpcy51dnMucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggaGFzRmFjZVZlcnRleFV2MiA9PT0gdHJ1ZSApIHsKCgkJCQkJdmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDEgXVsgaSBdOwoKCQkJCQlpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJdGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYyICcsIGkgKTsKCgkJCQkJCXRoaXMudXZzMi5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7CgoJCQkJCX0KCgkJCQl9CgoJCQkJLy8gbW9ycGhzCgoJCQkJZm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBqICsrICkgewoKCQkJCQl2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlczsKCgkJCQkJbW9ycGhUYXJnZXRzUG9zaXRpb25bIGogXS5wdXNoKCBtb3JwaFRhcmdldFsgZmFjZS5hIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7CgoJCQkJfQoKCQkJCWZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaiArKyApIHsKCgkJCQkJdmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdOwoKCQkJCQltb3JwaFRhcmdldHNOb3JtYWxbIGogXS5wdXNoKCBtb3JwaE5vcm1hbC5hLCBtb3JwaE5vcm1hbC5iLCBtb3JwaE5vcm1hbC5jICk7CgoJCQkJfQoKCQkJCS8vIHNraW5zCgoJCQkJaWYgKCBoYXNTa2luSW5kaWNlcyApIHsKCgkJCQkJdGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgZmFjZS5hIF0sIHNraW5JbmRpY2VzWyBmYWNlLmIgXSwgc2tpbkluZGljZXNbIGZhY2UuYyBdICk7CgoJCQkJfQoKCQkJCWlmICggaGFzU2tpbldlaWdodHMgKSB7CgoJCQkJCXRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGZhY2UuYSBdLCBza2luV2VpZ2h0c1sgZmFjZS5iIF0sIHNraW5XZWlnaHRzWyBmYWNlLmMgXSApOwoKCQkJCX0KCgkJCX0KCgkJCXRoaXMuY29tcHV0ZUdyb3VwcyggZ2VvbWV0cnkgKTsKCgkJCXRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlOwoJCQl0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7CgkJCXRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7CgkJCXRoaXMudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7CgkJCXRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7CgoJCWlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7CgoJCXZhciBtYXggPSBhcnJheVsgMCBdOwoKCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkgewoKCQkJaWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTsKCgkJfQoKCQlyZXR1cm4gbWF4OwoKCX0KCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJdmFyIGJ1ZmZlckdlb21ldHJ5SWQgPSAxOyAvLyBCdWZmZXJHZW9tZXRyeSB1c2VzIG9kZCBudW1iZXJzIGFzIElkCgoJZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7CgoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogYnVmZmVyR2VvbWV0cnlJZCArPSAyIH0gKTsKCgkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgoJCXRoaXMubmFtZSA9ICcnOwoJCXRoaXMudHlwZSA9ICdCdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMuaW5kZXggPSBudWxsOwoJCXRoaXMuYXR0cmlidXRlcyA9IHt9OwoKCQl0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9OwoKCQl0aGlzLmdyb3VwcyA9IFtdOwoKCQl0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDsKCgkJdGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTsKCgl9CgoJQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBCdWZmZXJHZW9tZXRyeSwKCgkJaXNCdWZmZXJHZW9tZXRyeTogdHJ1ZSwKCgkJZ2V0SW5kZXg6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLmluZGV4OwoKCQl9LAoKCQlzZXRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCWlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSApIHsKCgkJCQl0aGlzLmluZGV4ID0gbmV3ICggYXJyYXlNYXgoIGluZGV4ICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApOwoKCQkJfSBlbHNlIHsKCgkJCQl0aGlzLmluZGV4ID0gaW5kZXg7CgoJCQl9CgoJCX0sCgoJCWFkZEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lLCBhdHRyaWJ1dGUgKSB7CgoJCQlpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkQXR0cmlidXRlKCkgbm93IGV4cGVjdHMgKCBuYW1lLCBhdHRyaWJ1dGUgKS4nICk7CgoJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7CgoJCQkJcmV0dXJuOwoKCQkJfQoKCQkJaWYgKCBuYW1lID09PSAnaW5kZXgnICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZTogVXNlIC5zZXRJbmRleCgpIGZvciBpbmRleCBhdHRyaWJ1dGUuJyApOwoJCQkJdGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7CgoJCQkJcmV0dXJuOwoKCQkJfQoKCQkJdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZ2V0QXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7CgoJCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07CgoJCX0sCgoJCXJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkgewoKCQkJZGVsZXRlIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHsKCgkJCXRoaXMuZ3JvdXBzLnB1c2goIHsKCgkJCQlzdGFydDogc3RhcnQsCgkJCQljb3VudDogY291bnQsCgkJCQltYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMAoKCQkJfSApOwoKCQl9LAoKCQljbGVhckdyb3VwczogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5ncm91cHMgPSBbXTsKCgkJfSwKCgkJc2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHsKCgkJCXRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7CgkJCXRoaXMuZHJhd1JhbmdlLmNvdW50ID0gY291bnQ7CgoJCX0sCgoJCWFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCgkJCXZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCWlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQltYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTsKCQkJCXBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCX0KCgkJCXZhciBub3JtYWwgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsOwoKCQkJaWYgKCBub3JtYWwgIT09IHVuZGVmaW5lZCApIHsKCgkJCQl2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOwoKCQkJCW5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTsKCQkJCW5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQl9CgoJCQlpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CgoJCQkJdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTsKCgkJCX0KCgkJCWlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzCgoJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkgewoKCQkJCW0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7CgoJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJcm90YXRlWTogZnVuY3Rpb24gKCkgewoKCQkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXMKCgkJCXZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7CgoJCQkJbTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTsKCgkJCQl0aGlzLmFwcGx5TWF0cml4KCBtMSApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQlyb3RhdGVaOiBmdW5jdGlvbiAoKSB7CgoJCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpcwoKCQkJdmFyIG0xID0gbmV3IE1hdHJpeDQoKTsKCgkJCXJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHsKCgkJCQltMS5tYWtlUm90YXRpb25aKCBhbmdsZSApOwoKCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG0xICk7CgoJCQkJcmV0dXJuIHRoaXM7CgoJCQl9OwoKCQl9KCksCgoJCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCkgewoKCQkJLy8gdHJhbnNsYXRlIGdlb21ldHJ5CgoJCQl2YXIgbTEgPSBuZXcgTWF0cml4NCgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHsKCgkJCQltMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTsKCgkJCQl0aGlzLmFwcGx5TWF0cml4KCBtMSApOwoKCQkJCXJldHVybiB0aGlzOwoKCQkJfTsKCgkJfSgpLAoKCQlzY2FsZTogZnVuY3Rpb24gKCkgewoKCQkJLy8gc2NhbGUgZ2VvbWV0cnkKCgkJCXZhciBtMSA9IG5ldyBNYXRyaXg0KCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7CgoJCQkJbTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7CgoJCQkJdGhpcy5hcHBseU1hdHJpeCggbTEgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJbG9va0F0OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7CgoJCQkJb2JqLmxvb2tBdCggdmVjdG9yICk7CgoJCQkJb2JqLnVwZGF0ZU1hdHJpeCgpOwoKCQkJCXRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTsKCgkJCX07CgoJCX0oKSwKCgkJY2VudGVyOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOwoKCQkJdmFyIG9mZnNldCA9IHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCkubmVnYXRlKCk7CgoJCQl0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApOwoKCQkJcmV0dXJuIG9mZnNldDsKCgkJfSwKCgkJc2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgoJCQkvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnNldEZyb21PYmplY3QoKS4gQ29udmVydGluZycsIG9iamVjdCwgdGhpcyApOwoKCQkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwoKCQkJaWYgKCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0LmlzTGluZSApIHsKCgkJCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTsKCQkJCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTsKCgkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7CgkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgY29sb3JzLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTsKCgkJCQlpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgJiYgZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGggPT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApIHsKCgkJCQkJdmFyIGxpbmVEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGgsIDEgKTsKCgkJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7CgoJCQkJfQoKCQkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgoJCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOwoKCQkJCX0KCgkJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKCQkJCQl0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKCgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkgewoKCQkJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCgkJCQkJdGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkgewoKCQkJdmFyIHBvc2l0aW9uID0gW107CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTsKCQkJCXBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApOwoKCQkJfQoKCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdXBkYXRlRnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgoJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CgoJCQlpZiAoIG9iamVjdC5pc01lc2ggKSB7CgoJCQkJdmFyIGRpcmVjdCA9IGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnk7CgoJCQkJaWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7CgoJCQkJCWRpcmVjdCA9IHVuZGVmaW5lZDsKCQkJCQlnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTsKCgkJCQl9CgoJCQkJaWYgKCBkaXJlY3QgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJcmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApOwoKCQkJCX0KCgkJCQlkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlOwoJCQkJZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7CgkJCQlkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7CgkJCQlkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7CgkJCQlkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7CgoJCQkJZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CgkJCQlnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlOwoJCQkJZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOwoJCQkJZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZSA9IGZhbHNlOwoJCQkJZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlOwoKCQkJCWdlb21ldHJ5ID0gZGlyZWN0OwoKCQkJfQoKCQkJdmFyIGF0dHJpYnV0ZTsKCgkJCWlmICggZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID09PSB0cnVlICkgewoKCQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7CgkJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9CgoJCQkJZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CgoJCQl9CgoJCQlpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkgewoKCQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CgoJCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICk7CgkJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9CgoJCQkJZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHsKCgkJCQlhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMuY29sb3I7CgoJCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJYXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICk7CgkJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9CgoJCQkJZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOwoKCQkJfQoKCQkJaWYgKCBnZW9tZXRyeS51dnNOZWVkVXBkYXRlICkgewoKCQkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djsKCgkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApOwoJCQkJCWF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJfQoKCQkJCWdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7CgoJCQkJYXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZTsKCgkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlhdHRyaWJ1dGUuY29weUFycmF5KCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICk7CgkJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9CgoJCQkJZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSApIHsKCgkJCQlnZW9tZXRyeS5jb21wdXRlR3JvdXBzKCBvYmplY3QuZ2VvbWV0cnkgKTsKCQkJCXRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKCQkJCWdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CgoJCQlnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ID0gbmV3IERpcmVjdEdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApOwoKCQkJcmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KCBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ICk7CgoJCX0sCgoJCWZyb21EaXJlY3RHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKCgkJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzICk7CgkJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApOwoKCQkJaWYgKCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCA+IDAgKSB7CgoJCQkJdmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCAqIDMgKTsKCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICkgKTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCA+IDAgKSB7CgoJCQkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7CgkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApOwoKCQkJfQoKCQkJaWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHsKCgkJCQl2YXIgdXZzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzLmxlbmd0aCAqIDIgKTsKCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICkgKTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkudXZzMi5sZW5ndGggPiAwICkgewoKCQkJCXZhciB1dnMyID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzMi5sZW5ndGggKiAyICk7CgkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2MicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2czIsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzMiApICk7CgoJCQl9CgoJCQlpZiAoIGdlb21ldHJ5LmluZGljZXMubGVuZ3RoID4gMCApIHsKCgkJCQl2YXIgVHlwZUFycmF5ID0gYXJyYXlNYXgoIGdlb21ldHJ5LmluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTsKCQkJCXZhciBpbmRpY2VzID0gbmV3IFR5cGVBcnJheSggZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggKiAzICk7CgkJCQl0aGlzLnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkuY29weUluZGljZXNBcnJheSggZ2VvbWV0cnkuaW5kaWNlcyApICk7CgoJCQl9CgoJCQkvLyBncm91cHMKCgkJCXRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKCQkJLy8gbW9ycGhzCgoJCQlmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7CgoJCQkJdmFyIGFycmF5ID0gW107CgkJCQl2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCXZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdOwoKCQkJCQl2YXIgYXR0cmlidXRlID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG1vcnBoVGFyZ2V0Lmxlbmd0aCAqIDMsIDMgKTsKCgkJCQkJYXJyYXkucHVzaCggYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBtb3JwaFRhcmdldCApICk7CgoJCQkJfQoKCQkJCXRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTsKCgkJCX0KCgkJCS8vIHNraW5uaW5nCgoJCQlpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7CgoJCQkJdmFyIHNraW5JbmRpY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCAqIDQsIDQgKTsKCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbkluZGV4Jywgc2tpbkluZGljZXMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5JbmRpY2VzICkgKTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoID4gMCApIHsKCgkJCQl2YXIgc2tpbldlaWdodHMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICogNCwgNCApOwoJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdza2luV2VpZ2h0Jywgc2tpbldlaWdodHMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5XZWlnaHRzICkgKTsKCgkJCX0KCgkJCS8vCgoJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgewoKCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOwoKCQkJfQoKCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHsKCgkJCQl0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTsKCgkJCX0KCgkJCXZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCWlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQl0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7CgoJCQl9IGVsc2UgewoKCQkJCXRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7CgoJCQl9CgoJCQlpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi54ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnkgKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueiApICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7CgoJCQl9CgoJCX0sCgoJCWNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGJveCA9IG5ldyBCb3gzKCk7CgkJCXZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHsKCgkJCQlpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7CgoJCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7CgoJCQkJfQoKCQkJCXZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCQlpZiAoIHBvc2l0aW9uICkgewoKCQkJCQl2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7CgoJCQkJCWJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApOwoJCQkJCWJveC5nZXRDZW50ZXIoIGNlbnRlciApOwoKCQkJCQkvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZQoJCQkJCS8vIGJvdW5kaW5nU3BoZXJlIG9mIHRoZSBib3VuZGluZ0JveDogc3FydCgzKSBzbWFsbGVyIGluIHRoZSBiZXN0IGNhc2UKCgkJCQkJdmFyIG1heFJhZGl1c1NxID0gMDsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJCQl2ZWN0b3IueCA9IHBvc2l0aW9uLmdldFgoIGkgKTsKCQkJCQkJdmVjdG9yLnkgPSBwb3NpdGlvbi5nZXRZKCBpICk7CgkJCQkJCXZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApOwoJCQkJCQltYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB2ZWN0b3IgKSApOwoKCQkJCQl9CgoJCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApOwoKCQkJCQlpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyApICkgewoKCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9OwoKCQl9KCksCgoJCWNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkgewoKCQkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCgkJfSwKCgkJY29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBpbmRleCA9IHRoaXMuaW5kZXg7CgkJCXZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzOwoJCQl2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7CgoJCQlpZiAoIGF0dHJpYnV0ZXMucG9zaXRpb24gKSB7CgoJCQkJdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CgoJCQkJaWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9ucy5sZW5ndGggKSwgMyApICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvCgoJCQkJCXZhciBhcnJheSA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OwoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJCQlhcnJheVsgaSBdID0gMDsKCgkJCQkJfQoKCQkJCX0KCgkJCQl2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OwoKCQkJCXZhciB2QSwgdkIsIHZDOwoJCQkJdmFyIHBBID0gbmV3IFZlY3RvcjMoKSwgcEIgPSBuZXcgVmVjdG9yMygpLCBwQyA9IG5ldyBWZWN0b3IzKCk7CgkJCQl2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7CgoJCQkJLy8gaW5kZXhlZCBlbGVtZW50cwoKCQkJCWlmICggaW5kZXggKSB7CgoJCQkJCXZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7CgoJCQkJCWlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHsKCgkJCQkJCXRoaXMuYWRkR3JvdXAoIDAsIGluZGljZXMubGVuZ3RoICk7CgoJCQkJCX0KCgkJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHsKCgkJCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgaiBdOwoKCQkJCQkJdmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7CgkJCQkJCXZhciBjb3VudCA9IGdyb3VwLmNvdW50OwoKCQkJCQkJZm9yICggdmFyIGkgPSBzdGFydCwgaWwgPSBzdGFydCArIGNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHsKCgkJCQkJCQl2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzOwoJCQkJCQkJdkIgPSBpbmRpY2VzWyBpICsgMSBdICogMzsKCQkJCQkJCXZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7CgoJCQkJCQkJcEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZBICk7CgkJCQkJCQlwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkIgKTsKCQkJCQkJCXBDLmZyb21BcnJheSggcG9zaXRpb25zLCB2QyApOwoKCQkJCQkJCWNiLnN1YlZlY3RvcnMoIHBDLCBwQiApOwoJCQkJCQkJYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7CgkJCQkJCQljYi5jcm9zcyggYWIgKTsKCgkJCQkJCQlub3JtYWxzWyB2QSBdICs9IGNiLng7CgkJCQkJCQlub3JtYWxzWyB2QSArIDEgXSArPSBjYi55OwoJCQkJCQkJbm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejsKCgkJCQkJCQlub3JtYWxzWyB2QiBdICs9IGNiLng7CgkJCQkJCQlub3JtYWxzWyB2QiArIDEgXSArPSBjYi55OwoJCQkJCQkJbm9ybWFsc1sgdkIgKyAyIF0gKz0gY2IuejsKCgkJCQkJCQlub3JtYWxzWyB2QyBdICs9IGNiLng7CgkJCQkJCQlub3JtYWxzWyB2QyArIDEgXSArPSBjYi55OwoJCQkJCQkJbm9ybWFsc1sgdkMgKyAyIF0gKz0gY2IuejsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgoJCQkJCS8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5lY3RlZCB0cmlhbmdsZSBzb3VwKQoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7CgoJCQkJCQlwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApOwoJCQkJCQlwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDMgKTsKCQkJCQkJcEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyA2ICk7CgoJCQkJCQljYi5zdWJWZWN0b3JzKCBwQywgcEIgKTsKCQkJCQkJYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7CgkJCQkJCWNiLmNyb3NzKCBhYiApOwoKCQkJCQkJbm9ybWFsc1sgaSBdID0gY2IueDsKCQkJCQkJbm9ybWFsc1sgaSArIDEgXSA9IGNiLnk7CgkJCQkJCW5vcm1hbHNbIGkgKyAyIF0gPSBjYi56OwoKCQkJCQkJbm9ybWFsc1sgaSArIDMgXSA9IGNiLng7CgkJCQkJCW5vcm1hbHNbIGkgKyA0IF0gPSBjYi55OwoJCQkJCQlub3JtYWxzWyBpICsgNSBdID0gY2IuejsKCgkJCQkJCW5vcm1hbHNbIGkgKyA2IF0gPSBjYi54OwoJCQkJCQlub3JtYWxzWyBpICsgNyBdID0gY2IueTsKCQkJCQkJbm9ybWFsc1sgaSArIDggXSA9IGNiLno7CgoJCQkJCX0KCgkJCQl9CgoJCQkJdGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7CgoJCQkJYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJfQoKCQl9LAoKCQltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkgewoKCQkJaWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKCQkJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CgoJCQlmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7CgoJCQkJaWYgKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7CgoJCQkJdmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTsKCQkJCXZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5OwoKCQkJCXZhciBhdHRyaWJ1dGUyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF07CgkJCQl2YXIgYXR0cmlidXRlQXJyYXkyID0gYXR0cmlidXRlMi5hcnJheTsKCgkJCQl2YXIgYXR0cmlidXRlU2l6ZSA9IGF0dHJpYnV0ZTIuaXRlbVNpemU7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7CgoJCQkJCWF0dHJpYnV0ZUFycmF5MVsgaiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW5vcm1hbGl6ZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIG5vcm1hbGl6ZU5vcm1hbHMoKSB7CgoJCQkJdmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsOwoKCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJCXZlY3Rvci54ID0gbm9ybWFscy5nZXRYKCBpICk7CgkJCQkJdmVjdG9yLnkgPSBub3JtYWxzLmdldFkoIGkgKTsKCQkJCQl2ZWN0b3IueiA9IG5vcm1hbHMuZ2V0WiggaSApOwoKCQkJCQl2ZWN0b3Iubm9ybWFsaXplKCk7CgoJCQkJCW5vcm1hbHMuc2V0WFlaKCBpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7CgoJCQkJfQoKCQkJfTsKCgkJfSgpLAoKCQl0b05vbkluZGV4ZWQ6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4nICk7CgkJCQlyZXR1cm4gdGhpczsKCgkJCX0KCgkJCXZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCgkJCXZhciBpbmRpY2VzID0gdGhpcy5pbmRleC5hcnJheTsKCQkJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CgoJCQlmb3IgKCB2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzICkgewoKCQkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07CgoJCQkJdmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5OwoJCQkJdmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplOwoKCQkJCXZhciBhcnJheTIgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGluZGljZXMubGVuZ3RoICogaXRlbVNpemUgKTsKCgkJCQl2YXIgaW5kZXggPSAwLCBpbmRleDIgPSAwOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJaW5kZXggPSBpbmRpY2VzWyBpIF0gKiBpdGVtU2l6ZTsKCgkJCQkJZm9yICggdmFyIGogPSAwOyBqIDwgaXRlbVNpemU7IGogKysgKSB7CgoJCQkJCQlhcnJheTJbIGluZGV4MiArKyBdID0gYXJyYXlbIGluZGV4ICsrIF07CgoJCQkJCX0KCgkJCQl9CgoJCQkJZ2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSApICk7CgoJCQl9CgoJCQlyZXR1cm4gZ2VvbWV0cnkyOwoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBkYXRhID0gewoJCQkJbWV0YWRhdGE6IHsKCQkJCQl2ZXJzaW9uOiA0LjUsCgkJCQkJdHlwZTogJ0J1ZmZlckdlb21ldHJ5JywKCQkJCQlnZW5lcmF0b3I6ICdCdWZmZXJHZW9tZXRyeS50b0pTT04nCgkJCQl9CgkJCX07CgoJCQkvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uCgoJCQlkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7CgkJCWRhdGEudHlwZSA9IHRoaXMudHlwZTsKCQkJaWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lOwoKCQkJaWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQl2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVyczsKCgkJCQlmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7CgoJCQkJCWlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07CgoJCQkJfQoKCQkJCXJldHVybiBkYXRhOwoKCQkJfQoKCQkJZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9OwoKCQkJdmFyIGluZGV4ID0gdGhpcy5pbmRleDsKCgkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CgoJCQkJdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGluZGV4LmFycmF5ICk7CgoJCQkJZGF0YS5kYXRhLmluZGV4ID0gewoJCQkJCXR5cGU6IGluZGV4LmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsCgkJCQkJYXJyYXk6IGFycmF5CgkJCQl9OwoKCQkJfQoKCQkJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CgoJCQlmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7CgoJCQkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdOwoKCQkJCXZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhdHRyaWJ1dGUuYXJyYXkgKTsKCgkJCQlkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSB7CgkJCQkJaXRlbVNpemU6IGF0dHJpYnV0ZS5pdGVtU2l6ZSwKCQkJCQl0eXBlOiBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IubmFtZSwKCQkJCQlhcnJheTogYXJyYXksCgkJCQkJbm9ybWFsaXplZDogYXR0cmlidXRlLm5vcm1hbGl6ZWQKCQkJCX07CgoJCQl9CgoJCQl2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7CgoJCQlpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkgewoKCQkJCWRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTsKCgkJCX0KCgkJCXZhciBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7CgoJCQlpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgewoKCQkJCWRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHsKCQkJCQljZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksCgkJCQkJcmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRpdXMKCQkJCX07CgoJCQl9CgoJCQlyZXR1cm4gZGF0YTsKCgkJfSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCS8qCgkJCSAvLyBIYW5kbGUgcHJpbWl0aXZlcwoKCQkJIHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwoKCQkJIGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgewoKCQkJIHZhciB2YWx1ZXMgPSBbXTsKCgkJCSBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7CgoJCQkgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7CgoJCQkgfQoKCQkJIHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7CgkJCSB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7CgkJCSByZXR1cm4gZ2VvbWV0cnk7CgoJCQkgfQoKCQkJIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCQkJICovCgoJCQlyZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuY29weSggdGhpcyApOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCXZhciBuYW1lLCBpLCBsOwoKCQkJLy8gcmVzZXQKCgkJCXRoaXMuaW5kZXggPSBudWxsOwoJCQl0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKCQkJdGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTsKCQkJdGhpcy5ncm91cHMgPSBbXTsKCQkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CgkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwoKCQkJLy8gbmFtZQoKCQkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CgoJCQkvLyBpbmRleAoKCQkJdmFyIGluZGV4ID0gc291cmNlLmluZGV4OwoKCQkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7CgoJCQl9CgoJCQkvLyBhdHRyaWJ1dGVzCgoJCQl2YXIgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzOwoKCQkJZm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkgewoKCQkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07CgkJCQl0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlLmNsb25lKCkgKTsKCgkJCX0KCgkJCS8vIG1vcnBoIGF0dHJpYnV0ZXMKCgkJCXZhciBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzOwoKCQkJZm9yICggbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7CgoJCQkJdmFyIGFycmF5ID0gW107CgkJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzCgoJCQkJZm9yICggaSA9IDAsIGwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQlhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTsKCgkJCQl9CgoJCQkJdGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5OwoKCQkJfQoKCQkJLy8gZ3JvdXBzCgoJCQl2YXIgZ3JvdXBzID0gc291cmNlLmdyb3VwczsKCgkJCWZvciAoIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07CgkJCQl0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKCgkJCX0KCgkJCS8vIGJvdW5kaW5nIGJveAoKCQkJdmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94OwoKCQkJaWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTsKCgkJCX0KCgkJCS8vIGJvdW5kaW5nIHNwaGVyZQoKCQkJdmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlOwoKCQkJaWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsKCgkJCX0KCgkJCS8vIGRyYXcgcmFuZ2UKCgkJCXRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc291cmNlLmRyYXdSYW5nZS5zdGFydDsKCQkJdGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBCb3hHZW9tZXRyeQoKCWZ1bmN0aW9uIEJveEdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7CgoJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQl3aWR0aDogd2lkdGgsCgkJCWhlaWdodDogaGVpZ2h0LAoJCQlkZXB0aDogZGVwdGgsCgkJCXdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsCgkJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKCQkJZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50cwoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCUJveEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwoJQm94R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94R2VvbWV0cnk7CgoJLy8gQm94QnVmZmVyR2VvbWV0cnkKCglmdW5jdGlvbiBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgewoKCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdCb3hCdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJd2lkdGg6IHdpZHRoLAoJCQloZWlnaHQ6IGhlaWdodCwKCQkJZGVwdGg6IGRlcHRoLAoJCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAoJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCgkJCWRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHMKCQl9OwoKCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQl3aWR0aCA9IHdpZHRoIHx8IDE7CgkJaGVpZ2h0ID0gaGVpZ2h0IHx8IDE7CgkJZGVwdGggPSBkZXB0aCB8fCAxOwoKCQkvLyBzZWdtZW50cwoKCQl3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7CgkJaGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CgkJZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKSB8fCAxOwoKCQkvLyBidWZmZXJzCgoJCXZhciBpbmRpY2VzID0gW107CgkJdmFyIHZlcnRpY2VzID0gW107CgkJdmFyIG5vcm1hbHMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCS8vIGhlbHBlciB2YXJpYWJsZXMKCgkJdmFyIG51bWJlck9mVmVydGljZXMgPSAwOwoJCXZhciBncm91cFN0YXJ0ID0gMDsKCgkJLy8gYnVpbGQgZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnkKCgkJYnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweAoJCWJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbngKCQlidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweQoJCWJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueQoJCWJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6CgkJYnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56CgoJCS8vIGJ1aWxkIGdlb21ldHJ5CgoJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgoJCWZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7CgoJCQl2YXIgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDsKCQkJdmFyIHNlZ21lbnRIZWlnaHQgPSBoZWlnaHQgLyBncmlkWTsKCgkJCXZhciB3aWR0aEhhbGYgPSB3aWR0aCAvIDI7CgkJCXZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjsKCQkJdmFyIGRlcHRoSGFsZiA9IGRlcHRoIC8gMjsKCgkJCXZhciBncmlkWDEgPSBncmlkWCArIDE7CgkJCXZhciBncmlkWTEgPSBncmlkWSArIDE7CgoJCQl2YXIgdmVydGV4Q291bnRlciA9IDA7CgkJCXZhciBncm91cENvdW50ID0gMDsKCgkJCXZhciBpeCwgaXk7CgoJCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKCgkJCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKCgkJCWZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkgewoKCQkJCXZhciB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0gaGVpZ2h0SGFsZjsKCgkJCQlmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHsKCgkJCQkJdmFyIHggPSBpeCAqIHNlZ21lbnRXaWR0aCAtIHdpZHRoSGFsZjsKCgkJCQkJLy8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnQKCgkJCQkJdmVjdG9yWyB1IF0gPSB4ICogdWRpcjsKCQkJCQl2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyOwoJCQkJCXZlY3RvclsgdyBdID0gZGVwdGhIYWxmOwoKCQkJCQkvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXIKCgkJCQkJdmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOwoKCQkJCQkvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudAoKCQkJCQl2ZWN0b3JbIHUgXSA9IDA7CgkJCQkJdmVjdG9yWyB2IF0gPSAwOwoJCQkJCXZlY3RvclsgdyBdID0gZGVwdGggPiAwID8gMSA6IC0gMTsKCgkJCQkJLy8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyCgoJCQkJCW5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOwoKCQkJCQkvLyB1dnMKCgkJCQkJdXZzLnB1c2goIGl4IC8gZ3JpZFggKTsKCQkJCQl1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7CgoJCQkJCS8vIGNvdW50ZXJzCgoJCQkJCXZlcnRleENvdW50ZXIgKz0gMTsKCgkJCQl9CgoJCQl9CgoJCQkvLyBpbmRpY2VzCgoJCQkvLyAxLiB5b3UgbmVlZCB0aHJlZSBpbmRpY2VzIHRvIGRyYXcgYSBzaW5nbGUgZmFjZQoJCQkvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlcwoJCQkvLyAzLiBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIHNpeCAoMiozKSBpbmRpY2VzIHBlciBzZWdtZW50CgoJCQlmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkgewoKCQkJCWZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7CgoJCQkJCXZhciBhID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogaXk7CgkJCQkJdmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApOwoJCQkJCXZhciBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApOwoJCQkJCXZhciBkID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiBpeTsKCgkJCQkJLy8gZmFjZXMKCgkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CgkJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgoJCQkJCS8vIGluY3JlYXNlIGNvdW50ZXIKCgkJCQkJZ3JvdXBDb3VudCArPSA2OwoKCQkJCX0KCgkJCX0KCgkJCS8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0CgoJCQlzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApOwoKCQkJLy8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzCgoJCQlncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CgoJCQkvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzCgoJCQludW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7CgoJCX0KCgl9CgoJQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CglCb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hCdWZmZXJHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICovCgoJLy8gUGxhbmVHZW9tZXRyeQoKCWZ1bmN0aW9uIFBsYW5lR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdQbGFuZUdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQl3aWR0aDogd2lkdGgsCgkJCWhlaWdodDogaGVpZ2h0LAoJCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAoJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMKCQl9OwoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTsKCgkvLyBQbGFuZUJ1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7CgoJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXdpZHRoOiB3aWR0aCwKCQkJaGVpZ2h0OiBoZWlnaHQsCgkJCXdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsCgkJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cwoJCX07CgoJCXdpZHRoID0gd2lkdGggfHwgMTsKCQloZWlnaHQgPSBoZWlnaHQgfHwgMTsKCgkJdmFyIHdpZHRoX2hhbGYgPSB3aWR0aCAvIDI7CgkJdmFyIGhlaWdodF9oYWxmID0gaGVpZ2h0IC8gMjsKCgkJdmFyIGdyaWRYID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7CgkJdmFyIGdyaWRZID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxOwoKCQl2YXIgZ3JpZFgxID0gZ3JpZFggKyAxOwoJCXZhciBncmlkWTEgPSBncmlkWSArIDE7CgoJCXZhciBzZWdtZW50X3dpZHRoID0gd2lkdGggLyBncmlkWDsKCQl2YXIgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTsKCgkJdmFyIGl4LCBpeTsKCgkJLy8gYnVmZmVycwoKCQl2YXIgaW5kaWNlcyA9IFtdOwoJCXZhciB2ZXJ0aWNlcyA9IFtdOwoJCXZhciBub3JtYWxzID0gW107CgkJdmFyIHV2cyA9IFtdOwoKCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgoJCWZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkgewoKCQkJdmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7CgoJCQlmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHsKCgkJCQl2YXIgeCA9IGl4ICogc2VnbWVudF93aWR0aCAtIHdpZHRoX2hhbGY7CgoJCQkJdmVydGljZXMucHVzaCggeCwgLSB5LCAwICk7CgoJCQkJbm9ybWFscy5wdXNoKCAwLCAwLCAxICk7CgoJCQkJdXZzLnB1c2goIGl4IC8gZ3JpZFggKTsKCQkJCXV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTsKCgkJCX0KCgkJfQoKCQkvLyBpbmRpY2VzCgoJCWZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7CgoJCQlmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkgewoKCQkJCXZhciBhID0gaXggKyBncmlkWDEgKiBpeTsKCQkJCXZhciBiID0gaXggKyBncmlkWDEgKiAoIGl5ICsgMSApOwoJCQkJdmFyIGMgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTsKCQkJCXZhciBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5OwoKCQkJCS8vIGZhY2VzCgoJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CgkJCQlpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKCgkJCX0KCgkJfQoKCQkvLyBidWlsZCBnZW9tZXRyeQoKCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOwoKCX0KCglQbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5OwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKgoJICogcGFyYW1ldGVycyA9IHsKCSAqICBjb2xvcjogPGhleD4sCgkgKiAgb3BhY2l0eTogPGZsb2F0PiwKCSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKgoJICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKgoJICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICoKCSAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgZW52TWFwOiBuZXcgVEhSRUUuVGV4dHVyZUN1YmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLAoJICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LAoJICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKCSAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sCgkgKgoJICogIGRlcHRoVGVzdDogPGJvb2w+LAoJICogIGRlcHRoV3JpdGU6IDxib29sPiwKCSAqCgkgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCgkgKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LAoJICoKCSAqICBza2lubmluZzogPGJvb2w+LAoJICogIG1vcnBoVGFyZ2V0czogPGJvb2w+CgkgKiB9CgkgKi8KCglmdW5jdGlvbiBNZXNoQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCgkJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnOwoKCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZQoKCQl0aGlzLm1hcCA9IG51bGw7CgoJCXRoaXMubGlnaHRNYXAgPSBudWxsOwoJCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7CgoJCXRoaXMuYW9NYXAgPSBudWxsOwoJCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7CgoJCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOwoKCQl0aGlzLmFscGhhTWFwID0gbnVsbDsKCgkJdGhpcy5lbnZNYXAgPSBudWxsOwoJCXRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uOwoJCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CgoJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CgkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwoJCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CgkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CgoJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwoKCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOwoKCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKCX0KCglNZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKCU1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsOwoKCU1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTsKCglNZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKCgkJdGhpcy5tYXAgPSBzb3VyY2UubWFwOwoKCQl0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwoJCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7CgoJCXRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CgkJdGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTsKCgkJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKCgkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCgkJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwoJCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwoJCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CgoJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CgkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKCgkJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgoJCXJldHVybiB0aGlzOwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICoKCSAqIHBhcmFtZXRlcnMgPSB7CgkgKiAgZGVmaW5lczogeyAibGFiZWwiIDogInZhbHVlIiB9LAoJICogIHVuaWZvcm1zOiB7ICJwYXJhbWV0ZXIxIjogeyB2YWx1ZTogMS4wIH0sICJwYXJhbWV0ZXIyIjogeyB2YWx1ZTI6IDIgfSB9LAoJICoKCSAqICBmcmFnbWVudFNoYWRlcjogPHN0cmluZz4sCgkgKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPiwKCSAqCgkgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCgkgKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LAoJICoKCSAqICBsaWdodHM6IDxib29sPiwKCSAqCgkgKiAgc2tpbm5pbmc6IDxib29sPiwKCSAqICBtb3JwaFRhcmdldHM6IDxib29sPiwKCSAqICBtb3JwaE5vcm1hbHM6IDxib29sPgoJICogfQoJICovCgoJZnVuY3Rpb24gU2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJzsKCgkJdGhpcy5kZWZpbmVzID0ge307CgkJdGhpcy51bmlmb3JtcyA9IHt9OwoKCQl0aGlzLnZlcnRleFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0nOwoJCXRoaXMuZnJhZ21lbnRTaGFkZXIgPSAndm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0nOwoKCQl0aGlzLmxpbmV3aWR0aCA9IDE7CgoJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CgkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwoKCQl0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZwoJCXRoaXMubGlnaHRzID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgbGlnaHRzCgkJdGhpcy5jbGlwcGluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMKCgkJdGhpcy5za2lubmluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNraW5uaW5nIGF0dHJpYnV0ZSBzdHJlYW1zCgkJdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCB0YXJnZXRzCgkJdGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzCgoJCXRoaXMuZXh0ZW5zaW9ucyA9IHsKCQkJZGVyaXZhdGl2ZXM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRlcml2YXRpdmVzCgkJCWZyYWdEZXB0aDogZmFsc2UsIC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzCgkJCWRyYXdCdWZmZXJzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkcmF3IGJ1ZmZlcnMKCQkJc2hhZGVyVGV4dHVyZUxPRDogZmFsc2UgLy8gc2V0IHRvIHVzZSBzaGFkZXIgdGV4dHVyZSBMT0QKCQl9OwoKCQkvLyBXaGVuIHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBhdHRyaWJ1dGVzIGJ1dCB0aGUgbWF0ZXJpYWwgZG9lcywKCQkvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRoaXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuCgkJdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gewoJCQknY29sb3InOiBbIDEsIDEsIDEgXSwKCQkJJ3V2JzogWyAwLCAwIF0sCgkJCSd1djInOiBbIDAsIDAgXQoJCX07CgoJCXRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDsKCgkJaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7CgoJCQlpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7CgoJCQl9CgoJCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKCQl9CgoJfQoKCVNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwoJU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZGVyTWF0ZXJpYWw7CgoJU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlOwoKCVNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQl0aGlzLmZyYWdtZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVyOwoJCXRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjsKCgkJdGhpcy51bmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNvdXJjZS51bmlmb3JtcyApOwoKCQl0aGlzLmRlZmluZXMgPSBzb3VyY2UuZGVmaW5lczsKCgkJdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOwoJCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDsKCgkJdGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzOwoJCXRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7CgoJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CgoJCXRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0czsKCQl0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7CgoJCXRoaXMuZXh0ZW5zaW9ucyA9IHNvdXJjZS5leHRlbnNpb25zOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCVNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7CgoJCXZhciBkYXRhID0gTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgoJCWRhdGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zOwoJCWRhdGEudmVydGV4U2hhZGVyID0gdGhpcy52ZXJ0ZXhTaGFkZXI7CgkJZGF0YS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXI7CgoJCXJldHVybiBkYXRhOwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCgkgKi8KCglmdW5jdGlvbiBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICkgewoKCQl0aGlzLm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy5kaXJlY3Rpb24gPSAoIGRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkaXJlY3Rpb24gOiBuZXcgVmVjdG9yMygpOwoKCX0KCglPYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7CgoJCXNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKCgkJCXRoaXMub3JpZ2luLmNvcHkoIG9yaWdpbiApOwoJCQl0aGlzLmRpcmVjdGlvbi5jb3B5KCBkaXJlY3Rpb24gKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIHJheSApIHsKCgkJCXRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTsKCQkJdGhpcy5kaXJlY3Rpb24uY29weSggcmF5LmRpcmVjdGlvbiApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWF0OiBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7CgoJCX0sCgoJCWxvb2tBdDogZnVuY3Rpb24gKCB2ICkgewoKCQkJdGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlyZWNhc3Q6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcmVjYXN0KCB0ICkgewoKCQkJCXRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkgKTsKCgkJCQlyZXR1cm4gdGhpczsKCgkJCX07CgoJCX0oKSwKCgkJY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCQkJcmVzdWx0LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApOwoJCQl2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSByZXN1bHQuZG90KCB0aGlzLmRpcmVjdGlvbiApOwoKCQkJaWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7CgoJCQkJcmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLm9yaWdpbiApOwoKCQkJfQoKCQkJcmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTsKCgkJfSwKCgkJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKCQkJcmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSApOwoKCQl9LAoKCQlkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7CgoJCQkJdmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdjEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApOwoKCQkJCS8vIHBvaW50IGJlaGluZCB0aGUgcmF5CgoJCQkJaWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7CgoJCQkJCXJldHVybiB0aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTsKCgkJCQl9CgoJCQkJdjEuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7CgoJCQkJcmV0dXJuIHYxLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApOwoKCQkJfTsKCgkJfSgpLAoKCQlkaXN0YW5jZVNxVG9TZWdtZW50OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHNlZ0RpciA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHsKCgkJCQkvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlRGlzdFJheVNlZ21lbnQuaAoJCQkJLy8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnQKCQkJCS8vIGRlZmluZWQgYnkgdjAgYW5kIHYxCgkJCQkvLyBJdCBjYW4gYWxzbyBzZXQgdHdvIG9wdGlvbmFsIHRhcmdldHMgOgoJCQkJLy8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5CgkJCQkvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBzZWdtZW50CgoJCQkJc2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKCQkJCXNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTsKCQkJCWRpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIHNlZ0NlbnRlciApOwoKCQkJCXZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41OwoJCQkJdmFyIGEwMSA9IC0gdGhpcy5kaXJlY3Rpb24uZG90KCBzZWdEaXIgKTsKCQkJCXZhciBiMCA9IGRpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApOwoJCQkJdmFyIGIxID0gLSBkaWZmLmRvdCggc2VnRGlyICk7CgkJCQl2YXIgYyA9IGRpZmYubGVuZ3RoU3EoKTsKCQkJCXZhciBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApOwoJCQkJdmFyIHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0OwoKCQkJCWlmICggZGV0ID4gMCApIHsKCgkJCQkJLy8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLgoKCQkJCQlzMCA9IGEwMSAqIGIxIC0gYjA7CgkJCQkJczEgPSBhMDEgKiBiMCAtIGIxOwoJCQkJCWV4dERldCA9IHNlZ0V4dGVudCAqIGRldDsKCgkJCQkJaWYgKCBzMCA+PSAwICkgewoKCQkJCQkJaWYgKCBzMSA+PSAtIGV4dERldCApIHsKCgkJCQkJCQlpZiAoIHMxIDw9IGV4dERldCApIHsKCgkJCQkJCQkJLy8gcmVnaW9uIDAKCQkJCQkJCQkvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuCgoJCQkJCQkJCXZhciBpbnZEZXQgPSAxIC8gZGV0OwoJCQkJCQkJCXMwICo9IGludkRldDsKCQkJCQkJCQlzMSAqPSBpbnZEZXQ7CgkJCQkJCQkJc3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYzsKCgkJCQkJCQl9IGVsc2UgewoKCQkJCQkJCQkvLyByZWdpb24gMQoKCQkJCQkJCQlzMSA9IHNlZ0V4dGVudDsKCQkJCQkJCQlzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7CgkJCQkJCQkJc3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYzsKCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIHJlZ2lvbiA1CgoJCQkJCQkJczEgPSAtIHNlZ0V4dGVudDsKCQkJCQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTsKCQkJCQkJCXNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CgoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlpZiAoIHMxIDw9IC0gZXh0RGV0ICkgewoKCQkJCQkJCS8vIHJlZ2lvbiA0CgoJCQkJCQkJczAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApOwoJCQkJCQkJczEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOwoJCQkJCQkJc3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYzsKCgkJCQkJCX0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHsKCgkJCQkJCQkvLyByZWdpb24gMwoKCQkJCQkJCXMwID0gMDsKCQkJCQkJCXMxID0gTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTsKCQkJCQkJCXNxckRpc3QgPSBzMSAqICggczEgKyAyICogYjEgKSArIGM7CgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIHJlZ2lvbiAyCgoJCQkJCQkJczAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTsKCQkJCQkJCXMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7CgkJCQkJCQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC4KCgkJCQkJczEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50OwoJCQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTsKCQkJCQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOwoKCQkJCX0KCgkJCQlpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHsKCgkJCQkJb3B0aW9uYWxQb2ludE9uUmF5LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHMwICkuYWRkKCB0aGlzLm9yaWdpbiApOwoKCQkJCX0KCgkJCQlpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7CgoJCQkJCW9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVsdGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTsKCgkJCQl9CgoJCQkJcmV0dXJuIHNxckRpc3Q7CgoJCQl9OwoKCQl9KCksCgoJCWludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQkJdjEuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTsKCQkJCXZhciB0Y2EgPSB2MS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CgkJCQl2YXIgZDIgPSB2MS5kb3QoIHYxICkgLSB0Y2EgKiB0Y2E7CgkJCQl2YXIgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzOwoKCQkJCWlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7CgoJCQkJdmFyIHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7CgoJCQkJLy8gdDAgPSBmaXJzdCBpbnRlcnNlY3QgcG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmUKCQkJCXZhciB0MCA9IHRjYSAtIHRoYzsKCgkJCQkvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlCgkJCQl2YXIgdDEgPSB0Y2EgKyB0aGM7CgoJCQkJLy8gdGVzdCB0byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsCgkJCQlpZiAoIHQwIDwgMCAmJiB0MSA8IDAgKSByZXR1cm4gbnVsbDsKCgkJCQkvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheToKCQkJCS8vIGlmIGl0IGlzLCB0aGUgcmF5IGlzIGluc2lkZSB0aGUgc3BoZXJlLCBzbyByZXR1cm4gdGhlIHNlY29uZCBleGl0IHBvaW50IHNjYWxlZCBieSB0MSwKCQkJCS8vIGluIG9yZGVyIHRvIGFsd2F5cyByZXR1cm4gYW4gaW50ZXJzZWN0IHBvaW50IHRoYXQgaXMgaW4gZnJvbnQgb2YgdGhlIHJheS4KCQkJCWlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCBvcHRpb25hbFRhcmdldCApOwoKCQkJCS8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwCgkJCQlyZXR1cm4gdGhpcy5hdCggdDAsIG9wdGlvbmFsVGFyZ2V0ICk7CgoJCQl9OwoKCQl9KCksCgoJCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKCQkJcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1czsKCgkJfSwKCgkJZGlzdGFuY2VUb1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKCQkJdmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKCgkJCWlmICggZGVub21pbmF0b3IgPT09IDAgKSB7CgoJCQkJLy8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpbgoJCQkJaWYgKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICkgPT09IDAgKSB7CgoJCQkJCXJldHVybiAwOwoKCQkJCX0KCgkJCQkvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkCgoJCQkJcmV0dXJuIG51bGw7CgoJCQl9CgoJCQl2YXIgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yOwoKCQkJLy8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmUKCgkJCXJldHVybiB0ID49IDAgPyB0IDogbnVsbDsKCgkJfSwKCgkJaW50ZXJzZWN0UGxhbmU6IGZ1bmN0aW9uICggcGxhbmUsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTsKCgkJCWlmICggdCA9PT0gbnVsbCApIHsKCgkJCQlyZXR1cm4gbnVsbDsKCgkJCX0KCgkJCXJldHVybiB0aGlzLmF0KCB0LCBvcHRpb25hbFRhcmdldCApOwoKCQl9LAoKCQlpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7CgoJCQkvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0CgoJCQl2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7CgoJCQlpZiAoIGRpc3RUb1BvaW50ID09PSAwICkgewoKCQkJCXJldHVybiB0cnVlOwoKCQkJfQoKCQkJdmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKCgkJCWlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7CgoJCQkJcmV0dXJuIHRydWU7CgoJCQl9CgoJCQkvLyByYXkgb3JpZ2luIGlzIGJlaGluZCB0aGUgcGxhbmUgKGFuZCBpcyBwb2ludGluZyBiZWhpbmQgaXQpCgoJCQlyZXR1cm4gZmFsc2U7CgoJCX0sCgoJCWludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4OwoKCQkJdmFyIGludmRpcnggPSAxIC8gdGhpcy5kaXJlY3Rpb24ueCwKCQkJCWludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSwKCQkJCWludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejsKCgkJCXZhciBvcmlnaW4gPSB0aGlzLm9yaWdpbjsKCgkJCWlmICggaW52ZGlyeCA+PSAwICkgewoKCQkJCXRtaW4gPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4OwoJCQkJdG1heCA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7CgoJCQl9IGVsc2UgewoKCQkJCXRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4OwoJCQkJdG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7CgoJCQl9CgoJCQlpZiAoIGludmRpcnkgPj0gMCApIHsKCgkJCQl0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CgkJCQl0eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CgoJCQl9IGVsc2UgewoKCQkJCXR5bWluID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTsKCQkJCXR5bWF4ID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTsKCgkJCX0KCgkJCWlmICggKCB0bWluID4gdHltYXggKSB8fCAoIHR5bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7CgoJCQkvLyBUaGVzZSBsaW5lcyBhbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0bWluIG9yIHRtYXggaXMgTmFOCgkJCS8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1cm5zIHRydWUgaWYgeCBpcyBOYU4KCgkJCWlmICggdHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHltaW47CgoJCQlpZiAoIHR5bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR5bWF4OwoKCQkJaWYgKCBpbnZkaXJ6ID49IDAgKSB7CgoJCQkJdHptaW4gPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OwoJCQkJdHptYXggPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OwoKCQkJfSBlbHNlIHsKCgkJCQl0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7CgkJCQl0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7CgoJCQl9CgoJCQlpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsOwoKCQkJaWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjsKCgkJCWlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7CgoJCQkvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpCgoJCQlpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7CgoJCQlyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIG9wdGlvbmFsVGFyZ2V0ICk7CgoJCX0sCgoJCWludGVyc2VjdHNCb3g6ICggZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHsKCgkJCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsOwoKCQkJfTsKCgkJfSApKCksCgoJCWludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBDb21wdXRlIHRoZSBvZmZzZXQgb3JpZ2luLCBlZGdlcywgYW5kIG5vcm1hbC4KCQkJdmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgZWRnZTEgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgZWRnZTIgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQkvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaAoKCQkJCWVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTsKCQkJCWVkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTsKCQkJCW5vcm1hbC5jcm9zc1ZlY3RvcnMoIGVkZ2UxLCBlZGdlMiApOwoKCQkJCS8vIFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUyIChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0aW9uLAoJCQkJLy8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieQoJCQkJLy8gICB8RG90KEQsTil8KmIxID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoUSxFMikpCgkJCQkvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhFMSxRKSkKCQkJCS8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pCgkJCQl2YXIgRGROID0gdGhpcy5kaXJlY3Rpb24uZG90KCBub3JtYWwgKTsKCQkJCXZhciBzaWduOwoKCQkJCWlmICggRGROID4gMCApIHsKCgkJCQkJaWYgKCBiYWNrZmFjZUN1bGxpbmcgKSByZXR1cm4gbnVsbDsKCQkJCQlzaWduID0gMTsKCgkJCQl9IGVsc2UgaWYgKCBEZE4gPCAwICkgewoKCQkJCQlzaWduID0gLSAxOwoJCQkJCURkTiA9IC0gRGROOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXJldHVybiBudWxsOwoKCQkJCX0KCgkJCQlkaWZmLnN1YlZlY3RvcnMoIHRoaXMub3JpZ2luLCBhICk7CgkJCQl2YXIgRGRReEUyID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTIuY3Jvc3NWZWN0b3JzKCBkaWZmLCBlZGdlMiApICk7CgoJCQkJLy8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb24KCQkJCWlmICggRGRReEUyIDwgMCApIHsKCgkJCQkJcmV0dXJuIG51bGw7CgoJCQkJfQoKCQkJCXZhciBEZEUxeFEgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMS5jcm9zcyggZGlmZiApICk7CgoJCQkJLy8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb24KCQkJCWlmICggRGRFMXhRIDwgMCApIHsKCgkJCQkJcmV0dXJuIG51bGw7CgoJCQkJfQoKCQkJCS8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uCgkJCQlpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHsKCgkJCQkJcmV0dXJuIG51bGw7CgoJCQkJfQoKCQkJCS8vIExpbmUgaW50ZXJzZWN0cyB0cmlhbmdsZSwgY2hlY2sgaWYgcmF5IGRvZXMuCgkJCQl2YXIgUWROID0gLSBzaWduICogZGlmZi5kb3QoIG5vcm1hbCApOwoKCQkJCS8vIHQgPCAwLCBubyBpbnRlcnNlY3Rpb24KCQkJCWlmICggUWROIDwgMCApIHsKCgkJCQkJcmV0dXJuIG51bGw7CgoJCQkJfQoKCQkJCS8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLgoJCQkJcmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgb3B0aW9uYWxUYXJnZXQgKTsKCgkJCX07CgoJCX0oKSwKCgkJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7CgoJCQl0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTsKCQkJdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXg0ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIHJheSApIHsKCgkJCXJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KCSAqLwoKCWZ1bmN0aW9uIExpbmUzKCBzdGFydCwgZW5kICkgewoKCQl0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy5lbmQgPSAoIGVuZCAhPT0gdW5kZWZpbmVkICkgPyBlbmQgOiBuZXcgVmVjdG9yMygpOwoKCX0KCglPYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIHN0YXJ0LCBlbmQgKSB7CgoJCQl0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7CgkJCXRoaXMuZW5kLmNvcHkoIGVuZCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggbGluZSApIHsKCgkJCXRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApOwoJCQl0aGlzLmVuZC5jb3B5KCBsaW5lLmVuZCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoJCQlyZXR1cm4gcmVzdWx0LmFkZFZlY3RvcnMoIHRoaXMuc3RhcnQsIHRoaXMuZW5kICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKCQl9LAoKCQlkZWx0YTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoJCQlyZXR1cm4gcmVzdWx0LnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7CgoJCX0sCgoJCWRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApOwoKCQl9LAoKCQlkaXN0YW5jZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyggdGhpcy5lbmQgKTsKCgkJfSwKCgkJYXQ6IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiB0aGlzLmRlbHRhKCByZXN1bHQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApOwoKCQl9LAoKCQljbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgc3RhcnRQID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHN0YXJ0RW5kID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKSB7CgoJCQkJc3RhcnRQLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLnN0YXJ0ICk7CgkJCQlzdGFydEVuZC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApOwoKCQkJCXZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7CgkJCQl2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTsKCgkJCQl2YXIgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjsKCgkJCQlpZiAoIGNsYW1wVG9MaW5lICkgewoKCQkJCQl0ID0gX01hdGguY2xhbXAoIHQsIDAsIDEgKTsKCgkJCQl9CgoJCQkJcmV0dXJuIHQ7CgoJCQl9OwoKCQl9KCksCgoJCWNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGNsYW1wVG9MaW5lLCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIHRoaXMuZGVsdGEoIHJlc3VsdCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7CgoJCX0sCgoJCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7CgoJCQl0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7CgkJCXRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7CgoJCQlyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gVHJpYW5nbGUoIGEsIGIsIGMgKSB7CgoJCXRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTsKCQl0aGlzLmIgPSAoIGIgIT09IHVuZGVmaW5lZCApID8gYiA6IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpOwoKCX0KCglPYmplY3QuYXNzaWduKCBUcmlhbmdsZSwgewoKCQlub3JtYWw6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MCA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gbm9ybWFsKCBhLCBiLCBjLCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJCQlyZXN1bHQuc3ViVmVjdG9ycyggYywgYiApOwoJCQkJdjAuc3ViVmVjdG9ycyggYSwgYiApOwoJCQkJcmVzdWx0LmNyb3NzKCB2MCApOwoKCQkJCXZhciByZXN1bHRMZW5ndGhTcSA9IHJlc3VsdC5sZW5ndGhTcSgpOwoJCQkJaWYgKCByZXN1bHRMZW5ndGhTcSA+IDAgKSB7CgoJCQkJCXJldHVybiByZXN1bHQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHJlc3VsdExlbmd0aFNxICkgKTsKCgkJCQl9CgoJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIDAgKTsKCgkJCX07CgoJCX0oKSwKCgkJLy8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMKCQkvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbAoJCWJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYwID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHYyID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBiYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBhLCBiLCBjLCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQl2MC5zdWJWZWN0b3JzKCBjLCBhICk7CgkJCQl2MS5zdWJWZWN0b3JzKCBiLCBhICk7CgkJCQl2Mi5zdWJWZWN0b3JzKCBwb2ludCwgYSApOwoKCQkJCXZhciBkb3QwMCA9IHYwLmRvdCggdjAgKTsKCQkJCXZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTsKCQkJCXZhciBkb3QwMiA9IHYwLmRvdCggdjIgKTsKCQkJCXZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTsKCQkJCXZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTsKCgkJCQl2YXIgZGVub20gPSAoIGRvdDAwICogZG90MTEgLSBkb3QwMSAqIGRvdDAxICk7CgoJCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgoJCQkJLy8gY29sbGluZWFyIG9yIHNpbmd1bGFyIHRyaWFuZ2xlCgkJCQlpZiAoIGRlbm9tID09PSAwICkgewoKCQkJCQkvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT8KCQkJCQkvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBiZXN0IGlkZWEsIG1heWJlIHNob3VsZCBiZSByZXR1cm5pbmcgdW5kZWZpbmVkCgkJCQkJcmV0dXJuIHJlc3VsdC5zZXQoIC0gMiwgLSAxLCAtIDEgKTsKCgkJCQl9CgoJCQkJdmFyIGludkRlbm9tID0gMSAvIGRlbm9tOwoJCQkJdmFyIHUgPSAoIGRvdDExICogZG90MDIgLSBkb3QwMSAqIGRvdDEyICkgKiBpbnZEZW5vbTsKCQkJCXZhciB2ID0gKCBkb3QwMCAqIGRvdDEyIC0gZG90MDEgKiBkb3QwMiApICogaW52RGVub207CgoJCQkJLy8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDEKCQkJCXJldHVybiByZXN1bHQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTsKCgkJCX07CgoJCX0oKSwKCgkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHsKCgkJCQl2YXIgcmVzdWx0ID0gVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50KCBwb2ludCwgYSwgYiwgYywgdjEgKTsKCgkJCQlyZXR1cm4gKCByZXN1bHQueCA+PSAwICkgJiYgKCByZXN1bHQueSA+PSAwICkgJiYgKCAoIHJlc3VsdC54ICsgcmVzdWx0LnkgKSA8PSAxICk7CgoJCQl9OwoKCQl9KCkKCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90eXBlLCB7CgoJCXNldDogZnVuY3Rpb24gKCBhLCBiLCBjICkgewoKCQkJdGhpcy5hLmNvcHkoIGEgKTsKCQkJdGhpcy5iLmNvcHkoIGIgKTsKCQkJdGhpcy5jLmNvcHkoIGMgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7CgoJCQl0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7CgkJCXRoaXMuYi5jb3B5KCBwb2ludHNbIGkxIF0gKTsKCQkJdGhpcy5jLmNvcHkoIHBvaW50c1sgaTIgXSApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7CgoJCQl0aGlzLmEuY29weSggdHJpYW5nbGUuYSApOwoJCQl0aGlzLmIuY29weSggdHJpYW5nbGUuYiApOwoJCQl0aGlzLmMuY29weSggdHJpYW5nbGUuYyApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWFyZWE6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MCA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gYXJlYSgpIHsKCgkJCQl2MC5zdWJWZWN0b3JzKCB0aGlzLmMsIHRoaXMuYiApOwoJCQkJdjEuc3ViVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKTsKCgkJCQlyZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVuZ3RoKCkgKiAwLjU7CgoJCQl9OwoKCQl9KCksCgoJCW1pZHBvaW50OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJdmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgkJCXJldHVybiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKS5hZGQoIHRoaXMuYyApLm11bHRpcGx5U2NhbGFyKCAxIC8gMyApOwoKCQl9LAoKCQlub3JtYWw6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQlyZXR1cm4gVHJpYW5nbGUubm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCApOwoKCQl9LAoKCQlwbGFuZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCXZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUGxhbmUoKTsKCgkJCXJldHVybiByZXN1bHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7CgoJCX0sCgoJCWJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQlyZXR1cm4gVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgb3B0aW9uYWxUYXJnZXQgKTsKCgkJfSwKCgkJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCgkJCXJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApOwoKCQl9LAoKCQljbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgcGxhbmUgPSBuZXcgUGxhbmUoKTsKCQkJdmFyIGVkZ2VMaXN0ID0gWyBuZXcgTGluZTMoKSwgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpIF07CgkJCXZhciBwcm9qZWN0ZWRQb2ludCA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHsKCgkJCQl2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCQkJCXZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5OwoKCQkJCS8vIHByb2plY3QgdGhlIHBvaW50IG9udG8gdGhlIHBsYW5lIG9mIHRoZSB0cmlhbmdsZQoKCQkJCXBsYW5lLnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApOwoJCQkJcGxhbmUucHJvamVjdFBvaW50KCBwb2ludCwgcHJvamVjdGVkUG9pbnQgKTsKCgkJCQkvLyBjaGVjayBpZiB0aGUgcHJvamVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUKCgkJCQlpZiAoIHRoaXMuY29udGFpbnNQb2ludCggcHJvamVjdGVkUG9pbnQgKSA9PT0gdHJ1ZSApIHsKCgkJCQkJLy8gaWYgc28sIHRoaXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnQKCgkJCQkJcmVzdWx0LmNvcHkoIHByb2plY3RlZFBvaW50ICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gaWYgbm90LCB0aGUgcG9pbnQgZmFsbHMgb3V0c2lkZSB0aGUgdHJpYW5nbGUuIHRoZSByZXN1bHQgaXMgdGhlIGNsb3Nlc3QgcG9pbnQgdG8gdGhlIHRyaWFuZ2xlJ3MgZWRnZXMgb3IgdmVydGljZXMKCgkJCQkJZWRnZUxpc3RbIDAgXS5zZXQoIHRoaXMuYSwgdGhpcy5iICk7CgkJCQkJZWRnZUxpc3RbIDEgXS5zZXQoIHRoaXMuYiwgdGhpcy5jICk7CgkJCQkJZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7CgoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGVkZ2VMaXN0Lmxlbmd0aDsgaSArKyApIHsKCgkJCQkJCWVkZ2VMaXN0WyBpIF0uY2xvc2VzdFBvaW50VG9Qb2ludCggcHJvamVjdGVkUG9pbnQsIHRydWUsIGNsb3Nlc3RQb2ludCApOwoKCQkJCQkJdmFyIGRpc3RhbmNlID0gcHJvamVjdGVkUG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIGNsb3Nlc3RQb2ludCApOwoKCQkJCQkJaWYgKCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlICkgewoKCQkJCQkJCW1pbkRpc3RhbmNlID0gZGlzdGFuY2U7CgoJCQkJCQkJcmVzdWx0LmNvcHkoIGNsb3Nlc3RQb2ludCApOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCXJldHVybiByZXN1bHQ7CgoJCQl9OwoKCQl9KCksCgoJCWVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHsKCgkJCXJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTWVzaCc7CgoJCXRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCQl0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApOwoKCQl0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7CgoJCXRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7CgoJfQoKCU1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IE1lc2gsCgoJCWlzTWVzaDogdHJ1ZSwKCgkJc2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLmRyYXdNb2RlID0gdmFsdWU7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLmRyYXdNb2RlID0gc291cmNlLmRyYXdNb2RlOwoKCQkJaWYgKCBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7CgoJCQl9CgoJCQlpZiAoIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCApIHsKCgkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwoJCQl2YXIgbSwgbWwsIG5hbWU7CgoJCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgoJCQkJdmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlczsKCQkJCXZhciBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApOwoKCQkJCWlmICgga2V5cy5sZW5ndGggPiAwICkgewoKCQkJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdOwoKCQkJCQlpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOwoJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9OwoKCQkJCQkJZm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7CgoJCQkJCQkJbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTsKCgkJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7CgkJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKCgkJCQlpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkgewoKCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOwoJCQkJCXRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307CgoJCQkJCWZvciAoIG0gPSAwLCBtbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHsKCgkJCQkJCW5hbWUgPSBtb3JwaFRhcmdldHNbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApOwoKCQkJCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApOwoJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJfSwKCgkJcmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CgkJCXZhciByYXkgPSBuZXcgUmF5KCk7CgkJCXZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7CgoJCQl2YXIgdkEgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgdkIgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgdkMgPSBuZXcgVmVjdG9yMygpOwoKCQkJdmFyIHRlbXBBID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHRlbXBDID0gbmV3IFZlY3RvcjMoKTsKCgkJCXZhciB1dkEgPSBuZXcgVmVjdG9yMigpOwoJCQl2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTsKCQkJdmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7CgoJCQl2YXIgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTsKCgkJCXZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTsKCgkJCWZ1bmN0aW9uIHV2SW50ZXJzZWN0aW9uKCBwb2ludCwgcDEsIHAyLCBwMywgdXYxLCB1djIsIHV2MyApIHsKCgkJCQlUcmlhbmdsZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTsKCgkJCQl1djEubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC54ICk7CgkJCQl1djIubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC55ICk7CgkJCQl1djMubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC56ICk7CgoJCQkJdXYxLmFkZCggdXYyICkuYWRkKCB1djMgKTsKCgkJCQlyZXR1cm4gdXYxLmNsb25lKCk7CgoJCQl9CgoJCQlmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkgewoKCQkJCXZhciBpbnRlcnNlY3Q7CgoJCQkJaWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHsKCgkJCQkJaW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQywgcEIsIHBBLCB0cnVlLCBwb2ludCApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCWludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91YmxlU2lkZSwgcG9pbnQgKTsKCgkJCQl9CgoJCQkJaWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDsKCgkJCQlpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkoIHBvaW50ICk7CgkJCQlpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7CgoJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApOwoKCQkJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDsKCgkJCQlyZXR1cm4gewoJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKCQkJCQlwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLAoJCQkJCW9iamVjdDogb2JqZWN0CgkJCQl9OwoKCQkJfQoKCQkJZnVuY3Rpb24gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICkgewoKCQkJCXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7CgkJCQl2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYiApOwoJCQkJdkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGMgKTsKCgkJCQl2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgb2JqZWN0Lm1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgdkEsIHZCLCB2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTsKCgkJCQlpZiAoIGludGVyc2VjdGlvbiApIHsKCgkJCQkJaWYgKCB1diApIHsKCgkJCQkJCXV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApOwoJCQkJCQl1dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGIgKTsKCQkJCQkJdXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBjICk7CgoJCQkJCQlpbnRlcnNlY3Rpb24udXYgPSB1dkludGVyc2VjdGlvbiggaW50ZXJzZWN0aW9uUG9pbnQsIHZBLCB2QiwgdkMsIHV2QSwgdXZCLCB1dkMgKTsKCgkJCQkJfQoKCQkJCQlpbnRlcnNlY3Rpb24uZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgVHJpYW5nbGUubm9ybWFsKCB2QSwgdkIsIHZDICkgKTsKCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gYTsKCgkJCQl9CgoJCQkJcmV0dXJuIGludGVyc2VjdGlvbjsKCgkJCX0KCgkJCXJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7CgoJCQkJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKCQkJCXZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7CgkJCQl2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkOwoKCQkJCWlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCgkJCQkvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXkKCgkJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CgoJCQkJc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7CgkJCQlzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOwoKCQkJCWlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQkJLy8KCgkJCQlpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7CgkJCQlyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApOwoKCQkJCS8vIENoZWNrIGJvdW5kaW5nQm94IGJlZm9yZSBjb250aW51aW5nCgoJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKCgkJCQkJaWYgKCByYXkuaW50ZXJzZWN0c0JveCggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQkJfQoKCQkJCXZhciBpbnRlcnNlY3Rpb247CgoJCQkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgewoKCQkJCQl2YXIgYSwgYiwgYzsKCQkJCQl2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDsKCQkJCQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwoJCQkJCXZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7CgkJCQkJdmFyIGksIGw7CgoJCQkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CgoJCQkJCQkvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeQoKCQkJCQkJZm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHsKCgkJCQkJCQlhID0gaW5kZXguZ2V0WCggaSApOwoJCQkJCQkJYiA9IGluZGV4LmdldFgoIGkgKyAxICk7CgkJCQkJCQljID0gaW5kZXguZ2V0WCggaSArIDIgKTsKCgkJCQkJCQlpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7CgoJCQkJCQkJaWYgKCBpbnRlcnNlY3Rpb24gKSB7CgoJCQkJCQkJCWludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kaWNlcyBidWZmZXIgc2VtYW50aWNzCgkJCQkJCQkJaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTsKCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCX0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnkKCgkJCQkJCWZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQkJYSA9IGk7CgkJCQkJCQliID0gaSArIDE7CgkJCQkJCQljID0gaSArIDI7CgoJCQkJCQkJaW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApOwoKCQkJCQkJCWlmICggaW50ZXJzZWN0aW9uICkgewoKCQkJCQkJCQlpbnRlcnNlY3Rpb24uaW5kZXggPSBhOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gcG9zaXRpb25zIGJ1ZmZlciBzZW1hbnRpY3MKCQkJCQkJCQlpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CgoJCQkJCXZhciBmdkEsIGZ2QiwgZnZDOwoJCQkJCXZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApOwoKCQkJCQl2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlczsKCQkJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKCQkJCQl2YXIgdXZzOwoKCQkJCQl2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTsKCQkJCQlpZiAoIGZhY2VWZXJ0ZXhVdnMubGVuZ3RoID4gMCApIHV2cyA9IGZhY2VWZXJ0ZXhVdnM7CgoJCQkJCWZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCgkJCQkJCXZhciBmYWNlID0gZmFjZXNbIGYgXTsKCQkJCQkJdmFyIGZhY2VNYXRlcmlhbCA9IGlzTXVsdGlNYXRlcmlhbCA/IG1hdGVyaWFsWyBmYWNlLm1hdGVyaWFsSW5kZXggXSA6IG1hdGVyaWFsOwoKCQkJCQkJaWYgKCBmYWNlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlOwoKCQkJCQkJZnZBID0gdmVydGljZXNbIGZhY2UuYSBdOwoJCQkJCQlmdkIgPSB2ZXJ0aWNlc1sgZmFjZS5iIF07CgkJCQkJCWZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTsKCgkJCQkJCWlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHsKCgkJCQkJCQl2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzOwoJCQkJCQkJdmFyIG1vcnBoSW5mbHVlbmNlcyA9IHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzOwoKCQkJCQkJCXZBLnNldCggMCwgMCwgMCApOwoJCQkJCQkJdkIuc2V0KCAwLCAwLCAwICk7CgkJCQkJCQl2Qy5zZXQoIDAsIDAsIDAgKTsKCgkJCQkJCQlmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkgewoKCQkJCQkJCQl2YXIgaW5mbHVlbmNlID0gbW9ycGhJbmZsdWVuY2VzWyB0IF07CgoJCQkJCQkJCWlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7CgoJCQkJCQkJCXZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7CgoJCQkJCQkJCXZBLmFkZFNjYWxlZFZlY3RvciggdGVtcEEuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5hIF0sIGZ2QSApLCBpbmZsdWVuY2UgKTsKCQkJCQkJCQl2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7CgkJCQkJCQkJdkMuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQy5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmMgXSwgZnZDICksIGluZmx1ZW5jZSApOwoKCQkJCQkJCX0KCgkJCQkJCQl2QS5hZGQoIGZ2QSApOwoJCQkJCQkJdkIuYWRkKCBmdkIgKTsKCQkJCQkJCXZDLmFkZCggZnZDICk7CgoJCQkJCQkJZnZBID0gdkE7CgkJCQkJCQlmdkIgPSB2QjsKCQkJCQkJCWZ2QyA9IHZDOwoKCQkJCQkJfQoKCQkJCQkJaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIGZhY2VNYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIGZ2QSwgZnZCLCBmdkMsIGludGVyc2VjdGlvblBvaW50ICk7CgoJCQkJCQlpZiAoIGludGVyc2VjdGlvbiApIHsKCgkJCQkJCQlpZiAoIHV2cyAmJiB1dnNbIGYgXSApIHsKCgkJCQkJCQkJdmFyIHV2c19mID0gdXZzWyBmIF07CgkJCQkJCQkJdXZBLmNvcHkoIHV2c19mWyAwIF0gKTsKCQkJCQkJCQl1dkIuY29weSggdXZzX2ZbIDEgXSApOwoJCQkJCQkJCXV2Qy5jb3B5KCB1dnNfZlsgMiBdICk7CgoJCQkJCQkJCWludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApOwoKCQkJCQkJCX0KCgkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7CgkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gZjsKCQkJCQkJCWludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9OwoKCQl9KCkgKSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJlbmRlcmVyLCBzdGF0ZSwgZ2VvbWV0cmllcywgcHJlbXVsdGlwbGllZEFscGhhICkgewoKCQl2YXIgY2xlYXJDb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTsKCQl2YXIgY2xlYXJBbHBoYSA9IDA7CgoJCXZhciBwbGFuZUNhbWVyYSwgcGxhbmVNZXNoOwoJCXZhciBib3hNZXNoOwoKCQlmdW5jdGlvbiByZW5kZXIoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKSB7CgoJCQl2YXIgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7CgoJCQlpZiAoIGJhY2tncm91bmQgPT09IG51bGwgKSB7CgoJCQkJc2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsKCgkJCX0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkgewoKCQkJCXNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7CgkJCQlmb3JjZUNsZWFyID0gdHJ1ZTsKCgkJCX0KCgkJCWlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7CgoJCQkJcmVuZGVyZXIuY2xlYXIoIHJlbmRlcmVyLmF1dG9DbGVhckNvbG9yLCByZW5kZXJlci5hdXRvQ2xlYXJEZXB0aCwgcmVuZGVyZXIuYXV0b0NsZWFyU3RlbmNpbCApOwoKCQkJfQoKCQkJaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSApIHsKCgkJCQlpZiAoIGJveE1lc2ggPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJYm94TWVzaCA9IG5ldyBNZXNoKAoJCQkJCQluZXcgQm94QnVmZmVyR2VvbWV0cnkoIDEsIDEsIDEgKSwKCQkJCQkJbmV3IFNoYWRlck1hdGVyaWFsKCB7CgkJCQkJCQl1bmlmb3JtczogU2hhZGVyTGliLmN1YmUudW5pZm9ybXMsCgkJCQkJCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5jdWJlLnZlcnRleFNoYWRlciwKCQkJCQkJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS5mcmFnbWVudFNoYWRlciwKCQkJCQkJCXNpZGU6IEJhY2tTaWRlLAoJCQkJCQkJZGVwdGhUZXN0OiB0cnVlLAoJCQkJCQkJZGVwdGhXcml0ZTogZmFsc2UsCgkJCQkJCQlmb2c6IGZhbHNlCgkJCQkJCX0gKQoJCQkJCSk7CgoJCQkJCWJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbm9ybWFsJyApOwoJCQkJCWJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAndXYnICk7CgoJCQkJCWJveE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkgewoKCQkJCQkJdGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOwoKCQkJCQl9OwoKCQkJCQlnZW9tZXRyaWVzLnVwZGF0ZSggYm94TWVzaC5nZW9tZXRyeSApOwoKCQkJCX0KCgkJCQlib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlID0gYmFja2dyb3VuZDsKCgkJCQlyZW5kZXJMaXN0LnB1c2goIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIG51bGwgKTsKCgkJCX0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7CgoJCQkJaWYgKCBwbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQlwbGFuZUNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gMSwgMSwgMSwgLSAxLCAwLCAxICk7CgoJCQkJCXBsYW5lTWVzaCA9IG5ldyBNZXNoKAoJCQkJCQluZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggMiwgMiApLAoJCQkJCQluZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIGZvZzogZmFsc2UgfSApCgkJCQkJKTsKCgkJCQkJZ2VvbWV0cmllcy51cGRhdGUoIHBsYW5lTWVzaC5nZW9tZXRyeSApOwoKCQkJCX0KCgkJCQlwbGFuZU1lc2gubWF0ZXJpYWwubWFwID0gYmFja2dyb3VuZDsKCgkJCQkvLyBUT0RPIFB1c2ggdGhpcyB0byByZW5kZXJMaXN0CgoJCQkJcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBwbGFuZUNhbWVyYSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIHBsYW5lTWVzaCwgbnVsbCApOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7CgoJCQlzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICk7CgoJCX0KCgkJcmV0dXJuIHsKCgkJCWdldENsZWFyQ29sb3I6IGZ1bmN0aW9uICgpIHsKCgkJCQlyZXR1cm4gY2xlYXJDb2xvcjsKCgkJCX0sCgkJCXNldENsZWFyQ29sb3I6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkgewoKCQkJCWNsZWFyQ29sb3Iuc2V0KCBjb2xvciApOwoJCQkJY2xlYXJBbHBoYSA9IGFscGhhICE9PSB1bmRlZmluZWQgPyBhbHBoYSA6IDE7CgkJCQlzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApOwoKCQkJfSwKCQkJZ2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiBjbGVhckFscGhhOwoKCQkJfSwKCQkJc2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCBhbHBoYSApIHsKCgkJCQljbGVhckFscGhhID0gYWxwaGE7CgkJCQlzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApOwoKCQkJfSwKCQkJcmVuZGVyOiByZW5kZXIKCgkJfTsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7CgoJCWlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHsKCgkJCXJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjsKCgkJfSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHsKCgkJCXJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7CgoJCX0gZWxzZSBpZiAoIGEubWF0ZXJpYWwuaWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7CgoJCQlyZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7CgoJCX0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkgewoKCQkJcmV0dXJuIGEueiAtIGIuejsKCgkJfSBlbHNlIHsKCgkJCXJldHVybiBhLmlkIC0gYi5pZDsKCgkJfQoKCX0KCglmdW5jdGlvbiByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7CgoJCWlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHsKCgkJCXJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjsKCgkJfSBpZiAoIGEueiAhPT0gYi56ICkgewoKCQkJcmV0dXJuIGIueiAtIGEuejsKCgkJfSBlbHNlIHsKCgkJCXJldHVybiBhLmlkIC0gYi5pZDsKCgkJfQoKCX0KCglmdW5jdGlvbiBXZWJHTFJlbmRlckxpc3QoKSB7CgoJCXZhciByZW5kZXJJdGVtcyA9IFtdOwoJCXZhciByZW5kZXJJdGVtc0luZGV4ID0gMDsKCgkJdmFyIG9wYXF1ZSA9IFtdOwoJCXZhciB0cmFuc3BhcmVudCA9IFtdOwoKCQlmdW5jdGlvbiBpbml0KCkgewoKCQkJcmVuZGVySXRlbXNJbmRleCA9IDA7CgoJCQlvcGFxdWUubGVuZ3RoID0gMDsKCQkJdHJhbnNwYXJlbnQubGVuZ3RoID0gMDsKCgkJfQoKCQlmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgeiwgZ3JvdXAgKSB7CgoJCQl2YXIgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07CgoJCQlpZiAoIHJlbmRlckl0ZW0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQlyZW5kZXJJdGVtID0gewoJCQkJCWlkOiBvYmplY3QuaWQsCgkJCQkJb2JqZWN0OiBvYmplY3QsCgkJCQkJZ2VvbWV0cnk6IGdlb21ldHJ5LAoJCQkJCW1hdGVyaWFsOiBtYXRlcmlhbCwKCQkJCQlwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtLAoJCQkJCXJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsCgkJCQkJejogeiwKCQkJCQlncm91cDogZ3JvdXAKCQkJCX07CgoJCQkJcmVuZGVySXRlbXNbIHJlbmRlckl0ZW1zSW5kZXggXSA9IHJlbmRlckl0ZW07CgoJCQl9IGVsc2UgewoKCQkJCXJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7CgkJCQlyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDsKCQkJCXJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTsKCQkJCXJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDsKCQkJCXJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07CgkJCQlyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwoJCQkJcmVuZGVySXRlbS56ID0gejsKCQkJCXJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDsKCgkJCX0KCgkJCSggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgPyB0cmFuc3BhcmVudCA6IG9wYXF1ZSApLnB1c2goIHJlbmRlckl0ZW0gKTsKCgkJCXJlbmRlckl0ZW1zSW5kZXggKys7CgoJCX0KCgkJZnVuY3Rpb24gc29ydCgpIHsKCgkJCWlmICggb3BhcXVlLmxlbmd0aCA+IDEgKSBvcGFxdWUuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTsKCQkJaWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7CgoJCX0KCgkJcmV0dXJuIHsKCQkJb3BhcXVlOiBvcGFxdWUsCgkJCXRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCwKCgkJCWluaXQ6IGluaXQsCgkJCXB1c2g6IHB1c2gsCgoJCQlzb3J0OiBzb3J0CgkJfTsKCgl9CgoJZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHsKCgkJdmFyIGxpc3RzID0ge307CgoJCWZ1bmN0aW9uIGdldCggc2NlbmUsIGNhbWVyYSApIHsKCgkJCXZhciBoYXNoID0gc2NlbmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7CgkJCXZhciBsaXN0ID0gbGlzdHNbIGhhc2ggXTsKCgkJCWlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCS8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJMaXN0czonLCBoYXNoICk7CgoJCQkJbGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTsKCQkJCWxpc3RzWyBoYXNoIF0gPSBsaXN0OwoKCQkJfQoKCQkJcmV0dXJuIGxpc3Q7CgoJCX0KCgkJZnVuY3Rpb24gZGlzcG9zZSgpIHsKCgkJCWxpc3RzID0ge307CgoJCX0KCgkJcmV0dXJuIHsKCQkJZ2V0OiBnZXQsCgkJCWRpc3Bvc2U6IGRpc3Bvc2UKCQl9OwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBhYnNOdW1lcmljYWxTb3J0KCBhLCBiICkgewoKCQlyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApOwoKCX0KCglmdW5jdGlvbiBXZWJHTE1vcnBodGFyZ2V0cyggZ2wgKSB7CgoJCXZhciBpbmZsdWVuY2VzTGlzdCA9IHt9OwoJCXZhciBtb3JwaEluZmx1ZW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICk7CgoJCWZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKSB7CgoJCQl2YXIgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CgoJCQl2YXIgbGVuZ3RoID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7CgoJCQl2YXIgaW5mbHVlbmNlcyA9IGluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdOwoKCQkJaWYgKCBpbmZsdWVuY2VzID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gaW5pdGlhbGlzZSBsaXN0CgoJCQkJaW5mbHVlbmNlcyA9IFtdOwoKCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKCgkJCQkJaW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07CgoJCQkJfQoKCQkJCWluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdID0gaW5mbHVlbmNlczsKCgkJCX0KCgkJCXZhciBtb3JwaFRhcmdldHMgPSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uOwoJCQl2YXIgbW9ycGhOb3JtYWxzID0gbWF0ZXJpYWwubW9ycGhOb3JtYWxzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7CgoJCQkvLyBSZW1vdmUgY3VycmVudCBtb3JwaEF0dHJpYnV0ZXMKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKCgkJCQl2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdOwoKCQkJCWlmICggaW5mbHVlbmNlWyAxIF0gIT09IDAgKSB7CgoJCQkJCWlmICggbW9ycGhUYXJnZXRzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApOwoJCQkJCWlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApOwoKCQkJCX0KCgkJCX0KCgkJCS8vIENvbGxlY3QgaW5mbHVlbmNlcwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkgewoKCQkJCXZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07CgoJCQkJaW5mbHVlbmNlWyAwIF0gPSBpOwoJCQkJaW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07CgoJCQl9CgoJCQlpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTsKCgkJCS8vIEFkZCBtb3JwaEF0dHJpYnV0ZXMKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7CgoJCQkJdmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTsKCgkJCQlpZiAoIGluZmx1ZW5jZSApIHsKCgkJCQkJdmFyIGluZGV4ID0gaW5mbHVlbmNlWyAwIF07CgkJCQkJdmFyIHZhbHVlID0gaW5mbHVlbmNlWyAxIF07CgoJCQkJCWlmICggdmFsdWUgKSB7CgoJCQkJCQlpZiAoIG1vcnBoVGFyZ2V0cyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGksIG1vcnBoVGFyZ2V0c1sgaW5kZXggXSApOwoJCQkJCQlpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApOwoKCQkJCQkJbW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTsKCQkJCQkJY29udGludWU7CgoJCQkJCX0KCgkJCQl9CgoJCQkJbW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwOwoKCQkJfQoKCQkJcHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApOwoKCQl9CgoJCXJldHVybiB7CgoJCQl1cGRhdGU6IHVwZGF0ZQoKCQl9OwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm9SZW5kZXIgKSB7CgoJCXZhciBtb2RlOwoKCQlmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHsKCgkJCW1vZGUgPSB2YWx1ZTsKCgkJfQoKCQl2YXIgdHlwZSwgYnl0ZXNQZXJFbGVtZW50OwoKCQlmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7CgoJCQl0eXBlID0gdmFsdWUudHlwZTsKCQkJYnl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50OwoKCQl9CgoJCWZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkgewoKCQkJZ2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTsKCgkJCWluZm9SZW5kZXIuY2FsbHMgKys7CgkJCWluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQ7CgoJCQlpZiAoIG1vZGUgPT09IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gY291bnQgLyAzOwoJCQllbHNlIGlmICggbW9kZSA9PT0gZ2wuUE9JTlRTICkgaW5mb1JlbmRlci5wb2ludHMgKz0gY291bnQ7CgoJCX0KCgkJZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkgewoKCQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKCgkJCWlmICggZXh0ZW5zaW9uID09PSBudWxsICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApOwoJCQkJcmV0dXJuOwoKCQkJfQoKCQkJZXh0ZW5zaW9uLmRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CgoJCQlpbmZvUmVuZGVyLmNhbGxzICsrOwoJCQlpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50ICogZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQ7CgoJCQlpZiAoIG1vZGUgPT09IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKiBjb3VudCAvIDM7CgkJCWVsc2UgaWYgKCBtb2RlID09PSBnbC5QT0lOVFMgKSBpbmZvUmVuZGVyLnBvaW50cyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNvdW50OwoKCQl9CgoJCS8vCgoJCXRoaXMuc2V0TW9kZSA9IHNldE1vZGU7CgkJdGhpcy5zZXRJbmRleCA9IHNldEluZGV4OwoJCXRoaXMucmVuZGVyID0gcmVuZGVyOwoJCXRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzOwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mb1JlbmRlciApIHsKCgkJdmFyIG1vZGU7CgoJCWZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkgewoKCQkJbW9kZSA9IHZhbHVlOwoKCQl9CgoJCWZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkgewoKCQkJZ2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7CgoJCQlpbmZvUmVuZGVyLmNhbGxzICsrOwoJCQlpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50OwoKCQkJaWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZhY2VzICs9IGNvdW50IC8gMzsKCQkJZWxzZSBpZiAoIG1vZGUgPT09IGdsLlBPSU5UUyApIGluZm9SZW5kZXIucG9pbnRzICs9IGNvdW50OwoKCQl9CgoJCWZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHsKCgkJCXZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7CgoJCQlpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApOwoJCQkJcmV0dXJuOwoKCQkJfQoKCQkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCWlmICggcG9zaXRpb24uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHsKCgkJCQljb3VudCA9IHBvc2l0aW9uLmRhdGEuY291bnQ7CgoJCQkJZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7CgoJCQl9IGVsc2UgewoKCQkJCWV4dGVuc2lvbi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIHN0YXJ0LCBjb3VudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTsKCgkJCX0KCgkJCWluZm9SZW5kZXIuY2FsbHMgKys7CgkJCWluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQgKiBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudDsKCgkJCWlmICggbW9kZSA9PT0gZ2wuVFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNvdW50IC8gMzsKCQkJZWxzZSBpZiAoIG1vZGUgPT09IGdsLlBPSU5UUyApIGluZm9SZW5kZXIucG9pbnRzICs9IGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICogY291bnQ7CgoJCX0KCgkJLy8KCgkJdGhpcy5zZXRNb2RlID0gc2V0TW9kZTsKCQl0aGlzLnJlbmRlciA9IHJlbmRlcjsKCQl0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlczsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mb01lbW9yeSApIHsKCgkJdmFyIGdlb21ldHJpZXMgPSB7fTsKCQl2YXIgd2lyZWZyYW1lQXR0cmlidXRlcyA9IHt9OwoKCQlmdW5jdGlvbiBvbkdlb21ldHJ5RGlzcG9zZSggZXZlbnQgKSB7CgoJCQl2YXIgZ2VvbWV0cnkgPSBldmVudC50YXJnZXQ7CgkJCXZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07CgoJCQlpZiAoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkgewoKCQkJCWF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5pbmRleCApOwoKCQkJfQoKCQkJZm9yICggdmFyIG5hbWUgaW4gYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlcyApIHsKCgkJCQlhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7CgoJCQl9CgoJCQlnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7CgoJCQlkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTsKCgkJCS8vIFRPRE8gUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlCgoJCQl2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTsKCgkJCWlmICggYXR0cmlidXRlICkgewoKCQkJCWF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTsKCQkJCWRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdOwoKCQkJfQoKCQkJYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2VvbWV0cnkuaWQgXTsKCgkJCWlmICggYXR0cmlidXRlICkgewoKCQkJCWF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTsKCQkJCWRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBidWZmZXJnZW9tZXRyeS5pZCBdOwoKCQkJfQoKCQkJLy8KCgkJCWluZm9NZW1vcnkuZ2VvbWV0cmllcyAtLTsKCgkJfQoKCQlmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7CgoJCQl2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdOwoKCQkJaWYgKCBidWZmZXJnZW9tZXRyeSApIHJldHVybiBidWZmZXJnZW9tZXRyeTsKCgkJCWdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTsKCgkJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQlidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5OwoKCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCgkJCQlpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQlnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tT2JqZWN0KCBvYmplY3QgKTsKCgkJCQl9CgoJCQkJYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnk7CgoJCQl9CgoJCQlnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdID0gYnVmZmVyZ2VvbWV0cnk7CgoJCQlpbmZvTWVtb3J5Lmdlb21ldHJpZXMgKys7CgoJCQlyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7CgoJCX0KCgkJZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHsKCgkJCXZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OwoJCQl2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKCgkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CgoJCQkJYXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApOwoKCQkJfQoKCQkJZm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkgewoKCQkJCWF0dHJpYnV0ZXMudXBkYXRlKCBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXSwgZ2wuQVJSQVlfQlVGRkVSICk7CgoJCQl9CgoJCQkvLyBtb3JwaCB0YXJnZXRzCgoJCQl2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzOwoKCQkJZm9yICggdmFyIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkgewoKCQkJCXZhciBhcnJheSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCWF0dHJpYnV0ZXMudXBkYXRlKCBhcnJheVsgaSBdLCBnbC5BUlJBWV9CVUZGRVIgKTsKCgkJCQl9CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHsKCgkJCXZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdOwoKCQkJaWYgKCBhdHRyaWJ1dGUgKSByZXR1cm4gYXR0cmlidXRlOwoKCQkJdmFyIGluZGljZXMgPSBbXTsKCgkJCXZhciBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CgkJCXZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoKCQkJLy8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApOwoKCQkJaWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkgewoKCQkJCXZhciBhcnJheSA9IGdlb21ldHJ5SW5kZXguYXJyYXk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkgewoKCQkJCQl2YXIgYSA9IGFycmF5WyBpICsgMCBdOwoJCQkJCXZhciBiID0gYXJyYXlbIGkgKyAxIF07CgkJCQkJdmFyIGMgPSBhcnJheVsgaSArIDIgXTsKCgkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQl2YXIgYXJyYXkgPSBnZW9tZXRyeUF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gKCBhcnJheS5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSAzICkgewoKCQkJCQl2YXIgYSA9IGkgKyAwOwoJCQkJCXZhciBiID0gaSArIDE7CgkJCQkJdmFyIGMgPSBpICsgMjsKCgkJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7CgoJCQkJfQoKCQkJfQoKCQkJLy8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApOwoKCQkJYXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTsKCgkJCWF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7CgoJCQl3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlOwoKCQkJcmV0dXJuIGF0dHJpYnV0ZTsKCgkJfQoKCQlyZXR1cm4gewoKCQkJZ2V0OiBnZXQsCgkJCXVwZGF0ZTogdXBkYXRlLAoKCQkJZ2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUKCgkJfTsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHsKCgkJdmFyIGxpZ2h0cyA9IHt9OwoKCQlyZXR1cm4gewoKCQkJZ2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkgewoKCQkJCWlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCXJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07CgoJCQkJfQoKCQkJCXZhciB1bmlmb3JtczsKCgkJCQlzd2l0Y2ggKCBsaWdodC50eXBlICkgewoKCQkJCQljYXNlICdEaXJlY3Rpb25hbExpZ2h0JzoKCQkJCQkJdW5pZm9ybXMgPSB7CgkJCQkJCQlkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksCgkJCQkJCQljb2xvcjogbmV3IENvbG9yKCksCgoJCQkJCQkJc2hhZG93OiBmYWxzZSwKCQkJCQkJCXNoYWRvd0JpYXM6IDAsCgkJCQkJCQlzaGFkb3dSYWRpdXM6IDEsCgkJCQkJCQlzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpCgkJCQkJCX07CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdTcG90TGlnaHQnOgoJCQkJCQl1bmlmb3JtcyA9IHsKCQkJCQkJCXBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLAoJCQkJCQkJZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLAoJCQkJCQkJY29sb3I6IG5ldyBDb2xvcigpLAoJCQkJCQkJZGlzdGFuY2U6IDAsCgkJCQkJCQljb25lQ29zOiAwLAoJCQkJCQkJcGVudW1icmFDb3M6IDAsCgkJCQkJCQlkZWNheTogMCwKCgkJCQkJCQlzaGFkb3c6IGZhbHNlLAoJCQkJCQkJc2hhZG93QmlhczogMCwKCQkJCQkJCXNoYWRvd1JhZGl1czogMSwKCQkJCQkJCXNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCkKCQkJCQkJfTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1BvaW50TGlnaHQnOgoJCQkJCQl1bmlmb3JtcyA9IHsKCQkJCQkJCXBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLAoJCQkJCQkJY29sb3I6IG5ldyBDb2xvcigpLAoJCQkJCQkJZGlzdGFuY2U6IDAsCgkJCQkJCQlkZWNheTogMCwKCgkJCQkJCQlzaGFkb3c6IGZhbHNlLAoJCQkJCQkJc2hhZG93QmlhczogMCwKCQkJCQkJCXNoYWRvd1JhZGl1czogMSwKCQkJCQkJCXNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksCgkJCQkJCQlzaGFkb3dDYW1lcmFOZWFyOiAxLAoJCQkJCQkJc2hhZG93Q2FtZXJhRmFyOiAxMDAwCgkJCQkJCX07CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdIZW1pc3BoZXJlTGlnaHQnOgoJCQkJCQl1bmlmb3JtcyA9IHsKCQkJCQkJCWRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSwKCQkJCQkJCXNreUNvbG9yOiBuZXcgQ29sb3IoKSwKCQkJCQkJCWdyb3VuZENvbG9yOiBuZXcgQ29sb3IoKQoJCQkJCQl9OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnUmVjdEFyZWFMaWdodCc6CgkJCQkJCXVuaWZvcm1zID0gewoJCQkJCQkJY29sb3I6IG5ldyBDb2xvcigpLAoJCQkJCQkJcG9zaXRpb246IG5ldyBWZWN0b3IzKCksCgkJCQkJCQloYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksCgkJCQkJCQloYWxmSGVpZ2h0OiBuZXcgVmVjdG9yMygpCgkJCQkJCQkvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zCgkJCQkJCX07CgkJCQkJCWJyZWFrOwoKCQkJCX0KCgkJCQlsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtczsKCgkJCQlyZXR1cm4gdW5pZm9ybXM7CgoJCQl9CgoJCX07CgoJfQoKCWZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkgewoKCQl2YXIgY2FjaGUgPSBuZXcgVW5pZm9ybXNDYWNoZSgpOwoKCQl2YXIgc3RhdGUgPSB7CgoJCQloYXNoOiAnJywKCgkJCWFtYmllbnQ6IFsgMCwgMCwgMCBdLAoJCQlkaXJlY3Rpb25hbDogW10sCgkJCWRpcmVjdGlvbmFsU2hhZG93TWFwOiBbXSwKCQkJZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLAoJCQlzcG90OiBbXSwKCQkJc3BvdFNoYWRvd01hcDogW10sCgkJCXNwb3RTaGFkb3dNYXRyaXg6IFtdLAoJCQlyZWN0QXJlYTogW10sCgkJCXBvaW50OiBbXSwKCQkJcG9pbnRTaGFkb3dNYXA6IFtdLAoJCQlwb2ludFNoYWRvd01hdHJpeDogW10sCgkJCWhlbWk6IFtdCgoJCX07CgoJCXZhciB2ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTsKCQl2YXIgbWF0cml4NCA9IG5ldyBNYXRyaXg0KCk7CgkJdmFyIG1hdHJpeDQyID0gbmV3IE1hdHJpeDQoKTsKCgkJZnVuY3Rpb24gc2V0dXAoIGxpZ2h0cywgc2hhZG93cywgY2FtZXJhICkgewoKCQkJdmFyIHIgPSAwLCBnID0gMCwgYiA9IDA7CgoJCQl2YXIgZGlyZWN0aW9uYWxMZW5ndGggPSAwOwoJCQl2YXIgcG9pbnRMZW5ndGggPSAwOwoJCQl2YXIgc3BvdExlbmd0aCA9IDA7CgkJCXZhciByZWN0QXJlYUxlbmd0aCA9IDA7CgkJCXZhciBoZW1pTGVuZ3RoID0gMDsKCgkJCXZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciBsaWdodCA9IGxpZ2h0c1sgaSBdOwoKCQkJCXZhciBjb2xvciA9IGxpZ2h0LmNvbG9yOwoJCQkJdmFyIGludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTsKCQkJCXZhciBkaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlOwoKCQkJCXZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsOwoKCQkJCWlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7CgoJCQkJCXIgKz0gY29sb3IuciAqIGludGVuc2l0eTsKCQkJCQlnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7CgkJCQkJYiArPSBjb2xvci5iICogaW50ZW5zaXR5OwoKCQkJCX0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHsKCgkJCQkJdmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApOwoKCQkJCQl1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTsKCQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApOwoJCQkJCXZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTsKCQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7CgkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApOwoKCQkJCQl1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93OwoKCQkJCQlpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CgoJCQkJCQl2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93OwoKCQkJCQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOwoJCQkJCQl1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzOwoJCQkJCQl1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CgoJCQkJCX0KCgkJCQkJc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7CgkJCQkJc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4OwoJCQkJCXN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7CgoJCQkJCWRpcmVjdGlvbmFsTGVuZ3RoICsrOwoKCQkJCX0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkgewoKCQkJCQl2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7CgoJCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKCQkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTsKCgkJCQkJdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7CgkJCQkJdW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKCgkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKCQkJCQl2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CgkJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApOwoJCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKCgkJCQkJdW5pZm9ybXMuY29uZUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSApOwoJCQkJCXVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApOwoJCQkJCXVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7CgoJCQkJCXVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7CgoJCQkJCWlmICggbGlnaHQuY2FzdFNoYWRvdyApIHsKCgkJCQkJCXZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7CgoJCQkJCQl1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7CgkJCQkJCXVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7CgkJCQkJCXVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTsKCgkJCQkJfQoKCQkJCQlzdGF0ZS5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7CgkJCQkJc3RhdGUuc3BvdFNoYWRvd01hdHJpeFsgc3BvdExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKCQkJCQlzdGF0ZS5zcG90WyBzcG90TGVuZ3RoIF0gPSB1bmlmb3JtczsKCgkJCQkJc3BvdExlbmd0aCArKzsKCgkJCQl9IGVsc2UgaWYgKCBsaWdodC5pc1JlY3RBcmVhTGlnaHQgKSB7CgoJCQkJCXZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTsKCgkJCQkJLy8gKGEpIGludGVuc2l0eSBjb250cm9scyBpcnJhZGlhbmNlIG9mIGVudGlyZSBsaWdodAoJCQkJCXVuaWZvcm1zLmNvbG9yCgkJCQkJCS5jb3B5KCBjb2xvciApCgkJCQkJCS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCApICk7CgoJCQkJCS8vIChiKSBpbnRlbnNpdHkgY29udHJvbHMgdGhlIHJhZGlhbmNlIHBlciBsaWdodCBhcmVhCgkJCQkJLy8gdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7CgoJCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKCQkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTsKCgkJCQkJLy8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9ycwoJCQkJCW1hdHJpeDQyLmlkZW50aXR5KCk7CgkJCQkJbWF0cml4NC5jb3B5KCBsaWdodC5tYXRyaXhXb3JsZCApOwoJCQkJCW1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTsKCQkJCQltYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIG1hdHJpeDQgKTsKCgkJCQkJdW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7CgkJCQkJdW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTsKCgkJCQkJdW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTsKCQkJCQl1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTsKCgkJCQkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/CgkJCQkJLy8gdW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKCgkJCQkJc3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtczsKCgkJCQkJcmVjdEFyZWFMZW5ndGggKys7CgoJCQkJfSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkgewoKCQkJCQl2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7CgoJCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKCQkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTsKCgkJCQkJdW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7CgkJCQkJdW5pZm9ybXMuZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTsKCQkJCQl1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5OwoKCQkJCQl1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93OwoKCQkJCQlpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CgoJCQkJCQl2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93OwoKCQkJCQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOwoJCQkJCQl1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzOwoJCQkJCQl1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CgkJCQkJCXVuaWZvcm1zLnNoYWRvd0NhbWVyYU5lYXIgPSBzaGFkb3cuY2FtZXJhLm5lYXI7CgkJCQkJCXVuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyOwoKCQkJCQl9CgoJCQkJCXN0YXRlLnBvaW50U2hhZG93TWFwWyBwb2ludExlbmd0aCBdID0gc2hhZG93TWFwOwoJCQkJCXN0YXRlLnBvaW50U2hhZG93TWF0cml4WyBwb2ludExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKCQkJCQlzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zOwoKCQkJCQlwb2ludExlbmd0aCArKzsKCgkJCQl9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHsKCgkJCQkJdmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApOwoKCQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApOwoJCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKCQkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7CgoJCQkJCXVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOwoJCQkJCXVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOwoKCQkJCQlzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtczsKCgkJCQkJaGVtaUxlbmd0aCArKzsKCgkJCQl9CgoJCQl9CgoJCQlzdGF0ZS5hbWJpZW50WyAwIF0gPSByOwoJCQlzdGF0ZS5hbWJpZW50WyAxIF0gPSBnOwoJCQlzdGF0ZS5hbWJpZW50WyAyIF0gPSBiOwoKCQkJc3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7CgkJCXN0YXRlLnNwb3QubGVuZ3RoID0gc3BvdExlbmd0aDsKCQkJc3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7CgkJCXN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoOwoJCQlzdGF0ZS5oZW1pLmxlbmd0aCA9IGhlbWlMZW5ndGg7CgoJCQkvLyBUT0RPIChzYW0tZy1zdGVlbCkgd2h5IGFyZW4ndCB3ZSB1c2luZyBqb2luCgkJCXN0YXRlLmhhc2ggPSBkaXJlY3Rpb25hbExlbmd0aCArICcsJyArIHBvaW50TGVuZ3RoICsgJywnICsgc3BvdExlbmd0aCArICcsJyArIHJlY3RBcmVhTGVuZ3RoICsgJywnICsgaGVtaUxlbmd0aCArICcsJyArIHNoYWRvd3MubGVuZ3RoOwoKCQl9CgoJCXJldHVybiB7CgkJCXNldHVwOiBzZXR1cCwKCQkJc3RhdGU6IHN0YXRlCgkJfTsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gV2ViR0xPYmplY3RzKCBnZW9tZXRyaWVzLCBpbmZvUmVuZGVyICkgewoKCQl2YXIgdXBkYXRlTGlzdCA9IHt9OwoKCQlmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHsKCgkJCXZhciBmcmFtZSA9IGluZm9SZW5kZXIuZnJhbWU7CgoJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CgkJCXZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7CgoJCQkvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWUKCgkJCWlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7CgoJCQkJaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKCQkJCQlidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTsKCgkJCQl9CgoJCQkJZ2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7CgoJCQkJdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lOwoKCQkJfQoKCQkJcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5OwoKCQl9CgoJCWZ1bmN0aW9uIGNsZWFyKCkgewoKCQkJdXBkYXRlTGlzdCA9IHt9OwoKCQl9CgoJCXJldHVybiB7CgoJCQl1cGRhdGU6IHVwZGF0ZSwKCQkJY2xlYXI6IGNsZWFyCgoJCX07CgoJfQoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSB7CgoJCXZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xuJyApOwoKCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7CgoJCQlsaW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07CgoJCX0KCgkJcmV0dXJuIGxpbmVzLmpvaW4oICdcbicgKTsKCgl9CgoJZnVuY3Rpb24gV2ViR0xTaGFkZXIoIGdsLCB0eXBlLCBzdHJpbmcgKSB7CgoJCXZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTsKCgkJZ2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApOwoJCWdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApOwoKCQlpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblwndCBjb21waWxlLicgKTsKCgkJfQoKCQlpZiAoIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApICE9PSAnJyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCknLCB0eXBlID09PSBnbC5WRVJURVhfU0hBREVSID8gJ3ZlcnRleCcgOiAnZnJhZ21lbnQnLCBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKSwgYWRkTGluZU51bWJlcnMoIHN0cmluZyApICk7CgoJCX0KCgkJLy8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb24KCQkvLyBjb25zb2xlLmxvZyggdHlwZSwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApOwoKCQlyZXR1cm4gc2hhZGVyOwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCgl2YXIgcHJvZ3JhbUlkQ291bnQgPSAwOwoKCWZ1bmN0aW9uIGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKSB7CgoJCXN3aXRjaCAoIGVuY29kaW5nICkgewoKCQkJY2FzZSBMaW5lYXJFbmNvZGluZzoKCQkJCXJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdOwoJCQljYXNlIHNSR0JFbmNvZGluZzoKCQkJCXJldHVybiBbICdzUkdCJywgJyggdmFsdWUgKScgXTsKCQkJY2FzZSBSR0JFRW5jb2Rpbmc6CgkJCQlyZXR1cm4gWyAnUkdCRScsICcoIHZhbHVlICknIF07CgkJCWNhc2UgUkdCTTdFbmNvZGluZzoKCQkJCXJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdOwoJCQljYXNlIFJHQk0xNkVuY29kaW5nOgoJCQkJcmV0dXJuIFsgJ1JHQk0nLCAnKCB2YWx1ZSwgMTYuMCApJyBdOwoJCQljYXNlIFJHQkRFbmNvZGluZzoKCQkJCXJldHVybiBbICdSR0JEJywgJyggdmFsdWUsIDI1Ni4wICknIF07CgkJCWNhc2UgR2FtbWFFbmNvZGluZzoKCQkJCXJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTsKCQkJZGVmYXVsdDoKCQkJCXRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcgKTsKCgkJfQoKCX0KCglmdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7CgoJCXZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApOwoJCXJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7CgoJfQoKCWZ1bmN0aW9uIGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBlbmNvZGluZyApIHsKCgkJdmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7CgkJcmV0dXJuICd2ZWM0ICcgKyBmdW5jdGlvbk5hbWUgKyAnKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8nICsgY29tcG9uZW50c1sgMCBdICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7CgoJfQoKCWZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7CgoJCXZhciB0b25lTWFwcGluZ05hbWU7CgoJCXN3aXRjaCAoIHRvbmVNYXBwaW5nICkgewoKCQkJY2FzZSBMaW5lYXJUb25lTWFwcGluZzoKCQkJCXRvbmVNYXBwaW5nTmFtZSA9ICdMaW5lYXInOwoJCQkJYnJlYWs7CgoJCQljYXNlIFJlaW5oYXJkVG9uZU1hcHBpbmc6CgkJCQl0b25lTWFwcGluZ05hbWUgPSAnUmVpbmhhcmQnOwoJCQkJYnJlYWs7CgoJCQljYXNlIFVuY2hhcnRlZDJUb25lTWFwcGluZzoKCQkJCXRvbmVNYXBwaW5nTmFtZSA9ICdVbmNoYXJ0ZWQyJzsKCQkJCWJyZWFrOwoKCQkJY2FzZSBDaW5lb25Ub25lTWFwcGluZzoKCQkJCXRvbmVNYXBwaW5nTmFtZSA9ICdPcHRpbWl6ZWRDaW5lb24nOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJdGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6ICcgKyB0b25lTWFwcGluZyApOwoKCQl9CgoJCXJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nOwoKCX0KCglmdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHJlbmRlcmVyRXh0ZW5zaW9ucyApIHsKCgkJZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307CgoJCXZhciBjaHVua3MgPSBbCgkJCSggZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyB8fCBwYXJhbWV0ZXJzLmVudk1hcEN1YmVVViB8fCBwYXJhbWV0ZXJzLmJ1bXBNYXAgfHwgcGFyYW1ldGVycy5ub3JtYWxNYXAgfHwgcGFyYW1ldGVycy5mbGF0U2hhZGluZyApID8gJyNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlJyA6ICcnLAoJCQkoIGV4dGVuc2lvbnMuZnJhZ0RlcHRoIHx8IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlJyA6ICcnLAoJCQkoIGV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZHJhd19idWZmZXJzJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUnIDogJycsCgkJCSggZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EIHx8IHBhcmFtZXRlcnMuZW52TWFwICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogZW5hYmxlJyA6ICcnCgkJXTsKCgkJcmV0dXJuIGNodW5rcy5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKCgl9CgoJZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICkgewoKCQl2YXIgY2h1bmtzID0gW107CgoJCWZvciAoIHZhciBuYW1lIGluIGRlZmluZXMgKSB7CgoJCQl2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07CgoJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlOwoKCQkJY2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTsKCgkJfQoKCQlyZXR1cm4gY2h1bmtzLmpvaW4oICdcbicgKTsKCgl9CgoJZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICkgewoKCQl2YXIgYXR0cmlidXRlcyA9IHt9OwoKCQl2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFDVElWRV9BVFRSSUJVVEVTICk7CgoJCWZvciAoIHZhciBpID0gMDsgaSA8IG47IGkgKysgKSB7CgoJCQl2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApOwoJCQl2YXIgbmFtZSA9IGluZm8ubmFtZTsKCgkJCS8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTonLCBuYW1lLCBpICk7CgoJCQlhdHRyaWJ1dGVzWyBuYW1lIF0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApOwoKCQl9CgoJCXJldHVybiBhdHRyaWJ1dGVzOwoKCX0KCglmdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHsKCgkJcmV0dXJuIHN0cmluZyAhPT0gJyc7CgoJfQoKCWZ1bmN0aW9uIHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHsKCgkJcmV0dXJuIHN0cmluZwoJCQkucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzICkKCQkJLnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRzICkKCQkJLnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzICkKCQkJLnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKQoJCQkucmVwbGFjZSggL05VTV9IRU1JX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bUhlbWlMaWdodHMgKTsKCgl9CgoJZnVuY3Rpb24gcGFyc2VJbmNsdWRlcyggc3RyaW5nICkgewoKCQl2YXIgcGF0dGVybiA9IC9eWyBcdF0qI2luY2x1ZGUgKzwoW1x3XGQuXSspPi9nbTsKCgkJZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIGluY2x1ZGUgKSB7CgoJCQl2YXIgcmVwbGFjZSA9IFNoYWRlckNodW5rWyBpbmNsdWRlIF07CgoJCQlpZiAoIHJlcGxhY2UgPT09IHVuZGVmaW5lZCApIHsKCgkJCQl0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7CgoJCQl9CgoJCQlyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApOwoKCQl9CgoJCXJldHVybiBzdHJpbmcucmVwbGFjZSggcGF0dGVybiwgcmVwbGFjZSApOwoKCX0KCglmdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkgewoKCQl2YXIgcGF0dGVybiA9IC9mb3IgXCggaW50IGkgXD0gKFxkKylcOyBpIDwgKFxkKylcOyBpIFwrXCsgXCkgXHsoW1xzXFNdKz8pKD89XH0pXH0vZzsKCgkJZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQgKSB7CgoJCQl2YXIgdW5yb2xsID0gJyc7CgoJCQlmb3IgKCB2YXIgaSA9IHBhcnNlSW50KCBzdGFydCApOyBpIDwgcGFyc2VJbnQoIGVuZCApOyBpICsrICkgewoKCQkJCXVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cWyBpIFxdL2csICdbICcgKyBpICsgJyBdJyApOwoKCQkJfQoKCQkJcmV0dXJuIHVucm9sbDsKCgkJfQoKCQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTsKCgl9CgoJZnVuY3Rpb24gV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApIHsKCgkJdmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDsKCgkJdmFyIGRlZmluZXMgPSBtYXRlcmlhbC5kZWZpbmVzOwoKCQl2YXIgdmVydGV4U2hhZGVyID0gc2hhZGVyLnZlcnRleFNoYWRlcjsKCQl2YXIgZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXI7CgoJCXZhciBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJzsKCgkJaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCApIHsKCgkJCXNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGJzsKCgkJfSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkgewoKCQkJc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7CgoJCX0KCgkJdmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7CgkJdmFyIGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGTEVDVElPTic7CgkJdmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7CgoJCWlmICggcGFyYW1ldGVycy5lbnZNYXAgKSB7CgoJCQlzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHsKCgkJCQljYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzoKCQkJCWNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOgoJCQkJCWVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzoKCQkJCWNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6CgkJCQkJZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJzsKCQkJCQlicmVhazsKCgkJCQljYXNlIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOgoJCQkJY2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzoKCQkJCQllbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0VRVUlSRUMnOwoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6CgkJCQkJZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9TUEhFUkUnOwoJCQkJCWJyZWFrOwoKCQkJfQoKCQkJc3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgKSB7CgoJCQkJY2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6CgkJCQljYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOgoJCQkJCWVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7CgkJCQkJYnJlYWs7CgoJCQl9CgoJCQlzd2l0Y2ggKCBtYXRlcmlhbC5jb21iaW5lICkgewoKCQkJCWNhc2UgTXVsdGlwbHlPcGVyYXRpb246CgkJCQkJZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJzsKCQkJCQlicmVhazsKCgkJCQljYXNlIE1peE9wZXJhdGlvbjoKCQkJCQllbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJzsKCQkJCQlicmVhazsKCgkJCQljYXNlIEFkZE9wZXJhdGlvbjoKCQkJCQllbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJzsKCQkJCQlicmVhazsKCgkJCX0KCgkJfQoKCQl2YXIgZ2FtbWFGYWN0b3JEZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0b3IgOiAxLjA7CgoJCS8vIGNvbnNvbGUubG9nKCAnYnVpbGRpbmcgbmV3IHByb2dyYW0gJyApOwoKCQkvLwoKCQl2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucyggbWF0ZXJpYWwuZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgZXh0ZW5zaW9ucyApOwoKCQl2YXIgY3VzdG9tRGVmaW5lcyA9IGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApOwoKCQkvLwoKCQl2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKCgkJdmFyIHByZWZpeFZlcnRleCwgcHJlZml4RnJhZ21lbnQ7CgoJCWlmICggbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHsKCgkJCXByZWZpeFZlcnRleCA9IFsKCgkJCQljdXN0b21EZWZpbmVzCgoJCQldLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyApOwoKCQkJaWYgKCBwcmVmaXhWZXJ0ZXgubGVuZ3RoID4gMCApIHsKCgkJCQlwcmVmaXhWZXJ0ZXggKz0gJ1xuJzsKCgkJCX0KCgkJCXByZWZpeEZyYWdtZW50ID0gWwoKCQkJCWN1c3RvbUV4dGVuc2lvbnMsCgkJCQljdXN0b21EZWZpbmVzCgoJCQldLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyApOwoKCQkJaWYgKCBwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwICkgewoKCQkJCXByZWZpeEZyYWdtZW50ICs9ICdcbic7CgoJCQl9CgoJCX0gZWxzZSB7CgoJCQlwcmVmaXhWZXJ0ZXggPSBbCgoJCQkJJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsCgkJCQkncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsCgoJCQkJJyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHNoYWRlci5uYW1lLAoKCQkJCWN1c3RvbURlZmluZXMsCgoJCQkJcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTJyA6ICcnLAoKCQkJCScjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsCgoJCQkJJyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLAoJCQkJKCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJywKCQkJCSggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLAoKCQkJCXBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJywKCQkJCXBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsCgoJCQkJcGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLAoKCQkJCXBhcmFtZXRlcnMuc2tpbm5pbmcgPyAnI2RlZmluZSBVU0VfU0tJTk5JTkcnIDogJycsCgkJCQlwYXJhbWV0ZXJzLnVzZVZlcnRleFRleHR1cmUgPyAnI2RlZmluZSBCT05FX1RFWFRVUkUnIDogJycsCgoJCQkJcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJywKCgkJCQknI2RlZmluZSBOVU1fQ0xJUFBJTkdfUExBTkVTICcgKyBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzLAoKCQkJCXBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLAoKCQkJCXBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJywKCgkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsCgkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsCgoJCQkJJ3VuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsnLAoJCQkJJ3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7JywKCQkJCSd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLAoJCQkJJ3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsCgkJCQkndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLAoJCQkJJ3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLAoKCQkJCSdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLAoJCQkJJ2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLAoJCQkJJ2F0dHJpYnV0ZSB2ZWMyIHV2OycsCgoJCQkJJyNpZmRlZiBVU0VfQ09MT1InLAoKCQkJCScJYXR0cmlidXRlIHZlYzMgY29sb3I7JywKCgkJCQknI2VuZGlmJywKCgkJCQknI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLAoKCQkJCScJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOycsCgkJCQknCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsnLAoJCQkJJwlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7JywKCQkJCScJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOycsCgoJCQkJJwkjaWZkZWYgVVNFX01PUlBITk9STUFMUycsCgoJCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsCgkJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7JywKCQkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsnLAoJCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsCgoJCQkJJwkjZWxzZScsCgoJCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsCgkJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7JywKCQkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsnLAoJCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsCgoJCQkJJwkjZW5kaWYnLAoKCQkJCScjZW5kaWYnLAoKCQkJCScjaWZkZWYgVVNFX1NLSU5OSU5HJywKCgkJCQknCWF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsnLAoJCQkJJwlhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OycsCgoJCQkJJyNlbmRpZicsCgoJCQkJJ1xuJwoKCQkJXS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKCgkJCXByZWZpeEZyYWdtZW50ID0gWwoKCQkJCWN1c3RvbUV4dGVuc2lvbnMsCgoJCQkJJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsCgkJCQkncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsCgoJCQkJJyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHNoYWRlci5uYW1lLAoKCQkJCWN1c3RvbURlZmluZXMsCgoJCQkJcGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsCgoJCQkJJyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSwKCgkJCQkoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLAoJCQkJKCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsCgoJCQkJcGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJywKCQkJCXBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJywKCQkJCXBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJywKCgkJCQlwYXJhbWV0ZXJzLmdyYWRpZW50TWFwID8gJyNkZWZpbmUgVVNFX0dSQURJRU5UTUFQJyA6ICcnLAoKCQkJCXBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJywKCgkJCQlwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLAoJCQkJcGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLAoKCQkJCScjZGVmaW5lIE5VTV9DTElQUElOR19QTEFORVMgJyArIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMsCgkJCQknI2RlZmluZSBVTklPTl9DTElQUElOR19QTEFORVMgJyArICggcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiApLAoKCQkJCXBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsCgkJCQlwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLAoKCQkJCXBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gJyNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQScgOiAnJywKCgkJCQlwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gJyNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUycgOiAnJywKCgkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsCgkJCQlwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsCgoJCQkJcGFyYW1ldGVycy5lbnZNYXAgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLAoKCQkJCSd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLAoJCQkJJ3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLAoKCQkJCSggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gJyNkZWZpbmUgVE9ORV9NQVBQSU5HJyA6ICcnLAoJCQkJKCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cKCQkJCSggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggJ3RvbmVNYXBwaW5nJywgcGFyYW1ldGVycy50b25lTWFwcGluZyApIDogJycsCgoJCQkJcGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsCgoJCQkJKCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cKCQkJCXBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsCgkJCQlwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLAoJCQkJcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJywKCQkJCXBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICdsaW5lYXJUb091dHB1dFRleGVsJywgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsCgoJCQkJcGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyAnI2RlZmluZSBERVBUSF9QQUNLSU5HICcgKyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiAnJywKCgkJCQknXG4nCgoJCQldLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xuJyApOwoKCQl9CgoJCXZlcnRleFNoYWRlciA9IHBhcnNlSW5jbHVkZXMoIHZlcnRleFNoYWRlciApOwoJCXZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApOwoKCQlmcmFnbWVudFNoYWRlciA9IHBhcnNlSW5jbHVkZXMoIGZyYWdtZW50U2hhZGVyICk7CgkJZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApOwoKCQlpZiAoICEgbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHsKCgkJCXZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTsKCQkJZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTsKCgkJfQoKCQl2YXIgdmVydGV4R2xzbCA9IHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjsKCQl2YXIgZnJhZ21lbnRHbHNsID0gcHJlZml4RnJhZ21lbnQgKyBmcmFnbWVudFNoYWRlcjsKCgkJLy8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTsKCQkvLyBjb25zb2xlLmxvZyggJypGUkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTsKCgkJdmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhHbHNsICk7CgkJdmFyIGdsRnJhZ21lbnRTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRHbHNsICk7CgoJCWdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTsKCQlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTsKCgkJLy8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLgoKCQlpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHsKCgkJCWdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApOwoKCQl9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHsKCgkJCS8vIHByb2dyYW1zIHdpdGggbW9ycGhUYXJnZXRzIGRpc3BsYWNlIHBvc2l0aW9uIG91dCBvZiBhdHRyaWJ1dGUgMAoJCQlnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTsKCgkJfQoKCQlnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApOwoKCQl2YXIgcHJvZ3JhbUxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKCBwcm9ncmFtICk7CgkJdmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICk7CgkJdmFyIGZyYWdtZW50TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggZ2xGcmFnbWVudFNoYWRlciApOwoKCQl2YXIgcnVubmFibGUgPSB0cnVlOwoJCXZhciBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlOwoKCQkvLyBjb25zb2xlLmxvZyggJyoqVkVSVEVYKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsVmVydGV4U2hhZGVyICkgKTsKCQkvLyBjb25zb2xlLmxvZyggJyoqRlJBR01FTlQqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xGcmFnbWVudFNoYWRlciApICk7CgoJCWlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7CgoJCQlydW5uYWJsZSA9IGZhbHNlOwoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAnLCBnbC5nZXRFcnJvcigpLCAnZ2wuVkFMSURBVEVfU1RBVFVTJywgZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTICksICdnbC5nZXRQcm9ncmFtSW5mb0xvZycsIHByb2dyYW1Mb2csIHZlcnRleExvZywgZnJhZ21lbnRMb2cgKTsKCgkJfSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCknLCBwcm9ncmFtTG9nICk7CgoJCX0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkgewoKCQkJaGF2ZURpYWdub3N0aWNzID0gZmFsc2U7CgoJCX0KCgkJaWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7CgoJCQl0aGlzLmRpYWdub3N0aWNzID0gewoKCQkJCXJ1bm5hYmxlOiBydW5uYWJsZSwKCQkJCW1hdGVyaWFsOiBtYXRlcmlhbCwKCgkJCQlwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLAoKCQkJCXZlcnRleFNoYWRlcjogewoKCQkJCQlsb2c6IHZlcnRleExvZywKCQkJCQlwcmVmaXg6IHByZWZpeFZlcnRleAoKCQkJCX0sCgoJCQkJZnJhZ21lbnRTaGFkZXI6IHsKCgkJCQkJbG9nOiBmcmFnbWVudExvZywKCQkJCQlwcmVmaXg6IHByZWZpeEZyYWdtZW50CgoJCQkJfQoKCQkJfTsKCgkJfQoKCQkvLyBjbGVhbiB1cAoKCQlnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7CgkJZ2wuZGVsZXRlU2hhZGVyKCBnbEZyYWdtZW50U2hhZGVyICk7CgoJCS8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9ucwoKCQl2YXIgY2FjaGVkVW5pZm9ybXM7CgoJCXRoaXMuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQgKSB7CgoJCQkJY2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICk7CgoJCQl9CgoJCQlyZXR1cm4gY2FjaGVkVW5pZm9ybXM7CgoJCX07CgoJCS8vIHNldCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9jYXRpb25zCgoJCXZhciBjYWNoZWRBdHRyaWJ1dGVzOwoKCQl0aGlzLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCApIHsKCgkJCQljYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7CgoJCQl9CgoJCQlyZXR1cm4gY2FjaGVkQXR0cmlidXRlczsKCgkJfTsKCgkJLy8gZnJlZSByZXNvdXJjZQoKCQl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CgoJCQlnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7CgkJCXRoaXMucHJvZ3JhbSA9IHVuZGVmaW5lZDsKCgkJfTsKCgkJLy8gREVQUkVDQVRFRAoKCQlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywgewoKCQkJdW5pZm9ybXM6IHsKCQkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC51bmlmb3JtcyBpcyBub3cgLmdldFVuaWZvcm1zKCkuJyApOwoJCQkJCXJldHVybiB0aGlzLmdldFVuaWZvcm1zKCk7CgoJCQkJfQoJCQl9LAoKCQkJYXR0cmlidXRlczogewoJCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLmF0dHJpYnV0ZXMgaXMgbm93IC5nZXRBdHRyaWJ1dGVzKCkuJyApOwoJCQkJCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKTsKCgkJCQl9CgkJCX0KCgkJfSApOwoKCgkJLy8KCgkJdGhpcy5pZCA9IHByb2dyYW1JZENvdW50ICsrOwoJCXRoaXMuY29kZSA9IGNvZGU7CgkJdGhpcy51c2VkVGltZXMgPSAxOwoJCXRoaXMucHJvZ3JhbSA9IHByb2dyYW07CgkJdGhpcy52ZXJ0ZXhTaGFkZXIgPSBnbFZlcnRleFNoYWRlcjsKCQl0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjsKCgkJcmV0dXJuIHRoaXM7CgoJfQoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7CgoJCXZhciBwcm9ncmFtcyA9IFtdOwoKCQl2YXIgc2hhZGVySURzID0gewoJCQlNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJywKCQkJTWVzaERpc3RhbmNlTWF0ZXJpYWw6ICdkaXN0YW5jZVJHQkEnLAoJCQlNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLAoJCQlNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJywKCQkJTWVzaExhbWJlcnRNYXRlcmlhbDogJ2xhbWJlcnQnLAoJCQlNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJywKCQkJTWVzaFRvb25NYXRlcmlhbDogJ3Bob25nJywKCQkJTWVzaFN0YW5kYXJkTWF0ZXJpYWw6ICdwaHlzaWNhbCcsCgkJCU1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLAoJCQlMaW5lQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJywKCQkJTGluZURhc2hlZE1hdGVyaWFsOiAnZGFzaGVkJywKCQkJUG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLAoJCQlTaGFkb3dNYXRlcmlhbDogJ3NoYWRvdycKCQl9OwoKCQl2YXIgcGFyYW1ldGVyTmFtZXMgPSBbCgkJCSJwcmVjaXNpb24iLCAic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIsICJtYXAiLCAibWFwRW5jb2RpbmciLCAiZW52TWFwIiwgImVudk1hcE1vZGUiLCAiZW52TWFwRW5jb2RpbmciLAoJCQkibGlnaHRNYXAiLCAiYW9NYXAiLCAiZW1pc3NpdmVNYXAiLCAiZW1pc3NpdmVNYXBFbmNvZGluZyIsICJidW1wTWFwIiwgIm5vcm1hbE1hcCIsICJkaXNwbGFjZW1lbnRNYXAiLCAic3BlY3VsYXJNYXAiLAoJCQkicm91Z2huZXNzTWFwIiwgIm1ldGFsbmVzc01hcCIsICJncmFkaWVudE1hcCIsCgkJCSJhbHBoYU1hcCIsICJjb21iaW5lIiwgInZlcnRleENvbG9ycyIsICJmb2ciLCAidXNlRm9nIiwgImZvZ0V4cCIsCgkJCSJmbGF0U2hhZGluZyIsICJzaXplQXR0ZW51YXRpb24iLCAibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciIsICJza2lubmluZyIsCgkJCSJtYXhCb25lcyIsICJ1c2VWZXJ0ZXhUZXh0dXJlIiwgIm1vcnBoVGFyZ2V0cyIsICJtb3JwaE5vcm1hbHMiLAoJCQkibWF4TW9ycGhUYXJnZXRzIiwgIm1heE1vcnBoTm9ybWFscyIsICJwcmVtdWx0aXBsaWVkQWxwaGEiLAoJCQkibnVtRGlyTGlnaHRzIiwgIm51bVBvaW50TGlnaHRzIiwgIm51bVNwb3RMaWdodHMiLCAibnVtSGVtaUxpZ2h0cyIsICJudW1SZWN0QXJlYUxpZ2h0cyIsCgkJCSJzaGFkb3dNYXBFbmFibGVkIiwgInNoYWRvd01hcFR5cGUiLCAidG9uZU1hcHBpbmciLCAncGh5c2ljYWxseUNvcnJlY3RMaWdodHMnLAoJCQkiYWxwaGFUZXN0IiwgImRvdWJsZVNpZGVkIiwgImZsaXBTaWRlZCIsICJudW1DbGlwcGluZ1BsYW5lcyIsICJudW1DbGlwSW50ZXJzZWN0aW9uIiwgImRlcHRoUGFja2luZyIsICJkaXRoZXJpbmciCgkJXTsKCgoJCWZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHsKCgkJCXZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjsKCQkJdmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7CgoJCQlpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkgewoKCQkJCXJldHVybiAxMDI0OwoKCQkJfSBlbHNlIHsKCgkJCQkvLyBkZWZhdWx0IGZvciB3aGVuIG9iamVjdCBpcyBub3Qgc3BlY2lmaWVkCgkJCQkvLyAoIGZvciBleGFtcGxlIHdoZW4gcHJlYnVpbGRpbmcgc2hhZGVyIHRvIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBvYmplY3RzICkKCQkJCS8vCgkJCQkvLyAgLSBsZWF2ZSBzb21lIGV4dHJhIHNwYWNlIGZvciBvdGhlciB1bmlmb3JtcwoJCQkJLy8gIC0gbGltaXQgaGVyZSBpcyBBTkdMRSdzIDI1NCBtYXggdW5pZm9ybSB2ZWN0b3JzCgkJCQkvLyAgICAodXAgdG8gNTQgc2hvdWxkIGJlIHNhZmUpCgoJCQkJdmFyIG5WZXJ0ZXhVbmlmb3JtcyA9IGNhcGFiaWxpdGllcy5tYXhWZXJ0ZXhVbmlmb3JtczsKCQkJCXZhciBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7CgoJCQkJdmFyIG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7CgoJCQkJaWYgKCBtYXhCb25lcyA8IGJvbmVzLmxlbmd0aCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTsKCQkJCQlyZXR1cm4gMDsKCgkJCQl9CgoJCQkJcmV0dXJuIG1heEJvbmVzOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hcCwgZ2FtbWFPdmVycmlkZUxpbmVhciApIHsKCgkJCXZhciBlbmNvZGluZzsKCgkJCWlmICggISBtYXAgKSB7CgoJCQkJZW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZzsKCgkJCX0gZWxzZSBpZiAoIG1hcC5pc1RleHR1cmUgKSB7CgoJCQkJZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7CgoJCQl9IGVsc2UgaWYgKCBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHsKCgkJCQljb25zb2xlLndhcm4oICJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiApOwoJCQkJZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZzsKCgkJCX0KCgkJCS8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2ViR0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC4KCQkJaWYgKCBlbmNvZGluZyA9PT0gTGluZWFyRW5jb2RpbmcgJiYgZ2FtbWFPdmVycmlkZUxpbmVhciApIHsKCgkJCQllbmNvZGluZyA9IEdhbW1hRW5jb2Rpbmc7CgoJCQl9CgoJCQlyZXR1cm4gZW5jb2Rpbmc7CgoJCX0KCgkJdGhpcy5nZXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgbGlnaHRzLCBzaGFkb3dzLCBmb2csIG5DbGlwUGxhbmVzLCBuQ2xpcEludGVyc2VjdGlvbiwgb2JqZWN0ICkgewoKCQkJdmFyIHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07CgoJCQkvLyBoZXVyaXN0aWNzIHRvIGNyZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZQoJCQkvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KQoKCQkJdmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7CgkJCXZhciBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uOwoKCQkJaWYgKCBtYXRlcmlhbC5wcmVjaXNpb24gIT09IG51bGwgKSB7CgoJCQkJcHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7CgoJCQkJaWYgKCBwcmVjaXNpb24gIT09IG1hdGVyaWFsLnByZWNpc2lvbiApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTsKCgkJCQl9CgoJCQl9CgoJCQl2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpOwoKCQkJdmFyIHBhcmFtZXRlcnMgPSB7CgoJCQkJc2hhZGVySUQ6IHNoYWRlcklELAoKCQkJCXByZWNpc2lvbjogcHJlY2lzaW9uLAoJCQkJc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLAoJCQkJb3V0cHV0RW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkgPyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1dCApLAoJCQkJbWFwOiAhISBtYXRlcmlhbC5tYXAsCgkJCQltYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksCgkJCQllbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCwKCQkJCWVudk1hcE1vZGU6IG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZywKCQkJCWVudk1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbnZNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSwKCQkJCWVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgfHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgKSApLAoJCQkJbGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLAoJCQkJYW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLAoJCQkJZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLAoJCQkJZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSwKCQkJCWJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsCgkJCQlub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCwKCQkJCWRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLAoJCQkJcm91Z2huZXNzTWFwOiAhISBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsCgkJCQltZXRhbG5lc3NNYXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCwKCQkJCXNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCwKCQkJCWFscGhhTWFwOiAhISBtYXRlcmlhbC5hbHBoYU1hcCwKCgkJCQlncmFkaWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsCgoJCQkJY29tYmluZTogbWF0ZXJpYWwuY29tYmluZSwKCgkJCQl2ZXJ0ZXhDb2xvcnM6IG1hdGVyaWFsLnZlcnRleENvbG9ycywKCgkJCQlmb2c6ICEhIGZvZywKCQkJCXVzZUZvZzogbWF0ZXJpYWwuZm9nLAoJCQkJZm9nRXhwOiAoIGZvZyAmJiBmb2cuaXNGb2dFeHAyICksCgoJCQkJZmxhdFNoYWRpbmc6IG1hdGVyaWFsLmZsYXRTaGFkaW5nLAoKCQkJCXNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLAoJCQkJbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsCgoJCQkJc2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYmIG1heEJvbmVzID4gMCwKCQkJCW1heEJvbmVzOiBtYXhCb25lcywKCQkJCXVzZVZlcnRleFRleHR1cmU6IGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzLAoKCQkJCW1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLAoJCQkJbW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsCgkJCQltYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1vcnBoVGFyZ2V0cywKCQkJCW1heE1vcnBoTm9ybWFsczogcmVuZGVyZXIubWF4TW9ycGhOb3JtYWxzLAoKCQkJCW51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCwKCQkJCW51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLAoJCQkJbnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLAoJCQkJbnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsCgkJCQludW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsCgoJCQkJbnVtQ2xpcHBpbmdQbGFuZXM6IG5DbGlwUGxhbmVzLAoJCQkJbnVtQ2xpcEludGVyc2VjdGlvbjogbkNsaXBJbnRlcnNlY3Rpb24sCgoJCQkJZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcsCgoJCQkJc2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93cy5sZW5ndGggPiAwLAoJCQkJc2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsCgoJCQkJdG9uZU1hcHBpbmc6IHJlbmRlcmVyLnRvbmVNYXBwaW5nLAoJCQkJcGh5c2ljYWxseUNvcnJlY3RMaWdodHM6IHJlbmRlcmVyLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLAoKCQkJCXByZW11bHRpcGxpZWRBbHBoYTogbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLAoKCQkJCWFscGhhVGVzdDogbWF0ZXJpYWwuYWxwaGFUZXN0LAoJCQkJZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUsCgkJCQlmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLAoKCQkJCWRlcHRoUGFja2luZzogKCBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogZmFsc2UKCgkJCX07CgoJCQlyZXR1cm4gcGFyYW1ldGVyczsKCgkJfTsKCgkJdGhpcy5nZXRQcm9ncmFtQ29kZSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKSB7CgoJCQl2YXIgYXJyYXkgPSBbXTsKCgkJCWlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHsKCgkJCQlhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7CgoJCQl9IGVsc2UgewoKCQkJCWFycmF5LnB1c2goIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyICk7CgkJCQlhcnJheS5wdXNoKCBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgKTsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwuZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWZvciAoIHZhciBuYW1lIGluIG1hdGVyaWFsLmRlZmluZXMgKSB7CgoJCQkJCWFycmF5LnB1c2goIG5hbWUgKTsKCQkJCQlhcnJheS5wdXNoKCBtYXRlcmlhbC5kZWZpbmVzWyBuYW1lIF0gKTsKCgkJCQl9CgoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJYXJyYXkucHVzaCggcGFyYW1ldGVyc1sgcGFyYW1ldGVyTmFtZXNbIGkgXSBdICk7CgoJCQl9CgoJCQlhcnJheS5wdXNoKCBtYXRlcmlhbC5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSApOwoKCQkJYXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFPdXRwdXQgKTsKCgkJCXJldHVybiBhcnJheS5qb2luKCk7CgoJCX07CgoJCXRoaXMuYWNxdWlyZVByb2dyYW0gPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKSB7CgoJCQl2YXIgcHJvZ3JhbTsKCgkJCS8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZAoJCQlmb3IgKCB2YXIgcCA9IDAsIHBsID0gcHJvZ3JhbXMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7CgoJCQkJdmFyIHByb2dyYW1JbmZvID0gcHJvZ3JhbXNbIHAgXTsKCgkJCQlpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7CgoJCQkJCXByb2dyYW0gPSBwcm9ncmFtSW5mbzsKCQkJCQkrKyBwcm9ncmFtLnVzZWRUaW1lczsKCgkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CgoJCQkJcHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICk7CgkJCQlwcm9ncmFtcy5wdXNoKCBwcm9ncmFtICk7CgoJCQl9CgoJCQlyZXR1cm4gcHJvZ3JhbTsKCgkJfTsKCgkJdGhpcy5yZWxlYXNlUHJvZ3JhbSA9IGZ1bmN0aW9uICggcHJvZ3JhbSApIHsKCgkJCWlmICggLS0gcHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB7CgoJCQkJLy8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldAoJCQkJdmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7CgkJCQlwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTsKCQkJCXByb2dyYW1zLnBvcCgpOwoKCQkJCS8vIEZyZWUgV2ViR0wgcmVzb3VyY2VzCgkJCQlwcm9ncmFtLmRlc3Ryb3koKTsKCgkJCX0KCgkJfTsKCgkJLy8gRXhwb3NlZCBmb3IgcmVzb3VyY2UgbW9uaXRvcmluZyAmIGVycm9yIGZlZWRiYWNrIHZpYSByZW5kZXJlci5pbmZvOgoJCXRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtczsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mb01lbW9yeSApIHsKCgkJdmFyIF9pc1dlYkdMMiA9ICggdHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIF9nbCBpbnN0YW5jZW9mIHdpbmRvdy5XZWJHTDJSZW5kZXJpbmdDb250ZXh0ICk7CgkJdmFyIF92aWRlb1RleHR1cmVzID0ge307CgoJCS8vCgoJCWZ1bmN0aW9uIGNsYW1wVG9NYXhTaXplKCBpbWFnZSwgbWF4U2l6ZSApIHsKCgkJCWlmICggaW1hZ2Uud2lkdGggPiBtYXhTaXplIHx8IGltYWdlLmhlaWdodCA+IG1heFNpemUgKSB7CgoJCQkJLy8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2UKCQkJCS8vIHByZW11bHRpcGxpZWQgYWxwaGEuCgoJCQkJdmFyIHNjYWxlID0gbWF4U2l6ZSAvIE1hdGgubWF4KCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7CgoJCQkJdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApOwoJCQkJY2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggaW1hZ2Uud2lkdGggKiBzY2FsZSApOwoJCQkJY2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3IoIGltYWdlLmhlaWdodCAqIHNjYWxlICk7CgoJCQkJdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApOwoJCQkJY29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgY2FudmFzLndpZHRoICsgJ3gnICsgY2FudmFzLmhlaWdodCwgaW1hZ2UgKTsKCgkJCQlyZXR1cm4gY2FudmFzOwoKCQkJfQoKCQkJcmV0dXJuIGltYWdlOwoKCQl9CgoJCWZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7CgoJCQlyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7CgoJCX0KCgkJZnVuY3Rpb24gbWFrZVBvd2VyT2ZUd28oIGltYWdlICkgewoKCQkJaWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgewoKCQkJCXZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTsKCQkJCWNhbnZhcy53aWR0aCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKTsKCQkJCWNhbnZhcy5oZWlnaHQgPSBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIGltYWdlLmhlaWdodCApOwoKCQkJCXZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTsKCQkJCWNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0ICk7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgbm90IHBvd2VyIG9mIHR3byAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7CgoJCQkJcmV0dXJuIGNhbnZhczsKCgkJCX0KCgkJCXJldHVybiBpbWFnZTsKCgkJfQoKCQlmdW5jdGlvbiB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgewoKCQkJcmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHwKCQkJCSggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApOwoKCQl9CgoJCWZ1bmN0aW9uIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvICkgewoKCQkJcmV0dXJuIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzUG93ZXJPZlR3byAmJgoJCQkJdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlcjsKCgkJfQoKCQkvLyBGYWxsYmFjayBmaWx0ZXJzIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlcwoKCQlmdW5jdGlvbiBmaWx0ZXJGYWxsYmFjayggZiApIHsKCgkJCWlmICggZiA9PT0gTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkgewoKCQkJCXJldHVybiBfZ2wuTkVBUkVTVDsKCgkJCX0KCgkJCXJldHVybiBfZ2wuTElORUFSOwoKCQl9CgoJCS8vCgoJCWZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkgewoKCQkJdmFyIHRleHR1cmUgPSBldmVudC50YXJnZXQ7CgoJCQl0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApOwoKCQkJZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTsKCgkJCWlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHsKCgkJCQlkZWxldGUgX3ZpZGVvVGV4dHVyZXNbIHRleHR1cmUuaWQgXTsKCgkJCX0KCgkJCWluZm9NZW1vcnkudGV4dHVyZXMgLS07CgoJCX0KCgkJZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHsKCgkJCXZhciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7CgoJCQlyZW5kZXJUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTsKCgkJCWRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApOwoKCQkJaW5mb01lbW9yeS50ZXh0dXJlcyAtLTsKCgkJfQoKCQkvLwoKCQlmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHsKCgkJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7CgoJCQlpZiAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHsKCgkJCQkvLyBjdWJlIHRleHR1cmUKCgkJCQlfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApOwoKCQkJfSBlbHNlIHsKCgkJCQkvLyAyRCB0ZXh0dXJlCgoJCQkJaWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOwoKCQkJCV9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoKCQkJfQoKCQkJLy8gcmVtb3ZlIGFsbCB3ZWJnbCBwcm9wZXJ0aWVzCgkJCXByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7CgoJCX0KCgkJZnVuY3Rpb24gZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkgewoKCQkJdmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CgkJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApOwoKCQkJaWYgKCAhIHJlbmRlclRhcmdldCApIHJldHVybjsKCgkJCWlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQlfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKCgkJCX0KCgkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHsKCgkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTsKCgkJCX0KCgkJCWlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkgewoKCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJCV9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApOwoJCQkJCWlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdICk7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQlfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7CgkJCQlpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTsKCgkJCX0KCgkJCXByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApOwoJCQlwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0ICk7CgoJCX0KCgkJLy8KCgoKCQlmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7CgoJCQl2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApOwoKCQkJaWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkgewoKCQkJCXZhciBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7CgoJCQkJaWYgKCBpbWFnZSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQnLCB0ZXh0dXJlICk7CgoJCQkJfSBlbHNlIGlmICggaW1hZ2UuY29tcGxldGUgPT09IGZhbHNlICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJywgdGV4dHVyZSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7CgkJCQkJcmV0dXJuOwoKCQkJCX0KCgkJCX0KCgkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKCQkJc3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoKCQl9CgoJCWZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkgewoKCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTsKCgkJCWlmICggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSB7CgoJCQkJaWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkgewoKCQkJCQlpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHsKCgkJCQkJCXRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7CgoJCQkJCQl0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKCgkJCQkJCWluZm9NZW1vcnkudGV4dHVyZXMgKys7CgoJCQkJCX0KCgkJCQkJc3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOwoJCQkJCXN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApOwoKCQkJCQlfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7CgoJCQkJCXZhciBpc0NvbXByZXNzZWQgPSAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICk7CgkJCQkJdmFyIGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApOwoKCQkJCQl2YXIgY3ViZUltYWdlID0gW107CgoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJCQlpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHsKCgkJCQkJCQljdWJlSW1hZ2VbIGkgXSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlWyBpIF0sIGNhcGFiaWxpdGllcy5tYXhDdWJlbWFwU2l6ZSApOwoKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQljdWJlSW1hZ2VbIGkgXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmltYWdlWyBpIF07CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQkJdmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sCgkJCQkJCWlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLAoJCQkJCQlnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0ICksCgkJCQkJCWdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApOwoKCQkJCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7CgoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJCQlpZiAoICEgaXNDb21wcmVzc2VkICkgewoKCQkJCQkJCWlmICggaXNEYXRhVGV4dHVyZSApIHsKCgkJCQkJCQkJc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBjdWJlSW1hZ2VbIGkgXS53aWR0aCwgY3ViZUltYWdlWyBpIF0uaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXS5kYXRhICk7CgoJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApOwoKCQkJCQkJCX0KCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJdmFyIG1pcG1hcCwgbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7CgoJCQkJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IG1pcG1hcHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgoJCQkJCQkJCW1pcG1hcCA9IG1pcG1hcHNbIGogXTsKCgkJCQkJCQkJaWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkgewoKCQkJCQkJCQkJaWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkgewoKCQkJCQkJCQkJCXN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTsKCgkJCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCknICk7CgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTsKCgkJCQkJCQkJfQoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQlpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHsKCgkJCQkJCV9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAgKTsKCgkJCQkJfQoKCQkJCQl0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247CgoJCQkJCWlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQlzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7CgkJCQkJc3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7CgoJCQkJfQoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHsKCgkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTsKCQkJc3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlICk7CgoJCX0KCgkJZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHsKCgkJCXZhciBleHRlbnNpb247CgoJCQlpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkgewoKCQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLndyYXBTICkgKTsKCQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLndyYXBUICkgKTsKCgkJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUubWFnRmlsdGVyICkgKTsKCQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5taW5GaWx0ZXIgKSApOwoKCQkJfSBlbHNlIHsKCgkJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTsKCQkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApOwoKCQkJCWlmICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicsIHRleHR1cmUgKTsKCgkJCQl9CgoJCQkJX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5tYWdGaWx0ZXIgKSApOwoJCQkJX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5taW5GaWx0ZXIgKSApOwoKCQkJCWlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLicsIHRleHR1cmUgKTsKCgkJCQl9CgoJCQl9CgoJCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTsKCgkJCWlmICggZXh0ZW5zaW9uICkgewoKCQkJCWlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47CgkJCQlpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuOwoKCQkJCWlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7CgoJCQkJCV9nbC50ZXhQYXJhbWV0ZXJmKCB0ZXh0dXJlVHlwZSwgZXh0ZW5zaW9uLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbiggdGV4dHVyZS5hbmlzb3Ryb3B5LCBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpICkgKTsKCQkJCQlwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7CgoJCQkJfQoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkgewoKCQkJaWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTsKCgkJCQl0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApOwoKCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKCgkJCQlpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7CgoJCQkJCV92aWRlb1RleHR1cmVzWyB0ZXh0dXJlLmlkIF0gPSB0ZXh0dXJlOwoKCQkJCX0KCgkJCQlpbmZvTWVtb3J5LnRleHR1cmVzICsrOwoKCQkJfQoKCQkJc3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApOwoJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CgoJCQlfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7CgkJCV9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7CgkJCV9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7CgoJCQl2YXIgaW1hZ2UgPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7CgoJCQlpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkgewoKCQkJCWltYWdlID0gbWFrZVBvd2VyT2ZUd28oIGltYWdlICk7CgoJCQl9CgoJCQl2YXIgaXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksCgkJCQlnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0ICksCgkJCQlnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTsKCgkJCXNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTsKCgkJCXZhciBtaXBtYXAsIG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7CgoJCQlpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7CgoJCQkJLy8gcG9wdWxhdGUgZGVwdGggdGV4dHVyZSB3aXRoIGR1bW15IGRhdGEKCgkJCQl2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UOwoKCQkJCWlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7CgoJCQkJCWlmICggISBfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoICdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyApOwoJCQkJCWludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDMyRjsKCgkJCQl9IGVsc2UgaWYgKCBfaXNXZWJHTDIgKSB7CgoJCQkJCS8vIFdlYkdMIDIuMCByZXF1aXJlcyBzaWduZWQgaW50ZXJuYWxmb3JtYXQgZm9yIGdsVGV4SW1hZ2UyRAoJCQkJCWludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDE2OwoKCQkJCX0KCgkJCQlpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCAmJiBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLkRFUFRIX0NPTVBPTkVOVCApIHsKCgkJCQkJLy8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlCgkJCQkJLy8gREVQVEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9JTlQKCQkJCQkvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLykKCQkJCQlpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7CgoJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApOwoKCQkJCQkJdGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CgkJCQkJCWdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCS8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXQKCQkJCS8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKQoJCQkJaWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgewoKCQkJCQlpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9TVEVOQ0lMOwoKCQkJCQkvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmUKCQkJCQkvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9JTlRfMjRfOF9XRUJHTC4KCQkJCQkvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLykKCQkJCQlpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnQyNDhUeXBlICkgewoKCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkSW50MjQ4VHlwZSBmb3IgRGVwdGhTdGVuY2lsRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7CgoJCQkJCQl0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7CgkJCQkJCWdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBpbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApOwoKCQkJfSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkgewoKCQkJCS8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlCgkJCQkvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHMKCQkJCS8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVscwoKCQkJCWlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkgewoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJCW1pcG1hcCA9IG1pcG1hcHNbIGkgXTsKCQkJCQkJc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7CgoJCQkJCX0KCgkJCQkJdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKCgkJCQl9IGVsc2UgewoKCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTsKCgkJCQl9CgoJCQl9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKSB7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJCW1pcG1hcCA9IG1pcG1hcHNbIGkgXTsKCgkJCQkJaWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkgewoKCQkJCQkJaWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkgewoKCQkJCQkJCXN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTsKCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKScgKTsKCgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCgkJCQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQkvLyByZWd1bGFyIFRleHR1cmUgKGltYWdlLCB2aWRlbywgY2FudmFzKQoKCQkJCS8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlCgkJCQkvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHMKCQkJCS8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVscwoKCQkJCWlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkgewoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJCW1pcG1hcCA9IG1pcG1hcHNbIGkgXTsKCQkJCQkJc3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTsKCgkJCQkJfQoKCQkJCQl0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQgKTsKCgkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjsKCgkJCWlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTsKCgkJfQoKCQkvLyBSZW5kZXIgdGFyZ2V0cwoKCQkvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyCgkJZnVuY3Rpb24gc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQgKSB7CgoJCQl2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgKTsKCQkJdmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTsKCQkJc3RhdGUudGV4SW1hZ2UyRCggdGV4dHVyZVRhcmdldCwgMCwgZ2xGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApOwoJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7CgkJCV9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApOwoJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTsKCgkJfQoKCQkvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlcgoJCWZ1bmN0aW9uIHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7CgoJCQlfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7CgoJCQlpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiAhIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkgewoKCQkJCV9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoJCQkJX2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTsKCgkJCX0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHsKCgkJCQlfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoJCQkJX2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApOwoKCQkJfSBlbHNlIHsKCgkJCQkvLyBGSVhNRTogV2UgZG9uJ3Qgc3VwcG9ydCAhZGVwdGggIXN0ZW5jaWwKCQkJCV9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuUkdCQTQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoKCQkJfQoKCQkJX2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIG51bGwgKTsKCgkJfQoKCQkvLyBTZXR1cCByZXNvdXJjZXMgZm9yIGEgRGVwdGggVGV4dHVyZSBmb3IgYSBGQk8gKG5lZWRzIGFuIGV4dGVuc2lvbikKCQlmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHsKCgkJCXZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTsKCQkJaWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICdEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkJyApOwoKCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApOwoKCQkJaWYgKCAhICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSAmJiByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkgKSB7CgoJCQkJdGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTsKCgkJCX0KCgkJCS8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZQoJCQlpZiAoICEgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSB8fAoJCQkJCXJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fAoJCQkJCXJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0ICkgewoKCQkJCXJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7CgkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7CgkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCX0KCgkJCXNldFRleHR1cmUyRCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSwgMCApOwoKCQkJdmFyIHdlYmdsRGVwdGhUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTsKCgkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgewoKCQkJCV9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7CgoJCQl9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgewoKCQkJCV9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTsKCgkJCX0gZWxzZSB7CgoJCQkJdGhyb3cgbmV3IEVycm9yKCAnVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0JyApOwoKCQkJfQoKCQl9CgoJCS8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXIKCQlmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKSB7CgoJCQl2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTsKCgkJCXZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApOwoKCQkJaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkgewoKCQkJCWlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCAndGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMnICk7CgoJCQkJc2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTsKCgkJCX0gZWxzZSB7CgoJCQkJaWYgKCBpc0N1YmUgKSB7CgoJCQkJCXJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107CgoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgoJCQkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTsKCQkJCQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTsKCQkJCQkJc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTsKCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgoJCQkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTsKCQkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTsKCQkJCQlzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQgKTsKCgkJCQl9CgoJCQl9CgoJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTsKCgkJfQoKCQkvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldAoJCWZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7CgoJCQl2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTsKCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7CgoJCQlyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTsKCgkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKCgkJCWluZm9NZW1vcnkudGV4dHVyZXMgKys7CgoJCQl2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTsKCQkJdmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7CgoJCQkvLyBTZXR1cCBmcmFtZWJ1ZmZlcgoKCQkJaWYgKCBpc0N1YmUgKSB7CgoJCQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKCQkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwoKCQkJfQoKCQkJLy8gU2V0dXAgY29sb3IgYnVmZmVyCgoJCQlpZiAoIGlzQ3ViZSApIHsKCgkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CgkJCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKCQkJCQlzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpICk7CgoJCQkJfQoKCQkJCWlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQICk7CgkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIG51bGwgKTsKCgkJCX0gZWxzZSB7CgoJCQkJc3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoJCQkJc2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7CgkJCQlzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCApOwoKCQkJCWlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJEICk7CgkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIG51bGwgKTsKCgkJCX0KCgkJCS8vIFNldHVwIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnMKCgkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkgewoKCQkJCXNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkgewoKCQkJdmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTsKCQkJdmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7CgoJCQlpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7CgoJCQkJdmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7CgkJCQl2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTsKCgkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCB3ZWJnbFRleHR1cmUgKTsKCQkJCV9nbC5nZW5lcmF0ZU1pcG1hcCggdGFyZ2V0ICk7CgkJCQlzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCBudWxsICk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlcygpIHsKCgkJCWZvciAoIHZhciBpZCBpbiBfdmlkZW9UZXh0dXJlcyApIHsKCgkJCQlfdmlkZW9UZXh0dXJlc1sgaWQgXS51cGRhdGUoKTsKCgkJCX0KCgkJfQoKCQl0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDsKCQl0aGlzLnNldFRleHR1cmVDdWJlID0gc2V0VGV4dHVyZUN1YmU7CgkJdGhpcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMgPSBzZXRUZXh0dXJlQ3ViZUR5bmFtaWM7CgkJdGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0OwoJCXRoaXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwID0gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwOwoJCXRoaXMudXBkYXRlVmlkZW9UZXh0dXJlcyA9IHVwZGF0ZVZpZGVvVGV4dHVyZXM7CgoJfQoKCS8qKgoJICogQGF1dGhvciBmb3JkYWNpb3VzIC8gZm9yZGFjaW91cy5naXRodWIuaW8KCSAqLwoKCWZ1bmN0aW9uIFdlYkdMUHJvcGVydGllcygpIHsKCgkJdmFyIHByb3BlcnRpZXMgPSB7fTsKCgkJZnVuY3Rpb24gZ2V0KCBvYmplY3QgKSB7CgoJCQl2YXIgdXVpZCA9IG9iamVjdC51dWlkOwoJCQl2YXIgbWFwID0gcHJvcGVydGllc1sgdXVpZCBdOwoKCQkJaWYgKCBtYXAgPT09IHVuZGVmaW5lZCApIHsKCgkJCQltYXAgPSB7fTsKCQkJCXByb3BlcnRpZXNbIHV1aWQgXSA9IG1hcDsKCgkJCX0KCgkJCXJldHVybiBtYXA7CgoJCX0KCgkJZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7CgoJCQlkZWxldGUgcHJvcGVydGllc1sgb2JqZWN0LnV1aWQgXTsKCgkJfQoKCQlmdW5jdGlvbiBjbGVhcigpIHsKCgkJCXByb3BlcnRpZXMgPSB7fTsKCgkJfQoKCQlyZXR1cm4gewoJCQlnZXQ6IGdldCwKCQkJcmVtb3ZlOiByZW1vdmUsCgkJCWNsZWFyOiBjbGVhcgoJCX07CgoJfQoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFdlYkdMU3RhdGUoIGdsLCBleHRlbnNpb25zLCB1dGlscyApIHsKCgkJZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7CgoJCQl2YXIgbG9ja2VkID0gZmFsc2U7CgoJCQl2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpOwoJCQl2YXIgY3VycmVudENvbG9yTWFzayA9IG51bGw7CgkJCXZhciBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7CgoJCQlyZXR1cm4gewoKCQkJCXNldE1hc2s6IGZ1bmN0aW9uICggY29sb3JNYXNrICkgewoKCQkJCQlpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHsKCgkJCQkJCWdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7CgkJCQkJCWN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7CgoJCQkJCX0KCgkJCQl9LAoKCQkJCXNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkgewoKCQkJCQlsb2NrZWQgPSBsb2NrOwoKCQkJCX0sCgoJCQkJc2V0Q2xlYXI6IGZ1bmN0aW9uICggciwgZywgYiwgYSwgcHJlbXVsdGlwbGllZEFscGhhICkgewoKCQkJCQlpZiAoIHByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIHsKCgkJCQkJCXIgKj0gYTsgZyAqPSBhOyBiICo9IGE7CgoJCQkJCX0KCgkJCQkJY29sb3Iuc2V0KCByLCBnLCBiLCBhICk7CgoJCQkJCWlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHsKCgkJCQkJCWdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTsKCQkJCQkJY3VycmVudENvbG9yQ2xlYXIuY29weSggY29sb3IgKTsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJcmVzZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQkJbG9ja2VkID0gZmFsc2U7CgoJCQkJCWN1cnJlbnRDb2xvck1hc2sgPSBudWxsOwoJCQkJCWN1cnJlbnRDb2xvckNsZWFyLnNldCggLSAxLCAwLCAwLCAwICk7IC8vIHNldCB0byBpbnZhbGlkIHN0YXRlCgoJCQkJfQoKCQkJfTsKCgkJfQoKCQlmdW5jdGlvbiBEZXB0aEJ1ZmZlcigpIHsKCgkJCXZhciBsb2NrZWQgPSBmYWxzZTsKCgkJCXZhciBjdXJyZW50RGVwdGhNYXNrID0gbnVsbDsKCQkJdmFyIGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsOwoJCQl2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsOwoKCQkJcmV0dXJuIHsKCgkJCQlzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHsKCgkJCQkJaWYgKCBkZXB0aFRlc3QgKSB7CgoJCQkJCQllbmFibGUoIGdsLkRFUFRIX1RFU1QgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJc2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7CgoJCQkJCWlmICggY3VycmVudERlcHRoTWFzayAhPT0gZGVwdGhNYXNrICYmICEgbG9ja2VkICkgewoKCQkJCQkJZ2wuZGVwdGhNYXNrKCBkZXB0aE1hc2sgKTsKCQkJCQkJY3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzazsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJc2V0RnVuYzogZnVuY3Rpb24gKCBkZXB0aEZ1bmMgKSB7CgoJCQkJCWlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkgewoKCQkJCQkJaWYgKCBkZXB0aEZ1bmMgKSB7CgoJCQkJCQkJc3dpdGNoICggZGVwdGhGdW5jICkgewoKCQkJCQkJCQljYXNlIE5ldmVyRGVwdGg6CgoJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7CgkJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCQljYXNlIEFsd2F5c0RlcHRoOgoKCQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5BTFdBWVMgKTsKCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCWNhc2UgTGVzc0RlcHRoOgoKCQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7CgkJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCQljYXNlIExlc3NFcXVhbERlcHRoOgoKCQkJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTsKCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCWNhc2UgRXF1YWxEZXB0aDoKCgkJCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wuRVFVQUwgKTsKCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCWNhc2UgR3JlYXRlckVxdWFsRGVwdGg6CgoJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApOwoJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJY2FzZSBHcmVhdGVyRGVwdGg6CgoJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTsKCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCWNhc2UgTm90RXF1YWxEZXB0aDoKCgkJCQkJCQkJCWdsLmRlcHRoRnVuYyggZ2wuTk9URVFVQUwgKTsKCQkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJCWRlZmF1bHQ6CgoJCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApOwoKCQkJCQkJCX0KCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJZ2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTsKCgkJCQkJCX0KCgkJCQkJCWN1cnJlbnREZXB0aEZ1bmMgPSBkZXB0aEZ1bmM7CgoJCQkJCX0KCgkJCQl9LAoKCQkJCXNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkgewoKCQkJCQlsb2NrZWQgPSBsb2NrOwoKCQkJCX0sCgoJCQkJc2V0Q2xlYXI6IGZ1bmN0aW9uICggZGVwdGggKSB7CgoJCQkJCWlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkgewoKCQkJCQkJZ2wuY2xlYXJEZXB0aCggZGVwdGggKTsKCQkJCQkJY3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJcmVzZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQkJbG9ja2VkID0gZmFsc2U7CgoJCQkJCWN1cnJlbnREZXB0aE1hc2sgPSBudWxsOwoJCQkJCWN1cnJlbnREZXB0aEZ1bmMgPSBudWxsOwoJCQkJCWN1cnJlbnREZXB0aENsZWFyID0gbnVsbDsKCgkJCQl9CgoJCQl9OwoKCQl9CgoJCWZ1bmN0aW9uIFN0ZW5jaWxCdWZmZXIoKSB7CgoJCQl2YXIgbG9ja2VkID0gZmFsc2U7CgoJCQl2YXIgY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDsKCQkJdmFyIGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7CgkJCXZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7CgkJCXZhciBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDsKCQkJdmFyIGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7CgkJCXZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDsKCQkJdmFyIGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsOwoJCQl2YXIgY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7CgoJCQlyZXR1cm4gewoKCQkJCXNldFRlc3Q6IGZ1bmN0aW9uICggc3RlbmNpbFRlc3QgKSB7CgoJCQkJCWlmICggc3RlbmNpbFRlc3QgKSB7CgoJCQkJCQllbmFibGUoIGdsLlNURU5DSUxfVEVTVCApOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7CgoJCQkJCX0KCgkJCQl9LAoKCQkJCXNldE1hc2s6IGZ1bmN0aW9uICggc3RlbmNpbE1hc2sgKSB7CgoJCQkJCWlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHsKCgkJCQkJCWdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApOwoJCQkJCQljdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzazsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJc2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7CgoJCQkJCWlmICggY3VycmVudFN0ZW5jaWxGdW5jICE9PSBzdGVuY2lsRnVuYyB8fAoJCQkJCSAgICAgY3VycmVudFN0ZW5jaWxSZWYgCSE9PSBzdGVuY2lsUmVmIAl8fAoJCQkJCSAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7CgoJCQkJCQlnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7CgoJCQkJCQljdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYzsKCQkJCQkJY3VycmVudFN0ZW5jaWxSZWYgPSBzdGVuY2lsUmVmOwoJCQkJCQljdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7CgoJCQkJCX0KCgkJCQl9LAoKCQkJCXNldE9wOiBmdW5jdGlvbiAoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHsKCgkJCQkJaWYgKCBjdXJyZW50U3RlbmNpbEZhaWwJICE9PSBzdGVuY2lsRmFpbCAJfHwKCQkJCQkgICAgIGN1cnJlbnRTdGVuY2lsWkZhaWwgIT09IHN0ZW5jaWxaRmFpbCB8fAoJCQkJCSAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkgewoKCQkJCQkJZ2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTsKCgkJCQkJCWN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsOwoJCQkJCQljdXJyZW50U3RlbmNpbFpGYWlsID0gc3RlbmNpbFpGYWlsOwoJCQkJCQljdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzOwoKCQkJCQl9CgoJCQkJfSwKCgkJCQlzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHsKCgkJCQkJbG9ja2VkID0gbG9jazsKCgkJCQl9LAoKCQkJCXNldENsZWFyOiBmdW5jdGlvbiAoIHN0ZW5jaWwgKSB7CgoJCQkJCWlmICggY3VycmVudFN0ZW5jaWxDbGVhciAhPT0gc3RlbmNpbCApIHsKCgkJCQkJCWdsLmNsZWFyU3RlbmNpbCggc3RlbmNpbCApOwoJCQkJCQljdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJcmVzZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQkJbG9ja2VkID0gZmFsc2U7CgoJCQkJCWN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7CgkJCQkJY3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDsKCQkJCQljdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7CgkJCQkJY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7CgkJCQkJY3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDsKCQkJCQljdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDsKCQkJCQljdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDsKCQkJCQljdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDsKCgkJCQl9CgoJCQl9OwoKCQl9CgoJCS8vCgoJCXZhciBjb2xvckJ1ZmZlciA9IG5ldyBDb2xvckJ1ZmZlcigpOwoJCXZhciBkZXB0aEJ1ZmZlciA9IG5ldyBEZXB0aEJ1ZmZlcigpOwoJCXZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTsKCgkJdmFyIG1heFZlcnRleEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApOwoJCXZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTsKCQl2YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApOwoJCXZhciBhdHRyaWJ1dGVEaXZpc29ycyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7CgoJCXZhciBjYXBhYmlsaXRpZXMgPSB7fTsKCgkJdmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7CgoJCXZhciBjdXJyZW50UHJvZ3JhbSA9IG51bGw7CgoJCXZhciBjdXJyZW50QmxlbmRpbmcgPSBudWxsOwoJCXZhciBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7CgkJdmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CgkJdmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7CgkJdmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsOwoJCXZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7CgkJdmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDsKCQl2YXIgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7CgoJCXZhciBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDsKCQl2YXIgY3VycmVudEN1bGxGYWNlID0gbnVsbDsKCgkJdmFyIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsOwoKCQl2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsOwoJCXZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDsKCgkJdmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApOwoKCQl2YXIgdmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eV2ViR0xcIChbMC05XSkvLmV4ZWMoIGdsLmdldFBhcmFtZXRlciggZ2wuVkVSU0lPTiApIClbIDEgXSApOwoJCXZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBwYXJzZUZsb2F0KCB2ZXJzaW9uICkgPj0gMS4wOwoKCQl2YXIgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDsKCQl2YXIgY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTsKCgkJdmFyIGN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTsKCQl2YXIgY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTsKCgkJZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBjb3VudCApIHsKCgkJCXZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBpcyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC4KCQkJdmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CgoJCQlnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApOwoJCQlnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QgKTsKCQkJZ2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHsKCgkJCQlnbC50ZXhJbWFnZTJEKCB0YXJnZXQgKyBpLCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7CgoJCQl9CgoJCQlyZXR1cm4gdGV4dHVyZTsKCgkJfQoKCQl2YXIgZW1wdHlUZXh0dXJlcyA9IHt9OwoJCWVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfMkQgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfMkQsIDEgKTsKCQllbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFX0NVQkVfTUFQIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsIDYgKTsKCgkJLy8gaW5pdAoKCQljb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApOwoJCWRlcHRoQnVmZmVyLnNldENsZWFyKCAxICk7CgkJc3RlbmNpbEJ1ZmZlci5zZXRDbGVhciggMCApOwoKCQllbmFibGUoIGdsLkRFUFRIX1RFU1QgKTsKCQlkZXB0aEJ1ZmZlci5zZXRGdW5jKCBMZXNzRXF1YWxEZXB0aCApOwoKCQlzZXRGbGlwU2lkZWQoIGZhbHNlICk7CgkJc2V0Q3VsbEZhY2UoIEN1bGxGYWNlQmFjayApOwoJCWVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CgoJCWVuYWJsZSggZ2wuQkxFTkQgKTsKCQlzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTsKCgkJLy8KCgkJZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJbmV3QXR0cmlidXRlc1sgaSBdID0gMDsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHsKCgkJCW5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTsKCgkJCWlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkgewoKCQkJCWdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTsKCQkJCWVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7CgoJCQl9CgoJCQlpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gMCApIHsKCgkJCQl2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOwoKCQkJCWV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApOwoJCQkJYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gMDsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7CgoJCQluZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7CgoJCQlpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHsKCgkJCQlnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7CgkJCQllbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxOwoKCQkJfQoKCQkJaWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IG1lc2hQZXJBdHRyaWJ1dGUgKSB7CgoJCQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKCgkJCQlleHRlbnNpb24udmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKTsKCQkJCWF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IG1lc2hQZXJBdHRyaWJ1dGU7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKSB7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgIT09IGw7ICsrIGkgKSB7CgoJCQkJaWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7CgoJCQkJCWdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApOwoJCQkJCWVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwOwoKCQkJCX0KCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBlbmFibGUoIGlkICkgewoKCQkJaWYgKCBjYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7CgoJCQkJZ2wuZW5hYmxlKCBpZCApOwoJCQkJY2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHsKCgkJCWlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9PSBmYWxzZSApIHsKCgkJCQlnbC5kaXNhYmxlKCBpZCApOwoJCQkJY2FwYWJpbGl0aWVzWyBpZCBdID0gZmFsc2U7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkgewoKCQkJaWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7CgoJCQkJY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gW107CgoJCQkJaWYgKCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fAoJCQkJICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8CgkJCQkgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICkgKSB7CgoJCQkJCXZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApOwoKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSArKyApIHsKCgkJCQkJCWNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cy5wdXNoKCBmb3JtYXRzWyBpIF0gKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM7CgoJCX0KCgkJZnVuY3Rpb24gdXNlUHJvZ3JhbSggcHJvZ3JhbSApIHsKCgkJCWlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7CgoJCQkJZ2wudXNlUHJvZ3JhbSggcHJvZ3JhbSApOwoKCQkJCWN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTsKCgkJCQlyZXR1cm4gdHJ1ZTsKCgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCgkJfQoKCQlmdW5jdGlvbiBzZXRCbGVuZGluZyggYmxlbmRpbmcsIGJsZW5kRXF1YXRpb24sIGJsZW5kU3JjLCBibGVuZERzdCwgYmxlbmRFcXVhdGlvbkFscGhhLCBibGVuZFNyY0FscGhhLCBibGVuZERzdEFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CgoJCQlpZiAoIGJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkgewoKCQkJCWVuYWJsZSggZ2wuQkxFTkQgKTsKCgkJCX0gZWxzZSB7CgoJCQkJZGlzYWJsZSggZ2wuQkxFTkQgKTsKCgkJCX0KCgkJCWlmICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkgewoKCQkJCWlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHsKCgkJCQkJc3dpdGNoICggYmxlbmRpbmcgKSB7CgoJCQkJCQljYXNlIEFkZGl0aXZlQmxlbmRpbmc6CgoJCQkJCQkJaWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7CgoJCQkJCQkJCWdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CgkJCQkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSApOwoKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCWdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7CgkJCQkJCQkJZ2wuYmxlbmRGdW5jKCBnbC5TUkNfQUxQSEEsIGdsLk9ORSApOwoKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOgoKCQkJCQkJCWlmICggcHJlbXVsdGlwbGllZEFscGhhICkgewoKCQkJCQkJCQlnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApOwoJCQkJCQkJCWdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7CgoJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJZ2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTsKCQkJCQkJCQlnbC5ibGVuZEZ1bmMoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IgKTsKCgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgTXVsdGlwbHlCbGVuZGluZzoKCgkJCQkJCQlpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHsKCgkJCQkJCQkJZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTsKCQkJCQkJCQlnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTsKCgkJCQkJCQl9IGVsc2UgewoKCQkJCQkJCQlnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApOwoJCQkJCQkJCWdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SICk7CgoJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgoJCQkJCQlkZWZhdWx0OgoKCQkJCQkJCWlmICggcHJlbXVsdGlwbGllZEFscGhhICkgewoKCQkJCQkJCQlnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApOwoJCQkJCQkJCWdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApOwoKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCWdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7CgkJCQkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7CgoJCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCWN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDsKCQkJCWN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CgkJCQljdXJyZW50QmxlbmREc3QgPSBudWxsOwoJCQkJY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7CgkJCQljdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7CgkJCQljdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7CgoJCQl9IGVsc2UgewoKCQkJCWJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uOwoJCQkJYmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxlbmRTcmM7CgkJCQlibGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYSB8fCBibGVuZERzdDsKCgkJCQlpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHsKCgkJCQkJZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCB1dGlscy5jb252ZXJ0KCBibGVuZEVxdWF0aW9uICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb25BbHBoYSApICk7CgoJCQkJCWN1cnJlbnRCbGVuZEVxdWF0aW9uID0gYmxlbmRFcXVhdGlvbjsKCQkJCQljdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhOwoKCQkJCX0KCgkJCQlpZiAoIGJsZW5kU3JjICE9PSBjdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IGN1cnJlbnRCbGVuZERzdCB8fCBibGVuZFNyY0FscGhhICE9PSBjdXJyZW50QmxlbmRTcmNBbHBoYSB8fCBibGVuZERzdEFscGhhICE9PSBjdXJyZW50QmxlbmREc3RBbHBoYSApIHsKCgkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0ICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjQWxwaGEgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3RBbHBoYSApICk7CgoJCQkJCWN1cnJlbnRCbGVuZFNyYyA9IGJsZW5kU3JjOwoJCQkJCWN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0OwoJCQkJCWN1cnJlbnRCbGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYTsKCQkJCQljdXJyZW50QmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGE7CgoJCQkJfQoKCQkJfQoKCQkJY3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7CgkJCWN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTsKCgkJfQoKCQlmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkgewoKCQkJbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZQoJCQkJPyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKQoJCQkJOiBlbmFibGUoIGdsLkNVTExfRkFDRSApOwoKCQkJdmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTsKCQkJaWYgKCBmcm9udEZhY2VDVyApIGZsaXBTaWRlZCA9ICEgZmxpcFNpZGVkOwoKCQkJc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKTsKCgkJCW1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlCgkJCQk/IHNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApCgkJCQk6IHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7CgoJCQlkZXB0aEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5kZXB0aEZ1bmMgKTsKCQkJZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7CgkJCWRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTsKCQkJY29sb3JCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApOwoKCQkJc2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7CgoJCX0KCgkJLy8KCgkJZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7CgoJCQlpZiAoIGN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHsKCgkJCQlpZiAoIGZsaXBTaWRlZCApIHsKCgkJCQkJZ2wuZnJvbnRGYWNlKCBnbC5DVyApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCWdsLmZyb250RmFjZSggZ2wuQ0NXICk7CgoJCQkJfQoKCQkJCWN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkgewoKCQkJaWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkgewoKCQkJCWVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7CgoJCQkJaWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkgewoKCQkJCQlpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7CgoJCQkJCQlnbC5jdWxsRmFjZSggZ2wuQkFDSyApOwoKCQkJCQl9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCApIHsKCgkJCQkJCWdsLmN1bGxGYWNlKCBnbC5GUk9OVCApOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJZ2wuY3VsbEZhY2UoIGdsLkZST05UX0FORF9CQUNLICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCWRpc2FibGUoIGdsLkNVTExfRkFDRSApOwoKCQkJfQoKCQkJY3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7CgoJCX0KCgkJZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHsKCgkJCWlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7CgoJCQkJaWYgKCBsaW5lV2lkdGhBdmFpbGFibGUgKSBnbC5saW5lV2lkdGgoIHdpZHRoICk7CgoJCQkJY3VycmVudExpbmVXaWR0aCA9IHdpZHRoOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7CgoJCQlpZiAoIHBvbHlnb25PZmZzZXQgKSB7CgoJCQkJZW5hYmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7CgoJCQkJaWYgKCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuaXRzICkgewoKCQkJCQlnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7CgoJCQkJCWN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yOwoJCQkJCWN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0czsKCgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCWRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBzZXRTY2lzc29yVGVzdCggc2Npc3NvclRlc3QgKSB7CgoJCQlpZiAoIHNjaXNzb3JUZXN0ICkgewoKCQkJCWVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7CgoJCQl9IGVsc2UgewoKCQkJCWRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApOwoKCQkJfQoKCQl9CgoJCS8vIHRleHR1cmUKCgkJZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkgewoKCQkJaWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxOwoKCQkJaWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHsKCgkJCQlnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTsKCQkJCWN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgKSB7CgoJCQlpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCA9PT0gbnVsbCApIHsKCgkJCQlhY3RpdmVUZXh0dXJlKCk7CgoJCQl9CgoJCQl2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdOwoKCQkJaWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHsKCgkJCQlib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07CgkJCQljdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3VuZFRleHR1cmU7CgoJCQl9CgoJCQlpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUgfHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHsKCgkJCQlnbC5iaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgfHwgZW1wdHlUZXh0dXJlc1sgd2ViZ2xUeXBlIF0gKTsKCgkJCQlib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTsKCQkJCWJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkgewoKCQkJdHJ5IHsKCgkJCQlnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApOwoKCQkJfSBjYXRjaCAoIGVycm9yICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gdGV4SW1hZ2UyRCgpIHsKCgkJCXRyeSB7CgoJCQkJZ2wudGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApOwoKCQkJfSBjYXRjaCAoIGVycm9yICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7CgoJCQl9CgoJCX0KCgkJLy8KCgkJZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHsKCgkJCWlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkgewoKCQkJCWdsLnNjaXNzb3IoIHNjaXNzb3IueCwgc2Npc3Nvci55LCBzY2lzc29yLnosIHNjaXNzb3IudyApOwoJCQkJY3VycmVudFNjaXNzb3IuY29weSggc2Npc3NvciApOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHZpZXdwb3J0KCB2aWV3cG9ydCApIHsKCgkJCWlmICggY3VycmVudFZpZXdwb3J0LmVxdWFscyggdmlld3BvcnQgKSA9PT0gZmFsc2UgKSB7CgoJCQkJZ2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTsKCQkJCWN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApOwoKCQkJfQoKCQl9CgoJCS8vCgoJCWZ1bmN0aW9uIHJlc2V0KCkgewoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkgewoKCQkJCWlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9PT0gMSApIHsKCgkJCQkJZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7CgkJCQkJZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7CgoJCQkJfQoKCQkJfQoKCQkJY2FwYWJpbGl0aWVzID0ge307CgoJCQljb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsOwoKCQkJY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDsKCQkJY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTsKCgkJCWN1cnJlbnRQcm9ncmFtID0gbnVsbDsKCgkJCWN1cnJlbnRCbGVuZGluZyA9IG51bGw7CgoJCQljdXJyZW50RmxpcFNpZGVkID0gbnVsbDsKCQkJY3VycmVudEN1bGxGYWNlID0gbnVsbDsKCgkJCWNvbG9yQnVmZmVyLnJlc2V0KCk7CgkJCWRlcHRoQnVmZmVyLnJlc2V0KCk7CgkJCXN0ZW5jaWxCdWZmZXIucmVzZXQoKTsKCgkJfQoKCQlyZXR1cm4gewoKCQkJYnVmZmVyczogewoJCQkJY29sb3I6IGNvbG9yQnVmZmVyLAoJCQkJZGVwdGg6IGRlcHRoQnVmZmVyLAoJCQkJc3RlbmNpbDogc3RlbmNpbEJ1ZmZlcgoJCQl9LAoKCQkJaW5pdEF0dHJpYnV0ZXM6IGluaXRBdHRyaWJ1dGVzLAoJCQllbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSwKCQkJZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjogZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciwKCQkJZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6IGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzLAoJCQllbmFibGU6IGVuYWJsZSwKCQkJZGlzYWJsZTogZGlzYWJsZSwKCQkJZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMsCgoJCQl1c2VQcm9ncmFtOiB1c2VQcm9ncmFtLAoKCQkJc2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLAoJCQlzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsCgoJCQlzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCwKCQkJc2V0Q3VsbEZhY2U6IHNldEN1bGxGYWNlLAoKCQkJc2V0TGluZVdpZHRoOiBzZXRMaW5lV2lkdGgsCgkJCXNldFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsCgoJCQlzZXRTY2lzc29yVGVzdDogc2V0U2Npc3NvclRlc3QsCgoJCQlhY3RpdmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLAoJCQliaW5kVGV4dHVyZTogYmluZFRleHR1cmUsCgkJCWNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCwKCQkJdGV4SW1hZ2UyRDogdGV4SW1hZ2UyRCwKCgkJCXNjaXNzb3I6IHNjaXNzb3IsCgkJCXZpZXdwb3J0OiB2aWV3cG9ydCwKCgkJCXJlc2V0OiByZXNldAoKCQl9OwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7CgoJCXZhciBtYXhBbmlzb3Ryb3B5OwoKCQlmdW5jdGlvbiBnZXRNYXhBbmlzb3Ryb3B5KCkgewoKCQkJaWYgKCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTsKCgkJCXZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTsKCgkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgewoKCQkJCW1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTsKCgkJCX0gZWxzZSB7CgoJCQkJbWF4QW5pc290cm9weSA9IDA7CgoJCQl9CgoJCQlyZXR1cm4gbWF4QW5pc290cm9weTsKCgkJfQoKCQlmdW5jdGlvbiBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApIHsKCgkJCWlmICggcHJlY2lzaW9uID09PSAnaGlnaHAnICkgewoKCQkJCWlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJgoJCQkJICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7CgoJCQkJCXJldHVybiAnaGlnaHAnOwoKCQkJCX0KCgkJCQlwcmVjaXNpb24gPSAnbWVkaXVtcCc7CgoJCQl9CgoJCQlpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkgewoKCQkJCWlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmCgkJCQkgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICkgewoKCQkJCQlyZXR1cm4gJ21lZGl1bXAnOwoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiAnbG93cCc7CgoJCX0KCgkJdmFyIHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7CgkJdmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7CgoJCWlmICggbWF4UHJlY2lzaW9uICE9PSBwcmVjaXNpb24gKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOicsIHByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgbWF4UHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7CgkJCXByZWNpc2lvbiA9IG1heFByZWNpc2lvbjsKCgkJfQoKCQl2YXIgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZTsKCgkJdmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApOwoJCXZhciBtYXhWZXJ0ZXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7CgkJdmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7CgkJdmFyIG1heEN1YmVtYXBTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICk7CgoJCXZhciBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTsKCQl2YXIgbWF4VmVydGV4VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICk7CgkJdmFyIG1heFZhcnlpbmdzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkFSWUlOR19WRUNUT1JTICk7CgkJdmFyIG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKTsKCgkJdmFyIHZlcnRleFRleHR1cmVzID0gbWF4VmVydGV4VGV4dHVyZXMgPiAwOwoJCXZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApOwoJCXZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxvYXRGcmFnbWVudFRleHR1cmVzOwoKCQlyZXR1cm4gewoKCQkJZ2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSwKCQkJZ2V0TWF4UHJlY2lzaW9uOiBnZXRNYXhQcmVjaXNpb24sCgoJCQlwcmVjaXNpb246IHByZWNpc2lvbiwKCQkJbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciwKCgkJCW1heFRleHR1cmVzOiBtYXhUZXh0dXJlcywKCQkJbWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLAoJCQltYXhUZXh0dXJlU2l6ZTogbWF4VGV4dHVyZVNpemUsCgkJCW1heEN1YmVtYXBTaXplOiBtYXhDdWJlbWFwU2l6ZSwKCgkJCW1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsCgkJCW1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3JtcywKCQkJbWF4VmFyeWluZ3M6IG1heFZhcnlpbmdzLAoJCQltYXhGcmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLAoKCQkJdmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLAoJCQlmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcywKCQkJZmxvYXRWZXJ0ZXhUZXh0dXJlczogZmxvYXRWZXJ0ZXhUZXh0dXJlcwoKCQl9OwoKCX0KCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGdyZWdnbWFuIC8gaHR0cDovL2dhbWVzLmdyZWdnbWFuLmNvbS8KCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKCSAqIEBhdXRob3IgdHNjaHcKCSAqLwoKCWZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkgewoKCQlDYW1lcmEuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnOwoKCQl0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7CgkJdGhpcy56b29tID0gMTsKCgkJdGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZpbmVkID8gbmVhciA6IDAuMTsKCQl0aGlzLmZhciA9IGZhciAhPT0gdW5kZWZpbmVkID8gZmFyIDogMjAwMDsKCQl0aGlzLmZvY3VzID0gMTA7CgoJCXRoaXMuYXNwZWN0ID0gYXNwZWN0ICE9PSB1bmRlZmluZWQgPyBhc3BlY3QgOiAxOwoJCXRoaXMudmlldyA9IG51bGw7CgoJCXRoaXMuZmlsbUdhdWdlID0gMzU7CS8vIHdpZHRoIG9mIHRoZSBmaWxtIChkZWZhdWx0IGluIG1pbGxpbWV0ZXJzKQoJCXRoaXMuZmlsbU9mZnNldCA9IDA7CS8vIGhvcml6b250YWwgZmlsbSBvZmZzZXQgKHNhbWUgdW5pdCBhcyBnYXVnZSkKCgkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CgoJfQoKCVBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsCgoJCWlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CgoJCQlDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTsKCgkJCXRoaXMuZm92ID0gc291cmNlLmZvdjsKCQkJdGhpcy56b29tID0gc291cmNlLnpvb207CgoJCQl0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjsKCQkJdGhpcy5mYXIgPSBzb3VyY2UuZmFyOwoJCQl0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzOwoKCQkJdGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0OwoJCQl0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTsKCgkJCXRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTsKCQkJdGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJLyoqCgkJICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuCgkJICoKCQkgKiBUaGUgZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBmb3IKCQkgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS4KCQkgKgoJCSAqIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUgc2FtZSB1bml0LgoJCSAqLwoJCXNldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoICkgewoKCQkJLy8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sCgkJCXZhciB2RXh0ZW50U2xvcGUgPSAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIGZvY2FsTGVuZ3RoOwoKCQkJdGhpcy5mb3YgPSBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7CgkJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKCQl9LAoKCQkvKioKCQkgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLgoJCSAqLwoJCWdldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdkV4dGVudFNsb3BlID0gTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApOwoKCQkJcmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlOwoKCQl9LAoKCQlnZXRFZmZlY3RpdmVGT1Y6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbigKCQkJCU1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApOwoKCQl9LAoKCQlnZXRGaWxtV2lkdGg6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBwb3J0cmFpdCBmb3JtYXQgKGFzcGVjdCA8IDEpCgkJCXJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApOwoKCQl9LAoKCQlnZXRGaWxtSGVpZ2h0OiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZvcm1hdCAoYXNwZWN0ID4gMSkKCQkJcmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7CgoJCX0sCgoJCS8qKgoJCSAqIFNldHMgYW4gb2Zmc2V0IGluIGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVsIGZvciBtdWx0aS13aW5kb3cgb3IKCQkgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLgoJCSAqCgkJICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIDN4MiBtb25pdG9ycyBhbmQgZWFjaCBtb25pdG9yIGlzIDE5MjB4MTA4MCBhbmQKCQkgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzCgkJICoKCQkgKiAgICstLS0rLS0tKy0tLSsKCQkgKiAgIHwgQSB8IEIgfCBDIHwKCQkgKiAgICstLS0rLS0tKy0tLSsKCQkgKiAgIHwgRCB8IEUgfCBGIHwKCQkgKiAgICstLS0rLS0tKy0tLSsKCQkgKgoJCSAqIHRoZW4gZm9yIGVhY2ggbW9uaXRvciB5b3Ugd291bGQgY2FsbCBpdCBsaWtlIHRoaXMKCQkgKgoJCSAqICAgdmFyIHcgPSAxOTIwOwoJCSAqICAgdmFyIGggPSAxMDgwOwoJCSAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzOwoJCSAqICAgdmFyIGZ1bGxIZWlnaHQgPSBoICogMjsKCQkgKgoJCSAqICAgLS1BLS0KCQkgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7CgkJICogICAtLUItLQoJCSAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTsKCQkgKiAgIC0tQy0tCgkJICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMCwgdywgaCApOwoJCSAqICAgLS1ELS0KCQkgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3LCBoICk7CgkJICogICAtLUUtLQoJCSAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTsKCQkgKiAgIC0tRi0tCgkJICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMSwgdywgaCApOwoJCSAqCgkJICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLgoJCSAqLwoJCXNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkgewoKCQkJdGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0OwoKCQkJaWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7CgoJCQkJdGhpcy52aWV3ID0gewoJCQkJCWVuYWJsZWQ6IHRydWUsCgkJCQkJZnVsbFdpZHRoOiAxLAoJCQkJCWZ1bGxIZWlnaHQ6IDEsCgkJCQkJb2Zmc2V0WDogMCwKCQkJCQlvZmZzZXRZOiAwLAoJCQkJCXdpZHRoOiAxLAoJCQkJCWhlaWdodDogMQoJCQkJfTsKCgkJCX0KCgkJCXRoaXMudmlldy5lbmFibGVkID0gdHJ1ZTsKCQkJdGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDsKCQkJdGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0OwoJCQl0aGlzLnZpZXcub2Zmc2V0WCA9IHg7CgkJCXRoaXMudmlldy5vZmZzZXRZID0geTsKCQkJdGhpcy52aWV3LndpZHRoID0gd2lkdGg7CgkJCXRoaXMudmlldy5oZWlnaHQgPSBoZWlnaHQ7CgoJCQl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCgkJfSwKCgkJY2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlOwoKCQkJfQoKCQkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CgoJCX0sCgoJCXVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBuZWFyID0gdGhpcy5uZWFyLAoJCQkJdG9wID0gbmVhciAqIE1hdGgudGFuKAoJCQkJCV9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLAoJCQkJaGVpZ2h0ID0gMiAqIHRvcCwKCQkJCXdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsCgkJCQlsZWZ0ID0gLSAwLjUgKiB3aWR0aCwKCQkJCXZpZXcgPSB0aGlzLnZpZXc7CgoJCQlpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHsKCgkJCQl2YXIgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsCgkJCQkJZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDsKCgkJCQlsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoOwoJCQkJdG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7CgkJCQl3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoOwoJCQkJaGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDsKCgkJCX0KCgkJCXZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0OwoJCQlpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTsKCgkJCXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIGxlZnQgKyB3aWR0aCwgdG9wLCB0b3AgLSBoZWlnaHQsIG5lYXIsIHRoaXMuZmFyICk7CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgewoKCQkJdmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKCgkJCWRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92OwoJCQlkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tOwoKCQkJZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsKCQkJZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7CgkJCWRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1czsKCgkJCWRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0OwoKCQkJaWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApOwoKCQkJZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7CgkJCWRhdGEub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQ7CgoJCQlyZXR1cm4gZGF0YTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBBcnJheUNhbWVyYSggYXJyYXkgKSB7CgoJCVBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy5jYW1lcmFzID0gYXJyYXkgfHwgW107CgoJfQoKCUFycmF5Q2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSwKCgkJaXNBcnJheUNhbWVyYTogdHJ1ZQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBXZWJWUk1hbmFnZXIoIHJlbmRlcmVyICkgewoKCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQl2YXIgZGV2aWNlID0gbnVsbDsKCQl2YXIgZnJhbWVEYXRhID0gbnVsbDsKCgkJdmFyIHBvc2VUYXJnZXQgPSBudWxsOwoKCQlpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICdWUkZyYW1lRGF0YScgaW4gd2luZG93ICkgewoKCQkJZnJhbWVEYXRhID0gbmV3IHdpbmRvdy5WUkZyYW1lRGF0YSgpOwoKCQl9CgoJCXZhciBtYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpOwoKCQl2YXIgY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOwoJCWNhbWVyYUwuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuMCwgMC4wLCAwLjUsIDEuMCApOwoJCWNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApOwoKCQl2YXIgY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOwoJCWNhbWVyYVIuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApOwoJCWNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApOwoKCQl2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7CgkJY2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMSApOwoJCWNhbWVyYVZSLmxheWVycy5lbmFibGUoIDIgKTsKCgkJLy8KCgkJdmFyIGN1cnJlbnRTaXplLCBjdXJyZW50UGl4ZWxSYXRpbzsKCgkJZnVuY3Rpb24gb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlKCkgewoKCQkJaWYgKCBkZXZpY2UgIT09IG51bGwgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHsKCgkJCQl2YXIgZXllUGFyYW1ldGVycyA9IGRldmljZS5nZXRFeWVQYXJhbWV0ZXJzKCAnbGVmdCcgKTsKCQkJCXZhciByZW5kZXJXaWR0aCA9IGV5ZVBhcmFtZXRlcnMucmVuZGVyV2lkdGg7CgkJCQl2YXIgcmVuZGVySGVpZ2h0ID0gZXllUGFyYW1ldGVycy5yZW5kZXJIZWlnaHQ7CgoJCQkJY3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7CgkJCQljdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTsKCgkJCQlyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggcmVuZGVyV2lkdGggKiAyLCByZW5kZXJIZWlnaHQsIDEgKTsKCgkJCX0gZWxzZSBpZiAoIHNjb3BlLmVuYWJsZWQgKSB7CgoJCQkJcmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIGN1cnJlbnRTaXplLndpZHRoLCBjdXJyZW50U2l6ZS5oZWlnaHQsIGN1cnJlbnRQaXhlbFJhdGlvICk7CgoJCQl9CgoJCX0KCgkJaWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHsKCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSwgZmFsc2UgKTsKCgkJfQoKCQkvLwoKCQl0aGlzLmVuYWJsZWQgPSBmYWxzZTsKCgkJdGhpcy5nZXREZXZpY2UgPSBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gZGV2aWNlOwoKCQl9OwoKCQl0aGlzLnNldERldmljZSA9IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSBkZXZpY2UgPSB2YWx1ZTsKCgkJfTsKCgkJdGhpcy5zZXRQb3NlVGFyZ2V0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7CgoJCQlpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgcG9zZVRhcmdldCA9IG9iamVjdDsKCgkJfTsKCgkJdGhpcy5nZXRDYW1lcmEgPSBmdW5jdGlvbiAoIGNhbWVyYSApIHsKCgkJCWlmICggZGV2aWNlID09PSBudWxsICkgcmV0dXJuIGNhbWVyYTsKCgkJCWRldmljZS5kZXB0aE5lYXIgPSBjYW1lcmEubmVhcjsKCQkJZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjsKCgkJCWRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApOwoKCQkJLy8KCgkJCXZhciBwb3NlID0gZnJhbWVEYXRhLnBvc2U7CgkJCXZhciBwb3NlT2JqZWN0ID0gcG9zZVRhcmdldCAhPT0gbnVsbCA/IHBvc2VUYXJnZXQgOiBjYW1lcmE7CgoJCQlpZiAoIHBvc2UucG9zaXRpb24gIT09IG51bGwgKSB7CgoJCQkJcG9zZU9iamVjdC5wb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2UucG9zaXRpb24gKTsKCgkJCX0gZWxzZSB7CgoJCQkJcG9zZU9iamVjdC5wb3NpdGlvbi5zZXQoIDAsIDAsIDAgKTsKCgkJCX0KCgkJCWlmICggcG9zZS5vcmllbnRhdGlvbiAhPT0gbnVsbCApIHsKCgkJCQlwb3NlT2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBwb3NlLm9yaWVudGF0aW9uICk7CgoJCQl9CgoJCQlwb3NlT2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgoJCQlpZiAoIGRldmljZS5pc1ByZXNlbnRpbmcgPT09IGZhbHNlICkgcmV0dXJuIGNhbWVyYTsKCgkJCS8vCgoJCQljYW1lcmFMLm5lYXIgPSBjYW1lcmEubmVhcjsKCQkJY2FtZXJhUi5uZWFyID0gY2FtZXJhLm5lYXI7CgoJCQljYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7CgkJCWNhbWVyYVIuZmFyID0gY2FtZXJhLmZhcjsKCgkJCWNhbWVyYVZSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApOwoJCQljYW1lcmFWUi5tYXRyaXhXb3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOwoKCQkJY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFZpZXdNYXRyaXggKTsKCQkJY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7CgoJCQl2YXIgcGFyZW50ID0gcG9zZU9iamVjdC5wYXJlbnQ7CgoJCQlpZiAoIHBhcmVudCAhPT0gbnVsbCApIHsKCgkJCQltYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7CgoJCQkJY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIG1hdHJpeFdvcmxkSW52ZXJzZSApOwoJCQkJY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIG1hdHJpeFdvcmxkSW52ZXJzZSApOwoKCQkJfQoKCQkJLy8gZW52TWFwIGFuZCBNaXJyb3IgbmVlZHMgY2FtZXJhLm1hdHJpeFdvcmxkCgoJCQljYW1lcmFMLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlICk7CgkJCWNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UgKTsKCgkJCWNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApOwoJCQljYW1lcmFSLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRQcm9qZWN0aW9uTWF0cml4ICk7CgoJCQkvLyBIQUNLIEBtcmRvb2IKCQkJLy8gaHR0cHM6Ly9naXRodWIuY29tL3czYy93ZWJ2ci9pc3N1ZXMvMjAzCgoJCQljYW1lcmFWUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApOwoKCQkJLy8KCgkJCXZhciBsYXllcnMgPSBkZXZpY2UuZ2V0TGF5ZXJzKCk7CgoJCQlpZiAoIGxheWVycy5sZW5ndGggKSB7CgoJCQkJdmFyIGxheWVyID0gbGF5ZXJzWyAwIF07CgoJCQkJaWYgKCBsYXllci5sZWZ0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLmxlZnRCb3VuZHMubGVuZ3RoID09PSA0ICkgewoKCQkJCQljYW1lcmFMLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTsKCgkJCQl9CgoJCQkJaWYgKCBsYXllci5yaWdodEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5yaWdodEJvdW5kcy5sZW5ndGggPT09IDQgKSB7CgoJCQkJCWNhbWVyYVIuYm91bmRzLmZyb21BcnJheSggbGF5ZXIucmlnaHRCb3VuZHMgKTsKCgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gY2FtZXJhVlI7CgoJCX07CgoJCXRoaXMuc3VibWl0RnJhbWUgPSBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIGRldmljZSAmJiBkZXZpY2UuaXNQcmVzZW50aW5nICkgZGV2aWNlLnN1Ym1pdEZyYW1lKCk7CgoJCX07CgoJCXRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgKSB7CgoJCQkJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlICk7CgoJCQl9CgoJCX07CgoJfQoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wgKSB7CgoJCXZhciBleHRlbnNpb25zID0ge307CgoJCXJldHVybiB7CgoJCQlnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHsKCgkJCQlpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlyZXR1cm4gZXh0ZW5zaW9uc1sgbmFtZSBdOwoKCQkJCX0KCgkJCQl2YXIgZXh0ZW5zaW9uOwoKCQkJCXN3aXRjaCAoIG5hbWUgKSB7CgoJCQkJCWNhc2UgJ1dFQkdMX2RlcHRoX3RleHR1cmUnOgoJCQkJCQlleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJzoKCQkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzoKCQkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6CgkJCQkJCWV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnOgoJCQkJCQlleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKTsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJCWV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApOwoKCQkJCX0KCgkJCQlpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTsKCgkJCQl9CgoJCQkJZXh0ZW5zaW9uc1sgbmFtZSBdID0gZXh0ZW5zaW9uOwoKCQkJCXJldHVybiBleHRlbnNpb247CgoJCQl9CgoJCX07CgoJfQoKCS8qKgoJICogQGF1dGhvciB0c2NodwoJICovCgoJZnVuY3Rpb24gV2ViR0xDbGlwcGluZygpIHsKCgkJdmFyIHNjb3BlID0gdGhpcywKCgkJCWdsb2JhbFN0YXRlID0gbnVsbCwKCQkJbnVtR2xvYmFsUGxhbmVzID0gMCwKCQkJbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSwKCQkJcmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlLAoKCQkJcGxhbmUgPSBuZXcgUGxhbmUoKSwKCQkJdmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksCgoJCQl1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07CgoJCXRoaXMudW5pZm9ybSA9IHVuaWZvcm07CgkJdGhpcy5udW1QbGFuZXMgPSAwOwoJCXRoaXMubnVtSW50ZXJzZWN0aW9uID0gMDsKCgkJdGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHsKCgkJCXZhciBlbmFibGVkID0KCQkJCXBsYW5lcy5sZW5ndGggIT09IDAgfHwKCQkJCWVuYWJsZUxvY2FsQ2xpcHBpbmcgfHwKCQkJCS8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0bwoJCQkJLy8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOgoJCQkJbnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8CgkJCQlsb2NhbENsaXBwaW5nRW5hYmxlZDsKCgkJCWxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZzsKCgkJCWdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTsKCQkJbnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxlbmd0aDsKCgkJCXJldHVybiBlbmFibGVkOwoKCQl9OwoKCQl0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHsKCgkJCXJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlOwoJCQlwcm9qZWN0UGxhbmVzKCBudWxsICk7CgoJCX07CgoJCXRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHsKCgkJCXJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTsKCQkJcmVzZXRHbG9iYWxTdGF0ZSgpOwoKCQl9OwoKCQl0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7CgoJCQlpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkgewoKCQkJCS8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmcKCgkJCQlpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7CgoJCQkJCS8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nCgoJCQkJCXByb2plY3RQbGFuZXMoIG51bGwgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQlyZXNldEdsb2JhbFN0YXRlKCk7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQl2YXIgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLAoJCQkJCWxHbG9iYWwgPSBuR2xvYmFsICogNCwKCgkJCQkJZHN0QXJyYXkgPSBjYWNoZS5jbGlwcGluZ1N0YXRlIHx8IG51bGw7CgoJCQkJdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlCgoJCQkJZHN0QXJyYXkgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgbEdsb2JhbCwgZnJvbUNhY2hlICk7CgoJCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBsR2xvYmFsOyArKyBpICkgewoKCQkJCQlkc3RBcnJheVsgaSBdID0gZ2xvYmFsU3RhdGVbIGkgXTsKCgkJCQl9CgoJCQkJY2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5OwoJCQkJdGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwOwoJCQkJdGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDsKCgkJCX0KCgoJCX07CgoJCWZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7CgoJCQlpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkgewoKCQkJCXVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTsKCQkJCXVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwOwoKCQkJfQoKCQkJc2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzOwoJCQlzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwOwoKCQl9CgoJCWZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7CgoJCQl2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLAoJCQkJZHN0QXJyYXkgPSBudWxsOwoKCQkJaWYgKCBuUGxhbmVzICE9PSAwICkgewoKCQkJCWRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTsKCgkJCQlpZiAoIHNraXBUcmFuc2Zvcm0gIT09IHRydWUgfHwgZHN0QXJyYXkgPT09IG51bGwgKSB7CgoJCQkJCXZhciBmbGF0U2l6ZSA9IGRzdE9mZnNldCArIG5QbGFuZXMgKiA0LAoJCQkJCQl2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTsKCgkJCQkJdmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTsKCgkJCQkJaWYgKCBkc3RBcnJheSA9PT0gbnVsbCB8fCBkc3RBcnJheS5sZW5ndGggPCBmbGF0U2l6ZSApIHsKCgkJCQkJCWRzdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggZmxhdFNpemUgKTsKCgkJCQkJfQoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkgewoKCQkJCQkJcGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTsKCgkJCQkJCXBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTsKCQkJCQkJZHN0QXJyYXlbIGk0ICsgMyBdID0gcGxhbmUuY29uc3RhbnQ7CgoJCQkJCX0KCgkJCQl9CgoJCQkJdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OwoJCQkJdW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQl9CgoJCQlzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzOwoKCQkJcmV0dXJuIGRzdEFycmF5OwoKCQl9CgoJfQoKCS8qKgoJICogQGF1dGhvciB0aGVzcGl0ZSAvIGh0dHA6Ly93d3cudHdpdHRlci5jb20vdGhlc3BpdGUKCSAqLwoKCWZ1bmN0aW9uIFdlYkdMVXRpbHMoIGdsLCBleHRlbnNpb25zICkgewoKCQlmdW5jdGlvbiBjb252ZXJ0KCBwICkgewoKCQkJdmFyIGV4dGVuc2lvbjsKCgkJCWlmICggcCA9PT0gUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuUkVQRUFUOwoJCQlpZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gZ2wuQ0xBTVBfVE9fRURHRTsKCQkJaWYgKCBwID09PSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIGdsLk1JUlJPUkVEX1JFUEVBVDsKCgkJCWlmICggcCA9PT0gTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUOwoJCQlpZiAoIHAgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1Q7CgkJCWlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7CgoJCQlpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVI7CgkJCWlmICggcCA9PT0gTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1Q7CgkJCWlmICggcCA9PT0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSOwoKCQkJaWYgKCBwID09PSBVbnNpZ25lZEJ5dGVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0JZVEU7CgkJCWlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7CgkJCWlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU1NTFUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7CgkJCWlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU2NVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV82XzU7CgoJCQlpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIGdsLkJZVEU7CgkJCWlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIGdsLlNIT1JUOwoJCQlpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUOwoJCQlpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gZ2wuSU5UOwoJCQlpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9JTlQ7CgkJCWlmICggcCA9PT0gRmxvYXRUeXBlICkgcmV0dXJuIGdsLkZMT0FUOwoKCQkJaWYgKCBwID09PSBIYWxmRmxvYXRUeXBlICkgewoKCQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTsKCgkJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7CgoJCQl9CgoJCQlpZiAoIHAgPT09IEFscGhhRm9ybWF0ICkgcmV0dXJuIGdsLkFMUEhBOwoJCQlpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7CgkJCWlmICggcCA9PT0gUkdCQUZvcm1hdCApIHJldHVybiBnbC5SR0JBOwoJCQlpZiAoIHAgPT09IEx1bWluYW5jZUZvcm1hdCApIHJldHVybiBnbC5MVU1JTkFOQ0U7CgkJCWlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBOwoJCQlpZiAoIHAgPT09IERlcHRoRm9ybWF0ICkgcmV0dXJuIGdsLkRFUFRIX0NPTVBPTkVOVDsKCQkJaWYgKCBwID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfU1RFTkNJTDsKCgkJCWlmICggcCA9PT0gQWRkRXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19BREQ7CgkJCWlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1NVQlRSQUNUOwoJCQlpZiAoIHAgPT09IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVDsKCgkJCWlmICggcCA9PT0gWmVyb0ZhY3RvciApIHJldHVybiBnbC5aRVJPOwoJCQlpZiAoIHAgPT09IE9uZUZhY3RvciApIHJldHVybiBnbC5PTkU7CgkJCWlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0NPTE9SOwoJCQlpZiAoIHAgPT09IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuT05FX01JTlVTX1NSQ19DT0xPUjsKCQkJaWYgKCBwID09PSBTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5TUkNfQUxQSEE7CgkJCWlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBOwoJCQlpZiAoIHAgPT09IERzdEFscGhhRmFjdG9yICkgcmV0dXJuIGdsLkRTVF9BTFBIQTsKCQkJaWYgKCBwID09PSBPbmVNaW51c0RzdEFscGhhRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQUxQSEE7CgoJCQlpZiAoIHAgPT09IERzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLkRTVF9DT0xPUjsKCQkJaWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQ09MT1I7CgkJCWlmICggcCA9PT0gU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciApIHJldHVybiBnbC5TUkNfQUxQSEFfU0FUVVJBVEU7CgoJCQlpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCB8fAoJCQkJcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHsKCgkJCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApOwoKCQkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgewoKCQkJCQlpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOwoJCQkJCWlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDsKCQkJCQlpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7CgkJCQkJaWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOwoKCQkJCX0KCgkJCX0KCgkJCWlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgfHwKCQkJCXAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSB7CgoJCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7CgoJCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7CgoJCQkJCWlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7CgkJCQkJaWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRzsKCQkJCQlpZiAoIHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7CgkJCQkJaWYgKCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOwoKCQkJCX0KCgkJCX0KCgkJCWlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkgewoKCQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7CgoJCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7CgoJCQl9CgoJCQlpZiAoIHAgPT09IE1pbkVxdWF0aW9uIHx8IHAgPT09IE1heEVxdWF0aW9uICkgewoKCQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTsKCgkJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHsKCgkJCQkJaWYgKCBwID09PSBNaW5FcXVhdGlvbiApIHJldHVybiBleHRlbnNpb24uTUlOX0VYVDsKCQkJCQlpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUOwoKCQkJCX0KCgkJCX0KCgkJCWlmICggcCA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkgewoKCQkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTsKCgkJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uVU5TSUdORURfSU5UXzI0XzhfV0VCR0w7CgoJCQl9CgoJCQlyZXR1cm4gMDsKCgkJfQoKCQlyZXR1cm4geyBjb252ZXJ0OiBjb252ZXJ0IH07CgoJfQoKCS8qKgoJICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay8KCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrLwoJICogQGF1dGhvciB0c2NodwoJICovCgoJZnVuY3Rpb24gV2ViR0xSZW5kZXJlciggcGFyYW1ldGVycyApIHsKCgkJY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyJywgUkVWSVNJT04gKTsKCgkJcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307CgoJCXZhciBfY2FudmFzID0gcGFyYW1ldGVycy5jYW52YXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY2FudmFzIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICksCgkJCV9jb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNvbnRleHQgOiBudWxsLAoKCQkJX2FscGhhID0gcGFyYW1ldGVycy5hbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbHBoYSA6IGZhbHNlLAoJCQlfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSwKCQkJX3N0ZW5jaWwgPSBwYXJhbWV0ZXJzLnN0ZW5jaWwgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuc3RlbmNpbCA6IHRydWUsCgkJCV9hbnRpYWxpYXMgPSBwYXJhbWV0ZXJzLmFudGlhbGlhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbnRpYWxpYXMgOiBmYWxzZSwKCQkJX3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsCgkJCV9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgOiBmYWxzZSwKCQkJX3Bvd2VyUHJlZmVyZW5jZSA9IHBhcmFtZXRlcnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSA6ICdkZWZhdWx0JzsKCgkJdmFyIGxpZ2h0c0FycmF5ID0gW107CgkJdmFyIHNoYWRvd3NBcnJheSA9IFtdOwoKCQl2YXIgY3VycmVudFJlbmRlckxpc3QgPSBudWxsOwoKCQl2YXIgc3ByaXRlc0FycmF5ID0gW107CgkJdmFyIGZsYXJlc0FycmF5ID0gW107CgoJCS8vIHB1YmxpYyBwcm9wZXJ0aWVzCgoJCXRoaXMuZG9tRWxlbWVudCA9IF9jYW52YXM7CgkJdGhpcy5jb250ZXh0ID0gbnVsbDsKCgkJLy8gY2xlYXJpbmcKCgkJdGhpcy5hdXRvQ2xlYXIgPSB0cnVlOwoJCXRoaXMuYXV0b0NsZWFyQ29sb3IgPSB0cnVlOwoJCXRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlOwoJCXRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7CgoJCS8vIHNjZW5lIGdyYXBoCgoJCXRoaXMuc29ydE9iamVjdHMgPSB0cnVlOwoKCQkvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmcKCgkJdGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdOwoJCXRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTsKCgkJLy8gcGh5c2ljYWxseSBiYXNlZCBzaGFkaW5nCgoJCXRoaXMuZ2FtbWFGYWN0b3IgPSAyLjA7CS8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoJCXRoaXMuZ2FtbWFJbnB1dCA9IGZhbHNlOwoJCXRoaXMuZ2FtbWFPdXRwdXQgPSBmYWxzZTsKCgkJLy8gcGh5c2ljYWwgbGlnaHRzCgoJCXRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTsKCgkJLy8gdG9uZSBtYXBwaW5nCgoJCXRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZzsKCQl0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7CgkJdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgPSAxLjA7CgoJCS8vIG1vcnBocwoKCQl0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7CgkJdGhpcy5tYXhNb3JwaE5vcm1hbHMgPSA0OwoKCQkvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzCgoJCXZhciBfdGhpcyA9IHRoaXMsCgoJCQlfaXNDb250ZXh0TG9zdCA9IGZhbHNlLAoKCQkJLy8gaW50ZXJuYWwgc3RhdGUgY2FjaGUKCgkJCV9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbCwKCQkJX2N1cnJlbnRGcmFtZWJ1ZmZlciA9IG51bGwsCgkJCV9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMSwKCQkJX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJywKCgkJCV9jdXJyZW50Q2FtZXJhID0gbnVsbCwKCQkJX2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGwsCgoJCQlfY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKSwKCQkJX2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSwKCQkJX2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGwsCgoJCQkvLwoKCQkJX3VzZWRUZXh0dXJlVW5pdHMgPSAwLAoKCQkJLy8KCgkJCV93aWR0aCA9IF9jYW52YXMud2lkdGgsCgkJCV9oZWlnaHQgPSBfY2FudmFzLmhlaWdodCwKCgkJCV9waXhlbFJhdGlvID0gMSwKCgkJCV92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKSwKCQkJX3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksCgkJCV9zY2lzc29yVGVzdCA9IGZhbHNlLAoKCQkJLy8gZnJ1c3R1bQoKCQkJX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpLAoKCQkJLy8gY2xpcHBpbmcKCgkJCV9jbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCksCgkJCV9jbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSwKCQkJX2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsCgoJCQkvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGUKCgkJCV9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSwKCgkJCV92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKSwKCgkJCS8vIGluZm8KCgkJCV9pbmZvTWVtb3J5ID0gewoJCQkJZ2VvbWV0cmllczogMCwKCQkJCXRleHR1cmVzOiAwCgkJCX0sCgoJCQlfaW5mb1JlbmRlciA9IHsKCgkJCQlmcmFtZTogMCwKCQkJCWNhbGxzOiAwLAoJCQkJdmVydGljZXM6IDAsCgkJCQlmYWNlczogMCwKCQkJCXBvaW50czogMAoKCQkJfTsKCgkJdGhpcy5pbmZvID0gewoKCQkJcmVuZGVyOiBfaW5mb1JlbmRlciwKCQkJbWVtb3J5OiBfaW5mb01lbW9yeSwKCQkJcHJvZ3JhbXM6IG51bGwKCgkJfTsKCgkJZnVuY3Rpb24gZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpIHsKCgkJCXJldHVybiBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IF9waXhlbFJhdGlvIDogMTsKCgkJfQoKCQkvLyBpbml0aWFsaXplCgoJCXZhciBfZ2w7CgoJCXRyeSB7CgoJCQl2YXIgY29udGV4dEF0dHJpYnV0ZXMgPSB7CgkJCQlhbHBoYTogX2FscGhhLAoJCQkJZGVwdGg6IF9kZXB0aCwKCQkJCXN0ZW5jaWw6IF9zdGVuY2lsLAoJCQkJYW50aWFsaWFzOiBfYW50aWFsaWFzLAoJCQkJcHJlbXVsdGlwbGllZEFscGhhOiBfcHJlbXVsdGlwbGllZEFscGhhLAoJCQkJcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBfcHJlc2VydmVEcmF3aW5nQnVmZmVyLAoJCQkJcG93ZXJQcmVmZXJlbmNlOiBfcG93ZXJQcmVmZXJlbmNlCgkJCX07CgoJCQkvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTMKCgkJCV9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApOwoJCQlfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7CgoJCQlfZ2wgPSBfY29udGV4dCB8fCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICkgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnZXhwZXJpbWVudGFsLXdlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKTsKCgkJCWlmICggX2dsID09PSBudWxsICkgewoKCQkJCWlmICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7CgoJCQkJCXRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuJyApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJyApOwoKCQkJCX0KCgkJCX0KCgkJCS8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBkbyBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQKCgkJCWlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCV9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7CgoJCQkJCXJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEsICdwcmVjaXNpb24nOiAxIH07CgoJCQkJfTsKCgkJCX0KCgkJfSBjYXRjaCAoIGVycm9yICkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvci5tZXNzYWdlICk7CgoJCX0KCgkJdmFyIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGU7CgkJdmFyIHByb3BlcnRpZXMsIHRleHR1cmVzLCBhdHRyaWJ1dGVzLCBnZW9tZXRyaWVzLCBvYmplY3RzLCBsaWdodHM7CgkJdmFyIHByb2dyYW1DYWNoZSwgcmVuZGVyTGlzdHM7CgoJCXZhciBiYWNrZ3JvdW5kLCBtb3JwaHRhcmdldHMsIGJ1ZmZlclJlbmRlcmVyLCBpbmRleGVkQnVmZmVyUmVuZGVyZXI7CgkJdmFyIGZsYXJlUmVuZGVyZXIsIHNwcml0ZVJlbmRlcmVyOwoKCQl2YXIgdXRpbHM7CgoJCWZ1bmN0aW9uIGluaXRHTENvbnRleHQoKSB7CgoJCQlleHRlbnNpb25zID0gbmV3IFdlYkdMRXh0ZW5zaW9ucyggX2dsICk7CgkJCWV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTsKCQkJZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTsKCQkJZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICk7CgkJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTsKCQkJZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKTsKCQkJZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7CgkJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTsKCQkJZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOwoKCQkJdXRpbHMgPSBuZXcgV2ViR0xVdGlscyggX2dsLCBleHRlbnNpb25zICk7CgoJCQljYXBhYmlsaXRpZXMgPSBuZXcgV2ViR0xDYXBhYmlsaXRpZXMoIF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApOwoKCQkJc3RhdGUgPSBuZXcgV2ViR0xTdGF0ZSggX2dsLCBleHRlbnNpb25zLCB1dGlscyApOwoJCQlzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApOwoJCQlzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApOwoKCQkJcHJvcGVydGllcyA9IG5ldyBXZWJHTFByb3BlcnRpZXMoKTsKCQkJdGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgX2luZm9NZW1vcnkgKTsKCQkJYXR0cmlidXRlcyA9IG5ldyBXZWJHTEF0dHJpYnV0ZXMoIF9nbCApOwoJCQlnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBfaW5mb01lbW9yeSApOwoJCQlvYmplY3RzID0gbmV3IFdlYkdMT2JqZWN0cyggZ2VvbWV0cmllcywgX2luZm9SZW5kZXIgKTsKCQkJbW9ycGh0YXJnZXRzID0gbmV3IFdlYkdMTW9ycGh0YXJnZXRzKCBfZ2wgKTsKCQkJcHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTsKCQkJbGlnaHRzID0gbmV3IFdlYkdMTGlnaHRzKCk7CgkJCXJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoKTsKCgkJCWJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgc3RhdGUsIGdlb21ldHJpZXMsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTsKCgkJCWJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgX2luZm9SZW5kZXIgKTsKCQkJaW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIF9pbmZvUmVuZGVyICk7CgoJCQlmbGFyZVJlbmRlcmVyID0gbmV3IFdlYkdMRmxhcmVSZW5kZXJlciggX3RoaXMsIF9nbCwgc3RhdGUsIHRleHR1cmVzLCBjYXBhYmlsaXRpZXMgKTsKCQkJc3ByaXRlUmVuZGVyZXIgPSBuZXcgV2ViR0xTcHJpdGVSZW5kZXJlciggX3RoaXMsIF9nbCwgc3RhdGUsIHRleHR1cmVzLCBjYXBhYmlsaXRpZXMgKTsKCgkJCV90aGlzLmluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7CgoJCQlfdGhpcy5jb250ZXh0ID0gX2dsOwoJCQlfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CgkJCV90aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwoJCQlfdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKCQkJX3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0czsKCQkJX3RoaXMuc3RhdGUgPSBzdGF0ZTsKCgkJfQoKCQlpbml0R0xDb250ZXh0KCk7CgoJCS8vIHZyCgoJCXZhciB2ciA9IG5ldyBXZWJWUk1hbmFnZXIoIF90aGlzICk7CgoJCXRoaXMudnIgPSB2cjsKCgkJLy8gc2hhZG93IG1hcAoKCQl2YXIgc2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7CgoJCXRoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwOwoKCQkvLyBBUEkKCgkJdGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIF9nbDsKCgkJfTsKCgkJdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBfZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTsKCgkJfTsKCgkJdGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkgewoKCQkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApOwoJCQlpZiAoIGV4dGVuc2lvbiApIGV4dGVuc2lvbi5sb3NlQ29udGV4dCgpOwoKCQl9OwoKCQl0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7CgkJCWlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLnJlc3RvcmVDb250ZXh0KCk7CgoJCX07CgoJCXRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBfcGl4ZWxSYXRpbzsKCgkJfTsKCgkJdGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCgkJCV9waXhlbFJhdGlvID0gdmFsdWU7CgoJCQl0aGlzLnNldFNpemUoIF93aWR0aCwgX2hlaWdodCwgZmFsc2UgKTsKCgkJfTsKCgkJdGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHsKCQkJCXdpZHRoOiBfd2lkdGgsCgkJCQloZWlnaHQ6IF9oZWlnaHQKCQkJfTsKCgkJfTsKCgkJdGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSApIHsKCgkJCXZhciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTsKCgkJCWlmICggZGV2aWNlICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuXCd0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCV93aWR0aCA9IHdpZHRoOwoJCQlfaGVpZ2h0ID0gaGVpZ2h0OwoKCQkJX2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87CgkJCV9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogX3BpeGVsUmF0aW87CgoJCQlpZiAoIHVwZGF0ZVN0eWxlICE9PSBmYWxzZSApIHsKCgkJCQlfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnOwoJCQkJX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOwoKCQkJfQoKCQkJdGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApOwoKCQl9OwoKCQl0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHsKCQkJCXdpZHRoOiBfd2lkdGggKiBfcGl4ZWxSYXRpbywKCQkJCWhlaWdodDogX2hlaWdodCAqIF9waXhlbFJhdGlvCgkJCX07CgoJCX07CgoJCXRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHBpeGVsUmF0aW8gKSB7CgoJCQlfd2lkdGggPSB3aWR0aDsKCQkJX2hlaWdodCA9IGhlaWdodDsKCgkJCV9waXhlbFJhdGlvID0gcGl4ZWxSYXRpbzsKCgkJCV9jYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87CgkJCV9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbzsKCgkJCXRoaXMuc2V0Vmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKCgkJfTsKCgkJdGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHsKCgkJCV92aWV3cG9ydC5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7CgkJCXN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7CgoJCX07CgoJCXRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHsKCgkJCV9zY2lzc29yLnNldCggeCwgX2hlaWdodCAtIHkgLSBoZWlnaHQsIHdpZHRoLCBoZWlnaHQgKTsKCQkJc3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTsKCgkJfTsKCgkJdGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHsKCgkJCXN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7CgoJCX07CgoJCS8vIENsZWFyaW5nCgoJCXRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBiYWNrZ3JvdW5kLmdldENsZWFyQ29sb3IoKTsKCgkJfTsKCgkJdGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkgewoKCQkJYmFja2dyb3VuZC5zZXRDbGVhckNvbG9yLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTsKCgkJfTsKCgkJdGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpOwoKCQl9OwoKCQl0aGlzLnNldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7CgoJCQliYWNrZ3JvdW5kLnNldENsZWFyQWxwaGEuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApOwoKCQl9OwoKCQl0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7CgoJCQl2YXIgYml0cyA9IDA7CgoJCQlpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgfHwgY29sb3IgKSBiaXRzIHw9IF9nbC5DT0xPUl9CVUZGRVJfQklUOwoJCQlpZiAoIGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggKSBiaXRzIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUOwoJCQlpZiAoIHN0ZW5jaWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUOwoKCQkJX2dsLmNsZWFyKCBiaXRzICk7CgoJCX07CgoJCXRoaXMuY2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApOwoKCQl9OwoKCQl0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTsKCgkJfTsKCgkJdGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKTsKCgkJfTsKCgkJdGhpcy5jbGVhclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7CgoJCQl0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7CgkJCXRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApOwoKCQl9OwoKCQkvLwoKCQl0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CgoJCQlfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTsKCQkJX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApOwoKCQkJcmVuZGVyTGlzdHMuZGlzcG9zZSgpOwoKCQkJdnIuZGlzcG9zZSgpOwoKCQl9OwoKCQkvLyBFdmVudHMKCgkJZnVuY3Rpb24gb25Db250ZXh0TG9zdCggZXZlbnQgKSB7CgoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuJyApOwoKCQkJX2lzQ29udGV4dExvc3QgPSB0cnVlOwoKCQl9CgoJCWZ1bmN0aW9uIG9uQ29udGV4dFJlc3RvcmUoIC8qIGV2ZW50ICovICkgewoKCQkJY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLicgKTsKCgkJCV9pc0NvbnRleHRMb3N0ID0gZmFsc2U7CgoJCQlpbml0R0xDb250ZXh0KCk7CgoJCX0KCgkJZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkgewoKCQkJdmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0OwoKCQkJbWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApOwoKCQkJZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApOwoKCQl9CgoJCS8vIEJ1ZmZlciBkZWFsbG9jYXRpb24KCgkJZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHsKCgkJCXJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7CgoJCQlwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTsKCgkJfQoKCgkJZnVuY3Rpb24gcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKSB7CgoJCQl2YXIgcHJvZ3JhbUluZm8gPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKS5wcm9ncmFtOwoKCQkJbWF0ZXJpYWwucHJvZ3JhbSA9IHVuZGVmaW5lZDsKCgkJCWlmICggcHJvZ3JhbUluZm8gIT09IHVuZGVmaW5lZCApIHsKCgkJCQlwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7CgoJCQl9CgoJCX0KCgkJLy8gQnVmZmVyIHJlbmRlcmluZwoKCQlmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7CgoJCQlvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAoIG9iamVjdCApIHsKCgkJCQlfdGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTsKCgkJCX0gKTsKCgkJfQoKCQl0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSA9IGZ1bmN0aW9uICggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApIHsKCgkJCXN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7CgoJCQl2YXIgYnVmZmVycyA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTsKCgkJCWlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyAmJiAhIGJ1ZmZlcnMucG9zaXRpb24gKSBidWZmZXJzLnBvc2l0aW9uID0gX2dsLmNyZWF0ZUJ1ZmZlcigpOwoJCQlpZiAoIG9iamVjdC5oYXNOb3JtYWxzICYmICEgYnVmZmVycy5ub3JtYWwgKSBidWZmZXJzLm5vcm1hbCA9IF9nbC5jcmVhdGVCdWZmZXIoKTsKCQkJaWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CgkJCWlmICggb2JqZWN0Lmhhc0NvbG9ycyAmJiAhIGJ1ZmZlcnMuY29sb3IgKSBidWZmZXJzLmNvbG9yID0gX2dsLmNyZWF0ZUJ1ZmZlcigpOwoKCQkJdmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7CgoJCQlpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgKSB7CgoJCQkJX2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTsKCQkJCV9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApOwoKCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24gKTsKCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApOwoKCQkJfQoKCQkJaWYgKCBvYmplY3QuaGFzTm9ybWFscyApIHsKCgkJCQlfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5ub3JtYWwgKTsKCgkJCQlpZiAoICEgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJgoJCQkJCSEgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCAmJgoJCQkJCSEgbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgJiYKCQkJCQltYXRlcmlhbC5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIHsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gb2JqZWN0LmNvdW50ICogMzsgaSA8IGw7IGkgKz0gOSApIHsKCgkJCQkJCXZhciBhcnJheSA9IG9iamVjdC5ub3JtYWxBcnJheTsKCgkJCQkJCXZhciBueCA9ICggYXJyYXlbIGkgKyAwIF0gKyBhcnJheVsgaSArIDMgXSArIGFycmF5WyBpICsgNiBdICkgLyAzOwoJCQkJCQl2YXIgbnkgPSAoIGFycmF5WyBpICsgMSBdICsgYXJyYXlbIGkgKyA0IF0gKyBhcnJheVsgaSArIDcgXSApIC8gMzsKCQkJCQkJdmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSArIGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7CgoJCQkJCQlhcnJheVsgaSArIDAgXSA9IG54OwoJCQkJCQlhcnJheVsgaSArIDEgXSA9IG55OwoJCQkJCQlhcnJheVsgaSArIDIgXSA9IG56OwoKCQkJCQkJYXJyYXlbIGkgKyAzIF0gPSBueDsKCQkJCQkJYXJyYXlbIGkgKyA0IF0gPSBueTsKCQkJCQkJYXJyYXlbIGkgKyA1IF0gPSBuejsKCgkJCQkJCWFycmF5WyBpICsgNiBdID0gbng7CgkJCQkJCWFycmF5WyBpICsgNyBdID0gbnk7CgkJCQkJCWFycmF5WyBpICsgOCBdID0gbno7CgoJCQkJCX0KCgkJCQl9CgoJCQkJX2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5ub3JtYWxBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApOwoKCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsICk7CgoJCQkJX2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApOwoKCQkJfQoKCQkJaWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVyaWFsLm1hcCApIHsKCgkJCQlfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy51diApOwoJCQkJX2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC51dkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7CgoJCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy51diApOwoKCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApOwoKCQkJfQoKCQkJaWYgKCBvYmplY3QuaGFzQ29sb3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7CgoJCQkJX2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMuY29sb3IgKTsKCQkJCV9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QuY29sb3JBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApOwoKCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IgKTsKCgkJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTsKCgkJCX0KCgkJCXN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7CgoJCQlfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7CgoJCQlvYmplY3QuY291bnQgPSAwOwoKCQl9OwoKCQl0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCA9IGZ1bmN0aW9uICggY2FtZXJhLCBmb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHsKCgkJCXZhciBmcm9udEZhY2VDVyA9ICggb2JqZWN0LmlzTWVzaCAmJiBvYmplY3QubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSA8IDAgKTsKCgkJCXN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTsKCgkJCXZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKTsKCQkJdmFyIGdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7CgoJCQl2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlOwoKCQkJaWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtICkgewoKCQkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gZ2VvbWV0cnlQcm9ncmFtOwoJCQkJdXBkYXRlQnVmZmVycyA9IHRydWU7CgoJCQl9CgoJCQlpZiAoIG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMgKSB7CgoJCQkJbW9ycGh0YXJnZXRzLnVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKTsKCgkJCQl1cGRhdGVCdWZmZXJzID0gdHJ1ZTsKCgkJCX0KCgkJCS8vCgoJCQl2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDsKCQkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCQkJdmFyIHJhbmdlRmFjdG9yID0gMTsKCgkJCWlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkgewoKCQkJCWluZGV4ID0gZ2VvbWV0cmllcy5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7CgkJCQlyYW5nZUZhY3RvciA9IDI7CgoJCQl9CgoJCQl2YXIgYXR0cmlidXRlOwoJCQl2YXIgcmVuZGVyZXIgPSBidWZmZXJSZW5kZXJlcjsKCgkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CgoJCQkJYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoIGluZGV4ICk7CgoJCQkJcmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7CgkJCQlyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7CgoJCQl9CgoJCQlpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7CgoJCQkJc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKTsKCgkJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKCQkJCQlfZ2wuYmluZEJ1ZmZlciggX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGUuYnVmZmVyICk7CgoJCQkJfQoKCQkJfQoKCQkJLy8KCgkJCXZhciBkYXRhQ291bnQgPSAwOwoKCQkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKCgkJCQlkYXRhQ291bnQgPSBpbmRleC5jb3VudDsKCgkJCX0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJZGF0YUNvdW50ID0gcG9zaXRpb24uY291bnQ7CgoJCQl9CgoJCQl2YXIgcmFuZ2VTdGFydCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5zdGFydCAqIHJhbmdlRmFjdG9yOwoJCQl2YXIgcmFuZ2VDb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudCAqIHJhbmdlRmFjdG9yOwoKCQkJdmFyIGdyb3VwU3RhcnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLnN0YXJ0ICogcmFuZ2VGYWN0b3IgOiAwOwoJCQl2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQgKiByYW5nZUZhY3RvciA6IEluZmluaXR5OwoKCQkJdmFyIGRyYXdTdGFydCA9IE1hdGgubWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7CgkJCXZhciBkcmF3RW5kID0gTWF0aC5taW4oIGRhdGFDb3VudCwgcmFuZ2VTdGFydCArIHJhbmdlQ291bnQsIGdyb3VwU3RhcnQgKyBncm91cENvdW50ICkgLSAxOwoKCQkJdmFyIGRyYXdDb3VudCA9IE1hdGgubWF4KCAwLCBkcmF3RW5kIC0gZHJhd1N0YXJ0ICsgMSApOwoKCQkJaWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47CgoJCQkvLwoKCQkJaWYgKCBvYmplY3QuaXNNZXNoICkgewoKCQkJCWlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkgewoKCQkJCQlzdGF0ZS5zZXRMaW5lV2lkdGgoIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApOwoJCQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHsKCgkJCQkJCWNhc2UgVHJpYW5nbGVzRHJhd01vZGU6CgkJCQkJCQlyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOgoJCQkJCQkJcmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX1NUUklQICk7CgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgVHJpYW5nbGVGYW5EcmF3TW9kZToKCQkJCQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9GQU4gKTsKCQkJCQkJCWJyZWFrOwoKCQkJCQl9CgoJCQkJfQoKCgkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7CgoJCQkJdmFyIGxpbmVXaWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDsKCgkJCQlpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWwKCgkJCQlzdGF0ZS5zZXRMaW5lV2lkdGgoIGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApOwoKCQkJCWlmICggb2JqZWN0LmlzTGluZVNlZ21lbnRzICkgewoKCQkJCQlyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTsKCgkJCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lTG9vcCApIHsKCgkJCQkJcmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfTE9PUCApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX1NUUklQICk7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkgewoKCQkJCXJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTsKCgkJCX0KCgkJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQlpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID4gMCApIHsKCgkJCQkJcmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTsKCgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCXJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTsKCgkJCX0KCgkJfTsKCgkJZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIHN0YXJ0SW5kZXggKSB7CgoJCQlpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7CgoJCQkJaWYgKCBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkgPT09IG51bGwgKSB7CgoJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApOwoJCQkJCXJldHVybjsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCApIHN0YXJ0SW5kZXggPSAwOwoKCQkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKCgkJCXZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoKCQkJdmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7CgoJCQl2YXIgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlczsKCgkJCWZvciAoIHZhciBuYW1lIGluIHByb2dyYW1BdHRyaWJ1dGVzICkgewoKCQkJCXZhciBwcm9ncmFtQXR0cmlidXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbIG5hbWUgXTsKCgkJCQlpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHsKCgkJCQkJdmFyIGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF07CgoJCQkJCWlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXZhciBub3JtYWxpemVkID0gZ2VvbWV0cnlBdHRyaWJ1dGUubm9ybWFsaXplZDsKCQkJCQkJdmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTsKCgkJCQkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTsKCgkJCQkJCS8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZQoKCQkJCQkJaWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlOwoKCQkJCQkJdmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7CgkJCQkJCXZhciB0eXBlID0gYXR0cmlidXRlLnR5cGU7CgkJCQkJCXZhciBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGUuYnl0ZXNQZXJFbGVtZW50OwoKCQkJCQkJaWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgewoKCQkJCQkJCXZhciBkYXRhID0gZ2VvbWV0cnlBdHRyaWJ1dGUuZGF0YTsKCQkJCQkJCXZhciBzdHJpZGUgPSBkYXRhLnN0cmlkZTsKCQkJCQkJCXZhciBvZmZzZXQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5vZmZzZXQ7CgoJCQkJCQkJaWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHsKCgkJCQkJCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZGF0YS5tZXNoUGVyQXR0cmlidXRlICk7CgoJCQkJCQkJCWlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQkJCWdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDsKCgkJCQkJCQkJfQoKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApOwoKCQkJCQkJCX0KCgkJCQkJCQlfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7CgkJCQkJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50LCAoIHN0YXJ0SW5kZXggKiBzdHJpZGUgKyBvZmZzZXQgKSAqIGJ5dGVzUGVyRWxlbWVudCApOwoKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQlpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgewoKCQkJCQkJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7CgoJCQkJCQkJCWlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQkJCWdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50OwoKCQkJCQkJCQl9CgoJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7CgoJCQkJCQkJfQoKCQkJCQkJCV9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTsKCQkJCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCBzdGFydEluZGV4ICogc2l6ZSAqIGJ5dGVzUGVyRWxlbWVudCApOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXZhciB2YWx1ZSA9IG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1sgbmFtZSBdOwoKCQkJCQkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJCXN3aXRjaCAoIHZhbHVlLmxlbmd0aCApIHsKCgkJCQkJCQkJY2FzZSAyOgoJCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwoJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJY2FzZSAzOgoJCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwoJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJY2FzZSA0OgoJCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwoJCQkJCQkJCQlicmVhazsKCgkJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkJX2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTsKCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOwoKCQl9CgoJCS8vIENvbXBpbGUKCgkJdGhpcy5jb21waWxlID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkgewoKCQkJbGlnaHRzQXJyYXkubGVuZ3RoID0gMDsKCQkJc2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7CgoJCQlzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7CgoJCQkJaWYgKCBvYmplY3QuaXNMaWdodCApIHsKCgkJCQkJbGlnaHRzQXJyYXkucHVzaCggb2JqZWN0ICk7CgoJCQkJCWlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7CgoJCQkJCQlzaGFkb3dzQXJyYXkucHVzaCggb2JqZWN0ICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9ICk7CgoJCQlsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5LCBzaGFkb3dzQXJyYXksIGNhbWVyYSApOwoKCQkJc2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkgewoKCQkJCWlmICggb2JqZWN0Lm1hdGVyaWFsICkgewoKCQkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkgewoKCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHsKCgkJCQkJCQlpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbFsgaSBdLCBzY2VuZS5mb2csIG9iamVjdCApOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoKCQkJCQkJaW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9ICk7CgoJCX07CgoJCS8vIEFuaW1hdGlvbiBMb29wCgoJCXZhciBpc0FuaW1hdGluZyA9IGZhbHNlOwoJCXZhciBvbkFuaW1hdGlvbkZyYW1lID0gbnVsbDsKCgkJZnVuY3Rpb24gc3RhcnQoKSB7CgoJCQlpZiAoIGlzQW5pbWF0aW5nICkgcmV0dXJuOwoKCQkJdmFyIGRldmljZSA9IHZyLmdldERldmljZSgpOwoKCQkJaWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHsKCgkJCQlkZXZpY2UucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBsb29wICk7CgoJCQl9IGVsc2UgewoKCQkJCXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGxvb3AgKTsKCgkJCX0KCgkJCWlzQW5pbWF0aW5nID0gdHJ1ZTsKCgkJfQoKCQlmdW5jdGlvbiBsb29wKCB0aW1lICkgewoKCQkJaWYgKCBvbkFuaW1hdGlvbkZyYW1lICE9PSBudWxsICkgb25BbmltYXRpb25GcmFtZSggdGltZSApOwoKCQkJdmFyIGRldmljZSA9IHZyLmdldERldmljZSgpOwoKCQkJaWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHsKCgkJCQlkZXZpY2UucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBsb29wICk7CgoJCQl9IGVsc2UgewoKCQkJCXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGxvb3AgKTsKCgkJCX0KCgkJfQoKCQl0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkgewoKCQkJb25BbmltYXRpb25GcmFtZSA9IGNhbGxiYWNrOwoJCQlzdGFydCgpOwoKCQl9OwoKCQkvLyBSZW5kZXJpbmcKCgkJdGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHsKCgkJCWlmICggISAoIGNhbWVyYSAmJiBjYW1lcmEuaXNDYW1lcmEgKSApIHsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCWlmICggX2lzQ29udGV4dExvc3QgKSByZXR1cm47CgoJCQkvLyByZXNldCBjYWNoaW5nIGZvciB0aGlzIGZyYW1lCgoJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnOwoJCQlfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7CgkJCV9jdXJyZW50Q2FtZXJhID0gbnVsbDsKCgkJCS8vIHVwZGF0ZSBzY2VuZSBncmFwaAoKCQkJaWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTsKCgkJCS8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW0KCgkJCWlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpOwoKCQkJaWYgKCB2ci5lbmFibGVkICkgewoKCQkJCWNhbWVyYSA9IHZyLmdldENhbWVyYSggY2FtZXJhICk7CgoJCQl9CgoJCQlfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOwoJCQlfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApOwoKCQkJbGlnaHRzQXJyYXkubGVuZ3RoID0gMDsKCQkJc2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7CgoJCQlzcHJpdGVzQXJyYXkubGVuZ3RoID0gMDsKCQkJZmxhcmVzQXJyYXkubGVuZ3RoID0gMDsKCgkJCV9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7CgkJCV9jbGlwcGluZ0VuYWJsZWQgPSBfY2xpcHBpbmcuaW5pdCggdGhpcy5jbGlwcGluZ1BsYW5lcywgX2xvY2FsQ2xpcHBpbmdFbmFibGVkLCBjYW1lcmEgKTsKCgkJCWN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdHMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7CgkJCWN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTsKCgkJCXByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7CgoJCQlpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkgewoKCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnNvcnQoKTsKCgkJCX0KCgkJCS8vCgoJCQl0ZXh0dXJlcy51cGRhdGVWaWRlb1RleHR1cmVzKCk7CgoJCQkvLwoKCQkJaWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpOwoKCQkJc2hhZG93TWFwLnJlbmRlciggc2hhZG93c0FycmF5LCBzY2VuZSwgY2FtZXJhICk7CgoJCQlsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5LCBzaGFkb3dzQXJyYXksIGNhbWVyYSApOwoKCQkJaWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmVuZFNoYWRvd3MoKTsKCgkJCS8vCgoJCQlfaW5mb1JlbmRlci5mcmFtZSArKzsKCQkJX2luZm9SZW5kZXIuY2FsbHMgPSAwOwoJCQlfaW5mb1JlbmRlci52ZXJ0aWNlcyA9IDA7CgkJCV9pbmZvUmVuZGVyLmZhY2VzID0gMDsKCQkJX2luZm9SZW5kZXIucG9pbnRzID0gMDsKCgkJCWlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJcmVuZGVyVGFyZ2V0ID0gbnVsbDsKCgkJCX0KCgkJCXRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTsKCgkJCS8vCgoJCQliYWNrZ3JvdW5kLnJlbmRlciggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKTsKCgkJCS8vIHJlbmRlciBzY2VuZQoKCQkJdmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7CgkJCXZhciB0cmFuc3BhcmVudE9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc3BhcmVudDsKCgkJCWlmICggc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCApIHsKCgkJCQl2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7CgoJCQkJaWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTsKCQkJCWlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApOwoKCQkJfSBlbHNlIHsKCgkJCQkvLyBvcGFxdWUgcGFzcyAoZnJvbnQtdG8tYmFjayBvcmRlcikKCgkJCQlpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApOwoKCQkJCS8vIHRyYW5zcGFyZW50IHBhc3MgKGJhY2stdG8tZnJvbnQgb3JkZXIpCgoJCQkJaWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7CgoJCQl9CgoJCQkvLyBjdXN0b20gcmVuZGVyZXJzCgoJCQlzcHJpdGVSZW5kZXJlci5yZW5kZXIoIHNwcml0ZXNBcnJheSwgc2NlbmUsIGNhbWVyYSApOwoJCQlmbGFyZVJlbmRlcmVyLnJlbmRlciggZmxhcmVzQXJyYXksIHNjZW5lLCBjYW1lcmEsIF9jdXJyZW50Vmlld3BvcnQgKTsKCgkJCS8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nCgoJCQlpZiAoIHJlbmRlclRhcmdldCApIHsKCgkJCQl0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHJlbmRlclRhcmdldCApOwoKCQkJfQoKCQkJLy8gRW5zdXJlIGRlcHRoIGJ1ZmZlciB3cml0aW5nIGlzIGVuYWJsZWQgc28gaXQgY2FuIGJlIGNsZWFyZWQgb24gbmV4dCByZW5kZXIKCgkJCXN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApOwoJCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTsKCQkJc3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7CgoJCQlzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KCBmYWxzZSApOwoKCQkJaWYgKCB2ci5lbmFibGVkICkgewoKCQkJCXZyLnN1Ym1pdEZyYW1lKCk7CgoJCQl9CgoJCQkvLyBfZ2wuZmluaXNoKCk7CgoJCX07CgoJCS8qCgkJLy8gVE9ETyBEdXBsaWNhdGVkIGNvZGUgKEZydXN0dW0pCgoJCXZhciBfc3BoZXJlID0gbmV3IFNwaGVyZSgpOwoKCQlmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7CgoJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CgoJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkKCQkJCWdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJX3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLgoJCQlhcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApOwoKCQkJcmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTsKCgkJfQoKCQlmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJpdGUgKSB7CgoJCQlfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTsKCQkJX3NwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7CgkJCV9zcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTsKCgkJCXJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3BoZXJlICk7CgoJCX0KCgkJZnVuY3Rpb24gaXNTcGhlcmVWaWV3YWJsZSggc3BoZXJlICkgewoKCQkJaWYgKCAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApICkgcmV0dXJuIGZhbHNlOwoKCQkJdmFyIG51bVBsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7CgoJCQlpZiAoIG51bVBsYW5lcyA9PT0gMCApIHJldHVybiB0cnVlOwoKCQkJdmFyIHBsYW5lcyA9IF90aGlzLmNsaXBwaW5nUGxhbmVzLAoKCQkJCWNlbnRlciA9IHNwaGVyZS5jZW50ZXIsCgkJCQluZWdSYWQgPSAtIHNwaGVyZS5yYWRpdXMsCgkJCQlpID0gMDsKCgkJCWRvIHsKCgkJCQkvLyBvdXQgd2hlbiBkZWVwZXIgdGhhbiByYWRpdXMgaW4gdGhlIG5lZ2F0aXZlIGhhbGZzcGFjZQoJCQkJaWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApIDwgbmVnUmFkICkgcmV0dXJuIGZhbHNlOwoKCQkJfSB3aGlsZSAoICsrIGkgIT09IG51bVBsYW5lcyApOwoKCQkJcmV0dXJuIHRydWU7CgoJCX0KCQkqLwoKCQlmdW5jdGlvbiBwcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7CgoJCQlpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCgkJCXZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7CgoJCQlpZiAoIHZpc2libGUgKSB7CgoJCQkJaWYgKCBvYmplY3QuaXNMaWdodCApIHsKCgkJCQkJbGlnaHRzQXJyYXkucHVzaCggb2JqZWN0ICk7CgoJCQkJCWlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7CgoJCQkJCQlzaGFkb3dzQXJyYXkucHVzaCggb2JqZWN0ICk7CgoJCQkJCX0KCgkJCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7CgoJCQkJCWlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzU3ByaXRlKCBvYmplY3QgKSApIHsKCgkJCQkJCXNwcml0ZXNBcnJheS5wdXNoKCBvYmplY3QgKTsKCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc0xlbnNGbGFyZSApIHsKCgkJCQkJZmxhcmVzQXJyYXkucHVzaCggb2JqZWN0ICk7CgoJCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkgewoKCQkJCQlpZiAoIHNvcnRPYmplY3RzICkgewoKCQkJCQkJX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKQoJCQkJCQkJLmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTsKCgkJCQkJfQoKCQkJCQljdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIG51bGwsIG9iamVjdC5tYXRlcmlhbCwgX3ZlY3RvcjMueiwgbnVsbCApOwoKCQkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7CgoJCQkJCWlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggKSB7CgoJCQkJCQlvYmplY3Quc2tlbGV0b24udXBkYXRlKCk7CgoJCQkJCX0KCgkJCQkJaWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgewoKCQkJCQkJaWYgKCBzb3J0T2JqZWN0cyApIHsKCgkJCQkJCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApCgkJCQkJCQkJLmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTsKCgkJCQkJCX0KCgkJCQkJCXZhciBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTsKCQkJCQkJdmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKCQkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkgewoKCQkJCQkJCXZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CgoJCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgaSBdOwoJCQkJCQkJCXZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTsKCgkJCQkJCQkJaWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHsKCgkJCQkJCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdyb3VwTWF0ZXJpYWwsIF92ZWN0b3IzLnosIGdyb3VwICk7CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkgewoKCQkJCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQl2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc29ydE9iamVjdHMgKTsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiByZW5kZXJPYmplY3RzKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICkgewoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVuZGVyTGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdOwoKCQkJCXZhciBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDsKCQkJCXZhciBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7CgkJCQl2YXIgbWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSB1bmRlZmluZWQgPyByZW5kZXJJdGVtLm1hdGVyaWFsIDogb3ZlcnJpZGVNYXRlcmlhbDsKCQkJCXZhciBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7CgoJCQkJaWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSApIHsKCgkJCQkJX2N1cnJlbnRBcnJheUNhbWVyYSA9IGNhbWVyYTsKCgkJCQkJdmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhczsKCgkJCQkJZm9yICggdmFyIGogPSAwLCBqbCA9IGNhbWVyYXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgoJCQkJCQl2YXIgY2FtZXJhMiA9IGNhbWVyYXNbIGogXTsKCgkJCQkJCWlmICggb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEyLmxheWVycyApICkgewoKCQkJCQkJCXZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kczsKCgkJCQkJCQl2YXIgeCA9IGJvdW5kcy54ICogX3dpZHRoOwoJCQkJCQkJdmFyIHkgPSBib3VuZHMueSAqIF9oZWlnaHQ7CgkJCQkJCQl2YXIgd2lkdGggPSBib3VuZHMueiAqIF93aWR0aDsKCQkJCQkJCXZhciBoZWlnaHQgPSBib3VuZHMudyAqIF9oZWlnaHQ7CgoJCQkJCQkJc3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTsKCgkJCQkJCQlyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgoJCQkJCV9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsOwoKCQkJCQlyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApOwoKCQkJCX0KCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHsKCgkJCW9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTsKCgkJCW9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7CgkJCW9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7CgoJCQlpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHsKCgkJCQl2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7CgoJCQkJc3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApOwoKCQkJCXZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZS5mb2csIG1hdGVyaWFsLCBvYmplY3QgKTsKCgkJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnOwoKCQkJCXJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApOwoKCQkJfSBlbHNlIHsKCgkJCQlfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgc2NlbmUuZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTsKCgkJCX0KCgkJCW9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApOwoKCQl9CgoJCWZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkgewoKCQkJdmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApOwoKCQkJdmFyIHBhcmFtZXRlcnMgPSBwcm9ncmFtQ2FjaGUuZ2V0UGFyYW1ldGVycygKCQkJCW1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgZm9nLCBfY2xpcHBpbmcubnVtUGxhbmVzLCBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLCBvYmplY3QgKTsKCgkJCXZhciBjb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApOwoKCQkJdmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbTsKCQkJdmFyIHByb2dyYW1DaGFuZ2UgPSB0cnVlOwoKCQkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gbmV3IG1hdGVyaWFsCgkJCQltYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7CgoJCQl9IGVsc2UgaWYgKCBwcm9ncmFtLmNvZGUgIT09IGNvZGUgKSB7CgoJCQkJLy8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnMKCQkJCXJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7CgoJCQl9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3QKCQkJCXJldHVybjsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdAoJCQkJcHJvZ3JhbUNoYW5nZSA9IGZhbHNlOwoKCQkJfQoKCQkJaWYgKCBwcm9ncmFtQ2hhbmdlICkgewoKCQkJCWlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHsKCgkJCQkJdmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdOwoKCQkJCQltYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0gewoJCQkJCQluYW1lOiBtYXRlcmlhbC50eXBlLAoJCQkJCQl1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICksCgkJCQkJCXZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlciwKCQkJCQkJZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlcgoJCQkJCX07CgoJCQkJfSBlbHNlIHsKCgkJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciA9IHsKCQkJCQkJbmFtZTogbWF0ZXJpYWwudHlwZSwKCQkJCQkJdW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLAoJCQkJCQl2ZXJ0ZXhTaGFkZXI6IG1hdGVyaWFsLnZlcnRleFNoYWRlciwKCQkJCQkJZnJhZ21lbnRTaGFkZXI6IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyCgkJCQkJfTsKCgkJCQl9CgoJCQkJbWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyICk7CgoJCQkJcHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggbWF0ZXJpYWwsIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKTsKCgkJCQltYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9IHByb2dyYW07CgkJCQltYXRlcmlhbC5wcm9ncmFtID0gcHJvZ3JhbTsKCgkJCX0KCgkJCXZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpOwoKCQkJaWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7CgoJCQkJbWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzID0gMDsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysgKSB7CgoJCQkJCWlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaFRhcmdldCcgKyBpIF0gPj0gMCApIHsKCgkJCQkJCW1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyArKzsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxzICkgewoKCQkJCW1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7CgoJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhOb3JtYWxzOyBpICsrICkgewoKCQkJCQlpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7CgoJCQkJCQltYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQl2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zOwoKCQkJaWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYKCQkJCSEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fAoJCQkJbWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7CgoJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lczsKCQkJCW1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gPSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uOwoJCQkJdW5pZm9ybXMuY2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcudW5pZm9ybTsKCgkJCX0KCgkJCW1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBmb2c7CgoJCQkvLyBzdG9yZSB0aGUgbGlnaHQgc2V0dXAgaXQgd2FzIGNyZWF0ZWQgZm9yCgoJCQltYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCA9IGxpZ2h0cy5zdGF0ZS5oYXNoOwoKCQkJaWYgKCBtYXRlcmlhbC5saWdodHMgKSB7CgoJCQkJLy8gd2lyZSB1cCB0aGUgbWF0ZXJpYWwgdG8gdGhpcyByZW5kZXJlcidzIGxpZ2h0aW5nIHN0YXRlCgoJCQkJdW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDsKCQkJCXVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsOwoJCQkJdW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90OwoJCQkJdW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7CgkJCQl1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDsKCQkJCXVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuaGVtaTsKCgkJCQl1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcDsKCQkJCXVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4OwoJCQkJdW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWFwOwoJCQkJdW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWF0cml4OwoJCQkJdW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXA7CgkJCQl1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeDsKCQkJCS8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXMKCgkJCX0KCgkJCXZhciBwcm9nVW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbS5nZXRVbmlmb3JtcygpLAoJCQkJdW5pZm9ybXNMaXN0ID0KCQkJCQlXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTsKCgkJCW1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPSB1bmlmb3Jtc0xpc3Q7CgoJCX0KCgkJZnVuY3Rpb24gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7CgoJCQlfdXNlZFRleHR1cmVVbml0cyA9IDA7CgoJCQl2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7CgoJCQlpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7CgoJCQkJaWYgKCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHsKCgkJCQkJdmFyIHVzZUNhY2hlID0KCQkJCQkJY2FtZXJhID09PSBfY3VycmVudENhbWVyYSAmJgoJCQkJCQltYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkOwoKCQkJCQkvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cAoJCQkJCS8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlCgkJCQkJLy8gKCM4NDY1LCAjODM3OSkKCQkJCQlfY2xpcHBpbmcuc2V0U3RhdGUoCgkJCQkJCW1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLCBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uLCBtYXRlcmlhbC5jbGlwU2hhZG93cywKCQkJCQkJY2FtZXJhLCBtYXRlcmlhbFByb3BlcnRpZXMsIHVzZUNhY2hlICk7CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSB7CgoJCQkJaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQltYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHsKCgkJCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7CgoJCQkJCW1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJgoJCQkJCSggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSBfY2xpcHBpbmcubnVtUGxhbmVzIHx8CgkJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiApICkgewoKCQkJCQltYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSApIHsKCgkJCQlpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApOwoJCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTsKCgkJCX0KCgkJCXZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlOwoJCQl2YXIgcmVmcmVzaE1hdGVyaWFsID0gZmFsc2U7CgkJCXZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7CgoJCQl2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLAoJCQkJcF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSwKCQkJCW1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zOwoKCQkJaWYgKCBzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKSApIHsKCgkJCQlyZWZyZXNoUHJvZ3JhbSA9IHRydWU7CgkJCQlyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOwoJCQkJcmVmcmVzaExpZ2h0cyA9IHRydWU7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7CgoJCQkJX2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7CgoJCQkJcmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTsKCgkJCX0KCgkJCWlmICggcmVmcmVzaFByb2dyYW0gfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHsKCgkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsKCgkJCQlpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkgewoKCQkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJywKCQkJCQkJMi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIgKSApOwoKCQkJCX0KCgkJCQkvLyBBdm9pZCB1bm5lZWRlZCB1bmlmb3JtIHVwZGF0ZXMgcGVyIEFycmF5Q2FtZXJhJ3Mgc3ViLWNhbWVyYQoKCQkJCWlmICggX2N1cnJlbnRDYW1lcmEgIT09ICggX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKSApIHsKCgkJCQkJX2N1cnJlbnRDYW1lcmEgPSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7CgoJCQkJCS8vIGxpZ2h0aW5nIHVuaWZvcm1zIGRlcGVuZCBvbiB0aGUgY2FtZXJhIHNvIGVuZm9yY2UgYW4gdXBkYXRlCgkJCQkJLy8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW4KCQkJCQkvLyB0aGUgbmV4dCBtYXRlcmlhbCB0aGF0IGRvZXMgZ2V0cyBhY3RpdmF0ZWQ6CgoJCQkJCXJlZnJlc2hNYXRlcmlhbCA9IHRydWU7CQkvLyBzZXQgdG8gdHJ1ZSBvbiBtYXRlcmlhbCBjaGFuZ2UKCQkJCQlyZWZyZXNoTGlnaHRzID0gdHJ1ZTsJCS8vIHJlbWFpbnMgc2V0IHVudGlsIHVwZGF0ZSBkb25lCgoJCQkJfQoKCQkJCS8vIGxvYWQgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9ybXMKCQkJCS8vIChzaGFkZXIgbWF0ZXJpYWwgYWxzbyBnZXRzIHRoZW0gZm9yIHRoZSBzYWtlIG9mIGdlbmVyaWNpdHkpCgoJCQkJaWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8CgkJCQkJbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fAoJCQkJCW1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwKCQkJCQltYXRlcmlhbC5lbnZNYXAgKSB7CgoJCQkJCXZhciB1Q2FtUG9zID0gcF91bmlmb3Jtcy5tYXAuY2FtZXJhUG9zaXRpb247CgoJCQkJCWlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJdUNhbVBvcy5zZXRWYWx1ZSggX2dsLAoJCQkJCQkJX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fAoJCQkJCW1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fAoJCQkJCW1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHwKCQkJCQltYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8CgkJCQkJbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fAoJCQkJCW1hdGVyaWFsLnNraW5uaW5nICkgewoKCQkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd2aWV3TWF0cml4JywgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOwoKCQkJCX0KCgkJCX0KCgkJCS8vIHNraW5uaW5nIHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZQoJCQkvLyBhdXRvLXNldHRpbmcgb2YgdGV4dHVyZSB1bml0IGZvciBib25lIHRleHR1cmUgbXVzdCBnbyBiZWZvcmUgb3RoZXIgdGV4dHVyZXMKCQkJLy8gbm90IHN1cmUgd2h5LCBidXQgb3RoZXJ3aXNlIHdlaXJkIHRoaW5ncyBoYXBwZW4KCgkJCWlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7CgoJCQkJcF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4JyApOwoJCQkJcF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4SW52ZXJzZScgKTsKCgkJCQl2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247CgoJCQkJaWYgKCBza2VsZXRvbiApIHsKCgkJCQkJdmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7CgoJCQkJCWlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7CgoJCQkJCQlpZiAoIHNrZWxldG9uLmJvbmVUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkJLy8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKQoJCQkJCQkJLy8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KQoJCQkJCQkJLy8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOCkKCQkJCQkJCS8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KQoJCQkJCQkJLy8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpCgkJCQkJCQkvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NCkKCgoJCQkJCQkJdmFyIHNpemUgPSBNYXRoLnNxcnQoIGJvbmVzLmxlbmd0aCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeAoJCQkJCQkJc2l6ZSA9IF9NYXRoLmNlaWxQb3dlck9mVHdvKCBzaXplICk7CgkJCQkJCQlzaXplID0gTWF0aC5tYXgoIHNpemUsIDQgKTsKCgkJCQkJCQl2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsCgkJCQkJCQlib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlcwoKCQkJCQkJCXZhciBib25lVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTsKCgkJCQkJCQlza2VsZXRvbi5ib25lTWF0cmljZXMgPSBib25lTWF0cmljZXM7CgkJCQkJCQlza2VsZXRvbi5ib25lVGV4dHVyZSA9IGJvbmVUZXh0dXJlOwoJCQkJCQkJc2tlbGV0b24uYm9uZVRleHR1cmVTaXplID0gc2l6ZTsKCgkJCQkJCX0KCgkJCQkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlJywgc2tlbGV0b24uYm9uZVRleHR1cmUgKTsKCQkJCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmVTaXplJywgc2tlbGV0b24uYm9uZVRleHR1cmVTaXplICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIHNrZWxldG9uLCAnYm9uZU1hdHJpY2VzJyApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfQoKCQkJaWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7CgoJCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdFeHBvc3VyZScsIF90aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTsKCQkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nV2hpdGVQb2ludCcsIF90aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCApOwoKCQkJCWlmICggbWF0ZXJpYWwubGlnaHRzICkgewoKCQkJCQkvLyB0aGUgY3VycmVudCBtYXRlcmlhbCByZXF1aXJlcyBsaWdodGluZyBpbmZvCgoJCQkJCS8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHkKCQkJCQkvLyB0aGV5IHNpbXBseSByZWZlcmVuY2UgdGhlIHJlbmRlcmVyJ3Mgc3RhdGUgZm9yIHRoZWlyCgkJCQkJLy8gdmFsdWVzCgkJCQkJLy8KCQkJCQkvLyB1c2UgdGhlIGN1cnJlbnQgbWF0ZXJpYWwncyAubmVlZHNVcGRhdGUgZmxhZ3MgdG8gc2V0CgkJCQkJLy8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWQKCgkJCQkJbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIG1fdW5pZm9ybXMsIHJlZnJlc2hMaWdodHMgKTsKCgkJCQl9CgoJCQkJLy8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHMKCgkJCQlpZiAoIGZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7CgoJCQkJCXJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7CgoJCQkJfQoKCQkJCWlmICggbWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCApIHsKCgkJCQkJcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoKCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCApIHsKCgkJCQkJcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoJCQkJCXJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHsKCgkJCQkJcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoKCQkJCQlpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCApIHsKCgkJCQkJCXJlZnJlc2hVbmlmb3Jtc1Rvb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7CgoJCQkJCXJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCgkJCQkJaWYgKCBtYXRlcmlhbC5pc01lc2hQaHlzaWNhbE1hdGVyaWFsICkgewoKCQkJCQkJcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7CgoJCQkJCXJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCQkJCQlyZWZyZXNoVW5pZm9ybXNEZXB0aCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCgkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkgewoKCQkJCQlyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgkJCQkJcmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgKSB7CgoJCQkJCXJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCQkJCQlyZWZyZXNoVW5pZm9ybXNOb3JtYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHsKCgkJCQkJcmVmcmVzaFVuaWZvcm1zTGluZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCgkJCQkJaWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHsKCgkJCQkJCXJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJCX0KCgkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkgewoKCQkJCQlyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgoJCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTaGFkb3dNYXRlcmlhbCApIHsKCgkJCQkJbV91bmlmb3Jtcy5jb2xvci52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yOwoJCQkJCW1fdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CgoJCQkJfQoKCQkJCS8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZQoJCQkJLy8gVE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uCgoJCQkJaWYgKCBtX3VuaWZvcm1zLmx0Y01hdCAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNNYXQudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfTUFUX1RFWFRVUkU7CgkJCQlpZiAoIG1fdW5pZm9ybXMubHRjTWFnICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y01hZy52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ19NQUdfVEVYVFVSRTsKCgkJCQlXZWJHTFVuaWZvcm1zLnVwbG9hZCgKCQkJCQlfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7CgoJCQl9CgoKCQkJLy8gY29tbW9uIG1hdHJpY2VzCgoJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbFZpZXdNYXRyaXgnLCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7CgkJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxNYXRyaXggKTsKCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTsKCgkJCXJldHVybiBwcm9ncmFtOwoKCQl9CgoJCS8vIFVuaWZvcm1zIChyZWZyZXNoIHVuaWZvcm1zIG9iamVjdHMpCgoJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKCQkJdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CgoJCQlpZiAoIG1hdGVyaWFsLmNvbG9yICkgewoKCQkJCXVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwuZW1pc3NpdmUgKSB7CgoJCQkJdW5pZm9ybXMuZW1pc3NpdmUudmFsdWUuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKS5tdWx0aXBseVNjYWxhciggbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgKTsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwubWFwICkgewoKCQkJCXVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7CgoJCQkJdW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7CgoJCQkJdW5pZm9ybXMuc3BlY3VsYXJNYXAudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwuZW52TWFwICkgewoKCQkJCXVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsKCgkJCQkvLyBkb24ndCBmbGlwIEN1YmVUZXh0dXJlIGVudk1hcHMsIGZsaXAgZXZlcnl0aGluZyBlbHNlOgoJCQkJLy8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB3aWxsIGJlIGZsaXBwZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgkJCQkvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgd2lsbCBiZSBmbGlwcGVkIGJlY2F1c2UgaXQncyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlCgkJCQkvLyB0aGlzIGNoZWNrIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgb3IgcmVtb3ZlZCBlbnRpcmVseSwgaWYgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHVzZXMgYSBDdWJlVGV4dHVyZSBpbiB0aGUgZnV0dXJlCgkJCQl1bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCAhICggbWF0ZXJpYWwuZW52TWFwICYmIG1hdGVyaWFsLmVudk1hcC5pc0N1YmVUZXh0dXJlICkgKSA/IDEgOiAtIDE7CgoJCQkJdW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5OwoJCQkJdW5pZm9ybXMucmVmcmFjdGlvblJhdGlvLnZhbHVlID0gbWF0ZXJpYWwucmVmcmFjdGlvblJhdGlvOwoKCQkJfQoKCQkJaWYgKCBtYXRlcmlhbC5saWdodE1hcCApIHsKCgkJCQl1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwOwoJCQkJdW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwuYW9NYXAgKSB7CgoJCQkJdW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDsKCQkJCXVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7CgoJCQl9CgoJCQkvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXMKCQkJLy8gMS4gY29sb3IgbWFwCgkJCS8vIDIuIHNwZWN1bGFyIG1hcAoJCQkvLyAzLiBub3JtYWwgbWFwCgkJCS8vIDQuIGJ1bXAgbWFwCgkJCS8vIDUuIGFscGhhIG1hcAoJCQkvLyA2LiBlbWlzc2l2ZSBtYXAKCgkJCXZhciB1dlNjYWxlTWFwOwoKCQkJaWYgKCBtYXRlcmlhbC5tYXAgKSB7CgoJCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDsKCgkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkgewoKCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDsKCgkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKCgkJCQl1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOwoKCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkgewoKCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CgoJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5idW1wTWFwICkgewoKCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwOwoKCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkgewoKCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CgoJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7CgoJCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDsKCgkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkgewoKCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDsKCgkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgewoKCQkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDsKCgkJCX0KCgkJCWlmICggdXZTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCS8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgkJCQlpZiAoIHV2U2NhbGVNYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHsKCgkJCQkJdXZTY2FsZU1hcCA9IHV2U2NhbGVNYXAudGV4dHVyZTsKCgkJCQl9CgoJCQkJaWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7CgoJCQkJCXZhciBvZmZzZXQgPSB1dlNjYWxlTWFwLm9mZnNldDsKCQkJCQl2YXIgcmVwZWF0ID0gdXZTY2FsZU1hcC5yZXBlYXQ7CgkJCQkJdmFyIHJvdGF0aW9uID0gdXZTY2FsZU1hcC5yb3RhdGlvbjsKCQkJCQl2YXIgY2VudGVyID0gdXZTY2FsZU1hcC5jZW50ZXI7CgoJCQkJCXV2U2NhbGVNYXAubWF0cml4LnNldFV2VHJhbnNmb3JtKCBvZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSwgcm90YXRpb24sIGNlbnRlci54LCBjZW50ZXIueSApOwoKCQkJCX0KCgkJCQl1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCgkJCXVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjsKCQkJdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CgoJCX0KCgkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGFzaCggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKCQkJdW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZTsKCQkJdW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplOwoJCQl1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IG1hdGVyaWFsLnNjYWxlOwoKCQl9CgoJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKCQkJdW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yOwoJCQl1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKCQkJdW5pZm9ybXMuc2l6ZS52YWx1ZSA9IG1hdGVyaWFsLnNpemUgKiBfcGl4ZWxSYXRpbzsKCQkJdW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41OwoKCQkJdW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwOwoKCQkJaWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7CgoJCQkJaWYgKCBtYXRlcmlhbC5tYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHsKCgkJCQkJdmFyIG9mZnNldCA9IG1hdGVyaWFsLm1hcC5vZmZzZXQ7CgkJCQkJdmFyIHJlcGVhdCA9IG1hdGVyaWFsLm1hcC5yZXBlYXQ7CgkJCQkJdmFyIHJvdGF0aW9uID0gbWF0ZXJpYWwubWFwLnJvdGF0aW9uOwoJCQkJCXZhciBjZW50ZXIgPSBtYXRlcmlhbC5tYXAuY2VudGVyOwoKCQkJCQltYXRlcmlhbC5tYXAubWF0cml4LnNldFV2VHJhbnNmb3JtKCBvZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSwgcm90YXRpb24sIGNlbnRlci54LCBjZW50ZXIueSApOwoKCQkJCX0KCgkJCQl1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5tYXAubWF0cml4ICk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkgewoKCQkJdW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7CgoJCQlpZiAoIGZvZy5pc0ZvZyApIHsKCgkJCQl1bmlmb3Jtcy5mb2dOZWFyLnZhbHVlID0gZm9nLm5lYXI7CgkJCQl1bmlmb3Jtcy5mb2dGYXIudmFsdWUgPSBmb2cuZmFyOwoKCQkJfSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHsKCgkJCQl1bmlmb3Jtcy5mb2dEZW5zaXR5LnZhbHVlID0gZm9nLmRlbnNpdHk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKCQkJaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHsKCgkJCQl1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CgoJCQl1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyOwoJCQl1bmlmb3Jtcy5zaGluaW5lc3MudmFsdWUgPSBNYXRoLm1heCggbWF0ZXJpYWwuc2hpbmluZXNzLCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApCgoJCQlpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgewoKCQkJCXVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CgoJCQkJdW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7CgkJCQl1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKCgkJCQl1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CgkJCQl1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOwoKCQkJfQoKCQkJaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7CgoJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOwoJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKCQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCgkJCXJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTsKCgkJCWlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7CgoJCQkJdW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKCQkJdW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzOwoJCQl1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7CgoJCQlpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHsKCgkJCQl1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHsKCgkJCQl1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgewoKCQkJCXVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CgoJCQkJdW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7CgkJCQl1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKCgkJCQl1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CgkJCQl1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOwoKCQkJfQoKCQkJaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7CgoJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOwoJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKCQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOwoKCQkJfQoKCQkJaWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7CgoJCQkJLy91bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7IC8vIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uCgkJCQl1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCgkJCXVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDsKCQkJdW5pZm9ybXMuY2xlYXJDb2F0Um91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzOwoKCQkJcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApOwoKCQl9CgoJCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CgoJCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKCgkJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CgkJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlOwoJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCgkJCWlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgewoKCQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKCQkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7CgkJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhczsKCgkJCX0KCgkJCXVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnJlZmVyZW5jZVBvc2l0aW9uICk7CgkJCXVuaWZvcm1zLm5lYXJEaXN0YW5jZS52YWx1ZSA9IG1hdGVyaWFsLm5lYXJEaXN0YW5jZTsKCQkJdW5pZm9ybXMuZmFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5mYXJEaXN0YW5jZTsKCgkJfQoKCQlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNOb3JtYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCgkJCWlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHsKCgkJCQl1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDsKCQkJCXVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTsKCgkJCX0KCgkJCWlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkgewoKCQkJCXVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKCQkJCXVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKCgkJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CgkJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlOwoJCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7CgoJCQl9CgoJCX0KCgkJLy8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLgoKCQlmdW5jdGlvbiBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggdW5pZm9ybXMsIHZhbHVlICkgewoKCQkJdW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGUgPSB2YWx1ZTsKCgkJCXVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CgkJCXVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CgkJCXVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKCQkJdW5pZm9ybXMucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKCQkJdW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwoKCQl9CgoJCS8vIEdMIHN0YXRlIHNldHRpbmcKCgkJdGhpcy5zZXRGYWNlQ3VsbGluZyA9IGZ1bmN0aW9uICggY3VsbEZhY2UsIGZyb250RmFjZURpcmVjdGlvbiApIHsKCgkJCXN0YXRlLnNldEN1bGxGYWNlKCBjdWxsRmFjZSApOwoJCQlzdGF0ZS5zZXRGbGlwU2lkZWQoIGZyb250RmFjZURpcmVjdGlvbiA9PT0gRnJvbnRGYWNlRGlyZWN0aW9uQ1cgKTsKCgkJfTsKCgkJLy8gVGV4dHVyZXMKCgkJZnVuY3Rpb24gYWxsb2NUZXh0dXJlVW5pdCgpIHsKCgkJCXZhciB0ZXh0dXJlVW5pdCA9IF91c2VkVGV4dHVyZVVuaXRzOwoKCQkJaWYgKCB0ZXh0dXJlVW5pdCA+PSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7CgoJCQl9CgoJCQlfdXNlZFRleHR1cmVVbml0cyArPSAxOwoKCQkJcmV0dXJuIHRleHR1cmVVbml0OwoKCQl9CgoJCXRoaXMuYWxsb2NUZXh0dXJlVW5pdCA9IGFsbG9jVGV4dHVyZVVuaXQ7CgoJCS8vIHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEOwoJCXRoaXMuc2V0VGV4dHVyZTJEID0gKCBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgd2FybmVkID0gZmFsc2U7CgoJCQkvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmUKCQkJcmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHsKCgkJCQlpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgewoKCQkJCQlpZiAoICEgd2FybmVkICkgewoKCQkJCQkJY29uc29sZS53YXJuKCAiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiApOwoJCQkJCQl3YXJuZWQgPSB0cnVlOwoKCQkJCQl9CgoJCQkJCXRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7CgoJCQkJfQoKCQkJCXRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApOwoKCQkJfTsKCgkJfSgpICk7CgoJCXRoaXMuc2V0VGV4dHVyZSA9ICggZnVuY3Rpb24gKCkgewoKCQkJdmFyIHdhcm5lZCA9IGZhbHNlOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUoIHRleHR1cmUsIHNsb3QgKSB7CgoJCQkJaWYgKCAhIHdhcm5lZCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRleHR1cmUyRCBpbnN0ZWFkLiIgKTsKCQkJCQl3YXJuZWQgPSB0cnVlOwoKCQkJCX0KCgkJCQl0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTsKCgkJCX07CgoJCX0oKSApOwoKCQl0aGlzLnNldFRleHR1cmVDdWJlID0gKCBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgd2FybmVkID0gZmFsc2U7CgoJCQlyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7CgoJCQkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlCgkJCQlpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHsKCgkJCQkJaWYgKCAhIHdhcm5lZCApIHsKCgkJCQkJCWNvbnNvbGUud2FybiggIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iICk7CgkJCQkJCXdhcm5lZCA9IHRydWU7CgoJCQkJCX0KCgkJCQkJdGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTsKCgkJCQl9CgoJCQkJLy8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlCgkJCQkvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzCgkJCQlpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8fAoJCQkJCSggQXJyYXkuaXNBcnJheSggdGV4dHVyZS5pbWFnZSApICYmIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkgKSB7CgoJCQkJCS8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovCgoJCQkJCS8vIHRoaXMgZnVuY3Rpb24gYWxvbmUgc2hvdWxkIHRha2UgY2FyZSBvZiBjdWJlIHRleHR1cmVzCgkJCQkJdGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQkvLyBhc3N1bWVkOiB0ZXh0dXJlIHByb3BlcnR5IG9mIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZQoKCQkJCQl0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKTsKCgkJCQl9CgoJCQl9OwoKCQl9KCkgKTsKCgkJdGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQ7CgoJCX07CgoJCXRoaXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQgKSB7CgoJCQlfY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDsKCgkJCWlmICggcmVuZGVyVGFyZ2V0ICYmIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHsKCgkJCQl0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7CgoJCQl9CgoJCQl2YXIgZnJhbWVidWZmZXIgPSBudWxsOwoJCQl2YXIgaXNDdWJlID0gZmFsc2U7CgoJCQlpZiAoIHJlbmRlclRhcmdldCApIHsKCgkJCQl2YXIgX193ZWJnbEZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjsKCgkJCQlpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHsKCgkJCQkJZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSBdOwoJCQkJCWlzQ3ViZSA9IHRydWU7CgoJCQkJfSBlbHNlIHsKCgkJCQkJZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXI7CgoJCQkJfQoKCQkJCV9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7CgkJCQlfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTsKCQkJCV9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7CgoJCQl9IGVsc2UgewoKCQkJCV9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7CgkJCQlfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKTsKCQkJCV9jdXJyZW50U2Npc3NvclRlc3QgPSBfc2Npc3NvclRlc3Q7CgoJCQl9CgoJCQlpZiAoIF9jdXJyZW50RnJhbWVidWZmZXIgIT09IGZyYW1lYnVmZmVyICkgewoKCQkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTsKCQkJCV9jdXJyZW50RnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKCgkJCX0KCgkJCXN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7CgkJCXN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApOwoJCQlzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApOwoKCQkJaWYgKCBpc0N1YmUgKSB7CgoJCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7CgkJCQlfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgcmVuZGVyVGFyZ2V0LmFjdGl2ZU1pcE1hcExldmVsICk7CgoJCQl9CgoJCX07CgoJCXRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIgKSB7CgoJCQlpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCXZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7CgoJCQlpZiAoIGZyYW1lYnVmZmVyICkgewoKCQkJCXZhciByZXN0b3JlID0gZmFsc2U7CgoJCQkJaWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJlbnRGcmFtZWJ1ZmZlciApIHsKCgkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApOwoKCQkJCQlyZXN0b3JlID0gdHJ1ZTsKCgkJCQl9CgoJCQkJdHJ5IHsKCgkJCQkJdmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTsKCQkJCQl2YXIgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0OwoJCQkJCXZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTsKCgkJCQkJaWYgKCB0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7CgoJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuJyApOwoJCQkJCQlyZXR1cm47CgoJCQkJCX0KCgkJCQkJaWYgKCB0ZXh0dXJlVHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFICkgJiYgLy8gSUUxMSwgRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMykKCQkJCQkJISAoIHRleHR1cmVUeXBlID09PSBGbG9hdFR5cGUgJiYgKCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94CgkJCQkJCSEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKSApICkgewoKCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7CgkJCQkJCXJldHVybjsKCgkJCQkJfQoKCQkJCQlpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkgewoKCQkJCQkJLy8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KQoKCQkJCQkJaWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHsKCgkJCQkJCQlfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApLCBidWZmZXIgKTsKCgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApOwoKCQkJCQl9CgoJCQkJfSBmaW5hbGx5IHsKCgkJCQkJaWYgKCByZXN0b3JlICkgewoKCQkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfY3VycmVudEZyYW1lYnVmZmVyICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCX07CgoJfQoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBGb2dFeHAyKCBjb2xvciwgZGVuc2l0eSApIHsKCgkJdGhpcy5uYW1lID0gJyc7CgoJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7CgkJdGhpcy5kZW5zaXR5ID0gKCBkZW5zaXR5ICE9PSB1bmRlZmluZWQgKSA/IGRlbnNpdHkgOiAwLjAwMDI1OwoKCX0KCglGb2dFeHAyLnByb3RvdHlwZS5pc0ZvZ0V4cDIgPSB0cnVlOwoKCUZvZ0V4cDIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewoKCQlyZXR1cm4gbmV3IEZvZ0V4cDIoIHRoaXMuY29sb3IuZ2V0SGV4KCksIHRoaXMuZGVuc2l0eSApOwoKCX07CgoJRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkgewoKCQlyZXR1cm4gewoJCQl0eXBlOiAnRm9nRXhwMicsCgkJCWNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLAoJCQlkZW5zaXR5OiB0aGlzLmRlbnNpdHkKCQl9OwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIEZvZyggY29sb3IsIG5lYXIsIGZhciApIHsKCgkJdGhpcy5uYW1lID0gJyc7CgoJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7CgoJCXRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTsKCQl0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDEwMDA7CgoJfQoKCUZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlOwoKCUZvZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CgoJCXJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7CgoJfTsKCglGb2cucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggLyogbWV0YSAqLyApIHsKCgkJcmV0dXJuIHsKCQkJdHlwZTogJ0ZvZycsCgkJCWNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLAoJCQluZWFyOiB0aGlzLm5lYXIsCgkJCWZhcjogdGhpcy5mYXIKCQl9OwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gU2NlbmUoKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1NjZW5lJzsKCgkJdGhpcy5iYWNrZ3JvdW5kID0gbnVsbDsKCQl0aGlzLmZvZyA9IG51bGw7CgkJdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDsKCgkJdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVyZXIKCgl9CgoJU2NlbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IFNjZW5lLAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkgewoKCQkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTsKCgkJCWlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpOwoJCQlpZiAoIHNvdXJjZS5mb2cgIT09IG51bGwgKSB0aGlzLmZvZyA9IHNvdXJjZS5mb2cuY2xvbmUoKTsKCQkJaWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7CgoJCQl0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTsKCQkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgoJCQl2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOwoKCQkJaWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApOwoJCQlpZiAoIHRoaXMuZm9nICE9PSBudWxsICkgZGF0YS5vYmplY3QuZm9nID0gdGhpcy5mb2cudG9KU09OKCk7CgoJCQlyZXR1cm4gZGF0YTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gTGVuc0ZsYXJlKCB0ZXh0dXJlLCBzaXplLCBkaXN0YW5jZSwgYmxlbmRpbmcsIGNvbG9yICkgewoKCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgoJCXRoaXMubGVuc0ZsYXJlcyA9IFtdOwoKCQl0aGlzLnBvc2l0aW9uU2NyZWVuID0gbmV3IFZlY3RvcjMoKTsKCQl0aGlzLmN1c3RvbVVwZGF0ZUNhbGxiYWNrID0gdW5kZWZpbmVkOwoKCQlpZiAoIHRleHR1cmUgIT09IHVuZGVmaW5lZCApIHsKCgkJCXRoaXMuYWRkKCB0ZXh0dXJlLCBzaXplLCBkaXN0YW5jZSwgYmxlbmRpbmcsIGNvbG9yICk7CgoJCX0KCgl9CgoJTGVuc0ZsYXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBMZW5zRmxhcmUsCgoJCWlzTGVuc0ZsYXJlOiB0cnVlLAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQkJdGhpcy5wb3NpdGlvblNjcmVlbi5jb3B5KCBzb3VyY2UucG9zaXRpb25TY3JlZW4gKTsKCQkJdGhpcy5jdXN0b21VcGRhdGVDYWxsYmFjayA9IHNvdXJjZS5jdXN0b21VcGRhdGVDYWxsYmFjazsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5sZW5zRmxhcmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdGhpcy5sZW5zRmxhcmVzLnB1c2goIHNvdXJjZS5sZW5zRmxhcmVzWyBpIF0gKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlhZGQ6IGZ1bmN0aW9uICggdGV4dHVyZSwgc2l6ZSwgZGlzdGFuY2UsIGJsZW5kaW5nLCBjb2xvciwgb3BhY2l0eSApIHsKCgkJCWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IC0gMTsKCQkJaWYgKCBkaXN0YW5jZSA9PT0gdW5kZWZpbmVkICkgZGlzdGFuY2UgPSAwOwoJCQlpZiAoIG9wYWNpdHkgPT09IHVuZGVmaW5lZCApIG9wYWNpdHkgPSAxOwoJCQlpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKCQkJaWYgKCBibGVuZGluZyA9PT0gdW5kZWZpbmVkICkgYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZzsKCgkJCWRpc3RhbmNlID0gTWF0aC5taW4oIGRpc3RhbmNlLCBNYXRoLm1heCggMCwgZGlzdGFuY2UgKSApOwoKCQkJdGhpcy5sZW5zRmxhcmVzLnB1c2goIHsKCQkJCXRleHR1cmU6IHRleHR1cmUsCS8vIFRIUkVFLlRleHR1cmUKCQkJCXNpemU6IHNpemUsIAkJLy8gc2l6ZSBpbiBwaXhlbHMgKC0xID0gdXNlIHRleHR1cmUud2lkdGgpCgkJCQlkaXN0YW5jZTogZGlzdGFuY2UsIAkvLyBkaXN0YW5jZSAoMC0xKSBmcm9tIGxpZ2h0IHNvdXJjZSAoMD1hdCBsaWdodCBzb3VyY2UpCgkJCQl4OiAwLCB5OiAwLCB6OiAwLAkvLyBzY3JlZW4gcG9zaXRpb24gKC0xID0+IDEpIHogPSAwIGlzIGluIGZyb250IHogPSAxIGlzIGJhY2sKCQkJCXNjYWxlOiAxLCAJCS8vIHNjYWxlCgkJCQlyb3RhdGlvbjogMCwgCQkvLyByb3RhdGlvbgoJCQkJb3BhY2l0eTogb3BhY2l0eSwJLy8gb3BhY2l0eQoJCQkJY29sb3I6IGNvbG9yLAkJLy8gY29sb3IKCQkJCWJsZW5kaW5nOiBibGVuZGluZwkvLyBibGVuZGluZwoJCQl9ICk7CgoJCX0sCgoJCS8qCgkJICogVXBkYXRlIGxlbnMgZmxhcmVzIHVwZGF0ZSBwb3NpdGlvbnMgb24gYWxsIGZsYXJlcyBiYXNlZCBvbiB0aGUgc2NyZWVuIHBvc2l0aW9uCgkJICogU2V0IG15TGVuc0ZsYXJlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrIHRvIGFsdGVyIHRoZSBmbGFyZXMgaW4geW91ciBwcm9qZWN0IHNwZWNpZmljIHdheS4KCQkgKi8KCgkJdXBkYXRlTGVuc0ZsYXJlczogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGYsIGZsID0gdGhpcy5sZW5zRmxhcmVzLmxlbmd0aDsKCQkJdmFyIGZsYXJlOwoJCQl2YXIgdmVjWCA9IC0gdGhpcy5wb3NpdGlvblNjcmVlbi54ICogMjsKCQkJdmFyIHZlY1kgPSAtIHRoaXMucG9zaXRpb25TY3JlZW4ueSAqIDI7CgoJCQlmb3IgKCBmID0gMDsgZiA8IGZsOyBmICsrICkgewoKCQkJCWZsYXJlID0gdGhpcy5sZW5zRmxhcmVzWyBmIF07CgoJCQkJZmxhcmUueCA9IHRoaXMucG9zaXRpb25TY3JlZW4ueCArIHZlY1ggKiBmbGFyZS5kaXN0YW5jZTsKCQkJCWZsYXJlLnkgPSB0aGlzLnBvc2l0aW9uU2NyZWVuLnkgKyB2ZWNZICogZmxhcmUuZGlzdGFuY2U7CgoJCQkJZmxhcmUud2FudGVkUm90YXRpb24gPSBmbGFyZS54ICogTWF0aC5QSSAqIDAuMjU7CgkJCQlmbGFyZS5yb3RhdGlvbiArPSAoIGZsYXJlLndhbnRlZFJvdGF0aW9uIC0gZmxhcmUucm90YXRpb24gKSAqIDAuMjU7CgoJCQl9CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICoKCSAqIHBhcmFtZXRlcnMgPSB7CgkgKiAgY29sb3I6IDxoZXg+LAoJICogIG9wYWNpdHk6IDxmbG9hdD4sCgkgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICoKCSAqCXV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLAoJICoJdXZTY2FsZTogbmV3IFRIUkVFLlZlY3RvcjIoKQoJICogfQoJICovCgoJZnVuY3Rpb24gU3ByaXRlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJzsKCgkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKCQl0aGlzLm1hcCA9IG51bGw7CgoJCXRoaXMucm90YXRpb24gPSAwOwoKCQl0aGlzLmZvZyA9IGZhbHNlOwoJCXRoaXMubGlnaHRzID0gZmFsc2U7CgoJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgoJfQoKCVNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwoJU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7CglTcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7CgoJU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CgkJdGhpcy5tYXAgPSBzb3VyY2UubWFwOwoKCQl0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBTcHJpdGUoIG1hdGVyaWFsICkgewoKCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdTcHJpdGUnOwoKCQl0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpOwoKCX0KCglTcHJpdGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IFNwcml0ZSwKCgkJaXNTcHJpdGU6IHRydWUsCgoJCXJheWNhc3Q6ICggZnVuY3Rpb24gKCkgewoKCQkJdmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIHdvcmxkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgd29ybGRTY2FsZSA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgewoKCQkJCXdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CgkJCQlyYXljYXN0ZXIucmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQoIHdvcmxkUG9zaXRpb24sIGludGVyc2VjdFBvaW50ICk7CgoJCQkJd29ybGRTY2FsZS5zZXRGcm9tTWF0cml4U2NhbGUoIHRoaXMubWF0cml4V29ybGQgKTsKCQkJCXZhciBndWVzc1NpemVTcSA9IHdvcmxkU2NhbGUueCAqIHdvcmxkU2NhbGUueSAvIDQ7CgoJCQkJaWYgKCB3b3JsZFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1cm47CgoJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTsKCgkJCQlpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuOwoKCQkJCWludGVyc2VjdHMucHVzaCggewoKCQkJCQlkaXN0YW5jZTogZGlzdGFuY2UsCgkJCQkJcG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksCgkJCQkJZmFjZTogbnVsbCwKCQkJCQlvYmplY3Q6IHRoaXMKCgkJCQl9ICk7CgoJCQl9OwoKCQl9KCkgKSwKCgkJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIExPRCgpIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTE9EJzsKCgkJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHsKCQkJbGV2ZWxzOiB7CgkJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQkJdmFsdWU6IFtdCgkJCX0KCQl9ICk7CgoJfQoKCUxPRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogTE9ELAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTsKCgkJCXZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIGxldmVsID0gbGV2ZWxzWyBpIF07CgoJCQkJdGhpcy5hZGRMZXZlbCggbGV2ZWwub2JqZWN0LmNsb25lKCksIGxldmVsLmRpc3RhbmNlICk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJYWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHsKCgkJCWlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDsKCgkJCWRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7CgoJCQl2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CgoJCQlmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkgewoKCQkJCWlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGwgXS5kaXN0YW5jZSApIHsKCgkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJfQoKCQkJbGV2ZWxzLnNwbGljZSggbCwgMCwgeyBkaXN0YW5jZTogZGlzdGFuY2UsIG9iamVjdDogb2JqZWN0IH0gKTsKCgkJCXRoaXMuYWRkKCBvYmplY3QgKTsKCgkJfSwKCgkJZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6IGZ1bmN0aW9uICggZGlzdGFuY2UgKSB7CgoJCQl2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CgoJCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQlpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7CgoJCQkJCWJyZWFrOwoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0OwoKCQl9LAoKCQlyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHsKCgkJCXZhciBtYXRyaXhQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgewoKCQkJCW1hdHJpeFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApOwoKCQkJCXZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7CgoJCQkJdGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTsKCgkJCX07CgoJCX0oKSApLAoKCQl1cGRhdGU6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2MSA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciB2MiA9IG5ldyBWZWN0b3IzKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7CgoJCQkJdmFyIGxldmVscyA9IHRoaXMubGV2ZWxzOwoKCQkJCWlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7CgoJCQkJCXYxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7CgkJCQkJdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CgoJCQkJCXZhciBkaXN0YW5jZSA9IHYxLmRpc3RhbmNlVG8oIHYyICk7CgoJCQkJCWxldmVsc1sgMCBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTsKCgkJCQkJZm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCQlpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkgewoKCQkJCQkJCWxldmVsc1sgaSAtIDEgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlOwoJCQkJCQkJbGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlOwoKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQlicmVhazsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQlmb3IgKCA7IGkgPCBsOyBpICsrICkgewoKCQkJCQkJbGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTsKCgkJCQkJfQoKCQkJCX0KCgkJCX07CgoJCX0oKSwKCgkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgoJCQl2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOwoKCQkJZGF0YS5vYmplY3QubGV2ZWxzID0gW107CgoJCQl2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgbGV2ZWwgPSBsZXZlbHNbIGkgXTsKCgkJCQlkYXRhLm9iamVjdC5sZXZlbHMucHVzaCggewoJCQkJCW9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsCgkJCQkJZGlzdGFuY2U6IGxldmVsLmRpc3RhbmNlCgkJCQl9ICk7CgoJCQl9CgoJCQlyZXR1cm4gZGF0YTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb20KCSAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbQoJICovCgoJZnVuY3Rpb24gU2tlbGV0b24oIGJvbmVzLCBib25lSW52ZXJzZXMgKSB7CgoJCS8vIGNvcHkgdGhlIGJvbmUgYXJyYXkKCgkJYm9uZXMgPSBib25lcyB8fCBbXTsKCgkJdGhpcy5ib25lcyA9IGJvbmVzLnNsaWNlKCAwICk7CgkJdGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCB0aGlzLmJvbmVzLmxlbmd0aCAqIDE2ICk7CgoJCS8vIHVzZSB0aGUgc3VwcGxpZWQgYm9uZSBpbnZlcnNlcyBvciBjYWxjdWxhdGUgdGhlIGludmVyc2VzCgoJCWlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7CgoJCQl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7CgoJCX0gZWxzZSB7CgoJCQlpZiAoIHRoaXMuYm9uZXMubGVuZ3RoID09PSBib25lSW52ZXJzZXMubGVuZ3RoICkgewoKCQkJCXRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7CgoJCQl9IGVsc2UgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uIGJvbmVJbnZlcnNlcyBpcyB0aGUgd3JvbmcgbGVuZ3RoLicgKTsKCgkJCQl0aGlzLmJvbmVJbnZlcnNlcyA9IFtdOwoKCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCQl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpICk7CgoJCQkJfQoKCQkJfQoKCQl9CgoJfQoKCU9iamVjdC5hc3NpZ24oIFNrZWxldG9uLnByb3RvdHlwZSwgewoKCQljYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5ib25lSW52ZXJzZXMgPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXZhciBpbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKCgkJCQlpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHsKCgkJCQkJaW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJvbmVzWyBpIF0ubWF0cml4V29ybGQgKTsKCgkJCQl9CgoJCQkJdGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApOwoKCQkJfQoKCQl9LAoKCQlwb3NlOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgYm9uZSwgaSwgaWw7CgoJCQkvLyByZWNvdmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXMKCgkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTsKCgkJCQlpZiAoIGJvbmUgKSB7CgoJCQkJCWJvbmUubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggdGhpcy5ib25lSW52ZXJzZXNbIGkgXSApOwoKCQkJCX0KCgkJCX0KCgkJCS8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzCgoJCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCWJvbmUgPSB0aGlzLmJvbmVzWyBpIF07CgoJCQkJaWYgKCBib25lICkgewoKCQkJCQlpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHsKCgkJCQkJCWJvbmUubWF0cml4LmdldEludmVyc2UoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7CgkJCQkJCWJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlib25lLm1hdHJpeC5jb3B5KCBib25lLm1hdHJpeFdvcmxkICk7CgoJCQkJCX0KCgkJCQkJYm9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTsKCgkJCQl9CgoJCQl9CgoJCX0sCgoJCXVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgb2Zmc2V0TWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCQkJdmFyIGlkZW50aXR5TWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCgkJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CgoJCQkJdmFyIGJvbmVzID0gdGhpcy5ib25lczsKCQkJCXZhciBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlczsKCQkJCXZhciBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlczsKCQkJCXZhciBib25lVGV4dHVyZSA9IHRoaXMuYm9uZVRleHR1cmU7CgoJCQkJLy8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5CgoJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCQkvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybQoKCQkJCQl2YXIgbWF0cml4ID0gYm9uZXNbIGkgXSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBpZGVudGl0eU1hdHJpeDsKCgkJCQkJb2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTsKCQkJCQlvZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTsKCgkJCQl9CgoJCQkJaWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJfQoKCQkJfTsKCgkJfSApKCksCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KCSAqLwoKCWZ1bmN0aW9uIEJvbmUoKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0JvbmUnOwoKCX0KCglCb25lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBCb25lLAoKCQlpc0JvbmU6IHRydWUKCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLwoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbQoJICovCgoJZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCgkJTWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCgkJdGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJzsKCgkJdGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7CgkJdGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCQl0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKCgkJdmFyIGJvbmVzID0gdGhpcy5pbml0Qm9uZXMoKTsKCQl2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oIGJvbmVzICk7CgoJCXRoaXMuYmluZCggc2tlbGV0b24sIHRoaXMubWF0cml4V29ybGQgKTsKCgkJdGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpOwoKCX0KCglTa2lubmVkTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBTa2lubmVkTWVzaCwKCgkJaXNTa2lubmVkTWVzaDogdHJ1ZSwKCgkJaW5pdEJvbmVzOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgYm9uZXMgPSBbXSwgYm9uZSwgZ2JvbmU7CgkJCXZhciBpLCBpbDsKCgkJCWlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmJvbmVzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gZmlyc3QsIGNyZWF0ZSBhcnJheSBvZiAnQm9uZScgb2JqZWN0cyBmcm9tIGdlb21ldHJ5IGRhdGEKCgkJCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCQlnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTsKCgkJCQkJLy8gY3JlYXRlIG5ldyAnQm9uZScgb2JqZWN0CgoJCQkJCWJvbmUgPSBuZXcgQm9uZSgpOwoJCQkJCWJvbmVzLnB1c2goIGJvbmUgKTsKCgkJCQkJLy8gYXBwbHkgdmFsdWVzCgoJCQkJCWJvbmUubmFtZSA9IGdib25lLm5hbWU7CgkJCQkJYm9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApOwoJCQkJCWJvbmUucXVhdGVybmlvbi5mcm9tQXJyYXkoIGdib25lLnJvdHEgKTsKCQkJCQlpZiAoIGdib25lLnNjbCAhPT0gdW5kZWZpbmVkICkgYm9uZS5zY2FsZS5mcm9tQXJyYXkoIGdib25lLnNjbCApOwoKCQkJCX0KCgkJCQkvLyBzZWNvbmQsIGNyZWF0ZSBib25lIGhpZXJhcmNoeQoKCQkJCWZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZ2VvbWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJCWdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdOwoKCQkJCQlpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHsKCgkJCQkJCS8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeQoKCQkJCQkJYm9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gdG9wbW9zdCBib25lLCBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHNraW5uZWQgbWVzaAoKCQkJCQkJdGhpcy5hZGQoIGJvbmVzWyBpIF0gKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCS8vIG5vdyB0aGUgYm9uZXMgYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGdyYXBoIGFuZCBjaGlsZHJlbiBvZiB0aGUgc2tpbm5lZCBtZXNoLgoJCQkvLyBsZXQncyB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cmljZXMKCgkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCXJldHVybiBib25lczsKCgkJfSwKCgkJYmluZDogZnVuY3Rpb24gKCBza2VsZXRvbiwgYmluZE1hdHJpeCApIHsKCgkJCXRoaXMuc2tlbGV0b24gPSBza2VsZXRvbjsKCgkJCWlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCQl0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7CgoJCQkJYmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7CgoJCQl9CgoJCQl0aGlzLmJpbmRNYXRyaXguY29weSggYmluZE1hdHJpeCApOwoJCQl0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIGJpbmRNYXRyaXggKTsKCgkJfSwKCgkJcG9zZTogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5za2VsZXRvbi5wb3NlKCk7CgoJCX0sCgoJCW5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgc2NhbGUsIGk7CgoJCQlpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKCQkJCWZvciAoIGkgPSAwOyBpIDwgdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCXZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTsKCgkJCQkJc2NhbGUgPSAxLjAgLyBzdy5tYW5oYXR0YW5MZW5ndGgoKTsKCgkJCQkJaWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7CgoJCQkJCQlzdy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCXN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZQoKCQkJCQl9CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgoJCQkJdmFyIHZlYyA9IG5ldyBWZWN0b3I0KCk7CgoJCQkJdmFyIHNraW5XZWlnaHQgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodDsKCgkJCQlmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7CgoJCQkJCXZlYy54ID0gc2tpbldlaWdodC5nZXRYKCBpICk7CgkJCQkJdmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTsKCQkJCQl2ZWMueiA9IHNraW5XZWlnaHQuZ2V0WiggaSApOwoJCQkJCXZlYy53ID0gc2tpbldlaWdodC5nZXRXKCBpICk7CgoJCQkJCXNjYWxlID0gMS4wIC8gdmVjLm1hbmhhdHRhbkxlbmd0aCgpOwoKCQkJCQlpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHsKCgkJCQkJCXZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCXZlYy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGUKCgkJCQkJfQoKCQkJCQlza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQl1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKCgkJCU1lc2gucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgoJCQlpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdhdHRhY2hlZCcgKSB7CgoJCQkJdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7CgoJCQl9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkgewoKCQkJCXRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5iaW5kTWF0cml4ICk7CgoJCQl9IGVsc2UgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7CgoJCQl9CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICogIGNvbG9yOiA8aGV4PiwKCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAoJICoKCSAqICBsaW5ld2lkdGg6IDxmbG9hdD4sCgkgKiAgbGluZWNhcDogInJvdW5kIiwKCSAqICBsaW5lam9pbjogInJvdW5kIgoJICogfQoJICovCgoJZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0xpbmVCYXNpY01hdGVyaWFsJzsKCgkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKCgkJdGhpcy5saW5ld2lkdGggPSAxOwoJCXRoaXMubGluZWNhcCA9ICdyb3VuZCc7CgkJdGhpcy5saW5lam9pbiA9ICdyb3VuZCc7CgoJCXRoaXMubGlnaHRzID0gZmFsc2U7CgoJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgoJfQoKCUxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwoJTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUJhc2ljTWF0ZXJpYWw7CgoJTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlOwoKCUxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKCQl0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7CgkJdGhpcy5saW5lY2FwID0gc291cmNlLmxpbmVjYXA7CgkJdGhpcy5saW5lam9pbiA9IHNvdXJjZS5saW5lam9pbjsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG1vZGUgKSB7CgoJCWlmICggbW9kZSA9PT0gMSApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApOwoJCQlyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7CgoJCX0KCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTGluZSc7CgoJCXRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCQl0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApOwoKCX0KCglMaW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBMaW5lLAoKCQlpc0xpbmU6IHRydWUsCgoJCXJheWNhc3Q6ICggZnVuY3Rpb24gKCkgewoKCQkJdmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpOwoJCQl2YXIgcmF5ID0gbmV3IFJheSgpOwoJCQl2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHsKCgkJCQl2YXIgcHJlY2lzaW9uID0gcmF5Y2FzdGVyLmxpbmVQcmVjaXNpb247CgkJCQl2YXIgcHJlY2lzaW9uU3EgPSBwcmVjaXNpb24gKiBwcmVjaXNpb247CgoJCQkJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKCQkJCXZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7CgoJCQkJLy8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5CgoJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJCXNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOwoJCQkJc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKCgkJCQlpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuOwoKCQkJCS8vCgoJCQkJaW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApOwoJCQkJcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTsKCgkJCQl2YXIgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTsKCQkJCXZhciB2RW5kID0gbmV3IFZlY3RvcjMoKTsKCQkJCXZhciBpbnRlclNlZ21lbnQgPSBuZXcgVmVjdG9yMygpOwoJCQkJdmFyIGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTsKCQkJCXZhciBzdGVwID0gKCB0aGlzICYmIHRoaXMuaXNMaW5lU2VnbWVudHMgKSA/IDIgOiAxOwoKCQkJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJdmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CgkJCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwoKCQkJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKCQkJCQkJdmFyIGluZGljZXMgPSBpbmRleC5hcnJheTsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHsKCgkJCQkJCQl2YXIgYSA9IGluZGljZXNbIGkgXTsKCQkJCQkJCXZhciBiID0gaW5kaWNlc1sgaSArIDEgXTsKCgkJCQkJCQl2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7CgkJCQkJCQl2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCBiICogMyApOwoKCQkJCQkJCXZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdlN0YXJ0LCB2RW5kLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7CgoJCQkJCQkJaWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlOwoKCQkJCQkJCWludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb24KCgkJCQkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApOwoKCQkJCQkJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTsKCgkJCQkJCQlpbnRlcnNlY3RzLnB1c2goIHsKCgkJCQkJCQkJZGlzdGFuY2U6IGRpc3RhbmNlLAoJCQkJCQkJCS8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/PwoJCQkJCQkJCS8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLAoJCQkJCQkJCXBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSwKCQkJCQkJCQlpbmRleDogaSwKCQkJCQkJCQlmYWNlOiBudWxsLAoJCQkJCQkJCWZhY2VJbmRleDogbnVsbCwKCQkJCQkJCQlvYmplY3Q6IHRoaXMKCgkJCQkJCQl9ICk7CgoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMyAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7CgoJCQkJCQkJdlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSApOwoJCQkJCQkJdkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKyAzICk7CgoJCQkJCQkJdmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTsKCgkJCQkJCQlpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7CgoJCQkJCQkJaW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvbgoKCQkJCQkJCXZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7CgoJCQkJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlOwoKCQkJCQkJCWludGVyc2VjdHMucHVzaCggewoKCQkJCQkJCQlkaXN0YW5jZTogZGlzdGFuY2UsCgkJCQkJCQkJLy8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/CgkJCQkJCQkJLy8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksCgkJCQkJCQkJcG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLAoJCQkJCQkJCWluZGV4OiBpLAoJCQkJCQkJCWZhY2U6IG51bGwsCgkJCQkJCQkJZmFjZUluZGV4OiBudWxsLAoJCQkJCQkJCW9iamVjdDogdGhpcwoKCQkJCQkJCX0gKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CgoJCQkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwoJCQkJCXZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoOwoKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBuYlZlcnRpY2VzIC0gMTsgaSArPSBzdGVwICkgewoKCQkJCQkJdmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc1sgaSArIDEgXSwgaW50ZXJSYXksIGludGVyU2VnbWVudCApOwoKCQkJCQkJaWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlOwoKCQkJCQkJaW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvbgoKCQkJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTsKCgkJCQkJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTsKCgkJCQkJCWludGVyc2VjdHMucHVzaCggewoKCQkJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKCQkJCQkJCS8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/PwoJCQkJCQkJLy8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksCgkJCQkJCQlwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksCgkJCQkJCQlpbmRleDogaSwKCQkJCQkJCWZhY2U6IG51bGwsCgkJCQkJCQlmYWNlSW5kZXg6IG51bGwsCgkJCQkJCQlvYmplY3Q6IHRoaXMKCgkJCQkJCX0gKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX07CgoJCX0oKSApLAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkgewoKCQlMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKCQl0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJzsKCgl9CgoJTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IExpbmVTZWdtZW50cywKCgkJaXNMaW5lU2VnbWVudHM6IHRydWUKCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1ncmV0ZXIgLyBodHRwOi8vZ2l0aHViLmNvbS9tZ3JldGVyCgkgKi8KCglmdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkgewoKCQlMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKCQl0aGlzLnR5cGUgPSAnTGluZUxvb3AnOwoKCX0KCglMaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBMaW5lTG9vcCwKCgkJaXNMaW5lTG9vcDogdHJ1ZSwKCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICogIGNvbG9yOiA8aGV4PiwKCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAoJICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgc2l6ZTogPGZsb2F0PiwKCSAqICBzaXplQXR0ZW51YXRpb246IDxib29sPgoJICogfQoJICovCgoJZnVuY3Rpb24gUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1BvaW50c01hdGVyaWFsJzsKCgkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKCgkJdGhpcy5tYXAgPSBudWxsOwoKCQl0aGlzLnNpemUgPSAxOwoJCXRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTsKCgkJdGhpcy5saWdodHMgPSBmYWxzZTsKCgkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCgl9CgoJUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CglQb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDsKCglQb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7CgoJUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CgoJCXRoaXMubWFwID0gc291cmNlLm1hcDsKCgkJdGhpcy5zaXplID0gc291cmNlLnNpemU7CgkJdGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkgewoKCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdQb2ludHMnOwoKCQl0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgkJdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBQb2ludHNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKCgl9CgoJUG9pbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBQb2ludHMsCgoJCWlzUG9pbnRzOiB0cnVlLAoKCQlyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHsKCgkJCXZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCQkJdmFyIHJheSA9IG5ldyBSYXkoKTsKCQkJdmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTsKCgkJCXJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7CgoJCQkJdmFyIG9iamVjdCA9IHRoaXM7CgkJCQl2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwoJCQkJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKCQkJCXZhciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7CgoJCQkJLy8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5CgoJCQkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQkJCXNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOwoJCQkJc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKCQkJCXNwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkOwoKCQkJCWlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQkJLy8KCgkJCQlpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7CgkJCQlyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApOwoKCQkJCXZhciBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTsKCQkJCXZhciBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDsKCQkJCXZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CgoJCQkJZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7CgoJCQkJCXZhciByYXlQb2ludERpc3RhbmNlU3EgPSByYXkuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICk7CgoJCQkJCWlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHsKCgkJCQkJCXZhciBpbnRlcnNlY3RQb2ludCA9IHJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCApOwoJCQkJCQlpbnRlcnNlY3RQb2ludC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7CgoJCQkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApOwoKCQkJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjsKCgkJCQkJCWludGVyc2VjdHMucHVzaCggewoKCQkJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKCQkJCQkJCWRpc3RhbmNlVG9SYXk6IE1hdGguc3FydCggcmF5UG9pbnREaXN0YW5jZVNxICksCgkJCQkJCQlwb2ludDogaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSwKCQkJCQkJCWluZGV4OiBpbmRleCwKCQkJCQkJCWZhY2U6IG51bGwsCgkJCQkJCQlvYmplY3Q6IG9iamVjdAoKCQkJCQkJfSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJdmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CgkJCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwoKCQkJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKCQkJCQkJdmFyIGluZGljZXMgPSBpbmRleC5hcnJheTsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCQkJCXZhciBhID0gaW5kaWNlc1sgaSBdOwoKCQkJCQkJCXBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApOwoKCQkJCQkJCXRlc3RQb2ludCggcG9zaXRpb24sIGEgKTsKCgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJCQlwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTsKCgkJCQkJCQl0ZXN0UG9pbnQoIHBvc2l0aW9uLCBpICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9IGVsc2UgewoKCQkJCQl2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlczsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJCXRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfTsKCgkJfSgpICksCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gR3JvdXAoKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0dyb3VwJzsKCgl9CgoJR3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IEdyb3VwLAoKCQlpc0dyb3VwOiB0cnVlCgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFZpZGVvVGV4dHVyZSggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHsKCgkJVGV4dHVyZS5jYWxsKCB0aGlzLCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7CgoJCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CgoJCS8vIFNldCBuZWVkc1VwZGF0ZSB3aGVuIGZpcnN0IGZyYW1lIGlzIHJlYWR5CgoJCXZhciBzY29wZSA9IHRoaXM7CgoJCWZ1bmN0aW9uIG9uTG9hZGVkKCkgewoKCQkJdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWRlZGRhdGEnLCBvbkxvYWRlZCwgZmFsc2UgKTsKCQkJc2NvcGUubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQl9CgoJCXZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkZWRkYXRhJywgb25Mb2FkZWQsIGZhbHNlICk7CgoJfQoKCVZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBWaWRlb1RleHR1cmUsCgoJCWlzVmlkZW9UZXh0dXJlOiB0cnVlLAoKCQl1cGRhdGU6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2aWRlbyA9IHRoaXMuaW1hZ2U7CgoJCQlpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7CgoJCQkJdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQl9CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7CgoJCVRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApOwoKCQl0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CgkJdGhpcy5taXBtYXBzID0gbWlwbWFwczsKCgkJLy8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXMKCQkvLyAoYWxzbyBmbGlwcGluZyBkb2Vzbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKQoKCQl0aGlzLmZsaXBZID0gZmFsc2U7CgoJCS8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMKCQkvLyBtaXBzIG11c3QgYmUgZW1iZWRkZWQgaW4gRERTIGZpbGVzCgoJCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CgoJfQoKCUNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CglDb21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb21wcmVzc2VkVGV4dHVyZTsKCglDb21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7CgoJLyoqCgkgKiBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2wKCSAqIEBhdXRob3IgYXRpeCAvIGFydGh1cnNpbGJlci5kZQoJICovCgoJZnVuY3Rpb24gRGVwdGhUZXh0dXJlKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7CgoJCWZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogRGVwdGhGb3JtYXQ7CgoJCWlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHsKCgkJCXRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApOwoKCQl9CgoJCWlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CgkJaWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlOwoKCQlUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApOwoKCQl0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CgoJCXRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyOwoJCXRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyOwoKCQl0aGlzLmZsaXBZID0gZmFsc2U7CgkJdGhpcy5nZW5lcmF0ZU1pcG1hcHMJPSBmYWxzZTsKCgl9CgoJRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CglEZXB0aFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGVwdGhUZXh0dXJlOwoJRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKCSAqLwoKCWZ1bmN0aW9uIFdpcmVmcmFtZUdlb21ldHJ5KCBnZW9tZXRyeSApIHsKCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknOwoKCQkvLyBidWZmZXIKCgkJdmFyIHZlcnRpY2VzID0gW107CgoJCS8vIGhlbHBlciB2YXJpYWJsZXMKCgkJdmFyIGksIGosIGwsIG8sIG9sOwoJCXZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjsKCQl2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07CgkJdmFyIHZlcnRleDsKCgkJLy8gZGlmZmVyZW50IGxvZ2ljIGZvciBHZW9tZXRyeSBhbmQgQnVmZmVyR2VvbWV0cnkKCgkJaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKCQkJLy8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzCgoJCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKCgkJCWZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgoJCQkJZm9yICggaiA9IDA7IGogPCAzOyBqICsrICkgewoKCQkJCQllZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdOwoJCQkJCWVkZ2UyID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07CgkJCQkJZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXMKCQkJCQllZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7CgoJCQkJCWtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTsKCgkJCQkJaWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCWVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcwoKCQkJZm9yICgga2V5IGluIGVkZ2VzICkgewoKCQkJCWUgPSBlZGdlc1sga2V5IF07CgoJCQkJdmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgxIF07CgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQkJdmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgyIF07CgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQl9CgoJCX0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgoJCQl2YXIgcG9zaXRpb24sIGluZGljZXMsIGdyb3VwczsKCQkJdmFyIGdyb3VwLCBzdGFydCwgY291bnQ7CgkJCXZhciBpbmRleDEsIGluZGV4MjsKCgkJCXZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgoJCQlpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkgewoKCQkJCS8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnkKCgkJCQlwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CgkJCQlpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7CgkJCQlncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CgoJCQkJaWYgKCBncm91cHMubGVuZ3RoID09PSAwICkgewoKCQkJCQlncm91cHMgPSBbIHsgc3RhcnQ6IDAsIGNvdW50OiBpbmRpY2VzLmNvdW50LCBtYXRlcmlhbEluZGV4OiAwIH0gXTsKCgkJCQl9CgoJCQkJLy8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXMKCgkJCQlmb3IgKCBvID0gMCwgb2wgPSBncm91cHMubGVuZ3RoOyBvIDwgb2w7ICsrIG8gKSB7CgoJCQkJCWdyb3VwID0gZ3JvdXBzWyBvIF07CgoJCQkJCXN0YXJ0ID0gZ3JvdXAuc3RhcnQ7CgkJCQkJY291bnQgPSBncm91cC5jb3VudDsKCgkJCQkJZm9yICggaSA9IHN0YXJ0LCBsID0gKCBzdGFydCArIGNvdW50ICk7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQlmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7CgoJCQkJCQkJZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7CgkJCQkJCQllZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTsKCQkJCQkJCWVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzCgkJCQkJCQllZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7CgoJCQkJCQkJa2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdOwoKCQkJCQkJCWlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkJCWVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07CgoJCQkJCQkJfQoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCS8vIGdlbmVyYXRlIHZlcnRpY2VzCgoJCQkJZm9yICgga2V5IGluIGVkZ2VzICkgewoKCQkJCQllID0gZWRnZXNbIGtleSBdOwoKCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgxICk7CgkJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgyICk7CgkJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJLy8gbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkKCgkJCQlwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CgoJCQkJZm9yICggaSA9IDAsIGwgPSAoIHBvc2l0aW9uLmNvdW50IC8gMyApOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJZm9yICggaiA9IDA7IGogPCAzOyBqICsrICkgewoKCQkJCQkJLy8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4MikKCQkJCQkJLy8gZS5nLiB0aGUgZmlyc3QgdHJpYW5nbGUgaGFzIHRoZSBmb2xsb3dpbmcgZWRnZXM6ICgwLDEpLCgxLDIpLCgyLDApCgoJCQkJCQlpbmRleDEgPSAzICogaSArIGo7CgkJCQkJCXZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7CgkJCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCgkJCQkJCWluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7CgkJCQkJCXZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgyICk7CgkJCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJfQoKCQkvLyBidWlsZCBnZW9tZXRyeQoKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCgl9CgoJV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CglXaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1CgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICoKCSAqIFBhcmFtZXRyaWMgU3VyZmFjZXMgR2VvbWV0cnkKCSAqIGJhc2VkIG9uIHRoZSBicmlsbGlhbnQgYXJ0aWNsZSBieSBAcHJpZGVvdXQgaHR0cDovL3ByaWRlb3V0Lm5ldC9ibG9nLz9wPTQ0CgkgKi8KCgkvLyBQYXJhbWV0cmljR2VvbWV0cnkKCglmdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdQYXJhbWV0cmljR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCWZ1bmM6IGZ1bmMsCgkJCXNsaWNlczogc2xpY2VzLAoJCQlzdGFja3M6IHN0YWNrcwoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCVBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7CgoJLy8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHsKCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlmdW5jOiBmdW5jLAoJCQlzbGljZXM6IHNsaWNlcywKCQkJc3RhY2tzOiBzdGFja3MKCQl9OwoKCQkvLyBidWZmZXJzCgoJCXZhciBpbmRpY2VzID0gW107CgkJdmFyIHZlcnRpY2VzID0gW107CgkJdmFyIG5vcm1hbHMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCXZhciBFUFMgPSAwLjAwMDAxOwoKCQl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKCgkJdmFyIHAwID0gbmV3IFZlY3RvcjMoKSwgcDEgPSBuZXcgVmVjdG9yMygpOwoJCXZhciBwdSA9IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTsKCgkJdmFyIGksIGo7CgoJCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKCgkJdmFyIHNsaWNlQ291bnQgPSBzbGljZXMgKyAxOwoKCQlmb3IgKCBpID0gMDsgaSA8PSBzdGFja3M7IGkgKysgKSB7CgoJCQl2YXIgdiA9IGkgLyBzdGFja3M7CgoJCQlmb3IgKCBqID0gMDsgaiA8PSBzbGljZXM7IGogKysgKSB7CgoJCQkJdmFyIHUgPSBqIC8gc2xpY2VzOwoKCQkJCS8vIHZlcnRleAoKCQkJCXAwID0gZnVuYyggdSwgdiwgcDAgKTsKCQkJCXZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTsKCgkJCQkvLyBub3JtYWwKCgkJCQkvLyBhcHByb3hpbWF0ZSB0YW5nZW50IHZlY3RvcnMgdmlhIGZpbml0ZSBkaWZmZXJlbmNlcwoKCQkJCWlmICggdSAtIEVQUyA+PSAwICkgewoKCQkJCQlwMSA9IGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7CgkJCQkJcHUuc3ViVmVjdG9ycyggcDAsIHAxICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJcDEgPSBmdW5jKCB1ICsgRVBTLCB2LCBwMSApOwoJCQkJCXB1LnN1YlZlY3RvcnMoIHAxLCBwMCApOwoKCQkJCX0KCgkJCQlpZiAoIHYgLSBFUFMgPj0gMCApIHsKCgkJCQkJcDEgPSBmdW5jKCB1LCB2IC0gRVBTLCBwMSApOwoJCQkJCXB2LnN1YlZlY3RvcnMoIHAwLCBwMSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXAxID0gZnVuYyggdSwgdiArIEVQUywgcDEgKTsKCQkJCQlwdi5zdWJWZWN0b3JzKCBwMSwgcDAgKTsKCgkJCQl9CgoJCQkJLy8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbAoKCQkJCW5vcm1hbC5jcm9zc1ZlY3RvcnMoIHB1LCBwdiApLm5vcm1hbGl6ZSgpOwoJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgoJCQkJLy8gdXYKCgkJCQl1dnMucHVzaCggdSwgdiApOwoKCQkJfQoKCQl9CgoJCS8vIGdlbmVyYXRlIGluZGljZXMKCgkJZm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7CgoJCQlmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHsKCgkJCQl2YXIgYSA9IGkgKiBzbGljZUNvdW50ICsgajsKCQkJCXZhciBiID0gaSAqIHNsaWNlQ291bnQgKyBqICsgMTsKCQkJCXZhciBjID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxOwoJCQkJdmFyIGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajsKCgkJCQkvLyBmYWNlcyBvbmUgYW5kIHR3bwoKCQkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwoJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgoJCQl9CgoJCX0KCgkJLy8gYnVpbGQgZ2VvbWV0cnkKCgkJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCgl9CgoJUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrCgkgKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBQb2x5aGVkcm9uR2VvbWV0cnkKCglmdW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHsKCgkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQl2ZXJ0aWNlczogdmVydGljZXMsCgkJCWluZGljZXM6IGluZGljZXMsCgkJCXJhZGl1czogcmFkaXVzLAoJCQlkZXRhaWw6IGRldGFpbAoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSApOwoJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKCX0KCglQb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CglQb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkdlb21ldHJ5OwoKCS8vIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeQoKCWZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgewoKCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXZlcnRpY2VzOiB2ZXJ0aWNlcywKCQkJaW5kaWNlczogaW5kaWNlcywKCQkJcmFkaXVzOiByYWRpdXMsCgkJCWRldGFpbDogZGV0YWlsCgkJfTsKCgkJcmFkaXVzID0gcmFkaXVzIHx8IDE7CgkJZGV0YWlsID0gZGV0YWlsIHx8IDA7CgoJCS8vIGRlZmF1bHQgYnVmZmVyIGRhdGEKCgkJdmFyIHZlcnRleEJ1ZmZlciA9IFtdOwoJCXZhciB1dkJ1ZmZlciA9IFtdOwoKCQkvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhCgoJCXN1YmRpdmlkZSggZGV0YWlsICk7CgoJCS8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1cwoKCQlhcHBwbHlSYWRpdXMoIHJhZGl1cyApOwoKCQkvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGEKCgkJZ2VuZXJhdGVVVnMoKTsKCgkJLy8gYnVpbGQgbm9uLWluZGV4ZWQgZ2VvbWV0cnkKCgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTsKCgkJaWYgKCBkZXRhaWwgPT09IDAgKSB7CgoJCQl0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7IC8vIGZsYXQgbm9ybWFscwoKCQl9IGVsc2UgewoKCQkJdGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzCgoJCX0KCgkJLy8gaGVscGVyIGZ1bmN0aW9ucwoKCQlmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHsKCgkJCXZhciBhID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIGIgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgYyA9IG5ldyBWZWN0b3IzKCk7CgoJCQkvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlCgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkgewoKCQkJCS8vIGdldCB0aGUgdmVydGljZXMgb2YgdGhlIGZhY2UKCgkJCQlnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7CgkJCQlnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7CgkJCQlnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7CgoJCQkJLy8gcGVyZm9ybSBzdWJkaXZpc2lvbgoKCQkJCXN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApOwoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHsKCgkJCXZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApOwoKCQkJLy8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb24KCgkJCXZhciB2ID0gW107CgoJCQl2YXIgaSwgajsKCgkJCS8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uCgoJCQlmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkgewoKCQkJCXZbIGkgXSA9IFtdOwoKCQkJCXZhciBhaiA9IGEuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApOwoJCQkJdmFyIGJqID0gYi5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7CgoJCQkJdmFyIHJvd3MgPSBjb2xzIC0gaTsKCgkJCQlmb3IgKCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkgewoKCQkJCQlpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHsKCgkJCQkJCXZbIGkgXVsgaiBdID0gYWo7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQl2WyBpIF1bIGogXSA9IGFqLmNsb25lKCkubGVycCggYmosIGogLyByb3dzICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQkvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSBmYWNlcwoKCQkJZm9yICggaSA9IDA7IGkgPCBjb2xzOyBpICsrICkgewoKCQkJCWZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7CgoJCQkJCXZhciBrID0gTWF0aC5mbG9vciggaiAvIDIgKTsKCgkJCQkJaWYgKCBqICUgMiA9PT0gMCApIHsKCgkJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApOwoJCQkJCQlwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTsKCQkJCQkJcHVzaFZlcnRleCggdlsgaSBdWyBrIF0gKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApOwoJCQkJCQlwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7CgkJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfQoKCQl9CgoJCWZ1bmN0aW9uIGFwcHBseVJhZGl1cyggcmFkaXVzICkgewoKCQkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgoJCQkvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXgKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHsKCgkJCQl2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTsKCQkJCXZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdOwoJCQkJdmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07CgoJCQkJdmVydGV4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCByYWRpdXMgKTsKCgkJCQl2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDsKCQkJCXZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55OwoJCQkJdmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7CgoJCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHsKCgkJCQl2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTsKCQkJCXZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdOwoJCQkJdmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07CgoJCQkJdmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41OwoJCQkJdmFyIHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41OwoJCQkJdXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTsKCgkJCX0KCgkJCWNvcnJlY3RVVnMoKTsKCgkJCWNvcnJlY3RTZWFtKCk7CgoJCX0KCgkJZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7CgoJCQkvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVzIHRoZSBzZWFtLCBzZWUgIzMyNjkKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IHV2QnVmZmVyLmxlbmd0aDsgaSArPSA2ICkgewoKCQkJCS8vIHV2IGRhdGEgb2YgYSBzaW5nbGUgZmFjZQoKCQkJCXZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdOwoJCQkJdmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07CgkJCQl2YXIgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTsKCgkJCQl2YXIgbWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTsKCQkJCXZhciBtaW4gPSBNYXRoLm1pbiggeDAsIHgxLCB4MiApOwoKCQkJCS8vIDAuOSBpcyBzb21ld2hhdCBhcmJpdHJhcnkKCgkJCQlpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7CgoJCQkJCWlmICggeDAgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDAgXSArPSAxOwoJCQkJCWlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxOwoJCQkJCWlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxOwoKCQkJCX0KCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7CgoJCQl2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQl9CgoJCWZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7CgoJCQl2YXIgc3RyaWRlID0gaW5kZXggKiAzOwoKCQkJdmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdOwoJCQl2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07CgkJCXZlcnRleC56ID0gdmVydGljZXNbIHN0cmlkZSArIDIgXTsKCgkJfQoKCQlmdW5jdGlvbiBjb3JyZWN0VVZzKCkgewoKCQkJdmFyIGEgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgYiA9IG5ldyBWZWN0b3IzKCk7CgkJCXZhciBjID0gbmV3IFZlY3RvcjMoKTsKCgkJCXZhciBjZW50cm9pZCA9IG5ldyBWZWN0b3IzKCk7CgoJCQl2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTsKCQkJdmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7CgkJCXZhciB1dkMgPSBuZXcgVmVjdG9yMigpOwoKCQkJZm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2ICkgewoKCQkJCWEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7CgkJCQliLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApOwoJCQkJYy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTsKCgkJCQl1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTsKCQkJCXV2Qi5zZXQoIHV2QnVmZmVyWyBqICsgMiBdLCB1dkJ1ZmZlclsgaiArIDMgXSApOwoJCQkJdXZDLnNldCggdXZCdWZmZXJbIGogKyA0IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7CgoJCQkJY2VudHJvaWQuY29weSggYSApLmFkZCggYiApLmFkZCggYyApLmRpdmlkZVNjYWxhciggMyApOwoKCQkJCXZhciBhemkgPSBhemltdXRoKCBjZW50cm9pZCApOwoKCQkJCWNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7CgkJCQljb3JyZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApOwoJCQkJY29ycmVjdFVWKCB1dkMsIGogKyA0LCBjLCBhemkgKTsKCgkJCX0KCgkJfQoKCQlmdW5jdGlvbiBjb3JyZWN0VVYoIHV2LCBzdHJpZGUsIHZlY3RvciwgYXppbXV0aCApIHsKCgkJCWlmICggKCBhemltdXRoIDwgMCApICYmICggdXYueCA9PT0gMSApICkgewoKCQkJCXV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxOwoKCQkJfQoKCQkJaWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkgewoKCQkJCXV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5QSSArIDAuNTsKCgkJCX0KCgkJfQoKCQkvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywgY291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuCgoJCWZ1bmN0aW9uIGF6aW11dGgoIHZlY3RvciApIHsKCgkJCXJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApOwoKCQl9CgoKCQkvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuCgoJCWZ1bmN0aW9uIGluY2xpbmF0aW9uKCB2ZWN0b3IgKSB7CgoJCQlyZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTsKCgkJfQoKCX0KCglQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CglQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OwoKCS8qKgoJICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleQoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKCSAqLwoKCS8vIFRldHJhaGVkcm9uR2VvbWV0cnkKCglmdW5jdGlvbiBUZXRyYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCgkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25HZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJcmFkaXVzOiByYWRpdXMsCgkJCWRldGFpbDogZGV0YWlsCgkJfTsKCgkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCVRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CglUZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7CgoJLy8gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeQoKCWZ1bmN0aW9uIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgewoKCQl2YXIgdmVydGljZXMgPSBbCgkJCTEsIDEsIDEsIAktIDEsIC0gMSwgMSwgCS0gMSwgMSwgLSAxLCAJMSwgLSAxLCAtIDEKCQldOwoKCQl2YXIgaW5kaWNlcyA9IFsKCQkJMiwgMSwgMCwgCTAsIDMsIDIsCTEsIDMsIDAsCTIsIDMsIDEKCQldOwoKCQlQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7CgoJCXRoaXMudHlwZSA9ICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJZGV0YWlsOiBkZXRhaWwKCQl9OwoKCX0KCglUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXkKCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBPY3RhaGVkcm9uR2VvbWV0cnkKCglmdW5jdGlvbiBPY3RhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQlkZXRhaWw6IGRldGFpbAoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCU9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCU9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uR2VvbWV0cnk7CgoJLy8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCgkJdmFyIHZlcnRpY2VzID0gWwoJCQkxLCAwLCAwLCAJLSAxLCAwLCAwLAkwLCAxLCAwLAoJCQkwLCAtIDEsIDAsIAkwLCAwLCAxLAkwLCAwLCAtIDEKCQldOwoKCQl2YXIgaW5kaWNlcyA9IFsKCQkJMCwgMiwgNCwJMCwgNCwgMywJMCwgMywgNSwKCQkJMCwgNSwgMiwJMSwgMiwgNSwJMSwgNSwgMywKCQkJMSwgMywgNCwJMSwgNCwgMgoJCV07CgoJCVBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKCgkJdGhpcy50eXBlID0gJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJcmFkaXVzOiByYWRpdXMsCgkJCWRldGFpbDogZGV0YWlsCgkJfTsKCgl9CgoJT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCU9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CgoJLyoqCgkgKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICovCgoJLy8gSWNvc2FoZWRyb25HZW9tZXRyeQoKCWZ1bmN0aW9uIEljb3NhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJZGV0YWlsOiBkZXRhaWwKCQl9OwoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCUljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25HZW9tZXRyeTsKCgkvLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CgoJCXZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7CgoJCXZhciB2ZXJ0aWNlcyA9IFsKCQkJLSAxLCB0LCAwLCAJMSwgdCwgMCwgCS0gMSwgLSB0LCAwLCAJMSwgLSB0LCAwLAoJCQkgMCwgLSAxLCB0LCAJMCwgMSwgdCwJMCwgLSAxLCAtIHQsIAkwLCAxLCAtIHQsCgkJCSB0LCAwLCAtIDEsIAl0LCAwLCAxLCAJLSB0LCAwLCAtIDEsIAktIHQsIDAsIDEKCQldOwoKCQl2YXIgaW5kaWNlcyA9IFsKCQkJIDAsIDExLCA1LCAJMCwgNSwgMSwgCTAsIDEsIDcsIAkwLCA3LCAxMCwgCTAsIDEwLCAxMSwKCQkJIDEsIDUsIDksIAk1LCAxMSwgNCwJMTEsIDEwLCAyLAkxMCwgNywgNiwJNywgMSwgOCwKCQkJIDMsIDksIDQsIAkzLCA0LCAyLAkzLCAyLCA2LAkzLCA2LCA4LAkzLCA4LCA5LAoJCQkgNCwgOSwgNSwgCTIsIDQsIDExLAk2LCAyLCAxMCwJOCwgNiwgNywJOSwgOCwgMQoJCV07CgoJCVBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTsKCgkJdGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQlkZXRhaWw6IGRldGFpbAoJCX07CgoJfQoKCUljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OwoKCS8qKgoJICogQGF1dGhvciBBYmUgUGF6b3MgLyBodHRwczovL2hhbW9pZC5jb20KCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBEb2RlY2FoZWRyb25HZW9tZXRyeQoKCWZ1bmN0aW9uIERvZGVjYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCgkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQlkZXRhaWw6IGRldGFpbAoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CglEb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25HZW9tZXRyeTsKCgkvLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeQoKCWZ1bmN0aW9uIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCgkJdmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjsKCQl2YXIgciA9IDEgLyB0OwoKCQl2YXIgdmVydGljZXMgPSBbCgoJCQkvLyAowrExLCDCsTEsIMKxMSkKCQkJLSAxLCAtIDEsIC0gMSwJLSAxLCAtIDEsIDEsCgkJCS0gMSwgMSwgLSAxLCAtIDEsIDEsIDEsCgkJCTEsIC0gMSwgLSAxLCAxLCAtIDEsIDEsCgkJCTEsIDEsIC0gMSwgMSwgMSwgMSwKCgkJCS8vICgwLCDCsTEvz4YsIMKxz4YpCgkJCSAwLCAtIHIsIC0gdCwgMCwgLSByLCB0LAoJCQkgMCwgciwgLSB0LCAwLCByLCB0LAoKCQkJLy8gKMKxMS/PhiwgwrHPhiwgMCkKCQkJLSByLCAtIHQsIDAsIC0gciwgdCwgMCwKCQkJIHIsIC0gdCwgMCwgciwgdCwgMCwKCgkJCS8vICjCsc+GLCAwLCDCsTEvz4YpCgkJCS0gdCwgMCwgLSByLCB0LCAwLCAtIHIsCgkJCS0gdCwgMCwgciwgdCwgMCwgcgoJCV07CgoJCXZhciBpbmRpY2VzID0gWwoJCQkzLCAxMSwgNywgCTMsIDcsIDE1LCAJMywgMTUsIDEzLAoJCQk3LCAxOSwgMTcsIAk3LCAxNywgNiwgCTcsIDYsIDE1LAoJCQkxNywgNCwgOCwgCTE3LCA4LCAxMCwgCTE3LCAxMCwgNiwKCQkJOCwgMCwgMTYsIAk4LCAxNiwgMiwgCTgsIDIsIDEwLAoJCQkwLCAxMiwgMSwgCTAsIDEsIDE4LCAJMCwgMTgsIDE2LAoJCQk2LCAxMCwgMiwgCTYsIDIsIDEzLCAJNiwgMTMsIDE1LAoJCQkyLCAxNiwgMTgsIAkyLCAxOCwgMywgCTIsIDMsIDEzLAoJCQkxOCwgMSwgOSwgCTE4LCA5LCAxMSwgCTE4LCAxMSwgMywKCQkJNCwgMTQsIDEyLCAJNCwgMTIsIDAsIAk0LCAwLCA4LAoJCQkxMSwgOSwgNSwgCTExLCA1LCAxOSwgCTExLCAxOSwgNywKCQkJMTksIDUsIDE0LCAJMTksIDE0LCA0LCAJMTksIDQsIDE3LAoJCQkxLCAxMiwgMTQsIAkxLCAxNCwgNSwgCTEsIDUsIDkKCQldOwoKCQlQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7CgoJCXRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJcmFkaXVzOiByYWRpdXMsCgkJCWRldGFpbDogZGV0YWlsCgkJfTsKCgl9CgoJRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CgoJLyoqCgkgKiBAYXV0aG9yIG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGUKCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1CgkgKiBAYXV0aG9yIG1pbmluZ29sZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGQKCSAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICoKCSAqLwoKCS8vIFR1YmVHZW9tZXRyeQoKCWZ1bmN0aW9uIFR1YmVHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQsIHRhcGVyICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXBhdGg6IHBhdGgsCgkJCXR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAoJCQlyYWRpdXM6IHJhZGl1cywKCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAoJCQljbG9zZWQ6IGNsb3NlZAoJCX07CgoJCWlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCXZhciBidWZmZXJHZW9tZXRyeSA9IG5ldyBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICk7CgoJCS8vIGV4cG9zZSBpbnRlcm5hbHMKCgkJdGhpcy50YW5nZW50cyA9IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzOwoJCXRoaXMubm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5Lm5vcm1hbHM7CgkJdGhpcy5iaW5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5iaW5vcm1hbHM7CgoJCS8vIGNyZWF0ZSBnZW9tZXRyeQoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwoJVHViZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTsKCgkvLyBUdWJlQnVmZmVyR2VvbWV0cnkKCglmdW5jdGlvbiBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICkgewoKCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXBhdGg6IHBhdGgsCgkJCXR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAoJCQlyYWRpdXM6IHJhZGl1cywKCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAoJCQljbG9zZWQ6IGNsb3NlZAoJCX07CgoJCXR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDsKCQlyYWRpdXMgPSByYWRpdXMgfHwgMTsKCQlyYWRpYWxTZWdtZW50cyA9IHJhZGlhbFNlZ21lbnRzIHx8IDg7CgkJY2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlOwoKCQl2YXIgZnJhbWVzID0gcGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCB0dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCApOwoKCQkvLyBleHBvc2UgaW50ZXJuYWxzCgoJCXRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7CgkJdGhpcy5ub3JtYWxzID0gZnJhbWVzLm5vcm1hbHM7CgkJdGhpcy5iaW5vcm1hbHMgPSBmcmFtZXMuYmlub3JtYWxzOwoKCQkvLyBoZWxwZXIgdmFyaWFibGVzCgoJCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwoJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoJCXZhciB1diA9IG5ldyBWZWN0b3IyKCk7CgkJdmFyIFAgPSBuZXcgVmVjdG9yMygpOwoKCQl2YXIgaSwgajsKCgkJLy8gYnVmZmVyCgoJCXZhciB2ZXJ0aWNlcyA9IFtdOwoJCXZhciBub3JtYWxzID0gW107CgkJdmFyIHV2cyA9IFtdOwoJCXZhciBpbmRpY2VzID0gW107CgoJCS8vIGNyZWF0ZSBidWZmZXIgZGF0YQoKCQlnZW5lcmF0ZUJ1ZmZlckRhdGEoKTsKCgkJLy8gYnVpbGQgZ2VvbWV0cnkKCgkJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCgkJLy8gZnVuY3Rpb25zCgoJCWZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHsKCgkJCWZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkgewoKCQkJCWdlbmVyYXRlU2VnbWVudCggaSApOwoKCQkJfQoKCQkJLy8gaWYgdGhlIGdlb21ldHJ5IGlzIG5vdCBjbG9zZWQsIGdlbmVyYXRlIHRoZSBsYXN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscwoJCQkvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aAoJCQkvLwoJCQkvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCBkdXBsaWNhdGUgdGhlIGZpcnN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscyAodXZzIHdpbGwgZGlmZmVyKQoKCQkJZ2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTsKCgkJCS8vIHV2cyBhcmUgZ2VuZXJhdGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24uCgkJCS8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllcwoKCQkJZ2VuZXJhdGVVVnMoKTsKCgkJCS8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzCgoJCQlnZW5lcmF0ZUluZGljZXMoKTsKCgkJfQoKCQlmdW5jdGlvbiBnZW5lcmF0ZVNlZ21lbnQoIGkgKSB7CgoJCQkvLyB3ZSB1c2UgZ2V0UG9pbnRBdCB0byBzYW1wbGUgZXZlbmx5IGRpc3RyaWJ1dGVkIHBvaW50cyBmcm9tIHRoZSBnaXZlbiBwYXRoCgoJCQlQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzLCBQICk7CgoJCQkvLyByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIG5vcm1hbCBhbmQgYmlub3JtYWwKCgkJCXZhciBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTsKCQkJdmFyIEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07CgoJCQkvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudAoKCQkJZm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7CgoJCQkJdmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjsKCgkJCQl2YXIgc2luID0gTWF0aC5zaW4oIHYgKTsKCQkJCXZhciBjb3MgPSAtIE1hdGguY29zKCB2ICk7CgoJCQkJLy8gbm9ybWFsCgoJCQkJbm9ybWFsLnggPSAoIGNvcyAqIE4ueCArIHNpbiAqIEIueCApOwoJCQkJbm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApOwoJCQkJbm9ybWFsLnogPSAoIGNvcyAqIE4ueiArIHNpbiAqIEIueiApOwoJCQkJbm9ybWFsLm5vcm1hbGl6ZSgpOwoKCQkJCW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOwoKCQkJCS8vIHZlcnRleAoKCQkJCXZlcnRleC54ID0gUC54ICsgcmFkaXVzICogbm9ybWFsLng7CgkJCQl2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55OwoJCQkJdmVydGV4LnogPSBQLnogKyByYWRpdXMgKiBub3JtYWwuejsKCgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkgewoKCQkJZm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkgewoKCQkJCWZvciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkgewoKCQkJCQl2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7CgkJCQkJdmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTsKCQkJCQl2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTsKCQkJCQl2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpOwoKCQkJCQkvLyBmYWNlcwoKCQkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKCQkJCQlpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKCgkJCQl9CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7CgoJCQlmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7CgoJCQkJZm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7CgoJCQkJCXV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzOwoJCQkJCXV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7CgoJCQkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7CgoJCQkJfQoKCQkJfQoKCQl9CgoJfQoKCVR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2VvbWV0cnk7CgoJLyoqCgkgKiBAYXV0aG9yIG9vc21veGllY29kZQoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKCSAqCgkgKiBiYXNlZCBvbiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcHF0b3J1cy8KCSAqLwoKCS8vIFRvcnVzS25vdEdlb21ldHJ5CgoJZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7CgoJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJdHViZTogdHViZSwKCQkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsCgkJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKCQkJcDogcCwKCQkJcTogcQoJCX07CgoJCWlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCVRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwoJVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNLbm90R2VvbWV0cnk7CgoJLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkKCglmdW5jdGlvbiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgewoKCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJcmFkaXVzOiByYWRpdXMsCgkJCXR1YmU6IHR1YmUsCgkJCXR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAoJCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCgkJCXA6IHAsCgkJCXE6IHEKCQl9OwoKCQlyYWRpdXMgPSByYWRpdXMgfHwgMTsKCQl0dWJlID0gdHViZSB8fCAwLjQ7CgkJdHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7CgkJcmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7CgkJcCA9IHAgfHwgMjsKCQlxID0gcSB8fCAzOwoKCQkvLyBidWZmZXJzCgoJCXZhciBpbmRpY2VzID0gW107CgkJdmFyIHZlcnRpY2VzID0gW107CgkJdmFyIG5vcm1hbHMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCS8vIGhlbHBlciB2YXJpYWJsZXMKCgkJdmFyIGksIGo7CgoJCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwoJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoKCQl2YXIgUDEgPSBuZXcgVmVjdG9yMygpOwoJCXZhciBQMiA9IG5ldyBWZWN0b3IzKCk7CgoJCXZhciBCID0gbmV3IFZlY3RvcjMoKTsKCQl2YXIgVCA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIE4gPSBuZXcgVmVjdG9yMygpOwoKCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgoJCWZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHsKCgkJCS8vIHRoZSByYWRpYW4gInUiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudAoKCQkJdmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyOwoKCQkJLy8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuCgkJCS8vIHRoZXNlIHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsICJjb29yZGluYXRlIHNwYWNlIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zCgoJCQljYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTsKCQkJY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApOwoKCQkJLy8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzCgoJCQlULnN1YlZlY3RvcnMoIFAyLCBQMSApOwoJCQlOLmFkZFZlY3RvcnMoIFAyLCBQMSApOwoJCQlCLmNyb3NzVmVjdG9ycyggVCwgTiApOwoJCQlOLmNyb3NzVmVjdG9ycyggQiwgVCApOwoKCQkJLy8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdAoKCQkJQi5ub3JtYWxpemUoKTsKCQkJTi5ub3JtYWxpemUoKTsKCgkJCWZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyArKyBqICkgewoKCQkJCS8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLgoJCQkJLy8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuCgoJCQkJdmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjsKCQkJCXZhciBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7CgkJCQl2YXIgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTsKCgkJCQkvLyBub3cgY2FsY3VsYXRlIHRoZSBmaW5hbCB2ZXJ0ZXggcG9zaXRpb24uCgkJCQkvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3MsIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZQoKCQkJCXZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApOwoJCQkJdmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7CgkJCQl2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTsKCgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQkJLy8gbm9ybWFsIChQMSBpcyBhbHdheXMgdGhlIGNlbnRlci9vcmlnaW4gb2YgdGhlIGV4dHJ1c2lvbiwgdGh1cyB3ZSBjYW4gdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsKQoKCQkJCW5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7CgoJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgoJCQkJLy8gdXYKCgkJCQl1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApOwoJCQkJdXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApOwoKCQkJfQoKCQl9CgoJCS8vIGdlbmVyYXRlIGluZGljZXMKCgkJZm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkgewoKCQkJZm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7CgoJCQkJLy8gaW5kaWNlcwoKCQkJCXZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTsKCQkJCXZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7CgkJCQl2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTsKCQkJCXZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7CgoJCQkJLy8gZmFjZXMKCgkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKCQkJCWluZGljZXMucHVzaCggYiwgYywgZCApOwoKCQkJfQoKCQl9CgoJCS8vIGJ1aWxkIGdlb21ldHJ5CgoJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgoJCS8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUKCgkJZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIHBvc2l0aW9uICkgewoKCQkJdmFyIGN1ID0gTWF0aC5jb3MoIHUgKTsKCQkJdmFyIHN1ID0gTWF0aC5zaW4oIHUgKTsKCQkJdmFyIHF1T3ZlclAgPSBxIC8gcCAqIHU7CgkJCXZhciBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7CgoJCQlwb3NpdGlvbi54ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIDAuNSAqIGN1OwoJCQlwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41OwoJCQlwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTsKCgkJfQoKCX0KCglUb3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OwoKCS8qKgoJICogQGF1dGhvciBvb3Ntb3hpZWNvZGUKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICovCgoJLy8gVG9ydXNHZW9tZXRyeQoKCWZ1bmN0aW9uIFRvcnVzR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJdHViZTogdHViZSwKCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAoJCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKCQkJYXJjOiBhcmMKCQl9OwoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVRvcnVzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNHZW9tZXRyeTsKCgkvLyBUb3J1c0J1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7CgoJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1RvcnVzQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQl0dWJlOiB0dWJlLAoJCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCgkJCXR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAoJCQlhcmM6IGFyYwoJCX07CgoJCXJhZGl1cyA9IHJhZGl1cyB8fCAxOwoJCXR1YmUgPSB0dWJlIHx8IDAuNDsKCQlyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODsKCQl0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2OwoJCWFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjsKCgkJLy8gYnVmZmVycwoKCQl2YXIgaW5kaWNlcyA9IFtdOwoJCXZhciB2ZXJ0aWNlcyA9IFtdOwoJCXZhciBub3JtYWxzID0gW107CgkJdmFyIHV2cyA9IFtdOwoKCQkvLyBoZWxwZXIgdmFyaWFibGVzCgoJCXZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpOwoJCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwoJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoKCQl2YXIgaiwgaTsKCgkJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cwoKCQlmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHsKCgkJCWZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHsKCgkJCQl2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7CgkJCQl2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyOwoKCQkJCS8vIHZlcnRleAoKCQkJCXZlcnRleC54ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5jb3MoIHUgKTsKCQkJCXZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTsKCQkJCXZlcnRleC56ID0gdHViZSAqIE1hdGguc2luKCB2ICk7CgoJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCS8vIG5vcm1hbAoKCQkJCWNlbnRlci54ID0gcmFkaXVzICogTWF0aC5jb3MoIHUgKTsKCQkJCWNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4oIHUgKTsKCQkJCW5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpOwoKCQkJCW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOwoKCQkJCS8vIHV2CgoJCQkJdXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTsKCQkJCXV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTsKCgkJCX0KCgkJfQoKCQkvLyBnZW5lcmF0ZSBpbmRpY2VzCgoJCWZvciAoIGogPSAxOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkgewoKCQkJZm9yICggaSA9IDE7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkgewoKCQkJCS8vIGluZGljZXMKCgkJCQl2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxOwoJCQkJdmFyIGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxOwoJCQkJdmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7CgkJCQl2YXIgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7CgoJCQkJLy8gZmFjZXMKCgkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKCQkJCWluZGljZXMucHVzaCggYiwgYywgZCApOwoKCQkJfQoKCQl9CgoJCS8vIGJ1aWxkIGdlb21ldHJ5CgoJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgoJfQoKCVRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CglUb3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzQnVmZmVyR2VvbWV0cnk7CgoJLyoqCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICogUG9ydCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0ICh2Mi4xLjIpCgkgKi8KCgl2YXIgRWFyY3V0ID0gewoKCQl0cmlhbmd1bGF0ZTogZnVuY3Rpb24gKCBkYXRhLCBob2xlSW5kaWNlcywgZGltICkgewoKCQkJZGltID0gZGltIHx8IDI7CgoJCQl2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsCgkJCQlvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbIDAgXSAqIGRpbSA6IGRhdGEubGVuZ3RoLAoJCQkJb3V0ZXJOb2RlID0gbGlua2VkTGlzdCggZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSApLAoJCQkJdHJpYW5nbGVzID0gW107CgoJCQlpZiAoICEgb3V0ZXJOb2RlICkgcmV0dXJuIHRyaWFuZ2xlczsKCgkJCXZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplOwoKCQkJaWYgKCBoYXNIb2xlcyApIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKCBkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0gKTsKCgkJCS8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveAoKCQkJaWYgKCBkYXRhLmxlbmd0aCA+IDgwICogZGltICkgewoKCQkJCW1pblggPSBtYXhYID0gZGF0YVsgMCBdOwoJCQkJbWluWSA9IG1heFkgPSBkYXRhWyAxIF07CgoJCQkJZm9yICggdmFyIGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0gKSB7CgoJCQkJCXggPSBkYXRhWyBpIF07CgkJCQkJeSA9IGRhdGFbIGkgKyAxIF07CgkJCQkJaWYgKCB4IDwgbWluWCApIG1pblggPSB4OwoJCQkJCWlmICggeSA8IG1pblkgKSBtaW5ZID0geTsKCQkJCQlpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7CgkJCQkJaWYgKCB5ID4gbWF4WSApIG1heFkgPSB5OwoKCQkJCX0KCgkJCQkvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvbgoKCQkJCWludlNpemUgPSBNYXRoLm1heCggbWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZICk7CgkJCQlpbnZTaXplID0gaW52U2l6ZSAhPT0gMCA/IDEgLyBpbnZTaXplIDogMDsKCgkJCX0KCgkJCWVhcmN1dExpbmtlZCggb3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApOwoKCQkJcmV0dXJuIHRyaWFuZ2xlczsKCgkJfQoKCX07CgoJLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyCgoJZnVuY3Rpb24gbGlua2VkTGlzdCggZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UgKSB7CgoJCXZhciBpLCBsYXN0OwoKCQlpZiAoIGNsb2Nrd2lzZSA9PT0gKCBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSA+IDAgKSApIHsKCgkJCWZvciAoIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7CgoJCX0gZWxzZSB7CgoJCQlmb3IgKCBpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTsKCgkJfQoKCQlpZiAoIGxhc3QgJiYgZXF1YWxzKCBsYXN0LCBsYXN0Lm5leHQgKSApIHsKCgkJCXJlbW92ZU5vZGUoIGxhc3QgKTsKCQkJbGFzdCA9IGxhc3QubmV4dDsKCgkJfQoKCQlyZXR1cm4gbGFzdDsKCgl9CgoJLy8gZWxpbWluYXRlIGNvbGluZWFyIG9yIGR1cGxpY2F0ZSBwb2ludHMKCglmdW5jdGlvbiBmaWx0ZXJQb2ludHMoIHN0YXJ0LCBlbmQgKSB7CgoJCWlmICggISBzdGFydCApIHJldHVybiBzdGFydDsKCQlpZiAoICEgZW5kICkgZW5kID0gc3RhcnQ7CgoJCXZhciBwID0gc3RhcnQsIGFnYWluOwoKCQlkbyB7CgoJCQlhZ2FpbiA9IGZhbHNlOwoKCQkJaWYgKCAhIHAuc3RlaW5lciAmJiAoIGVxdWFscyggcCwgcC5uZXh0ICkgfHwgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkgewoKCQkJCXJlbW92ZU5vZGUoIHAgKTsKCQkJCXAgPSBlbmQgPSBwLnByZXY7CgkJCQlpZiAoIHAgPT09IHAubmV4dCApIGJyZWFrOwoJCQkJYWdhaW4gPSB0cnVlOwoKCQkJfSBlbHNlIHsKCgkJCQlwID0gcC5uZXh0OwoKCQkJfQoKCQl9IHdoaWxlICggYWdhaW4gfHwgcCAhPT0gZW5kICk7CgoJCXJldHVybiBlbmQ7CgoJfQoKCS8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KQoKCWZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHsKCgkJaWYgKCAhIGVhciApIHJldHVybjsKCgkJLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlcgoKCQlpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7CgoJCXZhciBzdG9wID0gZWFyLCBwcmV2LCBuZXh0OwoKCQkvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmUKCgkJd2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7CgoJCQlwcmV2ID0gZWFyLnByZXY7CgkJCW5leHQgPSBlYXIubmV4dDsKCgkJCWlmICggaW52U2l6ZSA/IGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSA6IGlzRWFyKCBlYXIgKSApIHsKCgkJCQkvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZQoJCQkJdHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApOwoJCQkJdHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7CgkJCQl0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7CgoJCQkJcmVtb3ZlTm9kZSggZWFyICk7CgoJCQkJLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGljZSBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXMKCQkJCWVhciA9IG5leHQubmV4dDsKCQkJCXN0b3AgPSBuZXh0Lm5leHQ7CgoJCQkJY29udGludWU7CgoJCQl9CgoJCQllYXIgPSBuZXh0OwoKCQkJLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnMKCgkJCWlmICggZWFyID09PSBzdG9wICkgewoKCQkJCS8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluCgoJCQkJaWYgKCAhIHBhc3MgKSB7CgoJCQkJCWVhcmN1dExpbmtlZCggZmlsdGVyUG9pbnRzKCBlYXIgKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEgKTsKCgkJCQkJLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHkKCgkJCQl9IGVsc2UgaWYgKCBwYXNzID09PSAxICkgewoKCQkJCQllYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBlYXIsIHRyaWFuZ2xlcywgZGltICk7CgkJCQkJZWFyY3V0TGlua2VkKCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyICk7CgoJCQkJLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d28KCgkJCQl9IGVsc2UgaWYgKCBwYXNzID09PSAyICkgewoKCQkJCQlzcGxpdEVhcmN1dCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApOwoKCQkJCX0KCgkJCQlicmVhazsKCgkJCX0KCgkJfQoKCX0KCgkvLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXMKCglmdW5jdGlvbiBpc0VhciggZWFyICkgewoKCQl2YXIgYSA9IGVhci5wcmV2LAoJCQliID0gZWFyLAoJCQljID0gZWFyLm5leHQ7CgoJCWlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyCgoJCS8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyCgkJdmFyIHAgPSBlYXIubmV4dC5uZXh0OwoKCQl3aGlsZSAoIHAgIT09IGVhci5wcmV2ICkgewoKCQkJaWYgKCBwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiYgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgewoKCQkJCXJldHVybiBmYWxzZTsKCgkJCX0KCgkJCXAgPSBwLm5leHQ7CgoJCX0KCgkJcmV0dXJuIHRydWU7CgoJfQoKCWZ1bmN0aW9uIGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSB7CgoJCXZhciBhID0gZWFyLnByZXYsCgkJCWIgPSBlYXIsCgkJCWMgPSBlYXIubmV4dDsKCgkJaWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXIKCgkJLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWQKCgkJdmFyIG1pblRYID0gYS54IDwgYi54ID8gKCBhLnggPCBjLnggPyBhLnggOiBjLnggKSA6ICggYi54IDwgYy54ID8gYi54IDogYy54ICksCgkJCW1pblRZID0gYS55IDwgYi55ID8gKCBhLnkgPCBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55IDwgYy55ID8gYi55IDogYy55ICksCgkJCW1heFRYID0gYS54ID4gYi54ID8gKCBhLnggPiBjLnggPyBhLnggOiBjLnggKSA6ICggYi54ID4gYy54ID8gYi54IDogYy54ICksCgkJCW1heFRZID0gYS55ID4gYi55ID8gKCBhLnkgPiBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55ID4gYy55ID8gYi55IDogYy55ICk7CgoJCS8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7CgoJCXZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSwKCQkJbWF4WiA9IHpPcmRlciggbWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7CgoJCS8vIGZpcnN0IGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGluY3JlYXNpbmcgei1vcmRlcgoKCQl2YXIgcCA9IGVhci5uZXh0WjsKCgkJd2hpbGUgKCBwICYmIHAueiA8PSBtYXhaICkgewoKCQkJaWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJgoJCQkJCXBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJgoJCQkJCWFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTsKCQkJcCA9IHAubmV4dFo7CgoJCX0KCgkJLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyCgoJCXAgPSBlYXIucHJldlo7CgoJCXdoaWxlICggcCAmJiBwLnogPj0gbWluWiApIHsKCgkJCWlmICggcCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiYKCQkJCQlwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiYKCQkJCQlhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7CgoJCQlwID0gcC5wcmV2WjsKCgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCgl9CgoJLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnMKCglmdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBzdGFydCwgdHJpYW5nbGVzLCBkaW0gKSB7CgoJCXZhciBwID0gc3RhcnQ7CgoJCWRvIHsKCgkJCXZhciBhID0gcC5wcmV2LCBiID0gcC5uZXh0Lm5leHQ7CgoJCQlpZiAoICEgZXF1YWxzKCBhLCBiICkgJiYgaW50ZXJzZWN0cyggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHsKCgkJCQl0cmlhbmdsZXMucHVzaCggYS5pIC8gZGltICk7CgkJCQl0cmlhbmdsZXMucHVzaCggcC5pIC8gZGltICk7CgkJCQl0cmlhbmdsZXMucHVzaCggYi5pIC8gZGltICk7CgoJCQkJLy8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZAoKCQkJCXJlbW92ZU5vZGUoIHAgKTsKCQkJCXJlbW92ZU5vZGUoIHAubmV4dCApOwoKCQkJCXAgPSBzdGFydCA9IGI7CgoJCQl9CgoJCQlwID0gcC5uZXh0OwoKCQl9IHdoaWxlICggcCAhPT0gc3RhcnQgKTsKCgkJcmV0dXJuIHA7CgoJfQoKCS8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5CgoJZnVuY3Rpb24gc3BsaXRFYXJjdXQoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHsKCgkJLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d28KCgkJdmFyIGEgPSBzdGFydDsKCgkJZG8gewoKCQkJdmFyIGIgPSBhLm5leHQubmV4dDsKCgkJCXdoaWxlICggYiAhPT0gYS5wcmV2ICkgewoKCQkJCWlmICggYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKCBhLCBiICkgKSB7CgoJCQkJCS8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWwKCgkJCQkJdmFyIGMgPSBzcGxpdFBvbHlnb24oIGEsIGIgKTsKCgkJCQkJLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHMKCgkJCQkJYSA9IGZpbHRlclBvaW50cyggYSwgYS5uZXh0ICk7CgkJCQkJYyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7CgoJCQkJCS8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmCgoJCQkJCWVhcmN1dExpbmtlZCggYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTsKCQkJCQllYXJjdXRMaW5rZWQoIGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7CgkJCQkJcmV0dXJuOwoKCQkJCX0KCgkJCQliID0gYi5uZXh0OwoKCQkJfQoKCQkJYSA9IGEubmV4dDsKCgkJfSB3aGlsZSAoIGEgIT09IHN0YXJ0ICk7CgoJfQoKCS8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXMKCglmdW5jdGlvbiBlbGltaW5hdGVIb2xlcyggZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltICkgewoKCQl2YXIgcXVldWUgPSBbXSwgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0OwoKCQlmb3IgKCBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpICsrICkgewoKCQkJc3RhcnQgPSBob2xlSW5kaWNlc1sgaSBdICogZGltOwoJCQllbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzWyBpICsgMSBdICogZGltIDogZGF0YS5sZW5ndGg7CgkJCWxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7CgkJCWlmICggbGlzdCA9PT0gbGlzdC5uZXh0ICkgbGlzdC5zdGVpbmVyID0gdHJ1ZTsKCQkJcXVldWUucHVzaCggZ2V0TGVmdG1vc3QoIGxpc3QgKSApOwoKCQl9CgoJCXF1ZXVlLnNvcnQoIGNvbXBhcmVYICk7CgoJCS8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0CgoJCWZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkgewoKCQkJZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7CgkJCW91dGVyTm9kZSA9IGZpbHRlclBvaW50cyggb3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCApOwoKCQl9CgoJCXJldHVybiBvdXRlck5vZGU7CgoJfQoKCWZ1bmN0aW9uIGNvbXBhcmVYKCBhLCBiICkgewoKCQlyZXR1cm4gYS54IC0gYi54OwoKCX0KCgkvLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXQKCglmdW5jdGlvbiBlbGltaW5hdGVIb2xlKCBob2xlLCBvdXRlck5vZGUgKSB7CgoJCW91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTsKCgkJaWYgKCBvdXRlck5vZGUgKSB7CgoJCQl2YXIgYiA9IHNwbGl0UG9seWdvbiggb3V0ZXJOb2RlLCBob2xlICk7CgoJCQlmaWx0ZXJQb2ludHMoIGIsIGIubmV4dCApOwoKCQl9CgoJfQoKCS8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb24KCglmdW5jdGlvbiBmaW5kSG9sZUJyaWRnZSggaG9sZSwgb3V0ZXJOb2RlICkgewoKCQl2YXIgcCA9IG91dGVyTm9kZSwKCQkJaHggPSBob2xlLngsCgkJCWh5ID0gaG9sZS55LAoJCQlxeCA9IC0gSW5maW5pdHksCgkJCW07CgoJCS8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDsKCQkvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50CgoJCWRvIHsKCgkJCWlmICggaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkgKSB7CgoJCQkJdmFyIHggPSBwLnggKyAoIGh5IC0gcC55ICkgKiAoIHAubmV4dC54IC0gcC54ICkgLyAoIHAubmV4dC55IC0gcC55ICk7CgoJCQkJaWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHsKCgkJCQkJcXggPSB4OwoKCQkJCQlpZiAoIHggPT09IGh4ICkgewoKCQkJCQkJaWYgKCBoeSA9PT0gcC55ICkgcmV0dXJuIHA7CgkJCQkJCWlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDsKCgkJCQkJfQoKCQkJCQltID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0OwoKCQkJCX0KCgkJCX0KCgkJCXAgPSBwLm5leHQ7CgoJCX0gd2hpbGUgKCBwICE9PSBvdXRlck5vZGUgKTsKCgkJaWYgKCAhIG0gKSByZXR1cm4gbnVsbDsKCgkJaWYgKCBoeCA9PT0gcXggKSByZXR1cm4gbS5wcmV2OyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsb3dlciBlbmRwb2ludAoKCQkvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7CgkJLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247CgkJLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnQKCgkJdmFyIHN0b3AgPSBtLAoJCQlteCA9IG0ueCwKCQkJbXkgPSBtLnksCgkJCXRhbk1pbiA9IEluZmluaXR5LAoJCQl0YW47CgoJCXAgPSBtLm5leHQ7CgoJCXdoaWxlICggcCAhPT0gc3RvcCApIHsKCgkJCWlmICggaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmCgkJCQkJCQlwb2ludEluVHJpYW5nbGUoIGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55ICkgKSB7CgoJCQkJdGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWwKCgkJCQlpZiAoICggdGFuIDwgdGFuTWluIHx8ICggdGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54ICkgKSAmJiBsb2NhbGx5SW5zaWRlKCBwLCBob2xlICkgKSB7CgoJCQkJCW0gPSBwOwoJCQkJCXRhbk1pbiA9IHRhbjsKCgkJCQl9CgoJCQl9CgoJCQlwID0gcC5uZXh0OwoKCQl9CgoJCXJldHVybiBtOwoKCX0KCgkvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyCgoJZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7CgoJCXZhciBwID0gc3RhcnQ7CgoJCWRvIHsKCgkJCWlmICggcC56ID09PSBudWxsICkgcC56ID0gek9yZGVyKCBwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSApOwoJCQlwLnByZXZaID0gcC5wcmV2OwoJCQlwLm5leHRaID0gcC5uZXh0OwoJCQlwID0gcC5uZXh0OwoKCQl9IHdoaWxlICggcCAhPT0gc3RhcnQgKTsKCgkJcC5wcmV2Wi5uZXh0WiA9IG51bGw7CgkJcC5wcmV2WiA9IG51bGw7CgoJCXNvcnRMaW5rZWQoIHAgKTsKCgl9CgoJLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG0KCS8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sCgoJZnVuY3Rpb24gc29ydExpbmtlZCggbGlzdCApIHsKCgkJdmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLCBpblNpemUgPSAxOwoKCQlkbyB7CgoJCQlwID0gbGlzdDsKCQkJbGlzdCA9IG51bGw7CgkJCXRhaWwgPSBudWxsOwoJCQludW1NZXJnZXMgPSAwOwoKCQkJd2hpbGUgKCBwICkgewoKCQkJCW51bU1lcmdlcyArKzsKCQkJCXEgPSBwOwoJCQkJcFNpemUgPSAwOwoKCQkJCWZvciAoIGkgPSAwOyBpIDwgaW5TaXplOyBpICsrICkgewoKCQkJCQlwU2l6ZSArKzsKCQkJCQlxID0gcS5uZXh0WjsKCQkJCQlpZiAoICEgcSApIGJyZWFrOwoKCQkJCX0KCgkJCQlxU2l6ZSA9IGluU2l6ZTsKCgkJCQl3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7CgoJCQkJCWlmICggcFNpemUgIT09IDAgJiYgKCBxU2l6ZSA9PT0gMCB8fCAhIHEgfHwgcC56IDw9IHEueiApICkgewoKCQkJCQkJZSA9IHA7CgkJCQkJCXAgPSBwLm5leHRaOwoJCQkJCQlwU2l6ZSAtLTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWUgPSBxOwoJCQkJCQlxID0gcS5uZXh0WjsKCQkJCQkJcVNpemUgLS07CgoJCQkJCX0KCgkJCQkJaWYgKCB0YWlsICkgdGFpbC5uZXh0WiA9IGU7CgkJCQkJZWxzZSBsaXN0ID0gZTsKCgkJCQkJZS5wcmV2WiA9IHRhaWw7CgkJCQkJdGFpbCA9IGU7CgoJCQkJfQoKCQkJCXAgPSBxOwoKCQkJfQoKCQkJdGFpbC5uZXh0WiA9IG51bGw7CgkJCWluU2l6ZSAqPSAyOwoKCQl9IHdoaWxlICggbnVtTWVyZ2VzID4gMSApOwoKCQlyZXR1cm4gbGlzdDsKCgl9CgoJLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94CgoJZnVuY3Rpb24gek9yZGVyKCB4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplICkgewoKCQkvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlCgoJCXggPSAzMjc2NyAqICggeCAtIG1pblggKSAqIGludlNpemU7CgkJeSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTsKCgkJeCA9ICggeCB8ICggeCA8PCA4ICkgKSAmIDB4MDBGRjAwRkY7CgkJeCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7CgkJeCA9ICggeCB8ICggeCA8PCAyICkgKSAmIDB4MzMzMzMzMzM7CgkJeCA9ICggeCB8ICggeCA8PCAxICkgKSAmIDB4NTU1NTU1NTU7CgoJCXkgPSAoIHkgfCAoIHkgPDwgOCApICkgJiAweDAwRkYwMEZGOwoJCXkgPSAoIHkgfCAoIHkgPDwgNCApICkgJiAweDBGMEYwRjBGOwoJCXkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzOwoJCXkgPSAoIHkgfCAoIHkgPDwgMSApICkgJiAweDU1NTU1NTU1OwoKCQlyZXR1cm4geCB8ICggeSA8PCAxICk7CgoJfQoKCS8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmcKCglmdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7CgoJCXZhciBwID0gc3RhcnQsIGxlZnRtb3N0ID0gc3RhcnQ7CgoJCWRvIHsKCgkJCWlmICggcC54IDwgbGVmdG1vc3QueCApIGxlZnRtb3N0ID0gcDsKCQkJcCA9IHAubmV4dDsKCgkJfSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7CgoJCXJldHVybiBsZWZ0bW9zdDsKCgl9CgoJLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZQoKCWZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZSggYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5ICkgewoKCQlyZXR1cm4gKCBjeCAtIHB4ICkgKiAoIGF5IC0gcHkgKSAtICggYXggLSBweCApICogKCBjeSAtIHB5ICkgPj0gMCAmJgoJCSAoIGF4IC0gcHggKSAqICggYnkgLSBweSApIC0gKCBieCAtIHB4ICkgKiAoIGF5IC0gcHkgKSA+PSAwICYmCgkJICggYnggLSBweCApICogKCBjeSAtIHB5ICkgLSAoIGN4IC0gcHggKSAqICggYnkgLSBweSApID49IDA7CgoJfQoKCS8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKQoKCWZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbCggYSwgYiApIHsKCgkJcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkgJiYKCQkJbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTsKCgl9CgoJLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZQoKCWZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7CgoJCXJldHVybiAoIHEueSAtIHAueSApICogKCByLnggLSBxLnggKSAtICggcS54IC0gcC54ICkgKiAoIHIueSAtIHEueSApOwoKCX0KCgkvLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbAoKCWZ1bmN0aW9uIGVxdWFscyggcDEsIHAyICkgewoKCQlyZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55OwoKCX0KCgkvLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0CgoJZnVuY3Rpb24gaW50ZXJzZWN0cyggcDEsIHExLCBwMiwgcTIgKSB7CgoJCWlmICggKCBlcXVhbHMoIHAxLCBxMSApICYmIGVxdWFscyggcDIsIHEyICkgKSB8fAoJCQkJKCBlcXVhbHMoIHAxLCBxMiApICYmIGVxdWFscyggcDIsIHExICkgKSApIHJldHVybiB0cnVlOwoKCQlyZXR1cm4gYXJlYSggcDEsIHExLCBwMiApID4gMCAhPT0gYXJlYSggcDEsIHExLCBxMiApID4gMCAmJgoJCQkJCSBhcmVhKCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhKCBwMiwgcTIsIHExICkgPiAwOwoKCX0KCgkvLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50cwoKCWZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkgewoKCQl2YXIgcCA9IGE7CgoJCWRvIHsKCgkJCWlmICggcC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmCgkJCQkJCQlpbnRlcnNlY3RzKCBwLCBwLm5leHQsIGEsIGIgKSApIHsKCgkJCQlyZXR1cm4gdHJ1ZTsKCgkJCX0KCgkJCXAgPSBwLm5leHQ7CgoJCX0gd2hpbGUgKCBwICE9PSBhICk7CgoJCXJldHVybiBmYWxzZTsKCgl9CgoJLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uCgoJZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHsKCgkJcmV0dXJuIGFyZWEoIGEucHJldiwgYSwgYS5uZXh0ICkgPCAwID8KCQkJYXJlYSggYSwgYiwgYS5uZXh0ICkgPj0gMCAmJiBhcmVhKCBhLCBhLnByZXYsIGIgKSA+PSAwIDoKCQkJYXJlYSggYSwgYiwgYS5wcmV2ICkgPCAwIHx8IGFyZWEoIGEsIGEubmV4dCwgYiApIDwgMDsKCgl9CgoJLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uCgoJZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkgewoKCQl2YXIgcCA9IGEsCgkJCWluc2lkZSA9IGZhbHNlLAoJCQlweCA9ICggYS54ICsgYi54ICkgLyAyLAoJCQlweSA9ICggYS55ICsgYi55ICkgLyAyOwoKCQlkbyB7CgoJCQlpZiAoICggKCBwLnkgPiBweSApICE9PSAoIHAubmV4dC55ID4gcHkgKSApICYmIHAubmV4dC55ICE9PSBwLnkgJiYKCQkJCQkJCSggcHggPCAoIHAubmV4dC54IC0gcC54ICkgKiAoIHB5IC0gcC55ICkgLyAoIHAubmV4dC55IC0gcC55ICkgKyBwLnggKSApIHsKCgkJCQlpbnNpZGUgPSAhIGluc2lkZTsKCgkJCX0KCgkJCXAgPSBwLm5leHQ7CgoJCX0gd2hpbGUgKCBwICE9PSBhICk7CgoJCXJldHVybiBpbnNpZGU7CgoJfQoKCS8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bzsKCS8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZwoKCWZ1bmN0aW9uIHNwbGl0UG9seWdvbiggYSwgYiApIHsKCgkJdmFyIGEyID0gbmV3IE5vZGUoIGEuaSwgYS54LCBhLnkgKSwKCQkJYjIgPSBuZXcgTm9kZSggYi5pLCBiLngsIGIueSApLAoJCQlhbiA9IGEubmV4dCwKCQkJYnAgPSBiLnByZXY7CgoJCWEubmV4dCA9IGI7CgkJYi5wcmV2ID0gYTsKCgkJYTIubmV4dCA9IGFuOwoJCWFuLnByZXYgPSBhMjsKCgkJYjIubmV4dCA9IGEyOwoJCWEyLnByZXYgPSBiMjsKCgkJYnAubmV4dCA9IGIyOwoJCWIyLnByZXYgPSBicDsKCgkJcmV0dXJuIGIyOwoKCX0KCgkvLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KQoKCWZ1bmN0aW9uIGluc2VydE5vZGUoIGksIHgsIHksIGxhc3QgKSB7CgoJCXZhciBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTsKCgkJaWYgKCAhIGxhc3QgKSB7CgoJCQlwLnByZXYgPSBwOwoJCQlwLm5leHQgPSBwOwoKCQl9IGVsc2UgewoKCQkJcC5uZXh0ID0gbGFzdC5uZXh0OwoJCQlwLnByZXYgPSBsYXN0OwoJCQlsYXN0Lm5leHQucHJldiA9IHA7CgkJCWxhc3QubmV4dCA9IHA7CgoJCX0KCgkJcmV0dXJuIHA7CgoJfQoKCWZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7CgoJCXAubmV4dC5wcmV2ID0gcC5wcmV2OwoJCXAucHJldi5uZXh0ID0gcC5uZXh0OwoKCQlpZiAoIHAucHJldlogKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjsKCQlpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjsKCgl9CgoJZnVuY3Rpb24gTm9kZSggaSwgeCwgeSApIHsKCgkJLy8gdmVydGljZSBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheQoJCXRoaXMuaSA9IGk7CgoJCS8vIHZlcnRleCBjb29yZGluYXRlcwoJCXRoaXMueCA9IHg7CgkJdGhpcy55ID0geTsKCgkJLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGljZSBub2RlcyBpbiBhIHBvbHlnb24gcmluZwoJCXRoaXMucHJldiA9IG51bGw7CgkJdGhpcy5uZXh0ID0gbnVsbDsKCgkJLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZQoJCXRoaXMueiA9IG51bGw7CgoJCS8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXIKCQl0aGlzLnByZXZaID0gbnVsbDsKCQl0aGlzLm5leHRaID0gbnVsbDsKCgkJLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnQKCQl0aGlzLnN0ZWluZXIgPSBmYWxzZTsKCgl9CgoJZnVuY3Rpb24gc2lnbmVkQXJlYSggZGF0YSwgc3RhcnQsIGVuZCwgZGltICkgewoKCQl2YXIgc3VtID0gMDsKCgkJZm9yICggdmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0gKSB7CgoJCQlzdW0gKz0gKCBkYXRhWyBqIF0gLSBkYXRhWyBpIF0gKSAqICggZGF0YVsgaSArIDEgXSArIGRhdGFbIGogKyAxIF0gKTsKCQkJaiA9IGk7CgoJCX0KCgkJcmV0dXJuIHN1bTsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCgkgKi8KCgl2YXIgU2hhcGVVdGlscyA9IHsKCgkJLy8gY2FsY3VsYXRlIGFyZWEgb2YgdGhlIGNvbnRvdXIgcG9seWdvbgoKCQlhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIgKSB7CgoJCQl2YXIgbiA9IGNvbnRvdXIubGVuZ3RoOwoJCQl2YXIgYSA9IDAuMDsKCgkJCWZvciAoIHZhciBwID0gbiAtIDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7CgoJCQkJYSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTsKCgkJCX0KCgkJCXJldHVybiBhICogMC41OwoKCQl9LAoKCQlpc0Nsb2NrV2lzZTogZnVuY3Rpb24gKCBwdHMgKSB7CgoJCQlyZXR1cm4gU2hhcGVVdGlscy5hcmVhKCBwdHMgKSA8IDA7CgoJCX0sCgoJCXRyaWFuZ3VsYXRlU2hhcGU6IGZ1bmN0aW9uICggY29udG91ciwgaG9sZXMgKSB7CgoJCQlmdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMoIHBvaW50cyApIHsKCgkJCQl2YXIgbCA9IHBvaW50cy5sZW5ndGg7CgoJCQkJaWYgKCBsID4gMiAmJiBwb2ludHNbIGwgLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkgewoKCQkJCQlwb2ludHMucG9wKCk7CgoJCQkJfQoKCQkJfQoKCQkJZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7CgoJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgY29udG91ci5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCXZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS54ICk7CgkJCQkJdmVydGljZXMucHVzaCggY29udG91clsgaSBdLnkgKTsKCgkJCQl9CgoJCQl9CgoJCQl2YXIgdmVydGljZXMgPSBbXTsgLy8gZmxhdCBhcnJheSBvZiB2ZXJ0aWNlcyBsaWtlIFsgeDAseTAsIHgxLHkxLCB4Mix5MiwgLi4uIF0KCQkJdmFyIGhvbGVJbmRpY2VzID0gW107IC8vIGFycmF5IG9mIGhvbGUgaW5kaWNlcwoJCQl2YXIgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF0KCgkJCXJlbW92ZUR1cEVuZFB0cyggY29udG91ciApOwoJCQlhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApOwoKCQkJLy8KCgkJCXZhciBob2xlSW5kZXggPSBjb250b3VyLmxlbmd0aDsKCQkJaG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7CgoJCQlmb3IgKCBpID0gMDsgaSA8IGhvbGVzLmxlbmd0aDsgaSArKyApIHsKCgkJCQlob2xlSW5kaWNlcy5wdXNoKCBob2xlSW5kZXggKTsKCQkJCWhvbGVJbmRleCArPSBob2xlc1sgaSBdLmxlbmd0aDsKCQkJCWFkZENvbnRvdXIoIHZlcnRpY2VzLCBob2xlc1sgaSBdICk7CgoJCQl9CgoJCQkvLwoKCQkJdmFyIHRyaWFuZ2xlcyA9IEVhcmN1dC50cmlhbmd1bGF0ZSggdmVydGljZXMsIGhvbGVJbmRpY2VzICk7CgoJCQkvLwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzICkgewoKCQkJCWZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApOwoKCQkJfQoKCQkJcmV0dXJuIGZhY2VzOwoKCQl9CgoJfTsKCgkvKioKCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKCSAqCgkgKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLgoJICoKCSAqIHBhcmFtZXRlcnMgPSB7CgkgKgoJICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXMKCSAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBleHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxpbmUgdG9vCgkgKiAgYW1vdW50OiA8aW50PiwgLy8gRGVwdGggdG8gZXh0cnVkZSB0aGUgc2hhcGUKCSAqCgkgKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWwKCSAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0aGUgb3JpZ2luYWwgc2hhcGUgYmV2ZWwgZ29lcwoJICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgaXMgYmV2ZWwKCSAqICBiZXZlbFNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIGJldmVsIGxheWVycwoJICoKCSAqICBleHRydWRlUGF0aDogPFRIUkVFLkN1cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nCgkgKiAgZnJhbWVzOiA8T2JqZWN0PiAvLyBjb250YWluaW5nIGFycmF5cyBvZiB0YW5nZW50cywgbm9ybWFscywgYmlub3JtYWxzCgkgKgoJICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBvYmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zCgkgKgoJICogfQoJICovCgoJLy8gRXh0cnVkZUdlb21ldHJ5CgoJZnVuY3Rpb24gRXh0cnVkZUdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7CgoJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJc2hhcGVzOiBzaGFwZXMsCgkJCW9wdGlvbnM6IG9wdGlvbnMKCQl9OwoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwoJRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVHZW9tZXRyeTsKCgkvLyBFeHRydWRlQnVmZmVyR2VvbWV0cnkKCglmdW5jdGlvbiBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHsKCgkJaWYgKCB0eXBlb2YgKCBzaGFwZXMgKSA9PT0gInVuZGVmaW5lZCIgKSB7CgoJCQlyZXR1cm47CgoJCX0KCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnRXh0cnVkZUJ1ZmZlckdlb21ldHJ5JzsKCgkJc2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdOwoKCQl0aGlzLmFkZFNoYXBlTGlzdCggc2hhcGVzLCBvcHRpb25zICk7CgoJCXRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKCgkJLy8gY2FuJ3QgcmVhbGx5IHVzZSBhdXRvbWF0aWMgdmVydGV4IG5vcm1hbHMKCQkvLyBhcyB0aGVuIGZyb250IGFuZCBiYWNrIHNpZGVzIGdldCBzbW9vdGhlZCB0b28KCQkvLyBzaG91bGQgZG8gc2VwYXJhdGUgc21vb3RoaW5nIGp1c3QgZm9yIHNpZGVzCgoJCS8vdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOwoKCQkvL2NvbnNvbGUubG9nKCAidG9vayIsICggRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSApICk7CgoJfQoKCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlQnVmZmVyR2VvbWV0cnk7CgoJRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5nZXRBcnJheXMgPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAicG9zaXRpb24iICk7CgkJdmFyIHZlcnRpY2VzQXJyYXkgPSBwb3NpdGlvbkF0dHJpYnV0ZSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBwb3NpdGlvbkF0dHJpYnV0ZS5hcnJheSApIDogW107CgoJCXZhciB1dkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAidXYiICk7CgkJdmFyIHV2QXJyYXkgPSB1dkF0dHJpYnV0ZSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCB1dkF0dHJpYnV0ZS5hcnJheSApIDogW107CgoJCXZhciBJbmRleEF0dHJpYnV0ZSA9IHRoaXMuaW5kZXg7CgkJdmFyIGluZGljZXNBcnJheSA9IEluZGV4QXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIEluZGV4QXR0cmlidXRlLmFycmF5ICkgOiBbXTsKCgkJcmV0dXJuIHsKCQkJcG9zaXRpb246IHZlcnRpY2VzQXJyYXksCgkJCXV2OiB1dkFycmF5LAoJCQlpbmRleDogaW5kaWNlc0FycmF5CgkJfTsKCgl9OwoKCUV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuYWRkU2hhcGVMaXN0ID0gZnVuY3Rpb24gKCBzaGFwZXMsIG9wdGlvbnMgKSB7CgoJCXZhciBzbCA9IHNoYXBlcy5sZW5ndGg7CgkJb3B0aW9ucy5hcnJheXMgPSB0aGlzLmdldEFycmF5cygpOwoKCQlmb3IgKCB2YXIgcyA9IDA7IHMgPCBzbDsgcyArKyApIHsKCgkJCXZhciBzaGFwZSA9IHNoYXBlc1sgcyBdOwoJCQl0aGlzLmFkZFNoYXBlKCBzaGFwZSwgb3B0aW9ucyApOwoKCQl9CgoJCXRoaXMuc2V0SW5kZXgoIG9wdGlvbnMuYXJyYXlzLmluZGV4ICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBvcHRpb25zLmFycmF5cy5wb3NpdGlvbiwgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBvcHRpb25zLmFycmF5cy51diwgMiApICk7CgoJfTsKCglFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZFNoYXBlID0gZnVuY3Rpb24gKCBzaGFwZSwgb3B0aW9ucyApIHsKCgkJdmFyIGFycmF5cyA9IG9wdGlvbnMuYXJyYXlzID8gb3B0aW9ucy5hcnJheXMgOiB0aGlzLmdldEFycmF5cygpOwoJCXZhciB2ZXJ0aWNlc0FycmF5ID0gYXJyYXlzLnBvc2l0aW9uOwoJCXZhciBpbmRpY2VzQXJyYXkgPSBhcnJheXMuaW5kZXg7CgkJdmFyIHV2QXJyYXkgPSBhcnJheXMudXY7CgoJCXZhciBwbGFjZWhvbGRlciA9IFtdOwoKCgkJdmFyIGFtb3VudCA9IG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFtb3VudCA6IDEwMDsKCgkJdmFyIGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDY7IC8vIDEwCgkJdmFyIGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMjsgLy8gOAoJCXZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzOwoKCQl2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTsgLy8gZmFsc2UKCgkJdmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyOwoKCQl2YXIgc3RlcHMgPSBvcHRpb25zLnN0ZXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZXBzIDogMTsKCgkJdmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDsKCQl2YXIgZXh0cnVkZVB0cywgZXh0cnVkZUJ5UGF0aCA9IGZhbHNlOwoKCQkvLyBVc2UgZGVmYXVsdCBXb3JsZFVWR2VuZXJhdG9yIGlmIG5vIFVWIGdlbmVyYXRvcnMgYXJlIHNwZWNpZmllZC4KCQl2YXIgdXZnZW4gPSBvcHRpb25zLlVWR2VuZXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLlVWR2VuZXJhdG9yIDogRXh0cnVkZUdlb21ldHJ5LldvcmxkVVZHZW5lcmF0b3I7CgoJCXZhciBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7CgkJaWYgKCBleHRydWRlUGF0aCApIHsKCgkJCWV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7CgoJCQlleHRydWRlQnlQYXRoID0gdHJ1ZTsKCQkJYmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvbgoKCQkJLy8gU0VUVVAgVE5CIHZhcmlhYmxlcwoKCQkJLy8gVE9ETzEgLSBoYXZlIGEgLmlzQ2xvc2VkIGluIHNwbGluZT8KCgkJCXNwbGluZVR1YmUgPSBvcHRpb25zLmZyYW1lcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mcmFtZXMgOiBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTsKCgkJCS8vIGNvbnNvbGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpOwoKCQkJYmlub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoJCQlub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoJCQlwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpOwoKCQl9CgoJCS8vIFNhZmVndWFyZHMgaWYgYmV2ZWxzIGFyZSBub3QgZW5hYmxlZAoKCQlpZiAoICEgYmV2ZWxFbmFibGVkICkgewoKCQkJYmV2ZWxTZWdtZW50cyA9IDA7CgkJCWJldmVsVGhpY2tuZXNzID0gMDsKCQkJYmV2ZWxTaXplID0gMDsKCgkJfQoKCQkvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb24KCgkJdmFyIGFob2xlLCBoLCBobDsgLy8gbG9vcGluZyBvZiBob2xlcwoJCXZhciBzY29wZSA9IHRoaXM7CgoJCXZhciBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTsKCgkJdmFyIHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7CgkJdmFyIGhvbGVzID0gc2hhcGVQb2ludHMuaG9sZXM7CgoJCXZhciByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApOwoKCQlpZiAoIHJldmVyc2UgKSB7CgoJCQl2ZXJ0aWNlcyA9IHZlcnRpY2VzLnJldmVyc2UoKTsKCgkJCS8vIE1heWJlIHdlIHNob3VsZCBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBqdXN0IHRvIGJlIHNhZmUgLi4uCgoJCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKCgkJCQlhaG9sZSA9IGhvbGVzWyBoIF07CgoJCQkJaWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkgewoKCQkJCQlob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpOwoKCQkJCX0KCgkJCX0KCgkJfQoKCgkJdmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTsKCgkJLyogVmVydGljZXMgKi8KCgkJdmFyIGNvbnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIgaGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2UKCgkJZm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CgoJCQlhaG9sZSA9IGhvbGVzWyBoIF07CgoJCQl2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTsKCgkJfQoKCgkJZnVuY3Rpb24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7CgoJCQlpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiApOwoKCQkJcmV0dXJuIHZlYy5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKCBzaXplICkuYWRkKCBwdCApOwoKCQl9CgoJCXZhciBiLCBicywgdCwgeiwKCQkJdmVydCwgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aCwKCQkJZmFjZSwgZmxlbiA9IGZhY2VzLmxlbmd0aDsKCgoJCS8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnQKCgoJCWZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHsKCgkJCS8vIGNvbXB1dGVzIGZvciBpblB0IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXIKCQkJLy8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdAoJCQkvLyBpZiB3ZSB3YWxrIGFsb25nIGNvbnRvdXIgY2xvY2t3aXNlLCB0aGlzIG5ldyBjb250b3VyIGlzIG91dHNpZGUgdGhlIG9sZCBvbmUKCQkJLy8KCQkJLy8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d28KCQkJLy8gIGFkamFjZW50IGVkZ2VzIG9mIGluUHQgYXQgYSBkaXN0YW5jZSBvZiAxIHVuaXQgb24gdGhlIGxlZnQgc2lkZS4KCgkJCXZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0CgoJCQkvLyBnb29kIHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pCgkJCS8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sCgoJCQl2YXIgdl9wcmV2X3ggPSBpblB0LnggLSBpblByZXYueCwKCQkJCXZfcHJldl95ID0gaW5QdC55IC0gaW5QcmV2Lnk7CgkJCXZhciB2X25leHRfeCA9IGluTmV4dC54IC0gaW5QdC54LAoJCQkJdl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTsKCgkJCXZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7CgoJCQkvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzCgkJCXZhciBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApOwoKCQkJaWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7CgoJCQkJLy8gbm90IGNvbGxpbmVhcgoKCQkJCS8vIGxlbmd0aCBvZiB2ZWN0b3JzIGZvciBub3JtYWxpemluZwoKCQkJCXZhciB2X3ByZXZfbGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTsKCQkJCXZhciB2X25leHRfbGVuID0gTWF0aC5zcXJ0KCB2X25leHRfeCAqIHZfbmV4dF94ICsgdl9uZXh0X3kgKiB2X25leHRfeSApOwoKCQkJCS8vIHNoaWZ0IGFkamFjZW50IHBvaW50cyBieSB1bml0IHZlY3RvcnMgdG8gdGhlIGxlZnQKCgkJCQl2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJldl9sZW4gKTsKCQkJCXZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApOwoKCQkJCXZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApOwoJCQkJdmFyIHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7CgoJCQkJLy8gc2NhbGluZyBmYWN0b3IgZm9yIHZfcHJldiB0byBpbnRlcnNlY3Rpb24gcG9pbnQKCgkJCQl2YXIgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC0KCQkJCQkJKCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvCgkJCQkJKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApOwoKCQkJCS8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50CgoJCQkJdl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApOwoJCQkJdl90cmFuc195ID0gKCBwdFByZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApOwoKCQkJCS8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5CgkJCQkvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2VzCgkJCQl2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7CgkJCQlpZiAoIHZfdHJhbnNfbGVuc3EgPD0gMiApIHsKCgkJCQkJcmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXNocmlua19ieSA9IE1hdGguc3FydCggdl90cmFuc19sZW5zcSAvIDIgKTsKCgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCS8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzCgoJCQkJdmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZQoJCQkJaWYgKCB2X3ByZXZfeCA+IE51bWJlci5FUFNJTE9OICkgewoKCQkJCQlpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7CgoJCQkJCQlkaXJlY3Rpb25fZXEgPSB0cnVlOwoKCQkJCQl9CgoJCQkJfSBlbHNlIHsKCgkJCQkJaWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7CgoJCQkJCQlpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHsKCgkJCQkJCQlkaXJlY3Rpb25fZXEgPSB0cnVlOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoKCQkJCQkJaWYgKCBNYXRoLnNpZ24oIHZfcHJldl95ICkgPT09IE1hdGguc2lnbiggdl9uZXh0X3kgKSApIHsKCgkJCQkJCQlkaXJlY3Rpb25fZXEgPSB0cnVlOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggZGlyZWN0aW9uX2VxICkgewoKCQkJCQkvLyBjb25zb2xlLmxvZygiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2UiKTsKCQkJCQl2X3RyYW5zX3ggPSAtIHZfcHJldl95OwoJCQkJCXZfdHJhbnNfeSA9IHZfcHJldl94OwoJCQkJCXNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gY29uc29sZS5sb2coIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNwaWtlIik7CgkJCQkJdl90cmFuc194ID0gdl9wcmV2X3g7CgkJCQkJdl90cmFuc195ID0gdl9wcmV2X3k7CgkJCQkJc2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgLyAyICk7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApOwoKCQl9CgoKCQl2YXIgY29udG91ck1vdmVtZW50cyA9IFtdOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkgewoKCQkJaWYgKCBqID09PSBpbCApIGogPSAwOwoJCQlpZiAoIGsgPT09IGlsICkgayA9IDA7CgoJCQkvLyAgKGopLS0tKGkpLS0tKGspCgkJCS8vIGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKQoKCQkJY29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTsKCgkJfQoKCQl2YXIgaG9sZXNNb3ZlbWVudHMgPSBbXSwKCQkJb25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpOwoKCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKCgkJCWFob2xlID0gaG9sZXNbIGggXTsKCgkJCW9uZUhvbGVNb3ZlbWVudHMgPSBbXTsKCgkJCWZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7CgoJCQkJaWYgKCBqID09PSBpbCApIGogPSAwOwoJCQkJaWYgKCBrID09PSBpbCApIGsgPSAwOwoKCQkJCS8vICAoaiktLS0oaSktLS0oaykKCQkJCW9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7CgoJCQl9CgoJCQlob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7CgkJCXZlcnRpY2VzTW92ZW1lbnRzID0gdmVydGljZXNNb3ZlbWVudHMuY29uY2F0KCBvbmVIb2xlTW92ZW1lbnRzICk7CgoJCX0KCgoJCS8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFjawoKCQlmb3IgKCBiID0gMDsgYiA8IGJldmVsU2VnbWVudHM7IGIgKysgKSB7CgoJCQkvL2ZvciAoIGIgPSBiZXZlbFNlZ21lbnRzOyBiID4gMDsgYiAtLSApIHsKCgkJCXQgPSBiIC8gYmV2ZWxTZWdtZW50czsKCQkJeiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApOwoJCQlicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTsKCgkJCS8vIGNvbnRyYWN0IHNoYXBlCgoJCQlmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCXZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7CgoJCQkJdiggdmVydC54LCB2ZXJ0LnksIC0geiApOwoKCQkJfQoKCQkJLy8gZXhwYW5kIGhvbGVzCgoJCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKCgkJCQlhaG9sZSA9IGhvbGVzWyBoIF07CgkJCQlvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTsKCgkJCQlmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7CgoJCQkJCXYoIHZlcnQueCwgdmVydC55LCAtIHogKTsKCgkJCQl9CgoJCQl9CgoJCX0KCgkJYnMgPSBiZXZlbFNpemU7CgoJCS8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzCgoJCWZvciAoIGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHsKCgkJCXZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07CgoJCQlpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsKCgkJCQl2KCB2ZXJ0LngsIHZlcnQueSwgMCApOwoKCQkJfSBlbHNlIHsKCgkJCQkvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0ueCApOwoKCQkJCW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTsKCQkJCWJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7CgoJCQkJcG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApOwoKCQkJCXYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTsKCgkJCX0KCgkJfQoKCQkvLyBBZGQgc3RlcHBlZCB2ZXJ0aWNlcy4uLgoJCS8vIEluY2x1ZGluZyBmcm9udCBmYWNpbmcgdmVydGljZXMKCgkJdmFyIHM7CgoJCWZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkgewoKCQkJZm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkgewoKCQkJCXZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07CgoJCQkJaWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7CgoJCQkJCXYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgLyBzdGVwcyAqIHMgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQkvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7CgoJCQkJCW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTsKCQkJCQliaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApOwoKCQkJCQlwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7CgoJCQkJCXYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTsKCgkJCQl9CgoJCQl9CgoJCX0KCgoJCS8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXMKCgkJLy9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkgewoJCWZvciAoIGIgPSBiZXZlbFNlZ21lbnRzIC0gMTsgYiA+PSAwOyBiIC0tICkgewoKCQkJdCA9IGIgLyBiZXZlbFNlZ21lbnRzOwoJCQl6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7CgkJCWJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApOwoKCQkJLy8gY29udHJhY3Qgc2hhcGUKCgkJCWZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTsKCQkJCXYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7CgoJCQl9CgoJCQkvLyBleHBhbmQgaG9sZXMKCgkJCWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgewoKCQkJCWFob2xlID0gaG9sZXNbIGggXTsKCQkJCW9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdOwoKCQkJCWZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCQl2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTsKCgkJCQkJaWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7CgoJCQkJCQl2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50ICsgeiApOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS55LCBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS54ICsgeiApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfQoKCQl9CgoJCS8qIEZhY2VzICovCgoJCS8vIFRvcCBhbmQgYm90dG9tIGZhY2VzCgoJCWJ1aWxkTGlkRmFjZXMoKTsKCgkJLy8gU2lkZXMgZmFjZXMKCgkJYnVpbGRTaWRlRmFjZXMoKTsKCgoJCS8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnMKCgkJZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHsKCgkJCXZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMzsKCgkJCWlmICggYmV2ZWxFbmFibGVkICkgewoKCQkJCXZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMQoJCQkJdmFyIG9mZnNldCA9IHZsZW4gKiBsYXllcjsKCgkJCQkvLyBCb3R0b20gZmFjZXMKCgkJCQlmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7CgoJCQkJCWZhY2UgPSBmYWNlc1sgaSBdOwoJCQkJCWYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7CgoJCQkJfQoKCQkJCWxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjsKCQkJCW9mZnNldCA9IHZsZW4gKiBsYXllcjsKCgkJCQkvLyBUb3AgZmFjZXMKCgkJCQlmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7CgoJCQkJCWZhY2UgPSBmYWNlc1sgaSBdOwoJCQkJCWYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQkvLyBCb3R0b20gZmFjZXMKCgkJCQlmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7CgoJCQkJCWZhY2UgPSBmYWNlc1sgaSBdOwoJCQkJCWYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7CgoJCQkJfQoKCQkJCS8vIFRvcCBmYWNlcwoKCQkJCWZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHsKCgkJCQkJZmFjZSA9IGZhY2VzWyBpIF07CgkJCQkJZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTsKCgkJCQl9CgoJCQl9CgoJCQlzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCBvcHRpb25zLm1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1hdGVyaWFsIDogMCApOwoKCQl9CgoJCS8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlCgoJCWZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkgewoKCQkJdmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzOwoJCQl2YXIgbGF5ZXJvZmZzZXQgPSAwOwoJCQlzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7CgkJCWxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoOwoKCQkJZm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CgoJCQkJYWhvbGUgPSBob2xlc1sgaCBdOwoJCQkJc2lkZXdhbGxzKCBhaG9sZSwgbGF5ZXJvZmZzZXQgKTsKCgkJCQkvLywgdHJ1ZQoJCQkJbGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoOwoKCQkJfQoKCgkJCXNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIG9wdGlvbnMuZXh0cnVkZU1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4dHJ1ZGVNYXRlcmlhbCA6IDEgKTsKCgoJCX0KCgkJZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHsKCgkJCXZhciBqLCBrOwoJCQlpID0gY29udG91ci5sZW5ndGg7CgoJCQl3aGlsZSAoIC0tIGkgPj0gMCApIHsKCgkJCQlqID0gaTsKCQkJCWsgPSBpIC0gMTsKCQkJCWlmICggayA8IDAgKSBrID0gY29udG91ci5sZW5ndGggLSAxOwoKCQkJCS8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpOwoKCQkJCXZhciBzID0gMCwKCQkJCQlzbCA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7CgoJCQkJZm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHsKCgkJCQkJdmFyIHNsZW4xID0gdmxlbiAqIHM7CgkJCQkJdmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTsKCgkJCQkJdmFyIGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSwKCQkJCQkJYiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLAoJCQkJCQljID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsCgkJCQkJCWQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjsKCgkJCQkJZjQoIGEsIGIsIGMsIGQgKTsKCgkJCQl9CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gdiggeCwgeSwgeiApIHsKCgkJCXBsYWNlaG9sZGVyLnB1c2goIHggKTsKCQkJcGxhY2Vob2xkZXIucHVzaCggeSApOwoJCQlwbGFjZWhvbGRlci5wdXNoKCB6ICk7CgoJCX0KCgoJCWZ1bmN0aW9uIGYzKCBhLCBiLCBjICkgewoKCQkJYWRkVmVydGV4KCBhICk7CgkJCWFkZFZlcnRleCggYiApOwoJCQlhZGRWZXJ0ZXgoIGMgKTsKCgkJCXZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7CgkJCXZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVRvcFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApOwoKCQkJYWRkVVYoIHV2c1sgMCBdICk7CgkJCWFkZFVWKCB1dnNbIDEgXSApOwoJCQlhZGRVViggdXZzWyAyIF0gKTsKCgkJfQoKCQlmdW5jdGlvbiBmNCggYSwgYiwgYywgZCApIHsKCgkJCWFkZFZlcnRleCggYSApOwoJCQlhZGRWZXJ0ZXgoIGIgKTsKCQkJYWRkVmVydGV4KCBkICk7CgoJCQlhZGRWZXJ0ZXgoIGIgKTsKCQkJYWRkVmVydGV4KCBjICk7CgkJCWFkZFZlcnRleCggZCApOwoKCgkJCXZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7CgkJCXZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVNpZGVXYWxsVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSA2LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7CgoJCQlhZGRVViggdXZzWyAwIF0gKTsKCQkJYWRkVVYoIHV2c1sgMSBdICk7CgkJCWFkZFVWKCB1dnNbIDMgXSApOwoKCQkJYWRkVVYoIHV2c1sgMSBdICk7CgkJCWFkZFVWKCB1dnNbIDIgXSApOwoJCQlhZGRVViggdXZzWyAzIF0gKTsKCgkJfQoKCQlmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkgewoKCQkJaW5kaWNlc0FycmF5LnB1c2goIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyApOwoJCQl2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTsKCQkJdmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7CgkJCXZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApOwoKCQl9CgoKCQlmdW5jdGlvbiBhZGRVViggdmVjdG9yMiApIHsKCgkJCXV2QXJyYXkucHVzaCggdmVjdG9yMi54ICk7CgkJCXV2QXJyYXkucHVzaCggdmVjdG9yMi55ICk7CgoJCX0KCgkJaWYgKCAhIG9wdGlvbnMuYXJyYXlzICkgewoKCQkJdGhpcy5zZXRJbmRleCggaW5kaWNlc0FycmF5ICk7CgkJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7CgkJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7CgoJCX0KCgl9OwoKCUV4dHJ1ZGVHZW9tZXRyeS5Xb3JsZFVWR2VuZXJhdG9yID0gewoKCQlnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QyApIHsKCgkJCXZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdOwoJCQl2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07CgkJCXZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdOwoJCQl2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07CgkJCXZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdOwoJCQl2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07CgoJCQlyZXR1cm4gWwoJCQkJbmV3IFZlY3RvcjIoIGFfeCwgYV95ICksCgkJCQluZXcgVmVjdG9yMiggYl94LCBiX3kgKSwKCQkJCW5ldyBWZWN0b3IyKCBjX3gsIGNfeSApCgkJCV07CgoJCX0sCgoJCWdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMsIGluZGV4RCApIHsKCgkJCXZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdOwoJCQl2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07CgkJCXZhciBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTsKCQkJdmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07CgkJCXZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTsKCQkJdmFyIGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdOwoJCQl2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTsKCQkJdmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdOwoJCQl2YXIgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07CgkJCXZhciBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyBdOwoJCQl2YXIgZF95ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAxIF07CgkJCXZhciBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTsKCgkJCWlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHsKCgkJCQlyZXR1cm4gWwoJCQkJCW5ldyBWZWN0b3IyKCBhX3gsIDEgLSBhX3ogKSwKCQkJCQluZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksCgkJCQkJbmV3IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLAoJCQkJCW5ldyBWZWN0b3IyKCBkX3gsIDEgLSBkX3ogKQoJCQkJXTsKCgkJCX0gZWxzZSB7CgoJCQkJcmV0dXJuIFsKCQkJCQluZXcgVmVjdG9yMiggYV95LCAxIC0gYV96ICksCgkJCQkJbmV3IFZlY3RvcjIoIGJfeSwgMSAtIGJfeiApLAoJCQkJCW5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSwKCQkJCQluZXcgVmVjdG9yMiggZF95LCAxIC0gZF96ICkKCQkJCV07CgoJCQl9CgoJCX0KCX07CgoJLyoqCgkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICoKCSAqIFRleHQgPSAzRCBUZXh0CgkgKgoJICogcGFyYW1ldGVycyA9IHsKCSAqICBmb250OiA8VEhSRUUuRm9udD4sIC8vIGZvbnQKCSAqCgkgKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6ZSBvZiB0aGUgdGV4dAoJICogIGhlaWdodDogPGZsb2F0PiwgLy8gdGhpY2tuZXNzIHRvIGV4dHJ1ZGUgdGV4dAoJICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXMKCSAqCgkgKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWwKCSAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0ZXh0IGJldmVsIGdvZXMKCSAqICBiZXZlbFNpemU6IDxmbG9hdD4gLy8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSBpcyBiZXZlbAoJICogfQoJICovCgoJLy8gVGV4dEdlb21ldHJ5CgoJZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdUZXh0R2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXRleHQ6IHRleHQsCgkJCXBhcmFtZXRlcnM6IHBhcmFtZXRlcnMKCQl9OwoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCVRleHRHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVRleHRHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0R2VvbWV0cnk7CgoJLy8gVGV4dEJ1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkgewoKCQlwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTsKCgkJdmFyIGZvbnQgPSBwYXJhbWV0ZXJzLmZvbnQ7CgoJCWlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSApIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTsKCQkJcmV0dXJuIG5ldyBHZW9tZXRyeSgpOwoKCQl9CgoJCXZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUsIHBhcmFtZXRlcnMuY3VydmVTZWdtZW50cyApOwoKCQkvLyB0cmFuc2xhdGUgcGFyYW1ldGVycyB0byBFeHRydWRlR2VvbWV0cnkgQVBJCgoJCXBhcmFtZXRlcnMuYW1vdW50ID0gcGFyYW1ldGVycy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuaGVpZ2h0IDogNTA7CgoJCS8vIGRlZmF1bHRzCgoJCWlmICggcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEwOwoJCWlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODsKCQlpZiAoIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9IGZhbHNlOwoKCQlFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7CgoJCXRoaXMudHlwZSA9ICdUZXh0QnVmZmVyR2VvbWV0cnknOwoKCX0KCglUZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRCdWZmZXJHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMKCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBTcGhlcmVHZW9tZXRyeQoKCWZ1bmN0aW9uIFNwaGVyZUdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCgkJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnU3BoZXJlR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAoJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCgkJCXBoaVN0YXJ0OiBwaGlTdGFydCwKCQkJcGhpTGVuZ3RoOiBwaGlMZW5ndGgsCgkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCgkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CglTcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTsKCgkvLyBTcGhlcmVCdWZmZXJHZW9tZXRyeQoKCWZ1bmN0aW9uIFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAoJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCgkJCXBoaVN0YXJ0OiBwaGlTdGFydCwKCQkJcGhpTGVuZ3RoOiBwaGlMZW5ndGgsCgkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCgkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAoJCX07CgoJCXJhZGl1cyA9IHJhZGl1cyB8fCAxOwoKCQl3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7CgkJaGVpZ2h0U2VnbWVudHMgPSBNYXRoLm1heCggMiwgTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCA2ICk7CgoJCXBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDsKCQlwaGlMZW5ndGggPSBwaGlMZW5ndGggIT09IHVuZGVmaW5lZCA/IHBoaUxlbmd0aCA6IE1hdGguUEkgKiAyOwoKCQl0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7CgkJdGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJOwoKCQl2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7CgoJCXZhciBpeCwgaXk7CgoJCXZhciBpbmRleCA9IDA7CgkJdmFyIGdyaWQgPSBbXTsKCgkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CgoJCS8vIGJ1ZmZlcnMKCgkJdmFyIGluZGljZXMgPSBbXTsKCQl2YXIgdmVydGljZXMgPSBbXTsKCQl2YXIgbm9ybWFscyA9IFtdOwoJCXZhciB1dnMgPSBbXTsKCgkJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cwoKCQlmb3IgKCBpeSA9IDA7IGl5IDw9IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHsKCgkJCXZhciB2ZXJ0aWNlc1JvdyA9IFtdOwoKCQkJdmFyIHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzOwoKCQkJZm9yICggaXggPSAwOyBpeCA8PSB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHsKCgkJCQl2YXIgdSA9IGl4IC8gd2lkdGhTZWdtZW50czsKCgkJCQkvLyB2ZXJ0ZXgKCgkJCQl2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKCQkJCXZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKCQkJCXZlcnRleC56ID0gcmFkaXVzICogTWF0aC5zaW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKCgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQkJLy8gbm9ybWFsCgoJCQkJbm9ybWFsLnNldCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApLm5vcm1hbGl6ZSgpOwoJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgoJCQkJLy8gdXYKCgkJCQl1dnMucHVzaCggdSwgMSAtIHYgKTsKCgkJCQl2ZXJ0aWNlc1Jvdy5wdXNoKCBpbmRleCArKyApOwoKCQkJfQoKCQkJZ3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApOwoKCQl9CgoJCS8vIGluZGljZXMKCgkJZm9yICggaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHsKCgkJCWZvciAoIGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHsKCgkJCQl2YXIgYSA9IGdyaWRbIGl5IF1bIGl4ICsgMSBdOwoJCQkJdmFyIGIgPSBncmlkWyBpeSBdWyBpeCBdOwoJCQkJdmFyIGMgPSBncmlkWyBpeSArIDEgXVsgaXggXTsKCQkJCXZhciBkID0gZ3JpZFsgaXkgKyAxIF1bIGl4ICsgMSBdOwoKCQkJCWlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKCQkJCWlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTsKCgkJCX0KCgkJfQoKCQkvLyBidWlsZCBnZW9tZXRyeQoKCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOwoKCX0KCglTcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUJ1ZmZlckdlb21ldHJ5OwoKCS8qKgoJICogQGF1dGhvciBLYWxlYiBNdXJwaHkKCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBSaW5nR2VvbWV0cnkKCglmdW5jdGlvbiBSaW5nR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCWlubmVyUmFkaXVzOiBpbm5lclJhZGl1cywKCQkJb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLAoJCQl0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLAoJCQlwaGlTZWdtZW50czogcGhpU2VnbWVudHMsCgkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCgkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCVJpbmdHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCVJpbmdHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nR2VvbWV0cnk7CgoJLy8gUmluZ0J1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnUmluZ0J1ZmZlckdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsCgkJCW91dGVyUmFkaXVzOiBvdXRlclJhZGl1cywKCQkJdGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cywKCQkJcGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLAoJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAoJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKCQl9OwoKCQlpbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzIHx8IDAuNTsKCQlvdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIHx8IDE7CgoJCXRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDsKCQl0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyOwoKCQl0aGV0YVNlZ21lbnRzID0gdGhldGFTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKSA6IDg7CgkJcGhpU2VnbWVudHMgPSBwaGlTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDEsIHBoaVNlZ21lbnRzICkgOiAxOwoKCQkvLyBidWZmZXJzCgoJCXZhciBpbmRpY2VzID0gW107CgkJdmFyIHZlcnRpY2VzID0gW107CgkJdmFyIG5vcm1hbHMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCS8vIHNvbWUgaGVscGVyIHZhcmlhYmxlcwoKCQl2YXIgc2VnbWVudDsKCQl2YXIgcmFkaXVzID0gaW5uZXJSYWRpdXM7CgkJdmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTsKCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOwoJCXZhciBqLCBpOwoKCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgoJCWZvciAoIGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkgewoKCQkJZm9yICggaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHsKCgkJCQkvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhlIGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZQoKCQkJCXNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDsKCgkJCQkvLyB2ZXJ0ZXgKCgkJCQl2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7CgkJCQl2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7CgoJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCS8vIG5vcm1hbAoKCQkJCW5vcm1hbHMucHVzaCggMCwgMCwgMSApOwoKCQkJCS8vIHV2CgoJCQkJdXYueCA9ICggdmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7CgkJCQl1di55ID0gKCB2ZXJ0ZXgueSAvIG91dGVyUmFkaXVzICsgMSApIC8gMjsKCgkJCQl1dnMucHVzaCggdXYueCwgdXYueSApOwoKCQkJfQoKCQkJLy8gaW5jcmVhc2UgdGhlIHJhZGl1cyBmb3IgbmV4dCByb3cgb2YgdmVydGljZXMKCgkJCXJhZGl1cyArPSByYWRpdXNTdGVwOwoKCQl9CgoJCS8vIGluZGljZXMKCgkJZm9yICggaiA9IDA7IGogPCBwaGlTZWdtZW50czsgaiArKyApIHsKCgkJCXZhciB0aGV0YVNlZ21lbnRMZXZlbCA9IGogKiAoIHRoZXRhU2VnbWVudHMgKyAxICk7CgoJCQlmb3IgKCBpID0gMDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7CgoJCQkJc2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDsKCgkJCQl2YXIgYSA9IHNlZ21lbnQ7CgkJCQl2YXIgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTsKCQkJCXZhciBjID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAyOwoJCQkJdmFyIGQgPSBzZWdtZW50ICsgMTsKCgkJCQkvLyBmYWNlcwoKCQkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwoJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgoJCQl9CgoJCX0KCgkJLy8gYnVpbGQgZ2VvbWV0cnkKCgkJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwoJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCgl9CgoJUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdCdWZmZXJHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvCgkgKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKCSAqLwoKCS8vIExhdGhlR2VvbWV0cnkKCglmdW5jdGlvbiBMYXRoZUdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlwb2ludHM6IHBvaW50cywKCQkJc2VnbWVudHM6IHNlZ21lbnRzLAoJCQlwaGlTdGFydDogcGhpU3RhcnQsCgkJCXBoaUxlbmd0aDogcGhpTGVuZ3RoCgkJfTsKCgkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCUxhdGhlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVHZW9tZXRyeTsKCgkvLyBMYXRoZUJ1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHsKCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJcG9pbnRzOiBwb2ludHMsCgkJCXNlZ21lbnRzOiBzZWdtZW50cywKCQkJcGhpU3RhcnQ6IHBoaVN0YXJ0LAoJCQlwaGlMZW5ndGg6IHBoaUxlbmd0aAoJCX07CgoJCXNlZ21lbnRzID0gTWF0aC5mbG9vciggc2VnbWVudHMgKSB8fCAxMjsKCQlwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7CgkJcGhpTGVuZ3RoID0gcGhpTGVuZ3RoIHx8IE1hdGguUEkgKiAyOwoKCQkvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdCgoJCXBoaUxlbmd0aCA9IF9NYXRoLmNsYW1wKCBwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyICk7CgoKCQkvLyBidWZmZXJzCgoJCXZhciBpbmRpY2VzID0gW107CgkJdmFyIHZlcnRpY2VzID0gW107CgkJdmFyIHV2cyA9IFtdOwoKCQkvLyBoZWxwZXIgdmFyaWFibGVzCgoJCXZhciBiYXNlOwoJCXZhciBpbnZlcnNlU2VnbWVudHMgPSAxLjAgLyBzZWdtZW50czsKCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOwoJCXZhciBpLCBqOwoKCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzCgoJCWZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkgewoKCQkJdmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDsKCgkJCXZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7CgkJCXZhciBjb3MgPSBNYXRoLmNvcyggcGhpICk7CgoJCQlmb3IgKCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7CgoJCQkJLy8gdmVydGV4CgoJCQkJdmVydGV4LnggPSBwb2ludHNbIGogXS54ICogc2luOwoJCQkJdmVydGV4LnkgPSBwb2ludHNbIGogXS55OwoJCQkJdmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zOwoKCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCgkJCQkvLyB1dgoKCQkJCXV2LnggPSBpIC8gc2VnbWVudHM7CgkJCQl1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTsKCgkJCQl1dnMucHVzaCggdXYueCwgdXYueSApOwoKCgkJCX0KCgkJfQoKCQkvLyBpbmRpY2VzCgoJCWZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7CgoJCQlmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHsKCgkJCQliYXNlID0gaiArIGkgKiBwb2ludHMubGVuZ3RoOwoKCQkJCXZhciBhID0gYmFzZTsKCQkJCXZhciBiID0gYmFzZSArIHBvaW50cy5sZW5ndGg7CgkJCQl2YXIgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTsKCQkJCXZhciBkID0gYmFzZSArIDE7CgoJCQkJLy8gZmFjZXMKCgkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKCQkJCWluZGljZXMucHVzaCggYiwgYywgZCApOwoKCQkJfQoKCQl9CgoJCS8vIGJ1aWxkIGdlb21ldHJ5CgoJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgoJCS8vIGdlbmVyYXRlIG5vcm1hbHMKCgkJdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOwoKCQkvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uCgkJLy8gYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNlcyBhcmUgaWRlbnRpY2FsIChidXQgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgVVZzKS4KCgkJaWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkgewoKCQkJdmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OwoJCQl2YXIgbjEgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgbjIgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgbiA9IG5ldyBWZWN0b3IzKCk7CgoJCQkvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzCgoJCQliYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMzsKCgkJCWZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHsKCgkJCQkvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBmaXJzdCBsaW5lCgoJCQkJbjEueCA9IG5vcm1hbHNbIGogKyAwIF07CgkJCQluMS55ID0gbm9ybWFsc1sgaiArIDEgXTsKCQkJCW4xLnogPSBub3JtYWxzWyBqICsgMiBdOwoKCQkJCS8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZQoKCQkJCW4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTsKCQkJCW4yLnkgPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXTsKCQkJCW4yLnogPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXTsKCgkJCQkvLyBhdmVyYWdlIG5vcm1hbHMKCgkJCQluLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpOwoKCQkJCS8vIGFzc2lnbiB0aGUgbmV3IHZhbHVlcyB0byBib3RoIG5vcm1hbHMKCgkJCQlub3JtYWxzWyBqICsgMCBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF0gPSBuLng7CgkJCQlub3JtYWxzWyBqICsgMSBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF0gPSBuLnk7CgkJCQlub3JtYWxzWyBqICsgMiBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF0gPSBuLno7CgoJCQl9CgoJCX0KCgl9CgoJTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCUxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTsKCgkvKioKCSAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbQoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKCSAqLwoKCS8vIFNoYXBlR2VvbWV0cnkKCglmdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7CgoJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknOwoKCQlpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQkJY3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50czsKCgkJfQoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXNoYXBlczogc2hhcGVzLAoJCQljdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzCgkJfTsKCgkJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSApOwoJCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKCX0KCglTaGFwZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwoJU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUdlb21ldHJ5OwoKCVNoYXBlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIGRhdGEgPSBHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCgkJdmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7CgoJCXJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApOwoKCX07CgoJLy8gU2hhcGVCdWZmZXJHZW9tZXRyeQoKCWZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHsKCgkJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc7CgoJCXRoaXMucGFyYW1ldGVycyA9IHsKCQkJc2hhcGVzOiBzaGFwZXMsCgkJCWN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHMKCQl9OwoKCQljdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cyB8fCAxMjsKCgkJLy8gYnVmZmVycwoKCQl2YXIgaW5kaWNlcyA9IFtdOwoJCXZhciB2ZXJ0aWNlcyA9IFtdOwoJCXZhciBub3JtYWxzID0gW107CgkJdmFyIHV2cyA9IFtdOwoKCQkvLyBoZWxwZXIgdmFyaWFibGVzCgoJCXZhciBncm91cFN0YXJ0ID0gMDsKCQl2YXIgZ3JvdXBDb3VudCA9IDA7CgoJCS8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciAic2hhcGVzIiBwYXJhbWV0ZXIKCgkJaWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA9PT0gZmFsc2UgKSB7CgoJCQlhZGRTaGFwZSggc2hhcGVzICk7CgoJCX0gZWxzZSB7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkgewoKCQkJCWFkZFNoYXBlKCBzaGFwZXNbIGkgXSApOwoKCQkJCXRoaXMuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIGkgKTsgLy8gZW5hYmxlcyBNdWx0aU1hdGVyaWFsIHN1cHBvcnQKCgkJCQlncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CgkJCQlncm91cENvdW50ID0gMDsKCgkJCX0KCgkJfQoKCQkvLyBidWlsZCBnZW9tZXRyeQoKCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOwoKCgkJLy8gaGVscGVyIGZ1bmN0aW9ucwoKCQlmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7CgoJCQl2YXIgaSwgbCwgc2hhcGVIb2xlOwoKCQkJdmFyIGluZGV4T2Zmc2V0ID0gdmVydGljZXMubGVuZ3RoIC8gMzsKCQkJdmFyIHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTsKCgkJCXZhciBzaGFwZVZlcnRpY2VzID0gcG9pbnRzLnNoYXBlOwoJCQl2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlczsKCgkJCS8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlcwoKCQkJaWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkgewoKCQkJCXNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLnJldmVyc2UoKTsKCgkJCQkvLyBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uCgoJCQkJZm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCXNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTsKCgkJCQkJaWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHsKCgkJCQkJCXNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQl2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTsKCgkJCS8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5CgoJCQlmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQlzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07CgkJCQlzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5jb25jYXQoIHNoYXBlSG9sZSApOwoKCQkJfQoKCQkJLy8gdmVydGljZXMsIG5vcm1hbHMsIHV2cwoKCQkJZm9yICggaSA9IDAsIGwgPSBzaGFwZVZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTsKCgkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTsKCQkJCW5vcm1hbHMucHVzaCggMCwgMCwgMSApOwoJCQkJdXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnMKCgkJCX0KCgkJCS8vIGluY2lkZXMKCgkJCWZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgoJCQkJdmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDsKCQkJCXZhciBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7CgkJCQl2YXIgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0OwoKCQkJCWluZGljZXMucHVzaCggYSwgYiwgYyApOwoJCQkJZ3JvdXBDb3VudCArPSAzOwoKCQkJfQoKCQl9CgoJfQoKCVNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CglTaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlQnVmZmVyR2VvbWV0cnk7CgoJU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKCQl2YXIgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKCQl2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlczsKCgkJcmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7CgoJfTsKCgkvLwoKCWZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBkYXRhICkgewoKCQlkYXRhLnNoYXBlcyA9IFtdOwoKCQlpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkgewoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIHNoYXBlID0gc2hhcGVzWyBpIF07CgoJCQkJZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApOwoKCQkJfQoKCQl9IGVsc2UgewoKCQkJZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTsKCgkJfQoKCQlyZXR1cm4gZGF0YTsKCgl9CgoJLyoqCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCglmdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7CgoJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0VkZ2VzR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXRocmVzaG9sZEFuZ2xlOiB0aHJlc2hvbGRBbmdsZQoJCX07CgoJCXRocmVzaG9sZEFuZ2xlID0gKCB0aHJlc2hvbGRBbmdsZSAhPT0gdW5kZWZpbmVkICkgPyB0aHJlc2hvbGRBbmdsZSA6IDE7CgoJCS8vIGJ1ZmZlcgoKCQl2YXIgdmVydGljZXMgPSBbXTsKCgkJLy8gaGVscGVyIHZhcmlhYmxlcwoKCQl2YXIgdGhyZXNob2xkRG90ID0gTWF0aC5jb3MoIF9NYXRoLkRFRzJSQUQgKiB0aHJlc2hvbGRBbmdsZSApOwoJCXZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGVkZ2UxLCBlZGdlMjsKCQl2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07CgoJCS8vIHByZXBhcmUgc291cmNlIGdlb21ldHJ5CgoJCXZhciBnZW9tZXRyeTI7CgoJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCWdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpOwoJCQlnZW9tZXRyeTIuZnJvbUJ1ZmZlckdlb21ldHJ5KCBnZW9tZXRyeSApOwoKCQl9IGVsc2UgewoKCQkJZ2VvbWV0cnkyID0gZ2VvbWV0cnkuY2xvbmUoKTsKCgkJfQoKCQlnZW9tZXRyeTIubWVyZ2VWZXJ0aWNlcygpOwoJCWdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTsKCgkJdmFyIHNvdXJjZVZlcnRpY2VzID0gZ2VvbWV0cnkyLnZlcnRpY2VzOwoJCXZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlczsKCgkJLy8gbm93IGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhbiBlZGdlIHdpdGggaXRzIGFkam9pbmluZyBmYWNlcwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOwoKCQkJZm9yICggdmFyIGogPSAwOyBqIDwgMzsgaiArKyApIHsKCgkJCQllZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdOwoJCQkJZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTsKCQkJCWVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsKCQkJCWVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTsKCgkJCQlrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07CgoJCQkJaWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07CgoJCQkJfSBlbHNlIHsKCgkJCQkJZWRnZXNbIGtleSBdLmZhY2UyID0gaTsKCgkJCQl9CgoJCQl9CgoJCX0KCgkJLy8gZ2VuZXJhdGUgdmVydGljZXMKCgkJZm9yICgga2V5IGluIGVkZ2VzICkgewoKCQkJdmFyIGUgPSBlZGdlc1sga2V5IF07CgoJCQkvLyBhbiBlZGdlIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBiZXR3ZWVuIHRoZSBmYWNlIG5vcm1hbHMgb2YgdGhlIGFkam9pbmluZyBmYWNlcyBleGNlZWRzIHRoaXMgdmFsdWUuIGRlZmF1bHQgPSAxIGRlZ3JlZS4KCgkJCWlmICggZS5mYWNlMiA9PT0gdW5kZWZpbmVkIHx8IGZhY2VzWyBlLmZhY2UxIF0ubm9ybWFsLmRvdCggZmFjZXNbIGUuZmFjZTIgXS5ub3JtYWwgKSA8PSB0aHJlc2hvbGREb3QgKSB7CgoJCQkJdmFyIHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MSBdOwoJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCXZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdOwoJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJfQoKCQl9CgoJCS8vIGJ1aWxkIGdlb21ldHJ5CgoJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoKCX0KCglFZGdlc0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFZGdlc0dlb21ldHJ5OwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCgkvLyBDeWxpbmRlckdlb21ldHJ5CgoJZnVuY3Rpb24gQ3lsaW5kZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgewoKCQlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXNUb3A6IHJhZGl1c1RvcCwKCQkJcmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sCgkJCWhlaWdodDogaGVpZ2h0LAoJCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCgkJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKCQkJb3BlbkVuZGVkOiBvcGVuRW5kZWQsCgkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCgkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAoJCX07CgoJCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTsKCQl0aGlzLm1lcmdlVmVydGljZXMoKTsKCgl9CgoJQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKCUN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJHZW9tZXRyeTsKCgkvLyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5CgoJZnVuY3Rpb24gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgewoKCQlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXNUb3A6IHJhZGl1c1RvcCwKCQkJcmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sCgkJCWhlaWdodDogaGVpZ2h0LAoJCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCgkJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKCQkJb3BlbkVuZGVkOiBvcGVuRW5kZWQsCgkJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCgkJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAoJCX07CgoJCXZhciBzY29wZSA9IHRoaXM7CgoJCXJhZGl1c1RvcCA9IHJhZGl1c1RvcCAhPT0gdW5kZWZpbmVkID8gcmFkaXVzVG9wIDogMTsKCQlyYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDE7CgkJaGVpZ2h0ID0gaGVpZ2h0IHx8IDE7CgoJCXJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4OwoJCWhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxOwoKCQlvcGVuRW5kZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlOwoJCXRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMC4wOwoJCXRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7CgoJCS8vIGJ1ZmZlcnMKCgkJdmFyIGluZGljZXMgPSBbXTsKCQl2YXIgdmVydGljZXMgPSBbXTsKCQl2YXIgbm9ybWFscyA9IFtdOwoJCXZhciB1dnMgPSBbXTsKCgkJLy8gaGVscGVyIHZhcmlhYmxlcwoKCQl2YXIgaW5kZXggPSAwOwoJCXZhciBpbmRleEFycmF5ID0gW107CgkJdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyOwoJCXZhciBncm91cFN0YXJ0ID0gMDsKCgkJLy8gZ2VuZXJhdGUgZ2VvbWV0cnkKCgkJZ2VuZXJhdGVUb3JzbygpOwoKCQlpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7CgoJCQlpZiAoIHJhZGl1c1RvcCA+IDAgKSBnZW5lcmF0ZUNhcCggdHJ1ZSApOwoJCQlpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTsKCgkJfQoKCQkvLyBidWlsZCBnZW9tZXRyeQoKCQl0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7CgkJdGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApOwoKCQlmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkgewoKCQkJdmFyIHgsIHk7CgkJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKCgkJCXZhciBncm91cENvdW50ID0gMDsKCgkJCS8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsCgkJCXZhciBzbG9wZSA9ICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgLyBoZWlnaHQ7CgoJCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgoJCQlmb3IgKCB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSArKyApIHsKCgkJCQl2YXIgaW5kZXhSb3cgPSBbXTsKCgkJCQl2YXIgdiA9IHkgLyBoZWlnaHRTZWdtZW50czsKCgkJCQkvLyBjYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgY3VycmVudCByb3cKCgkJCQl2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7CgoJCQkJZm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7CgoJCQkJCXZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzOwoKCQkJCQl2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0OwoKCQkJCQl2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTsKCQkJCQl2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTsKCgkJCQkJLy8gdmVydGV4CgoJCQkJCXZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7CgkJCQkJdmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0OwoJCQkJCXZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7CgkJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCQkvLyBub3JtYWwKCgkJCQkJbm9ybWFsLnNldCggc2luVGhldGEsIHNsb3BlLCBjb3NUaGV0YSApLm5vcm1hbGl6ZSgpOwoJCQkJCW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOwoKCQkJCQkvLyB1dgoKCQkJCQl1dnMucHVzaCggdSwgMSAtIHYgKTsKCgkJCQkJLy8gc2F2ZSBpbmRleCBvZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3cKCgkJCQkJaW5kZXhSb3cucHVzaCggaW5kZXggKysgKTsKCgkJCQl9CgoJCQkJLy8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXkKCgkJCQlpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7CgoJCQl9CgoJCQkvLyBnZW5lcmF0ZSBpbmRpY2VzCgoJCQlmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkgewoKCQkJCWZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7CgoJCQkJCS8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXMKCgkJCQkJdmFyIGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTsKCQkJCQl2YXIgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggXTsKCQkJCQl2YXIgYyA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggKyAxIF07CgkJCQkJdmFyIGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07CgoJCQkJCS8vIGZhY2VzCgoJCQkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwoJCQkJCWluZGljZXMucHVzaCggYiwgYywgZCApOwoKCQkJCQkvLyB1cGRhdGUgZ3JvdXAgY291bnRlcgoKCQkJCQlncm91cENvdW50ICs9IDY7CgoJCQkJfQoKCQkJfQoKCQkJLy8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnQKCgkJCXNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCAwICk7CgoJCQkvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHMKCgkJCWdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDsKCgkJfQoKCQlmdW5jdGlvbiBnZW5lcmF0ZUNhcCggdG9wICkgewoKCQkJdmFyIHgsIGNlbnRlckluZGV4U3RhcnQsIGNlbnRlckluZGV4RW5kOwoKCQkJdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKCQkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgoJCQl2YXIgZ3JvdXBDb3VudCA9IDA7CgoJCQl2YXIgcmFkaXVzID0gKCB0b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTsKCQkJdmFyIHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTsKCgkJCS8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4CgkJCWNlbnRlckluZGV4U3RhcnQgPSBpbmRleDsKCgkJCS8vIGZpcnN0IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC4KCQkJLy8gYmVjYXVzZSB0aGUgZ2VvbWV0cnkgbmVlZHMgb25lIHNldCBvZiB1dnMgcGVyIGZhY2UsCgkJCS8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnQKCgkJCWZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkgewoKCQkJCS8vIHZlcnRleAoKCQkJCXZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7CgoJCQkJLy8gbm9ybWFsCgoJCQkJbm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7CgoJCQkJLy8gdXYKCgkJCQl1dnMucHVzaCggMC41LCAwLjUgKTsKCgkJCQkvLyBpbmNyZWFzZSBpbmRleAoKCQkJCWluZGV4ICsrOwoKCQkJfQoKCQkJLy8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleAoKCQkJY2VudGVySW5kZXhFbmQgPSBpbmRleDsKCgkJCS8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cwoKCQkJZm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7CgoJCQkJdmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7CgkJCQl2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0OwoKCQkJCXZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApOwoJCQkJdmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7CgoJCQkJLy8gdmVydGV4CgoJCQkJdmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTsKCQkJCXZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247CgkJCQl2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhOwoJCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCS8vIG5vcm1hbAoKCQkJCW5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApOwoKCQkJCS8vIHV2CgoJCQkJdXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTsKCQkJCXV2LnkgPSAoIHNpblRoZXRhICogMC41ICogc2lnbiApICsgMC41OwoJCQkJdXZzLnB1c2goIHV2LngsIHV2LnkgKTsKCgkJCQkvLyBpbmNyZWFzZSBpbmRleAoKCQkJCWluZGV4ICsrOwoKCQkJfQoKCQkJLy8gZ2VuZXJhdGUgaW5kaWNlcwoKCQkJZm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHsKCgkJCQl2YXIgYyA9IGNlbnRlckluZGV4U3RhcnQgKyB4OwoJCQkJdmFyIGkgPSBjZW50ZXJJbmRleEVuZCArIHg7CgoJCQkJaWYgKCB0b3AgPT09IHRydWUgKSB7CgoJCQkJCS8vIGZhY2UgdG9wCgoJCQkJCWluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQkvLyBmYWNlIGJvdHRvbQoKCQkJCQlpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7CgoJCQkJfQoKCQkJCWdyb3VwQ291bnQgKz0gMzsKCgkJCX0KCgkJCS8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0CgoJCQlzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTsKCgkJCS8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3VwcwoKCQkJZ3JvdXBTdGFydCArPSBncm91cENvdW50OwoKCQl9CgoJfQoKCUN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CglDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyQnVmZmVyR2VvbWV0cnk7CgoJLyoqCgkgKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uCgkgKi8KCgkvLyBDb25lR2VvbWV0cnkKCglmdW5jdGlvbiBDb25lR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgoJCUN5bGluZGVyR2VvbWV0cnkuY2FsbCggdGhpcywgMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApOwoKCQl0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJaGVpZ2h0OiBoZWlnaHQsCgkJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKCQkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAoJCQlvcGVuRW5kZWQ6IG9wZW5FbmRlZCwKCQkJdGhldGFTdGFydDogdGhldGFTdGFydCwKCQkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCgkJfTsKCgl9CgoJQ29uZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlICk7CglDb25lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUdlb21ldHJ5OwoKCS8vIENvbmVCdWZmZXJHZW9tZXRyeQoKCWZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCgkJQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7CgoJCXRoaXMudHlwZSA9ICdDb25lQnVmZmVyR2VvbWV0cnknOwoKCQl0aGlzLnBhcmFtZXRlcnMgPSB7CgkJCXJhZGl1czogcmFkaXVzLAoJCQloZWlnaHQ6IGhlaWdodCwKCQkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAoJCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCgkJCW9wZW5FbmRlZDogb3BlbkVuZGVkLAoJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAoJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKCQl9OwoKCX0KCglDb25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKCUNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lQnVmZmVyR2VvbWV0cnk7CgoJLyoqCgkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMKCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKiBAYXV0aG9yIGh1Z2hlcwoJICovCgoJLy8gQ2lyY2xlR2VvbWV0cnkKCglmdW5jdGlvbiBDaXJjbGVHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgoJCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJc2VnbWVudHM6IHNlZ21lbnRzLAoJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAoJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKCQl9OwoKCQl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7CgkJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgoJfQoKCUNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwoJQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlR2VvbWV0cnk7CgoJLy8gQ2lyY2xlQnVmZmVyR2VvbWV0cnkKCglmdW5jdGlvbiBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgoJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzsKCgkJdGhpcy5wYXJhbWV0ZXJzID0gewoJCQlyYWRpdXM6IHJhZGl1cywKCQkJc2VnbWVudHM6IHNlZ21lbnRzLAoJCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAoJCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKCQl9OwoKCQlyYWRpdXMgPSByYWRpdXMgfHwgMTsKCQlzZWdtZW50cyA9IHNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgc2VnbWVudHMgKSA6IDg7CgoJCXRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDsKCQl0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyOwoKCQkvLyBidWZmZXJzCgoJCXZhciBpbmRpY2VzID0gW107CgkJdmFyIHZlcnRpY2VzID0gW107CgkJdmFyIG5vcm1hbHMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCS8vIGhlbHBlciB2YXJpYWJsZXMKCgkJdmFyIGksIHM7CgkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKCgkJLy8gY2VudGVyIHBvaW50CgoJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKCQlub3JtYWxzLnB1c2goIDAsIDAsIDEgKTsKCQl1dnMucHVzaCggMC41LCAwLjUgKTsKCgkJZm9yICggcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7CgoJCQl2YXIgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDsKCgkJCS8vIHZlcnRleAoKCQkJdmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApOwoJCQl2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7CgoJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgoJCQkvLyBub3JtYWwKCgkJCW5vcm1hbHMucHVzaCggMCwgMCwgMSApOwoKCQkJLy8gdXZzCgoJCQl1di54ID0gKCB2ZXJ0aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjsKCQkJdXYueSA9ICggdmVydGljZXNbIGkgKyAxIF0gLyByYWRpdXMgKyAxICkgLyAyOwoKCQkJdXZzLnB1c2goIHV2LngsIHV2LnkgKTsKCgkJfQoKCQkvLyBpbmRpY2VzCgoJCWZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkgewoKCQkJaW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgMCApOwoKCQl9CgoJCS8vIGJ1aWxkIGdlb21ldHJ5CgoJCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgoJfQoKCUNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwoJQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7CgoKCgl2YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUoewoJCVdpcmVmcmFtZUdlb21ldHJ5OiBXaXJlZnJhbWVHZW9tZXRyeSwKCQlQYXJhbWV0cmljR2VvbWV0cnk6IFBhcmFtZXRyaWNHZW9tZXRyeSwKCQlQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwKCQlUZXRyYWhlZHJvbkdlb21ldHJ5OiBUZXRyYWhlZHJvbkdlb21ldHJ5LAoJCVRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnksCgkJT2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksCgkJT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksCgkJSWNvc2FoZWRyb25HZW9tZXRyeTogSWNvc2FoZWRyb25HZW9tZXRyeSwKCQlJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAoJCURvZGVjYWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSwKCQlEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTogRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksCgkJUG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksCgkJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksCgkJVHViZUdlb21ldHJ5OiBUdWJlR2VvbWV0cnksCgkJVHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksCgkJVG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LAoJCVRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSwKCQlUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LAoJCVRvcnVzQnVmZmVyR2VvbWV0cnk6IFRvcnVzQnVmZmVyR2VvbWV0cnksCgkJVGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnksCgkJVGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksCgkJU3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LAoJCVNwaGVyZUJ1ZmZlckdlb21ldHJ5OiBTcGhlcmVCdWZmZXJHZW9tZXRyeSwKCQlSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSwKCQlSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdCdWZmZXJHZW9tZXRyeSwKCQlQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LAoJCVBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksCgkJTGF0aGVHZW9tZXRyeTogTGF0aGVHZW9tZXRyeSwKCQlMYXRoZUJ1ZmZlckdlb21ldHJ5OiBMYXRoZUJ1ZmZlckdlb21ldHJ5LAoJCVNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksCgkJU2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVCdWZmZXJHZW9tZXRyeSwKCQlFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSwKCQlFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwKCQlFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LAoJCUNvbmVHZW9tZXRyeTogQ29uZUdlb21ldHJ5LAoJCUNvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LAoJCUN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksCgkJQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTogQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSwKCQlDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksCgkJQ2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNsZUJ1ZmZlckdlb21ldHJ5LAoJCUJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSwKCQlCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnkKCX0pOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICogIGNvbG9yOiA8VEhSRUUuQ29sb3I+LAoJICogIG9wYWNpdHk6IDxmbG9hdD4KCSAqIH0KCSAqLwoKCWZ1bmN0aW9uIFNoYWRvd01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKCQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdTaGFkb3dNYXRlcmlhbCc7CgoJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CgkJdGhpcy5vcGFjaXR5ID0gMS4wOwoKCQl0aGlzLmxpZ2h0cyA9IHRydWU7CgkJdGhpcy50cmFuc3BhcmVudCA9IHRydWU7CgoJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgoJfQoKCVNoYWRvd01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwoJU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZG93TWF0ZXJpYWw7CgoJU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKCQlTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7CgoJCXRoaXMudHlwZSA9ICdSYXdTaGFkZXJNYXRlcmlhbCc7CgoJfQoKCVJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSApOwoJUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7CgoJUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPSB0cnVlOwoKCS8qKgoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKgoJICogcGFyYW1ldGVycyA9IHsKCSAqICBjb2xvcjogPGhleD4sCgkgKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LAoJICogIG1ldGFsbmVzczogPGZsb2F0PiwKCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAoJICoKCSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKgoJICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKgoJICogIGVtaXNzaXZlOiA8aGV4PiwKCSAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PgoJICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICoKCSAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGJ1bXBTY2FsZTogPGZsb2F0PiwKCSAqCgkgKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sCgkgKgoJICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKCSAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAoJICoKCSAqICByb3VnaG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIG1ldGFsbmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSwKCSAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD4KCSAqCgkgKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LAoJICoKCSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKCSAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sCgkgKgoJICogIHNraW5uaW5nOiA8Ym9vbD4sCgkgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCgkgKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4KCSAqIH0KCSAqLwoKCWZ1bmN0aW9uIE1lc2hTdGFuZGFyZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKCQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgoJCXRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTsKCgkJdGhpcy50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJzsKCgkJdGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZQoJCXRoaXMucm91Z2huZXNzID0gMC41OwoJCXRoaXMubWV0YWxuZXNzID0gMC41OwoKCQl0aGlzLm1hcCA9IG51bGw7CgoJCXRoaXMubGlnaHRNYXAgPSBudWxsOwoJCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7CgoJCXRoaXMuYW9NYXAgPSBudWxsOwoJCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7CgoJCXRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7CgkJdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDsKCQl0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDsKCgkJdGhpcy5idW1wTWFwID0gbnVsbDsKCQl0aGlzLmJ1bXBTY2FsZSA9IDE7CgoJCXRoaXMubm9ybWFsTWFwID0gbnVsbDsKCQl0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKCgkJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwoJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwoJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CgoJCXRoaXMucm91Z2huZXNzTWFwID0gbnVsbDsKCgkJdGhpcy5tZXRhbG5lc3NNYXAgPSBudWxsOwoKCQl0aGlzLmFscGhhTWFwID0gbnVsbDsKCgkJdGhpcy5lbnZNYXAgPSBudWxsOwoJCXRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wOwoKCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CgoJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CgkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwoJCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CgkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CgoJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwoJCXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CgoJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgoJfQoKCU1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwoJTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7CgoJTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlOwoKCU1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQl0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07CgoJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CgkJdGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzOwoJCXRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzczsKCgkJdGhpcy5tYXAgPSBzb3VyY2UubWFwOwoKCQl0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwoJCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7CgoJCXRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CgkJdGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTsKCgkJdGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTsKCQl0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwOwoJCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7CgoJCXRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwOwoJCXRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsKCgkJdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOwoJCXRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7CgoJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKCQl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwoJCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOwoKCQl0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3VnaG5lc3NNYXA7CgoJCXRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDsKCgkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCgkJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwoJCXRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0eTsKCgkJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvOwoKCQl0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7CgkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOwoJCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwOwoJCXRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47CgoJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CgkJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwoJCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICoKCSAqIHBhcmFtZXRlcnMgPSB7CgkgKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+CgkgKiB9CgkgKi8KCglmdW5jdGlvbiBNZXNoUGh5c2ljYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCgkJTWVzaFN0YW5kYXJkTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKCQl0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07CgoJCXRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7CgoJCXRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNAoKCQl0aGlzLmNsZWFyQ29hdCA9IDAuMDsKCQl0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IDAuMDsKCgkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCgl9CgoJTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7CglNZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDsKCglNZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7CgoJTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTsKCgkJdGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5OwoKCQl0aGlzLmNsZWFyQ29hdCA9IHNvdXJjZS5jbGVhckNvYXQ7CgkJdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJDb2F0Um91Z2huZXNzOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKgoJICogcGFyYW1ldGVycyA9IHsKCSAqICBjb2xvcjogPGhleD4sCgkgKiAgc3BlY3VsYXI6IDxoZXg+LAoJICogIHNoaW5pbmVzczogPGZsb2F0PiwKCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAoJICoKCSAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKgoJICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKgoJICogIGVtaXNzaXZlOiA8aGV4PiwKCSAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PgoJICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICoKCSAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGJ1bXBTY2FsZTogPGZsb2F0PiwKCSAqCgkgKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sCgkgKgoJICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKCSAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAoJICoKCSAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSwKCSAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSwKCSAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sCgkgKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LAoJICoKCSAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKCSAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sCgkgKgoJICogIHNraW5uaW5nOiA8Ym9vbD4sCgkgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCgkgKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4KCSAqIH0KCSAqLwoKCWZ1bmN0aW9uIE1lc2hQaG9uZ01hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKCQlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7CgoJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2UKCQl0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApOwoJCXRoaXMuc2hpbmluZXNzID0gMzA7CgoJCXRoaXMubWFwID0gbnVsbDsKCgkJdGhpcy5saWdodE1hcCA9IG51bGw7CgkJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDsKCgkJdGhpcy5hb01hcCA9IG51bGw7CgkJdGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDsKCgkJdGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTsKCQl0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wOwoJCXRoaXMuZW1pc3NpdmVNYXAgPSBudWxsOwoKCQl0aGlzLmJ1bXBNYXAgPSBudWxsOwoJCXRoaXMuYnVtcFNjYWxlID0gMTsKCgkJdGhpcy5ub3JtYWxNYXAgPSBudWxsOwoJCXRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApOwoKCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CgkJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CgkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKCgkJdGhpcy5zcGVjdWxhck1hcCA9IG51bGw7CgoJCXRoaXMuYWxwaGFNYXAgPSBudWxsOwoKCQl0aGlzLmVudk1hcCA9IG51bGw7CgkJdGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247CgkJdGhpcy5yZWZsZWN0aXZpdHkgPSAxOwoJCXRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODsKCgkJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CgkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKCQl0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJzsKCgkJdGhpcy5za2lubmluZyA9IGZhbHNlOwoJCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CgkJdGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsKCgkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCgl9CgoJTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CglNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhvbmdNYXRlcmlhbDsKCglNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7CgoJTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CgkJdGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTsKCQl0aGlzLnNoaW5pbmVzcyA9IHNvdXJjZS5zaGluaW5lc3M7CgoJCXRoaXMubWFwID0gc291cmNlLm1hcDsKCgkJdGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDsKCQl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OwoKCQl0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOwoJCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CgoJCXRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7CgkJdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDsKCQl0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5OwoKCQl0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKCQl0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7CgoJCXRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDsKCQl0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApOwoKCQl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7CgkJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKCQl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKCgkJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKCgkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCgkJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwoJCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwoJCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CgoJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CgkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKCgkJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgkJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3gKCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApCgkgKiB9CgkgKi8KCglmdW5jdGlvbiBNZXNoVG9vbk1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKCQlNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgoJCXRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9OwoKCQl0aGlzLnR5cGUgPSAnTWVzaFRvb25NYXRlcmlhbCc7CgoJCXRoaXMuZ3JhZGllbnRNYXAgPSBudWxsOwoKCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKCX0KCglNZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSApOwoJTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoVG9vbk1hdGVyaWFsOwoKCU1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7CgoJTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKCQlNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJdGhpcy5ncmFkaWVudE1hcCA9IHNvdXJjZS5ncmFkaWVudE1hcDsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICogIG9wYWNpdHk6IDxmbG9hdD4sCgkgKgoJICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LAoJICoKCSAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPiwKCSAqCgkgKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LAoJICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sCgkgKgoJICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAoJICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PgoJICoKCSAqICBza2lubmluZzogPGJvb2w+LAoJICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAoJICogIG1vcnBoTm9ybWFsczogPGJvb2w+CgkgKiB9CgkgKi8KCglmdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7CgoJCXRoaXMuYnVtcE1hcCA9IG51bGw7CgkJdGhpcy5idW1wU2NhbGUgPSAxOwoKCQl0aGlzLm5vcm1hbE1hcCA9IG51bGw7CgkJdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7CgoJCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDsKCQl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTsKCQl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwoKCQl0aGlzLndpcmVmcmFtZSA9IGZhbHNlOwoJCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKCgkJdGhpcy5mb2cgPSBmYWxzZTsKCQl0aGlzLmxpZ2h0cyA9IGZhbHNlOwoKCQl0aGlzLnNraW5uaW5nID0gZmFsc2U7CgkJdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsKCQl0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOwoKCQl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKCX0KCglNZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CglNZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaE5vcm1hbE1hdGVyaWFsOwoKCU1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgPSB0cnVlOwoKCU1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKCQlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJdGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7CgkJdGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOwoKCQl0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7CgkJdGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTsKCgkJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwoJCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CgkJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CgoJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgoJCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CgkJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwoJCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICoKCSAqIHBhcmFtZXRlcnMgPSB7CgkgKiAgY29sb3I6IDxoZXg+LAoJICogIG9wYWNpdHk6IDxmbG9hdD4sCgkgKgoJICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD4KCSAqCgkgKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD4KCSAqCgkgKiAgZW1pc3NpdmU6IDxoZXg+LAoJICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+CgkgKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCgkgKgoJICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAoJICoKCSAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKCSAqCgkgKiAgZW52TWFwOiBuZXcgVEhSRUUuVGV4dHVyZUN1YmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLAoJICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LAoJICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKCSAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sCgkgKgoJICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAoJICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PiwKCSAqCgkgKiAgc2tpbm5pbmc6IDxib29sPiwKCSAqICBtb3JwaFRhcmdldHM6IDxib29sPiwKCSAqICBtb3JwaE5vcm1hbHM6IDxib29sPgoJICogfQoJICovCgoJZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCgkJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTWVzaExhbWJlcnRNYXRlcmlhbCc7CgoJCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2UKCgkJdGhpcy5tYXAgPSBudWxsOwoKCQl0aGlzLmxpZ2h0TWFwID0gbnVsbDsKCQl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wOwoKCQl0aGlzLmFvTWFwID0gbnVsbDsKCQl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wOwoKCQl0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApOwoJCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7CgkJdGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7CgoJCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOwoKCQl0aGlzLmFscGhhTWFwID0gbnVsbDsKCgkJdGhpcy5lbnZNYXAgPSBudWxsOwoJCXRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uOwoJCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CgoJCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CgkJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwoJCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CgkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CgoJCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwoJCXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CgoJCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgoJfQoKCU1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CglNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hMYW1iZXJ0TWF0ZXJpYWw7CgoJTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTsKCglNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKCQl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CgoJCXRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7CgkJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTsKCgkJdGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDsKCQl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OwoKCQl0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApOwoJCXRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7CgkJdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsKCgkJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKCgkJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCgkJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwoJCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwoJCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKCQl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CgoJCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKCQl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgkJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CgkJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKCgkJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKCQl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgkJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqCgkgKiBwYXJhbWV0ZXJzID0gewoJICogIGNvbG9yOiA8aGV4PiwKCSAqICBvcGFjaXR5OiA8ZmxvYXQ+LAoJICoKCSAqICBsaW5ld2lkdGg6IDxmbG9hdD4sCgkgKgoJICogIHNjYWxlOiA8ZmxvYXQ+LAoJICogIGRhc2hTaXplOiA8ZmxvYXQ+LAoJICogIGdhcFNpemU6IDxmbG9hdD4KCSAqIH0KCSAqLwoKCWZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCgkJTGluZUJhc2ljTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTGluZURhc2hlZE1hdGVyaWFsJzsKCgkJdGhpcy5zY2FsZSA9IDE7CgkJdGhpcy5kYXNoU2l6ZSA9IDM7CgkJdGhpcy5nYXBTaXplID0gMTsKCgkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCgl9CgoJTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSApOwoJTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDsKCglMaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZURhc2hlZE1hdGVyaWFsID0gdHJ1ZTsKCglMaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7CgkJdGhpcy5kYXNoU2l6ZSA9IHNvdXJjZS5kYXNoU2l6ZTsKCQl0aGlzLmdhcFNpemUgPSBzb3VyY2UuZ2FwU2l6ZTsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCgoKCXZhciBNYXRlcmlhbHMgPSBPYmplY3QuZnJlZXplKHsKCQlTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsCgkJU3ByaXRlTWF0ZXJpYWw6IFNwcml0ZU1hdGVyaWFsLAoJCVJhd1NoYWRlck1hdGVyaWFsOiBSYXdTaGFkZXJNYXRlcmlhbCwKCQlTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsCgkJUG9pbnRzTWF0ZXJpYWw6IFBvaW50c01hdGVyaWFsLAoJCU1lc2hQaHlzaWNhbE1hdGVyaWFsOiBNZXNoUGh5c2ljYWxNYXRlcmlhbCwKCQlNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsCgkJTWVzaFBob25nTWF0ZXJpYWw6IE1lc2hQaG9uZ01hdGVyaWFsLAoJCU1lc2hUb29uTWF0ZXJpYWw6IE1lc2hUb29uTWF0ZXJpYWwsCgkJTWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsCgkJTWVzaExhbWJlcnRNYXRlcmlhbDogTWVzaExhbWJlcnRNYXRlcmlhbCwKCQlNZXNoRGVwdGhNYXRlcmlhbDogTWVzaERlcHRoTWF0ZXJpYWwsCgkJTWVzaERpc3RhbmNlTWF0ZXJpYWw6IE1lc2hEaXN0YW5jZU1hdGVyaWFsLAoJCU1lc2hCYXNpY01hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCwKCQlMaW5lRGFzaGVkTWF0ZXJpYWw6IExpbmVEYXNoZWRNYXRlcmlhbCwKCQlMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsCgkJTWF0ZXJpYWw6IE1hdGVyaWFsCgl9KTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCgl2YXIgQ2FjaGUgPSB7CgoJCWVuYWJsZWQ6IGZhbHNlLAoKCQlmaWxlczoge30sCgoJCWFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7CgoJCQlpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQkvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7CgoJCQl0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7CgoJCX0sCgoJCWdldDogZnVuY3Rpb24gKCBrZXkgKSB7CgoJCQlpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQkvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0NoZWNraW5nIGtleTonLCBrZXkgKTsKCgkJCXJldHVybiB0aGlzLmZpbGVzWyBrZXkgXTsKCgkJfSwKCgkJcmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHsKCgkJCWRlbGV0ZSB0aGlzLmZpbGVzWyBrZXkgXTsKCgkJfSwKCgkJY2xlYXI6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuZmlsZXMgPSB7fTsKCgkJfQoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gTG9hZGluZ01hbmFnZXIoIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCgkJdmFyIHNjb3BlID0gdGhpczsKCgkJdmFyIGlzTG9hZGluZyA9IGZhbHNlOwoJCXZhciBpdGVtc0xvYWRlZCA9IDA7CgkJdmFyIGl0ZW1zVG90YWwgPSAwOwoJCXZhciB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDsKCgkJdGhpcy5vblN0YXJ0ID0gdW5kZWZpbmVkOwoJCXRoaXMub25Mb2FkID0gb25Mb2FkOwoJCXRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3M7CgkJdGhpcy5vbkVycm9yID0gb25FcnJvcjsKCgkJdGhpcy5pdGVtU3RhcnQgPSBmdW5jdGlvbiAoIHVybCApIHsKCgkJCWl0ZW1zVG90YWwgKys7CgoJCQlpZiAoIGlzTG9hZGluZyA9PT0gZmFsc2UgKSB7CgoJCQkJaWYgKCBzY29wZS5vblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCXNjb3BlLm9uU3RhcnQoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTsKCgkJCQl9CgoJCQl9CgoJCQlpc0xvYWRpbmcgPSB0cnVlOwoKCQl9OwoKCQl0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHsKCgkJCWl0ZW1zTG9hZGVkICsrOwoKCQkJaWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJc2NvcGUub25Qcm9ncmVzcyggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApOwoKCQkJfQoKCQkJaWYgKCBpdGVtc0xvYWRlZCA9PT0gaXRlbXNUb3RhbCApIHsKCgkJCQlpc0xvYWRpbmcgPSBmYWxzZTsKCgkJCQlpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlzY29wZS5vbkxvYWQoKTsKCgkJCQl9CgoJCQl9CgoJCX07CgoJCXRoaXMuaXRlbUVycm9yID0gZnVuY3Rpb24gKCB1cmwgKSB7CgoJCQlpZiAoIHNjb3BlLm9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHsKCgkJCQlzY29wZS5vbkVycm9yKCB1cmwgKTsKCgkJCX0KCgkJfTsKCgkJdGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7CgoJCQlpZiAoIHVybE1vZGlmaWVyICkgewoKCQkJCXJldHVybiB1cmxNb2RpZmllciggdXJsICk7CgoJCQl9CgoJCQlyZXR1cm4gdXJsOwoKCQl9OwoKCQl0aGlzLnNldFVSTE1vZGlmaWVyID0gZnVuY3Rpb24gKCB0cmFuc2Zvcm0gKSB7CgoJCQl1cmxNb2RpZmllciA9IHRyYW5zZm9ybTsKCQkJcmV0dXJuIHRoaXM7CgoJCX07CgoJfQoKCXZhciBEZWZhdWx0TG9hZGluZ01hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCgl2YXIgbG9hZGluZyA9IHt9OwoKCWZ1bmN0aW9uIEZpbGVMb2FkZXIoIG1hbmFnZXIgKSB7CgoJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOwoKCX0KCglPYmplY3QuYXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwgewoKCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKCQkJaWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnOwoKCQkJaWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDsKCgkJCXVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTsKCgkJCXZhciBzY29wZSA9IHRoaXM7CgoJCQl2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTsKCgkJCWlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOwoKCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsKCgkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApOwoKCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKCQkJCX0sIDAgKTsKCgkJCQlyZXR1cm4gY2FjaGVkOwoKCQkJfQoKCQkJLy8gQ2hlY2sgaWYgcmVxdWVzdCBpcyBkdXBsaWNhdGUKCgkJCWlmICggbG9hZGluZ1sgdXJsIF0gIT09IHVuZGVmaW5lZCApIHsKCgkJCQlsb2FkaW5nWyB1cmwgXS5wdXNoKCB7CgoJCQkJCW9uTG9hZDogb25Mb2FkLAoJCQkJCW9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsCgkJCQkJb25FcnJvcjogb25FcnJvcgoKCQkJCX0gKTsKCgkJCQlyZXR1cm47CgoJCQl9CgoJCQkvLyBDaGVjayBmb3IgZGF0YTogVVJJCgkJCXZhciBkYXRhVXJpUmVnZXggPSAvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLzsKCQkJdmFyIGRhdGFVcmlSZWdleFJlc3VsdCA9IHVybC5tYXRjaCggZGF0YVVyaVJlZ2V4ICk7CgoJCQkvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Qgc28gcHJvY2VzcyBtYW51YWxseQoJCQlpZiAoIGRhdGFVcmlSZWdleFJlc3VsdCApIHsKCgkJCQl2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTsKCQkJCXZhciBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdOwoJCQkJdmFyIGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDMgXTsKCgkJCQlkYXRhID0gd2luZG93LmRlY29kZVVSSUNvbXBvbmVudCggZGF0YSApOwoKCQkJCWlmICggaXNCYXNlNjQgKSBkYXRhID0gd2luZG93LmF0b2IoIGRhdGEgKTsKCgkJCQl0cnkgewoKCQkJCQl2YXIgcmVzcG9uc2U7CgkJCQkJdmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpOwoKCQkJCQlzd2l0Y2ggKCByZXNwb25zZVR5cGUgKSB7CgoJCQkJCQljYXNlICdhcnJheWJ1ZmZlcic6CgkJCQkJCWNhc2UgJ2Jsb2InOgoKCQkJCQkJCXZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoIGRhdGEubGVuZ3RoICk7CgoJCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCQkJCXZpZXdbIGkgXSA9IGRhdGEuY2hhckNvZGVBdCggaSApOwoKCQkJCQkJCX0KCgkJCQkJCQlpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkgewoKCQkJCQkJCQlyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApOwoKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCXJlc3BvbnNlID0gdmlldy5idWZmZXI7CgoJCQkJCQkJfQoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnZG9jdW1lbnQnOgoKCQkJCQkJCXZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CgkJCQkJCQlyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7CgoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdqc29uJzoKCgkJCQkJCQlyZXNwb25zZSA9IEpTT04ucGFyc2UoIGRhdGEgKTsKCgkJCQkJCQlicmVhazsKCgkJCQkJCWRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlcgoKCQkJCQkJCXJlc3BvbnNlID0gZGF0YTsKCgkJCQkJCQlicmVhazsKCgkJCQkJfQoKCQkJCQkvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXMKCQkJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoKCQkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7CgoJCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKCQkJCQl9LCAwICk7CgoJCQkJfSBjYXRjaCAoIGVycm9yICkgewoKCQkJCQkvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXMKCQkJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoKCQkJCQkJaWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTsKCgkJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgkJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsKCgkJCQkJfSwgMCApOwoKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJLy8gSW5pdGlhbGlzZSBhcnJheSBmb3IgZHVwbGljYXRlIHJlcXVlc3RzCgoJCQkJbG9hZGluZ1sgdXJsIF0gPSBbXTsKCgkJCQlsb2FkaW5nWyB1cmwgXS5wdXNoKCB7CgoJCQkJCW9uTG9hZDogb25Mb2FkLAoJCQkJCW9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsCgkJCQkJb25FcnJvcjogb25FcnJvcgoKCQkJCX0gKTsKCgkJCQl2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoKCQkJCXJlcXVlc3Qub3BlbiggJ0dFVC5odG1sJywgdXJsLCB0cnVlICk7CgoJCQkJcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7CgoJCQkJCXZhciByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7CgoJCQkJCUNhY2hlLmFkZCggdXJsLCByZXNwb25zZSApOwoKCQkJCQl2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07CgoJCQkJCWRlbGV0ZSBsb2FkaW5nWyB1cmwgXTsKCgkJCQkJaWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwICkgewoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJCQl2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTsKCQkJCQkJCWlmICggY2FsbGJhY2sub25Mb2FkICkgY2FsbGJhY2sub25Mb2FkKCByZXNwb25zZSApOwoKCQkJCQkJfQoKCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCgkJCQkJfSBlbHNlIGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSB7CgoJCQkJCQkvLyBTb21lIGJyb3dzZXJzIHJldHVybiBIVFRQIFN0YXR1cyAwIHdoZW4gdXNpbmcgbm9uLWh0dHAgcHJvdG9jb2wKCQkJCQkJLy8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy4KCgkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApOwoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJCQl2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTsKCQkJCQkJCWlmICggY2FsbGJhY2sub25Mb2FkICkgY2FsbGJhY2sub25Mb2FkKCByZXNwb25zZSApOwoKCQkJCQkJfQoKCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJCQkJdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07CgkJCQkJCQlpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApOwoKCQkJCQkJfQoKCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCQkJCQkJc2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApOwoKCQkJCQl9CgoJCQkJfSwgZmFsc2UgKTsKCgkJCQlyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7CgoJCQkJCXZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQkJCXZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdOwoJCQkJCQlpZiAoIGNhbGxiYWNrLm9uUHJvZ3Jlc3MgKSBjYWxsYmFjay5vblByb2dyZXNzKCBldmVudCApOwoKCQkJCQl9CgoJCQkJfSwgZmFsc2UgKTsKCgkJCQlyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7CgoJCQkJCXZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTsKCgkJCQkJZGVsZXRlIGxvYWRpbmdbIHVybCBdOwoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKCQkJCQkJdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07CgkJCQkJCWlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGV2ZW50ICk7CgoJCQkJCX0KCgkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CgoJCQkJfSwgZmFsc2UgKTsKCgkJCQlpZiAoIHRoaXMucmVzcG9uc2VUeXBlICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlOwoJCQkJaWYgKCB0aGlzLndpdGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFsczsKCgkJCQlpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApOwoKCQkJCWZvciAoIHZhciBoZWFkZXIgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyICkgewoKCQkJCQlyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApOwoKCQkJCX0KCgkJCQlyZXF1ZXN0LnNlbmQoIG51bGwgKTsKCgkJCX0KCgkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKCgkJCXJldHVybiByZXF1ZXN0OwoKCQl9LAoKCQlzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy5wYXRoID0gdmFsdWU7CgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlOwoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy5taW1lVHlwZSA9IHZhbHVlOwoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlOwoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKgoJICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pCgkgKi8KCglmdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKCgkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CgoJCS8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCgkJdGhpcy5fcGFyc2VyID0gbnVsbDsKCgl9CgoJT2JqZWN0LmFzc2lnbiggQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7CgoJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgoJCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQkJdmFyIGltYWdlcyA9IFtdOwoKCQkJdmFyIHRleHR1cmUgPSBuZXcgQ29tcHJlc3NlZFRleHR1cmUoKTsKCQkJdGV4dHVyZS5pbWFnZSA9IGltYWdlczsKCgkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7CgkJCWxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTsKCQkJbG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApOwoKCQkJZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7CgoJCQkJbG9hZGVyLmxvYWQoIHVybFsgaSBdLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKCgkJCQkJdmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7CgoJCQkJCWltYWdlc1sgaSBdID0gewoJCQkJCQl3aWR0aDogdGV4RGF0YXMud2lkdGgsCgkJCQkJCWhlaWdodDogdGV4RGF0YXMuaGVpZ2h0LAoJCQkJCQlmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCwKCQkJCQkJbWlwbWFwczogdGV4RGF0YXMubWlwbWFwcwoJCQkJCX07CgoJCQkJCWxvYWRlZCArPSAxOwoKCQkJCQlpZiAoIGxvYWRlZCA9PT0gNiApIHsKCgkJCQkJCWlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKQoJCQkJCQkJdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CgoJCQkJCQl0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDsKCQkJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApOwoKCQkJCQl9CgoJCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKCQkJfQoKCQkJaWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHsKCgkJCQl2YXIgbG9hZGVkID0gMDsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdXJsLmxlbmd0aDsgaSA8IGlsOyArKyBpICkgewoKCQkJCQlsb2FkVGV4dHVyZSggaSApOwoKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJLy8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlCgoJCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CgoJCQkJCXZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApOwoKCQkJCQlpZiAoIHRleERhdGFzLmlzQ3ViZW1hcCApIHsKCgkJCQkJCXZhciBmYWNlcyA9IHRleERhdGFzLm1pcG1hcHMubGVuZ3RoIC8gdGV4RGF0YXMubWlwbWFwQ291bnQ7CgoJCQkJCQlmb3IgKCB2YXIgZiA9IDA7IGYgPCBmYWNlczsgZiArKyApIHsKCgkJCQkJCQlpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTsKCgkJCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHsKCgkJCQkJCQkJaW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTsKCQkJCQkJCQlpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7CgkJCQkJCQkJaW1hZ2VzWyBmIF0ud2lkdGggPSB0ZXhEYXRhcy53aWR0aDsKCQkJCQkJCQlpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7CgoJCQkJCQkJfQoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoKCQkJCQkJdGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoOwoJCQkJCQl0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDsKCQkJCQkJdGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YXMubWlwbWFwczsKCgkJCQkJfQoKCQkJCQlpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkgewoKCQkJCQkJdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CgoJCQkJCX0KCgkJCQkJdGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7CgkJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7CgoJCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKCQkJfQoKCQkJcmV0dXJuIHRleHR1cmU7CgoJCX0sCgoJCXNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnBhdGggPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIE5pa29zIE0uIC8gaHR0cHM6Ly9naXRodWIuY29tL2ZvbzEyMy8KCSAqCgkgKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGxvYWQgZ2VuZXJpYyBiaW5hcnkgdGV4dHVyZXMgZm9ybWF0cyAocmdiZSwgaGRyLCAuLi4pCgkgKi8KCglmdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKCgkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CgoJCS8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCgkJdGhpcy5fcGFyc2VyID0gbnVsbDsKCgl9CgoJT2JqZWN0LmFzc2lnbiggRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7CgoJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgoJCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQkJdmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTsKCgkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7CgkJCWxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTsKCgkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkgewoKCQkJCXZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7CgoJCQkJaWYgKCAhIHRleERhdGEgKSByZXR1cm47CgoJCQkJaWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuaW1hZ2UgKSB7CgoJCQkJCXRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlOwoKCQkJCX0gZWxzZSBpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5kYXRhICkgewoKCQkJCQl0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDsKCQkJCQl0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGEuaGVpZ2h0OwoJCQkJCXRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTsKCgkJCQl9CgoJCQkJdGV4dHVyZS53cmFwUyA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS53cmFwUyA/IHRleERhdGEud3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nOwoJCQkJdGV4dHVyZS53cmFwVCA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS53cmFwVCA/IHRleERhdGEud3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nOwoKCQkJCXRleHR1cmUubWFnRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1hZ0ZpbHRlciA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyOwoJCQkJdGV4dHVyZS5taW5GaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7CgoJCQkJdGV4dHVyZS5hbmlzb3Ryb3B5ID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmFuaXNvdHJvcHkgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxOwoKCQkJCWlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmZvcm1hdCApIHsKCgkJCQkJdGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDsKCgkJCQl9CgkJCQlpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS50eXBlICkgewoKCQkJCQl0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7CgoJCQkJfQoKCQkJCWlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMgKSB7CgoJCQkJCXRleHR1cmUubWlwbWFwcyA9IHRleERhdGEubWlwbWFwczsKCgkJCQl9CgoJCQkJaWYgKCAxID09PSB0ZXhEYXRhLm1pcG1hcENvdW50ICkgewoKCQkJCQl0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjsKCgkJCQl9CgoJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTsKCgkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCgoJCQlyZXR1cm4gdGV4dHVyZTsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHsKCgkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CgoJfQoKCU9iamVjdC5hc3NpZ24oIEltYWdlTG9hZGVyLnByb3RvdHlwZSwgewoKCQljcm9zc09yaWdpbjogJ0Fub255bW91cycsCgoJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgoJCQlpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7CgoJCQlpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsOwoKCQkJdXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApOwoKCQkJdmFyIHNjb3BlID0gdGhpczsKCgkJCXZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApOwoKCQkJaWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHsKCgkJCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CgoJCQkJc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoKCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7CgoJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgoJCQkJfSwgMCApOwoKCQkJCXJldHVybiBjYWNoZWQ7CgoJCQl9CgoJCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2ltZycgKTsKCgkJCWltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCkgewoKCQkJCUNhY2hlLmFkZCggdXJsLCB0aGlzICk7CgoJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTsKCgkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKCQkJfSwgZmFsc2UgKTsKCgkJCS8qCgkJCWltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7CgoJCQkJaWYgKCBvblByb2dyZXNzICkgb25Qcm9ncmVzcyggZXZlbnQgKTsKCgkJCX0sIGZhbHNlICk7CgkJCSovCgoJCQlpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkgewoKCQkJCWlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7CgoJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsKCgkJCX0sIGZhbHNlICk7CgoJCQlpZiAoIHVybC5zdWJzdHIoIDAsIDUgKSAhPT0gJ2RhdGE6JyApIHsKCgkJCQlpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjsKCgkJCX0KCgkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKCgkJCWltYWdlLnNyYyA9IHVybDsKCgkJCXJldHVybiBpbWFnZTsKCgkJfSwKCgkJc2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7CgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy5wYXRoID0gdmFsdWU7CgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIEN1YmVUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkgewoKCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKCgl9CgoJT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7CgoJCWNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJywKCgkJbG9hZDogZnVuY3Rpb24gKCB1cmxzLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgoJCQl2YXIgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpOwoKCQkJdmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7CgkJCWxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApOwoJCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CgoJCQl2YXIgbG9hZGVkID0gMDsKCgkJCWZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkgewoKCQkJCWxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7CgoJCQkJCXRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTsKCgkJCQkJbG9hZGVkICsrOwoKCQkJCQlpZiAoIGxvYWRlZCA9PT0gNiApIHsKCgkJCQkJCXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTsKCgkJCQkJfQoKCQkJCX0sIHVuZGVmaW5lZCwgb25FcnJvciApOwoKCQkJfQoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7CgoJCQkJbG9hZFRleHR1cmUoIGkgKTsKCgkJCX0KCgkJCXJldHVybiB0ZXh0dXJlOwoKCQl9LAoKCQlzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnBhdGggPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKCgkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7CgoJCWNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJywKCgkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCgkJCXZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoKTsKCgkJCXZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApOwoJCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKCQkJbG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApOwoKCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHsKCgkJCQl0ZXh0dXJlLmltYWdlID0gaW1hZ2U7CgoJCQkJLy8gSlBFR3MgY2FuJ3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBzbyBtZW1vcnkgY2FuIGJlIHNhdmVkIGJ5IHN0b3JpbmcgdGhlbSBhcyBSR0IuCgkJCQl2YXIgaXNKUEVHID0gdXJsLnNlYXJjaCggL1wuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVw6aW1hZ2VcL2pwZWcvICkgPT09IDA7CgoJCQkJdGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0OwoJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJaWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJb25Mb2FkKCB0ZXh0dXJlICk7CgoJCQkJfQoKCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKCQkJcmV0dXJuIHRleHR1cmU7CgoJCX0sCgoJCXNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlOwoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMucGF0aCA9IHZhbHVlOwoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKCSAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0CgkgKgoJICogU29tZSBjb21tb24gb2YgY3VydmUgbWV0aG9kczoKCSAqIC5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnQoIHQgKQoJICogLmdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICksIC5nZXRUYW5nZW50QXQoIHUgKQoJICogLmdldFBvaW50cygpLCAuZ2V0U3BhY2VkUG9pbnRzKCkKCSAqIC5nZXRMZW5ndGgoKQoJICogLnVwZGF0ZUFyY0xlbmd0aHMoKQoJICoKCSAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3VydmU6CgkgKgoJICogLS0gMkQgY3VydmVzIC0tCgkgKiBUSFJFRS5BcmNDdXJ2ZQoJICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZQoJICogVEhSRUUuRWxsaXBzZUN1cnZlCgkgKiBUSFJFRS5MaW5lQ3VydmUKCSAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlCgkgKiBUSFJFRS5TcGxpbmVDdXJ2ZQoJICoKCSAqIC0tIDNEIGN1cnZlcyAtLQoJICogVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMwoJICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTMKCSAqIFRIUkVFLkxpbmVDdXJ2ZTMKCSAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlMwoJICoKCSAqIEEgc2VyaWVzIG9mIGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguCgkgKgoJICoqLwoKCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJICoJQWJzdHJhY3QgQ3VydmUgYmFzZSBjbGFzcwoJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCWZ1bmN0aW9uIEN1cnZlKCkgewoKCQl0aGlzLnR5cGUgPSAnQ3VydmUnOwoKCQl0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDsKCgl9CgoJT2JqZWN0LmFzc2lnbiggQ3VydmUucHJvdG90eXBlLCB7CgoJCS8vIFZpcnR1YWwgYmFzZSBjbGFzcyBtZXRob2QgdG8gb3ZlcndyaXRlIGFuZCBpbXBsZW1lbnQgaW4gc3ViY2xhc3NlcwoJCS8vCS0gdCBbMCAuLiAxXQoKCQlnZXRQb2ludDogZnVuY3Rpb24gKCAvKiB0LCBvcHRpb25hbFRhcmdldCAqLyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuJyApOwoJCQlyZXR1cm4gbnVsbDsKCgkJfSwKCgkJLy8gR2V0IHBvaW50IGF0IHJlbGF0aXZlIHBvc2l0aW9uIGluIGN1cnZlIGFjY29yZGluZyB0byBhcmMgbGVuZ3RoCgkJLy8gLSB1IFswIC4uIDFdCgoJCWdldFBvaW50QXQ6IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQl2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTsKCQkJcmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7CgoJCX0sCgoJCS8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKQoKCQlnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKCQkJaWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDU7CgoJCQl2YXIgcG9pbnRzID0gW107CgoJCQlmb3IgKCB2YXIgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkgewoKCQkJCXBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBkIC8gZGl2aXNpb25zICkgKTsKCgkJCX0KCgkJCXJldHVybiBwb2ludHM7CgoJCX0sCgoJCS8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApCgoJCWdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgoJCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTsKCgkJCXZhciBwb2ludHMgPSBbXTsKCgkJCWZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7CgoJCQkJcG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7CgoJCQl9CgoJCQlyZXR1cm4gcG9pbnRzOwoKCQl9LAoKCQkvLyBHZXQgdG90YWwgY3VydmUgYXJjIGxlbmd0aAoKCQlnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7CgkJCXJldHVybiBsZW5ndGhzWyBsZW5ndGhzLmxlbmd0aCAtIDEgXTsKCgkJfSwKCgkJLy8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMKCgkJZ2V0TGVuZ3RoczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgoJCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7CgoJCQlpZiAoIHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmCgkJCQkoIHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gZGl2aXNpb25zICsgMSApICYmCgkJCQkhIHRoaXMubmVlZHNVcGRhdGUgKSB7CgoJCQkJcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwoKCQkJfQoKCQkJdGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlOwoKCQkJdmFyIGNhY2hlID0gW107CgkJCXZhciBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApOwoJCQl2YXIgcCwgc3VtID0gMDsKCgkJCWNhY2hlLnB1c2goIDAgKTsKCgkJCWZvciAoIHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCArKyApIHsKCgkJCQljdXJyZW50ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlzaW9ucyApOwoJCQkJc3VtICs9IGN1cnJlbnQuZGlzdGFuY2VUbyggbGFzdCApOwoJCQkJY2FjaGUucHVzaCggc3VtICk7CgkJCQlsYXN0ID0gY3VycmVudDsKCgkJCX0KCgkJCXRoaXMuY2FjaGVBcmNMZW5ndGhzID0gY2FjaGU7CgoJCQlyZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUgbGFzdCBlbGVtZW50LgoKCQl9LAoKCQl1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCQkJdGhpcy5nZXRMZW5ndGhzKCk7CgoJCX0sCgoJCS8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnQKCgkJZ2V0VXRvVG1hcHBpbmc6IGZ1bmN0aW9uICggdSwgZGlzdGFuY2UgKSB7CgoJCQl2YXIgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpOwoKCQkJdmFyIGkgPSAwLCBpbCA9IGFyY0xlbmd0aHMubGVuZ3RoOwoKCQkJdmFyIHRhcmdldEFyY0xlbmd0aDsgLy8gVGhlIHRhcmdldGVkIHUgZGlzdGFuY2UgdmFsdWUgdG8gZ2V0CgoJCQlpZiAoIGRpc3RhbmNlICkgewoKCQkJCXRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlOwoKCQkJfSBlbHNlIHsKCgkJCQl0YXJnZXRBcmNMZW5ndGggPSB1ICogYXJjTGVuZ3Roc1sgaWwgLSAxIF07CgoJCQl9CgoJCQkvLyBiaW5hcnkgc2VhcmNoIGZvciB0aGUgaW5kZXggd2l0aCBsYXJnZXN0IHZhbHVlIHNtYWxsZXIgdGhhbiB0YXJnZXQgdSBkaXN0YW5jZQoKCQkJdmFyIGxvdyA9IDAsIGhpZ2ggPSBpbCAtIDEsIGNvbXBhcmlzb247CgoJCQl3aGlsZSAoIGxvdyA8PSBoaWdoICkgewoKCQkJCWkgPSBNYXRoLmZsb29yKCBsb3cgKyAoIGhpZ2ggLSBsb3cgKSAvIDIgKTsgLy8gbGVzcyBsaWtlbHkgdG8gb3ZlcmZsb3csIHRob3VnaCBwcm9iYWJseSBub3QgaXNzdWUgaGVyZSwgSlMgZG9lc24ndCByZWFsbHkgaGF2ZSBpbnRlZ2VycywgYWxsIG51bWJlcnMgYXJlIGZsb2F0cwoKCQkJCWNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7CgoJCQkJaWYgKCBjb21wYXJpc29uIDwgMCApIHsKCgkJCQkJbG93ID0gaSArIDE7CgoJCQkJfSBlbHNlIGlmICggY29tcGFyaXNvbiA+IDAgKSB7CgoJCQkJCWhpZ2ggPSBpIC0gMTsKCgkJCQl9IGVsc2UgewoKCQkJCQloaWdoID0gaTsKCQkJCQlicmVhazsKCgkJCQkJLy8gRE9ORQoKCQkJCX0KCgkJCX0KCgkJCWkgPSBoaWdoOwoKCQkJaWYgKCBhcmNMZW5ndGhzWyBpIF0gPT09IHRhcmdldEFyY0xlbmd0aCApIHsKCgkJCQlyZXR1cm4gaSAvICggaWwgLSAxICk7CgoJCQl9CgoJCQkvLyB3ZSBjb3VsZCBnZXQgZmluZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBvaW50cwoKCQkJdmFyIGxlbmd0aEJlZm9yZSA9IGFyY0xlbmd0aHNbIGkgXTsKCQkJdmFyIGxlbmd0aEFmdGVyID0gYXJjTGVuZ3Roc1sgaSArIDEgXTsKCgkJCXZhciBzZWdtZW50TGVuZ3RoID0gbGVuZ3RoQWZ0ZXIgLSBsZW5ndGhCZWZvcmU7CgoJCQkvLyBkZXRlcm1pbmUgd2hlcmUgd2UgYXJlIGJldHdlZW4gdGhlICdiZWZvcmUnIGFuZCAnYWZ0ZXInIHBvaW50cwoKCQkJdmFyIHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkgLyBzZWdtZW50TGVuZ3RoOwoKCQkJLy8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdAoKCQkJdmFyIHQgPSAoIGkgKyBzZWdtZW50RnJhY3Rpb24gKSAvICggaWwgLSAxICk7CgoJCQlyZXR1cm4gdDsKCgkJfSwKCgkJLy8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgdAoJCS8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbiwKCQkvLyAyIHBvaW50cyBhIHNtYWxsIGRlbHRhIGFwYXJ0IHdpbGwgYmUgdXNlZCB0byBmaW5kIGl0cyBncmFkaWVudAoJCS8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24KCgkJZ2V0VGFuZ2VudDogZnVuY3Rpb24gKCB0ICkgewoKCQkJdmFyIGRlbHRhID0gMC4wMDAxOwoJCQl2YXIgdDEgPSB0IC0gZGVsdGE7CgkJCXZhciB0MiA9IHQgKyBkZWx0YTsKCgkJCS8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXIKCgkJCWlmICggdDEgPCAwICkgdDEgPSAwOwoJCQlpZiAoIHQyID4gMSApIHQyID0gMTsKCgkJCXZhciBwdDEgPSB0aGlzLmdldFBvaW50KCB0MSApOwoJCQl2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTsKCgkJCXZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApOwoJCQlyZXR1cm4gdmVjLm5vcm1hbGl6ZSgpOwoKCQl9LAoKCQlnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHsKCgkJCXZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApOwoJCQlyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB0ICk7CgoJCX0sCgoJCWNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHsKCgkJCS8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGYKCgkJCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoKCQkJdmFyIHRhbmdlbnRzID0gW107CgkJCXZhciBub3JtYWxzID0gW107CgkJCXZhciBiaW5vcm1hbHMgPSBbXTsKCgkJCXZhciB2ZWMgPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTsKCgkJCXZhciBpLCB1LCB0aGV0YTsKCgkJCS8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZQoKCQkJZm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CgoJCQkJdSA9IGkgLyBzZWdtZW50czsKCgkJCQl0YW5nZW50c1sgaSBdID0gdGhpcy5nZXRUYW5nZW50QXQoIHUgKTsKCQkJCXRhbmdlbnRzWyBpIF0ubm9ybWFsaXplKCk7CgoJCQl9CgoJCQkvLyBzZWxlY3QgYW4gaW5pdGlhbCBub3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZpcnN0IHRhbmdlbnQgdmVjdG9yLAoJCQkvLyBhbmQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWluaW11bSB0YW5nZW50IHh5eiBjb21wb25lbnQKCgkJCW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7CgkJCWJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTsKCQkJdmFyIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7CgkJCXZhciB0eCA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnggKTsKCQkJdmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApOwoJCQl2YXIgdHogPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS56ICk7CgoJCQlpZiAoIHR4IDw9IG1pbiApIHsKCgkJCQltaW4gPSB0eDsKCQkJCW5vcm1hbC5zZXQoIDEsIDAsIDAgKTsKCgkJCX0KCgkJCWlmICggdHkgPD0gbWluICkgewoKCQkJCW1pbiA9IHR5OwoJCQkJbm9ybWFsLnNldCggMCwgMSwgMCApOwoKCQkJfQoKCQkJaWYgKCB0eiA8PSBtaW4gKSB7CgoJCQkJbm9ybWFsLnNldCggMCwgMCwgMSApOwoKCQkJfQoKCQkJdmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsICkubm9ybWFsaXplKCk7CgoJCQlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCB2ZWMgKTsKCQkJYmlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTsKCgoJCQkvLyBjb21wdXRlIHRoZSBzbG93bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmUKCgkJCWZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkgewoKCQkJCW5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTsKCgkJCQliaW5vcm1hbHNbIGkgXSA9IGJpbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpOwoKCQkJCXZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIC0gMSBdLCB0YW5nZW50c1sgaSBdICk7CgoJCQkJaWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHsKCgkJCQkJdmVjLm5vcm1hbGl6ZSgpOwoKCQkJCQl0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRhbmdlbnRzWyBpIC0gMSBdLmRvdCggdGFuZ2VudHNbIGkgXSApLCAtIDEsIDEgKSApOyAvLyBjbGFtcCBmb3IgZmxvYXRpbmcgcHQgZXJyb3JzCgoJCQkJCW5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTsKCgkJCQl9CgoJCQkJYmlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTsKCgkJCX0KCgkJCS8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWUKCgkJCWlmICggY2xvc2VkID09PSB0cnVlICkgewoKCQkJCXRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApOwoJCQkJdGhldGEgLz0gc2VnbWVudHM7CgoJCQkJaWYgKCB0YW5nZW50c1sgMCBdLmRvdCggdmVjLmNyb3NzVmVjdG9ycyggbm9ybWFsc1sgMCBdLCBub3JtYWxzWyBzZWdtZW50cyBdICkgKSA+IDAgKSB7CgoJCQkJCXRoZXRhID0gLSB0aGV0YTsKCgkJCQl9CgoJCQkJZm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CgoJCQkJCS8vIHR3aXN0IGEgbGl0dGxlLi4uCgkJCQkJbm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7CgkJCQkJYmlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTsKCgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gewoJCQkJdGFuZ2VudHM6IHRhbmdlbnRzLAoJCQkJbm9ybWFsczogbm9ybWFscywKCQkJCWJpbm9ybWFsczogYmlub3JtYWxzCgkJCX07CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGRhdGEgPSB7CgkJCQltZXRhZGF0YTogewoJCQkJCXZlcnNpb246IDQuNSwKCQkJCQl0eXBlOiAnQ3VydmUnLAoJCQkJCWdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTicKCQkJCX0KCQkJfTsKCgkJCWRhdGEuYXJjTGVuZ3RoRGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7CgkJCWRhdGEudHlwZSA9IHRoaXMudHlwZTsKCgkJCXJldHVybiBkYXRhOwoKCQl9LAoKCQlmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkgewoKCQkJdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBqc29uLmFyY0xlbmd0aERpdmlzaW9uczsKCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCWZ1bmN0aW9uIEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7CgoJCUN1cnZlLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0VsbGlwc2VDdXJ2ZSc7CgoJCXRoaXMuYVggPSBhWCB8fCAwOwoJCXRoaXMuYVkgPSBhWSB8fCAwOwoKCQl0aGlzLnhSYWRpdXMgPSB4UmFkaXVzIHx8IDE7CgkJdGhpcy55UmFkaXVzID0geVJhZGl1cyB8fCAxOwoKCQl0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGUgfHwgMDsKCQl0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZSB8fCAyICogTWF0aC5QSTsKCgkJdGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZSB8fCBmYWxzZTsKCgkJdGhpcy5hUm90YXRpb24gPSBhUm90YXRpb24gfHwgMDsKCgl9CgoJRWxsaXBzZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOwoJRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVsbGlwc2VDdXJ2ZTsKCglFbGxpcHNlQ3VydmUucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlID0gdHJ1ZTsKCglFbGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCgkJdmFyIHR3b1BpID0gTWF0aC5QSSAqIDI7CgkJdmFyIGRlbHRhQW5nbGUgPSB0aGlzLmFFbmRBbmdsZSAtIHRoaXMuYVN0YXJ0QW5nbGU7CgkJdmFyIHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047CgoJCS8vIGVuc3VyZXMgdGhhdCBkZWx0YUFuZ2xlIGlzIDAgLi4gMiBQSQoJCXdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpOwoJCXdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAtPSB0d29QaTsKCgkJaWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7CgoJCQlpZiAoIHNhbWVQb2ludHMgKSB7CgoJCQkJZGVsdGFBbmdsZSA9IDA7CgoJCQl9IGVsc2UgewoKCQkJCWRlbHRhQW5nbGUgPSB0d29QaTsKCgkJCX0KCgkJfQoKCQlpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7CgoJCQlpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkgewoKCQkJCWRlbHRhQW5nbGUgPSAtIHR3b1BpOwoKCQkJfSBlbHNlIHsKCgkJCQlkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpOwoKCQkJfQoKCQl9CgoJCXZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTsKCQl2YXIgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTsKCQl2YXIgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTsKCgkJaWYgKCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHsKCgkJCXZhciBjb3MgPSBNYXRoLmNvcyggdGhpcy5hUm90YXRpb24gKTsKCQkJdmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApOwoKCQkJdmFyIHR4ID0geCAtIHRoaXMuYVg7CgkJCXZhciB0eSA9IHkgLSB0aGlzLmFZOwoKCQkJLy8gUm90YXRlIHRoZSBwb2ludCBhYm91dCB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLgoJCQl4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7CgkJCXkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTsKCgkJfQoKCQlyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7CgoJfTsKCglFbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMuYVggPSBzb3VyY2UuYVg7CgkJdGhpcy5hWSA9IHNvdXJjZS5hWTsKCgkJdGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7CgkJdGhpcy55UmFkaXVzID0gc291cmNlLnlSYWRpdXM7CgoJCXRoaXMuYVN0YXJ0QW5nbGUgPSBzb3VyY2UuYVN0YXJ0QW5nbGU7CgkJdGhpcy5hRW5kQW5nbGUgPSBzb3VyY2UuYUVuZEFuZ2xlOwoKCQl0aGlzLmFDbG9ja3dpc2UgPSBzb3VyY2UuYUNsb2Nrd2lzZTsKCgkJdGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCglFbGxpcHNlQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCgkJZGF0YS5hWCA9IHRoaXMuYVg7CgkJZGF0YS5hWSA9IHRoaXMuYVk7CgoJCWRhdGEueFJhZGl1cyA9IHRoaXMueFJhZGl1czsKCQlkYXRhLnlSYWRpdXMgPSB0aGlzLnlSYWRpdXM7CgoJCWRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlOwoJCWRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7CgoJCWRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTsKCgkJZGF0YS5hUm90YXRpb24gPSB0aGlzLmFSb3RhdGlvbjsKCgkJcmV0dXJuIGRhdGE7CgoJfTsKCglFbGxpcHNlQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkgewoKCQlDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApOwoKCQl0aGlzLmFYID0ganNvbi5hWDsKCQl0aGlzLmFZID0ganNvbi5hWTsKCgkJdGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzOwoJCXRoaXMueVJhZGl1cyA9IGpzb24ueVJhZGl1czsKCgkJdGhpcy5hU3RhcnRBbmdsZSA9IGpzb24uYVN0YXJ0QW5nbGU7CgkJdGhpcy5hRW5kQW5nbGUgPSBqc29uLmFFbmRBbmdsZTsKCgkJdGhpcy5hQ2xvY2t3aXNlID0ganNvbi5hQ2xvY2t3aXNlOwoKCQl0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCWZ1bmN0aW9uIEFyY0N1cnZlKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7CgoJCUVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTsKCgkJdGhpcy50eXBlID0gJ0FyY0N1cnZlJzsKCgl9CgoJQXJjQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRWxsaXBzZUN1cnZlLnByb3RvdHlwZSApOwoJQXJjQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJjQ3VydmU7CgoJQXJjQ3VydmUucHJvdG90eXBlLmlzQXJjQ3VydmUgPSB0cnVlOwoKCS8qKgoJICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1CgkgKgoJICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmcKCSAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLgoJICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGYKCSAqCgkgKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb20KCSAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjUKCSAqLwoKCgkvKgoJQmFzZWQgb24gYW4gb3B0aW1pemVkIGMrKyBzb2x1dGlvbiBpbgoJIC0gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NDg5NzM2L2NhdG11bGwtcm9tLWN1cnZlLXdpdGgtbm8tY3VzcHMtYW5kLW5vLXNlbGYtaW50ZXJzZWN0aW9ucy8KCSAtIGh0dHA6Ly9pZGVvbmUuY29tL05vRWJWTQoKCVRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucywKCWJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbAoJd2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLgoJKi8KCglmdW5jdGlvbiBDdWJpY1BvbHkoKSB7CgoJCXZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7CgoJCS8qCgkJICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbAoJCSAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeMwoJCSAqIHN1Y2ggdGhhdAoJCSAqICAgcCgwKSA9IHgwLCBwKDEpID0geDEKCQkgKiAgYW5kCgkJICogICBwJygwKSA9IHQwLCBwJygxKSA9IHQxLgoJCSAqLwoJCWZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkgewoKCQkJYzAgPSB4MDsKCQkJYzEgPSB0MDsKCQkJYzIgPSAtIDMgKiB4MCArIDMgKiB4MSAtIDIgKiB0MCAtIHQxOwoJCQljMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7CgoJCX0KCgkJcmV0dXJuIHsKCgkJCWluaXRDYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCB0ZW5zaW9uICkgewoKCQkJCWluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTsKCgkJCX0sCgoJCQlpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7CgoJCQkJLy8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXQoJCQkJdmFyIHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTsKCQkJCXZhciB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7CgoJCQkJLy8gcmVzY2FsZSB0YW5nZW50cyBmb3IgcGFyYW1ldHJpemF0aW9uIGluIFswLDFdCgkJCQl0MSAqPSBkdDE7CgkJCQl0MiAqPSBkdDE7CgoJCQkJaW5pdCggeDEsIHgyLCB0MSwgdDIgKTsKCgkJCX0sCgoJCQljYWxjOiBmdW5jdGlvbiAoIHQgKSB7CgoJCQkJdmFyIHQyID0gdCAqIHQ7CgkJCQl2YXIgdDMgPSB0MiAqIHQ7CgkJCQlyZXR1cm4gYzAgKyBjMSAqIHQgKyBjMiAqIHQyICsgYzMgKiB0MzsKCgkJCX0KCgkJfTsKCgl9CgoJLy8KCgl2YXIgdG1wID0gbmV3IFZlY3RvcjMoKTsKCXZhciBweCA9IG5ldyBDdWJpY1BvbHkoKTsKCXZhciBweSA9IG5ldyBDdWJpY1BvbHkoKTsKCXZhciBweiA9IG5ldyBDdWJpY1BvbHkoKTsKCglmdW5jdGlvbiBDYXRtdWxsUm9tQ3VydmUzKCBwb2ludHMsIGNsb3NlZCwgY3VydmVUeXBlLCB0ZW5zaW9uICkgewoKCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdDYXRtdWxsUm9tQ3VydmUzJzsKCgkJdGhpcy5wb2ludHMgPSBwb2ludHMgfHwgW107CgkJdGhpcy5jbG9zZWQgPSBjbG9zZWQgfHwgZmFsc2U7CgkJdGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGUgfHwgJ2NlbnRyaXBldGFsJzsKCQl0aGlzLnRlbnNpb24gPSB0ZW5zaW9uIHx8IDAuNTsKCgl9CgoJQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKCUNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMzsKCglDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTMgPSB0cnVlOwoKCUNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzOwoJCXZhciBsID0gcG9pbnRzLmxlbmd0aDsKCgkJdmFyIHAgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDsKCQl2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7CgkJdmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDsKCgkJaWYgKCB0aGlzLmNsb3NlZCApIHsKCgkJCWludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGguYWJzKCBpbnRQb2ludCApIC8gcG9pbnRzLmxlbmd0aCApICsgMSApICogcG9pbnRzLmxlbmd0aDsKCgkJfSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHsKCgkJCWludFBvaW50ID0gbCAtIDI7CgkJCXdlaWdodCA9IDE7CgoJCX0KCgkJdmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50cwoKCQlpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHsKCgkJCXAwID0gcG9pbnRzWyAoIGludFBvaW50IC0gMSApICUgbCBdOwoKCQl9IGVsc2UgewoKCQkJLy8gZXh0cmFwb2xhdGUgZmlyc3QgcG9pbnQKCQkJdG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTsKCQkJcDAgPSB0bXA7CgoJCX0KCgkJcDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdOwoJCXAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdOwoKCQlpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7CgoJCQlwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTsKCgkJfSBlbHNlIHsKCgkJCS8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnQKCQkJdG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgbCAtIDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTsKCQkJcDMgPSB0bXA7CgoJCX0KCgkJaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnICkgewoKCQkJLy8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb20KCQkJdmFyIHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1OwoJCQl2YXIgZHQwID0gTWF0aC5wb3coIHAwLmRpc3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTsKCQkJdmFyIGR0MSA9IE1hdGgucG93KCBwMS5kaXN0YW5jZVRvU3F1YXJlZCggcDIgKSwgcG93ICk7CgkJCXZhciBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApOwoKCQkJLy8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHMKCQkJaWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wOwoJCQlpZiAoIGR0MCA8IDFlLTQgKSBkdDAgPSBkdDE7CgkJCWlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTsKCgkJCXB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApOwoJCQlweS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIGR0MCwgZHQxLCBkdDIgKTsKCQkJcHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7CgoJCX0gZWxzZSBpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2F0bXVsbHJvbScgKSB7CgoJCQlweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7CgkJCXB5LmluaXRDYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCB0aGlzLnRlbnNpb24gKTsKCQkJcHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIHRoaXMudGVuc2lvbiApOwoKCQl9CgoJCXBvaW50LnNldCgKCQkJcHguY2FsYyggd2VpZ2h0ICksCgkJCXB5LmNhbGMoIHdlaWdodCApLAoJCQlwei5jYWxjKCB3ZWlnaHQgKQoJCSk7CgoJCXJldHVybiBwb2ludDsKCgl9OwoKCUNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMucG9pbnRzID0gW107CgoJCWZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCXZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTsKCgkJCXRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTsKCgkJfQoKCQl0aGlzLmNsb3NlZCA9IHNvdXJjZS5jbG9zZWQ7CgkJdGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlOwoJCXRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCUNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCgkJZGF0YS5wb2ludHMgPSBbXTsKCgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCXZhciBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07CgkJCWRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApOwoKCQl9CgoJCWRhdGEuY2xvc2VkID0gdGhpcy5jbG9zZWQ7CgkJZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTsKCQlkYXRhLnRlbnNpb24gPSB0aGlzLnRlbnNpb247CgoJCXJldHVybiBkYXRhOwoKCX07CgoJQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgoJCXRoaXMucG9pbnRzID0gW107CgoJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQl2YXIgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdOwoJCQl0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggcG9pbnQgKSApOwoKCQl9CgoJCXRoaXMuY2xvc2VkID0ganNvbi5jbG9zZWQ7CgkJdGhpcy5jdXJ2ZVR5cGUgPSBqc29uLmN1cnZlVHlwZTsKCQl0aGlzLnRlbnNpb24gPSBqc29uLnRlbnNpb247CgoJCXJldHVybiB0aGlzOwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCgkgKgoJICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tCgkgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmUKCSAqLwoKCWZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkgewoKCQl2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTsKCQl2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTsKCQl2YXIgdDIgPSB0ICogdDsKCQl2YXIgdDMgPSB0ICogdDI7CgkJcmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7CgoJfQoKCS8vCgoJZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7CgoJCXZhciBrID0gMSAtIHQ7CgkJcmV0dXJuIGsgKiBrICogcDsKCgl9CgoJZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7CgoJCXJldHVybiAyICogKCAxIC0gdCApICogdCAqIHA7CgoJfQoKCWZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkgewoKCQlyZXR1cm4gdCAqIHQgKiBwOwoKCX0KCglmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7CgoJCXJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICsKCQkJUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7CgoJfQoKCS8vCgoJZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHsKCgkJdmFyIGsgPSAxIC0gdDsKCQlyZXR1cm4gayAqIGsgKiBrICogcDsKCgl9CgoJZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHsKCgkJdmFyIGsgPSAxIC0gdDsKCQlyZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7CgoJfQoKCWZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7CgoJCXJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwOwoKCX0KCglmdW5jdGlvbiBDdWJpY0JlemllclAzKCB0LCBwICkgewoKCQlyZXR1cm4gdCAqIHQgKiB0ICogcDsKCgl9CgoJZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkgewoKCQlyZXR1cm4gQ3ViaWNCZXppZXJQMCggdCwgcDAgKSArIEN1YmljQmV6aWVyUDEoIHQsIHAxICkgKyBDdWJpY0JlemllclAyKCB0LCBwMiApICsKCQkJQ3ViaWNCZXppZXJQMyggdCwgcDMgKTsKCgl9CgoJZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiwgdjMgKSB7CgoJCUN1cnZlLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnOwoKCQl0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTsKCQl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTsKCQl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTsKCQl0aGlzLnYzID0gdjMgfHwgbmV3IFZlY3RvcjIoKTsKCgl9CgoJQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKCUN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTsKCglDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlOwoKCUN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCgkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MzsKCgkJcG9pbnQuc2V0KAoJCQlDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLAoJCQlDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApCgkJKTsKCgkJcmV0dXJuIHBvaW50OwoKCX07CgoJQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKCQlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJdGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTsKCQl0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApOwoJCXRoaXMudjIuY29weSggc291cmNlLnYyICk7CgkJdGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCglDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgoJCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKCQlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CgkJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoJCWRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTsKCgkJcmV0dXJuIGRhdGE7CgoJfTsKCglDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHsKCgkJQ3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCgkJdGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTsKCQl0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApOwoJCXRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7CgkJdGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCglmdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7CgoJCUN1cnZlLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUzJzsKCgkJdGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7CgkJdGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IzKCk7CgoJfQoKCUN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOwoJQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTM7CgoJQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlOwoKCUN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7CgoJCXZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgoJCXZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7CgoJCXBvaW50LnNldCgKCQkJQ3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSwKCQkJQ3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSwKCQkJQ3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnogKQoJCSk7CgoJCXJldHVybiBwb2ludDsKCgl9OwoKCUN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCUN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQl0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApOwoJCXRoaXMudjEuY29weSggc291cmNlLnYxICk7CgkJdGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTsKCQl0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCUN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgoJCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKCQlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CgkJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoJCWRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTsKCgkJcmV0dXJuIGRhdGE7CgoJfTsKCglDdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgoJCXRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7CgkJdGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTsKCQl0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApOwoJCXRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7CgoJCXJldHVybiB0aGlzOwoKCX07CgoJZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7CgoJCUN1cnZlLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0xpbmVDdXJ2ZSc7CgoJCXRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpOwoJCXRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpOwoKCX0KCglMaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CglMaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlOwoKCUxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlOwoKCUxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQl2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOwoKCQlpZiAoIHQgPT09IDEgKSB7CgoJCQlwb2ludC5jb3B5KCB0aGlzLnYyICk7CgoJCX0gZWxzZSB7CgoJCQlwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7CgkJCXBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7CgoJCX0KCgkJcmV0dXJuIHBvaW50OwoKCX07CgoJLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0CgoJTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHsKCgkJcmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7CgoJfTsKCglMaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIC8qIHQgKi8gKSB7CgoJCXZhciB0YW5nZW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApOwoKCQlyZXR1cm4gdGFuZ2VudC5ub3JtYWxpemUoKTsKCgl9OwoKCUxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKCQlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJdGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTsKCQl0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCUxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKCQl2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKCQlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CgkJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoKCQlyZXR1cm4gZGF0YTsKCgl9OwoKCUxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgoJCXRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7CgkJdGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCglmdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7CgoJCUN1cnZlLmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0xpbmVDdXJ2ZTMnOwoKCQl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTsKCQl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTsKCgl9CgoJTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKCUxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMzsKCglMaW5lQ3VydmUzLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTMgPSB0cnVlOwoKCUxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJaWYgKCB0ID09PSAxICkgewoKCQkJcG9pbnQuY29weSggdGhpcy52MiApOwoKCQl9IGVsc2UgewoKCQkJcG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApOwoJCQlwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApOwoKCQl9CgoJCXJldHVybiBwb2ludDsKCgl9OwoKCS8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdAoKCUxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQlyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTsKCgl9OwoKCUxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMudjEuY29weSggc291cmNlLnYxICk7CgkJdGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCglMaW5lQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgoJCWRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTsKCQlkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7CgoJCXJldHVybiBkYXRhOwoKCX07CgoJTGluZUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgoJCXRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7CgkJdGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTsKCgkJcmV0dXJuIHRoaXM7CgoJfTsKCglmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHsKCgkJQ3VydmUuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUnOwoKCQl0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTsKCQl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTsKCQl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTsKCgl9CgoJUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CglRdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTsKCglRdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IHRydWU7CgoJUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCgkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7CgoJCXBvaW50LnNldCgKCQkJUXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksCgkJCVF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApCgkJKTsKCgkJcmV0dXJuIHBvaW50OwoKCX07CgoJUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMudjAuY29weSggc291cmNlLnYwICk7CgkJdGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTsKCQl0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCVF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgoJCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKCQlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CgkJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoKCQlyZXR1cm4gZGF0YTsKCgl9OwoKCVF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHsKCgkJQ3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCgkJdGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTsKCQl0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApOwoJCXRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7CgoJCXJldHVybiB0aGlzOwoKCX07CgoJZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkgewoKCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZTMnOwoKCQl0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTsKCQl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTsKCQl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTsKCgl9CgoJUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOwoJUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlMzsKCglRdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTsKCglRdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCgkJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7CgoJCXBvaW50LnNldCgKCQkJUXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksCgkJCVF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApLAoJCQlRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKQoJCSk7CgoJCXJldHVybiBwb2ludDsKCgl9OwoKCVF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKCQlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJdGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTsKCQl0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApOwoJCXRoaXMudjIuY29weSggc291cmNlLnYyICk7CgoJCXJldHVybiB0aGlzOwoKCX07CgoJUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgoJCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKCQlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CgkJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoKCQlyZXR1cm4gZGF0YTsKCgl9OwoKCVF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgoJCXRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7CgkJdGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTsKCQl0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCWZ1bmN0aW9uIFNwbGluZUN1cnZlKCBwb2ludHMgLyogYXJyYXkgb2YgVmVjdG9yMiAqLyApIHsKCgkJQ3VydmUuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnOwoKCQl0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBbXTsKCgl9CgoJU3BsaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CglTcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGxpbmVDdXJ2ZTsKCglTcGxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7CgoJU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCgkJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCgkJdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzOwoJCXZhciBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDsKCgkJdmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApOwoJCXZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7CgoJCXZhciBwMCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBpbnRQb2ludCA6IGludFBvaW50IC0gMSBdOwoJCXZhciBwMSA9IHBvaW50c1sgaW50UG9pbnQgXTsKCQl2YXIgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdOwoJCXZhciBwMyA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyIF07CgoJCXBvaW50LnNldCgKCQkJQ2F0bXVsbFJvbSggd2VpZ2h0LCBwMC54LCBwMS54LCBwMi54LCBwMy54ICksCgkJCUNhdG11bGxSb20oIHdlaWdodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSApCgkJKTsKCgkJcmV0dXJuIHBvaW50OwoKCX07CgoJU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCXRoaXMucG9pbnRzID0gW107CgoJCWZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCXZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTsKCgkJCXRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTsKCgkJfQoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCVNwbGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgoJCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgoJCWRhdGEucG9pbnRzID0gW107CgoJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQl2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdOwoJCQlkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTsKCgkJfQoKCQlyZXR1cm4gZGF0YTsKCgl9OwoKCVNwbGluZUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHsKCgkJQ3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCgkJdGhpcy5wb2ludHMgPSBbXTsKCgkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCXZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07CgkJCXRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBwb2ludCApICk7CgoJCX0KCgkJcmV0dXJuIHRoaXM7CgoJfTsKCgoKCXZhciBDdXJ2ZXMgPSBPYmplY3QuZnJlZXplKHsKCQlBcmNDdXJ2ZTogQXJjQ3VydmUsCgkJQ2F0bXVsbFJvbUN1cnZlMzogQ2F0bXVsbFJvbUN1cnZlMywKCQlDdWJpY0JlemllckN1cnZlOiBDdWJpY0JlemllckN1cnZlLAoJCUN1YmljQmV6aWVyQ3VydmUzOiBDdWJpY0JlemllckN1cnZlMywKCQlFbGxpcHNlQ3VydmU6IEVsbGlwc2VDdXJ2ZSwKCQlMaW5lQ3VydmU6IExpbmVDdXJ2ZSwKCQlMaW5lQ3VydmUzOiBMaW5lQ3VydmUzLAoJCVF1YWRyYXRpY0JlemllckN1cnZlOiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSwKCQlRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6IFF1YWRyYXRpY0JlemllckN1cnZlMywKCQlTcGxpbmVDdXJ2ZTogU3BsaW5lQ3VydmUKCX0pOwoKCS8qKgoJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwoJICoKCSAqKi8KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCSAqCUN1cnZlZCBQYXRoIC0gYSBjdXJ2ZSBwYXRoIGlzIHNpbXBseSBhIGFycmF5IG9mIGNvbm5lY3RlZAoJICogIGN1cnZlcywgYnV0IHJldGFpbnMgdGhlIGFwaSBvZiBhIGN1cnZlCgkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJZnVuY3Rpb24gQ3VydmVQYXRoKCkgewoKCQlDdXJ2ZS5jYWxsKCB0aGlzICk7CgoJCXRoaXMudHlwZSA9ICdDdXJ2ZVBhdGgnOwoKCQl0aGlzLmN1cnZlcyA9IFtdOwoJCXRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoCgoJfQoKCUN1cnZlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogQ3VydmVQYXRoLAoKCQlhZGQ6IGZ1bmN0aW9uICggY3VydmUgKSB7CgoJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOwoKCQl9LAoKCQljbG9zZVBhdGg6IGZ1bmN0aW9uICgpIHsKCgkJCS8vIEFkZCBhIGxpbmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZAoJCQl2YXIgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTsKCQkJdmFyIGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApOwoKCQkJaWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkgewoKCQkJCXRoaXMuY3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTsKCgkJCX0KCgkJfSwKCgkJLy8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdpdGggcmVmZXJlbmNlIHRvCgkJLy8gZW50aXJlIHBhdGggZGlzdGFuY2UgYXQgdGltZSB0LAoJCS8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZToKCgkJLy8gMS4gTGVuZ3RoIG9mIGVhY2ggc3ViIHBhdGggaGF2ZSB0byBiZSBrbm93bgoJCS8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZQoJCS8vIDMuIEdldCB0IGZvciB0aGUgY3VydmUKCQkvLyA0LiBSZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh0JykKCgkJZ2V0UG9pbnQ6IGZ1bmN0aW9uICggdCApIHsKCgkJCXZhciBkID0gdCAqIHRoaXMuZ2V0TGVuZ3RoKCk7CgkJCXZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpOwoJCQl2YXIgaSA9IDA7CgoJCQkvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVzIHBvaW50cy4KCgkJCXdoaWxlICggaSA8IGN1cnZlTGVuZ3Rocy5sZW5ndGggKSB7CgoJCQkJaWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkgewoKCQkJCQl2YXIgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDsKCQkJCQl2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdOwoKCQkJCQl2YXIgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpOwoJCQkJCXZhciB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7CgoJCQkJCXJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7CgoJCQkJfQoKCQkJCWkgKys7CgoJCQl9CgoJCQlyZXR1cm4gbnVsbDsKCgkJCS8vIGxvb3Agd2hlcmUgc3VtICE9IDAsIHN1bSA+IGQgLCBzdW0rMSA8ZAoKCQl9LAoKCQkvLyBXZSBjYW5ub3QgdXNlIHRoZSBkZWZhdWx0IFRIUkVFLkN1cnZlIGdldFBvaW50KCkgd2l0aCBnZXRMZW5ndGgoKSBiZWNhdXNlIGluCgkJLy8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoCgkJLy8gZ2V0UG9pbnQoKSBkZXBlbmRzIG9uIGdldExlbmd0aAoKCQlnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTsKCQkJcmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdOwoKCQl9LAoKCQkvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuCgkJdXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CgkJCXRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDsKCQkJdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTsKCgkJfSwKCgkJLy8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtCgkJLy8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC4KCgkJZ2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoCgoJCQlpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkgewoKCQkJCXJldHVybiB0aGlzLmNhY2hlTGVuZ3RoczsKCgkJCX0KCgkJCS8vIEdldCBsZW5ndGggb2Ygc3ViLWN1cnZlCgkJCS8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheQoKCQkJdmFyIGxlbmd0aHMgPSBbXSwgc3VtcyA9IDA7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTsKCQkJCWxlbmd0aHMucHVzaCggc3VtcyApOwoKCQkJfQoKCQkJdGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzOwoKCQkJcmV0dXJuIGxlbmd0aHM7CgoJCX0sCgoJCWdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgoJCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDA7CgoJCQl2YXIgcG9pbnRzID0gW107CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPD0gZGl2aXNpb25zOyBpICsrICkgewoKCQkJCXBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTsKCgkJCX0KCgkJCWlmICggdGhpcy5hdXRvQ2xvc2UgKSB7CgoJCQkJcG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7CgoJCQl9CgoJCQlyZXR1cm4gcG9pbnRzOwoKCQl9LAoKCQlnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKCQkJZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEyOwoKCQkJdmFyIHBvaW50cyA9IFtdLCBsYXN0OwoKCQkJZm9yICggdmFyIGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJdmFyIGN1cnZlID0gY3VydmVzWyBpIF07CgkJCQl2YXIgcmVzb2x1dGlvbiA9ICggY3VydmUgJiYgY3VydmUuaXNFbGxpcHNlQ3VydmUgKSA/IGRpdmlzaW9ucyAqIDIKCQkJCQk6ICggY3VydmUgJiYgY3VydmUuaXNMaW5lQ3VydmUgKSA/IDEKCQkJCQkJOiAoIGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUgKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGgKCQkJCQkJCTogZGl2aXNpb25zOwoKCQkJCXZhciBwdHMgPSBjdXJ2ZS5nZXRQb2ludHMoIHJlc29sdXRpb24gKTsKCgkJCQlmb3IgKCB2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqICsrICkgewoKCQkJCQl2YXIgcG9pbnQgPSBwdHNbIGogXTsKCgkJCQkJaWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzCgoJCQkJCXBvaW50cy5wdXNoKCBwb2ludCApOwoJCQkJCWxhc3QgPSBwb2ludDsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICEgcG9pbnRzWyBwb2ludHMubGVuZ3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHsKCgkJCQlwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTsKCgkJCX0KCgkJCXJldHVybiBwb2ludHM7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLmN1cnZlcyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciBjdXJ2ZSA9IHNvdXJjZS5jdXJ2ZXNbIGkgXTsKCgkJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZS5jbG9uZSgpICk7CgoJCQl9CgoJCQl0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKCQkJZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTsKCQkJZGF0YS5jdXJ2ZXMgPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTsKCQkJCWRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7CgoJCQl9CgoJCQlyZXR1cm4gZGF0YTsKCgkJfSwKCgkJZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHsKCgkJCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgoJCQl0aGlzLmF1dG9DbG9zZSA9IGpzb24uYXV0b0Nsb3NlOwoJCQl0aGlzLmN1cnZlcyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgY3VydmUgPSBqc29uLmN1cnZlc1sgaSBdOwoJCQkJdGhpcy5jdXJ2ZXMucHVzaCggbmV3IEN1cnZlc1sgY3VydmUudHlwZSBdKCkuZnJvbUpTT04oIGN1cnZlICkgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwoJICogQ3JlYXRlcyBmcmVlIGZvcm0gMmQgcGF0aCB1c2luZyBzZXJpZXMgb2YgcG9pbnRzLCBsaW5lcyBvciBjdXJ2ZXMuCgkgKiovCgoJZnVuY3Rpb24gUGF0aCggcG9pbnRzICkgewoKCQlDdXJ2ZVBhdGguY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnUGF0aCc7CgoJCXRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTsKCgkJaWYgKCBwb2ludHMgKSB7CgoJCQl0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApOwoKCQl9CgoJfQoKCVBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBQYXRoLAoKCQlzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHsKCgkJCXRoaXMubW92ZVRvKCBwb2ludHNbIDAgXS54LCBwb2ludHNbIDAgXS55ICk7CgoJCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl0aGlzLmxpbmVUbyggcG9pbnRzWyBpIF0ueCwgcG9pbnRzWyBpIF0ueSApOwoKCQkJfQoKCQl9LAoKCQltb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHsKCgkJCXRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nPwoKCQl9LAoKCQlsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHsKCgkJCXZhciBjdXJ2ZSA9IG5ldyBMaW5lQ3VydmUoIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBWZWN0b3IyKCB4LCB5ICkgKTsKCQkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKCgkJCXRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOwoKCQl9LAoKCQlxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHsKCgkJCXZhciBjdXJ2ZSA9IG5ldyBRdWFkcmF0aWNCZXppZXJDdXJ2ZSgKCQkJCXRoaXMuY3VycmVudFBvaW50LmNsb25lKCksCgkJCQluZXcgVmVjdG9yMiggYUNQeCwgYUNQeSApLAoJCQkJbmV3IFZlY3RvcjIoIGFYLCBhWSApCgkJCSk7CgoJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOwoKCQkJdGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTsKCgkJfSwKCgkJYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkgewoKCQkJdmFyIGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoCgkJCQl0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLAoJCQkJbmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLAoJCQkJbmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLAoJCQkJbmV3IFZlY3RvcjIoIGFYLCBhWSApCgkJCSk7CgoJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOwoKCQkJdGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTsKCgkJfSwKCgkJc3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgLypBcnJheSBvZiBWZWN0b3IqLyApIHsKCgkJCXZhciBucHRzID0gWyB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpIF0uY29uY2F0KCBwdHMgKTsKCgkJCXZhciBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApOwoJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOwoKCQkJdGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7CgoJCX0sCgoJCWFyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7CgoJCQl2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54OwoJCQl2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55OwoKCQkJdGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsCgkJCQlhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7CgoJCX0sCgoJCWFic2FyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7CgoJCQl0aGlzLmFic2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApOwoKCQl9LAoKCQllbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkgewoKCQkJdmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDsKCQkJdmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTsKCgkJCXRoaXMuYWJzZWxsaXBzZSggYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7CgoJCX0sCgoJCWFic2VsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7CgoJCQl2YXIgY3VydmUgPSBuZXcgRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApOwoKCQkJaWYgKCB0aGlzLmN1cnZlcy5sZW5ndGggPiAwICkgewoKCQkJCS8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luCgkJCQl2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7CgoJCQkJaWYgKCAhIGZpcnN0UG9pbnQuZXF1YWxzKCB0aGlzLmN1cnJlbnRQb2ludCApICkgewoKCQkJCQl0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTsKCgkJCQl9CgoJCQl9CgoJCQl0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApOwoKCQkJdmFyIGxhc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAxICk7CgkJCXRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCUN1cnZlUGF0aC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJCXRoaXMuY3VycmVudFBvaW50LmNvcHkoIHNvdXJjZS5jdXJyZW50UG9pbnQgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBkYXRhID0gQ3VydmVQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKCQkJZGF0YS5jdXJyZW50UG9pbnQgPSB0aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7CgoJCQlyZXR1cm4gZGF0YTsKCgkJfSwKCgkJZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHsKCgkJCUN1cnZlUGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApOwoKCQkJdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KCBqc29uLmN1cnJlbnRQb2ludCApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCgkgKiBEZWZpbmVzIGEgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMuCgkgKiovCgoJLy8gU1RFUCAxIENyZWF0ZSBhIHBhdGguCgkvLyBTVEVQIDIgVHVybiBwYXRoIGludG8gc2hhcGUuCgkvLyBTVEVQIDMgRXh0cnVkZUdlb21ldHJ5IHRha2VzIGluIFNoYXBlL1NoYXBlcwoJLy8gU1RFUCAzYSAtIEV4dHJhY3QgcG9pbnRzIGZyb20gZWFjaCBzaGFwZSwgdHVybiB0byB2ZXJ0aWNlcwoJLy8gU1RFUCAzYiAtIFRyaWFuZ3VsYXRlIGVhY2ggc2hhcGUsIGFkZCBmYWNlcy4KCglmdW5jdGlvbiBTaGFwZSggcG9pbnRzICkgewoKCQlQYXRoLmNhbGwoIHRoaXMsIHBvaW50cyApOwoKCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKCgkJdGhpcy50eXBlID0gJ1NoYXBlJzsKCgkJdGhpcy5ob2xlcyA9IFtdOwoKCX0KCglTaGFwZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQYXRoLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBTaGFwZSwKCgkJZ2V0UG9pbnRzSG9sZXM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKCQkJdmFyIGhvbGVzUHRzID0gW107CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJaG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApOwoKCQkJfQoKCQkJcmV0dXJuIGhvbGVzUHRzOwoKCQl9LAoKCQkvLyBnZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcikKCgkJZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgoJCQlyZXR1cm4gewoKCQkJCXNoYXBlOiB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICksCgkJCQlob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyggZGl2aXNpb25zICkKCgkJCX07CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJUGF0aC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJCXRoaXMuaG9sZXMgPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciBob2xlID0gc291cmNlLmhvbGVzWyBpIF07CgoJCQkJdGhpcy5ob2xlcy5wdXNoKCBob2xlLmNsb25lKCkgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBkYXRhID0gUGF0aC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCgkJCWRhdGEudXVpZCA9IHRoaXMudXVpZDsKCQkJZGF0YS5ob2xlcyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciBob2xlID0gdGhpcy5ob2xlc1sgaSBdOwoJCQkJZGF0YS5ob2xlcy5wdXNoKCBob2xlLnRvSlNPTigpICk7CgoJCQl9CgoJCQlyZXR1cm4gZGF0YTsKCgkJfSwKCgkJZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHsKCgkJCVBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCgkJCXRoaXMudXVpZCA9IGpzb24udXVpZDsKCQkJdGhpcy5ob2xlcyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCXZhciBob2xlID0ganNvbi5ob2xlc1sgaSBdOwoJCQkJdGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBMaWdodCggY29sb3IsIGludGVuc2l0eSApIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnTGlnaHQnOwoKCQl0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApOwoJCXRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxOwoKCQl0aGlzLnJlY2VpdmVTaGFkb3cgPSB1bmRlZmluZWQ7CgoJfQoKCUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBMaWdodCwKCgkJaXNMaWdodDogdHJ1ZSwKCgkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCQlPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CgkJCXRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCgkJCXZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgoJCQlkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7CgkJCWRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5OwoKCQkJaWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7CgoJCQlpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTsKCQkJaWYgKCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7CgkJCWlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5OwoJCQlpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTsKCgkJCWlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpOwoKCQkJcmV0dXJuIGRhdGE7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0KCBza3lDb2xvciwgZ3JvdW5kQ29sb3IsIGludGVuc2l0eSApIHsKCgkJTGlnaHQuY2FsbCggdGhpcywgc2t5Q29sb3IsIGludGVuc2l0eSApOwoKCQl0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JzsKCgkJdGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkOwoKCQl0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApOwoJCXRoaXMudXBkYXRlTWF0cml4KCk7CgoJCXRoaXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7CgoJfQoKCUhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogSGVtaXNwaGVyZUxpZ2h0LAoKCQlpc0hlbWlzcGhlcmVMaWdodDogdHJ1ZSwKCgkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCQlMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJCXRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBMaWdodFNoYWRvdyggY2FtZXJhICkgewoKCQl0aGlzLmNhbWVyYSA9IGNhbWVyYTsKCgkJdGhpcy5iaWFzID0gMDsKCQl0aGlzLnJhZGl1cyA9IDE7CgoJCXRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApOwoKCQl0aGlzLm1hcCA9IG51bGw7CgkJdGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpOwoKCX0KCglPYmplY3QuYXNzaWduKCBMaWdodFNoYWRvdy5wcm90b3R5cGUsIHsKCgkJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgoJCQl0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xvbmUoKTsKCgkJCXRoaXMuYmlhcyA9IHNvdXJjZS5iaWFzOwoJCQl0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7CgoJCQl0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKCQl9LAoKCQl0b0pTT046IGZ1bmN0aW9uICgpIHsKCgkJCXZhciBvYmplY3QgPSB7fTsKCgkJCWlmICggdGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7CgkJCWlmICggdGhpcy5yYWRpdXMgIT09IDEgKSBvYmplY3QucmFkaXVzID0gdGhpcy5yYWRpdXM7CgkJCWlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpOwoKCQkJb2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7CgkJCWRlbGV0ZSBvYmplY3QuY2FtZXJhLm1hdHJpeDsKCgkJCXJldHVybiBvYmplY3Q7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gU3BvdExpZ2h0U2hhZG93KCkgewoKCQlMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7CgoJfQoKCVNwb3RMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogU3BvdExpZ2h0U2hhZG93LAoKCQlpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSwKCgkJdXBkYXRlOiBmdW5jdGlvbiAoIGxpZ2h0ICkgewoKCQkJdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhOwoKCQkJdmFyIGZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogbGlnaHQuYW5nbGU7CgkJCXZhciBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0OwoJCQl2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjsKCgkJCWlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7CgoJCQkJY2FtZXJhLmZvdiA9IGZvdjsKCQkJCWNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7CgkJCQljYW1lcmEuZmFyID0gZmFyOwoJCQkJY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCgkJCX0KCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkgewoKCQlMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7CgoJCXRoaXMudHlwZSA9ICdTcG90TGlnaHQnOwoKCQl0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApOwoJCXRoaXMudXBkYXRlTWF0cml4KCk7CgoJCXRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7CgoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywgewoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQkvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuCgkJCQkvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZgoJCQkJcmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTsKCgkJCX0sCgkJCXNldDogZnVuY3Rpb24gKCBwb3dlciApIHsKCgkJCQkvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuCgkJCQkvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZgoJCQkJdGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7CgoJCQl9CgkJfSApOwoKCQl0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7CgkJdGhpcy5hbmdsZSA9ICggYW5nbGUgIT09IHVuZGVmaW5lZCApID8gYW5nbGUgOiBNYXRoLlBJIC8gMzsKCQl0aGlzLnBlbnVtYnJhID0gKCBwZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgPyBwZW51bWJyYSA6IDA7CgkJdGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxOwkvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuCgoJCXRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpOwoKCX0KCglTcG90TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IFNwb3RMaWdodCwKCgkJaXNTcG90TGlnaHQ6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlOwoJCQl0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlOwoJCQl0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhOwoJCQl0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5OwoKCQkJdGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7CgoJCQl0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCglmdW5jdGlvbiBQb2ludExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgZGVjYXkgKSB7CgoJCUxpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTsKCgkJdGhpcy50eXBlID0gJ1BvaW50TGlnaHQnOwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJLy8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLgoJCQkJLy8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGYKCQkJCXJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJOwoKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiAoIHBvd2VyICkgewoKCQkJCS8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KCQkJCS8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnIucGRmCgkJCQl0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApOwoKCQkJfQoJCX0gKTsKCgkJdGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwOwoJCXRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTsJLy8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLgoKCQl0aGlzLnNoYWRvdyA9IG5ldyBMaWdodFNoYWRvdyggbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA5MCwgMSwgMC41LCA1MDAgKSApOwoKCX0KCglQb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBQb2ludExpZ2h0LAoKCQlpc1BvaW50TGlnaHQ6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlOwoJCQl0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5OwoKCQkJdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCApIHsKCgkJTGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTsKCgl9CgoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodFNoYWRvdwoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodCggY29sb3IsIGludGVuc2l0eSApIHsKCgkJTGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApOwoKCQl0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7CgoJCXRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7CgkJdGhpcy51cGRhdGVNYXRyaXgoKTsKCgkJdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTsKCgkJdGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpOwoKCX0KCglEaXJlY3Rpb25hbExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0LAoKCQlpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTsKCgkJCXRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gQW1iaWVudExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkgewoKCQlMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7CgoJCXRoaXMudHlwZSA9ICdBbWJpZW50TGlnaHQnOwoKCQl0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7CgoJfQoKCUFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogQW1iaWVudExpZ2h0LAoKCQlpc0FtYmllbnRMaWdodDogdHJ1ZQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb24KCSAqLwoKCWZ1bmN0aW9uIFJlY3RBcmVhTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKSB7CgoJCUxpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTsKCgkJdGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHQnOwoKCQl0aGlzLnBvc2l0aW9uLnNldCggMCwgMSwgMCApOwoJCXRoaXMudXBkYXRlTWF0cml4KCk7CgoJCXRoaXMud2lkdGggPSAoIHdpZHRoICE9PSB1bmRlZmluZWQgKSA/IHdpZHRoIDogMTA7CgkJdGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDsKCgkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IGRpc3RhbmNlL2RlY2F5CgoJCS8vIFRPRE8gKGFiZWxuYXRpb24pOiB1cGRhdGUgbWV0aG9kIGZvciBSZWN0QXJlYUxpZ2h0IHRvIHVwZGF0ZSB0cmFuc2Zvcm0gdG8gbG9va2F0IHRhcmdldAoKCQkvLyBUT0RPIChhYmVsbmF0aW9uKTogc2hhZG93cwoKCX0KCgkvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCB1cGRhdGUgd2hlbiBsaWdodCBzaGFwZSBpcyBjaGFuZ2VkCglSZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBSZWN0QXJlYUxpZ2h0LAoKCQlpc1JlY3RBcmVhTGlnaHQ6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLndpZHRoID0gc291cmNlLndpZHRoOwoJCQl0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgoJCQl2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOwoKCQkJZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoOwoJCQlkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdodDsKCgkJCXJldHVybiBkYXRhOwoKCQl9CgoJfSApOwoKCS8qKgoJICoKCSAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5ncwoJICoKCSAqCgkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwoJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBTdHJpbmdLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkgewoKCQlLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsKCgl9CgoJU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBTdHJpbmdLZXlmcmFtZVRyYWNrLAoKCQlWYWx1ZVR5cGVOYW1lOiAnc3RyaW5nJywKCQlWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LAoKCQlEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSwKCgkJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsCgoJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkCgoJfSApOwoKCS8qKgoJICoKCSAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuCgkgKgoJICoKCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCgkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KCSAqIEBhdXRob3IgdHNjaHcKCSAqLwoKCWZ1bmN0aW9uIEJvb2xlYW5LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzICkgewoKCQlLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTsKCgl9CgoJQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogQm9vbGVhbktleWZyYW1lVHJhY2ssCgoJCVZhbHVlVHlwZU5hbWU6ICdib29sJywKCQlWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LAoKCQlEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSwKCgkJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsCgkJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQKCgkJLy8gTm90ZTogQWN0dWFsbHkgdGhpcyB0cmFjayBjb3VsZCBoYXZlIGEgb3B0aW1pemVkIC8gY29tcHJlc3NlZAoJCS8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0CgkJLy8gY29tcHV0ZXMgImZpcnN0VmFsdWUgXiBpc09kZCggaW5kZXggKSIuCgoJfSApOwoKCS8qKgoJICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBpbnRlcnBvbGFudHMgb3ZlciBwYXJhbWV0cmljIHNhbXBsZXMuCgkgKgoJICogVGhlIHBhcmFtZXRlciBkb21haW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRpbWUgb3IgYSBwYXRoCgkgKiBhbG9uZyBhIGN1cnZlIGRlZmluZWQgYnkgdGhlIGRhdGEuCgkgKgoJICogVGhlIHNhbXBsZSB2YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFsaXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5CgkgKiBhcHBseSBzcGVjaWFsIGludGVycHJldGF0aW9ucyB0byB0aGUgZGF0YS4KCSAqCgkgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0aG9kLCBkZWZlcnJpbmcKCSAqIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0byBkZXJpdmVkIGNsYXNzZXMuCgkgKgoJICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nlc3MgY3Jvc3NpbmcgYXQgbW9zdCB0d28gcG9pbnRzCgkgKiBhbmQgTyhsb2cgTikgZm9yIHJhbmRvbSBhY2Nlc3MsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMuCgkgKgoJICogUmVmZXJlbmNlczoKCSAqCgkgKiAJCWh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWwKCSAqCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKCgkJdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7CgkJdGhpcy5fY2FjaGVkSW5kZXggPSAwOwoKCQl0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8KCQkJcmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApOwoJCXRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzOwoJCXRoaXMudmFsdWVTaXplID0gc2FtcGxlU2l6ZTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7CgoJCWV2YWx1YXRlOiBmdW5jdGlvbiAoIHQgKSB7CgoJCQl2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucywKCQkJCWkxID0gdGhpcy5fY2FjaGVkSW5kZXgsCgoJCQkJdDEgPSBwcFsgaTEgXSwKCQkJCXQwID0gcHBbIGkxIC0gMSBdOwoKCQkJdmFsaWRhdGVfaW50ZXJ2YWw6IHsKCgkJCQlzZWVrOiB7CgoJCQkJCXZhciByaWdodDsKCgkJCQkJbGluZWFyX3NjYW46IHsKCgkJCQkJCS8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvMwoJCQkJCQkvLy0gc2xvd2VyIGNvZGU6CgkJCQkJCS8vLQoJCQkJCQkvLy0gCQkJCWlmICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQlmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkgewoKCQkJCQkJCWZvciAoIHZhciBnaXZlVXBBdCA9IGkxICsgMjsgOyApIHsKCgkJCQkJCQkJaWYgKCB0MSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQkJCQkJaWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47CgoJCQkJCQkJCQkvLyBhZnRlciBlbmQKCgkJCQkJCQkJCWkxID0gcHAubGVuZ3RoOwoJCQkJCQkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IGkxOwoJCQkJCQkJCQlyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdCwgdDAgKTsKCgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3AKCgkJCQkJCQkJdDAgPSB0MTsKCQkJCQkJCQl0MSA9IHBwWyArKyBpMSBdOwoKCQkJCQkJCQlpZiAoIHQgPCB0MSApIHsKCgkJCQkJCQkJCS8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsCgkJCQkJCQkJCWJyZWFrIHNlZWs7CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQkJLy8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbmRleAoJCQkJCQkJcmlnaHQgPSBwcC5sZW5ndGg7CgkJCQkJCQlicmVhayBsaW5lYXJfc2NhbjsKCgkJCQkJCX0KCgkJCQkJCS8vLSBzbG93ZXIgY29kZToKCQkJCQkJLy8tCQkJCQlpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQlpZiAoICEgKCB0ID49IHQwICkgKSB7CgoJCQkJCQkJLy8gbG9vcGluZz8KCgkJCQkJCQl2YXIgdDFnbG9iYWwgPSBwcFsgMSBdOwoKCQkJCQkJCWlmICggdCA8IHQxZ2xvYmFsICkgewoKCQkJCQkJCQlpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzCgkJCQkJCQkJdDAgPSB0MWdsb2JhbDsKCgkJCQkJCQl9CgoJCQkJCQkJLy8gbGluZWFyIHJldmVyc2Ugc2NhbgoKCQkJCQkJCWZvciAoIHZhciBnaXZlVXBBdCA9IGkxIC0gMjsgOyApIHsKCgkJCQkJCQkJaWYgKCB0MCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQkJCQkJLy8gYmVmb3JlIHN0YXJ0CgoJCQkJCQkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IDA7CgkJCQkJCQkJCXJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTsKCgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3AKCgkJCQkJCQkJdDEgPSB0MDsKCQkJCQkJCQl0MCA9IHBwWyAtLSBpMSAtIDEgXTsKCgkJCQkJCQkJaWYgKCB0ID49IHQwICkgewoKCQkJCQkJCQkJLy8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWwKCQkJCQkJCQkJYnJlYWsgc2VlazsKCgkJCQkJCQkJfQoKCQkJCQkJCX0KCgkJCQkJCQkvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaW5kZXgKCQkJCQkJCXJpZ2h0ID0gaTE7CgkJCQkJCQlpMSA9IDA7CgkJCQkJCQlicmVhayBsaW5lYXJfc2NhbjsKCgkJCQkJCX0KCgkJCQkJCS8vIHRoZSBpbnRlcnZhbCBpcyB2YWxpZAoKCQkJCQkJYnJlYWsgdmFsaWRhdGVfaW50ZXJ2YWw7CgoJCQkJCX0gLy8gbGluZWFyIHNjYW4KCgkJCQkJLy8gYmluYXJ5IHNlYXJjaAoKCQkJCQl3aGlsZSAoIGkxIDwgcmlnaHQgKSB7CgoJCQkJCQl2YXIgbWlkID0gKCBpMSArIHJpZ2h0ICkgPj4+IDE7CgoJCQkJCQlpZiAoIHQgPCBwcFsgbWlkIF0gKSB7CgoJCQkJCQkJcmlnaHQgPSBtaWQ7CgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCWkxID0gbWlkICsgMTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQl0MSA9IHBwWyBpMSBdOwoJCQkJCXQwID0gcHBbIGkxIC0gMSBdOwoKCQkJCQkvLyBjaGVjayBib3VuZGFyeSBjYXNlcywgYWdhaW4KCgkJCQkJaWYgKCB0MCA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQkJdGhpcy5fY2FjaGVkSW5kZXggPSAwOwoJCQkJCQlyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7CgoJCQkJCX0KCgkJCQkJaWYgKCB0MSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQkJaTEgPSBwcC5sZW5ndGg7CgkJCQkJCXRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CgkJCQkJCXJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0MCwgdCApOwoKCQkJCQl9CgoJCQkJfSAvLyBzZWVrCgoJCQkJdGhpcy5fY2FjaGVkSW5kZXggPSBpMTsKCgkJCQl0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTsKCgkJCX0gLy8gdmFsaWRhdGVfaW50ZXJ2YWwKCgkJCXJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApOwoKCQl9LAoKCQlzZXR0aW5nczogbnVsbCwgLy8gb3B0aW9uYWwsIHN1YmNsYXNzLXNwZWNpZmljIHNldHRpbmdzIHN0cnVjdHVyZQoJCS8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2VudHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLgoKCQkvLyAtLS0gUHJvdGVjdGVkIGludGVyZmFjZQoKCQlEZWZhdWx0U2V0dGluZ3NfOiB7fSwKCgkJZ2V0U2V0dGluZ3NfOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187CgoJCX0sCgoJCWNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uICggaW5kZXggKSB7CgoJCQkvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXIKCgkJCXZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwKCQkJCXZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLAoJCQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCgkJCQlvZmZzZXQgPSBpbmRleCAqIHN0cmlkZTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgewoKCQkJCXJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07CgoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0OwoKCQl9LAoKCQkvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6CgoJCWludGVycG9sYXRlXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQsIHQxICovICkgewoKCQkJdGhyb3cgbmV3IEVycm9yKCAnY2FsbCB0byBhYnN0cmFjdCBtZXRob2QnICk7CgkJCS8vIGltcGxlbWVudGF0aW9ucyBzaGFsbCByZXR1cm4gdGhpcy5yZXN1bHRCdWZmZXIKCgkJfSwKCgkJaW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQxICovICkgewoKCQkJLy8gZW1wdHkKCgkJfQoKCX0gKTsKCgkvLyFcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhCglPYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHsKCgkJLy8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXIKCQliZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLAoKCQkvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXIKCQlhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLAoKCX0gKTsKCgkvKioKCSAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LgoJICoKCSAqIEBhdXRob3IgdHNjaHcKCSAqLwoKCWZ1bmN0aW9uIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKCgkJSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOwoKCX0KCglRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCwKCgkJaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7CgoJCQl2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsCgkJCQl2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcywKCQkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAoKCQkJCW9mZnNldCA9IGkxICogc3RyaWRlLAoKCQkJCWFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApOwoKCQkJZm9yICggdmFyIGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkgewoKCQkJCVF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTsKCgkJCX0KCgkJCXJldHVybiByZXN1bHQ7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKgoJICogQSBUcmFjayBvZiBxdWF0ZXJuaW9uIGtleWZyYW1lIHZhbHVlcy4KCSAqCgkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwoJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKCgkJS2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CgoJfQoKCVF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLAoKCQlWYWx1ZVR5cGVOYW1lOiAncXVhdGVybmlvbicsCgoJCS8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWQKCgkJRGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLAoKCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkgewoKCQkJcmV0dXJuIG5ldyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTsKCgkJfSwKCgkJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQgLy8gbm90IHlldCBpbXBsZW1lbnRlZAoKCX0gKTsKCgkvKioKCSAqCgkgKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvci4KCSAqCgkgKgoJICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KCSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwoJICogQGF1dGhvciB0c2NodwoJICovCgoJZnVuY3Rpb24gQ29sb3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkgewoKCQlLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsKCgl9CgoJQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IENvbG9yS2V5ZnJhbWVUcmFjaywKCgkJVmFsdWVUeXBlTmFtZTogJ2NvbG9yJwoKCQkvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkCgoJCS8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZAoKCQkvLyBOb3RlOiBWZXJ5IGJhc2ljIGltcGxlbWVudGF0aW9uIGFuZCBub3RoaW5nIHNwZWNpYWwgeWV0LgoJCS8vIEhvd2V2ZXIsIHRoaXMgaXMgdGhlIHBsYWNlIGZvciBjb2xvciBzcGFjZSBwYXJhbWV0ZXJpemF0aW9uLgoKCX0gKTsKCgkvKioKCSAqCgkgKiBBIFRyYWNrIG9mIG51bWVyaWMga2V5ZnJhbWUgdmFsdWVzLgoJICoKCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCgkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KCSAqIEBhdXRob3IgdHNjaHcKCSAqLwoKCWZ1bmN0aW9uIE51bWJlcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CgoJCUtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApOwoKCX0KCglOdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IE51bWJlcktleWZyYW1lVHJhY2ssCgoJCVZhbHVlVHlwZU5hbWU6ICdudW1iZXInCgoJCS8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWQKCgkJLy8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkCgoJfSApOwoKCS8qKgoJICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC4KCSAqCgkgKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlCgkgKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zCgkgKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC4KCSAqCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkgewoKCQlJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7CgoJCXRoaXMuX3dlaWdodFByZXYgPSAtIDA7CgkJdGhpcy5fb2Zmc2V0UHJldiA9IC0gMDsKCQl0aGlzLl93ZWlnaHROZXh0ID0gLSAwOwoJCXRoaXMuX29mZnNldE5leHQgPSAtIDA7CgoJfQoKCUN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IEN1YmljSW50ZXJwb2xhbnQsCgoJCURlZmF1bHRTZXR0aW5nc186IHsKCgkJCWVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLAoJCQllbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcKCgkJfSwKCgkJaW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkgewoKCQkJdmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsCgkJCQlpUHJldiA9IGkxIC0gMiwKCQkJCWlOZXh0ID0gaTEgKyAxLAoKCQkJCXRQcmV2ID0gcHBbIGlQcmV2IF0sCgkJCQl0TmV4dCA9IHBwWyBpTmV4dCBdOwoKCQkJaWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkgewoKCQkJCXN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQgKSB7CgoJCQkJCWNhc2UgWmVyb1Nsb3BlRW5kaW5nOgoKCQkJCQkJLy8gZicodDApID0gMAoJCQkJCQlpUHJldiA9IGkxOwoJCQkJCQl0UHJldiA9IDIgKiB0MCAtIHQxOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgV3JhcEFyb3VuZEVuZGluZzoKCgkJCQkJCS8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQoJCQkJCQlpUHJldiA9IHBwLmxlbmd0aCAtIDI7CgkJCQkJCXRQcmV2ID0gdDAgKyBwcFsgaVByZXYgXSAtIHBwWyBpUHJldiArIDEgXTsKCgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCgoJCQkJCQkvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmUKCQkJCQkJaVByZXYgPSBpMTsKCQkJCQkJdFByZXYgPSB0MTsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJc3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7CgoJCQkJCWNhc2UgWmVyb1Nsb3BlRW5kaW5nOgoKCQkJCQkJLy8gZicodE4pID0gMAoJCQkJCQlpTmV4dCA9IGkxOwoJCQkJCQl0TmV4dCA9IDIgKiB0MSAtIHQwOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgV3JhcEFyb3VuZEVuZGluZzoKCgkJCQkJCS8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQoJCQkJCQlpTmV4dCA9IDE7CgkJCQkJCXROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTsKCgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCgoJCQkJCQkvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lCgkJCQkJCWlOZXh0ID0gaTEgLSAxOwoJCQkJCQl0TmV4dCA9IHQwOwoKCQkJCX0KCgkJCX0KCgkJCXZhciBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSwKCQkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplOwoKCQkJdGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApOwoJCQl0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKCB0TmV4dCAtIHQxICk7CgkJCXRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTsKCQkJdGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlOwoKCQl9LAoKCQlpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHsKCgkJCXZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwKCQkJCXZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLAoJCQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCgoJCQkJbzEgPSBpMSAqIHN0cmlkZSwJCW8wID0gbzEgLSBzdHJpZGUsCgkJCQlvUCA9IHRoaXMuX29mZnNldFByZXYsIAlvTiA9IHRoaXMuX29mZnNldE5leHQsCgkJCQl3UCA9IHRoaXMuX3dlaWdodFByZXYsCXdOID0gdGhpcy5fd2VpZ2h0TmV4dCwKCgkJCQlwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLAoJCQkJcHAgPSBwICogcCwKCQkJCXBwcCA9IHBwICogcDsKCgkJCS8vIGV2YWx1YXRlIHBvbHlub21pYWxzCgoJCQl2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7CgkJCXZhciBzMCA9ICggMSArIHdQICkgKiBwcHAgKyAoIC0gMS41IC0gMiAqIHdQICkgKiBwcCArICggLSAwLjUgKyB3UCApICogcCArIDE7CgkJCXZhciBzMSA9ICggLSAxIC0gd04gKSAqIHBwcCArICggMS41ICsgd04gKSAqIHBwICsgMC41ICogcDsKCQkJdmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwOwoKCQkJLy8gY29tYmluZSBkYXRhIGxpbmVhcmx5CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHsKCgkJCQlyZXN1bHRbIGkgXSA9CgkJCQkJCXNQICogdmFsdWVzWyBvUCArIGkgXSArCgkJCQkJCXMwICogdmFsdWVzWyBvMCArIGkgXSArCgkJCQkJCXMxICogdmFsdWVzWyBvMSArIGkgXSArCgkJCQkJCXNOICogdmFsdWVzWyBvTiArIGkgXTsKCgkJCX0KCgkJCXJldHVybiByZXN1bHQ7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKCgkJSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOwoKCX0KCglMaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogTGluZWFySW50ZXJwb2xhbnQsCgoJCWludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkgewoKCQkJdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLAoJCQkJdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsCgkJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKCgkJCQlvZmZzZXQxID0gaTEgKiBzdHJpZGUsCgkJCQlvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSwKCgkJCQl3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLAoJCQkJd2VpZ2h0MCA9IDEgLSB3ZWlnaHQxOwoKCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CgoJCQkJcmVzdWx0WyBpIF0gPQoJCQkJCQl2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICsKCQkJCQkJdmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTsKCgkJCX0KCgkJCXJldHVybiByZXN1bHQ7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKgoJICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZwoJICogdGhlIHBhcmFtZXRlci4KCSAqCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBEaXNjcmV0ZUludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkgewoKCQlJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7CgoJfQoKCURpc2NyZXRlSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IERpc2NyZXRlSW50ZXJwb2xhbnQsCgoJCWludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkgewoKCQkJcmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIHRzY2h3CgkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwoJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCgkgKi8KCgl2YXIgQW5pbWF0aW9uVXRpbHMgPSB7CgoJCS8vIHNhbWUgYXMgQXJyYXkucHJvdG90eXBlLnNsaWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXMKCQlhcnJheVNsaWNlOiBmdW5jdGlvbiAoIGFycmF5LCBmcm9tLCB0byApIHsKCgkJCWlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCBhcnJheSApICkgewoKCQkJCS8vIGluIGlvczkgYXJyYXkuc3ViYXJyYXkoZnJvbSwgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBlbXB0eSBhcnJheQoJCQkJLy8gYnV0IGFycmF5LnN1YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdAoJCQkJcmV0dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7CgoJCQl9CgoJCQlyZXR1cm4gYXJyYXkuc2xpY2UoIGZyb20sIHRvICk7CgoJCX0sCgoJCS8vIGNvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZQoJCWNvbnZlcnRBcnJheTogZnVuY3Rpb24gKCBhcnJheSwgdHlwZSwgZm9yY2VDbG9uZSApIHsKCgkJCWlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVmaW5lZCcgYW5kICdudWxsJyBwYXNzCgkJCQkJISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5OwoKCQkJaWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7CgoJCQkJcmV0dXJuIG5ldyB0eXBlKCBhcnJheSApOyAvLyBjcmVhdGUgdHlwZWQgYXJyYXkKCgkJCX0KCgkJCXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5CgoJCX0sCgoJCWlzVHlwZWRBcnJheTogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgoJCQlyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJgoJCQkJCSEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApOwoKCQl9LAoKCQkvLyByZXR1cm5zIGFuIGFycmF5IGJ5IHdoaWNoIHRpbWVzIGFuZCB2YWx1ZXMgY2FuIGJlIHNvcnRlZAoJCWdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7CgoJCQlmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHsKCgkJCQlyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07CgoJCQl9CgoJCQl2YXIgbiA9IHRpbWVzLmxlbmd0aDsKCQkJdmFyIHJlc3VsdCA9IG5ldyBBcnJheSggbiApOwoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7CgoJCQlyZXN1bHQuc29ydCggY29tcGFyZVRpbWUgKTsKCgkJCXJldHVybiByZXN1bHQ7CgoJCX0sCgoJCS8vIHVzZXMgdGhlIGFycmF5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgJ2dldEtleWZyYW1lT3JkZXInIHRvIHNvcnQgZGF0YQoJCXNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHsKCgkJCXZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDsKCQkJdmFyIHJlc3VsdCA9IG5ldyB2YWx1ZXMuY29uc3RydWN0b3IoIG5WYWx1ZXMgKTsKCgkJCWZvciAoIHZhciBpID0gMCwgZHN0T2Zmc2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkgewoKCQkJCXZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlOwoKCQkJCWZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkgewoKCQkJCQlyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHJlc3VsdDsKCgkJfSwKCgkJLy8gZnVuY3Rpb24gZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1hdHMKCQlmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7CgoJCQl2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07CgoJCQl3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCWtleSA9IGpzb25LZXlzWyBpICsrIF07CgoJCQl9CgoJCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhCgoJCQl2YXIgdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07CgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YQoKCQkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoKCQkJCWRvIHsKCgkJCQkJdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07CgoJCQkJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXRpbWVzLnB1c2goIGtleS50aW1lICk7CgkJCQkJCXZhbHVlcy5wdXNoLmFwcGx5KCB2YWx1ZXMsIHZhbHVlICk7IC8vIHB1c2ggYWxsIGVsZW1lbnRzCgoJCQkJCX0KCgkJCQkJa2V5ID0ganNvbktleXNbIGkgKysgXTsKCgkJCQl9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTsKCgkJCX0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2gKCgkJCQlkbyB7CgoJCQkJCXZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdOwoKCQkJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl0aW1lcy5wdXNoKCBrZXkudGltZSApOwoJCQkJCQl2YWx1ZS50b0FycmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5ndGggKTsKCgkJCQkJfQoKCQkJCQlrZXkgPSBqc29uS2V5c1sgaSArKyBdOwoKCQkJCX0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApOwoKCQkJfSBlbHNlIHsKCgkJCQkvLyBvdGhlcndpc2UgcHVzaCBhcy1pcwoKCQkJCWRvIHsKCgkJCQkJdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07CgoJCQkJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXRpbWVzLnB1c2goIGtleS50aW1lICk7CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoKCQkJCQl9CgoJCQkJCWtleSA9IGpzb25LZXlzWyBpICsrIF07CgoJCQkJfSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7CgoJCQl9CgoJCX0KCgl9OwoKCS8qKgoJICoKCSAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LgoJICoKCSAqCgkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwoJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkgewoKCQlpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkJyApOwoJCWlmICggdGltZXMgPT09IHVuZGVmaW5lZCB8fCB0aW1lcy5sZW5ndGggPT09IDAgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgJyArIG5hbWUgKTsKCgkJdGhpcy5uYW1lID0gbmFtZTsKCgkJdGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTsKCQl0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApOwoKCQl0aGlzLnNldEludGVycG9sYXRpb24oIGludGVycG9sYXRpb24gfHwgdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApOwoKCQl0aGlzLnZhbGlkYXRlKCk7CgkJdGhpcy5vcHRpbWl6ZSgpOwoKCX0KCgkvLyBTdGF0aWMgbWV0aG9kczoKCglPYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLCB7CgoJCS8vIFNlcmlhbGl6YXRpb24gKGluIHN0YXRpYyBjb250ZXh0LCBiZWNhdXNlIG9mIGNvbnN0cnVjdG9yIGludm9jYXRpb24KCQkvLyBhbmQgYXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6CgoJCXBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCQlpZiAoIGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCXRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlJyApOwoKCQkJfQoKCQkJdmFyIHRyYWNrVHlwZSA9IEtleWZyYW1lVHJhY2suX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApOwoKCQkJaWYgKCBqc29uLnRpbWVzID09PSB1bmRlZmluZWQgKSB7CgoJCQkJdmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdOwoKCQkJCUFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTsKCgkJCQlqc29uLnRpbWVzID0gdGltZXM7CgkJCQlqc29uLnZhbHVlcyA9IHZhbHVlczsKCgkJCX0KCgkJCS8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHBhcnNlIG1ldGhvZAoJCQlpZiAoIHRyYWNrVHlwZS5wYXJzZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiB0cmFja1R5cGUucGFyc2UoIGpzb24gKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlCgkJCQlyZXR1cm4gbmV3IHRyYWNrVHlwZSgganNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7CgoJCQl9CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCB0cmFjayApIHsKCgkJCXZhciB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjsKCgkJCXZhciBqc29uOwoKCQkJLy8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZAoJCQlpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHsKCgkJCQlqc29uID0gdHJhY2tUeXBlLnRvSlNPTiggdHJhY2sgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzCgkJCQlqc29uID0gewoKCQkJCQknbmFtZSc6IHRyYWNrLm5hbWUsCgkJCQkJJ3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSwKCQkJCQkndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5ICkKCgkJCQl9OwoKCQkJCXZhciBpbnRlcnBvbGF0aW9uID0gdHJhY2suZ2V0SW50ZXJwb2xhdGlvbigpOwoKCQkJCWlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7CgoJCQkJCWpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247CgoJCQkJfQoKCQkJfQoKCQkJanNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5CgoJCQlyZXR1cm4ganNvbjsKCgkJfSwKCgkJX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWU6IGZ1bmN0aW9uICggdHlwZU5hbWUgKSB7CgoJCQlzd2l0Y2ggKCB0eXBlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoKCQkJCWNhc2UgJ3NjYWxhcic6CgkJCQljYXNlICdkb3VibGUnOgoJCQkJY2FzZSAnZmxvYXQnOgoJCQkJY2FzZSAnbnVtYmVyJzoKCQkJCWNhc2UgJ2ludGVnZXInOgoKCQkJCQlyZXR1cm4gTnVtYmVyS2V5ZnJhbWVUcmFjazsKCgkJCQljYXNlICd2ZWN0b3InOgoJCQkJY2FzZSAndmVjdG9yMic6CgkJCQljYXNlICd2ZWN0b3IzJzoKCQkJCWNhc2UgJ3ZlY3RvcjQnOgoKCQkJCQlyZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjazsKCgkJCQljYXNlICdjb2xvcic6CgoJCQkJCXJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7CgoJCQkJY2FzZSAncXVhdGVybmlvbic6CgoJCQkJCXJldHVybiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjazsKCgkJCQljYXNlICdib29sJzoKCQkJCWNhc2UgJ2Jvb2xlYW4nOgoKCQkJCQlyZXR1cm4gQm9vbGVhbktleWZyYW1lVHJhY2s7CgoJCQkJY2FzZSAnc3RyaW5nJzoKCgkJCQkJcmV0dXJuIFN0cmluZ0tleWZyYW1lVHJhY2s7CgoJCQl9CgoJCQl0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogJyArIHR5cGVOYW1lICk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUsIHsKCgkJY29uc3RydWN0b3I6IEtleWZyYW1lVHJhY2ssCgoJCVRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksCgoJCVZhbHVlQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LAoKCQlEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsCgoJCUludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHsKCgkJCXJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApOwoKCQl9LAoKCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkgewoKCQkJcmV0dXJuIG5ldyBMaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApOwoKCQl9LAoKCQlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IGZ1bmN0aW9uICggcmVzdWx0ICkgewoKCQkJcmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7CgoJCX0sCgoJCXNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHsKCgkJCXZhciBmYWN0b3J5TWV0aG9kOwoKCQkJc3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHsKCgkJCQljYXNlIEludGVycG9sYXRlRGlzY3JldGU6CgoJCQkJCWZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOwoKCQkJCQlicmVhazsKCgkJCQljYXNlIEludGVycG9sYXRlTGluZWFyOgoKCQkJCQlmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7CgoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgSW50ZXJwb2xhdGVTbW9vdGg6CgoJCQkJCWZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDsKCgkJCQkJYnJlYWs7CgoJCQl9CgoJCQlpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHsKCgkJCQl2YXIgbWVzc2FnZSA9ICJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiICsKCQkJCQl0aGlzLlZhbHVlVHlwZU5hbWUgKyAiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIgKyB0aGlzLm5hbWU7CgoJCQkJaWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCS8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cAoJCQkJCWlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHsKCgkJCQkJCXRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApOwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJdGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2UKCgkJCQkJfQoKCQkJCX0KCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5LZXlmcmFtZVRyYWNrOicsIG1lc3NhZ2UgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPSBmYWN0b3J5TWV0aG9kOwoKCQl9LAoKCQlnZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoKSB7CgoJCQlzd2l0Y2ggKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ICkgewoKCQkJCWNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZToKCgkJCQkJcmV0dXJuIEludGVycG9sYXRlRGlzY3JldGU7CgoJCQkJY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjoKCgkJCQkJcmV0dXJuIEludGVycG9sYXRlTGluZWFyOwoKCQkJCWNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6CgoJCQkJCXJldHVybiBJbnRlcnBvbGF0ZVNtb290aDsKCgkJCX0KCgkJfSwKCgkJZ2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7CgoJCX0sCgoJCS8vIG1vdmUgYWxsIGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZHMgb3IgYmFja3dhcmRzIGluIHRpbWUKCQlzaGlmdDogZnVuY3Rpb24gKCB0aW1lT2Zmc2V0ICkgewoKCQkJaWYgKCB0aW1lT2Zmc2V0ICE9PSAwLjAgKSB7CgoJCQkJdmFyIHRpbWVzID0gdGhpcy50aW1lczsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJCXRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDsKCgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJLy8gc2NhbGUgYWxsIGtleWZyYW1lIHRpbWVzIGJ5IGEgZmFjdG9yICh1c2VmdWwgZm9yIGZyYW1lIDwtPiBzZWNvbmRzIGNvbnZlcnNpb25zKQoJCXNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHsKCgkJCWlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7CgoJCQkJdmFyIHRpbWVzID0gdGhpcy50aW1lczsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJCXRpbWVzWyBpIF0gKj0gdGltZVNjYWxlOwoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQkvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS4KCQkvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzCgkJdHJpbTogZnVuY3Rpb24gKCBzdGFydFRpbWUsIGVuZFRpbWUgKSB7CgoJCQl2YXIgdGltZXMgPSB0aGlzLnRpbWVzLAoJCQkJbktleXMgPSB0aW1lcy5sZW5ndGgsCgkJCQlmcm9tID0gMCwKCQkJCXRvID0gbktleXMgLSAxOwoKCQkJd2hpbGUgKCBmcm9tICE9PSBuS2V5cyAmJiB0aW1lc1sgZnJvbSBdIDwgc3RhcnRUaW1lICkgewoKCQkJCSsrIGZyb207CgoJCQl9CgoJCQl3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkgewoKCQkJCS0tIHRvOwoKCQkJfQoKCQkJKysgdG87IC8vIGluY2x1c2l2ZSAtPiBleGNsdXNpdmUgYm91bmQKCgkJCWlmICggZnJvbSAhPT0gMCB8fCB0byAhPT0gbktleXMgKSB7CgoJCQkJLy8gZW1wdHkgdHJhY2tzIGFyZSBmb3JiaWRkZW4sIHNvIGtlZXAgYXQgbGVhc3Qgb25lIGtleWZyYW1lCgkJCQlpZiAoIGZyb20gPj0gdG8gKSB0byA9IE1hdGgubWF4KCB0bywgMSApLCBmcm9tID0gdG8gLSAxOwoKCQkJCXZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOwoJCQkJdGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApOwoJCQkJdGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQkvLyBlbnN1cmUgd2UgZG8gbm90IGdldCBhIEdhcmJhZ2VJbkdhcmJhZ2VPdXQgc2l0dWF0aW9uLCBtYWtlIHN1cmUgdHJhY2tzIGFyZSBhdCBsZWFzdCBtaW5pbWFsbHkgdmlhYmxlCgkJdmFsaWRhdGU6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2YWxpZCA9IHRydWU7CgoJCQl2YXIgdmFsdWVTaXplID0gdGhpcy5nZXRWYWx1ZVNpemUoKTsKCQkJaWYgKCB2YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLicsIHRoaXMgKTsKCQkJCXZhbGlkID0gZmFsc2U7CgoJCQl9CgoJCQl2YXIgdGltZXMgPSB0aGlzLnRpbWVzLAoJCQkJdmFsdWVzID0gdGhpcy52YWx1ZXMsCgoJCQkJbktleXMgPSB0aW1lcy5sZW5ndGg7CgoJCQlpZiAoIG5LZXlzID09PSAwICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4nLCB0aGlzICk7CgkJCQl2YWxpZCA9IGZhbHNlOwoKCQkJfQoKCQkJdmFyIHByZXZUaW1lID0gbnVsbDsKCgkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbktleXM7IGkgKysgKSB7CgoJCQkJdmFyIGN1cnJUaW1lID0gdGltZXNbIGkgXTsKCgkJCQlpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7CgoJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCBjdXJyVGltZSApOwoJCQkJCXZhbGlkID0gZmFsc2U7CgkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJCWlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHsKCgkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IE91dCBvZiBvcmRlciBrZXlzLicsIHRoaXMsIGksIGN1cnJUaW1lLCBwcmV2VGltZSApOwoJCQkJCXZhbGlkID0gZmFsc2U7CgkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJCXByZXZUaW1lID0gY3VyclRpbWU7CgoJCQl9CgoJCQlpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCQkJCXZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdOwoKCQkJCQkJaWYgKCBpc05hTiggdmFsdWUgKSApIHsKCgkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIHZhbHVlICk7CgkJCQkJCQl2YWxpZCA9IGZhbHNlOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gdmFsaWQ7CgoJCX0sCgoJCS8vIHJlbW92ZXMgZXF1aXZhbGVudCBzZXF1ZW50aWFsIGtleXMgYXMgY29tbW9uIGluIG1vcnBoIHRhcmdldCBzZXF1ZW5jZXMKCQkvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKQoJCW9wdGltaXplOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdGltZXMgPSB0aGlzLnRpbWVzLAoJCQkJdmFsdWVzID0gdGhpcy52YWx1ZXMsCgkJCQlzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLAoKCQkJCXNtb290aEludGVycG9sYXRpb24gPSB0aGlzLmdldEludGVycG9sYXRpb24oKSA9PT0gSW50ZXJwb2xhdGVTbW9vdGgsCgoJCQkJd3JpdGVJbmRleCA9IDEsCgkJCQlsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxOwoKCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkgewoKCQkJCXZhciBrZWVwID0gZmFsc2U7CgoJCQkJdmFyIHRpbWUgPSB0aW1lc1sgaSBdOwoJCQkJdmFyIHRpbWVOZXh0ID0gdGltZXNbIGkgKyAxIF07CgoJCQkJLy8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZQoKCQkJCWlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVbIDAgXSApICkgewoKCQkJCQlpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHsKCgkJCQkJCS8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnMKCgkJCQkJCXZhciBvZmZzZXQgPSBpICogc3RyaWRlLAoJCQkJCQkJb2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSwKCQkJCQkJCW9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7CgoJCQkJCQlmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHsKCgkJCQkJCQl2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTsKCgkJCQkJCQlpZiAoIHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldFAgKyBqIF0gfHwKCQkJCQkJCQl2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkgewoKCQkJCQkJCQlrZWVwID0gdHJ1ZTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlrZWVwID0gdHJ1ZTsKCgkJCQkJfQoKCQkJCX0KCgkJCQkvLyBpbi1wbGFjZSBjb21wYWN0aW9uCgoJCQkJaWYgKCBrZWVwICkgewoKCQkJCQlpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7CgoJCQkJCQl0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTsKCgkJCQkJCXZhciByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSwKCQkJCQkJCXdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTsKCgkJCQkJCWZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkgewoKCQkJCQkJCXZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQkJKysgd3JpdGVJbmRleDsKCgkJCQl9CgoJCQl9CgoJCQkvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKQoKCQkJaWYgKCBsYXN0SW5kZXggPiAwICkgewoKCQkJCXRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgbGFzdEluZGV4IF07CgoJCQkJZm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHsKCgkJCQkJdmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTsKCgkJCQl9CgoJCQkJKysgd3JpdGVJbmRleDsKCgkJCX0KCgkJCWlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkgewoKCQkJCXRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgMCwgd3JpdGVJbmRleCApOwoJCQkJdGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB2YWx1ZXMsIDAsIHdyaXRlSW5kZXggKiBzdHJpZGUgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICoKCSAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLgoJICoKCSAqCgkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwoJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCgkgKiBAYXV0aG9yIHRzY2h3CgkgKi8KCglmdW5jdGlvbiBWZWN0b3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkgewoKCQlLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsKCgl9CgoJVmVjdG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBWZWN0b3JLZXlmcmFtZVRyYWNrLAoKCQlWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJwoKCQkvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkCgoJCS8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZAoKCX0gKTsKCgkvKioKCSAqCgkgKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi4KCSAqCgkgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwoJICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCgkgKi8KCglmdW5jdGlvbiBBbmltYXRpb25DbGlwKCBuYW1lLCBkdXJhdGlvbiwgdHJhY2tzICkgewoKCQl0aGlzLm5hbWUgPSBuYW1lOwoJCXRoaXMudHJhY2tzID0gdHJhY2tzOwoJCXRoaXMuZHVyYXRpb24gPSAoIGR1cmF0aW9uICE9PSB1bmRlZmluZWQgKSA/IGR1cmF0aW9uIDogLSAxOwoKCQl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKCgkJLy8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrcwoJCWlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7CgoJCQl0aGlzLnJlc2V0RHVyYXRpb24oKTsKCgkJfQoKCQl0aGlzLm9wdGltaXplKCk7CgoJfQoKCU9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAsIHsKCgkJcGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsKCgkJCXZhciB0cmFja3MgPSBbXSwKCQkJCWpzb25UcmFja3MgPSBqc29uLnRyYWNrcywKCQkJCWZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCQl0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay5wYXJzZSgganNvblRyYWNrc1sgaSBdICkuc2NhbGUoIGZyYW1lVGltZSApICk7CgoJCQl9CgoJCQlyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tzICk7CgoJCX0sCgoJCXRvSlNPTjogZnVuY3Rpb24gKCBjbGlwICkgewoKCQkJdmFyIHRyYWNrcyA9IFtdLAoJCQkJY2xpcFRyYWNrcyA9IGNsaXAudHJhY2tzOwoKCQkJdmFyIGpzb24gPSB7CgoJCQkJJ25hbWUnOiBjbGlwLm5hbWUsCgkJCQknZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLAoJCQkJJ3RyYWNrcyc6IHRyYWNrcwoKCQkJfTsKCgkJCWZvciAoIHZhciBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCXRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnRvSlNPTiggY2xpcFRyYWNrc1sgaSBdICkgKTsKCgkJCX0KCgkJCXJldHVybiBqc29uOwoKCQl9LAoKCQlDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZTogZnVuY3Rpb24gKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHsKCgkJCXZhciBudW1Nb3JwaFRhcmdldHMgPSBtb3JwaFRhcmdldFNlcXVlbmNlLmxlbmd0aDsKCQkJdmFyIHRyYWNrcyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkgewoKCQkJCXZhciB0aW1lcyA9IFtdOwoJCQkJdmFyIHZhbHVlcyA9IFtdOwoKCQkJCXRpbWVzLnB1c2goCgkJCQkJKCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLAoJCQkJCWksCgkJCQkJKCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7CgoJCQkJdmFsdWVzLnB1c2goIDAsIDEsIDAgKTsKCgkJCQl2YXIgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApOwoJCQkJdGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7CgkJCQl2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApOwoKCQkJCS8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZQoJCQkJLy8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuCgkJCQlpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7CgoJCQkJCXRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApOwoJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApOwoKCQkJCX0KCgkJCQl0cmFja3MucHVzaCgKCQkJCQluZXcgTnVtYmVyS2V5ZnJhbWVUcmFjaygKCQkJCQkJJy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLAoJCQkJCQl0aW1lcywgdmFsdWVzCgkJCQkJKS5zY2FsZSggMS4wIC8gZnBzICkgKTsKCgkJCX0KCgkJCXJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCggbmFtZSwgLSAxLCB0cmFja3MgKTsKCgkJfSwKCgkJZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHsKCgkJCXZhciBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTsKCgkJCWlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkgewoKCQkJCXZhciBvID0gb2JqZWN0T3JDbGlwQXJyYXk7CgkJCQljbGlwQXJyYXkgPSBvLmdlb21ldHJ5ICYmIG8uZ2VvbWV0cnkuYW5pbWF0aW9ucyB8fCBvLmFuaW1hdGlvbnM7CgoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkgewoKCQkJCWlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHsKCgkJCQkJcmV0dXJuIGNsaXBBcnJheVsgaSBdOwoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiBudWxsOwoKCQl9LAoKCQlDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczogZnVuY3Rpb24gKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkgewoKCQkJdmFyIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307CgoJCQkvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzCgkJCS8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OQoJCQl2YXIgcGF0dGVybiA9IC9eKFtcdy1dKj8pKFtcZF0rKSQvOwoKCQkJLy8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkCgkJCS8vIHBhdHRlcm5zIGxpa2UgV2Fsa18wMDEsIFdhbGtfMDAyLCBSdW5fMDAxLCBSdW5fMDAyCgkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJdmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07CgkJCQl2YXIgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7CgoJCQkJaWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkgewoKCQkJCQl2YXIgbmFtZSA9IHBhcnRzWyAxIF07CgoJCQkJCXZhciBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdOwoJCQkJCWlmICggISBhbmltYXRpb25Nb3JwaFRhcmdldHMgKSB7CgoJCQkJCQlhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdID0gYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107CgoJCQkJCX0KCgkJCQkJYW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7CgoJCQkJfQoKCQkJfQoKCQkJdmFyIGNsaXBzID0gW107CgoJCQlmb3IgKCB2YXIgbmFtZSBpbiBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyApIHsKCgkJCQljbGlwcy5wdXNoKCBBbmltYXRpb25DbGlwLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdLCBmcHMsIG5vTG9vcCApICk7CgoJCQl9CgoJCQlyZXR1cm4gY2xpcHM7CgoJCX0sCgoJCS8vIHBhcnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdAoJCXBhcnNlQW5pbWF0aW9uOiBmdW5jdGlvbiAoIGFuaW1hdGlvbiwgYm9uZXMgKSB7CgoJCQlpZiAoICEgYW5pbWF0aW9uICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTsKCQkJCXJldHVybiBudWxsOwoKCQkJfQoKCQkJdmFyIGFkZE5vbmVtcHR5VHJhY2sgPSBmdW5jdGlvbiAoIHRyYWNrVHlwZSwgdHJhY2tOYW1lLCBhbmltYXRpb25LZXlzLCBwcm9wZXJ0eU5hbWUsIGRlc3RUcmFja3MgKSB7CgoJCQkJLy8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuCgkJCQlpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkgewoKCQkJCQl2YXIgdGltZXMgPSBbXTsKCQkJCQl2YXIgdmFsdWVzID0gW107CgoJCQkJCUFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTsKCgkJCQkJLy8gZW1wdHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBjaGVjayBhZ2FpbgoJCQkJCWlmICggdGltZXMubGVuZ3RoICE9PSAwICkgewoKCQkJCQkJZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfTsKCgkJCXZhciB0cmFja3MgPSBbXTsKCgkJCXZhciBjbGlwTmFtZSA9IGFuaW1hdGlvbi5uYW1lIHx8ICdkZWZhdWx0JzsKCQkJLy8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuCgkJCXZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxOwoJCQl2YXIgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDsKCgkJCXZhciBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdOwoKCQkJZm9yICggdmFyIGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHsKCgkJCQl2YXIgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7CgoJCQkJLy8gc2tpcCBlbXB0eSB0cmFja3MKCQkJCWlmICggISBhbmltYXRpb25LZXlzIHx8IGFuaW1hdGlvbktleXMubGVuZ3RoID09PSAwICkgY29udGludWU7CgoJCQkJLy8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzCgkJCQlpZiAoIGFuaW1hdGlvbktleXNbIDAgXS5tb3JwaFRhcmdldHMgKSB7CgoJCQkJCS8vIGZpZ3VyZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrCgkJCQkJdmFyIG1vcnBoVGFyZ2V0TmFtZXMgPSB7fTsKCgkJCQkJZm9yICggdmFyIGsgPSAwOyBrIDwgYW5pbWF0aW9uS2V5cy5sZW5ndGg7IGsgKysgKSB7CgoJCQkJCQlpZiAoIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMgKSB7CgoJCQkJCQkJZm9yICggdmFyIG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7CgoJCQkJCQkJCW1vcnBoVGFyZ2V0TmFtZXNbIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQkvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVybwoJCQkJCS8vIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoCgkJCQkJLy8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLgoJCQkJCWZvciAoIHZhciBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHsKCgkJCQkJCXZhciB0aW1lcyA9IFtdOwoJCQkJCQl2YXIgdmFsdWVzID0gW107CgoJCQkJCQlmb3IgKCB2YXIgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkgewoKCQkJCQkJCXZhciBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07CgoJCQkJCQkJdGltZXMucHVzaCggYW5pbWF0aW9uS2V5LnRpbWUgKTsKCQkJCQkJCXZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdldCA9PT0gbW9ycGhUYXJnZXROYW1lICkgPyAxIDogMCApOwoKCQkJCQkJfQoKCQkJCQkJdHJhY2tzLnB1c2goIG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCAnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWycgKyBtb3JwaFRhcmdldE5hbWUgKyAnXScsIHRpbWVzLCB2YWx1ZXMgKSApOwoKCQkJCQl9CgoJCQkJCWR1cmF0aW9uID0gbW9ycGhUYXJnZXROYW1lcy5sZW5ndGggKiAoIGZwcyB8fCAxLjAgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQkvLyAuLi5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0aW9uCgoJCQkJCXZhciBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJzsKCgkJCQkJYWRkTm9uZW1wdHlUcmFjaygKCQkJCQkJVmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJywKCQkJCQkJYW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApOwoKCQkJCQlhZGROb25lbXB0eVRyYWNrKAoJCQkJCQlRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLAoJCQkJCQlhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7CgoJCQkJCWFkZE5vbmVtcHR5VHJhY2soCgkJCQkJCVZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScsCgkJCQkJCWFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIHRyYWNrcy5sZW5ndGggPT09IDAgKSB7CgoJCQkJcmV0dXJuIG51bGw7CgoJCQl9CgoJCQl2YXIgY2xpcCA9IG5ldyBBbmltYXRpb25DbGlwKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcyApOwoKCQkJcmV0dXJuIGNsaXA7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcC5wcm90b3R5cGUsIHsKCgkJcmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHRyYWNrcyA9IHRoaXMudHJhY2tzLCBkdXJhdGlvbiA9IDA7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCXZhciB0cmFjayA9IHRoaXMudHJhY2tzWyBpIF07CgoJCQkJZHVyYXRpb24gPSBNYXRoLm1heCggZHVyYXRpb24sIHRyYWNrLnRpbWVzWyB0cmFjay50aW1lcy5sZW5ndGggLSAxIF0gKTsKCgkJCX0KCgkJCXRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKCgkJfSwKCgkJdHJpbTogZnVuY3Rpb24gKCkgewoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkgewoKCQkJCXRoaXMudHJhY2tzWyBpIF0udHJpbSggMCwgdGhpcy5kdXJhdGlvbiApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW9wdGltaXplOiBmdW5jdGlvbiAoKSB7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJdGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gTWF0ZXJpYWxMb2FkZXIoIG1hbmFnZXIgKSB7CgoJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOwoJCXRoaXMudGV4dHVyZXMgPSB7fTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggTWF0ZXJpYWxMb2FkZXIucHJvdG90eXBlLCB7CgoJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgoJCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7CgkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKCgkJCQlvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApOwoKCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKCQl9LAoKCQlzZXRUZXh0dXJlczogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMudGV4dHVyZXMgPSB2YWx1ZTsKCgkJfSwKCgkJcGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsKCgkJCXZhciB0ZXh0dXJlcyA9IHRoaXMudGV4dHVyZXM7CgoJCQlmdW5jdGlvbiBnZXRUZXh0dXJlKCBuYW1lICkgewoKCQkJCWlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUnLCBuYW1lICk7CgoJCQkJfQoKCQkJCXJldHVybiB0ZXh0dXJlc1sgbmFtZSBdOwoKCQkJfQoKCQkJdmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTsKCgkJCWlmICgganNvbi51dWlkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51dWlkID0ganNvbi51dWlkOwoJCQlpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTsKCQkJaWYgKCBqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvci5zZXRIZXgoIGpzb24uY29sb3IgKTsKCQkJaWYgKCBqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzID0ganNvbi5yb3VnaG5lc3M7CgkJCWlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzOwoJCQlpZiAoIGpzb24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlLnNldEhleCgganNvbi5lbWlzc2l2ZSApOwoJCQlpZiAoIGpzb24uc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApOwoJCQlpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzczsKCQkJaWYgKCBqc29uLmNsZWFyQ29hdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0ID0ganNvbi5jbGVhckNvYXQ7CgkJCWlmICgganNvbi5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJDb2F0Um91Z2huZXNzOwoJCQlpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3JtczsKCQkJaWYgKCBqc29uLnZlcnRleFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7CgkJCWlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyOwoJCQlpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9yczsKCQkJaWYgKCBqc29uLmZvZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZm9nID0ganNvbi5mb2c7CgkJCWlmICgganNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLmZsYXRTaGFkaW5nOwoJCQlpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZzsKCQkJaWYgKCBqc29uLnNpZGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpZGUgPSBqc29uLnNpZGU7CgkJCWlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5OwoJCQlpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDsKCQkJaWYgKCBqc29uLmFscGhhVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFUZXN0ID0ganNvbi5hbHBoYVRlc3Q7CgkJCWlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0OwoJCQlpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTsKCQkJaWYgKCBqc29uLmNvbG9yV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yV3JpdGUgPSBqc29uLmNvbG9yV3JpdGU7CgkJCWlmICgganNvbi53aXJlZnJhbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZSA9IGpzb24ud2lyZWZyYW1lOwoJCQlpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDsKCQkJaWYgKCBqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAgPSBqc29uLndpcmVmcmFtZUxpbmVjYXA7CgkJCWlmICgganNvbi53aXJlZnJhbWVMaW5lam9pbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWpvaW4gPSBqc29uLndpcmVmcmFtZUxpbmVqb2luOwoKCQkJaWYgKCBqc29uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3RhdGlvbiA9IGpzb24ucm90YXRpb247CgoJCQlpZiAoIGpzb24ubGluZXdpZHRoICE9PSAxICkgbWF0ZXJpYWwubGluZXdpZHRoID0ganNvbi5saW5ld2lkdGg7CgkJCWlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplOwoJCQlpZiAoIGpzb24uZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ2FwU2l6ZSA9IGpzb24uZ2FwU2l6ZTsKCQkJaWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zY2FsZSA9IGpzb24uc2NhbGU7CgoJCQlpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZzsKCQkJaWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhUYXJnZXRzID0ganNvbi5tb3JwaFRhcmdldHM7CgkJCWlmICgganNvbi5kaXRoZXJpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpdGhlcmluZyA9IGpzb24uZGl0aGVyaW5nOwoKCQkJaWYgKCBqc29uLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZpc2libGUgPSBqc29uLnZpc2libGU7CgkJCWlmICgganNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhOwoKCQkJLy8gRGVwcmVjYXRlZAoKCQkJaWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5zaGFkaW5nID09PSAxOyAvLyBUSFJFRS5GbGF0U2hhZGluZwoKCQkJLy8gZm9yIFBvaW50c01hdGVyaWFsCgoJCQlpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTsKCQkJaWYgKCBqc29uLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID0ganNvbi5zaXplQXR0ZW51YXRpb247CgoJCQkvLyBtYXBzCgoJCQlpZiAoIGpzb24ubWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hcCApOwoKCQkJaWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJbWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7CgkJCQltYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7CgoJCQl9CgoJCQlpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApOwoJCQlpZiAoIGpzb24uYnVtcFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wU2NhbGUgPSBqc29uLmJ1bXBTY2FsZTsKCgkJCWlmICgganNvbi5ub3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24ubm9ybWFsTWFwICk7CgkJCWlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXZhciBub3JtYWxTY2FsZSA9IGpzb24ubm9ybWFsU2NhbGU7CgoJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHsKCgkJCQkJLy8gQmxlbmRlciBleHBvcnRlciB1c2VkIHRvIGV4cG9ydCBhIHNjYWxhci4gU2VlICM3NDU5CgoJCQkJCW5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTsKCgkJCQl9CgoJCQkJbWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTsKCgkJCX0KCgkJCWlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7CgkJCWlmICgganNvbi5kaXNwbGFjZW1lbnRTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGUgPSBqc29uLmRpc3BsYWNlbWVudFNjYWxlOwoJCQlpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhczsKCgkJCWlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7CgkJCWlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7CgoJCQlpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApOwoJCQlpZiAoIGpzb24uZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0ganNvbi5lbWlzc2l2ZUludGVuc2l0eTsKCgkJCWlmICgganNvbi5zcGVjdWxhck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFyTWFwICk7CgoJCQlpZiAoIGpzb24uZW52TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVudk1hcCApOwoKCQkJaWYgKCBqc29uLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7CgoJCQlpZiAoIGpzb24ubGlnaHRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5saWdodE1hcCApOwoJCQlpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTsKCgkJCWlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7CgkJCWlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5OwoKCQkJaWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTsKCgkJCXJldHVybiBtYXRlcmlhbDsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBCdWZmZXJHZW9tZXRyeUxvYWRlciggbWFuYWdlciApIHsKCgkJdGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CgoJfQoKCU9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwgewoKCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKCQkJdmFyIHNjb3BlID0gdGhpczsKCgkJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApOwoJCQlsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7CgoJCQkJb25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTsKCgkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCgkJfSwKCgkJcGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHsKCgkJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoKCQkJdmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4OwoKCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgaW5kZXgudHlwZSBdKCBpbmRleC5hcnJheSApOwoJCQkJZ2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIDEgKSApOwoKCQkJfQoKCQkJdmFyIGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEuYXR0cmlidXRlczsKCgkJCWZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHsKCgkJCQl2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07CgkJCQl2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGF0dHJpYnV0ZS50eXBlIF0oIGF0dHJpYnV0ZS5hcnJheSApOwoKCQkJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICkgKTsKCgkJCX0KCgkJCXZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7CgoJCQlpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgaSBdOwoKCQkJCQlnZW9tZXRyeS5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7CgoJCQkJfQoKCQkJfQoKCQkJdmFyIGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlOwoKCQkJaWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpOwoKCQkJCWlmICggYm91bmRpbmdTcGhlcmUuY2VudGVyICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCWNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApOwoKCQkJCX0KCgkJCQlnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7CgoJCQl9CgoJCQlyZXR1cm4gZ2VvbWV0cnk7CgoJCX0KCgl9ICk7CgoJdmFyIFRZUEVEX0FSUkFZUyA9IHsKCQlJbnQ4QXJyYXk6IEludDhBcnJheSwKCQlVaW50OEFycmF5OiBVaW50OEFycmF5LAoJCS8vIFdvcmthcm91bmQgZm9yIElFMTEgcHJlIEtCMjkyOTQzNy4gU2VlICMxMTQ0MAoJCVVpbnQ4Q2xhbXBlZEFycmF5OiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhDbGFtcGVkQXJyYXkgOiBVaW50OEFycmF5LAoJCUludDE2QXJyYXk6IEludDE2QXJyYXksCgkJVWludDE2QXJyYXk6IFVpbnQxNkFycmF5LAoJCUludDMyQXJyYXk6IEludDMyQXJyYXksCgkJVWludDMyQXJyYXk6IFVpbnQzMkFycmF5LAoJCUZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LAoJCUZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5Cgl9OwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIExvYWRlcigpIHsKCgkJdGhpcy5vbkxvYWRTdGFydCA9IGZ1bmN0aW9uICgpIHt9OwoJCXRoaXMub25Mb2FkUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7fTsKCQl0aGlzLm9uTG9hZENvbXBsZXRlID0gZnVuY3Rpb24gKCkge307CgoJfQoKCUxvYWRlci5IYW5kbGVycyA9IHsKCgkJaGFuZGxlcnM6IFtdLAoKCQlhZGQ6IGZ1bmN0aW9uICggcmVnZXgsIGxvYWRlciApIHsKCgkJCXRoaXMuaGFuZGxlcnMucHVzaCggcmVnZXgsIGxvYWRlciApOwoKCQl9LAoKCQlnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHsKCgkJCXZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7CgoJCQkJdmFyIHJlZ2V4ID0gaGFuZGxlcnNbIGkgXTsKCQkJCXZhciBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTsKCgkJCQlpZiAoIHJlZ2V4LnRlc3QoIGZpbGUgKSApIHsKCgkJCQkJcmV0dXJuIGxvYWRlcjsKCgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gbnVsbDsKCgkJfQoKCX07CgoJT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwgewoKCQljcm9zc09yaWdpbjogdW5kZWZpbmVkLAoKCQlpbml0TWF0ZXJpYWxzOiBmdW5jdGlvbiAoIG1hdGVyaWFscywgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkgewoKCQkJdmFyIGFycmF5ID0gW107CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXRlcmlhbHMubGVuZ3RoOyArKyBpICkgewoKCQkJCWFycmF5WyBpIF0gPSB0aGlzLmNyZWF0ZU1hdGVyaWFsKCBtYXRlcmlhbHNbIGkgXSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICk7CgoJCQl9CgoJCQlyZXR1cm4gYXJyYXk7CgoJCX0sCgoJCWNyZWF0ZU1hdGVyaWFsOiAoIGZ1bmN0aW9uICgpIHsKCgkJCXZhciBCbGVuZGluZ01vZGUgPSB7CgkJCQlOb0JsZW5kaW5nOiBOb0JsZW5kaW5nLAoJCQkJTm9ybWFsQmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLAoJCQkJQWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZywKCQkJCVN1YnRyYWN0aXZlQmxlbmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsCgkJCQlNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLAoJCQkJQ3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nCgkJCX07CgoJCQl2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTsKCQkJdmFyIHRleHR1cmVMb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpOwoJCQl2YXIgbWF0ZXJpYWxMb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTsKCgkJCXJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkgewoKCQkJCS8vIGNvbnZlcnQgZnJvbSBvbGQgbWF0ZXJpYWwgZm9ybWF0CgoJCQkJdmFyIHRleHR1cmVzID0ge307CgoJCQkJZnVuY3Rpb24gbG9hZFRleHR1cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkgewoKCQkJCQl2YXIgZnVsbFBhdGggPSB0ZXh0dXJlUGF0aCArIHBhdGg7CgkJCQkJdmFyIGxvYWRlciA9IExvYWRlci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7CgoJCQkJCXZhciB0ZXh0dXJlOwoKCQkJCQlpZiAoIGxvYWRlciAhPT0gbnVsbCApIHsKCgkJCQkJCXRleHR1cmUgPSBsb2FkZXIubG9hZCggZnVsbFBhdGggKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCXRleHR1cmVMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICk7CgkJCQkJCXRleHR1cmUgPSB0ZXh0dXJlTG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7CgoJCQkJCX0KCgkJCQkJaWYgKCByZXBlYXQgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7CgoJCQkJCQlpZiAoIHJlcGVhdFsgMCBdICE9PSAxICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nOwoJCQkJCQlpZiAoIHJlcGVhdFsgMSBdICE9PSAxICkgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nOwoKCQkJCQl9CgoJCQkJCWlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApOwoKCQkJCQl9CgoJCQkJCWlmICggd3JhcCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJaWYgKCB3cmFwWyAwIF0gPT09ICdyZXBlYXQnICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nOwoJCQkJCQlpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZzsKCgkJCQkJCWlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZzsKCQkJCQkJaWYgKCB3cmFwWyAxIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwVCA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7CgoJCQkJCX0KCgkJCQkJaWYgKCBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl0ZXh0dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5OwoKCQkJCQl9CgoJCQkJCXZhciB1dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgoJCQkJCXRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJlOwoKCQkJCQlyZXR1cm4gdXVpZDsKCgkJCQl9CgoJCQkJLy8KCgkJCQl2YXIganNvbiA9IHsKCQkJCQl1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSwKCQkJCQl0eXBlOiAnTWVzaExhbWJlcnRNYXRlcmlhbCcKCQkJCX07CgoJCQkJZm9yICggdmFyIG5hbWUgaW4gbSApIHsKCgkJCQkJdmFyIHZhbHVlID0gbVsgbmFtZSBdOwoKCQkJCQlzd2l0Y2ggKCBuYW1lICkgewoKCQkJCQkJY2FzZSAnRGJnQ29sb3InOgoJCQkJCQljYXNlICdEYmdJbmRleCc6CgkJCQkJCWNhc2UgJ29wdGljYWxEZW5zaXR5JzoKCQkJCQkJY2FzZSAnaWxsdW1pbmF0aW9uJzoKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdEYmdOYW1lJzoKCQkJCQkJCWpzb24ubmFtZSA9IHZhbHVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2JsZW5kaW5nJzoKCQkJCQkJCWpzb24uYmxlbmRpbmcgPSBCbGVuZGluZ01vZGVbIHZhbHVlIF07CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnY29sb3JBbWJpZW50JzoKCQkJCQkJY2FzZSAnbWFwQW1iaWVudCc6CgkJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6JywgbmFtZSwgJ2lzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJyApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2NvbG9yRGlmZnVzZSc6CgkJCQkJCQlqc29uLmNvbG9yID0gY29sb3IuZnJvbUFycmF5KCB2YWx1ZSApLmdldEhleCgpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2NvbG9yU3BlY3VsYXInOgoJCQkJCQkJanNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdjb2xvckVtaXNzaXZlJzoKCQkJCQkJCWpzb24uZW1pc3NpdmUgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnc3BlY3VsYXJDb2VmJzoKCQkJCQkJCWpzb24uc2hpbmluZXNzID0gdmFsdWU7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnc2hhZGluZyc6CgkJCQkJCQlpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnOwoJCQkJCQkJaWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJzsKCQkJCQkJCWlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N0YW5kYXJkJyApIGpzb24udHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbWFwRGlmZnVzZSc6CgkJCQkJCQlqc29uLm1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBEaWZmdXNlUmVwZWF0LCBtLm1hcERpZmZ1c2VPZmZzZXQsIG0ubWFwRGlmZnVzZVdyYXAsIG0ubWFwRGlmZnVzZUFuaXNvdHJvcHkgKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtYXBEaWZmdXNlUmVwZWF0JzoKCQkJCQkJY2FzZSAnbWFwRGlmZnVzZU9mZnNldCc6CgkJCQkJCWNhc2UgJ21hcERpZmZ1c2VXcmFwJzoKCQkJCQkJY2FzZSAnbWFwRGlmZnVzZUFuaXNvdHJvcHknOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEVtaXNzaXZlJzoKCQkJCQkJCWpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBtLm1hcEVtaXNzaXZlQW5pc290cm9weSApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEVtaXNzaXZlUmVwZWF0JzoKCQkJCQkJY2FzZSAnbWFwRW1pc3NpdmVPZmZzZXQnOgoJCQkJCQljYXNlICdtYXBFbWlzc2l2ZVdyYXAnOgoJCQkJCQljYXNlICdtYXBFbWlzc2l2ZUFuaXNvdHJvcHknOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcExpZ2h0JzoKCQkJCQkJCWpzb24ubGlnaHRNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTGlnaHRSZXBlYXQsIG0ubWFwTGlnaHRPZmZzZXQsIG0ubWFwTGlnaHRXcmFwLCBtLm1hcExpZ2h0QW5pc290cm9weSApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcExpZ2h0UmVwZWF0JzoKCQkJCQkJY2FzZSAnbWFwTGlnaHRPZmZzZXQnOgoJCQkJCQljYXNlICdtYXBMaWdodFdyYXAnOgoJCQkJCQljYXNlICdtYXBMaWdodEFuaXNvdHJvcHknOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEFPJzoKCQkJCQkJCWpzb24uYW9NYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQU9SZXBlYXQsIG0ubWFwQU9PZmZzZXQsIG0ubWFwQU9XcmFwLCBtLm1hcEFPQW5pc290cm9weSApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEFPUmVwZWF0JzoKCQkJCQkJY2FzZSAnbWFwQU9PZmZzZXQnOgoJCQkJCQljYXNlICdtYXBBT1dyYXAnOgoJCQkJCQljYXNlICdtYXBBT0FuaXNvdHJvcHknOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEJ1bXAnOgoJCQkJCQkJanNvbi5idW1wTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5tYXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEJ1bXBTY2FsZSc6CgkJCQkJCQlqc29uLmJ1bXBTY2FsZSA9IHZhbHVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEJ1bXBSZXBlYXQnOgoJCQkJCQljYXNlICdtYXBCdW1wT2Zmc2V0JzoKCQkJCQkJY2FzZSAnbWFwQnVtcFdyYXAnOgoJCQkJCQljYXNlICdtYXBCdW1wQW5pc290cm9weSc6CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbWFwTm9ybWFsJzoKCQkJCQkJCWpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5ICk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbWFwTm9ybWFsRmFjdG9yJzoKCQkJCQkJCWpzb24ubm9ybWFsU2NhbGUgPSBbIHZhbHVlLCB2YWx1ZSBdOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcE5vcm1hbFJlcGVhdCc6CgkJCQkJCWNhc2UgJ21hcE5vcm1hbE9mZnNldCc6CgkJCQkJCWNhc2UgJ21hcE5vcm1hbFdyYXAnOgoJCQkJCQljYXNlICdtYXBOb3JtYWxBbmlzb3Ryb3B5JzoKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtYXBTcGVjdWxhcic6CgkJCQkJCQlqc29uLnNwZWN1bGFyTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFNwZWN1bGFyUmVwZWF0LCBtLm1hcFNwZWN1bGFyT2Zmc2V0LCBtLm1hcFNwZWN1bGFyV3JhcCwgbS5tYXBTcGVjdWxhckFuaXNvdHJvcHkgKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtYXBTcGVjdWxhclJlcGVhdCc6CgkJCQkJCWNhc2UgJ21hcFNwZWN1bGFyT2Zmc2V0JzoKCQkJCQkJY2FzZSAnbWFwU3BlY3VsYXJXcmFwJzoKCQkJCQkJY2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5JzoKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtYXBNZXRhbG5lc3MnOgoJCQkJCQkJanNvbi5tZXRhbG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTWV0YWxuZXNzUmVwZWF0LCBtLm1hcE1ldGFsbmVzc09mZnNldCwgbS5tYXBNZXRhbG5lc3NXcmFwLCBtLm1hcE1ldGFsbmVzc0FuaXNvdHJvcHkgKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtYXBNZXRhbG5lc3NSZXBlYXQnOgoJCQkJCQljYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOgoJCQkJCQljYXNlICdtYXBNZXRhbG5lc3NXcmFwJzoKCQkJCQkJY2FzZSAnbWFwTWV0YWxuZXNzQW5pc290cm9weSc6CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzJzoKCQkJCQkJCWpzb24ucm91Z2huZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5ICk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzUmVwZWF0JzoKCQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzT2Zmc2V0JzoKCQkJCQkJY2FzZSAnbWFwUm91Z2huZXNzV3JhcCc6CgkJCQkJCWNhc2UgJ21hcFJvdWdobmVzc0FuaXNvdHJvcHknOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEFscGhhJzoKCQkJCQkJCWpzb24uYWxwaGFNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQWxwaGFSZXBlYXQsIG0ubWFwQWxwaGFPZmZzZXQsIG0ubWFwQWxwaGFXcmFwLCBtLm1hcEFscGhhQW5pc290cm9weSApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ21hcEFscGhhUmVwZWF0JzoKCQkJCQkJY2FzZSAnbWFwQWxwaGFPZmZzZXQnOgoJCQkJCQljYXNlICdtYXBBbHBoYVdyYXAnOgoJCQkJCQljYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2ZsaXBTaWRlZCc6CgkJCQkJCQlqc29uLnNpZGUgPSBCYWNrU2lkZTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkb3VibGVTaWRlZCc6CgkJCQkJCQlqc29uLnNpZGUgPSBEb3VibGVTaWRlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3RyYW5zcGFyZW5jeSc6CgkJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7CgkJCQkJCQlqc29uLm9wYWNpdHkgPSB2YWx1ZTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdkZXB0aFRlc3QnOgoJCQkJCQljYXNlICdkZXB0aFdyaXRlJzoKCQkJCQkJY2FzZSAnY29sb3JXcml0ZSc6CgkJCQkJCWNhc2UgJ29wYWNpdHknOgoJCQkJCQljYXNlICdyZWZsZWN0aXZpdHknOgoJCQkJCQljYXNlICd0cmFuc3BhcmVudCc6CgkJCQkJCWNhc2UgJ3Zpc2libGUnOgoJCQkJCQljYXNlICd3aXJlZnJhbWUnOgoJCQkJCQkJanNvblsgbmFtZSBdID0gdmFsdWU7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAndmVydGV4Q29sb3JzJzoKCQkJCQkJCWlmICggdmFsdWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9yczsKCQkJCQkJCWlmICggdmFsdWUgPT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9yczsKCQkJCQkJCWJyZWFrOwoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDogVW5zdXBwb3J0ZWQnLCBuYW1lLCB2YWx1ZSApOwoJCQkJCQkJYnJlYWs7CgoJCQkJCX0KCgkJCQl9CgoJCQkJaWYgKCBqc29uLnR5cGUgPT09ICdNZXNoQmFzaWNNYXRlcmlhbCcgKSBkZWxldGUganNvbi5lbWlzc2l2ZTsKCQkJCWlmICgganNvbi50eXBlICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7CgoJCQkJaWYgKCBqc29uLm9wYWNpdHkgPCAxICkganNvbi50cmFuc3BhcmVudCA9IHRydWU7CgoJCQkJbWF0ZXJpYWxMb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7CgoJCQkJcmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7CgoJCQl9OwoKCQl9ICkoKQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgRG9uIE1jQ3VyZHkgLyBodHRwczovL3d3dy5kb25tY2N1cmR5LmNvbQoJICovCgoJdmFyIExvYWRlclV0aWxzID0gewoKCQlkZWNvZGVUZXh0OiBmdW5jdGlvbiAoIGFycmF5ICkgewoKCQkJaWYgKCB0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnICkgewoKCQkJCXJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoIGFycmF5ICk7CgoJCQl9CgoJCQkvLyBBdm9pZCB0aGUgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgc2hvcnRjdXQsIHdoaWNoCgkJCS8vIHRocm93cyBhICJtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZCIgZXJyb3IgZm9yIGxhcmdlIGFycmF5cy4KCgkJCXZhciBzID0gJyc7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgoJCQkJLy8gSW1wbGljaXRseSBhc3N1bWVzIGxpdHRsZS1lbmRpYW4uCgkJCQlzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGFycmF5WyBpIF0gKTsKCgkJCX0KCgkJCXJldHVybiBzOwoKCQl9LAoKCQlleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7CgoJCQl2YXIgcGFydHMgPSB1cmwuc3BsaXQoICdpbmRleC5odG1sJyApOwoKCQkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDEgKSByZXR1cm4gJy4vJzsKCgkJCXBhcnRzLnBvcCgpOwoKCQkJcmV0dXJuIHBhcnRzLmpvaW4oICdpbmRleC5odG1sJyApICsgJy8nOwoKCQl9CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gSlNPTkxvYWRlciggbWFuYWdlciApIHsKCgkJaWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jvb2xlYW4nICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogc2hvd1N0YXR1cyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGNvbnN0cnVjdG9yLicgKTsKCQkJbWFuYWdlciA9IHVuZGVmaW5lZDsKCgkJfQoKCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKCgkJdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggSlNPTkxvYWRlci5wcm90b3R5cGUsIHsKCgkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCgkJCXZhciBzY29wZSA9IHRoaXM7CgoJCQl2YXIgdGV4dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGggPT09ICdzdHJpbmcnICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApOwoKCQkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTsKCQkJbG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTsKCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgewoKCQkJCXZhciBqc29uID0gSlNPTi5wYXJzZSggdGV4dCApOwoJCQkJdmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTsKCgkJCQlpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCXZhciB0eXBlID0gbWV0YWRhdGEudHlwZTsKCgkJCQkJaWYgKCB0eXBlICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQlpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgKSB7CgoJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkpTT05Mb2FkZXI6ICcgKyB1cmwgKyAnIHNob3VsZCBiZSBsb2FkZWQgd2l0aCBUSFJFRS5PYmplY3RMb2FkZXIgaW5zdGVhZC4nICk7CgkJCQkJCQlyZXR1cm47CgoJCQkJCQl9CgoJCQkJCQlpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ3NjZW5lJyApIHsKCgkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLlNjZW5lTG9hZGVyIGluc3RlYWQuJyApOwoJCQkJCQkJcmV0dXJuOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCXZhciBvYmplY3QgPSBzY29wZS5wYXJzZSgganNvbiwgdGV4dHVyZVBhdGggKTsKCQkJCW9uTG9hZCggb2JqZWN0Lmdlb21ldHJ5LCBvYmplY3QubWF0ZXJpYWxzICk7CgoJCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CgoJCX0sCgoJCXNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlOwoKCQl9LAoKCQlwYXJzZTogKCBmdW5jdGlvbiAoKSB7CgoJCQlmdW5jdGlvbiBwYXJzZU1vZGVsKCBqc29uLCBnZW9tZXRyeSApIHsKCgkJCQlmdW5jdGlvbiBpc0JpdFNldCggdmFsdWUsIHBvc2l0aW9uICkgewoKCQkJCQlyZXR1cm4gdmFsdWUgJiAoIDEgPDwgcG9zaXRpb24gKTsKCgkJCQl9CgoJCQkJdmFyIGksIGosIGZpLAoKCQkJCQlvZmZzZXQsIHpMZW5ndGgsCgoJCQkJCWNvbG9ySW5kZXgsIG5vcm1hbEluZGV4LCB1dkluZGV4LCBtYXRlcmlhbEluZGV4LAoKCQkJCQl0eXBlLAoJCQkJCWlzUXVhZCwKCQkJCQloYXNNYXRlcmlhbCwKCQkJCQloYXNGYWNlVmVydGV4VXYsCgkJCQkJaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwKCQkJCQloYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvciwKCgkJCQkJdmVydGV4LCBmYWNlLCBmYWNlQSwgZmFjZUIsIGhleCwgbm9ybWFsLAoKCQkJCQl1dkxheWVyLCB1diwgdSwgdiwKCgkJCQkJZmFjZXMgPSBqc29uLmZhY2VzLAoJCQkJCXZlcnRpY2VzID0ganNvbi52ZXJ0aWNlcywKCQkJCQlub3JtYWxzID0ganNvbi5ub3JtYWxzLAoJCQkJCWNvbG9ycyA9IGpzb24uY29sb3JzLAoKCQkJCQlzY2FsZSA9IGpzb24uc2NhbGUsCgoJCQkJCW5VdkxheWVycyA9IDA7CgoKCQkJCWlmICgganNvbi51dnMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJLy8gZGlzcmVnYXJkIGVtcHR5IGFycmF5cwoKCQkJCQlmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHsKCgkJCQkJCWlmICgganNvbi51dnNbIGkgXS5sZW5ndGggKSBuVXZMYXllcnMgKys7CgoJCQkJCX0KCgkJCQkJZm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7CgoJCQkJCQlnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTsKCgkJCQkJfQoKCQkJCX0KCgkJCQlvZmZzZXQgPSAwOwoJCQkJekxlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDsKCgkJCQl3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7CgoJCQkJCXZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgoJCQkJCXZlcnRleC54ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7CgkJCQkJdmVydGV4LnkgPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTsKCQkJCQl2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlOwoKCQkJCQlnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTsKCgkJCQl9CgoJCQkJb2Zmc2V0ID0gMDsKCQkJCXpMZW5ndGggPSBmYWNlcy5sZW5ndGg7CgoJCQkJd2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkgewoKCQkJCQl0eXBlID0gZmFjZXNbIG9mZnNldCArKyBdOwoKCQkJCQlpc1F1YWQgPSBpc0JpdFNldCggdHlwZSwgMCApOwoJCQkJCWhhc01hdGVyaWFsID0gaXNCaXRTZXQoIHR5cGUsIDEgKTsKCQkJCQloYXNGYWNlVmVydGV4VXYgPSBpc0JpdFNldCggdHlwZSwgMyApOwoJCQkJCWhhc0ZhY2VOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApOwoJCQkJCWhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNSApOwoJCQkJCWhhc0ZhY2VDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA2ICk7CgkJCQkJaGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTsKCgkJCQkJLy8gY29uc29sZS5sb2coInR5cGUiLCB0eXBlLCAiYml0cyIsIGlzUXVhZCwgaGFzTWF0ZXJpYWwsIGhhc0ZhY2VWZXJ0ZXhVdiwgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IpOwoKCQkJCQlpZiAoIGlzUXVhZCApIHsKCgkJCQkJCWZhY2VBID0gbmV3IEZhY2UzKCk7CgkJCQkJCWZhY2VBLmEgPSBmYWNlc1sgb2Zmc2V0IF07CgkJCQkJCWZhY2VBLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdOwoJCQkJCQlmYWNlQS5jID0gZmFjZXNbIG9mZnNldCArIDMgXTsKCgkJCQkJCWZhY2VCID0gbmV3IEZhY2UzKCk7CgkJCQkJCWZhY2VCLmEgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdOwoJCQkJCQlmYWNlQi5iID0gZmFjZXNbIG9mZnNldCArIDIgXTsKCQkJCQkJZmFjZUIuYyA9IGZhY2VzWyBvZmZzZXQgKyAzIF07CgoJCQkJCQlvZmZzZXQgKz0gNDsKCgkJCQkJCWlmICggaGFzTWF0ZXJpYWwgKSB7CgoJCQkJCQkJbWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKCQkJCQkJCWZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4OwoJCQkJCQkJZmFjZUIubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7CgoJCQkJCQl9CgoJCQkJCQkvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2UKCgkJCQkJCWZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoOwoKCQkJCQkJaWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7CgoJCQkJCQkJZm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7CgoJCQkJCQkJCXV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdOwoKCQkJCQkJCQlnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTsKCQkJCQkJCQlnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107CgoJCQkJCQkJCWZvciAoIGogPSAwOyBqIDwgNDsgaiArKyApIHsKCgkJCQkJCQkJCXV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CgoJCQkJCQkJCQl1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTsKCQkJCQkJCQkJdiA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdOwoKCQkJCQkJCQkJdXYgPSBuZXcgVmVjdG9yMiggdSwgdiApOwoKCQkJCQkJCQkJaWYgKCBqICE9PSAyICkgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7CgkJCQkJCQkJCWlmICggaiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYgKTsKCgkJCQkJCQkJfQoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCWlmICggaGFzRmFjZU5vcm1hbCApIHsKCgkJCQkJCQlub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7CgoJCQkJCQkJZmFjZUEubm9ybWFsLnNldCgKCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAoJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCgkJCQkJCQkJbm9ybWFsc1sgbm9ybWFsSW5kZXggXQoJCQkJCQkJKTsKCgkJCQkJCQlmYWNlQi5ub3JtYWwuY29weSggZmFjZUEubm9ybWFsICk7CgoJCQkJCQl9CgoJCQkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7CgoJCQkJCQkJZm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkgewoKCQkJCQkJCQlub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7CgoJCQkJCQkJCW5vcm1hbCA9IG5ldyBWZWN0b3IzKAoJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAoJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAoJCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCBdCgkJCQkJCQkJKTsKCgoJCQkJCQkJCWlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CgkJCQkJCQkJaWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTsKCgkJCQkJCQl9CgoJCQkJCQl9CgoKCQkJCQkJaWYgKCBoYXNGYWNlQ29sb3IgKSB7CgoJCQkJCQkJY29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKCQkJCQkJCWhleCA9IGNvbG9yc1sgY29sb3JJbmRleCBdOwoKCQkJCQkJCWZhY2VBLmNvbG9yLnNldEhleCggaGV4ICk7CgkJCQkJCQlmYWNlQi5jb2xvci5zZXRIZXgoIGhleCApOwoKCQkJCQkJfQoKCgkJCQkJCWlmICggaGFzRmFjZVZlcnRleENvbG9yICkgewoKCQkJCQkJCWZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHsKCgkJCQkJCQkJY29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTsKCQkJCQkJCQloZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTsKCgkJCQkJCQkJaWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTsKCQkJCQkJCQlpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCWdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VBICk7CgkJCQkJCWdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VCICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQlmYWNlID0gbmV3IEZhY2UzKCk7CgkJCQkJCWZhY2UuYSA9IGZhY2VzWyBvZmZzZXQgKysgXTsKCQkJCQkJZmFjZS5iID0gZmFjZXNbIG9mZnNldCArKyBdOwoJCQkJCQlmYWNlLmMgPSBmYWNlc1sgb2Zmc2V0ICsrIF07CgoJCQkJCQlpZiAoIGhhc01hdGVyaWFsICkgewoKCQkJCQkJCW1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CgkJCQkJCQlmYWNlLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4OwoKCQkJCQkJfQoKCQkJCQkJLy8gdG8gZ2V0IGZhY2UgPD0+IHV2IGluZGV4IGNvcnJlc3BvbmRlbmNlCgoJCQkJCQlmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDsKCgkJCQkJCWlmICggaGFzRmFjZVZlcnRleFV2ICkgewoKCQkJCQkJCWZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkgewoKCQkJCQkJCQl1dkxheWVyID0ganNvbi51dnNbIGkgXTsKCgkJCQkJCQkJZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107CgoJCQkJCQkJCWZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHsKCgkJCQkJCQkJCXV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CgoJCQkJCQkJCQl1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTsKCQkJCQkJCQkJdiA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdOwoKCQkJCQkJCQkJdXYgPSBuZXcgVmVjdG9yMiggdSwgdiApOwoKCQkJCQkJCQkJZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCQlpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7CgoJCQkJCQkJbm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzOwoKCQkJCQkJCWZhY2Uubm9ybWFsLnNldCgKCQkJCQkJCQlub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLAoJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCgkJCQkJCQkJbm9ybWFsc1sgbm9ybWFsSW5kZXggXQoJCQkJCQkJKTsKCgkJCQkJCX0KCgkJCQkJCWlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKCgkJCQkJCQlmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7CgoJCQkJCQkJCW5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMzsKCgkJCQkJCQkJbm9ybWFsID0gbmV3IFZlY3RvcjMoCgkJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCgkJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sCgkJCQkJCQkJCW5vcm1hbHNbIG5vcm1hbEluZGV4IF0KCQkJCQkJCQkpOwoKCQkJCQkJCQlmYWNlLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CgoJCQkJCQkJfQoKCQkJCQkJfQoKCgkJCQkJCWlmICggaGFzRmFjZUNvbG9yICkgewoKCQkJCQkJCWNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CgkJCQkJCQlmYWNlLmNvbG9yLnNldEhleCggY29sb3JzWyBjb2xvckluZGV4IF0gKTsKCgkJCQkJCX0KCgoJCQkJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHsKCgkJCQkJCQlmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7CgoJCQkJCQkJCWNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07CgkJCQkJCQkJZmFjZS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGNvbG9ySW5kZXggXSApICk7CgoJCQkJCQkJfQoKCQkJCQkJfQoKCQkJCQkJZ2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfQoKCQkJZnVuY3Rpb24gcGFyc2VTa2luKCBqc29uLCBnZW9tZXRyeSApIHsKCgkJCQl2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCA6IDI7CgoJCQkJaWYgKCBqc29uLnNraW5XZWlnaHRzICkgewoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHsKCgkJCQkJCXZhciB4ID0ganNvbi5za2luV2VpZ2h0c1sgaSBdOwoJCQkJCQl2YXIgeSA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAxIF0gOiAwOwoJCQkJCQl2YXIgeiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAyIF0gOiAwOwoJCQkJCQl2YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAzIF0gOiAwOwoKCQkJCQkJZ2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICgganNvbi5za2luSW5kaWNlcyApIHsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luSW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7CgoJCQkJCQl2YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTsKCQkJCQkJdmFyIGIgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMSBdIDogMDsKCQkJCQkJdmFyIGMgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMiBdIDogMDsKCQkJCQkJdmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDsKCgkJCQkJCWdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQlnZW9tZXRyeS5ib25lcyA9IGpzb24uYm9uZXM7CgoJCQkJaWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICYmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICE9PSBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggfHwgZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICE9PSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKSApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnV2hlbiBza2lubmluZywgbnVtYmVyIG9mIHZlcnRpY2VzICgnICsgZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICsgJyksIHNraW5JbmRpY2VzICgnICsKCQkJCQkJZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICsgJyksIGFuZCBza2luV2VpZ2h0cyAoJyArIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCArICcpIHNob3VsZCBtYXRjaC4nICk7CgoJCQkJfQoKCQkJfQoKCQkJZnVuY3Rpb24gcGFyc2VNb3JwaGluZygganNvbiwgZ2VvbWV0cnkgKSB7CgoJCQkJdmFyIHNjYWxlID0ganNvbi5zY2FsZTsKCgkJCQlpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCQlnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXSA9IHt9OwoJCQkJCQlnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS5uYW1lOwoJCQkJCQlnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdOwoKCQkJCQkJdmFyIGRzdFZlcnRpY2VzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7CgkJCQkJCXZhciBzcmNWZXJ0aWNlcyA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7CgoJCQkJCQlmb3IgKCB2YXIgdiA9IDAsIHZsID0gc3JjVmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKz0gMyApIHsKCgkJCQkJCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKCQkJCQkJCXZlcnRleC54ID0gc3JjVmVydGljZXNbIHYgXSAqIHNjYWxlOwoJCQkJCQkJdmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlOwoJCQkJCQkJdmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlOwoKCQkJCQkJCWRzdFZlcnRpY2VzLnB1c2goIHZlcnRleCApOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICgganNvbi5tb3JwaENvbG9ycyAhPT0gdW5kZWZpbmVkICYmIGpzb24ubW9ycGhDb2xvcnMubGVuZ3RoID4gMCApIHsKCgkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogIm1vcnBoQ29sb3JzIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0aGVtIGFzIGZhY2UgY29sb3JzLicgKTsKCgkJCQkJdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CgkJCQkJdmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9yczsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJCWZhY2VzWyBpIF0uY29sb3IuZnJvbUFycmF5KCBtb3JwaENvbG9ycywgaSAqIDMgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0KCgkJCWZ1bmN0aW9uIHBhcnNlQW5pbWF0aW9ucygganNvbiwgZ2VvbWV0cnkgKSB7CgoJCQkJdmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTsKCgkJCQkvLyBwYXJzZSBvbGQgc3R5bGUgQm9uZS9IaWVyYXJjaHkgYW5pbWF0aW9ucwoJCQkJdmFyIGFuaW1hdGlvbnMgPSBbXTsKCgkJCQlpZiAoIGpzb24uYW5pbWF0aW9uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCWFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb24gKTsKCgkJCQl9CgoJCQkJaWYgKCBqc29uLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJaWYgKCBqc29uLmFuaW1hdGlvbnMubGVuZ3RoICkgewoKCQkJCQkJYW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMuY29uY2F0KCBqc29uLmFuaW1hdGlvbnMgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb25zICk7CgoJCQkJCX0KCgkJCQl9CgoJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCXZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZUFuaW1hdGlvbiggYW5pbWF0aW9uc1sgaSBdLCBnZW9tZXRyeS5ib25lcyApOwoJCQkJCWlmICggY2xpcCApIG91dHB1dEFuaW1hdGlvbnMucHVzaCggY2xpcCApOwoKCQkJCX0KCgkJCQkvLyBwYXJzZSBpbXBsaWNpdCBtb3JwaCBhbmltYXRpb25zCgkJCQlpZiAoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHsKCgkJCQkJLy8gVE9ETzogRmlndXJlIG91dCB3aGF0IGFuIGFwcHJvcHJhaXRlIEZQUyBpcyBmb3IgbW9ycGggdGFyZ2V0IGFuaW1hdGlvbnMgLS0gZGVmYXVsdGluZyB0byAxMCwgYnV0IHJlYWxseSBpdCBpcyBjb21wbGV0ZWx5IGFyYml0cmFyeS4KCQkJCQl2YXIgbW9ycGhBbmltYXRpb25DbGlwcyA9IEFuaW1hdGlvbkNsaXAuQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cywgMTAgKTsKCQkJCQlvdXRwdXRBbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9ucy5jb25jYXQoIG1vcnBoQW5pbWF0aW9uQ2xpcHMgKTsKCgkJCQl9CgoJCQkJaWYgKCBvdXRwdXRBbmltYXRpb25zLmxlbmd0aCA+IDAgKSBnZW9tZXRyeS5hbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9uczsKCgkJCX0KCgkJCXJldHVybiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVQYXRoICkgewoKCQkJCWlmICgganNvbi5kYXRhICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCS8vIEdlb21ldHJ5IDQuMCBzcGVjCgkJCQkJanNvbiA9IGpzb24uZGF0YTsKCgkJCQl9CgoJCQkJaWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCWpzb24uc2NhbGUgPSAxLjAgLyBqc29uLnNjYWxlOwoKCQkJCX0gZWxzZSB7CgoJCQkJCWpzb24uc2NhbGUgPSAxLjA7CgoJCQkJfQoKCQkJCXZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpOwoKCQkJCXBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICk7CgkJCQlwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICk7CgkJCQlwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApOwoJCQkJcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApOwoKCQkJCWdlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpOwoJCQkJZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CgoJCQkJaWYgKCBqc29uLm1hdGVyaWFscyA9PT0gdW5kZWZpbmVkIHx8IGpzb24ubWF0ZXJpYWxzLmxlbmd0aCA9PT0gMCApIHsKCgkJCQkJcmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07CgoJCQkJfSBlbHNlIHsKCgkJCQkJdmFyIG1hdGVyaWFscyA9IExvYWRlci5wcm90b3R5cGUuaW5pdE1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVQYXRoLCB0aGlzLmNyb3NzT3JpZ2luICk7CgoJCQkJCXJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSwgbWF0ZXJpYWxzOiBtYXRlcmlhbHMgfTsKCgkJCQl9CgoJCQl9OwoKCQl9ICkoKQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7CgoJCXRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyOwoJCXRoaXMudGV4dHVyZVBhdGggPSAnJzsKCgl9CgoJT2JqZWN0LmFzc2lnbiggT2JqZWN0TG9hZGVyLnByb3RvdHlwZSwgewoKCQlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKCQkJaWYgKCB0aGlzLnRleHR1cmVQYXRoID09PSAnJyApIHsKCgkJCQl0aGlzLnRleHR1cmVQYXRoID0gdXJsLnN1YnN0cmluZyggMCwgdXJsLmxhc3RJbmRleE9mKCAnaW5kZXguaHRtbCcgKSArIDEgKTsKCgkJCX0KCgkJCXZhciBzY29wZSA9IHRoaXM7CgoJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTsKCQkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgewoKCQkJCXZhciBqc29uID0gbnVsbDsKCgkJCQl0cnkgewoKCQkJCQlqc29uID0gSlNPTi5wYXJzZSggdGV4dCApOwoKCQkJCX0gY2F0Y2ggKCBlcnJvciApIHsKCgkJCQkJaWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBlcnJvciApOwoKCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cJ3QgcGFyc2UgJyArIHVybCArICcuJywgZXJyb3IubWVzc2FnZSApOwoKCQkJCQlyZXR1cm47CgoJCQkJfQoKCQkJCXZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7CgoJCQkJaWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7CgoJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblwndCBsb2FkICcgKyB1cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTsKCQkJCQlyZXR1cm47CgoJCQkJfQoKCQkJCXNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTsKCgkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCgkJfSwKCgkJc2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7CgoJCX0sCgoJCXNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlOwoKCQl9LAoKCQlwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7CgoJCQl2YXIgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlKCBqc29uLnNoYXBlcyApOwoJCQl2YXIgZ2VvbWV0cmllcyA9IHRoaXMucGFyc2VHZW9tZXRyaWVzKCBqc29uLmdlb21ldHJpZXMsIHNoYXBlcyApOwoKCQkJdmFyIGltYWdlcyA9IHRoaXMucGFyc2VJbWFnZXMoIGpzb24uaW1hZ2VzLCBmdW5jdGlvbiAoKSB7CgoJCQkJaWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7CgoJCQl9ICk7CgoJCQl2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApOwoJCQl2YXIgbWF0ZXJpYWxzID0gdGhpcy5wYXJzZU1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVzICk7CgoJCQl2YXIgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgganNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApOwoKCQkJaWYgKCBqc29uLmFuaW1hdGlvbnMgKSB7CgoJCQkJb2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7CgoJCQl9CgoJCQlpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkgewoKCQkJCWlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApOwoKCQkJfQoKCQkJcmV0dXJuIG9iamVjdDsKCgkJfSwKCgkJcGFyc2VTaGFwZTogZnVuY3Rpb24gKCBqc29uICkgewoKCQkJdmFyIHNoYXBlcyA9IHt9OwoKCQkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQl2YXIgc2hhcGUgPSBuZXcgU2hhcGUoKS5mcm9tSlNPTigganNvblsgaSBdICk7CgoJCQkJCXNoYXBlc1sgc2hhcGUudXVpZCBdID0gc2hhcGU7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHNoYXBlczsKCgkJfSwKCgkJcGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24sIHNoYXBlcyApIHsKCgkJCXZhciBnZW9tZXRyaWVzID0ge307CgoJCQlpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQl2YXIgZ2VvbWV0cnlMb2FkZXIgPSBuZXcgSlNPTkxvYWRlcigpOwoJCQkJdmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQl2YXIgZ2VvbWV0cnk7CgkJCQkJdmFyIGRhdGEgPSBqc29uWyBpIF07CgoJCQkJCXN3aXRjaCAoIGRhdGEudHlwZSApIHsKCgkJCQkJCWNhc2UgJ1BsYW5lR2VvbWV0cnknOgoJCQkJCQljYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzoKCgkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKCQkJCQkJCQlkYXRhLndpZHRoLAoJCQkJCQkJCWRhdGEuaGVpZ2h0LAoJCQkJCQkJCWRhdGEud2lkdGhTZWdtZW50cywKCQkJCQkJCQlkYXRhLmhlaWdodFNlZ21lbnRzCgkJCQkJCQkpOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnQm94R2VvbWV0cnknOgoJCQkJCQljYXNlICdCb3hCdWZmZXJHZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ0N1YmVHZW9tZXRyeSc6IC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlCgoJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCgkJCQkJCQkJZGF0YS53aWR0aCwKCQkJCQkJCQlkYXRhLmhlaWdodCwKCQkJCQkJCQlkYXRhLmRlcHRoLAoJCQkJCQkJCWRhdGEud2lkdGhTZWdtZW50cywKCQkJCQkJCQlkYXRhLmhlaWdodFNlZ21lbnRzLAoJCQkJCQkJCWRhdGEuZGVwdGhTZWdtZW50cwoJCQkJCQkJKTsKCgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ0NpcmNsZUdlb21ldHJ5JzoKCQkJCQkJY2FzZSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknOgoKCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAoJCQkJCQkJCWRhdGEucmFkaXVzLAoJCQkJCQkJCWRhdGEuc2VnbWVudHMsCgkJCQkJCQkJZGF0YS50aGV0YVN0YXJ0LAoJCQkJCQkJCWRhdGEudGhldGFMZW5ndGgKCQkJCQkJCSk7CgoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdDeWxpbmRlckdlb21ldHJ5JzoKCQkJCQkJY2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6CgoJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCgkJCQkJCQkJZGF0YS5yYWRpdXNUb3AsCgkJCQkJCQkJZGF0YS5yYWRpdXNCb3R0b20sCgkJCQkJCQkJZGF0YS5oZWlnaHQsCgkJCQkJCQkJZGF0YS5yYWRpYWxTZWdtZW50cywKCQkJCQkJCQlkYXRhLmhlaWdodFNlZ21lbnRzLAoJCQkJCQkJCWRhdGEub3BlbkVuZGVkLAoJCQkJCQkJCWRhdGEudGhldGFTdGFydCwKCQkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCgkJCQkJCQkpOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnQ29uZUdlb21ldHJ5JzoKCQkJCQkJY2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzoKCgkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKCQkJCQkJCQlkYXRhLnJhZGl1cywKCQkJCQkJCQlkYXRhLmhlaWdodCwKCQkJCQkJCQlkYXRhLnJhZGlhbFNlZ21lbnRzLAoJCQkJCQkJCWRhdGEuaGVpZ2h0U2VnbWVudHMsCgkJCQkJCQkJZGF0YS5vcGVuRW5kZWQsCgkJCQkJCQkJZGF0YS50aGV0YVN0YXJ0LAoJCQkJCQkJCWRhdGEudGhldGFMZW5ndGgKCQkJCQkJCSk7CgoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdTcGhlcmVHZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzoKCgkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKCQkJCQkJCQlkYXRhLnJhZGl1cywKCQkJCQkJCQlkYXRhLndpZHRoU2VnbWVudHMsCgkJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cywKCQkJCQkJCQlkYXRhLnBoaVN0YXJ0LAoJCQkJCQkJCWRhdGEucGhpTGVuZ3RoLAoJCQkJCQkJCWRhdGEudGhldGFTdGFydCwKCQkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCgkJCQkJCQkpOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOgoJCQkJCQljYXNlICdEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOgoJCQkJCQljYXNlICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzoKCQkJCQkJY2FzZSAnT2N0YWhlZHJvbkdlb21ldHJ5JzoKCQkJCQkJY2FzZSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzoKCQkJCQkJY2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknOgoKCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAoJCQkJCQkJCWRhdGEucmFkaXVzLAoJCQkJCQkJCWRhdGEuZGV0YWlsCgkJCQkJCQkpOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnUmluZ0dlb21ldHJ5JzoKCQkJCQkJY2FzZSAnUmluZ0J1ZmZlckdlb21ldHJ5JzoKCgkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKCQkJCQkJCQlkYXRhLmlubmVyUmFkaXVzLAoJCQkJCQkJCWRhdGEub3V0ZXJSYWRpdXMsCgkJCQkJCQkJZGF0YS50aGV0YVNlZ21lbnRzLAoJCQkJCQkJCWRhdGEucGhpU2VnbWVudHMsCgkJCQkJCQkJZGF0YS50aGV0YVN0YXJ0LAoJCQkJCQkJCWRhdGEudGhldGFMZW5ndGgKCQkJCQkJCSk7CgoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdUb3J1c0dlb21ldHJ5JzoKCQkJCQkJY2FzZSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc6CgoJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCgkJCQkJCQkJZGF0YS5yYWRpdXMsCgkJCQkJCQkJZGF0YS50dWJlLAoJCQkJCQkJCWRhdGEucmFkaWFsU2VnbWVudHMsCgkJCQkJCQkJZGF0YS50dWJ1bGFyU2VnbWVudHMsCgkJCQkJCQkJZGF0YS5hcmMKCQkJCQkJCSk7CgoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzoKCgkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKCQkJCQkJCQlkYXRhLnJhZGl1cywKCQkJCQkJCQlkYXRhLnR1YmUsCgkJCQkJCQkJZGF0YS50dWJ1bGFyU2VnbWVudHMsCgkJCQkJCQkJZGF0YS5yYWRpYWxTZWdtZW50cywKCQkJCQkJCQlkYXRhLnAsCgkJCQkJCQkJZGF0YS5xCgkJCQkJCQkpOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnTGF0aGVHZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ0xhdGhlQnVmZmVyR2VvbWV0cnknOgoKCQkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAoJCQkJCQkJCWRhdGEucG9pbnRzLAoJCQkJCQkJCWRhdGEuc2VnbWVudHMsCgkJCQkJCQkJZGF0YS5waGlTdGFydCwKCQkJCQkJCQlkYXRhLnBoaUxlbmd0aAoJCQkJCQkJKTsKCgkJCQkJCQlicmVhazsKCgkJCQkJCWNhc2UgJ1BvbHloZWRyb25HZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc6CgoJCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCgkJCQkJCQkJZGF0YS52ZXJ0aWNlcywKCQkJCQkJCQlkYXRhLmluZGljZXMsCgkJCQkJCQkJZGF0YS5yYWRpdXMsCgkJCQkJCQkJZGF0YS5kZXRhaWxzCgkJCQkJCQkpOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnU2hhcGVHZW9tZXRyeSc6CgkJCQkJCWNhc2UgJ1NoYXBlQnVmZmVyR2VvbWV0cnknOgoKCQkJCQkJCXZhciBnZW9tZXRyeVNoYXBlcyA9IFtdOwoKCQkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCQkJCXZhciBzaGFwZSA9IHNoYXBlc1sgZGF0YS5zaGFwZXNbIGkgXSBdOwoKCQkJCQkJCQlnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApOwoKCQkJCQkJCX0KCgkJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKCQkJCQkJCQlnZW9tZXRyeVNoYXBlcywKCQkJCQkJCQlkYXRhLmN1cnZlU2VnbWVudHMKCQkJCQkJCSk7CgoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdCdWZmZXJHZW9tZXRyeSc6CgoJCQkJCQkJZ2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApOwoKCQkJCQkJCWJyZWFrOwoKCQkJCQkJY2FzZSAnR2VvbWV0cnknOgoKCQkJCQkJCWdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTsKCgkJCQkJCQlicmVhazsKCgkJCQkJCWRlZmF1bHQ6CgoJCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICInICsgZGF0YS50eXBlICsgJyInICk7CgoJCQkJCQkJY29udGludWU7CgoJCQkJCX0KCgkJCQkJZ2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDsKCgkJCQkJaWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5Lm5hbWUgPSBkYXRhLm5hbWU7CgoJCQkJCWdlb21ldHJpZXNbIGRhdGEudXVpZCBdID0gZ2VvbWV0cnk7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIGdlb21ldHJpZXM7CgoJCX0sCgoJCXBhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVzICkgewoKCQkJdmFyIG1hdGVyaWFscyA9IHt9OwoKCQkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJdmFyIGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpOwoJCQkJbG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJdmFyIGRhdGEgPSBqc29uWyBpIF07CgoJCQkJCWlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7CgoJCQkJCQkvLyBEZXByZWNhdGVkCgoJCQkJCQl2YXIgYXJyYXkgPSBbXTsKCgkJCQkJCWZvciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHsKCgkJCQkJCQlhcnJheS5wdXNoKCBsb2FkZXIucGFyc2UoIGRhdGEubWF0ZXJpYWxzWyBqIF0gKSApOwoKCQkJCQkJfQoKCQkJCQkJbWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5OwoKCQkJCQl9IGVsc2UgewoKCQkJCQkJbWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIG1hdGVyaWFsczsKCgkJfSwKCgkJcGFyc2VBbmltYXRpb25zOiBmdW5jdGlvbiAoIGpzb24gKSB7CgoJCQl2YXIgYW5pbWF0aW9ucyA9IFtdOwoKCQkJZm9yICggdmFyIGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7CgoJCQkJdmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTsKCgkJCQlhbmltYXRpb25zLnB1c2goIGNsaXAgKTsKCgkJCX0KCgkJCXJldHVybiBhbmltYXRpb25zOwoKCQl9LAoKCQlwYXJzZUltYWdlczogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7CgoJCQl2YXIgc2NvcGUgPSB0aGlzOwoJCQl2YXIgaW1hZ2VzID0ge307CgoJCQlmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHsKCgkJCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CgoJCQkJcmV0dXJuIGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHsKCgkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCgkJCQl9LCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsKCgkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CgoJCQkJfSApOwoKCQkJfQoKCQkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkgewoKCQkJCXZhciBtYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQgKTsKCgkJCQl2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCBtYW5hZ2VyICk7CgkJCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCXZhciBpbWFnZSA9IGpzb25bIGkgXTsKCQkJCQl2YXIgcGF0aCA9IC9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KCBpbWFnZS51cmwgKSA/IGltYWdlLnVybCA6IHNjb3BlLnRleHR1cmVQYXRoICsgaW1hZ2UudXJsOwoKCQkJCQlpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApOwoKCQkJCX0KCgkJCX0KCgkJCXJldHVybiBpbWFnZXM7CgoJCX0sCgoJCXBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwgaW1hZ2VzICkgewoKCQkJZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7CgoJCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlOwoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uJywgdmFsdWUgKTsKCgkJCQlyZXR1cm4gdHlwZVsgdmFsdWUgXTsKCgkJCX0KCgkJCXZhciB0ZXh0dXJlcyA9IHt9OwoKCQkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQl2YXIgZGF0YSA9IGpzb25bIGkgXTsKCgkJCQkJaWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApOwoKCQkJCQl9CgoJCQkJCWlmICggaW1hZ2VzWyBkYXRhLmltYWdlIF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlJywgZGF0YS5pbWFnZSApOwoKCQkJCQl9CgoJCQkJCXZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7CgkJCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJCXRleHR1cmUudXVpZCA9IGRhdGEudXVpZDsKCgkJCQkJaWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubmFtZSA9IGRhdGEubmFtZTsKCgkJCQkJaWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7CgoJCQkJCWlmICggZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggZGF0YS5vZmZzZXQgKTsKCQkJCQlpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7CgkJCQkJaWYgKCBkYXRhLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5jZW50ZXIuZnJvbUFycmF5KCBkYXRhLmNlbnRlciApOwoJCQkJCWlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247CgoJCQkJCWlmICggZGF0YS53cmFwICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl0ZXh0dXJlLndyYXBTID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAwIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTsKCQkJCQkJdGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7CgoJCQkJCX0KCgkJCQkJaWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTsKCQkJCQlpZiAoIGRhdGEubWFnRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFnRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApOwoJCQkJCWlmICggZGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBkYXRhLmFuaXNvdHJvcHk7CgoJCQkJCWlmICggZGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mbGlwWSA9IGRhdGEuZmxpcFk7CgoJCQkJCXRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIHRleHR1cmVzOwoKCQl9LAoKCQlwYXJzZU9iamVjdDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24gcGFyc2VPYmplY3QoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHsKCgkJCQl2YXIgb2JqZWN0OwoKCQkJCWZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkgewoKCQkJCQlpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnknLCBuYW1lICk7CgoJCQkJCX0KCgkJCQkJcmV0dXJuIGdlb21ldHJpZXNbIG5hbWUgXTsKCgkJCQl9CgoJCQkJZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7CgoJCQkJCWlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDsKCgkJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7CgoJCQkJCQl2YXIgYXJyYXkgPSBbXTsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJCQl2YXIgdXVpZCA9IG5hbWVbIGkgXTsKCgkJCQkJCQlpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApOwoKCQkJCQkJCX0KCgkJCQkJCQlhcnJheS5wdXNoKCBtYXRlcmlhbHNbIHV1aWQgXSApOwoKCQkJCQkJfQoKCQkJCQkJcmV0dXJuIGFycmF5OwoKCQkJCQl9CgoJCQkJCWlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgbmFtZSApOwoKCQkJCQl9CgoJCQkJCXJldHVybiBtYXRlcmlhbHNbIG5hbWUgXTsKCgkJCQl9CgoJCQkJc3dpdGNoICggZGF0YS50eXBlICkgewoKCQkJCQljYXNlICdTY2VuZSc6CgoJCQkJCQlvYmplY3QgPSBuZXcgU2NlbmUoKTsKCgkJCQkJCWlmICggZGF0YS5iYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkJaWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHsKCgkJCQkJCQkJb2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCWlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQlpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkgewoKCQkJCQkJCQlvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApOwoKCQkJCQkJCX0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHsKCgkJCQkJCQkJb2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cuZGVuc2l0eSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6CgoJCQkJCQlvYmplY3QgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApOwoKCQkJCQkJaWYgKCBkYXRhLmZvY3VzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZm9jdXMgPSBkYXRhLmZvY3VzOwoJCQkJCQlpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207CgkJCQkJCWlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTsKCQkJCQkJaWYgKCBkYXRhLmZpbG1PZmZzZXQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtT2Zmc2V0ID0gZGF0YS5maWxtT2Zmc2V0OwoJCQkJCQlpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7CgoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzoKCgkJCQkJCW9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdodCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7CgoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnQW1iaWVudExpZ2h0JzoKCgkJCQkJCW9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7CgoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6CgoJCQkJCQlvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTsKCgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdQb2ludExpZ2h0JzoKCgkJCQkJCW9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1JlY3RBcmVhTGlnaHQnOgoKCQkJCQkJb2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1Nwb3RMaWdodCc6CgoJCQkJCQlvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6CgoJCQkJCQlvYmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9yLCBkYXRhLmludGVuc2l0eSApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ1NraW5uZWRNZXNoJzoKCgkJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTsKCgkJCQkJY2FzZSAnTWVzaCc6CgoJCQkJCQl2YXIgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApOwoJCQkJCQl2YXIgbWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApOwoKCQkJCQkJaWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICkgewoKCQkJCQkJCW9iamVjdCA9IG5ldyBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7CgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCW9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCgkJCQkJCX0KCgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdMT0QnOgoKCQkJCQkJb2JqZWN0ID0gbmV3IExPRCgpOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ0xpbmUnOgoKCQkJCQkJb2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ0xpbmVMb29wJzoKCgkJCQkJCW9iamVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ0xpbmVTZWdtZW50cyc6CgoJCQkJCQlvYmplY3QgPSBuZXcgTGluZVNlZ21lbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CgoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAnUG9pbnRDbG91ZCc6CgkJCQkJY2FzZSAnUG9pbnRzJzoKCgkJCQkJCW9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKCgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlICdTcHJpdGUnOgoKCQkJCQkJb2JqZWN0ID0gbmV3IFNwcml0ZSggZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ0dyb3VwJzoKCgkJCQkJCW9iamVjdCA9IG5ldyBHcm91cCgpOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgoJCQkJCQlvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTsKCgkJCQl9CgoJCQkJb2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7CgoJCQkJaWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lOwoJCQkJaWYgKCBkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQltYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApOwoJCQkJCW1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCWlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApOwoJCQkJCWlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5yb3RhdGlvbiApOwoJCQkJCWlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApOwoJCQkJCWlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApOwoKCQkJCX0KCgkJCQlpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7CgkJCQlpZiAoIGRhdGEucmVjZWl2ZVNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSBkYXRhLnJlY2VpdmVTaGFkb3c7CgoJCQkJaWYgKCBkYXRhLnNoYWRvdyApIHsKCgkJCQkJaWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzOwoJCQkJCWlmICggZGF0YS5zaGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEuc2hhZG93LnJhZGl1czsKCQkJCQlpZiAoIGRhdGEuc2hhZG93Lm1hcFNpemUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoIGRhdGEuc2hhZG93Lm1hcFNpemUgKTsKCQkJCQlpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTsKCgkJCQl9CgoJCQkJaWYgKCBkYXRhLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aXNpYmxlID0gZGF0YS52aXNpYmxlOwoJCQkJaWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBvYmplY3QudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhOwoKCQkJCWlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQl2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuOwoKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCQlvYmplY3QuYWRkKCB0aGlzLnBhcnNlT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggZGF0YS50eXBlID09PSAnTE9EJyApIHsKCgkJCQkJdmFyIGxldmVscyA9IGRhdGEubGV2ZWxzOwoKCQkJCQlmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkgewoKCQkJCQkJdmFyIGxldmVsID0gbGV2ZWxzWyBsIF07CgkJCQkJCXZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApOwoKCQkJCQkJaWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJCW9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQkJcmV0dXJuIG9iamVjdDsKCgkJCX07CgoJCX0oKQoKCX0gKTsKCgl2YXIgVEVYVFVSRV9NQVBQSU5HID0gewoJCVVWTWFwcGluZzogVVZNYXBwaW5nLAoJCUN1YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLAoJCUN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLAoJCUVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZywKCQlFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsCgkJU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLAoJCUN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywKCQlDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcKCX07CgoJdmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7CgkJUmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLAoJCUNsYW1wVG9FZGdlV3JhcHBpbmc6IENsYW1wVG9FZGdlV3JhcHBpbmcsCgkJTWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZwoJfTsKCgl2YXIgVEVYVFVSRV9GSUxURVIgPSB7CgkJTmVhcmVzdEZpbHRlcjogTmVhcmVzdEZpbHRlciwKCQlOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsCgkJTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjogTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciwKCQlMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlciwKCQlMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLAoJCUxpbmVhck1pcE1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyCgl9OwoKCS8qKgoJICogQGF1dGhvciB0aGVzcGl0ZSAvIGh0dHA6Ly9jbGlja3RvcmVsZWFzZS5jb20vCgkgKi8KCglmdW5jdGlvbiBJbWFnZUJpdG1hcExvYWRlciggbWFuYWdlciApIHsKCgkJaWYgKCB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgPT09ICd1bmRlZmluZWQnICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4nICk7CgoJCX0KCgkJaWYgKCB0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4nICk7CgoJCX0KCgkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlciAhPT0gdW5kZWZpbmVkID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKCQl0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7CgoJfQoKCUltYWdlQml0bWFwTG9hZGVyLnByb3RvdHlwZSA9IHsKCgkJY29uc3RydWN0b3I6IEltYWdlQml0bWFwTG9hZGVyLAoKCQlzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKCBvcHRpb25zICkgewoKCQkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlsb2FkOiBmdW5jdGlvbiBsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCgkJCWlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJzsKCgkJCWlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7CgoJCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQkJdmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7CgoJCQlpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKCgkJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7CgoJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTsKCgkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCgkJCQl9LCAwICk7CgoJCQkJcmV0dXJuIGNhY2hlZDsKCgkJCX0KCgkJCWZldGNoKCB1cmwgKS50aGVuKCBmdW5jdGlvbiAoIHJlcyApIHsKCgkJCQlyZXR1cm4gcmVzLmJsb2IoKTsKCgkJCX0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7CgoJCQkJcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKCBibG9iLCBzY29wZS5vcHRpb25zICk7CgoJCQl9ICkudGhlbiggZnVuY3Rpb24gKCBpbWFnZUJpdG1hcCApIHsKCgkJCQlDYWNoZS5hZGQoIHVybCwgaW1hZ2VCaXRtYXAgKTsKCgkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTsKCgkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKCQkJfSApLmNhdGNoKCBmdW5jdGlvbiAoIGUgKSB7CgoJCQkJaWYgKCBvbkVycm9yICkgb25FcnJvciggZSApOwoKCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CgoJCQl9ICk7CgoJCX0sCgoJCXNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkgewoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnBhdGggPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9OwoKCS8qKgoJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwoJICogbWluaW1hbCBjbGFzcyBmb3IgcHJveGluZyBmdW5jdGlvbnMgdG8gUGF0aC4gUmVwbGFjZXMgb2xkICJleHRyYWN0U3VicGF0aHMoKSIKCSAqKi8KCglmdW5jdGlvbiBTaGFwZVBhdGgoKSB7CgoJCXRoaXMudHlwZSA9ICdTaGFwZVBhdGgnOwoKCQl0aGlzLnN1YlBhdGhzID0gW107CgkJdGhpcy5jdXJyZW50UGF0aCA9IG51bGw7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFNoYXBlUGF0aC5wcm90b3R5cGUsIHsKCgkJbW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7CgoJCQl0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTsKCQkJdGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7CgkJCXRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7CgoJCX0sCgoJCWxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkgewoKCQkJdGhpcy5jdXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTsKCgkJfSwKCgkJcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7CgoJCQl0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApOwoKCQl9LAoKCQliZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7CgoJCQl0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTsKCgkJfSwKCgkJc3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgKSB7CgoJCQl0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyApOwoKCQl9LAoKCQl0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHsKCgkJCWZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHsKCgkJCQl2YXIgc2hhcGVzID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQl2YXIgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkgXTsKCgkJCQkJdmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7CgkJCQkJdG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7CgoJCQkJCXNoYXBlcy5wdXNoKCB0bXBTaGFwZSApOwoKCQkJCX0KCgkJCQlyZXR1cm4gc2hhcGVzOwoKCQkJfQoKCQkJZnVuY3Rpb24gaXNQb2ludEluc2lkZVBvbHlnb24oIGluUHQsIGluUG9seWdvbiApIHsKCgkJCQl2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7CgoJCQkJLy8gaW5QdCBvbiBwb2x5Z29uIGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3IKCQkJCS8vIHRvZ2dsaW5nIG9mIGluc2lkZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2UKCQkJCS8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBsZWZ0IG9mIGluUHQKCQkJCS8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBhbmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lCgkJCQl2YXIgaW5zaWRlID0gZmFsc2U7CgkJCQlmb3IgKCB2YXIgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBxICsrICkgewoKCQkJCQl2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07CgkJCQkJdmFyIGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTsKCgkJCQkJdmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54OwoJCQkJCXZhciBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTsKCgkJCQkJaWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHsKCgkJCQkJCS8vIG5vdCBwYXJhbGxlbAoJCQkJCQlpZiAoIGVkZ2VEeSA8IDAgKSB7CgoJCQkJCQkJZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4OwoJCQkJCQkJZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTsKCgkJCQkJCX0KCQkJCQkJaWYgKCAoIGluUHQueSA8IGVkZ2VMb3dQdC55ICkgfHwgKCBpblB0LnkgPiBlZGdlSGlnaFB0LnkgKSApIAkJY29udGludWU7CgoJCQkJCQlpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7CgoJCQkJCQkJaWYgKCBpblB0LnggPT09IGVkZ2VMb3dQdC54ICkJCXJldHVybgl0cnVlOwkJLy8gaW5QdCBpcyBvbiBjb250b3VyID8KCQkJCQkJCS8vIGNvbnRpbnVlOwkJCQkvLyBubyBpbnRlcnNlY3Rpb24gb3IgZWRnZUxvd1B0ID0+IGRvZXNuJ3QgY291bnQgISEhCgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCXZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTsKCQkJCQkJCWlmICggcGVycEVkZ2UgPT09IDAgKQkJCQlyZXR1cm4JdHJ1ZTsJCS8vIGluUHQgaXMgb24gY29udG91ciA/CgkJCQkJCQlpZiAoIHBlcnBFZGdlIDwgMCApIAkJCQljb250aW51ZTsKCQkJCQkJCWluc2lkZSA9ICEgaW5zaWRlOwkJLy8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0CgoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQkvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXIKCQkJCQkJaWYgKCBpblB0LnkgIT09IGVkZ2VMb3dQdC55ICkgCQljb250aW51ZTsJCQkvLyBwYXJhbGxlbAoJCQkJCQkvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHQKCQkJCQkJaWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fAoJCQkJCQkJICggKCBlZGdlTG93UHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlSGlnaFB0LnggKSApICkJCXJldHVybgl0cnVlOwkvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICEKCQkJCQkJLy8gY29udGludWU7CgoJCQkJCX0KCgkJCQl9CgoJCQkJcmV0dXJuCWluc2lkZTsKCgkJCX0KCgkJCXZhciBpc0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7CgoJCQl2YXIgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzOwoJCQlpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTsKCgkJCWlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApCXJldHVybgl0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7CgoKCQkJdmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107CgoJCQlpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHsKCgkJCQl0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTsKCQkJCXRtcFNoYXBlID0gbmV3IFNoYXBlKCk7CgkJCQl0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlczsKCQkJCXNoYXBlcy5wdXNoKCB0bXBTaGFwZSApOwoJCQkJcmV0dXJuIHNoYXBlczsKCgkJCX0KCgkJCXZhciBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApOwoJCQlob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0OwoKCQkJLy8gY29uc29sZS5sb2coIkhvbGVzIGZpcnN0IiwgaG9sZXNGaXJzdCk7CgoJCQl2YXIgYmV0dGVyU2hhcGVIb2xlcyA9IFtdOwoJCQl2YXIgbmV3U2hhcGVzID0gW107CgkJCXZhciBuZXdTaGFwZUhvbGVzID0gW107CgkJCXZhciBtYWluSWR4ID0gMDsKCQkJdmFyIHRtcFBvaW50czsKCgkJCW5ld1NoYXBlc1sgbWFpbklkeCBdID0gdW5kZWZpbmVkOwoJCQluZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07CgkJCQl0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpOwoJCQkJc29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7CgkJCQlzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkOwoKCQkJCWlmICggc29saWQgKSB7CgoJCQkJCWlmICggKCAhIGhvbGVzRmlyc3QgKSAmJiAoIG5ld1NoYXBlc1sgbWFpbklkeCBdICkgKQltYWluSWR4ICsrOwoKCQkJCQluZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9OwoJCQkJCW5ld1NoYXBlc1sgbWFpbklkeCBdLnMuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7CgoJCQkJCWlmICggaG9sZXNGaXJzdCApCW1haW5JZHggKys7CgkJCQkJbmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107CgoJCQkJCS8vY29uc29sZS5sb2coJ2N3JywgaSk7CgoJCQkJfSBlbHNlIHsKCgkJCQkJbmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdLnB1c2goIHsgaDogdG1wUGF0aCwgcDogdG1wUG9pbnRzWyAwIF0gfSApOwoKCQkJCQkvL2NvbnNvbGUubG9nKCdjY3cnLCBpKTsKCgkJCQl9CgoJCQl9CgoJCQkvLyBvbmx5IEhvbGVzPyAtPiBwcm9iYWJseSBhbGwgU2hhcGVzIHdpdGggd3Jvbmcgb3JpZW50YXRpb24KCQkJaWYgKCAhIG5ld1NoYXBlc1sgMCBdICkJcmV0dXJuCXRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTsKCgoJCQlpZiAoIG5ld1NoYXBlcy5sZW5ndGggPiAxICkgewoKCQkJCXZhciBhbWJpZ3VvdXMgPSBmYWxzZTsKCQkJCXZhciB0b0NoYW5nZSA9IFtdOwoKCQkJCWZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkgewoKCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0gPSBbXTsKCgkJCQl9CgoJCQkJZm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7CgoJCQkJCXZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07CgoJCQkJCWZvciAoIHZhciBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7CgoJCQkJCQl2YXIgaG8gPSBzaG9bIGhJZHggXTsKCQkJCQkJdmFyIGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7CgoJCQkJCQlmb3IgKCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkgewoKCQkJCQkJCWlmICggaXNQb2ludEluc2lkZVBvbHlnb24oIGhvLnAsIG5ld1NoYXBlc1sgczJJZHggXS5wICkgKSB7CgoJCQkJCQkJCWlmICggc0lkeCAhPT0gczJJZHggKQl0b0NoYW5nZS5wdXNoKCB7IGZyb21zOiBzSWR4LCB0b3M6IHMySWR4LCBob2xlOiBoSWR4IH0gKTsKCQkJCQkJCQlpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHsKCgkJCQkJCQkJCWhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlOwoJCQkJCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzMklkeCBdLnB1c2goIGhvICk7CgoJCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCQlhbWJpZ3VvdXMgPSB0cnVlOwoKCQkJCQkJCQl9CgoJCQkJCQkJfQoKCQkJCQkJfQoJCQkJCQlpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHsKCgkJCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCQkJCS8vIGNvbnNvbGUubG9nKCJhbWJpZ3VvdXM6ICIsIGFtYmlndW91cyk7CgkJCQlpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7CgoJCQkJCS8vIGNvbnNvbGUubG9nKCJ0byBjaGFuZ2U6ICIsIHRvQ2hhbmdlKTsKCQkJCQlpZiAoICEgYW1iaWd1b3VzICkJbmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7CgoJCQkJfQoKCQkJfQoKCQkJdmFyIHRtcEhvbGVzOwoKCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG5ld1NoYXBlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCgkJCQl0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7CgkJCQlzaGFwZXMucHVzaCggdG1wU2hhcGUgKTsKCQkJCXRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdOwoKCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCgkJCQkJdG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7CgoJCQkJfQoKCQkJfQoKCQkJLy9jb25zb2xlLmxvZygic2hhcGUiLCBzaGFwZXMpOwoKCQkJcmV0dXJuIHNoYXBlczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBGb250KCBkYXRhICkgewoKCQl0aGlzLnR5cGUgPSAnRm9udCc7CgoJCXRoaXMuZGF0YSA9IGRhdGE7CgoJfQoKCU9iamVjdC5hc3NpZ24oIEZvbnQucHJvdG90eXBlLCB7CgoJCWlzRm9udDogdHJ1ZSwKCgkJZ2VuZXJhdGVTaGFwZXM6IGZ1bmN0aW9uICggdGV4dCwgc2l6ZSwgZGl2aXNpb25zICkgewoKCQkJZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQgKSB7CgoJCQkJdmFyIGNoYXJzID0gU3RyaW5nKCB0ZXh0ICkuc3BsaXQoICcnICk7CgkJCQl2YXIgc2NhbGUgPSBzaXplIC8gZGF0YS5yZXNvbHV0aW9uOwoJCQkJdmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7CgoJCQkJdmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDsKCgkJCQl2YXIgcGF0aHMgPSBbXTsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCXZhciBjaGFyID0gY2hhcnNbIGkgXTsKCgkJCQkJaWYgKCBjaGFyID09PSAnXG4nICkgewoKCQkJCQkJb2Zmc2V0WCA9IDA7CgkJCQkJCW9mZnNldFkgLT0gbGluZV9oZWlnaHQ7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQl2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFkgKTsKCQkJCQkJb2Zmc2V0WCArPSByZXQub2Zmc2V0WDsKCQkJCQkJcGF0aHMucHVzaCggcmV0LnBhdGggKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQlyZXR1cm4gcGF0aHM7CgoJCQl9CgoJCQlmdW5jdGlvbiBjcmVhdGVQYXRoKCBjLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSApIHsKCgkJCQl2YXIgZ2x5cGggPSBkYXRhLmdseXBoc1sgYyBdIHx8IGRhdGEuZ2x5cGhzWyAnPycgXTsKCgkJCQlpZiAoICEgZ2x5cGggKSByZXR1cm47CgoJCQkJdmFyIHBhdGggPSBuZXcgU2hhcGVQYXRoKCk7CgoJCQkJdmFyIHB0cyA9IFtdOwoJCQkJdmFyIHgsIHksIGNweCwgY3B5LCBjcHgwLCBjcHkwLCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBsYXN0ZTsKCgkJCQlpZiAoIGdseXBoLm8gKSB7CgoJCQkJCXZhciBvdXRsaW5lID0gZ2x5cGguX2NhY2hlZE91dGxpbmUgfHwgKCBnbHlwaC5fY2FjaGVkT3V0bGluZSA9IGdseXBoLm8uc3BsaXQoICcgJyApICk7CgoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7CgoJCQkJCQl2YXIgYWN0aW9uID0gb3V0bGluZVsgaSArKyBdOwoKCQkJCQkJc3dpdGNoICggYWN0aW9uICkgewoKCQkJCQkJCWNhc2UgJ20nOiAvLyBtb3ZlVG8KCgkJCQkJCQkJeCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKCQkJCQkJCQl5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZOwoKCQkJCQkJCQlwYXRoLm1vdmVUbyggeCwgeSApOwoKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICdsJzogLy8gbGluZVRvCgoJCQkJCQkJCXggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CgkJCQkJCQkJeSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKCgkJCQkJCQkJcGF0aC5saW5lVG8oIHgsIHkgKTsKCgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAncSc6IC8vIHF1YWRyYXRpY0N1cnZlVG8KCgkJCQkJCQkJY3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOwoJCQkJCQkJCWNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKCQkJCQkJCQljcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOwoJCQkJCQkJCWNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CgoJCQkJCQkJCXBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTsKCgkJCQkJCQkJbGFzdGUgPSBwdHNbIHB0cy5sZW5ndGggLSAxIF07CgoJCQkJCQkJCWlmICggbGFzdGUgKSB7CgoJCQkJCQkJCQljcHgwID0gbGFzdGUueDsKCQkJCQkJCQkJY3B5MCA9IGxhc3RlLnk7CgoJCQkJCQkJCQkKCgkJCQkJCQkJfQoKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUbwoKCQkJCQkJCQljcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CgkJCQkJCQkJY3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZOwoJCQkJCQkJCWNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CgkJCQkJCQkJY3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKCQkJCQkJCQljcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOwoJCQkJCQkJCWNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CgoJCQkJCQkJCXBhdGguYmV6aWVyQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4MiwgY3B5MiwgY3B4LCBjcHkgKTsKCgkJCQkJCQkJbGFzdGUgPSBwdHNbIHB0cy5sZW5ndGggLSAxIF07CgoJCQkJCQkJCWlmICggbGFzdGUgKSB7CgoJCQkJCQkJCQljcHgwID0gbGFzdGUueDsKCQkJCQkJCQkJY3B5MCA9IGxhc3RlLnk7CgoJCQkJCQkJCQkKCgkJCQkJCQkJfQoKCQkJCQkJCQlicmVhazsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCgkJCQlyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07CgoJCQl9CgoJCQkvLwoKCQkJaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTAwOwoJCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDsKCgkJCXZhciBkYXRhID0gdGhpcy5kYXRhOwoKCQkJdmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQgKTsKCQkJdmFyIHNoYXBlcyA9IFtdOwoKCQkJZm9yICggdmFyIHAgPSAwLCBwbCA9IHBhdGhzLmxlbmd0aDsgcCA8IHBsOyBwICsrICkgewoKCQkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApOwoKCQkJfQoKCQkJcmV0dXJuIHNoYXBlczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBGb250TG9hZGVyKCBtYW5hZ2VyICkgewoKCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKCgl9CgoJT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHsKCgkJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCgkJCXZhciBzY29wZSA9IHRoaXM7CgoJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOwoJCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CgkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKCgkJCQl2YXIganNvbjsKCgkJCQl0cnkgewoKCQkJCQlqc29uID0gSlNPTi5wYXJzZSggdGV4dCApOwoKCQkJCX0gY2F0Y2ggKCBlICkgewoKCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuJyApOwoJCQkJCWpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7CgoJCQkJfQoKCQkJCXZhciBmb250ID0gc2NvcGUucGFyc2UoIGpzb24gKTsKCgkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggZm9udCApOwoKCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKCQl9LAoKCQlwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgewoKCQkJcmV0dXJuIG5ldyBGb250KCBqc29uICk7CgoJCX0sCgoJCXNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnBhdGggPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJdmFyIGNvbnRleHQ7CgoJdmFyIEF1ZGlvQ29udGV4dCA9IHsKCgkJZ2V0Q29udGV4dDogZnVuY3Rpb24gKCkgewoKCQkJaWYgKCBjb250ZXh0ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJY29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7CgoJCQl9CgoJCQlyZXR1cm4gY29udGV4dDsKCgkJfSwKCgkJc2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCWNvbnRleHQgPSB2YWx1ZTsKCgkJfQoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkgewoKCQl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKCgl9CgoJT2JqZWN0LmFzc2lnbiggQXVkaW9Mb2FkZXIucHJvdG90eXBlLCB7CgoJCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgoJCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOwoJCQlsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7CgkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkgewoKCQkJCXZhciBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTsKCgkJCQljb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyLCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkgewoKCQkJCQlvbkxvYWQoIGF1ZGlvQnVmZmVyICk7CgoJCQkJfSApOwoKCQkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIFN0ZXJlb0NhbWVyYSgpIHsKCgkJdGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7CgoJCXRoaXMuYXNwZWN0ID0gMTsKCgkJdGhpcy5leWVTZXAgPSAwLjA2NDsKCgkJdGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7CgkJdGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTsKCQl0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKCQl0aGlzLmNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTsKCQl0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApOwoJCXRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHsKCgkJdXBkYXRlOiAoIGZ1bmN0aW9uICgpIHsKCgkJCXZhciBpbnN0YW5jZSwgZm9jdXMsIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIsIHpvb20sIGV5ZVNlcDsKCgkJCXZhciBleWVSaWdodCA9IG5ldyBNYXRyaXg0KCk7CgkJCXZhciBleWVMZWZ0ID0gbmV3IE1hdHJpeDQoKTsKCgkJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHsKCgkJCQl2YXIgbmVlZHNVcGRhdGUgPSBpbnN0YW5jZSAhPT0gdGhpcyB8fCBmb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGZvdiAhPT0gY2FtZXJhLmZvdiB8fAoJCQkJCQkJCQkJCQkJYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgbmVhciAhPT0gY2FtZXJhLm5lYXIgfHwKCQkJCQkJCQkJCQkJCWZhciAhPT0gY2FtZXJhLmZhciB8fCB6b29tICE9PSBjYW1lcmEuem9vbSB8fCBleWVTZXAgIT09IHRoaXMuZXllU2VwOwoKCQkJCWlmICggbmVlZHNVcGRhdGUgKSB7CgoJCQkJCWluc3RhbmNlID0gdGhpczsKCQkJCQlmb2N1cyA9IGNhbWVyYS5mb2N1czsKCQkJCQlmb3YgPSBjYW1lcmEuZm92OwoJCQkJCWFzcGVjdCA9IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdDsKCQkJCQluZWFyID0gY2FtZXJhLm5lYXI7CgkJCQkJZmFyID0gY2FtZXJhLmZhcjsKCQkJCQl6b29tID0gY2FtZXJhLnpvb207CgoJCQkJCS8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb24KCQkJCQkvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyLwoKCQkJCQl2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7CgkJCQkJZXllU2VwID0gdGhpcy5leWVTZXAgLyAyOwoJCQkJCXZhciBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7CgkJCQkJdmFyIHltYXggPSAoIG5lYXIgKiBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIGZvdiAqIDAuNSApICkgLyB6b29tOwoJCQkJCXZhciB4bWluLCB4bWF4OwoKCQkJCQkvLyB0cmFuc2xhdGUgeE9mZnNldAoKCQkJCQlleWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7CgkJCQkJZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXA7CgoJCQkJCS8vIGZvciBsZWZ0IGV5ZQoKCQkJCQl4bWluID0gLSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uOwoJCQkJCXhtYXggPSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uOwoKCQkJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTsKCQkJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7CgoJCQkJCXRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTsKCgkJCQkJLy8gZm9yIHJpZ2h0IGV5ZQoKCQkJCQl4bWluID0gLSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uOwoJCQkJCXhtYXggPSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uOwoKCQkJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTsKCQkJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7CgoJCQkJCXRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTsKCgkJCQl9CgoJCQkJdGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVMZWZ0ICk7CgkJCQl0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZVJpZ2h0ICk7CgoJCQl9OwoKCQl9ICkoKQoKCX0gKTsKCgkvKioKCSAqIENhbWVyYSBmb3IgcmVuZGVyaW5nIGN1YmUgbWFwcwoJICoJLSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmUKCSAqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICovCgoJZnVuY3Rpb24gQ3ViZUNhbWVyYSggbmVhciwgZmFyLCBjdWJlUmVzb2x1dGlvbiApIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7CgoJCXZhciBmb3YgPSA5MCwgYXNwZWN0ID0gMTsKCgkJdmFyIGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CgkJY2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTsKCQljYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTsKCQl0aGlzLmFkZCggY2FtZXJhUFggKTsKCgkJdmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CgkJY2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTsKCQljYW1lcmFOWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSApOwoJCXRoaXMuYWRkKCBjYW1lcmFOWCApOwoKCQl2YXIgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKCQljYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTsKCQljYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTsKCQl0aGlzLmFkZCggY2FtZXJhUFkgKTsKCgkJdmFyIGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CgkJY2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTsKCQljYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApOwoJCXRoaXMuYWRkKCBjYW1lcmFOWSApOwoKCQl2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKCQljYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApOwoJCWNhbWVyYVBaLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSApOwoJCXRoaXMuYWRkKCBjYW1lcmFQWiApOwoKCQl2YXIgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKCQljYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApOwoJCWNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7CgkJdGhpcy5hZGQoIGNhbWVyYU5aICk7CgoJCXZhciBvcHRpb25zID0geyBmb3JtYXQ6IFJHQkZvcm1hdCwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyIH07CgoJCXRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7CgkJdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gIkN1YmVDYW1lcmEiOwoKCQl0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkgewoKCQkJaWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTsKCgkJCXZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDsKCQkJdmFyIGdlbmVyYXRlTWlwbWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsKCgkJCXJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwoKCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMDsKCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFgsIHJlbmRlclRhcmdldCApOwoKCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMTsKCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlgsIHJlbmRlclRhcmdldCApOwoKCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMjsKCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFksIHJlbmRlclRhcmdldCApOwoKCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMzsKCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlksIHJlbmRlclRhcmdldCApOwoKCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNDsKCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFosIHJlbmRlclRhcmdldCApOwoKCQkJcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZ2VuZXJhdGVNaXBtYXBzOwoKCQkJcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNTsKCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlosIHJlbmRlclRhcmdldCApOwoKCQkJcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7CgoJCX07CgoJCXRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7CgoJCQl2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKCQkJCXJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IGk7CgkJCQlyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApOwoKCQkJCXJlbmRlcmVyLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTsKCgkJCX0KCgkJCXJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApOwoKCQl9OwoKCX0KCglDdWJlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApOwoJQ3ViZUNhbWVyYS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlQ2FtZXJhOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIEF1ZGlvTGlzdGVuZXIoKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInOwoKCQl0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpOwoKCQl0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpOwoJCXRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKCgkJdGhpcy5maWx0ZXIgPSBudWxsOwoKCX0KCglBdWRpb0xpc3RlbmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBBdWRpb0xpc3RlbmVyLAoKCQlnZXRJbnB1dDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuZ2FpbjsKCgkJfSwKCgkJcmVtb3ZlRmlsdGVyOiBmdW5jdGlvbiAoICkgewoKCQkJaWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTsKCQkJCXRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOwoJCQkJdGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOwoJCQkJdGhpcy5maWx0ZXIgPSBudWxsOwoKCQkJfQoKCQl9LAoKCQlnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLmZpbHRlcjsKCgkJfSwKCgkJc2V0RmlsdGVyOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJaWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTsKCQkJCXRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOwoKCQkJfSBlbHNlIHsKCgkJCQl0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7CgoJCQl9CgoJCQl0aGlzLmZpbHRlciA9IHZhbHVlOwoJCQl0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTsKCQkJdGhpcy5maWx0ZXIuY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7CgoJCX0sCgoJCWdldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlOwoKCQl9LAoKCQlzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IHZhbHVlOwoKCQl9LAoKCQl1cGRhdGVNYXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOwoJCQl2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CgkJCXZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7CgoJCQl2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpOwoKCQkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHsKCgkJCQlPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTsKCgkJCQl2YXIgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7CgkJCQl2YXIgdXAgPSB0aGlzLnVwOwoKCQkJCXRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTsKCgkJCQlvcmllbnRhdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApOwoKCQkJCWlmICggbGlzdGVuZXIucG9zaXRpb25YICkgewoKCQkJCQlsaXN0ZW5lci5wb3NpdGlvblguc2V0VmFsdWVBdFRpbWUoIHBvc2l0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOwoJCQkJCWxpc3RlbmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CgkJCQkJbGlzdGVuZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKCQkJCQlsaXN0ZW5lci5mb3J3YXJkWC5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CgkJCQkJbGlzdGVuZXIuZm9yd2FyZFkuc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOwoJCQkJCWxpc3RlbmVyLmZvcndhcmRaLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKCQkJCQlsaXN0ZW5lci51cFguc2V0VmFsdWVBdFRpbWUoIHVwLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApOwoJCQkJCWxpc3RlbmVyLnVwWS5zZXRWYWx1ZUF0VGltZSggdXAueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7CgkJCQkJbGlzdGVuZXIudXBaLnNldFZhbHVlQXRUaW1lKCB1cC56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKCgkJCQl9IGVsc2UgewoKCQkJCQlsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApOwoJCQkJCWxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBvcmllbnRhdGlvbi54LCBvcmllbnRhdGlvbi55LCBvcmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7CgoJCQkJfQoKCQkJfTsKCgkJfSApKCkKCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vCgkgKi8KCglmdW5jdGlvbiBBdWRpbyggbGlzdGVuZXIgKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0F1ZGlvJzsKCgkJdGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDsKCgkJdGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTsKCQl0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSApOwoKCQl0aGlzLmF1dG9wbGF5ID0gZmFsc2U7CgoJCXRoaXMuYnVmZmVyID0gbnVsbDsKCQl0aGlzLmxvb3AgPSBmYWxzZTsKCQl0aGlzLnN0YXJ0VGltZSA9IDA7CgkJdGhpcy5vZmZzZXQgPSAwOwoJCXRoaXMucGxheWJhY2tSYXRlID0gMTsKCQl0aGlzLmlzUGxheWluZyA9IGZhbHNlOwoJCXRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTsKCQl0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknOwoKCQl0aGlzLmZpbHRlcnMgPSBbXTsKCgl9CgoJQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IEF1ZGlvLAoKCQlnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLmdhaW47CgoJCX0sCgoJCXNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkgewoKCQkJdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTsKCQkJdGhpcy5zb3VyY2VUeXBlID0gJ2F1ZGlvTm9kZSc7CgkJCXRoaXMuc291cmNlID0gYXVkaW9Ob2RlOwoJCQl0aGlzLmNvbm5lY3QoKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRCdWZmZXI6IGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7CgoJCQl0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyOwoJCQl0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJzsKCgkJCWlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXBsYXk6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7CgkJCQlyZXR1cm47CgoJCQl9CgoJCQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CgkJCQlyZXR1cm47CgoJCQl9CgoJCQl2YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpOwoKCQkJc291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyOwoJCQlzb3VyY2UubG9vcCA9IHRoaXMubG9vcDsKCQkJc291cmNlLm9uZW5kZWQgPSB0aGlzLm9uRW5kZWQuYmluZCggdGhpcyApOwoJCQlzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTsKCQkJdGhpcy5zdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWU7CgkJCXNvdXJjZS5zdGFydCggdGhpcy5zdGFydFRpbWUsIHRoaXMub2Zmc2V0ICk7CgoJCQl0aGlzLmlzUGxheWluZyA9IHRydWU7CgoJCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKCgkJCXJldHVybiB0aGlzLmNvbm5lY3QoKTsKCgkJfSwKCgkJcGF1c2U6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCWlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7CgoJCQkJdGhpcy5zb3VyY2Uuc3RvcCgpOwoJCQkJdGhpcy5vZmZzZXQgKz0gKCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLnN0YXJ0VGltZSApICogdGhpcy5wbGF5YmFja1JhdGU7CgkJCQl0aGlzLmlzUGxheWluZyA9IGZhbHNlOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXN0b3A6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCXRoaXMuc291cmNlLnN0b3AoKTsKCQkJdGhpcy5vZmZzZXQgPSAwOwoJCQl0aGlzLmlzUGxheWluZyA9IGZhbHNlOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvbm5lY3Q6IGZ1bmN0aW9uICgpIHsKCgkJCWlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7CgoJCQkJdGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTsKCgkJCQlmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQkJdGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7CgoJCQkJfQoKCQkJCXRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7CgoJCQl9IGVsc2UgewoKCQkJCXRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlkaXNjb25uZWN0OiBmdW5jdGlvbiAoKSB7CgoJCQlpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkgewoKCQkJCXRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7CgoJCQkJZm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCXRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApOwoKCQkJCX0KCgkJCQl0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApOwoKCQkJfSBlbHNlIHsKCgkJCQl0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZ2V0RmlsdGVyczogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuZmlsdGVyczsKCgkJfSwKCgkJc2V0RmlsdGVyczogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCWlmICggISB2YWx1ZSApIHZhbHVlID0gW107CgoJCQlpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkgewoKCQkJCXRoaXMuZGlzY29ubmVjdCgpOwoJCQkJdGhpcy5maWx0ZXJzID0gdmFsdWU7CgkJCQl0aGlzLmNvbm5lY3QoKTsKCgkJCX0gZWxzZSB7CgoJCQkJdGhpcy5maWx0ZXJzID0gdmFsdWU7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJZ2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbIDAgXTsKCgkJfSwKCgkJc2V0RmlsdGVyOiBmdW5jdGlvbiAoIGZpbHRlciApIHsKCgkJCXJldHVybiB0aGlzLnNldEZpbHRlcnMoIGZpbHRlciA/IFsgZmlsdGVyIF0gOiBbXSApOwoKCQl9LAoKCQlzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CgkJCQlyZXR1cm47CgoJCQl9CgoJCQl0aGlzLnBsYXliYWNrUmF0ZSA9IHZhbHVlOwoKCQkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKCgkJCQl0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTsKCgkJfSwKCgkJb25FbmRlZDogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKCgkJfSwKCgkJZ2V0TG9vcDogZnVuY3Rpb24gKCkgewoKCQkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXMubG9vcDsKCgkJfSwKCgkJc2V0TG9vcDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCXRoaXMubG9vcCA9IHZhbHVlOwoKCQkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKCgkJCQl0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldFZvbHVtZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlOwoKCQl9LAoKCQlzZXRWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IHZhbHVlOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gUG9zaXRpb25hbEF1ZGlvKCBsaXN0ZW5lciApIHsKCgkJQXVkaW8uY2FsbCggdGhpcywgbGlzdGVuZXIgKTsKCgkJdGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7CgkJdGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7CgoJfQoKCVBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLAoKCQlnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLnBhbm5lcjsKCgkJfSwKCgkJZ2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTsKCgkJfSwKCgkJc2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlOwoKCQl9LAoKCQlnZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvcjsKCgkJfSwKCgkJc2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTsKCgkJfSwKCgkJZ2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7CgoJCX0sCgoJCXNldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQl0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7CgoJCX0sCgoJCWdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7CgoJCX0sCgoJCXNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJdGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTsKCgkJfSwKCgkJdXBkYXRlTWF0cml4V29ybGQ6ICggZnVuY3Rpb24gKCkgewoKCQkJdmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKCgkJCXJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7CgoJCQkJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgoJCQkJcG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CgoJCQkJdGhpcy5wYW5uZXIuc2V0UG9zaXRpb24oIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTsKCgkJCX07CgoJCX0gKSgpCgoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBBdWRpb0FuYWx5c2VyKCBhdWRpbywgZmZ0U2l6ZSApIHsKCgkJdGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTsKCQl0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSBmZnRTaXplICE9PSB1bmRlZmluZWQgPyBmZnRTaXplIDogMjA0ODsKCgkJdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTsKCgkJYXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApOwoKCX0KCglPYmplY3QuYXNzaWduKCBBdWRpb0FuYWx5c2VyLnByb3RvdHlwZSwgewoKCQlnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTsKCgkJCXJldHVybiB0aGlzLmRhdGE7CgoJCX0sCgoJCWdldEF2ZXJhZ2VGcmVxdWVuY3k6IGZ1bmN0aW9uICgpIHsKCgkJCXZhciB2YWx1ZSA9IDAsIGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkgewoKCQkJCXZhbHVlICs9IGRhdGFbIGkgXTsKCgkJCX0KCgkJCXJldHVybiB2YWx1ZSAvIGRhdGEubGVuZ3RoOwoKCQl9CgoJfSApOwoKCS8qKgoJICoKCSAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi4KCSAqCgkgKgoJICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KCSAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwoJICogQGF1dGhvciB0c2NodwoJICovCgoJZnVuY3Rpb24gUHJvcGVydHlNaXhlciggYmluZGluZywgdHlwZU5hbWUsIHZhbHVlU2l6ZSApIHsKCgkJdGhpcy5iaW5kaW5nID0gYmluZGluZzsKCQl0aGlzLnZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTsKCgkJdmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksCgkJCW1peEZ1bmN0aW9uOwoKCQlzd2l0Y2ggKCB0eXBlTmFtZSApIHsKCgkJCWNhc2UgJ3F1YXRlcm5pb24nOgoJCQkJbWl4RnVuY3Rpb24gPSB0aGlzLl9zbGVycDsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnc3RyaW5nJzoKCQkJY2FzZSAnYm9vbCc6CgkJCQlidWZmZXJUeXBlID0gQXJyYXk7CgkJCQltaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDsKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCW1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDsKCgkJfQoKCQl0aGlzLmJ1ZmZlciA9IG5ldyBidWZmZXJUeXBlKCB2YWx1ZVNpemUgKiA0ICk7CgkJLy8gbGF5b3V0OiBbIGluY29taW5nIHwgYWNjdTAgfCBhY2N1MSB8IG9yaWcgXQoJCS8vCgkJLy8gaW50ZXJwb2xhdG9ycyBjYW4gdXNlIC5idWZmZXIgYXMgdGhlaXIgLnJlc3VsdAoJCS8vIHRoZSBkYXRhIHRoZW4gZ29lcyB0byAnaW5jb21pbmcnCgkJLy8KCQkvLyAnYWNjdTAnIGFuZCAnYWNjdTEnIGFyZSB1c2VkIGZyYW1lLWludGVybGVhdmVkIGZvcgoJCS8vIHRoZSBjdW11bGF0aXZlIHJlc3VsdCBhbmQgYXJlIGNvbXBhcmVkIHRvIGRldGVjdAoJCS8vIGNoYW5nZXMKCQkvLwoJCS8vICdvcmlnJyBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eQoKCQl0aGlzLl9taXhCdWZmZXJSZWdpb24gPSBtaXhGdW5jdGlvbjsKCgkJdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDsKCgkJdGhpcy51c2VDb3VudCA9IDA7CgkJdGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7CgoJfQoKCU9iamVjdC5hc3NpZ24oIFByb3BlcnR5TWl4ZXIucHJvdG90eXBlLCB7CgoJCS8vIGFjY3VtdWxhdGUgZGF0YSBpbiB0aGUgJ2luY29taW5nJyByZWdpb24gaW50byAnYWNjdTxpPicKCQlhY2N1bXVsYXRlOiBmdW5jdGlvbiAoIGFjY3VJbmRleCwgd2VpZ2h0ICkgewoKCQkJLy8gbm90ZTogaGFwcGlseSBhY2N1bXVsYXRpbmcgbm90aGluZyB3aGVuIHdlaWdodCA9IDAsIHRoZSBjYWxsZXIga25vd3MKCQkJLy8gdGhlIHdlaWdodCBhbmQgc2hvdWxkbid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2UKCgkJCXZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciwKCQkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAoJCQkJb2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLAoKCQkJCWN1cnJlbnRXZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQ7CgoJCQlpZiAoIGN1cnJlbnRXZWlnaHQgPT09IDAgKSB7CgoJCQkJLy8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHQKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHsKCgkJCQkJYnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTsKCgkJCQl9CgoJCQkJY3VycmVudFdlaWdodCA9IHdlaWdodDsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodAoKCQkJCWN1cnJlbnRXZWlnaHQgKz0gd2VpZ2h0OwoJCQkJdmFyIG1peCA9IHdlaWdodCAvIGN1cnJlbnRXZWlnaHQ7CgkJCQl0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSApOwoKCQkJfQoKCQkJdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gY3VycmVudFdlaWdodDsKCgkJfSwKCgkJLy8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlcgoJCWFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHsKCgkJCXZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKCQkJCWJ1ZmZlciA9IHRoaXMuYnVmZmVyLAoJCQkJb2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLAoKCQkJCXdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodCwKCgkJCQliaW5kaW5nID0gdGhpcy5iaW5kaW5nOwoKCQkJdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDsKCgkJCWlmICggd2VpZ2h0IDwgMSApIHsKCgkJCQkvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApCgoJCQkJdmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzOwoKCQkJCXRoaXMuX21peEJ1ZmZlclJlZ2lvbigKCQkJCQlidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7CgoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHsKCgkJCQlpZiAoIGJ1ZmZlclsgaSBdICE9PSBidWZmZXJbIGkgKyBzdHJpZGUgXSApIHsKCgkJCQkJLy8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoCgoJCQkJCWJpbmRpbmcuc2V0VmFsdWUoIGJ1ZmZlciwgb2Zmc2V0ICk7CgkJCQkJYnJlYWs7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQkvLyByZW1lbWJlciB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHByb3BlcnR5IGFuZCBjb3B5IGl0IHRvIGJvdGggYWNjdXMKCQlzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7CgoJCQl2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCgkJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKCgkJCQlvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMzsKCgkJCWJpbmRpbmcuZ2V0VmFsdWUoIGJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApOwoKCQkJLy8gYWNjdVswLi4xXSA6PSBvcmlnIC0tIGluaXRpYWxseSBkZXRlY3QgY2hhbmdlcyBhZ2FpbnN0IHRoZSBvcmlnaW5hbAoJCQlmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7CgoJCQkJYnVmZmVyWyBpIF0gPSBidWZmZXJbIG9yaWdpbmFsVmFsdWVPZmZzZXQgKyAoIGkgJSBzdHJpZGUgKSBdOwoKCQkJfQoKCQkJdGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDsKCgkJfSwKCgkJLy8gYXBwbHkgdGhlIHN0YXRlIHByZXZpb3VzbHkgdGFrZW4gdmlhICdzYXZlT3JpZ2luYWxTdGF0ZScgdG8gdGhlIGJpbmRpbmcKCQlyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7CgkJCXRoaXMuYmluZGluZy5zZXRWYWx1ZSggdGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTsKCgkJfSwKCgoJCS8vIG1peCBmdW5jdGlvbnMKCgkJX3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7CgoJCQlpZiAoIHQgPj0gMC41ICkgewoKCQkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgewoKCQkJCQlidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdOwoKCQkJCX0KCgkJCX0KCgkJfSwKCgkJX3NsZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQgKSB7CgoJCQlRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCwgdCApOwoKCQl9LAoKCQlfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7CgoJCQl2YXIgcyA9IDEgLSB0OwoKCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CgoJCQkJdmFyIGogPSBkc3RPZmZzZXQgKyBpOwoKCQkJCWJ1ZmZlclsgaiBdID0gYnVmZmVyWyBqIF0gKiBzICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0OwoKCQkJfQoKCQl9CgoJfSApOwoKCS8qKgoJICoKCSAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguCgkgKgoJICoKCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCgkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KCSAqIEBhdXRob3IgdHNjaHcKCSAqLwoKCWZ1bmN0aW9uIENvbXBvc2l0ZSggdGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCApIHsKCgkJdmFyIHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7CgoJCXRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7CgkJdGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7CgoJfQoKCU9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHsKCgkJZ2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCgkJCXRoaXMuYmluZCgpOyAvLyBiaW5kIGFsbCBiaW5kaW5nCgoJCQl2YXIgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLAoJCQkJYmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTsKCgkJCS8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdAoJCQlpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIGJpbmRpbmcuZ2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTsKCgkJfSwKCgkJc2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCgkJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwoKCQkJZm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCgkJCQkJICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCWJpbmRpbmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTsKCgkJCX0KCgkJfSwKCgkJYmluZDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CgoJCQlmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywKCQkJCQkgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJYmluZGluZ3NbIGkgXS5iaW5kKCk7CgoJCQl9CgoJCX0sCgoJCXVuYmluZDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CgoJCQlmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywKCQkJCQkgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJYmluZGluZ3NbIGkgXS51bmJpbmQoKTsKCgkJCX0KCgkJfQoKCX0gKTsKCgoJZnVuY3Rpb24gUHJvcGVydHlCaW5kaW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHsKCgkJdGhpcy5wYXRoID0gcGF0aDsKCQl0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApOwoKCQl0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290Tm9kZTsKCgkJdGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlOwoKCX0KCglPYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHsKCgkJQ29tcG9zaXRlOiBDb21wb3NpdGUsCgoJCWNyZWF0ZTogZnVuY3Rpb24gKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICkgewoKCQkJaWYgKCAhICggcm9vdCAmJiByb290LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXAgKSApIHsKCgkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApOwoKCQkJfSBlbHNlIHsKCgkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTsKCgkJCX0KCgkJfSwKCgkJLyoqCgkJICogUmVwbGFjZXMgc3BhY2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBmcm9tCgkJICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNrTmFtZSgpLgoJCSAqCgkJICogQHBhcmFtICB7c3RyaW5nfSBuYW1lIE5vZGUgbmFtZSB0byBiZSBzYW5pdGl6ZWQuCgkJICogQHJldHVybiB7c3RyaW5nfQoJCSAqLwoJCXNhbml0aXplTm9kZU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHsKCgkJCXJldHVybiBuYW1lLnJlcGxhY2UoIC9ccy9nLCAnXycgKS5yZXBsYWNlKCAvW15cdy1dL2csICcnICk7CgoJCX0sCgoJCXBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7CgoJCQkvLyBQYXJlbnQgZGlyZWN0b3JpZXMsIGRlbGltaXRlZCBieSAnLycgb3IgJzonLiBDdXJyZW50bHkgdW51c2VkLCBidXQgbXVzdAoJCQkvLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLgoJCQl2YXIgZGlyZWN0b3J5UmUgPSAvKCg/Oltcdy1dK1tcLzpdKSopLzsKCgkJCS8vIFRhcmdldCBub2RlLiBNYXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLgoJCQl2YXIgbm9kZVJlID0gLyhbXHctXC5dKyk/LzsKCgkJCS8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBOYW1lIG1heSBjb250YWluIG9ubHkgd29yZAoJCQkvLyBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBjbG9zaW5nIGJyYWNrZXQuCgkJCXZhciBvYmplY3RSZSA9IC8oPzpcLihbXHctXSspKD86XFsoLispXF0pPyk/LzsKCgkJCS8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IGNvbnRhaW4gb25seSB3b3JkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heQoJCQkvLyBjb250YWluIGFueSBub24tYnJhY2tldCBjaGFyYWN0ZXJzLgoJCQl2YXIgcHJvcGVydHlSZSA9IC9cLihbXHctXSspKD86XFsoLispXF0pPy87CgoJCQl2YXIgdHJhY2tSZSA9IG5ldyBSZWdFeHAoICcnCgkJCQkrICdeJwoJCQkJKyBkaXJlY3RvcnlSZS5zb3VyY2UKCQkJCSsgbm9kZVJlLnNvdXJjZQoJCQkJKyBvYmplY3RSZS5zb3VyY2UKCQkJCSsgcHJvcGVydHlSZS5zb3VyY2UKCQkJCSsgJyQnCgkJCSk7CgoJCQl2YXIgc3VwcG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnIF07CgoJCQlyZXR1cm4gZnVuY3Rpb24gKCB0cmFja05hbWUgKSB7CgoJCQkJdmFyIG1hdGNoZXMgPSB0cmFja1JlLmV4ZWMoIHRyYWNrTmFtZSApOwoKCQkJCWlmICggISBtYXRjaGVzICkgewoKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTsKCgkJCQl9CgoJCQkJdmFyIHJlc3VsdHMgPSB7CgkJCQkJLy8gZGlyZWN0b3J5TmFtZTogbWF0Y2hlc1sgMSBdLCAvLyAodHNjaHcpIGN1cnJlbnRseSB1bnVzZWQKCQkJCQlub2RlTmFtZTogbWF0Y2hlc1sgMiBdLAoJCQkJCW9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSwKCQkJCQlvYmplY3RJbmRleDogbWF0Y2hlc1sgNCBdLAoJCQkJCXByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZAoJCQkJCXByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXQoJCQkJfTsKCgkJCQl2YXIgbGFzdERvdCA9IHJlc3VsdHMubm9kZU5hbWUgJiYgcmVzdWx0cy5ub2RlTmFtZS5sYXN0SW5kZXhPZiggJy4nICk7CgoJCQkJaWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLSAxICkgewoKCQkJCQl2YXIgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApOwoKCQkJCQkvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYSB3aGl0ZWxpc3QuIE90aGVyd2lzZSwgdGhlcmUKCQkJCQkvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXQKCQkJCQkvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW4KCQkJCQkvLyBpbmNsdWRlICcuJyBjaGFyYWN0ZXJzKS4KCQkJCQlpZiAoIHN1cHBvcnRlZE9iamVjdE5hbWVzLmluZGV4T2YoIG9iamVjdE5hbWUgKSAhPT0gLSAxICkgewoKCQkJCQkJcmVzdWx0cy5ub2RlTmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCAwLCBsYXN0RG90ICk7CgkJCQkJCXJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CgoJCQkJCX0KCgkJCQl9CgoJCQkJaWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7CgoJCQkJCXRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTsKCgkJCQl9CgoJCQkJcmV0dXJuIHJlc3VsdHM7CgoJCQl9OwoKCQl9KCksCgoJCWZpbmROb2RlOiBmdW5jdGlvbiAoIHJvb3QsIG5vZGVOYW1lICkgewoKCQkJaWYgKCAhIG5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSAiIiB8fCBub2RlTmFtZSA9PT0gInJvb3QiIHx8IG5vZGVOYW1lID09PSAiLiIgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7CgoJCQkJcmV0dXJuIHJvb3Q7CgoJCQl9CgoJCQkvLyBzZWFyY2ggaW50byBza2VsZXRvbiBib25lcy4KCQkJaWYgKCByb290LnNrZWxldG9uICkgewoKCQkJCXZhciBzZWFyY2hTa2VsZXRvbiA9IGZ1bmN0aW9uICggc2tlbGV0b24gKSB7CgoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHNrZWxldG9uLmJvbmVzLmxlbmd0aDsgaSArKyApIHsKCgkJCQkJCXZhciBib25lID0gc2tlbGV0b24uYm9uZXNbIGkgXTsKCgkJCQkJCWlmICggYm9uZS5uYW1lID09PSBub2RlTmFtZSApIHsKCgkJCQkJCQlyZXR1cm4gYm9uZTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQlyZXR1cm4gbnVsbDsKCgkJCQl9OwoKCQkJCXZhciBib25lID0gc2VhcmNoU2tlbGV0b24oIHJvb3Quc2tlbGV0b24gKTsKCgkJCQlpZiAoIGJvbmUgKSB7CgoJCQkJCXJldHVybiBib25lOwoKCQkJCX0KCgkJCX0KCgkJCS8vIHNlYXJjaCBpbnRvIG5vZGUgc3VidHJlZS4KCQkJaWYgKCByb290LmNoaWxkcmVuICkgewoKCQkJCXZhciBzZWFyY2hOb2RlU3VidHJlZSA9IGZ1bmN0aW9uICggY2hpbGRyZW4gKSB7CgoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHsKCgkJCQkJCXZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdOwoKCQkJCQkJaWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkgewoKCQkJCQkJCXJldHVybiBjaGlsZE5vZGU7CgoJCQkJCQl9CgoJCQkJCQl2YXIgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUoIGNoaWxkTm9kZS5jaGlsZHJlbiApOwoKCQkJCQkJaWYgKCByZXN1bHQgKSByZXR1cm4gcmVzdWx0OwoKCQkJCQl9CgoJCQkJCXJldHVybiBudWxsOwoKCQkJCX07CgoJCQkJdmFyIHN1YlRyZWVOb2RlID0gc2VhcmNoTm9kZVN1YnRyZWUoIHJvb3QuY2hpbGRyZW4gKTsKCgkJCQlpZiAoIHN1YlRyZWVOb2RlICkgewoKCQkJCQlyZXR1cm4gc3ViVHJlZU5vZGU7CgoJCQkJfQoKCQkJfQoKCQkJcmV0dXJuIG51bGw7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZAoKCQkvLyB0aGVzZSBhcmUgdXNlZCB0byAiYmluZCIgYSBub25leGlzdGVudCBwcm9wZXJ0eQoJCV9nZXRWYWx1ZV91bmF2YWlsYWJsZTogZnVuY3Rpb24gKCkge30sCgkJX3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSwKCgkJQmluZGluZ1R5cGU6IHsKCQkJRGlyZWN0OiAwLAoJCQlFbnRpcmVBcnJheTogMSwKCQkJQXJyYXlFbGVtZW50OiAyLAoJCQlIYXNGcm9tVG9BcnJheTogMwoJCX0sCgoJCVZlcnNpb25pbmc6IHsKCQkJTm9uZTogMCwKCQkJTmVlZHNVcGRhdGU6IDEsCgkJCU1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDIKCQl9LAoKCQlHZXR0ZXJCeUJpbmRpbmdUeXBlOiBbCgoJCQlmdW5jdGlvbiBnZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCWJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF07CgoJCQl9LAoKCQkJZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCXZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCQkJYnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdOwoKCQkJCX0KCgkJCX0sCgoJCQlmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCWJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdOwoKCQkJfSwKCgkJCWZ1bmN0aW9uIGdldFZhbHVlX3RvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApOwoKCQkJfQoKCQldLAoKCQlTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzogWwoKCQkJWwoJCQkJLy8gRGlyZWN0CgoJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHsKCgkJCQkJdGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdOwoKCQkJCX0sCgoJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKCgkJCQkJdGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdOwoJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9LAoKCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKCgkJCQkJdGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdOwoJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJCX0KCgkJCV0sIFsKCgkJCQkvLyBFbnRpcmVBcnJheQoKCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHsKCgkJCQkJdmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CgoJCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCQkJZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTsKCgkJCQkJfQoKCQkJCX0sCgoJCQkJZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCQl2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJCQlkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdOwoKCQkJCQl9CgoJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9LAoKCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCQl2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKCgkJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJCQlkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdOwoKCQkJCQl9CgoJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJCX0KCgkJCV0sIFsKCgkJCQkvLyBBcnJheUVsZW1lbnQKCgkJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTsKCgkJCQl9LAoKCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CgoJCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdOwoJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKCgkJCQl9LAoKCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKCgkJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07CgkJCQkJdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQkJfQoKCQkJXSwgWwoKCQkJCS8vIEhhc1RvRnJvbUFycmF5CgoJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHsKCgkJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTsKCgkJCQl9LAoKCQkJCWZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CgoJCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7CgkJCQkJdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJCX0sCgoJCQkJZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKCQkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApOwoJCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJCX0KCgkJCV0KCgkJXSwKCgkJZ2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7CgoJCQl0aGlzLmJpbmQoKTsKCQkJdGhpcy5nZXRWYWx1ZSggdGFyZ2V0QXJyYXksIG9mZnNldCApOwoKCQkJLy8gTm90ZTogVGhpcyBjbGFzcyB1c2VzIGEgU3RhdGUgcGF0dGVybiBvbiBhIHBlci1tZXRob2QgYmFzaXM6CgkJCS8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlCgkJCS8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzCgkJCS8vIHRoZSBib3VuZCBzdGF0ZS4gV2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLCB0aGUgbWV0aG9kcwoJCQkvLyBiZWNvbWUgbm8tb3BzLgoKCQl9LAoKCQlzZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggc291cmNlQXJyYXksIG9mZnNldCApIHsKCgkJCXRoaXMuYmluZCgpOwoJCQl0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7CgoJCX0sCgoJCS8vIGNyZWF0ZSBnZXR0ZXIgLyBzZXR0ZXIgcGFpciBmb3IgYSBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGgKCQliaW5kOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLAoJCQkJcGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCwKCgkJCQlvYmplY3ROYW1lID0gcGFyc2VkUGF0aC5vYmplY3ROYW1lLAoJCQkJcHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWUsCgkJCQlwcm9wZXJ0eUluZGV4ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4OwoKCQkJaWYgKCAhIHRhcmdldE9iamVjdCApIHsKCgkJCQl0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCB0aGlzLnJvb3ROb2RlOwoKCQkJCXRoaXMubm9kZSA9IHRhcmdldE9iamVjdDsKCgkJCX0KCgkJCS8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yCgkJCXRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKCQkJdGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlOwoKCQkJLy8gZW5zdXJlIHRoZXJlIGlzIGEgdmFsdWUgbm9kZQoJCQlpZiAoICEgdGFyZ2V0T2JqZWN0ICkgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICcgKyB0aGlzLnBhdGggKyAnIGJ1dCBpdCB3YXNuXCd0IGZvdW5kLicgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCWlmICggb2JqZWN0TmFtZSApIHsKCgkJCQl2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4OwoKCQkJCS8vIHNwZWNpYWwgY2FzZXMgd2VyZSB3ZSBuZWVkIHRvIHJlYWNoIGRlZXBlciBpbnRvIHRoZSBoaWVyYXJjaHkgdG8gZ2V0IHRoZSBmYWNlIG1hdGVyaWFscy4uLi4KCQkJCXN3aXRjaCAoIG9iamVjdE5hbWUgKSB7CgoJCQkJCWNhc2UgJ21hdGVyaWFscyc6CgoJCQkJCQlpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkgewoKCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4nLCB0aGlzICk7CgkJCQkJCQlyZXR1cm47CgoJCQkJCQl9CgoJCQkJCQlpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscyApIHsKCgkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4nLCB0aGlzICk7CgkJCQkJCQlyZXR1cm47CgoJCQkJCQl9CgoJCQkJCQl0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzOwoKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJ2JvbmVzJzoKCgkJCQkJCWlmICggISB0YXJnZXRPYmplY3Quc2tlbGV0b24gKSB7CgoJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLicsIHRoaXMgKTsKCQkJCQkJCXJldHVybjsKCgkJCQkJCX0KCgkJCQkJCS8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIKCQkJCQkJLy8gYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLgoKCQkJCQkJdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0LnNrZWxldG9uLmJvbmVzOwoKCQkJCQkJLy8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLgoJCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkgewoKCQkJCQkJCWlmICggdGFyZ2V0T2JqZWN0WyBpIF0ubmFtZSA9PT0gb2JqZWN0SW5kZXggKSB7CgoJCQkJCQkJCW9iamVjdEluZGV4ID0gaTsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCWlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4nLCB0aGlzICk7CgkJCQkJCQlyZXR1cm47CgoJCQkJCQl9CgoJCQkJCQl0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTsKCgkJCQl9CgoKCQkJCWlmICggb2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJaWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuJywgdGhpcywgdGFyZ2V0T2JqZWN0ICk7CgkJCQkJCXJldHVybjsKCgkJCQkJfQoKCQkJCQl0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF07CgoJCQkJfQoKCQkJfQoKCQkJLy8gcmVzb2x2ZSBwcm9wZXJ0eQoJCQl2YXIgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0WyBwcm9wZXJ0eU5hbWUgXTsKCgkJCWlmICggbm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQgKSB7CgoJCQkJdmFyIG5vZGVOYW1lID0gcGFyc2VkUGF0aC5ub2RlTmFtZTsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICsKCQkJCQknLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBpdCB3YXNuXCd0IGZvdW5kLicsIHRhcmdldE9iamVjdCApOwoJCQkJcmV0dXJuOwoKCQkJfQoKCQkJLy8gZGV0ZXJtaW5lIHZlcnNpb25pbmcgc2NoZW1lCgkJCXZhciB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7CgoJCQlpZiAoIHRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbAoKCQkJCXZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7CgkJCQl0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDsKCgkJCX0gZWxzZSBpZiAoIHRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG5vZGUgdHJhbnNmb3JtCgoJCQkJdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlOwoJCQkJdGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7CgoJCQl9CgoJCQkvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kCgkJCXZhciBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRGlyZWN0OwoKCQkJaWYgKCBwcm9wZXJ0eUluZGV4ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpCgoJCQkJaWYgKCBwcm9wZXJ0eU5hbWUgPT09ICJtb3JwaFRhcmdldEluZmx1ZW5jZXMiICkgewoKCQkJCQkvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci4KCgkJCQkJLy8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLgoJCQkJCWlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7CgoJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApOwoJCQkJCQlyZXR1cm47CgoJCQkJCX0KCgkJCQkJaWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJCWlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkgewoKCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApOwoJCQkJCQkJcmV0dXJuOwoKCQkJCQkJfQoKCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCQkJaWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHsKCgkJCQkJCQkJcHJvcGVydHlJbmRleCA9IGk7CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJfQoKCQkJCQkJfQoKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkgewoKCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuJywgdGhpcyApOwoJCQkJCQkJcmV0dXJuOwoKCQkJCQkJfQoKCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7CgoJCQkJCQkJaWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9PT0gcHJvcGVydHlJbmRleCApIHsKCgkJCQkJCQkJcHJvcGVydHlJbmRleCA9IGk7CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJfQoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfQoKCQkJCWJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7CgoJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5OwoJCQkJdGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDsKCgkJCX0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCS8vIG11c3QgdXNlIGNvcHkgZm9yIE9iamVjdDNELkV1bGVyL1F1YXRlcm5pb24KCgkJCQliaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7CgoJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5OwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7CgoJCQkJYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5OwoKCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTsKCgkJCX0gZWxzZSB7CgoJCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CgoJCQl9CgoJCQkvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyCgkJCXRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07CgkJCXRoaXMuc2V0VmFsdWUgPSB0aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nWyBiaW5kaW5nVHlwZSBdWyB2ZXJzaW9uaW5nIF07CgoJCX0sCgoJCXVuYmluZDogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5ub2RlID0gbnVsbDsKCgkJCS8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWUKCQkJLy8gbm90ZTogYXZvaWRpbmcgdG8gbXV0YXRlIHRoZSBzaGFwZSBvZiAndGhpcycgdmlhICdkZWxldGUnCgkJCXRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kOwoJCQl0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDsKCgkJfQoKCX0gKTsKCgkvLyFcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhCglPYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7CgoJCS8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0aG9kcyB0aGF0IGNhbGxzICdiaW5kJwoJCV9nZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLmdldFZhbHVlLAoJCV9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLAoKCX0gKTsKCgkvKioKCSAqCgkgKiBBIGdyb3VwIG9mIG9iamVjdHMgdGhhdCByZWNlaXZlcyBhIHNoYXJlZCBhbmltYXRpb24gc3RhdGUuCgkgKgoJICogVXNhZ2U6CgkgKgoJICogCS0JQWRkIG9iamVjdHMgeW91IHdvdWxkIG90aGVyd2lzZSBwYXNzIGFzICdyb290JyB0byB0aGUKCSAqIAkJY29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci4KCSAqCgkgKiAJLQlJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLgoJICoKCSAqIAktCVlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyCgkgKiAJCWlzIHJ1bm5pbmcuCgkgKgoJICogTm90ZToKCSAqCgkgKiAgCU9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcHBlYXIgYXMgb25lIG9iamVjdCB0byB0aGUgbWl4ZXIsCgkgKiAgCXNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmUKCSAqICAJb24gdGhlIGdyb3VwLgoJICoKCSAqIExpbWl0YXRpb246CgkgKgoJICogCS0gCVRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGUKCSAqIAkJYWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLgoJICoKCSAqICAtCUEgc2luZ2xlIHByb3BlcnR5IGNhbiBlaXRoZXIgYmUgY29udHJvbGxlZCB0aHJvdWdoIGEKCSAqICAJdGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguCgkgKgoJICogQGF1dGhvciB0c2NodwoJICovCgoJZnVuY3Rpb24gQW5pbWF0aW9uT2JqZWN0R3JvdXAoKSB7CgoJCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKCQkvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXMKCQl0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApOwoKCQl0aGlzLm5DYWNoZWRPYmplY3RzXyA9IDA7CQkJLy8gdGhyZXNob2xkCgkJLy8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlCgoJCXZhciBpbmRpY2VzID0ge307CgkJdGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7CQkvLyBmb3IgYm9va2tlZXBpbmcKCgkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCWluZGljZXNbIGFyZ3VtZW50c1sgaSBdLnV1aWQgXSA9IGk7CgoJCX0KCgkJdGhpcy5fcGF0aHMgPSBbXTsJCQkJCS8vIGluc2lkZTogc3RyaW5nCgkJdGhpcy5fcGFyc2VkUGF0aHMgPSBbXTsJCQkJLy8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfQoJCXRoaXMuX2JpbmRpbmdzID0gW107IAkJCQkvLyBpbnNpZGU6IEFycmF5PCBQcm9wZXJ0eUJpbmRpbmcgPgoJCXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyAJLy8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5cwoKCQl2YXIgc2NvcGUgPSB0aGlzOwoKCQl0aGlzLnN0YXRzID0gewoKCQkJb2JqZWN0czogewoJCQkJZ2V0IHRvdGFsKCkgewoKCQkJCQlyZXR1cm4gc2NvcGUuX29iamVjdHMubGVuZ3RoOwoKCQkJCX0sCgkJCQlnZXQgaW5Vc2UoKSB7CgoJCQkJCXJldHVybiB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfOwoKCQkJCX0KCQkJfSwKCQkJZ2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkgewoKCQkJCXJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoOwoKCQkJfQoKCQl9OwoKCX0KCglPYmplY3QuYXNzaWduKCBBbmltYXRpb25PYmplY3RHcm91cC5wcm90b3R5cGUsIHsKCgkJaXNBbmltYXRpb25PYmplY3RHcm91cDogdHJ1ZSwKCgkJYWRkOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsCgkJCQluT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLAoJCQkJbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywKCQkJCWluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELAoJCQkJcGF0aHMgPSB0aGlzLl9wYXRocywKCQkJCXBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsCgkJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAoJCQkJbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOwoKCQkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCQl2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sCgkJCQkJdXVpZCA9IG9iamVjdC51dWlkLAoJCQkJCWluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdLAoJCQkJCWtub3duT2JqZWN0ID0gdW5kZWZpbmVkOwoKCQkJCWlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJLy8gdW5rbm93biBvYmplY3QgLT4gYWRkIGl0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uCgoJCQkJCWluZGV4ID0gbk9iamVjdHMgKys7CgkJCQkJaW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gaW5kZXg7CgkJCQkJb2JqZWN0cy5wdXNoKCBvYmplY3QgKTsKCgkJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncwoKCQkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CgoJCQkJCQliaW5kaW5nc1sgaiBdLnB1c2goIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApICk7CgoJCQkJCX0KCgkJCQl9IGVsc2UgaWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkgewoKCQkJCQlrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07CgoJCQkJCS8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uCgoJCQkJCXZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsCgkJCQkJCWxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07CgoJCQkJCWluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7CgkJCQkJb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7CgoJCQkJCWluZGljZXNCeVVVSURbIHV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7CgkJCQkJb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0OwoKCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCgoJCQkJCWZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHsKCgkJCQkJCXZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAoJCQkJCQkJbGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLAoJCQkJCQkJYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTsKCgkJCQkJCWJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7CgoJCQkJCQlpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQkvLyBzaW5jZSB3ZSBkbyBub3QgYm90aGVyIHRvIGNyZWF0ZSBuZXcgYmluZGluZ3MKCQkJCQkJCS8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCwgdGhlIGJpbmRpbmcgbWF5CgkJCQkJCQkvLyBvciBtYXkgbm90IGV4aXN0CgoJCQkJCQkJYmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApOwoKCQkJCQkJfQoKCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nOwoKCQkJCQl9CgoJCQkJfSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7CgoJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEICcgKwoJCQkJCQkJJ2RldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLicgKTsKCgkJCQl9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmUKCgkJCX0gLy8gZm9yIGFyZ3VtZW50cwoKCQkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKCgkJfSwKCgkJcmVtb3ZlOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsCgkJCQluQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLAoJCQkJaW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsCgkJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAoJCQkJbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOwoKCQkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCgkJCQl2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sCgkJCQkJdXVpZCA9IG9iamVjdC51dWlkLAoJCQkJCWluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdOwoKCQkJCWlmICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cyApIHsKCgkJCQkJLy8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvbgoKCQkJCQl2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssCgkJCQkJCWZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07CgoJCQkJCWluZGljZXNCeVVVSURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4OwoJCQkJCW9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDsKCgkJCQkJaW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gbGFzdENhY2hlZEluZGV4OwoJCQkJCW9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0OwoKCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCgoJCQkJCWZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHsKCgkJCQkJCXZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAoJCQkJCQkJZmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLAoJCQkJCQkJYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTsKCgkJCQkJCWJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlOwoJCQkJCQliaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdID0gYmluZGluZzsKCgkJCQkJfQoKCQkJCX0KCgkJCX0gLy8gZm9yIGFyZ3VtZW50cwoKCQkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKCgkJfSwKCgkJLy8gcmVtb3ZlICYgZm9yZ2V0CgkJdW5jYWNoZTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLAoJCQkJbk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCwKCQkJCW5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sCgkJCQlpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwKCQkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCgkJCQluQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCXZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSwKCQkJCQl1dWlkID0gb2JqZWN0LnV1aWQsCgkJCQkJaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07CgoJCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQlkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdOwoKCQkJCQlpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7CgoJCQkJCQkvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb24KCgkJCQkJCXZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsCgkJCQkJCQlsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLAoJCQkJCQkJbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsCgkJCQkJCQlsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07CgoJCQkJCQkvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZQoJCQkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4OwoJCQkJCQlvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDsKCgkJCQkJCS8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3AKCQkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4OwoJCQkJCQlvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0OwoJCQkJCQlvYmplY3RzLnBvcCgpOwoKCQkJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncwoKCQkJCQkJZm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkgewoKCQkJCQkJCXZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAoJCQkJCQkJCWxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSwKCQkJCQkJCQlsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTsKCgkJCQkJCQliaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkOwoJCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0OwoJCQkJCQkJYmluZGluZ3NGb3JQYXRoLnBvcCgpOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcAoKCQkJCQkJdmFyIGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLAoJCQkJCQkJbGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdOwoKCQkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBpbmRleDsKCQkJCQkJb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7CgkJCQkJCW9iamVjdHMucG9wKCk7CgoJCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCgoJCQkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CgoJCQkJCQkJdmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07CgoJCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTsKCQkJCQkJCWJpbmRpbmdzRm9yUGF0aC5wb3AoKTsKCgkJCQkJCX0KCgkJCQkJfSAvLyBjYWNoZWQgb3IgYWN0aXZlCgoJCQkJfSAvLyBpZiBvYmplY3QgaXMga25vd24KCgkJCX0gLy8gZm9yIGFyZ3VtZW50cwoKCQkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKCgkJfSwKCgkJLy8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOgoKCQlzdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7CgoJCQkvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWQKCQkJLy8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXAKCgkJCXZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLAoJCQkJaW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sCgkJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwoKCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdOwoKCQkJdmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsCgkJCQlwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLAoJCQkJb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsCgkJCQluT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLAoJCQkJbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywKCQkJCWJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTsKCgkJCWluZGV4ID0gYmluZGluZ3MubGVuZ3RoOwoKCQkJaW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7CgoJCQlwYXRocy5wdXNoKCBwYXRoICk7CgkJCXBhcnNlZFBhdGhzLnB1c2goIHBhcnNlZFBhdGggKTsKCQkJYmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRoICk7CgoJCQlmb3IgKCB2YXIgaSA9IG5DYWNoZWRPYmplY3RzLCBuID0gb2JqZWN0cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJdmFyIG9iamVjdCA9IG9iamVjdHNbIGkgXTsKCQkJCWJpbmRpbmdzRm9yUGF0aFsgaSBdID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoLCBwYXJzZWRQYXRoICk7CgoJCQl9CgoJCQlyZXR1cm4gYmluZGluZ3NGb3JQYXRoOwoKCQl9LAoKCQl1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHsKCgkJCS8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXIKCQkJLy8gdXBkYXRlIHRoZSBhcnJheSBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGggJ3N1YnNjcmliZV8nCgoJCQl2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCwKCQkJCWluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdOwoKCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXZhciBwYXRocyA9IHRoaXMuX3BhdGhzLAoJCQkJCXBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsCgkJCQkJYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncywKCQkJCQlsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsCgkJCQkJbGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0sCgkJCQkJbGFzdEJpbmRpbmdzUGF0aCA9IHBhdGhbIGxhc3RCaW5kaW5nc0luZGV4IF07CgoJCQkJaW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7CgoJCQkJYmluZGluZ3NbIGluZGV4IF0gPSBsYXN0QmluZGluZ3M7CgkJCQliaW5kaW5ncy5wb3AoKTsKCgkJCQlwYXJzZWRQYXRoc1sgaW5kZXggXSA9IHBhcnNlZFBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdOwoJCQkJcGFyc2VkUGF0aHMucG9wKCk7CgoJCQkJcGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTsKCQkJCXBhdGhzLnBvcCgpOwoKCQkJfQoKCQl9CgoJfSApOwoKCS8qKgoJICoKCSAqIEFjdGlvbiBwcm92aWRlZCBieSBBbmltYXRpb25NaXhlciBmb3Igc2NoZWR1bGluZyBjbGlwIHBsYXliYWNrIG9uIHNwZWNpZmljCgkgKiBvYmplY3RzLgoJICoKCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCgkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KCSAqIEBhdXRob3IgdHNjaHcKCSAqCgkgKi8KCglmdW5jdGlvbiBBbmltYXRpb25BY3Rpb24oIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgKSB7CgoJCXRoaXMuX21peGVyID0gbWl4ZXI7CgkJdGhpcy5fY2xpcCA9IGNsaXA7CgkJdGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7CgoJCXZhciB0cmFja3MgPSBjbGlwLnRyYWNrcywKCQkJblRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsCgkJCWludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApOwoKCQl2YXIgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHsKCQkJZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsCgkJCWVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZwoJCX07CgoJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHsKCgkJCXZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7CgkJCWludGVycG9sYW50c1sgaSBdID0gaW50ZXJwb2xhbnQ7CgkJCWludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKCgkJfQoKCQl0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKCgkJdGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOwkvLyBib3VuZCBieSB0aGUgbWl4ZXIKCgkJLy8gaW5zaWRlOiBQcm9wZXJ0eU1peGVyIChtYW5hZ2VkIGJ5IHRoZSBtaXhlcikKCQl0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7CgoJCXRoaXMuX2NhY2hlSW5kZXggPSBudWxsOwkJCS8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXIKCQl0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsJCS8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXIKCgkJdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsOwoJCXRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDsKCgkJdGhpcy5sb29wID0gTG9vcFJlcGVhdDsKCQl0aGlzLl9sb29wQ291bnQgPSAtIDE7CgoJCS8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkCgkJLy8gaXQncyBzZXQgYmFjayB0byAnbnVsbCcgdXBvbiBzdGFydCBvZiB0aGUgYWN0aW9uCgkJdGhpcy5fc3RhcnRUaW1lID0gbnVsbDsKCgkJLy8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvbgoJCS8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3AKCQl0aGlzLnRpbWUgPSAwOwoKCQl0aGlzLnRpbWVTY2FsZSA9IDE7CgkJdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTsKCgkJdGhpcy53ZWlnaHQgPSAxOwoJCXRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7CgoJCXRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgCQkvLyBuby4gb2YgcmVwZXRpdGlvbnMgd2hlbiBsb29waW5nCgoJCXRoaXMucGF1c2VkID0gZmFsc2U7CQkJCS8vIHRydWUgLT4gemVybyBlZmZlY3RpdmUgdGltZSBzY2FsZQoJCXRoaXMuZW5hYmxlZCA9IHRydWU7CQkJCS8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodAoKCQl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkIAk9IGZhbHNlOwkvLyBrZWVwIGZlZWRpbmcgdGhlIGxhc3QgZnJhbWU/CgoJCXRoaXMuemVyb1Nsb3BlQXRTdGFydCAJPSB0cnVlOwkJLy8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZQoJCXRoaXMuemVyb1Nsb3BlQXRFbmQJCT0gdHJ1ZTsJCS8vIGNsaXBzIGZvciBzdGFydCwgbG9vcCBhbmQgZW5kCgoJfQoKCU9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkFjdGlvbi5wcm90b3R5cGUsIHsKCgkJLy8gU3RhdGUgJiBTY2hlZHVsaW5nCgoJCXBsYXk6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbiggdGhpcyApOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXN0b3A6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7CgoJCQlyZXR1cm4gdGhpcy5yZXNldCgpOwoKCQl9LAoKCQlyZXNldDogZnVuY3Rpb24gKCkgewoKCQkJdGhpcy5wYXVzZWQgPSBmYWxzZTsKCQkJdGhpcy5lbmFibGVkID0gdHJ1ZTsKCgkJCXRoaXMudGltZSA9IDA7CQkJLy8gcmVzdGFydCBjbGlwCgkJCXRoaXMuX2xvb3BDb3VudCA9IC0gMTsJLy8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzCgkJCXRoaXMuX3N0YXJ0VGltZSA9IG51bGw7CS8vIGZvcmdldCBzY2hlZHVsaW5nCgoJCQlyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTsKCgkJfSwKCgkJaXNSdW5uaW5nOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5lbmFibGVkICYmICEgdGhpcy5wYXVzZWQgJiYgdGhpcy50aW1lU2NhbGUgIT09IDAgJiYKCQkJCQl0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7CgoJCX0sCgoJCS8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWQKCQlpc1NjaGVkdWxlZDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApOwoKCQl9LAoKCQlzdGFydEF0OiBmdW5jdGlvbiAoIHRpbWUgKSB7CgoJCQl0aGlzLl9zdGFydFRpbWUgPSB0aW1lOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7CgoJCQl0aGlzLmxvb3AgPSBtb2RlOwoJCQl0aGlzLnJlcGV0aXRpb25zID0gcmVwZXRpdGlvbnM7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJLy8gV2VpZ2h0CgoJCS8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nCgkJLy8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzCgkJLy8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5lbmFibGVkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZwoJCXNldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCB3ZWlnaHQgKSB7CgoJCQl0aGlzLndlaWdodCA9IHdlaWdodDsKCgkJCS8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWUKCQkJdGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDsKCgkJCXJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTsKCgkJfSwKCgkJLy8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZAoJCWdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDsKCgkJfSwKCgkJZmFkZUluOiBmdW5jdGlvbiAoIGR1cmF0aW9uICkgewoKCQkJcmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApOwoKCQl9LAoKCQlmYWRlT3V0OiBmdW5jdGlvbiAoIGR1cmF0aW9uICkgewoKCQkJcmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMSwgMCApOwoKCQl9LAoKCQljcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkgewoKCQkJZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApOwoJCQl0aGlzLmZhZGVJbiggZHVyYXRpb24gKTsKCgkJCWlmICggd2FycCApIHsKCgkJCQl2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLAoJCQkJCWZhZGVPdXREdXJhdGlvbiA9IGZhZGVPdXRBY3Rpb24uX2NsaXAuZHVyYXRpb24sCgoJCQkJCXN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbiwKCQkJCQllbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247CgoJCQkJZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7CgkJCQl0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkgewoKCQkJcmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApOwoKCQl9LAoKCQlzdG9wRmFkaW5nOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgd2VpZ2h0SW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDsKCgkJCWlmICggd2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwgKSB7CgoJCQkJdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsOwoJCQkJdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApOwoKCQkJfQoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCS8vIFRpbWUgU2NhbGUgQ29udHJvbAoKCQkvLyBzZXQgdGhlIHRpbWUgc2NhbGUgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCB3YXJwaW5nCgkJLy8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXMKCQkvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmcKCQlzZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkgewoKCQkJdGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7CgkJCXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6IHRpbWVTY2FsZTsKCgkJCXJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7CgoJCX0sCgoJCS8vIHJldHVybiB0aGUgdGltZSBzY2FsZSBjb25zaWRlcmluZyB3YXJwaW5nIGFuZCAucGF1c2VkCgkJZ2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlOwoKCQl9LAoKCQlzZXREdXJhdGlvbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHsKCgkJCXRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uOwoKCQkJcmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTsKCgkJfSwKCgkJc3luY1dpdGg6IGZ1bmN0aW9uICggYWN0aW9uICkgewoKCQkJdGhpcy50aW1lID0gYWN0aW9uLnRpbWU7CgkJCXRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTsKCgkJCXJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7CgoJCX0sCgoJCWhhbHQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7CgoJCQlyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9uICk7CgoJCX0sCgoJCXdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7CgoJCQl2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSwKCQkJCWludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsCgoJCQkJdGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7CgoJCQlpZiAoIGludGVycG9sYW50ID09PSBudWxsICkgewoKCQkJCWludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTsKCQkJCXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7CgoJCQl9CgoJCQl2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsCgkJCQl2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7CgoJCQl0aW1lc1sgMCBdID0gbm93OwoJCQl0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247CgoJCQl2YWx1ZXNbIDAgXSA9IHN0YXJ0VGltZVNjYWxlIC8gdGltZVNjYWxlOwoJCQl2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzdG9wV2FycGluZzogZnVuY3Rpb24gKCkgewoKCQkJdmFyIHRpbWVTY2FsZUludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7CgoJCQlpZiAoIHRpbWVTY2FsZUludGVycG9sYW50ICE9PSBudWxsICkgewoKCQkJCXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDsKCQkJCXRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQkvLyBPYmplY3QgQWNjZXNzb3JzCgoJCWdldE1peGVyOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5fbWl4ZXI7CgoJCX0sCgoJCWdldENsaXA6IGZ1bmN0aW9uICgpIHsKCgkJCXJldHVybiB0aGlzLl9jbGlwOwoKCQl9LAoKCQlnZXRSb290OiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290OwoKCQl9LAoKCQkvLyBJbnRlcm5hCgoJCV91cGRhdGU6IGZ1bmN0aW9uICggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKSB7CgoJCQkvLyBjYWxsZWQgYnkgdGhlIG1peGVyCgoJCQlpZiAoICEgdGhpcy5lbmFibGVkICkgewoKCQkJCS8vIGNhbGwgLl91cGRhdGVXZWlnaHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHQKCgkJCQl0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTsKCQkJCXJldHVybjsKCgkJCX0KCgkJCXZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7CgoJCQlpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHsKCgkJCQkvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvbgoKCQkJCXZhciB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjsKCQkJCWlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7CgoJCQkJCXJldHVybjsgLy8geWV0IHRvIGNvbWUgLyBkb24ndCBkZWNpZGUgd2hlbiBkZWx0YSA9IDAKCgkJCQl9CgoJCQkJLy8gc3RhcnQKCgkJCQl0aGlzLl9zdGFydFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlCgkJCQlkZWx0YVRpbWUgPSB0aW1lRGlyZWN0aW9uICogdGltZVJ1bm5pbmc7CgoJCQl9CgoJCQkvLyBhcHBseSB0aW1lIHNjYWxlIGFuZCBhZHZhbmNlIHRpbWUKCgkJCWRlbHRhVGltZSAqPSB0aGlzLl91cGRhdGVUaW1lU2NhbGUoIHRpbWUgKTsKCQkJdmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7CgoJCQkvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpbgoJCQkvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIDAKCgkJCXZhciB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTsKCgkJCWlmICggd2VpZ2h0ID4gMCApIHsKCgkJCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzOwoJCQkJdmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5nczsKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkgewoKCQkJCQlpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTsKCQkJCQlwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2VpZ2h0ICk7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQlfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7CgoJCQl2YXIgd2VpZ2h0ID0gMDsKCgkJCWlmICggdGhpcy5lbmFibGVkICkgewoKCQkJCXdlaWdodCA9IHRoaXMud2VpZ2h0OwoJCQkJdmFyIGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CgoJCQkJaWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHsKCgkJCQkJdmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07CgoJCQkJCXdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlOwoKCQkJCQlpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHsKCgkJCQkJCXRoaXMuc3RvcEZhZGluZygpOwoKCQkJCQkJaWYgKCBpbnRlcnBvbGFudFZhbHVlID09PSAwICkgewoKCQkJCQkJCS8vIGZhZGVkIG91dCwgZGlzYWJsZQoJCQkJCQkJdGhpcy5lbmFibGVkID0gZmFsc2U7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQl0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7CgkJCXJldHVybiB3ZWlnaHQ7CgoJCX0sCgoJCV91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHsKCgkJCXZhciB0aW1lU2NhbGUgPSAwOwoKCQkJaWYgKCAhIHRoaXMucGF1c2VkICkgewoKCQkJCXRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlOwoKCQkJCXZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50OwoKCQkJCWlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7CgoJCQkJCXZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdOwoKCQkJCQl0aW1lU2NhbGUgKj0gaW50ZXJwb2xhbnRWYWx1ZTsKCgkJCQkJaWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7CgoJCQkJCQl0aGlzLnN0b3BXYXJwaW5nKCk7CgoJCQkJCQlpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHsKCgkJCQkJCQkvLyBtb3Rpb24gaGFzIGhhbHRlZCwgcGF1c2UKCQkJCQkJCXRoaXMucGF1c2VkID0gdHJ1ZTsKCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJLy8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwgdGltZSBzY2FsZQoJCQkJCQkJdGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9CgoJCQl0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7CgkJCXJldHVybiB0aW1lU2NhbGU7CgoJCX0sCgoJCV91cGRhdGVUaW1lOiBmdW5jdGlvbiAoIGRlbHRhVGltZSApIHsKCgkJCXZhciB0aW1lID0gdGhpcy50aW1lICsgZGVsdGFUaW1lOwoKCQkJaWYgKCBkZWx0YVRpbWUgPT09IDAgKSByZXR1cm4gdGltZTsKCgkJCXZhciBkdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sCgoJCQkJbG9vcCA9IHRoaXMubG9vcCwKCQkJCWxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDsKCgkJCWlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7CgoJCQkJaWYgKCBsb29wQ291bnQgPT09IC0gMSApIHsKCgkJCQkJLy8ganVzdCBzdGFydGVkCgoJCQkJCXRoaXMuX2xvb3BDb3VudCA9IDA7CgkJCQkJdGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTsKCgkJCQl9CgoJCQkJaGFuZGxlX3N0b3A6IHsKCgkJCQkJaWYgKCB0aW1lID49IGR1cmF0aW9uICkgewoKCQkJCQkJdGltZSA9IGR1cmF0aW9uOwoKCQkJCQl9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHsKCgkJCQkJCXRpbWUgPSAwOwoKCQkJCQl9IGVsc2UgYnJlYWsgaGFuZGxlX3N0b3A7CgoJCQkJCWlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTsKCQkJCQllbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlOwoKCQkJCQl0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7CgkJCQkJCXR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcywKCQkJCQkJZGlyZWN0aW9uOiBkZWx0YVRpbWUgPCAwID8gLSAxIDogMQoJCQkJCX0gKTsKCgkJCQl9CgoJCQl9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZwoKCQkJCXZhciBwaW5nUG9uZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7CgoJCQkJaWYgKCBsb29wQ291bnQgPT09IC0gMSApIHsKCgkJCQkJLy8ganVzdCBzdGFydGVkCgoJCQkJCWlmICggZGVsdGFUaW1lID49IDAgKSB7CgoJCQkJCQlsb29wQ291bnQgPSAwOwoKCQkJCQkJdGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTsKCgkJCQkJfSBlbHNlIHsKCgkJCQkJCS8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWwKCQkJCQkJLy8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlvbiwKCQkJCQkJLy8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xCgoJCQkJCQl0aGlzLl9zZXRFbmRpbmdzKCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1lIDwgMCApIHsKCgkJCQkJLy8gd3JhcCBhcm91bmQKCgkJCQkJdmFyIGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWQKCQkJCQl0aW1lIC09IGR1cmF0aW9uICogbG9vcERlbHRhOwoKCQkJCQlsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApOwoKCQkJCQl2YXIgcGVuZGluZyA9IHRoaXMucmVwZXRpdGlvbnMgLSBsb29wQ291bnQ7CgoJCQkJCWlmICggcGVuZGluZyA8IDAgKSB7CgoJCQkJCQkvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudCkKCgkJCQkJCWlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTsKCQkJCQkJZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTsKCgkJCQkJCXRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24gOiAwOwoKCQkJCQkJdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCggewoJCQkJCQkJdHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLAoJCQkJCQkJZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0gMQoJCQkJCQl9ICk7CgoJCQkJCX0gZWxzZSB7CgoJCQkJCQkvLyBrZWVwIHJ1bm5pbmcKCgkJCQkJCWlmICggcGVuZGluZyA9PT0gMCApIHsKCgkJCQkJCQkvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZAoKCQkJCQkJCXZhciBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDsKCQkJCQkJCXRoaXMuX3NldEVuZGluZ3MoIGF0U3RhcnQsICEgYXRTdGFydCwgcGluZ1BvbmcgKTsKCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJdGhpcy5fc2V0RW5kaW5ncyggZmFsc2UsIGZhbHNlLCBwaW5nUG9uZyApOwoKCQkJCQkJfQoKCQkJCQkJdGhpcy5fbG9vcENvdW50ID0gbG9vcENvdW50OwoKCQkJCQkJdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCggewoJCQkJCQkJdHlwZTogJ2xvb3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhCgkJCQkJCX0gKTsKCgkJCQkJfQoKCQkJCX0KCgkJCQlpZiAoIHBpbmdQb25nICYmICggbG9vcENvdW50ICYgMSApID09PSAxICkgewoKCQkJCQkvLyBpbnZlcnQgdGltZSBmb3IgdGhlICJwb25nIHJvdW5kIgoKCQkJCQl0aGlzLnRpbWUgPSB0aW1lOwoJCQkJCXJldHVybiBkdXJhdGlvbiAtIHRpbWU7CgoJCQkJfQoKCQkJfQoKCQkJdGhpcy50aW1lID0gdGltZTsKCQkJcmV0dXJuIHRpbWU7CgoJCX0sCgoJCV9zZXRFbmRpbmdzOiBmdW5jdGlvbiAoIGF0U3RhcnQsIGF0RW5kLCBwaW5nUG9uZyApIHsKCgkJCXZhciBzZXR0aW5ncyA9IHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7CgoJCQlpZiAoIHBpbmdQb25nICkgewoKCQkJCXNldHRpbmdzLmVuZGluZ1N0YXJ0IAk9IFplcm9TbG9wZUVuZGluZzsKCQkJCXNldHRpbmdzLmVuZGluZ0VuZAkJPSBaZXJvU2xvcGVFbmRpbmc7CgoJCQl9IGVsc2UgewoKCQkJCS8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWUKCgkJCQlpZiAoIGF0U3RhcnQgKSB7CgoJCQkJCXNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZzsKCgkJCQl9IGVsc2UgewoKCQkJCQlzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7CgoJCQkJfQoKCQkJCWlmICggYXRFbmQgKSB7CgoJCQkJCXNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXNldHRpbmdzLmVuZGluZ0VuZCAJID0gV3JhcEFyb3VuZEVuZGluZzsKCgkJCQl9CgoJCQl9CgoJCX0sCgoJCV9zY2hlZHVsZUZhZGluZzogZnVuY3Rpb24gKCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkgewoKCQkJdmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsCgkJCQlpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50OwoKCQkJaWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHsKCgkJCQlpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7CgkJCQl0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50OwoKCQkJfQoKCQkJdmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLAoJCQkJdmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzOwoKCQkJdGltZXNbIDAgXSA9IG5vdzsgCQkJCXZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93OwoJCQl0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247CXZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjsKCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICoKCSAqIFBsYXllciBmb3IgQW5pbWF0aW9uQ2xpcHMuCgkgKgoJICoKCSAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCgkgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KCSAqIEBhdXRob3IgdHNjaHcKCSAqLwoKCWZ1bmN0aW9uIEFuaW1hdGlvbk1peGVyKCByb290ICkgewoKCQl0aGlzLl9yb290ID0gcm9vdDsKCQl0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpOwoJCXRoaXMuX2FjY3VJbmRleCA9IDA7CgoJCXRoaXMudGltZSA9IDA7CgoJCXRoaXMudGltZVNjYWxlID0gMS4wOwoKCX0KCglBbmltYXRpb25NaXhlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IEFuaW1hdGlvbk1peGVyLAoKCQlfYmluZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApIHsKCgkJCXZhciByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCwKCQkJCXRyYWNrcyA9IGFjdGlvbi5fY2xpcC50cmFja3MsCgkJCQluVHJhY2tzID0gdHJhY2tzLmxlbmd0aCwKCQkJCWJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLAoJCQkJaW50ZXJwb2xhbnRzID0gYWN0aW9uLl9pbnRlcnBvbGFudHMsCgkJCQlyb290VXVpZCA9IHJvb3QudXVpZCwKCQkJCWJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAoJCQkJYmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTsKCgkJCWlmICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHsKCgkJCQliaW5kaW5nc0J5TmFtZSA9IHt9OwoJCQkJYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTsKCgkJCX0KCgkJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHsKCgkJCQl2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSwKCQkJCQl0cmFja05hbWUgPSB0cmFjay5uYW1lLAoJCQkJCWJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07CgoJCQkJaWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCWJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nOwoKCQkJCX0gZWxzZSB7CgoJCQkJCWJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdOwoKCQkJCQlpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCS8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3MKCgkJCQkJCWlmICggYmluZGluZy5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHsKCgkJCQkJCQkrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50OwoJCQkJCQkJdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7CgoJCQkJCQl9CgoJCQkJCQljb250aW51ZTsKCgkJCQkJfQoKCQkJCQl2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uCgkJCQkJCV9wcm9wZXJ0eUJpbmRpbmdzWyBpIF0uYmluZGluZy5wYXJzZWRQYXRoOwoKCQkJCQliaW5kaW5nID0gbmV3IFByb3BlcnR5TWl4ZXIoCgkJCQkJCVByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLAoJCQkJCQl0cmFjay5WYWx1ZVR5cGVOYW1lLCB0cmFjay5nZXRWYWx1ZVNpemUoKSApOwoKCQkJCQkrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50OwoJCQkJCXRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApOwoKCQkJCQliaW5kaW5nc1sgaSBdID0gYmluZGluZzsKCgkJCQl9CgoJCQkJaW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7CgoJCQl9CgoJCX0sCgoJCV9hY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CgoJCQlpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkgewoKCQkJCWlmICggYWN0aW9uLl9jYWNoZUluZGV4ID09PSBudWxsICkgewoKCQkJCQkvLyB0aGlzIGFjdGlvbiBoYXMgYmVlbiBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXIKCQkJCQkvLyBhcHBlYXJzIHRvIGJlIHN0aWxsIHVzaW5nIGl0IC0+IHJlYmluZAoKCQkJCQl2YXIgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLAoJCQkJCQljbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLAoJCQkJCQlhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgoJCQkJCXRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbiwKCQkJCQkJYWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTsKCgkJCQkJdGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7CgoJCQkJfQoKCQkJCXZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsKCgkJCQkvLyBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlCgkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJCXZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTsKCgkJCQkJaWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkgewoKCQkJCQkJdGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTsKCQkJCQkJYmluZGluZy5zYXZlT3JpZ2luYWxTdGF0ZSgpOwoKCQkJCQl9CgoJCQkJfQoKCQkJCXRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApOwoKCQkJfQoKCQl9LAoKCQlfZGVhY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CgoJCQlpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHsKCgkJCQl2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7CgoJCQkJLy8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZQoJCQkJZm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCQl2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07CgoJCQkJCWlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHsKCgkJCQkJCWJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTsKCQkJCQkJdGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7CgoJCQkJCX0KCgkJCQl9CgoJCQkJdGhpcy5fdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApOwoKCQkJfQoKCQl9LAoKCQkvLyBNZW1vcnkgbWFuYWdlcgoKCQlfaW5pdE1lbW9yeU1hbmFnZXI6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuX2FjdGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzCgkJCXRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDsKCgkJCXRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTsKCQkJLy8gaW5zaWRlOgoJCQkvLyB7CgkJCS8vIAkJa25vd25BY3Rpb25zOiBBcnJheTwgQW5pbWF0aW9uQWN0aW9uID4JLSB1c2VkIGFzIHByb3RvdHlwZXMKCQkJLy8gCQlhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvbgkJCS0gbG9va3VwCgkJCS8vIH0KCgoJCQl0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzCgkJCXRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7CgoJCQl0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPgoKCgkJCXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMgPSBbXTsgLy8gc2FtZSBnYW1lIGFzIGFib3ZlCgkJCXRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDsKCgkJCXZhciBzY29wZSA9IHRoaXM7CgoJCQl0aGlzLnN0YXRzID0gewoKCQkJCWFjdGlvbnM6IHsKCQkJCQlnZXQgdG90YWwoKSB7CgoJCQkJCQlyZXR1cm4gc2NvcGUuX2FjdGlvbnMubGVuZ3RoOwoKCQkJCQl9LAoJCQkJCWdldCBpblVzZSgpIHsKCgkJCQkJCXJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7CgoJCQkJCX0KCQkJCX0sCgkJCQliaW5kaW5nczogewoJCQkJCWdldCB0b3RhbCgpIHsKCgkJCQkJCXJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoOwoKCQkJCQl9LAoJCQkJCWdldCBpblVzZSgpIHsKCgkJCQkJCXJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzOwoKCQkJCQl9CgkJCQl9LAoJCQkJY29udHJvbEludGVycG9sYW50czogewoJCQkJCWdldCB0b3RhbCgpIHsKCgkJCQkJCXJldHVybiBzY29wZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGg7CgoJCQkJCX0sCgkJCQkJZ2V0IGluVXNlKCkgewoKCQkJCQkJcmV0dXJuIHNjb3BlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50czsKCgkJCQkJfQoJCQkJfQoKCQkJfTsKCgkJfSwKCgkJLy8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzCgoJCV9pc0FjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CgoJCQl2YXIgaW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7CgkJCXJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zOwoKCQl9LAoKCQlfYWRkSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKSB7CgoJCQl2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCgkJCQlhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCwKCQkJCWFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsKCgkJCWlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCApIHsKCgkJCQlhY3Rpb25zRm9yQ2xpcCA9IHsKCgkJCQkJa25vd25BY3Rpb25zOiBbIGFjdGlvbiBdLAoJCQkJCWFjdGlvbkJ5Um9vdDoge30KCgkJCQl9OwoKCQkJCWFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7CgoJCQkJYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwOwoKCQkJfSBlbHNlIHsKCgkJCQl2YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zOwoKCQkJCWFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGtub3duQWN0aW9ucy5sZW5ndGg7CgkJCQlrbm93bkFjdGlvbnMucHVzaCggYWN0aW9uICk7CgoJCQl9CgoJCQlhY3Rpb24uX2NhY2hlSW5kZXggPSBhY3Rpb25zLmxlbmd0aDsKCQkJYWN0aW9ucy5wdXNoKCBhY3Rpb24gKTsKCgkJCWFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjsKCgkJfSwKCgkJX3JlbW92ZUluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCgkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKCQkJCWxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLAoJCQkJY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDsKCgkJCWxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7CgkJCWFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjsKCQkJYWN0aW9ucy5wb3AoKTsKCgkJCWFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7CgoKCQkJdmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsCgkJCQlhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCwKCQkJCWFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSwKCQkJCWtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsCgoJCQkJbGFzdEtub3duQWN0aW9uID0KCQkJCQlrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSwKCgkJCQlieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4OwoKCQkJbGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDsKCQkJa25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uOwoJCQlrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpOwoKCQkJYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsKCgoJCQl2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290LAoJCQkJcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkOwoKCQkJZGVsZXRlIGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTsKCgkJCWlmICgga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggPT09IDAgKSB7CgoJCQkJZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgoJCQl9CgoJCQl0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTsKCgkJfSwKCgkJX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgewoKCQkJdmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzOwoJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgoJCQkJdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdOwoKCQkJCWlmICggLS0gYmluZGluZy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHsKCgkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQlfbGVuZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CgoJCQkvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF0KCQkJLy8gWyAgYWN0aXZlIGFjdGlvbnMgPnwgaW5hY3RpdmUgYWN0aW9ucyBdCgkJCS8vICAgICAgICAgICAgICAgICBzICAgICAgICBhCgkJCS8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT4KCQkJLy8gICAgICAgICAgICAgICAgIGEgICAgICAgIHMKCgkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKCQkJCXByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCwKCgkJCQlsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKywKCgkJCQlmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07CgoJCQlhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7CgkJCWFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uOwoKCQkJZmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKCQkJYWN0aW9uc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQWN0aW9uOwoKCQl9LAoKCQlfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgewoKCQkJLy8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdCgkJCS8vIFsgYWN0aXZlIGFjdGlvbnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXQoJCQkvLyAgICAgICAgYSAgICAgICAgcwoJCQkvLyAgICAgICAgIDwtc3dhcC0+CgkJCS8vICAgICAgICBzICAgICAgICBhCgoJCQl2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCgkJCQlwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsCgoJCQkJZmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsCgoJCQkJbGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdOwoKCQkJYWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4OwoJCQlhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjsKCgkJCWxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CgkJCWFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjsKCgkJfSwKCgkJLy8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0cwoKCQlfYWRkSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7CgoJCQl2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCgkJCQliaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sCgoJCQkJYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nczsKCgkJCWlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkgewoKCQkJCWJpbmRpbmdCeU5hbWUgPSB7fTsKCQkJCWJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTsKCgkJCX0KCgkJCWJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZzsKCgkJCWJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7CgkJCWJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTsKCgkJfSwKCgkJX3JlbW92ZUluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkgewoKCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCgkJCQlwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZywKCQkJCXJvb3RVdWlkID0gcHJvcEJpbmRpbmcucm9vdE5vZGUudXVpZCwKCQkJCXRyYWNrTmFtZSA9IHByb3BCaW5kaW5nLnBhdGgsCgkJCQliaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwKCQkJCWJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSwKCgkJCQlsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSwKCQkJCWNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4OwoKCQkJbGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7CgkJCWJpbmRpbmdzWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVCaW5kaW5nOwoJCQliaW5kaW5ncy5wb3AoKTsKCgkJCWRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTsKCgkJCXJlbW92ZV9lbXB0eV9tYXA6IHsKCgkJCQlmb3IgKCB2YXIgXyBpbiBiaW5kaW5nQnlOYW1lICkgYnJlYWsgcmVtb3ZlX2VtcHR5X21hcDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKCQkJCWRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTsKCgkJCX0KCgkJfSwKCgkJX2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7CgoJCQl2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncywKCQkJCXByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsCgoJCQkJbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLAoKCQkJCWZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdOwoKCQkJYmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDsKCQkJYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZzsKCgkJCWZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4OwoJCQliaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZzsKCgkJfSwKCgkJX3Rha2VCYWNrQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkgewoKCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCgkJCQlwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LAoKCQkJCWZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVCaW5kaW5ncywKCgkJCQlsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTsKCgkJCWJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7CgkJCWJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7CgoJCQlsYXN0QWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKCQkJYmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7CgoJCX0sCgoKCQkvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZQoKCQlfbGVuZENvbnRyb2xJbnRlcnBvbGFudDogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsCgkJCQlsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyArKywKCQkJCWludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXTsKCgkJCWlmICggaW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHsKCgkJCQlpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudCgKCQkJCQluZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSwKCQkJCQkxLCB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyICk7CgoJCQkJaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4OwoJCQkJaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50OwoKCQkJfQoKCQkJcmV0dXJuIGludGVycG9sYW50OwoKCQl9LAoKCQlfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQgKSB7CgoJCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cywKCQkJCXByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCwKCgkJCQlmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cywKCgkJCQlsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdOwoKCQkJaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4OwoJCQlpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7CgoJCQlsYXN0QWN0aXZlSW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gcHJldkluZGV4OwoJCQlpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50OwoKCQl9LAoKCQlfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjogbmV3IEZsb2F0MzJBcnJheSggMSApLAoKCQkvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldAoJCS8vIG9iamVjdCAodGhpcyBtZXRob2QgYWxsb2NhdGVzIGEgbG90IG9mIGR5bmFtaWMgbWVtb3J5IGluIGNhc2UgYQoJCS8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKQoJCWNsaXBBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkgewoKCQkJdmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCwKCQkJCXJvb3RVdWlkID0gcm9vdC51dWlkLAoKCQkJCWNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgPwoJCQkJCUFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCwKCgkJCQljbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLAoKCQkJCWFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSwKCQkJCXByb3RvdHlwZUFjdGlvbiA9IG51bGw7CgoJCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJdmFyIGV4aXN0aW5nQWN0aW9uID0KCQkJCQkJYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdOwoKCQkJCWlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJcmV0dXJuIGV4aXN0aW5nQWN0aW9uOwoKCQkJCX0KCgkJCQkvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbAoJCQkJLy8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5CgkJCQlwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTsKCgkJCQkvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb24KCQkJCWlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApCgkJCQkJY2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDsKCgkJCX0KCgkJCS8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nCgkJCWlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsOwoKCQkJLy8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXQKCQkJdmFyIG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApOwoKCQkJdGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTsKCgkJCS8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyCgkJCXRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApOwoKCQkJcmV0dXJuIG5ld0FjdGlvbjsKCgkJfSwKCgkJLy8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvbgoJCWV4aXN0aW5nQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHsKCgkJCXZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsCgkJCQlyb290VXVpZCA9IHJvb3QudXVpZCwKCgkJCQljbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID8KCQkJCQlBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsCgoJCQkJY2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCwKCgkJCQlhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgoJCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJcmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsOwoKCQkJfQoKCQkJcmV0dXJuIG51bGw7CgoJCX0sCgoJCS8vIGRlYWN0aXZhdGVzIGFsbCBwcmV2aW91c2x5IHNjaGVkdWxlZCBhY3Rpb25zCgkJc3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAoJCQkJbkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucywKCQkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCgkJCQluQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7CgoJCQl0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7CgkJCXRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7CgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkgewoKCQkJCWFjdGlvbnNbIGkgXS5yZXNldCgpOwoKCQkJfQoKCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7CgoJCQkJYmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJLy8gYWR2YW5jZSB0aGUgdGltZSBhbmQgdXBkYXRlIGFwcGx5IHRoZSBhbmltYXRpb24KCQl1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkgewoKCQkJZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlOwoKCQkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAoJCQkJbkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucywKCgkJCQl0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSwKCQkJCXRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLAoKCQkJCWFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxOwoKCQkJLy8gcnVuIGFjdGl2ZSBhY3Rpb25zCgoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkgewoKCQkJCXZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07CgoJCQkJYWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7CgoJCQl9CgoJCQkvLyB1cGRhdGUgc2NlbmUgZ3JhcGgKCgkJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAoJCQkJbkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzOwoKCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7CgoJCQkJYmluZGluZ3NbIGkgXS5hcHBseSggYWNjdUluZGV4ICk7CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJLy8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3QKCQlnZXRSb290OiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gdGhpcy5fcm9vdDsKCgkJfSwKCgkJLy8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBjbGlwCgkJdW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHsKCgkJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKCQkJCWNsaXBVdWlkID0gY2xpcC51dWlkLAoJCQkJYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsCgkJCQlhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgoJCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZQoJCQkJLy8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhbgoJCQkJLy8ganVzdCB0aHJvdyBhd2F5CgoJCQkJdmFyIGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uczsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKCQkJCQl2YXIgYWN0aW9uID0gYWN0aW9uc1RvUmVtb3ZlWyBpIF07CgoJCQkJCXRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApOwoKCQkJCQl2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCwKCQkJCQkJbGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF07CgoJCQkJCWFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7CgkJCQkJYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsKCgkJCQkJbGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKCQkJCQlhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247CgkJCQkJYWN0aW9ucy5wb3AoKTsKCgkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7CgoJCQkJfQoKCQkJCWRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdOwoKCQkJfQoKCQl9LAoKCQkvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHJvb3QgdGFyZ2V0IG9iamVjdAoJCXVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7CgoJCQl2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsCgkJCQlhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDsKCgkJCWZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkgewoKCQkJCXZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCwKCQkJCQlhY3Rpb24gPSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07CgoJCQkJaWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJdGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7CgkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApOwoKCQkJCX0KCgkJCX0KCgkJCXZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwKCQkJCWJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTsKCgkJCWlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWZvciAoIHZhciB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHsKCgkJCQkJdmFyIGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTsKCQkJCQliaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7CgkJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7CgoJCQkJfQoKCQkJfQoKCQl9LAoKCQkvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlCgkJdW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7CgoJCQl2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7CgoJCQlpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHsKCgkJCQl0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTsKCQkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTsKCgkJCX0KCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHsKCgkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7CgkJCXZhbHVlID0gYXJndW1lbnRzWyAxIF07CgoJCX0KCgkJdGhpcy52YWx1ZSA9IHZhbHVlOwoKCX0KCglVbmlmb3JtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKCgkJcmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwoJICovCgoJZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSB7CgoJCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCgkJdGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JzsKCQl0aGlzLm1heEluc3RhbmNlZENvdW50ID0gdW5kZWZpbmVkOwoKCX0KCglJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKSwgewoKCQljb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksCgoJCWlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6IHRydWUsCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgoJCQl0aGlzLm1heEluc3RhbmNlZENvdW50ID0gc291cmNlLm1heEluc3RhbmNlZENvdW50OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMKCSAqLwoKCWZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgaXRlbVNpemUsIG9mZnNldCwgbm9ybWFsaXplZCApIHsKCgkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgoJCXRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyOwoJCXRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTsKCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKCgkJdGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTsKCgl9CgoJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgewoKCQljb3VudDogewoKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuZGF0YS5jb3VudDsKCgkJCX0KCgkJfSwKCgkJYXJyYXk6IHsKCgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiB0aGlzLmRhdGEuYXJyYXk7CgoJCQl9CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7CgoJCWlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsCgoJCXNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7CgoJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7CgoJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdID0geTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkgewoKCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXSA9IHo7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHsKCgkJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7CgoJCQlyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdOwoKCQl9LAoKCQlnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkgewoKCQkJcmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF07CgoJCX0sCgoJCWdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7CgoJCQlyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTsKCgkJfSwKCgkJZ2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCXJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdOwoKCQl9LAoKCQlzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHsKCgkJCWluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CgoJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkgewoKCQkJaW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDsKCgkJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4OwoJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJc2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHsKCgkJCWluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CgoJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKCQkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CgkJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6OwoJCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMyBdID0gdzsKCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCgkgKi8KCglmdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHsKCgkJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgoJCXRoaXMuYXJyYXkgPSBhcnJheTsKCQl0aGlzLnN0cmlkZSA9IHN0cmlkZTsKCQl0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7CgoJCXRoaXMuZHluYW1pYyA9IGZhbHNlOwoJCXRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9OwoKCQl0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTsKCgkJdGhpcy52ZXJzaW9uID0gMDsKCgl9CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKzsKCgkJfQoKCX0gKTsKCglPYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHsKCgkJaXNJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSwKCgkJc2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7CgoJCQkJdGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApOwoKCQkJfQoKCQkJdGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLnN0cmlkZSA6IDA7CgkJCXRoaXMuYXJyYXkgPSBhcnJheTsKCgkJfSwKCgkJc2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCXRoaXMuZHluYW1pYyA9IHZhbHVlOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKCQkJdGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApOwoJCQl0aGlzLmNvdW50ID0gc291cmNlLmNvdW50OwoJCQl0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7CgkJCXRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkgewoKCQkJaW5kZXgxICo9IHRoaXMuc3RyaWRlOwoJCQlpbmRleDIgKj0gYXR0cmlidXRlLnN0cmlkZTsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuc3RyaWRlOyBpIDwgbDsgaSArKyApIHsKCgkJCQl0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTsKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHsKCgkJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKCQkJdGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKCQl9LAoKCQlvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCgkJCXRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMKCSAqLwoKCWZ1bmN0aW9uIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlLCBtZXNoUGVyQXR0cmlidXRlICkgewoKCQlJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlzLCBhcnJheSwgc3RyaWRlICk7CgoJCXRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTsKCgl9CgoJSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlICksIHsKCgkJY29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLAoKCQlpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCUludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKCQkJdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwoJICovCgoJZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7CgoJCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTsKCgkJdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxOwoKCX0KCglJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApLCB7CgoJCWNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsCgoJCWlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiB0cnVlLAoKCQljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCgkJCUJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCgkJCXRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlOwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KCSAqIEBhdXRob3Igc3RlcGhvbWkgLyBodHRwOi8vc3RlcGhhbmVnaW5pZXIuY29tLwoJICovCgoJZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkgewoKCQl0aGlzLnJheSA9IG5ldyBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICk7CgkJLy8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucykKCgkJdGhpcy5uZWFyID0gbmVhciB8fCAwOwoJCXRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5OwoKCQl0aGlzLnBhcmFtcyA9IHsKCQkJTWVzaDoge30sCgkJCUxpbmU6IHt9LAoJCQlMT0Q6IHt9LAoJCQlQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sCgkJCVNwcml0ZToge30KCQl9OwoKCQlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcy5wYXJhbXMsIHsKCQkJUG9pbnRDbG91ZDogewoJCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFyYW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTsKCQkJCQlyZXR1cm4gdGhpcy5Qb2ludHM7CgoJCQkJfQoJCQl9CgkJfSApOwoKCX0KCglmdW5jdGlvbiBhc2NTb3J0KCBhLCBiICkgewoKCQlyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7CgoJfQoKCWZ1bmN0aW9uIGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHsKCgkJaWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCW9iamVjdC5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTsKCgkJaWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7CgoJCQl2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCWludGVyc2VjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0cnVlICk7CgoJCQl9CgoJCX0KCgl9CgoJT2JqZWN0LmFzc2lnbiggUmF5Y2FzdGVyLnByb3RvdHlwZSwgewoKCQlsaW5lUHJlY2lzaW9uOiAxLAoKCQlzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7CgoJCQkvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKQoKCQkJdGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApOwoKCQl9LAoKCQlzZXRGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoIGNvb3JkcywgY2FtZXJhICkgewoKCQkJaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApICkgewoKCQkJCXRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOwoJCQkJdGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2luICkubm9ybWFsaXplKCk7CgoJCQl9IGVsc2UgaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgKSApIHsKCgkJCQl0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmEKCQkJCXRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7CgoJCQl9IGVsc2UgewoKCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLicgKTsKCgkJCX0KCgkJfSwKCgkJaW50ZXJzZWN0T2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCwgcmVjdXJzaXZlICkgewoKCQkJdmFyIGludGVyc2VjdHMgPSBbXTsKCgkJCWludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTsKCgkJCWludGVyc2VjdHMuc29ydCggYXNjU29ydCApOwoKCQkJcmV0dXJuIGludGVyc2VjdHM7CgoJCX0sCgoJCWludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywgcmVjdXJzaXZlICkgewoKCQkJdmFyIGludGVyc2VjdHMgPSBbXTsKCgkJCWlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0cyApID09PSBmYWxzZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApOwoJCQkJcmV0dXJuIGludGVyc2VjdHM7CgoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJaW50ZXJzZWN0T2JqZWN0KCBvYmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApOwoKCQkJfQoKCQkJaW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7CgoJCQlyZXR1cm4gaW50ZXJzZWN0czsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBDbG9jayggYXV0b1N0YXJ0ICkgewoKCQl0aGlzLmF1dG9TdGFydCA9ICggYXV0b1N0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IGF1dG9TdGFydCA6IHRydWU7CgoJCXRoaXMuc3RhcnRUaW1lID0gMDsKCQl0aGlzLm9sZFRpbWUgPSAwOwoJCXRoaXMuZWxhcHNlZFRpbWUgPSAwOwoKCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKCgl9CgoJT2JqZWN0LmFzc2lnbiggQ2xvY2sucHJvdG90eXBlLCB7CgoJCXN0YXJ0OiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMyCgoJCQl0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTsKCQkJdGhpcy5lbGFwc2VkVGltZSA9IDA7CgkJCXRoaXMucnVubmluZyA9IHRydWU7CgoJCX0sCgoJCXN0b3A6IGZ1bmN0aW9uICgpIHsKCgkJCXRoaXMuZ2V0RWxhcHNlZFRpbWUoKTsKCQkJdGhpcy5ydW5uaW5nID0gZmFsc2U7CgkJCXRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7CgoJCX0sCgoJCWdldEVsYXBzZWRUaW1lOiBmdW5jdGlvbiAoKSB7CgoJCQl0aGlzLmdldERlbHRhKCk7CgkJCXJldHVybiB0aGlzLmVsYXBzZWRUaW1lOwoKCQl9LAoKCQlnZXREZWx0YTogZnVuY3Rpb24gKCkgewoKCQkJdmFyIGRpZmYgPSAwOwoKCQkJaWYgKCB0aGlzLmF1dG9TdGFydCAmJiAhIHRoaXMucnVubmluZyApIHsKCgkJCQl0aGlzLnN0YXJ0KCk7CgkJCQlyZXR1cm4gMDsKCgkJCX0KCgkJCWlmICggdGhpcy5ydW5uaW5nICkgewoKCQkJCXZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7CgoJCQkJZGlmZiA9ICggbmV3VGltZSAtIHRoaXMub2xkVGltZSApIC8gMTAwMDsKCQkJCXRoaXMub2xkVGltZSA9IG5ld1RpbWU7CgoJCQkJdGhpcy5lbGFwc2VkVGltZSArPSBkaWZmOwoKCQkJfQoKCQkJcmV0dXJuIGRpZmY7CgoJCX0KCgl9ICk7CgoJLyoqCgkgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqCgkgKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbQoJICoKCSAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuCgkgKiBUaGUgZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei4KCSAqLwoKCWZ1bmN0aW9uIFNwaGVyaWNhbCggcmFkaXVzLCBwaGksIHRoZXRhICkgewoKCQl0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsKCQl0aGlzLnBoaSA9ICggcGhpICE9PSB1bmRlZmluZWQgKSA/IHBoaSA6IDA7IC8vIHVwIC8gZG93biB0b3dhcmRzIHRvcCBhbmQgYm90dG9tIHBvbGUKCQl0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGFyb3VuZCB0aGUgZXF1YXRvciBvZiB0aGUgc3BoZXJlCgoJCXJldHVybiB0aGlzOwoKCX0KCglPYmplY3QuYXNzaWduKCBTcGhlcmljYWwucHJvdG90eXBlLCB7CgoJCXNldDogZnVuY3Rpb24gKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7CgoJCQl0aGlzLnJhZGl1cyA9IHJhZGl1czsKCQkJdGhpcy5waGkgPSBwaGk7CgkJCXRoaXMudGhldGEgPSB0aGV0YTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQljbG9uZTogZnVuY3Rpb24gKCkgewoKCQkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKCQl9LAoKCQljb3B5OiBmdW5jdGlvbiAoIG90aGVyICkgewoKCQkJdGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7CgkJCXRoaXMucGhpID0gb3RoZXIucGhpOwoJCQl0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7CgoJCQlyZXR1cm4gdGhpczsKCgkJfSwKCgkJLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQUwoJCW1ha2VTYWZlOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgRVBTID0gMC4wMDAwMDE7CgkJCXRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkgLSBFUFMsIHRoaXMucGhpICkgKTsKCgkJCXJldHVybiB0aGlzOwoKCQl9LAoKCQlzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2ZWMzICkgewoKCQkJdGhpcy5yYWRpdXMgPSB2ZWMzLmxlbmd0aCgpOwoKCQkJaWYgKCB0aGlzLnJhZGl1cyA9PT0gMCApIHsKCgkJCQl0aGlzLnRoZXRhID0gMDsKCQkJCXRoaXMucGhpID0gMDsKCgkJCX0gZWxzZSB7CgoJCQkJdGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7IC8vIGVxdWF0b3IgYW5nbGUgYXJvdW5kIHktdXAgYXhpcwoJCQkJdGhpcy5waGkgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB2ZWMzLnkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTsgLy8gcG9sYXIgYW5nbGUKCgkJCX0KCgkJCXJldHVybiB0aGlzOwoKCQl9CgoJfSApOwoKCS8qKgoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKCSAqCgkgKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtCgkgKgoJICovCgoJZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7CgoJCXRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOyAvLyBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lCgkJdGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXMKCQl0aGlzLnkgPSAoIHkgIT09IHVuZGVmaW5lZCApID8geSA6IDA7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lCgoJCXJldHVybiB0aGlzOwoKCX0KCglPYmplY3QuYXNzaWduKCBDeWxpbmRyaWNhbC5wcm90b3R5cGUsIHsKCgkJc2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7CgoJCQl0aGlzLnJhZGl1cyA9IHJhZGl1czsKCQkJdGhpcy50aGV0YSA9IHRoZXRhOwoJCQl0aGlzLnkgPSB5OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCWNsb25lOiBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgoJCX0sCgoJCWNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7CgoJCQl0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1czsKCQkJdGhpcy50aGV0YSA9IG90aGVyLnRoZXRhOwoJCQl0aGlzLnkgPSBvdGhlci55OwoKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCXNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7CgoJCQl0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVjMy56ICk7CgkJCXRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOwoJCQl0aGlzLnkgPSB2ZWMzLnk7CgoJCQlyZXR1cm4gdGhpczsKCgkJfQoKCX0gKTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKi8KCglmdW5jdGlvbiBJbW1lZGlhdGVSZW5kZXJPYmplY3QoIG1hdGVyaWFsICkgewoKCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgoJCXRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDsKCQl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTsKCgl9CgoJSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApOwoJSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltbWVkaWF0ZVJlbmRlck9iamVjdDsKCglJbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqLwoKCWZ1bmN0aW9uIFZlcnRleE5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7CgoJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwoKCQl0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7CgoJCXZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmYwMDAwOwoKCQl2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxOwoKCQkvLwoKCQl2YXIgbk5vcm1hbHMgPSAwOwoKCQl2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKCgkJaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKCQkJbk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGggKiAzOwoKCQl9IGVsc2UgaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgewoKCQkJbk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5jb3VudDsKCgkJfQoKCQkvLwoKCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCgkJdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7CgoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7CgoJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTsKCgkJLy8KCgkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CgoJCXRoaXMudXBkYXRlKCk7CgoJfQoKCVZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwoJVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWZXJ0ZXhOb3JtYWxzSGVscGVyOwoKCVZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkgewoKCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwoJCXZhciB2MiA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7CgoJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CgoJCQl2YXIga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdOwoKCQkJdGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCW5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7CgoJCQl2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDsKCgkJCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCS8vCgoJCQl2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKCgkJCWlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCgkJCQl2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlczsKCgkJCQl2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlczsKCgkJCQl2YXIgaWR4ID0gMDsKCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgoJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgoJCQkJCQl2YXIgdmVydGV4ID0gdmVydGljZXNbIGZhY2VbIGtleXNbIGogXSBdIF07CgoJCQkJCQl2YXIgbm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF07CgoJCQkJCQl2MS5jb3B5KCB2ZXJ0ZXggKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7CgoJCQkJCQl2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7CgoJCQkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApOwoKCQkJCQkJaWR4ID0gaWR4ICsgMTsKCgkJCQkJCXBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7CgoJCQkJCQlpZHggPSBpZHggKyAxOwoKCQkJCQl9CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCgkJCQl2YXIgb2JqUG9zID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCQl2YXIgb2JqTm9ybSA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsOwoKCQkJCXZhciBpZHggPSAwOwoKCQkJCS8vIGZvciBzaW1wbGljaXR5LCBpZ25vcmUgaW5kZXggYW5kIGRyYXdjYWxscywgYW5kIHJlbmRlciBldmVyeSBub3JtYWwKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gb2JqUG9zLmNvdW50OyBqIDwgamw7IGogKysgKSB7CgoJCQkJCXYxLnNldCggb2JqUG9zLmdldFgoIGogKSwgb2JqUG9zLmdldFkoIGogKSwgb2JqUG9zLmdldFooIGogKSApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKCgkJCQkJdjIuc2V0KCBvYmpOb3JtLmdldFgoIGogKSwgb2JqTm9ybS5nZXRZKCBqICksIG9iak5vcm0uZ2V0WiggaiApICk7CgoJCQkJCXYyLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTsKCgkJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTsKCgkJCQkJaWR4ID0gaWR4ICsgMTsKCgkJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTsKCgkJCQkJaWR4ID0gaWR4ICsgMTsKCgkJCQl9CgoJCQl9CgoJCQlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCX07CgoJfSgpICk7CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICovCgoJZnVuY3Rpb24gU3BvdExpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7CgoJCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCgkJdGhpcy5saWdodCA9IGxpZ2h0OwoJCXRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTsKCgkJdGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDsKCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCgkJdGhpcy5jb2xvciA9IGNvbG9yOwoKCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCgkJdmFyIHBvc2l0aW9ucyA9IFsKCQkJMCwgMCwgMCwgCTAsIDAsIDEsCgkJCTAsIDAsIDAsIAkxLCAwLCAxLAoJCQkwLCAwLCAwLAktIDEsIDAsIDEsCgkJCTAsIDAsIDAsIAkwLCAxLCAxLAoJCQkwLCAwLCAwLCAJMCwgLSAxLCAxCgkJXTsKCgkJZm9yICggdmFyIGkgPSAwLCBqID0gMSwgbCA9IDMyOyBpIDwgbDsgaSArKywgaiArKyApIHsKCgkJCXZhciBwMSA9ICggaSAvIGwgKSAqIE1hdGguUEkgKiAyOwoJCQl2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjsKCgkJCXBvc2l0aW9ucy5wdXNoKAoJCQkJTWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLAoJCQkJTWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxCgkJCSk7CgoJCX0KCgkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTsKCgkJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApOwoKCQl0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCQl0aGlzLmFkZCggdGhpcy5jb25lICk7CgoJCXRoaXMudXBkYXRlKCk7CgoJfQoKCVNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKCVNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcG90TGlnaHRIZWxwZXI7CgoJU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgewoKCQl0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpOwoJCXRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7CgoJfTsKCglTcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpOwoKCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgewoKCQkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKCQkJdmFyIGNvbmVMZW5ndGggPSB0aGlzLmxpZ2h0LmRpc3RhbmNlID8gdGhpcy5saWdodC5kaXN0YW5jZSA6IDEwMDA7CgkJCXZhciBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTsKCgkJCXRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7CgoJCQl2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7CgkJCXZlY3RvcjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApOwoKCQkJdGhpcy5jb25lLmxvb2tBdCggdmVjdG9yMi5zdWIoIHZlY3RvciApICk7CgoJCQlpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHsKCgkJCQl0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7CgoJCQl9IGVsc2UgewoKCQkJCXRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7CgoJCQl9CgoJCX07CgoJfSgpOwoKCS8qKgoJICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWYKCSAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICovCgoJZnVuY3Rpb24gZ2V0Qm9uZUxpc3QoIG9iamVjdCApIHsKCgkJdmFyIGJvbmVMaXN0ID0gW107CgoJCWlmICggb2JqZWN0ICYmIG9iamVjdC5pc0JvbmUgKSB7CgoJCQlib25lTGlzdC5wdXNoKCBvYmplY3QgKTsKCgkJfQoKCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkgewoKCQkJYm9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7CgoJCX0KCgkJcmV0dXJuIGJvbmVMaXN0OwoKCX0KCglmdW5jdGlvbiBTa2VsZXRvbkhlbHBlciggb2JqZWN0ICkgewoKCQl2YXIgYm9uZXMgPSBnZXRCb25lTGlzdCggb2JqZWN0ICk7CgoJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoKCQl2YXIgdmVydGljZXMgPSBbXTsKCQl2YXIgY29sb3JzID0gW107CgoJCXZhciBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTsKCQl2YXIgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7CgoJCWZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHsKCgkJCXZhciBib25lID0gYm9uZXNbIGkgXTsKCgkJCWlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkgewoKCQkJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKCQkJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKCQkJCWNvbG9ycy5wdXNoKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7CgkJCQljb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApOwoKCQkJfQoKCQl9CgoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApOwoKCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7CgoJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCgkJdGhpcy5yb290ID0gb2JqZWN0OwoJCXRoaXMuYm9uZXMgPSBib25lczsKCgkJdGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CgkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CgoJfQoKCVNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKCVNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyOwoKCVNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CgoJCXZhciBib25lTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCQl2YXIgbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpOwoKCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkgewoKCQkJdmFyIGJvbmVzID0gdGhpcy5ib25lczsKCgkJCXZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CgkJCXZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApOwoKCQkJbWF0cml4V29ybGRJbnYuZ2V0SW52ZXJzZSggdGhpcy5yb290Lm1hdHJpeFdvcmxkICk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkgewoKCQkJCXZhciBib25lID0gYm9uZXNbIGkgXTsKCgkJCQlpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHsKCgkJCQkJYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApOwoJCQkJCXZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTsKCQkJCQlwb3NpdGlvbi5zZXRYWVooIGosIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTsKCgkJCQkJYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTsKCQkJCQl2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7CgkJCQkJcG9zaXRpb24uc2V0WFlaKCBqICsgMSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOwoKCQkJCQlqICs9IDI7CgoJCQkJfQoKCQkJfQoKCQkJZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQkJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgoJCX07CgoJfSgpOwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBQb2ludExpZ2h0SGVscGVyKCBsaWdodCwgc3BoZXJlU2l6ZSwgY29sb3IgKSB7CgoJCXRoaXMubGlnaHQgPSBsaWdodDsKCQl0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgoJCXRoaXMuY29sb3IgPSBjb2xvcjsKCgkJdmFyIGdlb21ldHJ5ID0gbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCBzcGhlcmVTaXplLCA0LCAyICk7CgkJdmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7CgoJCU1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CgoJCXRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZDsKCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCgkJdGhpcy51cGRhdGUoKTsKCgoJCS8qCgkJdmFyIGRpc3RhbmNlR2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSggMSwgMiApOwoJCXZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTsKCgkJdGhpcy5saWdodFNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBidWxiR2VvbWV0cnksIGJ1bGJNYXRlcmlhbCApOwoJCXRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7CgoJCXZhciBkID0gbGlnaHQuZGlzdGFuY2U7CgoJCWlmICggZCA9PT0gMC4wICkgewoKCQkJdGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTsKCgkJfSBlbHNlIHsKCgkJCXRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTsKCgkJfQoKCQl0aGlzLmFkZCggdGhpcy5saWdodERpc3RhbmNlICk7CgkJKi8KCgl9CgoJUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApOwoJUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludExpZ2h0SGVscGVyOwoKCVBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CgoJCXRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpOwoJCXRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwoKCX07CgoJUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgewoKCQlpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHsKCgkJCXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7CgoJCX0gZWxzZSB7CgoJCQl0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKCgkJfQoKCQkvKgoJCXZhciBkID0gdGhpcy5saWdodC5kaXN0YW5jZTsKCgkJaWYgKCBkID09PSAwLjAgKSB7CgoJCQl0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlOwoKCQl9IGVsc2UgewoKCQkJdGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlOwoJCQl0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7CgoJCX0KCQkqLwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqLwoKCWZ1bmN0aW9uIFJlY3RBcmVhTGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLmxpZ2h0ID0gbGlnaHQ7CgkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKCQl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOwoJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKCQl0aGlzLmNvbG9yID0gY29sb3I7CgoJCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTsKCgkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggNSAqIDMgKSwgMyApICk7CgoJCXRoaXMubGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCQl0aGlzLmFkZCggdGhpcy5saW5lICk7CgoKCQl0aGlzLnVwZGF0ZSgpOwoKCX0KCglSZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApOwoJUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWN0QXJlYUxpZ2h0SGVscGVyOwoKCVJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CgoJCXRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7CgkJdGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTsKCgl9OwoKCVJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCgkJLy8gY2FsY3VsYXRlIG5ldyBkaW1lbnNpb25zIG9mIHRoZSBoZWxwZXIKCgkJdmFyIGh4ID0gdGhpcy5saWdodC53aWR0aCAqIDAuNTsKCQl2YXIgaHkgPSB0aGlzLmxpZ2h0LmhlaWdodCAqIDAuNTsKCgkJdmFyIHBvc2l0aW9uID0gdGhpcy5saW5lLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CgkJdmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7CgoJCS8vIHVwZGF0ZSB2ZXJ0aWNlcwoKCQlhcnJheVsgMCBdID0gaHg7IGFycmF5WyAxIF0gPSAtIGh5OyBhcnJheVsgMiBdID0gMDsKCQlhcnJheVsgMyBdID0gaHg7IGFycmF5WyA0IF0gPSBoeTsgYXJyYXlbIDUgXSA9IDA7CgkJYXJyYXlbIDYgXSA9IC0gaHg7IGFycmF5WyA3IF0gPSBoeTsgYXJyYXlbIDggXSA9IDA7CgkJYXJyYXlbIDkgXSA9IC0gaHg7IGFycmF5WyAxMCBdID0gLSBoeTsgYXJyYXlbIDExIF0gPSAwOwoJCWFycmF5WyAxMiBdID0gaHg7IGFycmF5WyAxMyBdID0gLSBoeTsgYXJyYXlbIDE0IF0gPSAwOwoKCQlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCWlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgewoKCQkJdGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApOwoKCQl9IGVsc2UgewoKCQkJdGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKCgkJfQoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CgkgKi8KCglmdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplLCBjb2xvciApIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLmxpZ2h0ID0gbGlnaHQ7CgkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKCQl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOwoJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKCQl0aGlzLmNvbG9yID0gY29sb3I7CgoJCXZhciBnZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHNpemUgKTsKCQlnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7CgoJCXRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTsKCQlpZiAoIHRoaXMuY29sb3IgPT09IHVuZGVmaW5lZCApIHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzOwoKCQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTsKCQl2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb24uY291bnQgKiAzICk7CgoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKCgkJdGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7CgoJCXRoaXMudXBkYXRlKCk7CgoJfQoKCUhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKCUhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIZW1pc3BoZXJlTGlnaHRIZWxwZXI7CgoJSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgewoKCQl0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpOwoJCXRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7CgoJfTsKCglIZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CgoJCXZhciBjb2xvcjEgPSBuZXcgQ29sb3IoKTsKCQl2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7CgoJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CgoJCQl2YXIgbWVzaCA9IHRoaXMuY2hpbGRyZW5bIDAgXTsKCgkJCWlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7CgoJCQl9IGVsc2UgewoKCQkJCXZhciBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApOwoKCQkJCWNvbG9yMS5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7CgkJCQljb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJCXZhciBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gY29sb3IxIDogY29sb3IyOwoKCQkJCQljb2xvcnMuc2V0WFlaKCBpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7CgoJCQkJfQoKCQkJCWNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQl9CgoJCQltZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7CgoJCX07CgoJfSgpOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqLwoKCWZ1bmN0aW9uIEdyaWRIZWxwZXIoIHNpemUsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7CgoJCXNpemUgPSBzaXplIHx8IDEwOwoJCWRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMDsKCQljb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTsKCQljb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTsKCgkJdmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7CgkJdmFyIHN0ZXAgPSBzaXplIC8gZGl2aXNpb25zOwoJCXZhciBoYWxmU2l6ZSA9IHNpemUgLyAyOwoKCQl2YXIgdmVydGljZXMgPSBbXSwgY29sb3JzID0gW107CgoJCWZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkgewoKCQkJdmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTsKCQkJdmVydGljZXMucHVzaCggaywgMCwgLSBoYWxmU2l6ZSwgaywgMCwgaGFsZlNpemUgKTsKCgkJCXZhciBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjsKCgkJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CgkJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CgkJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CgkJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CgoJCX0KCgkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CgoJCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7CgoJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCgl9CgoJR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CglHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdyaWRIZWxwZXI7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44NwoJICogQGF1dGhvciBIZWN0YXRlIC8gaHR0cDovL3d3dy5naXRodWIuY29tL0hlY3RhdGUKCSAqLwoKCWZ1bmN0aW9uIFBvbGFyR3JpZEhlbHBlciggcmFkaXVzLCByYWRpYWxzLCBjaXJjbGVzLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkgewoKCQlyYWRpdXMgPSByYWRpdXMgfHwgMTA7CgkJcmFkaWFscyA9IHJhZGlhbHMgfHwgMTY7CgkJY2lyY2xlcyA9IGNpcmNsZXMgfHwgODsKCQlkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7CgkJY29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7CgkJY29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7CgoJCXZhciB2ZXJ0aWNlcyA9IFtdOwoJCXZhciBjb2xvcnMgPSBbXTsKCgkJdmFyIHgsIHo7CgkJdmFyIHYsIGksIGosIHIsIGNvbG9yOwoKCQkvLyBjcmVhdGUgdGhlIHJhZGlhbHMKCgkJZm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHsKCgkJCXYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7CgoJCQl4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1czsKCQkJeiA9IE1hdGguY29zKCB2ICkgKiByYWRpdXM7CgoJCQl2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7CgkJCXZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTsKCgkJCWNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyOwoKCQkJY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCQkJY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCgkJfQoKCQkvLyBjcmVhdGUgdGhlIGNpcmNsZXMKCgkJZm9yICggaSA9IDA7IGkgPD0gY2lyY2xlczsgaSArKyApIHsKCgkJCWNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyOwoKCQkJciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTsKCgkJCWZvciAoIGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkgewoKCQkJCS8vIGZpcnN0IHZlcnRleAoKCQkJCXYgPSAoIGogLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTsKCgkJCQl4ID0gTWF0aC5zaW4oIHYgKSAqIHI7CgkJCQl6ID0gTWF0aC5jb3MoIHYgKSAqIHI7CgoJCQkJdmVydGljZXMucHVzaCggeCwgMCwgeiApOwoJCQkJY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCgkJCQkvLyBzZWNvbmQgdmVydGV4CgoJCQkJdiA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7CgoJCQkJeCA9IE1hdGguc2luKCB2ICkgKiByOwoJCQkJeiA9IE1hdGguY29zKCB2ICkgKiByOwoKCQkJCXZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTsKCQkJCWNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7CgoJCQl9CgoJCX0KCgkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CgoJCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7CgoJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCgl9CgoJUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKCVBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2xhckdyaWRIZWxwZXI7CgoJLyoqCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKi8KCglmdW5jdGlvbiBGYWNlTm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHsKCgkJLy8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeQoKCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKCgkJdGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQgKSA/IHNpemUgOiAxOwoKCQl2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDsKCgkJdmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTsKCgkJLy8KCgkJdmFyIG5Ob3JtYWxzID0gMDsKCgkJdmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CgoJCWlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCgkJCW5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuZmFjZXMubGVuZ3RoOwoKCQl9IGVsc2UgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7CgoJCX0KCgkJLy8KCgkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgoJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApOwoKCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApOwoKCQlMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7CgoJCS8vCgoJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoJCXRoaXMudXBkYXRlKCk7CgoJfQoKCUZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKCUZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZhY2VOb3JtYWxzSGVscGVyOwoKCUZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHsKCgkJdmFyIHYxID0gbmV3IFZlY3RvcjMoKTsKCQl2YXIgdjIgPSBuZXcgVmVjdG9yMygpOwoJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpOwoKCQlyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkgewoKCQkJdGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCgkJCW5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7CgoJCQl2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDsKCgkJCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCgkJCS8vCgoJCQl2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKCgkJCXZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzOwoKCQkJdmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7CgoJCQl2YXIgaWR4ID0gMDsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgoJCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOwoKCQkJCXZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDsKCgkJCQl2MS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKQoJCQkJCS5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApCgkJCQkJLmFkZCggdmVydGljZXNbIGZhY2UuYyBdICkKCQkJCQkuZGl2aWRlU2NhbGFyKCAzICkKCQkJCQkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOwoKCQkJCXYyLmNvcHkoIG5vcm1hbCApLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTsKCgkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApOwoKCQkJCWlkeCA9IGlkeCArIDE7CgoJCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTsKCgkJCQlpZHggPSBpZHggKyAxOwoKCQkJfQoKCQkJcG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlOwoKCQl9OwoKCX0oKSApOwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKCSAqLwoKCWZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplLCBjb2xvciApIHsKCgkJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKCQl0aGlzLmxpZ2h0ID0gbGlnaHQ7CgkJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKCQl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOwoJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKCQl0aGlzLmNvbG9yID0gY29sb3I7CgoJCWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7CgoJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsKCQkJLSBzaXplLCBzaXplLCAwLAoJCQlzaXplLCBzaXplLCAwLAoJCQlzaXplLCAtIHNpemUsIDAsCgkJCS0gc2l6ZSwgLSBzaXplLCAwLAoJCQktIHNpemUsIHNpemUsIDAKCQldLCAzICkgKTsKCgkJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApOwoKCQl0aGlzLmxpZ2h0UGxhbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7CgkJdGhpcy5hZGQoIHRoaXMubGlnaHRQbGFuZSApOwoKCQlnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTsKCgkJdGhpcy50YXJnZXRMaW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoJCXRoaXMuYWRkKCB0aGlzLnRhcmdldExpbmUgKTsKCgkJdGhpcy51cGRhdGUoKTsKCgl9CgoJRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKCURpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjsKCglEaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgewoKCQl0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpOwoJCXRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7CgkJdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTsKCQl0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwoKCX07CgoJRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgewoKCQl2YXIgdjEgPSBuZXcgVmVjdG9yMygpOwoJCXZhciB2MiA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIHYzID0gbmV3IFZlY3RvcjMoKTsKCgkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKCgkJCXYxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApOwoJCQl2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CgkJCXYzLnN1YlZlY3RvcnMoIHYyLCB2MSApOwoKCQkJdGhpcy5saWdodFBsYW5lLmxvb2tBdCggdjMgKTsKCgkJCWlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTsKCQkJCXRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTsKCgkJCX0gZWxzZSB7CgoJCQkJdGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKCQkJCXRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7CgoJCQl9CgoJCQl0aGlzLnRhcmdldExpbmUubG9va0F0KCB2MyApOwoJCQl0aGlzLnRhcmdldExpbmUuc2NhbGUueiA9IHYzLmxlbmd0aCgpOwoKCQl9OwoKCX0oKTsKCgkvKioKCSAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCgkgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwoJICoKCSAqCS0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYQoJICoJLSBzdWl0YWJsZSBmb3IgZmFzdCB1cGRhdGVzCgkgKiAJLSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZQoJICoJCWh0dHA6Ly9ldmFudy5naXRodWIuY29tL2xpZ2h0Z2wuanMvdGVzdHMvc2hhZG93bWFwLmh0bWwKCSAqLwoKCWZ1bmN0aW9uIENhbWVyYUhlbHBlciggY2FtZXJhICkgewoKCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IEZhY2VDb2xvcnMgfSApOwoKCQl2YXIgdmVydGljZXMgPSBbXTsKCQl2YXIgY29sb3JzID0gW107CgoJCXZhciBwb2ludE1hcCA9IHt9OwoKCQkvLyBjb2xvcnMKCgkJdmFyIGNvbG9yRnJ1c3R1bSA9IG5ldyBDb2xvciggMHhmZmFhMDAgKTsKCQl2YXIgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApOwoJCXZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFmZiApOwoJCXZhciBjb2xvclRhcmdldCA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsKCQl2YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTsKCgkJLy8gbmVhcgoKCQlhZGRMaW5lKCAnbjEnLCAnbjInLCBjb2xvckZydXN0dW0gKTsKCQlhZGRMaW5lKCAnbjInLCAnbjQnLCBjb2xvckZydXN0dW0gKTsKCQlhZGRMaW5lKCAnbjQnLCAnbjMnLCBjb2xvckZydXN0dW0gKTsKCQlhZGRMaW5lKCAnbjMnLCAnbjEnLCBjb2xvckZydXN0dW0gKTsKCgkJLy8gZmFyCgoJCWFkZExpbmUoICdmMScsICdmMicsIGNvbG9yRnJ1c3R1bSApOwoJCWFkZExpbmUoICdmMicsICdmNCcsIGNvbG9yRnJ1c3R1bSApOwoJCWFkZExpbmUoICdmNCcsICdmMycsIGNvbG9yRnJ1c3R1bSApOwoJCWFkZExpbmUoICdmMycsICdmMScsIGNvbG9yRnJ1c3R1bSApOwoKCQkvLyBzaWRlcwoKCQlhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTsKCQlhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTsKCQlhZGRMaW5lKCAnbjMnLCAnZjMnLCBjb2xvckZydXN0dW0gKTsKCQlhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTsKCgkJLy8gY29uZQoKCQlhZGRMaW5lKCAncCcsICduMScsIGNvbG9yQ29uZSApOwoJCWFkZExpbmUoICdwJywgJ24yJywgY29sb3JDb25lICk7CgkJYWRkTGluZSggJ3AnLCAnbjMnLCBjb2xvckNvbmUgKTsKCQlhZGRMaW5lKCAncCcsICduNCcsIGNvbG9yQ29uZSApOwoKCQkvLyB1cAoKCQlhZGRMaW5lKCAndTEnLCAndTInLCBjb2xvclVwICk7CgkJYWRkTGluZSggJ3UyJywgJ3UzJywgY29sb3JVcCApOwoJCWFkZExpbmUoICd1MycsICd1MScsIGNvbG9yVXAgKTsKCgkJLy8gdGFyZ2V0CgoJCWFkZExpbmUoICdjJywgJ3QnLCBjb2xvclRhcmdldCApOwoJCWFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7CgoJCS8vIGNyb3NzCgoJCWFkZExpbmUoICdjbjEnLCAnY24yJywgY29sb3JDcm9zcyApOwoJCWFkZExpbmUoICdjbjMnLCAnY240JywgY29sb3JDcm9zcyApOwoKCQlhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTsKCQlhZGRMaW5lKCAnY2YzJywgJ2NmNCcsIGNvbG9yQ3Jvc3MgKTsKCgkJZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7CgoJCQlhZGRQb2ludCggYSwgY29sb3IgKTsKCQkJYWRkUG9pbnQoIGIsIGNvbG9yICk7CgoJCX0KCgkJZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHsKCgkJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKCQkJY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCgkJCWlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHsKCgkJCQlwb2ludE1hcFsgaWQgXSA9IFtdOwoKCQkJfQoKCQkJcG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7CgoJCX0KCgkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CgoJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCgkJdGhpcy5jYW1lcmEgPSBjYW1lcmE7CgkJaWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKCQl0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDsKCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCgkJdGhpcy5wb2ludE1hcCA9IHBvaW50TWFwOwoKCQl0aGlzLnVwZGF0ZSgpOwoKCX0KCglDYW1lcmFIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwoJQ2FtZXJhSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbWVyYUhlbHBlcjsKCglDYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIGdlb21ldHJ5LCBwb2ludE1hcDsKCgkJdmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7CgkJdmFyIGNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKCgkJZnVuY3Rpb24gc2V0UG9pbnQoIHBvaW50LCB4LCB5LCB6ICkgewoKCQkJdmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7CgoJCQl2YXIgcG9pbnRzID0gcG9pbnRNYXBbIHBvaW50IF07CgoJCQlpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCQlwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7CgoJCQkJfQoKCQkJfQoKCQl9CgoJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CgoJCQlnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CgkJCXBvaW50TWFwID0gdGhpcy5wb2ludE1hcDsKCgkJCXZhciB3ID0gMSwgaCA9IDE7CgoJCQkvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4CgkJCS8vIHdvcmxkIG1hdHJpeCBtdXN0IGJlIGlkZW50aXR5CgoJCQljYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7CgoJCQkvLyBjZW50ZXIgLyB0YXJnZXQKCgkJCXNldFBvaW50KCAnYycsIDAsIDAsIC0gMSApOwoJCQlzZXRQb2ludCggJ3QnLCAwLCAwLCAxICk7CgoJCQkvLyBuZWFyCgoJCQlzZXRQb2ludCggJ24xJywgLSB3LCAtIGgsIC0gMSApOwoJCQlzZXRQb2ludCggJ24yJywgdywgLSBoLCAtIDEgKTsKCQkJc2V0UG9pbnQoICduMycsIC0gdywgaCwgLSAxICk7CgkJCXNldFBvaW50KCAnbjQnLCB3LCBoLCAtIDEgKTsKCgkJCS8vIGZhcgoKCQkJc2V0UG9pbnQoICdmMScsIC0gdywgLSBoLCAxICk7CgkJCXNldFBvaW50KCAnZjInLCB3LCAtIGgsIDEgKTsKCQkJc2V0UG9pbnQoICdmMycsIC0gdywgaCwgMSApOwoJCQlzZXRQb2ludCggJ2Y0JywgdywgaCwgMSApOwoKCQkJLy8gdXAKCgkJCXNldFBvaW50KCAndTEnLCB3ICogMC43LCBoICogMS4xLCAtIDEgKTsKCQkJc2V0UG9pbnQoICd1MicsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7CgkJCXNldFBvaW50KCAndTMnLCAwLCBoICogMiwgLSAxICk7CgoJCQkvLyBjcm9zcwoKCQkJc2V0UG9pbnQoICdjZjEnLCAtIHcsIDAsIDEgKTsKCQkJc2V0UG9pbnQoICdjZjInLCB3LCAwLCAxICk7CgkJCXNldFBvaW50KCAnY2YzJywgMCwgLSBoLCAxICk7CgkJCXNldFBvaW50KCAnY2Y0JywgMCwgaCwgMSApOwoKCQkJc2V0UG9pbnQoICdjbjEnLCAtIHcsIDAsIC0gMSApOwoJCQlzZXRQb2ludCggJ2NuMicsIHcsIDAsIC0gMSApOwoJCQlzZXRQb2ludCggJ2NuMycsIDAsIC0gaCwgLSAxICk7CgkJCXNldFBvaW50KCAnY240JywgMCwgaCwgLSAxICk7CgoJCQlnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCX07CgoJfSgpOwoKCS8qKgoJICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KCSAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODcKCSAqLwoKCWZ1bmN0aW9uIEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHsKCgkJdGhpcy5vYmplY3QgPSBvYmplY3Q7CgoJCWlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7CgoJCXZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApOwoJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICogMyApOwoKCQl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCQlnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7CgkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApOwoKCQlMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7CgoJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKCQl0aGlzLnVwZGF0ZSgpOwoKCX0KCglCb3hIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwoJQm94SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEhlbHBlcjsKCglCb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkgewoKCQl2YXIgYm94ID0gbmV3IEJveDMoKTsKCgkJcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkgewoKCQkJaWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4nICk7CgoJCQl9CgoJCQlpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJYm94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7CgoJCQl9CgoJCQlpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47CgoJCQl2YXIgbWluID0gYm94Lm1pbjsKCQkJdmFyIG1heCA9IGJveC5tYXg7CgoJCQkvKgoJCQkgIDVfX19fNAoJCQkxL19fXzAvfAoJCQl8IDZfX3xfNwoJCQkyL19fXzMvCgoJCQkwOiBtYXgueCwgbWF4LnksIG1heC56CgkJCTE6IG1pbi54LCBtYXgueSwgbWF4LnoKCQkJMjogbWluLngsIG1pbi55LCBtYXguegoJCQkzOiBtYXgueCwgbWluLnksIG1heC56CgkJCTQ6IG1heC54LCBtYXgueSwgbWluLnoKCQkJNTogbWluLngsIG1heC55LCBtaW4uegoJCQk2OiBtaW4ueCwgbWluLnksIG1pbi56CgkJCTc6IG1heC54LCBtaW4ueSwgbWluLnoKCQkJKi8KCgkJCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCQkJdmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7CgoJCQlhcnJheVsgMCBdID0gbWF4Lng7IGFycmF5WyAxIF0gPSBtYXgueTsgYXJyYXlbIDIgXSA9IG1heC56OwoJCQlhcnJheVsgMyBdID0gbWluLng7IGFycmF5WyA0IF0gPSBtYXgueTsgYXJyYXlbIDUgXSA9IG1heC56OwoJCQlhcnJheVsgNiBdID0gbWluLng7IGFycmF5WyA3IF0gPSBtaW4ueTsgYXJyYXlbIDggXSA9IG1heC56OwoJCQlhcnJheVsgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7CgkJCWFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7CgkJCWFycmF5WyAxNSBdID0gbWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7CgkJCWFycmF5WyAxOCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7CgkJCWFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7CgoJCQlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CgoJCQl0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCQl9OwoKCX0gKSgpOwoKCUJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkgewoKCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKCQl0aGlzLnVwZGF0ZSgpOwoKCQlyZXR1cm4gdGhpczsKCgl9OwoKCS8qKgoJICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CgkgKi8KCglmdW5jdGlvbiBCb3gzSGVscGVyKCBib3gsIGhleCApIHsKCgkJdGhpcy50eXBlID0gJ0JveDNIZWxwZXInOwoKCQl0aGlzLmJveCA9IGJveDsKCgkJdmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7CgoJCXZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApOwoKCQl2YXIgcG9zaXRpb25zID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxIF07CgoJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoKCQlnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7CgoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7CgoJCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTsKCgkJdGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKCgl9CgoJQm94M0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CglCb3gzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveDNIZWxwZXI7CgoJQm94M0hlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoIGZvcmNlICkgewoKCQl2YXIgYm94ID0gdGhpcy5ib3g7CgoJCWlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjsKCgkJYm94LmdldENlbnRlciggdGhpcy5wb3NpdGlvbiApOwoKCQlib3guZ2V0U2l6ZSggdGhpcy5zY2FsZSApOwoKCQl0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKCgkJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICovCgoJZnVuY3Rpb24gUGxhbmVIZWxwZXIoIHBsYW5lLCBzaXplLCBoZXggKSB7CgoJCXRoaXMudHlwZSA9ICdQbGFuZUhlbHBlcic7CgoJCXRoaXMucGxhbmUgPSBwbGFuZTsKCgkJdGhpcy5zaXplID0gKCBzaXplID09PSB1bmRlZmluZWQgKSA/IDEgOiBzaXplOwoKCQl2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDsKCgkJdmFyIHBvc2l0aW9ucyA9IFsgMSwgLSAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAgXTsKCgkJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTsKCQlnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKCgkJTGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTsKCgkJLy8KCgkJdmFyIHBvc2l0aW9uczIgPSBbIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEgXTsKCgkJdmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoJCWdlb21ldHJ5Mi5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMyLCAzICkgKTsKCQlnZW9tZXRyeTIuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CgoJCXRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnkyLCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBvcGFjaXR5OiAwLjIsIHRyYW5zcGFyZW50OiB0cnVlLCBkZXB0aFdyaXRlOiBmYWxzZSB9ICkgKSApOwoKCX0KCglQbGFuZUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApOwoJUGxhbmVIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVIZWxwZXI7CgoJUGxhbmVIZWxwZXIucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24gKCBmb3JjZSApIHsKCgkJdmFyIHNjYWxlID0gLSB0aGlzLnBsYW5lLmNvbnN0YW50OwoKCQlpZiAoIE1hdGguYWJzKCBzY2FsZSApIDwgMWUtOCApIHNjYWxlID0gMWUtODsgLy8gc2lnbiBkb2VzIG5vdCBtYXR0ZXIKCgkJdGhpcy5zY2FsZS5zZXQoIDAuNSAqIHRoaXMuc2l6ZSwgMC41ICogdGhpcy5zaXplLCBzY2FsZSApOwoKCQl0aGlzLmxvb2tBdCggdGhpcy5wbGFuZS5ub3JtYWwgKTsKCgkJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQoJICogQGF1dGhvciB6ejg1IC8gaHR0cDovL2dpdGh1Yi5jb20veno4NQoJICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwoJICoKCSAqIENyZWF0ZXMgYW4gYXJyb3cgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnMKCSAqCgkgKiBQYXJhbWV0ZXJzOgoJICogIGRpciAtIFZlY3RvcjMKCSAqICBvcmlnaW4gLSBWZWN0b3IzCgkgKiAgbGVuZ3RoIC0gTnVtYmVyCgkgKiAgY29sb3IgLSBjb2xvciBpbiBoZXggdmFsdWUKCSAqICBoZWFkTGVuZ3RoIC0gTnVtYmVyCgkgKiAgaGVhZFdpZHRoIC0gTnVtYmVyCgkgKi8KCgl2YXIgbGluZUdlb21ldHJ5OwoJdmFyIGNvbmVHZW9tZXRyeTsKCglmdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHsKCgkJLy8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAoKCQlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgoJCWlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7CgkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7CgkJaWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoOwoJCWlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoOwoKCQlpZiAoIGxpbmVHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkgewoKCQkJbGluZUdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgkJCWxpbmVHZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDEsIDAgXSwgMyApICk7CgoJCQljb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7CgkJCWNvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7CgoJCX0KCgkJdGhpcy5wb3NpdGlvbi5jb3B5KCBvcmlnaW4gKTsKCgkJdGhpcy5saW5lID0gbmV3IExpbmUoIGxpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTsKCQl0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoJCXRoaXMuYWRkKCB0aGlzLmxpbmUgKTsKCgkJdGhpcy5jb25lID0gbmV3IE1lc2goIGNvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTsKCQl0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoJCXRoaXMuYWRkKCB0aGlzLmNvbmUgKTsKCgkJdGhpcy5zZXREaXJlY3Rpb24oIGRpciApOwoJCXRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApOwoKCX0KCglBcnJvd0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKCUFycm93SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFycm93SGVscGVyOwoKCUFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHsKCgkJdmFyIGF4aXMgPSBuZXcgVmVjdG9yMygpOwoJCXZhciByYWRpYW5zOwoKCQlyZXR1cm4gZnVuY3Rpb24gc2V0RGlyZWN0aW9uKCBkaXIgKSB7CgoJCQkvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCgoJCQlpZiAoIGRpci55ID4gMC45OTk5OSApIHsKCgkJCQl0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7CgoJCQl9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHsKCgkJCQl0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7CgoJCQl9IGVsc2UgewoKCQkJCWF4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpOwoKCQkJCXJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7CgoJCQkJdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIHJhZGlhbnMgKTsKCgkJCX0KCgkJfTsKCgl9KCkgKTsKCglBcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0TGVuZ3RoID0gZnVuY3Rpb24gKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHsKCgkJaWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoOwoJCWlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoOwoKCQl0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMCwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7CgkJdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpOwoKCQl0aGlzLmNvbmUuc2NhbGUuc2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApOwoJCXRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoOwoJCXRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTsKCgl9OwoKCUFycm93SGVscGVyLnByb3RvdHlwZS5zZXRDb2xvciA9IGZ1bmN0aW9uICggY29sb3IgKSB7CgoJCXRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApOwoJCXRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApOwoKCX07CgoJLyoqCgkgKiBAYXV0aG9yIHNyb3VjaGVyYXkgLyBodHRwOi8vc3JvdWNoZXJheS5vcmcvCgkgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwoJICovCgoJZnVuY3Rpb24gQXhlc0hlbHBlciggc2l6ZSApIHsKCgkJc2l6ZSA9IHNpemUgfHwgMTsKCgkJdmFyIHZlcnRpY2VzID0gWwoJCQkwLCAwLCAwLAlzaXplLCAwLCAwLAoJCQkwLCAwLCAwLAkwLCBzaXplLCAwLAoJCQkwLCAwLCAwLAkwLCAwLCBzaXplCgkJXTsKCgkJdmFyIGNvbG9ycyA9IFsKCQkJMSwgMCwgMCwJMSwgMC42LCAwLAoJCQkwLCAxLCAwLAkwLjYsIDEsIDAsCgkJCTAsIDAsIDEsCTAsIDAuNiwgMQoJCV07CgoJCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKCQlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApOwoKCQl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApOwoKCQlMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CgoJfQoKCUF4ZXNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwoJQXhlc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBeGVzSGVscGVyOwoKCS8qKgoJICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KCSAqLwoKCXZhciBTY2VuZVV0aWxzID0gewoKCQljcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRlcmlhbHMgKSB7CgoJCQl2YXIgZ3JvdXAgPSBuZXcgR3JvdXAoKTsKCgkJCWZvciAoIHZhciBpID0gMCwgbCA9IG1hdGVyaWFscy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKCQkJCWdyb3VwLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbHNbIGkgXSApICk7CgoJCQl9CgoJCQlyZXR1cm4gZ3JvdXA7CgoJCX0sCgoJCWRldGFjaDogZnVuY3Rpb24gKCBjaGlsZCwgcGFyZW50LCBzY2VuZSApIHsKCgkJCWNoaWxkLmFwcGx5TWF0cml4KCBwYXJlbnQubWF0cml4V29ybGQgKTsKCQkJcGFyZW50LnJlbW92ZSggY2hpbGQgKTsKCQkJc2NlbmUuYWRkKCBjaGlsZCApOwoKCQl9LAoKCQlhdHRhY2g6IGZ1bmN0aW9uICggY2hpbGQsIHNjZW5lLCBwYXJlbnQgKSB7CgoJCQljaGlsZC5hcHBseU1hdHJpeCggbmV3IE1hdHJpeDQoKS5nZXRJbnZlcnNlKCBwYXJlbnQubWF0cml4V29ybGQgKSApOwoKCQkJc2NlbmUucmVtb3ZlKCBjaGlsZCApOwoJCQlwYXJlbnQuYWRkKCBjaGlsZCApOwoKCQl9CgoJfTsKCgkvKioKCSAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCgkgKi8KCglmdW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuRmFjZTQgaGFzIGJlZW4gcmVtb3ZlZC4gQSBUSFJFRS5GYWNlMyB3aWxsIGJlIGNyZWF0ZWQgaW5zdGVhZC4nICk7CgkJcmV0dXJuIG5ldyBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApOwoKCX0KCgl2YXIgTGluZVN0cmlwID0gMDsKCgl2YXIgTGluZVBpZWNlcyA9IDE7CgoJZnVuY3Rpb24gTWVzaEZhY2VNYXRlcmlhbCggbWF0ZXJpYWxzICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTsKCQlyZXR1cm4gbWF0ZXJpYWxzOwoKCX0KCglmdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7CgoJCWlmICggbWF0ZXJpYWxzID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbHMgPSBbXTsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7CgkJbWF0ZXJpYWxzLmlzTXVsdGlNYXRlcmlhbCA9IHRydWU7CgkJbWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1hdGVyaWFsczsKCQltYXRlcmlhbHMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CgoJCQlyZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7CgoJCX07CgkJcmV0dXJuIG1hdGVyaWFsczsKCgl9CgoJZnVuY3Rpb24gUG9pbnRDbG91ZCggZ2VvbWV0cnksIG1hdGVyaWFsICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTsKCQlyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7CgoJfQoKCWZ1bmN0aW9uIFBhcnRpY2xlKCBtYXRlcmlhbCApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuJyApOwoJCXJldHVybiBuZXcgU3ByaXRlKCBtYXRlcmlhbCApOwoKCX0KCglmdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbSggZ2VvbWV0cnksIG1hdGVyaWFsICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7CgkJcmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKCX0KCglmdW5jdGlvbiBQb2ludENsb3VkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKCQlyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7CgoJfQoKCWZ1bmN0aW9uIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVCYXNpY01hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApOwoJCXJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTsKCgl9CgoJZnVuY3Rpb24gUGFydGljbGVTeXN0ZW1NYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKCQlyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7CgoJfQoKCWZ1bmN0aW9uIFZlcnRleCggeCwgeSwgeiApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuJyApOwoJCXJldHVybiBuZXcgVmVjdG9yMyggeCwgeSwgeiApOwoKCX0KCgkvLwoKCWZ1bmN0aW9uIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSgpLnNldER5bmFtaWMoIHRydWUgKSBpbnN0ZWFkLicgKTsKCQlyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkuc2V0RHluYW1pYyggdHJ1ZSApOwoKCX0KCglmdW5jdGlvbiBJbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLkludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CgkJcmV0dXJuIG5ldyBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKCgl9CgoJZnVuY3Rpb24gVWludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwoJCXJldHVybiBuZXcgVWludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOwoKCX0KCglmdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuVWludDhDbGFtcGVkQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CgkJcmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOwoKCX0KCglmdW5jdGlvbiBJbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CgkJcmV0dXJuIG5ldyBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CgoJfQoKCWZ1bmN0aW9uIFVpbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKCQlyZXR1cm4gbmV3IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CgoJfQoKCWZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLkludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKCQlyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKCgl9CgoJZnVuY3Rpb24gVWludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwoJCXJldHVybiBuZXcgVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKCgl9CgoJZnVuY3Rpb24gRmxvYXQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwoJCXJldHVybiBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CgoJfQoKCWZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKCQlyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOwoKCX0KCgkvLwoKCUN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHsKCgkJY29uc29sZS5sb2coICdUSFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkJyApOwoKCQljb25zdHJ1Y3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CgkJY29uc3RydWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdDsKCQljb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7CgoJCXJldHVybiBjb25zdHJ1Y3Q7CgoJfTsKCgkvLwoKCU9iamVjdC5hc3NpZ24oIEN1cnZlUGF0aC5wcm90b3R5cGUsIHsKCgkJY3JlYXRlUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7CgoJCQkvLyBnZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIHBhdGggcG9pbnRzIChmb3IgTGluZSBvciBQb2ludHMgb2JqZWN0cykKCgkJCXZhciBwdHMgPSB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICk7CgkJCXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTsKCgkJfSwKCgkJY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7CgoJCQkvLyBnZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIGVxdWlkaXN0YW50IHNhbXBsaW5nIGFsb25nIHRoZSBwYXRoCgoJCQl2YXIgcHRzID0gdGhpcy5nZXRTcGFjZWRQb2ludHMoIGRpdmlzaW9ucyApOwoJCQlyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7CgoJCX0sCgoJCWNyZWF0ZUdlb21ldHJ5OiBmdW5jdGlvbiAoIHBvaW50cyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApOwoKCQkJdmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCQl2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTsKCQkJCWdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApOwoKCQkJfQoKCQkJcmV0dXJuIGdlb21ldHJ5OwoKCQl9CgoJfSApOwoKCS8vCgoJT2JqZWN0LmFzc2lnbiggUGF0aC5wcm90b3R5cGUsIHsKCgkJZnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5QYXRoOiAuZnJvbVBvaW50cygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qb2ludHMoKS4nICk7CgkJCXRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7CgoJCX0KCgl9ICk7CgoJLy8KCglmdW5jdGlvbiBDbG9zZWRTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApOwoKCQlDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApOwoJCXRoaXMudHlwZSA9ICdjYXRtdWxscm9tJzsKCQl0aGlzLmNsb3NlZCA9IHRydWU7CgoJfQoKCUNsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOwoKCS8vCgoJZnVuY3Rpb24gU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKCgkJQ2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTsKCQl0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7CgoJfQoKCVNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOwoKCS8vCgoJZnVuY3Rpb24gU3BsaW5lKCBwb2ludHMgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKCgkJQ2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTsKCQl0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7CgoJfQoKCVNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOwoKCU9iamVjdC5hc3NpZ24oIFNwbGluZS5wcm90b3R5cGUsIHsKCgkJaW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgkJfSwKCQlnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggLyogb3B0aW9uYWxUYXJnZXQgKi8gKSB7CgoJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCX0sCgkJcmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIC8qIHNhbXBsaW5nQ29lZiAqLyApIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgkJfQoKCX0gKTsKCgkvLwoKCWZ1bmN0aW9uIEF4aXNIZWxwZXIoIHNpemUgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLicgKTsKCQlyZXR1cm4gbmV3IEF4ZXNIZWxwZXIoIHNpemUgKTsKCgl9CgoJZnVuY3Rpb24gQm91bmRpbmdCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApOwoJCXJldHVybiBuZXcgQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICk7CgoJfQoKCWZ1bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4nICk7CgkJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApOwoKCX0KCglHcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7CgoJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJyApOwoKCX07CgoJU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCgkJY29uc29sZS5lcnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLicgKTsKCgl9OwoKCWZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2JqZWN0LCBoZXggKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4nICk7CgkJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTsKCgl9CgoJLy8KCglPYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7CgoJCWV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4nICk7CgkJCXJldHVybiBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICk7CgoJCX0KCgl9ICk7CgoJZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5YSFJMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5GaWxlTG9hZGVyLicgKTsKCQlyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTsKCgl9CgoJZnVuY3Rpb24gQmluYXJ5VGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuQmluYXJ5VGV4dHVyZUxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkRhdGFUZXh0dXJlTG9hZGVyLicgKTsKCQlyZXR1cm4gbmV3IERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICk7CgoJfQoKCS8vCgoJT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHsKCgkJY2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTsKCQkJcmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApOwoKCQl9LAoJCWVtcHR5OiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApOwoJCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCk7CgoJCX0sCgkJaXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTsKCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7CgoJCX0sCgkJc2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTsKCQkJcmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTsKCgkJfQoJfSApOwoKCU9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7CgoJCWNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7CgkJCXJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTsKCgkJfSwKCQllbXB0eTogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTsKCQkJcmV0dXJuIHRoaXMuaXNFbXB0eSgpOwoKCQl9LAoJCWlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7CgkJCXJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApOwoKCQl9LAoJCWlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7CgkJCXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApOwoKCQl9LAoJCXNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7CgkJCXJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7CgoJCX0KCX0gKTsKCglMaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7CgkJcmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApOwoKCX07CgoJT2JqZWN0LmFzc2lnbiggX01hdGgsIHsKCgkJcmFuZG9tMTY6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuJyApOwoJCQlyZXR1cm4gTWF0aC5yYW5kb20oKTsKCgkJfSwKCgkJbmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4nICk7CgkJCXJldHVybiBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7CgoJCX0sCgoJCW5leHRQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4nICk7CgkJCXJldHVybiBfTWF0aC5jZWlsUG93ZXJPZlR3byggdmFsdWUgKTsKCgkJfQoKCX0gKTsKCglPYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwgewoKCQlmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKCQkJY29uc29sZS53YXJuKCAiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iICk7CgkJCXJldHVybiB0aGlzLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTsKCgkJfSwKCQltdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTsKCgkJfSwKCQltdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCWFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7CgoJCX0sCgkJYXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7CgoJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgkJfQoKCX0gKTsKCglPYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwgewoKCQlleHRyYWN0UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7CgkJCXJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApOwoKCQl9LAoJCWZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgoJCQljb25zb2xlLndhcm4oICJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIgKTsKCQkJcmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApOwoKCQl9LAoJCWdldFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7CgoJCQl2YXIgdjE7CgoJCQlyZXR1cm4gZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7CgoJCQkJaWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpOwoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKCQkJCXJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7CgoJCQl9OwoKCQl9KCksCgkJc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTsKCQkJcmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTsKCgkJfSwKCQltdWx0aXBseVRvQXJyYXk6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgkJfSwKCQltdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTsKCgkJfSwKCQltdWx0aXBseVZlY3RvcjQ6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTsKCgkJfSwKCQltdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCXJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKCQkJdi50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTsKCgkJfSwKCQljcm9zc1ZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7CgkJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CgoJCX0sCgkJdHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCXJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCXJvdGF0ZVk6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCXJvdGF0ZVo6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCXJvdGF0ZUJ5QXhpczogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgkJfSwKCQlhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiAoIGJ1ZmZlciAvKiwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7CgkJCXJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApOwoKCQl9LAoJCWFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCX0sCgkJbWFrZUZydXN0dW06IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApOwoKCQl9CgoJfSApOwoKCVBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4nICk7CgkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTsKCgl9OwoKCVF1YXRlcm5pb24ucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4nICk7CgkJcmV0dXJuIHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHRoaXMgKTsKCgl9OwoKCU9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHsKCgkJaXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApOwoJCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTsKCgkJfSwKCQlpc0ludGVyc2VjdGlvblBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTsKCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApOwoKCQl9LAoJCWlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTsKCQkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7CgoJCWV4dHJhY3RBbGxQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRyYWN0QWxsUG9pbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5leHRyYWN0UG9pbnRzKCkgaW5zdGVhZC4nICk7CgkJCXJldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoIGRpdmlzaW9ucyApOwoKCQl9LAoJCWV4dHJ1ZGU6IGZ1bmN0aW9uICggb3B0aW9ucyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTsKCgkJfSwKCQltYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIG5ldyBTaGFwZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHsKCgkJZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CgkJCXJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApOwoKCQl9LAoJCWRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLicgKTsKCQkJcmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApOwoKCQl9LAoJCWxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTsKCQkJcmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHsKCgkJc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4nICk7CgoJCX0sCgkJc2V0RXVsZXJGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4nICk7CgoJCX0sCgkJZ2V0UG9zaXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApOwoJCQlyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKTsKCgkJfSwKCQlnZXRTY2FsZUZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4nICk7CgkJCXJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApOwoKCQl9LAoJCWdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTsKCQkJcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbWF0cml4LCBpbmRleCApOwoKCQl9LAoJCWFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKCBtICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4nICk7CgkJCXJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbSApOwoKCQl9LAoJCWZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwoJCQlyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKCgkJfSwKCQlkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7CgkJCXJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTsKCgkJfSwKCQlsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7CgkJCXJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpOwoKCQl9CgoJfSApOwoKCU9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7CgoJCWZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwoJCQlyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKCgkJfSwKCQlsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7CgkJCXJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpOwoKCQl9CgoJfSApOwoKCS8vCgoJR2VvbWV0cnkucHJvdG90eXBlLmNvbXB1dGVUYW5nZW50cyA9IGZ1bmN0aW9uICgpIHsKCgkJY29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgl9OwoKCU9iamVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlwZSwgewoKCQlnZXRDaGlsZEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLicgKTsKCQkJcmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7CgoJCX0sCgkJcmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7CgoJCX0sCgkJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTsKCQkJcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApOwoKCQl9CgoJfSApOwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBPYmplY3QzRC5wcm90b3R5cGUsIHsKCgkJZXVsZXJPcmRlcjogewoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7CgkJCQlyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcjsKCgkJCX0sCgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7CgkJCQl0aGlzLnJvdGF0aW9uLm9yZGVyID0gdmFsdWU7CgoJCQl9CgkJfSwKCQl1c2VRdWF0ZXJuaW9uOiB7CgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTsKCgkJCX0sCgkJCXNldDogZnVuY3Rpb24gKCkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTsKCgkJCX0KCQl9CgoJfSApOwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMT0QucHJvdG90eXBlLCB7CgoJCW9iamVjdHM6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuJyApOwoJCQkJcmV0dXJuIHRoaXMubGV2ZWxzOwoKCQkJfQoJCX0KCgl9ICk7CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBTa2VsZXRvbi5wcm90b3R5cGUsICd1c2VWZXJ0ZXhUZXh0dXJlJywgewoKCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCXNldDogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdXJ2ZS5wcm90b3R5cGUsICdfX2FyY0xlbmd0aERpdmlzaW9ucycsIHsKCgkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTsKCQkJcmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zOwoKCQl9LAoJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApOwoJCQl0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHZhbHVlOwoKCQl9CgoJfSApOwoKCS8vCgoJUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7CgoJCWNvbnNvbGUud2FybiggIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gIiArCgkJCQkiVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIiApOwoKCQlpZiAoIGZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgdGhpcy5maWxtR2F1Z2UgPSBmaWxtR2F1Z2U7CgkJdGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTsKCgl9OwoKCS8vCgoJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwgewoJCW9ubHlTaGFkb3c6IHsKCQkJc2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQkJfQoJCX0sCgkJc2hhZG93Q2FtZXJhRm92OiB7CgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTsKCQkJCXRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTsKCgkJCX0KCQl9LAoJCXNoYWRvd0NhbWVyYUxlZnQ6IHsKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4nICk7CgkJCQl0aGlzLnNoYWRvdy5jYW1lcmEubGVmdCA9IHZhbHVlOwoKCQkJfQoJCX0sCgkJc2hhZG93Q2FtZXJhUmlnaHQ6IHsKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LicgKTsKCQkJCXRoaXMuc2hhZG93LmNhbWVyYS5yaWdodCA9IHZhbHVlOwoKCQkJfQoJCX0sCgkJc2hhZG93Q2FtZXJhVG9wOiB7CgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTsKCQkJCXRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTsKCgkJCX0KCQl9LAoJCXNoYWRvd0NhbWVyYUJvdHRvbTogewoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4nICk7CgkJCQl0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tID0gdmFsdWU7CgoJCQl9CgkJfSwKCQlzaGFkb3dDYW1lcmFOZWFyOiB7CgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuJyApOwoJCQkJdGhpcy5zaGFkb3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTsKCgkJCX0KCQl9LAoJCXNoYWRvd0NhbWVyYUZhcjogewoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7CgkJCQl0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7CgoJCQl9CgkJfSwKCQlzaGFkb3dDYW1lcmFWaXNpYmxlOiB7CgkJCXNldDogZnVuY3Rpb24gKCkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuJyApOwoKCQkJfQoJCX0sCgkJc2hhZG93QmlhczogewoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuJyApOwoJCQkJdGhpcy5zaGFkb3cuYmlhcyA9IHZhbHVlOwoKCQkJfQoJCX0sCgkJc2hhZG93RGFya25lc3M6IHsKCQkJc2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTsKCgkJCX0KCQl9LAoJCXNoYWRvd01hcFdpZHRoOiB7CgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcFdpZHRoIGlzIG5vdyAuc2hhZG93Lm1hcFNpemUud2lkdGguJyApOwoJCQkJdGhpcy5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IHZhbHVlOwoKCQkJfQoJCX0sCgkJc2hhZG93TWFwSGVpZ2h0OiB7CgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLmhlaWdodC4nICk7CgkJCQl0aGlzLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHZhbHVlOwoKCQkJfQoJCX0KCX0gKTsKCgkvLwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7CgoJCWxlbmd0aDogewoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTsKCQkJCXJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDsKCgkJCX0KCQl9CgoJfSApOwoKCU9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwgewoKCQlhZGRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLicgKTsKCQkJdGhpcy5zZXRJbmRleCggaW5kZXggKTsKCgkJfSwKCQlhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkgewoKCQkJaWYgKCBpbmRleE9mZnNldCAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuJyApOwoKCQkJfQoJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTsKCQkJdGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7CgoJCX0sCgkJY2xlYXJEcmF3Q2FsbHM6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuJyApOwoJCQl0aGlzLmNsZWFyR3JvdXBzKCk7CgoJCX0sCgkJY29tcHV0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCWNvbXB1dGVPZmZzZXRzOiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwgewoKCQlkcmF3Y2FsbHM6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuZHJhd2NhbGxzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4nICk7CgkJCQlyZXR1cm4gdGhpcy5ncm91cHM7CgoJCQl9CgkJfSwKCQlvZmZzZXRzOiB7CgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApOwoJCQkJcmV0dXJuIHRoaXMuZ3JvdXBzOwoKCQkJfQoJCX0KCgl9ICk7CgoJLy8KCglPYmplY3QuZGVmaW5lUHJvcGVydGllcyggVW5pZm9ybS5wcm90b3R5cGUsIHsKCgkJZHluYW1pYzogewoJCQlzZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7CgoJCQl9CgkJfSwKCQlvblVwZGF0ZTogewoJCQl2YWx1ZTogZnVuY3Rpb24gKCkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTsKCQkJCXJldHVybiB0aGlzOwoKCQkJfQoJCX0KCgl9ICk7CgoJLy8KCglPYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7CgoJCXdyYXBBcm91bmQ6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQkJfQoJCX0sCgkJd3JhcFJHQjogewoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgkJCQlyZXR1cm4gbmV3IENvbG9yKCk7CgoJCQl9CgkJfSwKCgkJc2hhZGluZzogewoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7CgoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7CgkJCQl0aGlzLmZsYXRTaGFkaW5nID0gKCB2YWx1ZSA9PT0gRmxhdFNoYWRpbmcgKTsKCgkJCX0KCQl9CgoJfSApOwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUsIHsKCgkJbWV0YWw6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkJyApOwoKCQkJfQoJCX0KCgl9ICk7CgoJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSwgewoKCQlkZXJpdmF0aXZlczogewoJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTsKCQkJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7CgoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApOwoJCQkJdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7CgoJCQl9CgkJfQoKCX0gKTsKCgkvLwoKCU9iamVjdC5hc3NpZ24oIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7CgoJCWdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7CgkJCXJldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpOwoKCQl9LAoKCQlnZXRNYXhBbmlzb3Ryb3B5OiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7CgkJCXJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7CgoJCX0sCgoJCWdldFByZWNpc2lvbjogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4nICk7CgkJCXJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb247CgoJCX0sCgoJCXJlc2V0R0xTdGF0ZTogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4nICk7CgkJCXJldHVybiB0aGlzLnN0YXRlLnJlc2V0KCk7CgoJCX0sCgoJCXN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnT0VTX3RleHR1cmVfZmxvYXRcJyApLicgKTsKCQkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTsKCgkJfSwKCQlzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnT0VTX3RleHR1cmVfaGFsZl9mbG9hdFwnICkuJyApOwoJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7CgoJCX0sCgkJc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzOiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcJyApLicgKTsKCQkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7CgoJCX0sCgkJc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNcJyApLicgKTsKCQkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTsKCgkJfSwKCQlzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEM6IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1wnICkuJyApOwoJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTsKCgkJfSwKCQlzdXBwb3J0c0JsZW5kTWluTWF4OiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnRVhUX2JsZW5kX21pbm1heFwnICkuJyApOwoJCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7CgoJCX0sCgkJc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7CgkJCXJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlczsKCgkJfSwKCQlzdXBwb3J0c0luc3RhbmNlZEFycmF5czogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXCcgKS4nICk7CgkJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKCgkJfSwKCQllbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLicgKTsKCQkJdGhpcy5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApOwoKCQl9LAoJCWluaXRNYXRlcmlhbDogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCWFkZFByZVBsdWdpbjogZnVuY3Rpb24gKCkgewoKCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKCQl9LAoJCWFkZFBvc3RQbHVnaW46IGZ1bmN0aW9uICgpIHsKCgkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCX0sCgkJdXBkYXRlU2hhZG93TWFwOiBmdW5jdGlvbiAoKSB7CgoJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgoJCX0KCgl9ICk7CgoJT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7CgoJCXNoYWRvd01hcEVuYWJsZWQ6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ7CgoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7CgkJCQl0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7CgoJCQl9CgkJfSwKCQlzaGFkb3dNYXBUeXBlOiB7CgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiB0aGlzLnNoYWRvd01hcC50eXBlOwoKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuJyApOwoJCQkJdGhpcy5zaGFkb3dNYXAudHlwZSA9IHZhbHVlOwoKCQkJfQoJCX0sCgkJc2hhZG93TWFwQ3VsbEZhY2U6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJcmV0dXJuIHRoaXMuc2hhZG93TWFwLmN1bGxGYWNlOwoKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBpcyBub3cgLnNoYWRvd01hcC5jdWxsRmFjZS4nICk7CgkJCQl0aGlzLnNoYWRvd01hcC5jdWxsRmFjZSA9IHZhbHVlOwoKCQkJfQoJCX0KCX0gKTsKCglPYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xTaGFkb3dNYXAucHJvdG90eXBlLCB7CgoJCWN1bGxGYWNlOiB7CgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCXJldHVybiB0aGlzLnJlbmRlclJldmVyc2VTaWRlZCA/IEN1bGxGYWNlRnJvbnQgOiBDdWxsRmFjZUJhY2s7CgoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uICggY3VsbEZhY2UgKSB7CgoJCQkJdmFyIHZhbHVlID0gKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VCYWNrICk7CgkJCQljb25zb2xlLndhcm4oICJXZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGlzIGRlcHJlY2F0ZWQuIFNldCAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCB0byAiICsgdmFsdWUgKyAiLiIgKTsKCQkJCXRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID0gdmFsdWU7CgoJCQl9CgkJfQoKCX0gKTsKCgkvLwoKCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHsKCgkJd3JhcFM6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApOwoJCQkJcmV0dXJuIHRoaXMudGV4dHVyZS53cmFwUzsKCgkJCX0sCgkJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7CgkJCQl0aGlzLnRleHR1cmUud3JhcFMgPSB2YWx1ZTsKCgkJCX0KCQl9LAoJCXdyYXBUOiB7CgkJCWdldDogZnVuY3Rpb24gKCkgewoKCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTsKCQkJCXJldHVybiB0aGlzLnRleHR1cmUud3JhcFQ7CgoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApOwoJCQkJdGhpcy50ZXh0dXJlLndyYXBUID0gdmFsdWU7CgoJCQl9CgkJfSwKCQltYWdGaWx0ZXI6IHsKCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgoJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7Cgk="}},"time_used":888,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":439,"receive":449,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/videojs-ie8.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.313Z","timestamp":1785147795313,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/videojs-ie8.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:40 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 8738\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":27279,"size_decoded":9282,"mime_type":"text/javascript","magic":"JavaScript source, Unicode text, UTF-8 text, with very long lines (27236), with no line terminators","md5":"2ff9bb22f0b1789ac170247b0825488f","sha1":"f2b1471c6b72cef3df20d2b16fed14739c4831f1","sha256":"3cea9fd4486e2820f34fdeb7970fd29c4fa531e79a285bf58aaab1ecdadfa99a","sha512":"e652a92efd0bd5bae4112367190f37a90afebea175ef7dcf6379fdc407679c210bc58b0b6dc2d9f5f77cc070369842027a88c921646847c6a6557361758a9098","ssdeep":"384:ZnnOiAY468YruWC+awx/HtjQmQQGf+gii+wrFOQz2Qdk/m4qC7rnKBNMF4ZOKH9D:NAYyYSwx/He6d/PKBNMU9m+","tlshash":"09c2a78476a1b0a592e63590003f550bf239dc79f8aca8e0f195c4f17cb4d4696bff2a","first_seen":"2023-03-07T12:03:11Z","last_seen":"2026-08-11T09:27:01.583416Z","times_seen":947,"resource_available":true,"data":"IWZ1bmN0aW9uKGEsYil7InVuZGVmaW5lZCI9PXR5cGVvZiBhLkhUTUxWaWRlb0VsZW1lbnQmJihiLmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksYi5jcmVhdGVFbGVtZW50KCJhdWRpbyIpLGIuY3JlYXRlRWxlbWVudCgidHJhY2siKSksZnVuY3Rpb24oYSxiKXsidXNlIHN0cmljdCI7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoYik6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWIoKTphLnJldHVybkV4cG9ydHM9YigpfSh0aGlzLGZ1bmN0aW9uKCl7dmFyIGIsYz1BcnJheSxkPWMucHJvdG90eXBlLGU9T2JqZWN0LGY9ZS5wcm90b3R5cGUsZz1GdW5jdGlvbi5wcm90b3R5cGUsaD1TdHJpbmcsaT1oLnByb3RvdHlwZSxqPU51bWJlcixrPWoucHJvdG90eXBlLGw9ZC5zbGljZSxtPWQuc3BsaWNlLG49ZC5wdXNoLG89ZC51bnNoaWZ0LHA9ZC5jb25jYXQscT1nLmNhbGwscj1nLmFwcGx5LHM9TWF0aC5tYXgsdD1NYXRoLm1pbix1PWYudG9TdHJpbmcsdj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyx3PUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyx4PWZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gdy5jYWxsKGEpLCEwfWNhdGNoKGIpe3JldHVybiExfX0seT0iW29iamVjdCBGdW5jdGlvbl0iLHo9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIjtiPWZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXJldHVybiExO2lmKHYpcmV0dXJuIHgoYSk7dmFyIGI9dS5jYWxsKGEpO3JldHVybiBiPT09eXx8Yj09PXp9O3ZhciBBLEI9UmVnRXhwLnByb3RvdHlwZS5leGVjLEM9ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiBCLmNhbGwoYSksITB9Y2F0Y2goYil7cmV0dXJuITF9fSxEPSJbb2JqZWN0IFJlZ0V4cF0iO0E9ZnVuY3Rpb24oYSl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBhPyExOnY/QyhhKTp1LmNhbGwoYSk9PT1EfTt2YXIgRSxGPVN0cmluZy5wcm90b3R5cGUudmFsdWVPZixHPWZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gRi5jYWxsKGEpLCEwfWNhdGNoKGIpe3JldHVybiExfX0sSD0iW29iamVjdCBTdHJpbmddIjtFPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYT8hMDoib2JqZWN0IiE9dHlwZW9mIGE/ITE6dj9HKGEpOnUuY2FsbChhKT09PUh9O3ZhciBJPWUuZGVmaW5lUHJvcGVydHkmJmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXt9O2UuZGVmaW5lUHJvcGVydHkoYSwieCIse2VudW1lcmFibGU6ITEsdmFsdWU6YX0pO2Zvcih2YXIgYiBpbiBhKXJldHVybiExO3JldHVybiBhLng9PT1hfWNhdGNoKGMpe3JldHVybiExfX0oKSxKPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBiPUk/ZnVuY3Rpb24oYSxiLGMsZCl7IWQmJmIgaW4gYXx8ZS5kZWZpbmVQcm9wZXJ0eShhLGIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLHZhbHVlOmN9KX06ZnVuY3Rpb24oYSxiLGMsZCl7IWQmJmIgaW4gYXx8KGFbYl09Yyl9LGZ1bmN0aW9uKGMsZCxlKXtmb3IodmFyIGYgaW4gZClhLmNhbGwoZCxmKSYmYihjLGYsZFtmXSxlKX19KGYuaGFzT3duUHJvcGVydHkpLEs9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIG51bGw9PT1hfHwib2JqZWN0IiE9PWImJiJmdW5jdGlvbiIhPT1ifSxMPWouaXNOYU58fGZ1bmN0aW9uKGEpe3JldHVybiBhIT09YX0sTT17VG9JbnRlZ2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSthO3JldHVybiBMKGIpP2I9MDowIT09YiYmYiE9PTEvMCYmYiE9PS0oMS8wKSYmKGI9KGI+MHx8LTEpKk1hdGguZmxvb3IoTWF0aC5hYnMoYikpKSxifSxUb1ByaW1pdGl2ZTpmdW5jdGlvbihhKXt2YXIgYyxkLGU7aWYoSyhhKSlyZXR1cm4gYTtpZihkPWEudmFsdWVPZixiKGQpJiYoYz1kLmNhbGwoYSksSyhjKSkpcmV0dXJuIGM7aWYoZT1hLnRvU3RyaW5nLGIoZSkmJihjPWUuY2FsbChhKSxLKGMpKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yfSxUb09iamVjdDpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbid0IGNvbnZlcnQgIithKyIgdG8gb2JqZWN0Iik7cmV0dXJuIGUoYSl9LFRvVWludDMyOmZ1bmN0aW9uKGEpe3JldHVybiBhPj4+MH19LE49ZnVuY3Rpb24oKXt9O0ooZyx7YmluZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzO2lmKCFiKGMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgIitjKTtmb3IodmFyIGQsZj1sLmNhbGwoYXJndW1lbnRzLDEpLGc9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZCl7dmFyIGI9Yy5hcHBseSh0aGlzLHAuY2FsbChmLGwuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIGUoYik9PT1iP2I6dGhpc31yZXR1cm4gYy5hcHBseShhLHAuY2FsbChmLGwuY2FsbChhcmd1bWVudHMpKSl9LGg9cygwLGMubGVuZ3RoLWYubGVuZ3RoKSxpPVtdLGo9MDtoPmo7aisrKW4uY2FsbChpLCIkIitqKTtyZXR1cm4gZD1GdW5jdGlvbigiYmluZGVyIiwicmV0dXJuIGZ1bmN0aW9uICgiK2kuam9pbigiLCIpKyIpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0iKShnKSxjLnByb3RvdHlwZSYmKE4ucHJvdG90eXBlPWMucHJvdG90eXBlLGQucHJvdG90eXBlPW5ldyBOLE4ucHJvdG90eXBlPW51bGwpLGR9fSk7dmFyIE89cS5iaW5kKGYuaGFzT3duUHJvcGVydHkpLFA9cS5iaW5kKGYudG9TdHJpbmcpLFE9cS5iaW5kKGwpLFI9ci5iaW5kKGwpLFM9cS5iaW5kKGkuc2xpY2UpLFQ9cS5iaW5kKGkuc3BsaXQpLFU9cS5iaW5kKGkuaW5kZXhPZiksVj1xLmJpbmQobiksVz1xLmJpbmQoZi5wcm9wZXJ0eUlzRW51bWVyYWJsZSksWD1xLmJpbmQoZC5zb3J0KSxZPWMuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PVAoYSl9LFo9MSE9PVtdLnVuc2hpZnQoMCk7SihkLHt1bnNoaWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMubGVuZ3RofX0sWiksSihjLHtpc0FycmF5Oll9KTt2YXIgJD1lKCJhIiksXz0iYSIhPT0kWzBdfHwhKDAgaW4gJCksYWE9ZnVuY3Rpb24oYSl7dmFyIGI9ITAsYz0hMCxkPSExO2lmKGEpdHJ5e2EuY2FsbCgiZm9vIixmdW5jdGlvbihhLGMsZCl7Im9iamVjdCIhPXR5cGVvZiBkJiYoYj0hMSl9KSxhLmNhbGwoWzFdLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2M9InN0cmluZyI9PXR5cGVvZiB0aGlzfSwieCIpfWNhdGNoKGUpe2Q9ITB9cmV0dXJuISFhJiYhZCYmYiYmY307SihkLHtmb3JFYWNoOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9TS5Ub09iamVjdCh0aGlzKSxlPV8mJkUodGhpcyk/VCh0aGlzLCIiKTpkLGY9LTEsZz1NLlRvVWludDMyKGUubGVuZ3RoKTtpZihhcmd1bWVudHMubGVuZ3RoPjEmJihjPWFyZ3VtZW50c1sxXSksIWIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkucHJvdG90eXBlLmZvckVhY2ggY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKDsrK2Y8ZzspZiBpbiBlJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBjP2EoZVtmXSxmLGQpOmEuY2FsbChjLGVbZl0sZixkKSl9fSwhYWEoZC5mb3JFYWNoKSksSihkLHttYXA6ZnVuY3Rpb24oYSl7dmFyIGQsZT1NLlRvT2JqZWN0KHRoaXMpLGY9XyYmRSh0aGlzKT9UKHRoaXMsIiIpOmUsZz1NLlRvVWludDMyKGYubGVuZ3RoKSxoPWMoZyk7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiYoZD1hcmd1bWVudHNbMV0pLCFiKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LnByb3RvdHlwZS5tYXAgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Zm9yKHZhciBpPTA7Zz5pO2krKylpIGluIGYmJigidW5kZWZpbmVkIj09dHlwZW9mIGQ/aFtpXT1hKGZbaV0saSxlKTpoW2ldPWEuY2FsbChkLGZbaV0saSxlKSk7cmV0dXJuIGh9fSwhYWEoZC5tYXApKSxKKGQse2ZpbHRlcjpmdW5jdGlvbihhKXt2YXIgYyxkLGU9TS5Ub09iamVjdCh0aGlzKSxmPV8mJkUodGhpcyk/VCh0aGlzLCIiKTplLGc9TS5Ub1VpbnQzMihmLmxlbmd0aCksaD1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjEmJihkPWFyZ3VtZW50c1sxXSksIWIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkucHJvdG90eXBlLmZpbHRlciBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IodmFyIGk9MDtnPmk7aSsrKWkgaW4gZiYmKGM9ZltpXSwoInVuZGVmaW5lZCI9PXR5cGVvZiBkP2EoYyxpLGUpOmEuY2FsbChkLGMsaSxlKSkmJlYoaCxjKSk7cmV0dXJuIGh9fSwhYWEoZC5maWx0ZXIpKSxKKGQse2V2ZXJ5OmZ1bmN0aW9uKGEpe3ZhciBjLGQ9TS5Ub09iamVjdCh0aGlzKSxlPV8mJkUodGhpcyk/VCh0aGlzLCIiKTpkLGY9TS5Ub1VpbnQzMihlLmxlbmd0aCk7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiYoYz1hcmd1bWVudHNbMV0pLCFiKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LnByb3RvdHlwZS5ldmVyeSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IodmFyIGc9MDtmPmc7ZysrKWlmKGcgaW4gZSYmISgidW5kZWZpbmVkIj09dHlwZW9mIGM/YShlW2ddLGcsZCk6YS5jYWxsKGMsZVtnXSxnLGQpKSlyZXR1cm4hMTtyZXR1cm4hMH19LCFhYShkLmV2ZXJ5KSksSihkLHtzb21lOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9TS5Ub09iamVjdCh0aGlzKSxlPV8mJkUodGhpcyk/VCh0aGlzLCIiKTpkLGY9TS5Ub1VpbnQzMihlLmxlbmd0aCk7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiYoYz1hcmd1bWVudHNbMV0pLCFiKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LnByb3RvdHlwZS5zb21lIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO2Zvcih2YXIgZz0wO2Y+ZztnKyspaWYoZyBpbiBlJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBjP2EoZVtnXSxnLGQpOmEuY2FsbChjLGVbZ10sZyxkKSkpcmV0dXJuITA7cmV0dXJuITF9fSwhYWEoZC5zb21lKSk7dmFyIGJhPSExO2QucmVkdWNlJiYoYmE9Im9iamVjdCI9PXR5cGVvZiBkLnJlZHVjZS5jYWxsKCJlczUiLGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBkfSkpLEooZCx7cmVkdWNlOmZ1bmN0aW9uKGEpe3ZhciBjPU0uVG9PYmplY3QodGhpcyksZD1fJiZFKHRoaXMpP1QodGhpcywiIik6YyxlPU0uVG9VaW50MzIoZC5sZW5ndGgpO2lmKCFiKGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LnByb3RvdHlwZS5yZWR1Y2UgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoMD09PWUmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTt2YXIgZixnPTA7aWYoYXJndW1lbnRzLmxlbmd0aD49MilmPWFyZ3VtZW50c1sxXTtlbHNlIGZvcig7Oyl7aWYoZyBpbiBkKXtmPWRbZysrXTticmVha31pZigrK2c+PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfWZvcig7ZT5nO2crKylnIGluIGQmJihmPWEoZixkW2ddLGcsYykpO3JldHVybiBmfX0sIWJhKTt2YXIgY2E9ITE7ZC5yZWR1Y2VSaWdodCYmKGNhPSJvYmplY3QiPT10eXBlb2YgZC5yZWR1Y2VSaWdodC5jYWxsKCJlczUiLGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBkfSkpLEooZCx7cmVkdWNlUmlnaHQ6ZnVuY3Rpb24oYSl7dmFyIGM9TS5Ub09iamVjdCh0aGlzKSxkPV8mJkUodGhpcyk/VCh0aGlzLCIiKTpjLGU9TS5Ub1VpbnQzMihkLmxlbmd0aCk7aWYoIWIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKDA9PT1lJiYxPT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTt2YXIgZixnPWUtMTtpZihhcmd1bWVudHMubGVuZ3RoPj0yKWY9YXJndW1lbnRzWzFdO2Vsc2UgZm9yKDs7KXtpZihnIGluIGQpe2Y9ZFtnLS1dO2JyZWFrfWlmKC0tZzwwKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfWlmKDA+ZylyZXR1cm4gZjtkbyBnIGluIGQmJihmPWEoZixkW2ddLGcsYykpO3doaWxlKGctLSk7cmV0dXJuIGZ9fSwhY2EpO3ZhciBkYT1kLmluZGV4T2YmJi0xIT09WzAsMV0uaW5kZXhPZigxLDIpO0ooZCx7aW5kZXhPZjpmdW5jdGlvbihhKXt2YXIgYj1fJiZFKHRoaXMpP1QodGhpcywiIik6TS5Ub09iamVjdCh0aGlzKSxjPU0uVG9VaW50MzIoYi5sZW5ndGgpO2lmKDA9PT1jKXJldHVybi0xO3ZhciBkPTA7Zm9yKGFyZ3VtZW50cy5sZW5ndGg+MSYmKGQ9TS5Ub0ludGVnZXIoYXJndW1lbnRzWzFdKSksZD1kPj0wP2Q6cygwLGMrZCk7Yz5kO2QrKylpZihkIGluIGImJmJbZF09PT1hKXJldHVybiBkO3JldHVybi0xfX0sZGEpO3ZhciBlYT1kLmxhc3RJbmRleE9mJiYtMSE9PVswLDFdLmxhc3RJbmRleE9mKDAsLTMpO0ooZCx7bGFzdEluZGV4T2Y6ZnVuY3Rpb24oYSl7dmFyIGI9XyYmRSh0aGlzKT9UKHRoaXMsIiIpOk0uVG9PYmplY3QodGhpcyksYz1NLlRvVWludDMyKGIubGVuZ3RoKTtpZigwPT09YylyZXR1cm4tMTt2YXIgZD1jLTE7Zm9yKGFyZ3VtZW50cy5sZW5ndGg+MSYmKGQ9dChkLE0uVG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpKSxkPWQ+PTA/ZDpjLU1hdGguYWJzKGQpO2Q+PTA7ZC0tKWlmKGQgaW4gYiYmYT09PWJbZF0pcmV0dXJuIGQ7cmV0dXJuLTF9fSxlYSk7dmFyIGZhPWZ1bmN0aW9uKCl7dmFyIGE9WzEsMl0sYj1hLnNwbGljZSgpO3JldHVybiAyPT09YS5sZW5ndGgmJlkoYikmJjA9PT1iLmxlbmd0aH0oKTtKKGQse3NwbGljZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD9bXTptLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LCFmYSk7dmFyIGdhPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGQuc3BsaWNlLmNhbGwoYSwwLDAsMSksMT09PWEubGVuZ3RofSgpO0ooZCx7c3BsaWNlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIGM9YXJndW1lbnRzO3JldHVybiB0aGlzLmxlbmd0aD1zKE0uVG9JbnRlZ2VyKHRoaXMubGVuZ3RoKSwwKSxhcmd1bWVudHMubGVuZ3RoPjAmJiJudW1iZXIiIT10eXBlb2YgYiYmKGM9UShhcmd1bWVudHMpLGMubGVuZ3RoPDI/VihjLHRoaXMubGVuZ3RoLWEpOmNbMV09TS5Ub0ludGVnZXIoYikpLG0uYXBwbHkodGhpcyxjKX19LCFnYSk7dmFyIGhhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGMoMWU1KTtyZXR1cm4gYVs4XT0ieCIsYS5zcGxpY2UoMSwxKSw3PT09YS5pbmRleE9mKCJ4Iil9KCksaWE9ZnVuY3Rpb24oKXt2YXIgYT0yNTYsYj1bXTtyZXR1cm4gYlthXT0iYSIsYi5zcGxpY2UoYSsxLDAsImIiKSwiYSI9PT1iW2FdfSgpO0ooZCx7c3BsaWNlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9TS5Ub09iamVjdCh0aGlzKSxlPVtdLGY9TS5Ub1VpbnQzMihkLmxlbmd0aCksZz1NLlRvSW50ZWdlcihhKSxpPTA+Zz9zKGYrZywwKTp0KGcsZiksaj10KHMoTS5Ub0ludGVnZXIoYiksMCksZi1pKSxrPTA7aj5rOyljPWgoaStrKSxPKGQsYykmJihlW2tdPWRbY10pLGsrPTE7dmFyIGwsbT1RKGFyZ3VtZW50cywyKSxuPW0ubGVuZ3RoO2lmKGo+bil7Zm9yKGs9aTtmLWo+azspYz1oKGsraiksbD1oKGsrbiksTyhkLGMpP2RbbF09ZFtjXTpkZWxldGUgZFtsXSxrKz0xO2ZvcihrPWY7az5mLWorbjspZGVsZXRlIGRbay0xXSxrLT0xfWVsc2UgaWYobj5qKWZvcihrPWYtajtrPmk7KWM9aChrK2otMSksbD1oKGsrbi0xKSxPKGQsYyk/ZFtsXT1kW2NdOmRlbGV0ZSBkW2xdLGstPTE7az1pO2Zvcih2YXIgbz0wO288bS5sZW5ndGg7KytvKWRba109bVtvXSxrKz0xO3JldHVybiBkLmxlbmd0aD1mLWorbixlfX0sIWhhfHwhaWEpO3ZhciBqYSxrYT1kLmpvaW47dHJ5e2phPSIxLDIsMyIhPT1BcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKCIxMjMiLCIsIil9Y2F0Y2gobGEpe2phPSEwfWphJiZKKGQse2pvaW46ZnVuY3Rpb24oYSl7dmFyIGI9InVuZGVmaW5lZCI9PXR5cGVvZiBhPyIsIjphO3JldHVybiBrYS5jYWxsKEUodGhpcyk/VCh0aGlzLCIiKTp0aGlzLGIpfX0samEpO3ZhciBtYT0iMSwyIiE9PVsxLDJdLmpvaW4odm9pZCAwKTttYSYmSihkLHtqb2luOmZ1bmN0aW9uKGEpe3ZhciBiPSJ1bmRlZmluZWQiPT10eXBlb2YgYT8iLCI6YTtyZXR1cm4ga2EuY2FsbCh0aGlzLGIpfX0sbWEpO3ZhciBuYT1mdW5jdGlvbihhKXtmb3IodmFyIGI9TS5Ub09iamVjdCh0aGlzKSxjPU0uVG9VaW50MzIoYi5sZW5ndGgpLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KWJbYytkXT1hcmd1bWVudHNbZF0sZCs9MTtyZXR1cm4gYi5sZW5ndGg9YytkLGMrZH0sb2E9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPUFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwoYSx2b2lkIDApO3JldHVybiAxIT09Ynx8MSE9PWEubGVuZ3RofHwidW5kZWZpbmVkIiE9dHlwZW9mIGFbMF18fCFPKGEsMCl9KCk7SihkLHtwdXNoOmZ1bmN0aW9uKGEpe3JldHVybiBZKHRoaXMpP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm5hLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LG9hKTt2YXIgcGE9ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPWEucHVzaCh2b2lkIDApO3JldHVybiAxIT09Ynx8MSE9PWEubGVuZ3RofHwidW5kZWZpbmVkIiE9dHlwZW9mIGFbMF18fCFPKGEsMCl9KCk7SihkLHtwdXNoOm5hfSxwYSksSihkLHtzbGljZTpmdW5jdGlvbihhLGIpe3ZhciBjPUUodGhpcyk/VCh0aGlzLCIiKTp0aGlzO3JldHVybiBSKGMsYXJndW1lbnRzKX19LF8pO3ZhciBxYT1mdW5jdGlvbigpe3RyeXtyZXR1cm5bMSwyXS5zb3J0KG51bGwpLFsxLDJdLnNvcnQoe30pLCEwfWNhdGNoKGEpe31yZXR1cm4hMX0oKSxyYT1mdW5jdGlvbigpe3RyeXtyZXR1cm5bMSwyXS5zb3J0KC9hLyksITF9Y2F0Y2goYSl7fXJldHVybiEwfSgpLHNhPWZ1bmN0aW9uKCl7dHJ5e3JldHVyblsxLDJdLnNvcnQodm9pZCAwKSwhMH1jYXRjaChhKXt9cmV0dXJuITF9KCk7SihkLHtzb3J0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgYSlyZXR1cm4gWCh0aGlzKTtpZighYihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheS5wcm90b3R5cGUuc29ydCBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyZXR1cm4gWCh0aGlzLGEpfX0scWF8fCFzYXx8IXJhKTt2YXIgdGE9IXt0b1N0cmluZzpudWxsfS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgidG9TdHJpbmciKSx1YT1mdW5jdGlvbigpe30ucHJvcGVydHlJc0VudW1lcmFibGUoInByb3RvdHlwZSIpLHZhPSFPKCJ4IiwiMCIpLHdhPWZ1bmN0aW9uKGEpe3ZhciBiPWEuY29uc3RydWN0b3I7cmV0dXJuIGImJmIucHJvdG90eXBlPT09YX0seGE9eyR3aW5kb3c6ITAsJGNvbnNvbGU6ITAsJHBhcmVudDohMCwkc2VsZjohMCwkZnJhbWU6ITAsJGZyYW1lczohMCwkZnJhbWVFbGVtZW50OiEwLCR3ZWJraXRJbmRleGVkREI6ITAsJHdlYmtpdFN0b3JhZ2VJbmZvOiEwLCRleHRlcm5hbDohMH0seWE9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGEpcmV0dXJuITE7Zm9yKHZhciBiIGluIGEpdHJ5eyF4YVsiJCIrYl0mJk8oYSxiKSYmbnVsbCE9PWFbYl0mJiJvYmplY3QiPT10eXBlb2YgYVtiXSYmd2EoYVtiXSl9Y2F0Y2goYyl7cmV0dXJuITB9cmV0dXJuITF9KCksemE9ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBhfHwheWEpcmV0dXJuIHdhKGIpO3RyeXtyZXR1cm4gd2EoYil9Y2F0Y2goYyl7cmV0dXJuITF9fSxBYT1bInRvU3RyaW5nIiwidG9Mb2NhbGVTdHJpbmciLCJ2YWx1ZU9mIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjb25zdHJ1Y3RvciJdLEJhPUFhLmxlbmd0aCxDYT1mdW5jdGlvbihhKXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09PVAoYSl9LERhPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YSYmIm9iamVjdCI9PXR5cGVvZiBhJiYibnVtYmVyIj09dHlwZW9mIGEubGVuZ3RoJiZhLmxlbmd0aD49MCYmIVkoYSkmJmIoYS5jYWxsZWUpfSxFYT1DYShhcmd1bWVudHMpP0NhOkRhO0ooZSx7a2V5czpmdW5jdGlvbihhKXt2YXIgYz1iKGEpLGQ9RWEoYSksZT1udWxsIT09YSYmIm9iamVjdCI9PXR5cGVvZiBhLGY9ZSYmRShhKTtpZighZSYmIWMmJiFkKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgZz1bXSxpPXVhJiZjO2lmKGYmJnZhfHxkKWZvcih2YXIgaj0wO2o8YS5sZW5ndGg7KytqKVYoZyxoKGopKTtpZighZClmb3IodmFyIGsgaW4gYSlpJiYicHJvdG90eXBlIj09PWt8fCFPKGEsayl8fFYoZyxoKGspKTtpZih0YSlmb3IodmFyIGw9emEoYSksbT0wO0JhPm07bSsrKXt2YXIgbj1BYVttXTtsJiYiY29uc3RydWN0b3IiPT09bnx8IU8oYSxuKXx8VihnLG4pfXJldHVybiBnfX0pO3ZhciBGYT1lLmtleXMmJmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT1lLmtleXMoYXJndW1lbnRzKS5sZW5ndGh9KDEsMiksR2E9ZS5rZXlzJiZmdW5jdGlvbigpe3ZhciBhPWUua2V5cyhhcmd1bWVudHMpO3JldHVybiAxIT09YXJndW1lbnRzLmxlbmd0aHx8MSE9PWEubGVuZ3RofHwxIT09YVswXX0oMSksSGE9ZS5rZXlzO0ooZSx7a2V5czpmdW5jdGlvbihhKXtyZXR1cm4gSGEoRWEoYSk/UShhKTphKX19LCFGYXx8R2EpO3ZhciBJYSxKYSxLYT0wIT09bmV3IERhdGUoLTB4Yzc4MmI1YjM0MmIyNCkuZ2V0VVRDTW9udGgoKSxMYT1uZXcgRGF0ZSgtMHg1NWQzMThkNTZhNzI0KSxNYT1uZXcgRGF0ZSgxNDQ5NjYyNGU1KSxOYT0iTW9uLCAwMSBKYW4gLTQ1ODc1IDExOjU5OjU5IEdNVCIhPT1MYS50b1VUQ1N0cmluZygpLE9hPUxhLmdldFRpbWV6b25lT2Zmc2V0KCk7LTcyMD5PYT8oSWE9IlR1ZSBKYW4gMDIgLTQ1ODc1IiE9PUxhLnRvRGF0ZVN0cmluZygpLEphPSEvXlRodSBEZWMgMTAgMjAxNSBcZFxkOlxkXGQ6XGRcZCBHTVRbLVwrXVxkXGRcZFxkKD86IHwkKS8udGVzdChNYS50b1N0cmluZygpKSk6KElhPSJNb24gSmFuIDAxIC00NTg3NSIhPT1MYS50b0RhdGVTdHJpbmcoKSxKYT0hL15XZWQgRGVjIDA5IDIwMTUgXGRcZDpcZFxkOlxkXGQgR01UWy1cK11cZFxkXGRcZCg/OiB8JCkvLnRlc3QoTWEudG9TdHJpbmcoKSkpO3ZhciBQYT1xLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0RnVsbFllYXIpLFFhPXEuYmluZChEYXRlLnByb3RvdHlwZS5nZXRNb250aCksUmE9cS5iaW5kKERhdGUucHJvdG90eXBlLmdldERhdGUpLFNhPXEuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENGdWxsWWVhciksVGE9cS5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ01vbnRoKSxVYT1xLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDRGF0ZSksVmE9cS5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ0RheSksV2E9cS5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ0hvdXJzKSxYYT1xLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDTWludXRlcyksWWE9cS5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ1NlY29uZHMpLFphPXEuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENNaWxsaXNlY29uZHMpLCRhPVsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIl0sX2E9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxhYj1mdW5jdGlvbihhLGIpe3JldHVybiBSYShuZXcgRGF0ZShiLGEsMCkpfTtKKERhdGUucHJvdG90eXBlLHtnZXRGdWxsWWVhcjpmdW5jdGlvbigpe2lmKCEodGhpcyYmdGhpcyBpbnN0YW5jZW9mIERhdGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInRoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuIik7dmFyIGE9UGEodGhpcyk7cmV0dXJuIDA+YSYmUWEodGhpcyk+MTE/YSsxOmF9LGdldE1vbnRoOmZ1bmN0aW9uKCl7aWYoISh0aGlzJiZ0aGlzIGluc3RhbmNlb2YgRGF0ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4iKTt2YXIgYT1QYSh0aGlzKSxiPVFhKHRoaXMpO3JldHVybiAwPmEmJmI+MTE/MDpifSxnZXREYXRlOmZ1bmN0aW9uKCl7aWYoISh0aGlzJiZ0aGlzIGluc3RhbmNlb2YgRGF0ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4iKTt2YXIgYT1QYSh0aGlzKSxiPVFhKHRoaXMpLGM9UmEodGhpcyk7aWYoMD5hJiZiPjExKXtpZigxMj09PWIpcmV0dXJuIGM7dmFyIGQ9YWIoMCxhKzEpO3JldHVybiBkLWMrMX1yZXR1cm4gY30sZ2V0VVRDRnVsbFllYXI6ZnVuY3Rpb24oKXtpZighKHRoaXMmJnRoaXMgaW5zdGFuY2VvZiBEYXRlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LiIpO3ZhciBhPVNhKHRoaXMpO3JldHVybiAwPmEmJlRhKHRoaXMpPjExP2ErMTphfSxnZXRVVENNb250aDpmdW5jdGlvbigpe2lmKCEodGhpcyYmdGhpcyBpbnN0YW5jZW9mIERhdGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInRoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuIik7dmFyIGE9U2EodGhpcyksYj1UYSh0aGlzKTtyZXR1cm4gMD5hJiZiPjExPzA6Yn0sZ2V0VVRDRGF0ZTpmdW5jdGlvbigpe2lmKCEodGhpcyYmdGhpcyBpbnN0YW5jZW9mIERhdGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInRoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuIik7dmFyIGE9U2EodGhpcyksYj1UYSh0aGlzKSxjPVVhKHRoaXMpO2lmKDA+YSYmYj4xMSl7aWYoMTI9PT1iKXJldHVybiBjO3ZhciBkPWFiKDAsYSsxKTtyZXR1cm4gZC1jKzF9cmV0dXJuIGN9fSxLYSksSihEYXRlLnByb3RvdHlwZSx7dG9VVENTdHJpbmc6ZnVuY3Rpb24oKXtpZighKHRoaXMmJnRoaXMgaW5zdGFuY2VvZiBEYXRlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LiIpO3ZhciBhPVZhKHRoaXMpLGI9VWEodGhpcyksYz1UYSh0aGlzKSxkPVNhKHRoaXMpLGU9V2EodGhpcyksZj1YYSh0aGlzKSxnPVlhKHRoaXMpO3JldHVybiAkYVthXSsiLCAiKygxMD5iPyIwIitiOmIpKyIgIitfYVtjXSsiICIrZCsiICIrKDEwPmU/IjAiK2U6ZSkrIjoiKygxMD5mPyIwIitmOmYpKyI6IisoMTA+Zz8iMCIrZzpnKSsiIEdNVCJ9fSxLYXx8TmEpLEooRGF0ZS5wcm90b3R5cGUse3RvRGF0ZVN0cmluZzpmdW5jdGlvbigpe2lmKCEodGhpcyYmdGhpcyBpbnN0YW5jZW9mIERhdGUpKXRocm93IG5ldyBUeXBlRXJyb3IoInRoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuIik7dmFyIGE9dGhpcy5nZXREYXkoKSxiPXRoaXMuZ2V0RGF0ZSgpLGM9dGhpcy5nZXRNb250aCgpLGQ9dGhpcy5nZXRGdWxsWWVhcigpO3JldHVybiAkYVthXSsiICIrX2FbY10rIiAiKygxMD5iPyIwIitiOmIpKyIgIitkfX0sS2F8fElhKSwoS2F8fEphKSYmKERhdGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoISh0aGlzJiZ0aGlzIGluc3RhbmNlb2YgRGF0ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4iKTt2YXIgYT10aGlzLmdldERheSgpLGI9dGhpcy5nZXREYXRlKCksYz10aGlzLmdldE1vbnRoKCksZD10aGlzLmdldEZ1bGxZZWFyKCksZT10aGlzLmdldEhvdXJzKCksZj10aGlzLmdldE1pbnV0ZXMoKSxnPXRoaXMuZ2V0U2Vjb25kcygpLGg9dGhpcy5nZXRUaW1lem9uZU9mZnNldCgpLGk9TWF0aC5mbG9vcihNYXRoLmFicyhoKS82MCksaj1NYXRoLmZsb29yKE1hdGguYWJzKGgpJTYwKTtyZXR1cm4gJGFbYV0rIiAiK19hW2NdKyIgIisoMTA+Yj8iMCIrYjpiKSsiICIrZCsiICIrKDEwPmU/IjAiK2U6ZSkrIjoiKygxMD5mPyIwIitmOmYpKyI6IisoMTA+Zz8iMCIrZzpnKSsiIEdNVCIrKGg+MD8iLSI6IisiKSsoMTA+aT8iMCIraTppKSsoMTA+aj8iMCIrajpqKX0sSSYmZS5kZWZpbmVQcm9wZXJ0eShEYXRlLnByb3RvdHlwZSwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pKTt2YXIgYmI9LTYyMTk4NzU1MmU1LGNiPSItMDAwMDAxIixkYj1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmLTE9PT1uZXcgRGF0ZShiYikudG9JU09TdHJpbmcoKS5pbmRleE9mKGNiKSxlYj1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmIjE5NjktMTItMzFUMjM6NTk6NTkuOTk5WiIhPT1uZXcgRGF0ZSgtMSkudG9JU09TdHJpbmcoKTtKKERhdGUucHJvdG90eXBlLHt0b0lTT1N0cmluZzpmdW5jdGlvbigpe2lmKCFpc0Zpbml0ZSh0aGlzKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgY2FsbGVkIG9uIG5vbi1maW5pdGUgdmFsdWUuIik7dmFyIGE9U2EodGhpcyksYj1UYSh0aGlzKTthKz1NYXRoLmZsb29yKGIvMTIpLGI9KGIlMTIrMTIpJTEyO3ZhciBjPVtiKzEsVWEodGhpcyksV2EodGhpcyksWGEodGhpcyksWWEodGhpcyldO2E9KDA+YT8iLSI6YT45OTk5PyIrIjoiIikrUygiMDAwMDAiK01hdGguYWJzKGEpLGE+PTAmJjk5OTk+PWE/LTQ6LTYpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7KytkKWNbZF09UygiMDAiK2NbZF0sLTIpO3JldHVybiBhKyItIitRKGMsMCwyKS5qb2luKCItIikrIlQiK1EoYywyKS5qb2luKCI6IikrIi4iK1MoIjAwMCIrWmEodGhpcyksLTMpKyJaIn19LGRifHxlYik7dmFyIGZiPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b0pTT04mJm51bGw9PT1uZXcgRGF0ZShOYU4pLnRvSlNPTigpJiYtMSE9PW5ldyBEYXRlKGJiKS50b0pTT04oKS5pbmRleE9mKGNiKSYmRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoe3RvSVNPU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9Y2F0Y2goYSl7cmV0dXJuITF9fSgpO2ZifHwoRGF0ZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGEpe3ZhciBjPWUodGhpcyksZD1NLlRvUHJpbWl0aXZlKGMpO2lmKCJudW1iZXIiPT10eXBlb2YgZCYmIWlzRmluaXRlKGQpKXJldHVybiBudWxsO3ZhciBmPWMudG9JU09TdHJpbmc7aWYoIWIoZikpdGhyb3cgbmV3IFR5cGVFcnJvcigidG9JU09TdHJpbmcgcHJvcGVydHkgaXMgbm90IGNhbGxhYmxlIik7cmV0dXJuIGYuY2FsbChjKX0pO3ZhciBnYj0xZTE1PT09RGF0ZS5wYXJzZSgiKzAzMzY1OC0wOS0yN1QwMTo0Njo0MC4wMDBaIiksaGI9IWlzTmFOKERhdGUucGFyc2UoIjIwMTItMDQtMDRUMjQ6MDA6MDAuNTAwWiIpKXx8IWlzTmFOKERhdGUucGFyc2UoIjIwMTItMTEtMzFUMjM6NTk6NTkuMDAwWiIpKXx8IWlzTmFOKERhdGUucGFyc2UoIjIwMTItMTItMzFUMjM6NTk6NjAuMDAwWiIpKSxpYj1pc05hTihEYXRlLnBhcnNlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKSk7aWYoaWJ8fGhifHwhZ2Ipe3ZhciBqYj1NYXRoLnBvdygyLDMxKS0xLGtiPUwobmV3IERhdGUoMTk3MCwwLDEsMCwwLDAsamIrMSkuZ2V0VGltZSgpKTtEYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGMsZCxlLGYsZyxpLGope3ZhciBrLGw9YXJndW1lbnRzLmxlbmd0aDtpZih0aGlzIGluc3RhbmNlb2YgYSl7dmFyIG09aSxuPWo7aWYoa2ImJmw+PTcmJmo+amIpe3ZhciBvPU1hdGguZmxvb3Ioai9qYikqamIscD1NYXRoLmZsb29yKG8vMWUzKTttKz1wLG4tPTFlMypwfWs9MT09PWwmJmgoYyk9PT1jP25ldyBhKGIucGFyc2UoYykpOmw+PTc/bmV3IGEoYyxkLGUsZixnLG0sbik6bD49Nj9uZXcgYShjLGQsZSxmLGcsbSk6bD49NT9uZXcgYShjLGQsZSxmLGcpOmw+PTQ/bmV3IGEoYyxkLGUsZik6bD49Mz9uZXcgYShjLGQsZSk6bD49Mj9uZXcgYShjLGQpOmw+PTE/bmV3IGEoYyk6bmV3IGF9ZWxzZSBrPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBLKGspfHxKKGsse2NvbnN0cnVjdG9yOmJ9LCEwKSxrfSxjPW5ldyBSZWdFeHAoIl4oXFxkezR9fFsrLV1cXGR7Nn0pKD86LShcXGR7Mn0pKD86LShcXGR7Mn0pKD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86KFxcLlxcZHsxLH0pKT8pPyhafCg/OihbLStdKShcXGR7Mn0pOihcXGR7Mn0pKSk/KT8pPyk/JCIpLGQ9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNCwzNjVdLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iPjE/MTowO3JldHVybiBkW2JdK01hdGguZmxvb3IoKGEtMTk2OStjKS80KS1NYXRoLmZsb29yKChhLTE5MDErYykvMTAwKStNYXRoLmZsb29yKChhLTE2MDErYykvNDAwKSszNjUqKGEtMTk3MCl9LGY9ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI7aWYoa2ImJmQ+amIpe3ZhciBlPU1hdGguZmxvb3IoZC9qYikqamIsZj1NYXRoLmZsb29yKGUvMWUzKTtjKz1mLGQtPTFlMypmfXJldHVybiBqKG5ldyBhKDE5NzAsMCwxLDAsMCxjLGQpKX07Zm9yKHZhciBnIGluIGEpTyhhLGcpJiYoYltnXT1hW2ddKTtKKGIse25vdzphLm5vdyxVVEM6YS5VVEN9LCEwKSxiLnByb3RvdHlwZT1hLnByb3RvdHlwZSxKKGIucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpifSwhMCk7dmFyIGk9ZnVuY3Rpb24oYil7dmFyIGQ9Yy5leGVjKGIpO2lmKGQpe3ZhciBnLGg9aihkWzFdKSxpPWooZFsyXXx8MSktMSxrPWooZFszXXx8MSktMSxsPWooZFs0XXx8MCksbT1qKGRbNV18fDApLG49aihkWzZdfHwwKSxvPU1hdGguZmxvb3IoMWUzKmooZFs3XXx8MCkpLHA9Qm9vbGVhbihkWzRdJiYhZFs4XSkscT0iLSI9PT1kWzldPzE6LTEscj1qKGRbMTBdfHwwKSxzPWooZFsxMV18fDApLHQ9bT4wfHxuPjB8fG8+MDtyZXR1cm4odD8yNDoyNSk+bCYmNjA+bSYmNjA+biYmMWUzPm8mJmk+LTEmJjEyPmkmJjI0PnImJjYwPnMmJms+LTEmJms8ZShoLGkrMSktZShoLGkpJiYoZz02MCooMjQqKGUoaCxpKStrKStsK3IqcSksZz0xZTMqKDYwKihnK20rcypxKStuKStvLHAmJihnPWYoZykpLGc+PS04NjRlMTMmJjg2NGUxMz49Zyk/ZzpOYU59cmV0dXJuIGEucGFyc2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gSihiLHtwYXJzZTppfSksYn0oRGF0ZSl9RGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk7dmFyIGxiPWsudG9GaXhlZCYmKCIwLjAwMCIhPT04ZS01LnRvRml4ZWQoMyl8fCIxIiE9PS45LnRvRml4ZWQoMCl8fCIxLjI1IiE9PTEuMjU1LnRvRml4ZWQoMil8fCIxMDAwMDAwMDAwMDAwMDAwMTI4IiE9PTB4ZGUwYjZiM2E3NjQwMDgwLnRvRml4ZWQoMCkpLG1iPXtiYXNlOjFlNyxzaXplOjYsZGF0YTpbMCwwLDAsMCwwLDBdLG11bHRpcGx5OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPS0xLGQ9YjsrK2M8bWIuc2l6ZTspZCs9YSptYi5kYXRhW2NdLG1iLmRhdGFbY109ZCVtYi5iYXNlLGQ9TWF0aC5mbG9vcihkL21iLmJhc2UpfSxkaXZpZGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPW1iLnNpemUsYz0wOy0tYj49MDspYys9bWIuZGF0YVtiXSxtYi5kYXRhW2JdPU1hdGguZmxvb3IoYy9hKSxjPWMlYSptYi5iYXNlfSxudW1Ub1N0cmluZzpmdW5jdGlvbigpe2Zvcih2YXIgYT1tYi5zaXplLGI9IiI7LS1hPj0wOylpZigiIiE9PWJ8fDA9PT1hfHwwIT09bWIuZGF0YVthXSl7dmFyIGM9aChtYi5kYXRhW2FdKTsiIj09PWI/Yj1jOmIrPVMoIjAwMDAwMDAiLDAsNy1jLmxlbmd0aCkrY31yZXR1cm4gYn0scG93OmZ1bmN0aW9uIEdiKGEsYixjKXtyZXR1cm4gMD09PWI/YzpiJTI9PT0xP0diKGEsYi0xLGMqYSk6R2IoYSphLGIvMixjKX0sbG9nOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9YTtjPj00MDk2OyliKz0xMixjLz00MDk2O2Zvcig7Yz49MjspYis9MSxjLz0yO3JldHVybiBifX0sbmI9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGksaztpZihiPWooYSksYj1MKGIpPzA6TWF0aC5mbG9vcihiKSwwPmJ8fGI+MjApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk51bWJlci50b0ZpeGVkIGNhbGxlZCB3aXRoIGludmFsaWQgbnVtYmVyIG9mIGRlY2ltYWxzIik7aWYoYz1qKHRoaXMpLEwoYykpcmV0dXJuIk5hTiI7aWYoLTFlMjE+PWN8fGM+PTFlMjEpcmV0dXJuIGgoYyk7aWYoZD0iIiwwPmMmJihkPSItIixjPS1jKSxlPSIwIixjPjFlLTIxKWlmKGY9bWIubG9nKGMqbWIucG93KDIsNjksMSkpLTY5LGc9MD5mP2MqbWIucG93KDIsLWYsMSk6Yy9tYi5wb3coMixmLDEpLGcqPTQ1MDM1OTk2MjczNzA0OTYsZj01Mi1mLGY+MCl7Zm9yKG1iLm11bHRpcGx5KDAsZyksaT1iO2k+PTc7KW1iLm11bHRpcGx5KDFlNywwKSxpLT03O2ZvcihtYi5tdWx0aXBseShtYi5wb3coMTAsaSwxKSwwKSxpPWYtMTtpPj0yMzspbWIuZGl2aWRlKDE8PDIzKSxpLT0yMzttYi5kaXZpZGUoMTw8aSksbWIubXVsdGlwbHkoMSwxKSxtYi5kaXZpZGUoMiksZT1tYi5udW1Ub1N0cmluZygpfWVsc2UgbWIubXVsdGlwbHkoMCxnKSxtYi5tdWx0aXBseSgxPDwtZiwwKSxlPW1iLm51bVRvU3RyaW5nKCkrUygiMC4wMDAwMDAwMDAwMDAwMDAwMDAwMCIsMiwyK2IpO3JldHVybiBiPjA/KGs9ZS5sZW5ndGgsZT1iPj1rP2QrUygiMC4wMDAwMDAwMDAwMDAwMDAwMDAwIiwwLGItaysyKStlOmQrUyhlLDAsay1iKSsiLiIrUyhlLGstYikpOmU9ZCtlLGV9O0ooayx7dG9GaXhlZDpuYn0sbGIpO3ZhciBvYj1mdW5jdGlvbigpe3RyeXtyZXR1cm4iMSI9PT0xLi50b1ByZWNpc2lvbih2b2lkIDApfWNhdGNoKGEpe3JldHVybiEwfX0oKSxwYj1rLnRvUHJlY2lzaW9uO0ooayx7dG9QcmVjaXNpb246ZnVuY3Rpb24oYSl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBhP3BiLmNhbGwodGhpcyk6cGIuY2FsbCh0aGlzLGEpfX0sb2IpLDIhPT0iYWIiLnNwbGl0KC8oPzphYikqLykubGVuZ3RofHw0IT09Ii4iLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aHx8InQiPT09InRlc3N0Ii5zcGxpdCgvKHMpKi8pWzFdfHw0IT09InRlc3QiLnNwbGl0KC8oPzopLywtMSkubGVuZ3RofHwiIi5zcGxpdCgvLj8vKS5sZW5ndGh8fCIuIi5zcGxpdCgvKCkoKS8pLmxlbmd0aD4xPyFmdW5jdGlvbigpe3ZhciBhPSJ1bmRlZmluZWQiPT10eXBlb2YvKCk/Py8uZXhlYygiIilbMV0sYj1NYXRoLnBvdygyLDMyKS0xO2kuc3BsaXQ9ZnVuY3Rpb24oYyxkKXt2YXIgZT1TdHJpbmcodGhpcyk7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBjJiYwPT09ZClyZXR1cm5bXTtpZighQShjKSlyZXR1cm4gVCh0aGlzLGMsZCk7dmFyIGYsZyxoLGksaj1bXSxrPShjLmlnbm9yZUNhc2U/ImkiOiIiKSsoYy5tdWx0aWxpbmU/Im0iOiIiKSsoYy51bmljb2RlPyJ1IjoiIikrKGMuc3RpY2t5PyJ5IjoiIiksbD0wLG09bmV3IFJlZ0V4cChjLnNvdXJjZSxrKyJnIik7YXx8KGY9bmV3IFJlZ0V4cCgiXiIrbS5zb3VyY2UrIiQoPyFcXHMpIixrKSk7dmFyIG89InVuZGVmaW5lZCI9PXR5cGVvZiBkP2I6TS5Ub1VpbnQzMihkKTtmb3IoZz1tLmV4ZWMoZSk7ZyYmKGg9Zy5pbmRleCtnWzBdLmxlbmd0aCwhKGg+bCYmKFYoaixTKGUsbCxnLmluZGV4KSksIWEmJmcubGVuZ3RoPjEmJmdbMF0ucmVwbGFjZShmLGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTE7YTxhcmd1bWVudHMubGVuZ3RoLTI7YSsrKSJ1bmRlZmluZWQiPT10eXBlb2YgYXJndW1lbnRzW2FdJiYoZ1thXT12b2lkIDApfSksZy5sZW5ndGg+MSYmZy5pbmRleDxlLmxlbmd0aCYmbi5hcHBseShqLFEoZywxKSksaT1nWzBdLmxlbmd0aCxsPWgsai5sZW5ndGg+PW8pKSk7KW0ubGFzdEluZGV4PT09Zy5pbmRleCYmbS5sYXN0SW5kZXgrKyxnPW0uZXhlYyhlKTtyZXR1cm4gbD09PWUubGVuZ3RoPyhpfHwhbS50ZXN0KCIiKSkmJlYoaiwiIik6VihqLFMoZSxsKSksai5sZW5ndGg+bz9TKGosMCxvKTpqfX0oKToiMCIuc3BsaXQodm9pZCAwLDApLmxlbmd0aCYmKGkuc3BsaXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEmJjA9PT1iP1tdOlQodGhpcyxhLGIpfSk7dmFyIHFiPWkucmVwbGFjZSxyYj1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiJ4Ii5yZXBsYWNlKC94KC4pPy9nLGZ1bmN0aW9uKGIsYyl7VihhLGMpfSksMT09PWEubGVuZ3RoJiYidW5kZWZpbmVkIj09dHlwZW9mIGFbMF19KCk7cmJ8fChpLnJlcGxhY2U9ZnVuY3Rpb24oYSxjKXt2YXIgZD1iKGMpLGU9QShhKSYmL1wpWyo/XS8udGVzdChhLnNvdXJjZSk7aWYoZCYmZSl7dmFyIGY9ZnVuY3Rpb24oYil7dmFyIGQ9YXJndW1lbnRzLmxlbmd0aCxlPWEubGFzdEluZGV4O2EubGFzdEluZGV4PTA7dmFyIGY9YS5leGVjKGIpfHxbXTtyZXR1cm4gYS5sYXN0SW5kZXg9ZSxWKGYsYXJndW1lbnRzW2QtMl0sYXJndW1lbnRzW2QtMV0pLGMuYXBwbHkodGhpcyxmKX07cmV0dXJuIHFiLmNhbGwodGhpcyxhLGYpfXJldHVybiBxYi5jYWxsKHRoaXMsYSxjKX0pO3ZhciBzYj1pLnN1YnN0cix0Yj0iIi5zdWJzdHImJiJiIiE9PSIwYiIuc3Vic3RyKC0xKTtKKGkse3N1YnN0cjpmdW5jdGlvbihhLGIpe3ZhciBjPWE7cmV0dXJuIDA+YSYmKGM9cyh0aGlzLmxlbmd0aCthLDApKSxzYi5jYWxsKHRoaXMsYyxiKX19LHRiKTt2YXIgdWI9IglcbgtcZlxyIMKg4ZqA4aCO4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI5XHVmZWZmIix2Yj0i4oCLIix3Yj0iWyIrdWIrIl0iLHhiPW5ldyBSZWdFeHAoIl4iK3diK3diKyIqIikseWI9bmV3IFJlZ0V4cCh3Yit3YisiKiQiKSx6Yj1pLnRyaW0mJih1Yi50cmltKCl8fCF2Yi50cmltKCkpO0ooaSx7dHJpbTpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdGhpc3x8bnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FuJ3QgY29udmVydCAiK3RoaXMrIiB0byBvYmplY3QiKTtyZXR1cm4gaCh0aGlzKS5yZXBsYWNlKHhiLCIiKS5yZXBsYWNlKHliLCIiKX19LHpiKTt2YXIgQWI9cS5iaW5kKFN0cmluZy5wcm90b3R5cGUudHJpbSksQmI9aS5sYXN0SW5kZXhPZiYmLTEhPT0iYWJj44GC44GEIi5sYXN0SW5kZXhPZigi44GC44GEIiwyKTtKKGkse2xhc3RJbmRleE9mOmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdGhpc3x8bnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FuJ3QgY29udmVydCAiK3RoaXMrIiB0byBvYmplY3QiKTtmb3IodmFyIGI9aCh0aGlzKSxjPWgoYSksZD1hcmd1bWVudHMubGVuZ3RoPjE/aihhcmd1bWVudHNbMV0pOk5hTixlPUwoZCk/MS8wOk0uVG9JbnRlZ2VyKGQpLGY9dChzKGUsMCksYi5sZW5ndGgpLGc9Yy5sZW5ndGgsaT1mK2c7aT4wOyl7aT1zKDAsaS1nKTt2YXIgaz1VKFMoYixpLGYrZyksYyk7aWYoLTEhPT1rKXJldHVybiBpK2t9cmV0dXJuLTF9fSxCYik7dmFyIENiPWkubGFzdEluZGV4T2Y7aWYoSihpLHtsYXN0SW5kZXhPZjpmdW5jdGlvbihhKXtyZXR1cm4gQ2IuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sMSE9PWkubGFzdEluZGV4T2YubGVuZ3RoKSwoOCE9PXBhcnNlSW50KHViKyIwOCIpfHwyMiE9PXBhcnNlSW50KHViKyIweDE2IikpJiYocGFyc2VJbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9L15bXC0rXT8wW3hYXS87cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGU9QWIoYyksZj1qKGQpfHwoYi50ZXN0KGUpPzE2OjEwKTtyZXR1cm4gYShlLGYpfX0ocGFyc2VJbnQpKSwxL3BhcnNlRmxvYXQoIi0wIikhPT0tKDEvMCkmJihwYXJzZUZsb2F0PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1BYihiKSxkPWEoYyk7cmV0dXJuIDA9PT1kJiYiLSI9PT1TKGMsMCwxKT8tMDpkfX0ocGFyc2VGbG9hdCkpLCJSYW5nZUVycm9yOiB0ZXN0IiE9PVN0cmluZyhuZXcgUmFuZ2VFcnJvcigidGVzdCIpKSl7dmFyIERiPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW4ndCBjb252ZXJ0ICIrdGhpcysiIHRvIG9iamVjdCIpO3ZhciBhPXRoaXMubmFtZTsidW5kZWZpbmVkIj09dHlwZW9mIGE/YT0iRXJyb3IiOiJzdHJpbmciIT10eXBlb2YgYSYmKGE9aChhKSk7dmFyIGI9dGhpcy5tZXNzYWdlO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYj9iPSIiOiJzdHJpbmciIT10eXBlb2YgYiYmKGI9aChiKSksYT9iP2ErIjogIitiOmE6Yn07RXJyb3IucHJvdG90eXBlLnRvU3RyaW5nPURifWlmKEkpe3ZhciBFYj1mdW5jdGlvbihhLGIpe2lmKFcoYSxiKSl7dmFyIGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGIpO2MuZW51bWVyYWJsZT0hMSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLGMpfX07RWIoRXJyb3IucHJvdG90eXBlLCJtZXNzYWdlIiksIiIhPT1FcnJvci5wcm90b3R5cGUubWVzc2FnZSYmKEVycm9yLnByb3RvdHlwZS5tZXNzYWdlPSIiKSxFYihFcnJvci5wcm90b3R5cGUsIm5hbWUiKX1pZigiL2EvZ2ltIiE9PVN0cmluZygvYS9naW0pKXt2YXIgRmI9ZnVuY3Rpb24oKXt2YXIgYT0iLyIrdGhpcy5zb3VyY2UrIi8iO3JldHVybiB0aGlzLmdsb2JhbCYmKGErPSJnIiksdGhpcy5pZ25vcmVDYXNlJiYoYSs9ImkiKSx0aGlzLm11bHRpbGluZSYmKGErPSJtIiksYX07UmVnRXhwLnByb3RvdHlwZS50b1N0cmluZz1GYn19KSxmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0IjsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShiKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YigpOmEucmV0dXJuRXhwb3J0cz1iKCl9KHRoaXMsZnVuY3Rpb24oKXt2YXIgYSxjLGQsZSxmPUZ1bmN0aW9uLmNhbGwsZz1PYmplY3QucHJvdG90eXBlLGg9Zi5iaW5kKGcuaGFzT3duUHJvcGVydHkpLGk9Zi5iaW5kKGcucHJvcGVydHlJc0VudW1lcmFibGUpLGo9Zi5iaW5kKGcudG9TdHJpbmcpLGs9aChnLCJfX2RlZmluZUdldHRlcl9fIik7ayYmKGE9Zi5iaW5kKGcuX19kZWZpbmVHZXR0ZXJfXyksYz1mLmJpbmQoZy5fX2RlZmluZVNldHRlcl9fKSxkPWYuYmluZChnLl9fbG9va3VwR2V0dGVyX18pLGU9Zi5iaW5kKGcuX19sb29rdXBTZXR0ZXJfXykpLE9iamVjdC5nZXRQcm90b3R5cGVPZnx8KE9iamVjdC5nZXRQcm90b3R5cGVPZj1mdW5jdGlvbihhKXt2YXIgYj1hLl9fcHJvdG9fXztyZXR1cm4gYnx8bnVsbD09PWI/YjoiW29iamVjdCBGdW5jdGlvbl0iPT09aihhLmNvbnN0cnVjdG9yKT9hLmNvbnN0cnVjdG9yLnByb3RvdHlwZTphIGluc3RhbmNlb2YgT2JqZWN0P2c6bnVsbH0pO3ZhciBsPWZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gYS5zZW50aW5lbD0wLDA9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInNlbnRpbmVsIikudmFsdWV9Y2F0Y2goYil7cmV0dXJuITF9fTtpZihPYmplY3QuZGVmaW5lUHJvcGVydHkpe3ZhciBtPWwoe30pLG49InVuZGVmaW5lZCI9PXR5cGVvZiBifHxsKGIuY3JlYXRlRWxlbWVudCgiZGl2IikpO2lmKCFufHwhbSl2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yfWlmKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yfHxvKXt2YXIgcD0iT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciBjYWxsZWQgb24gYSBub24tb2JqZWN0OiAiO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I9ZnVuY3Rpb24oYSxiKXtpZigib2JqZWN0IiE9dHlwZW9mIGEmJiJmdW5jdGlvbiIhPXR5cGVvZiBhfHxudWxsPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKHArYSk7aWYobyl0cnl7cmV0dXJuIG8uY2FsbChPYmplY3QsYSxiKX1jYXRjaChjKXt9dmFyIGY7aWYoIWgoYSxiKSlyZXR1cm4gZjtpZihmPXtlbnVtZXJhYmxlOmkoYSxiKSxjb25maWd1cmFibGU6ITB9LGspe3ZhciBqPWEuX19wcm90b19fLGw9YSE9PWc7bCYmKGEuX19wcm90b19fPWcpO3ZhciBtPWQoYSxiKSxuPWUoYSxiKTtpZihsJiYoYS5fX3Byb3RvX189aiksbXx8bilyZXR1cm4gbSYmKGYuZ2V0PW0pLG4mJihmLnNldD1uKSxmfXJldHVybiBmLnZhbHVlPWFbYl0sZi53cml0YWJsZT0hMCxmfX1pZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKX0pLCFPYmplY3QuY3JlYXRlKXt2YXIgcSxyPSEoe19fcHJvdG9fXzpudWxsfWluc3RhbmNlb2YgT2JqZWN0KSxzPWZ1bmN0aW9uKCl7aWYoIWIuZG9tYWluKXJldHVybiExO3RyeXtyZXR1cm4hIW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpfWNhdGNoKGEpe3JldHVybiExfX0sdD1mdW5jdGlvbigpe3ZhciBhLGI7cmV0dXJuIGI9bmV3IEFjdGl2ZVhPYmplY3QoImh0bWxmaWxlIiksYi53cml0ZSgiPHNjcmlwdD48L3NjcmlwdD4iKSxiLmNsb3NlKCksYT1iLnBhcmVudFdpbmRvdy5PYmplY3QucHJvdG90eXBlLGI9bnVsbCxhfSx1PWZ1bmN0aW9uKCl7dmFyIGEsYz1iLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGQ9Yi5ib2R5fHxiLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYy5zdHlsZS5kaXNwbGF5PSJub25lIixkLmFwcGVuZENoaWxkKGMpLGMuc3JjPSJqYXZhc2NyaXB0OiIsYT1jLmNvbnRlbnRXaW5kb3cuT2JqZWN0LnByb3RvdHlwZSxkLnJlbW92ZUNoaWxkKGMpLGM9bnVsbCxhfTtxPXJ8fCJ1bmRlZmluZWQiPT10eXBlb2YgYj9mdW5jdGlvbigpe3JldHVybntfX3Byb3RvX186bnVsbH19OmZ1bmN0aW9uKCl7dmFyIGE9cygpP3QoKTp1KCk7ZGVsZXRlIGEuY29uc3RydWN0b3IsZGVsZXRlIGEuaGFzT3duUHJvcGVydHksZGVsZXRlIGEucHJvcGVydHlJc0VudW1lcmFibGUsZGVsZXRlIGEuaXNQcm90b3R5cGVPZixkZWxldGUgYS50b0xvY2FsZVN0cmluZyxkZWxldGUgYS50b1N0cmluZyxkZWxldGUgYS52YWx1ZU9mO3ZhciBiPWZ1bmN0aW9uKCl7fTtyZXR1cm4gYi5wcm90b3R5cGU9YSxxPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBifSxuZXcgYn0sT2JqZWN0LmNyZWF0ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9ZnVuY3Rpb24oKXt9O2lmKG51bGw9PT1hKWM9cSgpO2Vsc2V7aWYoIm9iamVjdCIhPXR5cGVvZiBhJiYiZnVuY3Rpb24iIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgcHJvdG90eXBlIG1heSBvbmx5IGJlIGFuIE9iamVjdCBvciBudWxsIik7ZC5wcm90b3R5cGU9YSxjPW5ldyBkLGMuX19wcm90b19fPWF9cmV0dXJuIHZvaWQgMCE9PWImJk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGMsYiksY319dmFyIHY9ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwic2VudGluZWwiLHt9KSwic2VudGluZWwiaW4gYX1jYXRjaChiKXtyZXR1cm4hMX19O2lmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl7dmFyIHc9dih7fSkseD0idW5kZWZpbmVkIj09dHlwZW9mIGJ8fHYoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSk7aWYoIXd8fCF4KXZhciB5PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx6PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzfWlmKCFPYmplY3QuZGVmaW5lUHJvcGVydHl8fHkpe3ZhciBBPSJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIixCPSJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICIsQz0iZ2V0dGVycyAmIHNldHRlcnMgY2FuIG5vdCBiZSBkZWZpbmVkIG9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiO09iamVjdC5kZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbihiLGYsaCl7aWYoIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8bnVsbD09PWIpdGhyb3cgbmV3IFR5cGVFcnJvcihCK2IpO2lmKCJvYmplY3QiIT10eXBlb2YgaCYmImZ1bmN0aW9uIiE9dHlwZW9mIGh8fG51bGw9PT1oKXRocm93IG5ldyBUeXBlRXJyb3IoQStoKTtpZih5KXRyeXtyZXR1cm4geS5jYWxsKE9iamVjdCxiLGYsaCl9Y2F0Y2goaSl7fWlmKCJ2YWx1ZSJpbiBoKWlmKGsmJihkKGIsZil8fGUoYixmKSkpe3ZhciBqPWIuX19wcm90b19fO2IuX19wcm90b19fPWcsZGVsZXRlIGJbZl0sYltmXT1oLnZhbHVlLGIuX19wcm90b19fPWp9ZWxzZSBiW2ZdPWgudmFsdWU7ZWxzZXtpZighayYmKCJnZXQiaW4gaHx8InNldCJpbiBoKSl0aHJvdyBuZXcgVHlwZUVycm9yKEMpOyJnZXQiaW4gaCYmYShiLGYsaC5nZXQpLCJzZXQiaW4gaCYmYyhiLGYsaC5zZXQpfXJldHVybiBifX0oIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzfHx6KSYmKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPWZ1bmN0aW9uKGEsYil7aWYoeil0cnl7cmV0dXJuIHouY2FsbChPYmplY3QsYSxiKX1jYXRjaChjKXt9cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7Il9fcHJvdG9fXyIhPT1jJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxjLGJbY10pfSksYX0pLE9iamVjdC5zZWFsfHwoT2JqZWN0LnNlYWw9ZnVuY3Rpb24oYSl7aWYoT2JqZWN0KGEpIT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Quc2VhbCBjYW4gb25seSBiZSBjYWxsZWQgb24gT2JqZWN0cy4iKTtyZXR1cm4gYX0pLE9iamVjdC5mcmVlemV8fChPYmplY3QuZnJlZXplPWZ1bmN0aW9uKGEpe2lmKE9iamVjdChhKSE9PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmZyZWV6ZSBjYW4gb25seSBiZSBjYWxsZWQgb24gT2JqZWN0cy4iKTtyZXR1cm4gYX0pO3RyeXtPYmplY3QuZnJlZXplKGZ1bmN0aW9uKCl7fSl9Y2F0Y2goRCl7T2JqZWN0LmZyZWV6ZT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGI/YjphKGIpfX0oT2JqZWN0LmZyZWV6ZSl9T2JqZWN0LnByZXZlbnRFeHRlbnNpb25zfHwoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zPWZ1bmN0aW9uKGEpe2lmKE9iamVjdChhKSE9PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBPYmplY3RzLiIpO3JldHVybiBhfSksT2JqZWN0LmlzU2VhbGVkfHwoT2JqZWN0LmlzU2VhbGVkPWZ1bmN0aW9uKGEpe2lmKE9iamVjdChhKSE9PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmlzU2VhbGVkIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBPYmplY3RzLiIpO3JldHVybiExfSksT2JqZWN0LmlzRnJvemVufHwoT2JqZWN0LmlzRnJvemVuPWZ1bmN0aW9uKGEpe2lmKE9iamVjdChhKSE9PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmlzRnJvemVuIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBPYmplY3RzLiIpO3JldHVybiExfSksT2JqZWN0LmlzRXh0ZW5zaWJsZXx8KE9iamVjdC5pc0V4dGVuc2libGU9ZnVuY3Rpb24oYSl7aWYoT2JqZWN0KGEpIT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuaXNFeHRlbnNpYmxlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBPYmplY3RzLiIpO2Zvcih2YXIgYj0iIjtoKGEsYik7KWIrPSI/IjthW2JdPSEwO3ZhciBjPWgoYSxiKTtyZXR1cm4gZGVsZXRlIGFbYl0sY30pfSl9KHdpbmRvdyxkb2N1bWVudCk7"}},"time_used":564,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":564,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/mod.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.318Z","timestamp":1785147795318,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/mod.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sat, 06 Jul 2024 09:37:45 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 263\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":646,"size_decoded":806,"mime_type":"text/javascript","magic":"ASCII text","md5":"a79e64fd24b01da273ce1e385d47ed2f","sha1":"9fc3bb9986d902824e16803f782a2ab04c3cacfa","sha256":"70c401cdf3c9bb791433dddd9523c4197ed51d693d73989d1af0fb5f72120a20","sha512":"a54c7adee0d17a52da3c9d9fb9d1fbd8adf3338befac27fc6e27f5dbcbc6122b10c3ac1ab48e196d8c8b10f33f0e3fc317e5b545163ac4da4c510ee5e9a999c3","ssdeep":"","tlshash":"83f081c834780978e99f905b6067195f71f829db3400b6c0b59cdb2d4f75d21a5c75cc","first_seen":"2025-05-31T01:51:37.4918Z","last_seen":"2026-08-11T00:25:55.283341Z","times_seen":25,"resource_available":true,"data":"ZnVuY3Rpb24gY3JlYXRlU3Bhbih0ZXh0KSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKQogICAgbGkuaW5uZXJUZXh0ID0gdGV4dAogICAgcmV0dXJuIGxpCn0KCmZ1bmN0aW9uIHNwYWNlRmlyc3RFbGVtZW50T3V0QnlDbGFzcyhjbGFzc05hbWUpIHsKICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJzcGFjZS1vdXQiKVswXQoKICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gZWxlbWVudC5pbm5lclRleHQKICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gIiIKCiAgICBjb25zb2xlLmxvZyh7Y3VycmVudFRleHR9KQoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudFRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCB0ZXh0ID0gY3VycmVudFRleHRbaV0KICAgICAgICBjb25zdCBsaSA9IGNyZWF0ZVNwYW4odGV4dCkKCiAgICAgICAgY29uc29sZS5sb2coImluIGxvb3AiLCB7Y3VycmVudFRleHR9KQogICAgCiAgICAgICAgY29uc29sZS5sb2coImFwcGVuZGluZyIsIHRleHQsICJhcyIsIGxpKQogICAgCiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChsaSkKICAgIH0KfQoKc3BhY2VGaXJzdEVsZW1lbnRPdXRCeUNsYXNzKCJzcGFjZS1vdXQiKQ=="}},"time_used":561,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":561,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/6.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.541Z","timestamp":1785147795541,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/6.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 618\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":618,"size_decoded":1091,"mime_type":"image/png","magic":"PNG image data, 39 x 47, 8-bit colormap, non-interlaced","md5":"3b413c1de34afd30c69baedcba3b1301","sha1":"8b4a04e20dcd35e423ec55736aac93cb9497ff4a","sha256":"8b5da33d232667b2ba0865ea308d3234d7704488383ffc8d6df13a8c1dc252a6","sha512":"6b1fc38e77a5c8bbcaa0cac4dba3f189f378ea928f9556e3750e6394a2ecd6b2e0c66e40b65e19c64c3e499995a0cbdd669824ea8f91964409e66893477f2898","ssdeep":"","tlshash":"aff0a39202c96eddc65e854a318288ec9d6dce676250da21041f7c3d66b132c0158746","first_seen":"2025-05-31T01:51:37.404711Z","last_seen":"2026-08-11T00:25:55.185981Z","times_seen":24,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAACcAAAAvCAMAAABXLiNqAAAAzFBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9BBI/TAAAAQ3RSTlMAAQQFBgcJCgsMDQ4PHycqLC0vMURSVVxlZml3eIeTlJWYmZqbnKOqq6ytrq+xs7vBwsPExcbI3N7h6u7w8/b6+/3+wV41KAAAAQpJREFUOI3N1clSwkAQgOHGjAYkLEFRZFUGcBcQkTUsyfu/ExkKqKTpoedCFf+tU98h00nVgP0yDY5bjtt3EEsSapvfSUXdXOeC4N+JuHBez+It9nDoxNwk/iZQDZ89dxX8czhXvnrbwjTnwHpXcHDLOQT1DsSHgr8pzoH4VLCf5ByIrwM86UB8K9izObeDbdaB+FHfusA6EP1wbOhc6+FQLRxHOodaUe6R+Mcodz00c3BTbjQjeTqHmpzRJUoVqlICuRyxC1UOOVfjXOSyGpfF5yg+URXPvRdTZ9VfqeoWcnnDvZjuL+OTzM/gc7j3VO6l7O+SHb4/cGvlTtxHkeYgjZwEW3qs8qS9AUNe3qEoOjK2AAAAAElFTkSuQmCC"}},"time_used":345,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":342,"receive":3,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/l.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.544Z","timestamp":1785147795544,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/l.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 23936\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":23936,"size_decoded":24411,"mime_type":"image/png","magic":"PNG image data, 156 x 156, 8-bit/color RGBA, non-interlaced","md5":"c49164d4bcece7a420021a37d326a961","sha1":"e34d0105cf0423b1c56523b21a1f29c154a94b75","sha256":"7579bf9c7889f0639a312f502181b6405d968fad7bcd21e57b5ec0e212d75d73","sha512":"b148bd9d4b172ee0005200616d2c5a7a9dcaf610178a67aad3194103b5b764ba7116c94db8f926f0112b1fd83095c5befd3a916ae31ba556fac1323b7d378724","ssdeep":"192:sSKk6DoAl9t+8y7dBhqFpUmmYQPjXb95XtC8F2BqwUg9GDV2826bHlHUhJZ5+:rZ6fY8y6I3Lb9512YOlql85+","tlshash":"5db28d64ee70f08590c9e1b625e22d0eb8574e03d7021cc9f9ad6d49bf18bc15f8b9a7","first_seen":"2025-05-31T01:51:37.49648Z","last_seen":"2026-08-11T00:25:55.224876Z","times_seen":24,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAJwAAACcCAYAAACKuMJNAAAACXBIWXMAAAsTAAALEwEAmpwYAAA5tmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDowMTgwMTE3NDA3MjA2ODExOERCQjhGNzExQzI0RkZBQjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOkYyNUQ3M0I1MEU2ODExRTg4MjI1RkEyQUREMzEyNjIyPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjQzY2Y2YzRlLWM2M2ItMzU0Ny1hNDMzLTEyZGY5NGY0ZDhkNTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDowMjdmOTYyMC0yYjcxLTRkNGMtYjEyZS1lNTllYTg3MmQyZWU8L3N0UmVmOmluc3RhbmNlSUQ+CiAgICAgICAgICAgIDxzdFJlZjpkb2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDoyMTNkN2ZlNC0wNjVhLTExZTgtYmYwZi1hYjQ1YWJhNzMxMzg8L3N0UmVmOmRvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo0M2NmNmM0ZS1jNjNiLTM1NDctYTQzMy0xMmRmOTRmNGQ4ZDU8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDMtMDZUMTk6MTI6MDIrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxOC0wMy0wNlQxODozMDowNyswNTozMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE4LTAzLTA2VDE5OjEyOjAyKzA1OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxOC0wMy0wNlQxOToxMjowMiswNTozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+NjU1MzU8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE1NjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xNTY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PvbeEzQAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAI0RJREFUeNrsnXl4FFXWh9+q7s7aIZCEsAWSILIroICIEYkICDgugAuCgMowojAyLuM66syn4jbOOCg6OqMgjoj7wuCwiSCEPYCgIImShCQkkH1furu+P25USHqp6q7q7kDO89ST7upOVd1z3/6de+69dUsaeP4U2syjSSq/p7S5yr2Z21ygGia9jqW0AdcGV6CvQWkD7uwEzCggFY3nVdqAO/Mgkww4pqKTqklnKnzmswgyyQ/KJmkAUvICVqUNuOAGTdJpv14hVVIJoCf4lDbgghsyKYDQKW5CqqQCTOVMUj3zGQKaGqB8BdFoCBUXIKmFTzkrgDuw/0NDL/C8QVO1gKblvS+waalkycn3mu9zBps7+FyCd2D/h34F77xBUzV9Xw7mX4Mb2CQn8EjNXjt7726TPXx26uZpv5ZjSx6u2VN5tfxA20KqF6CpUSxJhaKd9lnv3ony008uSOrUKbZPaGhIsskkJ5pMcoIkSXEgxUoSMUAYYJYkyQqgKEoVYAPqFIUSUIoVRSmy2x25drsju76+4WhhYfEPDz+6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"}},"time_used":687,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":349,"receive":338,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/1.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.545Z","timestamp":1785147795545,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/1.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16708\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16708,"size_decoded":17183,"mime_type":"image/png","magic":"PNG image data, 125 x 40, 8-bit/color RGBA, non-interlaced","md5":"b678f1de0316527d06094915caadbee6","sha1":"75b3c0c60272455208c8b2a7aaed694b6ab90144","sha256":"b8456c23e3b2a7e446630255742e91d67f2708cc5e212c3517ff9d2faa9713c8","sha512":"d6ddf07af927f521a334f1da048476b908dace238aabd1009cff495f56ec2d37bf675062e54bb24bc3492812d9da30096d869d5c907714be6d7050bd7b43c527","ssdeep":"96:GSmkEWRlxNXiDwC6sc55iFsO8Hj0/fckpxYs5OM+2Y:GSmktf8FsVHw/UkplRY","tlshash":"2e720765ace035a1e49ed6721dc428ce9d334a53aac15c06f6cd8d663f00fd9ad0f583","first_seen":"2025-05-31T01:51:37.449974Z","last_seen":"2026-08-11T00:25:55.254015Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAH0AAAAoCAYAAADTw/VhAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4JWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNjowMyswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjY6MDMrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6OGY5Yzg3MTMtMjNiMy0wNjRmLTk5ZDEtMzA4ZTY2MGYwMDM2PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjhmOWM4NzEzLTIzYjMtMDY0Zi05OWQxLTMwOGU2NjBmMDAzNjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjhmOWM4NzEzLTIzYjMtMDY0Zi05OWQxLTMwOGU2NjBmMDAzNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo4ZjljODcxMy0yM2IzLTA2NGYtOTlkMS0zMDhlNjYwZjAwMzY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTI1PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg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"}},"time_used":695,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":380,"receive":315,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/main.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.317Z","timestamp":1785147795317,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/main.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:40 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 3554\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":14143,"size_decoded":4098,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text","md5":"845084284aad8f35c61d78eefc3cc915","sha1":"8b80c4639a5808a97517a9b989e4a76fde75f43d","sha256":"7214c8f7cb772c57f1cf531beef1b5ab648ee6438c28876c981467e4fb91c551","sha512":"87be9aeeb6cc8fd7891fa2680fd35bc448d6b4c1f15c232aa6776183702dffc77e6205326b4248c3a59bd3dc49d39a8b4bb3eba076b4591c6d01204c74a1fd39","ssdeep":"384:f6gNl2ouCFJeZQ67LZQ67PEoWS/5Hs5DZKpUGJk:S4l2ouYJsljBkZKp/k","tlshash":"6b524344ef6c1161203bf27a967f2240ea3c50336d059c68bd7c89681fd856e93beb6d","first_seen":"2025-05-31T01:51:37.446608Z","last_seen":"2026-08-11T00:25:55.25722Z","times_seen":27,"resource_available":true,"data":"KGZ1bmN0aW9uICgkKSB7CiAidXNlIHN0cmljdCI7CiAKIAogLy8gUHJlbG9hZGVyIAoJalF1ZXJ5KHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpIHsKCQlqUXVlcnkoIiNzdGF0dXMiKS5mYWRlT3V0KCk7CgkJalF1ZXJ5KCIjcHJlbG9hZGVyIikuZGVsYXkoMzUwKS5mYWRlT3V0KCJzbG93Iik7Cgl9KTsKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgMS4gTW9iaWxlIE1lbnUgQWN0aXZhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBqUXVlcnkoJy5tb2JpbGUtbWVudSBuYXYnKS5tZWFubWVudSh7CiAgICAgICAgbWVhblNjcmVlbldpZHRoOiAiOTkyIiwKICAgIH0pOwoKCiAgICAkKCAiLmxuZy1pbiIgKS5vbigiY2xpY2siLGZ1bmN0aW9uKCkgewogICAgJCggIi5sbmctb3V0IiApLnNsaWRlVG9nZ2xlKCJzbG93Iik7CiAgfSk7CgpzbW9vdGhTY3JvbGwuaW5pdCgpOwoKCiBpZiggJCgnI3BpZV9jaGFydF8xJykubGVuZ3RoID4gMCApewogICAgJCgnI3BpZV9jaGFydF8xJykuZWFzeVBpZUNoYXJ0KHsKICAgICAgYmFyQ29sb3IgOiAnIzVlNjE5YycsCiAgICAgIGxpbmVXaWR0aDogMiwKICAgICAgYW5pbWF0ZTogMzAwMCwKICAgICAgc2l6ZTogMTAwLAogICAgICBsaW5lQ2FwOiAnc3F1YXJlJywKICAgICAgc2NhbGVDb2xvcjpmYWxzZSwKICAgICAgb25TdGVwOiBmdW5jdGlvbihmcm9tLCB0bywgcGVyY2VudCkgewogICAgICAgICQodGhpcy5lbCkuZmluZCgnLnBlcmNlbnQnKS50ZXh0KE1hdGgucm91bmQocGVyY2VudCkpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmKCAkKCcjZV9jaGFydF8zJykubGVuZ3RoID4gMCApewogICAgdmFyIGVDaGFydF8zID0gZWNoYXJ0cy5pbml0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlX2NoYXJ0XzMnKSk7CiAgICB2YXIgZGF0YSA9IFt7CiAgICAgIHZhbHVlOiAxOTQ1LAogICAgICBuYW1lOiAnJwogICAgfSwgewogICAgICB2YWx1ZTogMjU4MCwKICAgICAgbmFtZTogJycKICAgIH0sIHsKICAgICAgdmFsdWU6IDUxNjAsCiAgICAgIG5hbWU6ICcnCiAgICB9LCB7CiAgICAgIHZhbHVlOiA1NDgyNiwKICAgICAgbmFtZTogJycKICAgIH1dOwogICAgdmFyIG9wdGlvbjMgPSB7CiAgICAgIHRvb2x0aXA6IHsKICAgICAgICBzaG93OiB0cnVlLAogICAgICAgIHRyaWdnZXI6ICdpdGVtJywKICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDMzLDMzLDMzLDEpJywKICAgICAgICBib3JkZXJSYWRpdXM6MCwKICAgICAgICBwYWRkaW5nOjEwLAogICAgICAgIGZvcm1hdHRlcjogIntifToge2N9ICh7ZH0lKSIsCiAgICAgICAgdGV4dFN0eWxlOiB7CiAgICAgICAgICBjb2xvcjogJyNmZmYnLAogICAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJywKICAgICAgICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLAogICAgICAgICAgZm9udEZhbWlseTogIidSb2JvdG8nLCBzYW5zLXNlcmlmIiwKICAgICAgICAgIGZvbnRTaXplOiAxMgogICAgICAgIH0gCiAgICAgIH0sCiAgICAgIHNlcmllczogW3sKICAgICAgICB0eXBlOiAncGllJywKICAgICAgICBzZWxlY3RlZE1vZGU6ICdzaW5nbGUnLAogICAgICAgIHJhZGl1czogWyc5MCUnLCAnMzAlJ10sCiAgICAgICAgY29sb3I6IFsnI2E4YTliZCcsJyM5Mzk1YjknLCAnIzY1Njc5MCcsICcjM2U0MDZlJ10sCiAgICAgICAgbGFiZWxMaW5lOiB7CiAgICAgICAgICBub3JtYWw6IHsKICAgICAgICAgICAgc2hvdzogZmFsc2UKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGRhdGE6IGRhdGEKICAgICAgfV0KICAgIH07CiAgICBlQ2hhcnRfMy5zZXRPcHRpb24ob3B0aW9uMyk7CiAgICBlQ2hhcnRfMy5yZXNpemUoKTsKICB9CgogIGlmKCAkKCcjZV9jaGFydF8yJykubGVuZ3RoID4gMCApewogICAgdmFyIGVDaGFydF8zID0gZWNoYXJ0cy5pbml0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlX2NoYXJ0XzInKSk7CiAgICB2YXIgZGF0YSA9IFt7CiAgICAgIHZhbHVlOiA1NTU1NTUsCiAgICAgIG5hbWU6ICcnCiAgICB9LCB7CiAgICAgIHZhbHVlOiAgNTgxNTIsCiAgICAgIG5hbWU6ICcnCiAgICB9LCB7CiAgICAgIHZhbHVlOiA0NTUwMjUsCiAgICAgIG5hbWU6ICcnCiAgICB9LCB7CiAgICAgIHZhbHVlOiAyNTU1MjUsCiAgICAgIG5hbWU6ICcnCiAgICB9XTsKICAgIHZhciBvcHRpb24zID0gewogICAgICB0b29sdGlwOiB7CiAgICAgICAgc2hvdzogdHJ1ZSwKICAgICAgICB0cmlnZ2VyOiAnaXRlbScsCiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgzMywzMywzMywxKScsCiAgICAgICAgYm9yZGVyUmFkaXVzOjAsCiAgICAgICAgcGFkZGluZzoxMCwKICAgICAgICBmb3JtYXR0ZXI6ICJ7Yn06IHtjfSAoe2R9JSkiLAogICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgY29sb3I6ICcjZmZmJywKICAgICAgICAgIGZvbnRTdHlsZTogJ25vcm1hbCcsCiAgICAgICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJywKICAgICAgICAgIGZvbnRGYW1pbHk6ICInUm9ib3RvJywgc2Fucy1zZXJpZiIsCiAgICAgICAgICBmb250U2l6ZTogMTIKICAgICAgICB9IAogICAgICB9LAogICAgICBzZXJpZXM6IFt7CiAgICAgICAgdHlwZTogJ3BpZScsCiAgICAgICAgc2VsZWN0ZWRNb2RlOiAnc2luZ2xlJywKICAgICAgICByYWRpdXM6IFsnOTAlJywgJzMwJSddLAogICAgICAgIGNvbG9yOiBbJyNhOGE5YmQnLCcjOTM5NWI5JywgJyM2NTY3OTAnLCAnIzNlNDA2ZSddLAogICAgICAgIGxhYmVsTGluZTogewogICAgICAgICAgbm9ybWFsOiB7CiAgICAgICAgICAgIHNob3c6IGZhbHNlCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBkYXRhOiBkYXRhCiAgICAgIH1dCiAgICB9OwogICAgZUNoYXJ0XzMuc2V0T3B0aW9uKG9wdGlvbjMpOwogICAgZUNoYXJ0XzMucmVzaXplKCk7CiAgfQoKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNjcm9sbFVwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8JCgkvLyA9PT09PSBTY3JvbGwgdG8gVG9wID09PT0gCiQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5zY3JvbGxUb3AoKSA+PSAxMDApIHsgICAgICAgCiAgICAgICAgJCgnI3JldHVybi10by10b3AnKS5mYWRlSW4oMjAwKTsgICAKICAgIH0gZWxzZSB7CiAgICAgICAgJCgnI3JldHVybi10by10b3AnKS5mYWRlT3V0KDIwMCk7ICAKICAgIH0KfSk7CiQoJyNyZXR1cm4tdG8tdG9wJykuY2xpY2soZnVuY3Rpb24oKSB7ICAgICAKICAgICQoJ2JvZHksaHRtbCcpLmFuaW1hdGUoewogICAgICAgIHNjcm9sbFRvcCA6IDAgICAgICAgICAgICAgICAgCiAgICB9LCA1MDApOwp9KTsKCgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJd293IGpzIGFjdGl2ZQoJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJCQluZXcgV09XKCkuaW5pdCgpOwoJCiAKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm93bCBhY3RpdmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovICAKCSQoIi5ibG9nLXNsaWRlciIpLm93bENhcm91c2VsKHsKCQlhdXRvUGxheTogZmFsc2UsIAoJCXNsaWRlU3BlZWQ6MjAwMCwKCQlwYWdpbmF0aW9uOmZhbHNlLAoJCW5hdmlnYXRpb246dHJ1ZSwJICAKCQlpdGVtcyA6IDMsCgkJLyogdHJhbnNpdGlvblN0eWxlIDogImZhZGUiLCAqLyAgICAvKiBbVGhpcyBjb2RlIGZvciBhbmltYXRpb24gXSAqLwoJCW5hdmlnYXRpb25UZXh0OlsiPGkgY2xhc3M9J2ZhIGZhLWFuZ2xlLWxlZnQnPjwvaT4iLCI8aSBjbGFzcz0nZmEgZmEtYW5nbGUtcmlnaHQnPjwvaT4iXSwKCQlpdGVtc0Rlc2t0b3AgOiBbMTE5OSwzXSwKCQlpdGVtc0Rlc2t0b3BTbWFsbCA6IFs5OTIsMl0sCgkJaXRlbXNUYWJsZXQ6IFs3NjgsMl0sCgkJaXRlbXNNb2JpbGUgOiBbNDgwLDFdLAoJfSk7CgogICQoIi50b2tlcy1jaGFydC1zbGlkZXIiKS5vd2xDYXJvdXNlbCh7CiAgICBhdXRvUGxheTogZmFsc2UsIAogICAgc2xpZGVTcGVlZDoyMDAwLAogICAgcGFnaW5hdGlvbjpmYWxzZSwKICAgIG5hdmlnYXRpb246dHJ1ZSwgICAgCiAgICBpdGVtcyA6IDEsCiAgICAvKiB0cmFuc2l0aW9uU3R5bGUgOiAiZmFkZSIsICovICAgIC8qIFtUaGlzIGNvZGUgZm9yIGFuaW1hdGlvbiBdICovCiAgICBuYXZpZ2F0aW9uVGV4dDpbIjxpIGNsYXNzPSdmYSBmYS1hbmdsZS1sZWZ0Jz48L2k+IiwiPGkgY2xhc3M9J2ZhIGZhLWFuZ2xlLXJpZ2h0Jz48L2k+Il0sCiAgICBpdGVtc0Rlc2t0b3AgOiBbMTE5OSwxXSwKICAgIGl0ZW1zRGVza3RvcFNtYWxsIDogWzk5MiwxXSwKICAgIGl0ZW1zVGFibGV0OiBbNzY4LDFdLAogICAgaXRlbXNNb2JpbGUgOiBbNDc5LDFdLAogIH0pOwoKCgkKICAvLyBNYWluIFNsaWRlciBBbmltYXRpb24KICAKICAoZnVuY3Rpb24oICQgKSB7CgoJLy9GdW5jdGlvbiB0byBhbmltYXRlIHNsaWRlciBjYXB0aW9ucyAKCWZ1bmN0aW9uIGRvQW5pbWF0aW9ucyggZWxlbXMgKSB7CgkJLy9DYWNoZSB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGluIGEgdmFyaWFibGUKCQl2YXIgYW5pbUVuZEV2ID0gJ3dlYmtpdEFuaW1hdGlvbkVuZCBhbmltYXRpb25lbmQnOwoJCQoJCWVsZW1zLmVhY2goZnVuY3Rpb24gKCkgewoJCQl2YXIgJHRoaXMgPSAkKHRoaXMpLAoJCQkJJGFuaW1hdGlvblR5cGUgPSAkdGhpcy5kYXRhKCdhbmltYXRpb24nKTsKCQkJJHRoaXMuYWRkQ2xhc3MoJGFuaW1hdGlvblR5cGUpLm9uZShhbmltRW5kRXYsIGZ1bmN0aW9uICgpIHsKCQkJCSR0aGlzLnJlbW92ZUNsYXNzKCRhbmltYXRpb25UeXBlKTsKCQkJfSk7CgkJfSk7Cgl9CgkKCS8vVmFyaWFibGVzIG9uIHBhZ2UgbG9hZCAKCXZhciAkbXlDYXJvdXNlbCA9ICQoJyNjYXJvdXNlbC1leGFtcGxlLWdlbmVyaWMnKSwKCQkkZmlyc3RBbmltYXRpbmdFbGVtcyA9ICRteUNhcm91c2VsLmZpbmQoJy5pdGVtOmZpcnN0JykuZmluZCgiW2RhdGEtYW5pbWF0aW9uIF49ICdhbmltYXRlZCddIik7CgkJCgkvL0luaXRpYWxpemUgY2Fyb3VzZWwgCgkkbXlDYXJvdXNlbC5jYXJvdXNlbCgpOwoJCgkvL0FuaW1hdGUgY2FwdGlvbnMgaW4gZmlyc3Qgc2xpZGUgb24gcGFnZSBsb2FkIAoJZG9BbmltYXRpb25zKCRmaXJzdEFuaW1hdGluZ0VsZW1zKTsKCQoJLy9QYXVzZSBjYXJvdXNlbCAgCgkkbXlDYXJvdXNlbC5jYXJvdXNlbCgncGF1c2UnKTsKCQoJCgkvL090aGVyIHNsaWRlcyB0byBiZSBhbmltYXRlZCBvbiBjYXJvdXNlbCBzbGlkZSBldmVudCAKCSRteUNhcm91c2VsLm9uKCdzbGlkZS5icy5jYXJvdXNlbCcsIGZ1bmN0aW9uIChlKSB7CgkJdmFyICRhbmltYXRpbmdFbGVtcyA9ICQoZS5yZWxhdGVkVGFyZ2V0KS5maW5kKCJbZGF0YS1hbmltYXRpb24gXj0gJ2FuaW1hdGVkJ10iKTsKCQlkb0FuaW1hdGlvbnMoJGFuaW1hdGluZ0VsZW1zKTsKCX0pOyAgCgoJCn0pKGpRdWVyeSk7CgoKLy8gQ291bnREb3duIEpzCgkJdmFyIGRlYWRsaW5lID0gJ2RlYyAxNCAyMDIxIDExOjU5OjAwIEdNVC0wNDAwJzsgCgkJZnVuY3Rpb24gdGltZV9yZW1haW5pbmcoZW5kdGltZSl7CgkJCXZhciB0ID0gRGF0ZS5wYXJzZShlbmR0aW1lKSAtIERhdGUucGFyc2UobmV3IERhdGUoKSk7CgkJCXZhciBzZWNvbmRzID0gTWF0aC5mbG9vciggKHQvMTAwMCkgJSA2MCApOwoJCQl2YXIgbWludXRlcyA9IE1hdGguZmxvb3IoICh0LzEwMDAvNjApICUgNjAgKTsKCQkJdmFyIGhvdXJzID0gTWF0aC5mbG9vciggKHQvKDEwMDAqNjAqNjApKSAlIDI0ICk7CgkJCXZhciBkYXlzID0gTWF0aC5mbG9vciggdC8oMTAwMCo2MCo2MCoyNCkgKTsKCQkJcmV0dXJuIHsndG90YWwnOnQsICdkYXlzJzpkYXlzLCAnaG91cnMnOmhvdXJzLCAnbWludXRlcyc6bWludXRlcywgJ3NlY29uZHMnOnNlY29uZHN9OwoJCX0KCQlmdW5jdGlvbiBydW5fY2xvY2soaWQsZW5kdGltZSl7CgkJCXZhciBjbG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKCQkJCgkJCS8vIGdldCBzcGFucyB3aGVyZSBvdXIgY2xvY2sgbnVtYmVycyBhcmUgaGVsZAoJCQl2YXIgZGF5c19zcGFuID0gY2xvY2sucXVlcnlTZWxlY3RvcignLmRheXMnKTsKCQkJdmFyIGhvdXJzX3NwYW4gPSBjbG9jay5xdWVyeVNlbGVjdG9yKCcuaG91cnMnKTsKCQkJdmFyIG1pbnV0ZXNfc3BhbiA9IGNsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5taW51dGVzJyk7CgkJCXZhciBzZWNvbmRzX3NwYW4gPSBjbG9jay5xdWVyeVNlbGVjdG9yKCcuc2Vjb25kcycpOwoKCQkJZnVuY3Rpb24gdXBkYXRlX2Nsb2NrKCl7CgkJCQl2YXIgdCA9IHRpbWVfcmVtYWluaW5nKGVuZHRpbWUpOwoJCQkJCgkJCQkvLyB1cGRhdGUgdGhlIG51bWJlcnMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBjbG9jawoJCQkJZGF5c19zcGFuLmlubmVySFRNTCA9IHQuZGF5czsKCQkJCWhvdXJzX3NwYW4uaW5uZXJIVE1MID0gKCcwJyArIHQuaG91cnMpLnNsaWNlKC0yKTsKCQkJCW1pbnV0ZXNfc3Bhbi5pbm5lckhUTUwgPSAoJzAnICsgdC5taW51dGVzKS5zbGljZSgtMik7CgkJCQlzZWNvbmRzX3NwYW4uaW5uZXJIVE1MID0gKCcwJyArIHQuc2Vjb25kcykuc2xpY2UoLTIpOwoJCQkJCgkJCQlpZih0LnRvdGFsPD0wKXsgY2xlYXJJbnRlcnZhbCh0aW1laW50ZXJ2YWwpOyB9CgkJCX0KCQkJdXBkYXRlX2Nsb2NrKCk7CgkJCXZhciB0aW1laW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh1cGRhdGVfY2xvY2ssMTAwMCk7CgkJfQoJCXJ1bl9jbG9jaygnY2xvY2tkaXYnLGRlYWRsaW5lKTsKCQkKCQkvLyBDb3VudERvd24gSnMKCXZhciBkZWFkbGluZSA9ICdzZXB0ZW1iZXIgMSAyMDE4IDExOjU5OjAwIEdNVC0wNDAwJzsKCQlmdW5jdGlvbiB0aW1lX3JlbWFpbmluZyhlbmR0aW1lKXsKCQkJdmFyIHQgPSBEYXRlLnBhcnNlKGVuZHRpbWUpIC0gRGF0ZS5wYXJzZShuZXcgRGF0ZSgpKTsKCQkJdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKCAodC8xMDAwKSAlIDYwICk7CgkJCXZhciBtaW51dGVzID0gTWF0aC5mbG9vciggKHQvMTAwMC82MCkgJSA2MCApOwoJCQl2YXIgaG91cnMgPSBNYXRoLmZsb29yKCAodC8oMTAwMCo2MCo2MCkpICUgMjQgKTsKCQkJdmFyIGRheXMgPSBNYXRoLmZsb29yKCB0LygxMDAwKjYwKjYwKjI0KSApOwoJCQlyZXR1cm4geyd0b3RhbCc6dCwgJ2RheXMnOmRheXMsICdob3Vycyc6aG91cnMsICdtaW51dGVzJzptaW51dGVzLCAnc2Vjb25kcyc6c2Vjb25kc307CgkJfQoJCWZ1bmN0aW9uIHJ1bl9jbG9jayhpZCxlbmR0aW1lKXsKCQkJdmFyIGNsb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJCQkKCQkJLy8gZ2V0IHNwYW5zIHdoZXJlIG91ciBjbG9jayBudW1iZXJzIGFyZSBoZWxkCgkJCXZhciBkYXlzX3NwYW4gPSBjbG9jay5xdWVyeVNlbGVjdG9yKCcuZGF5cycpOwoJCQl2YXIgaG91cnNfc3BhbiA9IGNsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5ob3VycycpOwoJCQl2YXIgbWludXRlc19zcGFuID0gY2xvY2sucXVlcnlTZWxlY3RvcignLm1pbnV0ZXMnKTsKCQkJdmFyIHNlY29uZHNfc3BhbiA9IGNsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5zZWNvbmRzJyk7CgoJCQlmdW5jdGlvbiB1cGRhdGVfY2xvY2soKXsKCQkJCXZhciB0ID0gdGltZV9yZW1haW5pbmcoZW5kdGltZSk7CgkJCQkKCQkJCS8vIHVwZGF0ZSB0aGUgbnVtYmVycyBpbiBlYWNoIHBhcnQgb2YgdGhlIGNsb2NrCgkJCQlkYXlzX3NwYW4uaW5uZXJIVE1MID0gdC5kYXlzOwoJCQkJaG91cnNfc3Bhbi5pbm5lckhUTUwgPSAoJzAnICsgdC5ob3Vycykuc2xpY2UoLTIpOwoJCQkJbWludXRlc19zcGFuLmlubmVySFRNTCA9ICgnMCcgKyB0Lm1pbnV0ZXMpLnNsaWNlKC0yKTsKCQkJCXNlY29uZHNfc3Bhbi5pbm5lckhUTUwgPSAoJzAnICsgdC5zZWNvbmRzKS5zbGljZSgtMik7CgkJCQkKCQkJCWlmKHQudG90YWw8PTApeyBjbGVhckludGVydmFsKHRpbWVpbnRlcnZhbCk7IH0KCQkJfQoJCQl1cGRhdGVfY2xvY2soKTsKCQkJdmFyIHRpbWVpbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZV9jbG9jaywxMDAwKTsKCQl9CgkJcnVuX2Nsb2NrKCdjbG9ja2RpdjInLGRlYWRsaW5lKTsKCQkKCQkKCQkKCQkvL1NpbmdsZSBwYWdlIHNjcm9sbCBqcwoJJCgnLndkX3NpbmdsZV9pbmRleF9tZW51IHVsIGxpIGEnKS5vbignY2xpY2snICwgZnVuY3Rpb24oZSl7CgkgICQoJy53ZF9zaW5nbGVfaW5kZXhfbWVudSB1bCBsaScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCSAgJCh0aGlzKS5wYXJlbnQoKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkgIHZhciB0YXJnZXQgPSAkKCdbc2VjdGlvbi1zY3JvbGw9JyskKHRoaXMpLmF0dHIoJ2hyZWYnKSsnXScpOwoJICBlLnByZXZlbnREZWZhdWx0KCk7CgkgIHZhciB0YXJnZXRIZWlnaHQgPSB0YXJnZXQub2Zmc2V0KCkudG9wLXBhcnNlSW50KCc4MCcsIDEwKTsKCSAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoewoJICAgc2Nyb2xsVG9wOiB0YXJnZXRIZWlnaHQKCSAgfSwgMTAwMCk7Cgl9KTsKCQoJJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpIHsKCSAgdmFyIHdpbmRzY3JvbGwgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7CgkgIHZhciB0YXJnZXQgPSAkKCcud2Rfc2luZ2xlX2luZGV4X21lbnUgdWwgbGknKTsKCSAgaWYgKHdpbmRzY3JvbGwgPj0gMCkgewoJICAgJCgnW3NlY3Rpb24tc2Nyb2xsXScpLmVhY2goZnVuY3Rpb24oaSkgewoJCWlmICgkKHRoaXMpLnBvc2l0aW9uKCkudG9wIDw9IHdpbmRzY3JvbGwgKyA5MCkgewoJCSB0YXJnZXQucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCSB0YXJnZXQuZXEoaSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCSAgIH0pOwoJICB9ZWxzZXsKCSAgIHRhcmdldC5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkgICAkKCcud2Rfc2luZ2xlX2luZGV4X21lbnUgdWwgbGk6Zmlyc3QnKS5hZGRDbGFzcygnYWN0aXZlJyk7CgkgIH0KCgl9KTsKCQoJCgkvL1NpbmdsZSBwYWdlIHNjcm9sbCBqcwoJJCgnI2Nzc21lbnUgdWwgbGkgYScpLm9uKCdjbGljaycgLCBmdW5jdGlvbihlKXsKCSAgJCgnI2Nzc21lbnUgdWwgbGknKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkgICQodGhpcykucGFyZW50KCkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJICB2YXIgdGFyZ2V0ID0gJCgnW3NlY3Rpb24tc2Nyb2xsPScrJCh0aGlzKS5hdHRyKCdocmVmJykrJ10nKTsKCSAgZS5wcmV2ZW50RGVmYXVsdCgpOwoJICB2YXIgdGFyZ2V0SGVpZ2h0ID0gdGFyZ2V0Lm9mZnNldCgpLnRvcC1wYXJzZUludCgnODAnLCAxMCk7CgkgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsKCSAgIHNjcm9sbFRvcDogdGFyZ2V0SGVpZ2h0CgkgIH0sIDEwMDApOwoJfSk7CgkKCSQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7CgkgIHZhciB3aW5kc2Nyb2xsID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpOwoJICB2YXIgdGFyZ2V0ID0gJCgnI2Nzc21lbnUgdWwgbGknKTsKCSAgaWYgKHdpbmRzY3JvbGwgPj0gMCkgewoJICAgJCgnW3NlY3Rpb24tc2Nyb2xsXScpLmVhY2goZnVuY3Rpb24oaSkgewoJCWlmICgkKHRoaXMpLnBvc2l0aW9uKCkudG9wIDw9IHdpbmRzY3JvbGwgKyA5MCkgewoJCSB0YXJnZXQucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoJCSB0YXJnZXQuZXEoaSkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoJCX0KCSAgIH0pOwoJICB9ZWxzZXsKCSAgIHRhcmdldC5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CgkgICAkKCcjY3NzbWVudSB1bCBsaTpmaXJzdCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKCSAgfQoKCX0pOwoKCQoJCS8vIE1lbnUganMgZm9yIFBvc2l0aW9uIGZpeGVkCgkkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKCl7CgkJdmFyIHdpbmRvd190b3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgKyAxOyAKCQlpZiAod2luZG93X3RvcCA+IDgwMCkgewoJCQkkKCcuZ2NfbWFpbl9tZW51X3dyYXBwZXInKS5hZGRDbGFzcygnbWVudV9maXhlZCBhbmltYXRlZCBmYWRlSW5Eb3duJyk7CgkJfSBlbHNlIHsKCQkJJCgnLmdjX21haW5fbWVudV93cmFwcGVyJykucmVtb3ZlQ2xhc3MoJ21lbnVfZml4ZWQgYW5pbWF0ZWQgZmFkZUluRG93bicpOwoJCX0KCX0pOwoJCgkKCSAvKi0tLSBSZXNwb25zaXZlIE1lbnUgU3RhcnQgLS0tLSovCgokKCIjdG9nZ2xlIikub24oImNsaWNrIiwgZnVuY3Rpb24oKXsKICB2YXIgdyA9ICQoJyNzaWRlYmFyJykud2lkdGgoKTsKICB2YXIgcG9zID0gJCgnI3NpZGViYXInKS5vZmZzZXQoKS5sZWZ0OwogCiAgaWYocG9zID09IDApewogICQoIiNzaWRlYmFyIikuYW5pbWF0ZSh7ImxlZnQiOiAtd30sICJzbG93Iik7CiAgfQogIGVsc2UKICB7CiAgJCgiI3NpZGViYXIiKS5hbmltYXRlKHsibGVmdCI6ICIwIn0sICJzbG93Iik7CiAgfQogIAp9KTsKCiQoIiN0b2dnbGVfY2xvc2UiKS5vbigiY2xpY2siLCBmdW5jdGlvbigpewogIHZhciB3ID0gJCgnI3NpZGViYXInKS53aWR0aCgpOwogIHZhciBwb3MgPSAkKCcjc2lkZWJhcicpLm9mZnNldCgpLmxlZnQ7CiAKICBpZihwb3MgPT0gMCl7CiAgJCgiI3NpZGViYXIiKS5hbmltYXRlKHsibGVmdCI6IC13fSwgInNsb3ciKTsKICB9CiAgZWxzZQogIHsKICAkKCIjc2lkZWJhciIpLmFuaW1hdGUoeyJsZWZ0IjogIjAifSwgInNsb3ciKTsKICB9CiAgCn0pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzY3JvbGxVcAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCQoJJC5zY3JvbGxVcCh7CiAgICAgICAgc2Nyb2xsVGV4dDogJzxpIGNsYXNzPSJmYSBmYS1hbmdsZS11cCI+PC9pPicsCiAgICAgICAgZWFzaW5nVHlwZTogJ2xpbmVhcicsCiAgICAgICAgc2Nyb2xsU3BlZWQ6IDkwMCwKICAgICAgICBhbmltYXRpb246ICdmYWRlJwogICAgfSk7IAkgICAKIAp9KShqUXVlcnkpOyAKCgovKi0tLS0tLS0tLS0tLS13YXZlcyBlZmZlY3QganMtLS0tLS0tLS0tLS0tLS0tLS0qLwoKCQkJdmFyIFNFUEFSQVRJT04gPSAyMDAsIEFNT1VOVFggPSAzMCwgQU1PVU5UWSA9IDMwOwoKCQkJdmFyIGNvbnRhaW5lciwgc3RhdHM7CgkJCXZhciBjYW1lcmEsIHNjZW5lLCByZW5kZXJlcjsKCgkJCXZhciBwYXJ0aWNsZXMsIHBhcnRpY2xlLCBjb3VudCA9IDA7CgoJCQl2YXIgbW91c2VYID0gMTAwLCBtb3VzZVkgPSAtNTUwOwoKCQkJdmFyIHdpbmRvd0hhbGZYID0gd2luZG93LmlubmVyV2lkdGggLyAyOwoJCQl2YXIgd2luZG93SGFsZlkgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyOwoKCQkJaW5pdCgpOwoJCQlhbmltYXRlKCk7CgoJCQlmdW5jdGlvbiBpbml0KCkgewoKCQkJCWNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7CgkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBjb250YWluZXIgKTsKCgkJCQljYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoIDc1LCB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodCwgMSwgMTAwMDAgKTsKCQkJCWNhbWVyYS5wb3NpdGlvbi56ID0gMTAwMDsKCgkJCQlzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpOwoKCQkJCXBhcnRpY2xlcyA9IG5ldyBBcnJheSgpOwoKCQkJCXZhciBQSTIgPSBNYXRoLlBJICogMjsKCQkJCXZhciBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TcHJpdGVDYW52YXNNYXRlcmlhbCggewoKCQkJCQljb2xvcjogMHhmZmZmZmYsCgkJCQkJCgkJCQkJcHJvZ3JhbTogZnVuY3Rpb24gKCBjb250ZXh0ICkgewoKCQkJCQkJY29udGV4dC5iZWdpblBhdGgoKTsKCQkJCQkJcmVuZGVyZXIuc2V0Q2xlYXJDb2xvckhleCggMHgwODA5MWIsIDEgKTsKCQkJCQkJY29udGV4dC5hcmMoIDAsIDAsIDAuNSwgMCwgUEkyLCB0cnVlICk7CgkJCQkJCQoJCQkJCQljb250ZXh0LmZpbGwoKTsKCgkJCQkJfQoKCQkJCX0gKTsKCgkJCQl2YXIgaSA9IDA7CgoJCQkJZm9yICggdmFyIGl4ID0gMDsgaXggPCBBTU9VTlRYOyBpeCArKyApIHsKCgkJCQkJZm9yICggdmFyIGl5ID0gMDsgaXkgPCBBTU9VTlRZOyBpeSArKyApIHsKCgkJCQkJCXBhcnRpY2xlID0gcGFydGljbGVzWyBpICsrIF0gPSBuZXcgVEhSRUUuU3ByaXRlKCBtYXRlcmlhbCApOwoJCQkJCQlwYXJ0aWNsZS5wb3NpdGlvbi54ID0gaXggKiBTRVBBUkFUSU9OIC0gKCAoIEFNT1VOVFggKiBTRVBBUkFUSU9OICkgLyAyICk7CgkJCQkJCXBhcnRpY2xlLnBvc2l0aW9uLnogPSBpeSAqIFNFUEFSQVRJT04gLSAoICggQU1PVU5UWSAqIFNFUEFSQVRJT04gKSAvIDIgKTsKCQkJCQkJc2NlbmUuYWRkKCBwYXJ0aWNsZSApOwoKCQkJCQl9CgoJCQkJfQoKCQkJCXJlbmRlcmVyID0gbmV3IFRIUkVFLkNhbnZhc1JlbmRlcmVyKCk7CgkJCQlyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyApOwoJCQkJcmVuZGVyZXIuc2V0U2l6ZSggd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCApOwoJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKCByZW5kZXJlci5kb21FbGVtZW50ICk7CgoJCQkJc3RhdHMgPSBuZXcgU3RhdHMoKTsKCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCggc3RhdHMuZG9tICk7CgoJCQkJCgoKCQkJCS8vCgoKCQkJfQoKCQkJZnVuY3Rpb24gb25XaW5kb3dSZXNpemUoKSB7CgoJCQkJd2luZG93SGFsZlggPSB3aW5kb3cuaW5uZXJXaWR0aCAvIDI7CgkJCQl3aW5kb3dIYWxmWSA9IHdpbmRvdy5pbm5lckhlaWdodCAvIDI7CgoJCQkJY2FtZXJhLmFzcGVjdCA9IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0OwoJCQkJY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCgkJCQlyZW5kZXJlci5zZXRTaXplKCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0ICk7CgoJCQl9CgoJCQkvLwoKCQkJZnVuY3Rpb24gb25Eb2N1bWVudE1vdXNlTW92ZSggZXZlbnQgKSB7CgoJCQkJbW91c2VYID0gZXZlbnQuY2xpZW50WCAtIHdpbmRvd0hhbGZYOwoJCQkJbW91c2VZID0gZXZlbnQuY2xpZW50WSAtIHdpbmRvd0hhbGZZOwoKCQkJfQoKCQkJZnVuY3Rpb24gb25Eb2N1bWVudFRvdWNoU3RhcnQoIGV2ZW50ICkgewoKCQkJCWlmICggZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgKSB7CgoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCW1vdXNlWCA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWCAtIHdpbmRvd0hhbGZYOwoJCQkJCW1vdXNlWSA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSAtIHdpbmRvd0hhbGZZOwoKCQkJCX0KCgkJCX0KCgkJCWZ1bmN0aW9uIG9uRG9jdW1lbnRUb3VjaE1vdmUoIGV2ZW50ICkgewoKCQkJCWlmICggZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgKSB7CgoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCW1vdXNlWCA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWCAtIHdpbmRvd0hhbGZYOwoJCQkJCW1vdXNlWSA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSAtIHdpbmRvd0hhbGZZOwoKCQkJCX0KCgkJCX0KCgkJCS8vCgoJCQlmdW5jdGlvbiBhbmltYXRlKCkgewoKCQkJCXJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbWF0ZSApOwoKCQkJCXJlbmRlcigpOwoJCQkJc3RhdHMudXBkYXRlKCk7CgoJCQl9CgoJCQlmdW5jdGlvbiByZW5kZXIoKSB7CgoJCQkJY2FtZXJhLnBvc2l0aW9uLnggKz0gKCBtb3VzZVggLSBjYW1lcmEucG9zaXRpb24ueCApICogLjA1OwoJCQkJY2FtZXJhLnBvc2l0aW9uLnkgKz0gKCAtIG1vdXNlWSAtIGNhbWVyYS5wb3NpdGlvbi55ICkgKiAuMDU7CgkJCQljYW1lcmEubG9va0F0KCBzY2VuZS5wb3NpdGlvbiApOwoKCQkJCXZhciBpID0gMDsKCgkJCQlmb3IgKCB2YXIgaXggPSAwOyBpeCA8IEFNT1VOVFg7IGl4ICsrICkgewoKCQkJCQlmb3IgKCB2YXIgaXkgPSAwOyBpeSA8IEFNT1VOVFk7IGl5ICsrICkgewoKCQkJCQkJcGFydGljbGUgPSBwYXJ0aWNsZXNbIGkrKyBdOwoJCQkJCQlwYXJ0aWNsZS5wb3NpdGlvbi55ID0gKCBNYXRoLnNpbiggKCBpeCArIGNvdW50ICkgKiAwLjMgKSAqIDUwICkgKwoJCQkJCQkJKCBNYXRoLnNpbiggKCBpeSArIGNvdW50ICkgKiAwLjUgKSAqIDUwICk7CgkJCQkJCXBhcnRpY2xlLnNjYWxlLnggPSBwYXJ0aWNsZS5zY2FsZS55ID0gKCBNYXRoLnNpbiggKCBpeCArIGNvdW50ICkgKiAwLjMgKSArIDEgKSAqIDQgKwoJCQkJCQkJKCBNYXRoLnNpbiggKCBpeSArIGNvdW50ICkgKiAwLjUgKSArIDEgKSAqIDQ7CgoJCQkJCX0KCgkJCQl9CgoJCQkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7CgoJCQkJY291bnQgKz0gMC4xOwoKCQkJfQ=="}},"time_used":562,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":562,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/assets/images/logoIcon/logo.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:16.886Z","timestamp":1785147796886,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /assets/images/logoIcon/logo.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=6\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:16 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 14 Jul 2024 21:16:36 GMT\r\naccept-ranges: bytes\r\ncontent-length: 2199\r\ndate: Mon, 27 Jul 2026 10:23:16 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":2199,"size_decoded":2673,"mime_type":"image/png","magic":"PNG image data, 192 x 192, 8-bit/color RGBA, non-interlaced","md5":"f4db77d327f5f1afbf2d65f193988da1","sha1":"df488ea26ac3c01e6c394e965e4d9feb34313278","sha256":"62c0d81323f403f03b85045a83c781800809a9a2d295381cb308c86f4c76f1dd","sha512":"44b1d040236f60f43c7d704ac618af7c49c4b9c2eca7a76451db10b3f905449bdd9a6dea6f23f459853ff891ce42f75ecdf3af7e5597abe2cf519b7ec4e9eb25","ssdeep":"","tlshash":"5441e9e3490623cf3a982a3c1946a5d9cefe29475a23a78f97016cf8ed52e14056ecd4","first_seen":"2025-06-25T11:59:30.654691Z","last_seen":"2026-08-11T00:25:55.279419Z","times_seen":17,"resource_available":false,"data":"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"}},"time_used":146,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":146,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/CanvasRenderer.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.291Z","timestamp":1785147795291,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/CanvasRenderer.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:26 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 5397\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":25811,"size_decoded":5941,"mime_type":"text/javascript","magic":"ASCII text","md5":"b420ec629bc1534ea32fa984d505dc40","sha1":"56db2efd90f4d657472c66bd15ec3dfeec22654c","sha256":"7f27d86f904da002876b8ef8b02e3ae6af10ccf99b17946b2b15126588bbc6cb","sha512":"e2dfa2562b017e8e30f9791265c601b28953f9ba3a2bd2552d90c9c7d2696addf761ed4855e4390e66c5ee622eed78b07f307de76273562cc8def2dc6f050ff9","ssdeep":"768:+bcxdPXXlu3+tipnjjFq03WuDCpXCe/gORCg:+bcxdPd0pnjjFq03BOR1","tlshash":"4ec254a8a77d724f162e711d511ac088a77ce06b8601d5ffac0c426819e362893fef7d","first_seen":"2025-05-31T01:51:37.432781Z","last_seen":"2026-08-11T00:25:55.27705Z","times_seen":28,"resource_available":true,"data":"LyoqCiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAqLwoKVEhSRUUuU3ByaXRlQ2FudmFzTWF0ZXJpYWwgPSBmdW5jdGlvbiAoIHBhcmFtZXRlcnMgKSB7CgoJVEhSRUUuTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKCXRoaXMudHlwZSA9ICdTcHJpdGVDYW52YXNNYXRlcmlhbCc7CgoJdGhpcy5jb2xvciA9IG5ldyBUSFJFRS5Db2xvciggMHhmZmZmZmYgKTsKCXRoaXMucHJvZ3JhbSA9IGZ1bmN0aW9uICgpIHt9OwoKCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7Cgp9OwoKVEhSRUUuU3ByaXRlQ2FudmFzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVEhSRUUuTWF0ZXJpYWwucHJvdG90eXBlICk7ClRIUkVFLlNwcml0ZUNhbnZhc01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRIUkVFLlNwcml0ZUNhbnZhc01hdGVyaWFsOwpUSFJFRS5TcHJpdGVDYW52YXNNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVDYW52YXNNYXRlcmlhbCA9IHRydWU7CgpUSFJFRS5TcHJpdGVDYW52YXNNYXRlcmlhbC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CgoJdmFyIG1hdGVyaWFsID0gbmV3IFRIUkVFLlNwcml0ZUNhbnZhc01hdGVyaWFsKCk7CgoJbWF0ZXJpYWwuY29weSggdGhpcyApOwoJbWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5jb2xvciApOwoJbWF0ZXJpYWwucHJvZ3JhbSA9IHRoaXMucHJvZ3JhbTsKCglyZXR1cm4gbWF0ZXJpYWw7Cgp9OwoKLy8KClRIUkVFLkNhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKCBwYXJhbWV0ZXJzICkgewoKCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9OwoKCXZhciBfdGhpcyA9IHRoaXMsCgkJX3JlbmRlckRhdGEsIF9lbGVtZW50cywgX2xpZ2h0cywKCQlfcHJvamVjdG9yID0gbmV3IFRIUkVFLlByb2plY3RvcigpLAoKCQlfY2FudmFzID0gcGFyYW1ldGVycy5jYW52YXMgIT09IHVuZGVmaW5lZAoJCQkJID8gcGFyYW1ldGVycy5jYW52YXMKCQkJCSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdjYW52YXMnICksCgoJCV9jYW52YXNXaWR0aCA9IF9jYW52YXMud2lkdGgsCgkJX2NhbnZhc0hlaWdodCA9IF9jYW52YXMuaGVpZ2h0LAoJCV9jYW52YXNXaWR0aEhhbGYgPSBNYXRoLmZsb29yKCBfY2FudmFzV2lkdGggLyAyICksCgkJX2NhbnZhc0hlaWdodEhhbGYgPSBNYXRoLmZsb29yKCBfY2FudmFzSGVpZ2h0IC8gMiApLAoKCQlfdmlld3BvcnRYID0gMCwKCQlfdmlld3BvcnRZID0gMCwKCQlfdmlld3BvcnRXaWR0aCA9IF9jYW52YXNXaWR0aCwKCQlfdmlld3BvcnRIZWlnaHQgPSBfY2FudmFzSGVpZ2h0LAoKCQlfcGl4ZWxSYXRpbyA9IDEsCgoJCV9jb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnLCB7CgkJCWFscGhhOiBwYXJhbWV0ZXJzLmFscGhhID09PSB0cnVlCgkJfSApLAoKCQlfY2xlYXJDb2xvciA9IG5ldyBUSFJFRS5Db2xvciggMHgwMDAwMDAgKSwKCQlfY2xlYXJBbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgPT09IHRydWUgPyAwIDogMSwKCgkJX2NvbnRleHRHbG9iYWxBbHBoYSA9IDEsCgkJX2NvbnRleHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAwLAoJCV9jb250ZXh0U3Ryb2tlU3R5bGUgPSBudWxsLAoJCV9jb250ZXh0RmlsbFN0eWxlID0gbnVsbCwKCQlfY29udGV4dExpbmVXaWR0aCA9IG51bGwsCgkJX2NvbnRleHRMaW5lQ2FwID0gbnVsbCwKCQlfY29udGV4dExpbmVKb2luID0gbnVsbCwKCQlfY29udGV4dExpbmVEYXNoID0gW10sCgoJCV92MSwgX3YyLCBfdjMsCgoJCV92MXgsIF92MXksIF92MngsIF92MnksIF92M3gsIF92M3ksCgoJCV9jb2xvciA9IG5ldyBUSFJFRS5Db2xvcigpLAoKCQlfZGlmZnVzZUNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKCksCgkJX2VtaXNzaXZlQ29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKSwKCgkJX2xpZ2h0Q29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKSwKCgkJX3BhdHRlcm5zID0ge30sCgoJCV91dnMsCgkJX3V2MXgsIF91djF5LCBfdXYyeCwgX3V2MnksIF91djN4LCBfdXYzeSwKCgkJX2NsaXBCb3ggPSBuZXcgVEhSRUUuQm94MigpLAoJCV9jbGVhckJveCA9IG5ldyBUSFJFRS5Cb3gyKCksCgkJX2VsZW1Cb3ggPSBuZXcgVEhSRUUuQm94MigpLAoKCQlfYW1iaWVudExpZ2h0ID0gbmV3IFRIUkVFLkNvbG9yKCksCgkJX2RpcmVjdGlvbmFsTGlnaHRzID0gbmV3IFRIUkVFLkNvbG9yKCksCgkJX3BvaW50TGlnaHRzID0gbmV3IFRIUkVFLkNvbG9yKCksCgoJCV92ZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKSwgLy8gTmVlZGVkIGZvciBQb2ludExpZ2h0CgkJX2NlbnRyb2lkID0gbmV3IFRIUkVFLlZlY3RvcjMoKSwKCQlfbm9ybWFsID0gbmV3IFRIUkVFLlZlY3RvcjMoKSwKCQlfbm9ybWFsVmlld01hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXgzKCk7CgoJLyogVE9ETwoJX2NhbnZhcy5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTsKCV9jYW52YXMud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CglfY2FudmFzLm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CglfY2FudmFzLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlOwoJKi8KCgkvLyBkYXNoK2dhcCBmYWxsYmFja3MgZm9yIEZpcmVmb3ggYW5kIGV2ZXJ5dGhpbmcgZWxzZQoKCWlmICggX2NvbnRleHQuc2V0TGluZURhc2ggPT09IHVuZGVmaW5lZCApIHsKCgkJX2NvbnRleHQuc2V0TGluZURhc2ggPSBmdW5jdGlvbiAoKSB7fTsKCgl9CgoJdGhpcy5kb21FbGVtZW50ID0gX2NhbnZhczsKCgl0aGlzLmF1dG9DbGVhciA9IHRydWU7Cgl0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTsKCXRoaXMuc29ydEVsZW1lbnRzID0gdHJ1ZTsKCgl0aGlzLmluZm8gPSB7CgoJCXJlbmRlcjogewoKCQkJdmVydGljZXM6IDAsCgkJCWZhY2VzOiAwCgoJCX0KCgl9OwoKCS8vIFdlYkdMUmVuZGVyZXIgY29tcGF0aWJpbGl0eQoKCXRoaXMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA9IGZ1bmN0aW9uICgpIHt9OwoJdGhpcy5zZXRGYWNlQ3VsbGluZyA9IGZ1bmN0aW9uICgpIHt9OwoKCS8vIEFQSQoKCXRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHsKCgkJcmV0dXJuIF9jb250ZXh0OwoKCX07CgoJdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHsKCgkJcmV0dXJuIF9jb250ZXh0LmdldENvbnRleHRBdHRyaWJ1dGVzKCk7CgoJfTsKCgl0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7CgoJCXJldHVybiBfcGl4ZWxSYXRpbzsKCgl9OwoKCXRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7CgoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIF9waXhlbFJhdGlvID0gdmFsdWU7CgoJfTsKCgl0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkgewoKCQlfY2FudmFzV2lkdGggPSB3aWR0aCAqIF9waXhlbFJhdGlvOwoJCV9jYW52YXNIZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbzsKCgkJX2NhbnZhcy53aWR0aCA9IF9jYW52YXNXaWR0aDsKCQlfY2FudmFzLmhlaWdodCA9IF9jYW52YXNIZWlnaHQ7CgoJCV9jYW52YXNXaWR0aEhhbGYgPSBNYXRoLmZsb29yKCBfY2FudmFzV2lkdGggLyAyICk7CgkJX2NhbnZhc0hlaWdodEhhbGYgPSBNYXRoLmZsb29yKCBfY2FudmFzSGVpZ2h0IC8gMiApOwoKCQlpZiAoIHVwZGF0ZVN0eWxlICE9PSBmYWxzZSApIHsKCgkJCV9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CgkJCV9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKCgkJfQoKCQlfY2xpcEJveC5taW4uc2V0KCAtIF9jYW52YXNXaWR0aEhhbGYsIC0gX2NhbnZhc0hlaWdodEhhbGYgKTsKCQlfY2xpcEJveC5tYXguc2V0KCAgIF9jYW52YXNXaWR0aEhhbGYsICAgX2NhbnZhc0hlaWdodEhhbGYgKTsKCgkJX2NsZWFyQm94Lm1pbi5zZXQoIC0gX2NhbnZhc1dpZHRoSGFsZiwgLSBfY2FudmFzSGVpZ2h0SGFsZiApOwoJCV9jbGVhckJveC5tYXguc2V0KCAgIF9jYW52YXNXaWR0aEhhbGYsICAgX2NhbnZhc0hlaWdodEhhbGYgKTsKCgkJX2NvbnRleHRHbG9iYWxBbHBoYSA9IDE7CgkJX2NvbnRleHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAwOwoJCV9jb250ZXh0U3Ryb2tlU3R5bGUgPSBudWxsOwoJCV9jb250ZXh0RmlsbFN0eWxlID0gbnVsbDsKCQlfY29udGV4dExpbmVXaWR0aCA9IG51bGw7CgkJX2NvbnRleHRMaW5lQ2FwID0gbnVsbDsKCQlfY29udGV4dExpbmVKb2luID0gbnVsbDsKCgkJdGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApOwoKCX07CgoJdGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHsKCgkJX3ZpZXdwb3J0WCA9IHggKiBfcGl4ZWxSYXRpbzsKCQlfdmlld3BvcnRZID0geSAqIF9waXhlbFJhdGlvOwoKCQlfdmlld3BvcnRXaWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87CgkJX3ZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0ICogX3BpeGVsUmF0aW87CgoJfTsKCgl0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoKSB7fTsKCXRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoKSB7fTsKCgl0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHsKCgkJX2NsZWFyQ29sb3Iuc2V0KCBjb2xvciApOwoJCV9jbGVhckFscGhhID0gYWxwaGEgIT09IHVuZGVmaW5lZCA/IGFscGhhIDogMTsKCgkJX2NsZWFyQm94Lm1pbi5zZXQoIC0gX2NhbnZhc1dpZHRoSGFsZiwgLSBfY2FudmFzSGVpZ2h0SGFsZiApOwoJCV9jbGVhckJveC5tYXguc2V0KCAgIF9jYW52YXNXaWR0aEhhbGYsICAgX2NhbnZhc0hlaWdodEhhbGYgKTsKCgl9OwoKCXRoaXMuc2V0Q2xlYXJDb2xvckhleCA9IGZ1bmN0aW9uICggaGV4LCBhbHBoYSApIHsKCgkJCgkJdGhpcy5zZXRDbGVhckNvbG9yKCBoZXgsIGFscGhhICk7CgoJfTsKCgl0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7CgoJCXJldHVybiBfY2xlYXJDb2xvcjsKCgl9OwoKCXRoaXMuZ2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICgpIHsKCgkJcmV0dXJuIF9jbGVhckFscGhhOwoKCX07CgoJdGhpcy5nZXRNYXhBbmlzb3Ryb3B5ID0gZnVuY3Rpb24gKCkgewoKCQlyZXR1cm4gMDsKCgl9OwoKCXRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CgoJCWlmICggX2NsZWFyQm94LmlzRW1wdHkoKSA9PT0gZmFsc2UgKSB7CgoJCQlfY2xlYXJCb3guaW50ZXJzZWN0KCBfY2xpcEJveCApOwoJCQlfY2xlYXJCb3guZXhwYW5kQnlTY2FsYXIoIDIgKTsKCgkJCV9jbGVhckJveC5taW4ueCA9ICAgX2NsZWFyQm94Lm1pbi54ICsgX2NhbnZhc1dpZHRoSGFsZjsKCQkJX2NsZWFyQm94Lm1pbi55ID0gLSBfY2xlYXJCb3gubWluLnkgKyBfY2FudmFzSGVpZ2h0SGFsZjsJCS8vIGhpZ2hlciB5IHZhbHVlICEKCQkJX2NsZWFyQm94Lm1heC54ID0gICBfY2xlYXJCb3gubWF4LnggKyBfY2FudmFzV2lkdGhIYWxmOwoJCQlfY2xlYXJCb3gubWF4LnkgPSAtIF9jbGVhckJveC5tYXgueSArIF9jYW52YXNIZWlnaHRIYWxmOwkJLy8gbG93ZXIgeSB2YWx1ZSAhCgoJCQlpZiAoIF9jbGVhckFscGhhIDwgMSApIHsKCgkJCQlfY29udGV4dC5jbGVhclJlY3QoCgkJCQkJX2NsZWFyQm94Lm1pbi54IHwgMCwKCQkJCQlfY2xlYXJCb3gubWF4LnkgfCAwLAoJCQkJCSggX2NsZWFyQm94Lm1heC54IC0gX2NsZWFyQm94Lm1pbi54ICkgfCAwLAoJCQkJCSggX2NsZWFyQm94Lm1pbi55IC0gX2NsZWFyQm94Lm1heC55ICkgfCAwCgkJCQkpOwoKCQkJfQoKCQkJaWYgKCBfY2xlYXJBbHBoYSA+IDAgKSB7CgoJCQkJc2V0T3BhY2l0eSggMSApOwoJCQkJc2V0QmxlbmRpbmcoIFRIUkVFLk5vcm1hbEJsZW5kaW5nICk7CgoJCQkJc2V0RmlsbFN0eWxlKCAncmdiYSgnICsgTWF0aC5mbG9vciggX2NsZWFyQ29sb3IuciAqIDI1NSApICsgJywnICsgTWF0aC5mbG9vciggX2NsZWFyQ29sb3IuZyAqIDI1NSApICsgJywnICsgTWF0aC5mbG9vciggX2NsZWFyQ29sb3IuYiAqIDI1NSApICsgJywnICsgX2NsZWFyQWxwaGEgKyAnKScgKTsKCgkJCQlfY29udGV4dC5maWxsUmVjdCgKCQkJCQlfY2xlYXJCb3gubWluLnggfCAwLAoJCQkJCV9jbGVhckJveC5tYXgueSB8IDAsCgkJCQkJKCBfY2xlYXJCb3gubWF4LnggLSBfY2xlYXJCb3gubWluLnggKSB8IDAsCgkJCQkJKCBfY2xlYXJCb3gubWluLnkgLSBfY2xlYXJCb3gubWF4LnkgKSB8IDAKCQkJCSk7CgoJCQl9CgoJCQlfY2xlYXJCb3gubWFrZUVtcHR5KCk7CgoJCX0KCgl9OwoKCS8vIGNvbXBhdGliaWxpdHkKCgl0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTsKCXRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHt9OwoJdGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7fTsKCgl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHsKCgkJaWYgKCBjYW1lcmEuaXNDYW1lcmEgPT09IHVuZGVmaW5lZCApIHsKCgkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5DYW52YXNSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTsKCQkJcmV0dXJuOwoKCQl9CgoJCXZhciBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDsKCgkJaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDb2xvciApIHsKCgkJCXNldE9wYWNpdHkoIDEgKTsKCQkJc2V0QmxlbmRpbmcoIFRIUkVFLk5vcm1hbEJsZW5kaW5nICk7CgoJCQlzZXRGaWxsU3R5bGUoIGJhY2tncm91bmQuZ2V0U3R5bGUoKSApOwoJCQlfY29udGV4dC5maWxsUmVjdCggMCwgMCwgX2NhbnZhc1dpZHRoLCBfY2FudmFzSGVpZ2h0ICk7CgoJCX0gZWxzZSBpZiAoIHRoaXMuYXV0b0NsZWFyID09PSB0cnVlICkgewoKCQkJdGhpcy5jbGVhcigpOwoKCQl9CgoJCV90aGlzLmluZm8ucmVuZGVyLnZlcnRpY2VzID0gMDsKCQlfdGhpcy5pbmZvLnJlbmRlci5mYWNlcyA9IDA7CgoJCV9jb250ZXh0LnNldFRyYW5zZm9ybSggX3ZpZXdwb3J0V2lkdGggLyBfY2FudmFzV2lkdGgsIDAsIDAsIC0gX3ZpZXdwb3J0SGVpZ2h0IC8gX2NhbnZhc0hlaWdodCwgX3ZpZXdwb3J0WCwgX2NhbnZhc0hlaWdodCAtIF92aWV3cG9ydFkgKTsKCQlfY29udGV4dC50cmFuc2xhdGUoIF9jYW52YXNXaWR0aEhhbGYsIF9jYW52YXNIZWlnaHRIYWxmICk7CgoJCV9yZW5kZXJEYXRhID0gX3Byb2plY3Rvci5wcm9qZWN0U2NlbmUoIHNjZW5lLCBjYW1lcmEsIHRoaXMuc29ydE9iamVjdHMsIHRoaXMuc29ydEVsZW1lbnRzICk7CgkJX2VsZW1lbnRzID0gX3JlbmRlckRhdGEuZWxlbWVudHM7CgkJX2xpZ2h0cyA9IF9yZW5kZXJEYXRhLmxpZ2h0czsKCgkJX25vcm1hbFZpZXdNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CgoJCS8qIERFQlVHCgkJc2V0RmlsbFN0eWxlKCAncmdiYSggMCwgMjU1LCAyNTUsIDAuNSApJyApOwoJCV9jb250ZXh0LmZpbGxSZWN0KCBfY2xpcEJveC5taW4ueCwgX2NsaXBCb3gubWluLnksIF9jbGlwQm94Lm1heC54IC0gX2NsaXBCb3gubWluLngsIF9jbGlwQm94Lm1heC55IC0gX2NsaXBCb3gubWluLnkgKTsKCQkqLwoKCQljYWxjdWxhdGVMaWdodHMoKTsKCgkJZm9yICggdmFyIGUgPSAwLCBlbCA9IF9lbGVtZW50cy5sZW5ndGg7IGUgPCBlbDsgZSArKyApIHsKCgkJCXZhciBlbGVtZW50ID0gX2VsZW1lbnRzWyBlIF07CgoJCQl2YXIgbWF0ZXJpYWwgPSBlbGVtZW50Lm1hdGVyaWFsOwoKCQkJaWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkIHx8IG1hdGVyaWFsLm9wYWNpdHkgPT09IDAgKSBjb250aW51ZTsKCgkJCV9lbGVtQm94Lm1ha2VFbXB0eSgpOwoKCQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVEhSRUUuUmVuZGVyYWJsZVNwcml0ZSApIHsKCgkJCQlfdjEgPSBlbGVtZW50OwoJCQkJX3YxLnggKj0gX2NhbnZhc1dpZHRoSGFsZjsgX3YxLnkgKj0gX2NhbnZhc0hlaWdodEhhbGY7CgoJCQkJcmVuZGVyU3ByaXRlKCBfdjEsIGVsZW1lbnQsIG1hdGVyaWFsICk7CgoJCQl9IGVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVEhSRUUuUmVuZGVyYWJsZUxpbmUgKSB7CgoJCQkJX3YxID0gZWxlbWVudC52MTsgX3YyID0gZWxlbWVudC52MjsKCgkJCQlfdjEucG9zaXRpb25TY3JlZW4ueCAqPSBfY2FudmFzV2lkdGhIYWxmOyBfdjEucG9zaXRpb25TY3JlZW4ueSAqPSBfY2FudmFzSGVpZ2h0SGFsZjsKCQkJCV92Mi5wb3NpdGlvblNjcmVlbi54ICo9IF9jYW52YXNXaWR0aEhhbGY7IF92Mi5wb3NpdGlvblNjcmVlbi55ICo9IF9jYW52YXNIZWlnaHRIYWxmOwoKCQkJCV9lbGVtQm94LnNldEZyb21Qb2ludHMoIFsKCQkJCQlfdjEucG9zaXRpb25TY3JlZW4sCgkJCQkJX3YyLnBvc2l0aW9uU2NyZWVuCgkJCQldICk7CgoJCQkJaWYgKCBfY2xpcEJveC5pbnRlcnNlY3RzQm94KCBfZWxlbUJveCApID09PSB0cnVlICkgewoKCQkJCQlyZW5kZXJMaW5lKCBfdjEsIF92MiwgZWxlbWVudCwgbWF0ZXJpYWwgKTsKCgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVEhSRUUuUmVuZGVyYWJsZUZhY2UgKSB7CgoJCQkJX3YxID0gZWxlbWVudC52MTsgX3YyID0gZWxlbWVudC52MjsgX3YzID0gZWxlbWVudC52MzsKCgkJCQlpZiAoIF92MS5wb3NpdGlvblNjcmVlbi56IDwgLSAxIHx8IF92MS5wb3NpdGlvblNjcmVlbi56ID4gMSApIGNvbnRpbnVlOwoJCQkJaWYgKCBfdjIucG9zaXRpb25TY3JlZW4ueiA8IC0gMSB8fCBfdjIucG9zaXRpb25TY3JlZW4ueiA+IDEgKSBjb250aW51ZTsKCQkJCWlmICggX3YzLnBvc2l0aW9uU2NyZWVuLnogPCAtIDEgfHwgX3YzLnBvc2l0aW9uU2NyZWVuLnogPiAxICkgY29udGludWU7CgoJCQkJX3YxLnBvc2l0aW9uU2NyZWVuLnggKj0gX2NhbnZhc1dpZHRoSGFsZjsgX3YxLnBvc2l0aW9uU2NyZWVuLnkgKj0gX2NhbnZhc0hlaWdodEhhbGY7CgkJCQlfdjIucG9zaXRpb25TY3JlZW4ueCAqPSBfY2FudmFzV2lkdGhIYWxmOyBfdjIucG9zaXRpb25TY3JlZW4ueSAqPSBfY2FudmFzSGVpZ2h0SGFsZjsKCQkJCV92My5wb3NpdGlvblNjcmVlbi54ICo9IF9jYW52YXNXaWR0aEhhbGY7IF92My5wb3NpdGlvblNjcmVlbi55ICo9IF9jYW52YXNIZWlnaHRIYWxmOwoKCQkJCWlmICggbWF0ZXJpYWwub3ZlcmRyYXcgPiAwICkgewoKCQkJCQlleHBhbmQoIF92MS5wb3NpdGlvblNjcmVlbiwgX3YyLnBvc2l0aW9uU2NyZWVuLCBtYXRlcmlhbC5vdmVyZHJhdyApOwoJCQkJCWV4cGFuZCggX3YyLnBvc2l0aW9uU2NyZWVuLCBfdjMucG9zaXRpb25TY3JlZW4sIG1hdGVyaWFsLm92ZXJkcmF3ICk7CgkJCQkJZXhwYW5kKCBfdjMucG9zaXRpb25TY3JlZW4sIF92MS5wb3NpdGlvblNjcmVlbiwgbWF0ZXJpYWwub3ZlcmRyYXcgKTsKCgkJCQl9CgoJCQkJX2VsZW1Cb3guc2V0RnJvbVBvaW50cyggWwoJCQkJCV92MS5wb3NpdGlvblNjcmVlbiwKCQkJCQlfdjIucG9zaXRpb25TY3JlZW4sCgkJCQkJX3YzLnBvc2l0aW9uU2NyZWVuCgkJCQldICk7CgoJCQkJaWYgKCBfY2xpcEJveC5pbnRlcnNlY3RzQm94KCBfZWxlbUJveCApID09PSB0cnVlICkgewoKCQkJCQlyZW5kZXJGYWNlMyggX3YxLCBfdjIsIF92MywgMCwgMSwgMiwgZWxlbWVudCwgbWF0ZXJpYWwgKTsKCgkJCQl9CgoJCQl9CgoJCQkvKiBERUJVRwoJCQlzZXRMaW5lV2lkdGgoIDEgKTsKCQkJc2V0U3Ryb2tlU3R5bGUoICdyZ2JhKCAwLCAyNTUsIDAsIDAuNSApJyApOwoJCQlfY29udGV4dC5zdHJva2VSZWN0KCBfZWxlbUJveC5taW4ueCwgX2VsZW1Cb3gubWluLnksIF9lbGVtQm94Lm1heC54IC0gX2VsZW1Cb3gubWluLngsIF9lbGVtQm94Lm1heC55IC0gX2VsZW1Cb3gubWluLnkgKTsKCQkJKi8KCgkJCV9jbGVhckJveC51bmlvbiggX2VsZW1Cb3ggKTsKCgkJfQoKCQkvKiBERUJVRwoJCXNldExpbmVXaWR0aCggMSApOwoJCXNldFN0cm9rZVN0eWxlKCAncmdiYSggMjU1LCAwLCAwLCAwLjUgKScgKTsKCQlfY29udGV4dC5zdHJva2VSZWN0KCBfY2xlYXJCb3gubWluLngsIF9jbGVhckJveC5taW4ueSwgX2NsZWFyQm94Lm1heC54IC0gX2NsZWFyQm94Lm1pbi54LCBfY2xlYXJCb3gubWF4LnkgLSBfY2xlYXJCb3gubWluLnkgKTsKCQkqLwoKCQlfY29udGV4dC5zZXRUcmFuc2Zvcm0oIDEsIDAsIDAsIDEsIDAsIDAgKTsKCgl9OwoKCS8vCgoJZnVuY3Rpb24gY2FsY3VsYXRlTGlnaHRzKCkgewoKCQlfYW1iaWVudExpZ2h0LnNldFJHQiggMCwgMCwgMCApOwoJCV9kaXJlY3Rpb25hbExpZ2h0cy5zZXRSR0IoIDAsIDAsIDAgKTsKCQlfcG9pbnRMaWdodHMuc2V0UkdCKCAwLCAwLCAwICk7CgoJCWZvciAoIHZhciBsID0gMCwgbGwgPSBfbGlnaHRzLmxlbmd0aDsgbCA8IGxsOyBsICsrICkgewoKCQkJdmFyIGxpZ2h0ID0gX2xpZ2h0c1sgbCBdOwoJCQl2YXIgbGlnaHRDb2xvciA9IGxpZ2h0LmNvbG9yOwoKCQkJaWYgKCBsaWdodC5pc0FtYmllbnRMaWdodCApIHsKCgkJCQlfYW1iaWVudExpZ2h0LmFkZCggbGlnaHRDb2xvciApOwoKCQkJfSBlbHNlIGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkgewoKCQkJCS8vIGZvciBzcHJpdGVzCgoJCQkJX2RpcmVjdGlvbmFsTGlnaHRzLmFkZCggbGlnaHRDb2xvciApOwoKCQkJfSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkgewoKCQkJCS8vIGZvciBzcHJpdGVzCgoJCQkJX3BvaW50TGlnaHRzLmFkZCggbGlnaHRDb2xvciApOwoKCQkJfQoKCQl9CgoJfQoKCWZ1bmN0aW9uIGNhbGN1bGF0ZUxpZ2h0KCBwb3NpdGlvbiwgbm9ybWFsLCBjb2xvciApIHsKCgkJZm9yICggdmFyIGwgPSAwLCBsbCA9IF9saWdodHMubGVuZ3RoOyBsIDwgbGw7IGwgKysgKSB7CgoJCQl2YXIgbGlnaHQgPSBfbGlnaHRzWyBsIF07CgoJCQlfbGlnaHRDb2xvci5jb3B5KCBsaWdodC5jb2xvciApOwoKCQkJaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7CgoJCQkJdmFyIGxpZ2h0UG9zaXRpb24gPSBfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICkubm9ybWFsaXplKCk7CgoJCQkJdmFyIGFtb3VudCA9IG5vcm1hbC5kb3QoIGxpZ2h0UG9zaXRpb24gKTsKCgkJCQlpZiAoIGFtb3VudCA8PSAwICkgY29udGludWU7CgoJCQkJYW1vdW50ICo9IGxpZ2h0LmludGVuc2l0eTsKCgkJCQljb2xvci5hZGQoIF9saWdodENvbG9yLm11bHRpcGx5U2NhbGFyKCBhbW91bnQgKSApOwoKCQkJfSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkgewoKCQkJCXZhciBsaWdodFBvc2l0aW9uID0gX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApOwoKCQkJCXZhciBhbW91bnQgPSBub3JtYWwuZG90KCBfdmVjdG9yMy5zdWJWZWN0b3JzKCBsaWdodFBvc2l0aW9uLCBwb3NpdGlvbiApLm5vcm1hbGl6ZSgpICk7CgoJCQkJaWYgKCBhbW91bnQgPD0gMCApIGNvbnRpbnVlOwoKCQkJCWFtb3VudCAqPSBsaWdodC5kaXN0YW5jZSA9PSAwID8gMSA6IDEgLSBNYXRoLm1pbiggcG9zaXRpb24uZGlzdGFuY2VUbyggbGlnaHRQb3NpdGlvbiApIC8gbGlnaHQuZGlzdGFuY2UsIDEgKTsKCgkJCQlpZiAoIGFtb3VudCA9PSAwICkgY29udGludWU7CgoJCQkJYW1vdW50ICo9IGxpZ2h0LmludGVuc2l0eTsKCgkJCQljb2xvci5hZGQoIF9saWdodENvbG9yLm11bHRpcGx5U2NhbGFyKCBhbW91bnQgKSApOwoKCQkJfQoKCQl9CgoJfQoKCWZ1bmN0aW9uIHJlbmRlclNwcml0ZSggdjEsIGVsZW1lbnQsIG1hdGVyaWFsICkgewoKCQlzZXRPcGFjaXR5KCBtYXRlcmlhbC5vcGFjaXR5ICk7CgkJc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nICk7CgoJCXZhciBzY2FsZVggPSBlbGVtZW50LnNjYWxlLnggKiBfY2FudmFzV2lkdGhIYWxmOwoJCXZhciBzY2FsZVkgPSBlbGVtZW50LnNjYWxlLnkgKiBfY2FudmFzSGVpZ2h0SGFsZjsKCgkJdmFyIGRpc3QgPSBNYXRoLnNxcnQoIHNjYWxlWCAqIHNjYWxlWCArIHNjYWxlWSAqIHNjYWxlWSApOyAvLyBhbGxvdyBmb3Igcm90YXRlZCBzcHJpdGUKCQlfZWxlbUJveC5taW4uc2V0KCB2MS54IC0gZGlzdCwgdjEueSAtIGRpc3QgKTsKCQlfZWxlbUJveC5tYXguc2V0KCB2MS54ICsgZGlzdCwgdjEueSArIGRpc3QgKTsKCgkJaWYgKCBtYXRlcmlhbC5pc1Nwcml0ZU1hdGVyaWFsICkgewoKCQkJdmFyIHRleHR1cmUgPSBtYXRlcmlhbC5tYXA7CgoJCQlpZiAoIHRleHR1cmUgIT09IG51bGwgKSB7CgoJCQkJdmFyIHBhdHRlcm4gPSBfcGF0dGVybnNbIHRleHR1cmUuaWQgXTsKCgkJCQlpZiAoIHBhdHRlcm4gPT09IHVuZGVmaW5lZCB8fCBwYXR0ZXJuLnZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHsKCgkJCQkJcGF0dGVybiA9IHRleHR1cmVUb1BhdHRlcm4oIHRleHR1cmUgKTsKCQkJCQlfcGF0dGVybnNbIHRleHR1cmUuaWQgXSA9IHBhdHRlcm47CgoJCQkJfQoKCQkJCWlmICggcGF0dGVybi5jYW52YXMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJc2V0RmlsbFN0eWxlKCBwYXR0ZXJuLmNhbnZhcyApOwoKCQkJCQl2YXIgYml0bWFwID0gdGV4dHVyZS5pbWFnZTsKCgkJCQkJdmFyIG94ID0gYml0bWFwLndpZHRoICogdGV4dHVyZS5vZmZzZXQueDsKCQkJCQl2YXIgb3kgPSBiaXRtYXAuaGVpZ2h0ICogdGV4dHVyZS5vZmZzZXQueTsKCgkJCQkJdmFyIHN4ID0gYml0bWFwLndpZHRoICogdGV4dHVyZS5yZXBlYXQueDsKCQkJCQl2YXIgc3kgPSBiaXRtYXAuaGVpZ2h0ICogdGV4dHVyZS5yZXBlYXQueTsKCgkJCQkJdmFyIGN4ID0gc2NhbGVYIC8gc3g7CgkJCQkJdmFyIGN5ID0gc2NhbGVZIC8gc3k7CgoJCQkJCV9jb250ZXh0LnNhdmUoKTsKCQkJCQlfY29udGV4dC50cmFuc2xhdGUoIHYxLngsIHYxLnkgKTsKCQkJCQlpZiAoIG1hdGVyaWFsLnJvdGF0aW9uICE9PSAwICkgX2NvbnRleHQucm90YXRlKCBtYXRlcmlhbC5yb3RhdGlvbiApOwoJCQkJCV9jb250ZXh0LnRyYW5zbGF0ZSggLSBzY2FsZVggLyAyLCAtIHNjYWxlWSAvIDIgKTsKCQkJCQlfY29udGV4dC5zY2FsZSggY3gsIGN5ICk7CgkJCQkJX2NvbnRleHQudHJhbnNsYXRlKCAtIG94LCAtIG95ICk7CgkJCQkJX2NvbnRleHQuZmlsbFJlY3QoIG94LCBveSwgc3gsIHN5ICk7CgkJCQkJX2NvbnRleHQucmVzdG9yZSgpOwoKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJLy8gbm8gdGV4dHVyZQoKCQkJCXNldEZpbGxTdHlsZSggbWF0ZXJpYWwuY29sb3IuZ2V0U3R5bGUoKSApOwoKCQkJCV9jb250ZXh0LnNhdmUoKTsKCQkJCV9jb250ZXh0LnRyYW5zbGF0ZSggdjEueCwgdjEueSApOwoJCQkJaWYgKCBtYXRlcmlhbC5yb3RhdGlvbiAhPT0gMCApIF9jb250ZXh0LnJvdGF0ZSggbWF0ZXJpYWwucm90YXRpb24gKTsKCQkJCV9jb250ZXh0LnNjYWxlKCBzY2FsZVgsIC0gc2NhbGVZICk7CgkJCQlfY29udGV4dC5maWxsUmVjdCggLSAwLjUsIC0gMC41LCAxLCAxICk7CgkJCQlfY29udGV4dC5yZXN0b3JlKCk7CgoJCQl9CgoJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU3ByaXRlQ2FudmFzTWF0ZXJpYWwgKSB7CgoJCQlzZXRTdHJva2VTdHlsZSggbWF0ZXJpYWwuY29sb3IuZ2V0U3R5bGUoKSApOwoJCQlzZXRGaWxsU3R5bGUoIG1hdGVyaWFsLmNvbG9yLmdldFN0eWxlKCkgKTsKCgkJCV9jb250ZXh0LnNhdmUoKTsKCQkJX2NvbnRleHQudHJhbnNsYXRlKCB2MS54LCB2MS55ICk7CgkJCWlmICggbWF0ZXJpYWwucm90YXRpb24gIT09IDAgKSBfY29udGV4dC5yb3RhdGUoIG1hdGVyaWFsLnJvdGF0aW9uICk7CgkJCV9jb250ZXh0LnNjYWxlKCBzY2FsZVgsIHNjYWxlWSApOwoKCQkJbWF0ZXJpYWwucHJvZ3JhbSggX2NvbnRleHQgKTsKCgkJCV9jb250ZXh0LnJlc3RvcmUoKTsKCgkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHsKCgkJCXNldEZpbGxTdHlsZSggbWF0ZXJpYWwuY29sb3IuZ2V0U3R5bGUoKSApOwoKCQkJX2NvbnRleHQuc2F2ZSgpOwoJCQlfY29udGV4dC50cmFuc2xhdGUoIHYxLngsIHYxLnkgKTsKCQkJaWYgKCBtYXRlcmlhbC5yb3RhdGlvbiAhPT0gMCApIF9jb250ZXh0LnJvdGF0ZSggbWF0ZXJpYWwucm90YXRpb24gKTsKCQkJX2NvbnRleHQuc2NhbGUoIHNjYWxlWCAqIG1hdGVyaWFsLnNpemUsIC0gc2NhbGVZICogbWF0ZXJpYWwuc2l6ZSApOwoJCQlfY29udGV4dC5maWxsUmVjdCggLSAwLjUsIC0gMC41LCAxLCAxICk7CgkJCV9jb250ZXh0LnJlc3RvcmUoKTsKCgkJfQoKCQkvKiBERUJVRwoJCXNldFN0cm9rZVN0eWxlKCAncmdiKDI1NSwyNTUsMCknICk7CgkJX2NvbnRleHQuYmVnaW5QYXRoKCk7CgkJX2NvbnRleHQubW92ZVRvKCB2MS54IC0gMTAsIHYxLnkgKTsKCQlfY29udGV4dC5saW5lVG8oIHYxLnggKyAxMCwgdjEueSApOwoJCV9jb250ZXh0Lm1vdmVUbyggdjEueCwgdjEueSAtIDEwICk7CgkJX2NvbnRleHQubGluZVRvKCB2MS54LCB2MS55ICsgMTAgKTsKCQlfY29udGV4dC5zdHJva2UoKTsKCQkqLwoKCX0KCglmdW5jdGlvbiByZW5kZXJMaW5lKCB2MSwgdjIsIGVsZW1lbnQsIG1hdGVyaWFsICkgewoKCQlzZXRPcGFjaXR5KCBtYXRlcmlhbC5vcGFjaXR5ICk7CgkJc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nICk7CgoJCV9jb250ZXh0LmJlZ2luUGF0aCgpOwoJCV9jb250ZXh0Lm1vdmVUbyggdjEucG9zaXRpb25TY3JlZW4ueCwgdjEucG9zaXRpb25TY3JlZW4ueSApOwoJCV9jb250ZXh0LmxpbmVUbyggdjIucG9zaXRpb25TY3JlZW4ueCwgdjIucG9zaXRpb25TY3JlZW4ueSApOwoKCQlpZiAoIG1hdGVyaWFsLmlzTGluZUJhc2ljTWF0ZXJpYWwgKSB7CgoJCQlzZXRMaW5lV2lkdGgoIG1hdGVyaWFsLmxpbmV3aWR0aCApOwoJCQlzZXRMaW5lQ2FwKCBtYXRlcmlhbC5saW5lY2FwICk7CgkJCXNldExpbmVKb2luKCBtYXRlcmlhbC5saW5lam9pbiApOwoKCQkJaWYgKCBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgIT09IFRIUkVFLlZlcnRleENvbG9ycyApIHsKCgkJCQlzZXRTdHJva2VTdHlsZSggbWF0ZXJpYWwuY29sb3IuZ2V0U3R5bGUoKSApOwoKCQkJfSBlbHNlIHsKCgkJCQl2YXIgY29sb3JTdHlsZTEgPSBlbGVtZW50LnZlcnRleENvbG9yc1sgMCBdLmdldFN0eWxlKCk7CgkJCQl2YXIgY29sb3JTdHlsZTIgPSBlbGVtZW50LnZlcnRleENvbG9yc1sgMSBdLmdldFN0eWxlKCk7CgoJCQkJaWYgKCBjb2xvclN0eWxlMSA9PT0gY29sb3JTdHlsZTIgKSB7CgoJCQkJCXNldFN0cm9rZVN0eWxlKCBjb2xvclN0eWxlMSApOwoKCQkJCX0gZWxzZSB7CgoJCQkJCXRyeSB7CgoJCQkJCQl2YXIgZ3JhZCA9IF9jb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KAoJCQkJCQkJdjEucG9zaXRpb25TY3JlZW4ueCwKCQkJCQkJCXYxLnBvc2l0aW9uU2NyZWVuLnksCgkJCQkJCQl2Mi5wb3NpdGlvblNjcmVlbi54LAoJCQkJCQkJdjIucG9zaXRpb25TY3JlZW4ueQoJCQkJCQkpOwoJCQkJCQlncmFkLmFkZENvbG9yU3RvcCggMCwgY29sb3JTdHlsZTEgKTsKCQkJCQkJZ3JhZC5hZGRDb2xvclN0b3AoIDEsIGNvbG9yU3R5bGUyICk7CgoJCQkJCX0gY2F0Y2ggKCBleGNlcHRpb24gKSB7CgoJCQkJCQlncmFkID0gY29sb3JTdHlsZTE7CgoJCQkJCX0KCgkJCQkJc2V0U3Ryb2tlU3R5bGUoIGdyYWQgKTsKCgkJCQl9CgoJCQl9CgoJCQlpZiAoIG1hdGVyaWFsLmlzTGluZURhc2hlZE1hdGVyaWFsICkgewoKCQkJCXNldExpbmVEYXNoKCBbIG1hdGVyaWFsLmRhc2hTaXplLCBtYXRlcmlhbC5nYXBTaXplIF0gKTsKCgkJCX0KCgkJCV9jb250ZXh0LnN0cm9rZSgpOwoJCQlfZWxlbUJveC5leHBhbmRCeVNjYWxhciggbWF0ZXJpYWwubGluZXdpZHRoICogMiApOwoKCQkJaWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHsKCgkJCQlzZXRMaW5lRGFzaCggW10gKTsKCgkJCX0KCgkJfQoKCX0KCglmdW5jdGlvbiByZW5kZXJGYWNlMyggdjEsIHYyLCB2MywgdXYxLCB1djIsIHV2MywgZWxlbWVudCwgbWF0ZXJpYWwgKSB7CgoJCV90aGlzLmluZm8ucmVuZGVyLnZlcnRpY2VzICs9IDM7CgkJX3RoaXMuaW5mby5yZW5kZXIuZmFjZXMgKys7CgoJCXNldE9wYWNpdHkoIG1hdGVyaWFsLm9wYWNpdHkgKTsKCQlzZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcgKTsKCgkJX3YxeCA9IHYxLnBvc2l0aW9uU2NyZWVuLng7IF92MXkgPSB2MS5wb3NpdGlvblNjcmVlbi55OwoJCV92MnggPSB2Mi5wb3NpdGlvblNjcmVlbi54OyBfdjJ5ID0gdjIucG9zaXRpb25TY3JlZW4ueTsKCQlfdjN4ID0gdjMucG9zaXRpb25TY3JlZW4ueDsgX3YzeSA9IHYzLnBvc2l0aW9uU2NyZWVuLnk7CgoJCWRyYXdUcmlhbmdsZSggX3YxeCwgX3YxeSwgX3YyeCwgX3YyeSwgX3YzeCwgX3YzeSApOwoKCQlpZiAoICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApICYmIG1hdGVyaWFsLm1hcCA9PT0gbnVsbCApIHsKCgkJCV9kaWZmdXNlQ29sb3IuY29weSggbWF0ZXJpYWwuY29sb3IgKTsKCQkJX2VtaXNzaXZlQ29sb3IuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKTsKCgkJCWlmICggbWF0ZXJpYWwudmVydGV4Q29sb3JzID09PSBUSFJFRS5GYWNlQ29sb3JzICkgewoKCQkJCV9kaWZmdXNlQ29sb3IubXVsdGlwbHkoIGVsZW1lbnQuY29sb3IgKTsKCgkJCX0KCgkJCV9jb2xvci5jb3B5KCBfYW1iaWVudExpZ2h0ICk7CgoJCQlfY2VudHJvaWQuY29weSggdjEucG9zaXRpb25Xb3JsZCApLmFkZCggdjIucG9zaXRpb25Xb3JsZCApLmFkZCggdjMucG9zaXRpb25Xb3JsZCApLmRpdmlkZVNjYWxhciggMyApOwoKCQkJY2FsY3VsYXRlTGlnaHQoIF9jZW50cm9pZCwgZWxlbWVudC5ub3JtYWxNb2RlbCwgX2NvbG9yICk7CgoJCQlfY29sb3IubXVsdGlwbHkoIF9kaWZmdXNlQ29sb3IgKS5hZGQoIF9lbWlzc2l2ZUNvbG9yICk7CgoJCQltYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUKCQkJCSA/IHN0cm9rZVBhdGgoIF9jb2xvciwgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoLCBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwLCBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiApCgkJCQkgOiBmaWxsUGF0aCggX2NvbG9yICk7CgoJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApIHsKCgkJCWlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkgewoKCQkJCXZhciBtYXBwaW5nID0gbWF0ZXJpYWwubWFwLm1hcHBpbmc7CgoJCQkJaWYgKCBtYXBwaW5nID09PSBUSFJFRS5VVk1hcHBpbmcgKSB7CgoJCQkJCV91dnMgPSBlbGVtZW50LnV2czsKCQkJCQlwYXR0ZXJuUGF0aCggX3YxeCwgX3YxeSwgX3YyeCwgX3YyeSwgX3YzeCwgX3YzeSwgX3V2c1sgdXYxIF0ueCwgX3V2c1sgdXYxIF0ueSwgX3V2c1sgdXYyIF0ueCwgX3V2c1sgdXYyIF0ueSwgX3V2c1sgdXYzIF0ueCwgX3V2c1sgdXYzIF0ueSwgbWF0ZXJpYWwubWFwICk7CgoJCQkJfQoKCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuZW52TWFwICE9PSBudWxsICkgewoKCQkJCWlmICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IFRIUkVFLlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nICkgewoKCQkJCQlfbm9ybWFsLmNvcHkoIGVsZW1lbnQudmVydGV4Tm9ybWFsc01vZGVsWyB1djEgXSApLmFwcGx5TWF0cml4MyggX25vcm1hbFZpZXdNYXRyaXggKTsKCQkJCQlfdXYxeCA9IDAuNSAqIF9ub3JtYWwueCArIDAuNTsKCQkJCQlfdXYxeSA9IDAuNSAqIF9ub3JtYWwueSArIDAuNTsKCgkJCQkJX25vcm1hbC5jb3B5KCBlbGVtZW50LnZlcnRleE5vcm1hbHNNb2RlbFsgdXYyIF0gKS5hcHBseU1hdHJpeDMoIF9ub3JtYWxWaWV3TWF0cml4ICk7CgkJCQkJX3V2MnggPSAwLjUgKiBfbm9ybWFsLnggKyAwLjU7CgkJCQkJX3V2MnkgPSAwLjUgKiBfbm9ybWFsLnkgKyAwLjU7CgoJCQkJCV9ub3JtYWwuY29weSggZWxlbWVudC52ZXJ0ZXhOb3JtYWxzTW9kZWxbIHV2MyBdICkuYXBwbHlNYXRyaXgzKCBfbm9ybWFsVmlld01hdHJpeCApOwoJCQkJCV91djN4ID0gMC41ICogX25vcm1hbC54ICsgMC41OwoJCQkJCV91djN5ID0gMC41ICogX25vcm1hbC55ICsgMC41OwoKCQkJCQlwYXR0ZXJuUGF0aCggX3YxeCwgX3YxeSwgX3YyeCwgX3YyeSwgX3YzeCwgX3YzeSwgX3V2MXgsIF91djF5LCBfdXYyeCwgX3V2MnksIF91djN4LCBfdXYzeSwgbWF0ZXJpYWwuZW52TWFwICk7CgoJCQkJfQoKCQkJfSBlbHNlIHsKCgkJCQlfY29sb3IuY29weSggbWF0ZXJpYWwuY29sb3IgKTsKCgkJCQlpZiAoIG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gVEhSRUUuRmFjZUNvbG9ycyApIHsKCgkJCQkJX2NvbG9yLm11bHRpcGx5KCBlbGVtZW50LmNvbG9yICk7CgoJCQkJfQoKCQkJCW1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZQoJCQkJCSA/IHN0cm9rZVBhdGgoIF9jb2xvciwgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoLCBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwLCBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiApCgkJCQkJIDogZmlsbFBhdGgoIF9jb2xvciApOwoKCQkJfQoKCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHsKCgkJCV9ub3JtYWwuY29weSggZWxlbWVudC5ub3JtYWxNb2RlbCApLmFwcGx5TWF0cml4MyggX25vcm1hbFZpZXdNYXRyaXggKTsKCgkJCV9jb2xvci5zZXRSR0IoIF9ub3JtYWwueCwgX25vcm1hbC55LCBfbm9ybWFsLnogKS5tdWx0aXBseVNjYWxhciggMC41ICkuYWRkU2NhbGFyKCAwLjUgKTsKCgkJCW1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZQoJCQkJID8gc3Ryb2tlUGF0aCggX2NvbG9yLCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGgsIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAsIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luICkKCQkJCSA6IGZpbGxQYXRoKCBfY29sb3IgKTsKCgkJfSBlbHNlIHsKCgkJCV9jb2xvci5zZXRSR0IoIDEsIDEsIDEgKTsKCgkJCW1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZQoJCQkJID8gc3Ryb2tlUGF0aCggX2NvbG9yLCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGgsIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAsIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luICkKCQkJCSA6IGZpbGxQYXRoKCBfY29sb3IgKTsKCgkJfQoKCX0KCgkvLwoKCWZ1bmN0aW9uIGRyYXdUcmlhbmdsZSggeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiApIHsKCgkJX2NvbnRleHQuYmVnaW5QYXRoKCk7CgkJX2NvbnRleHQubW92ZVRvKCB4MCwgeTAgKTsKCQlfY29udGV4dC5saW5lVG8oIHgxLCB5MSApOwoJCV9jb250ZXh0LmxpbmVUbyggeDIsIHkyICk7CgkJX2NvbnRleHQuY2xvc2VQYXRoKCk7CgoJfQoKCWZ1bmN0aW9uIHN0cm9rZVBhdGgoIGNvbG9yLCBsaW5ld2lkdGgsIGxpbmVjYXAsIGxpbmVqb2luICkgewoKCQlzZXRMaW5lV2lkdGgoIGxpbmV3aWR0aCApOwoJCXNldExpbmVDYXAoIGxpbmVjYXAgKTsKCQlzZXRMaW5lSm9pbiggbGluZWpvaW4gKTsKCQlzZXRTdHJva2VTdHlsZSggY29sb3IuZ2V0U3R5bGUoKSApOwoKCQlfY29udGV4dC5zdHJva2UoKTsKCgkJX2VsZW1Cb3guZXhwYW5kQnlTY2FsYXIoIGxpbmV3aWR0aCAqIDIgKTsKCgl9CgoJZnVuY3Rpb24gZmlsbFBhdGgoIGNvbG9yICkgewoKCQlzZXRGaWxsU3R5bGUoIGNvbG9yLmdldFN0eWxlKCkgKTsKCQlfY29udGV4dC5maWxsKCk7CgoJfQoKCWZ1bmN0aW9uIHRleHR1cmVUb1BhdHRlcm4oIHRleHR1cmUgKSB7CgoJCWlmICggdGV4dHVyZS52ZXJzaW9uID09PSAwIHx8CgkJCXRleHR1cmUgaW5zdGFuY2VvZiBUSFJFRS5Db21wcmVzc2VkVGV4dHVyZSB8fAoJCQl0ZXh0dXJlIGluc3RhbmNlb2YgVEhSRUUuRGF0YVRleHR1cmUgKSB7CgoJCQlyZXR1cm4gewoJCQkJY2FudmFzOiB1bmRlZmluZWQsCgkJCQl2ZXJzaW9uOiB0ZXh0dXJlLnZlcnNpb24KCQkJfTsKCgkJfQoKCQl2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlOwoKCQlpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHsKCgkJCXJldHVybiB7CgkJCQljYW52YXM6IHVuZGVmaW5lZCwKCQkJCXZlcnNpb246IDAKCQkJfTsKCgkJfQoKCQl2YXIgcmVwZWF0WCA9IHRleHR1cmUud3JhcFMgPT09IFRIUkVFLlJlcGVhdFdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFMgPT09IFRIUkVFLk1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7CgkJdmFyIHJlcGVhdFkgPSB0ZXh0dXJlLndyYXBUID09PSBUSFJFRS5SZXBlYXRXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUID09PSBUSFJFRS5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nOwoKCQl2YXIgbWlycm9yWCA9IHRleHR1cmUud3JhcFMgPT09IFRIUkVFLk1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7CgkJdmFyIG1pcnJvclkgPSB0ZXh0dXJlLndyYXBUID09PSBUSFJFRS5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nOwoKCQkvLwoKCQl2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKTsKCQljYW52YXMud2lkdGggPSBpbWFnZS53aWR0aCAqICggbWlycm9yWCA/IDIgOiAxICk7CgkJY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodCAqICggbWlycm9yWSA/IDIgOiAxICk7CgoJCXZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTsKCQljb250ZXh0LnNldFRyYW5zZm9ybSggMSwgMCwgMCwgLSAxLCAwLCBpbWFnZS5oZWlnaHQgKTsKCQljb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAgKTsKCgkJaWYgKCBtaXJyb3JYID09PSB0cnVlICkgewoKCQkJY29udGV4dC5zZXRUcmFuc2Zvcm0oIC0gMSwgMCwgMCwgLSAxLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7CgkJCWNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgLSBpbWFnZS53aWR0aCwgMCApOwoKCQl9CgoJCWlmICggbWlycm9yWSA9PT0gdHJ1ZSApIHsKCgkJCWNvbnRleHQuc2V0VHJhbnNmb3JtKCAxLCAwLCAwLCAxLCAwLCAwICk7CgkJCWNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgaW1hZ2UuaGVpZ2h0ICk7CgoJCX0KCgkJaWYgKCBtaXJyb3JYID09PSB0cnVlICYmIG1pcnJvclkgPT09IHRydWUgKSB7CgoJCQljb250ZXh0LnNldFRyYW5zZm9ybSggLSAxLCAwLCAwLCAxLCBpbWFnZS53aWR0aCwgMCApOwoJCQljb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIC0gaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApOwoKCQl9CgoJCXZhciByZXBlYXQgPSAnbm8tcmVwZWF0JzsKCgkJaWYgKCByZXBlYXRYID09PSB0cnVlICYmIHJlcGVhdFkgPT09IHRydWUgKSB7CgoJCQlyZXBlYXQgPSAncmVwZWF0JzsKCgkJfSBlbHNlIGlmICggcmVwZWF0WCA9PT0gdHJ1ZSApIHsKCgkJCXJlcGVhdCA9ICdyZXBlYXQteCc7CgoJCX0gZWxzZSBpZiAoIHJlcGVhdFkgPT09IHRydWUgKSB7CgoJCQlyZXBlYXQgPSAncmVwZWF0LXknOwoKCQl9CgoJCXZhciBwYXR0ZXJuID0gX2NvbnRleHQuY3JlYXRlUGF0dGVybiggY2FudmFzLCByZXBlYXQgKTsKCgkJaWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApOwoKCQlyZXR1cm4gewoJCQljYW52YXM6IHBhdHRlcm4sCgkJCXZlcnNpb246IHRleHR1cmUudmVyc2lvbgoJCX07CgoJfQoKCWZ1bmN0aW9uIHBhdHRlcm5QYXRoKCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB1MCwgdjAsIHUxLCB2MSwgdTIsIHYyLCB0ZXh0dXJlICkgewoKCQl2YXIgcGF0dGVybiA9IF9wYXR0ZXJuc1sgdGV4dHVyZS5pZCBdOwoKCQlpZiAoIHBhdHRlcm4gPT09IHVuZGVmaW5lZCB8fCBwYXR0ZXJuLnZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHsKCgkJCXBhdHRlcm4gPSB0ZXh0dXJlVG9QYXR0ZXJuKCB0ZXh0dXJlICk7CgkJCV9wYXR0ZXJuc1sgdGV4dHVyZS5pZCBdID0gcGF0dGVybjsKCgkJfQoKCQlpZiAoIHBhdHRlcm4uY2FudmFzICE9PSB1bmRlZmluZWQgKSB7CgoJCQlzZXRGaWxsU3R5bGUoIHBhdHRlcm4uY2FudmFzICk7CgoJCX0gZWxzZSB7CgoJCQlzZXRGaWxsU3R5bGUoICdyZ2JhKCAwLCAwLCAwLCAxKScgKTsKCQkJX2NvbnRleHQuZmlsbCgpOwoJCQlyZXR1cm47CgoJCX0KCgkJLy8gaHR0cDovL2V4dHJlbWVseXNhdGlzZmFjdG9yeXRvdGFsaXRhcmlhbmlzbS5jb20vYmxvZy8/cD0yMTIwCgoJCXZhciBhLCBiLCBjLCBkLCBlLCBmLCBkZXQsIGlkZXQsCgkJCW9mZnNldFggPSB0ZXh0dXJlLm9mZnNldC54IC8gdGV4dHVyZS5yZXBlYXQueCwKCQkJb2Zmc2V0WSA9IHRleHR1cmUub2Zmc2V0LnkgLyB0ZXh0dXJlLnJlcGVhdC55LAoJCQl3aWR0aCA9IHRleHR1cmUuaW1hZ2Uud2lkdGggKiB0ZXh0dXJlLnJlcGVhdC54LAoJCQloZWlnaHQgPSB0ZXh0dXJlLmltYWdlLmhlaWdodCAqIHRleHR1cmUucmVwZWF0Lnk7CgoJCXUwID0gKCB1MCArIG9mZnNldFggKSAqIHdpZHRoOwoJCXYwID0gKCB2MCArIG9mZnNldFkgKSAqIGhlaWdodDsKCgkJdTEgPSAoIHUxICsgb2Zmc2V0WCApICogd2lkdGg7CgkJdjEgPSAoIHYxICsgb2Zmc2V0WSApICogaGVpZ2h0OwoKCQl1MiA9ICggdTIgKyBvZmZzZXRYICkgKiB3aWR0aDsKCQl2MiA9ICggdjIgKyBvZmZzZXRZICkgKiBoZWlnaHQ7CgoJCXgxIC09IHgwOyB5MSAtPSB5MDsKCQl4MiAtPSB4MDsgeTIgLT0geTA7CgoJCXUxIC09IHUwOyB2MSAtPSB2MDsKCQl1MiAtPSB1MDsgdjIgLT0gdjA7CgoJCWRldCA9IHUxICogdjIgLSB1MiAqIHYxOwoKCQlpZiAoIGRldCA9PT0gMCApIHJldHVybjsKCgkJaWRldCA9IDEgLyBkZXQ7CgoJCWEgPSAoIHYyICogeDEgLSB2MSAqIHgyICkgKiBpZGV0OwoJCWIgPSAoIHYyICogeTEgLSB2MSAqIHkyICkgKiBpZGV0OwoJCWMgPSAoIHUxICogeDIgLSB1MiAqIHgxICkgKiBpZGV0OwoJCWQgPSAoIHUxICogeTIgLSB1MiAqIHkxICkgKiBpZGV0OwoKCQllID0geDAgLSBhICogdTAgLSBjICogdjA7CgkJZiA9IHkwIC0gYiAqIHUwIC0gZCAqIHYwOwoKCQlfY29udGV4dC5zYXZlKCk7CgkJX2NvbnRleHQudHJhbnNmb3JtKCBhLCBiLCBjLCBkLCBlLCBmICk7CgkJX2NvbnRleHQuZmlsbCgpOwoJCV9jb250ZXh0LnJlc3RvcmUoKTsKCgl9CgoJLyoKCWZ1bmN0aW9uIGNsaXBJbWFnZSggeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgdTAsIHYwLCB1MSwgdjEsIHUyLCB2MiwgaW1hZ2UgKSB7CgoJCS8vIGh0dHA6Ly9leHRyZW1lbHlzYXRpc2ZhY3Rvcnl0b3RhbGl0YXJpYW5pc20uY29tL2Jsb2cvP3A9MjEyMAoKCQl2YXIgYSwgYiwgYywgZCwgZSwgZiwgZGV0LCBpZGV0LAoJCXdpZHRoID0gaW1hZ2Uud2lkdGggLSAxLAoJCWhlaWdodCA9IGltYWdlLmhlaWdodCAtIDE7CgoJCXUwICo9IHdpZHRoOyB2MCAqPSBoZWlnaHQ7CgkJdTEgKj0gd2lkdGg7IHYxICo9IGhlaWdodDsKCQl1MiAqPSB3aWR0aDsgdjIgKj0gaGVpZ2h0OwoKCQl4MSAtPSB4MDsgeTEgLT0geTA7CgkJeDIgLT0geDA7IHkyIC09IHkwOwoKCQl1MSAtPSB1MDsgdjEgLT0gdjA7CgkJdTIgLT0gdTA7IHYyIC09IHYwOwoKCQlkZXQgPSB1MSAqIHYyIC0gdTIgKiB2MTsKCgkJaWRldCA9IDEgLyBkZXQ7CgoJCWEgPSAoIHYyICogeDEgLSB2MSAqIHgyICkgKiBpZGV0OwoJCWIgPSAoIHYyICogeTEgLSB2MSAqIHkyICkgKiBpZGV0OwoJCWMgPSAoIHUxICogeDIgLSB1MiAqIHgxICkgKiBpZGV0OwoJCWQgPSAoIHUxICogeTIgLSB1MiAqIHkxICkgKiBpZGV0OwoKCQllID0geDAgLSBhICogdTAgLSBjICogdjA7CgkJZiA9IHkwIC0gYiAqIHUwIC0gZCAqIHYwOwoKCQlfY29udGV4dC5zYXZlKCk7CgkJX2NvbnRleHQudHJhbnNmb3JtKCBhLCBiLCBjLCBkLCBlLCBmICk7CgkJX2NvbnRleHQuY2xpcCgpOwoJCV9jb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAgKTsKCQlfY29udGV4dC5yZXN0b3JlKCk7CgoJfQoJKi8KCgkvLyBIaWRlIGFudGktYWxpYXMgZ2FwcwoKCWZ1bmN0aW9uIGV4cGFuZCggdjEsIHYyLCBwaXhlbHMgKSB7CgoJCXZhciB4ID0gdjIueCAtIHYxLngsIHkgPSB2Mi55IC0gdjEueSwKCQkJZGV0ID0geCAqIHggKyB5ICogeSwgaWRldDsKCgkJaWYgKCBkZXQgPT09IDAgKSByZXR1cm47CgoJCWlkZXQgPSBwaXhlbHMgLyBNYXRoLnNxcnQoIGRldCApOwoKCQl4ICo9IGlkZXQ7IHkgKj0gaWRldDsKCgkJdjIueCArPSB4OyB2Mi55ICs9IHk7CgkJdjEueCAtPSB4OyB2MS55IC09IHk7CgoJfQoKCS8vIENvbnRleHQgY2FjaGVkIG1ldGhvZHMuCgoJZnVuY3Rpb24gc2V0T3BhY2l0eSggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRHbG9iYWxBbHBoYSAhPT0gdmFsdWUgKSB7CgoJCQlfY29udGV4dC5nbG9iYWxBbHBoYSA9IHZhbHVlOwoJCQlfY29udGV4dEdsb2JhbEFscGhhID0gdmFsdWU7CgoJCX0KCgl9CgoJZnVuY3Rpb24gc2V0QmxlbmRpbmcoIHZhbHVlICkgewoKCQlpZiAoIF9jb250ZXh0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uICE9PSB2YWx1ZSApIHsKCgkJCWlmICggdmFsdWUgPT09IFRIUkVFLk5vcm1hbEJsZW5kaW5nICkgewoKCQkJCV9jb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7CgoJCQl9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gVEhSRUUuQWRkaXRpdmVCbGVuZGluZyApIHsKCgkJCQlfY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnbGlnaHRlcic7CgoJCQl9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gVEhSRUUuU3VidHJhY3RpdmVCbGVuZGluZyApIHsKCgkJCQlfY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGFya2VyJzsKCgkJCX0gZWxzZSBpZiAoIHZhbHVlID09PSBUSFJFRS5NdWx0aXBseUJsZW5kaW5nICkgewoKCQkJCV9jb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdtdWx0aXBseSc7CgoJCQl9CgoJCQlfY29udGV4dEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHZhbHVlOwoKCQl9CgoJfQoKCWZ1bmN0aW9uIHNldExpbmVXaWR0aCggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRMaW5lV2lkdGggIT09IHZhbHVlICkgewoKCQkJX2NvbnRleHQubGluZVdpZHRoID0gdmFsdWU7CgkJCV9jb250ZXh0TGluZVdpZHRoID0gdmFsdWU7CgoJCX0KCgl9CgoJZnVuY3Rpb24gc2V0TGluZUNhcCggdmFsdWUgKSB7CgoJCS8vICJidXR0IiwgInJvdW5kIiwgInNxdWFyZSIKCgkJaWYgKCBfY29udGV4dExpbmVDYXAgIT09IHZhbHVlICkgewoKCQkJX2NvbnRleHQubGluZUNhcCA9IHZhbHVlOwoJCQlfY29udGV4dExpbmVDYXAgPSB2YWx1ZTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRMaW5lSm9pbiggdmFsdWUgKSB7CgoJCS8vICJyb3VuZCIsICJiZXZlbCIsICJtaXRlciIKCgkJaWYgKCBfY29udGV4dExpbmVKb2luICE9PSB2YWx1ZSApIHsKCgkJCV9jb250ZXh0LmxpbmVKb2luID0gdmFsdWU7CgkJCV9jb250ZXh0TGluZUpvaW4gPSB2YWx1ZTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRTdHJva2VTdHlsZSggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRTdHJva2VTdHlsZSAhPT0gdmFsdWUgKSB7CgoJCQlfY29udGV4dC5zdHJva2VTdHlsZSA9IHZhbHVlOwoJCQlfY29udGV4dFN0cm9rZVN0eWxlID0gdmFsdWU7CgoJCX0KCgl9CgoJZnVuY3Rpb24gc2V0RmlsbFN0eWxlKCB2YWx1ZSApIHsKCgkJaWYgKCBfY29udGV4dEZpbGxTdHlsZSAhPT0gdmFsdWUgKSB7CgoJCQlfY29udGV4dC5maWxsU3R5bGUgPSB2YWx1ZTsKCQkJX2NvbnRleHRGaWxsU3R5bGUgPSB2YWx1ZTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRMaW5lRGFzaCggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRMaW5lRGFzaC5sZW5ndGggIT09IHZhbHVlLmxlbmd0aCApIHsKCgkJCV9jb250ZXh0LnNldExpbmVEYXNoKCB2YWx1ZSApOwoJCQlfY29udGV4dExpbmVEYXNoID0gdmFsdWU7CgoJCX0KCgl9Cgp9Owo="}},"time_used":434,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":434,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/2.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.519Z","timestamp":1785147795519,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/2.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 4000\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":4000,"size_decoded":4474,"mime_type":"image/png","magic":"PNG image data, 37 x 59, 8-bit/color RGBA, non-interlaced","md5":"522c97220630e494d5e32f376066aa88","sha1":"989dee1eabfb01939d7bfc5c5ecfe23f39c1a5b9","sha256":"39486f1fe9d006810698a045adc92dffc8d8d93c08dc5bc693d15f2fc86bbf60","sha512":"4de8a5ade1f1e70e98c7d963c562973c07f69a53c4426ab857b986ba786fcc80c2d088f7d5a65388b5f1f955bc45a892d0cb4b906d59db1eb84054a17e72779a","ssdeep":"","tlshash":"b5817de65e83224ef121ea0b04bd3845e9baa4f494ec3c00e259769f080079883d97fb","first_seen":"2025-05-31T01:51:37.517411Z","last_seen":"2026-08-11T00:25:55.222595Z","times_seen":24,"resource_available":false,"data":"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"}},"time_used":517,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":512,"receive":5,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/4.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.539Z","timestamp":1785147795539,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/4.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1484\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1484,"size_decoded":1958,"mime_type":"image/png","magic":"PNG image data, 52 x 49, 8-bit colormap, non-interlaced","md5":"85bf4373f2c22c935bd0c3d9941a7004","sha1":"22bdf94525528311014e57305fdb4d3c9d67a132","sha256":"641fb3ee73da500704719ba4f430b9bf752b56f0f4e5a7d017946087b1c84388","sha512":"ce0452b75fd656eceac76e1b9c1fc4cac702d40a0ee66ea59598fa3cc7699824a4f5273c6a3739c9b3e60d786c6ad8a9c931eeee2e1232534572772c2a6838a0","ssdeep":"","tlshash":"0731c4eed7755eab61023e0aaa5a1422a60b8e0c8430c505002c7bb89ff3ca2c405302","first_seen":"2025-05-31T01:51:37.509097Z","last_seen":"2026-08-11T00:25:55.289745Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAADQAAAAxCAMAAACia3pqAAACHFBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9npun0AAAAs3RSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0hIyQlJicoKissLS4vMDEyMzQ1Njg5Ojw9P0BDREVISUtMTVBRUlNVVlpbXWBhYmNlZmdoaWttb3FzdHh5ent8fX6Bg4SHi4yNk5SVlpeZnJ6hpKWoqaqtrrCytLa4ubu/wMHCw8TFx8jJysvMzs/S09TV2drc3d/g4eLj5OXm5+jp6uvs7e7v8PHz9PX29/j6+/z9/ua3pmUAAAKsSURBVEiJtdX/PxNxHAfwtylEhdJaJH0Xli99z1QiKn1RE2upSGohCalmK6k0LfkaMallKHFse/+D3d3n7rZdjvvUo/cve39e934+dvf53GMDWLp2tnrmOk8qXFSo7B/Ilr+cxmj6ka/F7RQoC4W6SYEKRPSQAh0QURUF0gwS491NgeDoLx6ZaQzAPivj/1BMZ7haTTufDGHnLsbB5jWqRWXvgi85bhaPaEZ9n+o3qTFhT8gWVNvhGNcNxqpA+fy+9UNVOzTybbUKVEuOSN/YG8W/tditAjUTdP9RXzHpPqpHE4bK59QITyQu0KNnd5AeSfXfkEWOulSgbY6pkBo6rgL9S+U5nTXU6Cxi8wojhvbx/nsbl0Mb7va57HnByXU/t02ftyqjpCH572C6l2yuXRk9JRP+bCmpFY8kSQkl+ISJOilqE9FhJZQpTtikqF6MdklRbBfiZIa0TBYnmqTI8Mdbtv4tt/6eLgXvhJH8wLc38cFcjrhe94b9SZ5BdKdJ9/eTH2kN2ptw8wT6XurF5drXiL4LqW5WpYpZ2gsvum+tguDSbImR+phOdm8vsXOc2huIdZpgER4JCbnsCRAX/Yo1l7kuYxLx2x4Ssn+puQkQFU6EztLDWOEqjsFBdNnOQHQHa66Qa3oP4tcdUGhz4SEYRyNYmZ4HOoDEUfb5FrWRwyXQwD3qbe0M+o3iPeyfwmmtmcsboGQ4UrvIdmNJ8JjflXIYKIrwcJ03pc5fFrjzzGlLCjeJnoiiASjnh5vhC//pBMZ0mpxE2flrwc+bdcpI8gLTPLznuykQDk3PVAovkzkCQstM8rYb8xnCsIhqWnIYAcHSiMlpqZGhkfhSXB5hafyIDGFh90rIUYhyJJUiCtTfoTl5UiFHFfKJeTDNhiYOnRzpHKETs6bfN3U+oXvVSCQAAAAASUVORK5CYII="}},"time_used":344,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":340,"receive":4,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/5.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.540Z","timestamp":1785147795540,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/5.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1699\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1699,"size_decoded":2173,"mime_type":"image/png","magic":"PNG image data, 48 x 48, 8-bit colormap, non-interlaced","md5":"1cdcc2657b252b9b9647bc4b5f5232d7","sha1":"eeb0f90433892e2270717dd887f12f01a9ca3e1a","sha256":"7645eb14076845e9a7915b9746b4a66b56a520ada85a3f60d19c4d56bc20acb5","sha512":"13c00f5466ecd262f8b99aebf49092734b9801ffd60765e16490c44c6ea728d909f8419780c9eefa80ea28f7eae6e31b14a8ccf6de4ac71b152c3edbefad2029","ssdeep":"","tlshash":"5f31b9f6c1ad3d25c84091b55709c99dff731d3523eac65f079f3021c0346104866e36","first_seen":"2025-05-31T01:51:37.50612Z","last_seen":"2026-08-11T00:25:55.269616Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAACT1BMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9gmGiXAAAAxHRSTlMAAQIDBAUGCAkKCw8QEhMUFRYXGBkaGxwfICEiJCUmJygpKissLS4vMTM1Njc5Ojs8PT4/QEJDRUZISUtOT1BSVVZZWltdXl9gYmNkZWZnaGlqa2xtb3BxcnN0dXZ3eHt8fX5/gYKDhIaHiImKjI2Oj5CRk5SVlpeam5ydnp+goaSlpqeqra6vsLGys7S1t7i5uru8vb/BwsPIzdDR0tTV1tfY29zd3t/g4uPk5ufo6err7O3u7/Dx8vP19vf4+fr7/P3+bV3WBwAAAz9JREFUSImNlIk/FGEYx59pRasSEbrkSIuIVHJ1U65udKiVpEORtlAiUilCUqHSVkilsG7rKmb+sGbea2ZnVjyfz+4+z+/5/mbeed53B0AKt6x3/cJw6wV3oLHz+tOmx9lhS8B+NAg4rJcdsOCYVTckCT3GlXYNfn3EITTpqcZF3p8RhZFzS+05AizUUaVQ16I7f/C3ZXXoO5A5Dip6XIGkTCUrec5cwkm/hkFi6NIpuy+QZnKQpXBBuIccQcPEEaG8ng/W6pyYckm6AHIEj+Nmns2Kv2HxjTMVKqWyCKVG3Ku0MXSR+zbTlT5BZYGUxuFWrZL3naPDuEqUUlzmi2kZTsuVhrOUF+a2Y+UkqRtz6kmWoTR4jTGHGS/KmxdUUcYpDFcUjb1YqlMbhLuyI1epm8hjTWocdyifbSM3EjVBsyjhNijmbDnwE6t89JHX+yT98JTGcUvSz6N0wABOvr7PpHSUF4bQlXxqNDc5BXAGJUNBZJp/UNlCluWZWlhhOprJfB9dIAMVI8H0eXZZxfKzm80xgBTiaHeF0ygdDWG9PaLwdTWo4hjCzK5wHPOhcuuBIHR4qHlxqSL4xQ1SET+2TdHZ2tnmqeUB0vkOd0hGvDXCHqCJpDWQhI7oRCS4LMoBibOI3wFbBjIXw+/HfBRstgh8+oK4q/P6bpGfjAb/fuk4nFiAT/9rCfL+IUzHgC9+ufFp/8O5ayIyaFjXHQs+v8mm8ynz8zr8J7UE6GHVL3as5jLTTBWFqXY2YVktQYrFIl99HPmajSp+RQttxUtlgebMTyXa8B7ttGHEQpHGwScoeJ/vVC6hEzBpHJObGB/C3t617GXMFWscL2kv2kql93r5rtxDzaK8cefQDFU6XZXPlUHUhuxXJMMbL/81LRtsBlGO1UdiehOnpUC2F8dEqA0PZGPi5DFXs+2VYjZetTWVWDfKY66Ut5ctUBF5WB8PZmPOgXqZv6HmIYJ0hoPomMOhl/FVnMag6yK9QQNylJg5iJog2ltHDS/Om40vEF9B/ETjt/en5XZ4gGrmCGBazLRY93jZ5UHfTB19fkyMnRFGA+3zAA659NQ0yOLu52Hz8WJ4XGzrnRtsNeL38D9j7vSgYlJm3AAAAABJRU5ErkJggg=="}},"time_used":343,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":341,"receive":2,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/6.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.550Z","timestamp":1785147795550,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/6.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16444\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16444,"size_decoded":16919,"mime_type":"image/png","magic":"PNG image data, 107 x 40, 8-bit/color RGBA, non-interlaced","md5":"feb24020a110b19fa8bfc5d5b97626a7","sha1":"ae979a4164e66abfd0b877e14c48376732f8e374","sha256":"dfb8dd3f1a19b729688f05bdf9f23b60c061e5687b36f0efc89faf7f4a75b697","sha512":"d24a1a8024e777f79078772f1252d511fd78ded1bd55dc57302195c6673ff4d895daf82112121e43d245eac682f27d0f2ad22d6818bb664031fee9dd288c6f16","ssdeep":"96:dsSdkEWRJxNX8sc5RabvkCcYCG+hBnTlhbXx1rE:OSdktrrjb05Y","tlshash":"5572c264bcb27265966da2332ec524058c3357c3c9828c49fbcc6c6a7f00bd8ac0f6d6","first_seen":"2025-05-31T01:51:37.48266Z","last_seen":"2026-08-11T00:25:55.235572Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAGsAAAAoCAYAAAD5cwTOAAAACXBIWXMAAAsTAAALEwEAmpwYAAA532lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNjoyNiswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjY6MjYrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6N2U4NDJhNTAtOGNmOS00YzQ5LWEyODgtNGYxOWYzMzdhYjM4PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmFkNzE5ZjBhLTM4MDgtOWU0Yy05MmUzLTdlMmVmZDI1Mjc5NzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmFkNzE5ZjBhLTM4MDgtOWU0Yy05MmUzLTdlMmVmZDI1Mjc5NzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDphZDcxOWYwYS0zODA4LTllNGMtOTJlMy03ZTJlZmQyNTI3OTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6N2U4NDJhNTAtOGNmOS00YzQ5LWEyODgtNGYxOWYzMzdhYjM4PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE4LTA2LTI2VDIwOjI2OjI2KzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+NjU1MzU8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEwNzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj40MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+nyUH+wAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAF10lEQVR42uybe4gVVRzHP7uuiZmV9tDY0jLbLEytTAgxCgskfLuZkWWbhYTWHxFBL6ikpAyz0EJSyiLWNJ+ZRWhaJiK+UtvUMk2tfGy+2DY13f32x/3dPE4zd+/M3bnr1nzhwNw553fOmfme3+P8ztwCScSMs4AhwAigBLgEOAj8DMwF3gUOkKBOFMRMVndgFnB5hjZHgUeBaQkdmVEYY98DgW/qIAqgOTAVmJjQ0TCaVQKsAVqGlCsD3ktoyS9Zi4HeEeSqgUuBwwk1+TGDnSISBdDCApEEeSJrYI7ygxJa8kfWlQ0sn5AVAq1ylL8gpmftCAwAmiVkncLmHOV3xzCnIcBWYB6wCmjSAO96KPCJlbIoHRTFMKn1Ocp/H8OcRjgLsyvQDVibZ7KuBfra9bb6JKsJ0MNMx0XATqAC2JJFn58C+4A2ER9qegwvahnQz6731IP2Nwi8ZDUFHgPGBGQeVgDjjJAgHAcmAWMjzOcHMxP1jQm20DqYKfyzUTotSelSLGmFssOLkgocWW8pllSrcDgqqVuGPht7ed551tej9JHWrPOAr0KEzc+ZmRsVUP+rZSGyjQyrgOHAtxHX3BNAgY35vgUUPc1PPWMWo9Ta7gVm23UP4Ca7Xg78AQwDrrI5LTFNr/WMVwacDZwE3gHutH4uBDYAi4BfQj7DdTbva4C/gKWkkuBVXs2apWh4PGAVtJZ0PAv5WkmLJZXkuGrTOCRpjWeMFpJ6Ob/XO3LjnPubAua8yiyFO95BqzshaaOPTLWkJ0No1nhJNT797HCtTZFFR6URV/R4YLv5ATc4GUfqHOs0i2s+qcI0bzswB9hVj1b9fOBG5/cRyzdmg84B93sAK4EuPjnLItMI9xkLTOteMQ2ZWMe4L5hlwDR4teVHiy1uWGLath9Jbys3HJf0lqRSSWWSlvu02Sfplhj9gYsjkkZLam+FLDVLkj6U1FVSW0n3SNrj1E3x0az06u8tqblp4GSn7oSkdhk0q635akmqlNTZ7hdKmu60nyoJJK1T/CiN2Xm7GOpTnw1Zi3zkbvYsgqYesmqNXK/cfEdubAayHnHuzZB0h1Pud+oOSCossnA2TpwEFuYxwF1Uj/u7lcCPFnCcS+qcrsKpr7CAwotyoL9dd88wpmuy77bih9ZAmyKgJuaXV0C8J9L1haqA+4eca++7OhYgU+3xo9lgf4b+BBQUmqOPE02AuxoBWX197l1sAViamF0+4XabOvrammFMN7x/CmgfUC4Hfiu0rESuideRwPWkzrJW+bR5Axh8hpP1MPCgh6iZTpZ+mU/moxmwgNQXW2kM8yRqv8gw5mfO9bM2pov+dlLwzz6rUw6BwwFJHTzOtbmk1QHtf5f0taRyc+43xBBgnBMxwEhjr6S1kk56It5uAdFgOurbJGmnzx6tsI591jznfqWkNyVNkLTU6XtIOhpE0rSIZA0IeHmDQvSxQVL3M4gsL45ZZEYGsvzwnaQrstgUt7QFnEkhbnfTTWMsaukSwmxMAuYH1G0J0U8XUp+sjcoh4/6l+UZZ9OnFYdtsZprbFEtFjbCThmrgc+A1YFOGse+zpEIfM4ubgY+BVy19lcYuZw47PYHNrcC95utus830DnuuyRZ8nJbIbSVpYRYrpkbS03UkcgdG0NITknrmObnqatZLIeRczWqXr/kWekLUfsADwDqfFVRjaaVewMu2ioMwLOJxTblPmipBwHmWzBRNtwx8R8sk7zb1rsyiz7Y5RH6XWea5PKEm+5NigJ+shMVgO5KIiuEJWf6II7NwdQPL/y81Kyra5ShfnMfnn+Hk+jaGkHvIjkHI0jWcsWTta2D5MNgQkIitC3P+K2ZwWwPLJz4rBGbz728WwmBmQos/4vrLzwJOfacXBocsfK9OqMmPZgGMJtr/hEcmROWfrN2kTj2rsmwvUp+3zU0oyb8ZTKPEfFDXDG0OkjpHmp/Q0bBkQepYv4/tTTrbPqzSor6PgA9orJ8z5xl/DwD9xgXn3iiA1QAAAABJRU5ErkJggg=="}},"time_used":722,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":712,"receive":10,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/jquery.easypiechart.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.306Z","timestamp":1785147795306,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/jquery.easypiechart.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 1572\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":3950,"size_decoded":2116,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (3727)","md5":"7659bf9331da37b14e8315f64ab77aca","sha1":"2c9fcaf675595b7ab0ab12fb8bc23f7bb0fa9564","sha256":"b2db7e12704dcb41fe79a96a7eb08f816e25a16dd4fa97bb26e6618789e0cb8a","sha512":"0c735ea5b22eb3db787ba6283014892f097e9e79b4b48c0c0689ec410f96f4d28dea055555ba2626cf488b7990f87cc666253917224b767033f5aeb766066f4d","ssdeep":"","tlshash":"348193c6b161391950236579807f920b322764f9794f4c68b72891be3eb590d227ff3a","first_seen":"2023-03-07T12:39:25Z","last_seen":"2026-08-13T11:40:43.173846Z","times_seen":237,"resource_available":true,"data":"LyoqIQogKiBlYXN5UGllQ2hhcnQKICogTGlnaHR3ZWlnaHQgcGx1Z2luIHRvIHJlbmRlciBzaW1wbGUsIGFuaW1hdGVkIGFuZCByZXRpbmEgb3B0aW1pemVkIHBpZSBjaGFydHMKICoKICogQGxpY2Vuc2UgCiAqIEBhdXRob3IgUm9iZXJ0IEZsZWlzY2htYW5uIDxyZW5kcm84N0BnbWFpbC5jb20+IChodHRwOi8vcm9iZXJ0LWZsZWlzY2htYW5uLmRlKQogKiBAdmVyc2lvbiAyLjEuNgogKiovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoImpxdWVyeSIpKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGIpOmIoYS5qUXVlcnkpfSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTthLmFwcGVuZENoaWxkKGQpLCJ1bmRlZmluZWQiIT10eXBlb2YgR192bWxDYW52YXNNYW5hZ2VyJiZHX3ZtbENhbnZhc01hbmFnZXIuaW5pdEVsZW1lbnQoZCk7dmFyIGU9ZC5nZXRDb250ZXh0KCIyZCIpO2Qud2lkdGg9ZC5oZWlnaHQ9Yi5zaXplO3ZhciBmPTE7d2luZG93LmRldmljZVBpeGVsUmF0aW8+MSYmKGY9d2luZG93LmRldmljZVBpeGVsUmF0aW8sZC5zdHlsZS53aWR0aD1kLnN0eWxlLmhlaWdodD1bYi5zaXplLCJweCJdLmpvaW4oIiIpLGQud2lkdGg9ZC5oZWlnaHQ9Yi5zaXplKmYsZS5zY2FsZShmLGYpKSxlLnRyYW5zbGF0ZShiLnNpemUvMixiLnNpemUvMiksZS5yb3RhdGUoKC0wLjUrYi5yb3RhdGUvMTgwKSpNYXRoLlBJKTt2YXIgZz0oYi5zaXplLWIubGluZVdpZHRoKS8yO2Iuc2NhbGVDb2xvciYmYi5zY2FsZUxlbmd0aCYmKGctPWIuc2NhbGVMZW5ndGgrMiksRGF0ZS5ub3c9RGF0ZS5ub3d8fGZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfTt2YXIgaD1mdW5jdGlvbihhLGIsYyl7Yz1NYXRoLm1pbihNYXRoLm1heCgtMSxjfHwwKSwxKTt2YXIgZD0wPj1jPyEwOiExO2UuYmVnaW5QYXRoKCksZS5hcmMoMCwwLGcsMCwyKk1hdGguUEkqYyxkKSxlLnN0cm9rZVN0eWxlPWEsZS5saW5lV2lkdGg9YixlLnN0cm9rZSgpfSxpPWZ1bmN0aW9uKCl7dmFyIGEsYztlLmxpbmVXaWR0aD0xLGUuZmlsbFN0eWxlPWIuc2NhbGVDb2xvcixlLnNhdmUoKTtmb3IodmFyIGQ9MjQ7ZD4wOy0tZClkJTY9PT0wPyhjPWIuc2NhbGVMZW5ndGgsYT0wKTooYz0uNipiLnNjYWxlTGVuZ3RoLGE9Yi5zY2FsZUxlbmd0aC1jKSxlLmZpbGxSZWN0KC1iLnNpemUvMithLDAsYywxKSxlLnJvdGF0ZShNYXRoLlBJLzEyKTtlLnJlc3RvcmUoKX0saj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChhLDFlMy82MCl9fSgpLGs9ZnVuY3Rpb24oKXtiLnNjYWxlQ29sb3ImJmkoKSxiLnRyYWNrQ29sb3ImJmgoYi50cmFja0NvbG9yLGIudHJhY2tXaWR0aHx8Yi5saW5lV2lkdGgsMSl9O3RoaXMuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIGR9LHRoaXMuZ2V0Q3R4PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oKXtlLmNsZWFyUmVjdChiLnNpemUvLTIsYi5zaXplLy0yLGIuc2l6ZSxiLnNpemUpfSx0aGlzLmRyYXc9ZnVuY3Rpb24oYSl7Yi5zY2FsZUNvbG9yfHxiLnRyYWNrQ29sb3I/ZS5nZXRJbWFnZURhdGEmJmUucHV0SW1hZ2VEYXRhP2M/ZS5wdXRJbWFnZURhdGEoYywwLDApOihrKCksYz1lLmdldEltYWdlRGF0YSgwLDAsYi5zaXplKmYsYi5zaXplKmYpKToodGhpcy5jbGVhcigpLGsoKSk6dGhpcy5jbGVhcigpLGUubGluZUNhcD1iLmxpbmVDYXA7dmFyIGQ7ZD0iZnVuY3Rpb24iPT10eXBlb2YgYi5iYXJDb2xvcj9iLmJhckNvbG9yKGEpOmIuYmFyQ29sb3IsaChkLGIubGluZVdpZHRoLGEvMTAwKX0uYmluZCh0aGlzKSx0aGlzLmFuaW1hdGU9ZnVuY3Rpb24oYSxjKXt2YXIgZD1EYXRlLm5vdygpO2Iub25TdGFydChhLGMpO3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGY9TWF0aC5taW4oRGF0ZS5ub3coKS1kLGIuYW5pbWF0ZS5kdXJhdGlvbiksZz1iLmVhc2luZyh0aGlzLGYsYSxjLWEsYi5hbmltYXRlLmR1cmF0aW9uKTt0aGlzLmRyYXcoZyksYi5vblN0ZXAoYSxjLGcpLGY+PWIuYW5pbWF0ZS5kdXJhdGlvbj9iLm9uU3RvcChhLGMpOmooZSl9LmJpbmQodGhpcyk7aihlKX0uYmluZCh0aGlzKX0sYz1mdW5jdGlvbihhLGMpe3ZhciBkPXtiYXJDb2xvcjoiI2VmMWUyNSIsdHJhY2tDb2xvcjoiI2Y5ZjlmOSIsc2NhbGVDb2xvcjoiI2RmZTBlMCIsc2NhbGVMZW5ndGg6NSxsaW5lQ2FwOiJyb3VuZCIsbGluZVdpZHRoOjMsdHJhY2tXaWR0aDp2b2lkIDAsc2l6ZToxMTAscm90YXRlOjAsYW5pbWF0ZTp7ZHVyYXRpb246MWUzLGVuYWJsZWQ6ITB9LGVhc2luZzpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBiLz1lLzIsMT5iP2QvMipiKmIrYzotZC8yKigtLWIqKGItMiktMSkrY30sb25TdGFydDpmdW5jdGlvbigpe30sb25TdGVwOmZ1bmN0aW9uKCl7fSxvblN0b3A6ZnVuY3Rpb24oKXt9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIpZC5yZW5kZXJlcj1iO2Vsc2V7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBTVkdSZW5kZXJlcil0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSBsb2FkIGVpdGhlciB0aGUgU1ZHLSBvciB0aGUgQ2FudmFzUmVuZGVyZXIiKTtkLnJlbmRlcmVyPVNWR1JlbmRlcmVyfXZhciBlPXt9LGY9MCxnPWZ1bmN0aW9uKCl7dGhpcy5lbD1hLHRoaXMub3B0aW9ucz1lO2Zvcih2YXIgYiBpbiBkKWQuaGFzT3duUHJvcGVydHkoYikmJihlW2JdPWMmJiJ1bmRlZmluZWQiIT10eXBlb2YgY1tiXT9jW2JdOmRbYl0sImZ1bmN0aW9uIj09dHlwZW9mIGVbYl0mJihlW2JdPWVbYl0uYmluZCh0aGlzKSkpO2UuZWFzaW5nPSJzdHJpbmciPT10eXBlb2YgZS5lYXNpbmcmJiJ1bmRlZmluZWQiIT10eXBlb2YgalF1ZXJ5JiZqUXVlcnkuaXNGdW5jdGlvbihqUXVlcnkuZWFzaW5nW2UuZWFzaW5nXSk/alF1ZXJ5LmVhc2luZ1tlLmVhc2luZ106ZC5lYXNpbmcsIm51bWJlciI9PXR5cGVvZiBlLmFuaW1hdGUmJihlLmFuaW1hdGU9e2R1cmF0aW9uOmUuYW5pbWF0ZSxlbmFibGVkOiEwfSksImJvb2xlYW4iIT10eXBlb2YgZS5hbmltYXRlfHxlLmFuaW1hdGV8fChlLmFuaW1hdGU9e2R1cmF0aW9uOjFlMyxlbmFibGVkOmUuYW5pbWF0ZX0pLHRoaXMucmVuZGVyZXI9bmV3IGUucmVuZGVyZXIoYSxlKSx0aGlzLnJlbmRlcmVyLmRyYXcoZiksYS5kYXRhc2V0JiZhLmRhdGFzZXQucGVyY2VudD90aGlzLnVwZGF0ZShwYXJzZUZsb2F0KGEuZGF0YXNldC5wZXJjZW50KSk6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJkYXRhLXBlcmNlbnQiKSYmdGhpcy51cGRhdGUocGFyc2VGbG9hdChhLmdldEF0dHJpYnV0ZSgiZGF0YS1wZXJjZW50IikpKX0uYmluZCh0aGlzKTt0aGlzLnVwZGF0ZT1mdW5jdGlvbihhKXtyZXR1cm4gYT1wYXJzZUZsb2F0KGEpLGUuYW5pbWF0ZS5lbmFibGVkP3RoaXMucmVuZGVyZXIuYW5pbWF0ZShmLGEpOnRoaXMucmVuZGVyZXIuZHJhdyhhKSxmPWEsdGhpc30uYmluZCh0aGlzKSx0aGlzLmRpc2FibGVBbmltYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gZS5hbmltYXRlLmVuYWJsZWQ9ITEsdGhpc30sdGhpcy5lbmFibGVBbmltYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gZS5hbmltYXRlLmVuYWJsZWQ9ITAsdGhpc30sZygpfTthLmZuLmVhc3lQaWVDaGFydD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ7YS5kYXRhKHRoaXMsImVhc3lQaWVDaGFydCIpfHwoZD1hLmV4dGVuZCh7fSxiLGEodGhpcykuZGF0YSgpKSxhLmRhdGEodGhpcywiZWFzeVBpZUNoYXJ0IixuZXcgYyh0aGlzLGQpKSl9KX19KTs="}},"time_used":570,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":570,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/echarts-en.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.311Z","timestamp":1785147795311,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/echarts-en.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:38 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 211658\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":666113,"size_decoded":212204,"mime_type":"text/javascript","magic":"JavaScript source, Unicode text, UTF-8 text, with very long lines (32032)","md5":"218e59ce9830779fc1a0ee71d72c85fc","sha1":"05e68392e87c9fed6dad06828321c8429e198a98","sha256":"4d3f81c64289c739536908c6967b2206e70eae833dcfe9911a66d9a499560284","sha512":"114c767e4c96b23cb34c124f6b3844a58d811d26b9557c45e018a27009750396517812f13dd315beda32c3791abb5c5a844804383c6863d7f1ede1ea6459715f","ssdeep":"12288:AdzOUk4RqHmf2lGNDPcrX8p81Lp0O5wW1W4txnVzvJWp79MLnQl:Adz7k4sHZGYX8p81Lp0O55ztbzs9MLnI","tlshash":"fbe409acb644742642e371b4446f150b91362449b50bc998ff6ad9caacbc58f323bf3d","first_seen":"2025-04-28T11:07:48.50853Z","last_seen":"2026-08-11T00:25:55.277848Z","times_seen":30,"resource_available":true,"data":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuZWNoYXJ0cz1lKCk6dC5lY2hhcnRzPWUoKX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2lmKGlbbl0pcmV0dXJuIGlbbl0uZXhwb3J0czt2YXIgYT1pW25dPXtleHBvcnRzOnt9LGlkOm4sbG9hZGVkOiExfTtyZXR1cm4gdFtuXS5jYWxsKGEuZXhwb3J0cyxhLGEuZXhwb3J0cyxlKSxhLmxvYWRlZD0hMCxhLmV4cG9ydHN9dmFyIGk9e307cmV0dXJuIGUubT10LGUuYz1pLGUucD0iIixlKDApfShbZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz1pKDIpLGkoMTEzKSxpKDEwNyksaSgxMTcpLGkoMTk3KSxpKDMzOSksaSgzMjcpLGkoMzU0KSxpKDMwMSksaSgyOTcpLGkoMjkzKSxpKDMzNCksaSgzNDQpLGkoMjc4KSxpKDI4MyksaSgyOTApLGkoMzIyKSxpKDMxNCksaSgzMzgpLGkoMzQ5KSxpKDI4OSksaSgyMTMpLGkoMjE0KSxpKDIyMSksaSgyNDApLGkoNTgpLGkoMzgxKSxpKDM3OCksaSgyNTkpLGkoMjYwKSxpKDM2OSksaSgzNzYpLGkoMjMxKSxpKDIwMyksaSgzOTUpLGkoMjI0KSxpKDIyMyksaSgyMjIpLGkoMzg1KSxpKDIzMiksaSgyNDcpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7aWYobnVsbD09dHx8Im9iamVjdCIhPXR5cGVvZiB0KXJldHVybiB0O3ZhciBlPXQsbj1HLmNhbGwodCk7aWYoIltvYmplY3QgQXJyYXldIj09PW4pe2U9W107Zm9yKHZhciBhPTAsbz10Lmxlbmd0aDthPG87YSsrKWVbYV09aSh0W2FdKX1lbHNlIGlmKEJbbl0pe3ZhciByPXQuY29uc3RydWN0b3I7aWYodC5jb25zdHJ1Y3Rvci5mcm9tKWU9ci5mcm9tKHQpO2Vsc2V7ZT1uZXcgcih0Lmxlbmd0aCk7Zm9yKHZhciBhPTAsbz10Lmxlbmd0aDthPG87YSsrKWVbYV09aSh0W2FdKX19ZWxzZSBpZighVltuXSYmIXoodCkmJiFJKHQpKXtlPXt9O2Zvcih2YXIgcyBpbiB0KXQuaGFzT3duUHJvcGVydHkocykmJihlW3NdPWkodFtzXSkpfXJldHVybiBlfWZ1bmN0aW9uIG4odCxlLGEpe2lmKCFTKGUpfHwhUyh0KSlyZXR1cm4gYT9pKGUpOnQ7Zm9yKHZhciBvIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIHI9dFtvXSxzPWVbb107IVMocyl8fCFTKHIpfHxfKHMpfHxfKHIpfHxJKHMpfHxJKHIpfHxNKHMpfHxNKHIpfHx6KHMpfHx6KHIpPyFhJiZvIGluIHR8fCh0W29dPWkoZVtvXSwhMCkpOm4ocixzLGEpfXJldHVybiB0fWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIGk9dFswXSxhPTEsbz10Lmxlbmd0aDthPG87YSsrKWk9bihpLHRbYV0sZSk7cmV0dXJuIGl9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIHIodCxlLGkpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJihpP251bGwhPWVbbl06bnVsbD09dFtuXSkmJih0W25dPWVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIHMoKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIil9ZnVuY3Rpb24gbCgpe3JldHVybiBOfHwoTj0kLmNyZWF0ZUNhbnZhcygpLmdldENvbnRleHQoIjJkIikpLE59ZnVuY3Rpb24gdSh0LGUpe2lmKHQpe2lmKHQuaW5kZXhPZilyZXR1cm4gdC5pbmRleE9mKGUpO2Zvcih2YXIgaT0wLG49dC5sZW5ndGg7aTxuO2krKylpZih0W2ldPT09ZSlyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBoKHQsZSl7ZnVuY3Rpb24gaSgpe312YXIgbj10LnByb3RvdHlwZTtpLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgaTtmb3IodmFyIGEgaW4gbil0LnByb3RvdHlwZVthXT1uW2FdO3QucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5zdXBlckNsYXNzPWV9ZnVuY3Rpb24gYyh0LGUsaSl7dD0icHJvdG90eXBlImluIHQ/dC5wcm90b3R5cGU6dCxlPSJwcm90b3R5cGUiaW4gZT9lLnByb3RvdHlwZTplLHIodCxlLGkpfWZ1bmN0aW9uIGQodCl7aWYodClyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGh9ZnVuY3Rpb24gZih0LGUsaSl7aWYodCYmZSlpZih0LmZvckVhY2gmJnQuZm9yRWFjaD09PVcpdC5mb3JFYWNoKGUsaSk7ZWxzZSBpZih0Lmxlbmd0aD09PSt0Lmxlbmd0aClmb3IodmFyIG49MCxhPXQubGVuZ3RoO248YTtuKyspZS5jYWxsKGksdFtuXSxuLHQpO2Vsc2UgZm9yKHZhciBvIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShvKSYmZS5jYWxsKGksdFtvXSxvLHQpfWZ1bmN0aW9uIHAodCxlLGkpe2lmKHQmJmUpe2lmKHQubWFwJiZ0Lm1hcD09PXEpcmV0dXJuIHQubWFwKGUsaSk7Zm9yKHZhciBuPVtdLGE9MCxvPXQubGVuZ3RoO2E8bzthKyspbi5wdXNoKGUuY2FsbChpLHRbYV0sYSx0KSk7cmV0dXJuIG59fWZ1bmN0aW9uIGcodCxlLGksbil7aWYodCYmZSl7aWYodC5yZWR1Y2UmJnQucmVkdWNlPT09ailyZXR1cm4gdC5yZWR1Y2UoZSxpLG4pO2Zvcih2YXIgYT0wLG89dC5sZW5ndGg7YTxvO2ErKylpPWUuY2FsbChuLGksdFthXSxhLHQpO3JldHVybiBpfX1mdW5jdGlvbiBtKHQsZSxpKXtpZih0JiZlKXtpZih0LmZpbHRlciYmdC5maWx0ZXI9PT1GKXJldHVybiB0LmZpbHRlcihlLGkpO2Zvcih2YXIgbj1bXSxhPTAsbz10Lmxlbmd0aDthPG87YSsrKWUuY2FsbChpLHRbYV0sYSx0KSYmbi5wdXNoKHRbYV0pO3JldHVybiBufX1mdW5jdGlvbiB2KHQsZSxpKXtpZih0JiZlKWZvcih2YXIgbj0wLGE9dC5sZW5ndGg7bjxhO24rKylpZihlLmNhbGwoaSx0W25dLG4sdCkpcmV0dXJuIHRbbl19ZnVuY3Rpb24geSh0LGUpe3ZhciBpPVouY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxpLmNvbmNhdChaLmNhbGwoYXJndW1lbnRzKSkpfX1mdW5jdGlvbiB4KHQpe3ZhciBlPVouY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxlLmNvbmNhdChaLmNhbGwoYXJndW1lbnRzKSkpfX1mdW5jdGlvbiBfKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1HLmNhbGwodCl9ZnVuY3Rpb24gYih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiB3KHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09Ry5jYWxsKHQpfWZ1bmN0aW9uIFModCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuImZ1bmN0aW9uIj09PWV8fCEhdCYmIm9iamVjdCI9PWV9ZnVuY3Rpb24gTSh0KXtyZXR1cm4hIVZbRy5jYWxsKHQpXX1mdW5jdGlvbiBJKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0Lm5vZGVUeXBlJiYib2JqZWN0Ij09dHlwZW9mIHQub3duZXJEb2N1bWVudH1mdW5jdGlvbiBUKHQpe3JldHVybiB0IT09dH1mdW5jdGlvbiBBKHQpe2Zvcih2YXIgZT0wLGk9YXJndW1lbnRzLmxlbmd0aDtlPGk7ZSsrKWlmKG51bGwhPWFyZ3VtZW50c1tlXSlyZXR1cm4gYXJndW1lbnRzW2VdfWZ1bmN0aW9uIEModCxlKXtyZXR1cm4gbnVsbCE9dD90OmV9ZnVuY3Rpb24gTCh0LGUsaSl7cmV0dXJuIG51bGwhPXQ/dDpudWxsIT1lP2U6aX1mdW5jdGlvbiBEKCl7cmV0dXJuIEZ1bmN0aW9uLmNhbGwuYXBwbHkoWixhcmd1bWVudHMpfWZ1bmN0aW9uIFAodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVyblt0LHQsdCx0XTt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gMj09PWU/W3RbMF0sdFsxXSx0WzBdLHRbMV1dOjM9PT1lP1t0WzBdLHRbMV0sdFsyXSx0WzFdXTp0fWZ1bmN0aW9uIGsodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gTyh0KXt0W1VdPSEwfWZ1bmN0aW9uIHoodCl7cmV0dXJuIHRbVV19ZnVuY3Rpb24gUih0KXt0JiZmKHQsZnVuY3Rpb24odCxlKXt0aGlzLnNldChlLHQpfSx0aGlzKX1mdW5jdGlvbiBFKHQpe3JldHVybiBuZXcgUih0KX12YXIgTixWPXsiW29iamVjdCBGdW5jdGlvbl0iOjEsIltvYmplY3QgUmVnRXhwXSI6MSwiW29iamVjdCBEYXRlXSI6MSwiW29iamVjdCBFcnJvcl0iOjEsIltvYmplY3QgQ2FudmFzR3JhZGllbnRdIjoxLCJbb2JqZWN0IENhbnZhc1BhdHRlcm5dIjoxLCJbb2JqZWN0IEltYWdlXSI6MSwiW29iamVjdCBDYW52YXNdIjoxfSxCPXsiW29iamVjdCBJbnQ4QXJyYXldIjoxLCJbb2JqZWN0IFVpbnQ4QXJyYXldIjoxLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSI6MSwiW29iamVjdCBJbnQxNkFycmF5XSI6MSwiW29iamVjdCBVaW50MTZBcnJheV0iOjEsIltvYmplY3QgSW50MzJBcnJheV0iOjEsIltvYmplY3QgVWludDMyQXJyYXldIjoxLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iOjEsIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6MX0sRz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEg9QXJyYXkucHJvdG90eXBlLFc9SC5mb3JFYWNoLEY9SC5maWx0ZXIsWj1ILnNsaWNlLHE9SC5tYXAsaj1ILnJlZHVjZSxVPSJfX2VjX3ByaW1pdGl2ZV9fIixYPSJfZWNfIixZPTQ7Ui5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlIsZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW1grdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzW1grdF09ZSxlfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZSYmKHQ9eSh0LGUpKTtmb3IodmFyIGkgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KGkpJiZ0KHRoaXNbaV0saS5zbGljZShZKSl9LHJlbW92ZUtleTpmdW5jdGlvbih0KXtkZWxldGUgdGhpc1tYK3RdfX07dmFyICQ9e2luaGVyaXRzOmgsbWl4aW46YyxjbG9uZTppLG1lcmdlOm4sbWVyZ2VBbGw6YSxleHRlbmQ6byxkZWZhdWx0czpyLGdldENvbnRleHQ6bCxjcmVhdGVDYW52YXM6cyxpbmRleE9mOnUsc2xpY2U6RCxmaW5kOnYsaXNBcnJheUxpa2U6ZCxlYWNoOmYsbWFwOnAscmVkdWNlOmcsZmlsdGVyOm0sYmluZDp5LGN1cnJ5OngsaXNBcnJheTpfLGlzU3RyaW5nOncsaXNPYmplY3Q6Uyxpc0Z1bmN0aW9uOmIsaXNCdWlsdEluT2JqZWN0Ok0saXNEb206SSxlcU5hTjpULHJldHJpZXZlOkEscmV0cmlldmUyOkMscmV0cmlldmUzOkwsYXNzZXJ0Omssc2V0QXNQcmltaXRpdmU6TyxjcmVhdGVIYXNoTWFwOkUsbm9ybWFsaXplQ3NzQXJyYXk6UCxub29wOmZ1bmN0aW9uKCl7fX07dC5leHBvcnRzPSR9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbihlLGksbil7ZT1lJiZlLnRvTG93ZXJDYXNlKCksQi5wcm90b3R5cGVbdF0uY2FsbCh0aGlzLGUsaSxuKX19ZnVuY3Rpb24gYSgpe0IuY2FsbCh0aGlzKX1mdW5jdGlvbiBvKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHQucHJpby1lLnByaW99aT1pfHx7fSwic3RyaW5nIj09dHlwZW9mIGUmJihlPXV0W2VdKSx0aGlzLmlkLHRoaXMuZ3JvdXAsdGhpcy5fZG9tPXQ7dmFyIG89dGhpcy5fenI9RS5pbml0KHQse3JlbmRlcmVyOmkucmVuZGVyZXJ8fCJjYW52YXMiLGRldmljZVBpeGVsUmF0aW86aS5kZXZpY2VQaXhlbFJhdGlvLHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fSk7dGhpcy5fdGhyb3R0bGVkWnJGbHVzaD1SLnRocm90dGxlKE4uYmluZChvLmZsdXNoLG8pLDE3KTt2YXIgZT1OLmNsb25lKGUpO2UmJkMoZSwhMCksdGhpcy5fdGhlbWU9ZSx0aGlzLl9jaGFydHNWaWV3cz1bXSx0aGlzLl9jaGFydHNNYXA9e30sdGhpcy5fY29tcG9uZW50c1ZpZXdzPVtdLHRoaXMuX2NvbXBvbmVudHNNYXA9e30sdGhpcy5fY29vcmRTeXNNZ3I9bmV3IFQsdGhpcy5fYXBpPWIodGhpcyksQi5jYWxsKHRoaXMpLHRoaXMuX21lc3NhZ2VDZW50ZXI9bmV3IGEsdGhpcy5faW5pdEV2ZW50cygpLHRoaXMucmVzaXplPU4uYmluZCh0aGlzLnJlc2l6ZSx0aGlzKSx0aGlzLl9wZW5kaW5nQWN0aW9ucz1bXSxHKGx0LG4pLEcob3Qsbiksby5hbmltYXRpb24ub24oImZyYW1lIix0aGlzLl9vbmZyYW1lLHRoaXMpLE4uc2V0QXNQcmltaXRpdmUodGhpcyl9ZnVuY3Rpb24gcih0LGUsaSl7dmFyIG4sYT10aGlzLl9tb2RlbCxvPXRoaXMuX2Nvb3JkU3lzTWdyLmdldENvb3JkaW5hdGVTeXN0ZW1zKCk7ZT16LnBhcnNlRmluZGVyKGEsZSk7Zm9yKHZhciByPTA7cjxvLmxlbmd0aDtyKyspe3ZhciBzPW9bcl07aWYoc1t0XSYmbnVsbCE9KG49c1t0XShhLGUsaSkpKXJldHVybiBufX1mdW5jdGlvbiBzKHQsZSxpLG4sYSl7ZnVuY3Rpb24gbyhuKXtuJiZuLl9fYWxpdmUmJm5bZV0mJm5bZV0obi5fX21vZGVsLHIsdC5fYXBpLGkpfXZhciByPXQuX21vZGVsO2lmKCFuKXJldHVybiB2b2lkIEgodC5fY29tcG9uZW50c1ZpZXdzLmNvbmNhdCh0Ll9jaGFydHNWaWV3cyksbyk7dmFyIHM9e307c1tuKyJJZCJdPWlbbisiSWQiXSxzW24rIkluZGV4Il09aVtuKyJJbmRleCJdLHNbbisiTmFtZSJdPWlbbisiTmFtZSJdO3ZhciBsPXttYWluVHlwZTpuLHF1ZXJ5OnN9O2EmJihsLnN1YlR5cGU9YSksciYmci5lYWNoQ29tcG9uZW50KGwsZnVuY3Rpb24oZSxpKXtvKHRbInNlcmllcyI9PT1uPyJfY2hhcnRzTWFwIjoiX2NvbXBvbmVudHNNYXAiXVtlLl9fdmlld0lkXSl9LHQpfWZ1bmN0aW9uIGwodCxlKXt2YXIgaT10LnR5cGUsbj10LmVzY2FwZUNvbm5lY3QsYT1udFtpXSxvPWEuYWN0aW9uSW5mbyxyPShvLnVwZGF0ZXx8InVwZGF0ZSIpLnNwbGl0KCI6IiksbD1yLnBvcCgpO3I9bnVsbCE9clswXSYmVyhyWzBdKSx0aGlzWyRdPSEwO3ZhciB1PVt0XSxoPSExO3QuYmF0Y2gmJihoPSEwLHU9Ti5tYXAodC5iYXRjaCxmdW5jdGlvbihlKXtyZXR1cm4gZT1OLmRlZmF1bHRzKE4uZXh0ZW5kKHt9LGUpLHQpLGUuYmF0Y2g9bnVsbCxlfSkpO3ZhciBjLGQ9W10sZj0iaGlnaGxpZ2h0Ij09PWl8fCJkb3ducGxheSI9PT1pO0godSxmdW5jdGlvbih0KXtjPWEuYWN0aW9uKHQsdGhpcy5fbW9kZWwsdGhpcy5fYXBpKSxjPWN8fE4uZXh0ZW5kKHt9LHQpLGMudHlwZT1vLmV2ZW50fHxjLnR5cGUsZC5wdXNoKGMpLGY/cyh0aGlzLGwsdCwic2VyaWVzIik6ciYmcyh0aGlzLGwsdCxyLm1haW4sci5zdWIpfSx0aGlzKSwibm9uZSI9PT1sfHxmfHxyfHwodGhpc1tKXT8oZXQucHJlcGFyZUFuZFVwZGF0ZS5jYWxsKHRoaXMsdCksdGhpc1tKXT0hMSk6ZXRbbF0uY2FsbCh0aGlzLHQpKSxjPWg/e3R5cGU6by5ldmVudHx8aSxlc2NhcGVDb25uZWN0Om4sYmF0Y2g6ZH06ZFswXSx0aGlzWyRdPSExLCFlJiZ0aGlzLl9tZXNzYWdlQ2VudGVyLnRyaWdnZXIoYy50eXBlLGMpfWZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlPXRoaXMuX3BlbmRpbmdBY3Rpb25zO2UubGVuZ3RoOyl7dmFyIGk9ZS5zaGlmdCgpO2wuY2FsbCh0aGlzLGksdCl9fWZ1bmN0aW9uIGgodCl7IXQmJnRoaXMudHJpZ2dlcigidXBkYXRlZCIpfWZ1bmN0aW9uIGModCxlLGkpe3ZhciBuPXRoaXMuX2FwaTtIKHRoaXMuX2NvbXBvbmVudHNWaWV3cyxmdW5jdGlvbihhKXt2YXIgbz1hLl9fbW9kZWw7YVt0XShvLGUsbixpKSxfKG8sYSl9LHRoaXMpLGUuZWFjaFNlcmllcyhmdW5jdGlvbihhLG8pe3ZhciByPXRoaXMuX2NoYXJ0c01hcFthLl9fdmlld0lkXTtyW3RdKGEsZSxuLGkpLF8oYSxyKSx4KGEscil9LHRoaXMpLHkodGhpcy5fenIsZSksSChzdCxmdW5jdGlvbih0KXt0KGUsbil9KX1mdW5jdGlvbiBkKHQsZSl7Zm9yKHZhciBpPSJjb21wb25lbnQiPT09dCxuPWk/dGhpcy5fY29tcG9uZW50c1ZpZXdzOnRoaXMuX2NoYXJ0c1ZpZXdzLGE9aT90aGlzLl9jb21wb25lbnRzTWFwOnRoaXMuX2NoYXJ0c01hcCxvPXRoaXMuX3pyLHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdLl9fYWxpdmU9ITE7ZVtpPyJlYWNoQ29tcG9uZW50IjoiZWFjaFNlcmllcyJdKGZ1bmN0aW9uKHQscil7aWYoaSl7aWYoInNlcmllcyI9PT10KXJldHVybn1lbHNlIHI9dDt2YXIgcz0iX2VjXyIrci5pZCsiXyIrci50eXBlLGw9YVtzXTtpZighbCl7dmFyIHU9VyhyLnR5cGUpLGg9aT9QLmdldENsYXNzKHUubWFpbix1LnN1Yik6ay5nZXRDbGFzcyh1LnN1Yik7aWYoIWgpcmV0dXJuO2w9bmV3IGgsbC5pbml0KGUsdGhpcy5fYXBpKSxhW3NdPWwsbi5wdXNoKGwpLG8uYWRkKGwuZ3JvdXApfXIuX192aWV3SWQ9bC5fX2lkPXMsbC5fX2FsaXZlPSEwLGwuX19tb2RlbD1yLGwuZ3JvdXAuX19lY0NvbXBvbmVudEluZm89e21haW5UeXBlOnIubWFpblR5cGUsaW5kZXg6ci5jb21wb25lbnRJbmRleH19LHRoaXMpO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7KXt2YXIgcz1uW3JdO3MuX19hbGl2ZT9yKys6KG8ucmVtb3ZlKHMuZ3JvdXApLHMuZGlzcG9zZShlLHRoaXMuX2FwaSksbi5zcGxpY2UociwxKSxkZWxldGUgYVtzLl9faWRdLHMuX19pZD1zLmdyb3VwLl9fZWNDb21wb25lbnRJbmZvPW51bGwpfX1mdW5jdGlvbiBmKHQsZSl7SChvdCxmdW5jdGlvbihpKXtpLmZ1bmModCxlKX0pfWZ1bmN0aW9uIHAodCl7dmFyIGU9e307dC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ2V0KCJzdGFjayIpLG49dC5nZXREYXRhKCk7aWYoaSYmImxpc3QiPT09bi50eXBlKXt2YXIgYT1lW2ldO2UuaGFzT3duUHJvcGVydHkoaSkmJmEmJihuLnN0YWNrZWRPbj1hKSxlW2ldPW59fSl9ZnVuY3Rpb24gZyh0LGUpe3ZhciBpPXRoaXMuX2FwaTtIKGx0LGZ1bmN0aW9uKG4pe24uaXNMYXlvdXQmJm4uZnVuYyh0LGksZSl9KX1mdW5jdGlvbiBtKHQsZSxpKXt2YXIgbj10aGlzLl9hcGk7dC5jbGVhckNvbG9yUGFsZXR0ZSgpLHQuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt0LmNsZWFyQ29sb3JQYWxldHRlKCl9KSxIKGx0LGZ1bmN0aW9uKGEpeyghaXx8IWEuaXNMYXlvdXQpJiZhLmZ1bmModCxuLGUpfSl9ZnVuY3Rpb24gdih0LGUpe3ZhciBpPXRoaXMuX2FwaTtIKHRoaXMuX2NvbXBvbmVudHNWaWV3cyxmdW5jdGlvbihuKXt2YXIgYT1uLl9fbW9kZWw7bi5yZW5kZXIoYSx0LGksZSksXyhhLG4pfSx0aGlzKSxIKHRoaXMuX2NoYXJ0c1ZpZXdzLGZ1bmN0aW9uKHQpe3QuX19hbGl2ZT0hMX0sdGhpcyksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKG4sYSl7dmFyIG89dGhpcy5fY2hhcnRzTWFwW24uX192aWV3SWRdO28uX19hbGl2ZT0hMCxvLnJlbmRlcihuLHQsaSxlKSxvLmdyb3VwLnNpbGVudD0hIW4uZ2V0KCJzaWxlbnQiKSxfKG4sbykseChuLG8pfSx0aGlzKSx5KHRoaXMuX3pyLHQpLEgodGhpcy5fY2hhcnRzVmlld3MsZnVuY3Rpb24oZSl7ZS5fX2FsaXZlfHxlLnJlbW92ZSh0LGkpfSx0aGlzKX1mdW5jdGlvbiB5KHQsZSl7dmFyIGk9dC5zdG9yYWdlLG49MDtpLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3QuaXNHcm91cHx8bisrfSksbj5lLmdldCgiaG92ZXJMYXllclRocmVzaG9sZCIpJiYhUy5ub2RlJiZpLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3QuaXNHcm91cHx8KHQudXNlSG92ZXJMYXllcj0hMCl9KX1mdW5jdGlvbiB4KHQsZSl7dmFyIGk9MDtlLmdyb3VwLnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJncm91cCI9PT10LnR5cGV8fHQuaWdub3JlfHxpKyt9KTt2YXIgbj0rdC5nZXQoInByb2dyZXNzaXZlIiksYT1pPnQuZ2V0KCJwcm9ncmVzc2l2ZVRocmVzaG9sZCIpJiZuJiYhUy5ub2RlO2EmJmUuZ3JvdXAudHJhdmVyc2UoZnVuY3Rpb24odCl7dC5pc0dyb3VwfHwodC5wcm9ncmVzc2l2ZT1hP01hdGguZmxvb3IoaSsrL24pOi0xLGEmJnQuc3RvcEFuaW1hdGlvbighMCkpfSk7dmFyIG89dC5nZXQoImJsZW5kTW9kZSIpfHxudWxsO2UuZ3JvdXAudHJhdmVyc2UoZnVuY3Rpb24odCl7dC5pc0dyb3VwfHx0LnNldFN0eWxlKCJibGVuZCIsbyl9KX1mdW5jdGlvbiBfKHQsZSl7dmFyIGk9dC5nZXQoInoiKSxuPXQuZ2V0KCJ6bGV2ZWwiKTtlLmdyb3VwLnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJncm91cCIhPT10LnR5cGUmJihudWxsIT1pJiYodC56PWkpLG51bGwhPW4mJih0LnpsZXZlbD1uKSl9KX1mdW5jdGlvbiBiKHQpe3ZhciBlPXQuX2Nvb3JkU3lzTWdyO3JldHVybiBOLmV4dGVuZChuZXcgSSh0KSx7Z2V0Q29vcmRpbmF0ZVN5c3RlbXM6Ti5iaW5kKGUuZ2V0Q29vcmRpbmF0ZVN5c3RlbXMsZSksZ2V0Q29tcG9uZW50QnlFbGVtZW50OmZ1bmN0aW9uKGUpe2Zvcig7ZTspe3ZhciBpPWUuX19lY0NvbXBvbmVudEluZm87aWYobnVsbCE9aSlyZXR1cm4gdC5fbW9kZWwuZ2V0Q29tcG9uZW50KGkubWFpblR5cGUsaS5pbmRleCk7ZT1lLnBhcmVudH19fSl9ZnVuY3Rpb24gdyh0KXtmdW5jdGlvbiBlKHQsZSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBuPXRbaV07bltvXT1lfX12YXIgaT0wLG49MSxhPTIsbz0iX19jb25uZWN0VXBkYXRlU3RhdHVzIjtOLmVhY2goYXQsZnVuY3Rpb24ocixzKXt0Ll9tZXNzYWdlQ2VudGVyLm9uKHMsZnVuY3Rpb24ocil7aWYoZHRbdC5ncm91cF0mJnRbb10hPT1pKXtpZihyJiZyLmVzY2FwZUNvbm5lY3QpcmV0dXJuO3ZhciBzPXQubWFrZUFjdGlvbkZyb21FdmVudChyKSxsPVtdO04uZWFjaChjdCxmdW5jdGlvbihlKXtlIT09dCYmZS5ncm91cD09PXQuZ3JvdXAmJmwucHVzaChlKX0pLGUobCxpKSxIKGwsZnVuY3Rpb24odCl7dFtvXSE9PW4mJnQuZGlzcGF0Y2hBY3Rpb24ocyl9KSxlKGwsYSl9fSl9KX0vKiEKCSAqIEVDaGFydHMsIGEgamF2YXNjcmlwdCBpbnRlcmFjdGl2ZSBjaGFydCBsaWJyYXJ5LgoJICoKCSAqIENvcHlyaWdodCAoYykgMjAxNSwgQmFpZHUgSW5jLgoJICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KCSAqCgkgKiBMSUNFTlNFCgkgKiBodHRwczovL2dpdGh1Yi5jb20vZWNvbWZlL2VjaGFydHMvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKCSAqLwp2YXIgUz1pKDEwKSxNPWkoMTQ0KSxJPWkoMTA2KSxUPWkoMjYpLEE9aSgxNDUpLEM9aSgxNTIpLEw9aSgxMyksRD1pKDE3KSxQPWkoNjgpLGs9aSgzMCksTz1pKDMpLHo9aSg1KSxSPWkoMzcpLEU9aSg5MyksTj1pKDEpLFY9aSgyMiksQj1pKDIzKSxHPWkoNTIpLEg9Ti5lYWNoLFc9TC5wYXJzZUNsYXNzVHlwZSxGPTFlMyxaPTVlMyxxPTFlMyxqPTJlMyxVPTNlMyxYPTRlMyxZPTVlMywkPSJfX2ZsYWdJbk1haW5Qcm9jZXNzIixLPSJfX2hhc0dyYWRpZW50T3JQYXR0ZXJuQmciLEo9Il9fb3B0aW9uVXBkYXRlZCIsUT0vXlthLXpBLVowLTlfXSskLzthLnByb3RvdHlwZS5vbj1uKCJvbiIpLGEucHJvdG90eXBlLm9mZj1uKCJvZmYiKSxhLnByb3RvdHlwZS5vbmU9bigib25lIiksTi5taXhpbihhLEIpO3ZhciB0dD1vLnByb3RvdHlwZTt0dC5fb25mcmFtZT1mdW5jdGlvbigpe2lmKHRoaXNbSl0pe3ZhciB0PXRoaXNbSl0uc2lsZW50O3RoaXNbJF09ITAsZXQucHJlcGFyZUFuZFVwZGF0ZS5jYWxsKHRoaXMpLHRoaXNbJF09ITEsdGhpc1tKXT0hMSx1LmNhbGwodGhpcyx0KSxoLmNhbGwodGhpcyx0KX19LHR0LmdldERvbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb219LHR0LmdldFpyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pyfSx0dC5zZXRPcHRpb249ZnVuY3Rpb24odCxlLGkpe3ZhciBuO2lmKE4uaXNPYmplY3QoZSkmJihpPWUubGF6eVVwZGF0ZSxuPWUuc2lsZW50LGU9ZS5ub3RNZXJnZSksdGhpc1skXT0hMCwhdGhpcy5fbW9kZWx8fGUpe3ZhciBhPW5ldyBBKHRoaXMuX2FwaSksbz10aGlzLl90aGVtZSxyPXRoaXMuX21vZGVsPW5ldyBNKG51bGwsbnVsbCxvLGEpO3IuaW5pdChudWxsLG51bGwsbyxhKX10aGlzLl9tb2RlbC5zZXRPcHRpb24odCxydCksaT8odGhpc1tKXT17c2lsZW50Om59LHRoaXNbJF09ITEpOihldC5wcmVwYXJlQW5kVXBkYXRlLmNhbGwodGhpcyksdGhpcy5fenIuZmx1c2goKSx0aGlzW0pdPSExLHRoaXNbJF09ITEsdS5jYWxsKHRoaXMsbiksaC5jYWxsKHRoaXMsbikpfSx0dC5zZXRUaGVtZT1mdW5jdGlvbigpe2NvbnNvbGUubG9nKCJFQ2hhcnRzI3NldFRoZW1lKCkgaXMgREVQUkVDQVRFRCBpbiBFQ2hhcnRzIDMuMCIpfSx0dC5nZXRNb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbH0sdHQuZ2V0T3B0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsJiZ0aGlzLl9tb2RlbC5nZXRPcHRpb24oKX0sdHQuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fenIuZ2V0V2lkdGgoKX0sdHQuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pyLmdldEhlaWdodCgpfSx0dC5nZXREZXZpY2VQaXhlbFJhdGlvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pyLnBhaW50ZXIuZHByfHx3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MX0sdHQuZ2V0UmVuZGVyZWRDYW52YXM9ZnVuY3Rpb24odCl7aWYoUy5jYW52YXNTdXBwb3J0ZWQpe3Q9dHx8e30sdC5waXhlbFJhdGlvPXQucGl4ZWxSYXRpb3x8MSx0LmJhY2tncm91bmRDb2xvcj10LmJhY2tncm91bmRDb2xvcnx8dGhpcy5fbW9kZWwuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKTt2YXIgZT10aGlzLl96cixpPWUuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCgpO3JldHVybiBOLmVhY2goaSxmdW5jdGlvbih0KXt0LnN0b3BBbmltYXRpb24oITApfSksZS5wYWludGVyLmdldFJlbmRlcmVkQ2FudmFzKHQpfX0sdHQuZ2V0RGF0YVVSTD1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlPXQuZXhjbHVkZUNvbXBvbmVudHMsaT10aGlzLl9tb2RlbCxuPVtdLGE9dGhpcztIKGUsZnVuY3Rpb24odCl7aS5lYWNoQ29tcG9uZW50KHttYWluVHlwZTp0fSxmdW5jdGlvbih0KXt2YXIgZT1hLl9jb21wb25lbnRzTWFwW3QuX192aWV3SWRdO2UuZ3JvdXAuaWdub3JlfHwobi5wdXNoKGUpLGUuZ3JvdXAuaWdub3JlPSEwKX0pfSk7dmFyIG89dGhpcy5nZXRSZW5kZXJlZENhbnZhcyh0KS50b0RhdGFVUkwoImltYWdlLyIrKHQmJnQudHlwZXx8InBuZyIpKTtyZXR1cm4gSChuLGZ1bmN0aW9uKHQpe3QuZ3JvdXAuaWdub3JlPSExfSksb30sdHQuZ2V0Q29ubmVjdGVkRGF0YVVSTD1mdW5jdGlvbih0KXtpZihTLmNhbnZhc1N1cHBvcnRlZCl7dmFyIGU9dGhpcy5ncm91cCxpPU1hdGgubWluLG49TWF0aC5tYXgsYT0xLzA7aWYoZHRbZV0pe3ZhciBvPWEscj1hLHM9LWEsbD0tYSx1PVtdLGg9dCYmdC5waXhlbFJhdGlvfHwxO04uZWFjaChjdCxmdW5jdGlvbihhLGgpe2lmKGEuZ3JvdXA9PT1lKXt2YXIgYz1hLmdldFJlbmRlcmVkQ2FudmFzKE4uY2xvbmUodCkpLGQ9YS5nZXREb20oKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtvPWkoZC5sZWZ0LG8pLHI9aShkLnRvcCxyKSxzPW4oZC5yaWdodCxzKSxsPW4oZC5ib3R0b20sbCksdS5wdXNoKHtkb206YyxsZWZ0OmQubGVmdCx0b3A6ZC50b3B9KX19KSxvKj1oLHIqPWgscyo9aCxsKj1oO3ZhciBjPXMtbyxkPWwtcixmPU4uY3JlYXRlQ2FudmFzKCk7Zi53aWR0aD1jLGYuaGVpZ2h0PWQ7dmFyIHA9RS5pbml0KGYpO3JldHVybiBIKHUsZnVuY3Rpb24odCl7dmFyIGU9bmV3IE8uSW1hZ2Uoe3N0eWxlOnt4OnQubGVmdCpoLW8seTp0LnRvcCpoLXIsaW1hZ2U6dC5kb219fSk7cC5hZGQoZSl9KSxwLnJlZnJlc2hJbW1lZGlhdGVseSgpLGYudG9EYXRhVVJMKCJpbWFnZS8iKyh0JiZ0LnR5cGV8fCJwbmciKSl9cmV0dXJuIHRoaXMuZ2V0RGF0YVVSTCh0KX19LHR0LmNvbnZlcnRUb1BpeGVsPU4uY3VycnkociwiY29udmVydFRvUGl4ZWwiKSx0dC5jb252ZXJ0RnJvbVBpeGVsPU4uY3VycnkociwiY29udmVydEZyb21QaXhlbCIpLHR0LmNvbnRhaW5QaXhlbD1mdW5jdGlvbih0LGUpe3ZhciBpLG49dGhpcy5fbW9kZWw7cmV0dXJuIHQ9ei5wYXJzZUZpbmRlcihuLHQpLE4uZWFjaCh0LGZ1bmN0aW9uKHQsbil7bi5pbmRleE9mKCJNb2RlbHMiKT49MCYmTi5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIGE9dC5jb29yZGluYXRlU3lzdGVtO2lmKGEmJmEuY29udGFpblBvaW50KWl8PSEhYS5jb250YWluUG9pbnQoZSk7ZWxzZSBpZigic2VyaWVzTW9kZWxzIj09PW4pe3ZhciBvPXRoaXMuX2NoYXJ0c01hcFt0Ll9fdmlld0lkXTtvJiZvLmNvbnRhaW5Qb2ludCYmKGl8PW8uY29udGFpblBvaW50KGUsdCkpfX0sdGhpcyl9LHRoaXMpLCEhaX0sdHQuZ2V0VmlzdWFsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fbW9kZWw7dD16LnBhcnNlRmluZGVyKGksdCx7ZGVmYXVsdE1haW5UeXBlOiJzZXJpZXMifSk7dmFyIG49dC5zZXJpZXNNb2RlbCxhPW4uZ2V0RGF0YSgpLG89dC5oYXNPd25Qcm9wZXJ0eSgiZGF0YUluZGV4SW5zaWRlIik/dC5kYXRhSW5kZXhJbnNpZGU6dC5oYXNPd25Qcm9wZXJ0eSgiZGF0YUluZGV4Iik/YS5pbmRleE9mUmF3SW5kZXgodC5kYXRhSW5kZXgpOm51bGw7cmV0dXJuIG51bGwhPW8/YS5nZXRJdGVtVmlzdWFsKG8sZSk6YS5nZXRWaXN1YWwoZSl9LHR0LmdldFZpZXdPZkNvbXBvbmVudE1vZGVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb21wb25lbnRzTWFwW3QuX192aWV3SWRdfSx0dC5nZXRWaWV3T2ZTZXJpZXNNb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2hhcnRzTWFwW3QuX192aWV3SWRdfTt2YXIgZXQ9e3VwZGF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tb2RlbCxpPXRoaXMuX2FwaSxuPXRoaXMuX2Nvb3JkU3lzTWdyLGE9dGhpcy5fenI7aWYoZSl7ZS5yZXN0b3JlRGF0YSgpLG4uY3JlYXRlKHRoaXMuX21vZGVsLHRoaXMuX2FwaSksZi5jYWxsKHRoaXMsZSxpKSxwLmNhbGwodGhpcyxlKSxuLnVwZGF0ZShlLGkpLG0uY2FsbCh0aGlzLGUsdCksdi5jYWxsKHRoaXMsZSx0KTt2YXIgbz1lLmdldCgiYmFja2dyb3VuZENvbG9yIil8fCJ0cmFuc3BhcmVudCIscj1hLnBhaW50ZXI7aWYoci5pc1NpbmdsZUNhbnZhcyYmci5pc1NpbmdsZUNhbnZhcygpKWEuY29uZmlnTGF5ZXIoMCx7Y2xlYXJDb2xvcjpvfSk7ZWxzZXtpZighUy5jYW52YXNTdXBwb3J0ZWQpe3ZhciBzPVYucGFyc2Uobyk7bz1WLnN0cmluZ2lmeShzLCJyZ2IiKSwwPT09c1szXSYmKG89InRyYW5zcGFyZW50Iil9by5jb2xvclN0b3BzfHxvLmltYWdlPyhhLmNvbmZpZ0xheWVyKDAse2NsZWFyQ29sb3I6b30pLHRoaXNbS109ITAsdGhpcy5fZG9tLnN0eWxlLmJhY2tncm91bmQ9InRyYW5zcGFyZW50Iik6KHRoaXNbS10mJmEuY29uZmlnTGF5ZXIoMCx7Y2xlYXJDb2xvcjpudWxsfSksdGhpc1tLXT0hMSx0aGlzLl9kb20uc3R5bGUuYmFja2dyb3VuZD1vKX1IKHN0LGZ1bmN0aW9uKHQpe3QoZSxpKX0pfX0sdXBkYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tb2RlbDtlJiYoZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3QuZ2V0RGF0YSgpLmNsZWFyQWxsVmlzdWFsKCl9KSxtLmNhbGwodGhpcyxlLHQpLGMuY2FsbCh0aGlzLCJ1cGRhdGVWaWV3IixlLHQpKX0sdXBkYXRlVmlzdWFsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21vZGVsO2UmJihlLmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7dC5nZXREYXRhKCkuY2xlYXJBbGxWaXN1YWwoKX0pLG0uY2FsbCh0aGlzLGUsdCwhMCksYy5jYWxsKHRoaXMsInVwZGF0ZVZpc3VhbCIsZSx0KSl9LHVwZGF0ZUxheW91dDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tb2RlbDtlJiYoZy5jYWxsKHRoaXMsZSx0KSxjLmNhbGwodGhpcywidXBkYXRlTGF5b3V0IixlLHQpKX0scHJlcGFyZUFuZFVwZGF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tb2RlbDtkLmNhbGwodGhpcywiY29tcG9uZW50IixlKSxkLmNhbGwodGhpcywiY2hhcnQiLGUpLGV0LnVwZGF0ZS5jYWxsKHRoaXMsdCl9fTt0dC5yZXNpemU9ZnVuY3Rpb24odCl7dGhpc1skXT0hMCx0aGlzLl96ci5yZXNpemUodCk7dmFyIGU9dGhpcy5fbW9kZWwmJnRoaXMuX21vZGVsLnJlc2V0T3B0aW9uKCJtZWRpYSIpLGk9ZT8icHJlcGFyZUFuZFVwZGF0ZSI6InVwZGF0ZSI7ZXRbaV0uY2FsbCh0aGlzKSx0aGlzLl9sb2FkaW5nRlgmJnRoaXMuX2xvYWRpbmdGWC5yZXNpemUoKSx0aGlzWyRdPSExO3ZhciBuPXQmJnQuc2lsZW50O3UuY2FsbCh0aGlzLG4pLGguY2FsbCh0aGlzLG4pfSx0dC5zaG93TG9hZGluZz1mdW5jdGlvbih0LGUpe2lmKE4uaXNPYmplY3QodCkmJihlPXQsdD0iIiksdD10fHwiZGVmYXVsdCIsdGhpcy5oaWRlTG9hZGluZygpLGh0W3RdKXt2YXIgaT1odFt0XSh0aGlzLl9hcGksZSksbj10aGlzLl96cjt0aGlzLl9sb2FkaW5nRlg9aSxuLmFkZChpKX19LHR0LmhpZGVMb2FkaW5nPWZ1bmN0aW9uKCl7dGhpcy5fbG9hZGluZ0ZYJiZ0aGlzLl96ci5yZW1vdmUodGhpcy5fbG9hZGluZ0ZYKSx0aGlzLl9sb2FkaW5nRlg9bnVsbH0sdHQubWFrZUFjdGlvbkZyb21FdmVudD1mdW5jdGlvbih0KXt2YXIgZT1OLmV4dGVuZCh7fSx0KTtyZXR1cm4gZS50eXBlPWF0W3QudHlwZV0sZX0sdHQuZGlzcGF0Y2hBY3Rpb249ZnVuY3Rpb24odCxlKXtpZihOLmlzT2JqZWN0KGUpfHwoZT17c2lsZW50OiEhZX0pLG50W3QudHlwZV0mJnRoaXMuX21vZGVsKXtpZih0aGlzWyRdKXJldHVybiB2b2lkIHRoaXMuX3BlbmRpbmdBY3Rpb25zLnB1c2godCk7bC5jYWxsKHRoaXMsdCxlLnNpbGVudCksZS5mbHVzaD90aGlzLl96ci5mbHVzaCghMCk6ZS5mbHVzaCE9PSExJiZTLmJyb3dzZXIud2VDaGF0JiZ0aGlzLl90aHJvdHRsZWRackZsdXNoKCksdS5jYWxsKHRoaXMsZS5zaWxlbnQpLGguY2FsbCh0aGlzLGUuc2lsZW50KX19LHR0Lm9uPW4oIm9uIiksdHQub2ZmPW4oIm9mZiIpLHR0Lm9uZT1uKCJvbmUiKTt2YXIgaXQ9WyJjbGljayIsImRibGNsaWNrIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJtb3VzZWRvd24iLCJtb3VzZXVwIiwiZ2xvYmFsb3V0IiwiY29udGV4dG1lbnUiXTt0dC5faW5pdEV2ZW50cz1mdW5jdGlvbigpe0goaXQsZnVuY3Rpb24odCl7dGhpcy5fenIub24odCxmdW5jdGlvbihlKXt2YXIgaSxuPXRoaXMuZ2V0TW9kZWwoKSxhPWUudGFyZ2V0O2lmKCJnbG9iYWxvdXQiPT09dClpPXt9O2Vsc2UgaWYoYSYmbnVsbCE9YS5kYXRhSW5kZXgpe3ZhciBvPWEuZGF0YU1vZGVsfHxuLmdldFNlcmllc0J5SW5kZXgoYS5zZXJpZXNJbmRleCk7aT1vJiZvLmdldERhdGFQYXJhbXMoYS5kYXRhSW5kZXgsYS5kYXRhVHlwZSl8fHt9fWVsc2UgYSYmYS5ldmVudERhdGEmJihpPU4uZXh0ZW5kKHt9LGEuZXZlbnREYXRhKSk7aSYmKGkuZXZlbnQ9ZSxpLnR5cGU9dCx0aGlzLnRyaWdnZXIodCxpKSl9LHRoaXMpfSx0aGlzKSxIKGF0LGZ1bmN0aW9uKHQsZSl7dGhpcy5fbWVzc2FnZUNlbnRlci5vbihlLGZ1bmN0aW9uKHQpe3RoaXMudHJpZ2dlcihlLHQpfSx0aGlzKX0sdGhpcyl9LHR0LmlzRGlzcG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzcG9zZWR9LHR0LmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXRPcHRpb24oe3NlcmllczpbXX0sITApfSx0dC5kaXNwb3NlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rpc3Bvc2VkKXt0aGlzLl9kaXNwb3NlZD0hMDt2YXIgdD10aGlzLl9hcGksZT10aGlzLl9tb2RlbDtIKHRoaXMuX2NvbXBvbmVudHNWaWV3cyxmdW5jdGlvbihpKXtpLmRpc3Bvc2UoZSx0KX0pLEgodGhpcy5fY2hhcnRzVmlld3MsZnVuY3Rpb24oaSl7aS5kaXNwb3NlKGUsdCl9KSx0aGlzLl96ci5kaXNwb3NlKCksZGVsZXRlIGN0W3RoaXMuaWRdfX0sTi5taXhpbihvLEIpO3ZhciBudD17fSxhdD17fSxvdD1bXSxydD1bXSxzdD1bXSxsdD1bXSx1dD17fSxodD17fSxjdD17fSxkdD17fSxmdD1uZXcgRGF0ZS0wLHB0PW5ldyBEYXRlLTAsZ3Q9Il9lY2hhcnRzX2luc3RhbmNlXyIsbXQ9e3ZlcnNpb246IjMuNy4yIixkZXBlbmRlbmNpZXM6e3pyZW5kZXI6IjMuNi4yIn19O210LmluaXQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPW10LmdldEluc3RhbmNlQnlEb20odCk7aWYobilyZXR1cm4gbjt2YXIgYT1uZXcgbyh0LGUsaSk7cmV0dXJuIGEuaWQ9ImVjXyIrZnQrKyxjdFthLmlkXT1hLHQuc2V0QXR0cmlidXRlP3Quc2V0QXR0cmlidXRlKGd0LGEuaWQpOnRbZ3RdPWEuaWQsdyhhKSxhfSxtdC5jb25uZWN0PWZ1bmN0aW9uKHQpe2lmKE4uaXNBcnJheSh0KSl7dmFyIGU9dDt0PW51bGwsTi5lYWNoKGUsZnVuY3Rpb24oZSl7bnVsbCE9ZS5ncm91cCYmKHQ9ZS5ncm91cCl9KSx0PXR8fCJnXyIrcHQrKyxOLmVhY2goZSxmdW5jdGlvbihlKXtlLmdyb3VwPXR9KX1yZXR1cm4gZHRbdF09ITAsdH0sbXQuZGlzQ29ubmVjdD1mdW5jdGlvbih0KXtkdFt0XT0hMX0sbXQuZGlzY29ubmVjdD1tdC5kaXNDb25uZWN0LG10LmRpc3Bvc2U9ZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0P3Q9Y3RbdF06dCBpbnN0YW5jZW9mIG98fCh0PW10LmdldEluc3RhbmNlQnlEb20odCkpLHQgaW5zdGFuY2VvZiBvJiYhdC5pc0Rpc3Bvc2VkKCkmJnQuZGlzcG9zZSgpfSxtdC5nZXRJbnN0YW5jZUJ5RG9tPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXQuZ2V0QXR0cmlidXRlP3QuZ2V0QXR0cmlidXRlKGd0KTp0W2d0XSxjdFtlXX0sbXQuZ2V0SW5zdGFuY2VCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiBjdFt0XX0sbXQucmVnaXN0ZXJUaGVtZT1mdW5jdGlvbih0LGUpe3V0W3RdPWV9LG10LnJlZ2lzdGVyUHJlcHJvY2Vzc29yPWZ1bmN0aW9uKHQpe3J0LnB1c2godCl9LG10LnJlZ2lzdGVyUHJvY2Vzc29yPWZ1bmN0aW9uKHQsZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlPXQsdD1GKSxvdC5wdXNoKHtwcmlvOnQsZnVuYzplfSl9LG10LnJlZ2lzdGVyUG9zdFVwZGF0ZT1mdW5jdGlvbih0KXtzdC5wdXNoKHQpfSxtdC5yZWdpc3RlckFjdGlvbj1mdW5jdGlvbih0LGUsaSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihpPWUsZT0iIik7dmFyIG49Ti5pc09iamVjdCh0KT90LnR5cGU6W3QsdD17ZXZlbnQ6ZX1dWzBdO3QuZXZlbnQ9KHQuZXZlbnR8fG4pLnRvTG93ZXJDYXNlKCksZT10LmV2ZW50LE4uYXNzZXJ0KFEudGVzdChuKSYmUS50ZXN0KGUpKSxudFtuXXx8KG50W25dPXthY3Rpb246aSxhY3Rpb25JbmZvOnR9KSxhdFtlXT1ufSxtdC5yZWdpc3RlckNvb3JkaW5hdGVTeXN0ZW09ZnVuY3Rpb24odCxlKXtULnJlZ2lzdGVyKHQsZSl9LG10LmdldENvb3JkaW5hdGVTeXN0ZW1EaW1lbnNpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPVQuZ2V0KHQpO2lmKGUpcmV0dXJuIGUuZ2V0RGltZW5zaW9uc0luZm8/ZS5nZXREaW1lbnNpb25zSW5mbygpOmUuZGltZW5zaW9ucy5zbGljZSgpfSxtdC5yZWdpc3RlckxheW91dD1mdW5jdGlvbih0LGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9cSksbHQucHVzaCh7cHJpbzp0LGZ1bmM6ZSxpc0xheW91dDohMH0pfSxtdC5yZWdpc3RlclZpc3VhbD1mdW5jdGlvbih0LGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9VSksbHQucHVzaCh7cHJpbzp0LGZ1bmM6ZX0pfSxtdC5yZWdpc3RlckxvYWRpbmc9ZnVuY3Rpb24odCxlKXtodFt0XT1lfSxtdC5leHRlbmRDb21wb25lbnRNb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gTC5leHRlbmQodCl9LG10LmV4dGVuZENvbXBvbmVudFZpZXc9ZnVuY3Rpb24odCl7cmV0dXJuIFAuZXh0ZW5kKHQpfSxtdC5leHRlbmRTZXJpZXNNb2RlbD1mdW5jdGlvbih0KXtyZXR1cm4gRC5leHRlbmQodCl9LG10LmV4dGVuZENoYXJ0Vmlldz1mdW5jdGlvbih0KXtyZXR1cm4gay5leHRlbmQodCl9LG10LnNldENhbnZhc0NyZWF0b3I9ZnVuY3Rpb24odCl7Ti5jcmVhdGVDYW52YXM9dH0sbXQucmVnaXN0ZXJWaXN1YWwoaixpKDE1OCkpLG10LnJlZ2lzdGVyUHJlcHJvY2Vzc29yKEMpLG10LnJlZ2lzdGVyTG9hZGluZygiZGVmYXVsdCIsaSgxNDMpKSxtdC5yZWdpc3RlckFjdGlvbih7dHlwZToiaGlnaGxpZ2h0IixldmVudDoiaGlnaGxpZ2h0Iix1cGRhdGU6ImhpZ2hsaWdodCJ9LE4ubm9vcCksbXQucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImRvd25wbGF5IixldmVudDoiZG93bnBsYXkiLHVwZGF0ZToiZG93bnBsYXkifSxOLm5vb3ApLG10LnpyZW5kZXI9RSxtdC5MaXN0PWkoMTQpLG10Lk1vZGVsPWkoMTEpLG10LkF4aXM9aSgzMyksbXQuZ3JhcGhpYz1pKDMpLG10Lm51bWJlcj1pKDQpLG10LmZvcm1hdD1pKDcpLG10LnRocm90dGxlPVIudGhyb3R0bGUsbXQubWF0cml4PWkoMTkpLG10LnZlY3Rvcj1pKDYpLG10LmNvbG9yPWkoMjIpLG10LnV0aWw9e30sSChbIm1hcCIsImVhY2giLCJmaWx0ZXIiLCJpbmRleE9mIiwiaW5oZXJpdHMiLCJyZWR1Y2UiLCJmaWx0ZXIiLCJiaW5kIiwiY3VycnkiLCJpc0FycmF5IiwiaXNTdHJpbmciLCJpc09iamVjdCIsImlzRnVuY3Rpb24iLCJleHRlbmQiLCJkZWZhdWx0cyIsImNsb25lIiwibWVyZ2UiXSxmdW5jdGlvbih0KXttdC51dGlsW3RdPU5bdF19KSxtdC5oZWxwZXI9aSgxNDIpLG10LlBSSU9SSVRZPXtQUk9DRVNTT1I6e0ZJTFRFUjpGLFNUQVRJU1RJQzpafSxWSVNVQUw6e0xBWU9VVDpxLEdMT0JBTDpqLENIQVJUOlUsQ09NUE9ORU5UOlgsQlJVU0g6WX19LHQuZXhwb3J0cz1tdH0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiBudWxsIT10JiYibm9uZSIhPXR9ZnVuY3Rpb24gYSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/SS5saWZ0KHQsLS4xKTp0fWZ1bmN0aW9uIG8odCl7aWYodC5fX2hvdmVyU3RsRGlydHkpe3ZhciBlPXQuc3R5bGUuc3Ryb2tlLGk9dC5zdHlsZS5maWxsLG89dC5fX2hvdmVyU3RsO28uZmlsbD1vLmZpbGx8fChuKGkpP2EoaSk6bnVsbCksby5zdHJva2U9by5zdHJva2V8fChuKGUpP2EoZSk6bnVsbCk7dmFyIHI9e307Zm9yKHZhciBzIGluIG8pbnVsbCE9b1tzXSYmKHJbc109dC5zdHlsZVtzXSk7dC5fX25vcm1hbFN0bD1yLHQuX19ob3ZlclN0bERpcnR5PSExfX1mdW5jdGlvbiByKHQpe2lmKCF0Ll9faXNIb3Zlcil7aWYobyh0KSx0LnVzZUhvdmVyTGF5ZXIpdC5fX3pyJiZ0Ll9fenIuYWRkSG92ZXIodCx0Ll9faG92ZXJTdGwpO2Vsc2V7dmFyIGU9dC5zdHlsZSxpPWUuaW5zaWRlUm9sbGJhY2tPcHQ7aSYmXyhlKSxlLmV4dGVuZEZyb20odC5fX2hvdmVyU3RsKSxpJiYoeChlLGUuaW5zaWRlT3JpZ2luYWxUZXh0UG9zaXRpb24saSksbnVsbD09ZS50ZXh0RmlsbCYmKGUudGV4dEZpbGw9aS5hdXRvQ29sb3IpKSx0LmRpcnR5KCExKSx0LnoyKz0xfXQuX19pc0hvdmVyPSEwfX1mdW5jdGlvbiBzKHQpe2lmKHQuX19pc0hvdmVyKXt2YXIgZT10Ll9fbm9ybWFsU3RsO3QudXNlSG92ZXJMYXllcj90Ll9fenImJnQuX196ci5yZW1vdmVIb3Zlcih0KTooZSYmdC5zZXRTdHlsZShlKSx0LnoyLT0xKSx0Ll9faXNIb3Zlcj0hMX19ZnVuY3Rpb24gbCh0KXsiZ3JvdXAiPT09dC50eXBlP3QudHJhdmVyc2UoZnVuY3Rpb24odCl7Imdyb3VwIiE9PXQudHlwZSYmcih0KX0pOnIodCl9ZnVuY3Rpb24gdSh0KXsiZ3JvdXAiPT09dC50eXBlP3QudHJhdmVyc2UoZnVuY3Rpb24odCl7Imdyb3VwIiE9PXQudHlwZSYmcyh0KX0pOnModCl9ZnVuY3Rpb24gaCh0LGUpe3QuX19ob3ZlclN0bD10LmhvdmVyU3R5bGV8fGV8fHt9LHQuX19ob3ZlclN0bERpcnR5PSEwLHQuX19pc0hvdmVyJiZvKHQpfWZ1bmN0aW9uIGModCl7dGhpcy5fX2hvdmVyU2lsZW50T25Ub3VjaCYmdC56ckJ5VG91Y2h8fCF0aGlzLl9faXNFbXBoYXNpcyYmbCh0aGlzKX1mdW5jdGlvbiBkKHQpe3RoaXMuX19ob3ZlclNpbGVudE9uVG91Y2gmJnQuenJCeVRvdWNofHwhdGhpcy5fX2lzRW1waGFzaXMmJnUodGhpcyl9ZnVuY3Rpb24gZigpe3RoaXMuX19pc0VtcGhhc2lzPSEwLGwodGhpcyl9ZnVuY3Rpb24gcCgpe3RoaXMuX19pc0VtcGhhc2lzPSExLHUodGhpcyl9ZnVuY3Rpb24gZyh0LGUsaSxuKXtpZihpPWl8fE8saS5pc1JlY3RUZXh0KXt2YXIgYT1lLmdldFNoYWxsb3coInBvc2l0aW9uIil8fChuP251bGw6Imluc2lkZSIpOyJvdXRzaWRlIj09PWEmJihhPSJ0b3AiKSx0LnRleHRQb3NpdGlvbj1hLHQudGV4dE9mZnNldD1lLmdldFNoYWxsb3coIm9mZnNldCIpO3ZhciBvPWUuZ2V0U2hhbGxvdygicm90YXRlIik7bnVsbCE9byYmKG8qPU1hdGguUEkvMTgwKSx0LnRleHRSb3RhdGlvbj1vLHQudGV4dERpc3RhbmNlPXcucmV0cmlldmUyKGUuZ2V0U2hhbGxvdygiZGlzdGFuY2UiKSxuP251bGw6NSl9dmFyIHIscz1lLmVjTW9kZWwsbD1zJiZzLm9wdGlvbi50ZXh0U3R5bGUsdT1tKGUpO2lmKHUpe3I9e307Zm9yKHZhciBoIGluIHUpaWYodS5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIGM9ZS5nZXRNb2RlbChbInJpY2giLGhdKTt2KHJbaF09e30sYyxsLGksbil9fXJldHVybiB0LnJpY2g9cix2KHQsZSxsLGksbiwhMCksaS5mb3JjZVJpY2gmJiFpLnRleHRTdHlsZSYmKGkudGV4dFN0eWxlPXt9KSx0fWZ1bmN0aW9uIG0odCl7Zm9yKHZhciBlO3QmJnQhPT10LmVjTW9kZWw7KXt2YXIgaT0odC5vcHRpb258fE8pLnJpY2g7aWYoaSl7ZT1lfHx7fTtmb3IodmFyIG4gaW4gaSlpLmhhc093blByb3BlcnR5KG4pJiYoZVtuXT0xKX10PXQucGFyZW50TW9kZWx9cmV0dXJuIGV9ZnVuY3Rpb24gdih0LGUsaSxuLGEsbyl7aWYoaT0hYSYmaXx8Tyx0LnRleHRGaWxsPXkoZS5nZXRTaGFsbG93KCJjb2xvciIpLG4pfHxpLmNvbG9yLHQudGV4dFN0cm9rZT15KGUuZ2V0U2hhbGxvdygidGV4dEJvcmRlckNvbG9yIiksbil8fGkudGV4dEJvcmRlckNvbG9yLHQudGV4dFN0cm9rZVdpZHRoPXcucmV0cmlldmUyKGUuZ2V0U2hhbGxvdygidGV4dEJvcmRlcldpZHRoIiksaS50ZXh0Qm9yZGVyV2lkdGgpLCFhKXtpZihvKXt2YXIgcj10LnRleHRQb3NpdGlvbjt0Lmluc2lkZVJvbGxiYWNrPXgodCxyLG4pLHQuaW5zaWRlT3JpZ2luYWxUZXh0UG9zaXRpb249cix0Lmluc2lkZVJvbGxiYWNrT3B0PW59bnVsbD09dC50ZXh0RmlsbCYmKHQudGV4dEZpbGw9bi5hdXRvQ29sb3IpfXQuZm9udFN0eWxlPWUuZ2V0U2hhbGxvdygiZm9udFN0eWxlIil8fGkuZm9udFN0eWxlLHQuZm9udFdlaWdodD1lLmdldFNoYWxsb3coImZvbnRXZWlnaHQiKXx8aS5mb250V2VpZ2h0LHQuZm9udFNpemU9ZS5nZXRTaGFsbG93KCJmb250U2l6ZSIpfHxpLmZvbnRTaXplLHQuZm9udEZhbWlseT1lLmdldFNoYWxsb3coImZvbnRGYW1pbHkiKXx8aS5mb250RmFtaWx5LHQudGV4dEFsaWduPWUuZ2V0U2hhbGxvdygiYWxpZ24iKSx0LnRleHRWZXJ0aWNhbEFsaWduPWUuZ2V0U2hhbGxvdygidmVydGljYWxBbGlnbiIpfHxlLmdldFNoYWxsb3coImJhc2VsaW5lIiksdC50ZXh0TGluZUhlaWdodD1lLmdldFNoYWxsb3coImxpbmVIZWlnaHQiKSx0LnRleHRXaWR0aD1lLmdldFNoYWxsb3coIndpZHRoIiksdC50ZXh0SGVpZ2h0PWUuZ2V0U2hhbGxvdygiaGVpZ2h0IiksdC50ZXh0VGFnPWUuZ2V0U2hhbGxvdygidGFnIiksbyYmbi5kaXNhYmxlQm94fHwodC50ZXh0QmFja2dyb3VuZENvbG9yPXkoZS5nZXRTaGFsbG93KCJiYWNrZ3JvdW5kQ29sb3IiKSxuKSx0LnRleHRQYWRkaW5nPWUuZ2V0U2hhbGxvdygicGFkZGluZyIpLHQudGV4dEJvcmRlckNvbG9yPXkoZS5nZXRTaGFsbG93KCJib3JkZXJDb2xvciIpLG4pLHQudGV4dEJvcmRlcldpZHRoPWUuZ2V0U2hhbGxvdygiYm9yZGVyV2lkdGgiKSx0LnRleHRCb3JkZXJSYWRpdXM9ZS5nZXRTaGFsbG93KCJib3JkZXJSYWRpdXMiKSx0LnRleHRCb3hTaGFkb3dDb2xvcj1lLmdldFNoYWxsb3coInNoYWRvd0NvbG9yIiksdC50ZXh0Qm94U2hhZG93Qmx1cj1lLmdldFNoYWxsb3coInNoYWRvd0JsdXIiKSx0LnRleHRCb3hTaGFkb3dPZmZzZXRYPWUuZ2V0U2hhbGxvdygic2hhZG93T2Zmc2V0WCIpLHQudGV4dEJveFNoYWRvd09mZnNldFk9ZS5nZXRTaGFsbG93KCJzaGFkb3dPZmZzZXRZIikpLHQudGV4dFNoYWRvd0NvbG9yPWUuZ2V0U2hhbGxvdygidGV4dFNoYWRvd0NvbG9yIil8fGkudGV4dFNoYWRvd0NvbG9yLHQudGV4dFNoYWRvd0JsdXI9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93Qmx1ciIpfHxpLnRleHRTaGFkb3dCbHVyLHQudGV4dFNoYWRvd09mZnNldFg9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93T2Zmc2V0WCIpfHxpLnRleHRTaGFkb3dPZmZzZXRYLHQudGV4dFNoYWRvd09mZnNldFk9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93T2Zmc2V0WSIpfHxpLnRleHRTaGFkb3dPZmZzZXRZfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4iYXV0byIhPT10P3Q6ZSYmZS5hdXRvQ29sb3I/ZS5hdXRvQ29sb3I6bnVsbH1mdW5jdGlvbiB4KHQsZSxpKXt2YXIgbixhPWkudXNlSW5zaWRlU3R5bGU7cmV0dXJuIG51bGw9PXQudGV4dEZpbGwmJmEhPT0hMSYmKGE9PT0hMHx8aS5pc1JlY3RUZXh0JiZlJiYic3RyaW5nIj09dHlwZW9mIGUmJmUuaW5kZXhPZigiaW5zaWRlIik+PTApJiYobj17dGV4dEZpbGw6bnVsbCx0ZXh0U3Ryb2tlOnQudGV4dFN0cm9rZSx0ZXh0U3Ryb2tlV2lkdGg6dC50ZXh0U3Ryb2tlV2lkdGh9LHQudGV4dEZpbGw9IiNmZmYiLG51bGw9PXQudGV4dFN0cm9rZSYmKHQudGV4dFN0cm9rZT1pLmF1dG9Db2xvcixudWxsPT10LnRleHRTdHJva2VXaWR0aCYmKHQudGV4dFN0cm9rZVdpZHRoPTIpKSksbn1mdW5jdGlvbiBfKHQpe3ZhciBlPXQuaW5zaWRlUm9sbGJhY2s7ZSYmKHQudGV4dEZpbGw9ZS50ZXh0RmlsbCx0LnRleHRTdHJva2U9ZS50ZXh0U3Ryb2tlLHQudGV4dFN0cm9rZVdpZHRoPWUudGV4dFN0cm9rZVdpZHRoKX1mdW5jdGlvbiBiKHQsZSxpLG4sYSxvKXsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKG89YSxhPW51bGwpO3ZhciByPW4mJm4uaXNBbmltYXRpb25FbmFibGVkKCk7aWYocil7dmFyIHM9dD8iVXBkYXRlIjoiIixsPW4uZ2V0U2hhbGxvdygiYW5pbWF0aW9uRHVyYXRpb24iK3MpLHU9bi5nZXRTaGFsbG93KCJhbmltYXRpb25FYXNpbmciK3MpLGg9bi5nZXRTaGFsbG93KCJhbmltYXRpb25EZWxheSIrcyk7ImZ1bmN0aW9uIj09dHlwZW9mIGgmJihoPWgoYSxuLmdldEFuaW1hdGlvbkRlbGF5UGFyYW1zP24uZ2V0QW5pbWF0aW9uRGVsYXlQYXJhbXMoZSxhKTpudWxsKSksImZ1bmN0aW9uIj09dHlwZW9mIGwmJihsPWwoYSkpLGw+MD9lLmFuaW1hdGVUbyhpLGwsaHx8MCx1LG8sISFvKTooZS5zdG9wQW5pbWF0aW9uKCksZS5hdHRyKGkpLG8mJm8oKSl9ZWxzZSBlLnN0b3BBbmltYXRpb24oKSxlLmF0dHIoaSksbyYmbygpfXZhciB3PWkoMSksUz1pKDE4NiksTT1pKDgpLEk9aSgyMiksVD1pKDE5KSxBPWkoNiksQz1pKDYxKSxMPWkoMTIpLEQ9TWF0aC5yb3VuZCxQPU1hdGgubWF4LGs9TWF0aC5taW4sTz17fSx6PXt9O3ouR3JvdXA9aSgzNiksei5JbWFnZT1pKDU1KSx6LlRleHQ9aSg5MSksei5DaXJjbGU9aSgxNzcpLHouU2VjdG9yPWkoMTgzKSx6LlJpbmc9aSgxODIpLHouUG9seWdvbj1pKDE3OSksei5Qb2x5bGluZT1pKDE4MCksei5SZWN0PWkoMTgxKSx6LkxpbmU9aSgxNzgpLHouQmV6aWVyQ3VydmU9aSgxNzYpLHouQXJjPWkoMTc1KSx6LkNvbXBvdW5kUGF0aD1pKDE3MSksei5MaW5lYXJHcmFkaWVudD1pKDEwNSksei5SYWRpYWxHcmFkaWVudD1pKDE3Miksei5Cb3VuZGluZ1JlY3Q9TCx6LmV4dGVuZFNoYXBlPWZ1bmN0aW9uKHQpe3JldHVybiBNLmV4dGVuZCh0KX0sei5leHRlbmRQYXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuZXh0ZW5kRnJvbVN0cmluZyh0LGUpfSx6Lm1ha2VQYXRoPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPVMuY3JlYXRlRnJvbVN0cmluZyh0LGUpLG89YS5nZXRCb3VuZGluZ1JlY3QoKTtpZihpKXt2YXIgcj1vLndpZHRoL28uaGVpZ2h0O2lmKCJjZW50ZXIiPT09bil7dmFyIHMsbD1pLmhlaWdodCpyO2w8PWkud2lkdGg/cz1pLmhlaWdodDoobD1pLndpZHRoLHM9bC9yKTt2YXIgdT1pLngraS53aWR0aC8yLGg9aS55K2kuaGVpZ2h0LzI7aS54PXUtbC8yLGkueT1oLXMvMixpLndpZHRoPWwsaS5oZWlnaHQ9c316LnJlc2l6ZVBhdGgoYSxpKX1yZXR1cm4gYX0sei5tZXJnZVBhdGg9Uy5tZXJnZVBhdGgsei5yZXNpemVQYXRoPWZ1bmN0aW9uKHQsZSl7aWYodC5hcHBseVRyYW5zZm9ybSl7dmFyIGk9dC5nZXRCb3VuZGluZ1JlY3QoKSxuPWkuY2FsY3VsYXRlVHJhbnNmb3JtKGUpO3QuYXBwbHlUcmFuc2Zvcm0obil9fSx6LnN1YlBpeGVsT3B0aW1pemVMaW5lPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2hhcGUsaT10LnN0eWxlLmxpbmVXaWR0aDtyZXR1cm4gRCgyKmUueDEpPT09RCgyKmUueDIpJiYoZS54MT1lLngyPVIoZS54MSxpLCEwKSksRCgyKmUueTEpPT09RCgyKmUueTIpJiYoZS55MT1lLnkyPVIoZS55MSxpLCEwKSksdH0sei5zdWJQaXhlbE9wdGltaXplUmVjdD1mdW5jdGlvbih0KXt2YXIgZT10LnNoYXBlLGk9dC5zdHlsZS5saW5lV2lkdGgsbj1lLngsYT1lLnksbz1lLndpZHRoLHI9ZS5oZWlnaHQ7cmV0dXJuIGUueD1SKGUueCxpLCEwKSxlLnk9UihlLnksaSwhMCksZS53aWR0aD1NYXRoLm1heChSKG4rbyxpLCExKS1lLngsMD09PW8/MDoxKSxlLmhlaWdodD1NYXRoLm1heChSKGErcixpLCExKS1lLnksMD09PXI/MDoxKSx0fTt2YXIgUj16LnN1YlBpeGVsT3B0aW1pemU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPUQoMip0KTtyZXR1cm4obitEKGUpKSUyPT09MD9uLzI6KG4rKGk/MTotMSkpLzJ9O3ouc2V0SG92ZXJTdHlsZT1mdW5jdGlvbih0LGUsaSl7dC5fX2hvdmVyU2lsZW50T25Ub3VjaD1pJiZpLmhvdmVyU2lsZW50T25Ub3VjaCwiZ3JvdXAiPT09dC50eXBlP3QudHJhdmVyc2UoZnVuY3Rpb24odCl7Imdyb3VwIiE9PXQudHlwZSYmaCh0LGUpfSk6aCh0LGUpLHQub24oIm1vdXNlb3ZlciIsYykub24oIm1vdXNlb3V0IixkKSx0Lm9uKCJlbXBoYXNpcyIsZikub24oIm5vcm1hbCIscCl9LHouc2V0TGFiZWxTdHlsZT1mdW5jdGlvbih0LGUsaSxuLGEsbyxyKXthPWF8fE87dmFyIHM9YS5sYWJlbEZldGNoZXIsbD1hLmxhYmVsRGF0YUluZGV4LHU9YS5sYWJlbERpbUluZGV4LGg9aS5nZXRTaGFsbG93KCJzaG93IiksYz1uLmdldFNoYWxsb3coInNob3ciKSxkPWh8fGM/dy5yZXRyaWV2ZTIocz9zLmdldEZvcm1hdHRlZExhYmVsKGwsIm5vcm1hbCIsbnVsbCx1KTpudWxsLGEuZGVmYXVsdFRleHQpOm51bGwsZj1oP2Q6bnVsbCxwPWM/dy5yZXRyaWV2ZTIocz9zLmdldEZvcm1hdHRlZExhYmVsKGwsImVtcGhhc2lzIixudWxsLHUpOm51bGwsZCk6bnVsbDtudWxsPT1mJiZudWxsPT1wfHwoRSh0LGksbyxhKSxFKGUsbixyLGEsITApKSx0LnRleHQ9ZixlLnRleHQ9cH07dmFyIEU9ei5zZXRUZXh0U3R5bGU9ZnVuY3Rpb24odCxlLGksbixhKXtyZXR1cm4gZyh0LGUsbixhKSxpJiZ3LmV4dGVuZCh0LGkpLHQuaG9zdCYmdC5ob3N0LmRpcnR5JiZ0Lmhvc3QuZGlydHkoITEpLHR9O3ouc2V0VGV4dD1mdW5jdGlvbih0LGUsaSl7dmFyIG4sYT17aXNSZWN0VGV4dDohMH07aT09PSExP249ITA6YS5hdXRvQ29sb3I9aSxnKHQsZSxhLG4pLHQuaG9zdCYmdC5ob3N0LmRpcnR5JiZ0Lmhvc3QuZGlydHkoITEpfSx6LmdldEZvbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1lfHxlLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKTtyZXR1cm5bdC5mb250U3R5bGV8fGkmJmkuZ2V0U2hhbGxvdygiZm9udFN0eWxlIil8fCIiLHQuZm9udFdlaWdodHx8aSYmaS5nZXRTaGFsbG93KCJmb250V2VpZ2h0Iil8fCIiLCh0LmZvbnRTaXplfHxpJiZpLmdldFNoYWxsb3coImZvbnRTaXplIil8fDEyKSsicHgiLHQuZm9udEZhbWlseXx8aSYmaS5nZXRTaGFsbG93KCJmb250RmFtaWx5Iil8fCJzYW5zLXNlcmlmIl0uam9pbigiICIpfSx6LnVwZGF0ZVByb3BzPWZ1bmN0aW9uKHQsZSxpLG4sYSl7YighMCx0LGUsaSxuLGEpfSx6LmluaXRQcm9wcz1mdW5jdGlvbih0LGUsaSxuLGEpe2IoITEsdCxlLGksbixhKX0sei5nZXRUcmFuc2Zvcm09ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9VC5pZGVudGl0eShbXSk7dCYmdCE9PWU7KVQubXVsKGksdC5nZXRMb2NhbFRyYW5zZm9ybSgpLGkpLHQ9dC5wYXJlbnQ7cmV0dXJuIGl9LHouYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlJiYhdy5pc0FycmF5TGlrZShlKSYmKGU9Qy5nZXRMb2NhbFRyYW5zZm9ybShlKSksaSYmKGU9VC5pbnZlcnQoW10sZSkpLEEuYXBwbHlUcmFuc2Zvcm0oW10sdCxlKX0sei50cmFuc2Zvcm1EaXJlY3Rpb249ZnVuY3Rpb24odCxlLGkpe3ZhciBuPTA9PT1lWzRdfHwwPT09ZVs1XXx8MD09PWVbMF0/MTpNYXRoLmFicygyKmVbNF0vZVswXSksYT0wPT09ZVs0XXx8MD09PWVbNV18fDA9PT1lWzJdPzE6TWF0aC5hYnMoMiplWzRdL2VbMl0pLG89WyJsZWZ0Ij09PXQ/LW46InJpZ2h0Ij09PXQ/bjowLCJ0b3AiPT09dD8tYToiYm90dG9tIj09PXQ/YTowXTtyZXR1cm4gbz16LmFwcGx5VHJhbnNmb3JtKG8sZSxpKSxNYXRoLmFicyhvWzBdKT5NYXRoLmFicyhvWzFdKT9vWzBdPjA/InJpZ2h0IjoibGVmdCI6b1sxXT4wPyJib3R0b20iOiJ0b3AifSx6Lmdyb3VwVHJhbnNpdGlvbj1mdW5jdGlvbih0LGUsaSxuKXtmdW5jdGlvbiBhKHQpe3ZhciBlPXt9O3JldHVybiB0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyF0LmlzR3JvdXAmJnQuYW5pZCYmKGVbdC5hbmlkXT10KX0pLGV9ZnVuY3Rpb24gbyh0KXt2YXIgZT17cG9zaXRpb246QS5jbG9uZSh0LnBvc2l0aW9uKSxyb3RhdGlvbjp0LnJvdGF0aW9ufTtyZXR1cm4gdC5zaGFwZSYmKGUuc2hhcGU9dy5leHRlbmQoe30sdC5zaGFwZSkpLGV9aWYodCYmZSl7dmFyIHI9YSh0KTtlLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2lmKCF0LmlzR3JvdXAmJnQuYW5pZCl7dmFyIGU9clt0LmFuaWRdO2lmKGUpe3ZhciBuPW8odCk7dC5hdHRyKG8oZSkpLHoudXBkYXRlUHJvcHModCxuLGksdC5kYXRhSW5kZXgpfX19KX19LHouY2xpcFBvaW50c0J5UmVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB3Lm1hcCh0LGZ1bmN0aW9uKHQpe3ZhciBpPXRbMF07aT1QKGksZS54KSxpPWsoaSxlLngrZS53aWR0aCk7dmFyIG49dFsxXTtyZXR1cm4gbj1QKG4sZS55KSxuPWsobixlLnkrZS5oZWlnaHQpLFtpLG5dfSl9LHouY2xpcFJlY3RCeVJlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT1QKHQueCxlLngpLG49ayh0LngrdC53aWR0aCxlLngrZS53aWR0aCksYT1QKHQueSxlLnkpLG89ayh0LnkrdC5oZWlnaHQsZS55K2UuaGVpZ2h0KTtpZihuPj1pJiZvPj1hKXJldHVybnt4OmkseTphLHdpZHRoOm4taSxoZWlnaHQ6by1hfX0sei5jcmVhdGVJY29uPWZ1bmN0aW9uKHQsZSxpKXtlPXcuZXh0ZW5kKHtyZWN0SG92ZXI6ITB9LGUpO3ZhciBuPWUuc3R5bGU9e3N0cm9rZU5vU2NhbGU6ITB9O2lmKGk9aXx8e3g6LTEseTotMSx3aWR0aDoyLGhlaWdodDoyfSx0KXJldHVybiAwPT09dC5pbmRleE9mKCJpbWFnZTovLyIpPyhuLmltYWdlPXQuc2xpY2UoOCksdy5kZWZhdWx0cyhuLGkpLG5ldyB6LkltYWdlKGUpKTp6Lm1ha2VQYXRoKHQucmVwbGFjZSgicGF0aDovLyIsIiIpLGUsaSwiY2VudGVyIil9LHQuZXhwb3J0cz16fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjEwKX12YXIgbz1pKDEpLHI9e30scz0xZS00O3IubGluZWFyTWFwPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPWVbMV0tZVswXSxvPWlbMV0taVswXTtpZigwPT09YSlyZXR1cm4gMD09PW8/aVswXTooaVswXStpWzFdKS8yO2lmKG4paWYoYT4wKXtpZih0PD1lWzBdKXJldHVybiBpWzBdO2lmKHQ+PWVbMV0pcmV0dXJuIGlbMV19ZWxzZXtpZih0Pj1lWzBdKXJldHVybiBpWzBdO2lmKHQ8PWVbMV0pcmV0dXJuIGlbMV19ZWxzZXtpZih0PT09ZVswXSlyZXR1cm4gaVswXTtpZih0PT09ZVsxXSlyZXR1cm4gaVsxXX1yZXR1cm4odC1lWzBdKS9hKm8raVswXX0sci5wYXJzZVBlcmNlbnQ9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSJjZW50ZXIiOmNhc2UibWlkZGxlIjp0PSI1MCUiO2JyZWFrO2Nhc2UibGVmdCI6Y2FzZSJ0b3AiOnQ9IjAlIjticmVhaztjYXNlInJpZ2h0IjpjYXNlImJvdHRvbSI6dD0iMTAwJSJ9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P24odCkubWF0Y2goLyUkLyk/cGFyc2VGbG9hdCh0KS8xMDAqZTpwYXJzZUZsb2F0KHQpOm51bGw9PXQ/TmFOOit0fSxyLnJvdW5kPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbnVsbD09ZSYmKGU9MTApLGU9TWF0aC5taW4oTWF0aC5tYXgoMCxlKSwyMCksdD0oK3QpLnRvRml4ZWQoZSksaT90Oit0fSxyLmFzYz1mdW5jdGlvbih0KXtyZXR1cm4gdC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pLHR9LHIuZ2V0UHJlY2lzaW9uPWZ1bmN0aW9uKHQpe2lmKHQ9K3QsaXNOYU4odCkpcmV0dXJuIDA7Zm9yKHZhciBlPTEsaT0wO01hdGgucm91bmQodCplKS9lIT09dDspZSo9MTAsaSsrO3JldHVybiBpfSxyLmdldFByZWNpc2lvblNhZmU9ZnVuY3Rpb24odCl7dmFyIGU9dC50b1N0cmluZygpLGk9ZS5pbmRleE9mKCJlIik7aWYoaT4wKXt2YXIgbj0rZS5zbGljZShpKzEpO3JldHVybiBuPDA/LW46MH12YXIgYT1lLmluZGV4T2YoIi4iKTtyZXR1cm4gYTwwPzA6ZS5sZW5ndGgtMS1hfSxyLmdldFBpeGVsUHJlY2lzaW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9TWF0aC5sb2csbj1NYXRoLkxOMTAsYT1NYXRoLmZsb29yKGkodFsxXS10WzBdKS9uKSxvPU1hdGgucm91bmQoaShNYXRoLmFicyhlWzFdLWVbMF0pKS9uKSxyPU1hdGgubWluKE1hdGgubWF4KC1hK28sMCksMjApO3JldHVybiBpc0Zpbml0ZShyKT9yOjIwfSxyLmdldFBlcmNlbnRXaXRoUHJlY2lzaW9uPWZ1bmN0aW9uKHQsZSxpKXtpZighdFtlXSlyZXR1cm4gMDt2YXIgbj1vLnJlZHVjZSh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrKGlzTmFOKGUpPzA6ZSl9LDApO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgYT1NYXRoLnBvdygxMCxpKSxyPW8ubWFwKHQsZnVuY3Rpb24odCl7cmV0dXJuKGlzTmFOKHQpPzA6dCkvbiphKjEwMH0pLHM9MTAwKmEsbD1vLm1hcChyLGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQpfSksdT1vLnJlZHVjZShsLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCksaD1vLm1hcChyLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtbFtlXX0pO3U8czspe2Zvcih2YXIgYz1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksZD1udWxsLGY9MCxwPWgubGVuZ3RoO2Y8cDsrK2YpaFtmXT5jJiYoYz1oW2ZdLGQ9Zik7KytsW2RdLGhbZF09MCwrK3V9cmV0dXJuIGxbZV0vYX0sci5NQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsci5yZW1SYWRpYW49ZnVuY3Rpb24odCl7dmFyIGU9MipNYXRoLlBJO3JldHVybih0JWUrZSklZX0sci5pc1JhZGlhbkFyb3VuZFplcm89ZnVuY3Rpb24odCl7cmV0dXJuIHQ+LXMmJnQ8c307dmFyIGw9L14oPzooXGR7NH0pKD86Wy1cL10oXGR7MSwyfSkoPzpbLVwvXShcZHsxLDJ9KSg/OltUIF0oXGR7MSwyfSkoPzo6KFxkXGQpKD86OihcZFxkKSg/OlsuLF0oXGQrKSk/KT8pPyhafFtcK1wtXVxkXGQ6P1xkXGQpPyk/KT8pPyk/JC87ci5wYXJzZURhdGU9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQ7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1sLmV4ZWModCk7aWYoIWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoZVs4XSl7dmFyIGk9K2VbNF18fDA7cmV0dXJuIloiIT09ZVs4XS50b1VwcGVyQ2FzZSgpJiYoaS09ZVs4XS5zbGljZSgwLDMpKSxuZXcgRGF0ZShEYXRlLlVUQygrZVsxXSwrKGVbMl18fDEpLTEsK2VbM118fDEsaSwrKGVbNV18fDApLCtlWzZdfHwwLCtlWzddfHwwKSl9cmV0dXJuIG5ldyBEYXRlKCtlWzFdLCsoZVsyXXx8MSktMSwrZVszXXx8MSwrZVs0XXx8MCwrKGVbNV18fDApLCtlWzZdfHwwLCtlWzddfHwwKX1yZXR1cm4gbnVsbD09dD9uZXcgRGF0ZShOYU4pOm5ldyBEYXRlKE1hdGgucm91bmQodCkpfSxyLnF1YW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygxMCxhKHQpKX0sci5uaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIGksbj1hKHQpLG89TWF0aC5wb3coMTAsbikscj10L287cmV0dXJuIGk9ZT9yPDEuNT8xOnI8Mi41PzI6cjw0PzM6cjw3PzU6MTA6cjwxPzE6cjwyPzI6cjwzPzM6cjw1PzU6MTAsdD1pKm8sbj49LTIwPyt0LnRvRml4ZWQobjwwPy1uOjApOnR9LHIucmVmb3JtSW50ZXJ2YWxzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG4pe3JldHVybiB0LmludGVydmFsW25dPGkuaW50ZXJ2YWxbbl18fHQuaW50ZXJ2YWxbbl09PT1pLmludGVydmFsW25dJiYodC5jbG9zZVtuXS1pLmNsb3NlW25dPT09KG4/LTE6MSl8fCFuJiZlKHQsaSwxKSl9dC5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUodCxpLDApPy0xOjF9KTtmb3IodmFyIGk9LSgxLzApLG49MSxhPTA7YTx0Lmxlbmd0aDspe2Zvcih2YXIgbz10W2FdLmludGVydmFsLHI9dFthXS5jbG9zZSxzPTA7czwyO3MrKylvW3NdPD1pJiYob1tzXT1pLHJbc109cz8xOjEtbiksaT1vW3NdLG49cltzXTtvWzBdPT09b1sxXSYmclswXSpyWzFdIT09MT90LnNwbGljZShhLDEpOmErK31yZXR1cm4gdH0sci5pc051bWVyaWM9ZnVuY3Rpb24odCl7cmV0dXJuIHQtcGFyc2VGbG9hdCh0KT49MH0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHQmJnQuaGFzT3duUHJvcGVydHkoZSl9dmFyIGE9aSg3KSxvPWkoNCkscj1pKDExKSxzPWkoMSksbD1zLmVhY2gsdT1zLmlzT2JqZWN0LGg9e307aC5ub3JtYWxpemVUb0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXk/dDpudWxsPT10P1tdOlt0XX0saC5kZWZhdWx0RW1waGFzaXM9ZnVuY3Rpb24odCxlKXtpZih0KWZvcih2YXIgaT10LmVtcGhhc2lzPXQuZW1waGFzaXN8fHt9LG49dC5ub3JtYWw9dC5ub3JtYWx8fHt9LGE9MCxvPWUubGVuZ3RoO2E8bzthKyspe3ZhciByPWVbYV07IWkuaGFzT3duUHJvcGVydHkocikmJm4uaGFzT3duUHJvcGVydHkocikmJihpW3JdPW5bcl0pfX0saC5URVhUX1NUWUxFX09QVElPTlM9WyJmb250U3R5bGUiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJmb250RmFtaWx5IiwicmljaCIsInRhZyIsImNvbG9yIiwidGV4dEJvcmRlckNvbG9yIiwidGV4dEJvcmRlcldpZHRoIiwid2lkdGgiLCJoZWlnaHQiLCJsaW5lSGVpZ2h0IiwiYWxpZ24iLCJ2ZXJ0aWNhbEFsaWduIiwiYmFzZWxpbmUiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dPZmZzZXRYIiwic2hhZG93T2Zmc2V0WSIsInRleHRTaGFkb3dDb2xvciIsInRleHRTaGFkb3dCbHVyIiwidGV4dFNoYWRvd09mZnNldFgiLCJ0ZXh0U2hhZG93T2Zmc2V0WSIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyV2lkdGgiLCJib3JkZXJSYWRpdXMiLCJwYWRkaW5nIl0saC5nZXREYXRhSXRlbVZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYobnVsbD09dC52YWx1ZT90OnQudmFsdWUpfSxoLmlzRGF0YUl0ZW1PcHRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHUodCkmJiEodCBpbnN0YW5jZW9mIEFycmF5KX0saC5jb252ZXJEYXRhVmFsdWU9ZnVuY3Rpb24odCxlKXt2YXIgaT1lJiZlLnR5cGU7cmV0dXJuIm9yZGluYWwiPT09aT90OigidGltZSI9PT1pJiYibnVtYmVyIiE9dHlwZW9mIHQmJm51bGwhPXQmJiItIiE9PXQmJih0PStvLnBhcnNlRGF0ZSh0KSksbnVsbD09dHx8IiI9PT10P05hTjordCl9LGguY3JlYXRlRGF0YUZvcm1hdE1vZGVsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IHI7cmV0dXJuIHMubWl4aW4oaSxoLmRhdGFGb3JtYXRNaXhpbiksaS5zZXJpZXNJbmRleD1lLnNlcmllc0luZGV4LGkubmFtZT1lLm5hbWV8fCIiLGkubWFpblR5cGU9ZS5tYWluVHlwZSxpLnN1YlR5cGU9ZS5zdWJUeXBlLGkuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0fSxpfSxoLmRhdGFGb3JtYXRNaXhpbj17Z2V0RGF0YVBhcmFtczpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0RGF0YShlKSxuPXRoaXMuZ2V0UmF3VmFsdWUodCxlKSxvPWkuZ2V0UmF3SW5kZXgodCkscj1pLmdldE5hbWUodCwhMCkscz1pLmdldFJhd0RhdGFJdGVtKHQpLGw9aS5nZXRJdGVtVmlzdWFsKHQsImNvbG9yIik7cmV0dXJue2NvbXBvbmVudFR5cGU6dGhpcy5tYWluVHlwZSxjb21wb25lbnRTdWJUeXBlOnRoaXMuc3ViVHlwZSxzZXJpZXNUeXBlOiJzZXJpZXMiPT09dGhpcy5tYWluVHlwZT90aGlzLnN1YlR5cGU6bnVsbCxzZXJpZXNJbmRleDp0aGlzLnNlcmllc0luZGV4LHNlcmllc0lkOnRoaXMuaWQsc2VyaWVzTmFtZTp0aGlzLm5hbWUsbmFtZTpyLGRhdGFJbmRleDpvLGRhdGE6cyxkYXRhVHlwZTplLHZhbHVlOm4sY29sb3I6bCxtYXJrZXI6YS5nZXRUb29sdGlwTWFya2VyKGwpLCR2YXJzOlsic2VyaWVzTmFtZSIsIm5hbWUiLCJ2YWx1ZSJdfX0sZ2V0Rm9ybWF0dGVkTGFiZWw6ZnVuY3Rpb24odCxlLGksbixvKXtlPWV8fCJub3JtYWwiO3ZhciByPXRoaXMuZ2V0RGF0YShpKSxzPXIuZ2V0SXRlbU1vZGVsKHQpLGw9dGhpcy5nZXREYXRhUGFyYW1zKHQsaSk7bnVsbCE9biYmbC52YWx1ZSBpbnN0YW5jZW9mIEFycmF5JiYobC52YWx1ZT1sLnZhbHVlW25dKTt2YXIgdT1zLmdldChbb3x8ImxhYmVsIixlLCJmb3JtYXR0ZXIiXSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHU/KGwuc3RhdHVzPWUsdShsKSk6InN0cmluZyI9PXR5cGVvZiB1P2EuZm9ybWF0VHBsKHUsbCk6dm9pZCAwfSxnZXRSYXdWYWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0RGF0YShlKSxuPWkuZ2V0UmF3RGF0YUl0ZW0odCk7aWYobnVsbCE9bilyZXR1cm4hdShuKXx8biBpbnN0YW5jZW9mIEFycmF5P246bi52YWx1ZX0sZm9ybWF0VG9vbHRpcDpzLm5vb3B9LGgubWFwcGluZ1RvRXhpc3RzPWZ1bmN0aW9uKHQsZSl7ZT0oZXx8W10pLnNsaWNlKCk7dmFyIGk9cy5tYXAodHx8W10sZnVuY3Rpb24odCxlKXtyZXR1cm57ZXhpc3Q6dH19KTtyZXR1cm4gbChlLGZ1bmN0aW9uKHQsbil7aWYodSh0KSl7Zm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspaWYoIWlbYV0ub3B0aW9uJiZudWxsIT10LmlkJiZpW2FdLmV4aXN0LmlkPT09dC5pZCsiIilyZXR1cm4gaVthXS5vcHRpb249dCx2b2lkKGVbbl09bnVsbCk7Zm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspe3ZhciBvPWlbYV0uZXhpc3Q7aWYoIShpW2FdLm9wdGlvbnx8bnVsbCE9by5pZCYmbnVsbCE9dC5pZHx8bnVsbD09dC5uYW1lfHxoLmlzSWRJbm5lcih0KXx8aC5pc0lkSW5uZXIobyl8fG8ubmFtZSE9PXQubmFtZSsiIikpcmV0dXJuIGlbYV0ub3B0aW9uPXQsdm9pZChlW25dPW51bGwpfX19KSxsKGUsZnVuY3Rpb24odCxlKXtpZih1KHQpKXtmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIGE9aVtuXS5leGlzdDtpZighaVtuXS5vcHRpb24mJiFoLmlzSWRJbm5lcihhKSYmbnVsbD09dC5pZCl7aVtuXS5vcHRpb249dDticmVha319bj49aS5sZW5ndGgmJmkucHVzaCh7b3B0aW9uOnR9KX19KSxpfSxoLm1ha2VJZEFuZE5hbWU9ZnVuY3Rpb24odCl7dmFyIGU9cy5jcmVhdGVIYXNoTWFwKCk7bCh0LGZ1bmN0aW9uKHQsaSl7dmFyIG49dC5leGlzdDtuJiZlLnNldChuLmlkLHQpfSksbCh0LGZ1bmN0aW9uKHQsaSl7dmFyIG49dC5vcHRpb247cy5hc3NlcnQoIW58fG51bGw9PW4uaWR8fCFlLmdldChuLmlkKXx8ZS5nZXQobi5pZCk9PT10LCJpZCBkdXBsaWNhdGVzOiAiKyhuJiZuLmlkKSksbiYmbnVsbCE9bi5pZCYmZS5zZXQobi5pZCx0KSwhdC5rZXlJbmZvJiYodC5rZXlJbmZvPXt9KX0pLGwodCxmdW5jdGlvbih0LGkpe3ZhciBuPXQuZXhpc3QsYT10Lm9wdGlvbixvPXQua2V5SW5mbztpZih1KGEpKXtpZihvLm5hbWU9bnVsbCE9YS5uYW1lP2EubmFtZSsiIjpuP24ubmFtZToiXDAtIixuKW8uaWQ9bi5pZDtlbHNlIGlmKG51bGwhPWEuaWQpby5pZD1hLmlkKyIiO2Vsc2V7dmFyIHI9MDtkbyBvLmlkPSJcMCIrby5uYW1lKyJcMCIrcisrO3doaWxlKGUuZ2V0KG8uaWQpKX1lLnNldChvLmlkLHQpfX0pfSxoLmlzSWRJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gdSh0KSYmdC5pZCYmMD09PSh0LmlkKyIiKS5pbmRleE9mKCJcMF9lY19cMCIpfSxoLmNvbXByZXNzQmF0Y2hlcz1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlLGkpe2Zvcih2YXIgbj0wLGE9dC5sZW5ndGg7bjxhO24rKylmb3IodmFyIG89dFtuXS5zZXJpZXNJZCxyPWgubm9ybWFsaXplVG9BcnJheSh0W25dLmRhdGFJbmRleCkscz1pJiZpW29dLGw9MCx1PXIubGVuZ3RoO2w8dTtsKyspe3ZhciBjPXJbbF07cyYmc1tjXT9zW2NdPW51bGw6KGVbb118fChlW29dPXt9KSlbY109MX19ZnVuY3Rpb24gbih0LGUpe3ZhciBpPVtdO2Zvcih2YXIgYSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoYSkmJm51bGwhPXRbYV0paWYoZSlpLnB1c2goK2EpO2Vsc2V7dmFyIG89bih0W2FdLCEwKTtvLmxlbmd0aCYmaS5wdXNoKHtzZXJpZXNJZDphLGRhdGFJbmRleDpvfSl9cmV0dXJuIGl9dmFyIGE9e30sbz17fTtyZXR1cm4gaSh0fHxbXSxhKSxpKGV8fFtdLG8sYSksW24oYSksbihvKV19LGgucXVlcnlEYXRhSW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9ZS5kYXRhSW5kZXhJbnNpZGU/ZS5kYXRhSW5kZXhJbnNpZGU6bnVsbCE9ZS5kYXRhSW5kZXg/cy5pc0FycmF5KGUuZGF0YUluZGV4KT9zLm1hcChlLmRhdGFJbmRleCxmdW5jdGlvbihlKXtyZXR1cm4gdC5pbmRleE9mUmF3SW5kZXgoZSl9KTp0LmluZGV4T2ZSYXdJbmRleChlLmRhdGFJbmRleCk6bnVsbCE9ZS5uYW1lP3MuaXNBcnJheShlLm5hbWUpP3MubWFwKGUubmFtZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5pbmRleE9mTmFtZShlKX0pOnQuaW5kZXhPZk5hbWUoZS5uYW1lKTp2b2lkIDB9LGgubWFrZUdldHRlcj1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9IlwwX19lY19wcm9wX2dldHRlcl8iK3QrKztyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRbZV18fCh0W2VdPXt9KX19fSgpLGgucGFyc2VGaW5kZXI9ZnVuY3Rpb24odCxlLGkpe2lmKHMuaXNTdHJpbmcoZSkpe3ZhciBhPXt9O2FbZSsiSW5kZXgiXT0wLGU9YX12YXIgbz1pJiZpLmRlZmF1bHRNYWluVHlwZTshb3x8bihlLG8rIkluZGV4Iil8fG4oZSxvKyJJZCIpfHxuKGUsbysiTmFtZSIpfHwoZVtvKyJJbmRleCJdPTApO3ZhciByPXt9O3JldHVybiBsKGUsZnVuY3Rpb24obixhKXt2YXIgbj1lW2FdO2lmKCJkYXRhSW5kZXgiPT09YXx8ImRhdGFJbmRleEluc2lkZSI9PT1hKXJldHVybiB2b2lkKHJbYV09bik7dmFyIG89YS5tYXRjaCgvXihcdyspKEluZGV4fElkfE5hbWUpJC8pfHxbXSxsPW9bMV0sdT0ob1syXXx8IiIpLnRvTG93ZXJDYXNlKCk7aWYoISghbHx8IXV8fG51bGw9PW58fCJpbmRleCI9PT11JiYibm9uZSI9PT1ufHxpJiZpLmluY2x1ZGVNYWluVHlwZXMmJnMuaW5kZXhPZihpLmluY2x1ZGVNYWluVHlwZXMsbCk8MCkpe3ZhciBoPXttYWluVHlwZTpsfTsiaW5kZXgiPT09dSYmImFsbCI9PT1ufHwoaFt1XT1uKTt2YXIgYz10LnF1ZXJ5Q29tcG9uZW50cyhoKTtyW2wrIk1vZGVscyJdPWMscltsKyJNb2RlbCJdPWNbMF19fSkscn0saC5kYXRhRGltVG9Db29yZERpbT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZGltZW5zaW9ucztlPXQuZ2V0RGltZW5zaW9uKGUpO2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKXt2YXIgYT10LmdldERpbWVuc2lvbkluZm8oaVtuXSk7aWYoYS5uYW1lPT09ZSlyZXR1cm4gYS5jb29yZERpbX19LGguY29vcmREaW1Ub0RhdGFEaW09ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtyZXR1cm4gbCh0LmRpbWVuc2lvbnMsZnVuY3Rpb24obil7dmFyIGE9dC5nZXREaW1lbnNpb25JbmZvKG4pO2EuY29vcmREaW09PT1lJiYoaVthLmNvb3JkRGltSW5kZXhdPWEubmFtZSl9KSxpfSxoLm90aGVyRGltVG9EYXRhRGltPWZ1bmN0aW9uKHQsZSl7dmFyIGk9W107cmV0dXJuIGwodC5kaW1lbnNpb25zLGZ1bmN0aW9uKG4pe3ZhciBhPXQuZ2V0RGltZW5zaW9uSW5mbyhuKSxvPWEub3RoZXJEaW1zLHI9b1tlXTtudWxsIT1yJiZyIT09ITEmJihpW3JdPWEubmFtZSl9KSxpfSx0LmV4cG9ydHM9aH0sZnVuY3Rpb24odCxlKXt2YXIgaT0idW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0MzJBcnJheT9BcnJheTpGbG9hdDMyQXJyYXksbj17Y3JlYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IGkoMik7cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PWUmJihlPTApLG5bMF09dCxuWzFdPWUsbn0sY29weTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHR9LGNsb25lOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBpKDIpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGV9LHNldDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbMF09ZSx0WzFdPWksdH0sYWRkOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdK2lbMF0sdFsxXT1lWzFdK2lbMV0sdH0sc2NhbGVBbmRBZGQ6ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHRbMF09ZVswXStpWzBdKm4sdFsxXT1lWzFdK2lbMV0qbix0fSxzdWI6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0WzBdPWVbMF0taVswXSx0WzFdPWVbMV0taVsxXSx0fSxsZW46ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmxlblNxdWFyZSh0KSl9LGxlblNxdWFyZTpmdW5jdGlvbih0KXtyZXR1cm4gdFswXSp0WzBdK3RbMV0qdFsxXX0sbXVsOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdKmlbMF0sdFsxXT1lWzFdKmlbMV0sdH0sZGl2OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdL2lbMF0sdFsxXT1lWzFdL2lbMV0sdH0sZG90OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV19LHNjYWxlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFswXT1lWzBdKmksdFsxXT1lWzFdKmksdH0sbm9ybWFsaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5sZW4oZSk7cmV0dXJuIDA9PT1pPyh0WzBdPTAsdFsxXT0wKToodFswXT1lWzBdL2ksdFsxXT1lWzFdL2kpLHR9LGRpc3RhbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguc3FydCgodFswXS1lWzBdKSoodFswXS1lWzBdKSsodFsxXS1lWzFdKSoodFsxXS1lWzFdKSl9LGRpc3RhbmNlU3F1YXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKHRbMF0tZVswXSkqKHRbMF0tZVswXSkrKHRbMV0tZVsxXSkqKHRbMV0tZVsxXSl9LG5lZ2F0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdH0sbGVycDpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gdFswXT1lWzBdK24qKGlbMF0tZVswXSksdFsxXT1lWzFdK24qKGlbMV0tZVsxXSksdH0sYXBwbHlUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWVbMF0sYT1lWzFdO3JldHVybiB0WzBdPWlbMF0qbitpWzJdKmEraVs0XSx0WzFdPWlbMV0qbitpWzNdKmEraVs1XSx0fSxtaW46ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0WzBdPU1hdGgubWluKGVbMF0saVswXSksdFsxXT1NYXRoLm1pbihlWzFdLGlbMV0pLHR9LG1heDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbMF09TWF0aC5tYXgoZVswXSxpWzBdKSx0WzFdPU1hdGgubWF4KGVbMV0saVsxXSksdH19O24ubGVuZ3RoPW4ubGVuLG4ubGVuZ3RoU3F1YXJlPW4ubGVuU3F1YXJlLG4uZGlzdD1uLmRpc3RhbmNlLG4uZGlzdFNxdWFyZT1uLmRpc3RhbmNlU3F1YXJlLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPWkoNCksbz1pKDE2KSxyPXt9O3IuYWRkQ29tbWFzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0KT8iLSI6KHQ9KHQrIiIpLnNwbGl0KCIuIiksdFswXS5yZXBsYWNlKC8oXGR7MSwzfSkoPz0oPzpcZHszfSkrKD8hXGQpKS9nLCIkMSwiKSsodC5sZW5ndGg+MT8iLiIrdFsxXToiIikpfSxyLnRvQ2FtZWxDYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9KHR8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbih0LGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9KSxlJiZ0JiYodD10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSkpLHR9LHIubm9ybWFsaXplQ3NzQXJyYXk9bi5ub3JtYWxpemVDc3NBcnJheTt2YXIgcz1yLmVuY29kZUhUTUw9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7Iil9LGw9WyJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIl0sdT1mdW5jdGlvbih0LGUpe3JldHVybiJ7Iit0KyhudWxsPT1lPyIiOmUpKyJ9In07ci5mb3JtYXRUcGw9ZnVuY3Rpb24odCxlLGkpe24uaXNBcnJheShlKXx8KGU9W2VdKTt2YXIgYT1lLmxlbmd0aDtpZighYSlyZXR1cm4iIjtmb3IodmFyIG89ZVswXS4kdmFyc3x8W10scj0wO3I8by5sZW5ndGg7cisrKXt2YXIgaD1sW3JdLGM9dShoLDApO3Q9dC5yZXBsYWNlKHUoaCksaT9zKGMpOmMpfWZvcih2YXIgZD0wO2Q8YTtkKyspZm9yKHZhciBmPTA7ZjxvLmxlbmd0aDtmKyspe3ZhciBjPWVbZF1bb1tmXV07dD10LnJlcGxhY2UodShsW2ZdLGQpLGk/cyhjKTpjKX1yZXR1cm4gdH0sci5mb3JtYXRUcGxTaW1wbGU9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuLmVhY2goZSxmdW5jdGlvbihlLG4pe3Q9dC5yZXBsYWNlKCJ7IituKyJ9IixpP3MoZSk6ZSl9KSx0fSxyLmdldFRvb2x0aXBNYXJrZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD8nPHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo1cHg7Ym9yZGVyLXJhZGl1czoxMHB4O3dpZHRoOjlweDtoZWlnaHQ6OXB4O2JhY2tncm91bmQtY29sb3I6JytyLmVuY29kZUhUTUwodCkrIjsiKyhlfHwiIikrJyI+PC9zcGFuPic6IiJ9O3ZhciBoPWZ1bmN0aW9uKHQpe3JldHVybiB0PDEwPyIwIit0OnR9O3IuZm9ybWF0VGltZT1mdW5jdGlvbih0LGUsaSl7IndlZWsiIT09dCYmIm1vbnRoIiE9PXQmJiJxdWFydGVyIiE9PXQmJiJoYWxmLXllYXIiIT09dCYmInllYXIiIT09dHx8KHQ9Ik1NLWRkXG55eXl5Iik7dmFyIG49YS5wYXJzZURhdGUoZSksbz1pPyJVVEMiOiIiLHI9blsiZ2V0IitvKyJGdWxsWWVhciJdKCkscz1uWyJnZXQiK28rIk1vbnRoIl0oKSsxLGw9blsiZ2V0IitvKyJEYXRlIl0oKSx1PW5bImdldCIrbysiSG91cnMiXSgpLGM9blsiZ2V0IitvKyJNaW51dGVzIl0oKSxkPW5bImdldCIrbysiU2Vjb25kcyJdKCk7cmV0dXJuIHQ9dC5yZXBsYWNlKCJNTSIsaChzKSkucmVwbGFjZSgiTSIscykucmVwbGFjZSgieXl5eSIscikucmVwbGFjZSgieXkiLHIlMTAwKS5yZXBsYWNlKCJkZCIsaChsKSkucmVwbGFjZSgiZCIsbCkucmVwbGFjZSgiaGgiLGgodSkpLnJlcGxhY2UoImgiLHUpLnJlcGxhY2UoIm1tIixoKGMpKS5yZXBsYWNlKCJtIixjKS5yZXBsYWNlKCJzcyIsaChkKSkucmVwbGFjZSgicyIsZCl9LHIuY2FwaXRhbEZpcnN0PWZ1bmN0aW9uKHQpe3JldHVybiB0P3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk6dH0sci50cnVuY2F0ZVRleHQ9by50cnVuY2F0ZVRleHQsci5nZXRUZXh0UmVjdD1vLmdldEJvdW5kaW5nUmVjdCx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7YS5jYWxsKHRoaXMsdCksdGhpcy5wYXRoPW51bGx9dmFyIGE9aSgzOCksbz1pKDEpLHI9aSgyNykscz1pKDE2OCksbD1pKDc1KSx1PWwucHJvdG90eXBlLmdldENhbnZhc1BhdHRlcm4saD1NYXRoLmFicyxjPW5ldyByKCEwKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bix0eXBlOiJwYXRoIixfX2RpcnR5UGF0aDohMCxzdHJva2VDb250YWluVGhyZXNob2xkOjUsYnJ1c2g6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnN0eWxlLG49dGhpcy5wYXRofHxjLGE9aS5oYXNTdHJva2UoKSxvPWkuaGFzRmlsbCgpLHI9aS5maWxsLHM9aS5zdHJva2UsbD1vJiYhIXIuY29sb3JTdG9wcyxoPWEmJiEhcy5jb2xvclN0b3BzLGQ9byYmISFyLmltYWdlLGY9YSYmISFzLmltYWdlO2lmKGkuYmluZCh0LHRoaXMsZSksdGhpcy5zZXRUcmFuc2Zvcm0odCksdGhpcy5fX2RpcnR5KXt2YXIgcDtsJiYocD1wfHx0aGlzLmdldEJvdW5kaW5nUmVjdCgpLHRoaXMuX2ZpbGxHcmFkaWVudD1pLmdldEdyYWRpZW50KHQscixwKSksaCYmKHA9cHx8dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSx0aGlzLl9zdHJva2VHcmFkaWVudD1pLmdldEdyYWRpZW50KHQscyxwKSl9bD90LmZpbGxTdHlsZT10aGlzLl9maWxsR3JhZGllbnQ6ZCYmKHQuZmlsbFN0eWxlPXUuY2FsbChyLHQpKSxoP3Quc3Ryb2tlU3R5bGU9dGhpcy5fc3Ryb2tlR3JhZGllbnQ6ZiYmKHQuc3Ryb2tlU3R5bGU9dS5jYWxsKHMsdCkpO3ZhciBnPWkubGluZURhc2gsbT1pLmxpbmVEYXNoT2Zmc2V0LHY9ISF0LnNldExpbmVEYXNoLHk9dGhpcy5nZXRHbG9iYWxTY2FsZSgpO24uc2V0U2NhbGUoeVswXSx5WzFdKSx0aGlzLl9fZGlydHlQYXRofHxnJiYhdiYmYT8obi5iZWdpblBhdGgodCksZyYmIXYmJihuLnNldExpbmVEYXNoKGcpLG4uc2V0TGluZURhc2hPZmZzZXQobSkpLHRoaXMuYnVpbGRQYXRoKG4sdGhpcy5zaGFwZSwhMSksdGhpcy5wYXRoJiYodGhpcy5fX2RpcnR5UGF0aD0hMSkpOih0LmJlZ2luUGF0aCgpLHRoaXMucGF0aC5yZWJ1aWxkUGF0aCh0KSksbyYmbi5maWxsKHQpLGcmJnYmJih0LnNldExpbmVEYXNoKGcpLHQubGluZURhc2hPZmZzZXQ9bSksYSYmbi5zdHJva2UodCksZyYmdiYmdC5zZXRMaW5lRGFzaChbXSksdGhpcy5yZXN0b3JlVHJhbnNmb3JtKHQpLG51bGwhPWkudGV4dCYmdGhpcy5kcmF3UmVjdFRleHQodCx0aGlzLmdldEJvdW5kaW5nUmVjdCgpKX0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSxpKXt9LGNyZWF0ZVBhdGhQcm94eTpmdW5jdGlvbigpe3RoaXMucGF0aD1uZXcgcn0sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVjdCxlPXRoaXMuc3R5bGUsaT0hdDtpZihpKXt2YXIgbj10aGlzLnBhdGg7bnx8KG49dGhpcy5wYXRoPW5ldyByKSx0aGlzLl9fZGlydHlQYXRoJiYobi5iZWdpblBhdGgoKSx0aGlzLmJ1aWxkUGF0aChuLHRoaXMuc2hhcGUsITEpKSx0PW4uZ2V0Qm91bmRpbmdSZWN0KCl9aWYodGhpcy5fcmVjdD10LGUuaGFzU3Ryb2tlKCkpe3ZhciBhPXRoaXMuX3JlY3RXaXRoU3Ryb2tlfHwodGhpcy5fcmVjdFdpdGhTdHJva2U9dC5jbG9uZSgpKTtpZih0aGlzLl9fZGlydHl8fGkpe2EuY29weSh0KTt2YXIgbz1lLmxpbmVXaWR0aCxzPWUuc3Ryb2tlTm9TY2FsZT90aGlzLmdldExpbmVTY2FsZSgpOjE7CmUuaGFzRmlsbCgpfHwobz1NYXRoLm1heChvLHRoaXMuc3Ryb2tlQ29udGFpblRocmVzaG9sZHx8NCkpLHM+MWUtMTAmJihhLndpZHRoKz1vL3MsYS5oZWlnaHQrPW8vcyxhLngtPW8vcy8yLGEueS09by9zLzIpfXJldHVybiBhfXJldHVybiB0fSxjb250YWluOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Db29yZFRvTG9jYWwodCxlKSxuPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCksYT10aGlzLnN0eWxlO2lmKHQ9aVswXSxlPWlbMV0sbi5jb250YWluKHQsZSkpe3ZhciBvPXRoaXMucGF0aC5kYXRhO2lmKGEuaGFzU3Ryb2tlKCkpe3ZhciByPWEubGluZVdpZHRoLGw9YS5zdHJva2VOb1NjYWxlP3RoaXMuZ2V0TGluZVNjYWxlKCk6MTtpZihsPjFlLTEwJiYoYS5oYXNGaWxsKCl8fChyPU1hdGgubWF4KHIsdGhpcy5zdHJva2VDb250YWluVGhyZXNob2xkKSkscy5jb250YWluU3Ryb2tlKG8sci9sLHQsZSkpKXJldHVybiEwfWlmKGEuaGFzRmlsbCgpKXJldHVybiBzLmNvbnRhaW4obyx0LGUpfXJldHVybiExfSxkaXJ0eTpmdW5jdGlvbih0KXtudWxsPT10JiYodD0hMCksdCYmKHRoaXMuX19kaXJ0eVBhdGg9dCx0aGlzLl9yZWN0PW51bGwpLHRoaXMuX19kaXJ0eT0hMCx0aGlzLl9fenImJnRoaXMuX196ci5yZWZyZXNoKCksdGhpcy5fX2NsaXBUYXJnZXQmJnRoaXMuX19jbGlwVGFyZ2V0LmRpcnR5KCl9LGFuaW1hdGVTaGFwZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hbmltYXRlKCJzaGFwZSIsdCl9LGF0dHJLVjpmdW5jdGlvbih0LGUpeyJzaGFwZSI9PT10Pyh0aGlzLnNldFNoYXBlKGUpLHRoaXMuX19kaXJ0eVBhdGg9ITAsdGhpcy5fcmVjdD1udWxsKTphLnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLHQsZSl9LHNldFNoYXBlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zaGFwZTtpZihpKXtpZihvLmlzT2JqZWN0KHQpKWZvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihpW25dPXRbbl0pO2Vsc2UgaVt0XT1lO3RoaXMuZGlydHkoITApfXJldHVybiB0aGlzfSxnZXRMaW5lU2NhbGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRyYW5zZm9ybTtyZXR1cm4gdCYmaCh0WzBdLTEpPjFlLTEwJiZoKHRbM10tMSk+MWUtMTA/TWF0aC5zcXJ0KGgodFswXSp0WzNdLXRbMl0qdFsxXSkpOjF9fSxuLmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKSx0LnN0eWxlJiZ0aGlzLnN0eWxlLmV4dGVuZEZyb20odC5zdHlsZSwhMSk7dmFyIGk9dC5zaGFwZTtpZihpKXt0aGlzLnNoYXBlPXRoaXMuc2hhcGV8fHt9O3ZhciBhPXRoaXMuc2hhcGU7Zm9yKHZhciBvIGluIGkpIWEuaGFzT3duUHJvcGVydHkobykmJmkuaGFzT3duUHJvcGVydHkobykmJihhW29dPWlbb10pfXQuaW5pdCYmdC5pbml0LmNhbGwodGhpcyxlKX07by5pbmhlcml0cyhlLG4pO2Zvcih2YXIgaSBpbiB0KSJzdHlsZSIhPT1pJiYic2hhcGUiIT09aSYmKGUucHJvdG90eXBlW2ldPXRbaV0pO3JldHVybiBlfSxvLmluaGVyaXRzKG4sYSksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUsaSxuLGEpe3ZhciBvPTAscj0wO251bGw9PW4mJihuPTEvMCksbnVsbD09YSYmKGE9MS8wKTt2YXIgcz0wO2UuZWFjaENoaWxkKGZ1bmN0aW9uKGwsdSl7dmFyIGgsYyxkPWwucG9zaXRpb24sZj1sLmdldEJvdW5kaW5nUmVjdCgpLHA9ZS5jaGlsZEF0KHUrMSksZz1wJiZwLmdldEJvdW5kaW5nUmVjdCgpO2lmKCJob3Jpem9udGFsIj09PXQpe3ZhciBtPWYud2lkdGgrKGc/LWcueCtmLng6MCk7aD1vK20saD5ufHxsLm5ld2xpbmU/KG89MCxoPW0scis9cytpLHM9Zi5oZWlnaHQpOnM9TWF0aC5tYXgocyxmLmhlaWdodCl9ZWxzZXt2YXIgdj1mLmhlaWdodCsoZz8tZy55K2YueTowKTtjPXIrdixjPmF8fGwubmV3bGluZT8obys9cytpLHI9MCxjPXYscz1mLndpZHRoKTpzPU1hdGgubWF4KHMsZi53aWR0aCl9bC5uZXdsaW5lfHwoZFswXT1vLGRbMV09ciwiaG9yaXpvbnRhbCI9PT10P289aCtpOnI9YytpKX0pfXZhciBhPWkoMSksbz1pKDEyKSxyPWkoNCkscz1pKDcpLGw9ci5wYXJzZVBlcmNlbnQsdT1hLmVhY2gsaD17fSxjPWguTE9DQVRJT05fUEFSQU1TPVsibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwid2lkdGgiLCJoZWlnaHQiXSxkPWguSFZfTkFNRVM9W1sid2lkdGgiLCJsZWZ0IiwicmlnaHQiXSxbImhlaWdodCIsInRvcCIsImJvdHRvbSJdXTtoLmJveD1uLGgudmJveD1hLmN1cnJ5KG4sInZlcnRpY2FsIiksaC5oYm94PWEuY3VycnkobiwiaG9yaXpvbnRhbCIpLGguZ2V0QXZhaWxhYmxlU2l6ZT1mdW5jdGlvbih0LGUsaSl7dmFyIG49ZS53aWR0aCxhPWUuaGVpZ2h0LG89bCh0Lngsbikscj1sKHQueSxhKSx1PWwodC54MixuKSxoPWwodC55MixhKTtyZXR1cm4oaXNOYU4obyl8fGlzTmFOKHBhcnNlRmxvYXQodC54KSkpJiYobz0wKSwoaXNOYU4odSl8fGlzTmFOKHBhcnNlRmxvYXQodC54MikpKSYmKHU9biksKGlzTmFOKHIpfHxpc05hTihwYXJzZUZsb2F0KHQueSkpKSYmKHI9MCksKGlzTmFOKGgpfHxpc05hTihwYXJzZUZsb2F0KHQueTIpKSkmJihoPWEpLGk9cy5ub3JtYWxpemVDc3NBcnJheShpfHwwKSx7d2lkdGg6TWF0aC5tYXgodS1vLWlbMV0taVszXSwwKSxoZWlnaHQ6TWF0aC5tYXgoaC1yLWlbMF0taVsyXSwwKX19LGguZ2V0TGF5b3V0UmVjdD1mdW5jdGlvbih0LGUsaSl7aT1zLm5vcm1hbGl6ZUNzc0FycmF5KGl8fDApO3ZhciBuPWUud2lkdGgsYT1lLmhlaWdodCxyPWwodC5sZWZ0LG4pLHU9bCh0LnRvcCxhKSxoPWwodC5yaWdodCxuKSxjPWwodC5ib3R0b20sYSksZD1sKHQud2lkdGgsbiksZj1sKHQuaGVpZ2h0LGEpLHA9aVsyXStpWzBdLGc9aVsxXStpWzNdLG09dC5hc3BlY3Q7c3dpdGNoKGlzTmFOKGQpJiYoZD1uLWgtZy1yKSxpc05hTihmKSYmKGY9YS1jLXAtdSksbnVsbCE9bSYmKGlzTmFOKGQpJiZpc05hTihmKSYmKG0+bi9hP2Q9LjgqbjpmPS44KmEpLGlzTmFOKGQpJiYoZD1tKmYpLGlzTmFOKGYpJiYoZj1kL20pKSxpc05hTihyKSYmKHI9bi1oLWQtZyksaXNOYU4odSkmJih1PWEtYy1mLXApLHQubGVmdHx8dC5yaWdodCl7Y2FzZSJjZW50ZXIiOnI9bi8yLWQvMi1pWzNdO2JyZWFrO2Nhc2UicmlnaHQiOnI9bi1kLWd9c3dpdGNoKHQudG9wfHx0LmJvdHRvbSl7Y2FzZSJtaWRkbGUiOmNhc2UiY2VudGVyIjp1PWEvMi1mLzItaVswXTticmVhaztjYXNlImJvdHRvbSI6dT1hLWYtcH1yPXJ8fDAsdT11fHwwLGlzTmFOKGQpJiYoZD1uLWctci0oaHx8MCkpLGlzTmFOKGYpJiYoZj1hLXAtdS0oY3x8MCkpO3ZhciB2PW5ldyBvKHIraVszXSx1K2lbMF0sZCxmKTtyZXR1cm4gdi5tYXJnaW49aSx2fSxoLnBvc2l0aW9uRWxlbWVudD1mdW5jdGlvbih0LGUsaSxuLHIpe3ZhciBzPSFyfHwhci5odnx8ci5odlswXSxsPSFyfHwhci5odnx8ci5odlsxXSx1PXImJnIuYm91bmRpbmdNb2RlfHwiYWxsIjtpZihzfHxsKXt2YXIgYztpZigicmF3Ij09PXUpYz0iZ3JvdXAiPT09dC50eXBlP25ldyBvKDAsMCwrZS53aWR0aHx8MCwrZS5oZWlnaHR8fDApOnQuZ2V0Qm91bmRpbmdSZWN0KCk7ZWxzZSBpZihjPXQuZ2V0Qm91bmRpbmdSZWN0KCksdC5uZWVkTG9jYWxUcmFuc2Zvcm0oKSl7dmFyIGQ9dC5nZXRMb2NhbFRyYW5zZm9ybSgpO2M9Yy5jbG9uZSgpLGMuYXBwbHlUcmFuc2Zvcm0oZCl9ZT1oLmdldExheW91dFJlY3QoYS5kZWZhdWx0cyh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9LGUpLGksbik7dmFyIGY9dC5wb3NpdGlvbixwPXM/ZS54LWMueDowLGc9bD9lLnktYy55OjA7dC5hdHRyKCJwb3NpdGlvbiIsInJhdyI9PT11P1twLGddOltmWzBdK3AsZlsxXStnXSl9fSxoLnNpemVDYWxjdWxhYmxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXRbZFtlXVswXV18fG51bGwhPXRbZFtlXVsxXV0mJm51bGwhPXRbZFtlXVsyXV19LGgubWVyZ2VMYXlvdXRQYXJhbT1mdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbihpLG4pe3ZhciBhPXt9LHM9MCxoPXt9LGM9MCxkPTI7aWYodShpLGZ1bmN0aW9uKGUpe2hbZV09dFtlXX0pLHUoaSxmdW5jdGlvbih0KXtvKGUsdCkmJihhW3RdPWhbdF09ZVt0XSkscihhLHQpJiZzKysscihoLHQpJiZjKyt9KSxsW25dKXJldHVybiByKGUsaVsxXSk/aFtpWzJdXT1udWxsOnIoZSxpWzJdKSYmKGhbaVsxXV09bnVsbCksaDtpZihjIT09ZCYmcyl7aWYocz49ZClyZXR1cm4gYTtmb3IodmFyIGY9MDtmPGkubGVuZ3RoO2YrKyl7dmFyIHA9aVtmXTtpZighbyhhLHApJiZvKHQscCkpe2FbcF09dFtwXTticmVha319cmV0dXJuIGF9cmV0dXJuIGh9ZnVuY3Rpb24gbyh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gbnVsbCE9dFtlXSYmImF1dG8iIT09dFtlXX1mdW5jdGlvbiBzKHQsZSxpKXt1KHQsZnVuY3Rpb24odCl7ZVt0XT1pW3RdfSl9IWEuaXNPYmplY3QoaSkmJihpPXt9KTt2YXIgbD1pLmlnbm9yZVNpemU7IWEuaXNBcnJheShsKSYmKGw9W2wsbF0pO3ZhciBoPW4oZFswXSwwKSxjPW4oZFsxXSwxKTtzKGRbMF0sdCxoKSxzKGRbMV0sdCxjKX0saC5nZXRMYXlvdXRQYXJhbXM9ZnVuY3Rpb24odCl7cmV0dXJuIGguY29weUxheW91dFBhcmFtcyh7fSx0KX0saC5jb3B5TGF5b3V0UGFyYW1zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUmJnQmJnUoYyxmdW5jdGlvbihpKXtlLmhhc093blByb3BlcnR5KGkpJiYodFtpXT1lW2ldKX0pLHR9LHQuZXhwb3J0cz1ofSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dmFyIGU9e30saT17fSxuPXQubWF0Y2goL0ZpcmVmb3hcLyhbXGQuXSspLyksYT10Lm1hdGNoKC9NU0lFXHMoW1xkLl0rKS8pfHx0Lm1hdGNoKC9UcmlkZW50XC8uKz9ydjooKFtcZC5dKykpLyksbz10Lm1hdGNoKC9FZGdlXC8oW1xkLl0rKS8pLHI9L21pY3JvbWVzc2VuZ2VyL2kudGVzdCh0KTtyZXR1cm4gbiYmKGkuZmlyZWZveD0hMCxpLnZlcnNpb249blsxXSksYSYmKGkuaWU9ITAsaS52ZXJzaW9uPWFbMV0pLG8mJihpLmVkZ2U9ITAsaS52ZXJzaW9uPW9bMV0pLHImJihpLndlQ2hhdD0hMCkse2Jyb3dzZXI6aSxvczplLG5vZGU6ITEsY2FudmFzU3VwcG9ydGVkOiEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCx0b3VjaEV2ZW50c1N1cHBvcnRlZDoib250b3VjaHN0YXJ0ImluIHdpbmRvdyYmIWkuaWUmJiFpLmVkZ2UscG9pbnRlckV2ZW50c1N1cHBvcnRlZDoib25wb2ludGVyZG93biJpbiB3aW5kb3cmJihpLmVkZ2V8fGkuaWUmJmkudmVyc2lvbj49MTEpfX12YXIgbj17fTtuPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yP3ticm93c2VyOnt9LG9zOnt9LG5vZGU6ITAsY2FudmFzU3VwcG9ydGVkOiEwfTppKG5hdmlnYXRvci51c2VyQWdlbnQpLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7dGhpcy5wYXJlbnRNb2RlbD1lLHRoaXMuZWNNb2RlbD1pLHRoaXMub3B0aW9uPXR9ZnVuY3Rpb24gYSh0LGUsaSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aCYmKCFlW25dfHwodD10JiYib2JqZWN0Ij09dHlwZW9mIHQ/dFtlW25dXTpudWxsLG51bGwhPXQpKTtuKyspO3JldHVybiBudWxsPT10JiZpJiYodD1pLmdldChlKSksdH1mdW5jdGlvbiBvKHQsZSl7dmFyIGk9cy5nZXQodCwiZ2V0UGFyZW50Iik7cmV0dXJuIGk/aS5jYWxsKHQsZSk6dC5wYXJlbnRNb2RlbH12YXIgcj1pKDEpLHM9aSgxNSksbD1pKDEwKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixpbml0Om51bGwsbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7ci5tZXJnZSh0aGlzLm9wdGlvbix0LCEwKX0sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dGhpcy5vcHRpb246YSh0aGlzLm9wdGlvbix0aGlzLnBhcnNlUGF0aCh0KSwhZSYmbyh0aGlzLHQpKX0sZ2V0U2hhbGxvdzpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9uLG49bnVsbD09aT9pOmlbdF0sYT0hZSYmbyh0aGlzLHQpO3JldHVybiBudWxsPT1uJiZhJiYobj1hLmdldFNoYWxsb3codCkpLG59LGdldE1vZGVsOmZ1bmN0aW9uKHQsZSl7dmFyIGkscj1udWxsPT10P3RoaXMub3B0aW9uOmEodGhpcy5vcHRpb24sdD10aGlzLnBhcnNlUGF0aCh0KSk7cmV0dXJuIGU9ZXx8KGk9byh0aGlzLHQpKSYmaS5nZXRNb2RlbCh0KSxuZXcgbihyLGUsdGhpcy5lY01vZGVsKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLm9wdGlvbn0scmVzdG9yZURhdGE6ZnVuY3Rpb24oKXt9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IHQoci5jbG9uZSh0aGlzLm9wdGlvbikpfSxzZXRSZWFkT25seTpmdW5jdGlvbih0KXtzLnNldFJlYWRPbmx5KHRoaXMsdCl9LHBhcnNlUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKSksdH0sY3VzdG9taXplR2V0UGFyZW50OmZ1bmN0aW9uKHQpe3Muc2V0KHRoaXMsImdldFBhcmVudCIsdCl9LGlzQW5pbWF0aW9uRW5hYmxlZDpmdW5jdGlvbigpe2lmKCFsLm5vZGUpe2lmKG51bGwhPXRoaXMub3B0aW9uLmFuaW1hdGlvbilyZXR1cm4hIXRoaXMub3B0aW9uLmFuaW1hdGlvbjtpZih0aGlzLnBhcmVudE1vZGVsKXJldHVybiB0aGlzLnBhcmVudE1vZGVsLmlzQW5pbWF0aW9uRW5hYmxlZCgpfX19LHMuZW5hYmxlQ2xhc3NFeHRlbmQobik7dmFyIHU9ci5taXhpbjt1KG4saSgxNTApKSx1KG4saSgxNDcpKSx1KG4saSgxNTEpKSx1KG4saSgxNDkpKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpLG4pe2k8MCYmKHQrPWksaT0taSksbjwwJiYoZSs9bixuPS1uKSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLndpZHRoPWksdGhpcy5oZWlnaHQ9bn12YXIgYT1pKDYpLG89aSgxOSkscj1hLmFwcGx5VHJhbnNmb3JtLHM9TWF0aC5taW4sbD1NYXRoLm1heDtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bix1bmlvbjpmdW5jdGlvbih0KXt2YXIgZT1zKHQueCx0aGlzLngpLGk9cyh0LnksdGhpcy55KTt0aGlzLndpZHRoPWwodC54K3Qud2lkdGgsdGhpcy54K3RoaXMud2lkdGgpLWUsdGhpcy5oZWlnaHQ9bCh0LnkrdC5oZWlnaHQsdGhpcy55K3RoaXMuaGVpZ2h0KS1pLHRoaXMueD1lLHRoaXMueT1pfSxhcHBseVRyYW5zZm9ybTpmdW5jdGlvbigpe3ZhciB0PVtdLGU9W10saT1bXSxuPVtdO3JldHVybiBmdW5jdGlvbihhKXtpZihhKXt0WzBdPWlbMF09dGhpcy54LHRbMV09blsxXT10aGlzLnksZVswXT1uWzBdPXRoaXMueCt0aGlzLndpZHRoLGVbMV09aVsxXT10aGlzLnkrdGhpcy5oZWlnaHQscih0LHQsYSkscihlLGUsYSkscihpLGksYSkscihuLG4sYSksdGhpcy54PXModFswXSxlWzBdLGlbMF0sblswXSksdGhpcy55PXModFsxXSxlWzFdLGlbMV0sblsxXSk7dmFyIG89bCh0WzBdLGVbMF0saVswXSxuWzBdKSx1PWwodFsxXSxlWzFdLGlbMV0sblsxXSk7dGhpcy53aWR0aD1vLXRoaXMueCx0aGlzLmhlaWdodD11LXRoaXMueX19fSgpLGNhbGN1bGF0ZVRyYW5zZm9ybTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dC53aWR0aC9lLndpZHRoLG49dC5oZWlnaHQvZS5oZWlnaHQsYT1vLmNyZWF0ZSgpO3JldHVybiBvLnRyYW5zbGF0ZShhLGEsWy1lLngsLWUueV0pLG8uc2NhbGUoYSxhLFtpLG5dKSxvLnRyYW5zbGF0ZShhLGEsW3QueCx0LnldKSxhfSxpbnRlcnNlY3Q6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dCBpbnN0YW5jZW9mIG58fCh0PW4uY3JlYXRlKHQpKTt2YXIgZT10aGlzLGk9ZS54LGE9ZS54K2Uud2lkdGgsbz1lLnkscj1lLnkrZS5oZWlnaHQscz10LngsbD10LngrdC53aWR0aCx1PXQueSxoPXQueSt0LmhlaWdodDtyZXR1cm4hKGE8c3x8bDxpfHxyPHV8fGg8byl9LGNvbnRhaW46ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzO3JldHVybiB0Pj1pLngmJnQ8PWkueCtpLndpZHRoJiZlPj1pLnkmJmU8PWkueStpLmhlaWdodH0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0sY29weTpmdW5jdGlvbih0KXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0fSxwbGFpbjpmdW5jdGlvbigpe3JldHVybnt4OnRoaXMueCx5OnRoaXMueSx3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodH19fSxuLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odC54LHQueSx0LndpZHRoLHQuaGVpZ2h0KX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPVtdO3JldHVybiBvLmVhY2goaC5nZXRDbGFzc2VzQnlNYWluVHlwZSh0KSxmdW5jdGlvbih0KXtyLmFwcGx5KGUsdC5wcm90b3R5cGUuZGVwZW5kZW5jaWVzfHxbXSl9KSxvLm1hcChlLGZ1bmN0aW9uKHQpe3JldHVybiBsLnBhcnNlQ2xhc3NUeXBlKHQpLm1haW59KX12YXIgYT1pKDExKSxvPWkoMSkscj1BcnJheS5wcm90b3R5cGUucHVzaCxzPWkoNTApLGw9aSgxNSksdT1pKDkpLGg9YS5leHRlbmQoe3R5cGU6ImNvbXBvbmVudCIsaWQ6IiIsbmFtZToiIixtYWluVHlwZToiIixzdWJUeXBlOiIiLGNvbXBvbmVudEluZGV4OjAsZGVmYXVsdE9wdGlvbjpudWxsLGVjTW9kZWw6bnVsbCxkZXBlbmRlbnRNb2RlbHM6W10sdWlkOm51bGwsbGF5b3V0TW9kZTpudWxsLCRjb25zdHJ1Y3RvcjpmdW5jdGlvbih0LGUsaSxuKXthLmNhbGwodGhpcyx0LGUsaSxuKSx0aGlzLnVpZD1zLmdldFVJRCgiY29tcG9uZW50TW9kZWwiKX0saW5pdDpmdW5jdGlvbih0LGUsaSxuKXt0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSl9LG1lcmdlRGVmYXVsdEFuZFRoZW1lOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5sYXlvdXRNb2RlLG49aT91LmdldExheW91dFBhcmFtcyh0KTp7fSxhPWUuZ2V0VGhlbWUoKTtvLm1lcmdlKHQsYS5nZXQodGhpcy5tYWluVHlwZSkpLG8ubWVyZ2UodCx0aGlzLmdldERlZmF1bHRPcHRpb24oKSksaSYmdS5tZXJnZUxheW91dFBhcmFtKHQsbixpKX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCxlKXtvLm1lcmdlKHRoaXMub3B0aW9uLHQsITApO3ZhciBpPXRoaXMubGF5b3V0TW9kZTtpJiZ1Lm1lcmdlTGF5b3V0UGFyYW0odGhpcy5vcHRpb24sdCxpKX0sb3B0aW9uVXBkYXRlZDpmdW5jdGlvbih0LGUpe30sZ2V0RGVmYXVsdE9wdGlvbjpmdW5jdGlvbigpe2lmKCFsLmhhc093bih0aGlzLCJfX2RlZmF1bHRPcHRpb24iKSl7Zm9yKHZhciB0PVtdLGU9dGhpcy5jb25zdHJ1Y3RvcjtlOyl7dmFyIGk9ZS5wcm90b3R5cGUuZGVmYXVsdE9wdGlvbjtpJiZ0LnB1c2goaSksZT1lLnN1cGVyQ2xhc3N9Zm9yKHZhciBuPXt9LGE9dC5sZW5ndGgtMTthPj0wO2EtLSluPW8ubWVyZ2Uobix0W2FdLCEwKTtsLnNldCh0aGlzLCJfX2RlZmF1bHRPcHRpb24iLG4pfXJldHVybiBsLmdldCh0aGlzLCJfX2RlZmF1bHRPcHRpb24iKX0sZ2V0UmVmZXJyaW5nQ29tcG9uZW50czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lY01vZGVsLnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6dCxpbmRleDp0aGlzLmdldCh0KyJJbmRleCIsITApLGlkOnRoaXMuZ2V0KHQrIklkIiwhMCl9KX19KTtsLmVuYWJsZUNsYXNzTWFuYWdlbWVudChoLHtyZWdpc3RlcldoZW5FeHRlbmQ6ITB9KSxzLmVuYWJsZVN1YlR5cGVEZWZhdWx0ZXIoaCkscy5lbmFibGVUb3BvbG9naWNhbFRyYXZlbChoLG4pLG8ubWl4aW4oaCxpKDE0OCkpLHQuZXhwb3J0cz1ofSxmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxlKXtwLmVhY2godi5jb25jYXQoZS5fX3dyYXBwZWRNZXRob2RzfHxbXSksZnVuY3Rpb24oaSl7ZS5oYXNPd25Qcm9wZXJ0eShpKSYmKHRbaV09ZVtpXSl9KSx0Ll9fd3JhcHBlZE1ldGhvZHM9ZS5fX3dyYXBwZWRNZXRob2RzfWZ1bmN0aW9uIGEodCl7dGhpcy5fYXJyYXk9dHx8W119ZnVuY3Rpb24gbyh0KXtyZXR1cm4gcC5pc0FycmF5KHQpfHwodD1bdF0pLHR9ZnVuY3Rpb24gcih0LGUpe3ZhciBpPXQuZGltZW5zaW9ucyxhPW5ldyB5KHAubWFwKGksdC5nZXREaW1lbnNpb25JbmZvLHQpLHQuaG9zdE1vZGVsKTtuKGEsdCk7Zm9yKHZhciBvPWEuX3N0b3JhZ2U9e30scj10Ll9zdG9yYWdlLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGw9aVtzXSx1PXJbbF07cC5pbmRleE9mKGUsbCk+PTA/b1tsXT1uZXcgdS5jb25zdHJ1Y3RvcihyW2xdLmxlbmd0aCk6b1tsXT1yW2xdfXJldHVybiBhfXZhciBzPSJ1bmRlZmluZWQiLGw9InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3c/ZTp3aW5kb3csdT10eXBlb2YgbC5GbG9hdDY0QXJyYXk9PT1zP0FycmF5OmwuRmxvYXQ2NEFycmF5LGg9dHlwZW9mIGwuSW50MzJBcnJheT09PXM/QXJyYXk6bC5JbnQzMkFycmF5LGM9e2Zsb2F0OnUsaW50Omgsb3JkaW5hbDpBcnJheSxudW1iZXI6QXJyYXksdGltZTpBcnJheX0sZD1pKDExKSxmPWkoNDMpLHA9aSgxKSxnPWkoNSksbT1wLmlzT2JqZWN0LHY9WyJzdGFja2VkT24iLCJoYXNJdGVtT3B0aW9uIiwiX25hbWVMaXN0IiwiX2lkTGlzdCIsIl9yYXdEYXRhIl07YS5wcm90b3R5cGUucHVyZT0hMSxhLnByb3RvdHlwZS5jb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnJheS5sZW5ndGh9LGEucHJvdG90eXBlLmdldEl0ZW09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FycmF5W3RdfTt2YXIgeT1mdW5jdGlvbih0LGUpe3Q9dHx8WyJ4IiwieSJdO2Zvcih2YXIgaT17fSxuPVtdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG8scj17fTsic3RyaW5nIj09dHlwZW9mIHRbYV0/KG89dFthXSxyPXtuYW1lOm8sY29vcmREaW06byxjb29yZERpbUluZGV4OjAsc3RhY2thYmxlOiExLHR5cGU6Im51bWJlciJ9KToocj10W2FdLG89ci5uYW1lLHIudHlwZT1yLnR5cGV8fCJudW1iZXIiLHIuY29vcmREaW18fChyLmNvb3JkRGltPW8sci5jb29yZERpbUluZGV4PTApKSxyLm90aGVyRGltcz1yLm90aGVyRGltc3x8e30sbi5wdXNoKG8pLGlbb109cn10aGlzLmRpbWVuc2lvbnM9bix0aGlzLl9kaW1lbnNpb25JbmZvcz1pLHRoaXMuaG9zdE1vZGVsPWUsdGhpcy5kYXRhVHlwZSx0aGlzLmluZGljZXM9W10sdGhpcy5fc3RvcmFnZT17fSx0aGlzLl9uYW1lTGlzdD1bXSx0aGlzLl9pZExpc3Q9W10sdGhpcy5fb3B0aW9uTW9kZWxzPVtdLHRoaXMuc3RhY2tlZE9uPW51bGwsdGhpcy5fdmlzdWFsPXt9LHRoaXMuX2xheW91dD17fSx0aGlzLl9pdGVtVmlzdWFscz1bXSx0aGlzLl9pdGVtTGF5b3V0cz1bXSx0aGlzLl9ncmFwaGljRWxzPVtdLHRoaXMuX3Jhd0RhdGEsdGhpcy5fZXh0ZW50fSx4PXkucHJvdG90eXBlO3gudHlwZT0ibGlzdCIseC5oYXNJdGVtT3B0aW9uPSEwLHguZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0KXx8KHQ9dGhpcy5kaW1lbnNpb25zW3RdfHx0KSx0fSx4LmdldERpbWVuc2lvbkluZm89ZnVuY3Rpb24odCl7cmV0dXJuIHAuY2xvbmUodGhpcy5fZGltZW5zaW9uSW5mb3NbdGhpcy5nZXREaW1lbnNpb24odCldKX0seC5pbml0RGF0YT1mdW5jdGlvbih0LGUsaSl7dD10fHxbXTt2YXIgbj1wLmlzQXJyYXkodCk7biYmKHQ9bmV3IGEodCkpLHRoaXMuX3Jhd0RhdGE9dDt2YXIgbyxyPXRoaXMuX3N0b3JhZ2U9e30scz10aGlzLmluZGljZXM9W10sbD10aGlzLmRpbWVuc2lvbnMsdT10aGlzLl9kaW1lbnNpb25JbmZvcyxoPXQuY291bnQoKSxkPVtdLGY9e307ZT1lfHxbXTtmb3IodmFyIG09MDttPGwubGVuZ3RoO20rKyl7dmFyIHY9dVtsW21dXTswPT09di5vdGhlckRpbXMuaXRlbU5hbWUmJihvPW0pO3ZhciB5PWNbdi50eXBlXTtyW2xbbV1dPW5ldyB5KGgpfXZhciB4PXRoaXM7aXx8KHguaGFzSXRlbU9wdGlvbj0hMSksaT1pfHxmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1nLmdldERhdGFJdGVtVmFsdWUodCk7cmV0dXJuIGcuaXNEYXRhSXRlbU9wdGlvbih0KSYmKHguaGFzSXRlbU9wdGlvbj0hMCksZy5jb252ZXJEYXRhVmFsdWUoYSBpbnN0YW5jZW9mIEFycmF5P2Fbbl06YSx1W2VdKX07Zm9yKHZhciBtPTA7bTxoO20rKyl7Zm9yKHZhciBfPXQuZ2V0SXRlbShtKSxiPTA7YjxsLmxlbmd0aDtiKyspe3ZhciB3PWxbYl0sUz1yW3ddO1NbbV09aShfLHcsbSxiKX1zLnB1c2gobSl9Zm9yKHZhciBtPTA7bTxoO20rKyl7dmFyIF89dC5nZXRJdGVtKG0pOyFlW21dJiZfJiYobnVsbCE9Xy5uYW1lP2VbbV09Xy5uYW1lOm51bGwhPW8mJihlW21dPXJbbFtvXV1bbV0pKTt2YXIgTT1lW21dfHwiIixJPV8mJl8uaWQ7IUkmJk0mJihmW01dPWZbTV18fDAsST1NLGZbTV0+MCYmKEkrPSJfX2VjX18iK2ZbTV0pLGZbTV0rKyksSSYmKGRbbV09SSl9dGhpcy5fbmFtZUxpc3Q9ZSx0aGlzLl9pZExpc3Q9ZH0seC5jb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGljZXMubGVuZ3RofSx4LmdldD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fc3RvcmFnZSxhPXRoaXMuaW5kaWNlc1tlXTtpZihudWxsPT1hfHwhblt0XSlyZXR1cm4gTmFOO3ZhciBvPW5bdF1bYV07aWYoaSl7dmFyIHI9dGhpcy5fZGltZW5zaW9uSW5mb3NbdF07aWYociYmci5zdGFja2FibGUpZm9yKHZhciBzPXRoaXMuc3RhY2tlZE9uO3M7KXt2YXIgbD1zLmdldCh0LGUpOyhvPj0wJiZsPjB8fG88PTAmJmw8MCkmJihvKz1sKSxzPXMuc3RhY2tlZE9ufX1yZXR1cm4gb30seC5nZXRWYWx1ZXM9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPVtdO3AuaXNBcnJheSh0KXx8KGk9ZSxlPXQsdD10aGlzLmRpbWVuc2lvbnMpO2Zvcih2YXIgYT0wLG89dC5sZW5ndGg7YTxvO2ErKyluLnB1c2godGhpcy5nZXQodFthXSxlLGkpKTtyZXR1cm4gbn0seC5oYXNWYWx1ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5kaW1lbnNpb25zLGk9dGhpcy5fZGltZW5zaW9uSW5mb3Msbj0wLGE9ZS5sZW5ndGg7bjxhO24rKylpZigib3JkaW5hbCIhPT1pW2Vbbl1dLnR5cGUmJmlzTmFOKHRoaXMuZ2V0KGVbbl0sdCkpKXJldHVybiExO3JldHVybiEwfSx4LmdldERhdGFFeHRlbnQ9ZnVuY3Rpb24odCxlLGkpe3Q9dGhpcy5nZXREaW1lbnNpb24odCk7dmFyIG49dGhpcy5fc3RvcmFnZVt0XSxhPXRoaXMuZ2V0RGltZW5zaW9uSW5mbyh0KTtlPWEmJmEuc3RhY2thYmxlJiZlO3ZhciBvLHI9KHRoaXMuX2V4dGVudHx8KHRoaXMuX2V4dGVudD17fSkpW3QrISFlXTtpZihyKXJldHVybiByO2lmKG4pe2Zvcih2YXIgcz0xLzAsbD0tKDEvMCksdT0wLGg9dGhpcy5jb3VudCgpO3U8aDt1Kyspbz10aGlzLmdldCh0LHUsZSksaSYmIWkobyx0LHUpfHwobzxzJiYocz1vKSxvPmwmJihsPW8pKTtyZXR1cm4gdGhpcy5fZXh0ZW50W3QrISFlXT1bcyxsXX1yZXR1cm5bMS8wLC0oMS8wKV19LHguZ2V0U3VtPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3RvcmFnZVt0XSxuPTA7aWYoaSlmb3IodmFyIGE9MCxvPXRoaXMuY291bnQoKTthPG87YSsrKXt2YXIgcj10aGlzLmdldCh0LGEsZSk7aXNOYU4ocil8fChuKz1yKX1yZXR1cm4gbn0seC5pbmRleE9mPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3RvcmFnZSxuPWlbdF0sYT10aGlzLmluZGljZXM7aWYobilmb3IodmFyIG89MCxyPWEubGVuZ3RoO288cjtvKyspe3ZhciBzPWFbb107aWYobltzXT09PWUpcmV0dXJuIG99cmV0dXJuLTF9LHguaW5kZXhPZk5hbWU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaW5kaWNlcyxpPXRoaXMuX25hbWVMaXN0LG49MCxhPWUubGVuZ3RoO248YTtuKyspe3ZhciBvPWVbbl07aWYoaVtvXT09PXQpcmV0dXJuIG59cmV0dXJuLTF9LHguaW5kZXhPZlJhd0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5kaWNlcyxpPWVbdF07aWYobnVsbCE9aSYmaT09PXQpcmV0dXJuIHQ7Zm9yKHZhciBuPTAsYT1lLmxlbmd0aC0xO248PWE7KXt2YXIgbz0obithKS8yfDA7aWYoZVtvXTx0KW49bysxO2Vsc2V7aWYoIShlW29dPnQpKXJldHVybiBvO2E9by0xfX1yZXR1cm4tMX0seC5pbmRpY2VzT2ZOZWFyZXN0PWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXRoaXMuX3N0b3JhZ2Usbz1hW3RdLHI9W107aWYoIW8pcmV0dXJuIHI7bnVsbD09biYmKG49MS8wKTtmb3IodmFyIHM9TnVtYmVyLk1BWF9WQUxVRSxsPS0xLHU9MCxoPXRoaXMuY291bnQoKTt1PGg7dSsrKXt2YXIgYz1lLXRoaXMuZ2V0KHQsdSxpKSxkPU1hdGguYWJzKGMpO2M8PW4mJmQ8PXMmJigoZDxzfHxjPj0wJiZsPDApJiYocz1kLGw9YyxyLmxlbmd0aD0wKSxyLnB1c2godSkpfXJldHVybiByfSx4LmdldFJhd0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5kaWNlc1t0XTtyZXR1cm4gbnVsbD09ZT8tMTplfSx4LmdldFJhd0RhdGFJdGVtPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYXdEYXRhLmdldEl0ZW0odGhpcy5nZXRSYXdJbmRleCh0KSl9LHguZ2V0TmFtZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZUxpc3RbdGhpcy5pbmRpY2VzW3RdXXx8IiJ9LHguZ2V0SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lkTGlzdFt0aGlzLmluZGljZXNbdF1dfHx0aGlzLmdldFJhd0luZGV4KHQpKyIifSx4LmVhY2g9ZnVuY3Rpb24odCxlLGksbil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPWksaT1lLGU9dCx0PVtdKSx0PXAubWFwKG8odCksdGhpcy5nZXREaW1lbnNpb24sdGhpcyk7dmFyIGE9W10scj10Lmxlbmd0aCxzPXRoaXMuaW5kaWNlcztuPW58fHRoaXM7Zm9yKHZhciBsPTA7bDxzLmxlbmd0aDtsKyspc3dpdGNoKHIpe2Nhc2UgMDplLmNhbGwobixsKTticmVhaztjYXNlIDE6ZS5jYWxsKG4sdGhpcy5nZXQodFswXSxsLGkpLGwpO2JyZWFrO2Nhc2UgMjplLmNhbGwobix0aGlzLmdldCh0WzBdLGwsaSksdGhpcy5nZXQodFsxXSxsLGkpLGwpO2JyZWFrO2RlZmF1bHQ6Zm9yKHZhciB1PTA7dTxyO3UrKylhW3VdPXRoaXMuZ2V0KHRbdV0sbCxpKTthW3VdPWwsZS5hcHBseShuLGEpfX0seC5maWx0ZXJTZWxmPWZ1bmN0aW9uKHQsZSxpLG4peyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj1pLGk9ZSxlPXQsdD1bXSksdD1wLm1hcChvKHQpLHRoaXMuZ2V0RGltZW5zaW9uLHRoaXMpO3ZhciBhPVtdLHI9W10scz10Lmxlbmd0aCxsPXRoaXMuaW5kaWNlcztuPW58fHRoaXM7Zm9yKHZhciB1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBoO2lmKHMpaWYoMT09PXMpaD1lLmNhbGwobix0aGlzLmdldCh0WzBdLHUsaSksdSk7ZWxzZXtmb3IodmFyIGM9MDtjPHM7YysrKXJbY109dGhpcy5nZXQodFtjXSx1LGkpO3JbY109dSxoPWUuYXBwbHkobixyKX1lbHNlIGg9ZS5jYWxsKG4sdSk7aCYmYS5wdXNoKGxbdV0pfXJldHVybiB0aGlzLmluZGljZXM9YSx0aGlzLl9leHRlbnQ9e30sdGhpc30seC5tYXBBcnJheT1mdW5jdGlvbih0LGUsaSxuKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49aSxpPWUsZT10LHQ9W10pO3ZhciBhPVtdO3JldHVybiB0aGlzLmVhY2godCxmdW5jdGlvbigpe2EucHVzaChlJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGksbiksYX0seC5tYXA9ZnVuY3Rpb24odCxlLGksbil7dD1wLm1hcChvKHQpLHRoaXMuZ2V0RGltZW5zaW9uLHRoaXMpO3ZhciBhPXIodGhpcyx0KSxzPWEuaW5kaWNlcz10aGlzLmluZGljZXMsbD1hLl9zdG9yYWdlLHU9W107cmV0dXJuIHRoaXMuZWFjaCh0LGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0sbj1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihudWxsIT1uKXsibnVtYmVyIj09dHlwZW9mIG4mJih1WzBdPW4sbj11KTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyl7dmFyIG89dFthXSxyPWxbb10saD1zW2ldO3ImJihyW2hdPW5bYV0pfX19LGksbiksYX0seC5kb3duU2FtcGxlPWZ1bmN0aW9uKHQsZSxpLG4pe2Zvcih2YXIgYT1yKHRoaXMsW3RdKSxvPXRoaXMuX3N0b3JhZ2Uscz1hLl9zdG9yYWdlLGw9dGhpcy5pbmRpY2VzLHU9YS5pbmRpY2VzPVtdLGg9W10sYz1bXSxkPU1hdGguZmxvb3IoMS9lKSxmPXNbdF0scD10aGlzLmNvdW50KCksZz0wO2c8b1t0XS5sZW5ndGg7ZysrKXNbdF1bZ109b1t0XVtnXTtmb3IodmFyIGc9MDtnPHA7Zys9ZCl7ZD5wLWcmJihkPXAtZyxoLmxlbmd0aD1kKTtmb3IodmFyIG09MDttPGQ7bSsrKXt2YXIgdj1sW2crbV07aFttXT1mW3ZdLGNbbV09dn12YXIgeT1pKGgpLHY9Y1tuKGgseSl8fDBdO2Zbdl09eSx1LnB1c2godil9cmV0dXJuIGF9LHguZ2V0SXRlbU1vZGVsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaG9zdE1vZGVsO3JldHVybiB0PXRoaXMuaW5kaWNlc1t0XSxuZXcgZCh0aGlzLl9yYXdEYXRhLmdldEl0ZW0odCksZSxlJiZlLmVjTW9kZWwpfSx4LmRpZmY9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl9pZExpc3Qsbj10JiZ0Ll9pZExpc3QsYT0iZVwwXDAiO3JldHVybiBuZXcgZih0P3QuaW5kaWNlczpbXSx0aGlzLmluZGljZXMsZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPShlPW5bdF0pP2U6YSt0fSxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9KGU9aVt0XSk/ZTphK3R9KX0seC5nZXRWaXN1YWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdmlzdWFsO3JldHVybiBlJiZlW3RdfSx4LnNldFZpc3VhbD1mdW5jdGlvbih0LGUpe2lmKG0odCkpZm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmdGhpcy5zZXRWaXN1YWwoaSx0W2ldKTtlbHNlIHRoaXMuX3Zpc3VhbD10aGlzLl92aXN1YWx8fHt9LHRoaXMuX3Zpc3VhbFt0XT1lfSx4LnNldExheW91dD1mdW5jdGlvbih0LGUpe2lmKG0odCkpZm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmdGhpcy5zZXRMYXlvdXQoaSx0W2ldKTtlbHNlIHRoaXMuX2xheW91dFt0XT1lfSx4LmdldExheW91dD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5b3V0W3RdfSx4LmdldEl0ZW1MYXlvdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2l0ZW1MYXlvdXRzW3RdfSx4LnNldEl0ZW1MYXlvdXQ9ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2l0ZW1MYXlvdXRzW3RdPWk/cC5leHRlbmQodGhpcy5faXRlbUxheW91dHNbdF18fHt9LGUpOmV9LHguY2xlYXJJdGVtTGF5b3V0cz1mdW5jdGlvbigpe3RoaXMuX2l0ZW1MYXlvdXRzLmxlbmd0aD0wfSx4LmdldEl0ZW1WaXN1YWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2l0ZW1WaXN1YWxzW3RdLGE9biYmbltlXTtyZXR1cm4gbnVsbCE9YXx8aT9hOnRoaXMuZ2V0VmlzdWFsKGUpfSx4LnNldEl0ZW1WaXN1YWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2l0ZW1WaXN1YWxzW3RdfHx7fTtpZih0aGlzLl9pdGVtVmlzdWFsc1t0XT1uLG0oZSkpZm9yKHZhciBhIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShhKSYmKG5bYV09ZVthXSk7ZWxzZSBuW2VdPWl9LHguY2xlYXJBbGxWaXN1YWw9ZnVuY3Rpb24oKXt0aGlzLl92aXN1YWw9e30sdGhpcy5faXRlbVZpc3VhbHM9W119O3ZhciBfPWZ1bmN0aW9uKHQpe3Quc2VyaWVzSW5kZXg9dGhpcy5zZXJpZXNJbmRleCx0LmRhdGFJbmRleD10aGlzLmRhdGFJbmRleCx0LmRhdGFUeXBlPXRoaXMuZGF0YVR5cGV9O3guc2V0SXRlbUdyYXBoaWNFbD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuaG9zdE1vZGVsO2UmJihlLmRhdGFJbmRleD10LGUuZGF0YVR5cGU9dGhpcy5kYXRhVHlwZSxlLnNlcmllc0luZGV4PWkmJmkuc2VyaWVzSW5kZXgsImdyb3VwIj09PWUudHlwZSYmZS50cmF2ZXJzZShfLGUpKSx0aGlzLl9ncmFwaGljRWxzW3RdPWV9LHguZ2V0SXRlbUdyYXBoaWNFbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ3JhcGhpY0Vsc1t0XX0seC5lYWNoSXRlbUdyYXBoaWNFbD1mdW5jdGlvbih0LGUpe3AuZWFjaCh0aGlzLl9ncmFwaGljRWxzLGZ1bmN0aW9uKGksbil7aSYmdCYmdC5jYWxsKGUsaSxuKX0pfSx4LmNsb25lU2hhbGxvdz1mdW5jdGlvbigpe3ZhciB0PXAubWFwKHRoaXMuZGltZW5zaW9ucyx0aGlzLmdldERpbWVuc2lvbkluZm8sdGhpcyksZT1uZXcgeSh0LHRoaXMuaG9zdE1vZGVsKTtyZXR1cm4gZS5fc3RvcmFnZT10aGlzLl9zdG9yYWdlLG4oZSx0aGlzKSxlLmluZGljZXM9dGhpcy5pbmRpY2VzLnNsaWNlKCksdGhpcy5fZXh0ZW50JiYoZS5fZXh0ZW50PXAuZXh0ZW5kKHt9LHRoaXMuX2V4dGVudCkpLGV9LHgud3JhcE1ldGhvZD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXNbdF07ImZ1bmN0aW9uIj09dHlwZW9mIGkmJih0aGlzLl9fd3JhcHBlZE1ldGhvZHM9dGhpcy5fX3dyYXBwZWRNZXRob2RzfHxbXSx0aGlzLl9fd3JhcHBlZE1ldGhvZHMucHVzaCh0KSx0aGlzW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUuYXBwbHkodGhpcyxbdF0uY29uY2F0KHAuc2xpY2UoYXJndW1lbnRzKSkpfSl9LHguVFJBTlNGRVJBQkxFX01FVEhPRFM9WyJjbG9uZVNoYWxsb3ciLCJkb3duU2FtcGxlIiwibWFwIl0seC5DSEFOR0FCTEVfTUVUSE9EUz1bImZpbHRlclNlbGYiXSx0LmV4cG9ydHM9eX0pLmNhbGwoZSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7ci5hc3NlcnQoL15bYS16QS1aMC05X10rKFsuXVthLXpBLVowLTlfXSspPyQvLnRlc3QodCksJ2NvbXBvbmVudFR5cGUgIicrdCsnIiBpbGxlZ2FsJyl9ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPXIuc2xpY2UoYXJndW1lbnRzLDIpO3JldHVybiB0aGlzLnN1cGVyQ2xhc3MucHJvdG90eXBlW2VdLmFwcGx5KHQsaSl9ZnVuY3Rpb24gbyh0LGUsaSl7cmV0dXJuIHRoaXMuc3VwZXJDbGFzcy5wcm90b3R5cGVbZV0uYXBwbHkodCxpKX12YXIgcj1pKDEpLHM9e30sbD0iLiIsdT0iX19fRUNfX0NPTVBPTkVOVF9fQ09OVEFJTkVSX19fIixoPSJcMGVjX1wwIjtzLnNldD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbaCtlXT1pfSxzLmdldD1mdW5jdGlvbih0LGUpe3JldHVybiB0W2grZV19LHMuaGFzT3duPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoaCtlKX07dmFyIGM9cy5wYXJzZUNsYXNzVHlwZT1mdW5jdGlvbih0KXt2YXIgZT17bWFpbjoiIixzdWI6IiJ9O3JldHVybiB0JiYodD10LnNwbGl0KGwpLGUubWFpbj10WzBdfHwiIixlLnN1Yj10WzFdfHwiIiksZX07cy5lbmFibGVDbGFzc0V4dGVuZD1mdW5jdGlvbih0LGUpe3QuJGNvbnN0cnVjdG9yPXQsdC5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPWZ1bmN0aW9uKCl7dC4kY29uc3RydWN0b3I/dC4kY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gci5leHRlbmQoaS5wcm90b3R5cGUsdCksaS5leHRlbmQ9dGhpcy5leHRlbmQsaS5zdXBlckNhbGw9YSxpLnN1cGVyQXBwbHk9byxyLmluaGVyaXRzKGksdGhpcyksaS5zdXBlckNsYXNzPWUsaX19LHMuZW5hYmxlQ2xhc3NNYW5hZ2VtZW50PWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0KXt2YXIgZT1hW3QubWFpbl07cmV0dXJuIGUmJmVbdV18fChlPWFbdC5tYWluXT17fSxlW3VdPSEwKSxlfWU9ZXx8e307dmFyIGE9e307aWYodC5yZWdpc3RlckNsYXNzPWZ1bmN0aW9uKHQsZSl7aWYoZSlpZihuKGUpLGU9YyhlKSxlLnN1Yil7aWYoZS5zdWIhPT11KXt2YXIgbz1pKGUpO29bZS5zdWJdPXR9fWVsc2UgYVtlLm1haW5dPXQ7cmV0dXJuIHR9LHQuZ2V0Q2xhc3M9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWFbdF07aWYobiYmblt1XSYmKG49ZT9uW2VdOm51bGwpLGkmJiFuKXRocm93IG5ldyBFcnJvcihlPyJDb21wb25lbnQgIit0KyIuIisoZXx8IiIpKyIgbm90IGV4aXN0cy4gTG9hZCBpdCBmaXJzdC4iOnQrIi50eXBlIHNob3VsZCBiZSBzcGVjaWZpZWQuIik7cmV0dXJuIG59LHQuZ2V0Q2xhc3Nlc0J5TWFpblR5cGU9ZnVuY3Rpb24odCl7dD1jKHQpO3ZhciBlPVtdLGk9YVt0Lm1haW5dO3JldHVybiBpJiZpW3VdP3IuZWFjaChpLGZ1bmN0aW9uKHQsaSl7aSE9PXUmJmUucHVzaCh0KX0pOmUucHVzaChpKSxlfSx0Lmhhc0NsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0PWModCksISFhW3QubWFpbl19LHQuZ2V0QWxsQ2xhc3NNYWluVHlwZXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gci5lYWNoKGEsZnVuY3Rpb24oZSxpKXt0LnB1c2goaSl9KSx0fSx0Lmhhc1N1YlR5cGVzPWZ1bmN0aW9uKHQpe3Q9Yyh0KTt2YXIgZT1hW3QubWFpbl07cmV0dXJuIGUmJmVbdV19LHQucGFyc2VDbGFzc1R5cGU9YyxlLnJlZ2lzdGVyV2hlbkV4dGVuZCl7dmFyIG89dC5leHRlbmQ7byYmKHQuZXh0ZW5kPWZ1bmN0aW9uKGUpe3ZhciBpPW8uY2FsbCh0aGlzLGUpO3JldHVybiB0LnJlZ2lzdGVyQ2xhc3MoaSxlLnR5cGUpfSl9cmV0dXJuIHR9LHMuc2V0UmVhZE9ubHk9ZnVuY3Rpb24odCxlKXt9LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe2U9ZXx8QTt2YXIgaT10KyI6IitlO2lmKFNbaV0pcmV0dXJuIFNbaV07Zm9yKHZhciBuPSh0KyIiKS5zcGxpdCgiXG4iKSxhPTAsbz0wLHI9bi5sZW5ndGg7bzxyO28rKylhPU1hdGgubWF4KEQubWVhc3VyZVRleHQobltvXSxlKS53aWR0aCxhKTtyZXR1cm4gTT5JJiYoTT0wLFM9e30pLE0rKyxTW2ldPWEsYX1mdW5jdGlvbiBhKHQsZSxpLG4sYSxzLGwpe3JldHVybiBzP3IodCxlLGksbixhLHMsbCk6byh0LGUsaSxuLGEsbCl9ZnVuY3Rpb24gbyh0LGUsaSxhLG8scil7dmFyIHU9bSh0LGUsbyxyKSxoPW4odCxlKTtvJiYoaCs9b1sxXStvWzNdKTt2YXIgYz11Lm91dGVySGVpZ2h0LGQ9cygwLGgsaSksZj1sKDAsYyxhKSxwPW5ldyBiKGQsZixoLGMpO3JldHVybiBwLmxpbmVIZWlnaHQ9dS5saW5lSGVpZ2h0LHB9ZnVuY3Rpb24gcih0LGUsaSxuLGEsbyxyKXt2YXIgdT12KHQse3JpY2g6byx0cnVuY2F0ZTpyLGZvbnQ6ZSx0ZXh0QWxpZ246aSx0ZXh0UGFkZGluZzphfSksaD11Lm91dGVyV2lkdGgsYz11Lm91dGVySGVpZ2h0LGQ9cygwLGgsaSksZj1sKDAsYyxuKTtyZXR1cm4gbmV3IGIoZCxmLGgsYyl9ZnVuY3Rpb24gcyh0LGUsaSl7cmV0dXJuInJpZ2h0Ij09PWk/dC09ZToiY2VudGVyIj09PWkmJih0LT1lLzIpLHR9ZnVuY3Rpb24gbCh0LGUsaSl7cmV0dXJuIm1pZGRsZSI9PT1pP3QtPWUvMjoiYm90dG9tIj09PWkmJih0LT1lKSx0fWZ1bmN0aW9uIHUodCxlLGkpe3ZhciBuPWUueCxhPWUueSxvPWUuaGVpZ2h0LHI9ZS53aWR0aCxzPW8vMixsPSJsZWZ0Iix1PSJ0b3AiO3N3aXRjaCh0KXtjYXNlImxlZnQiOm4tPWksYSs9cyxsPSJyaWdodCIsdT0ibWlkZGxlIjticmVhaztjYXNlInJpZ2h0IjpuKz1pK3IsYSs9cyx1PSJtaWRkbGUiO2JyZWFrO2Nhc2UidG9wIjpuKz1yLzIsYS09aSxsPSJjZW50ZXIiLHU9ImJvdHRvbSI7YnJlYWs7Y2FzZSJib3R0b20iOm4rPXIvMixhKz1vK2ksbD0iY2VudGVyIjticmVhaztjYXNlImluc2lkZSI6bis9ci8yLGErPXMsbD0iY2VudGVyIix1PSJtaWRkbGUiO2JyZWFrO2Nhc2UiaW5zaWRlTGVmdCI6bis9aSxhKz1zLHU9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVSaWdodCI6bis9ci1pLGErPXMsbD0icmlnaHQiLHU9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVUb3AiOm4rPXIvMixhKz1pLGw9ImNlbnRlciI7YnJlYWs7Y2FzZSJpbnNpZGVCb3R0b20iOm4rPXIvMixhKz1vLWksbD0iY2VudGVyIix1PSJib3R0b20iO2JyZWFrO2Nhc2UiaW5zaWRlVG9wTGVmdCI6bis9aSxhKz1pO2JyZWFrO2Nhc2UiaW5zaWRlVG9wUmlnaHQiOm4rPXItaSxhKz1pLGw9InJpZ2h0IjticmVhaztjYXNlImluc2lkZUJvdHRvbUxlZnQiOm4rPWksYSs9by1pLHU9ImJvdHRvbSI7YnJlYWs7Y2FzZSJpbnNpZGVCb3R0b21SaWdodCI6bis9ci1pLGErPW8taSxsPSJyaWdodCIsdT0iYm90dG9tIn1yZXR1cm57eDpuLHk6YSx0ZXh0QWxpZ246bCx0ZXh0VmVydGljYWxBbGlnbjp1fX1mdW5jdGlvbiBoKHQsZSxpLG4sYSl7aWYoIWUpcmV0dXJuIiI7dmFyIG89KHQrIiIpLnNwbGl0KCJcbiIpO2E9YyhlLGksbixhKTtmb3IodmFyIHI9MCxzPW8ubGVuZ3RoO3I8cztyKyspb1tyXT1kKG9bcl0sYSk7cmV0dXJuIG8uam9pbigiXG4iKX1mdW5jdGlvbiBjKHQsZSxpLGEpe2E9Xy5leHRlbmQoe30sYSksYS5mb250PWU7dmFyIGk9QyhpLCIuLi4iKTthLm1heEl0ZXJhdGlvbnM9QyhhLm1heEl0ZXJhdGlvbnMsMik7dmFyIG89YS5taW5DaGFyPUMoYS5taW5DaGFyLDApO2EuY25DaGFyV2lkdGg9bigi5Zu9IixlKTt2YXIgcj1hLmFzY0NoYXJXaWR0aD1uKCJhIixlKTthLnBsYWNlaG9sZGVyPUMoYS5wbGFjZWhvbGRlciwiIik7Zm9yKHZhciBzPXQ9TWF0aC5tYXgoMCx0LTEpLGw9MDtsPG8mJnM+PXI7bCsrKXMtPXI7dmFyIHU9bihpKTtyZXR1cm4gdT5zJiYoaT0iIix1PTApLHM9dC11LGEuZWxsaXBzaXM9aSxhLmVsbGlwc2lzV2lkdGg9dSxhLmNvbnRlbnRXaWR0aD1zLGEuY29udGFpbmVyV2lkdGg9dCxhfWZ1bmN0aW9uIGQodCxlKXt2YXIgaT1lLmNvbnRhaW5lcldpZHRoLGE9ZS5mb250LG89ZS5jb250ZW50V2lkdGg7aWYoIWkpcmV0dXJuIiI7dmFyIHI9bih0LGEpO2lmKHI8PWkpcmV0dXJuIHQ7Zm9yKHZhciBzPTA7O3MrKyl7aWYocjw9b3x8cz49ZS5tYXhJdGVyYXRpb25zKXt0Kz1lLmVsbGlwc2lzO2JyZWFrfXZhciBsPTA9PT1zP2YodCxvLGUuYXNjQ2hhcldpZHRoLGUuY25DaGFyV2lkdGgpOnI+MD9NYXRoLmZsb29yKHQubGVuZ3RoKm8vcik6MDt0PXQuc3Vic3RyKDAsbCkscj1uKHQsYSl9cmV0dXJuIiI9PT10JiYodD1lLnBsYWNlaG9sZGVyKSx0fWZ1bmN0aW9uIGYodCxlLGksbil7Zm9yKHZhciBhPTAsbz0wLHI9dC5sZW5ndGg7bzxyJiZhPGU7bysrKXt2YXIgcz10LmNoYXJDb2RlQXQobyk7YSs9MDw9cyYmczw9MTI3P2k6bn1yZXR1cm4gb31mdW5jdGlvbiBwKHQpe3JldHVybiBuKCLlm70iLHQpfWZ1bmN0aW9uIGcodCxlKXt2YXIgaT1fLmdldENvbnRleHQoKTtyZXR1cm4gaS5mb250PWV8fEEsaS5tZWFzdXJlVGV4dCh0KX1mdW5jdGlvbiBtKHQsZSxpLG4pe251bGwhPXQmJih0Kz0iIik7dmFyIGE9cChlKSxvPXQ/dC5zcGxpdCgiXG4iKTpbXSxyPW8ubGVuZ3RoKmEscz1yO2lmKGkmJihzKz1pWzBdK2lbMl0pLHQmJm4pe3ZhciBsPW4ub3V0ZXJIZWlnaHQsdT1uLm91dGVyV2lkdGg7aWYobnVsbCE9bCYmcz5sKXQ9IiIsbz1bXTtlbHNlIGlmKG51bGwhPXUpZm9yKHZhciBoPWModS0oaT9pWzFdK2lbM106MCksZSxuLmVsbGlwc2lzLHttaW5DaGFyOm4ubWluQ2hhcixwbGFjZWhvbGRlcjpuLnBsYWNlaG9sZGVyfSksZj0wLGc9by5sZW5ndGg7ZjxnO2YrKylvW2ZdPWQob1tmXSxoKX1yZXR1cm57bGluZXM6byxoZWlnaHQ6cixvdXRlckhlaWdodDpzLGxpbmVIZWlnaHQ6YX19ZnVuY3Rpb24gdih0LGUpe3ZhciBpPXtsaW5lczpbXSx3aWR0aDowLGhlaWdodDowfTtpZihudWxsIT10JiYodCs9IiIpLCF0KXJldHVybiBpO2Zvcih2YXIgbixhPVQubGFzdEluZGV4PTA7bnVsbCE9KG49VC5leGVjKHQpKTspe3ZhciBvPW4uaW5kZXg7bz5hJiZ5KGksdC5zdWJzdHJpbmcoYSxvKSkseShpLG5bMl0sblsxXSksYT1ULmxhc3RJbmRleH1hPHQubGVuZ3RoJiZ5KGksdC5zdWJzdHJpbmcoYSx0Lmxlbmd0aCkpO3ZhciByPWkubGluZXMscz0wLGw9MCx1PVtdLGM9ZS50ZXh0UGFkZGluZyxkPWUudHJ1bmNhdGUsZj1kJiZkLm91dGVyV2lkdGgscD1kJiZkLm91dGVySGVpZ2h0O2MmJihudWxsIT1mJiYoZi09Y1sxXStjWzNdKSxudWxsIT1wJiYocC09Y1swXStjWzJdKSk7Zm9yKHZhciBnPTA7ZzxyLmxlbmd0aDtnKyspe2Zvcih2YXIgbT1yW2ddLHY9MCx4PTAsXz0wO188bS50b2tlbnMubGVuZ3RoO18rKyl7dmFyIGI9bS50b2tlbnNbX10sUz1iLnN0eWxlTmFtZSYmZS5yaWNoW2Iuc3R5bGVOYW1lXXx8e30sTT1iLnRleHRQYWRkaW5nPVMudGV4dFBhZGRpbmcsST1iLmZvbnQ9Uy5mb250fHxlLmZvbnQsQT1iLnRleHRIZWlnaHQ9QyhTLnRleHRIZWlnaHQsRC5nZXRMaW5lSGVpZ2h0KEkpKTtpZihNJiYoQSs9TVswXStNWzJdKSxiLmhlaWdodD1BLGIubGluZUhlaWdodD1MKFMudGV4dExpbmVIZWlnaHQsZS50ZXh0TGluZUhlaWdodCxBKSxiLnRleHRBbGlnbj1TJiZTLnRleHRBbGlnbnx8ZS50ZXh0QWxpZ24sYi50ZXh0VmVydGljYWxBbGlnbj1TJiZTLnRleHRWZXJ0aWNhbEFsaWdufHwibWlkZGxlIixudWxsIT1wJiZzK2IubGluZUhlaWdodD5wKXJldHVybntsaW5lczpbXSx3aWR0aDowLGhlaWdodDowfTtiLnRleHRXaWR0aD1ELmdldFdpZHRoKGIudGV4dCxJKTt2YXIgUD1TLnRleHRXaWR0aCxrPW51bGw9PVB8fCJhdXRvIj09PVA7aWYoInN0cmluZyI9PXR5cGVvZiBQJiYiJSI9PT1QLmNoYXJBdChQLmxlbmd0aC0xKSliLnBlcmNlbnRXaWR0aD1QLHUucHVzaChiKSxQPTA7ZWxzZXtpZihrKXtQPWIudGV4dFdpZHRoO3ZhciBPPVMudGV4dEJhY2tncm91bmRDb2xvcix6PU8mJk8uaW1hZ2U7eiYmKHo9dy5maW5kRXhpc3RJbWFnZSh6KSx3LmlzSW1hZ2VSZWFkeSh6KSYmKFA9TWF0aC5tYXgoUCx6LndpZHRoKkEvei5oZWlnaHQpKSl9dmFyIFI9TT9NWzFdK01bM106MDtQKz1SO3ZhciBFPW51bGwhPWY/Zi14Om51bGw7bnVsbCE9RSYmRTxQJiYoIWt8fEU8Uj8oYi50ZXh0PSIiLGIudGV4dFdpZHRoPVA9MCk6KGIudGV4dD1oKGIudGV4dCxFLVIsSSxkLmVsbGlwc2lzLHttaW5DaGFyOmQubWluQ2hhcn0pLGIudGV4dFdpZHRoPUQuZ2V0V2lkdGgoYi50ZXh0LEkpLFA9Yi50ZXh0V2lkdGgrUikpfXgrPWIud2lkdGg9UCxTJiYodj1NYXRoLm1heCh2LGIubGluZUhlaWdodCkpfW0ud2lkdGg9eCxtLmxpbmVIZWlnaHQ9dixzKz12LGw9TWF0aC5tYXgobCx4KX1pLm91dGVyV2lkdGg9aS53aWR0aD1DKGUudGV4dFdpZHRoLGwpLGkub3V0ZXJIZWlnaHQ9aS5oZWlnaHQ9QyhlLnRleHRIZWlnaHQscyksYyYmKGkub3V0ZXJXaWR0aCs9Y1sxXStjWzNdLGkub3V0ZXJIZWlnaHQrPWNbMF0rY1syXSk7Zm9yKHZhciBnPTA7Zzx1Lmxlbmd0aDtnKyspe3ZhciBiPXVbZ10sTj1iLnBlcmNlbnRXaWR0aDtiLndpZHRoPXBhcnNlSW50KE4sMTApLzEwMCpsfXJldHVybiBpfWZ1bmN0aW9uIHkodCxlLGkpe2Zvcih2YXIgbj0iIj09PWUsYT1lLnNwbGl0KCJcbiIpLG89dC5saW5lcyxyPTA7cjxhLmxlbmd0aDtyKyspe3ZhciBzPWFbcl0sbD17c3R5bGVOYW1lOmksdGV4dDpzLGlzTGluZUhvbGRlcjohcyYmIW59O2lmKHIpby5wdXNoKHt0b2tlbnM6W2xdfSk7ZWxzZXt2YXIgdT0ob1tvLmxlbmd0aC0xXXx8KG9bMF09e3Rva2VuczpbXX0pKS50b2tlbnMsaD11Lmxlbmd0aDsxPT09aCYmdVswXS5pc0xpbmVIb2xkZXI/dVswXT1sOihzfHwhaHx8bikmJnUucHVzaChsKX19fWZ1bmN0aW9uIHgodCl7cmV0dXJuKHQuZm9udFNpemV8fHQuZm9udEZhbWlseSkmJlt0LmZvbnRTdHlsZSx0LmZvbnRXZWlnaHQsKHQuZm9udFNpemV8fDEyKSsicHgiLHQuZm9udEZhbWlseXx8InNhbnMtc2VyaWYiXS5qb2luKCIgIil8fHQudGV4dEZvbnR8fHQuZm9udH12YXIgXz1pKDEpLGI9aSgxMiksdz1pKDUzKSxTPXt9LE09MCxJPTVlMyxUPS9ceyhbYS16QS1aMC05X10rKVx8KFtefV0qKVx9L2csQT0iMTJweCBzYW5zLXNlcmlmIixDPV8ucmV0cmlldmUyLEw9Xy5yZXRyaWV2ZTMsRD17Z2V0V2lkdGg6bixnZXRCb3VuZGluZ1JlY3Q6YSxhZGp1c3RUZXh0UG9zaXRpb25PblJlY3Q6dSx0cnVuY2F0ZVRleHQ6aCxtZWFzdXJlVGV4dDpnLGdldExpbmVIZWlnaHQ6cCxwYXJzZVBsYWluVGV4dDptLHBhcnNlUmljaFRleHQ6dixhZGp1c3RUZXh0WDpzLGFkanVzdFRleHRZOmwsbWFrZUZvbnQ6eCxERUZBVUxUX0ZPTlQ6QX07dC5leHBvcnRzPUR9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgxKSxhPWkoNyksbz1pKDE1KSxyPWkoNSkscz1pKDEzKSxsPWkoNjUpLHU9aSgxMCksaD1pKDkpLGM9by5zZXQsZD1vLmdldCxmPWEuZW5jb2RlSFRNTCxwPWEuYWRkQ29tbWFzLGc9cy5leHRlbmQoe3R5cGU6InNlcmllcy5fX2Jhc2VfXyIsc2VyaWVzSW5kZXg6MCxjb29yZGluYXRlU3lzdGVtOm51bGwsZGVmYXVsdE9wdGlvbjpudWxsLGxlZ2VuZERhdGFQcm92aWRlcjpudWxsLHZpc3VhbENvbG9yQWNjZXNzUGF0aDoiaXRlbVN0eWxlLm5vcm1hbC5jb2xvciIsbGF5b3V0TW9kZTpudWxsLGluaXQ6ZnVuY3Rpb24odCxlLGksbil7dGhpcy5zZXJpZXNJbmRleD10aGlzLmNvbXBvbmVudEluZGV4LHRoaXMubWVyZ2VEZWZhdWx0QW5kVGhlbWUodCxpKTt2YXIgYT10aGlzLmdldEluaXRpYWxEYXRhKHQsaSk7Yyh0aGlzLCJkYXRhQmVmb3JlUHJvY2Vzc2VkIixhKSx0aGlzLnJlc3RvcmVEYXRhKCl9LG1lcmdlRGVmYXVsdEFuZFRoZW1lOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5sYXlvdXRNb2RlLGE9aT9oLmdldExheW91dFBhcmFtcyh0KTp7fSxvPXRoaXMuc3ViVHlwZTtzLmhhc0NsYXNzKG8pJiYobys9IlNlcmllcyIpLG4ubWVyZ2UodCxlLmdldFRoZW1lKCkuZ2V0KHRoaXMuc3ViVHlwZSkpLG4ubWVyZ2UodCx0aGlzLmdldERlZmF1bHRPcHRpb24oKSksci5kZWZhdWx0RW1waGFzaXModC5sYWJlbCxbInNob3ciXSksdGhpcy5maWxsRGF0YVRleHRTdHlsZSh0LmRhdGEpLGkmJmgubWVyZ2VMYXlvdXRQYXJhbSh0LGEsaSl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQsZSl7dD1uLm1lcmdlKHRoaXMub3B0aW9uLHQsITApLHRoaXMuZmlsbERhdGFUZXh0U3R5bGUodC5kYXRhKTt2YXIgaT10aGlzLmxheW91dE1vZGU7aSYmaC5tZXJnZUxheW91dFBhcmFtKHRoaXMub3B0aW9uLHQsaSk7dmFyIGE9dGhpcy5nZXRJbml0aWFsRGF0YSh0LGUpO2EmJihjKHRoaXMsImRhdGEiLGEpLGModGhpcywiZGF0YUJlZm9yZVByb2Nlc3NlZCIsYS5jbG9uZVNoYWxsb3coKSkpfSxmaWxsRGF0YVRleHRTdHlsZTpmdW5jdGlvbih0KXtpZih0KWZvcih2YXIgZT1bInNob3ciXSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXSYmdFtpXS5sYWJlbCYmci5kZWZhdWx0RW1waGFzaXModFtpXS5sYWJlbCxlKX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24oKXt9LGdldERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9ZCh0aGlzLCJkYXRhIik7cmV0dXJuIG51bGw9PXQ/ZTplLmdldExpbmtlZERhdGEodCl9LHNldERhdGE6ZnVuY3Rpb24odCl7Yyh0aGlzLCJkYXRhIix0KX0sZ2V0UmF3RGF0YTpmdW5jdGlvbigpe3JldHVybiBkKHRoaXMsImRhdGFCZWZvcmVQcm9jZXNzZWQiKX0sY29vcmREaW1Ub0RhdGFEaW06ZnVuY3Rpb24odCl7cmV0dXJuIHIuY29vcmREaW1Ub0RhdGFEaW0odGhpcy5nZXREYXRhKCksdCl9LGRhdGFEaW1Ub0Nvb3JkRGltOmZ1bmN0aW9uKHQpe3JldHVybiByLmRhdGFEaW1Ub0Nvb3JkRGltKHRoaXMuZ2V0RGF0YSgpLHQpfSxnZXRCYXNlQXhpczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29vcmRpbmF0ZVN5c3RlbTtyZXR1cm4gdCYmdC5nZXRCYXNlQXhpcyYmdC5nZXRCYXNlQXhpcygpfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKGkpe2Z1bmN0aW9uIG8odCxpKXt2YXIgbj1zLmdldERpbWVuc2lvbkluZm8oaSk7aWYobiYmbi5vdGhlckRpbXMudG9vbHRpcCE9PSExKXt2YXIgbz1uLnR5cGUscj0obD8iLSAiKyhuLnRvb2x0aXBOYW1lfHxuLm5hbWUpKyI6ICI6IiIpKygib3JkaW5hbCI9PT1vP3QrIiI6InRpbWUiPT09bz9lPyIiOmEuZm9ybWF0VGltZSgieXl5eS9NTS9kZCBoaDptbTpzcyIsdCk6cCh0KSk7ciYmdS5wdXNoKGYocikpfX12YXIgbD1uLnJlZHVjZShpLGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1zLmdldERpbWVuc2lvbkluZm8oaSk7cmV0dXJuIHR8PW4mJm4udG9vbHRpcCE9PSExJiZudWxsIT1uLnRvb2x0aXBOYW1lfSwwKSx1PVtdLGg9ci5vdGhlckRpbVRvRGF0YURpbShzLCJ0b29sdGlwIik7cmV0dXJuIGgubGVuZ3RoP24uZWFjaChoLGZ1bmN0aW9uKGUpe28ocy5nZXQoZSx0KSxlKX0pOm4uZWFjaChpLG8pLChsPyI8YnIvPiI6IiIpK3Uuam9pbihsPyI8YnIvPiI6IiwgIil9dmFyIHM9ZCh0aGlzLCJkYXRhIiksbD10aGlzLmdldFJhd1ZhbHVlKHQpLHU9bi5pc0FycmF5KGwpP28obCk6ZihwKGwpKSxoPXMuZ2V0TmFtZSh0KSxjPXMuZ2V0SXRlbVZpc3VhbCh0LCJjb2xvciIpO24uaXNPYmplY3QoYykmJmMuY29sb3JTdG9wcyYmKGM9KGMuY29sb3JTdG9wc1swXXx8e30pLmNvbG9yKSxjPWN8fCJ0cmFuc3BhcmVudCI7dmFyIGc9YS5nZXRUb29sdGlwTWFya2VyKGMpLG09dGhpcy5uYW1lO3JldHVybiJcMC0iPT09bSYmKG09IiIpLG09bT9mKG0pKyhlPyI6ICI6Ijxici8+Iik6IiIsZT9nK20rdTptK2crKGg/ZihoKSsiOiAiK3U6dSl9LGlzQW5pbWF0aW9uRW5hYmxlZDpmdW5jdGlvbigpe2lmKHUubm9kZSlyZXR1cm4hMTt2YXIgdD10aGlzLmdldFNoYWxsb3coImFuaW1hdGlvbiIpO3JldHVybiB0JiZ0aGlzLmdldERhdGEoKS5jb3VudCgpPnRoaXMuZ2V0U2hhbGxvdygiYW5pbWF0aW9uVGhyZXNob2xkIikmJih0PSExKSx0fSxyZXN0b3JlRGF0YTpmdW5jdGlvbigpe2ModGhpcywiZGF0YSIsZCh0aGlzLCJkYXRhQmVmb3JlUHJvY2Vzc2VkIikuY2xvbmVTaGFsbG93KCkpfSxnZXRDb2xvckZyb21QYWxldHRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5lY01vZGVsLG49bC5nZXRDb2xvckZyb21QYWxldHRlLmNhbGwodGhpcyx0LGUpO3JldHVybiBufHwobj1pLmdldENvbG9yRnJvbVBhbGV0dGUodCxlKSksbn0sZ2V0QXhpc1Rvb2x0aXBEYXRhOm51bGwsZ2V0VG9vbHRpcFBvc2l0aW9uOm51bGx9KTtuLm1peGluKGcsci5kYXRhRm9ybWF0TWl4aW4pLG4ubWl4aW4oZyxsKSx0LmV4cG9ydHM9Z30sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTU2KSxhPWkoNDUpO2koMTU3KSxpKDE1NSk7dmFyIG89aSgzNCkscj1pKDQpLHM9aSgxKSxsPWkoMTYpLHU9e307dS5nZXRTY2FsZUV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciBpLG4sYSxvPXQudHlwZSxsPWUuZ2V0TWluKCksdT1lLmdldE1heCgpLGg9bnVsbCE9bCxjPW51bGwhPXUsZD10LmdldEV4dGVudCgpO3JldHVybiJvcmRpbmFsIj09PW8/aT0oZS5nZXQoImRhdGEiKXx8W10pLmxlbmd0aDoobj1lLmdldCgiYm91bmRhcnlHYXAiKSxzLmlzQXJyYXkobil8fChuPVtufHwwLG58fDBdKSwiYm9vbGVhbiI9PXR5cGVvZiBuWzBdJiYobj1bMCwwXSksblswXT1yLnBhcnNlUGVyY2VudChuWzBdLDEpLG5bMV09ci5wYXJzZVBlcmNlbnQoblsxXSwxKSxhPWRbMV0tZFswXXx8TWF0aC5hYnMoZFswXSkpLG51bGw9PWwmJihsPSJvcmRpbmFsIj09PW8/aT8wOk5hTjpkWzBdLW5bMF0qYSksbnVsbD09dSYmKHU9Im9yZGluYWwiPT09bz9pP2ktMTpOYU46ZFsxXStuWzFdKmEpLCJkYXRhTWluIj09PWw/bD1kWzBdOiJmdW5jdGlvbiI9PXR5cGVvZiBsJiYobD1sKHttaW46ZFswXSxtYXg6ZFsxXX0pKSwiZGF0YU1heCI9PT11P3U9ZFsxXToiZnVuY3Rpb24iPT10eXBlb2YgdSYmKHU9dSh7bWluOmRbMF0sbWF4OmRbMV19KSksKG51bGw9PWx8fCFpc0Zpbml0ZShsKSkmJihsPU5hTiksKG51bGw9PXV8fCFpc0Zpbml0ZSh1KSkmJih1PU5hTiksdC5zZXRCbGFuayhzLmVxTmFOKGwpfHxzLmVxTmFOKHUpKSxlLmdldE5lZWRDcm9zc1plcm8oKSYmKGw+MCYmdT4wJiYhaCYmKGw9MCksbDwwJiZ1PDAmJiFjJiYodT0wKSksW2wsdV19LHUubmljZVNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dS5nZXRTY2FsZUV4dGVudCh0LGUpLG49bnVsbCE9ZS5nZXRNaW4oKSxhPW51bGwhPWUuZ2V0TWF4KCksbz1lLmdldCgic3BsaXROdW1iZXIiKTsibG9nIj09PXQudHlwZSYmKHQuYmFzZT1lLmdldCgibG9nQmFzZSIpKTt2YXIgcj10LnR5cGU7dC5zZXRFeHRlbnQoaVswXSxpWzFdKSx0Lm5pY2VFeHRlbnQoe3NwbGl0TnVtYmVyOm8sZml4TWluOm4sZml4TWF4OmEsbWluSW50ZXJ2YWw6ImludGVydmFsIj09PXJ8fCJ0aW1lIj09PXI/ZS5nZXQoIm1pbkludGVydmFsIik6bnVsbCxtYXhJbnRlcnZhbDoiaW50ZXJ2YWwiPT09cnx8InRpbWUiPT09cj9lLmdldCgibWF4SW50ZXJ2YWwiKTpudWxsfSk7dmFyIHM9ZS5nZXQoImludGVydmFsIik7bnVsbCE9cyYmdC5zZXRJbnRlcnZhbCYmdC5zZXRJbnRlcnZhbChzKX0sdS5jcmVhdGVTY2FsZUJ5TW9kZWw9ZnVuY3Rpb24odCxlKXtpZihlPWV8fHQuZ2V0KCJ0eXBlIikpc3dpdGNoKGUpe2Nhc2UiY2F0ZWdvcnkiOnJldHVybiBuZXcgbih0LmdldENhdGVnb3JpZXMoKSxbMS8wLC0oMS8wKV0pO2Nhc2UidmFsdWUiOnJldHVybiBuZXcgYTtkZWZhdWx0OnJldHVybihvLmdldENsYXNzKGUpfHxhKS5jcmVhdGUodCl9fSx1LmlmQXhpc0Nyb3NzWmVybz1mdW5jdGlvbih0KXt2YXIgZT10LnNjYWxlLmdldEV4dGVudCgpLGk9ZVswXSxuPWVbMV07cmV0dXJuIShpPjAmJm4+MHx8aTwwJiZuPDApfSx1LmdldEF4aXNMYWJlbEludGVydmFsPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhLG89MCxyPTAscz0xO2UubGVuZ3RoPjQwJiYocz1NYXRoLmZsb29yKGUubGVuZ3RoLzQwKSk7Zm9yKHZhciB1PTA7dTx0Lmxlbmd0aDt1Kz1zKXt2YXIgaD10W3VdLGM9bC5nZXRCb3VuZGluZ1JlY3QoZVt1XSxpLCJjZW50ZXIiLCJ0b3AiKTtjW24/IngiOiJ5Il0rPWgsY1tuPyJ3aWR0aCI6ImhlaWdodCJdKj0xLjMsYT9hLmludGVyc2VjdChjKT8ocisrLG89TWF0aC5tYXgobyxyKSk6KGEudW5pb24oYykscj0wKTphPWMuY2xvbmUoKX1yZXR1cm4gMD09PW8mJnM+MT9zOihvKzEpKnMtMX0sdS5nZXRGb3JtYXR0ZWRMYWJlbHM9ZnVuY3Rpb24odCxlKXt2YXIgaT10LnNjYWxlLG49aS5nZXRUaWNrc0xhYmVscygpLGE9aS5nZXRUaWNrcygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT8oZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVwbGFjZSgie3ZhbHVlfSIsbnVsbCE9ZT9lOiIiKX19KGUpLHMubWFwKG4sZSkpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3MubWFwKGEsZnVuY3Rpb24oaSxuKXtyZXR1cm4gZSh1LmdldEF4aXNSYXdWYWx1ZSh0LGkpLG4pfSx0aGlzKTpufSx1LmdldEF4aXNSYXdWYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiJjYXRlZ29yeSI9PT10LnR5cGU/dC5zY2FsZS5nZXRMYWJlbChlKTplfSx0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlKXt2YXIgaT0idW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0MzJBcnJheT9BcnJheTpGbG9hdDMyQXJyYXksbj17Y3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGkoNik7cmV0dXJuIG4uaWRlbnRpdHkodCksdH0saWRlbnRpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0WzRdPTAsdFs1XT0wLHR9LGNvcHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdH0sbXVsOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lWzBdKmlbMF0rZVsyXSppWzFdLGE9ZVsxXSppWzBdK2VbM10qaVsxXSxvPWVbMF0qaVsyXStlWzJdKmlbM10scj1lWzFdKmlbMl0rZVszXSppWzNdLHM9ZVswXSppWzRdK2VbMl0qaVs1XStlWzRdLGw9ZVsxXSppWzRdK2VbM10qaVs1XStlWzVdO3JldHVybiB0WzBdPW4sdFsxXT1hLHRbMl09byx0WzNdPXIsdFs0XT1zLHRbNV09bCx0fSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdK2lbMF0sdFs1XT1lWzVdK2lbMV0sdH0scm90YXRlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lWzBdLGE9ZVsyXSxvPWVbNF0scj1lWzFdLHM9ZVszXSxsPWVbNV0sdT1NYXRoLnNpbihpKSxoPU1hdGguY29zKGkpO3JldHVybiB0WzBdPW4qaCtyKnUsdFsxXT0tbip1K3IqaCx0WzJdPWEqaCtzKnUsdFszXT0tYSp1K2gqcyx0WzRdPWgqbyt1KmwsdFs1XT1oKmwtdSpvLHR9LHNjYWxlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pWzBdLGE9aVsxXTtyZXR1cm4gdFswXT1lWzBdKm4sdFsxXT1lWzFdKmEsdFsyXT1lWzJdKm4sdFszXT1lWzNdKmEsdFs0XT1lWzRdKm4sdFs1XT1lWzVdKmEsdH0saW52ZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZVswXSxuPWVbMl0sYT1lWzRdLG89ZVsxXSxyPWVbM10scz1lWzVdLGw9aSpyLW8qbjtyZXR1cm4gbD8obD0xL2wsdFswXT1yKmwsdFsxXT0tbypsLHRbMl09LW4qbCx0WzNdPWkqbCx0WzRdPShuKnMtciphKSpsLHRbNV09KG8qYS1pKnMpKmwsdCk6bnVsbH19O3QuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ+LXcmJnQ8dzsKfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHQ+d3x8dDwtd31mdW5jdGlvbiBvKHQsZSxpLG4sYSl7dmFyIG89MS1hO3JldHVybiBvKm8qKG8qdCszKmEqZSkrYSphKihhKm4rMypvKmkpfWZ1bmN0aW9uIHIodCxlLGksbixhKXt2YXIgbz0xLWE7cmV0dXJuIDMqKCgoZS10KSpvKzIqKGktZSkqYSkqbysobi1pKSphKmEpfWZ1bmN0aW9uIHModCxlLGksYSxvLHIpe3ZhciBzPWErMyooZS1pKS10LGw9MyooaS0yKmUrdCksdT0zKihlLXQpLGg9dC1vLGM9bCpsLTMqcyp1LGQ9bCp1LTkqcypoLGY9dSp1LTMqbCpoLHA9MDtpZihuKGMpJiZuKGQpKWlmKG4obCkpclswXT0wO2Vsc2V7dmFyIGc9LXUvbDtnPj0wJiZnPD0xJiYocltwKytdPWcpfWVsc2V7dmFyIG09ZCpkLTQqYypmO2lmKG4obSkpe3ZhciB2PWQvYyxnPS1sL3Mrdix5PS12LzI7Zz49MCYmZzw9MSYmKHJbcCsrXT1nKSx5Pj0wJiZ5PD0xJiYocltwKytdPXkpfWVsc2UgaWYobT4wKXt2YXIgeD1iKG0pLHc9YypsKzEuNSpzKigtZCt4KSxTPWMqbCsxLjUqcyooLWQteCk7dz13PDA/LV8oLXcsSSk6Xyh3LEkpLFM9UzwwPy1fKC1TLEkpOl8oUyxJKTt2YXIgZz0oLWwtKHcrUykpLygzKnMpO2c+PTAmJmc8PTEmJihyW3ArK109Zyl9ZWxzZXt2YXIgVD0oMipjKmwtMypzKmQpLygyKmIoYypjKmMpKSxBPU1hdGguYWNvcyhUKS8zLEM9YihjKSxMPU1hdGguY29zKEEpLGc9KC1sLTIqQypMKS8oMypzKSx5PSgtbCtDKihMK00qTWF0aC5zaW4oQSkpKS8oMypzKSxEPSgtbCtDKihMLU0qTWF0aC5zaW4oQSkpKS8oMypzKTtnPj0wJiZnPD0xJiYocltwKytdPWcpLHk+PTAmJnk8PTEmJihyW3ArK109eSksRD49MCYmRDw9MSYmKHJbcCsrXT1EKX19cmV0dXJuIHB9ZnVuY3Rpb24gbCh0LGUsaSxvLHIpe3ZhciBzPTYqaS0xMiplKzYqdCxsPTkqZSszKm8tMyp0LTkqaSx1PTMqZS0zKnQsaD0wO2lmKG4obCkpe2lmKGEocykpe3ZhciBjPS11L3M7Yz49MCYmYzw9MSYmKHJbaCsrXT1jKX19ZWxzZXt2YXIgZD1zKnMtNCpsKnU7aWYobihkKSlyWzBdPS1zLygyKmwpO2Vsc2UgaWYoZD4wKXt2YXIgZj1iKGQpLGM9KC1zK2YpLygyKmwpLHA9KC1zLWYpLygyKmwpO2M+PTAmJmM8PTEmJihyW2grK109YykscD49MCYmcDw9MSYmKHJbaCsrXT1wKX19cmV0dXJuIGh9ZnVuY3Rpb24gdSh0LGUsaSxuLGEsbyl7dmFyIHI9KGUtdCkqYSt0LHM9KGktZSkqYStlLGw9KG4taSkqYStpLHU9KHMtcikqYStyLGg9KGwtcykqYStzLGM9KGgtdSkqYSt1O29bMF09dCxvWzFdPXIsb1syXT11LG9bM109YyxvWzRdPWMsb1s1XT1oLG9bNl09bCxvWzddPW59ZnVuY3Rpb24gaCh0LGUsaSxuLGEscixzLGwsdSxoLGMpe3ZhciBkLGYscCxnLG0sdj0uMDA1LHk9MS8wO1RbMF09dSxUWzFdPWg7Zm9yKHZhciBfPTA7XzwxO18rPS4wNSlBWzBdPW8odCxpLGEscyxfKSxBWzFdPW8oZSxuLHIsbCxfKSxnPXgoVCxBKSxnPHkmJihkPV8seT1nKTt5PTEvMDtmb3IodmFyIHc9MDt3PDMyJiYhKHY8Uyk7dysrKWY9ZC12LHA9ZCt2LEFbMF09byh0LGksYSxzLGYpLEFbMV09byhlLG4scixsLGYpLGc9eChBLFQpLGY+PTAmJmc8eT8oZD1mLHk9Zyk6KENbMF09byh0LGksYSxzLHApLENbMV09byhlLG4scixsLHApLG09eChDLFQpLHA8PTEmJm08eT8oZD1wLHk9bSk6dio9LjUpO3JldHVybiBjJiYoY1swXT1vKHQsaSxhLHMsZCksY1sxXT1vKGUsbixyLGwsZCkpLGIoeSl9ZnVuY3Rpb24gYyh0LGUsaSxuKXt2YXIgYT0xLW47cmV0dXJuIGEqKGEqdCsyKm4qZSkrbipuKml9ZnVuY3Rpb24gZCh0LGUsaSxuKXtyZXR1cm4gMiooKDEtbikqKGUtdCkrbiooaS1lKSl9ZnVuY3Rpb24gZih0LGUsaSxvLHIpe3ZhciBzPXQtMiplK2ksbD0yKihlLXQpLHU9dC1vLGg9MDtpZihuKHMpKXtpZihhKGwpKXt2YXIgYz0tdS9sO2M+PTAmJmM8PTEmJihyW2grK109Yyl9fWVsc2V7dmFyIGQ9bCpsLTQqcyp1O2lmKG4oZCkpe3ZhciBjPS1sLygyKnMpO2M+PTAmJmM8PTEmJihyW2grK109Yyl9ZWxzZSBpZihkPjApe3ZhciBmPWIoZCksYz0oLWwrZikvKDIqcykscD0oLWwtZikvKDIqcyk7Yz49MCYmYzw9MSYmKHJbaCsrXT1jKSxwPj0wJiZwPD0xJiYocltoKytdPXApfX1yZXR1cm4gaH1mdW5jdGlvbiBwKHQsZSxpKXt2YXIgbj10K2ktMiplO3JldHVybiAwPT09bj8uNToodC1lKS9ufWZ1bmN0aW9uIGcodCxlLGksbixhKXt2YXIgbz0oZS10KSpuK3Qscj0oaS1lKSpuK2Uscz0oci1vKSpuK287YVswXT10LGFbMV09byxhWzJdPXMsYVszXT1zLGFbNF09cixhWzVdPWl9ZnVuY3Rpb24gbSh0LGUsaSxuLGEsbyxyLHMsbCl7dmFyIHUsaD0uMDA1LGQ9MS8wO1RbMF09cixUWzFdPXM7Zm9yKHZhciBmPTA7ZjwxO2YrPS4wNSl7QVswXT1jKHQsaSxhLGYpLEFbMV09YyhlLG4sbyxmKTt2YXIgcD14KFQsQSk7cDxkJiYodT1mLGQ9cCl9ZD0xLzA7Zm9yKHZhciBnPTA7ZzwzMiYmIShoPFMpO2crKyl7dmFyIG09dS1oLHY9dStoO0FbMF09Yyh0LGksYSxtKSxBWzFdPWMoZSxuLG8sbSk7dmFyIHA9eChBLFQpO2lmKG0+PTAmJnA8ZCl1PW0sZD1wO2Vsc2V7Q1swXT1jKHQsaSxhLHYpLENbMV09YyhlLG4sbyx2KTt2YXIgeT14KEMsVCk7djw9MSYmeTxkPyh1PXYsZD15KTpoKj0uNX19cmV0dXJuIGwmJihsWzBdPWModCxpLGEsdSksbFsxXT1jKGUsbixvLHUpKSxiKGQpfXZhciB2PWkoNikseT12LmNyZWF0ZSx4PXYuZGlzdFNxdWFyZSxfPU1hdGgucG93LGI9TWF0aC5zcXJ0LHc9MWUtOCxTPTFlLTQsTT1iKDMpLEk9MS8zLFQ9eSgpLEE9eSgpLEM9eSgpO3QuZXhwb3J0cz17Y3ViaWNBdDpvLGN1YmljRGVyaXZhdGl2ZUF0OnIsY3ViaWNSb290QXQ6cyxjdWJpY0V4dHJlbWE6bCxjdWJpY1N1YmRpdmlkZTp1LGN1YmljUHJvamVjdFBvaW50OmgscXVhZHJhdGljQXQ6YyxxdWFkcmF0aWNEZXJpdmF0aXZlQXQ6ZCxxdWFkcmF0aWNSb290QXQ6ZixxdWFkcmF0aWNFeHRyZW11bTpwLHF1YWRyYXRpY1N1YmRpdmlkZTpnLHF1YWRyYXRpY1Byb2plY3RQb2ludDptfX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdD90LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOntsZWZ0OjAsdG9wOjB9fWZ1bmN0aW9uIGEodCxlLGksbil7cmV0dXJuIGk9aXx8e30sbnx8IWMuY2FudmFzU3VwcG9ydGVkP28odCxlLGkpOmMuYnJvd3Nlci5maXJlZm94JiZudWxsIT1lLmxheWVyWCYmZS5sYXllclghPT1lLm9mZnNldFg/KGkuenJYPWUubGF5ZXJYLGkuenJZPWUubGF5ZXJZKTpudWxsIT1lLm9mZnNldFg/KGkuenJYPWUub2Zmc2V0WCxpLnpyWT1lLm9mZnNldFkpOm8odCxlLGkpLGl9ZnVuY3Rpb24gbyh0LGUsaSl7dmFyIGE9bih0KTtpLnpyWD1lLmNsaWVudFgtYS5sZWZ0LGkuenJZPWUuY2xpZW50WS1hLnRvcH1mdW5jdGlvbiByKHQsZSxpKXtpZihlPWV8fHdpbmRvdy5ldmVudCxudWxsIT1lLnpyWClyZXR1cm4gZTt2YXIgbj1lLnR5cGUsbz1uJiZuLmluZGV4T2YoInRvdWNoIik+PTA7aWYobyl7dmFyIHI9InRvdWNoZW5kIiE9bj9lLnRhcmdldFRvdWNoZXNbMF06ZS5jaGFuZ2VkVG91Y2hlc1swXTtyJiZhKHQscixlLGkpfWVsc2UgYSh0LGUsZSxpKSxlLnpyRGVsdGE9ZS53aGVlbERlbHRhP2Uud2hlZWxEZWx0YS8xMjA6LShlLmRldGFpbHx8MCkvMzt2YXIgcz1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmdm9pZCAwIT09cyYmZi50ZXN0KGUudHlwZSkmJihlLndoaWNoPTEmcz8xOjImcz8zOjQmcz8yOjApLGV9ZnVuY3Rpb24gcyh0LGUsaSl7ZD90LmFkZEV2ZW50TGlzdGVuZXIoZSxpKTp0LmF0dGFjaEV2ZW50KCJvbiIrZSxpKX1mdW5jdGlvbiBsKHQsZSxpKXtkP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGkpOnQuZGV0YWNoRXZlbnQoIm9uIitlLGkpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQud2hpY2g+MX12YXIgaD1pKDIzKSxjPWkoMTApLGQ9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIsZj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8scD1kP2Z1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHQuY2FuY2VsQnViYmxlPSEwfTpmdW5jdGlvbih0KXt0LnJldHVyblZhbHVlPSExLHQuY2FuY2VsQnViYmxlPSEwfTt0LmV4cG9ydHM9e2NsaWVudFRvTG9jYWw6YSxub3JtYWxpemVFdmVudDpyLGFkZEV2ZW50TGlzdGVuZXI6cyxyZW1vdmVFdmVudExpc3RlbmVyOmwsbm90TGVmdE1vdXNlOnUsc3RvcDpwLERpc3BhdGNoZXI6aH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0PU1hdGgucm91bmQodCksdDwwPzA6dD4yNTU/MjU1OnR9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdD1NYXRoLnJvdW5kKHQpLHQ8MD8wOnQ+MzYwPzM2MDp0fWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQ8MD8wOnQ+MT8xOnR9ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0Lmxlbmd0aCYmIiUiPT09dC5jaGFyQXQodC5sZW5ndGgtMSk/cGFyc2VGbG9hdCh0KS8xMDAqMjU1OnBhcnNlSW50KHQsMTApKX1mdW5jdGlvbiBzKHQpe3JldHVybiBvKHQubGVuZ3RoJiYiJSI9PT10LmNoYXJBdCh0Lmxlbmd0aC0xKT9wYXJzZUZsb2F0KHQpLzEwMDpwYXJzZUZsb2F0KHQpKX1mdW5jdGlvbiBsKHQsZSxpKXtyZXR1cm4gaTwwP2krPTE6aT4xJiYoaS09MSksNippPDE/dCsoZS10KSppKjY6MippPDE/ZTozKmk8Mj90KyhlLXQpKigyLzMtaSkqNjp0fWZ1bmN0aW9uIHUodCxlLGkpe3JldHVybiB0KyhlLXQpKml9ZnVuY3Rpb24gaCh0LGUsaSxuLGEpe3JldHVybiB0WzBdPWUsdFsxXT1pLHRbMl09bix0WzNdPWEsdH1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0fWZ1bmN0aW9uIGQodCxlKXtUJiZjKFQsZSksVD1JLnB1dCh0LFR8fGUuc2xpY2UoKSl9ZnVuY3Rpb24gZih0LGUpe2lmKHQpe2U9ZXx8W107dmFyIGk9SS5nZXQodCk7aWYoaSlyZXR1cm4gYyhlLGkpO3QrPSIiO3ZhciBuPXQucmVwbGFjZSgvIC9nLCIiKS50b0xvd2VyQ2FzZSgpO2lmKG4gaW4gTSlyZXR1cm4gYyhlLE1bbl0pLGQodCxlKSxlO2lmKCIjIiE9PW4uY2hhckF0KDApKXt2YXIgYT1uLmluZGV4T2YoIigiKSxvPW4uaW5kZXhPZigiKSIpO2lmKGEhPT0tMSYmbysxPT09bi5sZW5ndGgpe3ZhciBsPW4uc3Vic3RyKDAsYSksdT1uLnN1YnN0cihhKzEsby0oYSsxKSkuc3BsaXQoIiwiKSxmPTE7c3dpdGNoKGwpe2Nhc2UicmdiYSI6aWYoNCE9PXUubGVuZ3RoKXJldHVybiB2b2lkIGgoZSwwLDAsMCwxKTtmPXModS5wb3AoKSk7Y2FzZSJyZ2IiOnJldHVybiAzIT09dS5sZW5ndGg/dm9pZCBoKGUsMCwwLDAsMSk6KGgoZSxyKHVbMF0pLHIodVsxXSkscih1WzJdKSxmKSxkKHQsZSksZSk7Y2FzZSJoc2xhIjpyZXR1cm4gNCE9PXUubGVuZ3RoP3ZvaWQgaChlLDAsMCwwLDEpOih1WzNdPXModVszXSkscCh1LGUpLGQodCxlKSxlKTtjYXNlImhzbCI6cmV0dXJuIDMhPT11Lmxlbmd0aD92b2lkIGgoZSwwLDAsMCwxKToocCh1LGUpLGQodCxlKSxlKTtkZWZhdWx0OnJldHVybn19aChlLDAsMCwwLDEpfWVsc2V7aWYoND09PW4ubGVuZ3RoKXt2YXIgZz1wYXJzZUludChuLnN1YnN0cigxKSwxNik7cmV0dXJuIGc+PTAmJmc8PTQwOTU/KGgoZSwoMzg0MCZnKT4+NHwoMzg0MCZnKT4+OCwyNDAmZ3woMjQwJmcpPj40LDE1Jmd8KDE1JmcpPDw0LDEpLGQodCxlKSxlKTp2b2lkIGgoZSwwLDAsMCwxKX1pZig3PT09bi5sZW5ndGgpe3ZhciBnPXBhcnNlSW50KG4uc3Vic3RyKDEpLDE2KTtyZXR1cm4gZz49MCYmZzw9MTY3NzcyMTU/KGgoZSwoMTY3MTE2ODAmZyk+PjE2LCg2NTI4MCZnKT4+OCwyNTUmZywxKSxkKHQsZSksZSk6dm9pZCBoKGUsMCwwLDAsMSl9fX19ZnVuY3Rpb24gcCh0LGUpe3ZhciBpPShwYXJzZUZsb2F0KHRbMF0pJTM2MCszNjApJTM2MC8zNjAsYT1zKHRbMV0pLG89cyh0WzJdKSxyPW88PS41P28qKGErMSk6bythLW8qYSx1PTIqby1yO3JldHVybiBlPWV8fFtdLGgoZSxuKDI1NSpsKHUscixpKzEvMykpLG4oMjU1KmwodSxyLGkpKSxuKDI1NSpsKHUscixpLTEvMykpLDEpLDQ9PT10Lmxlbmd0aCYmKGVbM109dFszXSksZX1mdW5jdGlvbiBnKHQpe2lmKHQpe3ZhciBlLGksbj10WzBdLzI1NSxhPXRbMV0vMjU1LG89dFsyXS8yNTUscj1NYXRoLm1pbihuLGEsbykscz1NYXRoLm1heChuLGEsbyksbD1zLXIsdT0ocytyKS8yO2lmKDA9PT1sKWU9MCxpPTA7ZWxzZXtpPXU8LjU/bC8ocytyKTpsLygyLXMtcik7dmFyIGg9KChzLW4pLzYrbC8yKS9sLGM9KChzLWEpLzYrbC8yKS9sLGQ9KChzLW8pLzYrbC8yKS9sO249PT1zP2U9ZC1jOmE9PT1zP2U9MS8zK2gtZDpvPT09cyYmKGU9Mi8zK2MtaCksZTwwJiYoZSs9MSksZT4xJiYoZS09MSl9dmFyIGY9WzM2MCplLGksdV07cmV0dXJuIG51bGwhPXRbM10mJmYucHVzaCh0WzNdKSxmfX1mdW5jdGlvbiBtKHQsZSl7dmFyIGk9Zih0KTtpZihpKXtmb3IodmFyIG49MDtuPDM7bisrKWU8MD9pW25dPWlbbl0qKDEtZSl8MDppW25dPSgyNTUtaVtuXSkqZStpW25dfDA7cmV0dXJuIHcoaSw0PT09aS5sZW5ndGg/InJnYmEiOiJyZ2IiKX19ZnVuY3Rpb24gdih0LGUpe3ZhciBpPWYodCk7aWYoaSlyZXR1cm4oKDE8PDI0KSsoaVswXTw8MTYpKyhpWzFdPDw4KSsgK2lbMl0pLnRvU3RyaW5nKDE2KS5zbGljZSgxKX1mdW5jdGlvbiB5KHQsZSxpKXtpZihlJiZlLmxlbmd0aCYmdD49MCYmdDw9MSl7aT1pfHxbXTt2YXIgYT10KihlLmxlbmd0aC0xKSxyPU1hdGguZmxvb3IoYSkscz1NYXRoLmNlaWwoYSksbD1lW3JdLGg9ZVtzXSxjPWEtcjtyZXR1cm4gaVswXT1uKHUobFswXSxoWzBdLGMpKSxpWzFdPW4odShsWzFdLGhbMV0sYykpLGlbMl09bih1KGxbMl0saFsyXSxjKSksaVszXT1vKHUobFszXSxoWzNdLGMpKSxpfX1mdW5jdGlvbiB4KHQsZSxpKXtpZihlJiZlLmxlbmd0aCYmdD49MCYmdDw9MSl7dmFyIGE9dCooZS5sZW5ndGgtMSkscj1NYXRoLmZsb29yKGEpLHM9TWF0aC5jZWlsKGEpLGw9ZihlW3JdKSxoPWYoZVtzXSksYz1hLXIsZD13KFtuKHUobFswXSxoWzBdLGMpKSxuKHUobFsxXSxoWzFdLGMpKSxuKHUobFsyXSxoWzJdLGMpKSxvKHUobFszXSxoWzNdLGMpKV0sInJnYmEiKTtyZXR1cm4gaT97Y29sb3I6ZCxsZWZ0SW5kZXg6cixyaWdodEluZGV4OnMsdmFsdWU6YX06ZH19ZnVuY3Rpb24gXyh0LGUsaSxuKXtpZih0PWYodCkpcmV0dXJuIHQ9Zyh0KSxudWxsIT1lJiYodFswXT1hKGUpKSxudWxsIT1pJiYodFsxXT1zKGkpKSxudWxsIT1uJiYodFsyXT1zKG4pKSx3KHAodCksInJnYmEiKX1mdW5jdGlvbiBiKHQsZSl7aWYodD1mKHQpLHQmJm51bGwhPWUpcmV0dXJuIHRbM109byhlKSx3KHQsInJnYmEiKX1mdW5jdGlvbiB3KHQsZSl7aWYodCYmdC5sZW5ndGgpe3ZhciBpPXRbMF0rIiwiK3RbMV0rIiwiK3RbMl07cmV0dXJuInJnYmEiIT09ZSYmImhzdmEiIT09ZSYmImhzbGEiIT09ZXx8KGkrPSIsIit0WzNdKSxlKyIoIitpKyIpIn19dmFyIFM9aSg3MyksTT17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX0sST1uZXcgUygyMCksVD1udWxsO3QuZXhwb3J0cz17cGFyc2U6ZixsaWZ0Om0sdG9IZXg6dixmYXN0TGVycDp5LGZhc3RNYXBUb0NvbG9yOnksbGVycDp4LG1hcFRvQ29sb3I6eCxtb2RpZnlIU0w6Xyxtb2RpZnlBbHBoYTpiLHN0cmluZ2lmeTp3fX0sZnVuY3Rpb24odCxlKXt2YXIgaT1BcnJheS5wcm90b3R5cGUuc2xpY2Usbj1mdW5jdGlvbigpe3RoaXMuXyRoYW5kbGVycz17fX07bi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm4sb25lOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl8kaGFuZGxlcnM7aWYoIWV8fCF0KXJldHVybiB0aGlzO25bdF18fChuW3RdPVtdKTtmb3IodmFyIGE9MDthPG5bdF0ubGVuZ3RoO2ErKylpZihuW3RdW2FdLmg9PT1lKXJldHVybiB0aGlzO3JldHVybiBuW3RdLnB1c2goe2g6ZSxvbmU6ITAsY3R4Oml8fHRoaXN9KSx0aGlzfSxvbjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fJGhhbmRsZXJzO2lmKCFlfHwhdClyZXR1cm4gdGhpcztuW3RdfHwoblt0XT1bXSk7Zm9yKHZhciBhPTA7YTxuW3RdLmxlbmd0aDthKyspaWYoblt0XVthXS5oPT09ZSlyZXR1cm4gdGhpcztyZXR1cm4gblt0XS5wdXNoKHtoOmUsb25lOiExLGN0eDppfHx0aGlzfSksdGhpc30saXNTaWxlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fJGhhbmRsZXJzO3JldHVybiBlW3RdJiZlW3RdLmxlbmd0aH0sb2ZmOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fJGhhbmRsZXJzO2lmKCF0KXJldHVybiB0aGlzLl8kaGFuZGxlcnM9e30sdGhpcztpZihlKXtpZihpW3RdKXtmb3IodmFyIG49W10sYT0wLG89aVt0XS5sZW5ndGg7YTxvO2ErKylpW3RdW2FdLmghPWUmJm4ucHVzaChpW3RdW2FdKTtpW3RdPW59aVt0XSYmMD09PWlbdF0ubGVuZ3RoJiZkZWxldGUgaVt0XX1lbHNlIGRlbGV0ZSBpW3RdO3JldHVybiB0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe2lmKHRoaXMuXyRoYW5kbGVyc1t0XSl7dmFyIGU9YXJndW1lbnRzLG49ZS5sZW5ndGg7bj4zJiYoZT1pLmNhbGwoZSwxKSk7Zm9yKHZhciBhPXRoaXMuXyRoYW5kbGVyc1t0XSxvPWEubGVuZ3RoLHI9MDtyPG87KXtzd2l0Y2gobil7Y2FzZSAxOmFbcl0uaC5jYWxsKGFbcl0uY3R4KTticmVhaztjYXNlIDI6YVtyXS5oLmNhbGwoYVtyXS5jdHgsZVsxXSk7YnJlYWs7Y2FzZSAzOmFbcl0uaC5jYWxsKGFbcl0uY3R4LGVbMV0sZVsyXSk7YnJlYWs7ZGVmYXVsdDphW3JdLmguYXBwbHkoYVtyXS5jdHgsZSl9YVtyXS5vbmU/KGEuc3BsaWNlKHIsMSksby0tKTpyKyt9fXJldHVybiB0aGlzfSx0cmlnZ2VyV2l0aENvbnRleHQ6ZnVuY3Rpb24odCl7aWYodGhpcy5fJGhhbmRsZXJzW3RdKXt2YXIgZT1hcmd1bWVudHMsbj1lLmxlbmd0aDtuPjQmJihlPWkuY2FsbChlLDEsZS5sZW5ndGgtMSkpO2Zvcih2YXIgYT1lW2UubGVuZ3RoLTFdLG89dGhpcy5fJGhhbmRsZXJzW3RdLHI9by5sZW5ndGgscz0wO3M8cjspe3N3aXRjaChuKXtjYXNlIDE6b1tzXS5oLmNhbGwoYSk7YnJlYWs7Y2FzZSAyOm9bc10uaC5jYWxsKGEsZVsxXSk7YnJlYWs7Y2FzZSAzOm9bc10uaC5jYWxsKGEsZVsxXSxlWzJdKTticmVhaztkZWZhdWx0Om9bc10uaC5hcHBseShhLGUpfW9bc10ub25lPyhvLnNwbGljZShzLDEpLHItLSk6cysrfX1yZXR1cm4gdGhpc319LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMyksYT1pKDEyKSxvPW4uZXh0ZW5kU2hhcGUoe3R5cGU6InRyaWFuZ2xlIixzaGFwZTp7Y3g6MCxjeTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuY3gsbj1lLmN5LGE9ZS53aWR0aC8yLG89ZS5oZWlnaHQvMjt0Lm1vdmVUbyhpLG4tbyksdC5saW5lVG8oaSthLG4rbyksdC5saW5lVG8oaS1hLG4rbyksdC5jbG9zZVBhdGgoKX19KSxyPW4uZXh0ZW5kU2hhcGUoe3R5cGU6ImRpYW1vbmQiLHNoYXBlOntjeDowLGN5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5jeCxuPWUuY3ksYT1lLndpZHRoLzIsbz1lLmhlaWdodC8yO3QubW92ZVRvKGksbi1vKSx0LmxpbmVUbyhpK2EsbiksdC5saW5lVG8oaSxuK28pLHQubGluZVRvKGktYSxuKSx0LmNsb3NlUGF0aCgpfX0pLHM9bi5leHRlbmRTaGFwZSh7dHlwZToicGluIixzaGFwZTp7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLngsbj1lLnksYT1lLndpZHRoLzUqMyxvPU1hdGgubWF4KGEsZS5oZWlnaHQpLHI9YS8yLHM9cipyLyhvLXIpLGw9bi1vK3Ircyx1PU1hdGguYXNpbihzL3IpLGg9TWF0aC5jb3ModSkqcixjPU1hdGguc2luKHUpLGQ9TWF0aC5jb3ModSk7dC5hcmMoaSxsLHIsTWF0aC5QSS11LDIqTWF0aC5QSSt1KTt2YXIgZj0uNipyLHA9Ljcqcjt0LmJlemllckN1cnZlVG8oaStoLWMqZixsK3MrZCpmLGksbi1wLGksbiksdC5iZXppZXJDdXJ2ZVRvKGksbi1wLGktaCtjKmYsbCtzK2QqZixpLWgsbCtzKSx0LmNsb3NlUGF0aCgpfX0pLGw9bi5leHRlbmRTaGFwZSh7dHlwZToiYXJyb3ciLHNoYXBlOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuaGVpZ2h0LG49ZS53aWR0aCxhPWUueCxvPWUueSxyPW4vMyoyO3QubW92ZVRvKGEsbyksdC5saW5lVG8oYStyLG8raSksdC5saW5lVG8oYSxvK2kvNCozKSx0LmxpbmVUbyhhLXIsbytpKSx0LmxpbmVUbyhhLG8pLHQuY2xvc2VQYXRoKCl9fSksdT17bGluZTpuLkxpbmUscmVjdDpuLlJlY3Qscm91bmRSZWN0Om4uUmVjdCxzcXVhcmU6bi5SZWN0LGNpcmNsZTpuLkNpcmNsZSxkaWFtb25kOnIscGluOnMsYXJyb3c6bCx0cmlhbmdsZTpvfSxoPXtsaW5lOmZ1bmN0aW9uKHQsZSxpLG4sYSl7YS54MT10LGEueTE9ZStuLzIsYS54Mj10K2ksYS55Mj1lK24vMn0scmVjdDpmdW5jdGlvbih0LGUsaSxuLGEpe2EueD10LGEueT1lLGEud2lkdGg9aSxhLmhlaWdodD1ufSxyb3VuZFJlY3Q6ZnVuY3Rpb24odCxlLGksbixhKXthLng9dCxhLnk9ZSxhLndpZHRoPWksYS5oZWlnaHQ9bixhLnI9TWF0aC5taW4oaSxuKS80fSxzcXVhcmU6ZnVuY3Rpb24odCxlLGksbixhKXt2YXIgbz1NYXRoLm1pbihpLG4pO2EueD10LGEueT1lLGEud2lkdGg9byxhLmhlaWdodD1vfSxjaXJjbGU6ZnVuY3Rpb24odCxlLGksbixhKXthLmN4PXQraS8yLGEuY3k9ZStuLzIsYS5yPU1hdGgubWluKGksbikvMn0sZGlhbW9uZDpmdW5jdGlvbih0LGUsaSxuLGEpe2EuY3g9dCtpLzIsYS5jeT1lK24vMixhLndpZHRoPWksYS5oZWlnaHQ9bn0scGluOmZ1bmN0aW9uKHQsZSxpLG4sYSl7YS54PXQraS8yLGEueT1lK24vMixhLndpZHRoPWksYS5oZWlnaHQ9bn0sYXJyb3c6ZnVuY3Rpb24odCxlLGksbixhKXthLng9dCtpLzIsYS55PWUrbi8yLGEud2lkdGg9aSxhLmhlaWdodD1ufSx0cmlhbmdsZTpmdW5jdGlvbih0LGUsaSxuLGEpe2EuY3g9dCtpLzIsYS5jeT1lK24vMixhLndpZHRoPWksYS5oZWlnaHQ9bn19LGM9e307Zm9yKHZhciBkIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShkKSYmKGNbZF09bmV3IHVbZF0pO3ZhciBmPW4uZXh0ZW5kU2hhcGUoe3R5cGU6InN5bWJvbCIsc2hhcGU6e3N5bWJvbFR5cGU6IiIseDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxiZWZvcmVCcnVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGUsZT10aGlzLnNoYXBlOyJwaW4iPT09ZS5zeW1ib2xUeXBlJiYiaW5zaWRlIj09PXQudGV4dFBvc2l0aW9uJiYodC50ZXh0UG9zaXRpb249WyI1MCUiLCI0MCUiXSx0LnRleHRBbGlnbj0iY2VudGVyIix0LnRleHRWZXJ0aWNhbEFsaWduPSJtaWRkbGUiKX0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1lLnN5bWJvbFR5cGUsYT1jW25dOyJub25lIiE9PWUuc3ltYm9sVHlwZSYmKGF8fChuPSJyZWN0IixhPWNbbl0pLGhbbl0oZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0LGEuc2hhcGUpLGEuYnVpbGRQYXRoKHQsYS5zaGFwZSxpKSl9fSkscD1mdW5jdGlvbih0KXtpZigiaW1hZ2UiIT09dGhpcy50eXBlKXt2YXIgZT10aGlzLnN0eWxlLGk9dGhpcy5zaGFwZTtpJiYibGluZSI9PT1pLnN5bWJvbFR5cGU/ZS5zdHJva2U9dDp0aGlzLl9faXNFbXB0eUJydXNoPyhlLnN0cm9rZT10LGUuZmlsbD0iI2ZmZiIpOihlLmZpbGwmJihlLmZpbGw9dCksZS5zdHJva2UmJihlLnN0cm9rZT10KSksdGhpcy5kaXJ0eSghMSl9fSxnPXtjcmVhdGVTeW1ib2w6ZnVuY3Rpb24odCxlLGksbyxyLHMpe3ZhciBsPTA9PT10LmluZGV4T2YoImVtcHR5Iik7bCYmKHQ9dC5zdWJzdHIoNSwxKS50b0xvd2VyQ2FzZSgpK3Quc3Vic3RyKDYpKTt2YXIgdTtyZXR1cm4gdT0wPT09dC5pbmRleE9mKCJpbWFnZTovLyIpP25ldyBuLkltYWdlKHtzdHlsZTp7aW1hZ2U6dC5zbGljZSg4KSx4OmUseTppLHdpZHRoOm8saGVpZ2h0OnJ9fSk6MD09PXQuaW5kZXhPZigicGF0aDovLyIpP24ubWFrZVBhdGgodC5zbGljZSg3KSx7fSxuZXcgYShlLGksbyxyKSk6bmV3IGYoe3NoYXBlOntzeW1ib2xUeXBlOnQseDplLHk6aSx3aWR0aDpvLGhlaWdodDpyfX0pLHUuX19pc0VtcHR5QnJ1c2g9bCx1LnNldENvbG9yPXAsdS5zZXRDb2xvcihzKSx1fX07dC5leHBvcnRzPWd9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXtjW2VdP3Qub3RoZXJEaW1zW2VdPWk6KHQuY29vcmREaW09ZSx0LmNvb3JkRGltSW5kZXg9aSxtLnNldChlLCEwKSl9ZnVuY3Rpb24gcih0LGUsaSl7aWYoaXx8bnVsbCE9ZS5nZXQodCkpe2Zvcih2YXIgbj0wO251bGwhPWUuZ2V0KHQrbik7KW4rKzt0Kz1ufXJldHVybiBlLnNldCh0LCEwKSx0fWU9ZXx8W10saT1pfHx7fSx0PSh0fHxbXSkuc2xpY2UoKTt2YXIgZj0oaS5kaW1zRGVmfHxbXSkuc2xpY2UoKSxwPW8uY3JlYXRlSGFzaE1hcChpLmVuY29kZURlZiksZz1vLmNyZWF0ZUhhc2hNYXAoKSxtPW8uY3JlYXRlSGFzaE1hcCgpLHY9W10seT1pLmRpbUNvdW50O2lmKG51bGw9PXkpe3ZhciB4PWEoZVswXSk7eT1NYXRoLm1heChvLmlzQXJyYXkoeCkmJngubGVuZ3RofHwxLHQubGVuZ3RoLGYubGVuZ3RoKSxzKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5kaW1zRGVmO2UmJih5PU1hdGgubWF4KHksZS5sZW5ndGgpKX0pfWZvcih2YXIgXz0wO188eTtfKyspe3ZhciBiPWwoZltfXSk/e25hbWU6ZltfXX06ZltfXXx8e30sdz1iLm5hbWUsUz12W19dPXtvdGhlckRpbXM6e319O251bGwhPXcmJm51bGw9PWcuZ2V0KHcpJiYoUy5uYW1lPVMudG9vbHRpcE5hbWU9dyxnLnNldCh3LF8pKSxudWxsIT1iLnR5cGUmJihTLnR5cGU9Yi50eXBlKX1wLmVhY2goZnVuY3Rpb24odCxlKXt0PXAuc2V0KGUsaCh0KS5zbGljZSgpKSxzKHQsZnVuY3Rpb24oaSxhKXtsKGkpJiYoaT1nLmdldChpKSksbnVsbCE9aSYmaTx5JiYodFthXT1pLG4odltpXSxlLGEpKX0pfSk7dmFyIE09MDtzKHQsZnVuY3Rpb24odCxlKXt2YXIgaSx0LGEscjtsKHQpPyhpPXQsdD17fSk6KGk9dC5uYW1lLHQ9by5jbG9uZSh0KSxhPXQuZGltc0RlZixyPXQub3RoZXJEaW1zLHQubmFtZT10LmNvb3JkRGltPXQuY29vcmREaW1JbmRleD10LmRpbXNEZWY9dC5vdGhlckRpbXM9bnVsbCk7dmFyIGM9aChwLmdldChpKSk7aWYoIWMubGVuZ3RoKWZvcih2YXIgZD0wO2Q8KGEmJmEubGVuZ3RofHwxKTtkKyspe2Zvcig7TTx2Lmxlbmd0aCYmbnVsbCE9dltNXS5jb29yZERpbTspTSsrO008di5sZW5ndGgmJmMucHVzaChNKyspfXMoYyxmdW5jdGlvbihlLG8pe3ZhciBzPXZbZV07bih1KHMsdCksaSxvKSxudWxsPT1zLm5hbWUmJmEmJihzLm5hbWU9cy50b29sdGlwTmFtZT1hW29dKSxyJiZ1KHMub3RoZXJEaW1zLHIpfSl9KTtmb3IodmFyIEk9aS5leHRyYVByZWZpeHx8InZhbHVlIixUPTA7VDx5O1QrKyl7dmFyIFM9dltUXT12W1RdfHx7fSxBPVMuY29vcmREaW07bnVsbD09QSYmKFMuY29vcmREaW09cihJLG0saS5leHRyYUZyb21aZXJvKSxTLmNvb3JkRGltSW5kZXg9MCxTLmlzRXh0cmFDb29yZD0hMCksbnVsbD09Uy5uYW1lJiYoUy5uYW1lPXIoUy5jb29yZERpbSxnKSksbnVsbD09Uy50eXBlJiZkKGUsVCkmJihTLnR5cGU9Im9yZGluYWwiKX1yZXR1cm4gdn1mdW5jdGlvbiBhKHQpe3JldHVybiBvLmlzQXJyYXkodCk/dDpvLmlzT2JqZWN0KHQpP3QudmFsdWU6dH12YXIgbz1pKDEpLHI9aSg1KSxzPW8uZWFjaCxsPW8uaXNTdHJpbmcsdT1vLmRlZmF1bHRzLGg9ci5ub3JtYWxpemVUb0FycmF5LGM9e3Rvb2x0aXA6MSxsYWJlbDoxLGl0ZW1OYW1lOjF9LGQ9bi5ndWVzc09yZGluYWw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MCxuPXQubGVuZ3RoO2k8bjtpKyspe3ZhciByPWEodFtpXSk7aWYoIW8uaXNBcnJheShyKSlyZXR1cm4hMTt2YXIgcj1yW2VdO2lmKG51bGwhPXImJmlzRmluaXRlKHIpJiYiIiE9PXIpcmV0dXJuITE7aWYobChyKSYmIi0iIT09cilyZXR1cm4hMH1yZXR1cm4hMX07dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe3RoaXMuX2Nvb3JkaW5hdGVTeXN0ZW1zPVtdfXZhciBhPWkoMSksbz17fTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixjcmVhdGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTthLmVhY2gobyxmdW5jdGlvbihuLGEpe3ZhciBvPW4uY3JlYXRlKHQsZSk7aT1pLmNvbmNhdChvfHxbXSl9KSx0aGlzLl9jb29yZGluYXRlU3lzdGVtcz1pfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXthLmVhY2godGhpcy5fY29vcmRpbmF0ZVN5c3RlbXMsZnVuY3Rpb24oaSl7aS51cGRhdGUmJmkudXBkYXRlKHQsZSl9KX0sZ2V0Q29vcmRpbmF0ZVN5c3RlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZVN5c3RlbXMuc2xpY2UoKX19LG4ucmVnaXN0ZXI9ZnVuY3Rpb24odCxlKXtvW3RdPWV9LG4uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDIwKSxhPWkoNiksbz1pKDkwKSxyPWkoMTIpLHM9aSgzNSkuZGV2aWNlUGl4ZWxSYXRpbyxsPXtNOjEsTDoyLEM6MyxROjQsQTo1LFo6NixSOjd9LHU9W10saD1bXSxjPVtdLGQ9W10sZj1NYXRoLm1pbixwPU1hdGgubWF4LGc9TWF0aC5jb3MsbT1NYXRoLnNpbix2PU1hdGguc3FydCx5PU1hdGguYWJzLHg9InVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDMyQXJyYXksXz1mdW5jdGlvbih0KXt0aGlzLl9zYXZlRGF0YT0hdCx0aGlzLl9zYXZlRGF0YSYmKHRoaXMuZGF0YT1bXSksdGhpcy5fY3R4PW51bGx9O18ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfLF94aTowLF95aTowLF94MDowLF95MDowLF91eDowLF91eTowLF9sZW46MCxfbGluZURhc2g6bnVsbCxfZGFzaE9mZnNldDowLF9kYXNoSWR4OjAsX2Rhc2hTdW06MCxzZXRTY2FsZTpmdW5jdGlvbih0LGUpe3RoaXMuX3V4PXkoMS9zL3QpfHwwLHRoaXMuX3V5PXkoMS9zL2UpfHwwfSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N0eH0sYmVnaW5QYXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jdHg9dCx0JiZ0LmJlZ2luUGF0aCgpLHQmJih0aGlzLmRwcj10LmRwciksdGhpcy5fc2F2ZURhdGEmJih0aGlzLl9sZW49MCksdGhpcy5fbGluZURhc2gmJih0aGlzLl9saW5lRGFzaD1udWxsLHRoaXMuX2Rhc2hPZmZzZXQ9MCksdGhpc30sbW92ZVRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkRGF0YShsLk0sdCxlKSx0aGlzLl9jdHgmJnRoaXMuX2N0eC5tb3ZlVG8odCxlKSx0aGlzLl94MD10LHRoaXMuX3kwPWUsdGhpcy5feGk9dCx0aGlzLl95aT1lLHRoaXN9LGxpbmVUbzpmdW5jdGlvbih0LGUpe3ZhciBpPXkodC10aGlzLl94aSk+dGhpcy5fdXh8fHkoZS10aGlzLl95aSk+dGhpcy5fdXl8fHRoaXMuX2xlbjw1O3JldHVybiB0aGlzLmFkZERhdGEobC5MLHQsZSksdGhpcy5fY3R4JiZpJiYodGhpcy5fbmVlZHNEYXNoKCk/dGhpcy5fZGFzaGVkTGluZVRvKHQsZSk6dGhpcy5fY3R4LmxpbmVUbyh0LGUpKSxpJiYodGhpcy5feGk9dCx0aGlzLl95aT1lKSx0aGlzfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxpLG4sYSxvKXtyZXR1cm4gdGhpcy5hZGREYXRhKGwuQyx0LGUsaSxuLGEsbyksdGhpcy5fY3R4JiYodGhpcy5fbmVlZHNEYXNoKCk/dGhpcy5fZGFzaGVkQmV6aWVyVG8odCxlLGksbixhLG8pOnRoaXMuX2N0eC5iZXppZXJDdXJ2ZVRvKHQsZSxpLG4sYSxvKSksdGhpcy5feGk9YSx0aGlzLl95aT1vLHRoaXN9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHRoaXMuYWRkRGF0YShsLlEsdCxlLGksbiksdGhpcy5fY3R4JiYodGhpcy5fbmVlZHNEYXNoKCk/dGhpcy5fZGFzaGVkUXVhZHJhdGljVG8odCxlLGksbik6dGhpcy5fY3R4LnF1YWRyYXRpY0N1cnZlVG8odCxlLGksbikpLHRoaXMuX3hpPWksdGhpcy5feWk9bix0aGlzfSxhcmM6ZnVuY3Rpb24odCxlLGksbixhLG8pe3JldHVybiB0aGlzLmFkZERhdGEobC5BLHQsZSxpLGksbixhLW4sMCxvPzA6MSksdGhpcy5fY3R4JiZ0aGlzLl9jdHguYXJjKHQsZSxpLG4sYSxvKSx0aGlzLl94aT1nKGEpKmkrdCx0aGlzLl95aT1tKGEpKmkrdCx0aGlzfSxhcmNUbzpmdW5jdGlvbih0LGUsaSxuLGEpe3JldHVybiB0aGlzLl9jdHgmJnRoaXMuX2N0eC5hcmNUbyh0LGUsaSxuLGEpLHRoaXN9LHJlY3Q6ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIHRoaXMuX2N0eCYmdGhpcy5fY3R4LnJlY3QodCxlLGksbiksdGhpcy5hZGREYXRhKGwuUix0LGUsaSxuKSx0aGlzfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLmFkZERhdGEobC5aKTt2YXIgdD10aGlzLl9jdHgsZT10aGlzLl94MCxpPXRoaXMuX3kwO3JldHVybiB0JiYodGhpcy5fbmVlZHNEYXNoKCkmJnRoaXMuX2Rhc2hlZExpbmVUbyhlLGkpLHQuY2xvc2VQYXRoKCkpLHRoaXMuX3hpPWUsdGhpcy5feWk9aSx0aGlzfSxmaWxsOmZ1bmN0aW9uKHQpe3QmJnQuZmlsbCgpLHRoaXMudG9TdGF0aWMoKX0sc3Ryb2tlOmZ1bmN0aW9uKHQpe3QmJnQuc3Ryb2tlKCksdGhpcy50b1N0YXRpYygpfSxzZXRMaW5lRGFzaDpmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgQXJyYXkpe3RoaXMuX2xpbmVEYXNoPXQsdGhpcy5fZGFzaElkeD0wO2Zvcih2YXIgZT0wLGk9MDtpPHQubGVuZ3RoO2krKyllKz10W2ldO3RoaXMuX2Rhc2hTdW09ZX1yZXR1cm4gdGhpc30sc2V0TGluZURhc2hPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Rhc2hPZmZzZXQ9dCx0aGlzfSxsZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVufSxzZXREYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO3RoaXMuZGF0YSYmdGhpcy5kYXRhLmxlbmd0aD09ZXx8IXh8fCh0aGlzLmRhdGE9bmV3IEZsb2F0MzJBcnJheShlKSk7Zm9yKHZhciBpPTA7aTxlO2krKyl0aGlzLmRhdGFbaV09dFtpXTt0aGlzLl9sZW49ZX0sYXBwZW5kUGF0aDpmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgQXJyYXl8fCh0PVt0XSk7Zm9yKHZhciBlPXQubGVuZ3RoLGk9MCxuPXRoaXMuX2xlbixhPTA7YTxlO2ErKylpKz10W2FdLmxlbigpO3gmJnRoaXMuZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSYmKHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KG4raSkpO2Zvcih2YXIgYT0wO2E8ZTthKyspZm9yKHZhciBvPXRbYV0uZGF0YSxyPTA7cjxvLmxlbmd0aDtyKyspdGhpcy5kYXRhW24rK109b1tyXTt0aGlzLl9sZW49bn0sYWRkRGF0YTpmdW5jdGlvbih0KXtpZih0aGlzLl9zYXZlRGF0YSl7dmFyIGU9dGhpcy5kYXRhO3RoaXMuX2xlbithcmd1bWVudHMubGVuZ3RoPmUubGVuZ3RoJiYodGhpcy5fZXhwYW5kRGF0YSgpLGU9dGhpcy5kYXRhKTtmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKWVbdGhpcy5fbGVuKytdPWFyZ3VtZW50c1tpXTt0aGlzLl9wcmV2Q21kPXR9fSxfZXhwYW5kRGF0YTpmdW5jdGlvbigpe2lmKCEodGhpcy5kYXRhIGluc3RhbmNlb2YgQXJyYXkpKXtmb3IodmFyIHQ9W10sZT0wO2U8dGhpcy5fbGVuO2UrKyl0W2VdPXRoaXMuZGF0YVtlXTt0aGlzLmRhdGE9dH19LF9uZWVkc0Rhc2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGluZURhc2h9LF9kYXNoZWRMaW5lVG86ZnVuY3Rpb24odCxlKXt2YXIgaSxuLGE9dGhpcy5fZGFzaFN1bSxvPXRoaXMuX2Rhc2hPZmZzZXQscj10aGlzLl9saW5lRGFzaCxzPXRoaXMuX2N0eCxsPXRoaXMuX3hpLHU9dGhpcy5feWksaD10LWwsYz1lLXUsZD12KGgqaCtjKmMpLGc9bCxtPXUseT1yLmxlbmd0aDtmb3IoaC89ZCxjLz1kLG88MCYmKG89YStvKSxvJT1hLGctPW8qaCxtLT1vKmM7aD4wJiZnPD10fHxoPDAmJmc+PXR8fDA9PWgmJihjPjAmJm08PWV8fGM8MCYmbT49ZSk7KW49dGhpcy5fZGFzaElkeCxpPXJbbl0sZys9aCppLG0rPWMqaSx0aGlzLl9kYXNoSWR4PShuKzEpJXksaD4wJiZnPGx8fGg8MCYmZz5sfHxjPjAmJm08dXx8YzwwJiZtPnV8fHNbbiUyPyJtb3ZlVG8iOiJsaW5lVG8iXShoPj0wP2YoZyx0KTpwKGcsdCksYz49MD9mKG0sZSk6cChtLGUpKTtoPWctdCxjPW0tZSx0aGlzLl9kYXNoT2Zmc2V0PS12KGgqaCtjKmMpfSxfZGFzaGVkQmV6aWVyVG86ZnVuY3Rpb24odCxlLGksYSxvLHIpe3ZhciBzLGwsdSxoLGMsZD10aGlzLl9kYXNoU3VtLGY9dGhpcy5fZGFzaE9mZnNldCxwPXRoaXMuX2xpbmVEYXNoLGc9dGhpcy5fY3R4LG09dGhpcy5feGkseT10aGlzLl95aSx4PW4uY3ViaWNBdCxfPTAsYj10aGlzLl9kYXNoSWR4LHc9cC5sZW5ndGgsUz0wO2ZvcihmPDAmJihmPWQrZiksZiU9ZCxzPTA7czwxO3MrPS4xKWw9eChtLHQsaSxvLHMrLjEpLXgobSx0LGksbyxzKSx1PXgoeSxlLGEscixzKy4xKS14KHksZSxhLHIscyksXys9dihsKmwrdSp1KTtmb3IoO2I8dyYmKFMrPXBbYl0sIShTPmYpKTtiKyspO2ZvcihzPShTLWYpL187czw9MTspaD14KG0sdCxpLG8scyksYz14KHksZSxhLHIscyksYiUyP2cubW92ZVRvKGgsYyk6Zy5saW5lVG8oaCxjKSxzKz1wW2JdL18sYj0oYisxKSV3O2IlMiE9PTAmJmcubGluZVRvKG8sciksbD1vLWgsdT1yLWMsdGhpcy5fZGFzaE9mZnNldD0tdihsKmwrdSp1KX0sX2Rhc2hlZFF1YWRyYXRpY1RvOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPWksbz1uO2k9KGkrMip0KS8zLG49KG4rMiplKS8zLHQ9KHRoaXMuX3hpKzIqdCkvMyxlPSh0aGlzLl95aSsyKmUpLzMsdGhpcy5fZGFzaGVkQmV6aWVyVG8odCxlLGksbixhLG8pfSx0b1N0YXRpYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YTt0IGluc3RhbmNlb2YgQXJyYXkmJih0Lmxlbmd0aD10aGlzLl9sZW4seCYmKHRoaXMuZGF0YT1uZXcgRmxvYXQzMkFycmF5KHQpKSl9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3VbMF09dVsxXT1jWzBdPWNbMV09TnVtYmVyLk1BWF9WQUxVRSxoWzBdPWhbMV09ZFswXT1kWzFdPS1OdW1iZXIuTUFYX1ZBTFVFO2Zvcih2YXIgdD10aGlzLmRhdGEsZT0wLGk9MCxuPTAscz0wLGY9MDtmPHQubGVuZ3RoOyl7dmFyIHA9dFtmKytdO3N3aXRjaCgxPT1mJiYoZT10W2ZdLGk9dFtmKzFdLG49ZSxzPWkpLHApe2Nhc2UgbC5NOm49dFtmKytdLHM9dFtmKytdLGU9bixpPXMsY1swXT1uLGNbMV09cyxkWzBdPW4sZFsxXT1zO2JyZWFrO2Nhc2UgbC5MOm8uZnJvbUxpbmUoZSxpLHRbZl0sdFtmKzFdLGMsZCksZT10W2YrK10saT10W2YrK107YnJlYWs7Y2FzZSBsLkM6by5mcm9tQ3ViaWMoZSxpLHRbZisrXSx0W2YrK10sdFtmKytdLHRbZisrXSx0W2ZdLHRbZisxXSxjLGQpLGU9dFtmKytdLGk9dFtmKytdO2JyZWFrO2Nhc2UgbC5ROm8uZnJvbVF1YWRyYXRpYyhlLGksdFtmKytdLHRbZisrXSx0W2ZdLHRbZisxXSxjLGQpLGU9dFtmKytdLGk9dFtmKytdO2JyZWFrO2Nhc2UgbC5BOnZhciB2PXRbZisrXSx5PXRbZisrXSx4PXRbZisrXSxfPXRbZisrXSxiPXRbZisrXSx3PXRbZisrXStiLFM9KHRbZisrXSwxLXRbZisrXSk7MT09ZiYmKG49ZyhiKSp4K3Yscz1tKGIpKl8reSksby5mcm9tQXJjKHYseSx4LF8sYix3LFMsYyxkKSxlPWcodykqeCt2LGk9bSh3KSpfK3k7YnJlYWs7Y2FzZSBsLlI6bj1lPXRbZisrXSxzPWk9dFtmKytdO3ZhciBNPXRbZisrXSxJPXRbZisrXTtvLmZyb21MaW5lKG4scyxuK00scytJLGMsZCk7YnJlYWs7Y2FzZSBsLlo6ZT1uLGk9c31hLm1pbih1LHUsYyksYS5tYXgoaCxoLGQpfXJldHVybiAwPT09ZiYmKHVbMF09dVsxXT1oWzBdPWhbMV09MCksbmV3IHIodVswXSx1WzFdLGhbMF0tdVswXSxoWzFdLXVbMV0pfSxyZWJ1aWxkUGF0aDpmdW5jdGlvbih0KXtmb3IodmFyIGUsaSxuLGEsbyxyLHM9dGhpcy5kYXRhLHU9dGhpcy5fdXgsaD10aGlzLl91eSxjPXRoaXMuX2xlbixkPTA7ZDxjOyl7dmFyIGY9c1tkKytdO3N3aXRjaCgxPT1kJiYobj1zW2RdLGE9c1tkKzFdLGU9bixpPWEpLGYpe2Nhc2UgbC5NOmU9bj1zW2QrK10saT1hPXNbZCsrXSx0Lm1vdmVUbyhuLGEpO2JyZWFrO2Nhc2UgbC5MOm89c1tkKytdLHI9c1tkKytdLCh5KG8tbik+dXx8eShyLWEpPmh8fGQ9PT1jLTEpJiYodC5saW5lVG8obyxyKSxuPW8sYT1yKTticmVhaztjYXNlIGwuQzp0LmJlemllckN1cnZlVG8oc1tkKytdLHNbZCsrXSxzW2QrK10sc1tkKytdLHNbZCsrXSxzW2QrK10pLG49c1tkLTJdLGE9c1tkLTFdO2JyZWFrO2Nhc2UgbC5ROnQucXVhZHJhdGljQ3VydmVUbyhzW2QrK10sc1tkKytdLHNbZCsrXSxzW2QrK10pLG49c1tkLTJdLGE9c1tkLTFdO2JyZWFrO2Nhc2UgbC5BOnZhciBwPXNbZCsrXSx2PXNbZCsrXSx4PXNbZCsrXSxfPXNbZCsrXSxiPXNbZCsrXSx3PXNbZCsrXSxTPXNbZCsrXSxNPXNbZCsrXSxJPXg+Xz94Ol8sVD14Pl8/MTp4L18sQT14Pl8/Xy94OjEsQz1NYXRoLmFicyh4LV8pPi4wMDEsTD1iK3c7Qz8odC50cmFuc2xhdGUocCx2KSx0LnJvdGF0ZShTKSx0LnNjYWxlKFQsQSksdC5hcmMoMCwwLEksYixMLDEtTSksdC5zY2FsZSgxL1QsMS9BKSx0LnJvdGF0ZSgtUyksdC50cmFuc2xhdGUoLXAsLXYpKTp0LmFyYyhwLHYsSSxiLEwsMS1NKSwxPT1kJiYoZT1nKGIpKngrcCxpPW0oYikqXyt2KSxuPWcoTCkqeCtwLGE9bShMKSpfK3Y7YnJlYWs7Y2FzZSBsLlI6ZT1uPXNbZF0saT1hPXNbZCsxXSx0LnJlY3Qoc1tkKytdLHNbZCsrXSxzW2QrK10sc1tkKytdKTticmVhaztjYXNlIGwuWjp0LmNsb3NlUGF0aCgpLG49ZSxhPWl9fX19LF8uQ01EPWwsdC5leHBvcnRzPV99LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoJiZudWxsPT10W2VdOyllKys7cmV0dXJuIHRbZV19ZnVuY3Rpb24gYSh0KXt2YXIgZT1uKHQpO3JldHVybiBudWxsIT1lJiYhYy5pc0FycmF5KHAoZSkpfWZ1bmN0aW9uIG8odCxlLGkpe3Q9dHx8W107dmFyIG49ZS5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSxvPW1bbl0scj1mLmdldChuKSxzPXtlbmNvZGVEZWY6ZS5nZXQoImVuY29kZSIpLGRpbXNEZWY6ZS5nZXQoImRpbWVuc2lvbnMiKX0sdj1vJiZvKHQsZSxpLHMpLHk9diYmdi5kaW1lbnNpb25zO3l8fCh5PXImJihyLmdldERpbWVuc2lvbnNJbmZvP3IuZ2V0RGltZW5zaW9uc0luZm8oKTpyLmRpbWVuc2lvbnMuc2xpY2UoKSl8fFsieCIsInkiXSx5PWgoeSx0LHMpKTt2YXIgeD12P3YuY2F0ZWdvcnlJbmRleDotMSxfPW5ldyB1KHksZSksYj1sKHYsdCksdz17fSxTPXg+PTAmJmEodCk/ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIGQuaXNEYXRhSXRlbU9wdGlvbih0KSYmKF8uaGFzSXRlbU9wdGlvbj0hMCksbj09PXg/aTpnKHAodCkseVtuXSl9OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXAodCksbz1nKGEmJmFbbl0seVtuXSk7ZC5pc0RhdGFJdGVtT3B0aW9uKHQpJiYoXy5oYXNJdGVtT3B0aW9uPSEwKTt2YXIgcj12JiZ2LmNhdGVnb3J5QXhlc01vZGVscztyZXR1cm4gciYmcltlXSYmInN0cmluZyI9PXR5cGVvZiBvJiYod1tlXT13W2VdfHxyW2VdLmdldENhdGVnb3JpZXMoKSxvPWMuaW5kZXhPZih3W2VdLG8pLG88MCYmIWlzTmFOKG8pJiYobz0rbykpLG99O3JldHVybiBfLmhhc0l0ZW1PcHRpb249ITEsXy5pbml0RGF0YSh0LGIsUyksX31mdW5jdGlvbiByKHQpe3JldHVybiJjYXRlZ29yeSIhPT10JiYidGltZSIhPT10fWZ1bmN0aW9uIHModCl7cmV0dXJuImNhdGVnb3J5Ij09PXQ/Im9yZGluYWwiOiJ0aW1lIj09PXQ/InRpbWUiOiJmbG9hdCJ9ZnVuY3Rpb24gbCh0LGUpe3ZhciBpLG49W10sYT10JiZ0LmRpbWVuc2lvbnNbdC5jYXRlZ29yeUluZGV4XTtpZihhJiYoaT10LmNhdGVnb3J5QXhlc01vZGVsc1thLm5hbWVdKSxpKXt2YXIgbz1pLmdldENhdGVnb3JpZXMoKTtpZihvKXt2YXIgcj1lLmxlbmd0aDtpZihjLmlzQXJyYXkoZVswXSkmJmVbMF0ubGVuZ3RoPjEpe249W107Zm9yKHZhciBzPTA7czxyO3MrKyluW3NdPW9bZVtzXVt0LmNhdGVnb3J5SW5kZXh8fDBdXX1lbHNlIG49by5zbGljZSgwKX19cmV0dXJuIG59dmFyIHU9aSgxNCksaD1pKDI1KSxjPWkoMSksZD1pKDUpLGY9aSgyNikscD1kLmdldERhdGFJdGVtVmFsdWUsZz1kLmNvbnZlckRhdGFWYWx1ZSxtPXtjYXJ0ZXNpYW4yZDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1jLm1hcChbInhBeGlzIiwieUF4aXMiXSxmdW5jdGlvbih0KXtyZXR1cm4gaS5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOnQsaW5kZXg6ZS5nZXQodCsiSW5kZXgiKSxpZDplLmdldCh0KyJJZCIpfSlbMF19KSxvPWFbMF0sbD1hWzFdLHU9by5nZXQoInR5cGUiKSxkPWwuZ2V0KCJ0eXBlIiksZj1be25hbWU6IngiLHR5cGU6cyh1KSxzdGFja2FibGU6cih1KX0se25hbWU6InkiLHR5cGU6cyhkKSxzdGFja2FibGU6cihkKX1dLHA9ImNhdGVnb3J5Ij09PXUsZz0iY2F0ZWdvcnkiPT09ZDtmPWgoZix0LG4pO3ZhciBtPXt9O3JldHVybiBwJiYobS54PW8pLGcmJihtLnk9bCkse2RpbWVuc2lvbnM6ZixjYXRlZ29yeUluZGV4OnA/MDpnPzE6LTEsY2F0ZWdvcnlBeGVzTW9kZWxzOm19fSxzaW5nbGVBeGlzOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPWkucXVlcnlDb21wb25lbnRzKHttYWluVHlwZToic2luZ2xlQXhpcyIsaW5kZXg6ZS5nZXQoInNpbmdsZUF4aXNJbmRleCIpLGlkOmUuZ2V0KCJzaW5nbGVBeGlzSWQiKX0pWzBdLG89YS5nZXQoInR5cGUiKSxsPSJjYXRlZ29yeSI9PT1vLHU9W3tuYW1lOiJzaW5nbGUiLHR5cGU6cyhvKSxzdGFja2FibGU6cihvKX1dO3U9aCh1LHQsbik7dmFyIGM9e307cmV0dXJuIGwmJihjLnNpbmdsZT1hKSx7ZGltZW5zaW9uczp1LGNhdGVnb3J5SW5kZXg6bD8wOi0xLGNhdGVnb3J5QXhlc01vZGVsczpjfX0scG9sYXI6ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9aS5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJwb2xhciIsaW5kZXg6ZS5nZXQoInBvbGFySW5kZXgiKSxpZDplLmdldCgicG9sYXJJZCIpfSlbMF0sbz1hLmZpbmRBeGlzTW9kZWwoImFuZ2xlQXhpcyIpLGw9YS5maW5kQXhpc01vZGVsKCJyYWRpdXNBeGlzIiksdT1sLmdldCgidHlwZSIpLGM9by5nZXQoInR5cGUiKSxkPVt7bmFtZToicmFkaXVzIix0eXBlOnModSksc3RhY2thYmxlOnIodSl9LHtuYW1lOiJhbmdsZSIsdHlwZTpzKGMpLHN0YWNrYWJsZTpyKGMpfV0sZj0iY2F0ZWdvcnkiPT09YyxwPSJjYXRlZ29yeSI9PT11O2Q9aChkLHQsbik7dmFyIGc9e307cmV0dXJuIHAmJihnLnJhZGl1cz1sKSxmJiYoZy5hbmdsZT1vKSx7ZGltZW5zaW9uczpkLGNhdGVnb3J5SW5kZXg6Zj8xOnA/MDotMSxjYXRlZ29yeUF4ZXNNb2RlbHM6Z319LGdlbzpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm57ZGltZW5zaW9uczpoKFt7bmFtZToibG5nIn0se25hbWU6ImxhdCJ9XSx0LG4pfX19O3QuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT17fTt0LmV4cG9ydHM9e3JlZ2lzdGVyOmZ1bmN0aW9uKHQsZSl7aVt0XT1lfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF19fX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4oKXt0aGlzLmdyb3VwPW5ldyByLHRoaXMudWlkPXMuZ2V0VUlEKCJ2aWV3Q2hhcnQiKX1mdW5jdGlvbiBhKHQsZSl7aWYodCYmKHQudHJpZ2dlcihlKSwiZ3JvdXAiPT09dC50eXBlKSlmb3IodmFyIGk9MDtpPHQuY2hpbGRDb3VudCgpO2krKylhKHQuY2hpbGRBdChpKSxlKX1mdW5jdGlvbiBvKHQsZSxpKXt2YXIgbj11LnF1ZXJ5RGF0YUluZGV4KHQsZSk7bnVsbCE9bj9oLmVhY2godS5ub3JtYWxpemVUb0FycmF5KG4pLGZ1bmN0aW9uKGUpe2EodC5nZXRJdGVtR3JhcGhpY0VsKGUpLGkpfSk6dC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0KXthKHQsaSl9KX12YXIgcj1pKDM2KSxzPWkoNTApLGw9aSgxNSksdT1pKDUpLGg9aSgxKTtuLnByb3RvdHlwZT17dHlwZToiY2hhcnQiLGluaXQ6ZnVuY3Rpb24odCxlKXt9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXt9LGhpZ2hsaWdodDpmdW5jdGlvbih0LGUsaSxuKXtvKHQuZ2V0RGF0YSgpLG4sImVtcGhhc2lzIil9LGRvd25wbGF5OmZ1bmN0aW9uKHQsZSxpLG4pe28odC5nZXREYXRhKCksbiwibm9ybWFsIil9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9fTt2YXIgYz1uLnByb3RvdHlwZTtjLnVwZGF0ZVZpZXc9Yy51cGRhdGVMYXlvdXQ9Yy51cGRhdGVWaXN1YWw9ZnVuY3Rpb24odCxlLGksbil7dGhpcy5yZW5kZXIodCxlLGksbil9LGwuZW5hYmxlQ2xhc3NFeHRlbmQobixbImRpc3Bvc2UiXSksbC5lbmFibGVDbGFzc01hbmFnZW1lbnQobix7cmVnaXN0ZXJXaGVuRXh0ZW5kOiEwfSksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdWzFdfHwodFtlXVsxXT10W2VdWzBdKTtyZXR1cm4gZnVuY3Rpb24oZSxpKXtmb3IodmFyIGE9e30sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcj10W29dWzFdO2lmKCEoZSYmbi5pbmRleE9mKGUscik+PTB8fGkmJm4uaW5kZXhPZihpLHIpPDApKXt2YXIgcz10aGlzLmdldFNoYWxsb3cocik7bnVsbCE9cyYmKGFbdFtvXVswXV09cyl9fXJldHVybiBhfX19LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgzKSxhPWkoMSksbz1pKDIpO2koNjApLGkoMTIyKSxvLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6ImdyaWQiLHJlbmRlcjpmdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciKSYmdGhpcy5ncm91cC5hZGQobmV3IG4uUmVjdCh7c2hhcGU6dC5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKSxzdHlsZTphLmRlZmF1bHRzKHtmaWxsOnQuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKX0sdC5nZXRJdGVtU3R5bGUoKSksc2lsZW50OiEwLHoyOi0xfSkpfX0pLG8ucmVnaXN0ZXJQcmVwcm9jZXNzb3IoZnVuY3Rpb24odCl7dC54QXhpcyYmdC55QXhpcyYmIXQuZ3JpZCYmKHQuZ3JpZD17fSl9KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXt2YXIgaT10WzFdLXRbMF0sbj1lLGE9aS9uLzI7dFswXSs9YSx0WzFdLT1hfXZhciBhPWkoNCksbz1hLmxpbmVhck1hcCxyPWkoMSkscz1pKDE4KSxsPVswLDFdLHU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuZGltPXQsdGhpcy5zY2FsZT1lLHRoaXMuX2V4dGVudD1pfHxbMCwwXSx0aGlzLmludmVyc2U9ITEsdGhpcy5vbkJhbmQ9ITEsdGhpcy5fbGFiZWxJbnRlcnZhbH07dS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnUsY29udGFpbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQsaT1NYXRoLm1pbihlWzBdLGVbMV0pLG49TWF0aC5tYXgoZVswXSxlWzFdKTtyZXR1cm4gdD49aSYmdDw9bn0sY29udGFpbkRhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGFpbih0aGlzLmRhdGFUb0Nvb3JkKHQpKX0sZ2V0RXh0ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V4dGVudC5zbGljZSgpfSxnZXRQaXhlbFByZWNpc2lvbjpmdW5jdGlvbih0KXtyZXR1cm4gYS5nZXRQaXhlbFByZWNpc2lvbih0fHx0aGlzLnNjYWxlLmdldEV4dGVudCgpLHRoaXMuX2V4dGVudCl9LHNldEV4dGVudDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V4dGVudDtpWzBdPXQsaVsxXT1lfSxkYXRhVG9Db29yZDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V4dGVudCxhPXRoaXMuc2NhbGU7cmV0dXJuIHQ9YS5ub3JtYWxpemUodCksdGhpcy5vbkJhbmQmJiJvcmRpbmFsIj09PWEudHlwZSYmKGk9aS5zbGljZSgpLG4oaSxhLmNvdW50KCkpKSxvKHQsbCxpLGUpfSxjb29yZFRvRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V4dGVudCxhPXRoaXMuc2NhbGU7dGhpcy5vbkJhbmQmJiJvcmRpbmFsIj09PWEudHlwZSYmKGk9aS5zbGljZSgpLG4oaSxhLmNvdW50KCkpKTt2YXIgcj1vKHQsaSxsLGUpO3JldHVybiB0aGlzLnNjYWxlLnNjYWxlKHIpfSxwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe30sZ2V0VGlja3NDb29yZHM6ZnVuY3Rpb24odCl7aWYodGhpcy5vbkJhbmQmJiF0KXtmb3IodmFyIGU9dGhpcy5nZXRCYW5kcygpLGk9W10sbj0wO248ZS5sZW5ndGg7bisrKWkucHVzaChlW25dWzBdKTtyZXR1cm4gZVtuLTFdJiZpLnB1c2goZVtuLTFdWzFdKSxpfXJldHVybiByLm1hcCh0aGlzLnNjYWxlLmdldFRpY2tzKCksdGhpcy5kYXRhVG9Db29yZCx0aGlzKX0sZ2V0TGFiZWxzQ29vcmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHIubWFwKHRoaXMuc2NhbGUuZ2V0VGlja3MoKSx0aGlzLmRhdGFUb0Nvb3JkLHRoaXMpfSxnZXRCYW5kczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmdldEV4dGVudCgpLGU9W10saT10aGlzLnNjYWxlLmNvdW50KCksbj10WzBdLGE9dFsxXSxvPWEtbixyPTA7cjxpO3IrKyllLnB1c2goW28qci9pK24sbyoocisxKS9pK25dKTtyZXR1cm4gZX0sZ2V0QmFuZFdpZHRoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZXh0ZW50LGU9dGhpcy5zY2FsZS5nZXRFeHRlbnQoKSxpPWVbMV0tZVswXSsodGhpcy5vbkJhbmQ/MTowKTswPT09aSYmKGk9MSk7dmFyIG49TWF0aC5hYnModFsxXS10WzBdKTtyZXR1cm4gTWF0aC5hYnMobikvaX0sZ2V0TGFiZWxJbnRlcnZhbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2xhYmVsSW50ZXJ2YWw7aWYoIXQpe3ZhciBlPXRoaXMubW9kZWwsaT1lLmdldE1vZGVsKCJheGlzTGFiZWwiKSxuPWkuZ2V0KCJpbnRlcnZhbCIpOyJjYXRlZ29yeSIhPT10aGlzLnR5cGV8fCJhdXRvIiE9PW4/dD0iYXV0byI9PT1uPzA6bjp0aGlzLmlzSG9yaXpvbnRhbCYmKHQ9cy5nZXRBeGlzTGFiZWxJbnRlcnZhbChyLm1hcCh0aGlzLnNjYWxlLmdldFRpY2tzKCksdGhpcy5kYXRhVG9Db29yZCx0aGlzKSxlLmdldEZvcm1hdHRlZExhYmVscygpLGkuZ2V0Rm9udCgpLHRoaXMuaXNIb3Jpem9udGFsKCkpKSx0aGlzLl9sYWJlbEludGVydmFsPXR9cmV0dXJuIHR9fSx0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7dGhpcy5fc2V0dGluZz10fHx7fSx0aGlzLl9leHRlbnQ9WzEvMCwtKDEvMCldLHRoaXMuX2ludGVydmFsPTAsdGhpcy5pbml0JiZ0aGlzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBhPWkoMTUpLG89bi5wcm90b3R5cGU7by5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sby5nZXRTZXR0aW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zZXR0aW5nW3RdfSxvLmNvbnRhaW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZXh0ZW50O3JldHVybiB0Pj1lWzBdJiZ0PD1lWzFdfSxvLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQ7cmV0dXJuIGVbMV09PT1lWzBdPy41Oih0LWVbMF0pLyhlWzFdLWVbMF0pfSxvLnNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDtyZXR1cm4gdCooZVsxXS1lWzBdKStlWzBdfSxvLnVuaW9uRXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDt0WzBdPGVbMF0mJihlWzBdPXRbMF0pLHRbMV0+ZVsxXSYmKGVbMV09dFsxXSl9LG8udW5pb25FeHRlbnRGcm9tRGF0YT1mdW5jdGlvbih0LGUpe3RoaXMudW5pb25FeHRlbnQodC5nZXREYXRhRXh0ZW50KGUsITApKX0sby5nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXh0ZW50LnNsaWNlKCl9LG8uc2V0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZXh0ZW50O2lzTmFOKHQpfHwoaVswXT10KSxpc05hTihlKXx8KGlbMV09ZSl9LG8uZ2V0VGlja3NMYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzLmdldFRpY2tzKCksaT0wO2k8ZS5sZW5ndGg7aSsrKXQucHVzaCh0aGlzLmdldExhYmVsKGVbaV0pKTtyZXR1cm4gdH0sby5pc0JsYW5rPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQmxhbmt9LG8uc2V0Qmxhbms9ZnVuY3Rpb24odCl7dGhpcy5faXNCbGFuaz10fSxhLmVuYWJsZUNsYXNzRXh0ZW5kKG4pLGEuZW5hYmxlQ2xhc3NNYW5hZ2VtZW50KG4se3JlZ2lzdGVyV2hlbkV4dGVuZDohMH0pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUpe3ZhciBpPTE7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJihpPU1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxLDEpKTt2YXIgbj17ZGVidWdNb2RlOjAsZGV2aWNlUGl4ZWxSYXRpbzppfTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDY5KSxvPWkoMTIpLHI9ZnVuY3Rpb24odCl7dD10fHx7fSxhLmNhbGwodGhpcyx0KTtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodGhpc1tlXT10W2VdKTt0aGlzLl9jaGlsZHJlbj1bXSx0aGlzLl9fc3RvcmFnZT1udWxsLHRoaXMuX19kaXJ0eT0hMH07ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIsaXNHcm91cDohMCx0eXBlOiJncm91cCIsc2lsZW50OiExLGNoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLnNsaWNlKCl9LGNoaWxkQXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuW3RdfSxjaGlsZE9mTmFtZTpmdW5jdGlvbih0KXsKZm9yKHZhciBlPXRoaXMuX2NoaWxkcmVuLGk9MDtpPGUubGVuZ3RoO2krKylpZihlW2ldLm5hbWU9PT10KXJldHVybiBlW2ldfSxjaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aH0sYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0IT09dGhpcyYmdC5wYXJlbnQhPT10aGlzJiYodGhpcy5fY2hpbGRyZW4ucHVzaCh0KSx0aGlzLl9kb0FkZCh0KSksdGhpc30sYWRkQmVmb3JlOmZ1bmN0aW9uKHQsZSl7aWYodCYmdCE9PXRoaXMmJnQucGFyZW50IT09dGhpcyYmZSYmZS5wYXJlbnQ9PT10aGlzKXt2YXIgaT10aGlzLl9jaGlsZHJlbixuPWkuaW5kZXhPZihlKTtuPj0wJiYoaS5zcGxpY2UobiwwLHQpLHRoaXMuX2RvQWRkKHQpKX1yZXR1cm4gdGhpc30sX2RvQWRkOmZ1bmN0aW9uKHQpe3QucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCksdC5wYXJlbnQ9dGhpczt2YXIgZT10aGlzLl9fc3RvcmFnZSxpPXRoaXMuX196cjtlJiZlIT09dC5fX3N0b3JhZ2UmJihlLmFkZFRvU3RvcmFnZSh0KSx0IGluc3RhbmNlb2YgciYmdC5hZGRDaGlsZHJlblRvU3RvcmFnZShlKSksaSYmaS5yZWZyZXNoKCl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fenIsaT10aGlzLl9fc3RvcmFnZSxhPXRoaXMuX2NoaWxkcmVuLG89bi5pbmRleE9mKGEsdCk7cmV0dXJuIG88MD90aGlzOihhLnNwbGljZShvLDEpLHQucGFyZW50PW51bGwsaSYmKGkuZGVsRnJvbVN0b3JhZ2UodCksdCBpbnN0YW5jZW9mIHImJnQuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZShpKSksZSYmZS5yZWZyZXNoKCksdGhpcyl9LHJlbW92ZUFsbDpmdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLl9jaGlsZHJlbixuPXRoaXMuX19zdG9yYWdlO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspdD1pW2VdLG4mJihuLmRlbEZyb21TdG9yYWdlKHQpLHQgaW5zdGFuY2VvZiByJiZ0LmRlbENoaWxkcmVuRnJvbVN0b3JhZ2UobikpLHQucGFyZW50PW51bGw7cmV0dXJuIGkubGVuZ3RoPTAsdGhpc30sZWFjaENoaWxkOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuX2NoaWxkcmVuLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIGE9aVtuXTt0LmNhbGwoZSxhLG4pfXJldHVybiB0aGlzfSx0cmF2ZXJzZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8dGhpcy5fY2hpbGRyZW4ubGVuZ3RoO2krKyl7dmFyIG49dGhpcy5fY2hpbGRyZW5baV07dC5jYWxsKGUsbiksImdyb3VwIj09PW4udHlwZSYmbi50cmF2ZXJzZSh0LGUpfXJldHVybiB0aGlzfSxhZGRDaGlsZHJlblRvU3RvcmFnZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuX2NoaWxkcmVuW2VdO3QuYWRkVG9TdG9yYWdlKGkpLGkgaW5zdGFuY2VvZiByJiZpLmFkZENoaWxkcmVuVG9TdG9yYWdlKHQpfX0sZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuX2NoaWxkcmVuW2VdO3QuZGVsRnJvbVN0b3JhZ2UoaSksaSBpbnN0YW5jZW9mIHImJmkuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZSh0KX19LGRpcnR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kaXJ0eT0hMCx0aGlzLl9fenImJnRoaXMuX196ci5yZWZyZXNoKCksdGhpc30sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLGk9bmV3IG8oMCwwLDAsMCksbj10fHx0aGlzLl9jaGlsZHJlbixhPVtdLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIHM9bltyXTtpZighcy5pZ25vcmUmJiFzLmludmlzaWJsZSl7dmFyIGw9cy5nZXRCb3VuZGluZ1JlY3QoKSx1PXMuZ2V0TG9jYWxUcmFuc2Zvcm0oYSk7dT8oaS5jb3B5KGwpLGkuYXBwbHlUcmFuc2Zvcm0odSksZT1lfHxpLmNsb25lKCksZS51bmlvbihpKSk6KGU9ZXx8bC5jbG9uZSgpLGUudW5pb24obCkpfX1yZXR1cm4gZXx8aX19LG4uaW5oZXJpdHMocixhKSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlKXt2YXIgaT17fSxuPSJcMF9fdGhyb3R0bGVPcmlnaW5NZXRob2QiLGE9IlwwX190aHJvdHRsZVJhdGUiLG89IlwwX190aHJvdHRsZVR5cGUiO2kudGhyb3R0bGU9ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4oKXtoPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGM9bnVsbCx0LmFwcGx5KHIsc3x8W10pfXZhciBhLG8scixzLGwsdT0wLGg9MCxjPW51bGw7ZT1lfHwwO3ZhciBkPWZ1bmN0aW9uKCl7YT0obmV3IERhdGUpLmdldFRpbWUoKSxyPXRoaXMscz1hcmd1bWVudHM7dmFyIHQ9bHx8ZSxkPWx8fGk7bD1udWxsLG89YS0oZD91OmgpLXQsY2xlYXJUaW1lb3V0KGMpLGQ/Yz1zZXRUaW1lb3V0KG4sdCk6bz49MD9uKCk6Yz1zZXRUaW1lb3V0KG4sLW8pLHU9YX07cmV0dXJuIGQuY2xlYXI9ZnVuY3Rpb24oKXtjJiYoY2xlYXJUaW1lb3V0KGMpLGM9bnVsbCl9LGQuZGVib3VuY2VOZXh0Q2FsbD1mdW5jdGlvbih0KXtsPXR9LGR9LGkuY3JlYXRlT3JVcGRhdGU9ZnVuY3Rpb24odCxlLHIscyl7dmFyIGw9dFtlXTtpZihsKXt2YXIgdT1sW25dfHxsLGg9bFtvXSxjPWxbYV07aWYoYyE9PXJ8fGghPT1zKXtpZihudWxsPT1yfHwhcylyZXR1cm4gdFtlXT11O2w9dFtlXT1pLnRocm90dGxlKHUsciwiZGVib3VuY2UiPT09cyksbFtuXT11LGxbb109cyxsW2FdPXJ9cmV0dXJuIGx9fSxpLmNsZWFyPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dFtlXTtpJiZpW25dJiYodFtlXT1pW25dKX0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3Q9dHx8e30sci5jYWxsKHRoaXMsdCk7Zm9yKHZhciBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmInN0eWxlIiE9PWUmJih0aGlzW2VdPXRbZV0pO3RoaXMuc3R5bGU9bmV3IG8odC5zdHlsZSx0aGlzKSx0aGlzLl9yZWN0PW51bGwsdGhpcy5fX2NsaXBQYXRocz1bXX12YXIgYT1pKDEpLG89aSg3Nikscj1pKDY5KSxzPWkoOTIpO24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHR5cGU6ImRpc3BsYXlhYmxlIixfX2RpcnR5OiEwLGludmlzaWJsZTohMSx6OjAsejI6MCx6bGV2ZWw6MCxkcmFnZ2FibGU6ITEsZHJhZ2dpbmc6ITEsc2lsZW50OiExLGN1bGxpbmc6ITEsY3Vyc29yOiJwb2ludGVyIixyZWN0SG92ZXI6ITEscHJvZ3Jlc3NpdmU6LTEsYmVmb3JlQnJ1c2g6ZnVuY3Rpb24odCl7fSxhZnRlckJydXNoOmZ1bmN0aW9uKHQpe30sYnJ1c2g6ZnVuY3Rpb24odCxlKXt9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe30sY29udGFpbjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlY3RDb250YWluKHQsZSl9LHRyYXZlcnNlOmZ1bmN0aW9uKHQsZSl7dC5jYWxsKGUsdGhpcyl9LHJlY3RDb250YWluOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Db29yZFRvTG9jYWwodCxlKSxuPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIG4uY29udGFpbihpWzBdLGlbMV0pfSxkaXJ0eTpmdW5jdGlvbigpe3RoaXMuX19kaXJ0eT0hMCx0aGlzLl9yZWN0PW51bGwsdGhpcy5fX3pyJiZ0aGlzLl9fenIucmVmcmVzaCgpfSxhbmltYXRlU3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5pbWF0ZSgic3R5bGUiLHQpfSxhdHRyS1Y6ZnVuY3Rpb24odCxlKXsic3R5bGUiIT09dD9yLnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLHQsZSk6dGhpcy5zdHlsZS5zZXQoZSl9LHNldFN0eWxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuc2V0KHQsZSksdGhpcy5kaXJ0eSghMSksdGhpc30sdXNlU3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGU9bmV3IG8odCx0aGlzKSx0aGlzLmRpcnR5KCExKSx0aGlzfX0sYS5pbmhlcml0cyhuLHIpLGEubWl4aW4obixzKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgaT1mdW5jdGlvbih0KXt0aGlzLmNvbG9yU3RvcHM9dHx8W119O2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppLGFkZENvbG9yU3RvcDpmdW5jdGlvbih0LGUpe3RoaXMuY29sb3JTdG9wcy5wdXNoKHtvZmZzZXQ6dCxjb2xvcjplfSl9fSx0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7dmFyIGU9e2NvbXBvbmVudFR5cGU6dC5tYWluVHlwZX07cmV0dXJuIGVbdC5tYWluVHlwZSsiSW5kZXgiXT10LmNvbXBvbmVudEluZGV4LGV9ZnVuY3Rpb24gYSh0LGUsaSxuKXt2YXIgYSxvLHI9dihpLXQucm90YXRpb24pLHM9blswXT5uWzFdLGw9InN0YXJ0Ij09PWUmJiFzfHwic3RhcnQiIT09ZSYmcztyZXR1cm4geShyLVMvMik/KG89bD8iYm90dG9tIjoidG9wIixhPSJjZW50ZXIiKTp5KHItMS41KlMpPyhvPWw/InRvcCI6ImJvdHRvbSIsYT0iY2VudGVyIik6KG89Im1pZGRsZSIsYT1yPDEuNSpTJiZyPlMvMj9sPyJsZWZ0IjoicmlnaHQiOmw/InJpZ2h0IjoibGVmdCIpLHtyb3RhdGlvbjpyLHRleHRBbGlnbjphLHRleHRWZXJ0aWNhbEFsaWduOm99fWZ1bmN0aW9uIG8odCl7dmFyIGU9dC5nZXQoInRvb2x0aXAiKTtyZXR1cm4gdC5nZXQoInNpbGVudCIpfHwhKHQuZ2V0KCJ0cmlnZ2VyRXZlbnQiKXx8ZSYmZS5zaG93KX1mdW5jdGlvbiByKHQsZSxpKXt2YXIgbj10LmdldCgiYXhpc0xhYmVsLnNob3dNaW5MYWJlbCIpLGE9dC5nZXQoImF4aXNMYWJlbC5zaG93TWF4TGFiZWwiKTtlPWV8fFtdLGk9aXx8W107dmFyIG89ZVswXSxyPWVbMV0sdT1lW2UubGVuZ3RoLTFdLGg9ZVtlLmxlbmd0aC0yXSxjPWlbMF0sZD1pWzFdLGY9aVtpLmxlbmd0aC0xXSxwPWlbaS5sZW5ndGgtMl07bj09PSExPyhzKG8pLHMoYykpOmwobyxyKSYmKG4/KHMocikscyhkKSk6KHMobykscyhjKSkpLGE9PT0hMT8ocyh1KSxzKGYpKTpsKGgsdSkmJihhPyhzKGgpLHMocCkpOihzKHUpLHMoZikpKX1mdW5jdGlvbiBzKHQpe3QmJih0Lmlnbm9yZT0hMCl9ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG49dCYmdC5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpLGE9ZSYmZS5nZXRCb3VuZGluZ1JlY3QoKS5jbG9uZSgpO2lmKG4mJmEpe3ZhciBvPV8uaWRlbnRpdHkoW10pO3JldHVybiBfLnJvdGF0ZShvLG8sLXQucm90YXRpb24pLG4uYXBwbHlUcmFuc2Zvcm0oXy5tdWwoW10sbyx0LmdldExvY2FsVHJhbnNmb3JtKCkpKSxhLmFwcGx5VHJhbnNmb3JtKF8ubXVsKFtdLG8sZS5nZXRMb2NhbFRyYW5zZm9ybSgpKSksbi5pbnRlcnNlY3QoYSl9fWZ1bmN0aW9uIHUodCl7cmV0dXJuIm1pZGRsZSI9PT10fHwiY2VudGVyIj09PXR9ZnVuY3Rpb24gaCh0LGUsaSl7dmFyIG49ZS5heGlzO2lmKGUuZ2V0KCJheGlzVGljay5zaG93IikmJiFuLnNjYWxlLmlzQmxhbmsoKSl7Zm9yKHZhciBhPWUuZ2V0TW9kZWwoImF4aXNUaWNrIiksbz1hLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxyPWEuZ2V0KCJsZW5ndGgiKSxzPUMoYSxpLmxhYmVsSW50ZXJ2YWwpLGw9bi5nZXRUaWNrc0Nvb3JkcyhhLmdldCgiYWxpZ25XaXRoTGFiZWwiKSksdT1uLnNjYWxlLmdldFRpY2tzKCksaD1lLmdldCgiYXhpc0xhYmVsLnNob3dNaW5MYWJlbCIpLGM9ZS5nZXQoImF4aXNMYWJlbC5zaG93TWF4TGFiZWwiKSxmPVtdLGc9W10sbT10Ll90cmFuc2Zvcm0sdj1bXSx5PWwubGVuZ3RoLHg9MDt4PHk7eCsrKWlmKCFBKG4seCxzLHksaCxjKSl7dmFyIF89bFt4XTtmWzBdPV8sZlsxXT0wLGdbMF09XyxnWzFdPWkudGlja0RpcmVjdGlvbipyLG0mJihiKGYsZixtKSxiKGcsZyxtKSk7dmFyIHc9bmV3IHAuTGluZShwLnN1YlBpeGVsT3B0aW1pemVMaW5lKHthbmlkOiJ0aWNrXyIrdVt4XSxzaGFwZTp7eDE6ZlswXSx5MTpmWzFdLHgyOmdbMF0seTI6Z1sxXX0sc3R5bGU6ZC5kZWZhdWx0cyhvLmdldExpbmVTdHlsZSgpLHtzdHJva2U6ZS5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpfSksejI6MixzaWxlbnQ6ITB9KSk7dC5ncm91cC5hZGQodyksdi5wdXNoKHcpfXJldHVybiB2fX1mdW5jdGlvbiBjKHQsZSxpKXt2YXIgYT1lLmF4aXMscj13KGkuYXhpc0xhYmVsU2hvdyxlLmdldCgiYXhpc0xhYmVsLnNob3ciKSk7aWYociYmIWEuc2NhbGUuaXNCbGFuaygpKXt2YXIgcz1lLmdldE1vZGVsKCJheGlzTGFiZWwiKSxsPXMuZ2V0KCJtYXJnaW4iKSx1PWEuc2NhbGUuZ2V0VGlja3MoKSxoPWUuZ2V0Rm9ybWF0dGVkTGFiZWxzKCksYz0odyhpLmxhYmVsUm90YXRlLHMuZ2V0KCJyb3RhdGUiKSl8fDApKlMvMTgwLGY9VChpLnJvdGF0aW9uLGMsaS5sYWJlbERpcmVjdGlvbiksbT1lLmdldCgiZGF0YSIpLHY9W10seT1vKGUpLHg9ZS5nZXQoInRyaWdnZXJFdmVudCIpLF89ZS5nZXQoImF4aXNMYWJlbC5zaG93TWluTGFiZWwiKSxiPWUuZ2V0KCJheGlzTGFiZWwuc2hvd01heExhYmVsIik7cmV0dXJuIGQuZWFjaCh1LGZ1bmN0aW9uKG8scil7aWYoIUEoYSxyLGkubGFiZWxJbnRlcnZhbCx1Lmxlbmd0aCxfLGIpKXt2YXIgYz1zO20mJm1bb10mJm1bb10udGV4dFN0eWxlJiYoYz1uZXcgZyhtW29dLnRleHRTdHlsZSxzLGUuZWNNb2RlbCkpO3ZhciBkPWMuZ2V0VGV4dENvbG9yKCl8fGUuZ2V0KCJheGlzTGluZS5saW5lU3R5bGUuY29sb3IiKSx3PWEuZGF0YVRvQ29vcmQobyksUz1bdyxpLmxhYmVsT2Zmc2V0K2kubGFiZWxEaXJlY3Rpb24qbF0sTT1hLnNjYWxlLmdldExhYmVsKG8pLEk9bmV3IHAuVGV4dCh7YW5pZDoibGFiZWxfIitvLHBvc2l0aW9uOlMscm90YXRpb246Zi5yb3RhdGlvbixzaWxlbnQ6eSx6MjoxMH0pO3Auc2V0VGV4dFN0eWxlKEkuc3R5bGUsYyx7dGV4dDpoW3JdLHRleHRBbGlnbjpjLmdldFNoYWxsb3coImFsaWduIiwhMCl8fGYudGV4dEFsaWduLHRleHRWZXJ0aWNhbEFsaWduOmMuZ2V0U2hhbGxvdygidmVydGljYWxBbGlnbiIsITApfHxjLmdldFNoYWxsb3coImJhc2VsaW5lIiwhMCl8fGYudGV4dFZlcnRpY2FsQWxpZ24sdGV4dEZpbGw6ImZ1bmN0aW9uIj09dHlwZW9mIGQ/ZCgiY2F0ZWdvcnkiPT09YS50eXBlP006InZhbHVlIj09PWEudHlwZT9vKyIiOm8scik6ZH0pLHgmJihJLmV2ZW50RGF0YT1uKGUpLEkuZXZlbnREYXRhLnRhcmdldFR5cGU9ImF4aXNMYWJlbCIsSS5ldmVudERhdGEudmFsdWU9TSksdC5fZHVtYkdyb3VwLmFkZChJKSxJLnVwZGF0ZVRyYW5zZm9ybSgpLHYucHVzaChJKSx0Lmdyb3VwLmFkZChJKSxJLmRlY29tcG9zZVRyYW5zZm9ybSgpfX0pLHZ9fXZhciBkPWkoMSksZj1pKDcpLHA9aSgzKSxnPWkoMTEpLG09aSg0KSx2PW0ucmVtUmFkaWFuLHk9bS5pc1JhZGlhbkFyb3VuZFplcm8seD1pKDYpLF89aSgxOSksYj14LmFwcGx5VHJhbnNmb3JtLHc9ZC5yZXRyaWV2ZSxTPU1hdGguUEksTT1mdW5jdGlvbih0LGUpe3RoaXMub3B0PWUsdGhpcy5heGlzTW9kZWw9dCxkLmRlZmF1bHRzKGUse2xhYmVsT2Zmc2V0OjAsbmFtZURpcmVjdGlvbjoxLHRpY2tEaXJlY3Rpb246MSxsYWJlbERpcmVjdGlvbjoxLHNpbGVudDohMH0pLHRoaXMuZ3JvdXA9bmV3IHAuR3JvdXA7dmFyIGk9bmV3IHAuR3JvdXAoe3Bvc2l0aW9uOmUucG9zaXRpb24uc2xpY2UoKSxyb3RhdGlvbjplLnJvdGF0aW9ufSk7aS51cGRhdGVUcmFuc2Zvcm0oKSx0aGlzLl90cmFuc2Zvcm09aS50cmFuc2Zvcm0sdGhpcy5fZHVtYkdyb3VwPWl9O00ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNLGhhc0J1aWxkZXI6ZnVuY3Rpb24odCl7cmV0dXJuISFJW3RdfSxhZGQ6ZnVuY3Rpb24odCl7SVt0XS5jYWxsKHRoaXMpfSxnZXRHcm91cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdyb3VwfX07dmFyIEk9e2F4aXNMaW5lOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHQsZT10aGlzLmF4aXNNb2RlbDtpZihlLmdldCgiYXhpc0xpbmUuc2hvdyIpKXt2YXIgaT10aGlzLmF4aXNNb2RlbC5heGlzLmdldEV4dGVudCgpLG49dGhpcy5fdHJhbnNmb3JtLGE9W2lbMF0sMF0sbz1baVsxXSwwXTtuJiYoYihhLGEsbiksYihvLG8sbikpLHRoaXMuZ3JvdXAuYWRkKG5ldyBwLkxpbmUocC5zdWJQaXhlbE9wdGltaXplTGluZSh7YW5pZDoibGluZSIsc2hhcGU6e3gxOmFbMF0seTE6YVsxXSx4MjpvWzBdLHkyOm9bMV19LHN0eWxlOmQuZXh0ZW5kKHtsaW5lQ2FwOiJyb3VuZCJ9LGUuZ2V0TW9kZWwoImF4aXNMaW5lLmxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpKSxzdHJva2VDb250YWluVGhyZXNob2xkOnQuc3Ryb2tlQ29udGFpblRocmVzaG9sZHx8NSxzaWxlbnQ6ITAsejI6MX0pKSl9fSxheGlzVGlja0xhYmVsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5heGlzTW9kZWwsZT10aGlzLm9wdCxpPWgodGhpcyx0LGUpLG49Yyh0aGlzLHQsZSk7cih0LG4saSl9LGF4aXNOYW1lOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHQsZT10aGlzLmF4aXNNb2RlbCxpPXcodC5heGlzTmFtZSxlLmdldCgibmFtZSIpKTtpZihpKXt2YXIgcixzPWUuZ2V0KCJuYW1lTG9jYXRpb24iKSxsPXQubmFtZURpcmVjdGlvbixoPWUuZ2V0TW9kZWwoIm5hbWVUZXh0U3R5bGUiKSxjPWUuZ2V0KCJuYW1lR2FwIil8fDAsZz10aGlzLmF4aXNNb2RlbC5heGlzLmdldEV4dGVudCgpLG09Z1swXT5nWzFdPy0xOjEsdj1bInN0YXJ0Ij09PXM/Z1swXS1tKmM6ImVuZCI9PT1zP2dbMV0rbSpjOihnWzBdK2dbMV0pLzIsdShzKT90LmxhYmVsT2Zmc2V0K2wqYzowXSx5PWUuZ2V0KCJuYW1lUm90YXRlIik7bnVsbCE9eSYmKHk9eSpTLzE4MCk7dmFyIHg7dShzKT9yPVQodC5yb3RhdGlvbixudWxsIT15P3k6dC5yb3RhdGlvbixsKToocj1hKHQscyx5fHwwLGcpLHg9dC5heGlzTmFtZUF2YWlsYWJsZVdpZHRoLG51bGwhPXgmJih4PU1hdGguYWJzKHgvTWF0aC5zaW4oci5yb3RhdGlvbikpLCFpc0Zpbml0ZSh4KSYmKHg9bnVsbCkpKTt2YXIgXz1oLmdldEZvbnQoKSxiPWUuZ2V0KCJuYW1lVHJ1bmNhdGUiLCEwKXx8e30sTT1iLmVsbGlwc2lzLEk9dyh0Lm5hbWVUcnVuY2F0ZU1heFdpZHRoLGIubWF4V2lkdGgseCksQT1udWxsIT1NJiZudWxsIT1JP2YudHJ1bmNhdGVUZXh0KGksSSxfLE0se21pbkNoYXI6MixwbGFjZWhvbGRlcjpiLnBsYWNlaG9sZGVyfSk6aSxDPWUuZ2V0KCJ0b29sdGlwIiwhMCksTD1lLm1haW5UeXBlLEQ9e2NvbXBvbmVudFR5cGU6TCxuYW1lOmksJHZhcnM6WyJuYW1lIl19O0RbTCsiSW5kZXgiXT1lLmNvbXBvbmVudEluZGV4O3ZhciBQPW5ldyBwLlRleHQoe2FuaWQ6Im5hbWUiLF9fZnVsbFRleHQ6aSxfX3RydW5jYXRlZFRleHQ6QSxwb3NpdGlvbjp2LHJvdGF0aW9uOnIucm90YXRpb24sc2lsZW50Om8oZSksejI6MSx0b29sdGlwOkMmJkMuc2hvdz9kLmV4dGVuZCh7Y29udGVudDppLGZvcm1hdHRlcjpmdW5jdGlvbigpe3JldHVybiBpfSxmb3JtYXR0ZXJQYXJhbXM6RH0sQyk6bnVsbH0pO3Auc2V0VGV4dFN0eWxlKFAuc3R5bGUsaCx7dGV4dDpBLHRleHRGb250Ol8sdGV4dEZpbGw6aC5nZXRUZXh0Q29sb3IoKXx8ZS5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpLHRleHRBbGlnbjpyLnRleHRBbGlnbix0ZXh0VmVydGljYWxBbGlnbjpyLnRleHRWZXJ0aWNhbEFsaWdufSksZS5nZXQoInRyaWdnZXJFdmVudCIpJiYoUC5ldmVudERhdGE9bihlKSxQLmV2ZW50RGF0YS50YXJnZXRUeXBlPSJheGlzTmFtZSIsUC5ldmVudERhdGEubmFtZT1pKSx0aGlzLl9kdW1iR3JvdXAuYWRkKFApLFAudXBkYXRlVHJhbnNmb3JtKCksdGhpcy5ncm91cC5hZGQoUCksUC5kZWNvbXBvc2VUcmFuc2Zvcm0oKX19fSxUPU0uaW5uZXJUZXh0TGF5b3V0PWZ1bmN0aW9uKHQsZSxpKXt2YXIgbixhLG89dihlLXQpO3JldHVybiB5KG8pPyhhPWk+MD8idG9wIjoiYm90dG9tIixuPSJjZW50ZXIiKTp5KG8tUyk/KGE9aT4wPyJib3R0b20iOiJ0b3AiLG49ImNlbnRlciIpOihhPSJtaWRkbGUiLG49bz4wJiZvPFM/aT4wPyJyaWdodCI6ImxlZnQiOmk+MD8ibGVmdCI6InJpZ2h0Iikse3JvdGF0aW9uOm8sdGV4dEFsaWduOm4sdGV4dFZlcnRpY2FsQWxpZ246YX19LEE9TS5pZklnbm9yZU9uVGljaz1mdW5jdGlvbih0LGUsaSxuLGEsbyl7aWYoMD09PWUmJmF8fGU9PT1uLTEmJm8pcmV0dXJuITE7dmFyIHIscz10LnNjYWxlO3JldHVybiJvcmRpbmFsIj09PXMudHlwZSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpPyhyPXMuZ2V0VGlja3MoKVtlXSwhaShyLHMuZ2V0TGFiZWwocikpKTplJShpKzEpKX0sQz1NLmdldEludGVydmFsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoImludGVydmFsIik7cmV0dXJuIG51bGwhPWkmJiJhdXRvIiE9aXx8KGk9ZSksaX07dC5leHBvcnRzPU19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpLG4scyxsKXt2YXIgdT1yLmdldEF4aXNQb2ludGVyQ2xhc3ModC5heGlzUG9pbnRlckNsYXNzKTtpZih1KXt2YXIgaD1vLmdldEF4aXNQb2ludGVyTW9kZWwoZSk7aD8odC5fYXhpc1BvaW50ZXJ8fCh0Ll9heGlzUG9pbnRlcj1uZXcgdSkpLnJlbmRlcihlLGgsbixsKTphKHQsbil9fWZ1bmN0aW9uIGEodCxlLGkpe3ZhciBuPXQuX2F4aXNQb2ludGVyO24mJm4uZGlzcG9zZShlLGkpLHQuX2F4aXNQb2ludGVyPW51bGx9dmFyIG89aSg0Nykscj1pKDIpLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6ImF4aXMiLF9heGlzUG9pbnRlcjpudWxsLGF4aXNQb2ludGVyQ2xhc3M6bnVsbCxyZW5kZXI6ZnVuY3Rpb24odCxlLGksYSl7dGhpcy5heGlzUG9pbnRlckNsYXNzJiZvLmZpeFZhbHVlKHQpLHIuc3VwZXJBcHBseSh0aGlzLCJyZW5kZXIiLGFyZ3VtZW50cyksbih0aGlzLHQsZSxpLGEsITApfSx1cGRhdGVBeGlzUG9pbnRlcjpmdW5jdGlvbih0LGUsaSxhLG8pe24odGhpcyx0LGUsaSxhLCExKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fYXhpc1BvaW50ZXI7aSYmaS5yZW1vdmUoZSksci5zdXBlckFwcGx5KHRoaXMsInJlbW92ZSIsYXJndW1lbnRzKX0sZGlzcG9zZTpmdW5jdGlvbih0LGUpe2EodGhpcyxlKSxyLnN1cGVyQXBwbHkodGhpcywiZGlzcG9zZSIsYXJndW1lbnRzKX19KSxzPVtdO3IucmVnaXN0ZXJBeGlzUG9pbnRlckNsYXNzPWZ1bmN0aW9uKHQsZSl7c1t0XT1lfSxyLmdldEF4aXNQb2ludGVyQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnNbdF19LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gYS5pc09iamVjdCh0KSYmbnVsbCE9dC52YWx1ZT90LnZhbHVlOnQrIiJ9dmFyIGE9aSgxKSxvPWkoMTgpO3QuZXhwb3J0cz17Z2V0Rm9ybWF0dGVkTGFiZWxzOmZ1bmN0aW9uKCl7cmV0dXJuIG8uZ2V0Rm9ybWF0dGVkTGFiZWxzKHRoaXMuYXhpcyx0aGlzLmdldCgiYXhpc0xhYmVsLmZvcm1hdHRlciIpKX0sZ2V0Q2F0ZWdvcmllczpmdW5jdGlvbigpe3JldHVybiJjYXRlZ29yeSI9PT10aGlzLmdldCgidHlwZSIpJiZhLm1hcCh0aGlzLmdldCgiZGF0YSIpLG4pfSxnZXRNaW46ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24saT10fHxudWxsPT1lLnJhbmdlU3RhcnQ/ZS5taW46ZS5yYW5nZVN0YXJ0O3JldHVybiB0aGlzLmF4aXMmJm51bGwhPWkmJiJkYXRhTWluIiE9PWkmJiJmdW5jdGlvbiIhPXR5cGVvZiBpJiYhYS5lcU5hTihpKSYmKGk9dGhpcy5heGlzLnNjYWxlLnBhcnNlKGkpKSxpfSxnZXRNYXg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24saT10fHxudWxsPT1lLnJhbmdlRW5kP2UubWF4OmUucmFuZ2VFbmQ7cmV0dXJuIHRoaXMuYXhpcyYmbnVsbCE9aSYmImRhdGFNYXgiIT09aSYmImZ1bmN0aW9uIiE9dHlwZW9mIGkmJiFhLmVxTmFOKGkpJiYoaT10aGlzLmF4aXMuc2NhbGUucGFyc2UoaSkpLGl9LGdldE5lZWRDcm9zc1plcm86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbjtyZXR1cm4gbnVsbD09dC5yYW5nZVN0YXJ0JiZudWxsPT10LnJhbmdlRW5kJiYhdC5zY2FsZX0sZ2V0Q29vcmRTeXNNb2RlbDphLm5vb3Asc2V0UmFuZ2U6ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbi5yYW5nZVN0YXJ0PXQsdGhpcy5vcHRpb24ucmFuZ2VFbmQ9ZX0scmVzZXRSYW5nZTpmdW5jdGlvbigpe3RoaXMub3B0aW9uLnJhbmdlU3RhcnQ9dGhpcy5vcHRpb24ucmFuZ2VFbmQ9bnVsbH19fSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQpe3JldHVybiB0fWZ1bmN0aW9uIG4odCxlLG4sYSxvKXt0aGlzLl9vbGQ9dCx0aGlzLl9uZXc9ZSx0aGlzLl9vbGRLZXlHZXR0ZXI9bnx8aSx0aGlzLl9uZXdLZXlHZXR0ZXI9YXx8aSx0aGlzLmNvbnRleHQ9b31mdW5jdGlvbiBhKHQsZSxpLG4sYSl7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciByPSJfZWNfIithW25dKHRbb10sbykscz1lW3JdO251bGw9PXM/KGkucHVzaChyKSxlW3JdPW8pOihzLmxlbmd0aHx8KGVbcl09cz1bc10pLHMucHVzaChvKSl9fW4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkPXQsdGhpc30sdXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91cGRhdGU9dCx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZT10LHRoaXN9LGV4ZWN1dGU6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX29sZCxpPXRoaXMuX25ldyxuPXt9LG89e30scj1bXSxzPVtdO2ZvcihhKGUsbixyLCJfb2xkS2V5R2V0dGVyIix0aGlzKSxhKGksbyxzLCJfbmV3S2V5R2V0dGVyIix0aGlzKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBsPXJbdF0sdT1vW2xdO2lmKG51bGwhPXUpe3ZhciBoPXUubGVuZ3RoO2g/KDE9PT1oJiYob1tsXT1udWxsKSx1PXUudW5zaGlmdCgpKTpvW2xdPW51bGwsdGhpcy5fdXBkYXRlJiZ0aGlzLl91cGRhdGUodSx0KX1lbHNlIHRoaXMuX3JlbW92ZSYmdGhpcy5fcmVtb3ZlKHQpfWZvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKXt2YXIgbD1zW3RdO2lmKG8uaGFzT3duUHJvcGVydHkobCkpe3ZhciB1PW9bbF07aWYobnVsbD09dSljb250aW51ZTtpZih1Lmxlbmd0aClmb3IodmFyIGM9MCxoPXUubGVuZ3RoO2M8aDtjKyspdGhpcy5fYWRkJiZ0aGlzLl9hZGQodVtjXSk7ZWxzZSB0aGlzLl9hZGQmJnRoaXMuX2FkZCh1KX19fX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt0b29sYm94OnticnVzaDp7dGl0bGU6e3JlY3Q6IkJveCBTZWxlY3QiLHBvbHlnb246Ikxhc3NvIFNlbGVjdCIsbGluZVg6Ikhvcml6b250YWxseSBTZWxlY3QiLGxpbmVZOiJWZXJ0aWNhbGx5IFNlbGVjdCIsa2VlcDoiS2VlcCBTZWxlY3Rpb25zIixjbGVhcjoiQ2xlYXIgU2VsZWN0aW9ucyJ9fSxkYXRhVmlldzp7dGl0bGU6IkRhdGEgVmlldyIsbGFuZzpbIkRhdGEgVmlldyIsIkNsb3NlIiwiUmVmcmVzaCJdfSxkYXRhWm9vbTp7dGl0bGU6e3pvb206Ilpvb20iLGJhY2s6Ilpvb20gUmVzZXQifX0sbWFnaWNUeXBlOnt0aXRsZTp7bGluZToiU3dpdGNoIHRvIExpbmUgQ2hhcnQiLGJhcjoiU3dpdGNoIHRvIEJhciBDaGFydCIsc3RhY2s6IlN0YWNrIix0aWxlZDoiVGlsZSJ9fSxyZXN0b3JlOnt0aXRsZToiUmVzdG9yZSJ9LHNhdmVBc0ltYWdlOnt0aXRsZToiU2F2ZSBhcyBJbWFnZSIsbGFuZzpbIlJpZ2h0IENsaWNrIHRvIFNhdmUgSW1hZ2UiXX19fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNCksYT1pKDcpLG89aSgzNCkscj1pKDY3KSxzPW4ucm91bmQsbD1vLmV4dGVuZCh7dHlwZToiaW50ZXJ2YWwiLF9pbnRlcnZhbDowLF9pbnRlcnZhbFByZWNpc2lvbjoyLHNldEV4dGVudDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2V4dGVudDtpc05hTih0KXx8KGlbMF09cGFyc2VGbG9hdCh0KSksaXNOYU4oZSl8fChpWzFdPXBhcnNlRmxvYXQoZSkpfSx1bmlvbkV4dGVudDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQ7dFswXTxlWzBdJiYoZVswXT10WzBdKSx0WzFdPmVbMV0mJihlWzFdPXRbMV0pLGwucHJvdG90eXBlLnNldEV4dGVudC5jYWxsKHRoaXMsZVswXSxlWzFdKX0sZ2V0SW50ZXJ2YWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJ2YWx9LHNldEludGVydmFsOmZ1bmN0aW9uKHQpe3RoaXMuX2ludGVydmFsPXQsdGhpcy5fbmljZUV4dGVudD10aGlzLl9leHRlbnQuc2xpY2UoKSx0aGlzLl9pbnRlcnZhbFByZWNpc2lvbj1yLmdldEludGVydmFsUHJlY2lzaW9uKHQpfSxnZXRUaWNrczpmdW5jdGlvbigpe3JldHVybiByLmludGVydmFsU2NhbGVHZXRUaWNrcyh0aGlzLl9pbnRlcnZhbCx0aGlzLl9leHRlbnQsdGhpcy5fbmljZUV4dGVudCx0aGlzLl9pbnRlcnZhbFByZWNpc2lvbil9LGdldFRpY2tzTGFiZWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5nZXRUaWNrcygpLGk9MDtpPGUubGVuZ3RoO2krKyl0LnB1c2godGhpcy5nZXRMYWJlbChlW2ldKSk7cmV0dXJuIHR9LGdldExhYmVsOmZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm4iIjt2YXIgaT1lJiZlLnByZWNpc2lvbjtyZXR1cm4gbnVsbD09aT9pPW4uZ2V0UHJlY2lzaW9uU2FmZSh0KXx8MDoiYXV0byI9PT1pJiYoaT10aGlzLl9pbnRlcnZhbFByZWNpc2lvbiksdD1zKHQsaSwhMCksYS5hZGRDb21tYXModCl9LG5pY2VUaWNrczpmdW5jdGlvbih0LGUsaSl7dD10fHw1O3ZhciBuPXRoaXMuX2V4dGVudCxhPW5bMV0tblswXTtpZihpc0Zpbml0ZShhKSl7YTwwJiYoYT0tYSxuLnJldmVyc2UoKSk7dmFyIG89ci5pbnRlcnZhbFNjYWxlTmljZVRpY2tzKG4sdCxlLGkpO3RoaXMuX2ludGVydmFsUHJlY2lzaW9uPW8uaW50ZXJ2YWxQcmVjaXNpb24sdGhpcy5faW50ZXJ2YWw9by5pbnRlcnZhbCx0aGlzLl9uaWNlRXh0ZW50PW8ubmljZVRpY2tFeHRlbnR9fSxuaWNlRXh0ZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V4dGVudDtpZihlWzBdPT09ZVsxXSlpZigwIT09ZVswXSl7dmFyIGk9ZVswXTt0LmZpeE1heD9lWzBdLT1pLzI6KGVbMV0rPWkvMixlWzBdLT1pLzIpfWVsc2UgZVsxXT0xO3ZhciBuPWVbMV0tZVswXTtpc0Zpbml0ZShuKXx8KGVbMF09MCxlWzFdPTEpLHRoaXMubmljZVRpY2tzKHQuc3BsaXROdW1iZXIsdC5taW5JbnRlcnZhbCx0Lm1heEludGVydmFsKTt2YXIgYT10aGlzLl9pbnRlcnZhbDt0LmZpeE1pbnx8KGVbMF09cyhNYXRoLmZsb29yKGVbMF0vYSkqYSkpLHQuZml4TWF4fHwoZVsxXT1zKE1hdGguY2VpbChlWzFdL2EpKmEpKX19KTtsLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgbH0sdC5leHBvcnRzPWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3RoaXMuZ3JvdXA9bmV3IG8uR3JvdXAsdGhpcy5fc3ltYm9sQ3Rvcj10fHxyfWZ1bmN0aW9uIGEodCxlLGkpe3ZhciBuPXQuZ2V0SXRlbUxheW91dChlKTtyZXR1cm4gbiYmIWlzTmFOKG5bMF0pJiYhaXNOYU4oblsxXSkmJiEoaSYmaShlKSkmJiJub25lIiE9PXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2wiKX12YXIgbz1pKDMpLHI9aSg1Nykscz1uLnByb3RvdHlwZTtzLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdyb3VwLG49dC5ob3N0TW9kZWwscj10aGlzLl9kYXRhLHM9dGhpcy5fc3ltYm9sQ3RvcixsPXtpdGVtU3R5bGU6bi5nZXRNb2RlbCgiaXRlbVN0eWxlLm5vcm1hbCIpLmdldEl0ZW1TdHlsZShbImNvbG9yIl0pLGhvdmVySXRlbVN0eWxlOm4uZ2V0TW9kZWwoIml0ZW1TdHlsZS5lbXBoYXNpcyIpLmdldEl0ZW1TdHlsZSgpLHN5bWJvbFJvdGF0ZTpuLmdldCgic3ltYm9sUm90YXRlIiksc3ltYm9sT2Zmc2V0Om4uZ2V0KCJzeW1ib2xPZmZzZXQiKSxob3ZlckFuaW1hdGlvbjpuLmdldCgiaG92ZXJBbmltYXRpb24iKSxsYWJlbE1vZGVsOm4uZ2V0TW9kZWwoImxhYmVsLm5vcm1hbCIpLGhvdmVyTGFiZWxNb2RlbDpuLmdldE1vZGVsKCJsYWJlbC5lbXBoYXNpcyIpLGN1cnNvclN0eWxlOm4uZ2V0KCJjdXJzb3IiKX07dC5kaWZmKHIpLmFkZChmdW5jdGlvbihuKXt2YXIgbz10LmdldEl0ZW1MYXlvdXQobik7aWYoYSh0LG4sZSkpe3ZhciByPW5ldyBzKHQsbixsKTtyLmF0dHIoInBvc2l0aW9uIixvKSx0LnNldEl0ZW1HcmFwaGljRWwobixyKSxpLmFkZChyKX19KS51cGRhdGUoZnVuY3Rpb24odSxoKXt2YXIgYz1yLmdldEl0ZW1HcmFwaGljRWwoaCksZD10LmdldEl0ZW1MYXlvdXQodSk7cmV0dXJuIGEodCx1LGUpPyhjPyhjLnVwZGF0ZURhdGEodCx1LGwpLG8udXBkYXRlUHJvcHMoYyx7cG9zaXRpb246ZH0sbikpOihjPW5ldyBzKHQsdSksYy5hdHRyKCJwb3NpdGlvbiIsZCkpLGkuYWRkKGMpLHZvaWQgdC5zZXRJdGVtR3JhcGhpY0VsKHUsYykpOnZvaWQgaS5yZW1vdmUoYyl9KS5yZW1vdmUoZnVuY3Rpb24odCl7dmFyIGU9ci5nZXRJdGVtR3JhcGhpY0VsKHQpO2UmJmUuZmFkZU91dChmdW5jdGlvbigpe2kucmVtb3ZlKGUpfSl9KS5leGVjdXRlKCksdGhpcy5fZGF0YT10fSxzLnVwZGF0ZUxheW91dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGE7dCYmdC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbihlLGkpe3ZhciBuPXQuZ2V0SXRlbUxheW91dChpKTtlLmF0dHIoInBvc2l0aW9uIixuKX0pfSxzLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyb3VwLGk9dGhpcy5fZGF0YTtpJiYodD9pLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQpe3QuZmFkZU91dChmdW5jdGlvbigpe2UucmVtb3ZlKHQpfSl9KTplLnJlbW92ZUFsbCgpKX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj1lLmdldENvbXBvbmVudCgidG9vbHRpcCIpLG89ZS5nZXRDb21wb25lbnQoImF4aXNQb2ludGVyIikscz1vLmdldCgibGluayIsITApfHxbXSx1PVtdO2MoaS5nZXRDb29yZGluYXRlU3lzdGVtcygpLGZ1bmN0aW9uKGkpe2Z1bmN0aW9uIGgobixoLGMpe3ZhciBkPWMubW9kZWwuZ2V0TW9kZWwoImF4aXNQb2ludGVyIixvKSxmPWQuZ2V0KCJzaG93Iik7aWYoZiYmKCJhdXRvIiE9PWZ8fG58fGwoZCkpKXtudWxsPT1oJiYoaD1kLmdldCgidHJpZ2dlclRvb2x0aXAiKSksZD1uP2EoYyx2LG8sZSxuLGgpOmQ7dmFyIG09ZC5nZXQoInNuYXAiKSx5PXAoYy5tb2RlbCkseD1ofHxtfHwiY2F0ZWdvcnkiPT09Yy50eXBlLF89dC5heGVzSW5mb1t5XT17a2V5OnksYXhpczpjLGNvb3JkU3lzOmksYXhpc1BvaW50ZXJNb2RlbDpkLHRyaWdnZXJUb29sdGlwOmgsaW52b2x2ZVNlcmllczp4LHNuYXA6bSx1c2VIYW5kbGU6bChkKSxzZXJpZXNNb2RlbHM6W119O2dbeV09Xyx0LnNlcmllc0ludm9sdmVkfD14O3ZhciBiPXIocyxjKTtpZihudWxsIT1iKXt2YXIgdz11W2JdfHwodVtiXT17YXhlc0luZm86e319KTt3LmF4ZXNJbmZvW3ldPV8sdy5tYXBwZXI9c1tiXS5tYXBwZXIsXy5saW5rR3JvdXA9d319fWlmKGkuYXhpc1BvaW50ZXJFbmFibGVkKXt2YXIgZj1wKGkubW9kZWwpLGc9dC5jb29yZFN5c0F4ZXNJbmZvW2ZdPXt9O3QuY29vcmRTeXNNYXBbZl09aTt2YXIgbT1pLm1vZGVsLHY9bS5nZXRNb2RlbCgidG9vbHRpcCIsbik7aWYoYyhpLmdldEF4ZXMoKSxkKGgsITEsbnVsbCkpLGkuZ2V0VG9vbHRpcEF4ZXMmJm4mJnYuZ2V0KCJzaG93Iikpe3ZhciB5PSJheGlzIj09PXYuZ2V0KCJ0cmlnZ2VyIikseD0iY3Jvc3MiPT09di5nZXQoImF4aXNQb2ludGVyLnR5cGUiKSxfPWkuZ2V0VG9vbHRpcEF4ZXModi5nZXQoImF4aXNQb2ludGVyLmF4aXMiKSk7KHl8fHgpJiZjKF8uYmFzZUF4ZXMsZChoLCF4fHwiY3Jvc3MiLHkpKSx4JiZjKF8ub3RoZXJBeGVzLGQoaCwiY3Jvc3MiLCExKSl9fX0pfWZ1bmN0aW9uIGEodCxlLGksbixhLG8pe3ZhciByPWUuZ2V0TW9kZWwoImF4aXNQb2ludGVyIikscz17fTtjKFsidHlwZSIsInNuYXAiLCJsaW5lU3R5bGUiLCJzaGFkb3dTdHlsZSIsImxhYmVsIiwiYW5pbWF0aW9uIiwiYW5pbWF0aW9uRHVyYXRpb25VcGRhdGUiLCJhbmltYXRpb25FYXNpbmdVcGRhdGUiLCJ6Il0sZnVuY3Rpb24odCl7c1t0XT11LmNsb25lKHIuZ2V0KHQpKX0pLHMuc25hcD0iY2F0ZWdvcnkiIT09dC50eXBlJiYhIW8sImNyb3NzIj09PXIuZ2V0KCJ0eXBlIikmJihzLnR5cGU9ImxpbmUiKTt2YXIgbD1zLmxhYmVsfHwocy5sYWJlbD17fSk7aWYobnVsbD09bC5zaG93JiYobC5zaG93PSExKSwiY3Jvc3MiPT09YSYmKGwuc2hvdz0hMCwhbykpe3ZhciBkPXMubGluZVN0eWxlPXIuZ2V0KCJjcm9zc1N0eWxlIik7ZCYmdS5kZWZhdWx0cyhsLGQudGV4dFN0eWxlKX1yZXR1cm4gdC5tb2RlbC5nZXRNb2RlbCgiYXhpc1BvaW50ZXIiLG5ldyBoKHMsaSxuKSl9ZnVuY3Rpb24gbyh0LGUpe2UuZWFjaFNlcmllcyhmdW5jdGlvbihlKXt2YXIgaT1lLmNvb3JkaW5hdGVTeXN0ZW0sbj1lLmdldCgidG9vbHRpcC50cmlnZ2VyIiwhMCksYT1lLmdldCgidG9vbHRpcC5zaG93IiwhMCk7aSYmIm5vbmUiIT09biYmbiE9PSExJiYiaXRlbSIhPT1uJiZhIT09ITEmJmUuZ2V0KCJheGlzUG9pbnRlci5zaG93IiwhMCkhPT0hMSYmYyh0LmNvb3JkU3lzQXhlc0luZm9bcChpLm1vZGVsKV0sZnVuY3Rpb24odCl7dmFyIG49dC5heGlzO2kuZ2V0QXhpcyhuLmRpbSk9PT1uJiYodC5zZXJpZXNNb2RlbHMucHVzaChlKSxudWxsPT10LnNlcmllc0RhdGFDb3VudCYmKHQuc2VyaWVzRGF0YUNvdW50PTApLHQuc2VyaWVzRGF0YUNvdW50Kz1lLmdldERhdGEoKS5jb3VudCgpKX0pfSx0aGlzKX1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciBpPWUubW9kZWwsbj1lLmRpbSxhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBvPXRbYV18fHt9O2lmKHMob1tuKyJBeGlzSWQiXSxpLmlkKXx8cyhvW24rIkF4aXNJbmRleCJdLGkuY29tcG9uZW50SW5kZXgpfHxzKG9bbisiQXhpc05hbWUiXSxpLm5hbWUpKXJldHVybiBhfX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuImFsbCI9PT10fHx1LmlzQXJyYXkodCkmJnUuaW5kZXhPZih0LGUpPj0wfHx0PT09ZX1mdW5jdGlvbiBsKHQpe3JldHVybiEhdC5nZXQoImhhbmRsZS5zaG93Iil9dmFyIHU9aSgxKSxoPWkoMTEpLGM9dS5lYWNoLGQ9dS5jdXJyeSxmPXt9O2YuY29sbGVjdD1mdW5jdGlvbih0LGUpe3ZhciBpPXtheGVzSW5mbzp7fSxzZXJpZXNJbnZvbHZlZDohMSxjb29yZFN5c0F4ZXNJbmZvOnt9LGNvb3JkU3lzTWFwOnt9fTtyZXR1cm4gbihpLHQsZSksaS5zZXJpZXNJbnZvbHZlZCYmbyhpLHQpLGl9LGYuZml4VmFsdWU9ZnVuY3Rpb24odCl7dmFyIGU9Zi5nZXRBeGlzSW5mbyh0KTtpZihlKXt2YXIgaT1lLmF4aXNQb2ludGVyTW9kZWwsbj1lLmF4aXMuc2NhbGUsYT1pLm9wdGlvbixvPWkuZ2V0KCJzdGF0dXMiKSxyPWkuZ2V0KCJ2YWx1ZSIpO251bGwhPXImJihyPW4ucGFyc2UocikpO3ZhciBzPWwoaSk7bnVsbD09byYmKGEuc3RhdHVzPXM/InNob3ciOiJoaWRlIik7dmFyIHU9bi5nZXRFeHRlbnQoKS5zbGljZSgpO3VbMF0+dVsxXSYmdS5yZXZlcnNlKCksKG51bGw9PXJ8fHI+dVsxXSkmJihyPXVbMV0pLHI8dVswXSYmKHI9dVswXSksYS52YWx1ZT1yLHMmJihhLnN0YXR1cz1lLmF4aXMuc2NhbGUuaXNCbGFuaygpPyJoaWRlIjoic2hvdyIpfX0sZi5nZXRBeGlzSW5mbz1mdW5jdGlvbih0KXt2YXIgZT0odC5lY01vZGVsLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKXx8e30pLmNvb3JkU3lzQXhlc0luZm87cmV0dXJuIGUmJmUuYXhlc0luZm9bcCh0KV19LGYuZ2V0QXhpc1BvaW50ZXJNb2RlbD1mdW5jdGlvbih0KXt2YXIgZT1mLmdldEF4aXNJbmZvKHQpO3JldHVybiBlJiZlLmF4aXNQb2ludGVyTW9kZWx9O3ZhciBwPWYubWFrZUtleT1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlKyJ8fCIrdC5pZH07dC5leHBvcnRzPWZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXt9O3JldHVybiBjKFsic3RhcnQiLCJlbmQiLCJzdGFydFZhbHVlIiwiZW5kVmFsdWUiLCJ0aHJvdHRsZSJdLGZ1bmN0aW9uKGkpe3QuaGFzT3duUHJvcGVydHkoaSkmJihlW2ldPXRbaV0pfSksZX1mdW5jdGlvbiBhKHQsZSl7dmFyIGk9dC5fcmFuZ2VQcm9wTW9kZSxuPXQuZ2V0KCJyYW5nZU1vZGUiKTtjKFtbInN0YXJ0Iiwic3RhcnRWYWx1ZSJdLFsiZW5kIiwiZW5kVmFsdWUiXV0sZnVuY3Rpb24odCxhKXt2YXIgbz1udWxsIT1lW3RbMF1dLHI9bnVsbCE9ZVt0WzFdXTtvJiYhcj9pW2FdPSJwZXJjZW50IjohbyYmcj9pW2FdPSJ2YWx1ZSI6bj9pW2FdPW5bYV06byYmKGlbYV09InBlcmNlbnQiKX0pfXZhciBvPWkoMSkscj1pKDEwKSxzPWkoMiksbD1pKDUpLHU9aSg4MiksaD1pKDIwNCksYz1vLmVhY2gsZD11LmVhY2hBeGlzRGltLGY9cy5leHRlbmRDb21wb25lbnRNb2RlbCh7dHlwZToiZGF0YVpvb20iLGRlcGVuZGVuY2llczpbInhBeGlzIiwieUF4aXMiLCJ6QXhpcyIsInJhZGl1c0F4aXMiLCJhbmdsZUF4aXMiLCJzaW5nbGVBeGlzIiwic2VyaWVzIl0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo0LG9yaWVudDpudWxsLHhBeGlzSW5kZXg6bnVsbCx5QXhpc0luZGV4Om51bGwsZmlsdGVyTW9kZToiZmlsdGVyIix0aHJvdHRsZTpudWxsLHN0YXJ0OjAsZW5kOjEwMCxzdGFydFZhbHVlOm51bGwsZW5kVmFsdWU6bnVsbCxtaW5TcGFuOm51bGwsbWF4U3BhbjpudWxsLG1pblZhbHVlU3BhbjpudWxsLG1heFZhbHVlU3BhbjpudWxsLHJhbmdlTW9kZTpudWxsfSxpbml0OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9kYXRhSW50ZXJ2YWxCeUF4aXM9e30sdGhpcy5fZGF0YUluZm89e30sdGhpcy5fYXhpc1Byb3hpZXM9e30sdGhpcy50ZXh0U3R5bGVNb2RlbCx0aGlzLl9hdXRvVGhyb3R0bGU9ITAsdGhpcy5fcmFuZ2VQcm9wTW9kZT1bInBlcmNlbnQiLCJwZXJjZW50Il07dmFyIGE9bih0KTt0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSksdGhpcy5kb0luaXQoYSl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPW4odCk7by5tZXJnZSh0aGlzLm9wdGlvbix0LCEwKSx0aGlzLmRvSW5pdChlKX0sZG9Jbml0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uO3IuY2FudmFzU3VwcG9ydGVkfHwoZS5yZWFsdGltZT0hMSksdGhpcy5fc2V0RGVmYXVsdFRocm90dGxlKHQpLGEodGhpcyx0KSxjKFtbInN0YXJ0Iiwic3RhcnRWYWx1ZSJdLFsiZW5kIiwiZW5kVmFsdWUiXV0sZnVuY3Rpb24odCxpKXsidmFsdWUiPT09dGhpcy5fcmFuZ2VQcm9wTW9kZVtpXSYmKGVbdFswXV09bnVsbCl9LHRoaXMpLHRoaXMudGV4dFN0eWxlTW9kZWw9dGhpcy5nZXRNb2RlbCgidGV4dFN0eWxlIiksdGhpcy5fcmVzZXRUYXJnZXQoKSx0aGlzLl9naXZlQXhpc1Byb3hpZXMoKX0sX2dpdmVBeGlzUHJveGllczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2F4aXNQcm94aWVzO3RoaXMuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24oZSxpLG4sYSl7dmFyIG89dGhpcy5kZXBlbmRlbnRNb2RlbHNbZS5heGlzXVtpXSxyPW8uX19kekF4aXNQcm94eXx8KG8uX19kekF4aXNQcm94eT1uZXcgaChlLm5hbWUsaSx0aGlzLGEpKTt0W2UubmFtZSsiXyIraV09cn0sdGhpcyl9LF9yZXNldFRhcmdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLGU9dGhpcy5fanVkZ2VBdXRvTW9kZSgpO2QoZnVuY3Rpb24oZSl7dmFyIGk9ZS5heGlzSW5kZXg7dFtpXT1sLm5vcm1hbGl6ZVRvQXJyYXkodFtpXSl9LHRoaXMpLCJheGlzSW5kZXgiPT09ZT90aGlzLl9hdXRvU2V0QXhpc0luZGV4KCk6Im9yaWVudCI9PT1lJiZ0aGlzLl9hdXRvU2V0T3JpZW50KCl9LF9qdWRnZUF1dG9Nb2RlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24sZT0hMTtkKGZ1bmN0aW9uKGkpe251bGwhPXRbaS5heGlzSW5kZXhdJiYoZT0hMCl9LHRoaXMpO3ZhciBpPXQub3JpZW50O3JldHVybiBudWxsPT1pJiZlPyJvcmllbnQiOmU/dm9pZCAwOihudWxsPT1pJiYodC5vcmllbnQ9Imhvcml6b250YWwiKSwiYXhpc0luZGV4Iil9LF9hdXRvU2V0QXhpc0luZGV4OmZ1bmN0aW9uKCl7dmFyIHQ9ITAsZT10aGlzLmdldCgib3JpZW50IiwhMCksaT10aGlzLm9wdGlvbixuPXRoaXMuZGVwZW5kZW50TW9kZWxzO2lmKHQpe3ZhciBhPSJ2ZXJ0aWNhbCI9PT1lPyJ5IjoieCI7blthKyJBeGlzIl0ubGVuZ3RoPyhpW2ErIkF4aXNJbmRleCJdPVswXSx0PSExKTpjKG4uc2luZ2xlQXhpcyxmdW5jdGlvbihuKXt0JiZuLmdldCgib3JpZW50IiwhMCk9PT1lJiYoaS5zaW5nbGVBeGlzSW5kZXg9W24uY29tcG9uZW50SW5kZXhdLHQ9ITEpfSl9dCYmZChmdW5jdGlvbihlKXtpZih0KXt2YXIgbj1bXSxhPXRoaXMuZGVwZW5kZW50TW9kZWxzW2UuYXhpc107aWYoYS5sZW5ndGgmJiFuLmxlbmd0aClmb3IodmFyIG89MCxyPWEubGVuZ3RoO288cjtvKyspImNhdGVnb3J5Ij09PWFbb10uZ2V0KCJ0eXBlIikmJm4ucHVzaChvKTtpW2UuYXhpc0luZGV4XT1uLG4ubGVuZ3RoJiYodD0hMSl9fSx0aGlzKSx0JiZ0aGlzLmVjTW9kZWwuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt0aGlzLl9pc1Nlcmllc0hhc0FsbEF4ZXNUeXBlT2YodCwidmFsdWUiKSYmZChmdW5jdGlvbihlKXt2YXIgbj1pW2UuYXhpc0luZGV4XSxhPXQuZ2V0KGUuYXhpc0luZGV4KSxyPXQuZ2V0KGUuYXhpc0lkKSxzPXQuZWNNb2RlbC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOmUuYXhpcyxpbmRleDphLGlkOnJ9KVswXTthPXMuY29tcG9uZW50SW5kZXgsby5pbmRleE9mKG4sYSk8MCYmbi5wdXNoKGEpfSl9LHRoaXMpfSxfYXV0b1NldE9yaWVudDpmdW5jdGlvbigpe3ZhciB0O3RoaXMuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24oZSl7IXQmJih0PWUubmFtZSl9LHRoaXMpLHRoaXMub3B0aW9uLm9yaWVudD0ieSI9PT10PyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfaXNTZXJpZXNIYXNBbGxBeGVzVHlwZU9mOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ITA7cmV0dXJuIGQoZnVuY3Rpb24obil7dmFyIGE9dC5nZXQobi5heGlzSW5kZXgpLG89dGhpcy5kZXBlbmRlbnRNb2RlbHNbbi5heGlzXVthXTtvJiZvLmdldCgidHlwZSIpPT09ZXx8KGk9ITEpfSx0aGlzKSxpfSxfc2V0RGVmYXVsdFRocm90dGxlOmZ1bmN0aW9uKHQpe2lmKHQuaGFzT3duUHJvcGVydHkoInRocm90dGxlIikmJih0aGlzLl9hdXRvVGhyb3R0bGU9ITEpLHRoaXMuX2F1dG9UaHJvdHRsZSl7dmFyIGU9dGhpcy5lY01vZGVsLm9wdGlvbjt0aGlzLm9wdGlvbi50aHJvdHRsZT1lLmFuaW1hdGlvbiYmZS5hbmltYXRpb25EdXJhdGlvblVwZGF0ZT4wPzEwMDoyMH19LGdldEZpcnN0VGFyZ2V0QXhpc01vZGVsOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIGQoZnVuY3Rpb24oZSl7aWYobnVsbD09dCl7dmFyIGk9dGhpcy5nZXQoZS5heGlzSW5kZXgpO2kubGVuZ3RoJiYodD10aGlzLmRlcGVuZGVudE1vZGVsc1tlLmF4aXNdW2lbMF1dKX19LHRoaXMpLHR9LGVhY2hUYXJnZXRBeGlzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5lY01vZGVsO2QoZnVuY3Rpb24obil7Yyh0aGlzLmdldChuLmF4aXNJbmRleCksZnVuY3Rpb24oYSl7dC5jYWxsKGUsbixhLHRoaXMsaSl9LHRoaXMpfSx0aGlzKX0sZ2V0QXhpc1Byb3h5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2F4aXNQcm94aWVzW3QrIl8iK2VdfSxnZXRBeGlzTW9kZWw6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEF4aXNQcm94eSh0LGUpO3JldHVybiBpJiZpLmdldEF4aXNNb2RlbCgpfSxzZXRSYXdSYW5nZTpmdW5jdGlvbih0LGUpe2MoWyJzdGFydCIsImVuZCIsInN0YXJ0VmFsdWUiLCJlbmRWYWx1ZSJdLGZ1bmN0aW9uKGUpe3RoaXMub3B0aW9uW2VdPXRbZV19LHRoaXMpLCFlJiZhKHRoaXMsdCl9LGdldFBlcmNlbnRSYW5nZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCk7aWYodClyZXR1cm4gdC5nZXREYXRhUGVyY2VudFdpbmRvdygpfSxnZXRWYWx1ZVJhbmdlOmZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dHx8bnVsbCE9ZSlyZXR1cm4gdGhpcy5nZXRBeGlzUHJveHkodCxlKS5nZXREYXRhVmFsdWVXaW5kb3coKTt2YXIgaT10aGlzLmZpbmRSZXByZXNlbnRhdGl2ZUF4aXNQcm94eSgpO3JldHVybiBpP2kuZ2V0RGF0YVZhbHVlV2luZG93KCk6dm9pZCAwfSxmaW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHk6ZnVuY3Rpb24odCl7aWYodClyZXR1cm4gdC5fX2R6QXhpc1Byb3h5O3ZhciBlPXRoaXMuX2F4aXNQcm94aWVzO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkmJmVbaV0uaG9zdGVkQnkodGhpcykpcmV0dXJuIGVbaV07Zm9yKHZhciBpIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShpKSYmIWVbaV0uaG9zdGVkQnkodGhpcykpcmV0dXJuIGVbaV19LGdldFJhbmdlUHJvcE1vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFuZ2VQcm9wTW9kZS5zbGljZSgpfX0pO3QuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg2OCk7dC5leHBvcnRzPW4uZXh0ZW5kKHt0eXBlOiJkYXRhWm9vbSIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuZGF0YVpvb21Nb2RlbD10LHRoaXMuZWNNb2RlbD1lLHRoaXMuYXBpPWl9LGdldFRhcmdldENvb3JkSW5mbzpmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLGksbil7Zm9yKHZhciBhLG89MDtvPGkubGVuZ3RoO28rKylpZihpW29dLm1vZGVsPT09dCl7YT1pW29dO2JyZWFrfWF8fGkucHVzaChhPXttb2RlbDp0LGF4aXNNb2RlbHM6W10sY29vcmRJbmRleDpufSksYS5heGlzTW9kZWxzLnB1c2goZSl9dmFyIGU9dGhpcy5kYXRhWm9vbU1vZGVsLGk9dGhpcy5lY01vZGVsLG49e307cmV0dXJuIGUuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24oZSxhKXt2YXIgbz1pLmdldENvbXBvbmVudChlLmF4aXMsYSk7aWYobyl7dmFyIHI9by5nZXRDb29yZFN5c01vZGVsKCk7ciYmdChyLG8sbltyLm1haW5UeXBlXXx8KG5bci5tYWluVHlwZV09W10pLHIuY29tcG9uZW50SW5kZXgpfX0sdGhpcyksbn19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDE1KSxvPWEucGFyc2VDbGFzc1R5cGUscj0wLHM9e30sbD0iXyI7cy5nZXRVSUQ9ZnVuY3Rpb24odCl7cmV0dXJuW3R8fCIiLHIrKyxNYXRoLnJhbmRvbSgpXS5qb2luKGwpfSxzLmVuYWJsZVN1YlR5cGVEZWZhdWx0ZXI9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyPWZ1bmN0aW9uKHQsaSl7dD1vKHQpLGVbdC5tYWluXT1pfSx0LmRldGVybWluZVN1YlR5cGU9ZnVuY3Rpb24oaSxuKXt2YXIgYT1uLnR5cGU7aWYoIWEpe3ZhciByPW8oaSkubWFpbjt0Lmhhc1N1YlR5cGVzKGkpJiZlW3JdJiYoYT1lW3JdKG4pKX1yZXR1cm4gYX0sdH0scy5lbmFibGVUb3BvbG9naWNhbFRyYXZlbD1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dmFyIGk9e30scj1bXTtyZXR1cm4gbi5lYWNoKHQsZnVuY3Rpb24ocyl7dmFyIGw9YShpLHMpLHU9bC5vcmlnaW5hbERlcHM9ZShzKSxoPW8odSx0KTtsLmVudHJ5Q291bnQ9aC5sZW5ndGgsMD09PWwuZW50cnlDb3VudCYmci5wdXNoKHMpLG4uZWFjaChoLGZ1bmN0aW9uKHQpe24uaW5kZXhPZihsLnByZWRlY2Vzc29yLHQpPDAmJmwucHJlZGVjZXNzb3IucHVzaCh0KTt2YXIgZT1hKGksdCk7bi5pbmRleE9mKGUuc3VjY2Vzc29yLHQpPDAmJmUuc3VjY2Vzc29yLnB1c2gocyl9KX0pLHtncmFwaDppLG5vRW50cnlMaXN0OnJ9fWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdFtlXXx8KHRbZV09e3ByZWRlY2Vzc29yOltdLHN1Y2Nlc3NvcjpbXX0pLHRbZV19ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPVtdO3JldHVybiBuLmVhY2godCxmdW5jdGlvbih0KXtuLmluZGV4T2YoZSx0KT49MCYmaS5wdXNoKHQpfSksaX10LnRvcG9sb2dpY2FsVHJhdmVsPWZ1bmN0aW9uKHQsZSxhLG8pe2Z1bmN0aW9uIHIodCl7dVt0XS5lbnRyeUNvdW50LS0sMD09PXVbdF0uZW50cnlDb3VudCYmaC5wdXNoKHQpfWZ1bmN0aW9uIHModCl7Y1t0XT0hMCxyKHQpfWlmKHQubGVuZ3RoKXt2YXIgbD1pKGUpLHU9bC5ncmFwaCxoPWwubm9FbnRyeUxpc3QsYz17fTtmb3Iobi5lYWNoKHQsZnVuY3Rpb24odCl7Y1t0XT0hMH0pO2gubGVuZ3RoOyl7dmFyIGQ9aC5wb3AoKSxmPXVbZF0scD0hIWNbZF07cCYmKGEuY2FsbChvLGQsZi5vcmlnaW5hbERlcHMuc2xpY2UoKSksZGVsZXRlIGNbZF0pLG4uZWFjaChmLnN1Y2Nlc3NvcixwP3M6cil9bi5lYWNoKGMsZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNpcmNsZSBkZXBlbmRlbmN5IG1heSBleGlzdHMiKX0pfX19LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSxuLGEpe24uZWFjaFJhd1Nlcmllc0J5VHlwZSh0LGZ1bmN0aW9uKHQpe3ZhciBhPXQuZ2V0RGF0YSgpLG89dC5nZXQoInN5bWJvbCIpfHxlLHI9dC5nZXQoInN5bWJvbFNpemUiKTthLnNldFZpc3VhbCh7bGVnZW5kU3ltYm9sOml8fG8sc3ltYm9sOm8sc3ltYm9sU2l6ZTpyfSksbi5pc1Nlcmllc0ZpbHRlcmVkKHQpfHwoImZ1bmN0aW9uIj09dHlwZW9mIHImJmEuZWFjaChmdW5jdGlvbihlKXt2YXIgaT10LmdldFJhd1ZhbHVlKGUpLG49dC5nZXREYXRhUGFyYW1zKGUpO2Euc2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIixyKGksbikpfSksYS5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWEuZ2V0SXRlbU1vZGVsKHQpLGk9ZS5nZXRTaGFsbG93KCJzeW1ib2wiLCEwKSxuPWUuZ2V0U2hhbGxvdygic3ltYm9sU2l6ZSIsITApO251bGwhPWkmJmEuc2V0SXRlbVZpc3VhbCh0LCJzeW1ib2wiLGkpLG51bGwhPW4mJmEuc2V0SXRlbVZpc3VhbCh0LCJzeW1ib2xTaXplIixuKX0pKX0pfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT0wO3Q+PWg7KWV8PTEmdCx0Pj49MTtyZXR1cm4gdCtlfWZ1bmN0aW9uIG4odCxlLGksbil7dmFyIG89ZSsxO2lmKG89PT1pKXJldHVybiAxO2lmKG4odFtvKytdLHRbZV0pPDApe2Zvcig7bzxpJiZuKHRbb10sdFtvLTFdKTwwOylvKys7YSh0LGUsbyl9ZWxzZSBmb3IoO288aSYmbih0W29dLHRbby0xXSk+PTA7KW8rKztyZXR1cm4gby1lfWZ1bmN0aW9uIGEodCxlLGkpe2ZvcihpLS07ZTxpOyl7dmFyIG49dFtlXTt0W2UrK109dFtpXSx0W2ktLV09bn19ZnVuY3Rpb24gbyh0LGUsaSxuLGEpe2ZvcihuPT09ZSYmbisrO248aTtuKyspe2Zvcih2YXIgbyxyPXRbbl0scz1lLGw9bjtzPGw7KW89cytsPj4+MSxhKHIsdFtvXSk8MD9sPW86cz1vKzE7dmFyIHU9bi1zO3N3aXRjaCh1KXtjYXNlIDM6dFtzKzNdPXRbcysyXTtjYXNlIDI6dFtzKzJdPXRbcysxXTtjYXNlIDE6dFtzKzFdPXRbc107YnJlYWs7ZGVmYXVsdDpmb3IoO3U+MDspdFtzK3VdPXRbcyt1LTFdLHUtLX10W3NdPXJ9fWZ1bmN0aW9uIHIodCxlLGksbixhLG8pe3ZhciByPTAscz0wLGw9MTtpZihvKHQsZVtpK2FdKT4wKXtmb3Iocz1uLWE7bDxzJiZvKHQsZVtpK2ErbF0pPjA7KXI9bCxsPShsPDwxKSsxLGw8PTAmJihsPXMpO2w+cyYmKGw9cykscis9YSxsKz1hfWVsc2V7Zm9yKHM9YSsxO2w8cyYmbyh0LGVbaSthLWxdKTw9MDspcj1sLGw9KGw8PDEpKzEsbDw9MCYmKGw9cyk7bD5zJiYobD1zKTt2YXIgdT1yO3I9YS1sLGw9YS11fWZvcihyKys7cjxsOyl7dmFyIGg9cisobC1yPj4+MSk7byh0LGVbaStoXSk+MD9yPWgrMTpsPWh9cmV0dXJuIGx9ZnVuY3Rpb24gcyh0LGUsaSxuLGEsbyl7dmFyIHI9MCxzPTAsbD0xO2lmKG8odCxlW2krYV0pPDApe2ZvcihzPWErMTtsPHMmJm8odCxlW2krYS1sXSk8MDspcj1sLGw9KGw8PDEpKzEsbDw9MCYmKGw9cyk7bD5zJiYobD1zKTt2YXIgdT1yO3I9YS1sLGw9YS11fWVsc2V7Zm9yKHM9bi1hO2w8cyYmbyh0LGVbaSthK2xdKT49MDspcj1sLGw9KGw8PDEpKzEsbDw9MCYmKGw9cyk7bD5zJiYobD1zKSxyKz1hLGwrPWF9Zm9yKHIrKztyPGw7KXt2YXIgaD1yKyhsLXI+Pj4xKTtvKHQsZVtpK2hdKTwwP2w9aDpyPWgrMX1yZXR1cm4gbH1mdW5jdGlvbiBsKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe2hbeV09dCxmW3ldPWUseSs9MX1mdW5jdGlvbiBuKCl7Zm9yKDt5PjE7KXt2YXIgdD15LTI7aWYodD49MSYmZlt0LTFdPD1mW3RdK2ZbdCsxXXx8dD49MiYmZlt0LTJdPD1mW3RdK2ZbdC0xXSlmW3QtMV08Zlt0KzFdJiZ0LS07ZWxzZSBpZihmW3RdPmZbdCsxXSlicmVhaztvKHQpfX1mdW5jdGlvbiBhKCl7Zm9yKDt5PjE7KXt2YXIgdD15LTI7dD4wJiZmW3QtMV08Zlt0KzFdJiZ0LS0sbyh0KX19ZnVuY3Rpb24gbyhpKXt2YXIgbj1oW2ldLGE9ZltpXSxvPWhbaSsxXSxjPWZbaSsxXTtmW2ldPWErYyxpPT09eS0zJiYoaFtpKzFdPWhbaSsyXSxmW2krMV09ZltpKzJdKSx5LS07dmFyIGQ9cyh0W29dLHQsbixhLDAsZSk7bis9ZCxhLT1kLDAhPT1hJiYoYz1yKHRbbithLTFdLHQsbyxjLGMtMSxlKSwwIT09YyYmKGE8PWM/bChuLGEsbyxjKTp1KG4sYSxvLGMpKSl9ZnVuY3Rpb24gbChpLG4sYSxvKXt2YXIgbD0wO2ZvcihsPTA7bDxuO2wrKyl4W2xdPXRbaStsXTt2YXIgdT0wLGg9YSxkPWk7aWYodFtkKytdPXRbaCsrXSwwIT09LS1vKXtpZigxPT09bil7Zm9yKGw9MDtsPG87bCsrKXRbZCtsXT10W2grbF07cmV0dXJuIHZvaWQodFtkK29dPXhbdV0pfWZvcih2YXIgZixnLG0sdj1wOzspe2Y9MCxnPTAsbT0hMTtkbyBpZihlKHRbaF0seFt1XSk8MCl7aWYodFtkKytdPXRbaCsrXSxnKyssZj0wLDA9PT0tLW8pe209ITA7YnJlYWt9fWVsc2UgaWYodFtkKytdPXhbdSsrXSxmKyssZz0wLDE9PT0tLW4pe209ITA7YnJlYWt9d2hpbGUoKGZ8Zyk8dik7aWYobSlicmVhaztkb3tpZihmPXModFtoXSx4LHUsbiwwLGUpLDAhPT1mKXtmb3IobD0wO2w8ZjtsKyspdFtkK2xdPXhbdStsXTtpZihkKz1mLHUrPWYsbi09ZixuPD0xKXttPSEwO2JyZWFrfX1pZih0W2QrK109dFtoKytdLDA9PT0tLW8pe209ITA7YnJlYWt9aWYoZz1yKHhbdV0sdCxoLG8sMCxlKSwwIT09Zyl7Zm9yKGw9MDtsPGc7bCsrKXRbZCtsXT10W2grbF07aWYoZCs9ZyxoKz1nLG8tPWcsMD09PW8pe209ITA7YnJlYWt9fWlmKHRbZCsrXT14W3UrK10sMT09PS0tbil7bT0hMDticmVha312LS19d2hpbGUoZj49Y3x8Zz49Yyk7aWYobSlicmVhazt2PDAmJih2PTApLHYrPTJ9aWYocD12LHA8MSYmKHA9MSksMT09PW4pe2ZvcihsPTA7bDxvO2wrKyl0W2QrbF09dFtoK2xdO3RbZCtvXT14W3VdfWVsc2V7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yO2ZvcihsPTA7bDxuO2wrKyl0W2QrbF09eFt1K2xdfX1lbHNlIGZvcihsPTA7bDxuO2wrKyl0W2QrbF09eFt1K2xdfWZ1bmN0aW9uIHUoaSxuLGEsbyl7dmFyIGw9MDtmb3IobD0wO2w8bztsKyspeFtsXT10W2ErbF07dmFyIHU9aStuLTEsaD1vLTEsZD1hK28tMSxmPTAsZz0wO2lmKHRbZC0tXT10W3UtLV0sMCE9PS0tbil7aWYoMT09PW8pe2ZvcihkLT1uLHUtPW4sZz1kKzEsZj11KzEsbD1uLTE7bD49MDtsLS0pdFtnK2xdPXRbZitsXTtyZXR1cm4gdm9pZCh0W2RdPXhbaF0pfWZvcih2YXIgbT1wOzspe3ZhciB2PTAseT0wLF89ITE7ZG8gaWYoZSh4W2hdLHRbdV0pPDApe2lmKHRbZC0tXT10W3UtLV0sdisrLHk9MCwwPT09LS1uKXtfPSEwO2JyZWFrfX1lbHNlIGlmKHRbZC0tXT14W2gtLV0seSsrLHY9MCwxPT09LS1vKXtfPSEwO2JyZWFrfXdoaWxlKCh2fHkpPG0pO2lmKF8pYnJlYWs7ZG97aWYodj1uLXMoeFtoXSx0LGksbixuLTEsZSksMCE9PXYpe2ZvcihkLT12LHUtPXYsbi09dixnPWQrMSxmPXUrMSxsPXYtMTtsPj0wO2wtLSl0W2crbF09dFtmK2xdO2lmKDA9PT1uKXtfPSEwO2JyZWFrfX1pZih0W2QtLV09eFtoLS1dLDE9PT0tLW8pe189ITA7YnJlYWt9aWYoeT1vLXIodFt1XSx4LDAsbyxvLTEsZSksMCE9PXkpe2ZvcihkLT15LGgtPXksby09eSxnPWQrMSxmPWgrMSxsPTA7bDx5O2wrKyl0W2crbF09eFtmK2xdO2lmKG88PTEpe189ITA7YnJlYWt9fWlmKHRbZC0tXT10W3UtLV0sMD09PS0tbil7Xz0hMDticmVha31tLS19d2hpbGUodj49Y3x8eT49Yyk7aWYoXylicmVhazttPDAmJihtPTApLG0rPTJ9aWYocD1tLHA8MSYmKHA9MSksMT09PW8pe2ZvcihkLT1uLHUtPW4sZz1kKzEsZj11KzEsbD1uLTE7bD49MDtsLS0pdFtnK2xdPXRbZitsXTt0W2RdPXhbaF19ZWxzZXtpZigwPT09byl0aHJvdyBuZXcgRXJyb3I7Zm9yKGY9ZC0oby0xKSxsPTA7bDxvO2wrKyl0W2YrbF09eFtsXX19ZWxzZSBmb3IoZj1kLShvLTEpLGw9MDtsPG87bCsrKXRbZitsXT14W2xdfXZhciBoLGYscD1jLGc9MCxtPWQsdj0wLHk9MDtnPXQubGVuZ3RoLGc8MipkJiYobT1nPj4+MSk7dmFyIHg9W107dj1nPDEyMD81Omc8MTU0Mj8xMDpnPDExOTE1MT8xOTo0MCxoPVtdLGY9W10sdGhpcy5tZXJnZVJ1bnM9bix0aGlzLmZvcmNlTWVyZ2VSdW5zPWEsdGhpcy5wdXNoUnVuPWl9ZnVuY3Rpb24gdSh0LGUsYSxyKXthfHwoYT0wKSxyfHwocj10Lmxlbmd0aCk7dmFyIHM9ci1hO2lmKCEoczwyKSl7dmFyIHU9MDtpZihzPGgpcmV0dXJuIHU9bih0LGEscixlKSx2b2lkIG8odCxhLHIsYSt1LGUpO3ZhciBjPW5ldyBsKHQsZSksZD1pKHMpO2Rve2lmKHU9bih0LGEscixlKSx1PGQpe3ZhciBmPXM7Zj5kJiYoZj1kKSxvKHQsYSxhK2YsYSt1LGUpLHU9Zn1jLnB1c2hSdW4oYSx1KSxjLm1lcmdlUnVucygpLHMtPXUsYSs9dX13aGlsZSgwIT09cyk7Yy5mb3JjZU1lcmdlUnVucygpfX12YXIgaD0zMixjPTcsZD0yNTY7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7dmFyIHQ9dGhpcy5fX2NhY2hlZEltZ09iajt0aGlzLm9ubG9hZD10aGlzLl9fY2FjaGVkSW1nT2JqPW51bGw7Zm9yKHZhciBlPTA7ZTx0LnBlbmRpbmcubGVuZ3RoO2UrKyl7dmFyIGk9dC5wZW5kaW5nW2VdLG49aS5jYjtuJiZuKHRoaXMsaS5jYlBheWxvYWQpLGkuaG9zdEVsLmRpcnR5KCl9dC5wZW5kaW5nLmxlbmd0aD0wfXZhciBhPWkoNzMpLG89bmV3IGEoNTApLHI9e307ci5maW5kRXhpc3RJbWFnZT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPW8uZ2V0KHQpO3JldHVybiBlJiZlLmltYWdlfXJldHVybiB0fSxyLmNyZWF0ZU9yVXBkYXRlSW1hZ2U9ZnVuY3Rpb24odCxlLGksYSxyKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKGUmJmUuX196ckltYWdlU3JjPT09dHx8IWkpcmV0dXJuIGU7dmFyIGw9by5nZXQodCksdT17aG9zdEVsOmksY2I6YSxjYlBheWxvYWQ6cn07cmV0dXJuIGw/KGU9bC5pbWFnZSwhcyhlKSYmbC5wZW5kaW5nLnB1c2godSkpOighZSYmKGU9bmV3IEltYWdlKSxlLm9ubG9hZD1uLG8ucHV0KHQsZS5fX2NhY2hlZEltZ09iaj17aW1hZ2U6ZSxwZW5kaW5nOlt1XX0pLGUuc3JjPWUuX196ckltYWdlU3JjPXQpLGV9cmV0dXJuIHR9cmV0dXJuIGV9O3ZhciBzPXIuaXNJbWFnZVJlYWR5PWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0LndpZHRoJiZ0LmhlaWdodH07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDM1KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtpZigwIT09bi5kZWJ1Z01vZGUpaWYoMT09bi5kZWJ1Z01vZGUpZm9yKHZhciB0IGluIGFyZ3VtZW50cyl0aHJvdyBuZXcgRXJyb3IoYXJndW1lbnRzW3RdKTtlbHNlIGlmKG4uZGVidWdNb2RlPjEpZm9yKHZhciB0IGluIGFyZ3VtZW50cyljb25zb2xlLmxvZyhhcmd1bWVudHNbdF0pfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7YS5jYWxsKHRoaXMsdCl9dmFyIGE9aSgzOCksbz1pKDEyKSxyPWkoMSkscz1pKDUzKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bix0eXBlOiJpbWFnZSIsYnJ1c2g6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnN0eWxlLG49aS5pbWFnZTtpLmJpbmQodCx0aGlzLGUpO3ZhciBhPXRoaXMuX2ltYWdlPXMuY3JlYXRlT3JVcGRhdGVJbWFnZShuLHRoaXMuX2ltYWdlLHRoaXMpO2lmKGEmJnMuaXNJbWFnZVJlYWR5KGEpKXt2YXIgbz1pLnh8fDAscj1pLnl8fDAsbD1pLndpZHRoLHU9aS5oZWlnaHQsaD1hLndpZHRoL2EuaGVpZ2h0O2lmKG51bGw9PWwmJm51bGwhPXU/bD11Kmg6bnVsbD09dSYmbnVsbCE9bD91PWwvaDpudWxsPT1sJiZudWxsPT11JiYobD1hLndpZHRoLHU9YS5oZWlnaHQpLHRoaXMuc2V0VHJhbnNmb3JtKHQpLGkuc1dpZHRoJiZpLnNIZWlnaHQpe3ZhciBjPWkuc3h8fDAsZD1pLnN5fHwwO3QuZHJhd0ltYWdlKGEsYyxkLGkuc1dpZHRoLGkuc0hlaWdodCxvLHIsbCx1KX1lbHNlIGlmKGkuc3gmJmkuc3kpe3ZhciBjPWkuc3gsZD1pLnN5LGY9bC1jLHA9dS1kO3QuZHJhd0ltYWdlKGEsYyxkLGYscCxvLHIsbCx1KX1lbHNlIHQuZHJhd0ltYWdlKGEsbyxyLGwsdSk7dGhpcy5yZXN0b3JlVHJhbnNmb3JtKHQpLG51bGwhPWkudGV4dCYmdGhpcy5kcmF3UmVjdFRleHQodCx0aGlzLmdldEJvdW5kaW5nUmVjdCgpKX19LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGU7cmV0dXJuIHRoaXMuX3JlY3R8fCh0aGlzLl9yZWN0PW5ldyBvKHQueHx8MCx0Lnl8fDAsdC53aWR0aHx8MCx0LmhlaWdodHx8MCkpLHRoaXMuX3JlY3R9fSxyLmluaGVyaXRzKG4sYSksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXsKZnVuY3Rpb24gbih0KXtpZih0KXt0LmZvbnQ9bS5tYWtlRm9udCh0KTt2YXIgZT10LnRleHRBbGlnbjsibWlkZGxlIj09PWUmJihlPSJjZW50ZXIiKSx0LnRleHRBbGlnbj1udWxsPT1lfHx3W2VdP2U6ImxlZnQiO3ZhciBpPXQudGV4dFZlcnRpY2FsQWxpZ258fHQudGV4dEJhc2VsaW5lOyJjZW50ZXIiPT09aSYmKGk9Im1pZGRsZSIpLHQudGV4dFZlcnRpY2FsQWxpZ249bnVsbD09aXx8U1tpXT9pOiJ0b3AiO3ZhciBuPXQudGV4dFBhZGRpbmc7biYmKHQudGV4dFBhZGRpbmc9di5ub3JtYWxpemVDc3NBcnJheSh0LnRleHRQYWRkaW5nKSl9fWZ1bmN0aW9uIGEodCxlLGksbixhKXt2YXIgbz1mKGUsImZvbnQiLG4uZm9udHx8bS5ERUZBVUxUX0ZPTlQpLHI9bi50ZXh0UGFkZGluZyxsPXQuX190ZXh0Q290ZW50QmxvY2s7bCYmIXQuX19kaXJ0eXx8KGw9dC5fX3RleHRDb3RlbnRCbG9jaz1tLnBhcnNlUGxhaW5UZXh0KGksbyxyLG4udHJ1bmNhdGUpKTt2YXIgYz1sLm91dGVySGVpZ2h0LHA9bC5saW5lcyx2PWwubGluZUhlaWdodCx5PWQoYyxuLGEpLHg9eS5iYXNlWCxfPXkuYmFzZVksYj15LnRleHRBbGlnbix3PXkudGV4dFZlcnRpY2FsQWxpZ247cyhlLG4sYSx4LF8pO3ZhciBTPW0uYWRqdXN0VGV4dFkoXyxjLHcpLE09eCxBPVMsQz11KG4pO2lmKEN8fHIpe3ZhciBMPW0uZ2V0V2lkdGgoaSxvKSxEPUw7ciYmKEQrPXJbMV0rclszXSk7dmFyIFA9bS5hZGp1c3RUZXh0WCh4LEQsYik7QyYmaCh0LGUsbixQLFMsRCxjKSxyJiYoTT1nKHgsYixyKSxBKz1yWzBdKX1mKGUsInRleHRBbGlnbiIsYnx8ImxlZnQiKSxmKGUsInRleHRCYXNlbGluZSIsIm1pZGRsZSIpLGYoZSwic2hhZG93Qmx1ciIsbi50ZXh0U2hhZG93Qmx1cnx8MCksZihlLCJzaGFkb3dDb2xvciIsbi50ZXh0U2hhZG93Q29sb3J8fCJ0cmFuc3BhcmVudCIpLGYoZSwic2hhZG93T2Zmc2V0WCIsbi50ZXh0U2hhZG93T2Zmc2V0WHx8MCksZihlLCJzaGFkb3dPZmZzZXRZIixuLnRleHRTaGFkb3dPZmZzZXRZfHwwKSxBKz12LzI7dmFyIGs9bi50ZXh0U3Ryb2tlV2lkdGgsTz1JKG4udGV4dFN0cm9rZSxrKSx6PVQobi50ZXh0RmlsbCk7TyYmKGYoZSwibGluZVdpZHRoIixrKSxmKGUsInN0cm9rZVN0eWxlIixPKSkseiYmZihlLCJmaWxsU3R5bGUiLHopO2Zvcih2YXIgUj0wO1I8cC5sZW5ndGg7UisrKU8mJmUuc3Ryb2tlVGV4dChwW1JdLE0sQSkseiYmZS5maWxsVGV4dChwW1JdLE0sQSksQSs9dn1mdW5jdGlvbiBvKHQsZSxpLG4sYSl7dmFyIG89dC5fX3RleHRDb3RlbnRCbG9jaztvJiYhdC5fX2RpcnR5fHwobz10Ll9fdGV4dENvdGVudEJsb2NrPW0ucGFyc2VSaWNoVGV4dChpLG4pKSxyKHQsZSxvLG4sYSl9ZnVuY3Rpb24gcih0LGUsaSxuLGEpe3ZhciBvPWkud2lkdGgscj1pLm91dGVyV2lkdGgsYz1pLm91dGVySGVpZ2h0LGY9bi50ZXh0UGFkZGluZyxwPWQoYyxuLGEpLGc9cC5iYXNlWCx2PXAuYmFzZVkseT1wLnRleHRBbGlnbix4PXAudGV4dFZlcnRpY2FsQWxpZ247cyhlLG4sYSxnLHYpO3ZhciBfPW0uYWRqdXN0VGV4dFgoZyxyLHkpLGI9bS5hZGp1c3RUZXh0WSh2LGMseCksdz1fLFM9YjtmJiYodys9ZlszXSxTKz1mWzBdKTt2YXIgTT13K287dShuKSYmaCh0LGUsbixfLGIscixjKTtmb3IodmFyIEk9MDtJPGkubGluZXMubGVuZ3RoO0krKyl7Zm9yKHZhciBULEE9aS5saW5lc1tJXSxDPUEudG9rZW5zLEw9Qy5sZW5ndGgsRD1BLmxpbmVIZWlnaHQsUD1BLndpZHRoLGs9MCxPPXcsej1NLFI9TC0xO2s8TCYmKFQ9Q1trXSwhVC50ZXh0QWxpZ258fCJsZWZ0Ij09PVQudGV4dEFsaWduKTspbCh0LGUsVCxuLEQsUyxPLCJsZWZ0IiksUC09VC53aWR0aCxPKz1ULndpZHRoLGsrKztmb3IoO1I+PTAmJihUPUNbUl0sInJpZ2h0Ij09PVQudGV4dEFsaWduKTspbCh0LGUsVCxuLEQsUyx6LCJyaWdodCIpLFAtPVQud2lkdGgsei09VC53aWR0aCxSLS07Zm9yKE8rPShvLShPLXcpLShNLXopLVApLzI7azw9UjspVD1DW2tdLGwodCxlLFQsbixELFMsTytULndpZHRoLzIsImNlbnRlciIpLE8rPVQud2lkdGgsaysrO1MrPUR9fWZ1bmN0aW9uIHModCxlLGksbixhKXtpZihpJiZlLnRleHRSb3RhdGlvbil7dmFyIG89ZS50ZXh0T3JpZ2luOyJjZW50ZXIiPT09bz8obj1pLndpZHRoLzIraS54LGE9aS5oZWlnaHQvMitpLnkpOm8mJihuPW9bMF0raS54LGE9b1sxXStpLnkpLHQudHJhbnNsYXRlKG4sYSksdC5yb3RhdGUoLWUudGV4dFJvdGF0aW9uKSx0LnRyYW5zbGF0ZSgtbiwtYSl9fWZ1bmN0aW9uIGwodCxlLGksbixhLG8scixzKXt2YXIgbD1uLnJpY2hbaS5zdHlsZU5hbWVdfHx7fSxjPWkudGV4dFZlcnRpY2FsQWxpZ24sZD1vK2EvMjsidG9wIj09PWM/ZD1vK2kuaGVpZ2h0LzI6ImJvdHRvbSI9PT1jJiYoZD1vK2EtaS5oZWlnaHQvMiksIWkuaXNMaW5lSG9sZGVyJiZ1KGwpJiZoKHQsZSxsLCJyaWdodCI9PT1zP3ItaS53aWR0aDoiY2VudGVyIj09PXM/ci1pLndpZHRoLzI6cixkLWkuaGVpZ2h0LzIsaS53aWR0aCxpLmhlaWdodCk7dmFyIHA9aS50ZXh0UGFkZGluZztwJiYocj1nKHIscyxwKSxkLT1pLmhlaWdodC8yLXBbMl0taS50ZXh0SGVpZ2h0LzIpLGYoZSwic2hhZG93Qmx1ciIsXyhsLnRleHRTaGFkb3dCbHVyLG4udGV4dFNoYWRvd0JsdXIsMCkpLGYoZSwic2hhZG93Q29sb3IiLGwudGV4dFNoYWRvd0NvbG9yfHxuLnRleHRTaGFkb3dDb2xvcnx8InRyYW5zcGFyZW50IiksZihlLCJzaGFkb3dPZmZzZXRYIixfKGwudGV4dFNoYWRvd09mZnNldFgsbi50ZXh0U2hhZG93T2Zmc2V0WCwwKSksZihlLCJzaGFkb3dPZmZzZXRZIixfKGwudGV4dFNoYWRvd09mZnNldFksbi50ZXh0U2hhZG93T2Zmc2V0WSwwKSksZihlLCJ0ZXh0QWxpZ24iLHMpLGYoZSwidGV4dEJhc2VsaW5lIiwibWlkZGxlIiksZihlLCJmb250IixpLmZvbnR8fG0uREVGQVVMVF9GT05UKTt2YXIgdj1JKGwudGV4dFN0cm9rZXx8bi50ZXh0U3Ryb2tlLHgpLHk9VChsLnRleHRGaWxsfHxuLnRleHRGaWxsKSx4PWIobC50ZXh0U3Ryb2tlV2lkdGgsbi50ZXh0U3Ryb2tlV2lkdGgpO3YmJihmKGUsImxpbmVXaWR0aCIseCksZihlLCJzdHJva2VTdHlsZSIsdiksZS5zdHJva2VUZXh0KGkudGV4dCxyLGQpKSx5JiYoZihlLCJmaWxsU3R5bGUiLHkpLGUuZmlsbFRleHQoaS50ZXh0LHIsZCkpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQudGV4dEJhY2tncm91bmRDb2xvcnx8dC50ZXh0Qm9yZGVyV2lkdGgmJnQudGV4dEJvcmRlckNvbG9yfWZ1bmN0aW9uIGgodCxlLGksbixhLG8scil7dmFyIHM9aS50ZXh0QmFja2dyb3VuZENvbG9yLGw9aS50ZXh0Qm9yZGVyV2lkdGgsdT1pLnRleHRCb3JkZXJDb2xvcixoPXYuaXNTdHJpbmcocyk7aWYoZihlLCJzaGFkb3dCbHVyIixpLnRleHRCb3hTaGFkb3dCbHVyfHwwKSxmKGUsInNoYWRvd0NvbG9yIixpLnRleHRCb3hTaGFkb3dDb2xvcnx8InRyYW5zcGFyZW50IiksZihlLCJzaGFkb3dPZmZzZXRYIixpLnRleHRCb3hTaGFkb3dPZmZzZXRYfHwwKSxmKGUsInNoYWRvd09mZnNldFkiLGkudGV4dEJveFNoYWRvd09mZnNldFl8fDApLGh8fGwmJnUpe2UuYmVnaW5QYXRoKCk7dmFyIGQ9aS50ZXh0Qm9yZGVyUmFkaXVzO2Q/eS5idWlsZFBhdGgoZSx7eDpuLHk6YSx3aWR0aDpvLGhlaWdodDpyLHI6ZH0pOmUucmVjdChuLGEsbyxyKSxlLmNsb3NlUGF0aCgpfWlmKGgpZihlLCJmaWxsU3R5bGUiLHMpLGUuZmlsbCgpO2Vsc2UgaWYodi5pc09iamVjdChzKSl7dmFyIHA9cy5pbWFnZTtwPXguY3JlYXRlT3JVcGRhdGVJbWFnZShwLG51bGwsdCxjLHMpLHAmJnguaXNJbWFnZVJlYWR5KHApJiZlLmRyYXdJbWFnZShwLG4sYSxvLHIpfWwmJnUmJihmKGUsImxpbmVXaWR0aCIsbCksZihlLCJzdHJva2VTdHlsZSIsdSksZS5zdHJva2UoKSl9ZnVuY3Rpb24gYyh0LGUpe2UuaW1hZ2U9dH1mdW5jdGlvbiBkKHQsZSxpKXt2YXIgbj1lLnh8fDAsYT1lLnl8fDAsbz1lLnRleHRBbGlnbixyPWUudGV4dFZlcnRpY2FsQWxpZ247aWYoaSl7dmFyIHM9ZS50ZXh0UG9zaXRpb247aWYocyBpbnN0YW5jZW9mIEFycmF5KW49aS54K3Aoc1swXSxpLndpZHRoKSxhPWkueStwKHNbMV0saS5oZWlnaHQpO2Vsc2V7dmFyIGw9bS5hZGp1c3RUZXh0UG9zaXRpb25PblJlY3QocyxpLGUudGV4dERpc3RhbmNlKTtuPWwueCxhPWwueSxvPW98fGwudGV4dEFsaWduLHI9cnx8bC50ZXh0VmVydGljYWxBbGlnbn12YXIgdT1lLnRleHRPZmZzZXQ7dSYmKG4rPXVbMF0sYSs9dVsxXSl9cmV0dXJue2Jhc2VYOm4sYmFzZVk6YSx0ZXh0QWxpZ246byx0ZXh0VmVydGljYWxBbGlnbjpyfX1mdW5jdGlvbiBmKHQsZSxpKXtyZXR1cm4gdFtlXT1pLHRbZV19ZnVuY3Rpb24gcCh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90Lmxhc3RJbmRleE9mKCIlIik+PTA/cGFyc2VGbG9hdCh0KS8xMDAqZTpwYXJzZUZsb2F0KHQpOnR9ZnVuY3Rpb24gZyh0LGUsaSl7cmV0dXJuInJpZ2h0Ij09PWU/dC1pWzFdOiJjZW50ZXIiPT09ZT90K2lbM10vMi1pWzFdLzI6dCtpWzNdfXZhciBtPWkoMTYpLHY9aSgxKSx5PWkoNzkpLHg9aSg1MyksXz12LnJldHJpZXZlMyxiPXYucmV0cmlldmUyLHc9e2xlZnQ6MSxyaWdodDoxLGNlbnRlcjoxfSxTPXt0b3A6MSxib3R0b206MSxtaWRkbGU6MX0sTT17fTtNLm5vcm1hbGl6ZVRleHRTdHlsZT1mdW5jdGlvbih0KXtyZXR1cm4gbih0KSx2LmVhY2godC5yaWNoLG4pLHR9LE0ucmVuZGVyVGV4dD1mdW5jdGlvbih0LGUsaSxuLHIpe24ucmljaD9vKHQsZSxpLG4scik6YSh0LGUsaSxuLHIpfTt2YXIgST1NLmdldFN0cm9rZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHxlPD0wfHwidHJhbnNwYXJlbnQiPT09dHx8Im5vbmUiPT09dD9udWxsOnQuaW1hZ2V8fHQuY29sb3JTdG9wcz8iIzAwMCI6dH0sVD1NLmdldEZpbGw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fCJub25lIj09PXQ/bnVsbDp0LmltYWdlfHx0LmNvbG9yU3RvcHM/IiMwMDAiOnR9O00ubmVlZERyYXdUZXh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJih0fHxlLnRleHRCYWNrZ3JvdW5kQ29sb3J8fGUudGV4dEJvcmRlcldpZHRoJiZlLnRleHRCb3JkZXJDb2xvcnx8ZS50ZXh0UGFkZGluZyl9LHQuZXhwb3J0cz1NfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIik7cmV0dXJuIGkgaW5zdGFuY2VvZiBBcnJheT9pLnNsaWNlKCk6WytpLCtpXX1mdW5jdGlvbiBhKHQpe3JldHVyblt0WzBdLzIsdFsxXS8yXX1mdW5jdGlvbiBvKHQsZSxpKXt1Lkdyb3VwLmNhbGwodGhpcyksdGhpcy51cGRhdGVEYXRhKHQsZSxpKX1mdW5jdGlvbiByKHQsZSl7dGhpcy5wYXJlbnQuZHJpZnQodCxlKX12YXIgcz1pKDEpLGw9aSgyNCksdT1pKDMpLGg9aSg0KSxjPWkoOTcpLGQ9by5wcm90b3R5cGU7ZC5fY3JlYXRlU3ltYm9sPWZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMucmVtb3ZlQWxsKCk7dmFyIG89ZS5ob3N0TW9kZWwscz1lLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxoPWwuY3JlYXRlU3ltYm9sKHQsLTEsLTEsMiwyLHMpO2guYXR0cih7ejI6MTAwLGN1bGxpbmc6ITAsc2NhbGU6WzAsMF19KSxoLmRyaWZ0PXIsdS5pbml0UHJvcHMoaCx7c2NhbGU6YShuKX0sbyxpKSx0aGlzLl9zeW1ib2xUeXBlPXQsdGhpcy5hZGQoaCl9LGQuc3RvcFN5bWJvbEFuaW1hdGlvbj1mdW5jdGlvbih0KXt0aGlzLmNoaWxkQXQoMCkuc3RvcEFuaW1hdGlvbih0KX0sZC5nZXRTeW1ib2xQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRBdCgwKX0sZC5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkQXQoMCkuc2NhbGV9LGQuaGlnaGxpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5jaGlsZEF0KDApLnRyaWdnZXIoImVtcGhhc2lzIil9LGQuZG93bnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmNoaWxkQXQoMCkudHJpZ2dlcigibm9ybWFsIil9LGQuc2V0Wj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY2hpbGRBdCgwKTtpLnpsZXZlbD10LGkuej1lfSxkLnNldERyYWdnYWJsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNoaWxkQXQoMCk7ZS5kcmFnZ2FibGU9dCxlLmN1cnNvcj10PyJtb3ZlIjoicG9pbnRlciJ9LGQudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUsaSl7dGhpcy5zaWxlbnQ9ITE7dmFyIG89dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbCIpfHwiY2lyY2xlIixyPXQuaG9zdE1vZGVsLHM9bih0LGUpO2lmKG8hPT10aGlzLl9zeW1ib2xUeXBlKXRoaXMuX2NyZWF0ZVN5bWJvbChvLHQsZSxzKTtlbHNle3ZhciBsPXRoaXMuY2hpbGRBdCgwKTtsLnNpbGVudD0hMSx1LnVwZGF0ZVByb3BzKGwse3NjYWxlOmEocyl9LHIsZSl9dGhpcy5fdXBkYXRlQ29tbW9uKHQsZSxzLGkpLHRoaXMuX3Nlcmllc01vZGVsPXJ9O3ZhciBmPVsiaXRlbVN0eWxlIiwibm9ybWFsIl0scD1bIml0ZW1TdHlsZSIsImVtcGhhc2lzIl0sZz1bImxhYmVsIiwibm9ybWFsIl0sbT1bImxhYmVsIiwiZW1waGFzaXMiXTtkLl91cGRhdGVDb21tb249ZnVuY3Rpb24odCxlLGksbil7dmFyIG89dGhpcy5jaGlsZEF0KDApLHI9dC5ob3N0TW9kZWwsbD10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTsiaW1hZ2UiIT09by50eXBlJiZvLnVzZVN0eWxlKHtzdHJva2VOb1NjYWxlOiEwfSksbj1ufHxudWxsO3ZhciBkPW4mJm4uaXRlbVN0eWxlLHY9biYmbi5ob3Zlckl0ZW1TdHlsZSx5PW4mJm4uc3ltYm9sUm90YXRlLHg9biYmbi5zeW1ib2xPZmZzZXQsXz1uJiZuLmxhYmVsTW9kZWwsYj1uJiZuLmhvdmVyTGFiZWxNb2RlbCx3PW4mJm4uaG92ZXJBbmltYXRpb24sUz1uJiZuLmN1cnNvclN0eWxlO2lmKCFufHx0Lmhhc0l0ZW1PcHRpb24pe3ZhciBNPXQuZ2V0SXRlbU1vZGVsKGUpO2Q9TS5nZXRNb2RlbChmKS5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKSx2PU0uZ2V0TW9kZWwocCkuZ2V0SXRlbVN0eWxlKCkseT1NLmdldFNoYWxsb3coInN5bWJvbFJvdGF0ZSIpLHg9TS5nZXRTaGFsbG93KCJzeW1ib2xPZmZzZXQiKSxfPU0uZ2V0TW9kZWwoZyksYj1NLmdldE1vZGVsKG0pLHc9TS5nZXRTaGFsbG93KCJob3ZlckFuaW1hdGlvbiIpLFM9TS5nZXRTaGFsbG93KCJjdXJzb3IiKX1lbHNlIHY9cy5leHRlbmQoe30sdik7dmFyIEk9by5zdHlsZTtvLmF0dHIoInJvdGF0aW9uIiwoeXx8MCkqTWF0aC5QSS8xODB8fDApLHgmJm8uYXR0cigicG9zaXRpb24iLFtoLnBhcnNlUGVyY2VudCh4WzBdLGlbMF0pLGgucGFyc2VQZXJjZW50KHhbMV0saVsxXSldKSxTJiZvLmF0dHIoImN1cnNvciIsUyksby5zZXRDb2xvcihsKSxvLnNldFN0eWxlKGQpO3ZhciBUPXQuZ2V0SXRlbVZpc3VhbChlLCJvcGFjaXR5Iik7bnVsbCE9VCYmKEkub3BhY2l0eT1UKTt2YXIgQT1jLmZpbmRMYWJlbFZhbHVlRGltKHQpO251bGwhPUEmJnUuc2V0TGFiZWxTdHlsZShJLHYsXyxiLHtsYWJlbEZldGNoZXI6cixsYWJlbERhdGFJbmRleDplLGRlZmF1bHRUZXh0OnQuZ2V0KEEsZSksaXNSZWN0VGV4dDohMCxhdXRvQ29sb3I6bH0pLG8ub2ZmKCJtb3VzZW92ZXIiKS5vZmYoIm1vdXNlb3V0Iikub2ZmKCJlbXBoYXNpcyIpLm9mZigibm9ybWFsIiksby5ob3ZlclN0eWxlPXYsdS5zZXRIb3ZlclN0eWxlKG8pO3ZhciBDPWEoaSk7aWYodyYmci5pc0FuaW1hdGlvbkVuYWJsZWQoKSl7dmFyIEw9ZnVuY3Rpb24oKXt2YXIgdD1DWzFdL0NbMF07dGhpcy5hbmltYXRlVG8oe3NjYWxlOltNYXRoLm1heCgxLjEqQ1swXSxDWzBdKzMpLE1hdGgubWF4KDEuMSpDWzFdLENbMV0rMyp0KV19LDQwMCwiZWxhc3RpY091dCIpfSxEPWZ1bmN0aW9uKCl7dGhpcy5hbmltYXRlVG8oe3NjYWxlOkN9LDQwMCwiZWxhc3RpY091dCIpfTtvLm9uKCJtb3VzZW92ZXIiLEwpLm9uKCJtb3VzZW91dCIsRCkub24oImVtcGhhc2lzIixMKS5vbigibm9ybWFsIixEKX19LGQuZmFkZU91dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNoaWxkQXQoMCk7dGhpcy5zaWxlbnQ9ZS5zaWxlbnQ9ITAsZS5zdHlsZS50ZXh0PW51bGwsdS51cGRhdGVQcm9wcyhlLHtzY2FsZTpbMCwwXX0sdGhpcy5fc2VyaWVzTW9kZWwsdGhpcy5kYXRhSW5kZXgsdCl9LHMuaW5oZXJpdHMobyx1Lkdyb3VwKSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMiksYT1pKDQ3KSxvPWkoMjAyKSxyPWkoMSk7aSgyMDApLGkoMjAxKSxpKDEyNSksbi5yZWdpc3RlclByZXByb2Nlc3NvcihmdW5jdGlvbih0KXtpZih0KXsoIXQuYXhpc1BvaW50ZXJ8fDA9PT10LmF4aXNQb2ludGVyLmxlbmd0aCkmJih0LmF4aXNQb2ludGVyPXt9KTt2YXIgZT10LmF4aXNQb2ludGVyLmxpbms7ZSYmIXIuaXNBcnJheShlKSYmKHQuYXhpc1BvaW50ZXIubGluaz1bZV0pfX0pLG4ucmVnaXN0ZXJQcm9jZXNzb3Iobi5QUklPUklUWS5QUk9DRVNTT1IuU1RBVElTVElDLGZ1bmN0aW9uKHQsZSl7dC5nZXRDb21wb25lbnQoImF4aXNQb2ludGVyIikuY29vcmRTeXNBeGVzSW5mbz1hLmNvbGxlY3QodCxlKX0pLG4ucmVnaXN0ZXJBY3Rpb24oe3R5cGU6InVwZGF0ZUF4aXNQb2ludGVyIixldmVudDoidXBkYXRlQXhpc1BvaW50ZXIiLHVwZGF0ZToiOnVwZGF0ZUF4aXNQb2ludGVyIn0sbyl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPXRbZV0tdFsxLWVdO3JldHVybntzcGFuOk1hdGguYWJzKGkpLHNpZ246aT4wPy0xOmk8MD8xOmU/LTE6MX19ZnVuY3Rpb24gbih0LGUpe3JldHVybiBNYXRoLm1pbihlWzFdLE1hdGgubWF4KGVbMF0sdCkpfXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsYSxvLHIscyl7ZVswXT1uKGVbMF0sYSksZVsxXT1uKGVbMV0sYSksdD10fHwwO3ZhciBsPWFbMV0tYVswXTtudWxsIT1yJiYocj1uKHIsWzAsbF0pKSxudWxsIT1zJiYocz1NYXRoLm1heChzLG51bGwhPXI/cjowKSksImFsbCI9PT1vJiYocj1zPU1hdGguYWJzKGVbMV0tZVswXSksbz0wKTt2YXIgdT1pKGUsbyk7ZVtvXSs9dDt2YXIgaD1yfHwwLGM9YS5zbGljZSgpO3Uuc2lnbjwwP2NbMF0rPWg6Y1sxXS09aCxlW29dPW4oZVtvXSxjKTt2YXIgZD1pKGUsbyk7bnVsbCE9ciYmKGQuc2lnbiE9PXUuc2lnbnx8ZC5zcGFuPHIpJiYoZVsxLW9dPWVbb10rdS5zaWduKnIpO3ZhciBkPWkoZSxvKTtyZXR1cm4gbnVsbCE9cyYmZC5zcGFuPnMmJihlWzEtb109ZVtvXStkLnNpZ24qcyksZX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXtyZXR1cm4gdC5nZXRDb29yZFN5c01vZGVsKCk9PT1lfWZ1bmN0aW9uIGEodCl7dmFyIGUsaT10Lm1vZGVsLG49aS5nZXRGb3JtYXR0ZWRMYWJlbHMoKSxhPWkuZ2V0TW9kZWwoImF4aXNMYWJlbCIpLG89MSxyPW4ubGVuZ3RoO3I+NDAmJihvPU1hdGguY2VpbChyLzQwKSk7Zm9yKHZhciBzPTA7czxyO3MrPW8paWYoIXQuaXNMYWJlbElnbm9yZWQocykpe3ZhciBsPWEuZ2V0VGV4dFJlY3QobltzXSk7ZT9lLnVuaW9uKGwpOmU9bH1yZXR1cm4gZX1mdW5jdGlvbiBvKHQsZSxpKXt0aGlzLl9jb29yZHNNYXA9e30sdGhpcy5fY29vcmRzTGlzdD1bXSx0aGlzLl9heGVzTWFwPXt9LHRoaXMuX2F4ZXNMaXN0PVtdLHRoaXMuX2luaXRDYXJ0ZXNpYW4odCxlLGkpLHRoaXMubW9kZWw9dH1mdW5jdGlvbiByKHQsZSxpKXt2YXIgbj10W2VdO2lmKGkub25aZXJvKXt2YXIgYT1pLm9uWmVyb0F4aXNJbmRleDtpZihudWxsIT1hKXt2YXIgbz1uW2FdO3JldHVybiB2b2lkKG8mJnMobykmJihpLm9uWmVybz0hMSkpfWZvcih2YXIgciBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkocikpe3ZhciBvPW5bcl07aWYobyYmIXMobykpe2E9K3I7YnJlYWt9fW51bGw9PWEmJihpLm9uWmVybz0hMSksaS5vblplcm9BeGlzSW5kZXg9YX19ZnVuY3Rpb24gcyh0KXtyZXR1cm4iY2F0ZWdvcnkiPT09dC50eXBlfHwidGltZSI9PT10LnR5cGV8fCF2KHQpfWZ1bmN0aW9uIGwodCxlKXt2YXIgaT10LmdldEV4dGVudCgpLG49aVswXStpWzFdO3QudG9HbG9iYWxDb29yZD0ieCI9PT10LmRpbT9mdW5jdGlvbih0KXtyZXR1cm4gdCtlfTpmdW5jdGlvbih0KXtyZXR1cm4gbi10K2V9LHQudG9Mb2NhbENvb3JkPSJ4Ij09PXQuZGltP2Z1bmN0aW9uKHQpe3JldHVybiB0LWV9OmZ1bmN0aW9uKHQpe3JldHVybiBuLXQrZX19ZnVuY3Rpb24gdSh0LGUpe3JldHVybiBmLm1hcChfLGZ1bmN0aW9uKGUpe3ZhciBpPXQuZ2V0UmVmZXJyaW5nQ29tcG9uZW50cyhlKVswXTtyZXR1cm4gaX0pfWZ1bmN0aW9uIGgodCl7cmV0dXJuImNhcnRlc2lhbjJkIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIil9dmFyIGM9aSg5KSxkPWkoMTgpLGY9aSgxKSxwPWkoMTQwKSxnPWkoMTM4KSxtPWYuZWFjaCx2PWQuaWZBeGlzQ3Jvc3NaZXJvLHk9ZC5uaWNlU2NhbGVFeHRlbnQ7aSgxNDEpO3ZhciB4PW8ucHJvdG90eXBlO3gudHlwZT0iZ3JpZCIseC5heGlzUG9pbnRlckVuYWJsZWQ9ITAseC5nZXRSZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3R9LHgudXBkYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fYXhlc01hcDt0aGlzLl91cGRhdGVTY2FsZSh0LHRoaXMubW9kZWwpLG0oaS54LGZ1bmN0aW9uKHQpe3kodC5zY2FsZSx0Lm1vZGVsKX0pLG0oaS55LGZ1bmN0aW9uKHQpe3kodC5zY2FsZSx0Lm1vZGVsKX0pLG0oaS54LGZ1bmN0aW9uKHQpe3IoaSwieSIsdCl9KSxtKGkueSxmdW5jdGlvbih0KXtyKGksIngiLHQpfSksdGhpcy5yZXNpemUodGhpcy5tb2RlbCxlKX0seC5yZXNpemU9ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4oKXttKHIsZnVuY3Rpb24odCl7dmFyIGU9dC5pc0hvcml6b250YWwoKSxpPWU/WzAsby53aWR0aF06WzAsby5oZWlnaHRdLG49dC5pbnZlcnNlPzE6MDt0LnNldEV4dGVudChpW25dLGlbMS1uXSksbCh0LGU/by54Om8ueSl9KX12YXIgbz1jLmdldExheW91dFJlY3QodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSk7dGhpcy5fcmVjdD1vO3ZhciByPXRoaXMuX2F4ZXNMaXN0O24oKSwhaSYmdC5nZXQoImNvbnRhaW5MYWJlbCIpJiYobShyLGZ1bmN0aW9uKHQpe2lmKCF0Lm1vZGVsLmdldCgiYXhpc0xhYmVsLmluc2lkZSIpKXt2YXIgZT1hKHQpO2lmKGUpe3ZhciBpPXQuaXNIb3Jpem9udGFsKCk/ImhlaWdodCI6IndpZHRoIixuPXQubW9kZWwuZ2V0KCJheGlzTGFiZWwubWFyZ2luIik7b1tpXS09ZVtpXStuLCJ0b3AiPT09dC5wb3NpdGlvbj9vLnkrPWUuaGVpZ2h0K246ImxlZnQiPT09dC5wb3NpdGlvbiYmKG8ueCs9ZS53aWR0aCtuKX19fSksbigpKX0seC5nZXRBeGlzPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fYXhlc01hcFt0XTtpZihudWxsIT1pKXtpZihudWxsPT1lKWZvcih2YXIgbiBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkobikpcmV0dXJuIGlbbl07cmV0dXJuIGlbZV19fSx4LmdldEF4ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXhlc0xpc3Quc2xpY2UoKX0seC5nZXRDYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtpZihudWxsIT10JiZudWxsIT1lKXt2YXIgaT0ieCIrdCsieSIrZTtyZXR1cm4gdGhpcy5fY29vcmRzTWFwW2ldfWYuaXNPYmplY3QodCkmJihlPXQueUF4aXNJbmRleCx0PXQueEF4aXNJbmRleCk7Zm9yKHZhciBuPTAsYT10aGlzLl9jb29yZHNMaXN0O248YS5sZW5ndGg7bisrKWlmKGFbbl0uZ2V0QXhpcygieCIpLmluZGV4PT09dHx8YVtuXS5nZXRBeGlzKCJ5IikuaW5kZXg9PT1lKXJldHVybiBhW25dfSx4LmdldENhcnRlc2lhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRzTGlzdC5zbGljZSgpfSx4LmNvbnZlcnRUb1BpeGVsPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9maW5kQ29udmVydFRhcmdldCh0LGUpO3JldHVybiBuLmNhcnRlc2lhbj9uLmNhcnRlc2lhbi5kYXRhVG9Qb2ludChpKTpuLmF4aXM/bi5heGlzLnRvR2xvYmFsQ29vcmQobi5heGlzLmRhdGFUb0Nvb3JkKGkpKTpudWxsfSx4LmNvbnZlcnRGcm9tUGl4ZWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2ZpbmRDb252ZXJ0VGFyZ2V0KHQsZSk7cmV0dXJuIG4uY2FydGVzaWFuP24uY2FydGVzaWFuLnBvaW50VG9EYXRhKGkpOm4uYXhpcz9uLmF4aXMuY29vcmRUb0RhdGEobi5heGlzLnRvTG9jYWxDb29yZChpKSk6bnVsbH0seC5fZmluZENvbnZlcnRUYXJnZXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxuLGE9ZS5zZXJpZXNNb2RlbCxvPWUueEF4aXNNb2RlbHx8YSYmYS5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJ4QXhpcyIpWzBdLHI9ZS55QXhpc01vZGVsfHxhJiZhLmdldFJlZmVycmluZ0NvbXBvbmVudHMoInlBeGlzIilbMF0scz1lLmdyaWRNb2RlbCxsPXRoaXMuX2Nvb3Jkc0xpc3Q7aWYoYSlpPWEuY29vcmRpbmF0ZVN5c3RlbSxmLmluZGV4T2YobCxpKTwwJiYoaT1udWxsKTtlbHNlIGlmKG8mJnIpaT10aGlzLmdldENhcnRlc2lhbihvLmNvbXBvbmVudEluZGV4LHIuY29tcG9uZW50SW5kZXgpO2Vsc2UgaWYobyluPXRoaXMuZ2V0QXhpcygieCIsby5jb21wb25lbnRJbmRleCk7ZWxzZSBpZihyKW49dGhpcy5nZXRBeGlzKCJ5IixyLmNvbXBvbmVudEluZGV4KTtlbHNlIGlmKHMpe3ZhciB1PXMuY29vcmRpbmF0ZVN5c3RlbTt1PT09dGhpcyYmKGk9dGhpcy5fY29vcmRzTGlzdFswXSl9cmV0dXJue2NhcnRlc2lhbjppLGF4aXM6bn19LHguY29udGFpblBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2Nvb3Jkc0xpc3RbMF07aWYoZSlyZXR1cm4gZS5jb250YWluUG9pbnQodCl9LHguX2luaXRDYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIGEoaSl7cmV0dXJuIGZ1bmN0aW9uKGEsbCl7aWYobihhLHQsZSkpe3ZhciB1PWEuZ2V0KCJwb3NpdGlvbiIpOyJ4Ij09PWk/InRvcCIhPT11JiYiYm90dG9tIiE9PXUmJih1PSJib3R0b20iLG9bdV0mJih1PSJ0b3AiPT09dT8iYm90dG9tIjoidG9wIikpOiJsZWZ0IiE9PXUmJiJyaWdodCIhPT11JiYodT0ibGVmdCIsb1t1XSYmKHU9ImxlZnQiPT09dT8icmlnaHQiOiJsZWZ0IikpLG9bdV09ITA7dmFyIGg9bmV3IGcoaSxkLmNyZWF0ZVNjYWxlQnlNb2RlbChhKSxbMCwwXSxhLmdldCgidHlwZSIpLHUpLGM9ImNhdGVnb3J5Ij09PWgudHlwZTtoLm9uQmFuZD1jJiZhLmdldCgiYm91bmRhcnlHYXAiKSxoLmludmVyc2U9YS5nZXQoImludmVyc2UiKSxoLm9uWmVybz1hLmdldCgiYXhpc0xpbmUub25aZXJvIiksaC5vblplcm9BeGlzSW5kZXg9YS5nZXQoImF4aXNMaW5lLm9uWmVyb0F4aXNJbmRleCIpLGEuYXhpcz1oLGgubW9kZWw9YSxoLmdyaWQ9dGhpcyxoLmluZGV4PWwsdGhpcy5fYXhlc0xpc3QucHVzaChoKSxyW2ldW2xdPWgsc1tpXSsrfX19dmFyIG89e2xlZnQ6ITEscmlnaHQ6ITEsdG9wOiExLGJvdHRvbTohMX0scj17eDp7fSx5Ont9fSxzPXt4OjAseTowfTtyZXR1cm4gZS5lYWNoQ29tcG9uZW50KCJ4QXhpcyIsYSgieCIpLHRoaXMpLGUuZWFjaENvbXBvbmVudCgieUF4aXMiLGEoInkiKSx0aGlzKSxzLngmJnMueT8odGhpcy5fYXhlc01hcD1yLHZvaWQgbShyLngsZnVuY3Rpb24oZSxpKXttKHIueSxmdW5jdGlvbihuLGEpe3ZhciBvPSJ4IitpKyJ5IithLHI9bmV3IHAobyk7ci5ncmlkPXRoaXMsci5tb2RlbD10LHRoaXMuX2Nvb3Jkc01hcFtvXT1yLHRoaXMuX2Nvb3Jkc0xpc3QucHVzaChyKSxyLmFkZEF4aXMoZSksci5hZGRBeGlzKG4pfSx0aGlzKX0sdGhpcykpOih0aGlzLl9heGVzTWFwPXt9LHZvaWQodGhpcy5fYXhlc0xpc3Q9W10pKX0seC5fdXBkYXRlU2NhbGU9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSxpKXttKGkuY29vcmREaW1Ub0RhdGFEaW0oZS5kaW0pLGZ1bmN0aW9uKGkpe2Uuc2NhbGUudW5pb25FeHRlbnRGcm9tRGF0YSh0LGkpfSl9Zi5lYWNoKHRoaXMuX2F4ZXNMaXN0LGZ1bmN0aW9uKHQpe3Quc2NhbGUuc2V0RXh0ZW50KDEvMCwtKDEvMCkpfSksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKGEpe2lmKGgoYSkpe3ZhciBvPXUoYSx0KSxyPW9bMF0scz1vWzFdO2lmKCFuKHIsZSx0KXx8IW4ocyxlLHQpKXJldHVybjt2YXIgbD10aGlzLmdldENhcnRlc2lhbihyLmNvbXBvbmVudEluZGV4LHMuY29tcG9uZW50SW5kZXgpLGM9YS5nZXREYXRhKCksZD1sLmdldEF4aXMoIngiKSxmPWwuZ2V0QXhpcygieSIpOyJsaXN0Ij09PWMudHlwZSYmKGkoYyxkLGEpLGkoYyxmLGEpKX19LHRoaXMpfSx4LmdldFRvb2x0aXBBeGVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdLGk9W107cmV0dXJuIG0odGhpcy5nZXRDYXJ0ZXNpYW5zKCksZnVuY3Rpb24obil7dmFyIGE9bnVsbCE9dCYmImF1dG8iIT09dD9uLmdldEF4aXModCk6bi5nZXRCYXNlQXhpcygpLG89bi5nZXRPdGhlckF4aXMoYSk7Zi5pbmRleE9mKGUsYSk8MCYmZS5wdXNoKGEpLGYuaW5kZXhPZihpLG8pPDAmJmkucHVzaChvKX0pLHtiYXNlQXhlczplLG90aGVyQXhlczppfX07dmFyIF89WyJ4QXhpcyIsInlBeGlzIl07by5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtyZXR1cm4gdC5lYWNoQ29tcG9uZW50KCJncmlkIixmdW5jdGlvbihuLGEpe3ZhciByPW5ldyBvKG4sdCxlKTtyLm5hbWU9ImdyaWRfIithLHIucmVzaXplKG4sZSwhMCksbi5jb29yZGluYXRlU3lzdGVtPXIsaS5wdXNoKHIpfSksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKGUpe2lmKGgoZSkpe3ZhciBpPXUoZSx0KSxuPWlbMF0sYT1pWzFdLG89bi5nZXRDb29yZFN5c01vZGVsKCkscj1vLmNvb3JkaW5hdGVTeXN0ZW07ZS5jb29yZGluYXRlU3lzdGVtPXIuZ2V0Q2FydGVzaWFuKG4uY29tcG9uZW50SW5kZXgsYS5jb21wb25lbnRJbmRleCl9fSksaX0sby5kaW1lbnNpb25zPW8ucHJvdG90eXBlLmRpbWVuc2lvbnM9cC5wcm90b3R5cGUuZGltZW5zaW9ucyxpKDI2KS5yZWdpc3RlcigiY2FydGVzaWFuMmQiLG8pLHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ+c3x8dDwtc312YXIgYT1pKDE5KSxvPWkoNikscj1hLmlkZW50aXR5LHM9NWUtNSxsPWZ1bmN0aW9uKHQpe3Q9dHx8e30sdC5wb3NpdGlvbnx8KHRoaXMucG9zaXRpb249WzAsMF0pLG51bGw9PXQucm90YXRpb24mJih0aGlzLnJvdGF0aW9uPTApLHQuc2NhbGV8fCh0aGlzLnNjYWxlPVsxLDFdKSx0aGlzLm9yaWdpbj10aGlzLm9yaWdpbnx8bnVsbH0sdT1sLnByb3RvdHlwZTt1LnRyYW5zZm9ybT1udWxsLHUubmVlZExvY2FsVHJhbnNmb3JtPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yb3RhdGlvbil8fG4odGhpcy5wb3NpdGlvblswXSl8fG4odGhpcy5wb3NpdGlvblsxXSl8fG4odGhpcy5zY2FsZVswXS0xKXx8bih0aGlzLnNjYWxlWzFdLTEpfSx1LnVwZGF0ZVRyYW5zZm9ybT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucGFyZW50LGU9dCYmdC50cmFuc2Zvcm0saT10aGlzLm5lZWRMb2NhbFRyYW5zZm9ybSgpLG49dGhpcy50cmFuc2Zvcm07cmV0dXJuIGl8fGU/KG49bnx8YS5jcmVhdGUoKSxpP3RoaXMuZ2V0TG9jYWxUcmFuc2Zvcm0obik6cihuKSxlJiYoaT9hLm11bChuLHQudHJhbnNmb3JtLG4pOmEuY29weShuLHQudHJhbnNmb3JtKSksdGhpcy50cmFuc2Zvcm09bix0aGlzLmludlRyYW5zZm9ybT10aGlzLmludlRyYW5zZm9ybXx8YS5jcmVhdGUoKSx2b2lkIGEuaW52ZXJ0KHRoaXMuaW52VHJhbnNmb3JtLG4pKTp2b2lkKG4mJnIobikpfSx1LmdldExvY2FsVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBsLmdldExvY2FsVHJhbnNmb3JtKHRoaXMsdCl9LHUuc2V0VHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudHJhbnNmb3JtLGk9dC5kcHJ8fDE7ZT90LnNldFRyYW5zZm9ybShpKmVbMF0saSplWzFdLGkqZVsyXSxpKmVbM10saSplWzRdLGkqZVs1XSk6dC5zZXRUcmFuc2Zvcm0oaSwwLDAsaSwwLDApfSx1LnJlc3RvcmVUcmFuc2Zvcm09ZnVuY3Rpb24odCl7dmFyIGU9dC5kcHJ8fDE7dC5zZXRUcmFuc2Zvcm0oZSwwLDAsZSwwLDApfTt2YXIgaD1bXTt1LmRlY29tcG9zZVRyYW5zZm9ybT1mdW5jdGlvbigpe2lmKHRoaXMudHJhbnNmb3JtKXt2YXIgdD10aGlzLnBhcmVudCxlPXRoaXMudHJhbnNmb3JtO3QmJnQudHJhbnNmb3JtJiYoYS5tdWwoaCx0LmludlRyYW5zZm9ybSxlKSxlPWgpO3ZhciBpPWVbMF0qZVswXStlWzFdKmVbMV0sbz1lWzJdKmVbMl0rZVszXSplWzNdLHI9dGhpcy5wb3NpdGlvbixzPXRoaXMuc2NhbGU7bihpLTEpJiYoaT1NYXRoLnNxcnQoaSkpLG4oby0xKSYmKG89TWF0aC5zcXJ0KG8pKSxlWzBdPDAmJihpPS1pKSxlWzNdPDAmJihvPS1vKSxyWzBdPWVbNF0sclsxXT1lWzVdLHNbMF09aSxzWzFdPW8sdGhpcy5yb3RhdGlvbj1NYXRoLmF0YW4yKC1lWzFdL28sZVswXS9pKX19LHUuZ2V0R2xvYmFsU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRyYW5zZm9ybTtpZighdClyZXR1cm5bMSwxXTt2YXIgZT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksaT1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSk7cmV0dXJuIHRbMF08MCYmKGU9LWUpLHRbM108MCYmKGk9LWkpLFtlLGldfSx1LnRyYW5zZm9ybUNvb3JkVG9Mb2NhbD1mdW5jdGlvbih0LGUpe3ZhciBpPVt0LGVdLG49dGhpcy5pbnZUcmFuc2Zvcm07cmV0dXJuIG4mJm8uYXBwbHlUcmFuc2Zvcm0oaSxpLG4pLGl9LHUudHJhbnNmb3JtQ29vcmRUb0dsb2JhbD1mdW5jdGlvbih0LGUpe3ZhciBpPVt0LGVdLG49dGhpcy50cmFuc2Zvcm07cmV0dXJuIG4mJm8uYXBwbHlUcmFuc2Zvcm0oaSxpLG4pLGl9LGwuZ2V0TG9jYWxUcmFuc2Zvcm09ZnVuY3Rpb24odCxlKXtlPWV8fFtdLHIoZSk7dmFyIGk9dC5vcmlnaW4sbj10LnNjYWxlfHxbMSwxXSxvPXQucm90YXRpb258fDAscz10LnBvc2l0aW9ufHxbMCwwXTtyZXR1cm4gaSYmKGVbNF0tPWlbMF0sZVs1XS09aVsxXSksYS5zY2FsZShlLGUsbiksbyYmYS5yb3RhdGUoZSxlLG8pLGkmJihlWzRdKz1pWzBdLGVbNV0rPWlbMV0pLGVbNF0rPXNbMF0sZVs1XSs9c1sxXSxlfSx0LmV4cG9ydHM9bH0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTAxKSxhPWkoMSksbz1pKDEzKSxyPWkoOSkscz1bInZhbHVlIiwiY2F0ZWdvcnkiLCJ0aW1lIiwibG9nIl07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxpLGwpe2EuZWFjaChzLGZ1bmN0aW9uKG8pe2UuZXh0ZW5kKHt0eXBlOnQrIkF4aXMuIitvLG1lcmdlRGVmYXVsdEFuZFRoZW1lOmZ1bmN0aW9uKGUsbil7dmFyIHM9dGhpcy5sYXlvdXRNb2RlLGw9cz9yLmdldExheW91dFBhcmFtcyhlKTp7fSx1PW4uZ2V0VGhlbWUoKTthLm1lcmdlKGUsdS5nZXQobysiQXhpcyIpKSxhLm1lcmdlKGUsdGhpcy5nZXREZWZhdWx0T3B0aW9uKCkpLGUudHlwZT1pKHQsZSkscyYmci5tZXJnZUxheW91dFBhcmFtKGUsbCxzKX0sZGVmYXVsdE9wdGlvbjphLm1lcmdlQWxsKFt7fSxuW28rIkF4aXMiXSxsXSwhMCl9KX0pLG8ucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKHQrIkF4aXMiLGEuY3VycnkoaSx0KSl9fSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gZS50eXBlfHwoZS5kYXRhPyJjYXRlZ29yeSI6InZhbHVlIil9dmFyIGE9aSgxMyksbz1pKDEpLHI9aSg2Mikscz1hLmV4dGVuZCh7dHlwZToiY2FydGVzaWFuMmRBeGlzIixheGlzOm51bGwsaW5pdDpmdW5jdGlvbigpe3Muc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLHRoaXMucmVzZXRSYW5nZSgpfSxtZXJnZU9wdGlvbjpmdW5jdGlvbigpe3Muc3VwZXJBcHBseSh0aGlzLCJtZXJnZU9wdGlvbiIsYXJndW1lbnRzKSx0aGlzLnJlc2V0UmFuZ2UoKX0scmVzdG9yZURhdGE6ZnVuY3Rpb24oKXtzLnN1cGVyQXBwbHkodGhpcywicmVzdG9yZURhdGEiLGFyZ3VtZW50cyksdGhpcy5yZXNldFJhbmdlKCl9LGdldENvb3JkU3lzTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lY01vZGVsLnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6ImdyaWQiLGluZGV4OnRoaXMub3B0aW9uLmdyaWRJbmRleCxpZDp0aGlzLm9wdGlvbi5ncmlkSWR9KVswXX19KTtvLm1lcmdlKHMucHJvdG90eXBlLGkoNDIpKTt2YXIgbD17b2Zmc2V0OjB9O3IoIngiLHMsbixsKSxyKCJ5IixzLG4sbCksdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZS5lYWNoU2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksaT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoaSl7Zm9yKHZhciBuPVtdLGE9aS5kaW1lbnNpb25zLG89MDtvPGEubGVuZ3RoO28rKyluLnB1c2godC5jb29yZERpbVRvRGF0YURpbShpLmRpbWVuc2lvbnNbb10pWzBdKTsxPT09bi5sZW5ndGg/ZS5lYWNoKG5bMF0sZnVuY3Rpb24odCxuKXtlLnNldEl0ZW1MYXlvdXQobixpc05hTih0KT9bTmFOLE5hTl06aS5kYXRhVG9Qb2ludCh0KSl9KToyPT09bi5sZW5ndGgmJmUuZWFjaChuLGZ1bmN0aW9uKHQsbixhKXtlLnNldEl0ZW1MYXlvdXQoYSxpc05hTih0KXx8aXNOYU4obik/W05hTixOYU5dOmkuZGF0YVRvUG9pbnQoW3Qsbl0pKX0sITApfX0pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTUpLGE9bi5zZXQsbz1uLmdldDt0LmV4cG9ydHM9e2NsZWFyQ29sb3JQYWxldHRlOmZ1bmN0aW9uKCl7YSh0aGlzLCJjb2xvcklkeCIsMCksYSh0aGlzLCJjb2xvck5hbWVNYXAiLHt9KX0sZ2V0Q29sb3JGcm9tUGFsZXR0ZTpmdW5jdGlvbih0LGUpe2U9ZXx8dGhpczt2YXIgaT1vKGUsImNvbG9ySWR4Iil8fDAsbj1vKGUsImNvbG9yTmFtZU1hcCIpfHxhKGUsImNvbG9yTmFtZU1hcCIse30pO2lmKG4uaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIG5bdF07dmFyIHI9dGhpcy5nZXQoImNvbG9yIiwhMCl8fFtdO2lmKHIubGVuZ3RoKXt2YXIgcz1yW2ldO3JldHVybiB0JiYoblt0XT1zKSxhKGUsImNvbG9ySWR4IiwoaSsxKSVyLmxlbmd0aCksc319fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmZpbmRDb21wb25lbnRzKHttYWluVHlwZToibGVnZW5kIn0pO2kmJmkubGVuZ3RoJiZlLmVhY2hTZXJpZXNCeVR5cGUodCxmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKTtlLmZpbHRlclNlbGYoZnVuY3Rpb24odCl7Zm9yKHZhciBuPWUuZ2V0TmFtZSh0KSxhPTA7YTxpLmxlbmd0aDthKyspaWYoIWlbYV0uaXNTZWxlY3RlZChuKSlyZXR1cm4hMTtyZXR1cm4hMH0sdGhpcyl9LHRoaXMpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3RbZV09TWF0aC5tYXgoTWF0aC5taW4odFtlXSxpWzFdKSxpWzBdKX12YXIgYT1pKDQpLG89YS5yb3VuZCxyPXt9O3IuaW50ZXJ2YWxTY2FsZU5pY2VUaWNrcz1mdW5jdGlvbih0LGUsaSxuKXt2YXIgcz17fSxsPXRbMV0tdFswXSx1PXMuaW50ZXJ2YWw9YS5uaWNlKGwvZSwhMCk7bnVsbCE9aSYmdTxpJiYodT1zLmludGVydmFsPWkpLG51bGwhPW4mJnU+biYmKHU9cy5pbnRlcnZhbD1uKTt2YXIgaD1zLmludGVydmFsUHJlY2lzaW9uPXIuZ2V0SW50ZXJ2YWxQcmVjaXNpb24odSksYz1zLm5pY2VUaWNrRXh0ZW50PVtvKE1hdGguY2VpbCh0WzBdL3UpKnUsaCksbyhNYXRoLmZsb29yKHRbMV0vdSkqdSxoKV07cmV0dXJuIHIuZml4RXh0ZW50KGMsdCksc30sci5nZXRJbnRlcnZhbFByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYS5nZXRQcmVjaXNpb25TYWZlKHQpKzJ9LHIuZml4RXh0ZW50PWZ1bmN0aW9uKHQsZSl7IWlzRmluaXRlKHRbMF0pJiYodFswXT1lWzBdKSwhaXNGaW5pdGUodFsxXSkmJih0WzFdPWVbMV0pLG4odCwwLGUpLG4odCwxLGUpLHRbMF0+dFsxXSYmKHRbMF09dFsxXSl9LHIuaW50ZXJ2YWxTY2FsZUdldFRpY2tzPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPVtdO2lmKCF0KXJldHVybiBhO3ZhciByPTFlNDtlWzBdPGlbMF0mJmEucHVzaChlWzBdKTtmb3IodmFyIHM9aVswXTtzPD1pWzFdJiYoYS5wdXNoKHMpLHM9byhzK3QsbikscyE9PWFbYS5sZW5ndGgtMV0pOylpZihhLmxlbmd0aD5yKXJldHVybltdO3JldHVybiBlWzFdPihhLmxlbmd0aD9hW2EubGVuZ3RoLTFdOmlbMV0pJiZhLnB1c2goZVsxXSksYX0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDM2KSxhPWkoNTApLG89aSgxNSkscj1mdW5jdGlvbigpe3RoaXMuZ3JvdXA9bmV3IG4sdGhpcy51aWQ9YS5nZXRVSUQoInZpZXdDb21wb25lbnQiKX07ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIsaW5pdDpmdW5jdGlvbih0LGUpe30scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe30sZGlzcG9zZTpmdW5jdGlvbigpe319O3ZhciBzPXIucHJvdG90eXBlO3MudXBkYXRlVmlldz1zLnVwZGF0ZUxheW91dD1zLnVwZGF0ZVZpc3VhbD1mdW5jdGlvbih0LGUsaSxuKXt9LG8uZW5hYmxlQ2xhc3NFeHRlbmQociksby5lbmFibGVDbGFzc01hbmFnZW1lbnQocix7cmVnaXN0ZXJXaGVuRXh0ZW5kOiEwfSksdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSg3NCksYT1pKDIzKSxvPWkoNjEpLHI9aSgxODQpLHM9aSgxKSxsPWZ1bmN0aW9uKHQpe28uY2FsbCh0aGlzLHQpLGEuY2FsbCh0aGlzLHQpLHIuY2FsbCh0aGlzLHQpLHRoaXMuaWQ9dC5pZHx8bigpfTtsLnByb3RvdHlwZT17dHlwZToiZWxlbWVudCIsbmFtZToiIixfX3pyOm51bGwsaWdub3JlOiExLGNsaXBQYXRoOm51bGwsZHJpZnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5kcmFnZ2FibGUpe2Nhc2UiaG9yaXpvbnRhbCI6ZT0wO2JyZWFrO2Nhc2UidmVydGljYWwiOnQ9MH12YXIgaT10aGlzLnRyYW5zZm9ybTtpfHwoaT10aGlzLnRyYW5zZm9ybT1bMSwwLDAsMSwwLDBdKSxpWzRdKz10LGlbNV0rPWUsdGhpcy5kZWNvbXBvc2VUcmFuc2Zvcm0oKSx0aGlzLmRpcnR5KCExKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7fSxhZnRlclVwZGF0ZTpmdW5jdGlvbigpe30sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVUcmFuc2Zvcm0oKX0sdHJhdmVyc2U6ZnVuY3Rpb24odCxlKXt9LGF0dHJLVjpmdW5jdGlvbih0LGUpe2lmKCJwb3NpdGlvbiI9PT10fHwic2NhbGUiPT09dHx8Im9yaWdpbiI9PT10KXtpZihlKXt2YXIgaT10aGlzW3RdO2l8fChpPXRoaXNbdF09W10pLGlbMF09ZVswXSxpWzFdPWVbMV19fWVsc2UgdGhpc1t0XT1lfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmU9ITAsdGhpcy5fX3pyJiZ0aGlzLl9fenIucmVmcmVzaCgpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmU9ITEsdGhpcy5fX3pyJiZ0aGlzLl9fenIucmVmcmVzaCgpfSxhdHRyOmZ1bmN0aW9uKHQsZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRoaXMuYXR0cktWKHQsZSk7ZWxzZSBpZihzLmlzT2JqZWN0KHQpKWZvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJnRoaXMuYXR0cktWKGksdFtpXSk7cmV0dXJuIHRoaXMuZGlydHkoITEpLHRoaXN9LHNldENsaXBQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX196cjtlJiZ0LmFkZFNlbGZUb1pyKGUpLHRoaXMuY2xpcFBhdGgmJnRoaXMuY2xpcFBhdGghPT10JiZ0aGlzLnJlbW92ZUNsaXBQYXRoKCksdGhpcy5jbGlwUGF0aD10LHQuX196cj1lLHQuX19jbGlwVGFyZ2V0PXRoaXMsdGhpcy5kaXJ0eSghMSl9LHJlbW92ZUNsaXBQYXRoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jbGlwUGF0aDt0JiYodC5fX3pyJiZ0LnJlbW92ZVNlbGZGcm9tWnIodC5fX3pyKSx0Ll9fenI9bnVsbCx0Ll9fY2xpcFRhcmdldD1udWxsLHRoaXMuY2xpcFBhdGg9bnVsbCx0aGlzLmRpcnR5KCExKSl9LGFkZFNlbGZUb1pyOmZ1bmN0aW9uKHQpe3RoaXMuX196cj10O3ZhciBlPXRoaXMuYW5pbWF0b3JzO2lmKGUpZm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspdC5hbmltYXRpb24uYWRkQW5pbWF0b3IoZVtpXSk7dGhpcy5jbGlwUGF0aCYmdGhpcy5jbGlwUGF0aC5hZGRTZWxmVG9acih0KX0scmVtb3ZlU2VsZkZyb21acjpmdW5jdGlvbih0KXt0aGlzLl9fenI9bnVsbDt2YXIgZT10aGlzLmFuaW1hdG9ycztpZihlKWZvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXQuYW5pbWF0aW9uLnJlbW92ZUFuaW1hdG9yKGVbaV0pO3RoaXMuY2xpcFBhdGgmJnRoaXMuY2xpcFBhdGgucmVtb3ZlU2VsZkZyb21acih0KX19LHMubWl4aW4obCxyKSxzLm1peGluKGwsbykscy5taXhpbihsLGEpLHQuZXhwb3J0cz1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0W2VdfWZ1bmN0aW9uIGEodCxlLGkpe3RbZV09aX1mdW5jdGlvbiBvKHQsZSxpKXtyZXR1cm4oZS10KSppK3R9ZnVuY3Rpb24gcih0LGUsaSl7cmV0dXJuIGk+LjU/ZTp0fWZ1bmN0aW9uIHModCxlLGksbixhKXt2YXIgcj10Lmxlbmd0aDtpZigxPT1hKWZvcih2YXIgcz0wO3M8cjtzKyspbltzXT1vKHRbc10sZVtzXSxpKTtlbHNlIGZvcih2YXIgbD1yJiZ0WzBdLmxlbmd0aCxzPTA7czxyO3MrKylmb3IodmFyIHU9MDt1PGw7dSsrKW5bc11bdV09byh0W3NdW3VdLGVbc11bdV0saSl9ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG49dC5sZW5ndGgsYT1lLmxlbmd0aDtpZihuIT09YSl7dmFyIG89bj5hO2lmKG8pdC5sZW5ndGg9YTtlbHNlIGZvcih2YXIgcj1uO3I8YTtyKyspdC5wdXNoKDE9PT1pP2Vbcl06Xy5jYWxsKGVbcl0pKX1mb3IodmFyIHM9dFswXSYmdFswXS5sZW5ndGgscj0wO3I8dC5sZW5ndGg7cisrKWlmKDE9PT1pKWlzTmFOKHRbcl0pJiYodFtyXT1lW3JdKTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspaXNOYU4odFtyXVtsXSkmJih0W3JdW2xdPWVbcl1bbF0pfWZ1bmN0aW9uIHUodCxlLGkpe2lmKHQ9PT1lKXJldHVybiEwO3ZhciBuPXQubGVuZ3RoO2lmKG4hPT1lLmxlbmd0aClyZXR1cm4hMTtpZigxPT09aSl7Zm9yKHZhciBhPTA7YTxuO2ErKylpZih0W2FdIT09ZVthXSlyZXR1cm4hMX1lbHNlIGZvcih2YXIgbz10WzBdLmxlbmd0aCxhPTA7YTxuO2ErKylmb3IodmFyIHI9MDtyPG87cisrKWlmKHRbYV1bcl0hPT1lW2FdW3JdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGgodCxlLGksbixhLG8scixzLGwpe3ZhciB1PXQubGVuZ3RoO2lmKDE9PWwpZm9yKHZhciBoPTA7aDx1O2grKylzW2hdPWModFtoXSxlW2hdLGlbaF0sbltoXSxhLG8scik7ZWxzZSBmb3IodmFyIGQ9dFswXS5sZW5ndGgsaD0wO2g8dTtoKyspZm9yKHZhciBmPTA7ZjxkO2YrKylzW2hdW2ZdPWModFtoXVtmXSxlW2hdW2ZdLGlbaF1bZl0sbltoXVtmXSxhLG8scil9ZnVuY3Rpb24gYyh0LGUsaSxuLGEsbyxyKXt2YXIgcz0uNSooaS10KSxsPS41KihuLWUpO3JldHVybigyKihlLWkpK3MrbCkqcisoLTMqKGUtaSktMipzLWwpKm8rcyphK2V9ZnVuY3Rpb24gZCh0KXtpZih4KHQpKXt2YXIgZT10Lmxlbmd0aDtpZih4KHRbMF0pKXtmb3IodmFyIGk9W10sbj0wO248ZTtuKyspaS5wdXNoKF8uY2FsbCh0W25dKSk7cmV0dXJuIGl9cmV0dXJuIF8uY2FsbCh0KX1yZXR1cm4gdH1mdW5jdGlvbiBmKHQpe3JldHVybiB0WzBdPU1hdGguZmxvb3IodFswXSksdFsxXT1NYXRoLmZsb29yKHRbMV0pLHRbMl09TWF0aC5mbG9vcih0WzJdKSwicmdiYSgiK3Quam9pbigiLCIpKyIpIn1mdW5jdGlvbiBwKHQpe3ZhciBlPXRbdC5sZW5ndGgtMV0udmFsdWU7cmV0dXJuIHgoZSYmZVswXSk/MjoxfWZ1bmN0aW9uIGcodCxlLGksbixhLGQpe3ZhciBnPXQuX2dldHRlcix5PXQuX3NldHRlcixfPSJzcGxpbmUiPT09ZSxiPW4ubGVuZ3RoO2lmKGIpe3ZhciB3LFM9blswXS52YWx1ZSxNPXgoUyksST0hMSxUPSExLEE9TT9wKG4pOjA7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGltZS1lLnRpbWV9KSx3PW5bYi0xXS50aW1lO2Zvcih2YXIgQz1bXSxMPVtdLEQ9blswXS52YWx1ZSxQPSEwLGs9MDtrPGI7aysrKXtDLnB1c2gobltrXS50aW1lL3cpO3ZhciBPPW5ba10udmFsdWU7aWYoTSYmdShPLEQsQSl8fCFNJiZPPT09RHx8KFA9ITEpLEQ9Tywic3RyaW5nIj09dHlwZW9mIE8pe3ZhciB6PXYucGFyc2UoTyk7ej8oTz16LEk9ITApOlQ9ITB9TC5wdXNoKE8pfWlmKGR8fCFQKXtmb3IodmFyIFI9TFtiLTFdLGs9MDtrPGItMTtrKyspTT9sKExba10sUixBKTohaXNOYU4oTFtrXSl8fGlzTmFOKFIpfHxUfHxJfHwoTFtrXT1SKTtNJiZsKGcodC5fdGFyZ2V0LGEpLFIsQSk7dmFyIEUsTixWLEIsRyxILFc9MCxGPTA7aWYoSSl2YXIgWj1bMCwwLDAsMF07dmFyIHE9ZnVuY3Rpb24odCxlKXt2YXIgaTtpZihlPDApaT0wO2Vsc2UgaWYoZTxGKXtmb3IoRT1NYXRoLm1pbihXKzEsYi0xKSxpPUU7aT49MCYmIShDW2ldPD1lKTtpLS0pO2k9TWF0aC5taW4oaSxiLTIpfWVsc2V7Zm9yKGk9VztpPGImJiEoQ1tpXT5lKTtpKyspO2k9TWF0aC5taW4oaS0xLGItMil9Vz1pLEY9ZTt2YXIgbj1DW2krMV0tQ1tpXTtpZigwIT09bilpZihOPShlLUNbaV0pL24sXylpZihCPUxbaV0sVj1MWzA9PT1pP2k6aS0xXSxHPUxbaT5iLTI/Yi0xOmkrMV0sSD1MW2k+Yi0zP2ItMTppKzJdLE0paChWLEIsRyxILE4sTipOLE4qTipOLGcodCxhKSxBKTtlbHNle3ZhciBsO2lmKEkpbD1oKFYsQixHLEgsTixOKk4sTipOKk4sWiwxKSxsPWYoWik7ZWxzZXtpZihUKXJldHVybiByKEIsRyxOKTtsPWMoVixCLEcsSCxOLE4qTixOKk4qTil9eSh0LGEsbCl9ZWxzZSBpZihNKXMoTFtpXSxMW2krMV0sTixnKHQsYSksQSk7ZWxzZXt2YXIgbDtpZihJKXMoTFtpXSxMW2krMV0sTixaLDEpLGw9ZihaKTtlbHNle2lmKFQpcmV0dXJuIHIoTFtpXSxMW2krMV0sTik7bD1vKExbaV0sTFtpKzFdLE4pfXkodCxhLGwpfX0saj1uZXcgbSh7dGFyZ2V0OnQuX3RhcmdldCxsaWZlOncsbG9vcDp0Ll9sb29wLGRlbGF5OnQuX2RlbGF5LG9uZnJhbWU6cSxvbmRlc3Ryb3k6aX0pO3JldHVybiBlJiYic3BsaW5lIiE9PWUmJihqLmVhc2luZz1lKSxqfX19dmFyIG09aSgxNjQpLHY9aSgyMikseT1pKDEpLHg9eS5pc0FycmF5TGlrZSxfPUFycmF5LnByb3RvdHlwZS5zbGljZSxiPWZ1bmN0aW9uKHQsZSxpLG8pe3RoaXMuX3RyYWNrcz17fSx0aGlzLl90YXJnZXQ9dCx0aGlzLl9sb29wPWV8fCExLHRoaXMuX2dldHRlcj1pfHxuLHRoaXMuX3NldHRlcj1vfHxhLHRoaXMuX2NsaXBDb3VudD0wLHRoaXMuX2RlbGF5PTAsdGhpcy5fZG9uZUxpc3Q9W10sdGhpcy5fb25mcmFtZUxpc3Q9W10sdGhpcy5fY2xpcExpc3Q9W119O2IucHJvdG90eXBlPXt3aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fdHJhY2tzO2Zvcih2YXIgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe2lmKCFpW25dKXtpW25dPVtdO3ZhciBhPXRoaXMuX2dldHRlcih0aGlzLl90YXJnZXQsbik7aWYobnVsbD09YSljb250aW51ZTswIT09dCYmaVtuXS5wdXNoKHt0aW1lOjAsdmFsdWU6ZChhKX0pfWlbbl0ucHVzaCh7dGltZTp0LHZhbHVlOmVbbl19KX1yZXR1cm4gdGhpc30sZHVyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbmZyYW1lTGlzdC5wdXNoKHQpLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9jbGlwTGlzdC5sZW5ndGg7dCsrKXRoaXMuX2NsaXBMaXN0W3RdLnBhdXNlKCk7dGhpcy5fcGF1c2VkPSEwfSxyZXN1bWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX2NsaXBMaXN0Lmxlbmd0aDt0KyspdGhpcy5fY2xpcExpc3RbdF0ucmVzdW1lKCk7dGhpcy5fcGF1c2VkPSExfSxpc1BhdXNlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcGF1c2VkfSxfZG9uZUNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5fdHJhY2tzPXt9LHRoaXMuX2NsaXBMaXN0Lmxlbmd0aD0wO2Zvcih2YXIgdD10aGlzLl9kb25lTGlzdCxlPXQubGVuZ3RoLGk9MDtpPGU7aSsrKXRbaV0uY2FsbCh0aGlzKX0sc3RhcnQ6ZnVuY3Rpb24odCxlKXt2YXIgaSxuPXRoaXMsYT0wLG89ZnVuY3Rpb24oKXthLS0sYXx8bi5fZG9uZUNhbGxiYWNrKCl9O2Zvcih2YXIgciBpbiB0aGlzLl90cmFja3MpaWYodGhpcy5fdHJhY2tzLmhhc093blByb3BlcnR5KHIpKXt2YXIgcz1nKHRoaXMsdCxvLHRoaXMuX3RyYWNrc1tyXSxyLGUpO3MmJih0aGlzLl9jbGlwTGlzdC5wdXNoKHMpLGErKyx0aGlzLmFuaW1hdGlvbiYmdGhpcy5hbmltYXRpb24uYWRkQ2xpcChzKSxpPXMpfWlmKGkpe3ZhciBsPWkub25mcmFtZTtpLm9uZnJhbWU9ZnVuY3Rpb24odCxlKXtsKHQsZSk7Zm9yKHZhciBpPTA7aTxuLl9vbmZyYW1lTGlzdC5sZW5ndGg7aSsrKW4uX29uZnJhbWVMaXN0W2ldKHQsZSl9fXJldHVybiBhfHx0aGlzLl9kb25lQ2FsbGJhY2soKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jbGlwTGlzdCxpPXRoaXMuYW5pbWF0aW9uLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGE9ZVtuXTt0JiZhLm9uZnJhbWUodGhpcy5fdGFyZ2V0LDEpLGkmJmkucmVtb3ZlQ2xpcChhKX1lLmxlbmd0aD0wfSxkZWxheTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVsYXk9dCx0aGlzfSxkb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9kb25lTGlzdC5wdXNoKHQpLHRoaXN9LGdldENsaXBzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NsaXBMaXN0fX0sdC5leHBvcnRzPWJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyl8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSYmd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNil9fSxmdW5jdGlvbih0LGUpe3ZhciBpPTIqTWF0aC5QSTt0LmV4cG9ydHM9e25vcm1hbGl6ZVJhZGlhbjpmdW5jdGlvbih0KXtyZXR1cm4gdCU9aSx0PDAmJih0Kz1pKSx0fX19LGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLl9sZW49MH0sbj1pLnByb3RvdHlwZTtuLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYSh0KTtyZXR1cm4gdGhpcy5pbnNlcnRFbnRyeShlKSxlfSxuLmluc2VydEVudHJ5PWZ1bmN0aW9uKHQpe3RoaXMuaGVhZD8odGhpcy50YWlsLm5leHQ9dCx0LnByZXY9dGhpcy50YWlsLHQubmV4dD1udWxsLHRoaXMudGFpbD10KTp0aGlzLmhlYWQ9dGhpcy50YWlsPXQsdGhpcy5fbGVuKyt9LG4ucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXQucHJldixpPXQubmV4dDtlP2UubmV4dD1pOnRoaXMuaGVhZD1pLGk/aS5wcmV2PWU6dGhpcy50YWlsPWUsdC5uZXh0PXQucHJldj1udWxsLHRoaXMuX2xlbi0tfSxuLmxlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZW59LG4uY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5fbGVuPTB9O3ZhciBhPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dCx0aGlzLm5leHQsdGhpcy5wcmV2fSxvPWZ1bmN0aW9uKHQpe3RoaXMuX2xpc3Q9bmV3IGksdGhpcy5fbWFwPXt9LHRoaXMuX21heFNpemU9dHx8MTAsdGhpcy5fbGFzdFJlbW92ZWRFbnRyeT1udWxsfSxyPW8ucHJvdG90eXBlO3IucHV0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fbGlzdCxuPXRoaXMuX21hcCxvPW51bGw7aWYobnVsbD09blt0XSl7dmFyIHI9aS5sZW4oKSxzPXRoaXMuX2xhc3RSZW1vdmVkRW50cnk7aWYocj49dGhpcy5fbWF4U2l6ZSYmcj4wKXt2YXIgbD1pLmhlYWQ7aS5yZW1vdmUobCksZGVsZXRlIG5bbC5rZXldLG89bC52YWx1ZSx0aGlzLl9sYXN0UmVtb3ZlZEVudHJ5PWx9cz9zLnZhbHVlPWU6cz1uZXcgYShlKSxzLmtleT10LGkuaW5zZXJ0RW50cnkocyksblt0XT1zfXJldHVybiBvfSxyLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXBbdF0saT10aGlzLl9saXN0O2lmKG51bGwhPWUpcmV0dXJuIGUhPT1pLnRhaWwmJihpLnJlbW92ZShlKSxpLmluc2VydEVudHJ5KGUpKSxlLnZhbHVlfSxyLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fbGlzdC5jbGVhcigpLHRoaXMuX21hcD17fX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7dmFyIGk9MjMxMTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gaSsrfX0sZnVuY3Rpb24odCxlKXt2YXIgaT1mdW5jdGlvbih0LGUpe3RoaXMuaW1hZ2U9dCx0aGlzLnJlcGVhdD1lLHRoaXMudHlwZT0icGF0dGVybiJ9O2kucHJvdG90eXBlLmdldENhbnZhc1BhdHRlcm49ZnVuY3Rpb24odCl7cmV0dXJuIHQuY3JlYXRlUGF0dGVybih0aGlzLmltYWdlLHRoaXMucmVwZWF0fHwicmVwZWF0Iil9LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlLGkpe3ZhciBuPW51bGw9PWUueD8wOmUueCxhPW51bGw9PWUueDI/MTplLngyLG89bnVsbD09ZS55PzA6ZS55LHI9bnVsbD09ZS55Mj8wOmUueTI7ZS5nbG9iYWx8fChuPW4qaS53aWR0aCtpLngsYT1hKmkud2lkdGgraS54LG89byppLmhlaWdodCtpLnkscj1yKmkuaGVpZ2h0K2kueSk7dmFyIHM9dC5jcmVhdGVMaW5lYXJHcmFkaWVudChuLG8sYSxyKTtyZXR1cm4gc31mdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj1pLndpZHRoLGE9aS5oZWlnaHQsbz1NYXRoLm1pbihuLGEpLHI9bnVsbD09ZS54Py41OmUueCxzPW51bGw9PWUueT8uNTplLnksbD1udWxsPT1lLnI/LjU6ZS5yO2UuZ2xvYmFsfHwocj1yKm4raS54LHM9cyphK2kueSxsKj1vKTt2YXIgdT10LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHIscywwLHIscyxsKTtyZXR1cm4gdX12YXIgYT1bWyJzaGFkb3dCbHVyIiwwXSxbInNoYWRvd09mZnNldFgiLDBdLFsic2hhZG93T2Zmc2V0WSIsMF0sWyJzaGFkb3dDb2xvciIsIiMwMDAiXSxbImxpbmVDYXAiLCJidXR0Il0sWyJsaW5lSm9pbiIsIm1pdGVyIl0sWyJtaXRlckxpbWl0IiwxMF1dLG89ZnVuY3Rpb24odCxlKXt0aGlzLmV4dGVuZEZyb20odCwhMSksdGhpcy5ob3N0PWV9O28ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvLGhvc3Q6bnVsbCxmaWxsOiIjMDAwIixzdHJva2U6bnVsbCxvcGFjaXR5OjEsbGluZURhc2g6bnVsbCxsaW5lRGFzaE9mZnNldDowLHNoYWRvd0JsdXI6MCxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLGxpbmVXaWR0aDoxLHN0cm9rZU5vU2NhbGU6ITEsdGV4dDpudWxsLGZvbnQ6bnVsbCx0ZXh0Rm9udDpudWxsLGZvbnRTdHlsZTpudWxsLGZvbnRXZWlnaHQ6bnVsbCxmb250U2l6ZTpudWxsLGZvbnRGYW1pbHk6bnVsbCx0ZXh0VGFnOm51bGwsdGV4dEZpbGw6IiMwMDAiLHRleHRTdHJva2U6bnVsbCx0ZXh0V2lkdGg6bnVsbCx0ZXh0SGVpZ2h0Om51bGwsdGV4dFN0cm9rZVdpZHRoOjAsdGV4dExpbmVIZWlnaHQ6bnVsbCx0ZXh0UG9zaXRpb246Imluc2lkZSIsdGV4dFJlY3Q6bnVsbCx0ZXh0T2Zmc2V0Om51bGwsdGV4dEFsaWduOm51bGwsdGV4dFZlcnRpY2FsQWxpZ246bnVsbCx0ZXh0RGlzdGFuY2U6NSx0ZXh0U2hhZG93Q29sb3I6InRyYW5zcGFyZW50Iix0ZXh0U2hhZG93Qmx1cjowLHRleHRTaGFkb3dPZmZzZXRYOjAsdGV4dFNoYWRvd09mZnNldFk6MCx0ZXh0Qm94U2hhZG93Q29sb3I6InRyYW5zcGFyZW50Iix0ZXh0Qm94U2hhZG93Qmx1cjowLHRleHRCb3hTaGFkb3dPZmZzZXRYOjAsdGV4dEJveFNoYWRvd09mZnNldFk6MCx0cmFuc2Zvcm1UZXh0OiExLHRleHRSb3RhdGlvbjowLHRleHRPcmlnaW46bnVsbCx0ZXh0QmFja2dyb3VuZENvbG9yOm51bGwsdGV4dEJvcmRlckNvbG9yOm51bGwsdGV4dEJvcmRlcldpZHRoOjAsdGV4dEJvcmRlclJhZGl1czowLHRleHRQYWRkaW5nOm51bGwscmljaDpudWxsLHRydW5jYXRlOm51bGwsYmxlbmQ6bnVsbCxiaW5kOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49dGhpcyxvPWkmJmkuc3R5bGUscj0hbyxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc10sdT1sWzBdOyhyfHxuW3VdIT09b1t1XSkmJih0W3VdPW5bdV18fGxbMV0pfWlmKChyfHxuLmZpbGwhPT1vLmZpbGwpJiYodC5maWxsU3R5bGU9bi5maWxsKSwocnx8bi5zdHJva2UhPT1vLnN0cm9rZSkmJih0LnN0cm9rZVN0eWxlPW4uc3Ryb2tlKSwocnx8bi5vcGFjaXR5IT09by5vcGFjaXR5KSYmKHQuZ2xvYmFsQWxwaGE9bnVsbD09bi5vcGFjaXR5PzE6bi5vcGFjaXR5KSwocnx8bi5ibGVuZCE9PW8uYmxlbmQpJiYodC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249bi5ibGVuZHx8InNvdXJjZS1vdmVyIiksdGhpcy5oYXNTdHJva2UoKSl7dmFyIGg9bi5saW5lV2lkdGg7dC5saW5lV2lkdGg9aC8odGhpcy5zdHJva2VOb1NjYWxlJiZlJiZlLmdldExpbmVTY2FsZT9lLmdldExpbmVTY2FsZSgpOjEpfX0saGFzRmlsbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZmlsbDtyZXR1cm4gbnVsbCE9dCYmIm5vbmUiIT09dH0saGFzU3Ryb2tlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdHJva2U7cmV0dXJuIG51bGwhPXQmJiJub25lIiE9PXQmJnRoaXMubGluZVdpZHRoPjB9LGV4dGVuZEZyb206ZnVuY3Rpb24odCxlKXtpZih0KWZvcih2YXIgaSBpbiB0KSF0Lmhhc093blByb3BlcnR5KGkpfHxlIT09ITAmJihlPT09ITE/dGhpcy5oYXNPd25Qcm9wZXJ0eShpKTpudWxsPT10W2ldKXx8KHRoaXNbaV09dFtpXSl9LHNldDpmdW5jdGlvbih0LGUpeyJzdHJpbmciPT10eXBlb2YgdD90aGlzW3RdPWU6dGhpcy5leHRlbmRGcm9tKHQsITApfSxjbG9uZTpmdW5jdGlvbigpe3ZhciB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0LmV4dGVuZEZyb20odGhpcywhMCksdH0sZ2V0R3JhZGllbnQ6ZnVuY3Rpb24odCxlLGEpe2Zvcih2YXIgbz0icmFkaWFsIj09PWUudHlwZT9uOmkscj1vKHQsZSxhKSxzPWUuY29sb3JTdG9wcyxsPTA7bDxzLmxlbmd0aDtsKyspci5hZGRDb2xvclN0b3Aoc1tsXS5vZmZzZXQsc1tsXS5jb2xvcik7cmV0dXJuIHJ9fTtmb3IodmFyIHI9by5wcm90b3R5cGUscz0wO3M8YS5sZW5ndGg7cysrKXt2YXIgbD1hW3NdO2xbMF1pbiByfHwocltsWzBdXT1sWzFdKX1vLmdldEdyYWRpZW50PXIuZ2V0R3JhZGllbnQsdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEwKSxhPVtbInNoYWRvd0JsdXIiLDBdLFsic2hhZG93Q29sb3IiLCIjMDAwIl0sWyJzaGFkb3dPZmZzZXRYIiwwXSxbInNoYWRvd09mZnNldFkiLDBdXTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uYnJvd3Nlci5pZSYmbi5icm93c2VyLnZlcnNpb24+PTExP2Z1bmN0aW9uKCl7dmFyIGUsaT10aGlzLl9fY2xpcFBhdGhzLG49dGhpcy5zdHlsZTtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcj1pW29dLHM9ciYmci5zaGFwZSxsPXImJnIudHlwZTtpZihzJiYoInNlY3RvciI9PT1sJiZzLnN0YXJ0QW5nbGU9PT1zLmVuZEFuZ2xlfHwicmVjdCI9PT1sJiYoIXMud2lkdGh8fCFzLmhlaWdodCkpKXtmb3IodmFyIHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdWzJdPW5bYVt1XVswXV0sblthW3VdWzBdXT1hW3VdWzFdO2U9ITA7YnJlYWt9fWlmKHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUpZm9yKHZhciB1PTA7dTxhLmxlbmd0aDt1KyspblthW3VdWzBdXT1hW3VdWzJdfTp0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTc0KSxhPWkoMTczKTt0LmV4cG9ydHM9e2J1aWxkUGF0aDpmdW5jdGlvbih0LGUsaSl7dmFyIG89ZS5wb2ludHMscj1lLnNtb290aDtpZihvJiZvLmxlbmd0aD49Mil7aWYociYmInNwbGluZSIhPT1yKXt2YXIgcz1hKG8scixpLGUuc21vb3RoQ29uc3RyYWludCk7dC5tb3ZlVG8ob1swXVswXSxvWzBdWzFdKTtmb3IodmFyIGw9by5sZW5ndGgsdT0wO3U8KGk/bDpsLTEpO3UrKyl7dmFyIGg9c1syKnVdLGM9c1syKnUrMV0sZD1vWyh1KzEpJWxdO3QuYmV6aWVyQ3VydmVUbyhoWzBdLGhbMV0sY1swXSxjWzFdLGRbMF0sZFsxXSl9fWVsc2V7InNwbGluZSI9PT1yJiYobz1uKG8saSkpLHQubW92ZVRvKG9bMF1bMF0sb1swXVsxXSk7Zm9yKHZhciB1PTEsZj1vLmxlbmd0aDt1PGY7dSsrKXQubGluZVRvKG9bdV1bMF0sb1t1XVsxXSl9aSYmdC5jbG9zZVBhdGgoKX19fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2J1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpLG4sYSxvLHI9ZS54LHM9ZS55LGw9ZS53aWR0aCx1PWUuaGVpZ2h0LGg9ZS5yO2w8MCYmKHIrPWwsbD0tbCksdTwwJiYocys9dSx1PS11KSwibnVtYmVyIj09dHlwZW9mIGg/aT1uPWE9bz1oOmggaW5zdGFuY2VvZiBBcnJheT8xPT09aC5sZW5ndGg/aT1uPWE9bz1oWzBdOjI9PT1oLmxlbmd0aD8oaT1hPWhbMF0sbj1vPWhbMV0pOjM9PT1oLmxlbmd0aD8oaT1oWzBdLG49bz1oWzFdLGE9aFsyXSk6KGk9aFswXSxuPWhbMV0sCmE9aFsyXSxvPWhbM10pOmk9bj1hPW89MDt2YXIgYztpK24+bCYmKGM9aStuLGkqPWwvYyxuKj1sL2MpLGErbz5sJiYoYz1hK28sYSo9bC9jLG8qPWwvYyksbithPnUmJihjPW4rYSxuKj11L2MsYSo9dS9jKSxpK28+dSYmKGM9aStvLGkqPXUvYyxvKj11L2MpLHQubW92ZVRvKHIraSxzKSx0LmxpbmVUbyhyK2wtbixzKSwwIT09biYmdC5xdWFkcmF0aWNDdXJ2ZVRvKHIrbCxzLHIrbCxzK24pLHQubGluZVRvKHIrbCxzK3UtYSksMCE9PWEmJnQucXVhZHJhdGljQ3VydmVUbyhyK2wscyt1LHIrbC1hLHMrdSksdC5saW5lVG8ocitvLHMrdSksMCE9PW8mJnQucXVhZHJhdGljQ3VydmVUbyhyLHMrdSxyLHMrdS1vKSx0LmxpbmVUbyhyLHMraSksMCE9PWkmJnQucXVhZHJhdGljQ3VydmVUbyhyLHMscitpLHMpfX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9e307YS5sYXlvdXQ9ZnVuY3Rpb24odCxlLGkpe2k9aXx8e307dmFyIGE9dC5jb29yZGluYXRlU3lzdGVtLG89ZS5heGlzLHI9e30scz1vLnBvc2l0aW9uLGw9by5vblplcm8/Im9uWmVybyI6cyx1PW8uZGltLGg9YS5nZXRSZWN0KCksYz1baC54LGgueCtoLndpZHRoLGgueSxoLnkraC5oZWlnaHRdLGQ9e2xlZnQ6MCxyaWdodDoxLHRvcDowLGJvdHRvbToxLG9uWmVybzoyfSxmPWUuZ2V0KCJvZmZzZXQiKXx8MCxwPSJ4Ij09PXU/W2NbMl0tZixjWzNdK2ZdOltjWzBdLWYsY1sxXStmXTtpZihvLm9uWmVybyl7dmFyIGc9YS5nZXRBeGlzKCJ4Ij09PXU/InkiOiJ4IixvLm9uWmVyb0F4aXNJbmRleCksbT1nLnRvR2xvYmFsQ29vcmQoZy5kYXRhVG9Db29yZCgwKSk7cFtkLm9uWmVyb109TWF0aC5tYXgoTWF0aC5taW4obSxwWzFdKSxwWzBdKX1yLnBvc2l0aW9uPVsieSI9PT11P3BbZFtsXV06Y1swXSwieCI9PT11P3BbZFtsXV06Y1szXV0sci5yb3RhdGlvbj1NYXRoLlBJLzIqKCJ4Ij09PXU/MDoxKTt2YXIgdj17dG9wOi0xLGJvdHRvbToxLGxlZnQ6LTEscmlnaHQ6MX07ci5sYWJlbERpcmVjdGlvbj1yLnRpY2tEaXJlY3Rpb249ci5uYW1lRGlyZWN0aW9uPXZbc10sci5sYWJlbE9mZnNldD1vLm9uWmVybz9wW2Rbc11dLXBbZC5vblplcm9dOjAsZS5nZXQoImF4aXNUaWNrLmluc2lkZSIpJiYoci50aWNrRGlyZWN0aW9uPS1yLnRpY2tEaXJlY3Rpb24pLG4ucmV0cmlldmUoaS5sYWJlbEluc2lkZSxlLmdldCgiYXhpc0xhYmVsLmluc2lkZSIpKSYmKHIubGFiZWxEaXJlY3Rpb249LXIubGFiZWxEaXJlY3Rpb24pO3ZhciB5PWUuZ2V0KCJheGlzTGFiZWwucm90YXRlIik7cmV0dXJuIHIubGFiZWxSb3RhdGU9InRvcCI9PT1sPy15Onksci5sYWJlbEludGVydmFsPW8uZ2V0TGFiZWxJbnRlcnZhbCgpLHIuejI9MSxyfSx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpLG4pe3ZhciBhPW4uZ2V0V2lkdGgoKSxvPW4uZ2V0SGVpZ2h0KCk7dFswXT1NYXRoLm1pbih0WzBdK2UsYSktZSx0WzFdPU1hdGgubWluKHRbMV0raSxvKS1pLHRbMF09TWF0aC5tYXgodFswXSwwKSx0WzFdPU1hdGgubWF4KHRbMV0sMCl9dmFyIGE9aSgxKSxvPWkoMykscj1pKDE2KSxzPWkoNyksbD1pKDE5KSx1PWkoMTgpLGg9aSg0MCksYz17fTtjLmJ1aWxkRWxTdHlsZT1mdW5jdGlvbih0KXt2YXIgZSxpPXQuZ2V0KCJ0eXBlIiksbj10LmdldE1vZGVsKGkrIlN0eWxlIik7cmV0dXJuImxpbmUiPT09aT8oZT1uLmdldExpbmVTdHlsZSgpLGUuZmlsbD1udWxsKToic2hhZG93Ij09PWkmJihlPW4uZ2V0QXJlYVN0eWxlKCksZS5zdHJva2U9bnVsbCksZX0sYy5idWlsZExhYmVsRWxPcHRpb249ZnVuY3Rpb24odCxlLGksYSxvKXt2YXIgbD1pLmdldCgidmFsdWUiKSx1PWMuZ2V0VmFsdWVMYWJlbChsLGUuYXhpcyxlLmVjTW9kZWwsaS5nZXQoInNlcmllc0RhdGFJbmRpY2VzIikse3ByZWNpc2lvbjppLmdldCgibGFiZWwucHJlY2lzaW9uIiksZm9ybWF0dGVyOmkuZ2V0KCJsYWJlbC5mb3JtYXR0ZXIiKX0pLGg9aS5nZXRNb2RlbCgibGFiZWwiKSxkPXMubm9ybWFsaXplQ3NzQXJyYXkoaC5nZXQoInBhZGRpbmciKXx8MCksZj1oLmdldEZvbnQoKSxwPXIuZ2V0Qm91bmRpbmdSZWN0KHUsZiksZz1vLnBvc2l0aW9uLG09cC53aWR0aCtkWzFdK2RbM10sdj1wLmhlaWdodCtkWzBdK2RbMl0seT1vLmFsaWduOyJyaWdodCI9PT15JiYoZ1swXS09bSksImNlbnRlciI9PT15JiYoZ1swXS09bS8yKTt2YXIgeD1vLnZlcnRpY2FsQWxpZ247ImJvdHRvbSI9PT14JiYoZ1sxXS09diksIm1pZGRsZSI9PT14JiYoZ1sxXS09di8yKSxuKGcsbSx2LGEpO3ZhciBfPWguZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiKTtfJiYiYXV0byIhPT1ffHwoXz1lLmdldCgiYXhpc0xpbmUubGluZVN0eWxlLmNvbG9yIikpLHQubGFiZWw9e3NoYXBlOnt4OjAseTowLHdpZHRoOm0saGVpZ2h0OnYscjpoLmdldCgiYm9yZGVyUmFkaXVzIil9LHBvc2l0aW9uOmcuc2xpY2UoKSxzdHlsZTp7dGV4dDp1LHRleHRGb250OmYsdGV4dEZpbGw6aC5nZXRUZXh0Q29sb3IoKSx0ZXh0UG9zaXRpb246Imluc2lkZSIsZmlsbDpfLHN0cm9rZTpoLmdldCgiYm9yZGVyQ29sb3IiKXx8InRyYW5zcGFyZW50IixsaW5lV2lkdGg6aC5nZXQoImJvcmRlcldpZHRoIil8fDAsc2hhZG93Qmx1cjpoLmdldCgic2hhZG93Qmx1ciIpLHNoYWRvd0NvbG9yOmguZ2V0KCJzaGFkb3dDb2xvciIpLHNoYWRvd09mZnNldFg6aC5nZXQoInNoYWRvd09mZnNldFgiKSxzaGFkb3dPZmZzZXRZOmguZ2V0KCJzaGFkb3dPZmZzZXRZIil9LHoyOjEwfX0sYy5nZXRWYWx1ZUxhYmVsPWZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIHI9ZS5zY2FsZS5nZXRMYWJlbCh0LHtwcmVjaXNpb246by5wcmVjaXNpb259KSxzPW8uZm9ybWF0dGVyO2lmKHMpe3ZhciBsPXt2YWx1ZTp1LmdldEF4aXNSYXdWYWx1ZShlLHQpLHNlcmllc0RhdGE6W119O2EuZWFjaChuLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0U2VyaWVzQnlJbmRleCh0LnNlcmllc0luZGV4KSxuPXQuZGF0YUluZGV4SW5zaWRlLGE9ZSYmZS5nZXREYXRhUGFyYW1zKG4pO2EmJmwuc2VyaWVzRGF0YS5wdXNoKGEpfSksYS5pc1N0cmluZyhzKT9yPXMucmVwbGFjZSgie3ZhbHVlfSIscik6YS5pc0Z1bmN0aW9uKHMpJiYocj1zKGwpKX1yZXR1cm4gcn0sYy5nZXRUcmFuc2Zvcm1lZFBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1sLmNyZWF0ZSgpO3JldHVybiBsLnJvdGF0ZShuLG4saS5yb3RhdGlvbiksbC50cmFuc2xhdGUobixuLGkucG9zaXRpb24pLG8uYXBwbHlUcmFuc2Zvcm0oW3QuZGF0YVRvQ29vcmQoZSksKGkubGFiZWxPZmZzZXR8fDApKyhpLmxhYmVsRGlyZWN0aW9ufHwxKSooaS5sYWJlbE1hcmdpbnx8MCldLG4pfSxjLmJ1aWxkQ2FydGVzaWFuU2luZ2xlTGFiZWxFbE9wdGlvbj1mdW5jdGlvbih0LGUsaSxuLGEsbyl7dmFyIHI9aC5pbm5lclRleHRMYXlvdXQoaS5yb3RhdGlvbiwwLGkubGFiZWxEaXJlY3Rpb24pO2kubGFiZWxNYXJnaW49YS5nZXQoImxhYmVsLm1hcmdpbiIpLGMuYnVpbGRMYWJlbEVsT3B0aW9uKGUsbixhLG8se3Bvc2l0aW9uOmMuZ2V0VHJhbnNmb3JtZWRQb3NpdGlvbihuLmF4aXMsdCxpKSxhbGlnbjpyLnRleHRBbGlnbix2ZXJ0aWNhbEFsaWduOnIudGV4dFZlcnRpY2FsQWxpZ259KX0sYy5tYWtlTGluZVNoYXBlPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaT1pfHwwLHt4MTp0W2ldLHkxOnRbMS1pXSx4MjplW2ldLHkyOmVbMS1pXX19LGMubWFrZVJlY3RTaGFwZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIGk9aXx8MCx7eDp0W2ldLHk6dFsxLWldLHdpZHRoOmVbaV0saGVpZ2h0OmVbMS1pXX19LGMubWFrZVNlY3RvclNoYXBlPWZ1bmN0aW9uKHQsZSxpLG4sYSxvKXtyZXR1cm57Y3g6dCxjeTplLHIwOmkscjpuLHN0YXJ0QW5nbGU6YSxlbmRBbmdsZTpvLGNsb2Nrd2lzZTohMH19LHQuZXhwb3J0cz1jfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg3KSxhPWkoMSksbz17fSxyPVsieCIsInkiLCJ6IiwicmFkaXVzIiwiYW5nbGUiLCJzaW5nbGUiXSxzPVsiY2FydGVzaWFuMmQiLCJwb2xhciIsInNpbmdsZUF4aXMiXTtvLmlzQ29vcmRTdXBwb3J0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGEuaW5kZXhPZihzLHQpPj0wfSxvLmNyZWF0ZU5hbWVFYWNoPWZ1bmN0aW9uKHQsZSl7dD10LnNsaWNlKCk7dmFyIGk9YS5tYXAodCxuLmNhcGl0YWxGaXJzdCk7ZT0oZXx8W10pLnNsaWNlKCk7dmFyIG89YS5tYXAoZSxuLmNhcGl0YWxGaXJzdCk7cmV0dXJuIGZ1bmN0aW9uKG4scil7YS5lYWNoKHQsZnVuY3Rpb24odCxhKXtmb3IodmFyIHM9e25hbWU6dCxjYXBpdGFsOmlbYV19LGw9MDtsPGUubGVuZ3RoO2wrKylzW2VbbF1dPXQrb1tsXTtuLmNhbGwocixzKX0pfX0sby5lYWNoQXhpc0RpbT1vLmNyZWF0ZU5hbWVFYWNoKHIsWyJheGlzSW5kZXgiLCJheGlzIiwiaW5kZXgiLCJpZCJdKSxvLmNyZWF0ZUxpbmtlZE5vZGVzRmluZGVyPWZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGEuaW5kZXhPZihlLm5vZGVzLHQpPj0wfWZ1bmN0aW9uIG8odCxuKXt2YXIgbz0hMTtyZXR1cm4gZShmdW5jdGlvbihlKXthLmVhY2goaSh0LGUpfHxbXSxmdW5jdGlvbih0KXtuLnJlY29yZHNbZS5uYW1lXVt0XSYmKG89ITApfSl9KSxvfWZ1bmN0aW9uIHIodCxuKXtuLm5vZGVzLnB1c2godCksZShmdW5jdGlvbihlKXthLmVhY2goaSh0LGUpfHxbXSxmdW5jdGlvbih0KXtuLnJlY29yZHNbZS5uYW1lXVt0XT0hMH0pfSl9cmV0dXJuIGZ1bmN0aW9uKGkpe2Z1bmN0aW9uIGEodCl7IW4odCxzKSYmbyh0LHMpJiYocih0LHMpLGw9ITApfXZhciBzPXtub2RlczpbXSxyZWNvcmRzOnt9fTtpZihlKGZ1bmN0aW9uKHQpe3MucmVjb3Jkc1t0Lm5hbWVdPXt9fSksIWkpcmV0dXJuIHM7cihpLHMpO3ZhciBsO2RvIGw9ITEsdChhKTt3aGlsZShsKTtyZXR1cm4gc319LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKTt0LmV4cG9ydHM9e3VwZGF0ZVNlbGVjdGVkTWFwOmZ1bmN0aW9uKHQpe3RoaXMuX3RhcmdldExpc3Q9dC5zbGljZSgpLHRoaXMuX3NlbGVjdFRhcmdldE1hcD1uLnJlZHVjZSh0fHxbXSxmdW5jdGlvbih0LGUpe3JldHVybiB0LnNldChlLm5hbWUsZSksdH0sbi5jcmVhdGVIYXNoTWFwKCkpfSxzZWxlY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsIT1lP3RoaXMuX3RhcmdldExpc3RbZV06dGhpcy5fc2VsZWN0VGFyZ2V0TWFwLmdldCh0KSxuPXRoaXMuZ2V0KCJzZWxlY3RlZE1vZGUiKTsic2luZ2xlIj09PW4mJnRoaXMuX3NlbGVjdFRhcmdldE1hcC5lYWNoKGZ1bmN0aW9uKHQpe3Quc2VsZWN0ZWQ9ITF9KSxpJiYoaS5zZWxlY3RlZD0hMCl9LHVuU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9bnVsbCE9ZT90aGlzLl90YXJnZXRMaXN0W2VdOnRoaXMuX3NlbGVjdFRhcmdldE1hcC5nZXQodCk7aSYmKGkuc2VsZWN0ZWQ9ITEpfSx0b2dnbGVTZWxlY3RlZDpmdW5jdGlvbih0LGUpe3ZhciBpPW51bGwhPWU/dGhpcy5fdGFyZ2V0TGlzdFtlXTp0aGlzLl9zZWxlY3RUYXJnZXRNYXAuZ2V0KHQpO2lmKG51bGwhPWkpcmV0dXJuIHRoaXNbaS5zZWxlY3RlZD8idW5TZWxlY3QiOiJzZWxlY3QiXSh0LGUpLGkuc2VsZWN0ZWR9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1udWxsIT1lP3RoaXMuX3RhcmdldExpc3RbZV06dGhpcy5fc2VsZWN0VGFyZ2V0TWFwLmdldCh0KTtyZXR1cm4gaSYmaS5zZWxlY3RlZH19fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXthLmRlZmF1bHRFbXBoYXNpcyh0LmxhYmVsLFsic2hvdyJdKX12YXIgYT1pKDUpLG89aSgxKSxyPWkoMTApLHM9aSg3KSxsPXMuYWRkQ29tbWFzLHU9cy5lbmNvZGVIVE1MLGg9aSgyKS5leHRlbmRDb21wb25lbnRNb2RlbCh7dHlwZToibWFya2VyIixkZXBlbmRlbmNpZXM6WyJzZXJpZXMiLCJncmlkIiwicG9sYXIiLCJnZW8iXSxpbml0OmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMubWVyZ2VEZWZhdWx0QW5kVGhlbWUodCxpKSx0aGlzLm1lcmdlT3B0aW9uKHQsaSxuLmNyZWF0ZWRCeVNlbGYsITApfSxpc0FuaW1hdGlvbkVuYWJsZWQ6ZnVuY3Rpb24oKXtpZihyLm5vZGUpcmV0dXJuITE7dmFyIHQ9dGhpcy5fX2hvc3RTZXJpZXM7cmV0dXJuIHRoaXMuZ2V0U2hhbGxvdygiYW5pbWF0aW9uIikmJnQmJnQuaXNBbmltYXRpb25FbmFibGVkKCl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQsZSxpLGEpe3ZhciByPXRoaXMuY29uc3RydWN0b3Iscz10aGlzLm1haW5UeXBlKyJNb2RlbCI7aXx8ZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ2V0KHRoaXMubWFpblR5cGUpLGw9dFtzXTtyZXR1cm4gaSYmaS5kYXRhPyhsP2wubWVyZ2VPcHRpb24oaSxlLCEwKTooYSYmbihpKSxvLmVhY2goaS5kYXRhLGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBBcnJheT8obih0WzBdKSxuKHRbMV0pKTpuKHQpfSksbD1uZXcgcihpLHRoaXMsZSksby5leHRlbmQobCx7bWFpblR5cGU6dGhpcy5tYWluVHlwZSxzZXJpZXNJbmRleDp0LnNlcmllc0luZGV4LG5hbWU6dC5uYW1lLGNyZWF0ZWRCeVNlbGY6ITB9KSxsLl9faG9zdFNlcmllcz10KSx2b2lkKHRbc109bCkpOnZvaWQodFtzXT1udWxsKX0sdGhpcyl9LGZvcm1hdFRvb2x0aXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXREYXRhKCksaT10aGlzLmdldFJhd1ZhbHVlKHQpLG49by5pc0FycmF5KGkpP28ubWFwKGksbCkuam9pbigiLCAiKTpsKGkpLGE9ZS5nZXROYW1lKHQpLHI9dSh0aGlzLm5hbWUpO3JldHVybihudWxsIT1pfHxhKSYmKHIrPSI8YnIgLz4iKSxhJiYocis9dShhKSxudWxsIT1pJiYocis9IiA6ICIpKSxudWxsIT1pJiYocis9dShuKSkscn0sZ2V0RGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxzZXREYXRhOmZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH19KTtvLm1peGluKGgsYS5kYXRhRm9ybWF0TWl4aW4pLHQuZXhwb3J0cz1ofSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKTt0LmV4cG9ydHM9aSgyKS5leHRlbmRDb21wb25lbnRWaWV3KHt0eXBlOiJtYXJrZXIiLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLm1hcmtlckdyb3VwTWFwPW4uY3JlYXRlSGFzaE1hcCgpfSxyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMubWFya2VyR3JvdXBNYXA7bi5lYWNoKGZ1bmN0aW9uKHQpe3QuX19rZWVwPSExfSk7dmFyIGE9dGhpcy50eXBlKyJNb2RlbCI7ZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3ZhciBuPXRbYV07biYmdGhpcy5yZW5kZXJTZXJpZXModCxuLGUsaSl9LHRoaXMpLG4uZWFjaChmdW5jdGlvbih0KXshdC5fX2tlZXAmJnRoaXMuZ3JvdXAucmVtb3ZlKHQuZ3JvdXApfSx0aGlzKX0scmVuZGVyU2VyaWVzOmZ1bmN0aW9uKCl7fX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4hKGlzTmFOKHBhcnNlRmxvYXQodC54KSkmJmlzTmFOKHBhcnNlRmxvYXQodC55KSkpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodC54KSkmJiFpc05hTihwYXJzZUZsb2F0KHQueSkpfWZ1bmN0aW9uIG8odCxlLGkpe3ZhciBuPS0xO2RvIG49TWF0aC5tYXgobC5nZXRQcmVjaXNpb24odC5nZXQoZSxpKSksbiksdD10LnN0YWNrZWRPbjt3aGlsZSh0KTtyZXR1cm4gbn1mdW5jdGlvbiByKHQsZSxpLG4sYSxyKXt2YXIgcz1bXSxsPW0oZSxuLHQpLHU9ZS5pbmRpY2VzT2ZOZWFyZXN0KG4sbCwhMClbMF07c1thXT1lLmdldChpLHUsITApLHNbcl09ZS5nZXQobix1LCEwKTt2YXIgaD1vKGUsbix1KTtyZXR1cm4gaD1NYXRoLm1pbihoLDIwKSxoPj0wJiYoc1tyXT0rc1tyXS50b0ZpeGVkKGgpKSxzfXZhciBzPWkoMSksbD1pKDQpLHU9cy5pbmRleE9mLGg9cy5jdXJyeSxjPXttaW46aChyLCJtaW4iKSxtYXg6aChyLCJtYXgiKSxhdmVyYWdlOmgociwiYXZlcmFnZSIpfSxkPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXREYXRhKCksbj10LmNvb3JkaW5hdGVTeXN0ZW07aWYoZSYmIWEoZSkmJiFzLmlzQXJyYXkoZS5jb29yZCkmJm4pe3ZhciBvPW4uZGltZW5zaW9ucyxyPWYoZSxpLG4sdCk7aWYoZT1zLmNsb25lKGUpLGUudHlwZSYmY1tlLnR5cGVdJiZyLmJhc2VBeGlzJiZyLnZhbHVlQXhpcyl7dmFyIGw9dShvLHIuYmFzZUF4aXMuZGltKSxoPXUobyxyLnZhbHVlQXhpcy5kaW0pO2UuY29vcmQ9Y1tlLnR5cGVdKGksci5iYXNlRGF0YURpbSxyLnZhbHVlRGF0YURpbSxsLGgpLGUudmFsdWU9ZS5jb29yZFtoXX1lbHNle2Zvcih2YXIgZD1bbnVsbCE9ZS54QXhpcz9lLnhBeGlzOmUucmFkaXVzQXhpcyxudWxsIT1lLnlBeGlzP2UueUF4aXM6ZS5hbmdsZUF4aXNdLHA9MDtwPDI7cCsrKWlmKGNbZFtwXV0pe3ZhciBnPXQuY29vcmREaW1Ub0RhdGFEaW0ob1twXSlbMF07ZFtwXT1tKGksZyxkW3BdKX1lLmNvb3JkPWR9fXJldHVybiBlfSxmPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXt9O3JldHVybiBudWxsIT10LnZhbHVlSW5kZXh8fG51bGwhPXQudmFsdWVEaW0/KGEudmFsdWVEYXRhRGltPW51bGwhPXQudmFsdWVJbmRleD9lLmdldERpbWVuc2lvbih0LnZhbHVlSW5kZXgpOnQudmFsdWVEaW0sYS52YWx1ZUF4aXM9aS5nZXRBeGlzKG4uZGF0YURpbVRvQ29vcmREaW0oYS52YWx1ZURhdGFEaW0pKSxhLmJhc2VBeGlzPWkuZ2V0T3RoZXJBeGlzKGEudmFsdWVBeGlzKSxhLmJhc2VEYXRhRGltPW4uY29vcmREaW1Ub0RhdGFEaW0oYS5iYXNlQXhpcy5kaW0pWzBdKTooYS5iYXNlQXhpcz1uLmdldEJhc2VBeGlzKCksYS52YWx1ZUF4aXM9aS5nZXRPdGhlckF4aXMoYS5iYXNlQXhpcyksYS5iYXNlRGF0YURpbT1uLmNvb3JkRGltVG9EYXRhRGltKGEuYmFzZUF4aXMuZGltKVswXSxhLnZhbHVlRGF0YURpbT1uLmNvb3JkRGltVG9EYXRhRGltKGEudmFsdWVBeGlzLmRpbSlbMF0pLGF9LHA9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHQmJnQuY29udGFpbkRhdGEmJmUuY29vcmQmJiFuKGUpKXx8dC5jb250YWluRGF0YShlLmNvb3JkKX0sZz1mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gbjwyP3QuY29vcmQmJnQuY29vcmRbbl06dC52YWx1ZX0sbT1mdW5jdGlvbih0LGUsaSl7aWYoImF2ZXJhZ2UiPT09aSl7dmFyIG49MCxhPTA7cmV0dXJuIHQuZWFjaChlLGZ1bmN0aW9uKHQsZSl7aXNOYU4odCl8fChuKz10LGErKyl9LCEwKSxuL2F9cmV0dXJuIHQuZ2V0RGF0YUV4dGVudChlLCEwKVsibWF4Ij09PWk/MTowXX07dC5leHBvcnRzPXtkYXRhVHJhbnNmb3JtOmQsZGF0YUZpbHRlcjpwLGRpbVZhbHVlR2V0dGVyOmcsZ2V0QXhpc0luZm86ZixudW1DYWxjdWxhdGU6bX19LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5nZXQoInN0YWNrIil8fGQrdC5zZXJpZXNJbmRleH1mdW5jdGlvbiBhKHQpe3JldHVybiB0LmRpbSt0LmluZGV4fWZ1bmN0aW9uIG8odCxlKXt2YXIgaT1bXSxuPXQuYXhpcyxhPSJheGlzMCI7aWYoImNhdGVnb3J5Ij09PW4udHlwZSl7Zm9yKHZhciBvPW4uZ2V0QmFuZFdpZHRoKCkscj0wO3I8dC5jb3VudDtyKyspaS5wdXNoKHUuZGVmYXVsdHMoe2JhbmRXaWR0aDpvLGF4aXNLZXk6YSxzdGFja0lkOmQrcn0sdCkpO2Zvcih2YXIgbD1zKGksZSksaD1bXSxyPTA7cjx0LmNvdW50O3IrKyl7dmFyIGM9bFthXVtkK3JdO2Mub2Zmc2V0Q2VudGVyPWMub2Zmc2V0K2Mud2lkdGgvMixoLnB1c2goYyl9cmV0dXJuIGh9fWZ1bmN0aW9uIHIodCxlKXt2YXIgaT11Lm1hcCh0LGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RGF0YSgpLGk9dC5jb29yZGluYXRlU3lzdGVtLG89aS5nZXRCYXNlQXhpcygpLHI9by5nZXRFeHRlbnQoKSxzPSJjYXRlZ29yeSI9PT1vLnR5cGU/by5nZXRCYW5kV2lkdGgoKTpNYXRoLmFicyhyWzFdLXJbMF0pL2UuY291bnQoKSxsPWModC5nZXQoImJhcldpZHRoIikscyksdT1jKHQuZ2V0KCJiYXJNYXhXaWR0aCIpLHMpLGg9dC5nZXQoImJhckdhcCIpLGQ9dC5nZXQoImJhckNhdGVnb3J5R2FwIik7cmV0dXJue2JhbmRXaWR0aDpzLGJhcldpZHRoOmwsYmFyTWF4V2lkdGg6dSxiYXJHYXA6aCxiYXJDYXRlZ29yeUdhcDpkLGF4aXNLZXk6YShvKSxzdGFja0lkOm4odCl9fSk7cmV0dXJuIHMoaSxlKX1mdW5jdGlvbiBzKHQsZSl7dmFyIGk9e307dS5lYWNoKHQsZnVuY3Rpb24odCxlKXt2YXIgbj10LmF4aXNLZXksYT10LmJhbmRXaWR0aCxvPWlbbl18fHtiYW5kV2lkdGg6YSxyZW1haW5lZFdpZHRoOmEsYXV0b1dpZHRoQ291bnQ6MCxjYXRlZ29yeUdhcDoiMjAlIixnYXA6IjMwJSIsc3RhY2tzOnt9fSxyPW8uc3RhY2tzO2lbbl09bzt2YXIgcz10LnN0YWNrSWQ7cltzXXx8by5hdXRvV2lkdGhDb3VudCsrLHJbc109cltzXXx8e3dpZHRoOjAsbWF4V2lkdGg6MH07dmFyIGw9dC5iYXJXaWR0aDtsJiYhcltzXS53aWR0aCYmKHJbc10ud2lkdGg9bCxsPU1hdGgubWluKG8ucmVtYWluZWRXaWR0aCxsKSxvLnJlbWFpbmVkV2lkdGgtPWwpO3ZhciB1PXQuYmFyTWF4V2lkdGg7dSYmKHJbc10ubWF4V2lkdGg9dSk7dmFyIGg9dC5iYXJHYXA7bnVsbCE9aCYmKG8uZ2FwPWgpO3ZhciBjPXQuYmFyQ2F0ZWdvcnlHYXA7bnVsbCE9YyYmKG8uY2F0ZWdvcnlHYXA9Yyl9KTt2YXIgbj17fTtyZXR1cm4gdS5lYWNoKGksZnVuY3Rpb24odCxlKXtuW2VdPXt9O3ZhciBpPXQuc3RhY2tzLGE9dC5iYW5kV2lkdGgsbz1jKHQuY2F0ZWdvcnlHYXAsYSkscj1jKHQuZ2FwLDEpLHM9dC5yZW1haW5lZFdpZHRoLGw9dC5hdXRvV2lkdGhDb3VudCxoPShzLW8pLyhsKyhsLTEpKnIpO2g9TWF0aC5tYXgoaCwwKSx1LmVhY2goaSxmdW5jdGlvbih0LGUpe3ZhciBpPXQubWF4V2lkdGg7aSYmaTxoJiYoaT1NYXRoLm1pbihpLHMpLHQud2lkdGgmJihpPU1hdGgubWluKGksdC53aWR0aCkpLHMtPWksdC53aWR0aD1pLGwtLSl9KSxoPShzLW8pLyhsKyhsLTEpKnIpLGg9TWF0aC5tYXgoaCwwKTt2YXIgZCxmPTA7dS5lYWNoKGksZnVuY3Rpb24odCxlKXt0LndpZHRofHwodC53aWR0aD1oKSxkPXQsZis9dC53aWR0aCooMStyKX0pLGQmJihmLT1kLndpZHRoKnIpO3ZhciBwPS1mLzI7dS5lYWNoKGksZnVuY3Rpb24odCxpKXtuW2VdW2ldPW5bZV1baV18fHtvZmZzZXQ6cCx3aWR0aDp0LndpZHRofSxwKz10LndpZHRoKigxK3IpfSl9KSxufWZ1bmN0aW9uIGwodCxlLGkpe3ZhciBvPXIodS5maWx0ZXIoZS5nZXRTZXJpZXNCeVR5cGUodCksZnVuY3Rpb24odCl7cmV0dXJuIWUuaXNTZXJpZXNGaWx0ZXJlZCh0KSYmdC5jb29yZGluYXRlU3lzdGVtJiYiY2FydGVzaWFuMmQiPT09dC5jb29yZGluYXRlU3lzdGVtLnR5cGV9KSkscz17fSxsPXt9O2UuZWFjaFNlcmllc0J5VHlwZSh0LGZ1bmN0aW9uKHQpe2lmKCJjYXJ0ZXNpYW4yZCI9PT10LmNvb3JkaW5hdGVTeXN0ZW0udHlwZSl7dmFyIGU9dC5nZXREYXRhKCksaT10LmNvb3JkaW5hdGVTeXN0ZW0scj1pLmdldEJhc2VBeGlzKCksdT1uKHQpLGg9b1thKHIpXVt1XSxjPWgub2Zmc2V0LGQ9aC53aWR0aCxmPWkuZ2V0T3RoZXJBeGlzKHIpLHA9dC5nZXQoImJhck1pbkhlaWdodCIpfHwwLGc9ci5vblplcm8/Zi50b0dsb2JhbENvb3JkKGYuZGF0YVRvQ29vcmQoMCkpOmYuZ2V0R2xvYmFsRXh0ZW50KClbMF0sbT1bdC5jb29yZERpbVRvRGF0YURpbSgieCIpWzBdLHQuY29vcmREaW1Ub0RhdGFEaW0oInkiKVswXV0sdj1lLm1hcEFycmF5KG0sZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5kYXRhVG9Qb2ludChbdCxlXSl9LCEwKTtzW3VdPXNbdV18fFtdLGxbdV09bFt1XXx8W10sZS5zZXRMYXlvdXQoe29mZnNldDpjLHNpemU6ZH0pLGUuZWFjaCh0LmNvb3JkRGltVG9EYXRhRGltKGYuZGltKVswXSxmdW5jdGlvbih0LGkpe2lmKCFpc05hTih0KSl7c1t1XVtpXXx8KHNbdV1baV09e3A6ZyxuOmd9LGxbdV1baV09e3A6ZyxuOmd9KTt2YXIgbixhLG8scixoPXQ+PTA/InAiOiJuIixtPXZbaV0seT1zW3VdW2ldW2hdLHg9bFt1XVtpXVtoXTtmLmlzSG9yaXpvbnRhbCgpPyhuPXksYT1tWzFdK2Msbz1tWzBdLXgscj1kLGxbdV1baV1baF0rPW8sTWF0aC5hYnMobyk8cCYmKG89KG88MD8tMToxKSpwKSxzW3VdW2ldW2hdKz1vKToobj1tWzBdK2MsYT15LG89ZCxyPW1bMV0teCxsW3VdW2ldW2hdKz1yLE1hdGguYWJzKHIpPHAmJihyPShyPD0wPy0xOjEpKnApLHNbdV1baV1baF0rPXIpLGUuc2V0SXRlbUxheW91dChpLHt4Om4seTphLHdpZHRoOm8saGVpZ2h0OnJ9KX19LCEwKX19LHRoaXMpfXZhciB1PWkoMSksaD1pKDQpLGM9aC5wYXJzZVBlcmNlbnQsZD0iX19lY19zdGFja18iO2wuZ2V0TGF5b3V0T25BeGlzPW8sdC5leHBvcnRzPWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXQucGllY2VMaXN0O3QuaGFzU3BlY2lhbFZpc3VhbD0hMSxnLmVhY2goZSxmdW5jdGlvbihlLGkpe2Uub3JpZ2luSW5kZXg9aSxudWxsIT1lLnZpc3VhbCYmKHQuaGFzU3BlY2lhbFZpc3VhbD0hMCl9KX1mdW5jdGlvbiBhKHQpe3ZhciBlPXQuY2F0ZWdvcmllcyxpPXQudmlzdWFsLG49dC5jYXRlZ29yeU1hcD17fTtpZih5KGUsZnVuY3Rpb24odCxlKXtuW3RdPWV9KSwhZy5pc0FycmF5KGkpKXt2YXIgYT1bXTtnLmlzT2JqZWN0KGkpP3koaSxmdW5jdGlvbih0LGUpe3ZhciBpPW5bZV07YVtudWxsIT1pP2k6X109dH0pOmFbX109aSxpPWYodCxhKX1mb3IodmFyIG89ZS5sZW5ndGgtMTtvPj0wO28tLSludWxsPT1pW29dJiYoZGVsZXRlIG5bZVtvXV0sZS5wb3AoKSl9ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPXQudmlzdWFsLG49W107Zy5pc09iamVjdChpKT95KGksZnVuY3Rpb24odCl7bi5wdXNoKHQpfSk6bnVsbCE9aSYmbi5wdXNoKGkpO3ZhciBhPXtjb2xvcjoxLHN5bWJvbDoxfTtlfHwxIT09bi5sZW5ndGh8fGEuaGFzT3duUHJvcGVydHkodC50eXBlKXx8KG5bMV09blswXSksZih0LG4pfWZ1bmN0aW9uIHIodCl7cmV0dXJue2FwcGx5VmlzdWFsOmZ1bmN0aW9uKGUsaSxuKXtlPXRoaXMubWFwVmFsdWVUb1Zpc3VhbChlKSxuKCJjb2xvciIsdChpKCJjb2xvciIpLGUpKX0sX2RvTWFwOmMoWzAsMV0pfX1mdW5jdGlvbiBzKHQpe3ZhciBlPXRoaXMub3B0aW9uLnZpc3VhbDtyZXR1cm4gZVtNYXRoLnJvdW5kKHYodCxbMCwxXSxbMCxlLmxlbmd0aC0xXSwhMCkpXXx8e319ZnVuY3Rpb24gbCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxpLG4pe24odCx0aGlzLm1hcFZhbHVlVG9WaXN1YWwoZSkpfX1mdW5jdGlvbiB1KHQpe3ZhciBlPXRoaXMub3B0aW9uLnZpc3VhbDtyZXR1cm4gZVt0aGlzLm9wdGlvbi5sb29wJiZ0IT09Xz90JWUubGVuZ3RoOnRdfWZ1bmN0aW9uIGgoKXtyZXR1cm4gdGhpcy5vcHRpb24udmlzdWFsWzBdfWZ1bmN0aW9uIGModCl7cmV0dXJue2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gdihlLHQsdGhpcy5vcHRpb24udmlzdWFsLCEwKX0sY2F0ZWdvcnk6dSxwaWVjZXdpc2U6ZnVuY3Rpb24oZSxpKXt2YXIgbj1kLmNhbGwodGhpcyxpKTtyZXR1cm4gbnVsbD09biYmKG49dihlLHQsdGhpcy5vcHRpb24udmlzdWFsLCEwKSksbn0sZml4ZWQ6aH19ZnVuY3Rpb24gZCh0KXt2YXIgZT10aGlzLm9wdGlvbixpPWUucGllY2VMaXN0O2lmKGUuaGFzU3BlY2lhbFZpc3VhbCl7dmFyIG49Yi5maW5kUGllY2VJbmRleCh0LGkpLGE9aVtuXTtpZihhJiZhLnZpc3VhbClyZXR1cm4gYS52aXN1YWxbdGhpcy50eXBlXX19ZnVuY3Rpb24gZih0LGUpe3JldHVybiB0LnZpc3VhbD1lLCJjb2xvciI9PT10LnR5cGUmJih0LnBhcnNlZFZpc3VhbD1nLm1hcChlLGZ1bmN0aW9uKHQpe3JldHVybiBtLnBhcnNlKHQpfSkpLGV9ZnVuY3Rpb24gcCh0LGUsaSl7cmV0dXJuIHQ/ZTw9aTplPGl9dmFyIGc9aSgxKSxtPWkoMjIpLHY9aSg0KS5saW5lYXJNYXAseT1nLmVhY2gseD1nLmlzT2JqZWN0LF89LTEsYj1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcHBpbmdNZXRob2QsaT10LnR5cGUscj10aGlzLm9wdGlvbj1nLmNsb25lKHQpO3RoaXMudHlwZT1pLHRoaXMubWFwcGluZ01ldGhvZD1lLHRoaXMuX25vcm1hbGl6ZURhdGE9U1tlXTt2YXIgcz13W2ldO3RoaXMuYXBwbHlWaXN1YWw9cy5hcHBseVZpc3VhbCx0aGlzLmdldENvbG9yTWFwcGVyPXMuZ2V0Q29sb3JNYXBwZXIsdGhpcy5fZG9NYXA9cy5fZG9NYXBbZV0sInBpZWNld2lzZSI9PT1lPyhvKHIpLG4ocikpOiJjYXRlZ29yeSI9PT1lP3IuY2F0ZWdvcmllcz9hKHIpOm8ociwhMCk6KGcuYXNzZXJ0KCJsaW5lYXIiIT09ZXx8ci5kYXRhRXh0ZW50KSxvKHIpKX07Yi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmIsbWFwVmFsdWVUb1Zpc3VhbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub3JtYWxpemVEYXRhKHQpO3JldHVybiB0aGlzLl9kb01hcChlLHQpfSxnZXROb3JtYWxpemVyOmZ1bmN0aW9uKCl7cmV0dXJuIGcuYmluZCh0aGlzLl9ub3JtYWxpemVEYXRhLHRoaXMpfX07dmFyIHc9Yi52aXN1YWxIYW5kbGVycz17Y29sb3I6e2FwcGx5VmlzdWFsOmwoImNvbG9yIiksZ2V0Q29sb3JNYXBwZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbjtyZXR1cm4gZy5iaW5kKCJjYXRlZ29yeSI9PT10Lm1hcHBpbmdNZXRob2Q/ZnVuY3Rpb24odCxlKXtyZXR1cm4hZSYmKHQ9dGhpcy5fbm9ybWFsaXplRGF0YSh0KSksdS5jYWxsKHRoaXMsdCl9OmZ1bmN0aW9uKGUsaSxuKXt2YXIgYT0hIW47cmV0dXJuIWkmJihlPXRoaXMuX25vcm1hbGl6ZURhdGEoZSkpLG49bS5mYXN0TGVycChlLHQucGFyc2VkVmlzdWFsLG4pLGE/bjptLnN0cmluZ2lmeShuLCJyZ2JhIil9LHRoaXMpfSxfZG9NYXA6e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gbS5zdHJpbmdpZnkobS5mYXN0TGVycCh0LHRoaXMub3B0aW9uLnBhcnNlZFZpc3VhbCksInJnYmEiKX0sY2F0ZWdvcnk6dSxwaWVjZXdpc2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1kLmNhbGwodGhpcyxlKTtyZXR1cm4gbnVsbD09aSYmKGk9bS5zdHJpbmdpZnkobS5mYXN0TGVycCh0LHRoaXMub3B0aW9uLnBhcnNlZFZpc3VhbCksInJnYmEiKSksaX0sZml4ZWQ6aH19LGNvbG9ySHVlOnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbS5tb2RpZnlIU0wodCxlKX0pLGNvbG9yU2F0dXJhdGlvbjpyKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG0ubW9kaWZ5SFNMKHQsbnVsbCxlKX0pLGNvbG9yTGlnaHRuZXNzOnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbS5tb2RpZnlIU0wodCxudWxsLG51bGwsZSl9KSxjb2xvckFscGhhOnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbS5tb2RpZnlBbHBoYSh0LGUpfSksb3BhY2l0eTp7YXBwbHlWaXN1YWw6bCgib3BhY2l0eSIpLF9kb01hcDpjKFswLDFdKX0sc3ltYm9sOnthcHBseVZpc3VhbDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5tYXBWYWx1ZVRvVmlzdWFsKHQpO2lmKGcuaXNTdHJpbmcobikpaSgic3ltYm9sIixuKTtlbHNlIGlmKHgobikpZm9yKHZhciBhIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShhKSYmaShhLG5bYV0pfSxfZG9NYXA6e2xpbmVhcjpzLGNhdGVnb3J5OnUscGllY2V3aXNlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZC5jYWxsKHRoaXMsZSk7cmV0dXJuIG51bGw9PWkmJihpPXMuY2FsbCh0aGlzLHQpKSxpfSxmaXhlZDpofX0sc3ltYm9sU2l6ZTp7YXBwbHlWaXN1YWw6bCgic3ltYm9sU2l6ZSIpLF9kb01hcDpjKFswLDFdKX19LFM9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdih0LHRoaXMub3B0aW9uLmRhdGFFeHRlbnQsWzAsMV0sITApfSxwaWVjZXdpc2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24ucGllY2VMaXN0LGk9Yi5maW5kUGllY2VJbmRleCh0LGUsITApO2lmKG51bGwhPWkpcmV0dXJuIHYoaSxbMCxlLmxlbmd0aC0xXSxbMCwxXSwhMCl9LGNhdGVnb3J5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLmNhdGVnb3JpZXM/dGhpcy5vcHRpb24uY2F0ZWdvcnlNYXBbdF06dDtyZXR1cm4gbnVsbD09ZT9fOmV9LGZpeGVkOmcubm9vcH07Yi5saXN0VmlzdWFsVHlwZXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gZy5lYWNoKHcsZnVuY3Rpb24oZSxpKXt0LnB1c2goaSl9KSx0fSxiLmFkZFZpc3VhbEhhbmRsZXI9ZnVuY3Rpb24odCxlKXt3W3RdPWV9LGIuaXNWYWxpZFR5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHcuaGFzT3duUHJvcGVydHkodCl9LGIuZWFjaFZpc3VhbD1mdW5jdGlvbih0LGUsaSl7Zy5pc09iamVjdCh0KT9nLmVhY2godCxlLGkpOmUuY2FsbChpLHQpfSxiLm1hcFZpc3VhbD1mdW5jdGlvbih0LGUsaSl7dmFyIG4sYT1nLmlzQXJyYXkodCk/W106Zy5pc09iamVjdCh0KT97fToobj0hMCxudWxsKTtyZXR1cm4gYi5lYWNoVmlzdWFsKHQsZnVuY3Rpb24odCxvKXt2YXIgcj1lLmNhbGwoaSx0LG8pO24/YT1yOmFbb109cn0pLGF9LGIucmV0cmlldmVWaXN1YWxzPWZ1bmN0aW9uKHQpe3ZhciBlLGk9e307cmV0dXJuIHQmJnkodyxmdW5jdGlvbihuLGEpe3QuaGFzT3duUHJvcGVydHkoYSkmJihpW2FdPXRbYV0sZT0hMCl9KSxlP2k6bnVsbH0sYi5wcmVwYXJlVmlzdWFsVHlwZXM9ZnVuY3Rpb24odCl7aWYoeCh0KSl7dmFyIGU9W107eSh0LGZ1bmN0aW9uKHQsaSl7ZS5wdXNoKGkpfSksdD1lfWVsc2V7aWYoIWcuaXNBcnJheSh0KSlyZXR1cm5bXTt0PXQuc2xpY2UoKX1yZXR1cm4gdC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuImNvbG9yIj09PWUmJiJjb2xvciIhPT10JiYwPT09dC5pbmRleE9mKCJjb2xvciIpPzE6LTF9KSx0fSxiLmRlcGVuZHNPbj1mdW5jdGlvbih0LGUpe3JldHVybiJjb2xvciI9PT1lPyEoIXR8fDAhPT10LmluZGV4T2YoZSkpOnQ9PT1lfSxiLmZpbmRQaWVjZUluZGV4PWZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKGUsaSl7dmFyIG49TWF0aC5hYnMoZS10KTtuPG8mJihvPW4sYT1pKX1mb3IodmFyIGEsbz0xLzAscj0wLHM9ZS5sZW5ndGg7cjxzO3IrKyl7dmFyIGw9ZVtyXS52YWx1ZTtpZihudWxsIT1sKXtpZihsPT09dHx8InN0cmluZyI9PXR5cGVvZiBsJiZsPT09dCsiIilyZXR1cm4gcjtpJiZuKGwscil9fWZvcih2YXIgcj0wLHM9ZS5sZW5ndGg7cjxzO3IrKyl7dmFyIHU9ZVtyXSxoPXUuaW50ZXJ2YWwsYz11LmNsb3NlO2lmKGgpe2lmKGhbMF09PT0tKDEvMCkpe2lmKHAoY1sxXSx0LGhbMV0pKXJldHVybiByfWVsc2UgaWYoaFsxXT09PTEvMCl7aWYocChjWzBdLGhbMF0sdCkpcmV0dXJuIHJ9ZWxzZSBpZihwKGNbMF0saFswXSx0KSYmcChjWzFdLHQsaFsxXSkpcmV0dXJuIHI7aSYmbihoWzBdLHIpLGkmJm4oaFsxXSxyKX19aWYoaSlyZXR1cm4gdD09PTEvMD9lLmxlbmd0aC0xOnQ9PT0tKDEvMCk/MDphfSx0LmV4cG9ydHM9Yn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT17fTtlLmVhY2hSYXdTZXJpZXNCeVR5cGUodCxmdW5jdGlvbih0KXt2YXIgbj10LmdldFJhd0RhdGEoKSxhPXt9O2lmKCFlLmlzU2VyaWVzRmlsdGVyZWQodCkpe3ZhciBvPXQuZ2V0RGF0YSgpO28uZWFjaChmdW5jdGlvbih0KXt2YXIgZT1vLmdldFJhd0luZGV4KHQpO2FbZV09dH0pLG4uZWFjaChmdW5jdGlvbihlKXt2YXIgcj1hW2VdLHM9bnVsbCE9ciYmby5nZXRJdGVtVmlzdWFsKHIsImNvbG9yIiwhMCk7aWYocyluLnNldEl0ZW1WaXN1YWwoZSwiY29sb3IiLHMpO2Vsc2V7dmFyIGw9bi5nZXRJdGVtTW9kZWwoZSksdT1sLmdldCgiaXRlbVN0eWxlLm5vcm1hbC5jb2xvciIpfHx0LmdldENvbG9yRnJvbVBhbGV0dGUobi5nZXROYW1lKGUpLGkpO24uc2V0SXRlbVZpc3VhbChlLCJjb2xvciIsdSksbnVsbCE9ciYmby5zZXRJdGVtVmlzdWFsKHIsImNvbG9yIix1KX19KX19KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDYpLGE9aSgyMCksbz17fSxyPU1hdGgubWluLHM9TWF0aC5tYXgsbD1NYXRoLnNpbix1PU1hdGguY29zLGg9bi5jcmVhdGUoKSxjPW4uY3JlYXRlKCksZD1uLmNyZWF0ZSgpLGY9MipNYXRoLlBJO28uZnJvbVBvaW50cz1mdW5jdGlvbih0LGUsaSl7aWYoMCE9PXQubGVuZ3RoKXt2YXIgbixhPXRbMF0sbz1hWzBdLGw9YVswXSx1PWFbMV0saD1hWzFdO2ZvcihuPTE7bjx0Lmxlbmd0aDtuKyspYT10W25dLG89cihvLGFbMF0pLGw9cyhsLGFbMF0pLHU9cih1LGFbMV0pLGg9cyhoLGFbMV0pO2VbMF09byxlWzFdPXUsaVswXT1sLGlbMV09aH19LG8uZnJvbUxpbmU9ZnVuY3Rpb24odCxlLGksbixhLG8pe2FbMF09cih0LGkpLGFbMV09cihlLG4pLG9bMF09cyh0LGkpLG9bMV09cyhlLG4pfTt2YXIgcD1bXSxnPVtdO28uZnJvbUN1YmljPWZ1bmN0aW9uKHQsZSxpLG4sbyxsLHUsaCxjLGQpe3ZhciBmLG09YS5jdWJpY0V4dHJlbWEsdj1hLmN1YmljQXQseT1tKHQsaSxvLHUscCk7Zm9yKGNbMF09MS8wLGNbMV09MS8wLGRbMF09LSgxLzApLGRbMV09LSgxLzApLGY9MDtmPHk7ZisrKXt2YXIgeD12KHQsaSxvLHUscFtmXSk7Y1swXT1yKHgsY1swXSksZFswXT1zKHgsZFswXSl9Zm9yKHk9bShlLG4sbCxoLGcpLGY9MDtmPHk7ZisrKXt2YXIgXz12KGUsbixsLGgsZ1tmXSk7Y1sxXT1yKF8sY1sxXSksZFsxXT1zKF8sZFsxXSl9Y1swXT1yKHQsY1swXSksZFswXT1zKHQsZFswXSksY1swXT1yKHUsY1swXSksZFswXT1zKHUsZFswXSksY1sxXT1yKGUsY1sxXSksZFsxXT1zKGUsZFsxXSksY1sxXT1yKGgsY1sxXSksZFsxXT1zKGgsZFsxXSl9LG8uZnJvbVF1YWRyYXRpYz1mdW5jdGlvbih0LGUsaSxuLG8sbCx1LGgpe3ZhciBjPWEucXVhZHJhdGljRXh0cmVtdW0sZD1hLnF1YWRyYXRpY0F0LGY9cyhyKGModCxpLG8pLDEpLDApLHA9cyhyKGMoZSxuLGwpLDEpLDApLGc9ZCh0LGksbyxmKSxtPWQoZSxuLGwscCk7dVswXT1yKHQsbyxnKSx1WzFdPXIoZSxsLG0pLGhbMF09cyh0LG8sZyksaFsxXT1zKGUsbCxtKX0sby5mcm9tQXJjPWZ1bmN0aW9uKHQsZSxpLGEsbyxyLHMscCxnKXt2YXIgbT1uLm1pbix2PW4ubWF4LHk9TWF0aC5hYnMoby1yKTtpZih5JWY8MWUtNCYmeT4xZS00KXJldHVybiBwWzBdPXQtaSxwWzFdPWUtYSxnWzBdPXQraSx2b2lkKGdbMV09ZSthKTtpZihoWzBdPXUobykqaSt0LGhbMV09bChvKSphK2UsY1swXT11KHIpKmkrdCxjWzFdPWwocikqYStlLG0ocCxoLGMpLHYoZyxoLGMpLG8lPWYsbzwwJiYobys9ZiksciU9ZixyPDAmJihyKz1mKSxvPnImJiFzP3IrPWY6bzxyJiZzJiYobys9Zikscyl7dmFyIHg9cjtyPW8sbz14fWZvcih2YXIgXz0wO188cjtfKz1NYXRoLlBJLzIpXz5vJiYoZFswXT11KF8pKmkrdCxkWzFdPWwoXykqYStlLG0ocCxkLHApLHYoZyxkLGcpKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDM4KSxhPWkoMSksbz1pKDE2KSxyPWkoNTYpLHM9ZnVuY3Rpb24odCl7bi5jYWxsKHRoaXMsdCl9O3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpzLHR5cGU6InRleHQiLGJydXNoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zdHlsZTt0aGlzLl9fZGlydHkmJnIubm9ybWFsaXplVGV4dFN0eWxlKGksITApLGkuZmlsbD1pLnN0cm9rZT1pLnNoYWRvd0JsdXI9aS5zaGFkb3dDb2xvcj1pLnNoYWRvd09mZnNldFg9aS5zaGFkb3dPZmZzZXRZPW51bGw7dmFyIG49aS50ZXh0O251bGwhPW4mJihuKz0iIiksaS5iaW5kKHQsdGhpcyxlKSxyLm5lZWREcmF3VGV4dChuLGkpJiYodGhpcy5zZXRUcmFuc2Zvcm0odCksci5yZW5kZXJUZXh0KHRoaXMsdCxuLGkpLHRoaXMucmVzdG9yZVRyYW5zZm9ybSh0KSl9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGU7aWYodGhpcy5fX2RpcnR5JiZyLm5vcm1hbGl6ZVRleHRTdHlsZSh0LCEwKSwhdGhpcy5fcmVjdCl7dmFyIGU9dC50ZXh0O251bGwhPWU/ZSs9IiI6ZT0iIjt2YXIgaT1vLmdldEJvdW5kaW5nUmVjdCh0LnRleHQrIiIsdC5mb250LHQudGV4dEFsaWduLHQudGV4dFZlcnRpY2FsQWxpZ24sdC50ZXh0UGFkZGluZyx0LnJpY2gpO2lmKGkueCs9dC54fHwwLGkueSs9dC55fHwwLHIuZ2V0U3Ryb2tlKHQudGV4dFN0cm9rZSx0LnRleHRTdHJva2VXaWR0aCkpe3ZhciBuPXQudGV4dFN0cm9rZVdpZHRoO2kueC09bi8yLGkueS09bi8yLGkud2lkdGgrPW4saS5oZWlnaHQrPW59dGhpcy5fcmVjdD1pfXJldHVybiB0aGlzLl9yZWN0fX0sYS5pbmhlcml0cyhzLG4pLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg1NiksYT1pKDEyKSxvPW5ldyBhLHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpyLGRyYXdSZWN0VGV4dDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuc3R5bGU7ZT1pLnRleHRSZWN0fHxlLHRoaXMuX19kaXJ0eSYmbi5ub3JtYWxpemVUZXh0U3R5bGUoaSwhMCk7dmFyIGE9aS50ZXh0O2lmKG51bGwhPWEmJihhKz0iIiksbi5uZWVkRHJhd1RleHQoYSxpKSl7dC5zYXZlKCk7dmFyIHI9dGhpcy50cmFuc2Zvcm07aS50cmFuc2Zvcm1UZXh0P3RoaXMuc2V0VHJhbnNmb3JtKHQpOnImJihvLmNvcHkoZSksby5hcHBseVRyYW5zZm9ybShyKSxlPW8pLG4ucmVuZGVyVGV4dCh0aGlzLHQsYSxpLGUpLHQucmVzdG9yZSgpfX19LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtkZWxldGUgZlt0XX0vKiEKCSAqIFpSZW5kZXIsIGEgaGlnaCBwZXJmb3JtYW5jZSAyZCBkcmF3aW5nIGxpYnJhcnkuCgkgKgoJICogQ29weXJpZ2h0IChjKSAyMDEzLCBCYWlkdSBJbmMuCgkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoJICoKCSAqIExJQ0VOU0UKCSAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lY29tZmUvenJlbmRlci9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dAoJICovCnZhciBhPWkoNzQpLG89aSgxMCkscj1pKDEpLHM9aSgxNTkpLGw9aSgxNjIpLHU9aSgxNjMpLGg9aSgxNzApLGM9IW8uY2FudmFzU3VwcG9ydGVkLGQ9e2NhbnZhczppKDE2MSl9LGY9e30scD17fTtwLnZlcnNpb249IjMuNi4yIixwLmluaXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgZyhhKCksdCxlKTtyZXR1cm4gZltpLmlkXT1pLGl9LHAuZGlzcG9zZT1mdW5jdGlvbih0KXtpZih0KXQuZGlzcG9zZSgpO2Vsc2V7Zm9yKHZhciBlIGluIGYpZi5oYXNPd25Qcm9wZXJ0eShlKSYmZltlXS5kaXNwb3NlKCk7Zj17fX1yZXR1cm4gcH0scC5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gZlt0XX0scC5yZWdpc3RlclBhaW50ZXI9ZnVuY3Rpb24odCxlKXtkW3RdPWV9O3ZhciBnPWZ1bmN0aW9uKHQsZSxpKXtpPWl8fHt9LHRoaXMuZG9tPWUsdGhpcy5pZD10O3ZhciBuPXRoaXMsYT1uZXcgbCxmPWkucmVuZGVyZXI7aWYoYyl7aWYoIWQudm1sKXRocm93IG5ldyBFcnJvcigiWW91IG5lZWQgdG8gcmVxdWlyZSAnenJlbmRlci92bWwvdm1sJyB0byBzdXBwb3J0IElFOCIpO2Y9InZtbCJ9ZWxzZSBmJiZkW2ZdfHwoZj0iY2FudmFzIik7dmFyIHA9bmV3IGRbZl0oZSxhLGkpO3RoaXMuc3RvcmFnZT1hLHRoaXMucGFpbnRlcj1wO3ZhciBnPW8ubm9kZT9udWxsOm5ldyBoKHAuZ2V0Vmlld3BvcnRSb290KCkpO3RoaXMuaGFuZGxlcj1uZXcgcyhhLHAsZyxwLnJvb3QpLHRoaXMuYW5pbWF0aW9uPW5ldyB1KHtzdGFnZTp7dXBkYXRlOnIuYmluZCh0aGlzLmZsdXNoLHRoaXMpfX0pLHRoaXMuYW5pbWF0aW9uLnN0YXJ0KCksdGhpcy5fbmVlZHNSZWZyZXNoO3ZhciBtPWEuZGVsRnJvbVN0b3JhZ2Usdj1hLmFkZFRvU3RvcmFnZTthLmRlbEZyb21TdG9yYWdlPWZ1bmN0aW9uKHQpe20uY2FsbChhLHQpLHQmJnQucmVtb3ZlU2VsZkZyb21acihuKX0sYS5hZGRUb1N0b3JhZ2U9ZnVuY3Rpb24odCl7di5jYWxsKGEsdCksdC5hZGRTZWxmVG9acihuKX19O2cucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnLGdldElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGFkZDpmdW5jdGlvbih0KXt0aGlzLnN0b3JhZ2UuYWRkUm9vdCh0KSx0aGlzLl9uZWVkc1JlZnJlc2g9ITB9LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLnN0b3JhZ2UuZGVsUm9vdCh0KSx0aGlzLl9uZWVkc1JlZnJlc2g9ITB9LGNvbmZpZ0xheWVyOmZ1bmN0aW9uKHQsZSl7dGhpcy5wYWludGVyLmNvbmZpZ0xheWVyKHQsZSksdGhpcy5fbmVlZHNSZWZyZXNoPSEwfSxyZWZyZXNoSW1tZWRpYXRlbHk6ZnVuY3Rpb24oKXt0aGlzLl9uZWVkc1JlZnJlc2g9ITEsdGhpcy5wYWludGVyLnJlZnJlc2goKSx0aGlzLl9uZWVkc1JlZnJlc2g9ITF9LHJlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9uZWVkc1JlZnJlc2g9ITB9LGZsdXNoOmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoJiZ0aGlzLnJlZnJlc2hJbW1lZGlhdGVseSgpLHRoaXMuX25lZWRzUmVmcmVzaEhvdmVyJiZ0aGlzLnJlZnJlc2hIb3ZlckltbWVkaWF0ZWx5KCl9LGFkZEhvdmVyOmZ1bmN0aW9uKHQsZSl7dGhpcy5wYWludGVyLmFkZEhvdmVyJiYodGhpcy5wYWludGVyLmFkZEhvdmVyKHQsZSksdGhpcy5yZWZyZXNoSG92ZXIoKSl9LHJlbW92ZUhvdmVyOmZ1bmN0aW9uKHQpe3RoaXMucGFpbnRlci5yZW1vdmVIb3ZlciYmKHRoaXMucGFpbnRlci5yZW1vdmVIb3Zlcih0KSx0aGlzLnJlZnJlc2hIb3ZlcigpKX0sY2xlYXJIb3ZlcjpmdW5jdGlvbigpe3RoaXMucGFpbnRlci5jbGVhckhvdmVyJiYodGhpcy5wYWludGVyLmNsZWFySG92ZXIoKSx0aGlzLnJlZnJlc2hIb3ZlcigpKX0scmVmcmVzaEhvdmVyOmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoSG92ZXI9ITB9LHJlZnJlc2hIb3ZlckltbWVkaWF0ZWx5OmZ1bmN0aW9uKCl7dGhpcy5fbmVlZHNSZWZyZXNoSG92ZXI9ITEsdGhpcy5wYWludGVyLnJlZnJlc2hIb3ZlciYmdGhpcy5wYWludGVyLnJlZnJlc2hIb3ZlcigpfSxyZXNpemU6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLnBhaW50ZXIucmVzaXplKHQud2lkdGgsdC5oZWlnaHQpLHRoaXMuaGFuZGxlci5yZXNpemUoKX0sY2xlYXJBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbi5jbGVhcigpfSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhaW50ZXIuZ2V0V2lkdGgoKX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFpbnRlci5nZXRIZWlnaHQoKX0scGF0aFRvSW1hZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wYWludGVyLnBhdGhUb0ltYWdlKHQsZSl9LHNldEN1cnNvclN0eWxlOmZ1bmN0aW9uKHQpe3RoaXMuaGFuZGxlci5zZXRDdXJzb3JTdHlsZSh0KX0sZmluZEhvdmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaGFuZGxlci5maW5kSG92ZXIodCxlKX0sb246ZnVuY3Rpb24odCxlLGkpe3RoaXMuaGFuZGxlci5vbih0LGUsaSl9LG9mZjpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlci5vZmYodCxlKX0sdHJpZ2dlcjpmdW5jdGlvbih0LGUpe3RoaXMuaGFuZGxlci50cmlnZ2VyKHQsZSl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5zdG9yYWdlLmRlbFJvb3QoKSx0aGlzLnBhaW50ZXIuY2xlYXIoKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uLnN0b3AoKSx0aGlzLmNsZWFyKCksdGhpcy5zdG9yYWdlLmRpc3Bvc2UoKSx0aGlzLnBhaW50ZXIuZGlzcG9zZSgpLHRoaXMuaGFuZGxlci5kaXNwb3NlKCksdGhpcy5hbmltYXRpb249dGhpcy5zdG9yYWdlPXRoaXMucGFpbnRlcj10aGlzLmhhbmRsZXI9bnVsbCxuKHRoaXMuaWQpfX0sdC5leHBvcnRzPXB9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDIpLGE9aSgxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXthLmVhY2goZSxmdW5jdGlvbihlKXtlLnVwZGF0ZT0idXBkYXRlVmlldyIsbi5yZWdpc3RlckFjdGlvbihlLGZ1bmN0aW9uKGksbil7dmFyIGE9e307cmV0dXJuIG4uZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZTp0LHF1ZXJ5Oml9LGZ1bmN0aW9uKHQpe3RbZS5tZXRob2RdJiZ0W2UubWV0aG9kXShpLm5hbWUsaS5kYXRhSW5kZXgpO3ZhciBuPXQuZ2V0RGF0YSgpO24uZWFjaChmdW5jdGlvbihlKXt2YXIgaT1uLmdldE5hbWUoZSk7YVtpXT10LmlzU2VsZWN0ZWQoaSl8fCExfSl9KSx7bmFtZTppLm5hbWUsc2VsZWN0ZWQ6YX19KX0pfX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDE3KSxhPWkoMjgpO3QuZXhwb3J0cz1uLmV4dGVuZCh7dHlwZToic2VyaWVzLl9fYmFzZV9iYXJfXyIsZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYSh0LmRhdGEsdGhpcyxlKX0sZ2V0TWFya2VyUG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb29yZGluYXRlU3lzdGVtO2lmKGUpe3ZhciBpPWUuZGF0YVRvUG9pbnQodCwhMCksbj10aGlzLmdldERhdGEoKSxhPW4uZ2V0TGF5b3V0KCJvZmZzZXQiKSxvPW4uZ2V0TGF5b3V0KCJzaXplIikscj1lLmdldEJhc2VBeGlzKCkuaXNIb3Jpem9udGFsKCk/MDoxO3JldHVybiBpW3JdKz1hK28vMixpfXJldHVybltOYU4sTmFOXX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06ImNhcnRlc2lhbjJkIixsZWdlbmRIb3Zlckxpbms6ITAsYmFyTWluSGVpZ2h0OjAsYmFyTWluQW5nbGU6MCxpdGVtU3R5bGU6e319fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7Im91dHNpZGUiPT09dC50ZXh0UG9zaXRpb24mJih0LnRleHRQb3NpdGlvbj1lKX12YXIgYT1pKDMpLG89e307by5zZXRMYWJlbD1mdW5jdGlvbih0LGUsaSxvLHIscyxsKXt2YXIgdT1pLmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSxoPWkuZ2V0TW9kZWwoImxhYmVsLmVtcGhhc2lzIik7YS5zZXRMYWJlbFN0eWxlKHQsZSx1LGgse2xhYmVsRmV0Y2hlcjpyLGxhYmVsRGF0YUluZGV4OnMsZGVmYXVsdFRleHQ6ci5nZXRSYXdWYWx1ZShzKSxpc1JlY3RUZXh0OiEwLGF1dG9Db2xvcjpvfSksbih0KSxuKGUpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNSksYT17fTthLmZpbmRMYWJlbFZhbHVlRGltPWZ1bmN0aW9uKHQpe3ZhciBlLGk9bi5vdGhlckRpbVRvRGF0YURpbSh0LCJsYWJlbCIpO2lmKGkubGVuZ3RoKWU9aVswXTtlbHNlIGZvcih2YXIgYSxvPXQuZGltZW5zaW9ucy5zbGljZSgpO28ubGVuZ3RoJiYoZT1vLnBvcCgpLGE9dC5nZXREaW1lbnNpb25JbmZvKGUpLnR5cGUsIm9yZGluYWwiPT09YXx8InRpbWUiPT09YSk7KTtyZXR1cm4gZX0sdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiBpc05hTih0WzBdKXx8aXNOYU4odFsxXSl9ZnVuY3Rpb24gYSh0LGUsaSxhLG8scixsLG0sdix5LHgpe2Zvcih2YXIgXz0wLGI9aSx3PTA7dzxhO3crKyl7dmFyIFM9ZVtiXTtpZihiPj1vfHxiPDApYnJlYWs7aWYobihTKSl7aWYoeCl7Yis9cjtjb250aW51ZX1icmVha31pZihiPT09aSl0W3I+MD8ibW92ZVRvIjoibGluZVRvIl0oU1swXSxTWzFdKSxkKHAsUyk7ZWxzZSBpZih2PjApe3ZhciBNPWIrcixJPWVbTV07aWYoeClmb3IoO0kmJm4oZVtNXSk7KU0rPXIsST1lW01dO3ZhciBUPS41LEE9ZVtfXSxJPWVbTV07aWYoIUl8fG4oSSkpZChnLFMpO2Vsc2V7bihJKSYmIXgmJihJPVMpLHMuc3ViKGYsSSxBKTt2YXIgQyxMO2lmKCJ4Ij09PXl8fCJ5Ij09PXkpe3ZhciBEPSJ4Ij09PXk/MDoxO0M9TWF0aC5hYnMoU1tEXS1BW0RdKSxMPU1hdGguYWJzKFNbRF0tSVtEXSl9ZWxzZSBDPXMuZGlzdChTLEEpLEw9cy5kaXN0KFMsSSk7VD1MLyhMK0MpLGMoZyxTLGYsLXYqKDEtVCkpfXUocCxwLG0pLGgocCxwLGwpLHUoZyxnLG0pLGgoZyxnLGwpLHQuYmV6aWVyQ3VydmVUbyhwWzBdLHBbMV0sZ1swXSxnWzFdLFNbMF0sU1sxXSksYyhwLFMsZix2KlQpfWVsc2UgdC5saW5lVG8oU1swXSxTWzFdKTtfPWIsYis9cn1yZXR1cm4gd31mdW5jdGlvbiBvKHQsZSl7dmFyIGk9WzEvMCwxLzBdLG49Wy0oMS8wKSwtKDEvMCldO2lmKGUpZm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBvPXRbYV07b1swXTxpWzBdJiYoaVswXT1vWzBdKSxvWzFdPGlbMV0mJihpWzFdPW9bMV0pLG9bMF0+blswXSYmKG5bMF09b1swXSksb1sxXT5uWzFdJiYoblsxXT1vWzFdKX1yZXR1cm57bWluOmU/aTpuLG1heDplP246aX19dmFyIHI9aSg4KSxzPWkoNiksbD1pKDc3KSx1PXMubWluLGg9cy5tYXgsYz1zLnNjYWxlQW5kQWRkLGQ9cy5jb3B5LGY9W10scD1bXSxnPVtdO3QuZXhwb3J0cz17UG9seWxpbmU6ci5leHRlbmQoe3R5cGU6ImVjLXBvbHlsaW5lIixzaGFwZTp7cG9pbnRzOltdLHNtb290aDowLHNtb290aENvbnN0cmFpbnQ6ITAsc21vb3RoTW9ub3RvbmU6bnVsbCxjb25uZWN0TnVsbHM6ITF9LHN0eWxlOntmaWxsOm51bGwsc3Ryb2tlOiIjMDAwIn0sYnJ1c2g6bChyLnByb3RvdHlwZS5icnVzaCksYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5wb2ludHMscj0wLHM9aS5sZW5ndGgsbD1vKGksZS5zbW9vdGhDb25zdHJhaW50KTtpZihlLmNvbm5lY3ROdWxscyl7Zm9yKDtzPjAmJm4oaVtzLTFdKTtzLS0pO2Zvcig7cjxzJiZuKGlbcl0pO3IrKyk7fWZvcig7cjxzOylyKz1hKHQsaSxyLHMscywxLGwubWluLGwubWF4LGUuc21vb3RoLGUuc21vb3RoTW9ub3RvbmUsZS5jb25uZWN0TnVsbHMpKzF9fSksUG9seWdvbjpyLmV4dGVuZCh7dHlwZToiZWMtcG9seWdvbiIsc2hhcGU6e3BvaW50czpbXSxzdGFja2VkT25Qb2ludHM6W10sc21vb3RoOjAsc3RhY2tlZE9uU21vb3RoOjAsc21vb3RoQ29uc3RyYWludDohMCxzbW9vdGhNb25vdG9uZTpudWxsLGNvbm5lY3ROdWxsczohMX0sYnJ1c2g6bChyLnByb3RvdHlwZS5icnVzaCksYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5wb2ludHMscj1lLnN0YWNrZWRPblBvaW50cyxzPTAsbD1pLmxlbmd0aCx1PWUuc21vb3RoTW9ub3RvbmUsaD1vKGksZS5zbW9vdGhDb25zdHJhaW50KSxjPW8ocixlLnNtb290aENvbnN0cmFpbnQpO2lmKGUuY29ubmVjdE51bGxzKXtmb3IoO2w+MCYmbihpW2wtMV0pO2wtLSk7Zm9yKDtzPGwmJm4oaVtzXSk7cysrKTt9Zm9yKDtzPGw7KXt2YXIgZD1hKHQsaSxzLGwsbCwxLGgubWluLGgubWF4LGUuc21vb3RoLHUsZS5jb25uZWN0TnVsbHMpO2EodCxyLHMrZC0xLGQsbCwtMSxjLm1pbixjLm1heCxlLnN0YWNrZWRPblNtb290aCx1LGUuY29ubmVjdE51bGxzKSxzKz1kKzEsdC5jbG9zZVBhdGgoKX19fSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPXtyZXRyaWV2ZVRhcmdldEluZm86ZnVuY3Rpb24odCxlKXtpZih0JiYoInRyZWVtYXBab29tVG9Ob2RlIj09PXQudHlwZXx8InRyZWVtYXBSb290VG9Ob2RlIj09PXQudHlwZSkpe3ZhciBpPWUuZ2V0RGF0YSgpLnRyZWUucm9vdCxuPXQudGFyZ2V0Tm9kZTtpZihuJiZpLmNvbnRhaW5zKG4pKXJldHVybntub2RlOm59O3ZhciBhPXQudGFyZ2V0Tm9kZUlkO2lmKG51bGwhPWEmJihuPWkuZ2V0Tm9kZUJ5SWQoYSkpKXJldHVybntub2RlOm59fX0sZ2V0UGF0aFRvUm9vdDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspdD10LnBhcmVudE5vZGUsdCYmZS5wdXNoKHQpO3JldHVybiBlLnJldmVyc2UoKX0sYWJvdmVWaWV3Um9vdDpmdW5jdGlvbih0LGUpe3ZhciBpPWEuZ2V0UGF0aFRvUm9vdCh0KTtyZXR1cm4gbi5pbmRleE9mKGksZSk+PTB9LHdyYXBUcmVlUGF0aEluZm86ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W107dDspe3ZhciBuPXQuZGF0YUluZGV4O2kucHVzaCh7bmFtZTp0Lm5hbWUsZGF0YUluZGV4Om4sdmFsdWU6ZS5nZXRSYXdWYWx1ZShuKX0pLHQ9dC5wYXJlbnROb2RlfXJldHVybiBpLnJldmVyc2UoKSxpfX07dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3RoaXMucG9pbnRlckNoZWNrZXIsdGhpcy5fenI9dCx0aGlzLl9vcHQ9e307dmFyIGU9ZC5iaW5kLGk9ZShhLHRoaXMpLG49ZShvLHRoaXMpLHU9ZShyLHRoaXMpLGg9ZShzLHRoaXMpLGY9ZShsLHRoaXMpO2MuY2FsbCh0aGlzKSx0aGlzLnNldFBvaW50ZXJDaGVja2VyPWZ1bmN0aW9uKHQpe3RoaXMucG9pbnRlckNoZWNrZXI9dH0sdGhpcy5lbmFibGU9ZnVuY3Rpb24oZSxhKXt0aGlzLmRpc2FibGUoKSx0aGlzLl9vcHQ9ZC5kZWZhdWx0cyhkLmNsb25lKGEpfHx7fSx7em9vbU9uTW91c2VXaGVlbDohMCxtb3ZlT25Nb3VzZU1vdmU6ITAscHJldmVudERlZmF1bHRNb3VzZU1vdmU6ITB9KSxudWxsPT1lJiYoZT0hMCksZSE9PSEwJiYibW92ZSIhPT1lJiYicGFuIiE9PWV8fCh0Lm9uKCJtb3VzZWRvd24iLGkpLHQub24oIm1vdXNlbW92ZSIsbiksdC5vbigibW91c2V1cCIsdSkpLGUhPT0hMCYmInNjYWxlIiE9PWUmJiJ6b29tIiE9PWV8fCh0Lm9uKCJtb3VzZXdoZWVsIixoKSx0Lm9uKCJwaW5jaCIsZikpfSx0aGlzLmRpc2FibGU9ZnVuY3Rpb24oKXt0Lm9mZigibW91c2Vkb3duIixpKSx0Lm9mZigibW91c2Vtb3ZlIixuKSx0Lm9mZigibW91c2V1cCIsdSksdC5vZmYoIm1vdXNld2hlZWwiLGgpLHQub2ZmKCJwaW5jaCIsZil9LHRoaXMuZGlzcG9zZT10aGlzLmRpc2FibGUsdGhpcy5pc0RyYWdnaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnaW5nfSx0aGlzLmlzUGluY2hpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGluY2hpbmd9fWZ1bmN0aW9uIGEodCl7aWYoIShmLm5vdExlZnRNb3VzZSh0KXx8dC50YXJnZXQmJnQudGFyZ2V0LmRyYWdnYWJsZSkpe3ZhciBlPXQub2Zmc2V0WCxpPXQub2Zmc2V0WTt0aGlzLnBvaW50ZXJDaGVja2VyJiZ0aGlzLnBvaW50ZXJDaGVja2VyKHQsZSxpKSYmKHRoaXMuX3g9ZSx0aGlzLl95PWksdGhpcy5fZHJhZ2dpbmc9ITApfX1mdW5jdGlvbiBvKHQpe2lmKCFmLm5vdExlZnRNb3VzZSh0KSYmaCh0aGlzLCJtb3ZlT25Nb3VzZU1vdmUiLHQpJiZ0aGlzLl9kcmFnZ2luZyYmInBpbmNoIiE9PXQuZ2VzdHVyZUV2ZW50JiYhcC5pc1Rha2VuKHRoaXMuX3pyLCJnbG9iYWxQYW4iKSl7dmFyIGU9dC5vZmZzZXRYLGk9dC5vZmZzZXRZLG49dGhpcy5feCxhPXRoaXMuX3ksbz1lLW4scj1pLWE7dGhpcy5feD1lLHRoaXMuX3k9aSx0aGlzLl9vcHQucHJldmVudERlZmF1bHRNb3VzZU1vdmUmJmYuc3RvcCh0LmV2ZW50KSx0aGlzLnRyaWdnZXIoInBhbiIsbyxyLG4sYSxlLGkpfX1mdW5jdGlvbiByKHQpe2Yubm90TGVmdE1vdXNlKHQpfHwodGhpcy5fZHJhZ2dpbmc9ITEpfWZ1bmN0aW9uIHModCl7aWYoaCh0aGlzLCJ6b29tT25Nb3VzZVdoZWVsIix0KSYmMCE9PXQud2hlZWxEZWx0YSl7dmFyIGU9dC53aGVlbERlbHRhPjA/MS4xOjEvMS4xO3UuY2FsbCh0aGlzLHQsZSx0Lm9mZnNldFgsdC5vZmZzZXRZKX19ZnVuY3Rpb24gbCh0KXtpZighcC5pc1Rha2VuKHRoaXMuX3pyLCJnbG9iYWxQYW4iKSl7dmFyIGU9dC5waW5jaFNjYWxlPjE/MS4xOjEvMS4xO3UuY2FsbCh0aGlzLHQsZSx0LnBpbmNoWCx0LnBpbmNoWSl9fWZ1bmN0aW9uIHUodCxlLGksbil7dGhpcy5wb2ludGVyQ2hlY2tlciYmdGhpcy5wb2ludGVyQ2hlY2tlcih0LGksbikmJihmLnN0b3AodC5ldmVudCksdGhpcy50cmlnZ2VyKCJ6b29tIixlLGksbikpfWZ1bmN0aW9uIGgodCxlLGkpe3ZhciBuPXQuX29wdFtlXTtyZXR1cm4gbiYmKCFkLmlzU3RyaW5nKG4pfHxpLmV2ZW50W24rIktleSJdKX12YXIgYz1pKDIzKSxkPWkoMSksZj1pKDIxKSxwPWkoMTM0KTtkLm1peGluKG4sYyksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9e3Nob3c6ITAsemxldmVsOjAsejowLGludmVyc2U6ITEsbmFtZToiIixuYW1lTG9jYXRpb246ImVuZCIsbmFtZVJvdGF0ZTpudWxsLG5hbWVUcnVuY2F0ZTp7bWF4V2lkdGg6bnVsbCxlbGxpcHNpczoiLi4uIixwbGFjZWhvbGRlcjoiLiJ9LG5hbWVUZXh0U3R5bGU6e30sbmFtZUdhcDoxNSxzaWxlbnQ6ITEsdHJpZ2dlckV2ZW50OiExLHRvb2x0aXA6e3Nob3c6ITF9LGF4aXNQb2ludGVyOnt9LGF4aXNMaW5lOntzaG93OiEwLG9uWmVybzohMCxvblplcm9BeGlzSW5kZXg6bnVsbCxsaW5lU3R5bGU6e2NvbG9yOiIjMzMzIix3aWR0aDoxLHR5cGU6InNvbGlkIn19LGF4aXNUaWNrOntzaG93OiEwLGluc2lkZTohMSxsZW5ndGg6NSxsaW5lU3R5bGU6e3dpZHRoOjF9fSxheGlzTGFiZWw6e3Nob3c6ITAsaW5zaWRlOiExLHJvdGF0ZTowLHNob3dNaW5MYWJlbDpudWxsLHNob3dNYXhMYWJlbDpudWxsLG1hcmdpbjo4LGZvbnRTaXplOjEyfSxzcGxpdExpbmU6e3Nob3c6ITAsbGluZVN0eWxlOntjb2xvcjpbIiNjY2MiXSx3aWR0aDoxLHR5cGU6InNvbGlkIn19LHNwbGl0QXJlYTp7c2hvdzohMSxhcmVhU3R5bGU6e2NvbG9yOlsicmdiYSgyNTAsMjUwLDI1MCwwLjMpIiwicmdiYSgyMDAsMjAwLDIwMCwwLjMpIl19fX0sbz1uLm1lcmdlKHtib3VuZGFyeUdhcDohMCxzcGxpdExpbmU6e3Nob3c6ITF9LGF4aXNUaWNrOnthbGlnbldpdGhMYWJlbDohMSxpbnRlcnZhbDoiYXV0byJ9LGF4aXNMYWJlbDp7aW50ZXJ2YWw6ImF1dG8ifX0sYSkscj1uLm1lcmdlKHtib3VuZGFyeUdhcDpbMCwwXSxzcGxpdE51bWJlcjo1fSxhKSxzPW4uZGVmYXVsdHMoe3NjYWxlOiEwLG1pbjoiZGF0YU1pbiIsbWF4OiJkYXRhTWF4In0sciksbD1uLmRlZmF1bHRzKHtzY2FsZTohMCxsb2dCYXNlOjEwfSxyKTt0LmV4cG9ydHM9e2NhdGVnb3J5QXhpczpvLHZhbHVlQXhpczpyLHRpbWVBeGlzOnMsbG9nQXhpczpsfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2NvbnRhaW5TdHJva2U6ZnVuY3Rpb24odCxlLGksbixhLG8scil7aWYoMD09PWEpcmV0dXJuITE7dmFyIHM9YSxsPTAsdT10O2lmKHI+ZStzJiZyPm4rc3x8cjxlLXMmJnI8bi1zfHxvPnQrcyYmbz5pK3N8fG88dC1zJiZvPGktcylyZXR1cm4hMTtpZih0PT09aSlyZXR1cm4gTWF0aC5hYnMoby10KTw9cy8yO2w9KGUtbikvKHQtaSksdT0odCpuLWkqZSkvKHQtaSk7dmFyIGg9bCpvLXIrdSxjPWgqaC8obCpsKzEpO3JldHVybiBjPD1zLzIqcy8yfX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDIwKTt0LmV4cG9ydHM9e2NvbnRhaW5TdHJva2U6ZnVuY3Rpb24odCxlLGksYSxvLHIscyxsLHUpe2lmKDA9PT1zKXJldHVybiExO3ZhciBoPXM7aWYodT5lK2gmJnU+YStoJiZ1PnIraHx8dTxlLWgmJnU8YS1oJiZ1PHItaHx8bD50K2gmJmw+aStoJiZsPm8raHx8bDx0LWgmJmw8aS1oJiZsPG8taClyZXR1cm4hMTt2YXIgYz1uLnF1YWRyYXRpY1Byb2plY3RQb2ludCh0LGUsaSxhLG8scixsLHUsbnVsbCk7cmV0dXJuIGM8PWgvMn19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSxuLGEsbyl7aWYobz5lJiZvPm58fG88ZSYmbzxuKXJldHVybiAwO2lmKG49PT1lKXJldHVybiAwO3ZhciByPW48ZT8xOi0xLHM9KG8tZSkvKG4tZSk7MSE9PXMmJjAhPT1zfHwocj1uPGU/LjU6LS41KTt2YXIgbD1zKihpLXQpK3Q7cmV0dXJuIGw+YT9yOjB9fSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMSksYT1pKDM5KSxvPWZ1bmN0aW9uKHQsZSxpLG4sbyxyKXt0aGlzLng9bnVsbD09dD8wOnQsdGhpcy55PW51bGw9PWU/MDplLHRoaXMueDI9bnVsbD09aT8xOmksdGhpcy55Mj1udWxsPT1uPzA6bix0aGlzLnR5cGU9ImxpbmVhciIsdGhpcy5nbG9iYWw9cnx8ITEsYS5jYWxsKHRoaXMsbyl9O28ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvfSxuLmluaGVyaXRzKG8sYSksdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXthLmVhY2gobyxmdW5jdGlvbihlKXt0aGlzW2VdPWEuYmluZCh0W2VdLHQpfSx0aGlzKX12YXIgYT1pKDEpLG89WyJnZXREb20iLCJnZXRaciIsImdldFdpZHRoIiwiZ2V0SGVpZ2h0IiwiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsImRpc3BhdGNoQWN0aW9uIiwiaXNEaXNwb3NlZCIsIm9uIiwib2ZmIiwiZ2V0RGF0YVVSTCIsImdldENvbm5lY3RlZERhdGFVUkwiLCJnZXRNb2RlbCIsImdldE9wdGlvbiIsImdldFZpZXdPZkNvbXBvbmVudE1vZGVsIiwiZ2V0Vmlld09mU2VyaWVzTW9kZWwiXTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSk7aSg2MCksaSgxMDgpLGkoMTA5KTt2YXIgYT1pKDg3KSxvPWkoMik7by5yZWdpc3RlckxheW91dChuLmN1cnJ5KGEsImJhciIpKSxvLnJlZ2lzdGVyVmlzdWFsKGZ1bmN0aW9uKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgiYmFyIixmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKTtlLnNldFZpc3VhbCgibGVnZW5kU3ltYm9sIiwicm91bmRSZWN0Iil9KX0pLGkoMzIpfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPWkoOTUpLmV4dGVuZCh7dHlwZToic2VyaWVzLmJhciIsZGVwZW5kZW5jaWVzOlsiZ3JpZCIsInBvbGFyIl0sYnJ1c2hTZWxlY3RvcjoicmVjdCJ9KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpKXtpLnN0eWxlLnRleHQ9bnVsbCxsLnVwZGF0ZVByb3BzKGkse3NoYXBlOnt3aWR0aDowfX0sZSx0LGZ1bmN0aW9uKCl7aS5wYXJlbnQmJmkucGFyZW50LnJlbW92ZShpKX0pfWZ1bmN0aW9uIGEodCxlLGkpe2kuc3R5bGUudGV4dD1udWxsLGwudXBkYXRlUHJvcHMoaSx7c2hhcGU6e3I6aS5zaGFwZS5yMH19LGUsdCxmdW5jdGlvbigpe2kucGFyZW50JiZpLnBhcmVudC5yZW1vdmUoaSl9KX1mdW5jdGlvbiBvKHQsZSxpLG4sYSxvLHIsaCl7dmFyIGM9ZS5nZXRJdGVtVmlzdWFsKGksImNvbG9yIiksZD1lLmdldEl0ZW1WaXN1YWwoaSwib3BhY2l0eSIpLGY9bi5nZXRNb2RlbCgiaXRlbVN0eWxlLm5vcm1hbCIpLHA9bi5nZXRNb2RlbCgiaXRlbVN0eWxlLmVtcGhhc2lzIikuZ2V0QmFySXRlbVN0eWxlKCk7aHx8dC5zZXRTaGFwZSgiciIsZi5nZXQoImJhckJvcmRlclJhZGl1cyIpfHwwKSx0LnVzZVN0eWxlKHMuZGVmYXVsdHMoe2ZpbGw6YyxvcGFjaXR5OmR9LGYuZ2V0QmFySXRlbVN0eWxlKCkpKTt2YXIgZz1uLmdldFNoYWxsb3coImN1cnNvciIpO2cmJnQuYXR0cigiY3Vyc29yIixnKTt2YXIgbT1yP2EuaGVpZ2h0PjA/ImJvdHRvbSI6InRvcCI6YS53aWR0aD4wPyJsZWZ0IjoicmlnaHQiO2h8fHUuc2V0TGFiZWwodC5zdHlsZSxwLG4sYyxvLGksbSksbC5zZXRIb3ZlclN0eWxlKHQscCl9ZnVuY3Rpb24gcih0LGUpe3ZhciBpPXQuZ2V0KGgpfHwwO3JldHVybiBNYXRoLm1pbihpLE1hdGguYWJzKGUud2lkdGgpLE1hdGguYWJzKGUuaGVpZ2h0KSl9dmFyIHM9aSgxKSxsPWkoMyksdT1pKDk2KSxoPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwiYmFyQm9yZGVyV2lkdGgiXTtzLmV4dGVuZChpKDExKS5wcm90b3R5cGUsaSgxMTApKTt2YXIgYz1pKDIpLmV4dGVuZENoYXJ0Vmlldyh7dHlwZToiYmFyIixyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIik7cmV0dXJuImNhcnRlc2lhbjJkIiE9PW4mJiJwb2xhciIhPT1ufHx0aGlzLl9yZW5kZXIodCxlLGkpLHRoaXMuZ3JvdXB9LGRpc3Bvc2U6cy5ub29wLF9yZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciByLHM9dGhpcy5ncm91cCx1PXQuZ2V0RGF0YSgpLGg9dGhpcy5fZGF0YSxjPXQuY29vcmRpbmF0ZVN5c3RlbSxwPWMuZ2V0QmFzZUF4aXMoKTsiY2FydGVzaWFuMmQiPT09Yy50eXBlP3I9cC5pc0hvcml6b250YWwoKToicG9sYXIiPT09Yy50eXBlJiYocj0iYW5nbGUiPT09cC5kaW0pO3ZhciBnPXQuaXNBbmltYXRpb25FbmFibGVkKCk/dDpudWxsO3UuZGlmZihoKS5hZGQoZnVuY3Rpb24oZSl7aWYodS5oYXNWYWx1ZShlKSl7dmFyIGk9dS5nZXRJdGVtTW9kZWwoZSksbj1mW2MudHlwZV0odSxlLGkpLGE9ZFtjLnR5cGVdKHUsZSxpLG4scixnKTt1LnNldEl0ZW1HcmFwaGljRWwoZSxhKSxzLmFkZChhKSxvKGEsdSxlLGksbix0LHIsInBvbGFyIj09PWMudHlwZSl9fSkudXBkYXRlKGZ1bmN0aW9uKGUsaSl7dmFyIG49aC5nZXRJdGVtR3JhcGhpY0VsKGkpO2lmKCF1Lmhhc1ZhbHVlKGUpKXJldHVybiB2b2lkIHMucmVtb3ZlKG4pO3ZhciBhPXUuZ2V0SXRlbU1vZGVsKGUpLHA9ZltjLnR5cGVdKHUsZSxhKTtuP2wudXBkYXRlUHJvcHMobix7c2hhcGU6cH0sZyxlKTpuPWRbYy50eXBlXSh1LGUsYSxwLHIsZywhMCksdS5zZXRJdGVtR3JhcGhpY0VsKGUsbikscy5hZGQobiksbyhuLHUsZSxhLHAsdCxyLCJwb2xhciI9PT1jLnR5cGUpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWguZ2V0SXRlbUdyYXBoaWNFbCh0KTsiY2FydGVzaWFuMmQiPT09Yy50eXBlP2UmJm4odCxnLGUpOmUmJmEodCxnLGUpfSkuZXhlY3V0ZSgpLHRoaXMuX2RhdGE9dX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5ncm91cCxvPXRoaXMuX2RhdGE7dC5nZXQoImFuaW1hdGlvbiIpP28mJm8uZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24oZSl7InNlY3RvciI9PT1lLnR5cGU/YShlLmRhdGFJbmRleCx0LGUpOm4oZS5kYXRhSW5kZXgsdCxlKX0pOmkucmVtb3ZlQWxsKCl9fSksZD17Y2FydGVzaWFuMmQ6ZnVuY3Rpb24odCxlLGksbixhLG8scil7dmFyIHU9bmV3IGwuUmVjdCh7c2hhcGU6cy5leHRlbmQoe30sbil9KTtpZihvKXt2YXIgaD11LnNoYXBlLGM9YT8iaGVpZ2h0Ijoid2lkdGgiLGQ9e307aFtjXT0wLGRbY109bltjXSxsW3I/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0odSx7c2hhcGU6ZH0sbyxlKX1yZXR1cm4gdX0scG9sYXI6ZnVuY3Rpb24odCxlLGksbixhLG8scil7dmFyIHU9bmV3IGwuU2VjdG9yKHtzaGFwZTpzLmV4dGVuZCh7fSxuKX0pO2lmKG8pe3ZhciBoPXUuc2hhcGUsYz1hPyJyIjoiZW5kQW5nbGUiLGQ9e307aFtjXT1hPzA6bi5zdGFydEFuZ2xlLGRbY109bltjXSxsW3I/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0odSx7c2hhcGU6ZH0sbyxlKX1yZXR1cm4gdX19LGY9e2NhcnRlc2lhbjJkOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldEl0ZW1MYXlvdXQoZSksYT1yKGksbiksbz1uLndpZHRoPjA/MTotMSxzPW4uaGVpZ2h0PjA/MTotMTtyZXR1cm57eDpuLngrbyphLzIseTpuLnkrcyphLzIsd2lkdGg6bi53aWR0aC1vKmEsaGVpZ2h0Om4uaGVpZ2h0LXMqYX19LHBvbGFyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldEl0ZW1MYXlvdXQoZSk7cmV0dXJue2N4Om4uY3gsY3k6bi5jeSxyMDpuLnIwLHI6bi5yLHN0YXJ0QW5nbGU6bi5zdGFydEFuZ2xlLGVuZEFuZ2xlOm4uZW5kQW5nbGV9fX07dC5leHBvcnRzPWN9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDMxKShbWyJmaWxsIiwiY29sb3IiXSxbInN0cm9rZSIsImJvcmRlckNvbG9yIl0sWyJsaW5lV2lkdGgiLCJib3JkZXJXaWR0aCJdLFsic3Ryb2tlIiwiYmFyQm9yZGVyQ29sb3IiXSxbImxpbmVXaWR0aCIsImJhckJvcmRlcldpZHRoIl0sWyJvcGFjaXR5Il0sWyJzaGFkb3dCbHVyIl0sWyJzaGFkb3dPZmZzZXRYIl0sWyJzaGFkb3dPZmZzZXRZIl0sWyJzaGFkb3dDb2xvciJdXSk7dC5leHBvcnRzPXtnZXRCYXJJdGVtU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9bi5jYWxsKHRoaXMsdCk7aWYodGhpcy5nZXRCb3JkZXJMaW5lRGFzaCl7dmFyIGk9dGhpcy5nZXRCb3JkZXJMaW5lRGFzaCgpO2kmJihlLmxpbmVEYXNoPWkpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiJfIit0KyJUeXBlIn1mdW5jdGlvbiBhKHQsZSxpKXt2YXIgbj1lLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxhPWUuZ2V0SXRlbVZpc3VhbChpLHQpLG89ZS5nZXRJdGVtVmlzdWFsKGksdCsiU2l6ZSIpO2lmKGEmJiJub25lIiE9PWEpe2YuaXNBcnJheShvKXx8KG89W28sb10pO3ZhciByPXUuY3JlYXRlU3ltYm9sKGEsLW9bMF0vMiwtb1sxXS8yLG9bMF0sb1sxXSxuKTtyZXR1cm4gci5uYW1lPXQscn19ZnVuY3Rpb24gbyh0KXt2YXIgZT1uZXcgYyh7bmFtZToibGluZSJ9KTtyZXR1cm4gcihlLnNoYXBlLHQpLGV9ZnVuY3Rpb24gcih0LGUpe3ZhciBpPWVbMF0sbj1lWzFdLGE9ZVsyXTt0LngxPWlbMF0sdC55MT1pWzFdLHQueDI9blswXSx0LnkyPW5bMV0sdC5wZXJjZW50PTEsYT8odC5jcHgxPWFbMF0sdC5jcHkxPWFbMV0pOih0LmNweDE9TmFOLHQuY3B5MT1OYU4pfWZ1bmN0aW9uIHMoKXt2YXIgdD10aGlzLGU9dC5jaGlsZE9mTmFtZSgiZnJvbVN5bWJvbCIpLGk9dC5jaGlsZE9mTmFtZSgidG9TeW1ib2wiKSxuPXQuY2hpbGRPZk5hbWUoImxhYmVsIik7aWYoZXx8aXx8IW4uaWdub3JlKXtmb3IodmFyIGE9MSxvPXRoaXMucGFyZW50O287KW8uc2NhbGUmJihhLz1vLnNjYWxlWzBdKSxvPW8ucGFyZW50O3ZhciByPXQuY2hpbGRPZk5hbWUoImxpbmUiKTtpZih0aGlzLl9fZGlydHl8fHIuX19kaXJ0eSl7dmFyIHM9ci5zaGFwZS5wZXJjZW50LGw9ci5wb2ludEF0KDApLHU9ci5wb2ludEF0KHMpLGM9aC5zdWIoW10sdSxsKTtpZihoLm5vcm1hbGl6ZShjLGMpLGUpe2UuYXR0cigicG9zaXRpb24iLGwpO3ZhciBkPXIudGFuZ2VudEF0KDApO2UuYXR0cigicm90YXRpb24iLE1hdGguUEkvMi1NYXRoLmF0YW4yKGRbMV0sZFswXSkpLGUuYXR0cigic2NhbGUiLFthKnMsYSpzXSl9aWYoaSl7aS5hdHRyKCJwb3NpdGlvbiIsdSk7dmFyIGQ9ci50YW5nZW50QXQoMSk7aS5hdHRyKCJyb3RhdGlvbiIsLU1hdGguUEkvMi1NYXRoLmF0YW4yKGRbMV0sZFswXSkpLGkuYXR0cigic2NhbGUiLFthKnMsYSpzXSl9aWYoIW4uaWdub3JlKXtuLmF0dHIoInBvc2l0aW9uIix1KTt2YXIgZixwLGcsbT01KmE7aWYoImVuZCI9PT1uLl9fcG9zaXRpb24pZj1bY1swXSptK3VbMF0sY1sxXSptK3VbMV1dLHA9Y1swXT4uOD8ibGVmdCI6Y1swXTwtLjg/InJpZ2h0IjoiY2VudGVyIixnPWNbMV0+Ljg/InRvcCI6Y1sxXTwtLjg/ImJvdHRvbSI6Im1pZGRsZSI7ZWxzZSBpZigibWlkZGxlIj09PW4uX19wb3NpdGlvbil7dmFyIHY9cy8yLGQ9ci50YW5nZW50QXQodikseT1bZFsxXSwtZFswXV0seD1yLnBvaW50QXQodik7eVsxXT4wJiYoeVswXT0teVswXSx5WzFdPS15WzFdKSxmPVt4WzBdK3lbMF0qbSx4WzFdK3lbMV0qbV0scD0iY2VudGVyIixnPSJib3R0b20iO3ZhciBfPS1NYXRoLmF0YW4yKGRbMV0sZFswXSk7dVswXTxsWzBdJiYoXz1NYXRoLlBJK18pLG4uYXR0cigicm90YXRpb24iLF8pfWVsc2UgZj1bLWNbMF0qbStsWzBdLC1jWzFdKm0rbFsxXV0scD1jWzBdPi44PyJyaWdodCI6Y1swXTwtLjg/ImxlZnQiOiJjZW50ZXIiLGc9Y1sxXT4uOD8iYm90dG9tIjpjWzFdPC0uOD8idG9wIjoibWlkZGxlIjtuLmF0dHIoe3N0eWxlOnt0ZXh0VmVydGljYWxBbGlnbjpuLl9fdmVydGljYWxBbGlnbnx8Zyx0ZXh0QWxpZ246bi5fX3RleHRBbGlnbnx8cH0scG9zaXRpb246ZixzY2FsZTpbYSxhXX0pfX19fWZ1bmN0aW9uIGwodCxlLGkpe2QuR3JvdXAuY2FsbCh0aGlzKSx0aGlzLl9jcmVhdGVMaW5lKHQsZSxpKX12YXIgdT1pKDI0KSxoPWkoNiksYz1pKDE5NiksZD1pKDMpLGY9aSgxKSxwPWkoNCksZz1bImZyb21TeW1ib2wiLCJ0b1N5bWJvbCJdLG09bC5wcm90b3R5cGU7bS5iZWZvcmVVcGRhdGU9cyxtLl9jcmVhdGVMaW5lPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10Lmhvc3RNb2RlbCxzPXQuZ2V0SXRlbUxheW91dChlKSxsPW8ocyk7bC5zaGFwZS5wZXJjZW50PTAsZC5pbml0UHJvcHMobCx7c2hhcGU6e3BlcmNlbnQ6MX19LHIsZSksdGhpcy5hZGQobCk7dmFyIHU9bmV3IGQuVGV4dCh7bmFtZToibGFiZWwifSk7dGhpcy5hZGQodSksZi5lYWNoKGcsZnVuY3Rpb24oaSl7dmFyIG89YShpLHQsZSk7dGhpcy5hZGQobyksdGhpc1tuKGkpXT10LmdldEl0ZW1WaXN1YWwoZSxpKX0sdGhpcyksdGhpcy5fdXBkYXRlQ29tbW9uU3RsKHQsZSxpKX0sbS51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10Lmhvc3RNb2RlbCxzPXRoaXMuY2hpbGRPZk5hbWUoImxpbmUiKSxsPXQuZ2V0SXRlbUxheW91dChlKSx1PXtzaGFwZTp7fX07cih1LnNoYXBlLGwpLGQudXBkYXRlUHJvcHMocyx1LG8sZSksZi5lYWNoKGcsZnVuY3Rpb24oaSl7dmFyIG89dC5nZXRJdGVtVmlzdWFsKGUsaSkscj1uKGkpO2lmKHRoaXNbcl0hPT1vKXt0aGlzLnJlbW92ZSh0aGlzLmNoaWxkT2ZOYW1lKGkpKTt2YXIgcz1hKGksdCxlKTt0aGlzLmFkZChzKX10aGlzW3JdPW99LHRoaXMpLHRoaXMuX3VwZGF0ZUNvbW1vblN0bCh0LGUsaSl9LG0uX3VwZGF0ZUNvbW1vblN0bD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dC5ob3N0TW9kZWwsYT10aGlzLmNoaWxkT2ZOYW1lKCJsaW5lIiksbz1pJiZpLmxpbmVTdHlsZSxyPWkmJmkuaG92ZXJMaW5lU3R5bGUscz1pJiZpLmxhYmVsTW9kZWwsbD1pJiZpLmhvdmVyTGFiZWxNb2RlbDtpZighaXx8dC5oYXNJdGVtT3B0aW9uKXt2YXIgdT10LmdldEl0ZW1Nb2RlbChlKTtvPXUuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKS5nZXRMaW5lU3R5bGUoKSxyPXUuZ2V0TW9kZWwoImxpbmVTdHlsZS5lbXBoYXNpcyIpLmdldExpbmVTdHlsZSgpLHM9dS5nZXRNb2RlbCgibGFiZWwubm9ybWFsIiksbD11LmdldE1vZGVsKCJsYWJlbC5lbXBoYXNpcyIpfXZhciBoPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpLGM9Zi5yZXRyaWV2ZTModC5nZXRJdGVtVmlzdWFsKGUsIm9wYWNpdHkiKSxvLm9wYWNpdHksMSk7YS51c2VTdHlsZShmLmRlZmF1bHRzKHtzdHJva2VOb1NjYWxlOiEwLGZpbGw6Im5vbmUiLHN0cm9rZTpoLG9wYWNpdHk6Y30sbykpLGEuaG92ZXJTdHlsZT1yLGYuZWFjaChnLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2hpbGRPZk5hbWUodCk7ZSYmKGUuc2V0Q29sb3IoaCksZS5zZXRTdHlsZSh7b3BhY2l0eTpjfSkpfSx0aGlzKTt2YXIgbSx2LHkseCxfPXMuZ2V0U2hhbGxvdygic2hvdyIpLGI9bC5nZXRTaGFsbG93KCJzaG93Iiksdz10aGlzLmNoaWxkT2ZOYW1lKCJsYWJlbCIpO2lmKF98fGIpe3ZhciBTPW4uZ2V0UmF3VmFsdWUoZSk7dj1udWxsPT1TP3Y9dC5nZXROYW1lKGUpOmlzRmluaXRlKFMpP3Aucm91bmQoUyk6UyxtPWh8fCIjMDAwIix5PWYucmV0cmlldmUyKG4uZ2V0Rm9ybWF0dGVkTGFiZWwoZSwibm9ybWFsIix0LmRhdGFUeXBlKSx2KSx4PWYucmV0cmlldmUyKG4uZ2V0Rm9ybWF0dGVkTGFiZWwoZSwiZW1waGFzaXMiLHQuZGF0YVR5cGUpLHkpfWlmKF8pe3ZhciBNPWQuc2V0VGV4dFN0eWxlKHcuc3R5bGUscyx7dGV4dDp5fSx7YXV0b0NvbG9yOm19KTt3Ll9fdGV4dEFsaWduPU0udGV4dEFsaWduLHcuX192ZXJ0aWNhbEFsaWduPU0udGV4dFZlcnRpY2FsQWxpZ24sdy5fX3Bvc2l0aW9uPXMuZ2V0KCJwb3NpdGlvbiIpfHwibWlkZGxlIn1lbHNlIHcuc2V0U3R5bGUoInRleHQiLG51bGwpO2I/dy5ob3ZlclN0eWxlPXt0ZXh0OngsdGV4dEZpbGw6bC5nZXRUZXh0Q29sb3IoITApLGZvbnRTdHlsZTpsLmdldFNoYWxsb3coImZvbnRTdHlsZSIpLGZvbnRXZWlnaHQ6bC5nZXRTaGFsbG93KCJmb250V2VpZ2h0IiksZm9udFNpemU6bC5nZXRTaGFsbG93KCJmb250U2l6ZSIpLGZvbnRGYW1pbHk6bC5nZXRTaGFsbG93KCJmb250RmFtaWx5Iil9OncuaG92ZXJTdHlsZT17dGV4dDpudWxsfSx3Lmlnbm9yZT0hXyYmIWIsZC5zZXRIb3ZlclN0eWxlKHRoaXMpfSxtLmhpZ2hsaWdodD1mdW5jdGlvbigpe3RoaXMudHJpZ2dlcigiZW1waGFzaXMiKX0sbS5kb3ducGxheT1mdW5jdGlvbigpe3RoaXMudHJpZ2dlcigibm9ybWFsIil9LG0udXBkYXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRMaW5lUG9pbnRzKHQuZ2V0SXRlbUxheW91dChlKSl9LG0uc2V0TGluZVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNoaWxkT2ZOYW1lKCJsaW5lIik7cihlLnNoYXBlLHQpLGUuZGlydHkoKX0sZi5pbmhlcml0cyhsLGQuR3JvdXApLHQuZXhwb3J0cz1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gaXNOYU4odFswXSl8fGlzTmFOKHRbMV0pfWZ1bmN0aW9uIGEodCl7cmV0dXJuIW4odFswXSkmJiFuKHRbMV0pfWZ1bmN0aW9uIG8odCl7dGhpcy5fY3Rvcj10fHxzLHRoaXMuZ3JvdXA9bmV3IHIuR3JvdXB9dmFyIHI9aSgzKSxzPWkoMTExKSxsPW8ucHJvdG90eXBlO2wudXBkYXRlRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9saW5lRGF0YSxpPXRoaXMuZ3JvdXAsbj10aGlzLl9jdG9yLG89dC5ob3N0TW9kZWwscj17bGluZVN0eWxlOm8uZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKS5nZXRMaW5lU3R5bGUoKSxob3ZlckxpbmVTdHlsZTpvLmdldE1vZGVsKCJsaW5lU3R5bGUuZW1waGFzaXMiKS5nZXRMaW5lU3R5bGUoKSxsYWJlbE1vZGVsOm8uZ2V0TW9kZWwoImxhYmVsLm5vcm1hbCIpLGhvdmVyTGFiZWxNb2RlbDpvLmdldE1vZGVsKCJsYWJlbC5lbXBoYXNpcyIpfTt0LmRpZmYoZSkuYWRkKGZ1bmN0aW9uKGUpe2lmKGEodC5nZXRJdGVtTGF5b3V0KGUpKSl7dmFyIG89bmV3IG4odCxlLHIpO3Quc2V0SXRlbUdyYXBoaWNFbChlLG8pLGkuYWRkKG8pfX0pLnVwZGF0ZShmdW5jdGlvbihvLHMpe3ZhciBsPWUuZ2V0SXRlbUdyYXBoaWNFbChzKTtyZXR1cm4gYSh0LmdldEl0ZW1MYXlvdXQobykpPyhsP2wudXBkYXRlRGF0YSh0LG8scik6bD1uZXcgbih0LG8sciksdC5zZXRJdGVtR3JhcGhpY0VsKG8sbCksdm9pZCBpLmFkZChsKSk6dm9pZCBpLnJlbW92ZShsKX0pLnJlbW92ZShmdW5jdGlvbih0KXtpLnJlbW92ZShlLmdldEl0ZW1HcmFwaGljRWwodCkpfSkuZXhlY3V0ZSgpLHRoaXMuX2xpbmVEYXRhPXR9LGwudXBkYXRlTGF5b3V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGluZURhdGE7dC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbihlLGkpe2UudXBkYXRlTGF5b3V0KHQsaSl9LHRoaXMpfSxsLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPWkoMiksbz1hLlBSSU9SSVRZO2koMTE0KSxpKDExNSksYS5yZWdpc3RlclZpc3VhbChuLmN1cnJ5KGkoNTEpLCJsaW5lIiwiY2lyY2xlIiwibGluZSIpKSxhLnJlZ2lzdGVyTGF5b3V0KG4uY3VycnkoaSg2NCksImxpbmUiKSksYS5yZWdpc3RlclByb2Nlc3NvcihvLlBST0NFU1NPUi5TVEFUSVNUSUMsbi5jdXJyeShpKDE1NCksImxpbmUiKSksaSgzMil9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgyOCksYT1pKDE3KTt0LmV4cG9ydHM9YS5leHRlbmQoe3R5cGU6InNlcmllcy5saW5lIixkZXBlbmRlbmNpZXM6WyJncmlkIiwicG9sYXIiXSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiBuKHQuZGF0YSx0aGlzLGUpfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLGxlZ2VuZEhvdmVyTGluazohMCxob3ZlckFuaW1hdGlvbjohMCxjbGlwT3ZlcmZsb3c6ITAsbGFiZWw6e25vcm1hbDp7cG9zaXRpb246InRvcCJ9fSxsaW5lU3R5bGU6e25vcm1hbDp7d2lkdGg6Mix0eXBlOiJzb2xpZCJ9fSxzdGVwOiExLHNtb290aDohMSxzbW9vdGhNb25vdG9uZTpudWxsLHN5bWJvbDoiZW1wdHlDaXJjbGUiLHN5bWJvbFNpemU6NCxzeW1ib2xSb3RhdGU6bnVsbCxzaG93U3ltYm9sOiEwLHNob3dBbGxTeW1ib2w6ITEsY29ubmVjdE51bGxzOiExLHNhbXBsaW5nOiJub25lIixhbmltYXRpb25FYXNpbmc6ImxpbmVhciIscHJvZ3Jlc3NpdmU6MCxob3ZlckxheWVyVGhyZXNob2xkOjEvMH19KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYodC5sZW5ndGg9PT1lLmxlbmd0aCl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBuPXRbaV0sYT1lW2ldO2lmKG5bMF0hPT1hWzBdfHxuWzFdIT09YVsxXSlyZXR1cm59cmV0dXJuITB9fWZ1bmN0aW9uIGEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6dD8uMzowfWZ1bmN0aW9uIG8odCl7dmFyIGU9dC5nZXRHbG9iYWxFeHRlbnQoKTtpZih0Lm9uQmFuZCl7dmFyIGk9dC5nZXRCYW5kV2lkdGgoKS8yLTEsbj1lWzFdPmVbMF0/MTotMTtlWzBdKz1uKmksZVsxXS09bippfXJldHVybiBlfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHQ+PTA/MTotMX1mdW5jdGlvbiBzKHQsZSl7dmFyIGk9dC5nZXRCYXNlQXhpcygpLG49dC5nZXRPdGhlckF4aXMoaSksYT0wO2lmKCFpLm9uWmVybyl7dmFyIG89bi5zY2FsZS5nZXRFeHRlbnQoKTtvWzBdPjA/YT1vWzBdOm9bMV08MCYmKGE9b1sxXSl9dmFyIHM9bi5kaW0sbD0ieCI9PT1zfHwicmFkaXVzIj09PXM/MTowO3JldHVybiBlLm1hcEFycmF5KFtzXSxmdW5jdGlvbihuLG8pe2Zvcih2YXIgdSxoPWUuc3RhY2tlZE9uO2gmJnIoaC5nZXQocyxvKSk9PT1yKG4pOyl7dT1oO2JyZWFrfXZhciBjPVtdO3JldHVybiBjW2xdPWUuZ2V0KGkuZGltLG8pLGNbMS1sXT11P3UuZ2V0KHMsbywhMCk6YSx0LmRhdGFUb1BvaW50KGMpfSwhMCl9ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG49byh0LmdldEF4aXMoIngiKSksYT1vKHQuZ2V0QXhpcygieSIpKSxyPXQuZ2V0QmFzZUF4aXMoKS5pc0hvcml6b250YWwoKSxzPU1hdGgubWluKG5bMF0sblsxXSksbD1NYXRoLm1pbihhWzBdLGFbMV0pLHU9TWF0aC5tYXgoblswXSxuWzFdKS1zLGg9TWF0aC5tYXgoYVswXSxhWzFdKS1sLGM9aS5nZXQoImxpbmVTdHlsZS5ub3JtYWwud2lkdGgiKXx8MixkPWkuZ2V0KCJjbGlwT3ZlcmZsb3ciKT9jLzI6TWF0aC5tYXgodSxoKTtyPyhsLT1kLGgrPTIqZCk6KHMtPWQsdSs9MipkKTt2YXIgZj1uZXcgdi5SZWN0KHtzaGFwZTp7eDpzLHk6bCx3aWR0aDp1LGhlaWdodDpofX0pO3JldHVybiBlJiYoZi5zaGFwZVtyPyJ3aWR0aCI6ImhlaWdodCJdPTAsdi5pbml0UHJvcHMoZix7c2hhcGU6e3dpZHRoOnUsaGVpZ2h0Omh9fSxpKSksZn1mdW5jdGlvbiB1KHQsZSxpKXt2YXIgbj10LmdldEFuZ2xlQXhpcygpLGE9dC5nZXRSYWRpdXNBeGlzKCksbz1hLmdldEV4dGVudCgpLHI9bi5nZXRFeHRlbnQoKSxzPU1hdGguUEkvMTgwLGw9bmV3IHYuU2VjdG9yKHtzaGFwZTp7Y3g6dC5jeCxjeTp0LmN5LHIwOm9bMF0scjpvWzFdLHN0YXJ0QW5nbGU6LXJbMF0qcyxlbmRBbmdsZTotclsxXSpzLGNsb2Nrd2lzZTpuLmludmVyc2V9fSk7cmV0dXJuIGUmJihsLnNoYXBlLmVuZEFuZ2xlPS1yWzBdKnMsdi5pbml0UHJvcHMobCx7c2hhcGU6e2VuZEFuZ2xlOi1yWzFdKnN9fSxpKSksbH1mdW5jdGlvbiBoKHQsZSxpKXtyZXR1cm4icG9sYXIiPT09dC50eXBlP3UodCxlLGkpOmwodCxlLGkpfWZ1bmN0aW9uIGModCxlLGkpe2Zvcih2YXIgbj1lLmdldEJhc2VBeGlzKCksYT0ieCI9PT1uLmRpbXx8InJhZGl1cyI9PT1uLmRpbT8wOjEsbz1bXSxyPTA7cjx0Lmxlbmd0aC0xO3IrKyl7dmFyIHM9dFtyKzFdLGw9dFtyXTtvLnB1c2gobCk7dmFyIHU9W107c3dpdGNoKGkpe2Nhc2UiZW5kIjp1W2FdPXNbYV0sdVsxLWFdPWxbMS1hXSxvLnB1c2godSk7YnJlYWs7Y2FzZSJtaWRkbGUiOnZhciBoPShsW2FdK3NbYV0pLzIsYz1bXTt1W2FdPWNbYV09aCx1WzEtYV09bFsxLWFdLGNbMS1hXT1zWzEtYV0sby5wdXNoKHUpLG8ucHVzaChjKTticmVhaztkZWZhdWx0OnVbYV09bFthXSx1WzEtYV09c1sxLWFdLG8ucHVzaCh1KX19cmV0dXJuIHRbcl0mJm8ucHVzaCh0W3JdKSxvfWZ1bmN0aW9uIGQodCxlKXt2YXIgaT10LmdldFZpc3VhbCgidmlzdWFsTWV0YSIpO2lmKGkmJmkubGVuZ3RoJiZ0LmNvdW50KCkpe2Zvcih2YXIgbixhPWkubGVuZ3RoLTE7YT49MDthLS0paWYoaVthXS5kaW1lbnNpb248Mil7bj1pW2FdO2JyZWFrfWlmKG4mJiJjYXJ0ZXNpYW4yZCI9PT1lLnR5cGUpe3ZhciBvPW4uZGltZW5zaW9uLHI9dC5kaW1lbnNpb25zW29dLHM9ZS5nZXRBeGlzKHIpLGw9Zi5tYXAobi5zdG9wcyxmdW5jdGlvbih0KXtyZXR1cm57Y29vcmQ6cy50b0dsb2JhbENvb3JkKHMuZGF0YVRvQ29vcmQodC52YWx1ZSkpLGNvbG9yOnQuY29sb3J9fSksdT1sLmxlbmd0aCxoPW4ub3V0ZXJDb2xvcnMuc2xpY2UoKTt1JiZsWzBdLmNvb3JkPmxbdS0xXS5jb29yZCYmKGwucmV2ZXJzZSgpLGgucmV2ZXJzZSgpKTt2YXIgYz0xMCxkPWxbMF0uY29vcmQtYyxwPWxbdS0xXS5jb29yZCtjLGc9cC1kO2lmKGc8LjAwMSlyZXR1cm4idHJhbnNwYXJlbnQiO2YuZWFjaChsLGZ1bmN0aW9uKHQpe3Qub2Zmc2V0PSh0LmNvb3JkLWQpL2d9KSxsLnB1c2goe29mZnNldDp1P2xbdS0xXS5vZmZzZXQ6LjUsY29sb3I6aFsxXXx8InRyYW5zcGFyZW50In0pLGwudW5zaGlmdCh7b2Zmc2V0OnU/bFswXS5vZmZzZXQ6LjUsY29sb3I6aFswXXx8InRyYW5zcGFyZW50In0pO3ZhciBtPW5ldyB2LkxpbmVhckdyYWRpZW50KDAsMCwwLDAsbCwhMCk7cmV0dXJuIG1bcl09ZCxtW3IrIjIiXT1wLG19fX12YXIgZj1pKDEpLHA9aSg0NiksZz1pKDU3KSxtPWkoMTE2KSx2PWkoMykseT1pKDUpLHg9aSg5OCksXz1pKDMwKTt0LmV4cG9ydHM9Xy5leHRlbmQoe3R5cGU6ImxpbmUiLGluaXQ6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdi5Hcm91cCxlPW5ldyBwO3RoaXMuZ3JvdXAuYWRkKGUuZ3JvdXApLHRoaXMuX3N5bWJvbERyYXc9ZSx0aGlzLl9saW5lR3JvdXA9dH0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10LmNvb3JkaW5hdGVTeXN0ZW0scj10aGlzLmdyb3VwLGw9dC5nZXREYXRhKCksdT10LmdldE1vZGVsKCJsaW5lU3R5bGUubm9ybWFsIikscD10LmdldE1vZGVsKCJhcmVhU3R5bGUubm9ybWFsIiksZz1sLm1hcEFycmF5KGwuZ2V0SXRlbUxheW91dCwhMCksbT0icG9sYXIiPT09by50eXBlLHY9dGhpcy5fY29vcmRTeXMseT10aGlzLl9zeW1ib2xEcmF3LHg9dGhpcy5fcG9seWxpbmUsXz10aGlzLl9wb2x5Z29uLGI9dGhpcy5fbGluZUdyb3VwLHc9dC5nZXQoImFuaW1hdGlvbiIpLFM9IXAuaXNFbXB0eSgpLE09cyhvLGwpLEk9dC5nZXQoInNob3dTeW1ib2wiKSxUPUkmJiFtJiYhdC5nZXQoInNob3dBbGxTeW1ib2wiKSYmdGhpcy5fZ2V0U3ltYm9sSWdub3JlRnVuYyhsLG8pLEE9dGhpcy5fZGF0YTtBJiZBLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7dC5fX3RlbXAmJihyLnJlbW92ZSh0KSxBLnNldEl0ZW1HcmFwaGljRWwoZSxudWxsKSl9KSxJfHx5LnJlbW92ZSgpLHIuYWRkKGIpO3ZhciBDPSFtJiZ0LmdldCgic3RlcCIpO3gmJnYudHlwZT09PW8udHlwZSYmQz09PXRoaXMuX3N0ZXA/KFMmJiFfP189dGhpcy5fbmV3UG9seWdvbihnLE0sbyx3KTpfJiYhUyYmKGIucmVtb3ZlKF8pLF89dGhpcy5fcG9seWdvbj1udWxsKSxiLnNldENsaXBQYXRoKGgobywhMSx0KSksSSYmeS51cGRhdGVEYXRhKGwsVCksbC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0KXt0LnN0b3BBbmltYXRpb24oITApfSksbih0aGlzLl9zdGFja2VkT25Qb2ludHMsTSkmJm4odGhpcy5fcG9pbnRzLGcpfHwodz90aGlzLl91cGRhdGVBbmltYXRpb24obCxNLG8saSxDKTooQyYmKGc9YyhnLG8sQyksTT1jKE0sbyxDKSkseC5zZXRTaGFwZSh7cG9pbnRzOmd9KSxfJiZfLnNldFNoYXBlKHtwb2ludHM6ZyxzdGFja2VkT25Qb2ludHM6TX0pKSkpOihJJiZ5LnVwZGF0ZURhdGEobCxUKSxDJiYoZz1jKGcsbyxDKSxNPWMoTSxvLEMpKSx4PXRoaXMuX25ld1BvbHlsaW5lKGcsbyx3KSxTJiYoXz10aGlzLl9uZXdQb2x5Z29uKGcsTSxvLHcpKSxiLnNldENsaXBQYXRoKGgobywhMCx0KSkpO3ZhciBMPWQobCxvKXx8bC5nZXRWaXN1YWwoImNvbG9yIik7eC51c2VTdHlsZShmLmRlZmF1bHRzKHUuZ2V0TGluZVN0eWxlKCkse2ZpbGw6Im5vbmUiLHN0cm9rZTpMLGxpbmVKb2luOiJiZXZlbCJ9KSk7dmFyIEQ9dC5nZXQoInNtb290aCIpO2lmKEQ9YSh0LmdldCgic21vb3RoIikpLHguc2V0U2hhcGUoe3Ntb290aDpELHNtb290aE1vbm90b25lOnQuZ2V0KCJzbW9vdGhNb25vdG9uZSIpLGNvbm5lY3ROdWxsczp0LmdldCgiY29ubmVjdE51bGxzIil9KSxfKXt2YXIgUD1sLnN0YWNrZWRPbixrPTA7aWYoXy51c2VTdHlsZShmLmRlZmF1bHRzKHAuZ2V0QXJlYVN0eWxlKCkse2ZpbGw6TCxvcGFjaXR5Oi43LGxpbmVKb2luOiJiZXZlbCJ9KSksUCl7dmFyIE89UC5ob3N0TW9kZWw7az1hKE8uZ2V0KCJzbW9vdGgiKSl9Xy5zZXRTaGFwZSh7c21vb3RoOkQsc3RhY2tlZE9uU21vb3RoOmssc21vb3RoTW9ub3RvbmU6dC5nZXQoInNtb290aE1vbm90b25lIiksY29ubmVjdE51bGxzOnQuZ2V0KCJjb25uZWN0TnVsbHMiKX0pfXRoaXMuX2RhdGE9bCx0aGlzLl9jb29yZFN5cz1vLHRoaXMuX3N0YWNrZWRPblBvaW50cz1NLHRoaXMuX3BvaW50cz1nLHRoaXMuX3N0ZXA9Q30sZGlzcG9zZTpmdW5jdGlvbigpe30saGlnaGxpZ2h0OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXQuZ2V0RGF0YSgpLG89eS5xdWVyeURhdGFJbmRleChhLG4pO2lmKCEobyBpbnN0YW5jZW9mIEFycmF5KSYmbnVsbCE9byYmbz49MCl7dmFyIHI9YS5nZXRJdGVtR3JhcGhpY0VsKG8pO2lmKCFyKXt2YXIgcz1hLmdldEl0ZW1MYXlvdXQobyk7aWYoIXMpcmV0dXJuO3I9bmV3IGcoYSxvKSxyLnBvc2l0aW9uPXMsci5zZXRaKHQuZ2V0KCJ6bGV2ZWwiKSx0LmdldCgieiIpKSxyLmlnbm9yZT1pc05hTihzWzBdKXx8aXNOYU4oc1sxXSksci5fX3RlbXA9ITAsYS5zZXRJdGVtR3JhcGhpY0VsKG8sciksci5zdG9wU3ltYm9sQW5pbWF0aW9uKCEwKSx0aGlzLmdyb3VwLmFkZChyKX1yLmhpZ2hsaWdodCgpfWVsc2UgXy5wcm90b3R5cGUuaGlnaGxpZ2h0LmNhbGwodGhpcyx0LGUsaSxuKX0sZG93bnBsYXk6ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9dC5nZXREYXRhKCksbz15LnF1ZXJ5RGF0YUluZGV4KGEsbik7aWYobnVsbCE9byYmbz49MCl7dmFyIHI9YS5nZXRJdGVtR3JhcGhpY0VsKG8pO3ImJihyLl9fdGVtcD8oYS5zZXRJdGVtR3JhcGhpY0VsKG8sbnVsbCksdGhpcy5ncm91cC5yZW1vdmUocikpOnIuZG93bnBsYXkoKSl9ZWxzZSBfLnByb3RvdHlwZS5kb3ducGxheS5jYWxsKHRoaXMsdCxlLGksbil9LF9uZXdQb2x5bGluZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wb2x5bGluZTtyZXR1cm4gZSYmdGhpcy5fbGluZUdyb3VwLnJlbW92ZShlKSxlPW5ldyB4LlBvbHlsaW5lKHtzaGFwZTp7cG9pbnRzOnR9LHNpbGVudDohMCx6MjoxMH0pLHRoaXMuX2xpbmVHcm91cC5hZGQoZSksdGhpcy5fcG9seWxpbmU9ZSxlfSxfbmV3UG9seWdvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3BvbHlnb247cmV0dXJuIGkmJnRoaXMuX2xpbmVHcm91cC5yZW1vdmUoaSksaT1uZXcgeC5Qb2x5Z29uKHtzaGFwZTp7cG9pbnRzOnQsc3RhY2tlZE9uUG9pbnRzOmV9LHNpbGVudDohMH0pLHRoaXMuX2xpbmVHcm91cC5hZGQoaSksdGhpcy5fcG9seWdvbj1pLGl9LF9nZXRTeW1ib2xJZ25vcmVGdW5jOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5nZXRBeGVzQnlTY2FsZSgib3JkaW5hbCIpWzBdO2lmKGkmJmkuaXNMYWJlbElnbm9yZWQpcmV0dXJuIGYuYmluZChpLmlzTGFiZWxJZ25vcmVkLGkpfSxfdXBkYXRlQW5pbWF0aW9uOmZ1bmN0aW9uKHQsZSxpLG4sYSl7dmFyIG89dGhpcy5fcG9seWxpbmUscj10aGlzLl9wb2x5Z29uLHM9dC5ob3N0TW9kZWwsbD1tKHRoaXMuX2RhdGEsdCx0aGlzLl9zdGFja2VkT25Qb2ludHMsZSx0aGlzLl9jb29yZFN5cyxpKSx1PWwuY3VycmVudCxoPWwuc3RhY2tlZE9uQ3VycmVudCxkPWwubmV4dCxmPWwuc3RhY2tlZE9uTmV4dDthJiYodT1jKGwuY3VycmVudCxpLGEpLGg9YyhsLnN0YWNrZWRPbkN1cnJlbnQsaSxhKSxkPWMobC5uZXh0LGksYSksZj1jKGwuc3RhY2tlZE9uTmV4dCxpLGEpKSxvLnNoYXBlLl9fcG9pbnRzPWwuY3VycmVudCxvLnNoYXBlLnBvaW50cz11LHYudXBkYXRlUHJvcHMobyx7c2hhcGU6e3BvaW50czpkfX0scyksciYmKHIuc2V0U2hhcGUoe3BvaW50czp1LHN0YWNrZWRPblBvaW50czpofSksdi51cGRhdGVQcm9wcyhyLHtzaGFwZTp7cG9pbnRzOmQsc3RhY2tlZE9uUG9pbnRzOmZ9fSxzKSk7Zm9yKHZhciBwPVtdLGc9bC5zdGF0dXMseT0wO3k8Zy5sZW5ndGg7eSsrKXt2YXIgeD1nW3ldLmNtZDtpZigiPSI9PT14KXt2YXIgXz10LmdldEl0ZW1HcmFwaGljRWwoZ1t5XS5pZHgxKTtfJiZwLnB1c2goe2VsOl8scHRJZHg6eX0pfX1vLmFuaW1hdG9ycyYmby5hbmltYXRvcnMubGVuZ3RoJiZvLmFuaW1hdG9yc1swXS5kdXJpbmcoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHAubGVuZ3RoO3QrKyl7dmFyIGU9cFt0XS5lbDtlLmF0dHIoInBvc2l0aW9uIixvLnNoYXBlLl9fcG9pbnRzW3BbdF0ucHRJZHhdKX19KX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXAsaT10aGlzLl9kYXRhO3RoaXMuX2xpbmVHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9zeW1ib2xEcmF3LnJlbW92ZSghMCksaSYmaS5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LG4pe3QuX190ZW1wJiYoZS5yZW1vdmUodCksaS5zZXRJdGVtR3JhcGhpY0VsKG4sbnVsbCkpfSksdGhpcy5fcG9seWxpbmU9dGhpcy5fcG9seWdvbj10aGlzLl9jb29yZFN5cz10aGlzLl9wb2ludHM9dGhpcy5fc3RhY2tlZE9uUG9pbnRzPXRoaXMuX2RhdGE9bnVsbH19KX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Pj0wPzE6LTF9ZnVuY3Rpb24gbih0LGUsbil7Zm9yKHZhciBhLG89dC5nZXRCYXNlQXhpcygpLHI9dC5nZXRPdGhlckF4aXMobykscz1vLm9uWmVybz8wOnIuc2NhbGUuZ2V0RXh0ZW50KClbMF0sbD1yLmRpbSx1PSJ4Ij09PWx8fCJyYWRpdXMiPT09bD8xOjAsaD1lLnN0YWNrZWRPbixjPWUuZ2V0KGwsbik7aCYmaShoLmdldChsLG4pKT09PWkoYyk7KXthPWg7YnJlYWt9dmFyIGQ9W107cmV0dXJuIGRbdV09ZS5nZXQoby5kaW0sbiksZFsxLXVdPWE/YS5nZXQobCxuLCEwKTpzLHQuZGF0YVRvUG9pbnQoZCl9ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPVtdO3JldHVybiBlLmRpZmYodCkuYWRkKGZ1bmN0aW9uKHQpe2kucHVzaCh7Y21kOiIrIixpZHg6dH0pfSkudXBkYXRlKGZ1bmN0aW9uKHQsZSl7aS5wdXNoKHtjbWQ6Ij0iLGlkeDplLGlkeDE6dH0pfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe2kucHVzaCh7Y21kOiItIixpZHg6dH0pfSkuZXhlY3V0ZSgpLGl9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxpLG8scixzKXtmb3IodmFyIGw9YSh0LGUpLHU9W10saD1bXSxjPVtdLGQ9W10sZj1bXSxwPVtdLGc9W10sbT1zLmRpbWVuc2lvbnMsdj0wO3Y8bC5sZW5ndGg7disrKXt2YXIgeT1sW3ZdLHg9ITA7c3dpdGNoKHkuY21kKXtjYXNlIj0iOnZhciBfPXQuZ2V0SXRlbUxheW91dCh5LmlkeCksYj1lLmdldEl0ZW1MYXlvdXQoeS5pZHgxKTsoaXNOYU4oX1swXSl8fGlzTmFOKF9bMV0pKSYmKF89Yi5zbGljZSgpKSx1LnB1c2goXyksaC5wdXNoKGIpLGMucHVzaChpW3kuaWR4XSksZC5wdXNoKG9beS5pZHgxXSksZy5wdXNoKGUuZ2V0UmF3SW5kZXgoeS5pZHgxKSk7YnJlYWs7Y2FzZSIrIjp2YXIgdz15LmlkeDt1LnB1c2goci5kYXRhVG9Qb2ludChbZS5nZXQobVswXSx3LCEwKSxlLmdldChtWzFdLHcsITApXSkpLGgucHVzaChlLmdldEl0ZW1MYXlvdXQodykuc2xpY2UoKSksYy5wdXNoKG4ocixlLHcpKSxkLnB1c2gob1t3XSksZy5wdXNoKGUuZ2V0UmF3SW5kZXgodykpO2JyZWFrO2Nhc2UiLSI6dmFyIHc9eS5pZHgsUz10LmdldFJhd0luZGV4KHcpO1MhPT13Pyh1LnB1c2godC5nZXRJdGVtTGF5b3V0KHcpKSxoLnB1c2gocy5kYXRhVG9Qb2ludChbdC5nZXQobVswXSx3LCEwKSx0LmdldChtWzFdLHcsITApXSkpLGMucHVzaChpW3ddKSxkLnB1c2gobihzLHQsdykpLGcucHVzaChTKSk6eD0hMX14JiYoZi5wdXNoKHkpLHAucHVzaChwLmxlbmd0aCkpfXAuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBnW3RdLWdbZV19KTtmb3IodmFyIE09W10sST1bXSxUPVtdLEE9W10sQz1bXSx2PTA7djxwLmxlbmd0aDt2Kyspe3ZhciB3PXBbdl07TVt2XT11W3ddLElbdl09aFt3XSxUW3ZdPWNbd10sQVt2XT1kW3ddLENbdl09Zlt3XX1yZXR1cm57Y3VycmVudDpNLG5leHQ6SSxzdGFja2VkT25DdXJyZW50OlQsc3RhY2tlZE9uTmV4dDpBLHN0YXR1czpDfX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgyKTtpKDExOCksaSgxMTkpLGkoOTQpKCJwaWUiLFt7dHlwZToicGllVG9nZ2xlU2VsZWN0IixldmVudDoicGllc2VsZWN0Y2hhbmdlZCIsbWV0aG9kOiJ0b2dnbGVTZWxlY3RlZCJ9LHt0eXBlOiJwaWVTZWxlY3QiLGV2ZW50OiJwaWVzZWxlY3RlZCIsbWV0aG9kOiJzZWxlY3QifSx7dHlwZToicGllVW5TZWxlY3QiLGV2ZW50OiJwaWV1bnNlbGVjdGVkIixtZXRob2Q6InVuU2VsZWN0In1dKSxhLnJlZ2lzdGVyVmlzdWFsKG4uY3VycnkoaSg4OSksInBpZSIpKSxhLnJlZ2lzdGVyTGF5b3V0KG4uY3VycnkoaSgxMjEpLCJwaWUiKSksYS5yZWdpc3RlclByb2Nlc3NvcihuLmN1cnJ5KGkoNjYpLCJwaWUiKSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgxNCksYT1pKDEpLG89aSg1KSxyPWkoNCkscz1pKDI1KSxsPWkoODMpLHU9aSgyKS5leHRlbmRTZXJpZXNNb2RlbCh7dHlwZToic2VyaWVzLnBpZSIsaW5pdDpmdW5jdGlvbih0KXt1LnN1cGVyQXBwbHkodGhpcywiaW5pdCIsYXJndW1lbnRzKSx0aGlzLmxlZ2VuZERhdGFQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd0RhdGEoKX0sdGhpcy51cGRhdGVTZWxlY3RlZE1hcCh0LmRhdGEpLHRoaXMuX2RlZmF1bHRMYWJlbExpbmUodCl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe3Uuc3VwZXJDYWxsKHRoaXMsIm1lcmdlT3B0aW9uIix0KSx0aGlzLnVwZGF0ZVNlbGVjdGVkTWFwKHRoaXMub3B0aW9uLmRhdGEpfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPXMoWyJ2YWx1ZSJdLHQuZGF0YSksYT1uZXcgbihpLHRoaXMpO3JldHVybiBhLmluaXREYXRhKHQuZGF0YSksYX0sZ2V0RGF0YVBhcmFtczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKSxpPXUuc3VwZXJDYWxsKHRoaXMsImdldERhdGFQYXJhbXMiLHQpLG49W107cmV0dXJuIGUuZWFjaCgidmFsdWUiLGZ1bmN0aW9uKHQpe24ucHVzaCh0KX0pLGkucGVyY2VudD1yLmdldFBlcmNlbnRXaXRoUHJlY2lzaW9uKG4sdCxlLmhvc3RNb2RlbC5nZXQoInBlcmNlbnRQcmVjaXNpb24iKSksaS4kdmFycy5wdXNoKCJwZXJjZW50IiksaX0sX2RlZmF1bHRMYWJlbExpbmU6ZnVuY3Rpb24odCl7by5kZWZhdWx0RW1waGFzaXModC5sYWJlbExpbmUsWyJzaG93Il0pO3ZhciBlPXQubGFiZWxMaW5lLm5vcm1hbCxpPXQubGFiZWxMaW5lLmVtcGhhc2lzO2Uuc2hvdz1lLnNob3cmJnQubGFiZWwubm9ybWFsLnNob3csaS5zaG93PWkuc2hvdyYmdC5sYWJlbC5lbXBoYXNpcy5zaG93fSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLGhvdmVyQW5pbWF0aW9uOiEwLGNlbnRlcjpbIjUwJSIsIjUwJSJdLHJhZGl1czpbMCwiNzUlIl0sY2xvY2t3aXNlOiEwLHN0YXJ0QW5nbGU6OTAsbWluQW5nbGU6MCxzZWxlY3RlZE9mZnNldDoxMCxob3Zlck9mZnNldDoxMCxhdm9pZExhYmVsT3ZlcmxhcDohMCxwZXJjZW50UHJlY2lzaW9uOjIsc3RpbGxTaG93WmVyb1N1bTohMCxsYWJlbDp7bm9ybWFsOntyb3RhdGU6ITEsc2hvdzohMCxwb3NpdGlvbjoib3V0ZXIifSxlbXBoYXNpczp7fX0sbGFiZWxMaW5lOntub3JtYWw6e3Nob3c6ITAsbGVuZ3RoOjE1LGxlbmd0aDI6MTUsc21vb3RoOiExLGxpbmVTdHlsZTp7d2lkdGg6MSx0eXBlOiJzb2xpZCJ9fX0saXRlbVN0eWxlOntub3JtYWw6e2JvcmRlcldpZHRoOjF9LGVtcGhhc2lzOnt9fSxhbmltYXRpb25UeXBlOiJleHBhbnNpb24iLGFuaW1hdGlvbkVhc2luZzoiY3ViaWNPdXQiLGRhdGE6W119fSk7YS5taXhpbih1LGwpLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSxuKXt2YXIgbz1lLmdldERhdGEoKSxyPXRoaXMuZGF0YUluZGV4LHM9by5nZXROYW1lKHIpLGw9ZS5nZXQoInNlbGVjdGVkT2Zmc2V0Iik7bi5kaXNwYXRjaEFjdGlvbih7dHlwZToicGllVG9nZ2xlU2VsZWN0Iixmcm9tOnQsbmFtZTpzLHNlcmllc0lkOmUuaWR9KSxvLmVhY2goZnVuY3Rpb24odCl7YShvLmdldEl0ZW1HcmFwaGljRWwodCksby5nZXRJdGVtTGF5b3V0KHQpLGUuaXNTZWxlY3RlZChvLmdldE5hbWUodCkpLGwsaSl9KX1mdW5jdGlvbiBhKHQsZSxpLG4sYSl7dmFyIG89KGUuc3RhcnRBbmdsZStlLmVuZEFuZ2xlKS8yLHI9TWF0aC5jb3Mobykscz1NYXRoLnNpbihvKSxsPWk/bjowLHU9W3IqbCxzKmxdO2E/dC5hbmltYXRlKCkud2hlbigyMDAse3Bvc2l0aW9uOnV9KS5zdGFydCgiYm91bmNlT3V0Iik6dC5hdHRyKCJwb3NpdGlvbiIsdSl9ZnVuY3Rpb24gbyh0LGUpe2Z1bmN0aW9uIGkoKXtvLmlnbm9yZT1vLmhvdmVySWdub3JlLHMuaWdub3JlPXMuaG92ZXJJZ25vcmV9ZnVuY3Rpb24gbigpe28uaWdub3JlPW8ubm9ybWFsSWdub3JlLHMuaWdub3JlPXMubm9ybWFsSWdub3JlfXIuR3JvdXAuY2FsbCh0aGlzKTt2YXIgYT1uZXcgci5TZWN0b3Ioe3oyOjJ9KSxvPW5ldyByLlBvbHlsaW5lLHM9bmV3IHIuVGV4dDt0aGlzLmFkZChhKSx0aGlzLmFkZChvKSx0aGlzLmFkZChzKSx0aGlzLnVwZGF0ZURhdGEodCxlLCEwKSx0aGlzLm9uKCJlbXBoYXNpcyIsaSkub24oIm5vcm1hbCIsbikub24oIm1vdXNlb3ZlciIsaSkub24oIm1vdXNlb3V0IixuKX12YXIgcj1pKDMpLHM9aSgxKSxsPW8ucHJvdG90eXBlO2wudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbigpe2wuc3RvcEFuaW1hdGlvbighMCksbC5hbmltYXRlVG8oe3NoYXBlOntyOmMucit1LmdldCgiaG92ZXJPZmZzZXQiKX19LDMwMCwiZWxhc3RpY091dCIpfWZ1bmN0aW9uIG8oKXtsLnN0b3BBbmltYXRpb24oITApLGwuYW5pbWF0ZVRvKHtzaGFwZTp7cjpjLnJ9fSwzMDAsImVsYXN0aWNPdXQiKX12YXIgbD10aGlzLmNoaWxkQXQoMCksdT10Lmhvc3RNb2RlbCxoPXQuZ2V0SXRlbU1vZGVsKGUpLGM9dC5nZXRJdGVtTGF5b3V0KGUpLGQ9cy5leHRlbmQoe30sYyk7aWYoZC5sYWJlbD1udWxsLGkpe2wuc2V0U2hhcGUoZCk7dmFyIGY9dS5nZXRTaGFsbG93KCJhbmltYXRpb25UeXBlIik7InNjYWxlIj09PWY/KGwuc2hhcGUucj1jLnIwLHIuaW5pdFByb3BzKGwse3NoYXBlOntyOmMucn19LHUsZSkpOihsLnNoYXBlLmVuZEFuZ2xlPWMuc3RhcnRBbmdsZSxyLnVwZGF0ZVByb3BzKGwse3NoYXBlOntlbmRBbmdsZTpjLmVuZEFuZ2xlfX0sdSxlKSl9ZWxzZSByLnVwZGF0ZVByb3BzKGwsewpzaGFwZTpkfSx1LGUpO3ZhciBwPWguZ2V0TW9kZWwoIml0ZW1TdHlsZSIpLGc9dC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIik7bC51c2VTdHlsZShzLmRlZmF1bHRzKHtsaW5lSm9pbjoiYmV2ZWwiLGZpbGw6Z30scC5nZXRNb2RlbCgibm9ybWFsIikuZ2V0SXRlbVN0eWxlKCkpKSxsLmhvdmVyU3R5bGU9cC5nZXRNb2RlbCgiZW1waGFzaXMiKS5nZXRJdGVtU3R5bGUoKTt2YXIgbT1oLmdldFNoYWxsb3coImN1cnNvciIpO20mJmwuYXR0cigiY3Vyc29yIixtKSxhKHRoaXMsdC5nZXRJdGVtTGF5b3V0KGUpLGguZ2V0KCJzZWxlY3RlZCIpLHUuZ2V0KCJzZWxlY3RlZE9mZnNldCIpLHUuZ2V0KCJhbmltYXRpb24iKSksbC5vZmYoIm1vdXNlb3ZlciIpLm9mZigibW91c2VvdXQiKS5vZmYoImVtcGhhc2lzIikub2ZmKCJub3JtYWwiKSxoLmdldCgiaG92ZXJBbmltYXRpb24iKSYmdS5pc0FuaW1hdGlvbkVuYWJsZWQoKSYmbC5vbigibW91c2VvdmVyIixuKS5vbigibW91c2VvdXQiLG8pLm9uKCJlbXBoYXNpcyIsbikub24oIm5vcm1hbCIsbyksdGhpcy5fdXBkYXRlTGFiZWwodCxlKSxyLnNldEhvdmVyU3R5bGUodGhpcyl9LGwuX3VwZGF0ZUxhYmVsPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jaGlsZEF0KDEpLG49dGhpcy5jaGlsZEF0KDIpLGE9dC5ob3N0TW9kZWwsbz10LmdldEl0ZW1Nb2RlbChlKSxzPXQuZ2V0SXRlbUxheW91dChlKSxsPXMubGFiZWwsdT10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTtyLnVwZGF0ZVByb3BzKGkse3NoYXBlOntwb2ludHM6bC5saW5lUG9pbnRzfHxbW2wueCxsLnldLFtsLngsbC55XSxbbC54LGwueV1dfX0sYSxlKSxyLnVwZGF0ZVByb3BzKG4se3N0eWxlOnt4OmwueCx5OmwueX19LGEsZSksbi5hdHRyKHtyb3RhdGlvbjpsLnJvdGF0aW9uLG9yaWdpbjpbbC54LGwueV0sejI6MTB9KTt2YXIgaD1vLmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSxjPW8uZ2V0TW9kZWwoImxhYmVsLmVtcGhhc2lzIiksZD1vLmdldE1vZGVsKCJsYWJlbExpbmUubm9ybWFsIiksZj1vLmdldE1vZGVsKCJsYWJlbExpbmUuZW1waGFzaXMiKSx1PXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpO3Iuc2V0TGFiZWxTdHlsZShuLnN0eWxlLG4uaG92ZXJTdHlsZT17fSxoLGMse2xhYmVsRmV0Y2hlcjp0Lmhvc3RNb2RlbCxsYWJlbERhdGFJbmRleDplLGRlZmF1bHRUZXh0OnQuZ2V0TmFtZShlKSxhdXRvQ29sb3I6dSx1c2VJbnNpZGVTdHlsZTohIWwuaW5zaWRlfSx7dGV4dEFsaWduOmwudGV4dEFsaWduLHRleHRWZXJ0aWNhbEFsaWduOmwudmVydGljYWxBbGlnbixvcGFjaXR5OnQuZ2V0SXRlbVZpc3VhbChlLCJvcGFjaXR5Iil9KSxuLmlnbm9yZT1uLm5vcm1hbElnbm9yZT0haC5nZXQoInNob3ciKSxuLmhvdmVySWdub3JlPSFjLmdldCgic2hvdyIpLGkuaWdub3JlPWkubm9ybWFsSWdub3JlPSFkLmdldCgic2hvdyIpLGkuaG92ZXJJZ25vcmU9IWYuZ2V0KCJzaG93IiksaS5zZXRTdHlsZSh7c3Ryb2tlOnUsb3BhY2l0eTp0LmdldEl0ZW1WaXN1YWwoZSwib3BhY2l0eSIpfSksaS5zZXRTdHlsZShkLmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSksaS5ob3ZlclN0eWxlPWYuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpO3ZhciBwPWQuZ2V0KCJzbW9vdGgiKTtwJiZwPT09ITAmJihwPS40KSxpLnNldFNoYXBlKHtzbW9vdGg6cH0pfSxzLmluaGVyaXRzKG8sci5Hcm91cCk7dmFyIHU9aSgzMCkuZXh0ZW5kKHt0eXBlOiJwaWUiLGluaXQ6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgci5Hcm91cDt0aGlzLl9zZWN0b3JHcm91cD10fSxyZW5kZXI6ZnVuY3Rpb24odCxlLGksYSl7aWYoIWF8fGEuZnJvbSE9PXRoaXMudWlkKXt2YXIgcj10LmdldERhdGEoKSxsPXRoaXMuX2RhdGEsdT10aGlzLmdyb3VwLGg9ZS5nZXQoImFuaW1hdGlvbiIpLGM9IWwsZD10LmdldCgiYW5pbWF0aW9uVHlwZSIpLGY9cy5jdXJyeShuLHRoaXMudWlkLHQsaCxpKSxwPXQuZ2V0KCJzZWxlY3RlZE1vZGUiKTtpZihyLmRpZmYobCkuYWRkKGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBvKHIsdCk7YyYmInNjYWxlIiE9PWQmJmUuZWFjaENoaWxkKGZ1bmN0aW9uKHQpe3Quc3RvcEFuaW1hdGlvbighMCl9KSxwJiZlLm9uKCJjbGljayIsZiksci5zZXRJdGVtR3JhcGhpY0VsKHQsZSksdS5hZGQoZSl9KS51cGRhdGUoZnVuY3Rpb24odCxlKXt2YXIgaT1sLmdldEl0ZW1HcmFwaGljRWwoZSk7aS51cGRhdGVEYXRhKHIsdCksaS5vZmYoImNsaWNrIikscCYmaS5vbigiY2xpY2siLGYpLHUuYWRkKGkpLHIuc2V0SXRlbUdyYXBoaWNFbCh0LGkpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWwuZ2V0SXRlbUdyYXBoaWNFbCh0KTt1LnJlbW92ZShlKX0pLmV4ZWN1dGUoKSxoJiZjJiZyLmNvdW50KCk+MCYmInNjYWxlIiE9PWQpe3ZhciBnPXIuZ2V0SXRlbUxheW91dCgwKSxtPU1hdGgubWF4KGkuZ2V0V2lkdGgoKSxpLmdldEhlaWdodCgpKS8yLHY9cy5iaW5kKHUucmVtb3ZlQ2xpcFBhdGgsdSk7dS5zZXRDbGlwUGF0aCh0aGlzLl9jcmVhdGVDbGlwUGF0aChnLmN4LGcuY3ksbSxnLnN0YXJ0QW5nbGUsZy5jbG9ja3dpc2Usdix0KSl9dGhpcy5fZGF0YT1yfX0sZGlzcG9zZTpmdW5jdGlvbigpe30sX2NyZWF0ZUNsaXBQYXRoOmZ1bmN0aW9uKHQsZSxpLG4sYSxvLHMpe3ZhciBsPW5ldyByLlNlY3Rvcih7c2hhcGU6e2N4OnQsY3k6ZSxyMDowLHI6aSxzdGFydEFuZ2xlOm4sZW5kQW5nbGU6bixjbG9ja3dpc2U6YX19KTtyZXR1cm4gci5pbml0UHJvcHMobCx7c2hhcGU6e2VuZEFuZ2xlOm4rKGE/MTotMSkqTWF0aC5QSSoyfX0scyxvKSxsfSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldERhdGEoKSxuPWkuZ2V0SXRlbUxheW91dCgwKTtpZihuKXt2YXIgYT10WzBdLW4uY3gsbz10WzFdLW4uY3kscj1NYXRoLnNxcnQoYSphK28qbyk7cmV0dXJuIHI8PW4uciYmcj49bi5yMH19fSk7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUsaSxuLGEsbyxyKXtmdW5jdGlvbiBzKGUsaSxuLGEpe2Zvcih2YXIgbz1lO288aTtvKyspaWYodFtvXS55Kz1uLG8+ZSYmbysxPGkmJnRbbysxXS55PnRbb10ueSt0W29dLmhlaWdodClyZXR1cm4gdm9pZCBsKG8sbi8yKTtsKGktMSxuLzIpfWZ1bmN0aW9uIGwoZSxpKXtmb3IodmFyIG49ZTtuPj0wJiYodFtuXS55LT1pLCEobj4wJiZ0W25dLnk+dFtuLTFdLnkrdFtuLTFdLmhlaWdodCkpO24tLSk7fWZ1bmN0aW9uIHUodCxlLGksbixhLG8pe2Zvcih2YXIgcj1vPjA/ZT9OdW1iZXIuTUFYX1ZBTFVFOjA6ZT9OdW1iZXIuTUFYX1ZBTFVFOjAscz0wLGw9dC5sZW5ndGg7czxsO3MrKylpZigiY2VudGVyIiE9PXRbc10ucG9zaXRpb24pe3ZhciB1PU1hdGguYWJzKHRbc10ueS1uKSxoPXRbc10ubGVuLGM9dFtzXS5sZW4yLGQ9dTxhK2g/TWF0aC5zcXJ0KChhK2grYykqKGEraCtjKS11KnUpOk1hdGguYWJzKHRbc10ueC1pKTtlJiZkPj1yJiYoZD1yLTEwKSwhZSYmZDw9ciYmKGQ9cisxMCksdFtzXS54PWkrZCpvLHI9ZH19dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueS1lLnl9KTtmb3IodmFyIGgsYz0wLGQ9dC5sZW5ndGgsZj1bXSxwPVtdLGc9MDtnPGQ7ZysrKWg9dFtnXS55LWMsaDwwJiZzKGcsZCwtaCxhKSxjPXRbZ10ueSt0W2ddLmhlaWdodDtyLWM8MCYmbChkLTEsYy1yKTtmb3IodmFyIGc9MDtnPGQ7ZysrKXRbZ10ueT49aT9wLnB1c2godFtnXSk6Zi5wdXNoKHRbZ10pO3UoZiwhMSxlLGksbixhKSx1KHAsITAsZSxpLG4sYSl9ZnVuY3Rpb24gYSh0LGUsaSxhLG8scil7Zm9yKHZhciBzPVtdLGw9W10sdT0wO3U8dC5sZW5ndGg7dSsrKXRbdV0ueDxlP3MucHVzaCh0W3VdKTpsLnB1c2godFt1XSk7bihsLGUsaSxhLDEsbyxyKSxuKHMsZSxpLGEsLTEsbyxyKTtmb3IodmFyIHU9MDt1PHQubGVuZ3RoO3UrKyl7dmFyIGg9dFt1XS5saW5lUG9pbnRzO2lmKGgpe3ZhciBjPWhbMV1bMF0taFsyXVswXTt0W3VdLng8ZT9oWzJdWzBdPXRbdV0ueCszOmhbMl1bMF09dFt1XS54LTMsaFsxXVsxXT1oWzJdWzFdPXRbdV0ueSxoWzFdWzBdPWhbMl1bMF0rY319fXZhciBvPWkoMTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSxuKXt2YXIgcixzLGw9dC5nZXREYXRhKCksdT1bXSxoPSExO2wuZWFjaChmdW5jdGlvbihpKXt2YXIgbixhLGMsZCxmPWwuZ2V0SXRlbUxheW91dChpKSxwPWwuZ2V0SXRlbU1vZGVsKGkpLGc9cC5nZXRNb2RlbCgibGFiZWwubm9ybWFsIiksbT1nLmdldCgicG9zaXRpb24iKXx8cC5nZXQoImxhYmVsLmVtcGhhc2lzLnBvc2l0aW9uIiksdj1wLmdldE1vZGVsKCJsYWJlbExpbmUubm9ybWFsIikseT12LmdldCgibGVuZ3RoIikseD12LmdldCgibGVuZ3RoMiIpLF89KGYuc3RhcnRBbmdsZStmLmVuZEFuZ2xlKS8yLGI9TWF0aC5jb3MoXyksdz1NYXRoLnNpbihfKTtyPWYuY3gscz1mLmN5O3ZhciBTPSJpbnNpZGUiPT09bXx8ImlubmVyIj09PW07aWYoImNlbnRlciI9PT1tKW49Zi5jeCxhPWYuY3ksZD0iY2VudGVyIjtlbHNle3ZhciBNPShTPyhmLnIrZi5yMCkvMipiOmYucipiKStyLEk9KFM/KGYucitmLnIwKS8yKnc6Zi5yKncpK3M7aWYobj1NKzMqYixhPUkrMyp3LCFTKXt2YXIgVD1NK2IqKHkrZS1mLnIpLEE9SSt3Kih5K2UtZi5yKSxDPVQrKGI8MD8tMToxKSp4LEw9QTtuPUMrKGI8MD8tNTo1KSxhPUwsYz1bW00sSV0sW1QsQV0sW0MsTF1dfWQ9Uz8iY2VudGVyIjpiPjA/ImxlZnQiOiJyaWdodCJ9dmFyIEQ9Zy5nZXRGb250KCksUD1nLmdldCgicm90YXRlIik/YjwwPy1fK01hdGguUEk6LV86MCxrPXQuZ2V0Rm9ybWF0dGVkTGFiZWwoaSwibm9ybWFsIil8fGwuZ2V0TmFtZShpKSxPPW8uZ2V0Qm91bmRpbmdSZWN0KGssRCxkLCJ0b3AiKTtoPSEhUCxmLmxhYmVsPXt4Om4seTphLHBvc2l0aW9uOm0saGVpZ2h0Ok8uaGVpZ2h0LGxlbjp5LGxlbjI6eCxsaW5lUG9pbnRzOmMsdGV4dEFsaWduOmQsdmVydGljYWxBbGlnbjoibWlkZGxlIixyb3RhdGlvbjpQLGluc2lkZTpTfSxTfHx1LnB1c2goZi5sYWJlbCl9KSwhaCYmdC5nZXQoImF2b2lkTGFiZWxPdmVybGFwIikmJmEodSxyLHMsZSxpLG4pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNCksYT1uLnBhcnNlUGVyY2VudCxvPWkoMTIwKSxyPWkoMSkscz0yKk1hdGguUEksbD1NYXRoLlBJLzE4MDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGksdSl7ZS5lYWNoU2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImNlbnRlciIpLHU9dC5nZXQoInJhZGl1cyIpO3IuaXNBcnJheSh1KXx8KHU9WzAsdV0pLHIuaXNBcnJheShlKXx8KGU9W2UsZV0pO3ZhciBoPWkuZ2V0V2lkdGgoKSxjPWkuZ2V0SGVpZ2h0KCksZD1NYXRoLm1pbihoLGMpLGY9YShlWzBdLGgpLHA9YShlWzFdLGMpLGc9YSh1WzBdLGQvMiksbT1hKHVbMV0sZC8yKSx2PXQuZ2V0RGF0YSgpLHk9LXQuZ2V0KCJzdGFydEFuZ2xlIikqbCx4PXQuZ2V0KCJtaW5BbmdsZSIpKmwsXz0wO3YuZWFjaCgidmFsdWUiLGZ1bmN0aW9uKHQpeyFpc05hTih0KSYmXysrfSk7dmFyIGI9di5nZXRTdW0oInZhbHVlIiksdz1NYXRoLlBJLyhifHxfKSoyLFM9dC5nZXQoImNsb2Nrd2lzZSIpLE09dC5nZXQoInJvc2VUeXBlIiksST10LmdldCgic3RpbGxTaG93WmVyb1N1bSIpLFQ9di5nZXREYXRhRXh0ZW50KCJ2YWx1ZSIpO1RbMF09MDt2YXIgQT1zLEM9MCxMPXksRD1TPzE6LTE7aWYodi5lYWNoKCJ2YWx1ZSIsZnVuY3Rpb24odCxlKXt2YXIgaTtpZihpc05hTih0KSlyZXR1cm4gdm9pZCB2LnNldEl0ZW1MYXlvdXQoZSx7YW5nbGU6TmFOLHN0YXJ0QW5nbGU6TmFOLGVuZEFuZ2xlOk5hTixjbG9ja3dpc2U6UyxjeDpmLGN5OnAscjA6ZyxyOk0/TmFOOm19KTtpPSJhcmVhIiE9PU0/MD09PWImJkk/dzp0Knc6cy9fLGk8eD8oaT14LEEtPXgpOkMrPXQ7dmFyIGE9TCtEKmk7di5zZXRJdGVtTGF5b3V0KGUse2FuZ2xlOmksc3RhcnRBbmdsZTpMLGVuZEFuZ2xlOmEsY2xvY2t3aXNlOlMsY3g6ZixjeTpwLHIwOmcscjpNP24ubGluZWFyTWFwKHQsVCxbZyxtXSk6bX0pLEw9YX0sITApLEE8cyYmXylpZihBPD0uMDAxKXt2YXIgUD1zL187di5lYWNoKCJ2YWx1ZSIsZnVuY3Rpb24odCxlKXtpZighaXNOYU4odCkpe3ZhciBpPXYuZ2V0SXRlbUxheW91dChlKTtpLmFuZ2xlPVAsaS5zdGFydEFuZ2xlPXkrRCplKlAsaS5lbmRBbmdsZT15K0QqKGUrMSkqUH19KX1lbHNlIHc9QS9DLEw9eSx2LmVhY2goInZhbHVlIixmdW5jdGlvbih0LGUpe2lmKCFpc05hTih0KSl7dmFyIGk9di5nZXRJdGVtTGF5b3V0KGUpLG49aS5hbmdsZT09PXg/eDp0Knc7aS5zdGFydEFuZ2xlPUwsaS5lbmRBbmdsZT1MK0QqbixMKz1EKm59fSk7byh0LG0saCxjKX0pfX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtpKDYzKSxpKDEyMyl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgzKSxvPWkoNDApLHI9aSg0MSkscz1pKDgwKSxsPW8uaWZJZ25vcmVPblRpY2ssdT1vLmdldEludGVydmFsLGg9WyJheGlzTGluZSIsImF4aXNUaWNrTGFiZWwiLCJheGlzTmFtZSJdLGM9WyJzcGxpdEFyZWEiLCJzcGxpdExpbmUiXSxkPXIuZXh0ZW5kKHt0eXBlOiJjYXJ0ZXNpYW5BeGlzIixheGlzUG9pbnRlckNsYXNzOiJDYXJ0ZXNpYW5BeGlzUG9pbnRlciIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLHIpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIGw9dGhpcy5fYXhpc0dyb3VwO2lmKHRoaXMuX2F4aXNHcm91cD1uZXcgYS5Hcm91cCx0aGlzLmdyb3VwLmFkZCh0aGlzLl9heGlzR3JvdXApLHQuZ2V0KCJzaG93Iikpe3ZhciB1PXQuZ2V0Q29vcmRTeXNNb2RlbCgpLGY9cy5sYXlvdXQodSx0KSxwPW5ldyBvKHQsZik7bi5lYWNoKGgscC5hZGQscCksdGhpcy5fYXhpc0dyb3VwLmFkZChwLmdldEdyb3VwKCkpLG4uZWFjaChjLGZ1bmN0aW9uKGUpe3QuZ2V0KGUrIi5zaG93IikmJnRoaXNbIl8iK2VdKHQsdSxmLmxhYmVsSW50ZXJ2YWwpfSx0aGlzKSxhLmdyb3VwVHJhbnNpdGlvbihsLHRoaXMuX2F4aXNHcm91cCx0KSxkLnN1cGVyQ2FsbCh0aGlzLCJyZW5kZXIiLHQsZSxpLHIpfX0sX3NwbGl0TGluZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5heGlzO2lmKCFvLnNjYWxlLmlzQmxhbmsoKSl7dmFyIHI9dC5nZXRNb2RlbCgic3BsaXRMaW5lIikscz1yLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxoPXMuZ2V0KCJjb2xvciIpLGM9dShyLGkpO2g9bi5pc0FycmF5KGgpP2g6W2hdO2Zvcih2YXIgZD1lLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpLGY9by5pc0hvcml6b250YWwoKSxwPTAsZz1vLmdldFRpY2tzQ29vcmRzKCksbT1vLnNjYWxlLmdldFRpY2tzKCksdj10LmdldCgiYXhpc0xhYmVsLnNob3dNaW5MYWJlbCIpLHk9dC5nZXQoImF4aXNMYWJlbC5zaG93TWF4TGFiZWwiKSx4PVtdLF89W10sYj1zLmdldExpbmVTdHlsZSgpLHc9MDt3PGcubGVuZ3RoO3crKylpZighbChvLHcsYyxnLmxlbmd0aCx2LHkpKXt2YXIgUz1vLnRvR2xvYmFsQ29vcmQoZ1t3XSk7Zj8oeFswXT1TLHhbMV09ZC55LF9bMF09UyxfWzFdPWQueStkLmhlaWdodCk6KHhbMF09ZC54LHhbMV09UyxfWzBdPWQueCtkLndpZHRoLF9bMV09Uyk7dmFyIE09cCsrJWgubGVuZ3RoO3RoaXMuX2F4aXNHcm91cC5hZGQobmV3IGEuTGluZShhLnN1YlBpeGVsT3B0aW1pemVMaW5lKHthbmlkOiJsaW5lXyIrbVt3XSxzaGFwZTp7eDE6eFswXSx5MTp4WzFdLHgyOl9bMF0seTI6X1sxXX0sc3R5bGU6bi5kZWZhdWx0cyh7c3Ryb2tlOmhbTV19LGIpLHNpbGVudDohMH0pKSl9fX0sX3NwbGl0QXJlYTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5heGlzO2lmKCFvLnNjYWxlLmlzQmxhbmsoKSl7dmFyIHI9dC5nZXRNb2RlbCgic3BsaXRBcmVhIikscz1yLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxoPXMuZ2V0KCJjb2xvciIpLGM9ZS5jb29yZGluYXRlU3lzdGVtLmdldFJlY3QoKSxkPW8uZ2V0VGlja3NDb29yZHMoKSxmPW8uc2NhbGUuZ2V0VGlja3MoKSxwPW8udG9HbG9iYWxDb29yZChkWzBdKSxnPW8udG9HbG9iYWxDb29yZChkWzBdKSxtPTAsdj11KHIsaSkseT1zLmdldEFyZWFTdHlsZSgpO2g9bi5pc0FycmF5KGgpP2g6W2hdO2Zvcih2YXIgeD10LmdldCgiYXhpc0xhYmVsLnNob3dNaW5MYWJlbCIpLF89dC5nZXQoImF4aXNMYWJlbC5zaG93TWF4TGFiZWwiKSxiPTE7YjxkLmxlbmd0aDtiKyspaWYoIWwobyxiLHYsZC5sZW5ndGgseCxfKSl7dmFyIHcsUyxNLEksVD1vLnRvR2xvYmFsQ29vcmQoZFtiXSk7by5pc0hvcml6b250YWwoKT8odz1wLFM9Yy55LE09VC13LEk9Yy5oZWlnaHQpOih3PWMueCxTPWcsTT1jLndpZHRoLEk9VC1TKTt2YXIgQT1tKyslaC5sZW5ndGg7dGhpcy5fYXhpc0dyb3VwLmFkZChuZXcgYS5SZWN0KHthbmlkOiJhcmVhXyIrZltiXSxzaGFwZTp7eDp3LHk6Uyx3aWR0aDpNLGhlaWdodDpJfSxzdHlsZTpuLmRlZmF1bHRzKHtmaWxsOmhbQV19LHkpLHNpbGVudDohMH0pKSxwPXcrTSxnPVMrSX19fX0pO2QuZXh0ZW5kKHt0eXBlOiJ4QXhpcyJ9KSxkLmV4dGVuZCh7dHlwZToieUF4aXMifSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe31mdW5jdGlvbiBhKHQsZSxpLG4pe28oZChpKS5sYXN0UHJvcCxuKXx8KGQoaSkubGFzdFByb3A9bixlP2MudXBkYXRlUHJvcHMoaSxuLHQpOihpLnN0b3BBbmltYXRpb24oKSxpLmF0dHIobikpKX1mdW5jdGlvbiBvKHQsZSl7aWYodS5pc09iamVjdCh0KSYmdS5pc09iamVjdChlKSl7dmFyIGk9ITA7cmV0dXJuIHUuZWFjaChlLGZ1bmN0aW9uKGUsbil7aT1pJiZvKHRbbl0sZSl9KSwhIWl9cmV0dXJuIHQ9PT1lfWZ1bmN0aW9uIHIodCxlKXt0W2UuZ2V0KCJsYWJlbC5zaG93Iik/InNob3ciOiJoaWRlIl0oKX1mdW5jdGlvbiBzKHQpe3JldHVybntwb3NpdGlvbjp0LnBvc2l0aW9uLnNsaWNlKCkscm90YXRpb246dC5yb3RhdGlvbnx8MH19ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG49ZS5nZXQoInoiKSxhPWUuZ2V0KCJ6bGV2ZWwiKTt0JiZ0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJncm91cCIhPT10LnR5cGUmJihudWxsIT1uJiYodC56PW4pLG51bGwhPWEmJih0LnpsZXZlbD1hKSx0LnNpbGVudD1pKX0pfXZhciB1PWkoMSksaD1pKDE1KSxjPWkoMyksZD1pKDUpLm1ha2VHZXR0ZXIoKSxmPWkoNDcpLHA9aSgyMSksZz1pKDM3KSxtPXUuY2xvbmUsdj11LmJpbmQ7bi5wcm90b3R5cGU9e19ncm91cDpudWxsLF9sYXN0R3JhcGhpY0tleTpudWxsLF9oYW5kbGU6bnVsbCxfZHJhZ2dpbmc6ITEsX2xhc3RWYWx1ZTpudWxsLF9sYXN0U3RhdHVzOm51bGwsX3BheWxvYWRJbmZvOm51bGwsYW5pbWF0aW9uVGhyZXNob2xkOjE1LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1lLmdldCgidmFsdWUiKSxyPWUuZ2V0KCJzdGF0dXMiKTtpZih0aGlzLl9heGlzTW9kZWw9dCx0aGlzLl9heGlzUG9pbnRlck1vZGVsPWUsdGhpcy5fYXBpPWksbnx8dGhpcy5fbGFzdFZhbHVlIT09b3x8dGhpcy5fbGFzdFN0YXR1cyE9PXIpe3RoaXMuX2xhc3RWYWx1ZT1vLHRoaXMuX2xhc3RTdGF0dXM9cjt2YXIgcz10aGlzLl9ncm91cCxoPXRoaXMuX2hhbmRsZTtpZighcnx8ImhpZGUiPT09cilyZXR1cm4gcyYmcy5oaWRlKCksdm9pZChoJiZoLmhpZGUoKSk7cyYmcy5zaG93KCksaCYmaC5zaG93KCk7dmFyIGQ9e307dGhpcy5tYWtlRWxPcHRpb24oZCxvLHQsZSxpKTt2YXIgZj1kLmdyYXBoaWNLZXk7ZiE9PXRoaXMuX2xhc3RHcmFwaGljS2V5JiZ0aGlzLmNsZWFyKGkpLHRoaXMuX2xhc3RHcmFwaGljS2V5PWY7dmFyIHA9dGhpcy5fbW92ZUFuaW1hdGlvbj10aGlzLmRldGVybWluZUFuaW1hdGlvbih0LGUpO2lmKHMpe3ZhciBnPXUuY3VycnkoYSxlLHApO3RoaXMudXBkYXRlUG9pbnRlckVsKHMsZCxnLGUpLHRoaXMudXBkYXRlTGFiZWxFbChzLGQsZyxlKX1lbHNlIHM9dGhpcy5fZ3JvdXA9bmV3IGMuR3JvdXAsdGhpcy5jcmVhdGVQb2ludGVyRWwocyxkLHQsZSksdGhpcy5jcmVhdGVMYWJlbEVsKHMsZCx0LGUpLGkuZ2V0WnIoKS5hZGQocyk7bChzLGUsITApLHRoaXMuX3JlbmRlckhhbmRsZShvKX19LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLmNsZWFyKHQpfSxkaXNwb3NlOmZ1bmN0aW9uKHQpe3RoaXMuY2xlYXIodCl9LGRldGVybWluZUFuaW1hdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0KCJhbmltYXRpb24iKSxuPXQuYXhpcyxhPSJjYXRlZ29yeSI9PT1uLnR5cGUsbz1lLmdldCgic25hcCIpO2lmKCFvJiYhYSlyZXR1cm4hMTtpZigiYXV0byI9PT1pfHxudWxsPT1pKXt2YXIgcj10aGlzLmFuaW1hdGlvblRocmVzaG9sZDtpZihhJiZuLmdldEJhbmRXaWR0aCgpPnIpcmV0dXJuITA7aWYobyl7dmFyIHM9Zi5nZXRBeGlzSW5mbyh0KS5zZXJpZXNEYXRhQ291bnQsbD1uLmdldEV4dGVudCgpO3JldHVybiBNYXRoLmFicyhsWzBdLWxbMV0pL3M+cn1yZXR1cm4hMX1yZXR1cm4gaT09PSEwfSxtYWtlRWxPcHRpb246ZnVuY3Rpb24odCxlLGksbixhKXt9LGNyZWF0ZVBvaW50ZXJFbDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1lLnBvaW50ZXI7aWYoYSl7dmFyIG89ZCh0KS5wb2ludGVyRWw9bmV3IGNbYS50eXBlXShtKGUucG9pbnRlcikpO3QuYWRkKG8pfX0sY3JlYXRlTGFiZWxFbDpmdW5jdGlvbih0LGUsaSxuKXtpZihlLmxhYmVsKXt2YXIgYT1kKHQpLmxhYmVsRWw9bmV3IGMuUmVjdChtKGUubGFiZWwpKTt0LmFkZChhKSxyKGEsbil9fSx1cGRhdGVQb2ludGVyRWw6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWQodCkucG9pbnRlckVsO24mJihuLnNldFN0eWxlKGUucG9pbnRlci5zdHlsZSksaShuLHtzaGFwZTplLnBvaW50ZXIuc2hhcGV9KSl9LHVwZGF0ZUxhYmVsRWw6ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9ZCh0KS5sYWJlbEVsO2EmJihhLnNldFN0eWxlKGUubGFiZWwuc3R5bGUpLGkoYSx7c2hhcGU6ZS5sYWJlbC5zaGFwZSxwb3NpdGlvbjplLmxhYmVsLnBvc2l0aW9ufSkscihhLG4pKX0sX3JlbmRlckhhbmRsZTpmdW5jdGlvbih0KXtpZighdGhpcy5fZHJhZ2dpbmcmJnRoaXMudXBkYXRlSGFuZGxlVHJhbnNmb3JtKXt2YXIgZT10aGlzLl9heGlzUG9pbnRlck1vZGVsLGk9dGhpcy5fYXBpLmdldFpyKCksbj10aGlzLl9oYW5kbGUsYT1lLmdldE1vZGVsKCJoYW5kbGUiKSxvPWUuZ2V0KCJzdGF0dXMiKTtpZighYS5nZXQoInNob3ciKXx8IW98fCJoaWRlIj09PW8pcmV0dXJuIG4mJmkucmVtb3ZlKG4pLHZvaWQodGhpcy5faGFuZGxlPW51bGwpO3ZhciByO3RoaXMuX2hhbmRsZXx8KHI9ITAsbj10aGlzLl9oYW5kbGU9Yy5jcmVhdGVJY29uKGEuZ2V0KCJpY29uIikse2N1cnNvcjoibW92ZSIsZHJhZ2dhYmxlOiEwLG9ubW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe3Auc3RvcCh0LmV2ZW50KX0sb25tb3VzZWRvd246dih0aGlzLl9vbkhhbmRsZURyYWdNb3ZlLHRoaXMsMCwwKSxkcmlmdDp2KHRoaXMuX29uSGFuZGxlRHJhZ01vdmUsdGhpcyksb25kcmFnZW5kOnYodGhpcy5fb25IYW5kbGVEcmFnRW5kLHRoaXMpfSksaS5hZGQobikpLGwobixlLCExKTt2YXIgcz1bImNvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsIm9wYWNpdHkiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dPZmZzZXRYIiwic2hhZG93T2Zmc2V0WSJdO24uc2V0U3R5bGUoYS5nZXRJdGVtU3R5bGUobnVsbCxzKSk7dmFyIGg9YS5nZXQoInNpemUiKTt1LmlzQXJyYXkoaCl8fChoPVtoLGhdKSxuLmF0dHIoInNjYWxlIixbaFswXS8yLGhbMV0vMl0pLGcuY3JlYXRlT3JVcGRhdGUodGhpcywiX2RvRGlzcGF0Y2hBeGlzUG9pbnRlciIsYS5nZXQoInRocm90dGxlIil8fDAsImZpeFJhdGUiKSx0aGlzLl9tb3ZlSGFuZGxlVG9WYWx1ZSh0LHIpfX0sX21vdmVIYW5kbGVUb1ZhbHVlOmZ1bmN0aW9uKHQsZSl7YSh0aGlzLl9heGlzUG9pbnRlck1vZGVsLCFlJiZ0aGlzLl9tb3ZlQW5pbWF0aW9uLHRoaXMuX2hhbmRsZSxzKHRoaXMuZ2V0SGFuZGxlVHJhbnNmb3JtKHQsdGhpcy5fYXhpc01vZGVsLHRoaXMuX2F4aXNQb2ludGVyTW9kZWwpKSl9LF9vbkhhbmRsZURyYWdNb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5faGFuZGxlO2lmKGkpe3RoaXMuX2RyYWdnaW5nPSEwO3ZhciBuPXRoaXMudXBkYXRlSGFuZGxlVHJhbnNmb3JtKHMoaSksW3QsZV0sdGhpcy5fYXhpc01vZGVsLHRoaXMuX2F4aXNQb2ludGVyTW9kZWwpO3RoaXMuX3BheWxvYWRJbmZvPW4saS5zdG9wQW5pbWF0aW9uKCksaS5hdHRyKHMobikpLGQoaSkubGFzdFByb3A9bnVsbCx0aGlzLl9kb0Rpc3BhdGNoQXhpc1BvaW50ZXIoKX19LF9kb0Rpc3BhdGNoQXhpc1BvaW50ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9oYW5kbGU7aWYodCl7dmFyIGU9dGhpcy5fcGF5bG9hZEluZm8saT10aGlzLl9heGlzTW9kZWw7dGhpcy5fYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ1cGRhdGVBeGlzUG9pbnRlciIseDplLmN1cnNvclBvaW50WzBdLHk6ZS5jdXJzb3JQb2ludFsxXSx0b29sdGlwT3B0aW9uOmUudG9vbHRpcE9wdGlvbixheGVzSW5mbzpbe2F4aXNEaW06aS5heGlzLmRpbSxheGlzSW5kZXg6aS5jb21wb25lbnRJbmRleH1dfSl9fSxfb25IYW5kbGVEcmFnRW5kOmZ1bmN0aW9uKHQpe3RoaXMuX2RyYWdnaW5nPSExO3ZhciBlPXRoaXMuX2hhbmRsZTtpZihlKXt2YXIgaT10aGlzLl9heGlzUG9pbnRlck1vZGVsLmdldCgidmFsdWUiKTt0aGlzLl9tb3ZlSGFuZGxlVG9WYWx1ZShpKSx0aGlzLl9hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImhpZGVUaXAifSl9fSxnZXRIYW5kbGVUcmFuc2Zvcm06bnVsbCx1cGRhdGVIYW5kbGVUcmFuc2Zvcm06bnVsbCxjbGVhcjpmdW5jdGlvbih0KXt0aGlzLl9sYXN0VmFsdWU9bnVsbCx0aGlzLl9sYXN0U3RhdHVzPW51bGw7dmFyIGU9dC5nZXRacigpLGk9dGhpcy5fZ3JvdXAsbj10aGlzLl9oYW5kbGU7ZSYmaSYmKHRoaXMuX2xhc3RHcmFwaGljS2V5PW51bGwsaSYmZS5yZW1vdmUoaSksbiYmZS5yZW1vdmUobiksdGhpcy5fZ3JvdXA9bnVsbCx0aGlzLl9oYW5kbGU9bnVsbCx0aGlzLl9wYXlsb2FkSW5mbz1udWxsKX0sZG9DbGVhcjpmdW5jdGlvbigpe30sYnVpbGRMYWJlbDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGk9aXx8MCx7eDp0W2ldLHk6dFsxLWldLHdpZHRoOmVbaV0saGVpZ2h0OmVbMS1pXX19fSxuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uLGguZW5hYmxlQ2xhc3NFeHRlbmQobiksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXt9O3JldHVybiBpW2UuZGltKyJBeGlzSW5kZXgiXT1lLmluZGV4LHQuZ2V0Q2FydGVzaWFuKGkpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIngiPT09dC5kaW0/MDoxfXZhciBvPWkoMykscj1pKDEyNCkscz1pKDgxKSxsPWkoODApLHU9aSg0MSksaD1yLmV4dGVuZCh7bWFrZUVsT3B0aW9uOmZ1bmN0aW9uKHQsZSxpLGEsbyl7dmFyIHI9aS5heGlzLHU9ci5ncmlkLGg9YS5nZXQoInR5cGUiKSxkPW4odSxyKS5nZXRPdGhlckF4aXMocikuZ2V0R2xvYmFsRXh0ZW50KCksZj1yLnRvR2xvYmFsQ29vcmQoci5kYXRhVG9Db29yZChlLCEwKSk7aWYoaCYmIm5vbmUiIT09aCl7dmFyIHA9cy5idWlsZEVsU3R5bGUoYSksZz1jW2hdKHIsZixkLHApO2cuc3R5bGU9cCx0LmdyYXBoaWNLZXk9Zy50eXBlLHQucG9pbnRlcj1nfXZhciBtPWwubGF5b3V0KHUubW9kZWwsaSk7cy5idWlsZENhcnRlc2lhblNpbmdsZUxhYmVsRWxPcHRpb24oZSx0LG0saSxhLG8pfSxnZXRIYW5kbGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWwubGF5b3V0KGUuYXhpcy5ncmlkLm1vZGVsLGUse2xhYmVsSW5zaWRlOiExfSk7cmV0dXJuIG4ubGFiZWxNYXJnaW49aS5nZXQoImhhbmRsZS5tYXJnaW4iKSx7cG9zaXRpb246cy5nZXRUcmFuc2Zvcm1lZFBvc2l0aW9uKGUuYXhpcyx0LG4pLHJvdGF0aW9uOm4ucm90YXRpb24rKG4ubGFiZWxEaXJlY3Rpb248MD9NYXRoLlBJOjApfX0sdXBkYXRlSGFuZGxlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSxpLGEpe3ZhciBvPWkuYXhpcyxyPW8uZ3JpZCxzPW8uZ2V0R2xvYmFsRXh0ZW50KCEwKSxsPW4ocixvKS5nZXRPdGhlckF4aXMobykuZ2V0R2xvYmFsRXh0ZW50KCksdT0ieCI9PT1vLmRpbT8wOjEsaD10LnBvc2l0aW9uO2hbdV0rPWVbdV0saFt1XT1NYXRoLm1pbihzWzFdLGhbdV0pLGhbdV09TWF0aC5tYXgoc1swXSxoW3VdKTt2YXIgYz0obFsxXStsWzBdKS8yLGQ9W2MsY107ZFt1XT1oW3VdO3ZhciBmPVt7dmVydGljYWxBbGlnbjoibWlkZGxlIn0se2FsaWduOiJjZW50ZXIifV07cmV0dXJue3Bvc2l0aW9uOmgscm90YXRpb246dC5yb3RhdGlvbixjdXJzb3JQb2ludDpkLHRvb2x0aXBPcHRpb246Zlt1XX19fSksYz17bGluZTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgcj1zLm1ha2VMaW5lU2hhcGUoW2UsaVswXV0sW2UsaVsxXV0sYSh0KSk7cmV0dXJuIG8uc3ViUGl4ZWxPcHRpbWl6ZUxpbmUoe3NoYXBlOnIsc3R5bGU6bn0pLHt0eXBlOiJMaW5lIixzaGFwZTpyfX0sc2hhZG93OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXQuZ2V0QmFuZFdpZHRoKCkscj1pWzFdLWlbMF07cmV0dXJue3R5cGU6IlJlY3QiLHNoYXBlOnMubWFrZVJlY3RTaGFwZShbZS1vLzIsaVswXV0sW28scl0sYSh0KSl9fX07dS5yZWdpc3RlckF4aXNQb2ludGVyQ2xhc3MoIkNhcnRlc2lhbkF4aXNQb2ludGVyIixoKSx0LmV4cG9ydHM9aH0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBpLG89W10scj10LnNlcmllc0luZGV4O2lmKG51bGw9PXJ8fCEoaT1lLmdldFNlcmllc0J5SW5kZXgocikpKXJldHVybntwb2ludDpbXX07dmFyIHM9aS5nZXREYXRhKCksbD1hLnF1ZXJ5RGF0YUluZGV4KHMsdCk7aWYobnVsbD09bHx8bi5pc0FycmF5KGwpKXJldHVybntwb2ludDpbXX07dmFyIHU9cy5nZXRJdGVtR3JhcGhpY0VsKGwpLGg9aS5jb29yZGluYXRlU3lzdGVtO2lmKGkuZ2V0VG9vbHRpcFBvc2l0aW9uKW89aS5nZXRUb29sdGlwUG9zaXRpb24obCl8fFtdO2Vsc2UgaWYoaCYmaC5kYXRhVG9Qb2ludClvPWguZGF0YVRvUG9pbnQocy5nZXRWYWx1ZXMobi5tYXAoaC5kaW1lbnNpb25zLGZ1bmN0aW9uKHQpe3JldHVybiBpLmNvb3JkRGltVG9EYXRhRGltKHQpWzBdfSksbCwhMCkpfHxbXTtlbHNlIGlmKHUpe3ZhciBjPXUuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtjLmFwcGx5VHJhbnNmb3JtKHUudHJhbnNmb3JtKSxvPVtjLngrYy53aWR0aC8yLGMueStjLmhlaWdodC8yXX1yZXR1cm57cG9pbnQ6byxlbDp1fX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7ZnVuY3Rpb24gaShpLG4pe3Qub24oaSxmdW5jdGlvbihpKXt2YXIgbz1zKGUpO2MoaCh0KS5yZWNvcmRzLGZ1bmN0aW9uKHQpe3QmJm4odCxpLG8uZGlzcGF0Y2hBY3Rpb24pfSksYShvLnBlbmRpbmdzLGUpfSl9aCh0KS5pbml0aWFsaXplZHx8KGgodCkuaW5pdGlhbGl6ZWQ9ITAsaSgiY2xpY2siLHUuY3VycnkociwiY2xpY2siKSksaSgibW91c2Vtb3ZlIix1LmN1cnJ5KHIsIm1vdXNlbW92ZSIpKSxpKCJnbG9iYWxvdXQiLG8pKX1mdW5jdGlvbiBhKHQsZSl7dmFyIGksbj10LnNob3dUaXAubGVuZ3RoLGE9dC5oaWRlVGlwLmxlbmd0aDtuP2k9dC5zaG93VGlwW24tMV06YSYmKGk9dC5oaWRlVGlwW2EtMV0pLGkmJihpLmRpc3BhdGNoQWN0aW9uPW51bGwsZS5kaXNwYXRjaEFjdGlvbihpKSl9ZnVuY3Rpb24gbyh0LGUsaSl7dC5oYW5kbGVyKCJsZWF2ZSIsbnVsbCxpKX1mdW5jdGlvbiByKHQsZSxpLG4pe2UuaGFuZGxlcih0LGksbil9ZnVuY3Rpb24gcyh0KXt2YXIgZT17c2hvd1RpcDpbXSxoaWRlVGlwOltdfSxpPWZ1bmN0aW9uKG4pe3ZhciBhPWVbbi50eXBlXTthP2EucHVzaChuKToobi5kaXNwYXRjaEFjdGlvbj1pLHQuZGlzcGF0Y2hBY3Rpb24obikpfTtyZXR1cm57ZGlzcGF0Y2hBY3Rpb246aSxwZW5kaW5nczplfX12YXIgbD1pKDEwKSx1PWkoMSksaD1pKDUpLm1ha2VHZXR0ZXIoKSxjPXUuZWFjaCxkPXt9O2QucmVnaXN0ZXI9ZnVuY3Rpb24odCxlLGkpe2lmKCFsLm5vZGUpe3ZhciBhPWUuZ2V0WnIoKTtoKGEpLnJlY29yZHN8fChoKGEpLnJlY29yZHM9e30pLG4oYSxlKTt2YXIgbz1oKGEpLnJlY29yZHNbdF18fChoKGEpLnJlY29yZHNbdF09e30pO28uaGFuZGxlcj1pfX0sZC51bnJlZ2lzdGVyPWZ1bmN0aW9uKHQsZSl7aWYoIWwubm9kZSl7dmFyIGk9ZS5nZXRacigpLG49KGgoaSkucmVjb3Jkc3x8e30pW3RdO24mJihoKGkpLnJlY29yZHNbdF09bnVsbCl9fSx0LmV4cG9ydHM9ZH0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDgyKSxvPWkoMik7by5yZWdpc3RlckFjdGlvbigiZGF0YVpvb20iLGZ1bmN0aW9uKHQsZSl7dmFyIGk9YS5jcmVhdGVMaW5rZWROb2Rlc0ZpbmRlcihuLmJpbmQoZS5lYWNoQ29tcG9uZW50LGUsImRhdGFab29tIiksYS5lYWNoQXhpc0RpbSxmdW5jdGlvbih0LGUpe3JldHVybiB0LmdldChlLmF4aXNJbmRleCl9KSxvPVtdO2UuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImRhdGFab29tIixxdWVyeTp0fSxmdW5jdGlvbih0LGUpe28ucHVzaC5hcHBseShvLGkodCkubm9kZXMpfSksbi5lYWNoKG8sZnVuY3Rpb24oZSxpKXtlLnNldFJhd1JhbmdlKHtzdGFydDp0LnN0YXJ0LGVuZDp0LmVuZCxzdGFydFZhbHVlOnQuc3RhcnRWYWx1ZSxlbmRWYWx1ZTp0LmVuZFZhbHVlfSl9KX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7aS5nZXRBeGlzUHJveHkodC5uYW1lLGUpLnJlc2V0KGkpfWZ1bmN0aW9uIGEodCxlLGkpe2kuZ2V0QXhpc1Byb3h5KHQubmFtZSxlKS5maWx0ZXJEYXRhKGkpfXZhciBvPWkoMik7by5yZWdpc3RlclByb2Nlc3NvcihmdW5jdGlvbih0LGUpe3QuZWFjaENvbXBvbmVudCgiZGF0YVpvb20iLGZ1bmN0aW9uKHQpe3QuZWFjaFRhcmdldEF4aXMobiksdC5lYWNoVGFyZ2V0QXhpcyhhKX0pLHQuZWFjaENvbXBvbmVudCgiZGF0YVpvb20iLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCksaT1lLmdldERhdGFQZXJjZW50V2luZG93KCksbj1lLmdldERhdGFWYWx1ZVdpbmRvdygpO3Quc2V0UmF3UmFuZ2Uoe3N0YXJ0OmlbMF0sZW5kOmlbMV0sc3RhcnRWYWx1ZTpuWzBdLGVuZFZhbHVlOm5bMV19LCEwKX0pfSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXRbcl07cmV0dXJuIGV8fChlPXRbcl09W3t9XSksZX12YXIgYT1pKDEpLG89YS5lYWNoLHI9IlwwX2VjX2hpc3Rfc3RvcmUiLHM9e3B1c2g6ZnVuY3Rpb24odCxlKXt2YXIgaT1uKHQpO28oZSxmdW5jdGlvbihlLG4pe2Zvcih2YXIgYT1pLmxlbmd0aC0xO2E+PTA7YS0tKXt2YXIgbz1pW2FdO2lmKG9bbl0pYnJlYWt9aWYoYTwwKXt2YXIgcj10LnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6ImRhdGFab29tIixzdWJUeXBlOiJzZWxlY3QiLGlkOm59KVswXTtpZihyKXt2YXIgcz1yLmdldFBlcmNlbnRSYW5nZSgpO2lbMF1bbl09e2RhdGFab29tSWQ6bixzdGFydDpzWzBdLGVuZDpzWzFdfX19fSksaS5wdXNoKGUpfSxwb3A6ZnVuY3Rpb24odCl7dmFyIGU9bih0KSxpPWVbZS5sZW5ndGgtMV07ZS5sZW5ndGg+MSYmZS5wb3AoKTt2YXIgYT17fTtyZXR1cm4gbyhpLGZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciB0PWVbbl1baV07aWYodCl7YVtpXT10O2JyZWFrfX19KSxhfSxjbGVhcjpmdW5jdGlvbih0KXt0W3JdPW51bGx9LGNvdW50OmZ1bmN0aW9uKHQpe3JldHVybiBuKHQpLmxlbmd0aH19O3QuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsaSl7aSgxMykucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKCJkYXRhWm9vbSIsZnVuY3Rpb24oKXtyZXR1cm4ic2xpZGVyIn0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtWLmNhbGwodGhpcyksdGhpcy5fenI9dCx0aGlzLmdyb3VwPW5ldyBHLkdyb3VwLHRoaXMuX2JydXNoVHlwZSx0aGlzLl9icnVzaE9wdGlvbix0aGlzLl9wYW5lbHMsdGhpcy5fdHJhY2s9W10sdGhpcy5fZHJhZ2dpbmcsdGhpcy5fY292ZXJzPVtdLHRoaXMuX2NyZWF0aW5nQ292ZXIsdGhpcy5fY3JlYXRpbmdQYW5lbCx0aGlzLl9lbmFibGVHbG9iYWxQYW4sdGhpcy5fdWlkPSJicnVzaENvbnRyb2xsZXJfIitpdCsrLHRoaXMuX2hhbmRsZXJzPXt9LFoobnQsZnVuY3Rpb24odCxlKXt0aGlzLl9oYW5kbGVyc1tlXT1CLmJpbmQodCx0aGlzKX0sdGhpcyl9ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPXQuX3pyO3QuX2VuYWJsZUdsb2JhbFBhbnx8SC50YWtlKGksSix0Ll91aWQpLFoodC5faGFuZGxlcnMsZnVuY3Rpb24odCxlKXtpLm9uKGUsdCl9KSx0Ll9icnVzaFR5cGU9ZS5icnVzaFR5cGUsdC5fYnJ1c2hPcHRpb249Qi5tZXJnZShCLmNsb25lKGV0KSxlLCEwKX1mdW5jdGlvbiBvKHQpe3ZhciBlPXQuX3pyO0gucmVsZWFzZShlLEosdC5fdWlkKSxaKHQuX2hhbmRsZXJzLGZ1bmN0aW9uKHQsaSl7ZS5vZmYoaSx0KX0pLHQuX2JydXNoVHlwZT10Ll9icnVzaE9wdGlvbj1udWxsfWZ1bmN0aW9uIHIodCxlKXt2YXIgaT1hdFtlLmJydXNoVHlwZV0uY3JlYXRlQ292ZXIodCxlKTtyZXR1cm4gaS5fX2JydXNoT3B0aW9uPWUsdShpLGUpLHQuZ3JvdXAuYWRkKGkpLGl9ZnVuY3Rpb24gcyh0LGUpe3ZhciBpPWMoZSk7cmV0dXJuIGkuZW5kQ3JlYXRpbmcmJihpLmVuZENyZWF0aW5nKHQsZSksdShlLGUuX19icnVzaE9wdGlvbikpLGV9ZnVuY3Rpb24gbCh0LGUpe3ZhciBpPWUuX19icnVzaE9wdGlvbjtjKGUpLnVwZGF0ZUNvdmVyU2hhcGUodCxlLGkucmFuZ2UsaSl9ZnVuY3Rpb24gdSh0LGUpe3ZhciBpPWUuejtudWxsPT1pJiYoaT1ZKSx0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3Quej1pLHQuejI9aX0pfWZ1bmN0aW9uIGgodCxlKXtjKGUpLnVwZGF0ZUNvbW1vbih0LGUpLGwodCxlKX1mdW5jdGlvbiBjKHQpe3JldHVybiBhdFt0Ll9fYnJ1c2hPcHRpb24uYnJ1c2hUeXBlXX1mdW5jdGlvbiBkKHQsZSxpKXt2YXIgbj10Ll9wYW5lbHM7aWYoIW4pcmV0dXJuITA7dmFyIGEsbz10Ll90cmFuc2Zvcm07cmV0dXJuIFoobixmdW5jdGlvbih0KXt0LmlzVGFyZ2V0QnlDdXJzb3IoZSxpLG8pJiYoYT10KX0pLGF9ZnVuY3Rpb24gZih0LGUpe3ZhciBpPXQuX3BhbmVscztpZighaSlyZXR1cm4hMDt2YXIgbj1lLl9fYnJ1c2hPcHRpb24ucGFuZWxJZDtyZXR1cm4gbnVsbD09bnx8aVtuXX1mdW5jdGlvbiBwKHQpe3ZhciBlPXQuX2NvdmVycyxpPWUubGVuZ3RoO3JldHVybiBaKGUsZnVuY3Rpb24oZSl7dC5ncm91cC5yZW1vdmUoZSl9LHQpLGUubGVuZ3RoPTAsISFpfWZ1bmN0aW9uIGcodCxlKXt2YXIgaT1xKHQuX2NvdmVycyxmdW5jdGlvbih0KXt2YXIgZT10Ll9fYnJ1c2hPcHRpb24saT1CLmNsb25lKGUucmFuZ2UpO3JldHVybnticnVzaFR5cGU6ZS5icnVzaFR5cGUscGFuZWxJZDplLnBhbmVsSWQscmFuZ2U6aX19KTt0LnRyaWdnZXIoImJydXNoIixpLHtpc0VuZDohIWUuaXNFbmQscmVtb3ZlT25DbGljazohIWUucmVtb3ZlT25DbGlja30pfWZ1bmN0aW9uIG0odCl7dmFyIGU9dC5fdHJhY2s7aWYoIWUubGVuZ3RoKXJldHVybiExO3ZhciBpPWVbZS5sZW5ndGgtMV0sbj1lWzBdLGE9aVswXS1uWzBdLG89aVsxXS1uWzFdLHI9WChhKmErbypvLC41KTtyZXR1cm4gcj4kfWZ1bmN0aW9uIHYodCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZTwwJiYoZT0wKSxbdFswXSx0W2VdXX1mdW5jdGlvbiB5KHQsZSxpLG4pe3ZhciBhPW5ldyBHLkdyb3VwO3JldHVybiBhLmFkZChuZXcgRy5SZWN0KHtuYW1lOiJtYWluIixzdHlsZTp3KGkpLHNpbGVudDohMCxkcmFnZ2FibGU6ITAsY3Vyc29yOiJtb3ZlIixkcmlmdDpGKHQsZSxhLCJuc3dlIiksb25kcmFnZW5kOkYoZyxlLHtpc0VuZDohMH0pfSkpLFoobixmdW5jdGlvbihpKXthLmFkZChuZXcgRy5SZWN0KHtuYW1lOmksc3R5bGU6e29wYWNpdHk6MH0sZHJhZ2dhYmxlOiEwLHNpbGVudDohMCxpbnZpc2libGU6ITAsZHJpZnQ6Rih0LGUsYSxpKSxvbmRyYWdlbmQ6RihnLGUse2lzRW5kOiEwfSl9KSl9KSxhfWZ1bmN0aW9uIHgodCxlLGksbil7dmFyIGE9bi5icnVzaFN0eWxlLmxpbmVXaWR0aHx8MCxvPVUoYSxLKSxyPWlbMF1bMF0scz1pWzFdWzBdLGw9ci1hLzIsdT1zLWEvMixoPWlbMF1bMV0sYz1pWzFdWzFdLGQ9aC1vK2EvMixmPWMtbythLzIscD1oLXIsZz1jLXMsbT1wK2Esdj1nK2E7Yih0LGUsIm1haW4iLHIscyxwLGcpLG4udHJhbnNmb3JtYWJsZSYmKGIodCxlLCJ3IixsLHUsbyx2KSxiKHQsZSwiZSIsZCx1LG8sdiksYih0LGUsIm4iLGwsdSxtLG8pLGIodCxlLCJzIixsLGYsbSxvKSxiKHQsZSwibnciLGwsdSxvLG8pLGIodCxlLCJuZSIsZCx1LG8sbyksYih0LGUsInN3IixsLGYsbyxvKSxiKHQsZSwic2UiLGQsZixvLG8pKX1mdW5jdGlvbiBfKHQsZSl7dmFyIGk9ZS5fX2JydXNoT3B0aW9uLG49aS50cmFuc2Zvcm1hYmxlLGE9ZS5jaGlsZEF0KDApO2EudXNlU3R5bGUodyhpKSksYS5hdHRyKHtzaWxlbnQ6IW4sY3Vyc29yOm4/Im1vdmUiOiJkZWZhdWx0In0pLFooWyJ3IiwiZSIsIm4iLCJzIiwic2UiLCJzdyIsIm5lIiwibnciXSxmdW5jdGlvbihpKXt2YXIgYT1lLmNoaWxkT2ZOYW1lKGkpLG89SSh0LGkpO2EmJmEuYXR0cih7c2lsZW50OiFuLGludmlzaWJsZTohbixjdXJzb3I6bj90dFtvXSsiLXJlc2l6ZSI6bnVsbH0pfSl9ZnVuY3Rpb24gYih0LGUsaSxuLGEsbyxyKXt2YXIgcz1lLmNoaWxkT2ZOYW1lKGkpO3MmJnMuc2V0U2hhcGUoRChMKHQsZSxbW24sYV0sW24rbyxhK3JdXSkpKX1mdW5jdGlvbiB3KHQpe3JldHVybiBCLmRlZmF1bHRzKHtzdHJva2VOb1NjYWxlOiEwfSx0LmJydXNoU3R5bGUpfWZ1bmN0aW9uIFModCxlLGksbil7dmFyIGE9W2oodCxpKSxqKGUsbildLG89W1UodCxpKSxVKGUsbildO3JldHVybltbYVswXSxvWzBdXSxbYVsxXSxvWzFdXV19ZnVuY3Rpb24gTSh0KXtyZXR1cm4gRy5nZXRUcmFuc2Zvcm0odC5ncm91cCl9ZnVuY3Rpb24gSSh0LGUpe2lmKGUubGVuZ3RoPjEpe2U9ZS5zcGxpdCgiIik7dmFyIGk9W0kodCxlWzBdKSxJKHQsZVsxXSldO3JldHVybigiZSI9PT1pWzBdfHwidyI9PT1pWzBdKSYmaS5yZXZlcnNlKCksaS5qb2luKCIiKX12YXIgbj17dzoibGVmdCIsZToicmlnaHQiLG46InRvcCIsczoiYm90dG9tIn0sYT17bGVmdDoidyIscmlnaHQ6ImUiLHRvcDoibiIsYm90dG9tOiJzIn0saT1HLnRyYW5zZm9ybURpcmVjdGlvbihuW2VdLE0odCkpO3JldHVybiBhW2ldfWZ1bmN0aW9uIFQodCxlLGksbixhLG8scixzKXt2YXIgbD1uLl9fYnJ1c2hPcHRpb24sdT10KGwucmFuZ2UpLGM9QyhpLG8scik7WihhLnNwbGl0KCIiKSxmdW5jdGlvbih0KXt2YXIgZT1RW3RdO3VbZVswXV1bZVsxXV0rPWNbZVswXV19KSxsLnJhbmdlPWUoUyh1WzBdWzBdLHVbMV1bMF0sdVswXVsxXSx1WzFdWzFdKSksaChpLG4pLGcoaSx7aXNFbmQ6ITF9KX1mdW5jdGlvbiBBKHQsZSxpLG4sYSl7dmFyIG89ZS5fX2JydXNoT3B0aW9uLnJhbmdlLHI9Qyh0LGksbik7WihvLGZ1bmN0aW9uKHQpe3RbMF0rPXJbMF0sdFsxXSs9clsxXX0pLGgodCxlKSxnKHQse2lzRW5kOiExfSl9ZnVuY3Rpb24gQyh0LGUsaSl7dmFyIG49dC5ncm91cCxhPW4udHJhbnNmb3JtQ29vcmRUb0xvY2FsKGUsaSksbz1uLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCgwLDApO3JldHVyblthWzBdLW9bMF0sYVsxXS1vWzFdXX1mdW5jdGlvbiBMKHQsZSxpKXt2YXIgbj1mKHQsZSk7cmV0dXJuIG4mJm4hPT0hMD9uLmNsaXBQYXRoKGksdC5fdHJhbnNmb3JtKTpCLmNsb25lKGkpfWZ1bmN0aW9uIEQodCl7dmFyIGU9aih0WzBdWzBdLHRbMV1bMF0pLGk9aih0WzBdWzFdLHRbMV1bMV0pLG49VSh0WzBdWzBdLHRbMV1bMF0pLGE9VSh0WzBdWzFdLHRbMV1bMV0pO3JldHVybnt4OmUseTppLHdpZHRoOm4tZSxoZWlnaHQ6YS1pfX1mdW5jdGlvbiBQKHQsZSxpKXtpZih0Ll9icnVzaFR5cGUpe3ZhciBuPXQuX3pyLGE9dC5fY292ZXJzLG89ZCh0LGUsaSk7aWYoIXQuX2RyYWdnaW5nKWZvcih2YXIgcj0wO3I8YS5sZW5ndGg7cisrKXt2YXIgcz1hW3JdLl9fYnJ1c2hPcHRpb247aWYobyYmKG89PT0hMHx8cy5wYW5lbElkPT09by5wYW5lbElkKSYmYXRbcy5icnVzaFR5cGVdLmNvbnRhaW4oYVtyXSxpWzBdLGlbMV0pKXJldHVybn1vJiZuLnNldEN1cnNvclN0eWxlKCJjcm9zc2hhaXIiKX19ZnVuY3Rpb24gayh0KXt2YXIgZT10LmV2ZW50O2UucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBPKHQsZSxpKXtyZXR1cm4gdC5jaGlsZE9mTmFtZSgibWFpbiIpLmNvbnRhaW4oZSxpKX1mdW5jdGlvbiB6KHQsZSxpLG4pe3ZhciBhLG89dC5fY3JlYXRpbmdDb3Zlcix1PXQuX2NyZWF0aW5nUGFuZWwsaD10Ll9icnVzaE9wdGlvbjtpZih0Ll90cmFjay5wdXNoKGkuc2xpY2UoKSksbSh0KXx8byl7aWYodSYmIW8peyJzaW5nbGUiPT09aC5icnVzaE1vZGUmJnAodCk7dmFyIGM9Qi5jbG9uZShoKTtjLmJydXNoVHlwZT1SKGMuYnJ1c2hUeXBlLHUpLGMucGFuZWxJZD11PT09ITA/bnVsbDp1LnBhbmVsSWQsbz10Ll9jcmVhdGluZ0NvdmVyPXIodCxjKSx0Ll9jb3ZlcnMucHVzaChvKX1pZihvKXt2YXIgZj1hdFtSKHQuX2JydXNoVHlwZSx1KV0sZz1vLl9fYnJ1c2hPcHRpb247Zy5yYW5nZT1mLmdldENyZWF0aW5nUmFuZ2UoTCh0LG8sdC5fdHJhY2spKSxuJiYocyh0LG8pLGYudXBkYXRlQ29tbW9uKHQsbykpLGwodCxvKSxhPXtpc0VuZDpufX19ZWxzZSBuJiYic2luZ2xlIj09PWguYnJ1c2hNb2RlJiZoLnJlbW92ZU9uQ2xpY2smJmQodCxlLGkpJiZwKHQpJiYoYT17aXNFbmQ6bixyZW1vdmVPbkNsaWNrOiEwfSk7cmV0dXJuIGF9ZnVuY3Rpb24gUih0LGUpe3JldHVybiJhdXRvIj09PXQ/ZS5kZWZhdWx0QnJ1c2hUeXBlOnR9ZnVuY3Rpb24gRSh0KXtpZih0aGlzLl9kcmFnZ2luZyl7ayh0KTt2YXIgZT10aGlzLmdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0Lm9mZnNldFgsdC5vZmZzZXRZKSxpPXoodGhpcyx0LGUsITApO3RoaXMuX2RyYWdnaW5nPSExLHRoaXMuX3RyYWNrPVtdLHRoaXMuX2NyZWF0aW5nQ292ZXI9bnVsbCxpJiZnKHRoaXMsaSl9fWZ1bmN0aW9uIE4odCl7cmV0dXJue2NyZWF0ZUNvdmVyOmZ1bmN0aW9uKGUsaSl7cmV0dXJuIHkoRihULGZ1bmN0aW9uKGUpe3ZhciBpPVtlLFswLDEwMF1dO3JldHVybiB0JiZpLnJldmVyc2UoKSxpfSxmdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0pLGUsaSxbWyJ3IiwiZSJdLFsibiIsInMiXV1bdF0pfSxnZXRDcmVhdGluZ1JhbmdlOmZ1bmN0aW9uKGUpe3ZhciBpPXYoZSksbj1qKGlbMF1bdF0saVsxXVt0XSksYT1VKGlbMF1bdF0saVsxXVt0XSk7cmV0dXJuW24sYV19LHVwZGF0ZUNvdmVyU2hhcGU6ZnVuY3Rpb24oZSxpLG4sYSl7dmFyIG8scj1mKGUsaSk7aWYociE9PSEwJiZyLmdldExpbmVhckJydXNoT3RoZXJFeHRlbnQpbz1yLmdldExpbmVhckJydXNoT3RoZXJFeHRlbnQodCxlLl90cmFuc2Zvcm0pO2Vsc2V7dmFyIHM9ZS5fenI7bz1bMCxbcy5nZXRXaWR0aCgpLHMuZ2V0SGVpZ2h0KCldWzEtdF1dfXZhciBsPVtuLG9dO3QmJmwucmV2ZXJzZSgpLHgoZSxpLGwsYSl9LHVwZGF0ZUNvbW1vbjpfLGNvbnRhaW46T319dmFyIFY9aSgyMyksQj1pKDEpLEc9aSgzKSxIPWkoMTM0KSxXPWkoNDMpLEY9Qi5jdXJyeSxaPUIuZWFjaCxxPUIubWFwLGo9TWF0aC5taW4sVT1NYXRoLm1heCxYPU1hdGgucG93LFk9MWU0LCQ9NixLPTYsSj0iZ2xvYmFsUGFuIixRPXt3OlswLDBdLGU6WzAsMV0sbjpbMSwwXSxzOlsxLDFdfSx0dD17dzoiZXciLGU6ImV3IixuOiJucyIsczoibnMiLG5lOiJuZXN3IixzdzoibmVzdyIsbnc6Im53c2UiLHNlOiJud3NlIn0sZXQ9e2JydXNoU3R5bGU6e2xpbmVXaWR0aDoyLHN0cm9rZToicmdiYSgwLDAsMCwwLjMpIixmaWxsOiJyZ2JhKDAsMCwwLDAuMSkifSx0cmFuc2Zvcm1hYmxlOiEwLGJydXNoTW9kZToic2luZ2xlIixyZW1vdmVPbkNsaWNrOiExfSxpdD0wO24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLGVuYWJsZUJydXNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9icnVzaFR5cGUmJm8odGhpcyksdC5icnVzaFR5cGUmJmEodGhpcyx0KSx0aGlzfSxzZXRQYW5lbHM6ZnVuY3Rpb24odCl7aWYodCYmdC5sZW5ndGgpe3ZhciBlPXRoaXMuX3BhbmVscz17fTtCLmVhY2godCxmdW5jdGlvbih0KXtlW3QucGFuZWxJZF09Qi5jbG9uZSh0KX0pfWVsc2UgdGhpcy5fcGFuZWxzPW51bGw7cmV0dXJuIHRoaXN9LG1vdW50OmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5fZW5hYmxlR2xvYmFsUGFuPXQuZW5hYmxlR2xvYmFsUGFuO3ZhciBlPXRoaXMuZ3JvdXA7cmV0dXJuIHRoaXMuX3pyLmFkZChlKSxlLmF0dHIoe3Bvc2l0aW9uOnQucG9zaXRpb258fFswLDBdLHJvdGF0aW9uOnQucm90YXRpb258fDAsc2NhbGU6dC5zY2FsZXx8WzEsMV19KSx0aGlzLl90cmFuc2Zvcm09ZS5nZXRMb2NhbFRyYW5zZm9ybSgpLHRoaXN9LGVhY2hDb3ZlcjpmdW5jdGlvbih0LGUpe1oodGhpcy5fY292ZXJzLHQsZSl9LHVwZGF0ZUNvdmVyczpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuKG51bGwhPXQuaWQ/dC5pZDpvK2UpKyItIit0LmJydXNoVHlwZX1mdW5jdGlvbiBpKHQsaSl7cmV0dXJuIGUodC5fX2JydXNoT3B0aW9uLGkpfWZ1bmN0aW9uIG4oZSxpKXt2YXIgbj10W2VdO2lmKG51bGwhPWkmJmxbaV09PT1kKXVbZV09bFtpXTtlbHNle3ZhciBhPXVbZV09bnVsbCE9aT8obFtpXS5fX2JydXNoT3B0aW9uPW4sbFtpXSk6cyhjLHIoYyxuKSk7aChjLGEpfX1mdW5jdGlvbiBhKHQpe2xbdF0hPT1kJiZjLmdyb3VwLnJlbW92ZShsW3RdKX10PUIubWFwKHQsZnVuY3Rpb24odCl7cmV0dXJuIEIubWVyZ2UoQi5jbG9uZShldCksdCwhMCl9KTt2YXIgbz0iXDAtYnJ1c2gtaW5kZXgtIixsPXRoaXMuX2NvdmVycyx1PXRoaXMuX2NvdmVycz1bXSxjPXRoaXMsZD10aGlzLl9jcmVhdGluZ0NvdmVyO3JldHVybiBuZXcgVyhsLHQsaSxlKS5hZGQobikudXBkYXRlKG4pLnJlbW92ZShhKS5leGVjdXRlKCksdGhpc30sdW5tb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuYWJsZUJydXNoKCExKSxwKHRoaXMpLHRoaXMuX3pyLnJlbW92ZSh0aGlzLmdyb3VwKSx0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy51bm1vdW50KCksdGhpcy5vZmYoKX19LEIubWl4aW4obixWKTt2YXIgbnQ9e21vdXNlZG93bjpmdW5jdGlvbih0KXtpZih0aGlzLl9kcmFnZ2luZylFLmNhbGwodGhpcyx0KTtlbHNlIGlmKCF0LnRhcmdldHx8IXQudGFyZ2V0LmRyYWdnYWJsZSl7ayh0KTt2YXIgZT10aGlzLmdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0Lm9mZnNldFgsdC5vZmZzZXRZKTt0aGlzLl9jcmVhdGluZ0NvdmVyPW51bGw7dmFyIGk9dGhpcy5fY3JlYXRpbmdQYW5lbD1kKHRoaXMsdCxlKTtpJiYodGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fdHJhY2s9W2Uuc2xpY2UoKV0pfX0sbW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXAudHJhbnNmb3JtQ29vcmRUb0xvY2FsKHQub2Zmc2V0WCx0Lm9mZnNldFkpO2lmKFAodGhpcyx0LGUpLHRoaXMuX2RyYWdnaW5nKXtrKHQpO3ZhciBpPXoodGhpcyx0LGUsITEpO2kmJmcodGhpcyxpKX19LG1vdXNldXA6RX0sYXQ9e2xpbmVYOk4oMCksbGluZVk6TigxKSxyZWN0OntjcmVhdGVDb3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB5KEYoVCxmdW5jdGlvbih0KXtyZXR1cm4gdH0sZnVuY3Rpb24odCl7cmV0dXJuIHR9KSx0LGUsWyJ3IiwiZSIsIm4iLCJzIiwic2UiLCJzdyIsIm5lIiwibnciXSl9LGdldENyZWF0aW5nUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dih0KTtyZXR1cm4gUyhlWzFdWzBdLGVbMV1bMV0sZVswXVswXSxlWzBdWzFdKX0sdXBkYXRlQ292ZXJTaGFwZTpmdW5jdGlvbih0LGUsaSxuKXt4KHQsZSxpLG4pfSx1cGRhdGVDb21tb246Xyxjb250YWluOk99LHBvbHlnb246e2NyZWF0ZUNvdmVyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IEcuR3JvdXA7cmV0dXJuIGkuYWRkKG5ldyBHLlBvbHlsaW5lKHtuYW1lOiJtYWluIixzdHlsZTp3KGUpLHNpbGVudDohMH0pKSxpfSxnZXRDcmVhdGluZ1JhbmdlOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxlbmRDcmVhdGluZzpmdW5jdGlvbih0LGUpe2UucmVtb3ZlKGUuY2hpbGRBdCgwKSksZS5hZGQobmV3IEcuUG9seWdvbih7bmFtZToibWFpbiIsZHJhZ2dhYmxlOiEwLGRyaWZ0OkYoQSx0LGUpLG9uZHJhZ2VuZDpGKGcsdCx7aXNFbmQ6ITB9KX0pKX0sdXBkYXRlQ292ZXJTaGFwZTpmdW5jdGlvbih0LGUsaSxuKXtlLmNoaWxkQXQoMCkuc2V0U2hhcGUoe3BvaW50czpMKHQsZSxpKX0pfSx1cGRhdGVDb21tb246Xyxjb250YWluOk99fTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgaT17fSxuPXtheGlzUG9pbnRlcjoxLHRvb2x0aXA6MSxicnVzaDoxfTtpLm9uSXJyZWxldmFudEVsZW1lbnQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBhPWUuZ2V0Q29tcG9uZW50QnlFbGVtZW50KHQudG9wVGFyZ2V0KSxvPWEmJmEuY29vcmRpbmF0ZVN5c3RlbTtyZXR1cm4gYSYmYSE9PWkmJiFuW2EubWFpblR5cGVdJiZvJiZvLm1vZGVsIT09aX0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0W2FdfHwodFthXT17fSl9dmFyIGE9IlwwX2VjX2ludGVyYWN0aW9uX211dGV4IixvPXt0YWtlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgYT1uKHQpO2FbZV09aX0scmVsZWFzZTpmdW5jdGlvbih0LGUsaSl7dmFyIGE9bih0KSxvPWFbZV07bz09PWkmJihhW2VdPW51bGwpfSxpc1Rha2VuOmZ1bmN0aW9uKHQsZSl7cmV0dXJuISFuKHQpW2VdfX07aSgyKS5yZWdpc3RlckFjdGlvbih7dHlwZToidGFrZUdsb2JhbEN1cnNvciIsZXZlbnQ6Imdsb2JhbEN1cnNvclRha2VuIix1cGRhdGU6InVwZGF0ZSJ9LGZ1bmN0aW9uKCl7fSksdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDkpLGE9aSg3KSxvPWkoMyk7dC5leHBvcnRzPXtsYXlvdXQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBhPWUuZ2V0Qm94TGF5b3V0UGFyYW1zKCksbz1lLmdldCgicGFkZGluZyIpLHI9e3dpZHRoOmkuZ2V0V2lkdGgoKSxoZWlnaHQ6aS5nZXRIZWlnaHQoKX0scz1uLmdldExheW91dFJlY3QoYSxyLG8pO24uYm94KGUuZ2V0KCJvcmllbnQiKSx0LGUuZ2V0KCJpdGVtR2FwIikscy53aWR0aCxzLmhlaWdodCksbi5wb3NpdGlvbkVsZW1lbnQodCxhLHIsbyl9LG1ha2VCYWNrZ3JvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YS5ub3JtYWxpemVDc3NBcnJheShlLmdldCgicGFkZGluZyIpKSxuPWUuZ2V0SXRlbVN0eWxlKFsiY29sb3IiLCJvcGFjaXR5Il0pO24uZmlsbD1lLmdldCgiYmFja2dyb3VuZENvbG9yIik7dmFyIHQ9bmV3IG8uUmVjdCh7c2hhcGU6e3g6dC54LWlbM10seTp0LnktaVswXSx3aWR0aDp0LndpZHRoK2lbMV0raVszXSxoZWlnaHQ6dC5oZWlnaHQraVswXStpWzJdLHI6ZS5nZXQoImJvcmRlclJhZGl1cyIpfSxzdHlsZTpuLHNpbGVudDohMCx6MjotMX0pO3JldHVybiB0fX19LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgxKSxhPWkoMTEpLG89aSgyKS5leHRlbmRDb21wb25lbnRNb2RlbCh7dHlwZToibGVnZW5kLnBsYWluIixkZXBlbmRlbmNpZXM6WyJzZXJpZXMiXSxsYXlvdXRNb2RlOnt0eXBlOiJib3giLGlnbm9yZVNpemU6ITB9LGluaXQ6ZnVuY3Rpb24odCxlLGkpe3RoaXMubWVyZ2VEZWZhdWx0QW5kVGhlbWUodCxpKSx0LnNlbGVjdGVkPXQuc2VsZWN0ZWR8fHt9fSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0KXtvLnN1cGVyQ2FsbCh0aGlzLCJtZXJnZU9wdGlvbiIsdCl9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVEYXRhKHRoaXMuZWNNb2RlbCk7dmFyIHQ9dGhpcy5fZGF0YTtpZih0WzBdJiYic2luZ2xlIj09PXRoaXMuZ2V0KCJzZWxlY3RlZE1vZGUiKSl7Zm9yKHZhciBlPSExLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG49dFtpXS5nZXQoIm5hbWUiKTtpZih0aGlzLmlzU2VsZWN0ZWQobikpe3RoaXMuc2VsZWN0KG4pLGU9ITA7YnJlYWt9fSFlJiZ0aGlzLnNlbGVjdCh0WzBdLmdldCgibmFtZSIpKX19LF91cGRhdGVEYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPW4ubWFwKHRoaXMuZ2V0KCJkYXRhIil8fFtdLGZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0fHwodD17bmFtZTp0fSksbmV3IGEodCx0aGlzLHRoaXMuZWNNb2RlbCl9LHRoaXMpO3RoaXMuX2RhdGE9ZTt2YXIgaT1uLm1hcCh0LmdldFNlcmllcygpLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWV9KTt0LmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7aWYodC5sZWdlbmREYXRhUHJvdmlkZXIpe3ZhciBlPXQubGVnZW5kRGF0YVByb3ZpZGVyKCk7aT1pLmNvbmNhdChlLm1hcEFycmF5KGUuZ2V0TmFtZSkpfX0pLHRoaXMuX2F2YWlsYWJsZU5hbWVzPWl9LGdldERhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sc2VsZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkLGk9dGhpcy5nZXQoInNlbGVjdGVkTW9kZSIpO2lmKCJzaW5nbGUiPT09aSl7dmFyIGE9dGhpcy5fZGF0YTtuLmVhY2goYSxmdW5jdGlvbih0KXtlW3QuZ2V0KCJuYW1lIildPSExfSl9ZVt0XT0hMH0sdW5TZWxlY3Q6ZnVuY3Rpb24odCl7InNpbmdsZSIhPT10aGlzLmdldCgic2VsZWN0ZWRNb2RlIikmJih0aGlzLm9wdGlvbi5zZWxlY3RlZFt0XT0hMSl9LHRvZ2dsZVNlbGVjdGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9uLnNlbGVjdGVkO2UuaGFzT3duUHJvcGVydHkodCl8fChlW3RdPSEwKSx0aGlzW2VbdF0/InVuU2VsZWN0Ijoic2VsZWN0Il0odCl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24uc2VsZWN0ZWQ7cmV0dXJuIShlLmhhc093blByb3BlcnR5KHQpJiYhZVt0XSkmJm4uaW5kZXhPZih0aGlzLl9hdmFpbGFibGVOYW1lcyx0KT49MH0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo0LHNob3c6ITAsb3JpZW50OiJob3Jpem9udGFsIixsZWZ0OiJjZW50ZXIiLHRvcDowLGFsaWduOiJhdXRvIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJvcmRlckNvbG9yOiIjY2NjIixib3JkZXJSYWRpdXM6MCxib3JkZXJXaWR0aDowLHBhZGRpbmc6NSxpdGVtR2FwOjEwLGl0ZW1XaWR0aDoyNSxpdGVtSGVpZ2h0OjE0LGluYWN0aXZlQ29sb3I6IiNjY2MiLHRleHRTdHlsZTp7Y29sb3I6IiMzMzMifSxzZWxlY3RlZE1vZGU6ITAsdG9vbHRpcDp7c2hvdzohMX19fSk7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7ZS5kaXNwYXRjaEFjdGlvbih7dHlwZToibGVnZW5kVG9nZ2xlU2VsZWN0IixuYW1lOnR9KX1mdW5jdGlvbiBhKHQsZSxpKXt2YXIgbj1pLmdldFpyKCkuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCgpWzBdO24mJm4udXNlSG92ZXJMYXllcnx8dC5nZXQoImxlZ2VuZEhvdmVyTGluayIpJiZpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJoaWdobGlnaHQiLHNlcmllc05hbWU6dC5uYW1lLG5hbWU6ZX0pfWZ1bmN0aW9uIG8odCxlLGkpe3ZhciBuPWkuZ2V0WnIoKS5zdG9yYWdlLmdldERpc3BsYXlMaXN0KClbMF07biYmbi51c2VIb3ZlckxheWVyfHx0LmdldCgibGVnZW5kSG92ZXJMaW5rIikmJmkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImRvd25wbGF5IixzZXJpZXNOYW1lOnQubmFtZSxuYW1lOmV9KX12YXIgcj1pKDEpLHM9aSgyNCksbD1pKDMpLHU9aSgxMzUpLGg9aSg5KSxjPXIuY3VycnksZD1yLmVhY2gsZj1sLkdyb3VwO3QuZXhwb3J0cz1pKDIpLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6ImxlZ2VuZC5wbGFpbiIsbmV3bGluZURpc2FibGVkOiExLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLmFkZCh0aGlzLl9jb250ZW50R3JvdXA9bmV3IGYpLHRoaXMuX2JhY2tncm91bmRFbH0sZ2V0Q29udGVudEdyb3VwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRHcm91cH0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLnJlc2V0SW5uZXIoKSx0LmdldCgic2hvdyIsITApKXt2YXIgbj10LmdldCgiYWxpZ24iKTtuJiYiYXV0byIhPT1ufHwobj0icmlnaHQiPT09dC5nZXQoImxlZnQiKSYmInZlcnRpY2FsIj09PXQuZ2V0KCJvcmllbnQiKT8icmlnaHQiOiJsZWZ0IiksdGhpcy5yZW5kZXJJbm5lcihuLHQsZSxpKTt2YXIgYT10LmdldEJveExheW91dFBhcmFtcygpLG89e3dpZHRoOmkuZ2V0V2lkdGgoKSxoZWlnaHQ6aS5nZXRIZWlnaHQoKX0scz10LmdldCgicGFkZGluZyIpLGw9aC5nZXRMYXlvdXRSZWN0KGEsbyxzKSxjPXRoaXMubGF5b3V0SW5uZXIodCxuLGwpLGQ9aC5nZXRMYXlvdXRSZWN0KHIuZGVmYXVsdHMoe3dpZHRoOmMud2lkdGgsaGVpZ2h0OmMuaGVpZ2h0fSxhKSxvLHMpO3RoaXMuZ3JvdXAuYXR0cigicG9zaXRpb24iLFtkLngtYy54LGQueS1jLnldKSx0aGlzLmdyb3VwLmFkZCh0aGlzLl9iYWNrZ3JvdW5kRWw9dS5tYWtlQmFja2dyb3VuZChjLHQpKX19LHJlc2V0SW5uZXI6ZnVuY3Rpb24oKXt0aGlzLmdldENvbnRlbnRHcm91cCgpLnJlbW92ZUFsbCgpLHRoaXMuX2JhY2tncm91bmRFbCYmdGhpcy5ncm91cC5yZW1vdmUodGhpcy5fYmFja2dyb3VuZEVsKX0scmVuZGVySW5uZXI6ZnVuY3Rpb24odCxlLGkscyl7dmFyIGw9dGhpcy5nZXRDb250ZW50R3JvdXAoKSx1PXIuY3JlYXRlSGFzaE1hcCgpLGg9ZS5nZXQoInNlbGVjdGVkTW9kZSIpO2QoZS5nZXREYXRhKCksZnVuY3Rpb24ocixkKXt2YXIgcD1yLmdldCgibmFtZSIpO2lmKCF0aGlzLm5ld2xpbmVEaXNhYmxlZCYmKCIiPT09cHx8IlxuIj09PXApKXJldHVybiB2b2lkIGwuYWRkKG5ldyBmKHtuZXdsaW5lOiEwfSkpO3ZhciBnPWkuZ2V0U2VyaWVzQnlOYW1lKHApWzBdO2lmKCF1LmdldChwKSlpZihnKXt2YXIgbT1nLmdldERhdGEoKSx2PW0uZ2V0VmlzdWFsKCJjb2xvciIpOyJmdW5jdGlvbiI9PXR5cGVvZiB2JiYodj12KGcuZ2V0RGF0YVBhcmFtcygwKSkpO3ZhciB5PW0uZ2V0VmlzdWFsKCJsZWdlbmRTeW1ib2wiKXx8InJvdW5kUmVjdCIseD1tLmdldFZpc3VhbCgic3ltYm9sIiksXz10aGlzLl9jcmVhdGVJdGVtKHAsZCxyLGUseSx4LHQsdixoKTtfLm9uKCJjbGljayIsYyhuLHAscykpLm9uKCJtb3VzZW92ZXIiLGMoYSxnLG51bGwscykpLm9uKCJtb3VzZW91dCIsYyhvLGcsbnVsbCxzKSksdS5zZXQocCwhMCl9ZWxzZSBpLmVhY2hSYXdTZXJpZXMoZnVuY3Rpb24oaSl7aWYoIXUuZ2V0KHApJiZpLmxlZ2VuZERhdGFQcm92aWRlcil7dmFyIGw9aS5sZWdlbmREYXRhUHJvdmlkZXIoKSxmPWwuaW5kZXhPZk5hbWUocCk7aWYoZjwwKXJldHVybjt2YXIgZz1sLmdldEl0ZW1WaXN1YWwoZiwiY29sb3IiKSxtPSJyb3VuZFJlY3QiLHY9dGhpcy5fY3JlYXRlSXRlbShwLGQscixlLG0sbnVsbCx0LGcsaCk7di5vbigiY2xpY2siLGMobixwLHMpKS5vbigibW91c2VvdmVyIixjKGEsaSxwLHMpKS5vbigibW91c2VvdXQiLGMobyxpLHAscykpLHUuc2V0KHAsITApfX0sdGhpcyl9LHRoaXMpfSxfY3JlYXRlSXRlbTpmdW5jdGlvbih0LGUsaSxuLGEsbyx1LGgsYyl7dmFyIGQ9bi5nZXQoIml0ZW1XaWR0aCIpLHA9bi5nZXQoIml0ZW1IZWlnaHQiKSxnPW4uZ2V0KCJpbmFjdGl2ZUNvbG9yIiksbT1uLmlzU2VsZWN0ZWQodCksdj1uZXcgZix5PWkuZ2V0TW9kZWwoInRleHRTdHlsZSIpLHg9aS5nZXQoImljb24iKSxfPWkuZ2V0TW9kZWwoInRvb2x0aXAiKSxiPV8ucGFyZW50TW9kZWw7aWYoYT14fHxhLHYuYWRkKHMuY3JlYXRlU3ltYm9sKGEsMCwwLGQscCxtP2g6ZykpLCF4JiZvJiYobyE9PWF8fCJub25lIj09bykpe3ZhciB3PS44KnA7Im5vbmUiPT09byYmKG89ImNpcmNsZSIpLHYuYWRkKHMuY3JlYXRlU3ltYm9sKG8sKGQtdykvMiwocC13KS8yLHcsdyxtP2g6ZykpfXZhciBTPSJsZWZ0Ij09PXU/ZCs1Oi01LE09dSxJPW4uZ2V0KCJmb3JtYXR0ZXIiKSxUPXQ7InN0cmluZyI9PXR5cGVvZiBJJiZJP1Q9SS5yZXBsYWNlKCJ7bmFtZX0iLG51bGwhPXQ/dDoiIik6ImZ1bmN0aW9uIj09dHlwZW9mIEkmJihUPUkodCkpLHYuYWRkKG5ldyBsLlRleHQoe3N0eWxlOmwuc2V0VGV4dFN0eWxlKHt9LHkse3RleHQ6VCx4OlMseTpwLzIsdGV4dEZpbGw6bT95LmdldFRleHRDb2xvcigpOmcsCnRleHRBbGlnbjpNLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUifSl9KSk7dmFyIEE9bmV3IGwuUmVjdCh7c2hhcGU6di5nZXRCb3VuZGluZ1JlY3QoKSxpbnZpc2libGU6ITAsdG9vbHRpcDpfLmdldCgic2hvdyIpP3IuZXh0ZW5kKHtjb250ZW50OnQsZm9ybWF0dGVyOmIuZ2V0KCJmb3JtYXR0ZXIiLCEwKXx8ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZm9ybWF0dGVyUGFyYW1zOntjb21wb25lbnRUeXBlOiJsZWdlbmQiLGxlZ2VuZEluZGV4Om4uY29tcG9uZW50SW5kZXgsbmFtZTp0LCR2YXJzOlsibmFtZSJdfX0sXy5vcHRpb24pOm51bGx9KTtyZXR1cm4gdi5hZGQoQSksdi5lYWNoQ2hpbGQoZnVuY3Rpb24odCl7dC5zaWxlbnQ9ITB9KSxBLnNpbGVudD0hYyx0aGlzLmdldENvbnRlbnRHcm91cCgpLmFkZCh2KSxsLnNldEhvdmVyU3R5bGUodiksdi5fX2xlZ2VuZERhdGFJbmRleD1lLHZ9LGxheW91dElubmVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLmdldENvbnRlbnRHcm91cCgpO2guYm94KHQuZ2V0KCJvcmllbnQiKSxuLHQuZ2V0KCJpdGVtR2FwIiksaS53aWR0aCxpLmhlaWdodCk7dmFyIGE9bi5nZXRCb3VuZGluZ1JlY3QoKTtyZXR1cm4gbi5hdHRyKCJwb3NpdGlvbiIsWy1hLngsLWEueV0pLHRoaXMuZ3JvdXAuZ2V0Qm91bmRpbmdSZWN0KCl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgzMyksbz1mdW5jdGlvbih0LGUsaSxuLG8pe2EuY2FsbCh0aGlzLHQsZSxpKSx0aGlzLnR5cGU9bnx8InZhbHVlIix0aGlzLnBvc2l0aW9uPW98fCJib3R0b20ifTtvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6byxpbmRleDowLG9uWmVybzohMSxtb2RlbDpudWxsLGlzSG9yaXpvbnRhbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zaXRpb247cmV0dXJuInRvcCI9PT10fHwiYm90dG9tIj09PXR9LGdldEdsb2JhbEV4dGVudDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEV4dGVudCgpO3JldHVybiBlWzBdPXRoaXMudG9HbG9iYWxDb29yZChlWzBdKSxlWzFdPXRoaXMudG9HbG9iYWxDb29yZChlWzFdKSx0JiZlWzBdPmVbMV0mJmUucmV2ZXJzZSgpLGV9LGdldE90aGVyQXhpczpmdW5jdGlvbigpe3RoaXMuZ3JpZC5nZXRPdGhlckF4aXMoKX0saXNMYWJlbElnbm9yZWQ6ZnVuY3Rpb24odCl7aWYoImNhdGVnb3J5Ij09PXRoaXMudHlwZSl7dmFyIGU9dGhpcy5nZXRMYWJlbEludGVydmFsKCk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiFlKHQsdGhpcy5zY2FsZS5nZXRMYWJlbCh0KSl8fHQlKGUrMSl9fSxwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvb3JkVG9EYXRhKHRoaXMudG9Mb2NhbENvb3JkKHRbIngiPT09dGhpcy5kaW0/MDoxXSksZSl9LHRvTG9jYWxDb29yZDpudWxsLHRvR2xvYmFsQ29vcmQ6bnVsbH0sbi5pbmhlcml0cyhvLGEpLHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHRoaXMuX2F4ZXNbdF19dmFyIGE9aSgxKSxvPWZ1bmN0aW9uKHQpe3RoaXMuX2F4ZXM9e30sdGhpcy5fZGltTGlzdD1bXSx0aGlzLm5hbWU9dHx8IiJ9O28ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvLHR5cGU6ImNhcnRlc2lhbiIsZ2V0QXhpczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXhlc1t0XX0sZ2V0QXhlczpmdW5jdGlvbigpe3JldHVybiBhLm1hcCh0aGlzLl9kaW1MaXN0LG4sdGhpcyl9LGdldEF4ZXNCeVNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0PXQudG9Mb3dlckNhc2UoKSxhLmZpbHRlcih0aGlzLmdldEF4ZXMoKSxmdW5jdGlvbihlKXtyZXR1cm4gZS5zY2FsZS50eXBlPT09dH0pfSxhZGRBeGlzOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGltO3RoaXMuX2F4ZXNbZV09dCx0aGlzLl9kaW1MaXN0LnB1c2goZSl9LGRhdGFUb0Nvb3JkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kYXRhQ29vcmRDb252ZXJ0KHQsImRhdGFUb0Nvb3JkIil9LGNvb3JkVG9EYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kYXRhQ29vcmRDb252ZXJ0KHQsImNvb3JkVG9EYXRhIil9LF9kYXRhQ29vcmRDb252ZXJ0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuX2RpbUxpc3Qsbj10IGluc3RhbmNlb2YgQXJyYXk/W106e30sYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgbz1pW2FdLHI9dGhpcy5fYXhlc1tvXTtuW29dPXJbZV0odFtvXSl9cmV0dXJuIG59fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe28uY2FsbCh0aGlzLHQpfXZhciBhPWkoMSksbz1pKDEzOSk7bi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm4sdHlwZToiY2FydGVzaWFuMmQiLGRpbWVuc2lvbnM6WyJ4IiwieSJdLGdldEJhc2VBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QXhlc0J5U2NhbGUoIm9yZGluYWwiKVswXXx8dGhpcy5nZXRBeGVzQnlTY2FsZSgidGltZSIpWzBdfHx0aGlzLmdldEF4aXMoIngiKX0sY29udGFpblBvaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QXhpcygieCIpLGk9dGhpcy5nZXRBeGlzKCJ5Iik7cmV0dXJuIGUuY29udGFpbihlLnRvTG9jYWxDb29yZCh0WzBdKSkmJmkuY29udGFpbihpLnRvTG9jYWxDb29yZCh0WzFdKSl9LGNvbnRhaW5EYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldEF4aXMoIngiKS5jb250YWluRGF0YSh0WzBdKSYmdGhpcy5nZXRBeGlzKCJ5IikuY29udGFpbkRhdGEodFsxXSl9LGRhdGFUb1BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRBeGlzKCJ4Iiksbj10aGlzLmdldEF4aXMoInkiKTtyZXR1cm5baS50b0dsb2JhbENvb3JkKGkuZGF0YVRvQ29vcmQodFswXSxlKSksbi50b0dsb2JhbENvb3JkKG4uZGF0YVRvQ29vcmQodFsxXSxlKSldfSxwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0QXhpcygieCIpLG49dGhpcy5nZXRBeGlzKCJ5Iik7cmV0dXJuW2kuY29vcmRUb0RhdGEoaS50b0xvY2FsQ29vcmQodFswXSksZSksbi5jb29yZFRvRGF0YShuLnRvTG9jYWxDb29yZCh0WzFdKSxlKV19LGdldE90aGVyQXhpczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRBeGlzKCJ4Ij09PXQuZGltPyJ5IjoieCIpfX0sYS5pbmhlcml0cyhuLG8pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2koNjMpO3ZhciBuPWkoMTMpO3QuZXhwb3J0cz1uLmV4dGVuZCh7dHlwZToiZ3JpZCIsZGVwZW5kZW5jaWVzOlsieEF4aXMiLCJ5QXhpcyJdLGxheW91dE1vZGU6ImJveCIsY29vcmRpbmF0ZVN5c3RlbTpudWxsLGRlZmF1bHRPcHRpb246e3Nob3c6ITEsemxldmVsOjAsejowLGxlZnQ6IjEwJSIsdG9wOjYwLHJpZ2h0OiIxMCUiLGJvdHRvbTo2MCxjb250YWluTGFiZWw6ITEsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiIjY2NjIn19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMjgpLGE9aSgyNCksbz1pKDE4KSxyPWkoNDIpLHM9aSgxMSksbD1pKDEpO3QuZXhwb3J0cz17Y3JlYXRlTGlzdDpmdW5jdGlvbih0KXt2YXIgZT10LmdldCgiZGF0YSIpO3JldHVybiBuKGUsdCx0LmVjTW9kZWwpfSxjb21wbGV0ZURpbWVuc2lvbnM6aSgyNSksY3JlYXRlU3ltYm9sOmEuY3JlYXRlU3ltYm9sLGNyZWF0ZVNjYWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZTtlIGluc3RhbmNlb2Ygc3x8KGk9bmV3IHMoZSksbC5taXhpbihpLHIpKTt2YXIgbj1vLmNyZWF0ZVNjYWxlQnlNb2RlbChpKTtyZXR1cm4gbi5zZXRFeHRlbnQodFswXSx0WzFdKSxvLm5pY2VTY2FsZUV4dGVudChuLGkpLG59LG1peGluQXhpc01vZGVsQ29tbW9uTWV0aG9kczpmdW5jdGlvbih0KXtsLm1peGluKHQscil9fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMyksYT1pKDEpLG89TWF0aC5QSTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlPWV8fHt9LGEuZGVmYXVsdHMoZSx7dGV4dDoibG9hZGluZyIsY29sb3I6IiNjMjM1MzEiLHRleHRDb2xvcjoiIzAwMCIsbWFza0NvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCkiLHpsZXZlbDowfSk7dmFyIGk9bmV3IG4uUmVjdCh7c3R5bGU6e2ZpbGw6ZS5tYXNrQ29sb3J9LHpsZXZlbDplLnpsZXZlbCx6OjFlNH0pLHI9bmV3IG4uQXJjKHtzaGFwZTp7c3RhcnRBbmdsZTotby8yLGVuZEFuZ2xlOi1vLzIrLjEscjoxMH0sc3R5bGU6e3N0cm9rZTplLmNvbG9yLGxpbmVDYXA6InJvdW5kIixsaW5lV2lkdGg6NX0semxldmVsOmUuemxldmVsLHo6MTAwMDF9KSxzPW5ldyBuLlJlY3Qoe3N0eWxlOntmaWxsOiJub25lIix0ZXh0OmUudGV4dCx0ZXh0UG9zaXRpb246InJpZ2h0Iix0ZXh0RGlzdGFuY2U6MTAsdGV4dEZpbGw6ZS50ZXh0Q29sb3J9LHpsZXZlbDplLnpsZXZlbCx6OjEwMDAxfSk7ci5hbmltYXRlU2hhcGUoITApLndoZW4oMWUzLHtlbmRBbmdsZTozKm8vMn0pLnN0YXJ0KCJjaXJjdWxhckluT3V0Iiksci5hbmltYXRlU2hhcGUoITApLndoZW4oMWUzLHtzdGFydEFuZ2xlOjMqby8yfSkuZGVsYXkoMzAwKS5zdGFydCgiY2lyY3VsYXJJbk91dCIpO3ZhciBsPW5ldyBuLkdyb3VwO3JldHVybiBsLmFkZChyKSxsLmFkZChzKSxsLmFkZChpKSxsLnJlc2l6ZT1mdW5jdGlvbigpe3ZhciBlPXQuZ2V0V2lkdGgoKS8yLG49dC5nZXRIZWlnaHQoKS8yO3Iuc2V0U2hhcGUoe2N4OmUsY3k6bn0pO3ZhciBhPXIuc2hhcGUucjtzLnNldFNoYXBlKHt4OmUtYSx5Om4tYSx3aWR0aDoyKmEsaGVpZ2h0OjIqYX0pLGkuc2V0U2hhcGUoe3g6MCx5OjAsd2lkdGg6dC5nZXRXaWR0aCgpLGhlaWdodDp0LmdldEhlaWdodCgpfSl9LGwucmVzaXplKCksbH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7aC5lYWNoKGUsZnVuY3Rpb24oZSxpKXt4Lmhhc0NsYXNzKGkpfHwoIm9iamVjdCI9PXR5cGVvZiBlP3RbaV09dFtpXT9oLm1lcmdlKHRbaV0sZSwhMSk6aC5jbG9uZShlKTpudWxsPT10W2ldJiYodFtpXT1lKSl9KX1mdW5jdGlvbiBhKHQpe3Q9dCx0aGlzLm9wdGlvbj17fSx0aGlzLm9wdGlvbltiXT0xLHRoaXMuX2NvbXBvbmVudHNNYXA9aC5jcmVhdGVIYXNoTWFwKHtzZXJpZXM6W119KSx0aGlzLl9zZXJpZXNJbmRpY2VzPW51bGwsbih0LHRoaXMuX3RoZW1lLm9wdGlvbiksaC5tZXJnZSh0LF8sITEpLHRoaXMubWVyZ2VPcHRpb24odCl9ZnVuY3Rpb24gbyh0LGUpe2guaXNBcnJheShlKXx8KGU9ZT9bZV06W10pO3ZhciBpPXt9O3JldHVybiBmKGUsZnVuY3Rpb24oZSl7aVtlXT0odC5nZXQoZSl8fFtdKS5zbGljZSgpfSksaX1mdW5jdGlvbiByKHQsZSxpKXt2YXIgbj1lLnR5cGU/ZS50eXBlOmk/aS5zdWJUeXBlOnguZGV0ZXJtaW5lU3ViVHlwZSh0LGUpO3JldHVybiBufWZ1bmN0aW9uIHModCl7cmV0dXJuIGcodCxmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wb25lbnRJbmRleH0pfHxbXX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkoInN1YlR5cGUiKT9wKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQuc3ViVHlwZT09PWUuc3ViVHlwZX0pOnR9ZnVuY3Rpb24gdSh0KXt9dmFyIGg9aSgxKSxjPWkoNSksZD1pKDExKSxmPWguZWFjaCxwPWguZmlsdGVyLGc9aC5tYXAsbT1oLmlzQXJyYXksdj1oLmluZGV4T2YseT1oLmlzT2JqZWN0LHg9aSgxMyksXz1pKDE0NiksYj0iXDBfZWNfaW5uZXIiLHc9ZC5leHRlbmQoe2NvbnN0cnVjdG9yOncsaW5pdDpmdW5jdGlvbih0LGUsaSxuKXtpPWl8fHt9LHRoaXMub3B0aW9uPW51bGwsdGhpcy5fdGhlbWU9bmV3IGQoaSksdGhpcy5fb3B0aW9uTWFuYWdlcj1ufSxzZXRPcHRpb246ZnVuY3Rpb24odCxlKXtoLmFzc2VydCghKGIgaW4gdCksInBsZWFzZSB1c2UgY2hhcnQuZ2V0T3B0aW9uKCkiKSx0aGlzLl9vcHRpb25NYW5hZ2VyLnNldE9wdGlvbih0LGUpLHRoaXMucmVzZXRPcHRpb24obnVsbCl9LHJlc2V0T3B0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPSExLGk9dGhpcy5fb3B0aW9uTWFuYWdlcjtpZighdHx8InJlY3JlYXRlIj09PXQpe3ZhciBuPWkubW91bnRPcHRpb24oInJlY3JlYXRlIj09PXQpO3RoaXMub3B0aW9uJiYicmVjcmVhdGUiIT09dD8odGhpcy5yZXN0b3JlRGF0YSgpLHRoaXMubWVyZ2VPcHRpb24obikpOmEuY2FsbCh0aGlzLG4pLGU9ITB9aWYoInRpbWVsaW5lIiE9PXQmJiJtZWRpYSIhPT10fHx0aGlzLnJlc3RvcmVEYXRhKCksIXR8fCJyZWNyZWF0ZSI9PT10fHwidGltZWxpbmUiPT09dCl7dmFyIG89aS5nZXRUaW1lbGluZU9wdGlvbih0aGlzKTtvJiYodGhpcy5tZXJnZU9wdGlvbihvKSxlPSEwKX1pZighdHx8InJlY3JlYXRlIj09PXR8fCJtZWRpYSI9PT10KXt2YXIgcj1pLmdldE1lZGlhT3B0aW9uKHRoaXMsdGhpcy5fYXBpKTtyLmxlbmd0aCYmZihyLGZ1bmN0aW9uKHQpe3RoaXMubWVyZ2VPcHRpb24odCxlPSEwKX0sdGhpcyl9cmV0dXJuIGV9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxhKXt2YXIgbD1jLm5vcm1hbGl6ZVRvQXJyYXkodFtlXSksdT1jLm1hcHBpbmdUb0V4aXN0cyhuLmdldChlKSxsKTtjLm1ha2VJZEFuZE5hbWUodSksZih1LGZ1bmN0aW9uKHQsaSl7dmFyIG49dC5vcHRpb247eShuKSYmKHQua2V5SW5mby5tYWluVHlwZT1lLHQua2V5SW5mby5zdWJUeXBlPXIoZSxuLHQuZXhpc3QpKX0pO3ZhciBkPW8obixhKTtpW2VdPVtdLG4uc2V0KGUsW10pLGYodSxmdW5jdGlvbih0LGEpe3ZhciBvPXQuZXhpc3Qscj10Lm9wdGlvbjtpZihoLmFzc2VydCh5KHIpfHxvLCJFbXB0eSBjb21wb25lbnQgZGVmaW5pdGlvbiIpLHIpe3ZhciBzPXguZ2V0Q2xhc3MoZSx0LmtleUluZm8uc3ViVHlwZSwhMCk7aWYobyYmbyBpbnN0YW5jZW9mIHMpby5uYW1lPXQua2V5SW5mby5uYW1lLG8ubWVyZ2VPcHRpb24ocix0aGlzKSxvLm9wdGlvblVwZGF0ZWQociwhMSk7ZWxzZXt2YXIgbD1oLmV4dGVuZCh7ZGVwZW5kZW50TW9kZWxzOmQsY29tcG9uZW50SW5kZXg6YX0sdC5rZXlJbmZvKTtvPW5ldyBzKHIsdGhpcyx0aGlzLGwpLGguZXh0ZW5kKG8sbCksby5pbml0KHIsdGhpcyx0aGlzLGwpLG8ub3B0aW9uVXBkYXRlZChudWxsLCEwKX19ZWxzZSBvLm1lcmdlT3B0aW9uKHt9LHRoaXMpLG8ub3B0aW9uVXBkYXRlZCh7fSwhMSk7bi5nZXQoZSlbYV09byxpW2VdW2FdPW8ub3B0aW9ufSx0aGlzKSwic2VyaWVzIj09PWUmJih0aGlzLl9zZXJpZXNJbmRpY2VzPXMobi5nZXQoInNlcmllcyIpKSl9dmFyIGk9dGhpcy5vcHRpb24sbj10aGlzLl9jb21wb25lbnRzTWFwLGE9W107Zih0LGZ1bmN0aW9uKHQsZSl7bnVsbCE9dCYmKHguaGFzQ2xhc3MoZSk/YS5wdXNoKGUpOmlbZV09bnVsbD09aVtlXT9oLmNsb25lKHQpOmgubWVyZ2UoaVtlXSx0LCEwKSl9KSx4LnRvcG9sb2dpY2FsVHJhdmVsKGEseC5nZXRBbGxDbGFzc01haW5UeXBlcygpLGUsdGhpcyksdGhpcy5fc2VyaWVzSW5kaWNlcz10aGlzLl9zZXJpZXNJbmRpY2VzfHxbXX0sZ2V0T3B0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9aC5jbG9uZSh0aGlzLm9wdGlvbik7cmV0dXJuIGYodCxmdW5jdGlvbihlLGkpe2lmKHguaGFzQ2xhc3MoaSkpe2Zvcih2YXIgZT1jLm5vcm1hbGl6ZVRvQXJyYXkoZSksbj1lLmxlbmd0aC0xO24+PTA7bi0tKWMuaXNJZElubmVyKGVbbl0pJiZlLnNwbGljZShuLDEpO3RbaV09ZX19KSxkZWxldGUgdFtiXSx0fSxnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aGVtZX0sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fY29tcG9uZW50c01hcC5nZXQodCk7aWYoaSlyZXR1cm4gaVtlfHwwXX0scXVlcnlDb21wb25lbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWFpblR5cGU7aWYoIWUpcmV0dXJuW107dmFyIGk9dC5pbmRleCxuPXQuaWQsYT10Lm5hbWUsbz10aGlzLl9jb21wb25lbnRzTWFwLmdldChlKTtpZighb3x8IW8ubGVuZ3RoKXJldHVybltdO3ZhciByO2lmKG51bGwhPWkpbShpKXx8KGk9W2ldKSxyPXAoZyhpLGZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfSksZnVuY3Rpb24odCl7cmV0dXJuISF0fSk7ZWxzZSBpZihudWxsIT1uKXt2YXIgcz1tKG4pO3I9cChvLGZ1bmN0aW9uKHQpe3JldHVybiBzJiZ2KG4sdC5pZCk+PTB8fCFzJiZ0LmlkPT09bn0pfWVsc2UgaWYobnVsbCE9YSl7dmFyIHU9bShhKTtyPXAobyxmdW5jdGlvbih0KXtyZXR1cm4gdSYmdihhLHQubmFtZSk+PTB8fCF1JiZ0Lm5hbWU9PT1hfSl9ZWxzZSByPW8uc2xpY2UoKTtyZXR1cm4gbChyLHQpfSxmaW5kQ29tcG9uZW50czpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3ZhciBlPWErIkluZGV4IixpPWErIklkIixuPWErIk5hbWUiO3JldHVybiF0fHxudWxsPT10W2VdJiZudWxsPT10W2ldJiZudWxsPT10W25dP251bGw6e21haW5UeXBlOmEsaW5kZXg6dFtlXSxpZDp0W2ldLG5hbWU6dFtuXX19ZnVuY3Rpb24gaShlKXtyZXR1cm4gdC5maWx0ZXI/cChlLHQuZmlsdGVyKTplfXZhciBuPXQucXVlcnksYT10Lm1haW5UeXBlLG89ZShuKSxyPW8/dGhpcy5xdWVyeUNvbXBvbmVudHMobyk6dGhpcy5fY29tcG9uZW50c01hcC5nZXQoYSk7cmV0dXJuIGkobChyLHQpKX0sZWFjaENvbXBvbmVudDpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fY29tcG9uZW50c01hcDtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClpPWUsZT10LG4uZWFjaChmdW5jdGlvbih0LG4pe2YodCxmdW5jdGlvbih0LGEpe2UuY2FsbChpLG4sdCxhKX0pfSk7ZWxzZSBpZihoLmlzU3RyaW5nKHQpKWYobi5nZXQodCksZSxpKTtlbHNlIGlmKHkodCkpe3ZhciBhPXRoaXMuZmluZENvbXBvbmVudHModCk7ZihhLGUsaSl9fSxnZXRTZXJpZXNCeU5hbWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpO3JldHVybiBwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZT09PXR9KX0sZ2V0U2VyaWVzQnlJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpW3RdfSxnZXRTZXJpZXNCeVR5cGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpO3JldHVybiBwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3ViVHlwZT09PXR9KX0sZ2V0U2VyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHNNYXAuZ2V0KCJzZXJpZXMiKS5zbGljZSgpfSxlYWNoU2VyaWVzOmZ1bmN0aW9uKHQsZSl7dSh0aGlzKSxmKHRoaXMuX3Nlcmllc0luZGljZXMsZnVuY3Rpb24oaSl7dmFyIG49dGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpW2ldO3QuY2FsbChlLG4saSl9LHRoaXMpfSxlYWNoUmF3U2VyaWVzOmZ1bmN0aW9uKHQsZSl7Zih0aGlzLl9jb21wb25lbnRzTWFwLmdldCgic2VyaWVzIiksdCxlKX0sZWFjaFNlcmllc0J5VHlwZTpmdW5jdGlvbih0LGUsaSl7dSh0aGlzKSxmKHRoaXMuX3Nlcmllc0luZGljZXMsZnVuY3Rpb24obil7dmFyIGE9dGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpW25dO2Euc3ViVHlwZT09PXQmJmUuY2FsbChpLGEsbil9LHRoaXMpfSxlYWNoUmF3U2VyaWVzQnlUeXBlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZih0aGlzLmdldFNlcmllc0J5VHlwZSh0KSxlLGkpfSxpc1Nlcmllc0ZpbHRlcmVkOmZ1bmN0aW9uKHQpe3JldHVybiB1KHRoaXMpLGguaW5kZXhPZih0aGlzLl9zZXJpZXNJbmRpY2VzLHQuY29tcG9uZW50SW5kZXgpPDB9LGdldEN1cnJlbnRTZXJpZXNJbmRpY2VzOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX3Nlcmllc0luZGljZXN8fFtdKS5zbGljZSgpfSxmaWx0ZXJTZXJpZXM6ZnVuY3Rpb24odCxlKXt1KHRoaXMpO3ZhciBpPXAodGhpcy5fY29tcG9uZW50c01hcC5nZXQoInNlcmllcyIpLHQsZSk7dGhpcy5fc2VyaWVzSW5kaWNlcz1zKGkpfSxyZXN0b3JlRGF0YTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbXBvbmVudHNNYXA7dGhpcy5fc2VyaWVzSW5kaWNlcz1zKHQuZ2V0KCJzZXJpZXMiKSk7dmFyIGU9W107dC5lYWNoKGZ1bmN0aW9uKHQsaSl7ZS5wdXNoKGkpfSkseC50b3BvbG9naWNhbFRyYXZlbChlLHguZ2V0QWxsQ2xhc3NNYWluVHlwZXMoKSxmdW5jdGlvbihlLGkpe2YodC5nZXQoZSksZnVuY3Rpb24odCl7dC5yZXN0b3JlRGF0YSgpfSl9KX19KTtoLm1peGluKHcsaSg2NSkpLHQuZXhwb3J0cz13fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt0aGlzLl9hcGk9dCx0aGlzLl90aW1lbGluZU9wdGlvbnM9W10sdGhpcy5fbWVkaWFMaXN0PVtdLHRoaXMuX21lZGlhRGVmYXVsdCx0aGlzLl9jdXJyZW50TWVkaWFJbmRpY2VzPVtdLHRoaXMuX29wdGlvbkJhY2t1cCx0aGlzLl9uZXdCYXNlT3B0aW9ufWZ1bmN0aW9uIGEodCxlLGkpe3ZhciBuLGEsbz1bXSxyPVtdLHM9dC50aW1lbGluZTtpZih0LmJhc2VPcHRpb24mJihhPXQuYmFzZU9wdGlvbiksKHN8fHQub3B0aW9ucykmJihhPWF8fHt9LG89KHQub3B0aW9uc3x8W10pLnNsaWNlKCkpLHQubWVkaWEpe2E9YXx8e307dmFyIGw9dC5tZWRpYTtkKGwsZnVuY3Rpb24odCl7dCYmdC5vcHRpb24mJih0LnF1ZXJ5P3IucHVzaCh0KTpufHwobj10KSl9KX1yZXR1cm4gYXx8KGE9dCksYS50aW1lbGluZXx8KGEudGltZWxpbmU9cyksZChbYV0uY29uY2F0KG8pLmNvbmNhdCh1Lm1hcChyLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wdGlvbn0pKSxmdW5jdGlvbih0KXtkKGUsZnVuY3Rpb24oZSl7ZSh0LGkpfSl9KSx7YmFzZU9wdGlvbjphLHRpbWVsaW5lT3B0aW9uczpvLG1lZGlhRGVmYXVsdDpuLG1lZGlhTGlzdDpyfX1mdW5jdGlvbiBvKHQsZSxpKXt2YXIgbj17d2lkdGg6ZSxoZWlnaHQ6aSxhc3BlY3RyYXRpbzplL2l9LGE9ITA7cmV0dXJuIHUuZWFjaCh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5tYXRjaChtKTtpZihpJiZpWzFdJiZpWzJdKXt2YXIgbz1pWzFdLHM9aVsyXS50b0xvd2VyQ2FzZSgpO3IobltzXSx0LG8pfHwoYT0hMSl9fSksYX1mdW5jdGlvbiByKHQsZSxpKXtyZXR1cm4ibWluIj09PWk/dD49ZToibWF4Ij09PWk/dDw9ZTp0PT09ZX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIHQuam9pbigiLCIpPT09ZS5qb2luKCIsIil9ZnVuY3Rpb24gbCh0LGUpe2U9ZXx8e30sZChlLGZ1bmN0aW9uKGUsaSl7aWYobnVsbCE9ZSl7dmFyIG49dFtpXTtpZihjLmhhc0NsYXNzKGkpKXtlPWgubm9ybWFsaXplVG9BcnJheShlKSxuPWgubm9ybWFsaXplVG9BcnJheShuKTt2YXIgYT1oLm1hcHBpbmdUb0V4aXN0cyhuLGUpO3RbaV09cChhLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wdGlvbiYmdC5leGlzdD9nKHQuZXhpc3QsdC5vcHRpb24sITApOnQuZXhpc3R8fHQub3B0aW9ufSl9ZWxzZSB0W2ldPWcobixlLCEwKX19KX12YXIgdT1pKDEpLGg9aSg1KSxjPWkoMTMpLGQ9dS5lYWNoLGY9dS5jbG9uZSxwPXUubWFwLGc9dS5tZXJnZSxtPS9eKG1pbnxtYXgpPyguKykkLztuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixzZXRPcHRpb246ZnVuY3Rpb24odCxlKXt0PWYodCwhMCk7dmFyIGk9dGhpcy5fb3B0aW9uQmFja3VwLG49YS5jYWxsKHRoaXMsdCxlLCFpKTt0aGlzLl9uZXdCYXNlT3B0aW9uPW4uYmFzZU9wdGlvbixpPyhsKGkuYmFzZU9wdGlvbixuLmJhc2VPcHRpb24pLG4udGltZWxpbmVPcHRpb25zLmxlbmd0aCYmKGkudGltZWxpbmVPcHRpb25zPW4udGltZWxpbmVPcHRpb25zKSxuLm1lZGlhTGlzdC5sZW5ndGgmJihpLm1lZGlhTGlzdD1uLm1lZGlhTGlzdCksbi5tZWRpYURlZmF1bHQmJihpLm1lZGlhRGVmYXVsdD1uLm1lZGlhRGVmYXVsdCkpOnRoaXMuX29wdGlvbkJhY2t1cD1ufSxtb3VudE9wdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vcHRpb25CYWNrdXA7cmV0dXJuIHRoaXMuX3RpbWVsaW5lT3B0aW9ucz1wKGUudGltZWxpbmVPcHRpb25zLGYpLHRoaXMuX21lZGlhTGlzdD1wKGUubWVkaWFMaXN0LGYpLHRoaXMuX21lZGlhRGVmYXVsdD1mKGUubWVkaWFEZWZhdWx0KSx0aGlzLl9jdXJyZW50TWVkaWFJbmRpY2VzPVtdLGYodD9lLmJhc2VPcHRpb246dGhpcy5fbmV3QmFzZU9wdGlvbil9LGdldFRpbWVsaW5lT3B0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy5fdGltZWxpbmVPcHRpb25zO2lmKGkubGVuZ3RoKXt2YXIgbj10LmdldENvbXBvbmVudCgidGltZWxpbmUiKTtuJiYoZT1mKGlbbi5nZXRDdXJyZW50SW5kZXgoKV0sITApKX1yZXR1cm4gZX0sZ2V0TWVkaWFPcHRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYXBpLmdldFdpZHRoKCksaT10aGlzLl9hcGkuZ2V0SGVpZ2h0KCksbj10aGlzLl9tZWRpYUxpc3QsYT10aGlzLl9tZWRpYURlZmF1bHQscj1bXSxsPVtdO2lmKCFuLmxlbmd0aCYmIWEpcmV0dXJuIGw7Zm9yKHZhciB1PTAsaD1uLmxlbmd0aDt1PGg7dSsrKW8oblt1XS5xdWVyeSxlLGkpJiZyLnB1c2godSk7cmV0dXJuIXIubGVuZ3RoJiZhJiYocj1bLTFdKSxyLmxlbmd0aCYmIXMocix0aGlzLl9jdXJyZW50TWVkaWFJbmRpY2VzKSYmKGw9cChyLGZ1bmN0aW9uKHQpe3JldHVybiBmKHQ9PT0tMT9hLm9wdGlvbjpuW3RdLm9wdGlvbil9KSksdGhpcy5fY3VycmVudE1lZGlhSW5kaWNlcz1yLGx9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgaT0iIjsidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmKGk9bmF2aWdhdG9yLnBsYXRmb3JtfHwiIiksdC5leHBvcnRzPXtjb2xvcjpbIiNjMjM1MzEiLCIjMmY0NTU0IiwiIzYxYTBhOCIsIiNkNDgyNjUiLCIjOTFjN2FlIiwiIzc0OWY4MyIsIiNjYTg2MjIiLCIjYmRhMjlhIiwiIzZlNzA3NCIsIiM1NDY1NzAiLCIjYzRjY2QzIl0sdGV4dFN0eWxlOntmb250RmFtaWx5OmkubWF0Y2goL15XaW4vKT8iTWljcm9zb2Z0IFlhSGVpIjoic2Fucy1zZXJpZiIsZm9udFNpemU6MTIsZm9udFN0eWxlOiJub3JtYWwiLGZvbnRXZWlnaHQ6Im5vcm1hbCJ9LGJsZW5kTW9kZTpudWxsLGFuaW1hdGlvbjoiYXV0byIsYW5pbWF0aW9uRHVyYXRpb246MWUzLGFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlOjMwMCxhbmltYXRpb25FYXNpbmc6ImV4cG9uZW50aWFsT3V0IixhbmltYXRpb25FYXNpbmdVcGRhdGU6ImN1YmljT3V0IixhbmltYXRpb25UaHJlc2hvbGQ6MmUzLHByb2dyZXNzaXZlVGhyZXNob2xkOjNlMyxwcm9ncmVzc2l2ZTo0MDAsaG92ZXJMYXllclRocmVzaG9sZDozZTMsdXNlVVRDOiExfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17Z2V0QXJlYVN0eWxlOmkoMzEpKFtbImZpbGwiLCJjb2xvciJdLFsic2hhZG93Qmx1ciJdLFsic2hhZG93T2Zmc2V0WCJdLFsic2hhZG93T2Zmc2V0WSJdLFsib3BhY2l0eSJdLFsic2hhZG93Q29sb3IiXV0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2dldEJveExheW91dFBhcmFtczpmdW5jdGlvbigpe3JldHVybntsZWZ0OnRoaXMuZ2V0KCJsZWZ0IiksdG9wOnRoaXMuZ2V0KCJ0b3AiKSxyaWdodDp0aGlzLmdldCgicmlnaHQiKSxib3R0b206dGhpcy5nZXQoImJvdHRvbSIpLHdpZHRoOnRoaXMuZ2V0KCJ3aWR0aCIpLGhlaWdodDp0aGlzLmdldCgiaGVpZ2h0Iil9fX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDMxKShbWyJmaWxsIiwiY29sb3IiXSxbInN0cm9rZSIsImJvcmRlckNvbG9yIl0sWyJsaW5lV2lkdGgiLCJib3JkZXJXaWR0aCJdLFsib3BhY2l0eSJdLFsic2hhZG93Qmx1ciJdLFsic2hhZG93T2Zmc2V0WCJdLFsic2hhZG93T2Zmc2V0WSJdLFsic2hhZG93Q29sb3IiXSxbInRleHRQb3NpdGlvbiJdLFsidGV4dEFsaWduIl1dKTt0LmV4cG9ydHM9e2dldEl0ZW1TdHlsZTpmdW5jdGlvbih0LGUpe3ZhciBpPW4uY2FsbCh0aGlzLHQsZSksYT10aGlzLmdldEJvcmRlckxpbmVEYXNoKCk7cmV0dXJuIGEmJihpLmxpbmVEYXNoPWEpLGl9LGdldEJvcmRlckxpbmVEYXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoImJvcmRlclR5cGUiKTtyZXR1cm4ic29saWQiPT09dHx8bnVsbD09dD9udWxsOiJkYXNoZWQiPT09dD9bNSw1XTpbMSwxXX19fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgzMSkoW1sibGluZVdpZHRoIiwid2lkdGgiXSxbInN0cm9rZSIsImNvbG9yIl0sWyJvcGFjaXR5Il0sWyJzaGFkb3dCbHVyIl0sWyJzaGFkb3dPZmZzZXRYIl0sWyJzaGFkb3dPZmZzZXRZIl0sWyJzaGFkb3dDb2xvciJdXSk7dC5leHBvcnRzPXtnZXRMaW5lU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9bi5jYWxsKHRoaXMsdCksaT10aGlzLmdldExpbmVEYXNoKGUubGluZVdpZHRoKTtyZXR1cm4gaSYmKGUubGluZURhc2g9aSksZX0sZ2V0TGluZURhc2g6ZnVuY3Rpb24odCl7bnVsbD09dCYmKHQ9MSk7dmFyIGU9dGhpcy5nZXQoInR5cGUiKSxpPU1hdGgubWF4KHQsMiksbj00KnQ7cmV0dXJuInNvbGlkIj09PWV8fG51bGw9PWU/bnVsbDoiZGFzaGVkIj09PWU/W24sbl06W2ksaV19fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTYpLGE9aSgzKSxvPVsidGV4dFN0eWxlIiwiY29sb3IiXTt0LmV4cG9ydHM9e2dldFRleHRDb2xvcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmVjTW9kZWw7cmV0dXJuIHRoaXMuZ2V0U2hhbGxvdygiY29sb3IiKXx8KCF0JiZlP2UuZ2V0KG8pOm51bGwpfSxnZXRGb250OmZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Rm9udCh7Zm9udFN0eWxlOnRoaXMuZ2V0U2hhbGxvdygiZm9udFN0eWxlIiksZm9udFdlaWdodDp0aGlzLmdldFNoYWxsb3coImZvbnRXZWlnaHQiKSxmb250U2l6ZTp0aGlzLmdldFNoYWxsb3coImZvbnRTaXplIiksZm9udEZhbWlseTp0aGlzLmdldFNoYWxsb3coImZvbnRGYW1pbHkiKX0sdGhpcy5lY01vZGVsKX0sZ2V0VGV4dFJlY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG4uZ2V0Qm91bmRpbmdSZWN0KHQsdGhpcy5nZXRGb250KCksdGhpcy5nZXRTaGFsbG93KCJhbGlnbiIpLHRoaXMuZ2V0U2hhbGxvdygidmVydGljYWxBbGlnbiIpfHx0aGlzLmdldFNoYWxsb3coImJhc2VsaW5lIiksdGhpcy5nZXRTaGFsbG93KCJwYWRkaW5nIiksdGhpcy5nZXRTaGFsbG93KCJyaWNoIiksdGhpcy5nZXRTaGFsbG93KCJ0cnVuY2F0ZVRleHQiKSl9fX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXtlPWUuc3BsaXQoIiwiKTtmb3IodmFyIGk9dCxuPTA7bjxlLmxlbmd0aCYmKGk9aSYmaVtlW25dXSxudWxsIT1pKTtuKyspO3JldHVybiBpfWZ1bmN0aW9uIGEodCxlLGksbil7ZT1lLnNwbGl0KCIsIik7Zm9yKHZhciBhLG89dCxyPTA7cjxlLmxlbmd0aC0xO3IrKylhPWVbcl0sbnVsbD09b1thXSYmKG9bYV09e30pLG89b1thXTsobnx8bnVsbD09b1tlW3JdXSkmJihvW2Vbcl1dPWkpfWZ1bmN0aW9uIG8odCl7YyhsLGZ1bmN0aW9uKGUpe2VbMF1pbiB0JiYhKGVbMV1pbiB0KSYmKHRbZVsxXV09dFtlWzBdXSl9KX12YXIgcj1pKDEpLHM9aSgxNTMpLGw9W1sieCIsImxlZnQiXSxbInkiLCJ0b3AiXSxbIngyIiwicmlnaHQiXSxbInkyIiwiYm90dG9tIl1dLHU9WyJncmlkIiwiZ2VvIiwicGFyYWxsZWwiLCJsZWdlbmQiLCJ0b29sYm94IiwidGl0bGUiLCJ2aXN1YWxNYXAiLCJkYXRhWm9vbSIsInRpbWVsaW5lIl0saD1bImJhciIsImJveHBsb3QiLCJjYW5kbGVzdGljayIsImNob3JkIiwiZWZmZWN0U2NhdHRlciIsImZ1bm5lbCIsImdhdWdlIiwibGluZXMiLCJncmFwaCIsImhlYXRtYXAiLCJsaW5lIiwibWFwIiwicGFyYWxsZWwiLCJwaWUiLCJyYWRhciIsInNhbmtleSIsInNjYXR0ZXIiLCJ0cmVlbWFwIl0sYz1yLmVhY2g7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cyh0LGUpO3ZhciBpPXQuc2VyaWVzO2Moci5pc0FycmF5KGkpP2k6W2ldLGZ1bmN0aW9uKHQpe2lmKHIuaXNPYmplY3QodCkpe3ZhciBlPXQudHlwZTtpZigicGllIiE9PWUmJiJnYXVnZSIhPT1lfHxudWxsIT10LmNsb2NrV2lzZSYmKHQuY2xvY2t3aXNlPXQuY2xvY2tXaXNlKSwiZ2F1Z2UiPT09ZSl7dmFyIGk9bih0LCJwb2ludGVyLmNvbG9yIik7bnVsbCE9aSYmYSh0LCJpdGVtU3R5bGUubm9ybWFsLmNvbG9yIixpKX1mb3IodmFyIHM9MDtzPGgubGVuZ3RoO3MrKylpZihoW3NdPT09dC50eXBlKXtvKHQpO2JyZWFrfX19KSx0LmRhdGFSYW5nZSYmKHQudmlzdWFsTWFwPXQuZGF0YVJhbmdlKSxjKHUsZnVuY3Rpb24oZSl7dmFyIGk9dFtlXTtpJiYoci5pc0FycmF5KGkpfHwoaT1baV0pLGMoaSxmdW5jdGlvbih0KXtvKHQpfSkpfSl9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt2YXIgZT10JiZ0Lml0ZW1TdHlsZTtpZihlKWZvcih2YXIgaT0wLG49Zi5sZW5ndGg7aTxuO2krKyl7dmFyIGE9ZltpXSxvPWUubm9ybWFsLHI9ZS5lbXBoYXNpcztvJiZvW2FdJiYodFthXT10W2FdfHx7fSx0W2FdLm5vcm1hbD91Lm1lcmdlKHRbYV0ubm9ybWFsLG9bYV0pOnRbYV0ubm9ybWFsPW9bYV0sb1thXT1udWxsKSxyJiZyW2FdJiYodFthXT10W2FdfHx7fSx0W2FdLmVtcGhhc2lzP3UubWVyZ2UodFthXS5lbXBoYXNpcyxyW2FdKTp0W2FdLmVtcGhhc2lzPXJbYV0sclthXT1udWxsKX19ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPWQodCkmJnRbZV0sbj1kKGkpJiZpLnRleHRTdHlsZTtpZihuKWZvcih2YXIgYT0wLG89aC5URVhUX1NUWUxFX09QVElPTlMubGVuZ3RoO2E8bzthKyspe3ZhciBlPWguVEVYVF9TVFlMRV9PUFRJT05TW2FdO24uaGFzT3duUHJvcGVydHkoZSkmJihpW2VdPW5bZV0pfX1mdW5jdGlvbiBvKHQpe2QodCkmJihhKHQsIm5vcm1hbCIpLGEodCwiZW1waGFzaXMiKSl9ZnVuY3Rpb24gcih0KXtpZihkKHQpKXtuKHQpLG8odC5sYWJlbCksbyh0LnVwcGVyTGFiZWwpLG8odC5lZGdlTGFiZWwpO3ZhciBlPXQubWFya1BvaW50O24oZSksbyhlJiZlLmxhYmVsKTt2YXIgaT10Lm1hcmtMaW5lO24odC5tYXJrTGluZSksbyhpJiZpLmxhYmVsKTt2YXIgcj10Lm1hcmtBcmVhO28ociYmci5sYWJlbCksYSh0LCJheGlzTGFiZWwiKSxhKHQsInRpdGxlIiksYSh0LCJkZXRhaWwiKTt2YXIgcz10LmRhdGE7aWYocylmb3IodmFyIGw9MDtsPHMubGVuZ3RoO2wrKyluKHNbbF0pLG8oc1tsXSYmc1tsXS5sYWJlbCk7dmFyIGU9dC5tYXJrUG9pbnQ7aWYoZSYmZS5kYXRhKWZvcih2YXIgaD1lLmRhdGEsbD0wO2w8aC5sZW5ndGg7bCsrKW4oaFtsXSksbyhoW2xdJiZoW2xdLmxhYmVsKTt2YXIgaT10Lm1hcmtMaW5lO2lmKGkmJmkuZGF0YSlmb3IodmFyIGM9aS5kYXRhLGw9MDtsPGMubGVuZ3RoO2wrKyl1LmlzQXJyYXkoY1tsXSk/KG4oY1tsXVswXSksbyhjW2xdWzBdJiZjW2xdWzBdLmxhYmVsKSxuKGNbbF1bMV0pLG8oY1tsXVsxXSYmY1tsXVsxXS5sYWJlbCkpOihuKGNbbF0pLG8oY1tsXSYmY1tsXS5sYWJlbCkpfX1mdW5jdGlvbiBzKHQpe3JldHVybiB1LmlzQXJyYXkodCk/dDp0P1t0XTpbXX1mdW5jdGlvbiBsKHQpe3JldHVybih1LmlzQXJyYXkodCk/dFswXTp0KXx8e319dmFyIHU9aSgxKSxoPWkoNSksYz11LmVhY2gsZD11LmlzT2JqZWN0LGY9WyJhcmVhU3R5bGUiLCJsaW5lU3R5bGUiLCJub2RlU3R5bGUiLCJsaW5rU3R5bGUiLCJjaG9yZFN0eWxlIiwibGFiZWwiLCJsYWJlbExpbmUiXTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtjKHModC5zZXJpZXMpLGZ1bmN0aW9uKHQpe2QodCkmJnIodCl9KTt2YXIgaT1bInhBeGlzIiwieUF4aXMiLCJyYWRpdXNBeGlzIiwiYW5nbGVBeGlzIiwic2luZ2xlQXhpcyIsInBhcmFsbGVsQXhpcyIsInJhZGFyIl07ZSYmaS5wdXNoKCJ2YWx1ZUF4aXMiLCJjYXRlZ29yeUF4aXMiLCJsb2dBeGlzIiwidGltZUF4aXMiKSxjKGksZnVuY3Rpb24oZSl7YyhzKHRbZV0pLGZ1bmN0aW9uKHQpe3QmJihhKHQsImF4aXNMYWJlbCIpLGEodC5heGlzUG9pbnRlciwibGFiZWwiKSl9KX0pLGMocyh0LnBhcmFsbGVsKSxmdW5jdGlvbih0KXt2YXIgZT10JiZ0LnBhcmFsbGVsQXhpc0RlZmF1bHQ7YShlLCJheGlzTGFiZWwiKSxhKGUmJmUuYXhpc1BvaW50ZXIsImxhYmVsIil9KSxjKHModC5jYWxlbmRhciksZnVuY3Rpb24odCl7YSh0LCJkYXlMYWJlbCIpLGEodCwibW9udGhMYWJlbCIpLGEodCwieWVhckxhYmVsIil9KSxjKHModC5yYWRhciksZnVuY3Rpb24odCl7YSh0LCJuYW1lIil9KSxjKHModC5nZW8pLGZ1bmN0aW9uKHQpe2QodCkmJihvKHQubGFiZWwpLGMocyh0LnJlZ2lvbnMpLGZ1bmN0aW9uKHQpe28odC5sYWJlbCl9KSl9KSxvKGwodC50aW1lbGluZSkubGFiZWwpLGEobCh0LmF4aXNQb2ludGVyKSwibGFiZWwiKSxhKGwodC50b29sdGlwKS5heGlzUG9pbnRlciwibGFiZWwiKX19LGZ1bmN0aW9uKHQsZSl7dmFyIGk9e2F2ZXJhZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsaT0wLG49MDtuPHQubGVuZ3RoO24rKylpc05hTih0W25dKXx8KGUrPXRbbl0saSsrKTtyZXR1cm4gMD09PWk/TmFOOmUvaX0sc3VtOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLGk9MDtpPHQubGVuZ3RoO2krKyllKz10W2ldfHwwO3JldHVybiBlfSxtYXg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0oMS8wKSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXT5lJiYoZT10W2ldKTtyZXR1cm4gZX0sbWluOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xLzAsaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV08ZSYmKGU9dFtpXSk7cmV0dXJuIGV9LG5lYXJlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF19fSxuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgucm91bmQodC5sZW5ndGgvMil9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsYSl7ZS5lYWNoU2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksYT10LmdldCgic2FtcGxpbmciKSxvPXQuY29vcmRpbmF0ZVN5c3RlbTtpZigiY2FydGVzaWFuMmQiPT09by50eXBlJiZhKXt2YXIgcj1vLmdldEJhc2VBeGlzKCkscz1vLmdldE90aGVyQXhpcyhyKSxsPXIuZ2V0RXh0ZW50KCksdT1sWzFdLWxbMF0saD1NYXRoLnJvdW5kKGUuY291bnQoKS91KTtpZihoPjEpe3ZhciBjOyJzdHJpbmciPT10eXBlb2YgYT9jPWlbYV06ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihjPWEpLGMmJihlPWUuZG93blNhbXBsZShzLmRpbSwxL2gsYyxuKSx0LnNldERhdGEoZSkpfX19LHRoaXMpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gYyh0LGgoZSkpfXZhciBhPWkoMSksbz1pKDM0KSxyPWkoNCkscz1pKDQ1KSxsPW8ucHJvdG90eXBlLHU9cy5wcm90b3R5cGUsaD1yLmdldFByZWNpc2lvblNhZmUsYz1yLnJvdW5kLGQ9TWF0aC5mbG9vcixmPU1hdGguY2VpbCxwPU1hdGgucG93LGc9TWF0aC5sb2csbT1vLmV4dGVuZCh7dHlwZToibG9nIixiYXNlOjEwLCRjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe28uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX29yaWdpbmFsU2NhbGU9bmV3IHN9LGdldFRpY2tzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fb3JpZ2luYWxTY2FsZSxlPXRoaXMuX2V4dGVudCxpPXQuZ2V0RXh0ZW50KCk7cmV0dXJuIGEubWFwKHUuZ2V0VGlja3MuY2FsbCh0aGlzKSxmdW5jdGlvbihhKXt2YXIgbz1yLnJvdW5kKHAodGhpcy5iYXNlLGEpKTtyZXR1cm4gbz1hPT09ZVswXSYmdC5fX2ZpeE1pbj9uKG8saVswXSk6byxvPWE9PT1lWzFdJiZ0Ll9fZml4TWF4P24obyxpWzFdKTpvfSx0aGlzKX0sZ2V0TGFiZWw6dS5nZXRMYWJlbCxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gdD1sLnNjYWxlLmNhbGwodGhpcyx0KSxwKHRoaXMuYmFzZSx0KX0sc2V0RXh0ZW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5iYXNlO3Q9Zyh0KS9nKGkpLGU9ZyhlKS9nKGkpLHUuc2V0RXh0ZW50LmNhbGwodGhpcyx0LGUpfSxnZXRFeHRlbnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJhc2UsZT1sLmdldEV4dGVudC5jYWxsKHRoaXMpO2VbMF09cCh0LGVbMF0pLGVbMV09cCh0LGVbMV0pO3ZhciBpPXRoaXMuX29yaWdpbmFsU2NhbGUsYT1pLmdldEV4dGVudCgpO3JldHVybiBpLl9fZml4TWluJiYoZVswXT1uKGVbMF0sYVswXSkpLGkuX19maXhNYXgmJihlWzFdPW4oZVsxXSxhWzFdKSksZX0sdW5pb25FeHRlbnQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZ2luYWxTY2FsZS51bmlvbkV4dGVudCh0KTt2YXIgZT10aGlzLmJhc2U7dFswXT1nKHRbMF0pL2coZSksdFsxXT1nKHRbMV0pL2coZSksbC51bmlvbkV4dGVudC5jYWxsKHRoaXMsdCl9LHVuaW9uRXh0ZW50RnJvbURhdGE6ZnVuY3Rpb24odCxlKXt0aGlzLnVuaW9uRXh0ZW50KHQuZ2V0RGF0YUV4dGVudChlLCEwLGZ1bmN0aW9uKHQpe3JldHVybiB0PjB9KSl9LG5pY2VUaWNrczpmdW5jdGlvbih0KXt0PXR8fDEwO3ZhciBlPXRoaXMuX2V4dGVudCxpPWVbMV0tZVswXTtpZighKGk9PT0xLzB8fGk8PTApKXt2YXIgbj1yLnF1YW50aXR5KGkpLGE9dC9pKm47Zm9yKGE8PS41JiYobio9MTApOyFpc05hTihuKSYmTWF0aC5hYnMobik8MSYmTWF0aC5hYnMobik+MDspbio9MTA7dmFyIG89W3Iucm91bmQoZihlWzBdL24pKm4pLHIucm91bmQoZChlWzFdL24pKm4pXTt0aGlzLl9pbnRlcnZhbD1uLHRoaXMuX25pY2VFeHRlbnQ9b319LG5pY2VFeHRlbnQ6ZnVuY3Rpb24odCl7dS5uaWNlRXh0ZW50LmNhbGwodGhpcyx0KTt2YXIgZT10aGlzLl9vcmlnaW5hbFNjYWxlO2UuX19maXhNaW49dC5maXhNaW4sZS5fX2ZpeE1heD10LmZpeE1heH19KTthLmVhY2goWyJjb250YWluIiwibm9ybWFsaXplIl0sZnVuY3Rpb24odCl7bS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZyhlKS9nKHRoaXMuYmFzZSksbFt0XS5jYWxsKHRoaXMsZSl9fSksbS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG19LHQuZXhwb3J0cz1tfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPWkoMzQpLG89YS5wcm90b3R5cGUscj1hLmV4dGVuZCh7dHlwZToib3JkaW5hbCIsaW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2RhdGE9dCx0aGlzLl9leHRlbnQ9ZXx8WzAsdC5sZW5ndGgtMV19LHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uLmluZGV4T2YodGhpcy5fZGF0YSx0KTpNYXRoLnJvdW5kKHQpfSxjb250YWluOmZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMucGFyc2UodCksby5jb250YWluLmNhbGwodGhpcyx0KSYmbnVsbCE9dGhpcy5fZGF0YVt0XX0sbm9ybWFsaXplOmZ1bmN0aW9uKHQpe3JldHVybiBvLm5vcm1hbGl6ZS5jYWxsKHRoaXMsdGhpcy5wYXJzZSh0KSl9LHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKG8uc2NhbGUuY2FsbCh0aGlzLHQpKX0sZ2V0VGlja3M6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzLl9leHRlbnQsaT1lWzBdO2k8PWVbMV07KXQucHVzaChpKSxpKys7cmV0dXJuIHR9LGdldExhYmVsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kYXRhW3RdfSxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHRlbnRbMV0tdGhpcy5fZXh0ZW50WzBdKzF9LHVuaW9uRXh0ZW50RnJvbURhdGE6ZnVuY3Rpb24odCxlKXt0aGlzLnVuaW9uRXh0ZW50KHQuZ2V0RGF0YUV4dGVudChlLCExKSl9LG5pY2VUaWNrczpuLm5vb3AsbmljZUV4dGVudDpuLm5vb3B9KTtyLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcn0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSg0KSxvPWkoNykscj1pKDY3KSxzPWkoNDUpLGw9cy5wcm90b3R5cGUsdT1NYXRoLmNlaWwsaD1NYXRoLmZsb29yLGM9MWUzLGQ9NjAqYyxmPTYwKmQscD0yNCpmLGc9ZnVuY3Rpb24odCxlLGksbil7Zm9yKDtpPG47KXt2YXIgYT1pK24+Pj4xO3RbYV1bMl08ZT9pPWErMTpuPWF9cmV0dXJuIGl9LG09cy5leHRlbmQoe3R5cGU6InRpbWUiLGdldExhYmVsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3N0ZXBMdmwsaT1uZXcgRGF0ZSh0KTtyZXR1cm4gby5mb3JtYXRUaW1lKGVbMF0saSx0aGlzLmdldFNldHRpbmcoInVzZVVUQyIpKX0sbmljZUV4dGVudDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9leHRlbnQ7aWYoZVswXT09PWVbMV0mJihlWzBdLT1wLGVbMV0rPXApLGVbMV09PT0tKDEvMCkmJmVbMF09PT0xLzApe3ZhciBpPW5ldyBEYXRlO2VbMV09K25ldyBEYXRlKGkuZ2V0RnVsbFllYXIoKSxpLmdldE1vbnRoKCksaS5nZXREYXRlKCkpLGVbMF09ZVsxXS1wfXRoaXMubmljZVRpY2tzKHQuc3BsaXROdW1iZXIsdC5taW5JbnRlcnZhbCx0Lm1heEludGVydmFsKTt2YXIgbj10aGlzLl9pbnRlcnZhbDt0LmZpeE1pbnx8KGVbMF09YS5yb3VuZChoKGVbMF0vbikqbikpLHQuZml4TWF4fHwoZVsxXT1hLnJvdW5kKHUoZVsxXS9uKSpuKSl9LG5pY2VUaWNrczpmdW5jdGlvbih0LGUsaSl7dD10fHwxMDt2YXIgbj10aGlzLl9leHRlbnQsbz1uWzFdLW5bMF0scz1vL3Q7bnVsbCE9ZSYmczxlJiYocz1lKSxudWxsIT1pJiZzPmkmJihzPWkpO3ZhciBsPXYubGVuZ3RoLGM9Zyh2LHMsMCxsKSxkPXZbTWF0aC5taW4oYyxsLTEpXSxmPWRbMl07aWYoInllYXIiPT09ZFswXSl7dmFyIHA9by9mLG09YS5uaWNlKHAvdCwhMCk7Zio9bX12YXIgeT10aGlzLmdldFNldHRpbmcoInVzZVVUQyIpPzA6NjAqbmV3IERhdGUoK25bMF18fCtuWzFdKS5nZXRUaW1lem9uZU9mZnNldCgpKjFlMyx4PVtNYXRoLnJvdW5kKHUoKG5bMF0teSkvZikqZit5KSxNYXRoLnJvdW5kKGgoKG5bMV0teSkvZikqZit5KV07ci5maXhFeHRlbnQoeCxuKSx0aGlzLl9zdGVwTHZsPWQsdGhpcy5faW50ZXJ2YWw9Zix0aGlzLl9uaWNlRXh0ZW50PXh9LHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybithLnBhcnNlRGF0ZSh0KX19KTtuLmVhY2goWyJjb250YWluIiwibm9ybWFsaXplIl0sZnVuY3Rpb24odCl7bS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSl7cmV0dXJuIGxbdF0uY2FsbCh0aGlzLHRoaXMucGFyc2UoZSkpfX0pO3ZhciB2PVtbImhoOm1tOnNzIiwxLGNdLFsiaGg6bW06c3MiLDUsNSpjXSxbImhoOm1tOnNzIiwxMCwxMCpjXSxbImhoOm1tOnNzIiwxNSwxNSpjXSxbImhoOm1tOnNzIiwzMCwzMCpjXSxbImhoOm1tXG5NTS1kZCIsMSxkXSxbImhoOm1tXG5NTS1kZCIsNSw1KmRdLFsiaGg6bW1cbk1NLWRkIiwxMCwxMCpkXSxbImhoOm1tXG5NTS1kZCIsMTUsMTUqZF0sWyJoaDptbVxuTU0tZGQiLDMwLDMwKmRdLFsiaGg6bW1cbk1NLWRkIiwxLGZdLFsiaGg6bW1cbk1NLWRkIiwyLDIqZl0sWyJoaDptbVxuTU0tZGQiLDYsNipmXSxbImhoOm1tXG5NTS1kZCIsMTIsMTIqZl0sWyJNTS1kZFxueXl5eSIsMSxwXSxbIndlZWsiLDcsNypwXSxbIm1vbnRoIiwxLDMxKnBdLFsicXVhcnRlciIsMywzODAqcC80XSxbImhhbGYteWVhciIsNiwzODAqcC8yXSxbInllYXIiLDEsMzgwKnBdXTttLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG0oe3VzZVVUQzp0LmVjTW9kZWwuZ2V0KCJ1c2VVVEMiKX0pfSx0LmV4cG9ydHM9bX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBpPShlLnZpc3VhbENvbG9yQWNjZXNzUGF0aHx8Iml0ZW1TdHlsZS5ub3JtYWwuY29sb3IiKS5zcGxpdCgiLiIpLGE9ZS5nZXREYXRhKCksbz1lLmdldChpKXx8ZS5nZXRDb2xvckZyb21QYWxldHRlKGUuZ2V0KCJuYW1lIikpO2Euc2V0VmlzdWFsKCJjb2xvciIsbyksdC5pc1Nlcmllc0ZpbHRlcmVkKGUpfHwoImZ1bmN0aW9uIiE9dHlwZW9mIG98fG8gaW5zdGFuY2VvZiBufHxhLmVhY2goZnVuY3Rpb24odCl7YS5zZXRJdGVtVmlzdWFsKHQsImNvbG9yIixvKGUuZ2V0RGF0YVBhcmFtcyh0KSkpfSksYS5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWEuZ2V0SXRlbU1vZGVsKHQpLG49ZS5nZXQoaSwhMCk7bnVsbCE9biYmYS5zZXRJdGVtVmlzdWFsKHQsImNvbG9yIixuKX0pKX10LmVhY2hSYXdTZXJpZXMoZSl9fSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLGkpe3JldHVybnt0eXBlOnQsZXZlbnQ6aSx0YXJnZXQ6ZS50YXJnZXQsdG9wVGFyZ2V0OmUudG9wVGFyZ2V0LGNhbmNlbEJ1YmJsZTohMSxvZmZzZXRYOmkuenJYLG9mZnNldFk6aS56clksZ2VzdHVyZUV2ZW50OmkuZ2VzdHVyZUV2ZW50LHBpbmNoWDppLnBpbmNoWCxwaW5jaFk6aS5waW5jaFkscGluY2hTY2FsZTppLnBpbmNoU2NhbGUsd2hlZWxEZWx0YTppLnpyRGVsdGEsenJCeVRvdWNoOmkuenJCeVRvdWNoLHdoaWNoOmkud2hpY2h9fWZ1bmN0aW9uIGEoKXt9ZnVuY3Rpb24gbyh0LGUsaSl7aWYodFt0LnJlY3RIb3Zlcj8icmVjdENvbnRhaW4iOiJjb250YWluIl0oZSxpKSl7Zm9yKHZhciBuLGE9dDthOyl7aWYoYS5jbGlwUGF0aCYmIWEuY2xpcFBhdGguY29udGFpbihlLGkpKXJldHVybiExO2Euc2lsZW50JiYobj0hMCksYT1hLnBhcmVudH1yZXR1cm4hbnx8aH1yZXR1cm4hMX12YXIgcj1pKDEpLHM9aSg2KSxsPWkoMTg1KSx1PWkoMjMpLGg9InNpbGVudCI7YS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe307dmFyIGM9WyJjbGljayIsImRibGNsaWNrIiwibW91c2V3aGVlbCIsIm1vdXNlb3V0IiwibW91c2V1cCIsIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsImNvbnRleHRtZW51Il0sZD1mdW5jdGlvbih0LGUsaSxuKXt1LmNhbGwodGhpcyksdGhpcy5zdG9yYWdlPXQsdGhpcy5wYWludGVyPWUsdGhpcy5wYWludGVyUm9vdD1uLGk9aXx8bmV3IGEsdGhpcy5wcm94eT1pLGkuaGFuZGxlcj10aGlzLHRoaXMuX2hvdmVyZWQ9e30sdGhpcy5fbGFzdFRvdWNoTW9tZW50LHRoaXMuX2xhc3RYLHRoaXMuX2xhc3RZLGwuY2FsbCh0aGlzKSxyLmVhY2goYyxmdW5jdGlvbih0KXtpLm9uJiZpLm9uKHQsdGhpc1t0XSx0aGlzKX0sdGhpcyl9O2QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkLG1vdXNlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10LnpyWCxpPXQuenJZLG49dGhpcy5faG92ZXJlZCxhPW4udGFyZ2V0O2EmJiFhLl9fenImJihuPXRoaXMuZmluZEhvdmVyKG4ueCxuLnkpLGE9bi50YXJnZXQpO3ZhciBvPXRoaXMuX2hvdmVyZWQ9dGhpcy5maW5kSG92ZXIoZSxpKSxyPW8udGFyZ2V0LHM9dGhpcy5wcm94eTtzLnNldEN1cnNvciYmcy5zZXRDdXJzb3Iocj9yLmN1cnNvcjoiZGVmYXVsdCIpLGEmJnIhPT1hJiZ0aGlzLmRpc3BhdGNoVG9FbGVtZW50KG4sIm1vdXNlb3V0Iix0KSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KG8sIm1vdXNlbW92ZSIsdCksciYmciE9PWEmJnRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQobywibW91c2VvdmVyIix0KX0sbW91c2VvdXQ6ZnVuY3Rpb24odCl7dGhpcy5kaXNwYXRjaFRvRWxlbWVudCh0aGlzLl9ob3ZlcmVkLCJtb3VzZW91dCIsdCk7dmFyIGUsaT10LnRvRWxlbWVudHx8dC5yZWxhdGVkVGFyZ2V0O2RvIGk9aSYmaS5wYXJlbnROb2RlO3doaWxlKGkmJjkhPWkubm9kZVR5cGUmJiEoZT1pPT09dGhpcy5wYWludGVyUm9vdCkpOyFlJiZ0aGlzLnRyaWdnZXIoImdsb2JhbG91dCIse2V2ZW50OnR9KX0scmVzaXplOmZ1bmN0aW9uKHQpe3RoaXMuX2hvdmVyZWQ9e319LGRpc3BhdGNoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpc1t0XTtpJiZpLmNhbGwodGhpcyxlKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMucHJveHkuZGlzcG9zZSgpLHRoaXMuc3RvcmFnZT10aGlzLnByb3h5PXRoaXMucGFpbnRlcj1udWxsfSxzZXRDdXJzb3JTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb3h5O2Uuc2V0Q3Vyc29yJiZlLnNldEN1cnNvcih0KX0sZGlzcGF0Y2hUb0VsZW1lbnQ6ZnVuY3Rpb24odCxlLGkpe3Q9dHx8e307dmFyIGE9dC50YXJnZXQ7aWYoIWF8fCFhLnNpbGVudCl7Zm9yKHZhciBvPSJvbiIrZSxyPW4oZSx0LGkpO2EmJihhW29dJiYoci5jYW5jZWxCdWJibGU9YVtvXS5jYWxsKGEscikpLGEudHJpZ2dlcihlLHIpLGE9YS5wYXJlbnQsIXIuY2FuY2VsQnViYmxlKTspO3IuY2FuY2VsQnViYmxlfHwodGhpcy50cmlnZ2VyKGUsciksdGhpcy5wYWludGVyJiZ0aGlzLnBhaW50ZXIuZWFjaE90aGVyTGF5ZXIoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbb10mJnRbb10uY2FsbCh0LHIpLHQudHJpZ2dlciYmdC50cmlnZ2VyKGUscil9KSl9fSxmaW5kSG92ZXI6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj10aGlzLnN0b3JhZ2UuZ2V0RGlzcGxheUxpc3QoKSxhPXt4OnQseTplfSxyPW4ubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBzO2lmKG5bcl0hPT1pJiYhbltyXS5pZ25vcmUmJihzPW8obltyXSx0LGUpKSYmKCFhLnRvcFRhcmdldCYmKGEudG9wVGFyZ2V0PW5bcl0pLHMhPT1oKSl7YS50YXJnZXQ9bltyXTticmVha319cmV0dXJuIGF9fSxyLmVhY2goWyJjbGljayIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJtb3VzZXdoZWVsIiwiZGJsY2xpY2siLCJjb250ZXh0bWVudSJdLGZ1bmN0aW9uKHQpe2QucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuZmluZEhvdmVyKGUuenJYLGUuenJZKSxuPWkudGFyZ2V0O2lmKCJtb3VzZWRvd24iPT09dCl0aGlzLl9kb3duRWw9bix0aGlzLl9kb3duUG9pbnQ9W2UuenJYLGUuenJZXSx0aGlzLl91cEVsPW47ZWxzZSBpZigibW9zdWV1cCI9PT10KXRoaXMuX3VwRWw9bjtlbHNlIGlmKCJjbGljayI9PT10KXtpZih0aGlzLl9kb3duRWwhPT10aGlzLl91cEVsfHwhdGhpcy5fZG93blBvaW50fHxzLmRpc3QodGhpcy5fZG93blBvaW50LFtlLnpyWCxlLnpyWV0pPjQpcmV0dXJuO3RoaXMuX2Rvd25Qb2ludD1udWxsfXRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQoaSx0LGUpfX0pLHIubWl4aW4oZCx1KSxyLm1peGluKGQsbCksdC5leHBvcnRzPWR9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7cmV0dXJuITF9ZnVuY3Rpb24gYSh0LGUsaSxuKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLG89aS5nZXRXaWR0aCgpLHI9aS5nZXRIZWlnaHQoKSxzPWEuc3R5bGU7cmV0dXJuIHMucG9zaXRpb249ImFic29sdXRlIixzLmxlZnQ9MCxzLnRvcD0wLHMud2lkdGg9bysicHgiLHMuaGVpZ2h0PXIrInB4IixhLndpZHRoPW8qbixhLmhlaWdodD1yKm4sYS5zZXRBdHRyaWJ1dGUoImRhdGEtenItZG9tLWlkIix0KSxhfXZhciBvPWkoMSkscj1pKDM1KSxzPWkoNzYpLGw9aSg3NSksdT1mdW5jdGlvbih0LGUsaSl7dmFyIHM7aT1pfHxyLmRldmljZVBpeGVsUmF0aW8sInN0cmluZyI9PXR5cGVvZiB0P3M9YSh0LCJjYW52YXMiLGUsaSk6by5pc09iamVjdCh0KSYmKHM9dCx0PXMuaWQpLHRoaXMuaWQ9dCx0aGlzLmRvbT1zO3ZhciBsPXMuc3R5bGU7bCYmKHMub25zZWxlY3RzdGFydD1uLGxbIi13ZWJraXQtdXNlci1zZWxlY3QiXT0ibm9uZSIsbFsidXNlci1zZWxlY3QiXT0ibm9uZSIsbFsiLXdlYmtpdC10b3VjaC1jYWxsb3V0Il09Im5vbmUiLGxbIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciJdPSJyZ2JhKDAsMCwwLDApIixsLnBhZGRpbmc9MCxsLm1hcmdpbj0wLGxbImJvcmRlci13aWR0aCJdPTApLHRoaXMuZG9tQmFjaz1udWxsLHRoaXMuY3R4QmFjaz1udWxsLHRoaXMucGFpbnRlcj1lLHRoaXMuY29uZmlnPW51bGwsdGhpcy5jbGVhckNvbG9yPTAsdGhpcy5tb3Rpb25CbHVyPSExLHRoaXMubGFzdEZyYW1lQWxwaGE9LjcsdGhpcy5kcHI9aX07dS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnUsZWxDb3VudDowLF9fZGlydHk6ITAsaW5pdENvbnRleHQ6ZnVuY3Rpb24oKXt0aGlzLmN0eD10aGlzLmRvbS5nZXRDb250ZXh0KCIyZCIpLHRoaXMuY3R4Ll9fY3VycmVudFZhbHVlcz17fSx0aGlzLmN0eC5kcHI9dGhpcy5kcHJ9LGNyZWF0ZUJhY2tCdWZmZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRwcjt0aGlzLmRvbUJhY2s9YSgiYmFjay0iK3RoaXMuaWQsImNhbnZhcyIsdGhpcy5wYWludGVyLHQpLHRoaXMuY3R4QmFjaz10aGlzLmRvbUJhY2suZ2V0Q29udGV4dCgiMmQiKSx0aGlzLmN0eEJhY2suX19jdXJyZW50VmFsdWVzPXt9LDEhPXQmJnRoaXMuY3R4QmFjay5zY2FsZSh0LHQpfSxyZXNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmRwcixuPXRoaXMuZG9tLGE9bi5zdHlsZSxvPXRoaXMuZG9tQmFjazthLndpZHRoPXQrInB4IixhLmhlaWdodD1lKyJweCIsbi53aWR0aD10Kmksbi5oZWlnaHQ9ZSppLG8mJihvLndpZHRoPXQqaSxvLmhlaWdodD1lKmksMSE9aSYmdGhpcy5jdHhCYWNrLnNjYWxlKGksaSkpfSxjbGVhcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmRvbSxpPXRoaXMuY3R4LG49ZS53aWR0aCxhPWUuaGVpZ2h0LG89dGhpcy5jbGVhckNvbG9yLHI9dGhpcy5tb3Rpb25CbHVyJiYhdCx1PXRoaXMubGFzdEZyYW1lQWxwaGEsaD10aGlzLmRwcjtpZihyJiYodGhpcy5kb21CYWNrfHx0aGlzLmNyZWF0ZUJhY2tCdWZmZXIoKSx0aGlzLmN0eEJhY2suZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLmN0eEJhY2suZHJhd0ltYWdlKGUsMCwwLG4vaCxhL2gpKSxpLmNsZWFyUmVjdCgwLDAsbixhKSxvKXt2YXIgYztvLmNvbG9yU3RvcHM/KGM9by5fX2NhbnZhc0dyYWRpZW50fHxzLmdldEdyYWRpZW50KGksbyx7eDowLHk6MCx3aWR0aDpuLGhlaWdodDphfSksby5fX2NhbnZhc0dyYWRpZW50PWMpOm8uaW1hZ2UmJihjPWwucHJvdG90eXBlLmdldENhbnZhc1BhdHRlcm4uY2FsbChvLGkpKSxpLnNhdmUoKSxpLmZpbGxTdHlsZT1jfHxvLGkuZmlsbFJlY3QoMCwwLG4sYSksaS5yZXN0b3JlKCl9aWYocil7dmFyIGQ9dGhpcy5kb21CYWNrO2kuc2F2ZSgpLGkuZ2xvYmFsQWxwaGE9dSxpLmRyYXdJbWFnZShkLDAsMCxuLGEpLGkucmVzdG9yZSgpfX19LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGEodCl7cmV0dXJuISF0JiYoISF0Ll9fYnVpbHRpbl9ffHwiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXNpemUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlZnJlc2gpfWZ1bmN0aW9uIG8odCl7dC5fX3VudXNlZENvdW50Kyt9ZnVuY3Rpb24gcih0KXsxPT10Ll9fdW51c2VkQ291bnQmJnQuY2xlYXIoKX1mdW5jdGlvbiBzKHQsZSxpKXtyZXR1cm4geC5jb3B5KHQuZ2V0Qm91bmRpbmdSZWN0KCkpLHQudHJhbnNmb3JtJiZ4LmFwcGx5VHJhbnNmb3JtKHQudHJhbnNmb3JtKSxfLndpZHRoPWUsXy5oZWlnaHQ9aSwheC5pbnRlcnNlY3QoXyl9ZnVuY3Rpb24gbCh0LGUpe2lmKHQ9PWUpcmV0dXJuITE7aWYoIXR8fCFlfHx0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHRbaV0hPT1lW2ldKXJldHVybiEwfWZ1bmN0aW9uIHUodCxlKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG49dFtpXTtuLnNldFRyYW5zZm9ybShlKSxlLmJlZ2luUGF0aCgpLG4uYnVpbGRQYXRoKGUsbi5zaGFwZSksZS5jbGlwKCksbi5yZXN0b3JlVHJhbnNmb3JtKGUpfX1mdW5jdGlvbiBoKHQsZSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGkuc3R5bGUuY3NzVGV4dD1bInBvc2l0aW9uOnJlbGF0aXZlIiwib3ZlcmZsb3c6aGlkZGVuIiwid2lkdGg6Iit0KyJweCIsImhlaWdodDoiK2UrInB4IiwicGFkZGluZzowIiwibWFyZ2luOjAiLCJib3JkZXItd2lkdGg6MCJdLmpvaW4oIjsiKSsiOyIsaX12YXIgYz1pKDM1KSxkPWkoMSksZj1pKDU0KSxwPWkoMTIpLGc9aSg1MiksbT1pKDE2MCksdj1pKDcxKSx5PTUseD1uZXcgcCgwLDAsMCwwKSxfPW5ldyBwKDAsMCwwLDApLGI9ZnVuY3Rpb24odCxlLGkpe3RoaXMudHlwZT0iY2FudmFzIjt2YXIgbj0hdC5ub2RlTmFtZXx8IkNBTlZBUyI9PT10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7dGhpcy5fb3B0cz1pPWQuZXh0ZW5kKHt9LGl8fHt9KSx0aGlzLmRwcj1pLmRldmljZVBpeGVsUmF0aW98fGMuZGV2aWNlUGl4ZWxSYXRpbyx0aGlzLl9zaW5nbGVDYW52YXM9bix0aGlzLnJvb3Q9dDt2YXIgYT10LnN0eWxlO2EmJihhWyItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiXT0idHJhbnNwYXJlbnQiLGFbIi13ZWJraXQtdXNlci1zZWxlY3QiXT1hWyJ1c2VyLXNlbGVjdCJdPWFbIi13ZWJraXQtdG91Y2gtY2FsbG91dCJdPSJub25lIix0LmlubmVySFRNTD0iIiksdGhpcy5zdG9yYWdlPWU7dmFyIG89dGhpcy5femxldmVsTGlzdD1bXSxyPXRoaXMuX2xheWVycz17fTtpZih0aGlzLl9sYXllckNvbmZpZz17fSxuKXtudWxsIT1pLndpZHRoJiYodC53aWR0aD1pLndpZHRoKSxudWxsIT1pLmhlaWdodCYmKHQuaGVpZ2h0PWkuaGVpZ2h0KTt2YXIgcz10LndpZHRoLGw9dC5oZWlnaHQ7dGhpcy5fd2lkdGg9cyx0aGlzLl9oZWlnaHQ9bDt2YXIgdT1uZXcgbSh0LHRoaXMsMSk7dS5pbml0Q29udGV4dCgpLHJbMF09dSxvLnB1c2goMCksdGhpcy5fZG9tUm9vdD10fWVsc2V7dGhpcy5fd2lkdGg9dGhpcy5fZ2V0U2l6ZSgwKSx0aGlzLl9oZWlnaHQ9dGhpcy5fZ2V0U2l6ZSgxKTt2YXIgZj10aGlzLl9kb21Sb290PWgodGhpcy5fd2lkdGgsdGhpcy5faGVpZ2h0KTt0LmFwcGVuZENoaWxkKGYpfXRoaXMuX3Byb2dyZXNzaXZlTGF5ZXJzPVtdLHRoaXMuX2hvdmVybGF5ZXIsdGhpcy5faG92ZXJFbGVtZW50cz1bXX07Yi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmIsZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiJjYW52YXMifSxpc1NpbmdsZUNhbnZhczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaW5nbGVDYW52YXN9LGdldFZpZXdwb3J0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb21Sb290fSxnZXRWaWV3cG9ydFJvb3RPZmZzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFZpZXdwb3J0Um9vdCgpO2lmKHQpcmV0dXJue29mZnNldExlZnQ6dC5vZmZzZXRMZWZ0fHwwLG9mZnNldFRvcDp0Lm9mZnNldFRvcHx8MH19LHJlZnJlc2g6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCEwKSxpPXRoaXMuX3psZXZlbExpc3Q7dGhpcy5fcGFpbnRMaXN0KGUsdCk7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBhPWlbbl0sbz10aGlzLl9sYXllcnNbYV07IW8uX19idWlsdGluX18mJm8ucmVmcmVzaCYmby5yZWZyZXNoKCl9cmV0dXJuIHRoaXMucmVmcmVzaEhvdmVyKCksdGhpcy5fcHJvZ3Jlc3NpdmVMYXllcnMubGVuZ3RoJiZ0aGlzLl9zdGFydFByb2dlc3NpdmUoKSx0aGlzfSxhZGRIb3ZlcjpmdW5jdGlvbih0LGUpe2lmKCF0Ll9faG92ZXJNaXIpe3ZhciBpPW5ldyB0LmNvbnN0cnVjdG9yKHtzdHlsZTp0LnN0eWxlLHNoYXBlOnQuc2hhcGV9KTtpLl9fZnJvbT10LHQuX19ob3Zlck1pcj1pLGkuc2V0U3R5bGUoZSksdGhpcy5faG92ZXJFbGVtZW50cy5wdXNoKGkpfX0scmVtb3ZlSG92ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dC5fX2hvdmVyTWlyLGk9dGhpcy5faG92ZXJFbGVtZW50cyxuPWQuaW5kZXhPZihpLGUpO24+PTAmJmkuc3BsaWNlKG4sMSksdC5fX2hvdmVyTWlyPW51bGx9LGNsZWFySG92ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2hvdmVyRWxlbWVudHMsaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldLl9fZnJvbTtuJiYobi5fX2hvdmVyTWlyPW51bGwpfWUubGVuZ3RoPTB9LHJlZnJlc2hIb3ZlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2hvdmVyRWxlbWVudHMsZT10Lmxlbmd0aCxpPXRoaXMuX2hvdmVybGF5ZXI7aWYoaSYmaS5jbGVhcigpLGUpe2codCx0aGlzLnN0b3JhZ2UuZGlzcGxheWFibGVTb3J0RnVuYyksaXx8KGk9dGhpcy5faG92ZXJsYXllcj10aGlzLmdldExheWVyKDFlNSkpO3ZhciBuPXt9O2kuY3R4LnNhdmUoKTtmb3IodmFyIGE9MDthPGU7KXt2YXIgbz10W2FdLHI9by5fX2Zyb207ciYmci5fX3pyPyhhKyssci5pbnZpc2libGV8fChvLnRyYW5zZm9ybT1yLnRyYW5zZm9ybSxvLmludlRyYW5zZm9ybT1yLmludlRyYW5zZm9ybSxvLl9fY2xpcFBhdGhzPXIuX19jbGlwUGF0aHMsdGhpcy5fZG9QYWludEVsKG8saSwhMCxuKSkpOih0LnNwbGljZShhLDEpLHIuX19ob3Zlck1pcj1udWxsLGUtLSl9aS5jdHgucmVzdG9yZSgpfX0sX3N0YXJ0UHJvZ2Vzc2l2ZTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpPT09ZS5fcHJvZ3Jlc3NpdmVUb2tlbiYmZS5zdG9yYWdlJiYoZS5fZG9QYWludExpc3QoZS5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCkpLGUuX2Z1cnRoZXJQcm9ncmVzc2l2ZT8oZS5fcHJvZ3Jlc3MrKyx2KHQpKTplLl9wcm9ncmVzc2l2ZVRva2VuPS0xKX12YXIgZT10aGlzO2lmKGUuX2Z1cnRoZXJQcm9ncmVzc2l2ZSl7dmFyIGk9ZS5fcHJvZ3Jlc3NpdmVUb2tlbj0rbmV3IERhdGU7ZS5fcHJvZ3Jlc3MrKyx2KHQpfX0sX2NsZWFyUHJvZ3Jlc3NpdmU6ZnVuY3Rpb24oKXt0aGlzLl9wcm9ncmVzc2l2ZVRva2VuPS0xLHRoaXMuX3Byb2dyZXNzPTAsZC5lYWNoKHRoaXMuX3Byb2dyZXNzaXZlTGF5ZXJzLGZ1bmN0aW9uKHQpe3QuX19kaXJ0eSYmdC5jbGVhcigpfSl9LF9wYWludExpc3Q6ZnVuY3Rpb24odCxlKXsKbnVsbD09ZSYmKGU9ITEpLHRoaXMuX3VwZGF0ZUxheWVyU3RhdHVzKHQpLHRoaXMuX2NsZWFyUHJvZ3Jlc3NpdmUoKSx0aGlzLmVhY2hCdWlsdGluTGF5ZXIobyksdGhpcy5fZG9QYWludExpc3QodCxlKSx0aGlzLmVhY2hCdWlsdGluTGF5ZXIocil9LF9kb1BhaW50TGlzdDpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dmFyIGU9by5kcHJ8fDE7by5zYXZlKCksby5nbG9iYWxBbHBoYT0xLG8uc2hhZG93Qmx1cj0wLG4uX19kaXJ0eT0hMCxvLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksby5kcmF3SW1hZ2UodC5kb20sMCwwLGgqZSxjKmUpLG8ucmVzdG9yZSgpfWZvcih2YXIgbixhLG8scixzLGwsdT0wLGg9dGhpcy5fd2lkdGgsYz10aGlzLl9oZWlnaHQscD10aGlzLl9wcm9ncmVzcyxnPTAsbT10Lmxlbmd0aDtnPG07ZysrKXt2YXIgdj10W2ddLHg9dGhpcy5fc2luZ2xlQ2FudmFzPzA6di56bGV2ZWwsXz12Ll9fZnJhbWU7aWYoXzwwJiZzJiYoaShzKSxzPW51bGwpLGEhPT14JiYobyYmby5yZXN0b3JlKCkscj17fSxhPXgsbj10aGlzLmdldExheWVyKGEpLG4uX19idWlsdGluX198fGYoIlpMZXZlbCAiK2ErIiBoYXMgYmVlbiB1c2VkIGJ5IHVua293biBsYXllciAiK24uaWQpLG89bi5jdHgsby5zYXZlKCksbi5fX3VudXNlZENvdW50PTAsKG4uX19kaXJ0eXx8ZSkmJm4uY2xlYXIoKSksbi5fX2RpcnR5fHxlKXtpZihfPj0wKXtpZighcyl7aWYocz10aGlzLl9wcm9ncmVzc2l2ZUxheWVyc1tNYXRoLm1pbih1KysseS0xKV0scy5jdHguc2F2ZSgpLHMucmVuZGVyU2NvcGU9e30scyYmcy5fX3Byb2dyZXNzPnMuX19tYXhQcm9ncmVzcyl7Zz1zLl9fbmV4dElkeE5vdFByb2ctMTtjb250aW51ZX1sPXMuX19wcm9ncmVzcyxzLl9fZGlydHl8fChwPWwpLHMuX19wcm9ncmVzcz1wKzF9Xz09PXAmJnRoaXMuX2RvUGFpbnRFbCh2LHMsITAscy5yZW5kZXJTY29wZSl9ZWxzZSB0aGlzLl9kb1BhaW50RWwodixuLGUscik7di5fX2RpcnR5PSExfX1zJiZpKHMpLG8mJm8ucmVzdG9yZSgpLHRoaXMuX2Z1cnRoZXJQcm9ncmVzc2l2ZT0hMSxkLmVhY2godGhpcy5fcHJvZ3Jlc3NpdmVMYXllcnMsZnVuY3Rpb24odCl7dC5fX21heFByb2dyZXNzPj10Ll9fcHJvZ3Jlc3MmJih0aGlzLl9mdXJ0aGVyUHJvZ3Jlc3NpdmU9ITApfSx0aGlzKX0sX2RvUGFpbnRFbDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1lLmN0eCxvPXQudHJhbnNmb3JtO2lmKChlLl9fZGlydHl8fGkpJiYhdC5pbnZpc2libGUmJjAhPT10LnN0eWxlLm9wYWNpdHkmJighb3x8b1swXXx8b1szXSkmJighdC5jdWxsaW5nfHwhcyh0LHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCkpKXt2YXIgcj10Ll9fY2xpcFBhdGhzOyhuLnByZXZDbGlwTGF5ZXIhPT1lfHxsKHIsbi5wcmV2RWxDbGlwUGF0aHMpKSYmKG4ucHJldkVsQ2xpcFBhdGhzJiYobi5wcmV2Q2xpcExheWVyLmN0eC5yZXN0b3JlKCksbi5wcmV2Q2xpcExheWVyPW4ucHJldkVsQ2xpcFBhdGhzPW51bGwsbi5wcmV2RWw9bnVsbCksciYmKGEuc2F2ZSgpLHUocixhKSxuLnByZXZDbGlwTGF5ZXI9ZSxuLnByZXZFbENsaXBQYXRocz1yKSksdC5iZWZvcmVCcnVzaCYmdC5iZWZvcmVCcnVzaChhKSx0LmJydXNoKGEsbi5wcmV2RWx8fG51bGwpLG4ucHJldkVsPXQsdC5hZnRlckJydXNoJiZ0LmFmdGVyQnJ1c2goYSl9fSxnZXRMYXllcjpmdW5jdGlvbih0KXtpZih0aGlzLl9zaW5nbGVDYW52YXMpcmV0dXJuIHRoaXMuX2xheWVyc1swXTt2YXIgZT10aGlzLl9sYXllcnNbdF07cmV0dXJuIGV8fChlPW5ldyBtKCJ6cl8iK3QsdGhpcyx0aGlzLmRwciksZS5fX2J1aWx0aW5fXz0hMCx0aGlzLl9sYXllckNvbmZpZ1t0XSYmZC5tZXJnZShlLHRoaXMuX2xheWVyQ29uZmlnW3RdLCEwKSx0aGlzLmluc2VydExheWVyKHQsZSksZS5pbml0Q29udGV4dCgpKSxlfSxpbnNlcnRMYXllcjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2xheWVycyxuPXRoaXMuX3psZXZlbExpc3Qsbz1uLmxlbmd0aCxyPW51bGwscz0tMSxsPXRoaXMuX2RvbVJvb3Q7aWYoaVt0XSlyZXR1cm4gdm9pZCBmKCJaTGV2ZWwgIit0KyIgaGFzIGJlZW4gdXNlZCBhbHJlYWR5Iik7aWYoIWEoZSkpcmV0dXJuIHZvaWQgZigiTGF5ZXIgb2YgemxldmVsICIrdCsiIGlzIG5vdCB2YWxpZCIpO2lmKG8+MCYmdD5uWzBdKXtmb3Iocz0wO3M8by0xJiYhKG5bc108dCYmbltzKzFdPnQpO3MrKyk7cj1pW25bc11dfWlmKG4uc3BsaWNlKHMrMSwwLHQpLGlbdF09ZSwhZS52aXJ0dWFsKWlmKHIpe3ZhciB1PXIuZG9tO3UubmV4dFNpYmxpbmc/bC5pbnNlcnRCZWZvcmUoZS5kb20sdS5uZXh0U2libGluZyk6bC5hcHBlbmRDaGlsZChlLmRvbSl9ZWxzZSBsLmZpcnN0Q2hpbGQ/bC5pbnNlcnRCZWZvcmUoZS5kb20sbC5maXJzdENoaWxkKTpsLmFwcGVuZENoaWxkKGUuZG9tKX0sZWFjaExheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGksbixhPXRoaXMuX3psZXZlbExpc3Q7Zm9yKG49MDtuPGEubGVuZ3RoO24rKylpPWFbbl0sdC5jYWxsKGUsdGhpcy5fbGF5ZXJzW2ldLGkpfSxlYWNoQnVpbHRpbkxheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGksbixhLG89dGhpcy5femxldmVsTGlzdDtmb3IoYT0wO2E8by5sZW5ndGg7YSsrKW49b1thXSxpPXRoaXMuX2xheWVyc1tuXSxpLl9fYnVpbHRpbl9fJiZ0LmNhbGwoZSxpLG4pfSxlYWNoT3RoZXJMYXllcjpmdW5jdGlvbih0LGUpe3ZhciBpLG4sYSxvPXRoaXMuX3psZXZlbExpc3Q7Zm9yKGE9MDthPG8ubGVuZ3RoO2ErKyluPW9bYV0saT10aGlzLl9sYXllcnNbbl0saS5fX2J1aWx0aW5fX3x8dC5jYWxsKGUsaSxuKX0sZ2V0TGF5ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xheWVyc30sX3VwZGF0ZUxheWVyU3RhdHVzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2xheWVycyxpPXRoaXMuX3Byb2dyZXNzaXZlTGF5ZXJzLG49e30sYT17fTt0aGlzLmVhY2hCdWlsdGluTGF5ZXIoZnVuY3Rpb24odCxlKXtuW2VdPXQuZWxDb3VudCx0LmVsQ291bnQ9MCx0Ll9fZGlydHk9ITF9KSxkLmVhY2goaSxmdW5jdGlvbih0LGUpe2FbZV09dC5lbENvdW50LHQuZWxDb3VudD0wLHQuX19kaXJ0eT0hMX0pO2Zvcih2YXIgbyxyLHM9MCxsPTAsdT0wLGg9dC5sZW5ndGg7dTxoO3UrKyl7dmFyIGM9dFt1XSxmPXRoaXMuX3NpbmdsZUNhbnZhcz8wOmMuemxldmVsLHA9ZVtmXSxnPWMucHJvZ3Jlc3NpdmU7aWYocCYmKHAuZWxDb3VudCsrLHAuX19kaXJ0eT1wLl9fZGlydHl8fGMuX19kaXJ0eSksZz49MCl7ciE9PWcmJihyPWcsbCsrKTt2YXIgdj1jLl9fZnJhbWU9bC0xO2lmKCFvKXt2YXIgeD1NYXRoLm1pbihzLHktMSk7bz1pW3hdLG98fChvPWlbeF09bmV3IG0oInByb2dyZXNzaXZlIix0aGlzLHRoaXMuZHByKSxvLmluaXRDb250ZXh0KCkpLG8uX19tYXhQcm9ncmVzcz0wfW8uX19kaXJ0eT1vLl9fZGlydHl8fGMuX19kaXJ0eSxvLmVsQ291bnQrKyxvLl9fbWF4UHJvZ3Jlc3M9TWF0aC5tYXgoby5fX21heFByb2dyZXNzLHYpLG8uX19tYXhQcm9ncmVzcz49by5fX3Byb2dyZXNzJiYocC5fX2RpcnR5PSEwKX1lbHNlIGMuX19mcmFtZT0tMSxvJiYoby5fX25leHRJZHhOb3RQcm9nPXUscysrLG89bnVsbCl9byYmKHMrKyxvLl9fbmV4dElkeE5vdFByb2c9dSksdGhpcy5lYWNoQnVpbHRpbkxheWVyKGZ1bmN0aW9uKHQsZSl7bltlXSE9PXQuZWxDb3VudCYmKHQuX19kaXJ0eT0hMCl9KSxpLmxlbmd0aD1NYXRoLm1pbihzLHkpLGQuZWFjaChpLGZ1bmN0aW9uKHQsZSl7YVtlXSE9PXQuZWxDb3VudCYmKGMuX19kaXJ0eT0hMCksdC5fX2RpcnR5JiYodC5fX3Byb2dyZXNzPTApfSl9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEJ1aWx0aW5MYXllcih0aGlzLl9jbGVhckxheWVyKSx0aGlzfSxfY2xlYXJMYXllcjpmdW5jdGlvbih0KXt0LmNsZWFyKCl9LGNvbmZpZ0xheWVyOmZ1bmN0aW9uKHQsZSl7aWYoZSl7dmFyIGk9dGhpcy5fbGF5ZXJDb25maWc7aVt0XT9kLm1lcmdlKGlbdF0sZSwhMCk6aVt0XT1lO3ZhciBuPXRoaXMuX2xheWVyc1t0XTtuJiZkLm1lcmdlKG4saVt0XSwhMCl9fSxkZWxMYXllcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXllcnMsaT10aGlzLl96bGV2ZWxMaXN0LG49ZVt0XTtuJiYobi5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuLmRvbSksZGVsZXRlIGVbdF0saS5zcGxpY2UoZC5pbmRleE9mKGksdCksMSkpfSxyZXNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9kb21Sb290O2kuc3R5bGUuZGlzcGxheT0ibm9uZSI7dmFyIG49dGhpcy5fb3B0cztpZihudWxsIT10JiYobi53aWR0aD10KSxudWxsIT1lJiYobi5oZWlnaHQ9ZSksdD10aGlzLl9nZXRTaXplKDApLGU9dGhpcy5fZ2V0U2l6ZSgxKSxpLnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5fd2lkdGghPXR8fGUhPXRoaXMuX2hlaWdodCl7aS5zdHlsZS53aWR0aD10KyJweCIsaS5zdHlsZS5oZWlnaHQ9ZSsicHgiO2Zvcih2YXIgYSBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ0aGlzLl9sYXllcnNbYV0ucmVzaXplKHQsZSk7ZC5lYWNoKHRoaXMuX3Byb2dyZXNzaXZlTGF5ZXJzLGZ1bmN0aW9uKGkpe2kucmVzaXplKHQsZSl9KSx0aGlzLnJlZnJlc2goITApfXJldHVybiB0aGlzLl93aWR0aD10LHRoaXMuX2hlaWdodD1lLHRoaXN9LGNsZWFyTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbGF5ZXJzW3RdO2UmJmUuY2xlYXIoKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMucm9vdC5pbm5lckhUTUw9IiIsdGhpcy5yb290PXRoaXMuc3RvcmFnZT10aGlzLl9kb21Sb290PXRoaXMuX2xheWVycz1udWxsfSxnZXRSZW5kZXJlZENhbnZhczpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSl7dmFyIG49ci5femxldmVsTGlzdDtudWxsPT10JiYodD0tKDEvMCkpO2Zvcih2YXIgYSxvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciBzPW5bb10sbD1yLl9sYXllcnNbc107aWYoIWwuX19idWlsdGluX18mJnM+dCYmczxlKXthPWw7YnJlYWt9fWEmJmEucmVuZGVyVG9DYW52YXMmJihpLmN0eC5zYXZlKCksYS5yZW5kZXJUb0NhbnZhcyhpLmN0eCksaS5jdHgucmVzdG9yZSgpKX1pZih0PXR8fHt9LHRoaXMuX3NpbmdsZUNhbnZhcylyZXR1cm4gdGhpcy5fbGF5ZXJzWzBdLmRvbTt2YXIgaT1uZXcgbSgiaW1hZ2UiLHRoaXMsdC5waXhlbFJhdGlvfHx0aGlzLmRwcik7aS5pbml0Q29udGV4dCgpLGkuY2xlYXJDb2xvcj10LmJhY2tncm91bmRDb2xvcixpLmNsZWFyKCk7Zm9yKHZhciBuLGE9dGhpcy5zdG9yYWdlLmdldERpc3BsYXlMaXN0KCEwKSxvPXt9LHI9dGhpcyxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc107bC56bGV2ZWwhPT1uJiYoZShuLGwuemxldmVsKSxuPWwuemxldmVsKSx0aGlzLl9kb1BhaW50RWwobCxpLCEwLG8pfXJldHVybiBlKG4sMS8wKSxpLmRvbX0sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9LF9nZXRTaXplOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29wdHMsaT1bIndpZHRoIiwiaGVpZ2h0Il1bdF0sYT1bImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0Il1bdF0sbz1bInBhZGRpbmdMZWZ0IiwicGFkZGluZ1RvcCJdW3RdLHI9WyJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIl1bdF07aWYobnVsbCE9ZVtpXSYmImF1dG8iIT09ZVtpXSlyZXR1cm4gcGFyc2VGbG9hdChlW2ldKTt2YXIgcz10aGlzLnJvb3QsbD1kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHMpO3JldHVybihzW2FdfHxuKGxbaV0pfHxuKHMuc3R5bGVbaV0pKS0obihsW29dKXx8MCktKG4obFtyXSl8fDApfDB9LHBhdGhUb0ltYWdlOmZ1bmN0aW9uKHQsZSl7ZT1lfHx0aGlzLmRwcjt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxhPW4uZ2V0Q29udGV4dCgiMmQiKSxvPXQuZ2V0Qm91bmRpbmdSZWN0KCkscj10LnN0eWxlLHM9ci5zaGFkb3dCbHVyLGw9ci5zaGFkb3dPZmZzZXRYLHU9ci5zaGFkb3dPZmZzZXRZLGg9ci5oYXNTdHJva2UoKT9yLmxpbmVXaWR0aDowLGM9TWF0aC5tYXgoaC8yLC1sK3MpLGQ9TWF0aC5tYXgoaC8yLGwrcyksZj1NYXRoLm1heChoLzIsLXUrcykscD1NYXRoLm1heChoLzIsdStzKSxnPW8ud2lkdGgrYytkLG09by5oZWlnaHQrZitwO24ud2lkdGg9ZyplLG4uaGVpZ2h0PW0qZSxhLnNjYWxlKGUsZSksYS5jbGVhclJlY3QoMCwwLGcsbSksYS5kcHI9ZTt2YXIgdj17cG9zaXRpb246dC5wb3NpdGlvbixyb3RhdGlvbjp0LnJvdGF0aW9uLHNjYWxlOnQuc2NhbGV9O3QucG9zaXRpb249W2Mtby54LGYtby55XSx0LnJvdGF0aW9uPTAsdC5zY2FsZT1bMSwxXSx0LnVwZGF0ZVRyYW5zZm9ybSgpLHQmJnQuYnJ1c2goYSk7dmFyIHk9aSg1NSkseD1uZXcgeSh7c3R5bGU6e3g6MCx5OjAsaW1hZ2U6bn19KTtyZXR1cm4gbnVsbCE9di5wb3NpdGlvbiYmKHgucG9zaXRpb249dC5wb3NpdGlvbj12LnBvc2l0aW9uKSxudWxsIT12LnJvdGF0aW9uJiYoeC5yb3RhdGlvbj10LnJvdGF0aW9uPXYucm90YXRpb24pLG51bGwhPXYuc2NhbGUmJih4LnNjYWxlPXQuc2NhbGU9di5zY2FsZSkseH19LHQuZXhwb3J0cz1ifSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdC56bGV2ZWw9PT1lLnpsZXZlbD90Lno9PT1lLno/dC56Mi1lLnoyOnQuei1lLno6dC56bGV2ZWwtZS56bGV2ZWx9dmFyIGE9aSgxKSxvPWkoMTApLHI9aSgzNikscz1pKDUyKSxsPWZ1bmN0aW9uKCl7dGhpcy5fcm9vdHM9W10sdGhpcy5fZGlzcGxheUxpc3Q9W10sdGhpcy5fZGlzcGxheUxpc3RMZW49MH07bC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmwsdHJhdmVyc2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MDtpPHRoaXMuX3Jvb3RzLmxlbmd0aDtpKyspdGhpcy5fcm9vdHNbaV0udHJhdmVyc2UodCxlKX0sZ2V0RGlzcGxheUxpc3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lfHwhMSx0JiZ0aGlzLnVwZGF0ZURpc3BsYXlMaXN0KGUpLHRoaXMuX2Rpc3BsYXlMaXN0fSx1cGRhdGVEaXNwbGF5TGlzdDpmdW5jdGlvbih0KXt0aGlzLl9kaXNwbGF5TGlzdExlbj0wO2Zvcih2YXIgZT10aGlzLl9yb290cyxpPXRoaXMuX2Rpc3BsYXlMaXN0LGE9MCxyPWUubGVuZ3RoO2E8cjthKyspdGhpcy5fdXBkYXRlQW5kQWRkRGlzcGxheWFibGUoZVthXSxudWxsLHQpO2kubGVuZ3RoPXRoaXMuX2Rpc3BsYXlMaXN0TGVuLG8uY2FudmFzU3VwcG9ydGVkJiZzKGksbil9LF91cGRhdGVBbmRBZGREaXNwbGF5YWJsZTpmdW5jdGlvbih0LGUsaSl7aWYoIXQuaWdub3JlfHxpKXt0LmJlZm9yZVVwZGF0ZSgpLHQuX19kaXJ0eSYmdC51cGRhdGUoKSx0LmFmdGVyVXBkYXRlKCk7dmFyIG49dC5jbGlwUGF0aDtpZihuKXtlPWU/ZS5zbGljZSgpOltdO2Zvcih2YXIgYT1uLG89dDthOylhLnBhcmVudD1vLGEudXBkYXRlVHJhbnNmb3JtKCksZS5wdXNoKGEpLG89YSxhPWEuY2xpcFBhdGh9aWYodC5pc0dyb3VwKXtmb3IodmFyIHI9dC5fY2hpbGRyZW4scz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgbD1yW3NdO3QuX19kaXJ0eSYmKGwuX19kaXJ0eT0hMCksdGhpcy5fdXBkYXRlQW5kQWRkRGlzcGxheWFibGUobCxlLGkpfXQuX19kaXJ0eT0hMX1lbHNlIHQuX19jbGlwUGF0aHM9ZSx0aGlzLl9kaXNwbGF5TGlzdFt0aGlzLl9kaXNwbGF5TGlzdExlbisrXT10fX0sYWRkUm9vdDpmdW5jdGlvbih0KXt0Ll9fc3RvcmFnZSE9PXRoaXMmJih0IGluc3RhbmNlb2YgciYmdC5hZGRDaGlsZHJlblRvU3RvcmFnZSh0aGlzKSx0aGlzLmFkZFRvU3RvcmFnZSh0KSx0aGlzLl9yb290cy5wdXNoKHQpKX0sZGVsUm9vdDpmdW5jdGlvbih0KXtpZihudWxsPT10KXtmb3IodmFyIGU9MDtlPHRoaXMuX3Jvb3RzLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuX3Jvb3RzW2VdO2kgaW5zdGFuY2VvZiByJiZpLmRlbENoaWxkcmVuRnJvbVN0b3JhZ2UodGhpcyl9cmV0dXJuIHRoaXMuX3Jvb3RzPVtdLHRoaXMuX2Rpc3BsYXlMaXN0PVtdLHZvaWQodGhpcy5fZGlzcGxheUxpc3RMZW49MCl9aWYodCBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmRlbFJvb3QodFtlXSk7ZWxzZXt2YXIgbz1hLmluZGV4T2YodGhpcy5fcm9vdHMsdCk7bz49MCYmKHRoaXMuZGVsRnJvbVN0b3JhZ2UodCksdGhpcy5fcm9vdHMuc3BsaWNlKG8sMSksdCBpbnN0YW5jZW9mIHImJnQuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZSh0aGlzKSl9fSxhZGRUb1N0b3JhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19zdG9yYWdlPXRoaXMsdC5kaXJ0eSghMSksdGhpc30sZGVsRnJvbVN0b3JhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0Ll9fc3RvcmFnZT1udWxsKSx0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyTGlzdD10aGlzLl9yb290cz1udWxsfSxkaXNwbGF5YWJsZVNvcnRGdW5jOm59LHQuZXhwb3J0cz1sfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMSksYT1pKDIxKS5EaXNwYXRjaGVyLG89aSg3MSkscj1pKDcwKSxzPWZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5zdGFnZT10LnN0YWdlfHx7fSx0aGlzLm9uZnJhbWU9dC5vbmZyYW1lfHxmdW5jdGlvbigpe30sdGhpcy5fY2xpcHM9W10sdGhpcy5fcnVubmluZz0hMSx0aGlzLl90aW1lLHRoaXMuX3BhdXNlZFRpbWUsdGhpcy5fcGF1c2VTdGFydCx0aGlzLl9wYXVzZWQ9ITEsYS5jYWxsKHRoaXMpfTtzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cyxhZGRDbGlwOmZ1bmN0aW9uKHQpe3RoaXMuX2NsaXBzLnB1c2godCl9LGFkZEFuaW1hdG9yOmZ1bmN0aW9uKHQpe3QuYW5pbWF0aW9uPXRoaXM7Zm9yKHZhciBlPXQuZ2V0Q2xpcHMoKSxpPTA7aTxlLmxlbmd0aDtpKyspdGhpcy5hZGRDbGlwKGVbaV0pfSxyZW1vdmVDbGlwOmZ1bmN0aW9uKHQpe3ZhciBlPW4uaW5kZXhPZih0aGlzLl9jbGlwcyx0KTtlPj0wJiZ0aGlzLl9jbGlwcy5zcGxpY2UoZSwxKX0scmVtb3ZlQW5pbWF0b3I6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuZ2V0Q2xpcHMoKSxpPTA7aTxlLmxlbmd0aDtpKyspdGhpcy5yZW1vdmVDbGlwKGVbaV0pO3QuYW5pbWF0aW9uPW51bGx9LF91cGRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9KG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fcGF1c2VkVGltZSxlPXQtdGhpcy5fdGltZSxpPXRoaXMuX2NsaXBzLG49aS5sZW5ndGgsYT1bXSxvPVtdLHI9MDtyPG47cisrKXt2YXIgcz1pW3JdLGw9cy5zdGVwKHQsZSk7bCYmKGEucHVzaChsKSxvLnB1c2gocykpfWZvcih2YXIgcj0wO3I8bjspaVtyXS5fbmVlZHNSZW1vdmU/KGlbcl09aVtuLTFdLGkucG9wKCksbi0tKTpyKys7bj1hLmxlbmd0aDtmb3IodmFyIHI9MDtyPG47cisrKW9bcl0uZmlyZShhW3JdKTt0aGlzLl90aW1lPXQsdGhpcy5vbmZyYW1lKGUpLHRoaXMudHJpZ2dlcigiZnJhbWUiLGUpLHRoaXMuc3RhZ2UudXBkYXRlJiZ0aGlzLnN0YWdlLnVwZGF0ZSgpfSxfc3RhcnRMb29wOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2UuX3J1bm5pbmcmJihvKHQpLCFlLl9wYXVzZWQmJmUuX3VwZGF0ZSgpKX12YXIgZT10aGlzO3RoaXMuX3J1bm5pbmc9ITAsbyh0KX0sc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl90aW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX3BhdXNlZFRpbWU9MCx0aGlzLl9zdGFydExvb3AoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX3J1bm5pbmc9ITF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkfHwodGhpcy5fcGF1c2VTdGFydD0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLl9wYXVzZWQ9ITApfSxyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQmJih0aGlzLl9wYXVzZWRUaW1lKz0obmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9wYXVzZVN0YXJ0LHRoaXMuX3BhdXNlZD0hMSl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5fY2xpcHM9W119LGFuaW1hdGU6ZnVuY3Rpb24odCxlKXtlPWV8fHt9O3ZhciBpPW5ldyByKHQsZS5sb29wLGUuZ2V0dGVyLGUuc2V0dGVyKTtyZXR1cm4gdGhpcy5hZGRBbmltYXRvcihpKSxpfX0sbi5taXhpbihzLGEpLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt0aGlzLl90YXJnZXQ9dC50YXJnZXQsdGhpcy5fbGlmZT10LmxpZmV8fDFlMyx0aGlzLl9kZWxheT10LmRlbGF5fHwwLHRoaXMuX2luaXRpYWxpemVkPSExLHRoaXMubG9vcD1udWxsIT10Lmxvb3AmJnQubG9vcCx0aGlzLmdhcD10LmdhcHx8MCx0aGlzLmVhc2luZz10LmVhc2luZ3x8IkxpbmVhciIsdGhpcy5vbmZyYW1lPXQub25mcmFtZSx0aGlzLm9uZGVzdHJveT10Lm9uZGVzdHJveSx0aGlzLm9ucmVzdGFydD10Lm9ucmVzdGFydCx0aGlzLl9wYXVzZWRUaW1lPTAsdGhpcy5fcGF1c2VkPSExfXZhciBhPWkoMTY1KTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixzdGVwOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5faW5pdGlhbGl6ZWR8fCh0aGlzLl9zdGFydFRpbWU9dCt0aGlzLl9kZWxheSx0aGlzLl9pbml0aWFsaXplZD0hMCksdGhpcy5fcGF1c2VkKXJldHVybiB2b2lkKHRoaXMuX3BhdXNlZFRpbWUrPWUpO3ZhciBpPSh0LXRoaXMuX3N0YXJ0VGltZS10aGlzLl9wYXVzZWRUaW1lKS90aGlzLl9saWZlO2lmKCEoaTwwKSl7aT1NYXRoLm1pbihpLDEpO3ZhciBuPXRoaXMuZWFzaW5nLG89InN0cmluZyI9PXR5cGVvZiBuP2Fbbl06bixyPSJmdW5jdGlvbiI9PXR5cGVvZiBvP28oaSk6aTtyZXR1cm4gdGhpcy5maXJlKCJmcmFtZSIsciksMT09aT90aGlzLmxvb3A/KHRoaXMucmVzdGFydCh0KSwicmVzdGFydCIpOih0aGlzLl9uZWVkc1JlbW92ZT0hMCwiZGVzdHJveSIpOm51bGx9fSxyZXN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPSh0LXRoaXMuX3N0YXJ0VGltZS10aGlzLl9wYXVzZWRUaW1lKSV0aGlzLl9saWZlO3RoaXMuX3N0YXJ0VGltZT10LWUrdGhpcy5nYXAsdGhpcy5fcGF1c2VkVGltZT0wLHRoaXMuX25lZWRzUmVtb3ZlPSExfSxmaXJlOmZ1bmN0aW9uKHQsZSl7dD0ib24iK3QsdGhpc1t0XSYmdGhpc1t0XSh0aGlzLl90YXJnZXQsZSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSEwfSxyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQ9ITF9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgaT17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxxdWFkcmF0aWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0fSxxdWFkcmF0aWNPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHF1YWRyYXRpY0luT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41KnQqdDotLjUqKC0tdCoodC0yKS0xKX0sY3ViaWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LGN1YmljT3V0OmZ1bmN0aW9uKHQpe3JldHVybi0tdCp0KnQrMX0sY3ViaWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdDouNSooKHQtPTIpKnQqdCsyKX0scXVhcnRpY0luOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxxdWFydGljT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAxLSAtLXQqdCp0KnR9LHF1YXJ0aWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdCp0Oi0uNSooKHQtPTIpKnQqdCp0LTIpfSxxdWludGljSW46ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0KnQqdH0scXVpbnRpY091dDpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KnQqdCsxfSxxdWludGljSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/LjUqdCp0KnQqdCp0Oi41KigodC09MikqdCp0KnQqdCsyKX0sc2ludXNvaWRhbEluOmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqTWF0aC5QSS8yKX0sc2ludXNvaWRhbE91dDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaW4odCpNYXRoLlBJLzIpfSxzaW51c29pZGFsSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuLjUqKDEtTWF0aC5jb3MoTWF0aC5QSSp0KSl9LGV4cG9uZW50aWFsSW46ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10PzA6TWF0aC5wb3coMTAyNCx0LTEpfSxleHBvbmVudGlhbE91dDpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/MToxLU1hdGgucG93KDIsLTEwKnQpfSxleHBvbmVudGlhbEluT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD8wOjE9PT10PzE6KHQqPTIpPDE/LjUqTWF0aC5wb3coMTAyNCx0LTEpOi41KigtTWF0aC5wb3coMiwtMTAqKHQtMSkpKzIpfSxjaXJjdWxhckluOmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LGNpcmN1bGFyT3V0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfSxjaXJjdWxhckluT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy0uNSooTWF0aC5zcXJ0KDEtdCp0KS0xKTouNSooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpfSxlbGFzdGljSW46ZnVuY3Rpb24odCl7dmFyIGUsaT0uMSxuPS40O3JldHVybiAwPT09dD8wOjE9PT10PzE6KCFpfHxpPDE/KGk9MSxlPW4vNCk6ZT1uKk1hdGguYXNpbigxL2kpLygyKk1hdGguUEkpLC0oaSpNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQtZSkqKDIqTWF0aC5QSSkvbikpKX0sZWxhc3RpY091dDpmdW5jdGlvbih0KXt2YXIgZSxpPS4xLG49LjQ7cmV0dXJuIDA9PT10PzA6MT09PXQ/MTooIWl8fGk8MT8oaT0xLGU9bi80KTplPW4qTWF0aC5hc2luKDEvaSkvKDIqTWF0aC5QSSksaSpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodC1lKSooMipNYXRoLlBJKS9uKSsxKX0sZWxhc3RpY0luT3V0OmZ1bmN0aW9uKHQpe3ZhciBlLGk9LjEsbj0uNDtyZXR1cm4gMD09PXQ/MDoxPT09dD8xOighaXx8aTwxPyhpPTEsZT1uLzQpOmU9bipNYXRoLmFzaW4oMS9pKS8oMipNYXRoLlBJKSwodCo9Mik8MT8tLjUqKGkqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpL24pKTppKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKHQtZSkqKDIqTWF0aC5QSSkvbikqLjUrMSl9LGJhY2tJbjpmdW5jdGlvbih0KXt2YXIgZT0xLjcwMTU4O3JldHVybiB0KnQqKChlKzEpKnQtZSl9LGJhY2tPdXQ6ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4tLXQqdCooKGUrMSkqdCtlKSsxfSxiYWNrSW5PdXQ6ZnVuY3Rpb24odCl7dmFyIGU9Mi41OTQ5MDk1O3JldHVybih0Kj0yKTwxPy41Kih0KnQqKChlKzEpKnQtZSkpOi41KigodC09MikqdCooKGUrMSkqdCtlKSsyKX0sYm91bmNlSW46ZnVuY3Rpb24odCl7cmV0dXJuIDEtaS5ib3VuY2VPdXQoMS10KX0sYm91bmNlT3V0OmZ1bmN0aW9uKHQpe3JldHVybiB0PDEvMi43NT83LjU2MjUqdCp0OnQ8Mi8yLjc1PzcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1OnQ8Mi41LzIuNzU/Ny41NjI1Kih0LT0yLjI1LzIuNzUpKnQrLjkzNzU6Ny41NjI1Kih0LT0yLjYyNS8yLjc1KSp0Ky45ODQzNzV9LGJvdW5jZUluT3V0OmZ1bmN0aW9uKHQpe3JldHVybiB0PC41Py41KmkuYm91bmNlSW4oMip0KTouNSppLmJvdW5jZU91dCgyKnQtMSkrLjV9fTt0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNzIpLm5vcm1hbGl6ZVJhZGlhbixhPTIqTWF0aC5QSTt0LmV4cG9ydHM9e2NvbnRhaW5TdHJva2U6ZnVuY3Rpb24odCxlLGksbyxyLHMsbCx1LGgpe2lmKDA9PT1sKXJldHVybiExO3ZhciBjPWw7dS09dCxoLT1lO3ZhciBkPU1hdGguc3FydCh1KnUraCpoKTtpZihkLWM+aXx8ZCtjPGkpcmV0dXJuITE7aWYoTWF0aC5hYnMoby1yKSVhPDFlLTQpcmV0dXJuITA7aWYocyl7dmFyIGY9bztvPW4ocikscj1uKGYpfWVsc2Ugbz1uKG8pLHI9bihyKTtvPnImJihyKz1hKTt2YXIgcD1NYXRoLmF0YW4yKGgsdSk7cmV0dXJuIHA8MCYmKHArPWEpLHA+PW8mJnA8PXJ8fHArYT49byYmcCthPD1yfX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDIwKTt0LmV4cG9ydHM9e2NvbnRhaW5TdHJva2U6ZnVuY3Rpb24odCxlLGksYSxvLHIscyxsLHUsaCxjKXtpZigwPT09dSlyZXR1cm4hMTt2YXIgZD11O2lmKGM+ZStkJiZjPmErZCYmYz5yK2QmJmM+bCtkfHxjPGUtZCYmYzxhLWQmJmM8ci1kJiZjPGwtZHx8aD50K2QmJmg+aStkJiZoPm8rZCYmaD5zK2R8fGg8dC1kJiZoPGktZCYmaDxvLWQmJmg8cy1kKXJldHVybiExO3ZhciBmPW4uY3ViaWNQcm9qZWN0UG9pbnQodCxlLGksYSxvLHIscyxsLGgsYyxudWxsKTtyZXR1cm4gZjw9ZC8yfX19LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBNYXRoLmFicyh0LWUpPHh9ZnVuY3Rpb24gYSgpe3ZhciB0PWJbMF07YlswXT1iWzFdLGJbMV09dH1mdW5jdGlvbiBvKHQsZSxpLG4sbyxyLHMsbCx1LGgpe2lmKGg+ZSYmaD5uJiZoPnImJmg+bHx8aDxlJiZoPG4mJmg8ciYmaDxsKXJldHVybiAwO3ZhciBjPWcuY3ViaWNSb290QXQoZSxuLHIsbCxoLF8pO2lmKDA9PT1jKXJldHVybiAwO2Zvcih2YXIgZCxmLHA9MCxtPS0xLHY9MDt2PGM7disrKXt2YXIgeT1fW3ZdLHg9MD09PXl8fDE9PT15Py41OjEsdz1nLmN1YmljQXQodCxpLG8scyx5KTt3PHV8fChtPDAmJihtPWcuY3ViaWNFeHRyZW1hKGUsbixyLGwsYiksYlsxXTxiWzBdJiZtPjEmJmEoKSxkPWcuY3ViaWNBdChlLG4scixsLGJbMF0pLG0+MSYmKGY9Zy5jdWJpY0F0KGUsbixyLGwsYlsxXSkpKSxwKz0yPT1tP3k8YlswXT9kPGU/eDoteDp5PGJbMV0/ZjxkP3g6LXg6bDxmP3g6LXg6eTxiWzBdP2Q8ZT94Oi14Omw8ZD94Oi14KX1yZXR1cm4gcH1mdW5jdGlvbiByKHQsZSxpLG4sYSxvLHIscyl7aWYocz5lJiZzPm4mJnM+b3x8czxlJiZzPG4mJnM8bylyZXR1cm4gMDt2YXIgbD1nLnF1YWRyYXRpY1Jvb3RBdChlLG4sbyxzLF8pO2lmKDA9PT1sKXJldHVybiAwO3ZhciB1PWcucXVhZHJhdGljRXh0cmVtdW0oZSxuLG8pO2lmKHU+PTAmJnU8PTEpe2Zvcih2YXIgaD0wLGM9Zy5xdWFkcmF0aWNBdChlLG4sbyx1KSxkPTA7ZDxsO2QrKyl7dmFyIGY9MD09PV9bZF18fDE9PT1fW2RdPy41OjEscD1nLnF1YWRyYXRpY0F0KHQsaSxhLF9bZF0pO3A8cnx8KGgrPV9bZF08dT9jPGU/ZjotZjpvPGM/ZjotZil9cmV0dXJuIGh9dmFyIGY9MD09PV9bMF18fDE9PT1fWzBdPy41OjEscD1nLnF1YWRyYXRpY0F0KHQsaSxhLF9bMF0pO3JldHVybiBwPHI/MDpvPGU/ZjotZn1mdW5jdGlvbiBzKHQsZSxpLG4sYSxvLHIscyl7aWYocy09ZSxzPml8fHM8LWkpcmV0dXJuIDA7dmFyIGw9TWF0aC5zcXJ0KGkqaS1zKnMpO19bMF09LWwsX1sxXT1sO3ZhciB1PU1hdGguYWJzKG4tYSk7aWYodTwxZS00KXJldHVybiAwO2lmKHUleTwxZS00KXtuPTAsYT15O3ZhciBoPW8/MTotMTtyZXR1cm4gcj49X1swXSt0JiZyPD1fWzFdK3Q/aDowfWlmKG8pe3ZhciBsPW47bj1wKGEpLGE9cChsKX1lbHNlIG49cChuKSxhPXAoYSk7bj5hJiYoYSs9eSk7Zm9yKHZhciBjPTAsZD0wO2Q8MjtkKyspe3ZhciBmPV9bZF07aWYoZit0PnIpe3ZhciBnPU1hdGguYXRhbjIocyxmKSxoPW8/MTotMTtnPDAmJihnPXkrZyksKGc+PW4mJmc8PWF8fGcreT49biYmZyt5PD1hKSYmKGc+TWF0aC5QSS8yJiZnPDEuNSpNYXRoLlBJJiYoaD0taCksYys9aCl9fXJldHVybiBjfWZ1bmN0aW9uIGwodCxlLGksYSxsKXtmb3IodmFyIGg9MCxwPTAsZz0wLHk9MCx4PTAsXz0wO188dC5sZW5ndGg7KXt2YXIgYj10W18rK107c3dpdGNoKGI9PT11Lk0mJl8+MSYmKGl8fChoKz1tKHAsZyx5LHgsYSxsKSkpLDE9PV8mJihwPXRbX10sZz10W18rMV0seT1wLHg9ZyksYil7Y2FzZSB1Lk06eT10W18rK10seD10W18rK10scD15LGc9eDticmVhaztjYXNlIHUuTDppZihpKXtpZih2KHAsZyx0W19dLHRbXysxXSxlLGEsbCkpcmV0dXJuITB9ZWxzZSBoKz1tKHAsZyx0W19dLHRbXysxXSxhLGwpfHwwO3A9dFtfKytdLGc9dFtfKytdO2JyZWFrO2Nhc2UgdS5DOmlmKGkpe2lmKGMuY29udGFpblN0cm9rZShwLGcsdFtfKytdLHRbXysrXSx0W18rK10sdFtfKytdLHRbX10sdFtfKzFdLGUsYSxsKSlyZXR1cm4hMH1lbHNlIGgrPW8ocCxnLHRbXysrXSx0W18rK10sdFtfKytdLHRbXysrXSx0W19dLHRbXysxXSxhLGwpfHwwO3A9dFtfKytdLGc9dFtfKytdO2JyZWFrO2Nhc2UgdS5ROmlmKGkpe2lmKGQuY29udGFpblN0cm9rZShwLGcsdFtfKytdLHRbXysrXSx0W19dLHRbXysxXSxlLGEsbCkpcmV0dXJuITB9ZWxzZSBoKz1yKHAsZyx0W18rK10sdFtfKytdLHRbX10sdFtfKzFdLGEsbCl8fDA7cD10W18rK10sZz10W18rK107YnJlYWs7Y2FzZSB1LkE6dmFyIHc9dFtfKytdLFM9dFtfKytdLE09dFtfKytdLEk9dFtfKytdLFQ9dFtfKytdLEE9dFtfKytdLEM9KHRbXysrXSwxLXRbXysrXSksTD1NYXRoLmNvcyhUKSpNK3csRD1NYXRoLnNpbihUKSpJK1M7Xz4xP2grPW0ocCxnLEwsRCxhLGwpOih5PUwseD1EKTt2YXIgUD0oYS13KSpJL00rdztpZihpKXtpZihmLmNvbnRhaW5TdHJva2UodyxTLEksVCxUK0EsQyxlLFAsbCkpcmV0dXJuITB9ZWxzZSBoKz1zKHcsUyxJLFQsVCtBLEMsUCxsKTtwPU1hdGguY29zKFQrQSkqTSt3LGc9TWF0aC5zaW4oVCtBKSpJK1M7YnJlYWs7Y2FzZSB1LlI6eT1wPXRbXysrXSx4PWc9dFtfKytdO3ZhciBrPXRbXysrXSxPPXRbXysrXSxMPXkrayxEPXgrTztpZihpKXtpZih2KHkseCxMLHgsZSxhLGwpfHx2KEwseCxMLEQsZSxhLGwpfHx2KEwsRCx5LEQsZSxhLGwpfHx2KHksRCx5LHgsZSxhLGwpKXJldHVybiEwfWVsc2UgaCs9bShMLHgsTCxELGEsbCksaCs9bSh5LEQseSx4LGEsbCk7YnJlYWs7Y2FzZSB1Llo6aWYoaSl7aWYodihwLGcseSx4LGUsYSxsKSlyZXR1cm4hMH1lbHNlIGgrPW0ocCxnLHkseCxhLGwpO3A9eSxnPXh9fXJldHVybiBpfHxuKGcseCl8fChoKz1tKHAsZyx5LHgsYSxsKXx8MCksMCE9PWh9dmFyIHU9aSgyNykuQ01ELGg9aSgxMDIpLGM9aSgxNjcpLGQ9aSgxMDMpLGY9aSgxNjYpLHA9aSg3Mikubm9ybWFsaXplUmFkaWFuLGc9aSgyMCksbT1pKDEwNCksdj1oLmNvbnRhaW5TdHJva2UseT0yKk1hdGguUEkseD0xZS00LF89Wy0xLC0xLC0xXSxiPVstMSwtMV07dC5leHBvcnRzPXtjb250YWluOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbCh0LDAsITEsZSxpKX0sY29udGFpblN0cm9rZTpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gbCh0LGUsITAsaSxuKX19fSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dFsxXVswXS10WzBdWzBdLGk9dFsxXVsxXS10WzBdWzFdO3JldHVybiBNYXRoLnNxcnQoZSplK2kqaSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm5bKHRbMF1bMF0rdFsxXVswXSkvMiwodFswXVsxXSt0WzFdWzFdKS8yXX12YXIgbz1pKDIxKSxyPWZ1bmN0aW9uKCl7dGhpcy5fdHJhY2s9W119O3IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpyLHJlY29nbml6ZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuX2RvVHJhY2sodCxlLGkpLHRoaXMuX3JlY29nbml6ZSh0KX0sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJhY2subGVuZ3RoPTAsdGhpc30sX2RvVHJhY2s6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQudG91Y2hlcztpZihuKXtmb3IodmFyIGE9e3BvaW50czpbXSx0b3VjaGVzOltdLHRhcmdldDplLGV2ZW50OnR9LHI9MCxzPW4ubGVuZ3RoO3I8cztyKyspe3ZhciBsPW5bcl0sdT1vLmNsaWVudFRvTG9jYWwoaSxsLHt9KTthLnBvaW50cy5wdXNoKFt1LnpyWCx1LnpyWV0pLGEudG91Y2hlcy5wdXNoKGwpfXRoaXMuX3RyYWNrLnB1c2goYSl9fSxfcmVjb2duaXplOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiBzKWlmKHMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBpPXNbZV0odGhpcy5fdHJhY2ssdCk7aWYoaSlyZXR1cm4gaX19fTt2YXIgcz17cGluY2g6ZnVuY3Rpb24odCxlKXt2YXIgaT10Lmxlbmd0aDtpZihpKXt2YXIgbz0odFtpLTFdfHx7fSkucG9pbnRzLHI9KHRbaS0yXXx8e30pLnBvaW50c3x8bztpZihyJiZyLmxlbmd0aD4xJiZvJiZvLmxlbmd0aD4xKXt2YXIgcz1uKG8pL24ocik7IWlzRmluaXRlKHMpJiYocz0xKSxlLnBpbmNoU2NhbGU9czt2YXIgbD1hKG8pO3JldHVybiBlLnBpbmNoWD1sWzBdLGUucGluY2hZPWxbMV0se3R5cGU6InBpbmNoIix0YXJnZXQ6dFswXS50YXJnZXQsZXZlbnQ6ZX19fX19O3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4ibW91c2V3aGVlbCI9PT10JiZkLmJyb3dzZXIuZmlyZWZveD8iRE9NTW91c2VTY3JvbGwiOnR9ZnVuY3Rpb24gYSh0LGUsaSl7dmFyIG49dC5fZ2VzdHVyZU1ncjsic3RhcnQiPT09aSYmbi5jbGVhcigpO3ZhciBhPW4ucmVjb2duaXplKGUsdC5oYW5kbGVyLmZpbmRIb3ZlcihlLnpyWCxlLnpyWSxudWxsKS50YXJnZXQsdC5kb20pO2lmKCJlbmQiPT09aSYmbi5jbGVhcigpLGEpe3ZhciBvPWEudHlwZTtlLmdlc3R1cmVFdmVudD1vLHQuaGFuZGxlci5kaXNwYXRjaFRvRWxlbWVudCh7dGFyZ2V0OmEudGFyZ2V0fSxvLGEuZXZlbnQpfX1mdW5jdGlvbiBvKHQpe3QuX3RvdWNoaW5nPSEwLGNsZWFyVGltZW91dCh0Ll90b3VjaFRpbWVyKSx0Ll90b3VjaFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll90b3VjaGluZz0hMX0sNzAwKX1mdW5jdGlvbiByKHQpe3ZhciBlPXQucG9pbnRlclR5cGU7cmV0dXJuInBlbiI9PT1lfHwidG91Y2giPT09ZX1mdW5jdGlvbiBzKHQpe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtpZighZS5fdG91Y2hpbmcpcmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX1oLmVhY2goeCxmdW5jdGlvbihlKXt0Ll9oYW5kbGVyc1tlXT1oLmJpbmQod1tlXSx0KX0pLGguZWFjaChiLGZ1bmN0aW9uKGUpe3QuX2hhbmRsZXJzW2VdPWguYmluZCh3W2VdLHQpfSksaC5lYWNoKHksZnVuY3Rpb24oaSl7dC5faGFuZGxlcnNbaV09ZSh3W2ldLHQpfSl9ZnVuY3Rpb24gbCh0KXtmdW5jdGlvbiBlKGUsaSl7aC5lYWNoKGUsZnVuY3Rpb24oZSl7cCh0LG4oZSksaS5faGFuZGxlcnNbZV0pfSxpKX1jLmNhbGwodGhpcyksdGhpcy5kb209dCx0aGlzLl90b3VjaGluZz0hMSx0aGlzLl90b3VjaFRpbWVyLHRoaXMuX2dlc3R1cmVNZ3I9bmV3IGYsdGhpcy5faGFuZGxlcnM9e30scyh0aGlzKSxkLnBvaW50ZXJFdmVudHNTdXBwb3J0ZWQ/ZShiLHRoaXMpOihkLnRvdWNoRXZlbnRzU3VwcG9ydGVkJiZlKHgsdGhpcyksZSh5LHRoaXMpKX12YXIgdT1pKDIxKSxoPWkoMSksYz1pKDIzKSxkPWkoMTApLGY9aSgxNjkpLHA9dS5hZGRFdmVudExpc3RlbmVyLGc9dS5yZW1vdmVFdmVudExpc3RlbmVyLG09dS5ub3JtYWxpemVFdmVudCx2PTMwMCx5PVsiY2xpY2siLCJkYmxjbGljayIsIm1vdXNld2hlZWwiLCJtb3VzZW91dCIsIm1vdXNldXAiLCJtb3VzZWRvd24iLCJtb3VzZW1vdmUiLCJjb250ZXh0bWVudSJdLHg9WyJ0b3VjaHN0YXJ0IiwidG91Y2hlbmQiLCJ0b3VjaG1vdmUiXSxfPXtwb2ludGVyZG93bjoxLHBvaW50ZXJ1cDoxLHBvaW50ZXJtb3ZlOjEscG9pbnRlcm91dDoxfSxiPWgubWFwKHksZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKCJtb3VzZSIsInBvaW50ZXIiKTtyZXR1cm4gX1tlXT9lOnR9KSx3PXttb3VzZW1vdmU6ZnVuY3Rpb24odCl7dD1tKHRoaXMuZG9tLHQpLHRoaXMudHJpZ2dlcigibW91c2Vtb3ZlIix0KX0sbW91c2VvdXQ6ZnVuY3Rpb24odCl7dD1tKHRoaXMuZG9tLHQpO3ZhciBlPXQudG9FbGVtZW50fHx0LnJlbGF0ZWRUYXJnZXQ7aWYoZSE9dGhpcy5kb20pZm9yKDtlJiY5IT1lLm5vZGVUeXBlOyl7aWYoZT09PXRoaXMuZG9tKXJldHVybjtlPWUucGFyZW50Tm9kZX10aGlzLnRyaWdnZXIoIm1vdXNlb3V0Iix0KX0sdG91Y2hzdGFydDpmdW5jdGlvbih0KXt0PW0odGhpcy5kb20sdCksdC56ckJ5VG91Y2g9ITAsdGhpcy5fbGFzdFRvdWNoTW9tZW50PW5ldyBEYXRlLGEodGhpcyx0LCJzdGFydCIpLHcubW91c2Vtb3ZlLmNhbGwodGhpcyx0KSx3Lm1vdXNlZG93bi5jYWxsKHRoaXMsdCksbyh0aGlzKX0sdG91Y2htb3ZlOmZ1bmN0aW9uKHQpe3Q9bSh0aGlzLmRvbSx0KSx0LnpyQnlUb3VjaD0hMCxhKHRoaXMsdCwiY2hhbmdlIiksdy5tb3VzZW1vdmUuY2FsbCh0aGlzLHQpLG8odGhpcyl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe3Q9bSh0aGlzLmRvbSx0KSx0LnpyQnlUb3VjaD0hMCxhKHRoaXMsdCwiZW5kIiksdy5tb3VzZXVwLmNhbGwodGhpcyx0KSwrbmV3IERhdGUtdGhpcy5fbGFzdFRvdWNoTW9tZW50PHYmJncuY2xpY2suY2FsbCh0aGlzLHQpLG8odGhpcyl9LHBvaW50ZXJkb3duOmZ1bmN0aW9uKHQpe3cubW91c2Vkb3duLmNhbGwodGhpcyx0KX0scG9pbnRlcm1vdmU6ZnVuY3Rpb24odCl7cih0KXx8dy5tb3VzZW1vdmUuY2FsbCh0aGlzLHQpfSxwb2ludGVydXA6ZnVuY3Rpb24odCl7dy5tb3VzZXVwLmNhbGwodGhpcyx0KX0scG9pbnRlcm91dDpmdW5jdGlvbih0KXtyKHQpfHx3Lm1vdXNlb3V0LmNhbGwodGhpcyx0KX19O2guZWFjaChbImNsaWNrIiwibW91c2Vkb3duIiwibW91c2V1cCIsIm1vdXNld2hlZWwiLCJkYmxjbGljayIsImNvbnRleHRtZW51Il0sZnVuY3Rpb24odCl7d1t0XT1mdW5jdGlvbihlKXtlPW0odGhpcy5kb20sZSksdGhpcy50cmlnZ2VyKHQsZSl9fSk7dmFyIFM9bC5wcm90b3R5cGU7Uy5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXkuY29uY2F0KHgpLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIGk9dFtlXTtnKHRoaXMuZG9tLG4oaSksdGhpcy5faGFuZGxlcnNbaV0pfX0sUy5zZXRDdXJzb3I9ZnVuY3Rpb24odCl7dGhpcy5kb20uc3R5bGUuY3Vyc29yPXR8fCJkZWZhdWx0In0saC5taXhpbihsLGMpLHQuZXhwb3J0cz1sfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg4KTt0LmV4cG9ydHM9bi5leHRlbmQoe3R5cGU6ImNvbXBvdW5kIixzaGFwZTp7cGF0aHM6bnVsbH0sX3VwZGF0ZVBhdGhEaXJ0eTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9fZGlydHlQYXRoLGU9dGhpcy5zaGFwZS5wYXRocyxpPTA7aTxlLmxlbmd0aDtpKyspdD10fHxlW2ldLl9fZGlydHlQYXRoO3RoaXMuX19kaXJ0eVBhdGg9dCx0aGlzLl9fZGlydHk9dGhpcy5fX2RpcnR5fHx0fSxiZWZvcmVCcnVzaDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVBhdGhEaXJ0eSgpO2Zvcih2YXIgdD10aGlzLnNoYXBlLnBhdGhzfHxbXSxlPXRoaXMuZ2V0R2xvYmFsU2NhbGUoKSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXS5wYXRofHx0W2ldLmNyZWF0ZVBhdGhQcm94eSgpLHRbaV0ucGF0aC5zZXRTY2FsZShlWzBdLGVbMV0pfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9ZS5wYXRoc3x8W10sbj0wO248aS5sZW5ndGg7bisrKWlbbl0uYnVpbGRQYXRoKHQsaVtuXS5zaGFwZSwhMCl9LGFmdGVyQnJ1c2g6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5zaGFwZS5wYXRocyxlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXS5fX2RpcnR5UGF0aD0hMX0sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZVBhdGhEaXJ0eSgpLG4ucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdC5jYWxsKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMSksYT1pKDM5KSxvPWZ1bmN0aW9uKHQsZSxpLG4sbyl7dGhpcy54PW51bGw9PXQ/LjU6dCx0aGlzLnk9bnVsbD09ZT8uNTplLHRoaXMucj1udWxsPT1pPy41OmksdGhpcy50eXBlPSJyYWRpYWwiLHRoaXMuZ2xvYmFsPW98fCExLGEuY2FsbCh0aGlzLG4pfTtvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6b30sbi5pbmhlcml0cyhvLGEpLHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg2KSxhPW4ubWluLG89bi5tYXgscj1uLnNjYWxlLHM9bi5kaXN0YW5jZSxsPW4uYWRkO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSx1KXt2YXIgaCxjLGQsZixwPVtdLGc9W10sbT1bXSx2PVtdO2lmKHUpe2Q9WzEvMCwxLzBdLGY9Wy0oMS8wKSwtKDEvMCldO2Zvcih2YXIgeT0wLHg9dC5sZW5ndGg7eTx4O3krKylhKGQsZCx0W3ldKSxvKGYsZix0W3ldKTthKGQsZCx1WzBdKSxvKGYsZix1WzFdKX1mb3IodmFyIHk9MCx4PXQubGVuZ3RoO3k8eDt5Kyspe3ZhciBfPXRbeV07aWYoaSloPXRbeT95LTE6eC0xXSxjPXRbKHkrMSkleF07ZWxzZXtpZigwPT09eXx8eT09PXgtMSl7cC5wdXNoKG4uY2xvbmUodFt5XSkpO2NvbnRpbnVlfWg9dFt5LTFdLGM9dFt5KzFdfW4uc3ViKGcsYyxoKSxyKGcsZyxlKTt2YXIgYj1zKF8saCksdz1zKF8sYyksUz1iK3c7MCE9PVMmJihiLz1TLHcvPVMpLHIobSxnLC1iKSxyKHYsZyx3KTt2YXIgTT1sKFtdLF8sbSksST1sKFtdLF8sdik7dSYmKG8oTSxNLGQpLGEoTSxNLGYpLG8oSSxJLGQpLGEoSSxJLGYpKSxwLnB1c2goTSkscC5wdXNoKEkpfXJldHVybiBpJiZwLnB1c2gocC5zaGlmdCgpKSxwfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGksbixhLG8scil7dmFyIHM9LjUqKGktdCksbD0uNSoobi1lKTtyZXR1cm4oMiooZS1pKStzK2wpKnIrKC0zKihlLWkpLTIqcy1sKSpvK3MqYStlfXZhciBhPWkoNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10scj0wLHM9MTtzPGk7cysrKXIrPWEuZGlzdGFuY2UodFtzLTFdLHRbc10pO3ZhciBsPXIvMjtsPWw8aT9pOmw7Zm9yKHZhciBzPTA7czxsO3MrKyl7dmFyIHUsaCxjLGQ9cy8obC0xKSooZT9pOmktMSksZj1NYXRoLmZsb29yKGQpLHA9ZC1mLGc9dFtmJWldO2U/KHU9dFsoZi0xK2kpJWldLGg9dFsoZisxKSVpXSxjPXRbKGYrMiklaV0pOih1PXRbMD09PWY/ZjpmLTFdLGg9dFtmPmktMj9pLTE6ZisxXSxjPXRbZj5pLTM/aS0xOmYrMl0pO3ZhciBtPXAqcCx2PXAqbTtvLnB1c2goW24odVswXSxnWzBdLGhbMF0sY1swXSxwLG0sdiksbih1WzFdLGdbMV0saFsxXSxjWzFdLHAsbSx2KV0pfXJldHVybiBvfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz1pKDgpLmV4dGVuZCh7dHlwZToiYXJjIixzaGFwZTp7Y3g6MCxjeTowLHI6MCxzdGFydEFuZ2xlOjAsZW5kQW5nbGU6MipNYXRoLlBJLGNsb2Nrd2lzZTohMH0sc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmN4LG49ZS5jeSxhPU1hdGgubWF4KGUuciwwKSxvPWUuc3RhcnRBbmdsZSxyPWUuZW5kQW5nbGUscz1lLmNsb2Nrd2lzZSxsPU1hdGguY29zKG8pLHU9TWF0aC5zaW4obyk7dC5tb3ZlVG8obCphK2ksdSphK24pLHQuYXJjKGksbixhLG8sciwhcyl9fSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49dC5jcHgyLGE9dC5jcHkyO3JldHVybiBudWxsPT09bnx8bnVsbD09PWE/WyhpP2M6dSkodC54MSx0LmNweDEsdC5jcHgyLHQueDIsZSksKGk/Yzp1KSh0LnkxLHQuY3B5MSx0LmNweTIsdC55MixlKV06WyhpP2g6bCkodC54MSx0LmNweDEsdC54MixlKSwoaT9oOmwpKHQueTEsdC5jcHkxLHQueTIsZSldfXZhciBhPWkoMjApLG89aSg2KSxyPWEucXVhZHJhdGljU3ViZGl2aWRlLHM9YS5jdWJpY1N1YmRpdmlkZSxsPWEucXVhZHJhdGljQXQsdT1hLmN1YmljQXQsaD1hLnF1YWRyYXRpY0Rlcml2YXRpdmVBdCxjPWEuY3ViaWNEZXJpdmF0aXZlQXQsZD1bXTt0LmV4cG9ydHM9aSg4KS5leHRlbmQoe3R5cGU6ImJlemllci1jdXJ2ZSIsc2hhcGU6e3gxOjAseTE6MCx4MjowLHkyOjAsY3B4MTowLGNweTE6MCxwZXJjZW50OjF9LHN0eWxlOntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS54MSxuPWUueTEsYT1lLngyLG89ZS55MixsPWUuY3B4MSx1PWUuY3B5MSxoPWUuY3B4MixjPWUuY3B5MixmPWUucGVyY2VudDswIT09ZiYmKHQubW92ZVRvKGksbiksbnVsbD09aHx8bnVsbD09Yz8oZjwxJiYocihpLGwsYSxmLGQpLGw9ZFsxXSxhPWRbMl0scihuLHUsbyxmLGQpLHU9ZFsxXSxvPWRbMl0pLHQucXVhZHJhdGljQ3VydmVUbyhsLHUsYSxvKSk6KGY8MSYmKHMoaSxsLGgsYSxmLGQpLGw9ZFsxXSxoPWRbMl0sYT1kWzNdLHMobix1LGMsbyxmLGQpLHU9ZFsxXSxjPWRbMl0sbz1kWzNdKSx0LmJlemllckN1cnZlVG8obCx1LGgsYyxhLG8pKSl9LHBvaW50QXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5zaGFwZSx0LCExKX0sdGFuZ2VudEF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odGhpcy5zaGFwZSx0LCEwKTtyZXR1cm4gby5ub3JtYWxpemUoZSxlKX19KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9aSg4KS5leHRlbmQoe3R5cGU6ImNpcmNsZSIsc2hhcGU6e2N4OjAsY3k6MCxyOjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUsaSl7aSYmdC5tb3ZlVG8oZS5jeCtlLnIsZS5jeSksdC5hcmMoZS5jeCxlLmN5LGUuciwwLDIqTWF0aC5QSSwhMCl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9aSg4KS5leHRlbmQoe3R5cGU6ImxpbmUiLHNoYXBlOnt4MTowLHkxOjAseDI6MCx5MjowLHBlcmNlbnQ6MX0sc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLngxLG49ZS55MSxhPWUueDIsbz1lLnkyLHI9ZS5wZXJjZW50OzAhPT1yJiYodC5tb3ZlVG8oaSxuKSxyPDEmJihhPWkqKDEtcikrYSpyLG89biooMS1yKStvKnIpLHQubGluZVRvKGEsbykpfSxwb2ludEF0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2hhcGU7cmV0dXJuW2UueDEqKDEtdCkrZS54Mip0LGUueTEqKDEtdCkrZS55Mip0XX19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNzgpO3QuZXhwb3J0cz1pKDgpLmV4dGVuZCh7dHlwZToicG9seWdvbiIsc2hhcGU6e3BvaW50czpudWxsLHNtb290aDohMSxzbW9vdGhDb25zdHJhaW50Om51bGx9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe24uYnVpbGRQYXRoKHQsZSwhMCl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDc4KTt0LmV4cG9ydHM9aSg4KS5leHRlbmQoe3R5cGU6InBvbHlsaW5lIixzaGFwZTp7cG9pbnRzOm51bGwsc21vb3RoOiExLHNtb290aENvbnN0cmFpbnQ6bnVsbH0sc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXtuLmJ1aWxkUGF0aCh0LGUsITEpfX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg3OSk7dC5leHBvcnRzPWkoOCkuZXh0ZW5kKHt0eXBlOiJyZWN0IixzaGFwZTp7cjowLHg6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS54LGE9ZS55LG89ZS53aWR0aCxyPWUuaGVpZ2h0O2Uucj9uLmJ1aWxkUGF0aCh0LGUpOnQucmVjdChpLGEsbyxyKSx0LmNsb3NlUGF0aCgpfX0pfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPWkoOCkuZXh0ZW5kKHt0eXBlOiJyaW5nIixzaGFwZTp7Y3g6MCxjeTowLHI6MCxyMDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmN4LG49ZS5jeSxhPTIqTWF0aC5QSTt0Lm1vdmVUbyhpK2UucixuKSx0LmFyYyhpLG4sZS5yLDAsYSwhMSksdC5tb3ZlVG8oaStlLnIwLG4pLHQuYXJjKGksbixlLnIwLDAsYSwhMCl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDgpLGE9aSg3Nyk7dC5leHBvcnRzPW4uZXh0ZW5kKHt0eXBlOiJzZWN0b3IiLHNoYXBlOntjeDowLGN5OjAscjA6MCxyOjAsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjIqTWF0aC5QSSxjbG9ja3dpc2U6ITB9LGJydXNoOmEobi5wcm90b3R5cGUuYnJ1c2gpLGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuY3gsbj1lLmN5LGE9TWF0aC5tYXgoZS5yMHx8MCwwKSxvPU1hdGgubWF4KGUuciwwKSxyPWUuc3RhcnRBbmdsZSxzPWUuZW5kQW5nbGUsbD1lLmNsb2Nrd2lzZSx1PU1hdGguY29zKHIpLGg9TWF0aC5zaW4ocik7dC5tb3ZlVG8odSphK2ksaCphK24pLHQubGluZVRvKHUqbytpLGgqbytuKSx0LmFyYyhpLG4sbyxyLHMsIWwpLHQubGluZVRvKE1hdGguY29zKHMpKmEraSxNYXRoLnNpbihzKSphK24pLDAhPT1hJiZ0LmFyYyhpLG4sYSxzLHIsbCksdC5jbG9zZVBhdGgoKX19KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDcwKSxhPWkoMSksbz1hLmlzU3RyaW5nLHI9YS5pc0Z1bmN0aW9uLHM9YS5pc09iamVjdCxsPWkoNTQpLHU9ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdG9ycz1bXX07dS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnUsYW5pbWF0ZTpmdW5jdGlvbih0LGUpe3ZhciBpLG89ITEscj10aGlzLHM9dGhpcy5fX3pyO2lmKHQpe3ZhciB1PXQuc3BsaXQoIi4iKSxoPXI7bz0ic2hhcGUiPT09dVswXTtmb3IodmFyIGM9MCxkPXUubGVuZ3RoO2M8ZDtjKyspaCYmKGg9aFt1W2NdXSk7aCYmKGk9aCl9ZWxzZSBpPXI7aWYoIWkpcmV0dXJuIHZvaWQgbCgnUHJvcGVydHkgIicrdCsnIiBpcyBub3QgZXhpc3RlZCBpbiBlbGVtZW50ICcrci5pZCk7dmFyIGY9ci5hbmltYXRvcnMscD1uZXcgbihpLGUpO3JldHVybiBwLmR1cmluZyhmdW5jdGlvbih0KXtyLmRpcnR5KG8pfSkuZG9uZShmdW5jdGlvbigpe2Yuc3BsaWNlKGEuaW5kZXhPZihmLHApLDEpfSksZi5wdXNoKHApLHMmJnMuYW5pbWF0aW9uLmFkZEFuaW1hdG9yKHApLHB9LHN0b3BBbmltYXRpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYW5pbWF0b3JzLGk9ZS5sZW5ndGgsbj0wO248aTtuKyspZVtuXS5zdG9wKHQpO3JldHVybiBlLmxlbmd0aD0wLHRoaXN9LGFuaW1hdGVUbzpmdW5jdGlvbih0LGUsaSxuLGEscyl7ZnVuY3Rpb24gbCgpe2gtLSxofHxhJiZhKCl9byhpKT8oYT1uLG49aSxpPTApOnIobik/KGE9bixuPSJsaW5lYXIiLGk9MCk6cihpKT8oYT1pLGk9MCk6cihlKT8oYT1lLGU9NTAwKTplfHwoZT01MDApLHRoaXMuc3RvcEFuaW1hdGlvbigpLHRoaXMuX2FuaW1hdGVUb1NoYWxsb3coIiIsdGhpcyx0LGUsaSxuLGEpO3ZhciB1PXRoaXMuYW5pbWF0b3JzLnNsaWNlKCksaD11Lmxlbmd0aDtofHxhJiZhKCk7Zm9yKHZhciBjPTA7Yzx1Lmxlbmd0aDtjKyspdVtjXS5kb25lKGwpLnN0YXJ0KG4scyl9LF9hbmltYXRlVG9TaGFsbG93OmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIHI9e30sbD0wO2Zvcih2YXIgdSBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkodSkpaWYobnVsbCE9ZVt1XSlzKGlbdV0pJiYhYS5pc0FycmF5TGlrZShpW3VdKT90aGlzLl9hbmltYXRlVG9TaGFsbG93KHQ/dCsiLiIrdTp1LGVbdV0saVt1XSxuLG8pOihyW3VdPWlbdV0sbCsrKTtlbHNlIGlmKG51bGwhPWlbdV0paWYodCl7dmFyIGg9e307aFt0XT17fSxoW3RdW3VdPWlbdV0sdGhpcy5hdHRyKGgpfWVsc2UgdGhpcy5hdHRyKHUsaVt1XSk7cmV0dXJuIGw+MCYmdGhpcy5hbmltYXRlKHQsITEpLndoZW4obnVsbD09bj81MDA6bixyKS5kZWxheShvfHwwKSx0aGlzfX0sdC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe3RoaXMub24oIm1vdXNlZG93biIsdGhpcy5fZHJhZ1N0YXJ0LHRoaXMpLHRoaXMub24oIm1vdXNlbW92ZSIsdGhpcy5fZHJhZyx0aGlzKSx0aGlzLm9uKCJtb3VzZXVwIix0aGlzLl9kcmFnRW5kLHRoaXMpLHRoaXMub24oImdsb2JhbG91dCIsdGhpcy5fZHJhZ0VuZCx0aGlzKX1mdW5jdGlvbiBuKHQsZSl7cmV0dXJue3RhcmdldDp0LHRvcFRhcmdldDplJiZlLnRvcFRhcmdldH19aS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmksX2RyYWdTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtlJiZlLmRyYWdnYWJsZSYmKHRoaXMuX2RyYWdnaW5nVGFyZ2V0PWUsZS5kcmFnZ2luZz0hMCx0aGlzLl94PXQub2Zmc2V0WCx0aGlzLl95PXQub2Zmc2V0WSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KG4oZSx0KSwiZHJhZ3N0YXJ0Iix0LmV2ZW50KSl9LF9kcmFnOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RyYWdnaW5nVGFyZ2V0O2lmKGUpe3ZhciBpPXQub2Zmc2V0WCxhPXQub2Zmc2V0WSxvPWktdGhpcy5feCxyPWEtdGhpcy5feTt0aGlzLl94PWksdGhpcy5feT1hLGUuZHJpZnQobyxyLHQpLHRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQobihlLHQpLCJkcmFnIix0LmV2ZW50KTt2YXIgcz10aGlzLmZpbmRIb3ZlcihpLGEsZSkudGFyZ2V0LGw9dGhpcy5fZHJvcFRhcmdldDt0aGlzLl9kcm9wVGFyZ2V0PXMsZSE9PXMmJihsJiZzIT09bCYmdGhpcy5kaXNwYXRjaFRvRWxlbWVudChuKGwsdCksImRyYWdsZWF2ZSIsdC5ldmVudCkscyYmcyE9PWwmJnRoaXMuZGlzcGF0Y2hUb0VsZW1lbnQobihzLHQpLCJkcmFnZW50ZXIiLHQuZXZlbnQpKX19LF9kcmFnRW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RyYWdnaW5nVGFyZ2V0O2UmJihlLmRyYWdnaW5nPSExKSx0aGlzLmRpc3BhdGNoVG9FbGVtZW50KG4oZSx0KSwiZHJhZ2VuZCIsdC5ldmVudCksdGhpcy5fZHJvcFRhcmdldCYmdGhpcy5kaXNwYXRjaFRvRWxlbWVudChuKHRoaXMuX2Ryb3BUYXJnZXQsdCksImRyb3AiLHQuZXZlbnQpLHRoaXMuX2RyYWdnaW5nVGFyZ2V0PW51bGwsdGhpcy5fZHJvcFRhcmdldD1udWxsfX0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpLG4sYSxvLHIscyxsLHUscCl7dmFyIHY9bCooZi8xODApLHk9ZCh2KSoodC1pKS8yK2ModikqKGUtbikvMix4PS0xKmModikqKHQtaSkvMitkKHYpKihlLW4pLzIsXz15KnkvKHIqcikreCp4LyhzKnMpO18+MSYmKHIqPWgoXykscyo9aChfKSk7dmFyIGI9KGE9PT1vPy0xOjEpKmgoKHIqcioocypzKS1yKnIqKHgqeCktcypzKih5KnkpKS8ocipyKih4KngpK3MqcyooeSp5KSkpfHwwLHc9YipyKngvcyxTPWIqLXMqeS9yLE09KHQraSkvMitkKHYpKnctYyh2KSpTLEk9KGUrbikvMitjKHYpKncrZCh2KSpTLFQ9bShbMSwwXSxbKHktdykvciwoeC1TKS9zXSksQT1bKHktdykvciwoeC1TKS9zXSxDPVsoLTEqeS13KS9yLCgtMSp4LVMpL3NdLEw9bShBLEMpO2coQSxDKTw9LTEmJihMPWYpLGcoQSxDKT49MSYmKEw9MCksMD09PW8mJkw+MCYmKEwtPTIqZiksMT09PW8mJkw8MCYmKEwrPTIqZikscC5hZGREYXRhKHUsTSxJLHIscyxULEwsdixvKX1mdW5jdGlvbiBhKHQpe2lmKCF0KXJldHVybltdO3ZhciBlLGk9dC5yZXBsYWNlKC8tL2csIiAtIikucmVwbGFjZSgvICAvZywiICIpLnJlcGxhY2UoLyAvZywiLCIpLnJlcGxhY2UoLywsL2csIiwiKTtmb3IoZT0wO2U8dS5sZW5ndGg7ZSsrKWk9aS5yZXBsYWNlKG5ldyBSZWdFeHAodVtlXSwiZyIpLCJ8Iit1W2VdKTt2YXIgYSxvPWkuc3BsaXQoInwiKSxyPTAsbD0wLGg9bmV3IHMsYz1zLkNNRDtmb3IoZT0xO2U8by5sZW5ndGg7ZSsrKXt2YXIgZCxmPW9bZV0scD1mLmNoYXJBdCgwKSxnPTAsbT1mLnNsaWNlKDEpLnJlcGxhY2UoL2UsLS9nLCJlLSIpLnNwbGl0KCIsIik7bS5sZW5ndGg+MCYmIiI9PT1tWzBdJiZtLnNoaWZ0KCk7Zm9yKHZhciB2PTA7djxtLmxlbmd0aDt2KyspbVt2XT1wYXJzZUZsb2F0KG1bdl0pO2Zvcig7ZzxtLmxlbmd0aCYmIWlzTmFOKG1bZ10pJiYhaXNOYU4obVswXSk7KXt2YXIgeSx4LF8sYix3LFMsTSxJPXIsVD1sO3N3aXRjaChwKXtjYXNlImwiOnIrPW1bZysrXSxsKz1tW2crK10sZD1jLkwsaC5hZGREYXRhKGQscixsKTticmVhaztjYXNlIkwiOnI9bVtnKytdLGw9bVtnKytdLGQ9Yy5MLGguYWRkRGF0YShkLHIsbCk7YnJlYWs7Y2FzZSJtIjpyKz1tW2crK10sbCs9bVtnKytdLGQ9Yy5NLGguYWRkRGF0YShkLHIsbCkscD0ibCI7YnJlYWs7Y2FzZSJNIjpyPW1bZysrXSxsPW1bZysrXSxkPWMuTSxoLmFkZERhdGEoZCxyLGwpLHA9IkwiO2JyZWFrO2Nhc2UiaCI6cis9bVtnKytdLGQ9Yy5MLGguYWRkRGF0YShkLHIsbCk7YnJlYWs7Y2FzZSJIIjpyPW1bZysrXSxkPWMuTCxoLmFkZERhdGEoZCxyLGwpO2JyZWFrO2Nhc2UidiI6bCs9bVtnKytdLGQ9Yy5MLGguYWRkRGF0YShkLHIsbCk7YnJlYWs7Y2FzZSJWIjpsPW1bZysrXSxkPWMuTCxoLmFkZERhdGEoZCxyLGwpO2JyZWFrO2Nhc2UiQyI6ZD1jLkMsaC5hZGREYXRhKGQsbVtnKytdLG1bZysrXSxtW2crK10sbVtnKytdLG1bZysrXSxtW2crK10pLHI9bVtnLTJdLGw9bVtnLTFdO2JyZWFrO2Nhc2UiYyI6ZD1jLkMsaC5hZGREYXRhKGQsbVtnKytdK3IsbVtnKytdK2wsbVtnKytdK3IsbVtnKytdK2wsbVtnKytdK3IsbVtnKytdK2wpLHIrPW1bZy0yXSxsKz1tW2ctMV07YnJlYWs7Y2FzZSJTIjp5PXIseD1sO3ZhciBBPWgubGVuKCksQz1oLmRhdGE7YT09PWMuQyYmKHkrPXItQ1tBLTRdLHgrPWwtQ1tBLTNdKSxkPWMuQyxJPW1bZysrXSxUPW1bZysrXSxyPW1bZysrXSxsPW1bZysrXSxoLmFkZERhdGEoZCx5LHgsSSxULHIsbCk7YnJlYWs7Y2FzZSJzIjp5PXIseD1sO3ZhciBBPWgubGVuKCksQz1oLmRhdGE7YT09PWMuQyYmKHkrPXItQ1tBLTRdLHgrPWwtQ1tBLTNdKSxkPWMuQyxJPXIrbVtnKytdLFQ9bCttW2crK10scis9bVtnKytdLGwrPW1bZysrXSxoLmFkZERhdGEoZCx5LHgsSSxULHIsbCk7YnJlYWs7Y2FzZSJRIjpJPW1bZysrXSxUPW1bZysrXSxyPW1bZysrXSxsPW1bZysrXSxkPWMuUSxoLmFkZERhdGEoZCxJLFQscixsKTticmVhaztjYXNlInEiOkk9bVtnKytdK3IsVD1tW2crK10rbCxyKz1tW2crK10sbCs9bVtnKytdLGQ9Yy5RLGguYWRkRGF0YShkLEksVCxyLGwpO2JyZWFrO2Nhc2UiVCI6eT1yLHg9bDt2YXIgQT1oLmxlbigpLEM9aC5kYXRhO2E9PT1jLlEmJih5Kz1yLUNbQS00XSx4Kz1sLUNbQS0zXSkscj1tW2crK10sbD1tW2crK10sZD1jLlEsaC5hZGREYXRhKGQseSx4LHIsbCk7YnJlYWs7Y2FzZSJ0Ijp5PXIseD1sO3ZhciBBPWgubGVuKCksQz1oLmRhdGE7YT09PWMuUSYmKHkrPXItQ1tBLTRdLHgrPWwtQ1tBLTNdKSxyKz1tW2crK10sbCs9bVtnKytdLGQ9Yy5RLGguYWRkRGF0YShkLHkseCxyLGwpO2JyZWFrO2Nhc2UiQSI6Xz1tW2crK10sYj1tW2crK10sdz1tW2crK10sUz1tW2crK10sTT1tW2crK10sST1yLFQ9bCxyPW1bZysrXSxsPW1bZysrXSxkPWMuQSxuKEksVCxyLGwsUyxNLF8sYix3LGQsaCk7YnJlYWs7Y2FzZSJhIjpfPW1bZysrXSxiPW1bZysrXSx3PW1bZysrXSxTPW1bZysrXSxNPW1bZysrXSxJPXIsVD1sLHIrPW1bZysrXSxsKz1tW2crK10sZD1jLkEsbihJLFQscixsLFMsTSxfLGIsdyxkLGgpfX0ieiIhPT1wJiYiWiIhPT1wfHwoZD1jLlosaC5hZGREYXRhKGQpKSxhPWR9cmV0dXJuIGgudG9TdGF0aWMoKSxofWZ1bmN0aW9uIG8odCxlKXt2YXIgaT1hKHQpO3JldHVybiBlPWV8fHt9LGUuYnVpbGRQYXRoPWZ1bmN0aW9uKHQpe2lmKHQuc2V0RGF0YSl7dC5zZXREYXRhKGkuZGF0YSk7dmFyIGU9dC5nZXRDb250ZXh0KCk7ZSYmdC5yZWJ1aWxkUGF0aChlKX1lbHNle3ZhciBlPXQ7aS5yZWJ1aWxkUGF0aChlKX19LGUuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odCl7bChpLHQpLHRoaXMuZGlydHkoITApfSxlfXZhciByPWkoOCkscz1pKDI3KSxsPWkoMTg3KSx1PVsibSIsIk0iLCJsIiwiTCIsInYiLCJWIiwiaCIsIkgiLCJ6IiwiWiIsImMiLCJDIiwicSIsIlEiLCJ0IiwiVCIsInMiLCJTIiwiYSIsIkEiXSxoPU1hdGguc3FydCxjPU1hdGguc2luLGQ9TWF0aC5jb3MsZj1NYXRoLlBJLHA9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKX0sZz1mdW5jdGlvbih0LGUpe3JldHVybih0WzBdKmVbMF0rdFsxXSplWzFdKS8ocCh0KSpwKGUpKX0sbT1mdW5jdGlvbih0LGUpe3JldHVybih0WzBdKmVbMV08dFsxXSplWzBdPy0xOjEpKk1hdGguYWNvcyhnKHQsZSkpfTt0LmV4cG9ydHM9e2NyZWF0ZUZyb21TdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHIobyh0LGUpKX0sZXh0ZW5kRnJvbVN0cmluZzpmdW5jdGlvbih0LGUpe3JldHVybiByLmV4dGVuZChvKHQsZSkpfSxtZXJnZVBhdGg6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W10sbj10Lmxlbmd0aCxhPTA7YTxuO2ErKyl7dmFyIG89dFthXTtvLnBhdGh8fG8uY3JlYXRlUGF0aFByb3h5KCksby5fX2RpcnR5UGF0aCYmby5idWlsZFBhdGgoby5wYXRoLG8uc2hhcGUsITApLGkucHVzaChvLnBhdGgpfXZhciBzPW5ldyByKGUpO3JldHVybiBzLmNyZWF0ZVBhdGhQcm94eSgpLHMuYnVpbGRQYXRoPWZ1bmN0aW9uKHQpe3QuYXBwZW5kUGF0aChpKTt2YXIgZT10LmdldENvbnRleHQoKTtlJiZ0LnJlYnVpbGRQYXRoKGUpfSxzfX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7dmFyIGksbixvLGgsYyxkLGY9dC5kYXRhLHA9YS5NLGc9YS5DLG09YS5MLHY9YS5SLHk9YS5BLHg9YS5RO2ZvcihvPTAsaD0wO288Zi5sZW5ndGg7KXtzd2l0Y2goaT1mW28rK10saD1vLG49MCxpKXtjYXNlIHA6Cm49MTticmVhaztjYXNlIG06bj0xO2JyZWFrO2Nhc2UgZzpuPTM7YnJlYWs7Y2FzZSB4Om49MjticmVhaztjYXNlIHk6dmFyIF89ZVs0XSxiPWVbNV0sdz1sKGVbMF0qZVswXStlWzFdKmVbMV0pLFM9bChlWzJdKmVbMl0rZVszXSplWzNdKSxNPXUoLWVbMV0vUyxlWzBdL3cpO2Zbb10qPXcsZltvKytdKz1fLGZbb10qPVMsZltvKytdKz1iLGZbbysrXSo9dyxmW28rK10qPVMsZltvKytdKz1NLGZbbysrXSs9TSxvKz0yLGg9bzticmVhaztjYXNlIHY6ZFswXT1mW28rK10sZFsxXT1mW28rK10scihkLGQsZSksZltoKytdPWRbMF0sZltoKytdPWRbMV0sZFswXSs9ZltvKytdLGRbMV0rPWZbbysrXSxyKGQsZCxlKSxmW2grK109ZFswXSxmW2grK109ZFsxXX1mb3IoYz0wO2M8bjtjKyspe3ZhciBkPXNbY107ZFswXT1mW28rK10sZFsxXT1mW28rK10scihkLGQsZSksZltoKytdPWRbMF0sZltoKytdPWRbMV19fX12YXIgYT1pKDI3KS5DTUQsbz1pKDYpLHI9by5hcHBseVRyYW5zZm9ybSxzPVtbXSxbXSxbXV0sbD1NYXRoLnNxcnQsdT1NYXRoLmF0YW4yO3QuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7aWYoIWkoMTApLmNhbnZhc1N1cHBvcnRlZCl7dmFyIG4sYT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiLG89d2luZG93LHI9by5kb2N1bWVudCxzPSExO3RyeXshci5uYW1lc3BhY2VzLnpydm1sJiZyLm5hbWVzcGFjZXMuYWRkKCJ6cnZtbCIsYSksbj1mdW5jdGlvbih0KXtyZXR1cm4gci5jcmVhdGVFbGVtZW50KCI8enJ2bWw6Iit0KycgY2xhc3M9Inpydm1sIj4nKX19Y2F0Y2godCl7bj1mdW5jdGlvbih0KXtyZXR1cm4gci5jcmVhdGVFbGVtZW50KCI8Iit0KycgeG1sbnM9IicrYSsnIiBjbGFzcz0ienJ2bWwiPicpfX12YXIgbD1mdW5jdGlvbigpe2lmKCFzKXtzPSEwO3ZhciB0PXIuc3R5bGVTaGVldHM7dC5sZW5ndGg8MzE/ci5jcmVhdGVTdHlsZVNoZWV0KCkuYWRkUnVsZSgiLnpydm1sIiwiYmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCkiKTp0WzBdLmFkZFJ1bGUoIi56cnZtbCIsImJlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpIil9fTt0LmV4cG9ydHM9e2RvYzpyLGluaXRWTUw6bCxjcmVhdGVOb2RlOm59fX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDE0KSxhPWkoMjUpLG89aSgzMjEpLHI9aSgxKSxzPXtfYmFzZUF4aXNEaW06bnVsbCxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpLG8scz1lLmdldENvbXBvbmVudCgieEF4aXMiLHRoaXMuZ2V0KCJ4QXhpc0luZGV4IikpLGw9ZS5nZXRDb21wb25lbnQoInlBeGlzIix0aGlzLmdldCgieUF4aXNJbmRleCIpKSx1PXMuZ2V0KCJ0eXBlIiksaD1sLmdldCgidHlwZSIpOyJjYXRlZ29yeSI9PT11Pyh0LmxheW91dD0iaG9yaXpvbnRhbCIsaT1zLmdldENhdGVnb3JpZXMoKSxvPSEwKToiY2F0ZWdvcnkiPT09aD8odC5sYXlvdXQ9InZlcnRpY2FsIixpPWwuZ2V0Q2F0ZWdvcmllcygpLG89ITApOnQubGF5b3V0PXQubGF5b3V0fHwiaG9yaXpvbnRhbCI7dmFyIGM9WyJ4IiwieSJdLGQ9Imhvcml6b250YWwiPT09dC5sYXlvdXQ/MDoxLGY9dGhpcy5fYmFzZUF4aXNEaW09Y1tkXSxwPWNbMS1kXSxnPXQuZGF0YTtvJiZyLmVhY2goZyxmdW5jdGlvbih0LGUpe3QudmFsdWUmJnIuaXNBcnJheSh0LnZhbHVlKT90LnZhbHVlLnVuc2hpZnQoZSk6ci5pc0FycmF5KHQpJiZ0LnVuc2hpZnQoZSl9KTt2YXIgbT10aGlzLmRlZmF1bHRWYWx1ZURpbWVuc2lvbnMsdj1be25hbWU6ZixvdGhlckRpbXM6e3Rvb2x0aXA6ITF9LGRpbXNEZWY6WyJiYXNlIl19LHtuYW1lOnAsZGltc0RlZjptLnNsaWNlKCl9XTt2PWEodixnLHtlbmNvZGVEZWY6dGhpcy5nZXQoImVuY29kZSIpLGRpbXNEZWY6dGhpcy5nZXQoImRpbWVuc2lvbnMiKSxkaW1Db3VudDptLmxlbmd0aCsxfSk7dmFyIHk9bmV3IG4odix0aGlzKTtyZXR1cm4geS5pbml0RGF0YShnLGk/aS5zbGljZSgpOm51bGwpLHl9LGdldEJhc2VBeGlzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmFzZUF4aXNEaW07cmV0dXJuIHRoaXMuZWNNb2RlbC5nZXRDb21wb25lbnQodCsiQXhpcyIsdGhpcy5nZXQodCsiQXhpc0luZGV4IikpLmF4aXN9fSxsPXtpbml0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd2hpc2tlckJveERyYXc9bmV3IG8odGhpcy5nZXRTdHlsZVVwZGF0ZXIoKSk7dGhpcy5ncm91cC5hZGQodC5ncm91cCl9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dGhpcy5fd2hpc2tlckJveERyYXcudXBkYXRlRGF0YSh0LmdldERhdGEoKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl93aGlza2VyQm94RHJhdy5yZW1vdmUoKX19O3QuZXhwb3J0cz17c2VyaWVzTW9kZWxNaXhpbjpzLHZpZXdNaXhpbjpsfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3ZhciBuPXRoaXMuX3RhcmdldEluZm9MaXN0PVtdLGE9e30scj1vKGUsdCk7cChfLGZ1bmN0aW9uKHQsZSl7KCFpfHwhaS5pbmNsdWRlfHxnKGkuaW5jbHVkZSxlKT49MCkmJnQocixuLGEpfSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdFswXT50WzFdJiZ0LnJldmVyc2UoKSx0fWZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gZC5wYXJzZUZpbmRlcih0LGUse2luY2x1ZGVNYWluVHlwZXM6eX0pfWZ1bmN0aW9uIHIodCxlLGksbil7dmFyIG89aS5nZXRBeGlzKFsieCIsInkiXVt0XSkscj1hKGgubWFwKFswLDFdLGZ1bmN0aW9uKHQpe3JldHVybiBlP28uY29vcmRUb0RhdGEoby50b0xvY2FsQ29vcmQoblt0XSkpOm8udG9HbG9iYWxDb29yZChvLmRhdGFUb0Nvb3JkKG5bdF0pKX0pKSxzPVtdO3JldHVybiBzW3RdPXIsc1sxLXRdPVtOYU4sTmFOXSx7dmFsdWVzOnIseHlNaW5NYXg6c319ZnVuY3Rpb24gcyh0LGUsaSxuKXtyZXR1cm5bZVswXS1uW3RdKmlbMF0sZVsxXS1uW3RdKmlbMV1dfWZ1bmN0aW9uIGwodCxlKXt2YXIgaT11KHQpLG49dShlKSxhPVtpWzBdL25bMF0saVsxXS9uWzFdXTtyZXR1cm4gaXNOYU4oYVswXSkmJihhWzBdPTEpLGlzTmFOKGFbMV0pJiYoYVsxXT0xKSxhfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQ/W3RbMF1bMV0tdFswXVswXSx0WzFdWzFdLXRbMV1bMF1dOltOYU4sTmFOXX12YXIgaD1pKDEpLGM9aSgzKSxkPWkoNSksZj1pKDE5MSkscD1oLmVhY2gsZz1oLmluZGV4T2YsbT1oLmN1cnJ5LHY9WyJkYXRhVG9Qb2ludCIsInBvaW50VG9EYXRhIl0seT1bImdyaWQiLCJ4QXhpcyIsInlBeGlzIiwiZ2VvIiwiZ3JhcGgiLCJwb2xhciIsInJhZGl1c0F4aXMiLCJhbmdsZUF4aXMiLCJibWFwIl0seD1uLnByb3RvdHlwZTt4LnNldE91dHB1dFJhbmdlcz1mdW5jdGlvbih0LGUpe3RoaXMubWF0Y2hPdXRwdXRSYW5nZXModCxlLGZ1bmN0aW9uKHQsZSxpKXtpZigodC5jb29yZFJhbmdlc3x8KHQuY29vcmRSYW5nZXM9W10pKS5wdXNoKGUpLCF0LmNvb3JkUmFuZ2Upe3QuY29vcmRSYW5nZT1lO3ZhciBuPVNbdC5icnVzaFR5cGVdKDAsaSxlKTt0Ll9fcmFuZ2VPZmZzZXQ9e29mZnNldDpNW3QuYnJ1c2hUeXBlXShuLnZhbHVlcyx0LnJhbmdlLFsxLDFdKSx4eU1pbk1heDpuLnh5TWluTWF4fX19KX0seC5tYXRjaE91dHB1dFJhbmdlcz1mdW5jdGlvbih0LGUsaSl7cCh0LGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZmluZFRhcmdldEluZm8odCxlKTtuJiZuIT09ITAmJmguZWFjaChuLmNvb3JkU3lzZXMsZnVuY3Rpb24obil7dmFyIGE9U1t0LmJydXNoVHlwZV0oMSxuLHQucmFuZ2UpO2kodCxhLnZhbHVlcyxuLGUpfSl9LHRoaXMpfSx4LnNldElucHV0UmFuZ2VzPWZ1bmN0aW9uKHQsZSl7cCh0LGZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZmluZFRhcmdldEluZm8odCxlKTtpZih0LnJhbmdlPXQucmFuZ2V8fFtdLGkmJmkhPT0hMCl7dC5wYW5lbElkPWkucGFuZWxJZDt2YXIgbj1TW3QuYnJ1c2hUeXBlXSgwLGkuY29vcmRTeXMsdC5jb29yZFJhbmdlKSxhPXQuX19yYW5nZU9mZnNldDt0LnJhbmdlPWE/TVt0LmJydXNoVHlwZV0obi52YWx1ZXMsYS5vZmZzZXQsbChuLnh5TWluTWF4LGEueHlNaW5NYXgpKTpuLnZhbHVlc319LHRoaXMpfSx4Lm1ha2VQYW5lbE9wdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC5tYXAodGhpcy5fdGFyZ2V0SW5mb0xpc3QsZnVuY3Rpb24oaSl7dmFyIG49aS5nZXRQYW5lbFJlY3QoKTtyZXR1cm57cGFuZWxJZDppLnBhbmVsSWQsZGVmYXVsdEJydXNoVHlwZTplJiZlKGkpLGNsaXBQYXRoOmYubWFrZVJlY3RQYW5lbENsaXBQYXRoKG4pLGlzVGFyZ2V0QnlDdXJzb3I6Zi5tYWtlUmVjdElzVGFyZ2V0QnlDdXJzb3Iobix0LGkuY29vcmRTeXNNb2RlbCksZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudDpmLm1ha2VMaW5lYXJCcnVzaE90aGVyRXh0ZW50KG4pfX0pfSx4LmNvbnRyb2xTZXJpZXM9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZmluZFRhcmdldEluZm8odCxpKTtyZXR1cm4gbj09PSEwfHxuJiZnKG4uY29vcmRTeXNlcyxlLmNvb3JkaW5hdGVTeXN0ZW0pPj0wfSx4LmZpbmRUYXJnZXRJbmZvPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuX3RhcmdldEluZm9MaXN0LG49byhlLHQpLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIHI9aVthXSxzPXQucGFuZWxJZDtpZihzKXtpZihyLnBhbmVsSWQ9PT1zKXJldHVybiByfWVsc2UgZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXShuLHIpKXJldHVybiByfXJldHVybiEwfTt2YXIgXz17Z3JpZDpmdW5jdGlvbih0LGUpe3ZhciBpPXQueEF4aXNNb2RlbHMsbj10LnlBeGlzTW9kZWxzLGE9dC5ncmlkTW9kZWxzLG89aC5jcmVhdGVIYXNoTWFwKCkscj17fSxzPXt9OyhpfHxufHxhKSYmKHAoaSxmdW5jdGlvbih0KXt2YXIgZT10LmF4aXMuZ3JpZC5tb2RlbDtvLnNldChlLmlkLGUpLHJbZS5pZF09ITB9KSxwKG4sZnVuY3Rpb24odCl7dmFyIGU9dC5heGlzLmdyaWQubW9kZWw7by5zZXQoZS5pZCxlKSxzW2UuaWRdPSEwfSkscChhLGZ1bmN0aW9uKHQpe28uc2V0KHQuaWQsdCksclt0LmlkXT0hMCxzW3QuaWRdPSEwfSksby5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBhPXQuY29vcmRpbmF0ZVN5c3RlbSxvPVtdO3AoYS5nZXRDYXJ0ZXNpYW5zKCksZnVuY3Rpb24odCxlKXsoZyhpLHQuZ2V0QXhpcygieCIpLm1vZGVsKT49MHx8ZyhuLHQuZ2V0QXhpcygieSIpLm1vZGVsKT49MCkmJm8ucHVzaCh0KX0pLGUucHVzaCh7cGFuZWxJZDoiZ3JpZC0tIit0LmlkLGdyaWRNb2RlbDp0LGNvb3JkU3lzTW9kZWw6dCxjb29yZFN5czpvWzBdLGNvb3JkU3lzZXM6byxnZXRQYW5lbFJlY3Q6dy5ncmlkLHhBeGlzRGVjbGFyZWQ6clt0LmlkXSx5QXhpc0RlY2xhcmVkOnNbdC5pZF19KX0pKX0sZ2VvOmZ1bmN0aW9uKHQsZSl7cCh0Lmdlb01vZGVscyxmdW5jdGlvbih0KXt2YXIgaT10LmNvb3JkaW5hdGVTeXN0ZW07ZS5wdXNoKHtwYW5lbElkOiJnZW8tLSIrdC5pZCxnZW9Nb2RlbDp0LGNvb3JkU3lzTW9kZWw6dCxjb29yZFN5czppLGNvb3JkU3lzZXM6W2ldLGdldFBhbmVsUmVjdDp3Lmdlb30pfSl9fSxiPVtmdW5jdGlvbih0LGUpe3ZhciBpPXQueEF4aXNNb2RlbCxuPXQueUF4aXNNb2RlbCxhPXQuZ3JpZE1vZGVsO3JldHVybiFhJiZpJiYoYT1pLmF4aXMuZ3JpZC5tb2RlbCksIWEmJm4mJihhPW4uYXhpcy5ncmlkLm1vZGVsKSxhJiZhPT09ZS5ncmlkTW9kZWx9LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZW9Nb2RlbDtyZXR1cm4gaSYmaT09PWUuZ2VvTW9kZWx9XSx3PXtncmlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmRTeXMuZ3JpZC5nZXRSZWN0KCkuY2xvbmUoKX0sZ2VvOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb29yZFN5cyxlPXQuZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtyZXR1cm4gZS5hcHBseVRyYW5zZm9ybShjLmdldFRyYW5zZm9ybSh0KSksZX19LFM9e2xpbmVYOm0ociwwKSxsaW5lWTptKHIsMSkscmVjdDpmdW5jdGlvbih0LGUsaSl7dmFyIG49ZVt2W3RdXShbaVswXVswXSxpWzFdWzBdXSksbz1lW3ZbdF1dKFtpWzBdWzFdLGlbMV1bMV1dKSxyPVthKFtuWzBdLG9bMF1dKSxhKFtuWzFdLG9bMV1dKV07cmV0dXJue3ZhbHVlczpyLHh5TWluTWF4OnJ9fSxwb2x5Z29uOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1bWzEvMCwtKDEvMCldLFsxLzAsLSgxLzApXV0sYT1oLm1hcChpLGZ1bmN0aW9uKGkpe3ZhciBhPWVbdlt0XV0oaSk7cmV0dXJuIG5bMF1bMF09TWF0aC5taW4oblswXVswXSxhWzBdKSxuWzFdWzBdPU1hdGgubWluKG5bMV1bMF0sYVsxXSksblswXVsxXT1NYXRoLm1heChuWzBdWzFdLGFbMF0pLG5bMV1bMV09TWF0aC5tYXgoblsxXVsxXSxhWzFdKSxhfSk7cmV0dXJue3ZhbHVlczphLHh5TWluTWF4Om59fX0sTT17bGluZVg6bShzLDApLGxpbmVZOm0ocywxKSxyZWN0OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm5bW3RbMF1bMF0taVswXSplWzBdWzBdLHRbMF1bMV0taVswXSplWzBdWzFdXSxbdFsxXVswXS1pWzFdKmVbMV1bMF0sdFsxXVsxXS1pWzFdKmVbMV1bMV1dXX0scG9seWdvbjpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGgubWFwKHQsZnVuY3Rpb24odCxuKXtyZXR1cm5bdFswXS1pWzBdKmVbbl1bMF0sdFsxXS1pWzFdKmVbbl1bMV1dfSl9fTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG8uY3JlYXRlKHQpfXZhciBhPWkoMTMzKSxvPWkoMTIpLHI9aSgzKSxzPXt9O3MubWFrZVJlY3RQYW5lbENsaXBQYXRoPWZ1bmN0aW9uKHQpe3JldHVybiB0PW4odCksZnVuY3Rpb24oZSxpKXtyZXR1cm4gci5jbGlwUG9pbnRzQnlSZWN0KGUsdCl9fSxzLm1ha2VMaW5lYXJCcnVzaE90aGVyRXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9bih0KSxmdW5jdGlvbihpKXt2YXIgbj1udWxsIT1lP2U6aSxhPW4/dC53aWR0aDp0LmhlaWdodCxvPW4/dC54OnQueTtyZXR1cm5bbyxvKyhhfHwwKV19fSxzLm1ha2VSZWN0SXNUYXJnZXRCeUN1cnNvcj1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQ9bih0KSxmdW5jdGlvbihuLG8scil7cmV0dXJuIHQuY29udGFpbihvWzBdLG9bMV0pJiYhYS5vbklycmVsZXZhbnRFbGVtZW50KG4sZSxpKX19LHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXQuZ2V0KCJib3VuZGluZ0Nvb3JkcyIpO2lmKG51bGwhPWkpe3ZhciBuPWlbMF0sYT1pWzFdO2lzTmFOKG5bMF0pfHxpc05hTihuWzFdKXx8aXNOYU4oYVswXSl8fGlzTmFOKGFbMV0pfHx0aGlzLnNldEJvdW5kaW5nUmVjdChuWzBdLG5bMV0sYVswXS1uWzBdLGFbMV0tblsxXSl9dmFyIG8scz10aGlzLmdldEJvdW5kaW5nUmVjdCgpLHU9dC5nZXQoImxheW91dENlbnRlciIpLGg9dC5nZXQoImxheW91dFNpemUiKSxjPWUuZ2V0V2lkdGgoKSxkPWUuZ2V0SGVpZ2h0KCksZj10LmdldCgiYXNwZWN0U2NhbGUiKXx8Ljc1LHA9cy53aWR0aC9zLmhlaWdodCpmLGc9ITE7dSYmaCYmKHU9W2wucGFyc2VQZXJjZW50KHVbMF0sYyksbC5wYXJzZVBlcmNlbnQodVsxXSxkKV0saD1sLnBhcnNlUGVyY2VudChoLE1hdGgubWluKGMsZCkpLGlzTmFOKHVbMF0pfHxpc05hTih1WzFdKXx8aXNOYU4oaCl8fChnPSEwKSk7dmFyIG07aWYoZyl7dmFyIG09e307cD4xPyhtLndpZHRoPWgsbS5oZWlnaHQ9aC9wKToobS5oZWlnaHQ9aCxtLndpZHRoPWgqcCksbS55PXVbMV0tbS5oZWlnaHQvMixtLng9dVswXS1tLndpZHRoLzJ9ZWxzZSBvPXQuZ2V0Qm94TGF5b3V0UGFyYW1zKCksby5hc3BlY3Q9cCxtPXIuZ2V0TGF5b3V0UmVjdChvLHt3aWR0aDpjLGhlaWdodDpkfSk7dGhpcy5zZXRWaWV3UmVjdChtLngsbS55LG0ud2lkdGgsbS5oZWlnaHQpLHRoaXMuc2V0Q2VudGVyKHQuZ2V0KCJjZW50ZXIiKSksdGhpcy5zZXRab29tKHQuZ2V0KCJ6b29tIikpfWZ1bmN0aW9uIGEodCxlKXtzLmVhY2goZS5nZXQoImdlb0Nvb3JkIiksZnVuY3Rpb24oZSxpKXt0LmFkZEdlb0Nvb3JkKGksZSl9KX12YXIgbz1pKDQwNikscj1pKDkpLHM9aSgxKSxsPWkoNCksdT17fSxoPXtkaW1lbnNpb25zOm8ucHJvdG90eXBlLmRpbWVuc2lvbnMsY3JlYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W107dC5lYWNoQ29tcG9uZW50KCJnZW8iLGZ1bmN0aW9uKHQscil7dmFyIHM9dC5nZXQoIm1hcCIpLGw9dVtzXSxoPW5ldyBvKHMrcixzLGwmJmwuZ2VvSnNvbixsJiZsLnNwZWNpYWxBcmVhcyx0LmdldCgibmFtZU1hcCIpKTtoLnpvb21MaW1pdD10LmdldCgic2NhbGVMaW1pdCIpLGkucHVzaChoKSxhKGgsdCksdC5jb29yZGluYXRlU3lzdGVtPWgsaC5tb2RlbD10LGgucmVzaXplPW4saC5yZXNpemUodCxlKX0pLHQuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT10LmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpO2lmKCJnZW8iPT09ZSl7dmFyIG49dC5nZXQoImdlb0luZGV4Iil8fDA7dC5jb29yZGluYXRlU3lzdGVtPWlbbl19fSk7dmFyIHI9e307cmV0dXJuIHQuZWFjaFNlcmllc0J5VHlwZSgibWFwIixmdW5jdGlvbih0KXtpZighdC5nZXRIb3N0R2VvTW9kZWwoKSl7dmFyIGU9dC5nZXRNYXBUeXBlKCk7cltlXT1yW2VdfHxbXSxyW2VdLnB1c2godCl9fSkscy5lYWNoKHIsZnVuY3Rpb24odCxyKXt2YXIgbD11W3JdLGg9cy5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoIm5hbWVNYXAiKX0pLGM9bmV3IG8ocixyLGwmJmwuZ2VvSnNvbixsJiZsLnNwZWNpYWxBcmVhcyxzLm1lcmdlQWxsKGgpKTtjLnpvb21MaW1pdD1zLnJldHJpZXZlLmFwcGx5KG51bGwscy5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoInNjYWxlTGltaXQiKX0pKSxpLnB1c2goYyksYy5yZXNpemU9bixjLnJlc2l6ZSh0WzBdLGUpLHMuZWFjaCh0LGZ1bmN0aW9uKHQpe3QuY29vcmRpbmF0ZVN5c3RlbT1jLGEoYyx0KX0pfSksaX0scmVnaXN0ZXJNYXA6ZnVuY3Rpb24odCxlLGkpe2UuZ2VvSnNvbiYmIWUuZmVhdHVyZXMmJihpPWUuc3BlY2lhbEFyZWFzLGU9ZS5nZW9Kc29uKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPSJ1bmRlZmluZWQiIT10eXBlb2YgSlNPTiYmSlNPTi5wYXJzZT9KU09OLnBhcnNlKGUpOm5ldyBGdW5jdGlvbigicmV0dXJuICgiK2UrIik7IikoKSksdVt0XT17Z2VvSnNvbjplLHNwZWNpYWxBcmVhczppfX0sZ2V0TWFwOmZ1bmN0aW9uKHQpe3JldHVybiB1W3RdfSxnZXRGaWxsZWRSZWdpb25zOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj0odHx8W10pLnNsaWNlKCk7aT1pfHx7fTt2YXIgYT1oLmdldE1hcChlKSxvPWEmJmEuZ2VvSnNvbjtpZighbylyZXR1cm4gdDtmb3IodmFyIHI9cy5jcmVhdGVIYXNoTWFwKCksbD1vLmZlYXR1cmVzLHU9MDt1PG4ubGVuZ3RoO3UrKylyLnNldChuW3VdLm5hbWUsblt1XSk7Zm9yKHZhciB1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBjPWxbdV0ucHJvcGVydGllcy5uYW1lO3IuZ2V0KGMpfHwoaS5oYXNPd25Qcm9wZXJ0eShjKSYmKGM9aVtjXSksbi5wdXNoKHtuYW1lOmN9KSl9cmV0dXJuIG59fSxjPWkoMik7Yy5yZWdpc3Rlck1hcD1oLnJlZ2lzdGVyTWFwLGMuZ2V0TWFwPWguZ2V0TWFwLGMucGFyc2VHZW9KU09OPWkoMjcwKSxjLmxvYWRNYXA9ZnVuY3Rpb24oKXt9LGMucmVnaXN0ZXJDb29yZGluYXRlU3lzdGVtKCJnZW8iLGgpLHQuZXhwb3J0cz1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtpZih0KWZvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITB9dmFyIGE9aSgxKSxvPWkoODgpLHI9YS5lYWNoLHM9e2NyZWF0ZVZpc3VhbE1hcHBpbmdzOmZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9O3QucHJvdG90eXBlLl9faGlkZGVuPXQucHJvdG90eXBlO3ZhciBlPW5ldyB0O3JldHVybiBlfXZhciBzPXt9O3JldHVybiByKGUsZnVuY3Rpb24oZSl7dmFyIGw9c1tlXT1uKCk7cih0W2VdLGZ1bmN0aW9uKHQsbil7aWYoby5pc1ZhbGlkVHlwZShuKSl7dmFyIHI9e3R5cGU6bix2aXN1YWw6dH07aSYmaShyLGUpLGxbbl09bmV3IG8ociksIm9wYWNpdHkiPT09biYmKHI9YS5jbG9uZShyKSxyLnR5cGU9ImNvbG9yQWxwaGEiLGwuX19oaWRkZW4uX19hbHBoYUZvck9wYWNpdHk9bmV3IG8ocikpfX0pfSksc30scmVwbGFjZVZpc3VhbE9wdGlvbjpmdW5jdGlvbih0LGUsaSl7dmFyIG87YS5lYWNoKGksZnVuY3Rpb24odCl7ZS5oYXNPd25Qcm9wZXJ0eSh0KSYmbihlW3RdKSYmKG89ITApfSksbyYmYS5lYWNoKGksZnVuY3Rpb24oaSl7ZS5oYXNPd25Qcm9wZXJ0eShpKSYmbihlW2ldKT90W2ldPWEuY2xvbmUoZVtpXSk6ZGVsZXRlIHRbaV19KX0sYXBwbHlWaXN1YWw6ZnVuY3Rpb24odCxlLGksbixyLHMpe2Z1bmN0aW9uIGwodCl7cmV0dXJuIGkuZ2V0SXRlbVZpc3VhbChkLHQpfWZ1bmN0aW9uIHUodCxlKXtpLnNldEl0ZW1WaXN1YWwoZCx0LGUpfWZ1bmN0aW9uIGgodCxhKXtkPW51bGw9PXM/dDphO3ZhciBvPWkuZ2V0UmF3RGF0YUl0ZW0oZCk7aWYoIW98fG8udmlzdWFsTWFwIT09ITEpZm9yKHZhciBoPW4uY2FsbChyLHQpLGY9ZVtoXSxwPWNbaF0sZz0wLG09cC5sZW5ndGg7ZzxtO2crKyl7dmFyIHY9cFtnXTtmW3ZdJiZmW3ZdLmFwcGx5VmlzdWFsKHQsbCx1KX19dmFyIGM9e307YS5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIGk9by5wcmVwYXJlVmlzdWFsVHlwZXMoZVt0XSk7Y1t0XT1pfSk7dmFyIGQ7bnVsbD09cz9pLmVhY2goaCwhMCk6aS5lYWNoKFtzXSxoLCEwKX19O3QuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBuKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBhKHQpe2lmKGg9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHQsMCk7aWYoKGg9PT1pfHwhaCkmJnNldFRpbWVvdXQpcmV0dXJuIGg9c2V0VGltZW91dCxzZXRUaW1lb3V0KHQsMCk7dHJ5e3JldHVybiBoKHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBoLmNhbGwobnVsbCx0LDApfWNhdGNoKGUpe3JldHVybiBoLmNhbGwodGhpcyx0LDApfX19ZnVuY3Rpb24gbyh0KXtpZihjPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGM9PT1ufHwhYykmJmNsZWFyVGltZW91dClyZXR1cm4gYz1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtyZXR1cm4gYyh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGMuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiBjLmNhbGwodGhpcyx0KX19fWZ1bmN0aW9uIHIoKXtnJiZmJiYoZz0hMSxmLmxlbmd0aD9wPWYuY29uY2F0KHApOm09LTEscC5sZW5ndGgmJnMoKSl9ZnVuY3Rpb24gcygpe2lmKCFnKXt2YXIgdD1hKHIpO2c9ITA7Zm9yKHZhciBlPXAubGVuZ3RoO2U7KXtmb3IoZj1wLHA9W107KyttPGU7KWYmJmZbbV0ucnVuKCk7bT0tMSxlPXAubGVuZ3RofWY9bnVsbCxnPSExLG8odCl9fWZ1bmN0aW9uIGwodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1mdW5jdGlvbiB1KCl7fXZhciBoLGMsZD10LmV4cG9ydHM9e307IWZ1bmN0aW9uKCl7dHJ5e2g9ImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDppfWNhdGNoKHQpe2g9aX10cnl7Yz0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpufWNhdGNoKHQpe2M9bn19KCk7dmFyIGYscD1bXSxnPSExLG09LTE7ZC5uZXh0VGljaz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyllW2ktMV09YXJndW1lbnRzW2ldO3AucHVzaChuZXcgbCh0LGUpKSwxIT09cC5sZW5ndGh8fGd8fGEocyl9LGwucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LGQudGl0bGU9ImJyb3dzZXIiLGQuYnJvd3Nlcj0hMCxkLmVudj17fSxkLmFyZ3Y9W10sZC52ZXJzaW9uPSIiLGQudmVyc2lvbnM9e30sZC5vbj11LGQuYWRkTGlzdGVuZXI9dSxkLm9uY2U9dSxkLm9mZj11LGQucmVtb3ZlTGlzdGVuZXI9dSxkLnJlbW92ZUFsbExpc3RlbmVycz11LGQuZW1pdD11LGQucHJlcGVuZExpc3RlbmVyPXUsZC5wcmVwZW5kT25jZUxpc3RlbmVyPXUsZC5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuW119LGQuYmluZGluZz1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGQuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxkLmNoZGlyPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LGQudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7dGhpcy5ncm91cD1uZXcgYS5Hcm91cCx0aGlzLl9zeW1ib2xFbD1uZXcgcih7fSl9dmFyIGE9aSgzKSxvPWkoMjQpLHI9YS5leHRlbmRTaGFwZSh7c2hhcGU6e3BvaW50czpudWxsLHNpemVzOm51bGx9LHN5bWJvbFByb3h5Om51bGwsYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWUucG9pbnRzLG49ZS5zaXplcyxhPXRoaXMuc3ltYm9sUHJveHksbz1hLnNoYXBlLHI9MDtyPGkubGVuZ3RoO3IrKyl7dmFyIHM9aVtyXTtpZighaXNOYU4oc1swXSkmJiFpc05hTihzWzFdKSl7dmFyIGw9bltyXTtsWzBdPDQ/dC5yZWN0KHNbMF0tbFswXS8yLHNbMV0tbFsxXS8yLGxbMF0sbFsxXSk6KG8ueD1zWzBdLWxbMF0vMixvLnk9c1sxXS1sWzFdLzIsby53aWR0aD1sWzBdLG8uaGVpZ2h0PWxbMV0sYS5idWlsZFBhdGgodCxvLCEwKSl9fX0sZmluZERhdGFJbmRleDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLnNoYXBlLG49aS5wb2ludHMsYT1pLnNpemVzLG89bi5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIHI9bltvXSxzPWFbb10sbD1yWzBdLXNbMF0vMix1PXJbMV0tc1sxXS8yO2lmKHQ+PWwmJmU+PXUmJnQ8PWwrc1swXSYmZTw9dStzWzFdKXJldHVybiBvfXJldHVybi0xfX0pLHM9bi5wcm90b3R5cGU7cy51cGRhdGVEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIGU9dGhpcy5fc3ltYm9sRWwsaT10Lmhvc3RNb2RlbDtlLnNldFNoYXBlKHtwb2ludHM6dC5tYXBBcnJheSh0LmdldEl0ZW1MYXlvdXQpLHNpemVzOnQubWFwQXJyYXkoZnVuY3Rpb24oZSl7dmFyIGk9dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbFNpemUiKTtyZXR1cm4gaSBpbnN0YW5jZW9mIEFycmF5fHwoaT1baSxpXSksaX0pfSksZS5zeW1ib2xQcm94eT1vLmNyZWF0ZVN5bWJvbCh0LmdldFZpc3VhbCgic3ltYm9sIiksMCwwLDAsMCksZS5zZXRDb2xvcj1lLnN5bWJvbFByb3h5LnNldENvbG9yLGUudXNlU3R5bGUoaS5nZXRNb2RlbCgiaXRlbVN0eWxlLm5vcm1hbCIpLmdldEl0ZW1TdHlsZShbImNvbG9yIl0pKTt2YXIgbj10LmdldFZpc3VhbCgiY29sb3IiKTtuJiZlLnNldENvbG9yKG4pLGUuc2VyaWVzSW5kZXg9aS5zZXJpZXNJbmRleCxlLm9uKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKHQpe2UuZGF0YUluZGV4PW51bGw7dmFyIGk9ZS5maW5kRGF0YUluZGV4KHQub2Zmc2V0WCx0Lm9mZnNldFkpO2k+PTAmJihlLmRhdGFJbmRleD1pKX0pLHRoaXMuZ3JvdXAuYWRkKGUpfSxzLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKTt0aGlzLl9zeW1ib2xFbC5zZXRTaGFwZSh7cG9pbnRzOmUubWFwQXJyYXkoZS5nZXRJdGVtTGF5b3V0KX0pfSxzLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gaXNOYU4oK3QuY3B4MSl8fGlzTmFOKCt0LmNweTEpfXZhciBhPWkoMyksbz1pKDYpLHI9YS5MaW5lLnByb3RvdHlwZSxzPWEuQmV6aWVyQ3VydmUucHJvdG90eXBlO3QuZXhwb3J0cz1hLmV4dGVuZFNoYXBlKHt0eXBlOiJlYy1saW5lIixzdHlsZTp7c3Ryb2tlOiIjMDAwIixmaWxsOm51bGx9LHNoYXBlOnt4MTowLHkxOjAseDI6MCx5MjowLHBlcmNlbnQ6MSxjcHgxOm51bGwsY3B5MTpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXsobihlKT9yOnMpLmJ1aWxkUGF0aCh0LGUpfSxwb2ludEF0OmZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMuc2hhcGUpP3IucG9pbnRBdC5jYWxsKHRoaXMsdCk6cy5wb2ludEF0LmNhbGwodGhpcyx0KX0sdGFuZ2VudEF0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2hhcGUsaT1uKGUpP1tlLngyLWUueDEsZS55Mi1lLnkxXTpzLnRhbmdlbnRBdC5jYWxsKHRoaXMsdCk7cmV0dXJuIG8ubm9ybWFsaXplKGksaSl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgyKTtpKDE5OCksaSgxOTkpLGEucmVnaXN0ZXJWaXN1YWwobi5jdXJyeShpKDUxKSwic2NhdHRlciIsImNpcmNsZSIsbnVsbCkpLGEucmVnaXN0ZXJMYXlvdXQobi5jdXJyeShpKDY0KSwic2NhdHRlciIpKSxpKDMyKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDI4KSxhPWkoMTcpO3QuZXhwb3J0cz1hLmV4dGVuZCh7dHlwZToic2VyaWVzLnNjYXR0ZXIiLGRlcGVuZGVuY2llczpbImdyaWQiLCJwb2xhciIsImdlbyIsInNpbmdsZUF4aXMiLCJjYWxlbmRhciJdLGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odC5kYXRhLHRoaXMsZSl9LGJydXNoU2VsZWN0b3I6InBvaW50IixkZWZhdWx0T3B0aW9uOntjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsemxldmVsOjAsejoyLGxlZ2VuZEhvdmVyTGluazohMCxob3ZlckFuaW1hdGlvbjohMCxzeW1ib2xTaXplOjEwLGxhcmdlOiExLGxhcmdlVGhyZXNob2xkOjJlMyxpdGVtU3R5bGU6e25vcm1hbDp7b3BhY2l0eTouOH19fX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg0NiksYT1pKDE5NSk7aSgyKS5leHRlbmRDaGFydFZpZXcoe3R5cGU6InNjYXR0ZXIiLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9ub3JtYWxTeW1ib2xEcmF3PW5ldyBuLHRoaXMuX2xhcmdlU3ltYm9sRHJhdz1uZXcgYX0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmdldERhdGEoKSxhPXRoaXMuX2xhcmdlU3ltYm9sRHJhdyxvPXRoaXMuX25vcm1hbFN5bWJvbERyYXcscj10aGlzLmdyb3VwLHM9dC5nZXQoImxhcmdlIikmJm4uY291bnQoKT50LmdldCgibGFyZ2VUaHJlc2hvbGQiKT9hOm87dGhpcy5fc3ltYm9sRHJhdz1zLHMudXBkYXRlRGF0YShuKSxyLmFkZChzLmdyb3VwKSxyLnJlbW92ZShzPT09YT9vLmdyb3VwOmEuZ3JvdXApfSx1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCl7dGhpcy5fc3ltYm9sRHJhdy51cGRhdGVMYXlvdXQodCl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3N5bWJvbERyYXcmJnRoaXMuX3N5bWJvbERyYXcucmVtb3ZlKGUsITApfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyKSxhPW4uZXh0ZW5kQ29tcG9uZW50TW9kZWwoe3R5cGU6ImF4aXNQb2ludGVyIixjb29yZFN5c0F4ZXNJbmZvOm51bGwsZGVmYXVsdE9wdGlvbjp7c2hvdzoiYXV0byIsdHJpZ2dlck9uOm51bGwsemxldmVsOjAsejo1MCx0eXBlOiJsaW5lIixzbmFwOiExLHRyaWdnZXJUb29sdGlwOiEwLHZhbHVlOm51bGwsc3RhdHVzOm51bGwsbGluazpbXSxhbmltYXRpb246bnVsbCxhbmltYXRpb25EdXJhdGlvblVwZGF0ZToyMDAsbGluZVN0eWxlOntjb2xvcjoiI2FhYSIsd2lkdGg6MSx0eXBlOiJzb2xpZCJ9LHNoYWRvd1N0eWxlOntjb2xvcjoicmdiYSgxNTAsMTUwLDE1MCwwLjMpIn0sbGFiZWw6e3Nob3c6ITAsZm9ybWF0dGVyOm51bGwscHJlY2lzaW9uOiJhdXRvIixtYXJnaW46Myxjb2xvcjoiI2ZmZiIscGFkZGluZzpbNSw3LDUsN10sYmFja2dyb3VuZENvbG9yOiJhdXRvIixib3JkZXJDb2xvcjpudWxsLGJvcmRlcldpZHRoOjAsc2hhZG93Qmx1cjozLHNoYWRvd0NvbG9yOiIjYWFhIn0saGFuZGxlOntzaG93OiExLGljb246Ik0xMC43LDExLjl2LTEuM0g5LjN2MS4zYy00LjksMC4zLTguOCw0LjQtOC44LDkuNGMwLDUsMy45LDkuMSw4LjgsOS40aDEuM2M0LjktMC4zLDguOC00LjQsOC44LTkuNEMxOS41LDE2LjMsMTUuNiwxMi4yLDEwLjcsMTEuOXogTTEzLjMsMjQuNEg2Ljd2LTEuMmg2LjZ6IE0xMy4zLDIySDYuN3YtMS4yaDYuNnogTTEzLjMsMTkuNkg2Ljd2LTEuMmg2LjZ6IixzaXplOjQ1LG1hcmdpbjo1MCxjb2xvcjoiIzMzMyIsc2hhZG93Qmx1cjozLHNoYWRvd0NvbG9yOiIjYWFhIixzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WToyLHRocm90dGxlOjQwfX19KTt0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTI3KSxhPWkoMikuZXh0ZW5kQ29tcG9uZW50Vmlldyh7dHlwZToiYXhpc1BvaW50ZXIiLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIGE9ZS5nZXRDb21wb25lbnQoInRvb2x0aXAiKSxvPXQuZ2V0KCJ0cmlnZ2VyT24iKXx8YSYmYS5nZXQoInRyaWdnZXJPbiIpfHwibW91c2Vtb3ZlfGNsaWNrIjtuLnJlZ2lzdGVyKCJheGlzUG9pbnRlciIsaSxmdW5jdGlvbih0LGUsaSl7Im5vbmUiIT09byYmKCJsZWF2ZSI9PT10fHxvLmluZGV4T2YodCk+PTApJiZpKHt0eXBlOiJ1cGRhdGVBeGlzUG9pbnRlciIsY3VyclRyaWdnZXI6dCx4OmUmJmUub2Zmc2V0WCx5OmUmJmUub2Zmc2V0WX0pfSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe24uZGlzb3BzZShlLmdldFpyKCksImF4aXNQb2ludGVyIiksYS5zdXBlckFwcGx5KHRoaXMuX21vZGVsLCJyZW1vdmUiLGFyZ3VtZW50cyl9LGRpc3Bvc2U6ZnVuY3Rpb24odCxlKXtuLnVucmVnaXN0ZXIoImF4aXNQb2ludGVyIixlKSxhLnN1cGVyQXBwbHkodGhpcy5fbW9kZWwsImRpc3Bvc2UiLGFyZ3VtZW50cyl9fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj10LmN1cnJUcmlnZ2VyLG89W3QueCx0LnldLGc9dCxtPXQuZGlzcGF0Y2hBY3Rpb258fHAuYmluZChpLmRpc3BhdGNoQWN0aW9uLGkpLF89ZS5nZXRDb21wb25lbnQoImF4aXNQb2ludGVyIikuY29vcmRTeXNBeGVzSW5mbztpZihfKXtmKG8pJiYobz12KHtzZXJpZXNJbmRleDpnLnNlcmllc0luZGV4LGRhdGFJbmRleDpnLmRhdGFJbmRleH0sZSkucG9pbnQpO3ZhciBiPWYobyksdz1nLmF4ZXNJbmZvLFM9Xy5heGVzSW5mbyxNPSJsZWF2ZSI9PT1ufHxmKG8pLEk9e30sVD17fSxBPXtsaXN0OltdLG1hcDp7fX0sQz17c2hvd1BvaW50ZXI6eChyLFQpLHNob3dUb29sdGlwOngocyxBKX07eShfLmNvb3JkU3lzTWFwLGZ1bmN0aW9uKHQsZSl7dmFyIGk9Ynx8dC5jb250YWluUG9pbnQobyk7eShfLmNvb3JkU3lzQXhlc0luZm9bZV0sZnVuY3Rpb24odCxlKXt2YXIgbj10LmF4aXMscj1jKHcsdCk7aWYoIU0mJmkmJighd3x8cikpe3ZhciBzPXImJnIudmFsdWU7bnVsbCE9c3x8Ynx8KHM9bi5wb2ludFRvRGF0YShvKSksbnVsbCE9cyYmYSh0LHMsQywhMSxJKX19KX0pO3ZhciBMPXt9O3JldHVybiB5KFMsZnVuY3Rpb24odCxlKXt2YXIgaT10LmxpbmtHcm91cDtpJiYhVFtlXSYmeShpLmF4ZXNJbmZvLGZ1bmN0aW9uKGUsbil7dmFyIGE9VFtuXTtpZihlIT09dCYmYSl7dmFyIG89YS52YWx1ZTtpLm1hcHBlciYmKG89dC5heGlzLnNjYWxlLnBhcnNlKGkubWFwcGVyKG8sZChlKSxkKHQpKSkpLExbdC5rZXldPW99fSl9KSx5KEwsZnVuY3Rpb24odCxlKXthKFNbZV0sdCxDLCEwLEkpfSksbChULFMsSSksdShBLG8sdCxtKSxoKFMsbSxpKSxJfX1mdW5jdGlvbiBhKHQsZSxpLG4sYSl7dmFyIHI9dC5heGlzO2lmKCFyLnNjYWxlLmlzQmxhbmsoKSYmci5jb250YWluRGF0YShlKSl7aWYoIXQuaW52b2x2ZVNlcmllcylyZXR1cm4gdm9pZCBpLnNob3dQb2ludGVyKHQsZSk7dmFyIHM9byhlLHQpLGw9cy5wYXlsb2FkQmF0Y2gsdT1zLnNuYXBUb1ZhbHVlO2xbMF0mJm51bGw9PWEuc2VyaWVzSW5kZXgmJnAuZXh0ZW5kKGEsbFswXSksIW4mJnQuc25hcCYmci5jb250YWluRGF0YSh1KSYmbnVsbCE9dSYmKGU9dSksaS5zaG93UG9pbnRlcih0LGUsbCxhKSxpLnNob3dUb29sdGlwKHQscyx1KX19ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPWUuYXhpcyxuPWkuZGltLGE9dCxvPVtdLHI9TnVtYmVyLk1BWF9WQUxVRSxzPS0xO3JldHVybiB5KGUuc2VyaWVzTW9kZWxzLGZ1bmN0aW9uKGUsbCl7dmFyIHUsaCxjPWUuY29vcmREaW1Ub0RhdGFEaW0obik7aWYoZS5nZXRBeGlzVG9vbHRpcERhdGEpe3ZhciBkPWUuZ2V0QXhpc1Rvb2x0aXBEYXRhKGMsdCxpKTtoPWQuZGF0YUluZGljZXMsdT1kLm5lc3Rlc3RWYWx1ZX1lbHNle2lmKGg9ZS5nZXREYXRhKCkuaW5kaWNlc09mTmVhcmVzdChjWzBdLHQsITEsImNhdGVnb3J5Ij09PWkudHlwZT8uNTpudWxsKSwhaC5sZW5ndGgpcmV0dXJuO3U9ZS5nZXREYXRhKCkuZ2V0KGNbMF0saFswXSl9aWYobnVsbCE9dSYmaXNGaW5pdGUodSkpe3ZhciBmPXQtdSxwPU1hdGguYWJzKGYpO3A8PXImJigocDxyfHxmPj0wJiZzPDApJiYocj1wLHM9ZixhPXUsby5sZW5ndGg9MCkseShoLGZ1bmN0aW9uKHQpe28ucHVzaCh7c2VyaWVzSW5kZXg6ZS5zZXJpZXNJbmRleCxkYXRhSW5kZXhJbnNpZGU6dCxkYXRhSW5kZXg6ZS5nZXREYXRhKCkuZ2V0UmF3SW5kZXgodCl9KX0pKX19KSx7cGF5bG9hZEJhdGNoOm8sc25hcFRvVmFsdWU6YX19ZnVuY3Rpb24gcih0LGUsaSxuKXt0W2Uua2V5XT17dmFsdWU6aSxwYXlsb2FkQmF0Y2g6bn19ZnVuY3Rpb24gcyh0LGUsaSxuKXt2YXIgYT1pLnBheWxvYWRCYXRjaCxvPWUuYXhpcyxyPW8ubW9kZWwscz1lLmF4aXNQb2ludGVyTW9kZWw7aWYoZS50cmlnZ2VyVG9vbHRpcCYmYS5sZW5ndGgpe3ZhciBsPWUuY29vcmRTeXMubW9kZWwsdT1tLm1ha2VLZXkobCksaD10Lm1hcFt1XTtofHwoaD10Lm1hcFt1XT17Y29vcmRTeXNJZDpsLmlkLGNvb3JkU3lzSW5kZXg6bC5jb21wb25lbnRJbmRleCxjb29yZFN5c1R5cGU6bC50eXBlLGNvb3JkU3lzTWFpblR5cGU6bC5tYWluVHlwZSxkYXRhQnlBeGlzOltdfSx0Lmxpc3QucHVzaChoKSksaC5kYXRhQnlBeGlzLnB1c2goe2F4aXNEaW06by5kaW0sYXhpc0luZGV4OnIuY29tcG9uZW50SW5kZXgsYXhpc1R5cGU6ci50eXBlLGF4aXNJZDpyLmlkLHZhbHVlOm4sdmFsdWVMYWJlbE9wdDp7cHJlY2lzaW9uOnMuZ2V0KCJsYWJlbC5wcmVjaXNpb24iKSxmb3JtYXR0ZXI6cy5nZXQoImxhYmVsLmZvcm1hdHRlciIpfSxzZXJpZXNEYXRhSW5kaWNlczphLnNsaWNlKCl9KX19ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG49aS5heGVzSW5mbz1bXTt5KGUsZnVuY3Rpb24oZSxpKXt2YXIgYT1lLmF4aXNQb2ludGVyTW9kZWwub3B0aW9uLG89dFtpXTtvPyghZS51c2VIYW5kbGUmJihhLnN0YXR1cz0ic2hvdyIpLGEudmFsdWU9by52YWx1ZSxhLnNlcmllc0RhdGFJbmRpY2VzPShvLnBheWxvYWRCYXRjaHx8W10pLnNsaWNlKCkpOiFlLnVzZUhhbmRsZSYmKGEuc3RhdHVzPSJoaWRlIiksInNob3ciPT09YS5zdGF0dXMmJm4ucHVzaCh7YXhpc0RpbTplLmF4aXMuZGltLGF4aXNJbmRleDplLmF4aXMubW9kZWwuY29tcG9uZW50SW5kZXgsdmFsdWU6YS52YWx1ZX0pfSl9ZnVuY3Rpb24gdSh0LGUsaSxuKXtpZihmKGUpfHwhdC5saXN0Lmxlbmd0aClyZXR1cm4gdm9pZCBuKHt0eXBlOiJoaWRlVGlwIn0pO3ZhciBhPSgodC5saXN0WzBdLmRhdGFCeUF4aXNbMF18fHt9KS5zZXJpZXNEYXRhSW5kaWNlc3x8W10pWzBdfHx7fTtuKHt0eXBlOiJzaG93VGlwIixlc2NhcGVDb25uZWN0OiEwLHg6ZVswXSx5OmVbMV0sdG9vbHRpcE9wdGlvbjppLnRvb2x0aXBPcHRpb24scG9zaXRpb246aS5wb3NpdGlvbixkYXRhSW5kZXhJbnNpZGU6YS5kYXRhSW5kZXhJbnNpZGUsZGF0YUluZGV4OmEuZGF0YUluZGV4LHNlcmllc0luZGV4OmEuc2VyaWVzSW5kZXgsZGF0YUJ5Q29vcmRTeXM6dC5saXN0fSl9ZnVuY3Rpb24gaCh0LGUsaSl7dmFyIG49aS5nZXRacigpLGE9ImF4aXNQb2ludGVyTGFzdEhpZ2hsaWdodHMiLG89XyhuKVthXXx8e30scj1fKG4pW2FdPXt9O3kodCxmdW5jdGlvbih0LGUpe3ZhciBpPXQuYXhpc1BvaW50ZXJNb2RlbC5vcHRpb247InNob3ciPT09aS5zdGF0dXMmJnkoaS5zZXJpZXNEYXRhSW5kaWNlcyxmdW5jdGlvbih0KXt2YXIgZT10LnNlcmllc0luZGV4KyIgfCAiK3QuZGF0YUluZGV4O3JbZV09dH0pfSk7dmFyIHM9W10sbD1bXTtwLmVhY2gobyxmdW5jdGlvbih0LGUpeyFyW2VdJiZsLnB1c2godCl9KSxwLmVhY2gocixmdW5jdGlvbih0LGUpeyFvW2VdJiZzLnB1c2godCl9KSxsLmxlbmd0aCYmaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiZG93bnBsYXkiLGVzY2FwZUNvbm5lY3Q6ITAsYmF0Y2g6bH0pLHMubGVuZ3RoJiZpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJoaWdobGlnaHQiLGVzY2FwZUNvbm5lY3Q6ITAsYmF0Y2g6c30pfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIGk9MDtpPCh0fHxbXSkubGVuZ3RoO2krKyl7dmFyIG49dFtpXTtpZihlLmF4aXMuZGltPT09bi5heGlzRGltJiZlLmF4aXMubW9kZWwuY29tcG9uZW50SW5kZXg9PT1uLmF4aXNJbmRleClyZXR1cm4gbn19ZnVuY3Rpb24gZCh0KXt2YXIgZT10LmF4aXMubW9kZWwsaT17fSxuPWkuYXhpc0RpbT10LmF4aXMuZGltO3JldHVybiBpLmF4aXNJbmRleD1pW24rIkF4aXNJbmRleCJdPWUuY29tcG9uZW50SW5kZXgsaS5heGlzTmFtZT1pW24rIkF4aXNOYW1lIl09ZS5uYW1lLGkuYXhpc0lkPWlbbisiQXhpc0lkIl09ZS5pZCxpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIXR8fG51bGw9PXRbMF18fGlzTmFOKHRbMF0pfHxudWxsPT10WzFdfHxpc05hTih0WzFdKX12YXIgcD1pKDEpLGc9aSg1KSxtPWkoNDcpLHY9aSgxMjYpLHk9cC5lYWNoLHg9cC5jdXJyeSxfPWcubWFrZUdldHRlcigpO3QuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7aSgxMzEpLGkoNDgpLGkoNDkpLGkoMjA5KSxpKDIxMCksaSgyMDUpLGkoMjA2KSxpKDEyOSksaSgxMjgpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49WzEvMCwtKDEvMCldO3JldHVybiBoKGksZnVuY3Rpb24odCl7dmFyIGk9dC5nZXREYXRhKCk7aSYmaCh0LmNvb3JkRGltVG9EYXRhRGltKGUpLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0RGF0YUV4dGVudCh0KTtlWzBdPG5bMF0mJihuWzBdPWVbMF0pLGVbMV0+blsxXSYmKG5bMV09ZVsxXSl9KX0pLG5bMV08blswXSYmKG49W05hTixOYU5dKSxhKHQsbiksbn1mdW5jdGlvbiBhKHQsZSl7dmFyIGk9dC5nZXRBeGlzTW9kZWwoKSxuPWkuZ2V0TWluKCEwKSxhPSJjYXRlZ29yeSI9PT1pLmdldCgidHlwZSIpLG89YSYmKGkuZ2V0KCJkYXRhIil8fFtdKS5sZW5ndGg7bnVsbCE9biYmImRhdGFNaW4iIT09biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4/ZVswXT1uOmEmJihlWzBdPW8+MD8wOk5hTik7dmFyIHI9aS5nZXRNYXgoITApO3JldHVybiBudWxsIT1yJiYiZGF0YU1heCIhPT1yJiYiZnVuY3Rpb24iIT10eXBlb2Ygcj9lWzFdPXI6YSYmKGVbMV09bz4wP28tMTpOYU4pLGkuZ2V0KCJzY2FsZSIsITApfHwoZVswXT4wJiYoZVswXT0wKSxlWzFdPDAmJihlWzFdPTApKSxlfWZ1bmN0aW9uIG8odCxlKXt2YXIgaT10LmdldEF4aXNNb2RlbCgpLG49dC5fcGVyY2VudFdpbmRvdyxhPXQuX3ZhbHVlV2luZG93O2lmKG4pe3ZhciBvPWwuZ2V0UGl4ZWxQcmVjaXNpb24oYSxbMCw1MDBdKTtvPU1hdGgubWluKG8sMjApO3ZhciByPWV8fDA9PT1uWzBdJiYxMDA9PT1uWzFdO2kuc2V0UmFuZ2Uocj9udWxsOithWzBdLnRvRml4ZWQobykscj9udWxsOithWzFdLnRvRml4ZWQobykpfX1mdW5jdGlvbiByKHQpe3ZhciBlPXQuX21pbk1heFNwYW49e30saT10Ll9kYXRhWm9vbU1vZGVsO2goWyJtaW4iLCJtYXgiXSxmdW5jdGlvbihuKXtlW24rIlNwYW4iXT1pLmdldChuKyJTcGFuIik7dmFyIGE9aS5nZXQobisiVmFsdWVTcGFuIik7bnVsbCE9YSYmKGVbbisiVmFsdWVTcGFuIl09YSxhPXQuZ2V0QXhpc01vZGVsKCkuYXhpcy5zY2FsZS5wYXJzZShhKSxudWxsIT1hJiYoZVtuKyJTcGFuIl09bC5saW5lYXJNYXAoYSx0Ll9kYXRhRXh0ZW50LFswLDEwMF0sITApKSl9KX12YXIgcz1pKDEpLGw9aSg0KSx1PWkoODIpLGg9cy5lYWNoLGM9bC5hc2MsZD1mdW5jdGlvbih0LGUsaSxuKXt0aGlzLl9kaW1OYW1lPXQsdGhpcy5fYXhpc0luZGV4PWUsdGhpcy5fdmFsdWVXaW5kb3csdGhpcy5fcGVyY2VudFdpbmRvdyx0aGlzLl9kYXRhRXh0ZW50LHRoaXMuX21pbk1heFNwYW4sdGhpcy5lY01vZGVsPW4sdGhpcy5fZGF0YVpvb21Nb2RlbD1pfTtkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZCxob3N0ZWRCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGF0YVpvb21Nb2RlbD09PXR9LGdldERhdGFWYWx1ZVdpbmRvdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92YWx1ZVdpbmRvdy5zbGljZSgpfSxnZXREYXRhUGVyY2VudFdpbmRvdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wZXJjZW50V2luZG93LnNsaWNlKCl9LGdldFRhcmdldFNlcmllc01vZGVsczpmdW5jdGlvbigpe3ZhciB0PVtdLGU9dGhpcy5lY01vZGVsO3JldHVybiBlLmVhY2hTZXJpZXMoZnVuY3Rpb24oaSl7aWYodS5pc0Nvb3JkU3VwcG9ydGVkKGkuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikpKXt2YXIgbj10aGlzLl9kaW1OYW1lLGE9ZS5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOm4rIkF4aXMiLGluZGV4OmkuZ2V0KG4rIkF4aXNJbmRleCIpLGlkOmkuZ2V0KG4rIkF4aXNJZCIpfSlbMF07dGhpcy5fYXhpc0luZGV4PT09KGEmJmEuY29tcG9uZW50SW5kZXgpJiZ0LnB1c2goaSl9fSx0aGlzKSx0fSxnZXRBeGlzTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lY01vZGVsLmdldENvbXBvbmVudCh0aGlzLl9kaW1OYW1lKyJBeGlzIix0aGlzLl9heGlzSW5kZXgpfSxnZXRPdGhlckF4aXNNb2RlbDpmdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLl9kaW1OYW1lLG49dGhpcy5lY01vZGVsLGE9dGhpcy5nZXRBeGlzTW9kZWwoKSxvPSJ4Ij09PWl8fCJ5Ij09PWk7bz8oZT0iZ3JpZEluZGV4Iix0PSJ4Ij09PWk/InkiOiJ4Iik6KGU9InBvbGFySW5kZXgiLHQ9ImFuZ2xlIj09PWk/InJhZGl1cyI6ImFuZ2xlIik7dmFyIHI7cmV0dXJuIG4uZWFjaENvbXBvbmVudCh0KyJBeGlzIixmdW5jdGlvbih0KXsodC5nZXQoZSl8fDApPT09KGEuZ2V0KGUpfHwwKSYmKHI9dCl9KSxyfSxnZXRNaW5NYXhTcGFuOmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2xvbmUodGhpcy5fbWluTWF4U3Bhbil9LGNhbGN1bGF0ZURhdGFXaW5kb3c6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZGF0YUV4dGVudCxpPXRoaXMuZ2V0QXhpc01vZGVsKCksbj1pLmF4aXMuc2NhbGUsYT10aGlzLl9kYXRhWm9vbU1vZGVsLmdldFJhbmdlUHJvcE1vZGUoKSxvPVswLDEwMF0scj1bdC5zdGFydCx0LmVuZF0scz1bXTtyZXR1cm4gaChbInN0YXJ0VmFsdWUiLCJlbmRWYWx1ZSJdLGZ1bmN0aW9uKGUpe3MucHVzaChudWxsIT10W2VdP24ucGFyc2UodFtlXSk6bnVsbCl9KSxoKFswLDFdLGZ1bmN0aW9uKHQpe3ZhciBpPXNbdF0sdT1yW3RdOyJwZXJjZW50Ij09PWFbdF0/KG51bGw9PXUmJih1PW9bdF0pLGk9bi5wYXJzZShsLmxpbmVhck1hcCh1LG8sZSwhMCkpKTp1PWwubGluZWFyTWFwKGksZSxvLCEwKSxzW3RdPWksclt0XT11fSkse3ZhbHVlV2luZG93OmMocykscGVyY2VudFdpbmRvdzpjKHIpfX0scmVzZXQ6ZnVuY3Rpb24odCl7aWYodD09PXRoaXMuX2RhdGFab29tTW9kZWwpe3RoaXMuX2RhdGFFeHRlbnQ9bih0aGlzLHRoaXMuX2RpbU5hbWUsdGhpcy5nZXRUYXJnZXRTZXJpZXNNb2RlbHMoKSk7dmFyIGU9dGhpcy5jYWxjdWxhdGVEYXRhV2luZG93KHQub3B0aW9uKTt0aGlzLl92YWx1ZVdpbmRvdz1lLnZhbHVlV2luZG93LHRoaXMuX3BlcmNlbnRXaW5kb3c9ZS5wZXJjZW50V2luZG93LHIodGhpcyksbyh0aGlzKX19LHJlc3RvcmU6ZnVuY3Rpb24odCl7dD09PXRoaXMuX2RhdGFab29tTW9kZWwmJih0aGlzLl92YWx1ZVdpbmRvdz10aGlzLl9wZXJjZW50V2luZG93PW51bGwsbyh0aGlzLCEwKSl9LGZpbHRlckRhdGE6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD49b1swXSYmdDw9b1sxXX1pZih0PT09dGhpcy5fZGF0YVpvb21Nb2RlbCl7dmFyIGk9dGhpcy5fZGltTmFtZSxuPXRoaXMuZ2V0VGFyZ2V0U2VyaWVzTW9kZWxzKCksYT10LmdldCgiZmlsdGVyTW9kZSIpLG89dGhpcy5fdmFsdWVXaW5kb3c7aWYoIm5vbmUiIT09YSl7dmFyIHI9dGhpcy5nZXRPdGhlckF4aXNNb2RlbCgpO3QuZ2V0KCIkZnJvbVRvb2xib3giKSYmciYmImNhdGVnb3J5Ij09PXIuZ2V0KCJ0eXBlIikmJihhPSJlbXB0eSIpLGgobixmdW5jdGlvbih0KXt2YXIgbj10LmdldERhdGEoKSxyPXQuY29vcmREaW1Ub0RhdGFEaW0oaSk7IndlYWtGaWx0ZXIiPT09YT9uJiZuLmZpbHRlclNlbGYoZnVuY3Rpb24odCl7Zm9yKHZhciBlLGksYSxzPTA7czxyLmxlbmd0aDtzKyspe3ZhciBsPW4uZ2V0KHJbc10sdCksdT0haXNOYU4obCksaD1sPG9bMF0sYz1sPm9bMV07aWYodSYmIWgmJiFjKXJldHVybiEwO3UmJihhPSEwKSxoJiYoZT0hMCksYyYmKGk9ITApfXJldHVybiBhJiZlJiZpfSk6biYmaChyLGZ1bmN0aW9uKGkpeyJlbXB0eSI9PT1hP3Quc2V0RGF0YShuLm1hcChpLGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpP3Q6TmFOfSkpOm4uZmlsdGVyU2VsZihpLGUpfSl9KX19fX0sdC5leHBvcnRzPWR9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9aSg0OCkuZXh0ZW5kKHt0eXBlOiJkYXRhWm9vbS5pbnNpZGUiLGRlZmF1bHRPcHRpb246e2Rpc2FibGVkOiExLHpvb21Mb2NrOiExLHpvb21Pbk1vdXNlV2hlZWw6ITAsbW92ZU9uTW91c2VNb3ZlOiEwLHByZXZlbnREZWZhdWx0TW91c2VNb3ZlOiEwfX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg0OSksYT1pKDEpLG89aSg1OSkscj1pKDIxMSkscz1hLmJpbmQsbD1uLmV4dGVuZCh7dHlwZToiZGF0YVpvb20uaW5zaWRlIixpbml0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmFuZ2V9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtsLnN1cGVyQXBwbHkodGhpcywicmVuZGVyIixhcmd1bWVudHMpLHIuc2hvdWxkUmVjb3JkUmFuZ2Uobix0LmlkKSYmKHRoaXMuX3JhbmdlPXQuZ2V0UGVyY2VudFJhbmdlKCkpLGEuZWFjaCh0aGlzLmdldFRhcmdldENvb3JkSW5mbygpLGZ1bmN0aW9uKGUsbil7dmFyIG89YS5tYXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gci5nZW5lcmF0ZUNvb3JkSWQodC5tb2RlbCl9KTthLmVhY2goZSxmdW5jdGlvbihlKXt2YXIgYT1lLm1vZGVsLGw9dC5vcHRpb247ci5yZWdpc3RlcihpLHtjb29yZElkOnIuZ2VuZXJhdGVDb29yZElkKGEpLGFsbENvb3JkSWRzOm8sY29udGFpbnNQb2ludDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGEuY29vcmRpbmF0ZVN5c3RlbS5jb250YWluUG9pbnQoW2UsaV0pfSxkYXRhWm9vbUlkOnQuaWQsdGhyb3R0bGVSYXRlOnQuZ2V0KCJ0aHJvdHRsZSIsITApLHBhbkdldFJhbmdlOnModGhpcy5fb25QYW4sdGhpcyxlLG4pLHpvb21HZXRSYW5nZTpzKHRoaXMuX29uWm9vbSx0aGlzLGUsbiksem9vbUxvY2s6bC56b29tTG9jayxkaXNhYmxlZDpsLmRpc2FibGVkLHJvYW1Db250cm9sbGVyT3B0Ont6b29tT25Nb3VzZVdoZWVsOmwuem9vbU9uTW91c2VXaGVlbCxtb3ZlT25Nb3VzZU1vdmU6bC5tb3ZlT25Nb3VzZU1vdmUscHJldmVudERlZmF1bHRNb3VzZU1vdmU6bC5wcmV2ZW50RGVmYXVsdE1vdXNlTW92ZX19KX0sdGhpcyl9LHRoaXMpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7ci51bnJlZ2lzdGVyKHRoaXMuYXBpLHRoaXMuZGF0YVpvb21Nb2RlbC5pZCksbC5zdXBlckFwcGx5KHRoaXMsImRpc3Bvc2UiLGFyZ3VtZW50cyksdGhpcy5fcmFuZ2U9bnVsbH0sX29uUGFuOmZ1bmN0aW9uKHQsZSxpLG4sYSxyLHMsbCxoKXt2YXIgYz10aGlzLl9yYW5nZS5zbGljZSgpLGQ9dC5heGlzTW9kZWxzWzBdO2lmKGQpe3ZhciBmPXVbZV0oW3Isc10sW2wsaF0sZCxpLHQpLHA9Zi5zaWduYWwqKGNbMV0tY1swXSkqZi5waXhlbC9mLnBpeGVsTGVuZ3RoO3JldHVybiBvKHAsYyxbMCwxMDBdLCJhbGwiKSx0aGlzLl9yYW5nZT1jfX0sX29uWm9vbTpmdW5jdGlvbih0LGUsaSxuLGEscil7dmFyIHM9dGhpcy5fcmFuZ2Uuc2xpY2UoKSxsPXQuYXhpc01vZGVsc1swXTtpZihsKXt2YXIgaD11W2VdKG51bGwsW2Escl0sbCxpLHQpLGM9KGguc2lnbmFsPjA/aC5waXhlbFN0YXJ0K2gucGl4ZWxMZW5ndGgtaC5waXhlbDpoLnBpeGVsLWgucGl4ZWxTdGFydCkvaC5waXhlbExlbmd0aCooc1sxXS1zWzBdKStzWzBdO249TWF0aC5tYXgoMS9uLDApLHNbMF09KHNbMF0tYykqbitjLHNbMV09KHNbMV0tYykqbitjO3ZhciBkPXRoaXMuZGF0YVpvb21Nb2RlbC5maW5kUmVwcmVzZW50YXRpdmVBeGlzUHJveHkoKS5nZXRNaW5NYXhTcGFuKCk7cmV0dXJuIG8oMCxzLFswLDEwMF0sMCxkLm1pblNwYW4sZC5tYXhTcGFuKSx0aGlzLl9yYW5nZT1zfX19KSx1PXtncmlkOmZ1bmN0aW9uKHQsZSxpLG4sYSl7dmFyIG89aS5heGlzLHI9e30scz1hLm1vZGVsLmNvb3JkaW5hdGVTeXN0ZW0uZ2V0UmVjdCgpO3JldHVybiB0PXR8fFswLDBdLCJ4Ij09PW8uZGltPyhyLnBpeGVsPWVbMF0tdFswXSxyLnBpeGVsTGVuZ3RoPXMud2lkdGgsci5waXhlbFN0YXJ0PXMueCxyLnNpZ25hbD1vLmludmVyc2U/MTotMSk6KHIucGl4ZWw9ZVsxXS10WzFdLHIucGl4ZWxMZW5ndGg9cy5oZWlnaHQsci5waXhlbFN0YXJ0PXMueSxyLnNpZ25hbD1vLmludmVyc2U/LTE6MSkscn0scG9sYXI6ZnVuY3Rpb24odCxlLGksbixhKXt2YXIgbz1pLmF4aXMscj17fSxzPWEubW9kZWwuY29vcmRpbmF0ZVN5c3RlbSxsPXMuZ2V0UmFkaXVzQXhpcygpLmdldEV4dGVudCgpLHU9cy5nZXRBbmdsZUF4aXMoKS5nZXRFeHRlbnQoKTtyZXR1cm4gdD10P3MucG9pbnRUb0Nvb3JkKHQpOlswLDBdLGU9cy5wb2ludFRvQ29vcmQoZSksInJhZGl1c0F4aXMiPT09aS5tYWluVHlwZT8oci5waXhlbD1lWzBdLXRbMF0sci5waXhlbExlbmd0aD1sWzFdLWxbMF0sci5waXhlbFN0YXJ0PWxbMF0sci5zaWduYWw9by5pbnZlcnNlPzE6LTEpOihyLnBpeGVsPWVbMV0tdFsxXSxyLnBpeGVsTGVuZ3RoPXVbMV0tdVswXSxyLnBpeGVsU3RhcnQ9dVswXSxyLnNpZ25hbD1vLmludmVyc2U/LTE6MSkscn0sc2luZ2xlQXhpczpmdW5jdGlvbih0LGUsaSxuLGEpe3ZhciBvPWkuYXhpcyxyPWEubW9kZWwuY29vcmRpbmF0ZVN5c3RlbS5nZXRSZWN0KCkscz17fTtyZXR1cm4gdD10fHxbMCwwXSwiaG9yaXpvbnRhbCI9PT1vLm9yaWVudD8ocy5waXhlbD1lWzBdLXRbMF0scy5waXhlbExlbmd0aD1yLndpZHRoLHMucGl4ZWxTdGFydD1yLngscy5zaWduYWw9by5pbnZlcnNlPzE6LTEpOihzLnBpeGVsPWVbMV0tdFsxXSxzLnBpeGVsTGVuZ3RoPXIuaGVpZ2h0LHMucGl4ZWxTdGFydD1yLnkscy5zaWduYWw9by5pbnZlcnNlPy0xOjEpLHN9fTt0LmV4cG9ydHM9bH0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNDgpO3QuZXhwb3J0cz1uLmV4dGVuZCh7dHlwZToiZGF0YVpvb20uc2VsZWN0In0pfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPWkoNDkpLmV4dGVuZCh7dHlwZToiZGF0YVpvb20uc2VsZWN0In0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg0OCksYT1uLmV4dGVuZCh7dHlwZToiZGF0YVpvb20uc2xpZGVyIixsYXlvdXRNb2RlOiJib3giLGRlZmF1bHRPcHRpb246e3Nob3c6ITAscmlnaHQ6InBoIix0b3A6InBoIix3aWR0aDoicGgiLGhlaWdodDoicGgiLGxlZnQ6bnVsbCxib3R0b206bnVsbCxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNDcsNjksODQsMCkiLGRhdGFCYWNrZ3JvdW5kOntsaW5lU3R5bGU6e2NvbG9yOiIjMmY0NTU0Iix3aWR0aDouNSxvcGFjaXR5Oi4zfSxhcmVhU3R5bGU6e2NvbG9yOiJyZ2JhKDQ3LDY5LDg0LDAuMykiLG9wYWNpdHk6LjN9fSxib3JkZXJDb2xvcjoiI2RkZCIsZmlsbGVyQ29sb3I6InJnYmEoMTY3LDE4MywyMDQsMC40KSIsaGFuZGxlSWNvbjoiTTguMiwxMy42VjMuOUg2LjN2OS43SDMuMXYxNC45aDMuM3Y5LjdoMS44di05LjdoMy4zVjEzLjZIOC4yeiBNOS43LDI0LjRINC44di0xLjRoNC45VjI0LjR6IE05LjcsMTkuMUg0Ljh2LTEuNGg0LjlWMTkuMXoiLGhhbmRsZVNpemU6IjEwMCUiLGhhbmRsZVN0eWxlOntjb2xvcjoiI2E3YjdjYyJ9LGxhYmVsUHJlY2lzaW9uOm51bGwsbGFiZWxGb3JtYXR0ZXI6bnVsbCxzaG93RGV0YWlsOiEwLHNob3dEYXRhU2hhZG93OiJhdXRvIixyZWFsdGltZTohMCx6b29tTG9jazohMSx0ZXh0U3R5bGU6e2NvbG9yOiIjMzMzIn19fSk7dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXt4OiJ5Iix5OiJ4IixyYWRpdXM6ImFuZ2xlIixhbmdsZToicmFkaXVzIn07cmV0dXJuIGVbdF19ZnVuY3Rpb24gYSh0KXtyZXR1cm4idmVydGljYWwiPT09dD8ibnMtcmVzaXplIjoiZXctcmVzaXplIn12YXIgbz1pKDEpLHI9aSgzKSxzPWkoMzcpLGw9aSg0OSksdT1yLlJlY3QsaD1pKDQpLGM9aC5saW5lYXJNYXAsZD1pKDkpLGY9aSg1OSkscD1pKDIxKSxnPWguYXNjLG09by5iaW5kLHY9by5lYWNoLHk9Nyx4PTEsXz0zMCxiPSJob3Jpem9udGFsIix3PSJ2ZXJ0aWNhbCIsUz01LE09WyJsaW5lIiwiYmFyIiwiY2FuZGxlc3RpY2siLCJzY2F0dGVyIl0sST1sLmV4dGVuZCh7dHlwZToiZGF0YVpvb20uc2xpZGVyIixpbml0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fZGlzcGxheWFibGVzPXt9LHRoaXMuX29yaWVudCx0aGlzLl9yYW5nZSx0aGlzLl9oYW5kbGVFbmRzLHRoaXMuX3NpemUsdGhpcy5faGFuZGxlV2lkdGgsdGhpcy5faGFuZGxlSGVpZ2h0LHRoaXMuX2xvY2F0aW9uLHRoaXMuX2RyYWdnaW5nLHRoaXMuX2RhdGFTaGFkb3dJbmZvLHRoaXMuYXBpPWV9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gSS5zdXBlckFwcGx5KHRoaXMsInJlbmRlciIsYXJndW1lbnRzKSxzLmNyZWF0ZU9yVXBkYXRlKHRoaXMsIl9kaXNwYXRjaFpvb21BY3Rpb24iLHRoaXMuZGF0YVpvb21Nb2RlbC5nZXQoInRocm90dGxlIiksImZpeFJhdGUiKSx0aGlzLl9vcmllbnQ9dC5nZXQoIm9yaWVudCIpLHRoaXMuZGF0YVpvb21Nb2RlbC5nZXQoInNob3ciKT09PSExP3ZvaWQgdGhpcy5ncm91cC5yZW1vdmVBbGwoKToobiYmImRhdGFab29tIj09PW4udHlwZSYmbi5mcm9tPT09dGhpcy51aWR8fHRoaXMuX2J1aWxkVmlldygpLHZvaWQgdGhpcy5fdXBkYXRlVmlldygpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7SS5zdXBlckFwcGx5KHRoaXMsInJlbW92ZSIsYXJndW1lbnRzKSxzLmNsZWFyKHRoaXMsIl9kaXNwYXRjaFpvb21BY3Rpb24iKX0sZGlzcG9zZTpmdW5jdGlvbigpe0kuc3VwZXJBcHBseSh0aGlzLCJkaXNwb3NlIixhcmd1bWVudHMpLHMuY2xlYXIodGhpcywiX2Rpc3BhdGNoWm9vbUFjdGlvbiIpfSxfYnVpbGRWaWV3OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncm91cDt0LnJlbW92ZUFsbCgpLHRoaXMuX3Jlc2V0TG9jYXRpb24oKSx0aGlzLl9yZXNldEludGVydmFsKCk7dmFyIGU9dGhpcy5fZGlzcGxheWFibGVzLmJhckdyb3VwPW5ldyByLkdyb3VwO3RoaXMuX3JlbmRlckJhY2tncm91bmQoKSx0aGlzLl9yZW5kZXJIYW5kbGUoKSx0aGlzLl9yZW5kZXJEYXRhU2hhZG93KCksdC5hZGQoZSksdGhpcy5fcG9zaXRpb25Hcm91cCgpfSxfcmVzZXRMb2NhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YVpvb21Nb2RlbCxlPXRoaXMuYXBpLGk9dGhpcy5fZmluZENvb3JkUmVjdCgpLG49e3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0sYT10aGlzLl9vcmllbnQ9PT1iP3tyaWdodDpuLndpZHRoLWkueC1pLndpZHRoLHRvcDpuLmhlaWdodC1fLXksd2lkdGg6aS53aWR0aCxoZWlnaHQ6X306e3JpZ2h0OnksdG9wOmkueSx3aWR0aDpfLGhlaWdodDppLmhlaWdodH0scj1kLmdldExheW91dFBhcmFtcyh0Lm9wdGlvbik7by5lYWNoKFsicmlnaHQiLCJ0b3AiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKHQpeyJwaCI9PT1yW3RdJiYoclt0XT1hW3RdKX0pO3ZhciBzPWQuZ2V0TGF5b3V0UmVjdChyLG4sdC5wYWRkaW5nKTt0aGlzLl9sb2NhdGlvbj17eDpzLngseTpzLnl9LHRoaXMuX3NpemU9W3Mud2lkdGgscy5oZWlnaHRdLHRoaXMuX29yaWVudD09PXcmJnRoaXMuX3NpemUucmV2ZXJzZSgpfSxfcG9zaXRpb25Hcm91cDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JvdXAsZT10aGlzLl9sb2NhdGlvbixpPXRoaXMuX29yaWVudCxuPXRoaXMuZGF0YVpvb21Nb2RlbC5nZXRGaXJzdFRhcmdldEF4aXNNb2RlbCgpLGE9biYmbi5nZXQoImludmVyc2UiKSxvPXRoaXMuX2Rpc3BsYXlhYmxlcy5iYXJHcm91cCxyPSh0aGlzLl9kYXRhU2hhZG93SW5mb3x8e30pLm90aGVyQXhpc0ludmVyc2U7by5hdHRyKGkhPT1ifHxhP2k9PT1iJiZhP3tzY2FsZTpyP1stMSwxXTpbLTEsLTFdfTppIT09d3x8YT97c2NhbGU6cj9bLTEsLTFdOlstMSwxXSxyb3RhdGlvbjpNYXRoLlBJLzJ9OntzY2FsZTpyP1sxLC0xXTpbMSwxXSxyb3RhdGlvbjpNYXRoLlBJLzJ9OntzY2FsZTpyP1sxLDFdOlsxLC0xXX0pO3ZhciBzPXQuZ2V0Qm91bmRpbmdSZWN0KFtvXSk7dC5hdHRyKCJwb3NpdGlvbiIsW2UueC1zLngsZS55LXMueV0pfSxfZ2V0Vmlld0V4dGVudDpmdW5jdGlvbigpe3JldHVyblswLHRoaXMuX3NpemVbMF1dfSxfcmVuZGVyQmFja2dyb3VuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YVpvb21Nb2RlbCxlPXRoaXMuX3NpemUsaT10aGlzLl9kaXNwbGF5YWJsZXMuYmFyR3JvdXA7aS5hZGQobmV3IHUoe3NpbGVudDohMCxzaGFwZTp7eDowLHk6MCx3aWR0aDplWzBdLGhlaWdodDplWzFdfSxzdHlsZTp7ZmlsbDp0LmdldCgiYmFja2dyb3VuZENvbG9yIil9LHoyOi00MH0pKSxpLmFkZChuZXcgdSh7c2hhcGU6e3g6MCx5OjAsd2lkdGg6ZVswXSxoZWlnaHQ6ZVsxXX0sc3R5bGU6e2ZpbGw6InRyYW5zcGFyZW50In0sejI6MCxvbmNsaWNrOm8uYmluZCh0aGlzLl9vbkNsaWNrUGFuZWxDbGljayx0aGlzKX0pKX0sX3JlbmRlckRhdGFTaGFkb3c6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kYXRhU2hhZG93SW5mbz10aGlzLl9wcmVwYXJlRGF0YVNoYWRvd0luZm8oKTtpZih0KXt2YXIgZT10aGlzLl9zaXplLGk9dC5zZXJpZXMsbj1pLmdldFJhd0RhdGEoKSxhPWkuZ2V0U2hhZG93RGltP2kuZ2V0U2hhZG93RGltKCk6dC5vdGhlckRpbTtpZihudWxsIT1hKXt2YXIgcz1uLmdldERhdGFFeHRlbnQoYSksbD0uMyooc1sxXS1zWzBdKTtzPVtzWzBdLWwsc1sxXStsXTt2YXIgdSxoPVswLGVbMV1dLGQ9WzAsZVswXV0sZj1bW2VbMF0sMF0sWzAsMF1dLHA9W10sZz1kWzFdLyhuLmNvdW50KCktMSksbT0wLHY9TWF0aC5yb3VuZChuLmNvdW50KCkvZVswXSk7bi5lYWNoKFthXSxmdW5jdGlvbih0LGUpe2lmKHY+MCYmZSV2KXJldHVybiB2b2lkKG0rPWcpO3ZhciBpPW51bGw9PXR8fGlzTmFOKHQpfHwiIj09PXQsbj1pPzA6Yyh0LHMsaCwhMCk7aSYmIXUmJmU/KGYucHVzaChbZltmLmxlbmd0aC0xXVswXSwwXSkscC5wdXNoKFtwW3AubGVuZ3RoLTFdWzBdLDBdKSk6IWkmJnUmJihmLnB1c2goW20sMF0pLHAucHVzaChbbSwwXSkpLGYucHVzaChbbSxuXSkscC5wdXNoKFttLG5dKSxtKz1nLHU9aX0pO3ZhciB5PXRoaXMuZGF0YVpvb21Nb2RlbDt0aGlzLl9kaXNwbGF5YWJsZXMuYmFyR3JvdXAuYWRkKG5ldyByLlBvbHlnb24oe3NoYXBlOntwb2ludHM6Zn0sc3R5bGU6by5kZWZhdWx0cyh7ZmlsbDp5LmdldCgiZGF0YUJhY2tncm91bmRDb2xvciIpfSx5LmdldE1vZGVsKCJkYXRhQmFja2dyb3VuZC5hcmVhU3R5bGUiKS5nZXRBcmVhU3R5bGUoKSksc2lsZW50OiEwLHoyOi0yMH0pKSx0aGlzLl9kaXNwbGF5YWJsZXMuYmFyR3JvdXAuYWRkKG5ldyByLlBvbHlsaW5lKHtzaGFwZTp7cG9pbnRzOnB9LHN0eWxlOnkuZ2V0TW9kZWwoImRhdGFCYWNrZ3JvdW5kLmxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLHNpbGVudDohMCx6MjotMTl9KSl9fX0sX3ByZXBhcmVEYXRhU2hhZG93SW5mbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YVpvb21Nb2RlbCxlPXQuZ2V0KCJzaG93RGF0YVNoYWRvdyIpO2lmKGUhPT0hMSl7dmFyIGksYT10aGlzLmVjTW9kZWw7cmV0dXJuIHQuZWFjaFRhcmdldEF4aXMoZnVuY3Rpb24ocixzKXt2YXIgbD10LmdldEF4aXNQcm94eShyLm5hbWUscykuZ2V0VGFyZ2V0U2VyaWVzTW9kZWxzKCk7by5lYWNoKGwsZnVuY3Rpb24odCl7aWYoIShpfHxlIT09ITAmJm8uaW5kZXhPZihNLHQuZ2V0KCJ0eXBlIikpPDApKXsKdmFyIGwsdT1hLmdldENvbXBvbmVudChyLmF4aXMscykuYXhpcyxoPW4oci5uYW1lKSxjPXQuY29vcmRpbmF0ZVN5c3RlbTtudWxsIT1oJiZjLmdldE90aGVyQXhpcyYmKGw9Yy5nZXRPdGhlckF4aXModSkuaW52ZXJzZSksaT17dGhpc0F4aXM6dSxzZXJpZXM6dCx0aGlzRGltOnIubmFtZSxvdGhlckRpbTpoLG90aGVyQXhpc0ludmVyc2U6bH19fSx0aGlzKX0sdGhpcyksaX19LF9yZW5kZXJIYW5kbGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kaXNwbGF5YWJsZXMsZT10LmhhbmRsZXM9W10saT10LmhhbmRsZUxhYmVscz1bXSxuPXRoaXMuX2Rpc3BsYXlhYmxlcy5iYXJHcm91cCxvPXRoaXMuX3NpemUscz10aGlzLmRhdGFab29tTW9kZWw7bi5hZGQodC5maWxsZXI9bmV3IHUoe2RyYWdnYWJsZTohMCxjdXJzb3I6YSh0aGlzLl9vcmllbnQpLGRyaWZ0Om0odGhpcy5fb25EcmFnTW92ZSx0aGlzLCJhbGwiKSxvbm1vdXNlbW92ZTpmdW5jdGlvbih0KXtwLnN0b3AodC5ldmVudCl9LG9uZHJhZ3N0YXJ0Om0odGhpcy5fc2hvd0RhdGFJbmZvLHRoaXMsITApLG9uZHJhZ2VuZDptKHRoaXMuX29uRHJhZ0VuZCx0aGlzKSxvbm1vdXNlb3ZlcjptKHRoaXMuX3Nob3dEYXRhSW5mbyx0aGlzLCEwKSxvbm1vdXNlb3V0Om0odGhpcy5fc2hvd0RhdGFJbmZvLHRoaXMsITEpLHN0eWxlOntmaWxsOnMuZ2V0KCJmaWxsZXJDb2xvciIpLHRleHRQb3NpdGlvbjoiaW5zaWRlIn19KSksbi5hZGQobmV3IHUoci5zdWJQaXhlbE9wdGltaXplUmVjdCh7c2lsZW50OiEwLHNoYXBlOnt4OjAseTowLHdpZHRoOm9bMF0saGVpZ2h0Om9bMV19LHN0eWxlOntzdHJva2U6cy5nZXQoImRhdGFCYWNrZ3JvdW5kQ29sb3IiKXx8cy5nZXQoImJvcmRlckNvbG9yIiksbGluZVdpZHRoOngsZmlsbDoicmdiYSgwLDAsMCwwKSJ9fSkpKSx2KFswLDFdLGZ1bmN0aW9uKHQpe3ZhciBvPXIuY3JlYXRlSWNvbihzLmdldCgiaGFuZGxlSWNvbiIpLHtjdXJzb3I6YSh0aGlzLl9vcmllbnQpLGRyYWdnYWJsZTohMCxkcmlmdDptKHRoaXMuX29uRHJhZ01vdmUsdGhpcyx0KSxvbm1vdXNlbW92ZTpmdW5jdGlvbih0KXtwLnN0b3AodC5ldmVudCl9LG9uZHJhZ2VuZDptKHRoaXMuX29uRHJhZ0VuZCx0aGlzKSxvbm1vdXNlb3ZlcjptKHRoaXMuX3Nob3dEYXRhSW5mbyx0aGlzLCEwKSxvbm1vdXNlb3V0Om0odGhpcy5fc2hvd0RhdGFJbmZvLHRoaXMsITEpfSx7eDotMSx5OjAsd2lkdGg6MixoZWlnaHQ6Mn0pLGw9by5nZXRCb3VuZGluZ1JlY3QoKTt0aGlzLl9oYW5kbGVIZWlnaHQ9aC5wYXJzZVBlcmNlbnQocy5nZXQoImhhbmRsZVNpemUiKSx0aGlzLl9zaXplWzFdKSx0aGlzLl9oYW5kbGVXaWR0aD1sLndpZHRoL2wuaGVpZ2h0KnRoaXMuX2hhbmRsZUhlaWdodCxvLnNldFN0eWxlKHMuZ2V0TW9kZWwoImhhbmRsZVN0eWxlIikuZ2V0SXRlbVN0eWxlKCkpO3ZhciB1PXMuZ2V0KCJoYW5kbGVDb2xvciIpO251bGwhPXUmJihvLnN0eWxlLmZpbGw9dSksbi5hZGQoZVt0XT1vKTt2YXIgYz1zLnRleHRTdHlsZU1vZGVsO3RoaXMuZ3JvdXAuYWRkKGlbdF09bmV3IHIuVGV4dCh7c2lsZW50OiEwLGludmlzaWJsZTohMCxzdHlsZTp7eDowLHk6MCx0ZXh0OiIiLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUiLHRleHRBbGlnbjoiY2VudGVyIix0ZXh0RmlsbDpjLmdldFRleHRDb2xvcigpLHRleHRGb250OmMuZ2V0Rm9udCgpfSx6MjoxMH0pKX0sdGhpcyl9LF9yZXNldEludGVydmFsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmFuZ2U9dGhpcy5kYXRhWm9vbU1vZGVsLmdldFBlcmNlbnRSYW5nZSgpLGU9dGhpcy5fZ2V0Vmlld0V4dGVudCgpO3RoaXMuX2hhbmRsZUVuZHM9W2ModFswXSxbMCwxMDBdLGUsITApLGModFsxXSxbMCwxMDBdLGUsITApXX0sX3VwZGF0ZUludGVydmFsOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5kYXRhWm9vbU1vZGVsLG49dGhpcy5faGFuZGxlRW5kcyxhPXRoaXMuX2dldFZpZXdFeHRlbnQoKSxvPWkuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCkuZ2V0TWluTWF4U3BhbigpLHI9WzAsMTAwXTtmKGUsbixhLGkuZ2V0KCJ6b29tTG9jayIpPyJhbGwiOnQsbnVsbCE9by5taW5TcGFuP2Moby5taW5TcGFuLHIsYSwhMCk6bnVsbCxudWxsIT1vLm1heFNwYW4/YyhvLm1heFNwYW4scixhLCEwKTpudWxsKSx0aGlzLl9yYW5nZT1nKFtjKG5bMF0sYSxyLCEwKSxjKG5bMV0sYSxyLCEwKV0pfSxfdXBkYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kaXNwbGF5YWJsZXMsaT10aGlzLl9oYW5kbGVFbmRzLG49ZyhpLnNsaWNlKCkpLGE9dGhpcy5fc2l6ZTt2KFswLDFdLGZ1bmN0aW9uKHQpe3ZhciBuPWUuaGFuZGxlc1t0XSxvPXRoaXMuX2hhbmRsZUhlaWdodDtuLmF0dHIoe3NjYWxlOltvLzIsby8yXSxwb3NpdGlvbjpbaVt0XSxhWzFdLzItby8yXX0pfSx0aGlzKSxlLmZpbGxlci5zZXRTaGFwZSh7eDpuWzBdLHk6MCx3aWR0aDpuWzFdLW5bMF0saGVpZ2h0OmFbMV19KSx0aGlzLl91cGRhdGVEYXRhSW5mbyh0KX0sX3VwZGF0ZURhdGFJbmZvOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIGU9ci5nZXRUcmFuc2Zvcm0obi5oYW5kbGVzW3RdLnBhcmVudCx0aGlzLmdyb3VwKSxpPXIudHJhbnNmb3JtRGlyZWN0aW9uKDA9PT10PyJyaWdodCI6ImxlZnQiLGUpLGw9dGhpcy5faGFuZGxlV2lkdGgvMitTLHU9ci5hcHBseVRyYW5zZm9ybShbZFt0XSsoMD09PXQ/LWw6bCksdGhpcy5fc2l6ZVsxXS8yXSxlKTthW3RdLnNldFN0eWxlKHt4OnVbMF0seTp1WzFdLHRleHRWZXJ0aWNhbEFsaWduOm89PT1iPyJtaWRkbGUiOmksdGV4dEFsaWduOm89PT1iP2k6ImNlbnRlciIsdGV4dDpzW3RdfSl9dmFyIGk9dGhpcy5kYXRhWm9vbU1vZGVsLG49dGhpcy5fZGlzcGxheWFibGVzLGE9bi5oYW5kbGVMYWJlbHMsbz10aGlzLl9vcmllbnQscz1bIiIsIiJdO2lmKGkuZ2V0KCJzaG93RGV0YWlsIikpe3ZhciBsPWkuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KCk7aWYobCl7dmFyIHU9bC5nZXRBeGlzTW9kZWwoKS5heGlzLGg9dGhpcy5fcmFuZ2UsYz10P2wuY2FsY3VsYXRlRGF0YVdpbmRvdyh7c3RhcnQ6aFswXSxlbmQ6aFsxXX0pLnZhbHVlV2luZG93OmwuZ2V0RGF0YVZhbHVlV2luZG93KCk7cz1bdGhpcy5fZm9ybWF0TGFiZWwoY1swXSx1KSx0aGlzLl9mb3JtYXRMYWJlbChjWzFdLHUpXX19dmFyIGQ9Zyh0aGlzLl9oYW5kbGVFbmRzLnNsaWNlKCkpO2UuY2FsbCh0aGlzLDApLGUuY2FsbCh0aGlzLDEpfSxfZm9ybWF0TGFiZWw6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmRhdGFab29tTW9kZWwsbj1pLmdldCgibGFiZWxGb3JtYXR0ZXIiKSxhPWkuZ2V0KCJsYWJlbFByZWNpc2lvbiIpO251bGwhPWEmJiJhdXRvIiE9PWF8fChhPWUuZ2V0UGl4ZWxQcmVjaXNpb24oKSk7dmFyIHI9bnVsbD09dHx8aXNOYU4odCk/IiI6ImNhdGVnb3J5Ij09PWUudHlwZXx8InRpbWUiPT09ZS50eXBlP2Uuc2NhbGUuZ2V0TGFiZWwoTWF0aC5yb3VuZCh0KSk6dC50b0ZpeGVkKE1hdGgubWluKGEsMjApKTtyZXR1cm4gby5pc0Z1bmN0aW9uKG4pP24odCxyKTpvLmlzU3RyaW5nKG4pP24ucmVwbGFjZSgie3ZhbHVlfSIscik6cn0sX3Nob3dEYXRhSW5mbzpmdW5jdGlvbih0KXt0PXRoaXMuX2RyYWdnaW5nfHx0O3ZhciBlPXRoaXMuX2Rpc3BsYXlhYmxlcy5oYW5kbGVMYWJlbHM7ZVswXS5hdHRyKCJpbnZpc2libGUiLCF0KSxlWzFdLmF0dHIoImludmlzaWJsZSIsIXQpfSxfb25EcmFnTW92ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5fZHJhZ2dpbmc9ITA7dmFyIG49dGhpcy5fZGlzcGxheWFibGVzLmJhckdyb3VwLmdldExvY2FsVHJhbnNmb3JtKCksYT1yLmFwcGx5VHJhbnNmb3JtKFtlLGldLG4sITApO3RoaXMuX3VwZGF0ZUludGVydmFsKHQsYVswXSk7dmFyIG89dGhpcy5kYXRhWm9vbU1vZGVsLmdldCgicmVhbHRpbWUiKTt0aGlzLl91cGRhdGVWaWV3KCFvKSxvJiZvJiZ0aGlzLl9kaXNwYXRjaFpvb21BY3Rpb24oKX0sX29uRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuX2RyYWdnaW5nPSExLHRoaXMuX3Nob3dEYXRhSW5mbyghMSksdGhpcy5fZGlzcGF0Y2hab29tQWN0aW9uKCl9LF9vbkNsaWNrUGFuZWxDbGljazpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zaXplLGk9dGhpcy5fZGlzcGxheWFibGVzLmJhckdyb3VwLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0Lm9mZnNldFgsdC5vZmZzZXRZKTtpZighKGlbMF08MHx8aVswXT5lWzBdfHxpWzFdPDB8fGlbMV0+ZVsxXSkpe3ZhciBuPXRoaXMuX2hhbmRsZUVuZHMsYT0oblswXStuWzFdKS8yO3RoaXMuX3VwZGF0ZUludGVydmFsKCJhbGwiLGlbMF0tYSksdGhpcy5fdXBkYXRlVmlldygpLHRoaXMuX2Rpc3BhdGNoWm9vbUFjdGlvbigpfX0sX2Rpc3BhdGNoWm9vbUFjdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JhbmdlO3RoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJkYXRhWm9vbSIsZnJvbTp0aGlzLnVpZCxkYXRhWm9vbUlkOnRoaXMuZGF0YVpvb21Nb2RlbC5pZCxzdGFydDp0WzBdLGVuZDp0WzFdfSl9LF9maW5kQ29vcmRSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ7aWYodih0aGlzLmdldFRhcmdldENvb3JkSW5mbygpLGZ1bmN0aW9uKGUpe2lmKCF0JiZlLmxlbmd0aCl7dmFyIGk9ZVswXS5tb2RlbC5jb29yZGluYXRlU3lzdGVtO3Q9aS5nZXRSZWN0JiZpLmdldFJlY3QoKX19KSwhdCl7dmFyIGU9dGhpcy5hcGkuZ2V0V2lkdGgoKSxpPXRoaXMuYXBpLmdldEhlaWdodCgpO3Q9e3g6LjIqZSx5Oi4yKmksd2lkdGg6LjYqZSxoZWlnaHQ6LjYqaX19cmV0dXJuIHR9fSk7dC5leHBvcnRzPUl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXQuZ2V0WnIoKTtyZXR1cm4gZVtnXXx8KGVbZ109e30pfWZ1bmN0aW9uIGEodCxlKXt2YXIgaT1uZXcgZCh0LmdldFpyKCkpO3JldHVybiBpLm9uKCJwYW4iLHAocixlKSksaS5vbigiem9vbSIscChzLGUpKSxpfWZ1bmN0aW9uIG8odCl7Yy5lYWNoKHQsZnVuY3Rpb24oZSxpKXtlLmNvdW50fHwoZS5jb250cm9sbGVyLmRpc3Bvc2UoKSxkZWxldGUgdFtpXSl9KX1mdW5jdGlvbiByKHQsZSxpLG4sYSxvLHIpe2wodCxmdW5jdGlvbihzKXtyZXR1cm4gcy5wYW5HZXRSYW5nZSh0LmNvbnRyb2xsZXIsZSxpLG4sYSxvLHIpfSl9ZnVuY3Rpb24gcyh0LGUsaSxuKXtsKHQsZnVuY3Rpb24oYSl7cmV0dXJuIGEuem9vbUdldFJhbmdlKHQuY29udHJvbGxlcixlLGksbil9KX1mdW5jdGlvbiBsKHQsZSl7dmFyIGk9W107Yy5lYWNoKHQuZGF0YVpvb21JbmZvcyxmdW5jdGlvbih0KXt2YXIgbj1lKHQpOyF0LmRpc2FibGVkJiZuJiZpLnB1c2goe2RhdGFab29tSWQ6dC5kYXRhWm9vbUlkLHN0YXJ0Om5bMF0sZW5kOm5bMV19KX0pLHQuZGlzcGF0Y2hBY3Rpb24oaSl9ZnVuY3Rpb24gdSh0LGUpe3QuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImRhdGFab29tIixiYXRjaDplfSl9ZnVuY3Rpb24gaCh0KXt2YXIgZSxpPXt9LG49e3RydWU6Mixtb3ZlOjEsZmFsc2U6MCx1bmRlZmluZWQ6LTF9O3JldHVybiBjLmVhY2godCxmdW5jdGlvbih0KXt2YXIgYT0hdC5kaXNhYmxlZCYmKCF0Lnpvb21Mb2NrfHwibW92ZSIpO25bYV0+bltlXSYmKGU9YSksYy5leHRlbmQoaSx0LnJvYW1Db250cm9sbGVyT3B0KX0pLHtjb250cm9sVHlwZTplLG9wdDppfX12YXIgYz1pKDEpLGQ9aSgxMDApLGY9aSgzNykscD1jLmN1cnJ5LGc9IlwwX2VjX2RhdGFab29tX3JvYW1zIixtPXtyZWdpc3RlcjpmdW5jdGlvbih0LGUpe3ZhciBpPW4odCkscj1lLmRhdGFab29tSWQscz1lLmNvb3JkSWQ7Yy5lYWNoKGksZnVuY3Rpb24odCxpKXt2YXIgbj10LmRhdGFab29tSW5mb3M7bltyXSYmYy5pbmRleE9mKGUuYWxsQ29vcmRJZHMscyk8MCYmKGRlbGV0ZSBuW3JdLHQuY291bnQtLSl9KSxvKGkpO3ZhciBsPWlbc107bHx8KGw9aVtzXT17Y29vcmRJZDpzLGRhdGFab29tSW5mb3M6e30sY291bnQ6MH0sbC5jb250cm9sbGVyPWEodCxsKSxsLmRpc3BhdGNoQWN0aW9uPWMuY3VycnkodSx0KSksIWwuZGF0YVpvb21JbmZvc1tyXSYmbC5jb3VudCsrLGwuZGF0YVpvb21JbmZvc1tyXT1lO3ZhciBkPWgobC5kYXRhWm9vbUluZm9zKTtsLmNvbnRyb2xsZXIuZW5hYmxlKGQuY29udHJvbFR5cGUsZC5vcHQpLGwuY29udHJvbGxlci5zZXRQb2ludGVyQ2hlY2tlcihlLmNvbnRhaW5zUG9pbnQpLGYuY3JlYXRlT3JVcGRhdGUobCwiZGlzcGF0Y2hBY3Rpb24iLGUudGhyb3R0bGVSYXRlLCJmaXhSYXRlIil9LHVucmVnaXN0ZXI6ZnVuY3Rpb24odCxlKXt2YXIgaT1uKHQpO2MuZWFjaChpLGZ1bmN0aW9uKHQpe3QuY29udHJvbGxlci5kaXNwb3NlKCk7dmFyIGk9dC5kYXRhWm9vbUluZm9zO2lbZV0mJihkZWxldGUgaVtlXSx0LmNvdW50LS0pfSksbyhpKX0sc2hvdWxkUmVjb3JkUmFuZ2U6ZnVuY3Rpb24odCxlKXtpZih0JiYiZGF0YVpvb20iPT09dC50eXBlJiZ0LmJhdGNoKWZvcih2YXIgaT0wLG49dC5iYXRjaC5sZW5ndGg7aTxuO2krKylpZih0LmJhdGNoW2ldLmRhdGFab29tSWQ9PT1lKXJldHVybiExO3JldHVybiEwfSxnZW5lcmF0ZUNvb3JkSWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZSsiXDBfIit0LmlkfX07dC5leHBvcnRzPW19LGZ1bmN0aW9uKHQsZSxpKXtpKDEzMSksaSg0OCksaSg0OSksaSgyMDcpLGkoMjA4KSxpKDEyOSksaSgxMjgpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSxuKXt2YXIgYT1pLnR5cGUsbz1mW2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKV0scj1uZXcgbyhpKTtlLmFkZChyKSxuLnNldCh0LHIpLHIuX19lY0dyYXBoaWNJZD10fWZ1bmN0aW9uIGEodCxlKXt2YXIgaT10JiZ0LnBhcmVudDtpJiYoImdyb3VwIj09PXQudHlwZSYmdC50cmF2ZXJzZShmdW5jdGlvbih0KXthKHQsZSl9KSxlLnJlbW92ZUtleSh0Ll9fZWNHcmFwaGljSWQpLGkucmVtb3ZlKHQpKX1mdW5jdGlvbiBvKHQpe3JldHVybiB0PWMuZXh0ZW5kKHt9LHQpLGMuZWFjaChbImlkIiwicGFyZW50SWQiLCIkYWN0aW9uIiwiaHYiLCJib3VuZGluZyJdLmNvbmNhdChwLkxPQ0FUSU9OX1BBUkFNUyksZnVuY3Rpb24oZSl7ZGVsZXRlIHRbZV19KSx0fWZ1bmN0aW9uIHIodCxlKXt2YXIgaTtyZXR1cm4gYy5lYWNoKGUsZnVuY3Rpb24oZSl7bnVsbCE9dFtlXSYmImF1dG8iIT09dFtlXSYmKGk9ITApfSksaX1mdW5jdGlvbiBzKHQsZSl7dmFyIGk9dC5leGlzdDtpZihlLmlkPXQua2V5SW5mby5pZCwhZS50eXBlJiZpJiYoZS50eXBlPWkudHlwZSksbnVsbD09ZS5wYXJlbnRJZCl7dmFyIG49ZS5wYXJlbnRPcHRpb247bj9lLnBhcmVudElkPW4uaWQ6aSYmKGUucGFyZW50SWQ9aS5wYXJlbnRJZCl9ZS5wYXJlbnRPcHRpb249bnVsbH1mdW5jdGlvbiBsKHQsZSxpKXt2YXIgbj1jLmV4dGVuZCh7fSxpKSxhPXRbZV0sbz1pLiRhY3Rpb258fCJtZXJnZSI7aWYoIm1lcmdlIj09PW8paWYoYSl7Yy5tZXJnZShhLG4sITApLHAubWVyZ2VMYXlvdXRQYXJhbShhLG4se2lnbm9yZVNpemU6ITB9KSxwLmNvcHlMYXlvdXRQYXJhbXMoaSxhKX1lbHNlIHRbZV09bjtlbHNlInJlcGxhY2UiPT09bz90W2VdPW46InJlbW92ZSI9PT1vJiZhJiYodFtlXT1udWxsKX1mdW5jdGlvbiB1KHQsZSl7dCYmKHQuaHY9ZS5odj1bcihlLFsibGVmdCIsInJpZ2h0Il0pLHIoZSxbInRvcCIsImJvdHRvbSJdKV0sImdyb3VwIj09PXQudHlwZSYmKG51bGw9PXQud2lkdGgmJih0LndpZHRoPWUud2lkdGg9MCksbnVsbD09dC5oZWlnaHQmJih0LmhlaWdodD1lLmhlaWdodD0wKSkpfXZhciBoPWkoMiksYz1pKDEpLGQ9aSg1KSxmPWkoMykscD1pKDkpO2gucmVnaXN0ZXJQcmVwcm9jZXNzb3IoZnVuY3Rpb24odCl7dmFyIGU9dC5ncmFwaGljO2MuaXNBcnJheShlKT9lWzBdJiZlWzBdLmVsZW1lbnRzP3QuZ3JhcGhpYz1bdC5ncmFwaGljWzBdXTp0LmdyYXBoaWM9W3tlbGVtZW50czplfV06ZSYmIWUuZWxlbWVudHMmJih0LmdyYXBoaWM9W3tlbGVtZW50czpbZV19XSl9KTt2YXIgZz1oLmV4dGVuZENvbXBvbmVudE1vZGVsKHt0eXBlOiJncmFwaGljIixkZWZhdWx0T3B0aW9uOntlbGVtZW50czpbXSxwYXJlbnRJZDpudWxsfSxfZWxPcHRpb25zVG9VcGRhdGU6bnVsbCxtZXJnZU9wdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbi5lbGVtZW50czt0aGlzLm9wdGlvbi5lbGVtZW50cz1udWxsLGcuc3VwZXJBcHBseSh0aGlzLCJtZXJnZU9wdGlvbiIsYXJndW1lbnRzKSx0aGlzLm9wdGlvbi5lbGVtZW50cz1lfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb24sbj0oZT9pOnQpLmVsZW1lbnRzLGE9aS5lbGVtZW50cz1lP1tdOmkuZWxlbWVudHMsbz1bXTt0aGlzLl9mbGF0dGVuKG4sbyk7dmFyIHI9ZC5tYXBwaW5nVG9FeGlzdHMoYSxvKTtkLm1ha2VJZEFuZE5hbWUocik7dmFyIGg9dGhpcy5fZWxPcHRpb25zVG9VcGRhdGU9W107Yy5lYWNoKHIsZnVuY3Rpb24odCxlKXt2YXIgaT10Lm9wdGlvbjtpJiYoaC5wdXNoKGkpLHModCxpKSxsKGEsZSxpKSx1KGFbZV0saSkpfSx0aGlzKTtmb3IodmFyIGY9YS5sZW5ndGgtMTtmPj0wO2YtLSludWxsPT1hW2ZdP2Euc3BsaWNlKGYsMSk6ZGVsZXRlIGFbZl0uJGFjdGlvbn0sX2ZsYXR0ZW46ZnVuY3Rpb24odCxlLGkpe2MuZWFjaCh0LGZ1bmN0aW9uKHQpe2lmKHQpe2kmJih0LnBhcmVudE9wdGlvbj1pKSxlLnB1c2godCk7dmFyIG49dC5jaGlsZHJlbjsiZ3JvdXAiPT09dC50eXBlJiZuJiZ0aGlzLl9mbGF0dGVuKG4sZSx0KSxkZWxldGUgdC5jaGlsZHJlbn19LHRoaXMpfSx1c2VFbE9wdGlvbnNUb1VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VsT3B0aW9uc1RvVXBkYXRlO3JldHVybiB0aGlzLl9lbE9wdGlvbnNUb1VwZGF0ZT1udWxsLHR9fSk7aC5leHRlbmRDb21wb25lbnRWaWV3KHt0eXBlOiJncmFwaGljIixpbml0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fZWxNYXA9Yy5jcmVhdGVIYXNoTWFwKCksdGhpcy5fbGFzdEdyYXBoaWNNb2RlbH0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0IT09dGhpcy5fbGFzdEdyYXBoaWNNb2RlbCYmdGhpcy5fY2xlYXIoKSx0aGlzLl9sYXN0R3JhcGhpY01vZGVsPXQsdGhpcy5fdXBkYXRlRWxlbWVudHModCxpKSx0aGlzLl9yZWxvY2F0ZSh0LGkpfSxfdXBkYXRlRWxlbWVudHM6ZnVuY3Rpb24odCxlKXt2YXIgaT10LnVzZUVsT3B0aW9uc1RvVXBkYXRlKCk7aWYoaSl7dmFyIHI9dGhpcy5fZWxNYXAscz10aGlzLmdyb3VwO2MuZWFjaChpLGZ1bmN0aW9uKHQpe3ZhciBlPXQuJGFjdGlvbixpPXQuaWQsbD1yLmdldChpKSx1PXQucGFyZW50SWQsaD1udWxsIT11P3IuZ2V0KHUpOnM7aWYoInRleHQiPT09dC50eXBlKXt2YXIgYz10LnN0eWxlO3QuaHYmJnQuaHZbMV0mJihjLnRleHRWZXJ0aWNhbEFsaWduPWMudGV4dEJhc2VsaW5lPW51bGwpLCFjLmhhc093blByb3BlcnR5KCJ0ZXh0RmlsbCIpJiZjLmZpbGwmJihjLnRleHRGaWxsPWMuZmlsbCksIWMuaGFzT3duUHJvcGVydHkoInRleHRTdHJva2UiKSYmYy5zdHJva2UmJihjLnRleHRTdHJva2U9Yy5zdHJva2UpfXZhciBkPW8odCk7ZSYmIm1lcmdlIiE9PWU/InJlcGxhY2UiPT09ZT8oYShsLHIpLG4oaSxoLGQscikpOiJyZW1vdmUiPT09ZSYmYShsLHIpOmw/bC5hdHRyKGQpOm4oaSxoLGQscik7dmFyIGY9ci5nZXQoaSk7ZiYmKGYuX19lY0dyYXBoaWNXaWR0aD10LndpZHRoLGYuX19lY0dyYXBoaWNIZWlnaHQ9dC5oZWlnaHQpfSl9fSxfcmVsb2NhdGU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5vcHRpb24uZWxlbWVudHMsbj10aGlzLmdyb3VwLGE9dGhpcy5fZWxNYXAsbz1pLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgcj1pW29dLHM9YS5nZXQoci5pZCk7aWYocyl7dmFyIGw9cy5wYXJlbnQsdT1sPT09bj97d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfTp7d2lkdGg6bC5fX2VjR3JhcGhpY1dpZHRofHwwLGhlaWdodDpsLl9fZWNHcmFwaGljSGVpZ2h0fHwwfTtwLnBvc2l0aW9uRWxlbWVudChzLHIsdSxudWxsLHtodjpyLmh2LGJvdW5kaW5nTW9kZTpyLmJvdW5kaW5nfSl9fX0sX2NsZWFyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxNYXA7dC5lYWNoKGZ1bmN0aW9uKGUpe2EoZSx0KX0pLHRoaXMuX2VsTWFwPWMuY3JlYXRlSGFzaE1hcCgpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXIoKX19KX0sZnVuY3Rpb24odCxlLGkpe2koMzIpLGkoMTI1KSxpKDU4KX0sZnVuY3Rpb24odCxlLGkpe2koMTM2KSxpKDIxOCksaSgxMzcpO3ZhciBuPWkoMik7bi5yZWdpc3RlclByb2Nlc3NvcihpKDIxOSkpLGkoMTMpLnJlZ2lzdGVyU3ViVHlwZURlZmF1bHRlcigibGVnZW5kIixmdW5jdGlvbigpe3JldHVybiJwbGFpbiJ9KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3ZhciBuPXQuZ2V0T3JpZW50KCksYT1bMSwxXTthW24uaW5kZXhdPTAsby5tZXJnZUxheW91dFBhcmFtKGUsaSx7dHlwZToiYm94IixpZ25vcmVTaXplOmF9KX12YXIgYT1pKDEzNiksbz1pKDkpLHI9YS5leHRlbmQoe3R5cGU6ImxlZ2VuZC5zY3JvbGwiLHNldFNjcm9sbERhdGFJbmRleDpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbi5zY3JvbGxEYXRhSW5kZXg9dH0sZGVmYXVsdE9wdGlvbjp7c2Nyb2xsRGF0YUluZGV4OjAscGFnZUJ1dHRvbkl0ZW1HYXA6NSxwYWdlQnV0dG9uR2FwOm51bGwscGFnZUJ1dHRvblBvc2l0aW9uOiJlbmQiLHBhZ2VGb3JtYXR0ZXI6IntjdXJyZW50fS97dG90YWx9IixwYWdlSWNvbnM6e2hvcml6b250YWw6WyJNMCwwTDEyLC0xMEwxMiwxMHoiLCJNMCwwTC0xMiwtMTBMLTEyLDEweiJdLHZlcnRpY2FsOlsiTTAsMEwyMCwwTDEwLC0yMHoiLCJNMCwwTDIwLDBMMTAsMjB6Il19LHBhZ2VJY29uQ29sb3I6IiMyZjQ1NTQiLHBhZ2VJY29uSW5hY3RpdmVDb2xvcjoiI2FhYSIscGFnZUljb25TaXplOjE1LHBhZ2VUZXh0U3R5bGU6e2NvbG9yOiIjMzMzIn0sYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6ODAwfSxpbml0OmZ1bmN0aW9uKHQsZSxpLGEpe3ZhciBzPW8uZ2V0TGF5b3V0UGFyYW1zKHQpO3Iuc3VwZXJDYWxsKHRoaXMsImluaXQiLHQsZSxpLGEpLG4odGhpcyx0LHMpfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0LGUpe3Iuc3VwZXJDYWxsKHRoaXMsIm1lcmdlT3B0aW9uIix0LGUpLG4odGhpcyx0aGlzLm9wdGlvbix0KX0sZ2V0T3JpZW50OmZ1bmN0aW9uKCl7cmV0dXJuInZlcnRpY2FsIj09PXRoaXMuZ2V0KCJvcmllbnQiKT97aW5kZXg6MSxuYW1lOiJ2ZXJ0aWNhbCJ9OntpbmRleDowLG5hbWU6Imhvcml6b250YWwifX19KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDMpLG89aSg5KSxyPWkoMTM3KSxzPWEuR3JvdXAsbD1bIndpZHRoIiwiaGVpZ2h0Il0sdT1bIngiLCJ5Il0saD1yLmV4dGVuZCh7dHlwZToibGVnZW5kLnNjcm9sbCIsbmV3bGluZURpc2FibGVkOiEwLGluaXQ6ZnVuY3Rpb24oKXtoLnN1cGVyQ2FsbCh0aGlzLCJpbml0IiksdGhpcy5fY3VycmVudEluZGV4PTAsdGhpcy5ncm91cC5hZGQodGhpcy5fY29udGFpbmVyR3JvdXA9bmV3IHMpLHRoaXMuX2NvbnRhaW5lckdyb3VwLmFkZCh0aGlzLmdldENvbnRlbnRHcm91cCgpKSx0aGlzLmdyb3VwLmFkZCh0aGlzLl9jb250cm9sbGVyR3JvdXA9bmV3IHMpfSxyZXNldElubmVyOmZ1bmN0aW9uKCl7aC5zdXBlckNhbGwodGhpcywicmVzZXRJbm5lciIpLHRoaXMuX2NvbnRyb2xsZXJHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9jb250YWluZXJHcm91cC5yZW1vdmVDbGlwUGF0aCgpLHRoaXMuX2NvbnRhaW5lckdyb3VwLl9fcmVjdFNpemU9bnVsbH0scmVuZGVySW5uZXI6ZnVuY3Rpb24odCxlLGksbyl7ZnVuY3Rpb24gcih0LGkpe3ZhciByPXQrIkRhdGFJbmRleCIsaD1hLmNyZWF0ZUljb24oZS5nZXQoInBhZ2VJY29ucyIsITApW2UuZ2V0T3JpZW50KCkubmFtZV1baV0se29uY2xpY2s6bi5iaW5kKHMuX3BhZ2VHbyxzLHIsZSxvKX0se3g6LXVbMF0vMix5Oi11WzFdLzIsd2lkdGg6dVswXSxoZWlnaHQ6dVsxXX0pO2gubmFtZT10LGwuYWRkKGgpfXZhciBzPXRoaXM7aC5zdXBlckNhbGwodGhpcywicmVuZGVySW5uZXIiLHQsZSxpLG8pO3ZhciBsPXRoaXMuX2NvbnRyb2xsZXJHcm91cCx1PWUuZ2V0KCJwYWdlSWNvblNpemUiLCEwKTtuLmlzQXJyYXkodSl8fCh1PVt1LHVdKSxyKCJwYWdlUHJldiIsMCk7dmFyIGM9ZS5nZXRNb2RlbCgicGFnZVRleHRTdHlsZSIpO2wuYWRkKG5ldyBhLlRleHQoe25hbWU6InBhZ2VUZXh0IixzdHlsZTp7dGV4dEZpbGw6Yy5nZXRUZXh0Q29sb3IoKSxmb250OmMuZ2V0Rm9udCgpLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUiLHRleHRBbGlnbjoiY2VudGVyIn0sc2lsZW50OiEwfSkpLHIoInBhZ2VOZXh0IiwxKX0sbGF5b3V0SW5uZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuZ2V0Q29udGVudEdyb3VwKCkscz10aGlzLl9jb250YWluZXJHcm91cCxoPXRoaXMuX2NvbnRyb2xsZXJHcm91cCxjPXQuZ2V0T3JpZW50KCkuaW5kZXgsZD1sW2NdLGY9bFsxLWNdLHA9dVsxLWNdO28uYm94KHQuZ2V0KCJvcmllbnQiKSxyLHQuZ2V0KCJpdGVtR2FwIiksYz9pLndpZHRoOm51bGwsYz9udWxsOmkuaGVpZ2h0KSxvLmJveCgiaG9yaXpvbnRhbCIsaCx0LmdldCgicGFnZUJ1dHRvbkl0ZW1HYXAiLCEwKSk7dmFyIGc9ci5nZXRCb3VuZGluZ1JlY3QoKSxtPWguZ2V0Qm91bmRpbmdSZWN0KCksdj1nW2RdPmlbZF0seT1bLWcueCwtZy55XTt5W2NdPXIucG9zaXRpb25bY107dmFyIHg9WzAsMF0sXz1bLW0ueCwtbS55XSxiPW4ucmV0cmlldmUyKHQuZ2V0KCJwYWdlQnV0dG9uR2FwIiwhMCksdC5nZXQoIml0ZW1HYXAiLCEwKSk7aWYodil7dmFyIHc9dC5nZXQoInBhZ2VCdXR0b25Qb3NpdGlvbiIsITApOyJlbmQiPT09dz9fW2NdKz1pW2RdLW1bZF06eFtjXSs9bVtkXStifV9bMS1jXSs9Z1tmXS8yLW1bZl0vMixyLmF0dHIoInBvc2l0aW9uIix5KSxzLmF0dHIoInBvc2l0aW9uIix4KSxoLmF0dHIoInBvc2l0aW9uIixfKTt2YXIgUz10aGlzLmdyb3VwLmdldEJvdW5kaW5nUmVjdCgpLFM9e3g6MCx5OjB9O2lmKFNbZF09dj9pW2RdOmdbZF0sU1tmXT1NYXRoLm1heChnW2ZdLG1bZl0pLFNbcF09TWF0aC5taW4oMCxtW3BdK19bMS1jXSkscy5fX3JlY3RTaXplPWlbZF0sdil7dmFyIE09e3g6MCx5OjB9O01bZF09TWF0aC5tYXgoaVtkXS1tW2RdLWIsMCksTVtmXT1TW2ZdLHMuc2V0Q2xpcFBhdGgobmV3IGEuUmVjdCh7c2hhcGU6TX0pKSxzLl9fcmVjdFNpemU9TVtkXX1lbHNlIGguZWFjaENoaWxkKGZ1bmN0aW9uKHQpe3QuYXR0cih7aW52aXNpYmxlOiEwLHNpbGVudDohMH0pfSk7dmFyIEk9dGhpcy5fZ2V0UGFnZUluZm8odCk7cmV0dXJuIG51bGwhPUkucGFnZUluZGV4JiZhLnVwZGF0ZVByb3BzKHIse3Bvc2l0aW9uOkkuY29udGVudFBvc2l0aW9ufSx0KSx0aGlzLl91cGRhdGVQYWdlSW5mb1ZpZXcodCxJKSxTfSxfcGFnZUdvOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9nZXRQYWdlSW5mbyhlKVt0XTtudWxsIT1uJiZpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJsZWdlbmRTY3JvbGwiLHNjcm9sbERhdGFJbmRleDpuLGxlZ2VuZElkOmUuaWR9KX0sX3VwZGF0ZVBhZ2VJbmZvVmlldzpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2NvbnRyb2xsZXJHcm91cDtuLmVhY2goWyJwYWdlUHJldiIsInBhZ2VOZXh0Il0sZnVuY3Rpb24obil7dmFyIGE9bnVsbCE9ZVtuKyJEYXRhSW5kZXgiXSxvPWkuY2hpbGRPZk5hbWUobik7byYmKG8uc2V0U3R5bGUoImZpbGwiLGE/dC5nZXQoInBhZ2VJY29uQ29sb3IiLCEwKTp0LmdldCgicGFnZUljb25JbmFjdGl2ZUNvbG9yIiwhMCkpLG8uY3Vyc29yPWE/InBvaW50ZXIiOiJkZWZhdWx0Iil9KTt2YXIgYT1pLmNoaWxkT2ZOYW1lKCJwYWdlVGV4dCIpLG89dC5nZXQoInBhZ2VGb3JtYXR0ZXIiKSxyPWUucGFnZUluZGV4LHM9bnVsbCE9cj9yKzE6MCxsPWUucGFnZUNvdW50O2EmJm8mJmEuc2V0U3R5bGUoInRleHQiLG4uaXNTdHJpbmcobyk/by5yZXBsYWNlKCJ7Y3VycmVudH0iLHMpLnJlcGxhY2UoInt0b3RhbH0iLGwpOm8oe2N1cnJlbnQ6cyx0b3RhbDpsfSkpfSxfZ2V0UGFnZUluZm86ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT10LmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7cmV0dXJuIGVbZ10rPXQucG9zaXRpb25bZF0sZX12YXIgaSxuLGEsbyxyPXQuZ2V0KCJzY3JvbGxEYXRhSW5kZXgiLCEwKSxzPXRoaXMuZ2V0Q29udGVudEdyb3VwKCksaD1zLmdldEJvdW5kaW5nUmVjdCgpLGM9dGhpcy5fY29udGFpbmVyR3JvdXAuX19yZWN0U2l6ZSxkPXQuZ2V0T3JpZW50KCkuaW5kZXgsZj1sW2RdLHA9bFsxLWRdLGc9dVtkXSxtPXMucG9zaXRpb24uc2xpY2UoKTtzLmVhY2hDaGlsZChmdW5jdGlvbih0KXt0Ll9fbGVnZW5kRGF0YUluZGV4PT09ciYmKG89dCl9KTt2YXIgdj1jP01hdGguY2VpbChoW2ZdL2MpOjA7aWYobyl7dmFyIHk9by5nZXRCb3VuZGluZ1JlY3QoKSx4PW8ucG9zaXRpb25bZF0reVtnXTttW2RdPS14LWhbZ10saT1NYXRoLmZsb29yKHYqKHgreVtnXStjLzIpL2hbZl0pLGk9aFtmXSYmdj9NYXRoLm1heCgwLE1hdGgubWluKHYtMSxpKSk6LTE7dmFyIF89e3g6MCx5OjB9O19bZl09YyxfW3BdPWhbcF0sX1tnXT0tbVtkXS1oW2ddO3ZhciBiLHc9cy5jaGlsZHJlbigpO2lmKHMuZWFjaENoaWxkKGZ1bmN0aW9uKHQsaSl7dmFyIG49ZSh0KTtuLmludGVyc2VjdChfKSYmKG51bGw9PWImJihiPWkpLGE9dC5fX2xlZ2VuZERhdGFJbmRleCksaT09PXcubGVuZ3RoLTEmJm5bZ10rbltmXTw9X1tnXStfW2ZdJiYoYT1udWxsKX0pLG51bGwhPWIpe3ZhciBTPXdbYl0sTT1lKFMpO2lmKF9bZ109TVtnXStNW2ZdLV9bZl0sYjw9MCYmTVtnXT49X1tnXSluPW51bGw7ZWxzZXtmb3IoO2I+MCYmZSh3W2ItMV0pLmludGVyc2VjdChfKTspYi0tO249d1tiXS5fX2xlZ2VuZERhdGFJbmRleH19fXJldHVybntjb250ZW50UG9zaXRpb246bSxwYWdlSW5kZXg6aSxwYWdlQ291bnQ6dixwYWdlUHJldkRhdGFJbmRleDpuLHBhZ2VOZXh0RGF0YUluZGV4OmF9fX0pO3QuZXhwb3J0cz1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG4sYT17fSxyPSJ0b2dnbGVTZWxlY3RlZCI9PT10O3JldHVybiBpLmVhY2hDb21wb25lbnQoImxlZ2VuZCIsZnVuY3Rpb24oaSl7ciYmbnVsbCE9bj9pW24/InNlbGVjdCI6InVuU2VsZWN0Il0oZS5uYW1lKTooaVt0XShlLm5hbWUpLG49aS5pc1NlbGVjdGVkKGUubmFtZSkpO3ZhciBzPWkuZ2V0RGF0YSgpO28uZWFjaChzLGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0KCJuYW1lIik7aWYoIlxuIiE9PWUmJiIiIT09ZSl7dmFyIG49aS5pc1NlbGVjdGVkKGUpO2EuaGFzT3duUHJvcGVydHkoZSk/YVtlXT1hW2VdJiZuOmFbZV09bn19KX0pLHtuYW1lOmUubmFtZSxzZWxlY3RlZDphfX12YXIgYT1pKDIpLG89aSgxKTthLnJlZ2lzdGVyQWN0aW9uKCJsZWdlbmRUb2dnbGVTZWxlY3QiLCJsZWdlbmRzZWxlY3RjaGFuZ2VkIixvLmN1cnJ5KG4sInRvZ2dsZVNlbGVjdGVkIikpLGEucmVnaXN0ZXJBY3Rpb24oImxlZ2VuZFNlbGVjdCIsImxlZ2VuZHNlbGVjdGVkIixvLmN1cnJ5KG4sInNlbGVjdCIpKSxhLnJlZ2lzdGVyQWN0aW9uKCJsZWdlbmRVblNlbGVjdCIsImxlZ2VuZHVuc2VsZWN0ZWQiLG8uY3VycnkobiwidW5TZWxlY3QiKSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJsZWdlbmQifSk7ZSYmZS5sZW5ndGgmJnQuZmlsdGVyU2VyaWVzKGZ1bmN0aW9uKHQpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKCFlW2ldLmlzU2VsZWN0ZWQodC5uYW1lKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX0sZnVuY3Rpb24odCxlLGkpe2koMikucmVnaXN0ZXJBY3Rpb24oImxlZ2VuZFNjcm9sbCIsImxlZ2VuZHNjcm9sbCIsZnVuY3Rpb24odCxlKXt2YXIgaT10LnNjcm9sbERhdGFJbmRleDtudWxsIT1pJiZlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJsZWdlbmQiLHN1YlR5cGU6InNjcm9sbCIscXVlcnk6dH0sZnVuY3Rpb24odCl7dC5zZXRTY3JvbGxEYXRhSW5kZXgoaSl9KX0pfSxmdW5jdGlvbih0LGUsaSl7aSgyMTUpLGkoMjE2KSxpKDIxNyksaSgyMjApfSxmdW5jdGlvbih0LGUsaSl7aSgyMjUpLGkoMjI2KSxpKDIpLnJlZ2lzdGVyUHJlcHJvY2Vzc29yKGZ1bmN0aW9uKHQpe3QubWFya0FyZWE9dC5tYXJrQXJlYXx8e319KX0sZnVuY3Rpb24odCxlLGkpe2koMjI3KSxpKDIyOCksaSgyKS5yZWdpc3RlclByZXByb2Nlc3NvcihmdW5jdGlvbih0KXt0Lm1hcmtMaW5lPXQubWFya0xpbmV8fHt9fSl9LGZ1bmN0aW9uKHQsZSxpKXtpKDIyOSksaSgyMzApLGkoMikucmVnaXN0ZXJQcmVwcm9jZXNzb3IoZnVuY3Rpb24odCl7dC5tYXJrUG9pbnQ9dC5tYXJrUG9pbnR8fHt9fSl9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9aSg4NCkuZXh0ZW5kKHt0eXBlOiJtYXJrQXJlYSIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoxLHRvb2x0aXA6e3RyaWdnZXI6Iml0ZW0ifSxhbmltYXRpb246ITEsbGFiZWw6e25vcm1hbDp7c2hvdzohMCxwb3NpdGlvbjoidG9wIn0sZW1waGFzaXM6e3Nob3c6ITAscG9zaXRpb246InRvcCJ9fSxpdGVtU3R5bGU6e25vcm1hbDp7Ym9yZGVyV2lkdGg6MH19fX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4haXNOYU4odCkmJiFpc0Zpbml0ZSh0KX1mdW5jdGlvbiBhKHQsZSxpLGEpe3ZhciBvPTEtdDtyZXR1cm4gbihlW29dKSYmbihpW29dKX1mdW5jdGlvbiBvKHQsZSl7dmFyIGk9ZS5jb29yZFswXSxuPWUuY29vcmRbMV07cmV0dXJuISgiY2FydGVzaWFuMmQiIT09dC50eXBlfHwhaXx8IW58fCFhKDEsaSxuLHQpJiYhYSgwLGksbix0KSl8fChmLmRhdGFGaWx0ZXIodCx7Y29vcmQ6aSx4OmUueDAseTplLnkwfSl8fGYuZGF0YUZpbHRlcih0LHtjb29yZDpuLHg6ZS54MSx5OmUueTF9KSl9ZnVuY3Rpb24gcih0LGUsaSxhLG8pe3ZhciByLHM9YS5jb29yZGluYXRlU3lzdGVtLGw9dC5nZXRJdGVtTW9kZWwoZSksdT1oLnBhcnNlUGVyY2VudChsLmdldChpWzBdKSxvLmdldFdpZHRoKCkpLGM9aC5wYXJzZVBlcmNlbnQobC5nZXQoaVsxXSksby5nZXRIZWlnaHQoKSk7aWYoaXNOYU4odSl8fGlzTmFOKGMpKXtpZihhLmdldE1hcmtlclBvc2l0aW9uKXI9YS5nZXRNYXJrZXJQb3NpdGlvbih0LmdldFZhbHVlcyhpLGUpKTtlbHNle3ZhciBkPXQuZ2V0KGlbMF0sZSksZj10LmdldChpWzFdLGUpO3I9cy5kYXRhVG9Qb2ludChbZCxmXSwhMCl9aWYoImNhcnRlc2lhbjJkIj09PXMudHlwZSl7dmFyIHA9cy5nZXRBeGlzKCJ4IiksZz1zLmdldEF4aXMoInkiKSxkPXQuZ2V0KGlbMF0sZSksZj10LmdldChpWzFdLGUpO24oZCk/clswXT1wLnRvR2xvYmFsQ29vcmQocC5nZXRFeHRlbnQoKVsieDAiPT09aVswXT8wOjFdKTpuKGYpJiYoclsxXT1nLnRvR2xvYmFsQ29vcmQoZy5nZXRFeHRlbnQoKVsieTAiPT09aVsxXT8wOjFdKSl9aXNOYU4odSl8fChyWzBdPXUpLGlzTmFOKGMpfHwoclsxXT1jKX1lbHNlIHI9W3UsY107cmV0dXJuIHJ9ZnVuY3Rpb24gcyh0LGUsaSl7dmFyIG4sYSxyPVsieDAiLCJ5MCIsIngxIiwieTEiXTt0PyhuPWwubWFwKHQmJnQuZGltZW5zaW9ucyxmdW5jdGlvbih0KXt2YXIgaT1lLmdldERhdGEoKS5nZXREaW1lbnNpb25JbmZvKGUuY29vcmREaW1Ub0RhdGFEaW0odClbMF0pfHx7fTtyZXR1cm4gaS5uYW1lPXQsaX0pLGE9bmV3IHUobC5tYXAocixmdW5jdGlvbih0LGUpe3JldHVybntuYW1lOnQsdHlwZTpuW2UlMl0udHlwZX19KSxpKSk6KG49W3tuYW1lOiJ2YWx1ZSIsdHlwZToiZmxvYXQifV0sYT1uZXcgdShuLGkpKTt2YXIgcz1sLm1hcChpLmdldCgiZGF0YSIpLGwuY3VycnkocCxlLHQsaSkpO3QmJihzPWwuZmlsdGVyKHMsbC5jdXJyeShvLHQpKSk7dmFyIGg9dD9mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gdC5jb29yZFtNYXRoLmZsb29yKG4vMildW24lMl19OmZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfTtyZXR1cm4gYS5pbml0RGF0YShzLG51bGwsaCksYS5oYXNJdGVtT3B0aW9uPSEwLGF9dmFyIGw9aSgxKSx1PWkoMTQpLGg9aSg0KSxjPWkoMyksZD1pKDIyKSxmPWkoODYpLHA9ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9Zi5kYXRhVHJhbnNmb3JtKHQsblswXSksbz1mLmRhdGFUcmFuc2Zvcm0odCxuWzFdKSxyPWwucmV0cmlldmUscz1hLmNvb3JkLHU9by5jb29yZDtzWzBdPXIoc1swXSwtKDEvMCkpLHNbMV09cihzWzFdLC0oMS8wKSksdVswXT1yKHVbMF0sMS8wKSx1WzFdPXIodVsxXSwxLzApO3ZhciBoPWwubWVyZ2VBbGwoW3t9LGEsb10pO3JldHVybiBoLmNvb3JkPVthLmNvb3JkLG8uY29vcmRdLGgueDA9YS54LGgueTA9YS55LGgueDE9by54LGgueTE9by55LGh9LGc9W1sieDAiLCJ5MCJdLFsieDEiLCJ5MCJdLFsieDEiLCJ5MSJdLFsieDAiLCJ5MSJdXTtpKDg1KS5leHRlbmQoe3R5cGU6Im1hcmtBcmVhIix1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCxlLGkpe2UuZWFjaFNlcmllcyhmdW5jdGlvbih0KXt2YXIgZT10Lm1hcmtBcmVhTW9kZWw7aWYoZSl7dmFyIG49ZS5nZXREYXRhKCk7bi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPWwubWFwKGcsZnVuY3Rpb24oYSl7cmV0dXJuIHIobixlLGEsdCxpKX0pO24uc2V0SXRlbUxheW91dChlLGEpO3ZhciBvPW4uZ2V0SXRlbUdyYXBoaWNFbChlKTtvLnNldFNoYXBlKCJwb2ludHMiLGEpfSl9fSx0aGlzKX0scmVuZGVyU2VyaWVzOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXQuY29vcmRpbmF0ZVN5c3RlbSxvPXQubmFtZSx1PXQuZ2V0RGF0YSgpLGg9dGhpcy5tYXJrZXJHcm91cE1hcCxmPWguZ2V0KG8pfHxoLnNldChvLHtncm91cDpuZXcgYy5Hcm91cH0pO3RoaXMuZ3JvdXAuYWRkKGYuZ3JvdXApLGYuX19rZWVwPSEwO3ZhciBwPXMoYSx0LGUpO2Uuc2V0RGF0YShwKSxwLmVhY2goZnVuY3Rpb24oZSl7cC5zZXRJdGVtTGF5b3V0KGUsbC5tYXAoZyxmdW5jdGlvbihpKXtyZXR1cm4gcihwLGUsaSx0LG4pfSkpLHAuc2V0SXRlbVZpc3VhbChlLHtjb2xvcjp1LmdldFZpc3VhbCgiY29sb3IiKX0pfSkscC5kaWZmKGYuX19kYXRhKS5hZGQoZnVuY3Rpb24odCl7dmFyIGU9bmV3IGMuUG9seWdvbih7c2hhcGU6e3BvaW50czpwLmdldEl0ZW1MYXlvdXQodCl9fSk7cC5zZXRJdGVtR3JhcGhpY0VsKHQsZSksZi5ncm91cC5hZGQoZSl9KS51cGRhdGUoZnVuY3Rpb24odCxpKXt2YXIgbj1mLl9fZGF0YS5nZXRJdGVtR3JhcGhpY0VsKGkpO2MudXBkYXRlUHJvcHMobix7c2hhcGU6e3BvaW50czpwLmdldEl0ZW1MYXlvdXQodCl9fSxlLHQpLGYuZ3JvdXAuYWRkKG4pLHAuc2V0SXRlbUdyYXBoaWNFbCh0LG4pfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPWYuX19kYXRhLmdldEl0ZW1HcmFwaGljRWwodCk7Zi5ncm91cC5yZW1vdmUoZSl9KS5leGVjdXRlKCkscC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGkpe3ZhciBuPXAuZ2V0SXRlbU1vZGVsKGkpLGE9bi5nZXRNb2RlbCgibGFiZWwubm9ybWFsIiksbz1uLmdldE1vZGVsKCJsYWJlbC5lbXBoYXNpcyIpLHI9cC5nZXRJdGVtVmlzdWFsKGksImNvbG9yIik7dC51c2VTdHlsZShsLmRlZmF1bHRzKG4uZ2V0TW9kZWwoIml0ZW1TdHlsZS5ub3JtYWwiKS5nZXRJdGVtU3R5bGUoKSx7ZmlsbDpkLm1vZGlmeUFscGhhKHIsLjQpLHN0cm9rZTpyfSkpLHQuaG92ZXJTdHlsZT1uLmdldE1vZGVsKCJpdGVtU3R5bGUuZW1waGFzaXMiKS5nZXRJdGVtU3R5bGUoKSxjLnNldExhYmVsU3R5bGUodC5zdHlsZSx0LmhvdmVyU3R5bGUsYSxvLHtsYWJlbEZldGNoZXI6ZSxsYWJlbERhdGFJbmRleDppLGRlZmF1bHRUZXh0OnAuZ2V0TmFtZShpKXx8IiIsaXNSZWN0VGV4dDohMCxhdXRvQ29sb3I6cn0pLGMuc2V0SG92ZXJTdHlsZSh0LHt9KSx0LmRhdGFNb2RlbD1lfSksZi5fX2RhdGE9cCxmLmdyb3VwLnNpbGVudD1lLmdldCgic2lsZW50Iil8fHQuZ2V0KCJzaWxlbnQiKX19KX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz1pKDg0KS5leHRlbmQoe3R5cGU6Im1hcmtMaW5lIixkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjUsc3ltYm9sOlsiY2lyY2xlIiwiYXJyb3ciXSxzeW1ib2xTaXplOls4LDE2XSxwcmVjaXNpb246Mix0b29sdGlwOnt0cmlnZ2VyOiJpdGVtIn0sbGFiZWw6e25vcm1hbDp7c2hvdzohMCxwb3NpdGlvbjoiZW5kIn0sZW1waGFzaXM6e3Nob3c6ITB9fSxsaW5lU3R5bGU6e25vcm1hbDp7dHlwZToiZGFzaGVkIn0sZW1waGFzaXM6e3dpZHRoOjN9fSxhbmltYXRpb25FYXNpbmc6ImxpbmVhciJ9fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiFpc05hTih0KSYmIWlzRmluaXRlKHQpfWZ1bmN0aW9uIGEodCxlLGksYSl7dmFyIG89MS10LHI9YS5kaW1lbnNpb25zW3RdO3JldHVybiBuKGVbb10pJiZuKGlbb10pJiZlW3RdPT09aVt0XSYmYS5nZXRBeGlzKHIpLmNvbnRhaW5EYXRhKGVbdF0pfWZ1bmN0aW9uIG8odCxlKXtpZigiY2FydGVzaWFuMmQiPT09dC50eXBlKXt2YXIgaT1lWzBdLmNvb3JkLG49ZVsxXS5jb29yZDtpZihpJiZuJiYoYSgxLGksbix0KXx8YSgwLGksbix0KSkpcmV0dXJuITB9cmV0dXJuIGMuZGF0YUZpbHRlcih0LGVbMF0pJiZjLmRhdGFGaWx0ZXIodCxlWzFdKX1mdW5jdGlvbiByKHQsZSxpLGEsbyl7dmFyIHIscz1hLmNvb3JkaW5hdGVTeXN0ZW0sbD10LmdldEl0ZW1Nb2RlbChlKSx1PWgucGFyc2VQZXJjZW50KGwuZ2V0KCJ4Iiksby5nZXRXaWR0aCgpKSxjPWgucGFyc2VQZXJjZW50KGwuZ2V0KCJ5Iiksby5nZXRIZWlnaHQoKSk7aWYoaXNOYU4odSl8fGlzTmFOKGMpKXtpZihhLmdldE1hcmtlclBvc2l0aW9uKXI9YS5nZXRNYXJrZXJQb3NpdGlvbih0LmdldFZhbHVlcyh0LmRpbWVuc2lvbnMsZSkpO2Vsc2V7dmFyIGQ9cy5kaW1lbnNpb25zLGY9dC5nZXQoZFswXSxlKSxwPXQuZ2V0KGRbMV0sZSk7cj1zLmRhdGFUb1BvaW50KFtmLHBdKX1pZigiY2FydGVzaWFuMmQiPT09cy50eXBlKXt2YXIgZz1zLmdldEF4aXMoIngiKSxtPXMuZ2V0QXhpcygieSIpLGQ9cy5kaW1lbnNpb25zO24odC5nZXQoZFswXSxlKSk/clswXT1nLnRvR2xvYmFsQ29vcmQoZy5nZXRFeHRlbnQoKVtpPzA6MV0pOm4odC5nZXQoZFsxXSxlKSkmJihyWzFdPW0udG9HbG9iYWxDb29yZChtLmdldEV4dGVudCgpW2k/MDoxXSkpfWlzTmFOKHUpfHwoclswXT11KSxpc05hTihjKXx8KHJbMV09Yyl9ZWxzZSByPVt1LGNdO3Quc2V0SXRlbUxheW91dChlLHIpfWZ1bmN0aW9uIHModCxlLGkpe3ZhciBuO249dD9sLm1hcCh0JiZ0LmRpbWVuc2lvbnMsZnVuY3Rpb24odCl7dmFyIGk9ZS5nZXREYXRhKCkuZ2V0RGltZW5zaW9uSW5mbyhlLmNvb3JkRGltVG9EYXRhRGltKHQpWzBdKXx8e307cmV0dXJuIGkubmFtZT10LGl9KTpbe25hbWU6InZhbHVlIix0eXBlOiJmbG9hdCJ9XTt2YXIgYT1uZXcgdShuLGkpLHI9bmV3IHUobixpKSxzPW5ldyB1KFtdLGkpLGg9bC5tYXAoaS5nZXQoImRhdGEiKSxsLmN1cnJ5KGYsZSx0LGkpKTt0JiYoaD1sLmZpbHRlcihoLGwuY3Vycnkobyx0KSkpO3ZhciBkPXQ/Yy5kaW1WYWx1ZUdldHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX07cmV0dXJuIGEuaW5pdERhdGEobC5tYXAoaCxmdW5jdGlvbih0KXtyZXR1cm4gdFswXX0pLG51bGwsZCksci5pbml0RGF0YShsLm1hcChoLGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSksbnVsbCxkKSxzLmluaXREYXRhKGwubWFwKGgsZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KSkscy5oYXNJdGVtT3B0aW9uPSEwLHtmcm9tOmEsdG86cixsaW5lOnN9fXZhciBsPWkoMSksdT1pKDE0KSxoPWkoNCksYz1pKDg2KSxkPWkoMTEyKSxmPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXQuZ2V0RGF0YSgpLG89bi50eXBlO2lmKCFsLmlzQXJyYXkobikmJigibWluIj09PW98fCJtYXgiPT09b3x8ImF2ZXJhZ2UiPT09b3x8bnVsbCE9bi54QXhpc3x8bnVsbCE9bi55QXhpcykpe3ZhciByLHMsdTtpZihudWxsIT1uLnlBeGlzfHxudWxsIT1uLnhBeGlzKXM9bnVsbCE9bi55QXhpcz8ieSI6IngiLHI9ZS5nZXRBeGlzKHMpLHU9bC5yZXRyaWV2ZShuLnlBeGlzLG4ueEF4aXMpO2Vsc2V7dmFyIGg9Yy5nZXRBeGlzSW5mbyhuLGEsZSx0KTtzPWgudmFsdWVEYXRhRGltLHI9aC52YWx1ZUF4aXMsdT1jLm51bUNhbGN1bGF0ZShhLHMsbyl9dmFyIGQ9IngiPT09cz8wOjEsZj0xLWQscD1sLmNsb25lKG4pLGc9e307cC50eXBlPW51bGwscC5jb29yZD1bXSxnLmNvb3JkPVtdLHAuY29vcmRbZl09LSgxLzApLGcuY29vcmRbZl09MS8wO3ZhciBtPWkuZ2V0KCJwcmVjaXNpb24iKTttPj0wJiYibnVtYmVyIj09dHlwZW9mIHUmJih1PSt1LnRvRml4ZWQoTWF0aC5taW4obSwyMCkpKSxwLmNvb3JkW2RdPWcuY29vcmRbZF09dSxuPVtwLGcse3R5cGU6byx2YWx1ZUluZGV4Om4udmFsdWVJbmRleCx2YWx1ZTp1fV19cmV0dXJuIG49W2MuZGF0YVRyYW5zZm9ybSh0LG5bMF0pLGMuZGF0YVRyYW5zZm9ybSh0LG5bMV0pLGwuZXh0ZW5kKHt9LG5bMl0pXSxuWzJdLnR5cGU9blsyXS50eXBlfHwiIixsLm1lcmdlKG5bMl0sblswXSksbC5tZXJnZShuWzJdLG5bMV0pLG59O2koODUpLmV4dGVuZCh7dHlwZToibWFya0xpbmUiLHVwZGF0ZUxheW91dDpmdW5jdGlvbih0LGUsaSl7ZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3ZhciBlPXQubWFya0xpbmVNb2RlbDtpZihlKXt2YXIgbj1lLmdldERhdGEoKSxhPWUuX19mcm9tLG89ZS5fX3RvO2EuZWFjaChmdW5jdGlvbihlKXtyKGEsZSwhMCx0LGkpLHIobyxlLCExLHQsaSl9KSxuLmVhY2goZnVuY3Rpb24odCl7bi5zZXRJdGVtTGF5b3V0KHQsW2EuZ2V0SXRlbUxheW91dCh0KSxvLmdldEl0ZW1MYXlvdXQodCldKX0pLHRoaXMubWFya2VyR3JvdXBNYXAuZ2V0KHQuaWQpLnVwZGF0ZUxheW91dCgpfX0sdGhpcyl9LHJlbmRlclNlcmllczpmdW5jdGlvbih0LGUsaSxuKXtmdW5jdGlvbiBhKGUsaSxhKXt2YXIgbz1lLmdldEl0ZW1Nb2RlbChpKTtyKGUsaSxhLHQsbiksZS5zZXRJdGVtVmlzdWFsKGkse3N5bWJvbFNpemU6by5nZXQoInN5bWJvbFNpemUiKXx8eFthPzA6MV0sc3ltYm9sOm8uZ2V0KCJzeW1ib2wiLCEwKXx8eVthPzA6MV0sY29sb3I6by5nZXQoIml0ZW1TdHlsZS5ub3JtYWwuY29sb3IiKXx8aC5nZXRWaXN1YWwoImNvbG9yIil9KX12YXIgbz10LmNvb3JkaW5hdGVTeXN0ZW0sdT10LmlkLGg9dC5nZXREYXRhKCksYz10aGlzLm1hcmtlckdyb3VwTWFwLGY9Yy5nZXQodSl8fGMuc2V0KHUsbmV3IGQpO3RoaXMuZ3JvdXAuYWRkKGYuZ3JvdXApO3ZhciBwPXMobyx0LGUpLGc9cC5mcm9tLG09cC50byx2PXAubGluZTtlLl9fZnJvbT1nLGUuX190bz1tLGUuc2V0RGF0YSh2KTt2YXIgeT1lLmdldCgic3ltYm9sIikseD1lLmdldCgic3ltYm9sU2l6ZSIpO2wuaXNBcnJheSh5KXx8KHk9W3kseV0pLCJudW1iZXIiPT10eXBlb2YgeCYmKHg9W3gseF0pLHAuZnJvbS5lYWNoKGZ1bmN0aW9uKHQpe2EoZyx0LCEwKSxhKG0sdCwhMSl9KSx2LmVhY2goZnVuY3Rpb24odCl7dmFyIGU9di5nZXRJdGVtTW9kZWwodCkuZ2V0KCJsaW5lU3R5bGUubm9ybWFsLmNvbG9yIik7di5zZXRJdGVtVmlzdWFsKHQse2NvbG9yOmV8fGcuZ2V0SXRlbVZpc3VhbCh0LCJjb2xvciIpfSksdi5zZXRJdGVtTGF5b3V0KHQsW2cuZ2V0SXRlbUxheW91dCh0KSxtLmdldEl0ZW1MYXlvdXQodCldKSx2LnNldEl0ZW1WaXN1YWwodCx7ZnJvbVN5bWJvbFNpemU6Zy5nZXRJdGVtVmlzdWFsKHQsInN5bWJvbFNpemUiKSxmcm9tU3ltYm9sOmcuZ2V0SXRlbVZpc3VhbCh0LCJzeW1ib2wiKSx0b1N5bWJvbFNpemU6bS5nZXRJdGVtVmlzdWFsKHQsInN5bWJvbFNpemUiKSx0b1N5bWJvbDptLmdldEl0ZW1WaXN1YWwodCwic3ltYm9sIil9KX0pLGYudXBkYXRlRGF0YSh2KSxwLmxpbmUuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCxpKXt0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe3QuZGF0YU1vZGVsPWV9KX0pLGYuX19rZWVwPSEwLGYuZ3JvdXAuc2lsZW50PWUuZ2V0KCJzaWxlbnQiKXx8dC5nZXQoInNpbGVudCIpfX0pfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPWkoODQpLmV4dGVuZCh7dHlwZToibWFya1BvaW50IixkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjUsc3ltYm9sOiJwaW4iLHN5bWJvbFNpemU6NTAsdG9vbHRpcDp7dHJpZ2dlcjoiaXRlbSJ9LGxhYmVsOntub3JtYWw6e3Nob3c6ITAscG9zaXRpb246Imluc2lkZSJ9LGVtcGhhc2lzOntzaG93OiEwfX0saXRlbVN0eWxlOntub3JtYWw6e2JvcmRlcldpZHRoOjJ9fX19KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3ZhciBuPWUuY29vcmRpbmF0ZVN5c3RlbTt0LmVhY2goZnVuY3Rpb24oYSl7dmFyIG8scj10LmdldEl0ZW1Nb2RlbChhKSxsPXMucGFyc2VQZXJjZW50KHIuZ2V0KCJ4IiksaS5nZXRXaWR0aCgpKSx1PXMucGFyc2VQZXJjZW50KHIuZ2V0KCJ5IiksaS5nZXRIZWlnaHQoKSk7aWYoaXNOYU4obCl8fGlzTmFOKHUpKXtpZihlLmdldE1hcmtlclBvc2l0aW9uKW89ZS5nZXRNYXJrZXJQb3NpdGlvbih0LmdldFZhbHVlcyh0LmRpbWVuc2lvbnMsYSkpO2Vsc2UgaWYobil7dmFyIGg9dC5nZXQobi5kaW1lbnNpb25zWzBdLGEpLGM9dC5nZXQobi5kaW1lbnNpb25zWzFdLGEpO289bi5kYXRhVG9Qb2ludChbaCxjXSl9fWVsc2Ugbz1bbCx1XTtpc05hTihsKXx8KG9bMF09bCksaXNOYU4odSl8fChvWzFdPXUpLHQuc2V0SXRlbUxheW91dChhLG8pfSl9ZnVuY3Rpb24gYSh0LGUsaSl7dmFyIG47bj10P3IubWFwKHQmJnQuZGltZW5zaW9ucyxmdW5jdGlvbih0KXt2YXIgaT1lLmdldERhdGEoKS5nZXREaW1lbnNpb25JbmZvKGUuY29vcmREaW1Ub0RhdGFEaW0odClbMF0pfHx7fTtyZXR1cm4gaS5uYW1lPXQsaX0pOlt7bmFtZToidmFsdWUiLHR5cGU6ImZsb2F0In1dO3ZhciBhPW5ldyBsKG4saSksbz1yLm1hcChpLmdldCgiZGF0YSIpLHIuY3VycnkodS5kYXRhVHJhbnNmb3JtLGUpKTtyZXR1cm4gdCYmKG89ci5maWx0ZXIobyxyLmN1cnJ5KHUuZGF0YUZpbHRlcix0KSkpLGEuaW5pdERhdGEobyxudWxsLHQ/dS5kaW1WYWx1ZUdldHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pLGF9dmFyIG89aSg0Nikscj1pKDEpLHM9aSg0KSxsPWkoMTQpLHU9aSg4Nik7aSg4NSkuZXh0ZW5kKHt0eXBlOiJtYXJrUG9pbnQiLHVwZGF0ZUxheW91dDpmdW5jdGlvbih0LGUsaSl7ZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe3ZhciBlPXQubWFya1BvaW50TW9kZWw7ZSYmKG4oZS5nZXREYXRhKCksdCxpKSx0aGlzLm1hcmtlckdyb3VwTWFwLmdldCh0LmlkKS51cGRhdGVMYXlvdXQoZSkpfSx0aGlzKX0scmVuZGVyU2VyaWVzOmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzPXQuY29vcmRpbmF0ZVN5c3RlbSxsPXQuaWQsdT10LmdldERhdGEoKSxoPXRoaXMubWFya2VyR3JvdXBNYXAsYz1oLmdldChsKXx8aC5zZXQobCxuZXcgbyksZD1hKHMsdCxlKTtlLnNldERhdGEoZCksbihlLmdldERhdGEoKSx0LHIpLGQuZWFjaChmdW5jdGlvbih0KXt2YXIgaT1kLmdldEl0ZW1Nb2RlbCh0KSxuPWkuZ2V0U2hhbGxvdygic3ltYm9sU2l6ZSIpOyJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1uKGUuZ2V0UmF3VmFsdWUodCksZS5nZXREYXRhUGFyYW1zKHQpKSksZC5zZXRJdGVtVmlzdWFsKHQse3N5bWJvbFNpemU6bixjb2xvcjppLmdldCgiaXRlbVN0eWxlLm5vcm1hbC5jb2xvciIpfHx1LmdldFZpc3VhbCgiY29sb3IiKSxzeW1ib2w6aS5nZXRTaGFsbG93KCJzeW1ib2wiKX0pfSksYy51cGRhdGVEYXRhKGQpLHRoaXMuZ3JvdXAuYWRkKGMuZ3JvdXApLGQuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCl7dC50cmF2ZXJzZShmdW5jdGlvbih0KXt0LmRhdGFNb2RlbD1lfSl9KSxjLl9fa2VlcD0hMCxjLmdyb3VwLnNpbGVudD1lLmdldCgic2lsZW50Iil8fHQuZ2V0KCJzaWxlbnQiKX19KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDIpLGE9aSgzKSxvPWkoOSk7bi5leHRlbmRDb21wb25lbnRNb2RlbCh7dHlwZToidGl0bGUiLGxheW91dE1vZGU6e3R5cGU6ImJveCIsaWdub3JlU2l6ZTohMH0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo2LHNob3c6ITAsdGV4dDoiIix0YXJnZXQ6ImJsYW5rIixzdWJ0ZXh0OiIiLHN1YnRhcmdldDoiYmxhbmsiLGxlZnQ6MCx0b3A6MCxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLGJvcmRlckNvbG9yOiIjY2NjIixib3JkZXJXaWR0aDowLHBhZGRpbmc6NSxpdGVtR2FwOjEwLHRleHRTdHlsZTp7Zm9udFNpemU6MTgsZm9udFdlaWdodDoiYm9sZGVyIixjb2xvcjoiIzMzMyJ9LHN1YnRleHRTdHlsZTp7Y29sb3I6IiNhYWEifX19KSxuLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6InRpdGxlIixyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciKSl7dmFyIG49dGhpcy5ncm91cCxyPXQuZ2V0TW9kZWwoInRleHRTdHlsZSIpLHM9dC5nZXRNb2RlbCgic3VidGV4dFN0eWxlIiksbD10LmdldCgidGV4dEFsaWduIiksdT10LmdldCgidGV4dEJhc2VsaW5lIiksaD1uZXcgYS5UZXh0KHtzdHlsZTphLnNldFRleHRTdHlsZSh7fSxyLHt0ZXh0OnQuZ2V0KCJ0ZXh0IiksdGV4dEZpbGw6ci5nZXRUZXh0Q29sb3IoKX0se2Rpc2FibGVCb3g6ITB9KSx6MjoxMH0pLGM9aC5nZXRCb3VuZGluZ1JlY3QoKSxkPXQuZ2V0KCJzdWJ0ZXh0IiksZj1uZXcgYS5UZXh0KHtzdHlsZTphLnNldFRleHRTdHlsZSh7fSxzLHt0ZXh0OmQsdGV4dEZpbGw6cy5nZXRUZXh0Q29sb3IoKSx5OmMuaGVpZ2h0K3QuZ2V0KCJpdGVtR2FwIiksdGV4dFZlcnRpY2FsQWxpZ246InRvcCJ9LHtkaXNhYmxlQm94OiEwfSksejI6MTB9KSxwPXQuZ2V0KCJsaW5rIiksZz10LmdldCgic3VibGluayIpO2guc2lsZW50PSFwLGYuc2lsZW50PSFnLHAmJmgub24oImNsaWNrIixmdW5jdGlvbigpe3dpbmRvdy5vcGVuKHAsIl8iK3QuZ2V0KCJ0YXJnZXQiKSl9KSxnJiZmLm9uKCJjbGljayIsZnVuY3Rpb24oKXt3aW5kb3cub3BlbihnLCJfIit0LmdldCgic3VidGFyZ2V0IikpfSksbi5hZGQoaCksZCYmbi5hZGQoZik7dmFyIG09bi5nZXRCb3VuZGluZ1JlY3QoKSx2PXQuZ2V0Qm94TGF5b3V0UGFyYW1zKCk7di53aWR0aD1tLndpZHRoLHYuaGVpZ2h0PW0uaGVpZ2h0O3ZhciB5PW8uZ2V0TGF5b3V0UmVjdCh2LHt3aWR0aDppLmdldFdpZHRoKCksaGVpZ2h0OmkuZ2V0SGVpZ2h0KCl9LHQuZ2V0KCJwYWRkaW5nIikpO2x8fChsPXQuZ2V0KCJsZWZ0Iil8fHQuZ2V0KCJyaWdodCIpLCJtaWRkbGUiPT09bCYmKGw9ImNlbnRlciIpLCJyaWdodCI9PT1sP3kueCs9eS53aWR0aDoiY2VudGVyIj09PWwmJih5LngrPXkud2lkdGgvMikpLHV8fCh1PXQuZ2V0KCJ0b3AiKXx8dC5nZXQoImJvdHRvbSIpLCJjZW50ZXIiPT09dSYmKHU9Im1pZGRsZSIpLCJib3R0b20iPT09dT95LnkrPXkuaGVpZ2h0OiJtaWRkbGUiPT09dSYmKHkueSs9eS5oZWlnaHQvMiksdT11fHwidG9wIiksbi5hdHRyKCJwb3NpdGlvbiIsW3kueCx5LnldKTt2YXIgeD17dGV4dEFsaWduOmwsdGV4dFZlcnRpY2FsQWxpZ246dX07aC5zZXRTdHlsZSh4KSxmLnNldFN0eWxlKHgpLG09bi5nZXRCb3VuZGluZ1JlY3QoKTt2YXIgXz15Lm1hcmdpbixiPXQuZ2V0SXRlbVN0eWxlKFsiY29sb3IiLCJvcGFjaXR5Il0pO2IuZmlsbD10LmdldCgiYmFja2dyb3VuZENvbG9yIik7dmFyIHc9bmV3IGEuUmVjdCh7c2hhcGU6e3g6bS54LV9bM10seTptLnktX1swXSx3aWR0aDptLndpZHRoK19bMV0rX1szXSxoZWlnaHQ6bS5oZWlnaHQrX1swXStfWzJdLHI6dC5nZXQoImJvcmRlclJhZGl1cyIpfSxzdHlsZTpiLHNpbGVudDohMH0pO2Euc3ViUGl4ZWxPcHRpbWl6ZVJlY3Qodyksbi5hZGQodyl9fX0pfSxmdW5jdGlvbih0LGUsaSl7aSgyMzMpLGkoMjM0KSxpKDIzOSksaSgyMzcpLGkoMjM1KSxpKDIzNiksaSgyMzgpfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyOSksYT1pKDEpLG89aSgyKS5leHRlbmRDb21wb25lbnRNb2RlbCh7dHlwZToidG9vbGJveCIsbGF5b3V0TW9kZTp7dHlwZToiYm94IixpZ25vcmVTaXplOiEwfSxtZXJnZURlZmF1bHRBbmRUaGVtZTpmdW5jdGlvbih0KXtvLnN1cGVyQXBwbHkodGhpcywibWVyZ2VEZWZhdWx0QW5kVGhlbWUiLGFyZ3VtZW50cyksYS5lYWNoKHRoaXMub3B0aW9uLmZlYXR1cmUsZnVuY3Rpb24odCxlKXt2YXIgaT1uLmdldChlKTtpJiZhLm1lcmdlKHQsaS5kZWZhdWx0T3B0aW9uKX0pfSxkZWZhdWx0T3B0aW9uOntzaG93OiEwLHo6Nix6bGV2ZWw6MCxvcmllbnQ6Imhvcml6b250YWwiLGxlZnQ6InJpZ2h0Iix0b3A6InRvcCIsYmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYm9yZGVyQ29sb3I6IiNjY2MiLGJvcmRlclJhZGl1czowLGJvcmRlcldpZHRoOjAscGFkZGluZzo1LGl0ZW1TaXplOjE1LGl0ZW1HYXA6OCxzaG93VGl0bGU6ITAsaWNvblN0eWxlOntub3JtYWw6e2JvcmRlckNvbG9yOiIjNjY2Iixjb2xvcjoibm9uZSJ9LGVtcGhhc2lzOntib3JkZXJDb2xvcjoiIzNFOThDNSJ9fX19KTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAwPT09dC5pbmRleE9mKCJteSIpfXZhciBhPWkoMjkpLG89aSgxKSxyPWkoMykscz1pKDExKSxsPWkoNDMpLHU9aSgxMzUpLGg9aSgxNik7dC5leHBvcnRzPWkoMikuZXh0ZW5kQ29tcG9uZW50Vmlldyh7dHlwZToidG9vbGJveCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLGMpe2Z1bmN0aW9uIGQobyxyKXt2YXIgbCx1PXlbb10saD15W3JdLGQ9bVt1XSxwPW5ldyBzKGQsdCx0LmVjTW9kZWwpO2lmKHUmJiFoKXtpZihuKHUpKWw9e21vZGVsOnAsb25jbGljazpwLm9wdGlvbi5vbmNsaWNrLGZlYXR1cmVOYW1lOnV9O2Vsc2V7dmFyIGc9YS5nZXQodSk7aWYoIWcpcmV0dXJuO2w9bmV3IGcocCxlLGkpfXZbdV09bH1lbHNle2lmKGw9dltoXSwhbClyZXR1cm47bC5tb2RlbD1wLGwuZWNNb2RlbD1lLGwuYXBpPWl9cmV0dXJuIXUmJmg/dm9pZChsLmRpc3Bvc2UmJmwuZGlzcG9zZShlLGkpKTohcC5nZXQoInNob3ciKXx8bC51bnVzYWJsZT92b2lkKGwucmVtb3ZlJiZsLnJlbW92ZShlLGkpKTooZihwLGwsdSkscC5zZXRJY29uU3RhdHVzPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb24sbj10aGlzLmljb25QYXRocztpLmljb25TdGF0dXM9aS5pY29uU3RhdHVzfHx7fSxpLmljb25TdGF0dXNbdF09ZSxuW3RdJiZuW3RdLnRyaWdnZXIoZSl9LHZvaWQobC5yZW5kZXImJmwucmVuZGVyKHAsZSxpLGMpKSl9ZnVuY3Rpb24gZihuLGEscyl7dmFyIGw9bi5nZXRNb2RlbCgiaWNvblN0eWxlIiksdT1hLmdldEljb25zP2EuZ2V0SWNvbnMoKTpuLmdldCgiaWNvbiIpLGg9bi5nZXQoInRpdGxlIil8fHt9O2lmKCJzdHJpbmciPT10eXBlb2YgdSl7dmFyIGM9dSxkPWg7dT17fSxoPXt9LHVbc109YyxoW3NdPWR9dmFyIGY9bi5pY29uUGF0aHM9e307by5lYWNoKHUsZnVuY3Rpb24ocyx1KXt2YXIgYz1yLmNyZWF0ZUljb24ocyx7fSx7eDotZy8yLHk6LWcvMix3aWR0aDpnLGhlaWdodDpnfSk7Yy5zZXRTdHlsZShsLmdldE1vZGVsKCJub3JtYWwiKS5nZXRJdGVtU3R5bGUoKSksYy5ob3ZlclN0eWxlPWwuZ2V0TW9kZWwoImVtcGhhc2lzIikuZ2V0SXRlbVN0eWxlKCksci5zZXRIb3ZlclN0eWxlKGMpLHQuZ2V0KCJzaG93VGl0bGUiKSYmKGMuX190aXRsZT1oW3VdLGMub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgdD1sLmdldE1vZGVsKCJlbXBoYXNpcyIpLmdldEl0ZW1TdHlsZSgpO2Muc2V0U3R5bGUoe3RleHQ6aFt1XSx0ZXh0UG9zaXRpb246dC50ZXh0UG9zaXRpb258fCJib3R0b20iLHRleHRGaWxsOnQuZmlsbHx8dC5zdHJva2V8fCIjMDAwIix0ZXh0QWxpZ246dC50ZXh0QWxpZ258fCJjZW50ZXIifSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7Yy5zZXRTdHlsZSh7dGV4dEZpbGw6bnVsbH0pfSkpLGMudHJpZ2dlcihuLmdldCgiaWNvblN0YXR1cy4iK3UpfHwibm9ybWFsIikscC5hZGQoYyksYy5vbigiY2xpY2siLG8uYmluZChhLm9uY2xpY2ssYSxlLGksdSkpLGZbdV09Y30pfXZhciBwPXRoaXMuZ3JvdXA7aWYocC5yZW1vdmVBbGwoKSx0LmdldCgic2hvdyIpKXt2YXIgZz0rdC5nZXQoIml0ZW1TaXplIiksbT10LmdldCgiZmVhdHVyZSIpfHx7fSx2PXRoaXMuX2ZlYXR1cmVzfHwodGhpcy5fZmVhdHVyZXM9e30pLHk9W107by5lYWNoKG0sZnVuY3Rpb24odCxlKXt5LnB1c2goZSl9KSxuZXcgbCh0aGlzLl9mZWF0dXJlTmFtZXN8fFtdLHkpLmFkZChkKS51cGRhdGUoZCkucmVtb3ZlKG8uY3VycnkoZCxudWxsKSkuZXhlY3V0ZSgpLHRoaXMuX2ZlYXR1cmVOYW1lcz15LHUubGF5b3V0KHAsdCxpKSxwLmFkZCh1Lm1ha2VCYWNrZ3JvdW5kKHAuZ2V0Qm91bmRpbmdSZWN0KCksdCkpLHAuZWFjaENoaWxkKGZ1bmN0aW9uKHQpe3ZhciBlPXQuX190aXRsZSxuPXQuaG92ZXJTdHlsZTtpZihuJiZlKXt2YXIgYT1oLmdldEJvdW5kaW5nUmVjdChlLGgubWFrZUZvbnQobikpLG89dC5wb3NpdGlvblswXStwLnBvc2l0aW9uWzBdLHI9dC5wb3NpdGlvblsxXStwLnBvc2l0aW9uWzFdK2cscz0hMTtyK2EuaGVpZ2h0PmkuZ2V0SGVpZ2h0KCkmJihuLnRleHRQb3NpdGlvbj0idG9wIixzPSEwKTt2YXIgbD1zPy01LWEuaGVpZ2h0OmcrODtvK2Eud2lkdGgvMj5pLmdldFdpZHRoKCk/KG4udGV4dFBvc2l0aW9uPVsiMTAwJSIsbF0sbi50ZXh0QWxpZ249InJpZ2h0Iik6by1hLndpZHRoLzI8MCYmKG4udGV4dFBvc2l0aW9uPVswLGxdLG4udGV4dEFsaWduPSJsZWZ0Iil9fSl9fSx1cGRhdGVWaWV3OmZ1bmN0aW9uKHQsZSxpLG4pe28uZWFjaCh0aGlzLl9mZWF0dXJlcyxmdW5jdGlvbih0KXt0LnVwZGF0ZVZpZXcmJnQudXBkYXRlVmlldyh0Lm1vZGVsLGUsaSxuKX0pfSx1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCxlLGksbil7by5lYWNoKHRoaXMuX2ZlYXR1cmVzLGZ1bmN0aW9uKHQpe3QudXBkYXRlTGF5b3V0JiZ0LnVwZGF0ZUxheW91dCh0Lm1vZGVsLGUsaSxuKX0pfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXtvLmVhY2godGhpcy5fZmVhdHVyZXMsZnVuY3Rpb24oaSl7aS5yZW1vdmUmJmkucmVtb3ZlKHQsZSl9KSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxkaXNwb3NlOmZ1bmN0aW9uKHQsZSl7by5lYWNoKHRoaXMuX2ZlYXR1cmVzLGZ1bmN0aW9uKGkpe2kuZGlzcG9zZSYmaS5kaXNwb3NlKHQsZSl9KX19KX0pLmNhbGwoZSxpKDE5NCkpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt2YXIgZT17fSxpPVtdLG49W107cmV0dXJuIHQuZWFjaFJhd1NlcmllcyhmdW5jdGlvbih0KXt2YXIgYT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoIWF8fCJjYXJ0ZXNpYW4yZCIhPT1hLnR5cGUmJiJwb2xhciIhPT1hLnR5cGUpaS5wdXNoKHQpO2Vsc2V7dmFyIG89YS5nZXRCYXNlQXhpcygpO2lmKCJjYXRlZ29yeSI9PT1vLnR5cGUpe3ZhciByPW8uZGltKyJfIitvLmluZGV4O2Vbcl18fChlW3JdPXtjYXRlZ29yeUF4aXM6byx2YWx1ZUF4aXM6YS5nZXRPdGhlckF4aXMobyksc2VyaWVzOltdfSxuLnB1c2goe2F4aXNEaW06by5kaW0sYXhpc0luZGV4Om8uaW5kZXh9KSksZVtyXS5zZXJpZXMucHVzaCh0KX1lbHNlIGkucHVzaCh0KX19KSx7c2VyaWVzR3JvdXBCeUNhdGVnb3J5QXhpczplLG90aGVyOmksbWV0YTpufX1mdW5jdGlvbiBhKHQpe3ZhciBlPVtdO3JldHVybiBwLmVhY2godCxmdW5jdGlvbih0LGkpe3ZhciBuPXQuY2F0ZWdvcnlBeGlzLGE9dC52YWx1ZUF4aXMsbz1hLmRpbSxyPVsiICJdLmNvbmNhdChwLm1hcCh0LnNlcmllcyxmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lfSkpLHM9W24ubW9kZWwuZ2V0Q2F0ZWdvcmllcygpXTtwLmVhY2godC5zZXJpZXMsZnVuY3Rpb24odCl7cy5wdXNoKHQuZ2V0UmF3RGF0YSgpLm1hcEFycmF5KG8sZnVuY3Rpb24odCl7cmV0dXJuIHR9KSl9KTtmb3IodmFyIGw9W3Iuam9pbih5KV0sdT0wO3U8c1swXS5sZW5ndGg7dSsrKXtmb3IodmFyIGg9W10sYz0wO2M8cy5sZW5ndGg7YysrKWgucHVzaChzW2NdW3VdKTtsLnB1c2goaC5qb2luKHkpKX1lLnB1c2gobC5qb2luKCJcbiIpKX0pLGUuam9pbigiXG5cbiIrdisiXG5cbiIpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHAubWFwKHQsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRSYXdEYXRhKCksaT1bdC5uYW1lXSxuPVtdOwpyZXR1cm4gZS5lYWNoKGUuZGltZW5zaW9ucyxmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGE9YXJndW1lbnRzW3QtMV0sbz1lLmdldE5hbWUoYSkscj0wO3I8dC0xO3IrKyluW3JdPWFyZ3VtZW50c1tyXTtpLnB1c2goKG8/byt5OiIiKStuLmpvaW4oeSkpfSksaS5qb2luKCJcbiIpfSkuam9pbigiXG5cbiIrdisiXG5cbiIpfWZ1bmN0aW9uIHIodCl7dmFyIGU9bih0KTtyZXR1cm57dmFsdWU6cC5maWx0ZXIoW2EoZS5zZXJpZXNHcm91cEJ5Q2F0ZWdvcnlBeGlzKSxvKGUub3RoZXIpXSxmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXG5cdFxzXS9nLCIiKX0pLmpvaW4oIlxuXG4iK3YrIlxuXG4iKSxtZXRhOmUubWV0YX19ZnVuY3Rpb24gcyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9eXHNccyovLCIiKS5yZXBsYWNlKC9cc1xzKiQvLCIiKX1mdW5jdGlvbiBsKHQpe3ZhciBlPXQuc2xpY2UoMCx0LmluZGV4T2YoIlxuIikpO2lmKGUuaW5kZXhPZih5KT49MClyZXR1cm4hMH1mdW5jdGlvbiB1KHQpe2Zvcih2YXIgZT10LnNwbGl0KC9cbisvZyksaT1zKGUuc2hpZnQoKSkuc3BsaXQoeCksbj1bXSxhPXAubWFwKGksZnVuY3Rpb24odCl7cmV0dXJue25hbWU6dCxkYXRhOltdfX0pLG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIHI9cyhlW29dKS5zcGxpdCh4KTtuLnB1c2goci5zaGlmdCgpKTtmb3IodmFyIGw9MDtsPHIubGVuZ3RoO2wrKylhW2xdJiYoYVtsXS5kYXRhW29dPXJbbF0pfXJldHVybntzZXJpZXM6YSxjYXRlZ29yaWVzOm59fWZ1bmN0aW9uIGgodCl7Zm9yKHZhciBlPXQuc3BsaXQoL1xuKy9nKSxpPXMoZS5zaGlmdCgpKSxuPVtdLGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIG8scj1zKGVbYV0pLnNwbGl0KHgpLGw9IiIsdT0hMTtpc05hTihyWzBdKT8odT0hMCxsPXJbMF0scj1yLnNsaWNlKDEpLG5bYV09e25hbWU6bCx2YWx1ZTpbXX0sbz1uW2FdLnZhbHVlKTpvPW5bYV09W107Zm9yKHZhciBoPTA7aDxyLmxlbmd0aDtoKyspby5wdXNoKCtyW2hdKTsxPT09by5sZW5ndGgmJih1P25bYV0udmFsdWU9b1swXTpuW2FdPW9bMF0pfXJldHVybntuYW1lOmksZGF0YTpufX1mdW5jdGlvbiBjKHQsZSl7dmFyIGk9dC5zcGxpdChuZXcgUmVnRXhwKCJcbioiK3YrIlxuKiIsImciKSksbj17c2VyaWVzOltdfTtyZXR1cm4gcC5lYWNoKGksZnVuY3Rpb24odCxpKXtpZihsKHQpKXt2YXIgYT11KHQpLG89ZVtpXSxyPW8uYXhpc0RpbSsiQXhpcyI7byYmKG5bcl09bltyXXx8W10sbltyXVtvLmF4aXNJbmRleF09e2RhdGE6YS5jYXRlZ29yaWVzfSxuLnNlcmllcz1uLnNlcmllcy5jb25jYXQoYS5zZXJpZXMpKX1lbHNle3ZhciBhPWgodCk7bi5zZXJpZXMucHVzaChhKX19KSxufWZ1bmN0aW9uIGQodCl7dGhpcy5fZG9tPW51bGwsdGhpcy5tb2RlbD10fWZ1bmN0aW9uIGYodCxlKXtyZXR1cm4gcC5tYXAodCxmdW5jdGlvbih0LGkpe3ZhciBuPWUmJmVbaV07cmV0dXJuIHAuaXNPYmplY3QobikmJiFwLmlzQXJyYXkobik/KHAuaXNPYmplY3QodCkmJiFwLmlzQXJyYXkodCkmJih0PXQudmFsdWUpLHAuZGVmYXVsdHMoe3ZhbHVlOnR9LG4pKTp0fSl9dmFyIHA9aSgxKSxnPWkoMjEpLG09aSg0NCkudG9vbGJveC5kYXRhVmlldyx2PW5ldyBBcnJheSg2MCkuam9pbigiLSIpLHk9Ilx0Iix4PW5ldyBSZWdFeHAoIlsiK3krIl0rIiwiZyIpO2QuZGVmYXVsdE9wdGlvbj17c2hvdzohMCxyZWFkT25seTohMSxvcHRpb25Ub0NvbnRlbnQ6bnVsbCxjb250ZW50VG9PcHRpb246bnVsbCxpY29uOiJNMTcuNSwxNy4zSDMzIE0xNy41LDE3LjNIMzMgTTQ1LjQsMjkuNWgtMjggTTExLjUsMnY1Nkg1MVYxNC44TDM4LjQsMkgxMS41eiBNMzguNCwyLjJ2MTIuN0g1MSBNNDUuNCw0MS43aC0yOCIsdGl0bGU6cC5jbG9uZShtLnRpdGxlKSxsYW5nOnAuY2xvbmUobS5sYW5nKSxiYWNrZ3JvdW5kQ29sb3I6IiNmZmYiLHRleHRDb2xvcjoiIzAwMCIsdGV4dGFyZWFDb2xvcjoiI2ZmZiIsdGV4dGFyZWFCb3JkZXJDb2xvcjoiIzMzMyIsYnV0dG9uQ29sb3I6IiNjMjM1MzEiLGJ1dHRvblRleHRDb2xvcjoiI2ZmZiJ9LGQucHJvdG90eXBlLm9uY2xpY2s9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKCl7bi5yZW1vdmVDaGlsZChvKSxNLl9kb209bnVsbH12YXIgbj1lLmdldERvbSgpLGE9dGhpcy5tb2RlbDt0aGlzLl9kb20mJm4ucmVtb3ZlQ2hpbGQodGhpcy5fZG9tKTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6NXB4O3RvcDo1cHg7Ym90dG9tOjVweDtyaWdodDo1cHg7IixvLnN0eWxlLmJhY2tncm91bmRDb2xvcj1hLmdldCgiYmFja2dyb3VuZENvbG9yIil8fCIjZmZmIjt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoNCIpLGw9YS5nZXQoImxhbmciKXx8W107cy5pbm5lckhUTUw9bFswXXx8YS5nZXQoInRpdGxlIikscy5zdHlsZS5jc3NUZXh0PSJtYXJnaW46IDEwcHggMjBweDsiLHMuc3R5bGUuY29sb3I9YS5nZXQoInRleHRDb2xvciIpO3ZhciB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTt1LnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvOyI7dmFyIGQ9YS5nZXQoIm9wdGlvblRvQ29udGVudCIpLGY9YS5nZXQoImNvbnRlbnRUb09wdGlvbiIpLG09cih0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZCl7dmFyIHY9ZChlLmdldE9wdGlvbigpKTsic3RyaW5nIj09dHlwZW9mIHY/dS5pbm5lckhUTUw9djpwLmlzRG9tKHYpJiZ1LmFwcGVuZENoaWxkKHYpfWVsc2UgdS5hcHBlbmRDaGlsZChoKSxoLnJlYWRPbmx5PWEuZ2V0KCJyZWFkT25seSIpLGguc3R5bGUuY3NzVGV4dD0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42cmVtOyIsaC5zdHlsZS5jb2xvcj1hLmdldCgidGV4dENvbG9yIiksaC5zdHlsZS5ib3JkZXJDb2xvcj1hLmdldCgidGV4dGFyZWFCb3JkZXJDb2xvciIpLGguc3R5bGUuYmFja2dyb3VuZENvbG9yPWEuZ2V0KCJ0ZXh0YXJlYUNvbG9yIiksaC52YWx1ZT1tLnZhbHVlO3ZhciB4PW0ubWV0YSxfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO18uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7Ijt2YXIgYj0iZmxvYXQ6cmlnaHQ7bWFyZ2luLXJpZ2h0OjIwcHg7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzoycHggNXB4O2ZvbnQtc2l6ZToxMnB4O2JvcmRlci1yYWRpdXM6M3B4Iix3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yis9IjtiYWNrZ3JvdW5kLWNvbG9yOiIrYS5nZXQoImJ1dHRvbkNvbG9yIiksYis9Ijtjb2xvcjoiK2EuZ2V0KCJidXR0b25UZXh0Q29sb3IiKTt2YXIgTT10aGlzO2cuYWRkRXZlbnRMaXN0ZW5lcih3LCJjbGljayIsaSksZy5hZGRFdmVudExpc3RlbmVyKFMsImNsaWNrIixmdW5jdGlvbigpe3ZhciB0O3RyeXt0PSJmdW5jdGlvbiI9PXR5cGVvZiBmP2YodSxlLmdldE9wdGlvbigpKTpjKGgudmFsdWUseCl9Y2F0Y2godCl7dGhyb3cgaSgpLG5ldyBFcnJvcigiRGF0YSB2aWV3IGZvcm1hdCBlcnJvciAiK3QpfXQmJmUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImNoYW5nZURhdGFWaWV3IixuZXdPcHRpb246dH0pLGkoKX0pLHcuaW5uZXJIVE1MPWxbMV0sUy5pbm5lckhUTUw9bFsyXSxTLnN0eWxlLmNzc1RleHQ9Yix3LnN0eWxlLmNzc1RleHQ9YiwhYS5nZXQoInJlYWRPbmx5IikmJl8uYXBwZW5kQ2hpbGQoUyksXy5hcHBlbmRDaGlsZCh3KSxnLmFkZEV2ZW50TGlzdGVuZXIoaCwia2V5ZG93biIsZnVuY3Rpb24odCl7aWYoOT09PSh0LmtleUNvZGV8fHQud2hpY2gpKXt2YXIgZT10aGlzLnZhbHVlLGk9dGhpcy5zZWxlY3Rpb25TdGFydCxuPXRoaXMuc2VsZWN0aW9uRW5kO3RoaXMudmFsdWU9ZS5zdWJzdHJpbmcoMCxpKSt5K2Uuc3Vic3RyaW5nKG4pLHRoaXMuc2VsZWN0aW9uU3RhcnQ9dGhpcy5zZWxlY3Rpb25FbmQ9aSsxLGcuc3RvcCh0KX19KSxvLmFwcGVuZENoaWxkKHMpLG8uYXBwZW5kQ2hpbGQodSksby5hcHBlbmRDaGlsZChfKSx1LnN0eWxlLmhlaWdodD1uLmNsaWVudEhlaWdodC04MCsicHgiLG4uYXBwZW5kQ2hpbGQobyksdGhpcy5fZG9tPW99LGQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RvbSYmZS5nZXREb20oKS5yZW1vdmVDaGlsZCh0aGlzLl9kb20pfSxkLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKHQsZSl7dGhpcy5yZW1vdmUodCxlKX0saSgyOSkucmVnaXN0ZXIoImRhdGFWaWV3IixkKSxpKDIpLnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJjaGFuZ2VEYXRhVmlldyIsZXZlbnQ6ImRhdGFWaWV3Q2hhbmdlZCIsdXBkYXRlOiJwcmVwYXJlQW5kVXBkYXRlIn0sZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtwLmVhY2godC5uZXdPcHRpb24uc2VyaWVzLGZ1bmN0aW9uKHQpe3ZhciBuPWUuZ2V0U2VyaWVzQnlOYW1lKHQubmFtZSlbMF07aWYobil7dmFyIGE9bi5nZXQoImRhdGEiKTtpLnB1c2goe25hbWU6dC5uYW1lLGRhdGE6Zih0LmRhdGEsYSl9KX1lbHNlIGkucHVzaChwLmV4dGVuZCh7dHlwZToic2NhdHRlciJ9LHQpKX0pLGUubWVyZ2VPcHRpb24ocC5kZWZhdWx0cyh7c2VyaWVzOml9LHQubmV3T3B0aW9uKSl9KSx0LmV4cG9ydHM9ZH0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpKXsodGhpcy5fYnJ1c2hDb250cm9sbGVyPW5ldyBsKGkuZ2V0WnIoKSkpLm9uKCJicnVzaCIscy5iaW5kKHRoaXMuX29uQnJ1c2gsdGhpcykpLm1vdW50KCksdGhpcy5faXNab29tQWN0aXZlfWZ1bmN0aW9uIGEodCl7dmFyIGU9e307cmV0dXJuIHMuZWFjaChbInhBeGlzSW5kZXgiLCJ5QXhpc0luZGV4Il0sZnVuY3Rpb24oaSl7ZVtpXT10W2ldLG51bGw9PWVbaV0mJihlW2ldPSJhbGwiKSwoZVtpXT09PSExfHwibm9uZSI9PT1lW2ldKSYmKGVbaV09W10pfSksZX1mdW5jdGlvbiBvKHQsZSl7dC5zZXRJY29uU3RhdHVzKCJiYWNrIixoLmNvdW50KGUpPjE/ImVtcGhhc2lzIjoibm9ybWFsIil9ZnVuY3Rpb24gcih0LGUsaSxuLG8pe3ZhciByPWkuX2lzWm9vbUFjdGl2ZTtuJiYidGFrZUdsb2JhbEN1cnNvciI9PT1uLnR5cGUmJihyPSJkYXRhWm9vbVNlbGVjdCI9PT1uLmtleSYmbi5kYXRhWm9vbVNlbGVjdEFjdGl2ZSksaS5faXNab29tQWN0aXZlPXIsdC5zZXRJY29uU3RhdHVzKCJ6b29tIixyPyJlbXBoYXNpcyI6Im5vcm1hbCIpO3ZhciBzPW5ldyB1KGEodC5vcHRpb24pLGUse2luY2x1ZGU6WyJncmlkIl19KTtpLl9icnVzaENvbnRyb2xsZXIuc2V0UGFuZWxzKHMubWFrZVBhbmVsT3B0cyhvLGZ1bmN0aW9uKHQpe3JldHVybiB0LnhBeGlzRGVjbGFyZWQmJiF0LnlBeGlzRGVjbGFyZWQ/ImxpbmVYIjohdC54QXhpc0RlY2xhcmVkJiZ0LnlBeGlzRGVjbGFyZWQ/ImxpbmVZIjoicmVjdCJ9KSkuZW5hYmxlQnJ1c2goISFyJiZ7YnJ1c2hUeXBlOiJhdXRvIixicnVzaFN0eWxlOntsaW5lV2lkdGg6MCxmaWxsOiJyZ2JhKDAsMCwwLDAuMikifX0pfXZhciBzPWkoMSksbD1pKDEzMiksdT1pKDE5MCksaD1pKDEzMCksYz1pKDU5KSxkPWkoNDQpLnRvb2xib3guZGF0YVpvb20sZj1zLmVhY2g7aSgyMTIpO3ZhciBwPSJcMF9lY19cMHRvb2xib3gtZGF0YVpvb21fIjtuLmRlZmF1bHRPcHRpb249e3Nob3c6ITAsaWNvbjp7em9vbToiTTAsMTMuNWgyNi45IE0xMy41LDI2LjlWMCBNMzIuMSwxMy41SDU4VjU4SDEzLjUgVjMyLjEiLGJhY2s6Ik0yMiwxLjRMOS45LDEzLjVsMTIuMywxMi4zIE0xMC4zLDEzLjVINTQuOXY0NC42IEgxMC4zdi0yNiJ9LHRpdGxlOnMuY2xvbmUoZC50aXRsZSl9O3ZhciBnPW4ucHJvdG90eXBlO2cucmVuZGVyPWZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMubW9kZWw9dCx0aGlzLmVjTW9kZWw9ZSx0aGlzLmFwaT1pLHIodCxlLHRoaXMsbixpKSxvKHQsZSl9LGcub25jbGljaz1mdW5jdGlvbih0LGUsaSl7bVtpXS5jYWxsKHRoaXMpfSxnLnJlbW92ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2JydXNoQ29udHJvbGxlci51bm1vdW50KCl9LGcuZGlzcG9zZT1mdW5jdGlvbih0LGUpe3RoaXMuX2JydXNoQ29udHJvbGxlci5kaXNwb3NlKCl9O3ZhciBtPXt6b29tOmZ1bmN0aW9uKCl7dmFyIHQ9IXRoaXMuX2lzWm9vbUFjdGl2ZTt0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToidGFrZUdsb2JhbEN1cnNvciIsa2V5OiJkYXRhWm9vbVNlbGVjdCIsZGF0YVpvb21TZWxlY3RBY3RpdmU6dH0pfSxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5fZGlzcGF0Y2hab29tQWN0aW9uKGgucG9wKHRoaXMuZWNNb2RlbCkpfX07Zy5fb25CcnVzaD1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlLGkpe3ZhciBhPWUuZ2V0QXhpcyh0KSxzPWEubW9kZWwsbD1uKHQscyxyKSx1PWwuZmluZFJlcHJlc2VudGF0aXZlQXhpc1Byb3h5KHMpLmdldE1pbk1heFNwYW4oKTtudWxsPT11Lm1pblZhbHVlU3BhbiYmbnVsbD09dS5tYXhWYWx1ZVNwYW58fChpPWMoMCxpLnNsaWNlKCksYS5zY2FsZS5nZXRFeHRlbnQoKSwwLHUubWluVmFsdWVTcGFuLHUubWF4VmFsdWVTcGFuKSksbCYmKG9bbC5pZF09e2RhdGFab29tSWQ6bC5pZCxzdGFydFZhbHVlOmlbMF0sZW5kVmFsdWU6aVsxXX0pfWZ1bmN0aW9uIG4odCxlLGkpe3ZhciBuO3JldHVybiBpLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJkYXRhWm9vbSIsc3ViVHlwZToic2VsZWN0In0sZnVuY3Rpb24oaSl7dmFyIGE9aS5nZXRBeGlzTW9kZWwodCxlLmNvbXBvbmVudEluZGV4KTthJiYobj1pKX0pLG59aWYoZS5pc0VuZCYmdC5sZW5ndGgpe3ZhciBvPXt9LHI9dGhpcy5lY01vZGVsO3RoaXMuX2JydXNoQ29udHJvbGxlci51cGRhdGVDb3ZlcnMoW10pO3ZhciBzPW5ldyB1KGEodGhpcy5tb2RlbC5vcHRpb24pLHIse2luY2x1ZGU6WyJncmlkIl19KTtzLm1hdGNoT3V0cHV0UmFuZ2VzKHQscixmdW5jdGlvbih0LGUsbil7aWYoImNhcnRlc2lhbjJkIj09PW4udHlwZSl7dmFyIGE9dC5icnVzaFR5cGU7InJlY3QiPT09YT8oaSgieCIsbixlWzBdKSxpKCJ5IixuLGVbMV0pKTppKHtsaW5lWDoieCIsbGluZVk6InkifVthXSxuLGUpfX0pLGgucHVzaChyLG8pLHRoaXMuX2Rpc3BhdGNoWm9vbUFjdGlvbihvKX19LGcuX2Rpc3BhdGNoWm9vbUFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1bXTtmKHQsZnVuY3Rpb24odCxpKXtlLnB1c2gocy5jbG9uZSh0KSl9KSxlLmxlbmd0aCYmdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImRhdGFab29tIixmcm9tOnRoaXMudWlkLGJhdGNoOmV9KX0saSgyOSkucmVnaXN0ZXIoImRhdGFab29tIixuKSxpKDIpLnJlZ2lzdGVyUHJlcHJvY2Vzc29yKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtpZihlKXt2YXIgYT10KyJJbmRleCIsbz1lW2FdO251bGw9PW98fCJhbGwiPT1vfHxzLmlzQXJyYXkobyl8fChvPW89PT0hMXx8Im5vbmUiPT09bz9bXTpbb10pLGkodCxmdW5jdGlvbihlLGkpe2lmKG51bGw9PW98fCJhbGwiPT1vfHxzLmluZGV4T2YobyxpKSE9PS0xKXt2YXIgcj17dHlwZToic2VsZWN0IiwkZnJvbVRvb2xib3g6ITAsaWQ6cCt0K2l9O3JbYV09aSxuLnB1c2gocil9fSl9fWZ1bmN0aW9uIGkoZSxpKXt2YXIgbj10W2VdO3MuaXNBcnJheShuKXx8KG49bj9bbl06W10pLGYobixpKX1pZih0KXt2YXIgbj10LmRhdGFab29tfHwodC5kYXRhWm9vbT1bXSk7cy5pc0FycmF5KG4pfHwodC5kYXRhWm9vbT1uPVtuXSk7dmFyIGE9dC50b29sYm94O2lmKGEmJihzLmlzQXJyYXkoYSkmJihhPWFbMF0pLGEmJmEuZmVhdHVyZSkpe3ZhciBvPWEuZmVhdHVyZS5kYXRhWm9vbTtlKCJ4QXhpcyIsbyksZSgieUF4aXMiLG8pfX19KSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3RoaXMubW9kZWw9dH12YXIgYT1pKDEpLG89aSg0NCkudG9vbGJveC5tYWdpY1R5cGU7bi5kZWZhdWx0T3B0aW9uPXtzaG93OiEwLHR5cGU6W10saWNvbjp7bGluZToiTTQuMSwyOC45aDcuMWw5LjMtMjJsNy40LDM4bDkuNy0xOS43bDMsMTIuOGgxNC45TTQuMSw1OGg1MS40IixiYXI6Ik02LjcsMjIuOWgxMFY0OGgtMTBWMjIuOXpNMjQuOSwxM2gxMHYzNWgtMTBWMTN6TTQzLjIsMmgxMHY0NmgtMTBWMnpNMy4xLDU4aDUzLjciLHN0YWNrOiJNOC4yLDM4LjRsLTguNCw0LjFsMzAuNiwxNS4zTDYwLDQyLjVsLTguMS00LjFsLTIxLjUsMTFMOC4yLDM4LjR6IE01MS45LDMwbC04LjEsNC4ybC0xMy40LDYuOWwtMTMuOS02LjlMOC4yLDMwbC04LjQsNC4ybDguNCw0LjJsMjIuMiwxMWwyMS41LTExbDguMS00LjJMNTEuOSwzMHogTTUxLjksMjEuN2wtOC4xLDQuMkwzNS43LDMwbC01LjMsMi44TDI0LjksMzBsLTguNC00LjFsLTguMy00LjJsLTguNCw0LjJMOC4yLDMwbDguMyw0LjJsMTMuOSw2LjlsMTMuNC02LjlsOC4xLTQuMmw4LjEtNC4xTDUxLjksMjEuN3pNMzAuNCwyLjJMLTAuMiwxNy41bDguNCw0LjFsOC4zLDQuMmw4LjQsNC4ybDUuNSwyLjdsNS4zLTIuN2w4LjEtNC4ybDguMS00LjJsOC4xLTQuMUwzMC40LDIuMnoiLHRpbGVkOiJNMi4zLDIuMmgyMi44VjI1SDIuM1YyLjJ6IE0zNSwyLjJoMjIuOFYyNUgzNVYyLjJ6TTIuMywzNWgyMi44djIyLjhIMi4zVjM1eiBNMzUsMzVoMjIuOHYyMi44SDM1VjM1eiJ9LHRpdGxlOmEuY2xvbmUoby50aXRsZSksb3B0aW9uOnt9LHNlcmllc0luZGV4Ont9fTt2YXIgcj1uLnByb3RvdHlwZTtyLmdldEljb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbCxlPXQuZ2V0KCJpY29uIiksaT17fTtyZXR1cm4gYS5lYWNoKHQuZ2V0KCJ0eXBlIiksZnVuY3Rpb24odCl7ZVt0XSYmKGlbdF09ZVt0XSl9KSxpfTt2YXIgcz17bGluZTpmdW5jdGlvbih0LGUsaSxuKXtpZigiYmFyIj09PXQpcmV0dXJuIGEubWVyZ2Uoe2lkOmUsdHlwZToibGluZSIsZGF0YTppLmdldCgiZGF0YSIpLHN0YWNrOmkuZ2V0KCJzdGFjayIpLG1hcmtQb2ludDppLmdldCgibWFya1BvaW50IiksbWFya0xpbmU6aS5nZXQoIm1hcmtMaW5lIil9LG4uZ2V0KCJvcHRpb24ubGluZSIpfHx7fSwhMCl9LGJhcjpmdW5jdGlvbih0LGUsaSxuKXtpZigibGluZSI9PT10KXJldHVybiBhLm1lcmdlKHtpZDplLHR5cGU6ImJhciIsZGF0YTppLmdldCgiZGF0YSIpLHN0YWNrOmkuZ2V0KCJzdGFjayIpLG1hcmtQb2ludDppLmdldCgibWFya1BvaW50IiksbWFya0xpbmU6aS5nZXQoIm1hcmtMaW5lIil9LG4uZ2V0KCJvcHRpb24uYmFyIil8fHt9LCEwKX0sc3RhY2s6ZnVuY3Rpb24odCxlLGksbil7aWYoImxpbmUiPT09dHx8ImJhciI9PT10KXJldHVybiBhLm1lcmdlKHtpZDplLHN0YWNrOiJfX2VjX21hZ2ljVHlwZV9zdGFja19fIn0sbi5nZXQoIm9wdGlvbi5zdGFjayIpfHx7fSwhMCl9LHRpbGVkOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKCJsaW5lIj09PXR8fCJiYXIiPT09dClyZXR1cm4gYS5tZXJnZSh7aWQ6ZSxzdGFjazoiIn0sbi5nZXQoIm9wdGlvbi50aWxlZCIpfHx7fSwhMCl9fSxsPVtbImxpbmUiLCJiYXIiXSxbInN0YWNrIiwidGlsZWQiXV07ci5vbmNsaWNrPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLm1vZGVsLG89bi5nZXQoInNlcmllc0luZGV4LiIraSk7aWYoc1tpXSl7dmFyIHI9e3NlcmllczpbXX0sdT1mdW5jdGlvbihlKXt2YXIgbz1lLnN1YlR5cGUsbD1lLmlkLHU9c1tpXShvLGwsZSxuKTt1JiYoYS5kZWZhdWx0cyh1LGUub3B0aW9uKSxyLnNlcmllcy5wdXNoKHUpKTt2YXIgaD1lLmNvb3JkaW5hdGVTeXN0ZW07aWYoaCYmImNhcnRlc2lhbjJkIj09PWgudHlwZSYmKCJsaW5lIj09PWl8fCJiYXIiPT09aSkpe3ZhciBjPWguZ2V0QXhlc0J5U2NhbGUoIm9yZGluYWwiKVswXTtpZihjKXt2YXIgZD1jLmRpbSxmPWQrIkF4aXMiLHA9dC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOmYsaW5kZXg6ZS5nZXQobmFtZSsiSW5kZXgiKSxpZDplLmdldChuYW1lKyJJZCIpfSlbMF0sZz1wLmNvbXBvbmVudEluZGV4O3JbZl09cltmXXx8W107Zm9yKHZhciBtPTA7bTw9ZzttKyspcltmXVtnXT1yW2ZdW2ddfHx7fTtyW2ZdW2ddLmJvdW5kYXJ5R2FwPSJiYXIiPT09aX19fTthLmVhY2gobCxmdW5jdGlvbih0KXthLmluZGV4T2YodCxpKT49MCYmYS5lYWNoKHQsZnVuY3Rpb24odCl7bi5zZXRJY29uU3RhdHVzKHQsIm5vcm1hbCIpfSl9KSxuLnNldEljb25TdGF0dXMoaSwiZW1waGFzaXMiKSx0LmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHF1ZXJ5Om51bGw9PW8/bnVsbDp7c2VyaWVzSW5kZXg6b319LHUpLGUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImNoYW5nZU1hZ2ljVHlwZSIsY3VycmVudFR5cGU6aSxuZXdPcHRpb246cn0pfX07dmFyIHU9aSgyKTt1LnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJjaGFuZ2VNYWdpY1R5cGUiLGV2ZW50OiJtYWdpY1R5cGVDaGFuZ2VkIix1cGRhdGU6InByZXBhcmVBbmRVcGRhdGUifSxmdW5jdGlvbih0LGUpe2UubWVyZ2VPcHRpb24odC5uZXdPcHRpb24pfSksaSgyOSkucmVnaXN0ZXIoIm1hZ2ljVHlwZSIsbiksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLm1vZGVsPXR9dmFyIGE9aSgxMzApLG89aSg0NCkudG9vbGJveC5yZXN0b3JlO24uZGVmYXVsdE9wdGlvbj17c2hvdzohMCxpY29uOiJNMy44LDMzLjQgTTQ3LDE4LjloOS44VjguNyBNNTYuMywyMC4xIEM1Mi4xLDksNDAuNSwwLjYsMjYuOCwyLjFDMTIuNiwzLjcsMS42LDE2LjIsMi4xLDMwLjYgTTEzLDQxLjFIMy4xdjEwLjIgTTMuNywzOS45YzQuMiwxMS4xLDE1LjgsMTkuNSwyOS41LDE4IGMxNC4yLTEuNiwyNS4yLTE0LjEsMjQuNy0yOC41Iix0aXRsZTpvLnRpdGxlfTt2YXIgcj1uLnByb3RvdHlwZTtyLm9uY2xpY2s9ZnVuY3Rpb24odCxlLGkpe2EuY2xlYXIodCksZS5kaXNwYXRjaEFjdGlvbih7dHlwZToicmVzdG9yZSIsZnJvbTp0aGlzLnVpZH0pfSxpKDI5KS5yZWdpc3RlcigicmVzdG9yZSIsbiksaSgyKS5yZWdpc3RlckFjdGlvbih7dHlwZToicmVzdG9yZSIsZXZlbnQ6InJlc3RvcmUiLHVwZGF0ZToicHJlcGFyZUFuZFVwZGF0ZSJ9LGZ1bmN0aW9uKHQsZSl7ZS5yZXNldE9wdGlvbigicmVjcmVhdGUiKX0pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt0aGlzLm1vZGVsPXR9dmFyIGE9aSgxMCksbz1pKDQ0KS50b29sYm94LnNhdmVBc0ltYWdlO24uZGVmYXVsdE9wdGlvbj17c2hvdzohMCxpY29uOiJNNC43LDIyLjlMMjkuMyw0NS41TDU0LjcsMjMuNE00LjYsNDMuNkw0LjYsNThMNTMuOCw1OEw1My44LDQzLjZNMjkuMiw0NS4xTDI5LjIsMCIsdGl0bGU6by50aXRsZSx0eXBlOiJwbmciLG5hbWU6IiIsZXhjbHVkZUNvbXBvbmVudHM6WyJ0b29sYm94Il0scGl4ZWxSYXRpbzoxLGxhbmc6by5sYW5nLnNsaWNlKCl9LG4ucHJvdG90eXBlLnVudXNhYmxlPSFhLmNhbnZhc1N1cHBvcnRlZDt2YXIgcj1uLnByb3RvdHlwZTtyLm9uY2xpY2s9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm1vZGVsLG49aS5nZXQoIm5hbWUiKXx8dC5nZXQoInRpdGxlLjAudGV4dCIpfHwiZWNoYXJ0cyIsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikscj1pLmdldCgidHlwZSIsITApfHwicG5nIjtvLmRvd25sb2FkPW4rIi4iK3Isby50YXJnZXQ9Il9ibGFuayI7dmFyIHM9ZS5nZXRDb25uZWN0ZWREYXRhVVJMKHt0eXBlOnIsYmFja2dyb3VuZENvbG9yOmkuZ2V0KCJiYWNrZ3JvdW5kQ29sb3IiLCEwKXx8dC5nZXQoImJhY2tncm91bmRDb2xvciIpfHwiI2ZmZiIsZXhjbHVkZUNvbXBvbmVudHM6aS5nZXQoImV4Y2x1ZGVDb21wb25lbnRzIikscGl4ZWxSYXRpbzppLmdldCgicGl4ZWxSYXRpbyIpfSk7aWYoby5ocmVmPXMsImZ1bmN0aW9uIiE9dHlwZW9mIE1vdXNlRXZlbnR8fGEuYnJvd3Nlci5pZXx8YS5icm93c2VyLmVkZ2UpaWYod2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKXtmb3IodmFyIGw9YXRvYihzLnNwbGl0KCIsIilbMV0pLHU9bC5sZW5ndGgsaD1uZXcgVWludDhBcnJheSh1KTt1LS07KWhbdV09bC5jaGFyQ29kZUF0KHUpO3ZhciBjPW5ldyBCbG9iKFtoXSk7d2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGMsbisiLiIrcil9ZWxzZXt2YXIgZD1pLmdldCgibGFuZyIpLGY9Jzxib2R5IHN0eWxlPSJtYXJnaW46MDsiPjxpbWcgc3JjPSInK3MrJyIgc3R5bGU9Im1heC13aWR0aDoxMDAlOyIgdGl0bGU9IicrKGQmJmRbMF18fCIiKSsnIiAvPjwvYm9keT4nLHA9d2luZG93Lm9wZW4oKTtwLmRvY3VtZW50LndyaXRlKGYpfWVsc2V7dmFyIGc9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7dmlldzp3aW5kb3csYnViYmxlczohMCxjYW5jZWxhYmxlOiExfSk7by5kaXNwYXRjaEV2ZW50KGcpfX0saSgyOSkucmVnaXN0ZXIoInNhdmVBc0ltYWdlIixuKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2koNTgpLGkoMjQyKSxpKDI0MyksaSgyKS5yZWdpc3RlckFjdGlvbih7dHlwZToic2hvd1RpcCIsZXZlbnQ6InNob3dUaXAiLHVwZGF0ZToidG9vbHRpcDptYW51YWxseVNob3dUaXAifSxmdW5jdGlvbigpe30pLGkoMikucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImhpZGVUaXAiLGV2ZW50OiJoaWRlVGlwIix1cGRhdGU6InRvb2x0aXA6bWFudWFsbHlIaWRlVGlwIn0sZnVuY3Rpb24oKXt9KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7dmFyIGU9ImN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKSIsaT0ibGVmdCAiK3QrInMgIitlKyIsdG9wICIrdCsicyAiK2U7cmV0dXJuIHMubWFwKHAsZnVuY3Rpb24odCl7cmV0dXJuIHQrInRyYW5zaXRpb246IitpfSkuam9pbigiOyIpfWZ1bmN0aW9uIGEodCl7dmFyIGU9W10saT10LmdldCgiZm9udFNpemUiKSxuPXQuZ2V0VGV4dENvbG9yKCk7cmV0dXJuIG4mJmUucHVzaCgiY29sb3I6IituKSxlLnB1c2goImZvbnQ6Iit0LmdldEZvbnQoKSksaSYmZS5wdXNoKCJsaW5lLWhlaWdodDoiK01hdGgucm91bmQoMyppLzIpKyJweCIpLGMoWyJkZWNvcmF0aW9uIiwiYWxpZ24iXSxmdW5jdGlvbihpKXt2YXIgbj10LmdldChpKTtuJiZlLnB1c2goInRleHQtIitpKyI6IituKX0pLGUuam9pbigiOyIpfWZ1bmN0aW9uIG8odCl7dmFyIGU9W10saT10LmdldCgidHJhbnNpdGlvbkR1cmF0aW9uIiksbz10LmdldCgiYmFja2dyb3VuZENvbG9yIikscj10LmdldE1vZGVsKCJ0ZXh0U3R5bGUiKSxzPXQuZ2V0KCJwYWRkaW5nIik7cmV0dXJuIGkmJmUucHVzaChuKGkpKSxvJiYoZi5jYW52YXNTdXBwb3J0ZWQ/ZS5wdXNoKCJiYWNrZ3JvdW5kLUNvbG9yOiIrbyk6KGUucHVzaCgiYmFja2dyb3VuZC1Db2xvcjojIitsLnRvSGV4KG8pKSxlLnB1c2goImZpbHRlcjphbHBoYShvcGFjaXR5PTcwKSIpKSksYyhbIndpZHRoIiwiY29sb3IiLCJyYWRpdXMiXSxmdW5jdGlvbihpKXt2YXIgbj0iYm9yZGVyLSIraSxhPWQobiksbz10LmdldChhKTtudWxsIT1vJiZlLnB1c2gobisiOiIrbysoImNvbG9yIj09PWk/IiI6InB4IikpfSksZS5wdXNoKGEocikpLG51bGwhPXMmJmUucHVzaCgicGFkZGluZzoiK2gubm9ybWFsaXplQ3NzQXJyYXkocykuam9pbigicHggIikrInB4IiksZS5qb2luKCI7IikrIjsifWZ1bmN0aW9uIHIodCxlKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPXRoaXMuX3pyPWUuZ2V0WnIoKTt0aGlzLmVsPWksdGhpcy5feD1lLmdldFdpZHRoKCkvMix0aGlzLl95PWUuZ2V0SGVpZ2h0KCkvMix0LmFwcGVuZENoaWxkKGkpLHRoaXMuX2NvbnRhaW5lcj10LHRoaXMuX3Nob3c9ITEsdGhpcy5faGlkZVRpbWVvdXQ7dmFyIGE9dGhpcztpLm9ubW91c2VlbnRlcj1mdW5jdGlvbigpe2EuX2VudGVyYWJsZSYmKGNsZWFyVGltZW91dChhLl9oaWRlVGltZW91dCksYS5fc2hvdz0hMCksYS5faW5Db250ZW50PSEwfSxpLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGUpe2lmKGU9ZXx8d2luZG93LmV2ZW50LCFhLl9lbnRlcmFibGUpe3ZhciBpPW4uaGFuZGxlcjt1Lm5vcm1hbGl6ZUV2ZW50KHQsZSwhMCksaS5kaXNwYXRjaCgibW91c2Vtb3ZlIixlKX19LGkub25tb3VzZWxlYXZlPWZ1bmN0aW9uKCl7YS5fZW50ZXJhYmxlJiZhLl9zaG93JiZhLmhpZGVMYXRlcihhLl9oaWRlRGVsYXkpLGEuX2luQ29udGVudD0hMX19dmFyIHM9aSgxKSxsPWkoMjIpLHU9aSgyMSksaD1pKDcpLGM9cy5lYWNoLGQ9aC50b0NhbWVsQ2FzZSxmPWkoMTApLHA9WyIiLCItd2Via2l0LSIsIi1tb3otIiwiLW8tIl0sZz0icG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztib3JkZXItc3R5bGU6c29saWQ7d2hpdGUtc3BhY2U6bm93cmFwO3otaW5kZXg6OTk5OTk5OTsiO3IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpyLF9lbnRlcmFibGU6ITAsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGFpbmVyLGU9dC5jdXJyZW50U3R5bGV8fGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCksaT10LnN0eWxlOyJhYnNvbHV0ZSIhPT1pLnBvc2l0aW9uJiYiYWJzb2x1dGUiIT09ZS5wb3NpdGlvbiYmKGkucG9zaXRpb249InJlbGF0aXZlIil9LHNob3c6ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVUaW1lb3V0KTt2YXIgZT10aGlzLmVsO2Uuc3R5bGUuY3NzVGV4dD1nK28odCkrIjtsZWZ0OiIrdGhpcy5feCsicHg7dG9wOiIrdGhpcy5feSsicHg7IisodC5nZXQoImV4dHJhQ3NzVGV4dCIpfHwiIiksZS5zdHlsZS5kaXNwbGF5PWUuaW5uZXJIVE1MPyJibG9jayI6Im5vbmUiLHRoaXMuX3Nob3c9ITB9LHNldENvbnRlbnQ6ZnVuY3Rpb24odCl7dGhpcy5lbC5pbm5lckhUTUw9bnVsbD09dD8iIjp0fSxzZXRFbnRlcmFibGU6ZnVuY3Rpb24odCl7dGhpcy5fZW50ZXJhYmxlPXR9LGdldFNpemU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsO3JldHVyblt0LmNsaWVudFdpZHRoLHQuY2xpZW50SGVpZ2h0XX0sbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dmFyIGksbj10aGlzLl96cjtuJiZuLnBhaW50ZXImJihpPW4ucGFpbnRlci5nZXRWaWV3cG9ydFJvb3RPZmZzZXQoKSkmJih0Kz1pLm9mZnNldExlZnQsZSs9aS5vZmZzZXRUb3ApO3ZhciBhPXRoaXMuZWwuc3R5bGU7YS5sZWZ0PXQrInB4IixhLnRvcD1lKyJweCIsdGhpcy5feD10LHRoaXMuX3k9ZX0saGlkZTpmdW5jdGlvbigpe3RoaXMuZWwuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5fc2hvdz0hMX0saGlkZUxhdGVyOmZ1bmN0aW9uKHQpeyF0aGlzLl9zaG93fHx0aGlzLl9pbkNvbnRlbnQmJnRoaXMuX2VudGVyYWJsZXx8KHQ/KHRoaXMuX2hpZGVEZWxheT10LHRoaXMuX3Nob3c9ITEsdGhpcy5faGlkZVRpbWVvdXQ9c2V0VGltZW91dChzLmJpbmQodGhpcy5oaWRlLHRoaXMpLHQpKTp0aGlzLmhpZGUoKSl9LGlzU2hvdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93fX0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXtpKDIpLmV4dGVuZENvbXBvbmVudE1vZGVsKHt0eXBlOiJ0b29sdGlwIixkZXBlbmRlbmNpZXM6WyJheGlzUG9pbnRlciJdLGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6OCxzaG93OiEwLHNob3dDb250ZW50OiEwLHRyaWdnZXI6Iml0ZW0iLHRyaWdnZXJPbjoibW91c2Vtb3ZlfGNsaWNrIixhbHdheXNTaG93Q29udGVudDohMSxkaXNwbGF5TW9kZToic2luZ2xlIixjb25maW5lOiExLHNob3dEZWxheTowLGhpZGVEZWxheToxMDAsdHJhbnNpdGlvbkR1cmF0aW9uOi40LGVudGVyYWJsZTohMSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNTAsNTAsNTAsMC43KSIsYm9yZGVyQ29sb3I6IiMzMzMiLGJvcmRlclJhZGl1czo0LGJvcmRlcldpZHRoOjAscGFkZGluZzo1LGV4dHJhQ3NzVGV4dDoiIixheGlzUG9pbnRlcjp7dHlwZToibGluZSIsYXhpczoiYXV0byIsYW5pbWF0aW9uOiJhdXRvIixhbmltYXRpb25EdXJhdGlvblVwZGF0ZToyMDAsYW5pbWF0aW9uRWFzaW5nVXBkYXRlOiJleHBvbmVudGlhbE91dCIsY3Jvc3NTdHlsZTp7Y29sb3I6IiM5OTkiLHdpZHRoOjEsdHlwZToiZGFzaGVkIix0ZXh0U3R5bGU6e319fSx0ZXh0U3R5bGU6e2NvbG9yOiIjZmZmIixmb250U2l6ZToxNH19fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT10LnBvcCgpO3QubGVuZ3RoOyl7dmFyIGk9dC5wb3AoKTtpJiYoaSBpbnN0YW5jZW9mIHkmJihpPWkuZ2V0KCJ0b29sdGlwIiwhMCkpLCJzdHJpbmciPT10eXBlb2YgaSYmKGk9e2Zvcm1hdHRlcjppfSksZT1uZXcgeShpLGUsZS5lY01vZGVsKSl9cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiB0LmRpc3BhdGNoQWN0aW9ufHxjLmJpbmQoZS5kaXNwYXRjaEFjdGlvbixlKX1mdW5jdGlvbiBvKHQsZSxpLG4sYSxvLHIpe3ZhciBsPXMoaSksdT1sLndpZHRoLGg9bC5oZWlnaHQ7cmV0dXJuIG51bGwhPW8mJih0K3Urbz5uP3QtPXUrbzp0Kz1vKSxudWxsIT1yJiYoZStoK3I+YT9lLT1oK3I6ZSs9ciksW3QsZV19ZnVuY3Rpb24gcih0LGUsaSxuLGEpe3ZhciBvPXMoaSkscj1vLndpZHRoLGw9by5oZWlnaHQ7cmV0dXJuIHQ9TWF0aC5taW4odCtyLG4pLXIsZT1NYXRoLm1pbihlK2wsYSktbCx0PU1hdGgubWF4KHQsMCksZT1NYXRoLm1heChlLDApLFt0LGVdfWZ1bmN0aW9uIHModCl7dmFyIGU9dC5jbGllbnRXaWR0aCxpPXQuY2xpZW50SGVpZ2h0O2lmKGRvY3VtZW50LmRlZmF1bHRWaWV3JiZkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKXt2YXIgbj1kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQpO24mJihlKz1wYXJzZUludChuLnBhZGRpbmdMZWZ0LDEwKStwYXJzZUludChuLnBhZGRpbmdSaWdodCwxMCkrcGFyc2VJbnQobi5ib3JkZXJMZWZ0V2lkdGgsMTApK3BhcnNlSW50KG4uYm9yZGVyUmlnaHRXaWR0aCwxMCksaSs9cGFyc2VJbnQobi5wYWRkaW5nVG9wLDEwKStwYXJzZUludChuLnBhZGRpbmdCb3R0b20sMTApK3BhcnNlSW50KG4uYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KG4uYm9yZGVyQm90dG9tV2lkdGgsMTApKX1yZXR1cm57d2lkdGg6ZSxoZWlnaHQ6aX19ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG49aVswXSxhPWlbMV0sbz01LHI9MCxzPTAsbD1lLndpZHRoLHU9ZS5oZWlnaHQ7c3dpdGNoKHQpe2Nhc2UiaW5zaWRlIjpyPWUueCtsLzItbi8yLHM9ZS55K3UvMi1hLzI7YnJlYWs7Y2FzZSJ0b3AiOnI9ZS54K2wvMi1uLzIscz1lLnktYS1vO2JyZWFrO2Nhc2UiYm90dG9tIjpyPWUueCtsLzItbi8yLHM9ZS55K3UrbzticmVhaztjYXNlImxlZnQiOnI9ZS54LW4tbyxzPWUueSt1LzItYS8yO2JyZWFrO2Nhc2UicmlnaHQiOnI9ZS54K2wrbyxzPWUueSt1LzItYS8yfXJldHVybltyLHNdfWZ1bmN0aW9uIHUodCl7cmV0dXJuImNlbnRlciI9PT10fHwibWlkZGxlIj09PXR9dmFyIGg9aSgyNDEpLGM9aSgxKSxkPWkoNyksZj1pKDQpLHA9aSgzKSxnPWkoMTI2KSxtPWkoOSksdj1pKDEwKSx5PWkoMTEpLHg9aSgxMjcpLF89aSgxOCksYj1pKDgxKSx3PWMuYmluZCxTPWMuZWFjaCxNPWYucGFyc2VQZXJjZW50LEk9bmV3IHAuUmVjdCh7c2hhcGU6e3g6LTEseTotMSx3aWR0aDoyLGhlaWdodDoyfX0pO2koMikuZXh0ZW5kQ29tcG9uZW50Vmlldyh7dHlwZToidG9vbHRpcCIsaW5pdDpmdW5jdGlvbih0LGUpe2lmKCF2Lm5vZGUpe3ZhciBpPW5ldyBoKGUuZ2V0RG9tKCksZSk7dGhpcy5fdG9vbHRpcENvbnRlbnQ9aX19LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7aWYoIXYubm9kZSl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLl90b29sdGlwTW9kZWw9dCx0aGlzLl9lY01vZGVsPWUsdGhpcy5fYXBpPWksdGhpcy5fbGFzdERhdGFCeUNvb3JkU3lzPW51bGwsdGhpcy5fYWx3YXlzU2hvd0NvbnRlbnQ9dC5nZXQoImFsd2F5c1Nob3dDb250ZW50Iik7dmFyIG49dGhpcy5fdG9vbHRpcENvbnRlbnQ7bi51cGRhdGUoKSxuLnNldEVudGVyYWJsZSh0LmdldCgiZW50ZXJhYmxlIikpLHRoaXMuX2luaXRHbG9iYWxMaXN0ZW5lcigpLHRoaXMuX2tlZXBTaG93KCl9fSxfaW5pdEdsb2JhbExpc3RlbmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdG9vbHRpcE1vZGVsLGU9dC5nZXQoInRyaWdnZXJPbiIpO3gucmVnaXN0ZXIoIml0ZW1Ub29sdGlwIix0aGlzLl9hcGksdyhmdW5jdGlvbih0LGksbil7Im5vbmUiIT09ZSYmKGUuaW5kZXhPZih0KT49MD90aGlzLl90cnlTaG93KGksbik6ImxlYXZlIj09PXQmJnRoaXMuX2hpZGUobikpfSx0aGlzKSl9LF9rZWVwU2hvdzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Rvb2x0aXBNb2RlbCxlPXRoaXMuX2VjTW9kZWwsaT10aGlzLl9hcGk7aWYobnVsbCE9dGhpcy5fbGFzdFgmJm51bGwhPXRoaXMuX2xhc3RZJiYibm9uZSIhPT10LmdldCgidHJpZ2dlck9uIikpe3ZhciBuPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMuX3JlZnJlc2hVcGRhdGVUaW1lb3V0KSx0aGlzLl9yZWZyZXNoVXBkYXRlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5tYW51YWxseVNob3dUaXAodCxlLGkse3g6bi5fbGFzdFgseTpuLl9sYXN0WX0pfSl9fSxtYW51YWxseVNob3dUaXA6ZnVuY3Rpb24odCxlLGksbil7aWYobi5mcm9tIT09dGhpcy51aWQmJiF2Lm5vZGUpe3ZhciBvPWEobixpKTt0aGlzLl90aWNrZXQ9IiI7dmFyIHI9bi5kYXRhQnlDb29yZFN5cztpZihuLnRvb2x0aXAmJm51bGwhPW4ueCYmbnVsbCE9bi55KXt2YXIgcz1JO3MucG9zaXRpb249W24ueCxuLnldLHMudXBkYXRlKCkscy50b29sdGlwPW4udG9vbHRpcCx0aGlzLl90cnlTaG93KHtvZmZzZXRYOm4ueCxvZmZzZXRZOm4ueSx0YXJnZXQ6c30sbyl9ZWxzZSBpZihyKXRoaXMuX3RyeVNob3coe29mZnNldFg6bi54LG9mZnNldFk6bi55LHBvc2l0aW9uOm4ucG9zaXRpb24sZXZlbnQ6e30sZGF0YUJ5Q29vcmRTeXM6bi5kYXRhQnlDb29yZFN5cyx0b29sdGlwT3B0aW9uOm4udG9vbHRpcE9wdGlvbn0sbyk7ZWxzZSBpZihudWxsIT1uLnNlcmllc0luZGV4KXtpZih0aGlzLl9tYW51YWxseUF4aXNTaG93VGlwKHQsZSxpLG4pKXJldHVybjt2YXIgbD1nKG4sZSksdT1sLnBvaW50WzBdLGg9bC5wb2ludFsxXTtudWxsIT11JiZudWxsIT1oJiZ0aGlzLl90cnlTaG93KHtvZmZzZXRYOnUsb2Zmc2V0WTpoLHBvc2l0aW9uOm4ucG9zaXRpb24sdGFyZ2V0OmwuZWwsZXZlbnQ6e319LG8pfWVsc2UgbnVsbCE9bi54JiZudWxsIT1uLnkmJihpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ1cGRhdGVBeGlzUG9pbnRlciIseDpuLngseTpuLnl9KSx0aGlzLl90cnlTaG93KHtvZmZzZXRYOm4ueCxvZmZzZXRZOm4ueSxwb3NpdGlvbjpuLnBvc2l0aW9uLHRhcmdldDppLmdldFpyKCkuZmluZEhvdmVyKG4ueCxuLnkpLnRhcmdldCxldmVudDp7fX0sbykpfX0sbWFudWFsbHlIaWRlVGlwOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBvPXRoaXMuX3Rvb2x0aXBDb250ZW50O3RoaXMuX2Fsd2F5c1Nob3dDb250ZW50fHxvLmhpZGVMYXRlcih0aGlzLl90b29sdGlwTW9kZWwuZ2V0KCJoaWRlRGVsYXkiKSksdGhpcy5fbGFzdFg9dGhpcy5fbGFzdFk9bnVsbCxuLmZyb20hPT10aGlzLnVpZCYmdGhpcy5faGlkZShhKG4saSkpfSxfbWFudWFsbHlBeGlzU2hvd1RpcDpmdW5jdGlvbih0LGUsaSxhKXt2YXIgbz1hLnNlcmllc0luZGV4LHI9YS5kYXRhSW5kZXgscz1lLmdldENvbXBvbmVudCgiYXhpc1BvaW50ZXIiKS5jb29yZFN5c0F4ZXNJbmZvO2lmKG51bGwhPW8mJm51bGwhPXImJm51bGwhPXMpe3ZhciBsPWUuZ2V0U2VyaWVzQnlJbmRleChvKTtpZihsKXt2YXIgdT1sLmdldERhdGEoKSx0PW4oW3UuZ2V0SXRlbU1vZGVsKHIpLGwsKGwuY29vcmRpbmF0ZVN5c3RlbXx8e30pLm1vZGVsLHRdKTtpZigiYXhpcyI9PT10LmdldCgidHJpZ2dlciIpKXJldHVybiBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ1cGRhdGVBeGlzUG9pbnRlciIsc2VyaWVzSW5kZXg6byxkYXRhSW5kZXg6cixwb3NpdGlvbjphLnBvc2l0aW9ufSksITB9fX0sX3RyeVNob3c6ZnVuY3Rpb24odCxlKXt2YXIgaT10LnRhcmdldCxuPXRoaXMuX3Rvb2x0aXBNb2RlbDtpZihuKXt0aGlzLl9sYXN0WD10Lm9mZnNldFgsdGhpcy5fbGFzdFk9dC5vZmZzZXRZO3ZhciBhPXQuZGF0YUJ5Q29vcmRTeXM7YSYmYS5sZW5ndGg/dGhpcy5fc2hvd0F4aXNUb29sdGlwKGEsdCk6aSYmbnVsbCE9aS5kYXRhSW5kZXg/KHRoaXMuX2xhc3REYXRhQnlDb29yZFN5cz1udWxsLHRoaXMuX3Nob3dTZXJpZXNJdGVtVG9vbHRpcCh0LGksZSkpOmkmJmkudG9vbHRpcD8odGhpcy5fbGFzdERhdGFCeUNvb3JkU3lzPW51bGwsdGhpcy5fc2hvd0NvbXBvbmVudEl0ZW1Ub29sdGlwKHQsaSxlKSk6KHRoaXMuX2xhc3REYXRhQnlDb29yZFN5cz1udWxsLHRoaXMuX2hpZGUoZSkpfX0sX3Nob3dPck1vdmU6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldCgic2hvd0RlbGF5Iik7ZT1jLmJpbmQoZSx0aGlzKSxjbGVhclRpbWVvdXQodGhpcy5fc2hvd1RpbW91dCksaT4wP3RoaXMuX3Nob3dUaW1vdXQ9c2V0VGltZW91dChlLGkpOmUoKX0sX3Nob3dBeGlzVG9vbHRpcDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2VjTW9kZWwsYT10aGlzLl90b29sdGlwTW9kZWwsbz1bZS5vZmZzZXRYLGUub2Zmc2V0WV0scj1bXSxzPVtdLGw9bihbZS50b29sdGlwT3B0aW9uLGFdKTtTKHQsZnVuY3Rpb24odCl7Uyh0LmRhdGFCeUF4aXMsZnVuY3Rpb24odCl7dmFyIGU9aS5nZXRDb21wb25lbnQodC5heGlzRGltKyJBeGlzIix0LmF4aXNJbmRleCksbj10LnZhbHVlLGE9W107aWYoZSYmbnVsbCE9bil7dmFyIG89Yi5nZXRWYWx1ZUxhYmVsKG4sZS5heGlzLGksdC5zZXJpZXNEYXRhSW5kaWNlcyx0LnZhbHVlTGFiZWxPcHQpO2MuZWFjaCh0LnNlcmllc0RhdGFJbmRpY2VzLGZ1bmN0aW9uKHIpe3ZhciBsPWkuZ2V0U2VyaWVzQnlJbmRleChyLnNlcmllc0luZGV4KSx1PXIuZGF0YUluZGV4SW5zaWRlLGg9bCYmbC5nZXREYXRhUGFyYW1zKHUpO2guYXhpc0RpbT10LmF4aXNEaW0saC5heGlzSW5kZXg9dC5heGlzSW5kZXgsaC5heGlzVHlwZT10LmF4aXNUeXBlLGguYXhpc0lkPXQuYXhpc0lkLGguYXhpc1ZhbHVlPV8uZ2V0QXhpc1Jhd1ZhbHVlKGUuYXhpcyxuKSxoLmF4aXNWYWx1ZUxhYmVsPW8saCYmKHMucHVzaChoKSxhLnB1c2gobC5mb3JtYXRUb29sdGlwKHUsITApKSl9KTt2YXIgbD1vO3IucHVzaCgobD9kLmVuY29kZUhUTUwobCkrIjxiciAvPiI6IiIpK2Euam9pbigiPGJyIC8+IikpfX0pfSx0aGlzKSxyLnJldmVyc2UoKSxyPXIuam9pbigiPGJyIC8+PGJyIC8+Iik7dmFyIHU9ZS5wb3NpdGlvbjt0aGlzLl9zaG93T3JNb3ZlKGwsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDb250ZW50Tm90Q2hhbmdlZE9uQXhpcyh0KT90aGlzLl91cGRhdGVQb3NpdGlvbihsLHUsb1swXSxvWzFdLHRoaXMuX3Rvb2x0aXBDb250ZW50LHMpOnRoaXMuX3Nob3dUb29sdGlwQ29udGVudChsLHIscyxNYXRoLnJhbmRvbSgpLG9bMF0sb1sxXSx1KX0pfSxfc2hvd1Nlcmllc0l0ZW1Ub29sdGlwOmZ1bmN0aW9uKHQsZSxpKXt2YXIgYT10aGlzLl9lY01vZGVsLG89ZS5zZXJpZXNJbmRleCxyPWEuZ2V0U2VyaWVzQnlJbmRleChvKSxzPWUuZGF0YU1vZGVsfHxyLGw9ZS5kYXRhSW5kZXgsdT1lLmRhdGFUeXBlLGg9cy5nZXREYXRhKCksYz1uKFtoLmdldEl0ZW1Nb2RlbChsKSxzLHImJihyLmNvb3JkaW5hdGVTeXN0ZW18fHt9KS5tb2RlbCx0aGlzLl90b29sdGlwTW9kZWxdKSxkPWMuZ2V0KCJ0cmlnZ2VyIik7aWYobnVsbD09ZHx8Iml0ZW0iPT09ZCl7dmFyIGY9cy5nZXREYXRhUGFyYW1zKGwsdSkscD1zLmZvcm1hdFRvb2x0aXAobCwhMSx1KSxnPSJpdGVtXyIrcy5uYW1lKyJfIitsO3RoaXMuX3Nob3dPck1vdmUoYyxmdW5jdGlvbigpe3RoaXMuX3Nob3dUb29sdGlwQ29udGVudChjLHAsZixnLHQub2Zmc2V0WCx0Lm9mZnNldFksdC5wb3NpdGlvbix0LnRhcmdldCl9KSxpKHt0eXBlOiJzaG93VGlwIixkYXRhSW5kZXhJbnNpZGU6bCxkYXRhSW5kZXg6aC5nZXRSYXdJbmRleChsKSxzZXJpZXNJbmRleDpvLGZyb206dGhpcy51aWR9KX19LF9zaG93Q29tcG9uZW50SXRlbVRvb2x0aXA6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUudG9vbHRpcDtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBhPW47bj17Y29udGVudDphLGZvcm1hdHRlcjphfX12YXIgbz1uZXcgeShuLHRoaXMuX3Rvb2x0aXBNb2RlbCx0aGlzLl9lY01vZGVsKSxyPW8uZ2V0KCJjb250ZW50Iikscz1NYXRoLnJhbmRvbSgpO3RoaXMuX3Nob3dPck1vdmUobyxmdW5jdGlvbigpe3RoaXMuX3Nob3dUb29sdGlwQ29udGVudChvLHIsby5nZXQoImZvcm1hdHRlclBhcmFtcyIpfHx7fSxzLHQub2Zmc2V0WCx0Lm9mZnNldFksdC5wb3NpdGlvbixlKX0pLGkoe3R5cGU6InNob3dUaXAiLGZyb206dGhpcy51aWR9KX0sX3Nob3dUb29sdGlwQ29udGVudDpmdW5jdGlvbih0LGUsaSxuLGEsbyxyLHMpe2lmKHRoaXMuX3RpY2tldD0iIix0LmdldCgic2hvd0NvbnRlbnQiKSYmdC5nZXQoInNob3ciKSl7dmFyIGw9dGhpcy5fdG9vbHRpcENvbnRlbnQsdT10LmdldCgiZm9ybWF0dGVyIik7cj1yfHx0LmdldCgicG9zaXRpb24iKTt2YXIgaD1lO2lmKHUmJiJzdHJpbmciPT10eXBlb2YgdSloPWQuZm9ybWF0VHBsKHUsaSwhMCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgdSl7dmFyIGM9dyhmdW5jdGlvbihlLG4pe2U9PT10aGlzLl90aWNrZXQmJihsLnNldENvbnRlbnQobiksdGhpcy5fdXBkYXRlUG9zaXRpb24odCxyLGEsbyxsLGkscykpfSx0aGlzKTt0aGlzLl90aWNrZXQ9bixoPXUoaSxuLGMpfWwuc2V0Q29udGVudChoKSxsLnNob3codCksdGhpcy5fdXBkYXRlUG9zaXRpb24odCxyLGEsbyxsLGkscyl9fSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24odCxlLGksbixhLHMsaCl7dmFyIGQ9dGhpcy5fYXBpLmdldFdpZHRoKCksZj10aGlzLl9hcGkuZ2V0SGVpZ2h0KCk7ZT1lfHx0LmdldCgicG9zaXRpb24iKTt2YXIgcD1hLmdldFNpemUoKSxnPXQuZ2V0KCJhbGlnbiIpLHY9dC5nZXQoInZlcnRpY2FsQWxpZ24iKSx5PWgmJmguZ2V0Qm91bmRpbmdSZWN0KCkuY2xvbmUoKTtpZihoJiZ5LmFwcGx5VHJhbnNmb3JtKGgudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKGU9ZShbaSxuXSxzLGEuZWwseSx7dmlld1NpemU6W2QsZl0sY29udGVudFNpemU6cC5zbGljZSgpfSkpLGMuaXNBcnJheShlKSlpPU0oZVswXSxkKSxuPU0oZVsxXSxmKTtlbHNlIGlmKGMuaXNPYmplY3QoZSkpe2Uud2lkdGg9cFswXSxlLmhlaWdodD1wWzFdO3ZhciB4PW0uZ2V0TGF5b3V0UmVjdChlLHt3aWR0aDpkLGhlaWdodDpmfSk7aT14Lngsbj14LnksZz1udWxsLHY9bnVsbH1lbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgZSYmaCl7dmFyIF89bChlLHkscCk7aT1fWzBdLG49X1sxXX1lbHNle3ZhciBfPW8oaSxuLGEuZWwsZCxmLGc/bnVsbDoyMCx2P251bGw6MjApO2k9X1swXSxuPV9bMV19aWYoZyYmKGktPXUoZyk/cFswXS8yOiJyaWdodCI9PT1nP3BbMF06MCksdiYmKG4tPXUodik/cFsxXS8yOiJib3R0b20iPT09dj9wWzFdOjApLHQuZ2V0KCJjb25maW5lIikpe3ZhciBfPXIoaSxuLGEuZWwsZCxmKTtpPV9bMF0sbj1fWzFdfWEubW92ZVRvKGksbil9LF91cGRhdGVDb250ZW50Tm90Q2hhbmdlZE9uQXhpczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXMsaT0hIWUmJmUubGVuZ3RoPT09dC5sZW5ndGg7cmV0dXJuIGkmJlMoZSxmdW5jdGlvbihlLG4pe3ZhciBhPWUuZGF0YUJ5QXhpc3x8e30sbz10W25dfHx7fSxyPW8uZGF0YUJ5QXhpc3x8W107aSY9YS5sZW5ndGg9PT1yLmxlbmd0aCxpJiZTKGEsZnVuY3Rpb24odCxlKXt2YXIgbj1yW2VdfHx7fSxhPXQuc2VyaWVzRGF0YUluZGljZXN8fFtdLG89bi5zZXJpZXNEYXRhSW5kaWNlc3x8W107aSY9dC52YWx1ZT09PW4udmFsdWUmJnQuYXhpc1R5cGU9PT1uLmF4aXNUeXBlJiZ0LmF4aXNJZD09PW4uYXhpc0lkJiZhLmxlbmd0aD09PW8ubGVuZ3RoLGkmJlMoYSxmdW5jdGlvbih0LGUpe3ZhciBuPW9bZV07aSY9dC5zZXJpZXNJbmRleD09PW4uc2VyaWVzSW5kZXgmJnQuZGF0YUluZGV4PT09bi5kYXRhSW5kZXh9KX0pfSksdGhpcy5fbGFzdERhdGFCeUNvb3JkU3lzPXQsISFpfSxfaGlkZTpmdW5jdGlvbih0KXt0aGlzLl9sYXN0RGF0YUJ5Q29vcmRTeXM9bnVsbCx0KHt0eXBlOiJoaWRlVGlwIixmcm9tOnRoaXMudWlkfSl9LGRpc3Bvc2U6ZnVuY3Rpb24odCxlKXt2Lm5vZGV8fCh0aGlzLl90b29sdGlwQ29udGVudC5oaWRlKCkseC51bnJlZ2lzdGVyKCJpdGVtVG9vbHRpcCIsZSkpfX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXQuZ2V0KCJjZW50ZXIiKSxuPXQuZ2V0KCJyYWRpdXMiKSxhPWUuZ2V0V2lkdGgoKSxvPWUuZ2V0SGVpZ2h0KCkscj1zLnBhcnNlUGVyY2VudDt0aGlzLmN4PXIoaVswXSxhKSx0aGlzLmN5PXIoaVsxXSxvKTt2YXIgbD10aGlzLmdldFJhZGl1c0F4aXMoKSx1PU1hdGgubWluKGEsbykvMjtsLnNldEV4dGVudCgwLHIobix1KSl9ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPXRoaXMsbj1pLmdldEFuZ2xlQXhpcygpLGE9aS5nZXRSYWRpdXNBeGlzKCk7aWYobi5zY2FsZS5zZXRFeHRlbnQoMS8wLC0oMS8wKSksYS5zY2FsZS5zZXRFeHRlbnQoMS8wLC0oMS8wKSksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQpe2lmKHQuY29vcmRpbmF0ZVN5c3RlbT09PWkpe3ZhciBlPXQuZ2V0RGF0YSgpO2Euc2NhbGUudW5pb25FeHRlbnRGcm9tRGF0YShlLCJyYWRpdXMiKSxuLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSwiYW5nbGUiKX19KSx1KG4uc2NhbGUsbi5tb2RlbCksdShhLnNjYWxlLGEubW9kZWwpLCJjYXRlZ29yeSI9PT1uLnR5cGUmJiFuLm9uQmFuZCl7dmFyIG89bi5nZXRFeHRlbnQoKSxyPTM2MC9uLnNjYWxlLmNvdW50KCk7bi5pbnZlcnNlP29bMV0rPXI6b1sxXS09cixuLnNldEV4dGVudChvWzBdLG9bMV0pfX1mdW5jdGlvbiBvKHQsZSl7aWYodC50eXBlPWUuZ2V0KCJ0eXBlIiksdC5zY2FsZT1sLmNyZWF0ZVNjYWxlQnlNb2RlbChlKSx0Lm9uQmFuZD1lLmdldCgiYm91bmRhcnlHYXAiKSYmImNhdGVnb3J5Ij09PXQudHlwZSwiYW5nbGVBeGlzIj09PWUubWFpblR5cGUpe3ZhciBpPWUuZ2V0KCJzdGFydEFuZ2xlIik7dC5pbnZlcnNlPWUuZ2V0KCJpbnZlcnNlIileZS5nZXQoImNsb2Nrd2lzZSIpLHQuc2V0RXh0ZW50KGksaSsodC5pbnZlcnNlPy0zNjA6MzYwKSl9ZS5heGlzPXQsdC5tb2RlbD1lfXZhciByPWkoNDIwKSxzPWkoNCksbD0oaSgxKSxpKDE4KSksdT1sLm5pY2VTY2FsZUV4dGVudDtpKDQyMSk7dmFyIGg9e2RpbWVuc2lvbnM6ci5wcm90b3R5cGUuZGltZW5zaW9ucyxjcmVhdGU6ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtyZXR1cm4gdC5lYWNoQ29tcG9uZW50KCJwb2xhciIsZnVuY3Rpb24odCxzKXt2YXIgbD1uZXcgcihzKTtsLnJlc2l6ZT1uLGwudXBkYXRlPWE7dmFyIHU9bC5nZXRSYWRpdXNBeGlzKCksaD1sLmdldEFuZ2xlQXhpcygpLGM9dC5maW5kQXhpc01vZGVsKCJyYWRpdXNBeGlzIiksZD10LmZpbmRBeGlzTW9kZWwoImFuZ2xlQXhpcyIpO28odSxjKSxvKGgsZCksbC5yZXNpemUodCxlKSxpLnB1c2gobCksdC5jb29yZGluYXRlU3lzdGVtPWwsbC5tb2RlbD10fSksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKGUpe2lmKCJwb2xhciI9PT1lLmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpKXt2YXIgaT10LnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6InBvbGFyIixpbmRleDplLmdldCgicG9sYXJJbmRleCIpLGlkOmUuZ2V0KCJwb2xhcklkIil9KVswXTtlLmNvb3JkaW5hdGVTeXN0ZW09aS5jb29yZGluYXRlU3lzdGVtfX0pLGl9fTtpKDI2KS5yZWdpc3RlcigicG9sYXIiLGgpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9ZnVuY3Rpb24gYSh0LGUpe3MuaW5pdFZNTCgpLHRoaXMucm9vdD10LHRoaXMuc3RvcmFnZT1lO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5zdHlsZS5jc3NUZXh0PSJkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MzAwcHg7aGVpZ2h0OjE1MHB4OyIsbi5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7Iix0LmFwcGVuZENoaWxkKGkpLHRoaXMuX3ZtbFJvb3Q9bix0aGlzLl92bWxWaWV3cG9ydD1pLHRoaXMucmVzaXplKCk7dmFyIGE9ZS5kZWxGcm9tU3RvcmFnZSxvPWUuYWRkVG9TdG9yYWdlO2UuZGVsRnJvbVN0b3JhZ2U9ZnVuY3Rpb24odCl7YS5jYWxsKGUsdCksdCYmdC5vblJlbW92ZSYmdC5vblJlbW92ZShuKX0sZS5hZGRUb1N0b3JhZ2U9ZnVuY3Rpb24odCl7dC5vbkFkZCYmdC5vbkFkZChuKSxvLmNhbGwoZSx0KX0sdGhpcy5fZmlyc3RQYWludD0hMH1mdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3IoJ0luIElFOC4wIFZNTCBtb2RlIHBhaW50ZXIgbm90IHN1cHBvcnQgbWV0aG9kICInK3QrJyInKX19dmFyIHI9aSg1NCkscz1pKDE4OCk7YS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmEsZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiJ2bWwifSxnZXRWaWV3cG9ydFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm1sVmlld3BvcnR9LGdldFZpZXdwb3J0Um9vdE9mZnNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Vmlld3BvcnRSb290KCk7aWYodClyZXR1cm57b2Zmc2V0TGVmdDp0Lm9mZnNldExlZnR8fDAsb2Zmc2V0VG9wOnQub2Zmc2V0VG9wfHwwfX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RvcmFnZS5nZXREaXNwbGF5TGlzdCghMCwhMCk7dGhpcy5fcGFpbnRMaXN0KHQpfSxfcGFpbnRMaXN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl92bWxSb290LGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG49dFtpXTtuLmludmlzaWJsZXx8bi5pZ25vcmU/KG4uX19hbHJlYWR5Tm90VmlzaWJsZXx8bi5vblJlbW92ZShlKSxuLl9fYWxyZWFkeU5vdFZpc2libGU9ITApOihuLl9fYWxyZWFkeU5vdFZpc2libGUmJm4ub25BZGQoZSksbi5fX2FscmVhZHlOb3RWaXNpYmxlPSExLG4uX19kaXJ0eSYmKG4uYmVmb3JlQnJ1c2gmJm4uYmVmb3JlQnJ1c2goKSwobi5icnVzaFZNTHx8bi5icnVzaCkuY2FsbChuLGUpLG4uYWZ0ZXJCcnVzaCYmbi5hZnRlckJydXNoKCkpKSxuLl9fZGlydHk9ITF9dGhpcy5fZmlyc3RQYWludCYmKHRoaXMuX3ZtbFZpZXdwb3J0LmFwcGVuZENoaWxkKGUpLHRoaXMuX2ZpcnN0UGFpbnQ9ITEpfSxyZXNpemU6ZnVuY3Rpb24odCxlKXt2YXIgdD1udWxsPT10P3RoaXMuX2dldFdpZHRoKCk6dCxlPW51bGw9PWU/dGhpcy5fZ2V0SGVpZ2h0KCk6ZTtpZih0aGlzLl93aWR0aCE9dHx8dGhpcy5faGVpZ2h0IT1lKXt0aGlzLl93aWR0aD10LHRoaXMuX2hlaWdodD1lO3ZhciBpPXRoaXMuX3ZtbFZpZXdwb3J0LnN0eWxlO2kud2lkdGg9dCsicHgiLGkuaGVpZ2h0PWUrInB4In19LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLnJvb3QuaW5uZXJIVE1MPSIiLHRoaXMuX3ZtbFJvb3Q9dGhpcy5fdm1sVmlld3BvcnQ9dGhpcy5zdG9yYWdlPW51bGx9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofSxnZXRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuX3ZtbFZpZXdwb3J0JiZ0aGlzLnJvb3QucmVtb3ZlQ2hpbGQodGhpcy5fdm1sVmlld3BvcnQpfSxfZ2V0V2lkdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJvb3QsZT10LmN1cnJlbnRTdHlsZTtyZXR1cm4odC5jbGllbnRXaWR0aHx8bihlLndpZHRoKSktbihlLnBhZGRpbmdMZWZ0KS1uKGUucGFkZGluZ1JpZ2h0KXwwfSxfZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yb290LGU9dC5jdXJyZW50U3R5bGU7cmV0dXJuKHQuY2xpZW50SGVpZ2h0fHxuKGUuaGVpZ2h0KSktbihlLnBhZGRpbmdUb3ApLW4oZS5wYWRkaW5nQm90dG9tKXwwfX07Zm9yKHZhciBsPVsiZ2V0TGF5ZXIiLCJpbnNlcnRMYXllciIsImVhY2hMYXllciIsImVhY2hCdWlsdGluTGF5ZXIiLCJlYWNoT3RoZXJMYXllciIsImdldExheWVycyIsIm1vZExheWVyIiwiZGVsTGF5ZXIiLCJjbGVhckxheWVyIiwidG9EYXRhVVJMIiwicGF0aFRvSW1hZ2UiXSx1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBoPWxbdV07YS5wcm90b3R5cGVbaF09byhoKX10LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLGkpe2lmKCFpKDEwKS5jYW52YXNTdXBwb3J0ZWQpe3ZhciBuPWkoNiksYT1pKDEyKSxvPWkoMjcpLkNNRCxyPWkoMjIpLHM9aSgxNiksbD1pKDU2KSx1PWkoOTIpLGg9aSgzOCksYz1pKDU1KSxkPWkoOTEpLGY9aSg4KSxwPWkoMjcpLGc9aSgzOSksbT1pKDE4OCksdj1NYXRoLnJvdW5kLHk9TWF0aC5zcXJ0LHg9TWF0aC5hYnMsXz1NYXRoLmNvcyxiPU1hdGguc2luLHc9TWF0aC5tYXgsUz1uLmFwcGx5VHJhbnNmb3JtLE09IiwiLEk9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdCIsVD0yMTYwMCxBPVQvMixDPTFlNSxMPTFlMyxEPWZ1bmN0aW9uKHQpe3Quc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyIsdC5jb29yZHNpemU9VCsiLCIrVCx0LmNvb3Jkb3JpZ2luPSIwLDAifSxQPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCkucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9LGs9ZnVuY3Rpb24odCxlLGkpe3JldHVybiJyZ2IoIitbdCxlLGldLmpvaW4oIiwiKSsiKSJ9LE89ZnVuY3Rpb24odCxlKXtlJiZ0JiZlLnBhcmVudE5vZGUhPT10JiZ0LmFwcGVuZENoaWxkKGUpfSx6PWZ1bmN0aW9uKHQsZSl7ZSYmdCYmZS5wYXJlbnROb2RlPT09dCYmdC5yZW1vdmVDaGlsZChlKX0sUj1mdW5jdGlvbih0LGUsaSl7cmV0dXJuKHBhcnNlRmxvYXQodCl8fDApKkMrKHBhcnNlRmxvYXQoZSl8fDApKkwraX0sRT1mdW5jdGlvbih0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90Lmxhc3RJbmRleE9mKCIlIik+PTA/cGFyc2VGbG9hdCh0KS8xMDAqZTpwYXJzZUZsb2F0KHQpOnR9LE49ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXIucGFyc2UoZSk7aT0raSxpc05hTihpKSYmKGk9MSksbiYmKHQuY29sb3I9ayhuWzBdLG5bMV0sblsyXSksdC5vcGFjaXR5PWkqblszXSl9LFY9ZnVuY3Rpb24odCl7dmFyIGU9ci5wYXJzZSh0KTtyZXR1cm5bayhlWzBdLGVbMV0sZVsyXSksZVszXV19LEI9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUuZmlsbDtpZihudWxsIT1uKWlmKG4gaW5zdGFuY2VvZiBnKXt2YXIgYSxvPTAscj1bMCwwXSxzPTAsbD0xLHU9aS5nZXRCb3VuZGluZ1JlY3QoKSxoPXUud2lkdGgsYz11LmhlaWdodDtpZigibGluZWFyIj09PW4udHlwZSl7YT0iZ3JhZGllbnQiO3ZhciBkPWkudHJhbnNmb3JtLGY9W24ueCpoLG4ueSpjXSxwPVtuLngyKmgsbi55MipjXTtkJiYoUyhmLGYsZCksUyhwLHAsZCkpO3ZhciBtPXBbMF0tZlswXSx2PXBbMV0tZlsxXTtvPTE4MCpNYXRoLmF0YW4yKG0sdikvTWF0aC5QSSxvPDAmJihvKz0zNjApLG88MWUtNiYmKG89MCl9ZWxzZXthPSJncmFkaWVudHJhZGlhbCI7dmFyIGY9W24ueCpoLG4ueSpjXSxkPWkudHJhbnNmb3JtLHk9aS5zY2FsZSx4PWgsXz1jO3I9WyhmWzBdLXUueCkveCwoZlsxXS11LnkpL19dLGQmJlMoZixmLGQpLHgvPXlbMF0qVCxfLz15WzFdKlQ7dmFyIGI9dyh4LF8pO3M9MC9iLGw9MipuLnIvYi1zfXZhciBNPW4uY29sb3JTdG9wcy5zbGljZSgpO00uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0Lm9mZnNldC1lLm9mZnNldH0pO2Zvcih2YXIgST1NLmxlbmd0aCxBPVtdLEM9W10sTD0wO0w8STtMKyspe3ZhciBEPU1bTF0sUD1WKEQuY29sb3IpO0MucHVzaChELm9mZnNldCpsK3MrIiAiK1BbMF0pLDAhPT1MJiZMIT09SS0xfHxBLnB1c2goUCl9aWYoST49Mil7dmFyIGs9QVswXVswXSxPPUFbMV1bMF0sej1BWzBdWzFdKmUub3BhY2l0eSxSPUFbMV1bMV0qZS5vcGFjaXR5O3QudHlwZT1hLHQubWV0aG9kPSJub25lIix0LmZvY3VzPSIxMDAlIix0LmFuZ2xlPW8sdC5jb2xvcj1rLHQuY29sb3IyPU8sdC5jb2xvcnM9Qy5qb2luKCIsIiksdC5vcGFjaXR5PVIsdC5vcGFjaXR5Mj16fSJyYWRpYWwiPT09YSYmKHQuZm9jdXNwb3NpdGlvbj1yLmpvaW4oIiwiKSl9ZWxzZSBOKHQsbixlLm9wYWNpdHkpfSxHPWZ1bmN0aW9uKHQsZSl7bnVsbCE9ZS5saW5lRGFzaCYmKHQuZGFzaHN0eWxlPWUubGluZURhc2guam9pbigiICIpKSxudWxsPT1lLnN0cm9rZXx8ZS5zdHJva2UgaW5zdGFuY2VvZiBnfHxOKHQsZS5zdHJva2UsZS5vcGFjaXR5KX0sSD1mdW5jdGlvbih0LGUsaSxuKXt2YXIgYT0iZmlsbCI9PWUsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpWzBdO251bGwhPWlbZV0mJiJub25lIiE9PWlbZV0mJihhfHwhYSYmaS5saW5lV2lkdGgpPyh0W2E/ImZpbGxlZCI6InN0cm9rZWQiXT0idHJ1ZSIsaVtlXWluc3RhbmNlb2YgZyYmeih0LG8pLG98fChvPW0uY3JlYXRlTm9kZShlKSksYT9CKG8saSxuKTpHKG8saSksTyh0LG8pKToodFthPyJmaWxsZWQiOiJzdHJva2VkIl09ImZhbHNlIix6KHQsbykpfSxXPVtbXSxbXSxbXV0sRj1mdW5jdGlvbih0LGUpe3ZhciBpLG4sYSxyLHMsbCx1PW8uTSxoPW8uQyxjPW8uTCxkPW8uQSxmPW8uUSxwPVtdO2ZvcihyPTA7cjx0Lmxlbmd0aDspe3N3aXRjaChhPXRbcisrXSxuPSIiLGk9MCxhKXtjYXNlIHU6bj0iIG0gIixpPTEscz10W3IrK10sbD10W3IrK10sV1swXVswXT1zLFdbMF1bMV09bDticmVhaztjYXNlIGM6bj0iIGwgIixpPTEscz10W3IrK10sbD10W3IrK10sV1swXVswXT1zLFdbMF1bMV09bDticmVhaztjYXNlIGY6Y2FzZSBoOm49IiBjICIsaT0zO3ZhciBnLG0seD10W3IrK10sdz10W3IrK10sST10W3IrK10sQz10W3IrK107YT09PWY/KGc9SSxtPUMsST0oSSsyKngpLzMsQz0oQysyKncpLzMseD0ocysyKngpLzMsdz0obCsyKncpLzMpOihnPXRbcisrXSxtPXRbcisrXSksV1swXVswXT14LFdbMF1bMV09dyxXWzFdWzBdPUksV1sxXVsxXT1DLFdbMl1bMF09ZyxXWzJdWzFdPW0scz1nLGw9bTticmVhaztjYXNlIGQ6dmFyIEw9MCxEPTAsUD0xLGs9MSxPPTA7ZSYmKEw9ZVs0XSxEPWVbNV0sUD15KGVbMF0qZVswXStlWzFdKmVbMV0pLGs9eShlWzJdKmVbMl0rZVszXSplWzNdKSxPPU1hdGguYXRhbjIoLWVbMV0vayxlWzBdL1ApKTt2YXIgej10W3IrK10sUj10W3IrK10sRT10W3IrK10sTj10W3IrK10sVj10W3IrK10rTyxCPXRbcisrXStWK087cisrO3ZhciBHPXRbcisrXSxIPXorXyhWKSpFLEY9UitiKFYpKk4seD16K18oQikqRSx3PVIrYihCKSpOLFo9Rz8iIHdhICI6IiBhdCAiO01hdGguYWJzKEgteCk8MWUtNCYmKE1hdGguYWJzKEItVik+LjAxP0cmJihIKz0yNzAvVCk6TWF0aC5hYnMoRi1SKTwxZS00P0cmJkg8enx8IUcmJkg+ej93LT0yNzAvVDp3Kz0yNzAvVDpHJiZGPFJ8fCFHJiZGPlI/eCs9MjcwL1Q6eC09MjcwL1QpLHAucHVzaChaLHYoKCh6LUUpKlArTCkqVC1BKSxNLHYoKChSLU4pKmsrRCkqVC1BKSxNLHYoKCh6K0UpKlArTCkqVC1BKSxNLHYoKChSK04pKmsrRCkqVC1BKSxNLHYoKEgqUCtMKSpULUEpLE0sdigoRiprK0QpKlQtQSksTSx2KCh4KlArTCkqVC1BKSxNLHYoKHcqaytEKSpULUEpKSxzPXgsbD13O2JyZWFrO2Nhc2Ugby5SOnZhciBxPVdbMF0saj1XWzFdO3FbMF09dFtyKytdLHFbMV09dFtyKytdLGpbMF09cVswXSt0W3IrK10salsxXT1xWzFdK3RbcisrXSxlJiYoUyhxLHEsZSksUyhqLGosZSkpLHFbMF09dihxWzBdKlQtQSksalswXT12KGpbMF0qVC1BKSxxWzFdPXYocVsxXSpULUEpLGpbMV09dihqWzFdKlQtQSkscC5wdXNoKCIgbSAiLHFbMF0sTSxxWzFdLCIgbCAiLGpbMF0sTSxxWzFdLCIgbCAiLGpbMF0sTSxqWzFdLCIgbCAiLHFbMF0sTSxqWzFdKTticmVhaztjYXNlIG8uWjpwLnB1c2goIiB4ICIpfWlmKGk+MCl7cC5wdXNoKG4pO2Zvcih2YXIgVT0wO1U8aTtVKyspe3ZhciBYPVdbVV07ZSYmUyhYLFgsZSkscC5wdXNoKHYoWFswXSpULUEpLE0sdihYWzFdKlQtQSksVTxpLTE/TToiIil9fX1yZXR1cm4gcC5qb2luKCIiKX07Zi5wcm90b3R5cGUuYnJ1c2hWTUw9ZnVuY3Rpb24odCl7CnZhciBlPXRoaXMuc3R5bGUsaT10aGlzLl92bWxFbDtpfHwoaT1tLmNyZWF0ZU5vZGUoInNoYXBlIiksRChpKSx0aGlzLl92bWxFbD1pKSxIKGksImZpbGwiLGUsdGhpcyksSChpLCJzdHJva2UiLGUsdGhpcyk7dmFyIG49dGhpcy50cmFuc2Zvcm0sYT1udWxsIT1uLG89aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3Ryb2tlIilbMF07aWYobyl7dmFyIHI9ZS5saW5lV2lkdGg7aWYoYSYmIWUuc3Ryb2tlTm9TY2FsZSl7dmFyIHM9blswXSpuWzNdLW5bMV0qblsyXTtyKj15KHgocykpfW8ud2VpZ2h0PXIrInB4In12YXIgbD10aGlzLnBhdGh8fCh0aGlzLnBhdGg9bmV3IHApO3RoaXMuX19kaXJ0eVBhdGgmJihsLmJlZ2luUGF0aCgpLHRoaXMuYnVpbGRQYXRoKGwsdGhpcy5zaGFwZSksbC50b1N0YXRpYygpLHRoaXMuX19kaXJ0eVBhdGg9ITEpLGkucGF0aD1GKGwuZGF0YSx0aGlzLnRyYW5zZm9ybSksaS5zdHlsZS56SW5kZXg9Uih0aGlzLnpsZXZlbCx0aGlzLnosdGhpcy56MiksTyh0LGkpLG51bGwhPWUudGV4dD90aGlzLmRyYXdSZWN0VGV4dCh0LHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkpOnRoaXMucmVtb3ZlUmVjdFRleHQodCl9LGYucHJvdG90eXBlLm9uUmVtb3ZlPWZ1bmN0aW9uKHQpe3oodCx0aGlzLl92bWxFbCksdGhpcy5yZW1vdmVSZWN0VGV4dCh0KX0sZi5wcm90b3R5cGUub25BZGQ9ZnVuY3Rpb24odCl7Tyh0LHRoaXMuX3ZtbEVsKSx0aGlzLmFwcGVuZFJlY3RUZXh0KHQpfTt2YXIgWj1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQudGFnTmFtZSYmIklNRyI9PT10LnRhZ05hbWUudG9VcHBlckNhc2UoKX07Yy5wcm90b3R5cGUuYnJ1c2hWTUw9ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuc3R5bGUsYT1uLmltYWdlO2lmKFooYSkpe3ZhciBvPWEuc3JjO2lmKG89PT10aGlzLl9pbWFnZVNyYyllPXRoaXMuX2ltYWdlV2lkdGgsaT10aGlzLl9pbWFnZUhlaWdodDtlbHNle3ZhciByPWEucnVudGltZVN0eWxlLHM9ci53aWR0aCxsPXIuaGVpZ2h0O3Iud2lkdGg9ImF1dG8iLHIuaGVpZ2h0PSJhdXRvIixlPWEud2lkdGgsaT1hLmhlaWdodCxyLndpZHRoPXMsci5oZWlnaHQ9bCx0aGlzLl9pbWFnZVNyYz1vLHRoaXMuX2ltYWdlV2lkdGg9ZSx0aGlzLl9pbWFnZUhlaWdodD1pfWE9b31lbHNlIGE9PT10aGlzLl9pbWFnZVNyYyYmKGU9dGhpcy5faW1hZ2VXaWR0aCxpPXRoaXMuX2ltYWdlSGVpZ2h0KTtpZihhKXt2YXIgdT1uLnh8fDAsaD1uLnl8fDAsYz1uLndpZHRoLGQ9bi5oZWlnaHQsZj1uLnNXaWR0aCxwPW4uc0hlaWdodCxnPW4uc3h8fDAseD1uLnN5fHwwLF89ZiYmcCxiPXRoaXMuX3ZtbEVsO2J8fChiPW0uZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLEQoYiksdGhpcy5fdm1sRWw9Yik7dmFyIFQsQT1iLnN0eWxlLEM9ITEsTD0xLFA9MTtpZih0aGlzLnRyYW5zZm9ybSYmKFQ9dGhpcy50cmFuc2Zvcm0sTD15KFRbMF0qVFswXStUWzFdKlRbMV0pLFA9eShUWzJdKlRbMl0rVFszXSpUWzNdKSxDPVRbMV18fFRbMl0pLEMpe3ZhciBrPVt1LGhdLHo9W3UrYyxoXSxFPVt1LGgrZF0sTj1bdStjLGgrZF07UyhrLGssVCksUyh6LHosVCksUyhFLEUsVCksUyhOLE4sVCk7dmFyIFY9dyhrWzBdLHpbMF0sRVswXSxOWzBdKSxCPXcoa1sxXSx6WzFdLEVbMV0sTlsxXSksRz1bXTtHLnB1c2goIk0xMT0iLFRbMF0vTCxNLCJNMTI9IixUWzJdL1AsTSwiTTIxPSIsVFsxXS9MLE0sIk0yMj0iLFRbM10vUCxNLCJEeD0iLHYodSpMK1RbNF0pLE0sIkR5PSIsdihoKlArVFs1XSkpLEEucGFkZGluZz0iMCAiK3YoVikrInB4ICIrdihCKSsicHggMCIsQS5maWx0ZXI9SSsiLk1hdHJpeCgiK0cuam9pbigiIikrIiwgU2l6aW5nTWV0aG9kPWNsaXApIn1lbHNlIFQmJih1PXUqTCtUWzRdLGg9aCpQK1RbNV0pLEEuZmlsdGVyPSIiLEEubGVmdD12KHUpKyJweCIsQS50b3A9dihoKSsicHgiO3ZhciBIPXRoaXMuX2ltYWdlRWwsVz10aGlzLl9jcm9wRWw7SHx8KEg9bS5kb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5faW1hZ2VFbD1IKTt2YXIgRj1ILnN0eWxlO2lmKF8pe2lmKGUmJmkpRi53aWR0aD12KEwqZSpjL2YpKyJweCIsRi5oZWlnaHQ9dihQKmkqZC9wKSsicHgiO2Vsc2V7dmFyIHE9bmV3IEltYWdlLGo9dGhpcztxLm9ubG9hZD1mdW5jdGlvbigpe3Eub25sb2FkPW51bGwsZT1xLndpZHRoLGk9cS5oZWlnaHQsRi53aWR0aD12KEwqZSpjL2YpKyJweCIsRi5oZWlnaHQ9dihQKmkqZC9wKSsicHgiLGouX2ltYWdlV2lkdGg9ZSxqLl9pbWFnZUhlaWdodD1pLGouX2ltYWdlU3JjPWF9LHEuc3JjPWF9V3x8KFc9bS5kb2MuY3JlYXRlRWxlbWVudCgiZGl2IiksVy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIix0aGlzLl9jcm9wRWw9Vyk7dmFyIFU9Vy5zdHlsZTtVLndpZHRoPXYoKGMrZypjL2YpKkwpLFUuaGVpZ2h0PXYoKGQreCpkL3ApKlApLFUuZmlsdGVyPUkrIi5NYXRyaXgoRHg9IistZypjL2YqTCsiLER5PSIrLXgqZC9wKlArIikiLFcucGFyZW50Tm9kZXx8Yi5hcHBlbmRDaGlsZChXKSxILnBhcmVudE5vZGUhPVcmJlcuYXBwZW5kQ2hpbGQoSCl9ZWxzZSBGLndpZHRoPXYoTCpjKSsicHgiLEYuaGVpZ2h0PXYoUCpkKSsicHgiLGIuYXBwZW5kQ2hpbGQoSCksVyYmVy5wYXJlbnROb2RlJiYoYi5yZW1vdmVDaGlsZChXKSx0aGlzLl9jcm9wRWw9bnVsbCk7dmFyIFg9IiIsWT1uLm9wYWNpdHk7WTwxJiYoWCs9Ii5BbHBoYShvcGFjaXR5PSIrdigxMDAqWSkrIikgIiksWCs9SSsiLkFscGhhSW1hZ2VMb2FkZXIoc3JjPSIrYSsiLCBTaXppbmdNZXRob2Q9c2NhbGUpIixGLmZpbHRlcj1YLGIuc3R5bGUuekluZGV4PVIodGhpcy56bGV2ZWwsdGhpcy56LHRoaXMuejIpLE8odCxiKSxudWxsIT1uLnRleHQmJnRoaXMuZHJhd1JlY3RUZXh0KHQsdGhpcy5nZXRCb3VuZGluZ1JlY3QoKSl9fSxjLnByb3RvdHlwZS5vblJlbW92ZT1mdW5jdGlvbih0KXt6KHQsdGhpcy5fdm1sRWwpLHRoaXMuX3ZtbEVsPW51bGwsdGhpcy5fY3JvcEVsPW51bGwsdGhpcy5faW1hZ2VFbD1udWxsLHRoaXMucmVtb3ZlUmVjdFRleHQodCl9LGMucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe08odCx0aGlzLl92bWxFbCksdGhpcy5hcHBlbmRSZWN0VGV4dCh0KX07dmFyIHEsaj0ibm9ybWFsIixVPXt9LFg9MCxZPTEwMCwkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEs9ZnVuY3Rpb24odCl7dmFyIGU9VVt0XTtpZighZSl7WD5ZJiYoWD0wLFU9e30pO3ZhciBpLG49JC5zdHlsZTt0cnl7bi5mb250PXQsaT1uLmZvbnRGYW1pbHkuc3BsaXQoIiwiKVswXX1jYXRjaCh0KXt9ZT17c3R5bGU6bi5mb250U3R5bGV8fGosdmFyaWFudDpuLmZvbnRWYXJpYW50fHxqLHdlaWdodDpuLmZvbnRXZWlnaHR8fGosc2l6ZTowfHBhcnNlRmxvYXQobi5mb250U2l6ZXx8MTIpLGZhbWlseTppfHwiTWljcm9zb2Z0IFlhSGVpIn0sVVt0XT1lLFgrK31yZXR1cm4gZX07cy5tZWFzdXJlVGV4dD1mdW5jdGlvbih0LGUpe3ZhciBpPW0uZG9jO3F8fChxPWkuY3JlYXRlRWxlbWVudCgiZGl2IikscS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTIwMDAwcHg7bGVmdDowO3BhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6bm9uZTt3aGl0ZS1zcGFjZTpwcmU7IixtLmRvYy5ib2R5LmFwcGVuZENoaWxkKHEpKTt0cnl7cS5zdHlsZS5mb250PWV9Y2F0Y2godCl7fXJldHVybiBxLmlubmVySFRNTD0iIixxLmFwcGVuZENoaWxkKGkuY3JlYXRlVGV4dE5vZGUodCkpLHt3aWR0aDpxLm9mZnNldFdpZHRofX07Zm9yKHZhciBKPW5ldyBhLFE9ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9dGhpcy5zdHlsZTt0aGlzLl9fZGlydHkmJmwubm9ybWFsaXplVGV4dFN0eWxlKGEsITApO3ZhciBvPWEudGV4dDtpZihudWxsIT1vJiYobys9IiIpLG8pe2lmKGEucmljaCl7dmFyIHI9cy5wYXJzZVJpY2hUZXh0KG8sYSk7bz1bXTtmb3IodmFyIHU9MDt1PHIubGluZXMubGVuZ3RoO3UrKyl7Zm9yKHZhciBoPXIubGluZXNbdV0udG9rZW5zLGM9W10sZD0wO2Q8aC5sZW5ndGg7ZCsrKWMucHVzaChoW2RdLnRleHQpO28ucHVzaChjLmpvaW4oIiIpKX1vPW8uam9pbigiXG4iKX12YXIgZixwLGc9YS50ZXh0QWxpZ24seT1hLnRleHRWZXJ0aWNhbEFsaWduLHg9SyhhLmZvbnQpLF89eC5zdHlsZSsiICIreC52YXJpYW50KyIgIit4LndlaWdodCsiICIreC5zaXplKydweCAiJyt4LmZhbWlseSsnIic7aT1pfHxzLmdldEJvdW5kaW5nUmVjdChvLF8sZyx5KTt2YXIgYj10aGlzLnRyYW5zZm9ybTtpZihiJiYhbiYmKEouY29weShlKSxKLmFwcGx5VHJhbnNmb3JtKGIpLGU9SiksbilmPWUueCxwPWUueTtlbHNle3ZhciB3PWEudGV4dFBvc2l0aW9uLEk9YS50ZXh0RGlzdGFuY2U7aWYodyBpbnN0YW5jZW9mIEFycmF5KWY9ZS54K0Uod1swXSxlLndpZHRoKSxwPWUueStFKHdbMV0sZS5oZWlnaHQpLGc9Z3x8ImxlZnQiO2Vsc2V7dmFyIFQ9cy5hZGp1c3RUZXh0UG9zaXRpb25PblJlY3QodyxlLEkpO2Y9VC54LHA9VC55LGc9Z3x8VC50ZXh0QWxpZ24seT15fHxULnRleHRWZXJ0aWNhbEFsaWdufX1mPXMuYWRqdXN0VGV4dFgoZixpLndpZHRoLGcpLHA9cy5hZGp1c3RUZXh0WShwLGkuaGVpZ2h0LHkpLHArPWkuaGVpZ2h0LzI7dmFyIEEsQyxMLGs9bS5jcmVhdGVOb2RlLHo9dGhpcy5fdGV4dFZtbEVsO3o/KEw9ei5maXJzdENoaWxkLEE9TC5uZXh0U2libGluZyxDPUEubmV4dFNpYmxpbmcpOih6PWsoImxpbmUiKSxBPWsoInBhdGgiKSxDPWsoInRleHRwYXRoIiksTD1rKCJza2V3IiksQy5zdHlsZVsidi10ZXh0LWFsaWduIl09ImxlZnQiLEQoeiksQS50ZXh0cGF0aG9rPSEwLEMub249ITAsei5mcm9tPSIwIDAiLHoudG89IjEwMDAgMC4wNSIsTyh6LEwpLE8oeixBKSxPKHosQyksdGhpcy5fdGV4dFZtbEVsPXopO3ZhciBOPVtmLHBdLFY9ei5zdHlsZTtiJiZuPyhTKE4sTixiKSxMLm9uPSEwLEwubWF0cml4PWJbMF0udG9GaXhlZCgzKStNK2JbMl0udG9GaXhlZCgzKStNK2JbMV0udG9GaXhlZCgzKStNK2JbM10udG9GaXhlZCgzKSsiLDAsMCIsTC5vZmZzZXQ9KHYoTlswXSl8fDApKyIsIisodihOWzFdKXx8MCksTC5vcmlnaW49IjAgMCIsVi5sZWZ0PSIwcHgiLFYudG9wPSIwcHgiKTooTC5vbj0hMSxWLmxlZnQ9dihmKSsicHgiLFYudG9wPXYocCkrInB4IiksQy5zdHJpbmc9UChvKTt0cnl7Qy5zdHlsZS5mb250PV99Y2F0Y2godCl7fUgoeiwiZmlsbCIse2ZpbGw6YS50ZXh0RmlsbCxvcGFjaXR5OmEub3BhY2l0eX0sdGhpcyksSCh6LCJzdHJva2UiLHtzdHJva2U6YS50ZXh0U3Ryb2tlLG9wYWNpdHk6YS5vcGFjaXR5LGxpbmVEYXNoOmEubGluZURhc2h9LHRoaXMpLHouc3R5bGUuekluZGV4PVIodGhpcy56bGV2ZWwsdGhpcy56LHRoaXMuejIpLE8odCx6KX19LHR0PWZ1bmN0aW9uKHQpe3oodCx0aGlzLl90ZXh0Vm1sRWwpLHRoaXMuX3RleHRWbWxFbD1udWxsfSxldD1mdW5jdGlvbih0KXtPKHQsdGhpcy5fdGV4dFZtbEVsKX0saXQ9W3UsaCxjLGYsZF0sbnQ9MDtudDxpdC5sZW5ndGg7bnQrKyl7dmFyIGF0PWl0W250XS5wcm90b3R5cGU7YXQuZHJhd1JlY3RUZXh0PVEsYXQucmVtb3ZlUmVjdFRleHQ9dHQsYXQuYXBwZW5kUmVjdFRleHQ9ZXR9ZC5wcm90b3R5cGUuYnJ1c2hWTUw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdHlsZTtudWxsIT1lLnRleHQ/dGhpcy5kcmF3UmVjdFRleHQodCx7eDplLnh8fDAseTplLnl8fDAsd2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5nZXRCb3VuZGluZ1JlY3QoKSwhMCk6dGhpcy5yZW1vdmVSZWN0VGV4dCh0KX0sZC5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVSZWN0VGV4dCh0KX0sZC5wcm90b3R5cGUub25BZGQ9ZnVuY3Rpb24odCl7dGhpcy5hcHBlbmRSZWN0VGV4dCh0KX19fSxmdW5jdGlvbih0LGUsaSl7aSgyNDYpLGkoOTMpLnJlZ2lzdGVyUGFpbnRlcigidm1sIixpKDI0NSkpfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPWkoMjQ5KSxvPWkoMik7by5yZWdpc3RlckFjdGlvbih7dHlwZToiZ2VvUm9hbSIsZXZlbnQ6Imdlb1JvYW0iLHVwZGF0ZToidXBkYXRlTGF5b3V0In0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmNvbXBvbmVudFR5cGV8fCJzZXJpZXMiO2UuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6aSxxdWVyeTp0fSxmdW5jdGlvbihlKXt2YXIgbz1lLmNvb3JkaW5hdGVTeXN0ZW07aWYoImdlbyI9PT1vLnR5cGUpe3ZhciByPWEudXBkYXRlQ2VudGVyQW5kWm9vbShvLHQsZS5nZXQoInNjYWxlTGltaXQiKSk7ZS5zZXRDZW50ZXImJmUuc2V0Q2VudGVyKHIuY2VudGVyKSxlLnNldFpvb20mJmUuc2V0Wm9vbShyLnpvb20pLCJzZXJpZXMiPT09aSYmbi5lYWNoKGUuc2VyaWVzR3JvdXAsZnVuY3Rpb24odCl7dC5zZXRDZW50ZXIoci5jZW50ZXIpLHQuc2V0Wm9vbShyLnpvb20pfSl9fSl9KX0sZnVuY3Rpb24odCxlKXt2YXIgaT17fTtpLnVwZGF0ZUNlbnRlckFuZFpvb209ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0Wm9vbSgpLGE9dC5nZXRDZW50ZXIoKSxvPWUuem9vbSxyPXQuZGF0YVRvUG9pbnQoYSk7aWYobnVsbCE9ZS5keCYmbnVsbCE9ZS5keSl7clswXS09ZS5keCxyWzFdLT1lLmR5O3ZhciBhPXQucG9pbnRUb0RhdGEocik7dC5zZXRDZW50ZXIoYSl9aWYobnVsbCE9byl7aWYoaSl7dmFyIHM9aS5taW58fDAsbD1pLm1heHx8MS8wO289TWF0aC5tYXgoTWF0aC5taW4obipvLGwpLHMpL259dC5zY2FsZVswXSo9byx0LnNjYWxlWzFdKj1vO3ZhciB1PXQucG9zaXRpb24saD0oZS5vcmlnaW5YLXVbMF0pKihvLTEpLGM9KGUub3JpZ2luWS11WzFdKSooby0xKTt1WzBdLT1oLHVbMV0tPWMsdC51cGRhdGVUcmFuc2Zvcm0oKTt2YXIgYT10LnBvaW50VG9EYXRhKHIpO3Quc2V0Q2VudGVyKGEpLHQuc2V0Wm9vbShvKm4pfXJldHVybntjZW50ZXI6dC5nZXRDZW50ZXIoKSx6b29tOnQuZ2V0Wm9vbSgpfX0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoIWV8fCJ2aWV3Ij09PWUudHlwZSl7dmFyIGk9ZS5nZXRCb3VuZGluZ1JlY3QoKSxhPXQuZ2V0RGF0YSgpLG89YS5ncmFwaCxyPTAscz1hLmdldFN1bSgidmFsdWUiKSxsPTIqTWF0aC5QSS8oc3x8YS5jb3VudCgpKSx1PWkud2lkdGgvMitpLngsaD1pLmhlaWdodC8yK2kueSxjPU1hdGgubWluKGkud2lkdGgsaS5oZWlnaHQpLzI7by5lYWNoTm9kZShmdW5jdGlvbih0KXt2YXIgZT10LmdldFZhbHVlKCJ2YWx1ZSIpO3IrPWwqKHM/ZToxKS8yLHQuc2V0TGF5b3V0KFtjKk1hdGguY29zKHIpK3UsYypNYXRoLnNpbihyKStoXSkscis9bCoocz9lOjEpLzJ9KSxhLnNldExheW91dCh7Y3g6dSxjeTpofSksby5lYWNoRWRnZShmdW5jdGlvbih0KXt2YXIgZSxpPXQuZ2V0TW9kZWwoKS5nZXQoImxpbmVTdHlsZS5ub3JtYWwuY3VydmVuZXNzIil8fDAsYT1uLmNsb25lKHQubm9kZTEuZ2V0TGF5b3V0KCkpLG89bi5jbG9uZSh0Lm5vZGUyLmdldExheW91dCgpKSxyPShhWzBdK29bMF0pLzIscz0oYVsxXStvWzFdKS8yOytpJiYoaSo9MyxlPVt1KmkrciooMS1pKSxoKmkrcyooMS1pKV0pLHQuc2V0TGF5b3V0KFthLG8sZV0pfSl9fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QuZWFjaEVkZ2UoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRNb2RlbCgpLmdldCgibGluZVN0eWxlLm5vcm1hbC5jdXJ2ZW5lc3MiKXx8MCxpPW4uY2xvbmUodC5ub2RlMS5nZXRMYXlvdXQoKSksYT1uLmNsb25lKHQubm9kZTIuZ2V0TGF5b3V0KCkpLG89W2ksYV07K2UmJm8ucHVzaChbKGlbMF0rYVswXSkvMi0oaVsxXS1hWzFdKSplLChpWzFdK2FbMV0pLzItKGFbMF0taVswXSkqZV0pLHQuc2V0TGF5b3V0KG8pfSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoIWV8fCJ2aWV3Ij09PWUudHlwZSl7dmFyIGk9dC5nZXRHcmFwaCgpO2kuZWFjaE5vZGUoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRNb2RlbCgpO3Quc2V0TGF5b3V0KFsrZS5nZXQoIngiKSwrZS5nZXQoInkiKV0pfSksbihpKX19fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7YS5Hcm91cC5jYWxsKHRoaXMpLHRoaXMuYWRkKHRoaXMuY3JlYXRlTGluZSh0LGUsaSkpLHRoaXMuX3VwZGF0ZUVmZmVjdFN5bWJvbCh0LGUpfXZhciBhPWkoMyksbz1pKDExMSkscj1pKDEpLHM9aSgyNCksbD1pKDYpLHU9aSgyMCksaD1uLnByb3RvdHlwZTtoLmNyZWF0ZUxpbmU9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuZXcgbyh0LGUsaSl9LGguX3VwZGF0ZUVmZmVjdFN5bWJvbD1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0SXRlbU1vZGVsKGUpLG49aS5nZXRNb2RlbCgiZWZmZWN0IiksYT1uLmdldCgic3ltYm9sU2l6ZSIpLG89bi5nZXQoInN5bWJvbCIpO3IuaXNBcnJheShhKXx8KGE9W2EsYV0pO3ZhciBsPW4uZ2V0KCJjb2xvciIpfHx0LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKSx1PXRoaXMuY2hpbGRBdCgxKTt0aGlzLl9zeW1ib2xUeXBlIT09byYmKHRoaXMucmVtb3ZlKHUpLHU9cy5jcmVhdGVTeW1ib2wobywtLjUsLS41LDEsMSxsKSx1LnoyPTEwMCx1LmN1bGxpbmc9ITAsdGhpcy5hZGQodSkpLHUmJih1LnNldFN0eWxlKCJzaGFkb3dDb2xvciIsbCksdS5zZXRTdHlsZShuLmdldEl0ZW1TdHlsZShbImNvbG9yIl0pKSx1LmF0dHIoInNjYWxlIixhKSx1LnNldENvbG9yKGwpLHUuYXR0cigic2NhbGUiLGEpLHRoaXMuX3N5bWJvbFR5cGU9byx0aGlzLl91cGRhdGVFZmZlY3RBbmltYXRpb24odCxuLGUpKX0saC5fdXBkYXRlRWZmZWN0QW5pbWF0aW9uPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLmNoaWxkQXQoMSk7aWYobil7dmFyIGE9dGhpcyxvPXQuZ2V0SXRlbUxheW91dChpKSxzPTFlMyplLmdldCgicGVyaW9kIiksbD1lLmdldCgibG9vcCIpLHU9ZS5nZXQoImNvbnN0YW50U3BlZWQiKSxoPXIucmV0cmlldmUoZS5nZXQoImRlbGF5IiksZnVuY3Rpb24oZSl7cmV0dXJuIGUvdC5jb3VudCgpKnMvM30pLGM9ImZ1bmN0aW9uIj09dHlwZW9mIGg7aWYobi5pZ25vcmU9ITAsdGhpcy51cGRhdGVBbmltYXRpb25Qb2ludHMobixvKSx1PjAmJihzPXRoaXMuZ2V0TGluZUxlbmd0aChuKS91KjFlMykscyE9PXRoaXMuX3BlcmlvZHx8bCE9PXRoaXMuX2xvb3Ape24uc3RvcEFuaW1hdGlvbigpO3ZhciBkPWg7YyYmKGQ9aChpKSksbi5fX3Q+MCYmKGQ9LXMqbi5fX3QpLG4uX190PTA7dmFyIGY9bi5hbmltYXRlKCIiLGwpLndoZW4ocyx7X190OjF9KS5kZWxheShkKS5kdXJpbmcoZnVuY3Rpb24oKXthLnVwZGF0ZVN5bWJvbFBvc2l0aW9uKG4pfSk7bHx8Zi5kb25lKGZ1bmN0aW9uKCl7YS5yZW1vdmUobil9KSxmLnN0YXJ0KCl9dGhpcy5fcGVyaW9kPXMsdGhpcy5fbG9vcD1sfX0saC5nZXRMaW5lTGVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBsLmRpc3QodC5fX3AxLHQuX19jcDEpK2wuZGlzdCh0Ll9fY3AxLHQuX19wMil9LGgudXBkYXRlQW5pbWF0aW9uUG9pbnRzPWZ1bmN0aW9uKHQsZSl7dC5fX3AxPWVbMF0sdC5fX3AyPWVbMV0sdC5fX2NwMT1lWzJdfHxbKGVbMF1bMF0rZVsxXVswXSkvMiwoZVswXVsxXStlWzFdWzFdKS8yXX0saC51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmNoaWxkQXQoMCkudXBkYXRlRGF0YSh0LGUsaSksdGhpcy5fdXBkYXRlRWZmZWN0U3ltYm9sKHQsZSl9LGgudXBkYXRlU3ltYm9sUG9zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dC5fX3AxLGk9dC5fX3AyLG49dC5fX2NwMSxhPXQuX190LG89dC5wb3NpdGlvbixyPXUucXVhZHJhdGljQXQscz11LnF1YWRyYXRpY0Rlcml2YXRpdmVBdDtvWzBdPXIoZVswXSxuWzBdLGlbMF0sYSksb1sxXT1yKGVbMV0sblsxXSxpWzFdLGEpO3ZhciBsPXMoZVswXSxuWzBdLGlbMF0sYSksaD1zKGVbMV0sblsxXSxpWzFdLGEpO3Qucm90YXRpb249LU1hdGguYXRhbjIoaCxsKS1NYXRoLlBJLzIsdC5pZ25vcmU9ITF9LGgudXBkYXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5jaGlsZEF0KDApLnVwZGF0ZUxheW91dCh0LGUpO3ZhciBpPXQuZ2V0SXRlbU1vZGVsKGUpLmdldE1vZGVsKCJlZmZlY3QiKTt0aGlzLl91cGRhdGVFZmZlY3RBbmltYXRpb24odCxpLGUpfSxyLmluaGVyaXRzKG4sYS5Hcm91cCksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXthLkdyb3VwLmNhbGwodGhpcyksdGhpcy5fY3JlYXRlUG9seWxpbmUodCxlLGkpfXZhciBhPWkoMyksbz1pKDEpLHI9bi5wcm90b3R5cGU7ci5fY3JlYXRlUG9seWxpbmU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXQuZ2V0SXRlbUxheW91dChlKSxvPW5ldyBhLlBvbHlsaW5lKHtzaGFwZTp7cG9pbnRzOm59fSk7dGhpcy5hZGQobyksdGhpcy5fdXBkYXRlQ29tbW9uU3RsKHQsZSxpKX0sci51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10Lmhvc3RNb2RlbCxvPXRoaXMuY2hpbGRBdCgwKSxyPXtzaGFwZTp7cG9pbnRzOnQuZ2V0SXRlbUxheW91dChlKX19O2EudXBkYXRlUHJvcHMobyxyLG4sZSksdGhpcy5fdXBkYXRlQ29tbW9uU3RsKHQsZSxpKX0sci5fdXBkYXRlQ29tbW9uU3RsPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLmNoaWxkQXQoMCkscj10LmdldEl0ZW1Nb2RlbChlKSxzPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpLGw9aSYmaS5saW5lU3R5bGUsdT1pJiZpLmhvdmVyTGluZVN0eWxlO2kmJiF0Lmhhc0l0ZW1PcHRpb258fChsPXIuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKS5nZXRMaW5lU3R5bGUoKSx1PXIuZ2V0TW9kZWwoImxpbmVTdHlsZS5lbXBoYXNpcyIpLmdldExpbmVTdHlsZSgpKSxuLnVzZVN0eWxlKG8uZGVmYXVsdHMoe3N0cm9rZU5vU2NhbGU6ITAsZmlsbDoibm9uZSIsc3Ryb2tlOnN9LGwpKSxuLmhvdmVyU3R5bGU9dSxhLnNldEhvdmVyU3R5bGUodGhpcyl9LHIudXBkYXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jaGlsZEF0KDApO2kuc2V0U2hhcGUoInBvaW50cyIsdC5nZXRJdGVtTGF5b3V0KGUpKX0sby5pbmhlcml0cyhuLGEuR3JvdXApLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxNCksYT1pKDQzMiksbz1pKDI3Mikscj1pKDI1KSxzPWkoMjYpLGw9aSgxKSx1PWkoMjgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSxoLGMpe2Zvcih2YXIgZD1uZXcgYShoKSxmPTA7Zjx0Lmxlbmd0aDtmKyspZC5hZGROb2RlKGwucmV0cmlldmUodFtmXS5pZCx0W2ZdLm5hbWUsZiksZik7Zm9yKHZhciBwPVtdLGc9W10sbT0wLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIHY9ZVtmXSx5PXYuc291cmNlLHg9di50YXJnZXQ7ZC5hZGRFZGdlKHkseCxtKSYmKGcucHVzaCh2KSxwLnB1c2gobC5yZXRyaWV2ZSh2LmlkLHkrIiA+ICIreCkpLG0rKyl9dmFyIF8sYj1pLmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpO2lmKCJjYXJ0ZXNpYW4yZCI9PT1ifHwicG9sYXIiPT09YilfPXUodCxpLGkuZWNNb2RlbCk7ZWxzZXt2YXIgdz1zLmdldChiKSxTPXIoKHcmJiJ2aWV3IiE9PXcudHlwZT93LmRpbWVuc2lvbnN8fFtdOltdKS5jb25jYXQoWyJ2YWx1ZSJdKSx0KTtfPW5ldyBuKFMsaSksXy5pbml0RGF0YSh0KX12YXIgTT1uZXcgbihbInZhbHVlIl0saSk7cmV0dXJuIE0uaW5pdERhdGEoZyxwKSxjJiZjKF8sTSksbyh7bWFpbkRhdGE6XyxzdHJ1Y3Q6ZCxzdHJ1Y3RBdHRyOiJncmFwaCIsZGF0YXM6e25vZGU6XyxlZGdlOk19LGRhdGFzQXR0cjp7bm9kZToiZGF0YSIsZWRnZToiZWRnZURhdGEifX0pLGQudXBkYXRlKCksZH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9e307YS5sYXlvdXQ9ZnVuY3Rpb24odCxlKXtlPWV8fHt9O3ZhciBpPXQuY29vcmRpbmF0ZVN5c3RlbSxhPXQuYXhpcyxvPXt9LHI9YS5wb3NpdGlvbixzPWEub3JpZW50LGw9aS5nZXRSZWN0KCksdT1bbC54LGwueCtsLndpZHRoLGwueSxsLnkrbC5oZWlnaHRdLGg9e2hvcml6b250YWw6e3RvcDp1WzJdLGJvdHRvbTp1WzNdfSx2ZXJ0aWNhbDp7bGVmdDp1WzBdLHJpZ2h0OnVbMV19fTtvLnBvc2l0aW9uPVsidmVydGljYWwiPT09cz9oLnZlcnRpY2FsW3JdOnVbMF0sImhvcml6b250YWwiPT09cz9oLmhvcml6b250YWxbcl06dVszXV07dmFyIGM9e2hvcml6b250YWw6MCx2ZXJ0aWNhbDoxfTtvLnJvdGF0aW9uPU1hdGguUEkvMipjW3NdO3ZhciBkPXt0b3A6LTEsYm90dG9tOjEscmlnaHQ6MSxsZWZ0Oi0xfTtvLmxhYmVsRGlyZWN0aW9uPW8udGlja0RpcmVjdGlvbj1vLm5hbWVEaXJlY3Rpb249ZFtyXSx0LmdldCgiYXhpc1RpY2suaW5zaWRlIikmJihvLnRpY2tEaXJlY3Rpb249LW8udGlja0RpcmVjdGlvbiksbi5yZXRyaWV2ZShlLmxhYmVsSW5zaWRlLHQuZ2V0KCJheGlzTGFiZWwuaW5zaWRlIikpJiYoby5sYWJlbERpcmVjdGlvbj0tby5sYWJlbERpcmVjdGlvbik7dmFyIGY9ZS5yb3RhdGU7cmV0dXJuIG51bGw9PWYmJihmPXQuZ2V0KCJheGlzTGFiZWwucm90YXRlIikpLG8ubGFiZWxSb3RhdGlvbj0idG9wIj09PXI/LWY6ZixvLmxhYmVsSW50ZXJ2YWw9YS5nZXRMYWJlbEludGVydmFsKCksby56Mj0xLG99LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXQuZ2V0SXRlbVN0eWxlKCksbj10LmdldCgiYXJlYUNvbG9yIik7cmV0dXJuIG51bGwhPW4mJihpLmZpbGw9biksaX1mdW5jdGlvbiBhKHQsZSxpLG4sYSl7aS5vZmYoImNsaWNrIiksaS5vZmYoIm1vdXNlZG93biIpLGUuZ2V0KCJzZWxlY3RlZE1vZGUiKSYmKGkub24oIm1vdXNlZG93biIsZnVuY3Rpb24oKXt0Ll9tb3VzZURvd25GbGFnPSEwfSksaS5vbigiY2xpY2siLGZ1bmN0aW9uKHIpe2lmKHQuX21vdXNlRG93bkZsYWcpe3QuX21vdXNlRG93bkZsYWc9ITE7Zm9yKHZhciBzPXIudGFyZ2V0OyFzLl9fcmVnaW9uczspcz1zLnBhcmVudDtpZihzKXt2YXIgbD17dHlwZTooImdlbyI9PT1lLm1haW5UeXBlPyJnZW8iOiJtYXAiKSsiVG9nZ2xlU2VsZWN0IixiYXRjaDpjLm1hcChzLl9fcmVnaW9ucyxmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0Lm5hbWUsZnJvbTphLnVpZH19KX07bFtlLm1haW5UeXBlKyJJZCJdPWUuaWQsbi5kaXNwYXRjaEFjdGlvbihsKSxvKGUsaSl9fX0pKX1mdW5jdGlvbiBvKHQsZSl7ZS5lYWNoQ2hpbGQoZnVuY3Rpb24oZSl7Yy5lYWNoKGUuX19yZWdpb25zLGZ1bmN0aW9uKGkpe2UudHJpZ2dlcih0LmlzU2VsZWN0ZWQoaS5uYW1lKT8iZW1waGFzaXMiOiJub3JtYWwiKX0pfSl9ZnVuY3Rpb24gcih0LGUpe3ZhciBpPW5ldyBoLkdyb3VwO3RoaXMuX2NvbnRyb2xsZXI9bmV3IHModC5nZXRacigpKSx0aGlzLl9jb250cm9sbGVySG9zdD17dGFyZ2V0OmU/aTpudWxsfSx0aGlzLmdyb3VwPWksdGhpcy5fdXBkYXRlR3JvdXA9ZSx0aGlzLl9tb3VzZURvd25GbGFnfXZhciBzPWkoMTAwKSxsPWkoMjU4KSx1PWkoMTMzKSxoPWkoMyksYz1pKDEpO3IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpyLGRyYXc6ZnVuY3Rpb24odCxlLGkscixzKXt2YXIgbD0iZ2VvIj09PXQubWFpblR5cGUsdT10LmdldERhdGEmJnQuZ2V0RGF0YSgpO2wmJmUuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToibWFwIn0sZnVuY3Rpb24oZSl7dXx8ZS5nZXRIb3N0R2VvTW9kZWwoKSE9PXR8fCh1PWUuZ2V0RGF0YSgpKX0pO3ZhciBkPXQuY29vcmRpbmF0ZVN5c3RlbSxmPXRoaXMuZ3JvdXAscD1kLnNjYWxlLGc9e3Bvc2l0aW9uOmQucG9zaXRpb24sc2NhbGU6cH07IWYuY2hpbGRBdCgwKXx8cz9mLmF0dHIoZyk6aC51cGRhdGVQcm9wcyhmLGcsdCksZi5yZW1vdmVBbGwoKTt2YXIgbT1bIml0ZW1TdHlsZSIsIm5vcm1hbCJdLHY9WyJpdGVtU3R5bGUiLCJlbXBoYXNpcyJdLHk9WyJsYWJlbCIsIm5vcm1hbCJdLHg9WyJsYWJlbCIsImVtcGhhc2lzIl0sXz1jLmNyZWF0ZUhhc2hNYXAoKTtjLmVhY2goZC5yZWdpb25zLGZ1bmN0aW9uKGUpe3ZhciBpPV8uZ2V0KGUubmFtZSl8fF8uc2V0KGUubmFtZSxuZXcgaC5Hcm91cCksYT1uZXcgaC5Db21wb3VuZFBhdGgoe3NoYXBlOntwYXRoczpbXX19KTtpLmFkZChhKTt2YXIgbyxyPXQuZ2V0UmVnaW9uTW9kZWwoZS5uYW1lKXx8dCxzPXIuZ2V0TW9kZWwobSksZD1yLmdldE1vZGVsKHYpLGc9bihzLHApLGI9bihkLHApLHc9ci5nZXRNb2RlbCh5KSxTPXIuZ2V0TW9kZWwoeCk7aWYodSl7bz11LmluZGV4T2ZOYW1lKGUubmFtZSk7dmFyIE09dS5nZXRJdGVtVmlzdWFsKG8sImNvbG9yIiwhMCk7TSYmKGcuZmlsbD1NKX1jLmVhY2goZS5nZW9tZXRyaWVzLGZ1bmN0aW9uKHQpe2lmKCJwb2x5Z29uIj09PXQudHlwZSl7YS5zaGFwZS5wYXRocy5wdXNoKG5ldyBoLlBvbHlnb24oe3NoYXBlOntwb2ludHM6dC5leHRlcmlvcn19KSk7Zm9yKHZhciBlPTA7ZTwodC5pbnRlcmlvcnM/dC5pbnRlcmlvcnMubGVuZ3RoOjApO2UrKylhLnNoYXBlLnBhdGhzLnB1c2gobmV3IGguUG9seWdvbih7c2hhcGU6e3BvaW50czp0LmludGVyaW9yc1tlXX19KSl9fSksYS5zZXRTdHlsZShnKSxhLnN0eWxlLnN0cm9rZU5vU2NhbGU9ITAsYS5jdWxsaW5nPSEwO3ZhciBJPXcuZ2V0KCJzaG93IiksVD1TLmdldCgic2hvdyIpLEE9dSYmaXNOYU4odS5nZXQoInZhbHVlIixvKSksQz11JiZ1LmdldEl0ZW1MYXlvdXQobyk7aWYobHx8QSYmKEl8fFQpfHxDJiZDLnNob3dMYWJlbCl7dmFyIEwsRD1sP2UubmFtZTpvOyghdXx8bz49MCkmJihMPXQpO3ZhciBQPW5ldyBoLlRleHQoe3Bvc2l0aW9uOmUuY2VudGVyLnNsaWNlKCksc2NhbGU6WzEvcFswXSwxL3BbMV1dLHoyOjEwLHNpbGVudDohMH0pO2guc2V0TGFiZWxTdHlsZShQLnN0eWxlLFAuaG92ZXJTdHlsZT17fSx3LFMse2xhYmVsRmV0Y2hlcjpMLGxhYmVsRGF0YUluZGV4OkQsZGVmYXVsdFRleHQ6ZS5uYW1lLHVzZUluc2lkZVN0eWxlOiExfSx7dGV4dEFsaWduOiJjZW50ZXIiLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUifSksaS5hZGQoUCl9aWYodSl1LnNldEl0ZW1HcmFwaGljRWwobyxpKTtlbHNle3ZhciByPXQuZ2V0UmVnaW9uTW9kZWwoZS5uYW1lKTthLmV2ZW50RGF0YT17Y29tcG9uZW50VHlwZToiZ2VvIixnZW9JbmRleDp0LmNvbXBvbmVudEluZGV4LG5hbWU6ZS5uYW1lLHJlZ2lvbjpyJiZyLm9wdGlvbnx8e319fXZhciBrPWkuX19yZWdpb25zfHwoaS5fX3JlZ2lvbnM9W10pO2sucHVzaChlKSxoLnNldEhvdmVyU3R5bGUoaSxiLHtob3ZlclNpbGVudE9uVG91Y2g6ISF0LmdldCgic2VsZWN0ZWRNb2RlIil9KSxmLmFkZChpKX0pLHRoaXMuX3VwZGF0ZUNvbnRyb2xsZXIodCxlLGkpLGEodGhpcyx0LGYsaSxyKSxvKHQsZil9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fY29udHJvbGxlci5kaXNwb3NlKCksdGhpcy5fY29udHJvbGxlckhvc3Q9e319LF91cGRhdGVDb250cm9sbGVyOmZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7dmFyIGU9e3R5cGU6Imdlb1JvYW0iLGNvbXBvbmVudFR5cGU6c307cmV0dXJuIGVbcysiSWQiXT10LmlkLGV9dmFyIGE9dC5jb29yZGluYXRlU3lzdGVtLG89dGhpcy5fY29udHJvbGxlcixyPXRoaXMuX2NvbnRyb2xsZXJIb3N0O3Iuem9vbUxpbWl0PXQuZ2V0KCJzY2FsZUxpbWl0Iiksci56b29tPWEuZ2V0Wm9vbSgpLG8uZW5hYmxlKHQuZ2V0KCJyb2FtIil8fCExKTt2YXIgcz10Lm1haW5UeXBlO28ub2ZmKCJwYW4iKS5vbigicGFuIixmdW5jdGlvbih0LGUpe3RoaXMuX21vdXNlRG93bkZsYWc9ITEsbC51cGRhdGVWaWV3T25QYW4ocix0LGUpLGkuZGlzcGF0Y2hBY3Rpb24oYy5leHRlbmQobigpLHtkeDp0LGR5OmV9KSl9LHRoaXMpLG8ub2ZmKCJ6b29tIikub24oInpvb20iLGZ1bmN0aW9uKHQsZSxhKXtpZih0aGlzLl9tb3VzZURvd25GbGFnPSExLGwudXBkYXRlVmlld09uWm9vbShyLHQsZSxhKSxpLmRpc3BhdGNoQWN0aW9uKGMuZXh0ZW5kKG4oKSx7em9vbTp0LG9yaWdpblg6ZSxvcmlnaW5ZOmF9KSksdGhpcy5fdXBkYXRlR3JvdXApe3ZhciBvPXRoaXMuZ3JvdXAscz1vLnNjYWxlO28udHJhdmVyc2UoZnVuY3Rpb24odCl7InRleHQiPT09dC50eXBlJiZ0LmF0dHIoInNjYWxlIixbMS9zWzBdLDEvc1sxXV0pfSl9fSx0aGlzKSxvLnNldFBvaW50ZXJDaGVja2VyKGZ1bmN0aW9uKGUsbixvKXtyZXR1cm4gYS5nZXRWaWV3UmVjdEFmdGVyUm9hbSgpLmNvbnRhaW4obixvKSYmIXUub25JcnJlbGV2YW50RWxlbWVudChlLGksdCl9KX19LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUpe3ZhciBpPXt9O2kudXBkYXRlVmlld09uUGFuPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LnRhcmdldCxhPW4ucG9zaXRpb247YVswXSs9ZSxhWzFdKz1pLG4uZGlydHkoKX0saS51cGRhdGVWaWV3T25ab29tPWZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXQudGFyZ2V0LG89dC56b29tTGltaXQscj1hLnBvc2l0aW9uLHM9YS5zY2FsZSxsPXQuem9vbT10Lnpvb218fDE7aWYobCo9ZSxvKXt2YXIgdT1vLm1pbnx8MCxoPW8ubWF4fHwxLzA7bD1NYXRoLm1heChNYXRoLm1pbihoLGwpLHUpfXZhciBjPWwvdC56b29tO3Quem9vbT1sLHJbMF0tPShpLXJbMF0pKihjLTEpLHJbMV0tPShuLXJbMV0pKihjLTEpLHNbMF0qPWMsc1sxXSo9YyxhLmRpcnR5KCl9LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXQuX21vZGVsO3JldHVybiBpLmdldCgiYXhpc0V4cGFuZGFibGUiKSYmaS5nZXQoImF4aXNFeHBhbmRUcmlnZ2VyT24iKT09PWV9aSgyNzEpLGkoNDE2KSxpKDM4MCk7dmFyIGE9aSgyKSxvPWkoMSkscj1pKDM3KSxzPTU7YS5leHRlbmRDb21wb25lbnRWaWV3KHt0eXBlOiJwYXJhbGxlbCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9tb2RlbD10LHRoaXMuX2FwaT1pLHRoaXMuX2hhbmRsZXJzfHwodGhpcy5faGFuZGxlcnM9e30sby5lYWNoKGwsZnVuY3Rpb24odCxlKXtpLmdldFpyKCkub24oZSx0aGlzLl9oYW5kbGVyc1tlXT1vLmJpbmQodCx0aGlzKSl9LHRoaXMpKSxyLmNyZWF0ZU9yVXBkYXRlKHRoaXMsIl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZCIsdC5nZXQoImF4aXNFeHBhbmRSYXRlIiksImZpeFJhdGUiKX0sZGlzcG9zZTpmdW5jdGlvbih0LGUpe28uZWFjaCh0aGlzLl9oYW5kbGVycyxmdW5jdGlvbih0LGkpe2UuZ2V0WnIoKS5vZmYoaSx0KX0pLHRoaXMuX2hhbmRsZXJzPW51bGx9LF90aHJvdHRsZWREaXNwYXRjaEV4cGFuZDpmdW5jdGlvbih0KXt0aGlzLl9kaXNwYXRjaEV4cGFuZCh0KX0sX2Rpc3BhdGNoRXhwYW5kOmZ1bmN0aW9uKHQpe3QmJnRoaXMuX2FwaS5kaXNwYXRjaEFjdGlvbihvLmV4dGVuZCh7dHlwZToicGFyYWxsZWxBeGlzRXhwYW5kIn0sdCkpfX0pO3ZhciBsPXttb3VzZWRvd246ZnVuY3Rpb24odCl7bih0aGlzLCJjbGljayIpJiYodGhpcy5fbW91c2VEb3duUG9pbnQ9W3Qub2Zmc2V0WCx0Lm9mZnNldFldKX0sbW91c2V1cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tb3VzZURvd25Qb2ludDtpZihuKHRoaXMsImNsaWNrIikmJmUpe3ZhciBpPVt0Lm9mZnNldFgsdC5vZmZzZXRZXSxhPU1hdGgucG93KGVbMF0taVswXSwyKStNYXRoLnBvdyhlWzFdLWlbMV0sMik7aWYoYT5zKXJldHVybjt2YXIgbz10aGlzLl9tb2RlbC5jb29yZGluYXRlU3lzdGVtLmdldFNsaWRlZEF4aXNFeHBhbmRXaW5kb3coW3Qub2Zmc2V0WCx0Lm9mZnNldFldKTsibm9uZSIhPT1vLmJlaGF2aW9yJiZ0aGlzLl9kaXNwYXRjaEV4cGFuZCh7YXhpc0V4cGFuZFdpbmRvdzpvLmF4aXNFeHBhbmRXaW5kb3d9KX10aGlzLl9tb3VzZURvd25Qb2ludD1udWxsfSxtb3VzZW1vdmU6ZnVuY3Rpb24odCl7aWYoIXRoaXMuX21vdXNlRG93blBvaW50JiZuKHRoaXMsIm1vdXNlbW92ZSIpKXt2YXIgZT10aGlzLl9tb2RlbCxpPWUuY29vcmRpbmF0ZVN5c3RlbS5nZXRTbGlkZWRBeGlzRXhwYW5kV2luZG93KFt0Lm9mZnNldFgsdC5vZmZzZXRZXSksYT1pLmJlaGF2aW9yOyJqdW1wIj09PWEmJnRoaXMuX3Rocm90dGxlZERpc3BhdGNoRXhwYW5kLmRlYm91bmNlTmV4dENhbGwoZS5nZXQoImF4aXNFeHBhbmREZWJvdW5jZSIpKSx0aGlzLl90aHJvdHRsZWREaXNwYXRjaEV4cGFuZCgibm9uZSI9PT1hP251bGw6e2F4aXNFeHBhbmRXaW5kb3c6aS5heGlzRXhwYW5kV2luZG93LGFuaW1hdGlvbjoianVtcCI9PT1hJiZudWxsfSl9fX07YS5yZWdpc3RlclByZXByb2Nlc3NvcihpKDQxNykpfSxmdW5jdGlvbih0LGUsaSl7aSg0MzEpLGkoMzY1KSxpKDQyNyksaSg1OCksaSgzNjgpO3ZhciBuPWkoMik7bi5leHRlbmRDb21wb25lbnRWaWV3KHt0eXBlOiJzaW5nbGUifSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDIpLGE9aSgxKSxvPWkoMTApLHI9aSgyNzQpLHM9aSg4OCksbD1pKDE5MyksdT1zLm1hcFZpc3VhbCxoPWkoNSksYz1zLmVhY2hWaXN1YWwsZD1pKDQpLGY9YS5pc0FycmF5LHA9YS5lYWNoLGc9ZC5hc2MsbT1kLmxpbmVhck1hcCx2PWEubm9vcCx5PVsiI2Y2ZWZhNiIsIiNkODgyNzMiLCIjYmY0NDRjIl0seD1uLmV4dGVuZENvbXBvbmVudE1vZGVsKHt0eXBlOiJ2aXN1YWxNYXAiLGRlcGVuZGVuY2llczpbInNlcmllcyJdLHN0YXRlTGlzdDpbImluUmFuZ2UiLCJvdXRPZlJhbmdlIl0scmVwbGFjYWJsZU9wdGlvbktleXM6WyJpblJhbmdlIiwib3V0T2ZSYW5nZSIsInRhcmdldCIsImNvbnRyb2xsZXIiLCJjb2xvciJdLGRhdGFCb3VuZDpbLSgxLzApLDEvMF0sbGF5b3V0TW9kZTp7dHlwZToiYm94IixpZ25vcmVTaXplOiEwfSxkZWZhdWx0T3B0aW9uOntzaG93OiEwLHpsZXZlbDowLHo6NCxzZXJpZXNJbmRleDoiYWxsIixtaW46MCxtYXg6MjAwLGRpbWVuc2lvbjpudWxsLGluUmFuZ2U6bnVsbCxvdXRPZlJhbmdlOm51bGwsbGVmdDowLHJpZ2h0Om51bGwsdG9wOm51bGwsYm90dG9tOjAsaXRlbVdpZHRoOm51bGwsaXRlbUhlaWdodDpudWxsLGludmVyc2U6ITEsb3JpZW50OiJ2ZXJ0aWNhbCIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsY29udGVudENvbG9yOiIjNTc5M2YzIixpbmFjdGl2ZUNvbG9yOiIjYWFhIixib3JkZXJXaWR0aDowLHBhZGRpbmc6NSx0ZXh0R2FwOjEwLHByZWNpc2lvbjowLGNvbG9yOm51bGwsZm9ybWF0dGVyOm51bGwsdGV4dDpudWxsLHRleHRTdHlsZTp7Y29sb3I6IiMzMzMifX0saW5pdDpmdW5jdGlvbih0LGUsaSl7dGhpcy5fZGF0YUV4dGVudCx0aGlzLnRhcmdldFZpc3VhbHM9e30sdGhpcy5jb250cm9sbGVyVmlzdWFscz17fSx0aGlzLnRleHRTdHlsZU1vZGVsLHRoaXMuaXRlbVNpemUsdGhpcy5tZXJnZURlZmF1bHRBbmRUaGVtZSh0LGkpfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb247by5jYW52YXNTdXBwb3J0ZWR8fChpLnJlYWx0aW1lPSExKSwhZSYmbC5yZXBsYWNlVmlzdWFsT3B0aW9uKGksdCx0aGlzLnJlcGxhY2FibGVPcHRpb25LZXlzKSx0aGlzLnRleHRTdHlsZU1vZGVsPXRoaXMuZ2V0TW9kZWwoInRleHRTdHlsZSIpLHRoaXMucmVzZXRJdGVtU2l6ZSgpLHRoaXMuY29tcGxldGVWaXN1YWxPcHRpb24oKX0scmVzZXRWaXN1YWw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zdGF0ZUxpc3Q7dD1hLmJpbmQodCx0aGlzKSx0aGlzLmNvbnRyb2xsZXJWaXN1YWxzPWwuY3JlYXRlVmlzdWFsTWFwcGluZ3ModGhpcy5vcHRpb24uY29udHJvbGxlcixlLHQpLHRoaXMudGFyZ2V0VmlzdWFscz1sLmNyZWF0ZVZpc3VhbE1hcHBpbmdzKHRoaXMub3B0aW9uLnRhcmdldCxlLHQpfSxnZXRUYXJnZXRTZXJpZXNJbmRpY2VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb24uc2VyaWVzSW5kZXgsZT1bXTtyZXR1cm4gbnVsbD09dHx8ImFsbCI9PT10P3RoaXMuZWNNb2RlbC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsaSl7ZS5wdXNoKGkpfSk6ZT1oLm5vcm1hbGl6ZVRvQXJyYXkodCksZX0sZWFjaFRhcmdldFNlcmllczpmdW5jdGlvbih0LGUpe2EuZWFjaCh0aGlzLmdldFRhcmdldFNlcmllc0luZGljZXMoKSxmdW5jdGlvbihpKXt0LmNhbGwoZSx0aGlzLmVjTW9kZWwuZ2V0U2VyaWVzQnlJbmRleChpKSl9LHRoaXMpfSxpc1RhcmdldFNlcmllczpmdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4gdGhpcy5lYWNoVGFyZ2V0U2VyaWVzKGZ1bmN0aW9uKGkpe2k9PT10JiYoZT0hMCl9KSxlfSxmb3JtYXRWYWx1ZVRleHQ6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9PT11WzBdPyJtaW4iOnQ9PT11WzFdPyJtYXgiOigrdCkudG9GaXhlZChNYXRoLm1pbihsLDIwKSl9dmFyIG8scixzPXRoaXMub3B0aW9uLGw9cy5wcmVjaXNpb24sdT10aGlzLmRhdGFCb3VuZCxoPXMuZm9ybWF0dGVyO3JldHVybiBpPWl8fFsiPCIsIj4iXSxhLmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSxvPSEwKSxyPWU/dDpvP1tuKHRbMF0pLG4odFsxXSldOm4odCksYS5pc1N0cmluZyhoKT9oLnJlcGxhY2UoInt2YWx1ZX0iLG8/clswXTpyKS5yZXBsYWNlKCJ7dmFsdWUyfSIsbz9yWzFdOnIpOmEuaXNGdW5jdGlvbihoKT9vP2godFswXSx0WzFdKTpoKHQpOm8/dFswXT09PXVbMF0/aVswXSsiICIrclsxXTp0WzFdPT09dVsxXT9pWzFdKyIgIityWzBdOnJbMF0rIiAtICIrclsxXTpyfSxyZXNldEV4dGVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLGU9ZyhbdC5taW4sdC5tYXhdKTt0aGlzLl9kYXRhRXh0ZW50PWV9LGdldERhdGFEaW1lbnNpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb24uZGltZW5zaW9uO3JldHVybiBudWxsIT1lP2U6dC5kaW1lbnNpb25zLmxlbmd0aC0xfSxnZXRFeHRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YUV4dGVudC5zbGljZSgpfSxjb21wbGV0ZVZpc3VhbE9wdGlvbjpmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7ZihuLmNvbG9yKSYmIXQuaW5SYW5nZSYmKHQuaW5SYW5nZT17Y29sb3I6bi5jb2xvci5zbGljZSgpLnJldmVyc2UoKX0pLHQuaW5SYW5nZT10LmluUmFuZ2V8fHtjb2xvcjp5fSxwKHRoaXMuc3RhdGVMaXN0LGZ1bmN0aW9uKGUpe3ZhciBpPXRbZV07aWYoYS5pc1N0cmluZyhpKSl7dmFyIG49ci5nZXQoaSwiYWN0aXZlIixkKTtuPyh0W2VdPXt9LHRbZV1baV09bik6ZGVsZXRlIHRbZV19fSx0aGlzKX1mdW5jdGlvbiBlKHQsZSxpKXt2YXIgbj10W2VdLGE9dFtpXTtuJiYhYSYmKGE9dFtpXT17fSxwKG4sZnVuY3Rpb24odCxlKXtpZihzLmlzVmFsaWRUeXBlKGUpKXt2YXIgaT1yLmdldChlLCJpbmFjdGl2ZSIsZCk7bnVsbCE9aSYmKGFbZV09aSwiY29sb3IiIT09ZXx8YS5oYXNPd25Qcm9wZXJ0eSgib3BhY2l0eSIpfHxhLmhhc093blByb3BlcnR5KCJjb2xvckFscGhhIil8fChhLm9wYWNpdHk9WzAsMF0pKX19KSl9ZnVuY3Rpb24gaSh0KXt2YXIgZT0odC5pblJhbmdlfHx7fSkuc3ltYm9sfHwodC5vdXRPZlJhbmdlfHx7fSkuc3ltYm9sLGk9KHQuaW5SYW5nZXx8e30pLnN5bWJvbFNpemV8fCh0Lm91dE9mUmFuZ2V8fHt9KS5zeW1ib2xTaXplLG49dGhpcy5nZXQoImluYWN0aXZlQ29sb3IiKTtwKHRoaXMuc3RhdGVMaXN0LGZ1bmN0aW9uKG8pe3ZhciByPXRoaXMuaXRlbVNpemUscz10W29dO3N8fChzPXRbb109e2NvbG9yOmQ/bjpbbl19KSxudWxsPT1zLnN5bWJvbCYmKHMuc3ltYm9sPWUmJmEuY2xvbmUoZSl8fChkPyJyb3VuZFJlY3QiOlsicm91bmRSZWN0Il0pKSxudWxsPT1zLnN5bWJvbFNpemUmJihzLnN5bWJvbFNpemU9aSYmYS5jbG9uZShpKXx8KGQ/clswXTpbclswXSxyWzBdXSkpLHMuc3ltYm9sPXUocy5zeW1ib2wsZnVuY3Rpb24odCl7cmV0dXJuIm5vbmUiPT09dHx8InNxdWFyZSI9PT10PyJyb3VuZFJlY3QiOnR9KTt2YXIgbD1zLnN5bWJvbFNpemU7aWYobnVsbCE9bCl7dmFyIGg9LSgxLzApO2MobCxmdW5jdGlvbih0KXt0PmgmJihoPXQpfSkscy5zeW1ib2xTaXplPXUobCxmdW5jdGlvbih0KXtyZXR1cm4gbSh0LFswLGhdLFswLHJbMF1dLCEwKX0pfX0sdGhpcyl9dmFyIG49dGhpcy5vcHRpb24sbz17aW5SYW5nZTpuLmluUmFuZ2Usb3V0T2ZSYW5nZTpuLm91dE9mUmFuZ2V9LGw9bi50YXJnZXR8fChuLnRhcmdldD17fSksaD1uLmNvbnRyb2xsZXJ8fChuLmNvbnRyb2xsZXI9e30pO2EubWVyZ2UobCxvKSxhLm1lcmdlKGgsbyk7dmFyIGQ9dGhpcy5pc0NhdGVnb3J5KCk7dC5jYWxsKHRoaXMsbCksdC5jYWxsKHRoaXMsaCksZS5jYWxsKHRoaXMsbCwiaW5SYW5nZSIsIm91dE9mUmFuZ2UiKSxpLmNhbGwodGhpcyxoKX0scmVzZXRJdGVtU2l6ZTpmdW5jdGlvbigpe3RoaXMuaXRlbVNpemU9W3BhcnNlRmxvYXQodGhpcy5nZXQoIml0ZW1XaWR0aCIpKSxwYXJzZUZsb2F0KHRoaXMuZ2V0KCJpdGVtSGVpZ2h0IikpXX0saXNDYXRlZ29yeTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5vcHRpb24uY2F0ZWdvcmllc30sc2V0U2VsZWN0ZWQ6dixnZXRWYWx1ZVN0YXRlOnYsZ2V0VmlzdWFsTWV0YTp2fSk7dC5leHBvcnRzPXh9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgzKSxvPWkoNykscj1pKDkpLHM9aSgyKSxsPWkoODgpO3QuZXhwb3J0cz1zLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6InZpc3VhbE1hcCIsYXV0b1Bvc2l0aW9uVmFsdWVzOntsZWZ0OjEscmlnaHQ6MSx0b3A6MSxib3R0b206MX0saW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuZWNNb2RlbD10LHRoaXMuYXBpPWUsdGhpcy52aXN1YWxNYXBNb2RlbH0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe3JldHVybiB0aGlzLnZpc3VhbE1hcE1vZGVsPXQsdC5nZXQoInNob3ciKT09PSExP3ZvaWQgdGhpcy5ncm91cC5yZW1vdmVBbGwoKTp2b2lkIHRoaXMuZG9SZW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyZW5kZXJCYWNrZ3JvdW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsaT1vLm5vcm1hbGl6ZUNzc0FycmF5KGUuZ2V0KCJwYWRkaW5nIil8fDApLG49dC5nZXRCb3VuZGluZ1JlY3QoKTt0LmFkZChuZXcgYS5SZWN0KHt6MjotMSxzaWxlbnQ6ITAsc2hhcGU6e3g6bi54LWlbM10seTpuLnktaVswXSx3aWR0aDpuLndpZHRoK2lbM10raVsxXSxoZWlnaHQ6bi5oZWlnaHQraVswXStpWzJdfSxzdHlsZTp7ZmlsbDplLmdldCgiYmFja2dyb3VuZENvbG9yIiksc3Ryb2tlOmUuZ2V0KCJib3JkZXJDb2xvciIpLGxpbmVXaWR0aDplLmdldCgiYm9yZGVyV2lkdGgiKX19KSl9LGdldENvbnRyb2xsZXJWaXN1YWw6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIGEodCl7cmV0dXJuIHVbdF19ZnVuY3Rpb24gbyh0LGUpe3VbdF09ZX1pPWl8fHt9O3ZhciByPWkuZm9yY2VTdGF0ZSxzPXRoaXMudmlzdWFsTWFwTW9kZWwsdT17fTtpZigic3ltYm9sIj09PWUmJih1LnN5bWJvbD1zLmdldCgiaXRlbVN5bWJvbCIpKSwiY29sb3IiPT09ZSl7dmFyIGg9cy5nZXQoImNvbnRlbnRDb2xvciIpO3UuY29sb3I9aH12YXIgYz1zLmNvbnRyb2xsZXJWaXN1YWxzW3J8fHMuZ2V0VmFsdWVTdGF0ZSh0KV0sZD1sLnByZXBhcmVWaXN1YWxUeXBlcyhjKTtyZXR1cm4gbi5lYWNoKGQsZnVuY3Rpb24obil7dmFyIHI9Y1tuXTtpLmNvbnZlcnRPcGFjaXR5VG9BbHBoYSYmIm9wYWNpdHkiPT09biYmKG49ImNvbG9yQWxwaGEiLHI9Yy5fX2FscGhhRm9yT3BhY2l0eSksbC5kZXBlbmRzT24obixlKSYmciYmci5hcHBseVZpc3VhbCh0LGEsbyl9KSx1W2VdfSxwb3NpdGlvbkdyb3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlzdWFsTWFwTW9kZWwsaT10aGlzLmFwaTtyLnBvc2l0aW9uRWxlbWVudCh0LGUuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOmkuZ2V0V2lkdGgoKSxoZWlnaHQ6aS5nZXRIZWlnaHQoKX0pfSxkb1JlbmRlcjpuLm5vb3B9KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDkpLG89e2dldEl0ZW1BbGlnbjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5vcHRpb24sbz1uLmFsaWduO2lmKG51bGwhPW8mJiJhdXRvIiE9PW8pcmV0dXJuIG87Zm9yKHZhciByPXt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LHM9Imhvcml6b250YWwiPT09bi5vcmllbnQ/MTowLGw9W1sibGVmdCIsInJpZ2h0Iiwid2lkdGgiXSxbInRvcCIsImJvdHRvbSIsImhlaWdodCJdXSx1PWxbc10saD1bMCxudWxsLDEwXSxjPXt9LGQ9MDtkPDM7ZCsrKWNbbFsxLXNdW2RdXT1oW2RdLGNbdVtkXV09Mj09PWQ/aVswXTpuW3VbZF1dO3ZhciBmPVtbIngiLCJ3aWR0aCIsM10sWyJ5IiwiaGVpZ2h0IiwwXV1bc10scD1hLmdldExheW91dFJlY3QoYyxyLG4ucGFkZGluZyk7cmV0dXJuIHVbKHAubWFyZ2luW2ZbMl1dfHwwKStwW2ZbMF1dKy41KnBbZlsxXV08LjUqcltmWzFdXT8wOjFdfSxjb252ZXJ0RGF0YUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiBuLmVhY2godHx8W10sZnVuY3Rpb24oZSl7bnVsbCE9dC5kYXRhSW5kZXgmJih0LmRhdGFJbmRleEluc2lkZT10LmRhdGFJbmRleCx0LmRhdGFJbmRleD1udWxsKX0pLHR9fTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdCYmdC5oYXNPd25Qcm9wZXJ0eSYmdC5oYXNPd25Qcm9wZXJ0eShlKX12YXIgYT1pKDEpLG89YS5lYWNoO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LnZpc3VhbE1hcDthLmlzQXJyYXkoZSl8fChlPWU/W2VdOltdKSxvKGUsZnVuY3Rpb24odCl7aWYodCl7bih0LCJzcGxpdExpc3QiKSYmIW4odCwicGllY2VzIikmJih0LnBpZWNlcz10LnNwbGl0TGlzdCxkZWxldGUgdC5zcGxpdExpc3QpO3ZhciBlPXQucGllY2VzO2UmJmEuaXNBcnJheShlKSYmbyhlLGZ1bmN0aW9uKHQpe2EuaXNPYmplY3QodCkmJihuKHQsInN0YXJ0IikmJiFuKHQsIm1pbiIpJiYodC5taW49dC5zdGFydCksbih0LCJlbmQiKSYmIW4odCwibWF4IikmJih0Lm1heD10LmVuZCkpfSl9fSl9fSxmdW5jdGlvbih0LGUsaSl7aSgxMykucmVnaXN0ZXJTdWJUeXBlRGVmYXVsdGVyKCJ2aXN1YWxNYXAiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmNhdGVnb3JpZXN8fCh0LnBpZWNlcz90LnBpZWNlcy5sZW5ndGg+MDp0LnNwbGl0TnVtYmVyPjApJiYhdC5jYWxjdWxhYmxlPyJwaWVjZXdpc2UiOiJjb250aW51b3VzIn0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3QuZWFjaFRhcmdldFNlcmllcyhmdW5jdGlvbihlKXt2YXIgaT1lLmdldERhdGEoKTtzLmFwcGx5VmlzdWFsKHQuc3RhdGVMaXN0LHQudGFyZ2V0VmlzdWFscyxpLHQuZ2V0VmFsdWVTdGF0ZSx0LHQuZ2V0RGF0YURpbWVuc2lvbihpKSl9KX1mdW5jdGlvbiBhKHQpe3QuZWFjaFNlcmllcyhmdW5jdGlvbihlKXt2YXIgaT1lLmdldERhdGEoKSxuPVtdO3QuZWFjaENvbXBvbmVudCgidmlzdWFsTWFwIixmdW5jdGlvbih0KXtpZih0LmlzVGFyZ2V0U2VyaWVzKGUpKXt2YXIgYT10LmdldFZpc3VhbE1ldGEodS5iaW5kKG8sbnVsbCxlLHQpKXx8e3N0b3BzOltdLG91dGVyQ29sb3JzOltdfTthLmRpbWVuc2lvbj10LmdldERhdGFEaW1lbnNpb24oaSksbi5wdXNoKGEpfX0pLGUuZ2V0RGF0YSgpLnNldFZpc3VhbCgidmlzdWFsTWV0YSIsbil9KX1mdW5jdGlvbiBvKHQsZSxpLG4pe2Z1bmN0aW9uIGEodCl7cmV0dXJuIHVbdF19ZnVuY3Rpb24gbyh0LGUpe3VbdF09ZX1mb3IodmFyIHI9ZS50YXJnZXRWaXN1YWxzW25dLHM9bC5wcmVwYXJlVmlzdWFsVHlwZXMociksdT17Y29sb3I6dC5nZXREYXRhKCkuZ2V0VmlzdWFsKCJjb2xvciIpfSxoPTAsYz1zLmxlbmd0aDtoPGM7aCsrKXt2YXIgZD1zW2hdLGY9clsib3BhY2l0eSI9PT1kPyJfX2FscGhhRm9yT3BhY2l0eSI6ZF07ZiYmZi5hcHBseVZpc3VhbChpLGEsbyl9cmV0dXJuIHUuY29sb3J9dmFyIHI9aSgyKSxzPWkoMTkzKSxsPWkoODgpLHU9aSgxKTtyLnJlZ2lzdGVyVmlzdWFsKHIuUFJJT1JJVFkuVklTVUFMLkNPTVBPTkVOVCxmdW5jdGlvbih0KXt0LmVhY2hDb21wb25lbnQoInZpc3VhbE1hcCIsZnVuY3Rpb24oZSl7bihlLHQpfSksYSh0KX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyKSxhPXt0eXBlOiJzZWxlY3REYXRhUmFuZ2UiLGV2ZW50OiJkYXRhUmFuZ2VTZWxlY3RlZCIsdXBkYXRlOiJ1cGRhdGUifTtuLnJlZ2lzdGVyQWN0aW9uKGEsZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJ2aXN1YWxNYXAiLHF1ZXJ5OnR9LGZ1bmN0aW9uKGUpe2Uuc2V0U2VsZWN0ZWQodC5zZWxlY3RlZCl9KX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbigpe2wuY2FsbCh0aGlzKX1mdW5jdGlvbiBhKHQpe3RoaXMubmFtZT10LHRoaXMuem9vbUxpbWl0LGwuY2FsbCh0aGlzKSx0aGlzLl9yb2FtVHJhbnNmb3JtPW5ldyBuLHRoaXMuX3ZpZXdUcmFuc2Zvcm09bmV3IG4sdGhpcy5fY2VudGVyLHRoaXMuX3pvb219ZnVuY3Rpb24gbyh0LGUsaSxuKXt2YXIgYT1pLnNlcmllc01vZGVsLG89YT9hLmNvb3JkaW5hdGVTeXN0ZW06bnVsbDtyZXR1cm4gbz09PXRoaXM/b1t0XShuKTpudWxsfXZhciByPWkoNikscz1pKDE5KSxsPWkoNjEpLHU9aSgxKSxoPWkoMTIpLGM9ci5hcHBseVRyYW5zZm9ybTt1Lm1peGluKG4sbCksYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmEsdHlwZToidmlldyIsZGltZW5zaW9uczpbIngiLCJ5Il0sc2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKHQsZSxpLG4pe3JldHVybiB0aGlzLl9yZWN0PW5ldyBoKHQsZSxpLG4pLHRoaXMuX3JlY3R9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWN0fSxzZXRWaWV3UmVjdDpmdW5jdGlvbih0LGUsaSxuKXt0aGlzLnRyYW5zZm9ybVRvKHQsZSxpLG4pLHRoaXMuX3ZpZXdSZWN0PW5ldyBoKHQsZSxpLG4pfSx0cmFuc2Zvcm1UbzpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT10aGlzLmdldEJvdW5kaW5nUmVjdCgpLG89dGhpcy5fdmlld1RyYW5zZm9ybTtvLnRyYW5zZm9ybT1hLmNhbGN1bGF0ZVRyYW5zZm9ybShuZXcgaCh0LGUsaSxuKSksby5kZWNvbXBvc2VUcmFuc2Zvcm0oKSx0aGlzLl91cGRhdGVUcmFuc2Zvcm0oKX0sc2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3QmJih0aGlzLl9jZW50ZXI9dCx0aGlzLl91cGRhdGVDZW50ZXJBbmRab29tKCkpfSxzZXRab29tOmZ1bmN0aW9uKHQpe3Q9dHx8MTt2YXIgZT10aGlzLnpvb21MaW1pdDtlJiYobnVsbCE9ZS5tYXgmJih0PU1hdGgubWluKGUubWF4LHQpKSxudWxsIT1lLm1pbiYmKHQ9TWF0aC5tYXgoZS5taW4sdCkpKSx0aGlzLl96b29tPXQsdGhpcy5fdXBkYXRlQ2VudGVyQW5kWm9vbSgpfSxnZXREZWZhdWx0Q2VudGVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxlPXQueCt0LndpZHRoLzIsaT10LnkrdC5oZWlnaHQvMjtyZXR1cm5bZSxpXX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NlbnRlcnx8dGhpcy5nZXREZWZhdWx0Q2VudGVyKCl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbXx8MX0sZ2V0Um9hbVRyYW5zZm9ybTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb2FtVHJhbnNmb3JtfSxfdXBkYXRlQ2VudGVyQW5kWm9vbTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3ZpZXdUcmFuc2Zvcm0uZ2V0TG9jYWxUcmFuc2Zvcm0oKSxlPXRoaXMuX3JvYW1UcmFuc2Zvcm0saT10aGlzLmdldERlZmF1bHRDZW50ZXIoKSxuPXRoaXMuZ2V0Q2VudGVyKCksYT10aGlzLmdldFpvb20oKTtuPXIuYXBwbHlUcmFuc2Zvcm0oW10sbix0KSxpPXIuYXBwbHlUcmFuc2Zvcm0oW10saSx0KSxlLm9yaWdpbj1uLGUucG9zaXRpb249W2lbMF0tblswXSxpWzFdLW5bMV1dLGUuc2NhbGU9W2EsYV0sdGhpcy5fdXBkYXRlVHJhbnNmb3JtKCl9LF91cGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yb2FtVHJhbnNmb3JtLGU9dGhpcy5fdmlld1RyYW5zZm9ybTtlLnBhcmVudD10LHQudXBkYXRlVHJhbnNmb3JtKCksZS51cGRhdGVUcmFuc2Zvcm0oKSxlLnRyYW5zZm9ybSYmcy5jb3B5KHRoaXMudHJhbnNmb3JtfHwodGhpcy50cmFuc2Zvcm09W10pLGUudHJhbnNmb3JtKSx0aGlzLnRyYW5zZm9ybT8odGhpcy5pbnZUcmFuc2Zvcm09dGhpcy5pbnZUcmFuc2Zvcm18fFtdLHMuaW52ZXJ0KHRoaXMuaW52VHJhbnNmb3JtLHRoaXMudHJhbnNmb3JtKSk6dGhpcy5pbnZUcmFuc2Zvcm09bnVsbCx0aGlzLmRlY29tcG9zZVRyYW5zZm9ybSgpfSxnZXRWaWV3UmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3UmVjdH0sZ2V0Vmlld1JlY3RBZnRlclJvYW06ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEJvdW5kaW5nUmVjdCgpLmNsb25lKCk7cmV0dXJuIHQuYXBwbHlUcmFuc2Zvcm0odGhpcy50cmFuc2Zvcm0pLHR9LGRhdGFUb1BvaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudHJhbnNmb3JtO3JldHVybiBlP2MoW10sdCxlKTpbdFswXSx0WzFdXX0scG9pbnRUb0RhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbnZUcmFuc2Zvcm07cmV0dXJuIGU/YyhbXSx0LGUpOlt0WzBdLHRbMV1dfSxjb252ZXJ0VG9QaXhlbDp1LmN1cnJ5KG8sImRhdGFUb1BvaW50IiksY29udmVydEZyb21QaXhlbDp1LmN1cnJ5KG8sInBvaW50VG9EYXRhIiksY29udGFpblBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFZpZXdSZWN0QWZ0ZXJSb2FtKCkuY29udGFpbih0WzBdLHRbMV0pfX0sdS5taXhpbihhLGwpLHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7aWYodGhpcy5uYW1lPXQsdGhpcy5nZW9tZXRyaWVzPWUsaSlpPVtpWzBdLGlbMV1dO2Vsc2V7dmFyIG49dGhpcy5nZXRCb3VuZGluZ1JlY3QoKTtpPVtuLngrbi53aWR0aC8yLG4ueStuLmhlaWdodC8yXX10aGlzLmNlbnRlcj1pfXZhciBhPWkoMjc1KSxvPWkoMTIpLHI9aSg5MCkscz1pKDYpO24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHByb3BlcnRpZXM6bnVsbCxnZXRCb3VuZGluZ1JlY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWN0O2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBlPU51bWJlci5NQVhfVkFMVUUsaT1bZSxlXSxuPVstZSwtZV0sYT1bXSxsPVtdLHU9dGhpcy5nZW9tZXRyaWVzLGg9MDtoPHUubGVuZ3RoO2grKylpZigicG9seWdvbiI9PT11W2hdLnR5cGUpe3ZhciBjPXVbaF0uZXh0ZXJpb3I7ci5mcm9tUG9pbnRzKGMsYSxsKSxzLm1pbihpLGksYSkscy5tYXgobixuLGwpfXJldHVybiAwPT09aCYmKGlbMF09aVsxXT1uWzBdPW5bMV09MCksdGhpcy5fcmVjdD1uZXcgbyhpWzBdLGlbMV0sblswXS1pWzBdLG5bMV0taVsxXSl9LGNvbnRhaW46ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxpPXRoaXMuZ2VvbWV0cmllcztpZighZS5jb250YWluKHRbMF0sdFsxXSkpcmV0dXJuITE7dDpmb3IodmFyIG49MCxvPWkubGVuZ3RoO248bztuKyspaWYoInBvbHlnb24iPT09aVtuXS50eXBlKXt2YXIgcj1pW25dLmV4dGVyaW9yLHM9aVtuXS5pbnRlcmlvcnM7aWYoYS5jb250YWluKHIsdFswXSx0WzFdKSl7Zm9yKHZhciBsPTA7bDwocz9zLmxlbmd0aDowKTtsKyspaWYoYS5jb250YWluKHNbbF0pKWNvbnRpbnVlIHQ7cmV0dXJuITB9fXJldHVybiExfSx0cmFuc2Zvcm1UbzpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT10aGlzLmdldEJvdW5kaW5nUmVjdCgpLHI9YS53aWR0aC9hLmhlaWdodDtpP258fChuPWkvcik6aT1yKm47Zm9yKHZhciBsPW5ldyBvKHQsZSxpLG4pLHU9YS5jYWxjdWxhdGVUcmFuc2Zvcm0obCksaD10aGlzLmdlb21ldHJpZXMsYz0wO2M8aC5sZW5ndGg7YysrKWlmKCJwb2x5Z29uIj09PWhbY10udHlwZSl7Zm9yKHZhciBkPWhbY10uZXh0ZXJpb3IsZj1oW2NdLmludGVyaW9ycyxwPTA7cDxkLmxlbmd0aDtwKyspcy5hcHBseVRyYW5zZm9ybShkW3BdLGRbcF0sdSk7Zm9yKHZhciBnPTA7ZzwoZj9mLmxlbmd0aDowKTtnKyspZm9yKHZhciBwPTA7cDxmW2ddLmxlbmd0aDtwKyspcy5hcHBseVRyYW5zZm9ybShmW2ddW3BdLGZbZ11bcF0sdSl9YT10aGlzLl9yZWN0LGEuY29weShsKSx0aGlzLmNlbnRlcj1bYS54K2Eud2lkdGgvMixhLnkrYS5oZWlnaHQvMl19fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7aWYoIXQuVVRGOEVuY29kaW5nKXJldHVybiB0O3ZhciBlPXQuVVRGOFNjYWxlO251bGw9PWUmJihlPTEwMjQpO2Zvcih2YXIgaT10LmZlYXR1cmVzLG49MDtuPGkubGVuZ3RoO24rKylmb3IodmFyIG89aVtuXSxyPW8uZ2VvbWV0cnkscz1yLmNvb3JkaW5hdGVzLGw9ci5lbmNvZGVPZmZzZXRzLHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGg9c1t1XTtpZigiUG9seWdvbiI9PT1yLnR5cGUpc1t1XT1hKGgsbFt1XSxlKTtlbHNlIGlmKCJNdWx0aVBvbHlnb24iPT09ci50eXBlKWZvcih2YXIgYz0wO2M8aC5sZW5ndGg7YysrKXt2YXIgZD1oW2NdO2hbY109YShkLGxbdV1bY10sZSl9fXJldHVybiB0LlVURjhFbmNvZGluZz0hMSx0fWZ1bmN0aW9uIGEodCxlLGkpe2Zvcih2YXIgbj1bXSxhPWVbMF0sbz1lWzFdLHI9MDtyPHQubGVuZ3RoO3IrPTIpe3ZhciBzPXQuY2hhckNvZGVBdChyKS02NCxsPXQuY2hhckNvZGVBdChyKzEpLTY0O3M9cz4+MV4tKDEmcyksbD1sPj4xXi0oMSZsKSxzKz1hLGwrPW8sYT1zLG89bCxuLnB1c2goW3MvaSxsL2ldKX1yZXR1cm4gbn12YXIgbz1pKDEpLHI9aSgyNjkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbih0KSxvLm1hcChvLmZpbHRlcih0LmZlYXR1cmVzLGZ1bmN0aW9uKHQpe3JldHVybiB0Lmdlb21ldHJ5JiZ0LnByb3BlcnRpZXMmJnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoPjB9KSxmdW5jdGlvbih0KXt2YXIgZT10LnByb3BlcnRpZXMsaT10Lmdlb21ldHJ5LG49aS5jb29yZGluYXRlcyxhPVtdOyJQb2x5Z29uIj09PWkudHlwZSYmYS5wdXNoKHt0eXBlOiJwb2x5Z29uIixleHRlcmlvcjpuWzBdLGludGVyaW9yczpuLnNsaWNlKDEpfSksIk11bHRpUG9seWdvbiI9PT1pLnR5cGUmJm8uZWFjaChuLGZ1bmN0aW9uKHQpe3RbMF0mJmEucHVzaCh7dHlwZToicG9seWdvbiIsZXh0ZXJpb3I6dFswXSxpbnRlcmlvcnM6dC5zbGljZSgxKX0pfSk7dmFyIHM9bmV3IHIoZS5uYW1lLGEsZS5jcCk7cmV0dXJuIHMucHJvcGVydGllcz1lLHN9KX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7dmFyIGk9W107cmV0dXJuIHQuZWFjaENvbXBvbmVudCgicGFyYWxsZWwiLGZ1bmN0aW9uKG4sbyl7dmFyIHI9bmV3IGEobix0LGUpO3IubmFtZT0icGFyYWxsZWxfIitvLHIucmVzaXplKG4sZSksbi5jb29yZGluYXRlU3lzdGVtPXIsci5tb2RlbD1uLGkucHVzaChyKX0pLHQuZWFjaFNlcmllcyhmdW5jdGlvbihlKXtpZigicGFyYWxsZWwiPT09ZS5nZXQoImNvb3JkaW5hdGVTeXN0ZW0iKSl7dmFyIGk9dC5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJwYXJhbGxlbCIsaW5kZXg6ZS5nZXQoInBhcmFsbGVsSW5kZXgiKSxpZDplLmdldCgicGFyYWxsZWxJZCIpfSlbMF07ZS5jb29yZGluYXRlU3lzdGVtPWkuY29vcmRpbmF0ZVN5c3RlbX19KSxpfXZhciBhPWkoNDE0KTtpKDI2KS5yZWdpc3RlcigicGFyYWxsZWwiLHtjcmVhdGU6bn0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt2YXIgZT10Lm1haW5EYXRhLGk9dC5kYXRhcztpfHwoaT17bWFpbjplfSx0LmRhdGFzQXR0cj17bWFpbjoiZGF0YSJ9KSx0LmRhdGFzPXQubWFpbkRhdGE9bnVsbCx1KGUsaSx0KSxkKGksZnVuY3Rpb24oaSl7ZChlLlRSQU5TRkVSQUJMRV9NRVRIT0RTLGZ1bmN0aW9uKGUpe2kud3JhcE1ldGhvZChlLGMuY3VycnkoYSx0KSl9KX0pLGUud3JhcE1ldGhvZCgiY2xvbmVTaGFsbG93IixjLmN1cnJ5KHIsdCkpLGQoZS5DSEFOR0FCTEVfTUVUSE9EUyxmdW5jdGlvbihpKXtlLndyYXBNZXRob2QoaSxjLmN1cnJ5KG8sdCkpfSksYy5hc3NlcnQoaVtlLmRhdGFUeXBlXT09PWUpfWZ1bmN0aW9uIGEodCxlKXtpZihsKHRoaXMpKXt2YXIgaT1jLmV4dGVuZCh7fSx0aGlzW2ZdKTtpW3RoaXMuZGF0YVR5cGVdPWUsdShlLGksdCl9ZWxzZSBoKGUsdGhpcy5kYXRhVHlwZSx0aGlzW3BdLHQpO3JldHVybiBlfWZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gdC5zdHJ1Y3QmJnQuc3RydWN0LnVwZGF0ZSh0aGlzKSxlfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gZChlW2ZdLGZ1bmN0aW9uKGksbil7aSE9PWUmJmgoaS5jbG9uZVNoYWxsb3coKSxuLGUsdCl9KSxlfWZ1bmN0aW9uIHModCl7dmFyIGU9dGhpc1twXTtyZXR1cm4gbnVsbD09dHx8bnVsbD09ZT9lOmVbZl1bdF07Cn1mdW5jdGlvbiBsKHQpe3JldHVybiB0W3BdPT09dH1mdW5jdGlvbiB1KHQsZSxpKXt0W2ZdPXt9LGQoZSxmdW5jdGlvbihlLG4pe2goZSxuLHQsaSl9KX1mdW5jdGlvbiBoKHQsZSxpLG4pe2lbZl1bZV09dCx0W3BdPWksdC5kYXRhVHlwZT1lLG4uc3RydWN0JiYodFtuLnN0cnVjdEF0dHJdPW4uc3RydWN0LG4uc3RydWN0W24uZGF0YXNBdHRyW2VdXT10KSx0LmdldExpbmtlZERhdGE9c312YXIgYz1pKDEpLGQ9Yy5lYWNoLGY9IlwwX19saW5rX2RhdGFzIixwPSJcMF9fbGlua19tYWluRGF0YSI7dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7ZnVuY3Rpb24gdChlLG4pe2lmKG4+PWkubGVuZ3RoKXJldHVybiBlO2Zvcih2YXIgbz0tMSxyPWUubGVuZ3RoLHM9aVtuKytdLGw9e30sdT17fTsrK288cjspe3ZhciBoPXMoZVtvXSksYz11W2hdO2M/Yy5wdXNoKGVbb10pOnVbaF09W2Vbb11dfXJldHVybiBhLmVhY2godSxmdW5jdGlvbihlLGkpe2xbaV09dChlLG4pfSksbH1mdW5jdGlvbiBlKHQsbyl7aWYobz49aS5sZW5ndGgpcmV0dXJuIHQ7dmFyIHI9W10scz1uW28rK107cmV0dXJuIGEuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7ci5wdXNoKHtrZXk6aSx2YWx1ZXM6ZSh0LG8pfSl9KSxzP3Iuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBzKHQua2V5LGUua2V5KX0pOnJ9dmFyIGk9W10sbj1bXTtyZXR1cm57a2V5OmZ1bmN0aW9uKHQpe3JldHVybiBpLnB1c2godCksdGhpc30sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIG5baS5sZW5ndGgtMV09dCx0aGlzfSxlbnRyaWVzOmZ1bmN0aW9uKGkpe3JldHVybiBlKHQoaSwwKSwwKX19fXZhciBhPWkoMSk7dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9e2dldDpmdW5jdGlvbih0LGUsaSl7dmFyIGE9bi5jbG9uZSgob1t0XXx8e30pW2VdKTtyZXR1cm4gaSYmbi5pc0FycmF5KGEpP2FbYS5sZW5ndGgtMV06YX19LG89e2NvbG9yOnthY3RpdmU6WyIjMDA2ZWRkIiwiI2UwZmZmZiJdLGluYWN0aXZlOlsicmdiYSgwLDAsMCwwKSJdfSxjb2xvckh1ZTp7YWN0aXZlOlswLDM2MF0saW5hY3RpdmU6WzAsMF19LGNvbG9yU2F0dXJhdGlvbjp7YWN0aXZlOlsuMywxXSxpbmFjdGl2ZTpbMCwwXX0sY29sb3JMaWdodG5lc3M6e2FjdGl2ZTpbLjksLjVdLGluYWN0aXZlOlswLDBdfSxjb2xvckFscGhhOnthY3RpdmU6Wy4zLDFdLGluYWN0aXZlOlswLDBdfSxvcGFjaXR5OnthY3RpdmU6Wy4zLDFdLGluYWN0aXZlOlswLDBdfSxzeW1ib2w6e2FjdGl2ZTpbImNpcmNsZSIsInJvdW5kUmVjdCIsImRpYW1vbmQiXSxpbmFjdGl2ZTpbIm5vbmUiXX0sc3ltYm9sU2l6ZTp7YWN0aXZlOlsxMCw1MF0saW5hY3RpdmU6WzAsMF19fTt0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gTWF0aC5hYnModC1lKTxyfWZ1bmN0aW9uIGEodCxlLGkpe3ZhciBhPTAscj10WzBdO2lmKCFyKXJldHVybiExO2Zvcih2YXIgcz0xO3M8dC5sZW5ndGg7cysrKXt2YXIgbD10W3NdO2ErPW8oclswXSxyWzFdLGxbMF0sbFsxXSxlLGkpLHI9bH12YXIgdT10WzBdO3JldHVybiBuKHJbMF0sdVswXSkmJm4oclsxXSx1WzFdKXx8KGErPW8oclswXSxyWzFdLHVbMF0sdVsxXSxlLGkpKSwwIT09YX12YXIgbz1pKDEwNCkscj0xZS04O3QuZXhwb3J0cz17Y29udGFpbjphfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoOTUpLmV4dGVuZCh7dHlwZToic2VyaWVzLnBpY3RvcmlhbEJhciIsZGVwZW5kZW5jaWVzOlsiZ3JpZCJdLGRlZmF1bHRPcHRpb246e3N5bWJvbDoiY2lyY2xlIixzeW1ib2xTaXplOm51bGwsc3ltYm9sUm90YXRlOm51bGwsc3ltYm9sUG9zaXRpb246bnVsbCxzeW1ib2xPZmZzZXQ6bnVsbCxzeW1ib2xNYXJnaW46bnVsbCxzeW1ib2xSZXBlYXQ6ITEsc3ltYm9sUmVwZWF0RGlyZWN0aW9uOiJlbmQiLHN5bWJvbENsaXA6ITEsc3ltYm9sQm91bmRpbmdEYXRhOm51bGwsc3ltYm9sUGF0dGVyblNpemU6NDAwLGJhckdhcDoiLTEwMCUiLHByb2dyZXNzaXZlOjAsaG92ZXJBbmltYXRpb246ITF9LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0LnN0YWNrPW51bGwsbi5zdXBlckFwcGx5KHRoaXMsImdldEluaXRpYWxEYXRhIixhcmd1bWVudHMpfX0pO3QuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSxuKXt2YXIgbz10LmdldEl0ZW1MYXlvdXQoZSksdT1pLmdldCgic3ltYm9sUmVwZWF0IiksaD1pLmdldCgic3ltYm9sQ2xpcCIpLGM9aS5nZXQoInN5bWJvbFBvc2l0aW9uIil8fCJzdGFydCIsZD1pLmdldCgic3ltYm9sUm90YXRlIiksZj0oZHx8MCkqTWF0aC5QSS8xODB8fDAscD1pLmdldCgic3ltYm9sUGF0dGVyblNpemUiKXx8MixnPWkuaXNBbmltYXRpb25FbmFibGVkKCksbT17ZGF0YUluZGV4OmUsbGF5b3V0Om8saXRlbU1vZGVsOmksc3ltYm9sVHlwZTp0LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sIil8fCJjaXJjbGUiLGNvbG9yOnQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpLHN5bWJvbENsaXA6aCxzeW1ib2xSZXBlYXQ6dSxzeW1ib2xSZXBlYXREaXJlY3Rpb246aS5nZXQoInN5bWJvbFJlcGVhdERpcmVjdGlvbiIpLHN5bWJvbFBhdHRlcm5TaXplOnAscm90YXRpb246ZixhbmltYXRpb25Nb2RlbDpnP2k6bnVsbCxob3ZlckFuaW1hdGlvbjpnJiZpLmdldCgiaG92ZXJBbmltYXRpb24iKSx6MjppLmdldFNoYWxsb3coInoiLCEwKXx8MH07YShpLHUsbyxuLG0pLHIodCxlLG8sdSxoLG0uYm91bmRpbmdMZW5ndGgsbS5weFNpZ24scCxuLG0pLHMoaSxtLnN5bWJvbFNjYWxlLGYsbixtKTt2YXIgdj1tLnN5bWJvbFNpemUseT1pLmdldCgic3ltYm9sT2Zmc2V0Iik7cmV0dXJuIFQuaXNBcnJheSh5KSYmKHk9W1AoeVswXSx2WzBdKSxQKHlbMV0sdlsxXSldKSxsKGksdixvLHUsaCx5LGMsbS52YWx1ZUxpbmVXaWR0aCxtLmJvdW5kaW5nTGVuZ3RoLG0ucmVwZWF0Q3V0TGVuZ3RoLG4sbSksbX1mdW5jdGlvbiBhKHQsZSxpLG4sYSl7dmFyIHIscz1uLnZhbHVlRGltLGw9dC5nZXQoInN5bWJvbEJvdW5kaW5nRGF0YSIpLHU9bi5jb29yZFN5cy5nZXRPdGhlckF4aXMobi5jb29yZFN5cy5nZXRCYXNlQXhpcygpKSxoPXUudG9HbG9iYWxDb29yZCh1LmRhdGFUb0Nvb3JkKDApKSxjPTEtKyhpW3Mud2hdPD0wKTtpZihULmlzQXJyYXkobCkpe3ZhciBkPVtvKHUsbFswXSktaCxvKHUsbFsxXSktaF07ZFsxXTxkWzBdJiZkLnJldmVyc2UoKSxyPWRbY119ZWxzZSByPW51bGwhPWw/byh1LGwpLWg6ZT9uLmNvb3JkU3lzRXh0ZW50W3MuaW5kZXhdW2NdLWg6aVtzLndoXTthLmJvdW5kaW5nTGVuZ3RoPXIsZSYmKGEucmVwZWF0Q3V0TGVuZ3RoPWlbcy53aF0pLGEucHhTaWduPXI+MD8xOnI8MD8tMTowfWZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gdC50b0dsb2JhbENvb3JkKHQuZGF0YVRvQ29vcmQodC5zY2FsZS5wYXJzZShlKSkpfWZ1bmN0aW9uIHIodCxlLGksbixhLG8scixzLGwsdSl7dmFyIGg9bC52YWx1ZURpbSxjPWwuY2F0ZWdvcnlEaW0sZD1NYXRoLmFicyhpW2Mud2hdKSxmPXQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIik7VC5pc0FycmF5KGYpP2Y9Zi5zbGljZSgpOihudWxsPT1mJiYoZj0iMTAwJSIpLGY9W2YsZl0pLGZbYy5pbmRleF09UChmW2MuaW5kZXhdLGQpLGZbaC5pbmRleF09UChmW2guaW5kZXhdLG4/ZDpNYXRoLmFicyhvKSksdS5zeW1ib2xTaXplPWY7dmFyIHA9dS5zeW1ib2xTY2FsZT1bZlswXS9zLGZbMV0vc107cFtoLmluZGV4XSo9KGwuaXNIb3Jpem9udGFsPy0xOjEpKnJ9ZnVuY3Rpb24gcyh0LGUsaSxuLGEpe3ZhciBvPXQuZ2V0KGspfHwwO28mJih6LmF0dHIoe3NjYWxlOmUuc2xpY2UoKSxyb3RhdGlvbjppfSksei51cGRhdGVUcmFuc2Zvcm0oKSxvLz16LmdldExpbmVTY2FsZSgpLG8qPWVbbi52YWx1ZURpbS5pbmRleF0pLGEudmFsdWVMaW5lV2lkdGg9b31mdW5jdGlvbiBsKHQsZSxpLG4sYSxvLHIscyxsLHUsaCxjKXt2YXIgZD1oLmNhdGVnb3J5RGltLGY9aC52YWx1ZURpbSxwPWMucHhTaWduLGc9TWF0aC5tYXgoZVtmLmluZGV4XStzLDApLG09ZztpZihuKXt2YXIgdj1NYXRoLmFicyhsKSx5PVQucmV0cmlldmUodC5nZXQoInN5bWJvbE1hcmdpbiIpLCIxNSUiKSsiIix4PSExO3kubGFzdEluZGV4T2YoIiEiKT09PXkubGVuZ3RoLTEmJih4PSEwLHk9eS5zbGljZSgwLHkubGVuZ3RoLTEpKSx5PVAoeSxlW2YuaW5kZXhdKTt2YXIgXz1NYXRoLm1heChnKzIqeSwwKSxiPXg/MDoyKnksdz1MLmlzTnVtZXJpYyhuKSxTPXc/bjpJKCh2K2IpL18pLE09di1TKmc7eT1NLzIvKHg/UzpTLTEpLF89ZysyKnksYj14PzA6Mip5LHd8fCJmaXhlZCI9PT1ufHwoUz11P0koKE1hdGguYWJzKHUpK2IpL18pOjApLG09UypfLWIsYy5yZXBlYXRUaW1lcz1TLGMuc3ltYm9sTWFyZ2luPXl9dmFyIEE9cCoobS8yKSxDPWMucGF0aFBvc2l0aW9uPVtdO0NbZC5pbmRleF09aVtkLndoXS8yLENbZi5pbmRleF09InN0YXJ0Ij09PXI/QToiZW5kIj09PXI/bC1BOmwvMixvJiYoQ1swXSs9b1swXSxDWzFdKz1vWzFdKTt2YXIgRD1jLmJ1bmRsZVBvc2l0aW9uPVtdO0RbZC5pbmRleF09aVtkLnh5XSxEW2YuaW5kZXhdPWlbZi54eV07dmFyIGs9Yy5iYXJSZWN0U2hhcGU9VC5leHRlbmQoe30saSk7a1tmLndoXT1wKk1hdGgubWF4KE1hdGguYWJzKGlbZi53aF0pLE1hdGguYWJzKENbZi5pbmRleF0rQSkpLGtbZC53aF09aVtkLndoXTt2YXIgTz1jLmNsaXBTaGFwZT17fTtPW2QueHldPS1pW2QueHldLE9bZC53aF09aC5lY1NpemVbZC53aF0sT1tmLnh5XT0wLE9bZi53aF09aVtmLndoXX1mdW5jdGlvbiB1KHQpe3ZhciBlPXQuc3ltYm9sUGF0dGVyblNpemUsaT1DLmNyZWF0ZVN5bWJvbCh0LnN5bWJvbFR5cGUsLWUvMiwtZS8yLGUsZSx0LmNvbG9yKTtyZXR1cm4gaS5hdHRyKHtjdWxsaW5nOiEwfSksImltYWdlIiE9PWkudHlwZSYmaS5zZXRTdHlsZSh7c3Ryb2tlTm9TY2FsZTohMH0pLGl9ZnVuY3Rpb24gaCh0LGUsaSxuKXtmdW5jdGlvbiBhKHQpe3ZhciBlPWMuc2xpY2UoKSxuPWkucHhTaWduLGE9dDtyZXR1cm4oInN0YXJ0Ij09PWkuc3ltYm9sUmVwZWF0RGlyZWN0aW9uP24+MDpuPDApJiYoYT1mLTEtdCksZVtkLmluZGV4XT1nKihhLWYvMisuNSkrY1tkLmluZGV4XSx7cG9zaXRpb246ZSxzY2FsZTppLnN5bWJvbFNjYWxlLnNsaWNlKCkscm90YXRpb246aS5yb3RhdGlvbn19ZnVuY3Rpb24gbygpe3codCxmdW5jdGlvbih0KXt0LnRyaWdnZXIoImVtcGhhc2lzIil9KX1mdW5jdGlvbiByKCl7dyh0LGZ1bmN0aW9uKHQpe3QudHJpZ2dlcigibm9ybWFsIil9KX12YXIgcz10Ll9fcGljdG9yaWFsQnVuZGxlLGw9aS5zeW1ib2xTaXplLGg9aS52YWx1ZUxpbmVXaWR0aCxjPWkucGF0aFBvc2l0aW9uLGQ9ZS52YWx1ZURpbSxmPWkucmVwZWF0VGltZXN8fDAscD0wLGc9bFtlLnZhbHVlRGltLmluZGV4XStoKzIqaS5zeW1ib2xNYXJnaW47Zm9yKHcodCxmdW5jdGlvbih0KXt0Ll9fcGljdG9yaWFsQW5pbWF0aW9uSW5kZXg9cCx0Ll9fcGljdG9yaWFsUmVwZWF0VGltZXM9ZixwPGY/Uyh0LG51bGwsYShwKSxpLG4pOlModCxudWxsLHtzY2FsZTpbMCwwXX0saSxuLGZ1bmN0aW9uKCl7cy5yZW1vdmUodCl9KSx2KHQsaSkscCsrfSk7cDxmO3ArKyl7dmFyIG09dShpKTttLl9fcGljdG9yaWFsQW5pbWF0aW9uSW5kZXg9cCxtLl9fcGljdG9yaWFsUmVwZWF0VGltZXM9ZixzLmFkZChtKTt2YXIgeT1hKHApO1MobSx7cG9zaXRpb246eS5wb3NpdGlvbixzY2FsZTpbMCwwXX0se3NjYWxlOnkuc2NhbGUscm90YXRpb246eS5yb3RhdGlvbn0saSxuKSxtLm9uKCJtb3VzZW92ZXIiLG8pLm9uKCJtb3VzZW91dCIsciksdihtLGkpfX1mdW5jdGlvbiBjKHQsZSxpLG4pe2Z1bmN0aW9uIGEoKXt0aGlzLnRyaWdnZXIoImVtcGhhc2lzIil9ZnVuY3Rpb24gbygpe3RoaXMudHJpZ2dlcigibm9ybWFsIil9dmFyIHI9dC5fX3BpY3RvcmlhbEJ1bmRsZSxzPXQuX19waWN0b3JpYWxNYWluUGF0aDtzP1MocyxudWxsLHtwb3NpdGlvbjppLnBhdGhQb3NpdGlvbi5zbGljZSgpLHNjYWxlOmkuc3ltYm9sU2NhbGUuc2xpY2UoKSxyb3RhdGlvbjppLnJvdGF0aW9ufSxpLG4pOihzPXQuX19waWN0b3JpYWxNYWluUGF0aD11KGkpLHIuYWRkKHMpLFMocyx7cG9zaXRpb246aS5wYXRoUG9zaXRpb24uc2xpY2UoKSxzY2FsZTpbMCwwXSxyb3RhdGlvbjppLnJvdGF0aW9ufSx7c2NhbGU6aS5zeW1ib2xTY2FsZS5zbGljZSgpfSxpLG4pLHMub24oIm1vdXNlb3ZlciIsYSkub24oIm1vdXNlb3V0IixvKSksdihzLGkpfWZ1bmN0aW9uIGQodCxlLGkpe3ZhciBuPVQuZXh0ZW5kKHt9LGUuYmFyUmVjdFNoYXBlKSxhPXQuX19waWN0b3JpYWxCYXJSZWN0O2E/UyhhLG51bGwse3NoYXBlOm59LGUsaSk6KGE9dC5fX3BpY3RvcmlhbEJhclJlY3Q9bmV3IEEuUmVjdCh7ejI6MixzaGFwZTpuLHNpbGVudDohMCxzdHlsZTp7c3Ryb2tlOiJ0cmFuc3BhcmVudCIsZmlsbDoidHJhbnNwYXJlbnQiLGxpbmVXaWR0aDowfX0pLHQuYWRkKGEpKX1mdW5jdGlvbiBmKHQsZSxpLG4pe2lmKGkuc3ltYm9sQ2xpcCl7dmFyIGE9dC5fX3BpY3RvcmlhbENsaXBQYXRoLG89VC5leHRlbmQoe30saS5jbGlwU2hhcGUpLHI9ZS52YWx1ZURpbSxzPWkuYW5pbWF0aW9uTW9kZWwsbD1pLmRhdGFJbmRleDtpZihhKUEudXBkYXRlUHJvcHMoYSx7c2hhcGU6b30scyxsKTtlbHNle29bci53aF09MCxhPW5ldyBBLlJlY3Qoe3NoYXBlOm99KSx0Ll9fcGljdG9yaWFsQnVuZGxlLnNldENsaXBQYXRoKGEpLHQuX19waWN0b3JpYWxDbGlwUGF0aD1hO3ZhciB1PXt9O3Vbci53aF09aS5jbGlwU2hhcGVbci53aF0sQVtuPyJ1cGRhdGVQcm9wcyI6ImluaXRQcm9wcyJdKGEse3NoYXBlOnV9LHMsbCl9fX1mdW5jdGlvbiBwKHQsZSl7dmFyIGk9dC5nZXRJdGVtTW9kZWwoZSk7cmV0dXJuIGkuZ2V0QW5pbWF0aW9uRGVsYXlQYXJhbXM9ZyxpLmlzQW5pbWF0aW9uRW5hYmxlZD1tLGl9ZnVuY3Rpb24gZyh0KXtyZXR1cm57aW5kZXg6dC5fX3BpY3RvcmlhbEFuaW1hdGlvbkluZGV4LGNvdW50OnQuX19waWN0b3JpYWxSZXBlYXRUaW1lc319ZnVuY3Rpb24gbSgpe3JldHVybiB0aGlzLnBhcmVudE1vZGVsLmlzQW5pbWF0aW9uRW5hYmxlZCgpJiYhIXRoaXMuZ2V0U2hhbGxvdygiYW5pbWF0aW9uIil9ZnVuY3Rpb24gdih0LGUpe3Qub2ZmKCJlbXBoYXNpcyIpLm9mZigibm9ybWFsIik7dmFyIGk9ZS5zeW1ib2xTY2FsZS5zbGljZSgpO2UuaG92ZXJBbmltYXRpb24mJnQub24oImVtcGhhc2lzIixmdW5jdGlvbigpe3RoaXMuYW5pbWF0ZVRvKHtzY2FsZTpbMS4xKmlbMF0sMS4xKmlbMV1dfSw0MDAsImVsYXN0aWNPdXQiKX0pLm9uKCJub3JtYWwiLGZ1bmN0aW9uKCl7dGhpcy5hbmltYXRlVG8oe3NjYWxlOmkuc2xpY2UoKX0sNDAwLCJlbGFzdGljT3V0Iil9KX1mdW5jdGlvbiB5KHQsZSxpLG4pe3ZhciBhPW5ldyBBLkdyb3VwLG89bmV3IEEuR3JvdXA7cmV0dXJuIGEuYWRkKG8pLGEuX19waWN0b3JpYWxCdW5kbGU9byxvLmF0dHIoInBvc2l0aW9uIixpLmJ1bmRsZVBvc2l0aW9uLnNsaWNlKCkpLGkuc3ltYm9sUmVwZWF0P2goYSxlLGkpOmMoYSxlLGkpLGQoYSxpLG4pLGYoYSxlLGksbiksYS5fX3BpY3RvcmlhbFNoYXBlU3RyPWIodCxpKSxhLl9fcGljdG9yaWFsU3ltYm9sTWV0YT1pLGF9ZnVuY3Rpb24geCh0LGUsaSl7dmFyIG49aS5hbmltYXRpb25Nb2RlbCxhPWkuZGF0YUluZGV4LG89dC5fX3BpY3RvcmlhbEJ1bmRsZTtBLnVwZGF0ZVByb3BzKG8se3Bvc2l0aW9uOmkuYnVuZGxlUG9zaXRpb24uc2xpY2UoKX0sbixhKSxpLnN5bWJvbFJlcGVhdD9oKHQsZSxpLCEwKTpjKHQsZSxpLCEwKSxkKHQsaSwhMCksZih0LGUsaSwhMCl9ZnVuY3Rpb24gXyh0LGUsaSxuKXt2YXIgYT1uLl9fcGljdG9yaWFsQmFyUmVjdDthJiYoYS5zdHlsZS50ZXh0PW51bGwpO3ZhciBvPVtdO3cobixmdW5jdGlvbih0KXtvLnB1c2godCl9KSxuLl9fcGljdG9yaWFsTWFpblBhdGgmJm8ucHVzaChuLl9fcGljdG9yaWFsTWFpblBhdGgpLG4uX19waWN0b3JpYWxDbGlwUGF0aCYmKGk9bnVsbCksVC5lYWNoKG8sZnVuY3Rpb24odCl7QS51cGRhdGVQcm9wcyh0LHtzY2FsZTpbMCwwXX0saSxlLGZ1bmN0aW9uKCl7bi5wYXJlbnQmJm4ucGFyZW50LnJlbW92ZShuKX0pfSksdC5zZXRJdGVtR3JhcGhpY0VsKGUsbnVsbCl9ZnVuY3Rpb24gYih0LGUpe3JldHVyblt0LmdldEl0ZW1WaXN1YWwoZS5kYXRhSW5kZXgsInN5bWJvbCIpfHwibm9uZSIsISFlLnN5bWJvbFJlcGVhdCwhIWUuc3ltYm9sQ2xpcF0uam9pbigiOiIpfWZ1bmN0aW9uIHcodCxlLGkpe1QuZWFjaCh0Ll9fcGljdG9yaWFsQnVuZGxlLmNoaWxkcmVuKCksZnVuY3Rpb24obil7biE9PXQuX19waWN0b3JpYWxCYXJSZWN0JiZlLmNhbGwoaSxuKX0pfWZ1bmN0aW9uIFModCxlLGksbixhLG8pe2UmJnQuYXR0cihlKSxuLnN5bWJvbENsaXAmJiFhP2kmJnQuYXR0cihpKTppJiZBW2E/InVwZGF0ZVByb3BzIjoiaW5pdFByb3BzIl0odCxpLG4uYW5pbWF0aW9uTW9kZWwsbi5kYXRhSW5kZXgsbyl9ZnVuY3Rpb24gTSh0LGUsaSl7dmFyIG49aS5jb2xvcixhPWkuZGF0YUluZGV4LG89aS5pdGVtTW9kZWwscj1vLmdldE1vZGVsKCJpdGVtU3R5bGUubm9ybWFsIikuZ2V0SXRlbVN0eWxlKFsiY29sb3IiXSkscz1vLmdldE1vZGVsKCJpdGVtU3R5bGUuZW1waGFzaXMiKS5nZXRJdGVtU3R5bGUoKSxsPW8uZ2V0U2hhbGxvdygiY3Vyc29yIik7dyh0LGZ1bmN0aW9uKHQpe3Quc2V0Q29sb3IobiksdC5zZXRTdHlsZShULmRlZmF1bHRzKHtmaWxsOm4sb3BhY2l0eTppLm9wYWNpdHl9LHIpKSxBLnNldEhvdmVyU3R5bGUodCxzKSxsJiYodC5jdXJzb3I9bCksdC56Mj1pLnoyfSk7dmFyIHU9e30saD1lLnZhbHVlRGltLnBvc0Rlc2NbKyhpLmJvdW5kaW5nTGVuZ3RoPjApXSxjPXQuX19waWN0b3JpYWxCYXJSZWN0O0Quc2V0TGFiZWwoYy5zdHlsZSx1LG8sbixlLnNlcmllc01vZGVsLGEsaCksQS5zZXRIb3ZlclN0eWxlKGMsdSl9ZnVuY3Rpb24gSSh0KXt2YXIgZT1NYXRoLnJvdW5kKHQpO3JldHVybiBNYXRoLmFicyh0LWUpPDFlLTQ/ZTpNYXRoLmNlaWwodCl9dmFyIFQ9aSgxKSxBPWkoMyksQz1pKDI0KSxMPWkoNCksRD1pKDk2KSxQPUwucGFyc2VQZXJjZW50LGs9WyJpdGVtU3R5bGUiLCJub3JtYWwiLCJib3JkZXJXaWR0aCJdLE89W3t4eToieCIsd2g6IndpZHRoIixpbmRleDowLHBvc0Rlc2M6WyJsZWZ0IiwicmlnaHQiXX0se3h5OiJ5Iix3aDoiaGVpZ2h0IixpbmRleDoxLHBvc0Rlc2M6WyJ0b3AiLCJib3R0b20iXX1dLHo9bmV3IEEuQ2lyY2xlLFI9aSgyKS5leHRlbmRDaGFydFZpZXcoe3R5cGU6InBpY3RvcmlhbEJhciIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgYT10aGlzLmdyb3VwLG89dC5nZXREYXRhKCkscj10aGlzLl9kYXRhLHM9dC5jb29yZGluYXRlU3lzdGVtLGw9cy5nZXRCYXNlQXhpcygpLHU9ISFsLmlzSG9yaXpvbnRhbCgpLGg9cy5ncmlkLmdldFJlY3QoKSxjPXtlY1NpemU6e3dpZHRoOmkuZ2V0V2lkdGgoKSxoZWlnaHQ6aS5nZXRIZWlnaHQoKX0sc2VyaWVzTW9kZWw6dCxjb29yZFN5czpzLGNvb3JkU3lzRXh0ZW50OltbaC54LGgueCtoLndpZHRoXSxbaC55LGgueStoLmhlaWdodF1dLGlzSG9yaXpvbnRhbDp1LHZhbHVlRGltOk9bK3VdLGNhdGVnb3J5RGltOk9bMS11XX07cmV0dXJuIG8uZGlmZihyKS5hZGQoZnVuY3Rpb24odCl7aWYoby5oYXNWYWx1ZSh0KSl7dmFyIGU9cChvLHQpLGk9bihvLHQsZSxjKSxyPXkobyxjLGkpO28uc2V0SXRlbUdyYXBoaWNFbCh0LHIpLGEuYWRkKHIpLE0ocixjLGkpfX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPXIuZ2V0SXRlbUdyYXBoaWNFbChlKTtpZighby5oYXNWYWx1ZSh0KSlyZXR1cm4gdm9pZCBhLnJlbW92ZShpKTt2YXIgcz1wKG8sdCksbD1uKG8sdCxzLGMpLHU9YihvLGwpO2kmJnUhPT1pLl9fcGljdG9yaWFsU2hhcGVTdHImJihhLnJlbW92ZShpKSxvLnNldEl0ZW1HcmFwaGljRWwodCxudWxsKSxpPW51bGwpLGk/eChpLGMsbCk6aT15KG8sYyxsLCEwKSxvLnNldEl0ZW1HcmFwaGljRWwodCxpKSxpLl9fcGljdG9yaWFsU3ltYm9sTWV0YT1sLGEuYWRkKGkpLE0oaSxjLGwpfSkucmVtb3ZlKGZ1bmN0aW9uKHQpe3ZhciBlPXIuZ2V0SXRlbUdyYXBoaWNFbCh0KTtlJiZfKHIsdCxlLl9fcGljdG9yaWFsU3ltYm9sTWV0YS5hbmltYXRpb25Nb2RlbCxlKX0pLmV4ZWN1dGUoKSx0aGlzLl9kYXRhPW8sdGhpcy5ncm91cH0sZGlzcG9zZTpULm5vb3AscmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5ncm91cCxuPXRoaXMuX2RhdGE7dC5nZXQoImFuaW1hdGlvbiIpP24mJm4uZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24oZSl7XyhuLGUuZGF0YUluZGV4LHQsZSl9KTppLnJlbW92ZUFsbCgpfX0pO3QuZXhwb3J0cz1SfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyKTtpKDI3OSksaSgyODApLG4ucmVnaXN0ZXJWaXN1YWwoaSgyODIpKSxuLnJlZ2lzdGVyTGF5b3V0KGkoMjgxKSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgxKSxhPWkoMTcpLG89aSgxODkpLHI9YS5leHRlbmQoe3R5cGU6InNlcmllcy5ib3hwbG90IixkZXBlbmRlbmNpZXM6WyJ4QXhpcyIsInlBeGlzIiwiZ3JpZCJdLGRlZmF1bHRWYWx1ZURpbWVuc2lvbnM6WyJtaW4iLCJRMSIsIm1lZGlhbiIsIlEzIiwibWF4Il0sZGltZW5zaW9uczpudWxsLGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6Mixjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsbGVnZW5kSG92ZXJMaW5rOiEwLGhvdmVyQW5pbWF0aW9uOiEwLGxheW91dDpudWxsLGJveFdpZHRoOls3LDUwXSxpdGVtU3R5bGU6e25vcm1hbDp7Y29sb3I6IiNmZmYiLGJvcmRlcldpZHRoOjF9LGVtcGhhc2lzOntib3JkZXJXaWR0aDoyLHNoYWRvd0JsdXI6NSxzaGFkb3dPZmZzZXRYOjIsc2hhZG93T2Zmc2V0WToyLHNoYWRvd0NvbG9yOiJyZ2JhKDAsMCwwLDAuNCkifX0sYW5pbWF0aW9uRWFzaW5nOiJlbGFzdGljT3V0IixhbmltYXRpb25EdXJhdGlvbjo4MDB9fSk7bi5taXhpbihyLG8uc2VyaWVzTW9kZWxNaXhpbiwhMCksdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49ZS5nZXRJdGVtTW9kZWwoaSksYT1uLmdldE1vZGVsKHUpLG89ZS5nZXRJdGVtVmlzdWFsKGksImNvbG9yIikscz1hLmdldEl0ZW1TdHlsZShbImJvcmRlckNvbG9yIl0pLGw9dC5jaGlsZEF0KHQud2hpc2tlckluZGV4KTtsLnN0eWxlLnNldChzKSxsLnN0eWxlLnN0cm9rZT1vLGwuZGlydHkoKTt2YXIgYz10LmNoaWxkQXQodC5ib2R5SW5kZXgpO2Muc3R5bGUuc2V0KHMpLGMuc3R5bGUuc3Ryb2tlPW8sYy5kaXJ0eSgpO3ZhciBkPW4uZ2V0TW9kZWwoaCkuZ2V0SXRlbVN0eWxlKCk7ci5zZXRIb3ZlclN0eWxlKHQsZCl9dmFyIGE9aSgxKSxvPWkoMzApLHI9aSgzKSxzPWkoMTg5KSxsPW8uZXh0ZW5kKHt0eXBlOiJib3hwbG90IixnZXRTdHlsZVVwZGF0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZGlzcG9zZTphLm5vb3B9KTthLm1peGluKGwscy52aWV3TWl4aW4sITApO3ZhciB1PVsiaXRlbVN0eWxlIiwibm9ybWFsIl0saD1bIml0ZW1TdHlsZSIsImVtcGhhc2lzIl07dC5leHBvcnRzPWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPVtdLGk9W107cmV0dXJuIHQuZWFjaFNlcmllc0J5VHlwZSgiYm94cGxvdCIsZnVuY3Rpb24odCl7dmFyIG49dC5nZXRCYXNlQXhpcygpLGE9ci5pbmRleE9mKGksbik7YTwwJiYoYT1pLmxlbmd0aCxpW2FdPW4sZVthXT17YXhpczpuLHNlcmllc01vZGVsczpbXX0pLGVbYV0uc2VyaWVzTW9kZWxzLnB1c2godCl9KSxlfWZ1bmN0aW9uIGEodCl7dmFyIGUsaSxuPXQuYXhpcyxhPXQuc2VyaWVzTW9kZWxzLG89YS5sZW5ndGgscz10LmJveFdpZHRoTGlzdD1bXSxoPXQuYm94T2Zmc2V0TGlzdD1bXSxjPVtdO2lmKCJjYXRlZ29yeSI9PT1uLnR5cGUpaT1uLmdldEJhbmRXaWR0aCgpO2Vsc2V7dmFyIGQ9MDt1KGEsZnVuY3Rpb24odCl7ZD1NYXRoLm1heChkLHQuZ2V0RGF0YSgpLmNvdW50KCkpfSksZT1uLmdldEV4dGVudCgpLE1hdGguYWJzKGVbMV0tZVswXSkvZH11KGEsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImJveFdpZHRoIik7ci5pc0FycmF5KGUpfHwoZT1bZSxlXSksYy5wdXNoKFtsKGVbMF0saSl8fDAsbChlWzFdLGkpfHwwXSl9KTt2YXIgZj0uOCppLTIscD1mL28qLjMsZz0oZi1wKihvLTEpKS9vLG09Zy8yLWYvMjt1KGEsZnVuY3Rpb24odCxlKXtoLnB1c2gobSksbSs9cCtnLHMucHVzaChNYXRoLm1pbihNYXRoLm1heChnLGNbZV1bMF0pLGNbZV1bMV0pKX0pfWZ1bmN0aW9uIG8odCxlLGkpe3ZhciBuLGE9dC5jb29yZGluYXRlU3lzdGVtLG89dC5nZXREYXRhKCkscz1pLzIsbD10LmdldCgibGF5b3V0IiksdT0iaG9yaXpvbnRhbCI9PT1sPzA6MSxoPTEtdSxjPVsieCIsInkiXSxkPVtdO3IuZWFjaChvLmRpbWVuc2lvbnMsZnVuY3Rpb24odCl7dmFyIGU9by5nZXREaW1lbnNpb25JbmZvKHQpLGk9ZS5jb29yZERpbTtpPT09Y1toXT9kLnB1c2godCk6aT09PWNbdV0mJihuPXQpfSksbnVsbD09bnx8ZC5sZW5ndGg8NXx8by5lYWNoKFtuXS5jb25jYXQoZCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBpPVtdO2lbdV09YyxpW2hdPXQ7dmFyIG47cmV0dXJuIGlzTmFOKGMpfHxpc05hTih0KT9uPVtOYU4sTmFOXToobj1hLmRhdGFUb1BvaW50KGkpLG5bdV0rPWUpLG59ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPXQuc2xpY2UoKSxuPXQuc2xpY2UoKTtpW3VdKz1zLG5bdV0tPXMsZT95LnB1c2goaSxuKTp5LnB1c2gobixpKX1mdW5jdGlvbiBuKHQpe3ZhciBlPVt0LnNsaWNlKCksdC5zbGljZSgpXTtlWzBdW3VdLT1zLGVbMV1bdV0rPXMsdi5wdXNoKGUpfXZhciByPWFyZ3VtZW50cyxjPXJbMF0sZj1yW2QubGVuZ3RoKzFdLHA9dChyWzNdKSxnPXQoclsxXSksbT10KHJbNV0pLHY9W1tnLHQoclsyXSldLFttLHQocls0XSldXTtuKGcpLG4obSksbihwKTt2YXIgeT1bXTtpKHZbMF1bMV0sMCksaSh2WzFdWzFdLDEpLG8uc2V0SXRlbUxheW91dChmLHtjaGFydExheW91dDpsLGluaXRCYXNlbGluZTpwW2hdLG1lZGlhbjpwLGJvZHlFbmRzOnksd2hpc2tlckVuZHM6dn0pfSl9dmFyIHI9aSgxKSxzPWkoNCksbD1zLnBhcnNlUGVyY2VudCx1PXIuZWFjaDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bih0KTt1KGUsZnVuY3Rpb24odCl7dmFyIGU9dC5zZXJpZXNNb2RlbHM7ZS5sZW5ndGgmJihhKHQpLHUoZSxmdW5jdGlvbihlLGkpe28oZSx0LmJveE9mZnNldExpc3RbaV0sdC5ib3hXaWR0aExpc3RbaV0pfSkpfSl9fSxmdW5jdGlvbih0LGUpe3ZhciBpPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwiYm9yZGVyQ29sb3IiXTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldCgiY29sb3IiKTt0LmVhY2hSYXdTZXJpZXNCeVR5cGUoImJveHBsb3QiLGZ1bmN0aW9uKGUpe3ZhciBhPW5bZS5zZXJpZXNJbmRleCVuLmxlbmd0aF0sbz1lLmdldERhdGEoKTtvLnNldFZpc3VhbCh7bGVnZW5kU3ltYm9sOiJyb3VuZFJlY3QiLGNvbG9yOmUuZ2V0KGkpfHxhfSksdC5pc1Nlcmllc0ZpbHRlcmVkKGUpfHxvLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9by5nZXRJdGVtTW9kZWwodCk7by5zZXRJdGVtVmlzdWFsKHQse2NvbG9yOmUuZ2V0KGksITApfSl9KX0pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMik7aSgyODQpLGkoMjg1KSxuLnJlZ2lzdGVyUHJlcHJvY2Vzc29yKGkoMjg4KSksbi5yZWdpc3RlclZpc3VhbChpKDI4NykpLG4ucmVnaXN0ZXJMYXlvdXQoaSgyODYpKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDEpLGE9aSgxNyksbz1pKDE4OSkscj1hLmV4dGVuZCh7dHlwZToic2VyaWVzLmNhbmRsZXN0aWNrIixkZXBlbmRlbmNpZXM6WyJ4QXhpcyIsInlBeGlzIiwiZ3JpZCJdLGRlZmF1bHRWYWx1ZURpbWVuc2lvbnM6WyJvcGVuIiwiY2xvc2UiLCJsb3dlc3QiLCJoaWdoZXN0Il0sZGltZW5zaW9uczpudWxsLGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6Mixjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsbGVnZW5kSG92ZXJMaW5rOiEwLGhvdmVyQW5pbWF0aW9uOiEwLGxheW91dDpudWxsLGl0ZW1TdHlsZTp7bm9ybWFsOntjb2xvcjoiI2MyMzUzMSIsY29sb3IwOiIjMzE0NjU2Iixib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiIjYzIzNTMxIixib3JkZXJDb2xvcjA6IiMzMTQ2NTYifSxlbXBoYXNpczp7Ym9yZGVyV2lkdGg6Mn19LGJhck1heFdpZHRoOm51bGwsYmFyTWluV2lkdGg6bnVsbCxiYXJXaWR0aDpudWxsLGFuaW1hdGlvblVwZGF0ZTohMSxhbmltYXRpb25FYXNpbmc6ImxpbmVhciIsYW5pbWF0aW9uRHVyYXRpb246MzAwfSxnZXRTaGFkb3dEaW06ZnVuY3Rpb24oKXtyZXR1cm4ib3BlbiJ9LGJydXNoU2VsZWN0b3I6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWUuZ2V0SXRlbUxheW91dCh0KTtyZXR1cm4gaS5yZWN0KG4uYnJ1c2hSZWN0KX19KTtuLm1peGluKHIsby5zZXJpZXNNb2RlbE1peGluLCEwKSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj1lLmdldEl0ZW1Nb2RlbChpKSxhPW4uZ2V0TW9kZWwodSksbz1lLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxzPWUuZ2V0SXRlbVZpc3VhbChpLCJib3JkZXJDb2xvciIpfHxvLGw9YS5nZXRJdGVtU3R5bGUoWyJjb2xvciIsImNvbG9yMCIsImJvcmRlckNvbG9yIiwiYm9yZGVyQ29sb3IwIl0pLGM9dC5jaGlsZEF0KHQud2hpc2tlckluZGV4KTtjLnVzZVN0eWxlKGwpLGMuc3R5bGUuc3Ryb2tlPXM7dmFyIGQ9dC5jaGlsZEF0KHQuYm9keUluZGV4KTtkLnVzZVN0eWxlKGwpLGQuc3R5bGUuZmlsbD1vLGQuc3R5bGUuc3Ryb2tlPXM7dmFyIGY9bi5nZXRNb2RlbChoKS5nZXRJdGVtU3R5bGUoKTtyLnNldEhvdmVyU3R5bGUodCxmKX12YXIgYT1pKDEpLG89aSgzMCkscj1pKDMpLHM9aSgxODkpLGw9by5leHRlbmQoe3R5cGU6ImNhbmRsZXN0aWNrIixnZXRTdHlsZVVwZGF0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZGlzcG9zZTphLm5vb3B9KTthLm1peGluKGwscy52aWV3TWl4aW4sITApO3ZhciB1PVsiaXRlbVN0eWxlIiwibm9ybWFsIl0saD1bIml0ZW1TdHlsZSIsImVtcGhhc2lzIl07dC5leHBvcnRzPWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7dmFyIGksbj10LmdldEJhc2VBeGlzKCksYT0iY2F0ZWdvcnkiPT09bi50eXBlP24uZ2V0QmFuZFdpZHRoKCk6KGk9bi5nZXRFeHRlbnQoKSxNYXRoLmFicyhpWzFdLWlbMF0pL2UuY291bnQoKSkscz1yKG8odC5nZXQoImJhck1heFdpZHRoIiksYSksYSksbD1yKG8odC5nZXQoImJhck1pbldpZHRoIiksMSksYSksdT10LmdldCgiYmFyV2lkdGgiKTtyZXR1cm4gbnVsbCE9dT9yKHUsYSk6TWF0aC5tYXgoTWF0aC5taW4oYS8yLHMpLGwpfXZhciBhPWkoMSksbz1pKDEpLnJldHJpZXZlLHI9aSg0KS5wYXJzZVBlcmNlbnQscz1pKDMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImNhbmRsZXN0aWNrIixmdW5jdGlvbih0KXt2YXIgZSxpPXQuY29vcmRpbmF0ZVN5c3RlbSxvPXQuZ2V0RGF0YSgpLHI9bih0LG8pLGw9dC5nZXQoImxheW91dCIpLHU9Imhvcml6b250YWwiPT09bD8wOjEsaD0xLXUsYz1bIngiLCJ5Il0sZD1bXTtpZihhLmVhY2goby5kaW1lbnNpb25zLGZ1bmN0aW9uKHQpe3ZhciBpPW8uZ2V0RGltZW5zaW9uSW5mbyh0KSxuPWkuY29vcmREaW07bj09PWNbaF0/ZC5wdXNoKHQpOm49PT1jW3VdJiYoZT10KX0pLCEobnVsbD09ZXx8ZC5sZW5ndGg8NCkpe3ZhciBmPTA7by5lYWNoKFtlXS5jb25jYXQoZCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPVtdO3JldHVybiBlW3VdPXAsZVtoXT10LGlzTmFOKHApfHxpc05hTih0KT9bTmFOLE5hTl06aS5kYXRhVG9Qb2ludChlKX1mdW5jdGlvbiBlKHQsZSl7dmFyIGk9dC5zbGljZSgpLG49dC5zbGljZSgpO2lbdV09cy5zdWJQaXhlbE9wdGltaXplKGlbdV0rci8yLDEsITEpLG5bdV09cy5zdWJQaXhlbE9wdGltaXplKG5bdV0tci8yLDEsITApLGU/QS5wdXNoKGksbik6QS5wdXNoKG4saSl9ZnVuY3Rpb24gbigpe3ZhciBlPXQoTWF0aC5taW4obSx2LHkseCkpLGk9dChNYXRoLm1heChtLHYseSx4KSk7cmV0dXJuIGVbdV0tPXIvMixpW3VdLT1yLzIse3g6ZVswXSx5OmVbMV0sd2lkdGg6aD9yOmlbMF0tZVswXSxoZWlnaHQ6aD9pWzFdLWVbMV06cn19ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdFt1XT1zLnN1YlBpeGVsT3B0aW1pemUodFt1XSwxKSx0fXZhciBjPWFyZ3VtZW50cyxwPWNbMF0sZz1jW2QubGVuZ3RoKzFdLG09Y1sxXSx2PWNbMl0seT1jWzNdLHg9Y1s0XSxfPU1hdGgubWluKG0sdiksYj1NYXRoLm1heChtLHYpLHc9dChfKSxTPXQoYiksTT10KHkpLEk9dCh4KSxUPVtbYShJKSxhKFMpXSxbYShNKSxhKHcpXV0sQT1bXTtlKFMsMCksZSh3LDEpO3ZhciBDO0M9bT52Py0xOm08dj8xOmY+MD9vLmdldEl0ZW1Nb2RlbChmLTEpLmdldCgpWzJdPD12PzE6LTE6MSxvLnNldEl0ZW1MYXlvdXQoZyx7Y2hhcnRMYXlvdXQ6bCxzaWduOkMsaW5pdEJhc2VsaW5lOm0+dj9TW2hdOndbaF0sYm9keUVuZHM6QSx3aGlza2VyRW5kczpULGJydXNoUmVjdDpuKCl9KSwrK2Z9LCEwKX19KX19LGZ1bmN0aW9uKHQsZSl7dmFyIGk9WyJpdGVtU3R5bGUiLCJub3JtYWwiLCJib3JkZXJDb2xvciJdLG49WyJpdGVtU3R5bGUiLCJub3JtYWwiLCJib3JkZXJDb2xvcjAiXSxhPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwiY29sb3IiXSxvPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwiY29sb3IwIl07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5lYWNoUmF3U2VyaWVzQnlUeXBlKCJjYW5kbGVzdGljayIsZnVuY3Rpb24oZSl7dmFyIHI9ZS5nZXREYXRhKCk7ci5zZXRWaXN1YWwoe2xlZ2VuZFN5bWJvbDoicm91bmRSZWN0In0pLHQuaXNTZXJpZXNGaWx0ZXJlZChlKXx8ci5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXIuZ2V0SXRlbU1vZGVsKHQpLHM9ci5nZXRJdGVtTGF5b3V0KHQpLnNpZ247ci5zZXRJdGVtVmlzdWFsKHQse2NvbG9yOmUuZ2V0KHM+MD9hOm8pLGJvcmRlckNvbG9yOmUuZ2V0KHM+MD9pOm4pfSl9KX0pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QmJm4uaXNBcnJheSh0LnNlcmllcykmJm4uZWFjaCh0LnNlcmllcyxmdW5jdGlvbih0KXtuLmlzT2JqZWN0KHQpJiYiayI9PT10LnR5cGUmJih0LnR5cGU9ImNhbmRsZXN0aWNrIil9KX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlLGk9dC50eXBlO2lmKCJwYXRoIj09PWkpe3ZhciBuPXQuc2hhcGU7ZT1tLm1ha2VQYXRoKG4ucGF0aERhdGEsbnVsbCx7eDpuLnh8fDAseTpuLnl8fDAsd2lkdGg6bi53aWR0aHx8MCxoZWlnaHQ6bi5oZWlnaHR8fDB9LCJjZW50ZXIiKSxlLl9fY3VzdG9tUGF0aERhdGE9dC5wYXRoRGF0YX1lbHNlIGlmKCJpbWFnZSI9PT1pKWU9bmV3IG0uSW1hZ2Uoe30pLGUuX19jdXN0b21JbWFnZVBhdGg9dC5zdHlsZS5pbWFnZTtlbHNlIGlmKCJ0ZXh0Ij09PWkpZT1uZXcgbS5UZXh0KHt9KSxlLl9fY3VzdG9tVGV4dD10LnN0eWxlLnRleHQ7ZWxzZXt2YXIgYT1tW2kuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkraS5zbGljZSgxKV07ZT1uZXcgYX1yZXR1cm4gZS5fX2N1c3RvbUdyYXBoaWNUeXBlPWksZS5uYW1lPXQubmFtZSxlfWZ1bmN0aW9uIGEodCxlLGksbixhLHIpe3ZhciBzPXt9LGw9aS5zdHlsZXx8e307aWYoaS5zaGFwZSYmKHMuc2hhcGU9Zy5jbG9uZShpLnNoYXBlKSksaS5wb3NpdGlvbiYmKHMucG9zaXRpb249aS5wb3NpdGlvbi5zbGljZSgpKSxpLnNjYWxlJiYocy5zY2FsZT1pLnNjYWxlLnNsaWNlKCkpLGkub3JpZ2luJiYocy5vcmlnaW49aS5vcmlnaW4uc2xpY2UoKSksaS5yb3RhdGlvbiYmKHMucm90YXRpb249aS5yb3RhdGlvbiksImltYWdlIj09PXQudHlwZSYmaS5zdHlsZSl7dmFyIHU9cy5zdHlsZT17fTtnLmVhY2goWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oZSl7byhlLHUsbCx0LnN0eWxlLHIpfSl9aWYoInRleHQiPT09dC50eXBlJiZpLnN0eWxlKXt2YXIgdT1zLnN0eWxlPXt9O2cuZWFjaChbIngiLCJ5Il0sZnVuY3Rpb24oZSl7byhlLHUsbCx0LnN0eWxlLHIpfSksIWwuaGFzT3duUHJvcGVydHkoInRleHRGaWxsIikmJmwuZmlsbCYmKGwudGV4dEZpbGw9bC5maWxsKSwhbC5oYXNPd25Qcm9wZXJ0eSgidGV4dFN0cm9rZSIpJiZsLnN0cm9rZSYmKGwudGV4dFN0cm9rZT1sLnN0cm9rZSl9aWYoImdyb3VwIiE9PXQudHlwZSYmKHQudXNlU3R5bGUobCkscikpe3Quc3R5bGUub3BhY2l0eT0wO3ZhciBoPWwub3BhY2l0eTtudWxsPT1oJiYoaD0xKSxtLmluaXRQcm9wcyh0LHtzdHlsZTp7b3BhY2l0eTpofX0sbixlKX1yP3QuYXR0cihzKTptLnVwZGF0ZVByb3BzKHQscyxuLGUpLHQuYXR0cih7ejI6aS56Mnx8MCxzaWxlbnQ6aS5zaWxlbnR9KSxpLnN0eWxlRW1waGFzaXMhPT0hMSYmbS5zZXRIb3ZlclN0eWxlKHQsaS5zdHlsZUVtcGhhc2lzKX1mdW5jdGlvbiBvKHQsZSxpLG4sYSl7bnVsbD09aVt0XXx8YXx8KGVbdF09aVt0XSxpW3RdPW5bdF0pfWZ1bmN0aW9uIHIodCxlLGksbil7ZnVuY3Rpb24gYSh0KXtudWxsPT10JiYodD1fKSxPJiYoST1lLmdldEl0ZW1Nb2RlbCh0KSxBPUkuZ2V0TW9kZWwoUyksQz1JLmdldE1vZGVsKE0pLEw9di5maW5kTGFiZWxWYWx1ZURpbShlKSxEPWUuZ2V0SXRlbVZpc3VhbCh0LCJjb2xvciIpLE89ITEpfWZ1bmN0aW9uIG8odCxpKXtyZXR1cm4gbnVsbD09aSYmKGk9XyksZS5nZXQoZS5nZXREaW1lbnNpb24odHx8MCksaSl9ZnVuY3Rpb24gcihpLG4pe251bGw9PW4mJihuPV8pLGEobik7dmFyIG89SS5nZXRNb2RlbChiKS5nZXRJdGVtU3R5bGUoKTtudWxsIT1EJiYoby5maWxsPUQpO3ZhciByPWUuZ2V0SXRlbVZpc3VhbChuLCJvcGFjaXR5Iik7cmV0dXJuIG51bGwhPXImJihvLm9wYWNpdHk9ciksbnVsbCE9TCYmKG0uc2V0VGV4dFN0eWxlKG8sQSxudWxsLHthdXRvQ29sb3I6RCxpc1JlY3RUZXh0OiEwfSksby50ZXh0PUEuZ2V0U2hhbGxvdygic2hvdyIpP2cucmV0cmlldmUyKHQuZ2V0Rm9ybWF0dGVkTGFiZWwobiwibm9ybWFsIiksZS5nZXQoTCxuKSk6bnVsbCksaSYmZy5leHRlbmQobyxpKSxvfWZ1bmN0aW9uIGwoaSxuKXtudWxsPT1uJiYobj1fKSxhKG4pO3ZhciBvPUkuZ2V0TW9kZWwodykuZ2V0SXRlbVN0eWxlKCk7cmV0dXJuIG51bGwhPUwmJihtLnNldFRleHRTdHlsZShvLEMsbnVsbCx7aXNSZWN0VGV4dDohMH0sITApLG8udGV4dD1DLmdldFNoYWxsb3coInNob3ciKT9nLnJldHJpZXZlMyh0LmdldEZvcm1hdHRlZExhYmVsKG4sImVtcGhhc2lzIiksdC5nZXRGb3JtYXR0ZWRMYWJlbChuLCJub3JtYWwiKSxlLmdldChMLG4pKTpudWxsKSxpJiZnLmV4dGVuZChvLGkpLG99ZnVuY3Rpb24gdSh0LGkpe3JldHVybiBudWxsPT1pJiYoaT1fKSxlLmdldEl0ZW1WaXN1YWwoaSx0KX1mdW5jdGlvbiBoKHQpe2lmKHAuZ2V0QmFzZUF4aXMpe3ZhciBlPXAuZ2V0QmFzZUF4aXMoKTtyZXR1cm4geC5nZXRMYXlvdXRPbkF4aXMoZy5kZWZhdWx0cyh7YXhpczplfSx0KSxuKX19ZnVuY3Rpb24gYygpe3JldHVybiBpLmdldEN1cnJlbnRTZXJpZXNJbmRpY2VzKCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gbS5nZXRGb250KHQsaSl9dmFyIGY9dC5nZXQoInJlbmRlckl0ZW0iKSxwPXQuY29vcmRpbmF0ZVN5c3RlbSx5PXt9O3AmJih5PXAucHJlcGFyZUN1c3RvbXM/cC5wcmVwYXJlQ3VzdG9tcygpOlRbcC50eXBlXShwKSk7dmFyIF8sSSxBLEMsTCxELFA9Zy5kZWZhdWx0cyh7Z2V0V2lkdGg6bi5nZXRXaWR0aCxnZXRIZWlnaHQ6bi5nZXRIZWlnaHQsZ2V0WnI6bi5nZXRacixnZXREZXZpY2VQaXhlbFJhdGlvOm4uZ2V0RGV2aWNlUGl4ZWxSYXRpbyx2YWx1ZTpvLHN0eWxlOnIsc3R5bGVFbXBoYXNpczpsLHZpc3VhbDp1LGJhckxheW91dDpoLGN1cnJlbnRTZXJpZXNJbmRpY2VzOmMsZm9udDpkfSx5LmFwaXx8e30pLGs9e2NvbnRleHQ6e30sc2VyaWVzSWQ6dC5pZCxzZXJpZXNOYW1lOnQubmFtZSxzZXJpZXNJbmRleDp0LnNlcmllc0luZGV4LGNvb3JkU3lzOnkuY29vcmRTeXMsZGF0YUluc2lkZUxlbmd0aDplLmNvdW50KCksZW5jb2RlOnModC5nZXREYXRhKCkpfSxPPSEwO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gXz10LE89ITAsZiYmZihnLmRlZmF1bHRzKHtkYXRhSW5kZXhJbnNpZGU6dCxkYXRhSW5kZXg6ZS5nZXRSYXdJbmRleCh0KX0sayksUCl8fHt9fX1mdW5jdGlvbiBzKHQpe3ZhciBlPXt9O3JldHVybiBnLmVhY2godC5kaW1lbnNpb25zLGZ1bmN0aW9uKGksbil7dmFyIGE9dC5nZXREaW1lbnNpb25JbmZvKGkpO2lmKCFhLmlzRXh0cmFDb29yZCl7dmFyIG89YS5jb29yZERpbSxyPWVbb109ZVtvXXx8W107clthLmNvb3JkRGltSW5kZXhdPW59fSksZX1mdW5jdGlvbiBsKHQsZSxpLG4sYSxvKXt0PXUodCxlLGksbixhLG8pLHQmJm8uc2V0SXRlbUdyYXBoaWNFbChlLHQpfWZ1bmN0aW9uIHUodCxlLGksbyxyLHMpe3ZhciBsPWkudHlwZTtpZighdHx8bD09PXQuX19jdXN0b21HcmFwaGljVHlwZXx8InBhdGgiPT09bCYmaS5wYXRoRGF0YT09PXQuX19jdXN0b21QYXRoRGF0YXx8ImltYWdlIj09PWwmJmkuc3R5bGUuaW1hZ2U9PT10Ll9fY3VzdG9tSW1hZ2VQYXRofHwidGV4dCI9PT1sJiZpLnN0eWxlLnRleHQ9PT10Ll9fY3VzdG9tVGV4dHx8KHIucmVtb3ZlKHQpLHQ9bnVsbCksbnVsbCE9bCl7dmFyIGM9IXQ7aWYoIXQmJih0PW4oaSkpLGEodCxlLGksbyxzLGMpLCJncm91cCI9PT1sKXt2YXIgZD10LmNoaWxkcmVuKCl8fFtdLGY9aS5jaGlsZHJlbnx8W107aWYoaS5kaWZmQ2hpbGRyZW5CeU5hbWUpaCh7b2xkQ2hpbGRyZW46ZCxuZXdDaGlsZHJlbjpmLGRhdGFJbmRleDplLGFuaW1hdGFibGVNb2RlbDpvLGdyb3VwOnQsZGF0YTpzfSk7ZWxzZXtmb3IodmFyIHA9MDtwPGYubGVuZ3RoO3ArKyl1KHQuY2hpbGRBdChwKSxlLGZbcF0sbyx0LHMpO2Zvcig7cDxkLmxlbmd0aDtwKyspZFtwXSYmdC5yZW1vdmUoZFtwXSl9fXJldHVybiByLmFkZCh0KSx0fX1mdW5jdGlvbiBoKHQpe25ldyBfKHQub2xkQ2hpbGRyZW4sdC5uZXdDaGlsZHJlbixjLGMsdCkuYWRkKGQpLnVwZGF0ZShkKS5yZW1vdmUoZikuZXhlY3V0ZSgpfWZ1bmN0aW9uIGModCxlKXt2YXIgaT10JiZ0Lm5hbWU7cmV0dXJuIG51bGwhPWk/aTpJK2V9ZnVuY3Rpb24gZCh0LGUpe3ZhciBpPXRoaXMuY29udGV4dCxuPW51bGwhPXQ/aS5uZXdDaGlsZHJlblt0XTpudWxsLGE9bnVsbCE9ZT9pLm9sZENoaWxkcmVuW2VdOm51bGw7dShhLGkuZGF0YUluZGV4LG4saS5hbmltYXRhYmxlTW9kZWwsaS5ncm91cCxpLmRhdGEpfWZ1bmN0aW9uIGYodCl7dmFyIGU9dGhpcy5jb250ZXh0LGk9ZS5vbGRDaGlsZHJlblt0XTtpJiZlLmdyb3VwLnJlbW92ZShpKX12YXIgcD1pKDIpLGc9aSgxKSxtPWkoMyksdj1pKDk3KSx5PWkoMjgpLHg9aSg4NyksXz1pKDQzKSxiPVsiaXRlbVN0eWxlIiwibm9ybWFsIl0sdz1bIml0ZW1TdHlsZSIsImVtcGhhc2lzIl0sUz1bImxhYmVsIiwibm9ybWFsIl0sTT1bImxhYmVsIiwiZW1waGFzaXMiXSxJPSJlXDBcMCIsVD17Y2FydGVzaWFuMmQ6aSg0MDUpLGdlbzppKDQxMiksc2luZ2xlQXhpczppKDQzMCkscG9sYXI6aSg0MjMpLGNhbGVuZGFyOmkoNDA0KX07cC5leHRlbmRTZXJpZXNNb2RlbCh7dHlwZToic2VyaWVzLmN1c3RvbSIsZGVwZW5kZW5jaWVzOlsiZ3JpZCIsInBvbGFyIiwiZ2VvIiwic2luZ2xlQXhpcyIsImNhbGVuZGFyIl0sZGVmYXVsdE9wdGlvbjp7Y29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLHpsZXZlbDowLHo6MixsZWdlbmRIb3Zlckxpbms6ITB9LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkodC5kYXRhLHRoaXMsZSl9fSkscC5leHRlbmRDaGFydFZpZXcoe3R5cGU6ImN1c3RvbSIsX2RhdGE6bnVsbCxyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2RhdGEsYT10LmdldERhdGEoKSxvPXRoaXMuZ3JvdXAscz1yKHQsYSxlLGkpO2EuZGlmZihuKS5hZGQoZnVuY3Rpb24oZSl7YS5oYXNWYWx1ZShlKSYmbChudWxsLGUscyhlKSx0LG8sYSl9KS51cGRhdGUoZnVuY3Rpb24oZSxpKXt2YXIgcj1uLmdldEl0ZW1HcmFwaGljRWwoaSk7YS5oYXNWYWx1ZShlKT9sKHIsZSxzKGUpLHQsbyxhKTpyJiZvLnJlbW92ZShyKX0pLnJlbW92ZShmdW5jdGlvbih0KXt2YXIgZT1uLmdldEl0ZW1HcmFwaGljRWwodCk7ZSYmby5yZW1vdmUoZSl9KS5leGVjdXRlKCksdGhpcy5fZGF0YT1hfSxkaXNwb3NlOmcubm9vcH0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPWkoMik7aSgyOTEpLGkoMjkyKSxhLnJlZ2lzdGVyVmlzdWFsKG4uY3VycnkoaSg1MSksImVmZmVjdFNjYXR0ZXIiLCJjaXJjbGUiLG51bGwpKSxhLnJlZ2lzdGVyTGF5b3V0KG4uY3VycnkoaSg2NCksImVmZmVjdFNjYXR0ZXIiKSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgyOCksYT1pKDE3KTt0LmV4cG9ydHM9YS5leHRlbmQoe3R5cGU6InNlcmllcy5lZmZlY3RTY2F0dGVyIixkZXBlbmRlbmNpZXM6WyJncmlkIiwicG9sYXIiXSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPW4odC5kYXRhLHRoaXMsZSk7cmV0dXJuIGl9LGJydXNoU2VsZWN0b3I6InBvaW50IixkZWZhdWx0T3B0aW9uOntjb29yZGluYXRlU3lzdGVtOiJjYXJ0ZXNpYW4yZCIsemxldmVsOjAsejoyLGxlZ2VuZEhvdmVyTGluazohMCxlZmZlY3RUeXBlOiJyaXBwbGUiLHByb2dyZXNzaXZlOjAsc2hvd0VmZmVjdE9uOiJyZW5kZXIiLHJpcHBsZUVmZmVjdDp7cGVyaW9kOjQsc2NhbGU6Mi41LGJydXNoVHlwZToiZmlsbCJ9LHN5bWJvbFNpemU6MTB9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDQ2KSxhPWkoMzE5KTtpKDIpLmV4dGVuZENoYXJ0Vmlldyh7dHlwZToiZWZmZWN0U2NhdHRlciIsaW5pdDpmdW5jdGlvbigpe3RoaXMuX3N5bWJvbERyYXc9bmV3IG4oYSl9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXREYXRhKCksYT10aGlzLl9zeW1ib2xEcmF3O2EudXBkYXRlRGF0YShuKSx0aGlzLmdyb3VwLmFkZChhLmdyb3VwKX0sdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7dGhpcy5fc3ltYm9sRHJhdy51cGRhdGVMYXlvdXQoKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dGhpcy5fc3ltYm9sRHJhdyYmdGhpcy5fc3ltYm9sRHJhdy5yZW1vdmUoZSl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgyKTtpKDI5NCksaSgyOTUpLGEucmVnaXN0ZXJWaXN1YWwobi5jdXJyeShpKDg5KSwiZnVubmVsIikpLGEucmVnaXN0ZXJMYXlvdXQoaSgyOTYpKSxhLnJlZ2lzdGVyUHJvY2Vzc29yKG4uY3VycnkoaSg2NiksImZ1bm5lbCIpKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDE0KSxhPWkoNSksbz1pKDI1KSxyPWkoMikuZXh0ZW5kU2VyaWVzTW9kZWwoe3R5cGU6InNlcmllcy5mdW5uZWwiLGluaXQ6ZnVuY3Rpb24odCl7ci5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyksdGhpcy5sZWdlbmREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdEYXRhKCl9LHRoaXMuX2RlZmF1bHRMYWJlbExpbmUodCl9LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIGk9byhbInZhbHVlIl0sdC5kYXRhKSxhPW5ldyBuKGksdGhpcyk7cmV0dXJuIGEuaW5pdERhdGEodC5kYXRhKSxhfSxfZGVmYXVsdExhYmVsTGluZTpmdW5jdGlvbih0KXthLmRlZmF1bHRFbXBoYXNpcyh0LmxhYmVsTGluZSxbInNob3ciXSk7dmFyIGU9dC5sYWJlbExpbmUubm9ybWFsLGk9dC5sYWJlbExpbmUuZW1waGFzaXM7ZS5zaG93PWUuc2hvdyYmdC5sYWJlbC5ub3JtYWwuc2hvdyxpLnNob3c9aS5zaG93JiZ0LmxhYmVsLmVtcGhhc2lzLnNob3d9LGdldERhdGFQYXJhbXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXREYXRhKCksaT1yLnN1cGVyQ2FsbCh0aGlzLCJnZXREYXRhUGFyYW1zIix0KSxuPWUuZ2V0U3VtKCJ2YWx1ZSIpO3JldHVybiBpLnBlcmNlbnQ9bj8rKGUuZ2V0KCJ2YWx1ZSIsdCkvbioxMDApLnRvRml4ZWQoMik6MCxpLiR2YXJzLnB1c2goInBlcmNlbnQiKSxpfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsbGVnZW5kSG92ZXJMaW5rOiEwLGxlZnQ6ODAsdG9wOjYwLHJpZ2h0OjgwLGJvdHRvbTo2MCxtaW5TaXplOiIwJSIsbWF4U2l6ZToiMTAwJSIsc29ydDoiZGVzY2VuZGluZyIsZ2FwOjAsZnVubmVsQWxpZ246ImNlbnRlciIsbGFiZWw6e25vcm1hbDp7c2hvdzohMCxwb3NpdGlvbjoib3V0ZXIifSxlbXBoYXNpczp7c2hvdzohMH19LGxhYmVsTGluZTp7bm9ybWFsOntzaG93OiEwLGxlbmd0aDoyMCxsaW5lU3R5bGU6e3dpZHRoOjEsdHlwZToic29saWQifX0sZW1waGFzaXM6e319LGl0ZW1TdHlsZTp7bm9ybWFsOntib3JkZXJDb2xvcjoiI2ZmZiIsYm9yZGVyV2lkdGg6MX0sZW1waGFzaXM6e319fX0pO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe2Z1bmN0aW9uIGkoKXtyLmlnbm9yZT1yLmhvdmVySWdub3JlLHMuaWdub3JlPXMuaG92ZXJJZ25vcmV9ZnVuY3Rpb24gbigpe3IuaWdub3JlPXIubm9ybWFsSWdub3JlLHMuaWdub3JlPXMubm9ybWFsSWdub3JlfWEuR3JvdXAuY2FsbCh0aGlzKTt2YXIgbz1uZXcgYS5Qb2x5Z29uLHI9bmV3IGEuUG9seWxpbmUscz1uZXcgYS5UZXh0O3RoaXMuYWRkKG8pLHRoaXMuYWRkKHIpLHRoaXMuYWRkKHMpLHRoaXMudXBkYXRlRGF0YSh0LGUsITApLHRoaXMub24oImVtcGhhc2lzIixpKS5vbigibm9ybWFsIixuKS5vbigibW91c2VvdmVyIixpKS5vbigibW91c2VvdXQiLG4pfXZhciBhPWkoMyksbz1pKDEpLHI9bi5wcm90b3R5cGUscz1bIml0ZW1TdHlsZSIsIm5vcm1hbCIsIm9wYWNpdHkiXTtyLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuY2hpbGRBdCgwKSxyPXQuaG9zdE1vZGVsLGw9dC5nZXRJdGVtTW9kZWwoZSksdT10LmdldEl0ZW1MYXlvdXQoZSksaD10LmdldEl0ZW1Nb2RlbChlKS5nZXQocyk7aD1udWxsPT1oPzE6aCxuLnVzZVN0eWxlKHt9KSxpPyhuLnNldFNoYXBlKHtwb2ludHM6dS5wb2ludHN9KSxuLnNldFN0eWxlKHtvcGFjaXR5OjB9KSxhLmluaXRQcm9wcyhuLHtzdHlsZTp7b3BhY2l0eTpofX0scixlKSk6YS51cGRhdGVQcm9wcyhuLHtzdHlsZTp7b3BhY2l0eTpofSxzaGFwZTp7cG9pbnRzOnUucG9pbnRzfX0scixlKTt2YXIgYz1sLmdldE1vZGVsKCJpdGVtU3R5bGUiKSxkPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpO24uc2V0U3R5bGUoby5kZWZhdWx0cyh7bGluZUpvaW46InJvdW5kIixmaWxsOmR9LGMuZ2V0TW9kZWwoIm5vcm1hbCIpLmdldEl0ZW1TdHlsZShbIm9wYWNpdHkiXSkpKSxuLmhvdmVyU3R5bGU9Yy5nZXRNb2RlbCgiZW1waGFzaXMiKS5nZXRJdGVtU3R5bGUoKSx0aGlzLl91cGRhdGVMYWJlbCh0LGUpLGEuc2V0SG92ZXJTdHlsZSh0aGlzKX0sci5fdXBkYXRlTGFiZWw9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmNoaWxkQXQoMSksbj10aGlzLmNoaWxkQXQoMiksbz10Lmhvc3RNb2RlbCxyPXQuZ2V0SXRlbU1vZGVsKGUpLHM9dC5nZXRJdGVtTGF5b3V0KGUpLGw9cy5sYWJlbCx1PXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpO2EudXBkYXRlUHJvcHMoaSx7c2hhcGU6e3BvaW50czpsLmxpbmVQb2ludHN8fGwubGluZVBvaW50c319LG8sZSksYS51cGRhdGVQcm9wcyhuLHtzdHlsZTp7eDpsLngseTpsLnl9fSxvLGUpLG4uYXR0cih7cm90YXRpb246bC5yb3RhdGlvbixvcmlnaW46W2wueCxsLnldLHoyOjEwfSk7dmFyIGg9ci5nZXRNb2RlbCgibGFiZWwubm9ybWFsIiksYz1yLmdldE1vZGVsKCJsYWJlbC5lbXBoYXNpcyIpLGQ9ci5nZXRNb2RlbCgibGFiZWxMaW5lLm5vcm1hbCIpLGY9ci5nZXRNb2RlbCgibGFiZWxMaW5lLmVtcGhhc2lzIiksdT10LmdldEl0ZW1WaXN1YWwoZSwiY29sb3IiKTthLnNldExhYmVsU3R5bGUobi5zdHlsZSxuLmhvdmVyU3R5bGU9e30saCxjLHtsYWJlbEZldGNoZXI6dC5ob3N0TW9kZWwsbGFiZWxEYXRhSW5kZXg6ZSxkZWZhdWx0VGV4dDp0LmdldE5hbWUoZSksYXV0b0NvbG9yOnUsdXNlSW5zaWRlU3R5bGU6ISFsLmluc2lkZX0se3RleHRBbGlnbjpsLnRleHRBbGlnbix0ZXh0VmVydGljYWxBbGlnbjpsLnZlcnRpY2FsQWxpZ259KSxuLmlnbm9yZT1uLm5vcm1hbElnbm9yZT0haC5nZXQoInNob3ciKSxuLmhvdmVySWdub3JlPSFjLmdldCgic2hvdyIpLGkuaWdub3JlPWkubm9ybWFsSWdub3JlPSFkLmdldCgic2hvdyIpLGkuaG92ZXJJZ25vcmU9IWYuZ2V0KCJzaG93IiksaS5zZXRTdHlsZSh7c3Ryb2tlOnV9KSxpLnNldFN0eWxlKGQuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpKSxpLmhvdmVyU3R5bGU9Zi5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCl9LG8uaW5oZXJpdHMobixhLkdyb3VwKTt2YXIgbD1pKDMwKS5leHRlbmQoe3R5cGU6ImZ1bm5lbCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgYT10LmdldERhdGEoKSxvPXRoaXMuX2RhdGEscj10aGlzLmdyb3VwO2EuZGlmZihvKS5hZGQoZnVuY3Rpb24odCl7dmFyIGU9bmV3IG4oYSx0KTthLnNldEl0ZW1HcmFwaGljRWwodCxlKSxyLmFkZChlKX0pLnVwZGF0ZShmdW5jdGlvbih0LGUpe3ZhciBpPW8uZ2V0SXRlbUdyYXBoaWNFbChlKTtpLnVwZGF0ZURhdGEoYSx0KSxyLmFkZChpKSxhLnNldEl0ZW1HcmFwaGljRWwodCxpKX0pLnJlbW92ZShmdW5jdGlvbih0KXt2YXIgZT1vLmdldEl0ZW1HcmFwaGljRWwodCk7ci5yZW1vdmUoZSl9KS5leGVjdXRlKCksdGhpcy5fZGF0YT1hfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLmdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX2RhdGE9bnVsbH0sZGlzcG9zZTpmdW5jdGlvbigpe319KTt0LmV4cG9ydHM9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gci5nZXRMYXlvdXRSZWN0KHQuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0pfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIGk9dC5tYXBBcnJheSgidmFsdWUiLGZ1bmN0aW9uKHQpe3JldHVybiB0fSksbj1bXSxhPSJhc2NlbmRpbmciPT09ZSxvPTAscj10LmNvdW50KCk7bzxyO28rKyluW29dPW87cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5zb3J0KGUpOiJub25lIiE9PWUmJm4uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBhP2lbdF0taVtlXTppW2VdLWlbdF19KSxufWZ1bmN0aW9uIG8odCl7dC5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBpLG4sYSxvLHI9dC5nZXRJdGVtTW9kZWwoZSkscz1yLmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSxsPXMuZ2V0KCJwb3NpdGlvbiIpLHU9ci5nZXRNb2RlbCgibGFiZWxMaW5lLm5vcm1hbCIpLGg9dC5nZXRJdGVtTGF5b3V0KGUpLGM9aC5wb2ludHMsZD0iaW5uZXIiPT09bHx8Imluc2lkZSI9PT1sfHwiY2VudGVyIj09PWw7aWYoZCluPShjWzBdWzBdK2NbMV1bMF0rY1syXVswXStjWzNdWzBdKS80LGE9KGNbMF1bMV0rY1sxXVsxXStjWzJdWzFdK2NbM11bMV0pLzQsaT0iY2VudGVyIixvPVtbbixhXSxbbixhXV07ZWxzZXt2YXIgZixwLGcsbT11LmdldCgibGVuZ3RoIik7ImxlZnQiPT09bD8oZj0oY1szXVswXStjWzBdWzBdKS8yLHA9KGNbM11bMV0rY1swXVsxXSkvMixnPWYtbSxuPWctNSxpPSJyaWdodCIpOihmPShjWzFdWzBdK2NbMl1bMF0pLzIscD0oY1sxXVsxXStjWzJdWzFdKS8yLGc9ZittLG49Zys1LGk9ImxlZnQiKTt2YXIgdj1wO289W1tmLHBdLFtnLHZdXSxhPXZ9aC5sYWJlbD17bGluZVBvaW50czpvLHg6bix5OmEsdmVydGljYWxBbGlnbjoibWlkZGxlIix0ZXh0QWxpZ246aSxpbnNpZGU6ZH19KX12YXIgcj1pKDkpLHM9aSg0KSxsPXMucGFyc2VQZXJjZW50O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7dC5lYWNoU2VyaWVzQnlUeXBlKCJmdW5uZWwiLGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ2V0RGF0YSgpLHI9dC5nZXQoInNvcnQiKSx1PW4odCxlKSxoPWEoaSxyKSxjPVtsKHQuZ2V0KCJtaW5TaXplIiksdS53aWR0aCksbCh0LmdldCgibWF4U2l6ZSIpLHUud2lkdGgpXSxkPWkuZ2V0RGF0YUV4dGVudCgidmFsdWUiKSxmPXQuZ2V0KCJtaW4iKSxwPXQuZ2V0KCJtYXgiKTtudWxsPT1mJiYoZj1NYXRoLm1pbihkWzBdLDApKSxudWxsPT1wJiYocD1kWzFdKTt2YXIgZz10LmdldCgiZnVubmVsQWxpZ24iKSxtPXQuZ2V0KCJnYXAiKSx2PSh1LmhlaWdodC1tKihpLmNvdW50KCktMSkpL2kuY291bnQoKSx5PXUueSx4PWZ1bmN0aW9uKHQsZSl7dmFyIG4sYT1pLmdldCgidmFsdWUiLHQpfHwwLG89cy5saW5lYXJNYXAoYSxbZixwXSxjLCEwKTtzd2l0Y2goZyl7Y2FzZSJsZWZ0IjpuPXUueDticmVhaztjYXNlImNlbnRlciI6bj11LngrKHUud2lkdGgtbykvMjticmVhaztjYXNlInJpZ2h0IjpuPXUueCt1LndpZHRoLW99cmV0dXJuW1tuLGVdLFtuK28sZV1dfTsiYXNjZW5kaW5nIj09PXImJih2PS12LG09LW0seSs9dS5oZWlnaHQsaD1oLnJldmVyc2UoKSk7Zm9yKHZhciBfPTA7XzxoLmxlbmd0aDtfKyspe3ZhciBiPWhbX10sdz1oW18rMV0sUz14KGIseSksTT14KHcseSt2KTt5Kz12K20saS5zZXRJdGVtTGF5b3V0KGIse3BvaW50czpTLmNvbmNhdChNLnNsaWNlKCkucmV2ZXJzZSgpKX0pfW8oaSl9KX19LGZ1bmN0aW9uKHQsZSxpKXtpKDI5OCksaSgyOTkpfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxNCksYT1pKDE3KSxvPWkoMSkscj1hLmV4dGVuZCh7dHlwZToic2VyaWVzLmdhdWdlIixnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBuKFsidmFsdWUiXSx0aGlzKSxhPXQuZGF0YXx8W107cmV0dXJuIG8uaXNBcnJheShhKXx8KGE9W2FdKSxpLmluaXREYXRhKGEpLGl9LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6MixjZW50ZXI6WyI1MCUiLCI1MCUiXSxsZWdlbmRIb3Zlckxpbms6ITAscmFkaXVzOiI3NSUiLHN0YXJ0QW5nbGU6MjI1LGVuZEFuZ2xlOi00NSxjbG9ja3dpc2U6ITAsbWluOjAsbWF4OjEwMCxzcGxpdE51bWJlcjoxMCxheGlzTGluZTp7c2hvdzohMCxsaW5lU3R5bGU6e2NvbG9yOltbLjIsIiM5MWM3YWUiXSxbLjgsIiM2Mzg2OWUiXSxbMSwiI2MyMzUzMSJdXSx3aWR0aDozMH19LHNwbGl0TGluZTp7c2hvdzohMCxsZW5ndGg6MzAsbGluZVN0eWxlOntjb2xvcjoiI2VlZSIsd2lkdGg6Mix0eXBlOiJzb2xpZCJ9fSxheGlzVGljazp7c2hvdzohMCxzcGxpdE51bWJlcjo1LGxlbmd0aDo4LGxpbmVTdHlsZTp7Y29sb3I6IiNlZWUiLHdpZHRoOjEsdHlwZToic29saWQifX0sYXhpc0xhYmVsOntzaG93OiEwLGRpc3RhbmNlOjUsY29sb3I6ImF1dG8ifSxwb2ludGVyOntzaG93OiEwLGxlbmd0aDoiODAlIix3aWR0aDo4fSxpdGVtU3R5bGU6e25vcm1hbDp7Y29sb3I6ImF1dG8ifX0sdGl0bGU6e3Nob3c6ITAsb2Zmc2V0Q2VudGVyOlswLCItNDAlIl0sY29sb3I6IiMzMzMiLGZvbnRTaXplOjE1fSxkZXRhaWw6e3Nob3c6ITAsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJXaWR0aDowLGJvcmRlckNvbG9yOiIjY2NjIix3aWR0aDoxMDAsaGVpZ2h0Om51bGwscGFkZGluZzpbNSwxMF0sb2Zmc2V0Q2VudGVyOlswLCI0MCUiXSxjb2xvcjoiYXV0byIsZm9udFNpemU6MzB9fX0pO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXQuZ2V0KCJjZW50ZXIiKSxuPWUuZ2V0V2lkdGgoKSxhPWUuZ2V0SGVpZ2h0KCksbz1NYXRoLm1pbihuLGEpLHI9bChpWzBdLGUuZ2V0V2lkdGgoKSkscz1sKGlbMV0sZS5nZXRIZWlnaHQoKSksdT1sKHQuZ2V0KCJyYWRpdXMiKSxvLzIpO3JldHVybntjeDpyLGN5OnMscjp1fX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGUmJigic3RyaW5nIj09dHlwZW9mIGU/dD1lLnJlcGxhY2UoInt2YWx1ZX0iLG51bGwhPXQ/dDoiIik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJih0PWUodCkpKSx0fXZhciBvPWkoMzAwKSxyPWkoMykscz1pKDQpLGw9cy5wYXJzZVBlcmNlbnQsdT0yKk1hdGguUEksaD1pKDMwKS5leHRlbmQoe3R5cGU6ImdhdWdlIixyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIGE9dC5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpLG89bih0LGkpO3RoaXMuX3JlbmRlck1haW4odCxlLGksYSxvKX0sZGlzcG9zZTpmdW5jdGlvbigpe30sX3JlbmRlck1haW46ZnVuY3Rpb24odCxlLGksbixhKXtmb3IodmFyIG89dGhpcy5ncm91cCxzPXQuZ2V0TW9kZWwoImF4aXNMaW5lIiksbD1zLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxoPXQuZ2V0KCJjbG9ja3dpc2UiKSxjPS10LmdldCgic3RhcnRBbmdsZSIpLzE4MCpNYXRoLlBJLGQ9LXQuZ2V0KCJlbmRBbmdsZSIpLzE4MCpNYXRoLlBJLGY9KGQtYykldSxwPWMsZz1sLmdldCgid2lkdGgiKSxtPTA7bTxuLmxlbmd0aDttKyspe3ZhciB2PU1hdGgubWluKE1hdGgubWF4KG5bbV1bMF0sMCksMSksZD1jK2Yqdix5PW5ldyByLlNlY3Rvcih7c2hhcGU6e3N0YXJ0QW5nbGU6cCxlbmRBbmdsZTpkLGN4OmEuY3gsY3k6YS5jeSxjbG9ja3dpc2U6aCxyMDphLnItZyxyOmEucn0sc2lsZW50OiEwfSk7eS5zZXRTdHlsZSh7ZmlsbDpuW21dWzFdfSkseS5zZXRTdHlsZShsLmdldExpbmVTdHlsZShbImNvbG9yIiwiYm9yZGVyV2lkdGgiLCJib3JkZXJDb2xvciJdKSksby5hZGQoeSkscD1kfXZhciB4PWZ1bmN0aW9uKHQpe2lmKHQ8PTApcmV0dXJuIG5bMF1bMV07Zm9yKHZhciBlPTA7ZTxuLmxlbmd0aDtlKyspaWYobltlXVswXT49dCYmKDA9PT1lPzA6bltlLTFdWzBdKTx0KXJldHVybiBuW2VdWzFdO3JldHVybiBuW2UtMV1bMV19O2lmKCFoKXt2YXIgXz1jO2M9ZCxkPV99dGhpcy5fcmVuZGVyVGlja3ModCxlLGkseCxhLGMsZCxoKSx0aGlzLl9yZW5kZXJQb2ludGVyKHQsZSxpLHgsYSxjLGQsaCksdGhpcy5fcmVuZGVyVGl0bGUodCxlLGkseCxhKSx0aGlzLl9yZW5kZXJEZXRhaWwodCxlLGkseCxhKX0sX3JlbmRlclRpY2tzOmZ1bmN0aW9uKHQsZSxpLG4sbyx1LGgsYyl7Zm9yKHZhciBkPXRoaXMuZ3JvdXAsZj1vLmN4LHA9by5jeSxnPW8ucixtPSt0LmdldCgibWluIiksdj0rdC5nZXQoIm1heCIpLHk9dC5nZXRNb2RlbCgic3BsaXRMaW5lIikseD10LmdldE1vZGVsKCJheGlzVGljayIpLF89dC5nZXRNb2RlbCgiYXhpc0xhYmVsIiksYj10LmdldCgic3BsaXROdW1iZXIiKSx3PXguZ2V0KCJzcGxpdE51bWJlciIpLFM9bCh5LmdldCgibGVuZ3RoIiksZyksTT1sKHguZ2V0KCJsZW5ndGgiKSxnKSxJPXUsVD0oaC11KS9iLEE9VC93LEM9eS5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCksTD14LmdldE1vZGVsKCJsaW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxEPTA7RDw9YjtEKyspe3ZhciBQPU1hdGguY29zKEkpLGs9TWF0aC5zaW4oSSk7aWYoeS5nZXQoInNob3ciKSl7dmFyIE89bmV3IHIuTGluZSh7c2hhcGU6e3gxOlAqZytmLHkxOmsqZytwLHgyOlAqKGctUykrZix5MjprKihnLVMpK3B9LHN0eWxlOkMsc2lsZW50OiEwfSk7ImF1dG8iPT09Qy5zdHJva2UmJk8uc2V0U3R5bGUoe3N0cm9rZTpuKEQvYil9KSxkLmFkZChPKX1pZihfLmdldCgic2hvdyIpKXt2YXIgej1hKHMucm91bmQoRC9iKih2LW0pK20pLF8uZ2V0KCJmb3JtYXR0ZXIiKSksUj1fLmdldCgiZGlzdGFuY2UiKSxFPW4oRC9iKTtkLmFkZChuZXcgci5UZXh0KHtzdHlsZTpyLnNldFRleHRTdHlsZSh7fSxfLHt0ZXh0OnoseDpQKihnLVMtUikrZix5OmsqKGctUy1SKStwLHRleHRWZXJ0aWNhbEFsaWduOms8LS40PyJ0b3AiOms+LjQ/ImJvdHRvbSI6Im1pZGRsZSIsdGV4dEFsaWduOlA8LS40PyJsZWZ0IjpQPi40PyJyaWdodCI6ImNlbnRlciJ9LHthdXRvQ29sb3I6RX0pLHNpbGVudDohMH0pKX1pZih4LmdldCgic2hvdyIpJiZEIT09Yil7Zm9yKHZhciBOPTA7Tjw9dztOKyspe3ZhciBQPU1hdGguY29zKEkpLGs9TWF0aC5zaW4oSSksVj1uZXcgci5MaW5lKHsKc2hhcGU6e3gxOlAqZytmLHkxOmsqZytwLHgyOlAqKGctTSkrZix5MjprKihnLU0pK3B9LHNpbGVudDohMCxzdHlsZTpMfSk7ImF1dG8iPT09TC5zdHJva2UmJlYuc2V0U3R5bGUoe3N0cm9rZTpuKChEK04vdykvYil9KSxkLmFkZChWKSxJKz1BfUktPUF9ZWxzZSBJKz1UfX0sX3JlbmRlclBvaW50ZXI6ZnVuY3Rpb24odCxlLGksbixhLHUsaCxjKXt2YXIgZD10aGlzLmdyb3VwLGY9dGhpcy5fZGF0YTtpZighdC5nZXQoInBvaW50ZXIuc2hvdyIpKXJldHVybiB2b2lkKGYmJmYuZWFjaEl0ZW1HcmFwaGljRWwoZnVuY3Rpb24odCl7ZC5yZW1vdmUodCl9KSk7dmFyIHA9Wyt0LmdldCgibWluIiksK3QuZ2V0KCJtYXgiKV0sZz1bdSxoXSxtPXQuZ2V0RGF0YSgpO20uZGlmZihmKS5hZGQoZnVuY3Rpb24oZSl7dmFyIGk9bmV3IG8oe3NoYXBlOnthbmdsZTp1fX0pO3IuaW5pdFByb3BzKGkse3NoYXBlOnthbmdsZTpzLmxpbmVhck1hcChtLmdldCgidmFsdWUiLGUpLHAsZywhMCl9fSx0KSxkLmFkZChpKSxtLnNldEl0ZW1HcmFwaGljRWwoZSxpKX0pLnVwZGF0ZShmdW5jdGlvbihlLGkpe3ZhciBuPWYuZ2V0SXRlbUdyYXBoaWNFbChpKTtyLnVwZGF0ZVByb3BzKG4se3NoYXBlOnthbmdsZTpzLmxpbmVhck1hcChtLmdldCgidmFsdWUiLGUpLHAsZywhMCl9fSx0KSxkLmFkZChuKSxtLnNldEl0ZW1HcmFwaGljRWwoZSxuKX0pLnJlbW92ZShmdW5jdGlvbih0KXt2YXIgZT1mLmdldEl0ZW1HcmFwaGljRWwodCk7ZC5yZW1vdmUoZSl9KS5leGVjdXRlKCksbS5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbih0LGUpe3ZhciBpPW0uZ2V0SXRlbU1vZGVsKGUpLG89aS5nZXRNb2RlbCgicG9pbnRlciIpO3Quc2V0U2hhcGUoe3g6YS5jeCx5OmEuY3ksd2lkdGg6bChvLmdldCgid2lkdGgiKSxhLnIpLHI6bChvLmdldCgibGVuZ3RoIiksYS5yKX0pLHQudXNlU3R5bGUoaS5nZXRNb2RlbCgiaXRlbVN0eWxlLm5vcm1hbCIpLmdldEl0ZW1TdHlsZSgpKSwiYXV0byI9PT10LnN0eWxlLmZpbGwmJnQuc2V0U3R5bGUoImZpbGwiLG4ocy5saW5lYXJNYXAobS5nZXQoInZhbHVlIixlKSxwLFswLDFdLCEwKSkpLHIuc2V0SG92ZXJTdHlsZSh0LGkuZ2V0TW9kZWwoIml0ZW1TdHlsZS5lbXBoYXNpcyIpLmdldEl0ZW1TdHlsZSgpKX0pLHRoaXMuX2RhdGE9bX0sX3JlbmRlclRpdGxlOmZ1bmN0aW9uKHQsZSxpLG4sYSl7dmFyIG89dC5nZXRNb2RlbCgidGl0bGUiKTtpZihvLmdldCgic2hvdyIpKXt2YXIgdT1vLmdldCgib2Zmc2V0Q2VudGVyIiksaD1hLmN4K2wodVswXSxhLnIpLGM9YS5jeStsKHVbMV0sYS5yKSxkPSt0LmdldCgibWluIiksZj0rdC5nZXQoIm1heCIpLHA9dC5nZXREYXRhKCkuZ2V0KCJ2YWx1ZSIsMCksZz1uKHMubGluZWFyTWFwKHAsW2QsZl0sWzAsMV0sITApKTt0aGlzLmdyb3VwLmFkZChuZXcgci5UZXh0KHtzaWxlbnQ6ITAsc3R5bGU6ci5zZXRUZXh0U3R5bGUoe30sbyx7eDpoLHk6Yyx0ZXh0OnQuZ2V0RGF0YSgpLmdldE5hbWUoMCksdGV4dEFsaWduOiJjZW50ZXIiLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUifSx7YXV0b0NvbG9yOmcsZm9yY2VSaWNoOiEwfSl9KSl9fSxfcmVuZGVyRGV0YWlsOmZ1bmN0aW9uKHQsZSxpLG4sbyl7dmFyIHU9dC5nZXRNb2RlbCgiZGV0YWlsIiksaD0rdC5nZXQoIm1pbiIpLGM9K3QuZ2V0KCJtYXgiKTtpZih1LmdldCgic2hvdyIpKXt2YXIgZD11LmdldCgib2Zmc2V0Q2VudGVyIiksZj1vLmN4K2woZFswXSxvLnIpLHA9by5jeStsKGRbMV0sby5yKSxnPWwodS5nZXQoIndpZHRoIiksby5yKSxtPWwodS5nZXQoImhlaWdodCIpLG8uciksdj10LmdldERhdGEoKS5nZXQoInZhbHVlIiwwKSx5PW4ocy5saW5lYXJNYXAodixbaCxjXSxbMCwxXSwhMCkpO3RoaXMuZ3JvdXAuYWRkKG5ldyByLlRleHQoe3NpbGVudDohMCxzdHlsZTpyLnNldFRleHRTdHlsZSh7fSx1LHt4OmYseTpwLHRleHQ6YSh2LHUuZ2V0KCJmb3JtYXR0ZXIiKSksdGV4dFdpZHRoOmlzTmFOKGcpP251bGw6Zyx0ZXh0SGVpZ2h0OmlzTmFOKG0pP251bGw6bSx0ZXh0QWxpZ246ImNlbnRlciIsdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LHthdXRvQ29sb3I6eSxmb3JjZVJpY2g6ITB9KX0pKX19fSk7dC5leHBvcnRzPWh9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9aSg4KS5leHRlbmQoe3R5cGU6ImVjaGFydHNHYXVnZVBvaW50ZXIiLHNoYXBlOnthbmdsZTowLHdpZHRoOjEwLHI6MTAseDowLHk6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIGk9TWF0aC5jb3Msbj1NYXRoLnNpbixhPWUucixvPWUud2lkdGgscj1lLmFuZ2xlLHM9ZS54LWkocikqbyoobz49YS8zPzE6MiksbD1lLnktbihyKSpvKihvPj1hLzM/MToyKTtyPWUuYW5nbGUtTWF0aC5QSS8yLHQubW92ZVRvKHMsbCksdC5saW5lVG8oZS54K2kocikqbyxlLnkrbihyKSpvKSx0LmxpbmVUbyhlLngraShlLmFuZ2xlKSphLGUueStuKGUuYW5nbGUpKmEpLHQubGluZVRvKGUueC1pKHIpKm8sZS55LW4ocikqbyksdC5saW5lVG8ocyxsKX19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMiksYT1pKDEpO2koMzAyKSxpKDMwMyksaSgzMTIpLG4ucmVnaXN0ZXJQcm9jZXNzb3IoaSgzMDUpKSxuLnJlZ2lzdGVyVmlzdWFsKGEuY3VycnkoaSg1MSksImdyYXBoIiwiY2lyY2xlIixudWxsKSksbi5yZWdpc3RlclZpc3VhbChpKDMwNikpLG4ucmVnaXN0ZXJWaXN1YWwoaSgzMDkpKSxuLnJlZ2lzdGVyTGF5b3V0KGkoMzEzKSksbi5yZWdpc3RlckxheW91dChpKDMwNykpLG4ucmVnaXN0ZXJMYXlvdXQoaSgzMTEpKSxuLnJlZ2lzdGVyQ29vcmRpbmF0ZVN5c3RlbSgiZ3JhcGhWaWV3Iix7Y3JlYXRlOmkoMzA4KX0pfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMTQpLGE9aSgxKSxvPWkoNSkscj1pKDExKSxzPWkoNyksbD1pKDI1NSksdT1pKDIpLmV4dGVuZFNlcmllc01vZGVsKHt0eXBlOiJzZXJpZXMuZ3JhcGgiLGluaXQ6ZnVuY3Rpb24odCl7dS5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyksdGhpcy5sZWdlbmREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2F0ZWdvcmllc0RhdGF9LHRoaXMuZmlsbERhdGFUZXh0U3R5bGUodC5lZGdlc3x8dC5saW5rcyksdGhpcy5fdXBkYXRlQ2F0ZWdvcmllc0RhdGEoKX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7dS5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpLHRoaXMuZmlsbERhdGFUZXh0U3R5bGUodC5lZGdlc3x8dC5saW5rcyksdGhpcy5fdXBkYXRlQ2F0ZWdvcmllc0RhdGEoKX0sbWVyZ2VEZWZhdWx0QW5kVGhlbWU6ZnVuY3Rpb24odCl7dS5zdXBlckFwcGx5KHRoaXMsIm1lcmdlRGVmYXVsdEFuZFRoZW1lIixhcmd1bWVudHMpLG8uZGVmYXVsdEVtcGhhc2lzKHQuZWRnZUxhYmVsLFsic2hvdyJdKX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD10aGlzLnBhcnNlUGF0aCh0KSx0JiYibGFiZWwiPT09dFswXT9zOnRoaXMucGFyZW50TW9kZWx9dC53cmFwTWV0aG9kKCJnZXRJdGVtTW9kZWwiLGZ1bmN0aW9uKHQpe3ZhciBlPW8uX2NhdGVnb3JpZXNNb2RlbHMsaT10LmdldFNoYWxsb3coImNhdGVnb3J5Iiksbj1lW2ldO3JldHVybiBuJiYobi5wYXJlbnRNb2RlbD10LnBhcmVudE1vZGVsLHQucGFyZW50TW9kZWw9biksdH0pO3ZhciBhPW8uZ2V0TW9kZWwoImVkZ2VMYWJlbCIpLHM9bmV3IHIoe2xhYmVsOmEub3B0aW9ufSxhLnBhcmVudE1vZGVsLGUpO2kud3JhcE1ldGhvZCgiZ2V0SXRlbU1vZGVsIixmdW5jdGlvbih0KXtyZXR1cm4gdC5jdXN0b21pemVHZXRQYXJlbnQobiksdH0pfXZhciBuPXQuZWRnZXN8fHQubGlua3N8fFtdLGE9dC5kYXRhfHx0Lm5vZGVzfHxbXSxvPXRoaXM7aWYoYSYmbilyZXR1cm4gbChhLG4sdGhpcywhMCxpKS5kYXRhfSxnZXRHcmFwaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldERhdGEoKS5ncmFwaH0sZ2V0RWRnZURhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRHcmFwaCgpLmVkZ2VEYXRhfSxnZXRDYXRlZ29yaWVzRGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXRlZ29yaWVzRGF0YX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0LGUsaSl7aWYoImVkZ2UiPT09aSl7dmFyIG49dGhpcy5nZXREYXRhKCksYT10aGlzLmdldERhdGFQYXJhbXModCxpKSxvPW4uZ3JhcGguZ2V0RWRnZUJ5SW5kZXgodCkscj1uLmdldE5hbWUoby5ub2RlMS5kYXRhSW5kZXgpLGw9bi5nZXROYW1lKG8ubm9kZTIuZGF0YUluZGV4KSxoPVtdO3JldHVybiBudWxsIT1yJiZoLnB1c2gociksbnVsbCE9bCYmaC5wdXNoKGwpLGg9cy5lbmNvZGVIVE1MKGguam9pbigiID4gIikpLGEudmFsdWUmJihoKz0iIDogIitzLmVuY29kZUhUTUwoYS52YWx1ZSkpLGh9cmV0dXJuIHUuc3VwZXJBcHBseSh0aGlzLCJmb3JtYXRUb29sdGlwIixhcmd1bWVudHMpfSxfdXBkYXRlQ2F0ZWdvcmllc0RhdGE6ZnVuY3Rpb24oKXt2YXIgdD1hLm1hcCh0aGlzLm9wdGlvbi5jYXRlZ29yaWVzfHxbXSxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dC52YWx1ZT90OmEuZXh0ZW5kKHt2YWx1ZTowfSx0KX0pLGU9bmV3IG4oWyJ2YWx1ZSJdLHRoaXMpO2UuaW5pdERhdGEodCksdGhpcy5fY2F0ZWdvcmllc0RhdGE9ZSx0aGlzLl9jYXRlZ29yaWVzTW9kZWxzPWUubWFwQXJyYXkoZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0SXRlbU1vZGVsKHQsITApfSl9LHNldFpvb206ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxzZXRDZW50ZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9LGlzQW5pbWF0aW9uRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiB1LnN1cGVyQ2FsbCh0aGlzLCJpc0FuaW1hdGlvbkVuYWJsZWQiKSYmISgiZm9yY2UiPT09dGhpcy5nZXQoImxheW91dCIpJiZ0aGlzLmdldCgiZm9yY2UubGF5b3V0QW5pbWF0aW9uIikpfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToidmlldyIsbGVnZW5kSG92ZXJMaW5rOiEwLGhvdmVyQW5pbWF0aW9uOiEwLGxheW91dDpudWxsLGZvY3VzTm9kZUFkamFjZW5jeTohMSxjaXJjdWxhcjp7cm90YXRlTGFiZWw6ITF9LGZvcmNlOntpbml0TGF5b3V0Om51bGwscmVwdWxzaW9uOlswLDUwXSxncmF2aXR5Oi4xLGVkZ2VMZW5ndGg6MzAsbGF5b3V0QW5pbWF0aW9uOiEwfSxsZWZ0OiJjZW50ZXIiLHRvcDoiY2VudGVyIixzeW1ib2w6ImNpcmNsZSIsc3ltYm9sU2l6ZToxMCxlZGdlU3ltYm9sOlsibm9uZSIsIm5vbmUiXSxlZGdlU3ltYm9sU2l6ZToxMCxlZGdlTGFiZWw6e25vcm1hbDp7cG9zaXRpb246Im1pZGRsZSJ9LGVtcGhhc2lzOnt9fSxkcmFnZ2FibGU6ITEscm9hbTohMSxjZW50ZXI6bnVsbCx6b29tOjEsbm9kZVNjYWxlUmF0aW86LjYsbGFiZWw6e25vcm1hbDp7c2hvdzohMSxmb3JtYXR0ZXI6IntifSJ9LGVtcGhhc2lzOntzaG93OiEwfX0saXRlbVN0eWxlOntub3JtYWw6e30sZW1waGFzaXM6e319LGxpbmVTdHlsZTp7bm9ybWFsOntjb2xvcjoiI2FhYSIsd2lkdGg6MSxjdXJ2ZW5lc3M6MCxvcGFjaXR5Oi41fSxlbXBoYXNpczp7fX19fSk7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHQuZ2V0VmlzdWFsKCJvcGFjaXR5Iil8fHQuZ2V0TW9kZWwoKS5nZXQoZSl9ZnVuY3Rpb24gYSh0LGUsaSl7dmFyIGE9dC5nZXRHcmFwaGljRWwoKSxvPW4odCxlKTtudWxsIT1pJiYobnVsbD09byYmKG89MSksbyo9aSksYS5kb3ducGxheSYmYS5kb3ducGxheSgpLGEudHJhdmVyc2UoZnVuY3Rpb24odCl7Imdyb3VwIiE9PXQudHlwZSYmdC5zZXRTdHlsZSgib3BhY2l0eSIsbyl9KX1mdW5jdGlvbiBvKHQsZSl7dmFyIGk9bih0LGUpLGE9dC5nZXRHcmFwaGljRWwoKTthLmhpZ2hsaWdodCYmYS5oaWdobGlnaHQoKSxhLnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJncm91cCIhPT10LnR5cGUmJnQuc2V0U3R5bGUoIm9wYWNpdHkiLGkpfSl9dmFyIHI9aSg0Nikscz1pKDExMiksbD1pKDEwMCksdT1pKDI1OCksaD1pKDEzMyksYz1pKDMpLGQ9aSgzMDQpLGY9aSgxKSxwPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwib3BhY2l0eSJdLGc9WyJsaW5lU3R5bGUiLCJub3JtYWwiLCJvcGFjaXR5Il07aSgyKS5leHRlbmRDaGFydFZpZXcoe3R5cGU6ImdyYXBoIixpbml0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IHIsbj1uZXcgcyxhPXRoaXMuZ3JvdXA7dGhpcy5fY29udHJvbGxlcj1uZXcgbChlLmdldFpyKCkpLHRoaXMuX2NvbnRyb2xsZXJIb3N0PXt0YXJnZXQ6YX0sYS5hZGQoaS5ncm91cCksYS5hZGQobi5ncm91cCksdGhpcy5fc3ltYm9sRHJhdz1pLHRoaXMuX2xpbmVEcmF3PW4sdGhpcy5fZmlyc3RSZW5kZXI9ITB9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dC5jb29yZGluYXRlU3lzdGVtO3RoaXMuX21vZGVsPXQsdGhpcy5fbm9kZVNjYWxlUmF0aW89dC5nZXQoIm5vZGVTY2FsZVJhdGlvIik7dmFyIGE9dGhpcy5fc3ltYm9sRHJhdyxvPXRoaXMuX2xpbmVEcmF3LHI9dGhpcy5ncm91cDtpZigidmlldyI9PT1uLnR5cGUpe3ZhciBzPXtwb3NpdGlvbjpuLnBvc2l0aW9uLHNjYWxlOm4uc2NhbGV9O3RoaXMuX2ZpcnN0UmVuZGVyP3IuYXR0cihzKTpjLnVwZGF0ZVByb3BzKHIscyx0KX1kKHQuZ2V0R3JhcGgoKSx0aGlzLl9nZXROb2RlR2xvYmFsU2NhbGUodCkpO3ZhciBsPXQuZ2V0RGF0YSgpO2EudXBkYXRlRGF0YShsKTt2YXIgdT10LmdldEVkZ2VEYXRhKCk7by51cGRhdGVEYXRhKHUpLHRoaXMuX3VwZGF0ZU5vZGVBbmRMaW5rU2NhbGUoKSx0aGlzLl91cGRhdGVDb250cm9sbGVyKHQsZSxpKSxjbGVhclRpbWVvdXQodGhpcy5fbGF5b3V0VGltZW91dCk7dmFyIGg9dC5mb3JjZUxheW91dCxmPXQuZ2V0KCJmb3JjZS5sYXlvdXRBbmltYXRpb24iKTtoJiZ0aGlzLl9zdGFydEZvcmNlTGF5b3V0SXRlcmF0aW9uKGgsZiksbC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbihlLG4pe3ZhciBhPWwuZ2V0SXRlbU1vZGVsKG4pO2Uub2ZmKCJkcmFnIikub2ZmKCJkcmFnZW5kIik7dmFyIG89bC5nZXRJdGVtTW9kZWwobikuZ2V0KCJkcmFnZ2FibGUiKTtvJiZlLm9uKCJkcmFnIixmdW5jdGlvbigpe2gmJihoLndhcm1VcCgpLCF0aGlzLl9sYXlvdXRpbmcmJnRoaXMuX3N0YXJ0Rm9yY2VMYXlvdXRJdGVyYXRpb24oaCxmKSxoLnNldEZpeGVkKG4pLGwuc2V0SXRlbUxheW91dChuLGUucG9zaXRpb24pKX0sdGhpcykub24oImRyYWdlbmQiLGZ1bmN0aW9uKCl7aCYmaC5zZXRVbmZpeGVkKG4pfSx0aGlzKSxlLnNldERyYWdnYWJsZShvJiZoKSxlLm9mZigibW91c2VvdmVyIixlLl9fZm9jdXNOb2RlQWRqYWNlbmN5KSxlLm9mZigibW91c2VvdXQiLGUuX191bmZvY3VzTm9kZUFkamFjZW5jeSksYS5nZXQoImZvY3VzTm9kZUFkamFjZW5jeSIpJiYoZS5vbigibW91c2VvdmVyIixlLl9fZm9jdXNOb2RlQWRqYWNlbmN5PWZ1bmN0aW9uKCl7aS5kaXNwYXRjaEFjdGlvbih7dHlwZToiZm9jdXNOb2RlQWRqYWNlbmN5IixzZXJpZXNJZDp0LmlkLGRhdGFJbmRleDplLmRhdGFJbmRleH0pfSksZS5vbigibW91c2VvdXQiLGUuX191bmZvY3VzTm9kZUFkamFjZW5jeT1mdW5jdGlvbigpe2kuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InVuZm9jdXNOb2RlQWRqYWNlbmN5IixzZXJpZXNJZDp0LmlkfSl9KSl9LHRoaXMpO3ZhciBwPSJjaXJjdWxhciI9PT10LmdldCgibGF5b3V0IikmJnQuZ2V0KCJjaXJjdWxhci5yb3RhdGVMYWJlbCIpLGc9bC5nZXRMYXlvdXQoImN4IiksbT1sLmdldExheW91dCgiY3kiKTtsLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXRTeW1ib2xQYXRoKCk7aWYocCl7dmFyIG49bC5nZXRJdGVtTGF5b3V0KGUpLGE9TWF0aC5hdGFuMihuWzFdLW0sblswXS1nKTthPDAmJihhPTIqTWF0aC5QSSthKTt2YXIgbz1uWzBdPGc7byYmKGEtPU1hdGguUEkpO3ZhciByPW8/ImxlZnQiOiJyaWdodCI7aS5zZXRTdHlsZSh7dGV4dFJvdGF0aW9uOi1hLHRleHRQb3NpdGlvbjpyLHRleHRPcmlnaW46ImNlbnRlciJ9KSxpLmhvdmVyU3R5bGUmJihpLmhvdmVyU3R5bGUudGV4dFBvc2l0aW9uPXIpfWVsc2UgaS5zZXRTdHlsZSh7dGV4dFJvdGF0aW9uOjB9KX0pLHRoaXMuX2ZpcnN0UmVuZGVyPSExfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbGxlciYmdGhpcy5fY29udHJvbGxlci5kaXNwb3NlKCksdGhpcy5fY29udHJvbGxlckhvc3Q9e319LGZvY3VzTm9kZUFkamFjZW5jeTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgcj10aGlzLl9tb2RlbC5nZXREYXRhKCkscz1uLmRhdGFJbmRleCxsPXIuZ2V0SXRlbUdyYXBoaWNFbChzKTtpZihsKXt2YXIgdT1yLmdyYXBoLGg9bC5kYXRhVHlwZTtpZihudWxsIT09cyYmImVkZ2UiIT09aCl7dS5lYWNoTm9kZShmdW5jdGlvbih0KXthKHQscCwuMSl9KSx1LmVhY2hFZGdlKGZ1bmN0aW9uKHQpe2EodCxnLC4xKX0pO3ZhciBjPXUuZ2V0Tm9kZUJ5SW5kZXgocyk7byhjLHApLGYuZWFjaChjLmVkZ2VzLGZ1bmN0aW9uKHQpe3QuZGF0YUluZGV4PDB8fChvKHQsZyksbyh0Lm5vZGUxLHApLG8odC5ub2RlMixwKSl9KX19fSx1bmZvY3VzTm9kZUFkamFjZW5jeTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10aGlzLl9tb2RlbC5nZXREYXRhKCkuZ3JhcGg7by5lYWNoTm9kZShmdW5jdGlvbih0KXthKHQscCl9KSxvLmVhY2hFZGdlKGZ1bmN0aW9uKHQpe2EodCxnKX0pfSxfc3RhcnRGb3JjZUxheW91dEl0ZXJhdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXM7IWZ1bmN0aW9uIG4oKXt0LnN0ZXAoZnVuY3Rpb24odCl7aS51cGRhdGVMYXlvdXQoaS5fbW9kZWwpLChpLl9sYXlvdXRpbmc9IXQpJiYoZT9pLl9sYXlvdXRUaW1lb3V0PXNldFRpbWVvdXQobiwxNik6bigpKX0pfSgpfSxfdXBkYXRlQ29udHJvbGxlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fY29udHJvbGxlcixhPXRoaXMuX2NvbnRyb2xsZXJIb3N0LG89dGhpcy5ncm91cDtyZXR1cm4gbi5zZXRQb2ludGVyQ2hlY2tlcihmdW5jdGlvbihlLG4sYSl7dmFyIHI9by5nZXRCb3VuZGluZ1JlY3QoKTtyZXR1cm4gci5hcHBseVRyYW5zZm9ybShvLnRyYW5zZm9ybSksci5jb250YWluKG4sYSkmJiFoLm9uSXJyZWxldmFudEVsZW1lbnQoZSxpLHQpfSksInZpZXciIT09dC5jb29yZGluYXRlU3lzdGVtLnR5cGU/dm9pZCBuLmRpc2FibGUoKToobi5lbmFibGUodC5nZXQoInJvYW0iKSksYS56b29tTGltaXQ9dC5nZXQoInNjYWxlTGltaXQiKSxhLnpvb209dC5jb29yZGluYXRlU3lzdGVtLmdldFpvb20oKSx2b2lkIG4ub2ZmKCJwYW4iKS5vZmYoInpvb20iKS5vbigicGFuIixmdW5jdGlvbihlLG4pe3UudXBkYXRlVmlld09uUGFuKGEsZSxuKSxpLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDp0LmlkLHR5cGU6ImdyYXBoUm9hbSIsZHg6ZSxkeTpufSl9KS5vbigiem9vbSIsZnVuY3Rpb24oZSxuLG8pe3UudXBkYXRlVmlld09uWm9vbShhLGUsbixvKSxpLmRpc3BhdGNoQWN0aW9uKHtzZXJpZXNJZDp0LmlkLHR5cGU6ImdyYXBoUm9hbSIsem9vbTplLG9yaWdpblg6bixvcmlnaW5ZOm99KSx0aGlzLl91cGRhdGVOb2RlQW5kTGlua1NjYWxlKCksZCh0LmdldEdyYXBoKCksdGhpcy5fZ2V0Tm9kZUdsb2JhbFNjYWxlKHQpKSx0aGlzLl9saW5lRHJhdy51cGRhdGVMYXlvdXQoKX0sdGhpcykpfSxfdXBkYXRlTm9kZUFuZExpbmtTY2FsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21vZGVsLGU9dC5nZXREYXRhKCksaT10aGlzLl9nZXROb2RlR2xvYmFsU2NhbGUodCksbj1baSxpXTtlLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7dC5hdHRyKCJzY2FsZSIsbil9KX0sX2dldE5vZGVHbG9iYWxTY2FsZTpmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoInZpZXciIT09ZS50eXBlKXJldHVybiAxO3ZhciBpPXRoaXMuX25vZGVTY2FsZVJhdGlvLG49ZS5zY2FsZSxhPW4mJm5bMF18fDEsbz1lLmdldFpvb20oKSxyPShvLTEpKmkrMTtyZXR1cm4gci9hfSx1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCl7ZCh0LmdldEdyYXBoKCksdGhpcy5fZ2V0Tm9kZUdsb2JhbFNjYWxlKHQpKSx0aGlzLl9zeW1ib2xEcmF3LnVwZGF0ZUxheW91dCgpLHRoaXMuX2xpbmVEcmF3LnVwZGF0ZUxheW91dCgpfSxyZW1vdmU6ZnVuY3Rpb24odCxlKXt0aGlzLl9zeW1ib2xEcmF3JiZ0aGlzLl9zeW1ib2xEcmF3LnJlbW92ZSgpLHRoaXMuX2xpbmVEcmF3JiZ0aGlzLl9saW5lRHJhdy5yZW1vdmUoKX19KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe2Zvcih2YXIgbixhPXRbMF0sbz10WzFdLGQ9dFsyXSxmPTEvMCxwPWkqaSxnPS4xLG09LjE7bTw9Ljk7bSs9LjEpe3JbMF09dShhWzBdLG9bMF0sZFswXSxtKSxyWzFdPXUoYVsxXSxvWzFdLGRbMV0sbSk7dmFyIHY9YyhoKHIsZSktcCk7djxmJiYoZj12LG49bSl9Zm9yKHZhciB5PTA7eTwzMjt5Kyspe3ZhciB4PW4rZztzWzBdPXUoYVswXSxvWzBdLGRbMF0sbiksc1sxXT11KGFbMV0sb1sxXSxkWzFdLG4pLGxbMF09dShhWzBdLG9bMF0sZFswXSx4KSxsWzFdPXUoYVsxXSxvWzFdLGRbMV0seCk7dmFyIHY9aChzLGUpLXA7aWYoYyh2KTwuMDEpYnJlYWs7dmFyIF89aChsLGUpLXA7Zy89Mix2PDA/Xz49MD9uKz1nOm4tPWc6Xz49MD9uLT1nOm4rPWd9cmV0dXJuIG59dmFyIGE9aSgyMCksbz1pKDYpLHI9W10scz1bXSxsPVtdLHU9YS5xdWFkcmF0aWNBdCxoPW8uZGlzdFNxdWFyZSxjPU1hdGguYWJzO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dmFyIGU9dC5nZXRWaXN1YWwoInN5bWJvbFNpemUiKTtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5JiYoZT0oZVswXStlWzFdKS8yKSxlfXZhciByPVtdLHM9YS5xdWFkcmF0aWNTdWJkaXZpZGUsbD1bW10sW10sW11dLHU9W1tdLFtdXSxoPVtdO2UvPTIsdC5lYWNoRWRnZShmdW5jdGlvbih0LGEpe3ZhciBjPXQuZ2V0TGF5b3V0KCksZD10LmdldFZpc3VhbCgiZnJvbVN5bWJvbCIpLGY9dC5nZXRWaXN1YWwoInRvU3ltYm9sIik7Yy5fX29yaWdpbmFsfHwoYy5fX29yaWdpbmFsPVtvLmNsb25lKGNbMF0pLG8uY2xvbmUoY1sxXSldLGNbMl0mJmMuX19vcmlnaW5hbC5wdXNoKG8uY2xvbmUoY1syXSkpKTt2YXIgcD1jLl9fb3JpZ2luYWw7aWYobnVsbCE9Y1syXSl7aWYoby5jb3B5KGxbMF0scFswXSksby5jb3B5KGxbMV0scFsyXSksby5jb3B5KGxbMl0scFsxXSksZCYmIm5vbmUiIT1kKXt2YXIgZz1pKHQubm9kZTEpLG09bihsLHBbMF0sZyplKTtzKGxbMF1bMF0sbFsxXVswXSxsWzJdWzBdLG0sciksbFswXVswXT1yWzNdLGxbMV1bMF09cls0XSxzKGxbMF1bMV0sbFsxXVsxXSxsWzJdWzFdLG0sciksbFswXVsxXT1yWzNdLGxbMV1bMV09cls0XX1pZihmJiYibm9uZSIhPWYpe3ZhciBnPWkodC5ub2RlMiksbT1uKGwscFsxXSxnKmUpO3MobFswXVswXSxsWzFdWzBdLGxbMl1bMF0sbSxyKSxsWzFdWzBdPXJbMV0sbFsyXVswXT1yWzJdLHMobFswXVsxXSxsWzFdWzFdLGxbMl1bMV0sbSxyKSxsWzFdWzFdPXJbMV0sbFsyXVsxXT1yWzJdfW8uY29weShjWzBdLGxbMF0pLG8uY29weShjWzFdLGxbMl0pLG8uY29weShjWzJdLGxbMV0pfWVsc2V7aWYoby5jb3B5KHVbMF0scFswXSksby5jb3B5KHVbMV0scFsxXSksby5zdWIoaCx1WzFdLHVbMF0pLG8ubm9ybWFsaXplKGgsaCksZCYmIm5vbmUiIT1kKXt2YXIgZz1pKHQubm9kZTEpO28uc2NhbGVBbmRBZGQodVswXSx1WzBdLGgsZyplKX1pZihmJiYibm9uZSIhPWYpe3ZhciBnPWkodC5ub2RlMik7by5zY2FsZUFuZEFkZCh1WzFdLHVbMV0saCwtZyplKX1vLmNvcHkoY1swXSx1WzBdKSxvLmNvcHkoY1sxXSx1WzFdKX19KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZmluZENvbXBvbmVudHMoe21haW5UeXBlOiJsZWdlbmQifSk7ZSYmZS5sZW5ndGgmJnQuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ2V0Q2F0ZWdvcmllc0RhdGEoKSxuPXQuZ2V0R3JhcGgoKSxhPW4uZGF0YSxvPWkubWFwQXJyYXkoaS5nZXROYW1lKTthLmZpbHRlclNlbGYoZnVuY3Rpb24odCl7dmFyIGk9YS5nZXRJdGVtTW9kZWwodCksbj1pLmdldFNoYWxsb3coImNhdGVnb3J5Iik7aWYobnVsbCE9bil7Im51bWJlciI9PXR5cGVvZiBuJiYobj1vW25dKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZighZVtyXS5pc1NlbGVjdGVkKG4pKXJldHVybiExfXJldHVybiEwfSl9LHRoaXMpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9e307dC5lYWNoU2VyaWVzQnlUeXBlKCJncmFwaCIsZnVuY3Rpb24odCl7dmFyIGk9dC5nZXRDYXRlZ29yaWVzRGF0YSgpLG49dC5nZXREYXRhKCksYT17fTtpLmVhY2goZnVuY3Rpb24obil7dmFyIG89aS5nZXROYW1lKG4pO2FbImVjLSIrb109bjt2YXIgcj1pLmdldEl0ZW1Nb2RlbChuKSxzPXIuZ2V0KCJpdGVtU3R5bGUubm9ybWFsLmNvbG9yIil8fHQuZ2V0Q29sb3JGcm9tUGFsZXR0ZShvLGUpO2kuc2V0SXRlbVZpc3VhbChuLCJjb2xvciIscyl9KSxpLmNvdW50KCkmJm4uZWFjaChmdW5jdGlvbih0KXt2YXIgZT1uLmdldEl0ZW1Nb2RlbCh0KSxvPWUuZ2V0U2hhbGxvdygiY2F0ZWdvcnkiKTtudWxsIT1vJiYoInN0cmluZyI9PXR5cGVvZiBvJiYobz1hWyJlYy0iK29dKSxuLmdldEl0ZW1WaXN1YWwodCwiY29sb3IiLCEwKXx8bi5zZXRJdGVtVmlzdWFsKHQsImNvbG9yIixpLmdldEl0ZW1WaXN1YWwobywiY29sb3IiKSkpfSl9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDI1MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHQpeyJjaXJjdWxhciI9PT10LmdldCgibGF5b3V0IikmJm4odCl9KX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj10LmdldEJveExheW91dFBhcmFtcygpO3JldHVybiBuLmFzcGVjdD1pLG8uZ2V0TGF5b3V0UmVjdChuLHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KX12YXIgYT1pKDI2OCksbz1pKDkpLHI9aSg5MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIGk9W107cmV0dXJuIHQuZWFjaFNlcmllc0J5VHlwZSgiZ3JhcGgiLGZ1bmN0aW9uKHQpe3ZhciBvPXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIik7aWYoIW98fCJ2aWV3Ij09PW8pe3ZhciBzPXQuZ2V0RGF0YSgpLGw9cy5tYXBBcnJheShmdW5jdGlvbih0KXt2YXIgZT1zLmdldEl0ZW1Nb2RlbCh0KTtyZXR1cm5bK2UuZ2V0KCJ4IiksK2UuZ2V0KCJ5IildfSksdT1bXSxoPVtdO3IuZnJvbVBvaW50cyhsLHUsaCksaFswXS11WzBdPT09MCYmKGhbMF0rPTEsdVswXS09MSksaFsxXS11WzFdPT09MCYmKGhbMV0rPTEsdVsxXS09MSk7dmFyIGM9KGhbMF0tdVswXSkvKGhbMV0tdVsxXSksZD1uKHQsZSxjKTtpc05hTihjKSYmKHU9W2QueCxkLnldLGg9W2QueCtkLndpZHRoLGQueStkLmhlaWdodF0pO3ZhciBmPWhbMF0tdVswXSxwPWhbMV0tdVsxXSxnPWQud2lkdGgsbT1kLmhlaWdodCx2PXQuY29vcmRpbmF0ZVN5c3RlbT1uZXcgYTt2Lnpvb21MaW1pdD10LmdldCgic2NhbGVMaW1pdCIpLHYuc2V0Qm91bmRpbmdSZWN0KHVbMF0sdVsxXSxmLHApLHYuc2V0Vmlld1JlY3QoZC54LGQueSxnLG0pLHYuc2V0Q2VudGVyKHQuZ2V0KCJjZW50ZXIiKSksdi5zZXRab29tKHQuZ2V0KCJ6b29tIikpLGkucHVzaCh2KX19KSxpfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXl8fCh0PVt0LHRdKSx0fXQuZXhwb3J0cz1mdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIixmdW5jdGlvbih0KXt2YXIgZT10LmdldEdyYXBoKCksbj10LmdldEVkZ2VEYXRhKCksYT1pKHQuZ2V0KCJlZGdlU3ltYm9sIikpLG89aSh0LmdldCgiZWRnZVN5bWJvbFNpemUiKSkscj0ibGluZVN0eWxlLm5vcm1hbC5jb2xvciIuc3BsaXQoIi4iKSxzPSJsaW5lU3R5bGUubm9ybWFsLm9wYWNpdHkiLnNwbGl0KCIuIik7bi5zZXRWaXN1YWwoImZyb21TeW1ib2wiLGEmJmFbMF0pLG4uc2V0VmlzdWFsKCJ0b1N5bWJvbCIsYSYmYVsxXSksbi5zZXRWaXN1YWwoImZyb21TeW1ib2xTaXplIixvJiZvWzBdKSxuLnNldFZpc3VhbCgidG9TeW1ib2xTaXplIixvJiZvWzFdKSxuLnNldFZpc3VhbCgiY29sb3IiLHQuZ2V0KHIpKSxuLnNldFZpc3VhbCgib3BhY2l0eSIsdC5nZXQocykpLG4uZWFjaChmdW5jdGlvbih0KXt2YXIgYT1uLmdldEl0ZW1Nb2RlbCh0KSxvPWUuZ2V0RWRnZUJ5SW5kZXgodCksbD1pKGEuZ2V0U2hhbGxvdygic3ltYm9sIiwhMCkpLHU9aShhLmdldFNoYWxsb3coInN5bWJvbFNpemUiLCEwKSksaD1hLmdldChyKSxjPWEuZ2V0KHMpO3N3aXRjaChoKXtjYXNlInNvdXJjZSI6aD1vLm5vZGUxLmdldFZpc3VhbCgiY29sb3IiKTticmVhaztjYXNlInRhcmdldCI6aD1vLm5vZGUyLmdldFZpc3VhbCgiY29sb3IiKX1sWzBdJiZvLnNldFZpc3VhbCgiZnJvbVN5bWJvbCIsbFswXSksbFsxXSYmby5zZXRWaXN1YWwoInRvU3ltYm9sIixsWzFdKSx1WzBdJiZvLnNldFZpc3VhbCgiZnJvbVN5bWJvbFNpemUiLHVbMF0pLHVbMV0mJm8uc2V0VmlzdWFsKCJ0b1N5bWJvbFNpemUiLHVbMV0pLG8uc2V0VmlzdWFsKCJjb2xvciIsaCksby5zZXRWaXN1YWwoIm9wYWNpdHkiLGMpfSl9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDYpLGE9bi5zY2FsZUFuZEFkZDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz1pLnJlY3Qscj1vLndpZHRoLHM9by5oZWlnaHQsbD1bby54K3IvMixvLnkrcy8yXSx1PW51bGw9PWkuZ3Jhdml0eT8uMTppLmdyYXZpdHksaD0wO2g8dC5sZW5ndGg7aCsrKXt2YXIgYz10W2hdO2MucHx8KGMucD1uLmNyZWF0ZShyKihNYXRoLnJhbmRvbSgpLS41KStsWzBdLHMqKE1hdGgucmFuZG9tKCktLjUpK2xbMV0pKSxjLnBwPW4uY2xvbmUoYy5wKSxjLmVkZ2VzPW51bGx9dmFyIGQ9LjY7cmV0dXJue3dhcm1VcDpmdW5jdGlvbigpe2Q9LjV9LHNldEZpeGVkOmZ1bmN0aW9uKGUpe3RbZV0uZml4ZWQ9ITB9LHNldFVuZml4ZWQ6ZnVuY3Rpb24oZSl7dFtlXS5maXhlZD0hMX0sc3RlcDpmdW5jdGlvbihpKXtmb3IodmFyIG89W10scj10Lmxlbmd0aCxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBoPWVbc10sYz1oLm4xLGY9aC5uMjtuLnN1YihvLGYucCxjLnApO3ZhciBwPW4ubGVuKG8pLWguZCxnPWYudy8oYy53K2Yudyk7bi5ub3JtYWxpemUobyxvKSwhYy5maXhlZCYmYShjLnAsYy5wLG8sZypwKmQpLCFmLmZpeGVkJiZhKGYucCxmLnAsbywtKDEtZykqcCpkKX1mb3IodmFyIHM9MDtzPHI7cysrKXt2YXIgbT10W3NdO20uZml4ZWR8fChuLnN1YihvLGwsbS5wKSxuLnNjYWxlQW5kQWRkKG0ucCxtLnAsbyx1KmQpKX1mb3IodmFyIHM9MDtzPHI7cysrKWZvcih2YXIgYz10W3NdLHY9cysxO3Y8cjt2Kyspe3ZhciBmPXRbdl07bi5zdWIobyxmLnAsYy5wKTt2YXIgcD1uLmxlbihvKTswPT09cCYmKG4uc2V0KG8sTWF0aC5yYW5kb20oKS0uNSxNYXRoLnJhbmRvbSgpLS41KSxwPTEpO3ZhciB5PShjLnJlcCtmLnJlcCkvcC9wOyFjLmZpeGVkJiZhKGMucHAsYy5wcCxvLHkpLCFmLmZpeGVkJiZhKGYucHAsZi5wcCxvLC15KX1mb3IodmFyIHg9W10scz0wO3M8cjtzKyspe3ZhciBtPXRbc107bS5maXhlZHx8KG4uc3ViKHgsbS5wLG0ucHApLG4uc2NhbGVBbmRBZGQobS5wLG0ucCx4LGQpLG4uY29weShtLnBwLG0ucCkpfWQqPS45OTIsaSYmaSh0LGUsZDwuMDEpfX19fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgzMTApLGE9aSg0KSxvPWkoMjUyKSxyPWkoMjUwKSxzPWkoNiksbD1pKDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImdyYXBoIixmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoIWV8fCJ2aWV3Ij09PWUudHlwZSlpZigiZm9yY2UiPT09dC5nZXQoImxheW91dCIpKXt2YXIgaT10LnByZXNlcnZlZFBvaW50c3x8e30sdT10LmdldEdyYXBoKCksaD11LmRhdGEsYz11LmVkZ2VEYXRhLGQ9dC5nZXRNb2RlbCgiZm9yY2UiKSxmPWQuZ2V0KCJpbml0TGF5b3V0Iik7dC5wcmVzZXJ2ZWRQb2ludHM/aC5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWguZ2V0SWQodCk7aC5zZXRJdGVtTGF5b3V0KHQsaVtlXXx8W05hTixOYU5dKX0pOmYmJiJub25lIiE9PWY/ImNpcmN1bGFyIj09PWYmJnIodCk6byh0KTt2YXIgcD1oLmdldERhdGFFeHRlbnQoInZhbHVlIiksZz1jLmdldERhdGFFeHRlbnQoInZhbHVlIiksbT1kLmdldCgicmVwdWxzaW9uIiksdj1kLmdldCgiZWRnZUxlbmd0aCIpO2wuaXNBcnJheShtKXx8KG09W20sbV0pLGwuaXNBcnJheSh2KXx8KHY9W3Ysdl0pLHY9W3ZbMV0sdlswXV07dmFyIHk9aC5tYXBBcnJheSgidmFsdWUiLGZ1bmN0aW9uKHQsZSl7dmFyIGk9aC5nZXRJdGVtTGF5b3V0KGUpLG49YS5saW5lYXJNYXAodCxwLG0pO3JldHVybiBpc05hTihuKSYmKG49KG1bMF0rbVsxXSkvMikse3c6bixyZXA6bixmaXhlZDpoLmdldEl0ZW1Nb2RlbChlKS5nZXQoImZpeGVkIikscDohaXx8aXNOYU4oaVswXSl8fGlzTmFOKGlbMV0pP251bGw6aX19KSx4PWMubWFwQXJyYXkoInZhbHVlIixmdW5jdGlvbih0LGUpe3ZhciBpPXUuZ2V0RWRnZUJ5SW5kZXgoZSksbj1hLmxpbmVhck1hcCh0LGcsdik7cmV0dXJuIGlzTmFOKG4pJiYobj0odlswXSt2WzFdKS8yKSx7bjE6eVtpLm5vZGUxLmRhdGFJbmRleF0sbjI6eVtpLm5vZGUyLmRhdGFJbmRleF0sZDpuLGN1cnZlbmVzczppLmdldE1vZGVsKCkuZ2V0KCJsaW5lU3R5bGUubm9ybWFsLmN1cnZlbmVzcyIpfHwwfX0pLGU9dC5jb29yZGluYXRlU3lzdGVtLF89ZS5nZXRCb3VuZGluZ1JlY3QoKSxiPW4oeSx4LHtyZWN0Ol8sZ3Jhdml0eTpkLmdldCgiZ3Jhdml0eSIpfSksdz1iLnN0ZXA7Yi5zdGVwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49eS5sZW5ndGg7ZTxuO2UrKyl5W2VdLmZpeGVkJiZzLmNvcHkoeVtlXS5wLHUuZ2V0Tm9kZUJ5SW5kZXgoZSkuZ2V0TGF5b3V0KCkpO3coZnVuY3Rpb24oZSxuLGEpe2Zvcih2YXIgbz0wLHI9ZS5sZW5ndGg7bzxyO28rKyllW29dLmZpeGVkfHx1LmdldE5vZGVCeUluZGV4KG8pLnNldExheW91dChlW29dLnApLGlbaC5nZXRJZChvKV09ZVtvXS5wO2Zvcih2YXIgbz0wLHI9bi5sZW5ndGg7bzxyO28rKyl7dmFyIGw9bltvXSxjPXUuZ2V0RWRnZUJ5SW5kZXgobyksZD1sLm4xLnAsZj1sLm4yLnAscD1jLmdldExheW91dCgpO3A9cD9wLnNsaWNlKCk6W10scFswXT1wWzBdfHxbXSxwWzFdPXBbMV18fFtdLHMuY29weShwWzBdLGQpLHMuY29weShwWzFdLGYpLCtsLmN1cnZlbmVzcyYmKHBbMl09WyhkWzBdK2ZbMF0pLzItKGRbMV0tZlsxXSkqbC5jdXJ2ZW5lc3MsKGRbMV0rZlsxXSkvMi0oZlswXS1kWzBdKSpsLmN1cnZlbmVzc10pLGMuc2V0TGF5b3V0KHApfXQmJnQoYSl9KX0sdC5mb3JjZUxheW91dD1iLHQucHJlc2VydmVkUG9pbnRzPWksYi5zdGVwKCl9ZWxzZSB0LmZvcmNlTGF5b3V0PW51bGx9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDIpLGE9aSgyNDkpLG89e3R5cGU6ImdyYXBoUm9hbSIsZXZlbnQ6ImdyYXBoUm9hbSIsdXBkYXRlOiJub25lIn07bi5yZWdpc3RlckFjdGlvbihvLGZ1bmN0aW9uKHQsZSl7ZS5lYWNoQ29tcG9uZW50KHttYWluVHlwZToic2VyaWVzIixxdWVyeTp0fSxmdW5jdGlvbihlKXt2YXIgaT1lLmNvb3JkaW5hdGVTeXN0ZW0sbj1hLnVwZGF0ZUNlbnRlckFuZFpvb20oaSx0KTtlLnNldENlbnRlciYmZS5zZXRDZW50ZXIobi5jZW50ZXIpLGUuc2V0Wm9vbSYmZS5zZXRab29tKG4uem9vbSl9KX0pLG4ucmVnaXN0ZXJBY3Rpb24oe3R5cGU6ImZvY3VzTm9kZUFkamFjZW5jeSIsZXZlbnQ6ImZvY3VzTm9kZUFkamFjZW5jeSIsdXBkYXRlOiJzZXJpZXMuZ3JhcGg6Zm9jdXNOb2RlQWRqYWNlbmN5In0sZnVuY3Rpb24oKXt9KSxuLnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJ1bmZvY3VzTm9kZUFkamFjZW5jeSIsZXZlbnQ6InVuZm9jdXNOb2RlQWRqYWNlbmN5Iix1cGRhdGU6InNlcmllcy5ncmFwaDp1bmZvY3VzTm9kZUFkamFjZW5jeSJ9LGZ1bmN0aW9uKCl7fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDI1MiksYT1pKDI1MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5lYWNoU2VyaWVzQnlUeXBlKCJncmFwaCIsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImxheW91dCIpLGk9dC5jb29yZGluYXRlU3lzdGVtO2lmKGkmJiJ2aWV3IiE9PWkudHlwZSl7dmFyIG89dC5nZXREYXRhKCkscj1pLmRpbWVuc2lvbnM7by5lYWNoKHIsZnVuY3Rpb24oKXtmb3IodmFyIHQsZT1hcmd1bWVudHMsbj1bXSxhPTA7YTxyLmxlbmd0aDthKyspaXNOYU4oZVthXSl8fCh0PSEwKSxuLnB1c2goZVthXSk7dmFyIHM9ZVtlLmxlbmd0aC0xXTt0P28uc2V0SXRlbUxheW91dChzLGkuZGF0YVRvUG9pbnQobikpOm8uc2V0SXRlbUxheW91dChzLFtOYU4sTmFOXSl9KSxhKG8uZ3JhcGgpfWVsc2UgZSYmIm5vbmUiIT09ZXx8bih0KX0pfX0sZnVuY3Rpb24odCxlLGkpe2koMzE2KSxpKDMxNyl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKCl7dmFyIHQ9by5jcmVhdGVDYW52YXMoKTt0aGlzLmNhbnZhcz10LHRoaXMuYmx1clNpemU9MzAsdGhpcy5wb2ludFNpemU9MjAsdGhpcy5tYXhPcGFjaXR5PTEsdGhpcy5taW5PcGFjaXR5PTAsdGhpcy5fZ3JhZGllbnRQaXhlbHM9e319dmFyIGE9MjU2LG89aSgxKTtuLnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKHQsZSxpLG4sbyxyKXt2YXIgcz10aGlzLl9nZXRCcnVzaCgpLGw9dGhpcy5fZ2V0R3JhZGllbnQodCxvLCJpblJhbmdlIiksdT10aGlzLl9nZXRHcmFkaWVudCh0LG8sIm91dE9mUmFuZ2UiKSxoPXRoaXMucG9pbnRTaXplK3RoaXMuYmx1clNpemUsYz10aGlzLmNhbnZhcyxkPWMuZ2V0Q29udGV4dCgiMmQiKSxmPXQubGVuZ3RoO2Mud2lkdGg9ZSxjLmhlaWdodD1pO2Zvcih2YXIgcD0wO3A8ZjsrK3Ape3ZhciBnPXRbcF0sbT1nWzBdLHY9Z1sxXSx5PWdbMl0seD1uKHkpO2QuZ2xvYmFsQWxwaGE9eCxkLmRyYXdJbWFnZShzLG0taCx2LWgpfWlmKCFjLndpZHRofHwhYy5oZWlnaHQpcmV0dXJuIGM7Zm9yKHZhciBfPWQuZ2V0SW1hZ2VEYXRhKDAsMCxjLndpZHRoLGMuaGVpZ2h0KSxiPV8uZGF0YSx3PTAsUz1iLmxlbmd0aCxNPXRoaXMubWluT3BhY2l0eSxJPXRoaXMubWF4T3BhY2l0eSxUPUktTTt3PFM7KXt2YXIgeD1iW3crM10vMjU2LEE9NCpNYXRoLmZsb29yKHgqKGEtMSkpO2lmKHg+MCl7dmFyIEM9cih4KT9sOnU7eD4wJiYoeD14KlQrTSksYlt3KytdPUNbQV0sYlt3KytdPUNbQSsxXSxiW3crK109Q1tBKzJdLGJbdysrXT1DW0ErM10qeCoyNTZ9ZWxzZSB3Kz00fXJldHVybiBkLnB1dEltYWdlRGF0YShfLDAsMCksY30sX2dldEJydXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYnJ1c2hDYW52YXN8fCh0aGlzLl9icnVzaENhbnZhcz1vLmNyZWF0ZUNhbnZhcygpKSxlPXRoaXMucG9pbnRTaXplK3RoaXMuYmx1clNpemUsaT0yKmU7dC53aWR0aD1pLHQuaGVpZ2h0PWk7dmFyIG49dC5nZXRDb250ZXh0KCIyZCIpO3JldHVybiBuLmNsZWFyUmVjdCgwLDAsaSxpKSxuLnNoYWRvd09mZnNldFg9aSxuLnNoYWRvd0JsdXI9dGhpcy5ibHVyU2l6ZSxuLnNoYWRvd0NvbG9yPSIjMDAwIixuLmJlZ2luUGF0aCgpLG4uYXJjKC1lLGUsdGhpcy5wb2ludFNpemUsMCwyKk1hdGguUEksITApLG4uY2xvc2VQYXRoKCksbi5maWxsKCksdH0sX2dldEdyYWRpZW50OmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG49dGhpcy5fZ3JhZGllbnRQaXhlbHMsYT1uW2ldfHwobltpXT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMTAyNCkpLG89WzAsMCwwLDBdLHI9MCxzPTA7czwyNTY7cysrKWVbaV0ocy8yNTUsITAsbyksYVtyKytdPW9bMF0sYVtyKytdPW9bMV0sYVtyKytdPW9bMl0sYVtyKytdPW9bM107cmV0dXJuIGF9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMTcpLGE9aSgyOCk7dC5leHBvcnRzPW4uZXh0ZW5kKHt0eXBlOiJzZXJpZXMuaGVhdG1hcCIsZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYSh0LmRhdGEsdGhpcyxlKX0sZGVmYXVsdE9wdGlvbjp7Y29vcmRpbmF0ZVN5c3RlbToiY2FydGVzaWFuMmQiLHpsZXZlbDowLHo6MixnZW9JbmRleDowLGJsdXJTaXplOjMwLHBvaW50U2l6ZToyMCxtYXhPcGFjaXR5OjEsbWluT3BhY2l0eTowfX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49dFsxXS10WzBdO2U9bC5tYXAoZSxmdW5jdGlvbihlKXtyZXR1cm57aW50ZXJ2YWw6WyhlLmludGVydmFsWzBdLXRbMF0pL24sKGUuaW50ZXJ2YWxbMV0tdFswXSkvbl19fSk7dmFyIGE9ZS5sZW5ndGgsbz0wO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49bztuPGE7bisrKXt2YXIgcj1lW25dLmludGVydmFsO2lmKHJbMF08PXQmJnQ8PXJbMV0pe289bjticmVha319aWYobj09PWEpZm9yKHZhciBuPW8tMTtuPj0wO24tLSl7dmFyIHI9ZVtuXS5pbnRlcnZhbDtpZihyWzBdPD10JiZ0PD1yWzFdKXtvPW47YnJlYWt9fXJldHVybiBuPj0wJiZuPGEmJmlbbl19fWZ1bmN0aW9uIGEodCxlKXt2YXIgaT10WzFdLXRbMF07cmV0dXJuIGU9WyhlWzBdLXRbMF0pL2ksKGVbMV0tdFswXSkvaV0sZnVuY3Rpb24odCl7cmV0dXJuIHQ+PWVbMF0mJnQ8PWVbMV19fWZ1bmN0aW9uIG8odCl7dmFyIGU9dC5kaW1lbnNpb25zO3JldHVybiJsbmciPT09ZVswXSYmImxhdCI9PT1lWzFdfXZhciByPWkoMykscz1pKDMxNSksbD1pKDEpO3QuZXhwb3J0cz1pKDIpLmV4dGVuZENoYXJ0Vmlldyh7dHlwZToiaGVhdG1hcCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbjtlLmVhY2hDb21wb25lbnQoInZpc3VhbE1hcCIsZnVuY3Rpb24oZSl7ZS5lYWNoVGFyZ2V0U2VyaWVzKGZ1bmN0aW9uKGkpe2k9PT10JiYobj1lKX0pfSksdGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgYT10LmNvb3JkaW5hdGVTeXN0ZW07ImNhcnRlc2lhbjJkIj09PWEudHlwZXx8ImNhbGVuZGFyIj09PWEudHlwZT90aGlzLl9yZW5kZXJPbkNhcnRlc2lhbkFuZENhbGVuZGFyKGEsdCxpKTpvKGEpJiZ0aGlzLl9yZW5kZXJPbkdlbyhhLHQsbixpKX0sZGlzcG9zZTpmdW5jdGlvbigpe30sX3JlbmRlck9uQ2FydGVzaWFuQW5kQ2FsZW5kYXI6ZnVuY3Rpb24odCxlLGkpe2lmKCJjYXJ0ZXNpYW4yZCI9PT10LnR5cGUpdmFyIG49dC5nZXRBeGlzKCJ4IiksYT10LmdldEF4aXMoInkiKSxvPW4uZ2V0QmFuZFdpZHRoKCkscz1hLmdldEJhbmRXaWR0aCgpO3ZhciB1PXRoaXMuZ3JvdXAsaD1lLmdldERhdGEoKSxjPSJpdGVtU3R5bGUubm9ybWFsIixkPSJpdGVtU3R5bGUuZW1waGFzaXMiLGY9ImxhYmVsLm5vcm1hbCIscD0ibGFiZWwuZW1waGFzaXMiLGc9ZS5nZXRNb2RlbChjKS5nZXRJdGVtU3R5bGUoWyJjb2xvciJdKSxtPWUuZ2V0TW9kZWwoZCkuZ2V0SXRlbVN0eWxlKCksdj1lLmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSx5PWUuZ2V0TW9kZWwoImxhYmVsLmVtcGhhc2lzIikseD10LnR5cGUsXz0iY2FydGVzaWFuMmQiPT09eD9bZS5jb29yZERpbVRvRGF0YURpbSgieCIpWzBdLGUuY29vcmREaW1Ub0RhdGFEaW0oInkiKVswXSxlLmNvb3JkRGltVG9EYXRhRGltKCJ2YWx1ZSIpWzBdXTpbZS5jb29yZERpbVRvRGF0YURpbSgidGltZSIpWzBdLGUuY29vcmREaW1Ub0RhdGFEaW0oInZhbHVlIilbMF1dO2guZWFjaChmdW5jdGlvbihpKXt2YXIgbjtpZigiY2FydGVzaWFuMmQiPT09eCl7aWYoaXNOYU4oaC5nZXQoX1syXSxpKSkpcmV0dXJuO3ZhciBhPXQuZGF0YVRvUG9pbnQoW2guZ2V0KF9bMF0saSksaC5nZXQoX1sxXSxpKV0pO249bmV3IHIuUmVjdCh7c2hhcGU6e3g6YVswXS1vLzIseTphWzFdLXMvMix3aWR0aDpvLGhlaWdodDpzfSxzdHlsZTp7ZmlsbDpoLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxvcGFjaXR5OmguZ2V0SXRlbVZpc3VhbChpLCJvcGFjaXR5Iil9fSl9ZWxzZXtpZihpc05hTihoLmdldChfWzFdLGkpKSlyZXR1cm47bj1uZXcgci5SZWN0KHt6MjoxLHNoYXBlOnQuZGF0YVRvUmVjdChbaC5nZXQoX1swXSxpKV0pLmNvbnRlbnRTaGFwZSxzdHlsZTp7ZmlsbDpoLmdldEl0ZW1WaXN1YWwoaSwiY29sb3IiKSxvcGFjaXR5OmguZ2V0SXRlbVZpc3VhbChpLCJvcGFjaXR5Iil9fSl9dmFyIGI9aC5nZXRJdGVtTW9kZWwoaSk7aC5oYXNJdGVtT3B0aW9uJiYoZz1iLmdldE1vZGVsKGMpLmdldEl0ZW1TdHlsZShbImNvbG9yIl0pLG09Yi5nZXRNb2RlbChkKS5nZXRJdGVtU3R5bGUoKSx2PWIuZ2V0TW9kZWwoZikseT1iLmdldE1vZGVsKHApKTt2YXIgdz1lLmdldFJhd1ZhbHVlKGkpLFM9Ii0iO3cmJm51bGwhPXdbMl0mJihTPXdbMl0pLHIuc2V0TGFiZWxTdHlsZShnLG0sdix5LHtsYWJlbEZldGNoZXI6ZSxsYWJlbERhdGFJbmRleDppLGRlZmF1bHRUZXh0OlMsaXNSZWN0VGV4dDohMH0pLG4uc2V0U3R5bGUoZyksci5zZXRIb3ZlclN0eWxlKG4saC5oYXNJdGVtT3B0aW9uP206bC5leHRlbmQoe30sbSkpLHUuYWRkKG4pLGguc2V0SXRlbUdyYXBoaWNFbChpLG4pfSl9LF9yZW5kZXJPbkdlbzpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbD1pLnRhcmdldFZpc3VhbHMuaW5SYW5nZSx1PWkudGFyZ2V0VmlzdWFscy5vdXRPZlJhbmdlLGg9ZS5nZXREYXRhKCksYz10aGlzLl9obUxheWVyfHx0aGlzLl9obUxheWVyfHxuZXcgcztjLmJsdXJTaXplPWUuZ2V0KCJibHVyU2l6ZSIpLGMucG9pbnRTaXplPWUuZ2V0KCJwb2ludFNpemUiKSxjLm1pbk9wYWNpdHk9ZS5nZXQoIm1pbk9wYWNpdHkiKSxjLm1heE9wYWNpdHk9ZS5nZXQoIm1heE9wYWNpdHkiKTt2YXIgZD10LmdldFZpZXdSZWN0KCkuY2xvbmUoKSxmPXQuZ2V0Um9hbVRyYW5zZm9ybSgpLnRyYW5zZm9ybTtkLmFwcGx5VHJhbnNmb3JtKGYpO3ZhciBwPU1hdGgubWF4KGQueCwwKSxnPU1hdGgubWF4KGQueSwwKSxtPU1hdGgubWluKGQud2lkdGgrZC54LG8uZ2V0V2lkdGgoKSksdj1NYXRoLm1pbihkLmhlaWdodCtkLnksby5nZXRIZWlnaHQoKSkseT1tLXAseD12LWcsXz1oLm1hcEFycmF5KFsibG5nIiwibGF0IiwidmFsdWUiXSxmdW5jdGlvbihlLGksbil7dmFyIGE9dC5kYXRhVG9Qb2ludChbZSxpXSk7cmV0dXJuIGFbMF0tPXAsYVsxXS09ZyxhLnB1c2gobiksYX0pLGI9aS5nZXRFeHRlbnQoKSx3PSJ2aXN1YWxNYXAuY29udGludW91cyI9PT1pLnR5cGU/YShiLGkub3B0aW9uLnJhbmdlKTpuKGIsaS5nZXRQaWVjZUxpc3QoKSxpLm9wdGlvbi5zZWxlY3RlZCk7Yy51cGRhdGUoXyx5LHgsbC5jb2xvci5nZXROb3JtYWxpemVyKCkse2luUmFuZ2U6bC5jb2xvci5nZXRDb2xvck1hcHBlcigpLG91dE9mUmFuZ2U6dS5jb2xvci5nZXRDb2xvck1hcHBlcigpfSx3KTt2YXIgUz1uZXcgci5JbWFnZSh7c3R5bGU6e3dpZHRoOnksaGVpZ2h0OngseDpwLHk6ZyxpbWFnZTpjLmNhbnZhc30sc2lsZW50OiEwfSk7dGhpcy5ncm91cC5hZGQoUyl9fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXtyLmNhbGwodGhpcyx0LGUsaSksdGhpcy5fbGFzdEZyYW1lPTAsdGhpcy5fbGFzdEZyYW1lUGVyY2VudD0wfXZhciBhPWkoMjU0KSxvPWkoMSkscj1pKDI1Mykscz1pKDYpLGw9bi5wcm90b3R5cGU7bC5jcmVhdGVMaW5lPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IGEodCxlLGkpfSxsLnVwZGF0ZUFuaW1hdGlvblBvaW50cz1mdW5jdGlvbih0LGUpe3RoaXMuX3BvaW50cz1lO2Zvcih2YXIgaT1bMF0sbj0wLGE9MTthPGUubGVuZ3RoO2ErKyl7dmFyIG89ZVthLTFdLHI9ZVthXTtuKz1zLmRpc3QobyxyKSxpLnB1c2gobil9aWYoMCE9PW4pe2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWlbYV0vPW47dGhpcy5fb2Zmc2V0cz1pLHRoaXMuX2xlbmd0aD1ufX0sbC5nZXRMaW5lTGVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZW5ndGh9LGwudXBkYXRlU3ltYm9sUG9zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dC5fX3QsaT10aGlzLl9wb2ludHMsbj10aGlzLl9vZmZzZXRzLGE9aS5sZW5ndGg7aWYobil7dmFyIG8scj10aGlzLl9sYXN0RnJhbWU7aWYoZTx0aGlzLl9sYXN0RnJhbWVQZXJjZW50KXt2YXIgbD1NYXRoLm1pbihyKzEsYS0xKTtmb3Iobz1sO28+PTAmJiEobltvXTw9ZSk7by0tKTtvPU1hdGgubWluKG8sYS0yKX1lbHNle2Zvcih2YXIgbz1yO288YSYmIShuW29dPmUpO28rKyk7bz1NYXRoLm1pbihvLTEsYS0yKX1zLmxlcnAodC5wb3NpdGlvbixpW29dLGlbbysxXSwoZS1uW29dKS8obltvKzFdLW5bb10pKTt2YXIgdT1pW28rMV1bMF0taVtvXVswXSxoPWlbbysxXVsxXS1pW29dWzFdO3Qucm90YXRpb249LU1hdGguYXRhbjIoaCx1KS1NYXRoLlBJLzIsdGhpcy5fbGFzdEZyYW1lPW8sdGhpcy5fbGFzdEZyYW1lUGVyY2VudD1lLHQuaWdub3JlPSExfX0sby5pbmhlcml0cyhuLHIpLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gci5pc0FycmF5KHQpfHwodD1bK3QsK3RdKSx0fWZ1bmN0aW9uIGEodCxlKXt0LmVhY2hDaGlsZChmdW5jdGlvbih0KXt0LmF0dHIoe3o6ZS56LHpsZXZlbDplLnpsZXZlbCxzdHlsZTp7c3Ryb2tlOiJzdHJva2UiPT09ZS5icnVzaFR5cGU/ZS5jb2xvcjpudWxsLGZpbGw6ImZpbGwiPT09ZS5icnVzaFR5cGU/ZS5jb2xvcjpudWxsfX0pfSl9ZnVuY3Rpb24gbyh0LGUpe2MuY2FsbCh0aGlzKTt2YXIgaT1uZXcgaCh0LGUpLG49bmV3IGM7dGhpcy5hZGQoaSksdGhpcy5hZGQobiksbi5iZWZvcmVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmF0dHIoaS5nZXRTY2FsZSgpKX0sdGhpcy51cGRhdGVEYXRhKHQsZSl9dmFyIHI9aSgxKSxzPWkoMjQpLGw9aSgzKSx1PWkoNCksaD1pKDU3KSxjPWwuR3JvdXAsZD0zLGY9by5wcm90b3R5cGU7Zi5zdG9wRWZmZWN0QW5pbWF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZEF0KDEpLnJlbW92ZUFsbCgpfSxmLnN0YXJ0RWZmZWN0QW5pbWF0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnN5bWJvbFR5cGUsaT10LmNvbG9yLG49dGhpcy5jaGlsZEF0KDEpLG89MDtvPGQ7bysrKXt2YXIgcj1zLmNyZWF0ZVN5bWJvbChlLC0xLC0xLDIsMixpKTtyLmF0dHIoe3N0eWxlOntzdHJva2VOb1NjYWxlOiEwfSx6Mjo5OSxzaWxlbnQ6ITAsc2NhbGU6Wy41LC41XX0pO3ZhciBsPS1vL2QqdC5wZXJpb2QrdC5lZmZlY3RPZmZzZXQ7ci5hbmltYXRlKCIiLCEwKS53aGVuKHQucGVyaW9kLHtzY2FsZTpbdC5yaXBwbGVTY2FsZS8yLHQucmlwcGxlU2NhbGUvMl19KS5kZWxheShsKS5zdGFydCgpLHIuYW5pbWF0ZVN0eWxlKCEwKS53aGVuKHQucGVyaW9kLHtvcGFjaXR5OjB9KS5kZWxheShsKS5zdGFydCgpLG4uYWRkKHIpfWEobix0KX0sZi51cGRhdGVFZmZlY3RBbmltYXRpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VmZmVjdENmZyxpPXRoaXMuY2hpbGRBdCgxKSxuPVsic3ltYm9sVHlwZSIsInBlcmlvZCIsInJpcHBsZVNjYWxlIl0sbz0wO288bi5sZW5ndGg7bysrKXt2YXIgcj1uW29dO2lmKGVbcl0hPT10W3JdKXJldHVybiB0aGlzLnN0b3BFZmZlY3RBbmltYXRpb24oKSx2b2lkIHRoaXMuc3RhcnRFZmZlY3RBbmltYXRpb24odCl9YShpLHQpfSxmLmhpZ2hsaWdodD1mdW5jdGlvbigpe3RoaXMudHJpZ2dlcigiZW1waGFzaXMiKX0sZi5kb3ducGxheT1mdW5jdGlvbigpe3RoaXMudHJpZ2dlcigibm9ybWFsIil9LGYudXBkYXRlRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuaG9zdE1vZGVsO3RoaXMuY2hpbGRBdCgwKS51cGRhdGVEYXRhKHQsZSk7dmFyIGE9dGhpcy5jaGlsZEF0KDEpLG89dC5nZXRJdGVtTW9kZWwoZSkscj10LmdldEl0ZW1WaXN1YWwoZSwic3ltYm9sIikscz1uKHQuZ2V0SXRlbVZpc3VhbChlLCJzeW1ib2xTaXplIikpLGw9dC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIik7YS5hdHRyKCJzY2FsZSIscyksYS50cmF2ZXJzZShmdW5jdGlvbih0KXt0LmF0dHIoe2ZpbGw6bH0pfSk7dmFyIGg9by5nZXRTaGFsbG93KCJzeW1ib2xPZmZzZXQiKTtpZihoKXt2YXIgYz1hLnBvc2l0aW9uO2NbMF09dS5wYXJzZVBlcmNlbnQoaFswXSxzWzBdKSxjWzFdPXUucGFyc2VQZXJjZW50KGhbMV0sc1sxXSl9YS5yb3RhdGlvbj0oby5nZXRTaGFsbG93KCJzeW1ib2xSb3RhdGUiKXx8MCkqTWF0aC5QSS8xODB8fDA7dmFyIGQ9e307aWYoZC5zaG93RWZmZWN0T249aS5nZXQoInNob3dFZmZlY3RPbiIpLGQucmlwcGxlU2NhbGU9by5nZXQoInJpcHBsZUVmZmVjdC5zY2FsZSIpLGQuYnJ1c2hUeXBlPW8uZ2V0KCJyaXBwbGVFZmZlY3QuYnJ1c2hUeXBlIiksZC5wZXJpb2Q9MWUzKm8uZ2V0KCJyaXBwbGVFZmZlY3QucGVyaW9kIiksZC5lZmZlY3RPZmZzZXQ9ZS90LmNvdW50KCksZC56PW8uZ2V0U2hhbGxvdygieiIpfHwwLGQuemxldmVsPW8uZ2V0U2hhbGxvdygiemxldmVsIil8fDAsZC5zeW1ib2xUeXBlPXIsZC5jb2xvcj1sLHRoaXMub2ZmKCJtb3VzZW92ZXIiKS5vZmYoIm1vdXNlb3V0Iikub2ZmKCJlbXBoYXNpcyIpLm9mZigibm9ybWFsIiksInJlbmRlciI9PT1kLnNob3dFZmZlY3RPbil0aGlzLl9lZmZlY3RDZmc/dGhpcy51cGRhdGVFZmZlY3RBbmltYXRpb24oZCk6dGhpcy5zdGFydEVmZmVjdEFuaW1hdGlvbihkKSx0aGlzLl9lZmZlY3RDZmc9ZDtlbHNle3RoaXMuX2VmZmVjdENmZz1udWxsLHRoaXMuc3RvcEVmZmVjdEFuaW1hdGlvbigpO3ZhciBmPXRoaXMuY2hpbGRBdCgwKSxwPWZ1bmN0aW9uKCl7Zi5oaWdobGlnaHQoKSwicmVuZGVyIiE9PWQuc2hvd0VmZmVjdE9uJiZ0aGlzLnN0YXJ0RWZmZWN0QW5pbWF0aW9uKGQpfSxnPWZ1bmN0aW9uKCl7Zi5kb3ducGxheSgpLCJyZW5kZXIiIT09ZC5zaG93RWZmZWN0T24mJnRoaXMuc3RvcEVmZmVjdEFuaW1hdGlvbigpfTt0aGlzLm9uKCJtb3VzZW92ZXIiLHAsdGhpcykub24oIm1vdXNlb3V0IixnLHRoaXMpLm9uKCJlbXBoYXNpcyIscCx0aGlzKS5vbigibm9ybWFsIixnLHRoaXMpfXRoaXMuX2VmZmVjdENmZz1kfSxmLmZhZGVPdXQ9ZnVuY3Rpb24odCl7dGhpcy5vZmYoIm1vdXNlb3ZlciIpLm9mZigibW91c2VvdXQiKS5vZmYoImVtcGhhc2lzIikub2ZmKCJub3JtYWwiKSx0JiZ0KCl9LHIuaW5oZXJpdHMobyxjKSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4oKXt0aGlzLmdyb3VwPW5ldyBhLkdyb3VwLHRoaXMuX2xpbmVFbD1uZXcgc312YXIgYT1pKDMpLG89aSgxMDMpLHI9aSgxMDIpLHM9YS5leHRlbmRTaGFwZSh7c2hhcGU6e3BvbHlsaW5lOiExLHNlZ3M6W119LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1lLnNlZ3Msbj1lLnBvbHlsaW5lLGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIG89aVthXTtpZihuKXt0Lm1vdmVUbyhvWzBdWzBdLG9bMF1bMV0pO2Zvcih2YXIgcj0xO3I8by5sZW5ndGg7cisrKXQubGluZVRvKG9bcl1bMF0sb1tyXVsxXSl9ZWxzZSB0Lm1vdmVUbyhvWzBdWzBdLG9bMF1bMV0pLG8ubGVuZ3RoPjI/dC5xdWFkcmF0aWNDdXJ2ZVRvKG9bMl1bMF0sb1syXVsxXSxvWzFdWzBdLG9bMV1bMV0pOnQubGluZVRvKG9bMV1bMF0sb1sxXVsxXSl9fSxmaW5kRGF0YUluZGV4OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuc2hhcGUsbj1pLnNlZ3MsYT1pLnBvbHlsaW5lLHM9TWF0aC5tYXgodGhpcy5zdHlsZS5saW5lV2lkdGgsMSksbD0wO2w8bi5sZW5ndGg7bCsrKXt2YXIgdT1uW2xdO2lmKGEpe2Zvcih2YXIgaD0xO2g8dS5sZW5ndGg7aCsrKWlmKHIuY29udGFpblN0cm9rZSh1W2gtMV1bMF0sdVtoLTFdWzFdLHVbaF1bMF0sdVtoXVsxXSxzLHQsZSkpcmV0dXJuIGx9ZWxzZSBpZih1Lmxlbmd0aD4yKXtpZihvLmNvbnRhaW5TdHJva2UodVswXVswXSx1WzBdWzFdLHVbMl1bMF0sdVsyXVsxXSx1WzFdWzBdLHVbMV1bMV0scyx0LGUpKXJldHVybiBsfWVsc2UgaWYoci5jb250YWluU3Ryb2tlKHVbMF1bMF0sdVswXVsxXSx1WzFdWzBdLHVbMV1bMV0scyx0LGUpKXJldHVybiBsfXJldHVybi0xfX0pLGw9bi5wcm90b3R5cGU7bC51cGRhdGVEYXRhPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIGU9dGhpcy5fbGluZUVsLGk9dC5ob3N0TW9kZWw7ZS5zZXRTaGFwZSh7c2Vnczp0Lm1hcEFycmF5KHQuZ2V0SXRlbUxheW91dCkscG9seWxpbmU6aS5nZXQoInBvbHlsaW5lIil9KSxlLnVzZVN0eWxlKGkuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKS5nZXRMaW5lU3R5bGUoKSk7dmFyIG49dC5nZXRWaXN1YWwoImNvbG9yIik7biYmZS5zZXRTdHlsZSgic3Ryb2tlIixuKSxlLnNldFN0eWxlKCJmaWxsIiksZS5zZXJpZXNJbmRleD1pLnNlcmllc0luZGV4LGUub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7ZS5kYXRhSW5kZXg9bnVsbDt2YXIgaT1lLmZpbmREYXRhSW5kZXgodC5vZmZzZXRYLHQub2Zmc2V0WSk7aT4wJiYoZS5kYXRhSW5kZXg9aSl9KSx0aGlzLmdyb3VwLmFkZChlKX0sbC51cGRhdGVMYXlvdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCk7dGhpcy5fbGluZUVsLnNldFNoYXBlKHtzZWdzOmUubWFwQXJyYXkoZS5nZXRJdGVtTGF5b3V0KX0pfSxsLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSxuKXtsLkdyb3VwLmNhbGwodGhpcyksdGhpcy5ib2R5SW5kZXgsdGhpcy53aGlza2VySW5kZXgsdGhpcy5zdHlsZVVwZGF0ZXI9aSx0aGlzLl9jcmVhdGVDb250ZW50KHQsZSxuKSx0aGlzLnVwZGF0ZURhdGEodCxlLG4pLHRoaXMuX3Nlcmllc01vZGVsfWZ1bmN0aW9uIGEodCxlLGkpe3JldHVybiBzLm1hcCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0PXQuc2xpY2UoKSx0W2VdPWkuaW5pdEJhc2VsaW5lLHR9KX1mdW5jdGlvbiBvKHQpe3ZhciBlPXt9O3JldHVybiBzLmVhY2godCxmdW5jdGlvbih0LGkpe2VbImVuZHMiK2ldPXR9KSxlfWZ1bmN0aW9uIHIodCl7dGhpcy5ncm91cD1uZXcgbC5Hcm91cCx0aGlzLnN0eWxlVXBkYXRlcj10fXZhciBzPWkoMSksbD1pKDMpLHU9aSg4KSxoPXUuZXh0ZW5kKHt0eXBlOiJ3aGlza2VySW5Cb3giLHNoYXBlOnt9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkmJjA9PT1pLmluZGV4T2YoImVuZHMiKSl7dmFyIG49ZVtpXTt0Lm1vdmVUbyhuWzBdWzBdLG5bMF1bMV0pLHQubGluZVRvKG5bMV1bMF0sblsxXVsxXSl9fX0pLGM9bi5wcm90b3R5cGU7Yy5fY3JlYXRlQ29udGVudD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dC5nZXRJdGVtTGF5b3V0KGUpLHI9Imhvcml6b250YWwiPT09bi5jaGFydExheW91dD8xOjAsdT0wO3RoaXMuYWRkKG5ldyBsLlBvbHlnb24oe3NoYXBlOntwb2ludHM6aT9hKG4uYm9keUVuZHMscixuKTpuLmJvZHlFbmRzfSxzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6MTAwfSkpLHRoaXMuYm9keUluZGV4PXUrKzt2YXIgYz1zLm1hcChuLndoaXNrZXJFbmRzLGZ1bmN0aW9uKHQpe3JldHVybiBpP2EodCxyLG4pOnR9KTt0aGlzLmFkZChuZXcgaCh7c2hhcGU6byhjKSxzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6MTAwfSkpLHRoaXMud2hpc2tlckluZGV4PXUrK30sYy51cGRhdGVEYXRhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9zZXJpZXNNb2RlbD10Lmhvc3RNb2RlbCxhPXQuZ2V0SXRlbUxheW91dChlKSxyPWxbaT8iaW5pdFByb3BzIjoidXBkYXRlUHJvcHMiXTtyKHRoaXMuY2hpbGRBdCh0aGlzLmJvZHlJbmRleCkse3NoYXBlOntwb2ludHM6YS5ib2R5RW5kc319LG4sZSkscih0aGlzLmNoaWxkQXQodGhpcy53aGlza2VySW5kZXgpLHtzaGFwZTpvKGEud2hpc2tlckVuZHMpfSxuLGUpLHRoaXMuc3R5bGVVcGRhdGVyLmNhbGwobnVsbCx0aGlzLHQsZSl9LHMuaW5oZXJpdHMobixsLkdyb3VwKTt2YXIgZD1yLnByb3RvdHlwZTtkLnVwZGF0ZURhdGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncm91cCxpPXRoaXMuX2RhdGEsYT10aGlzLnN0eWxlVXBkYXRlcjt0LmRpZmYoaSkuYWRkKGZ1bmN0aW9uKGkpe2lmKHQuaGFzVmFsdWUoaSkpe3ZhciBvPW5ldyBuKHQsaSxhLCEwKTt0LnNldEl0ZW1HcmFwaGljRWwoaSxvKSxlLmFkZChvKX19KS51cGRhdGUoZnVuY3Rpb24obyxyKXt2YXIgcz1pLmdldEl0ZW1HcmFwaGljRWwocik7cmV0dXJuIHQuaGFzVmFsdWUobyk/KHM/cy51cGRhdGVEYXRhKHQsbyk6cz1uZXcgbih0LG8sYSksZS5hZGQocyksdm9pZCB0LnNldEl0ZW1HcmFwaGljRWwobyxzKSk6dm9pZCBlLnJlbW92ZShzKX0pLnJlbW92ZShmdW5jdGlvbih0KXt2YXIgbj1pLmdldEl0ZW1HcmFwaGljRWwodCk7biYmZS5yZW1vdmUobil9KS5leGVjdXRlKCksdGhpcy5fZGF0YT10fSxkLnJlbW92ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ3JvdXAsZT10aGlzLl9kYXRhO3RoaXMuX2RhdGE9bnVsbCxlJiZlLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKGUpe2UmJnQucmVtb3ZlKGUpfSl9LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7aSgzMjMpLGkoMzI0KTt2YXIgbj1pKDIpO24ucmVnaXN0ZXJMYXlvdXQoaSgzMjUpKSxuLnJlZ2lzdGVyVmlzdWFsKGkoMzI2KSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT10LmRhdGE7ZSYmZVswXSYmZVswXVswXSYmZVswXVswXS5jb29yZCYmKHQuZGF0YT1yLm1hcChlLGZ1bmN0aW9uKHQpe3ZhciBlPVt0WzBdLmNvb3JkLHRbMV0uY29vcmRdLGk9e2Nvb3JkczplfTtyZXR1cm4gdFswXS5uYW1lJiYoaS5mcm9tTmFtZT10WzBdLm5hbWUpLHRbMV0ubmFtZSYmKGkudG9OYW1lPXRbMV0ubmFtZSksci5tZXJnZUFsbChbaSx0WzBdLHRbMV1dKX0pKX12YXIgYT1pKDE3KSxvPWkoMTQpLHI9aSgxKSxzPWkoNyksbD0oaSgyNiksYS5leHRlbmQoe3R5cGU6InNlcmllcy5saW5lcyIsZGVwZW5kZW5jaWVzOlsiZ3JpZCIsInBvbGFyIl0sdmlzdWFsQ29sb3JBY2Nlc3NQYXRoOiJsaW5lU3R5bGUubm9ybWFsLmNvbG9yIixpbml0OmZ1bmN0aW9uKHQpe24odCksbC5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe24odCksbC5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBvKFsidmFsdWUiXSx0aGlzKTtyZXR1cm4gaS5oYXNJdGVtT3B0aW9uPSExLGkuaW5pdERhdGEodC5kYXRhLFtdLGZ1bmN0aW9uKHQsZSxuLGEpe2lmKHQgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gTmFOO2kuaGFzSXRlbU9wdGlvbj0hMDt2YXIgbz10LnZhbHVlO3JldHVybiBudWxsIT1vP28gaW5zdGFuY2VvZiBBcnJheT9vW2FdOm86dm9pZCAwfSksaX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKSxpPWUuZ2V0SXRlbU1vZGVsKHQpLG49aS5nZXQoIm5hbWUiKTtpZihuKXJldHVybiBuO3ZhciBhPWkuZ2V0KCJmcm9tTmFtZSIpLG89aS5nZXQoInRvTmFtZSIpLHI9W107cmV0dXJuIG51bGwhPWEmJnIucHVzaChhKSxudWxsIT1vJiZyLnB1c2gobykscy5lbmNvZGVIVE1MKHIuam9pbigiID4gIikpfSxkZWZhdWx0T3B0aW9uOntjb29yZGluYXRlU3lzdGVtOiJnZW8iLHpsZXZlbDowLHo6MixsZWdlbmRIb3Zlckxpbms6ITAsaG92ZXJBbmltYXRpb246ITAseEF4aXNJbmRleDowLHlBeGlzSW5kZXg6MCxzeW1ib2w6WyJub25lIiwibm9uZSJdLHN5bWJvbFNpemU6WzEwLDEwXSxnZW9JbmRleDowLGVmZmVjdDp7c2hvdzohMSxwZXJpb2Q6NCxjb25zdGFudFNwZWVkOjAsc3ltYm9sOiJjaXJjbGUiLHN5bWJvbFNpemU6Myxsb29wOiEwLHRyYWlsTGVuZ3RoOi4yfSxsYXJnZTohMSxsYXJnZVRocmVzaG9sZDoyZTMscG9seWxpbmU6ITEsbGFiZWw6e25vcm1hbDp7c2hvdzohMSxwb3NpdGlvbjoiZW5kIn19LGxpbmVTdHlsZTp7bm9ybWFsOntvcGFjaXR5Oi41fX19fSkpfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxMTIpLGE9aSgyNTMpLG89aSgxMTEpLHI9aSgyNTQpLHM9aSgzMTgpLGw9aSgzMjApO2koMikuZXh0ZW5kQ2hhcnRWaWV3KHt0eXBlOiJsaW5lcyIsaW5pdDpmdW5jdGlvbigpe30scmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgdT10LmdldERhdGEoKSxoPXRoaXMuX2xpbmVEcmF3LGM9dC5nZXQoImVmZmVjdC5zaG93IiksZD10LmdldCgicG9seWxpbmUiKSxmPXQuZ2V0KCJsYXJnZSIpJiZ1LmNvdW50KCk+PXQuZ2V0KCJsYXJnZVRocmVzaG9sZCIpOwpjPT09dGhpcy5faGFzRWZmZXQmJmQ9PT10aGlzLl9pc1BvbHlsaW5lJiZmPT09dGhpcy5faXNMYXJnZXx8KGgmJmgucmVtb3ZlKCksaD10aGlzLl9saW5lRHJhdz1mP25ldyBsOm5ldyBuKGQ/Yz9zOnI6Yz9hOm8pLHRoaXMuX2hhc0VmZmV0PWMsdGhpcy5faXNQb2x5bGluZT1kLHRoaXMuX2lzTGFyZ2U9Zik7dmFyIHA9dC5nZXQoInpsZXZlbCIpLGc9dC5nZXQoImVmZmVjdC50cmFpbExlbmd0aCIpLG09aS5nZXRacigpLHY9InN2ZyI9PT1tLnBhaW50ZXIuZ2V0VHlwZSgpO2lmKHZ8fG0ucGFpbnRlci5nZXRMYXllcihwKS5jbGVhcighMCksbnVsbD09dGhpcy5fbGFzdFpsZXZlbHx8dnx8bS5jb25maWdMYXllcih0aGlzLl9sYXN0WmxldmVsLHttb3Rpb25CbHVyOiExfSksYyYmZyl7dnx8bS5jb25maWdMYXllcihwLHttb3Rpb25CbHVyOiEwLGxhc3RGcmFtZUFscGhhOk1hdGgubWF4KE1hdGgubWluKGcvMTArLjksMSksMCl9KX10aGlzLmdyb3VwLmFkZChoLmdyb3VwKSxoLnVwZGF0ZURhdGEodSksdGhpcy5fbGFzdFpsZXZlbD1wfSx1cGRhdGVMYXlvdXQ6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2xpbmVEcmF3LnVwZGF0ZUxheW91dCh0KTt2YXIgbj1pLmdldFpyKCksYT0ic3ZnIj09PW4ucGFpbnRlci5nZXRUeXBlKCk7YXx8bi5wYWludGVyLmdldExheWVyKHRoaXMuX2xhc3RabGV2ZWwpLmNsZWFyKCEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7dGhpcy5fbGluZURyYXcmJnRoaXMuX2xpbmVEcmF3LnJlbW92ZShlLCEwKTt2YXIgaT1lLmdldFpyKCksbj0ic3ZnIj09PWkucGFpbnRlci5nZXRUeXBlKCk7bnx8aS5wYWludGVyLmdldExheWVyKHRoaXMuX2xhc3RabGV2ZWwpLmNsZWFyKCEwKX0sZGlzcG9zZTpmdW5jdGlvbigpe319KX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImxpbmVzIixmdW5jdGlvbih0KXt2YXIgZT10LmNvb3JkaW5hdGVTeXN0ZW0saT10LmdldERhdGEoKTtpLmVhY2goZnVuY3Rpb24obil7dmFyIGE9aS5nZXRJdGVtTW9kZWwobiksbz1hLm9wdGlvbiBpbnN0YW5jZW9mIEFycmF5P2Eub3B0aW9uOmEuZ2V0KCJjb29yZHMiKSxyPVtdO2lmKHQuZ2V0KCJwb2x5bGluZSIpKWZvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKXIucHVzaChlLmRhdGFUb1BvaW50KG9bc10pKTtlbHNle3JbMF09ZS5kYXRhVG9Qb2ludChvWzBdKSxyWzFdPWUuZGF0YVRvUG9pbnQob1sxXSk7dmFyIGw9YS5nZXQoImxpbmVTdHlsZS5ub3JtYWwuY3VydmVuZXNzIik7K2wmJihyWzJdPVsoclswXVswXStyWzFdWzBdKS8yLShyWzBdWzFdLXJbMV1bMV0pKmwsKHJbMF1bMV0rclsxXVsxXSkvMi0oclsxXVswXS1yWzBdWzBdKSpsXSl9aS5zZXRJdGVtTGF5b3V0KG4scil9KX0pfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXl8fCh0PVt0LHRdKSx0fXQuZXhwb3J0cz1mdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoImxpbmVzIixmdW5jdGlvbih0KXt2YXIgZT10LmdldERhdGEoKSxuPWkodC5nZXQoInN5bWJvbCIpKSxhPWkodC5nZXQoInN5bWJvbFNpemUiKSksbz0ibGluZVN0eWxlLm5vcm1hbC5vcGFjaXR5Ii5zcGxpdCgiLiIpO2Uuc2V0VmlzdWFsKCJmcm9tU3ltYm9sIixuJiZuWzBdKSxlLnNldFZpc3VhbCgidG9TeW1ib2wiLG4mJm5bMV0pLGUuc2V0VmlzdWFsKCJmcm9tU3ltYm9sU2l6ZSIsYSYmYVswXSksZS5zZXRWaXN1YWwoInRvU3ltYm9sU2l6ZSIsYSYmYVsxXSksZS5zZXRWaXN1YWwoIm9wYWNpdHkiLHQuZ2V0KG8pKSxlLmVhY2goZnVuY3Rpb24odCl7dmFyIG49ZS5nZXRJdGVtTW9kZWwodCksYT1pKG4uZ2V0U2hhbGxvdygic3ltYm9sIiwhMCkpLHI9aShuLmdldFNoYWxsb3coInN5bWJvbFNpemUiLCEwKSkscz1uLmdldChvKTthWzBdJiZlLnNldEl0ZW1WaXN1YWwodCwiZnJvbVN5bWJvbCIsYVswXSksYVsxXSYmZS5zZXRJdGVtVmlzdWFsKHQsInRvU3ltYm9sIixhWzFdKSxyWzBdJiZlLnNldEl0ZW1WaXN1YWwodCwiZnJvbVN5bWJvbFNpemUiLHJbMF0pLHJbMV0mJmUuc2V0SXRlbVZpc3VhbCh0LCJ0b1N5bWJvbFNpemUiLHJbMV0pLGUuc2V0SXRlbVZpc3VhbCh0LCJvcGFjaXR5IixzKX0pfSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyKSxhPW4uUFJJT1JJVFk7aSgzMjgpLGkoMzI5KSxpKDI0OCksaSgxOTIpLG4ucmVnaXN0ZXJMYXlvdXQoaSgzMzIpKSxuLnJlZ2lzdGVyVmlzdWFsKGkoMzMzKSksbi5yZWdpc3RlclByb2Nlc3NvcihhLlBST0NFU1NPUi5TVEFUSVNUSUMsaSgzMzEpKSxuLnJlZ2lzdGVyUHJlcHJvY2Vzc29yKGkoMzMwKSksaSg5NCkoIm1hcCIsW3t0eXBlOiJtYXBUb2dnbGVTZWxlY3QiLGV2ZW50OiJtYXBzZWxlY3RjaGFuZ2VkIixtZXRob2Q6InRvZ2dsZVNlbGVjdGVkIn0se3R5cGU6Im1hcFNlbGVjdCIsZXZlbnQ6Im1hcHNlbGVjdGVkIixtZXRob2Q6InNlbGVjdCJ9LHt0eXBlOiJtYXBVblNlbGVjdCIsZXZlbnQ6Im1hcHVuc2VsZWN0ZWQiLG1ldGhvZDoidW5TZWxlY3QifV0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxNCksYT1pKDE3KSxvPWkoMSkscj1pKDI1KSxzPWkoNyksbD1zLmVuY29kZUhUTUwsdT1zLmFkZENvbW1hcyxoPWkoODMpLGM9aSgxOTIpLGQ9YS5leHRlbmQoe3R5cGU6InNlcmllcy5tYXAiLGRlcGVuZGVuY2llczpbImdlbyJdLGxheW91dE1vZGU6ImJveCIsbmVlZHNEcmF3TWFwOiExLHNlcmllc0dyb3VwOltdLGluaXQ6ZnVuY3Rpb24odCl7dD10aGlzLl9maWxsT3B0aW9uKHQsdGhpcy5nZXRNYXBUeXBlKCkpLHRoaXMub3B0aW9uPXQsZC5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyksdGhpcy51cGRhdGVTZWxlY3RlZE1hcCh0LmRhdGEpfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0KXt2YXIgZT1yKFsidmFsdWUiXSx0LmRhdGF8fFtdKSxpPW5ldyBuKGUsdGhpcyk7cmV0dXJuIGkuaW5pdERhdGEodC5kYXRhKSxpfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0KXt0LmRhdGEmJih0PXRoaXMuX2ZpbGxPcHRpb24odCx0aGlzLmdldE1hcFR5cGUoKSkpLGQuc3VwZXJDYWxsKHRoaXMsIm1lcmdlT3B0aW9uIix0KSx0aGlzLnVwZGF0ZVNlbGVjdGVkTWFwKHRoaXMub3B0aW9uLmRhdGEpfSxnZXRIb3N0R2VvTW9kZWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbi5nZW9JbmRleDtyZXR1cm4gbnVsbCE9dD90aGlzLmRlcGVuZGVudE1vZGVscy5nZW9bdF06bnVsbH0sZ2V0TWFwVHlwZTpmdW5jdGlvbigpe3JldHVybih0aGlzLmdldEhvc3RHZW9Nb2RlbCgpfHx0aGlzKS5vcHRpb24ubWFwfSxfZmlsbE9wdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0PW8uZXh0ZW5kKHt9LHQpLHQuZGF0YT1jLmdldEZpbGxlZFJlZ2lvbnModC5kYXRhLGUsdC5uYW1lTWFwKSx0fSxnZXRSYXdWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXREYXRhKCkuZ2V0KCJ2YWx1ZSIsdCl9LGdldFJlZ2lvbk1vZGVsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpO3JldHVybiBlLmdldEl0ZW1Nb2RlbChlLmluZGV4T2ZOYW1lKHQpKX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5nZXREYXRhKCksaT11KHRoaXMuZ2V0UmF3VmFsdWUodCkpLG49ZS5nZXROYW1lKHQpLGE9dGhpcy5zZXJpZXNHcm91cCxvPVtdLHI9MDtyPGEubGVuZ3RoO3IrKyl7dmFyIHM9YVtyXS5vcmlnaW5hbERhdGEuaW5kZXhPZk5hbWUobik7aXNOYU4oYVtyXS5vcmlnaW5hbERhdGEuZ2V0KCJ2YWx1ZSIscykpfHxvLnB1c2gobChhW3JdLm5hbWUpKX1yZXR1cm4gby5qb2luKCIsICIpKyI8YnIgLz4iK2wobisiIDogIitpKX0sZ2V0VG9vbHRpcFBvc2l0aW9uOmZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpLmdldE5hbWUodCksaT10aGlzLmNvb3JkaW5hdGVTeXN0ZW0sbj1pLmdldFJlZ2lvbihlKTtyZXR1cm4gbiYmaS5kYXRhVG9Qb2ludChuLmNlbnRlcil9fSxzZXRab29tOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9uLnpvb209dH0sc2V0Q2VudGVyOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9uLmNlbnRlcj10fSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToiZ2VvIixtYXA6IiIsbGVmdDoiY2VudGVyIix0b3A6ImNlbnRlciIsYXNwZWN0U2NhbGU6Ljc1LHNob3dMZWdlbmRTeW1ib2w6ITAsZGF0YVJhbmdlSG92ZXJMaW5rOiEwLGJvdW5kaW5nQ29vcmRzOm51bGwsY2VudGVyOm51bGwsem9vbToxLHNjYWxlTGltaXQ6bnVsbCxsYWJlbDp7bm9ybWFsOntzaG93OiExLGNvbG9yOiIjMDAwIn0sZW1waGFzaXM6e3Nob3c6ITAsY29sb3I6InJnYigxMDAsMCwwKSJ9fSxpdGVtU3R5bGU6e25vcm1hbDp7Ym9yZGVyV2lkdGg6LjUsYm9yZGVyQ29sb3I6IiM0NDQiLGFyZWFDb2xvcjoiI2VlZSJ9LGVtcGhhc2lzOnthcmVhQ29sb3I6InJnYmEoMjU1LDIxNSwwLDAuOCkifX19fSk7by5taXhpbihkLGgpLHQuZXhwb3J0cz1kfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgzKSxhPWkoMSksbz1pKDI1Nyk7aSgyKS5leHRlbmRDaGFydFZpZXcoe3R5cGU6Im1hcCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKCFufHwibWFwVG9nZ2xlU2VsZWN0IiE9PW4udHlwZXx8bi5mcm9tIT09dGhpcy51aWQpe3ZhciBhPXRoaXMuZ3JvdXA7aWYoYS5yZW1vdmVBbGwoKSwhdC5nZXRIb3N0R2VvTW9kZWwoKSl7aWYobiYmImdlb1JvYW0iPT09bi50eXBlJiYic2VyaWVzIj09PW4uY29tcG9uZW50VHlwZSYmbi5zZXJpZXNJZD09PXQuaWQpe3ZhciByPXRoaXMuX21hcERyYXc7ciYmYS5hZGQoci5ncm91cCl9ZWxzZSBpZih0Lm5lZWRzRHJhd01hcCl7dmFyIHI9dGhpcy5fbWFwRHJhd3x8bmV3IG8oaSwhMCk7YS5hZGQoci5ncm91cCksci5kcmF3KHQsZSxpLHRoaXMsbiksdGhpcy5fbWFwRHJhdz1yfWVsc2UgdGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKSx0aGlzLl9tYXBEcmF3PW51bGw7dC5nZXQoInNob3dMZWdlbmRTeW1ib2wiKSYmZS5nZXRDb21wb25lbnQoImxlZ2VuZCIpJiZ0aGlzLl9yZW5kZXJTeW1ib2xzKHQsZSxpKX19fSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9tYXBEcmF3JiZ0aGlzLl9tYXBEcmF3LnJlbW92ZSgpLHRoaXMuX21hcERyYXc9bnVsbCx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKSx0aGlzLl9tYXBEcmF3PW51bGx9LF9yZW5kZXJTeW1ib2xzOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10Lm9yaWdpbmFsRGF0YSxyPXRoaXMuZ3JvdXA7by5lYWNoKCJ2YWx1ZSIsZnVuY3Rpb24oZSxpKXtpZighaXNOYU4oZSkpe3ZhciBzPW8uZ2V0SXRlbUxheW91dChpKTtpZihzJiZzLnBvaW50KXt2YXIgbD1zLnBvaW50LHU9cy5vZmZzZXQsaD1uZXcgbi5DaXJjbGUoe3N0eWxlOntmaWxsOnQuZ2V0RGF0YSgpLmdldFZpc3VhbCgiY29sb3IiKX0sc2hhcGU6e2N4OmxbMF0rOSp1LGN5OmxbMV0scjozfSxzaWxlbnQ6ITAsejI6dT84OjEwfSk7aWYoIXUpe3ZhciBjPXQubWFpblNlcmllcy5nZXREYXRhKCksZD1vLmdldE5hbWUoaSksZj1jLmluZGV4T2ZOYW1lKGQpLHA9by5nZXRJdGVtTW9kZWwoaSksZz1wLmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSxtPXAuZ2V0TW9kZWwoImxhYmVsLmVtcGhhc2lzIiksdj1jLmdldEl0ZW1HcmFwaGljRWwoZikseT1hLnJldHJpZXZlMih0LmdldEZvcm1hdHRlZExhYmVsKGksIm5vcm1hbCIpLGQpLHg9YS5yZXRyaWV2ZTIodC5nZXRGb3JtYXR0ZWRMYWJlbChpLCJlbXBoYXNpcyIpLHkpLF89ZnVuY3Rpb24oKXt2YXIgdD1uLnNldFRleHRTdHlsZSh7fSxtLHt0ZXh0Om0uZ2V0KCJzaG93Iik/eDpudWxsfSx7aXNSZWN0VGV4dDohMCx1c2VJbnNpZGVTdHlsZTohMX0sITApO2guc3R5bGUuZXh0ZW5kRnJvbSh0KSxoLl9fbWFwT3JpZ2luYWxaMj1oLnoyLGguejIrPTF9LGI9ZnVuY3Rpb24oKXtuLnNldFRleHRTdHlsZShoLnN0eWxlLGcse3RleHQ6Zy5nZXQoInNob3ciKT95Om51bGwsdGV4dFBvc2l0aW9uOmcuZ2V0U2hhbGxvdygicG9zaXRpb24iKXx8ImJvdHRvbSJ9LHtpc1JlY3RUZXh0OiEwLHVzZUluc2lkZVN0eWxlOiExfSksbnVsbCE9aC5fX21hcE9yaWdpbmFsWjImJihoLnoyPWguX19tYXBPcmlnaW5hbFoyLGguX19tYXBPcmlnaW5hbFoyPW51bGwpfTt2Lm9uKCJtb3VzZW92ZXIiLF8pLm9uKCJtb3VzZW91dCIsYikub24oImVtcGhhc2lzIixfKS5vbigibm9ybWFsIixiKSxiKCl9ci5hZGQoaCl9fX0pfX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9W107bi5lYWNoKHQuc2VyaWVzLGZ1bmN0aW9uKHQpeyJtYXAiPT09dC50eXBlJiZlLnB1c2godCl9KSxuLmVhY2goZSxmdW5jdGlvbih0KXt0Lm1hcD10Lm1hcHx8dC5tYXBUeXBlLG4uZGVmYXVsdHModCx0Lm1hcExvY2F0aW9uKX0pfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXt2YXIgaT17fSxuPVsidmFsdWUiXTtyZXR1cm4gYS5lYWNoKHQsZnVuY3Rpb24odCl7dC5lYWNoKG4sZnVuY3Rpb24oZSxuKXt2YXIgYT0iZWMtIit0LmdldE5hbWUobik7aVthXT1pW2FdfHxbXSxpc05hTihlKXx8aVthXS5wdXNoKGUpfSl9KSx0WzBdLm1hcChuLGZ1bmN0aW9uKG4sYSl7Zm9yKHZhciBvPSJlYy0iK3RbMF0uZ2V0TmFtZShhKSxyPTAscz0xLzAsbD0tKDEvMCksdT1pW29dLmxlbmd0aCxoPTA7aDx1O2grKylzPU1hdGgubWluKHMsaVtvXVtoXSksbD1NYXRoLm1heChsLGlbb11baF0pLHIrPWlbb11baF07dmFyIGM7cmV0dXJuIGM9Im1pbiI9PT1lP3M6Im1heCI9PT1lP2w6ImF2ZXJhZ2UiPT09ZT9yL3U6ciwwPT09dT9OYU46Y30pfXZhciBhPWkoMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3QuZWFjaFNlcmllc0J5VHlwZSgibWFwIixmdW5jdGlvbih0KXt2YXIgaT10LmdldEhvc3RHZW9Nb2RlbCgpLG49aT8ibyIraS5pZDoiaSIrdC5nZXRNYXBUeXBlKCk7KGVbbl09ZVtuXXx8W10pLnB1c2godCl9KSxhLmVhY2goZSxmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1uKGEubWFwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0YSgpfSksdFswXS5nZXQoIm1hcFZhbHVlQ2FsY3VsYXRpb24iKSksbz0wO288dC5sZW5ndGg7bysrKXRbb10ub3JpZ2luYWxEYXRhPXRbb10uZ2V0RGF0YSgpO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXRbb10uc2VyaWVzR3JvdXA9dCx0W29dLm5lZWRzRHJhd01hcD0wPT09byYmIXRbb10uZ2V0SG9zdEdlb01vZGVsKCksdFtvXS5zZXREYXRhKGkuY2xvbmVTaGFsbG93KCkpLHRbb10ubWFpblNlcmllcz10WzBdfSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9e307dC5lYWNoU2VyaWVzQnlUeXBlKCJtYXAiLGZ1bmN0aW9uKGkpe3ZhciBhPWkuZ2V0TWFwVHlwZSgpO2lmKCFpLmdldEhvc3RHZW9Nb2RlbCgpJiYhZVthXSl7dmFyIG89e307bi5lYWNoKGkuc2VyaWVzR3JvdXAsZnVuY3Rpb24oZSl7dmFyIGk9ZS5jb29yZGluYXRlU3lzdGVtLG49ZS5vcmlnaW5hbERhdGE7ZS5nZXQoInNob3dMZWdlbmRTeW1ib2wiKSYmdC5nZXRDb21wb25lbnQoImxlZ2VuZCIpJiZuLmVhY2goInZhbHVlIixmdW5jdGlvbih0LGUpe3ZhciBhPW4uZ2V0TmFtZShlKSxyPWkuZ2V0UmVnaW9uKGEpO2lmKHImJiFpc05hTih0KSl7dmFyIHM9b1thXXx8MCxsPWkuZGF0YVRvUG9pbnQoci5jZW50ZXIpO29bYV09cysxLG4uc2V0SXRlbUxheW91dChlLHtwb2ludDpsLG9mZnNldDpzfSl9fSl9KTt2YXIgcj1pLmdldERhdGEoKTtyLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9ci5nZXROYW1lKHQpLGk9ci5nZXRJdGVtTGF5b3V0KHQpfHx7fTtpLnNob3dMYWJlbD0hb1tlXSxyLnNldEl0ZW1MYXlvdXQodCxpKX0pLGVbYV09ITB9fSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0LmVhY2hTZXJpZXNCeVR5cGUoIm1hcCIsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXQoImNvbG9yIiksaT10LmdldE1vZGVsKCJpdGVtU3R5bGUubm9ybWFsIiksbj1pLmdldCgiYXJlYUNvbG9yIiksYT1pLmdldCgiY29sb3IiKXx8ZVt0LnNlcmllc0luZGV4JWUubGVuZ3RoXTt0LmdldERhdGEoKS5zZXRWaXN1YWwoe2FyZWFDb2xvcjpuLGNvbG9yOmF9KX0pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMik7aSgyNTkpLGkoMzM1KSxpKDMzNiksbi5yZWdpc3RlclZpc3VhbChpKDMzNykpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49dC5nZXQoImRhdGEiKSxvPWEoZSk7biYmbi5sZW5ndGgmJnMuZWFjaChpLGZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXMuaW5kZXhPZihuLHRbb10pO3Rbb109ZT49MD9lOk5hTn19KX1mdW5jdGlvbiBhKHQpe3JldHVybit0LnJlcGxhY2UoImRpbSIsIiIpfWZ1bmN0aW9uIG8odCxlKXt2YXIgaT0wO3MuZWFjaCh0LGZ1bmN0aW9uKHQpe3ZhciBlPWEodCk7ZT5pJiYoaT1lKX0pO3ZhciBuPWVbMF07biYmbi5sZW5ndGgtMT5pJiYoaT1uLmxlbmd0aC0xKTtmb3IodmFyIG89W10scj0wO3I8PWk7cisrKW8ucHVzaCgiZGltIityKTtyZXR1cm4gb312YXIgcj1pKDE0KSxzPWkoMSksbD1pKDE3KSx1PWkoMjUpO3QuZXhwb3J0cz1sLmV4dGVuZCh7dHlwZToic2VyaWVzLnBhcmFsbGVsIixkZXBlbmRlbmNpZXM6WyJwYXJhbGxlbCJdLHZpc3VhbENvbG9yQWNjZXNzUGF0aDoibGluZVN0eWxlLm5vcm1hbC5jb2xvciIsZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldENvbXBvbmVudCgicGFyYWxsZWwiLHRoaXMuZ2V0KCJwYXJhbGxlbEluZGV4IikpLGE9aS5wYXJhbGxlbEF4aXNJbmRleCxsPXQuZGF0YSxoPWkuZGltZW5zaW9ucyxjPW8oaCxsKSxkPXMubWFwKGMsZnVuY3Rpb24odCxpKXt2YXIgbz1zLmluZGV4T2YoaCx0KSxyPW8+PTAmJmUuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbEF4aXMiLGFbb10pO3JldHVybiByJiYiY2F0ZWdvcnkiPT09ci5nZXQoInR5cGUiKT8obihyLHQsbCkse25hbWU6dCx0eXBlOiJvcmRpbmFsIn0pOm88MCYmdS5ndWVzc09yZGluYWwobCxpKT97bmFtZTp0LHR5cGU6Im9yZGluYWwifTp0fSksZj1uZXcgcihkLHRoaXMpO3JldHVybiBmLmluaXREYXRhKGwpLHRoaXMub3B0aW9uLnByb2dyZXNzaXZlJiYodGhpcy5vcHRpb24uYW5pbWF0aW9uPSExKSxmfSxnZXRSYXdJbmRpY2VzQnlBY3RpdmVTdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvb3JkaW5hdGVTeXN0ZW0saT10aGlzLmdldERhdGEoKSxuPVtdO3JldHVybiBlLmVhY2hBY3RpdmVTdGF0ZShpLGZ1bmN0aW9uKGUsYSl7dD09PWUmJm4ucHVzaChpLmdldFJhd0luZGV4KGEpKX0pLG59LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6Mixjb29yZGluYXRlU3lzdGVtOiJwYXJhbGxlbCIscGFyYWxsZWxJbmRleDowLGxhYmVsOntub3JtYWw6e3Nob3c6ITF9LGVtcGhhc2lzOntzaG93OiExfX0saW5hY3RpdmVPcGFjaXR5Oi4wNSxhY3RpdmVPcGFjaXR5OjEsbGluZVN0eWxlOntub3JtYWw6e3dpZHRoOjEsb3BhY2l0eTouNDUsdHlwZToic29saWQifX0scHJvZ3Jlc3NpdmU6ITEsc21vb3RoOiExLGFuaW1hdGlvbkVhc2luZzoibGluZWFyIn19KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3ZhciBuPXQubW9kZWwsYT10LmdldFJlY3QoKSxvPW5ldyBsLlJlY3Qoe3NoYXBlOnt4OmEueCx5OmEueSx3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH19KSxyPSJob3Jpem9udGFsIj09PW4uZ2V0KCJsYXlvdXQiKT8id2lkdGgiOiJoZWlnaHQiO3JldHVybiBvLnNldFNoYXBlKHIsMCksbC5pbml0UHJvcHMobyx7c2hhcGU6e3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fX0sZSxpKSxvfWZ1bmN0aW9uIGEodCxlLGksbil7Zm9yKHZhciBhPVtdLG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHI9aVtvXSxsPXQuZ2V0KHIsZSk7cyhsLG4uZ2V0QXhpcyhyKS50eXBlKXx8YS5wdXNoKG4uZGF0YVRvUG9pbnQobCxyKSl9cmV0dXJuIGF9ZnVuY3Rpb24gbyh0LGUsaSxuLG8pe3ZhciByPWEodCxpLG4sbykscz1uZXcgbC5Qb2x5bGluZSh7c2hhcGU6e3BvaW50czpyfSxzaWxlbnQ6ITAsejI6MTB9KTtlLmFkZChzKSx0LnNldEl0ZW1HcmFwaGljRWwoaSxzKX1mdW5jdGlvbiByKHQsZSl7dmFyIGk9dC5ob3N0TW9kZWwuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKSxuPWkuZ2V0TGluZVN0eWxlKCk7dC5lYWNoSXRlbUdyYXBoaWNFbChmdW5jdGlvbihhLG8pe2lmKHQuaGFzSXRlbU9wdGlvbil7dmFyIHI9dC5nZXRJdGVtTW9kZWwobykscz1yLmdldE1vZGVsKCJsaW5lU3R5bGUubm9ybWFsIixpKTtuPXMuZ2V0TGluZVN0eWxlKFsiY29sb3IiLCJzdHJva2UiXSl9YS51c2VTdHlsZSh1LmV4dGVuZChuLHtmaWxsOm51bGwsc3Ryb2tlOnQuZ2V0SXRlbVZpc3VhbChvLCJjb2xvciIpLG9wYWNpdHk6dC5nZXRJdGVtVmlzdWFsKG8sIm9wYWNpdHkiKX0pKSxhLnNoYXBlLnNtb290aD1lfSl9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiJjYXRlZ29yeSI9PT1lP251bGw9PXQ6bnVsbD09dHx8aXNOYU4odCl9dmFyIGw9aSgzKSx1PWkoMSksaD0uMyxjPWkoMzApLmV4dGVuZCh7dHlwZToicGFyYWxsZWwiLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhR3JvdXA9bmV3IGwuR3JvdXAsdGhpcy5ncm91cC5hZGQodGhpcy5fZGF0YUdyb3VwKSx0aGlzLl9kYXRhfSxyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7dGhpcy5fcmVuZGVyRm9yTm9ybWFsKHQsbil9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9LF9yZW5kZXJGb3JOb3JtYWw6ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe28oZCxjLHQsZyxwLG51bGwsdil9ZnVuY3Rpb24gcyhpLG4pe3ZhciBvPWYuZ2V0SXRlbUdyYXBoaWNFbChuKSxyPWEoZCxpLGcscCk7ZC5zZXRJdGVtR3JhcGhpY0VsKGksbyk7dmFyIHM9ZSYmZS5hbmltYXRpb249PT0hMT9udWxsOnQ7bC51cGRhdGVQcm9wcyhvLHtzaGFwZTp7cG9pbnRzOnJ9fSxzLGkpfWZ1bmN0aW9uIHUodCl7dmFyIGU9Zi5nZXRJdGVtR3JhcGhpY0VsKHQpO2MucmVtb3ZlKGUpfXZhciBjPXRoaXMuX2RhdGFHcm91cCxkPXQuZ2V0RGF0YSgpLGY9dGhpcy5fZGF0YSxwPXQuY29vcmRpbmF0ZVN5c3RlbSxnPXAuZGltZW5zaW9ucyxtPXQub3B0aW9uLHY9bS5zbW9vdGg/aDpudWxsO2lmKGQuZGlmZihmKS5hZGQoaSkudXBkYXRlKHMpLnJlbW92ZSh1KS5leGVjdXRlKCkscihkLHYpLCF0aGlzLl9kYXRhKXt2YXIgeT1uKHAsdCxmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLnJlbW92ZUNsaXBQYXRoKCl9KX0pO2Muc2V0Q2xpcFBhdGgoeSl9dGhpcy5fZGF0YT1kfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhR3JvdXAmJnRoaXMuX2RhdGFHcm91cC5yZW1vdmVBbGwoKSx0aGlzLl9kYXRhPW51bGx9fSk7dC5leHBvcnRzPWN9LGZ1bmN0aW9uKHQsZSl7dmFyIGk9WyJsaW5lU3R5bGUiLCJub3JtYWwiLCJvcGFjaXR5Il07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgicGFyYWxsZWwiLGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0TW9kZWwoIml0ZW1TdHlsZS5ub3JtYWwiKSxhPWUuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKSxvPXQuZ2V0KCJjb2xvciIpLHI9YS5nZXQoImNvbG9yIil8fG4uZ2V0KCJjb2xvciIpfHxvW2Uuc2VyaWVzSW5kZXglby5sZW5ndGhdLHM9ZS5nZXQoImluYWN0aXZlT3BhY2l0eSIpLGw9ZS5nZXQoImFjdGl2ZU9wYWNpdHkiKSx1PWUuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKS5nZXRMaW5lU3R5bGUoKSxoPWUuY29vcmRpbmF0ZVN5c3RlbSxjPWUuZ2V0RGF0YSgpLGQ9e25vcm1hbDp1Lm9wYWNpdHksYWN0aXZlOmwsaW5hY3RpdmU6c307aC5lYWNoQWN0aXZlU3RhdGUoYyxmdW5jdGlvbih0LGUpe3ZhciBuPWMuZ2V0SXRlbU1vZGVsKGUpLGE9ZFt0XTtpZigibm9ybWFsIj09PXQpe3ZhciBvPW4uZ2V0KGksITApO251bGwhPW8mJihhPW8pfWMuc2V0SXRlbVZpc3VhbChlLCJvcGFjaXR5IixhKX0pLGMuc2V0VmlzdWFsKCJjb2xvciIscil9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpO2koNjApLGkoMjc2KSxpKDI3Nyk7dmFyIGE9aSg4Nyksbz1pKDIpO28ucmVnaXN0ZXJMYXlvdXQobi5jdXJyeShhLCJwaWN0b3JpYWxCYXIiKSksby5yZWdpc3RlclZpc3VhbChuLmN1cnJ5KGkoNTEpLCJwaWN0b3JpYWxCYXIiLCJyb3VuZFJlY3QiLG51bGwpKSxpKDMyKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT1pKDIpO2koMzgyKSxpKDM0MCksaSgzNDEpLGEucmVnaXN0ZXJWaXN1YWwobi5jdXJyeShpKDg5KSwicmFkYXIiKSksYS5yZWdpc3RlclZpc3VhbChuLmN1cnJ5KGkoNTEpLCJyYWRhciIsImNpcmNsZSIsbnVsbCkpLGEucmVnaXN0ZXJMYXlvdXQoaSgzNDMpKSxhLnJlZ2lzdGVyUHJvY2Vzc29yKG4uY3VycnkoaSg2NiksInJhZGFyIikpLGEucmVnaXN0ZXJQcmVwcm9jZXNzb3IoaSgzNDIpKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDE3KSxhPWkoMTQpLG89aSgyNSkscj1pKDEpLHM9aSg3KS5lbmNvZGVIVE1MLGw9bi5leHRlbmQoe3R5cGU6InNlcmllcy5yYWRhciIsZGVwZW5kZW5jaWVzOlsicmFkYXIiXSxpbml0OmZ1bmN0aW9uKHQpe2wuc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLHRoaXMubGVnZW5kRGF0YVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3RGF0YSgpfX0sZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmRhdGF8fFtdLG49byhbXSxpLHtleHRyYVByZWZpeDoiaW5kaWNhdG9yXyIsZXh0cmFGcm9tWmVybzohMH0pLHI9bmV3IGEobix0aGlzKTtyZXR1cm4gci5pbml0RGF0YShpKSxyfSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UmF3VmFsdWUodCksaT10aGlzLmNvb3JkaW5hdGVTeXN0ZW0sbj1pLmdldEluZGljYXRvckF4ZXMoKSxhPXRoaXMuZ2V0RGF0YSgpLmdldE5hbWUodCk7cmV0dXJuIHMoIiI9PT1hP3RoaXMubmFtZTphKSsiPGJyLz4iK3IubWFwKG4sZnVuY3Rpb24odCxpKXtyZXR1cm4gcyh0Lm5hbWUrIiA6ICIrZVtpXSl9KS5qb2luKCI8YnIgLz4iKX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06InJhZGFyIixsZWdlbmRIb3Zlckxpbms6ITAscmFkYXJJbmRleDowLGxpbmVTdHlsZTp7bm9ybWFsOnt3aWR0aDoyLHR5cGU6InNvbGlkIn19LGxhYmVsOntub3JtYWw6e3Bvc2l0aW9uOiJ0b3AifX0sc3ltYm9sOiJlbXB0eUNpcmNsZSIsc3ltYm9sU2l6ZTo0fX0pO3QuZXhwb3J0cz1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gby5pc0FycmF5KHQpfHwodD1bK3QsK3RdKSx0fXZhciBhPWkoMyksbz1pKDEpLHI9aSgyNCk7dC5leHBvcnRzPWkoMikuZXh0ZW5kQ2hhcnRWaWV3KHt0eXBlOiJyYWRhciIscmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBzKHQsZSl7dmFyIGk9dC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbCIpfHwiY2lyY2xlIixhPXQuZ2V0SXRlbVZpc3VhbChlLCJjb2xvciIpO2lmKCJub25lIiE9PWkpe3ZhciBvPW4odC5nZXRJdGVtVmlzdWFsKGUsInN5bWJvbFNpemUiKSkscz1yLmNyZWF0ZVN5bWJvbChpLC0xLC0xLDIsMixhKTtyZXR1cm4gcy5hdHRyKHtzdHlsZTp7c3Ryb2tlTm9TY2FsZTohMH0sejI6MTAwLHNjYWxlOltvWzBdLzIsb1sxXS8yXX0pLHN9fWZ1bmN0aW9uIGwoZSxpLG4sbyxyLGwpe24ucmVtb3ZlQWxsKCk7Zm9yKHZhciB1PTA7dTxpLmxlbmd0aC0xO3UrKyl7dmFyIGg9cyhvLHIpO2gmJihoLl9fZGltSWR4PXUsZVt1XT8oaC5hdHRyKCJwb3NpdGlvbiIsZVt1XSksYVtsPyJpbml0UHJvcHMiOiJ1cGRhdGVQcm9wcyJdKGgse3Bvc2l0aW9uOmlbdV19LHQscikpOmguYXR0cigicG9zaXRpb24iLGlbdV0pLG4uYWRkKGgpKX19ZnVuY3Rpb24gdSh0KXtyZXR1cm4gby5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm5baC5jeCxoLmN5XX0pfXZhciBoPXQuY29vcmRpbmF0ZVN5c3RlbSxjPXRoaXMuZ3JvdXAsZD10LmdldERhdGEoKSxmPXRoaXMuX2RhdGE7ZC5kaWZmKGYpLmFkZChmdW5jdGlvbihlKXt2YXIgaT1kLmdldEl0ZW1MYXlvdXQoZSk7aWYoaSl7dmFyIG49bmV3IGEuUG9seWdvbixvPW5ldyBhLlBvbHlsaW5lLHI9e3NoYXBlOntwb2ludHM6aX19O24uc2hhcGUucG9pbnRzPXUoaSksby5zaGFwZS5wb2ludHM9dShpKSxhLmluaXRQcm9wcyhuLHIsdCxlKSxhLmluaXRQcm9wcyhvLHIsdCxlKTt2YXIgcz1uZXcgYS5Hcm91cCxoPW5ldyBhLkdyb3VwO3MuYWRkKG8pLHMuYWRkKG4pLHMuYWRkKGgpLGwoby5zaGFwZS5wb2ludHMsaSxoLGQsZSwhMCksZC5zZXRJdGVtR3JhcGhpY0VsKGUscyl9fSkudXBkYXRlKGZ1bmN0aW9uKGUsaSl7dmFyIG49Zi5nZXRJdGVtR3JhcGhpY0VsKGkpLG89bi5jaGlsZEF0KDApLHI9bi5jaGlsZEF0KDEpLHM9bi5jaGlsZEF0KDIpLHU9e3NoYXBlOntwb2ludHM6ZC5nZXRJdGVtTGF5b3V0KGUpfX07dS5zaGFwZS5wb2ludHMmJihsKG8uc2hhcGUucG9pbnRzLHUuc2hhcGUucG9pbnRzLHMsZCxlLCExKSxhLnVwZGF0ZVByb3BzKG8sdSx0KSxhLnVwZGF0ZVByb3BzKHIsdSx0KSxkLnNldEl0ZW1HcmFwaGljRWwoZSxuKSl9KS5yZW1vdmUoZnVuY3Rpb24odCl7Yy5yZW1vdmUoZi5nZXRJdGVtR3JhcGhpY0VsKHQpKX0pLmV4ZWN1dGUoKSxkLmVhY2hJdGVtR3JhcGhpY0VsKGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe2wuYXR0cigiaWdub3JlIixtKX1mdW5jdGlvbiBuKCl7bC5hdHRyKCJpZ25vcmUiLGcpfXZhciByPWQuZ2V0SXRlbU1vZGVsKGUpLHM9dC5jaGlsZEF0KDApLGw9dC5jaGlsZEF0KDEpLHU9dC5jaGlsZEF0KDIpLGg9ZC5nZXRJdGVtVmlzdWFsKGUsImNvbG9yIik7Yy5hZGQodCkscy51c2VTdHlsZShvLmRlZmF1bHRzKHIuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKS5nZXRMaW5lU3R5bGUoKSx7ZmlsbDoibm9uZSIsc3Ryb2tlOmh9KSkscy5ob3ZlclN0eWxlPXIuZ2V0TW9kZWwoImxpbmVTdHlsZS5lbXBoYXNpcyIpLmdldExpbmVTdHlsZSgpO3ZhciBmPXIuZ2V0TW9kZWwoImFyZWFTdHlsZS5ub3JtYWwiKSxwPXIuZ2V0TW9kZWwoImFyZWFTdHlsZS5lbXBoYXNpcyIpLGc9Zi5pc0VtcHR5KCkmJmYucGFyZW50TW9kZWwuaXNFbXB0eSgpLG09cC5pc0VtcHR5KCkmJnAucGFyZW50TW9kZWwuaXNFbXB0eSgpO209bSYmZyxsLmlnbm9yZT1nLGwudXNlU3R5bGUoby5kZWZhdWx0cyhmLmdldEFyZWFTdHlsZSgpLHtmaWxsOmgsb3BhY2l0eTouN30pKSxsLmhvdmVyU3R5bGU9cC5nZXRBcmVhU3R5bGUoKTt2YXIgdj1yLmdldE1vZGVsKCJpdGVtU3R5bGUubm9ybWFsIikuZ2V0SXRlbVN0eWxlKFsiY29sb3IiXSkseT1yLmdldE1vZGVsKCJpdGVtU3R5bGUuZW1waGFzaXMiKS5nZXRJdGVtU3R5bGUoKSx4PXIuZ2V0TW9kZWwoImxhYmVsLm5vcm1hbCIpLF89ci5nZXRNb2RlbCgibGFiZWwuZW1waGFzaXMiKTt1LmVhY2hDaGlsZChmdW5jdGlvbih0KXt0LnNldFN0eWxlKHYpLHQuaG92ZXJTdHlsZT1vLmNsb25lKHkpLGEuc2V0TGFiZWxTdHlsZSh0LnN0eWxlLHQuaG92ZXJTdHlsZSx4LF8se2xhYmVsRmV0Y2hlcjpkLmhvc3RNb2RlbCxsYWJlbERhdGFJbmRleDplLGxhYmVsRGltSW5kZXg6dC5fX2RpbUlkeCxkZWZhdWx0VGV4dDpkLmdldChkLmRpbWVuc2lvbnNbdC5fX2RpbUlkeF0sZSksYXV0b0NvbG9yOmgsaXNSZWN0VGV4dDohMH0pfSksdC5vZmYoIm1vdXNlb3ZlciIpLm9mZigibW91c2VvdXQiKS5vZmYoIm5vcm1hbCIpLm9mZigiZW1waGFzaXMiKSx0Lm9uKCJlbXBoYXNpcyIsaSkub24oIm1vdXNlb3ZlciIsaSkub24oIm5vcm1hbCIsbikub24oIm1vdXNlb3V0IixuKSxhLnNldEhvdmVyU3R5bGUodCl9KSx0aGlzLl9kYXRhPWR9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdGhpcy5fZGF0YT1udWxsfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5wb2xhcjtpZihlKXtuLmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9W107bi5lYWNoKGUsZnVuY3Rpb24oZSxhKXtlLmluZGljYXRvcj8oZS50eXBlJiYhZS5zaGFwZSYmKGUuc2hhcGU9ZS50eXBlKSx0LnJhZGFyPXQucmFkYXJ8fFtdLG4uaXNBcnJheSh0LnJhZGFyKXx8KHQucmFkYXI9W3QucmFkYXJdKSx0LnJhZGFyLnB1c2goZSkpOmkucHVzaChlKX0pLHQucG9sYXI9aX1uLmVhY2godC5zZXJpZXMsZnVuY3Rpb24odCl7InJhZGFyIj09PXQudHlwZSYmdC5wb2xhckluZGV4JiYodC5yYWRhckluZGV4PXQucG9sYXJJbmRleCl9KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgicmFkYXIiLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlKXtuW2VdPW5bZV18fFtdLG5bZV1bb109YS5kYXRhVG9Qb2ludCh0LG8pfXZhciBpPXQuZ2V0RGF0YSgpLG49W10sYT10LmNvb3JkaW5hdGVTeXN0ZW07aWYoYSl7Zm9yKHZhciBvPTA7bzxhLmdldEluZGljYXRvckF4ZXMoKS5sZW5ndGg7bysrKXt2YXIgcj1pLmRpbWVuc2lvbnNbb107aS5lYWNoKHIsZSl9aS5lYWNoKGZ1bmN0aW9uKHQpe25bdF1bMF0mJm5bdF0ucHVzaChuW3RdWzBdLnNsaWNlKCkpLGkuc2V0SXRlbUxheW91dCh0LG5bdF0pfSl9fSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyKTtpKDM0NSksaSgzNDYpLG4ucmVnaXN0ZXJMYXlvdXQoaSgzNDcpKSxuLnJlZ2lzdGVyVmlzdWFsKGkoMzQ4KSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDE3KSxhPWkoMjU1KSxvPWkoNykuZW5jb2RlSFRNTCxyPW4uZXh0ZW5kKHt0eXBlOiJzZXJpZXMuc2Fua2V5IixsYXlvdXRJbmZvOm51bGwsZ2V0SW5pdGlhbERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9dC5lZGdlc3x8dC5saW5rcyxpPXQuZGF0YXx8dC5ub2RlcztpZihpJiZlKXt2YXIgbj1hKGksZSx0aGlzLCEwKTtyZXR1cm4gbi5kYXRhfX0sZ2V0R3JhcGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREYXRhKCkuZ3JhcGh9LGdldEVkZ2VEYXRhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0R3JhcGgoKS5lZGdlRGF0YX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0LGUsaSl7aWYoImVkZ2UiPT09aSl7dmFyIG49dGhpcy5nZXREYXRhUGFyYW1zKHQsaSksYT1uLmRhdGEscz1hLnNvdXJjZSsiIC0tICIrYS50YXJnZXQ7cmV0dXJuIG4udmFsdWUmJihzKz0iIDogIituLnZhbHVlKSxvKHMpfXJldHVybiByLnN1cGVyQ2FsbCh0aGlzLCJmb3JtYXRUb29sdGlwIix0LGUpfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsY29vcmRpbmF0ZVN5c3RlbToidmlldyIsbGF5b3V0Om51bGwsbGVmdDoiNSUiLHRvcDoiNSUiLHJpZ2h0OiIyMCUiLGJvdHRvbToiNSUiLG5vZGVXaWR0aDoyMCxub2RlR2FwOjgsbGF5b3V0SXRlcmF0aW9uczozMixsYWJlbDp7bm9ybWFsOntzaG93OiEwLHBvc2l0aW9uOiJyaWdodCIsY29sb3I6IiMwMDAiLGZvbnRTaXplOjEyfSxlbXBoYXNpczp7c2hvdzohMH19LGl0ZW1TdHlsZTp7bm9ybWFsOntib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiIjMzMzIn19LGxpbmVTdHlsZTp7bm9ybWFsOntjb2xvcjoiIzMxNDY1NiIsb3BhY2l0eTouMixjdXJ2ZW5lc3M6LjV9LGVtcGhhc2lzOntvcGFjaXR5Oi42fX0sYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGFuaW1hdGlvbkR1cmF0aW9uOjFlM319KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3ZhciBuPW5ldyBhLlJlY3Qoe3NoYXBlOnt4OnQueC0xMCx5OnQueS0xMCx3aWR0aDowLGhlaWdodDp0LmhlaWdodCsyMH19KTtyZXR1cm4gYS5pbml0UHJvcHMobix7c2hhcGU6e3dpZHRoOnQud2lkdGgrMjAsaGVpZ2h0OnQuaGVpZ2h0KzIwfX0sZSxpKSxufXZhciBhPWkoMyksbz1hLmV4dGVuZFNoYXBlKHtzaGFwZTp7eDE6MCx5MTowLHgyOjAseTI6MCxjcHgxOjAsY3B5MTowLGNweDI6MCxjcHkyOjAsZXh0ZW50OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciBpPWUuZXh0ZW50LzI7dC5tb3ZlVG8oZS54MSxlLnkxLWkpLHQuYmV6aWVyQ3VydmVUbyhlLmNweDEsZS5jcHkxLWksZS5jcHgyLGUuY3B5Mi1pLGUueDIsZS55Mi1pKSx0LmxpbmVUbyhlLngyLGUueTIraSksdC5iZXppZXJDdXJ2ZVRvKGUuY3B4MixlLmNweTIraSxlLmNweDEsZS5jcHkxK2ksZS54MSxlLnkxK2kpLHQuY2xvc2VQYXRoKCl9fSk7dC5leHBvcnRzPWkoMikuZXh0ZW5kQ2hhcnRWaWV3KHt0eXBlOiJzYW5rZXkiLF9tb2RlbDpudWxsLHJlbmRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dC5nZXRHcmFwaCgpLHM9dGhpcy5ncm91cCxsPXQubGF5b3V0SW5mbyx1PXQuZ2V0RGF0YSgpLGg9dC5nZXREYXRhKCJlZGdlIik7dGhpcy5fbW9kZWw9dCxzLnJlbW92ZUFsbCgpLHMucG9zaXRpb249W2wueCxsLnldLHIuZWFjaEVkZ2UoZnVuY3Rpb24oZSl7dmFyIGk9bmV3IG87aS5kYXRhSW5kZXg9ZS5kYXRhSW5kZXgsaS5zZXJpZXNJbmRleD10LnNlcmllc0luZGV4LGkuZGF0YVR5cGU9ImVkZ2UiO3ZhciBuPWUuZ2V0TW9kZWwoImxpbmVTdHlsZS5ub3JtYWwiKSxyPW4uZ2V0KCJjdXJ2ZW5lc3MiKSxsPWUubm9kZTEuZ2V0TGF5b3V0KCksdT1lLm5vZGUyLmdldExheW91dCgpLGM9ZS5nZXRMYXlvdXQoKTtpLnNoYXBlLmV4dGVudD1NYXRoLm1heCgxLGMuZHkpO3ZhciBkPWwueCtsLmR4LGY9bC55K2Muc3krYy5keS8yLHA9dS54LGc9dS55K2MudHkrYy5keS8yLG09ZCooMS1yKStwKnIsdj1mLHk9ZCpyK3AqKDEtcikseD1nO3N3aXRjaChpLnNldFNoYXBlKHt4MTpkLHkxOmYseDI6cCx5MjpnLGNweDE6bSxjcHkxOnYsY3B4Mjp5LGNweTI6eH0pLGkuc2V0U3R5bGUobi5nZXRJdGVtU3R5bGUoKSksaS5zdHlsZS5maWxsKXtjYXNlInNvdXJjZSI6aS5zdHlsZS5maWxsPWUubm9kZTEuZ2V0VmlzdWFsKCJjb2xvciIpO2JyZWFrO2Nhc2UidGFyZ2V0IjppLnN0eWxlLmZpbGw9ZS5ub2RlMi5nZXRWaXN1YWwoImNvbG9yIil9YS5zZXRIb3ZlclN0eWxlKGksZS5nZXRNb2RlbCgibGluZVN0eWxlLmVtcGhhc2lzIikuZ2V0SXRlbVN0eWxlKCkpLHMuYWRkKGkpLGguc2V0SXRlbUdyYXBoaWNFbChlLmRhdGFJbmRleCxpKX0pLHIuZWFjaE5vZGUoZnVuY3Rpb24oZSl7dmFyIGk9ZS5nZXRMYXlvdXQoKSxuPWUuZ2V0TW9kZWwoKSxvPW4uZ2V0TW9kZWwoImxhYmVsLm5vcm1hbCIpLHI9bi5nZXRNb2RlbCgibGFiZWwuZW1waGFzaXMiKSxsPW5ldyBhLlJlY3Qoe3NoYXBlOnt4OmkueCx5OmkueSx3aWR0aDplLmdldExheW91dCgpLmR4LGhlaWdodDplLmdldExheW91dCgpLmR5fSxzdHlsZTpuLmdldE1vZGVsKCJpdGVtU3R5bGUubm9ybWFsIikuZ2V0SXRlbVN0eWxlKCl9KSxoPWUuZ2V0TW9kZWwoIml0ZW1TdHlsZS5lbXBoYXNpcyIpLmdldEl0ZW1TdHlsZSgpO2Euc2V0TGFiZWxTdHlsZShsLnN0eWxlLGgsbyxyLHtsYWJlbEZldGNoZXI6dCxsYWJlbERhdGFJbmRleDplLmRhdGFJbmRleCxkZWZhdWx0VGV4dDplLmlkLGlzUmVjdFRleHQ6ITB9KSxsLnNldFN0eWxlKCJmaWxsIixlLmdldFZpc3VhbCgiY29sb3IiKSksYS5zZXRIb3ZlclN0eWxlKGwsaCkscy5hZGQobCksdS5zZXRJdGVtR3JhcGhpY0VsKGUuZGF0YUluZGV4LGwpLGwuZGF0YVR5cGU9Im5vZGUifSksIXRoaXMuX2RhdGEmJnQuZ2V0KCJhbmltYXRpb24iKSYmcy5zZXRDbGlwUGF0aChuKHMuZ2V0Qm91bmRpbmdSZWN0KCksdCxmdW5jdGlvbigpe3MucmVtb3ZlQ2xpcFBhdGgoKX0pKSx0aGlzLl9kYXRhPXQuZ2V0RGF0YSgpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBNLmdldExheW91dFJlY3QodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSl9ZnVuY3Rpb24gYSh0LGUsaSxuLGEsbyxzKXtyKHQsaSxhKSx1KHQsZSxvLG4scyksbSh0KX1mdW5jdGlvbiBvKHQpe1QuZWFjaCh0LGZ1bmN0aW9uKHQpe3ZhciBlPXgodC5vdXRFZGdlcyxTKSxpPXgodC5pbkVkZ2VzLFMpLG49TWF0aC5tYXgoZSxpKTt0LnNldExheW91dCh7dmFsdWU6bn0sITApfSl9ZnVuY3Rpb24gcih0LGUsaSl7Zm9yKHZhciBuPXQsYT1udWxsLG89MCxyPTA7bi5sZW5ndGg7KXthPVtdO2Zvcih2YXIgdT0wLGg9bi5sZW5ndGg7dTxoO3UrKyl7dmFyIGM9blt1XTtjLnNldExheW91dCh7eDpvfSwhMCksYy5zZXRMYXlvdXQoe2R4OmV9LCEwKTtmb3IodmFyIGQ9MCxmPWMub3V0RWRnZXMubGVuZ3RoO2Q8ZjtkKyspYS5wdXNoKGMub3V0RWRnZXNbZF0ubm9kZTIpfW49YSwrK299cyh0LG8pLHI9KGktZSkvKG8tMSksbCh0LHIpfWZ1bmN0aW9uIHModCxlKXtULmVhY2godCxmdW5jdGlvbih0KXt0Lm91dEVkZ2VzLmxlbmd0aHx8dC5zZXRMYXlvdXQoe3g6ZS0xfSwhMCl9KX1mdW5jdGlvbiBsKHQsZSl7VC5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIGk9dC5nZXRMYXlvdXQoKS54KmU7dC5zZXRMYXlvdXQoe3g6aX0sITApfSl9ZnVuY3Rpb24gdSh0LGUsaSxuLGEpe3ZhciBvPUkoKS5rZXkoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TGF5b3V0KCkueH0pLnNvcnRLZXlzKHcpLmVudHJpZXModCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlc30pO2godCxvLGUsaSxuKSxjKG8sbixpKTtmb3IodmFyIHI9MTthPjA7YS0tKXIqPS45OSxkKG8sciksYyhvLG4saSkscChvLHIpLGMobyxuLGkpfWZ1bmN0aW9uIGgodCxlLGksbixhKXt2YXIgbz1bXTtULmVhY2goZSxmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxpPTA7VC5lYWNoKHQsZnVuY3Rpb24odCl7aSs9dC5nZXRMYXlvdXQoKS52YWx1ZX0pO3ZhciByPShuLShlLTEpKmEpL2k7by5wdXNoKHIpfSksby5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pO3ZhciByPW9bMF07VC5lYWNoKGUsZnVuY3Rpb24odCl7VC5lYWNoKHQsZnVuY3Rpb24odCxlKXt0LnNldExheW91dCh7eTplfSwhMCk7dmFyIGk9dC5nZXRMYXlvdXQoKS52YWx1ZSpyO3Quc2V0TGF5b3V0KHtkeTppfSwhMCl9KX0pLFQuZWFjaChpLGZ1bmN0aW9uKHQpe3ZhciBlPSt0LmdldFZhbHVlKCkqcjt0LnNldExheW91dCh7ZHk6ZX0sITApfSl9ZnVuY3Rpb24gYyh0LGUsaSl7VC5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIG4sYSxvLHI9MCxzPXQubGVuZ3RoO2Zvcih0LnNvcnQoYiksbz0wO288cztvKyspe2lmKG49dFtvXSxhPXItbi5nZXRMYXlvdXQoKS55LGE+MCl7dmFyIGw9bi5nZXRMYXlvdXQoKS55K2E7bi5zZXRMYXlvdXQoe3k6bH0sITApfXI9bi5nZXRMYXlvdXQoKS55K24uZ2V0TGF5b3V0KCkuZHkrZX1pZihhPXItZS1pLGE+MCl7dmFyIGw9bi5nZXRMYXlvdXQoKS55LWE7Zm9yKG4uc2V0TGF5b3V0KHt5Omx9LCEwKSxyPW4uZ2V0TGF5b3V0KCkueSxvPXMtMjtvPj0wOy0tbyluPXRbb10sYT1uLmdldExheW91dCgpLnkrbi5nZXRMYXlvdXQoKS5keStlLXIsYT4wJiYobD1uLmdldExheW91dCgpLnktYSxuLnNldExheW91dCh7eTpsfSwhMCkpLHI9bi5nZXRMYXlvdXQoKS55fX0pfWZ1bmN0aW9uIGQodCxlKXtULmVhY2godC5zbGljZSgpLnJldmVyc2UoKSxmdW5jdGlvbih0KXtULmVhY2godCxmdW5jdGlvbih0KXtpZih0Lm91dEVkZ2VzLmxlbmd0aCl7dmFyIGk9eCh0Lm91dEVkZ2VzLGYpL3godC5vdXRFZGdlcyxTKSxuPXQuZ2V0TGF5b3V0KCkueSsoaS1fKHQpKSplO3Quc2V0TGF5b3V0KHt5Om59LCEwKX19KX0pfWZ1bmN0aW9uIGYodCl7cmV0dXJuIF8odC5ub2RlMikqdC5nZXRWYWx1ZSgpfWZ1bmN0aW9uIHAodCxlKXtULmVhY2godCxmdW5jdGlvbih0KXtULmVhY2godCxmdW5jdGlvbih0KXtpZih0LmluRWRnZXMubGVuZ3RoKXt2YXIgaT14KHQuaW5FZGdlcyxnKS94KHQuaW5FZGdlcyxTKSxuPXQuZ2V0TGF5b3V0KCkueSsoaS1fKHQpKSplO3Quc2V0TGF5b3V0KHt5Om59LCEwKX19KX0pfWZ1bmN0aW9uIGcodCl7cmV0dXJuIF8odC5ub2RlMSkqdC5nZXRWYWx1ZSgpfWZ1bmN0aW9uIG0odCl7VC5lYWNoKHQsZnVuY3Rpb24odCl7dC5vdXRFZGdlcy5zb3J0KHYpLHQuaW5FZGdlcy5zb3J0KHkpfSksVC5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIGU9MCxpPTA7VC5lYWNoKHQub3V0RWRnZXMsZnVuY3Rpb24odCl7dC5zZXRMYXlvdXQoe3N5OmV9LCEwKSxlKz10LmdldExheW91dCgpLmR5fSksVC5lYWNoKHQuaW5FZGdlcyxmdW5jdGlvbih0KXt0LnNldExheW91dCh7dHk6aX0sITApLGkrPXQuZ2V0TGF5b3V0KCkuZHl9KX0pfWZ1bmN0aW9uIHYodCxlKXtyZXR1cm4gdC5ub2RlMi5nZXRMYXlvdXQoKS55LWUubm9kZTIuZ2V0TGF5b3V0KCkueX1mdW5jdGlvbiB5KHQsZSl7cmV0dXJuIHQubm9kZTEuZ2V0TGF5b3V0KCkueS1lLm5vZGUxLmdldExheW91dCgpLnl9ZnVuY3Rpb24geCh0LGUpe2Zvcih2YXIgaT0wLG49dC5sZW5ndGgsYT0tMTsrK2E8bjspe3ZhciBvPStlLmNhbGwodCx0W2FdLGEpO2lzTmFOKG8pfHwoaSs9byl9cmV0dXJuIGl9ZnVuY3Rpb24gXyh0KXtyZXR1cm4gdC5nZXRMYXlvdXQoKS55K3QuZ2V0TGF5b3V0KCkuZHkvMn1mdW5jdGlvbiBiKHQsZSl7cmV0dXJuIHQuZ2V0TGF5b3V0KCkueS1lLmdldExheW91dCgpLnl9ZnVuY3Rpb24gdyh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD09PWU/MDpOYU59ZnVuY3Rpb24gUyh0KXtyZXR1cm4gdC5nZXRWYWx1ZSgpfXZhciBNPWkoOSksST1pKDI3MyksVD1pKDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7dC5lYWNoU2VyaWVzQnlUeXBlKCJzYW5rZXkiLGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ2V0KCJub2RlV2lkdGgiKSxyPXQuZ2V0KCJub2RlR2FwIikscz1uKHQsZSk7dC5sYXlvdXRJbmZvPXM7dmFyIGw9cy53aWR0aCx1PXMuaGVpZ2h0LGg9dC5nZXRHcmFwaCgpLGM9aC5ub2RlcyxkPWguZWRnZXM7byhjKTt2YXIgZj1ULmZpbHRlcihjLGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5nZXRMYXlvdXQoKS52YWx1ZX0pLHA9MCE9PWYubGVuZ3RoPzA6dC5nZXQoImxheW91dEl0ZXJhdGlvbnMiKTthKGMsZCxpLHIsbCx1LHApfSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg4OCksYT1pKDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgic2Fua2V5IixmdW5jdGlvbih0KXt2YXIgZT10LmdldEdyYXBoKCksaT1lLm5vZGVzO2kuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LmdldExheW91dCgpLnZhbHVlLWUuZ2V0TGF5b3V0KCkudmFsdWV9KTt2YXIgbz1pWzBdLmdldExheW91dCgpLnZhbHVlLHI9aVtpLmxlbmd0aC0xXS5nZXRMYXlvdXQoKS52YWx1ZTthLmVhY2goaSxmdW5jdGlvbihlKXt2YXIgaT1uZXcgbih7dHlwZToiY29sb3IiLG1hcHBpbmdNZXRob2Q6ImxpbmVhciIsZGF0YUV4dGVudDpbbyxyXSx2aXN1YWw6dC5nZXQoImNvbG9yIil9KSxhPWkubWFwVmFsdWVUb1Zpc3VhbChlLmdldExheW91dCgpLnZhbHVlKTtlLnNldFZpc3VhbCgiY29sb3IiLGEpO3ZhciBzPWUuZ2V0TW9kZWwoKSxsPXMuZ2V0KCJpdGVtU3R5bGUubm9ybWFsLmNvbG9yIik7bnVsbCE9bCYmZS5zZXRWaXN1YWwoImNvbG9yIixsKX0pfSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgyKSxhPWkoMSk7aSgyNjApLGkoMzUwKSxpKDM1MSksbi5yZWdpc3RlckxheW91dChpKDM1MikpLG4ucmVnaXN0ZXJWaXN1YWwoaSgzNTMpKSxuLnJlZ2lzdGVyUHJvY2Vzc29yKGEuY3VycnkoaSg2NiksInRoZW1lUml2ZXIiKSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7dmFyIG49aSgyNSksYT1pKDE3KSxvPWkoMTQpLHI9aSgxKSxzPWkoNyksbD1zLmVuY29kZUhUTUwsdT1pKDI3MyksaD0yLGM9YS5leHRlbmQoe3R5cGU6InNlcmllcy50aGVtZVJpdmVyIixkZXBlbmRlbmNpZXM6WyJzaW5nbGVBeGlzIl0sbmFtZU1hcDpudWxsLGluaXQ6ZnVuY3Rpb24odCl7Yy5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyksdGhpcy5sZWdlbmREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdEYXRhKCl9fSxmaXhEYXRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxpPXUoKS5rZXkoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5lbnRyaWVzKHQpLG49ci5tYXAoaSxmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0LmtleSxkYXRhTGlzdDp0LnZhbHVlc319KSxhPW4ubGVuZ3RoLG89LTEscz0tMSxsPTA7bDxhOysrbCl7dmFyIGg9bltsXS5kYXRhTGlzdC5sZW5ndGg7aD5vJiYobz1oLHM9bCl9Zm9yKHZhciBjPTA7YzxhOysrYylpZihjIT09cylmb3IodmFyIGQ9bltjXS5uYW1lLGY9MDtmPG87KytmKXtmb3IodmFyIHA9bltzXS5kYXRhTGlzdFtmXVswXSxnPW5bY10uZGF0YUxpc3QubGVuZ3RoLG09LTEsdj0wO3Y8ZzsrK3Ype3ZhciB5PW5bY10uZGF0YUxpc3Rbdl1bMF07aWYoeT09PXApe209djticmVha319bT09PS0xJiYodFtlXT1bXSx0W2VdWzBdPXAsdFtlXVsxXT0wLHRbZV1bMl09ZCxlKyspfXJldHVybiB0fSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPVtdLGE9ZS5xdWVyeUNvbXBvbmVudHMoe21haW5UeXBlOiJzaW5nbGVBeGlzIixpbmRleDp0aGlzLmdldCgic2luZ2xlQXhpc0luZGV4IiksaWQ6dGhpcy5nZXQoInNpbmdsZUF4aXNJZCIpfSlbMF0scz1hLmdldCgidHlwZSIpO2k9W3tuYW1lOiJ0aW1lIix0eXBlOiJjYXRlZ29yeSI9PT1zPyJvcmRpbmFsIjoidGltZSI9PT1zPyJ0aW1lIjoiZmxvYXQifSx7bmFtZToidmFsdWUiLHR5cGU6ImZsb2F0In0se25hbWU6Im5hbWUiLHR5cGU6Im9yZGluYWwifV07Zm9yKHZhciBsPXIuZmlsdGVyKHQuZGF0YSxmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dFsyXX0pLHU9dGhpcy5maXhEYXRhKGx8fFtdKSxjPVtdLGQ9dGhpcy5uYW1lTWFwPXIuY3JlYXRlSGFzaE1hcCgpLGY9MCxwPTA7cDx1Lmxlbmd0aDsrK3ApYy5wdXNoKHVbcF1baF0pLGQuZ2V0KHVbcF1baF0pfHwoZC5zZXQodVtwXVtoXSxmKSxmKyspO2k9bihpLHUpO3ZhciBnPW5ldyBvKGksdGhpcyk7cmV0dXJuIGcuaW5pdERhdGEodSxjKSxnfSxjb29yZERpbVRvRGF0YURpbTpmdW5jdGlvbih0KXtyZXR1cm5bInRpbWUiXX0sZ2V0TGF5ZXJTZXJpZXM6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsaSl7cmV0dXJuIGUuZ2V0KCJ0aW1lIix0KS1lLmdldCgidGltZSIsaSl9Zm9yKHZhciBlPXRoaXMuZ2V0RGF0YSgpLGk9ZS5jb3VudCgpLG49W10sYT0wO2E8aTsrK2EpblthXT1hO2Zvcih2YXIgbz11KCkua2V5KGZ1bmN0aW9uKHQpe3JldHVybiBlLmdldCgibmFtZSIsdCl9KS5lbnRyaWVzKG4pLHM9ci5tYXAobyxmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0LmtleSxpbmRpY2VzOnQudmFsdWVzfX0pLGw9MDtsPHMubGVuZ3RoOysrbClzW2xdLmluZGljZXMuc29ydCh0KTtyZXR1cm4gc30sZ2V0QXhpc1Rvb2x0aXBEYXRhOmZ1bmN0aW9uKHQsZSxpKXtyLmlzQXJyYXkodCl8fCh0PXQ/W3RdOltdKTtmb3IodmFyIG4sYT10aGlzLmdldERhdGEoKSxvPXRoaXMuZ2V0TGF5ZXJTZXJpZXMoKSxzPVtdLGw9by5sZW5ndGgsdT0wO3U8bDsrK3Upe2Zvcih2YXIgaD1OdW1iZXIuTUFYX1ZBTFVFLGM9LTEsZD1vW3VdLmluZGljZXMubGVuZ3RoLGY9MDtmPGQ7KytmKXt2YXIgcD1hLmdldCh0WzBdLG9bdV0uaW5kaWNlc1tmXSksZz1NYXRoLmFicyhwLWUpO2c8PWgmJihuPXAsaD1nLGM9b1t1XS5pbmRpY2VzW2ZdKX1zLnB1c2goYyl9cmV0dXJue2RhdGFJbmRpY2VzOnMsbmVzdGVzdFZhbHVlOm59fSxmb3JtYXRUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YSgpLGk9ZS5nZXQoIm5hbWUiLHQpLG49ZS5nZXQoInZhbHVlIix0KTtyZXR1cm4oaXNOYU4obil8fG51bGw9PW4pJiYobj0iLSIpLGwoaSsiIDogIituKX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejoyLGNvb3JkaW5hdGVTeXN0ZW06InNpbmdsZUF4aXMiLGJvdW5kYXJ5R2FwOlsiMTAlIiwiMTAlIl0sc2luZ2xlQXhpc0luZGV4OjAsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGxhYmVsOntub3JtYWw6e21hcmdpbjo0LHRleHRBbGlnbjoicmlnaHQiLHNob3c6ITAscG9zaXRpb246ImxlZnQiLGNvbG9yOiIjMDAwIixmb250U2l6ZToxMX0sZW1waGFzaXM6e3Nob3c6ITB9fX19KTt0LmV4cG9ydHM9Y30sZnVuY3Rpb24odCxlLGkpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj1uZXcgby5SZWN0KHtzaGFwZTp7eDp0LngtMTAseTp0LnktMTAsd2lkdGg6MCxoZWlnaHQ6dC5oZWlnaHQrMjB9fSk7cmV0dXJuIG8uaW5pdFByb3BzKG4se3NoYXBlOnt3aWR0aDp0LndpZHRoKzIwLGhlaWdodDp0LmhlaWdodCsyMH19LGUsaSksbn12YXIgYT1pKDk4KSxvPWkoMykscj1pKDEpLHM9aSg0Myk7dC5leHBvcnRzPWkoMikuZXh0ZW5kQ2hhcnRWaWV3KHt0eXBlOiJ0aGVtZVJpdmVyIixpbml0OmZ1bmN0aW9uKCl7dGhpcy5fbGF5ZXJzPVtdfSxyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIGwodCl7cmV0dXJuIHQubmFtZX1mdW5jdGlvbiB1KGUsaSxzKXt2YXIgbD10aGlzLl9sYXllcnM7aWYoInJlbW92ZSI9PT1lKXJldHVybiB2b2lkIGQucmVtb3ZlKGxbaV0pO2Zvcih2YXIgdSxwPVtdLGc9W10sbT1mW2ldLmluZGljZXMsdj0wO3Y8bS5sZW5ndGg7disrKXt2YXIgeD1oLmdldEl0ZW1MYXlvdXQobVt2XSksXz14LngsYj14LnkwLHc9eC55O3AucHVzaChbXyxiXSksZy5wdXNoKFtfLGIrd10pLHU9Yy5nZXRJdGVtVmlzdWFsKG1bdl0sImNvbG9yIil9dmFyIFMsTSxJPWguZ2V0SXRlbUxheW91dChtWzBdKSxUPWguZ2V0SXRlbU1vZGVsKG1bdi0xXSksQT1ULmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSxDPUEuZ2V0KCJtYXJnaW4iKTtpZigiYWRkIj09PWUpe3ZhciBMPXlbaV09bmV3IG8uR3JvdXA7Uz1uZXcgYS5Qb2x5Z29uKHtzaGFwZTp7cG9pbnRzOnAsc3RhY2tlZE9uUG9pbnRzOmcsc21vb3RoOi40LHN0YWNrZWRPblNtb290aDouNCxzbW9vdGhDb25zdHJhaW50OiExfSx6MjowfSksTT1uZXcgby5UZXh0KHtzdHlsZTp7eDpJLngtQyx5OkkueTArSS55LzJ9fSksTC5hZGQoUyksTC5hZGQoTSksZC5hZGQoTCksUy5zZXRDbGlwUGF0aChuKFMuZ2V0Qm91bmRpbmdSZWN0KCksdCxmdW5jdGlvbigpe1MucmVtb3ZlQ2xpcFBhdGgoKX0pKX1lbHNle3ZhciBMPWxbc107Uz1MLmNoaWxkQXQoMCksTT1MLmNoaWxkQXQoMSksZC5hZGQoTCkseVtpXT1MLG8udXBkYXRlUHJvcHMoUyx7c2hhcGU6e3BvaW50czpwLHN0YWNrZWRPblBvaW50czpnfX0sdCksby51cGRhdGVQcm9wcyhNLHtzdHlsZTp7eDpJLngtQyx5OkkueTArSS55LzJ9fSx0KX12YXIgRD1ULmdldE1vZGVsKCJpdGVtU3R5bGUuZW1waGFzaXMiKSxQPVQuZ2V0TW9kZWwoIml0ZW1TdHlsZS5ub3JtYWwiKTtvLnNldFRleHRTdHlsZShNLnN0eWxlLEEse3RleHQ6QS5nZXQoInNob3ciKT90LmdldEZvcm1hdHRlZExhYmVsKG1bdi0xXSwibm9ybWFsIil8fGguZ2V0TmFtZShtW3YtMV0pOm51bGwsdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9KSxTLnNldFN0eWxlKHIuZXh0ZW5kKHtmaWxsOnV9LFAuZ2V0SXRlbVN0eWxlKFsiY29sb3IiXSkpKSxvLnNldEhvdmVyU3R5bGUoUyxELmdldEl0ZW1TdHlsZSgpKX12YXIgaD10LmdldERhdGEoKSxjPXQuZ2V0UmF3RGF0YSgpO2lmKGguY291bnQoKSl7dmFyIGQ9dGhpcy5ncm91cCxmPXQuZ2V0TGF5ZXJTZXJpZXMoKSxwPWguZ2V0TGF5b3V0KCJsYXlvdXRJbmZvIiksZz1wLnJlY3QsbT1wLmJvdW5kYXJ5R2FwO2QuYXR0cigicG9zaXRpb24iLFswLGcueSttWzBdXSk7dmFyIHY9bmV3IHModGhpcy5fbGF5ZXJzU2VyaWVzfHxbXSxmLGwsbCkseT17fTt2LmFkZChyLmJpbmQoci5jdXJyeSh1LCJhZGQiKSx0aGlzKSkudXBkYXRlKHIuYmluZChyLmN1cnJ5KHUsInVwZGF0ZSIpLHRoaXMpKS5yZW1vdmUoci5iaW5kKHIuY3VycnkodSwicmVtb3ZlIiksdGhpcykpLmV4ZWN1dGUoKSx0aGlzLl9sYXllcnNTZXJpZXM9Zix0aGlzLl9sYXllcnM9eX19LGRpc3Bvc2U6ZnVuY3Rpb24oKXt9fSl9KS5jYWxsKGUsaSgxOTQpKX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe2lmKHQuY291bnQoKSlmb3IodmFyIG4scj1lLmNvb3JkaW5hdGVTeXN0ZW0scz1lLmdldExheWVyU2VyaWVzKCksbD1vLm1hcChzLGZ1bmN0aW9uKGUpe3JldHVybiBvLm1hcChlLmluZGljZXMsZnVuY3Rpb24oZSl7dmFyIGk9ci5kYXRhVG9Qb2ludCh0LmdldCgidGltZSIsZSkpO3JldHVybiBpWzFdPXQuZ2V0KCJ2YWx1ZSIsZSksaX0pfSksdT1hKGwpLGg9dS55MCxjPWkvdS5tYXgsZD1zLmxlbmd0aCxmPXNbMF0uaW5kaWNlcy5sZW5ndGgscD0wO3A8ZjsrK3Ape249aFtwXSpjLHQuc2V0SXRlbUxheW91dChzWzBdLmluZGljZXNbcF0se2xheWVySW5kZXg6MCx4OmxbMF1bcF1bMF0seTA6bix5OmxbMF1bcF1bMV0qY30pO2Zvcih2YXIgZz0xO2c8ZDsrK2cpbis9bFtnLTFdW3BdWzFdKmMsdC5zZXRJdGVtTGF5b3V0KHNbZ10uaW5kaWNlc1twXSx7bGF5ZXJJbmRleDpnLHg6bFtnXVtwXVswXSx5MDpuLHk6bFtnXVtwXVsxXSpjfSl9fWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlLGk9dC5sZW5ndGgsbj10WzBdLmxlbmd0aCxhPVtdLG89W10scj0wLHM9e30sbD0wO2w8bjsrK2wpe2Zvcih2YXIgdT0wLGU9MDt1PGk7Kyt1KWUrPXRbdV1bbF1bMV07ZT5yJiYocj1lKSxhLnB1c2goZSl9Zm9yKHZhciBoPTA7aDxuOysraClvW2hdPShyLWFbaF0pLzI7cj0wO2Zvcih2YXIgYz0wO2M8bjsrK2Mpe3ZhciBkPWFbY10rb1tjXTtkPnImJihyPWQpfXJldHVybiBzLnkwPW8scy5tYXg9cixzfXZhciBvPWkoMSkscj1pKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3QuZWFjaFNlcmllc0J5VHlwZSgidGhlbWVSaXZlciIsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksaT10LmNvb3JkaW5hdGVTeXN0ZW0sYT17fSxvPWkuZ2V0UmVjdCgpO2EucmVjdD1vO3ZhciBzPXQuZ2V0KCJib3VuZGFyeUdhcCIpLGw9aS5nZXRBeGlzKCk7aWYoYS5ib3VuZGFyeUdhcD1zLCJob3Jpem9udGFsIj09PWwub3JpZW50KXtzWzBdPXIucGFyc2VQZXJjZW50KHNbMF0sby5oZWlnaHQpLHNbMV09ci5wYXJzZVBlcmNlbnQoc1sxXSxvLmhlaWdodCk7dmFyIHU9by5oZWlnaHQtc1swXS1zWzFdO24oZSx0LHUpfWVsc2V7c1swXT1yLnBhcnNlUGVyY2VudChzWzBdLG8ud2lkdGgpLHNbMV09ci5wYXJzZVBlcmNlbnQoc1sxXSxvLndpZHRoKTt2YXIgaD1vLndpZHRoLXNbMF0tc1sxXTtuKGUsdCxoKX1lLnNldExheW91dCgibGF5b3V0SW5mbyIsYSl9KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3QuZWFjaFNlcmllc0J5VHlwZSgidGhlbWVSaXZlciIsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCksaT10LmdldFJhd0RhdGEoKSxuPXQuZ2V0KCJjb2xvciIpO2UuZWFjaChmdW5jdGlvbihhKXt2YXIgbz1lLmdldE5hbWUoYSkscj1uWyh0Lm5hbWVNYXAuZ2V0KG8pLTEpJW4ubGVuZ3RoXTtpLnNldEl0ZW1WaXN1YWwoYSwiY29sb3IiLHIpfSl9KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDIpO2koMzU2KSxpKDM1NyksaSgzNTgpLG4ucmVnaXN0ZXJWaXN1YWwoaSgzNjApKSxuLnJlZ2lzdGVyTGF5b3V0KGkoMzU5KSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3RoaXMuZ3JvdXA9bmV3IHIuR3JvdXAsdC5hZGQodGhpcy5ncm91cCl9ZnVuY3Rpb24gYSh0LGUsaSxuLGEsbyl7dmFyIHI9W1thP3Q6dC1kLGVdLFt0K2ksZV0sW3QraSxlK25dLFthP3Q6dC1kLGUrbl1dO3JldHVybiFvJiZyLnNwbGljZSgyLDAsW3QraStkLGUrbi8yXSksIWEmJnIucHVzaChbdCxlK24vMl0pLHJ9ZnVuY3Rpb24gbyh0LGUsaSl7dC5ldmVudERhdGE9e2NvbXBvbmVudFR5cGU6InNlcmllcyIsY29tcG9uZW50U3ViVHlwZToidHJlZW1hcCIsc2VyaWVzSW5kZXg6ZS5jb21wb25lbnRJbmRleCxzZXJpZXNOYW1lOmUubmFtZSxzZXJpZXNUeXBlOiJ0cmVlbWFwIixzZWxmVHlwZToiYnJlYWRjcnVtYiIsbm9kZURhdGE6e2RhdGFJbmRleDppJiZpLmRhdGFJbmRleCxuYW1lOmkmJmkubmFtZX0sdHJlZVBhdGhJbmZvOmkmJnUud3JhcFRyZWVQYXRoSW5mbyhpLGUpfX12YXIgcj1pKDMpLHM9aSg5KSxsPWkoMSksdT1pKDk5KSxoPTgsYz04LGQ9NTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixyZW5kZXI6ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9dC5nZXRNb2RlbCgiYnJlYWRjcnVtYiIpLG89dGhpcy5ncm91cDtpZihvLnJlbW92ZUFsbCgpLGEuZ2V0KCJzaG93IikmJmkpe3ZhciByPWEuZ2V0TW9kZWwoIml0ZW1TdHlsZS5ub3JtYWwiKSxsPXIuZ2V0TW9kZWwoInRleHRTdHlsZSIpLHU9e3Bvczp7bGVmdDphLmdldCgibGVmdCIpLHJpZ2h0OmEuZ2V0KCJyaWdodCIpLHRvcDphLmdldCgidG9wIiksYm90dG9tOmEuZ2V0KCJib3R0b20iKX0sYm94Ont3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9LGVtcHR5SXRlbVdpZHRoOmEuZ2V0KCJlbXB0eUl0ZW1XaWR0aCIpLHRvdGFsV2lkdGg6MCxyZW5kZXJMaXN0OltdfTt0aGlzLl9wcmVwYXJlKGksdSxsKSx0aGlzLl9yZW5kZXJDb250ZW50KHQsdSxyLGwsbikscy5wb3NpdGlvbkVsZW1lbnQobyx1LnBvcyx1LmJveCl9fSxfcHJlcGFyZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPXQ7bjtuPW4ucGFyZW50Tm9kZSl7dmFyIGE9bi5nZXRNb2RlbCgpLmdldCgibmFtZSIpLG89aS5nZXRUZXh0UmVjdChhKSxyPU1hdGgubWF4KG8ud2lkdGgrMipoLGUuZW1wdHlJdGVtV2lkdGgpO2UudG90YWxXaWR0aCs9citjLGUucmVuZGVyTGlzdC5wdXNoKHtub2RlOm4sdGV4dDphLHdpZHRoOnJ9KX19LF9yZW5kZXJDb250ZW50OmZ1bmN0aW9uKHQsZSxpLG4sdSl7Zm9yKHZhciBoPTAsZD1lLmVtcHR5SXRlbVdpZHRoLGY9dC5nZXQoImJyZWFkY3J1bWIuaGVpZ2h0IikscD1zLmdldEF2YWlsYWJsZVNpemUoZS5wb3MsZS5ib3gpLGc9ZS50b3RhbFdpZHRoLG09ZS5yZW5kZXJMaXN0LHY9bS5sZW5ndGgtMTt2Pj0wO3YtLSl7dmFyIHk9bVt2XSx4PXkubm9kZSxfPXkud2lkdGgsYj15LnRleHQ7Zz5wLndpZHRoJiYoZy09Xy1kLF89ZCxiPW51bGwpO3ZhciB3PW5ldyByLlBvbHlnb24oe3NoYXBlOntwb2ludHM6YShoLDAsXyxmLHY9PT1tLmxlbmd0aC0xLDA9PT12KX0sc3R5bGU6bC5kZWZhdWx0cyhpLmdldEl0ZW1TdHlsZSgpLHtsaW5lSm9pbjoiYmV2ZWwiLHRleHQ6Yix0ZXh0RmlsbDpuLmdldFRleHRDb2xvcigpLHRleHRGb250Om4uZ2V0Rm9udCgpfSksejoxMCxvbmNsaWNrOmwuY3VycnkodSx4KX0pO3RoaXMuZ3JvdXAuYWRkKHcpLG8odyx0LHgpLGgrPV8rY319LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXAucmVtb3ZlQWxsKCl9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7dmFyIGU9MDtzLmVhY2godC5jaGlsZHJlbixmdW5jdGlvbih0KXtuKHQpO3ZhciBpPXQudmFsdWU7cy5pc0FycmF5KGkpJiYoaT1pWzBdKSxlKz1pfSk7dmFyIGk9dC52YWx1ZTtzLmlzQXJyYXkoaSkmJihpPWlbMF0pLChudWxsPT1pfHxpc05hTihpKSkmJihpPWUpLGk8MCYmKGk9MCkscy5pc0FycmF5KHQudmFsdWUpP3QudmFsdWVbMF09aTp0LnZhbHVlPWl9ZnVuY3Rpb24gYSh0LGUpe3ZhciBpPWUuZ2V0KCJjb2xvciIpO2lmKGkpe3Q9dHx8W107dmFyIG47aWYocy5lYWNoKHQsZnVuY3Rpb24odCl7dmFyIGU9bmV3IGwodCksaT1lLmdldCgiY29sb3IiKTsoZS5nZXQoIml0ZW1TdHlsZS5ub3JtYWwuY29sb3IiKXx8aSYmIm5vbmUiIT09aSkmJihuPSEwKX0pLCFuKXt2YXIgYT10WzBdfHwodFswXT17fSk7YS5jb2xvcj1pLnNsaWNlKCl9cmV0dXJuIHR9fXZhciBvPWkoMTcpLHI9aSg0MzMpLHM9aSgxKSxsPWkoMTEpLHU9aSg3KSxoPWkoOTkpLGM9dS5lbmNvZGVIVE1MLGQ9dS5hZGRDb21tYXM7dC5leHBvcnRzPW8uZXh0ZW5kKHt0eXBlOiJzZXJpZXMudHJlZW1hcCIsbGF5b3V0TW9kZToiYm94IixkZXBlbmRlbmNpZXM6WyJncmlkIiwicG9sYXIiXSxfdmlld1Jvb3Q6bnVsbCxkZWZhdWx0T3B0aW9uOnsKcHJvZ3Jlc3NpdmU6MCxob3ZlckxheWVyVGhyZXNob2xkOjEvMCxsZWZ0OiJjZW50ZXIiLHRvcDoibWlkZGxlIixyaWdodDpudWxsLGJvdHRvbTpudWxsLHdpZHRoOiI4MCUiLGhlaWdodDoiODAlIixzb3J0OiEwLGNsaXBXaW5kb3c6Im9yaWdpbiIsc3F1YXJlUmF0aW86LjUqKDErTWF0aC5zcXJ0KDUpKSxsZWFmRGVwdGg6bnVsbCxkcmlsbERvd25JY29uOiLilrYiLHpvb21Ub05vZGVSYXRpbzouMTAyNCxyb2FtOiEwLG5vZGVDbGljazoiem9vbVRvTm9kZSIsYW5pbWF0aW9uOiEwLGFuaW1hdGlvbkR1cmF0aW9uVXBkYXRlOjkwMCxhbmltYXRpb25FYXNpbmc6InF1aW50aWNJbk91dCIsYnJlYWRjcnVtYjp7c2hvdzohMCxoZWlnaHQ6MjIsbGVmdDoiY2VudGVyIix0b3A6ImJvdHRvbSIsZW1wdHlJdGVtV2lkdGg6MjUsaXRlbVN0eWxlOntub3JtYWw6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuNykiLGJvcmRlckNvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNykiLGJvcmRlcldpZHRoOjEsc2hhZG93Q29sb3I6InJnYmEoMTUwLDE1MCwxNTAsMSkiLHNoYWRvd0JsdXI6MyxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLHRleHRTdHlsZTp7Y29sb3I6IiNmZmYifX0sZW1waGFzaXM6e3RleHRTdHlsZTp7fX19fSxsYWJlbDp7bm9ybWFsOntzaG93OiEwLGRpc3RhbmNlOjAscGFkZGluZzo1LHBvc2l0aW9uOiJpbnNpZGUiLGNvbG9yOiIjZmZmIixlbGxpcHNpczohMH19LHVwcGVyTGFiZWw6e25vcm1hbDp7c2hvdzohMSxwb3NpdGlvbjpbMCwiNTAlIl0saGVpZ2h0OjIwLGNvbG9yOiIjZmZmIixlbGxpcHNpczohMCx2ZXJ0aWNhbEFsaWduOiJtaWRkbGUifSxlbXBoYXNpczp7c2hvdzohMCxwb3NpdGlvbjpbMCwiNTAlIl0sY29sb3I6IiNmZmYiLGVsbGlwc2lzOiEwLHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9fSxpdGVtU3R5bGU6e25vcm1hbDp7Y29sb3I6bnVsbCxjb2xvckFscGhhOm51bGwsY29sb3JTYXR1cmF0aW9uOm51bGwsYm9yZGVyV2lkdGg6MCxnYXBXaWR0aDowLGJvcmRlckNvbG9yOiIjZmZmIixib3JkZXJDb2xvclNhdHVyYXRpb246bnVsbH0sZW1waGFzaXM6e319LHZpc3VhbERpbWVuc2lvbjowLHZpc3VhbE1pbjpudWxsLHZpc3VhbE1heDpudWxsLGNvbG9yOltdLGNvbG9yQWxwaGE6bnVsbCxjb2xvclNhdHVyYXRpb246bnVsbCxjb2xvck1hcHBpbmdCeToiaW5kZXgiLHZpc2libGVNaW46MTAsY2hpbGRyZW5WaXNpYmxlTWluOm51bGwsbGV2ZWxzOltdfSxnZXRJbml0aWFsRGF0YTpmdW5jdGlvbih0LGUpe3ZhciBpPXtuYW1lOnQubmFtZSxjaGlsZHJlbjp0LmRhdGF9O24oaSk7dmFyIG89dC5sZXZlbHN8fFtdO3JldHVybiBvPXQubGV2ZWxzPWEobyxlKSxyLmNyZWF0ZVRyZWUoaSx0aGlzLG8pLmRhdGF9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0Vmlld1Jvb3QoKX0sZm9ybWF0VG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGEoKSxpPXRoaXMuZ2V0UmF3VmFsdWUodCksbj1kKHMuaXNBcnJheShpKT9pWzBdOmkpLGE9ZS5nZXROYW1lKHQpO3JldHVybiBjKGErIjogIituKX0sZ2V0RGF0YVBhcmFtczpmdW5jdGlvbih0KXt2YXIgZT1vLnByb3RvdHlwZS5nZXREYXRhUGFyYW1zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpPXRoaXMuZ2V0RGF0YSgpLnRyZWUuZ2V0Tm9kZUJ5RGF0YUluZGV4KHQpO3JldHVybiBlLnRyZWVQYXRoSW5mbz1oLndyYXBUcmVlUGF0aEluZm8oaSx0aGlzKSxlfSxzZXRMYXlvdXRJbmZvOmZ1bmN0aW9uKHQpe3RoaXMubGF5b3V0SW5mbz10aGlzLmxheW91dEluZm98fHt9LHMuZXh0ZW5kKHRoaXMubGF5b3V0SW5mbyx0KX0sbWFwSWRUb0luZGV4OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2lkSW5kZXhNYXA7ZXx8KGU9dGhpcy5faWRJbmRleE1hcD1zLmNyZWF0ZUhhc2hNYXAoKSx0aGlzLl9pZEluZGV4TWFwQ291bnQ9MCk7dmFyIGk9ZS5nZXQodCk7cmV0dXJuIG51bGw9PWkmJmUuc2V0KHQsaT10aGlzLl9pZEluZGV4TWFwQ291bnQrKyksaX0sZ2V0Vmlld1Jvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmlld1Jvb3R9LHJlc2V0Vmlld1Jvb3Q6ZnVuY3Rpb24odCl7dD90aGlzLl92aWV3Um9vdD10OnQ9dGhpcy5fdmlld1Jvb3Q7dmFyIGU9dGhpcy5nZXREYXRhKCkudHJlZS5yb290O3QmJih0PT09ZXx8ZS5jb250YWlucyh0KSl8fCh0aGlzLl92aWV3Um9vdD1lKX19KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4oKXtyZXR1cm57bm9kZUdyb3VwOltdLGJhY2tncm91bmQ6W10sY29udGVudDpbXX19ZnVuY3Rpb24gYSh0LGUsaSxuLGEsbCx1LGgsYyxkKXtmdW5jdGlvbiBmKGUsaSxuKXtpLmRhdGFJbmRleD11LmRhdGFJbmRleCxpLnNlcmllc0luZGV4PXQuc2VyaWVzSW5kZXgsaS5zZXRTaGFwZSh7eDowLHk6MCx3aWR0aDpMLGhlaWdodDpEfSk7dmFyIGE9dS5nZXRWaXN1YWwoImJvcmRlckNvbG9yIiwhMCksbz1WLmdldCgiYm9yZGVyQ29sb3IiKTtnKGksZnVuY3Rpb24oKXt2YXIgdD17ZmlsbDphfSxlPXtmaWxsOm99O2lmKG4pe3ZhciByPUwtMipQO3kodCxlLGEscixFLHt4OlAseTowLHdpZHRoOnIsaGVpZ2h0OkV9KX1lbHNlIHQudGV4dD1lLnRleHQ9bnVsbDtpLnNldFN0eWxlKHQpLHMuc2V0SG92ZXJTdHlsZShpLGUpfSksZS5hZGQoaSl9ZnVuY3Rpb24gcChlLGkpe2kuZGF0YUluZGV4PXUuZGF0YUluZGV4LGkuc2VyaWVzSW5kZXg9dC5zZXJpZXNJbmRleDt2YXIgbj1NYXRoLm1heChMLTIqUCwwKSxhPU1hdGgubWF4KEQtMipQLDApO2kuY3VsbGluZz0hMCxpLnNldFNoYXBlKHt4OlAseTpQLHdpZHRoOm4saGVpZ2h0OmF9KTt2YXIgbz11LmdldFZpc3VhbCgiY29sb3IiLCEwKTtnKGksZnVuY3Rpb24oKXt2YXIgdD17ZmlsbDpvfSxlPVYuZ2V0SXRlbVN0eWxlKCk7eSh0LGUsbyxuLGEpLGkuc2V0U3R5bGUodCkscy5zZXRIb3ZlclN0eWxlKGksZSl9KSxlLmFkZChpKX1mdW5jdGlvbiBnKHQsZSl7az8hdC5pbnZpc2libGUmJmwucHVzaCh0KTooZSgpLHQuX190bVdpbGxWaXNpYmxlfHwodC5pbnZpc2libGU9ITEpKX1mdW5jdGlvbiB5KGUsaSxuLGEsbyxsKXt2YXIgaD11LmdldE1vZGVsKCksYz1yLnJldHJpZXZlKHQuZ2V0Rm9ybWF0dGVkTGFiZWwodS5kYXRhSW5kZXgsIm5vcm1hbCIsbnVsbCxudWxsLGw/InVwcGVyTGFiZWwiOiJsYWJlbCIpLGguZ2V0KCJuYW1lIikpO2lmKCFsJiZDLmlzTGVhZlJvb3Qpe3ZhciBkPXQuZ2V0KCJkcmlsbERvd25JY29uIiwhMCk7Yz1kP2QrIiAiK2M6Y312YXIgZj1oLmdldE1vZGVsKGw/dzpfKSxwPWguZ2V0TW9kZWwobD9TOmIpLGc9Zi5nZXRTaGFsbG93KCJzaG93Iik7cy5zZXRMYWJlbFN0eWxlKGUsaSxmLHAse2RlZmF1bHRUZXh0Omc/YzpudWxsLGF1dG9Db2xvcjpuLGlzUmVjdFRleHQ6ITB9KSxsJiYoZS50ZXh0UmVjdD1yLmNsb25lKGwpKSxlLnRydW5jYXRlPWcmJmYuZ2V0KCJlbGxpcHNpcyIpP3tvdXRlcldpZHRoOmEsb3V0ZXJIZWlnaHQ6byxtaW5DaGFyOjJ9Om51bGx9ZnVuY3Rpb24geCh0LG4scixzKXt2YXIgbD1udWxsIT16JiZpW3RdW3pdLHU9YVt0XTtyZXR1cm4gbD8oaVt0XVt6XT1udWxsLE0odSxsLHQpKTprfHwobD1uZXcgbih7ejpvKHIscyl9KSxsLl9fdG1EZXB0aD1yLGwuX190bVN0b3JhZ2VOYW1lPXQsQSh1LGwsdCkpLGVbdF1bT109bH1mdW5jdGlvbiBNKHQsZSxpKXt2YXIgbj10W09dPXt9O24ub2xkPSJub2RlR3JvdXAiPT09aT9lLnBvc2l0aW9uLnNsaWNlKCk6ci5leHRlbmQoe30sZS5zaGFwZSl9ZnVuY3Rpb24gQSh0LGUsaSl7dmFyIG89dFtPXT17fSxyPXUucGFyZW50Tm9kZTtpZihyJiYoIW58fCJkcmlsbERvd24iPT09bi5kaXJlY3Rpb24pKXt2YXIgcz0wLGw9MCxoPWEuYmFja2dyb3VuZFtyLmdldFJhd0luZGV4KCldOyFuJiZoJiZoLm9sZCYmKHM9aC5vbGQud2lkdGgsbD1oLm9sZC5oZWlnaHQpLG8ub2xkPSJub2RlR3JvdXAiPT09aT9bMCxsXTp7eDpzLHk6bCx3aWR0aDowLGhlaWdodDowfX1vLmZhZGVpbj0ibm9kZUdyb3VwIiE9PWl9aWYodSl7dmFyIEM9dS5nZXRMYXlvdXQoKTtpZihDJiZDLmlzSW5WaWV3KXt2YXIgTD1DLndpZHRoLEQ9Qy5oZWlnaHQsUD1DLmJvcmRlcldpZHRoLGs9Qy5pbnZpc2libGUsTz11LmdldFJhd0luZGV4KCksej1oJiZoLmdldFJhd0luZGV4KCksUj11LnZpZXdDaGlsZHJlbixFPUMudXBwZXJIZWlnaHQsTj1SJiZSLmxlbmd0aCxWPXUuZ2V0TW9kZWwoIml0ZW1TdHlsZS5lbXBoYXNpcyIpLEI9eCgibm9kZUdyb3VwIixtKTtpZihCKXtpZihjLmFkZChCKSxCLmF0dHIoInBvc2l0aW9uIixbQy54fHwwLEMueXx8MF0pLEIuX190bU5vZGVXaWR0aD1MLEIuX190bU5vZGVIZWlnaHQ9RCxDLmlzQWJvdmVWaWV3Um9vdClyZXR1cm4gQjt2YXIgRz14KCJiYWNrZ3JvdW5kIix2LGQsSSk7aWYoRyYmZihCLEcsTiYmQy51cHBlckhlaWdodCksIU4pe3ZhciBIPXgoImNvbnRlbnQiLHYsZCxUKTtIJiZwKEIsSCl9cmV0dXJuIEJ9fX19ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPXQqTStlO3JldHVybihpLTEpL2l9dmFyIHI9aSgxKSxzPWkoMyksbD1pKDQzKSx1PWkoOTkpLGg9aSgzNTUpLGM9aSgxMDApLGQ9aSgxMiksZj1pKDE5KSxwPWkoNDM1KSxnPXIuYmluZCxtPXMuR3JvdXAsdj1zLlJlY3QseT1yLmVhY2gseD0zLF89WyJsYWJlbCIsIm5vcm1hbCJdLGI9WyJsYWJlbCIsImVtcGhhc2lzIl0sdz1bInVwcGVyTGFiZWwiLCJub3JtYWwiXSxTPVsidXBwZXJMYWJlbCIsImVtcGhhc2lzIl0sTT0xMCxJPTEsVD0yO3QuZXhwb3J0cz1pKDIpLmV4dGVuZENoYXJ0Vmlldyh7dHlwZToidHJlZW1hcCIsaW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuX2NvbnRhaW5lckdyb3VwLHRoaXMuX3N0b3JhZ2U9bigpLHRoaXMuX29sZFRyZWUsdGhpcy5fYnJlYWRjcnVtYix0aGlzLl9jb250cm9sbGVyLHRoaXMuX3N0YXRlPSJyZWFkeSJ9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1lLmZpbmRDb21wb25lbnRzKHttYWluVHlwZToic2VyaWVzIixzdWJUeXBlOiJ0cmVlbWFwIixxdWVyeTpufSk7aWYoIShyLmluZGV4T2YoYSx0KTwwKSl7dGhpcy5zZXJpZXNNb2RlbD10LHRoaXMuYXBpPWksdGhpcy5lY01vZGVsPWU7dmFyIG89dS5yZXRyaWV2ZVRhcmdldEluZm8obix0KSxzPW4mJm4udHlwZSxsPXQubGF5b3V0SW5mbyxoPSF0aGlzLl9vbGRUcmVlLGM9dGhpcy5fc3RvcmFnZSxkPSJ0cmVlbWFwUm9vdFRvTm9kZSI9PT1zJiZvJiZjP3tyb290Tm9kZUdyb3VwOmMubm9kZUdyb3VwW28ubm9kZS5nZXRSYXdJbmRleCgpXSxkaXJlY3Rpb246bi5kaXJlY3Rpb259Om51bGwsZj10aGlzLl9naXZlQ29udGFpbmVyR3JvdXAobCkscD10aGlzLl9kb1JlbmRlcihmLHQsZCk7aHx8cyYmInRyZWVtYXBab29tVG9Ob2RlIiE9PXMmJiJ0cmVlbWFwUm9vdFRvTm9kZSIhPT1zP3AucmVuZGVyRmluYWxseSgpOnRoaXMuX2RvQW5pbWF0aW9uKGYscCx0LGQpLHRoaXMuX3Jlc2V0Q29udHJvbGxlcihpKSx0aGlzLl9yZW5kZXJCcmVhZGNydW1iKHQsaSxvKX19LF9naXZlQ29udGFpbmVyR3JvdXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29udGFpbmVyR3JvdXA7cmV0dXJuIGV8fChlPXRoaXMuX2NvbnRhaW5lckdyb3VwPW5ldyBtLHRoaXMuX2luaXRFdmVudHMoZSksdGhpcy5ncm91cC5hZGQoZSkpLGUuYXR0cigicG9zaXRpb24iLFt0LngsdC55XSksZX0sX2RvUmVuZGVyOmZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG4sYSl7ZnVuY3Rpb24gcyh0KXtyZXR1cm4gdC5nZXRJZCgpfWZ1bmN0aW9uIHUocixzKXt2YXIgbD1udWxsIT1yP3Rbcl06bnVsbCx1PW51bGwhPXM/ZVtzXTpudWxsLGg9bShsLHUsaSxhKTtoJiZvKGwmJmwudmlld0NoaWxkcmVufHxbXSx1JiZ1LnZpZXdDaGlsZHJlbnx8W10saCxuLGErMSl9bj8oZT10LHkodCxmdW5jdGlvbih0LGUpeyF0LmlzUmVtb3ZlZCgpJiZ1KGUsZSl9KSk6bmV3IGwoZSx0LHMscykuYWRkKHUpLnVwZGF0ZSh1KS5yZW1vdmUoci5jdXJyeSh1LG51bGwpKS5leGVjdXRlKCl9ZnVuY3Rpb24gcyh0KXt2YXIgZT1uKCk7cmV0dXJuIHQmJnkodCxmdW5jdGlvbih0LGkpe3ZhciBuPWVbaV07eSh0LGZ1bmN0aW9uKHQpe3QmJihuLnB1c2godCksdC5fX3RtV2lsbERlbGV0ZT0xKX0pfSksZX1mdW5jdGlvbiB1KCl7eSh2LGZ1bmN0aW9uKHQpe3kodCxmdW5jdGlvbih0KXt0LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpfSl9KSx5KGcsZnVuY3Rpb24odCl7dC5pbnZpc2libGU9ITAsdC5kaXJ0eSgpfSl9dmFyIGg9ZS5nZXREYXRhKCkudHJlZSxjPXRoaXMuX29sZFRyZWUsZD1uKCksZj1uKCkscD10aGlzLl9zdG9yYWdlLGc9W10sbT1yLmN1cnJ5KGEsZSxmLHAsaSxkLGcpO28oaC5yb290P1toLnJvb3RdOltdLGMmJmMucm9vdD9bYy5yb290XTpbXSx0LGg9PT1jfHwhYywwKTt2YXIgdj1zKHApO3JldHVybiB0aGlzLl9vbGRUcmVlPWgsdGhpcy5fc3RvcmFnZT1mLHtsYXN0c0ZvckFuaW1hdGlvbjpkLHdpbGxEZWxldGVFbHM6dixyZW5kZXJGaW5hbGx5OnV9fSxfZG9BbmltYXRpb246ZnVuY3Rpb24odCxlLGksbil7aWYoaS5nZXQoImFuaW1hdGlvbiIpKXt2YXIgYT1pLmdldCgiYW5pbWF0aW9uRHVyYXRpb25VcGRhdGUiKSxvPWkuZ2V0KCJhbmltYXRpb25FYXNpbmciKSxzPXAuY3JlYXRlV3JhcCgpO3koZS53aWxsRGVsZXRlRWxzLGZ1bmN0aW9uKHQsZSl7eSh0LGZ1bmN0aW9uKHQsaSl7aWYoIXQuaW52aXNpYmxlKXt2YXIgcixsPXQucGFyZW50O2lmKG4mJiJkcmlsbERvd24iPT09bi5kaXJlY3Rpb24pcj1sPT09bi5yb290Tm9kZUdyb3VwP3tzaGFwZTp7eDowLHk6MCx3aWR0aDpsLl9fdG1Ob2RlV2lkdGgsaGVpZ2h0OmwuX190bU5vZGVIZWlnaHR9LHN0eWxlOntvcGFjaXR5OjB9fTp7c3R5bGU6e29wYWNpdHk6MH19O2Vsc2V7dmFyIHU9MCxoPTA7bC5fX3RtV2lsbERlbGV0ZXx8KHU9bC5fX3RtTm9kZVdpZHRoLzIsaD1sLl9fdG1Ob2RlSGVpZ2h0LzIpLHI9Im5vZGVHcm91cCI9PT1lP3twb3NpdGlvbjpbdSxoXSxzdHlsZTp7b3BhY2l0eTowfX06e3NoYXBlOnt4OnUseTpoLHdpZHRoOjAsaGVpZ2h0OjB9LHN0eWxlOntvcGFjaXR5OjB9fX1yJiZzLmFkZCh0LHIsYSxvKX19KX0pLHkodGhpcy5fc3RvcmFnZSxmdW5jdGlvbih0LGkpe3kodCxmdW5jdGlvbih0LG4pe3ZhciBsPWUubGFzdHNGb3JBbmltYXRpb25baV1bbl0sdT17fTtsJiYoIm5vZGVHcm91cCI9PT1pP2wub2xkJiYodS5wb3NpdGlvbj10LnBvc2l0aW9uLnNsaWNlKCksdC5hdHRyKCJwb3NpdGlvbiIsbC5vbGQpKToobC5vbGQmJih1LnNoYXBlPXIuZXh0ZW5kKHt9LHQuc2hhcGUpLHQuc2V0U2hhcGUobC5vbGQpKSxsLmZhZGVpbj8odC5zZXRTdHlsZSgib3BhY2l0eSIsMCksdS5zdHlsZT17b3BhY2l0eToxfSk6MSE9PXQuc3R5bGUub3BhY2l0eSYmKHUuc3R5bGU9e29wYWNpdHk6MX0pKSxzLmFkZCh0LHUsYSxvKSl9KX0sdGhpcyksdGhpcy5fc3RhdGU9ImFuaW1hdGluZyIscy5kb25lKGcoZnVuY3Rpb24oKXt0aGlzLl9zdGF0ZT0icmVhZHkiLGUucmVuZGVyRmluYWxseSgpfSx0aGlzKSkuc3RhcnQoKX19LF9yZXNldENvbnRyb2xsZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29udHJvbGxlcjtlfHwoZT10aGlzLl9jb250cm9sbGVyPW5ldyBjKHQuZ2V0WnIoKSksZS5lbmFibGUodGhpcy5zZXJpZXNNb2RlbC5nZXQoInJvYW0iKSksZS5vbigicGFuIixnKHRoaXMuX29uUGFuLHRoaXMpKSxlLm9uKCJ6b29tIixnKHRoaXMuX29uWm9vbSx0aGlzKSkpO3ZhciBpPW5ldyBkKDAsMCx0LmdldFdpZHRoKCksdC5nZXRIZWlnaHQoKSk7ZS5zZXRQb2ludGVyQ2hlY2tlcihmdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuY29udGFpbihlLG4pfSl9LF9jbGVhckNvbnRyb2xsZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250cm9sbGVyO3QmJih0LmRpc3Bvc2UoKSx0PW51bGwpfSxfb25QYW46ZnVuY3Rpb24odCxlKXtpZigiYW5pbWF0aW5nIiE9PXRoaXMuX3N0YXRlJiYoTWF0aC5hYnModCk+eHx8TWF0aC5hYnMoZSk+eCkpe3ZhciBpPXRoaXMuc2VyaWVzTW9kZWwuZ2V0RGF0YSgpLnRyZWUucm9vdDtpZighaSlyZXR1cm47dmFyIG49aS5nZXRMYXlvdXQoKTtpZighbilyZXR1cm47dGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRyZWVtYXBNb3ZlIixmcm9tOnRoaXMudWlkLHNlcmllc0lkOnRoaXMuc2VyaWVzTW9kZWwuaWQscm9vdFJlY3Q6e3g6bi54K3QseTpuLnkrZSx3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH19KX19LF9vblpvb206ZnVuY3Rpb24odCxlLGkpe2lmKCJhbmltYXRpbmciIT09dGhpcy5fc3RhdGUpe3ZhciBuPXRoaXMuc2VyaWVzTW9kZWwuZ2V0RGF0YSgpLnRyZWUucm9vdDtpZighbilyZXR1cm47dmFyIGE9bi5nZXRMYXlvdXQoKTtpZighYSlyZXR1cm47dmFyIG89bmV3IGQoYS54LGEueSxhLndpZHRoLGEuaGVpZ2h0KSxyPXRoaXMuc2VyaWVzTW9kZWwubGF5b3V0SW5mbztlLT1yLngsaS09ci55O3ZhciBzPWYuY3JlYXRlKCk7Zi50cmFuc2xhdGUocyxzLFstZSwtaV0pLGYuc2NhbGUocyxzLFt0LHRdKSxmLnRyYW5zbGF0ZShzLHMsW2UsaV0pLG8uYXBwbHlUcmFuc2Zvcm0ocyksdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRyZWVtYXBSZW5kZXIiLGZyb206dGhpcy51aWQsc2VyaWVzSWQ6dGhpcy5zZXJpZXNNb2RlbC5pZCxyb290UmVjdDp7eDpvLngseTpvLnksd2lkdGg6by53aWR0aCxoZWlnaHQ6by5oZWlnaHR9fSl9fSxfaW5pdEV2ZW50czpmdW5jdGlvbih0KXt0Lm9uKCJjbGljayIsZnVuY3Rpb24odCl7aWYoInJlYWR5Ij09PXRoaXMuX3N0YXRlKXt2YXIgZT10aGlzLnNlcmllc01vZGVsLmdldCgibm9kZUNsaWNrIiwhMCk7aWYoZSl7dmFyIGk9dGhpcy5maW5kVGFyZ2V0KHQub2Zmc2V0WCx0Lm9mZnNldFkpO2lmKGkpe3ZhciBuPWkubm9kZTtpZihuLmdldExheW91dCgpLmlzTGVhZlJvb3QpdGhpcy5fcm9vdFRvTm9kZShpKTtlbHNlIGlmKCJ6b29tVG9Ob2RlIj09PWUpdGhpcy5fem9vbVRvTm9kZShpKTtlbHNlIGlmKCJsaW5rIj09PWUpe3ZhciBhPW4uaG9zdFRyZWUuZGF0YS5nZXRJdGVtTW9kZWwobi5kYXRhSW5kZXgpLG89YS5nZXQoImxpbmsiLCEwKSxyPWEuZ2V0KCJ0YXJnZXQiLCEwKXx8ImJsYW5rIjtvJiZ3aW5kb3cub3BlbihvLHIpfX19fX0sdGhpcyl9LF9yZW5kZXJCcmVhZGNydW1iOmZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKGUpeyJhbmltYXRpbmciIT09dGhpcy5fc3RhdGUmJih1LmFib3ZlVmlld1Jvb3QodC5nZXRWaWV3Um9vdCgpLGUpP3RoaXMuX3Jvb3RUb05vZGUoe25vZGU6ZX0pOnRoaXMuX3pvb21Ub05vZGUoe25vZGU6ZX0pKX1pfHwoaT1udWxsIT10LmdldCgibGVhZkRlcHRoIiwhMCk/e25vZGU6dC5nZXRWaWV3Um9vdCgpfTp0aGlzLmZpbmRUYXJnZXQoZS5nZXRXaWR0aCgpLzIsZS5nZXRIZWlnaHQoKS8yKSxpfHwoaT17bm9kZTp0LmdldERhdGEoKS50cmVlLnJvb3R9KSksKHRoaXMuX2JyZWFkY3J1bWJ8fCh0aGlzLl9icmVhZGNydW1iPW5ldyBoKHRoaXMuZ3JvdXApKSkucmVuZGVyKHQsZSxpLm5vZGUsZyhuLHRoaXMpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJDb250cm9sbGVyKCksdGhpcy5fY29udGFpbmVyR3JvdXAmJnRoaXMuX2NvbnRhaW5lckdyb3VwLnJlbW92ZUFsbCgpLHRoaXMuX3N0b3JhZ2U9bigpLHRoaXMuX3N0YXRlPSJyZWFkeSIsdGhpcy5fYnJlYWRjcnVtYiYmdGhpcy5fYnJlYWRjcnVtYi5yZW1vdmUoKX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFyQ29udHJvbGxlcigpfSxfem9vbVRvTm9kZTpmdW5jdGlvbih0KXt0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToidHJlZW1hcFpvb21Ub05vZGUiLGZyb206dGhpcy51aWQsc2VyaWVzSWQ6dGhpcy5zZXJpZXNNb2RlbC5pZCx0YXJnZXROb2RlOnQubm9kZX0pfSxfcm9vdFRvTm9kZTpmdW5jdGlvbih0KXt0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToidHJlZW1hcFJvb3RUb05vZGUiLGZyb206dGhpcy51aWQsc2VyaWVzSWQ6dGhpcy5zZXJpZXNNb2RlbC5pZCx0YXJnZXROb2RlOnQubm9kZX0pfSxmaW5kVGFyZ2V0OmZ1bmN0aW9uKHQsZSl7dmFyIGksbj10aGlzLnNlcmllc01vZGVsLmdldFZpZXdSb290KCk7cmV0dXJuIG4uZWFjaE5vZGUoe2F0dHI6InZpZXdDaGlsZHJlbiIsb3JkZXI6InByZW9yZGVyIn0sZnVuY3Rpb24obil7dmFyIGE9dGhpcy5fc3RvcmFnZS5iYWNrZ3JvdW5kW24uZ2V0UmF3SW5kZXgoKV07aWYoYSl7dmFyIG89YS50cmFuc2Zvcm1Db29yZFRvTG9jYWwodCxlKSxyPWEuc2hhcGU7aWYoIShyLng8PW9bMF0mJm9bMF08PXIueCtyLndpZHRoJiZyLnk8PW9bMV0mJm9bMV08PXIueStyLmhlaWdodCkpcmV0dXJuITE7aT17bm9kZTpuLG9mZnNldFg6b1swXSxvZmZzZXRZOm9bMV19fX0sdGhpcyksaX19KX0sZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbj1pKDIpLGE9aSg5OSksbz1mdW5jdGlvbigpe30scj1bInRyZWVtYXBab29tVG9Ob2RlIiwidHJlZW1hcFJlbmRlciIsInRyZWVtYXBNb3ZlIl0scz0wO3M8ci5sZW5ndGg7cysrKW4ucmVnaXN0ZXJBY3Rpb24oe3R5cGU6cltzXSx1cGRhdGU6InVwZGF0ZVZpZXcifSxvKTtuLnJlZ2lzdGVyQWN0aW9uKHt0eXBlOiJ0cmVlbWFwUm9vdFRvTm9kZSIsdXBkYXRlOiJ1cGRhdGVWaWV3In0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKGUsaSl7dmFyIG49YS5yZXRyaWV2ZVRhcmdldEluZm8odCxlKTtpZihuKXt2YXIgbz1lLmdldFZpZXdSb290KCk7byYmKHQuZGlyZWN0aW9uPWEuYWJvdmVWaWV3Um9vdChvLG4ubm9kZSk/InJvbGxVcCI6ImRyaWxsRG93biIpLGUucmVzZXRWaWV3Um9vdChuLm5vZGUpfX1lLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJzZXJpZXMiLHN1YlR5cGU6InRyZWVtYXAiLHF1ZXJ5OnR9LGkpfSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj17bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToidHJlZW1hcCIscXVlcnk6aX07dC5lYWNoQ29tcG9uZW50KG4sZnVuY3Rpb24odCl7dmFyIG49ZS5nZXRXaWR0aCgpLG89ZS5nZXRIZWlnaHQoKSxyPXQub3B0aW9uLHM9di5nZXRMYXlvdXRSZWN0KHQuZ2V0Qm94TGF5b3V0UGFyYW1zKCkse3dpZHRoOmUuZ2V0V2lkdGgoKSxoZWlnaHQ6ZS5nZXRIZWlnaHQoKX0pLGw9ci5zaXplfHxbXSx1PXcoUyhzLndpZHRoLGxbMF0pLG4pLGg9dyhTKHMuaGVpZ2h0LGxbMV0pLG8pLHA9aSYmaS50eXBlLG09eS5yZXRyaWV2ZVRhcmdldEluZm8oaSx0KSxfPSJ0cmVlbWFwUmVuZGVyIj09PXB8fCJ0cmVlbWFwTW92ZSI9PT1wP2kucm9vdFJlY3Q6bnVsbCxiPXQuZ2V0Vmlld1Jvb3QoKSxJPXkuZ2V0UGF0aFRvUm9vdChiKTtpZigidHJlZW1hcE1vdmUiIT09cCl7dmFyIFQ9InRyZWVtYXBab29tVG9Ob2RlIj09PXA/Yyh0LG0sYix1LGgpOl8/W18ud2lkdGgsXy5oZWlnaHRdOlt1LGhdLEE9ci5zb3J0O0EmJiJhc2MiIT09QSYmImRlc2MiIT09QSYmKEE9ImRlc2MiKTt2YXIgQz17c3F1YXJlUmF0aW86ci5zcXVhcmVSYXRpbyxzb3J0OkEsbGVhZkRlcHRoOnIubGVhZkRlcHRofTtiLmhvc3RUcmVlLmNsZWFyTGF5b3V0cygpO3ZhciBMPXt4OjAseTowLHdpZHRoOlRbMF0saGVpZ2h0OlRbMV0sYXJlYTpUWzBdKlRbMV19O2Iuc2V0TGF5b3V0KEwpLGEoYixDLCExLDApO3ZhciBMPWIuZ2V0TGF5b3V0KCk7TShJLGZ1bmN0aW9uKHQsZSl7dmFyIGk9KElbZSsxXXx8YikuZ2V0VmFsdWUoKTt0LnNldExheW91dChnLmV4dGVuZCh7ZGF0YUV4dGVudDpbaSxpXSxib3JkZXJXaWR0aDowLHVwcGVySGVpZ2h0OjB9LEwpKX0pfXZhciBEPXQuZ2V0RGF0YSgpLnRyZWUucm9vdDtELnNldExheW91dChkKHMsXyxtKSwhMCksdC5zZXRMYXlvdXRJbmZvKHMpLGYoRCxuZXcgeCgtcy54LC1zLnksbixvKSxJLGIsMCl9KX1mdW5jdGlvbiBhKHQsZSxpLG4pe3ZhciByLHM7aWYoIXQuaXNSZW1vdmVkKCkpe3ZhciBsPXQuZ2V0TGF5b3V0KCk7cj1sLndpZHRoLHM9bC5oZWlnaHQ7dmFyIGM9dC5nZXRNb2RlbCgpLGQ9Yy5nZXQoSSksZj1jLmdldChUKS8yLGc9cChjKSxtPU1hdGgubWF4KGQsZyksdj1kLWYseT1tLWYsYz10LmdldE1vZGVsKCk7dC5zZXRMYXlvdXQoe2JvcmRlcldpZHRoOmQsdXBwZXJIZWlnaHQ6bSx1cHBlckxhYmVsSGVpZ2h0Omd9LCEwKSxyPV8oci0yKnYsMCkscz1fKHMtdi15LDApO3ZhciB4PXIqcyx3PW8odCxjLHgsZSxpLG4pO2lmKHcubGVuZ3RoKXt2YXIgUz17eDp2LHk6eSx3aWR0aDpyLGhlaWdodDpzfSxNPWIocixzKSxBPTEvMCxDPVtdO0MuYXJlYT0wO2Zvcih2YXIgTD0wLEQ9dy5sZW5ndGg7TDxEOyl7dmFyIFA9d1tMXTtDLnB1c2goUCksQy5hcmVhKz1QLmdldExheW91dCgpLmFyZWE7dmFyIGs9dShDLE0sZS5zcXVhcmVSYXRpbyk7azw9QT8oTCsrLEE9ayk6KEMuYXJlYS09Qy5wb3AoKS5nZXRMYXlvdXQoKS5hcmVhLGgoQyxNLFMsZiwhMSksTT1iKFMud2lkdGgsUy5oZWlnaHQpLEMubGVuZ3RoPUMuYXJlYT0wLEE9MS8wKX1pZihDLmxlbmd0aCYmaChDLE0sUyxmLCEwKSwhaSl7dmFyIE89Yy5nZXQoImNoaWxkcmVuVmlzaWJsZU1pbiIpO251bGwhPU8mJng8TyYmKGk9ITApfWZvcih2YXIgTD0wLEQ9dy5sZW5ndGg7TDxEO0wrKylhKHdbTF0sZSxpLG4rMSl9fX1mdW5jdGlvbiBvKHQsZSxpLG4sYSxvKXt2YXIgdT10LmNoaWxkcmVufHxbXSxoPW4uc29ydDsiYXNjIiE9PWgmJiJkZXNjIiE9PWgmJihoPW51bGwpO3ZhciBjPW51bGwhPW4ubGVhZkRlcHRoJiZuLmxlYWZEZXB0aDw9bztpZihhJiYhYylyZXR1cm4gdC52aWV3Q2hpbGRyZW49W107dT1nLmZpbHRlcih1LGZ1bmN0aW9uKHQpe3JldHVybiF0LmlzUmVtb3ZlZCgpfSkscyh1LGgpO3ZhciBkPWwoZSx1LGgpO2lmKDA9PT1kLnN1bSlyZXR1cm4gdC52aWV3Q2hpbGRyZW49W107aWYoZC5zdW09cihlLGksZC5zdW0saCx1KSwwPT09ZC5zdW0pcmV0dXJuIHQudmlld0NoaWxkcmVuPVtdO2Zvcih2YXIgZj0wLHA9dS5sZW5ndGg7ZjxwO2YrKyl7dmFyIG09dVtmXS5nZXRWYWx1ZSgpL2Quc3VtKmk7dVtmXS5zZXRMYXlvdXQoe2FyZWE6bX0pfXJldHVybiBjJiYodS5sZW5ndGgmJnQuc2V0TGF5b3V0KHtpc0xlYWZSb290OiEwfSwhMCksdS5sZW5ndGg9MCksdC52aWV3Q2hpbGRyZW49dSx0LnNldExheW91dCh7ZGF0YUV4dGVudDpkLmRhdGFFeHRlbnR9LCEwKSx1fWZ1bmN0aW9uIHIodCxlLGksbixhKXtpZighbilyZXR1cm4gaTtmb3IodmFyIG89dC5nZXQoInZpc2libGVNaW4iKSxyPWEubGVuZ3RoLHM9cixsPXItMTtsPj0wO2wtLSl7dmFyIHU9YVsiYXNjIj09PW4/ci1sLTE6bF0uZ2V0VmFsdWUoKTt1L2kqZTxvJiYocz1sLGktPXUpfXJldHVybiJhc2MiPT09bj9hLnNwbGljZSgwLHItcyk6YS5zcGxpY2UocyxyLXMpLGl9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiBlJiZ0LnNvcnQoZnVuY3Rpb24odCxpKXt2YXIgbj0iYXNjIj09PWU/dC5nZXRWYWx1ZSgpLWkuZ2V0VmFsdWUoKTppLmdldFZhbHVlKCktdC5nZXRWYWx1ZSgpO3JldHVybiAwPT09bj8iYXNjIj09PWU/dC5kYXRhSW5kZXgtaS5kYXRhSW5kZXg6aS5kYXRhSW5kZXgtdC5kYXRhSW5kZXg6bn0pLHR9ZnVuY3Rpb24gbCh0LGUsaSl7Zm9yKHZhciBuPTAsYT0wLG89ZS5sZW5ndGg7YTxvO2ErKyluKz1lW2FdLmdldFZhbHVlKCk7dmFyIHIscz10LmdldCgidmlzdWFsRGltZW5zaW9uIik7aWYoZSYmZS5sZW5ndGgpaWYoInZhbHVlIj09PXMmJmkpcj1bZVtlLmxlbmd0aC0xXS5nZXRWYWx1ZSgpLGVbMF0uZ2V0VmFsdWUoKV0sImFzYyI9PT1pJiZyLnJldmVyc2UoKTtlbHNle3ZhciByPVsxLzAsLSgxLzApXTtNKGUsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRWYWx1ZShzKTtlPHJbMF0mJihyWzBdPWUpLGU+clsxXSYmKHJbMV09ZSl9KX1lbHNlIHI9W05hTixOYU5dO3JldHVybntzdW06bixkYXRhRXh0ZW50OnJ9fWZ1bmN0aW9uIHUodCxlLGkpe2Zvcih2YXIgbixhPTAsbz0xLzAscj0wLHM9dC5sZW5ndGg7cjxzO3IrKyluPXRbcl0uZ2V0TGF5b3V0KCkuYXJlYSxuJiYobjxvJiYobz1uKSxuPmEmJihhPW4pKTt2YXIgbD10LmFyZWEqdC5hcmVhLHU9ZSplKmk7cmV0dXJuIGw/Xyh1KmEvbCxsLyh1Km8pKToxLzB9ZnVuY3Rpb24gaCh0LGUsaSxuLGEpe3ZhciBvPWU9PT1pLndpZHRoPzA6MSxyPTEtbyxzPVsieCIsInkiXSxsPVsid2lkdGgiLCJoZWlnaHQiXSx1PWlbc1tvXV0saD1lP3QuYXJlYS9lOjA7KGF8fGg+aVtsW3JdXSkmJihoPWlbbFtyXV0pO2Zvcih2YXIgYz0wLGQ9dC5sZW5ndGg7YzxkO2MrKyl7dmFyIGY9dFtjXSxwPXt9LGc9aD9mLmdldExheW91dCgpLmFyZWEvaDowLG09cFtsW3JdXT1fKGgtMipuLDApLHY9aVtzW29dXStpW2xbb11dLXUseT1jPT09ZC0xfHx2PGc/djpnLHg9cFtsW29dXT1fKHktMipuLDApO3Bbc1tyXV09aVtzW3JdXStiKG4sbS8yKSxwW3Nbb11dPXUrYihuLHgvMiksdSs9eSxmLnNldExheW91dChwLCEwKX1pW3Nbcl1dKz1oLGlbbFtyXV0tPWh9ZnVuY3Rpb24gYyh0LGUsaSxuLGEpe3ZhciBvPShlfHx7fSkubm9kZSxyPVtuLGFdO2lmKCFvfHxvPT09aSlyZXR1cm4gcjtmb3IodmFyIHMsbD1uKmEsdT1sKnQub3B0aW9uLnpvb21Ub05vZGVSYXRpbztzPW8ucGFyZW50Tm9kZTspe2Zvcih2YXIgaD0wLGM9cy5jaGlsZHJlbixkPTAsZj1jLmxlbmd0aDtkPGY7ZCsrKWgrPWNbZF0uZ2V0VmFsdWUoKTt2YXIgZz1vLmdldFZhbHVlKCk7aWYoMD09PWcpcmV0dXJuIHI7dSo9aC9nO3ZhciB2PXMuZ2V0TW9kZWwoKSx5PXYuZ2V0KEkpLHg9TWF0aC5tYXgoeSxwKHYseSkpO3UrPTQqeSp5KygzKnkreCkqTWF0aC5wb3codSwuNSksdT5tLk1BWF9TQUZFX0lOVEVHRVImJih1PW0uTUFYX1NBRkVfSU5URUdFUiksbz1zfXU8bCYmKHU9bCk7dmFyIF89TWF0aC5wb3codS9sLC41KTtyZXR1cm5bbipfLGEqX119ZnVuY3Rpb24gZCh0LGUsaSl7aWYoZSlyZXR1cm57eDplLngseTplLnl9O3ZhciBuPXt4OjAseTowfTtpZighaSlyZXR1cm4gbjt2YXIgYT1pLm5vZGUsbz1hLmdldExheW91dCgpO2lmKCFvKXJldHVybiBuO2Zvcih2YXIgcj1bby53aWR0aC8yLG8uaGVpZ2h0LzJdLHM9YTtzOyl7dmFyIGw9cy5nZXRMYXlvdXQoKTtyWzBdKz1sLngsclsxXSs9bC55LHM9cy5wYXJlbnROb2RlfXJldHVybnt4OnQud2lkdGgvMi1yWzBdLHk6dC5oZWlnaHQvMi1yWzFdfX1mdW5jdGlvbiBmKHQsZSxpLG4sYSl7dmFyIG89dC5nZXRMYXlvdXQoKSxyPWlbYV0scz1yJiZyPT09dDtpZighKHImJiFzfHxhPT09aS5sZW5ndGgmJnQhPT1uKSl7dC5zZXRMYXlvdXQoe2lzSW5WaWV3OiEwLGludmlzaWJsZTohcyYmIWUuaW50ZXJzZWN0KG8pLGlzQWJvdmVWaWV3Um9vdDpzfSwhMCk7dmFyIGw9bmV3IHgoZS54LW8ueCxlLnktby55LGUud2lkdGgsZS5oZWlnaHQpO00odC52aWV3Q2hpbGRyZW58fFtdLGZ1bmN0aW9uKHQpe2YodCxsLGksbixhKzEpfSl9fWZ1bmN0aW9uIHAodCl7cmV0dXJuIHQuZ2V0KEEpP3QuZ2V0KEMpOjB9dmFyIGc9aSgxKSxtPWkoNCksdj1pKDkpLHk9aSg5OSkseD1pKDEyKSx5PWkoOTkpLF89TWF0aC5tYXgsYj1NYXRoLm1pbix3PW0ucGFyc2VQZXJjZW50LFM9Zy5yZXRyaWV2ZSxNPWcuZWFjaCxJPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwiYm9yZGVyV2lkdGgiXSxUPVsiaXRlbVN0eWxlIiwibm9ybWFsIiwiZ2FwV2lkdGgiXSxBPVsidXBwZXJMYWJlbCIsIm5vcm1hbCIsInNob3ciXSxDPVsidXBwZXJMYWJlbCIsIm5vcm1hbCIsImhlaWdodCJdO3QuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSxzLHUsYyl7dmFyIGQ9dC5nZXRNb2RlbCgpLHA9dC5nZXRMYXlvdXQoKTtpZihwJiYhcC5pbnZpc2libGUmJnAuaXNJblZpZXcpe3ZhciBtLHY9dC5nZXRNb2RlbChnKSx5PWlbdC5kZXB0aF0seD1hKHYsZSx5LHMpLF89di5nZXQoImJvcmRlckNvbG9yIiksYj12LmdldCgiYm9yZGVyQ29sb3JTYXR1cmF0aW9uIik7bnVsbCE9YiYmKG09byh4LHQpLF89cihiLG0pKSx0LnNldFZpc3VhbCgiYm9yZGVyQ29sb3IiLF8pO3ZhciB3PXQudmlld0NoaWxkcmVuO2lmKHcmJncubGVuZ3RoKXt2YXIgUz1sKHQsZCxwLHYseCx3KTtmLmVhY2godyxmdW5jdGlvbih0LGUpe2lmKHQuZGVwdGg+PXUubGVuZ3RofHx0PT09dVt0LmRlcHRoXSl7dmFyIGE9aChkLHgsdCxlLFMsYyk7bih0LGEsaSxzLHUsYyl9fSl9ZWxzZSBtPW8oeCx0KSx0LnNldFZpc3VhbCgiY29sb3IiLG0pfX1mdW5jdGlvbiBhKHQsZSxpLG4pe3ZhciBhPWYuZXh0ZW5kKHt9LGUpO3JldHVybiBmLmVhY2goWyJjb2xvciIsImNvbG9yQWxwaGEiLCJjb2xvclNhdHVyYXRpb24iXSxmdW5jdGlvbihvKXt2YXIgcj10LmdldChvLCEwKTtudWxsPT1yJiZpJiYocj1pW29dKSxudWxsPT1yJiYocj1lW29dKSxudWxsPT1yJiYocj1uLmdldChvKSksbnVsbCE9ciYmKGFbb109cil9KSxhfWZ1bmN0aW9uIG8odCl7dmFyIGU9cyh0LCJjb2xvciIpO2lmKGUpe3ZhciBpPXModCwiY29sb3JBbHBoYSIpLG49cyh0LCJjb2xvclNhdHVyYXRpb24iKTtyZXR1cm4gbiYmKGU9ZC5tb2RpZnlIU0woZSxudWxsLG51bGwsbikpLGkmJihlPWQubW9kaWZ5QWxwaGEoZSxpKSksZX19ZnVuY3Rpb24gcih0LGUpe3JldHVybiBudWxsIT1lP2QubW9kaWZ5SFNMKGUsbnVsbCxudWxsLHQpOm51bGx9ZnVuY3Rpb24gcyh0LGUpe3ZhciBpPXRbZV07aWYobnVsbCE9aSYmIm5vbmUiIT09aSlyZXR1cm4gaX1mdW5jdGlvbiBsKHQsZSxpLG4sYSxvKXtpZihvJiZvLmxlbmd0aCl7dmFyIHI9dShlLCJjb2xvciIpfHxudWxsIT1hLmNvbG9yJiYibm9uZSIhPT1hLmNvbG9yJiYodShlLCJjb2xvckFscGhhIil8fHUoZSwiY29sb3JTYXR1cmF0aW9uIikpO2lmKHIpe3ZhciBzPWUuZ2V0KCJ2aXN1YWxNaW4iKSxsPWUuZ2V0KCJ2aXN1YWxNYXgiKSxoPWkuZGF0YUV4dGVudC5zbGljZSgpO251bGwhPXMmJnM8aFswXSYmKGhbMF09cyksbnVsbCE9bCYmbD5oWzFdJiYoaFsxXT1sKTt2YXIgZD1lLmdldCgiY29sb3JNYXBwaW5nQnkiKSxmPXt0eXBlOnIubmFtZSxkYXRhRXh0ZW50OmgsdmlzdWFsOnIucmFuZ2V9OyJjb2xvciIhPT1mLnR5cGV8fCJpbmRleCIhPT1kJiYiaWQiIT09ZD9mLm1hcHBpbmdNZXRob2Q9ImxpbmVhciI6KGYubWFwcGluZ01ldGhvZD0iY2F0ZWdvcnkiLGYubG9vcD0hMCk7dmFyIHA9bmV3IGMoZik7cmV0dXJuIHAuX19kckNvbG9yTWFwcGluZ0J5PWQscH19fWZ1bmN0aW9uIHUodCxlKXt2YXIgaT10LmdldChlKTtyZXR1cm4gcChpKSYmaS5sZW5ndGg/e25hbWU6ZSxyYW5nZTppfTpudWxsfWZ1bmN0aW9uIGgodCxlLGksbixhLG8pe3ZhciByPWYuZXh0ZW5kKHt9LGUpO2lmKGEpe3ZhciBzPWEudHlwZSxsPSJjb2xvciI9PT1zJiZhLl9fZHJDb2xvck1hcHBpbmdCeSx1PSJpbmRleCI9PT1sP246ImlkIj09PWw/by5tYXBJZFRvSW5kZXgoaS5nZXRJZCgpKTppLmdldFZhbHVlKHQuZ2V0KCJ2aXN1YWxEaW1lbnNpb24iKSk7cltzXT1hLm1hcFZhbHVlVG9WaXN1YWwodSl9cmV0dXJuIHJ9dmFyIGM9aSg4OCksZD1pKDIyKSxmPWkoMSkscD1mLmlzQXJyYXksZz0iaXRlbVN0eWxlLm5vcm1hbCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxpKXt2YXIgYT17bWFpblR5cGU6InNlcmllcyIsc3ViVHlwZToidHJlZW1hcCIscXVlcnk6aX07dC5lYWNoQ29tcG9uZW50KGEsZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXRhKCkudHJlZSxpPWUucm9vdCxhPXQuZ2V0TW9kZWwoZyk7aWYoIWkuaXNSZW1vdmVkKCkpe3ZhciBvPWYubWFwKGUubGV2ZWxNb2RlbHMsZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5nZXQoZyk6bnVsbH0pO24oaSx7fSxvLGEsdC5nZXRWaWV3Um9vdCgpLmdldEFuY2VzdG9ycygpLHQpfX0pfX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtpKDI0NCksaSgzNjIpfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLGksbil7dmFyIGE9dC5jb29yZFRvUG9pbnQoW2Usbl0pLG89dC5jb29yZFRvUG9pbnQoW2ksbl0pO3JldHVybnt4MTphWzBdLHkxOmFbMV0seDI6b1swXSx5MjpvWzFdfX12YXIgYT1pKDEpLG89aSgzKSxyPWkoMTEpLHM9WyJheGlzTGluZSIsImF4aXNMYWJlbCIsImF4aXNUaWNrIiwic3BsaXRMaW5lIiwic3BsaXRBcmVhIl07aSg0MSkuZXh0ZW5kKHt0eXBlOiJhbmdsZUF4aXMiLGF4aXNQb2ludGVyQ2xhc3M6IlBvbGFyQXhpc1BvaW50ZXIiLHJlbmRlcjpmdW5jdGlvbih0LGUpe2lmKHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciKSl7dmFyIGk9dC5heGlzLG49aS5wb2xhcixvPW4uZ2V0UmFkaXVzQXhpcygpLmdldEV4dGVudCgpLHI9aS5nZXRUaWNrc0Nvb3JkcygpOyJjYXRlZ29yeSIhPT1pLnR5cGUmJnIucG9wKCksYS5lYWNoKHMsZnVuY3Rpb24oZSl7IXQuZ2V0KGUrIi5zaG93Iil8fGkuc2NhbGUuaXNCbGFuaygpJiYiYXhpc0xpbmUiIT09ZXx8dGhpc1siXyIrZV0odCxuLHIsbyl9LHRoaXMpfX0sX2F4aXNMaW5lOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXQuZ2V0TW9kZWwoImF4aXNMaW5lLmxpbmVTdHlsZSIpLHI9bmV3IG8uQ2lyY2xlKHtzaGFwZTp7Y3g6ZS5jeCxjeTplLmN5LHI6blsxXX0sc3R5bGU6YS5nZXRMaW5lU3R5bGUoKSx6MjoxLHNpbGVudDohMH0pO3Iuc3R5bGUuZmlsbD1udWxsLHRoaXMuZ3JvdXAuYWRkKHIpfSxfYXhpc1RpY2s6ZnVuY3Rpb24odCxlLGkscil7dmFyIHM9dC5nZXRNb2RlbCgiYXhpc1RpY2siKSxsPShzLmdldCgiaW5zaWRlIik/LTE6MSkqcy5nZXQoImxlbmd0aCIpLHU9YS5tYXAoaSxmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8uTGluZSh7c2hhcGU6bihlLHJbMV0sclsxXStsLHQpfSl9KTt0aGlzLmdyb3VwLmFkZChvLm1lcmdlUGF0aCh1LHtzdHlsZTphLmRlZmF1bHRzKHMuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLmdldExpbmVTdHlsZSgpLHtzdHJva2U6dC5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpfSl9KSl9LF9heGlzTGFiZWw6ZnVuY3Rpb24odCxlLGksbil7Zm9yKHZhciBhPXQuYXhpcyxzPXQuZ2V0KCJkYXRhIiksbD10LmdldE1vZGVsKCJheGlzTGFiZWwiKSx1PXQuZ2V0Rm9ybWF0dGVkTGFiZWxzKCksaD1sLmdldCgibWFyZ2luIiksYz1hLmdldExhYmVsc0Nvb3JkcygpLGQ9MDtkPGkubGVuZ3RoO2QrKyl7dmFyIGY9blsxXSxwPWUuY29vcmRUb1BvaW50KFtmK2gsY1tkXV0pLGc9ZS5jeCxtPWUuY3ksdj1NYXRoLmFicyhwWzBdLWcpL2Y8LjM/ImNlbnRlciI6cFswXT5nPyJsZWZ0IjoicmlnaHQiLHk9TWF0aC5hYnMocFsxXS1tKS9mPC4zPyJtaWRkbGUiOnBbMV0+bT8idG9wIjoiYm90dG9tIjtzJiZzW2RdJiZzW2RdLnRleHRTdHlsZSYmKGw9bmV3IHIoc1tkXS50ZXh0U3R5bGUsbCxsLmVjTW9kZWwpKTt2YXIgeD1uZXcgby5UZXh0KHtzaWxlbnQ6ITB9KTt0aGlzLmdyb3VwLmFkZCh4KSxvLnNldFRleHRTdHlsZSh4LnN0eWxlLGwse3g6cFswXSx5OnBbMV0sdGV4dEZpbGw6bC5nZXRUZXh0Q29sb3IoKXx8dC5nZXQoImF4aXNMaW5lLmxpbmVTdHlsZS5jb2xvciIpLHRleHQ6dVtkXSx0ZXh0QWxpZ246dix0ZXh0VmVydGljYWxBbGlnbjp5fSl9fSxfc3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBzPXQuZ2V0TW9kZWwoInNwbGl0TGluZSIpLGw9cy5nZXRNb2RlbCgibGluZVN0eWxlIiksdT1sLmdldCgiY29sb3IiKSxoPTA7dT11IGluc3RhbmNlb2YgQXJyYXk/dTpbdV07Zm9yKHZhciBjPVtdLGQ9MDtkPGkubGVuZ3RoO2QrKyl7dmFyIGY9aCsrJXUubGVuZ3RoO2NbZl09Y1tmXXx8W10sY1tmXS5wdXNoKG5ldyBvLkxpbmUoe3NoYXBlOm4oZSxyWzBdLHJbMV0saVtkXSl9KSl9Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5ncm91cC5hZGQoby5tZXJnZVBhdGgoY1tkXSx7c3R5bGU6YS5kZWZhdWx0cyh7c3Ryb2tlOnVbZCV1Lmxlbmd0aF19LGwuZ2V0TGluZVN0eWxlKCkpLHNpbGVudDohMCx6OnQuZ2V0KCJ6Iil9KSl9LF9zcGxpdEFyZWE6ZnVuY3Rpb24odCxlLGksbil7dmFyIHI9dC5nZXRNb2RlbCgic3BsaXRBcmVhIikscz1yLmdldE1vZGVsKCJhcmVhU3R5bGUiKSxsPXMuZ2V0KCJjb2xvciIpLHU9MDtsPWwgaW5zdGFuY2VvZiBBcnJheT9sOltsXTtmb3IodmFyIGg9W10sYz1NYXRoLlBJLzE4MCxkPS1pWzBdKmMsZj1NYXRoLm1pbihuWzBdLG5bMV0pLHA9TWF0aC5tYXgoblswXSxuWzFdKSxnPXQuZ2V0KCJjbG9ja3dpc2UiKSxtPTE7bTxpLmxlbmd0aDttKyspe3ZhciB2PXUrKyVsLmxlbmd0aDtoW3ZdPWhbdl18fFtdLGhbdl0ucHVzaChuZXcgby5TZWN0b3Ioe3NoYXBlOntjeDplLmN4LGN5OmUuY3kscjA6ZixyOnAsc3RhcnRBbmdsZTpkLGVuZEFuZ2xlOi1pW21dKmMsY2xvY2t3aXNlOmd9LHNpbGVudDohMH0pKSxkPS1pW21dKmN9Zm9yKHZhciBtPTA7bTxoLmxlbmd0aDttKyspdGhpcy5ncm91cC5hZGQoby5tZXJnZVBhdGgoaFttXSx7c3R5bGU6YS5kZWZhdWx0cyh7ZmlsbDpsW20lbC5sZW5ndGhdfSxzLmdldEFyZWFTdHlsZSgpKSxzaWxlbnQ6ITB9KSl9fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXtyZXR1cm4gaSYmImF4aXNBcmVhU2VsZWN0Ij09PWkudHlwZSYmZS5maW5kQ29tcG9uZW50cyh7bWFpblR5cGU6InBhcmFsbGVsQXhpcyIscXVlcnk6aX0pWzBdPT09dH1mdW5jdGlvbiBhKHQpe3ZhciBlPXQuYXhpcztyZXR1cm4gci5tYXAodC5hY3RpdmVJbnRlcnZhbHMsZnVuY3Rpb24odCl7cmV0dXJue2JydXNoVHlwZToibGluZVgiLHBhbmVsSWQ6InBsIixyYW5nZTpbZS5kYXRhVG9Db29yZCh0WzBdLCEwKSxlLmRhdGFUb0Nvb3JkKHRbMV0sITApXX19KX1mdW5jdGlvbiBvKHQsZSl7cmV0dXJuIGUuZ2V0Q29tcG9uZW50KCJwYXJhbGxlbCIsdC5nZXQoInBhcmFsbGVsSW5kZXgiKSl9dmFyIHI9aSgxKSxzPWkoNDApLGw9aSgxMzIpLHU9aSgxOTEpLGg9aSgzKSxjPVsiYXhpc0xpbmUiLCJheGlzVGlja0xhYmVsIiwiYXhpc05hbWUiXSxkPWkoMikuZXh0ZW5kQ29tcG9uZW50Vmlldyh7dHlwZToicGFyYWxsZWxBeGlzIixpbml0OmZ1bmN0aW9uKHQsZSl7ZC5zdXBlckFwcGx5KHRoaXMsImluaXQiLGFyZ3VtZW50cyksKHRoaXMuX2JydXNoQ29udHJvbGxlcj1uZXcgbChlLmdldFpyKCkpKS5vbigiYnJ1c2giLHIuYmluZCh0aGlzLl9vbkJydXNoLHRoaXMpKX0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLGEpe2lmKCFuKHQsZSxhKSl7dGhpcy5heGlzTW9kZWw9dCx0aGlzLmFwaT1pLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7dmFyIGw9dGhpcy5fYXhpc0dyb3VwO2lmKHRoaXMuX2F4aXNHcm91cD1uZXcgaC5Hcm91cCx0aGlzLmdyb3VwLmFkZCh0aGlzLl9heGlzR3JvdXApLHQuZ2V0KCJzaG93Iikpe3ZhciB1PW8odCxlKSxkPXUuY29vcmRpbmF0ZVN5c3RlbSxmPXQuZ2V0QXJlYVNlbGVjdFN0eWxlKCkscD1mLndpZHRoLGc9dC5heGlzLmRpbSxtPWQuZ2V0QXhpc0xheW91dChnKSx2PXIuZXh0ZW5kKHtzdHJva2VDb250YWluVGhyZXNob2xkOnB9LG0pLHk9bmV3IHModCx2KTtyLmVhY2goYyx5LmFkZCx5KSx0aGlzLl9heGlzR3JvdXAuYWRkKHkuZ2V0R3JvdXAoKSksdGhpcy5fcmVmcmVzaEJydXNoQ29udHJvbGxlcih2LGYsdCx1LHAsaSk7dmFyIHg9YSYmYS5hbmltYXRpb249PT0hMT9udWxsOnQ7aC5ncm91cFRyYW5zaXRpb24obCx0aGlzLl9heGlzR3JvdXAseCl9fX0sdXBkYXRlVmlzdWFsOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuX2JydXNoQ29udHJvbGxlciYmdGhpcy5fYnJ1c2hDb250cm9sbGVyLnVwZGF0ZUNvdmVycyhhKHQpKX0sX3JlZnJlc2hCcnVzaENvbnRyb2xsZXI6ZnVuY3Rpb24odCxlLGksbixvLHIpe3ZhciBzPWkuYXhpcy5nZXRFeHRlbnQoKSxsPXNbMV0tc1swXSxjPU1hdGgubWluKDMwLC4xKk1hdGguYWJzKGwpKSxkPWguQm91bmRpbmdSZWN0LmNyZWF0ZSh7eDpzWzBdLHk6LW8vMix3aWR0aDpsLGhlaWdodDpvfSk7ZC54LT1jLGQud2lkdGgrPTIqYyx0aGlzLl9icnVzaENvbnRyb2xsZXIubW91bnQoe2VuYWJsZUdsb2JhbFBhbjohMCxyb3RhdGlvbjp0LnJvdGF0aW9uLHBvc2l0aW9uOnQucG9zaXRpb259KS5zZXRQYW5lbHMoW3twYW5lbElkOiJwbCIsY2xpcFBhdGg6dS5tYWtlUmVjdFBhbmVsQ2xpcFBhdGgoZCksaXNUYXJnZXRCeUN1cnNvcjp1Lm1ha2VSZWN0SXNUYXJnZXRCeUN1cnNvcihkLHIsbiksZ2V0TGluZWFyQnJ1c2hPdGhlckV4dGVudDp1Lm1ha2VMaW5lYXJCcnVzaE90aGVyRXh0ZW50KGQsMCl9XSkuZW5hYmxlQnJ1c2goe2JydXNoVHlwZToibGluZVgiLGJydXNoU3R5bGU6ZSxyZW1vdmVPbkNsaWNrOiEwfSkudXBkYXRlQ292ZXJzKGEoaSkpfSxfb25CcnVzaDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuYXhpc01vZGVsLG49aS5heGlzLGE9ci5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm5bbi5jb29yZFRvRGF0YSh0LnJhbmdlWzBdLCEwKSxuLmNvb3JkVG9EYXRhKHQucmFuZ2VbMV0sITApXX0pOyghaS5vcHRpb24ucmVhbHRpbWU9PT1lLmlzRW5kfHxlLnJlbW92ZU9uQ2xpY2spJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiYXhpc0FyZWFTZWxlY3QiLHBhcmFsbGVsQXhpc0lkOmkuaWQsaW50ZXJ2YWxzOmF9KX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuX2JydXNoQ29udHJvbGxlci5kaXNwb3NlKCl9fSk7dC5leHBvcnRzPWR9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUsaSl7cmV0dXJue3Bvc2l0aW9uOlt0LmN4LHQuY3ldLHJvdGF0aW9uOmkvMTgwKk1hdGguUEksbGFiZWxEaXJlY3Rpb246LTEsdGlja0RpcmVjdGlvbjotMSxuYW1lRGlyZWN0aW9uOjEsbGFiZWxSb3RhdGU6ZS5nZXRNb2RlbCgiYXhpc0xhYmVsIikuZ2V0KCJyb3RhdGUiKSx6MjoxfX12YXIgYT1pKDEpLG89aSgzKSxyPWkoNDApLHM9WyJheGlzTGluZSIsImF4aXNUaWNrTGFiZWwiLCJheGlzTmFtZSJdLGw9WyJzcGxpdExpbmUiLCJzcGxpdEFyZWEiXTtpKDQxKS5leHRlbmQoe3R5cGU6InJhZGl1c0F4aXMiLGF4aXNQb2ludGVyQ2xhc3M6IlBvbGFyQXhpc1BvaW50ZXIiLHJlbmRlcjpmdW5jdGlvbih0LGUpe2lmKHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciKSl7dmFyIGk9dC5heGlzLG89aS5wb2xhcix1PW8uZ2V0QW5nbGVBeGlzKCksaD1pLmdldFRpY2tzQ29vcmRzKCksYz11LmdldEV4dGVudCgpWzBdLGQ9aS5nZXRFeHRlbnQoKSxmPW4obyx0LGMpLHA9bmV3IHIodCxmKTthLmVhY2gocyxwLmFkZCxwKSx0aGlzLmdyb3VwLmFkZChwLmdldEdyb3VwKCkpLGEuZWFjaChsLGZ1bmN0aW9uKGUpe3QuZ2V0KGUrIi5zaG93IikmJiFpLnNjYWxlLmlzQmxhbmsoKSYmdGhpc1siXyIrZV0odCxvLGMsZCxoKX0sdGhpcyl9fSxfc3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSxpLG4scil7dmFyIHM9dC5nZXRNb2RlbCgic3BsaXRMaW5lIiksbD1zLmdldE1vZGVsKCJsaW5lU3R5bGUiKSx1PWwuZ2V0KCJjb2xvciIpLGg9MDt1PXUgaW5zdGFuY2VvZiBBcnJheT91Olt1XTtmb3IodmFyIGM9W10sZD0wO2Q8ci5sZW5ndGg7ZCsrKXt2YXIgZj1oKysldS5sZW5ndGg7Y1tmXT1jW2ZdfHxbXSxjW2ZdLnB1c2gobmV3IG8uQ2lyY2xlKHtzaGFwZTp7Y3g6ZS5jeCxjeTplLmN5LHI6cltkXX0sc2lsZW50OiEwfSkpfWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZ3JvdXAuYWRkKG8ubWVyZ2VQYXRoKGNbZF0se3N0eWxlOmEuZGVmYXVsdHMoe3N0cm9rZTp1W2QldS5sZW5ndGhdLGZpbGw6bnVsbH0sbC5nZXRMaW5lU3R5bGUoKSksc2lsZW50OiEwfSkpfSxfc3BsaXRBcmVhOmZ1bmN0aW9uKHQsZSxpLG4scil7dmFyIHM9dC5nZXRNb2RlbCgic3BsaXRBcmVhIiksbD1zLmdldE1vZGVsKCJhcmVhU3R5bGUiKSx1PWwuZ2V0KCJjb2xvciIpLGg9MDt1PXUgaW5zdGFuY2VvZiBBcnJheT91Olt1XTtmb3IodmFyIGM9W10sZD1yWzBdLGY9MTtmPHIubGVuZ3RoO2YrKyl7dmFyIHA9aCsrJXUubGVuZ3RoO2NbcF09Y1twXXx8W10sY1twXS5wdXNoKG5ldyBvLlNlY3Rvcih7c2hhcGU6e2N4OmUuY3gsY3k6ZS5jeSxyMDpkLHI6cltmXSxzdGFydEFuZ2xlOjAsZW5kQW5nbGU6MipNYXRoLlBJfSxzaWxlbnQ6ITB9KSksZD1yW2ZdfWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXRoaXMuZ3JvdXAuYWRkKG8ubWVyZ2VQYXRoKGNbZl0se3N0eWxlOmEuZGVmYXVsdHMoe2ZpbGw6dVtmJXUubGVuZ3RoXX0sbC5nZXRBcmVhU3R5bGUoKSksc2lsZW50OiEwfSkpfX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSg0MCksYT1pKDEpLG89aSgzKSxyPWkoMjU2KSxzPW4uZ2V0SW50ZXJ2YWwsbD1uLmlmSWdub3JlT25UaWNrLHU9WyJheGlzTGluZSIsImF4aXNUaWNrTGFiZWwiLCJheGlzTmFtZSJdLGg9InNwbGl0TGluZSIsYz1pKDQxKS5leHRlbmQoe3R5cGU6InNpbmdsZUF4aXMiLGF4aXNQb2ludGVyQ2xhc3M6IlNpbmdsZUF4aXNQb2ludGVyIixyZW5kZXI6ZnVuY3Rpb24odCxlLGksbyl7dmFyIHM9dGhpcy5ncm91cDtzLnJlbW92ZUFsbCgpO3ZhciBsPXIubGF5b3V0KHQpLGQ9bmV3IG4odCxsKTthLmVhY2godSxkLmFkZCxkKSxzLmFkZChkLmdldEdyb3VwKCkpLHQuZ2V0KGgrIi5zaG93IikmJnRoaXNbIl8iK2hdKHQsbC5sYWJlbEludGVydmFsKSxjLnN1cGVyQ2FsbCh0aGlzLCJyZW5kZXIiLHQsZSxpLG8pfSxfc3BsaXRMaW5lOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5heGlzO2lmKCFpLnNjYWxlLmlzQmxhbmsoKSl7dmFyIG49dC5nZXRNb2RlbCgic3BsaXRMaW5lIiksYT1uLmdldE1vZGVsKCJsaW5lU3R5bGUiKSxyPWEuZ2V0KCJ3aWR0aCIpLHU9YS5nZXQoImNvbG9yIiksaD1zKG4sZSk7dT11IGluc3RhbmNlb2YgQXJyYXk/dTpbdV07Zm9yKHZhciBjPXQuY29vcmRpbmF0ZVN5c3RlbS5nZXRSZWN0KCksZD1pLmlzSG9yaXpvbnRhbCgpLGY9W10scD0wLGc9aS5nZXRUaWNrc0Nvb3JkcygpLG09W10sdj1bXSx5PXQuZ2V0KCJheGlzTGFiZWwuc2hvd01pbkxhYmVsIikseD10LmdldCgiYXhpc0xhYmVsLnNob3dNYXhMYWJlbCIpLF89MDtfPGcubGVuZ3RoOysrXylpZighbChpLF8saCxnLmxlbmd0aCx5LHgpKXt2YXIgYj1pLnRvR2xvYmFsQ29vcmQoZ1tfXSk7ZD8obVswXT1iLG1bMV09Yy55LHZbMF09Yix2WzFdPWMueStjLmhlaWdodCk6KG1bMF09Yy54LG1bMV09Yix2WzBdPWMueCtjLndpZHRoLHZbMV09Yik7dmFyIHc9cCsrJXUubGVuZ3RoO2Zbd109Zlt3XXx8W10sZlt3XS5wdXNoKG5ldyBvLkxpbmUoby5zdWJQaXhlbE9wdGltaXplTGluZSh7c2hhcGU6e3gxOm1bMF0seTE6bVsxXSx4Mjp2WzBdLHkyOnZbMV19LHN0eWxlOntsaW5lV2lkdGg6cn0sc2lsZW50OiEwfSkpKX1mb3IodmFyIF89MDtfPGYubGVuZ3RoOysrXyl0aGlzLmdyb3VwLmFkZChvLm1lcmdlUGF0aChmW19dLHtzdHlsZTp7c3Ryb2tlOnVbXyV1Lmxlbmd0aF0sbGluZURhc2g6YS5nZXRMaW5lRGFzaChyKSxsaW5lV2lkdGg6cn0sc2lsZW50OiEwfSkpfX19KTt0LmV4cG9ydHM9Y30sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMiksYT17dHlwZToiYXhpc0FyZWFTZWxlY3QiLGV2ZW50OiJheGlzQXJlYVNlbGVjdGVkIix1cGRhdGU6InVwZGF0ZVZpc3VhbCJ9O24ucmVnaXN0ZXJBY3Rpb24oYSxmdW5jdGlvbih0LGUpe2UuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6InBhcmFsbGVsQXhpcyIscXVlcnk6dH0sZnVuY3Rpb24oZSl7ZS5heGlzLm1vZGVsLnNldEFjdGl2ZUludGVydmFscyh0LmludGVydmFscyl9KX0pLG4ucmVnaXN0ZXJBY3Rpb24oInBhcmFsbGVsQXhpc0V4cGFuZCIsZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJwYXJhbGxlbCIscXVlcnk6dH0sZnVuY3Rpb24oZSl7ZS5zZXRBeGlzRXhwYW5kKHQpfSl9KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpLG4sYSl7dmFyIG89ZS5heGlzLHM9by5kYXRhVG9Db29yZCh0KSxoPW4uZ2V0QW5nbGVBeGlzKCkuZ2V0RXh0ZW50KClbMF07aD1oLzE4MCpNYXRoLlBJO3ZhciBjLGQsZixwPW4uZ2V0UmFkaXVzQXhpcygpLmdldEV4dGVudCgpO2lmKCJyYWRpdXMiPT09by5kaW0pe3ZhciBnPWwuY3JlYXRlKCk7bC5yb3RhdGUoZyxnLGgpLGwudHJhbnNsYXRlKGcsZyxbbi5jeCxuLmN5XSksYz1yLmFwcGx5VHJhbnNmb3JtKFtzLC1hXSxnKTt2YXIgbT1lLmdldE1vZGVsKCJheGlzTGFiZWwiKS5nZXQoInJvdGF0ZSIpfHwwLHY9dS5pbm5lclRleHRMYXlvdXQoaCxtKk1hdGguUEkvMTgwLC0xKTtkPXYudGV4dEFsaWduLGY9di50ZXh0VmVydGljYWxBbGlnbn1lbHNle3ZhciB5PXBbMV07Yz1uLmNvb3JkVG9Qb2ludChbeSthLHNdKTt2YXIgeD1uLmN4LF89bi5jeTtkPU1hdGguYWJzKGNbMF0teCkveTwuMz8iY2VudGVyIjpjWzBdPng/ImxlZnQiOiJyaWdodCIsZj1NYXRoLmFicyhjWzFdLV8pL3k8LjM/Im1pZGRsZSI6Y1sxXT5fPyJ0b3AiOiJib3R0b20ifXJldHVybntwb3NpdGlvbjpjLGFsaWduOmQsdmVydGljYWxBbGlnbjpmfX12YXIgYT1pKDcpLG89aSgxMjQpLHI9aSgzKSxzPWkoODEpLGw9aSgxOSksdT1pKDQwKSxoPWkoNDEpLGM9by5leHRlbmQoe21ha2VFbE9wdGlvbjpmdW5jdGlvbih0LGUsaSxvLHIpe3ZhciBsPWkuYXhpczsiYW5nbGUiPT09bC5kaW0mJih0aGlzLmFuaW1hdGlvblRocmVzaG9sZD1NYXRoLlBJLzE4KTt2YXIgdSxoPWwucG9sYXIsYz1oLmdldE90aGVyQXhpcyhsKSxmPWMuZ2V0RXh0ZW50KCk7dT1sWyJkYXRhVG8iK2EuY2FwaXRhbEZpcnN0KGwuZGltKV0oZSk7dmFyIHA9by5nZXQoInR5cGUiKTtpZihwJiYibm9uZSIhPT1wKXt2YXIgZz1zLmJ1aWxkRWxTdHlsZShvKSxtPWRbcF0obCxoLHUsZixnKTttLnN0eWxlPWcsdC5ncmFwaGljS2V5PW0udHlwZSx0LnBvaW50ZXI9bX12YXIgdj1vLmdldCgibGFiZWwubWFyZ2luIikseT1uKGUsaSxvLGgsdik7cy5idWlsZExhYmVsRWxPcHRpb24odCxpLG8scix5KX19KSxkPXtsaW5lOmZ1bmN0aW9uKHQsZSxpLG4sYSl7cmV0dXJuImFuZ2xlIj09PXQuZGltP3t0eXBlOiJMaW5lIixzaGFwZTpzLm1ha2VMaW5lU2hhcGUoZS5jb29yZFRvUG9pbnQoW25bMF0saV0pLGUuY29vcmRUb1BvaW50KFtuWzFdLGldKSl9Ont0eXBlOiJDaXJjbGUiLHNoYXBlOntjeDplLmN4LGN5OmUuY3kscjppfX19LHNoYWRvdzpmdW5jdGlvbih0LGUsaSxuLGEpe3ZhciBvPXQuZ2V0QmFuZFdpZHRoKCkscj1NYXRoLlBJLzE4MDtyZXR1cm4iYW5nbGUiPT09dC5kaW0/e3R5cGU6IlNlY3RvciIsc2hhcGU6cy5tYWtlU2VjdG9yU2hhcGUoZS5jeCxlLmN5LG5bMF0sblsxXSwoLWktby8yKSpyLCgtaStvLzIpKnIpfTp7dHlwZToiU2VjdG9yIixzaGFwZTpzLm1ha2VTZWN0b3JTaGFwZShlLmN4LGUuY3ksaS1vLzIsaStvLzIsMCwyKk1hdGguUEkpfX19O2gucmVnaXN0ZXJBeGlzUG9pbnRlckNsYXNzKCJQb2xhckF4aXNQb2ludGVyIixjKSx0LmV4cG9ydHM9Y30sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0LmlzSG9yaXpvbnRhbCgpPzA6MX1mdW5jdGlvbiBhKHQsZSl7dmFyIGk9dC5nZXRSZWN0KCk7cmV0dXJuW2lbaFtlXV0saVtoW2VdXStpW2NbZV1dXX12YXIgbz1pKDMpLHI9aSgxMjQpLHM9aSg4MSksbD1pKDI1NiksdT1pKDQxKSxoPVsieCIsInkiXSxjPVsid2lkdGgiLCJoZWlnaHQiXSxkPXIuZXh0ZW5kKHttYWtlRWxPcHRpb246ZnVuY3Rpb24odCxlLGksbyxyKXt2YXIgdT1pLmF4aXMsaD11LmNvb3JkaW5hdGVTeXN0ZW0sYz1hKGgsMS1uKHUpKSxkPWguZGF0YVRvUG9pbnQoZSlbMF0scD1vLmdldCgidHlwZSIpO2lmKHAmJiJub25lIiE9PXApe3ZhciBnPXMuYnVpbGRFbFN0eWxlKG8pLG09ZltwXSh1LGQsYyxnKTttLnN0eWxlPWcsdC5ncmFwaGljS2V5PW0udHlwZSx0LnBvaW50ZXI9bX12YXIgdj1sLmxheW91dChpKTtzLmJ1aWxkQ2FydGVzaWFuU2luZ2xlTGFiZWxFbE9wdGlvbihlLHQsdixpLG8scil9LGdldEhhbmRsZVRyYW5zZm9ybTpmdW5jdGlvbih0LGUsaSl7dmFyIG49bC5sYXlvdXQoZSx7bGFiZWxJbnNpZGU6ITF9KTtyZXR1cm4gbi5sYWJlbE1hcmdpbj1pLmdldCgiaGFuZGxlLm1hcmdpbiIpLHtwb3NpdGlvbjpzLmdldFRyYW5zZm9ybWVkUG9zaXRpb24oZS5heGlzLHQsbikscm90YXRpb246bi5yb3RhdGlvbisobi5sYWJlbERpcmVjdGlvbjwwP01hdGguUEk6MCl9fSx1cGRhdGVIYW5kbGVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLGksbyl7dmFyIHI9aS5heGlzLHM9ci5jb29yZGluYXRlU3lzdGVtLGw9bihyKSx1PWEocyxsKSxoPXQucG9zaXRpb247aFtsXSs9ZVtsXSxoW2xdPU1hdGgubWluKHVbMV0saFtsXSksaFtsXT1NYXRoLm1heCh1WzBdLGhbbF0pO3ZhciBjPWEocywxLWwpLGQ9KGNbMV0rY1swXSkvMixmPVtkLGRdO3JldHVybiBmW2xdPWhbbF0se3Bvc2l0aW9uOmgscm90YXRpb246dC5yb3RhdGlvbixjdXJzb3JQb2ludDpmLHRvb2x0aXBPcHRpb246e3ZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9fX19KSxmPXtsaW5lOmZ1bmN0aW9uKHQsZSxpLGEpe3ZhciByPXMubWFrZUxpbmVTaGFwZShbZSxpWzBdXSxbZSxpWzFdXSxuKHQpKTtyZXR1cm4gby5zdWJQaXhlbE9wdGltaXplTGluZSh7c2hhcGU6cixzdHlsZTphfSkse3R5cGU6IkxpbmUiLHNoYXBlOnJ9fSxzaGFkb3c6ZnVuY3Rpb24odCxlLGksYSl7dmFyIG89dC5nZXRCYW5kV2lkdGgoKSxyPWlbMV0taVswXTtyZXR1cm57dHlwZToiUmVjdCIsc2hhcGU6cy5tYWtlUmVjdFNoYXBlKFtlLW8vMixpWzBdXSxbbyxyXSxuKHQpKX19fTt1LnJlZ2lzdGVyQXhpc1BvaW50ZXJDbGFzcygiU2luZ2xlQXhpc1BvaW50ZXIiLGQpLHQuZXhwb3J0cz1kfSxmdW5jdGlvbih0LGUsaSl7aSgyKS5yZWdpc3RlclByZXByb2Nlc3NvcihpKDM3MykpLGkoMzc1KSxpKDM3MCksaSgzNzEpLGkoMzcyKSxpKDM5NCl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIG8ubWVyZ2Uoe2JydXNoVHlwZTp0LmJydXNoVHlwZSxicnVzaE1vZGU6dC5icnVzaE1vZGUsdHJhbnNmb3JtYWJsZTp0LnRyYW5zZm9ybWFibGUsYnJ1c2hTdHlsZTpuZXcgcyh0LmJydXNoU3R5bGUpLmdldEl0ZW1TdHlsZSgpLHJlbW92ZU9uQ2xpY2s6dC5yZW1vdmVPbkNsaWNrLHo6dC56fSxlLCEwKX12YXIgYT1pKDIpLG89aSgxKSxyPWkoMTkzKSxzPWkoMTEpLGw9WyIjZGRkIl0sdT1hLmV4dGVuZENvbXBvbmVudE1vZGVsKHt0eXBlOiJicnVzaCIsZGVwZW5kZW5jaWVzOlsiZ2VvIiwiZ3JpZCIsInhBeGlzIiwieUF4aXMiLCJwYXJhbGxlbCIsInNlcmllcyJdLGRlZmF1bHRPcHRpb246e3Rvb2xib3g6bnVsbCxicnVzaExpbms6bnVsbCxzZXJpZXNJbmRleDoiYWxsIixnZW9JbmRleDpudWxsLHhBeGlzSW5kZXg6bnVsbCx5QXhpc0luZGV4Om51bGwsYnJ1c2hUeXBlOiJyZWN0IixicnVzaE1vZGU6InNpbmdsZSIsdHJhbnNmb3JtYWJsZTohMCxicnVzaFN0eWxlOntib3JkZXJXaWR0aDoxLGNvbG9yOiJyZ2JhKDEyMCwxNDAsMTgwLDAuMykiLGJvcmRlckNvbG9yOiJyZ2JhKDEyMCwxNDAsMTgwLDAuOCkifSx0aHJvdHRsZVR5cGU6ImZpeFJhdGUiLHRocm90dGxlRGVsYXk6MCxyZW1vdmVPbkNsaWNrOiEwLHo6MWU0fSxhcmVhczpbXSxicnVzaFR5cGU6bnVsbCxicnVzaE9wdGlvbjp7fSxjb29yZEluZm9MaXN0OltdLG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm9wdGlvbjshZSYmci5yZXBsYWNlVmlzdWFsT3B0aW9uKGksdCxbImluQnJ1c2giLCJvdXRPZkJydXNoIl0pLGkuaW5CcnVzaD1pLmluQnJ1c2h8fHt9LGkub3V0T2ZCcnVzaD1pLm91dE9mQnJ1c2h8fHtjb2xvcjpsfX0sc2V0QXJlYXM6ZnVuY3Rpb24odCl7dCYmKHRoaXMuYXJlYXM9by5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLm9wdGlvbix0KX0sdGhpcykpfSxzZXRCcnVzaE9wdGlvbjpmdW5jdGlvbih0KXt0aGlzLmJydXNoT3B0aW9uPW4odGhpcy5vcHRpb24sdCksdGhpcy5icnVzaFR5cGU9dGhpcy5icnVzaE9wdGlvbi5icnVzaFR5cGV9fSk7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpLG4peyghbnx8bi4kZnJvbSE9PXQuaWQpJiZ0aGlzLl9icnVzaENvbnRyb2xsZXIuc2V0UGFuZWxzKHQuYnJ1c2hUYXJnZXRNYW5hZ2VyLm1ha2VQYW5lbE9wdHMoaSkpLmVuYWJsZUJydXNoKHQuYnJ1c2hPcHRpb24pLnVwZGF0ZUNvdmVycyh0LmFyZWFzLnNsaWNlKCkpfXZhciBhPWkoMSksbz1pKDEzMikscj1pKDIpO3QuZXhwb3J0cz1yLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6ImJydXNoIixpbml0OmZ1bmN0aW9uKHQsZSl7dGhpcy5lY01vZGVsPXQsdGhpcy5hcGk9ZSx0aGlzLm1vZGVsLCh0aGlzLl9icnVzaENvbnRyb2xsZXI9bmV3IG8oZS5nZXRacigpKSkub24oImJydXNoIixhLmJpbmQodGhpcy5fb25CcnVzaCx0aGlzKSkubW91bnQoKX0scmVuZGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1vZGVsPXQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHVwZGF0ZVZpZXc6bix1cGRhdGVMYXlvdXQ6bix1cGRhdGVWaXN1YWw6bixkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fYnJ1c2hDb250cm9sbGVyLmRpc3Bvc2UoKX0sX29uQnJ1c2g6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLm1vZGVsLmlkO3RoaXMubW9kZWwuYnJ1c2hUYXJnZXRNYW5hZ2VyLnNldE91dHB1dFJhbmdlcyh0LHRoaXMuZWNNb2RlbCksKCFlLmlzRW5kfHxlLnJlbW92ZU9uQ2xpY2spJiZ0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToiYnJ1c2giLGJydXNoSWQ6aSxhcmVhczphLmNsb25lKHQpLCRmcm9tOml9KX19KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMik7bi5yZWdpc3RlckFjdGlvbih7dHlwZToiYnJ1c2giLGV2ZW50OiJicnVzaCIsdXBkYXRlOiJ1cGRhdGVWaWV3In0sZnVuY3Rpb24odCxlKXtlLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJicnVzaCIscXVlcnk6dH0sZnVuY3Rpb24oZSl7ZS5zZXRBcmVhcyh0LmFyZWFzKX0pfSksbi5yZWdpc3RlckFjdGlvbih7dHlwZToiYnJ1c2hTZWxlY3QiLGV2ZW50OiJicnVzaFNlbGVjdGVkIix1cGRhdGU6Im5vbmUifSxmdW5jdGlvbigpe30pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt2YXIgZT17fTthLmVhY2godCxmdW5jdGlvbih0KXtlW3RdPTF9KSx0Lmxlbmd0aD0wLGEuZWFjaChlLGZ1bmN0aW9uKGUsaSl7dC5wdXNoKGkpfSl9dmFyIGE9aSgxKSxvPVsicmVjdCIsInBvbHlnb24iLCJrZWVwIiwiY2xlYXIiXTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT10JiZ0LmJydXNoO2lmKGEuaXNBcnJheShpKXx8KGk9aT9baV06W10pLGkubGVuZ3RoKXt2YXIgcj1bXTthLmVhY2goaSxmdW5jdGlvbih0KXt2YXIgZT10Lmhhc093blByb3BlcnR5KCJ0b29sYm94Iik/dC50b29sYm94OltdO2UgaW5zdGFuY2VvZiBBcnJheSYmKHI9ci5jb25jYXQoZSkpfSk7dmFyIHM9dCYmdC50b29sYm94O2EuaXNBcnJheShzKSYmKHM9c1swXSksc3x8KHM9e2ZlYXR1cmU6e319LHQudG9vbGJveD1bc10pO3ZhciBsPXMuZmVhdHVyZXx8KHMuZmVhdHVyZT17fSksdT1sLmJydXNofHwobC5icnVzaD17fSksaD11LnR5cGV8fCh1LnR5cGU9W10pO2gucHVzaC5hcHBseShoLHIpLG4oaCksZSYmIWgubGVuZ3RoJiZoLnB1c2guYXBwbHkoaCxvKX19fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0KXt2YXIgZT1bIngiLCJ5Il0saT1bIndpZHRoIiwiaGVpZ2h0Il07cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUsaSxuKXt2YXIgbz1uLnJhbmdlLHI9ZVt0XTtyZXR1cm4gYShyLG8pfSxyZWN0OmZ1bmN0aW9uKG4sbyxyKXt2YXIgcz1yLnJhbmdlLGw9W25bZVt0XV0sbltlW3RdXStuW2lbdF1dXTtyZXR1cm4gbFsxXTxsWzBdJiZsLnJldmVyc2UoKSxhKGxbMF0scyl8fGEobFsxXSxzKXx8YShzWzBdLGwpfHxhKHNbMV0sbCl9fX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGVbMF08PXQmJnQ8PWVbMV19ZnVuY3Rpb24gbyh0LGUsaSxuLGEpe2Zvcih2YXIgbz0wLHM9YVthLmxlbmd0aC0xXTtvPGEubGVuZ3RoO28rKyl7dmFyIGw9YVtvXTtpZihyKHQsZSxpLG4sbFswXSxsWzFdLHNbMF0sc1sxXSkpcmV0dXJuITA7cz1sfX1mdW5jdGlvbiByKHQsZSxpLG4sYSxvLHIsdSl7dmFyIGg9bChpLXQsYS1yLG4tZSxvLXUpO2lmKHMoaCkpcmV0dXJuITE7dmFyIGM9bChhLXQsYS1yLG8tZSxvLXUpL2g7aWYoYzwwfHxjPjEpcmV0dXJuITE7CnZhciBkPWwoaS10LGEtdCxuLWUsby1lKS9oO3JldHVybiEoZDwwfHxkPjEpfWZ1bmN0aW9uIHModCl7cmV0dXJuIHQ8PTFlLTYmJnQ+PS0xZS02fWZ1bmN0aW9uIGwodCxlLGksbil7cmV0dXJuIHQqbi1lKml9dmFyIHU9aSgyNzUpLmNvbnRhaW4saD1pKDEyKSxjPXtsaW5lWDpuKDApLGxpbmVZOm4oMSkscmVjdDp7cG9pbnQ6ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpLmJvdW5kaW5nUmVjdC5jb250YWluKHRbMF0sdFsxXSl9LHJlY3Q6ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpLmJvdW5kaW5nUmVjdC5pbnRlcnNlY3QodCl9fSxwb2x5Z29uOntwb2ludDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIGkuYm91bmRpbmdSZWN0LmNvbnRhaW4odFswXSx0WzFdKSYmdShpLnJhbmdlLHRbMF0sdFsxXSl9LHJlY3Q6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkucmFuZ2U7aWYobi5sZW5ndGg8PTEpcmV0dXJuITE7dmFyIGE9dC54LHI9dC55LHM9dC53aWR0aCxsPXQuaGVpZ2h0LGM9blswXTtyZXR1cm4hISh1KG4sYSxyKXx8dShuLGErcyxyKXx8dShuLGEscitsKXx8dShuLGErcyxyK2wpfHxoLmNyZWF0ZSh0KS5jb250YWluKGNbMF0sY1sxXSl8fG8oYSxyLGErcyxyLG4pfHxvKGEscixhLHIrbCxuKXx8byhhK3MscixhK3MscitsLG4pfHxvKGEscitsLGErcyxyK2wsbikpfHx2b2lkIDB9fX07dC5leHBvcnRzPWN9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpLG4sbyl7aWYobyl7dmFyIHI9dC5nZXRacigpO2lmKCFyW3hdKXtyW3ldfHwoclt5XT1hKTt2YXIgcz1nLmNyZWF0ZU9yVXBkYXRlKHIseSxpLGUpO3ModCxuKX19fWZ1bmN0aW9uIGEodCxlKXtpZighdC5pc0Rpc3Bvc2VkKCkpe3ZhciBpPXQuZ2V0WnIoKTtpW3hdPSEwLHQuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImJydXNoU2VsZWN0IixiYXRjaDplfSksaVt4XT0hMX19ZnVuY3Rpb24gbyh0LGUsaSxuKXtmb3IodmFyIGE9MCxvPWUubGVuZ3RoO2E8bzthKyspe3ZhciByPWVbYV07aWYodFtyLmJydXNoVHlwZV0obixpLHIuc2VsZWN0b3JzLHIpKXJldHVybiEwfX1mdW5jdGlvbiByKHQpe3ZhciBlPXQuYnJ1c2hTZWxlY3RvcjtpZihkLmlzU3RyaW5nKGUpKXt2YXIgaT1bXTtyZXR1cm4gZC5lYWNoKHAsZnVuY3Rpb24odCxuKXtpW25dPWZ1bmN0aW9uKGksbixhLG8pe3ZhciByPW4uZ2V0SXRlbUxheW91dChpKTtyZXR1cm4gdFtlXShyLGEsbyl9fSksaX1pZihkLmlzRnVuY3Rpb24oZSkpe3ZhciBuPXt9O3JldHVybiBkLmVhY2gocCxmdW5jdGlvbih0LGkpe25baV09ZX0pLG59cmV0dXJuIGV9ZnVuY3Rpb24gcyh0LGUpe3ZhciBpPXQub3B0aW9uLnNlcmllc0luZGV4O3JldHVybiBudWxsIT1pJiYiYWxsIiE9PWkmJihkLmlzQXJyYXkoaSk/ZC5pbmRleE9mKGksZSk8MDplIT09aSl9ZnVuY3Rpb24gbCh0KXt2YXIgZT10LnNlbGVjdG9ycz17fTtyZXR1cm4gZC5lYWNoKHBbdC5icnVzaFR5cGVdLGZ1bmN0aW9uKGksbil7ZVtuXT1mdW5jdGlvbihuKXtyZXR1cm4gaShuLGUsdCl9fSksdH1mdW5jdGlvbiB1KHQpe3JldHVybiBuZXcgZih0WzBdWzBdLHRbMV1bMF0sdFswXVsxXS10WzBdWzBdLHRbMV1bMV0tdFsxXVswXSl9dmFyIGg9aSgyKSxjPWkoMTkzKSxkPWkoMSksZj1pKDEyKSxwPWkoMzc0KSxnPWkoMzcpLG09aSgxOTApLHY9WyJpbkJydXNoIiwib3V0T2ZCcnVzaCJdLHk9Il9fZWNCcnVzaFNlbGVjdCIseD0iX19lY0luQnJ1c2hTZWxlY3RFdmVudCIsXz1oLlBSSU9SSVRZLlZJU1VBTC5CUlVTSDtoLnJlZ2lzdGVyTGF5b3V0KF8sZnVuY3Rpb24odCxlLGkpe3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImJydXNoIn0sZnVuY3Rpb24oZSl7aSYmInRha2VHbG9iYWxDdXJzb3IiPT09aS50eXBlJiZlLnNldEJydXNoT3B0aW9uKCJicnVzaCI9PT1pLmtleT9pLmJydXNoT3B0aW9uOnticnVzaFR5cGU6ITF9KTt2YXIgbj1lLmJydXNoVGFyZ2V0TWFuYWdlcj1uZXcgbShlLm9wdGlvbix0KTtuLnNldElucHV0UmFuZ2VzKGUuYXJlYXMsdCl9KX0pLGgucmVnaXN0ZXJWaXN1YWwoXyxmdW5jdGlvbih0LGUsaSl7dmFyIGEsdSxoPVtdO3QuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImJydXNoIn0sZnVuY3Rpb24oZSxpKXtmdW5jdGlvbiBuKHQpe3JldHVybiJhbGwiPT09eHx8X1t0XX1mdW5jdGlvbiBmKHQpe3JldHVybiEhdC5sZW5ndGh9ZnVuY3Rpb24gcCh0LGUpe3ZhciBpPXQuY29vcmRpbmF0ZVN5c3RlbTtNfD1pLmhhc0F4aXNCcnVzaGVkKCksbihlKSYmaS5lYWNoQWN0aXZlU3RhdGUodC5nZXREYXRhKCksZnVuY3Rpb24odCxlKXsiYWN0aXZlIj09PXQmJih3W2VdPTEpfSl9ZnVuY3Rpb24gZyhpLGEsbCl7dmFyIHU9cihpKTtpZih1JiYhcyhlLGEpJiYoZC5lYWNoKEksZnVuY3Rpb24obil7dVtuLmJydXNoVHlwZV0mJmUuYnJ1c2hUYXJnZXRNYW5hZ2VyLmNvbnRyb2xTZXJpZXMobixpLHQpJiZsLnB1c2gobiksTXw9ZihsKX0pLG4oYSkmJmYobCkpKXt2YXIgaD1pLmdldERhdGEoKTtoLmVhY2goZnVuY3Rpb24odCl7byh1LGwsaCx0KSYmKHdbdF09MSl9KX19dmFyIG09e2JydXNoSWQ6ZS5pZCxicnVzaEluZGV4OmksYnJ1c2hOYW1lOmUubmFtZSxhcmVhczpkLmNsb25lKGUuYXJlYXMpLHNlbGVjdGVkOltdfTtoLnB1c2gobSk7dmFyIHk9ZS5vcHRpb24seD15LmJydXNoTGluayxfPVtdLHc9W10sUz1bXSxNPTA7aXx8KGE9eS50aHJvdHRsZVR5cGUsdT15LnRocm90dGxlRGVsYXkpO3ZhciBJPWQubWFwKGUuYXJlYXMsZnVuY3Rpb24odCl7cmV0dXJuIGwoZC5kZWZhdWx0cyh7Ym91bmRpbmdSZWN0OmJbdC5icnVzaFR5cGVdKHQpfSx0KSl9KSxUPWMuY3JlYXRlVmlzdWFsTWFwcGluZ3MoZS5vcHRpb24sdixmdW5jdGlvbih0KXt0Lm1hcHBpbmdNZXRob2Q9ImZpeGVkIn0pO2QuaXNBcnJheSh4KSYmZC5lYWNoKHgsZnVuY3Rpb24odCl7X1t0XT0xfSksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsZSl7dmFyIGk9U1tlXT1bXTsicGFyYWxsZWwiPT09dC5zdWJUeXBlP3AodCxlLGkpOmcodCxlLGkpfSksdC5lYWNoU2VyaWVzKGZ1bmN0aW9uKHQsZSl7dmFyIGk9e3Nlcmllc0lkOnQuaWQsc2VyaWVzSW5kZXg6ZSxzZXJpZXNOYW1lOnQubmFtZSxkYXRhSW5kZXg6W119O20uc2VsZWN0ZWQucHVzaChpKTt2YXIgYT1yKHQpLHM9U1tlXSxsPXQuZ2V0RGF0YSgpLHU9bihlKT9mdW5jdGlvbih0KXtyZXR1cm4gd1t0XT8oaS5kYXRhSW5kZXgucHVzaChsLmdldFJhd0luZGV4KHQpKSwiaW5CcnVzaCIpOiJvdXRPZkJydXNoIn06ZnVuY3Rpb24odCl7cmV0dXJuIG8oYSxzLGwsdCk/KGkuZGF0YUluZGV4LnB1c2gobC5nZXRSYXdJbmRleCh0KSksImluQnJ1c2giKToib3V0T2ZCcnVzaCJ9OyhuKGUpP006ZihzKSkmJmMuYXBwbHlWaXN1YWwodixULGwsdSl9KX0pLG4oZSxhLHUsaCxpKX0pO3ZhciBiPXtsaW5lWDpkLm5vb3AsbGluZVk6ZC5ub29wLHJlY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHUodC5yYW5nZSl9LHBvbHlnb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dC5yYW5nZSxuPTAsYT1pLmxlbmd0aDtuPGE7bisrKXtlPWV8fFtbMS8wLC0oMS8wKV0sWzEvMCwtKDEvMCldXTt2YXIgbz1pW25dO29bMF08ZVswXVswXSYmKGVbMF1bMF09b1swXSksb1swXT5lWzBdWzFdJiYoZVswXVsxXT1vWzBdKSxvWzFdPGVbMV1bMF0mJihlWzFdWzBdPW9bMV0pLG9bMV0+ZVsxXVsxXSYmKGVbMV1bMV09b1sxXSl9cmV0dXJuIGUmJnUoZSl9fX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtpKDQwMiksaSg0MDMpLGkoMzc3KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDEpLGE9aSgzKSxvPWkoNykscj1pKDQpLHM9e0VOOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sQ046WyLkuIDmnIgiLCLkuozmnIgiLCLkuInmnIgiLCLlm5vmnIgiLCLkupTmnIgiLCLlha3mnIgiLCLkuIPmnIgiLCLlhavmnIgiLCLkuZ3mnIgiLCLljYHmnIgiLCLljYHkuIDmnIgiLCLljYHkuozmnIgiXX0sbD17RU46WyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl0sQ046WyLml6UiLCLkuIAiLCLkuowiLCLkuIkiLCLlm5siLCLkupQiLCLlha0iXX07dC5leHBvcnRzPWkoMikuZXh0ZW5kQ29tcG9uZW50Vmlldyh7dHlwZToiY2FsZW5kYXIiLF90bHBvaW50czpudWxsLF9ibHBvaW50czpudWxsLF9maXJzdERheU9mTW9udGg6bnVsbCxfZmlyc3REYXlQb2ludHM6bnVsbCxyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZ3JvdXA7bi5yZW1vdmVBbGwoKTt2YXIgYT10LmNvb3JkaW5hdGVTeXN0ZW0sbz1hLmdldFJhbmdlSW5mbygpLHI9YS5nZXRPcmllbnQoKTt0aGlzLl9yZW5kZXJEYXlSZWN0KHQsbyxuKSx0aGlzLl9yZW5kZXJMaW5lcyh0LG8scixuKSx0aGlzLl9yZW5kZXJZZWFyVGV4dCh0LG8scixuKSx0aGlzLl9yZW5kZXJNb250aFRleHQodCxyLG4pLHRoaXMuX3JlbmRlcldlZWtUZXh0KHQsbyxyLG4pfSxfcmVuZGVyRGF5UmVjdDpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZVN5c3RlbSxvPXQuZ2V0TW9kZWwoIml0ZW1TdHlsZS5ub3JtYWwiKS5nZXRJdGVtU3R5bGUoKSxyPW4uZ2V0Q2VsbFdpZHRoKCkscz1uLmdldENlbGxIZWlnaHQoKSxsPWUuc3RhcnQudGltZTtsPD1lLmVuZC50aW1lO2w9bi5nZXROZXh0TkRheShsLDEpLnRpbWUpe3ZhciB1PW4uZGF0YVRvUmVjdChbbF0sITEpLnRsLGg9bmV3IGEuUmVjdCh7c2hhcGU6e3g6dVswXSx5OnVbMV0sd2lkdGg6cixoZWlnaHQ6c30sY3Vyc29yOiJkZWZhdWx0IixzdHlsZTpvfSk7aS5hZGQoaCl9fSxfcmVuZGVyTGluZXM6ZnVuY3Rpb24odCxlLGksbil7ZnVuY3Rpb24gYShlKXtvLl9maXJzdERheU9mTW9udGgucHVzaChyLmdldERhdGVJbmZvKGUpKSxvLl9maXJzdERheVBvaW50cy5wdXNoKHIuZGF0YVRvUmVjdChbZV0sITEpLnRsKTt2YXIgYT1vLl9nZXRMaW5lUG9pbnRzT2ZPbmVXZWVrKHQsZSxpKTtvLl90bHBvaW50cy5wdXNoKGFbMF0pLG8uX2JscG9pbnRzLnB1c2goYVthLmxlbmd0aC0xXSksbCYmby5fZHJhd1NwbGl0bGluZShhLHMsbil9dmFyIG89dGhpcyxyPXQuY29vcmRpbmF0ZVN5c3RlbSxzPXQuZ2V0TW9kZWwoInNwbGl0TGluZS5saW5lU3R5bGUiKS5nZXRMaW5lU3R5bGUoKSxsPXQuZ2V0KCJzcGxpdExpbmUuc2hvdyIpLHU9cy5saW5lV2lkdGg7dGhpcy5fdGxwb2ludHM9W10sdGhpcy5fYmxwb2ludHM9W10sdGhpcy5fZmlyc3REYXlPZk1vbnRoPVtdLHRoaXMuX2ZpcnN0RGF5UG9pbnRzPVtdO2Zvcih2YXIgaD1lLnN0YXJ0LGM9MDtoLnRpbWU8PWUuZW5kLnRpbWU7YysrKXthKGguZm9ybWF0ZWREYXRlKSwwPT09YyYmKGg9ci5nZXREYXRlSW5mbyhlLnN0YXJ0LnkrIi0iK2Uuc3RhcnQubSkpO3ZhciBkPWguZGF0ZTtkLnNldE1vbnRoKGQuZ2V0TW9udGgoKSsxKSxoPXIuZ2V0RGF0ZUluZm8oZCl9YShyLmdldE5leHRORGF5KGUuZW5kLnRpbWUsMSkuZm9ybWF0ZWREYXRlKSxsJiZ0aGlzLl9kcmF3U3BsaXRsaW5lKG8uX2dldEVkZ2VzUG9pbnRzKG8uX3RscG9pbnRzLHUsaSkscyxuKSxsJiZ0aGlzLl9kcmF3U3BsaXRsaW5lKG8uX2dldEVkZ2VzUG9pbnRzKG8uX2JscG9pbnRzLHUsaSkscyxuKX0sX2dldEVkZ2VzUG9pbnRzOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1bdFswXS5zbGljZSgpLHRbdC5sZW5ndGgtMV0uc2xpY2UoKV0sYT0iaG9yaXpvbnRhbCI9PT1pPzA6MTtyZXR1cm4gblswXVthXT1uWzBdW2FdLWUvMixuWzFdW2FdPW5bMV1bYV0rZS8yLG59LF9kcmF3U3BsaXRsaW5lOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1uZXcgYS5Qb2x5bGluZSh7ejI6MjAsc2hhcGU6e3BvaW50czp0fSxzdHlsZTplfSk7aS5hZGQobil9LF9nZXRMaW5lUG9pbnRzT2ZPbmVXZWVrOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmNvb3JkaW5hdGVTeXN0ZW07ZT1uLmdldERhdGVJbmZvKGUpO2Zvcih2YXIgYT1bXSxvPTA7bzw3O28rKyl7dmFyIHI9bi5nZXROZXh0TkRheShlLnRpbWUsbykscz1uLmRhdGFUb1JlY3QoW3IudGltZV0sITEpO2FbMipyLmRheV09cy50bCxhWzIqci5kYXkrMV09c1siaG9yaXpvbnRhbCI9PT1pPyJibCI6InRyIl19cmV0dXJuIGF9LF9mb3JtYXR0ZXJMYWJlbDpmdW5jdGlvbih0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdD9vLmZvcm1hdFRwbFNpbXBsZSh0LGUpOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoZSk6ZS5uYW1lTWFwfSxfeWVhclRleHRQb3NpdGlvbkNvbnRyb2w6ZnVuY3Rpb24odCxlLGksbixhKXtlPWUuc2xpY2UoKTt2YXIgbz1bImNlbnRlciIsImJvdHRvbSJdOyJib3R0b20iPT09bj8oZVsxXSs9YSxvPVsiY2VudGVyIiwidG9wIl0pOiJsZWZ0Ij09PW4/ZVswXS09YToicmlnaHQiPT09bj8oZVswXSs9YSxvPVsiY2VudGVyIiwidG9wIl0pOmVbMV0tPWE7dmFyIHI9MDtyZXR1cm4ibGVmdCIhPT1uJiYicmlnaHQiIT09bnx8KHI9TWF0aC5QSS8yKSx7cm90YXRpb246cixwb3NpdGlvbjplLHN0eWxlOnt0ZXh0QWxpZ246b1swXSx0ZXh0VmVydGljYWxBbGlnbjpvWzFdfX19LF9yZW5kZXJZZWFyVGV4dDpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz10LmdldE1vZGVsKCJ5ZWFyTGFiZWwiKTtpZihvLmdldCgic2hvdyIpKXt2YXIgcj1vLmdldCgibWFyZ2luIikscz1vLmdldCgicG9zaXRpb24iKTtzfHwocz0iaG9yaXpvbnRhbCIhPT1pPyJ0b3AiOiJsZWZ0Iik7dmFyIGw9W3RoaXMuX3RscG9pbnRzW3RoaXMuX3RscG9pbnRzLmxlbmd0aC0xXSx0aGlzLl9ibHBvaW50c1swXV0sdT0obFswXVswXStsWzFdWzBdKS8yLGg9KGxbMF1bMV0rbFsxXVsxXSkvMixjPSJob3Jpem9udGFsIj09PWk/MDoxLGQ9e3RvcDpbdSxsW2NdWzFdXSxib3R0b206W3UsbFsxLWNdWzFdXSxsZWZ0OltsWzEtY11bMF0saF0scmlnaHQ6W2xbY11bMF0saF19LGY9ZS5zdGFydC55OytlLmVuZC55PitlLnN0YXJ0LnkmJihmPWYrIi0iK2UuZW5kLnkpO3ZhciBwPW8uZ2V0KCJmb3JtYXR0ZXIiKSxnPXtzdGFydDplLnN0YXJ0LnksZW5kOmUuZW5kLnksbmFtZU1hcDpmfSxtPXRoaXMuX2Zvcm1hdHRlckxhYmVsKHAsZyksdj1uZXcgYS5UZXh0KHt6MjozMH0pO2Euc2V0VGV4dFN0eWxlKHYuc3R5bGUsbyx7dGV4dDptfSksdi5hdHRyKHRoaXMuX3llYXJUZXh0UG9zaXRpb25Db250cm9sKHYsZFtzXSxpLHMscikpLG4uYWRkKHYpfX0sX21vbnRoVGV4dFBvc2l0aW9uQ29udHJvbDpmdW5jdGlvbih0LGUsaSxuLGEpe3ZhciBvPSJsZWZ0IixyPSJ0b3AiLHM9dFswXSxsPXRbMV07cmV0dXJuImhvcml6b250YWwiPT09aT8obCs9YSxlJiYobz0iY2VudGVyIiksInN0YXJ0Ij09PW4mJihyPSJib3R0b20iKSk6KHMrPWEsZSYmKHI9Im1pZGRsZSIpLCJzdGFydCI9PT1uJiYobz0icmlnaHQiKSkse3g6cyx5OmwsdGV4dEFsaWduOm8sdGV4dFZlcnRpY2FsQWxpZ246cn19LF9yZW5kZXJNb250aFRleHQ6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQuZ2V0TW9kZWwoIm1vbnRoTGFiZWwiKTtpZihvLmdldCgic2hvdyIpKXt2YXIgcj1vLmdldCgibmFtZU1hcCIpLGw9by5nZXQoIm1hcmdpbiIpLHU9by5nZXQoInBvc2l0aW9uIiksaD1vLmdldCgiYWxpZ24iKSxjPVt0aGlzLl90bHBvaW50cyx0aGlzLl9ibHBvaW50c107bi5pc1N0cmluZyhyKSYmKHI9c1tyLnRvVXBwZXJDYXNlKCldfHxbXSk7dmFyIGQ9InN0YXJ0Ij09PXU/MDoxLGY9Imhvcml6b250YWwiPT09ZT8wOjE7bD0ic3RhcnQiPT09dT8tbDpsO2Zvcih2YXIgcD0iY2VudGVyIj09PWgsZz0wO2c8Y1tkXS5sZW5ndGgtMTtnKyspe3ZhciBtPWNbZF1bZ10uc2xpY2UoKSx2PXRoaXMuX2ZpcnN0RGF5T2ZNb250aFtnXTtpZihwKXt2YXIgeT10aGlzLl9maXJzdERheVBvaW50c1tnXTttW2ZdPSh5W2ZdK2NbMF1bZysxXVtmXSkvMn12YXIgeD1vLmdldCgiZm9ybWF0dGVyIiksXz1yWyt2Lm0tMV0sYj17eXl5eTp2LnkseXk6KHYueSsiIikuc2xpY2UoMiksTU06di5tLE06K3YubSxuYW1lTWFwOl99LHc9dGhpcy5fZm9ybWF0dGVyTGFiZWwoeCxiKSxTPW5ldyBhLlRleHQoe3oyOjMwfSk7bi5leHRlbmQoYS5zZXRUZXh0U3R5bGUoUy5zdHlsZSxvLHt0ZXh0Ond9KSx0aGlzLl9tb250aFRleHRQb3NpdGlvbkNvbnRyb2wobSxwLGUsdSxsKSksaS5hZGQoUyl9fX0sX3dlZWtUZXh0UG9zaXRpb25Db250cm9sOmZ1bmN0aW9uKHQsZSxpLG4sYSl7dmFyIG89ImNlbnRlciIscj0ibWlkZGxlIixzPXRbMF0sbD10WzFdLHU9InN0YXJ0Ij09PWk7cmV0dXJuImhvcml6b250YWwiPT09ZT8ocz1zK24rKHU/MTotMSkqYVswXS8yLG89dT8icmlnaHQiOiJsZWZ0Iik6KGw9bCtuKyh1PzE6LTEpKmFbMV0vMixyPXU/ImJvdHRvbSI6InRvcCIpLHt4OnMseTpsLHRleHRBbGlnbjpvLHRleHRWZXJ0aWNhbEFsaWduOnJ9fSxfcmVuZGVyV2Vla1RleHQ6ZnVuY3Rpb24odCxlLGksbyl7dmFyIHM9dC5nZXRNb2RlbCgiZGF5TGFiZWwiKTtpZihzLmdldCgic2hvdyIpKXt2YXIgdT10LmNvb3JkaW5hdGVTeXN0ZW0saD1zLmdldCgicG9zaXRpb24iKSxjPXMuZ2V0KCJuYW1lTWFwIiksZD1zLmdldCgibWFyZ2luIiksZj11LmdldEZpcnN0RGF5T2ZXZWVrKCk7bi5pc1N0cmluZyhjKSYmKGM9bFtjLnRvVXBwZXJDYXNlKCldfHxbXSk7dmFyIHA9dS5nZXROZXh0TkRheShlLmVuZC50aW1lLDctZS5sd2VlaykudGltZSxnPVt1LmdldENlbGxXaWR0aCgpLHUuZ2V0Q2VsbEhlaWdodCgpXTtkPXIucGFyc2VQZXJjZW50KGQsZ1siaG9yaXpvbnRhbCI9PT1pPzA6MV0pLCJzdGFydCI9PT1oJiYocD11LmdldE5leHRORGF5KGUuc3RhcnQudGltZSwtKDcrZS5md2VlaykpLnRpbWUsZD0tZCk7Zm9yKHZhciBtPTA7bTw3O20rKyl7dmFyIHY9dS5nZXROZXh0TkRheShwLG0pLHk9dS5kYXRhVG9SZWN0KFt2LnRpbWVdLCExKS5jZW50ZXIseD1tO3g9TWF0aC5hYnMoKG0rZiklNyk7dmFyIF89bmV3IGEuVGV4dCh7ejI6MzB9KTtuLmV4dGVuZChhLnNldFRleHRTdHlsZShfLnN0eWxlLHMse3RleHQ6Y1t4XX0pLHRoaXMuX3dlZWtUZXh0UG9zaXRpb25Db250cm9sKHksaSxoLGQsZykpLG8uYWRkKF8pfX19fSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7ZS51cGRhdGU9InVwZGF0ZVZpZXciLGEucmVnaXN0ZXJBY3Rpb24oZSxmdW5jdGlvbihlLGkpe3ZhciBuPXt9O3JldHVybiBpLmVhY2hDb21wb25lbnQoe21haW5UeXBlOiJnZW8iLHF1ZXJ5OmV9LGZ1bmN0aW9uKGkpe2lbdF0oZS5uYW1lKTt2YXIgYT1pLmNvb3JkaW5hdGVTeXN0ZW07by5lYWNoKGEucmVnaW9ucyxmdW5jdGlvbih0KXtuW3QubmFtZV09aS5pc1NlbGVjdGVkKHQubmFtZSl8fCExfSl9KSx7c2VsZWN0ZWQ6bixuYW1lOmUubmFtZX19KX1pKDQwNyksaSgxOTIpLGkoMzc5KSxpKDI0OCk7dmFyIGE9aSgyKSxvPWkoMSk7bigidG9nZ2xlU2VsZWN0ZWQiLHt0eXBlOiJnZW9Ub2dnbGVTZWxlY3QiLGV2ZW50OiJnZW9zZWxlY3RjaGFuZ2VkIn0pLG4oInNlbGVjdCIse3R5cGU6Imdlb1NlbGVjdCIsZXZlbnQ6Imdlb3NlbGVjdGVkIn0pLG4oInVuU2VsZWN0Iix7dHlwZToiZ2VvVW5TZWxlY3QiLGV2ZW50OiJnZW91bnNlbGVjdGVkIn0pfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMjU3KTt0LmV4cG9ydHM9aSgyKS5leHRlbmRDb21wb25lbnRWaWV3KHt0eXBlOiJnZW8iLGluaXQ6ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgbihlLCEwKTt0aGlzLl9tYXBEcmF3PWksdGhpcy5ncm91cC5hZGQoaS5ncm91cCl9LHJlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtpZighbnx8Imdlb1RvZ2dsZVNlbGVjdCIhPT1uLnR5cGV8fG4uZnJvbSE9PXRoaXMudWlkKXt2YXIgYT10aGlzLl9tYXBEcmF3O3QuZ2V0KCJzaG93Iik/YS5kcmF3KHQsZSxpLHRoaXMsbik6dGhpcy5fbWFwRHJhdy5ncm91cC5yZW1vdmVBbGwoKSx0aGlzLmdyb3VwLnNpbGVudD10LmdldCgic2lsZW50Iil9fSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwRHJhdyYmdGhpcy5fbWFwRHJhdy5yZW1vdmUoKX19KX0sZnVuY3Rpb24odCxlLGkpe2koMjcxKSxpKDM2NiksaSgzNjMpfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoMSk7aSgyNDQpLGkoMzYxKSxpKDM4NCksaSg1OCksaSgzNjcpLGkoMikucmVnaXN0ZXJMYXlvdXQobi5jdXJyeShpKDQzNCksImJhciIpKSxpKDIpLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6InBvbGFyIn0pfSxmdW5jdGlvbih0LGUsaSl7aSg0MjUpLGkoNDI2KSxpKDM4Myl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDQwKSxhPWkoMSksbz1pKDMpLHI9WyJheGlzTGluZSIsImF4aXNUaWNrTGFiZWwiLCJheGlzTmFtZSJdO3QuZXhwb3J0cz1pKDIpLmV4dGVuZENvbXBvbmVudFZpZXcoe3R5cGU6InJhZGFyIixyZW5kZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZ3JvdXA7bi5yZW1vdmVBbGwoKSx0aGlzLl9idWlsZEF4ZXModCksdGhpcy5fYnVpbGRTcGxpdExpbmVBbmRBcmVhKHQpfSxfYnVpbGRBeGVzOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29vcmRpbmF0ZVN5c3RlbSxpPWUuZ2V0SW5kaWNhdG9yQXhlcygpLG89YS5tYXAoaSxmdW5jdGlvbih0KXt2YXIgaT1uZXcgbih0Lm1vZGVsLHtwb3NpdGlvbjpbZS5jeCxlLmN5XSxyb3RhdGlvbjp0LmFuZ2xlLGxhYmVsRGlyZWN0aW9uOi0xLHRpY2tEaXJlY3Rpb246LTEsbmFtZURpcmVjdGlvbjoxfSk7cmV0dXJuIGl9KTthLmVhY2gobyxmdW5jdGlvbih0KXthLmVhY2gocix0LmFkZCx0KSx0aGlzLmdyb3VwLmFkZCh0LmdldEdyb3VwKCkpfSx0aGlzKX0sX2J1aWxkU3BsaXRMaW5lQW5kQXJlYTpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxpKXt2YXIgbj1pJWUubGVuZ3RoO3JldHVybiB0W25dPXRbbl18fFtdLG59dmFyIGk9dC5jb29yZGluYXRlU3lzdGVtLG49aS5nZXRJbmRpY2F0b3JBeGVzKCk7aWYobi5sZW5ndGgpe3ZhciByPXQuZ2V0KCJzaGFwZSIpLHM9dC5nZXRNb2RlbCgic3BsaXRMaW5lIiksbD10LmdldE1vZGVsKCJzcGxpdEFyZWEiKSx1PXMuZ2V0TW9kZWwoImxpbmVTdHlsZSIpLGg9bC5nZXRNb2RlbCgiYXJlYVN0eWxlIiksYz1zLmdldCgic2hvdyIpLGQ9bC5nZXQoInNob3ciKSxmPXUuZ2V0KCJjb2xvciIpLHA9aC5nZXQoImNvbG9yIik7Zj1hLmlzQXJyYXkoZik/ZjpbZl0scD1hLmlzQXJyYXkocCk/cDpbcF07dmFyIGc9W10sbT1bXTtpZigiY2lyY2xlIj09PXIpZm9yKHZhciB2PW5bMF0uZ2V0VGlja3NDb29yZHMoKSx5PWkuY3gseD1pLmN5LF89MDtfPHYubGVuZ3RoO18rKyl7aWYoYyl7dmFyIGI9ZShnLGYsXyk7Z1tiXS5wdXNoKG5ldyBvLkNpcmNsZSh7c2hhcGU6e2N4OnksY3k6eCxyOnZbX119fSkpfWlmKGQmJl88di5sZW5ndGgtMSl7dmFyIGI9ZShtLHAsXyk7bVtiXS5wdXNoKG5ldyBvLlJpbmcoe3NoYXBlOntjeDp5LGN5OngscjA6dltfXSxyOnZbXysxXX19KSl9fWVsc2UgZm9yKHZhciB3LFM9YS5tYXAobixmdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0VGlja3NDb29yZHMoKTtyZXR1cm4gdz1udWxsPT13P24ubGVuZ3RoLTE6TWF0aC5taW4obi5sZW5ndGgtMSx3KSxhLm1hcChuLGZ1bmN0aW9uKHQpe3JldHVybiBpLmNvb3JkVG9Qb2ludCh0LGUpfSl9KSxNPVtdLF89MDtfPD13O18rKyl7Zm9yKHZhciBJPVtdLFQ9MDtUPG4ubGVuZ3RoO1QrKylJLnB1c2goU1tUXVtfXSk7aWYoSVswXSYmSS5wdXNoKElbMF0uc2xpY2UoKSksYyl7dmFyIGI9ZShnLGYsXyk7Z1tiXS5wdXNoKG5ldyBvLlBvbHlsaW5lKHtzaGFwZTp7cG9pbnRzOkl9fSkpfWlmKGQmJk0pe3ZhciBiPWUobSxwLF8tMSk7bVtiXS5wdXNoKG5ldyBvLlBvbHlnb24oe3NoYXBlOntwb2ludHM6SS5jb25jYXQoTSl9fSkpfU09SS5zbGljZSgpLnJldmVyc2UoKX12YXIgQT11LmdldExpbmVTdHlsZSgpLEM9aC5nZXRBcmVhU3R5bGUoKTthLmVhY2gobSxmdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXAuYWRkKG8ubWVyZ2VQYXRoKHQse3N0eWxlOmEuZGVmYXVsdHMoe3N0cm9rZToibm9uZSIsZmlsbDpwW2UlcC5sZW5ndGhdfSxDKSxzaWxlbnQ6ITB9KSl9LHRoaXMpLGEuZWFjaChnLGZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cC5hZGQoby5tZXJnZVBhdGgodCx7c3R5bGU6YS5kZWZhdWx0cyh7ZmlsbDoibm9uZSIsc3Ryb2tlOmZbZSVmLmxlbmd0aF19LEEpLHNpbGVudDohMH0pKX0sdGhpcyl9fX0pfSxmdW5jdGlvbih0LGUsaSl7aSgyNDQpLGkoMzY0KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMik7bi5yZWdpc3RlclByZXByb2Nlc3NvcihpKDM5MSkpLGkoMzkzKSxpKDM5MiksaSgzODYpLGkoMzg3KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMzg5KSxhPWkoMSksbz1pKDUpLHI9bi5leHRlbmQoe3R5cGU6InRpbWVsaW5lLnNsaWRlciIsZGVmYXVsdE9wdGlvbjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJDb2xvcjoiI2NjYyIsYm9yZGVyV2lkdGg6MCxvcmllbnQ6Imhvcml6b250YWwiLGludmVyc2U6ITEsdG9vbHRpcDp7dHJpZ2dlcjoiaXRlbSJ9LHN5bWJvbDoiZW1wdHlDaXJjbGUiLHN5bWJvbFNpemU6MTAsbGluZVN0eWxlOntzaG93OiEwLHdpZHRoOjIsY29sb3I6IiMzMDQ2NTQifSxsYWJlbDp7cG9zaXRpb246ImF1dG8iLG5vcm1hbDp7c2hvdzohMCxpbnRlcnZhbDoiYXV0byIscm90YXRlOjAsY29sb3I6IiMzMDQ2NTQifSxlbXBoYXNpczp7c2hvdzohMCxjb2xvcjoiI2MyMzUzMSJ9fSxpdGVtU3R5bGU6e25vcm1hbDp7Y29sb3I6IiMzMDQ2NTQiLGJvcmRlcldpZHRoOjF9LGVtcGhhc2lzOntjb2xvcjoiI2MyMzUzMSJ9fSxjaGVja3BvaW50U3R5bGU6e3N5bWJvbDoiY2lyY2xlIixzeW1ib2xTaXplOjEzLGNvbG9yOiIjYzIzNTMxIixib3JkZXJXaWR0aDo1LGJvcmRlckNvbG9yOiJyZ2JhKDE5NCw1Myw0OSwgMC41KSIsYW5pbWF0aW9uOiEwLGFuaW1hdGlvbkR1cmF0aW9uOjMwMCxhbmltYXRpb25FYXNpbmc6InF1aW50aWNJbk91dCJ9LGNvbnRyb2xTdHlsZTp7c2hvdzohMCxzaG93UGxheUJ0bjohMCxzaG93UHJldkJ0bjohMCxzaG93TmV4dEJ0bjohMCxpdGVtU2l6ZToyMixpdGVtR2FwOjEyLHBvc2l0aW9uOiJsZWZ0IixwbGF5SWNvbjoicGF0aDovL00zMS42LDUzQzE3LjUsNTMsNiw0MS41LDYsMjcuNFMxNy41LDEuOCwzMS42LDEuOEM0NS43LDEuOCw1Ny4yLDEzLjMsNTcuMiwyNy40UzQ1LjcsNTMsMzEuNiw1M3ogTTMxLjYsMy4zIEMxOC40LDMuMyw3LjUsMTQuMSw3LjUsMjcuNGMwLDEzLjMsMTAuOCwyNC4xLDI0LjEsMjQuMUM0NC45LDUxLjUsNTUuNyw0MC43LDU1LjcsMjcuNEM1NS43LDE0LjEsNDQuOSwzLjMsMzEuNiwzLjN6IE0yNC45LDIxLjMgYzAtMi4yLDEuNi0zLjEsMy41LTJsMTAuNSw2LjFjMS44OTksMS4xLDEuODk5LDIuOSwwLDRsLTEwLjUsNi4xYy0xLjksMS4xLTMuNSwwLjItMy41LTJWMjEuM3oiLHN0b3BJY29uOiJwYXRoOi8vTTMwLjksNTMuMkMxNi44LDUzLjIsNS4zLDQxLjcsNS4zLDI3LjZTMTYuOCwyLDMwLjksMkM0NSwyLDU2LjQsMTMuNSw1Ni40LDI3LjZTNDUsNTMuMiwzMC45LDUzLjJ6IE0zMC45LDMuNUMxNy42LDMuNSw2LjgsMTQuNCw2LjgsMjcuNmMwLDEzLjMsMTAuOCwyNC4xLDI0LjEwMSwyNC4xQzQ0LjIsNTEuNyw1NSw0MC45LDU1LDI3LjZDNTQuOSwxNC40LDQ0LjEsMy41LDMwLjksMy41eiBNMzYuOSwzNS44YzAsMC42MDEtMC40LDEtMC45LDFoLTEuM2MtMC41LDAtMC45LTAuMzk5LTAuOS0xVjE5LjVjMC0wLjYsMC40LTEsMC45LTFIMzZjMC41LDAsMC45LDAuNCwwLjksMVYzNS44eiBNMjcuOCwzNS44IGMwLDAuNjAxLTAuNCwxLTAuOSwxaC0xLjNjLTAuNSwwLTAuOS0wLjM5OS0wLjktMVYxOS41YzAtMC42LDAuNC0xLDAuOS0xSDI3YzAuNSwwLDAuOSwwLjQsMC45LDFMMjcuOCwzNS44TDI3LjgsMzUuOHoiLG5leHRJY29uOiJwYXRoOi8vTTE4LjYsNTAuOGwyMi41LTIyLjVjMC4yLTAuMiwwLjMtMC40LDAuMy0wLjdjMC0wLjMtMC4xLTAuNS0wLjMtMC43TDE4LjcsNC40Yy0wLjEtMC4xLTAuMi0wLjMtMC4yLTAuNSBjMC0wLjQsMC4zLTAuOCwwLjgtMC44YzAuMiwwLDAuNSwwLjEsMC42LDAuM2wyMy41LDIzLjVsMCwwYzAuMiwwLjIsMC4zLDAuNCwwLjMsMC43YzAsMC4zLTAuMSwwLjUtMC4zLDAuN2wtMC4xLDAuMUwxOS43LDUyIGMtMC4xLDAuMS0wLjMsMC4yLTAuNSwwLjJjLTAuNCwwLTAuOC0wLjMtMC44LTAuOEMxOC40LDUxLjIsMTguNSw1MSwxOC42LDUwLjh6IixwcmV2SWNvbjoicGF0aDovL000Myw1Mi44TDIwLjQsMzAuM2MtMC4yLTAuMi0wLjMtMC40LTAuMy0wLjdjMC0wLjMsMC4xLTAuNSwwLjMtMC43TDQyLjksNi40YzAuMS0wLjEsMC4yLTAuMywwLjItMC41IGMwLTAuNC0wLjMtMC44LTAuOC0wLjhjLTAuMiwwLTAuNSwwLjEtMC42LDAuM0wxOC4zLDI4LjhsMCwwYy0wLjIsMC4yLTAuMywwLjQtMC4zLDAuN2MwLDAuMywwLjEsMC41LDAuMywwLjdsMC4xLDAuMUw0MS45LDU0IGMwLjEsMC4xLDAuMywwLjIsMC41LDAuMmMwLjQsMCwwLjgtMC4zLDAuOC0wLjhDNDMuMiw1My4yLDQzLjEsNTMsNDMsNTIuOHoiLG5vcm1hbDp7Y29sb3I6IiMzMDQ2NTQiLGJvcmRlckNvbG9yOiIjMzA0NjU0Iixib3JkZXJXaWR0aDoxfSxlbXBoYXNpczp7Y29sb3I6IiNjMjM1MzEiLGJvcmRlckNvbG9yOiIjYzIzNTMxIixib3JkZXJXaWR0aDoyfX0sZGF0YTpbXX19KTthLm1peGluKHIsby5kYXRhRm9ybWF0TWl4aW4pLHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB1LmdldExheW91dFJlY3QodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSx0LmdldCgicGFkZGluZyIpKX1mdW5jdGlvbiBhKHQsZSxpLG4pe3ZhciBhPWwubWFrZVBhdGgodC5nZXQoZSkucmVwbGFjZSgvXnBhdGg6XC9cLy8sIiIpLHMuY2xvbmUobnx8e30pLG5ldyBwKGlbMF0saVsxXSxpWzJdLGlbM10pLCJjZW50ZXIiKTtyZXR1cm4gYX1mdW5jdGlvbiBvKHQsZSxpLG4sYSxvKXt2YXIgcj1lLmdldCgiY29sb3IiKTtpZihhKWEuc2V0Q29sb3IociksaS5hZGQoYSksbyYmby5vblVwZGF0ZShhKTtlbHNle3ZhciBsPXQuZ2V0KCJzeW1ib2wiKTthPWQuY3JlYXRlU3ltYm9sKGwsLTEsLTEsMiwyLHIpLGEuc2V0U3R5bGUoInN0cm9rZU5vU2NhbGUiLCEwKSxpLmFkZChhKSxvJiZvLm9uQ3JlYXRlKGEpfXZhciB1PWUuZ2V0SXRlbVN0eWxlKFsiY29sb3IiLCJzeW1ib2wiLCJzeW1ib2xTaXplIl0pO2Euc2V0U3R5bGUodSksbj1zLm1lcmdlKHtyZWN0SG92ZXI6ITAsejI6MTAwfSxuLCEwKTt2YXIgaD10LmdldCgic3ltYm9sU2l6ZSIpO2g9aCBpbnN0YW5jZW9mIEFycmF5P2guc2xpY2UoKTpbK2gsK2hdLGhbMF0vPTIsaFsxXS89MixuLnNjYWxlPWg7dmFyIGM9dC5nZXQoInN5bWJvbE9mZnNldCIpO2lmKGMpe3ZhciBmPW4ucG9zaXRpb249bi5wb3NpdGlvbnx8WzAsMF07ZlswXSs9bS5wYXJzZVBlcmNlbnQoY1swXSxoWzBdKSxmWzFdKz1tLnBhcnNlUGVyY2VudChjWzFdLGhbMV0pfXZhciBwPXQuZ2V0KCJzeW1ib2xSb3RhdGUiKTtyZXR1cm4gbi5yb3RhdGlvbj0ocHx8MCkqTWF0aC5QSS8xODB8fDAsYS5hdHRyKG4pLGEudXBkYXRlVHJhbnNmb3JtKCksYX1mdW5jdGlvbiByKHQsZSxpLG4sYSl7aWYoIXQuZHJhZ2dpbmcpe3ZhciBvPW4uZ2V0TW9kZWwoImNoZWNrcG9pbnRTdHlsZSIpLHI9aS5kYXRhVG9Db29yZChuLmdldERhdGEoKS5nZXQoWyJ2YWx1ZSJdLGUpKTthfHwhby5nZXQoImFuaW1hdGlvbiIsITApP3QuYXR0cih7cG9zaXRpb246W3IsMF19KToodC5zdG9wQW5pbWF0aW9uKCEwKSx0LmFuaW1hdGVUbyh7cG9zaXRpb246W3IsMF19LG8uZ2V0KCJhbmltYXRpb25EdXJhdGlvbiIsITApLG8uZ2V0KCJhbmltYXRpb25FYXNpbmciLCEwKSkpfX12YXIgcz1pKDEpLGw9aSgzKSx1PWkoOSksaD1pKDM5MCksYz1pKDM4OCksZD1pKDI0KSxmPWkoMTgpLHA9aSgxMiksZz1pKDE5KSxtPWkoNCksdj1pKDcpLHk9di5lbmNvZGVIVE1MLHg9cy5iaW5kLF89cy5lYWNoLGI9TWF0aC5QSTt0LmV4cG9ydHM9aC5leHRlbmQoe3R5cGU6InRpbWVsaW5lLnNsaWRlciIsaW5pdDpmdW5jdGlvbih0LGUpe3RoaXMuYXBpPWUsdGhpcy5fYXhpcyx0aGlzLl92aWV3UmVjdCx0aGlzLl90aW1lcix0aGlzLl9jdXJyZW50UG9pbnRlcix0aGlzLl9tYWluR3JvdXAsdGhpcy5fbGFiZWxHcm91cH0scmVuZGVyOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKHRoaXMubW9kZWw9dCx0aGlzLmFwaT1pLHRoaXMuZWNNb2RlbD1lLHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCksdC5nZXQoInNob3ciLCEwKSl7dmFyIGE9dGhpcy5fbGF5b3V0KHQsaSksbz10aGlzLl9jcmVhdGVHcm91cCgibWFpbkdyb3VwIikscj10aGlzLl9jcmVhdGVHcm91cCgibGFiZWxHcm91cCIpLHM9dGhpcy5fYXhpcz10aGlzLl9jcmVhdGVBeGlzKGEsdCk7dC5mb3JtYXRUb29sdGlwPWZ1bmN0aW9uKHQpe3JldHVybiB5KHMuc2NhbGUuZ2V0TGFiZWwodCkpfSxfKFsiQXhpc0xpbmUiLCJBeGlzVGljayIsIkNvbnRyb2wiLCJDdXJyZW50UG9pbnRlciJdLGZ1bmN0aW9uKGUpe3RoaXNbIl9yZW5kZXIiK2VdKGEsbyxzLHQpfSx0aGlzKSx0aGlzLl9yZW5kZXJBeGlzTGFiZWwoYSxyLHMsdCksdGhpcy5fcG9zaXRpb24oYSx0KX10aGlzLl9kb1BsYXlTdG9wKCl9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFyVGltZXIoKSx0aGlzLmdyb3VwLnJlbW92ZUFsbCgpfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJUaW1lcigpfSxfbGF5b3V0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5nZXQoImxhYmVsLm5vcm1hbC5wb3NpdGlvbiIpLGE9dC5nZXQoIm9yaWVudCIpLG89bih0LGUpO251bGw9PWl8fCJhdXRvIj09PWk/aT0iaG9yaXpvbnRhbCI9PT1hP28ueStvLmhlaWdodC8yPGUuZ2V0SGVpZ2h0KCkvMj8iLSI6IisiOm8ueCtvLndpZHRoLzI8ZS5nZXRXaWR0aCgpLzI/IisiOiItIjppc05hTihpKSYmKGk9e2hvcml6b250YWw6e3RvcDoiLSIsYm90dG9tOiIrIn0sdmVydGljYWw6e2xlZnQ6Ii0iLHJpZ2h0OiIrIn19W2FdW2ldKTt2YXIgcj17aG9yaXpvbnRhbDoiY2VudGVyIix2ZXJ0aWNhbDppPj0wfHwiKyI9PT1pPyJsZWZ0IjoicmlnaHQifSxzPXtob3Jpem9udGFsOmk+PTB8fCIrIj09PWk/InRvcCI6ImJvdHRvbSIsdmVydGljYWw6Im1pZGRsZSJ9LGw9e2hvcml6b250YWw6MCx2ZXJ0aWNhbDpiLzJ9LHU9InZlcnRpY2FsIj09PWE/by5oZWlnaHQ6by53aWR0aCxoPXQuZ2V0TW9kZWwoImNvbnRyb2xTdHlsZSIpLGM9aC5nZXQoInNob3ciKSxkPWM/aC5nZXQoIml0ZW1TaXplIik6MCxmPWM/aC5nZXQoIml0ZW1HYXAiKTowLHA9ZCtmLGc9dC5nZXQoImxhYmVsLm5vcm1hbC5yb3RhdGUiKXx8MDtnPWcqYi8xODA7dmFyIG0sdix5LHgsXz1oLmdldCgicG9zaXRpb24iLCEwKSxjPWguZ2V0KCJzaG93IiwhMCksdz1jJiZoLmdldCgic2hvd1BsYXlCdG4iLCEwKSxTPWMmJmguZ2V0KCJzaG93UHJldkJ0biIsITApLE09YyYmaC5nZXQoInNob3dOZXh0QnRuIiwhMCksST0wLFQ9dTtyZXR1cm4ibGVmdCI9PT1ffHwiYm90dG9tIj09PV8/KHcmJihtPVswLDBdLEkrPXApLFMmJih2PVtJLDBdLEkrPXApLE0mJih5PVtULWQsMF0sVC09cCkpOih3JiYobT1bVC1kLDBdLFQtPXApLFMmJih2PVswLDBdLEkrPXApLE0mJih5PVtULWQsMF0sVC09cCkpLHg9W0ksVF0sdC5nZXQoImludmVyc2UiKSYmeC5yZXZlcnNlKCkse3ZpZXdSZWN0Om8sbWFpbkxlbmd0aDp1LG9yaWVudDphLHJvdGF0aW9uOmxbYV0sbGFiZWxSb3RhdGlvbjpnLGxhYmVsUG9zT3B0OmksbGFiZWxBbGlnbjp0LmdldCgibGFiZWwubm9ybWFsLmFsaWduIil8fHJbYV0sbGFiZWxCYXNlbGluZTp0LmdldCgibGFiZWwubm9ybWFsLnZlcnRpY2FsQWxpZ24iKXx8dC5nZXQoImxhYmVsLm5vcm1hbC5iYXNlbGluZSIpfHxzW2FdLHBsYXlQb3NpdGlvbjptLHByZXZCdG5Qb3NpdGlvbjp2LG5leHRCdG5Qb3NpdGlvbjp5LGF4aXNFeHRlbnQ6eCxjb250cm9sU2l6ZTpkLGNvbnRyb2xHYXA6Zn19LF9wb3NpdGlvbjpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dmFyIGU9dC5wb3NpdGlvbjt0Lm9yaWdpbj1bY1swXVswXS1lWzBdLGNbMV1bMF0tZVsxXV19ZnVuY3Rpb24gbih0KXtyZXR1cm5bW3QueCx0LngrdC53aWR0aF0sW3QueSx0LnkrdC5oZWlnaHRdXX1mdW5jdGlvbiBhKHQsZSxpLG4sYSl7dFtuXSs9aVtuXVthXS1lW25dW2FdfXZhciBvPXRoaXMuX21haW5Hcm91cCxyPXRoaXMuX2xhYmVsR3JvdXAscz10LnZpZXdSZWN0O2lmKCJ2ZXJ0aWNhbCI9PT10Lm9yaWVudCl7dmFyIGw9Zy5jcmVhdGUoKSx1PXMueCxoPXMueStzLmhlaWdodDtnLnRyYW5zbGF0ZShsLGwsWy11LC1oXSksZy5yb3RhdGUobCxsLC1iLzIpLGcudHJhbnNsYXRlKGwsbCxbdSxoXSkscz1zLmNsb25lKCkscy5hcHBseVRyYW5zZm9ybShsKX12YXIgYz1uKHMpLGQ9bihvLmdldEJvdW5kaW5nUmVjdCgpKSxmPW4oci5nZXRCb3VuZGluZ1JlY3QoKSkscD1vLnBvc2l0aW9uLG09ci5wb3NpdGlvbjttWzBdPXBbMF09Y1swXVswXTt2YXIgdj10LmxhYmVsUG9zT3B0O2lmKGlzTmFOKHYpKXt2YXIgeT0iKyI9PT12PzA6MTthKHAsZCxjLDEseSksYShtLGYsYywxLDEteSl9ZWxzZXt2YXIgeT12Pj0wPzA6MTthKHAsZCxjLDEseSksbVsxXT1wWzFdK3Z9by5hdHRyKCJwb3NpdGlvbiIscCksci5hdHRyKCJwb3NpdGlvbiIsbSksby5yb3RhdGlvbj1yLnJvdGF0aW9uPXQucm90YXRpb24saShvKSxpKHIpfSxfY3JlYXRlQXhpczpmdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0RGF0YSgpLG49ZS5nZXQoImF4aXNUeXBlIiksYT1mLmNyZWF0ZVNjYWxlQnlNb2RlbChlLG4pLG89aS5nZXREYXRhRXh0ZW50KCJ2YWx1ZSIpO2Euc2V0RXh0ZW50KG9bMF0sb1sxXSksdGhpcy5fY3VzdG9taXplU2NhbGUoYSxpKSxhLm5pY2VUaWNrcygpO3ZhciByPW5ldyBjKCJ2YWx1ZSIsYSx0LmF4aXNFeHRlbnQsbik7cmV0dXJuIHIubW9kZWw9ZSxyfSxfY3VzdG9taXplU2NhbGU6ZnVuY3Rpb24odCxlKXt0LmdldFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGUubWFwQXJyYXkoWyJ2YWx1ZSJdLGZ1bmN0aW9uKHQpe3JldHVybiB0fSl9LHQuZ2V0VGlja3NMYWJlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy5tYXAodGhpcy5nZXRUaWNrcygpLHQuZ2V0TGFiZWwsdCl9fSxfY3JlYXRlR3JvdXA6ZnVuY3Rpb24odCl7dmFyIGU9dGhpc1siXyIrdF09bmV3IGwuR3JvdXA7cmV0dXJuIHRoaXMuZ3JvdXAuYWRkKGUpLGV9LF9yZW5kZXJBeGlzTGluZTpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1pLmdldEV4dGVudCgpO24uZ2V0KCJsaW5lU3R5bGUuc2hvdyIpJiZlLmFkZChuZXcgbC5MaW5lKHtzaGFwZTp7eDE6YVswXSx5MTowLHgyOmFbMV0seTI6MH0sc3R5bGU6cy5leHRlbmQoe2xpbmVDYXA6InJvdW5kIn0sbi5nZXRNb2RlbCgibGluZVN0eWxlIikuZ2V0TGluZVN0eWxlKCkpLHNpbGVudDohMCx6MjoxfSkpfSxfcmVuZGVyQXhpc1RpY2s6ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9bi5nZXREYXRhKCkscj1pLnNjYWxlLmdldFRpY2tzKCk7XyhyLGZ1bmN0aW9uKHQscil7dmFyIHM9aS5kYXRhVG9Db29yZCh0KSx1PWEuZ2V0SXRlbU1vZGVsKHIpLGg9dS5nZXRNb2RlbCgiaXRlbVN0eWxlLm5vcm1hbCIpLGM9dS5nZXRNb2RlbCgiaXRlbVN0eWxlLmVtcGhhc2lzIiksZD17cG9zaXRpb246W3MsMF0sb25jbGljazp4KHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMscil9LGY9byh1LGgsZSxkKTtsLnNldEhvdmVyU3R5bGUoZixjLmdldEl0ZW1TdHlsZSgpKSx1LmdldCgidG9vbHRpcCIpPyhmLmRhdGFJbmRleD1yLGYuZGF0YU1vZGVsPW4pOmYuZGF0YUluZGV4PWYuZGF0YU1vZGVsPW51bGx9LHRoaXMpfSxfcmVuZGVyQXhpc0xhYmVsOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPW4uZ2V0TW9kZWwoImxhYmVsLm5vcm1hbCIpO2lmKGEuZ2V0KCJzaG93Iikpe3ZhciBvPW4uZ2V0RGF0YSgpLHI9aS5zY2FsZS5nZXRUaWNrcygpLHM9Zi5nZXRGb3JtYXR0ZWRMYWJlbHMoaSxhLmdldCgiZm9ybWF0dGVyIikpLHU9aS5nZXRMYWJlbEludGVydmFsKCk7XyhyLGZ1bmN0aW9uKG4sYSl7aWYoIWkuaXNMYWJlbElnbm9yZWQoYSx1KSl7dmFyIHI9by5nZXRJdGVtTW9kZWwoYSksaD1yLmdldE1vZGVsKCJsYWJlbC5ub3JtYWwiKSxjPXIuZ2V0TW9kZWwoImxhYmVsLmVtcGhhc2lzIiksZD1pLmRhdGFUb0Nvb3JkKG4pLGY9bmV3IGwuVGV4dCh7cG9zaXRpb246W2QsMF0scm90YXRpb246dC5sYWJlbFJvdGF0aW9uLXQucm90YXRpb24sb25jbGljazp4KHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMsYSksc2lsZW50OiExfSk7bC5zZXRUZXh0U3R5bGUoZi5zdHlsZSxoLHt0ZXh0OnNbYV0sdGV4dEFsaWduOnQubGFiZWxBbGlnbix0ZXh0VmVydGljYWxBbGlnbjp0LmxhYmVsQmFzZWxpbmV9KSxlLmFkZChmKSxsLnNldEhvdmVyU3R5bGUoZixsLnNldFRleHRTdHlsZSh7fSxjKSl9fSx0aGlzKX19LF9yZW5kZXJDb250cm9sOmZ1bmN0aW9uKHQsZSxpLG4pe2Z1bmN0aW9uIG8odCxpLG8sZCl7aWYodCl7dmFyIGY9e3Bvc2l0aW9uOnQsb3JpZ2luOltyLzIsMF0scm90YXRpb246ZD8tczowLHJlY3RIb3ZlcjohMCxzdHlsZTp1LG9uY2xpY2s6b30scD1hKG4saSxjLGYpO2UuYWRkKHApLGwuc2V0SG92ZXJTdHlsZShwLGgpfX12YXIgcj10LmNvbnRyb2xTaXplLHM9dC5yb3RhdGlvbix1PW4uZ2V0TW9kZWwoImNvbnRyb2xTdHlsZS5ub3JtYWwiKS5nZXRJdGVtU3R5bGUoKSxoPW4uZ2V0TW9kZWwoImNvbnRyb2xTdHlsZS5lbXBoYXNpcyIpLmdldEl0ZW1TdHlsZSgpLGM9WzAsLXIvMixyLHJdLGQ9bi5nZXRQbGF5U3RhdGUoKSxmPW4uZ2V0KCJpbnZlcnNlIiwhMCk7byh0Lm5leHRCdG5Qb3NpdGlvbiwiY29udHJvbFN0eWxlLm5leHRJY29uIix4KHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMsZj8iLSI6IisiKSksbyh0LnByZXZCdG5Qb3NpdGlvbiwiY29udHJvbFN0eWxlLnByZXZJY29uIix4KHRoaXMuX2NoYW5nZVRpbWVsaW5lLHRoaXMsZj8iKyI6Ii0iKSksbyh0LnBsYXlQb3NpdGlvbiwiY29udHJvbFN0eWxlLiIrKGQ/InN0b3BJY29uIjoicGxheUljb24iKSx4KHRoaXMuX2hhbmRsZVBsYXlDbGljayx0aGlzLCFkKSwhMCl9LF9yZW5kZXJDdXJyZW50UG9pbnRlcjpmdW5jdGlvbih0LGUsaSxuKXt2YXIgYT1uLmdldERhdGEoKSxzPW4uZ2V0Q3VycmVudEluZGV4KCksbD1hLmdldEl0ZW1Nb2RlbChzKS5nZXRNb2RlbCgiY2hlY2twb2ludFN0eWxlIiksdT10aGlzLGg9e29uQ3JlYXRlOmZ1bmN0aW9uKHQpe3QuZHJhZ2dhYmxlPSEwLHQuZHJpZnQ9eCh1Ll9oYW5kbGVQb2ludGVyRHJhZyx1KSx0Lm9uZHJhZ2VuZD14KHUuX2hhbmRsZVBvaW50ZXJEcmFnZW5kLHUpLHIodCxzLGksbiwhMCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe3IodCxzLGksbil9fTt0aGlzLl9jdXJyZW50UG9pbnRlcj1vKGwsbCx0aGlzLl9tYWluR3JvdXAse30sdGhpcy5fY3VycmVudFBvaW50ZXIsaCl9LF9oYW5kbGVQbGF5Q2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5fY2xlYXJUaW1lcigpLHRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0aW1lbGluZVBsYXlDaGFuZ2UiLHBsYXlTdGF0ZTp0LGZyb206dGhpcy51aWR9KX0sX2hhbmRsZVBvaW50ZXJEcmFnOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fcG9pbnRlckNoYW5nZVRpbWVsaW5lKFtpLm9mZnNldFgsaS5vZmZzZXRZXSl9LF9oYW5kbGVQb2ludGVyRHJhZ2VuZDpmdW5jdGlvbih0KXt0aGlzLl9wb2ludGVyQ2hhbmdlVGltZWxpbmUoW3Qub2Zmc2V0WCx0Lm9mZnNldFldLCEwKX0sX3BvaW50ZXJDaGFuZ2VUaW1lbGluZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3RvQXhpc0Nvb3JkKHQpWzBdLG49dGhpcy5fYXhpcyxhPW0uYXNjKG4uZ2V0RXh0ZW50KCkuc2xpY2UoKSk7aT5hWzFdJiYoaT1hWzFdKSxpPGFbMF0mJihpPWFbMF0pLHRoaXMuX2N1cnJlbnRQb2ludGVyLnBvc2l0aW9uWzBdPWksdGhpcy5fY3VycmVudFBvaW50ZXIuZGlydHkoKTt2YXIgbz10aGlzLl9maW5kTmVhcmVzdFRpY2soaSkscj10aGlzLm1vZGVsOyhlfHxvIT09ci5nZXRDdXJyZW50SW5kZXgoKSYmci5nZXQoInJlYWx0aW1lIikpJiZ0aGlzLl9jaGFuZ2VUaW1lbGluZShvKX0sX2RvUGxheVN0b3A6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dGhpcy5tb2RlbDt0aGlzLl9jaGFuZ2VUaW1lbGluZSh0LmdldEN1cnJlbnRJbmRleCgpKyh0LmdldCgicmV3aW5kIiwhMCk/LTE6MSkpfXRoaXMuX2NsZWFyVGltZXIoKSx0aGlzLm1vZGVsLmdldFBsYXlTdGF0ZSgpJiYodGhpcy5fdGltZXI9c2V0VGltZW91dCh4KHQsdGhpcyksdGhpcy5tb2RlbC5nZXQoInBsYXlJbnRlcnZhbCIpKSl9LF90b0F4aXNDb29yZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYWluR3JvdXAuZ2V0TG9jYWxUcmFuc2Zvcm0oKTtyZXR1cm4gbC5hcHBseVRyYW5zZm9ybSh0LGUsITApfSxfZmluZE5lYXJlc3RUaWNrOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy5tb2RlbC5nZXREYXRhKCksbj0xLzAsYT10aGlzLl9heGlzO3JldHVybiBpLmVhY2goWyJ2YWx1ZSJdLGZ1bmN0aW9uKGksbyl7dmFyIHI9YS5kYXRhVG9Db29yZChpKSxzPU1hdGguYWJzKHItdCk7czxuJiYobj1zLGU9byl9KSxlfSxfY2xlYXJUaW1lcjpmdW5jdGlvbigpe3RoaXMuX3RpbWVyJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1udWxsKX0sX2NoYW5nZVRpbWVsaW5lOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWwuZ2V0Q3VycmVudEluZGV4KCk7IisiPT09dD90PWUrMToiLSI9PT10JiYodD1lLTEpLHRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJ0aW1lbGluZUNoYW5nZSIsY3VycmVudEluZGV4OnQsZnJvbTp0aGlzLnVpZH0pfX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG49aSgxKSxhPWkoMzMpLG89aSgxOCkscj1mdW5jdGlvbih0LGUsaSxuKXthLmNhbGwodGhpcyx0LGUsaSksdGhpcy50eXBlPW58fCJ2YWx1ZSIsdGhpcy5fYXV0b0xhYmVsSW50ZXJ2YWwsdGhpcy5tb2RlbD1udWxsfTtyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cixnZXRMYWJlbEludGVydmFsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tb2RlbCxlPXQuZ2V0TW9kZWwoImxhYmVsLm5vcm1hbCIpLGk9ZS5nZXQoImludGVydmFsIik7aWYobnVsbCE9aSYmImF1dG8iIT1pKXJldHVybiBpO3ZhciBpPXRoaXMuX2F1dG9MYWJlbEludGVydmFsO3JldHVybiBpfHwoaT10aGlzLl9hdXRvTGFiZWxJbnRlcnZhbD1vLmdldEF4aXNMYWJlbEludGVydmFsKG4ubWFwKHRoaXMuc2NhbGUuZ2V0VGlja3MoKSx0aGlzLmRhdGFUb0Nvb3JkLHRoaXMpLG8uZ2V0Rm9ybWF0dGVkTGFiZWxzKHRoaXMsZS5nZXQoImZvcm1hdHRlciIpKSxlLmdldEZvbnQoKSwiaG9yaXpvbnRhbCI9PT10LmdldCgib3JpZW50IikpKSxpfSxpc0xhYmVsSWdub3JlZDpmdW5jdGlvbih0KXtpZigiY2F0ZWdvcnkiPT09dGhpcy50eXBlKXt2YXIgZT10aGlzLmdldExhYmVsSW50ZXJ2YWwoKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIWUodCx0aGlzLnNjYWxlLmdldExhYmVsKHQpKXx8dCUoZSsxKX19fSxuLmluaGVyaXRzKHIsYSksdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEzKSxhPWkoMTQpLG89aSgxKSxyPWkoNSkscz1uLmV4dGVuZCh7dHlwZToidGltZWxpbmUiLGxheW91dE1vZGU6ImJveCIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejo0LHNob3c6ITAsYXhpc1R5cGU6InRpbWUiLHJlYWx0aW1lOiEwLGxlZnQ6IjIwJSIsdG9wOm51bGwscmlnaHQ6IjIwJSIsYm90dG9tOjAsd2lkdGg6bnVsbCxoZWlnaHQ6NDAscGFkZGluZzo1LGNvbnRyb2xQb3NpdGlvbjoibGVmdCIsYXV0b1BsYXk6ITEscmV3aW5kOiExLGxvb3A6ITAscGxheUludGVydmFsOjJlMyxjdXJyZW50SW5kZXg6MCxpdGVtU3R5bGU6e25vcm1hbDp7fSxlbXBoYXNpczp7fX0sbGFiZWw6e25vcm1hbDp7Y29sb3I6IiMwMDAifSxlbXBoYXNpczp7fX0sZGF0YTpbXX0saW5pdDpmdW5jdGlvbih0LGUsaSl7dGhpcy5fZGF0YSx0aGlzLl9uYW1lcyx0aGlzLm1lcmdlRGVmYXVsdEFuZFRoZW1lKHQsaSksdGhpcy5faW5pdERhdGEoKX0sbWVyZ2VPcHRpb246ZnVuY3Rpb24odCl7cy5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpLHRoaXMuX2luaXREYXRhKCl9LHNldEN1cnJlbnRJbmRleDpmdW5jdGlvbih0KXtudWxsPT10JiYodD10aGlzLm9wdGlvbi5jdXJyZW50SW5kZXgpO3ZhciBlPXRoaXMuX2RhdGEuY291bnQoKTt0aGlzLm9wdGlvbi5sb29wP3Q9KHQlZStlKSVlOih0Pj1lJiYodD1lLTEpLHQ8MCYmKHQ9MCkpLHRoaXMub3B0aW9uLmN1cnJlbnRJbmRleD10fSxnZXRDdXJyZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb24uY3VycmVudEluZGV4fSxpc0luZGV4TWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q3VycmVudEluZGV4KCk+PXRoaXMuX2RhdGEuY291bnQoKS0xfSxzZXRQbGF5U3RhdGU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uYXV0b1BsYXk9ISF0fSxnZXRQbGF5U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMub3B0aW9uLmF1dG9QbGF5fSxfaW5pdERhdGE6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbixlPXQuZGF0YXx8W10saT10LmF4aXNUeXBlLG49dGhpcy5fbmFtZXM9W107aWYoImNhdGVnb3J5Ij09PWkpe3ZhciBzPVtdO28uZWFjaChlLGZ1bmN0aW9uKHQsZSl7dmFyIGksYT1yLmdldERhdGFJdGVtVmFsdWUodCk7by5pc09iamVjdCh0KT8oaT1vLmNsb25lKHQpLGkudmFsdWU9ZSk6aT1lLHMucHVzaChpKSxvLmlzU3RyaW5nKGEpfHxudWxsIT1hJiYhaXNOYU4oYSl8fChhPSIiKSxuLnB1c2goYSsiIil9KSxlPXN9dmFyIGw9e2NhdGVnb3J5OiJvcmRpbmFsIix0aW1lOiJ0aW1lIn1baV18fCJudW1iZXIiLHU9dGhpcy5fZGF0YT1uZXcgYShbe25hbWU6InZhbHVlIix0eXBlOmx9XSx0aGlzKTt1LmluaXREYXRhKGUsbil9LGdldERhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sZ2V0Q2F0ZWdvcmllczpmdW5jdGlvbigpe2lmKCJjYXRlZ29yeSI9PT10aGlzLmdldCgiYXhpc1R5cGUiKSlyZXR1cm4gdGhpcy5fbmFtZXMuc2xpY2UoKX19KTt0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoNjgpO3QuZXhwb3J0cz1uLmV4dGVuZCh7dHlwZToidGltZWxpbmUifSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXQudHlwZSxpPXtudW1iZXI6InZhbHVlIix0aW1lOiJ0aW1lIn07aWYoaVtlXSYmKHQuYXhpc1R5cGU9aVtlXSxkZWxldGUgdC50eXBlKSxhKHQpLG8odCwiY29udHJvbFBvc2l0aW9uIikpe3ZhciBuPXQuY29udHJvbFN0eWxlfHwodC5jb250cm9sU3R5bGU9e30pO28obiwicG9zaXRpb24iKXx8KG4ucG9zaXRpb249dC5jb250cm9sUG9zaXRpb24pLCJub25lIiE9PW4ucG9zaXRpb258fG8obiwic2hvdyIpfHwobi5zaG93PSExLGRlbGV0ZSBuLnBvc2l0aW9uKSxkZWxldGUgdC5jb250cm9sUG9zaXRpb259ci5lYWNoKHQuZGF0YXx8W10sZnVuY3Rpb24odCl7ci5pc09iamVjdCh0KSYmIXIuaXNBcnJheSh0KSYmKCFvKHQsInZhbHVlIikmJm8odCwibmFtZSIpJiYodC52YWx1ZT10Lm5hbWUpLGEodCkpfSl9ZnVuY3Rpb24gYSh0KXt2YXIgZT10Lml0ZW1TdHlsZXx8KHQuaXRlbVN0eWxlPXt9KSxpPWUuZW1waGFzaXN8fChlLmVtcGhhc2lzPXt9KSxuPXQubGFiZWx8fHQubGFiZWx8fHt9LGE9bi5ub3JtYWx8fChuLm5vcm1hbD17fSkscz17bm9ybWFsOjEsZW1waGFzaXM6MX07ci5lYWNoKG4sZnVuY3Rpb24odCxlKXtzW2VdfHxvKGEsZSl8fChhW2VdPXQpfSksaS5sYWJlbCYmIW8obiwiZW1waGFzaXMiKSYmKG4uZW1waGFzaXM9aS5sYWJlbCxkZWxldGUgaS5sYWJlbCl9ZnVuY3Rpb24gbyh0LGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpfXZhciByPWkoMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQudGltZWxpbmU7ci5pc0FycmF5KGUpfHwoZT1lP1tlXTpbXSksci5lYWNoKGUsZnVuY3Rpb24odCl7dCYmbih0KX0pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMiksYT1pKDEpO24ucmVnaXN0ZXJBY3Rpb24oe3R5cGU6InRpbWVsaW5lQ2hhbmdlIixldmVudDoidGltZWxpbmVDaGFuZ2VkIix1cGRhdGU6InByZXBhcmVBbmRVcGRhdGUifSxmdW5jdGlvbih0LGUpe3ZhciBpPWUuZ2V0Q29tcG9uZW50KCJ0aW1lbGluZSIpO3JldHVybiBpJiZudWxsIT10LmN1cnJlbnRJbmRleCYmKGkuc2V0Q3VycmVudEluZGV4KHQuY3VycmVudEluZGV4KSwhaS5nZXQoImxvb3AiLCEwKSYmaS5pc0luZGV4TWF4KCkmJmkuc2V0UGxheVN0YXRlKCExKSksZS5yZXNldE9wdGlvbigidGltZWxpbmUiKSxhLmRlZmF1bHRzKHtjdXJyZW50SW5kZXg6aS5vcHRpb24uY3VycmVudEluZGV4fSx0KX0pLG4ucmVnaXN0ZXJBY3Rpb24oe3R5cGU6InRpbWVsaW5lUGxheUNoYW5nZSIsZXZlbnQ6InRpbWVsaW5lUGxheUNoYW5nZWQiLHVwZGF0ZToidXBkYXRlIn0sZnVuY3Rpb24odCxlKXt2YXIgaT1lLmdldENvbXBvbmVudCgidGltZWxpbmUiKTtpJiZudWxsIT10LnBsYXlTdGF0ZSYmaS5zZXRQbGF5U3RhdGUodC5wbGF5U3RhdGUpfSl9LGZ1bmN0aW9uKHQsZSxpKXtpKDEzKS5yZWdpc3RlclN1YlR5cGVEZWZhdWx0ZXIoInRpbWVsaW5lIixmdW5jdGlvbigpe3JldHVybiJzbGlkZXIifSl9LGZ1bmN0aW9uKHQsZSxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUsaSl7dGhpcy5tb2RlbD10LHRoaXMuZWNNb2RlbD1lLHRoaXMuYXBpPWksdGhpcy5fYnJ1c2hUeXBlLHRoaXMuX2JydXNoTW9kZX12YXIgYT1pKDI5KSxvPWkoMSkscj1pKDQ0KS50b29sYm94LmJydXNoO24uZGVmYXVsdE9wdGlvbj17c2hvdzohMCx0eXBlOlsicmVjdCIsInBvbHlnb24iLCJsaW5lWCIsImxpbmVZIiwia2VlcCIsImNsZWFyIl0saWNvbjp7cmVjdDoiTTcuMywzNC43IE0wLjQsMTBWLTAuMmg5LjggTTg5LjYsMTBWLTAuMmgtOS44IE0wLjQsNjB2MTAuMmg5LjggTTg5LjYsNjB2MTAuMmgtOS44IE0xMi4zLDIyLjRWMTAuNWgxMy4xIE0zMy42LDEwLjVoNy44IE00OS4xLDEwLjVoNy44IE03Ny41LDIyLjRWMTAuNWgtMTMgTTEyLjMsMzEuMXY4LjIgTTc3LjcsMzEuMXY4LjIgTTEyLjMsNDcuNnYxMS45aDEzLjEgTTMzLjYsNTkuNWg3LjYgTTQ5LjEsNTkuNSBoNy43IE03Ny41LDQ3LjZ2MTEuOWgtMTMiLHBvbHlnb246Ik01NS4yLDM0LjljMS43LDAsMy4xLDEuNCwzLjEsMy4xcy0xLjQsMy4xLTMuMSwzLjEgcy0zLjEtMS40LTMuMS0zLjFTNTMuNSwzNC45LDU1LjIsMzQuOXogTTUwLjQsNTFjMS43LDAsMy4xLDEuNCwzLjEsMy4xYzAsMS43LTEuNCwzLjEtMy4xLDMuMWMtMS43LDAtMy4xLTEuNC0zLjEtMy4xIEM0Ny4zLDUyLjQsNDguNyw1MSw1MC40LDUxeiBNNTUuNiwzNy4xbDEuNS03LjggTTYwLjEsMTMuNWwxLjYtOC43bC03LjgsNCBNNTksMTlsLTEsNS4zIE0yNCwxNi4xbDYuNCw0LjlsNi40LTMuMyBNNDguNSwxMS42IGwtNS45LDMuMSBNMTkuMSwxMi44TDkuNyw1LjFsMS4xLDcuNyBNMTMuNCwyOS44bDEsNy4zbDYuNiwxLjYgTTExLjYsMTguNGwxLDYuMSBNMzIuOCw0MS45IE0yNi42LDQwLjQgTTI3LjMsNDAuMmw2LjEsMS42IE00OS45LDUyLjFsLTUuNi03LjZsLTQuOS0xLjIiLGxpbmVYOiJNMTUuMiwzMCBNMTkuNywxNS42VjEuOUgyOSBNMzQuOCwxLjlINDAuNCBNNTUuMywxNS42VjEuOUg0NS45IE0xOS43LDQ0LjRWNTguMUgyOSBNMzQuOCw1OC4xSDQwLjQgTTU1LjMsNDQuNCBWNTguMUg0NS45IE0xMi41LDIwLjNsLTkuNCw5LjZsOS42LDkuOCBNMy4xLDI5LjloMTYuNSBNNjIuNSwyMC4zbDkuNCw5LjZMNjIuMywzOS43IE03MS45LDI5LjlINTUuNCIsbGluZVk6Ik0zOC44LDcuNyBNNTIuNywxMmgxMy4ydjkgTTY1LjksMjYuNlYzMiBNNTIuNyw0Ni4zaDEzLjJ2LTkgTTI0LjksMTJIMTEuOHY5IE0xMS44LDI2LjZWMzIgTTI0LjksNDYuM0gxMS44di05IE00OC4yLDUuMWwtOS4zLTlsLTkuNCw5LjIgTTM4LjktMy45VjEyIE00OC4yLDUzLjNsLTkuMyw5bC05LjQtOS4yIE0zOC45LDYyLjNWNDYuNCIsa2VlcDoiTTQsMTAuNVYxaDEwLjMgTTIwLjcsMWg2LjEgTTMzLDFoNi4xIE01NS40LDEwLjVWMUg0NS4yIE00LDE3LjN2Ni42IE01NS42LDE3LjN2Ni42IE00LDMwLjVWNDBoMTAuMyBNMjAuNyw0MCBoNi4xIE0zMyw0MGg2LjEgTTU1LjQsMzAuNVY0MEg0NS4yIE0yMSwxOC45aDYyLjl2NDguNkgyMVYxOC45eiIsY2xlYXI6Ik0yMiwxNC43bDMwLjksMzEgTTUyLjksMTQuN0wyMiw0NS43IE00LjcsMTYuOFY0LjJoMTMuMSBNMjYsNC4yaDcuOCBNNDEuNiw0LjJoNy44IE03MC4zLDE2LjhWNC4ySDU3LjIgTTQuNywyNS45djguNiBNNzAuMywyNS45djguNiBNNC43LDQzLjJ2MTIuNmgxMy4xIE0yNiw1NS44aDcuOCBNNDEuNiw1NS44aDcuOCBNNzAuMyw0My4ydjEyLjZINTcuMiJ9LHRpdGxlOm8uY2xvbmUoci50aXRsZSl9O3ZhciBzPW4ucHJvdG90eXBlO3MucmVuZGVyPXMudXBkYXRlVmlldz1zLnVwZGF0ZUxheW91dD1mdW5jdGlvbih0LGUsaSl7dmFyIG4sYSxyO2UuZWFjaENvbXBvbmVudCh7bWFpblR5cGU6ImJydXNoIn0sZnVuY3Rpb24odCl7bj10LmJydXNoVHlwZSxhPXQuYnJ1c2hPcHRpb24uYnJ1c2hNb2RlfHwic2luZ2xlIixyfD10LmFyZWFzLmxlbmd0aH0pLHRoaXMuX2JydXNoVHlwZT1uLHRoaXMuX2JydXNoTW9kZT1hLG8uZWFjaCh0LmdldCgidHlwZSIsITApLGZ1bmN0aW9uKGUpe3Quc2V0SWNvblN0YXR1cyhlLCgia2VlcCI9PT1lPyJtdWx0aXBsZSI9PT1hOiJjbGVhciI9PT1lP3I6ZT09PW4pPyJlbXBoYXNpcyI6Im5vcm1hbCIpfSl9LHMuZ2V0SWNvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1vZGVsLGU9dC5nZXQoImljb24iLCEwKSxpPXt9O3JldHVybiBvLmVhY2godC5nZXQoInR5cGUiLCEwKSxmdW5jdGlvbih0KXtlW3RdJiYoaVt0XT1lW3RdKX0pLGl9LHMub25jbGljaz1mdW5jdGlvbih0LGUsaSl7dmFyIGU9dGhpcy5hcGksbj10aGlzLl9icnVzaFR5cGUsYT10aGlzLl9icnVzaE1vZGU7ImNsZWFyIj09PWk/KGUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6ImF4aXNBcmVhU2VsZWN0IixpbnRlcnZhbHM6W119KSxlLmRpc3BhdGNoQWN0aW9uKHt0eXBlOiJicnVzaCIsY29tbWFuZDoiY2xlYXIiLGFyZWFzOltdfSkpOmUuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InRha2VHbG9iYWxDdXJzb3IiLGtleToiYnJ1c2giLGJydXNoT3B0aW9uOnticnVzaFR5cGU6ImtlZXAiPT09aT9uOm4hPT1pJiZpLGJydXNoTW9kZToia2VlcCI9PT1pPyJtdWx0aXBsZSI9PT1hPyJzaW5nbGUiOiJtdWx0aXBsZSI6YX19KX0sYS5yZWdpc3RlcigiYnJ1c2giLG4pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7aSg0MDApLGkoNDAxKX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe2lmKGlbMF09PT1pWzFdKXJldHVybiBpLnNsaWNlKCk7Zm9yKHZhciBuPTIwMCxhPShpWzFdLWlbMF0pL24sbz1pWzBdLHI9W10scz0wO3M8PW4mJm88aVsxXTtzKyspci5wdXNoKG8pLG8rPWE7cmV0dXJuIHIucHVzaChpWzFdKSxyfXZhciBhPWkoMjYxKSxvPWkoMSkscj1pKDQpLHM9WzIwLDE0MF0sbD1hLmV4dGVuZCh7dHlwZToidmlzdWFsTWFwLmNvbnRpbnVvdXMiLGRlZmF1bHRPcHRpb246e2FsaWduOiJhdXRvIixjYWxjdWxhYmxlOiExLHJhbmdlOm51bGwscmVhbHRpbWU6ITAsaXRlbUhlaWdodDpudWxsLGl0ZW1XaWR0aDpudWxsLGhvdmVyTGluazohMCxob3ZlckxpbmtEYXRhU2l6ZTpudWxsLGhvdmVyTGlua09uSGFuZGxlOm51bGx9LG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24odCxlKXtsLnN1cGVyQXBwbHkodGhpcywib3B0aW9uVXBkYXRlZCIsYXJndW1lbnRzKSx0aGlzLnJlc2V0RXh0ZW50KCksdGhpcy5yZXNldFZpc3VhbChmdW5jdGlvbih0KXt0Lm1hcHBpbmdNZXRob2Q9ImxpbmVhciIsdC5kYXRhRXh0ZW50PXRoaXMuZ2V0RXh0ZW50KCl9KSx0aGlzLl9yZXNldFJhbmdlKCl9LHJlc2V0SXRlbVNpemU6ZnVuY3Rpb24oKXtsLnN1cGVyQXBwbHkodGhpcywicmVzZXRJdGVtU2l6ZSIsYXJndW1lbnRzKTt2YXIgdD10aGlzLml0ZW1TaXplOyJob3Jpem9udGFsIj09PXRoaXMuX29yaWVudCYmdC5yZXZlcnNlKCksKG51bGw9PXRbMF18fGlzTmFOKHRbMF0pKSYmKHRbMF09c1swXSksKG51bGw9PXRbMV18fGlzTmFOKHRbMV0pKSYmKHRbMV09c1sxXSl9LF9yZXNldFJhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFeHRlbnQoKSxlPXRoaXMub3B0aW9uLnJhbmdlOyFlfHxlLmF1dG8/KHQuYXV0bz0xLHRoaXMub3B0aW9uLnJhbmdlPXQpOm8uaXNBcnJheShlKSYmKGVbMF0+ZVsxXSYmZS5yZXZlcnNlKCksZVswXT1NYXRoLm1heChlWzBdLHRbMF0pLGVbMV09TWF0aC5taW4oZVsxXSx0WzFdKSl9LGNvbXBsZXRlVmlzdWFsT3B0aW9uOmZ1bmN0aW9uKCl7YS5wcm90b3R5cGUuY29tcGxldGVWaXN1YWxPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpLG8uZWFjaCh0aGlzLnN0YXRlTGlzdCxmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbi5jb250cm9sbGVyW3RdLnN5bWJvbFNpemU7ZSYmZVswXSE9PWVbMV0mJihlWzBdPTApfSx0aGlzKX0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24ucmFuZ2U9dC5zbGljZSgpLHRoaXMuX3Jlc2V0UmFuZ2UoKX0sZ2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEV4dGVudCgpLGU9ci5hc2MoKHRoaXMuZ2V0KCJyYW5nZSIpfHxbXSkuc2xpY2UoKSk7cmV0dXJuIGVbMF0+dFsxXSYmKGVbMF09dFsxXSksZVsxXT50WzFdJiYoZVsxXT10WzFdKSxlWzBdPHRbMF0mJihlWzBdPXRbMF0pLGVbMV08dFswXSYmKGVbMV09dFswXSksZX0sZ2V0VmFsdWVTdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbi5yYW5nZSxpPXRoaXMuZ2V0RXh0ZW50KCk7cmV0dXJuKGVbMF08PWlbMF18fGVbMF08PXQpJiYoZVsxXT49aVsxXXx8dDw9ZVsxXSk/ImluUmFuZ2UiOiJvdXRPZlJhbmdlIn0sZmluZFRhcmdldERhdGFJbmRpY2VzOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0aGlzLmVhY2hUYXJnZXRTZXJpZXMoZnVuY3Rpb24oaSl7dmFyIG49W10sYT1pLmdldERhdGEoKTthLmVhY2godGhpcy5nZXREYXRhRGltZW5zaW9uKGEpLGZ1bmN0aW9uKGUsaSl7dFswXTw9ZSYmZTw9dFsxXSYmbi5wdXNoKGkpfSwhMCx0aGlzKSxlLnB1c2goe3Nlcmllc0lkOmkuaWQsZGF0YUluZGV4Om59KX0sdGhpcyksZX0sZ2V0VmlzdWFsTWV0YTpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsaSl7by5wdXNoKHt2YWx1ZTplLGNvbG9yOnQoZSxpKX0pfWZvcih2YXIgaT1uKHRoaXMsIm91dE9mUmFuZ2UiLHRoaXMuZ2V0RXh0ZW50KCkpLGE9bih0aGlzLCJpblJhbmdlIix0aGlzLm9wdGlvbi5yYW5nZS5zbGljZSgpKSxvPVtdLHI9MCxzPTAsbD1hLmxlbmd0aCx1PWkubGVuZ3RoO3M8dSYmKCFhLmxlbmd0aHx8aVtzXTw9YVswXSk7cysrKWlbc108YVtyXSYmZShpW3NdLCJvdXRPZlJhbmdlIik7Zm9yKHZhciBoPTE7cjxsO3IrKyxoPTApaCYmby5sZW5ndGgmJmUoYVtyXSwib3V0T2ZSYW5nZSIpLGUoYVtyXSwiaW5SYW5nZSIpO2Zvcih2YXIgaD0xO3M8dTtzKyspKCFhLmxlbmd0aHx8YVthLmxlbmd0aC0xXTxpW3NdKSYmKGgmJihvLmxlbmd0aCYmZShvW28ubGVuZ3RoLTFdLnZhbHVlLCJvdXRPZlJhbmdlIiksaD0wKSxlKGlbc10sIm91dE9mUmFuZ2UiKSk7dmFyIGM9by5sZW5ndGg7cmV0dXJue3N0b3BzOm8sb3V0ZXJDb2xvcnM6W2M/b1swXS5jb2xvcjoidHJhbnNwYXJlbnQiLGM/b1tjLTFdLmNvbG9yOiJ0cmFuc3BhcmVudCJdfX19KTt0LmV4cG9ydHM9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGksbil7cmV0dXJuIG5ldyBoLlBvbHlnb24oe3NoYXBlOntwb2ludHM6dH0sZHJhZ2dhYmxlOiEhaSxjdXJzb3I6ZSxkcmlmdDppLG9ubW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe3Yuc3RvcCh0LmV2ZW50KX0sb25kcmFnZW5kOm59KX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIDA9PT10P1tbMCwwXSxbZSwwXSxbZSwtZV1dOltbMCwwXSxbZSwwXSxbZSxlXV19ZnVuY3Rpb24gbyh0LGUsaSxuKXtyZXR1cm4gdD9bWzAsLV8oZSxiKGksMCkpXSxbUywwXSxbMCxfKGUsYihuLWksMCkpXV06W1swLDBdLFs1LC01XSxbNSw1XV07Cn1mdW5jdGlvbiByKHQsZSxpKXt2YXIgbj13LzIsYT10LmdldCgiaG92ZXJMaW5rRGF0YVNpemUiKTtyZXR1cm4gYSYmKG49eShhLGUsaSwhMCkvMiksbn1mdW5jdGlvbiBzKHQpe3ZhciBlPXQuZ2V0KCJob3ZlckxpbmtPbkhhbmRsZSIpO3JldHVybiEhKG51bGw9PWU/dC5nZXQoInJlYWx0aW1lIik6ZSl9ZnVuY3Rpb24gbCh0KXtyZXR1cm4idmVydGljYWwiPT09dD8ibnMtcmVzaXplIjoiZXctcmVzaXplIn12YXIgdT1pKDI2MiksaD1pKDMpLGM9aSgxKSxkPWkoNCksZj1pKDU5KSxwPWkoMTA1KSxnPWkoMjYzKSxtPWkoNSksdj1pKDIxKSx5PWQubGluZWFyTWFwLHg9Yy5lYWNoLF89TWF0aC5taW4sYj1NYXRoLm1heCx3PTEyLFM9NixNPXUuZXh0ZW5kKHt0eXBlOiJ2aXN1YWxNYXAuY29udGludW91cyIsaW5pdDpmdW5jdGlvbigpe00uc3VwZXJBcHBseSh0aGlzLCJpbml0Iixhcmd1bWVudHMpLHRoaXMuX3NoYXBlcz17fSx0aGlzLl9kYXRhSW50ZXJ2YWw9W10sdGhpcy5faGFuZGxlRW5kcz1bXSx0aGlzLl9vcmllbnQsdGhpcy5fdXNlSGFuZGxlLHRoaXMuX2hvdmVyTGlua0RhdGFJbmRpY2VzPVtdLHRoaXMuX2RyYWdnaW5nLHRoaXMuX2hvdmVyaW5nfSxkb1JlbmRlcjpmdW5jdGlvbih0LGUsaSxuKXtuJiYic2VsZWN0RGF0YVJhbmdlIj09PW4udHlwZSYmbi5mcm9tPT09dGhpcy51aWR8fHRoaXMuX2J1aWxkVmlldygpfSxfYnVpbGRWaWV3OmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5yZW1vdmVBbGwoKTt2YXIgdD10aGlzLnZpc3VhbE1hcE1vZGVsLGU9dGhpcy5ncm91cDt0aGlzLl9vcmllbnQ9dC5nZXQoIm9yaWVudCIpLHRoaXMuX3VzZUhhbmRsZT10LmdldCgiY2FsY3VsYWJsZSIpLHRoaXMuX3Jlc2V0SW50ZXJ2YWwoKSx0aGlzLl9yZW5kZXJCYXIoZSk7dmFyIGk9dC5nZXQoInRleHQiKTt0aGlzLl9yZW5kZXJFbmRzVGV4dChlLGksMCksdGhpcy5fcmVuZGVyRW5kc1RleHQoZSxpLDEpLHRoaXMuX3VwZGF0ZVZpZXcoITApLHRoaXMucmVuZGVyQmFja2dyb3VuZChlKSx0aGlzLl91cGRhdGVWaWV3KCksdGhpcy5fZW5hYmxlSG92ZXJMaW5rVG9TZXJpZXMoKSx0aGlzLl9lbmFibGVIb3ZlckxpbmtGcm9tU2VyaWVzKCksdGhpcy5wb3NpdGlvbkdyb3VwKGUpfSxfcmVuZGVyRW5kc1RleHQ6ZnVuY3Rpb24odCxlLGkpe2lmKGUpe3ZhciBuPWVbMS1pXTtuPW51bGwhPW4/bisiIjoiIjt2YXIgYT10aGlzLnZpc3VhbE1hcE1vZGVsLG89YS5nZXQoInRleHRHYXAiKSxyPWEuaXRlbVNpemUscz10aGlzLl9zaGFwZXMuYmFyR3JvdXAsbD10aGlzLl9hcHBseVRyYW5zZm9ybShbclswXS8yLDA9PT1pPy1vOnJbMV0rb10scyksdT10aGlzLl9hcHBseVRyYW5zZm9ybSgwPT09aT8iYm90dG9tIjoidG9wIixzKSxjPXRoaXMuX29yaWVudCxkPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWw7dGhpcy5ncm91cC5hZGQobmV3IGguVGV4dCh7c3R5bGU6e3g6bFswXSx5OmxbMV0sdGV4dFZlcnRpY2FsQWxpZ246Imhvcml6b250YWwiPT09Yz8ibWlkZGxlIjp1LHRleHRBbGlnbjoiaG9yaXpvbnRhbCI9PT1jP3U6ImNlbnRlciIsdGV4dDpuLHRleHRGb250OmQuZ2V0Rm9udCgpLHRleHRGaWxsOmQuZ2V0VGV4dENvbG9yKCl9fSkpfX0sX3JlbmRlckJhcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLGk9dGhpcy5fc2hhcGVzLGE9ZS5pdGVtU2l6ZSxvPXRoaXMuX29yaWVudCxyPXRoaXMuX3VzZUhhbmRsZSxzPWcuZ2V0SXRlbUFsaWduKGUsdGhpcy5hcGksYSksdT1pLmJhckdyb3VwPXRoaXMuX2NyZWF0ZUJhckdyb3VwKHMpO3UuYWRkKGkub3V0T2ZSYW5nZT1uKCkpLHUuYWRkKGkuaW5SYW5nZT1uKG51bGwscj9sKHRoaXMuX29yaWVudCk6bnVsbCxjLmJpbmQodGhpcy5fZHJhZ0hhbmRsZSx0aGlzLCJhbGwiLCExKSxjLmJpbmQodGhpcy5fZHJhZ0hhbmRsZSx0aGlzLCJhbGwiLCEwKSkpO3ZhciBoPWUudGV4dFN0eWxlTW9kZWwuZ2V0VGV4dFJlY3QoIuWbvSIpLGQ9YihoLndpZHRoLGguaGVpZ2h0KTtyJiYoaS5oYW5kbGVUaHVtYnM9W10saS5oYW5kbGVMYWJlbHM9W10saS5oYW5kbGVMYWJlbFBvaW50cz1bXSx0aGlzLl9jcmVhdGVIYW5kbGUodSwwLGEsZCxvLHMpLHRoaXMuX2NyZWF0ZUhhbmRsZSh1LDEsYSxkLG8scykpLHRoaXMuX2NyZWF0ZUluZGljYXRvcih1LGEsZCxvKSx0LmFkZCh1KX0sX2NyZWF0ZUhhbmRsZTpmdW5jdGlvbih0LGUsaSxvLHIpe3ZhciBzPWMuYmluZCh0aGlzLl9kcmFnSGFuZGxlLHRoaXMsZSwhMSksdT1jLmJpbmQodGhpcy5fZHJhZ0hhbmRsZSx0aGlzLGUsITApLGQ9bihhKGUsbyksbCh0aGlzLl9vcmllbnQpLHMsdSk7ZC5wb3NpdGlvblswXT1pWzBdLHQuYWRkKGQpO3ZhciBmPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWwscD1uZXcgaC5UZXh0KHtkcmFnZ2FibGU6ITAsZHJpZnQ6cyxvbm1vdXNlbW92ZTpmdW5jdGlvbih0KXt2LnN0b3AodC5ldmVudCl9LG9uZHJhZ2VuZDp1LHN0eWxlOnt4OjAseTowLHRleHQ6IiIsdGV4dEZvbnQ6Zi5nZXRGb250KCksdGV4dEZpbGw6Zi5nZXRUZXh0Q29sb3IoKX19KTt0aGlzLmdyb3VwLmFkZChwKTt2YXIgZz1bImhvcml6b250YWwiPT09cj9vLzI6MS41Km8sImhvcml6b250YWwiPT09cj8wPT09ZT8tKDEuNSpvKToxLjUqbzowPT09ZT8tby8yOm8vMl0sbT10aGlzLl9zaGFwZXM7bS5oYW5kbGVUaHVtYnNbZV09ZCxtLmhhbmRsZUxhYmVsUG9pbnRzW2VdPWcsbS5oYW5kbGVMYWJlbHNbZV09cH0sX2NyZWF0ZUluZGljYXRvcjpmdW5jdGlvbih0LGUsaSxhKXt2YXIgbz1uKFtbMCwwXV0sIm1vdmUiKTtvLnBvc2l0aW9uWzBdPWVbMF0sby5hdHRyKHtpbnZpc2libGU6ITAsc2lsZW50OiEwfSksdC5hZGQobyk7dmFyIHI9dGhpcy52aXN1YWxNYXBNb2RlbC50ZXh0U3R5bGVNb2RlbCxzPW5ldyBoLlRleHQoe3NpbGVudDohMCxpbnZpc2libGU6ITAsc3R5bGU6e3g6MCx5OjAsdGV4dDoiIix0ZXh0Rm9udDpyLmdldEZvbnQoKSx0ZXh0RmlsbDpyLmdldFRleHRDb2xvcigpfX0pO3RoaXMuZ3JvdXAuYWRkKHMpO3ZhciBsPVsiaG9yaXpvbnRhbCI9PT1hP2kvMjpTKzMsMF0sdT10aGlzLl9zaGFwZXM7dS5pbmRpY2F0b3I9byx1LmluZGljYXRvckxhYmVsPXMsdS5pbmRpY2F0b3JMYWJlbFBvaW50PWx9LF9kcmFnSGFuZGxlOmZ1bmN0aW9uKHQsZSxpLG4pe2lmKHRoaXMuX3VzZUhhbmRsZSl7aWYodGhpcy5fZHJhZ2dpbmc9IWUsIWUpe3ZhciBhPXRoaXMuX2FwcGx5VHJhbnNmb3JtKFtpLG5dLHRoaXMuX3NoYXBlcy5iYXJHcm91cCwhMCk7dGhpcy5fdXBkYXRlSW50ZXJ2YWwodCxhWzFdKSx0aGlzLl91cGRhdGVWaWV3KCl9ZT09PSF0aGlzLnZpc3VhbE1hcE1vZGVsLmdldCgicmVhbHRpbWUiKSYmdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6InNlbGVjdERhdGFSYW5nZSIsZnJvbTp0aGlzLnVpZCx2aXN1YWxNYXBJZDp0aGlzLnZpc3VhbE1hcE1vZGVsLmlkLHNlbGVjdGVkOnRoaXMuX2RhdGFJbnRlcnZhbC5zbGljZSgpfSksZT8hdGhpcy5faG92ZXJpbmcmJnRoaXMuX2NsZWFySG92ZXJMaW5rVG9TZXJpZXMoKTpzKHRoaXMudmlzdWFsTWFwTW9kZWwpJiZ0aGlzLl9kb0hvdmVyTGlua1RvU2VyaWVzKHRoaXMuX2hhbmRsZUVuZHNbdF0sITEpfX0sX3Jlc2V0SW50ZXJ2YWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpc3VhbE1hcE1vZGVsLGU9dGhpcy5fZGF0YUludGVydmFsPXQuZ2V0U2VsZWN0ZWQoKSxpPXQuZ2V0RXh0ZW50KCksbj1bMCx0Lml0ZW1TaXplWzFdXTt0aGlzLl9oYW5kbGVFbmRzPVt5KGVbMF0saSxuLCEwKSx5KGVbMV0saSxuLCEwKV19LF91cGRhdGVJbnRlcnZhbDpmdW5jdGlvbih0LGUpe2U9ZXx8MDt2YXIgaT10aGlzLnZpc3VhbE1hcE1vZGVsLG49dGhpcy5faGFuZGxlRW5kcyxhPVswLGkuaXRlbVNpemVbMV1dO2YoZSxuLGEsdCwwKTt2YXIgbz1pLmdldEV4dGVudCgpO3RoaXMuX2RhdGFJbnRlcnZhbD1beShuWzBdLGEsbywhMCkseShuWzFdLGEsbywhMCldfSxfdXBkYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpc3VhbE1hcE1vZGVsLGk9ZS5nZXRFeHRlbnQoKSxuPXRoaXMuX3NoYXBlcyxhPVswLGUuaXRlbVNpemVbMV1dLG89dD9hOnRoaXMuX2hhbmRsZUVuZHMscj10aGlzLl9jcmVhdGVCYXJWaXN1YWwodGhpcy5fZGF0YUludGVydmFsLGksbywiaW5SYW5nZSIpLHM9dGhpcy5fY3JlYXRlQmFyVmlzdWFsKGksaSxhLCJvdXRPZlJhbmdlIik7bi5pblJhbmdlLnNldFN0eWxlKHtmaWxsOnIuYmFyQ29sb3Isb3BhY2l0eTpyLm9wYWNpdHl9KS5zZXRTaGFwZSgicG9pbnRzIixyLmJhclBvaW50cyksbi5vdXRPZlJhbmdlLnNldFN0eWxlKHtmaWxsOnMuYmFyQ29sb3Isb3BhY2l0eTpzLm9wYWNpdHl9KS5zZXRTaGFwZSgicG9pbnRzIixzLmJhclBvaW50cyksdGhpcy5fdXBkYXRlSGFuZGxlKG8scil9LF9jcmVhdGVCYXJWaXN1YWw6ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9e2ZvcmNlU3RhdGU6bixjb252ZXJ0T3BhY2l0eVRvQWxwaGE6ITB9LG89dGhpcy5fbWFrZUNvbG9yR3JhZGllbnQodCxhKSxyPVt0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodFswXSwic3ltYm9sU2l6ZSIsYSksdGhpcy5nZXRDb250cm9sbGVyVmlzdWFsKHRbMV0sInN5bWJvbFNpemUiLGEpXSxzPXRoaXMuX2NyZWF0ZUJhclBvaW50cyhpLHIpO3JldHVybntiYXJDb2xvcjpuZXcgcCgwLDAsMCwxLG8pLGJhclBvaW50czpzLGhhbmRsZXNDb2xvcjpbb1swXS5jb2xvcixvW28ubGVuZ3RoLTFdLmNvbG9yXX19LF9tYWtlQ29sb3JHcmFkaWVudDpmdW5jdGlvbih0LGUpe3ZhciBpPTEwMCxuPVtdLGE9KHRbMV0tdFswXSkvaTtuLnB1c2goe2NvbG9yOnRoaXMuZ2V0Q29udHJvbGxlclZpc3VhbCh0WzBdLCJjb2xvciIsZSksb2Zmc2V0OjB9KTtmb3IodmFyIG89MTtvPGk7bysrKXt2YXIgcj10WzBdK2EqbztpZihyPnRbMV0pYnJlYWs7bi5wdXNoKHtjb2xvcjp0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwociwiY29sb3IiLGUpLG9mZnNldDpvL2l9KX1yZXR1cm4gbi5wdXNoKHtjb2xvcjp0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodFsxXSwiY29sb3IiLGUpLG9mZnNldDoxfSksbn0sX2NyZWF0ZUJhclBvaW50czpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudmlzdWFsTWFwTW9kZWwuaXRlbVNpemU7cmV0dXJuW1tpWzBdLWVbMF0sdFswXV0sW2lbMF0sdFswXV0sW2lbMF0sdFsxXV0sW2lbMF0tZVsxXSx0WzFdXV19LF9jcmVhdGVCYXJHcm91cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vcmllbnQsaT10aGlzLnZpc3VhbE1hcE1vZGVsLmdldCgiaW52ZXJzZSIpO3JldHVybiBuZXcgaC5Hcm91cCgiaG9yaXpvbnRhbCIhPT1lfHxpPyJob3Jpem9udGFsIj09PWUmJmk/e3NjYWxlOiJib3R0b20iPT09dD9bLTEsMV06WzEsMV0scm90YXRpb246LU1hdGguUEkvMn06InZlcnRpY2FsIiE9PWV8fGk/e3NjYWxlOiJsZWZ0Ij09PXQ/WzEsMV06Wy0xLDFdfTp7c2NhbGU6ImxlZnQiPT09dD9bMSwtMV06Wy0xLC0xXX06e3NjYWxlOiJib3R0b20iPT09dD9bMSwxXTpbLTEsMV0scm90YXRpb246TWF0aC5QSS8yfSl9LF91cGRhdGVIYW5kbGU6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl91c2VIYW5kbGUpe3ZhciBpPXRoaXMuX3NoYXBlcyxuPXRoaXMudmlzdWFsTWFwTW9kZWwsYT1pLmhhbmRsZVRodW1icyxvPWkuaGFuZGxlTGFiZWxzO3goWzAsMV0sZnVuY3Rpb24ocil7dmFyIHM9YVtyXTtzLnNldFN0eWxlKCJmaWxsIixlLmhhbmRsZXNDb2xvcltyXSkscy5wb3NpdGlvblsxXT10W3JdO3ZhciBsPWguYXBwbHlUcmFuc2Zvcm0oaS5oYW5kbGVMYWJlbFBvaW50c1tyXSxoLmdldFRyYW5zZm9ybShzLHRoaXMuZ3JvdXApKTtvW3JdLnNldFN0eWxlKHt4OmxbMF0seTpsWzFdLHRleHQ6bi5mb3JtYXRWYWx1ZVRleHQodGhpcy5fZGF0YUludGVydmFsW3JdKSx0ZXh0VmVydGljYWxBbGlnbjoibWlkZGxlIix0ZXh0QWxpZ246dGhpcy5fYXBwbHlUcmFuc2Zvcm0oImhvcml6b250YWwiPT09dGhpcy5fb3JpZW50PzA9PT1yPyJib3R0b20iOiJ0b3AiOiJsZWZ0IixpLmJhckdyb3VwKX0pfSx0aGlzKX19LF9zaG93SW5kaWNhdG9yOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPXRoaXMudmlzdWFsTWFwTW9kZWwscj1hLmdldEV4dGVudCgpLHM9YS5pdGVtU2l6ZSxsPVswLHNbMV1dLHU9eSh0LHIsbCwhMCksYz10aGlzLl9zaGFwZXMsZD1jLmluZGljYXRvcjtpZihkKXtkLnBvc2l0aW9uWzFdPXUsZC5hdHRyKCJpbnZpc2libGUiLCExKSxkLnNldFNoYXBlKCJwb2ludHMiLG8oISFpLG4sdSxzWzFdKSk7dmFyIGY9e2NvbnZlcnRPcGFjaXR5VG9BbHBoYTohMH0scD10aGlzLmdldENvbnRyb2xsZXJWaXN1YWwodCwiY29sb3IiLGYpO2Quc2V0U3R5bGUoImZpbGwiLHApO3ZhciBnPWguYXBwbHlUcmFuc2Zvcm0oYy5pbmRpY2F0b3JMYWJlbFBvaW50LGguZ2V0VHJhbnNmb3JtKGQsdGhpcy5ncm91cCkpLG09Yy5pbmRpY2F0b3JMYWJlbDttLmF0dHIoImludmlzaWJsZSIsITEpO3ZhciB2PXRoaXMuX2FwcGx5VHJhbnNmb3JtKCJsZWZ0IixjLmJhckdyb3VwKSx4PXRoaXMuX29yaWVudDttLnNldFN0eWxlKHt0ZXh0OihpP2k6IiIpK2EuZm9ybWF0VmFsdWVUZXh0KGUpLHRleHRWZXJ0aWNhbEFsaWduOiJob3Jpem9udGFsIj09PXg/djoibWlkZGxlIix0ZXh0QWxpZ246Imhvcml6b250YWwiPT09eD8iY2VudGVyIjp2LHg6Z1swXSx5OmdbMV19KX19LF9lbmFibGVIb3ZlckxpbmtUb1NlcmllczpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc2hhcGVzLmJhckdyb3VwLm9uKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKGUpe2lmKHQuX2hvdmVyaW5nPSEwLCF0Ll9kcmFnZ2luZyl7dmFyIGk9dC52aXN1YWxNYXBNb2RlbC5pdGVtU2l6ZSxuPXQuX2FwcGx5VHJhbnNmb3JtKFtlLm9mZnNldFgsZS5vZmZzZXRZXSx0Ll9zaGFwZXMuYmFyR3JvdXAsITAsITApO25bMV09XyhiKDAsblsxXSksaVsxXSksdC5fZG9Ib3ZlckxpbmtUb1NlcmllcyhuWzFdLDA8PW5bMF0mJm5bMF08PWlbMF0pfX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0Ll9ob3ZlcmluZz0hMSwhdC5fZHJhZ2dpbmcmJnQuX2NsZWFySG92ZXJMaW5rVG9TZXJpZXMoKX0pfSxfZW5hYmxlSG92ZXJMaW5rRnJvbVNlcmllczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYXBpLmdldFpyKCk7dGhpcy52aXN1YWxNYXBNb2RlbC5vcHRpb24uaG92ZXJMaW5rPyh0Lm9uKCJtb3VzZW92ZXIiLHRoaXMuX2hvdmVyTGlua0Zyb21TZXJpZXNNb3VzZU92ZXIsdGhpcyksdC5vbigibW91c2VvdXQiLHRoaXMuX2hpZGVJbmRpY2F0b3IsdGhpcykpOnRoaXMuX2NsZWFySG92ZXJMaW5rRnJvbVNlcmllcygpfSxfZG9Ib3ZlckxpbmtUb1NlcmllczpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudmlzdWFsTWFwTW9kZWwsbj1pLml0ZW1TaXplO2lmKGkub3B0aW9uLmhvdmVyTGluayl7dmFyIGE9WzAsblsxXV0sbz1pLmdldEV4dGVudCgpO3Q9XyhiKGFbMF0sdCksYVsxXSk7dmFyIGw9cihpLG8sYSksdT1bdC1sLHQrbF0saD15KHQsYSxvLCEwKSxjPVt5KHVbMF0sYSxvLCEwKSx5KHVbMV0sYSxvLCEwKV07dVswXTxhWzBdJiYoY1swXT0tKDEvMCkpLHVbMV0+YVsxXSYmKGNbMV09MS8wKSxlJiYoY1swXT09PS0oMS8wKT90aGlzLl9zaG93SW5kaWNhdG9yKGgsY1sxXSwiPCAiLGwpOmNbMV09PT0xLzA/dGhpcy5fc2hvd0luZGljYXRvcihoLGNbMF0sIj4gIixsKTp0aGlzLl9zaG93SW5kaWNhdG9yKGgsaCwi4omIICIsbCkpO3ZhciBkPXRoaXMuX2hvdmVyTGlua0RhdGFJbmRpY2VzLGY9W107KGV8fHMoaSkpJiYoZj10aGlzLl9ob3ZlckxpbmtEYXRhSW5kaWNlcz1pLmZpbmRUYXJnZXREYXRhSW5kaWNlcyhjKSk7dmFyIHA9bS5jb21wcmVzc0JhdGNoZXMoZCxmKTt0aGlzLl9kaXNwYXRjaEhpZ2hEb3duKCJkb3ducGxheSIsZy5jb252ZXJ0RGF0YUluZGV4KHBbMF0pKSx0aGlzLl9kaXNwYXRjaEhpZ2hEb3duKCJoaWdobGlnaHQiLGcuY29udmVydERhdGFJbmRleChwWzFdKSl9fSxfaG92ZXJMaW5rRnJvbVNlcmllc01vdXNlT3ZlcjpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldCxpPXRoaXMudmlzdWFsTWFwTW9kZWw7aWYoZSYmbnVsbCE9ZS5kYXRhSW5kZXgpe3ZhciBuPXRoaXMuZWNNb2RlbC5nZXRTZXJpZXNCeUluZGV4KGUuc2VyaWVzSW5kZXgpO2lmKGkuaXNUYXJnZXRTZXJpZXMobikpe3ZhciBhPW4uZ2V0RGF0YShlLmRhdGFUeXBlKSxvPWEuZ2V0RGltZW5zaW9uKGkuZ2V0RGF0YURpbWVuc2lvbihhKSkscj1hLmdldChvLGUuZGF0YUluZGV4LCEwKTtpc05hTihyKXx8dGhpcy5fc2hvd0luZGljYXRvcihyLHIpfX19LF9oaWRlSW5kaWNhdG9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc2hhcGVzO3QuaW5kaWNhdG9yJiZ0LmluZGljYXRvci5hdHRyKCJpbnZpc2libGUiLCEwKSx0LmluZGljYXRvckxhYmVsJiZ0LmluZGljYXRvckxhYmVsLmF0dHIoImludmlzaWJsZSIsITApfSxfY2xlYXJIb3ZlckxpbmtUb1NlcmllczpmdW5jdGlvbigpe3RoaXMuX2hpZGVJbmRpY2F0b3IoKTt2YXIgdD10aGlzLl9ob3ZlckxpbmtEYXRhSW5kaWNlczt0aGlzLl9kaXNwYXRjaEhpZ2hEb3duKCJkb3ducGxheSIsZy5jb252ZXJ0RGF0YUluZGV4KHQpKSx0Lmxlbmd0aD0wfSxfY2xlYXJIb3ZlckxpbmtGcm9tU2VyaWVzOmZ1bmN0aW9uKCl7dGhpcy5faGlkZUluZGljYXRvcigpO3ZhciB0PXRoaXMuYXBpLmdldFpyKCk7dC5vZmYoIm1vdXNlb3ZlciIsdGhpcy5faG92ZXJMaW5rRnJvbVNlcmllc01vdXNlT3ZlciksdC5vZmYoIm1vdXNlb3V0Iix0aGlzLl9oaWRlSW5kaWNhdG9yKX0sX2FwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciBhPWguZ2V0VHJhbnNmb3JtKGUsbj9udWxsOnRoaXMuZ3JvdXApO3JldHVybiBoW2MuaXNBcnJheSh0KT8iYXBwbHlUcmFuc2Zvcm0iOiJ0cmFuc2Zvcm1EaXJlY3Rpb24iXSh0LGEsaSl9LF9kaXNwYXRjaEhpZ2hEb3duOmZ1bmN0aW9uKHQsZSl7ZSYmZS5sZW5ndGgmJnRoaXMuYXBpLmRpc3BhdGNoQWN0aW9uKHt0eXBlOnQsYmF0Y2g6ZX0pfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJIb3ZlckxpbmtGcm9tU2VyaWVzKCksdGhpcy5fY2xlYXJIb3ZlckxpbmtUb1NlcmllcygpfSxyZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckhvdmVyTGlua0Zyb21TZXJpZXMoKSx0aGlzLl9jbGVhckhvdmVyTGlua1RvU2VyaWVzKCl9fSk7dC5leHBvcnRzPU19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7dmFyIGk9dC5pbnZlcnNlOygidmVydGljYWwiPT09dC5vcmllbnQ/IWk6aSkmJmUucmV2ZXJzZSgpfXZhciBhPWkoMjYxKSxvPWkoMSkscj1pKDg4KSxzPWkoMjc0KSxsPWkoNCkucmVmb3JtSW50ZXJ2YWxzLHU9YS5leHRlbmQoe3R5cGU6InZpc3VhbE1hcC5waWVjZXdpc2UiLGRlZmF1bHRPcHRpb246e3NlbGVjdGVkOm51bGwsbWluT3BlbjohMSxtYXhPcGVuOiExLGFsaWduOiJhdXRvIixpdGVtV2lkdGg6MjAsaXRlbUhlaWdodDoxNCxpdGVtU3ltYm9sOiJyb3VuZFJlY3QiLHBpZWNlTGlzdDpudWxsLGNhdGVnb3JpZXM6bnVsbCxzcGxpdE51bWJlcjo1LHNlbGVjdGVkTW9kZToibXVsdGlwbGUiLGl0ZW1HYXA6MTAsaG92ZXJMaW5rOiEwLHNob3dMYWJlbDpudWxsfSxvcHRpb25VcGRhdGVkOmZ1bmN0aW9uKHQsZSl7dS5zdXBlckFwcGx5KHRoaXMsIm9wdGlvblVwZGF0ZWQiLGFyZ3VtZW50cyksdGhpcy5fcGllY2VMaXN0PVtdLHRoaXMucmVzZXRFeHRlbnQoKTt2YXIgaT10aGlzLl9tb2RlPXRoaXMuX2RldGVybWluZU1vZGUoKTtoW3RoaXMuX21vZGVdLmNhbGwodGhpcyksdGhpcy5fcmVzZXRTZWxlY3RlZCh0LGUpO3ZhciBuPXRoaXMub3B0aW9uLmNhdGVnb3JpZXM7dGhpcy5yZXNldFZpc3VhbChmdW5jdGlvbih0LGUpeyJjYXRlZ29yaWVzIj09PWk/KHQubWFwcGluZ01ldGhvZD0iY2F0ZWdvcnkiLHQuY2F0ZWdvcmllcz1vLmNsb25lKG4pKToodC5kYXRhRXh0ZW50PXRoaXMuZ2V0RXh0ZW50KCksdC5tYXBwaW5nTWV0aG9kPSJwaWVjZXdpc2UiLHQucGllY2VMaXN0PW8ubWFwKHRoaXMuX3BpZWNlTGlzdCxmdW5jdGlvbih0KXt2YXIgdD1vLmNsb25lKHQpO3JldHVybiJpblJhbmdlIiE9PWUmJih0LnZpc3VhbD1udWxsKSx0fSkpfSl9LGNvbXBsZXRlVmlzdWFsT3B0aW9uOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsaSl7cmV0dXJuIHQmJnRbZV0mJihvLmlzT2JqZWN0KHRbZV0pP3RbZV0uaGFzT3duUHJvcGVydHkoaSk6dFtlXT09PWkpfXZhciBlPXRoaXMub3B0aW9uLGk9e30sbj1yLmxpc3RWaXN1YWxUeXBlcygpLGw9dGhpcy5pc0NhdGVnb3J5KCk7by5lYWNoKGUucGllY2VzLGZ1bmN0aW9uKHQpe28uZWFjaChuLGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihpW2VdPTEpfSl9KSxvLmVhY2goaSxmdW5jdGlvbihpLG4pe3ZhciBhPTA7by5lYWNoKHRoaXMuc3RhdGVMaXN0LGZ1bmN0aW9uKGkpe2F8PXQoZSxpLG4pfHx0KGUudGFyZ2V0LGksbil9LHRoaXMpLCFhJiZvLmVhY2godGhpcy5zdGF0ZUxpc3QsZnVuY3Rpb24odCl7KGVbdF18fChlW3RdPXt9KSlbbl09cy5nZXQobiwiaW5SYW5nZSI9PT10PyJhY3RpdmUiOiJpbmFjdGl2ZSIsbCl9KX0sdGhpcyksYS5wcm90b3R5cGUuY29tcGxldGVWaXN1YWxPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVzZXRTZWxlY3RlZDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9uLG49dGhpcy5fcGllY2VMaXN0LGE9KGU/aTp0KS5zZWxlY3RlZHx8e307aWYoaS5zZWxlY3RlZD1hLG8uZWFjaChuLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRTZWxlY3RlZE1hcEtleSh0KTthLmhhc093blByb3BlcnR5KGkpfHwoYVtpXT0hMCl9LHRoaXMpLCJzaW5nbGUiPT09aS5zZWxlY3RlZE1vZGUpe3ZhciByPSExO28uZWFjaChuLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRTZWxlY3RlZE1hcEtleSh0KTthW2ldJiYocj9hW2ldPSExOnI9ITApfSx0aGlzKX19LGdldFNlbGVjdGVkTWFwS2V5OmZ1bmN0aW9uKHQpe3JldHVybiJjYXRlZ29yaWVzIj09PXRoaXMuX21vZGU/dC52YWx1ZSsiIjp0LmluZGV4KyIifSxnZXRQaWVjZUxpc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGllY2VMaXN0fSxfZGV0ZXJtaW5lTW9kZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uO3JldHVybiB0LnBpZWNlcyYmdC5waWVjZXMubGVuZ3RoPjA/InBpZWNlcyI6dGhpcy5vcHRpb24uY2F0ZWdvcmllcz8iY2F0ZWdvcmllcyI6InNwbGl0TnVtYmVyIn0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uc2VsZWN0ZWQ9by5jbG9uZSh0KX0sZ2V0VmFsdWVTdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT1yLmZpbmRQaWVjZUluZGV4KHQsdGhpcy5fcGllY2VMaXN0KTtyZXR1cm4gbnVsbCE9ZSYmdGhpcy5vcHRpb24uc2VsZWN0ZWRbdGhpcy5nZXRTZWxlY3RlZE1hcEtleSh0aGlzLl9waWVjZUxpc3RbZV0pXT8iaW5SYW5nZSI6Im91dE9mUmFuZ2UifSxmaW5kVGFyZ2V0RGF0YUluZGljZXM6ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHRoaXMuZWFjaFRhcmdldFNlcmllcyhmdW5jdGlvbihpKXt2YXIgbj1bXSxhPWkuZ2V0RGF0YSgpO2EuZWFjaCh0aGlzLmdldERhdGFEaW1lbnNpb24oYSksZnVuY3Rpb24oZSxpKXt2YXIgYT1yLmZpbmRQaWVjZUluZGV4KGUsdGhpcy5fcGllY2VMaXN0KTthPT09dCYmbi5wdXNoKGkpfSwhMCx0aGlzKSxlLnB1c2goe3Nlcmllc0lkOmkuaWQsZGF0YUluZGV4Om59KX0sdGhpcyksZX0sZ2V0UmVwcmVzZW50VmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodGhpcy5pc0NhdGVnb3J5KCkpZT10LnZhbHVlO2Vsc2UgaWYobnVsbCE9dC52YWx1ZSllPXQudmFsdWU7ZWxzZXt2YXIgaT10LmludGVydmFsfHxbXTtlPWlbMF09PT0tKDEvMCkmJmlbMV09PT0xLzA/MDooaVswXStpWzFdKS8yfXJldHVybiBlfSxnZXRWaXN1YWxNZXRhOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxvKXt2YXIgcj1hLmdldFJlcHJlc2VudFZhbHVlKHtpbnRlcnZhbDplfSk7b3x8KG89YS5nZXRWYWx1ZVN0YXRlKHIpKTt2YXIgcz10KHIsbyk7ZVswXT09PS0oMS8wKT9uWzBdPXM6ZVsxXT09PTEvMD9uWzFdPXM6aS5wdXNoKHt2YWx1ZTplWzBdLGNvbG9yOnN9LHt2YWx1ZTplWzFdLGNvbG9yOnN9KX1pZighdGhpcy5pc0NhdGVnb3J5KCkpe3ZhciBpPVtdLG49W10sYT10aGlzLHI9dGhpcy5fcGllY2VMaXN0LnNsaWNlKCk7aWYoci5sZW5ndGgpe3ZhciBzPXJbMF0uaW50ZXJ2YWxbMF07cyE9PS0oMS8wKSYmci51bnNoaWZ0KHtpbnRlcnZhbDpbLSgxLzApLHNdfSkscz1yW3IubGVuZ3RoLTFdLmludGVydmFsWzFdLHMhPT0xLzAmJnIucHVzaCh7aW50ZXJ2YWw6W3MsMS8wXX0pfWVsc2Ugci5wdXNoKHtpbnRlcnZhbDpbLSgxLzApLDEvMF19KTt2YXIgbD0tKDEvMCk7cmV0dXJuIG8uZWFjaChyLGZ1bmN0aW9uKHQpe3ZhciBpPXQuaW50ZXJ2YWw7aSYmKGlbMF0+bCYmZShbbCxpWzBdXSwib3V0T2ZSYW5nZSIpLGUoaS5zbGljZSgpKSxsPWlbMV0pfSx0aGlzKSx7c3RvcHM6aSxvdXRlckNvbG9yczpufX19fSksaD17c3BsaXROdW1iZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbixlPXRoaXMuX3BpZWNlTGlzdCxpPU1hdGgubWluKHQucHJlY2lzaW9uLDIwKSxuPXRoaXMuZ2V0RXh0ZW50KCksYT10LnNwbGl0TnVtYmVyO2E9TWF0aC5tYXgocGFyc2VJbnQoYSwxMCksMSksdC5zcGxpdE51bWJlcj1hO2Zvcih2YXIgcj0oblsxXS1uWzBdKS9hOytyLnRvRml4ZWQoaSkhPT1yJiZpPDU7KWkrKzt0LnByZWNpc2lvbj1pLHI9K3IudG9GaXhlZChpKTt2YXIgcz0wO3QubWluT3BlbiYmZS5wdXNoKHtpbmRleDpzKyssaW50ZXJ2YWw6Wy0oMS8wKSxuWzBdXSxjbG9zZTpbMCwwXX0pO2Zvcih2YXIgdT1uWzBdLGg9cythO3M8aDt1Kz1yKXt2YXIgYz1zPT09YS0xP25bMV06dStyO2UucHVzaCh7aW5kZXg6cysrLGludGVydmFsOlt1LGNdLGNsb3NlOlsxLDFdfSl9dC5tYXhPcGVuJiZlLnB1c2goe2luZGV4OnMrKyxpbnRlcnZhbDpbblsxXSwxLzBdLGNsb3NlOlswLDBdfSksbChlKSxvLmVhY2goZSxmdW5jdGlvbih0KXt0LnRleHQ9dGhpcy5mb3JtYXRWYWx1ZVRleHQodC5pbnRlcnZhbCl9LHRoaXMpfSxjYXRlZ29yaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb247by5lYWNoKHQuY2F0ZWdvcmllcyxmdW5jdGlvbih0KXt0aGlzLl9waWVjZUxpc3QucHVzaCh7dGV4dDp0aGlzLmZvcm1hdFZhbHVlVGV4dCh0LCEwKSx2YWx1ZTp0fSl9LHRoaXMpLG4odCx0aGlzLl9waWVjZUxpc3QpfSxwaWVjZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbixlPXRoaXMuX3BpZWNlTGlzdDtvLmVhY2godC5waWVjZXMsZnVuY3Rpb24odCxpKXtvLmlzT2JqZWN0KHQpfHwodD17dmFsdWU6dH0pO3ZhciBuPXt0ZXh0OiIiLGluZGV4Oml9O2lmKG51bGwhPXQubGFiZWwmJihuLnRleHQ9dC5sYWJlbCksdC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSl7dmFyIGE9bi52YWx1ZT10LnZhbHVlO24uaW50ZXJ2YWw9W2EsYV0sbi5jbG9zZT1bMSwxXX1lbHNle2Zvcih2YXIgcz1uLmludGVydmFsPVtdLGw9bi5jbG9zZT1bMCwwXSx1PVsxLDAsMV0saD1bLSgxLzApLDEvMF0sYz1bXSxkPTA7ZDwyO2QrKyl7Zm9yKHZhciBmPVtbImd0ZSIsImd0IiwibWluIl0sWyJsdGUiLCJsdCIsIm1heCJdXVtkXSxwPTA7cDwzJiZudWxsPT1zW2RdO3ArKylzW2RdPXRbZltwXV0sbFtkXT11W3BdLGNbZF09Mj09PXA7bnVsbD09c1tkXSYmKHNbZF09aFtkXSl9Y1swXSYmc1sxXT09PTEvMCYmKGxbMF09MCksY1sxXSYmc1swXT09PS0oMS8wKSYmKGxbMV09MCksc1swXT09PXNbMV0mJmxbMF0mJmxbMV0mJihuLnZhbHVlPXNbMF0pfW4udmlzdWFsPXIucmV0cmlldmVWaXN1YWxzKHQpLGUucHVzaChuKX0sdGhpcyksbih0LGUpLGwoZSksby5lYWNoKGUsZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9zZSxpPVtbIjwiLCLiiaQiXVtlWzFdXSxbIj4iLCLiiaUiXVtlWzBdXV07dC50ZXh0PXQudGV4dHx8dGhpcy5mb3JtYXRWYWx1ZVRleHQobnVsbCE9dC52YWx1ZT90LnZhbHVlOnQuaW50ZXJ2YWwsITEsaSl9LHRoaXMpfX07dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDI2MiksYT1pKDEpLG89aSgzKSxyPWkoMjQpLHM9aSg5KSxsPWkoMjYzKSx1PW4uZXh0ZW5kKHt0eXBlOiJ2aXN1YWxNYXAucGllY2V3aXNlIixkb1JlbmRlcjpmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIHI9dC5waWVjZSxzPW5ldyBvLkdyb3VwO3Mub25jbGljaz1hLmJpbmQodGhpcy5fb25JdGVtQ2xpY2ssdGhpcyxyKSx0aGlzLl9lbmFibGVIb3Zlckxpbmsocyx0LmluZGV4SW5Nb2RlbFBpZWNlTGlzdCk7dmFyIGQ9aS5nZXRSZXByZXNlbnRWYWx1ZShyKTtpZih0aGlzLl9jcmVhdGVJdGVtU3ltYm9sKHMsZCxbMCwwLGNbMF0sY1sxXV0pLHApe3ZhciBmPXRoaXMudmlzdWFsTWFwTW9kZWwuZ2V0VmFsdWVTdGF0ZShkKTtzLmFkZChuZXcgby5UZXh0KHtzdHlsZTp7eDoicmlnaHQiPT09aD8tbjpjWzBdK24seTpjWzFdLzIsdGV4dDpyLnRleHQsdGV4dFZlcnRpY2FsQWxpZ246Im1pZGRsZSIsdGV4dEFsaWduOmgsdGV4dEZvbnQ6bCx0ZXh0RmlsbDp1LG9wYWNpdHk6Im91dE9mUmFuZ2UiPT09Zj8uNToxfX0pKX1lLmFkZChzKX12YXIgZT10aGlzLmdyb3VwO2UucmVtb3ZlQWxsKCk7dmFyIGk9dGhpcy52aXN1YWxNYXBNb2RlbCxuPWkuZ2V0KCJ0ZXh0R2FwIikscj1pLnRleHRTdHlsZU1vZGVsLGw9ci5nZXRGb250KCksdT1yLmdldFRleHRDb2xvcigpLGg9dGhpcy5fZ2V0SXRlbUFsaWduKCksYz1pLml0ZW1TaXplLGQ9dGhpcy5fZ2V0Vmlld0RhdGEoKSxmPWQuZW5kc1RleHQscD1hLnJldHJpZXZlKGkuZ2V0KCJzaG93TGFiZWwiLCEwKSwhZik7ZiYmdGhpcy5fcmVuZGVyRW5kc1RleHQoZSxmWzBdLGMscCxoKSxhLmVhY2goZC52aWV3UGllY2VMaXN0LHQsdGhpcyksZiYmdGhpcy5fcmVuZGVyRW5kc1RleHQoZSxmWzFdLGMscCxoKSxzLmJveChpLmdldCgib3JpZW50IiksZSxpLmdldCgiaXRlbUdhcCIpKSx0aGlzLnJlbmRlckJhY2tncm91bmQoZSksdGhpcy5wb3NpdGlvbkdyb3VwKGUpfSxfZW5hYmxlSG92ZXJMaW5rOmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0KXt2YXIgaT10aGlzLnZpc3VhbE1hcE1vZGVsO2kub3B0aW9uLmhvdmVyTGluayYmdGhpcy5hcGkuZGlzcGF0Y2hBY3Rpb24oe3R5cGU6dCxiYXRjaDpsLmNvbnZlcnREYXRhSW5kZXgoaS5maW5kVGFyZ2V0RGF0YUluZGljZXMoZSkpfSl9dC5vbigibW91c2VvdmVyIixhLmJpbmQoaSx0aGlzLCJoaWdobGlnaHQiKSkub24oIm1vdXNlb3V0IixhLmJpbmQoaSx0aGlzLCJkb3ducGxheSIpKX0sX2dldEl0ZW1BbGlnbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlzdWFsTWFwTW9kZWwsZT10Lm9wdGlvbjtpZigidmVydGljYWwiPT09ZS5vcmllbnQpcmV0dXJuIGwuZ2V0SXRlbUFsaWduKHQsdGhpcy5hcGksdC5pdGVtU2l6ZSk7dmFyIGk9ZS5hbGlnbjtyZXR1cm4gaSYmImF1dG8iIT09aXx8KGk9ImxlZnQiKSxpfSxfcmVuZGVyRW5kc1RleHQ6ZnVuY3Rpb24odCxlLGksbixhKXtpZihlKXt2YXIgcj1uZXcgby5Hcm91cCxzPXRoaXMudmlzdWFsTWFwTW9kZWwudGV4dFN0eWxlTW9kZWw7ci5hZGQobmV3IG8uVGV4dCh7c3R5bGU6e3g6bj8icmlnaHQiPT09YT9pWzBdOjA6aVswXS8yLHk6aVsxXS8yLHRleHRWZXJ0aWNhbEFsaWduOiJtaWRkbGUiLHRleHRBbGlnbjpuP2E6ImNlbnRlciIsdGV4dDplLHRleHRGb250OnMuZ2V0Rm9udCgpLHRleHRGaWxsOnMuZ2V0VGV4dENvbG9yKCl9fSkpLHQuYWRkKHIpfX0sX2dldFZpZXdEYXRhOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aXN1YWxNYXBNb2RlbCxlPWEubWFwKHQuZ2V0UGllY2VMaXN0KCksZnVuY3Rpb24odCxlKXtyZXR1cm57cGllY2U6dCxpbmRleEluTW9kZWxQaWVjZUxpc3Q6ZX19KSxpPXQuZ2V0KCJ0ZXh0Iiksbj10LmdldCgib3JpZW50Iiksbz10LmdldCgiaW52ZXJzZSIpO3JldHVybigiaG9yaXpvbnRhbCI9PT1uP286IW8pP2UucmV2ZXJzZSgpOmkmJihpPWkuc2xpY2UoKS5yZXZlcnNlKCkpLHt2aWV3UGllY2VMaXN0OmUsZW5kc1RleHQ6aX19LF9jcmVhdGVJdGVtU3ltYm9sOmZ1bmN0aW9uKHQsZSxpKXt0LmFkZChyLmNyZWF0ZVN5bWJvbCh0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwoZSwic3ltYm9sIiksaVswXSxpWzFdLGlbMl0saVszXSx0aGlzLmdldENvbnRyb2xsZXJWaXN1YWwoZSwiY29sb3IiKSkpfSxfb25JdGVtQ2xpY2s6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aXN1YWxNYXBNb2RlbCxpPWUub3B0aW9uLG49YS5jbG9uZShpLnNlbGVjdGVkKSxvPWUuZ2V0U2VsZWN0ZWRNYXBLZXkodCk7InNpbmdsZSI9PT1pLnNlbGVjdGVkTW9kZT8obltvXT0hMCxhLmVhY2gobixmdW5jdGlvbih0LGUpe25bZV09ZT09PW99KSk6bltvXT0hbltvXSx0aGlzLmFwaS5kaXNwYXRjaEFjdGlvbih7dHlwZToic2VsZWN0RGF0YVJhbmdlIixmcm9tOnRoaXMudWlkLHZpc3VhbE1hcElkOnRoaXMudmlzdWFsTWFwTW9kZWwuaWQsc2VsZWN0ZWQ6bn0pfX0pO3QuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsaSl7aSgyKS5yZWdpc3RlclByZXByb2Nlc3NvcihpKDI2NCkpLGkoMjY1KSxpKDI2NiksaSgzOTYpLGkoMzk3KSxpKDI2Nyl9LGZ1bmN0aW9uKHQsZSxpKXtpKDIpLnJlZ2lzdGVyUHJlcHJvY2Vzc29yKGkoMjY0KSksaSgyNjUpLGkoMjY2KSxpKDM5OCksaSgzOTkpLGkoMjY3KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxpKXt0aGlzLl9tb2RlbD10fWZ1bmN0aW9uIGEodCxlLGksbil7dmFyIGE9aS5jYWxlbmRhck1vZGVsLG89aS5zZXJpZXNNb2RlbCxyPWE/YS5jb29yZGluYXRlU3lzdGVtOm8/by5jb29yZGluYXRlU3lzdGVtOm51bGw7cmV0dXJuIHI9PT10aGlzP3JbdF0obik6bnVsbH12YXIgbz1pKDkpLHI9aSg0KSxzPWkoMSksbD04NjRlNTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bix0eXBlOiJjYWxlbmRhciIsZGltZW5zaW9uczpbInRpbWUiLCJ2YWx1ZSJdLGdldERpbWVuc2lvbnNJbmZvOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJ0aW1lIix0eXBlOiJ0aW1lIn1dfSxnZXRSYW5nZUluZm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFuZ2VJbmZvfSxnZXRNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlbH0sZ2V0UmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWN0fSxnZXRDZWxsV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3d9LGdldENlbGxIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2h9LGdldE9yaWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnR9LGdldEZpcnN0RGF5T2ZXZWVrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpcnN0RGF5T2ZXZWVrfSxnZXREYXRlSW5mbzpmdW5jdGlvbih0KXt0PXIucGFyc2VEYXRlKHQpO3ZhciBlPXQuZ2V0RnVsbFllYXIoKSxpPXQuZ2V0TW9udGgoKSsxO2k9aTwxMD8iMCIraTppO3ZhciBuPXQuZ2V0RGF0ZSgpO249bjwxMD8iMCIrbjpuO3ZhciBhPXQuZ2V0RGF5KCk7cmV0dXJuIGE9TWF0aC5hYnMoKGErNy10aGlzLmdldEZpcnN0RGF5T2ZXZWVrKCkpJTcpLHt5OmUsbTppLGQ6bixkYXk6YSx0aW1lOnQuZ2V0VGltZSgpLGZvcm1hdGVkRGF0ZTplKyItIitpKyItIituLGRhdGU6dH19LGdldE5leHRORGF5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZXx8MCwwPT09ZT90aGlzLmdldERhdGVJbmZvKHQpOih0PW5ldyBEYXRlKHRoaXMuZ2V0RGF0ZUluZm8odCkudGltZSksdC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpLHRoaXMuZ2V0RGF0ZUluZm8odCkpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIG51bGwhPXRbZV0mJiJhdXRvIiE9PXRbZV19dGhpcy5fZmlyc3REYXlPZldlZWs9dGhpcy5fbW9kZWwuZ2V0TW9kZWwoImRheUxhYmVsIikuZ2V0KCJmaXJzdERheSIpLHRoaXMuX29yaWVudD10aGlzLl9tb2RlbC5nZXQoIm9yaWVudCIpLHRoaXMuX2xpbmVXaWR0aD10aGlzLl9tb2RlbC5nZXRNb2RlbCgiaXRlbVN0eWxlLm5vcm1hbCIpLmdldEl0ZW1TdHlsZSgpLmxpbmVXaWR0aHx8MCx0aGlzLl9yYW5nZUluZm89dGhpcy5fZ2V0UmFuZ2VJbmZvKHRoaXMuX2luaXRSYW5nZU9wdGlvbigpKTt2YXIgbj10aGlzLl9yYW5nZUluZm8ud2Vla3N8fDEsYT1bIndpZHRoIiwiaGVpZ2h0Il0scj10aGlzLl9tb2RlbC5nZXQoImNlbGxTaXplIikuc2xpY2UoKSxsPXRoaXMuX21vZGVsLmdldEJveExheW91dFBhcmFtcygpLHU9Imhvcml6b250YWwiPT09dGhpcy5fb3JpZW50P1tuLDddOls3LG5dO3MuZWFjaChbMCwxXSxmdW5jdGlvbih0KXtpKHIsdCkmJihsW2FbdF1dPXJbdF0qdVt0XSl9KTt2YXIgaD17d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSxjPXRoaXMuX3JlY3Q9by5nZXRMYXlvdXRSZWN0KGwsaCk7cy5lYWNoKFswLDFdLGZ1bmN0aW9uKHQpe2kocix0KXx8KHJbdF09Y1thW3RdXS91W3RdKX0pLHRoaXMuX3N3PXJbMF0sdGhpcy5fc2g9clsxXX0sZGF0YVRvUG9pbnQ6ZnVuY3Rpb24odCxlKXtzLmlzQXJyYXkodCkmJih0PXRbMF0pLG51bGw9PWUmJihlPSEwKTt2YXIgaT10aGlzLmdldERhdGVJbmZvKHQpLG49dGhpcy5fcmFuZ2VJbmZvLGE9aS5mb3JtYXRlZERhdGU7aWYoZSYmIShpLnRpbWU+PW4uc3RhcnQudGltZSYmaS50aW1lPD1uLmVuZC50aW1lKSlyZXR1cm5bTmFOLE5hTl07dmFyIG89aS5kYXkscj10aGlzLl9nZXRSYW5nZUluZm8oW24uc3RhcnQudGltZSxhXSkubnRoV2VlaztyZXR1cm4idmVydGljYWwiPT09dGhpcy5fb3JpZW50P1t0aGlzLl9yZWN0Lngrbyp0aGlzLl9zdyt0aGlzLl9zdy8yLHRoaXMuX3JlY3QueStyKnRoaXMuX3NoK3RoaXMuX3NoLzJdOlt0aGlzLl9yZWN0Lngrcip0aGlzLl9zdyt0aGlzLl9zdy8yLHRoaXMuX3JlY3QueStvKnRoaXMuX3NoK3RoaXMuX3NoLzJdfSxwb2ludFRvRGF0YTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnBvaW50VG9EYXRlKHQpO3JldHVybiBlJiZlLnRpbWV9LGRhdGFUb1JlY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmRhdGFUb1BvaW50KHQsZSk7cmV0dXJue2NvbnRlbnRTaGFwZTp7eDppWzBdLSh0aGlzLl9zdy10aGlzLl9saW5lV2lkdGgpLzIseTppWzFdLSh0aGlzLl9zaC10aGlzLl9saW5lV2lkdGgpLzIsd2lkdGg6dGhpcy5fc3ctdGhpcy5fbGluZVdpZHRoLGhlaWdodDp0aGlzLl9zaC10aGlzLl9saW5lV2lkdGh9LGNlbnRlcjppLHRsOltpWzBdLXRoaXMuX3N3LzIsaVsxXS10aGlzLl9zaC8yXSx0cjpbaVswXSt0aGlzLl9zdy8yLGlbMV0tdGhpcy5fc2gvMl0sYnI6W2lbMF0rdGhpcy5fc3cvMixpWzFdK3RoaXMuX3NoLzJdLGJsOltpWzBdLXRoaXMuX3N3LzIsaVsxXSt0aGlzLl9zaC8yXX19LHBvaW50VG9EYXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguZmxvb3IoKHRbMF0tdGhpcy5fcmVjdC54KS90aGlzLl9zdykrMSxpPU1hdGguZmxvb3IoKHRbMV0tdGhpcy5fcmVjdC55KS90aGlzLl9zaCkrMSxuPXRoaXMuX3JhbmdlSW5mby5yYW5nZTtyZXR1cm4idmVydGljYWwiPT09dGhpcy5fb3JpZW50P3RoaXMuX2dldERhdGVCeVdlZWtzQW5kRGF5KGksZS0xLG4pOnRoaXMuX2dldERhdGVCeVdlZWtzQW5kRGF5KGUsaS0xLG4pfSxjb252ZXJ0VG9QaXhlbDpzLmN1cnJ5KGEsImRhdGFUb1BvaW50IiksY29udmVydEZyb21QaXhlbDpzLmN1cnJ5KGEsInBvaW50VG9EYXRhIiksX2luaXRSYW5nZU9wdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21vZGVsLmdldCgicmFuZ2UiKSxlPXQ7aWYocy5pc0FycmF5KGUpJiYxPT09ZS5sZW5ndGgmJihlPWVbMF0pLC9eXGR7NH0kLy50ZXN0KGUpJiYodD1bZSsiLTAxLTAxIixlKyItMTItMzEiXSksL15cZHs0fVtcL3wtXVxkezEsMn0kLy50ZXN0KGUpKXt2YXIgaT10aGlzLmdldERhdGVJbmZvKGUpLG49aS5kYXRlO24uc2V0TW9udGgobi5nZXRNb250aCgpKzEpO3ZhciBhPXRoaXMuZ2V0TmV4dE5EYXkobiwtMSk7dD1baS5mb3JtYXRlZERhdGUsYS5mb3JtYXRlZERhdGVdfS9eXGR7NH1bXC98LV1cZHsxLDJ9W1wvfC1dXGR7MSwyfSQvLnRlc3QoZSkmJih0PVtlLGVdKTt2YXIgbz10aGlzLl9nZXRSYW5nZUluZm8odCk7cmV0dXJuIG8uc3RhcnQudGltZT5vLmVuZC50aW1lJiZ0LnJldmVyc2UoKSx0fSxfZ2V0UmFuZ2VJbmZvOmZ1bmN0aW9uKHQpe3Q9W3RoaXMuZ2V0RGF0ZUluZm8odFswXSksdGhpcy5nZXREYXRlSW5mbyh0WzFdKV07dmFyIGU7dFswXS50aW1lPnRbMV0udGltZSYmKGU9ITAsdC5yZXZlcnNlKCkpO3ZhciBpPU1hdGguZmxvb3IodFsxXS50aW1lL2wpLU1hdGguZmxvb3IodFswXS50aW1lL2wpKzEsbj1uZXcgRGF0ZSh0WzBdLnRpbWUpLGE9bi5nZXREYXRlKCksbz10WzFdLmRhdGUuZ2V0RGF0ZSgpO2lmKG4uc2V0RGF0ZShhK2ktMSksbi5nZXREYXRlKCkhPT1vKWZvcih2YXIgcj1uLmdldFRpbWUoKS10WzFdLnRpbWU+MD8xOi0xO24uZ2V0RGF0ZSgpIT09byYmKG4uZ2V0VGltZSgpLXRbMV0udGltZSkqcj4wOylpLT1yLG4uc2V0RGF0ZShhK2ktMSk7dmFyIHM9TWF0aC5mbG9vcigoaSt0WzBdLmRheSs2KS83KSx1PWU/LXMrMTpzLTE7cmV0dXJuIGUmJnQucmV2ZXJzZSgpLHtyYW5nZTpbdFswXS5mb3JtYXRlZERhdGUsdFsxXS5mb3JtYXRlZERhdGVdLHN0YXJ0OnRbMF0sZW5kOnRbMV0sYWxsRGF5Omksd2Vla3M6cyxudGhXZWVrOnUsZndlZWs6dFswXS5kYXksbHdlZWs6dFsxXS5kYXl9fSxfZ2V0RGF0ZUJ5V2Vla3NBbmREYXk6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuX2dldFJhbmdlSW5mbyhpKTtpZih0Pm4ud2Vla3N8fDA9PT10JiZlPG4uZndlZWt8fHQ9PT1uLndlZWtzJiZlPm4ubHdlZWspcmV0dXJuITE7dmFyIGE9NyoodC0xKS1uLmZ3ZWVrK2Usbz1uZXcgRGF0ZShuLnN0YXJ0LnRpbWUpO3JldHVybiBvLnNldERhdGUobi5zdGFydC5kK2EpLHRoaXMuZ2V0RGF0ZUluZm8obyl9fSxuLmRpbWVuc2lvbnM9bi5wcm90b3R5cGUuZGltZW5zaW9ucyxuLmdldERpbWVuc2lvbnNJbmZvPW4ucHJvdG90eXBlLmdldERpbWVuc2lvbnNJbmZvLG4uY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9W107cmV0dXJuIHQuZWFjaENvbXBvbmVudCgiY2FsZW5kYXIiLGZ1bmN0aW9uKGEpe3ZhciBvPW5ldyBuKGEsdCxlKTtpLnB1c2gobyksYS5jb29yZGluYXRlU3lzdGVtPW99KSx0LmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7ImNhbGVuZGFyIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikmJih0LmNvb3JkaW5hdGVTeXN0ZW09aVt0LmdldCgiY2FsZW5kYXJJbmRleCIpfHwwXSl9KSxpfSxpKDI2KS5yZWdpc3RlcigiY2FsZW5kYXIiLG4pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgaT10LmNlbGxTaXplO28uaXNBcnJheShpKT8xPT09aS5sZW5ndGgmJihpWzFdPWlbMF0pOmk9dC5jZWxsU2l6ZT1baSxpXTt2YXIgbj1vLm1hcChbMCwxXSxmdW5jdGlvbih0KXtyZXR1cm4gci5zaXplQ2FsY3VsYWJsZShlLHQpJiYoaVt0XT0iYXV0byIpLG51bGwhPWlbdF0mJiJhdXRvIiE9PWlbdF19KTtyLm1lcmdlTGF5b3V0UGFyYW0odCxlLHt0eXBlOiJib3giLGlnbm9yZVNpemU6bn0pfXZhciBhPWkoMTMpLG89aSgxKSxyPWkoOSkscz1hLmV4dGVuZCh7dHlwZToiY2FsZW5kYXIiLGNvb3JkaW5hdGVTeXN0ZW06bnVsbCxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjIsbGVmdDo4MCx0b3A6NjAsY2VsbFNpemU6MjAsb3JpZW50OiJob3Jpem9udGFsIixzcGxpdExpbmU6e3Nob3c6ITAsbGluZVN0eWxlOntjb2xvcjoiIzAwMCIsd2lkdGg6MSx0eXBlOiJzb2xpZCJ9fSxpdGVtU3R5bGU6e25vcm1hbDp7Y29sb3I6IiNmZmYiLGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiNjY2MifX0sZGF5TGFiZWw6e3Nob3c6ITAsZmlyc3REYXk6MCxwb3NpdGlvbjoic3RhcnQiLG1hcmdpbjoiNTAlIixuYW1lTWFwOiJlbiIsY29sb3I6IiMwMDAifSxtb250aExhYmVsOntzaG93OiEwLHBvc2l0aW9uOiJzdGFydCIsbWFyZ2luOjUsYWxpZ246ImNlbnRlciIsbmFtZU1hcDoiZW4iLGZvcm1hdHRlcjpudWxsLGNvbG9yOiIjMDAwIn0seWVhckxhYmVsOntzaG93OiEwLHBvc2l0aW9uOm51bGwsbWFyZ2luOjMwLGZvcm1hdHRlcjpudWxsLGNvbG9yOiIjY2NjIixmb250RmFtaWx5OiJzYW5zLXNlcmlmIixmb250V2VpZ2h0OiJib2xkZXIiLGZvbnRTaXplOjIwfX0saW5pdDpmdW5jdGlvbih0LGUsaSxhKXt2YXIgbz1yLmdldExheW91dFBhcmFtcyh0KTtzLnN1cGVyQXBwbHkodGhpcywiaW5pdCIsYXJndW1lbnRzKSxuKHQsbyl9LG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQsZSl7cy5zdXBlckFwcGx5KHRoaXMsIm1lcmdlT3B0aW9uIixhcmd1bWVudHMpLG4odGhpcy5vcHRpb24sdCl9fSk7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXQuZ2V0UmVjdCgpLGk9dC5nZXRSYW5nZUluZm8oKTtyZXR1cm57Y29vcmRTeXM6e3R5cGU6ImNhbGVuZGFyIix4OmUueCx5OmUueSx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxjZWxsV2lkdGg6dC5nZXRDZWxsV2lkdGgoKSxjZWxsSGVpZ2h0OnQuZ2V0Q2VsbEhlaWdodCgpLHJhbmdlSW5mbzp7c3RhcnQ6aS5zdGFydCxlbmQ6aS5lbmQsd2Vla3M6aS53ZWVrcyxkYXlDb3VudDppLmFsbERheX19LGFwaTp7Y29vcmQ6YS5iaW5kKHQuZGF0YVRvUG9pbnQsdCl9fX12YXIgYT1pKDEpO3QuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBlPWV8fFswLDBdLG8ubWFwKFsieCIsInkiXSxmdW5jdGlvbihpLG4pe3ZhciBhPXRoaXMuZ2V0QXhpcyhpKSxvPWVbbl0scj10W25dLzI7cmV0dXJuImNhdGVnb3J5Ij09PWEudHlwZT9hLmdldEJhbmRXaWR0aCgpOk1hdGguYWJzKGEuZGF0YVRvQ29vcmQoby1yKS1hLmRhdGFUb0Nvb3JkKG8rcikpfSx0aGlzKX1mdW5jdGlvbiBhKHQpe3ZhciBlPXQuZ3JpZC5nZXRSZWN0KCk7cmV0dXJue2Nvb3JkU3lzOnt0eXBlOiJjYXJ0ZXNpYW4yZCIseDplLngseTplLnksd2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9LGFwaTp7Y29vcmQ6by5iaW5kKHQuZGF0YVRvUG9pbnQsdCksc2l6ZTpvLmJpbmQobix0KX19fXZhciBvPWkoMSk7dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpLG4sYSl7bC5jYWxsKHRoaXMsdCksdGhpcy5tYXA9ZSx0aGlzLl9uYW1lQ29vcmRNYXA9ci5jcmVhdGVIYXNoTWFwKCksdGhpcy5sb2FkR2VvSnNvbihpLG4sYSl9ZnVuY3Rpb24gYSh0LGUsaSxuKXt2YXIgYT1pLmdlb01vZGVsLG89aS5zZXJpZXNNb2RlbCxyPWE/YS5jb29yZGluYXRlU3lzdGVtOm8/by5jb29yZGluYXRlU3lzdGVtfHwoby5nZXRSZWZlcnJpbmdDb21wb25lbnRzKCJnZW8iKVswXXx8e30pLmNvb3JkaW5hdGVTeXN0ZW06bnVsbDtyZXR1cm4gcj09PXRoaXM/clt0XShuKTpudWxsfXZhciBvPWkoMjcwKSxyPWkoMSkscz1pKDEyKSxsPWkoMjY4KSx1PVtpKDQxMCksaSg0MTEpLGkoNDA5KSxpKDQwOCldO24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHR5cGU6ImdlbyIsZGltZW5zaW9uczpbImxuZyIsImxhdCJdLGNvbnRhaW5Db29yZDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5yZWdpb25zLGk9MDtpPGUubGVuZ3RoO2krKylpZihlW2ldLmNvbnRhaW4odCkpcmV0dXJuITA7cmV0dXJuITF9LGxvYWRHZW9Kc29uOmZ1bmN0aW9uKHQsZSxpKXt0cnl7dGhpcy5yZWdpb25zPXQ/byh0KTpbXX1jYXRjaCh0KXt0aHJvdyJJbnZhbGlkIGdlb0pzb24gZm9ybWF0XG4iK3QubWVzc2FnZX1lPWV8fHt9LGk9aXx8e307Zm9yKHZhciBuPXRoaXMucmVnaW9ucyxhPXIuY3JlYXRlSGFzaE1hcCgpLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIGw9bltzXS5uYW1lO2w9aS5oYXNPd25Qcm9wZXJ0eShsKT9pW2xdOmwsbltzXS5uYW1lPWwsYS5zZXQobCxuW3NdKSx0aGlzLmFkZEdlb0Nvb3JkKGwsbltzXS5jZW50ZXIpO3ZhciBoPWVbbF07aCYmbltzXS50cmFuc2Zvcm1UbyhoLmxlZnQsaC50b3AsaC53aWR0aCxoLmhlaWdodCl9dGhpcy5fcmVnaW9uc01hcD1hLHRoaXMuX3JlY3Q9bnVsbCxyLmVhY2godSxmdW5jdGlvbih0KXt0KHRoaXMpfSx0aGlzKX0sdHJhbnNmb3JtVG86ZnVuY3Rpb24odCxlLGksbil7dmFyIGE9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKTthPWEuY2xvbmUoKSxhLnk9LWEueS1hLmhlaWdodDt2YXIgbz10aGlzLl92aWV3VHJhbnNmb3JtO28udHJhbnNmb3JtPWEuY2FsY3VsYXRlVHJhbnNmb3JtKG5ldyBzKHQsZSxpLG4pKSxvLmRlY29tcG9zZVRyYW5zZm9ybSgpO3ZhciByPW8uc2NhbGU7clsxXT0tclsxXSxvLnVwZGF0ZVRyYW5zZm9ybSgpLHRoaXMuX3VwZGF0ZVRyYW5zZm9ybSgpfSxnZXRSZWdpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlZ2lvbnNNYXAuZ2V0KHQpfSxnZXRSZWdpb25CeUNvb3JkOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnJlZ2lvbnMsaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKGVbaV0uY29udGFpbih0KSlyZXR1cm4gZVtpXX0sYWRkR2VvQ29vcmQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9uYW1lQ29vcmRNYXAuc2V0KHQsZSl9LGdldEdlb0Nvb3JkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9uYW1lQ29vcmRNYXAuZ2V0KHQpfSxnZXRCb3VuZGluZ1JlY3Q6ZnVuY3Rpb24oKXtpZih0aGlzLl9yZWN0KXJldHVybiB0aGlzLl9yZWN0O2Zvcih2YXIgdCxlPXRoaXMucmVnaW9ucyxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBuPWVbaV0uZ2V0Qm91bmRpbmdSZWN0KCk7dD10fHxuLmNsb25lKCksdC51bmlvbihuKX1yZXR1cm4gdGhpcy5fcmVjdD10fHxuZXcgcygwLDAsMCwwKX0sZGF0YVRvUG9pbnQ6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10aGlzLmdldEdlb0Nvb3JkKHQpKSx0KXJldHVybiBsLnByb3RvdHlwZS5kYXRhVG9Qb2ludC5jYWxsKHRoaXMsdCl9LGNvbnZlcnRUb1BpeGVsOnIuY3VycnkoYSwiZGF0YVRvUG9pbnQiKSxjb252ZXJ0RnJvbVBpeGVsOnIuY3VycnkoYSwicG9pbnRUb0RhdGEiKX0sci5taXhpbihuLGwpLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO3ZhciBuPWkoNSksYT1pKDEzKSxvPWkoMTEpLHI9aSgxKSxzPWkoODMpLGw9aSgxOTIpLHU9YS5leHRlbmQoe3R5cGU6ImdlbyIsY29vcmRpbmF0ZVN5c3RlbTpudWxsLGxheW91dE1vZGU6ImJveCIsaW5pdDpmdW5jdGlvbih0KXthLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuLmRlZmF1bHRFbXBoYXNpcyh0LmxhYmVsLFsic2hvdyJdKX0sb3B0aW9uVXBkYXRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9uLGU9dGhpczt0LnJlZ2lvbnM9bC5nZXRGaWxsZWRSZWdpb25zKHQucmVnaW9ucyx0Lm1hcCx0Lm5hbWVNYXApLHRoaXMuX29wdGlvbk1vZGVsTWFwPXIucmVkdWNlKHQucmVnaW9uc3x8W10sZnVuY3Rpb24odCxpKXtyZXR1cm4gaS5uYW1lJiZ0LnNldChpLm5hbWUsbmV3IG8oaSxlKSksdH0sci5jcmVhdGVIYXNoTWFwKCkpLHRoaXMudXBkYXRlU2VsZWN0ZWRNYXAodC5yZWdpb25zKX0sZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejowLHNob3c6ITAsbGVmdDoiY2VudGVyIix0b3A6ImNlbnRlciIsYXNwZWN0U2NhbGU6Ljc1LHNpbGVudDohMSxtYXA6IiIsYm91bmRpbmdDb29yZHM6bnVsbCxjZW50ZXI6bnVsbCx6b29tOjEsc2NhbGVMaW1pdDpudWxsLGxhYmVsOntub3JtYWw6e3Nob3c6ITEsY29sb3I6IiMwMDAifSxlbXBoYXNpczp7c2hvdzohMCxjb2xvcjoicmdiKDEwMCwwLDApIn19LGl0ZW1TdHlsZTp7bm9ybWFsOntib3JkZXJXaWR0aDouNSxib3JkZXJDb2xvcjoiIzQ0NCIsY29sb3I6IiNlZWUifSxlbXBoYXNpczp7Y29sb3I6InJnYmEoMjU1LDIxNSwwLDAuOCkifX0scmVnaW9uczpbXX0sZ2V0UmVnaW9uTW9kZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29wdGlvbk1vZGVsTWFwLmdldCh0KXx8bmV3IG8obnVsbCx0aGlzLHRoaXMuZWNNb2RlbCl9LGdldEZvcm1hdHRlZExhYmVsOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXRSZWdpb25Nb2RlbCh0KSxuPWkuZ2V0KCJsYWJlbC4iK2UrIi5mb3JtYXR0ZXIiKSxhPXtuYW1lOnR9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuPyhhLnN0YXR1cz1lLG4oYSkpOiJzdHJpbmciPT10eXBlb2Ygbj9uLnJlcGxhY2UoInthfSIsbnVsbCE9dD90OiIiKTp2b2lkIDB9LHNldFpvb206ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uem9vbT10fSxzZXRDZW50ZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb24uY2VudGVyPXR9fSk7ci5taXhpbih1LHMpLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUpe3ZhciBpPVtbWzEyMy40NTE2NTI1MjY4NTU0NywyNS43MzUyNzE2NDQwMjI2MV0sWzEyMy40OTczMTQ0NTMxMjQ5OSwyNS43MzUyNzE2NDQwMjI2MV0sWzEyMy40OTczMTQ0NTMxMjQ5OSwyNS43NTA3MzQwNjQ2MDA4ODRdLFsxMjMuNDUxNjUyNTI2ODU1NDcsMjUuNzUwNzM0MDY0NjAwODg0XSxbMTIzLjQ1MTY1MjUyNjg1NTQ3LDI1LjczNTI3MTY0NDAyMjYxXV1dO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZigiY2hpbmEiPT09dC5tYXApZm9yKHZhciBlPTAsbj10LnJlZ2lvbnMubGVuZ3RoO2U8bjsrK2UpIuWPsOa5viI9PT10LnJlZ2lvbnNbZV0ubmFtZSYmdC5yZWdpb25zW2VdLmdlb21ldHJpZXMucHVzaCh7dHlwZToicG9seWdvbiIsZXh0ZXJpb3I6aVswXX0pfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuPWkoMSksYT17UnVzc2lhOlsxMDAsNjBdLCJVbml0ZWQgU3RhdGVzIjpbLTk5LDM4XSwiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIjpbLTk5LDM4XX07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe24uZWFjaCh0LnJlZ2lvbnMsZnVuY3Rpb24odCl7dmFyIGU9YVt0Lm5hbWVdO2lmKGUpe3ZhciBpPXQuY2VudGVyO2lbMF09ZVswXSxpWzFdPWVbMV19fSl9fSxmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPWkoMjY5KSxhPWkoMSksbz1bMTI2LDI1XSxyPVtbWzAsMy41XSxbNywxMS4yXSxbMTUsMTEuOV0sWzMwLDddLFs0MiwuN10sWzUyLC43XSxbNTYsNy43XSxbNTksLjddLFs2NCwuN10sWzY0LDBdLFs1LDBdLFswLDMuNV1dLFtbMTMsMTYuMV0sWzE5LDE0LjddLFsxNiwyMS43XSxbMTEsMjMuMV0sWzEzLDE2LjFdXSxbWzEyLDMyLjJdLFsxNCwzOC41XSxbMTUsMzguNV0sWzEzLDMyLjJdLFsxMiwzMi4yXV0sW1sxNiw0Ny42XSxbMTIsNTMuMl0sWzEzLDUzLjJdLFsxOCw0Ny42XSxbMTYsNDcuNl1dLFtbNiw2NC40XSxbOCw3MF0sWzksNzBdLFs4LDY0LjRdLFs2LDY0LjRdXSxbWzIzLDgyLjZdLFsyOSw3OS44XSxbMzAsNzkuOF0sWzI1LDgyLjZdLFsyMyw4Mi42XV0sW1szNyw3MC43XSxbNDMsNjIuM10sWzQ0LDYyLjNdLFszOSw3MC43XSxbMzcsNzAuN11dLFtbNDgsNTEuMV0sWzUxLDQ1LjVdLFs1Myw0NS41XSxbNTAsNTEuMV0sWzQ4LDUxLjFdXSxbWzUxLDM1XSxbNTEsMjguN10sWzUzLDI4LjddLFs1MywzNV0sWzUxLDM1XV0sW1s1MiwyMi40XSxbNTUsMTcuNV0sWzU2LDE3LjVdLFs1MywyMi40XSxbNTIsMjIuNF1dLFtbNTgsMTIuNl0sWzYyLDddLFs2Myw3XSxbNjAsMTIuNl0sWzU4LDEyLjZdXSxbWzAsMy41XSxbMCw5My4xXSxbNjQsOTMuMV0sWzY0LDBdLFs2MywwXSxbNjMsOTIuNF0sWzEsOTIuNF0sWzEsMy41XSxbMCwzLjVdXV0scz0wO3M8ci5sZW5ndGg7cysrKWZvcih2YXIgbD0wO2w8cltzXS5sZW5ndGg7bCsrKXJbc11bbF1bMF0vPTEwLjUscltzXVtsXVsxXS89LTE0LHJbc11bbF1bMF0rPW9bMF0scltzXVtsXVsxXSs9b1sxXTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7ImNoaW5hIj09PXQubWFwJiZ0LnJlZ2lvbnMucHVzaChuZXcgbigi5Y2X5rW36K+45bKbIixhLm1hcChyLGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJwb2x5Z29uIixleHRlcmlvcjp0fX0pLG8pKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9eyLljZfmtbfor7jlspsiOlszMiw4MF0sIuW5v+S4nCI6WzAsLTEwXSwi6aaZ5rivIjpbMTAsNV0sIua+s+mXqCI6Wy0xMCwxMF0sIuWkqea0pSI6WzUsNV19O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtuLmVhY2godC5yZWdpb25zLGZ1bmN0aW9uKHQpe3ZhciBlPWFbdC5uYW1lXTtpZihlKXt2YXIgaT10LmNlbnRlcjtpWzBdKz1lWzBdLzEwLjUsaVsxXSs9LWVbMV0vMTR9fSl9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBlPWV8fFswLDBdLG8ubWFwKFswLDFdLGZ1bmN0aW9uKGkpe3ZhciBuPWVbaV0sYT10W2ldLzIsbz1bXSxyPVtdO3JldHVybiBvW2ldPW4tYSxyW2ldPW4rYSxvWzEtaV09clsxLWldPWVbMS1pXSxNYXRoLmFicyh0aGlzLmRhdGFUb1BvaW50KG8pW2ldLXRoaXMuZGF0YVRvUG9pbnQocilbaV0pfSx0aGlzKX1mdW5jdGlvbiBhKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJue2Nvb3JkU3lzOnt0eXBlOiJnZW8iLHg6ZS54LHk6ZS55LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSxhcGk6e2Nvb3JkOm8uYmluZCh0LmRhdGFUb1BvaW50LHQpLHNpemU6by5iaW5kKG4sdCl9fX12YXIgbz1pKDEpO3QuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBlLnR5cGV8fChlLmRhdGE/ImNhdGVnb3J5IjoidmFsdWUiKX12YXIgYT1pKDEzKSxvPWkoMSkscj1pKDMxKSxzPWkoNjIpLGw9aSg0KSx1PWEuZXh0ZW5kKHt0eXBlOiJiYXNlUGFyYWxsZWxBeGlzIixheGlzOm51bGwsYWN0aXZlSW50ZXJ2YWxzOltdLGdldEFyZWFTZWxlY3RTdHlsZTpmdW5jdGlvbigpe3JldHVybiByKFtbImZpbGwiLCJjb2xvciJdLFsibGluZVdpZHRoIiwiYm9yZGVyV2lkdGgiXSxbInN0cm9rZSIsImJvcmRlckNvbG9yIl0sWyJ3aWR0aCIsIndpZHRoIl0sWyJvcGFjaXR5Iiwib3BhY2l0eSJdXSkuY2FsbCh0aGlzLmdldE1vZGVsKCJhcmVhU2VsZWN0U3R5bGUiKSl9LHNldEFjdGl2ZUludGVydmFsczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGl2ZUludGVydmFscz1vLmNsb25lKHQpO2lmKGUpZm9yKHZhciBpPWUubGVuZ3RoLTE7aT49MDtpLS0pbC5hc2MoZVtpXSl9LGdldEFjdGl2ZVN0YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWN0aXZlSW50ZXJ2YWxzO2lmKCFlLmxlbmd0aClyZXR1cm4ibm9ybWFsIjtpZihudWxsPT10KXJldHVybiJpbmFjdGl2ZSI7Zm9yKHZhciBpPTAsbj1lLmxlbmd0aDtpPG47aSsrKWlmKGVbaV1bMF08PXQmJnQ8PWVbaV1bMV0pcmV0dXJuImFjdGl2ZSI7cmV0dXJuImluYWN0aXZlIn19KSxoPXt0eXBlOiJ2YWx1ZSIsZGltOm51bGwsYXJlYVNlbGVjdFN0eWxlOnt3aWR0aDoyMCxib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiJyZ2JhKDE2MCwxOTcsMjMyKSIsY29sb3I6InJnYmEoMTYwLDE5NywyMzIpIixvcGFjaXR5Oi4zfSxyZWFsdGltZTohMCx6OjEwfTtvLm1lcmdlKHUucHJvdG90eXBlLGkoNDIpKSxzKCJwYXJhbGxlbCIsdSxuLGgpLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUsaSl7dGhpcy5fYXhlc01hcD11LmNyZWF0ZUhhc2hNYXAoKSx0aGlzLl9heGVzTGF5b3V0PXt9LHRoaXMuZGltZW5zaW9ucz10LmRpbWVuc2lvbnMsdGhpcy5fcmVjdCx0aGlzLl9tb2RlbD10LHRoaXMuX2luaXQodCxlLGkpfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gbSh2KHQsZVswXSksZVsxXSl9ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPWUubGF5b3V0TGVuZ3RoLyhlLmF4aXNDb3VudC0xKTtyZXR1cm57cG9zaXRpb246aSp0LGF4aXNOYW1lQXZhaWxhYmxlV2lkdGg6aSxheGlzTGFiZWxTaG93OiEwfX1mdW5jdGlvbiByKHQsZSl7dmFyIGksbixhPWUubGF5b3V0TGVuZ3RoLG89ZS5heGlzRXhwYW5kV2lkdGgscj1lLmF4aXNDb3VudCxzPWUuYXhpc0NvbGxhcHNlV2lkdGgsbD1lLndpbklubmVySW5kaWNlcyx1PXMsaD0hMTtyZXR1cm4gdDxsWzBdPyhpPXQqcyxuPXMpOnQ8PWxbMV0/KGk9ZS5heGlzRXhwYW5kV2luZG93MFBvcyt0Km8tZS5heGlzRXhwYW5kV2luZG93WzBdLHU9byxoPSEwKTooaT1hLShyLTEtdCkqcyxuPXMpLHtwb3NpdGlvbjppLGF4aXNOYW1lQXZhaWxhYmxlV2lkdGg6dSxheGlzTGFiZWxTaG93OmgsbmFtZVRydW5jYXRlTWF4V2lkdGg6bn19dmFyIHM9aSg5KSxsPWkoMTgpLHU9aSgxKSxoPWkoNDE1KSxjPWkoMyksZD1pKDE5KSxmPWkoNCkscD1pKDU5KSxnPXUuZWFjaCxtPU1hdGgubWluLHY9TWF0aC5tYXgseT1NYXRoLmZsb29yLHg9TWF0aC5jZWlsLF89Zi5yb3VuZCxiPU1hdGguUEk7bi5wcm90b3R5cGU9e3R5cGU6InBhcmFsbGVsIixjb25zdHJ1Y3RvcjpuLF9pbml0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10LmRpbWVuc2lvbnMsYT10LnBhcmFsbGVsQXhpc0luZGV4O2cobixmdW5jdGlvbih0LGkpe3ZhciBuPWFbaV0sbz1lLmdldENvbXBvbmVudCgicGFyYWxsZWxBeGlzIixuKSxyPXRoaXMuX2F4ZXNNYXAuc2V0KHQsbmV3IGgodCxsLmNyZWF0ZVNjYWxlQnlNb2RlbChvKSxbMCwwXSxvLmdldCgidHlwZSIpLG4pKSxzPSJjYXRlZ29yeSI9PT1yLnR5cGU7ci5vbkJhbmQ9cyYmby5nZXQoImJvdW5kYXJ5R2FwIiksci5pbnZlcnNlPW8uZ2V0KCJpbnZlcnNlIiksby5heGlzPXIsci5tb2RlbD1vLHIuY29vcmRpbmF0ZVN5c3RlbT1vLmNvb3JkaW5hdGVTeXN0ZW09dGhpc30sdGhpcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3VwZGF0ZUF4ZXNGcm9tU2VyaWVzKHRoaXMuX21vZGVsLHQpfSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFrZUxheW91dEluZm8oKSxpPWUuYXhpc0Jhc2Usbj1lLmxheW91dEJhc2UsYT1lLnBpeGVsRGltSW5kZXgsbz10WzEtYV0scj10W2FdO3JldHVybiBvPj1pJiZvPD1pK2UuYXhpc0xlbmd0aCYmcj49biYmcjw9bitlLmxheW91dExlbmd0aH0sX3VwZGF0ZUF4ZXNGcm9tU2VyaWVzOmZ1bmN0aW9uKHQsZSl7ZS5lYWNoU2VyaWVzKGZ1bmN0aW9uKGkpe2lmKHQuY29udGFpbnMoaSxlKSl7dmFyIG49aS5nZXREYXRhKCk7Zyh0aGlzLmRpbWVuc2lvbnMsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYXhlc01hcC5nZXQodCk7ZS5zY2FsZS51bmlvbkV4dGVudEZyb21EYXRhKG4sdCksbC5uaWNlU2NhbGVFeHRlbnQoZS5zY2FsZSxlLm1vZGVsKX0sdGhpcyl9fSx0aGlzKX0scmVzaXplOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVjdD1zLmdldExheW91dFJlY3QodC5nZXRCb3hMYXlvdXRQYXJhbXMoKSx7d2lkdGg6ZS5nZXRXaWR0aCgpLGhlaWdodDplLmdldEhlaWdodCgpfSksdGhpcy5fbGF5b3V0QXhlcygpfSxnZXRSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3R9LF9tYWtlTGF5b3V0SW5mbzpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fbW9kZWwsaT10aGlzLl9yZWN0LG49WyJ4IiwieSJdLG89WyJ3aWR0aCIsImhlaWdodCJdLHI9ZS5nZXQoImxheW91dCIpLHM9Imhvcml6b250YWwiPT09cj8wOjEsbD1pW29bc11dLHU9WzAsbF0saD10aGlzLmRpbWVuc2lvbnMubGVuZ3RoLGM9YShlLmdldCgiYXhpc0V4cGFuZFdpZHRoIiksdSksZD1hKGUuZ2V0KCJheGlzRXhwYW5kQ291bnQiKXx8MCxbMCxoXSksZj1lLmdldCgiYXhpc0V4cGFuZGFibGUiKSYmaD4zJiZoPmQmJmQ+MSYmYz4wJiZsPjAscD1lLmdldCgiYXhpc0V4cGFuZFdpbmRvdyIpO2lmKHApdD1hKHBbMV0tcFswXSx1KSxwWzFdPXBbMF0rdDtlbHNle3Q9YShjKihkLTEpLHUpO3ZhciBnPWUuZ2V0KCJheGlzRXhwYW5kQ2VudGVyIil8fHkoaC8yKTtwPVtjKmctdC8yXSxwWzFdPXBbMF0rdH12YXIgbT0obC10KS8oaC1kKTttPDMmJihtPTApO3ZhciB2PVt5KF8ocFswXS9jLDEpKSsxLHgoXyhwWzFdL2MsMSkpLTFdLGI9bS9jKnBbMF07cmV0dXJue2xheW91dDpyLHBpeGVsRGltSW5kZXg6cyxsYXlvdXRCYXNlOmlbbltzXV0sbGF5b3V0TGVuZ3RoOmwsYXhpc0Jhc2U6aVtuWzEtc11dLGF4aXNMZW5ndGg6aVtvWzEtc11dLGF4aXNFeHBhbmRhYmxlOmYsYXhpc0V4cGFuZFdpZHRoOmMsYXhpc0NvbGxhcHNlV2lkdGg6bSxheGlzRXhwYW5kV2luZG93OnAsYXhpc0NvdW50Omgsd2luSW5uZXJJbmRpY2VzOnYsYXhpc0V4cGFuZFdpbmRvdzBQb3M6Yn19LF9sYXlvdXRBeGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVjdCxlPXRoaXMuX2F4ZXNNYXAsaT10aGlzLmRpbWVuc2lvbnMsbj10aGlzLl9tYWtlTGF5b3V0SW5mbygpLGE9bi5sYXlvdXQ7CmUuZWFjaChmdW5jdGlvbih0KXt2YXIgZT1bMCxuLmF4aXNMZW5ndGhdLGk9dC5pbnZlcnNlPzE6MDt0LnNldEV4dGVudChlW2ldLGVbMS1pXSl9KSxnKGksZnVuY3Rpb24oaSxzKXt2YXIgbD0obi5heGlzRXhwYW5kYWJsZT9yOm8pKHMsbiksdT17aG9yaXpvbnRhbDp7eDpsLnBvc2l0aW9uLHk6bi5heGlzTGVuZ3RofSx2ZXJ0aWNhbDp7eDowLHk6bC5wb3NpdGlvbn19LGg9e2hvcml6b250YWw6Yi8yLHZlcnRpY2FsOjB9LGM9W3VbYV0ueCt0LngsdVthXS55K3QueV0sZj1oW2FdLHA9ZC5jcmVhdGUoKTtkLnJvdGF0ZShwLHAsZiksZC50cmFuc2xhdGUocCxwLGMpLHRoaXMuX2F4ZXNMYXlvdXRbaV09e3Bvc2l0aW9uOmMscm90YXRpb246Zix0cmFuc2Zvcm06cCxheGlzTmFtZUF2YWlsYWJsZVdpZHRoOmwuYXhpc05hbWVBdmFpbGFibGVXaWR0aCxheGlzTGFiZWxTaG93OmwuYXhpc0xhYmVsU2hvdyxuYW1lVHJ1bmNhdGVNYXhXaWR0aDpsLm5hbWVUcnVuY2F0ZU1heFdpZHRoLHRpY2tEaXJlY3Rpb246MSxsYWJlbERpcmVjdGlvbjoxLGxhYmVsSW50ZXJ2YWw6ZS5nZXQoaSkuZ2V0TGFiZWxJbnRlcnZhbCgpfX0sdGhpcyl9LGdldEF4aXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2F4ZXNNYXAuZ2V0KHQpfSxkYXRhVG9Qb2ludDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmF4aXNDb29yZFRvUG9pbnQodGhpcy5fYXhlc01hcC5nZXQoZSkuZGF0YVRvQ29vcmQodCksZSl9LGVhY2hBY3RpdmVTdGF0ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPXRoaXMuZGltZW5zaW9ucyxhPXRoaXMuX2F4ZXNNYXAsbz10aGlzLmhhc0F4aXNCcnVzaGVkKCkscj0wLHM9dC5jb3VudCgpO3I8cztyKyspe3ZhciBsLHU9dC5nZXRWYWx1ZXMobixyKTtpZihvKXtsPSJhY3RpdmUiO2Zvcih2YXIgaD0wLGM9bi5sZW5ndGg7aDxjO2grKyl7dmFyIGQ9bltoXSxmPWEuZ2V0KGQpLm1vZGVsLmdldEFjdGl2ZVN0YXRlKHVbaF0saCk7aWYoImluYWN0aXZlIj09PWYpe2w9ImluYWN0aXZlIjticmVha319fWVsc2UgbD0ibm9ybWFsIjtlLmNhbGwoaSxsLHIpfX0saGFzQXhpc0JydXNoZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5kaW1lbnNpb25zLGU9dGhpcy5fYXhlc01hcCxpPSExLG49MCxhPXQubGVuZ3RoO248YTtuKyspIm5vcm1hbCIhPT1lLmdldCh0W25dKS5tb2RlbC5nZXRBY3RpdmVTdGF0ZSgpJiYoaT0hMCk7cmV0dXJuIGl9LGF4aXNDb29yZFRvUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9heGVzTGF5b3V0W2VdO3JldHVybiBjLmFwcGx5VHJhbnNmb3JtKFt0LDBdLGkudHJhbnNmb3JtKX0sZ2V0QXhpc0xheW91dDpmdW5jdGlvbih0KXtyZXR1cm4gdS5jbG9uZSh0aGlzLl9heGVzTGF5b3V0W3RdKX0sZ2V0U2xpZGVkQXhpc0V4cGFuZFdpbmRvdzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYWtlTGF5b3V0SW5mbygpLGk9ZS5waXhlbERpbUluZGV4LG49ZS5heGlzRXhwYW5kV2luZG93LnNsaWNlKCksYT1uWzFdLW5bMF0sbz1bMCxlLmF4aXNFeHBhbmRXaWR0aCooZS5heGlzQ291bnQtMSldO2lmKCF0aGlzLmNvbnRhaW5Qb2ludCh0KSlyZXR1cm57YmVoYXZpb3I6Im5vbmUiLGF4aXNFeHBhbmRXaW5kb3c6bn07dmFyIHIscz10W2ldLWUubGF5b3V0QmFzZS1lLmF4aXNFeHBhbmRXaW5kb3cwUG9zLGw9InNsaWRlIix1PWUuYXhpc0NvbGxhcHNlV2lkdGgsaD10aGlzLl9tb2RlbC5nZXQoImF4aXNFeHBhbmRTbGlkZVRyaWdnZXJBcmVhIiksYz1udWxsIT1oWzBdO2lmKHUpYyYmdSYmczxhKmhbMF0/KGw9Imp1bXAiLHI9cy1hKmhbMl0pOmMmJnUmJnM+YSooMS1oWzBdKT8obD0ianVtcCIscj1zLWEqKDEtaFsyXSkpOihyPXMtYSpoWzFdKT49MCYmKHI9cy1hKigxLWhbMV0pKTw9MCYmKHI9MCkscio9ZS5heGlzRXhwYW5kV2lkdGgvdSxyP3AocixuLG8sImFsbCIpOmw9Im5vbmUiO2Vsc2V7dmFyIGE9blsxXS1uWzBdLGQ9b1sxXSpzL2E7bj1bdigwLGQtYS8yKV0sblsxXT1tKG9bMV0sblswXSthKSxuWzBdPW5bMV0tYX1yZXR1cm57YXhpc0V4cGFuZFdpbmRvdzpuLGJlaGF2aW9yOmx9fX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgzMyksbz1mdW5jdGlvbih0LGUsaSxuLG8pe2EuY2FsbCh0aGlzLHQsZSxpKSx0aGlzLnR5cGU9bnx8InZhbHVlIix0aGlzLmF4aXNJbmRleD1vfTtvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6byxtb2RlbDpudWxsfSxuLmluaGVyaXRzKG8sYSksdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgxMyk7aSg0MTMpLGEuZXh0ZW5kKHt0eXBlOiJwYXJhbGxlbCIsZGVwZW5kZW5jaWVzOlsicGFyYWxsZWxBeGlzIl0sY29vcmRpbmF0ZVN5c3RlbTpudWxsLGRpbWVuc2lvbnM6bnVsbCxwYXJhbGxlbEF4aXNJbmRleDpudWxsLGxheW91dE1vZGU6ImJveCIsZGVmYXVsdE9wdGlvbjp7emxldmVsOjAsejowLGxlZnQ6ODAsdG9wOjYwLHJpZ2h0OjgwLGJvdHRvbTo2MCxsYXlvdXQ6Imhvcml6b250YWwiLGF4aXNFeHBhbmRhYmxlOiExLGF4aXNFeHBhbmRDZW50ZXI6bnVsbCxheGlzRXhwYW5kQ291bnQ6MCxheGlzRXhwYW5kV2lkdGg6NTAsYXhpc0V4cGFuZFJhdGU6MTcsYXhpc0V4cGFuZERlYm91bmNlOjUwLGF4aXNFeHBhbmRTbGlkZVRyaWdnZXJBcmVhOlstLjE1LC4wNSwuNF0sYXhpc0V4cGFuZFRyaWdnZXJPbjoiY2xpY2siLHBhcmFsbGVsQXhpc0RlZmF1bHQ6bnVsbH0saW5pdDpmdW5jdGlvbigpe2EucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMubWVyZ2VPcHRpb24oe30pfSxtZXJnZU9wdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbjt0JiZuLm1lcmdlKGUsdCwhMCksdGhpcy5faW5pdERpbWVuc2lvbnMoKX0sY29udGFpbnM6ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldCgicGFyYWxsZWxJbmRleCIpO3JldHVybiBudWxsIT1pJiZlLmdldENvbXBvbmVudCgicGFyYWxsZWwiLGkpPT09dGhpc30sc2V0QXhpc0V4cGFuZDpmdW5jdGlvbih0KXtuLmVhY2goWyJheGlzRXhwYW5kYWJsZSIsImF4aXNFeHBhbmRDZW50ZXIiLCJheGlzRXhwYW5kQ291bnQiLCJheGlzRXhwYW5kV2lkdGgiLCJheGlzRXhwYW5kV2luZG93Il0sZnVuY3Rpb24oZSl7dC5oYXNPd25Qcm9wZXJ0eShlKSYmKHRoaXMub3B0aW9uW2VdPXRbZV0pfSx0aGlzKX0sX2luaXREaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kaW1lbnNpb25zPVtdLGU9dGhpcy5wYXJhbGxlbEF4aXNJbmRleD1bXSxpPW4uZmlsdGVyKHRoaXMuZGVwZW5kZW50TW9kZWxzLnBhcmFsbGVsQXhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoInBhcmFsbGVsSW5kZXgiKT09PXRoaXMuY29tcG9uZW50SW5kZXh9KTtuLmVhY2goaSxmdW5jdGlvbihpKXt0LnB1c2goImRpbSIraS5nZXQoImRpbSIpKSxlLnB1c2goaS5jb21wb25lbnRJbmRleCl9KX19KX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCl7aWYoIXQucGFyYWxsZWwpe3ZhciBlPSExO28uZWFjaCh0LnNlcmllcyxmdW5jdGlvbih0KXt0JiYicGFyYWxsZWwiPT09dC50eXBlJiYoZT0hMCl9KSxlJiYodC5wYXJhbGxlbD1be31dKX19ZnVuY3Rpb24gYSh0KXt2YXIgZT1yLm5vcm1hbGl6ZVRvQXJyYXkodC5wYXJhbGxlbEF4aXMpO28uZWFjaChlLGZ1bmN0aW9uKGUpe2lmKG8uaXNPYmplY3QoZSkpe3ZhciBpPWUucGFyYWxsZWxJbmRleHx8MCxuPXIubm9ybWFsaXplVG9BcnJheSh0LnBhcmFsbGVsKVtpXTtuJiZuLnBhcmFsbGVsQXhpc0RlZmF1bHQmJm8ubWVyZ2UoZSxuLnBhcmFsbGVsQXhpc0RlZmF1bHQsITEpfX0pfXZhciBvPWkoMSkscj1pKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtuKHQpLGEodCl9fSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtlPWV8fFswLDM2MF0sby5jYWxsKHRoaXMsImFuZ2xlIix0LGUpLHRoaXMudHlwZT0iY2F0ZWdvcnkifXZhciBhPWkoMSksbz1pKDMzKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBvbGFyLnBvaW50VG9EYXRhKHQsZSlbInJhZGl1cyI9PT10aGlzLmRpbT8wOjFdfSxkYXRhVG9BbmdsZTpvLnByb3RvdHlwZS5kYXRhVG9Db29yZCxhbmdsZVRvRGF0YTpvLnByb3RvdHlwZS5jb29yZFRvRGF0YX0sYS5pbmhlcml0cyhuLG8pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gZS50eXBlfHwoZS5kYXRhPyJjYXRlZ29yeSI6InZhbHVlIil9dmFyIGE9aSgxKSxvPWkoMTMpLHI9aSg2Mikscz1vLmV4dGVuZCh7dHlwZToicG9sYXJBeGlzIixheGlzOm51bGwsZ2V0Q29vcmRTeXNNb2RlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVjTW9kZWwucXVlcnlDb21wb25lbnRzKHttYWluVHlwZToicG9sYXIiLGluZGV4OnRoaXMub3B0aW9uLnBvbGFySW5kZXgsaWQ6dGhpcy5vcHRpb24ucG9sYXJJZH0pWzBdfX0pO2EubWVyZ2Uocy5wcm90b3R5cGUsaSg0MikpO3ZhciBsPXthbmdsZTp7c3RhcnRBbmdsZTo5MCxjbG9ja3dpc2U6ITAsc3BsaXROdW1iZXI6MTIsYXhpc0xhYmVsOntyb3RhdGU6ITF9fSxyYWRpdXM6e3NwbGl0TnVtYmVyOjV9fTtyKCJhbmdsZSIscyxuLGwuYW5nbGUpLHIoInJhZGl1cyIscyxuLGwucmFkaXVzKX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1pKDQyMiksYT1pKDQxOCksbz1mdW5jdGlvbih0KXt0aGlzLm5hbWU9dHx8IiIsdGhpcy5jeD0wLHRoaXMuY3k9MCx0aGlzLl9yYWRpdXNBeGlzPW5ldyBuLHRoaXMuX2FuZ2xlQXhpcz1uZXcgYSx0aGlzLl9yYWRpdXNBeGlzLnBvbGFyPXRoaXMuX2FuZ2xlQXhpcy5wb2xhcj10aGlzfTtvLnByb3RvdHlwZT17dHlwZToicG9sYXIiLGF4aXNQb2ludGVyRW5hYmxlZDohMCxjb25zdHJ1Y3RvcjpvLGRpbWVuc2lvbnM6WyJyYWRpdXMiLCJhbmdsZSJdLG1vZGVsOm51bGwsY29udGFpblBvaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucG9pbnRUb0Nvb3JkKHQpO3JldHVybiB0aGlzLl9yYWRpdXNBeGlzLmNvbnRhaW4oZVswXSkmJnRoaXMuX2FuZ2xlQXhpcy5jb250YWluKGVbMV0pfSxjb250YWluRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzQXhpcy5jb250YWluRGF0YSh0WzBdKSYmdGhpcy5fYW5nbGVBeGlzLmNvbnRhaW5EYXRhKHRbMV0pfSxnZXRBeGlzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyJfIit0KyJBeGlzIl19LGdldEF4ZXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fcmFkaXVzQXhpcyx0aGlzLl9hbmdsZUF4aXNdfSxnZXRBeGVzQnlTY2FsZTpmdW5jdGlvbih0KXt2YXIgZT1bXSxpPXRoaXMuX2FuZ2xlQXhpcyxuPXRoaXMuX3JhZGl1c0F4aXM7cmV0dXJuIGkuc2NhbGUudHlwZT09PXQmJmUucHVzaChpKSxuLnNjYWxlLnR5cGU9PT10JiZlLnB1c2gobiksZX0sZ2V0QW5nbGVBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuZ2xlQXhpc30sZ2V0UmFkaXVzQXhpczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpdXNBeGlzfSxnZXRPdGhlckF4aXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYW5nbGVBeGlzO3JldHVybiB0PT09ZT90aGlzLl9yYWRpdXNBeGlzOmV9LGdldEJhc2VBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QXhlc0J5U2NhbGUoIm9yZGluYWwiKVswXXx8dGhpcy5nZXRBeGVzQnlTY2FsZSgidGltZSIpWzBdfHx0aGlzLmdldEFuZ2xlQXhpcygpfSxnZXRUb29sdGlwQXhlczpmdW5jdGlvbih0KXt2YXIgZT1udWxsIT10JiYiYXV0byIhPT10P3RoaXMuZ2V0QXhpcyh0KTp0aGlzLmdldEJhc2VBeGlzKCk7cmV0dXJue2Jhc2VBeGVzOltlXSxvdGhlckF4ZXM6W3RoaXMuZ2V0T3RoZXJBeGlzKGUpXX19LGRhdGFUb1BvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29vcmRUb1BvaW50KFt0aGlzLl9yYWRpdXNBeGlzLmRhdGFUb1JhZGl1cyh0WzBdLGUpLHRoaXMuX2FuZ2xlQXhpcy5kYXRhVG9BbmdsZSh0WzFdLGUpXSl9LHBvaW50VG9EYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5wb2ludFRvQ29vcmQodCk7cmV0dXJuW3RoaXMuX3JhZGl1c0F4aXMucmFkaXVzVG9EYXRhKGlbMF0sZSksdGhpcy5fYW5nbGVBeGlzLmFuZ2xlVG9EYXRhKGlbMV0sZSldfSxwb2ludFRvQ29vcmQ6ZnVuY3Rpb24odCl7dmFyIGU9dFswXS10aGlzLmN4LGk9dFsxXS10aGlzLmN5LG49dGhpcy5nZXRBbmdsZUF4aXMoKSxhPW4uZ2V0RXh0ZW50KCksbz1NYXRoLm1pbihhWzBdLGFbMV0pLHI9TWF0aC5tYXgoYVswXSxhWzFdKTtuLmludmVyc2U/bz1yLTM2MDpyPW8rMzYwO3ZhciBzPU1hdGguc3FydChlKmUraSppKTtlLz1zLGkvPXM7Zm9yKHZhciBsPU1hdGguYXRhbjIoLWksZSkvTWF0aC5QSSoxODAsdT1sPG8/MTotMTtsPG98fGw+cjspbCs9MzYwKnU7cmV0dXJuW3MsbF19LGNvb3JkVG9Qb2ludDpmdW5jdGlvbih0KXt2YXIgZT10WzBdLGk9dFsxXS8xODAqTWF0aC5QSSxuPU1hdGguY29zKGkpKmUrdGhpcy5jeCxhPS1NYXRoLnNpbihpKSplK3RoaXMuY3k7cmV0dXJuW24sYV19fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtpKDQxOSksaSgyKS5leHRlbmRDb21wb25lbnRNb2RlbCh7dHlwZToicG9sYXIiLGRlcGVuZGVuY2llczpbInBvbGFyQXhpcyIsImFuZ2xlQXhpcyJdLGNvb3JkaW5hdGVTeXN0ZW06bnVsbCxmaW5kQXhpc01vZGVsOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy5lY01vZGVsO3JldHVybiBpLmVhY2hDb21wb25lbnQodCxmdW5jdGlvbih0KXt0LmdldENvb3JkU3lzTW9kZWwoKT09PXRoaXMmJihlPXQpfSx0aGlzKSxlfSxkZWZhdWx0T3B0aW9uOnt6bGV2ZWw6MCx6OjAsY2VudGVyOlsiNTAlIiwiNTAlIl0scmFkaXVzOiI4MCUifX0pfSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtvLmNhbGwodGhpcywicmFkaXVzIix0LGUpLHRoaXMudHlwZT0iY2F0ZWdvcnkifXZhciBhPWkoMSksbz1pKDMzKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixwb2ludFRvRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBvbGFyLnBvaW50VG9EYXRhKHQsZSlbInJhZGl1cyI9PT10aGlzLmRpbT8wOjFdfSxkYXRhVG9SYWRpdXM6by5wcm90b3R5cGUuZGF0YVRvQ29vcmQscmFkaXVzVG9EYXRhOm8ucHJvdG90eXBlLmNvb3JkVG9EYXRhfSxhLmluaGVyaXRzKG4sbyksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIG8ubWFwKFsiUmFkaXVzIiwiQW5nbGUiXSxmdW5jdGlvbihpLG4pe3ZhciBhPXRoaXNbImdldCIraSsiQXhpcyJdKCksbz1lW25dLHI9dFtuXS8yLHM9ImRhdGFUbyIraSxsPSJjYXRlZ29yeSI9PT1hLnR5cGU/YS5nZXRCYW5kV2lkdGgoKTpNYXRoLmFicyhhW3NdKG8tciktYVtzXShvK3IpKTtyZXR1cm4iQW5nbGUiPT09aSYmKGw9bCpNYXRoLlBJLzE4MCksbH0sdGhpcyl9ZnVuY3Rpb24gYSh0KXt2YXIgZT10LmdldFJhZGl1c0F4aXMoKSxpPXQuZ2V0QW5nbGVBeGlzKCksYT1lLmdldEV4dGVudCgpO3JldHVybiBhWzBdPmFbMV0mJmEucmV2ZXJzZSgpLHtjb29yZFN5czp7dHlwZToicG9sYXIiLGN4OnQuY3gsY3k6dC5jeSxyOmFbMV0scjA6YVswXX0sYXBpOntjb29yZDpvLmJpbmQoZnVuY3Rpb24obil7dmFyIGE9ZS5kYXRhVG9SYWRpdXMoblswXSksbz1pLmRhdGFUb0FuZ2xlKG5bMV0pLHI9dC5jb29yZFRvUG9pbnQoW2Esb10pO3JldHVybiByLnB1c2goYSxvKk1hdGguUEkvMTgwKSxyfSksc2l6ZTpvLmJpbmQobix0KX19fXZhciBvPWkoMSk7dC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXtvLmNhbGwodGhpcyx0LGUsaSksdGhpcy50eXBlPSJ2YWx1ZSIsdGhpcy5hbmdsZT0wLHRoaXMubmFtZT0iIix0aGlzLm1vZGVsfXZhciBhPWkoMSksbz1pKDMzKTthLmluaGVyaXRzKG4sbyksdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSxpKXt0aGlzLl9tb2RlbD10LHRoaXMuZGltZW5zaW9ucz1bXSx0aGlzLl9pbmRpY2F0b3JBeGVzPWEubWFwKHQuZ2V0SW5kaWNhdG9yTW9kZWxzKCksZnVuY3Rpb24odCxlKXt2YXIgaT0iaW5kaWNhdG9yXyIrZSxuPW5ldyBvKGksbmV3IHIpO3JldHVybiBuLm5hbWU9dC5nZXQoIm5hbWUiKSxuLm1vZGVsPXQsdC5heGlzPW4sdGhpcy5kaW1lbnNpb25zLnB1c2goaSksbn0sdGhpcyksdGhpcy5yZXNpemUodCxpKSx0aGlzLmN4LHRoaXMuY3ksdGhpcy5yLHRoaXMuc3RhcnRBbmdsZX12YXIgYT1pKDEpLG89aSg0MjQpLHI9aSg0NSkscz1pKDQpLGw9aSgxOCk7bi5wcm90b3R5cGUuZ2V0SW5kaWNhdG9yQXhlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmRpY2F0b3JBeGVzfSxuLnByb3RvdHlwZS5kYXRhVG9Qb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2luZGljYXRvckF4ZXNbZV07cmV0dXJuIHRoaXMuY29vcmRUb1BvaW50KGkuZGF0YVRvQ29vcmQodCksZSl9LG4ucHJvdG90eXBlLmNvb3JkVG9Qb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2luZGljYXRvckF4ZXNbZV0sbj1pLmFuZ2xlLGE9dGhpcy5jeCt0Kk1hdGguY29zKG4pLG89dGhpcy5jeS10Kk1hdGguc2luKG4pO3JldHVyblthLG9dfSxuLnByb3RvdHlwZS5wb2ludFRvRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10WzBdLXRoaXMuY3gsaT10WzFdLXRoaXMuY3ksbj1NYXRoLnNxcnQoZSplK2kqaSk7ZS89bixpLz1uO2Zvcih2YXIgYSxvPU1hdGguYXRhbjIoLWksZSkscj0xLzAscz0tMSxsPTA7bDx0aGlzLl9pbmRpY2F0b3JBeGVzLmxlbmd0aDtsKyspe3ZhciB1PXRoaXMuX2luZGljYXRvckF4ZXNbbF0saD1NYXRoLmFicyhvLXUuYW5nbGUpO2g8ciYmKGE9dSxzPWwscj1oKX1yZXR1cm5bcywrKGEmJmEuY29vZFRvRGF0YShuKSldfSxuLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldCgiY2VudGVyIiksbj1lLmdldFdpZHRoKCksbz1lLmdldEhlaWdodCgpLHI9TWF0aC5taW4obixvKS8yO3RoaXMuY3g9cy5wYXJzZVBlcmNlbnQoaVswXSxuKSx0aGlzLmN5PXMucGFyc2VQZXJjZW50KGlbMV0sbyksdGhpcy5zdGFydEFuZ2xlPXQuZ2V0KCJzdGFydEFuZ2xlIikqTWF0aC5QSS8xODAsdGhpcy5yPXMucGFyc2VQZXJjZW50KHQuZ2V0KCJyYWRpdXMiKSxyKSxhLmVhY2godGhpcy5faW5kaWNhdG9yQXhlcyxmdW5jdGlvbih0LGUpe3Quc2V0RXh0ZW50KDAsdGhpcy5yKTt2YXIgaT10aGlzLnN0YXJ0QW5nbGUrZSpNYXRoLlBJKjIvdGhpcy5faW5kaWNhdG9yQXhlcy5sZW5ndGg7aT1NYXRoLmF0YW4yKE1hdGguc2luKGkpLE1hdGguY29zKGkpKSx0LmFuZ2xlPWl9LHRoaXMpfSxuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3ZhciBlPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjEwKSksaT10L2U7cmV0dXJuIDI9PT1pP2k9NTppKj0yLGkqZX12YXIgbj10aGlzLl9pbmRpY2F0b3JBeGVzLG89dGhpcy5fbW9kZWw7YS5lYWNoKG4sZnVuY3Rpb24odCl7dC5zY2FsZS5zZXRFeHRlbnQoMS8wLC0oMS8wKSl9KSx0LmVhY2hTZXJpZXNCeVR5cGUoInJhZGFyIixmdW5jdGlvbihlLGkpe2lmKCJyYWRhciI9PT1lLmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpJiZ0LmdldENvbXBvbmVudCgicmFkYXIiLGUuZ2V0KCJyYWRhckluZGV4IikpPT09byl7dmFyIHI9ZS5nZXREYXRhKCk7YS5lYWNoKG4sZnVuY3Rpb24odCl7dC5zY2FsZS51bmlvbkV4dGVudEZyb21EYXRhKHIsdC5kaW0pfSl9fSx0aGlzKTt2YXIgcj1vLmdldCgic3BsaXROdW1iZXIiKTthLmVhY2gobixmdW5jdGlvbih0LGUpe3ZhciBuPWwuZ2V0U2NhbGVFeHRlbnQodC5zY2FsZSx0Lm1vZGVsKTtsLm5pY2VTY2FsZUV4dGVudCh0LnNjYWxlLHQubW9kZWwpO3ZhciBhPXQubW9kZWwsbz10LnNjYWxlLHU9YS5nZXRNaW4oKSxoPWEuZ2V0TWF4KCksYz1vLmdldEludGVydmFsKCk7aWYobnVsbCE9dSYmbnVsbCE9aClvLnNldEV4dGVudCgrdSwraCksby5zZXRJbnRlcnZhbCgoaC11KS9yKTtlbHNlIGlmKG51bGwhPXUpe3ZhciBkO2RvIGQ9dStjKnIsby5zZXRFeHRlbnQoK3UsZCksby5zZXRJbnRlcnZhbChjKSxjPWkoYyk7d2hpbGUoZDxuWzFdJiZpc0Zpbml0ZShkKSYmaXNGaW5pdGUoblsxXSkpfWVsc2UgaWYobnVsbCE9aCl7dmFyIGY7ZG8gZj1oLWMqcixvLnNldEV4dGVudChmLCtoKSxvLnNldEludGVydmFsKGMpLGM9aShjKTt3aGlsZShmPm5bMF0mJmlzRmluaXRlKGYpJiZpc0Zpbml0ZShuWzBdKSl9ZWxzZXt2YXIgcD1vLmdldFRpY2tzKCkubGVuZ3RoLTE7cD5yJiYoYz1pKGMpKTt2YXIgZz1NYXRoLnJvdW5kKChuWzBdK25bMV0pLzIvYykqYyxtPU1hdGgucm91bmQoci8yKTtvLnNldEV4dGVudChzLnJvdW5kKGctbSpjKSxzLnJvdW5kKGcrKHItbSkqYykpLG8uc2V0SW50ZXJ2YWwoYyl9fSl9LG4uZGltZW5zaW9ucz1bXSxuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPVtdO3JldHVybiB0LmVhY2hDb21wb25lbnQoInJhZGFyIixmdW5jdGlvbihhKXt2YXIgbz1uZXcgbihhLHQsZSk7aS5wdXNoKG8pLGEuY29vcmRpbmF0ZVN5c3RlbT1vfSksdC5lYWNoU2VyaWVzQnlUeXBlKCJyYWRhciIsZnVuY3Rpb24odCl7InJhZGFyIj09PXQuZ2V0KCJjb29yZGluYXRlU3lzdGVtIikmJih0LmNvb3JkaW5hdGVTeXN0ZW09aVt0LmdldCgicmFkYXJJbmRleCIpfHwwXSl9KSxpfSxpKDI2KS5yZWdpc3RlcigicmFkYXIiLG4pLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBzLmRlZmF1bHRzKHtzaG93OmV9LHQpfXZhciBhPWkoMTAxKSxvPWEudmFsdWVBeGlzLHI9aSgxMSkscz1pKDEpLGw9aSg0MiksdT1pKDIpLmV4dGVuZENvbXBvbmVudE1vZGVsKHt0eXBlOiJyYWRhciIsb3B0aW9uVXBkYXRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0KCJib3VuZGFyeUdhcCIpLGU9dGhpcy5nZXQoInNwbGl0TnVtYmVyIiksaT10aGlzLmdldCgic2NhbGUiKSxuPXRoaXMuZ2V0KCJheGlzTGluZSIpLGE9dGhpcy5nZXQoImF4aXNUaWNrIiksbz10aGlzLmdldCgiYXhpc0xhYmVsIiksdT10aGlzLmdldCgibmFtZSIpLGg9dGhpcy5nZXQoIm5hbWUuc2hvdyIpLGM9dGhpcy5nZXQoIm5hbWUuZm9ybWF0dGVyIiksZD10aGlzLmdldCgibmFtZUdhcCIpLGY9dGhpcy5nZXQoInRyaWdnZXJFdmVudCIpLHA9cy5tYXAodGhpcy5nZXQoImluZGljYXRvciIpfHxbXSxmdW5jdGlvbihwKXtudWxsIT1wLm1heCYmcC5tYXg+MCYmIXAubWluP3AubWluPTA6bnVsbCE9cC5taW4mJnAubWluPDAmJiFwLm1heCYmKHAubWF4PTApO3ZhciBnPXU7aWYobnVsbCE9cC5jb2xvciYmKGc9cy5kZWZhdWx0cyh7Y29sb3I6cC5jb2xvcn0sdSkpLHA9cy5tZXJnZShzLmNsb25lKHApLHtib3VuZGFyeUdhcDp0LHNwbGl0TnVtYmVyOmUsc2NhbGU6aSxheGlzTGluZTpuLGF4aXNUaWNrOmEsYXhpc0xhYmVsOm8sbmFtZTpwLnRleHQsbmFtZUxvY2F0aW9uOiJlbmQiLG5hbWVHYXA6ZCxuYW1lVGV4dFN0eWxlOmcsdHJpZ2dlckV2ZW50OmZ9LCExKSxofHwocC5uYW1lPSIiKSwic3RyaW5nIj09dHlwZW9mIGMpe3ZhciBtPXAubmFtZTtwLm5hbWU9Yy5yZXBsYWNlKCJ7dmFsdWV9IixudWxsIT1tP206IiIpfWVsc2UiZnVuY3Rpb24iPT10eXBlb2YgYyYmKHAubmFtZT1jKHAubmFtZSxwKSk7dmFyIHY9cy5leHRlbmQobmV3IHIocCxudWxsLHRoaXMuZWNNb2RlbCksbCk7cmV0dXJuIHYubWFpblR5cGU9InJhZGFyIix2LmNvbXBvbmVudEluZGV4PXRoaXMuY29tcG9uZW50SW5kZXgsdn0sdGhpcyk7dGhpcy5nZXRJbmRpY2F0b3JNb2RlbHM9ZnVuY3Rpb24oKXtyZXR1cm4gcH19LGRlZmF1bHRPcHRpb246e3psZXZlbDowLHo6MCxjZW50ZXI6WyI1MCUiLCI1MCUiXSxyYWRpdXM6Ijc1JSIsc3RhcnRBbmdsZTo5MCxuYW1lOntzaG93OiEwfSxib3VuZGFyeUdhcDpbMCwwXSxzcGxpdE51bWJlcjo1LG5hbWVHYXA6MTUsc2NhbGU6ITEsc2hhcGU6InBvbHlnb24iLGF4aXNMaW5lOnMubWVyZ2Uoe2xpbmVTdHlsZTp7Y29sb3I6IiNiYmIifX0sby5heGlzTGluZSksYXhpc0xhYmVsOm4oby5heGlzTGFiZWwsITEpLGF4aXNUaWNrOm4oby5heGlzVGljaywhMSksc3BsaXRMaW5lOm4oby5zcGxpdExpbmUsITApLHNwbGl0QXJlYTpuKG8uc3BsaXRBcmVhLCEwKSxpbmRpY2F0b3I6W119fSk7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGUudHlwZXx8KGUuZGF0YT8iY2F0ZWdvcnkiOiJ2YWx1ZSIpfXZhciBhPWkoMTMpLG89aSg2Mikscj1pKDEpLHM9YS5leHRlbmQoe3R5cGU6InNpbmdsZUF4aXMiLGxheW91dE1vZGU6ImJveCIsYXhpczpudWxsLGNvb3JkaW5hdGVTeXN0ZW06bnVsbCxnZXRDb29yZFN5c01vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSksbD17bGVmdDoiNSUiLHRvcDoiNSUiLHJpZ2h0OiI1JSIsYm90dG9tOiI1JSIsdHlwZToidmFsdWUiLHBvc2l0aW9uOiJib3R0b20iLG9yaWVudDoiaG9yaXpvbnRhbCIsYXhpc0xpbmU6e3Nob3c6ITAsbGluZVN0eWxlOnt3aWR0aDoyLHR5cGU6InNvbGlkIn19LHRvb2x0aXA6e3Nob3c6ITB9LGF4aXNUaWNrOntzaG93OiEwLGxlbmd0aDo2LGxpbmVTdHlsZTp7d2lkdGg6Mn19LGF4aXNMYWJlbDp7c2hvdzohMCxpbnRlcnZhbDoiYXV0byJ9LHNwbGl0TGluZTp7c2hvdzohMCxsaW5lU3R5bGU6e3R5cGU6ImRhc2hlZCIsb3BhY2l0eTouMn19fTtyLm1lcmdlKHMucHJvdG90eXBlLGkoNDIpKSxvKCJzaW5nbGUiLHMsbixsKSx0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlLGkpe3RoaXMuZGltZW5zaW9uPSJzaW5nbGUiLHRoaXMuZGltZW5zaW9ucz1bInNpbmdsZSJdLHRoaXMuX2F4aXM9bnVsbCx0aGlzLl9yZWN0LHRoaXMuX2luaXQodCxlLGkpLHRoaXMubW9kZWw9dH12YXIgYT1pKDQyOSksbz1pKDE4KSxyPWkoOSk7bi5wcm90b3R5cGU9e3R5cGU6InNpbmdsZUF4aXMiLGF4aXNQb2ludGVyRW5hYmxlZDohMCxjb25zdHJ1Y3RvcjpuLF9pbml0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLmRpbWVuc2lvbixyPW5ldyBhKG4sby5jcmVhdGVTY2FsZUJ5TW9kZWwodCksWzAsMF0sdC5nZXQoInR5cGUiKSx0LmdldCgicG9zaXRpb24iKSkscz0iY2F0ZWdvcnkiPT09ci50eXBlO3Iub25CYW5kPXMmJnQuZ2V0KCJib3VuZGFyeUdhcCIpLHIuaW52ZXJzZT10LmdldCgiaW52ZXJzZSIpLHIub3JpZW50PXQuZ2V0KCJvcmllbnQiKSx0LmF4aXM9cixyLm1vZGVsPXQsci5jb29yZGluYXRlU3lzdGVtPXRoaXMsdGhpcy5fYXhpcz1yfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXt0LmVhY2hTZXJpZXMoZnVuY3Rpb24odCl7aWYodC5jb29yZGluYXRlU3lzdGVtPT09dGhpcyl7dmFyIGU9dC5nZXREYXRhKCksaT10aGlzLmRpbWVuc2lvbjt0aGlzLl9heGlzLnNjYWxlLnVuaW9uRXh0ZW50RnJvbURhdGEoZSx0LmNvb3JkRGltVG9EYXRhRGltKGkpKSxvLm5pY2VTY2FsZUV4dGVudCh0aGlzLl9heGlzLnNjYWxlLHRoaXMuX2F4aXMubW9kZWwpfX0sdGhpcyl9LHJlc2l6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3JlY3Q9ci5nZXRMYXlvdXRSZWN0KHtsZWZ0OnQuZ2V0KCJsZWZ0IiksdG9wOnQuZ2V0KCJ0b3AiKSxyaWdodDp0LmdldCgicmlnaHQiKSxib3R0b206dC5nZXQoImJvdHRvbSIpLHdpZHRoOnQuZ2V0KCJ3aWR0aCIpLGhlaWdodDp0LmdldCgiaGVpZ2h0Iil9LHt3aWR0aDplLmdldFdpZHRoKCksaGVpZ2h0OmUuZ2V0SGVpZ2h0KCl9KSx0aGlzLl9hZGp1c3RBeGlzKCl9LGdldFJlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdH0sX2FkanVzdEF4aXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWN0LGU9dGhpcy5fYXhpcyxpPWUuaXNIb3Jpem9udGFsKCksbj1pP1swLHQud2lkdGhdOlswLHQuaGVpZ2h0XSxhPWUucmV2ZXJzZT8xOjA7ZS5zZXRFeHRlbnQoblthXSxuWzEtYV0pLHRoaXMuX3VwZGF0ZUF4aXNUcmFuc2Zvcm0oZSxpP3QueDp0LnkpfSxfdXBkYXRlQXhpc1RyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3ZhciBpPXQuZ2V0RXh0ZW50KCksbj1pWzBdK2lbMV0sYT10LmlzSG9yaXpvbnRhbCgpO3QudG9HbG9iYWxDb29yZD1hP2Z1bmN0aW9uKHQpe3JldHVybiB0K2V9OmZ1bmN0aW9uKHQpe3JldHVybiBuLXQrZX0sdC50b0xvY2FsQ29vcmQ9YT9mdW5jdGlvbih0KXtyZXR1cm4gdC1lfTpmdW5jdGlvbih0KXtyZXR1cm4gbi10K2V9fSxnZXRBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F4aXN9LGdldEJhc2VBeGlzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F4aXN9LGdldEF4ZXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fYXhpc119LGdldFRvb2x0aXBBeGVzOmZ1bmN0aW9uKCl7cmV0dXJue2Jhc2VBeGVzOlt0aGlzLmdldEF4aXMoKV19fSxjb250YWluUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSZWN0KCksaT10aGlzLmdldEF4aXMoKSxuPWkub3JpZW50O3JldHVybiJob3Jpem9udGFsIj09PW4/aS5jb250YWluKGkudG9Mb2NhbENvb3JkKHRbMF0pKSYmdFsxXT49ZS55JiZ0WzFdPD1lLnkrZS5oZWlnaHQ6aS5jb250YWluKGkudG9Mb2NhbENvb3JkKHRbMV0pKSYmdFswXT49ZS55JiZ0WzBdPD1lLnkrZS5oZWlnaHR9LHBvaW50VG9EYXRhOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QXhpcygpO3JldHVybltlLmNvb3JkVG9EYXRhKGUudG9Mb2NhbENvb3JkKHRbImhvcml6b250YWwiPT09ZS5vcmllbnQ/MDoxXSkpXX0sZGF0YVRvUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRBeGlzKCksaT10aGlzLmdldFJlY3QoKSxuPVtdLGE9Imhvcml6b250YWwiPT09ZS5vcmllbnQ/MDoxO3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXkmJih0PXRbMF0pLG5bYV09ZS50b0dsb2JhbENvb3JkKGUuZGF0YVRvQ29vcmQoK3QpKSxuWzEtYV09MD09PWE/aS55K2kuaGVpZ2h0LzI6aS54K2kud2lkdGgvMixufX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1pKDEpLGE9aSgzMyksbz1mdW5jdGlvbih0LGUsaSxuLG8pe2EuY2FsbCh0aGlzLHQsZSxpKSx0aGlzLnR5cGU9bnx8InZhbHVlIix0aGlzLnBvc2l0aW9uPW98fCJib3R0b20iLHRoaXMub3JpZW50PW51bGwsdGhpcy5fbGFiZWxJbnRlcnZhbD1udWxsfTtvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6byxtb2RlbDpudWxsLGlzSG9yaXpvbnRhbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zaXRpb247cmV0dXJuInRvcCI9PT10fHwiYm90dG9tIj09PXR9LHBvaW50VG9EYXRhOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZVN5c3RlbS5wb2ludFRvRGF0YSh0LGUpWzBdfSx0b0dsb2JhbENvb3JkOm51bGwsdG9Mb2NhbENvb3JkOm51bGx9LG4uaW5oZXJpdHMobyxhKSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG4odCxlKXt2YXIgaT10aGlzLmdldEF4aXMoKSxuPWUgaW5zdGFuY2VvZiBBcnJheT9lWzBdOmUsYT0odCBpbnN0YW5jZW9mIEFycmF5P3RbMF06dCkvMjtyZXR1cm4iY2F0ZWdvcnkiPT09aS50eXBlP2kuZ2V0QmFuZFdpZHRoKCk6TWF0aC5hYnMoaS5kYXRhVG9Db29yZChuLWEpLWkuZGF0YVRvQ29vcmQobithKSl9ZnVuY3Rpb24gYSh0KXt2YXIgZT10LmdldFJlY3QoKTtyZXR1cm57Y29vcmRTeXM6e3R5cGU6InNpbmdsZUF4aXMiLHg6ZS54LHk6ZS55LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fSxhcGk6e2Nvb3JkOm8uYmluZCh0LmRhdGFUb1BvaW50LHQpLHNpemU6by5iaW5kKG4sdCl9fX12YXIgbz1pKDEpO3QuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3ZhciBpPVtdO3JldHVybiB0LmVhY2hDb21wb25lbnQoInNpbmdsZUF4aXMiLGZ1bmN0aW9uKG4sbyl7dmFyIHI9bmV3IGEobix0LGUpO3IubmFtZT0ic2luZ2xlXyIrbyxyLnJlc2l6ZShuLGUpLG4uY29vcmRpbmF0ZVN5c3RlbT1yLGkucHVzaChyKX0pLHQuZWFjaFNlcmllcyhmdW5jdGlvbihlKXtpZigic2luZ2xlQXhpcyI9PT1lLmdldCgiY29vcmRpbmF0ZVN5c3RlbSIpKXt2YXIgaT10LnF1ZXJ5Q29tcG9uZW50cyh7bWFpblR5cGU6InNpbmdsZUF4aXMiLGluZGV4OmUuZ2V0KCJzaW5nbGVBeGlzSW5kZXgiKSxpZDplLmdldCgic2luZ2xlQXhpc0lkIil9KVswXTtlLmNvb3JkaW5hdGVTeXN0ZW09aSYmaS5jb29yZGluYXRlU3lzdGVtfX0pLGl9dmFyIGE9aSg0MjgpO2koMjYpLnJlZ2lzdGVyKCJzaW5nbGUiLHtjcmVhdGU6bixkaW1lbnNpb25zOmEucHJvdG90eXBlLmRpbWVuc2lvbnN9KX0sZnVuY3Rpb24odCxlLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiJfRUNfIit0fWZ1bmN0aW9uIGEodCxlKXt0aGlzLmlkPW51bGw9PXQ/IiI6dCx0aGlzLmluRWRnZXM9W10sdGhpcy5vdXRFZGdlcz1bXSx0aGlzLmVkZ2VzPVtdLHRoaXMuaG9zdEdyYXBoLHRoaXMuZGF0YUluZGV4PW51bGw9PWU/LTE6ZX1mdW5jdGlvbiBvKHQsZSxpKXt0aGlzLm5vZGUxPXQsdGhpcy5ub2RlMj1lLHRoaXMuZGF0YUluZGV4PW51bGw9PWk/LTE6aX12YXIgcj1pKDEpLHM9ZnVuY3Rpb24odCl7dGhpcy5fZGlyZWN0ZWQ9dHx8ITEsdGhpcy5ub2Rlcz1bXSx0aGlzLmVkZ2VzPVtdLHRoaXMuX25vZGVzTWFwPXt9LHRoaXMuX2VkZ2VzTWFwPXt9LHRoaXMuZGF0YSx0aGlzLmVkZ2VEYXRhfSxsPXMucHJvdG90eXBlO2wudHlwZT0iZ3JhcGgiLGwuaXNEaXJlY3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXJlY3RlZH0sbC5hZGROb2RlPWZ1bmN0aW9uKHQsZSl7dD10fHwiIitlO3ZhciBpPXRoaXMuX25vZGVzTWFwO2lmKCFpW24odCldKXt2YXIgbz1uZXcgYSh0LGUpO3JldHVybiBvLmhvc3RHcmFwaD10aGlzLHRoaXMubm9kZXMucHVzaChvKSxpW24odCldPW8sb319LGwuZ2V0Tm9kZUJ5SW5kZXg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLmdldFJhd0luZGV4KHQpO3JldHVybiB0aGlzLm5vZGVzW2VdfSxsLmdldE5vZGVCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlc01hcFtuKHQpXX0sbC5hZGRFZGdlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLl9ub2Rlc01hcCxzPXRoaXMuX2VkZ2VzTWFwO2lmKCJudW1iZXIiPT10eXBlb2YgdCYmKHQ9dGhpcy5ub2Rlc1t0XSksIm51bWJlciI9PXR5cGVvZiBlJiYoZT10aGlzLm5vZGVzW2VdKSx0IGluc3RhbmNlb2YgYXx8KHQ9cltuKHQpXSksZSBpbnN0YW5jZW9mIGF8fChlPXJbbihlKV0pLHQmJmUpe3ZhciBsPXQuaWQrIi0iK2UuaWQ7aWYoIXNbbF0pe3ZhciB1PW5ldyBvKHQsZSxpKTtyZXR1cm4gdS5ob3N0R3JhcGg9dGhpcyx0aGlzLl9kaXJlY3RlZCYmKHQub3V0RWRnZXMucHVzaCh1KSxlLmluRWRnZXMucHVzaCh1KSksdC5lZGdlcy5wdXNoKHUpLHQhPT1lJiZlLmVkZ2VzLnB1c2godSksdGhpcy5lZGdlcy5wdXNoKHUpLHNbbF09dSx1fX19LGwuZ2V0RWRnZUJ5SW5kZXg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lZGdlRGF0YS5nZXRSYXdJbmRleCh0KTtyZXR1cm4gdGhpcy5lZGdlc1tlXX0sbC5nZXRFZGdlPWZ1bmN0aW9uKHQsZSl7dCBpbnN0YW5jZW9mIGEmJih0PXQuaWQpLGUgaW5zdGFuY2VvZiBhJiYoZT1lLmlkKTt2YXIgaT10aGlzLl9lZGdlc01hcDtyZXR1cm4gdGhpcy5fZGlyZWN0ZWQ/aVt0KyItIitlXTppW3QrIi0iK2VdfHxpW2UrIi0iK3RdfSxsLmVhY2hOb2RlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMubm9kZXMsbj1pLmxlbmd0aCxhPTA7YTxuO2ErKylpW2FdLmRhdGFJbmRleD49MCYmdC5jYWxsKGUsaVthXSxhKX0sbC5lYWNoRWRnZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmVkZ2VzLG49aS5sZW5ndGgsYT0wO2E8bjthKyspaVthXS5kYXRhSW5kZXg+PTAmJmlbYV0ubm9kZTEuZGF0YUluZGV4Pj0wJiZpW2FdLm5vZGUyLmRhdGFJbmRleD49MCYmdC5jYWxsKGUsaVthXSxhKX0sbC5icmVhZHRoRmlyc3RUcmF2ZXJzZT1mdW5jdGlvbih0LGUsaSxvKXtpZihlIGluc3RhbmNlb2YgYXx8KGU9dGhpcy5fbm9kZXNNYXBbbihlKV0pLGUpe2Zvcih2YXIgcj0ib3V0Ij09PWk/Im91dEVkZ2VzIjoiaW4iPT09aT8iaW5FZGdlcyI6ImVkZ2VzIixzPTA7czx0aGlzLm5vZGVzLmxlbmd0aDtzKyspdGhpcy5ub2Rlc1tzXS5fX3Zpc2l0ZWQ9ITE7aWYoIXQuY2FsbChvLGUsbnVsbCkpZm9yKHZhciBsPVtlXTtsLmxlbmd0aDspZm9yKHZhciB1PWwuc2hpZnQoKSxoPXVbcl0scz0wO3M8aC5sZW5ndGg7cysrKXt2YXIgYz1oW3NdLGQ9Yy5ub2RlMT09PXU/Yy5ub2RlMjpjLm5vZGUxO2lmKCFkLl9fdmlzaXRlZCl7aWYodC5jYWxsKG8sZCx1KSlyZXR1cm47bC5wdXNoKGQpLGQuX192aXNpdGVkPSEwfX19fSxsLnVwZGF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmRhdGEsZT10aGlzLmVkZ2VEYXRhLGk9dGhpcy5ub2RlcyxuPXRoaXMuZWRnZXMsYT0wLG89aS5sZW5ndGg7YTxvO2ErKylpW2FdLmRhdGFJbmRleD0tMTtmb3IodmFyIGE9MCxvPXQuY291bnQoKTthPG87YSsrKWlbdC5nZXRSYXdJbmRleChhKV0uZGF0YUluZGV4PWE7ZS5maWx0ZXJTZWxmKGZ1bmN0aW9uKHQpe3ZhciBpPW5bZS5nZXRSYXdJbmRleCh0KV07cmV0dXJuIGkubm9kZTEuZGF0YUluZGV4Pj0wJiZpLm5vZGUyLmRhdGFJbmRleD49MH0pO2Zvcih2YXIgYT0wLG89bi5sZW5ndGg7YTxvO2ErKyluW2FdLmRhdGFJbmRleD0tMTtmb3IodmFyIGE9MCxvPWUuY291bnQoKTthPG87YSsrKW5bZS5nZXRSYXdJbmRleChhKV0uZGF0YUluZGV4PWF9LGwuY2xvbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHModGhpcy5fZGlyZWN0ZWQpLGU9dGhpcy5ub2RlcyxpPXRoaXMuZWRnZXMsbj0wO248ZS5sZW5ndGg7bisrKXQuYWRkTm9kZShlW25dLmlkLGVbbl0uZGF0YUluZGV4KTtmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIGE9aVtuXTt0LmFkZEVkZ2UoYS5ub2RlMS5pZCxhLm5vZGUyLmlkLGEuZGF0YUluZGV4KX1yZXR1cm4gdH0sYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmEsZGVncmVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMubGVuZ3RofSxpbkRlZ3JlZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluRWRnZXMubGVuZ3RofSxvdXREZWdyZWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdXRFZGdlcy5sZW5ndGh9LGdldE1vZGVsOmZ1bmN0aW9uKHQpe2lmKCEodGhpcy5kYXRhSW5kZXg8MCkpe3ZhciBlPXRoaXMuaG9zdEdyYXBoLGk9ZS5kYXRhLmdldEl0ZW1Nb2RlbCh0aGlzLmRhdGFJbmRleCk7cmV0dXJuIGkuZ2V0TW9kZWwodCl9fX0sby5wcm90b3R5cGUuZ2V0TW9kZWw9ZnVuY3Rpb24odCl7aWYoISh0aGlzLmRhdGFJbmRleDwwKSl7dmFyIGU9dGhpcy5ob3N0R3JhcGgsaT1lLmVkZ2VEYXRhLmdldEl0ZW1Nb2RlbCh0aGlzLmRhdGFJbmRleCk7cmV0dXJuIGkuZ2V0TW9kZWwodCl9fTt2YXIgdT1mdW5jdGlvbih0LGUpe3JldHVybntnZXRWYWx1ZTpmdW5jdGlvbihpKXt2YXIgbj10aGlzW3RdW2VdO3JldHVybiBuLmdldChuLmdldERpbWVuc2lvbihpfHwidmFsdWUiKSx0aGlzLmRhdGFJbmRleCl9LHNldFZpc3VhbDpmdW5jdGlvbihpLG4pe3RoaXMuZGF0YUluZGV4Pj0wJiZ0aGlzW3RdW2VdLnNldEl0ZW1WaXN1YWwodGhpcy5kYXRhSW5kZXgsaSxuKX0sZ2V0VmlzdWFsOmZ1bmN0aW9uKGksbil7cmV0dXJuIHRoaXNbdF1bZV0uZ2V0SXRlbVZpc3VhbCh0aGlzLmRhdGFJbmRleCxpLG4pfSxzZXRMYXlvdXQ6ZnVuY3Rpb24oaSxuKXt0aGlzLmRhdGFJbmRleD49MCYmdGhpc1t0XVtlXS5zZXRJdGVtTGF5b3V0KHRoaXMuZGF0YUluZGV4LGksbil9LGdldExheW91dDpmdW5jdGlvbigpe3JldHVybiB0aGlzW3RdW2VdLmdldEl0ZW1MYXlvdXQodGhpcy5kYXRhSW5kZXgpfSxnZXRHcmFwaGljRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtlXS5nZXRJdGVtR3JhcGhpY0VsKHRoaXMuZGF0YUluZGV4KX0sZ2V0UmF3SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtlXS5nZXRSYXdJbmRleCh0aGlzLmRhdGFJbmRleCl9fX07ci5taXhpbihhLHUoImhvc3RHcmFwaCIsImRhdGEiKSksci5taXhpbihvLHUoImhvc3RHcmFwaCIsImVkZ2VEYXRhIikpLHMuTm9kZT1hLHMuRWRnZT1vLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbih0LGUpe3RoaXMucm9vdCx0aGlzLmRhdGEsdGhpcy5fbm9kZXM9W10sdGhpcy5ob3N0TW9kZWw9dCx0aGlzLmxldmVsTW9kZWxzPW8ubWFwKGV8fFtdLGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgcihlLHQsdC5lY01vZGVsKX0pfWZ1bmN0aW9uIGEodCxlKXt2YXIgaT1lLmNoaWxkcmVuO3QucGFyZW50Tm9kZSE9PWUmJihpLnB1c2godCksdC5wYXJlbnROb2RlPWUpfXZhciBvPWkoMSkscj1pKDExKSxzPWkoMTQpLGw9aSgyNzIpLHU9aSgyNSksaD1mdW5jdGlvbih0LGUpe3RoaXMubmFtZT10fHwiIix0aGlzLmRlcHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLmRhdGFJbmRleD0tMSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudmlld0NoaWxkcmVuPVtdLHRoaXMuaG9zdFRyZWU9ZX07aC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmgsaXNSZW1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YUluZGV4PDB9LGVhY2hOb2RlOmZ1bmN0aW9uKHQsZSxpKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKGk9ZSxlPXQsdD1udWxsKSx0PXR8fHt9LG8uaXNTdHJpbmcodCkmJih0PXtvcmRlcjp0fSk7dmFyIG4sYT10Lm9yZGVyfHwicHJlb3JkZXIiLHI9dGhpc1t0LmF0dHJ8fCJjaGlsZHJlbiJdOyJwcmVvcmRlciI9PT1hJiYobj1lLmNhbGwoaSx0aGlzKSk7Zm9yKHZhciBzPTA7IW4mJnM8ci5sZW5ndGg7cysrKXJbc10uZWFjaE5vZGUodCxlLGkpOyJwb3N0b3JkZXIiPT09YSYmZS5jYWxsKGksdGhpcyl9LHVwZGF0ZURlcHRoQW5kSGVpZ2h0OmZ1bmN0aW9uKHQpe3ZhciBlPTA7dGhpcy5kZXB0aD10O2Zvcih2YXIgaT0wO2k8dGhpcy5jaGlsZHJlbi5sZW5ndGg7aSsrKXt2YXIgbj10aGlzLmNoaWxkcmVuW2ldO24udXBkYXRlRGVwdGhBbmRIZWlnaHQodCsxKSxuLmhlaWdodD5lJiYoZT1uLmhlaWdodCl9dGhpcy5oZWlnaHQ9ZSsxfSxnZXROb2RlQnlJZDpmdW5jdGlvbih0KXtpZih0aGlzLmdldElkKCk9PT10KXJldHVybiB0aGlzO2Zvcih2YXIgZT0wLGk9dGhpcy5jaGlsZHJlbixuPWkubGVuZ3RoO2U8bjtlKyspe3ZhciBhPWlbZV0uZ2V0Tm9kZUJ5SWQodCk7aWYoYSlyZXR1cm4gYX19LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe2lmKHQ9PT10aGlzKXJldHVybiEwO2Zvcih2YXIgZT0wLGk9dGhpcy5jaGlsZHJlbixuPWkubGVuZ3RoO2U8bjtlKyspe3ZhciBhPWlbZV0uY29udGFpbnModCk7aWYoYSlyZXR1cm4gYX19LGdldEFuY2VzdG9yczpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10P3RoaXM6dGhpcy5wYXJlbnROb2RlO2k7KWUucHVzaChpKSxpPWkucGFyZW50Tm9kZTtyZXR1cm4gZS5yZXZlcnNlKCksZX0sZ2V0VmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ob3N0VHJlZS5kYXRhO3JldHVybiBlLmdldChlLmdldERpbWVuc2lvbih0fHwidmFsdWUiKSx0aGlzLmRhdGFJbmRleCl9LHNldExheW91dDpmdW5jdGlvbih0LGUpe3RoaXMuZGF0YUluZGV4Pj0wJiZ0aGlzLmhvc3RUcmVlLmRhdGEuc2V0SXRlbUxheW91dCh0aGlzLmRhdGFJbmRleCx0LGUpfSxnZXRMYXlvdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldEl0ZW1MYXlvdXQodGhpcy5kYXRhSW5kZXgpfSxnZXRNb2RlbDpmdW5jdGlvbih0KXtpZighKHRoaXMuZGF0YUluZGV4PDApKXt2YXIgZT10aGlzLmhvc3RUcmVlLGk9ZS5kYXRhLmdldEl0ZW1Nb2RlbCh0aGlzLmRhdGFJbmRleCksbj10aGlzLmdldExldmVsTW9kZWwoKTtyZXR1cm4gaS5nZXRNb2RlbCh0LChufHxlLmhvc3RNb2RlbCkuZ2V0TW9kZWwodCkpfX0sZ2V0TGV2ZWxNb2RlbDpmdW5jdGlvbigpe3JldHVybih0aGlzLmhvc3RUcmVlLmxldmVsTW9kZWxzfHxbXSlbdGhpcy5kZXB0aF19LHNldFZpc3VhbDpmdW5jdGlvbih0LGUpe3RoaXMuZGF0YUluZGV4Pj0wJiZ0aGlzLmhvc3RUcmVlLmRhdGEuc2V0SXRlbVZpc3VhbCh0aGlzLmRhdGFJbmRleCx0LGUpfSxnZXRWaXN1YWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldEl0ZW1WaXN1YWwodGhpcy5kYXRhSW5kZXgsdCxlKX0sZ2V0UmF3SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldFJhd0luZGV4KHRoaXMuZGF0YUluZGV4KX0sZ2V0SWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0VHJlZS5kYXRhLmdldElkKHRoaXMuZGF0YUluZGV4KX19LG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHR5cGU6InRyZWUiLGVhY2hOb2RlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnJvb3QuZWFjaE5vZGUodCxlLGkpfSxnZXROb2RlQnlEYXRhSW5kZXg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXRhLmdldFJhd0luZGV4KHQpO3JldHVybiB0aGlzLl9ub2Rlc1tlXX0sZ2V0Tm9kZUJ5TmFtZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yb290LmdldE5vZGVCeU5hbWUodCl9LHVwZGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmRhdGEsZT10aGlzLl9ub2RlcyxpPTAsbj1lLmxlbmd0aDtpPG47aSsrKWVbaV0uZGF0YUluZGV4PS0xO2Zvcih2YXIgaT0wLG49dC5jb3VudCgpO2k8bjtpKyspZVt0LmdldFJhd0luZGV4KGkpXS5kYXRhSW5kZXg9aX0sY2xlYXJMYXlvdXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXRhLmNsZWFySXRlbUxheW91dHMoKX19LG4uY3JlYXRlVHJlZT1mdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gcih0LGUpe3ZhciBpPXQudmFsdWU7Zj1NYXRoLm1heChmLG8uaXNBcnJheShpKT9pLmxlbmd0aDoxKSxkLnB1c2godCk7dmFyIG49bmV3IGgodC5uYW1lLGMpO2U/YShuLGUpOmMucm9vdD1uLGMuX25vZGVzLnB1c2gobik7dmFyIHM9dC5jaGlsZHJlbjtpZihzKWZvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXIoc1tsXSxuKX12YXIgYz1uZXcgbihlLGkpLGQ9W10sZj0xO3IodCksYy5yb290LnVwZGF0ZURlcHRoQW5kSGVpZ2h0KDApO3ZhciBwPXUoW3tuYW1lOiJ2YWx1ZSJ9XSxkLHtkaW1Db3VudDpmfSksZz1uZXcgcyhwLGUpO3JldHVybiBnLmluaXREYXRhKGQpLGwoe21haW5EYXRhOmcsc3RydWN0OmMsc3RydWN0QXR0cjoidHJlZSJ9KSxjLnVwZGF0ZSgpLGN9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQuZ2V0KCJzdGFjayIpfHwiX19lY19zdGFja18iK3Quc2VyaWVzSW5kZXh9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdC5kaW19ZnVuY3Rpb24gbyh0LGUsaSl7dmFyIG89aS5nZXRXaWR0aCgpLHU9aS5nZXRIZWlnaHQoKSxoPXt9LGM9e30sZD1yKHMuZmlsdGVyKGUuZ2V0U2VyaWVzQnlUeXBlKHQpLGZ1bmN0aW9uKHQpe3JldHVybiFlLmlzU2VyaWVzRmlsdGVyZWQodCkmJnQuY29vcmRpbmF0ZVN5c3RlbSYmInBvbGFyIj09PXQuY29vcmRpbmF0ZVN5c3RlbS50eXBlfSkpO2UuZWFjaFNlcmllc0J5VHlwZSh0LGZ1bmN0aW9uKHQpe2lmKCJwb2xhciI9PT10LmNvb3JkaW5hdGVTeXN0ZW0udHlwZSl7dmFyIGU9dC5nZXREYXRhKCksaT10LmNvb3JkaW5hdGVTeXN0ZW0scj1pLmdldEFuZ2xlQXhpcygpLHM9aS5nZXRCYXNlQXhpcygpLGY9bih0KSxwPWRbYShzKV1bZl0sZz1wLm9mZnNldCxtPXAud2lkdGgsdj1pLmdldE90aGVyQXhpcyhzKSx5PXQuZ2V0KCJjZW50ZXIiKXx8WyI1MCUiLCI1MCUiXSx4PWwoeVswXSxvKSxfPWwoeVsxXSx1KSxiPXQuZ2V0KCJiYXJNaW5IZWlnaHQiKXx8MCx3PXQuZ2V0KCJiYXJNaW5BbmdsZSIpfHwwLFM9di5nZXRFeHRlbnQoKVswXSxNPXYubW9kZWwuZ2V0KCJtYXgiKSxJPXYubW9kZWwuZ2V0KCJtaW4iKSxUPVt0LmNvb3JkRGltVG9EYXRhRGltKCJyYWRpdXMiKVswXSx0LmNvb3JkRGltVG9EYXRhRGltKCJhbmdsZSIpWzBdXSxBPWUubWFwQXJyYXkoVCxmdW5jdGlvbih0LGUpe3JldHVybiBpLmRhdGFUb1BvaW50KFt0LGVdKX0sITApO2hbZl09aFtmXXx8W10sY1tmXT1jW2ZdfHxbXSxlLmVhY2godC5jb29yZERpbVRvRGF0YURpbSh2LmRpbSlbMF0sZnVuY3Rpb24odCxuKXtpZighaXNOYU4odCkpe2hbZl1bbl18fChoW2ZdW25dPXtwOlMsbjpTfSxjW2ZdW25dPXtwOlMsbjpTfSk7dmFyIGEsbyxzLGwsdT10Pj0wPyJwIjoibiIsZD1pLnBvaW50VG9Db29yZChBW25dKSxwPWNbZl1bbl1bdV07aWYoInJhZGl1cyI9PT12LmRpbSlhPXAsbz1kWzBdLHM9KC1kWzFdK2cpKk1hdGguUEkvMTgwLGw9cyttKk1hdGguUEkvMTgwLE1hdGguYWJzKG8pPGImJihvPWErKG88MD8tMToxKSpiKSxjW2ZdW25dW3VdPW87ZWxzZXthPWRbMF0rZyxvPWErbSxudWxsIT1NJiYodD1NYXRoLm1pbih0LE0pKSxudWxsIT1JJiYodD1NYXRoLm1heCh0LEkpKTt2YXIgeT1yLmRhdGFUb0FuZ2xlKHQpO01hdGguYWJzKHktcCk8dyYmKHk9cC0odDwwPy0xOjEpKncpLHM9LXAqTWF0aC5QSS8xODAsbD0teSpNYXRoLlBJLzE4MDt2YXIgVD1yLmdldEV4dGVudCgpLEM9eTtDPT09VFswXSYmdD4wP0M9VFsxXTpDPT09VFsxXSYmdDwwJiYoQz1UWzBdKSxjW2ZdW25dW3VdPUN9ZS5zZXRJdGVtTGF5b3V0KG4se2N4OngsY3k6XyxyMDphLHI6byxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6bH0pfX0sITApfX0sdGhpcyl9ZnVuY3Rpb24gcih0LGUpe3ZhciBpPXt9O3MuZWFjaCh0LGZ1bmN0aW9uKHQsZSl7dmFyIG89dC5nZXREYXRhKCkscj10LmNvb3JkaW5hdGVTeXN0ZW0scz1yLmdldEJhc2VBeGlzKCksdT1zLmdldEV4dGVudCgpLGg9ImNhdGVnb3J5Ij09PXMudHlwZT9zLmdldEJhbmRXaWR0aCgpOk1hdGguYWJzKHVbMV0tdVswXSkvby5jb3VudCgpLGM9aVthKHMpXXx8e2JhbmRXaWR0aDpoLHJlbWFpbmVkV2lkdGg6aCxhdXRvV2lkdGhDb3VudDowLGNhdGVnb3J5R2FwOiIyMCUiLGdhcDoiMzAlIixzdGFja3M6e319LGQ9Yy5zdGFja3M7aVthKHMpXT1jO3ZhciBmPW4odCk7ZFtmXXx8Yy5hdXRvV2lkdGhDb3VudCsrLGRbZl09ZFtmXXx8e3dpZHRoOjAsbWF4V2lkdGg6MH07dmFyIHA9bCh0LmdldCgiYmFyV2lkdGgiKSxoKSxnPWwodC5nZXQoImJhck1heFdpZHRoIiksaCksbT10LmdldCgiYmFyR2FwIiksdj10LmdldCgiYmFyQ2F0ZWdvcnlHYXAiKTtwJiYhZFtmXS53aWR0aCYmKHA9TWF0aC5taW4oYy5yZW1haW5lZFdpZHRoLHApLGRbZl0ud2lkdGg9cCxjLnJlbWFpbmVkV2lkdGgtPXApLGcmJihkW2ZdLm1heFdpZHRoPWcpLG51bGwhPW0mJihjLmdhcD1tKSxudWxsIT12JiYoYy5jYXRlZ29yeUdhcD12KX0pO3ZhciBvPXt9O3JldHVybiBzLmVhY2goaSxmdW5jdGlvbih0LGUpe29bZV09e307dmFyIGk9dC5zdGFja3Msbj10LmJhbmRXaWR0aCxhPWwodC5jYXRlZ29yeUdhcCxuKSxyPWwodC5nYXAsMSksdT10LnJlbWFpbmVkV2lkdGgsaD10LmF1dG9XaWR0aENvdW50LGM9KHUtYSkvKGgrKGgtMSkqcik7Yz1NYXRoLm1heChjLDApLHMuZWFjaChpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5tYXhXaWR0aDtpJiZpPGMmJihpPU1hdGgubWluKGksdSksdC53aWR0aCYmKGk9TWF0aC5taW4oaSx0LndpZHRoKSksdS09aSx0LndpZHRoPWksaC0tKX0pLGM9KHUtYSkvKGgrKGgtMSkqciksYz1NYXRoLm1heChjLDApO3ZhciBkLGY9MDtzLmVhY2goaSxmdW5jdGlvbih0LGUpe3Qud2lkdGh8fCh0LndpZHRoPWMpLGQ9dCxmKz10LndpZHRoKigxK3IpfSksZCYmKGYtPWQud2lkdGgqcik7dmFyIHA9LWYvMjtzLmVhY2goaSxmdW5jdGlvbih0LGkpe29bZV1baV09b1tlXVtpXXx8e29mZnNldDpwLHdpZHRoOnQud2lkdGh9LHArPXQud2lkdGgqKDErcil9KX0pLG99dmFyIHM9aSgxKSxsPWkoNCkucGFyc2VQZXJjZW50O3QuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbigpe3ZhciB0LGU9W10saT17fTtyZXR1cm57YWRkOmZ1bmN0aW9uKHQsbixvLHIscyl7cmV0dXJuIGEuaXNTdHJpbmcocikmJihzPXIscj0wKSwhaVt0LmlkXSYmKGlbdC5pZF09MSxlLnB1c2goe2VsOnQsdGFyZ2V0Om4sdGltZTpvLGRlbGF5OnIsZWFzaW5nOnN9KSwhMCl9LGRvbmU6ZnVuY3Rpb24oZSl7cmV0dXJuIHQ9ZSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXthLS0sYXx8KGUubGVuZ3RoPTAsaT17fSx0JiZ0KCkpfWZvcih2YXIgYT1lLmxlbmd0aCxvPTAscj1lLmxlbmd0aDtvPHI7bysrKXt2YXIgcz1lW29dO3MuZWwuYW5pbWF0ZVRvKHMudGFyZ2V0LHMudGltZSxzLmRlbGF5LHMuZWFzaW5nLG4pfXJldHVybiB0aGlzfX19dmFyIGE9aSgxKTt0LmV4cG9ydHM9e2NyZWF0ZVdyYXA6bn19XSl9KTs="}},"time_used":866,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":567,"receive":299,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/trlogo.jpg","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.515Z","timestamp":1785147795515,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/trlogo.jpg HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/jpeg\r\nlast-modified: Mon, 17 Feb 2025 22:37:27 GMT\r\naccept-ranges: bytes\r\ncontent-length: 86665\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":86665,"size_decoded":87141,"mime_type":"image/jpeg","magic":"JPEG image data, JFIF standard 1.01, aspect ratio, density 216x216, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=5, orientation=upper-left, xresolution=74, yresolution=82, resolutionunit=2], baseline, precision 8, 1079x227, components 3","md5":"f7e79e66955e31c5784d94178578f834","sha1":"56485cc918b628da9f924618b36dcb7893c14e8a","sha256":"67278c5924aa66538d83b3ada7210b9210dfc27cb3e5062514dad8e4724d19aa","sha512":"1449d627b19cf160b74ab42b2ceb4e2efb51dc8ce54bfad7d6eac4a8ac5d286913506e48b66d6fbad6d66acb03a42f9f5adc9932313dfe8de6374e4a34323fdc","ssdeep":"1536:geqkJTwTQXXJ7PWTmB1OKuxFQRovpckbn+M0T7m1ZGEQp4WkMMMMBCYn5:guJMcJcmB11yxh1jKmfGoSYn5","tlshash":"a883e03af3e3e750478f235c98bd7e3b479145e840c9695784a35e06e249fb2222397c","first_seen":"2026-07-27T07:51:04.752101Z","last_seen":"2026-07-27T10:24:01.499379Z","times_seen":3,"resource_available":false,"data":"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AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/9D+Gev6gPYCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA9x/Zw8Fy+OfjH4M07Lx2Wk6lH4o1a4Rmj8jTvDjpqbbpVIaJbu7htNOEqFWje8Rg6Eb05cZUVLD1H1knCPrNW/BXe0tthSdk3/X6/wBdty7+0n8cPFnx4+KXiDxV4j8R6jr2m2l9c6X4US8n3wWWgWXlWNk9tAipDFNqVtY217fyhWmubl9880zIjssFhaeFoQhCCg2lKdusnq77bNtLTTpa7BKyS+/S2vXq/wA/uueA11jCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP//R/hnr+oD2AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAPsT4TH/AIVj+z38VPirJm31zxvLF8MfBsh2rKIrhWk1q8tW6/6trqZCCWW58O42hcPXnYj9/i6FDeNNe2qb20+FPo+i3j8dr6kvWSXb3v8ALt13d3/h6nx3XolBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB//9L+Gev6gPYCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgCxa2txfXVtZWkL3F1eXENrbQRjMk9xcSLFDDGO7ySOqKO7MBSbSTbdkk232S3fX8vvA+tP2pLq38JWX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AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA//0f4Z6/qA9g7/AMK/DfxP4ph/tK30+e18PQndfa/PHtsLSBGZJJNx2mQ7kdE24iMqsskyBXeLy8bm+DwUvYyqxnipaU8NGX7ycrXS+GSjo7u/vW2TukfGcRcd8P8AD1X6hWxtHEZ3VSjg8moz5sZia04qVOnypP2d4yjOV+ap7OScKc5ShCd/xL4q0+wsG8I+C91vo0ZK6nqoOLzXZ8bJWeYYb7K2MHAUTpiONIbRRHLnhMFVq1Vjsw96u9aNF/Bho3uko9Zr191u75qnvR48h4cxuMxseJuKuWvmsknl+XW/2XJ6PxU4xpNyj9Zjvq5eym3UnOriW50vMa9g+/CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/9L+TrxT8O/22fBtjpmq658P/H39j6147ufhjomtaR4L0rxHo2tfEG107w5qknhDSNW8O6Rqmn6nrsln4s0I2dhZTzy6hc3VxY2P2m+03VLey/o2FXLKjcY1aSlGkq8oyqyhKNJuaVSSnK6jenK7b91JOWko83r80X1W1+2mqv6XT6etzQ0nxr+2VqXhLXfBmi/Db4l6kmh+IIfB3iO60z4U6teXei+JL7UdN0q28La1Da+GJE03xHdajq2j6Pb6RerBezXep6baJp7397bPL5c8lyV5lTzOdakqrj7WlCWIiotRjJ+1hep70ElObklpaT5uSMon51W8M+Hq/GtHjiq608yo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"}},"time_used":514,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":150,"receive":364,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/5.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.524Z","timestamp":1785147795524,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/5.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1748\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1748,"size_decoded":2222,"mime_type":"image/png","magic":"PNG image data, 51 x 51, 8-bit/color RGBA, non-interlaced","md5":"c9604a25be907ee4905628106d40adf1","sha1":"5463c4ebd02f8c2f06128f06ba1448e21c5f0f0a","sha256":"49d20f9eb4c076c92b294771918d2a857080af80e81b4c190cfdaf00decd3de6","sha512":"5862827831bbf9f7be4c6e80871b93ddb687569cd1d120a9e9a541964022ca33f9fcf2f375400c7ee8097a8aee6280085f13093a34db1cc7687906680dd07cf9","ssdeep":"","tlshash":"cc31085494357cbd6bf40aea62bc0e34967a32ea68d3ac048fc941f5c38970454038fe","first_seen":"2025-05-31T01:51:37.46061Z","last_seen":"2026-08-11T00:25:55.262876Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":520,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":515,"receive":5,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/3.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.547Z","timestamp":1785147795547,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/3.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 17107\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":17107,"size_decoded":17582,"mime_type":"image/png","magic":"PNG image data, 132 x 40, 8-bit/color RGBA, non-interlaced","md5":"027e0e7d4e4391e2d088b7f85cd282a0","sha1":"85c77c90053648543a42198a92ee6450c9fa0269","sha256":"7e763040b8e0d6e66db1fc75c1fcfd3df8aa7c7b43b793ef991a064ec0c2e4c6","sha512":"eecb7c65dc568a8e338e25e429d1ba877526e45ee4f65f666709a1213248213636ee0fef8429d2d1a1878b456668a441ef95ad09ec4b1aa5492eb69e08d2e1ae","ssdeep":"96:eSmkEWRRxNXMexL7sc5hFHxCV1SuKYHtSuweehRdW3ef7:eSmktDSexLPHkfSuKaEtLg3ef7","tlshash":"ed722b663df2b8e2a197b0330dd1591a8d330e47e5c16c55b68c6d6bbf007a51c1f8da","first_seen":"2025-05-31T01:51:37.414494Z","last_seen":"2026-08-11T00:25:55.26134Z","times_seen":24,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAIQAAAAoCAYAAAA/mlIyAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4JWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNTo0NiswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjU6NDYrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6YjdjMjYzN2YtMDE3MS04MjQxLTk4NjQtMTMyYmQxZWYzNGI4PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmI3YzI2MzdmLTAxNzEtODI0MS05ODY0LTEzMmJkMWVmMzRiODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmI3YzI2MzdmLTAxNzEtODI0MS05ODY0LTEzMmJkMWVmMzRiODwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpiN2MyNjM3Zi0wMTcxLTgyNDEtOTg2NC0xMzJiZDFlZjM0Yjg8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTMyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg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"}},"time_used":701,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":398,"receive":303,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/banner/loader.gif","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.513Z","timestamp":1785147795513,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/banner/loader.gif HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/gif\r\nlast-modified: Sun, 30 Jun 2024 21:09:24 GMT\r\naccept-ranges: bytes\r\ncontent-length: 41744\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nalt-svc: h3=\":443\"; ma=2592000, h3-29=\":443\"; ma=2592000, h3-Q050=\":443\"; ma=2592000, h3-Q046=\":443\"; ma=2592000, h3-Q043=\":443\"; ma=2592000, quic=\":443\"; ma=2592000; v=\"43,46\"\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":41744,"size_decoded":42397,"mime_type":"image/gif","magic":"GIF image data, version 89a, 290 x 219","md5":"e2ca3a95a3651ef7192f435bc488bd01","sha1":"1db1f676a450e7d168f06975b66bcd1bc308b4a2","sha256":"670ed926e4ae0b33f2c0b7dac8be6274b9732f6ee0236766ec31c20e4a9b50ed","sha512":"bef09cbc90681ce3f533260024d803bed0f8f36512383203ee4e43532b74733e99ddc3dd20d280334ca32f9596f118ebd1390105b80faf4b751f0499eab5ca71","ssdeep":"768:dVV3KCcZnF9IuTbDEofdzVyVUL32PrwzTYbQjQ6bEPYY+5+tqpYmdzWv:PV3KCcZnF91PDFfdzYE2PrwzGQjQ6bE7","tlshash":"4813e05ed45a8cbc3ba0446e30778b78d6fc9863a1e0f3a35fe1598b74905892da87c1","first_seen":"2025-05-31T01:51:37.478753Z","last_seen":"2026-08-11T00:25:55.175356Z","times_seen":22,"resource_available":false,"data":"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"}},"time_used":319,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":146,"receive":173,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/12.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.516Z","timestamp":1785147795516,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/12.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:24 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1189\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1189,"size_decoded":1663,"mime_type":"image/png","magic":"PNG image data, 23 x 23, 8-bit/color RGBA, non-interlaced","md5":"9bdc953b698998a0135eebb28e803941","sha1":"b1bc96ef39d105ee0c819ceda317dfb709a18906","sha256":"7b696641fbfeb081530d97d99a0618eafde20da6f7e03053748273b7ee1fea5a","sha512":"b773d6756cb7e4f850fad8b9b6a7c884943fa662ebddbb56a5c2937a50ce19364685c041e01145fa1a51f8b204ac369386b5cc4feed301b48cc3af1809625429","ssdeep":"","tlshash":"57210ad1eca92c564cc184b1f0a4ca28092f21fe21c407bb5d78fdb9590d85c3f08d1c","first_seen":"2025-05-31T01:51:37.448277Z","last_seen":"2026-08-11T00:25:55.242696Z","times_seen":23,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAEbElEQVRIiaWVa0ybVRjHHyNDMMM4bpJJ28AcY2PIoESW8EGZsAokMucXhegHdVtm4qaOch9D2EA6LhsbbSeLM2OOOeII6mY0Ln4xFLm15VagDChtodyhbIBA+Hvet4CAQjY5yT/vyXmf/+/Jec97nodoRxot6akdp9lzSen2JEyNEoXkyi2Gwar24DdMaief0Xo7oWmkQF6lKG+Qk1t8FIu1p1W+FVoHfpiploQpEIXIwOBgcDA4GBwMDgYHg4OPs8X/B9w7zSYb3IEtKpjA6/HgS+J8DmvgqUtwR7ZQsSL4SeFY9DsuwzPP36Wjn5URuUkV5JWGTcJBnsnKZ3wzyCk4l0hntlJ1gyEm9vgN2IlSQO5S8EleekK4ZzLIIwm+b16F9P0LMSeflxCNns52wMS4FmzUaI1499h12HNJ3KS8QbR/A7g7gwtYrEcifCQKnM+/h7ZzF9G9N1Q7+EmCA/3h6h/ZsScUJtllYOoRlwN1TSbEHmVJtifCxS8L/YaBVfDRQjmKbtaCnv0UOyVyyPLuof1sEXrEr6E1KAyD18qwsDAfTYdiS+Sq7BI07jsAtUgM49l8wNLPJ1HVduFEyveLcMkyfDCvGOX3dUg9dR1tGXnoCXgVLQFh6L96A/PT03i4AJTerlFScVmD6k61CVMMNv7L77Aov8FYVQ1WDhaLlqBF+NMC9MqK+fV5XQuGS0ox/NOvfMzS0PdPQHGrvprGCorNg7lFMJ67AHO+EuaCKzB9eQm9mQXo/aIAxqxCGNJl0Hrth3rbbjRs9UFrZByM2RdhyrkEc+EV3sf5uXhOZjYfyb9sIrbNcW6rG2qLEBrnPdC47oXGzR/qrTvZumBjj51wlNTP7TIzYX358E+Ni58NzontgPtEG/t2maglMFzVJo5AU8DraHz5AC9u3iw+iGZ2iE2BEWj0D4PmhQCWgIGd/dgnCkHTvvB/4tm8WSzhPZy3NTCc/TXh1TRgsMh1mgd4NDSKOesk5mdnMTczg4f6LkyqG4HhQcwOjaA5INx2oFtE6GZngL+mgZkp5rFiytyHiQYtJtv1/N9isYyit8OkpLfjvor8+lY15hdP2trQBP07R9AVGgFjTiHu/1yH8bFJ6IIOLv+K5txLaDGMQdc5YDNNT8GQL4cmOAz6t95D/bd3Ib/TGE3V+iEH9lprVdWh4/CH0HsFwfjRSVQWVUASdw2e4hyYuyyrbyi7RIWlf8LJMxHSjEo86Bnic8zpO9F5LB5ajwBtX1KmA1mz8qg37vghvRe7QB+cQKXiR0QeKQN5nwE5x0PwSu7613/b5yDXeLjsPoOEjB/Q3TduS1KvjhlKyyK6SQK6TV70XaJcGfVxuQ3KagUrw49fuESpfBI333RkF/2mbDNZqWN4ltVz13ib3KWOtD2pgrw3UXJFqRXknuBILyYTL3I9ReTC5CElVma5TqL8n3Al34mErPl4Jtu0Br75HsrBBSk2rQMnvqsLU1j3l3HdX7Wm+6sYXMHg0f/q/ivgfwMvLWaGVbr2WAAAAABJRU5ErkJggg=="}},"time_used":511,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":511,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/features/2.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.527Z","timestamp":1785147795527,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/features/2.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 27292\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":27292,"size_decoded":27767,"mime_type":"image/png","magic":"PNG image data, 548 x 310, 8-bit/color RGBA, non-interlaced","md5":"837b29f941194be4acf9ab8fbbd41d1a","sha1":"febc2beea42d74e565cbd082727ed44b2fdd9055","sha256":"dadccfa089010bf9b14e67a360699a3bdd219aee96b8ecbe1d37f5865726f4e0","sha512":"8300d6709848d58c9f644748809e88113ef89f71ffb29758f700a8bd5cdef71099b44a09a189bed2ac30369792f7af62b18b206f434baa3808b87587225b3ebf","ssdeep":"384:zM9K0kBi7ALnY4pIrXVEmfQKcfptCYUpyfMYVgUDWkf+Q0RE1xgVsQiowa:zoMtLnYfXVEUwtU4MYSnk2xiICQHwa","tlshash":"69c2b0c3fc26b25d84219a968274533fd99841dcd2accd6fd317badfa5d8332a62c508","first_seen":"2025-05-31T01:51:37.425216Z","last_seen":"2026-08-11T00:25:55.169606Z","times_seen":25,"resource_available":false,"data":"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"}},"time_used":587,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":558,"receive":29,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/8.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.531Z","timestamp":1785147795531,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/8.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 6288\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":6288,"size_decoded":6762,"mime_type":"image/png","magic":"PNG image data, 85 x 70, 8-bit/color RGBA, non-interlaced","md5":"0f9c669ee5d857500dff34af769028bd","sha1":"c07dd20c5c6456a439229620684200b794068407","sha256":"1c7ff7a99252f87357231a7c78d9e1d9e63d56a033ac9ba607857c910e9691f7","sha512":"9b423ff9e5ba6ed33c0927f84878c02ce244fb370c23c36320fe4d2d14f1d82616e89e150c7ad04f62c651a4e01c266fbe8e40901b2920acb0cc296cc464a71e","ssdeep":"96:z9dTj5OCCsilMRqbRjgYOP0SAbXLfHSASg7UkRauNHTxH6Fs8jBHr/bf:DQzvo0SUDBSg7b4q6Fs8Frjf","tlshash":"38d18ef2caafa0490497ff7c3c828600169216e7d2513bb5f1987fde560e3a125682c3","first_seen":"2025-05-31T01:51:37.410466Z","last_seen":"2026-08-11T00:25:55.16373Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":614,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":607,"receive":7,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/9.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.532Z","timestamp":1785147795532,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/9.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 6611\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":6611,"size_decoded":7085,"mime_type":"image/png","magic":"PNG image data, 94 x 81, 8-bit/color RGBA, non-interlaced","md5":"87832bdfb5ee50ef70801558b2adcc96","sha1":"791d66c74eadd84a19f6f30071aeb835e5ab4930","sha256":"c23632701330eac00509e2c2200a517fdf0bfff46bc05878720338c0024437d6","sha512":"a561ab294ee03b568bb0699c669ea9051f8b96ed508c1df11eaddfdf70c6ca76c0652d85a70f9af598ef2c301a5c27bcd284caa46f44bac8b39e20d11e64d24c","ssdeep":"192:g90ssE7+NmQbAmV2S0nPbqV7Eao0b8WIfK6bQj8hCnb:g90ss3NbAy2AQaymVb","tlshash":"45d1bf8f9cf415aae9d53fb628ee18a8b61316cf52171809c1f00ac859e661bcd236c1","first_seen":"2025-05-31T01:51:37.403076Z","last_seen":"2026-08-11T00:25:55.278613Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":616,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":611,"receive":5,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/11.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.534Z","timestamp":1785147795534,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/11.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 7705\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":7705,"size_decoded":8179,"mime_type":"image/png","magic":"PNG image data, 102 x 85, 8-bit/color RGBA, non-interlaced","md5":"7c1042a2409267ab7dae69ca8e5ebff8","sha1":"014c71fca7c3263bd896ca412cad75f98d8f0163","sha256":"df29751b8e3e11d1f60bcb915c9b560314e86d70fb78e5497ab4a99202fdf8ff","sha512":"c6ac85cc438aca76e81a7fd1eb29809242c99cc29558a5dfc75d5c0e3811815764db770aea43725716fd6a9e39fd77c2b32a2149010a4200e1f5764119e6e3b9","ssdeep":"192:yxC+HcAuB89JAQOcjZHNnea9giHe+XgWzums:yoIcjwCQ1H1ea97e+Qms","tlshash":"38f19efa26991f7ec77912d428ca4c906136735c603fe715903a2c203bc5ab26e4ec1b","first_seen":"2025-05-31T01:51:37.504605Z","last_seen":"2026-08-11T00:25:55.251038Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":620,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":611,"receive":9,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/8.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.543Z","timestamp":1785147795543,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/8.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1110\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1110,"size_decoded":1584,"mime_type":"image/png","magic":"PNG image data, 50 x 47, 8-bit colormap, non-interlaced","md5":"d824d293c5d9efc86f84946be0977bd7","sha1":"65fea76b1aa5ab0b006f08faba10fbdbcedc9be4","sha256":"3700e09cb5854ab7597078fcd965922997ad489353147a4d73c567e64e521e88","sha512":"0b2a74681723c4698c8a8530f9c7538ce57dc1ce038879a35587d87fae4f4bb9cf06fb9056502e3ed3450a6c652b5369017aa6676b96b4acde906e63aa8fcd85","ssdeep":"","tlshash":"a0119978e4b2f43cd9d3c14dd399610856778da020d84f71e050fca35571f1164138ce","first_seen":"2025-05-31T01:51:37.51444Z","last_seen":"2026-08-11T00:25:55.271926Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAADIAAAAvCAMAAACWqWnGAAABj1BMVEX////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ujRlpAAAAhHRSTlMAAQQGCAoMDQ4SGBkhIiMlJicoKissLS8yMzU2RkdMTU5PUVNUVVZYWVpbY2RlZmhpam5xcnN0dnh5en6ChIWIjY6RkpOUmZqbnJ+io6mtr7W2uLm6u7y/wMHCw8TFx8nKy8zO0NLV1tja29zd3t/g4uPk5+jp6u7v8fLz9PX29/n8/f50vFPfAAAB8klEQVRIibXV+UMSQRQH8MdqpAaVqWglGRR5pYBEB1hropFlF0RqqIiKdlCJGsolgvOH517szjJTjx/6/jT7Zj+wb2d3FoAVwb9aKq35BeYkM51JUkgkCiTZiRWWOHluBbDOkI8WJLlNosogSoaQZLF+CZzZrBO66otIkv4JsEfIHsCPNJJkMgAHhBwqIzS5UyzebZGAIACPTOSOzKk1TszUmiZzE1AizdEJY7IMjOLfCZHIwiSdfZ3sm6YWVDLKat80UjPKI3lRTR5LEvp1xzHEfs3Sbm/E/MY0EVv48RIhOzeAGzPpLShXc9yFJq/Jhw3ZzKFJ8un0yK5ENtHkyQz5LXp9973v8L2cKr3ke9XC1As1Dyxs4jnTVqN+Sy706+tznU3C+hkhuXDhk/bEL1vZxHGqiWo3thfHL0V87UG3D2MKcWvH46IxXhZpeymJSJt6aGhfuwc06X70+cQV+P7FP1xZenhFqlxcp976VIeJhKTfOXtzb/itPAggetmmL4LzzFDEtDNsybej0fqzAQZZoUnsvNRnOP7GIK9oMn9e6tD/uRZhEDdNnIhehF2jSHE+X/S63KzqotLPFubVd5U1URzkiKYHpi+miPdXeYKxj132i6LPxgX83fL/kFkPOrMqaTFw0qqoQrD877OMKQf/AAEtztx8wbilAAAAAElFTkSuQmCC"}},"time_used":345,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":345,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"fonts.gstatic.com/s/lato/v25/S6uyw4BMUTPHjx4wXg.woff2","fqdn":"fonts.gstatic.com","domain":"gstatic.com","tld":"com"},"ip":{"addr":"142.250.178.67","port":443,"asn":15169,"as":"GOOGLE","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"font","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.785Z","timestamp":1785147795785,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_AES_128_GCM_SHA256","key_group_name":"mlkem768x25519","signature_name":"ECDSA-P256-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.gstatic.com","organization":""},"issuer":{"commonName":"WE2","organization":"Google Trust Services"},"validity":{"start":"Mon, 29 Jun 2026 08:39:25 GMT","end":"Mon, 21 Sep 2026 08:39:24 GMT"},"fingerprint":{"sha1":"4E:F2:73:C6:27:16:58:35:FE:55:D5:30:6B:E8:6D:2B:DA:B0:E8:7B","sha256":"82:EF:6A:61:96:A5:23:D6:2C:2C:9D:77:67:04:D8:7B:3B:6A:50:DA:3C:6C:6A:5F:4E:2D:55:F3:FC:DA:0B:EE"}}},"request":{"raw":"GET /s/lato/v25/S6uyw4BMUTPHjx4wXg.woff2 HTTP/1.1\r\nHost: fonts.gstatic.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: identity\r\nOrigin: https://cyptokion.vip\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nReferer: https://fonts.googleapis.com/\r\nSec-Fetch-Dest: font\r\nSec-Fetch-Mode: cors\r\nSec-Fetch-Site: cross-site\r\nPriority: u=5\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\naccept-ranges: bytes\r\naccess-control-allow-origin: *\r\ncontent-security-policy-report-only: require-trusted-types-for 'script'; report-uri https://csp.withgoogle.com/csp/apps-themes\r\ncross-origin-resource-policy: cross-origin\r\ncross-origin-opener-policy: same-origin; report-to=\"apps-themes\"\r\nreport-to: {\"group\":\"apps-themes\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://csp.withgoogle.com/csp/report-to/apps-themes\"}]}\r\ntiming-allow-origin: *\r\ncontent-length: 23580\r\nx-content-type-options: nosniff\r\nserver: sffe\r\nx-xss-protection: 0\r\ndate: Thu, 23 Jul 2026 02:02:02 GMT\r\nexpires: Fri, 23 Jul 2027 02:02:02 GMT\r\ncache-control: public, max-age=31536000\r\nage: 375673\r\nlast-modified: Mon, 15 Sep 2025 17:09:41 GMT\r\ncontent-type: font/woff2\r\nalt-svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":null,"data":{"size":23580,"size_decoded":24393,"mime_type":"font/woff2","magic":"Web Open Font Format (Version 2), TrueType, length 23580, version 1.0","md5":"e1b3b5908c9cf23dfb2b9c52b9a023ab","sha1":"fcd4136085f2a03481d9958cc6793a5ed98e714c","sha256":"918b7dc3e2e2d015c16ce08b57bcb64d2253bafc1707658f361e72865498e537","sha512":"b2da7ef768385707afed62ca1f178efc6aa14519762e3f270129b3afee4d3782cb991e6fa66b3b08a2f81ff7caba0b4c34c726d952198b2ac4a784b36eb2a828","ssdeep":"384:dRkIAJ8pVwWTW5VVjdVn8+2yvAMdriCEOY0kfW9GkAPqpPHi2vUuUSzB8:dKIAJ8pVHTZ+riY9oCpPHiodUeK","tlshash":"91b2e1ce5d546e3a8028213785c17b488273572e9edf42c6dd83a6263a7092cfd3d96e","first_seen":"2023-04-05T13:28:45Z","last_seen":"2026-08-14T16:42:01.724705Z","times_seen":256693,"resource_available":false,"data":"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"}},"time_used":56,"timings":{"blocked":0,"dns":2,"connect":30,"send":0,"wait":16,"receive":8,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/responsive.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.284Z","timestamp":1785147795284,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/responsive.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:24 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 1014\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":3985,"size_decoded":1551,"mime_type":"text/css","magic":"ASCII text","md5":"564fc7150927316145f0c5d76d3e14e3","sha1":"c7f3d273b95ac000da97edccadf58ea945f5e672","sha256":"6cf3d15aafea61ab4824304a9322446efbcf988677555112dcb16e13fe0b74d7","sha512":"a0c4133d2afd5c9ece3afeddd57052cd13ccd1dd834c51312b03e275eb2484880cb82e6e3f1a7781a359b89eeaceacbc3fed9e5e127f5b41dda935bec7151fd9","ssdeep":"","tlshash":"a1811292ff51798c157721639c531f5bb2b8d40353072af2dce7e1168ec911815a3ee9","first_seen":"2025-05-31T01:51:37.502235Z","last_seen":"2026-08-11T00:25:55.221983Z","times_seen":25,"resource_available":false,"data":"LyogRXh0cmEgTGFyZ2UgRGV2aWNlcywgV2lkZSBTY3JlZW5zICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aCA6IDE2MDBweCkgewoKfQovKiBMYXJnZSBEZXZpY2VzLCBXaWRlIFNjcmVlbnMgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMTIwMHB4KSB7Cgp9CgovKiBNZWRpdW0gRGV2aWNlcywgRGVza3RvcHMgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogOTkycHgpIHsKCS50b2tlbnMtYXJlYSAudG9rZW5ze21hcmdpbjogMDt9CgkudG9rZW5zLWFyZWEgLnRva2VucyAudG9rZW4tYm9keXtwYWRkaW5nOiA1MHB4IDI1cHg7fQoJZm9vdGVyIC5mb290ZXItYm90dG9te2hlaWdodDogYXV0bztsaW5lLWhlaWdodDogMjZweDtwYWRkaW5nOiA1MHB4IDA7IHRleHQtYWxpZ246IGNlbnRlcjt9Cglmb290ZXIgLmZvb3Rlci1ib3R0b20gLmZvby1saW5re3RleHQtYWxpZ246IGNlbnRlcjttYXJnaW4tdG9wOiAxNXB4O30KCS5sb2dvLWFyZWF7CgkJdGV4dC1hbGlnbjpjZW50ZXI7Cgl9CgloZWFkZXIgLm1lbnUtYXJlYXsKCQlmbG9hdDpub25lOwoJCXdpZHRoOjEwMCU7CgkJdGV4dC1hbGlnbjpjZW50ZXI7Cgl9Cn0KCi8qIFNtYWxsIERldmljZXMsIFRhYmxldHMgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogNzY4cHgpIHsKCS5tb2JpbGUtbWVudS1hcmVhe2Rpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7fQoJLm15LXZpZGVvLWRpbWVuc2lvbnN7d2lkdGg6IDQ4MHB4O2hlaWdodDogMjQ5cHg7fQoJLnZpZGVvLWFyZWEgLnZpZGVvcy1oZWRpbmcgLnZpZGVvcy1ib3ggLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9ue3RvcDogMjQlO30KCS50b2tlbnMtYXJlYSAudG9rZW5ze2Rpc3BsYXk6IGJsb2NrO21hcmdpbjogMCAwIDUwcHg7fQoJLnRva2Vucy1hcmVhIC50b2tlbnMgLnRva2VuLWJvZHl7ZGlzcGxheTogYmxvY2s7fQoJLmVhc3lwaWVjaGFydHtkaXNwbGF5OiBibG9jazt9CgkudG9rZW5zLWFyZWEgLnRva2VuLWNvbnttYXJnaW46IDA7fQoJLmVfY2hhcnRfMyBkaXZ7bWFyZ2luOiAwIGF1dG87fQoJLnRva2VuLWRldGFpbHMgLmNhcnQtbGlzdCAubGFiZWwtY2hhdHJze3BhZGRpbmc6IDYycHggMTAwcHg7fQoJLnRva2VuLWRldGFpbHMgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2Lm93bC1wcmV2e2xlZnQ6IDA7Ym9yZGVyLXJhZGl1czogMCAxNXB4IDE1cHggMDt9CgkudG9rZW4tZGV0YWlscyAub3dsLWNvbnRyb2xzIC5vd2wtYnV0dG9ucyBkaXYub3dsLW5leHR7cmlnaHQ6IDA7Ym9yZGVyLXJhZGl1czogMTVweCAwIDAgMTVweCA7fQoJLmJsb2ctYXJlYSAub3dsLWNvbnRyb2xzIC5vd2wtYnV0dG9uc3tkaXNwbGF5OiBub25lO30KCWhlYWRlciAubW9iaWxlbWVudSAubWVhbi1jb250YWluZXIgLm1lYW4tbmF2e21hcmdpbi10b3A6IDM4cHg7fQoJLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuc2VyaWFsczpiZWZvcmUsLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuc2VyaWFscyBzcGFuLmNyZTpiZWZvcmUsLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuc2VyaWFscyBzcGFuLmNyZTphZnRlcntkaXNwbGF5OiBub25lO30KfQoKLyogRXh0cmEgU21hbGwgRGV2aWNlcywgUGhvbmVzICovIApAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGggOiA0ODBweCkgewoJLm15LXZpZGVvLWRpbWVuc2lvbnN7d2lkdGg6IDQwMHB4O2hlaWdodDogMjA3cHg7fQoJLnZpZGVvLWFyZWEgLnZpZGVvcy1oZWRpbmcgLnZpZGVvcy1ib3ggLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9ue3RvcDogMjQlO30KCS52aWRlby1hcmVhIC52aWRlb3MtaGVkaW5nIGgye2ZvbnQtc2l6ZTogMzZweDt9Cglmb290ZXIgLmZvb3Rlci10b3AgLmNvbiB1bCBsaSBhe3dpZHRoOiA2NXB4O2hlaWdodDogNjVweDtsaW5lLWhlaWdodDogNTlweDtmb250LXNpemU6IDMwcHg7fQoJZm9vdGVyIC5mb290ZXItdG9wIC5jb24gdWwgbGl7cGFkZGluZzogMCA1cHg7fQoJLm1lZGlhLWFyZWEgLm1lZGlhYnJhbmQgdWx7bWFyZ2luOiAwO30KCS5lX2NoYXJ0XzMge2hlaWdodDogMzAwcHggIWltcG9ydGFudDt9CgkudG9rZW4tZGV0YWlscyAub3dsLWNvbnRyb2xzIC5vd2wtYnV0dG9ucyBkaXZ7ZGlzcGxheTogbm9uZTt9CgkubWVkaWEtYXJlYSAubWVkaWFicmFuZCB1bCBsaXtkaXNwbGF5OiBibG9jazt0ZXh0LWFsaWduOiBjZW50ZXI7cGFkZGluZzogMTVweCAwO30KCS50ZWFtLWFyZWEgLnRlYW0tbGlzdHttYXJnaW4tYm90dG9tOjUwcHggIWltcG9ydGFudDsgaGVpZ2h0OjU1MHB4ICFpbXBvcnRhbnQ7fQoJLnRlYW0tYXJlYTIgLnRlYW0tbGlzdHtvdmVyZmxvdzogaGlkZGVuO30KCS50ZWFtMi1hcmVhIC50ZWFtLWxpc3R7bWFyZ2luLWJvdHRvbTo1MHB4ICFpbXBvcnRhbnQ7IGhlaWdodDo1NTBweCAhaW1wb3J0YW50O30KfQoKLyogQ3VzdG9tLCBpUGhvbmUgUmV0aW5hICovIApAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGggOiAzMjBweCkgewoJLm15LXZpZGVvLWRpbWVuc2lvbnN7d2lkdGg6IDMwMHB4O2hlaWdodDogMTU1cHg7fQoJLnZpZGVvLWFyZWEgLnZpZGVvcy1oZWRpbmcgLnZpZGVvcy1ib3ggLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9ue3RvcDogMjQlO30KCS52aWRlby1hcmVhIC52aWRlb3MtaGVkaW5nIC52aWRlb3MtYm94IC52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbnt3aWR0aDogNzBweDtoZWlnaHQ6IDcwcHg7fQoJLnZpZGVvLWFyZWEgLnZpZGVvcy1oZWRpbmcgLnZpZGVvcy1ib3ggLnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9uOjpiZWZvcmV7aGVpZ2h0OiA3MHB4O2xpbmUtaGVpZ2h0OiA3MHB4O3dpZHRoOiAzMHB4O2JhY2tncm91bmQtc2l6ZTogY29udGFpbjt9CgkudmlkZW8tYXJlYSAudmlkZW9zLWhlZGluZyBoMntmb250LXNpemU6IDMwcHg7fQoJLnRva2Vucy1hcmVhIC50b2tlbnMgLnRva2VuLWJvZHkgLmxlZnQtYnRue3BhZGRpbmc6IDAgMjBweDtmb250LXNpemU6IDE2cHg7fQoJLnRva2Vucy1hcmVhIC50b2tlbnMgLnRva2VuLWJvZHkgLnJpZ2h0LWJ0bntwYWRkaW5nOiAwIDIwcHg7Zm9udC1zaXplOiAxNnB4O30KCS50b2tlbi1kZXRhaWxzIC5jYXJ0LWxpc3QgLmxhYmVsLWNoYXRyc3twYWRkaW5nOiAzMHB4IDI1cHg7fQoJLnRlYW0tYXJlYSAudGVhbS1saXN0e2hlaWdodDogYXV0bztwYWRkaW5nLWJvdHRvbTogMzBweDt9CgkudGVhbTItYXJlYSAudGVhbS1saXN0e2hlaWdodDogYXV0bztwYWRkaW5nLWJvdHRvbTogMzBweDt9CgkKCn0KQG1lZGlhIChtYXgtd2lkdGg6IDExOTlweCl7CgloZWFkZXIgLm1lbnUtYXJlYSBuYXYgdWwgbGkgYXsKCQlmb250LXNpemU6MTJweDsKCX0KCS5idG4xewoJCWhlaWdodDo0MHB4OwoJCWxpbmUtaGVpZ2h0OjQwcHg7CgkJcGFkZGluZzogMCAyNXB4OwoJfQoJaGVhZGVyIC5tZW51LWFyZWF7CgkJcGFkZGluZy10b3A6NXB4OwoJfQoJaGVhZGVyIC5tZW51LWFyZWEgbmF2IHVsIGxpewoJCSAgICBwYWRkaW5nOiAwIDlweDsKCX0KCSNjbG9ja2RpdiBkaXYgPiBzcGFuLCAjY2xvY2tkaXYyIGRpdiA+IHNwYW57CgkJd2lkdGg6IDEwMHB4OwoJCWhlaWdodDogMTg5cHg7CgkJbGluZS1oZWlnaHQ6IDE4MnB4OwoJfQoJLmJ0Y190aW1lcl9zZWN0aW9uX3dyYXBwZXJ7CgkJcGFkZGluZy10b3A6MTEwcHg7Cgl9Cgkuc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IGgyewoJCWZvbnQtc2l6ZTo0MHB4OwoJfQoJCn0KQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KXsKCS5sb2dvLWFyZWF7CgkJdGV4dC1hbGlnbjpsZWZ0OwoJfQoJLmxvZ28tYXJlYXsKCQl3aWR0aDoyMzRweCAhaW1wb3J0YW50OwoJfQp9CkBtZWRpYSAobWF4LXdpZHRoOiAxMTk5cHgpIGFuZCAobWluLXdpZHRoOiA5OTFweCl7CgkucmV0ZS1saXN0ewoJCXdpZHRoOjIzJSAhaW1wb3J0YW50OwoJCW1hcmdpbi1sZWZ0OjE1cHggIWltcG9ydGFudDsKCX0KfQ=="}},"time_used":443,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":443,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/features/4.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.528Z","timestamp":1785147795528,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/features/4.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16108\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16108,"size_decoded":16583,"mime_type":"image/png","magic":"PNG image data, 453 x 241, 8-bit/color RGBA, non-interlaced","md5":"242f160315e034c3354dbd216c8e3c68","sha1":"70e7db4eb3338dc0124b369a6e95d9f33504ee05","sha256":"9cf72a41f81df59cd922da409889afd6a48b0967e6eefee2e1730b33c6bd9d74","sha512":"fd36cbbcd0c17d294fcdba7dfd8c598150cc92b331f044b72bc7a006afa19e822a3dfeb812882f283a2ee8acadb35d3fb62f7715050839c5ea1c51ff5332512f","ssdeep":"384:H6rCOy9G6AwWxQGDI63VL8kmHjzz4tersBLDAlLON+9F:zHW2hgFMjzUteWLDAQ+9F","tlshash":"d372c0a4517f5141ca5c924b80598c8c21f497bf65d78489a58c32fad61eeaf04fc8bb","first_seen":"2025-05-31T01:51:37.444493Z","last_seen":"2026-08-11T00:25:55.206107Z","times_seen":25,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAcUAAADxCAYAAAC6XayLAAAgAElEQVR4nO2dB3gU5daApUnvvasUKQshISQEEhJ676EqoDQBgWtF8CritXGv9dqu5Xrt/gpWVKSISpEivYXQS+glQDpp55/zbTbs7szuTt1vZvac53kfFSeb3dn5zsv56i2O9iNvsTklCIIgCN3gndMNhfsb0ADvB4MgCILwDW9H2FaKvL9YgiAIQj94O8VyUuT9hREEQRDBg7dzTClFI250SYIgCMIwbClIq4uQ90NBEARBiLGsIK0kQrVfTimCIAhCN3iI0nZSNFqCvB8SgiAIwnhJ2kKKestQzRdVmiAIgtCMEaI0lRjNIkM9JMj7YSEIgghl9JAkdzmaVYZ6CrAMQRAEoRt6itJ0cuQlRDUy1Et8txIEQRCy0UuYRsrRlFI0QoZKJcj74SEIgghFlErSCDmaSopqhahVhIG+qLIEQRCE7qiRpBJBchNjMISoRYZyJSjnSyxHEARBqEaLLOUIUi85cpWiHkIMJEPRDV65cmPttLSM4bm5ec8WFBQsKSws3ClwHgCygIKCgoIimJGF+Vdgt5CPfxDy8mIhP4/APC1DkHLkGFQxBlOIcqpDnzLcvedQo5ycGw8KN32z8CXk8X4KKCgoKCj8Rj7mayFvP4z5W6Ec5VSNhoiRlxDlyrDshYtXugg39mvhBufy/oYpKCgoKFRFrpDHv0tNvR7rEHezKpGj4WLUW4hKu0t9yvD48TN3Cjfxe97fJAUFBQWFfiHk9WUnTp5trUCOWrtTDZWiFiH6qg49ZLjg8dcr5uTkLgIaH6SgoKCwa2QJef6ZZ597r5IfOfqrGg0TY7C6TGVVh0eOpjQX/hbxJ+9vi4KCgoLC+BDy/RbM+37E6K9qNKQr1agqMZAQRcspUq+mdS8sLLzC+0uioKCgoAheYN6/di29n0N6WYeeYtRVioYKUbghiUDdpRQUFBShGjfSM7LuNoMYtUpRrRCLF3sKN2KscEPyeX8jFBQUFBRcIx8LJIf0ZgB6iVEXKRolxHKpqdf7CTfiBu9vgoKCgoLCFJGDXnB47qATVDHq1W2qWIiHDp1sRWOIFBQUFBTuIXghNTn5eEsdxKiqG1WPKlGxEJ9c+FblgoLCbbxvPgUFBQWF+QJ3wnn+hQ+qGChGVVLU0m3qU4hIdnbOIt43nYKCgoLCvJGTk/ucQ7wZuS8x6taNakSV6FeISUlHWwPNNKWgoKCg8B+5R46mdNBBjIZKUW63qaQQBcrn5+f/yPtOGxE3btyA7OxsgiCIoFJQUMA7/RkWgi+WozcCiFFtN6oiKepZJRYLMSXlfKzwOQt532gj4sqVK/DlVz+HJEu/Xgnfff8bQXABnz/ebYAXq1avZ38ht3EUnjx5LkZCjIZVi3pWif66TfEDVRCs/zXvO2xUoBSnTF0IwucMKTpFT4Luvf5GEFzB55B3W+BBCEgRq8Xv0B+Om2LUsxtVdynK6TbFD1J+85Y9zcDG5yCGohQjoyZyT4YE4SIyeiL3NhFsQkGKQuRt27a/hcslDmXdqLpIUfduU4EKGRlZC3jfWSMj1KTYMWoC9yRIEN7gc8m7bQSTEJEiZGZmP+nwrBb17EbVTYpyq0T8IBUKCgr+4n1jjYxQkmJEp7uhe8+53BMgQYiZy55P3m0kWISKFAsKCre7XOIwuFpUKsVAVaKo2xQ/xE8/rWuEn4v3jTUyQkWK4ZHjSYiEuRGeT3xOebeVYBAqUhSiYPWvm5s6bkpRSoxqq0W/UtSjSvToNhWoeOnS1dG876jREQpS7BAxFhJ6zuGf9AgiAPic4vPKu80YTQhJEVKvpo1DnzgCd6NqqhYNrxLxQ2RmZj/H+4YaHXaXYvsOoyG+x2zuyY4g5ILPKz63vNuOkYSSFLOycl52eEpRbbWoSYpyJtj4rRIFKt24kbuU9w01OuwsxXZhiRAbP5N7kiMIpeBzi88v7zZkFKEkxdzcPFzIX8mhrFpU3IWqRoqKqkT8EPn5+Tt531Cjw85S7Bo3nXtyIwi14PPLuw0ZRShJsaCgcJ9DLEUl1aJiKarpOvU347Ri0QfAEzFSeN9Qo8OuUoyOuZd7UiMIreBzzLstGUEoSbGwsPAM+sQhXS36m4mqqAtVTylKdp3ihxA+zDXeN9TosKMUIzrdxT2ZEYRe4PPMu03pTYhJMc3hW4pKJ9yokqLarlOXEIulKHyefN431OiwmxTDwsfQTFPCVuDzjM8177alJ6EkRQyHpxT9VYuqu1C1SFFWlShQhfeNDEbYSYo4MSEuYRb3JEYQeoPPtZ0m3oSgFKs41FWLukpRbtepaIKNg6RoSWK6TuWevAjCKGJip3JvY3pBUpSccKN2XFGxFJV2nVZ2kBQtR0fcws0EiYsgjMQue6SGoBSrOm6KUWsXql8pyplko0SKxVUifgjeNzIYYQcp4kLnhB40jkjYH7uML4a4FAPNQlUqRSZGw8cTHSRFy9C12wzuyYoggkVs/AzubU4rJEX9xxX1kmLxaRgONyk+8MDDe+b+7aElvG9kMMLqUuzU+R7uSYoggg0+97zbnhZIisVS9K4WDZOi9yQbRV2nDz74MMyd+5Dtt3jDsLIUncsv6OQLIvTA597K3aghKMVqDvVdqLIm2xgxyYakaDGo25QIZfD5590G1UJS1H1cUZUUZY8nkhTNT2TURO5JiSB4g+2Ad1tUA0lR87iiIVL0uT6RpGhuaLYpQTjBdmDFY6ZCUIrVHf6lqHRc0TApiibZ4Bt/gKRoamJip3FPRgRhFrA98G6TSglRKXpXi1om28iSotqZp6KlGCRF8xLecRz3JEQQZgPbBe+2qQSSot9xRTUzUFVLUdaifZKieaFDgwlCDLYL3m1TCSRF2ZNtFEnRkOUYDpKiaYmMmsA9+RCEWYm00BZwJEX9l2UYthzDUSTFOXMeJCmaCDwhIL7HbO6JhyDMCrYPq5ykEYJSrOEweFmGFikG3N6NpGg+omjnGoIISFSMNXa6ISnKWpZhIik+QFI0E+3CRtESDIKQAbYTbC+82yxJ0TOKpBhoWUZQpahoI3CSormIirmXe7IhCKsQLbQX3m2WpOgZKqWoaFmGYQv3SYrmol2HUey4HN6JRk86RAyHho3aQ+XKdaBMmXJQqtStBAdKlykLlSrXhgYNHdA+fCj350IvsL1gu+HddkmKN8NNitX8SFHTWkWjFu7jm61GUjQP0V0mc08yeuFoPwAqVqoJt9xyC2FCyleoBq3b9uX+nOgBthvebZekeDNkSFHzAn7DdrMhKZoHNpZokyqxQcN23JM+IY+69e7k/rxohVWLJh5bDHEpVjWzFCsWUdx1SlI0D3aZcVqjZlPuiZ5QRtWq9bk/N1qJMvGZiyRFj63e1O5qQ1I0Iswsxfju1l+X6K9CvO2O22HQyEQYP2UajJ40RWAyERSmwPjJ02DIqDHQvGVLn99P7TotuD8/WsD2w7sNkxSdQVK0UJhVinbYvSYsfJhksm3Wqi18uuwnOJqWA9eF7yBd4DoRVNKKOJGZB0tW/grtIjpJfldtHNYeY+xo0l1uSIrmlqLHzFOSojmIS5jFPaFopVy5yqIkG9u7P1wS7nu+wKG0fNh97rrANdh9/joRTPCeC/f+4PU8wNSMfzHpP3Ks6PsqXbos9+dIC9iOeLdlkqJfKWrZFJykaESYUYp2OAkjPDJRlGCb3tEMLgg2vCzc920pV2DX2auECcDv4lyBs3JsGxYh+t7ahQ3i/jxpehZNeIIGSZGkaNowoxRjYqdyTyRaadhIPJb47pIf2D3XQ4g7TqeySucC8O2GvCKQdCUbtnt9pp1nUmG78B5P3nBed1r4y8COM84/5y1BX2LMFd7nV6s3SIwtNuP+PGkB2xPvNk1SJClaJswmRecyjLncE4lWKlas4ZFY69RrAIfT8+FwRr7mBI5i2XvhOlwUvr9v/tgEb3zyFRde//hL+HjZCjiZA3AsPRe2nbp8UzKnr8J54f2tP3Ac3v7ia1i9I4kJHMXIW4C+OHDtBpwWKsbmrVp7fHfly1fl/jxpAduT2ZZnkBRJiqYNs0mxU/RE7klED3DHFPfEOnjUWNY9t0uo7rQmbxwPwwptwbOLuS9dQHr0GwDH07Ih+Wp20XtMhQu5+bBs/WaoUrUau+bWsmXho+9+hNSCAtNWizsFYWcL93XC9Fkenw93HeL9PGmlU/Qk7m2bpEhStESYTYp2mGDjlGJpj8Q64b5ZkAkoRe3J+7iQubedvMhdhu68+fk3TukL72/vhXS4Kvx7WKfOHtc0vr0ZnMkFOHAlW/M9MAqh6IVZjz5uq8k2iNkm3JAUSYqmDTNJsUPEWO7JQz8pelaKvQcNhWvC/d59Pl1z4j4hSHHriQvcRejO658sYTM43aXYNjzS45r6jZrCaSEPHkg1rxSxUpz5iKcU7VApIti+eLdxkiJJ0fRhJilG2+g0DG8pYjfivstZcCKnUHP34Z5z1+FSIcD8Z17gLkMkoW9/OHY9E5Kv3ZTdhRv58MPajVC5StUisZRh3adXCrR/fqOlOOPh+baUopn2QyUpkhRNG2aSYrfu93NPHEZJEXn2jXfYPd+Wok0KKJV9F9PYescvV62F1z78Av79UfB59cPP4f2vl7GJNscz8rwm2qSy9/fHvqPwxidfwi9b97KlKNtNPNHG7lI00w43JEXrSbGApBhc7NR16kuKWDXtOXOJLRbH5QpaKqYdp6+wJRk4AxXH8njtCoPdpNgd6r3MhC3JEP7sVK7z2jMF2j8zSVE7ZlmzSFK0mBRnz37w+VmzHpjP+0YGI8wiRTsdEeVLikjT5i1hx7FT7N7jkoWD13Ih6UoWEwuhjX2XMtjMXJKib8zShUpStJgUi958Dd43MhhhFinaqevUnxRZki1bHp76579gQ9IhOHQthy1wP54FcIxQR6bzn2cLndVrhkBKHk76uaa4MrW7FLGd8W7rJEWSoqnDDFIMCx/DPVkEU4ruNGvZEjpEdgJHeEeBCEIFbTsI/xSIjouHMfdMhVc++Bg2HDjK5IjVOHbtypWj3aWIhJlgFipJkaRo2jCDFHFhMe9EwUuKhDGUK18OJkyfAZsPHQOhaIQ9F9LYOCxJ0RznLJIUSYqmDTNIsWu3+7gnCqOlWLnlnVCybDnusgg1yleoCK/990N2KknS5cyAYgwFKcbGzyApBjlIihYK3lJsF5Zoi71OA0mxxaw50G/3fqjffyCUKFGCuyxCjScWv8TEiBWjv67UUJBid7YXaiJJMYhBUrRQ8JZiRORd/JNEEKTYcOgIGCfc7yEpl6Dbjyug7ZNPQ8PBw6B6eARUad1GoC1UaUOooSrSrj1UaNLErxhf+/BzdhLG9tOhXSki2O5IisELkqKFgrcU7bYUw5cUGw1PhCGnLkDvzTtg4METMOz8VRgqCHJg8jHovydZ4CD030uoZv8R6Lt9L8T/vAqa3TfLpxj/OpoC53J976oTKlLkvTSDpEhSNG3wlmJs/EzuCSJYUhx6+hL02rgNev251Ynw733+2gV9tu0htLAV2Q19d+yDwcfPQmJGHsT9sBzKVK4ikuLAxHFs4s3Oc2khLcU4od2RFIMXJEULBU8p2nU8UbYUCf3Z8BdjVGYBdF3yLdziNX6L47l/JB2DFKFaDGUpIjzHFUmKJEXTBk8p4pZTvBMDSdGe9Fy/BUbnADQdP0FULS586XW21d4uiS7UUJJieOR4kmKQgqRooeApRVwvxTsxkBRtilAtDj52BuJ/WgklSpXy+C7G3DuVLeyX2hIulKQYFcNvvSJJkaRo2uApxS5x07knBpKifem9ZScMOnIKqrZt5/FdRMV2g3OFwPZKDWUpYvsjKQYnSIoWCp5StNt+pyRFc9F703YYfOIs1O6W4PFdtI/sxE7v2H85M6SlyHMfVJIiSdG0wUuKOMjPOylYSYo9121mSw6wS3BA0lE2ZsYmlXhdg7Mw2TXJx4onnfCWEzcpbt4Bg46ehtpx8R7fRXh0DKSQFBm8JtuQFEmKqiI/Px/27NkD69atg3PnzhnyO3hJ0c6TbPSWYo8/NsKAA0eh3+5kiP7oc4hfvhqGnDzvIcYeazfBgP2HBY6wa+KW/cKuYa8RomIslmJsN5KiD3idrxgsKRYWFkJOTg5cu3YNLl++DBcvXoRLly5BamoqZGRksBwbjCAp6hD4Rb7++uvwySefwLJly2DevHmwfv163X8PLylGRk/knhCsIkVc2I9dgdXCwtlrla5YETq++Q4MOXGuWHh9d+4XKsl9UCumK7umZNmyEPbPVwQxniMpkhR9gu3QblJEEaIET5w4Afv27YPdu3f7BIuOQ4cOwfnz5yE3N9eQ94NBUtQhUIQ///xz8X9fuHABHnvsMfY3HT2DlxQ7d53CPSFYRYrDL6XB7fdM9Xi9kmXKsK7SfrsPFF/T4v65ouUHvTZuZTu+8BYUSdGcYDu0ixRRhpgf9+/f7yG+5ORkJsiUlBQ4e/YsnDlzBk6dOgWHDx8WSRKvw4JE7yAp6hDPPvss+9uOe/zyyy+wZs0aXX8PLyna8WQMVVIU/hurQPbnUgiJfdi5VLaRuLfwuv24km0Zh9cNv5QOjRPHiK6J/e4n4Zrj3AVFUjQnXbvxOTFDbyliVyjKzyW3o0ePsm7SvLw8vz+HIk1LS4OTJ096VI9YOeL/0ytIijrEo48+KvqzjRs3wrfffqvr7+ElRTvPPA0oxQ1/Qc+1m2DQ4VNMeENSLrL/J8mZy3C38D3dNuFej9crVb489N93mC1Qx+smCNe0uP9vntXkrbeyKnGs0LbxdQYKvw+XKbCxSBNIi6TIH14zUPWUIlaHKDKXDL2LCbmB3adYTbrkiJVkIKnKDZKiDmF3KXbvZc/t3eRIEWeJDjqaAl2XfAe33T0JGg4ZJvz/kewaESMS4faJ90Kl25t5bldWqhQ0GDgEmowdz667fdJkqNyylec1JUtC45GjodUjj0H75/4JXZd+DwMPnYQRlzNgQNIRyRmsdoKkKIe5lpYidoW6JIZC0yPS09PZOCO+5oEDB3R5nyRFHcLOUmwfPtoEyYCfFFFIPdasZ5Wcd3en0dSIjII2jy+EHr//CSNSM4Vq8xCrWnkLjKTID2yPVpQizsh3CfH69ev6JMSiwArx2LFjxWLUWjGSFHUIO0sxvON47omApxRHXMmAFrP/Zqj8AlGmSlVoOecB6LcriXXhsi5dm1WNJEV5YHu0mhRxSYVLiDieaEQUFBSw7lj8HUeOHNE0xkhS1CHsLMXIqAncEwFPKeJSiqgPPuYqRRcVGjWCzp9+CSPTbrBjrHqu38xdZiTF4ILt0UpSxJ/bu3cvkxWuPTQysEI8ePAg+104+UZtkBR1CDtL0c4bgcuRIoK7zuBYX8Wmt0H5ho3YukL368uWKQlN61WEpnUF6lRQjvBzjYV/1qhWVpYcHYueYd2pfbfttc1EHDVSxMn4s+c/GVJSxPZoJSkeP36cSQqXVQQjcIzRNStV7XINkqIOYWcpdu5i7zWKgaSI0sGEjTvO4IL7QUdSoFaXrh7Xx7atBbBpIsCvY6Hwl9GKAGTFaCgQ/pn58yhI+mQQvDcvGgbENvIrxjsffARGXs+B3pt22GICjlIpbk9JZW1i9vwnQkqK2B6tIsXMzEwmqKSkJL+70WCFh5NwcMIMLuD3By7lwEk6KD9fgQLG34tLN9QESVGHsLMUu8RO454IeEqRJW2UjvDv/fYkw7AL16B2nGfijm9fG2DvFEGMEwDW3aWctUX/XH83wLZ7AA7dJ1hgKhz8YgjcM6CZTzG2f+FfTIw4Q1aTlFyfb1cSq4pxSQiOXbqDf4Y78fia6INb17Exz7NX2L1jy0kk3hf+PG6BN1S4zv31h1+8DuOEZ7x+n/4enzEmoSd79jElZ7iBcVqQZbM7W4WUFLE9WkWKuLge5YSL8H0FVnPeC/jlcvr0acnXxPfqqhbV7HxDUtQh7CxFuy/clyVF92pGTqUoVHywagzAlolOyclh6ySADYIUV491/rxQPcLuyQDHZ8DPr/SECqVKSIoR901FYfVcp3xWKlbBuHH5UJfINm2Hzh99Du2fXcxmvbqDf9Z32x62ebm3GFGIuOlAny27oO0TiyBs8UtsXWffHfs8unfZdYecGxg4Fj3r8fptn3gKwv75MlRu0dLj8zW5oxm89N7/4NnX34GnX3mT8fwb/4HnXn0N2oR1FE9KsrkUsT1aQYquvaBRTv5mg7p2qkGBZmVlsZ/zB0oUxwtdYsSfkQrXAn/cXUxpkBR1CDtLMTZ+JvdEYCkp/iQI7Y/xTHSnPxsMSe/1k8WR/w2A7GWJAH9NAkiaBrBmHBTif68U5JpyPyR/NQxqVxIvC6l42+1sMhDKTYkMUYBYoeGSk/CXXoMGAwZBuXr1/XbZVm3rgD6CGLEidH89rPz6CJVh5RZ3Fl/bdNzdrDsU75nrOtycoLdwTyvefodhk5HsLkVsj1aQomvGKY4p+gpX9yp2myqdLepa8+hrK03c+ca1qF9pkBTdAkttnNaLa16UrHWxsxTtvpuN3lLESg82T4TpA5tBaR/VnS/qVCsLPTrWg6+eigXYcS/ArslQ+GMiA07MhKNfDJGeePPUMzDiapasblR2ikfSUbbUpKNQcVVueaei94hV3bCL1z1eE/dyxYlI3tfGfvsj24Cg+LrL6dB85hzDhBgKUuyWMMsSUnTtNuNvxikKLVD3qq/AtY7+pIuSdXWh4nINJUFSLIqdO3fCwoULmeCQRYsWsb5uOWFnKcZ3n809EVhKinunwNp/ddec3OPD68LJb4cDHJjmFCNWoKfvh88e7CS6tnyDhuy4qkDVIgoRD/LFPVgbjxqr6n1hNypbK+n2usPOXwXHk/8Qf4blvwrv69hNKQoybfXIfFW/l6ToBNujFaTo6hbFatBXYNcmXqPmqD2XFLGA0fIepIKkCM5pw3iqxddff81uJM5w+uqrr2D+/Pk+B3Pdw85STOgxh3sisJQUBYl9+mi0Lgm+StnScGzpMDbphnWlrhkHkDwdIlvWEF2Lx1O5FvZLT4QRhHj8LDvHEbtB1byfur36sKOxcCmI+2ujjPvtOgB1EnoUX9vq4Xls0o77Pey7Yz/D+/6ppVS5clC2Zq2QkiK2RytI0XUMlL8eN6Ol6BpXvHr1qqLXJikK8dlnn8HixYvZF/n000+zUy9QjPjPpUuXBvx5W0uxJ0lRkRQFgX39RBfdKp8GVctCwZ8ThAdqglAtCmI8NB02v9xDdF3DocNZJeZrDBE3JB984pwgxHY+f1e19h2g2dT7oP3zL0Kndz6AyHf+C5Fvv8+Ei4chY4WJM3C9J9rgf+N44cDkY9Dp/Q8h5vMlMPjkOed4opuk2XXC+8BxzOj/fcpeF19fMW+9y94bCr7FLM/uWNtLsac1pOiaCONvrNBoKWJBo2bTAJKiEHhAMAoMcXWf4vmI//d//wfvvvtuwJ+3sxR5JwG7SLHp+AngePp5uPOhR72YB60fexxaz1sA1SPEsymRBSPvBDh8HxQuHw3w2zj2u+6oV9Hjmltr1GDvr9/OJAkxbmNjjg0GSY9J4qYEUe9/JHy2U2yJR2JGHiSm58LIazlsCcqQUxfYpBm2i46PcUv8c/z/KF68Ry4ZS163dTerWvHEEXxtVZw8D8LdhmbTZ4aUFBErSdFfGC1F12QcPJZKSZAUwbNSfOaZZ+D5559n2wXhv2OXaqAgKVqbYEgxYfmvcJfwHeL4mxQoIxSQ95FSSLlbS0E+zkLFdYy42P/gdLh/cHPRdV2+/AYGHU4RSWj4hesQ9V/prerq9e7LxiMT0/PYOY+DDp9kP4Pjgd1Xr2Xdotgta8bNyLEyvmPKdJKiCaXo2trN3yQXo6XomuyDeVNJkBTBucgUxxSXLFnCZIg7MHz55ZdsTFHOzCiSorUJhhSxEsMqyleCRxFh1+ToXIAGAweLfn7FP+IA9k11VovJ02HJ38W/A7sWsYpyf12syrDKq3SHeBOAOvE9mFhGXE5nE3CwOxN3lClbqxbbyq50pUpQ+c5WbEN03M1n6OnLTjGaZAcdkqJ5pYinVaCQ/P2c0VJ0nZyh9FQOkmJR4M3DGaeu7lOsElGOcoKkaG3MIEVXdyNWi7jpt/fPL5rgYOOJbGu43VNg46s9RdfgonlcyF/8moK8sAqNePVN0bW3Vq/BxvdwOQVOiGk8cpTfsc0KjRpDtx9XsqrRLBUjSdG8UnQJCdcL+gqjpShHzFJBUnQLnCmFVSPOWvK3V593kBStjVmkiAxMPg7xy1eLfv6hkS1ZtymT4q7JsPWN3qJr2j39HNudxlscDYcMlxQonrYx7HwqNBw81K8QXZQsUwZ6CeIeLFSeZtiInKRoXim6dp3x19OG+UztgcOuzQF87W+Ka87x/8tdVuceJEUdws5SpNmnQa4UhcpOqlJ82r1S3DNZulJ84UWPShH3KsWdZsrWruM5Rlm3Hpu5iRNpwl/+tywhuqjVuQurFntv2qa75EiKgbHK7FPXbjX+dpTBLdvwGhx/zM7Olv3aWLDgLjj+Zpa6NgZQsyk4SVGHsLUUaZ1iUKSIQuy3+wCMFnIPbrkmGlN8ptvNMUWhYlzyuNSY4nseY4q4m0zXJd+Jrms8YhSMuJwBQ1IuQPXwCNH/x80AHAuflnwfSNevf2B7m5IUOUjRIusUMVzdl/7G9FwnWqAYUWBYWfoDl1ngsFYg4boOHFY6nohBUtQh7CxF2tFGHynG+5p9eu4qG0cceTWL/bPlAw+LfrZsmVKQhxuEu80+nTu0hei6Lv/3NVtW4Xq/KOFO730ous6x8B9MvgkrfxedDYkbcuOMU1zuMDoHoPl9s0Q/f+cDj/hcE0lSNBar7GiD4Roz9Dfuh+ESoxJwwxVfJ2DgYn28BqWsdE9VDJKiDmFnKdLep/pI8ba7JkK7ZxezPUI9mQ9tFjwJLec8ANXCOkhWZn9PbOVcp3+RGuoAAB6nSURBVIhC/H28c51i/Uoe1xSvU3TbrBurxo5vvy96vYjX3oIxBcAW5IuE99A8GCvkke6/bWBrCfv8tRtuKeG5h2uT0WNJipzA9mgVKWI3p2tnm0C7yqDg8BoUqT+wuzRQV6trezeli/ZdQVLUIewsRTolQx8pqqV+lbJQiEdKsR1tRrEq8a9XxOOJDQcPg+FCpen+fnGBe+R//iu6tsO/XoEx+QBdvvpW3LU6cjQ71xAn/IzJA4j9ZplY8BPvYbNWSYrBxyqnZLgCxYSCwh3ClByyoDZcaxNxaZ2aKhGDpKhD2FmKdJ6iQini3qfz9Nn7tFq50nD8m+HOsUQ8KQN3sxFeP7KFxN6nb4j3Ph107DR0/vgL0bUt7p8LiRn5bM9S7+OiSpQsyXbY6bdrPzvlwvt8Q5dUPZZ+kBSDhlXOU3QP1/iev2Ok9AjXjFQ8GcPXOYtygqSoQ9hZinjSN+9EYCkp7p0CfyxO0CzELo7aTiHiMgzXKRln7oevJDYbL1unLltziIf6ur/f/klHIGHFGihRqpTH9TUio2BoykU2jtl41BjJ348L96X+vFT58kUbgEttJ0dSNBpsj1aTIlaIrskxamaDyon09PTi8Ua13aauICnqEHaWYucuU7gnAktJ8deb5ykqFWGVCmVgYOcG8MVTXQG2CK+3u+g8RTwhQ5Djwc8GQ8kS4jMa2z75NIxIzRKtHey9ZScMOpoi2lO1RMlSbOIPrlPEz4iik/se2z6xiHXT0jpFPmB7tJoUMXAc0DW+iBWjnl2pro2/1W4E4B0kRR3CzlKM6nwP90RgJSmykyzW3gWw7R44/vEg2PduP0h6zz94zcEP+sNVrAy338MEiF2l+Fpscs1fk+CE8P+qly8tklTF226HISfPsW3YROLY8BfbCLzl3AdFP1evVx+hUsxmB//inqlyhIhnMKKIcPKNGbZ6C0UpYnu0ohQxUIyuihHHGLG7U0vg5BzcbMUlRNwwQI8gKeoQuEeq9w4469atg2XLlun6e3hIMTJqAvdEYCkpChIr/HkUwKqxTGZMctsCgNdsFcAjooSfK1w+yvk6KETcCDx5OkxMaCKSVLm6daHHmvVs31Jfp1fghBlceoFjhaKxwZdeY2OLuCwE1x7WjJIeC8XF/23+/hQbR2RHR/n4XVykOPW+kJIitkerShEDK0TXGKNruYbStYT4XtyrQ6xA1axH9BUkRR3izTffFG0n9MUXX8COHTt0/T08pBjecTz3RGA5KeICexTaH+OdawvX3xUA4Zp1dzm7Xotk6CHFA9NgYMd6IllVaNKUnWE44OBx30c6rd/Cuklvu3uSpPBiPvsKRglixNmkAw+dgOgPP4Nm02ZCg4FDoMnocWwZCd4H7DLts22P8HvMse9pT6yCr2SySUOhJEVsj1aWonsuw5zpEhvuUINHPaHccKcbLDJw9iiesoEVYUZGBjsCyrWnqgsco/S1XlFtkBR1CFwkOm/ePPY3IPyb0Jo1a+DFF19UtH+qnOAhxfbho7knAktJEatEFNmeKcJ/j4MbPyVCnvBn/sjFLldcnL95IhMg7LgXYPno4ooRdt4Lm/7TV1JqtWK6skX/7EBfKYEI8hiw/wj033MQylSuIvkajiefhiEnzhWdoZjNjpDCz4+vizLELeHwXvTetJ39Hu4I76PPll3sRBH8rkJJitge7SBFDBQebsfm2vlGLrj7DS74V7I1nJIgKeoUO3fuZGcyLliwAD766CO4du2a7r+DhxSR7r3mck8GVpEirBjDukT/PbsjtG5cBerVKAcNa5b3S33hmtvqVoT49nXgwVGtYPf7/dlifbY20TXz9Oh9sOL5eEmpdXzjP6zS81ktrt3E5IY73vgaL6zeIQLaP/dP6PH7n2wLN1zjiKdn4LFTZgN36kF54xrMkmVuDSEpzg162zdSiu6BSyhwcT5OwsHxRtekHBQgVpRHjhxhXaaYV/2d0ahHkBQtFLykaPddbXSV4s7JsPMd6apOCbNG3gmAi/aFKpHNPkXZnp0NC8e0Fl1bpVXrot1ndvnubsRu1Os50OHFV/3+3tIVK7LZqnW6JUDtuG5QOzbOdNRJ6CG8N+m/INhZijx2swmWFM0UJEULBS8p2n0Bv65STJ4Gnz4apVmKSPgd1aAAxbi9SIw4EUeoQhvXriC6Fhfp4wbfPmeFCn/ee+N2VmFF/PttXd6fGbGzFGO7zSApBiFIihYKXlLs3NXeaxX13uZt6d/12+YtvnVNtl4RJ+04u1FnwDePx4iuw4k0Iy6n+10q0XPDFjYeh2OGcT+ugJpRnblLjKQoH2yHJEXjg6RooeAlxcjoidwTgpWkKLX3ac3oztBw6Aio17ufJ336Qf3+g6BOfHcoXVF6F5n3Z3d0bgiOk3jWCZXjH3dB7aqep1uUb9iI7TKDu834nbkpSLPn+s1CVXmRjc2F/fMlqNYhnLvMSIqBwXZIUjQ+SIoWCl5SDO84jntCsLoU435Yzo5jQhF5g6dZ4O/Dbdrq9e0v+tm61co5l23gCRk4G/XANJjY8zbRdbh5Ny6rkLWkYd1m6LN1Nzu+auDBExDz+RK2vAHPUKwhVJBV2zqgSus2UKVN26BQtY2DnRJSunJlj89UoVIl6NApCtpFRIIjPILRJiwcwiKjYNS48RDRuUvISBHbIUnR+CApWih4SbFdWCL3hGB1KUZ/8AmrztiyBgnwd6Egce0d7k3q/fObX+7BlnmwNZCH7oOPHhZf0+mdD9isUUXr/dZvYRN0cPNwXIKBgh54+BT033cI+u9Jhv57DwaFAUlHYPjlDDaJxv0zRXaNg3Th2T+dD3Asy8nRzEI4meNsE39f/ErISBHbIUnR+CAp6hS4JnHz5s1sCrFRwUuKiJ1noAZDilHvf8Sk51dQazexrddQbt4/v3hyeyZDtm5RkOO6l3qIrtHj9Aom6S07WRWJi/WDRd+d+4V7fpnNenX/TB1jusIl4dk/klEAB1Kzi8iBpCtZgEu2Zzw8PySkyGvmKUmRpKg6fv31V7YHKoKHXBoRPKXYJW4698RgdykiA5KPQ/zy1aKff2hES+eJGUWL+be90Vt0Tbt/PGeKI51UyRjv7dHTUDu2m8dnCo+OgRTBfvsvZ8Kus1c9wKXboSJFbH8kxeAESVGnWL16dbEU8YBLI4KnFO28MbhppLjhLxhy6iJ0XfKd6Of/Pq7NTSnungxb/t1LdE375/4FQ89e4S44kqL+RMUEfyNwkiJJUVPg9m4bNmxguzAYFTylaOfJNmaQIu7liV2XY/IBbp80WfTzSxbEACRNc0rxwDT4YVGs6Brc2QbPSeQtOJKi/oRHBn/PU5IiSdH0wVOKOMif0NOe270FQ4rdflwJ44TvEF/Xk4tsAs7wC9dhdA5AxzffFf0skobHSuHvKJpos2CseGcb3NwbxcJbcCRF/eE1yYakSFI0dfCUIhIbP5N7crCqFFs9NI8te4j491tevA2R/3kfIl59E5qMGS8pxLvjmzjPWMRNw1ePZUdNdWhWzeOa0hUqQM8/NrKjnXgLjqSoL3FCu+PV5kmKJEVTB28pRneZzD1BWFWKWrj0/Uh2cgbb0WbfFDjxvwGia3ApA06y6b1pGxep8ZAirsqY9ejjtpcitjuSYvCCpGih4C3FiMi7uCcI00sxaRp8/ph+26etfqWnc4INHi+FR1IdmwGDoxuIrgtb/BI7dNffNm9mRqkUdxZLcYFnxVy6LPfnSW+w3ZEUgxckRQsFbynadVxRbyn+tLCrZhnWrHIrrHqtF5MgO3gYNwQ/PhP+erWn6NrSFSqyBfj9dluz61SdFK9BltAmxtwzxbNSvLU89+dJV4T2xnM8kaRIUjR18JYiYscTM3SV4h/jIev38RDXrrYqGd7RsDI8NsEBqVgZJk9zHjb8w0gm2xtr74J61cuJfqb5jPvZ6Re4Ow1vuQVLiofSc+GEkKcbNG7qcX2FCtW5P096EhvP52QMkiJJ0RJhBil2ip7EPVGYWYp4KDD7d0Fg3z7ZFT54sJMsPp0XDZuxMkSxHpoOsHmi87VwHPHgdMgT/jumeXVxlVipEvQXKkTcls2qXadKpbjt1BXWHt5b+qPoftSt14r786QnuD6YpBjcIClaKMwgxbDwMdwThamliF2dKDPcvHvfVFbhyUO4dpfziCjA0zBQhrgJ+KlZcOTbEdCuUWWRAJCOb70Hwy+nsy3ieIstGFLclnIF0oS2kJKZJ1SJTUT3o0PHkdyfJz0JixhLUgxykBQtFGaQImK3fVDlShH3A8UF+LW6ei6c7+aoxQ7/hbXjnZWeGnCpxZpxAHioMJ6feHQGwMYJ8NLcSLjVV1fr5GmQmJ4rep9WxJcU8RSM88KzfzijAFLyne3g6NU0CIsSz/AtV64y92dJT3jud0pSJClaIswiRbstzfArRXb+4BYYfPwsDDl1HhIz8qFOQneP67uH1XGuI9x+j7NiVMpmgS2TmBCvC1Xm1vf7w6KpYdCsgfT5igiewYinWvTbmWTpscRAUowS/hs3/j5bIPy941gKvPzu+1Cjdj3Je9IhYjj3Z0lPOnNeikFSJCmaPswixQ4RY7knjGBJEc8dHHzsDNumDdcC1uoSC2Wqei6cr1KhDHQTxIiTa7ArVSlxjtoQ374OdGhRHap5HR4sReNRY2HYuVQYsP+I8P6s3W0aSIqVKleBLvEJ0C48AsqXF08yKv7OmnTg/hzpDa/zE0mKJEXLhFmkiNipC9WfFAcdOglx3y9XNZPUCBxPPcPGEPvvPWT5cUQ5UpRD3Xp3cn+G9Ca++2zubZykSFI0fZhJitEx93JPHMGQ4ojUTGg+azZ3Gdbr2Rvilv3Cll7g2CZWsLxFZgYpNmkawf35MQLeu9iQFEmKlggzSdFOXah+K8UjKZJHOQWDMpWrsPcS/b9P2fsZcvK8U4YWXnqhlxRr1GwC4R0TuT87RtHBBLNOSYokRdOHmaSIxCXM4p48jJZir6JJNrhhd/UOEVDpjmZQuXkLaVq0hKpt2orGHEuUKMF+rkqrVuy6qm0dcGv1Gp6JXrimivCz9Xr3Y4vxI996D3r8tp6dj+jc03S7LSbUBJRiXLzHfSlVqgxUrFQLqlStB7XrtIDmLbtBVMzd3J8ZI8F2xbttkxRJipYIs0nRLgv5MfG6J+LGiWMFEV1xTrTBqowd/nsBBiQdgb7b90Lfnful2ZUEI69msYkwHom9XDno8cdGGHLiHLsuMT0P7rh3msc1JcuUYdLDJRY4qxSPk+q/7zATRk8bVoYiKQrSx7981OmW4HFfqlVryP35CDbYrni3bZIiSdESYTYptgsbZYu9UL2l2GDgEPEJ9oKYcCyv7459TjFKsWM/jLiSCQ0HD/OsFEuWhIRVfzilKFw3Mu0GNB0/QdQl2O3nVTDwyCnuguIjxR2CFM9AzU7RnlKsHlpSTGB7nY7i3rZJiiRFS4TZpIjExE7lnki0Ur6CZ3dnhUaN2exOFJii5C5UlsMvpUPjkaNFwsOlE/33HmTXDb+cAbdNuEd0Tfdf18KA/Ye5C4oHuLwE/1m6sufOPfXq22vbtkBge+LdpkmKJEXLhBmliGupeCcSrdSrLz7FHie3jLiSoXgd4MDk45Cw8ncoU6Vq8Wu1nreAdb/2+nNbkQAOQ4+1G6Fc3ZuL0JvPnMMm0vS2we40SumxdhOMyiyANo8vFH0PzVvGcX8+golZ1iaSFEmKlggzShGx+oSb9uFDRckYJ8PgAvmByccULX/AtYM4YQS7Qts++TR0fP1ttvi/z5ZdxbNGUYg4q7X76rXsmvBXXodBh09Bn217oOcG+06m8XW/2PjpnoNQtmYt0fdg90k17phtgg1JkaRo+jCrFCOjJnBPKFopXUa8k0zDocPZGCHKEWdHyloKgdvCCYl+wIGjbFwSqz82YWf9ZpEMcCINu0aoIvH17bb2MNB9wjFarMZxrLV6eIT4LyZV63N/LoIJtiPebZmkSFK0VJhVigjuwME7qWihTdu+kuvhasV0gbgflrONwDGBD7+YxmaHEuoZfikNRlzOYNVy50+/hErNmkve+45R9lkLGwgz7WBDUiQpWibMLEU89413YtFKrdp3+FwsXjOqM9wxdTq0nPMAtLh/LrSYNYdQg3Dv8B7ePmkyVGsX5vN+N7bpTjW+MMO5iSRFZ5AULRRmlqJzecYc7slFK7hQXK8daQh11K7TjPtzEEyw3ZhtGQZJkaRoiTCzFBE7HCkV32M21Kx5G3cxhCr1G7Tl/gwEGzPtc0pSJClaKswuxXYd7FEtIridWJkyvo8qIvSlfPmq0MbRj/v3HmxYldjBvFUiSZGkaOowuxQRO52eEZcwE1q16QU1a93Gknbp0mXZPqmEdnC2b4UK1aFO3RbCczPAFjsjqQHbC+82GwiSIknRtGEFKbKxxR72qBYJwkjMPpbogqRIUjRtWEGKSFSM9WeiEoTRYDvh3VblQFIkKZo2rCLFdmGJbMIK76RDEGYF2we2E95tVQ4kRZKiacMqUkTssMsNQRiFWXevkYKkSFI0bVhJikhs/EzuyYcgzAa2C95tUwkkRZKiacNqUrTDCRoEoTdmPAnDHyRFkqJpw2pSRGJip3FPQgRhFrA98G6TSiEpkhRNG1aUYvsOo2mJBkEIYDvA9sC7TSqFpEhSNG1YUYpIZNRE7gmJIHiD7YB3W1QDSdHcUqzoIClybyRq6NptBvekRBC8wOefdxtUC0mxWIouB5EUzRJWlmJY+JiQ3cqLCG3wucfnn3cbVAtJ0bxSdImRpGiChqKGTjY4c5EglNLJxGclyoGk6CFFl4tMJUXXuCJJ0YLEUjcqEULExlu329QFSVE0nmhaKVZxuEmxsLDQ9t+aHaRIs1GJUAE3/LZyt6mLEJNivsNTilKTbEwhRX8zUF1SvMz7bhoddpAi0rHT3dwTFkEYTUcLbeXmj1CSouCRa46bUvQ385SrFAMty2BSLCgoPMH7hhoddpEiEtN1KvekRRBGYcVF+r4IJSkKHklxyJOiy01BkaJLjIqkmJeXv5n3DTU67CRFPCEgLmEW9+RFEHqDz7VVTsCQQyhJUfDIdoc6KbrcZQopYr9vjaysnE9531Cjw05SRJzLNGh8kbAPdhlHdCeUpJidnfOtwylFOQv3DZWiS4zeUpS9q03q1bSFvG+o0WE3KSIRne7insgIQi/weebdpvQmlKR49Wracw5lu9lISdHda/ykmJx8fBDvG2p02FGKSHTMvdyTGUFoBZ9j3m3JCEJJiocOnRzmCJIUvcVY0hF4so0iKd4345n6hYWF2bxvqpFhVykiXeOmc09qBKEWfH55tyGjCBUpoj8enfdKA4d6KfrqOvWW4i1qpah4U/CcnNwVvG+skWFnKeLEBDqUmLAi+NzaaWKNN6EixRs3clc7jNkMXJYUDVnAf+7cpRm8b6yRYWcpIriwP77HbO5JjiDkgs+rFY+DUkKoSFHwx/2OICzcd+gkRVnLMh5b8FojXHzJ++YaFXaXItIhYizNSCUsAT6n+LzybjNGEwpSFLyRtugf7zRxBGGNokOlFNUsy8APUjMtLeNN3jfYqAgFKSLhkeOhO52oQZgZ4fnE55R3WwkGoSBF9Ab6wyG/61T1cgyHDlJUNK64dOmqdnadcINS/PKrn0OCJUtXwHff/0YQpgSfT95tJFjYXYroi8+/+LmNQ/l4ouFS1Lwso+hDYbX4Ou8bbUTgg5mdnU0QBBFUCgoKeKc/wyI9PfOdoipRDykGXI4hR4p6TLYpHlfED7fwqbebFhQUnuZ9sykoKCgozBuCJy69/Monzbyk6EuIesw81VWKSqrFWidOnJnI+4ZTUFBQUJg3Tp48Nxl9obBKNEyKho0rFlm/VmZm9ue8bzoFBQUFhfkiIyPr4yIh6tV1Kmc80UOKek+28duFih/2oUdeapKXl7+X982noKCgoDBPCF7YN+dvixtLSFFKiLpOslEqRT27UJkYlyxdFVZQUHiG95dAQUFBQcE/CgoKTqEXVFaJcrpOdZGinHFFVV2oArVXrtwYI4jxPO8vg4KCgoKCXwgeuLj8lw3R6AWVUnSvElWNJ2qVor8uVEVi/P6H3zsKf0M4wvtLoaCgoKAIfgj5//TKVRu7qBCi2q5TVVIMShdq0U2o/c67S1vn5ORu5v3lUFBQUFAELzDvf/jRDw6XCxRKUa+uU8VS1HPCjS8x1hk4eE7D1Ktprwj3yb6rUSkoKCgoMAqvXk17A/M+5n+FQtQywUa2FLV0oaqtFkViFKi7dev+wbm5eft4f2MUFBQUFPpHXl7+/h07DwzBfO9DiHKrRF8L9lV1ncqRotIuVC3VoocYBwy6v9HZs5fmFxQUXuD9BVJQUFBQaA+cTHPu3KXHMb9LCFGPKlFT16lSKSrtQvVVLQYcX3SJUaDelKmLmp4+feFRoXLczfsLpaCgoKBQHpi/z5y5MH/2nBdux7zuJcRA3aZyqkRduk61SFFJtRioGzWQGOsW3cT6K1b+2e3y5auv5uTkbhXucx7vL5qCgoKCQjLybtzI3Yb5euWqjQmYv91kGEiIameceleJukhRbReqkrFFLWKsV3Rz6z/40Isttm7dP/zUqXOPpF5N+096euY3WVk5q3JybqxDsrNz1geDzMzsrWlp6ce1kpWV/acZ3ld6esYBPd9HRkbmLjXvQ/i5PcH6DgmCUI4r12Lexfwr5OH3Tp++8MTOncmJjzz6SktXrnbL3WqFqGTGqaauUzVSlOpCVVstBhKj+xhjcXequxiLaFBEQy8a+aGxXnzwv68m/PbbetDKhInzW+v5vj78cMkkNe9jxYrf1uj5Pr75dvkLat7H99+veF3P90EQhCr85VHvnOvKxe752V2IrlzuawxRTrepoVWiQ6MUlVaLWsToq2p0F2QDh29BypWlYmbMfNqxZs26lN9/Xw9qWbXq9w16v69H5v0rQnhfZxW+l7ylS39aoOf7eOvtz4YIkktX8j6E6zPeffeLEXrfE4IgVOEvn7rnXW8R+qsOtQpRTZWoWop6iNG9Wgw0G9WfGKW6UwPJUUqScmRJEARBSCOVT71zri8ZSnWXKhGir27TQJNrFAvRYaAUA81G9SdGX+sY/cnRW5BSkvQnS4IgCEIaX7nUO+e652MpGfpahyhXiP66TblIkYcYpapGdzn6EqSUJAPJkiAIghDjK5d651xvEXrLUKo6lCPEQOOIaoWoSIpyqkV/k27kji/6mpUq1Z0qJUdfgpSSZCBZEgRBEGJ85dI6XniL0FuGUt2lvmaZqhlH1FwlOlRIUU616G82qlwxypWjP0F6S1KOMAmCIIib+Mqh3rlWSoS+ZChVHcoVopzZpqqrREcAKRrVjeqvK1WqO1WqS1WOIKUk6QtfXzxBEEQoITdneudafyL0lqFUd6m/McSgdJs6dJSiHmKUWzX6GnN0p6bDvyiVIPcBIQiCsBJa8qJ3jvXOwb5E6Ks6lFp2oYcQDZGiHt2oasUoJUep6tG7gpQSpZQsCYIgCPlI5VXv3Ouel71F6EuGWoSoa5Xo0ChFrWJUI0df1WMgSQYSJkEQBCGNv3wqJUE9Zai3EHWRotZuVCkxyqka5crRlyS9RemNvy+aIAgi1PGXPwNJ0F2E/mQopzpUKkTVVaJDBynqLcZAcvQlSClJ+hJlIAI9CARBEHZCTZ6UyrfeObmSQ5kMjRairlLUW4yBulOVyNGXJH2JkiAIgtCGVL71zsnu+VquDKW6S4MmRIdCKWoRo5Kq0Zcc/QlSSpK+REkQBEFoQyrfeudkKRHKkaGv6tBwITp0lqJaMWqVoy9J+pMlQRAEoQ5fuVYqL6uVob/qUKkQDZWi3mL0VTX6k6O3IH1J0p8oCYIgCPX4yrneudk7d/uSodzq0FAhOlRK0UgxBpKjlCClJOlPlARBEIR2pPKuVH72zuG+ZMhdiA4NUlQjRq1ylBKkL0n6EqVceD9sBEEQwUBLnvSVe6XytFQ+1yJDQ4To0ChFvcQYSI5KBOlPknLR8pAQBEFYDa0501cuDiRCOTIMqhAdOkhRjhi1yFGuIP1J0ghxEgRBhAJK8qqv3BxIhHrKUJMQHTpJUW8xypVjIEmqFSZBEAQhjZx86ytXy5UhNyE6dJSiXDHqIcdAkpQrSoIgCEIb/vKwv/yttwx1EaJDZylqFaMWQcoRJQmUIAgiMGryaCAJKhUhFyE6DJBiMOSoRJJahUkQBEE4UZpzA+VwU8nQhVFSVCJGPQSpVpQEQRCEduTmaD1EaJgQHQZL0Qg5KpUkyZMgCEI9WnOtnHxuChm6CIYU1cpRriD1EiVBEAShHiX5Wo0PguKqYEpRixzVSJLESRAEoQ9ac6+WvB9UR/GQol6C1EuUBEEQhH7okde5eYm3FPWUI0mTIAjCeIzM17xdZBopBlOSBEEQhDng7RrLSJEkSRAEYT94u8Q2UiRhEgRBWAPeTgh5KZJICYIgjIF3rg46/w+7KKl+LvmoEAAAAABJRU5ErkJggg=="}},"time_used":605,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":335,"receive":270,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/7.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.530Z","timestamp":1785147795530,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/7.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 2440\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":2440,"size_decoded":2914,"mime_type":"image/png","magic":"PNG image data, 61 x 81, 8-bit/color RGBA, non-interlaced","md5":"f25c040925a70fab77844b9fc231cdfd","sha1":"a698efbc566051d45034915f414d3e63540daf74","sha256":"53170f2bba09aa8950ec7d15544a0ad33b1fc0c3fe5eb4ad6c06cc9c60085f2b","sha512":"e5b6386ada6736c0218818b3500b59203f09690c1ae9bf7362a545956e902d46dd0a60733cdb2df5cf071b20bf96efb49a8719ec3b55fea723c45c804201e072","ssdeep":"","tlshash":"4b513bf9035a58d8b7a349505444a343d80dafb639ebd7a533bda26ba84732e4dc03e1","first_seen":"2025-05-31T01:51:37.408917Z","last_seen":"2026-08-11T00:25:55.19907Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":608,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":327,"receive":281,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/3.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.538Z","timestamp":1785147795538,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/3.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1528\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1528,"size_decoded":2002,"mime_type":"image/png","magic":"PNG image data, 47 x 54, 8-bit colormap, non-interlaced","md5":"d9eea3b6b2e3472bba5b8a743f34c5c7","sha1":"2cb77c4180f41756f34cab5f709c8c728b4950d6","sha256":"b32dcee6933b681bf11d55a6ca4cbf53cf9329fd416911a40a6ce1a21b4fbfaa","sha512":"fc829c7e276b7fd225e040c52f14df01dcb6e08d157f1d6faf91b3d7cf431996f7e764fddf4a88eaa3d65f3109909e5cea8c4114f31fae14491b7fb55a1acf4f","ssdeep":"","tlshash":"2331c4588011bc808604bd79f63a0db5f9659eea22526018bf3ff2a0907700302cbb3e","first_seen":"2025-05-31T01:51:37.518544Z","last_seen":"2026-08-11T00:25:55.176151Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAC8AAAA2CAMAAABgIDDNAAACJVBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+NL236AAAAtnRSTlMAAQIDBAUGBwgJCgwODxARExQVFhcYGxwfISIjJCUmJygpKiwtLi8wMTM1OTo7PD9CREVGSElLTU9QUVJVWVtcXmFiY2VmZ2hpamttbnByc3R2d3h5fH1+gYSFhoeIiYqLjo+QkZKTlZaXmZqbnaGjpKanqKmqrK6vsLGys7W4ubq7vL2+v8HCxMbIysvNztDS09TY2dvd3t/g4eLj5OXm5+jp6uvs7e7x8vP09fb3+Pn6+/z9/lYMV5sAAALMSURBVEiJ7ZbrP1RBGMdniYiylEoX3ehe0o2QLqLd7je0FVLoJt1QKq3VopRWilptKNUirbVr5+/rzDNzZubsHruvetfzZuf3+33PnDPzzDmfRSi0kvZVWz+5A/5RR/P5rVE6gFxR+c+nsVQj19LD0Ib9/Ti4Ao9WzIavfBVCk/KWx+jihb91caVeL9bBLYHZcGUZGSF4lZyP1VZU3Jev/xV8wTnNfGXEssuOa4kGz/Zr+L3Eq9ZYb2MlfIGLuX1PZshPGjGLyGi4ZpRFVRJfx7yuBLTji+dWloGY8QWtuDkZrR6imS9TbDzraec8ci/pSeE+6cM0beX2HTb9bt2+oHoWb2I6UW3UM4MevmyMxfXMOMA3wayDx3Sr6fhc6jRy/gM1Ekr7vFM9J+NArBF9y6axixvHQa91UuWgx6aFx5dBp3I9bYTlDKjaAQczj+cvgN9CxVCtaRvoizzHJUTP2Xzo+iTIfsgP0ixHXeBHwXeoXg1IN4xP0Gw7iww+wX9T+StUw9ii5ZFH8E4t75HXn69mXYJvVL0GkD/g/iM0+9lwdhdkhYLfCftlvsFa1kPkRhEHlsIET1V9E64/zPOHRNYKHlsAiKuHlvoqo0Hy84BPK8o4IfFu9uXItDxuKl9Fxxki3oDEqwJ1AenUAzUl7Von7Ta2R+vxiew44VJFWOXpi/VwhO7S9E8yQrkyjgfI/sznjUOx+eRI75mi6VVl3Kvh8ec05X3Hb07FEzql8it+vx7leGn2PUnx3Foej7bD9ySL983bpS4wj3gFTrd7EoeUiWSXNFYdf0pTKH+P+C9lZzAmHB/ottneaZxeFI4Prf/8P+PzItMYNwk+aTwiPd2SKr0PuZ6wsM9aZESaWl52G2pCB247EgRLNRgE+23FybPCwby/vSQlHKzh/fajCyPAgvfbTYsiw0qRf1czHebUyCStM5Odx8LCfwEm/OU1ibqI9QAAAABJRU5ErkJggg=="}},"time_used":341,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":338,"receive":3,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/4.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.548Z","timestamp":1785147795548,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/4.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 17458\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":17458,"size_decoded":17933,"mime_type":"image/png","magic":"PNG image data, 127 x 40, 8-bit/color RGBA, non-interlaced","md5":"66e99bd2a7ad1f0a6f99530d8eedf958","sha1":"d70e84169e98a535b3b139da1784cbf309869bc6","sha256":"8448882b85fffdc55edfe60d532c4aae4c101320ad3ea0d63f4ae8ca3d89fcd3","sha512":"56402db828653000ff21387e59eb1f8e8a906d80b4629dd220aede01f1c4ab379d69408fcc6531c77ae6e94e32422dfc07263ba1bafa6b5644a0aee6d662be04","ssdeep":"96:sS9kEWRhxNX31sc5/9eVxzRjZbfR5ClCmE31Yahg+YW:sS9ktT5eXR95crECqd","tlshash":"c472e534fcf172a6648ee6761dd969065c370b83c682ac41b3cd9c666f10b9d9d8f053","first_seen":"2025-05-31T01:51:37.519774Z","last_seen":"2026-08-11T00:25:55.276254Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAH8AAAAoCAYAAADXNiVcAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7mWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNTozOCswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjU6MzgrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6OTJiYjNkNTAtYzgzZi1jYTRlLWEyMDktZDJiZDEzNGI5YzlkPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjg3YTY1ZjI2LWE4MzEtN2I0Ny1iMWJlLWU4YWEwMTRkMGYzMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjg3YTY1ZjI2LWE4MzEtN2I0Ny1iMWJlLWU4YWEwMTRkMGYzMTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo4N2E2NWYyNi1hODMxLTdiNDctYjFiZS1lOGFhMDE0ZDBmMzE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6OTg2OGI5MWMtOTdjNi0wNjQzLTk5N2ItYjNhMzkyZjFlOGY0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE4LTA2LTI2VDIwOjI1OjMxKzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjkyYmIzZDUwLWM4M2YtY2E0ZS1hMjA5LWQyYmQxMzRiOWM5ZDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wNi0yNlQyMDoyNTozOCswNTozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NDA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAK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"}},"time_used":711,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":697,"receive":14,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":true,"resource_type":"document","requested_by":"","date":"2026-07-27T10:23:13.788Z","timestamp":1785147793788,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET / HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nPriority: u=0, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncontent-type: text/html; charset=UTF-8\r\ncache-control: no-cache, private\r\nset-cookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; expires=Mon, 27 Jul 2026 12:23:14 GMT; Max-Age=7200; path=/; samesite=lax; secure\nhyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D; expires=Mon, 27 Jul 2026 12:23:14 GMT; Max-Age=7200; path=/; httponly; samesite=lax; secure\r\ncontent-length: 9691\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ndate: Mon, 27 Jul 2026 10:23:14 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nalt-svc: h3=\":443\"; ma=2592000, h3-29=\":443\"; ma=2592000, h3-Q050=\":443\"; ma=2592000, h3-Q046=\":443\"; ma=2592000, h3-Q043=\":443\"; ma=2592000, quic=\":443\"; ma=2592000; v=\"43,46\"\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]},{"name":"Bootstrap","description":"Bootstrap is a free and open-source CSS framework directed at responsive, mobile-first front-end web development. It contains CSS and JavaScript-based design templates for typography, forms, buttons, navigation, and other interface components.","website":"https://getbootstrap.com","common_platform_enumeration":"cpe:2.3:a:getbootstrap:bootstrap:*:*:*:*:*:*:*:*","icon":"Bootstrap.svg","categories":["UI frameworks"]},{"name":"Easy Pie Chart","description":"Lightweight jQuery plugin to render and animate nice pie charts with the HTML5 canvas element.","website":"https://rendro.github.io/easy-pie-chart/","common_platform_enumeration":"","icon":"","categories":["JavaScript libraries"]},{"name":"OWL Carousel","description":"OWL Carousel is an enabled jQuery plugin that lets you create responsive carousel sliders.","website":"https://owlcarousel2.github.io/OwlCarousel2/","common_platform_enumeration":"","icon":"OWL Carousel.png","categories":["JavaScript libraries"]},{"name":"jQuery:3.2.1","description":"jQuery is a JavaScript library which is a free, open-source software designed to simplify HTML DOM tree traversal and manipulation, as well as event handling, CSS animation, and Ajax.","website":"https://jquery.com","common_platform_enumeration":"cpe:2.3:a:jquery:jquery:*:*:*:*:*:*:*:*","icon":"jQuery.svg","categories":["JavaScript libraries"]},{"name":"Modernizr","description":"Modernizr is a JavaScript library that detects the features available in a user's browser.","website":"https://modernizr.com","common_platform_enumeration":"","icon":"Modernizr.svg","categories":["JavaScript libraries"]},{"name":"jQuery UI","description":"jQuery UI is a collection of GUI widgets, animated visual effects, and themes implemented with jQuery, Cascading Style Sheets, and HTML.","website":"https://jqueryui.com","common_platform_enumeration":"cpe:2.3:a:jquery:jquery_ui:*:*:*:*:*:*:*:*","icon":"jQuery UI.svg","categories":["JavaScript libraries"]},{"name":"Three.js","description":"Three.js is a cross-browser JavaScript library and application programming interface used to create and display animated 3D computer graphics in a web browser using WebGL.","website":"https://threejs.org","common_platform_enumeration":"","icon":"Three.js.svg","categories":["JavaScript graphics"]},{"name":"WOW","description":"Reveal CSS animation as you scroll down a page.","website":"https://www.delac.io/WOW","common_platform_enumeration":"","icon":"","categories":["JavaScript frameworks","Web frameworks","JavaScript graphics"]}],"data":{"size":92423,"size_decoded":11210,"mime_type":"text/html; charset=UTF-8","magic":"HTML document, ASCII text","md5":"d603a77b2b3160e2489109169cba4e42","sha1":"f85dae5e497c6bf7a5a69dfd26a7ba018d98ed2e","sha256":"78db2ff616e3ce5692c14e485487a61de0ef1a281fdec01b4d3636da02e9cd3a","sha512":"c2b7015eac495ce1f901d888c26478a7c57286266af151b45462003b47e1a3e51755fc862b996073733e35cc794679e1b86dd78e5434f249fca464b29efc76aa","ssdeep":"768:QjU6AvVPNv0RZOtKGG/KonCtmg0k29rPn:QjU6AvZN8RZKKGhQCtmg0k29rf","tlshash":"1793dc7094f05137029b51e32a252b0b6fe1ea1bd82b190876fd0bd91fc3e86df57269","first_seen":"2026-07-27T07:51:04.759518Z","last_seen":"2026-07-27T10:24:01.491668Z","times_seen":3,"resource_available":false,"data":"PGh0bWwgY2xhc3M9Im5vLWpzIiBsYW5nPSJlbiI+CjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cgo8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IngtdWEtY29tcGF0aWJsZSIgY29udGVudD0iaWU9ZWRnZSI+CiAgICA8dGl0bGU+IENyeXB0byBLb2luIC0gSG9tZTwvdGl0bGU+CiAgICA8bWV0YSBuYW1lPSJ0aXRsZSIgQ29udGVudD0iQ3J5cHRvIEtvaW4gLSBIb21lIj4KCiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQnV5ICZhbXA7YW1wOyBJbnZlc3QgaW4gQml0Y29pbiB8IENyeXB0b2N1cnJlbmN5IEludmVzdG1lbnQgfCBjeXB0b2tvaW4iPgogICAgPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imh5aXAsYml0Y29pbixpbnZlc3RtZW50LGN5cHRva29pbiI+CiAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Imh0dHBzOi8vY3lwdG9raW9uLnZpcC9hc3NldHMvaW1hZ2VzL2xvZ29JY29uL2Zhdmljb24ucG5nIiB0eXBlPSJpbWFnZS94LWljb24iPgoKICAgIAogICAgPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJodHRwczovL2N5cHRva2lvbi52aXAvYXNzZXRzL2ltYWdlcy9sb2dvSWNvbi9sb2dvLnBuZyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtc3RhdHVzLWJhci1zdHlsZSIgY29udGVudD0iYmxhY2siPgogICAgPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtdGl0bGUiIGNvbnRlbnQ9IkNyeXB0byBLb2luIC0gSG9tZSI+CiAgICAKICAgIDxtZXRhIGl0ZW1wcm9wPSJuYW1lIiBjb250ZW50PSJDcnlwdG8gS29pbiAtIEhvbWUiPgogICAgPG1ldGEgaXRlbXByb3A9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJCdXkgJmFtcDthbXA7IEludmVzdCBpbiBCaXRjb2luIHwgQ3J5cHRvY3VycmVuY3kgSW52ZXN0bWVudCB8IGN5cHRva29pbiI+CiAgICA8bWV0YSBpdGVtcHJvcD0iaW1hZ2UiIGNvbnRlbnQ9Imh0dHBzOi8vY3lwdG9raW9uLnZpcC9hc3NldHMvaW1hZ2VzL3Nlby82Njk0NDExNTZkNDMwMTcyMDk5MjAyMS5wbmciPgogICAgCiAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6dHlwZSIgY29udGVudD0id2Vic2l0ZSI+CiAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6dGl0bGUiIGNvbnRlbnQ9IkJ1eSAmYW1wO2FtcDsgSW52ZXN0IGluIEJpdGNvaW4gfCBDcnlwdG9jdXJyZW5jeSBJbnZlc3RtZW50IHwgY3lwdG9rb2luIj4KICAgIDxtZXRhIHByb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiIgY29udGVudD0iQnV5ICZhbXA7YW1wOyBJbnZlc3QgaW4gQml0Y29pbiB8IENyeXB0b2N1cnJlbmN5IEludmVzdG1lbnQgfCBjeXB0b2tvaW4iPgogICAgPG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL2N5cHRva2lvbi52aXAvYXNzZXRzL2ltYWdlcy9zZW8vNjY5NDQxMTU2ZDQzMDE3MjA5OTIwMjEucG5nIi8+CiAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6aW1hZ2U6dHlwZSIgY29udGVudD0icG5nIi8+CiAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6aW1hZ2U6d2lkdGgiIGNvbnRlbnQ9IjExODAiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6aW1hZ2U6aGVpZ2h0IiBjb250ZW50PSI2MDAiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0ib2c6dXJsIiBjb250ZW50PSJodHRwczovL2N5cHRva2lvbi52aXAiPgogICAgCiAgICA8bWV0YSBuYW1lPSJ0d2l0dGVyOmNhcmQiIGNvbnRlbnQ9InN1bW1hcnlfbGFyZ2VfaW1hZ2UiPgogICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgogICAKICAgIDwhLS0gUGxhY2UgZmF2aWNvbi5pY28gaW4gdGhlIHJvb3QgZGlyZWN0b3J5IC0tPgogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS9qcGciIGhyZWY9ImltYWdlcy9sb2dvL2xvZ28ucG5nIiAvPgoKICAgIDwhLS0gYWxsIGNzcyBoZXJlIC0tPgogICAgPCEtLSBib290c3RyYXAgdjMuMy42IGNzcyAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL2Jvb3RzdHJhcC5taW4uY3NzIj4KICAgIDwhLS0gYW5pbWF0ZSBjc3MgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9hbmltYXRlLmNzcyI+CiAgICA8IS0tIGpxdWVyeS11aS5taW4gY3NzIC0tPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvanF1ZXJ5LXVpLm1pbi5jc3MiPgogICAgPCEtLSBtZWFubWVudSBjc3MgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9tZWFubWVudS5taW4uY3NzIj4KICAgIDwhLS0gb3dsLmNhcm91c2VsIGNzcyAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL293bC5jYXJvdXNlbC5taW4uY3NzIj4KICAgIDwhLS0gYnhzbGlkZXIgY3NzIC0tPgogICAgPCEtLWZsYXRpY29uIGNzcyAtLT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL2ZsYXRpY29uLmNzcyI+CiAgICA8IS0tIGZvbnQtYXdlc29tZSBjc3MgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9mb250LWF3ZXNvbWUubWluLmNzcyI+CiAgICA8bGluayBocmVmPSJjc3MvdmlkZW8tanMuY3NzIiByZWw9InN0eWxlc2hlZXQiPgogICAgPCEtLSBzdHlsZSBjc3MgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9zdHlsZS5jc3MiPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvbW9kLmNzcyI+CiAgICA8IS0tIHJlc3BvbnNpdmUgY3NzIC0tPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvcmVzcG9uc2l2ZS5jc3MiPgogICAgPCEtLSBtb2Rlcm5penIgY3NzIC0tPgogICAgPHNjcmlwdCBzcmM9ImpzL3ZlbmRvci9tb2Rlcm5penItMi44LjMubWluLmpzIj48L3NjcmlwdD4KCjwvaGVhZD4KCjxib2R5PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgYWxlcnQoIk5vdGljZTpBbGwgdHJhZGVzIHBsYWNlZCBhbmQgaW52ZXN0bWVudHMgYXJlIDEwMCUgc2VjdXJlZCBzbyB0cmFkZXJzIHNob3VsZCBiZSAxMDAlIGNvbmZpZGVudCBhcyB0aGVyZSB3aWxsIGJlIGFsd2F5cyBzdWNjZXNzIGluIHRyYWRlLiIpOwo8L3NjcmlwdD4KCiAgICA8YSBocmVmPSJqYXZhc2NyaXB0OiIgaWQ9InJldHVybi10by10b3AiPjxpIGNsYXNzPSJmYSBmYS1hbmdsZS11cCI+PC9pPjwvYT4KICAgIDwhLS0gcHJlbG9hZGVyIFN0YXJ0IC0tPgogICAgPGRpdiBpZD0icHJlbG9hZGVyIj4KICAgICAgICA8ZGl2IGlkPSJzdGF0dXMiPjxpbWcgc3JjPSJpbWFnZXMvYmFubmVyL2xvYWRlci5naWYiIGlkPSJwcmVsb2FkZXJfaW1hZ2UiIGFsdD0ibG9hZGVyIj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPCEtLUhlYWRlciBhcmVhIHN0YXJ0IGhlcmUtLT4KICAgIDxkaXYgc2VjdGlvbi1zY3JvbGw9IjAiIGNsYXNzPSJ3ZF9zY3JvbGxfd3JhcCI+CiAgICAgICAgPGhlYWRlciBjbGFzcz0iZ2NfbWFpbl9tZW51X3dyYXBwZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMyBjb2wtbWQtMyBjb2wtc20tMTIgY29sLXhzLTYiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvLWFyZWEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLyIgY2xhc3M9ImxvZ28tbW9kIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvLXBhZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvdHJsb2dvLmpwZyIgYWx0PSJsb2dvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9nby10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZS1vdXQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwhLS0gTW9iaWxlIE1lbnUgIFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy05IGNvbC1tZC05IGNvbC1zbS0xMiBjb2wteHMtNiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbnUtYXJlYSAgaGlkZGVuLXhzIiBzdHlsZT0icG9zaXRpb246IEZJWEVEOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmF2IGNsYXNzPSJ3ZF9zaW5nbGVfaW5kZXhfbWVudSBidGNfbWFpbl9tZW51Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjIj5Ib21lPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjYWJvdXQiPkFib3V0PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZmVhdHVyZXMiPkZlYXR1cmVzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcHJvamVjdCI+V2h5IENyeXB0byBLb2luPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjc3RlcHMiPlN0ZXBzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcm9hZG1hcCI+Um9hZCBNYXA8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNwbGFucyI+UGxhbnM8L2E+PC9saT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFuZ3VhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsbmctaW4iPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvMTIucG5nIiBhbHQ9IiIgLz48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJsbmctb3V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvMTIucG5nIiBhbHQ9IiIgLz48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGltZyBzcmM9ImltYWdlcy9pY29ucy8xMi5wbmciIGFsdD0iIiAvPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9naW4tYnRuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvdXNlci9sb2dpbiIgY2xhc3M9ImJ0bjEiPjxpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZmEgZmEtdXNlciI+PC9pPjxzcGFuPkxvZ2luPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBtb2JpbGUgbWVudSBhcmVhIHN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJycF9tb2JhaWxfbWVudV9tYWluX3dyYXBwZXIgdmlzaWJsZS14cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMzEuMTc3IDMxLjE3NyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMS4xNzcgMzEuMTc3OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMjVweCIgaGVpZ2h0PSIyNXB4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz0ibWVudWJhciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMzAuMjMsMS43NzVIMC45NDZjLTAuNDg5LDAtMC44ODctMC4zOTgtMC44ODctMC44ODhTMC40NTcsMCwwLjk0NiwwSDMwLjIzICAgIGMwLjQ5LDAsMC44ODgsMC4zOTgsMC44ODgsMC44ODhTMzAuNzIsMS43NzUsMzAuMjMsMS43NzV6IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiNmZmYiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz0ibWVudWJhciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMzAuMjMsOS4xMjZIMTIuMDY5Yy0wLjQ5LDAtMC44ODgtMC4zOTgtMC44ODgtMC44ODhjMC0wLjQ5LDAuMzk4LTAuODg4LDAuODg4LTAuODg4SDMwLjIzICAgIGMwLjQ5LDAsMC44ODgsMC4zOTcsMC44ODgsMC44ODhDMzEuMTE4LDguNzI5LDMwLjcyLDkuMTI2LDMwLjIzLDkuMTI2eiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjZmZmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9Im1lbnViYXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD0iTTMwLjIzLDE2LjQ3N0gwLjk0NmMtMC40ODksMC0wLjg4Ny0wLjM5OC0wLjg4Ny0wLjg4OGMwLTAuNDksMC4zOTgtMC44ODgsMC44ODctMC44ODhIMzAuMjMgICAgYzAuNDksMCwwLjg4OCwwLjM5NywwLjg4OCwwLjg4OEMzMS4xMTgsMTYuMDc5LDMwLjcyLDE2LjQ3NywzMC4yMywxNi40Nzd6IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiNmZmYiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz0ibWVudWJhciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPSJNMzAuMjMsMjMuODI2SDEyLjA2OWMtMC40OSwwLTAuODg4LTAuMzk2LTAuODg4LTAuODg3YzAtMC40OSwwLjM5OC0wLjg4OCwwLjg4OC0wLjg4OEgzMC4yMyAgICBjMC40OSwwLDAuODg4LDAuMzk3LDAuODg4LDAuODg4QzMxLjExOCwyMy40MywzMC43MiwyMy44MjYsMzAuMjMsMjMuODI2eiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjZmZmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9Im1lbnViYXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD0iTTMwLjIzLDMxLjE3N0gwLjk0NmMtMC40ODksMC0wLjg4Ny0wLjM5Ni0wLjg4Ny0wLjg4N2MwLTAuNDksMC4zOTgtMC44ODgsMC44ODctMC44ODhIMzAuMjMgICAgYzAuNDksMCwwLjg4OCwwLjM5OCwwLjg4OCwwLjg4OEMzMS4xMTgsMzAuNzgsMzAuNzIsMzEuMTc3LDMwLjIzLDMxLjE3N3oiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iI2ZmZiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ic2lkZWJhciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxPjxhIGhyZWY9IiMiPkNyeXB0byBLb2luPC9hPjwvaDE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0idG9nZ2xlX2Nsb3NlIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nY3NzbWVudScgY2xhc3M9IndkX3NpbmdsZV9pbmRleF9tZW51Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPkhvbWU8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjYWJvdXQiPkFib3V0PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2ZlYXR1cmVzIj5GZWF0dXJlczwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNwcm9qZWN0Ij5XaHkgQ3J5cHRvIEtvaW48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjc3RlcHMiPlN0ZXBzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3JvYWRtYXAiPlJvYWQgTWFwPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3BsYW5zIj5QbGFuczwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii91c2VyL2xvZ2luIj5Mb2dpbjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1vYmlsZSBNZW51ICBFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9oZWFkZXI+CiAgICAgICAgPCEtLUhlYWRlciBhcmVhIGVuZCBoZXJlLS0+CiAgICAgICAgPCEtLVNsaWRlciBhcmVhIHN0YXJ0IGhlcmUtLT4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0ic2xpZGVyLWFyZWEiPgogICAgICAgICAgICA8Y2FudmFzPgogICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9ImpzL3RocmVlLmpzIj48L3NjcmlwdD4KICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSJqcy9zdGF0cy5taW4uanMiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9ImpzL1Byb2plY3Rvci5qcyI+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0ianMvQ2FudmFzUmVuZGVyZXIuanMiPjwvc2NyaXB0PgogICAgICAgICAgICA8L2NhbnZhcz4KICAgICAgICAgICAgPGRpdiBpZD0icGFydGljbGVzLWpzIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNhcm91c2VsLWV4YW1wbGUtZ2VuZXJpYyIgY2xhc3M9ImNhcm91c2VsIHNsaWRlIiBkYXRhLXJpZGU9ImNhcm91c2VsIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJvdXNlbC1pbm5lciIgcm9sZT0ibGlzdGJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0gYWN0aXZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcm91c2VsLWNhcHRpb25zIGNhcHRpb24tMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02IGNvbC1tZC02IGNvbC1zbS02IGNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbmltYXRpb249ImFuaW1hdGVkIGJvdW5jZUluRG93biIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2xpZGVyX3NvY2lhbF9pY29uMSI+PGEgaHJlZj0iIyI+PGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmYSBmYS1mYWNlYm9vayI+PC9pPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJbkRvd24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNsaWRlcl9zb2NpYWxfaWNvbjIiPjxhIGhyZWY9IiMiPjxpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZmEgZmEtdHdpdHRlciI+PC9pPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJbkRvd24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNsaWRlcl9zb2NpYWxfaWNvbjMiPjxhIGhyZWY9IiMiPjxpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZmEgZmEtc2VuZC1vIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbmltYXRpb249ImFuaW1hdGVkIGJvdW5jZUluRG93biIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2xpZGVyX3NvY2lhbF9pY29uNCI+PGEgaHJlZj0iIyI+PGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmYSBmYS1iaXRjb2luIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbmltYXRpb249ImFuaW1hdGVkIGJvdW5jZUluRG93biIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2xpZGVyX3NvY2lhbF9pY29uNSI+PGEgaHJlZj0iIyI+PGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmYSBmYS1lbnZlbG9wZSI+PC9pPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgZGF0YS1hbmltYXRpb249ImFuaW1hdGVkIGJvdW5jZUluTGVmdCI+Q3J5cHRvIEtvaW4gLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZml0YWJpbGl0eSA8YnI+b24gdGhlIHJpc2U8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii91c2VyL3JlZ2lzdGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJidG4xIiBkYXRhLWFuaW1hdGlvbj0iYW5pbWF0ZWQgYm91bmNlSW5VcCI+U1RBUlQgVFJBRElORwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3VzZXIvbG9naW4iIGNsYXNzPSJidG4yIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJblVwIj5Mb2dpbjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02IGNvbC1tZC02IGNvbC1zbS02IGNvbC14cy0xMiBoaWRkZW4teHMgaGlkZGVuLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidGNfdGltZXJfc2VjdGlvbl93cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iY2xvY2tkaXYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGF5cyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNtYWxsdGV4dCI+RGF5czwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJob3VycyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNtYWxsdGV4dCI+SG91cnM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWludXRlcyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNtYWxsdGV4dCI+TWludXRlczwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWNvbmRzIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic21hbGx0ZXh0Ij5TZWNvbmRzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNiBjb2wtbWQtNiBjb2wtc20tNiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJbkRvd24iIGNsYXNzPSJzbGlkZXJfc29jaWFsX2ljb24xIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS1mYWNlYm9vayI+PC9pPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1hbmltYXRpb249ImFuaW1hdGVkIGJvdW5jZUluRG93biIgY2xhc3M9InNsaWRlcl9zb2NpYWxfaWNvbjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+PGkgY2xhc3M9ImZhIGZhLXR3aXR0ZXIiPjwvaT48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJbkRvd24iIGNsYXNzPSJzbGlkZXJfc29jaWFsX2ljb24zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS1zZW5kLW8iPjwvaT48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJbkRvd24iIGNsYXNzPSJzbGlkZXJfc29jaWFsX2ljb240Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS1iaXRjb2luIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWFuaW1hdGlvbj0iYW5pbWF0ZWQgYm91bmNlSW5Eb3duIiBjbGFzcz0ic2xpZGVyX3NvY2lhbF9pY29uNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtZW52ZWxvcGUiPjwvaT48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBkYXRhLWFuaW1hdGlvbj0iYW5pbWF0ZWQgYm91bmNlSW5MZWZ0Ij4gQSB0cmFkaW5nIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91ciBmaW5hbmNpYWwgZ29hbHMuPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ0bjEiIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJblVwIj5TVEFSVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBRElORyA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii91c2VyL2xvZ2luIiBjbGFzcz0iYnRuMiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYW5pbWF0aW9uPSJhbmltYXRlZCBib3VuY2VJblVwIj5Mb2dpbjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTYgY29sLW1kLTYgY29sLXNtLTYgY29sLXhzLTEyICBoaWRkZW4teHMgaGlkZGVuLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJ0Y190aW1lcl9zZWN0aW9uX3dyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNsb2NrZGl2MiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGF5cyI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic21hbGx0ZXh0Ij5EYXlzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImhvdXJzIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbWFsbHRleHQiPkhvdXJzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1pbnV0ZXMiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNtYWxsdGV4dCI+TWludXRlczwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWNvbmRzIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbWFsbHRleHQiPlNlY29uZHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcm91c2VsLW5ldmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9InByZXYiIGhyZWY9IiNjYXJvdXNlbC1leGFtcGxlLWdlbmVyaWMiIHJvbGU9ImJ1dHRvbiIgZGF0YS1zbGlkZT0icHJldiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWFuZ2xlLWxlZnQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJuZXh0IiBocmVmPSIjY2Fyb3VzZWwtZXhhbXBsZS1nZW5lcmljIiByb2xlPSJidXR0b24iIGRhdGEtc2xpZGU9Im5leHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1hbmdsZS1yaWdodCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgPCEtLVNsaWRlciBhcmVhIGVuZCBoZXJlLS0+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImN1cnJlbmN5LWFyZWEiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmxpdWQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIgY29sLW1kLTEyIGNvbC1zbS0xMiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXRlLWxpc3QgYnRfdGl0bGUgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj48aW1nIHNyYz0iaW1hZ2VzL2ljb25zLzEucG5nIiBhbHQ9IiI+PHNwYW4+Qml0Y29pbjwvc3Bhbj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4zIj40LjE2MDY1MSBCVEM8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmV0ZS1saXN0IGJ0X3RpdGxlIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4zczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+PGltZyBzcmM9ImltYWdlcy9pY29ucy8yLnBuZyIgYWx0PSIiPjxzcGFuPkV0aGVyZXVtPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bjMiPjMuMjQ1MDAwIEVUSDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXRlLWxpc3QgYnRfdGl0bGUgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuNnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjZzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj48aW1nIHNyYz0iaW1hZ2VzL2ljb25zLzMucG5nIiBhbHQ9IiI+PHNwYW4+RG9sbGFyIChVU0QpPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bjMiPjU4NjM0LjAwMCBVU0Q8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmV0ZS1saXN0IGJ0X3RpdGxlIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjlzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS45czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+PGltZyBzcmM9ImltYWdlcy9pY29ucy80LnBuZyIgYWx0PSIiPjxzcGFuPlRvdGFsIFVTRDwvc3Bhbj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4zIj4xMTE5NjkuMDYyIFVTRDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXRlLWxpc3QgaGlkZGVuLW1kICAgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjIuMXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjFzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj48aW1nIHNyYz0iaW1hZ2VzL2ljb25zLzUucG5nIiBhbHQ9IiI+PHNwYW4+VG9rZW4gU2FsZTwvc3Bhbj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4zIj4zNDY2MzYuNzc1PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgogICAgPC9kaXY+CiAgICA8IS0tQWJvdXQgYXJlYSBzdGFydCBoZXJlLS0+CiAgICA8ZGl2IHNlY3Rpb24tc2Nyb2xsPScxJyBjbGFzcz0id2Rfc2Nyb2xsX3dyYXAiIGlkPSJhYm91dCI+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImFib3V0LWFyZWEgcGQtdDcwIHBkLWIxMDAgamFyYWxsYXggYmctaW1nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTYgY29sLW1kLTYgY29sLXNtLTEyIGNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFib3V0LWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJmLTQwIGZ3LTQwMCB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4wcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij5BYm91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0byBLb2luPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMT5TaXggWWVhcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBJbXBlY2NhYmxlIFNlcnZpY2UuPC9oMT5UaGUgQ3J5cHRvIEtvaW4gY29tcGFueSBoYXMgYmVlbiBvbmUgb2YgdGhlIGxlYWRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubGluZSBicm9rZXJzIHNpbmNlIDIwMTQuIE91ciBkZXZlbG9wZXJzLCBmaW5hbmNpYWwgZXhwZXJ0cywgcGVyc29uYWwsIGFuZCBzdXBwb3J0IG1hbmFnZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbWFraW5nIGV2ZXJ5IGVmZm9ydCB0byBtYWtlIHlvdXIgdHJhZGluZyBtb3JlIGNvbWZvcnRhYmxlIGFuZCBwcm9maXRhYmxlIHllYXIgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuNnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS42czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvIEtvaW4gaXMgYSBjYXRlZ29yeSBBIG1lbWJlciBvZiB0aGUgRmluYW5jaWFsIENvbW1pc3Npb24gKEZpbmFDb20pLCB3aGljaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1zIHRoZSBjb21wYW55J3MgcmVsaWFiaWxpdHkgYW5kIHRoZSBoaWdoIHF1YWxpdHkgb2Ygc2VydmljZXMuIFRoZSBxdWFsaXR5IG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtJ3MgdHJhZGUgZXhlY3V0aW9uIGlzIGNlcnRpZmllZCBieSB0aGUgVmVyaWZ5IE15IFRyYWRlIGluZGVwZW5kZW50IGV4YW1pbmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjlzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuOXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii91c2VyL2xvZ2luIiBjbGFzcz0iYnRuMSI+bG9naW48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3VzZXIvcmVnaXN0ZXIiIGNsYXNzPSJidG4zIj5TVEFSVCBUUkFESU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02IGNvbC1tZC02IGNvbC1zbS0xMiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhYm91dC1pbWcgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvYWJvdXQvMS5wbmciIGFsdD0iIiAvIHN0eWxlPSJ3aWR0aDoyODhweDsgaGVpZ2h0OjM5N3B4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8IS0tQWJvdXQgYXJlYSBlbmQgaGVyZS0tPgogICAgICAgIDxkaXYgY2xhc3M9InN1ZCI+CiAgICAgICAgICAgIDxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTkyMCAxODEuMSIKICAgICAgICAgICAgICAgIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE5MjAgMTgxLjE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KICAgICAgICAgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgICAgICAgICAgICAgLnN0MCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwtcnVsZTogZXZlbm9kZDsKICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC1ydWxlOiBldmVub2RkOwogICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAjMTAxMjJkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICAgICAgICA8Zz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCw4MGMwLDAsMjguOS00LjIsNDMtMTNjMTQuMy05LDcxLTM1LjcsMTM3LDVjMTcuMyw3LjcsMzMuMywxMyw0OCwxMWMxNy4zLDAuMyw1MC4zLDQuNyw2NiwyMwogICAgICAgICAgICAgICAgICAgICBjMjAuMyw5LjcsNjgsNDAuMywxMzQtMTJjMjQtMTEsNTktMTYuMywxMDQsMmMyMSw3LjMsODUsMjcuNywxMTctMTRjMjQtMzAuNyw2Mi43LTU1LDE0MS0xMmMyNiwxMC4zLDcyLDE0LjcsMTEwLTE0CiAgICAgICAgICAgICAgICAgICAgIGMzNy43LTE5LDg5LjctMjksMTIyLDUzYzIzLDMyLjcsNDcuNyw2Ni4zLDk3LDI2YzI0LTIyLjcsNTEtNzguMywxMzctMzhjMCwwLDI4LjMsMTUuNyw1MiwxNWMyMy43LTAuNyw1MC43LDQuMyw3Niw0MQogICAgICAgICAgICAgICAgICAgICBjMTkuNywxOS43LDcxLDM2LjcsMTIxLTJjMCwwLDIyLjMtMTYsNTUtMTJjMCwwLDMyLjcsNi43LDU2LTcxYzIzLjMtNzYsNzktOTIsMTIyLTI5YzkuMywxMy43LDI1LDQyLDYyLDQzYzM3LDEsNTEuNywyNS4zLDY3LDQ4CiAgICAgICAgICAgICAgICAgICAgIGMxNS4zLDIyLjcsNTEsMjIuNyw1MywyM3YyOC4xSDBWODB6IiAvPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBzZWN0aW9uLXNjcm9sbD0nMicgY2xhc3M9IndkX3Njcm9sbF93cmFwIiBpZD0iZmVhdHVyZXMiPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJmZWF0dXJlcy1hcmVhIHNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGlkPSJmZWF0dXJlcy1qcyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xMiBjb2wtbWQtMTIgY29sLXNtLTEyIGNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWhlYWRpbmcyIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjBzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuMHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5PdXIgRmVhdHVyZXM8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xMiBjb2wtbWQtMTIgY29sLXNtLTEyIGNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlZC1saXN0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBwZC0wIGhpZGRlbi14cyB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIxLjNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuM3M7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnRzLWwgbXItYjMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkVhc2UgRnVuZGluZzwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkdldCB5b3VyIGFjY29vdW50IGZ1bmRlZCB3aXRoIGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3VzZXIvcmVnaXN0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYnRuMSI+R2V0IFN0YXJ0ZWQ8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IHBkLTAgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuM3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4zczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1ncy1sIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZT48aW1nIHNyYz0iaW1hZ2VzL2ZlYXR1cmVzLzEucG5nIiBhbHQ9IiIgLz48L2ZpZ3VyZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTYgcGQtMCB2aXNpYmxlLXhzICB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIxLjNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuM3M7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnRzLWwgbXItYjMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkVhc2UgRnVuZGluZzwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkdldCB5b3VyIGFjY29vdW50IGZ1bmRlZCB3aXRoIGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3VzZXIvcmVnaXN0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYnRuMSI+R2V0IFN0YXJ0ZWQ8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJybCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBwZC0wIGZsb2F0cmlnaHQgbXItYjMwIGhpZGRlbi14cyB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIxLjZzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuNnM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnRzLXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+RXhjaGFuZ2UgTW9uZXk8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5FeGNoYW5nZSBiZXR3ZWVuIGFsbCBwb3B1bGFyIGN1cnJlbmNpZXMgd2l0aCBhIGNvdXBsZSBvZiBjbGlja3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+SW5zdGFudCBzZW5kIGZyb20gb25lIGN1cnJlbmN5IHRvIGFub3RoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3VzZXIvcmVnaXN0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYnRuMSI+R2V0IFN0YXJ0ZWQ8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IHBkLTAgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuNnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS42czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1ncy1yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZT48aW1nIHNyYz0iaW1hZ2VzL2ZlYXR1cmVzLzIucG5nIiBhbHQ9IiIgLz48L2ZpZ3VyZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTYgcGQtMCBmbG9hdHJpZ2h0IG1yLWIzMCB2aXNpYmxlLXhzIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjEuNnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS42czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudHMtciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5FeGNoYW5nZSBNb25leTwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkV4Y2hhbmdlIGJldHdlZW4gYWxsIHBvcHVsYXIgY3VycmVuY2llcyB3aXRoIGEgY291cGxlIG9mIGNsaWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5JbnN0YW50IHNlbmQgZnJvbSBvbmUgY3VycmVuY3kgdG8gYW5vdGhlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvdXNlci9yZWdpc3RlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJidG4xIj5HZXQgU3RhcnRlZDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBwZC0wIGhpZGRlbi14cyB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIxLjlzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuOXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnRzLWwgbXItYjMwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkludmVzdG1lbnQ8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QdXJjaGFzZSBhIHBsYW4gYW5kIHdhdGNoIHlvdXIgaW52ZXN0bWVudCBncm93LjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL3VzZXIvcmVnaXN0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iYnRuMSI+R2V0IFN0YXJ0ZWQ8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IHBkLTAgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuOXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS45czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1ncy1sIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZT48aW1nIHNyYz0iaW1hZ2VzL2ZlYXR1cmVzLzMucG5nIiBhbHQ9IiIgLz48L2ZpZ3VyZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTYgcGQtMCB2aXNpYmxlLXhzIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjEuOXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS45czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudHMtbCBtci1iMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+SW52ZXN0bWVudDwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkltcHJvdmVkIHN5c3RlbSBvZiBib3Jyb3dlcidzIHZlcmlmaWNhdGlvbi4gUHJvdmlkaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+dmVyaWZpY2F0aW9uIHNlcnZpY2VzIGZvciBvdGhlciBzZXJ2aWNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvdXNlci9yZWdpc3RlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJidG4xIj5HZXQgU3RhcnRlZDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InJsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IHBkLTAgZmxvYXRyaWdodCBtci1iMzAgaGlkZGVuLXhzIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjIuMXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMi4xczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudHMtciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5PbmxpbmUgV2FsbGV0PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+S2VlcCB5b3VyIG1vbmV5LCBleGNoYW5nZSB5b3VyIG1vbmV5LCBpbnZlc3QgeW91ciBtb25leSwgcGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+c2VydmljZXMgYW5kIG1ha2UgcHVyY2hhc2VzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii91c2VyL3JlZ2lzdGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImJ0bjEiPkdldCBTdGFydGVkPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBwZC0wIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIyLjFzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuMXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MtciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWd1cmU+PGltZyBzcmM9ImltYWdlcy9mZWF0dXJlcy80LnBuZyIgYWx0PSIiIC8+PC9maWd1cmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IHBkLTAgZmxvYXRyaWdodCBtci1iMzAgdmlzaWJsZS14cyB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIyLjFzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuMXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnRzLXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+T25saW5lIFdhbGxldDwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPktlZXAgeW91ciBtb25leSwgZXhjaGFuZ2UgeW91ciBtb25leSwgaW52ZXN0IHlvdXIgbW9uZXksIHBheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPnNlcnZpY2VzIGFuZCBtYWtlIHB1cmNoYXNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvdXNlci9yZWdpc3RlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJidG4xIj5HZXQgU3RhcnRlZDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgogICAgPC9kaXY+CiAgICA8ZGl2IHNlY3Rpb24tc2Nyb2xsPSczJyBjbGFzcz0id2Rfc2Nyb2xsX3dyYXAiIGlkPSJwcm9qZWN0Ij4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0icHJvamVjdHMgYmctaW1nIHBkLXQxMDAgcGQtYjcwIGphcmFsbGF4Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLXhzLTEyIHRleHQtY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1oZWFkaW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4wczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+V2h5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvIEtvaW48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNCBjb2wtbWQtNCBjb2wtc20tNiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWxpc3Qgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29ucyI+PGltZyBzcmM9ImltYWdlcy9pY29ucy82LnBuZyIgYWx0PSIiIC8+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5CbG9ja2NoYWluIDxicj5UZWNobm9sb2d5PC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNCBjb2wtbWQtNCBjb2wtc20tNiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWxpc3Qgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuM3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29ucyI+PGltZyBzcmM9ImltYWdlcy9pY29ucy83LnBuZyIgYWx0PSIiIC8+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5BZHZhbmNlZCA8YnI+U2VjdXJpdHkgU3lzdGVtPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNCBjb2wtbWQtNCBjb2wtc20tNiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWxpc3Qgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuNnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjZzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29ucyI+PGltZyBzcmM9ImltYWdlcy9pY29ucy84LnBuZyIgYWx0PSIiIC8+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5NdWx0aWN1cnJlbmN5IDxicj5Db2luczwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTQgY29sLW1kLTQgY29sLXNtLTYgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvamVjdC1saXN0IHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjlzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS45czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbnMiPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvOS5wbmciIGFsdD0iIiAvPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SW50ZXJuYWwgPGJyPkV4Y2hhbmdlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNCBjb2wtbWQtNCBjb2wtc20tNiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWxpc3Qgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjIuMXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjFzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29ucyI+PGltZyBzcmM9ImltYWdlcy9pY29ucy8xMC5wbmciIGFsdD0iIiAvPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+U2FmZXR5IDxicj5GdW5kPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNCBjb2wtbWQtNCBjb2wtc20tNiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9qZWN0LWxpc3Qgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjIuNHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjRzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpY29ucyI+PGltZyBzcmM9ImltYWdlcy9pY29ucy8xMS5wbmciIGFsdD0iIiAvPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Q29vcGVyYXRpb24gPGJyPldpdGggQXJiaXRyYXRpb248L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgIDwvZGl2PgogICAgPGRpdiBzZWN0aW9uLXNjcm9sbD0nNCcgY2xhc3M9IndkX3Njcm9sbF93cmFwIiBpZD0ic3RlcHMiPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJzdGVwcy1hcmVhIHNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGlkPSJzdGVwcy1qcyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xMSBjb2wtbWQtMTEgY29sLXNtLTEyIGNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwcy1oZWFkaW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjBzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV0J3MgVGFrZSBZb3UgRm9yIGEgV2FsazwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQtY29uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2Nyb2xsIERvd248L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGRhdGEtc2Nyb2xsIGRhdGEtb3B0aW9ucz0neyAic3BlZWQiOiAxMDAgfScgaHJlZj0iI3N0ZXBzIj48aQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJmYSBmYS1hbmdsZS1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8c2VjdGlvbiBpZD0ic3RlcHMiIGNsYXNzPSJzdGVwcy1kZXRhaWxzIGJnLW1nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEwIGNvbC1tZC0xMCBjb2wtc20tMTIgY29sLXhzLTEyIGNvbC1tZC1vZmZzZXQtMSBjb2wtbGctb2Zmc2V0LTEiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwcy1jb250Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImwtY29uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udCB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4wcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuMHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjAxLiBSZWdpc3RyYXRpb24gT24gVGhlIFBsYXRmb3JtPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkdldCBzdGFydGVkIHNpbXBseSBieSBmaWxsaW5nIG9uZSBhbmQgdHdvIGlucHV0cy4gPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVzZXJzIj48L2k+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJyLWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnQgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuM3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4wMi4gR2V0IFJlYWR5PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkN5cHRvIGtvaW4uIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibC1jb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250IHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjZzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS42czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+MDMuIENyZWF0ZSBZb3VyIEZpcnN0IEZ1bmRpbmc8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+TWFrZSBzZWN1cmUgZGVwb3NpdCBpbnRvIHlvdXIgYWNjb3VudC4gPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWVkaXQgIj48L2k+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaWQtaWNvbnMiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJyLWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnQgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuOXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjlzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4wNC4gUHVyY2hhc2UgYSBQbGFuPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBpY2sgZnJvbSBvdXIgdmFyaWV0eSBvZiBmbGV4aWJsZSBwbGFucyB0byBzdGFydCB0cmFkaW5nL2ludmVzdGluZy4gPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXVuaXZlcnNpdHkiPjwvaT48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImwtY29uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udCB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMi4xcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuMXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjA1LiBHbyBsaXZlPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPldhdGNoIHlvdXIgaW52ZXN0bWVudCBnbyBsaXZlIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1iZWxsIj48L2k+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJyLWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnQgd293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjIuNHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOjIuNHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjA2LiBSZWNlaXZpbmcgRnVuZHM8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+R2V0IGNyZWRpdGVkIGFmdGVyIHRyYWRpbmcgdGltZSBlbGFwc2VzLiA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGF3Ij48L2k+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgPGRpdiBjbGFzcz0ic3VkIj4KICAgICAgICAgICAgPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCAxOTIwIDE4MS4xIgogICAgICAgICAgICAgICAgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTkyMCAxODEuMTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgogICAgICAgICAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgICAgICAgICAgICAgICAuc3QwIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICAgICAgICAgICAgICAgICAgICBjbGlwLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICMxMDEyMmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgPC9zdHlsZT4KICAgICAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0wLDgwYzAsMCwyOC45LTQuMiw0My0xM2MxNC4zLTksNzEtMzUuNywxMzcsNWMxNy4zLDcuNywzMy4zLDEzLDQ4LDExYzE3LjMsMC4zLDUwLjMsNC43LDY2LDIzCiAgICAgICAgICAgICAgICAgICAgIGMyMC4zLDkuNyw2OCw0MC4zLDEzNC0xMmMyNC0xMSw1OS0xNi4zLDEwNCwyYzIxLDcuMyw4NSwyNy43LDExNy0xNGMyNC0zMC43LDYyLjctNTUsMTQxLTEyYzI2LDEwLjMsNzIsMTQuNywxMTAtMTQKICAgICAgICAgICAgICAgICAgICAgYzM3LjctMTksODkuNy0yOSwxMjIsNTNjMjMsMzIuNyw0Ny43LDY2LjMsOTcsMjZjMjQtMjIuNyw1MS03OC4zLDEzNy0zOGMwLDAsMjguMywxNS43LDUyLDE1YzIzLjctMC43LDUwLjcsNC4zLDc2LDQxCiAgICAgICAgICAgICAgICAgICAgIGMxOS43LDE5LjcsNzEsMzYuNywxMjEtMmMwLDAsMjIuMy0xNiw1NS0xMmMwLDAsMzIuNyw2LjcsNTYtNzFjMjMuMy03Niw3OS05MiwxMjItMjljOS4zLDEzLjcsMjUsNDIsNjIsNDNjMzcsMSw1MS43LDI1LjMsNjcsNDgKICAgICAgICAgICAgICAgICAgICAgYzE1LjMsMjIuNyw1MSwyMi43LDUzLDIzdjI4LjFIMFY4MHoiIC8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IHNlY3Rpb24tc2Nyb2xsPSc1JyBjbGFzcz0id2Rfc2Nyb2xsX3dyYXAiIGlkPSJyb2FkbWFwIj4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0idmlkZW8tYXJlYSBzZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBpZD0idmlkZW8tanMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIgY29sLW1kLTEyIGNvbC1zbS0xMiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmlkZW9zLWhlZGluZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4wcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4wczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmVsb3BtZW50IG9mIENyeXB0byBLb2luIFBsYXRmb3JtPGJyPihSb2FkIE1hcCk8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZpZGVvcy1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlkZW8gaWQ9Im15LXZpZGVvIiBjbGFzcz0idmlkZW8tanMiIGNvbnRyb2xzIHByZWxvYWQ9ImF1dG8iIHdpZHRoPSI3NzAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjQwMCIgcG9zdGVyPSJpbWFnZXMvdmlkZW8vMTIucG5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1zZXR1cD0neyAidGVjaE9yZGVyIjogWyJ5b3V0dWJlIl0sICJzb3VyY2VzIjogW3sgInR5cGUiOiAidmlkZW8veW91dHViZSIsICJzcmMiOiAiIyJ9XSwgInlvdXR1YmUiOiB7ICJjdXN0b21WYXJzIjogeyAid21vZGUiOiAidHJhbnNwYXJlbnQiIH0gfSB9Jz4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmlkZW8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgogICAgICAgIDxkaXYgY2xhc3M9IndkX3Njcm9sbF93cmFwIj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9InZpZGVvLWRlcyBiZy1pbWcgIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlc2xpZHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InllYXJzIj48c3BhbiBjbGFzcz0iY29uIj4yMDIwPC9zcGFuPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlcmlhbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcmUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wteHMtMTIgbGVmdC1jb24gd293ICBmYWRlSW5VcCBhbmltYXRlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjEuMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuMHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3gtY29uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1ncyI+PGltZyBzcmM9ImltYWdlcy92aWRlby8yLnBuZyIgYWx0PSIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPklkZWE8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+KFNlcHRlbWJlciAtIE9jdG9iZXIpPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wteHMtMTIgcmlnaHQtY29uICB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXdvdy1kdXJhdGlvbj0iMS4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4zczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1jb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5NYXJrZXQgUmVzZWFyY2g8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+KE9jdG9iZXIgLSBEZWNlbWJlcik8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MiPjxpbWcgc3JjPSJpbWFnZXMvdmlkZW8vMy5wbmciIGFsdD0iIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ieWVhcnMiPjxzcGFuIGNsYXNzPSJjb24iPjIwMjA8L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VyaWFscyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNyZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IGNvbC14cy0xMiBsZWZ0LWNvbiB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXdvdy1kdXJhdGlvbj0iMS42cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS42czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1jb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWdzIj48aW1nIHNyYz0iaW1hZ2VzL3ZpZGVvLzMucG5nIiBhbHQ9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4oMVEgMjAyMCk8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Rm9ybWF0aW9uIG9mIGZvdW5kZXJzdGVhbSBCdXNpbmVzcyBwbGFuPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTYgY29sLXhzLTEyIHJpZ2h0LWNvbiB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXdvdy1kdXJhdGlvbj0iMS45cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS45czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1jb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPigyUSAyMDIwKTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5TdGFydCBvZiBQbGF0Zm9ybTxicj4gRGV2ZWxvcG1lbnQ8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWdzIj48aW1nIHNyYz0iaW1hZ2VzL3ZpZGVvLzQucG5nIiBhbHQ9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlcmlhbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcmUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wteHMtMTIgbGVmdC1jb24gd293ICBmYWRlSW5VcCBhbmltYXRlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjIuMXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuMXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3gtY29uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1ncyI+PGltZyBzcmM9ImltYWdlcy92aWRlby81LnBuZyIgYWx0PSIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+KDNRIDIwMjApPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPldoaXRlUGFwZXI8YnI+IExhbmRpbmcgcGFnZTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02IGNvbC14cy0xMiByaWdodC1jb24gd293ICBmYWRlSW5VcCBhbmltYXRlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjIuMXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuMXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3gtY29uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRsZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4oNFEgMjAyMCk8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+UHJlLVNhbGU8YnI+TGF1bmNoIFBsYXRmb3JtPGJyPmluIGJldGEgdGVzdCBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWdzIj48aW1nIHNyYz0iaW1hZ2VzL3ZpZGVvLzYucG5nIiBhbHQ9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InllYXJzIj48c3BhbiBjbGFzcz0iY29uIj4yMDIwPC9zcGFuPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlcmlhbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcmUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNiBjb2wteHMtMTIgbGVmdC1jb24gIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIyLjNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm94LWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkbGVmdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MiPjxpbWcgc3JjPSJpbWFnZXMvdmlkZW8vNy5wbmciIGFsdD0iIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPigxUSAyMDIwKTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5JQ08gTGF1bmNoPGJyPklkZW50aWZpY2F0aW9uPGJyPlN5c3RlbXNhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrPGJyPndpdGggQVBJIFBhcnRuZXJzPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTYgY29sLXhzLTEyIHJpZ2h0LWNvbiB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXdvdy1kdXJhdGlvbj0iMi4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMi4zczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1jb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGxlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPigyUSAyMDIwKTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5MYXVuY2ggdGhlPGJyPlBsYXRmb3JtIGluPGJyPkZ1bGwgbW9kZTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MiPjxpbWcgc3JjPSJpbWFnZXMvdmlkZW8vOC5wbmciIGFsdD0iIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VyaWFscyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTEyIGNvbC14cy0xMiBjZW50ZXItY29uIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIyLjVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjVzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm94LWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkbGVmdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MiPjxpbWcgc3JjPSJpbWFnZXMvdmlkZW8vOS5wbmciIGFsdD0iIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPig0USAyMDIwKTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5Fc3RhYmxpc2hpbmc8YnI+UmVwcmVzZW50YXRpdmU8YnI+T2ZmaWNlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdWQiPgogICAgICAgICAgICA8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICAgICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDE5MjAgMTgxLjEiCiAgICAgICAgICAgICAgICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxOTIwIDE4MS4xOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CiAgICAgICAgICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgICAgICAgICAgICAgIC5zdDAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZTogZXZlbm9kZDsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogIzEwMTIyZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICA8L3N0eWxlPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MCIgZD0iTTAsODBjMCwwLDI4LjktNC4yLDQzLTEzYzE0LjMtOSw3MS0zNS43LDEzNyw1YzE3LjMsNy43LDMzLjMsMTMsNDgsMTFjMTcuMywwLjMsNTAuMyw0LjcsNjYsMjMKICAgICAgICAgICAgICAgICAgICAgICAgYzIwLjMsOS43LDY4LDQwLjMsMTM0LTEyYzI0LTExLDU5LTE2LjMsMTA0LDJjMjEsNy4zLDg1LDI3LjcsMTE3LTE0YzI0LTMwLjcsNjIuNy01NSwxNDEtMTJjMjYsMTAuMyw3MiwxNC43LDExMC0xNAogICAgICAgICAgICAgICAgICAgICAgICBjMzcuNy0xOSw4OS43LTI5LDEyMiw1M2MyMywzMi43LDQ3LjcsNjYuMyw5NywyNmMyNC0yMi43LDUxLTc4LjMsMTM3LTM4YzAsMCwyOC4zLDE1LjcsNTIsMTVjMjMuNy0wLjcsNTAuNyw0LjMsNzYsNDEKICAgICAgICAgICAgICAgICAgICAgICAgYzE5LjcsMTkuNyw3MSwzNi43LDEyMS0yYzAsMCwyMi4zLTE2LDU1LTEyYzAsMCwzMi43LDYuNyw1Ni03MWMyMy4zLTc2LDc5LTkyLDEyMi0yOWM5LjMsMTMuNywyNSw0Miw2Miw0M2MzNywxLDUxLjcsMjUuMyw2Nyw0OAogICAgICAgICAgICAgICAgICAgICAgICBjMTUuMywyMi43LDUxLDIyLjcsNTMsMjN2MjguMUgwVjgweiIgLz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IHNlY3Rpb24tc2Nyb2xsPSc2JyBjbGFzcz0id2Rfc2Nyb2xsX3dyYXAiIGlkPSJwbGFucyI+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9InRva2Vucy1hcmVhIHNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGlkPSJ0b2tlbi1qcyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy0xMiBjb2wtbWQtMTIgY29sLXNtLTEyIGNvbC14cy0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWhlYWRpbmcyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjBzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij5PdXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbnM8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTAgY29sLW1kLTkgY29sLXNtLTEyIGNvbC14cy0xMiBjb2wtbGctb2Zmc2V0LTEgY29sLW1kLW9mZnNldC0xIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy02IGNvbC1tZC02IGNvbC1zbS02IGNvbC14cy0xMiB0ZXh0LXJpZ2h0IHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS13b3ctZHVyYXRpb249IjEuM3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4zczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW5zIG1yLWw1MCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLW5hbWUiPlJlZ3VsYXI8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4gMTYwMCU8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj5NaW4uIFBvc3NpYmxlIGRlcG9zaXQ6ICQ1MC4wMDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj5NYXguIFBvc3NpYmxlIGRlcG9zaXQ6ICQ5MDAuMDA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iZi0yMCI+MSBkYXlzIFByb2ZpdCBDeWNsZTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj4yNC83IEN1c3RvbWVyIFNlcnZpY2U8L2gzPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGVmdC1idG4iPjxhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii91c2VyL3JlZ2lzdGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iY29sb3I6ICNmZmYiPkJVWSBOT1c8L2E+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTYgY29sLW1kLTYgY29sLXNtLTYgY29sLXhzLTEyIHRleHQtcmlnaHQgd293ICBmYWRlSW5VcCBhbmltYXRlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXdvdy1kdXJhdGlvbj0iMS4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbnMgbXItbDUwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+U3RhbmRhcmQ8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4gMTYwMCU8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj5NaW4uIFBvc3NpYmxlIGRlcG9zaXQ6ICQxLDAwMC4wMDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj5NYXguIFBvc3NpYmxlIGRlcG9zaXQ6ICQ5LDAwMC4wMDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj4zIGRheXMgUHJvZml0IEN5Y2xlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9ImYtMjAiPjI0LzcgQ3VzdG9tZXIgU2VydmljZTwvaDM+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsZWZ0LWJ0biI+PGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3VzZXIvcmVnaXN0ZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJjb2xvcjogI2ZmZiI+QlVZIE5PVzwvYT48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNiBjb2wtbWQtNiBjb2wtc20tNiBjb2wteHMtMTIgdGV4dC1yaWdodCB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtd293LWR1cmF0aW9uPSIxLjNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuM3M7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VucyBtci1sNTAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbi1uYW1lIj5Hb2xkPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IDE3MDAlPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcmljZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iZi0yMCI+TWluLiBQb3NzaWJsZSBkZXBvc2l0OiAkMTAsMDAwLjAwPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9ImYtMjAiPk1heC4gUG9zc2libGUgZGVwb3NpdDogJDEwLDAwMCwwMDAuMDA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iZi0yMCI+NyBkYXlzIFByb2ZpdCBDeWNsZTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj4yNC83IEN1c3RvbWVyIFNlcnZpY2U8L2gzPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGVmdC1idG4iPjxhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii91c2VyL3JlZ2lzdGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iY29sb3I6ICNmZmYiPkJVWSBOT1c8L2E+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTYgY29sLW1kLTYgY29sLXNtLTYgY29sLXhzLTEyIHRleHQtcmlnaHQgd293ICBmYWRlSW5VcCBhbmltYXRlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXdvdy1kdXJhdGlvbj0iMS4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2tlbnMgbXItbDUwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9rZW4tbmFtZSI+UHJlbWl1bSBwbGFuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VuLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+IDEyJTwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJpY2VzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9ImYtMjAiPk1pbi4gUG9zc2libGUgZGVwb3NpdDogJDAuMDA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iZi0yMCI+TWF4LiBQb3NzaWJsZSBkZXBvc2l0OiAkMC4wMDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj4zMCBkYXlzIFByb2ZpdCBDeWNsZTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJmLTIwIj4yNC83IEN1c3RvbWVyIFNlcnZpY2U8L2gzPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGVmdC1idG4iPjxhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii91c2VyL3JlZ2lzdGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iY29sb3I6ICNmZmYiPkJVWSBOT1c8L2E+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLXhzLTEyIHRleHQtY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0idG9rZW4tY29uIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjlzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjlzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJ0b2tlbi1kZXRhaWxzIHNlY3Rpb24gYmctaW1nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi1oZWFkaW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuMHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4wczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uIG9mIFRva2VuczwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1sZy04IGNvbC1tZC04IGNvbC1zbS0xMiBjb2wteHMtMTIgY29sLWxnLW9mZnNldC0yIGNvbC1tZC1vZmZzZXQtMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRva2VzLWNoYXJ0LXNsaWRlciB3b3cgYW5pbWF0ZSBmYWRlSW4iIGRhdGEtd293LWR1cmF0aW9uPSIxcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJ0LWxpc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYXJ0IGNvbC1zbS02Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZV9jaGFydF8zIiBjbGFzcz0iIiBzdHlsZT0iaGVpZ2h0OjQwMHB4OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MiPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvbC5wbmciIGFsdD0iIiAvPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwtY2hhdHJzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxzaXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2xhYmVscy10ZXh0Ij44NSU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIHBhcnRpY2lwYW50cyBvZiBQcmUtU2FsZSBhbmQgSUNPPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsc2l0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNsYWJlbHMtdGV4dCI+OCU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UmVzZXJ2ZWQgZm9yIHRoZSB0ZWFtLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibHNpdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjbGFiZWxzLXRleHQiPjQlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlJlc2VydmVkIGZvciB0aGUgY29uc3VsdGFudHMuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsc2l0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNsYWJlbHMtdGV4dCI+MyU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Qm91bnR5IGNhbXBhaWduPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJ0LWxpc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoYXJ0IGNvbC1zbS02Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZV9jaGFydF8yIiBjbGFzcz0iIiBzdHlsZT0iaGVpZ2h0OjQwMHB4OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltZ3MiPjxpbWcgc3JjPSJpbWFnZXMvaWNvbnMvbC5wbmciIGFsdD0iIiAvPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS02Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwtY2hhdHJzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxzaXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2xhYmVscy10ZXh0Ij44NSU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIHBhcnRpY2lwYW50cyBvZiBQcmUtU2FsZSBhbmQgSUNPPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsc2l0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNsYWJlbHMtdGV4dCI+OCU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UmVzZXJ2ZWQgZm9yIHRoZSB0ZWFtLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibHNpdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjbGFiZWxzLXRleHQiPjQlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlJlc2VydmVkIGZvciB0aGUgY29uc3VsdGFudHMuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsc2l0cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNsYWJlbHMtdGV4dCI+MyU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Qm91bnR5IGNhbXBhaWduPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdWQiPgogICAgICAgICAgICA8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICAgICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDE5MjAgMTgxLjEiCiAgICAgICAgICAgICAgICBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxOTIwIDE4MS4xOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CiAgICAgICAgICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgICAgICAgICAgICAgIC5zdDAgewogICAgICAgICAgICAgICAgICAgICAgICBmaWxsLXJ1bGU6IGV2ZW5vZGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZTogZXZlbm9kZDsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogIzEwMTIyZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICA8L3N0eWxlPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9InN0MCIgZD0iTTAsODBjMCwwLDI4LjktNC4yLDQzLTEzYzE0LjMtOSw3MS0zNS43LDEzNyw1YzE3LjMsNy43LDMzLjMsMTMsNDgsMTFjMTcuMywwLjMsNTAuMyw0LjcsNjYsMjMKICAgICAgICAgICAgICAgICAgICAgYzIwLjMsOS43LDY4LDQwLjMsMTM0LTEyYzI0LTExLDU5LTE2LjMsMTA0LDJjMjEsNy4zLDg1LDI3LjcsMTE3LTE0YzI0LTMwLjcsNjIuNy01NSwxNDEtMTJjMjYsMTAuMyw3MiwxNC43LDExMC0xNAogICAgICAgICAgICAgICAgICAgICBjMzcuNy0xOSw4OS43LTI5LDEyMiw1M2MyMywzMi43LDQ3LjcsNjYuMyw5NywyNmMyNC0yMi43LDUxLTc4LjMsMTM3LTM4YzAsMCwyOC4zLDE1LjcsNTIsMTVjMjMuNy0wLjcsNTAuNyw0LjMsNzYsNDEKICAgICAgICAgICAgICAgICAgICAgYzE5LjcsMTkuNyw3MSwzNi43LDEyMS0yYzAsMCwyMi4zLTE2LDU1LTEyYzAsMCwzMi43LDYuNyw1Ni03MWMyMy4zLTc2LDc5LTkyLDEyMi0yOWM5LjMsMTMuNywyNSw0Miw2Miw0M2MzNywxLDUxLjcsMjUuMyw2Nyw0OAogICAgICAgICAgICAgICAgICAgICBjMTUuMywyMi43LDUxLDIyLjcsNTMsMjN2MjguMUgwVjgweiIgLz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9kaXY+CgoKICAgIDwvZGl2PgogICAgPGRpdiBzZWN0aW9uLXNjcm9sbD0nNycgY2xhc3M9IndkX3Njcm9sbF93cmFwIj4KCiAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1lZGlhLWFyZWEgc2VjdGlvbiBiZy1pbWcgamFyYWxsYXgiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIgY29sLW1kLTEyIGNvbC1zbS0xMiBjb2wteHMtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWhlYWRpbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4wcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij5ObwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cy4gTm8gY29tbWlzc2lvbi4gTm8gZGVsYXlzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTggY29sLW1kLTggY29sLXNtLTEyIGNvbC14cy0xMiBjb2wtbGctb2Zmc2V0LTIgY29sLW1kLW9mZnNldC0yIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVkaWFicmFuZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4zczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpbWcgc3JjPSJpbWFnZXMvbWVkaWEvMS5wbmciIGFsdD0iIiAvPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuNnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuNnM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aW1nIHNyYz0iaW1hZ2VzL21lZGlhLzIucG5nIiBhbHQ9IiIgLz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjlzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjlzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+PGltZyBzcmM9ImltYWdlcy9tZWRpYS8zLnBuZyIgYWx0PSIiIC8+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMi4xcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMi4xczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpbWcgc3JjPSJpbWFnZXMvbWVkaWEvNC5wbmciIGFsdD0iIiAvPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjIuNHMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuNHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aW1nIHNyYz0iaW1hZ2VzL21lZGlhLzUucG5nIiBhbHQ9IiIgLz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIyLjdzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjdzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyI+PGltZyBzcmM9ImltYWdlcy9tZWRpYS82LnBuZyIgYWx0PSIiIC8+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMi43cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMi43czsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpbWcgc3JjPSJpbWFnZXMvbWVkaWEvNy5wbmciIGFsdD0iIiAvPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjIuN3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuN3M7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aW1nIHNyYz0iaW1hZ2VzL21lZGlhLzgucG5nIiBhbHQ9IiIgLz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8IS0tRm9vdGVyIGFyZWEgc3RhcnQgaGVyZS0tPgogICAgICAgIDxmb290ZXIgY2xhc3M9InRvcC1mb28iPgogICAgICAgICAgICA8ZGl2IGlkPSJmb290ZXItanMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXRvcCBzZWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjBzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS4wczsgYW5pbWF0aW9uLW5hbWU6IGZhZGVJblVwOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzY3JpYmUgdG8gdXMhPC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS4zcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjNzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtZmFjZWJvb2siPjwvaT48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0id293ICBmYWRlSW5VcCBhbmltYXRlZCIgZGF0YS13b3ctZHVyYXRpb249IjEuNXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9InZpc2liaWxpdHk6IHZpc2libGU7IGFuaW1hdGlvbi1kdXJhdGlvbjogMS41OyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtdHdpdHRlciI+PC9pPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS45cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjlzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtc2VuZC1vIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIyLjFzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuMXM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS1iaXRjb2luIj48L2k+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IndvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIyLjRzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDIuNHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS1lbnZlbG9wZSI+PC9pPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIGNvbC1tZC0xMiBjb2wtc20tMTIgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWFyY2hfYnRtIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIyLjZzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAyLjZzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoX21haW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJlbnRlciB5b3VyIGVtYWlsIGFkZHJlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiPnN1YnNjcmliZTwvYnV0dG9uPgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZm9vdGVyPgogICAgICAgIDxmb290ZXI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgIDxwPlRoZSBUcmFuc2FjdGlvbnMgb2ZmZXJlZCBieSB0aGlzIFdlYnNpdGUgY2FuIGJlIGV4ZWN1dGVkIG9ubHkgYnkgZnVsbHkgY29tcGV0ZW50IGFkdWx0cy4KICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25zIHdpdGggZmluYW5jaWFsIGluc3RydW1lbnRzIG9mZmVyZWQgb24gdGhlIFdlYnNpdGUgaW52b2x2ZSBzdWJzdGFudGlhbCByaXNrIGFuZAogICAgICAgICAgICAgICAgICAgICAgICB0cmFkaW5nIG1heSBiZSB2ZXJ5IHJpc2t5LiBJZiB5b3UgbWFrZSBUcmFuc2FjdGlvbnMgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RydW1lbnRzIG9mZmVyZWQgb24KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBXZWJzaXRlLCB5b3UgbWlnaHQgaW5jdXIgc3Vic3RhbnRpYWwgbG9zc2VzIG9yIGV2ZW4gbG9zZSBldmVyeXRoaW5nIGluIHlvdXIgQWNjb3VudC4gQmVmb3JlCiAgICAgICAgICAgICAgICAgICAgICAgIHlvdSBkZWNpZGUgdG8gc3RhcnQgVHJhbnNhY3Rpb25zIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0cnVtZW50cyBvZmZlcmVkIG9uIHRoZSBXZWJzaXRlLCB5b3UgbXVzdAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXcgdGhlIFNlcnZpY2UgQWdyZWVtZW50IGFuZCBSaXNrIERpc2Nsb3N1cmUgSW5mb3JtYXRpb24uVGhpcyBXZWJzaXRlIGJlbG9uZ3MgdG8gYW5kIGlzCiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgYnkgU2FsZWRvIEdsb2JhbCBMTEMsIHJlZ2lzdGVyZWQgYXQ6IEZpcnN0IEZsb29yLCBGaXJzdCBTdC4gVmluY2VudCBCYW5rIEx0ZCBCdWlsZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgUC5PLiBCb3ggMTU3NCwgSmFtZXMgU3RyZWV0LCBLaW5nc3Rvd24sIFN0LiBWaW5jZW50ICYgdGhlIEdyZW5hZGluZXMuIFRoZSBhZ2VudHMgYXJlIFZJU0VQT0lOVAogICAgICAgICAgICAgICAgICAgICAgICBMSU1JVEVEOyByZWdpc3RyYXRpb24gTm8uIEMgOTQ3MTYsIHJlZ2lzdGVyZWQgYXQ6IEFDVCAtIEJBUk9OIENPVVJULCBLQVJMVSBHQUxFQSBTVFJFRVQsCiAgICAgICAgICAgICAgICAgICAgICAgIENpdHkvTG9jYWxpdHkgVklDVE9SSUEgKEdPWk8pIFZDVCAyNjA0LCBDb3VudHJ5IE1BTFRBOyBXQUxMRk9SVCBMSU1JVEVEOyByZWdpc3RyYXRpb24gTm8uCiAgICAgICAgICAgICAgICAgICAgICAgIEhFMzY0Njk1LCByZWdpc3RlcmVkIGF0OiBBZ2lhcyBab25pcyAmIFRoZXNzYWxvbmlraXMsIE5JQ09MQU9VIFBFTlRBRFJPTU9TIENFTlRFUiwgNXRoIGZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICBGbGF0L09mZmljZSA1MDNCLCBCTE9DSyBCLCAzMDI2IExpbWFzc29sLCBDeXBydXM8L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb290ZXI+CiAgICAgICAgPGZvb3RlciBjbGFzcz0iZm9vLWJvdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1ib3R0b20iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNiBjb2wtbWQtNiBjb2wtc20tMTIgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvcHlyaWdodCB3b3cgIGZhZGVJblVwIGFuaW1hdGVkIiBkYXRhLXdvdy1kdXJhdGlvbj0iMS45cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmlzaWJpbGl0eTogdmlzaWJsZTsgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjBzOyBhbmltYXRpb24tbmFtZTogZmFkZUluVXA7Ij4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+wqkgMjAxNCDigJQgMjAyNCBDcnlwdG8gS29pbiA8YSBocmVmPSIjIj48c3Bhbj48L3NwYW4+PC9hPiB8IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93ZWJzdHJvdC5jb20vIiB0YXJnZXQ9Il9ibGFuayI+IDxzcGFuPjwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctNiBjb2wtbWQtNiBjb2wtc20tMTIgY29sLXhzLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvby1saW5rIHdvdyAgZmFkZUluVXAgYW5pbWF0ZWQiIGRhdGEtd293LWR1cmF0aW9uPSIxLjBzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2aXNpYmlsaXR5OiB2aXNpYmxlOyBhbmltYXRpb24tZHVyYXRpb246IDEuMHM7IGFuaW1hdGlvbi1uYW1lOiBmYWRlSW5VcDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPldoaXRlUGFwZXI8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPlRlcm1zIG9mIFNlcnZpY2U8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPlByaXZhY3kgUG9saWN5PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb290ZXI+CiAgICA8L2Rpdj4KICAgIDwhLS1Gb290ZXIgYXJlYSBlbmQgaGVyZS0tPgogICAgPCEtLSBhbGwganMgaGVyZSAtLT4KICAgIDwhLS0ganF1ZXJ5IGxhdGVzdCB2ZXJzaW9uIC0tPgogICAgPHNjcmlwdCBzcmM9ImpzL3ZlbmRvci9qcXVlcnktMy4yLjEubWluLmpzIj48L3NjcmlwdD4KICAgIDwhLS0gdGV0aGVyIGpzIC0tPgogICAgPHNjcmlwdCBzcmM9ImpzL3RldGhlci5taW4uanMiPjwvc2NyaXB0PgogICAgPCEtLSBib290c3RyYXAganMgLS0+CiAgICA8c2NyaXB0IHNyYz0ianMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8IS0tIG93bC5jYXJvdXNlbCBqcyAtLT4KICAgIDxzY3JpcHQgc3JjPSJqcy9vd2wuY2Fyb3VzZWwubWluLmpzIj48L3NjcmlwdD4KICAgIDwhLS0gbWVhbm1lbnUganMgLS0+CiAgICA8c2NyaXB0IHNyYz0ianMvanF1ZXJ5Lm1lYW5tZW51LmpzIj48L3NjcmlwdD4KICAgIDwhLS0ganF1ZXJ5LXVpIGpzIC0tPgogICAgPHNjcmlwdCBzcmM9ImpzL2pxdWVyeS11aS5taW4uanMiPjwvc2NyaXB0PgogICAgPCEtLSBlYXN5cGllY2hhcnQganMgLS0+CiAgICA8c2NyaXB0IHNyYz0ianMvanF1ZXJ5LmVhc3lwaWVjaGFydC5taW4uanMiPjwvc2NyaXB0PgogICAgPCEtLSBwYXJ0aWNsZXMganMgLS0+CiAgICA8IS0tIHdvdyBqcyAtLT4KICAgIDxzY3JpcHQgc3JjPSJqcy93b3cubWluLmpzIj48L3NjcmlwdD4KICAgIDwhLS0gc21vb3RoLXNjcm9sbCBqcyAtLT4KICAgIDxzY3JpcHQgc3JjPSJqcy9zbW9vdGgtc2Nyb2xsLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8IS0tIHBsdWdpbnMganMgLS0+CiAgICA8c2NyaXB0IHNyYz0ianMvcGx1Z2lucy5qcyI+PC9zY3JpcHQ+CiAgICA8IS0tIEVDaGFydEpTIEphdmFTY3JpcHQgLS0+CiAgICA8c2NyaXB0IHNyYz0ianMvZWNoYXJ0cy1lbi5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImpzL2VjaGFydHMtbGlxdWlkZmlsbC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImpzL3ZjX3JvdW5kX2NoYXJ0Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvdmlkZW9qcy1pZTgubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJqcy92aWRlby5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ianMvWW91dHViZS5taW4uanMiPjwvc2NyaXB0PgogICAgPCEtLSBtYWluIGpzIC0tPgogICAgPHNjcmlwdCBzcmM9ImpzL21haW4uanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSJqcy9tb2QuanMiPjwvc2NyaXB0PgogICAKPC9ib2R5Pgo8IS0tIFNtYXJ0c3VwcCBMaXZlIENoYXQgc2NyaXB0IC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CnZhciBfc21hcnRzdXBwID0gX3NtYXJ0c3VwcCB8fCB7fTsKX3NtYXJ0c3VwcC5rZXkgPSAnJzsKd2luZG93LnNtYXJ0c3VwcHx8KGZ1bmN0aW9uKGQpIHsKICB2YXIgcyxjLG89c21hcnRzdXBwPWZ1bmN0aW9uKCl7IG8uXy5wdXNoKGFyZ3VtZW50cyl9O28uXz1bXTsKICBzPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO2M9ZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICBjLnR5cGU9J3RleHQvamF2YXNjcmlwdCc7Yy5jaGFyc2V0PSd1dGYtOCc7Yy5hc3luYz10cnVlOwogIGMuc3JjPSdodHRwczovL3d3dy5zbWFydHN1cHBjaGF0LmNvbS9sb2FkZXIuanM/JztzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGMscyk7Cn0pKGRvY3VtZW50KTsKPC9zY3JpcHQ+Cjxub3NjcmlwdD4gUG93ZXJlZCBieSA8YSBocmVmPeKAnGh0dHBzOi8vd3d3LnNtYXJ0c3VwcC5jb23igJ0gdGFyZ2V0PeKAnF9ibGFua+KAnT5TbWFydHN1cHA8L2E+PC9ub3NjcmlwdD4KCjwvaHRtbD4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjwhLS0gU21hcnRzdXBwIExpdmUgQ2hhdCBzY3JpcHQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KdmFyIF9zbWFydHN1cHAgPSBfc21hcnRzdXBwIHx8IHt9Owpfc21hcnRzdXBwLmtleSA9ICcyY2U3NzJlMmM5YzFhNWYwNTQ4NmJjYTJiMmQ2NDI4YWI4MjM3NTZiJzsKd2luZG93LnNtYXJ0c3VwcHx8KGZ1bmN0aW9uKGQpIHsKICB2YXIgcyxjLG89c21hcnRzdXBwPWZ1bmN0aW9uKCl7IG8uXy5wdXNoKGFyZ3VtZW50cyl9O28uXz1bXTsKICBzPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO2M9ZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICBjLnR5cGU9J3RleHQvamF2YXNjcmlwdCc7Yy5jaGFyc2V0PSd1dGYtOCc7Yy5hc3luYz10cnVlOwogIGMuc3JjPSdodHRwczovL3d3dy5zbWFydHN1cHBjaGF0LmNvbS9sb2FkZXIuanM/JztzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGMscyk7Cn0pKGRvY3VtZW50KTsKPC9zY3JpcHQ+Cjxub3NjcmlwdD4gUG93ZXJlZCBieSA8YSBocmVmPeKAnGh0dHBzOi8vd3d3LnNtYXJ0c3VwcC5jb23igJ0gdGFyZ2V0PeKAnF9ibGFua+KAnT5TbWFydHN1cHA8L2E+PC9ub3NjcmlwdD4KCiA8ZGl2IGNsYXNzPSJndHJhbnNsYXRlX3dyYXBwZXIiPjwvZGl2Pgo8c2NyaXB0PndpbmRvdy5ndHJhbnNsYXRlU2V0dGluZ3MgPSB7ImRlZmF1bHRfbGFuZ3VhZ2UiOiJlbiIsImRldGVjdF9icm93c2VyX2xhbmd1YWdlIjp0cnVlLCJ3cmFwcGVyX3NlbGVjdG9yIjoiLmd0cmFuc2xhdGVfd3JhcHBlciIsInN3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24iOiJsZWZ0In08L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmd0cmFuc2xhdGUubmV0L3dpZGdldHMvbGF0ZXN0L2Zsb2F0LmpzIiBkZWZlcj48L3NjcmlwdD4="}},"time_used":1244,"timings":{"blocked":-1,"dns":262,"connect":150,"send":0,"wait":507,"receive":0,"ssl":325},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/style.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.280Z","timestamp":1785147795280,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/style.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sat, 06 Jul 2024 09:33:44 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 10626\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":98078,"size_decoded":11164,"mime_type":"text/css","magic":"ASCII text","md5":"cfa01f94189462b0fe0158b41c70f4f5","sha1":"8d2239869a8f347852d21c836db5998139eed602","sha256":"56f041ffadf9b20db8342398e3bea345a5f3120cd2cb2d027c9c4878e342fb63","sha512":"d603a84a3ec13f91d2f721c7e5684437c2e6a142092c9df9a8e79d7460ccf7011eeb4ae8ec560e2f78389a9e2a5b057ea0503693082a89c04bd99102a3bfe48a","ssdeep":"1536:hakK6rZwqgYuZphQQo8bZYgK4eDZ8+/zXAymU:hhgYuZTQQo8bZh+/zXAyr","tlshash":"39a399eb26a7390c761bd8965d4557753bec4402a10f9f68faf1b19cdf882884033e9e","first_seen":"2025-05-31T01:51:37.524565Z","last_seen":"2026-07-27T10:24:01.473981Z","times_seen":18,"resource_available":false,"data":"QGltcG9ydCB1cmwoImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1MYXRvOjMwMCwzMDBpLDQwMCw0MDBpLDcwMCw3MDBpLDkwMCIpOwoKCmh0bWwsCmJvZHkgewogIGZvbnQtc2l6ZTogMTZweDsKICBjb2xvcjogIzg0ODZhNjsKICBmb250LWZhbWlseTogIkxhdG8iLCBzYW5zLXNlcmlmOwogIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICBsaW5lLWhlaWdodDogMjZweDsKICBmb250LXdlaWdodDogNDAwOwogIG92ZXJmbG93LXg6aGlkZGVuOwogIGJhY2tncm91bmQ6IzEwMTIyZDsKfQovKi0tIFByZWxvYWRlciBjc3Mgc3RhcnQgLS0qLwojcHJlbG9hZGVyIHsKCSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQyNDMwOwoJYm90dG9tOiAwOwoJbGVmdDogMDsKCXBvc2l0aW9uOiBmaXhlZDsKCXJpZ2h0OiAwOwoJdG9wOiAwOwoJei1pbmRleDogMjE0NzQ4MzY0NzsKCXdpZHRoOiAxMDAlOwoJaGVpZ2h0OiAxMDAlOwp9CiNzdGF0dXMgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSk7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSk7CiAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwtNTAlKTsKICAgIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwtNTAlKTsKICAgIC1vLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsLTUwJSk7Cn0KI3N0YXR1cyBpbWcgewp9CgojcmV0dXJuLXRvLXRvcCB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBib3R0b206IDIwcHg7CiAgICByaWdodDogMjBweDsKICAgIGJhY2tncm91bmQ6ICMxNTE4NDY7CiAgICB3aWR0aDogNTBweDsKICAgIGhlaWdodDogNTBweDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzNXB4OwogICAgLW1vei1ib3JkZXItcmFkaXVzOiAzNXB4OwogICAgZGlzcGxheTogbm9uZTsKICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3MgbGluZWFyOwogICAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CiAgICAtby10cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKCXotaW5kZXg6MTAwMDsKfQojcmV0dXJuLXRvLXRvcCBpIHsKICAgIGNvbG9yOiAjZmZmOwogICAgbWFyZ2luOiAwOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbGVmdDogMTZweDsKICAgIHRvcDogOHB4OwogICAgZm9udC1zaXplOiAzMHB4OwogICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7CiAgICAtby10cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQojcmV0dXJuLXRvLXRvcDpob3ZlciBpIHsKICAgIGNvbG9yOiAjZmZmOwogICAgdG9wOiA1cHg7Cn0KLypSZXNwb25zaXZlIE1lZGlhKi8KLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCjEuMSBSZXNldCBDU1MgCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCmEgewogIHRyYW5zaXRpb246IGFsbCAwLjVzOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQphOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6ICMwOTZiODk7Cn0KYTphY3RpdmUgewogIG91dGxpbmU6IDAgbm9uZTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KYTpmb2N1cyB7CiAgb3V0bGluZTogMHB4IHNvbGlkOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKcCB7CiAgbWFyZ2luOiAwIDAgMjZweDsKfQoKaDEsCmgyLApoMywKaDQsCmg1LApoNiB7CiAgbWFyZ2luOiAwIDAgMjZweDsKICBmb250LXdlaWdodDogNjAwOwp9CgppbWcgewogIG1heC13aWR0aDogMTAwJTsKICBoZWlnaHQ6IGF1dG87Cn0KCnVsIHsKICBsaXN0LXN0eWxlOiBvdXRzaWRlIG5vbmUgbm9uZTsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMDsKfQoKaW5wdXQgewogIGJveC1zaGFkb3c6IG5vbmU7CiAgYm9yZGVyLXJhZGl1czogMDsKICBvdXRsaW5lOiBub25lOwp9CmlucHV0OmZvY3VzIHsKICBvdXRsaW5lOiBub25lOwogIGJveC1zaGFkb3c6IG5vbmU7Cn0KaW5wdXQ6YWN0aXZlIHsKICBvdXRsaW5lOiBub25lOwogIGJveC1zaGFkb3c6IG5vbmU7Cn0KCnRleHRhcmVhIHsKICBvdXRsaW5lOiBub25lOwogIGJveC1zaGFkb3c6IG5vbmU7CiAgYm9yZGVyLXJhZGl1czogMDsKfQp0ZXh0YXJlYTpmb2N1cyB7CiAgb3V0bGluZTogbm9uZTsKICBib3gtc2hhZG93OiBub25lOwp9CnRleHRhcmVhOmFjdGl2ZSB7CiAgb3V0bGluZTogbm9uZTsKICBib3gtc2hhZG93OiBub25lOwp9CgpidXR0b24gewogIG91dGxpbmU6IG5vbmU7CiAgYm94LXNoYWRvdzogbm9uZTsKICBib3JkZXI6IG5vbmU7CiAgY3Vyc29yOiBwb2ludGVyOwogIHRyYW5zaXRpb246IGFsbCAwLjVzOwp9CmJ1dHRvbjpmb2N1cyB7CiAgb3V0bGluZTogbm9uZTsKICBib3gtc2hhZG93OiBub25lOwogIGJvcmRlcjogbm9uZTsKfQpidXR0b246YWN0aXZlIHsKICBvdXRsaW5lOiBub25lOwogIGJveC1zaGFkb3c6IG5vbmU7CiAgYm9yZGVyOiBub25lOwp9CgouZml4IHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgouY2xlYXIgewogIGNsZWFyOiBib3RoOwp9CgouZC1pbmxpbmUtYmxvY2sgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLmQtYmxvY2sgewogIGRpc3BsYXk6IGJsb2NrOwp9CgouZC10YWJsZSB7CiAgZGlzcGxheTogdGFibGU7Cn0KCi53LTUwIHsKICB3aWR0aDogNTAlOwp9Cgo6Oi1tb3otc2VsZWN0aW9uIHsKICBiYWNrZ3JvdW5kOiAjMDBjM2ZmOwogIHRleHQtc2hhZG93OiBub25lOwp9Cgo6OnNlbGVjdGlvbiB7CiAgYmFja2dyb3VuZDogIzAwYzNmZjsKICB0ZXh0LXNoYWRvdzogbm9uZTsKfQoKLmJyb3dzZXJ1cGdyYWRlIHsKICBtYXJnaW46IDI2cHggIDA7CiAgYmFja2dyb3VuZDogIzAwYzNmZjsKICBjb2xvcjogIzMzMzMzMzsKICBwYWRkaW5nOiAyNnB4IDA7Cn0KCi8qKipUeXBvZ3JhcGh5KioqLwpoMSB7CiAgZm9udC1zaXplOiAzNnB4Owp9CgpoMiB7CiAgZm9udC1zaXplOiAzMHB4Owp9CgpoMyB7CiAgZm9udC1zaXplOiAyNHB4Owp9CgpoNCB7CiAgZm9udC1zaXplOiAxOHB4Owp9CgouZi0xNiB7CiAgZm9udC1zaXplOiAxNnB4Owp9CgouZi0xOCB7CiAgZm9udC1zaXplOiAxOHB4Owp9CgouZi0yMCB7CiAgZm9udC1zaXplOiAyMHB4Owp9CgouZi0yMiB7CiAgZm9udC1zaXplOiAyMnB4Owp9CgouZi0yNCB7CiAgZm9udC1zaXplOiAyNHB4Owp9CgouZi0yNiB7CiAgZm9udC1zaXplOiAyNnB4Owp9CgouZi0yOCB7CiAgZm9udC1zaXplOiAyOHB4Owp9CgouZi0zMCB7CiAgZm9udC1zaXplOiAzMHB4Owp9CgouZi0zNiB7CiAgZm9udC1zaXplOiAzNnB4Owp9CgouZi00MCB7CiAgZm9udC1zaXplOiA0MHB4Owp9CgouZi00OCB7CiAgZm9udC1zaXplOiA0OHB4Owp9CgouZi02MCB7CiAgZm9udC1zaXplOiA2MHB4Owp9CgouZi03MiB7CiAgZm9udC1zaXplOiA3MnB4Owp9CgouZnctMzAwIHsKICBmb250LXdlaWdodDogMzAwICFpbXBvcnRhbnQ7Cn0KCi5mdy00MDAgewogIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDsKfQoKLmZ3LTUwMCB7CiAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50Owp9CgouZnctNjAwIHsKICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7Cn0KCi5mdy03MDAgewogIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsKfQoKLmZ3LTgwMCB7CiAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50Owp9CgouZnctOTAwIHsKICBmb250LXdlaWdodDogOTAwICFpbXBvcnRhbnQ7Cn0KCi50LXUgewogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi50LWMgewogIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwp9CgoudC1sIHsKICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlOwp9CgovKioqIFNlY3Rpb24gKioqLwouc2VjdGlvbiB7CiAgcGFkZGluZzogMTAwcHggMDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnNlY3Rpb24gewogICAgcGFkZGluZzogNzVweCAwOwogIH0KfQoKLnNlY3Rpb24taGVhZGluZyB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG1hcmdpbjogMCAwIDYwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuc2VjdGlvbi1oZWFkaW5nIHsKICAgIG1hcmdpbjogMCAwIDUwcHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAuc2VjdGlvbi1oZWFkaW5nIHsKICAgIG1hcmdpbjogMCAwIDQwcHg7CiAgfQp9Ci5zZWN0aW9uLWhlYWRpbmcgaDIgewogIGZvbnQtc2l6ZTogNDBweDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiAjZmZmZmZmOwogIG1hcmdpbjogMDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnNlY3Rpb24taGVhZGluZyBoMiB7CiAgICBmb250LXNpemU6IDM2cHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAuc2VjdGlvbi1oZWFkaW5nIGgyIHsKICAgIGZvbnQtc2l6ZTogMzBweDsKICB9Cn0KCi5zZWN0aW9uLWhlYWRpbmcyIHsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW46IDAgMCA2MHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnNlY3Rpb24taGVhZGluZzIgewogICAgbWFyZ2luOiAwIDAgNTBweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zZWN0aW9uLWhlYWRpbmcyIHsKICAgIG1hcmdpbjogMCAwIDQwcHg7CiAgfQp9Ci5zZWN0aW9uLWhlYWRpbmcyIGgyIHsKICBmb250LXNpemU6IDQwcHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBjb2xvcjogI2ZmZjsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnNlY3Rpb24taGVhZGluZzIgaDIgewogICAgZm9udC1zaXplOiAzNnB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnNlY3Rpb24taGVhZGluZzIgaDIgewogICAgZm9udC1zaXplOiAzMHB4OwogIH0KfQoKLyoqKkJ1dHRvbioqKi8KLmJ0bjEgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBsaW5lLWhlaWdodDogNTBweDsKICBoZWlnaHQ6IDUwcHg7CiAgYm9yZGVyLXJhZGl1czogNTBweDsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgcGFkZGluZzogMCAzNXB4OwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgY29sb3I6ICNmZmY7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBhbmltYXRpb24tZGVsYXk6IDIuNHMKICAKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLmJ0bjEgewogICAgcGFkZGluZzogMCAyMHB4OwogICAgaGVpZ2h0OiA0MHB4OwogICAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgfQp9Ci5idG4xIGkgewogIHBhZGRpbmctcmlnaHQ6IDhweDsKfQouYnRuMTpob3ZlciB7CiAgCWJhY2tncm91bmQ6IHJnYmEoNDUsMTkzLDIwMSwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKICBjb2xvcjogI2ZmZjsKfQoKLmJ0bjIgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBsaW5lLWhlaWdodDogNTBweDsKICBoZWlnaHQ6IDUwcHg7CiAgYm9yZGVyLXJhZGl1czogNTBweDsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgcGFkZGluZzogMCAzNXB4OwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgY29sb3I6ICNmZmZmZmY7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBhbmltYXRpb24tZGVsYXk6IDIuNHMKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLmJ0bjIgewogICAgcGFkZGluZzogMCAyMHB4OwogICAgaGVpZ2h0OiA0MHB4OwogICAgbGluZS1oZWlnaHQ6IDM2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCAjM2QzZjY5OwogIH0KfQouYnRuMjpob3ZlciB7CiAgYmFja2dyb3VuZDogIzJjMmU1MzsKICBjb2xvcjogI2ZmZjsKfQoKLmJ0bjMgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBsaW5lLWhlaWdodDogNTBweDsKICBoZWlnaHQ6IDUwcHg7CiAgYm9yZGVyLXJhZGl1czogNTBweDsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgcGFkZGluZzogMCAzNXB4OwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgY29sb3I6ICNmZmY7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBhbmltYXRpb24tZGVsYXk6IDIuNHMKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLmJ0bjMgewogICAgcGFkZGluZzogMCAyMHB4OwogICAgaGVpZ2h0OiA0MHB4OwogICAgbGluZS1oZWlnaHQ6IDM2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCAjM2QzZjY5OwogIH0KfQouYnRuMzpob3ZlciB7CmJhY2tncm91bmQ6IHJnYmEoNDUsMTkzLDIwMSwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKICBjb2xvcjogI2ZmZjsKICAKfQoKLyoqKiBSZXNldCAqKiovCi5wLXJlIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5wLWFiIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7Cn0KCi5saXN0LWlubGluZSBsaSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouYWYtYmU6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHJpZ2h0OiAwOwogIHRvcDogMDsKICBib3R0b206IDA7Cn0KLmFmLWJlOmJlZm9yZSB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKfQoKLmFmOmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwp9CgouYmU6YmVmb3JlIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwp9CgouYmctaW1nIHsKICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIgIWltcG9ydGFudDsKfQoKLmZsb2F0bGVmdCB7CiAgZmxvYXQ6IGxlZnQ7Cn0KCi5mbG9hdHJpZ2h0IHsKICBmbG9hdDogcmlnaHQ7Cn0KCi5hbGlnbmxlZnQgewogIGZsb2F0OiBsZWZ0OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBtYXJnaW4tYm90dG9tOiAyNnB4Owp9CgouYWxpZ25yaWdodCB7CiAgZmxvYXQ6IHJpZ2h0OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1ib3R0b206IDI2cHg7Cn0KCi5hbGlnbmNlbnRlciB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIGF1dG8gMjZweDsKfQoKLmRib3ggewogIG92ZXJmbG93OiBoaWRkZW47CiAgei1pbmRleDogMTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiAxMDAlOwp9Ci5kYm94IC5kbGVmdCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZsb2F0OiBsZWZ0OwogIHBhZGRpbmctcmlnaHQ6IDEwcHg7Cn0KLmRib3ggLmRyaWdodCB7CiAgZGlzcGxheTogdGFibGU7CiAgcGFkZGluZy1sZWZ0OiAxMHB4Owp9Ci5jYXJvdXNlbC1uZXZpZ2F0aW9uewoJcG9zaXRpb246YWJzb2x1dGU7Cgl0b3A6NTAlOwoJZmxvYXQ6bGVmdDsKCXdpZHRoOjEwMCU7CQp9Ci5jYXJvdXNlbC1uZXZpZ2F0aW9uID4gLnByZXZ7CglsZWZ0Oi0xMzhweDsKCXBvc2l0aW9uOmFic29sdXRlOwoJd2lkdGg6NTBweDsKCWhlaWdodDo1MHB4OwoJbGluZS1oZWlnaHQ6NTBweDsKCXBhZGRpbmctdG9wOiA5cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDNweDsKCWJvcmRlci1yYWRpdXM6MTAwJTsKCWJhY2tncm91bmQ6IzEwMTIyZDsKCSAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbXMtdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgdHJhbnNpdGlvbjogYWxsIDAuNXM7Cn0KLmNhcm91c2VsLW5ldmlnYXRpb24gPiAubmV4dHsKCXJpZ2h0Oi0xMzhweDsKCXBvc2l0aW9uOmFic29sdXRlOwoJd2lkdGg6NTBweDsKCWhlaWdodDo1MHB4OwoJcGFkZGluZy10b3A6IDlweDsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKCWJvcmRlci1yYWRpdXM6MTAwJTsKCWJhY2tncm91bmQ6IzEwMTIyZDsKCSAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbXMtdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgdHJhbnNpdGlvbjogYWxsIDAuNXM7Cn0KLnNsaWRlci1hcmVhOmhvdmVyIC5jYXJvdXNlbC1uZXZpZ2F0aW9uID4gLnByZXZ7CglsZWZ0OjEwcHg7CgkgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC41czsKICAgIC1vLXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC41czsKICAgIHRyYW5zaXRpb246IGFsbCAwLjVzOwp9Ci5zbGlkZXItYXJlYTpob3ZlciAuY2Fyb3VzZWwtbmV2aWdhdGlvbiA+IC5uZXh0ewoJcmlnaHQ6MTBweDsKCSAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbXMtdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgdHJhbnNpdGlvbjogYWxsIDAuNXM7Cn0KLmNhcm91c2VsLW5ldmlnYXRpb24gPiAubmV4dDpob3ZlciwgLmNhcm91c2VsLW5ldmlnYXRpb24gPiAucHJldjpob3ZlcnsKCWJhY2tncm91bmQ6IHJnYmEoNTcsMTAwLDIwOCwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKCSAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbXMtdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgdHJhbnNpdGlvbjogYWxsIDAuNXM7Cn0KLmNhcm91c2VsLW5ldmlnYXRpb24gPiAucHJldiBpewoJZmxvYXQ6bGVmdDsKCXdpZHRoOjM1cHg7Cgl0ZXh0LWFsaWduOnJpZ2h0OwoJY29sb3I6I2ZmZmZmZjsKCWZvbnQtc2l6ZToxNnB4OwoJZm9udC1zaXplOiAyOHB4OwogICAgcGFkZGluZy1yaWdodDogMTBweDsKfQouY2Fyb3VzZWwtbmV2aWdhdGlvbiA+IC5wcmV2IHNwYW57Cgl3aWR0aDpjYWxjKDEwMCUgLSAzNXB4KTsKCWZsb2F0OmxlZnQ7Cgljb2xvcjojZmZmZmZmOwoJZm9udC1zaXplOjE2cHg7Cglmb250LXdlaWdodDpib2xkOwoJbGluZS1oZWlnaHQ6IDE3cHg7Cn0KLmNhcm91c2VsLW5ldmlnYXRpb24gPiAubmV4dCBpewoJZmxvYXQ6bGVmdDsKCXdpZHRoOjM1cHg7Cgl0ZXh0LWFsaWduOmxlZnQ7Cgljb2xvcjojZmZmZmZmOwoJZm9udC1zaXplOjE2cHg7Cglmb250LXNpemU6IDI4cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cn0KLmNhcm91c2VsLW5ldmlnYXRpb24gPiAubmV4dCBzcGFuewoJd2lkdGg6Y2FsYygxMDAlIC0gMzVweCk7CglmbG9hdDpsZWZ0OwoJY29sb3I6I2ZmZmZmZjsKCWZvbnQtc2l6ZToxNnB4OwoJZm9udC13ZWlnaHQ6Ym9sZDsKCWxpbmUtaGVpZ2h0OiAxN3B4OwoJdGV4dC1hbGlnbjpyaWdodDsKfQovKioqQWxsIHBsdWdpbnMgUmVzZXQqKiovCi8qKiogTWFyZ2luICoqKi8KLnQtMCB7CiAgdG9wOiAwOwp9CgoubC0wIHsKICBsZWZ0OiAwOwp9Cgouci0wIHsKICByaWdodDogMDsKfQoKLmItMCB7CiAgYm90dG9tOiAwOwp9CgoubXItMCB7CiAgbWFyZ2luOiAwOwp9CgoubXItdDAgewogIG1hcmdpbi10b3A6IDBweDsKfQoKLm1yLXQ1IHsKICBtYXJnaW4tdG9wOiA1cHg7Cn0KCi5tci10MTAgewogIG1hcmdpbi10b3A6IDEwcHg7Cn0KCi5tci10MTUgewogIG1hcmdpbi10b3A6IDE1cHg7Cn0KCi5tci10MjAgewogIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi5tci10MjUgewogIG1hcmdpbi10b3A6IDI1cHg7Cn0KCi5tci10MzAgewogIG1hcmdpbi10b3A6IDMwcHg7Cn0KCi5tci10MzUgewogIG1hcmdpbi10b3A6IDM1cHg7Cn0KCi5tci10NDAgewogIG1hcmdpbi10b3A6IDQwcHg7Cn0KCi5tci10NDUgewogIG1hcmdpbi10b3A6IDQ1cHg7Cn0KCi5tci10NTAgewogIG1hcmdpbi10b3A6IDUwcHg7Cn0KCi5tci10NjAgewogIG1hcmdpbi10b3A6IDYwcHg7Cn0KCi5tci10NzAgewogIG1hcmdpbi10b3A6IDcwcHg7Cn0KCi5tci10ODAgewogIG1hcmdpbi10b3A6IDgwcHg7Cn0KCi5tci10OTAgewogIG1hcmdpbi10b3A6IDkwcHg7Cn0KCi5tci10MTAwIHsKICBtYXJnaW4tdG9wOiAxMDBweDsKfQoKLm1yLXQxMTAgewogIG1hcmdpbi10b3A6IDExMHB4Owp9CgoubXItdDEyMCB7CiAgbWFyZ2luLXRvcDogMTIwcHg7Cn0KCi5tci10MTMwIHsKICBtYXJnaW4tdG9wOiAxMzBweDsKfQoKLm1yLXQxNDAgewogIG1hcmdpbi10b3A6IDE0MHB4Owp9CgoubXItdDE1MCB7CiAgbWFyZ2luLXRvcDogMTUwcHg7Cn0KCi5tci1iMCB7CiAgbWFyZ2luLWJvdHRvbTogMHB4Owp9CgoubXItYjUgewogIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLm1yLWIxMCB7CiAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLm1yLWIxNSB7CiAgbWFyZ2luLWJvdHRvbTogMTVweDsKfQoKLm1yLWIyMCB7CiAgbWFyZ2luLWJvdHRvbTogMjBweDsKfQoKLm1yLWIyNSB7CiAgbWFyZ2luLWJvdHRvbTogMjVweDsKfQoKLm1yLWIzMCB7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKfQoKLm1yLWIzNSB7CiAgbWFyZ2luLWJvdHRvbTogMzVweDsKfQoKLm1yLWI0MCB7CiAgbWFyZ2luLWJvdHRvbTogNDBweDsKfQoKLm1yLWI0NSB7CiAgbWFyZ2luLWJvdHRvbTogNDVweDsKfQoKLm1yLWI1MCB7CiAgbWFyZ2luLWJvdHRvbTogNTBweDsKfQoKLm1yLWI2MCB7CiAgbWFyZ2luLWJvdHRvbTogNjBweDsKfQoKLm1yLWI3MCB7CiAgbWFyZ2luLWJvdHRvbTogNzBweDsKfQoKLm1yLWI4MCB7CiAgbWFyZ2luLWJvdHRvbTogODBweDsKfQoKLm1yLWI5MCB7CiAgbWFyZ2luLWJvdHRvbTogOTBweDsKfQoKLm1yLWIxMDAgewogIG1hcmdpbi1ib3R0b206IDEwMHB4Owp9CgoubXItYjExMCB7CiAgbWFyZ2luLWJvdHRvbTogMTEwcHg7Cn0KCi5tci1iMTIwIHsKICBtYXJnaW4tYm90dG9tOiAxMjBweDsKfQoKLm1yLWIxMzAgewogIG1hcmdpbi1ib3R0b206IDEzMHB4Owp9CgoubXItYjE0MCB7CiAgbWFyZ2luLWJvdHRvbTogMTQwcHg7Cn0KCi5tci1iMTUwIHsKICBtYXJnaW4tYm90dG9tOiAxNTBweDsKfQoKLm1yLWwwIHsKICBtYXJnaW4tbGVmdDogMHB4Owp9CgoubXItbDUgewogIG1hcmdpbi1sZWZ0OiA1cHg7Cn0KCi5tci1sMTAgewogIG1hcmdpbi1sZWZ0OiAxMHB4Owp9CgoubXItbDE1IHsKICBtYXJnaW4tbGVmdDogMTVweDsKfQoKLm1yLWwyMCB7CiAgbWFyZ2luLWxlZnQ6IDIwcHg7Cn0KCi5tci1sMjUgewogIG1hcmdpbi1sZWZ0OiAyNXB4Owp9CgoubXItbDMwIHsKICBtYXJnaW4tbGVmdDogMzBweDsKfQoKLm1yLWwzNSB7CiAgbWFyZ2luLWxlZnQ6IDM1cHg7Cn0KCi5tci1sNDAgewogIG1hcmdpbi1sZWZ0OiA0MHB4Owp9CgoubXItbDQ1IHsKICBtYXJnaW4tbGVmdDogNDVweDsKfQoKLm1yLWw1MCB7CiAgbWFyZ2luLWxlZnQ6IDUwcHg7Cn0KCi5tci1sNjAgewogIG1hcmdpbi1sZWZ0OiA2MHB4Owp9CgoubXItbDcwIHsKICBtYXJnaW4tbGVmdDogNzBweDsKfQoKLm1yLWw4MCB7CiAgbWFyZ2luLWxlZnQ6IDgwcHg7Cn0KCi5tci1sOTAgewogIG1hcmdpbi1sZWZ0OiA5MHB4Owp9CgoubXItbDEwMCB7CiAgbWFyZ2luLWxlZnQ6IDEwMHB4Owp9CgoubXItbDExMCB7CiAgbWFyZ2luLWxlZnQ6IDExMHB4Owp9CgoubXItbDEyMCB7CiAgbWFyZ2luLWxlZnQ6IDEyMHB4Owp9CgoubXItbDEzMCB7CiAgbWFyZ2luLWxlZnQ6IDEzMHB4Owp9CgoubXItbDE0MCB7CiAgbWFyZ2luLWxlZnQ6IDE0MHB4Owp9CgoubXItbDE1MCB7CiAgbWFyZ2luLWxlZnQ6IDE1MHB4Owp9CgoubXItcjAgewogIG1hcmdpbi1yaWdodDogMHB4Owp9CgoubXItcjUgewogIG1hcmdpbi1yaWdodDogNXB4Owp9CgoubXItcjEwIHsKICBtYXJnaW4tcmlnaHQ6IDEwcHg7Cn0KCi5tci1yMTUgewogIG1hcmdpbi1yaWdodDogMTVweDsKfQoKLm1yLXIyMCB7CiAgbWFyZ2luLXJpZ2h0OiAyMHB4Owp9CgoubXItcjI1IHsKICBtYXJnaW4tcmlnaHQ6IDI1cHg7Cn0KCi5tci1yMzAgewogIG1hcmdpbi1yaWdodDogMzBweDsKfQoKLm1yLXIzNSB7CiAgbWFyZ2luLXJpZ2h0OiAzNXB4Owp9CgoubXItcjQwIHsKICBtYXJnaW4tcmlnaHQ6IDQwcHg7Cn0KCi5tci1yNDUgewogIG1hcmdpbi1yaWdodDogNDVweDsKfQoKLm1yLXI1MCB7CiAgbWFyZ2luLXJpZ2h0OiA1MHB4Owp9CgoubXItcjYwIHsKICBtYXJnaW4tcmlnaHQ6IDYwcHg7Cn0KCi5tci1yNzAgewogIG1hcmdpbi1yaWdodDogNzBweDsKfQoKLm1yLXI4MCB7CiAgbWFyZ2luLXJpZ2h0OiA4MHB4Owp9CgoubXItcjkwIHsKICBtYXJnaW4tcmlnaHQ6IDkwcHg7Cn0KCi5tci1yMTAwIHsKICBtYXJnaW4tcmlnaHQ6IDEwMHB4Owp9CgoubXItcjExMCB7CiAgbWFyZ2luLXJpZ2h0OiAxMTBweDsKfQoKLm1yLXIxMjAgewogIG1hcmdpbi1yaWdodDogMTIwcHg7Cn0KCi5tci1yMTMwIHsKICBtYXJnaW4tcmlnaHQ6IDEzMHB4Owp9CgoubXItcjE0MCB7CiAgbWFyZ2luLXJpZ2h0OiAxNDBweDsKfQoKLm1yLXIxNTAgewogIG1hcmdpbi1yaWdodDogMTUwcHg7Cn0KCi5tci0wIHsKICBtYXJnaW46IDA7Cn0KCi5tci01IHsKICBtYXJnaW46IDVweDsKfQoKLm1yLTEwIHsKICBtYXJnaW46IDEwcHg7Cn0KCi5tci0xNSB7CiAgbWFyZ2luOiAxNXB4Owp9CgoubXItMjAgewogIG1hcmdpbjogMjBweDsKfQoKLm1yLTI1IHsKICBtYXJnaW46IDI1cHg7Cn0KCi5tci0zMCB7CiAgbWFyZ2luOiAzMHB4Owp9CgoubXItMzUgewogIG1hcmdpbjogMzVweDsKfQoKLm1yLTQwIHsKICBtYXJnaW46IDQwcHg7Cn0KCi5tci00NSB7CiAgbWFyZ2luOiA0NXB4Owp9CgoubXItNTAgewogIG1hcmdpbjogNTBweDsKfQoKLm1yLTYwIHsKICBtYXJnaW46IDYwcHg7Cn0KCi5tci03MCB7CiAgbWFyZ2luOiA3MHB4Owp9CgoubXItODAgewogIG1hcmdpbjogODBweDsKfQoKLm1yLTkwIHsKICBtYXJnaW46IDkwcHg7Cn0KCi5tci0xMDAgewogIG1hcmdpbjogMTAwcHg7Cn0KCi5tci0xMTAgewogIG1hcmdpbjogMTEwcHg7Cn0KCi5tci0xMjAgewogIG1hcmdpbjogMTIwcHg7Cn0KCi5tci0xMzAgewogIG1hcmdpbjogMTMwcHg7Cn0KCi5tci0xNDAgewogIG1hcmdpbjogMTQwcHg7Cn0KCi5tci0xNTAgewogIG1hcmdpbjogMTUwcHg7Cn0KCi8qKiogUGFkZGluZyAqKiovCi5wZC0wIHsKICBwYWRkaW5nOiAwOwp9CgoucGQtdDAgewogIHBhZGRpbmctdG9wOiAwcHg7Cn0KCi5wZC10NSB7CiAgcGFkZGluZy10b3A6IDVweDsKfQoKLnBkLXQxMCB7CiAgcGFkZGluZy10b3A6IDEwcHg7Cn0KCi5wZC10MTUgewogIHBhZGRpbmctdG9wOiAxNXB4Owp9CgoucGQtdDIwIHsKICBwYWRkaW5nLXRvcDogMjBweDsKfQoKLnBkLXQyNSB7CiAgcGFkZGluZy10b3A6IDI1cHg7Cn0KCi5wZC10MzAgewogIHBhZGRpbmctdG9wOiAzMHB4Owp9CgoucGQtdDM1IHsKICBwYWRkaW5nLXRvcDogMzVweDsKfQoKLnBkLXQ0MCB7CiAgcGFkZGluZy10b3A6IDQwcHg7Cn0KCi5wZC10NDUgewogIHBhZGRpbmctdG9wOiA0NXB4Owp9CgoucGQtdDUwIHsKICBwYWRkaW5nLXRvcDogNTBweDsKfQoKLnBkLXQ2MCB7CiAgcGFkZGluZy10b3A6IDYwcHg7Cn0KCi5wZC10NzAgewogIHBhZGRpbmctdG9wOiA3MHB4Owp9CgoucGQtdDgwIHsKICBwYWRkaW5nLXRvcDogODBweDsKfQoKLnBkLXQ5MCB7CiAgcGFkZGluZy10b3A6IDkwcHg7Cn0KCi5wZC10MTAwIHsKICBwYWRkaW5nLXRvcDogMTAwcHg7Cn0KCi5wZC10MTEwIHsKICBwYWRkaW5nLXRvcDogMTEwcHg7Cn0KCi5wZC10MTIwIHsKICBwYWRkaW5nLXRvcDogMTIwcHg7Cn0KCi5wZC10MTMwIHsKICBwYWRkaW5nLXRvcDogMTMwcHg7Cn0KCi5wZC10MTQwIHsKICBwYWRkaW5nLXRvcDogMTQwcHg7Cn0KCi5wZC10MTUwIHsKICBwYWRkaW5nLXRvcDogMTUwcHg7Cn0KCi5wZC1iMCB7CiAgcGFkZGluZy1ib3R0b206IDBweDsKfQoKLnBkLWI1IHsKICBwYWRkaW5nLWJvdHRvbTogNXB4Owp9CgoucGQtYjEwIHsKICBwYWRkaW5nLWJvdHRvbTogMTBweDsKfQoKLnBkLWIxNSB7CiAgcGFkZGluZy1ib3R0b206IDE1cHg7Cn0KCi5wZC1iMjAgewogIHBhZGRpbmctYm90dG9tOiAyMHB4Owp9CgoucGQtYjI1IHsKICBwYWRkaW5nLWJvdHRvbTogMjVweDsKfQoKLnBkLWIzMCB7CiAgcGFkZGluZy1ib3R0b206IDMwcHg7Cn0KCi5wZC1iMzUgewogIHBhZGRpbmctYm90dG9tOiAzNXB4Owp9CgoucGQtYjQwIHsKICBwYWRkaW5nLWJvdHRvbTogNDBweDsKfQoKLnBkLWI0NSB7CiAgcGFkZGluZy1ib3R0b206IDQ1cHg7Cn0KCi5wZC1iNTAgewogIHBhZGRpbmctYm90dG9tOiA1MHB4Owp9CgoucGQtYjYwIHsKICBwYWRkaW5nLWJvdHRvbTogNjBweDsKfQoKLnBkLWI3MCB7CiAgcGFkZGluZy1ib3R0b206IDcwcHg7Cn0KCi5wZC1iODAgewogIHBhZGRpbmctYm90dG9tOiA4MHB4Owp9CgoucGQtYjkwIHsKICBwYWRkaW5nLWJvdHRvbTogOTBweDsKfQoKLnBkLWIxMDAgewogIHBhZGRpbmctYm90dG9tOiAxMDBweDsKfQoKLnBkLWIxMTAgewogIHBhZGRpbmctYm90dG9tOiAxMTBweDsKfQoKLnBkLWIxMjAgewogIHBhZGRpbmctYm90dG9tOiAxMjBweDsKfQoKLnBkLWIxMzAgewogIHBhZGRpbmctYm90dG9tOiAxMzBweDsKfQoKLnBkLWIxNDAgewogIHBhZGRpbmctYm90dG9tOiAxNDBweDsKfQoKLnBkLWIxNTAgewogIHBhZGRpbmctYm90dG9tOiAxNTBweDsKfQoKLnBkLWwwIHsKICBwYWRkaW5nLWxlZnQ6IDBweDsKfQoKLnBkLWw1IHsKICBwYWRkaW5nLWxlZnQ6IDVweDsKfQoKLnBkLWwxMCB7CiAgcGFkZGluZy1sZWZ0OiAxMHB4Owp9CgoucGQtbDE1IHsKICBwYWRkaW5nLWxlZnQ6IDE1cHg7Cn0KCi5wZC1sMjAgewogIHBhZGRpbmctbGVmdDogMjBweDsKfQoKLnBkLWwyNSB7CiAgcGFkZGluZy1sZWZ0OiAyNXB4Owp9CgoucGQtbDMwIHsKICBwYWRkaW5nLWxlZnQ6IDMwcHg7Cn0KCi5wZC1sMzUgewogIHBhZGRpbmctbGVmdDogMzVweDsKfQoKLnBkLWw0MCB7CiAgcGFkZGluZy1sZWZ0OiA0MHB4Owp9CgoucGQtbDQ1IHsKICBwYWRkaW5nLWxlZnQ6IDQ1cHg7Cn0KCi5wZC1sNTAgewogIHBhZGRpbmctbGVmdDogNTBweDsKfQoKLnBkLWw2MCB7CiAgcGFkZGluZy1sZWZ0OiA2MHB4Owp9CgoucGQtbDcwIHsKICBwYWRkaW5nLWxlZnQ6IDcwcHg7Cn0KCi5wZC1sODAgewogIHBhZGRpbmctbGVmdDogODBweDsKfQoKLnBkLWw5MCB7CiAgcGFkZGluZy1sZWZ0OiA5MHB4Owp9CgoucGQtbDEwMCB7CiAgcGFkZGluZy1sZWZ0OiAxMDBweDsKfQoKLnBkLWwxMTAgewogIHBhZGRpbmctbGVmdDogMTEwcHg7Cn0KCi5wZC1sMTIwIHsKICBwYWRkaW5nLWxlZnQ6IDEyMHB4Owp9CgoucGQtbDEzMCB7CiAgcGFkZGluZy1sZWZ0OiAxMzBweDsKfQoKLnBkLWwxNDAgewogIHBhZGRpbmctbGVmdDogMTQwcHg7Cn0KCi5wZC1sMTUwIHsKICBwYWRkaW5nLWxlZnQ6IDE1MHB4Owp9CgoucGQtcjAgewogIHBhZGRpbmctcmlnaHQ6IDBweDsKfQoKLnBkLXI1IHsKICBwYWRkaW5nLXJpZ2h0OiA1cHg7Cn0KCi5wZC1yMTAgewogIHBhZGRpbmctcmlnaHQ6IDEwcHg7Cn0KCi5wZC1yMTUgewogIHBhZGRpbmctcmlnaHQ6IDE1cHg7Cn0KCi5wZC1yMjAgewogIHBhZGRpbmctcmlnaHQ6IDIwcHg7Cn0KCi5wZC1yMjUgewogIHBhZGRpbmctcmlnaHQ6IDI1cHg7Cn0KCi5wZC1yMzAgewogIHBhZGRpbmctcmlnaHQ6IDMwcHg7Cn0KCi5wZC1yMzUgewogIHBhZGRpbmctcmlnaHQ6IDM1cHg7Cn0KCi5wZC1yNDAgewogIHBhZGRpbmctcmlnaHQ6IDQwcHg7Cn0KCi5wZC1yNDUgewogIHBhZGRpbmctcmlnaHQ6IDQ1cHg7Cn0KCi5wZC1yNTAgewogIHBhZGRpbmctcmlnaHQ6IDUwcHg7Cn0KCi5wZC1yNjAgewogIHBhZGRpbmctcmlnaHQ6IDYwcHg7Cn0KCi5wZC1yNzAgewogIHBhZGRpbmctcmlnaHQ6IDcwcHg7Cn0KCi5wZC1yODAgewogIHBhZGRpbmctcmlnaHQ6IDgwcHg7Cn0KCi5wZC1yOTAgewogIHBhZGRpbmctcmlnaHQ6IDkwcHg7Cn0KCi5wZC1yMTAwIHsKICBwYWRkaW5nLXJpZ2h0OiAxMDBweDsKfQoKLnBkLXIxMTAgewogIHBhZGRpbmctcmlnaHQ6IDExMHB4Owp9CgoucGQtcjEyMCB7CiAgcGFkZGluZy1yaWdodDogMTIwcHg7Cn0KCi5wZC1yMTMwIHsKICBwYWRkaW5nLXJpZ2h0OiAxMzBweDsKfQoKLnBkLXIxNDAgewogIHBhZGRpbmctcmlnaHQ6IDE0MHB4Owp9CgoucGQtcjE1MCB7CiAgcGFkZGluZy1yaWdodDogMTUwcHg7Cn0KCi5wZC0wIHsKICBwYWRkaW5nOiAwcHg7Cn0KCi5wZC01IHsKICBwYWRkaW5nOiA1cHg7Cn0KCi5wZC0xMCB7CiAgcGFkZGluZzogMTBweDsKfQoKLnBkLTE1IHsKICBwYWRkaW5nOiAxNXB4Owp9CgoucGQtMjAgewogIHBhZGRpbmc6IDIwcHg7Cn0KCi5wZC0yNSB7CiAgcGFkZGluZzogMjVweDsKfQoKLnBkLTMwIHsKICBwYWRkaW5nOiAzMHB4Owp9CgoucGQtMzUgewogIHBhZGRpbmc6IDM1cHg7Cn0KCi5wZC00MCB7CiAgcGFkZGluZzogNDBweDsKfQoKLnBkLTQ1IHsKICBwYWRkaW5nOiA0NXB4Owp9CgoucGQtNTAgewogIHBhZGRpbmc6IDUwcHg7Cn0KCi5wZC02MCB7CiAgcGFkZGluZzogNjBweDsKfQoKLnBkLTcwIHsKICBwYWRkaW5nOiA3MHB4Owp9CgoucGQtODAgewogIHBhZGRpbmc6IDgwcHg7Cn0KCi5wZC05MCB7CiAgcGFkZGluZzogOTBweDsKfQoKLnBkLTEwMCB7CiAgcGFkZGluZzogMTAwcHg7Cn0KCi5wZC0xMTAgewogIHBhZGRpbmc6IDExMHB4Owp9CgoucGQtMTIwIHsKICBwYWRkaW5nOiAxMjBweDsKfQoKLnBkLTEzMCB7CiAgcGFkZGluZzogMTMwcHg7Cn0KCi5wZC0xNDAgewogIHBhZGRpbmc6IDE0MHB4Owp9CgoucGQtMTUwIHsKICBwYWRkaW5nOiAxNTBweDsKfQoKLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KMi4gSGVhZGVyIGFyZWEgc3RhcnQgaGVyZQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwpoZWFkZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB6LWluZGV4OiA5OTk5OwogIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7CiAgICAgIHBhZGRpbmctdG9wOiAzMHB4OwogICAgcGFkZGluZy1ib3R0b206IDE0cHg7Cn0KaGVhZGVyIC5tZW51LWFyZWEgewogIHRleHQtYWxpZ246IHJpZ2h0Owp9CmhlYWRlciAubWVudS1hcmVhIG5hdiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CmhlYWRlciAubWVudS1hcmVhIG5hdiB1bCBsaSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBwYWRkaW5nOiAwIDEwcHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMjAwcHgpIHsKICBoZWFkZXIgLm1lbnUtYXJlYSBuYXYgdWwgbGkgewogICAgcGFkZGluZzogMCAxMHB4OwogIH0KfQpoZWFkZXIgLm1lbnUtYXJlYSBuYXYgdWwgbGk6Zmlyc3QtY2hpbGQgewogIHBhZGRpbmctbGVmdDogMDsKfQpoZWFkZXIgLm1lbnUtYXJlYSBuYXYgdWwgbGkgYSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGNvbG9yOiAjZmZmOwogIGZvbnQtc2l6ZTogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CmhlYWRlciAubWVudS1hcmVhIC5sYW5ndWFnZSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIHdpZHRoOiA0MHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyMDBweCkgewogIGhlYWRlciAubWVudS1hcmVhIC5sYW5ndWFnZSB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQpoZWFkZXIgLm1lbnUtYXJlYSAubGFuZ3VhZ2Ugc3BhbiB7CiAgZGlzcGxheTogYmxvY2s7CiAgY3Vyc29yOiBwb2ludGVyOwp9CmhlYWRlciAubWVudS1hcmVhIC5sYW5ndWFnZSB1bCB7CiAgd2lkdGg6IDQwcHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGJhY2tncm91bmQ6ICNmZmY7CiAgcGFkZGluZzogMTBweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgZGlzcGxheTogbm9uZTsKfQpoZWFkZXIgLm1lbnUtYXJlYSAubGFuZ3VhZ2UgdWwgbGkgewogIGRpc3BsYXk6IGJsb2NrOwogIHBhZGRpbmc6IDJweCAwOwogIGN1cnNvcjogcG9pbnRlcjsKfQpoZWFkZXIgLm1lbnUtYXJlYSAubGFuZ3VhZ2UgdWwgbGk6aG92ZXIgewogIGJhY2tncm91bmQ6ICNkZGQ7Cn0KaGVhZGVyIC5tZW51LWFyZWEgLmxvZ2luLWJ0biB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbjogMCAzMHB4IDAgMTVweDsKfQpoZWFkZXIgLm1lbnUtYXJlYSAuc2lkZV9tZW51IHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLXJpZ2h0OiAxNXB4Owp9CmhlYWRlciAubWVudS1hcmVhIC5zaWRlX21lbnUgc3BhbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHdpZHRoOiA1MHB4OwogIGhlaWdodDogNTBweDsKICBsaW5lLWhlaWdodDogNDZweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwogIGJvcmRlcjogMnB4IHNvbGlkICM4NDg2YTY7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGN1cnNvcjogcG9pbnRlcjsKfQpoZWFkZXIgLm1lbnUtYXJlYSAuc2lkZV9tZW51IHNwYW4gaSB7CiAgY29sb3I6ICNmZmY7Cn0KaGVhZGVyIC5tb2JpbGVtZW51IC5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgewogIGJhY2tncm91bmQ6ICMxRDFEMjI7CiAgbWFyZ2luLXRvcDogMTBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgaGVhZGVyIC5tb2JpbGVtZW51IC5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgewogICAgd2lkdGg6IDMwMHB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgaGVhZGVyIC5tb2JpbGVtZW51IC5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgewogICAgd2lkdGg6IDI4MHB4OwogIH0KfQpoZWFkZXIgLm1vYmlsZW1lbnUgLm1lYW4tY29udGFpbmVyIC5tZWFuLW5hdiB1bCBsaSBhIHsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogMCA1JTsKICBsaW5lLWhlaWdodDogNDRweDsKfQpoZWFkZXIgLm1vYmlsZW1lbnUgLm1lYW4tY29udGFpbmVyIC5tZWFuLW5hdiB1bCBsaSBhLm1lYW4tZXhwYW5kIHsKICBwYWRkaW5nOiAwOwogIGxpbmUtaGVpZ2h0OiA0NHB4OwogIGhlaWdodDogNDRweCAhaW1wb3J0YW50OwogIHBhZGRpbmc6IDAgMTJweCAhaW1wb3J0YW50Owp9CmhlYWRlciAubW9iaWxlbWVudSAubWVhbi1jb250YWluZXIgLm1lYW4tbmF2IHVsIGxpIGEubWVhbi1leHBhbmQ6aG92ZXIgewogIGJhY2tncm91bmQ6ICMxRDFEMjI7Cn0KaGVhZGVyIC5tb2JpbGVtZW51IC5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgYS5tZWFuLWV4cGFuZC5tZWFuLWV4cGFuZC5tZWFuLWNsaWNrZWQgewogIGJhY2tncm91bmQ6ICMxRDFEMjI7Cn0KaGVhZGVyIC5tb2JpbGVtZW51IC5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgYTpob3ZlciB7CiAgY29sb3I6ICMyYzJlNTM7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KaGVhZGVyIC5tb2JpbGVtZW51IC5tZWFuLWNvbnRhaW5lciAubWVhbi1iYXIgewogIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgcGFkZGluZzogMDsKICBtaW4taGVpZ2h0OiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMjBweDsKICB0b3A6IDEwcHg7CiAgei1pbmRleDogOTk5OTsKICB3aWR0aDogYXV0byAhaW1wb3J0YW50Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKICBoZWFkZXIgLm1vYmlsZW1lbnUgLm1lYW4tY29udGFpbmVyIC5tZWFuLWJhciB7CiAgICB0b3A6IDA7CiAgfQp9CmhlYWRlciAubW9iaWxlbWVudSAubWVhbi1jb250YWluZXIgYS5tZWFubWVudS1yZXZlYWwgewogIHRvcDogMDsKICByaWdodDogMCAhaW1wb3J0YW50OwogIGJhY2tncm91bmQ6ICNlMDVkNWU7CiAgaGVpZ2h0OiAxMHB4OwogIHBhZGRpbmc6IDhweCAxMXB4IDE3cHg7CiAgYm9yZGVyLXJhZGl1czogNXB4Owp9Ci53ZF9zY3JvbGxfd3JhcHsKCWZsb2F0OmxlZnQ7Cgl3aWR0aDoxMDAlOwp9Ci5tZW51X2ZpeGVkewoJcG9zaXRpb246Zml4ZWQgIWltcG9ydGFudDsKCWxlZnQ6MCAhaW1wb3J0YW50OwoJcmlnaHQ6MCAhaW1wb3J0YW50OwoJdG9wOjAgIWltcG9ydGFudDsKCXotaW5kZXg6IDEwMDAwMCAhaW1wb3J0YW50OwoJYmFja2dyb3VuZDojMGEwYzIzOwp9Ci5ycF9tb2JhaWxfbWVudV9tYWluX3dyYXBwZXJ7CglmbG9hdDpub25lOwoJd2lkdGg6MTAwJTsKfQojc2lkZWJhciB7CiAgcG9zaXRpb246IGZpeGVkOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMTAwJTsKICB0b3A6IDBweDsKICBsZWZ0OiAtNTAwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmU1MzsKICBvdmVyZmxvdzogc2Nyb2xsOwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICB6LWluZGV4OjEwMDA7Cn0KCiNsaW5rcyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGZsb2F0OiBsZWZ0Owp9CgojbGlua19saXN0IHsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgd2lkdGg6IDEwMCU7CiAgcGFkZGluZzogMHB4IDUwcHggMHB4IDBweDsKfQoKI2xpbmtfbGlzdCBsaSB7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDEwMCU7Cgp9CgojbGlua19saXN0IGxpOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTc0YzNjOwp9CgojdG9nZ2xlIHsKICBmbG9hdDogcmlnaHQ7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJvdHRvbTogLTEzcHg7CiAgcmlnaHQ6IDA7CiAgYm9yZGVyLXJhZGl1czogMjBweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgY3Vyc29yOnBvaW50ZXI7Cn0KI3RvZ2dsZV9jbG9zZXsKCSAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDA7CiAgICByaWdodDogMjBweDsKICAgIHRvcDogMTVweDsKICAgIGZvbnQtc2l6ZTogMjVweDsKICAgIGNvbG9yOiAjZmZmZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoKQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJhbGV3YXk6NDAwLDIwMCk7CiNjc3NtZW51LAojY3NzbWVudSB1bCwKI2Nzc21lbnUgdWwgbGksCiNjc3NtZW51IHVsIGxpIGEgewogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAwOwogIGJvcmRlcjogMDsKICBsaXN0LXN0eWxlOiBub25lOwogIGxpbmUtaGVpZ2h0OiAxOwogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KI2Nzc21lbnUgewogIHdpZHRoOiAzMDBweDsKICBmb250LWZhbWlseTogUmFsZXdheSwgc2Fucy1zZXJpZjsKICBjb2xvcjogI2ZmZmZmZjsKfQojY3NzbWVudSB1bCB1bCB7CiAgZGlzcGxheTogbm9uZTsKfQoKLmFsaWduLXJpZ2h0IHsKICBmbG9hdDogcmlnaHQ7Cn0KI2Nzc21lbnUgdWwgbGkgYSB7CiAgcGFkZGluZzogMTZweCAyMnB4OwogIGN1cnNvcjogcG9pbnRlcjsKICB6LWluZGV4OiAyOwogIGZvbnQtc2l6ZTogMTZweDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6ICNmZmZmZmY7CiAgZm9udC13ZWlnaHQ6Ym9sZDsKICBib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDIxMSwgMjExLCAyMTEsIDAuNDkpOwogIGJhY2tncm91bmQ6ICMyYzJlNTM7CiAgIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICAtby10cmFuc2l0aW9uOiBhbGwgMC41czsKICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC41czsKICAgIC1tb3otdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC41czsKfQojY3NzbWVudSB1bCBsaTpmaXJzdC1jaGlsZCBhewoJYm9yZGVyLXRvcDoxcHggc29saWQgI2QzZDNkMzsKfQojY3NzbWVudSB1bCBsaTpob3ZlciBhLCAjY3NzbWVudSB1bCBsaS5hY3RpdmUgYXsKCWJhY2tncm91bmQ6IzQ1NDg3ZCAhaW1wb3J0YW50OwoJYm9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgyMTEsIDIxMSwgMjExLCAwLjQ5KTsKCWNvbG9yOiNmZmZmZmY7CgkgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC41czsKICAgIC1vLXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjVzOwogICAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC41czsKICAgIHRyYW5zaXRpb246IGFsbCAwLjVzOwp9CgogdWwgdWwgPiBsaS5oYXMtc3ViID4gYTpiZWZvcmUgewogIHRvcDogMjBweDsKICBiYWNrZ3JvdW5kOiNmZmZmZmY7Cn0KLm1lbnVfZml4ZWR7Cglwb3NpdGlvbjpmaXhlZCAhaW1wb3J0YW50OwoJbGVmdDowICFpbXBvcnRhbnQ7CglyaWdodDowICFpbXBvcnRhbnQ7Cgl0b3A6MCAhaW1wb3J0YW50OwoJei1pbmRleDogMTAwMDsKfQojc2lkZWJhciBoMSBhewoJZm9udC1zaXplOjIwcHg7Cgljb2xvcjojZmZmZmZmICFpbXBvcnRhbnQ7CglwYWRkaW5nLWxlZnQ6IDIwcHg7Cglmb250LXdlaWdodDpib2xkOwp9CiNzaWRlYmFyIGgxewoJbWFyZ2luOjA7Cgljb2xvcjojZmZmZmZmOwoJcGFkZGluZy1ib3R0b206IDE1cHg7CgliYWNrZ3JvdW5kOiM0NTQ4N2Q7Cn0KLmJ0Y19tYWluX21lbnUgdWwgbGk6aG92ZXIgYSwgLmJ0Y19tYWluX21lbnUgdWwgbGkuYWN0aXZlIGF7Cgljb2xvcjogIzMyOTdjYzsKCS13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuNXM7Cgktby10cmFuc2l0aW9uOiBhbGwgMC41czsKCS1tcy10cmFuc2l0aW9uOiBhbGwgMC41czsKCS1tb3otdHJhbnNpdGlvbjogYWxsIDAuNXM7Cgl0cmFuc2l0aW9uOiBhbGwgMC41czsKfQovKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgozLiBTbGlkZXIgYXJlYSBzdGFydCBoZXJlCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCi5zbGlkZXItYXJlYSB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJhY2tncm91bmQ6ICMwYjBjMjI7Cn0KLnNsaWRlci1hcmVhIC5jYXJvdXNlbCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDk5OTsKICBwYWRkaW5nOiAzMHZoIDAgNDB2aDsKfQouc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcGFkZGluZzogMzVweCAwOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAuc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICB9Cn0KLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCB1bCB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIDAgNTBweDsKfQouc2xpZGVyX3NvY2lhbF9pY29uMXsKCWFuaW1hdGlvbi1kZWxheTogMS4xcwp9Ci5zbGlkZXJfc29jaWFsX2ljb24yewoJYW5pbWF0aW9uLWRlbGF5OiAxLjJzCn0KLnNsaWRlcl9zb2NpYWxfaWNvbjN7CglhbmltYXRpb24tZGVsYXk6IDEuM3MKfQouc2xpZGVyX3NvY2lhbF9pY29uNHsKCWFuaW1hdGlvbi1kZWxheTogMS40cwp9Ci5zbGlkZXJfc29jaWFsX2ljb241ewoJYW5pbWF0aW9uLWRlbGF5OiAxLjVzCn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkgewogIC5zbGlkZXItYXJlYSAuc2xpZGVyLWNvbnRlbnQgdWwgewogICAgbWFyZ2luOiAwIDAgMjVweDsKICB9Cn0KLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCB1bCBsaSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBwYWRkaW5nOiAwIDVweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCB1bCBsaSB7CiAgICBwYWRkaW5nOiAwOwogIH0KfQouc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IHVsIGxpOmZpcnN0LWNoaWxkIHsKICBwYWRkaW5nLWxlZnQ6IDA7Cn0KLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCB1bCBsaTpsYXN0LWNoaWxkIHsKICBwYWRkaW5nLXJpZ2h0OiAwOwp9Ci5zbGlkZXItYXJlYSAuc2xpZGVyLWNvbnRlbnQgdWwgbGkgYSB7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDUwcHg7CiAgaGVpZ2h0OiA1MHB4OwogIGxpbmUtaGVpZ2h0OiA0NHB4OwogIGJvcmRlcjogM3B4IHNvbGlkICMzZDNmNjk7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGNvbG9yOiAjODQ4NmE2OwogIGZvbnQtc2l6ZTogMjBweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwp9Ci5zbGlkZXItYXJlYSAuc2xpZGVyLWNvbnRlbnQgdWwgbGkgYTpob3ZlciB7CiAgY29sb3I6ICNmZmY7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwogIGJvcmRlcjogM3B4IHNvbGlkIHJnYmEoNTgsIDE1OSwgMTY1KTsKfQouc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IGgyIHsKICBmb250LXdlaWdodDogOTAwOwogIGZvbnQtc2l6ZTogNTBweDsKICBjb2xvcjogI2ZmZjsKICBtYXJnaW46IDAgMCA1MHB4OwogIHRleHQtc2hhZG93OiAwIDVweCAzMHB4IHJnYmEoNDQsIDQ2LCA4MywgMC4zKTsKICBhbmltYXRpb24tZGVsYXk6IDEuOHMKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCBoMiB7CiAgICBtYXJnaW46IDAgMCAzMHB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCBoMiB7CiAgICBmb250LXNpemU6IDM2cHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKICAuc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IGgyIHsKICAgIGZvbnQtc2l6ZTogMzBweDsKICB9Cn0KLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCAuYnV0dG9ucyBhIHsKICBtYXJnaW46IDAgMTBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCAuYnV0dG9ucyBhIHsKICAgIG1hcmdpbjogMDsKICB9Cn0KLnNsaWRlci1hcmVhIC5zbGlkZXItY29udGVudCAuYnV0dG9ucyBhOmZpcnN0LWNoaWxkIHsKICBtYXJnaW4tbGVmdDogMDsKfQouc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IC5idXR0b25zIGE6bGFzdC1jaGlsZCB7CiAgbWFyZ2luLXJpZ2h0OiAwOwogIGNvbG9yOiAjZmZmOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKICAuc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IC5idXR0b25zIGE6bGFzdC1jaGlsZCB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQouc2xpZGVyLWFyZWEgLnNsaWRlci1jb250ZW50IC5idXR0b25zIGE6bGFzdC1jaGlsZDpob3ZlciB7CmJhY2tncm91bmQ6IHJnYmEoNDUsMTkzLDIwMSwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKfQouc2xpZGVyLWFyZWEgLnNsaWRlci1pbWcgewogIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc2xpZGVyLWFyZWEgLnNsaWRlci1pbWcgaW1nIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2lkdGg6IDEwMCU7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNjAwcHgpIHsKICAuc2xpZGVyLWFyZWEgLnNsaWRlci1pbWcgaW1nIHsKICAgIHdpZHRoOiA3MCU7CiAgfQp9Ci5idGNfdGltZXJfc2VjdGlvbl93cmFwcGVyewoJZmxvYXQ6bGVmdDsKCXdpZHRoOjEwMCU7CglwYWRkaW5nLXRvcDogODBweDsKfQpkaXYjY2xvY2tkaXYgLnNtYWxsdGV4dCB7CiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDsKfQojY2xvY2tkaXYsICNjbG9ja2RpdjJ7Cgljb2xvcjogI2ZmZjsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCWZvbnQtd2VpZ2h0OiAxMDA7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cglmb250LXNpemU6IDUwcHg7Cn0KI2Nsb2NrZGl2ID4gZGl2LCAjY2xvY2tkaXYyID4gZGl2ewoJcGFkZGluZzogMHB4OwoJYm9yZGVyLXJhZGl1czogMTBweDsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJcG9zaXRpb246cmVsYXRpdmU7Cn0KI2Nsb2NrZGl2ID4gZGl2Omxhc3QtY2hpbGQ6YWZ0ZXIsICNjbG9ja2RpdjIgPiBkaXY6bGFzdC1jaGlsZDphZnRlcnsKCWRpc3BsYXk6bm9uZQp9CiNjbG9ja2RpdiBkaXYgPiBzcGFuLCAjY2xvY2tkaXYyIGRpdiA+IHNwYW57CiAgICBmb250LWZhbWlseTogJ09zd2FsZCcsIHNhbnMtc2VyaWY7CiAgICBwYWRkaW5nOiAwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAycHggZGFzaGVkICNhMWExYTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMTIwcHg7CiAgICBoZWlnaHQ6IDIwMHB4OwogICAgbGluZS1oZWlnaHQ6IDE5MHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CiNjbG9ja2RpdiBkaXYgPiBzcGFuOmFmdGVyLCAjY2xvY2tkaXYyIGRpdiA+IHNwYW46YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIwKTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA1MCU7CiAgICB6LWluZGV4OiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDBweCAwcHg7Cn0KLnNtYWxsdGV4dHsKCXBhZGRpbmctdG9wOiAxNXB4OwoJZm9udC1zaXplOiAxNnB4Owp9Ci5wYXJ0aWNsZXMtanMtY2FudmFzLWVsIHsKICBoZWlnaHQ6IGF1dG87CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwogIHJpZ2h0OiAwOwogIGJvdHRvbTogMDsKICB6LWluZGV4OiAxOwp9Ci5zZWFyY2hfYnRtewoJZmxvYXQ6bGVmdDsKCXdpZHRoOjEwMCU7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCXBhZGRpbmctdG9wOjUwcHg7Cn0KLnNlYXJjaF9tYWluewoJZmxvYXQ6bGVmdDsKCXdpZHRoOjEwMCU7CglkaXNwbGF5OmlubGluZS1ibG9jazsKfQouc2VhcmNoX21haW4gaW5wdXR7Cgl3aWR0aDpjYWxjKDcwJSAtIDE3MHB4KTsKCWhlaWdodDo2MHB4OwoJZm9udC1zaXplOjE2cHg7CglvdXRsaW5lOm5vbmU7Cgljb2xvcjojODQ4NmE2OwoJcGFkZGluZy1sZWZ0OjIwcHg7CgliYWNrZ3JvdW5kOiMwODA5MWI7Cglib3JkZXItcmFkaXVzOjUwcHg7Cgl0ZXh0LXRyYW5zZm9ybTpjYXBpdGFsaXplOwoJYm9yZGVyOnRyYW5zcGFyZW50Owp9Ci5zZWFyY2hfZm9ybXsKCW1hcmdpbi10b3A6MjBweDsKfQoKLnNlYXJjaF9tYWluIGJ1dHRvbnsKCXdpZHRoOjE3MHB4OwoJaGVpZ2h0OjUwcHg7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi1sZWZ0OiAtMTc5cHg7CglwYWRkaW5nLXRvcDogMXB4OwoJIGRpc3BsYXk6IGlubGluZS1ibG9jazsKCSAgbGluZS1oZWlnaHQ6IDUwcHg7CgkgIGhlaWdodDogNTBweDsKCSAgYm9yZGVyLXJhZGl1czogNTBweDsKCSAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwoJYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CgliYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CgliYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKCWJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKCWJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CgliYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwoJICBwYWRkaW5nOiAwIDM1cHg7CgkgIGZvbnQtd2VpZ2h0OiA3MDA7CgkgIGNvbG9yOiAjZmZmOwoJICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwoJICBhbmltYXRpb24tZGVsYXk6IDIuNHMKfQouc2VhcmNoX21haW4gYnV0dG9uOmhvdmVyIHsKYmFja2dyb3VuZDogcmdiYSg0NSwxOTMsMjAxLDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwogIGNvbG9yOiAjZmZmOwogIAp9Ci5idG40IGJ1dHRvbnsKCWJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Cgljb2xvcjojRkZGOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aCA6IDk5MXB4KSB7Cgkuc2VhcmNoX21haW4gaW5wdXR7Cgl3aWR0aDo4MCU7Cn0KfQpAbWVkaWEgKG1heC13aWR0aDogMTE5OXB4KSBhbmQgKG1pbi13aWR0aDogOTkxcHgpewoJLnNlYXJjaF9tYWluIGlucHV0ewoJd2lkdGg6NjUlOwp9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCl7Cgkuc2VhcmNoX21haW4gaW5wdXR7Cgl3aWR0aDo4MCU7Cn0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGggOiA0ODBweCkgewoJCS5zZWFyY2hfbWFpbiBpbnB1dHsKCXdpZHRoOjEwMCU7Cn0KLnNlYXJjaF9tYWluIGJ1dHRvbnsKCW1hcmdpbi10b3A6MjBweDsKCWRpc3BsYXk6YmxvY2s7CgltYXJnaW4tbGVmdDowOwp9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMzIwcHgpIHsKCQkuc2VhcmNoX21haW4gaW5wdXR7CgkJd2lkdGg6MTAwJTsKfQouc2VhcmNoX21haW4gYnV0dG9uewoJbWFyZ2luLXRvcDoyMHB4Owp9Cn0KLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KNC4gQWJvdXQgYXJlYSBzdGFydCBoZXJlCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCi5hYm91dC1hcmVhIHsKICBkaXNwbGF5OiBibG9jazsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmFib3V0LWFyZWEgewogICAgcGFkZGluZzogNDVweCAwIDc1cHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuYWJvdXQtYXJlYSAuYWJvdXQtY29udGVudCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgfQp9Ci5hYm91dC1hcmVhIC5hYm91dC1jb250ZW50IGgyIHsKICBjb2xvcjogI2ZmZmZmZjsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLmFib3V0LWFyZWEgLmFib3V0LWNvbnRlbnQgaDIgewogICAgZm9udC1zaXplOiAzMHB4OwogIH0KfQouYWJvdXQtYXJlYSAuYWJvdXQtY29udGVudCAuYnV0dG9ucyBhIHsKICBtYXJnaW46IDAgMTBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLmFib3V0LWFyZWEgLmFib3V0LWNvbnRlbnQgLmJ1dHRvbnMgYSB7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogIH0KfQouYWJvdXQtYXJlYSAuYWJvdXQtY29udGVudCAuYnV0dG9ucyBhOmZpcnN0LWNoaWxkIHsKICBtYXJnaW4tbGVmdDogMDsKfQouYWJvdXQtYXJlYSAuYWJvdXQtY29udGVudCAuYnV0dG9ucyBhOmxhc3QtY2hpbGQgewogIG1hcmdpbi1yaWdodDogMDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLmFib3V0LWFyZWEgLmFib3V0LWNvbnRlbnQgLmJ1dHRvbnMgYTpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbjogMDsKICB9Cn0KLmFib3V0LWFyZWEgLmFib3V0LWltZyB7CiAgbWFyZ2luLXJpZ2h0OiAtMTUwcHg7Cn0KLmFib3V0LWFyZWF7CgliYWNrZ3JvdW5kOiMwODA5MWI7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNjAwcHgpIHsKICAuYWJvdXQtYXJlYSAuYWJvdXQtaW1nIHsKICAgIG1hcmdpbi1yaWdodDogLTEwMHB4OwogICAgbWFyZ2luLXRvcDogNTBweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMjAwcHgpIHsKICAuYWJvdXQtYXJlYSAuYWJvdXQtaW1nIHsKICAgIG1hcmdpbi1yaWdodDogMDsKICB9Cn0KLmFib3V0LWFyZWEgLmFib3V0LWltZyBpbWcgewogIHdpZHRoOiAxMDAlOwp9CgovKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgo3LiBCbG9nIGFyZWEgc3RhcnQgaGVyZQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwouYmxvZy1hcmVhIHsKICBiYWNrZ3JvdW5kOiAjMTAxMjJkOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBibG9jazsKfQouYmxvZy1hcmVhIC5ibG9nIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgYmFja2dyb3VuZDogIzQ1NDg3ZDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgYm9yZGVyLXJhZGl1czogMjJweDsKfQouYmxvZy1hcmVhIC5ibG9nIGZpZ3VyZSB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQouYmxvZy1hcmVhIC5ibG9nIGZpZ3VyZSBpbWcgewogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGJsb2NrOwogIHRyYW5zaXRpb246IGFsbCAxLjVzOwp9Ci5ibG9nLWFyZWEgLmJsb2c6aG92ZXIgZmlndXJlIGltZyB7CiAgdHJhbnNmb3JtOiBzY2FsZSgxLjIsIDEuMik7CiAgLXdlYmtpdC1maWx0ZXI6IGdyYXlzY2FsZSgxMDAlKTsKICAvKiBTYWZhcmkgNi4wIC0gOS4wICovCiAgZmlsdGVyOiBncmF5c2NhbGUoMTAwJSk7Cn0KLmJsb2ctYXJlYSAuYmxvZyAuY29udGVudCB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJhY2tncm91bmQ6ICMwODA5MWI7CiAgcGFkZGluZzogMzBweCAzNXB4Owp9Ci5ibG9nLWFyZWEgLmJsb2cgLmNvbnRlbnQgc3BhbiB7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOiAxNHB4OwogIGNvbG9yOiAjODQ4NmE2OwogIG1hcmdpbjogMCAwIDI1cHg7Cn0KLmJsb2ctYXJlYSAuYmxvZyAuY29udGVudCBzcGFuIGkgewogIGZvbnQtc2l6ZTogMTZweDsKICBwYWRkaW5nLXJpZ2h0OiA4cHg7Cn0KLmJsb2ctYXJlYSAuYmxvZyAuY29udGVudCBoNCB7CiAgZm9udC13ZWlnaHQ6IDcwMDsKfQouYmxvZy1hcmVhIC5ibG9nIC5jb250ZW50IGg0IGEgewogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjEpOwogIHBhZGRpbmctcmlnaHQ6IDIwcHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Ci5ibG9nLWFyZWEgLmJsb2cgLmNvbnRlbnQgaDQgYTpob3ZlciB7CiAgY29sb3I6ICMzMjk3Y2M7Cn0KLmJsb2ctYXJlYSAuYmxvZyAuY29udGVudCAuYmxvZy1idG4gewogIGNvbG9yOiAjMzI5N2NjOwogIGZvbnQtc2l6ZTogMTRweDsKICBmb250LXdlaWdodDogOTAwOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KLmJsb2ctYXJlYSAuYmxvZyAuY29udGVudCAuYmxvZy1idG4gaSB7CiAgcGFkZGluZy1sZWZ0OiA4cHg7Cn0KLmJsb2ctYXJlYSAuYmxvZyAuY29udGVudCAuYmxvZy1idG46aG92ZXIgewogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjEpOwp9Ci5ibG9nLWFyZWEgLnZpZXctYnRuIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogODBweDsKICBkaXNwbGF5OiBibG9jazsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk5MnB4KSB7CiAgLmJsb2ctYXJlYSAudmlldy1idG4gewogICAgbWFyZ2luLXRvcDogNDBweDsKICB9Cn0KLmJsb2ctYXJlYSAudmlldy1idG4gYSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgY29sb3I6ICNmZmY7CiAgZm9udC1zaXplOiAxNHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwogIGJvcmRlci1yYWRpdXM6IDUwcHg7CiAgcGFkZGluZzogMCA0MHB4OwogIGxpbmUtaGVpZ2h0OiA1MHB4OwogIGhlaWdodDogNTBweDsKfQouYmxvZy1hcmVhIC52aWV3LWJ0biBhOmhvdmVyewoJYmFja2dyb3VuZDogcmdiYSg0NSwxOTMsMjAxLDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwp9Ci5ibG9nLWFyZWEgLm93bC1jb250cm9scyB7CiAgbWFyZ2luOiAwOwp9Ci5ibG9nLWFyZWEgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAtMTEwcHg7CiAgcmlnaHQ6IC0xMTBweDsKICB0b3A6IDQ1JTsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDE2MDBweCkgewogIC5ibG9nLWFyZWEgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgewogICAgbGVmdDogLTgwcHg7CiAgICByaWdodDogLTgwcHg7CiAgfQp9Ci5ibG9nLWFyZWEgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2IHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgb3BhY2l0eTogMTsKICB3aWR0aDogODBweDsKICBoZWlnaHQ6IDgwcHg7CiAgbGluZS1oZWlnaHQ6IDgwcHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICBiYWNrZ3JvdW5kOiAjMDgwOTFiOwogIGZvbnQtc2l6ZTogNDBweDsKICBjb2xvcjogI2ZmZjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7CiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5ibG9nLWFyZWEgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2OmhvdmVyIHsKICBiYWNrZ3JvdW5kOiAjMTQxNjMzOwp9Ci5ibG9nLWFyZWEgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2Lm93bC1wcmV2IHsKICBsZWZ0OiAwOwp9Ci5ibG9nLWFyZWEgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2Lm93bC1uZXh0IHsKICByaWdodDogMDsKfQoKLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KOS4gQ29udGFjdCBhcmVhIHN0YXJ0IGhlcmUKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKi8KLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KMTAuIEZvb3RlciBhcmVhIHN0YXJ0IGhlcmUKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKi8KZm9vdGVyIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLnZpZGVvLWpzIC52anMtdGVjaHsKCWJvcmRlci1yYWRpdXM6MjBweDsKfQpmb290ZXIgLmZvb3Rlci1ib3R0b20gewogIGRpc3BsYXk6IGJsb2NrOwogIGJhY2tncm91bmQ6ICMwODA5MWI7CiAgaGVpZ2h0OiAxMDBweDsKICBsaW5lLWhlaWdodDogMTAwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CmZvb3RlciAuZm9vdGVyLWJvdHRvbSAuY29weXJpZ2h0IHAgewogIGZvbnQtc2l6ZTogMTRweDsKICBtYXJnaW46IDA7CiAgY29sb3I6ICM4NDg2YTY7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQpmb290ZXIgLmZvb3Rlci1ib3R0b20gLmNvcHlyaWdodCBwIHNwYW4gewogIGNvbG9yOiAjMzI5N2NjOwp9CmZvb3RlciAuZm9vdGVyLWJvdHRvbSAuZm9vLWxpbmsgewogIHRleHQtYWxpZ246IHJpZ2h0Owp9CmZvb3RlciAuZm9vdGVyLWJvdHRvbSAuZm9vLWxpbmsgdWwgbGkgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwYWRkaW5nOiAwIDIwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CmZvb3RlciAuZm9vdGVyLWJvdHRvbSAuZm9vLWxpbmsgdWwgbGk6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogLTJweDsKICB3aWR0aDogMnB4OwogIHRvcDogNXB4OwogIGJvdHRvbTogNXB4OwogIGJhY2tncm91bmQ6ICM4NDg2YTY7Cn0KZm9vdGVyIC5mb290ZXItYm90dG9tIC5mb28tbGluayB1bCBsaTpmaXJzdC1jaGlsZCB7CiAgcGFkZGluZy1sZWZ0OiAwOwp9CmZvb3RlciAuZm9vdGVyLWJvdHRvbSAuZm9vLWxpbmsgdWwgbGk6bGFzdC1jaGlsZCB7CiAgcGFkZGluZy1yaWdodDogMDsKfQpmb290ZXIgLmZvb3Rlci1ib3R0b20gLmZvby1saW5rIHVsIGxpOmxhc3QtY2hpbGQ6YWZ0ZXIgewogIGRpc3BsYXk6IG5vbmU7Cn0KZm9vdGVyIC5mb290ZXItYm90dG9tIC5mb28tbGluayB1bCBsaSBhIHsKICBjb2xvcjogIzg0ODZhNjsKICBkaXNwbGF5OiBibG9jazsKICBsaW5lLWhlaWdodDogMjZweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtc2l6ZTogMTRweDsKfQpmb290ZXIgLmZvb3Rlci1ib3R0b20gLmZvby1saW5rIHVsIGxpIGE6aG92ZXIgewogIGNvbG9yOiAjMzI5N2NjOwp9Cgpmb290ZXIgLmZvb3Rlci10b3AgewogIGJhY2tncm91bmQ6ICMxMDEyMmQ7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CmZvb3RlciAuZm9vdGVyLXRvcCAuY29uIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogOTk5OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBkaXNwbGF5OiBibG9jazsKfQpmb290ZXIgLmZvb3Rlci10b3AgLmNvbiBoMiB7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBmb250LXNpemU6IDQwcHg7CiAgY29sb3I6ICNmZmY7CiAgbWFyZ2luOiAwIDAgNzhweDsKfQpmb290ZXIgLmZvb3Rlci10b3AgLmNvbiB1bCBsaSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBwYWRkaW5nOiAwIDEwcHg7Cn0KZm9vdGVyIC5mb290ZXItdG9wIC5jb24gdWwgbGk6Zmlyc3QtY2hpbGQgewogIHBhZGRpbmctbGVmdDogMDsKfQpmb290ZXIgLmZvb3Rlci10b3AgLmNvbiB1bCBsaTpsYXN0LWNoaWxkIHsKICBwYWRkaW5nLXJpZ2h0OiAwOwp9CmZvb3RlciAuZm9vdGVyLXRvcCAuY29uIHVsIGxpIGEgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAxMDBweDsKICBoZWlnaHQ6IDEwMHB4OwogIGxpbmUtaGVpZ2h0OiAxMDBweDsKYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwoKCiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGNvbG9yOiAjZmZmZmZmOwogIGZvbnQtc2l6ZTogNDJweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwp9CmZvb3RlciAuZm9vdGVyLXRvcCAuY29uIHVsIGxpIGE6aG92ZXIgewogIGNvbG9yOiAjZmZmOwpiYWNrZ3JvdW5kOiByZ2JhKDQ1LDE5MywyMDEsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7Cn0KCi8qLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCjExLiBCcmVhZGN1bWIgYXJlYSBzdGFydCBoZXJlCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCi8qLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCjYuIEJhbm5lciBhcmVhIHN0YXJ0IGhlcmUKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKi8KLnZpZGVvLWRlcyAuZGVzbGlkdCB7CiAgZGlzcGxheTogYmxvY2s7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGRpc3BsYXk6IGJsb2NrOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSB7CiAgICBtYXJnaW46IDA7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnllYXJzIHsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW4tYm90dG9tOiAtNDBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk5MnB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAueWVhcnMgewogICAgbWFyZ2luOiAwOwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAueWVhcnMgewogICAgbWFyZ2luOiAwIDAgMzBweDsKICB9Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAueWVhcnMgc3Bhbi5jb24gewogIHotaW5kZXg6IDk5OTsKICB3aWR0aDogOTBweDsKICBoZWlnaHQ6IDkwcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgY29sb3I6ICNmZmY7CiAgbGluZS1oZWlnaHQ6IDkwcHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAueWVhcnM6YmVmb3JlIHsKICBjb250ZW50OiAnXGYwNzgnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHJpZ2h0OiAwOwogIGJvdHRvbTogNDBweDsKICBmb250LXNpemU6IDE2cHg7CiAgZm9udC1mYW1pbHk6IEZvbnRBd2Vzb21lOwogIGNvbG9yOiAjMmMyZTUzOwogIHotaW5kZXg6IDk7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaTphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwogIGJvdHRvbTogNjBweDsKICB3aWR0aDogM3B4OwogIGJhY2tncm91bmQ6ICMyYzJlNTM7CiAgbWFyZ2luOiAwIGF1dG87CiAgei1pbmRleDogOTsKfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRleHQtYWxpZ246IGxlZnQ7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAubGVmdC1jb24gLmJveC1jb24gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWFyZ2luLXRvcDogMTRweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAubGVmdC1jb24gLmJveC1jb24gewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uOmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNjBweDsKICByaWdodDogNjBweDsKICB0b3A6IC0xNHB4OwogIGJvdHRvbTogMDsKICBib3JkZXItcmFkaXVzOiAzMHB4OwogIGJhY2tncm91bmQ6IHJnYmEoNTcsMTAwLDIwOCwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKICB6LWluZGV4OiA5OTsKfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbiAuZGJveCB7CiAgYmFja2dyb3VuZDogIzEwMTIyZDsKICBib3JkZXItcmFkaXVzOiAyMnB4OwogIHdpZHRoOiA0MDBweDsKICBoZWlnaHQ6IDE5NXB4OwogIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBwYWRkaW5nOiAwIDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDk5OTsKICB0cmFuc2l0aW9uOiBhbGwgMC41czsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk5MnB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAubGVmdC1jb24gLmJveC1jb24gLmRib3ggewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiAwIDIwcHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbiAuZGJveCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmc6IDQwcHg7CiAgICBtYXJnaW46IDAgMCAzMHB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAubGVmdC1jb24gLmJveC1jb24gLmRib3ggewogICAgcGFkZGluZzogNDBweCAyNXB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbiAuZGJveCAuaW1ncyB7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDExMHB4OwogIGhlaWdodDogMTEwcHg7CiAgYm9yZGVyOiAzcHggc29saWQgIzRlNTE4NjsKICBsaW5lLWhlaWdodDogMTA0cHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5pbWdzIHsKICAgIHdpZHRoOiA2MHB4OwogICAgaGVpZ2h0OiA2MHB4OwogICAgbGluZS1oZWlnaHQ6IDU0cHg7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5pbWdzIGltZyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IHsKICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgcGFkZGluZzogMDsKfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbiAuZGJveCAuY29udGVudCBoMyB7CiAgbWFyZ2luOiAwOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgY29sb3I6ICNmZmZmZmY7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IGgzIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IGgzLAoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IGgzICB7CiAgICBmb250LXNpemU6IDE4cHggIWltcG9ydGFudDsKICB9CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAubGVmdC1jb24gLmJveC1jb24gLmRib3ggLmltZ3MgaW1nLAoJLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uIC5kYm94IC5pbWdzIGltZywKLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuY2VudGVyLWNvbiAuYm94LWNvbiAuZGJveCAuaW1ncyBpbWcJewogICAgd2lkdGg6IDQ2JSAhaW1wb3J0YW50OwogICAgbWFyZ2luOiAwIGF1dG8gIWltcG9ydGFudDsKICB9CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAubGVmdC1jb24gLmJveC1jb24gLmRib3ggLmltZ3MsCiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uIC5kYm94IC5pbWdzLAogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gLmRib3ggLmltZ3N7CgkgIHdpZHRoOjQwcHggIWltcG9ydGFudDsKCSAgaGVpZ2h0OjQwcHggIWltcG9ydGFudDsKCSAgbGluZS1oZWlnaHQ6MzBweCAhaW1wb3J0YW50OwogIH0KICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbiAuZGJveCAuY29udGVudCwgCiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50LAogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gLmRib3ggLmNvbnRlbnR7CgkgIHBhZGRpbmc6MCAhaW1wb3J0YW50OwogIH0KICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbiAuZGJveCwKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3gsCiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuY2VudGVyLWNvbiAuYm94LWNvbiAuZGJveAogIHsKCSAgcGFkZGluZzo0MHB4ICFpbXBvcnRhbnQ7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IHAgewogIGZvbnQtc2l6ZTogMTZweDsKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYxKTsKICBtYXJnaW46IDA7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmxlZnQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IHAgewogICAgZm9udC1zaXplOiAxNHB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5sZWZ0LWNvbiAuYm94LWNvbjpob3ZlciAuZGJveCB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03cHgpOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRleHQtYWxpZ246IHJpZ2h0Owp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW4tdG9wOiAxNHB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbjphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDYwcHg7CiAgcmlnaHQ6IDYwcHg7CiAgdG9wOiAtMTRweDsKICBib3R0b206IDA7CiAgYm9yZGVyLXJhZGl1czogMzBweDsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgei1pbmRleDogOTk7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uIC5kYm94IHsKICBiYWNrZ3JvdW5kOiAjMTAxMjJkOwogIGJvcmRlci1yYWRpdXM6IDIycHg7CiAgd2lkdGg6IDQwMHB4OwogIGhlaWdodDogMTk1cHg7CiAgZGlzcGxheTogdGFibGUtY2VsbDsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHBhZGRpbmc6IDAgNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogOTk5OwogIHRyYW5zaXRpb246IGFsbCAwLjVzOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiAwIDIwcHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwYWRkaW5nOiA0MHB4OwogICAgbWFyZ2luOiAwIDAgMzBweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiAuZGJveCB7CiAgICBwYWRkaW5nOiA0MHB4IDE1cHg7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiAuZGJveCAuZGxlZnQgewogIGZsb2F0OiBpbmhlcml0Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmRsZWZ0IHsKICAgIGZsb2F0OiBpbmhlcml0OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmRyaWdodCB7CiAgZmxvYXQ6IHJpZ2h0Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmRyaWdodCB7CiAgICBmbG9hdDogcmlnaHQ7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiAuZGJveCAuaW1ncyB7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDExMHB4OwogIGhlaWdodDogMTEwcHg7CiAgYm9yZGVyOiAzcHggc29saWQgIzRlNTE4NjsKICBsaW5lLWhlaWdodDogMTA0cHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiAuZGJveCAuaW1ncyB7CiAgICB3aWR0aDogNjBweDsKICAgIGhlaWdodDogNjBweDsKICAgIGxpbmUtaGVpZ2h0OiA1NHB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmltZ3MgaW1nIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiAuZGJveCAuaW1ncyBpbWcgewogICAgd2lkdGg6IDUwJTsKICAgIG1hcmdpbjogMCBhdXRvOwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmNvbnRlbnQgewogIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgcGFkZGluZzogMDsKfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmNvbnRlbnQgaDMgewogIG1hcmdpbjogMDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiAjZmZmZmZmOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5yaWdodC1jb24gLmJveC1jb24gLmRib3ggLmNvbnRlbnQgaDMgewogICAgZm9udC1zaXplOiAyMHB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IGgzIHsKICAgIGZvbnQtc2l6ZTogMThweDsKICB9Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IHAgewogIGZvbnQtc2l6ZTogMTZweDsKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYxKTsKICBtYXJnaW46IDA7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnJpZ2h0LWNvbiAuYm94LWNvbiAuZGJveCAuY29udGVudCBwIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICB9Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAucmlnaHQtY29uIC5ib3gtY29uOmhvdmVyIC5kYm94IHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTdweCk7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuY2VudGVyLWNvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG1hcmdpbi10b3A6IDE0cHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb246YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiA2MHB4OwogIHJpZ2h0OiA2MHB4OwogIHRvcDogLTE0cHg7CiAgYm90dG9tOiAwOwogIGJvcmRlci1yYWRpdXM6IDMwcHg7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwogIHotaW5kZXg6IDk5Owp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gLmRib3ggewogIGJhY2tncm91bmQ6ICMxMDEyMmQ7CiAgYm9yZGVyLXJhZGl1czogMjJweDsKICB3aWR0aDogNDAwcHg7CiAgaGVpZ2h0OiAxOTVweDsKICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgcGFkZGluZzogMCA0MHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiA5OTk7CiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIC5kYm94IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA0MHB4OwogICAgbWFyZ2luOiAwIDAgMjBweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gLmRib3ggewogICAgcGFkZGluZzogNDBweCAyNXB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIC5kYm94IC5pbWdzIHsKICBkaXNwbGF5OiBibG9jazsKICB3aWR0aDogMTEwcHg7CiAgaGVpZ2h0OiAxMTBweDsKICBib3JkZXI6IDNweCBzb2xpZCAjNGU1MTg2OwogIGxpbmUtaGVpZ2h0OiAxMDRweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMyMHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuY2VudGVyLWNvbiAuYm94LWNvbiAuZGJveCAuaW1ncyB7CiAgICB3aWR0aDogNjBweDsKICAgIGhlaWdodDogNjBweDsKICAgIGxpbmUtaGVpZ2h0OiA1NHB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIC5kYm94IC5pbWdzIGltZyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKICAudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIC5kYm94IC5pbWdzIGltZyB7CiAgICB3aWR0aDogNTAlOwogICAgbWFyZ2luOiAwIGF1dG87CiAgfQp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gLmRib3ggLmNvbnRlbnQgewogIHBhZGRpbmctbGVmdDogMTBweDsKICBkaXNwbGF5OiBibG9jazsKICBwYWRkaW5nOiAwOwogIHRleHQtYWxpZ246IGxlZnQ7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuY2VudGVyLWNvbiAuYm94LWNvbiAuZGJveCAuY29udGVudCBoMyB7CiAgbWFyZ2luOiAwOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgY29sb3I6ICNmZmZmZmY7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMjBweCkgewogIC52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLmNlbnRlci1jb24gLmJveC1jb24gLmRib3ggLmNvbnRlbnQgaDMgewogICAgZm9udC1zaXplOiAxOHB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpIC5jZW50ZXItY29uIC5ib3gtY29uIC5kYm94IC5jb250ZW50IHAgewogIGZvbnQtc2l6ZTogMTZweDsKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYxKTsKICBtYXJnaW46IDA7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuY2VudGVyLWNvbiAuYm94LWNvbjpob3ZlciAuZGJveCB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03cHgpOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGk6Zmlyc3QtY2hpbGQgLmxlZnQtY29uIC5jb250ZW50IHsKICBwYWRkaW5nOiAyOHB4IDAgIWltcG9ydGFudDsKfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpOmZpcnN0LWNoaWxkIC5yaWdodC1jb24gLmNvbnRlbnQgewogIHBhZGRpbmc6IDI4cHggMCAhaW1wb3J0YW50Owp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGk6Zmlyc3QtY2hpbGQgewogIHBhZGRpbmctdG9wOiAxMDBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaTpmaXJzdC1jaGlsZCB7CiAgICBwYWRkaW5nLXRvcDogNzVweDsKICB9Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaTpsYXN0LWNoaWxkIHsKICBwYWRkaW5nLWJvdHRvbTogMTAwcHg7CiAgbWFyZ2luOiAwIDAgNDVweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaTpsYXN0LWNoaWxkIHsKICAgIHBhZGRpbmctYm90dG9tOiA3NXB4OwogIH0KfQoudmlkZW8tZGVzIC5kZXNsaWR0IHVsIGxpOmxhc3QtY2hpbGQgLnllYXJzOmFmdGVyIHsKICBkaXNwbGF5OiBub25lOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGk6bGFzdC1jaGlsZCAueWVhcnM6YmVmb3JlIHsKICBib3R0b206IDA7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaTpsYXN0LWNoaWxkOmFmdGVyIHsKICBib3R0b206IDIwcHg7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuc2VyaWFscyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW46IDAgMCA4MHB4OwogIHotaW5kZXg6MTAwMDA7Cn0KLnZpZGVvLWRlcyAuZGVzbGlkdCB1bCBsaSAuc2VyaWFsczpsYXN0LWNoaWxkIHsKICBwYWRkaW5nOiAwOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnNlcmlhbHM6YmVmb3JlIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNDAlOwogIHJpZ2h0OiA0MCU7CiAgYm90dG9tOiAxMDBweDsKICBoZWlnaHQ6IDNweDsKICBiYWNrZ3JvdW5kOiAjMmMyZTUzOwogIG1hcmdpbjogMCBhdXRvOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnNlcmlhbHM6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHJpZ2h0OiAwOwogIGJvdHRvbTogODlweDsKICBiYWNrZ3JvdW5kOiAjMmMyZTUzOwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMjJweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwogIG1hcmdpbjogMCBhdXRvOwogIHotaW5kZXg6LTEwOwp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnNlcmlhbHMgc3Bhbi5jcmU6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiA0MCU7CiAgd2lkdGg6IDhweDsKICBoZWlnaHQ6IDhweDsKICBiYWNrZ3JvdW5kOiAjMmMyZTUzOwogIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgYm90dG9tOiA5OHB4Owp9Ci52aWRlby1kZXMgLmRlc2xpZHQgdWwgbGkgLnNlcmlhbHMgc3Bhbi5jcmU6YmVmb3JlIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDQwJTsKICB3aWR0aDogOHB4OwogIGhlaWdodDogOHB4OwogIGJhY2tncm91bmQ6ICMyYzJlNTM7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICBib3R0b206IDk4cHg7Cn0KCi5jdXJyZW5jeS1hcmVhIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHotaW5kZXg6IDEwMDA7CiAgbWFyZ2luLXRvcDotOTBweDsKICBiYWNrZ3JvdW5kOiMwODA5MWI7Cn0KLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aWR0aDogMjAlOwogIGZsb2F0OiBsZWZ0OwogIHBhZGRpbmc6IDAgMTdweDsKICBtYXJnaW46IDAgMCAzMHB4OwogIHBhZGRpbmctdG9wOiAxNXB4OwogIHotaW5kZXg6IDk5OTsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDE2MDBweCkgewogIC5jdXJyZW5jeS1hcmVhIC5yZXRlLWxpc3QgewogICAgcGFkZGluZy1sZWZ0OiA4cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMjAwcHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IHsKICAgIHBhZGRpbmc6IDA7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IHsKICAgIHdpZHRoOiA1MCU7CglmbG9hdDpsZWZ0ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLWxlZnQ6IDhweDsKICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKCQogIH0KfQpAbWVkaWEgKG1heC13aWR0aDogNTgwcHgpewoJIC5jdXJyZW5jeS1hcmVhIC5yZXRlLWxpc3QgewoJCXdpZHRoOiAxMDAlOwoJCWZsb2F0OmxlZnQgIWltcG9ydGFudDsKCQkKCSAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IHsKICAgIHdpZHRoOiAxMDAlOwogIH0KfQouY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0OmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNTBweDsKICByaWdodDogNTBweDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwogIGJhY2tncm91bmQ6IHJnYmEoNTcsMTAwLDIwOCwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIHotaW5kZXg6IDk5OTk7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNjAwcHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0OmFmdGVyIHsKICAgIGxlZnQ6IDMwcHg7CiAgICByaWdodDogMzBweDsKICB9Cn0KLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdCAuY29udGVudCB7CiAgYmFja2dyb3VuZDogIzEwMTIyZDsKICBwYWRkaW5nOiAwIDUwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgYm9yZGVyLXJhZGl1czogMTBweDsKICB6LWluZGV4OiA5OTk5OTsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNjAwcHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IC5jb250ZW50IHsKICAgIHBhZGRpbmc6IDAgMjVweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMjAwcHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IC5jb250ZW50IHsKICAgIHBhZGRpbmc6IDAgMTVweDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC5jdXJyZW5jeS1hcmVhIC5yZXRlLWxpc3QgLmNvbnRlbnQgewogICAgcGFkZGluZzogMCAzMHB4OwogIH0KfQouY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IC5jb250ZW50IC5jb24gewogIGhlaWdodDogMjMwcHg7CiAgZGlzcGxheTogdGFibGUtY2VsbDsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTYwMHB4KSB7CiAgLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdCAuY29udGVudCAuY29uIHsKICAgIGhlaWdodDogMTgwcHg7CiAgfQp9Ci5jdXJyZW5jeS1hcmVhIC5yZXRlLWxpc3QgaDIgewogIGZvbnQtc2l6ZTogMjJweDsKICBmb250LXdlaWdodDogOTAwOwogIGNvbG9yOiAjZmZmZmZmOwogIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTYwMHB4KSB7CiAgLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdCBoMiB7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTIwMHB4KSB7CiAgLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdCBoMiB7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IGgyIHsKICAgIGZvbnQtc2l6ZTogMjZweDsKICB9Cn0KLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdCBoMiBpbWcgewogIHdpZHRoOiA1MHB4OwogIGhlaWdodDogNTBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDE2MDBweCkgewogIC5jdXJyZW5jeS1hcmVhIC5yZXRlLWxpc3QgaDIgaW1nIHsKICAgIHdpZHRoOiA0NHB4OwogIH0KfQouY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0IGgyIHNwYW4gewogIHBhZGRpbmctbGVmdDogOHB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAuY3VycmVuY3ktYXJlYSAucmV0ZS1saXN0Omxhc3QtY2hpbGQgewogICAgZmxvYXQ6IGluaXRpYWw7CiAgICBtYXJnaW46IDAgYXV0byAzMHB4OwogICAgZGlzcGxheTogYmxvY2s7CiAgICB6LWluZGV4OiA5OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLmN1cnJlbmN5LWFyZWEgLnJldGUtbGlzdDpsYXN0LWNoaWxkIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgaGVpZ2h0OiBhdXRvOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgfQp9CgoucHJvamVjdHMgewogIGRpc3BsYXk6IGJsb2NrOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAucHJvamVjdHMgewogICAgcGFkZGluZzogNzVweCAwIDM3cHg7CiAgfQp9Ci5wcm9qZWN0cyAucHJvamVjdC1saXN0IHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIDAgMzhweDsKICBwYWRkaW5nLXRvcDogMTRweDsKfQoucHJvamVjdHMgLnByb2plY3QtbGlzdDphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDQwcHg7CiAgcmlnaHQ6IDQwcHg7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKICBib3JkZXItcmFkaXVzOiAxNXB4OwogIGJhY2tncm91bmQ6IHJnYmEoNTcsMTAwLDIwOCwxKTsKCWJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwoJYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwoJYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CgliYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CgliYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwoJYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKICB6LWluZGV4OiA5Owp9Ci5wcm9qZWN0cyAucHJvamVjdC1saXN0IC5jb250ZW50IHsKICBkaXNwbGF5OiBibG9jazsKICBiYWNrZ3JvdW5kOiAjMTAxMjJkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nOiA2MHB4IDAgNzBweDsKICBib3JkZXItcmFkaXVzOiAxNXB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiA5OTk7CiAgdHJhbnNpdGlvbjogYWxsIDAuNXM7Cn0KLnByb2plY3RzIC5wcm9qZWN0LWxpc3QgLmNvbnRlbnQ6aG92ZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtN3B4KTsKfQoucHJvamVjdHMgLnByb2plY3QtbGlzdCAuY29udGVudCBzcGFuIHsKICBkaXNwbGF5OiBibG9jazsKICBoZWlnaHQ6IDk1cHg7CiAgbWFyZ2luOiAwIDAgMjBweDsKfQoucHJvamVjdHMgLnByb2plY3QtbGlzdCAuY29udGVudCBoMyB7CiAgY29sb3I6ICNmZmZmZmY7CiAgbWFyZ2luOiAwOwogIGxpbmUtaGVpZ2h0OiAyOHB4Owp9Ci5wcm9qZWN0c3sKCWJhY2tncm91bmQ6IzA4MDkxYjsKfQoubWVkaWEtYXJlYSAubWVkaWFicmFuZCB1bCB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAtMzBweDsKfQoubWVkaWEtYXJlYXsKCWJhY2tncm91bmQ6IzA4MDkxYjsKfQoubWVkaWEtYXJlYSAubWVkaWFicmFuZCB1bCBsaSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBhZGRpbmc6IDMwcHg7Cn0KCi50b2tlbnMtYXJlYSB7CiAgYmFja2dyb3VuZDojMTAxMjJkOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoudG9rZW5zLWFyZWEgLnRva2VucyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnRva2Vucy1hcmVhIC50b2tlbnMgLnRva2VuLW5hbWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBjb2xvcjogI2ZmZjsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgbGluZS1oZWlnaHQ6IDQycHg7CiAgaGVpZ2h0OiA0MnB4OwogIHBhZGRpbmc6IDAgNDVweDsKICBib3JkZXItcmFkaXVzOiAxNXB4IDE1cHggMCAwOwogIGZvbnQtc2l6ZTogMThweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDk5OTsKfQoudG9rZW5zLWFyZWEgLnRva2VucyAudG9rZW4tYm9keSB7CiAgYmFja2dyb3VuZDogIzA4MDkxYjsKICBoZWlnaHQ6IDQ2NHB4OwogIHBhZGRpbmc6IDUwcHggNTVweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYm9yZGVyLXJhZGl1czogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogOTk5Owp9Ci50b2tlbnMtYXJlYSAudG9rZW5zIC50b2tlbi1ib2R5IHAgewogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAxOHB4OwogIGNvbG9yOiAjZmZmZmZmOwp9Ci50b2tlbnMtYXJlYSAudG9rZW5zIC50b2tlbi1ib2R5IC5sZWZ0LWJ0biB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogNjBweDsKICBsaW5lLWhlaWdodDogNTRweDsKICBwYWRkaW5nOiAwIDQ1cHg7CiAgYm9yZGVyLXJhZGl1czogNTBweDsKICBib3JkZXI6IDNweCBzb2xpZCAjNWU2MTljOwogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogOTAwOwogIGNvbG9yOiAjZmZmZmZmOwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9Ci50b2tlbnMtYXJlYSAudG9rZW5zIC50b2tlbi1ib2R5IC5yaWdodC1idG4gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBoZWlnaHQ6IDYwcHg7CiAgbGluZS1oZWlnaHQ6IDU0cHg7CiAgcGFkZGluZzogMCA0NXB4OwogIGJvcmRlci1yYWRpdXM6IDUwcHg7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgY29sb3I6ICNmZmY7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwp9Ci50b2tlbnMtYXJlYSAudG9rZW5zIC50b2tlbi1ib2R5IC5yaWdodC1idG46aG92ZXJ7CgliYWNrZ3JvdW5kOiByZ2JhKDQ1LDE5MywyMDEsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7Cn0KLnRva2Vucy1hcmVhIC50b2tlbnMgLnRva2VuLWJvZHkgLnByaWNlcyBoMyB7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICBjb2xvcjogI2ZmZmZmZjsKICBtYXJnaW46IDIwcHggMDsKfQoudG9rZW5zLWFyZWEgLnRva2VucyAudG9rZW4tYm9keSAucHJpY2VzIHRhYmxlIHsKICBtYXJnaW46IDAgYXV0bzsKICB0ZXh0LWFsaWduOiBsZWZ0Owp9Ci50b2tlbnMtYXJlYSAudG9rZW5zIC50b2tlbi1ib2R5IC5wcmljZXMgdGFibGUgdHIgdGggewogIGZvbnQtc2l6ZTogMjBweDsKICBjb2xvcjogIzMyOTdjYzsKICBtYXJnaW46IDAgMCAyMnB4OwogIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwogIHBhZGRpbmc6IDAgMTBweDsKfQoudG9rZW5zLWFyZWEgLnRva2VucyAudG9rZW4tYm9keSAucHJpY2VzIHRhYmxlIHRyIHRkIHsKICBmb250LXNpemU6IDIwcHg7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MSk7CiAgcGFkZGluZzogN3B4IDE1cHg7Cn0KLnRva2Vucy1hcmVhIC50b2tlbnMgLnRva2VuLWJvZHkgLnByaWNlcyB0YWJsZSB0ciB0ZDpsYXN0LWNoaWxkIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnRva2Vucy1hcmVhIC50b2tlbi1jb24gewogIGNvbG9yOiAjZmZmOwogIG1hcmdpbjogNTBweCAwIDA7CiAgZm9udC1zaXplOiAyMHB4Owp9Ci50b2tlbnMtYXJlYSAudG9rZW4tY29uIHNwYW4gewogIGNvbG9yOiAjMzI5N2NjOwp9CgoudG9rZW4tZGV0YWlscyAuY2FydC1saXN0IHsKICBkaXNwbGF5OiBibG9jazsKICBiYWNrZ3JvdW5kOiAjMTAxMjJkOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBib3JkZXItcmFkaXVzOiAxNXB4OwogIHBhZGRpbmc6IDMwcHggMDsKICBtYXJnaW46IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLnRva2VuLWRldGFpbHMgLmNhcnQtbGlzdCAuaW1ncyB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMzIlOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgd2lkdGg6IDE1MHB4OwogIG1hcmdpbjogMCBhdXRvOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKfQoudG9rZW4tZGV0YWlscyAuY2FydC1saXN0IC5sc2l0cyB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIDAgMjBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLnRva2VuLWRldGFpbHMgLmNhcnQtbGlzdCAubHNpdHM6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAtMThweDsKICB0b3A6IDdweDsKICB3aWR0aDogMTJweDsKICBoZWlnaHQ6IDEycHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICBiYWNrZ3JvdW5kOiAjMzI5N2NjOwp9Ci50b2tlbi1kZXRhaWxzIC5jYXJ0LWxpc3QgLmxzaXRzOm50aC1jaGlsZCgxKSB7CiAgb3BhY2l0eTogMTsKfQoudG9rZW4tZGV0YWlscyAuY2FydC1saXN0IC5sc2l0czpudGgtY2hpbGQoMikgewogIG9wYWNpdHk6IDAuODsKfQoudG9rZW4tZGV0YWlscyAuY2FydC1saXN0IC5sc2l0czpudGgtY2hpbGQoMykgewogIG9wYWNpdHk6IDAuNjsKfQoudG9rZW4tZGV0YWlscyAuY2FydC1saXN0IC5sc2l0czpudGgtY2hpbGQoNCkgewogIG9wYWNpdHk6IDAuNDsKICBtYXJnaW46IDA7Cn0KLnRva2VuLWRldGFpbHMgLmNhcnQtbGlzdCAubGFiZWwtY2hhdHJzIHsKICBkaXNwbGF5OiBibG9jazsKICBwYWRkaW5nOiA2MnB4IDA7Cn0KLnRva2VuLWRldGFpbHMgLmNhcnQtbGlzdCAubGFiZWwtY2hhdHJzIC5jbGFiZWxzLXRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogNzAwOwogIGNvbG9yOiAjMzI5N2NjOwp9Ci50b2tlbi1kZXRhaWxzIC5jYXJ0LWxpc3QgLmxhYmVsLWNoYXRycyBwIHsKICBtYXJnaW46IDA7Cn0KLnRva2VuLWRldGFpbHMgLm93bC13cmFwcGVyLW91dGVyIHsKICB6LWluZGV4OiA5OTk7CiAgCn0KLnRva2VuLWRldGFpbHMgLm93bC1jb250cm9scyB7CiAgbWFyZ2luOiAwOwp9Ci50b2tlbi1kZXRhaWxzIC5vd2wtY29udHJvbHMgLm93bC1idXR0b25zIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDUwcHg7CiAgYm90dG9tOiA1MHB4OwogIHotaW5kZXg6IDk7Cn0KLnRva2VuLWRldGFpbHMgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDcwcHg7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKICBiYWNrZ3JvdW5kOiAjMGMwZTI5OwogIGNvbG9yOiAjZmZmOwogIG9wYWNpdHk6IDE7CiAgZm9udC1zaXplOiA1MHB4OwogIHRyYW5zaXRpb246IGFsbCAwLjVzOwp9Ci50b2tlbi1kZXRhaWxzIC5vd2wtY29udHJvbHMgLm93bC1idXR0b25zIGRpdjpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwp9Ci50b2tlbi1kZXRhaWxzIC5vd2wtY29udHJvbHMgLm93bC1idXR0b25zIGRpdiBpIHsKICBsaW5lLWhlaWdodDogMzMwcHg7Cn0KLnRva2VuLWRldGFpbHMgLm93bC1jb250cm9scyAub3dsLWJ1dHRvbnMgZGl2Lm93bC1wcmV2IHsKICBsZWZ0OiAtNzBweDsKICBib3JkZXItcmFkaXVzOiAxNXB4IDAgMCAxNXB4Owp9Ci50b2tlbi1kZXRhaWxzIC5vd2wtY29udHJvbHMgLm93bC1idXR0b25zIGRpdi5vd2wtbmV4dCB7CiAgcmlnaHQ6IC03MHB4OwogIGJvcmRlci1yYWRpdXM6IDAgMTVweCAxNXB4IDA7Cn0KLnRva2VuLWRldGFpbHN7CgliYWNrZ3JvdW5kOiMwODA5MWI7Cn0KLnRva2VuLWRldGFpbHMgLmNvbnRlbnRzIGgyIHsKICBmb250LXdlaWdodDogNDAwOwogIG1hcmdpbjogNTBweCAwIDMwcHg7CiAgY29sb3I6ICNmZmZmZmY7Cn0KCi5lYXN5cGllY2hhcnQgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLXRvcDogNTVweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICBoZWlnaHQ6IDE1MHB4OwogICAgcGFkZGluZy10b3A6IDQ4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMDAlOwp9Ci5lYXN5cGllY2hhcnQgLnBlcmNlbnQgewogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LXNpemU6IDQ2cHg7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICBjb2xvcjogI2ZmZmZmZjsKfQouZWFzeXBpZWNoYXJ0IC5wZXJjZW50OmFmdGVyIHsKICBjb250ZW50OiAiJSI7CiAgZm9udC1zaXplOiA0NnB4OwogIGZvbnQtd2VpZ2h0OiA5MDA7CiAgbWFyZ2luLWxlZnQ6IDFweDsKfQouZWFzeXBpZWNoYXJ0IC5jb24gewogIGZvbnQtc2l6ZTogMTZweDsKICBmb250LXdlaWdodDogNzAwOwogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjEpOwp9Ci5lYXN5cGllY2hhcnQgY2FudmFzIHsKICB3aWR0aDogMTgwcHg7CiAgaGVpZ2h0OiAxODBweDsKfQouZWFzeXBpZWNoYXJ0IGNhbnZhczphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKICBib3JkZXI6IDNweCBzb2xpZCAjMDAwOwp9CgouZmVhdHVyZXMtYXJlYSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJhY2tncm91bmQ6ICMxMDEyMmQ7CiAgei1pbmRleDoxOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgLmZsb2F0cmlnaHQgewogICAgZmxvYXQ6IGluaGVyaXQgIWltcG9ydGFudDsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQouZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBibG9jazsKICBvdmVyZmxvdzogaGlkZGVuOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgei1pbmRleDogOTk5OTsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICB9Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsOmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwogIGJhY2tncm91bmQ6ICM1ZTYxOWM7CiAgd2lkdGg6IDJweDsKICBtYXJnaW46IDAgYXV0bzsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsOmFmdGVyIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Ci5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGRpc3BsYXk6IGJsb2NrOwogIHBhZGRpbmc6IDQwcHggMCAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIHsKICAgIHBhZGRpbmc6IDMwcHggMCAwOwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpOmZpcnN0LWNoaWxkIHsKICAgIHBhZGRpbmc6IDA7CiAgfQp9Ci5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaTphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwIGF1dG87CiAgdG9wOiA5MHB4OwogIHdpZHRoOiAyMHB4OwogIGhlaWdodDogMjBweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwogIGJhY2tncm91bmQ6ICM1ZTYxOWM7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkgewogIC5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaTphZnRlciB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQouZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGk6YmVmb3JlIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMTIuNSU7CiAgcmlnaHQ6IDA7CiAgd2lkdGg6IDUwJTsKICBoZWlnaHQ6IDJweDsKICBiYWNrZ3JvdW5kOiAjNWU2MTljOwogIHRvcDogOTlweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpOmJlZm9yZSB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQouZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkucmw6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHJpZ2h0OiAwOwogIG1hcmdpbjogMCBhdXRvOwogIHRvcDogOTBweDsKICB3aWR0aDogMjBweDsKICBoZWlnaHQ6IDIwcHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICBiYWNrZ3JvdW5kOiAjNWU2MTljOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkucmw6YWZ0ZXIgewogICAgZGlzcGxheTogbm9uZTsKICB9Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpLnJsOmJlZm9yZSB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDE2JTsKICByaWdodDogMDsKICB3aWR0aDogNDAlOwogIGhlaWdodDogMnB4OwogIGJhY2tncm91bmQ6ICM1ZTYxOWM7CiAgdG9wOiA5OXB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkucmw6YmVmb3JlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Ci5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaSAuY29udGVudHMtbCB7CiAgZGlzcGxheTogYmxvY2s7CiAgcGFkZGluZzogNDBweCAwOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkgLmNvbnRlbnRzLWwgewogICAgcGFkZGluZzogMDsKICB9Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5jb250ZW50cy1sIGgyIHsKICBjb2xvcjogI2ZmZjsKICBmb250LXdlaWdodDogNDAwOwogIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgbWFyZ2luOiAwIDAgMjBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5jb250ZW50cy1sIGgyIHsKICAgIGZvbnQtc2l6ZTogMjRweDsKICB9Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5jb250ZW50cy1sIHAgewogIGNvbG9yOiAjODQ4NmE2OwogIG1hcmdpbjogMCAwIDIwcHg7Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5jb250ZW50cy1sIGEgewogIGZvbnQtc2l6ZTogMTRweDsKICBmb250LXdlaWdodDogNzAwOwp9Ci5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaSAuaW1ncy1sIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIDAgMCA3MHB4OwogIHRleHQtYWxpZ246IGxlZnQ7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkgewogIC5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaSAuaW1ncy1sIHsKICAgIG1hcmdpbjogMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICB9Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5pbWdzLWwgaW1nIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5jb250ZW50cy1yIHsKICBkaXNwbGF5OiBibG9jazsKICBwYWRkaW5nOiA0MHB4IDA7CiAgbWFyZ2luLWxlZnQ6IDkwcHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkgewogIC5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaSAuY29udGVudHMtciB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwogIH0KfQouZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkgLmNvbnRlbnRzLXIgaDIgewogIGNvbG9yOiAjZmZmOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBtYXJnaW46IDAgMCAyMHB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAuZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkgLmNvbnRlbnRzLXIgaDIgewogICAgZm9udC1zaXplOiAyNHB4OwogIH0KfQouZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkgLmNvbnRlbnRzLXIgcCB7CiAgY29sb3I6ICM4NDg2YTY7CiAgbWFyZ2luOiAwIDAgMjBweDsKfQouZmVhdHVyZXMtYXJlYSAuZmVhdHVyZWQtbGlzdHMgdWwgbGkgLmNvbnRlbnRzLXIgYSB7CiAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiA3MDA7Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5pbWdzLXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW46IDAgNzBweCAwIDA7CiAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkgewogIC5mZWF0dXJlcy1hcmVhIC5mZWF0dXJlZC1saXN0cyB1bCBsaSAuaW1ncy1yIHsKICAgIG1hcmdpbjogMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICB9Cn0KLmZlYXR1cmVzLWFyZWEgLmZlYXR1cmVkLWxpc3RzIHVsIGxpIC5pbWdzLXIgaW1nIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5zdGVwcy1hcmVhIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZGlzcGxheTogYmxvY2s7CiAgYmFja2dyb3VuZDogIzEwMTIyZDsKfQouc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyB7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiA3MHB4OwogIGxpbmUtaGVpZ2h0OiA3MHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiA5OTk7Cn0KLnN0ZXBzLWFyZWEgLnN0ZXBzLWhlYWRpbmcgaDIgewogIG1hcmdpbjogMDsKICBjb2xvcjogI2ZmZjsKICBmb250LXNpemU6IDQwcHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBsaW5lLWhlaWdodDogNzBweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWFyZWEgLnN0ZXBzLWhlYWRpbmcgaDIgewogICAgZm9udC1zaXplOiAzMHB4OwogIH0KfQouc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzIwcHgpIHsKICAuc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1hcmdpbi1yaWdodDogMDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogIH0KfQouc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIHNwYW4gewogIGNvbG9yOiAjODQ4NmE2OwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtc2l6ZTogMTRweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWFyZWEgLnN0ZXBzLWhlYWRpbmcgLnJpZ2h0LWNvbiBzcGFuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Ci5zdGVwcy1hcmVhIC5zdGVwcy1oZWFkaW5nIC5yaWdodC1jb24gYSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGNvbG9yOiAjODQ4NmE2OwogIHdpZHRoOiA3MHB4OwogIGhlaWdodDogNzBweDsKICBib3JkZXI6IDNweCBzb2xpZCAjODQ4NmE2OwogIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgbGluZS1oZWlnaHQ6IDY0cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtc2l6ZTogMjZweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWFyZ2luLWxlZnQ6IDE1cHg7Cn0KLnN0ZXBzLWFyZWEgLnN0ZXBzLWhlYWRpbmcgLnJpZ2h0LWNvbiBhOmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDEwMCU7CiAgYm90dG9tOiAtMTAzcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgd2lkdGg6IDJweDsKICBiYWNrZ3JvdW5kOiAjODQ4NmE2OwogIHotaW5kZXg6IDk7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1hcmVhIC5zdGVwcy1oZWFkaW5nIC5yaWdodC1jb24gYTphZnRlciB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQouc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIGE6YmVmb3JlIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDEwMCU7CiAgYm90dG9tOiAwOwogIG1hcmdpbjogMCBhdXRvOwogIHdpZHRoOiAycHg7CiAgYmFja2dyb3VuZDojMzI5N2NjOwogIHotaW5kZXg6IDk5OwogIHRyYW5zaXRpb246IGFsbCAwLjVzOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAuc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIGE6YmVmb3JlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Ci5zdGVwcy1hcmVhIC5zdGVwcy1oZWFkaW5nIC5yaWdodC1jb24gYSBpIHsKICBhbmltYXRpb246IGFuaW1hdGUgMXMgbGluZWFyIGluZmluaXRlOwp9Ci5zdGVwcy1hcmVhIC5zdGVwcy1oZWFkaW5nIC5yaWdodC1jb24gYTpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwoKICBib3JkZXI6IDNweCBzb2xpZCByZ2IoNTgsIDE1OSwgMTY1KTsKICBjb2xvcjogI2ZmZjsKfQouc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIGE6aG92ZXI6YmVmb3JlIHsKICBib3R0b206IC0xMDNweDsKfQouc3RlcHMtYXJlYSAuc3RlcHMtaGVhZGluZyAucmlnaHQtY29uIGE6aG92ZXIgaSB7CiAgYW5pbWF0aW9uOiBub25lOwp9CgpAa2V5ZnJhbWVzIGFuaW1hdGUgewogIDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKICAgIHRleHQtc2hhZG93OiAwIDUwcHggMCAjODQ4NmE2OwogIH0KICAyMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICB0ZXh0LXNoYWRvdzogMCAxMHB4IDAgIzg0ODZhNjsKICB9CiAgNDAlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpOwogICAgdGV4dC1zaGFkb3c6IDAgMTBweCAwICM4NDg2YTY7CiAgfQogIDYwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgIHRleHQtc2hhZG93OiAwIDBweCAwICM4NDg2YTY7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsKICAgIHRleHQtc2hhZG93OiAwIC01MHB4IDAgIzg0ODZhNjsKICB9Cn0KLnN0ZXBzLWRldGFpbHMgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbjogMCAwIC00cHg7Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGkgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBwYWRkaW5nOiAxMDVweDsKICBkaXNwbGF5OiBibG9jazsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIG1hcmdpbjogMCAwIC0ycHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpIHsKICAgIHBhZGRpbmc6IDgwcHggNTBweDsKICB9Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGkgLm1pZC1pY29ucyB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGJvdHRvbTogLTE0cHg7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgbWFyZ2luOiAwIGF1dG87CiAgaGVpZ2h0OiAyOHB4OwogIHdpZHRoOiAyOHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgei1pbmRleDogOTk5OwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaSAubWlkLWljb25zIGltZyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOmJlZm9yZSB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDQ4cHg7CiAgcmlnaHQ6IDQ4cHg7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKICBib3JkZXItdG9wOiAycHggc29saWQgIzMyOTdjYzsKICBib3JkZXItcmFkaXVzOiAwOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOmJlZm9yZXsKICAgIGxlZnQ6IDMycHg7CiAgICByaWdodDogMzhweDsKICB9Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6YWZ0ZXIgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTRweDsKICByaWdodDogMzRweDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwogIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICMzMjk3Y2M7CiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICMzMjk3Y2M7CiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzMjk3Y2M7CiAgYm9yZGVyLXJhZGl1czogMCAxMHB4IDEwcHggMDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6YWZ0ZXIgewogICAgcmlnaHQ6IDI0cHg7CiAgfQp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOmZpcnN0LWNoaWxkOmJlZm9yZSB7CiAgZGlzcGxheTogbm9uZTsKfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaTpmaXJzdC1jaGlsZDphZnRlciB7CiAgYm9yZGVyLXJhZGl1czogMCAwIDEwcHggMDsKICBib3JkZXItdG9wOiBub25lOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLmwtY29uIHsKICB0ZXh0LWFsaWduOiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLmwtY29uIHsKICAgIHBhZGRpbmctcmlnaHQ6IDcwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgfQp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLmwtY29uIC5jb250IGgyIHsKICBtYXJnaW46IDAgMCA1cHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBjb2xvcjogIzMyOTdjYzsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGkubC1jb24gLmNvbnQgaDIgewogICAgZm9udC1zaXplOiAyNHB4OwogIH0KfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5sLWNvbiAuY29udCBwIHsKICBtYXJnaW46IDA7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLmwtY29uIC5jb250IHAgewogICAgZm9udC1zaXplOiAxNHB4OwogIH0KfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5sLWNvbiBzcGFuIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgd2lkdGg6IDcwcHg7CiAgaGVpZ2h0OiA3MHB4OwogIGJhY2tncm91bmQ6IHJnYmEoNTcsMTAwLDIwOCwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKICBjb2xvcjogI2ZmZjsKICBmb250LXNpemU6IDMwcHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdG9wOiAzOSU7CiAgbGluZS1oZWlnaHQ6IDcwcHg7CiAgei1pbmRleDogOTk5Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAuc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5sLWNvbiBzcGFuIHsKICAgIGhlaWdodDogNTBweDsKICAgIHdpZHRoOiA1MHB4OwogICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLnItY29uIHsKICB0ZXh0LWFsaWduOiBsZWZ0OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGkuci1jb24gewogICAgcGFkZGluZy1sZWZ0OiA3MHB4OwogICAgcGFkZGluZy1yaWdodDogMDsKICB9Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGkuci1jb246YWZ0ZXIgewogIGxlZnQ6IDM0cHg7CiAgcmlnaHQ6IGluaGVyaXQ7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMzI5N2NjOwogIGJvcmRlci1yaWdodDogbm9uZTsKICBib3JkZXItcmFkaXVzOiAxMHB4IDAgMCAxMHB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAuc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5yLWNvbjphZnRlciB7CiAgICBsZWZ0OiAyNHB4OwogIH0KfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5yLWNvbjpsYXN0LWNoaWxkOmFmdGVyIHsKICBib3JkZXItcmFkaXVzOiAxMHB4IDAgMCAwOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLnItY29uIC5jb250IGgyIHsKICBtYXJnaW46IDAgMCA1cHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBjb2xvcjogIzMyOTdjYzsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGkuci1jb24gLmNvbnQgaDIgewogICAgZm9udC1zaXplOiAyNHB4OwogIH0KfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5yLWNvbiAuY29udCBwIHsKICBtYXJnaW46IDA7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLnItY29uIC5jb250IHAgewogICAgZm9udC1zaXplOiAxNHB4OwogIH0KfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaS5yLWNvbiBzcGFuIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsKICB3aWR0aDogNzBweDsKICBoZWlnaHQ6IDcwcHg7CiAgYmFja2dyb3VuZDogcmdiYSg1NywxMDAsMjA4LDEpOwpiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsZWZ0IHRvcCwgcmlnaHQgdG9wLCBjb2xvci1zdG9wKDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpLCBjb2xvci1zdG9wKDEwMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSkpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwogIGNvbG9yOiAjZmZmOwogIGZvbnQtc2l6ZTogMzBweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB0b3A6IDM5JTsKICBsaW5lLWhlaWdodDogNzBweDsKICB6LWluZGV4OiA5OTk7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpLnItY29uIHNwYW4gewogICAgaGVpZ2h0OiA1MHB4OwogICAgd2lkdGg6IDUwcHg7CiAgICBsaW5lLWhlaWdodDogNTBweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICB9Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6bnRoLWNoaWxkKDMpOmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDU1JTsKICByaWdodDogMzRweDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwogIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICMzMjk3Y2M7CiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICMzMjk3Y2M7CiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzMjk3Y2M7CiAgYm9yZGVyLXJhZGl1czogMCAxMHB4IDEwcHggMDsKfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaTpudGgtY2hpbGQoNCk6YmVmb3JlIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNDhweDsKICByaWdodDogaW5oZXJpdDsKICB3aWR0aDogNDUlOwogIHRvcDogMDsKICBib3R0b206IDA7CiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICM1ZTYxOWM7CiAgYm9yZGVyLXJhZGl1czogMDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6bnRoLWNoaWxkKDQpOmJlZm9yZSB7CiAgICBsZWZ0OiAzMnB4OwogIH0KfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaTpudGgtY2hpbGQoNCk6YWZ0ZXIgewogIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzVlNjE5YzsKICBib3JkZXItdG9wOiAycHggc29saWQgIzVlNjE5YzsKICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzVlNjE5YzsKfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaTpudGgtY2hpbGQoNCkgLmNvbnQgaDIgewogIG1hcmdpbjogMCAwIDVweDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiAjMzI5N2NjOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg0KSAuY29udCBwIHsKICBtYXJnaW46IDA7Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6bnRoLWNoaWxkKDQpIHNwYW4gewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMDsKICB3aWR0aDogNzBweDsKICBoZWlnaHQ6IDcwcHg7CiAgbGluZS1oZWlnaHQ6IDY2cHg7CiAgYm9yZGVyOiAycHggc29saWQgIzVlNjE5YzsKICBiYWNrZ3JvdW5kOiAjMGIwYzIyOwogIGNvbG9yOiAjZmZmZmZmOwogIGZvbnQtc2l6ZTogMzBweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB0b3A6IDM5JTsKICB6LWluZGV4OiA5OTk7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg0KSBzcGFuIHsKICAgIGhlaWdodDogNTBweDsKICAgIHdpZHRoOiA1MHB4OwogICAgbGluZS1oZWlnaHQ6IDQ2cHg7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg1KTpiZWZvcmUgewogIGJvcmRlci10b3A6IDJweCBzb2xpZCAjNWU2MTljOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg1KTphZnRlciB7CiAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzVlNjE5YzsKICBib3JkZXItdG9wOiAycHggc29saWQgIzVlNjE5YzsKICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzVlNjE5YzsKfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaTpudGgtY2hpbGQoNSkgLmNvbnQgaDIgewogIG1hcmdpbjogMCAwIDVweDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiAjMzI5N2NjOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg1KSAuY29udCBwIHsKICBtYXJnaW46IDA7Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6bnRoLWNoaWxkKDUpIHNwYW4gewogIGxpbmUtaGVpZ2h0OiA2NnB4OwogIGJvcmRlcjogMnB4IHNvbGlkICM4NDg2YTY7CiAgYmFja2dyb3VuZDogIzBiMGMyMjsKICBjb2xvcjogI2ZmZmZmZjsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6bnRoLWNoaWxkKDUpIHNwYW4gewogICAgbGluZS1oZWlnaHQ6IDQ2cHg7CiAgfQp9Ci5zdGVwcy1kZXRhaWxzLCAudmlkZW8tZGVzewoJYmFja2dyb3VuZDojMDgwOTFiOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg2KTpiZWZvcmUgewogIGJvcmRlci10b3A6IDJweCBzb2xpZCAjNWU2MTljOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg2KTphZnRlciB7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjNWU2MTljOwogIGJvcmRlci10b3A6IDJweCBzb2xpZCAjNWU2MTljOwogIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLnN0ZXBzLWRldGFpbHMgLnN0ZXBzLWNvbnQgdWwgbGk6bnRoLWNoaWxkKDYpIC5jb250IGgyIHsKICBtYXJnaW46IDAgMCA1cHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBjb2xvcjogIzMyOTdjYzsKfQouc3RlcHMtZGV0YWlscyAuc3RlcHMtY29udCB1bCBsaTpudGgtY2hpbGQoNikgLmNvbnQgcCB7CiAgbWFyZ2luOiAwOwp9Ci5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg2KSBzcGFuIHsKICBsaW5lLWhlaWdodDogNjZweDsKICBib3JkZXI6IDJweCBzb2xpZCAjODQ4NmE2OwogIGJhY2tncm91bmQ6ICMwYjBjMjI7CiAgY29sb3I6ICNmZmZmZmY7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC5zdGVwcy1kZXRhaWxzIC5zdGVwcy1jb250IHVsIGxpOm50aC1jaGlsZCg2KSBzcGFuIHsKICAgIGxpbmUtaGVpZ2h0OiA0NnB4OwogIH0KfQoKLnN1ZCB7CiAgd2lkdGg6IDEwMCU7CiAgZGlzcGxheTogYmxvY2s7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIG1hcmdpbjogMCAwIC05cHg7CiAgYmFja2dyb3VuZDojMDgwOTFiOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAuc3VkIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Cgpib2R5LmRhdGUtMjAxODAyMTIuZXhwLWludmVydC1sb2dvIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogIGJvcmRlci1yYWRpdXM6IDI1cHggIWltcG9ydGFudDsKfQoKLmh0bWw1LXZpZGVvLXBsYXllcjpub3QoLnl0cC10cmFuc3BhcmVudCkgewogIGJhY2tncm91bmQ6ICNmZmYgIWltcG9ydGFudDsKICBib3JkZXItcmFkaXVzOiAyNXB4ICFpbXBvcnRhbnQ7Cn0KCi52aWRlby1hcmVhIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZGlzcGxheTogYmxvY2s7CiAgYmFja2dyb3VuZDogIzEwMTIyZDsKICBwYWRkaW5nLWJvdHRvbTogMTIwcHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbjogMDsKfQoudmlkZW8tYXJlYSAudmlkZW9zLWhlZGluZyBoMiB7CiAgZm9udC1zaXplOiA0MHB4OwogIGNvbG9yOiAjZmZmOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgbWFyZ2luOiAwIDAgNjBweDsKfQoudmlkZW8tYXJlYSAudmlkZW9zLWhlZGluZyAudmlkZW9zLWJveCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbjogMCAwIC0xNzVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogOTk5OwogIGJvcmRlci1yYWRpdXM6IDI1cHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci52aWRlby1hcmVhIC52aWRlb3MtaGVkaW5nIC52aWRlb3MtYm94OmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMTAlOwogIHJpZ2h0OiAxMCU7CiAgdG9wOiAtMjBweDsKICBib3R0b206IDA7CiAgYm9yZGVyLXJhZGl1czogMjBweDsKICBiYWNrZ3JvdW5kOiAjZTA1ZDVlOwogIHotaW5kZXg6IDE7Cn0KLnZpZGVvLWFyZWEgLnZpZGVvcy1oZWRpbmcgLnZpZGVvcy1ib3ggLnZpZGVvLWpzIC52anMtY29udHJvbC1iYXIgewogIGJvdHRvbTogMjBweDsKICBsZWZ0OiAxMCU7CiAgcmlnaHQ6IDEwJTsKICB3aWR0aDogYXV0bzsKfQoudmlkZW8tYXJlYSAudmlkZW9zLWhlZGluZyAudmlkZW9zLWJveCAudmlkZW8tanMgewogIGJhY2tncm91bmQ6ICNmZmY7CiAgYm9yZGVyLXJhZGl1czogMzBweDsKICBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICB6LWluZGV4OiA5OTsKfQoudmlkZW8tYXJlYSAudmlkZW9zLWhlZGluZyAudmlkZW9zLWJveCAudmpzLXBvc3RlciB7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBib3JkZXItcmFkaXVzOiAzMHB4Owp9Ci52aWRlby1hcmVhIC52aWRlb3MtaGVkaW5nIC52aWRlb3MtYm94IC52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbiB7CiAgd2lkdGg6IDEyNXB4OwogIGhlaWdodDogMTI1cHg7CiAgYm9yZGVyLXJhZGl1czogMTAwJTsKICBiYWNrZ3JvdW5kOiAjZmZmOwogIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICBsZWZ0OiAwOwogIHJpZ2h0OiAwOwogIHRvcDogMzIlOwogIG1hcmdpbjogMCBhdXRvOwp9Ci52aWRlby1hcmVhIC52aWRlb3MtaGVkaW5nIC52aWRlb3MtYm94IC52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbjpiZWZvcmUgewogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2ljb25zL3ZpZC5wbmcpIG5vLXJlcGVhdCBjZW50ZXI7CiAgaGVpZ2h0OiAxMjVweDsKICB3aWR0aDogNTBweDsKICBsaW5lLWhlaWdodDogMTI1cHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDA7Cn0KLnZpZGVvLWFyZWEgLnZpZGVvcy1oZWRpbmcgLnZpZGVvcy1ib3ggLnZqcy1pY29uLXBsYXk6YmVmb3JlIHsKICBkaXNwbGF5OiBub25lOwp9CgouY2hhcnQgewogIGRpc3BsYXk6IGJsb2NrOwp9CgovKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgo1LiBUZWFtIGFyZWEgc3RhcnQgaGVyZQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwoudGVhbS1hcmVhIHsKICBiYWNrZ3JvdW5kOiAjMTAxMjJkOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoudGVhbS1hcmVhIC50ZWFtLWxpc3QgewogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBoZWlnaHQ6IDM1MHB4OwogIG1hcmdpbi10b3A6IDE4cHg7CiAgYm9yZGVyLXJhZGl1czogMTVweDsKICBiYWNrZ3JvdW5kOiAjMDgwOTFiOwogIG1hcmdpbi1ib3R0b206IDUwcHg7Cn0KLnRlYW0tYXJlYSAudGVhbS1saXN0OmFmdGVyIHsKICBjb250ZW50OiAnJzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNTBweDsKICByaWdodDogNTBweDsKICB0b3A6IC0xOHB4OwogIGJvdHRvbTogMDsKICBoZWlnaHQ6IDEwMHB4OwogIGJhY2tncm91bmQ6IHJnYmEoNTcsMTAwLDIwOCwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDU3LDEwMCwyMDgsMSkgMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSAxMDAlKTsKICBib3JkZXItcmFkaXVzOiAxNXB4Owp9Ci50ZWFtLWFyZWEgLnRlYW0tbGlzdCAuY29udGUgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiA5OTk5OwogIHBhZGRpbmc6IDAgNDVweDsKICBwYWRkaW5nLXRvcDogNDVweDsKICBiYWNrZ3JvdW5kOiAjMDgwOTFiOwogIHotaW5kZXg6IDk5OTsKICBib3JkZXItcmFkaXVzOiAxNXB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmNvbnRlIHsKICAgIHBhZGRpbmc6IDMwcHggMjBweCAwIDIwcHg7CiAgfQp9Ci50ZWFtLWFyZWEgLnRlYW0tbGlzdCAuZGJveCB7CiAgbWFyZ2luOiAwIDAgMjVweDsKfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5kbGVmdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZmxvYXQ6IGluaGVyaXQ7CiAgfQp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICAudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmRyaWdodCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgaDMgewogIGZvbnQtc2l6ZTogMjZweDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiAjZmZmZmZmOwogIG1hcmdpbjogMDsKfQoudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgc3BhbiB7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MSk7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIDAgMjBweDsKfQoudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcGFkZGluZzogMCA1cHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC50ZWFtLWFyZWEgLnRlYW0tbGlzdCAuZGJveCAuY29udGVudCB1bCBsaSB7CiAgICBwYWRkaW5nOiAwOwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpIHsKICAgIHBhZGRpbmc6IDAgNTsKICB9Cn0KLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpOmZpcnN0LWNoaWxkIHsKICBwYWRkaW5nLWxlZnQ6IDA7Cn0KLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpOmxhc3QtY2hpbGQgewogIHBhZGRpbmctcmlnaHQ6IDA7Cn0KLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpIGEgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiA1MHB4OwogIGhlaWdodDogNTBweDsKICBsaW5lLWhlaWdodDogNTBweDsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGNvbG9yOiAjZmZmZmZmOwogIGZvbnQtc2l6ZTogMjBweDsKICBib3JkZXItcmFkaXVzOiAxMDAlOwp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgYSB7CiAgICB3aWR0aDogNDBweDsKICAgIGhlaWdodDogNDBweDsKICAgIGxpbmUtaGVpZ2h0OiAzNHB4OwogICAgZm9udC1zaXplOiAxNnB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpIGEgewogICAgd2lkdGg6IDUwcHg7CiAgICBoZWlnaHQ6IDUwcHg7CiAgICBsaW5lLWhlaWdodDogNDRweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICB9Cn0KLnRlYW0tYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpIGE6aG92ZXIgewogIGNvbG9yOiAjZmZmZmZmOwpiYWNrZ3JvdW5kOiByZ2JhKDQ1LDE5MywyMDEsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNDUsMTkzLDIwMSwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg1NywxMDAsMjA4LDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNDUsMTkzLDIwMSwxKSAwJSwgcmdiYSg1NywxMDAsMjA4LDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7Cn0KLnRlYW0tYXJlYSAudGVhbS1saXN0IC5jb24gcCB7CiAgcGFkZGluZzogMCAyMHB4Owp9CkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHsKICAudGVhbS1hcmVhIC50ZWFtLWxpc3QgLmNvbiBwIHsKICAgIHBhZGRpbmc6IDA7CiAgfQp9CgoudGVhbTItYXJlYSB7CiAgYmFja2dyb3VuZDogIzEwMTIyZDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLnRlYW0yLWFyZWEgLnRlYW0tbGlzdCB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGhlaWdodDogMzUwcHg7CiAgbWFyZ2luLXRvcDogMThweDsKICBib3JkZXItcmFkaXVzOiAxNXB4OwogIGJhY2tncm91bmQ6ICMxMDEyMmQ7CiAgbWFyZ2luLWJvdHRvbTogNTBweDsKICB0cmFuc2l0aW9uOiBhbGwgMC41czsKfQoudGVhbTItYXJlYSAudGVhbS1saXN0OmhvdmVyIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7Cn0KLnRlYW0yLWFyZWEgLnRlYW0tbGlzdDphZnRlciB7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDUwcHg7CiAgcmlnaHQ6IDUwcHg7CiAgdG9wOiAtMThweDsKICBib3R0b206IDA7CiAgaGVpZ2h0OiAxMDBweDsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgYm9yZGVyLXJhZGl1czogMTVweDsKfQoudGVhbTItYXJlYSAudGVhbS1saXN0IC5jb250ZSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDk5OTk7CiAgcGFkZGluZzogMCA0NXB4OwogIHBhZGRpbmctdG9wOiA0NXB4OwogIGJhY2tncm91bmQ6ICMxMDEyMmQ7CiAgei1pbmRleDogOTk5OwogIGJvcmRlci1yYWRpdXM6IDE1cHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmNvbnRlIHsKICAgIHBhZGRpbmc6IDMwcHggMjBweCAwIDIwcHg7CiAgfQp9Ci50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggewogIG1hcmdpbjogMCAwIDI1cHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmRsZWZ0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmbG9hdDogaW5oZXJpdDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweCkgewogIC50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmRyaWdodCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoudGVhbTItYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IGgzIHsKICBmb250LXNpemU6IDI2cHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBjb2xvcjogI2ZmZmZmZjsKICBtYXJnaW46IDA7Cn0KLnRlYW0yLWFyZWEgLnRlYW0tbGlzdCAuZGJveCAuY29udGVudCBzcGFuIHsKICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYxKTsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW46IDAgMCAyMHB4Owp9Ci50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcGFkZGluZzogMCA1cHg7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgewogICAgcGFkZGluZzogMDsKICB9Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkgewogIC50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgewogICAgcGFkZGluZzogMCA1OwogIH0KfQoudGVhbTItYXJlYSAudGVhbS1saXN0IC5kYm94IC5jb250ZW50IHVsIGxpOmZpcnN0LWNoaWxkIHsKICBwYWRkaW5nLWxlZnQ6IDA7Cn0KLnRlYW0yLWFyZWEgLnRlYW0tbGlzdCAuZGJveCAuY29udGVudCB1bCBsaTpsYXN0LWNoaWxkIHsKICBwYWRkaW5nLXJpZ2h0OiAwOwp9Ci50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgYSB7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDUwcHg7CiAgaGVpZ2h0OiA1MHB4OwogIGxpbmUtaGVpZ2h0OiA1MHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBiYWNrZ3JvdW5kOiByZ2JhKDU3LDEwMCwyMDgsMSk7CmJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSksIGNvbG9yLXN0b3AoMTAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSk7CmJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsIHJnYmEoNTcsMTAwLDIwOCwxKSAwJSwgcmdiYSg0NSwxOTMsMjAxLDEpIDEwMCUpOwpiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CmJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSg1NywxMDAsMjA4LDEpIDAlLCByZ2JhKDQ1LDE5MywyMDEsMSkgMTAwJSk7CiAgY29sb3I6ICNmZmZmZmY7CiAgZm9udC1zaXplOiAyMHB4OwogIGJvcmRlci1yYWRpdXM6IDEwMCU7Cn0KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTJweCkgewogIC50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgYSB7CiAgICB3aWR0aDogNDBweDsKICAgIGhlaWdodDogNDBweDsKICAgIGxpbmUtaGVpZ2h0OiAzNHB4OwogICAgZm9udC1zaXplOiAxNnB4OwogIH0KfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgLnRlYW0yLWFyZWEgLnRlYW0tbGlzdCAuZGJveCAuY29udGVudCB1bCBsaSBhIHsKICAgIHdpZHRoOiA1MHB4OwogICAgaGVpZ2h0OiA1MHB4OwogICAgbGluZS1oZWlnaHQ6IDQ0cHg7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQp9Ci50ZWFtMi1hcmVhIC50ZWFtLWxpc3QgLmRib3ggLmNvbnRlbnQgdWwgbGkgYTpob3ZlciB7CiAgY29sb3I6ICNmZmZmZmY7CmJhY2tncm91bmQ6IHJnYmEoNDUsMTkzLDIwMSwxKTsKYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGVmdCB0b3AsIHJpZ2h0IHRvcCwgY29sb3Itc3RvcCgwJSwgcmdiYSg0NSwxOTMsMjAxLDEpKSwgY29sb3Itc3RvcCgxMDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkpKTsKYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSg0NSwxOTMsMjAxLDEpIDAlLCByZ2JhKDU3LDEwMCwyMDgsMSkgMTAwJSk7CmJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDQ1LDE5MywyMDEsMSkgMCUsIHJnYmEoNTcsMTAwLDIwOCwxKSAxMDAlKTsKfQoudGVhbTItYXJlYXsKCWJhY2tncm91bmQ6IzA4MDkxYjsKfQoudGVhbTItYXJlYSAudGVhbS1saXN0IC5jb24gcCB7CiAgcGFkZGluZzogMCAyMHB4Owp9CgovKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgo4LiBQcmljZSBsaXN0IGFyZWEgc3RhcnQgaGVyZQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwovKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoxMi4gRmFxIGFyZWEgc3RhcnQgaGVyZQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwouc2xpZGVyLWFyZWF7Cglwb3NpdGlvbjpyZWxhdGl2ZTsKCWJhY2tncm91bmQ6IzA4MDkxYjsKfSAKY2FudmFzewoJcG9zaXRpb246YWJzb2x1dGU7Cgl3aWR0aDoxMDAlICFpbXBvcnRhbnQ7CglsZWZ0OjA7CglyaWdodDowOwoJei1pbmRleDoxMDsKfQpAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpewoJLnRva2VuLWRldGFpbHMgLmNhcnQtbGlzdCAuaW1nc3sKCQlkaXNwbGF5Om5vbmU7Cgl9Cn0="}},"time_used":291,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":291,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/stats.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.288Z","timestamp":1785147795288,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/stats.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:24 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 858\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1855,"size_decoded":1401,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (507)","md5":"a18d9a11cbd79f312087c3bcc39ee310","sha1":"0a40100a2b292a486882bcd64d90cfdd7c50454a","sha256":"b1c6652e0d103519c9201caaac1d19064b28e664e655be5f5c6c0164c1995600","sha512":"b1d1b8038526820ae142daa2584e17be5529964554f57e7ae87dfd77b4b7760c10d94285002ca83ff183b5eea523666171399888c34d32b1fc1951adf0239dc6","ssdeep":"","tlshash":"12312448a6b0b6d29ab1349a78de98c3b4611975682bcd0a40fdc055eca5d49058eb8f","first_seen":"2023-03-10T14:48:17Z","last_seen":"2026-08-12T23:01:35.109211Z","times_seen":89,"resource_available":true,"data":"Ly8gc3RhdHMuanMgLSBodHRwOi8vZ2l0aHViLmNvbS9tcmRvb2Ivc3RhdHMuanMKdmFyIFN0YXRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhKXtjLmFwcGVuZENoaWxkKGEuZG9tKTtyZXR1cm4gYX1mdW5jdGlvbiBrKGEpe2Zvcih2YXIgZD0wO2Q8Yy5jaGlsZHJlbi5sZW5ndGg7ZCsrKWMuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT1kPT09YT8iYmxvY2siOiJub25lIjtsPWF9dmFyIGw9MCxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MC45O3otaW5kZXg6MTAwMDAiO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtrKCsrbCVjLmNoaWxkcmVuLmxlbmd0aCl9LCExKTt2YXIgZz0ocGVyZm9ybWFuY2V8fERhdGUpLm5vdygpLGU9ZyxhPTAscj1oKG5ldyBTdGF0cy5QYW5lbCgiRlBTIiwiIzBmZiIsIiMwMDIiKSksZj1oKG5ldyBTdGF0cy5QYW5lbCgiTVMiLCIjMGYwIiwiIzAyMCIpKTsKaWYoc2VsZi5wZXJmb3JtYW5jZSYmc2VsZi5wZXJmb3JtYW5jZS5tZW1vcnkpdmFyIHQ9aChuZXcgU3RhdHMuUGFuZWwoIk1CIiwiI2YwOCIsIiMyMDEiKSk7aygwKTtyZXR1cm57UkVWSVNJT046MTYsZG9tOmMsYWRkUGFuZWw6aCxzaG93UGFuZWw6ayxiZWdpbjpmdW5jdGlvbigpe2c9KHBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKX0sZW5kOmZ1bmN0aW9uKCl7YSsrO3ZhciBjPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCk7Zi51cGRhdGUoYy1nLDIwMCk7aWYoYz5lKzFFMyYmKHIudXBkYXRlKDFFMyphLyhjLWUpLDEwMCksZT1jLGE9MCx0KSl7dmFyIGQ9cGVyZm9ybWFuY2UubWVtb3J5O3QudXBkYXRlKGQudXNlZEpTSGVhcFNpemUvMTA0ODU3NixkLmpzSGVhcFNpemVMaW1pdC8xMDQ4NTc2KX1yZXR1cm4gY30sdXBkYXRlOmZ1bmN0aW9uKCl7Zz10aGlzLmVuZCgpfSxkb21FbGVtZW50OmMsc2V0TW9kZTprfX07ClN0YXRzLlBhbmVsPWZ1bmN0aW9uKGgsayxsKXt2YXIgYz1JbmZpbml0eSxnPTAsZT1NYXRoLnJvdW5kLGE9ZSh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSkscj04MCphLGY9NDgqYSx0PTMqYSx1PTIqYSxkPTMqYSxtPTE1KmEsbj03NCphLHA9MzAqYSxxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Eud2lkdGg9cjtxLmhlaWdodD1mO3Euc3R5bGUuY3NzVGV4dD0id2lkdGg6ODBweDtoZWlnaHQ6NDhweCI7dmFyIGI9cS5nZXRDb250ZXh0KCIyZCIpO2IuZm9udD0iYm9sZCAiKzkqYSsicHggSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWYiO2IudGV4dEJhc2VsaW5lPSJ0b3AiO2IuZmlsbFN0eWxlPWw7Yi5maWxsUmVjdCgwLDAscixmKTtiLmZpbGxTdHlsZT1rO2IuZmlsbFRleHQoaCx0LHUpO2IuZmlsbFJlY3QoZCxtLG4scCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCxtLG4scCk7cmV0dXJue2RvbTpxLHVwZGF0ZTpmdW5jdGlvbihmLAp2KXtjPU1hdGgubWluKGMsZik7Zz1NYXRoLm1heChnLGYpO2IuZmlsbFN0eWxlPWw7Yi5nbG9iYWxBbHBoYT0xO2IuZmlsbFJlY3QoMCwwLHIsbSk7Yi5maWxsU3R5bGU9aztiLmZpbGxUZXh0KGUoZikrIiAiK2grIiAoIitlKGMpKyItIitlKGcpKyIpIix0LHUpO2IuZHJhd0ltYWdlKHEsZCthLG0sbi1hLHAsZCxtLG4tYSxwKTtiLmZpbGxSZWN0KGQrbi1hLG0sYSxwKTtiLmZpbGxTdHlsZT1sO2IuZ2xvYmFsQWxwaGE9Ljk7Yi5maWxsUmVjdChkK24tYSxtLGEsZSgoMS1mL3YpKnApKX19fTsib2JqZWN0Ij09PXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz1TdGF0cyk7Cg=="}},"time_used":590,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":590,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/jquery.meanmenu.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.304Z","timestamp":1785147795304,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/jquery.meanmenu.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 1304\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":4027,"size_decoded":1848,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (4027), with no line terminators","md5":"17e1ef9e05e97b31d5a556ef896a5e4a","sha1":"0ed4f5e751b41717d032e6de923298bea258c362","sha256":"b65c7d6040a61fcac73e3d80fa612af9cb600262fe5dbdf1afcb2d9730692a7a","sha512":"150fbc53180786725abe38255daa02b45bbaf017f5f4fc3c8e64304253b88e4f9c1b937111cf1d642fc4901570e19a9cbebce5d7e475314bd010b2ff5f816266","ssdeep":"","tlshash":"9d810062b57084fc24bf64e6f43ee33636f7a40af44ed400b07aa9b63425e941063add","first_seen":"2023-05-10T02:54:21Z","last_seen":"2026-08-11T00:25:55.20091Z","times_seen":77,"resource_available":true,"data":"IWZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0IjskLmZuLm1lYW5tZW51PWZ1bmN0aW9uKGUpe3ZhciBuPXttZWFuTWVudVRhcmdldDpqUXVlcnkodGhpcyksbWVhbk1lbnVDb250YWluZXI6Ii5tb2JpbGUtbWVudSIsbWVhbk1lbnVDbG9zZToiWCIsbWVhbk1lbnVDbG9zZVNpemU6IjE4cHgiLG1lYW5NZW51T3BlbjoiPHNwYW4gLz48c3BhbiAvPjxzcGFuIC8+IixtZWFuUmV2ZWFsUG9zaXRpb246InJpZ2h0IixtZWFuUmV2ZWFsUG9zaXRpb25EaXN0YW5jZToiMCIsbWVhblJldmVhbENvbG91cjoiIixtZWFuU2NyZWVuV2lkdGg6IjQ4MCIsbWVhbk5hdlB1c2g6IiIsbWVhblNob3dDaGlsZHJlbjohMCxtZWFuRXhwYW5kYWJsZUNoaWxkcmVuOiEwLG1lYW5FeHBhbmQ6IisiLG1lYW5Db250cmFjdDoiLSIsbWVhblJlbW92ZUF0dHJzOiExLG9uZVBhZ2U6ITEsbWVhbkRpc3BsYXk6ImJsb2NrIixyZW1vdmVFbGVtZW50czoiIn07ZT0kLmV4dGVuZChuLGUpO3ZhciBhPXdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPWUubWVhbk1lbnVUYXJnZXQsdD1lLm1lYW5NZW51Q29udGFpbmVyLHI9ZS5tZWFuTWVudUNsb3NlLGk9ZS5tZWFuTWVudUNsb3NlU2l6ZSxzPWUubWVhbk1lbnVPcGVuLHU9ZS5tZWFuUmV2ZWFsUG9zaXRpb24sbT1lLm1lYW5SZXZlYWxQb3NpdGlvbkRpc3RhbmNlLGw9ZS5tZWFuUmV2ZWFsQ29sb3VyLG89ZS5tZWFuU2NyZWVuV2lkdGgsYz1lLm1lYW5OYXZQdXNoLHY9Ii5tZWFubWVudS1yZXZlYWwiLGg9ZS5tZWFuU2hvd0NoaWxkcmVuLGQ9ZS5tZWFuRXhwYW5kYWJsZUNoaWxkcmVuLHk9ZS5tZWFuRXhwYW5kLGo9ZS5tZWFuQ29udHJhY3QsUT1lLm1lYW5SZW1vdmVBdHRycyxmPWUub25lUGFnZSxnPWUubWVhbkRpc3BsYXkscD1lLnJlbW92ZUVsZW1lbnRzLEM9ITE7KG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZS9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBvZC9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBhZC9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tiZXJyeS9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvV2luZG93cyBQaG9uZS9pKSkmJihDPSEwKSwobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTVNJRSA4L2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFIDcvaSkpJiZqUXVlcnkoImh0bWwiKS5jc3MoIm92ZXJmbG93LXkiLCJzY3JvbGwiKTt2YXIgdz0iIix4PWZ1bmN0aW9uKCl7aWYoImNlbnRlciI9PT11KXt2YXIgZT13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLG49ZS8yLTIyKyJweCI7dz0ibGVmdDoiK24rIjtyaWdodDphdXRvOyIsQz9qUXVlcnkoIi5tZWFubWVudS1yZXZlYWwiKS5hbmltYXRlKHtsZWZ0Om59KTpqUXVlcnkoIi5tZWFubWVudS1yZXZlYWwiKS5jc3MoImxlZnQiLG4pfX0sQT0hMSxFPSExOyJyaWdodCI9PT11JiYodz0icmlnaHQ6IittKyI7bGVmdDphdXRvOyIpLCJsZWZ0Ij09PXUmJih3PSJsZWZ0OiIrbSsiO3JpZ2h0OmF1dG87IikseCgpO3ZhciBNPSIiLFA9ZnVuY3Rpb24oKXtNLmh0bWwoalF1ZXJ5KE0pLmlzKCIubWVhbm1lbnUtcmV2ZWFsLm1lYW5jbG9zZSIpP3I6cyl9LFc9ZnVuY3Rpb24oKXtqUXVlcnkoIi5tZWFuLWJhciwubWVhbi1wdXNoIikucmVtb3ZlKCksalF1ZXJ5KHQpLnJlbW92ZUNsYXNzKCJtZWFuLWNvbnRhaW5lciIpLGpRdWVyeShuKS5jc3MoImRpc3BsYXkiLGcpLEE9ITEsRT0hMSxqUXVlcnkocCkucmVtb3ZlQ2xhc3MoIm1lYW4tcmVtb3ZlIil9LGI9ZnVuY3Rpb24oKXt2YXIgZT0iYmFja2dyb3VuZDoiK2wrIjtjb2xvcjoiK2wrIjsiK3c7aWYobz49YSl7alF1ZXJ5KHApLmFkZENsYXNzKCJtZWFuLXJlbW92ZSIpLEU9ITAsalF1ZXJ5KHQpLmFkZENsYXNzKCJtZWFuLWNvbnRhaW5lciIpLGpRdWVyeSgiLm1lYW4tY29udGFpbmVyIikucHJlcGVuZCgnPGRpdiBjbGFzcz0ibWVhbi1iYXIiPjxhIGhyZWY9IiNuYXYiIGNsYXNzPSJtZWFubWVudS1yZXZlYWwiIHN0eWxlPSInK2UrJyI+U2hvdyBOYXZpZ2F0aW9uPC9hPjxuYXYgY2xhc3M9Im1lYW4tbmF2Ij48L25hdj48L2Rpdj4nKTt2YXIgcj1qUXVlcnkobikuaHRtbCgpO2pRdWVyeSgiLm1lYW4tbmF2IikuaHRtbChyKSxRJiZqUXVlcnkoIm5hdi5tZWFuLW5hdiB1bCwgbmF2Lm1lYW4tbmF2IHVsICoiKS5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5KHRoaXMpLmlzKCIubWVhbi1yZW1vdmUiKT9qUXVlcnkodGhpcykuYXR0cigiY2xhc3MiLCJtZWFuLXJlbW92ZSIpOmpRdWVyeSh0aGlzKS5yZW1vdmVBdHRyKCJjbGFzcyIpLGpRdWVyeSh0aGlzKS5yZW1vdmVBdHRyKCJpZCIpfSksalF1ZXJ5KG4pLmJlZm9yZSgnPGRpdiBjbGFzcz0ibWVhbi1wdXNoIiAvPicpLGpRdWVyeSgiLm1lYW4tcHVzaCIpLmNzcygibWFyZ2luLXRvcCIsYyksalF1ZXJ5KG4pLmhpZGUoKSxqUXVlcnkoIi5tZWFubWVudS1yZXZlYWwiKS5zaG93KCksalF1ZXJ5KHYpLmh0bWwocyksTT1qUXVlcnkodiksalF1ZXJ5KCIubWVhbi1uYXYgdWwiKS5oaWRlKCksaD9kPyhqUXVlcnkoIi5tZWFuLW5hdiB1bCB1bCIpLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkodGhpcykuY2hpbGRyZW4oKS5sZW5ndGgmJmpRdWVyeSh0aGlzLCJsaTpmaXJzdCIpLnBhcmVudCgpLmFwcGVuZCgnPGEgY2xhc3M9Im1lYW4tZXhwYW5kIiBocmVmPSIjIiBzdHlsZT0iZm9udC1zaXplOiAnK2krJyI+Jyt5KyI8L2E+Iil9KSxqUXVlcnkoIi5tZWFuLWV4cGFuZCIpLm9uKCJjbGljayIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLGpRdWVyeSh0aGlzKS5oYXNDbGFzcygibWVhbi1jbGlja2VkIik/KGpRdWVyeSh0aGlzKS50ZXh0KHkpLGpRdWVyeSh0aGlzKS5wcmV2KCJ1bCIpLnNsaWRlVXAoMzAwLGZ1bmN0aW9uKCl7fSkpOihqUXVlcnkodGhpcykudGV4dChqKSxqUXVlcnkodGhpcykucHJldigidWwiKS5zbGlkZURvd24oMzAwLGZ1bmN0aW9uKCl7fSkpLGpRdWVyeSh0aGlzKS50b2dnbGVDbGFzcygibWVhbi1jbGlja2VkIil9KSk6alF1ZXJ5KCIubWVhbi1uYXYgdWwgdWwiKS5zaG93KCk6alF1ZXJ5KCIubWVhbi1uYXYgdWwgdWwiKS5oaWRlKCksalF1ZXJ5KCIubWVhbi1uYXYgdWwgbGkiKS5sYXN0KCkuYWRkQ2xhc3MoIm1lYW4tbGFzdCIpLE0ucmVtb3ZlQ2xhc3MoIm1lYW5jbG9zZSIpLGpRdWVyeShNKS5jbGljayhmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksQT09PSExPyhNLmNzcygidGV4dC1hbGlnbiIsImNlbnRlciIpLE0uY3NzKCJ0ZXh0LWluZGVudCIsIjAiKSxNLmNzcygiZm9udC1zaXplIixpKSxqUXVlcnkoIi5tZWFuLW5hdiB1bDpmaXJzdCIpLnNsaWRlRG93bigpLEE9ITApOihqUXVlcnkoIi5tZWFuLW5hdiB1bDpmaXJzdCIpLnNsaWRlVXAoKSxBPSExKSxNLnRvZ2dsZUNsYXNzKCJtZWFuY2xvc2UiKSxQKCksalF1ZXJ5KHApLmFkZENsYXNzKCJtZWFuLXJlbW92ZSIpfSksZiYmalF1ZXJ5KCIubWVhbi1uYXYgdWwgPiBsaSA+IGE6Zmlyc3QtY2hpbGQiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7alF1ZXJ5KCIubWVhbi1uYXYgdWw6Zmlyc3QiKS5zbGlkZVVwKCksQT0hMSxqUXVlcnkoTSkudG9nZ2xlQ2xhc3MoIm1lYW5jbG9zZSIpLmh0bWwocyl9KX1lbHNlIFcoKX07Q3x8alF1ZXJ5KHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7YT13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGE+byxXKCksbz49YT8oYigpLHgoKSk6VygpfSksalF1ZXJ5KHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7YT13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLEM/KHgoKSxvPj1hP0U9PT0hMSYmYigpOlcoKSk6KFcoKSxvPj1hJiYoYigpLHgoKSkpfSksYigpfSl9fShqUXVlcnkpOw=="}},"time_used":423,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":423,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/3.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.522Z","timestamp":1785147795522,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/3.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1862\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1862,"size_decoded":2336,"mime_type":"image/png","magic":"PNG image data, 50 x 50, 8-bit colormap, non-interlaced","md5":"cf41ab6cc5c86f526e721c1164ceea3b","sha1":"3763eac8f9e35fbc24e591a9f062ff8172878cda","sha256":"dcdbcec030cec4ab3d99ed4a1abee1d93251b81eda6ed7f0bdd4af829f38e6b5","sha512":"541edd97a8b0ddd0cc0ea1ff4de059ce5a753af5e6804d987ab1dcaca832b9868d0b33fa2fee86fa171b22e465b74dc3b126d1324f9c1f7727742bc327962bea","ssdeep":"","tlshash":"9831c5df121504f77d8305be6daa2c3edbd96da8848c236e618ccba80fd9bc6206100c","first_seen":"2025-05-31T01:51:37.470925Z","last_seen":"2026-08-11T00:25:55.185126Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":516,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":513,"receive":3,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/features/1.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.526Z","timestamp":1785147795526,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/features/1.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 19961\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":19961,"size_decoded":20436,"mime_type":"image/png","magic":"PNG image data, 435 x 375, 8-bit/color RGBA, non-interlaced","md5":"0c7cfd293aa278bd6c6538ce6d9861bd","sha1":"e7210918297111b437fcd319d077e754edc21cdc","sha256":"efab6997d2c7274fbddc2b39820cb23d2633009951998d683915b07a0a7f7eab","sha512":"a81588f31dd63a3f0d47581fef8a8d2a94d7f5bd193797bf4d9eafee01257678b5857a1e5dc59047701ff3dcd80b4b8d8dd87287a1dff2e1e9f4af6ea2d0ab45","ssdeep":"384:8uEbhXRo5QSEnKaA3sRkIN4/bXD8M7ASWGdUJsy7qpppb5IJR181XCop9uuIGV2q:83w5LcRkINmfc+6P7p8ZCo/uQ2q","tlshash":"da92c0dc07fdb02e5ddc7a614ce6e821ee821d2a051224dd2838a2d7391d691f26e662","first_seen":"2025-05-31T01:51:37.374696Z","last_seen":"2026-08-11T00:25:55.224286Z","times_seen":22,"resource_available":false,"data":"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"}},"time_used":561,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":311,"receive":250,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/5.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.549Z","timestamp":1785147795549,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/5.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16955\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16955,"size_decoded":17430,"mime_type":"image/png","magic":"PNG image data, 144 x 41, 8-bit/color RGBA, non-interlaced","md5":"5d625587d2f7d8eb732a6d66fb308fd3","sha1":"b274120f7284eb92aaef35721b085e5c6dc6870b","sha256":"f0f4697520495f056fbf4c66041aefa74e4ef5b105b2667c3a3b9c7f4a3a9066","sha512":"a68f1b194c5a6aab61103cbb4ecf090ce6d783c2f0e9592670792b9df2daee4962335d798b578d172737dca7755b0ba48d92f921a6921c66d9cd8d1d9f6e048d","ssdeep":"96:qSdkEWRRxNXcXsc5Bum7/Z97SgRRT80HzcLQt:qSdktDBm7/Z9BT80HzMQ","tlshash":"0672eb68bdf27651c189e1363cd465465c730b83cb416c88b7cc4855bf00fa65d6f696","first_seen":"2025-05-31T01:51:37.451794Z","last_seen":"2026-08-11T00:25:55.170373Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAJAAAAApCAYAAADag6AFAAAACXBIWXMAAAsTAAALEwEAmpwYAAA532lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNjoxNyswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjY6MTcrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6YmY5NWIzZWMtYzE0Mi1mMDRiLWIxNjctNmUxMzc4NDUxMWNhPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmUyZDc1YWFkLWM5ODktNWE0ZS1hNzA3LWMxNzIxZjkxYzY5ZTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmUyZDc1YWFkLWM5ODktNWE0ZS1hNzA3LWMxNzIxZjkxYzY5ZTwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDplMmQ3NWFhZC1jOTg5LTVhNGUtYTcwNy1jMTcyMWY5MWM2OWU8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjBUMTY6MDE6MDUrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6YmY5NWIzZWMtYzE0Mi1mMDRiLWIxNjctNmUxMzc4NDUxMWNhPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE4LTA2LTI2VDIwOjI2OjE3KzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+NjU1MzU8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjE0NDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj40MTwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+uRXeHQAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAH1klEQVR42uycaYwUVRDHfzuz4IEKxgPkUBBvQDSoUVHEKBgVowFRN1HD4YlEEr94a8QQj0Q8ES9QiQqsAQUVjxBFDBoBDxAiKOq6i7CIckQRlWXLD6/aLZ/dc+xMD5ndrqTTPe/163f9+1/1ql5PhYhQZEkBjSTSKqSygLK9gPOA44G+QCegvQLoN+BXYCXwBTAfWATsTIa8ZUlFngzUFRgLDAUOz7OujcDLwCPAj8nQty4AHQjcBlwH7FZgnQ3Ai8AtwC/JFLR8AF0KPAvsXeS6fwVuBF5JpqF8JZUhry3wBDAjBvAA7Kcq7WEgnUxFy2KgtsAbwOAStWMOcLGqt0TKnIHSygyDS9iOC1WVJUzUAgD0qLJBqWU4MDmZkvJWYRcAc3dxm4YCryVTU34AOgBYoUv2QH4CusTchh+BQ8zvjUAfYEMyPeWlwu72wANwJlAXM3gGeWkHAOOTqSkvBuoE/ADsHmJQdwcWAN1iAM9AZbm/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"}},"time_used":715,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":405,"receive":310,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/jquery-ui.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.305Z","timestamp":1785147795305,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/jquery-ui.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 65651\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":253668,"size_decoded":66196,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (33326)","md5":"471a3bfaa847c808869a4d1b5d17da1a","sha1":"95d2695be48b0b2a1864155c165dad4b8d629bc3","sha256":"26e676621b0cb95c7299fac3465ee400c1fb5855fd62d112a19fb2c16b07f2dc","sha512":"15e09720f349a9da035a658f5fcdbfc2384665e027ead5b86e01f16e12c8d12f027659edc1d706e311d9c08f58eea284d78aaad23ecc66101e5c5b4c4de02e01","ssdeep":"3072:7kqBNnLOBjG0qwOO8D5BnAcKcv15i+VXMS68ay91XaSD5sV1jK:ZLOBClgc/KDS68p","tlshash":"a044f84d72003a2296dbe2a5103b2a0fa237515da605805cb53dcedf9e7de4431bbfb9","first_seen":"2023-03-10T03:06:37Z","last_seen":"2026-08-11T07:42:21.621045Z","times_seen":36,"resource_available":true,"data":"LyohIGpRdWVyeSBVSSAtIHYxLjEyLjEgLSAyMDE3LTA4LTIwCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMsIHBvc2l0aW9uLmpzLCBkYXRhLmpzLCBkaXNhYmxlLXNlbGVjdGlvbi5qcywgZm9jdXNhYmxlLmpzLCBmb3JtLXJlc2V0LW1peGluLmpzLCBqcXVlcnktMS03LmpzLCBrZXljb2RlLmpzLCBsYWJlbHMuanMsIHNjcm9sbC1wYXJlbnQuanMsIHRhYmJhYmxlLmpzLCB1bmlxdWUtaWQuanMsIHdpZGdldHMvZHJhZ2dhYmxlLmpzLCB3aWRnZXRzL2Ryb3BwYWJsZS5qcywgd2lkZ2V0cy9yZXNpemFibGUuanMsIHdpZGdldHMvc2VsZWN0YWJsZS5qcywgd2lkZ2V0cy9zb3J0YWJsZS5qcywgd2lkZ2V0cy9hY2NvcmRpb24uanMsIHdpZGdldHMvYXV0b2NvbXBsZXRlLmpzLCB3aWRnZXRzL2J1dHRvbi5qcywgd2lkZ2V0cy9jaGVja2JveHJhZGlvLmpzLCB3aWRnZXRzL2NvbnRyb2xncm91cC5qcywgd2lkZ2V0cy9kYXRlcGlja2VyLmpzLCB3aWRnZXRzL2RpYWxvZy5qcywgd2lkZ2V0cy9tZW51LmpzLCB3aWRnZXRzL21vdXNlLmpzLCB3aWRnZXRzL3Byb2dyZXNzYmFyLmpzLCB3aWRnZXRzL3NlbGVjdG1lbnUuanMsIHdpZGdldHMvc2xpZGVyLmpzLCB3aWRnZXRzL3NwaW5uZXIuanMsIHdpZGdldHMvdGFicy5qcywgd2lkZ2V0cy90b29sdGlwLmpzLCBlZmZlY3QuanMsIGVmZmVjdHMvZWZmZWN0LWJsaW5kLmpzLCBlZmZlY3RzL2VmZmVjdC1ib3VuY2UuanMsIGVmZmVjdHMvZWZmZWN0LWNsaXAuanMsIGVmZmVjdHMvZWZmZWN0LWRyb3AuanMsIGVmZmVjdHMvZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdHMvZWZmZWN0LWZhZGUuanMsIGVmZmVjdHMvZWZmZWN0LWZvbGQuanMsIGVmZmVjdHMvZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0cy9lZmZlY3QtcHVmZi5qcywgZWZmZWN0cy9lZmZlY3QtcHVsc2F0ZS5qcywgZWZmZWN0cy9lZmZlY3Qtc2NhbGUuanMsIGVmZmVjdHMvZWZmZWN0LXNoYWtlLmpzLCBlZmZlY3RzL2VmZmVjdC1zaXplLmpzLCBlZmZlY3RzL2VmZmVjdC1zbGlkZS5qcywgZWZmZWN0cy9lZmZlY3QtdHJhbnNmZXIuanMKKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgooZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSx0KTp0KGpRdWVyeSl9KShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe2Zvcih2YXIgZT10LmNzcygidmlzaWJpbGl0eSIpOyJpbmhlcml0Ij09PWU7KXQ9dC5wYXJlbnQoKSxlPXQuY3NzKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImhpZGRlbiIhPT1lfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlLGk7dC5sZW5ndGgmJnRbMF0hPT1kb2N1bWVudDspe2lmKGU9dC5jc3MoInBvc2l0aW9uIiksKCJhYnNvbHV0ZSI9PT1lfHwicmVsYXRpdmUiPT09ZXx8ImZpeGVkIj09PWUpJiYoaT1wYXJzZUludCh0LmNzcygiekluZGV4IiksMTApLCFpc05hTihpKSYmMCE9PWkpKXJldHVybiBpO3Q9dC5wYXJlbnQoKX1yZXR1cm4gMH1mdW5jdGlvbiBzKCl7dGhpcy5fY3VySW5zdD1udWxsLHRoaXMuX2tleUV2ZW50PSExLHRoaXMuX2Rpc2FibGVkSW5wdXRzPVtdLHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nPSExLHRoaXMuX2luRGlhbG9nPSExLHRoaXMuX21haW5EaXZJZD0idWktZGF0ZXBpY2tlci1kaXYiLHRoaXMuX2lubGluZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWlubGluZSIsdGhpcy5fYXBwZW5kQ2xhc3M9InVpLWRhdGVwaWNrZXItYXBwZW5kIix0aGlzLl90cmlnZ2VyQ2xhc3M9InVpLWRhdGVwaWNrZXItdHJpZ2dlciIsdGhpcy5fZGlhbG9nQ2xhc3M9InVpLWRhdGVwaWNrZXItZGlhbG9nIix0aGlzLl9kaXNhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItZGlzYWJsZWQiLHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLXVuc2VsZWN0YWJsZSIsdGhpcy5fY3VycmVudENsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQtZGF5Iix0aGlzLl9kYXlPdmVyQ2xhc3M9InVpLWRhdGVwaWNrZXItZGF5cy1jZWxsLW92ZXIiLHRoaXMucmVnaW9uYWw9W10sdGhpcy5yZWdpb25hbFsiIl09e2Nsb3NlVGV4dDoiRG9uZSIscHJldlRleHQ6IlByZXYiLG5leHRUZXh0OiJOZXh0IixjdXJyZW50VGV4dDoiVG9kYXkiLG1vbnRoTmFtZXM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLG1vbnRoTmFtZXNTaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLGRheU5hbWVzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkYXlOYW1lc1Nob3J0OlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sZGF5TmFtZXNNaW46WyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdLHdlZWtIZWFkZXI6IldrIixkYXRlRm9ybWF0OiJtbS9kZC95eSIsZmlyc3REYXk6MCxpc1JUTDohMSxzaG93TW9udGhBZnRlclllYXI6ITEseWVhclN1ZmZpeDoiIn0sdGhpcy5fZGVmYXVsdHM9e3Nob3dPbjoiZm9jdXMiLHNob3dBbmltOiJmYWRlSW4iLHNob3dPcHRpb25zOnt9LGRlZmF1bHREYXRlOm51bGwsYXBwZW5kVGV4dDoiIixidXR0b25UZXh0OiIuLi4iLGJ1dHRvbkltYWdlOiIiLGJ1dHRvbkltYWdlT25seTohMSxoaWRlSWZOb1ByZXZOZXh0OiExLG5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ6ITEsZ290b0N1cnJlbnQ6ITEsY2hhbmdlTW9udGg6ITEsY2hhbmdlWWVhcjohMSx5ZWFyUmFuZ2U6ImMtMTA6YysxMCIsc2hvd090aGVyTW9udGhzOiExLHNlbGVjdE90aGVyTW9udGhzOiExLHNob3dXZWVrOiExLGNhbGN1bGF0ZVdlZWs6dGhpcy5pc284NjAxV2VlayxzaG9ydFllYXJDdXRvZmY6IisxMCIsbWluRGF0ZTpudWxsLG1heERhdGU6bnVsbCxkdXJhdGlvbjoiZmFzdCIsYmVmb3JlU2hvd0RheTpudWxsLGJlZm9yZVNob3c6bnVsbCxvblNlbGVjdDpudWxsLG9uQ2hhbmdlTW9udGhZZWFyOm51bGwsb25DbG9zZTpudWxsLG51bWJlck9mTW9udGhzOjEsc2hvd0N1cnJlbnRBdFBvczowLHN0ZXBNb250aHM6MSxzdGVwQmlnTW9udGhzOjEyLGFsdEZpZWxkOiIiLGFsdEZvcm1hdDoiIixjb25zdHJhaW5JbnB1dDohMCxzaG93QnV0dG9uUGFuZWw6ITEsYXV0b1NpemU6ITEsZGlzYWJsZWQ6ITF9LHQuZXh0ZW5kKHRoaXMuX2RlZmF1bHRzLHRoaXMucmVnaW9uYWxbIiJdKSx0aGlzLnJlZ2lvbmFsLmVuPXQuZXh0ZW5kKCEwLHt9LHRoaXMucmVnaW9uYWxbIiJdKSx0aGlzLnJlZ2lvbmFsWyJlbi1VUyJdPXQuZXh0ZW5kKCEwLHt9LHRoaXMucmVnaW9uYWwuZW4pLHRoaXMuZHBEaXY9bih0KCI8ZGl2IGlkPSciK3RoaXMuX21haW5EaXZJZCsiJyBjbGFzcz0ndWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwnPjwvZGl2PiIpKX1mdW5jdGlvbiBuKGUpe3ZhciBpPSJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiO3JldHVybiBlLm9uKCJtb3VzZW91dCIsaSxmdW5jdGlvbigpe3QodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmdCh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmdCh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KS5vbigibW91c2VvdmVyIixpLG8pfWZ1bmN0aW9uIG8oKXt0LmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKHAuaW5saW5lP3AuZHBEaXYucGFyZW50KClbMF06cC5pbnB1dFswXSl8fCh0KHRoaXMpLnBhcmVudHMoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIikuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHQodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmdCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmdCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIikpfWZ1bmN0aW9uIGEoZSxpKXt0LmV4dGVuZChlLGkpO2Zvcih2YXIgcyBpbiBpKW51bGw9PWlbc10mJihlW3NdPWlbc10pO3JldHVybiBlfWZ1bmN0aW9uIHIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50LnZhbCgpO3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3JlZnJlc2goKSxlIT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKX19dC51aT10LnVpfHx7fSx0LnVpLnZlcnNpb249IjEuMTIuMSI7dmFyIGg9MCxsPUFycmF5LnByb3RvdHlwZS5zbGljZTt0LmNsZWFuRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHMsbixvO2ZvcihvPTA7bnVsbCE9KG49aVtvXSk7bysrKXRyeXtzPXQuX2RhdGEobiwiZXZlbnRzIikscyYmcy5yZW1vdmUmJnQobikudHJpZ2dlckhhbmRsZXIoInJlbW92ZSIpfWNhdGNoKGEpe31lKGkpfX0odC5jbGVhbkRhdGEpLHQud2lkZ2V0PWZ1bmN0aW9uKGUsaSxzKXt2YXIgbixvLGEscj17fSxoPWUuc3BsaXQoIi4iKVswXTtlPWUuc3BsaXQoIi4iKVsxXTt2YXIgbD1oKyItIitlO3JldHVybiBzfHwocz1pLGk9dC5XaWRnZXQpLHQuaXNBcnJheShzKSYmKHM9dC5leHRlbmQuYXBwbHkobnVsbCxbe31dLmNvbmNhdChzKSkpLHQuZXhwclsiOiJdW2wudG9Mb3dlckNhc2UoKV09ZnVuY3Rpb24oZSl7cmV0dXJuISF0LmRhdGEoZSxsKX0sdFtoXT10W2hdfHx7fSxuPXRbaF1bZV0sbz10W2hdW2VdPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NyZWF0ZVdpZGdldD8oYXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KHQsZSksdm9pZCAwKTpuZXcgbyh0LGUpfSx0LmV4dGVuZChvLG4se3ZlcnNpb246cy52ZXJzaW9uLF9wcm90bzp0LmV4dGVuZCh7fSxzKSxfY2hpbGRDb25zdHJ1Y3RvcnM6W119KSxhPW5ldyBpLGEub3B0aW9ucz10LndpZGdldC5leHRlbmQoe30sYS5vcHRpb25zKSx0LmVhY2gocyxmdW5jdGlvbihlLHMpe3JldHVybiB0LmlzRnVuY3Rpb24ocyk/KHJbZV09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIGkucHJvdG90eXBlW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBuKHQpe3JldHVybiBpLnByb3RvdHlwZVtlXS5hcHBseSh0aGlzLHQpfXJldHVybiBmdW5jdGlvbigpe3ZhciBlLGk9dGhpcy5fc3VwZXIsbz10aGlzLl9zdXBlckFwcGx5O3JldHVybiB0aGlzLl9zdXBlcj10LHRoaXMuX3N1cGVyQXBwbHk9bixlPXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N1cGVyPWksdGhpcy5fc3VwZXJBcHBseT1vLGV9fSgpLHZvaWQgMCk6KHJbZV09cyx2b2lkIDApfSksby5wcm90b3R5cGU9dC53aWRnZXQuZXh0ZW5kKGEse3dpZGdldEV2ZW50UHJlZml4Om4/YS53aWRnZXRFdmVudFByZWZpeHx8ZTplfSxyLHtjb25zdHJ1Y3RvcjpvLG5hbWVzcGFjZTpoLHdpZGdldE5hbWU6ZSx3aWRnZXRGdWxsTmFtZTpsfSksbj8odC5lYWNoKG4uX2NoaWxkQ29uc3RydWN0b3JzLGZ1bmN0aW9uKGUsaSl7dmFyIHM9aS5wcm90b3R5cGU7dC53aWRnZXQocy5uYW1lc3BhY2UrIi4iK3Mud2lkZ2V0TmFtZSxvLGkuX3Byb3RvKX0pLGRlbGV0ZSBuLl9jaGlsZENvbnN0cnVjdG9ycyk6aS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaChvKSx0LndpZGdldC5icmlkZ2UoZSxvKSxvfSx0LndpZGdldC5leHRlbmQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciBpLHMsbj1sLmNhbGwoYXJndW1lbnRzLDEpLG89MCxhPW4ubGVuZ3RoO2E+bztvKyspZm9yKGkgaW4gbltvXSlzPW5bb11baV0sbltvXS5oYXNPd25Qcm9wZXJ0eShpKSYmdm9pZCAwIT09cyYmKGVbaV09dC5pc1BsYWluT2JqZWN0KHMpP3QuaXNQbGFpbk9iamVjdChlW2ldKT90LndpZGdldC5leHRlbmQoe30sZVtpXSxzKTp0LndpZGdldC5leHRlbmQoe30scyk6cyk7cmV0dXJuIGV9LHQud2lkZ2V0LmJyaWRnZT1mdW5jdGlvbihlLGkpe3ZhciBzPWkucHJvdG90eXBlLndpZGdldEZ1bGxOYW1lfHxlO3QuZm5bZV09ZnVuY3Rpb24obil7dmFyIG89InN0cmluZyI9PXR5cGVvZiBuLGE9bC5jYWxsKGFyZ3VtZW50cywxKSxyPXRoaXM7cmV0dXJuIG8/dGhpcy5sZW5ndGh8fCJpbnN0YW5jZSIhPT1uP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBpLG89dC5kYXRhKHRoaXMscyk7cmV0dXJuImluc3RhbmNlIj09PW4/KHI9bywhMSk6bz90LmlzRnVuY3Rpb24ob1tuXSkmJiJfIiE9PW4uY2hhckF0KDApPyhpPW9bbl0uYXBwbHkobyxhKSxpIT09byYmdm9pZCAwIT09aT8ocj1pJiZpLmpxdWVyeT9yLnB1c2hTdGFjayhpLmdldCgpKTppLCExKTp2b2lkIDApOnQuZXJyb3IoIm5vIHN1Y2ggbWV0aG9kICciK24rIicgZm9yICIrZSsiIHdpZGdldCBpbnN0YW5jZSIpOnQuZXJyb3IoImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gIitlKyIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247ICIrImF0dGVtcHRlZCB0byBjYWxsIG1ldGhvZCAnIituKyInIil9KTpyPXZvaWQgMDooYS5sZW5ndGgmJihuPXQud2lkZ2V0LmV4dGVuZC5hcHBseShudWxsLFtuXS5jb25jYXQoYSkpKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10LmRhdGEodGhpcyxzKTtlPyhlLm9wdGlvbihufHx7fSksZS5faW5pdCYmZS5faW5pdCgpKTp0LmRhdGEodGhpcyxzLG5ldyBpKG4sdGhpcykpfSkpLHJ9fSx0LldpZGdldD1mdW5jdGlvbigpe30sdC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzPVtdLHQuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0Iix3aWRnZXRFdmVudFByZWZpeDoiIixkZWZhdWx0RWxlbWVudDoiPGRpdj4iLG9wdGlvbnM6e2NsYXNzZXM6e30sZGlzYWJsZWQ6ITEsY3JlYXRlOm51bGx9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24oZSxpKXtpPXQoaXx8dGhpcy5kZWZhdWx0RWxlbWVudHx8dGhpcylbMF0sdGhpcy5lbGVtZW50PXQoaSksdGhpcy51dWlkPWgrKyx0aGlzLmV2ZW50TmFtZXNwYWNlPSIuIit0aGlzLndpZGdldE5hbWUrdGhpcy51dWlkLHRoaXMuYmluZGluZ3M9dCgpLHRoaXMuaG92ZXJhYmxlPXQoKSx0aGlzLmZvY3VzYWJsZT10KCksdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cD17fSxpIT09dGhpcyYmKHQuZGF0YShpLHRoaXMud2lkZ2V0RnVsbE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24odCl7dC50YXJnZXQ9PT1pJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PXQoaS5zdHlsZT9pLm93bmVyRG9jdW1lbnQ6aS5kb2N1bWVudHx8aSksdGhpcy53aW5kb3c9dCh0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdykpLHRoaXMub3B0aW9ucz10LndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSxlKSx0aGlzLl9jcmVhdGUoKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuX3NldE9wdGlvbkRpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fdHJpZ2dlcigiY3JlYXRlIixudWxsLHRoaXMuX2dldENyZWF0ZUV2ZW50RGF0YSgpKSx0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7cmV0dXJue319LF9nZXRDcmVhdGVFdmVudERhdGE6dC5ub29wLF9jcmVhdGU6dC5ub29wLF9pbml0OnQubm9vcCxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9kZXN0cm95KCksdC5lYWNoKHRoaXMuY2xhc3Nlc0VsZW1lbnRMb29rdXAsZnVuY3Rpb24odCxpKXtlLl9yZW1vdmVDbGFzcyhpLHQpfSksdGhpcy5lbGVtZW50Lm9mZih0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0RnVsbE5hbWUpLHRoaXMud2lkZ2V0KCkub2ZmKHRoaXMuZXZlbnROYW1lc3BhY2UpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKSx0aGlzLmJpbmRpbmdzLm9mZih0aGlzLmV2ZW50TmFtZXNwYWNlKX0sX2Rlc3Ryb3k6dC5ub29wLHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihlLGkpe3ZhciBzLG4sbyxhPWU7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlpZihhPXt9LHM9ZS5zcGxpdCgiLiIpLGU9cy5zaGlmdCgpLHMubGVuZ3RoKXtmb3Iobj1hW2VdPXQud2lkZ2V0LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnNbZV0pLG89MDtzLmxlbmd0aC0xPm87bysrKW5bc1tvXV09bltzW29dXXx8e30sbj1uW3Nbb11dO2lmKGU9cy5wb3AoKSwxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09bltlXT9udWxsOm5bZV07bltlXT1pfWVsc2V7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXRoaXMub3B0aW9uc1tlXT9udWxsOnRoaXMub3B0aW9uc1tlXTthW2VdPWl9cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoYSksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdCl0aGlzLl9zZXRPcHRpb24oZSx0W2VdKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiJjbGFzc2VzIj09PXQmJnRoaXMuX3NldE9wdGlvbkNsYXNzZXMoZSksdGhpcy5vcHRpb25zW3RdPWUsImRpc2FibGVkIj09PXQmJnRoaXMuX3NldE9wdGlvbkRpc2FibGVkKGUpLHRoaXN9LF9zZXRPcHRpb25DbGFzc2VzOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbjtmb3IoaSBpbiBlKW49dGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFtpXSxlW2ldIT09dGhpcy5vcHRpb25zLmNsYXNzZXNbaV0mJm4mJm4ubGVuZ3RoJiYocz10KG4uZ2V0KCkpLHRoaXMuX3JlbW92ZUNsYXNzKG4saSkscy5hZGRDbGFzcyh0aGlzLl9jbGFzc2VzKHtlbGVtZW50OnMsa2V5czppLGNsYXNzZXM6ZSxhZGQ6ITB9KSkpfSxfc2V0T3B0aW9uRGlzYWJsZWQ6ZnVuY3Rpb24odCl7dGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy53aWRnZXQoKSx0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQiLG51bGwsISF0KSx0JiYodGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5ob3ZlcmFibGUsbnVsbCwidWktc3RhdGUtaG92ZXIiKSx0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmZvY3VzYWJsZSxudWxsLCJ1aS1zdGF0ZS1mb2N1cyIpKX0sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoe2Rpc2FibGVkOiExfSl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITB9KX0sX2NsYXNzZXM6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaShpLG8pe3ZhciBhLHI7Zm9yKHI9MDtpLmxlbmd0aD5yO3IrKylhPW4uY2xhc3Nlc0VsZW1lbnRMb29rdXBbaVtyXV18fHQoKSxhPWUuYWRkP3QodC51bmlxdWUoYS5nZXQoKS5jb25jYXQoZS5lbGVtZW50LmdldCgpKSkpOnQoYS5ub3QoZS5lbGVtZW50KS5nZXQoKSksbi5jbGFzc2VzRWxlbWVudExvb2t1cFtpW3JdXT1hLHMucHVzaChpW3JdKSxvJiZlLmNsYXNzZXNbaVtyXV0mJnMucHVzaChlLmNsYXNzZXNbaVtyXV0pfXZhciBzPVtdLG49dGhpcztyZXR1cm4gZT10LmV4dGVuZCh7ZWxlbWVudDp0aGlzLmVsZW1lbnQsY2xhc3Nlczp0aGlzLm9wdGlvbnMuY2xhc3Nlc3x8e319LGUpLHRoaXMuX29uKGUuZWxlbWVudCx7cmVtb3ZlOiJfdW50cmFja0NsYXNzZXNFbGVtZW50In0pLGUua2V5cyYmaShlLmtleXMubWF0Y2goL1xTKy9nKXx8W10sITApLGUuZXh0cmEmJmkoZS5leHRyYS5tYXRjaCgvXFMrL2cpfHxbXSkscy5qb2luKCIgIil9LF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt0LmVhY2goaS5jbGFzc2VzRWxlbWVudExvb2t1cCxmdW5jdGlvbihzLG4pey0xIT09dC5pbkFycmF5KGUudGFyZ2V0LG4pJiYoaS5jbGFzc2VzRWxlbWVudExvb2t1cFtzXT10KG4ubm90KGUudGFyZ2V0KS5nZXQoKSkpfSl9LF9yZW1vdmVDbGFzczpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKHQsZSxpLCExKX0sX2FkZENsYXNzOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3ModCxlLGksITApfSxfdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlLGkscyl7cz0iYm9vbGVhbiI9PXR5cGVvZiBzP3M6aTt2YXIgbj0ic3RyaW5nIj09dHlwZW9mIHR8fG51bGw9PT10LG89e2V4dHJhOm4/ZTppLGtleXM6bj90OmUsZWxlbWVudDpuP3RoaXMuZWxlbWVudDp0LGFkZDpzfTtyZXR1cm4gby5lbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuX2NsYXNzZXMobykscyksdGhpc30sX29uOmZ1bmN0aW9uKGUsaSxzKXt2YXIgbixvPXRoaXM7ImJvb2xlYW4iIT10eXBlb2YgZSYmKHM9aSxpPWUsZT0hMSkscz8oaT1uPXQoaSksdGhpcy5iaW5kaW5ncz10aGlzLmJpbmRpbmdzLmFkZChpKSk6KHM9aSxpPXRoaXMuZWxlbWVudCxuPXRoaXMud2lkZ2V0KCkpLHQuZWFjaChzLGZ1bmN0aW9uKHMsYSl7ZnVuY3Rpb24gcigpe3JldHVybiBlfHxvLm9wdGlvbnMuZGlzYWJsZWQhPT0hMCYmIXQodGhpcykuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIik/KCJzdHJpbmciPT10eXBlb2YgYT9vW2FdOmEpLmFwcGx5KG8sYXJndW1lbnRzKTp2b2lkIDB9InN0cmluZyIhPXR5cGVvZiBhJiYoci5ndWlkPWEuZ3VpZD1hLmd1aWR8fHIuZ3VpZHx8dC5ndWlkKyspO3ZhciBoPXMubWF0Y2goL14oW1x3Oi1dKilccyooLiopJC8pLGw9aFsxXStvLmV2ZW50TmFtZXNwYWNlLGM9aFsyXTtjP24ub24obCxjLHIpOmkub24obCxyKX0pfSxfb2ZmOmZ1bmN0aW9uKGUsaSl7aT0oaXx8IiIpLnNwbGl0KCIgIikuam9pbih0aGlzLmV2ZW50TmFtZXNwYWNlKyIgIikrdGhpcy5ldmVudE5hbWVzcGFjZSxlLm9mZihpKS5vZmYoaSksdGhpcy5iaW5kaW5ncz10KHRoaXMuYmluZGluZ3Mubm90KGUpLmdldCgpKSx0aGlzLmZvY3VzYWJsZT10KHRoaXMuZm9jdXNhYmxlLm5vdChlKS5nZXQoKSksdGhpcy5ob3ZlcmFibGU9dCh0aGlzLmhvdmVyYWJsZS5ub3QoZSkuZ2V0KCkpfSxfZGVsYXk6ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKCl7cmV0dXJuKCJzdHJpbmciPT10eXBlb2YgdD9zW3RdOnQpLmFwcGx5KHMsYXJndW1lbnRzKX12YXIgcz10aGlzO3JldHVybiBzZXRUaW1lb3V0KGksZXx8MCl9LF9ob3ZlcmFibGU6ZnVuY3Rpb24oZSl7dGhpcy5ob3ZlcmFibGU9dGhpcy5ob3ZlcmFibGUuYWRkKGUpLHRoaXMuX29uKGUse21vdXNlZW50ZXI6ZnVuY3Rpb24oZSl7dGhpcy5fYWRkQ2xhc3ModChlLmN1cnJlbnRUYXJnZXQpLG51bGwsInVpLXN0YXRlLWhvdmVyIil9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oZSl7dGhpcy5fcmVtb3ZlQ2xhc3ModChlLmN1cnJlbnRUYXJnZXQpLG51bGwsInVpLXN0YXRlLWhvdmVyIil9fSl9LF9mb2N1c2FibGU6ZnVuY3Rpb24oZSl7dGhpcy5mb2N1c2FibGU9dGhpcy5mb2N1c2FibGUuYWRkKGUpLHRoaXMuX29uKGUse2ZvY3VzaW46ZnVuY3Rpb24oZSl7dGhpcy5fYWRkQ2xhc3ModChlLmN1cnJlbnRUYXJnZXQpLG51bGwsInVpLXN0YXRlLWZvY3VzIil9LGZvY3Vzb3V0OmZ1bmN0aW9uKGUpe3RoaXMuX3JlbW92ZUNsYXNzKHQoZS5jdXJyZW50VGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1mb2N1cyIpfX0pfSxfdHJpZ2dlcjpmdW5jdGlvbihlLGkscyl7dmFyIG4sbyxhPXRoaXMub3B0aW9uc1tlXTtpZihzPXN8fHt9LGk9dC5FdmVudChpKSxpLnR5cGU9KGU9PT10aGlzLndpZGdldEV2ZW50UHJlZml4P2U6dGhpcy53aWRnZXRFdmVudFByZWZpeCtlKS50b0xvd2VyQ2FzZSgpLGkudGFyZ2V0PXRoaXMuZWxlbWVudFswXSxvPWkub3JpZ2luYWxFdmVudClmb3IobiBpbiBvKW4gaW4gaXx8KGlbbl09b1tuXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGkscyksISh0LmlzRnVuY3Rpb24oYSkmJmEuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtpXS5jb25jYXQocykpPT09ITF8fGkuaXNEZWZhdWx0UHJldmVudGVkKCkpfX0sdC5lYWNoKHtzaG93OiJmYWRlSW4iLGhpZGU6ImZhZGVPdXQifSxmdW5jdGlvbihlLGkpe3QuV2lkZ2V0LnByb3RvdHlwZVsiXyIrZV09ZnVuY3Rpb24ocyxuLG8peyJzdHJpbmciPT10eXBlb2YgbiYmKG49e2VmZmVjdDpufSk7dmFyIGEscj1uP249PT0hMHx8Im51bWJlciI9PXR5cGVvZiBuP2k6bi5lZmZlY3R8fGk6ZTtuPW58fHt9LCJudW1iZXIiPT10eXBlb2YgbiYmKG49e2R1cmF0aW9uOm59KSxhPSF0LmlzRW1wdHlPYmplY3Qobiksbi5jb21wbGV0ZT1vLG4uZGVsYXkmJnMuZGVsYXkobi5kZWxheSksYSYmdC5lZmZlY3RzJiZ0LmVmZmVjdHMuZWZmZWN0W3JdP3NbZV0obik6ciE9PWUmJnNbcl0/c1tyXShuLmR1cmF0aW9uLG4uZWFzaW5nLG8pOnMucXVldWUoZnVuY3Rpb24oaSl7dCh0aGlzKVtlXSgpLG8mJm8uY2FsbChzWzBdKSxpKCl9KX19KSx0LndpZGdldCxmdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxlLGkpe3JldHVybltwYXJzZUZsb2F0KHRbMF0pKih1LnRlc3QodFswXSk/ZS8xMDA6MSkscGFyc2VGbG9hdCh0WzFdKSoodS50ZXN0KHRbMV0pP2kvMTAwOjEpXX1mdW5jdGlvbiBpKGUsaSl7cmV0dXJuIHBhcnNlSW50KHQuY3NzKGUsaSksMTApfHwwfWZ1bmN0aW9uIHMoZSl7dmFyIGk9ZVswXTtyZXR1cm4gOT09PWkubm9kZVR5cGU/e3dpZHRoOmUud2lkdGgoKSxoZWlnaHQ6ZS5oZWlnaHQoKSxvZmZzZXQ6e3RvcDowLGxlZnQ6MH19OnQuaXNXaW5kb3coaSk/e3dpZHRoOmUud2lkdGgoKSxoZWlnaHQ6ZS5oZWlnaHQoKSxvZmZzZXQ6e3RvcDplLnNjcm9sbFRvcCgpLGxlZnQ6ZS5zY3JvbGxMZWZ0KCl9fTppLnByZXZlbnREZWZhdWx0P3t3aWR0aDowLGhlaWdodDowLG9mZnNldDp7dG9wOmkucGFnZVksbGVmdDppLnBhZ2VYfX06e3dpZHRoOmUub3V0ZXJXaWR0aCgpLGhlaWdodDplLm91dGVySGVpZ2h0KCksb2Zmc2V0OmUub2Zmc2V0KCl9fXZhciBuLG89TWF0aC5tYXgsYT1NYXRoLmFicyxyPS9sZWZ0fGNlbnRlcnxyaWdodC8saD0vdG9wfGNlbnRlcnxib3R0b20vLGw9L1tcK1wtXVxkKyhcLltcZF0rKT8lPy8sYz0vXlx3Ky8sdT0vJSQvLGQ9dC5mbi5wb3NpdGlvbjt0LnBvc2l0aW9uPXtzY3JvbGxiYXJXaWR0aDpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47dmFyIGUsaSxzPXQoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Jz48ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwcHg7d2lkdGg6YXV0bzsnPjwvZGl2PjwvZGl2PiIpLG89cy5jaGlsZHJlbigpWzBdO3JldHVybiB0KCJib2R5IikuYXBwZW5kKHMpLGU9by5vZmZzZXRXaWR0aCxzLmNzcygib3ZlcmZsb3ciLCJzY3JvbGwiKSxpPW8ub2Zmc2V0V2lkdGgsZT09PWkmJihpPXNbMF0uY2xpZW50V2lkdGgpLHMucmVtb3ZlKCksbj1lLWl9LGdldFNjcm9sbEluZm86ZnVuY3Rpb24oZSl7dmFyIGk9ZS5pc1dpbmRvd3x8ZS5pc0RvY3VtZW50PyIiOmUuZWxlbWVudC5jc3MoIm92ZXJmbG93LXgiKSxzPWUuaXNXaW5kb3d8fGUuaXNEb2N1bWVudD8iIjplLmVsZW1lbnQuY3NzKCJvdmVyZmxvdy15Iiksbj0ic2Nyb2xsIj09PWl8fCJhdXRvIj09PWkmJmUud2lkdGg8ZS5lbGVtZW50WzBdLnNjcm9sbFdpZHRoLG89InNjcm9sbCI9PT1zfHwiYXV0byI9PT1zJiZlLmhlaWdodDxlLmVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0O3JldHVybnt3aWR0aDpvP3QucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowLGhlaWdodDpuP3QucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowfX0sZ2V0V2l0aGluSW5mbzpmdW5jdGlvbihlKXt2YXIgaT10KGV8fHdpbmRvdykscz10LmlzV2luZG93KGlbMF0pLG49ISFpWzBdJiY5PT09aVswXS5ub2RlVHlwZSxvPSFzJiYhbjtyZXR1cm57ZWxlbWVudDppLGlzV2luZG93OnMsaXNEb2N1bWVudDpuLG9mZnNldDpvP3QoZSkub2Zmc2V0KCk6e2xlZnQ6MCx0b3A6MH0sc2Nyb2xsTGVmdDppLnNjcm9sbExlZnQoKSxzY3JvbGxUb3A6aS5zY3JvbGxUb3AoKSx3aWR0aDppLm91dGVyV2lkdGgoKSxoZWlnaHQ6aS5vdXRlckhlaWdodCgpfX19LHQuZm4ucG9zaXRpb249ZnVuY3Rpb24obil7aWYoIW58fCFuLm9mKXJldHVybiBkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtuPXQuZXh0ZW5kKHt9LG4pO3ZhciB1LHAsZixtLGcsdixfPXQobi5vZiksYj10LnBvc2l0aW9uLmdldFdpdGhpbkluZm8obi53aXRoaW4pLHk9dC5wb3NpdGlvbi5nZXRTY3JvbGxJbmZvKGIpLHc9KG4uY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIikseD17fTtyZXR1cm4gdj1zKF8pLF9bMF0ucHJldmVudERlZmF1bHQmJihuLmF0PSJsZWZ0IHRvcCIpLHA9di53aWR0aCxmPXYuaGVpZ2h0LG09di5vZmZzZXQsZz10LmV4dGVuZCh7fSxtKSx0LmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgdCxlLGk9KG5bdGhpc118fCIiKS5zcGxpdCgiICIpOzE9PT1pLmxlbmd0aCYmKGk9ci50ZXN0KGlbMF0pP2kuY29uY2F0KFsiY2VudGVyIl0pOmgudGVzdChpWzBdKT9bImNlbnRlciJdLmNvbmNhdChpKTpbImNlbnRlciIsImNlbnRlciJdKSxpWzBdPXIudGVzdChpWzBdKT9pWzBdOiJjZW50ZXIiLGlbMV09aC50ZXN0KGlbMV0pP2lbMV06ImNlbnRlciIsdD1sLmV4ZWMoaVswXSksZT1sLmV4ZWMoaVsxXSkseFt0aGlzXT1bdD90WzBdOjAsZT9lWzBdOjBdLG5bdGhpc109W2MuZXhlYyhpWzBdKVswXSxjLmV4ZWMoaVsxXSlbMF1dfSksMT09PXcubGVuZ3RoJiYod1sxXT13WzBdKSwicmlnaHQiPT09bi5hdFswXT9nLmxlZnQrPXA6ImNlbnRlciI9PT1uLmF0WzBdJiYoZy5sZWZ0Kz1wLzIpLCJib3R0b20iPT09bi5hdFsxXT9nLnRvcCs9ZjoiY2VudGVyIj09PW4uYXRbMV0mJihnLnRvcCs9Zi8yKSx1PWUoeC5hdCxwLGYpLGcubGVmdCs9dVswXSxnLnRvcCs9dVsxXSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcyxyLGg9dCh0aGlzKSxsPWgub3V0ZXJXaWR0aCgpLGM9aC5vdXRlckhlaWdodCgpLGQ9aSh0aGlzLCJtYXJnaW5MZWZ0Iiksdj1pKHRoaXMsIm1hcmdpblRvcCIpLGs9bCtkK2kodGhpcywibWFyZ2luUmlnaHQiKSt5LndpZHRoLEM9Yyt2K2kodGhpcywibWFyZ2luQm90dG9tIikreS5oZWlnaHQsRD10LmV4dGVuZCh7fSxnKSxUPWUoeC5teSxoLm91dGVyV2lkdGgoKSxoLm91dGVySGVpZ2h0KCkpOyJyaWdodCI9PT1uLm15WzBdP0QubGVmdC09bDoiY2VudGVyIj09PW4ubXlbMF0mJihELmxlZnQtPWwvMiksImJvdHRvbSI9PT1uLm15WzFdP0QudG9wLT1jOiJjZW50ZXIiPT09bi5teVsxXSYmKEQudG9wLT1jLzIpLEQubGVmdCs9VFswXSxELnRvcCs9VFsxXSxzPXttYXJnaW5MZWZ0OmQsbWFyZ2luVG9wOnZ9LHQuZWFjaChbImxlZnQiLCJ0b3AiXSxmdW5jdGlvbihlLGkpe3QudWkucG9zaXRpb25bd1tlXV0mJnQudWkucG9zaXRpb25bd1tlXV1baV0oRCx7dGFyZ2V0V2lkdGg6cCx0YXJnZXRIZWlnaHQ6ZixlbGVtV2lkdGg6bCxlbGVtSGVpZ2h0OmMsY29sbGlzaW9uUG9zaXRpb246cyxjb2xsaXNpb25XaWR0aDprLGNvbGxpc2lvbkhlaWdodDpDLG9mZnNldDpbdVswXStUWzBdLHVbMV0rVFsxXV0sbXk6bi5teSxhdDpuLmF0LHdpdGhpbjpiLGVsZW06aH0pfSksbi51c2luZyYmKHI9ZnVuY3Rpb24odCl7dmFyIGU9bS5sZWZ0LUQubGVmdCxpPWUrcC1sLHM9bS50b3AtRC50b3Ascj1zK2YtYyx1PXt0YXJnZXQ6e2VsZW1lbnQ6XyxsZWZ0Om0ubGVmdCx0b3A6bS50b3Asd2lkdGg6cCxoZWlnaHQ6Zn0sZWxlbWVudDp7ZWxlbWVudDpoLGxlZnQ6RC5sZWZ0LHRvcDpELnRvcCx3aWR0aDpsLGhlaWdodDpjfSxob3Jpem9udGFsOjA+aT8ibGVmdCI6ZT4wPyJyaWdodCI6ImNlbnRlciIsdmVydGljYWw6MD5yPyJ0b3AiOnM+MD8iYm90dG9tIjoibWlkZGxlIn07bD5wJiZwPmEoZStpKSYmKHUuaG9yaXpvbnRhbD0iY2VudGVyIiksYz5mJiZmPmEocytyKSYmKHUudmVydGljYWw9Im1pZGRsZSIpLHUuaW1wb3J0YW50PW8oYShlKSxhKGkpKT5vKGEocyksYShyKSk/Imhvcml6b250YWwiOiJ2ZXJ0aWNhbCIsbi51c2luZy5jYWxsKHRoaXMsdCx1KX0pLGgub2Zmc2V0KHQuZXh0ZW5kKEQse3VzaW5nOnJ9KSl9KX0sdC51aS5wb3NpdGlvbj17Zml0OntsZWZ0OmZ1bmN0aW9uKHQsZSl7dmFyIGkscz1lLndpdGhpbixuPXMuaXNXaW5kb3c/cy5zY3JvbGxMZWZ0OnMub2Zmc2V0LmxlZnQsYT1zLndpZHRoLHI9dC5sZWZ0LWUuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCxoPW4tcixsPXIrZS5jb2xsaXNpb25XaWR0aC1hLW47ZS5jb2xsaXNpb25XaWR0aD5hP2g+MCYmMD49bD8oaT10LmxlZnQraCtlLmNvbGxpc2lvbldpZHRoLWEtbix0LmxlZnQrPWgtaSk6dC5sZWZ0PWw+MCYmMD49aD9uOmg+bD9uK2EtZS5jb2xsaXNpb25XaWR0aDpuOmg+MD90LmxlZnQrPWg6bD4wP3QubGVmdC09bDp0LmxlZnQ9byh0LmxlZnQtcix0LmxlZnQpfSx0b3A6ZnVuY3Rpb24odCxlKXt2YXIgaSxzPWUud2l0aGluLG49cy5pc1dpbmRvdz9zLnNjcm9sbFRvcDpzLm9mZnNldC50b3AsYT1lLndpdGhpbi5oZWlnaHQscj10LnRvcC1lLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCxoPW4tcixsPXIrZS5jb2xsaXNpb25IZWlnaHQtYS1uO2UuY29sbGlzaW9uSGVpZ2h0PmE/aD4wJiYwPj1sPyhpPXQudG9wK2grZS5jb2xsaXNpb25IZWlnaHQtYS1uLHQudG9wKz1oLWkpOnQudG9wPWw+MCYmMD49aD9uOmg+bD9uK2EtZS5jb2xsaXNpb25IZWlnaHQ6bjpoPjA/dC50b3ArPWg6bD4wP3QudG9wLT1sOnQudG9wPW8odC50b3Atcix0LnRvcCl9fSxmbGlwOntsZWZ0OmZ1bmN0aW9uKHQsZSl7dmFyIGkscyxuPWUud2l0aGluLG89bi5vZmZzZXQubGVmdCtuLnNjcm9sbExlZnQscj1uLndpZHRoLGg9bi5pc1dpbmRvdz9uLnNjcm9sbExlZnQ6bi5vZmZzZXQubGVmdCxsPXQubGVmdC1lLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQsYz1sLWgsdT1sK2UuY29sbGlzaW9uV2lkdGgtci1oLGQ9ImxlZnQiPT09ZS5teVswXT8tZS5lbGVtV2lkdGg6InJpZ2h0Ij09PWUubXlbMF0/ZS5lbGVtV2lkdGg6MCxwPSJsZWZ0Ij09PWUuYXRbMF0/ZS50YXJnZXRXaWR0aDoicmlnaHQiPT09ZS5hdFswXT8tZS50YXJnZXRXaWR0aDowLGY9LTIqZS5vZmZzZXRbMF07MD5jPyhpPXQubGVmdCtkK3ArZitlLmNvbGxpc2lvbldpZHRoLXItbywoMD5pfHxhKGMpPmkpJiYodC5sZWZ0Kz1kK3ArZikpOnU+MCYmKHM9dC5sZWZ0LWUuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCtkK3ArZi1oLChzPjB8fHU+YShzKSkmJih0LmxlZnQrPWQrcCtmKSl9LHRvcDpmdW5jdGlvbih0LGUpe3ZhciBpLHMsbj1lLndpdGhpbixvPW4ub2Zmc2V0LnRvcCtuLnNjcm9sbFRvcCxyPW4uaGVpZ2h0LGg9bi5pc1dpbmRvdz9uLnNjcm9sbFRvcDpuLm9mZnNldC50b3AsbD10LnRvcC1lLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCxjPWwtaCx1PWwrZS5jb2xsaXNpb25IZWlnaHQtci1oLGQ9InRvcCI9PT1lLm15WzFdLHA9ZD8tZS5lbGVtSGVpZ2h0OiJib3R0b20iPT09ZS5teVsxXT9lLmVsZW1IZWlnaHQ6MCxmPSJ0b3AiPT09ZS5hdFsxXT9lLnRhcmdldEhlaWdodDoiYm90dG9tIj09PWUuYXRbMV0/LWUudGFyZ2V0SGVpZ2h0OjAsbT0tMiplLm9mZnNldFsxXTswPmM/KHM9dC50b3ArcCtmK20rZS5jb2xsaXNpb25IZWlnaHQtci1vLCgwPnN8fGEoYyk+cykmJih0LnRvcCs9cCtmK20pKTp1PjAmJihpPXQudG9wLWUuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wK3ArZittLWgsKGk+MHx8dT5hKGkpKSYmKHQudG9wKz1wK2YrbSkpfX0sZmxpcGZpdDp7bGVmdDpmdW5jdGlvbigpe3QudWkucG9zaXRpb24uZmxpcC5sZWZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LnVpLnBvc2l0aW9uLmZpdC5sZWZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdG9wOmZ1bmN0aW9uKCl7dC51aS5wb3NpdGlvbi5mbGlwLnRvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC51aS5wb3NpdGlvbi5maXQudG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fX0oKSx0LnVpLnBvc2l0aW9uLHQuZXh0ZW5kKHQuZXhwclsiOiJdLHtkYXRhOnQuZXhwci5jcmVhdGVQc2V1ZG8/dC5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuISF0LmRhdGEoaSxlKX19KTpmdW5jdGlvbihlLGkscyl7cmV0dXJuISF0LmRhdGEoZSxzWzNdKX19KSx0LmZuLmV4dGVuZCh7ZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3ZhciB0PSJvbnNlbGVjdHN0YXJ0ImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpPyJzZWxlY3RzdGFydCI6Im1vdXNlZG93biI7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24odCsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKX0pfX0oKSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vZmYoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSksdC51aS5mb2N1c2FibGU9ZnVuY3Rpb24oaSxzKXt2YXIgbixvLGEscixoLGw9aS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJhcmVhIj09PWw/KG49aS5wYXJlbnROb2RlLG89bi5uYW1lLGkuaHJlZiYmbyYmIm1hcCI9PT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/KGE9dCgiaW1nW3VzZW1hcD0nIyIrbysiJ10iKSxhLmxlbmd0aD4wJiZhLmlzKCI6dmlzaWJsZSIpKTohMSk6KC9eKGlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvLnRlc3QobCk/KHI9IWkuZGlzYWJsZWQsciYmKGg9dChpKS5jbG9zZXN0KCJmaWVsZHNldCIpWzBdLGgmJihyPSFoLmRpc2FibGVkKSkpOnI9ImEiPT09bD9pLmhyZWZ8fHM6cyxyJiZ0KGkpLmlzKCI6dmlzaWJsZSIpJiZlKHQoaSkpKX0sdC5leHRlbmQodC5leHByWyI6Il0se2ZvY3VzYWJsZTpmdW5jdGlvbihlKXtyZXR1cm4gdC51aS5mb2N1c2FibGUoZSxudWxsIT10LmF0dHIoZSwidGFiaW5kZXgiKSl9fSksdC51aS5mb2N1c2FibGUsdC5mbi5mb3JtPWZ1bmN0aW9uKCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0aGlzWzBdLmZvcm0/dGhpcy5jbG9zZXN0KCJmb3JtIik6dCh0aGlzWzBdLmZvcm0pfSx0LnVpLmZvcm1SZXNldE1peGluPXtfZm9ybVJlc2V0SGFuZGxlcjpmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBpPWUuZGF0YSgidWktZm9ybS1yZXNldC1pbnN0YW5jZXMiKTt0LmVhY2goaSxmdW5jdGlvbigpe3RoaXMucmVmcmVzaCgpfSl9KX0sX2JpbmRGb3JtUmVzZXRIYW5kbGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5mb3JtPXRoaXMuZWxlbWVudC5mb3JtKCksdGhpcy5mb3JtLmxlbmd0aCl7dmFyIHQ9dGhpcy5mb3JtLmRhdGEoInVpLWZvcm0tcmVzZXQtaW5zdGFuY2VzIil8fFtdO3QubGVuZ3RofHx0aGlzLmZvcm0ub24oInJlc2V0LnVpLWZvcm0tcmVzZXQiLHRoaXMuX2Zvcm1SZXNldEhhbmRsZXIpLHQucHVzaCh0aGlzKSx0aGlzLmZvcm0uZGF0YSgidWktZm9ybS1yZXNldC1pbnN0YW5jZXMiLHQpfX0sX3VuYmluZEZvcm1SZXNldEhhbmRsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmZvcm0ubGVuZ3RoKXt2YXIgZT10aGlzLmZvcm0uZGF0YSgidWktZm9ybS1yZXNldC1pbnN0YW5jZXMiKTtlLnNwbGljZSh0LmluQXJyYXkodGhpcyxlKSwxKSxlLmxlbmd0aD90aGlzLmZvcm0uZGF0YSgidWktZm9ybS1yZXNldC1pbnN0YW5jZXMiLGUpOnRoaXMuZm9ybS5yZW1vdmVEYXRhKCJ1aS1mb3JtLXJlc2V0LWluc3RhbmNlcyIpLm9mZigicmVzZXQudWktZm9ybS1yZXNldCIpfX19LCIxLjciPT09dC5mbi5qcXVlcnkuc3Vic3RyaW5nKDAsMykmJih0LmVhY2goWyJXaWR0aCIsIkhlaWdodCJdLGZ1bmN0aW9uKGUsaSl7ZnVuY3Rpb24gcyhlLGkscyxvKXtyZXR1cm4gdC5lYWNoKG4sZnVuY3Rpb24oKXtpLT1wYXJzZUZsb2F0KHQuY3NzKGUsInBhZGRpbmciK3RoaXMpKXx8MCxzJiYoaS09cGFyc2VGbG9hdCh0LmNzcyhlLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxvJiYoaS09cGFyc2VGbG9hdCh0LmNzcyhlLCJtYXJnaW4iK3RoaXMpKXx8MCl9KSxpfXZhciBuPSJXaWR0aCI9PT1pP1siTGVmdCIsIlJpZ2h0Il06WyJUb3AiLCJCb3R0b20iXSxvPWkudG9Mb3dlckNhc2UoKSxhPXtpbm5lcldpZHRoOnQuZm4uaW5uZXJXaWR0aCxpbm5lckhlaWdodDp0LmZuLmlubmVySGVpZ2h0LG91dGVyV2lkdGg6dC5mbi5vdXRlcldpZHRoLG91dGVySGVpZ2h0OnQuZm4ub3V0ZXJIZWlnaHR9O3QuZm5bImlubmVyIitpXT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9hWyJpbm5lciIraV0uY2FsbCh0aGlzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmNzcyhvLHModGhpcyxlKSsicHgiKX0pfSx0LmZuWyJvdXRlciIraV09ZnVuY3Rpb24oZSxuKXtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGU/YVsib3V0ZXIiK2ldLmNhbGwodGhpcyxlKTp0aGlzLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmNzcyhvLHModGhpcyxlLCEwLG4pKyJweCIpfSl9fSksdC5mbi5hZGRCYWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZChudWxsPT10P3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKHQpKX0pLHQudWkua2V5Q29kZT17QkFDS1NQQUNFOjgsQ09NTUE6MTg4LERFTEVURTo0NixET1dOOjQwLEVORDozNSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixMRUZUOjM3LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU1BBQ0U6MzIsVEFCOjksVVA6Mzh9LHQudWkuZXNjYXBlU2VsZWN0b3I9ZnVuY3Rpb24oKXt2YXIgdD0vKFshIiMkJSYnKCkqKywuLzo7PD0+P0BbXF1eYHt8fX5dKS9nO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHQsIlxcJDEiKX19KCksdC5mbi5sYWJlbHM9ZnVuY3Rpb24oKXt2YXIgZSxpLHMsbixvO3JldHVybiB0aGlzWzBdLmxhYmVscyYmdGhpc1swXS5sYWJlbHMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKHRoaXNbMF0ubGFiZWxzKToobj10aGlzLmVxKDApLnBhcmVudHMoImxhYmVsIikscz10aGlzLmF0dHIoImlkIikscyYmKGU9dGhpcy5lcSgwKS5wYXJlbnRzKCkubGFzdCgpLG89ZS5hZGQoZS5sZW5ndGg/ZS5zaWJsaW5ncygpOnRoaXMuc2libGluZ3MoKSksaT0ibGFiZWxbZm9yPSciK3QudWkuZXNjYXBlU2VsZWN0b3IocykrIiddIixuPW4uYWRkKG8uZmluZChpKS5hZGRCYWNrKGkpKSksdGhpcy5wdXNoU3RhY2sobikpfSx0LmZuLnNjcm9sbFBhcmVudD1mdW5jdGlvbihlKXt2YXIgaT10aGlzLmNzcygicG9zaXRpb24iKSxzPSJhYnNvbHV0ZSI9PT1pLG49ZT8vKGF1dG98c2Nyb2xsfGhpZGRlbikvOi8oYXV0b3xzY3JvbGwpLyxvPXRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7cmV0dXJuIHMmJiJzdGF0aWMiPT09ZS5jc3MoInBvc2l0aW9uIik/ITE6bi50ZXN0KGUuY3NzKCJvdmVyZmxvdyIpK2UuY3NzKCJvdmVyZmxvdy15IikrZS5jc3MoIm92ZXJmbG93LXgiKSl9KS5lcSgwKTtyZXR1cm4iZml4ZWQiIT09aSYmby5sZW5ndGg/bzp0KHRoaXNbMF0ub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpfSx0LmV4dGVuZCh0LmV4cHJbIjoiXSx7dGFiYmFibGU6ZnVuY3Rpb24oZSl7dmFyIGk9dC5hdHRyKGUsInRhYmluZGV4Iikscz1udWxsIT1pO3JldHVybighc3x8aT49MCkmJnQudWkuZm9jdXNhYmxlKGUscyl9fSksdC5mbi5leHRlbmQoe3VuaXF1ZUlkOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5pZHx8KHRoaXMuaWQ9InVpLWlkLSIrICsrdCl9KX19KCkscmVtb3ZlVW5pcXVlSWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7L151aS1pZC1cZCskLy50ZXN0KHRoaXMuaWQpJiZ0KHRoaXMpLnJlbW92ZUF0dHIoImlkIil9KX19KSx0LnVpLmllPSEhL21zaWUgW1x3Ll0rLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7dmFyIGM9ITE7dChkb2N1bWVudCkub24oIm1vdXNldXAiLGZ1bmN0aW9uKCl7Yz0hMX0pLHQud2lkZ2V0KCJ1aS5tb3VzZSIse3ZlcnNpb246IjEuMTIuMSIsb3B0aW9uczp7Y2FuY2VsOiJpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbiwgc2VsZWN0LCBvcHRpb24iLGRpc3RhbmNlOjEsZGVsYXk6MH0sX21vdXNlSW5pdDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5lbGVtZW50Lm9uKCJtb3VzZWRvd24uIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24odCl7cmV0dXJuIGUuX21vdXNlRG93bih0KX0pLm9uKCJjbGljay4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihpKXtyZXR1cm4hMD09PXQuZGF0YShpLnRhcmdldCxlLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpPyh0LnJlbW92ZURhdGEoaS50YXJnZXQsZS53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSxpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCExKTp2b2lkIDB9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQub2ZmKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZ0aGlzLmRvY3VtZW50Lm9mZigibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5vZmYoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbihlKXtpZighYyl7dGhpcy5fbW91c2VNb3ZlZD0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAoZSksdGhpcy5fbW91c2VEb3duRXZlbnQ9ZTt2YXIgaT10aGlzLHM9MT09PWUud2hpY2gsbj0ic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWwmJmUudGFyZ2V0Lm5vZGVOYW1lP3QoZS50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO3JldHVybiBzJiYhbiYmdGhpcy5fbW91c2VDYXB0dXJlKGUpPyh0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2kubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSksdGhpcy5fbW91c2VEaXN0YW5jZU1ldChlKSYmdGhpcy5fbW91c2VEZWxheU1ldChlKSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KGUpIT09ITEsIXRoaXMuX21vdXNlU3RhcnRlZCk/KGUucHJldmVudERlZmF1bHQoKSwhMCk6KCEwPT09dC5kYXRhKGUudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikmJnQucmVtb3ZlRGF0YShlLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tb3VzZU1vdmUodCl9LHRoaXMuX21vdXNlVXBEZWxlZ2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbW91c2VVcCh0KX0sdGhpcy5kb2N1bWVudC5vbigibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS5vbigibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLGUucHJldmVudERlZmF1bHQoKSxjPSEwLCEwKSk6ITB9fSxfbW91c2VNb3ZlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX21vdXNlTW92ZWQpe2lmKHQudWkuaWUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PmRvY3VtZW50LmRvY3VtZW50TW9kZSkmJiFlLmJ1dHRvbilyZXR1cm4gdGhpcy5fbW91c2VVcChlKTtpZighZS53aGljaClpZihlLm9yaWdpbmFsRXZlbnQuYWx0S2V5fHxlLm9yaWdpbmFsRXZlbnQuY3RybEtleXx8ZS5vcmlnaW5hbEV2ZW50Lm1ldGFLZXl8fGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSl0aGlzLmlnbm9yZU1pc3NpbmdXaGljaD0hMDtlbHNlIGlmKCF0aGlzLmlnbm9yZU1pc3NpbmdXaGljaClyZXR1cm4gdGhpcy5fbW91c2VVcChlKX1yZXR1cm4oZS53aGljaHx8ZS5idXR0b24pJiYodGhpcy5fbW91c2VNb3ZlZD0hMCksdGhpcy5fbW91c2VTdGFydGVkPyh0aGlzLl9tb3VzZURyYWcoZSksZS5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fbW91c2VEaXN0YW5jZU1ldChlKSYmdGhpcy5fbW91c2VEZWxheU1ldChlKSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHRoaXMuX21vdXNlRG93bkV2ZW50LGUpIT09ITEsdGhpcy5fbW91c2VTdGFydGVkP3RoaXMuX21vdXNlRHJhZyhlKTp0aGlzLl9tb3VzZVVwKGUpKSwhdGhpcy5fbW91c2VTdGFydGVkKX0sX21vdXNlVXA6ZnVuY3Rpb24oZSl7dGhpcy5kb2N1bWVudC5vZmYoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkub2ZmKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLGUudGFyZ2V0PT09dGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0JiZ0LmRhdGEoZS50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiLCEwKSx0aGlzLl9tb3VzZVN0b3AoZSkpLHRoaXMuX21vdXNlRGVsYXlUaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLl9tb3VzZURlbGF5VGltZXIpLGRlbGV0ZSB0aGlzLl9tb3VzZURlbGF5VGltZXIpLHRoaXMuaWdub3JlTWlzc2luZ1doaWNoPSExLGM9ITEsZS5wcmV2ZW50RGVmYXVsdCgpfSxfbW91c2VEaXN0YW5jZU1ldDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVgtdC5wYWdlWCksTWF0aC5hYnModGhpcy5fbW91c2VEb3duRXZlbnQucGFnZVktdC5wYWdlWSkpPj10aGlzLm9wdGlvbnMuZGlzdGFuY2V9LF9tb3VzZURlbGF5TWV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXt9LF9tb3VzZURyYWc6ZnVuY3Rpb24oKXt9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KSx0LnVpLnBsdWdpbj17YWRkOmZ1bmN0aW9uKGUsaSxzKXt2YXIgbixvPXQudWlbZV0ucHJvdG90eXBlO2ZvcihuIGluIHMpby5wbHVnaW5zW25dPW8ucGx1Z2luc1tuXXx8W10sby5wbHVnaW5zW25dLnB1c2goW2ksc1tuXV0pfSxjYWxsOmZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBuLG89dC5wbHVnaW5zW2VdO2lmKG8mJihzfHx0LmVsZW1lbnRbMF0ucGFyZW50Tm9kZSYmMTEhPT10LmVsZW1lbnRbMF0ucGFyZW50Tm9kZS5ub2RlVHlwZSkpZm9yKG49MDtvLmxlbmd0aD5uO24rKyl0Lm9wdGlvbnNbb1tuXVswXV0mJm9bbl1bMV0uYXBwbHkodC5lbGVtZW50LGkpfX0sdC51aS5zYWZlQWN0aXZlRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZTt0cnl7ZT10LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goaSl7ZT10LmJvZHl9cmV0dXJuIGV8fChlPXQuYm9keSksZS5ub2RlTmFtZXx8KGU9dC5ib2R5KSxlfSx0LnVpLnNhZmVCbHVyPWZ1bmN0aW9uKGUpe2UmJiJib2R5IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdChlKS50cmlnZ2VyKCJibHVyIil9LHQud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLHQudWkubW91c2Use3ZlcnNpb246IjEuMTIuMSIsd2lkZ2V0RXZlbnRQcmVmaXg6ImRyYWciLG9wdGlvbnM6e2FkZENsYXNzZXM6ITAsYXBwZW5kVG86InBhcmVudCIsYXhpczohMSxjb25uZWN0VG9Tb3J0YWJsZTohMSxjb250YWlubWVudDohMSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGlmcmFtZUZpeDohMSxvcGFjaXR5OiExLHJlZnJlc2hQb3NpdGlvbnM6ITEscmV2ZXJ0OiExLHJldmVydER1cmF0aW9uOjUwMCxzY29wZToiZGVmYXVsdCIsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNuYXA6ITEsc25hcE1vZGU6ImJvdGgiLHNuYXBUb2xlcmFuY2U6MjAsc3RhY2s6ITEsekluZGV4OiExLGRyYWc6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpeyJvcmlnaW5hbCI9PT10aGlzLm9wdGlvbnMuaGVscGVyJiZ0aGlzLl9zZXRQb3NpdGlvblJlbGF0aXZlKCksdGhpcy5vcHRpb25zLmFkZENsYXNzZXMmJnRoaXMuX2FkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZUluaXQoKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuX3N1cGVyKHQsZSksImhhbmRsZSI9PT10JiYodGhpcy5fcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCkpfSxfZGVzdHJveTpmdW5jdGlvbigpe3JldHVybih0aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50KS5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpPyh0aGlzLmRlc3Ryb3lPbkNsZWFyPSEwLHZvaWQgMCk6KHRoaXMuX3JlbW92ZUhhbmRsZUNsYXNzTmFtZSgpLHRoaXMuX21vdXNlRGVzdHJveSgpLHZvaWQgMCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcnx8aS5kaXNhYmxlZHx8dChlLnRhcmdldCkuY2xvc2VzdCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5sZW5ndGg+MD8hMToodGhpcy5oYW5kbGU9dGhpcy5fZ2V0SGFuZGxlKGUpLHRoaXMuaGFuZGxlPyh0aGlzLl9ibHVyQWN0aXZlRWxlbWVudChlKSx0aGlzLl9ibG9ja0ZyYW1lcyhpLmlmcmFtZUZpeD09PSEwPyJpZnJhbWUiOmkuaWZyYW1lRml4KSwhMCk6ITEpfSxfYmxvY2tGcmFtZXM6ZnVuY3Rpb24oZSl7dGhpcy5pZnJhbWVCbG9ja3M9dGhpcy5kb2N1bWVudC5maW5kKGUpLm1hcChmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7cmV0dXJuIHQoIjxkaXY+IikuY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIikuYXBwZW5kVG8oZS5wYXJlbnQoKSkub3V0ZXJXaWR0aChlLm91dGVyV2lkdGgoKSkub3V0ZXJIZWlnaHQoZS5vdXRlckhlaWdodCgpKS5vZmZzZXQoZS5vZmZzZXQoKSlbMF19KX0sX3VuYmxvY2tGcmFtZXM6ZnVuY3Rpb24oKXt0aGlzLmlmcmFtZUJsb2NrcyYmKHRoaXMuaWZyYW1lQmxvY2tzLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLmlmcmFtZUJsb2Nrcyl9LF9ibHVyQWN0aXZlRWxlbWVudDpmdW5jdGlvbihlKXt2YXIgaT10LnVpLnNhZmVBY3RpdmVFbGVtZW50KHRoaXMuZG9jdW1lbnRbMF0pLHM9dChlLnRhcmdldCk7cy5jbG9zZXN0KGkpLmxlbmd0aHx8dC51aS5zYWZlQmx1cihpKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoZSksdGhpcy5fYWRkQ2xhc3ModGhpcy5oZWxwZXIsInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0LnVpLmRkbWFuYWdlciYmKHQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdGhpcy5fY2FjaGVNYXJnaW5zKCksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCEwKSx0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKSx0aGlzLmhhc0ZpeGVkQW5jZXN0b3I9dGhpcy5oZWxwZXIucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiJmaXhlZCI9PT10KHRoaXMpLmNzcygicG9zaXRpb24iKX0pLmxlbmd0aD4wLHRoaXMucG9zaXRpb25BYnM9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMuX3JlZnJlc2hPZmZzZXRzKGUpLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLnBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oZSwhMSksdGhpcy5vcmlnaW5hbFBhZ2VYPWUucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPWUucGFnZVksaS5jdXJzb3JBdCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihpLmN1cnNvckF0KSx0aGlzLl9zZXRDb250YWlubWVudCgpLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixlKT09PSExPyh0aGlzLl9jbGVhcigpLCExKToodGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLHQudWkuZGRtYW5hZ2VyJiYhaS5kcm9wQmVoYXZpb3VyJiZ0LnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLGUpLHRoaXMuX21vdXNlRHJhZyhlLCEwKSx0LnVpLmRkbWFuYWdlciYmdC51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsZSksITApfSxfcmVmcmVzaE9mZnNldHM6ZnVuY3Rpb24odCl7dGhpcy5vZmZzZXQ9e3RvcDp0aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0LHNjcm9sbDohMSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0sdGhpcy5vZmZzZXQuY2xpY2s9e2xlZnQ6dC5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDp0LnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH19LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSxpKXtpZih0aGlzLmhhc0ZpeGVkQW5jZXN0b3ImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpLHRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihlLCEwKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLCFpKXt2YXIgcz10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKCJkcmFnIixlLHMpPT09ITEpcmV0dXJuIHRoaXMuX21vdXNlVXAobmV3IHQuRXZlbnQoIm1vdXNldXAiLGUpKSwhMTt0aGlzLnBvc2l0aW9uPXMucG9zaXRpb259cmV0dXJuIHRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIsdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIsdC51aS5kZG1hbmFnZXImJnQudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyxlKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihlKXt2YXIgaT10aGlzLHM9ITE7cmV0dXJuIHQudWkuZGRtYW5hZ2VyJiYhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXImJihzPXQudWkuZGRtYW5hZ2VyLmRyb3AodGhpcyxlKSksdGhpcy5kcm9wcGVkJiYocz10aGlzLmRyb3BwZWQsdGhpcy5kcm9wcGVkPSExKSwiaW52YWxpZCI9PT10aGlzLm9wdGlvbnMucmV2ZXJ0JiYhc3x8InZhbGlkIj09PXRoaXMub3B0aW9ucy5yZXZlcnQmJnN8fHRoaXMub3B0aW9ucy5yZXZlcnQ9PT0hMHx8dC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpJiZ0aGlzLm9wdGlvbnMucmV2ZXJ0LmNhbGwodGhpcy5lbGVtZW50LHMpP3QodGhpcy5oZWxwZXIpLmFuaW1hdGUodGhpcy5vcmlnaW5hbFBvc2l0aW9uLHBhcnNlSW50KHRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbiwxMCksZnVuY3Rpb24oKXtpLl90cmlnZ2VyKCJzdG9wIixlKSE9PSExJiZpLl9jbGVhcigpfSk6dGhpcy5fdHJpZ2dlcigic3RvcCIsZSkhPT0hMSYmdGhpcy5fY2xlYXIoKSwhMX0sX21vdXNlVXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3VuYmxvY2tGcmFtZXMoKSx0LnVpLmRkbWFuYWdlciYmdC51aS5kZG1hbmFnZXIuZHJhZ1N0b3AodGhpcyxlKSx0aGlzLmhhbmRsZUVsZW1lbnQuaXMoZS50YXJnZXQpJiZ0aGlzLmVsZW1lbnQudHJpZ2dlcigiZm9jdXMiKSx0LnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsZSl9LGNhbmNlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlbHBlci5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpP3RoaXMuX21vdXNlVXAobmV3IHQuRXZlbnQoIm1vdXNldXAiLHt0YXJnZXQ6dGhpcy5lbGVtZW50WzBdfSkpOnRoaXMuX2NsZWFyKCksdGhpc30sX2dldEhhbmRsZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLmhhbmRsZT8hIXQoZS50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLmhhbmRsZSkpLmxlbmd0aDohMH0sX3NldEhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlRWxlbWVudD10aGlzLm9wdGlvbnMuaGFuZGxlP3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oYW5kbGUpOnRoaXMuZWxlbWVudCx0aGlzLl9hZGRDbGFzcyh0aGlzLmhhbmRsZUVsZW1lbnQsInVpLWRyYWdnYWJsZS1oYW5kbGUiKX0sX3JlbW92ZUhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUNsYXNzKHRoaXMuaGFuZGxlRWxlbWVudCwidWktZHJhZ2dhYmxlLWhhbmRsZSIpfSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMub3B0aW9ucyxzPXQuaXNGdW5jdGlvbihpLmhlbHBlciksbj1zP3QoaS5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtlXSkpOiJjbG9uZSI9PT1pLmhlbHBlcj90aGlzLmVsZW1lbnQuY2xvbmUoKS5yZW1vdmVBdHRyKCJpZCIpOnRoaXMuZWxlbWVudDtyZXR1cm4gbi5wYXJlbnRzKCJib2R5IikubGVuZ3RofHxuLmFwcGVuZFRvKCJwYXJlbnQiPT09aS5hcHBlbmRUbz90aGlzLmVsZW1lbnRbMF0ucGFyZW50Tm9kZTppLmFwcGVuZFRvKSxzJiZuWzBdPT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLl9zZXRQb3NpdGlvblJlbGF0aXZlKCksblswXT09PXRoaXMuZWxlbWVudFswXXx8LyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3Qobi5jc3MoInBvc2l0aW9uIikpfHxuLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLG59LF9zZXRQb3NpdGlvblJlbGF0aXZlOmZ1bmN0aW9uKCl7L14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSl8fCh0aGlzLmVsZW1lbnRbMF0uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIil9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZS5zcGxpdCgiICIpKSx0LmlzQXJyYXkoZSkmJihlPXtsZWZ0OitlWzBdLHRvcDorZVsxXXx8MH0pLCJsZWZ0ImluIGUmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWUubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGUmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtZS5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBlJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWUudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gZSYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1lLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2lzUm9vdE5vZGU6ZnVuY3Rpb24odCl7cmV0dXJuLyhodG1sfGJvZHkpL2kudGVzdCh0LnRhZ05hbWUpfHx0PT09dGhpcy5kb2N1bWVudFswXX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpLGk9dGhpcy5kb2N1bWVudFswXTtyZXR1cm4iYWJzb2x1dGUiPT09dGhpcy5jc3NQb3NpdGlvbiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT1pJiZ0LmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKGUubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLGUudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksdGhpcy5faXNSb290Tm9kZSh0aGlzLm9mZnNldFBhcmVudFswXSkmJihlPXt0b3A6MCxsZWZ0OjB9KSx7dG9wOmUudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmUubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYoInJlbGF0aXZlIiE9PXRoaXMuY3NzUG9zaXRpb24pcmV0dXJue3RvcDowLGxlZnQ6MH07dmFyIHQ9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCksZT10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKTtyZXR1cm57dG9wOnQudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrKGU/MDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksbGVmdDp0LmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrKGU/MDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkpfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDAscmlnaHQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSwxMCl8fDAsYm90dG9tOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIGUsaSxzLG49dGhpcy5vcHRpb25zLG89dGhpcy5kb2N1bWVudFswXTtyZXR1cm4gdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1udWxsLG4uY29udGFpbm1lbnQ/IndpbmRvdyI9PT1uLmNvbnRhaW5tZW50Pyh0aGlzLmNvbnRhaW5tZW50PVt0KHdpbmRvdykuc2Nyb2xsTGVmdCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsdCh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLHQod2luZG93KS5zY3JvbGxMZWZ0KCkrdCh3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCx0KHdpbmRvdykuc2Nyb2xsVG9wKCkrKHQod2luZG93KS5oZWlnaHQoKXx8by5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSx2b2lkIDApOiJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50Pyh0aGlzLmNvbnRhaW5tZW50PVswLDAsdChvKS53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKHQobykuaGVpZ2h0KCl8fG8uYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0sdm9pZCAwKTpuLmNvbnRhaW5tZW50LmNvbnN0cnVjdG9yPT09QXJyYXk/KHRoaXMuY29udGFpbm1lbnQ9bi5jb250YWlubWVudCx2b2lkIDApOigicGFyZW50Ij09PW4uY29udGFpbm1lbnQmJihuLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLGk9dChuLmNvbnRhaW5tZW50KSxzPWlbMF0scyYmKGU9LyhzY3JvbGx8YXV0bykvLnRlc3QoaS5jc3MoIm92ZXJmbG93IikpLHRoaXMuY29udGFpbm1lbnQ9WyhwYXJzZUludChpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSwocGFyc2VJbnQoaS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLChlP01hdGgubWF4KHMuc2Nyb2xsV2lkdGgscy5vZmZzZXRXaWR0aCk6cy5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGkuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKGU/TWF0aC5tYXgocy5zY3JvbGxIZWlnaHQscy5vZmZzZXRIZWlnaHQpOnMub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoaS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoaS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj1pKSx2b2lkIDApOih0aGlzLmNvbnRhaW5tZW50PW51bGwsdm9pZCAwKQp9LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbih0LGUpe2V8fChlPXRoaXMucG9zaXRpb24pO3ZhciBpPSJhYnNvbHV0ZSI9PT10PzE6LTEscz10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKTtyZXR1cm57dG9wOmUudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCppK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqaS0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC50b3A6cz8wOnRoaXMub2Zmc2V0LnNjcm9sbC50b3ApKmksbGVmdDplLmxlZnQrdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCppK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KmktKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLm9mZnNldC5zY3JvbGwubGVmdDpzPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQpKml9fSxfZ2VuZXJhdGVQb3NpdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpLHMsbixvLGE9dGhpcy5vcHRpb25zLHI9dGhpcy5faXNSb290Tm9kZSh0aGlzLnNjcm9sbFBhcmVudFswXSksaD10LnBhZ2VYLGw9dC5wYWdlWTtyZXR1cm4gciYmdGhpcy5vZmZzZXQuc2Nyb2xsfHwodGhpcy5vZmZzZXQuc2Nyb2xsPXt0b3A6dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCl9KSxlJiYodGhpcy5jb250YWlubWVudCYmKHRoaXMucmVsYXRpdmVDb250YWluZXI/KHM9dGhpcy5yZWxhdGl2ZUNvbnRhaW5lci5vZmZzZXQoKSxpPVt0aGlzLmNvbnRhaW5tZW50WzBdK3MubGVmdCx0aGlzLmNvbnRhaW5tZW50WzFdK3MudG9wLHRoaXMuY29udGFpbm1lbnRbMl0rcy5sZWZ0LHRoaXMuY29udGFpbm1lbnRbM10rcy50b3BdKTppPXRoaXMuY29udGFpbm1lbnQsdC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PGlbMF0mJihoPWlbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8aVsxXSYmKGw9aVsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5pWzJdJiYoaD1pWzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPmlbM10mJihsPWlbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSksYS5ncmlkJiYobj1hLmdyaWRbMV0/dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGwtdGhpcy5vcmlnaW5hbFBhZ2VZKS9hLmdyaWRbMV0pKmEuZ3JpZFsxXTp0aGlzLm9yaWdpbmFsUGFnZVksbD1pP24tdGhpcy5vZmZzZXQuY2xpY2sudG9wPj1pWzFdfHxuLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD5pWzNdP246bi10aGlzLm9mZnNldC5jbGljay50b3A+PWlbMV0/bi1hLmdyaWRbMV06bithLmdyaWRbMV06bixvPWEuZ3JpZFswXT90aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoaC10aGlzLm9yaWdpbmFsUGFnZVgpL2EuZ3JpZFswXSkqYS5ncmlkWzBdOnRoaXMub3JpZ2luYWxQYWdlWCxoPWk/by10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj1pWzBdfHxvLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aVsyXT9vOm8tdGhpcy5vZmZzZXQuY2xpY2subGVmdD49aVswXT9vLWEuZ3JpZFswXTpvK2EuZ3JpZFswXTpvKSwieSI9PT1hLmF4aXMmJihoPXRoaXMub3JpZ2luYWxQYWdlWCksIngiPT09YS5heGlzJiYobD10aGlzLm9yaWdpbmFsUGFnZVkpKSx7dG9wOmwtdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcDpyPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCksbGVmdDpoLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0OnI/MDp0aGlzLm9mZnNldC5zY3JvbGwubGVmdCl9fSxfY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmhlbHBlciwidWktZHJhZ2dhYmxlLWRyYWdnaW5nIiksdGhpcy5oZWxwZXJbMF09PT10aGlzLmVsZW1lbnRbMF18fHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbHx8dGhpcy5oZWxwZXIucmVtb3ZlKCksdGhpcy5oZWxwZXI9bnVsbCx0aGlzLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5kZXN0cm95T25DbGVhciYmdGhpcy5kZXN0cm95KCl9LF90cmlnZ2VyOmZ1bmN0aW9uKGUsaSxzKXtyZXR1cm4gcz1zfHx0aGlzLl91aUhhc2goKSx0LnVpLnBsdWdpbi5jYWxsKHRoaXMsZSxbaSxzLHRoaXNdLCEwKSwvXihkcmFnfHN0YXJ0fHN0b3ApLy50ZXN0KGUpJiYodGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSxzLm9mZnNldD10aGlzLnBvc2l0aW9uQWJzKSx0LldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGUsaSxzKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKCl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KSx0LnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24oZSxpLHMpe3ZhciBuPXQuZXh0ZW5kKHt9LGkse2l0ZW06cy5lbGVtZW50fSk7cy5zb3J0YWJsZXM9W10sdChzLm9wdGlvbnMuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLnNvcnRhYmxlKCJpbnN0YW5jZSIpO2kmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJihzLnNvcnRhYmxlcy5wdXNoKGkpLGkucmVmcmVzaFBvc2l0aW9ucygpLGkuX3RyaWdnZXIoImFjdGl2YXRlIixlLG4pKX0pfSxzdG9wOmZ1bmN0aW9uKGUsaSxzKXt2YXIgbj10LmV4dGVuZCh7fSxpLHtpdGVtOnMuZWxlbWVudH0pO3MuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0LmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3QuaXNPdmVyPyh0LmlzT3Zlcj0wLHMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCx0LmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdC5fc3RvcmVkQ1NTPXtwb3NpdGlvbjp0LnBsYWNlaG9sZGVyLmNzcygicG9zaXRpb24iKSx0b3A6dC5wbGFjZWhvbGRlci5jc3MoInRvcCIpLGxlZnQ6dC5wbGFjZWhvbGRlci5jc3MoImxlZnQiKX0sdC5fbW91c2VTdG9wKGUpLHQub3B0aW9ucy5oZWxwZXI9dC5vcHRpb25zLl9oZWxwZXIpOih0LmNhbmNlbEhlbHBlclJlbW92YWw9ITAsdC5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsZSxuKSl9KX0sZHJhZzpmdW5jdGlvbihlLGkscyl7dC5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dmFyIG49ITEsbz10aGlzO28ucG9zaXRpb25BYnM9cy5wb3NpdGlvbkFicyxvLmhlbHBlclByb3BvcnRpb25zPXMuaGVscGVyUHJvcG9ydGlvbnMsby5vZmZzZXQuY2xpY2s9cy5vZmZzZXQuY2xpY2ssby5faW50ZXJzZWN0c1dpdGgoby5jb250YWluZXJDYWNoZSkmJihuPSEwLHQuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uQWJzPXMucG9zaXRpb25BYnMsdGhpcy5oZWxwZXJQcm9wb3J0aW9ucz1zLmhlbHBlclByb3BvcnRpb25zLHRoaXMub2Zmc2V0LmNsaWNrPXMub2Zmc2V0LmNsaWNrLHRoaXMhPT1vJiZ0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lckNhY2hlKSYmdC5jb250YWlucyhvLmVsZW1lbnRbMF0sdGhpcy5lbGVtZW50WzBdKSYmKG49ITEpLG59KSksbj8oby5pc092ZXJ8fChvLmlzT3Zlcj0xLHMuX3BhcmVudD1pLmhlbHBlci5wYXJlbnQoKSxvLmN1cnJlbnRJdGVtPWkuaGVscGVyLmFwcGVuZFRvKG8uZWxlbWVudCkuZGF0YSgidWktc29ydGFibGUtaXRlbSIsITApLG8ub3B0aW9ucy5faGVscGVyPW8ub3B0aW9ucy5oZWxwZXIsby5vcHRpb25zLmhlbHBlcj1mdW5jdGlvbigpe3JldHVybiBpLmhlbHBlclswXX0sZS50YXJnZXQ9by5jdXJyZW50SXRlbVswXSxvLl9tb3VzZUNhcHR1cmUoZSwhMCksby5fbW91c2VTdGFydChlLCEwLCEwKSxvLm9mZnNldC5jbGljay50b3A9cy5vZmZzZXQuY2xpY2sudG9wLG8ub2Zmc2V0LmNsaWNrLmxlZnQ9cy5vZmZzZXQuY2xpY2subGVmdCxvLm9mZnNldC5wYXJlbnQubGVmdC09cy5vZmZzZXQucGFyZW50LmxlZnQtby5vZmZzZXQucGFyZW50LmxlZnQsby5vZmZzZXQucGFyZW50LnRvcC09cy5vZmZzZXQucGFyZW50LnRvcC1vLm9mZnNldC5wYXJlbnQudG9wLHMuX3RyaWdnZXIoInRvU29ydGFibGUiLGUpLHMuZHJvcHBlZD1vLmVsZW1lbnQsdC5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoUG9zaXRpb25zKCl9KSxzLmN1cnJlbnRJdGVtPXMuZWxlbWVudCxvLmZyb21PdXRzaWRlPXMpLG8uY3VycmVudEl0ZW0mJihvLl9tb3VzZURyYWcoZSksaS5wb3NpdGlvbj1vLnBvc2l0aW9uKSk6by5pc092ZXImJihvLmlzT3Zlcj0wLG8uY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxvLm9wdGlvbnMuX3JldmVydD1vLm9wdGlvbnMucmV2ZXJ0LG8ub3B0aW9ucy5yZXZlcnQ9ITEsby5fdHJpZ2dlcigib3V0IixlLG8uX3VpSGFzaChvKSksby5fbW91c2VTdG9wKGUsITApLG8ub3B0aW9ucy5yZXZlcnQ9by5vcHRpb25zLl9yZXZlcnQsby5vcHRpb25zLmhlbHBlcj1vLm9wdGlvbnMuX2hlbHBlcixvLnBsYWNlaG9sZGVyJiZvLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGkuaGVscGVyLmFwcGVuZFRvKHMuX3BhcmVudCkscy5fcmVmcmVzaE9mZnNldHMoZSksaS5wb3NpdGlvbj1zLl9nZW5lcmF0ZVBvc2l0aW9uKGUsITApLHMuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsZSkscy5kcm9wcGVkPSExLHQuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMucmVmcmVzaFBvc2l0aW9ucygpfSkpfSl9fSksdC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjdXJzb3IiLHtzdGFydDpmdW5jdGlvbihlLGkscyl7dmFyIG49dCgiYm9keSIpLG89cy5vcHRpb25zO24uY3NzKCJjdXJzb3IiKSYmKG8uX2N1cnNvcj1uLmNzcygiY3Vyc29yIikpLG4uY3NzKCJjdXJzb3IiLG8uY3Vyc29yKX0sc3RvcDpmdW5jdGlvbihlLGkscyl7dmFyIG49cy5vcHRpb25zO24uX2N1cnNvciYmdCgiYm9keSIpLmNzcygiY3Vyc29yIixuLl9jdXJzb3IpfX0pLHQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGUsaSxzKXt2YXIgbj10KGkuaGVscGVyKSxvPXMub3B0aW9ucztuLmNzcygib3BhY2l0eSIpJiYoby5fb3BhY2l0eT1uLmNzcygib3BhY2l0eSIpKSxuLmNzcygib3BhY2l0eSIsby5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbihlLGkscyl7dmFyIG49cy5vcHRpb25zO24uX29wYWNpdHkmJnQoaS5oZWxwZXIpLmNzcygib3BhY2l0eSIsbi5fb3BhY2l0eSl9fSksdC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzY3JvbGwiLHtzdGFydDpmdW5jdGlvbih0LGUsaSl7aS5zY3JvbGxQYXJlbnROb3RIaWRkZW58fChpLnNjcm9sbFBhcmVudE5vdEhpZGRlbj1pLmhlbHBlci5zY3JvbGxQYXJlbnQoITEpKSxpLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSE9PWkuZG9jdW1lbnRbMF0mJiJIVE1MIiE9PWkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuWzBdLnRhZ05hbWUmJihpLm92ZXJmbG93T2Zmc2V0PWkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuLm9mZnNldCgpKX0sZHJhZzpmdW5jdGlvbihlLGkscyl7dmFyIG49cy5vcHRpb25zLG89ITEsYT1zLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSxyPXMuZG9jdW1lbnRbMF07YSE9PXImJiJIVE1MIiE9PWEudGFnTmFtZT8obi5heGlzJiYieCI9PT1uLmF4aXN8fChzLm92ZXJmbG93T2Zmc2V0LnRvcCthLm9mZnNldEhlaWdodC1lLnBhZ2VZPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/YS5zY3JvbGxUb3A9bz1hLnNjcm9sbFRvcCtuLnNjcm9sbFNwZWVkOmUucGFnZVktcy5vdmVyZmxvd09mZnNldC50b3A8bi5zY3JvbGxTZW5zaXRpdml0eSYmKGEuc2Nyb2xsVG9wPW89YS5zY3JvbGxUb3Atbi5zY3JvbGxTcGVlZCkpLG4uYXhpcyYmInkiPT09bi5heGlzfHwocy5vdmVyZmxvd09mZnNldC5sZWZ0K2Eub2Zmc2V0V2lkdGgtZS5wYWdlWDxuLnNjcm9sbFNlbnNpdGl2aXR5P2Euc2Nyb2xsTGVmdD1vPWEuc2Nyb2xsTGVmdCtuLnNjcm9sbFNwZWVkOmUucGFnZVgtcy5vdmVyZmxvd09mZnNldC5sZWZ0PG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihhLnNjcm9sbExlZnQ9bz1hLnNjcm9sbExlZnQtbi5zY3JvbGxTcGVlZCkpKToobi5heGlzJiYieCI9PT1uLmF4aXN8fChlLnBhZ2VZLXQocikuc2Nyb2xsVG9wKCk8bi5zY3JvbGxTZW5zaXRpdml0eT9vPXQocikuc2Nyb2xsVG9wKHQocikuc2Nyb2xsVG9wKCktbi5zY3JvbGxTcGVlZCk6dCh3aW5kb3cpLmhlaWdodCgpLShlLnBhZ2VZLXQocikuc2Nyb2xsVG9wKCkpPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihvPXQocikuc2Nyb2xsVG9wKHQocikuc2Nyb2xsVG9wKCkrbi5zY3JvbGxTcGVlZCkpKSxuLmF4aXMmJiJ5Ij09PW4uYXhpc3x8KGUucGFnZVgtdChyKS5zY3JvbGxMZWZ0KCk8bi5zY3JvbGxTZW5zaXRpdml0eT9vPXQocikuc2Nyb2xsTGVmdCh0KHIpLnNjcm9sbExlZnQoKS1uLnNjcm9sbFNwZWVkKTp0KHdpbmRvdykud2lkdGgoKS0oZS5wYWdlWC10KHIpLnNjcm9sbExlZnQoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKG89dChyKS5zY3JvbGxMZWZ0KHQocikuc2Nyb2xsTGVmdCgpK24uc2Nyb2xsU3BlZWQpKSkpLG8hPT0hMSYmdC51aS5kZG1hbmFnZXImJiFuLmRyb3BCZWhhdmlvdXImJnQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHMsZSl9fSksdC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzbmFwIix7c3RhcnQ6ZnVuY3Rpb24oZSxpLHMpe3ZhciBuPXMub3B0aW9ucztzLnNuYXBFbGVtZW50cz1bXSx0KG4uc25hcC5jb25zdHJ1Y3RvciE9PVN0cmluZz9uLnNuYXAuaXRlbXN8fCI6ZGF0YSh1aS1kcmFnZ2FibGUpIjpuLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLGk9ZS5vZmZzZXQoKTt0aGlzIT09cy5lbGVtZW50WzBdJiZzLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsd2lkdGg6ZS5vdXRlcldpZHRoKCksaGVpZ2h0OmUub3V0ZXJIZWlnaHQoKSx0b3A6aS50b3AsbGVmdDppLmxlZnR9KX0pfSxkcmFnOmZ1bmN0aW9uKGUsaSxzKXt2YXIgbixvLGEscixoLGwsYyx1LGQscCxmPXMub3B0aW9ucyxtPWYuc25hcFRvbGVyYW5jZSxnPWkub2Zmc2V0LmxlZnQsdj1nK3MuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsXz1pLm9mZnNldC50b3AsYj1fK3MuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O2ZvcihkPXMuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2Q+PTA7ZC0tKWg9cy5zbmFwRWxlbWVudHNbZF0ubGVmdC1zLm1hcmdpbnMubGVmdCxsPWgrcy5zbmFwRWxlbWVudHNbZF0ud2lkdGgsYz1zLnNuYXBFbGVtZW50c1tkXS50b3Atcy5tYXJnaW5zLnRvcCx1PWMrcy5zbmFwRWxlbWVudHNbZF0uaGVpZ2h0LGgtbT52fHxnPmwrbXx8Yy1tPmJ8fF8+dSttfHwhdC5jb250YWlucyhzLnNuYXBFbGVtZW50c1tkXS5pdGVtLm93bmVyRG9jdW1lbnQscy5zbmFwRWxlbWVudHNbZF0uaXRlbSk/KHMuc25hcEVsZW1lbnRzW2RdLnNuYXBwaW5nJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlLmNhbGwocy5lbGVtZW50LGUsdC5leHRlbmQocy5fdWlIYXNoKCkse3NuYXBJdGVtOnMuc25hcEVsZW1lbnRzW2RdLml0ZW19KSkscy5zbmFwRWxlbWVudHNbZF0uc25hcHBpbmc9ITEpOigiaW5uZXIiIT09Zi5zbmFwTW9kZSYmKG49bT49TWF0aC5hYnMoYy1iKSxvPW0+PU1hdGguYWJzKHUtXyksYT1tPj1NYXRoLmFicyhoLXYpLHI9bT49TWF0aC5hYnMobC1nKSxuJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmMtcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wKSxvJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOnUsbGVmdDowfSkudG9wKSxhJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aC1zLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0KSkscD1ufHxvfHxhfHxyLCJvdXRlciIhPT1mLnNuYXBNb2RlJiYobj1tPj1NYXRoLmFicyhjLV8pLG89bT49TWF0aC5hYnModS1iKSxhPW0+PU1hdGguYWJzKGgtZykscj1tPj1NYXRoLmFicyhsLXYpLG4mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6YyxsZWZ0OjB9KS50b3ApLG8mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6dS1zLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3ApLGEmJihpLnBvc2l0aW9uLmxlZnQ9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omwtcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQpKSwhcy5zbmFwRWxlbWVudHNbZF0uc25hcHBpbmcmJihufHxvfHxhfHxyfHxwKSYmcy5vcHRpb25zLnNuYXAuc25hcCYmcy5vcHRpb25zLnNuYXAuc25hcC5jYWxsKHMuZWxlbWVudCxlLHQuZXh0ZW5kKHMuX3VpSGFzaCgpLHtzbmFwSXRlbTpzLnNuYXBFbGVtZW50c1tkXS5pdGVtfSkpLHMuc25hcEVsZW1lbnRzW2RdLnNuYXBwaW5nPW58fG98fGF8fHJ8fHApfX0pLHQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbihlLGkscyl7dmFyIG4sbz1zLm9wdGlvbnMsYT10Lm1ha2VBcnJheSh0KG8uc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGUsaSl7cmV0dXJuKHBhcnNlSW50KHQoZSkuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludCh0KGkpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2EubGVuZ3RoJiYobj1wYXJzZUludCh0KGFbMF0pLmNzcygiekluZGV4IiksMTApfHwwLHQoYSkuZWFjaChmdW5jdGlvbihlKXt0KHRoaXMpLmNzcygiekluZGV4IixuK2UpfSksdGhpcy5jc3MoInpJbmRleCIsbithLmxlbmd0aCkpfX0pLHQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oZSxpLHMpe3ZhciBuPXQoaS5oZWxwZXIpLG89cy5vcHRpb25zO24uY3NzKCJ6SW5kZXgiKSYmKG8uX3pJbmRleD1uLmNzcygiekluZGV4IikpLG4uY3NzKCJ6SW5kZXgiLG8uekluZGV4KX0sc3RvcDpmdW5jdGlvbihlLGkscyl7dmFyIG49cy5vcHRpb25zO24uX3pJbmRleCYmdChpLmhlbHBlcikuY3NzKCJ6SW5kZXgiLG4uX3pJbmRleCl9fSksdC51aS5kcmFnZ2FibGUsdC53aWRnZXQoInVpLmRyb3BwYWJsZSIse3ZlcnNpb246IjEuMTIuMSIsd2lkZ2V0RXZlbnRQcmVmaXg6ImRyb3AiLG9wdGlvbnM6e2FjY2VwdDoiKiIsYWRkQ2xhc3NlczohMCxncmVlZHk6ITEsc2NvcGU6ImRlZmF1bHQiLHRvbGVyYW5jZToiaW50ZXJzZWN0IixhY3RpdmF0ZTpudWxsLGRlYWN0aXZhdGU6bnVsbCxkcm9wOm51bGwsb3V0Om51bGwsb3ZlcjpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGUsaT10aGlzLm9wdGlvbnMscz1pLmFjY2VwdDt0aGlzLmlzb3Zlcj0hMSx0aGlzLmlzb3V0PSEwLHRoaXMuYWNjZXB0PXQuaXNGdW5jdGlvbihzKT9zOmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzKHMpfSx0aGlzLnByb3BvcnRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzWzBdLHZvaWQgMCk6ZT9lOmU9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH19LHRoaXMuX2FkZFRvTWFuYWdlcihpLnNjb3BlKSxpLmFkZENsYXNzZXMmJnRoaXMuX2FkZENsYXNzKCJ1aS1kcm9wcGFibGUiKX0sX2FkZFRvTWFuYWdlcjpmdW5jdGlvbihlKXt0LnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2VdPXQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZV18fFtdLHQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZV0ucHVzaCh0aGlzKX0sX3NwbGljZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDt0Lmxlbmd0aD5lO2UrKyl0W2VdPT09dGhpcyYmdC5zcGxpY2UoZSwxKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZT10LnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV07dGhpcy5fc3BsaWNlKGUpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsaSl7aWYoImFjY2VwdCI9PT1lKXRoaXMuYWNjZXB0PXQuaXNGdW5jdGlvbihpKT9pOmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzKGkpfTtlbHNlIGlmKCJzY29wZSI9PT1lKXt2YXIgcz10LnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3RoaXMub3B0aW9ucy5zY29wZV07dGhpcy5fc3BsaWNlKHMpLHRoaXMuX2FkZFRvTWFuYWdlcihpKX10aGlzLl9zdXBlcihlLGkpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dmFyIGk9dC51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLl9hZGRBY3RpdmVDbGFzcygpLGkmJnRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixlLHRoaXMudWkoaSkpfSxfZGVhY3RpdmF0ZTpmdW5jdGlvbihlKXt2YXIgaT10LnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMuX3JlbW92ZUFjdGl2ZUNsYXNzKCksaSYmdGhpcy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsZSx0aGlzLnVpKGkpKX0sX292ZXI6ZnVuY3Rpb24oZSl7dmFyIGk9dC51aS5kZG1hbmFnZXIuY3VycmVudDtpJiYoaS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0saS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KSYmKHRoaXMuX2FkZEhvdmVyQ2xhc3MoKSx0aGlzLl90cmlnZ2VyKCJvdmVyIixlLHRoaXMudWkoaSkpKX0sX291dDpmdW5jdGlvbihlKXt2YXIgaT10LnVpLmRkbWFuYWdlci5jdXJyZW50O2kmJihpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpJiYodGhpcy5fcmVtb3ZlSG92ZXJDbGFzcygpLHRoaXMuX3RyaWdnZXIoIm91dCIsZSx0aGlzLnVpKGkpKSl9LF9kcm9wOmZ1bmN0aW9uKGUsaSl7dmFyIHM9aXx8dC51aS5kZG1hbmFnZXIuY3VycmVudCxuPSExO3JldHVybiBzJiYocy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXT8odGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIik7cmV0dXJuIGkub3B0aW9ucy5ncmVlZHkmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJmkub3B0aW9ucy5zY29wZT09PXMub3B0aW9ucy5zY29wZSYmaS5hY2NlcHQuY2FsbChpLmVsZW1lbnRbMF0scy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KSYmdShzLHQuZXh0ZW5kKGkse29mZnNldDppLmVsZW1lbnQub2Zmc2V0KCl9KSxpLm9wdGlvbnMudG9sZXJhbmNlLGUpPyhuPSEwLCExKTp2b2lkIDB9KSxuPyExOnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLHMuY3VycmVudEl0ZW18fHMuZWxlbWVudCk/KHRoaXMuX3JlbW92ZUFjdGl2ZUNsYXNzKCksdGhpcy5fcmVtb3ZlSG92ZXJDbGFzcygpLHRoaXMuX3RyaWdnZXIoImRyb3AiLGUsdGhpcy51aShzKSksdGhpcy5lbGVtZW50KTohMSk6ITF9LHVpOmZ1bmN0aW9uKHQpe3JldHVybntkcmFnZ2FibGU6dC5jdXJyZW50SXRlbXx8dC5lbGVtZW50LGhlbHBlcjp0LmhlbHBlcixwb3NpdGlvbjp0LnBvc2l0aW9uLG9mZnNldDp0LnBvc2l0aW9uQWJzfX0sX2FkZEhvdmVyQ2xhc3M6ZnVuY3Rpb24oKXt0aGlzLl9hZGRDbGFzcygidWktZHJvcHBhYmxlLWhvdmVyIil9LF9yZW1vdmVIb3ZlckNsYXNzOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlQ2xhc3MoInVpLWRyb3BwYWJsZS1ob3ZlciIpfSxfYWRkQWN0aXZlQ2xhc3M6ZnVuY3Rpb24oKXt0aGlzLl9hZGRDbGFzcygidWktZHJvcHBhYmxlLWFjdGl2ZSIpfSxfcmVtb3ZlQWN0aXZlQ2xhc3M6ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVDbGFzcygidWktZHJvcHBhYmxlLWFjdGl2ZSIpfX0pO3ZhciB1PXQudWkuaW50ZXJzZWN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsaSl7cmV0dXJuIHQ+PWUmJmUraT50fXJldHVybiBmdW5jdGlvbihlLGkscyxuKXtpZighaS5vZmZzZXQpcmV0dXJuITE7dmFyIG89KGUucG9zaXRpb25BYnN8fGUucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQrZS5tYXJnaW5zLmxlZnQsYT0oZS5wb3NpdGlvbkFic3x8ZS5wb3NpdGlvbi5hYnNvbHV0ZSkudG9wK2UubWFyZ2lucy50b3Ascj1vK2UuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsaD1hK2UuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGw9aS5vZmZzZXQubGVmdCxjPWkub2Zmc2V0LnRvcCx1PWwraS5wcm9wb3J0aW9ucygpLndpZHRoLGQ9YytpLnByb3BvcnRpb25zKCkuaGVpZ2h0O3N3aXRjaChzKXtjYXNlImZpdCI6cmV0dXJuIG8+PWwmJnU+PXImJmE+PWMmJmQ+PWg7Y2FzZSJpbnRlcnNlY3QiOnJldHVybiBvK2UuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMj5sJiZ1PnItZS5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZhK2UuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI+YyYmZD5oLWUuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI7Y2FzZSJwb2ludGVyIjpyZXR1cm4gdChuLnBhZ2VZLGMsaS5wcm9wb3J0aW9ucygpLmhlaWdodCkmJnQobi5wYWdlWCxsLGkucHJvcG9ydGlvbnMoKS53aWR0aCk7Y2FzZSJ0b3VjaCI6cmV0dXJuKGE+PWMmJmQ+PWF8fGg+PWMmJmQ+PWh8fGM+YSYmaD5kKSYmKG8+PWwmJnU+PW98fHI+PWwmJnU+PXJ8fGw+byYmcj51KTtkZWZhdWx0OnJldHVybiExfX19KCk7dC51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKGUsaSl7dmFyIHMsbixvPXQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZS5vcHRpb25zLnNjb3BlXXx8W10sYT1pP2kudHlwZTpudWxsLHI9KGUuY3VycmVudEl0ZW18fGUuZWxlbWVudCkuZmluZCgiOmRhdGEodWktZHJvcHBhYmxlKSIpLmFkZEJhY2soKTt0OmZvcihzPTA7by5sZW5ndGg+cztzKyspaWYoIShvW3NdLm9wdGlvbnMuZGlzYWJsZWR8fGUmJiFvW3NdLmFjY2VwdC5jYWxsKG9bc10uZWxlbWVudFswXSxlLmN1cnJlbnRJdGVtfHxlLmVsZW1lbnQpKSl7Zm9yKG49MDtyLmxlbmd0aD5uO24rKylpZihyW25dPT09b1tzXS5lbGVtZW50WzBdKXtvW3NdLnByb3BvcnRpb25zKCkuaGVpZ2h0PTA7Y29udGludWUgdH1vW3NdLnZpc2libGU9Im5vbmUiIT09b1tzXS5lbGVtZW50LmNzcygiZGlzcGxheSIpLG9bc10udmlzaWJsZSYmKCJtb3VzZWRvd24iPT09YSYmb1tzXS5fYWN0aXZhdGUuY2FsbChvW3NdLGkpLG9bc10ub2Zmc2V0PW9bc10uZWxlbWVudC5vZmZzZXQoKSxvW3NdLnByb3BvcnRpb25zKHt3aWR0aDpvW3NdLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0Om9bc10uZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9KSl9fSxkcm9wOmZ1bmN0aW9uKGUsaSl7dmFyIHM9ITE7cmV0dXJuIHQuZWFjaCgodC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tlLm9wdGlvbnMuc2NvcGVdfHxbXSkuc2xpY2UoKSxmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmKCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdShlLHRoaXMsdGhpcy5vcHRpb25zLnRvbGVyYW5jZSxpKSYmKHM9dGhpcy5fZHJvcC5jYWxsKHRoaXMsaSl8fHMpLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sZS5jdXJyZW50SXRlbXx8ZS5lbGVtZW50KSYmKHRoaXMuaXNvdXQ9ITAsdGhpcy5pc292ZXI9ITEsdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKHRoaXMsaSkpKX0pLHN9LGRyYWdTdGFydDpmdW5jdGlvbihlLGkpe2UuZWxlbWVudC5wYXJlbnRzVW50aWwoImJvZHkiKS5vbigic2Nyb2xsLmRyb3BwYWJsZSIsZnVuY3Rpb24oKXtlLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8dC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoZSxpKX0pfSxkcmFnOmZ1bmN0aW9uKGUsaSl7ZS5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMmJnQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGUsaSksdC5lYWNoKHQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbZS5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zLmRpc2FibGVkJiYhdGhpcy5ncmVlZHlDaGlsZCYmdGhpcy52aXNpYmxlKXt2YXIgcyxuLG8sYT11KGUsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlLGkpLHI9IWEmJnRoaXMuaXNvdmVyPyJpc291dCI6YSYmIXRoaXMuaXNvdmVyPyJpc292ZXIiOm51bGw7ciYmKHRoaXMub3B0aW9ucy5ncmVlZHkmJihuPXRoaXMub3B0aW9ucy5zY29wZSxvPXRoaXMuZWxlbWVudC5wYXJlbnRzKCI6ZGF0YSh1aS1kcm9wcGFibGUpIikuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcykuZHJvcHBhYmxlKCJpbnN0YW5jZSIpLm9wdGlvbnMuc2NvcGU9PT1ufSksby5sZW5ndGgmJihzPXQob1swXSkuZHJvcHBhYmxlKCJpbnN0YW5jZSIpLHMuZ3JlZWR5Q2hpbGQ9Imlzb3ZlciI9PT1yKSkscyYmImlzb3ZlciI9PT1yJiYocy5pc292ZXI9ITEscy5pc291dD0hMCxzLl9vdXQuY2FsbChzLGkpKSx0aGlzW3JdPSEwLHRoaXNbImlzb3V0Ij09PXI/Imlzb3ZlciI6Imlzb3V0Il09ITEsdGhpc1siaXNvdmVyIj09PXI/Il9vdmVyIjoiX291dCJdLmNhbGwodGhpcyxpKSxzJiYiaXNvdXQiPT09ciYmKHMuaXNvdXQ9ITEscy5pc292ZXI9ITAscy5fb3Zlci5jYWxsKHMsaSkpKX19KX0sZHJhZ1N0b3A6ZnVuY3Rpb24oZSxpKXtlLmVsZW1lbnQucGFyZW50c1VudGlsKCJib2R5Iikub2ZmKCJzY3JvbGwuZHJvcHBhYmxlIiksZS5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fHQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKGUsaSl9fSx0LnVpQmFja0NvbXBhdCE9PSExJiZ0LndpZGdldCgidWkuZHJvcHBhYmxlIix0LnVpLmRyb3BwYWJsZSx7b3B0aW9uczp7aG92ZXJDbGFzczohMSxhY3RpdmVDbGFzczohMX0sX2FkZEFjdGl2ZUNsYXNzOmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpfSxfcmVtb3ZlQWN0aXZlQ2xhc3M6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpLHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyl9LF9hZGRIb3ZlckNsYXNzOmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKX0sX3JlbW92ZUhvdmVyQ2xhc3M6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpLHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpfX0pLHQudWkuZHJvcHBhYmxlLHQud2lkZ2V0KCJ1aS5yZXNpemFibGUiLHQudWkubW91c2Use3ZlcnNpb246IjEuMTIuMSIsd2lkZ2V0RXZlbnRQcmVmaXg6InJlc2l6ZSIsb3B0aW9uczp7YWxzb1Jlc2l6ZTohMSxhbmltYXRlOiExLGFuaW1hdGVEdXJhdGlvbjoic2xvdyIsYW5pbWF0ZUVhc2luZzoic3dpbmciLGFzcGVjdFJhdGlvOiExLGF1dG9IaWRlOiExLGNsYXNzZXM6eyJ1aS1yZXNpemFibGUtc2UiOiJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIn0sY29udGFpbm1lbnQ6ITEsZ2hvc3Q6ITEsZ3JpZDohMSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjohMSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6OTAscmVzaXplOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9udW06ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl8fDB9LF9pc051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh0KSl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oZSxpKXtpZigiaGlkZGVuIj09PXQoZSkuY3NzKCJvdmVyZmxvdyIpKXJldHVybiExO3ZhciBzPWkmJiJsZWZ0Ij09PWk/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiLG49ITE7cmV0dXJuIGVbc10+MD8hMDooZVtzXT0xLG49ZVtzXT4wLGVbc109MCxuKX0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlLGk9dGhpcy5vcHRpb25zLHM9dGhpczt0aGlzLl9hZGRDbGFzcygidWktcmVzaXphYmxlIiksdC5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEhaS5hc3BlY3RSYXRpbyxhc3BlY3RSYXRpbzppLmFzcGVjdFJhdGlvLG9yaWdpbmFsRWxlbWVudDp0aGlzLmVsZW1lbnQsX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6W10sX2hlbHBlcjppLmhlbHBlcnx8aS5naG9zdHx8aS5hbmltYXRlP2kuaGVscGVyfHwidWktcmVzaXphYmxlLWhlbHBlciI6bnVsbH0pLHRoaXMuZWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvXihjYW52YXN8dGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbnxpbWcpJC9pKSYmKHRoaXMuZWxlbWVudC53cmFwKHQoIjxkaXYgY2xhc3M9J3VpLXdyYXBwZXInIHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyc+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjp0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLHRvcDp0aGlzLmVsZW1lbnQuY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuZWxlbWVudC5jc3MoImxlZnQiKX0pKSx0aGlzLmVsZW1lbnQ9dGhpcy5lbGVtZW50LnBhcmVudCgpLmRhdGEoInVpLXJlc2l6YWJsZSIsdGhpcy5lbGVtZW50LnJlc2l6YWJsZSgiaW5zdGFuY2UiKSksdGhpcy5lbGVtZW50SXNXcmFwcGVyPSEwLGU9e21hcmdpblRvcDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLG1hcmdpblJpZ2h0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSxtYXJnaW5Cb3R0b206dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSxtYXJnaW5MZWZ0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luTGVmdCIpfSx0aGlzLmVsZW1lbnQuY3NzKGUpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luIiwwKSx0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGU9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsIm5vbmUiKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjoic3RhdGljIix6b29tOjEsZGlzcGxheToiYmxvY2sifSkpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyhlKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSx0aGlzLl9zZXR1cEhhbmRsZXMoKSxpLmF1dG9IaWRlJiZ0KHRoaXMuZWxlbWVudCkub24oIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7aS5kaXNhYmxlZHx8KHMuX3JlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxzLl9oYW5kbGVzLnNob3coKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtpLmRpc2FibGVkfHxzLnJlc2l6aW5nfHwocy5fYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLHMuX2hhbmRsZXMuaGlkZSgpKX0pLHRoaXMuX21vdXNlSW5pdCgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX21vdXNlRGVzdHJveSgpO3ZhciBlLGk9ZnVuY3Rpb24oZSl7dChlKS5yZW1vdmVEYXRhKCJyZXNpemFibGUiKS5yZW1vdmVEYXRhKCJ1aS1yZXNpemFibGUiKS5vZmYoIi5yZXNpemFibGUiKS5maW5kKCIudWktcmVzaXphYmxlLWhhbmRsZSIpLnJlbW92ZSgpfTtyZXR1cm4gdGhpcy5lbGVtZW50SXNXcmFwcGVyJiYoaSh0aGlzLmVsZW1lbnQpLGU9dGhpcy5lbGVtZW50LHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246ZS5jc3MoInBvc2l0aW9uIiksd2lkdGg6ZS5vdXRlcldpZHRoKCksaGVpZ2h0OmUub3V0ZXJIZWlnaHQoKSx0b3A6ZS5jc3MoInRvcCIpLGxlZnQ6ZS5jc3MoImxlZnQiKX0pLmluc2VydEFmdGVyKGUpLGUucmVtb3ZlKCkpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIix0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGUpLGkodGhpcy5vcmlnaW5hbEVsZW1lbnQpLHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5fc3VwZXIodCxlKSx0KXtjYXNlImhhbmRsZXMiOnRoaXMuX3JlbW92ZUhhbmRsZXMoKSx0aGlzLl9zZXR1cEhhbmRsZXMoKTticmVhaztkZWZhdWx0On19LF9zZXR1cEhhbmRsZXM6ZnVuY3Rpb24oKXt2YXIgZSxpLHMsbixvLGE9dGhpcy5vcHRpb25zLHI9dGhpcztpZih0aGlzLmhhbmRsZXM9YS5oYW5kbGVzfHwodCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkubGVuZ3RoP3tuOiIudWktcmVzaXphYmxlLW4iLGU6Ii51aS1yZXNpemFibGUtZSIsczoiLnVpLXJlc2l6YWJsZS1zIix3OiIudWktcmVzaXphYmxlLXciLHNlOiIudWktcmVzaXphYmxlLXNlIixzdzoiLnVpLXJlc2l6YWJsZS1zdyIsbmU6Ii51aS1yZXNpemFibGUtbmUiLG53OiIudWktcmVzaXphYmxlLW53In06ImUscyxzZSIpLHRoaXMuX2hhbmRsZXM9dCgpLHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3Rvcj09PVN0cmluZylmb3IoImFsbCI9PT10aGlzLmhhbmRsZXMmJih0aGlzLmhhbmRsZXM9Im4sZSxzLHcsc2Usc3csbmUsbnciKSxzPXRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpLHRoaXMuaGFuZGxlcz17fSxpPTA7cy5sZW5ndGg+aTtpKyspZT10LnRyaW0oc1tpXSksbj0idWktcmVzaXphYmxlLSIrZSxvPXQoIjxkaXY+IiksdGhpcy5fYWRkQ2xhc3MobywidWktcmVzaXphYmxlLWhhbmRsZSAiK24pLG8uY3NzKHt6SW5kZXg6YS56SW5kZXh9KSx0aGlzLmhhbmRsZXNbZV09Ii51aS1yZXNpemFibGUtIitlLHRoaXMuZWxlbWVudC5hcHBlbmQobyk7dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbihlKXt2YXIgaSxzLG4sbztlPWV8fHRoaXMuZWxlbWVudDtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpdGhpcy5oYW5kbGVzW2ldLmNvbnN0cnVjdG9yPT09U3RyaW5nP3RoaXMuaGFuZGxlc1tpXT10aGlzLmVsZW1lbnQuY2hpbGRyZW4odGhpcy5oYW5kbGVzW2ldKS5maXJzdCgpLnNob3coKToodGhpcy5oYW5kbGVzW2ldLmpxdWVyeXx8dGhpcy5oYW5kbGVzW2ldLm5vZGVUeXBlKSYmKHRoaXMuaGFuZGxlc1tpXT10KHRoaXMuaGFuZGxlc1tpXSksdGhpcy5fb24odGhpcy5oYW5kbGVzW2ldLHttb3VzZWRvd246ci5fbW91c2VEb3dufSkpLHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL14odGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbikkL2kpJiYocz10KHRoaXMuaGFuZGxlc1tpXSx0aGlzLmVsZW1lbnQpLG89L3N3fG5lfG53fHNlfG58cy8udGVzdChpKT9zLm91dGVySGVpZ2h0KCk6cy5vdXRlcldpZHRoKCksbj1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KGkpPyJUb3AiOi9zZXxzd3xzLy50ZXN0KGkpPyJCb3R0b20iOi9eZSQvLnRlc3QoaSk/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpLGUuY3NzKG4sbyksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmhhbmRsZXNbaV0pfSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKSksdGhpcy5faGFuZGxlcy5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5vbigibW91c2VvdmVyIixmdW5jdGlvbigpe3IucmVzaXppbmd8fCh0aGlzLmNsYXNzTmFtZSYmKG89dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8bnxlfHN8dykvaSkpLHIuYXhpcz1vJiZvWzFdP29bMV06InNlIil9KSxhLmF1dG9IaWRlJiYodGhpcy5faGFuZGxlcy5oaWRlKCksdGhpcy5fYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpKX0sX3JlbW92ZUhhbmRsZXM6ZnVuY3Rpb24oKXt0aGlzLl9oYW5kbGVzLnJlbW92ZSgpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbj0hMTtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpcz10KHRoaXMuaGFuZGxlc1tpXSlbMF0sKHM9PT1lLnRhcmdldHx8dC5jb250YWlucyhzLGUudGFyZ2V0KSkmJihuPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZufSxfbW91c2VTdGFydDpmdW5jdGlvbihlKXt2YXIgaSxzLG4sbz10aGlzLm9wdGlvbnMsYT10aGlzLmVsZW1lbnQ7cmV0dXJuIHRoaXMucmVzaXppbmc9ITAsdGhpcy5fcmVuZGVyUHJveHkoKSxpPXRoaXMuX251bSh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSkscz10aGlzLl9udW0odGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSksby5jb250YWlubWVudCYmKGkrPXQoby5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLHMrPXQoby5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6aSx0b3A6c30sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6dGhpcy5oZWxwZXIud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIuaGVpZ2h0KCl9Ont3aWR0aDphLndpZHRoKCksaGVpZ2h0OmEuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6YS5vdXRlcldpZHRoKCksaGVpZ2h0OmEub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmEud2lkdGgoKSxoZWlnaHQ6YS5oZWlnaHQoKX0sdGhpcy5zaXplRGlmZj17d2lkdGg6YS5vdXRlcldpZHRoKCktYS53aWR0aCgpLGhlaWdodDphLm91dGVySGVpZ2h0KCktYS5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmksdG9wOnN9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OmUucGFnZVgsdG9wOmUucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89Im51bWJlciI9PXR5cGVvZiBvLmFzcGVjdFJhdGlvP28uYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxLG49dCgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKSx0KCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIj09PW4/dGhpcy5heGlzKyItcmVzaXplIjpuKSx0aGlzLl9hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsZSksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oZSl7dmFyIGkscyxuPXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLG89dGhpcy5heGlzLGE9ZS5wYWdlWC1uLmxlZnR8fDAscj1lLnBhZ2VZLW4udG9wfHwwLGg9dGhpcy5fY2hhbmdlW29dO3JldHVybiB0aGlzLl91cGRhdGVQcmV2UHJvcGVydGllcygpLGg/KGk9aC5hcHBseSh0aGlzLFtlLGEscl0pLHRoaXMuX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzKGUuc2hpZnRLZXkpLCh0aGlzLl9hc3BlY3RSYXRpb3x8ZS5zaGlmdEtleSkmJihpPXRoaXMuX3VwZGF0ZVJhdGlvKGksZSkpLGk9dGhpcy5fcmVzcGVjdFNpemUoaSxlKSx0aGlzLl91cGRhdGVDYWNoZShpKSx0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsZSkscz10aGlzLl9hcHBseUNoYW5nZXMoKSwhdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSx0LmlzRW1wdHlPYmplY3Qocyl8fCh0aGlzLl91cGRhdGVQcmV2UHJvcGVydGllcygpLHRoaXMuX3RyaWdnZXIoInJlc2l6ZSIsZSx0aGlzLnVpKCkpLHRoaXMuX2FwcGx5Q2hhbmdlcygpKSwhMSk6ITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZSl7dGhpcy5yZXNpemluZz0hMTt2YXIgaSxzLG4sbyxhLHIsaCxsPXRoaXMub3B0aW9ucyxjPXRoaXM7cmV0dXJuIHRoaXMuX2hlbHBlciYmKGk9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cyxzPWkubGVuZ3RoJiYvdGV4dGFyZWEvaS50ZXN0KGlbMF0ubm9kZU5hbWUpLG49cyYmdGhpcy5faGFzU2Nyb2xsKGlbMF0sImxlZnQiKT8wOmMuc2l6ZURpZmYuaGVpZ2h0LG89cz8wOmMuc2l6ZURpZmYud2lkdGgsYT17d2lkdGg6Yy5oZWxwZXIud2lkdGgoKS1vLGhlaWdodDpjLmhlbHBlci5oZWlnaHQoKS1ufSxyPXBhcnNlRmxvYXQoYy5lbGVtZW50LmNzcygibGVmdCIpKSsoYy5wb3NpdGlvbi5sZWZ0LWMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxoPXBhcnNlRmxvYXQoYy5lbGVtZW50LmNzcygidG9wIikpKyhjLnBvc2l0aW9uLnRvcC1jLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbCxsLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3ModC5leHRlbmQoYSx7dG9wOmgsbGVmdDpyfSkpLGMuaGVscGVyLmhlaWdodChjLnNpemUuaGVpZ2h0KSxjLmhlbHBlci53aWR0aChjLnNpemUud2lkdGgpLHRoaXMuX2hlbHBlciYmIWwuYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdCgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byIpLHRoaXMuX3JlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0b3AiLGUpLHRoaXMuX2hlbHBlciYmdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9LF91cGRhdGVQcmV2UHJvcGVydGllczpmdW5jdGlvbigpe3RoaXMucHJldlBvc2l0aW9uPXt0b3A6dGhpcy5wb3NpdGlvbi50b3AsbGVmdDp0aGlzLnBvc2l0aW9uLmxlZnR9LHRoaXMucHJldlNpemU9e3dpZHRoOnRoaXMuc2l6ZS53aWR0aCxoZWlnaHQ6dGhpcy5zaXplLmhlaWdodH19LF9hcHBseUNoYW5nZXM6ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gdGhpcy5wb3NpdGlvbi50b3AhPT10aGlzLnByZXZQb3NpdGlvbi50b3AmJih0LnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiKSx0aGlzLnBvc2l0aW9uLmxlZnQhPT10aGlzLnByZXZQb3NpdGlvbi5sZWZ0JiYodC5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiKSx0aGlzLnNpemUud2lkdGghPT10aGlzLnByZXZTaXplLndpZHRoJiYodC53aWR0aD10aGlzLnNpemUud2lkdGgrInB4IiksdGhpcy5zaXplLmhlaWdodCE9PXRoaXMucHJldlNpemUuaGVpZ2h0JiYodC5oZWlnaHQ9dGhpcy5zaXplLmhlaWdodCsicHgiKSx0aGlzLmhlbHBlci5jc3ModCksdH0sX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzOmZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuLG8sYT10aGlzLm9wdGlvbnM7bz17bWluV2lkdGg6dGhpcy5faXNOdW1iZXIoYS5taW5XaWR0aCk/YS5taW5XaWR0aDowLG1heFdpZHRoOnRoaXMuX2lzTnVtYmVyKGEubWF4V2lkdGgpP2EubWF4V2lkdGg6MS8wLG1pbkhlaWdodDp0aGlzLl9pc051bWJlcihhLm1pbkhlaWdodCk/YS5taW5IZWlnaHQ6MCxtYXhIZWlnaHQ6dGhpcy5faXNOdW1iZXIoYS5tYXhIZWlnaHQpP2EubWF4SGVpZ2h0OjEvMH0sKHRoaXMuX2FzcGVjdFJhdGlvfHx0KSYmKGU9by5taW5IZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxzPW8ubWluV2lkdGgvdGhpcy5hc3BlY3RSYXRpbyxpPW8ubWF4SGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sbj1vLm1heFdpZHRoL3RoaXMuYXNwZWN0UmF0aW8sZT5vLm1pbldpZHRoJiYoby5taW5XaWR0aD1lKSxzPm8ubWluSGVpZ2h0JiYoby5taW5IZWlnaHQ9cyksby5tYXhXaWR0aD5pJiYoby5tYXhXaWR0aD1pKSxvLm1heEhlaWdodD5uJiYoby5tYXhIZWlnaHQ9bikpLHRoaXMuX3ZCb3VuZGFyaWVzPW99LF91cGRhdGVDYWNoZTpmdW5jdGlvbih0KXt0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLl9pc051bWJlcih0LmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PXQubGVmdCksdGhpcy5faXNOdW1iZXIodC50b3ApJiYodGhpcy5wb3NpdGlvbi50b3A9dC50b3ApLHRoaXMuX2lzTnVtYmVyKHQuaGVpZ2h0KSYmKHRoaXMuc2l6ZS5oZWlnaHQ9dC5oZWlnaHQpLHRoaXMuX2lzTnVtYmVyKHQud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPXQud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wb3NpdGlvbixpPXRoaXMuc2l6ZSxzPXRoaXMuYXhpcztyZXR1cm4gdGhpcy5faXNOdW1iZXIodC5oZWlnaHQpP3Qud2lkdGg9dC5oZWlnaHQqdGhpcy5hc3BlY3RSYXRpbzp0aGlzLl9pc051bWJlcih0LndpZHRoKSYmKHQuaGVpZ2h0PXQud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksInN3Ij09PXMmJih0LmxlZnQ9ZS5sZWZ0KyhpLndpZHRoLXQud2lkdGgpLHQudG9wPW51bGwpLCJudyI9PT1zJiYodC50b3A9ZS50b3ArKGkuaGVpZ2h0LXQuaGVpZ2h0KSx0LmxlZnQ9ZS5sZWZ0KyhpLndpZHRoLXQud2lkdGgpKSx0fSxfcmVzcGVjdFNpemU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdkJvdW5kYXJpZXMsaT10aGlzLmF4aXMscz10aGlzLl9pc051bWJlcih0LndpZHRoKSYmZS5tYXhXaWR0aCYmZS5tYXhXaWR0aDx0LndpZHRoLG49dGhpcy5faXNOdW1iZXIodC5oZWlnaHQpJiZlLm1heEhlaWdodCYmZS5tYXhIZWlnaHQ8dC5oZWlnaHQsbz10aGlzLl9pc051bWJlcih0LndpZHRoKSYmZS5taW5XaWR0aCYmZS5taW5XaWR0aD50LndpZHRoLGE9dGhpcy5faXNOdW1iZXIodC5oZWlnaHQpJiZlLm1pbkhlaWdodCYmZS5taW5IZWlnaHQ+dC5oZWlnaHQscj10aGlzLm9yaWdpbmFsUG9zaXRpb24ubGVmdCt0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aCxoPXRoaXMub3JpZ2luYWxQb3NpdGlvbi50b3ArdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0LGw9L3N3fG53fHcvLnRlc3QoaSksYz0vbnd8bmV8bi8udGVzdChpKTtyZXR1cm4gbyYmKHQud2lkdGg9ZS5taW5XaWR0aCksYSYmKHQuaGVpZ2h0PWUubWluSGVpZ2h0KSxzJiYodC53aWR0aD1lLm1heFdpZHRoKSxuJiYodC5oZWlnaHQ9ZS5tYXhIZWlnaHQpLG8mJmwmJih0LmxlZnQ9ci1lLm1pbldpZHRoKSxzJiZsJiYodC5sZWZ0PXItZS5tYXhXaWR0aCksYSYmYyYmKHQudG9wPWgtZS5taW5IZWlnaHQpLG4mJmMmJih0LnRvcD1oLWUubWF4SGVpZ2h0KSx0LndpZHRofHx0LmhlaWdodHx8dC5sZWZ0fHwhdC50b3A/dC53aWR0aHx8dC5oZWlnaHR8fHQudG9wfHwhdC5sZWZ0fHwodC5sZWZ0PW51bGwpOnQudG9wPW51bGwsdH0sX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9uczpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPVtdLHM9W3QuY3NzKCJib3JkZXJUb3BXaWR0aCIpLHQuY3NzKCJib3JkZXJSaWdodFdpZHRoIiksdC5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksdC5jc3MoImJvcmRlckxlZnRXaWR0aCIpXSxuPVt0LmNzcygicGFkZGluZ1RvcCIpLHQuY3NzKCJwYWRkaW5nUmlnaHQiKSx0LmNzcygicGFkZGluZ0JvdHRvbSIpLHQuY3NzKCJwYWRkaW5nTGVmdCIpXTs0PmU7ZSsrKWlbZV09cGFyc2VGbG9hdChzW2VdKXx8MCxpW2VdKz1wYXJzZUZsb2F0KG5bZV0pfHwwO3JldHVybntoZWlnaHQ6aVswXStpWzJdLHdpZHRoOmlbMV0raVszXX19LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgdCxlPTAsaT10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoPmU7ZSsrKXQ9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1tlXSx0aGlzLm91dGVyRGltZW5zaW9uc3x8KHRoaXMub3V0ZXJEaW1lbnNpb25zPXRoaXMuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyh0KSksdC5jc3Moe2hlaWdodDppLmhlaWdodCgpLXRoaXMub3V0ZXJEaW1lbnNpb25zLmhlaWdodHx8MCx3aWR0aDppLndpZHRoKCktdGhpcy5vdXRlckRpbWVuc2lvbnMud2lkdGh8fDB9KX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50LGk9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD1lLm9mZnNldCgpLHRoaXMuX2hlbHBlcj8odGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fHQoIjxkaXYgc3R5bGU9J292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PiIpLHRoaXMuX2FkZENsYXNzKHRoaXMuaGVscGVyLHRoaXMuX2hlbHBlciksdGhpcy5oZWxwZXIuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSxwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6dGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQrInB4Iix0b3A6dGhpcy5lbGVtZW50T2Zmc2V0LnRvcCsicHgiLHpJbmRleDorK2kuekluZGV4fSksdGhpcy5oZWxwZXIuYXBwZW5kVG8oImJvZHkiKS5kaXNhYmxlU2VsZWN0aW9uKCkpOnRoaXMuaGVscGVyPXRoaXMuZWxlbWVudH0sX2NoYW5nZTp7ZTpmdW5jdGlvbih0LGUpe3JldHVybnt3aWR0aDp0aGlzLm9yaWdpbmFsU2l6ZS53aWR0aCtlfX0sdzpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3JpZ2luYWxTaXplLHM9dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybntsZWZ0OnMubGVmdCtlLHdpZHRoOmkud2lkdGgtZX19LG46ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMub3JpZ2luYWxTaXplLG49dGhpcy5vcmlnaW5hbFBvc2l0aW9uO3JldHVybnt0b3A6bi50b3AraSxoZWlnaHQ6cy5oZWlnaHQtaX19LHM6ZnVuY3Rpb24odCxlLGkpe3JldHVybntoZWlnaHQ6dGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0K2l9fSxzZTpmdW5jdGlvbihlLGkscyl7cmV0dXJuIHQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtlLGksc10pKX0sc3c6ZnVuY3Rpb24oZSxpLHMpe3JldHVybiB0LmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbZSxpLHNdKSl9LG5lOmZ1bmN0aW9uKGUsaSxzKXtyZXR1cm4gdC5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsW2UsaSxzXSkpfSxudzpmdW5jdGlvbihlLGkscyl7cmV0dXJuIHQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2Uudy5hcHBseSh0aGlzLFtlLGksc10pKX19LF9wcm9wYWdhdGU6ZnVuY3Rpb24oZSxpKXt0LnVpLnBsdWdpbi5jYWxsKHRoaXMsZSxbaSx0aGlzLnVpKCldKSwicmVzaXplIiE9PWUmJnRoaXMuX3RyaWdnZXIoZSxpLHRoaXMudWkoKSl9LHBsdWdpbnM6e30sdWk6ZnVuY3Rpb24oKXtyZXR1cm57b3JpZ2luYWxFbGVtZW50OnRoaXMub3JpZ2luYWxFbGVtZW50LGVsZW1lbnQ6dGhpcy5lbGVtZW50LGhlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLHNpemU6dGhpcy5zaXplLG9yaWdpbmFsU2l6ZTp0aGlzLm9yaWdpbmFsU2l6ZSxvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbn19fSksdC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJhbmltYXRlIix7c3RvcDpmdW5jdGlvbihlKXt2YXIgaT10KHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxzPWkub3B0aW9ucyxuPWkuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsbz1uLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChuWzBdLm5vZGVOYW1lKSxhPW8mJmkuX2hhc1Njcm9sbChuWzBdLCJsZWZ0Iik/MDppLnNpemVEaWZmLmhlaWdodCxyPW8/MDppLnNpemVEaWZmLndpZHRoLGg9e3dpZHRoOmkuc2l6ZS53aWR0aC1yLGhlaWdodDppLnNpemUuaGVpZ2h0LWF9LGw9cGFyc2VGbG9hdChpLmVsZW1lbnQuY3NzKCJsZWZ0IikpKyhpLnBvc2l0aW9uLmxlZnQtaS5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGM9cGFyc2VGbG9hdChpLmVsZW1lbnQuY3NzKCJ0b3AiKSkrKGkucG9zaXRpb24udG9wLWkub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2kuZWxlbWVudC5hbmltYXRlKHQuZXh0ZW5kKGgsYyYmbD97dG9wOmMsbGVmdDpsfTp7fSkse2R1cmF0aW9uOnMuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzpzLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBzPXt3aWR0aDpwYXJzZUZsb2F0KGkuZWxlbWVudC5jc3MoIndpZHRoIikpLGhlaWdodDpwYXJzZUZsb2F0KGkuZWxlbWVudC5jc3MoImhlaWdodCIpKSx0b3A6cGFyc2VGbG9hdChpLmVsZW1lbnQuY3NzKCJ0b3AiKSksbGVmdDpwYXJzZUZsb2F0KGkuZWxlbWVudC5jc3MoImxlZnQiKSl9O24mJm4ubGVuZ3RoJiZ0KG5bMF0pLmNzcyh7d2lkdGg6cy53aWR0aCxoZWlnaHQ6cy5oZWlnaHR9KSxpLl91cGRhdGVDYWNoZShzKSxpLl9wcm9wYWdhdGUoInJlc2l6ZSIsZSl9fSl9fSksdC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJjb250YWlubWVudCIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGUsaSxzLG4sbyxhLHIsaD10KHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxsPWgub3B0aW9ucyxjPWguZWxlbWVudCx1PWwuY29udGFpbm1lbnQsZD11IGluc3RhbmNlb2YgdD91LmdldCgwKTovcGFyZW50Ly50ZXN0KHUpP2MucGFyZW50KCkuZ2V0KDApOnU7ZCYmKGguY29udGFpbmVyRWxlbWVudD10KGQpLC9kb2N1bWVudC8udGVzdCh1KXx8dT09PWRvY3VtZW50PyhoLmNvbnRhaW5lck9mZnNldD17bGVmdDowLHRvcDowfSxoLmNvbnRhaW5lclBvc2l0aW9uPXtsZWZ0OjAsdG9wOjB9LGgucGFyZW50RGF0YT17ZWxlbWVudDp0KGRvY3VtZW50KSxsZWZ0OjAsdG9wOjAsd2lkdGg6dChkb2N1bWVudCkud2lkdGgoKSxoZWlnaHQ6dChkb2N1bWVudCkuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHR9KTooZT10KGQpLGk9W10sdChbIlRvcCIsIlJpZ2h0IiwiTGVmdCIsIkJvdHRvbSJdKS5lYWNoKGZ1bmN0aW9uKHQscyl7aVt0XT1oLl9udW0oZS5jc3MoInBhZGRpbmciK3MpKX0pLGguY29udGFpbmVyT2Zmc2V0PWUub2Zmc2V0KCksaC5jb250YWluZXJQb3NpdGlvbj1lLnBvc2l0aW9uKCksaC5jb250YWluZXJTaXplPXtoZWlnaHQ6ZS5pbm5lckhlaWdodCgpLWlbM10sd2lkdGg6ZS5pbm5lcldpZHRoKCktaVsxXX0scz1oLmNvbnRhaW5lck9mZnNldCxuPWguY29udGFpbmVyU2l6ZS5oZWlnaHQsbz1oLmNvbnRhaW5lclNpemUud2lkdGgsYT1oLl9oYXNTY3JvbGwoZCwibGVmdCIpP2Quc2Nyb2xsV2lkdGg6byxyPWguX2hhc1Njcm9sbChkKT9kLnNjcm9sbEhlaWdodDpuLGgucGFyZW50RGF0YT17ZWxlbWVudDpkLGxlZnQ6cy5sZWZ0LHRvcDpzLnRvcCx3aWR0aDphLGhlaWdodDpyfSkpfSxyZXNpemU6ZnVuY3Rpb24oZSl7dmFyIGkscyxuLG8sYT10KHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxyPWEub3B0aW9ucyxoPWEuY29udGFpbmVyT2Zmc2V0LGw9YS5wb3NpdGlvbixjPWEuX2FzcGVjdFJhdGlvfHxlLnNoaWZ0S2V5LHU9e3RvcDowLGxlZnQ6MH0sZD1hLmNvbnRhaW5lckVsZW1lbnQscD0hMDtkWzBdIT09ZG9jdW1lbnQmJi9zdGF0aWMvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiYodT1oKSxsLmxlZnQ8KGEuX2hlbHBlcj9oLmxlZnQ6MCkmJihhLnNpemUud2lkdGg9YS5zaXplLndpZHRoKyhhLl9oZWxwZXI/YS5wb3NpdGlvbi5sZWZ0LWgubGVmdDphLnBvc2l0aW9uLmxlZnQtdS5sZWZ0KSxjJiYoYS5zaXplLmhlaWdodD1hLnNpemUud2lkdGgvYS5hc3BlY3RSYXRpbyxwPSExKSxhLnBvc2l0aW9uLmxlZnQ9ci5oZWxwZXI/aC5sZWZ0OjApLGwudG9wPChhLl9oZWxwZXI/aC50b3A6MCkmJihhLnNpemUuaGVpZ2h0PWEuc2l6ZS5oZWlnaHQrKGEuX2hlbHBlcj9hLnBvc2l0aW9uLnRvcC1oLnRvcDphLnBvc2l0aW9uLnRvcCksYyYmKGEuc2l6ZS53aWR0aD1hLnNpemUuaGVpZ2h0KmEuYXNwZWN0UmF0aW8scD0hMSksYS5wb3NpdGlvbi50b3A9YS5faGVscGVyP2gudG9wOjApLG49YS5jb250YWluZXJFbGVtZW50LmdldCgwKT09PWEuZWxlbWVudC5wYXJlbnQoKS5nZXQoMCksbz0vcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3QoYS5jb250YWluZXJFbGVtZW50LmNzcygicG9zaXRpb24iKSksbiYmbz8oYS5vZmZzZXQubGVmdD1hLnBhcmVudERhdGEubGVmdCthLnBvc2l0aW9uLmxlZnQsYS5vZmZzZXQudG9wPWEucGFyZW50RGF0YS50b3ArYS5wb3NpdGlvbi50b3ApOihhLm9mZnNldC5sZWZ0PWEuZWxlbWVudC5vZmZzZXQoKS5sZWZ0LGEub2Zmc2V0LnRvcD1hLmVsZW1lbnQub2Zmc2V0KCkudG9wKSxpPU1hdGguYWJzKGEuc2l6ZURpZmYud2lkdGgrKGEuX2hlbHBlcj9hLm9mZnNldC5sZWZ0LXUubGVmdDphLm9mZnNldC5sZWZ0LWgubGVmdCkpLHM9TWF0aC5hYnMoYS5zaXplRGlmZi5oZWlnaHQrKGEuX2hlbHBlcj9hLm9mZnNldC50b3AtdS50b3A6YS5vZmZzZXQudG9wLWgudG9wKSksaSthLnNpemUud2lkdGg+PWEucGFyZW50RGF0YS53aWR0aCYmKGEuc2l6ZS53aWR0aD1hLnBhcmVudERhdGEud2lkdGgtaSxjJiYoYS5zaXplLmhlaWdodD1hLnNpemUud2lkdGgvYS5hc3BlY3RSYXRpbyxwPSExKSkscythLnNpemUuaGVpZ2h0Pj1hLnBhcmVudERhdGEuaGVpZ2h0JiYoYS5zaXplLmhlaWdodD1hLnBhcmVudERhdGEuaGVpZ2h0LXMsYyYmKGEuc2l6ZS53aWR0aD1hLnNpemUuaGVpZ2h0KmEuYXNwZWN0UmF0aW8scD0hMSkpLHB8fChhLnBvc2l0aW9uLmxlZnQ9YS5wcmV2UG9zaXRpb24ubGVmdCxhLnBvc2l0aW9uLnRvcD1hLnByZXZQb3NpdGlvbi50b3AsYS5zaXplLndpZHRoPWEucHJldlNpemUud2lkdGgsYS5zaXplLmhlaWdodD1hLnByZXZTaXplLmhlaWdodCl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxpPWUub3B0aW9ucyxzPWUuY29udGFpbmVyT2Zmc2V0LG49ZS5jb250YWluZXJQb3NpdGlvbixvPWUuY29udGFpbmVyRWxlbWVudCxhPXQoZS5oZWxwZXIpLHI9YS5vZmZzZXQoKSxoPWEub3V0ZXJXaWR0aCgpLWUuc2l6ZURpZmYud2lkdGgsbD1hLm91dGVySGVpZ2h0KCktZS5zaXplRGlmZi5oZWlnaHQ7ZS5faGVscGVyJiYhaS5hbmltYXRlJiYvcmVsYXRpdmUvLnRlc3Qoby5jc3MoInBvc2l0aW9uIikpJiZ0KHRoaXMpLmNzcyh7bGVmdDpyLmxlZnQtbi5sZWZ0LXMubGVmdCx3aWR0aDpoLGhlaWdodDpsfSksZS5faGVscGVyJiYhaS5hbmltYXRlJiYvc3RhdGljLy50ZXN0KG8uY3NzKCJwb3NpdGlvbiIpKSYmdCh0aGlzKS5jc3Moe2xlZnQ6ci5sZWZ0LW4ubGVmdC1zLmxlZnQsd2lkdGg6aCxoZWlnaHQ6bH0pfX0pLHQudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYWxzb1Jlc2l6ZSIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksaT1lLm9wdGlvbnM7dChpLmFsc29SZXNpemUpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO2UuZGF0YSgidWktcmVzaXphYmxlLWFsc29yZXNpemUiLHt3aWR0aDpwYXJzZUZsb2F0KGUud2lkdGgoKSksaGVpZ2h0OnBhcnNlRmxvYXQoZS5oZWlnaHQoKSksbGVmdDpwYXJzZUZsb2F0KGUuY3NzKCJsZWZ0IikpLHRvcDpwYXJzZUZsb2F0KGUuY3NzKCJ0b3AiKSl9KX0pfSxyZXNpemU6ZnVuY3Rpb24oZSxpKXt2YXIgcz10KHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKSxuPXMub3B0aW9ucyxvPXMub3JpZ2luYWxTaXplLGE9cy5vcmlnaW5hbFBvc2l0aW9uLHI9e2hlaWdodDpzLnNpemUuaGVpZ2h0LW8uaGVpZ2h0fHwwLHdpZHRoOnMuc2l6ZS53aWR0aC1vLndpZHRofHwwLHRvcDpzLnBvc2l0aW9uLnRvcC1hLnRvcHx8MCxsZWZ0OnMucG9zaXRpb24ubGVmdC1hLmxlZnR8fDB9Owp0KG4uYWxzb1Jlc2l6ZSkuZWFjaChmdW5jdGlvbigpe3ZhciBlPXQodGhpcykscz10KHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIiksbj17fSxvPWUucGFyZW50cyhpLm9yaWdpbmFsRWxlbWVudFswXSkubGVuZ3RoP1sid2lkdGgiLCJoZWlnaHQiXTpbIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwibGVmdCJdO3QuZWFjaChvLGZ1bmN0aW9uKHQsZSl7dmFyIGk9KHNbZV18fDApKyhyW2VdfHwwKTtpJiZpPj0wJiYobltlXT1pfHxudWxsKX0pLGUuY3NzKG4pfSl9LHN0b3A6ZnVuY3Rpb24oKXt0KHRoaXMpLnJlbW92ZURhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIil9fSksdC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJnaG9zdCIse3N0YXJ0OmZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksaT1lLnNpemU7ZS5naG9zdD1lLm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpLGUuZ2hvc3QuY3NzKHtvcGFjaXR5Oi4yNSxkaXNwbGF5OiJibG9jayIscG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6aS5oZWlnaHQsd2lkdGg6aS53aWR0aCxtYXJnaW46MCxsZWZ0OjAsdG9wOjB9KSxlLl9hZGRDbGFzcyhlLmdob3N0LCJ1aS1yZXNpemFibGUtZ2hvc3QiKSx0LnVpQmFja0NvbXBhdCE9PSExJiYic3RyaW5nIj09dHlwZW9mIGUub3B0aW9ucy5naG9zdCYmZS5naG9zdC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuZ2hvc3QpLGUuZ2hvc3QuYXBwZW5kVG8oZS5oZWxwZXIpfSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKTtlLmdob3N0JiZlLmdob3N0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6ZS5zaXplLmhlaWdodCx3aWR0aDplLnNpemUud2lkdGh9KX0sc3RvcDpmdW5jdGlvbigpe3ZhciBlPXQodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpO2UuZ2hvc3QmJmUuaGVscGVyJiZlLmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQoZS5naG9zdC5nZXQoMCkpfX0pLHQudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ3JpZCIse3Jlc2l6ZTpmdW5jdGlvbigpe3ZhciBlLGk9dCh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscz1pLm9wdGlvbnMsbj1pLnNpemUsbz1pLm9yaWdpbmFsU2l6ZSxhPWkub3JpZ2luYWxQb3NpdGlvbixyPWkuYXhpcyxoPSJudW1iZXIiPT10eXBlb2Ygcy5ncmlkP1tzLmdyaWQscy5ncmlkXTpzLmdyaWQsbD1oWzBdfHwxLGM9aFsxXXx8MSx1PU1hdGgucm91bmQoKG4ud2lkdGgtby53aWR0aCkvbCkqbCxkPU1hdGgucm91bmQoKG4uaGVpZ2h0LW8uaGVpZ2h0KS9jKSpjLHA9by53aWR0aCt1LGY9by5oZWlnaHQrZCxtPXMubWF4V2lkdGgmJnA+cy5tYXhXaWR0aCxnPXMubWF4SGVpZ2h0JiZmPnMubWF4SGVpZ2h0LHY9cy5taW5XaWR0aCYmcy5taW5XaWR0aD5wLF89cy5taW5IZWlnaHQmJnMubWluSGVpZ2h0PmY7cy5ncmlkPWgsdiYmKHArPWwpLF8mJihmKz1jKSxtJiYocC09bCksZyYmKGYtPWMpLC9eKHNlfHN8ZSkkLy50ZXN0KHIpPyhpLnNpemUud2lkdGg9cCxpLnNpemUuaGVpZ2h0PWYpOi9eKG5lKSQvLnRlc3Qocik/KGkuc2l6ZS53aWR0aD1wLGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1hLnRvcC1kKTovXihzdykkLy50ZXN0KHIpPyhpLnNpemUud2lkdGg9cCxpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi5sZWZ0PWEubGVmdC11KTooKDA+PWYtY3x8MD49cC1sKSYmKGU9aS5fZ2V0UGFkZGluZ1BsdXNCb3JkZXJEaW1lbnNpb25zKHRoaXMpKSxmLWM+MD8oaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24udG9wPWEudG9wLWQpOihmPWMtZS5oZWlnaHQsaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24udG9wPWEudG9wK28uaGVpZ2h0LWYpLHAtbD4wPyhpLnNpemUud2lkdGg9cCxpLnBvc2l0aW9uLmxlZnQ9YS5sZWZ0LXUpOihwPWwtZS53aWR0aCxpLnNpemUud2lkdGg9cCxpLnBvc2l0aW9uLmxlZnQ9YS5sZWZ0K28ud2lkdGgtcCkpfX0pLHQudWkucmVzaXphYmxlLHQud2lkZ2V0KCJ1aS5zZWxlY3RhYmxlIix0LnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjEyLjEiLG9wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjoiKiIsdG9sZXJhbmNlOiJ0b3VjaCIsc2VsZWN0ZWQ6bnVsbCxzZWxlY3Rpbmc6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCx1bnNlbGVjdGVkOm51bGwsdW5zZWxlY3Rpbmc6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fYWRkQ2xhc3MoInVpLXNlbGVjdGFibGUiKSx0aGlzLmRyYWdnZWQ9ITEsdGhpcy5yZWZyZXNoPWZ1bmN0aW9uKCl7ZS5lbGVtZW50UG9zPXQoZS5lbGVtZW50WzBdKS5vZmZzZXQoKSxlLnNlbGVjdGVlcz10KGUub3B0aW9ucy5maWx0ZXIsZS5lbGVtZW50WzBdKSxlLl9hZGRDbGFzcyhlLnNlbGVjdGVlcywidWktc2VsZWN0ZWUiKSxlLnNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKSxzPWkub2Zmc2V0KCksbj17bGVmdDpzLmxlZnQtZS5lbGVtZW50UG9zLmxlZnQsdG9wOnMudG9wLWUuZWxlbWVudFBvcy50b3B9O3QuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iLHtlbGVtZW50OnRoaXMsJGVsZW1lbnQ6aSxsZWZ0Om4ubGVmdCx0b3A6bi50b3AscmlnaHQ6bi5sZWZ0K2kub3V0ZXJXaWR0aCgpLGJvdHRvbTpuLnRvcCtpLm91dGVySGVpZ2h0KCksc3RhcnRzZWxlY3RlZDohMSxzZWxlY3RlZDppLmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpLHNlbGVjdGluZzppLmhhc0NsYXNzKCJ1aS1zZWxlY3RpbmciKSx1bnNlbGVjdGluZzppLmhhc0NsYXNzKCJ1aS11bnNlbGVjdGluZyIpfSl9KX0sdGhpcy5yZWZyZXNoKCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5oZWxwZXI9dCgiPGRpdj4iKSx0aGlzLl9hZGRDbGFzcyh0aGlzLmhlbHBlciwidWktc2VsZWN0YWJsZS1oZWxwZXIiKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVlcy5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLl9tb3VzZURlc3Ryb3koKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcyxzPXRoaXMub3B0aW9uczt0aGlzLm9wb3M9W2UucGFnZVgsZS5wYWdlWV0sdGhpcy5lbGVtZW50UG9zPXQodGhpcy5lbGVtZW50WzBdKS5vZmZzZXQoKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLnNlbGVjdGVlcz10KHMuZmlsdGVyLHRoaXMuZWxlbWVudFswXSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLGUpLHQocy5hcHBlbmRUbykuYXBwZW5kKHRoaXMuaGVscGVyKSx0aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZS5wYWdlWCx0b3A6ZS5wYWdlWSx3aWR0aDowLGhlaWdodDowfSkscy5hdXRvUmVmcmVzaCYmdGhpcy5yZWZyZXNoKCksdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWktc2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9dC5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3Muc3RhcnRzZWxlY3RlZD0hMCxlLm1ldGFLZXl8fGUuY3RybEtleXx8KGkuX3JlbW92ZUNsYXNzKHMuJGVsZW1lbnQsInVpLXNlbGVjdGVkIikscy5zZWxlY3RlZD0hMSxpLl9hZGRDbGFzcyhzLiRlbGVtZW50LCJ1aS11bnNlbGVjdGluZyIpLHMudW5zZWxlY3Rpbmc9ITAsaS5fdHJpZ2dlcigidW5zZWxlY3RpbmciLGUse3Vuc2VsZWN0aW5nOnMuZWxlbWVudH0pKX0pLHQoZS50YXJnZXQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciBzLG49dC5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3JldHVybiBuPyhzPSFlLm1ldGFLZXkmJiFlLmN0cmxLZXl8fCFuLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuX3JlbW92ZUNsYXNzKG4uJGVsZW1lbnQscz8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLl9hZGRDbGFzcyhuLiRlbGVtZW50LHM/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksbi51bnNlbGVjdGluZz0hcyxuLnNlbGVjdGluZz1zLG4uc2VsZWN0ZWQ9cyxzP2kuX3RyaWdnZXIoInNlbGVjdGluZyIsZSx7c2VsZWN0aW5nOm4uZWxlbWVudH0pOmkuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixlLHt1bnNlbGVjdGluZzpuLmVsZW1lbnR9KSwhMSk6dm9pZCAwfSkpfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGUpe2lmKHRoaXMuZHJhZ2dlZD0hMCwhdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgaSxzPXRoaXMsbj10aGlzLm9wdGlvbnMsbz10aGlzLm9wb3NbMF0sYT10aGlzLm9wb3NbMV0scj1lLnBhZ2VYLGg9ZS5wYWdlWTtyZXR1cm4gbz5yJiYoaT1yLHI9byxvPWkpLGE+aCYmKGk9aCxoPWEsYT1pKSx0aGlzLmhlbHBlci5jc3Moe2xlZnQ6byx0b3A6YSx3aWR0aDpyLW8saGVpZ2h0OmgtYX0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10LmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIiksbD0hMSxjPXt9O2kmJmkuZWxlbWVudCE9PXMuZWxlbWVudFswXSYmKGMubGVmdD1pLmxlZnQrcy5lbGVtZW50UG9zLmxlZnQsYy5yaWdodD1pLnJpZ2h0K3MuZWxlbWVudFBvcy5sZWZ0LGMudG9wPWkudG9wK3MuZWxlbWVudFBvcy50b3AsYy5ib3R0b209aS5ib3R0b20rcy5lbGVtZW50UG9zLnRvcCwidG91Y2giPT09bi50b2xlcmFuY2U/bD0hKGMubGVmdD5yfHxvPmMucmlnaHR8fGMudG9wPmh8fGE+Yy5ib3R0b20pOiJmaXQiPT09bi50b2xlcmFuY2UmJihsPWMubGVmdD5vJiZyPmMucmlnaHQmJmMudG9wPmEmJmg+Yy5ib3R0b20pLGw/KGkuc2VsZWN0ZWQmJihzLl9yZW1vdmVDbGFzcyhpLiRlbGVtZW50LCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEpLGkudW5zZWxlY3RpbmcmJihzLl9yZW1vdmVDbGFzcyhpLiRlbGVtZW50LCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITEpLGkuc2VsZWN0aW5nfHwocy5fYWRkQ2xhc3MoaS4kZWxlbWVudCwidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITAscy5fdHJpZ2dlcigic2VsZWN0aW5nIixlLHtzZWxlY3Rpbmc6aS5lbGVtZW50fSkpKTooaS5zZWxlY3RpbmcmJigoZS5tZXRhS2V5fHxlLmN0cmxLZXkpJiZpLnN0YXJ0c2VsZWN0ZWQ/KHMuX3JlbW92ZUNsYXNzKGkuJGVsZW1lbnQsInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLHMuX2FkZENsYXNzKGkuJGVsZW1lbnQsInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMCk6KHMuX3JlbW92ZUNsYXNzKGkuJGVsZW1lbnQsInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuc3RhcnRzZWxlY3RlZCYmKHMuX2FkZENsYXNzKGkuJGVsZW1lbnQsInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMCkscy5fdHJpZ2dlcigidW5zZWxlY3RpbmciLGUse3Vuc2VsZWN0aW5nOmkuZWxlbWVudH0pKSksaS5zZWxlY3RlZCYmKGUubWV0YUtleXx8ZS5jdHJsS2V5fHxpLnN0YXJ0c2VsZWN0ZWR8fChzLl9yZW1vdmVDbGFzcyhpLiRlbGVtZW50LCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEscy5fYWRkQ2xhc3MoaS4kZWxlbWVudCwidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLHMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixlLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpKSl9KSwhMX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcztyZXR1cm4gdGhpcy5kcmFnZ2VkPSExLHQoIi51aS11bnNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9dC5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO2kuX3JlbW92ZUNsYXNzKHMuJGVsZW1lbnQsInVpLXVuc2VsZWN0aW5nIikscy51bnNlbGVjdGluZz0hMSxzLnN0YXJ0c2VsZWN0ZWQ9ITEsaS5fdHJpZ2dlcigidW5zZWxlY3RlZCIsZSx7dW5zZWxlY3RlZDpzLmVsZW1lbnR9KX0pLHQoIi51aS1zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBzPXQuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtpLl9yZW1vdmVDbGFzcyhzLiRlbGVtZW50LCJ1aS1zZWxlY3RpbmciKS5fYWRkQ2xhc3Mocy4kZWxlbWVudCwidWktc2VsZWN0ZWQiKSxzLnNlbGVjdGluZz0hMSxzLnNlbGVjdGVkPSEwLHMuc3RhcnRzZWxlY3RlZD0hMCxpLl90cmlnZ2VyKCJzZWxlY3RlZCIsZSx7c2VsZWN0ZWQ6cy5lbGVtZW50fSl9KSx0aGlzLl90cmlnZ2VyKCJzdG9wIixlKSx0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX19KSx0LndpZGdldCgidWkuc29ydGFibGUiLHQudWkubW91c2Use3ZlcnNpb246IjEuMTIuMSIsd2lkZ2V0RXZlbnRQcmVmaXg6InNvcnQiLHJlYWR5OiExLG9wdGlvbnM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFdpdGg6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaXRlbXM6Ij4gKiIsb3BhY2l0eTohMSxwbGFjZWhvbGRlcjohMSxyZXZlcnQ6ITEsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsekluZGV4OjFlMyxhY3RpdmF0ZTpudWxsLGJlZm9yZVN0b3A6bnVsbCxjaGFuZ2U6bnVsbCxkZWFjdGl2YXRlOm51bGwsb3V0Om51bGwsb3ZlcjpudWxsLHJlY2VpdmU6bnVsbCxyZW1vdmU6bnVsbCxzb3J0Om51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsdXBkYXRlOm51bGx9LF9pc092ZXJBeGlzOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdD49ZSYmZStpPnR9LF9pc0Zsb2F0aW5nOmZ1bmN0aW9uKHQpe3JldHVybi9sZWZ0fHJpZ2h0Ly50ZXN0KHQuY3NzKCJmbG9hdCIpKXx8L2lubGluZXx0YWJsZS1jZWxsLy50ZXN0KHQuY3NzKCJkaXNwbGF5IikpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLl9hZGRDbGFzcygidWktc29ydGFibGUiKSx0aGlzLnJlZnJlc2goKSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5yZWFkeT0hMH0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuX3N1cGVyKHQsZSksImhhbmRsZSI9PT10JiZ0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKX0sX3NldEhhbmRsZUNsYXNzTmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LmZpbmQoIi51aS1zb3J0YWJsZS1oYW5kbGUiKSwidWktc29ydGFibGUtaGFuZGxlIiksdC5lYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24oKXtlLl9hZGRDbGFzcyh0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGFuZGxlP3RoaXMuaXRlbS5maW5kKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oYW5kbGUpOnRoaXMuaXRlbSwidWktc29ydGFibGUtaGFuZGxlIil9KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTtmb3IodmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLml0ZW1zW3RdLml0ZW0ucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIik7cmV0dXJuIHRoaXN9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oZSxpKXt2YXIgcz1udWxsLG49ITEsbz10aGlzO3JldHVybiB0aGlzLnJldmVydGluZz8hMTp0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCJzdGF0aWMiPT09dGhpcy5vcHRpb25zLnR5cGU/ITE6KHRoaXMuX3JlZnJlc2hJdGVtcyhlKSx0KGUudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiB0LmRhdGEodGhpcyxvLndpZGdldE5hbWUrIi1pdGVtIik9PT1vPyhzPXQodGhpcyksITEpOnZvaWQgMH0pLHQuZGF0YShlLnRhcmdldCxvLndpZGdldE5hbWUrIi1pdGVtIik9PT1vJiYocz10KGUudGFyZ2V0KSkscz8hdGhpcy5vcHRpb25zLmhhbmRsZXx8aXx8KHQodGhpcy5vcHRpb25zLmhhbmRsZSxzKS5maW5kKCIqIikuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT09ZS50YXJnZXQmJihuPSEwKX0pLG4pPyh0aGlzLmN1cnJlbnRJdGVtPXMsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMCk6ITE6ITEpfSxfbW91c2VTdGFydDpmdW5jdGlvbihlLGkscyl7dmFyIG4sbyxhPXRoaXMub3B0aW9ucztpZih0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcyx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzLmhlbHBlcj10aGlzLl9jcmVhdGVIZWxwZXIoZSksdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMuY3VycmVudEl0ZW0ub2Zmc2V0KCksdGhpcy5vZmZzZXQ9e3RvcDp0aGlzLm9mZnNldC50b3AtdGhpcy5tYXJnaW5zLnRvcCxsZWZ0OnRoaXMub2Zmc2V0LmxlZnQtdGhpcy5tYXJnaW5zLmxlZnR9LHQuZXh0ZW5kKHRoaXMub2Zmc2V0LHtjbGljazp7bGVmdDplLnBhZ2VYLXRoaXMub2Zmc2V0LmxlZnQsdG9wOmUucGFnZVktdGhpcy5vZmZzZXQudG9wfSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0pLHRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMub3JpZ2luYWxQb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGUpLHRoaXMub3JpZ2luYWxQYWdlWD1lLnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT1lLnBhZ2VZLGEuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoYS5jdXJzb3JBdCksdGhpcy5kb21Qb3NpdGlvbj17cHJldjp0aGlzLmN1cnJlbnRJdGVtLnByZXYoKVswXSxwYXJlbnQ6dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXX0sdGhpcy5oZWxwZXJbMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLGEuY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksYS5jdXJzb3ImJiJhdXRvIiE9PWEuY3Vyc29yJiYobz10aGlzLmRvY3VtZW50LmZpbmQoImJvZHkiKSx0aGlzLnN0b3JlZEN1cnNvcj1vLmNzcygiY3Vyc29yIiksby5jc3MoImN1cnNvciIsYS5jdXJzb3IpLHRoaXMuc3RvcmVkU3R5bGVzaGVldD10KCI8c3R5bGU+KnsgY3Vyc29yOiAiK2EuY3Vyc29yKyIgIWltcG9ydGFudDsgfTwvc3R5bGU+IikuYXBwZW5kVG8obykpLGEub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixhLm9wYWNpdHkpKSxhLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLGEuekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiYiSFRNTCIhPT10aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lJiYodGhpcy5vdmVyZmxvd09mZnNldD10aGlzLnNjcm9sbFBhcmVudC5vZmZzZXQoKSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLGUsdGhpcy5fdWlIYXNoKCkpLHRoaXMuX3ByZXNlcnZlSGVscGVyUHJvcG9ydGlvbnN8fHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSwhcylmb3Iobj10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7bj49MDtuLS0pdGhpcy5jb250YWluZXJzW25dLl90cmlnZ2VyKCJhY3RpdmF0ZSIsZSx0aGlzLl91aUhhc2godGhpcykpO3JldHVybiB0LnVpLmRkbWFuYWdlciYmKHQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksdC51aS5kZG1hbmFnZXImJiFhLmRyb3BCZWhhdmlvdXImJnQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsZSksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLl9hZGRDbGFzcyh0aGlzLmhlbHBlciwidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGUpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbixvLGE9dGhpcy5vcHRpb25zLHI9ITE7Zm9yKHRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihlKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyksdGhpcy5vcHRpb25zLnNjcm9sbCYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmIkhUTUwiIT09dGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZT8odGhpcy5vdmVyZmxvd09mZnNldC50b3ArdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0LWUucGFnZVk8YS5zY3JvbGxTZW5zaXRpdml0eT90aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3ArYS5zY3JvbGxTcGVlZDplLnBhZ2VZLXRoaXMub3ZlcmZsb3dPZmZzZXQudG9wPGEuc2Nyb2xsU2Vuc2l0aXZpdHkmJih0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3A9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AtYS5zY3JvbGxTcGVlZCksdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0K3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoLWUucGFnZVg8YS5zY3JvbGxTZW5zaXRpdml0eT90aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCthLnNjcm9sbFNwZWVkOmUucGFnZVgtdGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0PGEuc2Nyb2xsU2Vuc2l0aXZpdHkmJih0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0PXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdC1hLnNjcm9sbFNwZWVkKSk6KGUucGFnZVktdGhpcy5kb2N1bWVudC5zY3JvbGxUb3AoKTxhLnNjcm9sbFNlbnNpdGl2aXR5P3I9dGhpcy5kb2N1bWVudC5zY3JvbGxUb3AodGhpcy5kb2N1bWVudC5zY3JvbGxUb3AoKS1hLnNjcm9sbFNwZWVkKTp0aGlzLndpbmRvdy5oZWlnaHQoKS0oZS5wYWdlWS10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpKTxhLnNjcm9sbFNlbnNpdGl2aXR5JiYocj10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCh0aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpK2Euc2Nyb2xsU3BlZWQpKSxlLnBhZ2VYLXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpPGEuc2Nyb2xsU2Vuc2l0aXZpdHk/cj10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQodGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCktYS5zY3JvbGxTcGVlZCk6dGhpcy53aW5kb3cud2lkdGgoKS0oZS5wYWdlWC10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKSk8YS5zY3JvbGxTZW5zaXRpdml0eSYmKHI9dGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KHRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpK2Euc2Nyb2xsU3BlZWQpKSksciE9PSExJiZ0LnVpLmRkbWFuYWdlciYmIWEuZHJvcEJlaGF2aW91ciYmdC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxlKSksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSx0aGlzLm9wdGlvbnMuYXhpcyYmInkiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiKSx0aGlzLm9wdGlvbnMuYXhpcyYmIngiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IiksaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKWlmKHM9dGhpcy5pdGVtc1tpXSxuPXMuaXRlbVswXSxvPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihzKSxvJiZzLmluc3RhbmNlPT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiZuIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5wbGFjZWhvbGRlclsxPT09bz8ibmV4dCI6InByZXYiXSgpWzBdIT09biYmIXQuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxuKSYmKCJzZW1pLWR5bmFtaWMiPT09dGhpcy5vcHRpb25zLnR5cGU/IXQuY29udGFpbnModGhpcy5lbGVtZW50WzBdLG4pOiEwKSl7aWYodGhpcy5kaXJlY3Rpb249MT09PW8/ImRvd24iOiJ1cCIsInBvaW50ZXIiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmIXRoaXMuX2ludGVyc2VjdHNXaXRoU2lkZXMocykpYnJlYWs7dGhpcy5fcmVhcnJhbmdlKGUscyksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHRoaXMuX3VpSGFzaCgpKTticmVha31yZXR1cm4gdGhpcy5fY29udGFjdENvbnRhaW5lcnMoZSksdC51aS5kZG1hbmFnZXImJnQudWkuZGRtYW5hZ2VyLmRyYWcodGhpcyxlKSx0aGlzLl90cmlnZ2VyKCJzb3J0IixlLHRoaXMuX3VpSGFzaCgpKSx0aGlzLmxhc3RQb3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGUsaSl7aWYoZSl7aWYodC51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmdC51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGUpLHRoaXMub3B0aW9ucy5yZXZlcnQpe3ZhciBzPXRoaXMsbj10aGlzLnBsYWNlaG9sZGVyLm9mZnNldCgpLG89dGhpcy5vcHRpb25zLmF4aXMsYT17fTtvJiYieCIhPT1vfHwoYS5sZWZ0PW4ubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdC10aGlzLm1hcmdpbnMubGVmdCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxMZWZ0KSksbyYmInkiIT09b3x8KGEudG9wPW4udG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5tYXJnaW5zLnRvcCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHk/MDp0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApKSx0aGlzLnJldmVydGluZz0hMCx0KHRoaXMuaGVscGVyKS5hbmltYXRlKGEscGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydCwxMCl8fDUwMCxmdW5jdGlvbigpe3MuX2NsZWFyKGUpfSl9ZWxzZSB0aGlzLl9jbGVhcihlLGkpO3JldHVybiExfX0sY2FuY2VsOmZ1bmN0aW9uKCl7aWYodGhpcy5kcmFnZ2luZyl7dGhpcy5fbW91c2VVcChuZXcgdC5FdmVudCgibW91c2V1cCIse3RhcmdldDpudWxsfSkpLCJvcmlnaW5hbCI9PT10aGlzLm9wdGlvbnMuaGVscGVyPyh0aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMuY3VycmVudEl0ZW0sInVpLXNvcnRhYmxlLWhlbHBlciIpKTp0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodmFyIGU9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2U+PTA7ZS0tKXRoaXMuY29udGFpbmVyc1tlXS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsbnVsbCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW2VdLl90cmlnZ2VyKCJvdXQiLG51bGwsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUub3Zlcj0wKX1yZXR1cm4gdGhpcy5wbGFjZWhvbGRlciYmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLCJvcmlnaW5hbCIhPT10aGlzLm9wdGlvbnMuaGVscGVyJiZ0aGlzLmhlbHBlciYmdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksdC5leHRlbmQodGhpcyx7aGVscGVyOm51bGwsZHJhZ2dpbmc6ITEscmV2ZXJ0aW5nOiExLF9ub0ZpbmFsU29ydDpudWxsfSksdGhpcy5kb21Qb3NpdGlvbi5wcmV2P3QodGhpcy5kb21Qb3NpdGlvbi5wcmV2KS5hZnRlcih0aGlzLmN1cnJlbnRJdGVtKTp0KHRoaXMuZG9tUG9zaXRpb24ucGFyZW50KS5wcmVwZW5kKHRoaXMuY3VycmVudEl0ZW0pKSx0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShlJiZlLmNvbm5lY3RlZCkscz1bXTtyZXR1cm4gZT1lfHx7fSx0KGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT0odChlLml0ZW18fHRoaXMpLmF0dHIoZS5hdHRyaWJ1dGV8fCJpZCIpfHwiIikubWF0Y2goZS5leHByZXNzaW9ufHwvKC4rKVtcLT1fXSguKykvKTtpJiZzLnB1c2goKGUua2V5fHxpWzFdKyJbXSIpKyI9IisoZS5rZXkmJmUuZXhwcmVzc2lvbj9pWzFdOmlbMl0pKX0pLCFzLmxlbmd0aCYmZS5rZXkmJnMucHVzaChlLmtleSsiPSIpLHMuam9pbigiJiIpfSx0b0FycmF5OmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuX2dldEl0ZW1zQXNqUXVlcnkoZSYmZS5jb25uZWN0ZWQpLHM9W107cmV0dXJuIGU9ZXx8e30saS5lYWNoKGZ1bmN0aW9uKCl7cy5wdXNoKHQoZS5pdGVtfHx0aGlzKS5hdHRyKGUuYXR0cmlidXRlfHwiaWQiKXx8IiIpfSksc30sX2ludGVyc2VjdHNXaXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucG9zaXRpb25BYnMubGVmdCxpPWUrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxzPXRoaXMucG9zaXRpb25BYnMudG9wLG49cyt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxvPXQubGVmdCxhPW8rdC53aWR0aCxyPXQudG9wLGg9cit0LmhlaWdodCxsPXRoaXMub2Zmc2V0LmNsaWNrLnRvcCxjPXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsdT0ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8cytsPnImJmg+cytsLGQ9InkiPT09dGhpcy5vcHRpb25zLmF4aXN8fGUrYz5vJiZhPmUrYyxwPXUmJmQ7cmV0dXJuInBvaW50ZXIiPT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZXx8dGhpcy5vcHRpb25zLmZvcmNlUG9pbnRlckZvckNvbnRhaW5lcnN8fCJwb2ludGVyIiE9PXRoaXMub3B0aW9ucy50b2xlcmFuY2UmJnRoaXMuaGVscGVyUHJvcG9ydGlvbnNbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT50W3RoaXMuZmxvYXRpbmc/IndpZHRoIjoiaGVpZ2h0Il0/cDplK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMj5vJiZhPmktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yJiZzK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI+ciYmaD5uLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzJ9LF9pbnRlcnNlY3RzV2l0aFBvaW50ZXI6ZnVuY3Rpb24odCl7dmFyIGUsaSxzPSJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCx0LnRvcCx0LmhlaWdodCksbj0ieSI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCx0LmxlZnQsdC53aWR0aCksbz1zJiZuO3JldHVybiBvPyhlPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGk9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKSx0aGlzLmZsb2F0aW5nPyJyaWdodCI9PT1pfHwiZG93biI9PT1lPzI6MTplJiYoImRvd24iPT09ZT8yOjEpKTohMX0sX2ludGVyc2VjdHNXaXRoU2lkZXM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsdC50b3ArdC5oZWlnaHQvMix0LmhlaWdodCksaT10aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LHQubGVmdCt0LndpZHRoLzIsdC53aWR0aCkscz10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxuPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIHRoaXMuZmxvYXRpbmcmJm4/InJpZ2h0Ij09PW4mJml8fCJsZWZ0Ij09PW4mJiFpOnMmJigiZG93biI9PT1zJiZlfHwidXAiPT09cyYmIWUpfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiAwIT09dCYmKHQ+MD8iZG93biI6InVwIil9LF9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zaXRpb25BYnMubGVmdC10aGlzLmxhc3RQb3NpdGlvbkFicy5sZWZ0O3JldHVybiAwIT09dCYmKHQ+MD8icmlnaHQiOiJsZWZ0Iil9LHJlZnJlc2g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hJdGVtcyh0KSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSx0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKSx0aGlzfSxfY29ubmVjdFdpdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnM7cmV0dXJuIHQuY29ubmVjdFdpdGguY29uc3RydWN0b3I9PT1TdHJpbmc/W3QuY29ubmVjdFdpdGhdOnQuY29ubmVjdFdpdGh9LF9nZXRJdGVtc0FzalF1ZXJ5OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoKXtyLnB1c2godGhpcyl9dmFyIHMsbixvLGEscj1bXSxoPVtdLGw9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihsJiZlKWZvcihzPWwubGVuZ3RoLTE7cz49MDtzLS0pZm9yKG89dChsW3NdLHRoaXMuZG9jdW1lbnRbMF0pLG49by5sZW5ndGgtMTtuPj0wO24tLSlhPXQuZGF0YShvW25dLHRoaXMud2lkZ2V0RnVsbE5hbWUpLGEmJmEhPT10aGlzJiYhYS5vcHRpb25zLmRpc2FibGVkJiZoLnB1c2goW3QuaXNGdW5jdGlvbihhLm9wdGlvbnMuaXRlbXMpP2Eub3B0aW9ucy5pdGVtcy5jYWxsKGEuZWxlbWVudCk6dChhLm9wdGlvbnMuaXRlbXMsYS5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKS5ub3QoIi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpLGFdKTtmb3IoaC5wdXNoKFt0LmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnQsbnVsbCx7b3B0aW9uczp0aGlzLm9wdGlvbnMsaXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6dCh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKS5ub3QoIi51aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpLHRoaXNdKSxzPWgubGVuZ3RoLTE7cz49MDtzLS0paFtzXVswXS5lYWNoKGkpO3JldHVybiB0KHIpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhpcy53aWRnZXROYW1lKyItaXRlbSkiKTt0aGlzLml0ZW1zPXQuZ3JlcCh0aGlzLml0ZW1zLGZ1bmN0aW9uKHQpe2Zvcih2YXIgaT0wO2UubGVuZ3RoPmk7aSsrKWlmKGVbaV09PT10Lml0ZW1bMF0pcmV0dXJuITE7cmV0dXJuITB9KX0sX3JlZnJlc2hJdGVtczpmdW5jdGlvbihlKXt0aGlzLml0ZW1zPVtdLHRoaXMuY29udGFpbmVycz1bdGhpc107dmFyIGkscyxuLG8sYSxyLGgsbCxjPXRoaXMuaXRlbXMsdT1bW3QuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSxlLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTp0KHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxkPXRoaXMuX2Nvbm5lY3RXaXRoKCk7aWYoZCYmdGhpcy5yZWFkeSlmb3IoaT1kLmxlbmd0aC0xO2k+PTA7aS0tKWZvcihuPXQoZFtpXSx0aGlzLmRvY3VtZW50WzBdKSxzPW4ubGVuZ3RoLTE7cz49MDtzLS0pbz10LmRhdGEobltzXSx0aGlzLndpZGdldEZ1bGxOYW1lKSxvJiZvIT09dGhpcyYmIW8ub3B0aW9ucy5kaXNhYmxlZCYmKHUucHVzaChbdC5pc0Z1bmN0aW9uKG8ub3B0aW9ucy5pdGVtcyk/by5vcHRpb25zLml0ZW1zLmNhbGwoby5lbGVtZW50WzBdLGUse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOnQoby5vcHRpb25zLml0ZW1zLG8uZWxlbWVudCksb10pLHRoaXMuY29udGFpbmVycy5wdXNoKG8pKTtmb3IoaT11Lmxlbmd0aC0xO2k+PTA7aS0tKWZvcihhPXVbaV1bMV0scj11W2ldWzBdLHM9MCxsPXIubGVuZ3RoO2w+cztzKyspaD10KHJbc10pLGguZGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVtIixhKSxjLnB1c2goe2l0ZW06aCxpbnN0YW5jZTphLHdpZHRoOjAsaGVpZ2h0OjAsbGVmdDowLHRvcDowfSl9LHJlZnJlc2hQb3NpdGlvbnM6ZnVuY3Rpb24oZSl7dGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD8ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNGbG9hdGluZyh0aGlzLml0ZW1zWzBdLml0ZW0pOiExLHRoaXMub2Zmc2V0UGFyZW50JiZ0aGlzLmhlbHBlciYmKHRoaXMub2Zmc2V0LnBhcmVudD10aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSk7dmFyIGkscyxuLG87Zm9yKGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPj0wO2ktLSlzPXRoaXMuaXRlbXNbaV0scy5pbnN0YW5jZSE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZzLml0ZW1bMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdfHwobj10aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudD90KHRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50LHMuaXRlbSk6cy5pdGVtLGV8fChzLndpZHRoPW4ub3V0ZXJXaWR0aCgpLHMuaGVpZ2h0PW4ub3V0ZXJIZWlnaHQoKSksbz1uLm9mZnNldCgpLHMubGVmdD1vLmxlZnQscy50b3A9by50b3ApO2lmKHRoaXMub3B0aW9ucy5jdXN0b20mJnRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVzaENvbnRhaW5lcnMpdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycy5jYWxsKHRoaXMpO2Vsc2UgZm9yKGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2k+PTA7aS0tKW89dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLmxlZnQ9by5sZWZ0LHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS50b3A9by50b3AsdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLndpZHRoPXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgoKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVySGVpZ2h0KCk7cmV0dXJuIHRoaXN9LF9jcmVhdGVQbGFjZWhvbGRlcjpmdW5jdGlvbihlKXtlPWV8fHRoaXM7dmFyIGkscz1lLm9wdGlvbnM7cy5wbGFjZWhvbGRlciYmcy5wbGFjZWhvbGRlci5jb25zdHJ1Y3RvciE9PVN0cmluZ3x8KGk9cy5wbGFjZWhvbGRlcixzLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIHM9ZS5jdXJyZW50SXRlbVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49dCgiPCIrcysiPiIsZS5kb2N1bWVudFswXSk7cmV0dXJuIGUuX2FkZENsYXNzKG4sInVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIixpfHxlLmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSkuX3JlbW92ZUNsYXNzKG4sInVpLXNvcnRhYmxlLWhlbHBlciIpLCJ0Ym9keSI9PT1zP2UuX2NyZWF0ZVRyUGxhY2Vob2xkZXIoZS5jdXJyZW50SXRlbS5maW5kKCJ0ciIpLmVxKDApLHQoIjx0cj4iLGUuZG9jdW1lbnRbMF0pLmFwcGVuZFRvKG4pKToidHIiPT09cz9lLl9jcmVhdGVUclBsYWNlaG9sZGVyKGUuY3VycmVudEl0ZW0sbik6ImltZyI9PT1zJiZuLmF0dHIoInNyYyIsZS5jdXJyZW50SXRlbS5hdHRyKCJzcmMiKSksaXx8bi5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxufSx1cGRhdGU6ZnVuY3Rpb24odCxuKXsoIWl8fHMuZm9yY2VQbGFjZWhvbGRlclNpemUpJiYobi5oZWlnaHQoKXx8bi5oZWlnaHQoZS5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KGUuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KGUuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKSxuLndpZHRoKCl8fG4ud2lkdGgoZS5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFyc2VJbnQoZS5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50KGUuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpKX19KSxlLnBsYWNlaG9sZGVyPXQocy5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwoZS5lbGVtZW50LGUuY3VycmVudEl0ZW0pKSxlLmN1cnJlbnRJdGVtLmFmdGVyKGUucGxhY2Vob2xkZXIpLHMucGxhY2Vob2xkZXIudXBkYXRlKGUsZS5wbGFjZWhvbGRlcil9LF9jcmVhdGVUclBsYWNlaG9sZGVyOmZ1bmN0aW9uKGUsaSl7dmFyIHM9dGhpcztlLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpe3QoIjx0ZD4mIzE2MDs8L3RkPiIscy5kb2N1bWVudFswXSkuYXR0cigiY29sc3BhbiIsdCh0aGlzKS5hdHRyKCJjb2xzcGFuIil8fDEpLmFwcGVuZFRvKGkpfSl9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbihlKXt2YXIgaSxzLG4sbyxhLHIsaCxsLGMsdSxkPW51bGwscD1udWxsO2ZvcihpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSlpZighdC5jb250YWlucyh0aGlzLmN1cnJlbnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdKSlpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUpKXtpZihkJiZ0LmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdLGQuZWxlbWVudFswXSkpY29udGludWU7ZD10aGlzLmNvbnRhaW5lcnNbaV0scD1pfWVsc2UgdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsZSx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyPTApO2lmKGQpaWYoMT09PXRoaXMuY29udGFpbmVycy5sZW5ndGgpdGhpcy5jb250YWluZXJzW3BdLmNvbnRhaW5lckNhY2hlLm92ZXJ8fCh0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoIm92ZXIiLGUsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xKTtlbHNle2ZvcihuPTFlNCxvPW51bGwsYz1kLmZsb2F0aW5nfHx0aGlzLl9pc0Zsb2F0aW5nKHRoaXMuY3VycmVudEl0ZW0pLGE9Yz8ibGVmdCI6InRvcCIscj1jPyJ3aWR0aCI6ImhlaWdodCIsdT1jPyJwYWdlWCI6InBhZ2VZIixzPXRoaXMuaXRlbXMubGVuZ3RoLTE7cz49MDtzLS0pdC5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbcF0uZWxlbWVudFswXSx0aGlzLml0ZW1zW3NdLml0ZW1bMF0pJiZ0aGlzLml0ZW1zW3NdLml0ZW1bMF0hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiYoaD10aGlzLml0ZW1zW3NdLml0ZW0ub2Zmc2V0KClbYV0sbD0hMSxlW3VdLWg+dGhpcy5pdGVtc1tzXVtyXS8yJiYobD0hMCksbj5NYXRoLmFicyhlW3VdLWgpJiYobj1NYXRoLmFicyhlW3VdLWgpLG89dGhpcy5pdGVtc1tzXSx0aGlzLmRpcmVjdGlvbj1sPyJ1cCI6ImRvd24iKSk7aWYoIW8mJiF0aGlzLm9wdGlvbnMuZHJvcE9uRW1wdHkpcmV0dXJuO2lmKHRoaXMuY3VycmVudENvbnRhaW5lcj09PXRoaXMuY29udGFpbmVyc1twXSlyZXR1cm4gdGhpcy5jdXJyZW50Q29udGFpbmVyLmNvbnRhaW5lckNhY2hlLm92ZXJ8fCh0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoIm92ZXIiLGUsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY3VycmVudENvbnRhaW5lci5jb250YWluZXJDYWNoZS5vdmVyPTEpLHZvaWQgMDtvP3RoaXMuX3JlYXJyYW5nZShlLG8sbnVsbCwhMCk6dGhpcy5fcmVhcnJhbmdlKGUsbnVsbCx0aGlzLmNvbnRhaW5lcnNbcF0uZWxlbWVudCwhMCksdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHRoaXMuX3VpSGFzaCgpKSx0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoImNoYW5nZSIsZSx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY3VycmVudENvbnRhaW5lcj10aGlzLmNvbnRhaW5lcnNbcF0sdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsdGhpcy5wbGFjZWhvbGRlciksdGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJvdmVyIixlLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3BdLmNvbnRhaW5lckNhY2hlLm92ZXI9MX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dC5pc0Z1bmN0aW9uKGkuaGVscGVyKT90KGkuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbZSx0aGlzLmN1cnJlbnRJdGVtXSkpOiJjbG9uZSI9PT1pLmhlbHBlcj90aGlzLmN1cnJlbnRJdGVtLmNsb25lKCk6dGhpcy5jdXJyZW50SXRlbTtyZXR1cm4gcy5wYXJlbnRzKCJib2R5IikubGVuZ3RofHx0KCJwYXJlbnQiIT09aS5hcHBlbmRUbz9pLmFwcGVuZFRvOnRoaXMuY3VycmVudEl0ZW1bMF0ucGFyZW50Tm9kZSlbMF0uYXBwZW5kQ2hpbGQoc1swXSksc1swXT09PXRoaXMuY3VycmVudEl0ZW1bMF0mJih0aGlzLl9zdG9yZWRDU1M9e3dpZHRoOnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsaGVpZ2h0OnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUuaGVpZ2h0LHBvc2l0aW9uOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLHRvcDp0aGlzLmN1cnJlbnRJdGVtLmNzcygidG9wIiksbGVmdDp0aGlzLmN1cnJlbnRJdGVtLmNzcygibGVmdCIpfSksKCFzWzBdLnN0eWxlLndpZHRofHxpLmZvcmNlSGVscGVyU2l6ZSkmJnMud2lkdGgodGhpcy5jdXJyZW50SXRlbS53aWR0aCgpKSwoIXNbMF0uc3R5bGUuaGVpZ2h0fHxpLmZvcmNlSGVscGVyU2l6ZSkmJnMuaGVpZ2h0KHRoaXMuY3VycmVudEl0ZW0uaGVpZ2h0KCkpLHN9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZS5zcGxpdCgiICIpKSx0LmlzQXJyYXkoZSkmJihlPXtsZWZ0OitlWzBdLHRvcDorZVsxXXx8MH0pLCJsZWZ0ImluIGUmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWUubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGUmJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtZS5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBlJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWUudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gZSYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1lLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3JldHVybiJhYnNvbHV0ZSI9PT10aGlzLmNzc1Bvc2l0aW9uJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJnQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYoZS5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksZS50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSwodGhpcy5vZmZzZXRQYXJlbnRbMF09PT10aGlzLmRvY3VtZW50WzBdLmJvZHl8fHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUmJiJodG1sIj09PXRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmdC51aS5pZSkmJihlPXt0b3A6MCxsZWZ0OjB9KSx7dG9wOmUudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmUubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYoInJlbGF0aXZlIj09PXRoaXMuY3NzUG9zaXRpb24pe3ZhciB0PXRoaXMuY3VycmVudEl0ZW0ucG9zaXRpb24oKTtyZXR1cm57dG9wOnQudG9wLShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksbGVmdDp0LmxlZnQtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIpLDEwKXx8MCkrdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpfX1yZXR1cm57dG9wOjAsbGVmdDowfX0sX2NhY2hlTWFyZ2luczpmdW5jdGlvbigpe3RoaXMubWFyZ2lucz17bGVmdDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MH19LF9jYWNoZUhlbHBlclByb3BvcnRpb25zOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJQcm9wb3J0aW9ucz17d2lkdGg6dGhpcy5oZWxwZXIub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpfX0sX3NldENvbnRhaW5tZW50OmZ1bmN0aW9uKCl7dmFyIGUsaSxzLG49dGhpcy5vcHRpb25zOyJwYXJlbnQiPT09bi5jb250YWlubWVudCYmKG4uY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSksKCJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50fHwid2luZG93Ij09PW4uY29udGFpbm1lbnQpJiYodGhpcy5jb250YWlubWVudD1bMC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LDAtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/dGhpcy5kb2N1bWVudC53aWR0aCgpOnRoaXMud2luZG93LndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/dGhpcy5kb2N1bWVudC5oZWlnaHQoKXx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodDp0aGlzLndpbmRvdy5oZWlnaHQoKXx8dGhpcy5kb2N1bWVudFswXS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSksL14oZG9jdW1lbnR8d2luZG93fHBhcmVudCkkLy50ZXN0KG4uY29udGFpbm1lbnQpfHwoZT10KG4uY29udGFpbm1lbnQpWzBdLGk9dChuLmNvbnRhaW5tZW50KS5vZmZzZXQoKSxzPSJoaWRkZW4iIT09dChlKS5jc3MoIm92ZXJmbG93IiksdGhpcy5jb250YWlubWVudD1baS5sZWZ0KyhwYXJzZUludCh0KGUpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQodChlKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxpLnRvcCsocGFyc2VJbnQodChlKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQodChlKS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsaS5sZWZ0KyhzP01hdGgubWF4KGUuc2Nyb2xsV2lkdGgsZS5vZmZzZXRXaWR0aCk6ZS5vZmZzZXRXaWR0aCktKHBhcnNlSW50KHQoZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludCh0KGUpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGkudG9wKyhzP01hdGgubWF4KGUuc2Nyb2xsSGVpZ2h0LGUub2Zmc2V0SGVpZ2h0KTplLm9mZnNldEhlaWdodCktKHBhcnNlSW50KHQoZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KHQoZSkuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSl9LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbihlLGkpe2l8fChpPXRoaXMucG9zaXRpb24pO3ZhciBzPSJhYnNvbHV0ZSI9PT1lPzE6LTEsbj0iYWJzb2x1dGUiIT09dGhpcy5jc3NQb3NpdGlvbnx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZ0LmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxvPS8oaHRtbHxib2R5KS9pLnRlc3QoblswXS50YWdOYW1lKTtyZXR1cm57dG9wOmkudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpzK3RoaXMub2Zmc2V0LnBhcmVudC50b3Aqcy0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOm8/MDpuLnNjcm9sbFRvcCgpKSpzLGxlZnQ6aS5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqcyt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpzLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOm8/MDpuLnNjcm9sbExlZnQoKSkqc319LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbj10aGlzLm9wdGlvbnMsbz1lLnBhZ2VYLGE9ZS5wYWdlWSxyPSJhYnNvbHV0ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJnQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LGg9LyhodG1sfGJvZHkpL2kudGVzdChyWzBdLnRhZ05hbWUpO3JldHVybiJyZWxhdGl2ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5vZmZzZXRQYXJlbnRbMF18fCh0aGlzLm9mZnNldC5yZWxhdGl2ZT10aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpKSx0aGlzLm9yaWdpbmFsUG9zaXRpb24mJih0aGlzLmNvbnRhaW5tZW50JiYoZS5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihvPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKGE9dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGUucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYobz10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGUucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihhPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSksbi5ncmlkJiYoaT10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoYS10aGlzLm9yaWdpbmFsUGFnZVkpL24uZ3JpZFsxXSkqbi5ncmlkWzFdLGE9dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXSYmaS10aGlzLm9mZnNldC5jbGljay50b3A8PXRoaXMuY29udGFpbm1lbnRbM10/aTppLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXT9pLW4uZ3JpZFsxXTppK24uZ3JpZFsxXTppLHM9dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKG8tdGhpcy5vcmlnaW5hbFBhZ2VYKS9uLmdyaWRbMF0pKm4uZ3JpZFswXSxvPXRoaXMuY29udGFpbm1lbnQ/cy10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj10aGlzLmNvbnRhaW5tZW50WzBdJiZzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8PXRoaXMuY29udGFpbm1lbnRbMl0/czpzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PXRoaXMuY29udGFpbm1lbnRbMF0/cy1uLmdyaWRbMF06cytuLmdyaWRbMF06cykpLHt0b3A6YS10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpoPzA6ci5zY3JvbGxUb3AoKSksbGVmdDpvLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpoPzA6ci5zY3JvbGxMZWZ0KCkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbih0LGUsaSxzKXtpP2lbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6ZS5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sImRvd24iPT09dGhpcy5kaXJlY3Rpb24/ZS5pdGVtWzBdOmUuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBuPXRoaXMuY291bnRlcjt0aGlzLl9kZWxheShmdW5jdGlvbigpe249PT10aGlzLmNvdW50ZXImJnRoaXMucmVmcmVzaFBvc2l0aW9ucyghcyl9KX0sX2NsZWFyOmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUsaSl7cmV0dXJuIGZ1bmN0aW9uKHMpe2kuX3RyaWdnZXIodCxzLGUuX3VpSGFzaChlKSl9fXRoaXMucmV2ZXJ0aW5nPSExO3ZhciBzLG49W107aWYoIXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbCx0aGlzLmhlbHBlclswXT09PXRoaXMuY3VycmVudEl0ZW1bMF0pe2ZvcihzIGluIHRoaXMuX3N0b3JlZENTUykoImF1dG8iPT09dGhpcy5fc3RvcmVkQ1NTW3NdfHwic3RhdGljIj09PXRoaXMuX3N0b3JlZENTU1tzXSkmJih0aGlzLl9zdG9yZWRDU1Nbc109IiIpO3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUyksdGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5jdXJyZW50SXRlbSwidWktc29ydGFibGUtaGVscGVyIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodGhpcy5mcm9tT3V0c2lkZSYmIWUmJm4ucHVzaChmdW5jdGlvbih0KXt0aGlzLl90cmlnZ2VyKCJyZWNlaXZlIix0LHRoaXMuX3VpSGFzaCh0aGlzLmZyb21PdXRzaWRlKSl9KSwhdGhpcy5mcm9tT3V0c2lkZSYmdGhpcy5kb21Qb3NpdGlvbi5wcmV2PT09dGhpcy5jdXJyZW50SXRlbS5wcmV2KCkubm90KCIudWktc29ydGFibGUtaGVscGVyIilbMF0mJnRoaXMuZG9tUG9zaXRpb24ucGFyZW50PT09dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXXx8ZXx8bi5wdXNoKGZ1bmN0aW9uKHQpe3RoaXMuX3RyaWdnZXIoInVwZGF0ZSIsdCx0aGlzLl91aUhhc2goKSl9KSx0aGlzIT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiYoZXx8KG4ucHVzaChmdW5jdGlvbih0KXt0aGlzLl90cmlnZ2VyKCJyZW1vdmUiLHQsdGhpcy5fdWlIYXNoKCkpfSksbi5wdXNoKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt0Ll90cmlnZ2VyKCJyZWNlaXZlIixlLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSksbi5wdXNoKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt0Ll90cmlnZ2VyKCJ1cGRhdGUiLGUsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmN1cnJlbnRDb250YWluZXIpKSkpLHM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO3M+PTA7cy0tKWV8fG4ucHVzaChpKCJkZWFjdGl2YXRlIix0aGlzLHRoaXMuY29udGFpbmVyc1tzXSkpLHRoaXMuY29udGFpbmVyc1tzXS5jb250YWluZXJDYWNoZS5vdmVyJiYobi5wdXNoKGkoIm91dCIsdGhpcyx0aGlzLmNvbnRhaW5lcnNbc10pKSx0aGlzLmNvbnRhaW5lcnNbc10uY29udGFpbmVyQ2FjaGUub3Zlcj0wKTtpZih0aGlzLnN0b3JlZEN1cnNvciYmKHRoaXMuZG9jdW1lbnQuZmluZCgiYm9keSIpLmNzcygiY3Vyc29yIix0aGlzLnN0b3JlZEN1cnNvciksdGhpcy5zdG9yZWRTdHlsZXNoZWV0LnJlbW92ZSgpKSx0aGlzLl9zdG9yZWRPcGFjaXR5JiZ0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLHRoaXMuX3N0b3JlZE9wYWNpdHkpLHRoaXMuX3N0b3JlZFpJbmRleCYmdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLCJhdXRvIj09PXRoaXMuX3N0b3JlZFpJbmRleD8iIjp0aGlzLl9zdG9yZWRaSW5kZXgpLHRoaXMuZHJhZ2dpbmc9ITEsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbHx8KHRoaXMuaGVscGVyWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksdGhpcy5oZWxwZXI9bnVsbCksIWUpe2ZvcihzPTA7bi5sZW5ndGg+cztzKyspbltzXS5jYWxsKHRoaXMsdCk7dGhpcy5fdHJpZ2dlcigic3RvcCIsdCx0aGlzLl91aUhhc2goKSl9cmV0dXJuIHRoaXMuZnJvbU91dHNpZGU9ITEsIXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbH0sX3RyaWdnZXI6ZnVuY3Rpb24oKXt0LldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpPT09ITEmJnRoaXMuY2FuY2VsKCl9LF91aUhhc2g6ZnVuY3Rpb24oZSl7dmFyIGk9ZXx8dGhpcztyZXR1cm57aGVscGVyOmkuaGVscGVyLHBsYWNlaG9sZGVyOmkucGxhY2Vob2xkZXJ8fHQoW10pLHBvc2l0aW9uOmkucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjppLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OmkucG9zaXRpb25BYnMsaXRlbTppLmN1cnJlbnRJdGVtLHNlbmRlcjplP2UuZWxlbWVudDpudWxsfX19KSx0LndpZGdldCgidWkuYWNjb3JkaW9uIix7dmVyc2lvbjoiMS4xMi4xIixvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlOnt9LGNsYXNzZXM6eyJ1aS1hY2NvcmRpb24taGVhZGVyIjoidWktY29ybmVyLXRvcCIsInVpLWFjY29yZGlvbi1oZWFkZXItY29sbGFwc2VkIjoidWktY29ybmVyLWFsbCIsInVpLWFjY29yZGlvbi1jb250ZW50IjoidWktY29ybmVyLWJvdHRvbSJ9LGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsaGVhZGVyOiI+IGxpID4gOmZpcnN0LWNoaWxkLCA+IDpub3QobGkpOmV2ZW4iLGhlaWdodFN0eWxlOiJhdXRvIixpY29uczp7YWN0aXZlSGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsaGVhZGVyOiJ1aS1pY29uLXRyaWFuZ2xlLTEtZSJ9LGFjdGl2YXRlOm51bGwsYmVmb3JlQWN0aXZhdGU6bnVsbH0saGlkZVByb3BzOntib3JkZXJUb3BXaWR0aDoiaGlkZSIsYm9yZGVyQm90dG9tV2lkdGg6ImhpZGUiLHBhZGRpbmdUb3A6ImhpZGUiLHBhZGRpbmdCb3R0b206ImhpZGUiLGhlaWdodDoiaGlkZSJ9LHNob3dQcm9wczp7Ym9yZGVyVG9wV2lkdGg6InNob3ciLGJvcmRlckJvdHRvbVdpZHRoOiJzaG93IixwYWRkaW5nVG9wOiJzaG93IixwYWRkaW5nQm90dG9tOiJzaG93IixoZWlnaHQ6InNob3cifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3RoaXMucHJldlNob3c9dGhpcy5wcmV2SGlkZT10KCksdGhpcy5fYWRkQ2xhc3MoInVpLWFjY29yZGlvbiIsInVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiKSx0aGlzLmVsZW1lbnQuYXR0cigicm9sZSIsInRhYmxpc3QiKSxlLmNvbGxhcHNpYmxlfHxlLmFjdGl2ZSE9PSExJiZudWxsIT1lLmFjdGl2ZXx8KGUuYWN0aXZlPTApLHRoaXMuX3Byb2Nlc3NQYW5lbHMoKSwwPmUuYWN0aXZlJiYoZS5hY3RpdmUrPXRoaXMuaGVhZGVycy5sZW5ndGgpLHRoaXMuX3JlZnJlc2goKX0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybntoZWFkZXI6dGhpcy5hY3RpdmUscGFuZWw6dGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuYWN0aXZlLm5leHQoKTp0KCl9fSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgZSxpLHM9dGhpcy5vcHRpb25zLmljb25zO3MmJihlPXQoIjxzcGFuPiIpLHRoaXMuX2FkZENsYXNzKGUsInVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIsInVpLWljb24gIitzLmhlYWRlciksZS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSxpPXRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiksdGhpcy5fcmVtb3ZlQ2xhc3MoaSxzLmhlYWRlcikuX2FkZENsYXNzKGksbnVsbCxzLmFjdGl2ZUhlYWRlcikuX2FkZENsYXNzKHRoaXMuaGVhZGVycywidWktYWNjb3JkaW9uLWljb25zIikpCn0sX2Rlc3Ryb3lJY29uczpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUNsYXNzKHRoaXMuaGVhZGVycywidWktYWNjb3JkaW9uLWljb25zIiksdGhpcy5oZWFkZXJzLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIHQ7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmhlYWRlcnMucmVtb3ZlQXR0cigicm9sZSBhcmlhLWV4cGFuZGVkIGFyaWEtc2VsZWN0ZWQgYXJpYS1jb250cm9scyB0YWJJbmRleCIpLnJlbW92ZVVuaXF1ZUlkKCksdGhpcy5fZGVzdHJveUljb25zKCksdD10aGlzLmhlYWRlcnMubmV4dCgpLmNzcygiZGlzcGxheSIsIiIpLnJlbW92ZUF0dHIoInJvbGUgYXJpYS1oaWRkZW4gYXJpYS1sYWJlbGxlZGJ5IikucmVtb3ZlVW5pcXVlSWQoKSwiY29udGVudCIhPT10aGlzLm9wdGlvbnMuaGVpZ2h0U3R5bGUmJnQuY3NzKCJoZWlnaHQiLCIiKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiJhY3RpdmUiPT09dD8odGhpcy5fYWN0aXZhdGUoZSksdm9pZCAwKTooImV2ZW50Ij09PXQmJih0aGlzLm9wdGlvbnMuZXZlbnQmJnRoaXMuX29mZih0aGlzLmhlYWRlcnMsdGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEV2ZW50cyhlKSksdGhpcy5fc3VwZXIodCxlKSwiY29sbGFwc2libGUiIT09dHx8ZXx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSwiaWNvbnMiPT09dCYmKHRoaXMuX2Rlc3Ryb3lJY29ucygpLGUmJnRoaXMuX2NyZWF0ZUljb25zKCkpLHZvaWQgMCl9LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fdG9nZ2xlQ2xhc3MobnVsbCwidWktc3RhdGUtZGlzYWJsZWQiLCEhdCksdGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKSxudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KX0sX2tleWRvd246ZnVuY3Rpb24oZSl7aWYoIWUuYWx0S2V5JiYhZS5jdHJsS2V5KXt2YXIgaT10LnVpLmtleUNvZGUscz10aGlzLmhlYWRlcnMubGVuZ3RoLG49dGhpcy5oZWFkZXJzLmluZGV4KGUudGFyZ2V0KSxvPSExO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgaS5SSUdIVDpjYXNlIGkuRE9XTjpvPXRoaXMuaGVhZGVyc1sobisxKSVzXTticmVhaztjYXNlIGkuTEVGVDpjYXNlIGkuVVA6bz10aGlzLmhlYWRlcnNbKG4tMStzKSVzXTticmVhaztjYXNlIGkuU1BBQ0U6Y2FzZSBpLkVOVEVSOnRoaXMuX2V2ZW50SGFuZGxlcihlKTticmVhaztjYXNlIGkuSE9NRTpvPXRoaXMuaGVhZGVyc1swXTticmVhaztjYXNlIGkuRU5EOm89dGhpcy5oZWFkZXJzW3MtMV19byYmKHQoZS50YXJnZXQpLmF0dHIoInRhYkluZGV4IiwtMSksdChvKS5hdHRyKCJ0YWJJbmRleCIsMCksdChvKS50cmlnZ2VyKCJmb2N1cyIpLGUucHJldmVudERlZmF1bHQoKSl9fSxfcGFuZWxLZXlEb3duOmZ1bmN0aW9uKGUpe2Uua2V5Q29kZT09PXQudWkua2V5Q29kZS5VUCYmZS5jdHJsS2V5JiZ0KGUuY3VycmVudFRhcmdldCkucHJldigpLnRyaWdnZXIoImZvY3VzIil9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnM7dGhpcy5fcHJvY2Vzc1BhbmVscygpLGUuYWN0aXZlPT09ITEmJmUuY29sbGFwc2libGU9PT0hMHx8IXRoaXMuaGVhZGVycy5sZW5ndGg/KGUuYWN0aXZlPSExLHRoaXMuYWN0aXZlPXQoKSk6ZS5hY3RpdmU9PT0hMT90aGlzLl9hY3RpdmF0ZSgwKTp0aGlzLmFjdGl2ZS5sZW5ndGgmJiF0LmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy5oZWFkZXJzLmxlbmd0aD09PXRoaXMuaGVhZGVycy5maW5kKCIudWktc3RhdGUtZGlzYWJsZWQiKS5sZW5ndGg/KGUuYWN0aXZlPSExLHRoaXMuYWN0aXZlPXQoKSk6dGhpcy5fYWN0aXZhdGUoTWF0aC5tYXgoMCxlLmFjdGl2ZS0xKSk6ZS5hY3RpdmU9dGhpcy5oZWFkZXJzLmluZGV4KHRoaXMuYWN0aXZlKSx0aGlzLl9kZXN0cm95SWNvbnMoKSx0aGlzLl9yZWZyZXNoKCl9LF9wcm9jZXNzUGFuZWxzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oZWFkZXJzLGU9dGhpcy5wYW5lbHM7dGhpcy5oZWFkZXJzPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5oZWFkZXIpLHRoaXMuX2FkZENsYXNzKHRoaXMuaGVhZGVycywidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24taGVhZGVyLWNvbGxhcHNlZCIsInVpLXN0YXRlLWRlZmF1bHQiKSx0aGlzLnBhbmVscz10aGlzLmhlYWRlcnMubmV4dCgpLmZpbHRlcigiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlKSIpLmhpZGUoKSx0aGlzLl9hZGRDbGFzcyh0aGlzLnBhbmVscywidWktYWNjb3JkaW9uLWNvbnRlbnQiLCJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQiKSxlJiYodGhpcy5fb2ZmKHQubm90KHRoaXMuaGVhZGVycykpLHRoaXMuX29mZihlLm5vdCh0aGlzLnBhbmVscykpKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZSxpPXRoaXMub3B0aW9ucyxzPWkuaGVpZ2h0U3R5bGUsbj10aGlzLmVsZW1lbnQucGFyZW50KCk7dGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZShpLmFjdGl2ZSksdGhpcy5fYWRkQ2xhc3ModGhpcy5hY3RpdmUsInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIiwidWktc3RhdGUtYWN0aXZlIikuX3JlbW92ZUNsYXNzKHRoaXMuYWN0aXZlLCJ1aS1hY2NvcmRpb24taGVhZGVyLWNvbGxhcHNlZCIpLHRoaXMuX2FkZENsYXNzKHRoaXMuYWN0aXZlLm5leHQoKSwidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiksdGhpcy5hY3RpdmUubmV4dCgpLnNob3coKSx0aGlzLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLGk9ZS51bmlxdWVJZCgpLmF0dHIoImlkIikscz1lLm5leHQoKSxuPXMudW5pcXVlSWQoKS5hdHRyKCJpZCIpO2UuYXR0cigiYXJpYS1jb250cm9scyIsbikscy5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLGkpfSkubmV4dCgpLmF0dHIoInJvbGUiLCJ0YWJwYW5lbCIpLHRoaXMuaGVhZGVycy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmF0dHIoeyJhcmlhLWhpZGRlbiI6InRydWUifSkuaGlkZSgpLHRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLm5leHQoKS5hdHRyKHsiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KTp0aGlzLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLHRoaXMuX2NyZWF0ZUljb25zKCksdGhpcy5fc2V0dXBFdmVudHMoaS5ldmVudCksImZpbGwiPT09cz8oZT1uLmhlaWdodCgpLHRoaXMuZWxlbWVudC5zaWJsaW5ncygiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKSxzPWkuY3NzKCJwb3NpdGlvbiIpOyJhYnNvbHV0ZSIhPT1zJiYiZml4ZWQiIT09cyYmKGUtPWkub3V0ZXJIZWlnaHQoITApKX0pLHRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKCl7ZS09dCh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmhlaWdodChNYXRoLm1heCgwLGUtdCh0aGlzKS5pbm5lckhlaWdodCgpK3QodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOiJhdXRvIj09PXMmJihlPTAsdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dCh0aGlzKS5pcygiOnZpc2libGUiKTtpfHx0KHRoaXMpLnNob3coKSxlPU1hdGgubWF4KGUsdCh0aGlzKS5jc3MoImhlaWdodCIsIiIpLmhlaWdodCgpKSxpfHx0KHRoaXMpLmhpZGUoKX0pLmhlaWdodChlKSl9LF9hY3RpdmF0ZTpmdW5jdGlvbihlKXt2YXIgaT10aGlzLl9maW5kQWN0aXZlKGUpWzBdO2khPT10aGlzLmFjdGl2ZVswXSYmKGk9aXx8dGhpcy5hY3RpdmVbMF0sdGhpcy5fZXZlbnRIYW5kbGVyKHt0YXJnZXQ6aSxjdXJyZW50VGFyZ2V0OmkscHJldmVudERlZmF1bHQ6dC5ub29wfSkpfSxfZmluZEFjdGl2ZTpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5oZWFkZXJzLmVxKGUpOnQoKX0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKGUpe3ZhciBpPXtrZXlkb3duOiJfa2V5ZG93biJ9O2UmJnQuZWFjaChlLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtpW2VdPSJfZXZlbnRIYW5kbGVyIn0pLHRoaXMuX29mZih0aGlzLmhlYWRlcnMuYWRkKHRoaXMuaGVhZGVycy5uZXh0KCkpKSx0aGlzLl9vbih0aGlzLmhlYWRlcnMsaSksdGhpcy5fb24odGhpcy5oZWFkZXJzLm5leHQoKSx7a2V5ZG93bjoiX3BhbmVsS2V5RG93biJ9KSx0aGlzLl9ob3ZlcmFibGUodGhpcy5oZWFkZXJzKSx0aGlzLl9mb2N1c2FibGUodGhpcy5oZWFkZXJzKX0sX2V2ZW50SGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgaSxzLG49dGhpcy5vcHRpb25zLG89dGhpcy5hY3RpdmUsYT10KGUuY3VycmVudFRhcmdldCkscj1hWzBdPT09b1swXSxoPXImJm4uY29sbGFwc2libGUsbD1oP3QoKTphLm5leHQoKSxjPW8ubmV4dCgpLHU9e29sZEhlYWRlcjpvLG9sZFBhbmVsOmMsbmV3SGVhZGVyOmg/dCgpOmEsbmV3UGFuZWw6bH07ZS5wcmV2ZW50RGVmYXVsdCgpLHImJiFuLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsZSx1KT09PSExfHwobi5hY3RpdmU9aD8hMTp0aGlzLmhlYWRlcnMuaW5kZXgoYSksdGhpcy5hY3RpdmU9cj90KCk6YSx0aGlzLl90b2dnbGUodSksdGhpcy5fcmVtb3ZlQ2xhc3MobywidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUiLCJ1aS1zdGF0ZS1hY3RpdmUiKSxuLmljb25zJiYoaT1vLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiksdGhpcy5fcmVtb3ZlQ2xhc3MoaSxudWxsLG4uaWNvbnMuYWN0aXZlSGVhZGVyKS5fYWRkQ2xhc3MoaSxudWxsLG4uaWNvbnMuaGVhZGVyKSkscnx8KHRoaXMuX3JlbW92ZUNsYXNzKGEsInVpLWFjY29yZGlvbi1oZWFkZXItY29sbGFwc2VkIikuX2FkZENsYXNzKGEsInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIiwidWktc3RhdGUtYWN0aXZlIiksbi5pY29ucyYmKHM9YS5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLHRoaXMuX3JlbW92ZUNsYXNzKHMsbnVsbCxuLmljb25zLmhlYWRlcikuX2FkZENsYXNzKHMsbnVsbCxuLmljb25zLmFjdGl2ZUhlYWRlcikpLHRoaXMuX2FkZENsYXNzKGEubmV4dCgpLCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSkpfSxfdG9nZ2xlOmZ1bmN0aW9uKGUpe3ZhciBpPWUubmV3UGFuZWwscz10aGlzLnByZXZTaG93Lmxlbmd0aD90aGlzLnByZXZTaG93OmUub2xkUGFuZWw7dGhpcy5wcmV2U2hvdy5hZGQodGhpcy5wcmV2SGlkZSkuc3RvcCghMCwhMCksdGhpcy5wcmV2U2hvdz1pLHRoaXMucHJldkhpZGU9cyx0aGlzLm9wdGlvbnMuYW5pbWF0ZT90aGlzLl9hbmltYXRlKGkscyxlKToocy5oaWRlKCksaS5zaG93KCksdGhpcy5fdG9nZ2xlQ29tcGxldGUoZSkpLHMuYXR0cih7ImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSxzLnByZXYoKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6ImZhbHNlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLGkubGVuZ3RoJiZzLmxlbmd0aD9zLnByZXYoKS5hdHRyKHt0YWJJbmRleDotMSwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pOmkubGVuZ3RoJiZ0aGlzLmhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1wYXJzZUludCh0KHRoaXMpLmF0dHIoInRhYkluZGV4IiksMTApfSkuYXR0cigidGFiSW5kZXgiLC0xKSxpLmF0dHIoImFyaWEtaGlkZGVuIiwiZmFsc2UiKS5wcmV2KCkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6InRydWUiLHRhYkluZGV4OjB9KX0sX2FuaW1hdGU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzLG4sbyxhPXRoaXMscj0wLGg9dC5jc3MoImJveC1zaXppbmciKSxsPXQubGVuZ3RoJiYoIWUubGVuZ3RofHx0LmluZGV4KCk8ZS5pbmRleCgpKSxjPXRoaXMub3B0aW9ucy5hbmltYXRlfHx7fSx1PWwmJmMuZG93bnx8YyxkPWZ1bmN0aW9uKCl7YS5fdG9nZ2xlQ29tcGxldGUoaSl9O3JldHVybiJudW1iZXIiPT10eXBlb2YgdSYmKG89dSksInN0cmluZyI9PXR5cGVvZiB1JiYobj11KSxuPW58fHUuZWFzaW5nfHxjLmVhc2luZyxvPW98fHUuZHVyYXRpb258fGMuZHVyYXRpb24sZS5sZW5ndGg/dC5sZW5ndGg/KHM9dC5zaG93KCkub3V0ZXJIZWlnaHQoKSxlLmFuaW1hdGUodGhpcy5oaWRlUHJvcHMse2R1cmF0aW9uOm8sZWFzaW5nOm4sc3RlcDpmdW5jdGlvbih0LGUpe2Uubm93PU1hdGgucm91bmQodCl9fSksdC5oaWRlKCkuYW5pbWF0ZSh0aGlzLnNob3dQcm9wcyx7ZHVyYXRpb246byxlYXNpbmc6bixjb21wbGV0ZTpkLHN0ZXA6ZnVuY3Rpb24odCxpKXtpLm5vdz1NYXRoLnJvdW5kKHQpLCJoZWlnaHQiIT09aS5wcm9wPyJjb250ZW50LWJveCI9PT1oJiYocis9aS5ub3cpOiJjb250ZW50IiE9PWEub3B0aW9ucy5oZWlnaHRTdHlsZSYmKGkubm93PU1hdGgucm91bmQocy1lLm91dGVySGVpZ2h0KCktcikscj0wKX19KSx2b2lkIDApOmUuYW5pbWF0ZSh0aGlzLmhpZGVQcm9wcyxvLG4sZCk6dC5hbmltYXRlKHRoaXMuc2hvd1Byb3BzLG8sbixkKX0sX3RvZ2dsZUNvbXBsZXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXQub2xkUGFuZWwsaT1lLnByZXYoKTt0aGlzLl9yZW1vdmVDbGFzcyhlLCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSx0aGlzLl9yZW1vdmVDbGFzcyhpLCJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSIpLl9hZGRDbGFzcyhpLCJ1aS1hY2NvcmRpb24taGVhZGVyLWNvbGxhcHNlZCIpLGUubGVuZ3RoJiYoZS5wYXJlbnQoKVswXS5jbGFzc05hbWU9ZS5wYXJlbnQoKVswXS5jbGFzc05hbWUpLHRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixudWxsLHQpfX0pLHQud2lkZ2V0KCJ1aS5tZW51Iix7dmVyc2lvbjoiMS4xMi4xIixkZWZhdWx0RWxlbWVudDoiPHVsPiIsZGVsYXk6MzAwLG9wdGlvbnM6e2ljb25zOntzdWJtZW51OiJ1aS1pY29uLWNhcmV0LTEtZSJ9LGl0ZW1zOiI+ICoiLG1lbnVzOiJ1bCIscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6InJpZ2h0IHRvcCJ9LHJvbGU6Im1lbnUiLGJsdXI6bnVsbCxmb2N1czpudWxsLHNlbGVjdDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmVNZW51PXRoaXMuZWxlbWVudCx0aGlzLm1vdXNlSGFuZGxlZD0hMSx0aGlzLmVsZW1lbnQudW5pcXVlSWQoKS5hdHRyKHtyb2xlOnRoaXMub3B0aW9ucy5yb2xlLHRhYkluZGV4OjB9KSx0aGlzLl9hZGRDbGFzcygidWktbWVudSIsInVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLHRoaXMuX29uKHsibW91c2Vkb3duIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKX0sImNsaWNrIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKGUpe3ZhciBpPXQoZS50YXJnZXQpLHM9dCh0LnVpLnNhZmVBY3RpdmVFbGVtZW50KHRoaXMuZG9jdW1lbnRbMF0pKTshdGhpcy5tb3VzZUhhbmRsZWQmJmkubm90KCIudWktc3RhdGUtZGlzYWJsZWQiKS5sZW5ndGgmJih0aGlzLnNlbGVjdChlKSxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCl8fCh0aGlzLm1vdXNlSGFuZGxlZD0hMCksaS5oYXMoIi51aS1tZW51IikubGVuZ3RoP3RoaXMuZXhwYW5kKGUpOiF0aGlzLmVsZW1lbnQuaXMoIjpmb2N1cyIpJiZzLmNsb3Nlc3QoIi51aS1tZW51IikubGVuZ3RoJiYodGhpcy5lbGVtZW50LnRyaWdnZXIoImZvY3VzIixbITBdKSx0aGlzLmFjdGl2ZSYmMT09PXRoaXMuYWN0aXZlLnBhcmVudHMoIi51aS1tZW51IikubGVuZ3RoJiZjbGVhclRpbWVvdXQodGhpcy50aW1lcikpKX0sIm1vdXNlZW50ZXIgLnVpLW1lbnUtaXRlbSI6ZnVuY3Rpb24oZSl7aWYoIXRoaXMucHJldmlvdXNGaWx0ZXIpe3ZhciBpPXQoZS50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKSxzPXQoZS5jdXJyZW50VGFyZ2V0KTtpWzBdPT09c1swXSYmKHRoaXMuX3JlbW92ZUNsYXNzKHMuc2libGluZ3MoKS5jaGlsZHJlbigiLnVpLXN0YXRlLWFjdGl2ZSIpLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuZm9jdXMoZSxzKSl9fSxtb3VzZWxlYXZlOiJjb2xsYXBzZUFsbCIsIm1vdXNlbGVhdmUgLnVpLW1lbnUiOiJjb2xsYXBzZUFsbCIsZm9jdXM6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmFjdGl2ZXx8dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5lcSgwKTtlfHx0aGlzLmZvY3VzKHQsaSl9LGJsdXI6ZnVuY3Rpb24oZSl7dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgaT0hdC5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdC51aS5zYWZlQWN0aXZlRWxlbWVudCh0aGlzLmRvY3VtZW50WzBdKSk7aSYmdGhpcy5jb2xsYXBzZUFsbChlKX0pfSxrZXlkb3duOiJfa2V5ZG93biJ9KSx0aGlzLnJlZnJlc2goKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHtjbGljazpmdW5jdGlvbih0KXt0aGlzLl9jbG9zZU9uRG9jdW1lbnRDbGljayh0KSYmdGhpcy5jb2xsYXBzZUFsbCh0KSx0aGlzLm1vdXNlSGFuZGxlZD0hMX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtaXRlbSIpLnJlbW92ZUF0dHIoInJvbGUgYXJpYS1kaXNhYmxlZCIpLGk9ZS5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbS13cmFwcGVyIikucmVtb3ZlVW5pcXVlSWQoKS5yZW1vdmVBdHRyKCJ0YWJJbmRleCByb2xlIGFyaWEtaGFzcG9wdXAiKTt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IikuZmluZCgiLnVpLW1lbnUiKS5hZGRCYWNrKCkucmVtb3ZlQXR0cigicm9sZSBhcmlhLWxhYmVsbGVkYnkgYXJpYS1leHBhbmRlZCBhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKS5zaG93KCksaS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO2UuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmV0IikmJmUucmVtb3ZlKCl9KX0sX2tleWRvd246ZnVuY3Rpb24oZSl7dmFyIGkscyxuLG8sYT0hMDtzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIHQudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMucHJldmlvdXNQYWdlKGUpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLlBBR0VfRE9XTjp0aGlzLm5leHRQYWdlKGUpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLkhPTUU6dGhpcy5fbW92ZSgiZmlyc3QiLCJmaXJzdCIsZSk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoImxhc3QiLCJsYXN0IixlKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5VUDp0aGlzLnByZXZpb3VzKGUpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLkRPV046dGhpcy5uZXh0KGUpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLkxFRlQ6dGhpcy5jb2xsYXBzZShlKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5SSUdIVDp0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5leHBhbmQoZSk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRU5URVI6Y2FzZSB0LnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUoZSk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UoZSk7YnJlYWs7ZGVmYXVsdDphPSExLHM9dGhpcy5wcmV2aW91c0ZpbHRlcnx8IiIsbz0hMSxuPWUua2V5Q29kZT49OTYmJjEwNT49ZS5rZXlDb2RlPyIiKyhlLmtleUNvZGUtOTYpOlN0cmluZy5mcm9tQ2hhckNvZGUoZS5rZXlDb2RlKSxjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJUaW1lciksbj09PXM/bz0hMDpuPXMrbixpPXRoaXMuX2ZpbHRlck1lbnVJdGVtcyhuKSxpPW8mJi0xIT09aS5pbmRleCh0aGlzLmFjdGl2ZS5uZXh0KCkpP3RoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKTppLGkubGVuZ3RofHwobj1TdHJpbmcuZnJvbUNoYXJDb2RlKGUua2V5Q29kZSksaT10aGlzLl9maWx0ZXJNZW51SXRlbXMobikpLGkubGVuZ3RoPyh0aGlzLmZvY3VzKGUsaSksdGhpcy5wcmV2aW91c0ZpbHRlcj1uLHRoaXMuZmlsdGVyVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcn0sMWUzKSk6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9YSYmZS5wcmV2ZW50RGVmYXVsdCgpfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJih0aGlzLmFjdGl2ZS5jaGlsZHJlbigiW2FyaWEtaGFzcG9wdXA9J3RydWUnXSIpLmxlbmd0aD90aGlzLmV4cGFuZCh0KTp0aGlzLnNlbGVjdCh0KSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZSxpLHMsbixvLGE9dGhpcyxyPXRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LGg9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLm1lbnVzKTt0aGlzLl90b2dnbGVDbGFzcygidWktbWVudS1pY29ucyIsbnVsbCwhIXRoaXMuZWxlbWVudC5maW5kKCIudWktaWNvbiIpLmxlbmd0aCkscz1oLmZpbHRlcigiOm5vdCgudWktbWVudSkiKS5oaWRlKCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSwiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLGk9ZS5wcmV2KCkscz10KCI8c3Bhbj4iKS5kYXRhKCJ1aS1tZW51LXN1Ym1lbnUtY2FyZXQiLCEwKTthLl9hZGRDbGFzcyhzLCJ1aS1tZW51LWljb24iLCJ1aS1pY29uICIrciksaS5hdHRyKCJhcmlhLWhhc3BvcHVwIiwidHJ1ZSIpLnByZXBlbmQocyksZS5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLGkuYXR0cigiaWQiKSl9KSx0aGlzLl9hZGRDbGFzcyhzLCJ1aS1tZW51IiwidWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWZyb250IiksZT1oLmFkZCh0aGlzLmVsZW1lbnQpLGk9ZS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcyksaS5ub3QoIi51aS1tZW51LWl0ZW0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTthLl9pc0RpdmlkZXIoZSkmJmEuX2FkZENsYXNzKGUsInVpLW1lbnUtZGl2aWRlciIsInVpLXdpZGdldC1jb250ZW50Iil9KSxuPWkubm90KCIudWktbWVudS1pdGVtLCAudWktbWVudS1kaXZpZGVyIiksbz1uLmNoaWxkcmVuKCkubm90KCIudWktbWVudSIpLnVuaXF1ZUlkKCkuYXR0cih7dGFiSW5kZXg6LTEscm9sZTp0aGlzLl9pdGVtUm9sZSgpfSksdGhpcy5fYWRkQ2xhc3MobiwidWktbWVudS1pdGVtIikuX2FkZENsYXNzKG8sInVpLW1lbnUtaXRlbS13cmFwcGVyIiksaS5maWx0ZXIoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5hY3RpdmUmJiF0LmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmFjdGl2ZVswXSkmJnRoaXMuYmx1cigpfSxfaXRlbVJvbGU6ZnVuY3Rpb24oKXtyZXR1cm57bWVudToibWVudWl0ZW0iLGxpc3Rib3g6Im9wdGlvbiJ9W3RoaXMub3B0aW9ucy5yb2xlXX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe2lmKCJpY29ucyI9PT10KXt2YXIgaT10aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtaWNvbiIpO3RoaXMuX3JlbW92ZUNsYXNzKGksbnVsbCx0aGlzLm9wdGlvbnMuaWNvbnMuc3VibWVudSkuX2FkZENsYXNzKGksbnVsbCxlLnN1Ym1lbnUpfXRoaXMuX3N1cGVyKHQsZSl9LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCsiIiksdGhpcy5fdG9nZ2xlQ2xhc3MobnVsbCwidWktc3RhdGUtZGlzYWJsZWQiLCEhdCl9LGZvY3VzOmZ1bmN0aW9uKHQsZSl7dmFyIGkscyxuO3RoaXMuYmx1cih0LHQmJiJmb2N1cyI9PT10LnR5cGUpLHRoaXMuX3Njcm9sbEludG9WaWV3KGUpLHRoaXMuYWN0aXZlPWUuZmlyc3QoKSxzPXRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktbWVudS1pdGVtLXdyYXBwZXIiKSx0aGlzLl9hZGRDbGFzcyhzLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMub3B0aW9ucy5yb2xlJiZ0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IixzLmF0dHIoImlkIikpLG49dGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmNoaWxkcmVuKCIudWktbWVudS1pdGVtLXdyYXBwZXIiKSx0aGlzLl9hZGRDbGFzcyhuLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHQmJiJrZXlkb3duIj09PXQudHlwZT90aGlzLl9jbG9zZSgpOnRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpfSx0aGlzLmRlbGF5KSxpPWUuY2hpbGRyZW4oIi51aS1tZW51IiksaS5sZW5ndGgmJnQmJi9ebW91c2UvLnRlc3QodC50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKGkpLHRoaXMuYWN0aXZlTWVudT1lLnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIix0LHtpdGVtOmV9KX0sX3Njcm9sbEludG9WaWV3OmZ1bmN0aW9uKGUpe3ZhciBpLHMsbixvLGEscjt0aGlzLl9oYXNTY3JvbGwoKSYmKGk9cGFyc2VGbG9hdCh0LmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHM9cGFyc2VGbG9hdCh0LmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sInBhZGRpbmdUb3AiKSl8fDAsbj1lLm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLWktcyxvPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxhPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSxyPWUub3V0ZXJIZWlnaHQoKSwwPm4/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChvK24pOm4rcj5hJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKG8rbi1hK3IpKX0sYmx1cjpmdW5jdGlvbih0LGUpe2V8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmFjdGl2ZSYmKHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktbWVudS1pdGVtLXdyYXBwZXIiKSxudWxsLCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLl90cmlnZ2VyKCJibHVyIix0LHtpdGVtOnRoaXMuYWN0aXZlfSksdGhpcy5hY3RpdmU9bnVsbCl9LF9zdGFydE9wZW5pbmc6ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLCJ0cnVlIj09PXQuYXR0cigiYXJpYS1oaWRkZW4iKSYmKHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpLHRoaXMuX29wZW4odCl9LHRoaXMuZGVsYXkpKX0sX29wZW46ZnVuY3Rpb24oZSl7dmFyIGk9dC5leHRlbmQoe29mOnRoaXMuYWN0aXZlfSx0aGlzLm9wdGlvbnMucG9zaXRpb24pO2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUiKS5ub3QoZS5wYXJlbnRzKCIudWktbWVudSIpKS5oaWRlKCkuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIiksZS5zaG93KCkucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLnBvc2l0aW9uKGkpfSxjb2xsYXBzZUFsbDpmdW5jdGlvbihlLGkpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dmFyIHM9aT90aGlzLmVsZW1lbnQ6dChlJiZlLnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUiKSk7cy5sZW5ndGh8fChzPXRoaXMuZWxlbWVudCksdGhpcy5fY2xvc2UocyksdGhpcy5ibHVyKGUpLHRoaXMuX3JlbW92ZUNsYXNzKHMuZmluZCgiLnVpLXN0YXRlLWFjdGl2ZSIpLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuYWN0aXZlTWVudT1zfSx0aGlzLmRlbGF5KX0sX2Nsb3NlOmZ1bmN0aW9uKHQpe3R8fCh0PXRoaXMuYWN0aXZlP3RoaXMuYWN0aXZlLnBhcmVudCgpOnRoaXMuZWxlbWVudCksdC5maW5kKCIudWktbWVudSIpLmhpZGUoKS5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKX0sX2Nsb3NlT25Eb2N1bWVudENsaWNrOmZ1bmN0aW9uKGUpe3JldHVybiF0KGUudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aH0sX2lzRGl2aWRlcjpmdW5jdGlvbih0KXtyZXR1cm4hL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QodC50ZXh0KCkpfSxjb2xsYXBzZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIsdGhpcy5lbGVtZW50KTtlJiZlLmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyh0LGUpKX0sZXhwYW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLW1lbnUgIikuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpcnN0KCk7ZSYmZS5sZW5ndGgmJih0aGlzLl9vcGVuKGUucGFyZW50KCkpLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5mb2N1cyh0LGUpfSkpfSxuZXh0OmZ1bmN0aW9uKHQpe3RoaXMuX21vdmUoIm5leHQiLCJmaXJzdCIsdCl9LHByZXZpb3VzOmZ1bmN0aW9uKHQpe3RoaXMuX21vdmUoInByZXYiLCJsYXN0Iix0KX0saXNGaXJzdEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sX21vdmU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzO3RoaXMuYWN0aXZlJiYocz0iZmlyc3QiPT09dHx8Imxhc3QiPT09dD90aGlzLmFjdGl2ZVsiZmlyc3QiPT09dD8icHJldkFsbCI6Im5leHRBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKC0xKTp0aGlzLmFjdGl2ZVt0KyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApKSxzJiZzLmxlbmd0aCYmdGhpcy5hY3RpdmV8fChzPXRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbZV0oKSksdGhpcy5mb2N1cyhpLHMpfSxuZXh0UGFnZTpmdW5jdGlvbihlKXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzTGFzdEl0ZW0oKXx8KHRoaXMuX2hhc1Njcm9sbCgpPyhzPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxuPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBpPXQodGhpcyksMD5pLm9mZnNldCgpLnRvcC1zLW59KSx0aGlzLmZvY3VzKGUsaSkpOnRoaXMuZm9jdXMoZSx0aGlzLmFjdGl2ZU1lbnUuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpW3RoaXMuYWN0aXZlPyJsYXN0IjoiZmlyc3QiXSgpKSksdm9pZCAwKToodGhpcy5uZXh0KGUpLHZvaWQgMCl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbihlKXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzRmlyc3RJdGVtKCl8fCh0aGlzLl9oYXNTY3JvbGwoKT8ocz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3Asbj10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gaT10KHRoaXMpLGkub2Zmc2V0KCkudG9wLXMrbj4wfSksdGhpcy5mb2N1cyhlLGkpKTp0aGlzLmZvY3VzKGUsdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maXJzdCgpKSksdm9pZCAwKToodGhpcy5uZXh0KGUpLHZvaWQgMCl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk8dGhpcy5lbGVtZW50LnByb3AoInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24oZSl7dGhpcy5hY3RpdmU9dGhpcy5hY3RpdmV8fHQoZS50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTt2YXIgaT17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKCIudWktbWVudSIpLmxlbmd0aHx8dGhpcy5jb2xsYXBzZUFsbChlLCEwKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLGUsaSl9LF9maWx0ZXJNZW51SXRlbXM6ZnVuY3Rpb24oZSl7dmFyIGk9ZS5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIikscz1SZWdFeHAoIl4iK2ksImkiKTtyZXR1cm4gdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gcy50ZXN0KHQudHJpbSh0KHRoaXMpLmNoaWxkcmVuKCIudWktbWVudS1pdGVtLXdyYXBwZXIiKS50ZXh0KCkpKX0pfX0pLHQud2lkZ2V0KCJ1aS5hdXRvY29tcGxldGUiLHt2ZXJzaW9uOiIxLjEyLjEiLGRlZmF1bHRFbGVtZW50OiI8aW5wdXQ+IixvcHRpb25zOnthcHBlbmRUbzpudWxsLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbCxjaGFuZ2U6bnVsbCxjbG9zZTpudWxsLGZvY3VzOm51bGwsb3BlbjpudWxsLHJlc3BvbnNlOm51bGwsc2VhcmNoOm51bGwsc2VsZWN0Om51bGx9LHJlcXVlc3RJbmRleDowLHBlbmRpbmc6MCxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGUsaSxzLG49dGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbz0idGV4dGFyZWEiPT09bixhPSJpbnB1dCI9PT1uO3RoaXMuaXNNdWx0aUxpbmU9b3x8IWEmJnRoaXMuX2lzQ29udGVudEVkaXRhYmxlKHRoaXMuZWxlbWVudCksdGhpcy52YWx1ZU1ldGhvZD10aGlzLmVsZW1lbnRbb3x8YT8idmFsIjoidGV4dCJdLHRoaXMuaXNOZXdNZW51PSEwLHRoaXMuX2FkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKSx0aGlzLmVsZW1lbnQuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIiksdGhpcy5fb24odGhpcy5lbGVtZW50LHtrZXlkb3duOmZ1bmN0aW9uKG4pe2lmKHRoaXMuZWxlbWVudC5wcm9wKCJyZWFkT25seSIpKXJldHVybiBlPSEwLHM9ITAsaT0hMCx2b2lkIDA7ZT0hMSxzPSExLGk9ITE7dmFyIG89dC51aS5rZXlDb2RlO3N3aXRjaChuLmtleUNvZGUpe2Nhc2Ugby5QQUdFX1VQOmU9ITAsdGhpcy5fbW92ZSgicHJldmlvdXNQYWdlIixuKTticmVhaztjYXNlIG8uUEFHRV9ET1dOOmU9ITAsdGhpcy5fbW92ZSgibmV4dFBhZ2UiLG4pO2JyZWFrO2Nhc2Ugby5VUDplPSEwLHRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIsbik7YnJlYWs7Y2FzZSBvLkRPV046ZT0hMCx0aGlzLl9rZXlFdmVudCgibmV4dCIsbik7YnJlYWs7Y2FzZSBvLkVOVEVSOnRoaXMubWVudS5hY3RpdmUmJihlPSEwLG4ucHJldmVudERlZmF1bHQoKSx0aGlzLm1lbnUuc2VsZWN0KG4pKTticmVhaztjYXNlIG8uVEFCOnRoaXMubWVudS5hY3RpdmUmJnRoaXMubWVudS5zZWxlY3Qobik7YnJlYWs7Y2FzZSBvLkVTQ0FQRTp0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMuaXNNdWx0aUxpbmV8fHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5jbG9zZShuKSxuLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6aT0hMCx0aGlzLl9zZWFyY2hUaW1lb3V0KG4pfX0sa2V5cHJlc3M6ZnVuY3Rpb24ocyl7aWYoZSlyZXR1cm4gZT0hMSwoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKSYmcy5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMDtpZighaSl7dmFyIG49dC51aS5rZXlDb2RlO3N3aXRjaChzLmtleUNvZGUpe2Nhc2Ugbi5QQUdFX1VQOnRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIscyk7YnJlYWs7Y2FzZSBuLlBBR0VfRE9XTjp0aGlzLl9tb3ZlKCJuZXh0UGFnZSIscyk7YnJlYWs7Y2FzZSBuLlVQOnRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIscyk7YnJlYWs7Y2FzZSBuLkRPV046dGhpcy5fa2V5RXZlbnQoIm5leHQiLHMpfX19LGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBzPyhzPSExLHQucHJldmVudERlZmF1bHQoKSx2b2lkIDApOih0aGlzLl9zZWFyY2hUaW1lb3V0KHQpLHZvaWQgMCl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnByZXZpb3VzPXRoaXMuX3ZhbHVlKCl9LGJsdXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2FuY2VsQmx1cj8oZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix2b2lkIDApOihjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuY2xvc2UodCksdGhpcy5fY2hhbmdlKHQpLHZvaWQgMCl9fSksdGhpcy5faW5pdFNvdXJjZSgpLHRoaXMubWVudT10KCI8dWw+IikuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSkubWVudSh7cm9sZTpudWxsfSkuaGlkZSgpLm1lbnUoImluc3RhbmNlIiksdGhpcy5fYWRkQ2xhc3ModGhpcy5tZW51LmVsZW1lbnQsInVpLWF1dG9jb21wbGV0ZSIsInVpLWZyb250IiksdGhpcy5fb24odGhpcy5tZW51LmVsZW1lbnQse21vdXNlZG93bjpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksdGhpcy5jYW5jZWxCbHVyPSEwLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix0aGlzLmVsZW1lbnRbMF0hPT10LnVpLnNhZmVBY3RpdmVFbGVtZW50KHRoaXMuZG9jdW1lbnRbMF0pJiZ0aGlzLmVsZW1lbnQudHJpZ2dlcigiZm9jdXMiKX0pfSxtZW51Zm9jdXM6ZnVuY3Rpb24oZSxpKXt2YXIgcyxuO3JldHVybiB0aGlzLmlzTmV3TWVudSYmKHRoaXMuaXNOZXdNZW51PSExLGUub3JpZ2luYWxFdmVudCYmL15tb3VzZS8udGVzdChlLm9yaWdpbmFsRXZlbnQudHlwZSkpPyh0aGlzLm1lbnUuYmx1cigpLHRoaXMuZG9jdW1lbnQub25lKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKCl7dChlLnRhcmdldCkudHJpZ2dlcihlLm9yaWdpbmFsRXZlbnQpfSksdm9pZCAwKToobj1pLml0ZW0uZGF0YSgidWktYXV0b2NvbXBsZXRlLWl0ZW0iKSwhMSE9PXRoaXMuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOm59KSYmZS5vcmlnaW5hbEV2ZW50JiYvXmtleS8udGVzdChlLm9yaWdpbmFsRXZlbnQudHlwZSkmJnRoaXMuX3ZhbHVlKG4udmFsdWUpLHM9aS5pdGVtLmF0dHIoImFyaWEtbGFiZWwiKXx8bi52YWx1ZSxzJiZ0LnRyaW0ocykubGVuZ3RoJiYodGhpcy5saXZlUmVnaW9uLmNoaWxkcmVuKCkuaGlkZSgpLHQoIjxkaXY+IikudGV4dChzKS5hcHBlbmRUbyh0aGlzLmxpdmVSZWdpb24pKSx2b2lkIDApfSxtZW51c2VsZWN0OmZ1bmN0aW9uKGUsaSl7dmFyIHM9aS5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIiksbj10aGlzLnByZXZpb3VzO3RoaXMuZWxlbWVudFswXSE9PXQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSkmJih0aGlzLmVsZW1lbnQudHJpZ2dlcigiZm9jdXMiKSx0aGlzLnByZXZpb3VzPW4sdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPW4sdGhpcy5zZWxlY3RlZEl0ZW09c30pKSwhMSE9PXRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTpzfSkmJnRoaXMuX3ZhbHVlKHMudmFsdWUpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLHRoaXMuY2xvc2UoZSksdGhpcy5zZWxlY3RlZEl0ZW09c319KSx0aGlzLmxpdmVSZWdpb249dCgiPGRpdj4iLHtyb2xlOiJzdGF0dXMiLCJhcmlhLWxpdmUiOiJhc3NlcnRpdmUiLCJhcmlhLXJlbGV2YW50IjoiYWRkaXRpb25zIn0pLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksdGhpcy5fYWRkQ2xhc3ModGhpcy5saXZlUmVnaW9uLG51bGwsInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuX29uKHRoaXMud2luZG93LHtiZWZvcmV1bmxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIil9fSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoaW5nKSx0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksdGhpcy5saXZlUmVnaW9uLnJlbW92ZSgpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsZSl7dGhpcy5fc3VwZXIodCxlKSwic291cmNlIj09PXQmJnRoaXMuX2luaXRTb3VyY2UoKSwiYXBwZW5kVG8iPT09dCYmdGhpcy5tZW51LmVsZW1lbnQuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksImRpc2FibGVkIj09PXQmJmUmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfaXNFdmVudFRhcmdldEluV2lkZ2V0OmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMubWVudS5lbGVtZW50WzBdO3JldHVybiBlLnRhcmdldD09PXRoaXMuZWxlbWVudFswXXx8ZS50YXJnZXQ9PT1pfHx0LmNvbnRhaW5zKGksZS50YXJnZXQpfSxfY2xvc2VPbkNsaWNrT3V0c2lkZTpmdW5jdGlvbih0KXt0aGlzLl9pc0V2ZW50VGFyZ2V0SW5XaWRnZXQodCl8fHRoaXMuY2xvc2UoKX0sX2FwcGVuZFRvOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLmFwcGVuZFRvO3JldHVybiBlJiYoZT1lLmpxdWVyeXx8ZS5ub2RlVHlwZT90KGUpOnRoaXMuZG9jdW1lbnQuZmluZChlKS5lcSgwKSksZSYmZVswXXx8KGU9dGhpcy5lbGVtZW50LmNsb3Nlc3QoIi51aS1mcm9udCwgZGlhbG9nIikpLGUubGVuZ3RofHwoZT10aGlzLmRvY3VtZW50WzBdLmJvZHkpLGV9LF9pbml0U291cmNlOmZ1bmN0aW9uKCl7dmFyIGUsaSxzPXRoaXM7dC5pc0FycmF5KHRoaXMub3B0aW9ucy5zb3VyY2UpPyhlPXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5zb3VyY2U9ZnVuY3Rpb24oaSxzKXtzKHQudWkuYXV0b2NvbXBsZXRlLmZpbHRlcihlLGkudGVybSkpfSk6InN0cmluZyI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPyhpPXRoaXMub3B0aW9ucy5zb3VyY2UsdGhpcy5zb3VyY2U9ZnVuY3Rpb24oZSxuKXtzLnhociYmcy54aHIuYWJvcnQoKSxzLnhocj10LmFqYXgoe3VybDppLGRhdGE6ZSxkYXRhVHlwZToianNvbiIsc3VjY2VzczpmdW5jdGlvbih0KXtuKHQpfSxlcnJvcjpmdW5jdGlvbigpe24oW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sX3NlYXJjaFRpbWVvdXQ6ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoaW5nKSx0aGlzLnNlYXJjaGluZz10aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciBlPXRoaXMudGVybT09PXRoaXMuX3ZhbHVlKCksaT10aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSxzPXQuYWx0S2V5fHx0LmN0cmxLZXl8fHQubWV0YUtleXx8dC5zaGlmdEtleTsoIWV8fGUmJiFpJiYhcykmJih0aGlzLnNlbGVjdGVkSXRlbT1udWxsLHRoaXMuc2VhcmNoKG51bGwsdCkpfSx0aGlzLm9wdGlvbnMuZGVsYXkpfSxzZWFyY2g6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1udWxsIT10P3Q6dGhpcy5fdmFsdWUoKSx0aGlzLnRlcm09dGhpcy5fdmFsdWUoKSx0Lmxlbmd0aDx0aGlzLm9wdGlvbnMubWluTGVuZ3RoP3RoaXMuY2xvc2UoZSk6dGhpcy5fdHJpZ2dlcigic2VhcmNoIixlKSE9PSExP3RoaXMuX3NlYXJjaCh0KTp2b2lkIDB9LF9zZWFyY2g6ZnVuY3Rpb24odCl7dGhpcy5wZW5kaW5nKyssdGhpcy5fYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiksdGhpcy5jYW5jZWxTZWFyY2g9ITEsdGhpcy5zb3VyY2Uoe3Rlcm06dH0sdGhpcy5fcmVzcG9uc2UoKSl9LF9yZXNwb25zZTpmdW5jdGlvbigpe3ZhciBlPSsrdGhpcy5yZXF1ZXN0SW5kZXg7cmV0dXJuIHQucHJveHkoZnVuY3Rpb24odCl7ZT09PXRoaXMucmVxdWVzdEluZGV4JiZ0aGlzLl9fcmVzcG9uc2UodCksdGhpcy5wZW5kaW5nLS0sdGhpcy5wZW5kaW5nfHx0aGlzLl9yZW1vdmVDbGFzcygidWktYXV0b2NvbXBsZXRlLWxvYWRpbmciKX0sdGhpcyl9LF9fcmVzcG9uc2U6ZnVuY3Rpb24odCl7dCYmKHQ9dGhpcy5fbm9ybWFsaXplKHQpKSx0aGlzLl90cmlnZ2VyKCJyZXNwb25zZSIsbnVsbCx7Y29udGVudDp0fSksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdCYmdC5sZW5ndGgmJiF0aGlzLmNhbmNlbFNlYXJjaD8odGhpcy5fc3VnZ2VzdCh0KSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuX2Nsb3NlKCl9LGNsb3NlOmZ1bmN0aW9uKHQpe3RoaXMuY2FuY2VsU2VhcmNoPSEwLHRoaXMuX2Nsb3NlKHQpfSxfY2xvc2U6ZnVuY3Rpb24odCl7dGhpcy5fb2ZmKHRoaXMuZG9jdW1lbnQsIm1vdXNlZG93biIpLHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLHQpKX0sX2NoYW5nZTpmdW5jdGlvbih0KXt0aGlzLnByZXZpb3VzIT09dGhpcy5fdmFsdWUoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIix0LHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubGVuZ3RoJiZlWzBdLmxhYmVsJiZlWzBdLnZhbHVlP2U6dC5tYXAoZSxmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/e2xhYmVsOmUsdmFsdWU6ZX06dC5leHRlbmQoe30sZSx7bGFiZWw6ZS5sYWJlbHx8ZS52YWx1ZSx2YWx1ZTplLnZhbHVlfHxlLmxhYmVsfSl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTt0aGlzLl9yZW5kZXJNZW51KGksZSksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5tZW51LnJlZnJlc2goKSxpLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksaS5wb3NpdGlvbih0LmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpLHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse21vdXNlZG93bjoiX2Nsb3NlT25DbGlja091dHNpZGUifSl9LF9yZXNpemVNZW51OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tZW51LmVsZW1lbnQ7dC5vdXRlcldpZHRoKE1hdGgubWF4KHQud2lkdGgoIiIpLm91dGVyV2lkdGgoKSsxLHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkpKX0sX3JlbmRlck1lbnU6ZnVuY3Rpb24oZSxpKXt2YXIgcz10aGlzO3QuZWFjaChpLGZ1bmN0aW9uKHQsaSl7cy5fcmVuZGVySXRlbURhdGEoZSxpKX0pfSxfcmVuZGVySXRlbURhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcmVuZGVySXRlbSh0LGUpLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIixlKX0sX3JlbmRlckl0ZW06ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdCgiPGxpPiIpLmFwcGVuZCh0KCI8ZGl2PiIpLnRleHQoaS5sYWJlbCkpLmFwcGVuZFRvKGUpfSxfbW92ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKT90aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSYmL15wcmV2aW91cy8udGVzdCh0KXx8dGhpcy5tZW51LmlzTGFzdEl0ZW0oKSYmL15uZXh0Ly50ZXN0KHQpPyh0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMubWVudS5ibHVyKCksdm9pZCAwKToodGhpcy5tZW51W3RdKGUpLHZvaWQgMCk6KHRoaXMuc2VhcmNoKG51bGwsZSksdm9pZCAwKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudS5lbGVtZW50fSxfdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU1ldGhvZC5hcHBseSh0aGlzLmVsZW1lbnQsYXJndW1lbnRzKX0sX2tleUV2ZW50OmZ1bmN0aW9uKHQsZSl7KCF0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkmJih0aGlzLl9tb3ZlKHQsZSksZS5wcmV2ZW50RGVmYXVsdCgpKX0sX2lzQ29udGVudEVkaXRhYmxlOmZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm4hMTt2YXIgZT10LnByb3AoImNvbnRlbnRFZGl0YWJsZSIpO3JldHVybiJpbmhlcml0Ij09PWU/dGhpcy5faXNDb250ZW50RWRpdGFibGUodC5wYXJlbnQoKSk6InRydWUiPT09ZX19KSx0LmV4dGVuZCh0LnVpLmF1dG9jb21wbGV0ZSx7ZXNjYXBlUmVnZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfSxmaWx0ZXI6ZnVuY3Rpb24oZSxpKXt2YXIgcz1SZWdFeHAodC51aS5hdXRvY29tcGxldGUuZXNjYXBlUmVnZXgoaSksImkiKTtyZXR1cm4gdC5ncmVwKGUsZnVuY3Rpb24odCl7cmV0dXJuIHMudGVzdCh0LmxhYmVsfHx0LnZhbHVlfHx0KX0pfX0pLHQud2lkZ2V0KCJ1aS5hdXRvY29tcGxldGUiLHQudWkuYXV0b2NvbXBsZXRlLHtvcHRpb25zOnttZXNzYWdlczp7bm9SZXN1bHRzOiJObyBzZWFyY2ggcmVzdWx0cy4iLHJlc3VsdHM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrKHQ+MT8iIHJlc3VsdHMgYXJlIjoiIHJlc3VsdCBpcyIpKyIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4ifX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24oZSl7dmFyIGk7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5jYW5jZWxTZWFyY2h8fChpPWUmJmUubGVuZ3RoP3RoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKGUubGVuZ3RoKTp0aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSx0KCI8ZGl2PiIpLnRleHQoaSkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSl9fSksdC51aS5hdXRvY29tcGxldGU7dmFyIGQ9L3VpLWNvcm5lci0oW2Etel0pezIsNn0vZzt0LndpZGdldCgidWkuY29udHJvbGdyb3VwIix7dmVyc2lvbjoiMS4xMi4xIixkZWZhdWx0RWxlbWVudDoiPGRpdj4iLG9wdGlvbnM6e2RpcmVjdGlvbjoiaG9yaXpvbnRhbCIsZGlzYWJsZWQ6bnVsbCxvbmx5VmlzaWJsZTohMCxpdGVtczp7YnV0dG9uOiJpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9c3VibWl0XSwgaW5wdXRbdHlwZT1yZXNldF0sIGJ1dHRvbiwgYSIsY29udHJvbGdyb3VwTGFiZWw6Ii51aS1jb250cm9sZ3JvdXAtbGFiZWwiLGNoZWNrYm94cmFkaW86ImlucHV0W3R5cGU9J2NoZWNrYm94J10sIGlucHV0W3R5cGU9J3JhZGlvJ10iLHNlbGVjdG1lbnU6InNlbGVjdCIsc3Bpbm5lcjoiLnVpLXNwaW5uZXItaW5wdXQifX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX2VuaGFuY2UoKX0sX2VuaGFuY2U6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYXR0cigicm9sZSIsInRvb2xiYXIiKSx0aGlzLnJlZnJlc2goKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsQ2hpbGRNZXRob2QoImRlc3Ryb3kiKSx0aGlzLmNoaWxkV2lkZ2V0cy5yZW1vdmVEYXRhKCJ1aS1jb250cm9sZ3JvdXAtZGF0YSIpLHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCJyb2xlIiksdGhpcy5vcHRpb25zLml0ZW1zLmNvbnRyb2xncm91cExhYmVsJiZ0aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMuY29udHJvbGdyb3VwTGFiZWwpLmZpbmQoIi51aS1jb250cm9sZ3JvdXAtbGFiZWwtY29udGVudHMiKS5jb250ZW50cygpLnVud3JhcCgpfSxfaW5pdFdpZGdldHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9W107dC5lYWNoKHRoaXMub3B0aW9ucy5pdGVtcyxmdW5jdGlvbihzLG4pe3ZhciBvLGE9e307cmV0dXJuIG4/ImNvbnRyb2xncm91cExhYmVsIj09PXM/KG89ZS5lbGVtZW50LmZpbmQobiksby5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTtlLmNoaWxkcmVuKCIudWktY29udHJvbGdyb3VwLWxhYmVsLWNvbnRlbnRzIikubGVuZ3RofHxlLmNvbnRlbnRzKCkud3JhcEFsbCgiPHNwYW4gY2xhc3M9J3VpLWNvbnRyb2xncm91cC1sYWJlbC1jb250ZW50cyc+PC9zcGFuPiIpfSksZS5fYWRkQ2xhc3MobyxudWxsLCJ1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktc3RhdGUtZGVmYXVsdCIpLGk9aS5jb25jYXQoby5nZXQoKSksdm9pZCAwKToodC5mbltzXSYmKGE9ZVsiXyIrcysiT3B0aW9ucyJdP2VbIl8iK3MrIk9wdGlvbnMiXSgibWlkZGxlIik6e2NsYXNzZXM6e319LGUuZWxlbWVudC5maW5kKG4pLmVhY2goZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpLG89bltzXSgiaW5zdGFuY2UiKSxyPXQud2lkZ2V0LmV4dGVuZCh7fSxhKTtpZigiYnV0dG9uIiE9PXN8fCFuLnBhcmVudCgiLnVpLXNwaW5uZXIiKS5sZW5ndGgpe298fChvPW5bc10oKVtzXSgiaW5zdGFuY2UiKSksbyYmKHIuY2xhc3Nlcz1lLl9yZXNvbHZlQ2xhc3Nlc1ZhbHVlcyhyLmNsYXNzZXMsbykpLG5bc10ocik7dmFyIGg9bltzXSgid2lkZ2V0Iik7dC5kYXRhKGhbMF0sInVpLWNvbnRyb2xncm91cC1kYXRhIixvP286bltzXSgiaW5zdGFuY2UiKSksaS5wdXNoKGhbMF0pfX0pKSx2b2lkIDApOnZvaWQgMH0pLHRoaXMuY2hpbGRXaWRnZXRzPXQodC51bmlxdWUoaSkpLHRoaXMuX2FkZENsYXNzKHRoaXMuY2hpbGRXaWRnZXRzLCJ1aS1jb250cm9sZ3JvdXAtaXRlbSIpfSxfY2FsbENoaWxkTWV0aG9kOmZ1bmN0aW9uKGUpe3RoaXMuY2hpbGRXaWRnZXRzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLHM9aS5kYXRhKCJ1aS1jb250cm9sZ3JvdXAtZGF0YSIpO3MmJnNbZV0mJnNbZV0oKX0pfSxfdXBkYXRlQ29ybmVyQ2xhc3M6ZnVuY3Rpb24odCxlKXt2YXIgaT0idWktY29ybmVyLXRvcCB1aS1jb3JuZXItYm90dG9tIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCB1aS1jb3JuZXItYWxsIixzPXRoaXMuX2J1aWxkU2ltcGxlT3B0aW9ucyhlLCJsYWJlbCIpLmNsYXNzZXMubGFiZWw7dGhpcy5fcmVtb3ZlQ2xhc3ModCxudWxsLGkpLHRoaXMuX2FkZENsYXNzKHQsbnVsbCxzKX0sX2J1aWxkU2ltcGxlT3B0aW9uczpmdW5jdGlvbih0LGUpe3ZhciBpPSJ2ZXJ0aWNhbCI9PT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLHM9e2NsYXNzZXM6e319O3JldHVybiBzLmNsYXNzZXNbZV09e21pZGRsZToiIixmaXJzdDoidWktY29ybmVyLSIrKGk/InRvcCI6ImxlZnQiKSxsYXN0OiJ1aS1jb3JuZXItIisoaT8iYm90dG9tIjoicmlnaHQiKSxvbmx5OiJ1aS1jb3JuZXItYWxsIn1bdF0sc30sX3NwaW5uZXJPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2J1aWxkU2ltcGxlT3B0aW9ucyh0LCJ1aS1zcGlubmVyIik7cmV0dXJuIGUuY2xhc3Nlc1sidWktc3Bpbm5lci11cCJdPSIiLGUuY2xhc3Nlc1sidWktc3Bpbm5lci1kb3duIl09IiIsZX0sX2J1dHRvbk9wdGlvbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2J1aWxkU2ltcGxlT3B0aW9ucyh0LCJ1aS1idXR0b24iKX0sX2NoZWNrYm94cmFkaW9PcHRpb25zOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9idWlsZFNpbXBsZU9wdGlvbnModCwidWktY2hlY2tib3hyYWRpby1sYWJlbCIpfSxfc2VsZWN0bWVudU9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU9InZlcnRpY2FsIj09PXRoaXMub3B0aW9ucy5kaXJlY3Rpb247cmV0dXJue3dpZHRoOmU/ImF1dG8iOiExLGNsYXNzZXM6e21pZGRsZTp7InVpLXNlbGVjdG1lbnUtYnV0dG9uLW9wZW4iOiIiLCJ1aS1zZWxlY3RtZW51LWJ1dHRvbi1jbG9zZWQiOiIifSxmaXJzdDp7InVpLXNlbGVjdG1lbnUtYnV0dG9uLW9wZW4iOiJ1aS1jb3JuZXItIisoZT8idG9wIjoidGwiKSwidWktc2VsZWN0bWVudS1idXR0b24tY2xvc2VkIjoidWktY29ybmVyLSIrKGU/InRvcCI6ImxlZnQiKX0sbGFzdDp7InVpLXNlbGVjdG1lbnUtYnV0dG9uLW9wZW4iOmU/IiI6InVpLWNvcm5lci10ciIsInVpLXNlbGVjdG1lbnUtYnV0dG9uLWNsb3NlZCI6InVpLWNvcm5lci0iKyhlPyJib3R0b20iOiJyaWdodCIpfSxvbmx5OnsidWktc2VsZWN0bWVudS1idXR0b24tb3BlbiI6InVpLWNvcm5lci10b3AiLCJ1aS1zZWxlY3RtZW51LWJ1dHRvbi1jbG9zZWQiOiJ1aS1jb3JuZXItYWxsIn19W3RdfX0sX3Jlc29sdmVDbGFzc2VzVmFsdWVzOmZ1bmN0aW9uKGUsaSl7dmFyIHM9e307cmV0dXJuIHQuZWFjaChlLGZ1bmN0aW9uKG4pe3ZhciBvPWkub3B0aW9ucy5jbGFzc2VzW25dfHwiIjtvPXQudHJpbShvLnJlcGxhY2UoZCwiIikpLHNbbl09KG8rIiAiK2Vbbl0pLnJlcGxhY2UoL1xzKy9nLCIgIil9KSxzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuImRpcmVjdGlvbiI9PT10JiZ0aGlzLl9yZW1vdmVDbGFzcygidWktY29udHJvbGdyb3VwLSIrdGhpcy5vcHRpb25zLmRpcmVjdGlvbiksdGhpcy5fc3VwZXIodCxlKSwiZGlzYWJsZWQiPT09dD8odGhpcy5fY2FsbENoaWxkTWV0aG9kKGU/ImRpc2FibGUiOiJlbmFibGUiKSx2b2lkIDApOih0aGlzLnJlZnJlc2goKSx2b2lkIDApfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGUsaT10aGlzO3RoaXMuX2FkZENsYXNzKCJ1aS1jb250cm9sZ3JvdXAgdWktY29udHJvbGdyb3VwLSIrdGhpcy5vcHRpb25zLmRpcmVjdGlvbiksImhvcml6b250YWwiPT09dGhpcy5vcHRpb25zLmRpcmVjdGlvbiYmdGhpcy5fYWRkQ2xhc3MobnVsbCwidWktaGVscGVyLWNsZWFyZml4IiksdGhpcy5faW5pdFdpZGdldHMoKSxlPXRoaXMuY2hpbGRXaWRnZXRzLHRoaXMub3B0aW9ucy5vbmx5VmlzaWJsZSYmKGU9ZS5maWx0ZXIoIjp2aXNpYmxlIikpLGUubGVuZ3RoJiYodC5lYWNoKFsiZmlyc3QiLCJsYXN0Il0sZnVuY3Rpb24odCxzKXt2YXIgbj1lW3NdKCkuZGF0YSgidWktY29udHJvbGdyb3VwLWRhdGEiKTtpZihuJiZpWyJfIituLndpZGdldE5hbWUrIk9wdGlvbnMiXSl7dmFyIG89aVsiXyIrbi53aWRnZXROYW1lKyJPcHRpb25zIl0oMT09PWUubGVuZ3RoPyJvbmx5IjpzKTtvLmNsYXNzZXM9aS5fcmVzb2x2ZUNsYXNzZXNWYWx1ZXMoby5jbGFzc2VzLG4pLG4uZWxlbWVudFtuLndpZGdldE5hbWVdKG8pfWVsc2UgaS5fdXBkYXRlQ29ybmVyQ2xhc3MoZVtzXSgpLHMpfSksdGhpcy5fY2FsbENoaWxkTWV0aG9kKCJyZWZyZXNoIikpfX0pLHQud2lkZ2V0KCJ1aS5jaGVja2JveHJhZGlvIixbdC51aS5mb3JtUmVzZXRNaXhpbix7dmVyc2lvbjoiMS4xMi4xIixvcHRpb25zOntkaXNhYmxlZDpudWxsLGxhYmVsOm51bGwsaWNvbjohMCxjbGFzc2VzOnsidWktY2hlY2tib3hyYWRpby1sYWJlbCI6InVpLWNvcm5lci1hbGwiLCJ1aS1jaGVja2JveHJhZGlvLWljb24iOiJ1aS1jb3JuZXItYWxsIn19LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIGUsaSxzPXRoaXMsbj10aGlzLl9zdXBlcigpfHx7fTtyZXR1cm4gdGhpcy5fcmVhZFR5cGUoKSxpPXRoaXMuZWxlbWVudC5sYWJlbHMoKSx0aGlzLmxhYmVsPXQoaVtpLmxlbmd0aC0xXSksdGhpcy5sYWJlbC5sZW5ndGh8fHQuZXJyb3IoIk5vIGxhYmVsIGZvdW5kIGZvciBjaGVja2JveHJhZGlvIHdpZGdldCIpLHRoaXMub3JpZ2luYWxMYWJlbD0iIix0aGlzLmxhYmVsLmNvbnRlbnRzKCkubm90KHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3Mub3JpZ2luYWxMYWJlbCs9Mz09PXRoaXMubm9kZVR5cGU/dCh0aGlzKS50ZXh0KCk6dGhpcy5vdXRlckhUTUx9KSx0aGlzLm9yaWdpbmFsTGFiZWwmJihuLmxhYmVsPXRoaXMub3JpZ2luYWxMYWJlbCksZT10aGlzLmVsZW1lbnRbMF0uZGlzYWJsZWQsbnVsbCE9ZSYmKG4uZGlzYWJsZWQ9ZSksbn0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudFswXS5jaGVja2VkO3RoaXMuX2JpbmRGb3JtUmVzZXRIYW5kbGVyKCksbnVsbD09dGhpcy5vcHRpb25zLmRpc2FibGVkJiYodGhpcy5vcHRpb25zLmRpc2FibGVkPXRoaXMuZWxlbWVudFswXS5kaXNhYmxlZCksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9hZGRDbGFzcygidWktY2hlY2tib3hyYWRpbyIsInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuX2FkZENsYXNzKHRoaXMubGFiZWwsInVpLWNoZWNrYm94cmFkaW8tbGFiZWwiLCJ1aS1idXR0b24gdWktd2lkZ2V0IiksInJhZGlvIj09PXRoaXMudHlwZSYmdGhpcy5fYWRkQ2xhc3ModGhpcy5sYWJlbCwidWktY2hlY2tib3hyYWRpby1yYWRpby1sYWJlbCIpLHRoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5vcHRpb25zLmxhYmVsIT09dGhpcy5vcmlnaW5hbExhYmVsP3RoaXMuX3VwZGF0ZUxhYmVsKCk6dGhpcy5vcmlnaW5hbExhYmVsJiYodGhpcy5vcHRpb25zLmxhYmVsPXRoaXMub3JpZ2luYWxMYWJlbCksdGhpcy5fZW5oYW5jZSgpLHQmJih0aGlzLl9hZGRDbGFzcyh0aGlzLmxhYmVsLCJ1aS1jaGVja2JveHJhZGlvLWNoZWNrZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmljb24mJnRoaXMuX2FkZENsYXNzKHRoaXMuaWNvbixudWxsLCJ1aS1zdGF0ZS1ob3ZlciIpKSx0aGlzLl9vbih7Y2hhbmdlOiJfdG9nZ2xlQ2xhc3NlcyIsZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGRDbGFzcyh0aGlzLmxhYmVsLG51bGwsInVpLXN0YXRlLWZvY3VzIHVpLXZpc3VhbC1mb2N1cyIpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5sYWJlbCxudWxsLCJ1aS1zdGF0ZS1mb2N1cyB1aS12aXN1YWwtZm9jdXMiKX19KX0sX3JlYWRUeXBlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dGhpcy50eXBlPXRoaXMuZWxlbWVudFswXS50eXBlLCJpbnB1dCI9PT1lJiYvcmFkaW98Y2hlY2tib3gvLnRlc3QodGhpcy50eXBlKXx8dC5lcnJvcigiQ2FuJ3QgY3JlYXRlIGNoZWNrYm94cmFkaW8gb24gZWxlbWVudC5ub2RlTmFtZT0iK2UrIiBhbmQgZWxlbWVudC50eXBlPSIrdGhpcy50eXBlKX0sX2VuaGFuY2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJY29uKHRoaXMuZWxlbWVudFswXS5jaGVja2VkKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFiZWx9LF9nZXRSYWRpb0dyb3VwOmZ1bmN0aW9uKCl7dmFyIGUsaT10aGlzLmVsZW1lbnRbMF0ubmFtZSxzPSJpbnB1dFtuYW1lPSciK3QudWkuZXNjYXBlU2VsZWN0b3IoaSkrIiddIjtyZXR1cm4gaT8oZT10aGlzLmZvcm0ubGVuZ3RoP3QodGhpcy5mb3JtWzBdLmVsZW1lbnRzKS5maWx0ZXIocyk6dChzKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gMD09PXQodGhpcykuZm9ybSgpLmxlbmd0aH0pLGUubm90KHRoaXMuZWxlbWVudCkpOnQoW10pfSxfdG9nZ2xlQ2xhc3NlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudFswXS5jaGVja2VkO3RoaXMuX3RvZ2dsZUNsYXNzKHRoaXMubGFiZWwsInVpLWNoZWNrYm94cmFkaW8tY2hlY2tlZCIsInVpLXN0YXRlLWFjdGl2ZSIsZSksdGhpcy5vcHRpb25zLmljb24mJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuX3RvZ2dsZUNsYXNzKHRoaXMuaWNvbixudWxsLCJ1aS1pY29uLWNoZWNrIHVpLXN0YXRlLWNoZWNrZWQiLGUpLl90b2dnbGVDbGFzcyh0aGlzLmljb24sbnVsbCwidWktaWNvbi1ibGFuayIsIWUpLCJyYWRpbyI9PT10aGlzLnR5cGUmJnRoaXMuX2dldFJhZGlvR3JvdXAoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKS5jaGVja2JveHJhZGlvKCJpbnN0YW5jZSIpO2UmJmUuX3JlbW92ZUNsYXNzKGUubGFiZWwsInVpLWNoZWNrYm94cmFkaW8tY2hlY2tlZCIsInVpLXN0YXRlLWFjdGl2ZSIpfSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fdW5iaW5kRm9ybVJlc2V0SGFuZGxlcigpLHRoaXMuaWNvbiYmKHRoaXMuaWNvbi5yZW1vdmUoKSx0aGlzLmljb25TcGFjZS5yZW1vdmUoKSl9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxlKXtyZXR1cm4ibGFiZWwiIT09dHx8ZT8odGhpcy5fc3VwZXIodCxlKSwiZGlzYWJsZWQiPT09dD8odGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy5sYWJlbCxudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsZSksdGhpcy5lbGVtZW50WzBdLmRpc2FibGVkPWUsdm9pZCAwKToodGhpcy5yZWZyZXNoKCksdm9pZCAwKSk6dm9pZCAwfSxfdXBkYXRlSWNvbjpmdW5jdGlvbihlKXt2YXIgaT0idWktaWNvbiB1aS1pY29uLWJhY2tncm91bmQgIjt0aGlzLm9wdGlvbnMuaWNvbj8odGhpcy5pY29ufHwodGhpcy5pY29uPXQoIjxzcGFuPiIpLHRoaXMuaWNvblNwYWNlPXQoIjxzcGFuPiA8L3NwYW4+IiksdGhpcy5fYWRkQ2xhc3ModGhpcy5pY29uU3BhY2UsInVpLWNoZWNrYm94cmFkaW8taWNvbi1zcGFjZSIpKSwiY2hlY2tib3giPT09dGhpcy50eXBlPyhpKz1lPyJ1aS1pY29uLWNoZWNrIHVpLXN0YXRlLWNoZWNrZWQiOiJ1aS1pY29uLWJsYW5rIix0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmljb24sbnVsbCxlPyJ1aS1pY29uLWJsYW5rIjoidWktaWNvbi1jaGVjayIpKTppKz0idWktaWNvbi1ibGFuayIsdGhpcy5fYWRkQ2xhc3ModGhpcy5pY29uLCJ1aS1jaGVja2JveHJhZGlvLWljb24iLGkpLGV8fHRoaXMuX3JlbW92ZUNsYXNzKHRoaXMuaWNvbixudWxsLCJ1aS1pY29uLWNoZWNrIHVpLXN0YXRlLWNoZWNrZWQiKSx0aGlzLmljb24ucHJlcGVuZFRvKHRoaXMubGFiZWwpLmFmdGVyKHRoaXMuaWNvblNwYWNlKSk6dm9pZCAwIT09dGhpcy5pY29uJiYodGhpcy5pY29uLnJlbW92ZSgpLHRoaXMuaWNvblNwYWNlLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLmljb24pCn0sX3VwZGF0ZUxhYmVsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sYWJlbC5jb250ZW50cygpLm5vdCh0aGlzLmVsZW1lbnRbMF0pO3RoaXMuaWNvbiYmKHQ9dC5ub3QodGhpcy5pY29uWzBdKSksdGhpcy5pY29uU3BhY2UmJih0PXQubm90KHRoaXMuaWNvblNwYWNlWzBdKSksdC5yZW1vdmUoKSx0aGlzLmxhYmVsLmFwcGVuZCh0aGlzLm9wdGlvbnMubGFiZWwpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50WzBdLmNoZWNrZWQsZT10aGlzLmVsZW1lbnRbMF0uZGlzYWJsZWQ7dGhpcy5fdXBkYXRlSWNvbih0KSx0aGlzLl90b2dnbGVDbGFzcyh0aGlzLmxhYmVsLCJ1aS1jaGVja2JveHJhZGlvLWNoZWNrZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLHQpLG51bGwhPT10aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuX3VwZGF0ZUxhYmVsKCksZSE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ZX0pfX1dKSx0LnVpLmNoZWNrYm94cmFkaW8sdC53aWRnZXQoInVpLmJ1dHRvbiIse3ZlcnNpb246IjEuMTIuMSIsZGVmYXVsdEVsZW1lbnQ6IjxidXR0b24+IixvcHRpb25zOntjbGFzc2VzOnsidWktYnV0dG9uIjoidWktY29ybmVyLWFsbCJ9LGRpc2FibGVkOm51bGwsaWNvbjpudWxsLGljb25Qb3NpdGlvbjoiYmVnaW5uaW5nIixsYWJlbDpudWxsLHNob3dMYWJlbDohMH0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX3N1cGVyKCl8fHt9O3JldHVybiB0aGlzLmlzSW5wdXQ9dGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpLHQ9dGhpcy5lbGVtZW50WzBdLmRpc2FibGVkLG51bGwhPXQmJihlLmRpc2FibGVkPXQpLHRoaXMub3JpZ2luYWxMYWJlbD10aGlzLmlzSW5wdXQ/dGhpcy5lbGVtZW50LnZhbCgpOnRoaXMuZWxlbWVudC5odG1sKCksdGhpcy5vcmlnaW5hbExhYmVsJiYoZS5sYWJlbD10aGlzLm9yaWdpbmFsTGFiZWwpLGV9LF9jcmVhdGU6ZnVuY3Rpb24oKXshdGhpcy5vcHRpb24uc2hvd0xhYmVsJiF0aGlzLm9wdGlvbnMuaWNvbiYmKHRoaXMub3B0aW9ucy5zaG93TGFiZWw9ITApLG51bGw9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmKHRoaXMub3B0aW9ucy5kaXNhYmxlZD10aGlzLmVsZW1lbnRbMF0uZGlzYWJsZWR8fCExKSx0aGlzLmhhc1RpdGxlPSEhdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIiksdGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLm9wdGlvbnMubGFiZWwhPT10aGlzLm9yaWdpbmFsTGFiZWwmJih0aGlzLmlzSW5wdXQ/dGhpcy5lbGVtZW50LnZhbCh0aGlzLm9wdGlvbnMubGFiZWwpOnRoaXMuZWxlbWVudC5odG1sKHRoaXMub3B0aW9ucy5sYWJlbCkpLHRoaXMuX2FkZENsYXNzKCJ1aS1idXR0b24iLCJ1aS13aWRnZXQiKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX2VuaGFuY2UoKSx0aGlzLmVsZW1lbnQuaXMoImEiKSYmdGhpcy5fb24oe2tleXVwOmZ1bmN0aW9uKGUpe2Uua2V5Q29kZT09PXQudWkua2V5Q29kZS5TUEFDRSYmKGUucHJldmVudERlZmF1bHQoKSx0aGlzLmVsZW1lbnRbMF0uY2xpY2s/dGhpcy5lbGVtZW50WzBdLmNsaWNrKCk6dGhpcy5lbGVtZW50LnRyaWdnZXIoImNsaWNrIikpfX0pfSxfZW5oYW5jZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5pcygiYnV0dG9uIil8fHRoaXMuZWxlbWVudC5hdHRyKCJyb2xlIiwiYnV0dG9uIiksdGhpcy5vcHRpb25zLmljb24mJih0aGlzLl91cGRhdGVJY29uKCJpY29uIix0aGlzLm9wdGlvbnMuaWNvbiksdGhpcy5fdXBkYXRlVG9vbHRpcCgpKX0sX3VwZGF0ZVRvb2x0aXA6ZnVuY3Rpb24oKXt0aGlzLnRpdGxlPXRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIpLHRoaXMub3B0aW9ucy5zaG93TGFiZWx8fHRoaXMudGl0bGV8fHRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIsdGhpcy5vcHRpb25zLmxhYmVsKX0sX3VwZGF0ZUljb246ZnVuY3Rpb24oZSxpKXt2YXIgcz0iaWNvblBvc2l0aW9uIiE9PWUsbj1zP3RoaXMub3B0aW9ucy5pY29uUG9zaXRpb246aSxvPSJ0b3AiPT09bnx8ImJvdHRvbSI9PT1uO3RoaXMuaWNvbj9zJiZ0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmljb24sbnVsbCx0aGlzLm9wdGlvbnMuaWNvbik6KHRoaXMuaWNvbj10KCI8c3Bhbj4iKSx0aGlzLl9hZGRDbGFzcyh0aGlzLmljb24sInVpLWJ1dHRvbi1pY29uIiwidWktaWNvbiIpLHRoaXMub3B0aW9ucy5zaG93TGFiZWx8fHRoaXMuX2FkZENsYXNzKCJ1aS1idXR0b24taWNvbi1vbmx5IikpLHMmJnRoaXMuX2FkZENsYXNzKHRoaXMuaWNvbixudWxsLGkpLHRoaXMuX2F0dGFjaEljb24obiksbz8odGhpcy5fYWRkQ2xhc3ModGhpcy5pY29uLG51bGwsInVpLXdpZGdldC1pY29uLWJsb2NrIiksdGhpcy5pY29uU3BhY2UmJnRoaXMuaWNvblNwYWNlLnJlbW92ZSgpKToodGhpcy5pY29uU3BhY2V8fCh0aGlzLmljb25TcGFjZT10KCI8c3Bhbj4gPC9zcGFuPiIpLHRoaXMuX2FkZENsYXNzKHRoaXMuaWNvblNwYWNlLCJ1aS1idXR0b24taWNvbi1zcGFjZSIpKSx0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLmljb24sbnVsbCwidWktd2lnZXQtaWNvbi1ibG9jayIpLHRoaXMuX2F0dGFjaEljb25TcGFjZShuKSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmljb24mJnRoaXMuaWNvbi5yZW1vdmUoKSx0aGlzLmljb25TcGFjZSYmdGhpcy5pY29uU3BhY2UucmVtb3ZlKCksdGhpcy5oYXNUaXRsZXx8dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIil9LF9hdHRhY2hJY29uU3BhY2U6ZnVuY3Rpb24odCl7dGhpcy5pY29uWy9eKD86ZW5kfGJvdHRvbSkvLnRlc3QodCk/ImJlZm9yZSI6ImFmdGVyIl0odGhpcy5pY29uU3BhY2UpfSxfYXR0YWNoSWNvbjpmdW5jdGlvbih0KXt0aGlzLmVsZW1lbnRbL14oPzplbmR8Ym90dG9tKS8udGVzdCh0KT8iYXBwZW5kIjoicHJlcGVuZCJdKHRoaXMuaWNvbil9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMD09PXQuc2hvd0xhYmVsP3RoaXMub3B0aW9ucy5zaG93TGFiZWw6dC5zaG93TGFiZWwsaT12b2lkIDA9PT10Lmljb24/dGhpcy5vcHRpb25zLmljb246dC5pY29uO2V8fGl8fCh0LnNob3dMYWJlbD0hMCksdGhpcy5fc3VwZXIodCl9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxlKXsiaWNvbiI9PT10JiYoZT90aGlzLl91cGRhdGVJY29uKHQsZSk6dGhpcy5pY29uJiYodGhpcy5pY29uLnJlbW92ZSgpLHRoaXMuaWNvblNwYWNlJiZ0aGlzLmljb25TcGFjZS5yZW1vdmUoKSkpLCJpY29uUG9zaXRpb24iPT09dCYmdGhpcy5fdXBkYXRlSWNvbih0LGUpLCJzaG93TGFiZWwiPT09dCYmKHRoaXMuX3RvZ2dsZUNsYXNzKCJ1aS1idXR0b24taWNvbi1vbmx5IixudWxsLCFlKSx0aGlzLl91cGRhdGVUb29sdGlwKCkpLCJsYWJlbCI9PT10JiYodGhpcy5pc0lucHV0P3RoaXMuZWxlbWVudC52YWwoZSk6KHRoaXMuZWxlbWVudC5odG1sKGUpLHRoaXMuaWNvbiYmKHRoaXMuX2F0dGFjaEljb24odGhpcy5vcHRpb25zLmljb25Qb3NpdGlvbiksdGhpcy5fYXR0YWNoSWNvblNwYWNlKHRoaXMub3B0aW9ucy5pY29uUG9zaXRpb24pKSkpLHRoaXMuX3N1cGVyKHQsZSksImRpc2FibGVkIj09PXQmJih0aGlzLl90b2dnbGVDbGFzcyhudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsZSksdGhpcy5lbGVtZW50WzBdLmRpc2FibGVkPWUsZSYmdGhpcy5lbGVtZW50LmJsdXIoKSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoImlucHV0LCBidXR0b24iKT90aGlzLmVsZW1lbnRbMF0uZGlzYWJsZWQ6dGhpcy5lbGVtZW50Lmhhc0NsYXNzKCJ1aS1idXR0b24tZGlzYWJsZWQiKTt0IT09dGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9zZXRPcHRpb25zKHtkaXNhYmxlZDp0fSksdGhpcy5fdXBkYXRlVG9vbHRpcCgpfX0pLHQudWlCYWNrQ29tcGF0IT09ITEmJih0LndpZGdldCgidWkuYnV0dG9uIix0LnVpLmJ1dHRvbix7b3B0aW9uczp7dGV4dDohMCxpY29uczp7cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zaG93TGFiZWwmJiF0aGlzLm9wdGlvbnMudGV4dCYmKHRoaXMub3B0aW9ucy5zaG93TGFiZWw9dGhpcy5vcHRpb25zLnRleHQpLCF0aGlzLm9wdGlvbnMuc2hvd0xhYmVsJiZ0aGlzLm9wdGlvbnMudGV4dCYmKHRoaXMub3B0aW9ucy50ZXh0PXRoaXMub3B0aW9ucy5zaG93TGFiZWwpLHRoaXMub3B0aW9ucy5pY29ufHwhdGhpcy5vcHRpb25zLmljb25zLnByaW1hcnkmJiF0aGlzLm9wdGlvbnMuaWNvbnMuc2Vjb25kYXJ5P3RoaXMub3B0aW9ucy5pY29uJiYodGhpcy5vcHRpb25zLmljb25zLnByaW1hcnk9dGhpcy5vcHRpb25zLmljb24pOnRoaXMub3B0aW9ucy5pY29ucy5wcmltYXJ5P3RoaXMub3B0aW9ucy5pY29uPXRoaXMub3B0aW9ucy5pY29ucy5wcmltYXJ5Oih0aGlzLm9wdGlvbnMuaWNvbj10aGlzLm9wdGlvbnMuaWNvbnMuc2Vjb25kYXJ5LHRoaXMub3B0aW9ucy5pY29uUG9zaXRpb249ImVuZCIpLHRoaXMuX3N1cGVyKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxlKXtyZXR1cm4idGV4dCI9PT10Pyh0aGlzLl9zdXBlcigic2hvd0xhYmVsIixlKSx2b2lkIDApOigic2hvd0xhYmVsIj09PXQmJih0aGlzLm9wdGlvbnMudGV4dD1lKSwiaWNvbiI9PT10JiYodGhpcy5vcHRpb25zLmljb25zLnByaW1hcnk9ZSksImljb25zIj09PXQmJihlLnByaW1hcnk/KHRoaXMuX3N1cGVyKCJpY29uIixlLnByaW1hcnkpLHRoaXMuX3N1cGVyKCJpY29uUG9zaXRpb24iLCJiZWdpbm5pbmciKSk6ZS5zZWNvbmRhcnkmJih0aGlzLl9zdXBlcigiaWNvbiIsZS5zZWNvbmRhcnkpLHRoaXMuX3N1cGVyKCJpY29uUG9zaXRpb24iLCJlbmQiKSkpLHRoaXMuX3N1cGVyQXBwbHkoYXJndW1lbnRzKSx2b2lkIDApfX0pLHQuZm4uYnV0dG9uPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiF0aGlzLmxlbmd0aHx8dGhpcy5sZW5ndGgmJiJJTlBVVCIhPT10aGlzWzBdLnRhZ05hbWV8fHRoaXMubGVuZ3RoJiYiSU5QVVQiPT09dGhpc1swXS50YWdOYW1lJiYiY2hlY2tib3giIT09dGhpcy5hdHRyKCJ0eXBlIikmJiJyYWRpbyIhPT10aGlzLmF0dHIoInR5cGUiKT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKToodC51aS5jaGVja2JveHJhZGlvfHx0LmVycm9yKCJDaGVja2JveHJhZGlvIHdpZGdldCBtaXNzaW5nIiksMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jaGVja2JveHJhZGlvKHtpY29uOiExfSk6dGhpcy5jaGVja2JveHJhZGlvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fSh0LmZuLmJ1dHRvbiksdC5mbi5idXR0b25zZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC51aS5jb250cm9sZ3JvdXB8fHQuZXJyb3IoIkNvbnRyb2xncm91cCB3aWRnZXQgbWlzc2luZyIpLCJvcHRpb24iPT09YXJndW1lbnRzWzBdJiYiaXRlbXMiPT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMl0/dGhpcy5jb250cm9sZ3JvdXAuYXBwbHkodGhpcyxbYXJndW1lbnRzWzBdLCJpdGVtcy5idXR0b24iLGFyZ3VtZW50c1syXV0pOiJvcHRpb24iPT09YXJndW1lbnRzWzBdJiYiaXRlbXMiPT09YXJndW1lbnRzWzFdP3RoaXMuY29udHJvbGdyb3VwLmFwcGx5KHRoaXMsW2FyZ3VtZW50c1swXSwiaXRlbXMuYnV0dG9uIl0pOigib2JqZWN0Ij09dHlwZW9mIGFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdLml0ZW1zJiYoYXJndW1lbnRzWzBdLml0ZW1zPXtidXR0b246YXJndW1lbnRzWzBdLml0ZW1zfSksdGhpcy5jb250cm9sZ3JvdXAuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pLHQudWkuYnV0dG9uLHQuZXh0ZW5kKHQudWkse2RhdGVwaWNrZXI6e3ZlcnNpb246IjEuMTIuMSJ9fSk7dmFyIHA7dC5leHRlbmQocy5wcm90b3R5cGUse21hcmtlckNsYXNzTmFtZToiaGFzRGF0ZXBpY2tlciIsbWF4Um93czo0LF93aWRnZXREYXRlcGlja2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHBEaXZ9LHNldERlZmF1bHRzOmZ1bmN0aW9uKHQpe3JldHVybiBhKHRoaXMuX2RlZmF1bHRzLHR8fHt9KSx0aGlzfSxfYXR0YWNoRGF0ZXBpY2tlcjpmdW5jdGlvbihlLGkpe3ZhciBzLG4sbztzPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPSJkaXYiPT09c3x8InNwYW4iPT09cyxlLmlkfHwodGhpcy51dWlkKz0xLGUuaWQ9ImRwIit0aGlzLnV1aWQpLG89dGhpcy5fbmV3SW5zdCh0KGUpLG4pLG8uc2V0dGluZ3M9dC5leHRlbmQoe30saXx8e30pLCJpbnB1dCI9PT1zP3RoaXMuX2Nvbm5lY3REYXRlcGlja2VyKGUsbyk6biYmdGhpcy5faW5saW5lRGF0ZXBpY2tlcihlLG8pfSxfbmV3SW5zdDpmdW5jdGlvbihlLGkpe3ZhciBzPWVbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05X1wtXSkvZywiXFxcXCQxIik7cmV0dXJue2lkOnMsaW5wdXQ6ZSxzZWxlY3RlZERheTowLHNlbGVjdGVkTW9udGg6MCxzZWxlY3RlZFllYXI6MCxkcmF3TW9udGg6MCxkcmF3WWVhcjowLGlubGluZTppLGRwRGl2Omk/bih0KCI8ZGl2IGNsYXNzPSciK3RoaXMuX2lubGluZUNsYXNzKyIgdWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwnPjwvZGl2PiIpKTp0aGlzLmRwRGl2fX0sX2Nvbm5lY3REYXRlcGlja2VyOmZ1bmN0aW9uKGUsaSl7dmFyIHM9dChlKTtpLmFwcGVuZD10KFtdKSxpLnRyaWdnZXI9dChbXSkscy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSl8fCh0aGlzLl9hdHRhY2htZW50cyhzLGkpLHMuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLm9uKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLm9uKCJrZXlwcmVzcyIsdGhpcy5fZG9LZXlQcmVzcykub24oImtleXVwIix0aGlzLl9kb0tleVVwKSx0aGlzLl9hdXRvU2l6ZShpKSx0LmRhdGEoZSwiZGF0ZXBpY2tlciIsaSksaS5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoZSkpfSxfYXR0YWNobWVudHM6ZnVuY3Rpb24oZSxpKXt2YXIgcyxuLG8sYT10aGlzLl9nZXQoaSwiYXBwZW5kVGV4dCIpLHI9dGhpcy5fZ2V0KGksImlzUlRMIik7aS5hcHBlbmQmJmkuYXBwZW5kLnJlbW92ZSgpLGEmJihpLmFwcGVuZD10KCI8c3BhbiBjbGFzcz0nIit0aGlzLl9hcHBlbmRDbGFzcysiJz4iK2ErIjwvc3Bhbj4iKSxlW3I/ImJlZm9yZSI6ImFmdGVyIl0oaS5hcHBlbmQpKSxlLm9mZigiZm9jdXMiLHRoaXMuX3Nob3dEYXRlcGlja2VyKSxpLnRyaWdnZXImJmkudHJpZ2dlci5yZW1vdmUoKSxzPXRoaXMuX2dldChpLCJzaG93T24iKSwoImZvY3VzIj09PXN8fCJib3RoIj09PXMpJiZlLm9uKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLCgiYnV0dG9uIj09PXN8fCJib3RoIj09PXMpJiYobj10aGlzLl9nZXQoaSwiYnV0dG9uVGV4dCIpLG89dGhpcy5fZ2V0KGksImJ1dHRvbkltYWdlIiksaS50cmlnZ2VyPXQodGhpcy5fZ2V0KGksImJ1dHRvbkltYWdlT25seSIpP3QoIjxpbWcvPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuYXR0cih7c3JjOm8sYWx0Om4sdGl0bGU6bn0pOnQoIjxidXR0b24gdHlwZT0nYnV0dG9uJz48L2J1dHRvbj4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmh0bWwobz90KCI8aW1nLz4iKS5hdHRyKHtzcmM6byxhbHQ6bix0aXRsZTpufSk6bikpLGVbcj8iYmVmb3JlIjoiYWZ0ZXIiXShpLnRyaWdnZXIpLGkudHJpZ2dlci5vbigiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJnQuZGF0ZXBpY2tlci5fbGFzdElucHV0PT09ZVswXT90LmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk6dC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmdC5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPT1lWzBdPyh0LmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksdC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihlWzBdKSk6dC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihlWzBdKSwhMX0pKX0sX2F1dG9TaXplOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX2dldCh0LCJhdXRvU2l6ZSIpJiYhdC5pbmxpbmUpe3ZhciBlLGkscyxuLG89bmV3IERhdGUoMjAwOSwxMSwyMCksYT10aGlzLl9nZXQodCwiZGF0ZUZvcm1hdCIpO2EubWF0Y2goL1tETV0vKSYmKGU9ZnVuY3Rpb24odCl7Zm9yKGk9MCxzPTAsbj0wO3QubGVuZ3RoPm47bisrKXRbbl0ubGVuZ3RoPmkmJihpPXRbbl0ubGVuZ3RoLHM9bik7cmV0dXJuIHN9LG8uc2V0TW9udGgoZSh0aGlzLl9nZXQodCxhLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSxvLnNldERhdGUoZSh0aGlzLl9nZXQodCxhLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtby5nZXREYXkoKSkpLHQuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZSh0LG8pLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbihlLGkpe3ZhciBzPXQoZSk7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSl8fChzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQoaS5kcERpdiksdC5kYXRhKGUsImRhdGVwaWNrZXIiLGkpLHRoaXMuX3NldERhdGUoaSx0aGlzLl9nZXREZWZhdWx0RGF0ZShpKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoaSksaS5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoZSksaS5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpKX0sX2RpYWxvZ0RhdGVwaWNrZXI6ZnVuY3Rpb24oZSxpLHMsbixvKXt2YXIgcixoLGwsYyx1LGQ9dGhpcy5fZGlhbG9nSW5zdDtyZXR1cm4gZHx8KHRoaXMudXVpZCs9MSxyPSJkcCIrdGhpcy51dWlkLHRoaXMuX2RpYWxvZ0lucHV0PXQoIjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nIityKyInIHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OycvPiIpLHRoaXMuX2RpYWxvZ0lucHV0Lm9uKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLHQoImJvZHkiKS5hcHBlbmQodGhpcy5fZGlhbG9nSW5wdXQpLGQ9dGhpcy5fZGlhbG9nSW5zdD10aGlzLl9uZXdJbnN0KHRoaXMuX2RpYWxvZ0lucHV0LCExKSxkLnNldHRpbmdzPXt9LHQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwiZGF0ZXBpY2tlciIsZCkpLGEoZC5zZXR0aW5ncyxufHx7fSksaT1pJiZpLmNvbnN0cnVjdG9yPT09RGF0ZT90aGlzLl9mb3JtYXREYXRlKGQsaSk6aSx0aGlzLl9kaWFsb2dJbnB1dC52YWwoaSksdGhpcy5fcG9zPW8/by5sZW5ndGg/bzpbby5wYWdlWCxvLnBhZ2VZXTpudWxsLHRoaXMuX3Bvc3x8KGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxjPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCx0aGlzLl9wb3M9W2gvMi0xMDArYyxsLzItMTUwK3VdKSx0aGlzLl9kaWFsb2dJbnB1dC5jc3MoImxlZnQiLHRoaXMuX3Bvc1swXSsyMCsicHgiKS5jc3MoInRvcCIsdGhpcy5fcG9zWzFdKyJweCIpLGQuc2V0dGluZ3Mub25TZWxlY3Q9cyx0aGlzLl9pbkRpYWxvZz0hMCx0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKSx0aGlzLl9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSksdC5ibG9ja1VJJiZ0LmJsb2NrVUkodGhpcy5kcERpdiksdC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLCJkYXRlcGlja2VyIixkKSx0aGlzfSxfZGVzdHJveURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIGkscz10KGUpLG49dC5kYXRhKGUsImRhdGVwaWNrZXIiKTtzLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSYmKGk9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHQucmVtb3ZlRGF0YShlLCJkYXRlcGlja2VyIiksImlucHV0Ij09PWk/KG4uYXBwZW5kLnJlbW92ZSgpLG4udHJpZ2dlci5yZW1vdmUoKSxzLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5vZmYoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlcikub2ZmKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLm9mZigia2V5cHJlc3MiLHRoaXMuX2RvS2V5UHJlc3MpLm9mZigia2V5dXAiLHRoaXMuX2RvS2V5VXApKTooImRpdiI9PT1pfHwic3BhbiI9PT1pKSYmcy5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKSxwPT09biYmKHA9bnVsbCkpfSxfZW5hYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbihlKXt2YXIgaSxzLG49dChlKSxvPXQuZGF0YShlLCJkYXRlcGlja2VyIik7bi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwiaW5wdXQiPT09aT8oZS5kaXNhYmxlZD0hMSxvLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMX0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIxLjAiLGN1cnNvcjoiIn0pKTooImRpdiI9PT1pfHwic3BhbiI9PT1pKSYmKHM9bi5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpLHMuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxzLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucHJvcCgiZGlzYWJsZWQiLCExKSksdGhpcy5fZGlzYWJsZWRJbnB1dHM9dC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lP251bGw6dH0pKX0sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbj10KGUpLG89dC5kYXRhKGUsImRhdGVwaWNrZXIiKTtuLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSYmKGk9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCJpbnB1dCI9PT1pPyhlLmRpc2FibGVkPSEwLG8udHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkPSEwfSkuZW5kKCkuZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6IjAuNSIsY3Vyc29yOiJkZWZhdWx0In0pKTooImRpdiI9PT1pfHwic3BhbiI9PT1pKSYmKHM9bi5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpLHMuY2hpbGRyZW4oKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxzLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucHJvcCgiZGlzYWJsZWQiLCEwKSksdGhpcy5fZGlzYWJsZWRJbnB1dHM9dC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lP251bGw6dH0pLHRoaXMuX2Rpc2FibGVkSW5wdXRzW3RoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aF09ZSl9LF9pc0Rpc2FibGVkRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTtmb3IodmFyIGU9MDt0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg+ZTtlKyspaWYodGhpcy5fZGlzYWJsZWRJbnB1dHNbZV09PT10KXJldHVybiEwO3JldHVybiExfSxfZ2V0SW5zdDpmdW5jdGlvbihlKXt0cnl7cmV0dXJuIHQuZGF0YShlLCJkYXRlcGlja2VyIil9Y2F0Y2goaSl7dGhyb3ciTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIifX0sX29wdGlvbkRhdGVwaWNrZXI6ZnVuY3Rpb24oZSxpLHMpe3ZhciBuLG8scixoLGw9dGhpcy5fZ2V0SW5zdChlKTtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgaT8iZGVmYXVsdHMiPT09aT90LmV4dGVuZCh7fSx0LmRhdGVwaWNrZXIuX2RlZmF1bHRzKTpsPyJhbGwiPT09aT90LmV4dGVuZCh7fSxsLnNldHRpbmdzKTp0aGlzLl9nZXQobCxpKTpudWxsOihuPWl8fHt9LCJzdHJpbmciPT10eXBlb2YgaSYmKG49e30sbltpXT1zKSxsJiYodGhpcy5fY3VySW5zdD09PWwmJnRoaXMuX2hpZGVEYXRlcGlja2VyKCksbz10aGlzLl9nZXREYXRlRGF0ZXBpY2tlcihlLCEwKSxyPXRoaXMuX2dldE1pbk1heERhdGUobCwibWluIiksaD10aGlzLl9nZXRNaW5NYXhEYXRlKGwsIm1heCIpLGEobC5zZXR0aW5ncyxuKSxudWxsIT09ciYmdm9pZCAwIT09bi5kYXRlRm9ybWF0JiZ2b2lkIDA9PT1uLm1pbkRhdGUmJihsLnNldHRpbmdzLm1pbkRhdGU9dGhpcy5fZm9ybWF0RGF0ZShsLHIpKSxudWxsIT09aCYmdm9pZCAwIT09bi5kYXRlRm9ybWF0JiZ2b2lkIDA9PT1uLm1heERhdGUmJihsLnNldHRpbmdzLm1heERhdGU9dGhpcy5fZm9ybWF0RGF0ZShsLGgpKSwiZGlzYWJsZWQiaW4gbiYmKG4uZGlzYWJsZWQ/dGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoZSk6dGhpcy5fZW5hYmxlRGF0ZXBpY2tlcihlKSksdGhpcy5fYXR0YWNobWVudHModChlKSxsKSx0aGlzLl9hdXRvU2l6ZShsKSx0aGlzLl9zZXREYXRlKGwsbyksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGwpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIobCkpLHZvaWQgMCl9LF9jaGFuZ2VEYXRlcGlja2VyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9vcHRpb25EYXRlcGlja2VyKHQsZSxpKX0sX3JlZnJlc2hEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldEluc3QodCk7ZSYmdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihlKX0sX3NldERhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0SW5zdCh0KTtpJiYodGhpcy5fc2V0RGF0ZShpLGUpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaSksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGkpKX0sX2dldERhdGVEYXRlcGlja2VyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0SW5zdCh0KTtyZXR1cm4gaSYmIWkuaW5saW5lJiZ0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGksZSksaT90aGlzLl9nZXREYXRlKGkpOm51bGx9LF9kb0tleURvd246ZnVuY3Rpb24oZSl7dmFyIGkscyxuLG89dC5kYXRlcGlja2VyLl9nZXRJbnN0KGUudGFyZ2V0KSxhPSEwLHI9by5kcERpdi5pcygiLnVpLWRhdGVwaWNrZXItcnRsIik7aWYoby5fa2V5RXZlbnQ9ITAsdC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZylzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIDk6dC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLGE9ITE7YnJlYWs7Y2FzZSAxMzpyZXR1cm4gbj10KCJ0ZC4iK3QuZGF0ZXBpY2tlci5fZGF5T3ZlckNsYXNzKyI6bm90KC4iK3QuZGF0ZXBpY2tlci5fY3VycmVudENsYXNzKyIpIixvLmRwRGl2KSxuWzBdJiZ0LmRhdGVwaWNrZXIuX3NlbGVjdERheShlLnRhcmdldCxvLnNlbGVjdGVkTW9udGgsby5zZWxlY3RlZFllYXIsblswXSksaT10LmRhdGVwaWNrZXIuX2dldChvLCJvblNlbGVjdCIpLGk/KHM9dC5kYXRlcGlja2VyLl9mb3JtYXREYXRlKG8pLGkuYXBwbHkoby5pbnB1dD9vLmlucHV0WzBdOm51bGwsW3Msb10pKTp0LmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksITE7Y2FzZSAyNzp0LmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7YnJlYWs7Y2FzZSAzMzp0LmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQsZS5jdHJsS2V5Py10LmRhdGVwaWNrZXIuX2dldChvLCJzdGVwQmlnTW9udGhzIik6LXQuZGF0ZXBpY2tlci5fZ2V0KG8sInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzQ6dC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LGUuY3RybEtleT8rdC5kYXRlcGlja2VyLl9nZXQobywic3RlcEJpZ01vbnRocyIpOit0LmRhdGVwaWNrZXIuX2dldChvLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM1OihlLmN0cmxLZXl8fGUubWV0YUtleSkmJnQuZGF0ZXBpY2tlci5fY2xlYXJEYXRlKGUudGFyZ2V0KSxhPWUuY3RybEtleXx8ZS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzY6KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmdC5kYXRlcGlja2VyLl9nb3RvVG9kYXkoZS50YXJnZXQpLGE9ZS5jdHJsS2V5fHxlLm1ldGFLZXk7YnJlYWs7Y2FzZSAzNzooZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiZ0LmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQscj8xOi0xLCJEIiksYT1lLmN0cmxLZXl8fGUubWV0YUtleSxlLm9yaWdpbmFsRXZlbnQuYWx0S2V5JiZ0LmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQsZS5jdHJsS2V5Py10LmRhdGVwaWNrZXIuX2dldChvLCJzdGVwQmlnTW9udGhzIik6LXQuZGF0ZXBpY2tlci5fZ2V0KG8sInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgMzg6KGUuY3RybEtleXx8ZS5tZXRhS2V5KSYmdC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGUudGFyZ2V0LC03LCJEIiksYT1lLmN0cmxLZXl8fGUubWV0YUtleTticmVhaztjYXNlIDM5OihlLmN0cmxLZXl8fGUubWV0YUtleSkmJnQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCxyPy0xOjEsIkQiKSxhPWUuY3RybEtleXx8ZS5tZXRhS2V5LGUub3JpZ2luYWxFdmVudC5hbHRLZXkmJnQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShlLnRhcmdldCxlLmN0cmxLZXk/K3QuZGF0ZXBpY2tlci5fZ2V0KG8sInN0ZXBCaWdNb250aHMiKTordC5kYXRlcGlja2VyLl9nZXQobywic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSA0MDooZS5jdHJsS2V5fHxlLm1ldGFLZXkpJiZ0LmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZS50YXJnZXQsNywiRCIpLGE9ZS5jdHJsS2V5fHxlLm1ldGFLZXk7YnJlYWs7ZGVmYXVsdDphPSExfWVsc2UgMzY9PT1lLmtleUNvZGUmJmUuY3RybEtleT90LmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRoaXMpOmE9ITE7YSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKX0sX2RvS2V5UHJlc3M6ZnVuY3Rpb24oZSl7dmFyIGkscyxuPXQuZGF0ZXBpY2tlci5fZ2V0SW5zdChlLnRhcmdldCk7cmV0dXJuIHQuZGF0ZXBpY2tlci5fZ2V0KG4sImNvbnN0cmFpbklucHV0Iik/KGk9dC5kYXRlcGlja2VyLl9wb3NzaWJsZUNoYXJzKHQuZGF0ZXBpY2tlci5fZ2V0KG4sImRhdGVGb3JtYXQiKSkscz1TdHJpbmcuZnJvbUNoYXJDb2RlKG51bGw9PWUuY2hhckNvZGU/ZS5rZXlDb2RlOmUuY2hhckNvZGUpLGUuY3RybEtleXx8ZS5tZXRhS2V5fHwiICI+c3x8IWl8fGkuaW5kZXhPZihzKT4tMSk6dm9pZCAwfSxfZG9LZXlVcDpmdW5jdGlvbihlKXt2YXIgaSxzPXQuZGF0ZXBpY2tlci5fZ2V0SW5zdChlLnRhcmdldCk7aWYocy5pbnB1dC52YWwoKSE9PXMubGFzdFZhbCl0cnl7aT10LmRhdGVwaWNrZXIucGFyc2VEYXRlKHQuZGF0ZXBpY2tlci5fZ2V0KHMsImRhdGVGb3JtYXQiKSxzLmlucHV0P3MuaW5wdXQudmFsKCk6bnVsbCx0LmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhzKSksaSYmKHQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChzKSx0LmRhdGVwaWNrZXIuX3VwZGF0ZUFsdGVybmF0ZShzKSx0LmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIocykpfWNhdGNoKG4pe31yZXR1cm4hMH0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKGUpe2lmKGU9ZS50YXJnZXR8fGUsImlucHV0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKGU9dCgiaW5wdXQiLGUucGFyZW50Tm9kZSlbMF0pLCF0LmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGUpJiZ0LmRhdGVwaWNrZXIuX2xhc3RJbnB1dCE9PWUpe3ZhciBzLG4sbyxyLGgsbCxjO3M9dC5kYXRlcGlja2VyLl9nZXRJbnN0KGUpLHQuZGF0ZXBpY2tlci5fY3VySW5zdCYmdC5kYXRlcGlja2VyLl9jdXJJbnN0IT09cyYmKHQuZGF0ZXBpY2tlci5fY3VySW5zdC5kcERpdi5zdG9wKCEwLCEwKSxzJiZ0LmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZ0LmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKHQuZGF0ZXBpY2tlci5fY3VySW5zdC5pbnB1dFswXSkpLG49dC5kYXRlcGlja2VyLl9nZXQocywiYmVmb3JlU2hvdyIpLG89bj9uLmFwcGx5KGUsW2Usc10pOnt9LG8hPT0hMSYmKGEocy5zZXR0aW5ncyxvKSxzLmxhc3RWYWw9bnVsbCx0LmRhdGVwaWNrZXIuX2xhc3RJbnB1dD1lLHQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChzKSx0LmRhdGVwaWNrZXIuX2luRGlhbG9nJiYoZS52YWx1ZT0iIiksdC5kYXRlcGlja2VyLl9wb3N8fCh0LmRhdGVwaWNrZXIuX3Bvcz10LmRhdGVwaWNrZXIuX2ZpbmRQb3MoZSksdC5kYXRlcGlja2VyLl9wb3NbMV0rPWUub2Zmc2V0SGVpZ2h0KSxyPSExLHQoZSkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gcnw9ImZpeGVkIj09PXQodGhpcykuY3NzKCJwb3NpdGlvbiIpLCFyfSksaD17bGVmdDp0LmRhdGVwaWNrZXIuX3Bvc1swXSx0b3A6dC5kYXRlcGlja2VyLl9wb3NbMV19LHQuZGF0ZXBpY2tlci5fcG9zPW51bGwscy5kcERpdi5lbXB0eSgpLHMuZHBEaXYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6ImJsb2NrIix0b3A6Ii0xMDAwcHgifSksdC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKHMpLGg9dC5kYXRlcGlja2VyLl9jaGVja09mZnNldChzLGgscikscy5kcERpdi5jc3Moe3Bvc2l0aW9uOnQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJnQuYmxvY2tVST8ic3RhdGljIjpyPyJmaXhlZCI6ImFic29sdXRlIixkaXNwbGF5OiJub25lIixsZWZ0OmgubGVmdCsicHgiLHRvcDpoLnRvcCsicHgifSkscy5pbmxpbmV8fChsPXQuZGF0ZXBpY2tlci5fZ2V0KHMsInNob3dBbmltIiksYz10LmRhdGVwaWNrZXIuX2dldChzLCJkdXJhdGlvbiIpLHMuZHBEaXYuY3NzKCJ6LWluZGV4IixpKHQoZSkpKzEpLHQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmc9ITAsdC5lZmZlY3RzJiZ0LmVmZmVjdHMuZWZmZWN0W2xdP3MuZHBEaXYuc2hvdyhsLHQuZGF0ZXBpY2tlci5fZ2V0KHMsInNob3dPcHRpb25zIiksYyk6cy5kcERpdltsfHwic2hvdyJdKGw/YzpudWxsKSx0LmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQocykmJnMuaW5wdXQudHJpZ2dlcigiZm9jdXMiKSx0LmRhdGVwaWNrZXIuX2N1ckluc3Q9cykpfX0sX3VwZGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dGhpcy5tYXhSb3dzPTQscD1lLGUuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGUpKSx0aGlzLl9hdHRhY2hIYW5kbGVycyhlKTt2YXIgaSxzPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLG49c1sxXSxhPTE3LHI9ZS5kcERpdi5maW5kKCIuIit0aGlzLl9kYXlPdmVyQ2xhc3MrIiBhIik7ci5sZW5ndGg+MCYmby5hcHBseShyLmdldCgwKSksZS5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgiIiksbj4xJiZlLmRwRGl2LmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLSIrbikuY3NzKCJ3aWR0aCIsYSpuKyJlbSIpLGUuZHBEaXZbKDEhPT1zWzBdfHwxIT09c1sxXT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItbXVsdGkiKSxlLmRwRGl2Wyh0aGlzLl9nZXQoZSwiaXNSVEwiKT8iYWRkIjoicmVtb3ZlIikrIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIiksZT09PXQuZGF0ZXBpY2tlci5fY3VySW5zdCYmdC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmdC5kYXRlcGlja2VyLl9zaG91bGRGb2N1c0lucHV0KGUpJiZlLmlucHV0LnRyaWdnZXIoImZvY3VzIiksZS55ZWFyc2h0bWwmJihpPWUueWVhcnNodG1sLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPT09ZS55ZWFyc2h0bWwmJmUueWVhcnNodG1sJiZlLmRwRGl2LmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLXllYXI6Zmlyc3QiKS5yZXBsYWNlV2l0aChlLnllYXJzaHRtbCksaT1lLnllYXJzaHRtbD1udWxsfSwwKSl9LF9zaG91bGRGb2N1c0lucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmlucHV0JiZ0LmlucHV0LmlzKCI6dmlzaWJsZSIpJiYhdC5pbnB1dC5pcygiOmRpc2FibGVkIikmJiF0LmlucHV0LmlzKCI6Zm9jdXMiKX0sX2NoZWNrT2Zmc2V0OmZ1bmN0aW9uKGUsaSxzKXt2YXIgbj1lLmRwRGl2Lm91dGVyV2lkdGgoKSxvPWUuZHBEaXYub3V0ZXJIZWlnaHQoKSxhPWUuaW5wdXQ/ZS5pbnB1dC5vdXRlcldpZHRoKCk6MCxyPWUuaW5wdXQ/ZS5pbnB1dC5vdXRlckhlaWdodCgpOjAsaD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgrKHM/MDp0KGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpLGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCsocz8wOnQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTtyZXR1cm4gaS5sZWZ0LT10aGlzLl9nZXQoZSwiaXNSVEwiKT9uLWE6MCxpLmxlZnQtPXMmJmkubGVmdD09PWUuaW5wdXQub2Zmc2V0KCkubGVmdD90KGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk6MCxpLnRvcC09cyYmaS50b3A9PT1lLmlucHV0Lm9mZnNldCgpLnRvcCtyP3QoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOjAsaS5sZWZ0LT1NYXRoLm1pbihpLmxlZnQsaS5sZWZ0K24+aCYmaD5uP01hdGguYWJzKGkubGVmdCtuLWgpOjApLGkudG9wLT1NYXRoLm1pbihpLnRvcCxpLnRvcCtvPmwmJmw+bz9NYXRoLmFicyhvK3IpOjApLGl9LF9maW5kUG9zOmZ1bmN0aW9uKGUpe2Zvcih2YXIgaSxzPXRoaXMuX2dldEluc3QoZSksbj10aGlzLl9nZXQocywiaXNSVEwiKTtlJiYoImhpZGRlbiI9PT1lLnR5cGV8fDEhPT1lLm5vZGVUeXBlfHx0LmV4cHIuZmlsdGVycy5oaWRkZW4oZSkpOyllPWVbbj8icHJldmlvdXNTaWJsaW5nIjoibmV4dFNpYmxpbmciXTtyZXR1cm4gaT10KGUpLm9mZnNldCgpLFtpLmxlZnQsaS50b3BdfSxfaGlkZURhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7dmFyIGkscyxuLG8sYT10aGlzLl9jdXJJbnN0OyFhfHxlJiZhIT09dC5kYXRhKGUsImRhdGVwaWNrZXIiKXx8dGhpcy5fZGF0ZXBpY2tlclNob3dpbmcmJihpPXRoaXMuX2dldChhLCJzaG93QW5pbSIpLHM9dGhpcy5fZ2V0KGEsImR1cmF0aW9uIiksbj1mdW5jdGlvbigpe3QuZGF0ZXBpY2tlci5fdGlkeURpYWxvZyhhKX0sdC5lZmZlY3RzJiYodC5lZmZlY3RzLmVmZmVjdFtpXXx8dC5lZmZlY3RzW2ldKT9hLmRwRGl2LmhpZGUoaSx0LmRhdGVwaWNrZXIuX2dldChhLCJzaG93T3B0aW9ucyIpLHMsbik6YS5kcERpdlsic2xpZGVEb3duIj09PWk/InNsaWRlVXAiOiJmYWRlSW4iPT09aT8iZmFkZU91dCI6ImhpZGUiXShpP3M6bnVsbCxuKSxpfHxuKCksdGhpcy5fZGF0ZXBpY2tlclNob3dpbmc9ITEsbz10aGlzLl9nZXQoYSwib25DbG9zZSIpLG8mJm8uYXBwbHkoYS5pbnB1dD9hLmlucHV0WzBdOm51bGwsW2EuaW5wdXQ/YS5pbnB1dC52YWwoKToiIixhXSksdGhpcy5fbGFzdElucHV0PW51bGwsdGhpcy5faW5EaWFsb2cmJih0aGlzLl9kaWFsb2dJbnB1dC5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiMCIsdG9wOiItMTAwcHgifSksdC5ibG9ja1VJJiYodC51bmJsb2NrVUkoKSx0KCJib2R5IikuYXBwZW5kKHRoaXMuZHBEaXYpKSksdGhpcy5faW5EaWFsb2c9ITEpfSxfdGlkeURpYWxvZzpmdW5jdGlvbih0KXt0LmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKS5vZmYoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIil9LF9jaGVja0V4dGVybmFsQ2xpY2s6ZnVuY3Rpb24oZSl7aWYodC5kYXRlcGlja2VyLl9jdXJJbnN0KXt2YXIgaT10KGUudGFyZ2V0KSxzPXQuZGF0ZXBpY2tlci5fZ2V0SW5zdChpWzBdKTsoaVswXS5pZCE9PXQuZGF0ZXBpY2tlci5fbWFpbkRpdklkJiYwPT09aS5wYXJlbnRzKCIjIit0LmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoJiYhaS5oYXNDbGFzcyh0LmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSYmIWkuY2xvc2VzdCgiLiIrdC5kYXRlcGlja2VyLl90cmlnZ2VyQ2xhc3MpLmxlbmd0aCYmdC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmKCF0LmRhdGVwaWNrZXIuX2luRGlhbG9nfHwhdC5ibG9ja1VJKXx8aS5oYXNDbGFzcyh0LmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSYmdC5kYXRlcGlja2VyLl9jdXJJbnN0IT09cykmJnQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX19LF9hZGp1c3REYXRlOmZ1bmN0aW9uKGUsaSxzKXt2YXIgbj10KGUpLG89dGhpcy5fZ2V0SW5zdChuWzBdKTt0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihuWzBdKXx8KHRoaXMuX2FkanVzdEluc3REYXRlKG8saSsoIk0iPT09cz90aGlzLl9nZXQobywic2hvd0N1cnJlbnRBdFBvcyIpOjApLHMpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIobykpfSxfZ290b1RvZGF5OmZ1bmN0aW9uKGUpe3ZhciBpLHM9dChlKSxuPXRoaXMuX2dldEluc3Qoc1swXSk7dGhpcy5fZ2V0KG4sImdvdG9DdXJyZW50IikmJm4uY3VycmVudERheT8obi5zZWxlY3RlZERheT1uLmN1cnJlbnREYXksbi5kcmF3TW9udGg9bi5zZWxlY3RlZE1vbnRoPW4uY3VycmVudE1vbnRoLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9bi5jdXJyZW50WWVhcik6KGk9bmV3IERhdGUsbi5zZWxlY3RlZERheT1pLmdldERhdGUoKSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9aS5nZXRNb250aCgpLG4uZHJhd1llYXI9bi5zZWxlY3RlZFllYXI9aS5nZXRGdWxsWWVhcigpKSx0aGlzLl9ub3RpZnlDaGFuZ2UobiksdGhpcy5fYWRqdXN0RGF0ZShzKX0sX3NlbGVjdE1vbnRoWWVhcjpmdW5jdGlvbihlLGkscyl7dmFyIG49dChlKSxvPXRoaXMuX2dldEluc3QoblswXSk7b1sic2VsZWN0ZWQiKygiTSI9PT1zPyJNb250aCI6IlllYXIiKV09b1siZHJhdyIrKCJNIj09PXM/Ik1vbnRoIjoiWWVhciIpXT1wYXJzZUludChpLm9wdGlvbnNbaS5zZWxlY3RlZEluZGV4XS52YWx1ZSwxMCksdGhpcy5fbm90aWZ5Q2hhbmdlKG8pLHRoaXMuX2FkanVzdERhdGUobil9LF9zZWxlY3REYXk6ZnVuY3Rpb24oZSxpLHMsbil7dmFyIG8sYT10KGUpO3QobikuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpfHx0aGlzLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihhWzBdKXx8KG89dGhpcy5fZ2V0SW5zdChhWzBdKSxvLnNlbGVjdGVkRGF5PW8uY3VycmVudERheT10KCJhIixuKS5odG1sKCksby5zZWxlY3RlZE1vbnRoPW8uY3VycmVudE1vbnRoPWksby5zZWxlY3RlZFllYXI9by5jdXJyZW50WWVhcj1zLHRoaXMuX3NlbGVjdERhdGUoZSx0aGlzLl9mb3JtYXREYXRlKG8sby5jdXJyZW50RGF5LG8uY3VycmVudE1vbnRoLG8uY3VycmVudFllYXIpKSl9LF9jbGVhckRhdGU6ZnVuY3Rpb24oZSl7dmFyIGk9dChlKTt0aGlzLl9zZWxlY3REYXRlKGksIiIpfSxfc2VsZWN0RGF0ZTpmdW5jdGlvbihlLGkpe3ZhciBzLG49dChlKSxvPXRoaXMuX2dldEluc3QoblswXSk7aT1udWxsIT1pP2k6dGhpcy5fZm9ybWF0RGF0ZShvKSxvLmlucHV0JiZvLmlucHV0LnZhbChpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUobykscz10aGlzLl9nZXQobywib25TZWxlY3QiKSxzP3MuYXBwbHkoby5pbnB1dD9vLmlucHV0WzBdOm51bGwsW2ksb10pOm8uaW5wdXQmJm8uaW5wdXQudHJpZ2dlcigiY2hhbmdlIiksby5pbmxpbmU/dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihvKToodGhpcy5faGlkZURhdGVwaWNrZXIoKSx0aGlzLl9sYXN0SW5wdXQ9by5pbnB1dFswXSwib2JqZWN0IiE9dHlwZW9mIG8uaW5wdXRbMF0mJm8uaW5wdXQudHJpZ2dlcigiZm9jdXMiKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCl9LF91cGRhdGVBbHRlcm5hdGU6ZnVuY3Rpb24oZSl7dmFyIGkscyxuLG89dGhpcy5fZ2V0KGUsImFsdEZpZWxkIik7byYmKGk9dGhpcy5fZ2V0KGUsImFsdEZvcm1hdCIpfHx0aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpLHM9dGhpcy5fZ2V0RGF0ZShlKSxuPXRoaXMuZm9ybWF0RGF0ZShpLHMsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKSx0KG8pLnZhbChuKSl9LG5vV2Vla2VuZHM6ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm5bZT4wJiY2PmUsIiJdfSxpc284NjAxV2VlazpmdW5jdGlvbih0KXt2YXIgZSxpPW5ldyBEYXRlKHQuZ2V0VGltZSgpKTtyZXR1cm4gaS5zZXREYXRlKGkuZ2V0RGF0ZSgpKzQtKGkuZ2V0RGF5KCl8fDcpKSxlPWkuZ2V0VGltZSgpLGkuc2V0TW9udGgoMCksaS5zZXREYXRlKDEpLE1hdGguZmxvb3IoTWF0aC5yb3VuZCgoZS1pKS84NjRlNSkvNykrMX0scGFyc2VEYXRlOmZ1bmN0aW9uKGUsaSxzKXtpZihudWxsPT1lfHxudWxsPT1pKXRocm93IkludmFsaWQgYXJndW1lbnRzIjtpZihpPSJvYmplY3QiPT10eXBlb2YgaT8iIitpOmkrIiIsIiI9PT1pKXJldHVybiBudWxsO3ZhciBuLG8sYSxyLGg9MCxsPShzP3Muc2hvcnRZZWFyQ3V0b2ZmOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmYsYz0ic3RyaW5nIiE9dHlwZW9mIGw/bDoobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGwsMTApLHU9KHM/cy5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGQ9KHM/cy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMscD0ocz9zLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LGY9KHM/cy5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLG09LTEsZz0tMSx2PS0xLF89LTEsYj0hMSx5PWZ1bmN0aW9uKHQpe3ZhciBpPWUubGVuZ3RoPm4rMSYmZS5jaGFyQXQobisxKT09PXQ7cmV0dXJuIGkmJm4rKyxpfSx3PWZ1bmN0aW9uKHQpe3ZhciBlPXkodCkscz0iQCI9PT10PzE0OiIhIj09PXQ/MjA6InkiPT09dCYmZT80OiJvIj09PXQ/MzoyLG49InkiPT09dD9zOjEsbz1SZWdFeHAoIl5cXGR7IituKyIsIitzKyJ9IiksYT1pLnN1YnN0cmluZyhoKS5tYXRjaChvKTtpZighYSl0aHJvdyJNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAiK2g7cmV0dXJuIGgrPWFbMF0ubGVuZ3RoLHBhcnNlSW50KGFbMF0sMTApfSx4PWZ1bmN0aW9uKGUscyxuKXt2YXIgbz0tMSxhPXQubWFwKHkoZSk/bjpzLGZ1bmN0aW9uKHQsZSl7cmV0dXJuW1tlLHRdXX0pLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4tKHRbMV0ubGVuZ3RoLWVbMV0ubGVuZ3RoKX0pO2lmKHQuZWFjaChhLGZ1bmN0aW9uKHQsZSl7dmFyIHM9ZVsxXTtyZXR1cm4gaS5zdWJzdHIoaCxzLmxlbmd0aCkudG9Mb3dlckNhc2UoKT09PXMudG9Mb3dlckNhc2UoKT8obz1lWzBdLGgrPXMubGVuZ3RoLCExKTp2b2lkIDB9KSwtMSE9PW8pcmV0dXJuIG8rMTt0aHJvdyJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIitofSxrPWZ1bmN0aW9uKCl7aWYoaS5jaGFyQXQoaCkhPT1lLmNoYXJBdChuKSl0aHJvdyJVbmV4cGVjdGVkIGxpdGVyYWwgYXQgcG9zaXRpb24gIitoO2grK307Zm9yKG49MDtlLmxlbmd0aD5uO24rKylpZihiKSInIiE9PWUuY2hhckF0KG4pfHx5KCInIik/aygpOmI9ITE7ZWxzZSBzd2l0Y2goZS5jaGFyQXQobikpe2Nhc2UiZCI6dj13KCJkIik7YnJlYWs7Y2FzZSJEIjp4KCJEIix1LGQpO2JyZWFrO2Nhc2UibyI6Xz13KCJvIik7YnJlYWs7Y2FzZSJtIjpnPXcoIm0iKTticmVhaztjYXNlIk0iOmc9eCgiTSIscCxmKTticmVhaztjYXNlInkiOm09dygieSIpO2JyZWFrO2Nhc2UiQCI6cj1uZXcgRGF0ZSh3KCJAIikpLG09ci5nZXRGdWxsWWVhcigpLGc9ci5nZXRNb250aCgpKzEsdj1yLmdldERhdGUoKTticmVhaztjYXNlIiEiOnI9bmV3IERhdGUoKHcoIiEiKS10aGlzLl90aWNrc1RvMTk3MCkvMWU0KSxtPXIuZ2V0RnVsbFllYXIoKSxnPXIuZ2V0TW9udGgoKSsxLHY9ci5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjp5KCInIik/aygpOmI9ITA7YnJlYWs7ZGVmYXVsdDprKCl9aWYoaS5sZW5ndGg+aCYmKGE9aS5zdWJzdHIoaCksIS9eXHMrLy50ZXN0KGEpKSl0aHJvdyJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6ICIrYTtpZigtMT09PW0/bT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCk6MTAwPm0mJihtKz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCktKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCsoYz49bT8wOi0xMDApKSxfPi0xKWZvcihnPTEsdj1fOzspe2lmKG89dGhpcy5fZ2V0RGF5c0luTW9udGgobSxnLTEpLG8+PXYpYnJlYWs7ZysrLHYtPW99aWYocj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShtLGctMSx2KSksci5nZXRGdWxsWWVhcigpIT09bXx8ci5nZXRNb250aCgpKzEhPT1nfHxyLmdldERhdGUoKSE9PXYpdGhyb3ciSW52YWxpZCBkYXRlIjtyZXR1cm4gcn0sQVRPTToieXktbW0tZGQiLENPT0tJRToiRCwgZGQgTSB5eSIsSVNPXzg2MDE6Inl5LW1tLWRkIixSRkNfODIyOiJELCBkIE0geSIsUkZDXzg1MDoiREQsIGRkLU0teSIsUkZDXzEwMzY6IkQsIGQgTSB5IixSRkNfMTEyMzoiRCwgZCBNIHl5IixSRkNfMjgyMjoiRCwgZCBNIHl5IixSU1M6IkQsIGQgTSB5IixUSUNLUzoiISIsVElNRVNUQU1QOiJAIixXM0M6Inl5LW1tLWRkIixfdGlja3NUbzE5NzA6MWU3KjYwKjYwKjI0Kig3MTg2ODUrTWF0aC5mbG9vcig0OTIuNSktTWF0aC5mbG9vcigxOS43KStNYXRoLmZsb29yKDQuOTI1KSksZm9ybWF0RGF0ZTpmdW5jdGlvbih0LGUsaSl7aWYoIWUpcmV0dXJuIiI7dmFyIHMsbj0oaT9pLmRheU5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsbz0oaT9pLmRheU5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcyxhPShpP2kubW9udGhOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQscj0oaT9pLm1vbnRoTmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsaD1mdW5jdGlvbihlKXt2YXIgaT10Lmxlbmd0aD5zKzEmJnQuY2hhckF0KHMrMSk9PT1lO3JldHVybiBpJiZzKyssaX0sbD1mdW5jdGlvbih0LGUsaSl7dmFyIHM9IiIrZTtpZihoKHQpKWZvcig7aT5zLmxlbmd0aDspcz0iMCIrcztyZXR1cm4gc30sYz1mdW5jdGlvbih0LGUsaSxzKXtyZXR1cm4gaCh0KT9zW2VdOmlbZV19LHU9IiIsZD0hMTtpZihlKWZvcihzPTA7dC5sZW5ndGg+cztzKyspaWYoZCkiJyIhPT10LmNoYXJBdChzKXx8aCgiJyIpP3UrPXQuY2hhckF0KHMpOmQ9ITE7ZWxzZSBzd2l0Y2godC5jaGFyQXQocykpe2Nhc2UiZCI6dSs9bCgiZCIsZS5nZXREYXRlKCksMik7YnJlYWs7Y2FzZSJEIjp1Kz1jKCJEIixlLmdldERheSgpLG4sbyk7YnJlYWs7Y2FzZSJvIjp1Kz1sKCJvIixNYXRoLnJvdW5kKChuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpKS5nZXRUaW1lKCktbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMCkuZ2V0VGltZSgpKS84NjRlNSksMyk7YnJlYWs7Y2FzZSJtIjp1Kz1sKCJtIixlLmdldE1vbnRoKCkrMSwyKTticmVhaztjYXNlIk0iOnUrPWMoIk0iLGUuZ2V0TW9udGgoKSxhLHIpO2JyZWFrO2Nhc2UieSI6dSs9aCgieSIpP2UuZ2V0RnVsbFllYXIoKTooMTA+ZS5nZXRGdWxsWWVhcigpJTEwMD8iMCI6IiIpK2UuZ2V0RnVsbFllYXIoKSUxMDA7YnJlYWs7Y2FzZSJAIjp1Kz1lLmdldFRpbWUoKTticmVhaztjYXNlIiEiOnUrPTFlNCplLmdldFRpbWUoKSt0aGlzLl90aWNrc1RvMTk3MDticmVhaztjYXNlIiciOmgoIiciKT91Kz0iJyI6ZD0hMDticmVhaztkZWZhdWx0OnUrPXQuY2hhckF0KHMpfXJldHVybiB1fSxfcG9zc2libGVDaGFyczpmdW5jdGlvbih0KXt2YXIgZSxpPSIiLHM9ITEsbj1mdW5jdGlvbihpKXt2YXIgcz10Lmxlbmd0aD5lKzEmJnQuY2hhckF0KGUrMSk9PT1pO3JldHVybiBzJiZlKyssc307Zm9yKGU9MDt0Lmxlbmd0aD5lO2UrKylpZihzKSInIiE9PXQuY2hhckF0KGUpfHxuKCInIik/aSs9dC5jaGFyQXQoZSk6cz0hMTtlbHNlIHN3aXRjaCh0LmNoYXJBdChlKSl7Y2FzZSJkIjpjYXNlIm0iOmNhc2UieSI6Y2FzZSJAIjppKz0iMDEyMzQ1Njc4OSI7YnJlYWs7Y2FzZSJEIjpjYXNlIk0iOnJldHVybiBudWxsO2Nhc2UiJyI6bigiJyIpP2krPSInIjpzPSEwO2JyZWFrO2RlZmF1bHQ6aSs9dC5jaGFyQXQoZSl9cmV0dXJuIGl9LF9nZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dC5zZXR0aW5nc1tlXT90LnNldHRpbmdzW2VdOnRoaXMuX2RlZmF1bHRzW2VdfSxfc2V0RGF0ZUZyb21GaWVsZDpmdW5jdGlvbih0LGUpe2lmKHQuaW5wdXQudmFsKCkhPT10Lmxhc3RWYWwpe3ZhciBpPXRoaXMuX2dldCh0LCJkYXRlRm9ybWF0Iikscz10Lmxhc3RWYWw9dC5pbnB1dD90LmlucHV0LnZhbCgpOm51bGwsbj10aGlzLl9nZXREZWZhdWx0RGF0ZSh0KSxvPW4sYT10aGlzLl9nZXRGb3JtYXRDb25maWcodCk7dHJ5e289dGhpcy5wYXJzZURhdGUoaSxzLGEpfHxufWNhdGNoKHIpe3M9ZT8iIjpzfXQuc2VsZWN0ZWREYXk9by5nZXREYXRlKCksdC5kcmF3TW9udGg9dC5zZWxlY3RlZE1vbnRoPW8uZ2V0TW9udGgoKSx0LmRyYXdZZWFyPXQuc2VsZWN0ZWRZZWFyPW8uZ2V0RnVsbFllYXIoKSx0LmN1cnJlbnREYXk9cz9vLmdldERhdGUoKTowLHQuY3VycmVudE1vbnRoPXM/by5nZXRNb250aCgpOjAsdC5jdXJyZW50WWVhcj1zP28uZ2V0RnVsbFllYXIoKTowLHRoaXMuX2FkanVzdEluc3REYXRlKHQpfX0sX2dldERlZmF1bHREYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heCh0LHRoaXMuX2RldGVybWluZURhdGUodCx0aGlzLl9nZXQodCwiZGVmYXVsdERhdGUiKSxuZXcgRGF0ZSkpfSxfZGV0ZXJtaW5lRGF0ZTpmdW5jdGlvbihlLGkscyl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9bmV3IERhdGU7cmV0dXJuIGUuc2V0RGF0ZShlLmdldERhdGUoKSt0KSxlfSxvPWZ1bmN0aW9uKGkpe3RyeXtyZXR1cm4gdC5kYXRlcGlja2VyLnBhcnNlRGF0ZSh0LmRhdGVwaWNrZXIuX2dldChlLCJkYXRlRm9ybWF0IiksaSx0LmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhlKSl9Y2F0Y2gocyl7fWZvcih2YXIgbj0oaS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eYy8pP3QuZGF0ZXBpY2tlci5fZ2V0RGF0ZShlKTpudWxsKXx8bmV3IERhdGUsbz1uLmdldEZ1bGxZZWFyKCksYT1uLmdldE1vbnRoKCkscj1uLmdldERhdGUoKSxoPS8oWytcLV0/WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nLGw9aC5leGVjKGkpO2w7KXtzd2l0Y2gobFsyXXx8ImQiKXtjYXNlImQiOmNhc2UiRCI6cis9cGFyc2VJbnQobFsxXSwxMCk7YnJlYWs7Y2FzZSJ3IjpjYXNlIlciOnIrPTcqcGFyc2VJbnQobFsxXSwxMCk7YnJlYWs7Y2FzZSJtIjpjYXNlIk0iOmErPXBhcnNlSW50KGxbMV0sMTApLHI9TWF0aC5taW4ocix0LmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKG8sYSkpO2JyZWFrO2Nhc2UieSI6Y2FzZSJZIjpvKz1wYXJzZUludChsWzFdLDEwKSxyPU1hdGgubWluKHIsdC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aChvLGEpKX1sPWguZXhlYyhpKX1yZXR1cm4gbmV3IERhdGUobyxhLHIpfSxhPW51bGw9PWl8fCIiPT09aT9zOiJzdHJpbmciPT10eXBlb2YgaT9vKGkpOiJudW1iZXIiPT10eXBlb2YgaT9pc05hTihpKT9zOm4oaSk6bmV3IERhdGUoaS5nZXRUaW1lKCkpO3JldHVybiBhPWEmJiJJbnZhbGlkIERhdGUiPT0iIithP3M6YSxhJiYoYS5zZXRIb3VycygwKSxhLnNldE1pbnV0ZXMoMCksYS5zZXRTZWNvbmRzKDApLGEuc2V0TWlsbGlzZWNvbmRzKDApKSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChhKX0sX2RheWxpZ2h0U2F2aW5nQWRqdXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0Pyh0LnNldEhvdXJzKHQuZ2V0SG91cnMoKT4xMj90LmdldEhvdXJzKCkrMjowKSx0KTpudWxsfSxfc2V0RGF0ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9IWUsbj10LnNlbGVjdGVkTW9udGgsbz10LnNlbGVjdGVkWWVhcixhPXRoaXMuX3Jlc3RyaWN0TWluTWF4KHQsdGhpcy5fZGV0ZXJtaW5lRGF0ZSh0LGUsbmV3IERhdGUpKTt0LnNlbGVjdGVkRGF5PXQuY3VycmVudERheT1hLmdldERhdGUoKSx0LmRyYXdNb250aD10LnNlbGVjdGVkTW9udGg9dC5jdXJyZW50TW9udGg9YS5nZXRNb250aCgpLHQuZHJhd1llYXI9dC5zZWxlY3RlZFllYXI9dC5jdXJyZW50WWVhcj1hLmdldEZ1bGxZZWFyKCksbj09PXQuc2VsZWN0ZWRNb250aCYmbz09PXQuc2VsZWN0ZWRZZWFyfHxpfHx0aGlzLl9ub3RpZnlDaGFuZ2UodCksdGhpcy5fYWRqdXN0SW5zdERhdGUodCksdC5pbnB1dCYmdC5pbnB1dC52YWwocz8iIjp0aGlzLl9mb3JtYXREYXRlKHQpKX0sX2dldERhdGU6ZnVuY3Rpb24odCl7dmFyIGU9IXQuY3VycmVudFllYXJ8fHQuaW5wdXQmJiIiPT09dC5pbnB1dC52YWwoKT9udWxsOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHQuY3VycmVudFllYXIsdC5jdXJyZW50TW9udGgsdC5jdXJyZW50RGF5KSk7cmV0dXJuIGV9LF9hdHRhY2hIYW5kbGVyczpmdW5jdGlvbihlKXt2YXIgaT10aGlzLl9nZXQoZSwic3RlcE1vbnRocyIpLHM9IiMiK2UuaWQucmVwbGFjZSgvXFxcXC9nLCJcXCIpO2UuZHBEaXYuZmluZCgiW2RhdGEtaGFuZGxlcl0iKS5tYXAoZnVuY3Rpb24oKXt2YXIgZT17cHJldjpmdW5jdGlvbigpe3QuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShzLC1pLCJNIil9LG5leHQ6ZnVuY3Rpb24oKXt0LmRhdGVwaWNrZXIuX2FkanVzdERhdGUocywraSwiTSIpfSxoaWRlOmZ1bmN0aW9uKCl7dC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfSx0b2RheTpmdW5jdGlvbigpe3QuZGF0ZXBpY2tlci5fZ290b1RvZGF5KHMpfSxzZWxlY3REYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdC5kYXRlcGlja2VyLl9zZWxlY3REYXkocywrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwrdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLHRoaXMpLCExfSxzZWxlY3RNb250aDpmdW5jdGlvbigpe3JldHVybiB0LmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihzLHRoaXMsIk0iKSwhMX0sc2VsZWN0WWVhcjpmdW5jdGlvbigpe3JldHVybiB0LmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihzLHRoaXMsIlkiKSwhMX19O3QodGhpcykub24odGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtZXZlbnQiKSxlW3RoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWhhbmRsZXIiKV0pfSl9LF9nZW5lcmF0ZUhUTUw6ZnVuY3Rpb24odCl7dmFyIGUsaSxzLG4sbyxhLHIsaCxsLGMsdSxkLHAsZixtLGcsdixfLGIseSx3LHgsayxDLEQsVCxNLFMsSSxQLE4sQSxILHosTyxFLFcsRixMLFI9bmV3IERhdGUsaj10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShSLmdldEZ1bGxZZWFyKCksUi5nZXRNb250aCgpLFIuZ2V0RGF0ZSgpKSksWT10aGlzLl9nZXQodCwiaXNSVEwiKSxCPXRoaXMuX2dldCh0LCJzaG93QnV0dG9uUGFuZWwiKSxxPXRoaXMuX2dldCh0LCJoaWRlSWZOb1ByZXZOZXh0IiksSz10aGlzLl9nZXQodCwibmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCIpLFU9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHModCksVj10aGlzLl9nZXQodCwic2hvd0N1cnJlbnRBdFBvcyIpLCQ9dGhpcy5fZ2V0KHQsInN0ZXBNb250aHMiKSxKPTEhPT1VWzBdfHwxIT09VVsxXSxYPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHQuY3VycmVudERheT9uZXcgRGF0ZSh0LmN1cnJlbnRZZWFyLHQuY3VycmVudE1vbnRoLHQuY3VycmVudERheSk6bmV3IERhdGUoOTk5OSw5LDkpKSxHPXRoaXMuX2dldE1pbk1heERhdGUodCwibWluIiksUT10aGlzLl9nZXRNaW5NYXhEYXRlKHQsIm1heCIpLFo9dC5kcmF3TW9udGgtVix0ZT10LmRyYXdZZWFyO2lmKDA+WiYmKForPTEyLHRlLS0pLFEpZm9yKGU9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoUS5nZXRGdWxsWWVhcigpLFEuZ2V0TW9udGgoKS1VWzBdKlVbMV0rMSxRLmdldERhdGUoKSkpLGU9RyYmRz5lP0c6ZTt0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0ZSxaLDEpKT5lOylaLS0sMD5aJiYoWj0xMSx0ZS0tKTtmb3IodC5kcmF3TW9udGg9Wix0LmRyYXdZZWFyPXRlLGk9dGhpcy5fZ2V0KHQsInByZXZUZXh0IiksaT1LP3RoaXMuZm9ybWF0RGF0ZShpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHRlLFotJCwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKHQpKTppLHM9dGhpcy5fY2FuQWRqdXN0TW9udGgodCwtMSx0ZSxaKT8iPGEgY2xhc3M9J3VpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J3ByZXYnIGRhdGEtZXZlbnQ9J2NsaWNrJyB0aXRsZT0nIitpKyInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIrKFk/ImUiOiJ3IikrIic+IitpKyI8L3NwYW4+PC9hPiI6cT8iIjoiPGEgY2xhc3M9J3VpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkJyB0aXRsZT0nIitpKyInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIrKFk/ImUiOiJ3IikrIic+IitpKyI8L3NwYW4+PC9hPiIsbj10aGlzLl9nZXQodCwibmV4dFRleHQiKSxuPUs/dGhpcy5mb3JtYXREYXRlKG4sdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUodGUsWiskLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcodCkpOm4sbz10aGlzLl9jYW5BZGp1c3RNb250aCh0LDEsdGUsWik/IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSduZXh0JyBkYXRhLWV2ZW50PSdjbGljaycgdGl0bGU9JyIrbisiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJ3IjoiZSIpKyInPiIrbisiPC9zcGFuPjwvYT4iOnE/IiI6IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIrbisiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJ3IjoiZSIpKyInPiIrbisiPC9zcGFuPjwvYT4iLGE9dGhpcy5fZ2V0KHQsImN1cnJlbnRUZXh0Iikscj10aGlzLl9nZXQodCwiZ290b0N1cnJlbnQiKSYmdC5jdXJyZW50RGF5P1g6aixhPUs/dGhpcy5mb3JtYXREYXRlKGEscix0aGlzLl9nZXRGb3JtYXRDb25maWcodCkpOmEsaD10LmlubGluZT8iIjoiPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWNsb3NlIHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktcHJpbWFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J2hpZGUnIGRhdGEtZXZlbnQ9J2NsaWNrJz4iK3RoaXMuX2dldCh0LCJjbG9zZVRleHQiKSsiPC9idXR0b24+IixsPUI/IjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCc+IisoWT9oOiIiKSsodGhpcy5faXNJblJhbmdlKHQscik/IjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0ndWktZGF0ZXBpY2tlci1jdXJyZW50IHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktc2Vjb25kYXJ5IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ndG9kYXknIGRhdGEtZXZlbnQ9J2NsaWNrJz4iK2ErIjwvYnV0dG9uPiI6IiIpKyhZPyIiOmgpKyI8L2Rpdj4iOiIiLGM9cGFyc2VJbnQodGhpcy5fZ2V0KHQsImZpcnN0RGF5IiksMTApLGM9aXNOYU4oYyk/MDpjLHU9dGhpcy5fZ2V0KHQsInNob3dXZWVrIiksZD10aGlzLl9nZXQodCwiZGF5TmFtZXMiKSxwPXRoaXMuX2dldCh0LCJkYXlOYW1lc01pbiIpLGY9dGhpcy5fZ2V0KHQsIm1vbnRoTmFtZXMiKSxtPXRoaXMuX2dldCh0LCJtb250aE5hbWVzU2hvcnQiKSxnPXRoaXMuX2dldCh0LCJiZWZvcmVTaG93RGF5Iiksdj10aGlzLl9nZXQodCwic2hvd090aGVyTW9udGhzIiksXz10aGlzLl9nZXQodCwic2VsZWN0T3RoZXJNb250aHMiKSxiPXRoaXMuX2dldERlZmF1bHREYXRlKHQpLHk9IiIseD0wO1VbMF0+eDt4Kyspe2ZvcihrPSIiLHRoaXMubWF4Um93cz00LEM9MDtVWzFdPkM7QysrKXtpZihEPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHRlLFosdC5zZWxlY3RlZERheSkpLFQ9IiB1aS1jb3JuZXItYWxsIixNPSIiLEope2lmKE0rPSI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLWdyb3VwIixVWzFdPjEpc3dpdGNoKEMpe2Nhc2UgMDpNKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtZmlyc3QiLFQ9IiB1aS1jb3JuZXItIisoWT8icmlnaHQiOiJsZWZ0Iik7CmJyZWFrO2Nhc2UgVVsxXS0xOk0rPSIgdWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IixUPSIgdWktY29ybmVyLSIrKFk/ImxlZnQiOiJyaWdodCIpO2JyZWFrO2RlZmF1bHQ6TSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSIsVD0iIn1NKz0iJz4ifWZvcihNKz0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgiK1QrIic+IisoL2FsbHxsZWZ0Ly50ZXN0KFQpJiYwPT09eD9ZP286czoiIikrKC9hbGx8cmlnaHQvLnRlc3QoVCkmJjA9PT14P1k/czpvOiIiKSt0aGlzLl9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcih0LFosdGUsRyxRLHg+MHx8Qz4wLGYsbSkrIjwvZGl2Pjx0YWJsZSBjbGFzcz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPiIrIjx0cj4iLFM9dT8iPHRoIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz4iK3RoaXMuX2dldCh0LCJ3ZWVrSGVhZGVyIikrIjwvdGg+IjoiIix3PTA7Nz53O3crKylJPSh3K2MpJTcsUys9Ijx0aCBzY29wZT0nY29sJyIrKCh3K2MrNiklNz49NT8iIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstZW5kJyI6IiIpKyI+IisiPHNwYW4gdGl0bGU9JyIrZFtJXSsiJz4iK3BbSV0rIjwvc3Bhbj48L3RoPiI7Zm9yKE0rPVMrIjwvdHI+PC90aGVhZD48dGJvZHk+IixQPXRoaXMuX2dldERheXNJbk1vbnRoKHRlLFopLHRlPT09dC5zZWxlY3RlZFllYXImJlo9PT10LnNlbGVjdGVkTW9udGgmJih0LnNlbGVjdGVkRGF5PU1hdGgubWluKHQuc2VsZWN0ZWREYXksUCkpLE49KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aCh0ZSxaKS1jKzcpJTcsQT1NYXRoLmNlaWwoKE4rUCkvNyksSD1KP3RoaXMubWF4Um93cz5BP3RoaXMubWF4Um93czpBOkEsdGhpcy5tYXhSb3dzPUgsej10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0ZSxaLDEtTikpLE89MDtIPk87TysrKXtmb3IoTSs9Ijx0cj4iLEU9dT8iPHRkIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz4iK3RoaXMuX2dldCh0LCJjYWxjdWxhdGVXZWVrIikoeikrIjwvdGQ+IjoiIix3PTA7Nz53O3crKylXPWc/Zy5hcHBseSh0LmlucHV0P3QuaW5wdXRbMF06bnVsbCxbel0pOlshMCwiIl0sRj16LmdldE1vbnRoKCkhPT1aLEw9RiYmIV98fCFXWzBdfHxHJiZHPnp8fFEmJno+USxFKz0iPHRkIGNsYXNzPSciKygodytjKzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKEY/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKHouZ2V0VGltZSgpPT09RC5nZXRUaW1lKCkmJlo9PT10LnNlbGVjdGVkTW9udGgmJnQuX2tleUV2ZW50fHxiLmdldFRpbWUoKT09PXouZ2V0VGltZSgpJiZiLmdldFRpbWUoKT09PUQuZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhMPyIgIit0aGlzLl91bnNlbGVjdGFibGVDbGFzcysiIHVpLXN0YXRlLWRpc2FibGVkIjoiIikrKEYmJiF2PyIiOiIgIitXWzFdKyh6LmdldFRpbWUoKT09PVguZ2V0VGltZSgpPyIgIit0aGlzLl9jdXJyZW50Q2xhc3M6IiIpKyh6LmdldFRpbWUoKT09PWouZ2V0VGltZSgpPyIgdWktZGF0ZXBpY2tlci10b2RheSI6IiIpKSsiJyIrKEYmJiF2fHwhV1syXT8iIjoiIHRpdGxlPSciK1dbMl0ucmVwbGFjZSgvJy9nLCImIzM5OyIpKyInIikrKEw/IiI6IiBkYXRhLWhhbmRsZXI9J3NlbGVjdERheScgZGF0YS1ldmVudD0nY2xpY2snIGRhdGEtbW9udGg9JyIrei5nZXRNb250aCgpKyInIGRhdGEteWVhcj0nIit6LmdldEZ1bGxZZWFyKCkrIiciKSsiPiIrKEYmJiF2PyImI3hhMDsiOkw/IjxzcGFuIGNsYXNzPSd1aS1zdGF0ZS1kZWZhdWx0Jz4iK3ouZ2V0RGF0ZSgpKyI8L3NwYW4+IjoiPGEgY2xhc3M9J3VpLXN0YXRlLWRlZmF1bHQiKyh6LmdldFRpbWUoKT09PWouZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKHouZ2V0VGltZSgpPT09WC5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1hY3RpdmUiOiIiKSsoRj8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyInIGhyZWY9JyMnPiIrei5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLHouc2V0RGF0ZSh6LmdldERhdGUoKSsxKSx6PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHopO00rPUUrIjwvdHI+In1aKyssWj4xMSYmKFo9MCx0ZSsrKSxNKz0iPC90Ym9keT48L3RhYmxlPiIrKEo/IjwvZGl2PiIrKFVbMF0+MCYmQz09PVVbMV0tMT8iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1yb3ctYnJlYWsnPjwvZGl2PiI6IiIpOiIiKSxrKz1NfXkrPWt9cmV0dXJuIHkrPWwsdC5fa2V5RXZlbnQ9ITEseX0sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKHQsZSxpLHMsbixvLGEscil7dmFyIGgsbCxjLHUsZCxwLGYsbSxnPXRoaXMuX2dldCh0LCJjaGFuZ2VNb250aCIpLHY9dGhpcy5fZ2V0KHQsImNoYW5nZVllYXIiKSxfPXRoaXMuX2dldCh0LCJzaG93TW9udGhBZnRlclllYXIiKSxiPSI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLXRpdGxlJz4iLHk9IiI7aWYob3x8IWcpeSs9IjxzcGFuIGNsYXNzPSd1aS1kYXRlcGlja2VyLW1vbnRoJz4iK2FbZV0rIjwvc3Bhbj4iO2Vsc2V7Zm9yKGg9cyYmcy5nZXRGdWxsWWVhcigpPT09aSxsPW4mJm4uZ2V0RnVsbFllYXIoKT09PWkseSs9IjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnIGRhdGEtaGFuZGxlcj0nc2VsZWN0TW9udGgnIGRhdGEtZXZlbnQ9J2NoYW5nZSc+IixjPTA7MTI+YztjKyspKCFofHxjPj1zLmdldE1vbnRoKCkpJiYoIWx8fG4uZ2V0TW9udGgoKT49YykmJih5Kz0iPG9wdGlvbiB2YWx1ZT0nIitjKyInIisoYz09PWU/IiBzZWxlY3RlZD0nc2VsZWN0ZWQnIjoiIikrIj4iK3JbY10rIjwvb3B0aW9uPiIpO3krPSI8L3NlbGVjdD4ifWlmKF98fChiKz15KyghbyYmZyYmdj8iIjoiJiN4YTA7IikpLCF0LnllYXJzaHRtbClpZih0LnllYXJzaHRtbD0iIixvfHwhdiliKz0iPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcic+IitpKyI8L3NwYW4+IjtlbHNle2Zvcih1PXRoaXMuX2dldCh0LCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpLGQ9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHA9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaCgvY1srXC1dLiovKT9pK3BhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDEwKTp0Lm1hdGNoKC9bK1wtXS4qLyk/ZCtwYXJzZUludCh0LDEwKTpwYXJzZUludCh0LDEwKTtyZXR1cm4gaXNOYU4oZSk/ZDplfSxmPXAodVswXSksbT1NYXRoLm1heChmLHAodVsxXXx8IiIpKSxmPXM/TWF0aC5tYXgoZixzLmdldEZ1bGxZZWFyKCkpOmYsbT1uP01hdGgubWluKG0sbi5nZXRGdWxsWWVhcigpKTptLHQueWVhcnNodG1sKz0iPHNlbGVjdCBjbGFzcz0ndWktZGF0ZXBpY2tlci15ZWFyJyBkYXRhLWhhbmRsZXI9J3NlbGVjdFllYXInIGRhdGEtZXZlbnQ9J2NoYW5nZSc+IjttPj1mO2YrKyl0LnllYXJzaHRtbCs9IjxvcHRpb24gdmFsdWU9JyIrZisiJyIrKGY9PT1pPyIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyI6IiIpKyI+IitmKyI8L29wdGlvbj4iO3QueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixiKz10LnllYXJzaHRtbCx0LnllYXJzaHRtbD1udWxsfXJldHVybiBiKz10aGlzLl9nZXQodCwieWVhclN1ZmZpeCIpLF8mJihiKz0oIW8mJmcmJnY/IiI6IiYjeGEwOyIpK3kpLGIrPSI8L2Rpdj4ifSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXQuc2VsZWN0ZWRZZWFyKygiWSI9PT1pP2U6MCksbj10LnNlbGVjdGVkTW9udGgrKCJNIj09PWk/ZTowKSxvPU1hdGgubWluKHQuc2VsZWN0ZWREYXksdGhpcy5fZ2V0RGF5c0luTW9udGgocyxuKSkrKCJEIj09PWk/ZTowKSxhPXRoaXMuX3Jlc3RyaWN0TWluTWF4KHQsdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUocyxuLG8pKSk7dC5zZWxlY3RlZERheT1hLmdldERhdGUoKSx0LmRyYXdNb250aD10LnNlbGVjdGVkTW9udGg9YS5nZXRNb250aCgpLHQuZHJhd1llYXI9dC5zZWxlY3RlZFllYXI9YS5nZXRGdWxsWWVhcigpLCgiTSI9PT1pfHwiWSI9PT1pKSYmdGhpcy5fbm90aWZ5Q2hhbmdlKHQpfSxfcmVzdHJpY3RNaW5NYXg6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRNaW5NYXhEYXRlKHQsIm1pbiIpLHM9dGhpcy5fZ2V0TWluTWF4RGF0ZSh0LCJtYXgiKSxuPWkmJmk+ZT9pOmU7cmV0dXJuIHMmJm4+cz9zOm59LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0KHQsIm9uQ2hhbmdlTW9udGhZZWFyIik7ZSYmZS5hcHBseSh0LmlucHV0P3QuaW5wdXRbMF06bnVsbCxbdC5zZWxlY3RlZFllYXIsdC5zZWxlY3RlZE1vbnRoKzEsdF0pfSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0KHQsIm51bWJlck9mTW9udGhzIik7cmV0dXJuIG51bGw9PWU/WzEsMV06Im51bWJlciI9PXR5cGVvZiBlP1sxLGVdOmV9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUodCx0aGlzLl9nZXQodCxlKyJEYXRlIiksbnVsbCl9LF9nZXREYXlzSW5Nb250aDpmdW5jdGlvbih0LGUpe3JldHVybiAzMi10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0LGUsMzIpKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IERhdGUodCxlLDEpLmdldERheSgpfSxfY2FuQWRqdXN0TW9udGg6ZnVuY3Rpb24odCxlLGkscyl7dmFyIG49dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHModCksbz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpLHMrKDA+ZT9lOm5bMF0qblsxXSksMSkpO3JldHVybiAwPmUmJm8uc2V0RGF0ZSh0aGlzLl9nZXREYXlzSW5Nb250aChvLmdldEZ1bGxZZWFyKCksby5nZXRNb250aCgpKSksdGhpcy5faXNJblJhbmdlKHQsbyl9LF9pc0luUmFuZ2U6ZnVuY3Rpb24odCxlKXt2YXIgaSxzLG49dGhpcy5fZ2V0TWluTWF4RGF0ZSh0LCJtaW4iKSxvPXRoaXMuX2dldE1pbk1heERhdGUodCwibWF4IiksYT1udWxsLHI9bnVsbCxoPXRoaXMuX2dldCh0LCJ5ZWFyUmFuZ2UiKTtyZXR1cm4gaCYmKGk9aC5zcGxpdCgiOiIpLHM9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLGE9cGFyc2VJbnQoaVswXSwxMCkscj1wYXJzZUludChpWzFdLDEwKSxpWzBdLm1hdGNoKC9bK1wtXS4qLykmJihhKz1zKSxpWzFdLm1hdGNoKC9bK1wtXS4qLykmJihyKz1zKSksKCFufHxlLmdldFRpbWUoKT49bi5nZXRUaW1lKCkpJiYoIW98fGUuZ2V0VGltZSgpPD1vLmdldFRpbWUoKSkmJighYXx8ZS5nZXRGdWxsWWVhcigpPj1hKSYmKCFyfHxyPj1lLmdldEZ1bGxZZWFyKCkpfSxfZ2V0Rm9ybWF0Q29uZmlnOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldCh0LCJzaG9ydFllYXJDdXRvZmYiKTtyZXR1cm4gZT0ic3RyaW5nIiE9dHlwZW9mIGU/ZToobmV3IERhdGUpLmdldEZ1bGxZZWFyKCklMTAwK3BhcnNlSW50KGUsMTApLHtzaG9ydFllYXJDdXRvZmY6ZSxkYXlOYW1lc1Nob3J0OnRoaXMuX2dldCh0LCJkYXlOYW1lc1Nob3J0IiksZGF5TmFtZXM6dGhpcy5fZ2V0KHQsImRheU5hbWVzIiksbW9udGhOYW1lc1Nob3J0OnRoaXMuX2dldCh0LCJtb250aE5hbWVzU2hvcnQiKSxtb250aE5hbWVzOnRoaXMuX2dldCh0LCJtb250aE5hbWVzIil9fSxfZm9ybWF0RGF0ZTpmdW5jdGlvbih0LGUsaSxzKXtlfHwodC5jdXJyZW50RGF5PXQuc2VsZWN0ZWREYXksdC5jdXJyZW50TW9udGg9dC5zZWxlY3RlZE1vbnRoLHQuY3VycmVudFllYXI9dC5zZWxlY3RlZFllYXIpO3ZhciBuPWU/Im9iamVjdCI9PXR5cGVvZiBlP2U6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUocyxpLGUpKTp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh0LmN1cnJlbnRZZWFyLHQuY3VycmVudE1vbnRoLHQuY3VycmVudERheSkpO3JldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KHQsImRhdGVGb3JtYXQiKSxuLHRoaXMuX2dldEZvcm1hdENvbmZpZyh0KSl9fSksdC5mbi5kYXRlcGlja2VyPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt0LmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWR8fCh0KGRvY3VtZW50KS5vbigibW91c2Vkb3duIix0LmRhdGVwaWNrZXIuX2NoZWNrRXh0ZXJuYWxDbGljayksdC5kYXRlcGlja2VyLmluaXRpYWxpemVkPSEwKSwwPT09dCgiIyIrdC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aCYmdCgiYm9keSIpLmFwcGVuZCh0LmRhdGVwaWNrZXIuZHBEaXYpO3ZhciBpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGV8fCJpc0Rpc2FibGVkIiE9PWUmJiJnZXREYXRlIiE9PWUmJiJ3aWRnZXQiIT09ZT8ib3B0aW9uIj09PWUmJjI9PT1hcmd1bWVudHMubGVuZ3RoJiYic3RyaW5nIj09dHlwZW9mIGFyZ3VtZW50c1sxXT90LmRhdGVwaWNrZXJbIl8iK2UrIkRhdGVwaWNrZXIiXS5hcHBseSh0LmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChpKSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7InN0cmluZyI9PXR5cGVvZiBlP3QuZGF0ZXBpY2tlclsiXyIrZSsiRGF0ZXBpY2tlciJdLmFwcGx5KHQuZGF0ZXBpY2tlcixbdGhpc10uY29uY2F0KGkpKTp0LmRhdGVwaWNrZXIuX2F0dGFjaERhdGVwaWNrZXIodGhpcyxlKX0pOnQuZGF0ZXBpY2tlclsiXyIrZSsiRGF0ZXBpY2tlciJdLmFwcGx5KHQuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGkpKX0sdC5kYXRlcGlja2VyPW5ldyBzLHQuZGF0ZXBpY2tlci5pbml0aWFsaXplZD0hMSx0LmRhdGVwaWNrZXIudXVpZD0obmV3IERhdGUpLmdldFRpbWUoKSx0LmRhdGVwaWNrZXIudmVyc2lvbj0iMS4xMi4xIix0LmRhdGVwaWNrZXIsdC53aWRnZXQoInVpLmRpYWxvZyIse3ZlcnNpb246IjEuMTIuMSIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9PcGVuOiEwLGJ1dHRvbnM6W10sY2xhc3Nlczp7InVpLWRpYWxvZyI6InVpLWNvcm5lci1hbGwiLCJ1aS1kaWFsb2ctdGl0bGViYXIiOiJ1aS1jb3JuZXItYWxsIn0sY2xvc2VPbkVzY2FwZTohMCxjbG9zZVRleHQ6IkNsb3NlIixkcmFnZ2FibGU6ITAsaGlkZTpudWxsLGhlaWdodDoiYXV0byIsbWF4SGVpZ2h0Om51bGwsbWF4V2lkdGg6bnVsbCxtaW5IZWlnaHQ6MTUwLG1pbldpZHRoOjE1MCxtb2RhbDohMSxwb3NpdGlvbjp7bXk6ImNlbnRlciIsYXQ6ImNlbnRlciIsb2Y6d2luZG93LGNvbGxpc2lvbjoiZml0Iix1c2luZzpmdW5jdGlvbihlKXt2YXIgaT10KHRoaXMpLmNzcyhlKS5vZmZzZXQoKS50b3A7MD5pJiZ0KHRoaXMpLmNzcygidG9wIixlLnRvcC1pKX19LHJlc2l6YWJsZTohMCxzaG93Om51bGwsdGl0bGU6bnVsbCx3aWR0aDozMDAsYmVmb3JlQ2xvc2U6bnVsbCxjbG9zZTpudWxsLGRyYWc6bnVsbCxkcmFnU3RhcnQ6bnVsbCxkcmFnU3RvcDpudWxsLGZvY3VzOm51bGwsb3BlbjpudWxsLHJlc2l6ZTpudWxsLHJlc2l6ZVN0YXJ0Om51bGwscmVzaXplU3RvcDpudWxsfSxzaXplUmVsYXRlZE9wdGlvbnM6e2J1dHRvbnM6ITAsaGVpZ2h0OiEwLG1heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITAsd2lkdGg6ITB9LHJlc2l6YWJsZVJlbGF0ZWRPcHRpb25zOnttYXhIZWlnaHQ6ITAsbWF4V2lkdGg6ITAsbWluSGVpZ2h0OiEwLG1pbldpZHRoOiEwfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbENzcz17ZGlzcGxheTp0aGlzLmVsZW1lbnRbMF0uc3R5bGUuZGlzcGxheSx3aWR0aDp0aGlzLmVsZW1lbnRbMF0uc3R5bGUud2lkdGgsbWluSGVpZ2h0OnRoaXMuZWxlbWVudFswXS5zdHlsZS5taW5IZWlnaHQsbWF4SGVpZ2h0OnRoaXMuZWxlbWVudFswXS5zdHlsZS5tYXhIZWlnaHQsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5zdHlsZS5oZWlnaHR9LHRoaXMub3JpZ2luYWxQb3NpdGlvbj17cGFyZW50OnRoaXMuZWxlbWVudC5wYXJlbnQoKSxpbmRleDp0aGlzLmVsZW1lbnQucGFyZW50KCkuY2hpbGRyZW4oKS5pbmRleCh0aGlzLmVsZW1lbnQpfSx0aGlzLm9yaWdpbmFsVGl0bGU9dGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIiksbnVsbD09dGhpcy5vcHRpb25zLnRpdGxlJiZudWxsIT10aGlzLm9yaWdpbmFsVGl0bGUmJih0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcmlnaW5hbFRpdGxlKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJih0aGlzLm9wdGlvbnMuZGlzYWJsZWQ9ITEpLHRoaXMuX2NyZWF0ZVdyYXBwZXIoKSx0aGlzLmVsZW1lbnQuc2hvdygpLnJlbW92ZUF0dHIoInRpdGxlIikuYXBwZW5kVG8odGhpcy51aURpYWxvZyksdGhpcy5fYWRkQ2xhc3MoInVpLWRpYWxvZy1jb250ZW50IiwidWktd2lkZ2V0LWNvbnRlbnQiKSx0aGlzLl9jcmVhdGVUaXRsZWJhcigpLHRoaXMuX2NyZWF0ZUJ1dHRvblBhbmUoKSx0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlJiZ0LmZuLmRyYWdnYWJsZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpLHRoaXMub3B0aW9ucy5yZXNpemFibGUmJnQuZm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCksdGhpcy5faXNPcGVuPSExLHRoaXMuX3RyYWNrRm9jdXMoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIGUmJihlLmpxdWVyeXx8ZS5ub2RlVHlwZSk/dChlKTp0aGlzLmRvY3VtZW50LmZpbmQoZXx8ImJvZHkiKS5lcSgwKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMub3JpZ2luYWxQb3NpdGlvbjt0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSx0aGlzLl9kZXN0cm95T3ZlcmxheSgpLHRoaXMuZWxlbWVudC5yZW1vdmVVbmlxdWVJZCgpLmNzcyh0aGlzLm9yaWdpbmFsQ3NzKS5kZXRhY2goKSx0aGlzLnVpRGlhbG9nLnJlbW92ZSgpLHRoaXMub3JpZ2luYWxUaXRsZSYmdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIix0aGlzLm9yaWdpbmFsVGl0bGUpLHQ9ZS5wYXJlbnQuY2hpbGRyZW4oKS5lcShlLmluZGV4KSx0Lmxlbmd0aCYmdFswXSE9PXRoaXMuZWxlbWVudFswXT90LmJlZm9yZSh0aGlzLmVsZW1lbnQpOmUucGFyZW50LmFwcGVuZCh0aGlzLmVsZW1lbnQpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sZGlzYWJsZTp0Lm5vb3AsZW5hYmxlOnQubm9vcCxjbG9zZTpmdW5jdGlvbihlKXt2YXIgaT10aGlzO3RoaXMuX2lzT3BlbiYmdGhpcy5fdHJpZ2dlcigiYmVmb3JlQ2xvc2UiLGUpIT09ITEmJih0aGlzLl9pc09wZW49ITEsdGhpcy5fZm9jdXNlZEVsZW1lbnQ9bnVsbCx0aGlzLl9kZXN0cm95T3ZlcmxheSgpLHRoaXMuX3VudHJhY2tJbnN0YW5jZSgpLHRoaXMub3BlbmVyLmZpbHRlcigiOmZvY3VzYWJsZSIpLnRyaWdnZXIoImZvY3VzIikubGVuZ3RofHx0LnVpLnNhZmVCbHVyKHQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSkpLHRoaXMuX2hpZGUodGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe2kuX3RyaWdnZXIoImNsb3NlIixlKX0pKX0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZVRvVG9wKCl9LF9tb3ZlVG9Ub3A6ZnVuY3Rpb24oZSxpKXt2YXIgcz0hMSxuPXRoaXMudWlEaWFsb2cuc2libGluZ3MoIi51aS1mcm9udDp2aXNpYmxlIikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuK3QodGhpcykuY3NzKCJ6LWluZGV4Iil9KS5nZXQoKSxvPU1hdGgubWF4LmFwcGx5KG51bGwsbik7cmV0dXJuIG8+PSt0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIpJiYodGhpcy51aURpYWxvZy5jc3MoInotaW5kZXgiLG8rMSkscz0hMCkscyYmIWkmJnRoaXMuX3RyaWdnZXIoImZvY3VzIixlKSxzfSxvcGVuOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5faXNPcGVuPyh0aGlzLl9tb3ZlVG9Ub3AoKSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpLHZvaWQgMCk6KHRoaXMuX2lzT3Blbj0hMCx0aGlzLm9wZW5lcj10KHQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSkpLHRoaXMuX3NpemUoKSx0aGlzLl9wb3NpdGlvbigpLHRoaXMuX2NyZWF0ZU92ZXJsYXkoKSx0aGlzLl9tb3ZlVG9Ub3AobnVsbCwhMCksdGhpcy5vdmVybGF5JiZ0aGlzLm92ZXJsYXkuY3NzKCJ6LWluZGV4Iix0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIpLTEpLHRoaXMuX3Nob3codGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuc2hvdyxmdW5jdGlvbigpe2UuX2ZvY3VzVGFiYmFibGUoKSxlLl90cmlnZ2VyKCJmb2N1cyIpfSksdGhpcy5fbWFrZUZvY3VzVGFyZ2V0KCksdGhpcy5fdHJpZ2dlcigib3BlbiIpLHZvaWQgMCl9LF9mb2N1c1RhYmJhYmxlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZm9jdXNlZEVsZW1lbnQ7dHx8KHQ9dGhpcy5lbGVtZW50LmZpbmQoIlthdXRvZm9jdXNdIikpLHQubGVuZ3RofHwodD10aGlzLmVsZW1lbnQuZmluZCgiOnRhYmJhYmxlIikpLHQubGVuZ3RofHwodD10aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5maW5kKCI6dGFiYmFibGUiKSksdC5sZW5ndGh8fCh0PXRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlLmZpbHRlcigiOnRhYmJhYmxlIikpLHQubGVuZ3RofHwodD10aGlzLnVpRGlhbG9nKSx0LmVxKDApLnRyaWdnZXIoImZvY3VzIil9LF9rZWVwRm9jdXM6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaSgpe3ZhciBlPXQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSksaT10aGlzLnVpRGlhbG9nWzBdPT09ZXx8dC5jb250YWlucyh0aGlzLnVpRGlhbG9nWzBdLGUpO2l8fHRoaXMuX2ZvY3VzVGFiYmFibGUoKX1lLnByZXZlbnREZWZhdWx0KCksaS5jYWxsKHRoaXMpLHRoaXMuX2RlbGF5KGkpfSxfY3JlYXRlV3JhcHBlcjpmdW5jdGlvbigpe3RoaXMudWlEaWFsb2c9dCgiPGRpdj4iKS5oaWRlKCkuYXR0cih7dGFiSW5kZXg6LTEscm9sZToiZGlhbG9nIn0pLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLHRoaXMuX2FkZENsYXNzKHRoaXMudWlEaWFsb2csInVpLWRpYWxvZyIsInVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1mcm9udCIpLHRoaXMuX29uKHRoaXMudWlEaWFsb2cse2tleWRvd246ZnVuY3Rpb24oZSl7aWYodGhpcy5vcHRpb25zLmNsb3NlT25Fc2NhcGUmJiFlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZlLmtleUNvZGUmJmUua2V5Q29kZT09PXQudWkua2V5Q29kZS5FU0NBUEUpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKGUpLHZvaWQgMDtpZihlLmtleUNvZGU9PT10LnVpLmtleUNvZGUuVEFCJiYhZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIGk9dGhpcy51aURpYWxvZy5maW5kKCI6dGFiYmFibGUiKSxzPWkuZmlsdGVyKCI6Zmlyc3QiKSxuPWkuZmlsdGVyKCI6bGFzdCIpO2UudGFyZ2V0IT09blswXSYmZS50YXJnZXQhPT10aGlzLnVpRGlhbG9nWzBdfHxlLnNoaWZ0S2V5P2UudGFyZ2V0IT09c1swXSYmZS50YXJnZXQhPT10aGlzLnVpRGlhbG9nWzBdfHwhZS5zaGlmdEtleXx8KHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7bi50cmlnZ2VyKCJmb2N1cyIpfSksZS5wcmV2ZW50RGVmYXVsdCgpKToodGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtzLnRyaWdnZXIoImZvY3VzIil9KSxlLnByZXZlbnREZWZhdWx0KCkpfX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe3RoaXMuX21vdmVUb1RvcCh0KSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpfX0pLHRoaXMuZWxlbWVudC5maW5kKCJbYXJpYS1kZXNjcmliZWRieV0iKS5sZW5ndGh8fHRoaXMudWlEaWFsb2cuYXR0cih7ImFyaWEtZGVzY3JpYmVkYnkiOnRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoImlkIil9KX0sX2NyZWF0ZVRpdGxlYmFyOmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy51aURpYWxvZ1RpdGxlYmFyPXQoIjxkaXY+IiksdGhpcy5fYWRkQ2xhc3ModGhpcy51aURpYWxvZ1RpdGxlYmFyLCJ1aS1kaWFsb2ctdGl0bGViYXIiLCJ1aS13aWRnZXQtaGVhZGVyIHVpLWhlbHBlci1jbGVhcmZpeCIpLHRoaXMuX29uKHRoaXMudWlEaWFsb2dUaXRsZWJhcix7bW91c2Vkb3duOmZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmNsb3Nlc3QoIi51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiKXx8dGhpcy51aURpYWxvZy50cmlnZ2VyKCJmb2N1cyIpfX0pLHRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlPXQoIjxidXR0b24gdHlwZT0nYnV0dG9uJz48L2J1dHRvbj4iKS5idXR0b24oe2xhYmVsOnQoIjxhPiIpLnRleHQodGhpcy5vcHRpb25zLmNsb3NlVGV4dCkuaHRtbCgpLGljb246InVpLWljb24tY2xvc2V0aGljayIsc2hvd0xhYmVsOiExfSkuYXBwZW5kVG8odGhpcy51aURpYWxvZ1RpdGxlYmFyKSx0aGlzLl9hZGRDbGFzcyh0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZSwidWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIiksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2Use2NsaWNrOmZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKHQpfX0pLGU9dCgiPHNwYW4+IikudW5pcXVlSWQoKS5wcmVwZW5kVG8odGhpcy51aURpYWxvZ1RpdGxlYmFyKSx0aGlzLl9hZGRDbGFzcyhlLCJ1aS1kaWFsb2ctdGl0bGUiKSx0aGlzLl90aXRsZShlKSx0aGlzLnVpRGlhbG9nVGl0bGViYXIucHJlcGVuZFRvKHRoaXMudWlEaWFsb2cpLHRoaXMudWlEaWFsb2cuYXR0cih7ImFyaWEtbGFiZWxsZWRieSI6ZS5hdHRyKCJpZCIpfSl9LF90aXRsZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMudGl0bGU/dC50ZXh0KHRoaXMub3B0aW9ucy50aXRsZSk6dC5odG1sKCImIzE2MDsiKX0sX2NyZWF0ZUJ1dHRvblBhbmU6ZnVuY3Rpb24oKXt0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZT10KCI8ZGl2PiIpLHRoaXMuX2FkZENsYXNzKHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLCJ1aS1kaWFsb2ctYnV0dG9ucGFuZSIsInVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCIpLHRoaXMudWlCdXR0b25TZXQ9dCgiPGRpdj4iKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZSksdGhpcy5fYWRkQ2xhc3ModGhpcy51aUJ1dHRvblNldCwidWktZGlhbG9nLWJ1dHRvbnNldCIpLHRoaXMuX2NyZWF0ZUJ1dHRvbnMoKX0sX2NyZWF0ZUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9dGhpcy5vcHRpb25zLmJ1dHRvbnM7cmV0dXJuIHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLnJlbW92ZSgpLHRoaXMudWlCdXR0b25TZXQuZW1wdHkoKSx0LmlzRW1wdHlPYmplY3QoaSl8fHQuaXNBcnJheShpKSYmIWkubGVuZ3RoPyh0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnVpRGlhbG9nLCJ1aS1kaWFsb2ctYnV0dG9ucyIpLHZvaWQgMCk6KHQuZWFjaChpLGZ1bmN0aW9uKGkscyl7dmFyIG4sbztzPXQuaXNGdW5jdGlvbihzKT97Y2xpY2s6cyx0ZXh0Oml9OnMscz10LmV4dGVuZCh7dHlwZToiYnV0dG9uIn0scyksbj1zLmNsaWNrLG89e2ljb246cy5pY29uLGljb25Qb3NpdGlvbjpzLmljb25Qb3NpdGlvbixzaG93TGFiZWw6cy5zaG93TGFiZWwsaWNvbnM6cy5pY29ucyx0ZXh0OnMudGV4dH0sZGVsZXRlIHMuY2xpY2ssZGVsZXRlIHMuaWNvbixkZWxldGUgcy5pY29uUG9zaXRpb24sZGVsZXRlIHMuc2hvd0xhYmVsLGRlbGV0ZSBzLmljb25zLCJib29sZWFuIj09dHlwZW9mIHMudGV4dCYmZGVsZXRlIHMudGV4dCx0KCI8YnV0dG9uPjwvYnV0dG9uPiIscykuYnV0dG9uKG8pLmFwcGVuZFRvKGUudWlCdXR0b25TZXQpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtuLmFwcGx5KGUuZWxlbWVudFswXSxhcmd1bWVudHMpfSl9KSx0aGlzLl9hZGRDbGFzcyh0aGlzLnVpRGlhbG9nLCJ1aS1kaWFsb2ctYnV0dG9ucyIpLHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmFwcGVuZFRvKHRoaXMudWlEaWFsb2cpLHZvaWQgMCl9LF9tYWtlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm57cG9zaXRpb246dC5wb3NpdGlvbixvZmZzZXQ6dC5vZmZzZXR9fXZhciBpPXRoaXMscz10aGlzLm9wdGlvbnM7dGhpcy51aURpYWxvZy5kcmFnZ2FibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50LCAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIixoYW5kbGU6Ii51aS1kaWFsb2ctdGl0bGViYXIiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsc3RhcnQ6ZnVuY3Rpb24ocyxuKXtpLl9hZGRDbGFzcyh0KHRoaXMpLCJ1aS1kaWFsb2ctZHJhZ2dpbmciKSxpLl9ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoImRyYWdTdGFydCIscyxlKG4pKX0sZHJhZzpmdW5jdGlvbih0LHMpe2kuX3RyaWdnZXIoImRyYWciLHQsZShzKSl9LHN0b3A6ZnVuY3Rpb24obixvKXt2YXIgYT1vLm9mZnNldC5sZWZ0LWkuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpLHI9by5vZmZzZXQudG9wLWkuZG9jdW1lbnQuc2Nyb2xsVG9wKCk7cy5wb3NpdGlvbj17bXk6ImxlZnQgdG9wIixhdDoibGVmdCIrKGE+PTA/IisiOiIiKSthKyIgIisidG9wIisocj49MD8iKyI6IiIpK3Isb2Y6aS53aW5kb3d9LGkuX3JlbW92ZUNsYXNzKHQodGhpcyksInVpLWRpYWxvZy1kcmFnZ2luZyIpLGkuX3VuYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKCJkcmFnU3RvcCIsbixlKG8pKX19KX0sX21ha2VSZXNpemFibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3JldHVybntvcmlnaW5hbFBvc2l0aW9uOnQub3JpZ2luYWxQb3NpdGlvbixvcmlnaW5hbFNpemU6dC5vcmlnaW5hbFNpemUscG9zaXRpb246dC5wb3NpdGlvbixzaXplOnQuc2l6ZX19dmFyIGk9dGhpcyxzPXRoaXMub3B0aW9ucyxuPXMucmVzaXphYmxlLG89dGhpcy51aURpYWxvZy5jc3MoInBvc2l0aW9uIiksYT0ic3RyaW5nIj09dHlwZW9mIG4/bjoibixlLHMsdyxzZSxzdyxuZSxudyI7dGhpcy51aURpYWxvZy5yZXNpemFibGUoe2NhbmNlbDoiLnVpLWRpYWxvZy1jb250ZW50Iixjb250YWlubWVudDoiZG9jdW1lbnQiLGFsc29SZXNpemU6dGhpcy5lbGVtZW50LG1heFdpZHRoOnMubWF4V2lkdGgsbWF4SGVpZ2h0OnMubWF4SGVpZ2h0LG1pbldpZHRoOnMubWluV2lkdGgsbWluSGVpZ2h0OnRoaXMuX21pbkhlaWdodCgpLGhhbmRsZXM6YSxzdGFydDpmdW5jdGlvbihzLG4pe2kuX2FkZENsYXNzKHQodGhpcyksInVpLWRpYWxvZy1yZXNpemluZyIpLGkuX2Jsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcigicmVzaXplU3RhcnQiLHMsZShuKSl9LHJlc2l6ZTpmdW5jdGlvbih0LHMpe2kuX3RyaWdnZXIoInJlc2l6ZSIsdCxlKHMpKX0sc3RvcDpmdW5jdGlvbihuLG8pe3ZhciBhPWkudWlEaWFsb2cub2Zmc2V0KCkscj1hLmxlZnQtaS5kb2N1bWVudC5zY3JvbGxMZWZ0KCksaD1hLnRvcC1pLmRvY3VtZW50LnNjcm9sbFRvcCgpO3MuaGVpZ2h0PWkudWlEaWFsb2cuaGVpZ2h0KCkscy53aWR0aD1pLnVpRGlhbG9nLndpZHRoKCkscy5wb3NpdGlvbj17bXk6ImxlZnQgdG9wIixhdDoibGVmdCIrKHI+PTA/IisiOiIiKStyKyIgIisidG9wIisoaD49MD8iKyI6IiIpK2gsb2Y6aS53aW5kb3d9LGkuX3JlbW92ZUNsYXNzKHQodGhpcyksInVpLWRpYWxvZy1yZXNpemluZyIpLGkuX3VuYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKCJyZXNpemVTdG9wIixuLGUobykpfX0pLmNzcygicG9zaXRpb24iLG8pfSxfdHJhY2tGb2N1czpmdW5jdGlvbigpe3RoaXMuX29uKHRoaXMud2lkZ2V0KCkse2ZvY3VzaW46ZnVuY3Rpb24oZSl7dGhpcy5fbWFrZUZvY3VzVGFyZ2V0KCksdGhpcy5fZm9jdXNlZEVsZW1lbnQ9dChlLnRhcmdldCl9fSl9LF9tYWtlRm9jdXNUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSx0aGlzLl90cmFja2luZ0luc3RhbmNlcygpLnVuc2hpZnQodGhpcyl9LF91bnRyYWNrSW5zdGFuY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl90cmFja2luZ0luc3RhbmNlcygpLGk9dC5pbkFycmF5KHRoaXMsZSk7LTEhPT1pJiZlLnNwbGljZShpLDEpfSxfdHJhY2tpbmdJbnN0YW5jZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1pbnN0YW5jZXMiKTtyZXR1cm4gdHx8KHQ9W10sdGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctaW5zdGFuY2VzIix0KSksdH0sX21pbkhlaWdodDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucztyZXR1cm4iYXV0byI9PT10LmhlaWdodD90Lm1pbkhlaWdodDpNYXRoLm1pbih0Lm1pbkhlaWdodCx0LmhlaWdodCl9LF9wb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMudWlEaWFsb2cuaXMoIjp2aXNpYmxlIik7dHx8dGhpcy51aURpYWxvZy5zaG93KCksdGhpcy51aURpYWxvZy5wb3NpdGlvbih0aGlzLm9wdGlvbnMucG9zaXRpb24pLHR8fHRoaXMudWlEaWFsb2cuaGlkZSgpfSxfc2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgaT10aGlzLHM9ITEsbj17fTt0LmVhY2goZSxmdW5jdGlvbih0LGUpe2kuX3NldE9wdGlvbih0LGUpLHQgaW4gaS5zaXplUmVsYXRlZE9wdGlvbnMmJihzPSEwKSx0IGluIGkucmVzaXphYmxlUmVsYXRlZE9wdGlvbnMmJihuW3RdPWUpfSkscyYmKHRoaXMuX3NpemUoKSx0aGlzLl9wb3NpdGlvbigpKSx0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YSh1aS1yZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLG4pfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsaSl7dmFyIHMsbixvPXRoaXMudWlEaWFsb2c7ImRpc2FibGVkIiE9PWUmJih0aGlzLl9zdXBlcihlLGkpLCJhcHBlbmRUbyI9PT1lJiZ0aGlzLnVpRGlhbG9nLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLCJidXR0b25zIj09PWUmJnRoaXMuX2NyZWF0ZUJ1dHRvbnMoKSwiY2xvc2VUZXh0Ij09PWUmJnRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlLmJ1dHRvbih7bGFiZWw6dCgiPGE+IikudGV4dCgiIit0aGlzLm9wdGlvbnMuY2xvc2VUZXh0KS5odG1sKCl9KSwiZHJhZ2dhYmxlIj09PWUmJihzPW8uaXMoIjpkYXRhKHVpLWRyYWdnYWJsZSkiKSxzJiYhaSYmby5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhcyYmaSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpKSwicG9zaXRpb24iPT09ZSYmdGhpcy5fcG9zaXRpb24oKSwicmVzaXphYmxlIj09PWUmJihuPW8uaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSxuJiYhaSYmby5yZXNpemFibGUoImRlc3Ryb3kiKSxuJiYic3RyaW5nIj09dHlwZW9mIGkmJm8ucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIixpKSxufHxpPT09ITF8fHRoaXMuX21ha2VSZXNpemFibGUoKSksInRpdGxlIj09PWUmJnRoaXMuX3RpdGxlKHRoaXMudWlEaWFsb2dUaXRsZWJhci5maW5kKCIudWktZGlhbG9nLXRpdGxlIikpKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgdCxlLGkscz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LnNob3coKS5jc3Moe3dpZHRoOiJhdXRvIixtaW5IZWlnaHQ6MCxtYXhIZWlnaHQ6Im5vbmUiLGhlaWdodDowfSkscy5taW5XaWR0aD5zLndpZHRoJiYocy53aWR0aD1zLm1pbldpZHRoKSx0PXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOnMud2lkdGh9KS5vdXRlckhlaWdodCgpLGU9TWF0aC5tYXgoMCxzLm1pbkhlaWdodC10KSxpPSJudW1iZXIiPT10eXBlb2Ygcy5tYXhIZWlnaHQ/TWF0aC5tYXgoMCxzLm1heEhlaWdodC10KToibm9uZSIsImF1dG8iPT09cy5oZWlnaHQ/dGhpcy5lbGVtZW50LmNzcyh7bWluSGVpZ2h0OmUsbWF4SGVpZ2h0OmksaGVpZ2h0OiJhdXRvIn0pOnRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoMCxzLmhlaWdodC10KSksdGhpcy51aURpYWxvZy5pcygiOmRhdGEodWktcmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzPXRoaXMuZG9jdW1lbnQuZmluZCgiaWZyYW1lIikubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTtyZXR1cm4gdCgiPGRpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6ZS5vdXRlcldpZHRoKCksaGVpZ2h0OmUub3V0ZXJIZWlnaHQoKX0pLmFwcGVuZFRvKGUucGFyZW50KCkpLm9mZnNldChlLm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2FsbG93SW50ZXJhY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS50YXJnZXQpLmNsb3Nlc3QoIi51aS1kaWFsb2ciKS5sZW5ndGg/ITA6ISF0KGUudGFyZ2V0KS5jbG9zZXN0KCIudWktZGF0ZXBpY2tlciIpLmxlbmd0aH0sX2NyZWF0ZU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwpe3ZhciBlPSEwO3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZT0hMX0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIil8fHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse2ZvY3VzaW46ZnVuY3Rpb24odCl7ZXx8dGhpcy5fYWxsb3dJbnRlcmFjdGlvbih0KXx8KHQucHJldmVudERlZmF1bHQoKSx0aGlzLl90cmFja2luZ0luc3RhbmNlcygpWzBdLl9mb2N1c1RhYmJhYmxlKCkpfX0pLHRoaXMub3ZlcmxheT10KCI8ZGl2PiIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLHRoaXMuX2FkZENsYXNzKHRoaXMub3ZlcmxheSxudWxsLCJ1aS13aWRnZXQtb3ZlcmxheSB1aS1mcm9udCIpLHRoaXMuX29uKHRoaXMub3ZlcmxheSx7bW91c2Vkb3duOiJfa2VlcEZvY3VzIn0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiwodGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKXx8MCkrMSl9fSxfZGVzdHJveU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwmJnRoaXMub3ZlcmxheSl7dmFyIHQ9dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKS0xO3Q/dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiLHQpOih0aGlzLl9vZmYodGhpcy5kb2N1bWVudCwiZm9jdXNpbiIpLHRoaXMuZG9jdW1lbnQucmVtb3ZlRGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIikpLHRoaXMub3ZlcmxheS5yZW1vdmUoKSx0aGlzLm92ZXJsYXk9bnVsbH19fSksdC51aUJhY2tDb21wYXQhPT0hMSYmdC53aWRnZXQoInVpLmRpYWxvZyIsdC51aS5kaWFsb2cse29wdGlvbnM6e2RpYWxvZ0NsYXNzOiIifSxfY3JlYXRlV3JhcHBlcjpmdW5jdGlvbigpe3RoaXMuX3N1cGVyKCksdGhpcy51aURpYWxvZy5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuZGlhbG9nQ2xhc3MpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKHQsZSl7ImRpYWxvZ0NsYXNzIj09PXQmJnRoaXMudWlEaWFsb2cucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcyhlKSx0aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyl9fSksdC51aS5kaWFsb2csdC53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7dmVyc2lvbjoiMS4xMi4xIixvcHRpb25zOntjbGFzc2VzOnsidWktcHJvZ3Jlc3NiYXIiOiJ1aS1jb3JuZXItYWxsIiwidWktcHJvZ3Jlc3NiYXItdmFsdWUiOiJ1aS1jb3JuZXItbGVmdCIsInVpLXByb2dyZXNzYmFyLWNvbXBsZXRlIjoidWktY29ybmVyLXJpZ2h0In0sbWF4OjEwMCx2YWx1ZTowLGNoYW5nZTpudWxsLGNvbXBsZXRlOm51bGx9LG1pbjowLF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9sZFZhbHVlPXRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl9jb25zdHJhaW5lZFZhbHVlKCksdGhpcy5lbGVtZW50LmF0dHIoe3JvbGU6InByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiI6dGhpcy5taW59KSx0aGlzLl9hZGRDbGFzcygidWktcHJvZ3Jlc3NiYXIiLCJ1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQiKSx0aGlzLnZhbHVlRGl2PXQoIjxkaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLl9hZGRDbGFzcyh0aGlzLnZhbHVlRGl2LCJ1aS1wcm9ncmVzc2Jhci12YWx1ZSIsInVpLXdpZGdldC1oZWFkZXIiKSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigicm9sZSBhcmlhLXZhbHVlbWluIGFyaWEtdmFsdWVtYXggYXJpYS12YWx1ZW5vdyIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCl9LHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMub3B0aW9ucy52YWx1ZToodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUodCksdGhpcy5fcmVmcmVzaFZhbHVlKCksdm9pZCAwKX0sX2NvbnN0cmFpbmVkVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXRoaXMub3B0aW9ucy52YWx1ZSksdGhpcy5pbmRldGVybWluYXRlPXQ9PT0hMSwibnVtYmVyIiE9dHlwZW9mIHQmJih0PTApLHRoaXMuaW5kZXRlcm1pbmF0ZT8hMTpNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LE1hdGgubWF4KHRoaXMubWluLHQpKX0sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU9dC52YWx1ZTtkZWxldGUgdC52YWx1ZSx0aGlzLl9zdXBlcih0KSx0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fY29uc3RyYWluZWRWYWx1ZShlKSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpeyJtYXgiPT09dCYmKGU9TWF0aC5tYXgodGhpcy5taW4sZSkpLHRoaXMuX3N1cGVyKHQsZSl9LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLmVsZW1lbnQuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fdG9nZ2xlQ2xhc3MobnVsbCwidWktc3RhdGUtZGlzYWJsZWQiLCEhdCl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZT8xMDA6MTAwKih0aGlzLm9wdGlvbnMudmFsdWUtdGhpcy5taW4pLyh0aGlzLm9wdGlvbnMubWF4LXRoaXMubWluKX0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucy52YWx1ZSxpPXRoaXMuX3BlcmNlbnRhZ2UoKTt0aGlzLnZhbHVlRGl2LnRvZ2dsZSh0aGlzLmluZGV0ZXJtaW5hdGV8fGU+dGhpcy5taW4pLndpZHRoKGkudG9GaXhlZCgwKSsiJSIpLHRoaXMuX3RvZ2dsZUNsYXNzKHRoaXMudmFsdWVEaXYsInVpLXByb2dyZXNzYmFyLWNvbXBsZXRlIixudWxsLGU9PT10aGlzLm9wdGlvbnMubWF4KS5fdG9nZ2xlQ2xhc3MoInVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUiLG51bGwsdGhpcy5pbmRldGVybWluYXRlKSx0aGlzLmluZGV0ZXJtaW5hdGU/KHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy5vdmVybGF5RGl2fHwodGhpcy5vdmVybGF5RGl2PXQoIjxkaXY+IikuYXBwZW5kVG8odGhpcy52YWx1ZURpdiksdGhpcy5fYWRkQ2xhc3ModGhpcy5vdmVybGF5RGl2LCJ1aS1wcm9ncmVzc2Jhci1vdmVybGF5IikpKToodGhpcy5lbGVtZW50LmF0dHIoeyJhcmlhLXZhbHVlbWF4Ijp0aGlzLm9wdGlvbnMubWF4LCJhcmlhLXZhbHVlbm93IjplfSksdGhpcy5vdmVybGF5RGl2JiYodGhpcy5vdmVybGF5RGl2LnJlbW92ZSgpLHRoaXMub3ZlcmxheURpdj1udWxsKSksdGhpcy5vbGRWYWx1ZSE9PWUmJih0aGlzLm9sZFZhbHVlPWUsdGhpcy5fdHJpZ2dlcigiY2hhbmdlIikpLGU9PT10aGlzLm9wdGlvbnMubWF4JiZ0aGlzLl90cmlnZ2VyKCJjb21wbGV0ZSIpfX0pLHQud2lkZ2V0KCJ1aS5zZWxlY3RtZW51IixbdC51aS5mb3JtUmVzZXRNaXhpbix7dmVyc2lvbjoiMS4xMi4xIixkZWZhdWx0RWxlbWVudDoiPHNlbGVjdD4iLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsY2xhc3Nlczp7InVpLXNlbGVjdG1lbnUtYnV0dG9uLW9wZW4iOiJ1aS1jb3JuZXItdG9wIiwidWktc2VsZWN0bWVudS1idXR0b24tY2xvc2VkIjoidWktY29ybmVyLWFsbCJ9LGRpc2FibGVkOm51bGwsaWNvbnM6e2J1dHRvbjoidWktaWNvbi10cmlhbmdsZS0xLXMifSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHdpZHRoOiExLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwsc2VsZWN0Om51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsZW1lbnQudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3RoaXMuaWRzPXtlbGVtZW50OmUsYnV0dG9uOmUrIi1idXR0b24iLG1lbnU6ZSsiLW1lbnUifSx0aGlzLl9kcmF3QnV0dG9uKCksdGhpcy5fZHJhd01lbnUoKSx0aGlzLl9iaW5kRm9ybVJlc2V0SGFuZGxlcigpLHRoaXMuX3JlbmRlcmVkPSExLHRoaXMubWVudUl0ZW1zPXQoKX0sX2RyYXdCdXR0b246ZnVuY3Rpb24oKXt2YXIgZSxpPXRoaXMscz10aGlzLl9wYXJzZU9wdGlvbih0aGlzLmVsZW1lbnQuZmluZCgib3B0aW9uOnNlbGVjdGVkIiksdGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpO3RoaXMubGFiZWxzPXRoaXMuZWxlbWVudC5sYWJlbHMoKS5hdHRyKCJmb3IiLHRoaXMuaWRzLmJ1dHRvbiksdGhpcy5fb24odGhpcy5sYWJlbHMse2NsaWNrOmZ1bmN0aW9uKHQpe3RoaXMuYnV0dG9uLmZvY3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpfX0pLHRoaXMuZWxlbWVudC5oaWRlKCksdGhpcy5idXR0b249dCgiPHNwYW4+Iix7dGFiaW5kZXg6dGhpcy5vcHRpb25zLmRpc2FibGVkPy0xOjAsaWQ6dGhpcy5pZHMuYnV0dG9uLHJvbGU6ImNvbWJvYm94IiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIiwiYXJpYS1hdXRvY29tcGxldGUiOiJsaXN0IiwiYXJpYS1vd25zIjp0aGlzLmlkcy5tZW51LCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSIsdGl0bGU6dGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIil9KS5pbnNlcnRBZnRlcih0aGlzLmVsZW1lbnQpLHRoaXMuX2FkZENsYXNzKHRoaXMuYnV0dG9uLCJ1aS1zZWxlY3RtZW51LWJ1dHRvbiB1aS1zZWxlY3RtZW51LWJ1dHRvbi1jbG9zZWQiLCJ1aS1idXR0b24gdWktd2lkZ2V0IiksZT10KCI8c3Bhbj4iKS5hcHBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5fYWRkQ2xhc3MoZSwidWktc2VsZWN0bWVudS1pY29uIiwidWktaWNvbiAiK3RoaXMub3B0aW9ucy5pY29ucy5idXR0b24pLHRoaXMuYnV0dG9uSXRlbT10aGlzLl9yZW5kZXJCdXR0b25JdGVtKHMpLmFwcGVuZFRvKHRoaXMuYnV0dG9uKSx0aGlzLm9wdGlvbnMud2lkdGghPT0hMSYmdGhpcy5fcmVzaXplQnV0dG9uKCksdGhpcy5fb24odGhpcy5idXR0b24sdGhpcy5fYnV0dG9uRXZlbnRzKSx0aGlzLmJ1dHRvbi5vbmUoImZvY3VzaW4iLGZ1bmN0aW9uKCl7aS5fcmVuZGVyZWR8fGkuX3JlZnJlc2hNZW51KCl9KX0sX2RyYXdNZW51OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLm1lbnU9dCgiPHVsPiIseyJhcmlhLWhpZGRlbiI6InRydWUiLCJhcmlhLWxhYmVsbGVkYnkiOnRoaXMuaWRzLmJ1dHRvbixpZDp0aGlzLmlkcy5tZW51fSksdGhpcy5tZW51V3JhcD10KCI8ZGl2PiIpLmFwcGVuZCh0aGlzLm1lbnUpLHRoaXMuX2FkZENsYXNzKHRoaXMubWVudVdyYXAsInVpLXNlbGVjdG1lbnUtbWVudSIsInVpLWZyb250IiksdGhpcy5tZW51V3JhcC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSx0aGlzLm1lbnVJbnN0YW5jZT10aGlzLm1lbnUubWVudSh7Y2xhc3Nlczp7InVpLW1lbnUiOiJ1aS1jb3JuZXItYm90dG9tIn0scm9sZToibGlzdGJveCIsc2VsZWN0OmZ1bmN0aW9uKHQsaSl7dC5wcmV2ZW50RGVmYXVsdCgpLGUuX3NldFNlbGVjdGlvbigpLGUuX3NlbGVjdChpLml0ZW0uZGF0YSgidWktc2VsZWN0bWVudS1pdGVtIiksdCl9LGZvY3VzOmZ1bmN0aW9uKHQsaSl7dmFyIHM9aS5pdGVtLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpO251bGwhPWUuZm9jdXNJbmRleCYmcy5pbmRleCE9PWUuZm9jdXNJbmRleCYmKGUuX3RyaWdnZXIoImZvY3VzIix0LHtpdGVtOnN9KSxlLmlzT3Blbnx8ZS5fc2VsZWN0KHMsdCkpLGUuZm9jdXNJbmRleD1zLmluZGV4LGUuYnV0dG9uLmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsZS5tZW51SXRlbXMuZXEocy5pbmRleCkuYXR0cigiaWQiKSl9fSkubWVudSgiaW5zdGFuY2UiKSx0aGlzLm1lbnVJbnN0YW5jZS5fb2ZmKHRoaXMubWVudSwibW91c2VsZWF2ZSIpLHRoaXMubWVudUluc3RhbmNlLl9jbG9zZU9uRG9jdW1lbnRDbGljaz1mdW5jdGlvbigpe3JldHVybiExfSx0aGlzLm1lbnVJbnN0YW5jZS5faXNEaXZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuITF9fSxyZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fcmVmcmVzaE1lbnUoKSx0aGlzLmJ1dHRvbkl0ZW0ucmVwbGFjZVdpdGgodGhpcy5idXR0b25JdGVtPXRoaXMuX3JlbmRlckJ1dHRvbkl0ZW0odGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCkuZGF0YSgidWktc2VsZWN0bWVudS1pdGVtIil8fHt9KSksbnVsbD09PXRoaXMub3B0aW9ucy53aWR0aCYmdGhpcy5fcmVzaXplQnV0dG9uKCl9LF9yZWZyZXNoTWVudTpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbiIpO3RoaXMubWVudS5lbXB0eSgpLHRoaXMuX3BhcnNlT3B0aW9ucyhlKSx0aGlzLl9yZW5kZXJNZW51KHRoaXMubWVudSx0aGlzLml0ZW1zKSx0aGlzLm1lbnVJbnN0YW5jZS5yZWZyZXNoKCksdGhpcy5tZW51SXRlbXM9dGhpcy5tZW51LmZpbmQoImxpIikubm90KCIudWktc2VsZWN0bWVudS1vcHRncm91cCIpLmZpbmQoIi51aS1tZW51LWl0ZW0td3JhcHBlciIpLHRoaXMuX3JlbmRlcmVkPSEwLGUubGVuZ3RoJiYodD10aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKSx0aGlzLm1lbnVJbnN0YW5jZS5mb2N1cyhudWxsLHQpLHRoaXMuX3NldEFyaWEodC5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIikpKX0sb3BlbjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLl9yZW5kZXJlZD8odGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5tZW51LmZpbmQoIi51aS1zdGF0ZS1hY3RpdmUiKSxudWxsLCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLm1lbnVJbnN0YW5jZS5mb2N1cyhudWxsLHRoaXMuX2dldFNlbGVjdGVkSXRlbSgpKSk6dGhpcy5fcmVmcmVzaE1lbnUoKSx0aGlzLm1lbnVJdGVtcy5sZW5ndGgmJih0aGlzLmlzT3Blbj0hMCx0aGlzLl90b2dnbGVBdHRyKCksdGhpcy5fcmVzaXplTWVudSgpLHRoaXMuX3Bvc2l0aW9uKCksdGhpcy5fb24odGhpcy5kb2N1bWVudCx0aGlzLl9kb2N1bWVudENsaWNrKSx0aGlzLl90cmlnZ2VyKCJvcGVuIix0KSkpfSxfcG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLm1lbnVXcmFwLnBvc2l0aW9uKHQuZXh0ZW5kKHtvZjp0aGlzLmJ1dHRvbn0sdGhpcy5vcHRpb25zLnBvc2l0aW9uKSl9LGNsb3NlOmZ1bmN0aW9uKHQpe3RoaXMuaXNPcGVuJiYodGhpcy5pc09wZW49ITEsdGhpcy5fdG9nZ2xlQXR0cigpLHRoaXMucmFuZ2U9bnVsbCx0aGlzLl9vZmYodGhpcy5kb2N1bWVudCksdGhpcy5fdHJpZ2dlcigiY2xvc2UiLHQpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9ufSxtZW51V2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudX0sX3JlbmRlckJ1dHRvbkl0ZW06ZnVuY3Rpb24oZSl7dmFyIGk9dCgiPHNwYW4+Iik7cmV0dXJuIHRoaXMuX3NldFRleHQoaSxlLmxhYmVsKSx0aGlzLl9hZGRDbGFzcyhpLCJ1aS1zZWxlY3RtZW51LXRleHQiKSxpfSxfcmVuZGVyTWVudTpmdW5jdGlvbihlLGkpe3ZhciBzPXRoaXMsbj0iIjt0LmVhY2goaSxmdW5jdGlvbihpLG8pe3ZhciBhO28ub3B0Z3JvdXAhPT1uJiYoYT10KCI8bGk+Iix7dGV4dDpvLm9wdGdyb3VwfSkscy5fYWRkQ2xhc3MoYSwidWktc2VsZWN0bWVudS1vcHRncm91cCIsInVpLW1lbnUtZGl2aWRlciIrKG8uZWxlbWVudC5wYXJlbnQoIm9wdGdyb3VwIikucHJvcCgiZGlzYWJsZWQiKT8iIHVpLXN0YXRlLWRpc2FibGVkIjoiIikpLGEuYXBwZW5kVG8oZSksbj1vLm9wdGdyb3VwKSxzLl9yZW5kZXJJdGVtRGF0YShlLG8pfSl9LF9yZW5kZXJJdGVtRGF0YTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9yZW5kZXJJdGVtKHQsZSkuZGF0YSgidWktc2VsZWN0bWVudS1pdGVtIixlKX0sX3JlbmRlckl0ZW06ZnVuY3Rpb24oZSxpKXt2YXIgcz10KCI8bGk+Iiksbj10KCI8ZGl2PiIse3RpdGxlOmkuZWxlbWVudC5hdHRyKCJ0aXRsZSIpfSk7cmV0dXJuIGkuZGlzYWJsZWQmJnRoaXMuX2FkZENsYXNzKHMsbnVsbCwidWktc3RhdGUtZGlzYWJsZWQiKSx0aGlzLl9zZXRUZXh0KG4saS5sYWJlbCkscy5hcHBlbmQobikuYXBwZW5kVG8oZSl9LF9zZXRUZXh0OmZ1bmN0aW9uKHQsZSl7ZT90LnRleHQoZSk6dC5odG1sKCImIzE2MDsiKX0sX21vdmU6ZnVuY3Rpb24odCxlKXt2YXIgaSxzLG49Ii51aS1tZW51LWl0ZW0iO3RoaXMuaXNPcGVuP2k9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5mb2N1c0luZGV4KS5wYXJlbnQoImxpIik6KGk9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpLnBhcmVudCgibGkiKSxuKz0iOm5vdCgudWktc3RhdGUtZGlzYWJsZWQpIikscz0iZmlyc3QiPT09dHx8Imxhc3QiPT09dD9pWyJmaXJzdCI9PT10PyJwcmV2QWxsIjoibmV4dEFsbCJdKG4pLmVxKC0xKTppW3QrIkFsbCJdKG4pLmVxKDApLHMubGVuZ3RoJiZ0aGlzLm1lbnVJbnN0YW5jZS5mb2N1cyhlLHMpfSxfZ2V0U2VsZWN0ZWRJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudUl0ZW1zLmVxKHRoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4KS5wYXJlbnQoImxpIil9LF90b2dnbGU6ZnVuY3Rpb24odCl7dGhpc1t0aGlzLmlzT3Blbj8iY2xvc2UiOiJvcGVuIl0odCl9LF9zZXRTZWxlY3Rpb246ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLnJhbmdlJiYod2luZG93LmdldFNlbGVjdGlvbj8odD13aW5kb3cuZ2V0U2VsZWN0aW9uKCksdC5yZW1vdmVBbGxSYW5nZXMoKSx0LmFkZFJhbmdlKHRoaXMucmFuZ2UpKTp0aGlzLnJhbmdlLnNlbGVjdCgpLHRoaXMuYnV0dG9uLmZvY3VzKCkpfSxfZG9jdW1lbnRDbGljazp7bW91c2Vkb3duOmZ1bmN0aW9uKGUpe3RoaXMuaXNPcGVuJiYodChlLnRhcmdldCkuY2xvc2VzdCgiLnVpLXNlbGVjdG1lbnUtbWVudSwgIyIrdC51aS5lc2NhcGVTZWxlY3Rvcih0aGlzLmlkcy5idXR0b24pKS5sZW5ndGh8fHRoaXMuY2xvc2UoZSkpfX0sX2J1dHRvbkV2ZW50czp7bW91c2Vkb3duOmZ1bmN0aW9uKCl7dmFyIHQ7d2luZG93LmdldFNlbGVjdGlvbj8odD13aW5kb3cuZ2V0U2VsZWN0aW9uKCksdC5yYW5nZUNvdW50JiYodGhpcy5yYW5nZT10LmdldFJhbmdlQXQoMCkpKTp0aGlzLnJhbmdlPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpfSxjbGljazpmdW5jdGlvbih0KXt0aGlzLl9zZXRTZWxlY3Rpb24oKSx0aGlzLl90b2dnbGUodCl9LGtleWRvd246ZnVuY3Rpb24oZSl7dmFyIGk9ITA7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuVEFCOmNhc2UgdC51aS5rZXlDb2RlLkVTQ0FQRTp0aGlzLmNsb3NlKGUpLGk9ITE7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRU5URVI6dGhpcy5pc09wZW4mJnRoaXMuX3NlbGVjdEZvY3VzZWRJdGVtKGUpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLlVQOmUuYWx0S2V5P3RoaXMuX3RvZ2dsZShlKTp0aGlzLl9tb3ZlKCJwcmV2IixlKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5ET1dOOmUuYWx0S2V5P3RoaXMuX3RvZ2dsZShlKTp0aGlzLl9tb3ZlKCJuZXh0IixlKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5TUEFDRTp0aGlzLmlzT3Blbj90aGlzLl9zZWxlY3RGb2N1c2VkSXRlbShlKTp0aGlzLl90b2dnbGUoZSk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuTEVGVDp0aGlzLl9tb3ZlKCJwcmV2IixlKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5SSUdIVDp0aGlzLl9tb3ZlKCJuZXh0IixlKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5IT01FOmNhc2UgdC51aS5rZXlDb2RlLlBBR0VfVVA6dGhpcy5fbW92ZSgiZmlyc3QiLGUpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLkVORDpjYXNlIHQudWkua2V5Q29kZS5QQUdFX0RPV046dGhpcy5fbW92ZSgibGFzdCIsZSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm1lbnUudHJpZ2dlcihlKSxpPSExfWkmJmUucHJldmVudERlZmF1bHQoKX19LF9zZWxlY3RGb2N1c2VkSXRlbTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1lbnVJdGVtcy5lcSh0aGlzLmZvY3VzSW5kZXgpLnBhcmVudCgibGkiKTtlLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHx0aGlzLl9zZWxlY3QoZS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSx0KX0sX3NlbGVjdDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4O3RoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4PXQuaW5kZXgsdGhpcy5idXR0b25JdGVtLnJlcGxhY2VXaXRoKHRoaXMuYnV0dG9uSXRlbT10aGlzLl9yZW5kZXJCdXR0b25JdGVtKHQpKSx0aGlzLl9zZXRBcmlhKHQpLHRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTp0fSksdC5pbmRleCE9PWkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsZSx7aXRlbTp0fSksdGhpcy5jbG9zZShlKX0sX3NldEFyaWE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZW51SXRlbXMuZXEodC5pbmRleCkuYXR0cigiaWQiKTt0aGlzLmJ1dHRvbi5hdHRyKHsiYXJpYS1sYWJlbGxlZGJ5IjplLCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOmV9KSx0aGlzLm1lbnUuYXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IixlKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe2lmKCJpY29ucyI9PT10KXt2YXIgaT10aGlzLmJ1dHRvbi5maW5kKCJzcGFuLnVpLWljb24iKTt0aGlzLl9yZW1vdmVDbGFzcyhpLG51bGwsdGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbikuX2FkZENsYXNzKGksbnVsbCxlLmJ1dHRvbil9dGhpcy5fc3VwZXIodCxlKSwiYXBwZW5kVG8iPT09dCYmdGhpcy5tZW51V3JhcC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwid2lkdGgiPT09dCYmdGhpcy5fcmVzaXplQnV0dG9uKCl9LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLm1lbnVJbnN0YW5jZS5vcHRpb24oImRpc2FibGVkIix0KSx0aGlzLmJ1dHRvbi5hdHRyKCJhcmlhLWRpc2FibGVkIix0KSx0aGlzLl90b2dnbGVDbGFzcyh0aGlzLmJ1dHRvbixudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsdCksdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIix0KSx0Pyh0aGlzLmJ1dHRvbi5hdHRyKCJ0YWJpbmRleCIsLTEpLHRoaXMuY2xvc2UoKSk6dGhpcy5idXR0b24uYXR0cigidGFiaW5kZXgiLDApfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIGUmJihlPWUuanF1ZXJ5fHxlLm5vZGVUeXBlP3QoZSk6dGhpcy5kb2N1bWVudC5maW5kKGUpLmVxKDApKSxlJiZlWzBdfHwoZT10aGlzLmVsZW1lbnQuY2xvc2VzdCgiLnVpLWZyb250LCBkaWFsb2ciKSksZS5sZW5ndGh8fChlPXRoaXMuZG9jdW1lbnRbMF0uYm9keSksZX0sX3RvZ2dsZUF0dHI6ZnVuY3Rpb24oKXt0aGlzLmJ1dHRvbi5hdHRyKCJhcmlhLWV4cGFuZGVkIix0aGlzLmlzT3BlbiksdGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5idXR0b24sInVpLXNlbGVjdG1lbnUtYnV0dG9uLSIrKHRoaXMuaXNPcGVuPyJjbG9zZWQiOiJvcGVuIikpLl9hZGRDbGFzcyh0aGlzLmJ1dHRvbiwidWktc2VsZWN0bWVudS1idXR0b24tIisodGhpcy5pc09wZW4/Im9wZW4iOiJjbG9zZWQiKSkuX3RvZ2dsZUNsYXNzKHRoaXMubWVudVdyYXAsInVpLXNlbGVjdG1lbnUtb3BlbiIsbnVsbCx0aGlzLmlzT3BlbiksdGhpcy5tZW51LmF0dHIoImFyaWEtaGlkZGVuIiwhdGhpcy5pc09wZW4pfSxfcmVzaXplQnV0dG9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLndpZHRoO3JldHVybiB0PT09ITE/KHRoaXMuYnV0dG9uLmNzcygid2lkdGgiLCIiKSx2b2lkIDApOihudWxsPT09dCYmKHQ9dGhpcy5lbGVtZW50LnNob3coKS5vdXRlcldpZHRoKCksdGhpcy5lbGVtZW50LmhpZGUoKSksdGhpcy5idXR0b24ub3V0ZXJXaWR0aCh0KSx2b2lkIDApfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3RoaXMubWVudS5vdXRlcldpZHRoKE1hdGgubWF4KHRoaXMuYnV0dG9uLm91dGVyV2lkdGgoKSx0aGlzLm1lbnUud2lkdGgoIiIpLm91dGVyV2lkdGgoKSsxKSl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3VwZXIoKTtyZXR1cm4gdC5kaXNhYmxlZD10aGlzLmVsZW1lbnQucHJvcCgiZGlzYWJsZWQiKSx0fSxfcGFyc2VPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMscz1bXTtlLmVhY2goZnVuY3Rpb24oZSxuKXtzLnB1c2goaS5fcGFyc2VPcHRpb24odChuKSxlKSl9KSx0aGlzLml0ZW1zPXN9LF9wYXJzZU9wdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXQucGFyZW50KCJvcHRncm91cCIpO3JldHVybntlbGVtZW50OnQsaW5kZXg6ZSx2YWx1ZTp0LnZhbCgpLGxhYmVsOnQudGV4dCgpLG9wdGdyb3VwOmkuYXR0cigibGFiZWwiKXx8IiIsZGlzYWJsZWQ6aS5wcm9wKCJkaXNhYmxlZCIpfHx0LnByb3AoImRpc2FibGVkIil9fSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX3VuYmluZEZvcm1SZXNldEhhbmRsZXIoKSx0aGlzLm1lbnVXcmFwLnJlbW92ZSgpLHRoaXMuYnV0dG9uLnJlbW92ZSgpLHRoaXMuZWxlbWVudC5zaG93KCksdGhpcy5lbGVtZW50LnJlbW92ZVVuaXF1ZUlkKCksdGhpcy5sYWJlbHMuYXR0cigiZm9yIix0aGlzLmlkcy5lbGVtZW50KX19XSksdC53aWRnZXQoInVpLnNsaWRlciIsdC51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMi4xIix3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsY2xhc3Nlczp7InVpLXNsaWRlciI6InVpLWNvcm5lci1hbGwiLCJ1aS1zbGlkZXItaGFuZGxlIjoidWktY29ybmVyLWFsbCIsInVpLXNsaWRlci1yYW5nZSI6InVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWhlYWRlciJ9LGRpc3RhbmNlOjAsbWF4OjEwMCxtaW46MCxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmFuZ2U6ITEsc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGwsY2hhbmdlOm51bGwsc2xpZGU6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbH0sbnVtUGFnZXM6NSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fa2V5U2xpZGluZz0hMSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5fY2FsY3VsYXRlTmV3TWF4KCksdGhpcy5fYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uLCJ1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQiKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVSYW5nZSgpLHRoaXMuX2NyZWF0ZUhhbmRsZXMoKSx0aGlzLl9zZXR1cEV2ZW50cygpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpfSxfY3JlYXRlSGFuZGxlczpmdW5jdGlvbigpe3ZhciBlLGkscz10aGlzLm9wdGlvbnMsbj10aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNsaWRlci1oYW5kbGUiKSxvPSI8c3BhbiB0YWJpbmRleD0nMCc+PC9zcGFuPiIsYT1bXTtmb3IoaT1zLnZhbHVlcyYmcy52YWx1ZXMubGVuZ3RofHwxLG4ubGVuZ3RoPmkmJihuLnNsaWNlKGkpLnJlbW92ZSgpLG49bi5zbGljZSgwLGkpKSxlPW4ubGVuZ3RoO2k+ZTtlKyspYS5wdXNoKG8pO3RoaXMuaGFuZGxlcz1uLmFkZCh0KGEuam9pbigiIikpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkpLHRoaXMuX2FkZENsYXNzKHRoaXMuaGFuZGxlcywidWktc2xpZGVyLWhhbmRsZSIsInVpLXN0YXRlLWRlZmF1bHQiKSx0aGlzLmhhbmRsZT10aGlzLmhhbmRsZXMuZXEoMCksdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oZSl7dCh0aGlzKS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4IixlKS5hdHRyKCJ0YWJJbmRleCIsMCl9KX0sX2NyZWF0ZVJhbmdlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO2UucmFuZ2U/KGUucmFuZ2U9PT0hMCYmKGUudmFsdWVzP2UudmFsdWVzLmxlbmd0aCYmMiE9PWUudmFsdWVzLmxlbmd0aD9lLnZhbHVlcz1bZS52YWx1ZXNbMF0sZS52YWx1ZXNbMF1dOnQuaXNBcnJheShlLnZhbHVlcykmJihlLnZhbHVlcz1lLnZhbHVlcy5zbGljZSgwKSk6ZS52YWx1ZXM9W3RoaXMuX3ZhbHVlTWluKCksdGhpcy5fdmFsdWVNaW4oKV0pLHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UubGVuZ3RoPyh0aGlzLl9yZW1vdmVDbGFzcyh0aGlzLnJhbmdlLCJ1aS1zbGlkZXItcmFuZ2UtbWluIHVpLXNsaWRlci1yYW5nZS1tYXgiKSx0aGlzLnJhbmdlLmNzcyh7bGVmdDoiIixib3R0b206IiJ9KSk6KHRoaXMucmFuZ2U9dCgiPGRpdj4iKS5hcHBlbmRUbyh0aGlzLmVsZW1lbnQpLHRoaXMuX2FkZENsYXNzKHRoaXMucmFuZ2UsInVpLXNsaWRlci1yYW5nZSIpKSwoIm1pbiI9PT1lLnJhbmdlfHwibWF4Ij09PWUucmFuZ2UpJiZ0aGlzLl9hZGRDbGFzcyh0aGlzLnJhbmdlLCJ1aS1zbGlkZXItcmFuZ2UtIitlLnJhbmdlKSk6KHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5yYW5nZT1udWxsKQp9LF9zZXR1cEV2ZW50czpmdW5jdGlvbigpe3RoaXMuX29mZih0aGlzLmhhbmRsZXMpLHRoaXMuX29uKHRoaXMuaGFuZGxlcyx0aGlzLl9oYW5kbGVFdmVudHMpLHRoaXMuX2hvdmVyYWJsZSh0aGlzLmhhbmRsZXMpLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLmhhbmRsZXMpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuaGFuZGxlcy5yZW1vdmUoKSx0aGlzLnJhbmdlJiZ0aGlzLnJhbmdlLnJlbW92ZSgpLHRoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbixvLGEscixoLGwsYz10aGlzLHU9dGhpcy5vcHRpb25zO3JldHVybiB1LmRpc2FibGVkPyExOih0aGlzLmVsZW1lbnRTaXplPXt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX0sdGhpcy5lbGVtZW50T2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSxpPXt4OmUucGFnZVgseTplLnBhZ2VZfSxzPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShpKSxuPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSsxLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPU1hdGguYWJzKHMtYy52YWx1ZXMoZSkpOyhuPml8fG49PT1pJiYoZT09PWMuX2xhc3RDaGFuZ2VkVmFsdWV8fGMudmFsdWVzKGUpPT09dS5taW4pKSYmKG49aSxvPXQodGhpcyksYT1lKX0pLHI9dGhpcy5fc3RhcnQoZSxhKSxyPT09ITE/ITE6KHRoaXMuX21vdXNlU2xpZGluZz0hMCx0aGlzLl9oYW5kbGVJbmRleD1hLHRoaXMuX2FkZENsYXNzKG8sbnVsbCwidWktc3RhdGUtYWN0aXZlIiksby50cmlnZ2VyKCJmb2N1cyIpLGg9by5vZmZzZXQoKSxsPSF0KGUudGFyZ2V0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmlzKCIudWktc2xpZGVyLWhhbmRsZSIpLHRoaXMuX2NsaWNrT2Zmc2V0PWw/e2xlZnQ6MCx0b3A6MH06e2xlZnQ6ZS5wYWdlWC1oLmxlZnQtby53aWR0aCgpLzIsdG9wOmUucGFnZVktaC50b3Atby5oZWlnaHQoKS8yLShwYXJzZUludChvLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChvLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChvLmNzcygibWFyZ2luVG9wIiksMTApfHwwKX0sdGhpcy5oYW5kbGVzLmhhc0NsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfHx0aGlzLl9zbGlkZShlLGEscyksdGhpcy5fYW5pbWF0ZU9mZj0hMCwhMCkpfSxfbW91c2VTdGFydDpmdW5jdGlvbigpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQpe3ZhciBlPXt4OnQucGFnZVgseTp0LnBhZ2VZfSxpPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShlKTtyZXR1cm4gdGhpcy5fc2xpZGUodCx0aGlzLl9oYW5kbGVJbmRleCxpKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5oYW5kbGVzLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9zdG9wKHQsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2NoYW5nZSh0LHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2NsaWNrT2Zmc2V0PW51bGwsdGhpcy5fYW5pbWF0ZU9mZj0hMSwhMX0sX2RldGVjdE9yaWVudGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5vcmllbnRhdGlvbj0idmVydGljYWwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifSxfbm9ybVZhbHVlRnJvbU1vdXNlOmZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuLG87cmV0dXJuImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj8oZT10aGlzLmVsZW1lbnRTaXplLndpZHRoLGk9dC54LXRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC5sZWZ0OjApKTooZT10aGlzLmVsZW1lbnRTaXplLmhlaWdodCxpPXQueS10aGlzLmVsZW1lbnRPZmZzZXQudG9wLSh0aGlzLl9jbGlja09mZnNldD90aGlzLl9jbGlja09mZnNldC50b3A6MCkpLHM9aS9lLHM+MSYmKHM9MSksMD5zJiYocz0wKSwidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmKHM9MS1zKSxuPXRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSxvPXRoaXMuX3ZhbHVlTWluKCkrcypuLHRoaXMuX3RyaW1BbGlnblZhbHVlKG8pfSxfdWlIYXNoOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSxoYW5kbGVJbmRleDp0LHZhbHVlOnZvaWQgMCE9PWU/ZTp0aGlzLnZhbHVlKCl9O3JldHVybiB0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpJiYocy52YWx1ZT12b2lkIDAhPT1lP2U6dGhpcy52YWx1ZXModCkscy52YWx1ZXM9aXx8dGhpcy52YWx1ZXMoKSksc30sX2hhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RofSxfc3RhcnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQsdGhpcy5fdWlIYXNoKGUpKX0sX3NsaWRlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcyxuLG89dGhpcy52YWx1ZSgpLGE9dGhpcy52YWx1ZXMoKTt0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpJiYobj10aGlzLnZhbHVlcyhlPzA6MSksbz10aGlzLnZhbHVlcyhlKSwyPT09dGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYoaT0wPT09ZT9NYXRoLm1pbihuLGkpOk1hdGgubWF4KG4saSkpLGFbZV09aSksaSE9PW8mJihzPXRoaXMuX3RyaWdnZXIoInNsaWRlIix0LHRoaXMuX3VpSGFzaChlLGksYSkpLHMhPT0hMSYmKHRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy52YWx1ZXMoZSxpKTp0aGlzLnZhbHVlKGkpKSl9LF9zdG9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5fdHJpZ2dlcigic3RvcCIsdCx0aGlzLl91aUhhc2goZSkpfSxfY2hhbmdlOmZ1bmN0aW9uKHQsZSl7dGhpcy5fa2V5U2xpZGluZ3x8dGhpcy5fbW91c2VTbGlkaW5nfHwodGhpcy5fbGFzdENoYW5nZWRWYWx1ZT1lLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2goZSkpKX0sdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMub3B0aW9ucy52YWx1ZT10aGlzLl90cmltQWxpZ25WYWx1ZSh0KSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx2b2lkIDApOnRoaXMuX3ZhbHVlKCl9LHZhbHVlczpmdW5jdGlvbihlLGkpe3ZhciBzLG4sbztpZihhcmd1bWVudHMubGVuZ3RoPjEpcmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXNbZV09dGhpcy5fdHJpbUFsaWduVmFsdWUoaSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsZSksdm9pZCAwO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl92YWx1ZXMoKTtpZighdC5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIHRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy5fdmFsdWVzKGUpOnRoaXMudmFsdWUoKTtmb3Iocz10aGlzLm9wdGlvbnMudmFsdWVzLG49YXJndW1lbnRzWzBdLG89MDtzLmxlbmd0aD5vO28rPTEpc1tvXT10aGlzLl90cmltQWxpZ25WYWx1ZShuW29dKSx0aGlzLl9jaGFuZ2UobnVsbCxvKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLGkpe3ZhciBzLG49MDtzd2l0Y2goInJhbmdlIj09PWUmJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYoIm1pbiI9PT1pPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6Im1heCI9PT1pJiYodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3ZhbHVlcyh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aC0xKSx0aGlzLm9wdGlvbnMudmFsdWVzPW51bGwpKSx0LmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihuPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSx0aGlzLl9zdXBlcihlLGkpLGUpe2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fcmVtb3ZlQ2xhc3MoInVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIpLl9hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5vcHRpb25zLnJhbmdlJiZ0aGlzLl9yZWZyZXNoUmFuZ2UoaSksdGhpcy5oYW5kbGVzLmNzcygiaG9yaXpvbnRhbCI9PT1pPyJib3R0b20iOiJsZWZ0IiwiIik7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxzPW4tMTtzPj0wO3MtLSl0aGlzLl9jaGFuZ2UobnVsbCxzKTt0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2Uic3RlcCI6Y2FzZSJtaW4iOmNhc2UibWF4Ijp0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2NhbGN1bGF0ZU5ld01heCgpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2FuaW1hdGVPZmY9ITE7YnJlYWs7Y2FzZSJyYW5nZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX19LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KSx0aGlzLl90b2dnbGVDbGFzcyhudWxsLCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KX0sX3ZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnZhbHVlO3JldHVybiB0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpfSxfdmFsdWVzOmZ1bmN0aW9uKHQpe3ZhciBlLGkscztpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPXRoaXMub3B0aW9ucy52YWx1ZXNbdF0sZT10aGlzLl90cmltQWxpZ25WYWx1ZShlKTtpZih0aGlzLl9oYXNNdWx0aXBsZVZhbHVlcygpKXtmb3IoaT10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCkscz0wO2kubGVuZ3RoPnM7cys9MSlpW3NdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGlbc10pO3JldHVybiBpfXJldHVybltdfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5fdmFsdWVNaW4oKT49dClyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZih0Pj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciBlPXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxpPSh0LXRoaXMuX3ZhbHVlTWluKCkpJWUscz10LWk7cmV0dXJuIDIqTWF0aC5hYnMoaSk+PWUmJihzKz1pPjA/ZTotZSkscGFyc2VGbG9hdChzLnRvRml4ZWQoNSkpfSxfY2FsY3VsYXRlTmV3TWF4OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm1heCxlPXRoaXMuX3ZhbHVlTWluKCksaT10aGlzLm9wdGlvbnMuc3RlcCxzPU1hdGgucm91bmQoKHQtZSkvaSkqaTt0PXMrZSx0PnRoaXMub3B0aW9ucy5tYXgmJih0LT1pKSx0aGlzLm1heD1wYXJzZUZsb2F0KHQudG9GaXhlZCh0aGlzLl9wcmVjaXNpb24oKSkpfSxfcHJlY2lzaW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLnN0ZXApO3JldHVybiBudWxsIT09dGhpcy5vcHRpb25zLm1pbiYmKHQ9TWF0aC5tYXgodCx0aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMubWluKSkpLHR9LF9wcmVjaXNpb25PZjpmdW5jdGlvbih0KXt2YXIgZT0iIit0LGk9ZS5pbmRleE9mKCIuIik7cmV0dXJuLTE9PT1pPzA6ZS5sZW5ndGgtaS0xfSxfdmFsdWVNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1pbn0sX3ZhbHVlTWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4fSxfcmVmcmVzaFJhbmdlOmZ1bmN0aW9uKHQpeyJ2ZXJ0aWNhbCI9PT10JiZ0aGlzLnJhbmdlLmNzcyh7d2lkdGg6IiIsbGVmdDoiIn0pLCJob3Jpem9udGFsIj09PXQmJnRoaXMucmFuZ2UuY3NzKHtoZWlnaHQ6IiIsYm90dG9tOiIifSl9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSxpLHMsbixvLGE9dGhpcy5vcHRpb25zLnJhbmdlLHI9dGhpcy5vcHRpb25zLGg9dGhpcyxsPXRoaXMuX2FuaW1hdGVPZmY/ITE6ci5hbmltYXRlLGM9e307dGhpcy5faGFzTXVsdGlwbGVWYWx1ZXMoKT90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihzKXtpPTEwMCooKGgudmFsdWVzKHMpLWguX3ZhbHVlTWluKCkpLyhoLl92YWx1ZU1heCgpLWguX3ZhbHVlTWluKCkpKSxjWyJob3Jpem9udGFsIj09PWgub3JpZW50YXRpb24/ImxlZnQiOiJib3R0b20iXT1pKyIlIix0KHRoaXMpLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oYyxyLmFuaW1hdGUpLGgub3B0aW9ucy5yYW5nZT09PSEwJiYoImhvcml6b250YWwiPT09aC5vcmllbnRhdGlvbj8oMD09PXMmJmgucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmktZSsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSk6KDA9PT1zJiZoLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDppLWUrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpKSxlPWl9KToocz10aGlzLnZhbHVlKCksbj10aGlzLl92YWx1ZU1pbigpLG89dGhpcy5fdmFsdWVNYXgoKSxpPW8hPT1uPzEwMCooKHMtbikvKG8tbikpOjAsY1siaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyJsZWZ0IjoiYm90dG9tIl09aSsiJSIsdGhpcy5oYW5kbGUuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXShjLHIuYW5pbWF0ZSksIm1pbiI9PT1hJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09YSYmImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbbD8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDoxMDAtaSsiJSJ9LHIuYW5pbWF0ZSksIm1pbiI9PT1hJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbbD8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6aSsiJSJ9LHIuYW5pbWF0ZSksIm1heCI9PT1hJiYidmVydGljYWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbbD8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6MTAwLWkrIiUifSxyLmFuaW1hdGUpKX0sX2hhbmRsZUV2ZW50czp7a2V5ZG93bjpmdW5jdGlvbihlKXt2YXIgaSxzLG4sbyxhPXQoZS50YXJnZXQpLmRhdGEoInVpLXNsaWRlci1oYW5kbGUtaW5kZXgiKTtzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIHQudWkua2V5Q29kZS5IT01FOmNhc2UgdC51aS5rZXlDb2RlLkVORDpjYXNlIHQudWkua2V5Q29kZS5QQUdFX1VQOmNhc2UgdC51aS5rZXlDb2RlLlBBR0VfRE9XTjpjYXNlIHQudWkua2V5Q29kZS5VUDpjYXNlIHQudWkua2V5Q29kZS5SSUdIVDpjYXNlIHQudWkua2V5Q29kZS5ET1dOOmNhc2UgdC51aS5rZXlDb2RlLkxFRlQ6aWYoZS5wcmV2ZW50RGVmYXVsdCgpLCF0aGlzLl9rZXlTbGlkaW5nJiYodGhpcy5fa2V5U2xpZGluZz0hMCx0aGlzLl9hZGRDbGFzcyh0KGUudGFyZ2V0KSxudWxsLCJ1aS1zdGF0ZS1hY3RpdmUiKSxpPXRoaXMuX3N0YXJ0KGUsYSksaT09PSExKSlyZXR1cm59c3dpdGNoKG89dGhpcy5vcHRpb25zLnN0ZXAscz1uPXRoaXMuX2hhc011bHRpcGxlVmFsdWVzKCk/dGhpcy52YWx1ZXMoYSk6dGhpcy52YWx1ZSgpLGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuSE9NRTpuPXRoaXMuX3ZhbHVlTWluKCk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRU5EOm49dGhpcy5fdmFsdWVNYXgoKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5QQUdFX1VQOm49dGhpcy5fdHJpbUFsaWduVmFsdWUocysodGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIHQudWkua2V5Q29kZS5QQUdFX0RPV046bj10aGlzLl90cmltQWxpZ25WYWx1ZShzLSh0aGlzLl92YWx1ZU1heCgpLXRoaXMuX3ZhbHVlTWluKCkpL3RoaXMubnVtUGFnZXMpO2JyZWFrO2Nhc2UgdC51aS5rZXlDb2RlLlVQOmNhc2UgdC51aS5rZXlDb2RlLlJJR0hUOmlmKHM9PT10aGlzLl92YWx1ZU1heCgpKXJldHVybjtuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMrbyk7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuRE9XTjpjYXNlIHQudWkua2V5Q29kZS5MRUZUOmlmKHM9PT10aGlzLl92YWx1ZU1pbigpKXJldHVybjtuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMtbyl9dGhpcy5fc2xpZGUoZSxhLG4pfSxrZXl1cDpmdW5jdGlvbihlKXt2YXIgaT10KGUudGFyZ2V0KS5kYXRhKCJ1aS1zbGlkZXItaGFuZGxlLWluZGV4Iik7dGhpcy5fa2V5U2xpZGluZyYmKHRoaXMuX2tleVNsaWRpbmc9ITEsdGhpcy5fc3RvcChlLGkpLHRoaXMuX2NoYW5nZShlLGkpLHRoaXMuX3JlbW92ZUNsYXNzKHQoZS50YXJnZXQpLG51bGwsInVpLXN0YXRlLWFjdGl2ZSIpKX19fSksdC53aWRnZXQoInVpLnNwaW5uZXIiLHt2ZXJzaW9uOiIxLjEyLjEiLGRlZmF1bHRFbGVtZW50OiI8aW5wdXQ+Iix3aWRnZXRFdmVudFByZWZpeDoic3BpbiIsb3B0aW9uczp7Y2xhc3Nlczp7InVpLXNwaW5uZXIiOiJ1aS1jb3JuZXItYWxsIiwidWktc3Bpbm5lci1kb3duIjoidWktY29ybmVyLWJyIiwidWktc3Bpbm5lci11cCI6InVpLWNvcm5lci10ciJ9LGN1bHR1cmU6bnVsbCxpY29uczp7ZG93bjoidWktaWNvbi10cmlhbmdsZS0xLXMiLHVwOiJ1aS1pY29uLXRyaWFuZ2xlLTEtbiJ9LGluY3JlbWVudGFsOiEwLG1heDpudWxsLG1pbjpudWxsLG51bWJlckZvcm1hdDpudWxsLHBhZ2U6MTAsc3RlcDoxLGNoYW5nZTpudWxsLHNwaW46bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3NldE9wdGlvbigibWF4Iix0aGlzLm9wdGlvbnMubWF4KSx0aGlzLl9zZXRPcHRpb24oIm1pbiIsdGhpcy5vcHRpb25zLm1pbiksdGhpcy5fc2V0T3B0aW9uKCJzdGVwIix0aGlzLm9wdGlvbnMuc3RlcCksIiIhPT10aGlzLnZhbHVlKCkmJnRoaXMuX3ZhbHVlKHRoaXMuZWxlbWVudC52YWwoKSwhMCksdGhpcy5fZHJhdygpLHRoaXMuX29uKHRoaXMuX2V2ZW50cyksdGhpcy5fcmVmcmVzaCgpLHRoaXMuX29uKHRoaXMud2luZG93LHtiZWZvcmV1bmxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXV0b2NvbXBsZXRlIil9fSl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fc3VwZXIoKSxpPXRoaXMuZWxlbWVudDtyZXR1cm4gdC5lYWNoKFsibWluIiwibWF4Iiwic3RlcCJdLGZ1bmN0aW9uKHQscyl7dmFyIG49aS5hdHRyKHMpO251bGwhPW4mJm4ubGVuZ3RoJiYoZVtzXT1uKX0pLGV9LF9ldmVudHM6e2tleWRvd246ZnVuY3Rpb24odCl7dGhpcy5fc3RhcnQodCkmJnRoaXMuX2tleWRvd24odCkmJnQucHJldmVudERlZmF1bHQoKX0sa2V5dXA6Il9zdG9wIixmb2N1czpmdW5jdGlvbigpe3RoaXMucHJldmlvdXM9dGhpcy5lbGVtZW50LnZhbCgpfSxibHVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNhbmNlbEJsdXI/KGRlbGV0ZSB0aGlzLmNhbmNlbEJsdXIsdm9pZCAwKToodGhpcy5fc3RvcCgpLHRoaXMuX3JlZnJlc2goKSx0aGlzLnByZXZpb3VzIT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQpLHZvaWQgMCl9LG1vdXNld2hlZWw6ZnVuY3Rpb24odCxlKXtpZihlKXtpZighdGhpcy5zcGlubmluZyYmIXRoaXMuX3N0YXJ0KHQpKXJldHVybiExO3RoaXMuX3NwaW4oKGU+MD8xOi0xKSp0aGlzLm9wdGlvbnMuc3RlcCx0KSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMubW91c2V3aGVlbFRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5zcGlubmluZyYmdGhpcy5fc3RvcCh0KX0sMTAwKSx0LnByZXZlbnREZWZhdWx0KCl9fSwibW91c2Vkb3duIC51aS1zcGlubmVyLWJ1dHRvbiI6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gaSgpe3ZhciBlPXRoaXMuZWxlbWVudFswXT09PXQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSk7ZXx8KHRoaXMuZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLHRoaXMucHJldmlvdXM9cyx0aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMucHJldmlvdXM9c30pKX12YXIgcztzPXRoaXMuZWxlbWVudFswXT09PXQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSk/dGhpcy5wcmV2aW91czp0aGlzLmVsZW1lbnQudmFsKCksZS5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLmNhbmNlbEJsdXI9ITAsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5jYW5jZWxCbHVyLGkuY2FsbCh0aGlzKX0pLHRoaXMuX3N0YXJ0KGUpIT09ITEmJnRoaXMuX3JlcGVhdChudWxsLHQoZS5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3Bpbm5lci11cCIpPzE6LTEsZSl9LCJtb3VzZXVwIC51aS1zcGlubmVyLWJ1dHRvbiI6Il9zdG9wIiwibW91c2VlbnRlciAudWktc3Bpbm5lci1idXR0b24iOmZ1bmN0aW9uKGUpe3JldHVybiB0KGUuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpP3RoaXMuX3N0YXJ0KGUpPT09ITE/ITE6KHRoaXMuX3JlcGVhdChudWxsLHQoZS5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcygidWktc3Bpbm5lci11cCIpPzE6LTEsZSksdm9pZCAwKTp2b2lkIDB9LCJtb3VzZWxlYXZlIC51aS1zcGlubmVyLWJ1dHRvbiI6Il9zdG9wIn0sX2VuaGFuY2U6ZnVuY3Rpb24oKXt0aGlzLnVpU3Bpbm5lcj10aGlzLmVsZW1lbnQuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIikud3JhcCgiPHNwYW4+IikucGFyZW50KCkuYXBwZW5kKCI8YT48L2E+PGE+PC9hPiIpfSxfZHJhdzpmdW5jdGlvbigpe3RoaXMuX2VuaGFuY2UoKSx0aGlzLl9hZGRDbGFzcyh0aGlzLnVpU3Bpbm5lciwidWktc3Bpbm5lciIsInVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLHRoaXMuX2FkZENsYXNzKCJ1aS1zcGlubmVyLWlucHV0IiksdGhpcy5lbGVtZW50LmF0dHIoInJvbGUiLCJzcGluYnV0dG9uIiksdGhpcy5idXR0b25zPXRoaXMudWlTcGlubmVyLmNoaWxkcmVuKCJhIikuYXR0cigidGFiSW5kZXgiLC0xKS5hdHRyKCJhcmlhLWhpZGRlbiIsITApLmJ1dHRvbih7Y2xhc3Nlczp7InVpLWJ1dHRvbiI6IiJ9fSksdGhpcy5fcmVtb3ZlQ2xhc3ModGhpcy5idXR0b25zLCJ1aS1jb3JuZXItYWxsIiksdGhpcy5fYWRkQ2xhc3ModGhpcy5idXR0b25zLmZpcnN0KCksInVpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItdXAiKSx0aGlzLl9hZGRDbGFzcyh0aGlzLmJ1dHRvbnMubGFzdCgpLCJ1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLWRvd24iKSx0aGlzLmJ1dHRvbnMuZmlyc3QoKS5idXR0b24oe2ljb246dGhpcy5vcHRpb25zLmljb25zLnVwLHNob3dMYWJlbDohMX0pLHRoaXMuYnV0dG9ucy5sYXN0KCkuYnV0dG9uKHtpY29uOnRoaXMub3B0aW9ucy5pY29ucy5kb3duLHNob3dMYWJlbDohMX0pLHRoaXMuYnV0dG9ucy5oZWlnaHQoKT5NYXRoLmNlaWwoLjUqdGhpcy51aVNwaW5uZXIuaGVpZ2h0KCkpJiZ0aGlzLnVpU3Bpbm5lci5oZWlnaHQoKT4wJiZ0aGlzLnVpU3Bpbm5lci5oZWlnaHQodGhpcy51aVNwaW5uZXIuaGVpZ2h0KCkpfSxfa2V5ZG93bjpmdW5jdGlvbihlKXt2YXIgaT10aGlzLm9wdGlvbnMscz10LnVpLmtleUNvZGU7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSBzLlVQOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwxLGUpLCEwO2Nhc2Ugcy5ET1dOOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCwtMSxlKSwhMDtjYXNlIHMuUEFHRV9VUDpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsaS5wYWdlLGUpLCEwO2Nhc2Ugcy5QQUdFX0RPV046cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLC1pLnBhZ2UsZSksITB9cmV0dXJuITF9LF9zdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zcGlubmluZ3x8dGhpcy5fdHJpZ2dlcigic3RhcnQiLHQpIT09ITE/KHRoaXMuY291bnRlcnx8KHRoaXMuY291bnRlcj0xKSx0aGlzLnNwaW5uaW5nPSEwLCEwKTohMX0sX3JlcGVhdDpmdW5jdGlvbih0LGUsaSl7dD10fHw1MDAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9yZXBlYXQoNDAsZSxpKX0sdCksdGhpcy5fc3BpbihlKnRoaXMub3B0aW9ucy5zdGVwLGkpfSxfc3BpbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudmFsdWUoKXx8MDt0aGlzLmNvdW50ZXJ8fCh0aGlzLmNvdW50ZXI9MSksaT10aGlzLl9hZGp1c3RWYWx1ZShpK3QqdGhpcy5faW5jcmVtZW50KHRoaXMuY291bnRlcikpLHRoaXMuc3Bpbm5pbmcmJnRoaXMuX3RyaWdnZXIoInNwaW4iLGUse3ZhbHVlOml9KT09PSExfHwodGhpcy5fdmFsdWUoaSksdGhpcy5jb3VudGVyKyspfSxfaW5jcmVtZW50OmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDtyZXR1cm4gaT90LmlzRnVuY3Rpb24oaSk/aShlKTpNYXRoLmZsb29yKGUqZSplLzVlNC1lKmUvNTAwKzE3KmUvMjAwKzEpOjF9LF9wcmVjaXNpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMuc3RlcCk7cmV0dXJuIG51bGwhPT10aGlzLm9wdGlvbnMubWluJiYodD1NYXRoLm1heCh0LHRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5taW4pKSksdH0sX3ByZWNpc2lvbk9mOmZ1bmN0aW9uKHQpe3ZhciBlPSIiK3QsaT1lLmluZGV4T2YoIi4iKTtyZXR1cm4tMT09PWk/MDplLmxlbmd0aC1pLTF9LF9hZGp1c3RWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpLHM9dGhpcy5vcHRpb25zO3JldHVybiBlPW51bGwhPT1zLm1pbj9zLm1pbjowLGk9dC1lLGk9TWF0aC5yb3VuZChpL3Muc3RlcCkqcy5zdGVwLHQ9ZStpLHQ9cGFyc2VGbG9hdCh0LnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKSxudWxsIT09cy5tYXgmJnQ+cy5tYXg/cy5tYXg6bnVsbCE9PXMubWluJiZzLm1pbj50P3MubWluOnR9LF9zdG9wOmZ1bmN0aW9uKHQpe3RoaXMuc3Bpbm5pbmcmJihjbGVhclRpbWVvdXQodGhpcy50aW1lciksY2xlYXJUaW1lb3V0KHRoaXMubW91c2V3aGVlbFRpbWVyKSx0aGlzLmNvdW50ZXI9MCx0aGlzLnNwaW5uaW5nPSExLHRoaXMuX3RyaWdnZXIoInN0b3AiLHQpKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpLHMsbjtyZXR1cm4iY3VsdHVyZSI9PT10fHwibnVtYmVyRm9ybWF0Ij09PXQ/KGk9dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKSx0aGlzLm9wdGlvbnNbdF09ZSx0aGlzLmVsZW1lbnQudmFsKHRoaXMuX2Zvcm1hdChpKSksdm9pZCAwKTooKCJtYXgiPT09dHx8Im1pbiI9PT10fHwic3RlcCI9PT10KSYmInN0cmluZyI9PXR5cGVvZiBlJiYoZT10aGlzLl9wYXJzZShlKSksImljb25zIj09PXQmJihzPXRoaXMuYnV0dG9ucy5maXJzdCgpLmZpbmQoIi51aS1pY29uIiksdGhpcy5fcmVtb3ZlQ2xhc3MocyxudWxsLHRoaXMub3B0aW9ucy5pY29ucy51cCksdGhpcy5fYWRkQ2xhc3MocyxudWxsLGUudXApLG49dGhpcy5idXR0b25zLmxhc3QoKS5maW5kKCIudWktaWNvbiIpLHRoaXMuX3JlbW92ZUNsYXNzKG4sbnVsbCx0aGlzLm9wdGlvbnMuaWNvbnMuZG93biksdGhpcy5fYWRkQ2xhc3MobixudWxsLGUuZG93bikpLHRoaXMuX3N1cGVyKHQsZSksdm9pZCAwKX0sX3NldE9wdGlvbkRpc2FibGVkOmZ1bmN0aW9uKHQpe3RoaXMuX3N1cGVyKHQpLHRoaXMuX3RvZ2dsZUNsYXNzKHRoaXMudWlTcGlubmVyLG51bGwsInVpLXN0YXRlLWRpc2FibGVkIiwhIXQpLHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsISF0KSx0aGlzLmJ1dHRvbnMuYnV0dG9uKHQ/ImRpc2FibGUiOiJlbmFibGUiKX0sX3NldE9wdGlvbnM6cihmdW5jdGlvbih0KXt0aGlzLl9zdXBlcih0KX0pLF9wYXJzZTpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJiIiIT09dCYmKHQ9d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUucGFyc2VGbG9hdCh0LDEwLHRoaXMub3B0aW9ucy5jdWx0dXJlKTordCksIiI9PT10fHxpc05hTih0KT9udWxsOnR9LF9mb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIiI9PT10PyIiOndpbmRvdy5HbG9iYWxpemUmJnRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQ/R2xvYmFsaXplLmZvcm1hdCh0LHRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQsdGhpcy5vcHRpb25zLmN1bHR1cmUpOnR9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmF0dHIoeyJhcmlhLXZhbHVlbWluIjp0aGlzLm9wdGlvbnMubWluLCJhcmlhLXZhbHVlbWF4Ijp0aGlzLm9wdGlvbnMubWF4LCJhcmlhLXZhbHVlbm93Ijp0aGlzLl9wYXJzZSh0aGlzLmVsZW1lbnQudmFsKCkpfSl9LGlzVmFsaWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlKCk7cmV0dXJuIG51bGw9PT10PyExOnQ9PT10aGlzLl9hZGp1c3RWYWx1ZSh0KX0sX3ZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk7IiIhPT10JiYoaT10aGlzLl9wYXJzZSh0KSxudWxsIT09aSYmKGV8fChpPXRoaXMuX2FkanVzdFZhbHVlKGkpKSx0PXRoaXMuX2Zvcm1hdChpKSkpLHRoaXMuZWxlbWVudC52YWwodCksdGhpcy5fcmVmcmVzaCgpfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsITEpLnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSByb2xlIGFyaWEtdmFsdWVtaW4gYXJpYS12YWx1ZW1heCBhcmlhLXZhbHVlbm93IiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOnIoZnVuY3Rpb24odCl7dGhpcy5fc3RlcFVwKHQpfSksX3N0ZXBVcDpmdW5jdGlvbih0KXt0aGlzLl9zdGFydCgpJiYodGhpcy5fc3BpbigodHx8MSkqdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3N0b3AoKSl9LHN0ZXBEb3duOnIoZnVuY3Rpb24odCl7dGhpcy5fc3RlcERvd24odCl9KSxfc3RlcERvd246ZnVuY3Rpb24odCl7dGhpcy5fc3RhcnQoKSYmKHRoaXMuX3NwaW4oKHR8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCksdGhpcy5fc3RvcCgpKX0scGFnZVVwOnIoZnVuY3Rpb24odCl7dGhpcy5fc3RlcFVwKCh0fHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjpyKGZ1bmN0aW9uKHQpe3RoaXMuX3N0ZXBEb3duKCh0fHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLHQpLHZvaWQgMCk6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlTcGlubmVyfX0pLHQudWlCYWNrQ29tcGF0IT09ITEmJnQud2lkZ2V0KCJ1aS5zcGlubmVyIix0LnVpLnNwaW5uZXIse19lbmhhbmNlOmZ1bmN0aW9uKCl7dGhpcy51aVNwaW5uZXI9dGhpcy5lbGVtZW50LmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLndyYXAodGhpcy5fdWlTcGlubmVySHRtbCgpKS5wYXJlbnQoKS5hcHBlbmQodGhpcy5fYnV0dG9uSHRtbCgpKX0sX3VpU3Bpbm5lckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHNwYW4+In0sX2J1dHRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPGE+PC9hPjxhPjwvYT4ifX0pLHQudWkuc3Bpbm5lcix0LndpZGdldCgidWkudGFicyIse3ZlcnNpb246IjEuMTIuMSIsZGVsYXk6MzAwLG9wdGlvbnM6e2FjdGl2ZTpudWxsLGNsYXNzZXM6eyJ1aS10YWJzIjoidWktY29ybmVyLWFsbCIsInVpLXRhYnMtbmF2IjoidWktY29ybmVyLWFsbCIsInVpLXRhYnMtcGFuZWwiOiJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy10YWIiOiJ1aS1jb3JuZXItdG9wIn0sY29sbGFwc2libGU6ITEsZXZlbnQ6ImNsaWNrIixoZWlnaHRTdHlsZToiY29udGVudCIsaGlkZTpudWxsLHNob3c6bnVsbCxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGwsYmVmb3JlTG9hZDpudWxsLGxvYWQ6bnVsbH0sX2lzTG9jYWw6ZnVuY3Rpb24oKXt2YXIgdD0vIy4qJC87cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBpLHM7aT1lLmhyZWYucmVwbGFjZSh0LCIiKSxzPWxvY2F0aW9uLmhyZWYucmVwbGFjZSh0LCIiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2gobil7fXRyeXtzPWRlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChuKXt9cmV0dXJuIGUuaGFzaC5sZW5ndGg+MSYmaT09PXN9fSgpLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9dGhpcy5vcHRpb25zO3RoaXMucnVubmluZz0hMSx0aGlzLl9hZGRDbGFzcygidWktdGFicyIsInVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCIpLHRoaXMuX3RvZ2dsZUNsYXNzKCJ1aS10YWJzLWNvbGxhcHNpYmxlIixudWxsLGkuY29sbGFwc2libGUpLHRoaXMuX3Byb2Nlc3NUYWJzKCksaS5hY3RpdmU9dGhpcy5faW5pdGlhbEFjdGl2ZSgpLHQuaXNBcnJheShpLmRpc2FibGVkKSYmKGkuZGlzYWJsZWQ9dC51bmlxdWUoaS5kaXNhYmxlZC5jb25jYXQodC5tYXAodGhpcy50YWJzLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIiksZnVuY3Rpb24odCl7cmV0dXJuIGUudGFicy5pbmRleCh0KX0pKSkuc29ydCgpKSx0aGlzLmFjdGl2ZT10aGlzLm9wdGlvbnMuYWN0aXZlIT09ITEmJnRoaXMuYW5jaG9ycy5sZW5ndGg/dGhpcy5fZmluZEFjdGl2ZShpLmFjdGl2ZSk6dCgpLHRoaXMuX3JlZnJlc2goKSx0aGlzLmFjdGl2ZS5sZW5ndGgmJnRoaXMubG9hZChpLmFjdGl2ZSl9LF9pbml0aWFsQWN0aXZlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLmFjdGl2ZSxpPXRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSxzPWxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpO3JldHVybiBudWxsPT09ZSYmKHMmJnRoaXMudGFicy5lYWNoKGZ1bmN0aW9uKGksbil7cmV0dXJuIHQobikuYXR0cigiYXJpYS1jb250cm9scyIpPT09cz8oZT1pLCExKTp2b2lkIDB9KSxudWxsPT09ZSYmKGU9dGhpcy50YWJzLmluZGV4KHRoaXMudGFicy5maWx0ZXIoIi51aS10YWJzLWFjdGl2ZSIpKSksKG51bGw9PT1lfHwtMT09PWUpJiYoZT10aGlzLnRhYnMubGVuZ3RoPzA6ITEpKSxlIT09ITEmJihlPXRoaXMudGFicy5pbmRleCh0aGlzLnRhYnMuZXEoZSkpLC0xPT09ZSYmKGU9aT8hMTowKSksIWkmJmU9PT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aCYmKGU9MCksZX0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybnt0YWI6dGhpcy5hY3RpdmUscGFuZWw6dGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKTp0KCl9fSxfdGFiS2V5ZG93bjpmdW5jdGlvbihlKXt2YXIgaT10KHQudWkuc2FmZUFjdGl2ZUVsZW1lbnQodGhpcy5kb2N1bWVudFswXSkpLmNsb3Nlc3QoImxpIikscz10aGlzLnRhYnMuaW5kZXgoaSksbj0hMDtpZighdGhpcy5faGFuZGxlUGFnZU5hdihlKSl7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSB0LnVpLmtleUNvZGUuUklHSFQ6Y2FzZSB0LnVpLmtleUNvZGUuRE9XTjpzKys7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuVVA6Y2FzZSB0LnVpLmtleUNvZGUuTEVGVDpuPSExLHMtLTticmVhaztjYXNlIHQudWkua2V5Q29kZS5FTkQ6cz10aGlzLmFuY2hvcnMubGVuZ3RoLTE7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuSE9NRTpzPTA7YnJlYWs7Y2FzZSB0LnVpLmtleUNvZGUuU1BBQ0U6cmV0dXJuIGUucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSx0aGlzLl9hY3RpdmF0ZShzKSx2b2lkIDA7Y2FzZSB0LnVpLmtleUNvZGUuRU5URVI6cmV0dXJuIGUucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSx0aGlzLl9hY3RpdmF0ZShzPT09dGhpcy5vcHRpb25zLmFjdGl2ZT8hMTpzKSx2b2lkIDA7ZGVmYXVsdDpyZXR1cm59ZS5wcmV2ZW50RGVmYXVsdCgpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpbmcpLHM9dGhpcy5fZm9jdXNOZXh0VGFiKHMsbiksZS5jdHJsS2V5fHxlLm1ldGFLZXl8fChpLmF0dHIoImFyaWEtc2VsZWN0ZWQiLCJmYWxzZSIpLHRoaXMudGFicy5lcShzKS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwidHJ1ZSIpLHRoaXMuYWN0aXZhdGluZz10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMub3B0aW9uKCJhY3RpdmUiLHMpfSx0aGlzLmRlbGF5KSl9fSxfcGFuZWxLZXlkb3duOmZ1bmN0aW9uKGUpe3RoaXMuX2hhbmRsZVBhZ2VOYXYoZSl8fGUuY3RybEtleSYmZS5rZXlDb2RlPT09dC51aS5rZXlDb2RlLlVQJiYoZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuYWN0aXZlLnRyaWdnZXIoImZvY3VzIikpfSxfaGFuZGxlUGFnZU5hdjpmdW5jdGlvbihlKXtyZXR1cm4gZS5hbHRLZXkmJmUua2V5Q29kZT09PXQudWkua2V5Q29kZS5QQUdFX1VQPyh0aGlzLl9hY3RpdmF0ZSh0aGlzLl9mb2N1c05leHRUYWIodGhpcy5vcHRpb25zLmFjdGl2ZS0xLCExKSksITApOmUuYWx0S2V5JiZlLmtleUNvZGU9PT10LnVpLmtleUNvZGUuUEFHRV9ET1dOPyh0aGlzLl9hY3RpdmF0ZSh0aGlzLl9mb2N1c05leHRUYWIodGhpcy5vcHRpb25zLmFjdGl2ZSsxLCEwKSksITApOnZvaWQgMH0sX2ZpbmROZXh0VGFiOmZ1bmN0aW9uKGUsaSl7ZnVuY3Rpb24gcygpe3JldHVybiBlPm4mJihlPTApLDA+ZSYmKGU9biksZX1mb3IodmFyIG49dGhpcy50YWJzLmxlbmd0aC0xOy0xIT09dC5pbkFycmF5KHMoKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQpOyllPWk/ZSsxOmUtMTtyZXR1cm4gZX0sX2ZvY3VzTmV4dFRhYjpmdW5jdGlvbih0LGUpe3JldHVybiB0PXRoaXMuX2ZpbmROZXh0VGFiKHQsZSksdGhpcy50YWJzLmVxKHQpLnRyaWdnZXIoImZvY3VzIiksdH0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGUpe3JldHVybiJhY3RpdmUiPT09dD8odGhpcy5fYWN0aXZhdGUoZSksdm9pZCAwKToodGhpcy5fc3VwZXIodCxlKSwiY29sbGFwc2libGUiPT09dCYmKHRoaXMuX3RvZ2dsZUNsYXNzKCJ1aS10YWJzLWNvbGxhcHNpYmxlIixudWxsLGUpLGV8fHRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMXx8dGhpcy5fYWN0aXZhdGUoMCkpLCJldmVudCI9PT10JiZ0aGlzLl9zZXR1cEV2ZW50cyhlKSwiaGVpZ2h0U3R5bGUiPT09dCYmdGhpcy5fc2V0dXBIZWlnaHRTdHlsZShlKSx2b2lkIDApfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdD90LnJlcGxhY2UoL1shIiQlJicoKSorLC5cLzo7PD0+P0BcW1xdXF5ge3x9fl0vZywiXFwkJiIpOiIifSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLGk9dGhpcy50YWJsaXN0LmNoaWxkcmVuKCI6aGFzKGFbaHJlZl0pIik7ZS5kaXNhYmxlZD10Lm1hcChpLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIiksZnVuY3Rpb24odCl7cmV0dXJuIGkuaW5kZXgodCl9KSx0aGlzLl9wcm9jZXNzVGFicygpLGUuYWN0aXZlIT09ITEmJnRoaXMuYW5jaG9ycy5sZW5ndGg/dGhpcy5hY3RpdmUubGVuZ3RoJiYhdC5jb250YWlucyh0aGlzLnRhYmxpc3RbMF0sdGhpcy5hY3RpdmVbMF0pP3RoaXMudGFicy5sZW5ndGg9PT1lLmRpc2FibGVkLmxlbmd0aD8oZS5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9dCgpKTp0aGlzLl9hY3RpdmF0ZSh0aGlzLl9maW5kTmV4dFRhYihNYXRoLm1heCgwLGUuYWN0aXZlLTEpLCExKSk6ZS5hY3RpdmU9dGhpcy50YWJzLmluZGV4KHRoaXMuYWN0aXZlKTooZS5hY3RpdmU9ITEsdGhpcy5hY3RpdmU9dCgpKSx0aGlzLl9yZWZyZXNoKCl9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fc2V0T3B0aW9uRGlzYWJsZWQodGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9zZXR1cEV2ZW50cyh0aGlzLm9wdGlvbnMuZXZlbnQpLHRoaXMuX3NldHVwSGVpZ2h0U3R5bGUodGhpcy5vcHRpb25zLmhlaWdodFN0eWxlKSx0aGlzLnRhYnMubm90KHRoaXMuYWN0aXZlKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6ImZhbHNlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIix0YWJJbmRleDotMX0pLHRoaXMucGFuZWxzLm5vdCh0aGlzLl9nZXRQYW5lbEZvclRhYih0aGlzLmFjdGl2ZSkpLmhpZGUoKS5hdHRyKHsiYXJpYS1oaWRkZW4iOiJ0cnVlIn0pLHRoaXMuYWN0aXZlLmxlbmd0aD8odGhpcy5hY3RpdmUuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6InRydWUiLHRhYkluZGV4OjB9KSx0aGlzLl9hZGRDbGFzcyh0aGlzLmFjdGl2ZSwidWktdGFicy1hY3RpdmUiLCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLl9nZXRQYW5lbEZvclRhYih0aGlzLmFjdGl2ZSkuc2hvdygpLmF0dHIoeyJhcmlhLWhpZGRlbiI6ImZhbHNlIn0pKTp0aGlzLnRhYnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApfSxfcHJvY2Vzc1RhYnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9dGhpcy50YWJzLHM9dGhpcy5hbmNob3JzLG49dGhpcy5wYW5lbHM7dGhpcy50YWJsaXN0PXRoaXMuX2dldExpc3QoKS5hdHRyKCJyb2xlIiwidGFibGlzdCIpLHRoaXMuX2FkZENsYXNzKHRoaXMudGFibGlzdCwidWktdGFicy1uYXYiLCJ1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIiKSx0aGlzLnRhYmxpc3Qub24oIm1vdXNlZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSwiPiBsaSIsZnVuY3Rpb24oZSl7dCh0aGlzKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJmUucHJldmVudERlZmF1bHQoKX0pLm9uKCJmb2N1cyIrdGhpcy5ldmVudE5hbWVzcGFjZSwiLnVpLXRhYnMtYW5jaG9yIixmdW5jdGlvbigpe3QodGhpcykuY2xvc2VzdCgibGkiKS5pcygiLnVpLXN0YXRlLWRpc2FibGVkIikmJnRoaXMuYmx1cigpfSksdGhpcy50YWJzPXRoaXMudGFibGlzdC5maW5kKCI+IGxpOmhhcyhhW2hyZWZdKSIpLmF0dHIoe3JvbGU6InRhYiIsdGFiSW5kZXg6LTF9KSx0aGlzLl9hZGRDbGFzcyh0aGlzLnRhYnMsInVpLXRhYnMtdGFiIiwidWktc3RhdGUtZGVmYXVsdCIpLHRoaXMuYW5jaG9ycz10aGlzLnRhYnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHQoImEiLHRoaXMpWzBdfSkuYXR0cih7cm9sZToicHJlc2VudGF0aW9uIix0YWJJbmRleDotMX0pLHRoaXMuX2FkZENsYXNzKHRoaXMuYW5jaG9ycywidWktdGFicy1hbmNob3IiKSx0aGlzLnBhbmVscz10KCksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oaSxzKXt2YXIgbixvLGEscj10KHMpLnVuaXF1ZUlkKCkuYXR0cigiaWQiKSxoPXQocykuY2xvc2VzdCgibGkiKSxsPWguYXR0cigiYXJpYS1jb250cm9scyIpO2UuX2lzTG9jYWwocyk/KG49cy5oYXNoLGE9bi5zdWJzdHJpbmcoMSksbz1lLmVsZW1lbnQuZmluZChlLl9zYW5pdGl6ZVNlbGVjdG9yKG4pKSk6KGE9aC5hdHRyKCJhcmlhLWNvbnRyb2xzIil8fHQoe30pLnVuaXF1ZUlkKClbMF0uaWQsbj0iIyIrYSxvPWUuZWxlbWVudC5maW5kKG4pLG8ubGVuZ3RofHwobz1lLl9jcmVhdGVQYW5lbChhKSxvLmluc2VydEFmdGVyKGUucGFuZWxzW2ktMV18fGUudGFibGlzdCkpLG8uYXR0cigiYXJpYS1saXZlIiwicG9saXRlIikpLG8ubGVuZ3RoJiYoZS5wYW5lbHM9ZS5wYW5lbHMuYWRkKG8pKSxsJiZoLmRhdGEoInVpLXRhYnMtYXJpYS1jb250cm9scyIsbCksaC5hdHRyKHsiYXJpYS1jb250cm9scyI6YSwiYXJpYS1sYWJlbGxlZGJ5IjpyfSksby5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLHIpfSksdGhpcy5wYW5lbHMuYXR0cigicm9sZSIsInRhYnBhbmVsIiksdGhpcy5fYWRkQ2xhc3ModGhpcy5wYW5lbHMsInVpLXRhYnMtcGFuZWwiLCJ1aS13aWRnZXQtY29udGVudCIpLGkmJih0aGlzLl9vZmYoaS5ub3QodGhpcy50YWJzKSksdGhpcy5fb2ZmKHMubm90KHRoaXMuYW5jaG9ycykpLHRoaXMuX29mZihuLm5vdCh0aGlzLnBhbmVscykpKX0sX2dldExpc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJsaXN0fHx0aGlzLmVsZW1lbnQuZmluZCgib2wsIHVsIikuZXEoMCl9LF9jcmVhdGVQYW5lbDpmdW5jdGlvbihlKXtyZXR1cm4gdCgiPGRpdj4iKS5hdHRyKCJpZCIsZSkuZGF0YSgidWktdGFicy1kZXN0cm95IiwhMCl9LF9zZXRPcHRpb25EaXNhYmxlZDpmdW5jdGlvbihlKXt2YXIgaSxzLG47Zm9yKHQuaXNBcnJheShlKSYmKGUubGVuZ3RoP2UubGVuZ3RoPT09dGhpcy5hbmNob3JzLmxlbmd0aCYmKGU9ITApOmU9ITEpLG49MDtzPXRoaXMudGFic1tuXTtuKyspaT10KHMpLGU9PT0hMHx8LTEhPT10LmluQXJyYXkobixlKT8oaS5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpLHRoaXMuX2FkZENsYXNzKGksbnVsbCwidWktc3RhdGUtZGlzYWJsZWQiKSk6KGkucmVtb3ZlQXR0cigiYXJpYS1kaXNhYmxlZCIpLHRoaXMuX3JlbW92ZUNsYXNzKGksbnVsbCwidWktc3RhdGUtZGlzYWJsZWQiKSk7dGhpcy5vcHRpb25zLmRpc2FibGVkPWUsdGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy53aWRnZXQoKSx0aGlzLndpZGdldEZ1bGxOYW1lKyItZGlzYWJsZWQiLG51bGwsZT09PSEwKX0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKGUpe3ZhciBpPXt9O2UmJnQuZWFjaChlLnNwbGl0KCIgIiksZnVuY3Rpb24odCxlKXtpW2VdPSJfZXZlbnRIYW5kbGVyIn0pLHRoaXMuX29mZih0aGlzLmFuY2hvcnMuYWRkKHRoaXMudGFicykuYWRkKHRoaXMucGFuZWxzKSksdGhpcy5fb24oITAsdGhpcy5hbmNob3JzLHtjbGljazpmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCl9fSksdGhpcy5fb24odGhpcy5hbmNob3JzLGkpLHRoaXMuX29uKHRoaXMudGFicyx7a2V5ZG93bjoiX3RhYktleWRvd24ifSksdGhpcy5fb24odGhpcy5wYW5lbHMse2tleWRvd246Il9wYW5lbEtleWRvd24ifSksdGhpcy5fZm9jdXNhYmxlKHRoaXMudGFicyksdGhpcy5faG92ZXJhYmxlKHRoaXMudGFicyl9LF9zZXR1cEhlaWdodFN0eWxlOmZ1bmN0aW9uKGUpe3ZhciBpLHM9dGhpcy5lbGVtZW50LnBhcmVudCgpOyJmaWxsIj09PWU/KGk9cy5oZWlnaHQoKSxpLT10aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKS10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKCI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLHM9ZS5jc3MoInBvc2l0aW9uIik7ImFic29sdXRlIiE9PXMmJiJmaXhlZCIhPT1zJiYoaS09ZS5vdXRlckhlaWdodCghMCkpfSksdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7aS09dCh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLnBhbmVscy5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCxpLXQodGhpcykuaW5uZXJIZWlnaHQoKSt0KHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpKToiYXV0byI9PT1lJiYoaT0wLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtpPU1hdGgubWF4KGksdCh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChpKSl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj10KGUuY3VycmVudFRhcmdldCksbz1uLmNsb3Nlc3QoImxpIiksYT1vWzBdPT09c1swXSxyPWEmJmkuY29sbGFwc2libGUsaD1yP3QoKTp0aGlzLl9nZXRQYW5lbEZvclRhYihvKSxsPXMubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHMpOnQoKSxjPXtvbGRUYWI6cyxvbGRQYW5lbDpsLG5ld1RhYjpyP3QoKTpvLG5ld1BhbmVsOmh9O2UucHJldmVudERlZmF1bHQoKSxvLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxvLmhhc0NsYXNzKCJ1aS10YWJzLWxvYWRpbmciKXx8dGhpcy5ydW5uaW5nfHxhJiYhaS5jb2xsYXBzaWJsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlQWN0aXZhdGUiLGUsYyk9PT0hMXx8KGkuYWN0aXZlPXI/ITE6dGhpcy50YWJzLmluZGV4KG8pLHRoaXMuYWN0aXZlPWE/dCgpOm8sdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCksbC5sZW5ndGh8fGgubGVuZ3RofHx0LmVycm9yKCJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4iKSxoLmxlbmd0aCYmdGhpcy5sb2FkKHRoaXMudGFicy5pbmRleChvKSxlKSx0aGlzLl90b2dnbGUoZSxjKSl9LF90b2dnbGU6ZnVuY3Rpb24oZSxpKXtmdW5jdGlvbiBzKCl7by5ydW5uaW5nPSExLG8uX3RyaWdnZXIoImFjdGl2YXRlIixlLGkpfWZ1bmN0aW9uIG4oKXtvLl9hZGRDbGFzcyhpLm5ld1RhYi5jbG9zZXN0KCJsaSIpLCJ1aS10YWJzLWFjdGl2ZSIsInVpLXN0YXRlLWFjdGl2ZSIpLGEubGVuZ3RoJiZvLm9wdGlvbnMuc2hvdz9vLl9zaG93KGEsby5vcHRpb25zLnNob3cscyk6KGEuc2hvdygpLHMoKSl9dmFyIG89dGhpcyxhPWkubmV3UGFuZWwscj1pLm9sZFBhbmVsO3RoaXMucnVubmluZz0hMCxyLmxlbmd0aCYmdGhpcy5vcHRpb25zLmhpZGU/dGhpcy5faGlkZShyLHRoaXMub3B0aW9ucy5oaWRlLGZ1bmN0aW9uKCl7by5fcmVtb3ZlQ2xhc3MoaS5vbGRUYWIuY2xvc2VzdCgibGkiKSwidWktdGFicy1hY3RpdmUiLCJ1aS1zdGF0ZS1hY3RpdmUiKSxuKCl9KToodGhpcy5fcmVtb3ZlQ2xhc3MoaS5vbGRUYWIuY2xvc2VzdCgibGkiKSwidWktdGFicy1hY3RpdmUiLCJ1aS1zdGF0ZS1hY3RpdmUiKSxyLmhpZGUoKSxuKCkpLHIuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIiksaS5vbGRUYWIuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KSxhLmxlbmd0aCYmci5sZW5ndGg/aS5vbGRUYWIuYXR0cigidGFiSW5kZXgiLC0xKTphLmxlbmd0aCYmdGhpcy50YWJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09dCh0aGlzKS5hdHRyKCJ0YWJJbmRleCIpfSkuYXR0cigidGFiSW5kZXgiLC0xKSxhLmF0dHIoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSxpLm5ld1RhYi5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dmFyIGkscz10aGlzLl9maW5kQWN0aXZlKGUpO3NbMF0hPT10aGlzLmFjdGl2ZVswXSYmKHMubGVuZ3RofHwocz10aGlzLmFjdGl2ZSksaT1zLmZpbmQoIi51aS10YWJzLWFuY2hvciIpWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OnQubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0hMT90KCk6dGhpcy50YWJzLmVxKGUpfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSciK3QudWkuZXNjYXBlU2VsZWN0b3IoZSkrIiddIikpKSxlfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLHRoaXMudGFibGlzdC5yZW1vdmVBdHRyKCJyb2xlIikub2ZmKHRoaXMuZXZlbnROYW1lc3BhY2UpLHRoaXMuYW5jaG9ycy5yZW1vdmVBdHRyKCJyb2xlIHRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLnRhYnMuYWRkKHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7dC5kYXRhKHRoaXMsInVpLXRhYnMtZGVzdHJveSIpP3QodGhpcykucmVtb3ZlKCk6dCh0aGlzKS5yZW1vdmVBdHRyKCJyb2xlIHRhYkluZGV4IGFyaWEtbGl2ZSBhcmlhLWJ1c3kgYXJpYS1zZWxlY3RlZCBhcmlhLWxhYmVsbGVkYnkgYXJpYS1oaWRkZW4gYXJpYS1leHBhbmRlZCIpfSksdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLGk9ZS5kYXRhKCJ1aS10YWJzLWFyaWEtY29udHJvbHMiKTtpP2UuYXR0cigiYXJpYS1jb250cm9scyIsaSkucmVtb3ZlRGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIik6ZS5yZW1vdmVBdHRyKCJhcmlhLWNvbnRyb2xzIil9KSx0aGlzLnBhbmVscy5zaG93KCksImNvbnRlbnQiIT09dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlJiZ0aGlzLnBhbmVscy5jc3MoImhlaWdodCIsIiIpfSxlbmFibGU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zLmRpc2FibGVkO2khPT0hMSYmKHZvaWQgMD09PWU/aT0hMTooZT10aGlzLl9nZXRJbmRleChlKSxpPXQuaXNBcnJheShpKT90Lm1hcChpLGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZT90Om51bGx9KTp0Lm1hcCh0aGlzLnRhYnMsZnVuY3Rpb24odCxpKXtyZXR1cm4gaSE9PWU/aTpudWxsfSkpLHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKGkpKX0sZGlzYWJsZTpmdW5jdGlvbihlKXt2YXIgaT10aGlzLm9wdGlvbnMuZGlzYWJsZWQ7aWYoaSE9PSEwKXtpZih2b2lkIDA9PT1lKWk9ITA7ZWxzZXtpZihlPXRoaXMuX2dldEluZGV4KGUpLC0xIT09dC5pbkFycmF5KGUsaSkpcmV0dXJuO2k9dC5pc0FycmF5KGkpP3QubWVyZ2UoW2VdLGkpLnNvcnQoKTpbZV19dGhpcy5fc2V0T3B0aW9uRGlzYWJsZWQoaSl9fSxsb2FkOmZ1bmN0aW9uKGUsaSl7ZT10aGlzLl9nZXRJbmRleChlKTt2YXIgcz10aGlzLG49dGhpcy50YWJzLmVxKGUpLG89bi5maW5kKCIudWktdGFicy1hbmNob3IiKSxhPXRoaXMuX2dldFBhbmVsRm9yVGFiKG4pLHI9e3RhYjpuLHBhbmVsOmF9LGg9ZnVuY3Rpb24odCxlKXsiYWJvcnQiPT09ZSYmcy5wYW5lbHMuc3RvcCghMSwhMCkscy5fcmVtb3ZlQ2xhc3MobiwidWktdGFicy1sb2FkaW5nIiksYS5yZW1vdmVBdHRyKCJhcmlhLWJ1c3kiKSx0PT09cy54aHImJmRlbGV0ZSBzLnhocn07dGhpcy5faXNMb2NhbChvWzBdKXx8KHRoaXMueGhyPXQuYWpheCh0aGlzLl9hamF4U2V0dGluZ3MobyxpLHIpKSx0aGlzLnhociYmImNhbmNlbGVkIiE9PXRoaXMueGhyLnN0YXR1c1RleHQmJih0aGlzLl9hZGRDbGFzcyhuLCJ1aS10YWJzLWxvYWRpbmciKSxhLmF0dHIoImFyaWEtYnVzeSIsInRydWUiKSx0aGlzLnhoci5kb25lKGZ1bmN0aW9uKHQsZSxuKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5odG1sKHQpLHMuX3RyaWdnZXIoImxvYWQiLGksciksaChuLGUpfSwxKX0pLmZhaWwoZnVuY3Rpb24odCxlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aCh0LGUpfSwxKX0pKSl9LF9hamF4U2V0dGluZ3M6ZnVuY3Rpb24oZSxpLHMpe3ZhciBuPXRoaXM7cmV0dXJue3VybDplLmF0dHIoImhyZWYiKS5yZXBsYWNlKC8jLiokLywiIiksYmVmb3JlU2VuZDpmdW5jdGlvbihlLG8pe3JldHVybiBuLl90cmlnZ2VyKCJiZWZvcmVMb2FkIixpLHQuZXh0ZW5kKHtqcVhIUjplLGFqYXhTZXR0aW5nczpvfSxzKSl9fX0sX2dldFBhbmVsRm9yVGFiOmZ1bmN0aW9uKGUpe3ZhciBpPXQoZSkuYXR0cigiYXJpYS1jb250cm9scyIpO3JldHVybiB0aGlzLmVsZW1lbnQuZmluZCh0aGlzLl9zYW5pdGl6ZVNlbGVjdG9yKCIjIitpKSl9fSksdC51aUJhY2tDb21wYXQhPT0hMSYmdC53aWRnZXQoInVpLnRhYnMiLHQudWkudGFicyx7X3Byb2Nlc3NUYWJzOmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMuX2FkZENsYXNzKHRoaXMudGFicywidWktdGFiIil9fSksdC51aS50YWJzLHQud2lkZ2V0KCJ1aS50b29sdGlwIix7dmVyc2lvbjoiMS4xMi4xIixvcHRpb25zOntjbGFzc2VzOnsidWktdG9vbHRpcCI6InVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LXNoYWRvdyJ9LGNvbnRlbnQ6ZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpLmF0dHIoInRpdGxlIil8fCIiO3JldHVybiB0KCI8YT4iKS50ZXh0KGUpLmh0bWwoKX0saGlkZTohMCxpdGVtczoiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSkiLHBvc2l0aW9uOntteToibGVmdCB0b3ArMTUiLGF0OiJsZWZ0IGJvdHRvbSIsY29sbGlzaW9uOiJmbGlwZml0IGZsaXAifSxzaG93OiEwLHRyYWNrOiExLGNsb3NlOm51bGwsb3BlbjpudWxsfSxfYWRkRGVzY3JpYmVkQnk6ZnVuY3Rpb24oZSxpKXt2YXIgcz0oZS5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5zcGxpdCgvXHMrLyk7cy5wdXNoKGkpLGUuZGF0YSgidWktdG9vbHRpcC1pZCIsaSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIsdC50cmltKHMuam9pbigiICIpKSl9LF9yZW1vdmVEZXNjcmliZWRCeTpmdW5jdGlvbihlKXt2YXIgaT1lLmRhdGEoInVpLXRvb2x0aXAtaWQiKSxzPShlLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKXx8IiIpLnNwbGl0KC9ccysvKSxuPXQuaW5BcnJheShpLHMpOy0xIT09biYmcy5zcGxpY2UobiwxKSxlLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtaWQiKSxzPXQudHJpbShzLmpvaW4oIiAiKSkscz9lLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLHMpOmUucmVtb3ZlQXR0cigiYXJpYS1kZXNjcmliZWRieSIpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb24oe21vdXNlb3Zlcjoib3BlbiIsZm9jdXNpbjoib3BlbiJ9KSx0aGlzLnRvb2x0aXBzPXt9LHRoaXMucGFyZW50cz17fSx0aGlzLmxpdmVSZWdpb249dCgiPGRpdj4iKS5hdHRyKHtyb2xlOiJsb2ciLCJhcmlhLWxpdmUiOiJhc3NlcnRpdmUiLCJhcmlhLXJlbGV2YW50IjoiYWRkaXRpb25zIn0pLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksdGhpcy5fYWRkQ2xhc3ModGhpcy5saXZlUmVnaW9uLG51bGwsInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuZGlzYWJsZWRUaXRsZXM9dChbXSl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSxpKXt2YXIgcz10aGlzO3RoaXMuX3N1cGVyKGUsaSksImNvbnRlbnQiPT09ZSYmdC5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24odCxlKXtzLl91cGRhdGVDb250ZW50KGUuZWxlbWVudCl9KX0sX3NldE9wdGlvbkRpc2FibGVkOmZ1bmN0aW9uKHQpe3RoaXNbdD8iX2Rpc2FibGUiOiJfZW5hYmxlIl0oKX0sX2Rpc2FibGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGkscyl7dmFyIG49dC5FdmVudCgiYmx1ciIpO24udGFyZ2V0PW4uY3VycmVudFRhcmdldD1zLmVsZW1lbnRbMF0sZS5jbG9zZShuLCEwKX0pLHRoaXMuZGlzYWJsZWRUaXRsZXM9dGhpcy5kaXNhYmxlZFRpdGxlcy5hZGQodGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5hZGRCYWNrKCkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTtyZXR1cm4gZS5pcygiW3RpdGxlXSIpP2UuZGF0YSgidWktdG9vbHRpcC10aXRsZSIsZS5hdHRyKCJ0aXRsZSIpKS5yZW1vdmVBdHRyKCJ0aXRsZSIpOnZvaWQgMH0pKX0sX2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWRUaXRsZXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7ZS5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJmUuYXR0cigidGl0bGUiLGUuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pLHRoaXMuZGlzYWJsZWRUaXRsZXM9dChbXSl9LG9wZW46ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcyxzPXQoZT9lLnRhcmdldDp0aGlzLmVsZW1lbnQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLml0ZW1zKTtzLmxlbmd0aCYmIXMuZGF0YSgidWktdG9vbHRpcC1pZCIpJiYocy5hdHRyKCJ0aXRsZSIpJiZzLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiLHMuYXR0cigidGl0bGUiKSkscy5kYXRhKCJ1aS10b29sdGlwLW9wZW4iLCEwKSxlJiYibW91c2VvdmVyIj09PWUudHlwZSYmcy5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3ZhciBlLHM9dCh0aGlzKTtzLmRhdGEoInVpLXRvb2x0aXAtb3BlbiIpJiYoZT10LkV2ZW50KCJibHVyIiksZS50YXJnZXQ9ZS5jdXJyZW50VGFyZ2V0PXRoaXMsaS5jbG9zZShlLCEwKSkscy5hdHRyKCJ0aXRsZSIpJiYocy51bmlxdWVJZCgpLGkucGFyZW50c1t0aGlzLmlkXT17ZWxlbWVudDp0aGlzLHRpdGxlOnMuYXR0cigidGl0bGUiKX0scy5hdHRyKCJ0aXRsZSIsIiIpKX0pLHRoaXMuX3JlZ2lzdGVyQ2xvc2VIYW5kbGVycyhlLHMpLHRoaXMuX3VwZGF0ZUNvbnRlbnQocyxlKSl9LF91cGRhdGVDb250ZW50OmZ1bmN0aW9uKHQsZSl7dmFyIGkscz10aGlzLm9wdGlvbnMuY29udGVudCxuPXRoaXMsbz1lP2UudHlwZTpudWxsO3JldHVybiJzdHJpbmciPT10eXBlb2Ygc3x8cy5ub2RlVHlwZXx8cy5qcXVlcnk/dGhpcy5fb3BlbihlLHQscyk6KGk9cy5jYWxsKHRbMF0sZnVuY3Rpb24oaSl7bi5fZGVsYXkoZnVuY3Rpb24oKXt0LmRhdGEoInVpLXRvb2x0aXAtb3BlbiIpJiYoZSYmKGUudHlwZT1vKSx0aGlzLl9vcGVuKGUsdCxpKSl9KX0pLGkmJnRoaXMuX29wZW4oZSx0LGkpLHZvaWQgMCl9LF9vcGVuOmZ1bmN0aW9uKGUsaSxzKXtmdW5jdGlvbiBuKHQpe2wub2Y9dCxhLmlzKCI6aGlkZGVuIil8fGEucG9zaXRpb24obCl9dmFyIG8sYSxyLGgsbD10LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pO2lmKHMpe2lmKG89dGhpcy5fZmluZChpKSlyZXR1cm4gby50b29sdGlwLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKHMpLHZvaWQgMDtpLmlzKCJbdGl0bGVdIikmJihlJiYibW91c2VvdmVyIj09PWUudHlwZT9pLmF0dHIoInRpdGxlIiwiIik6aS5yZW1vdmVBdHRyKCJ0aXRsZSIpKSxvPXRoaXMuX3Rvb2x0aXAoaSksYT1vLnRvb2x0aXAsdGhpcy5fYWRkRGVzY3JpYmVkQnkoaSxhLmF0dHIoImlkIikpLGEuZmluZCgiLnVpLXRvb2x0aXAtY29udGVudCIpLmh0bWwocyksdGhpcy5saXZlUmVnaW9uLmNoaWxkcmVuKCkuaGlkZSgpLGg9dCgiPGRpdj4iKS5odG1sKGEuZmluZCgiLnVpLXRvb2x0aXAtY29udGVudCIpLmh0bWwoKSksaC5yZW1vdmVBdHRyKCJuYW1lIikuZmluZCgiW25hbWVdIikucmVtb3ZlQXR0cigibmFtZSIpLGgucmVtb3ZlQXR0cigiaWQiKS5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSxoLmFwcGVuZFRvKHRoaXMubGl2ZVJlZ2lvbiksdGhpcy5vcHRpb25zLnRyYWNrJiZlJiYvXm1vdXNlLy50ZXN0KGUudHlwZSk/KHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse21vdXNlbW92ZTpufSksbihlKSk6YS5wb3NpdGlvbih0LmV4dGVuZCh7b2Y6aX0sdGhpcy5vcHRpb25zLnBvc2l0aW9uKSksYS5oaWRlKCksdGhpcy5fc2hvdyhhLHRoaXMub3B0aW9ucy5zaG93KSx0aGlzLm9wdGlvbnMudHJhY2smJnRoaXMub3B0aW9ucy5zaG93JiZ0aGlzLm9wdGlvbnMuc2hvdy5kZWxheSYmKHI9dGhpcy5kZWxheWVkU2hvdz1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2EuaXMoIjp2aXNpYmxlIikmJihuKGwub2YpLGNsZWFySW50ZXJ2YWwocikpfSx0LmZ4LmludGVydmFsKSksdGhpcy5fdHJpZ2dlcigib3BlbiIsZSx7dG9vbHRpcDphfSl9fSxfcmVnaXN0ZXJDbG9zZUhhbmRsZXJzOmZ1bmN0aW9uKGUsaSl7dmFyIHM9e2tleXVwOmZ1bmN0aW9uKGUpe2lmKGUua2V5Q29kZT09PXQudWkua2V5Q29kZS5FU0NBUEUpe3ZhciBzPXQuRXZlbnQoZSk7cy5jdXJyZW50VGFyZ2V0PWlbMF0sdGhpcy5jbG9zZShzLCEwKX19fTtpWzBdIT09dGhpcy5lbGVtZW50WzBdJiYocy5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVUb29sdGlwKHRoaXMuX2ZpbmQoaSkudG9vbHRpcCl9KSxlJiYibW91c2VvdmVyIiE9PWUudHlwZXx8KHMubW91c2VsZWF2ZT0iY2xvc2UiKSxlJiYiZm9jdXNpbiIhPT1lLnR5cGV8fChzLmZvY3Vzb3V0PSJjbG9zZSIpLHRoaXMuX29uKCEwLGkscyl9LGNsb3NlOmZ1bmN0aW9uKGUpe3ZhciBpLHM9dGhpcyxuPXQoZT9lLmN1cnJlbnRUYXJnZXQ6dGhpcy5lbGVtZW50KSxvPXRoaXMuX2ZpbmQobik7cmV0dXJuIG8/KGk9by50b29sdGlwLG8uY2xvc2luZ3x8KGNsZWFySW50ZXJ2YWwodGhpcy5kZWxheWVkU2hvdyksbi5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJiFuLmF0dHIoInRpdGxlIikmJm4uYXR0cigidGl0bGUiLG4uZGF0YSgidWktdG9vbHRpcC10aXRsZSIpKSx0aGlzLl9yZW1vdmVEZXNjcmliZWRCeShuKSxvLmhpZGluZz0hMCxpLnN0b3AoITApLHRoaXMuX2hpZGUoaSx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3JlbW92ZVRvb2x0aXAodCh0aGlzKSl9KSxuLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtb3BlbiIpLHRoaXMuX29mZihuLCJtb3VzZWxlYXZlIGZvY3Vzb3V0IGtleXVwIiksblswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5fb2ZmKG4sInJlbW92ZSIpLHRoaXMuX29mZih0aGlzLmRvY3VtZW50LCJtb3VzZW1vdmUiKSxlJiYibW91c2VsZWF2ZSI9PT1lLnR5cGUmJnQuZWFjaCh0aGlzLnBhcmVudHMsZnVuY3Rpb24oZSxpKXt0KGkuZWxlbWVudCkuYXR0cigidGl0bGUiLGkudGl0bGUpLGRlbGV0ZSBzLnBhcmVudHNbZV0KfSksby5jbG9zaW5nPSEwLHRoaXMuX3RyaWdnZXIoImNsb3NlIixlLHt0b29sdGlwOml9KSxvLmhpZGluZ3x8KG8uY2xvc2luZz0hMSkpLHZvaWQgMCk6KG4ucmVtb3ZlRGF0YSgidWktdG9vbHRpcC1vcGVuIiksdm9pZCAwKX0sX3Rvb2x0aXA6ZnVuY3Rpb24oZSl7dmFyIGk9dCgiPGRpdj4iKS5hdHRyKCJyb2xlIiwidG9vbHRpcCIpLHM9dCgiPGRpdj4iKS5hcHBlbmRUbyhpKSxuPWkudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3JldHVybiB0aGlzLl9hZGRDbGFzcyhzLCJ1aS10b29sdGlwLWNvbnRlbnQiKSx0aGlzLl9hZGRDbGFzcyhpLCJ1aS10b29sdGlwIiwidWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IiksaS5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbyhlKSksdGhpcy50b29sdGlwc1tuXT17ZWxlbWVudDplLHRvb2x0aXA6aX19LF9maW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YSgidWktdG9vbHRpcC1pZCIpO3JldHVybiBlP3RoaXMudG9vbHRpcHNbZV06bnVsbH0sX3JlbW92ZVRvb2x0aXA6ZnVuY3Rpb24odCl7dC5yZW1vdmUoKSxkZWxldGUgdGhpcy50b29sdGlwc1t0LmF0dHIoImlkIildfSxfYXBwZW5kVG86ZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9zZXN0KCIudWktZnJvbnQsIGRpYWxvZyIpO3JldHVybiBlLmxlbmd0aHx8KGU9dGhpcy5kb2N1bWVudFswXS5ib2R5KSxlfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oaSxzKXt2YXIgbj10LkV2ZW50KCJibHVyIiksbz1zLmVsZW1lbnQ7bi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PW9bMF0sZS5jbG9zZShuLCEwKSx0KCIjIitpKS5yZW1vdmUoKSxvLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmKG8uYXR0cigidGl0bGUiKXx8by5hdHRyKCJ0aXRsZSIsby5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLG8ucmVtb3ZlRGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pLHRoaXMubGl2ZVJlZ2lvbi5yZW1vdmUoKX19KSx0LnVpQmFja0NvbXBhdCE9PSExJiZ0LndpZGdldCgidWkudG9vbHRpcCIsdC51aS50b29sdGlwLHtvcHRpb25zOnt0b29sdGlwQ2xhc3M6bnVsbH0sX3Rvb2x0aXA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdXBlckFwcGx5KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMub3B0aW9ucy50b29sdGlwQ2xhc3MmJnQudG9vbHRpcC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzKSx0fX0pLHQudWkudG9vbHRpcDt2YXIgZj0idWktZWZmZWN0cy0iLG09InVpLWVmZmVjdHMtc3R5bGUiLGc9InVpLWVmZmVjdHMtYW5pbWF0ZWQiLHY9dDt0LmVmZmVjdHM9e2VmZmVjdDp7fX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSxpKXt2YXIgcz11W2UudHlwZV18fHt9O3JldHVybiBudWxsPT10P2l8fCFlLmRlZj9udWxsOmUuZGVmOih0PXMuZmxvb3I/fn50OnBhcnNlRmxvYXQodCksaXNOYU4odCk/ZS5kZWY6cy5tb2Q/KHQrcy5tb2QpJXMubW9kOjA+dD8wOnQ+cy5tYXg/cy5tYXg6dCl9ZnVuY3Rpb24gcyhpKXt2YXIgcz1sKCksbj1zLl9yZ2JhPVtdO3JldHVybiBpPWkudG9Mb3dlckNhc2UoKSxmKGgsZnVuY3Rpb24odCxvKXt2YXIgYSxyPW8ucmUuZXhlYyhpKSxoPXImJm8ucGFyc2UociksbD1vLnNwYWNlfHwicmdiYSI7cmV0dXJuIGg/KGE9c1tsXShoKSxzW2NbbF0uY2FjaGVdPWFbY1tsXS5jYWNoZV0sbj1zLl9yZ2JhPWEuX3JnYmEsITEpOmV9KSxuLmxlbmd0aD8oIjAsMCwwLDAiPT09bi5qb2luKCkmJnQuZXh0ZW5kKG4sby50cmFuc3BhcmVudCkscyk6b1tpXX1mdW5jdGlvbiBuKHQsZSxpKXtyZXR1cm4gaT0oaSsxKSUxLDE+NippP3QrNiooZS10KSppOjE+MippP2U6Mj4zKmk/dCs2KihlLXQpKigyLzMtaSk6dH12YXIgbyxhPSJiYWNrZ3JvdW5kQ29sb3IgYm9yZGVyQm90dG9tQ29sb3IgYm9yZGVyTGVmdENvbG9yIGJvcmRlclJpZ2h0Q29sb3IgYm9yZGVyVG9wQ29sb3IgY29sb3IgY29sdW1uUnVsZUNvbG9yIG91dGxpbmVDb2xvciB0ZXh0RGVjb3JhdGlvbkNvbG9yIHRleHRFbXBoYXNpc0NvbG9yIixyPS9eKFtcLStdKT1ccyooXGQrXC4/XGQqKS8saD1be3JlOi9yZ2JhP1woXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8scGFyc2U6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMV0sdFsyXSx0WzNdLHRbNF1dfX0se3JlOi9yZ2JhP1woXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8scGFyc2U6ZnVuY3Rpb24odCl7cmV0dXJuWzIuNTUqdFsxXSwyLjU1KnRbMl0sMi41NSp0WzNdLHRbNF1dfX0se3JlOi8jKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pLyxwYXJzZTpmdW5jdGlvbih0KXtyZXR1cm5bcGFyc2VJbnQodFsxXSwxNikscGFyc2VJbnQodFsyXSwxNikscGFyc2VJbnQodFszXSwxNildfX0se3JlOi8jKFthLWYwLTldKShbYS1mMC05XSkoW2EtZjAtOV0pLyxwYXJzZTpmdW5jdGlvbih0KXtyZXR1cm5bcGFyc2VJbnQodFsxXSt0WzFdLDE2KSxwYXJzZUludCh0WzJdK3RbMl0sMTYpLHBhcnNlSW50KHRbM10rdFszXSwxNildfX0se3JlOi9oc2xhP1woXHMqKFxkKyg/OlwuXGQrKT8pXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqKD86LFxzKihcZD8oPzpcLlxkKyk/KVxzKik/XCkvLHNwYWNlOiJoc2xhIixwYXJzZTpmdW5jdGlvbih0KXtyZXR1cm5bdFsxXSx0WzJdLzEwMCx0WzNdLzEwMCx0WzRdXX19XSxsPXQuQ29sb3I9ZnVuY3Rpb24oZSxpLHMsbil7cmV0dXJuIG5ldyB0LkNvbG9yLmZuLnBhcnNlKGUsaSxzLG4pfSxjPXtyZ2JhOntwcm9wczp7cmVkOntpZHg6MCx0eXBlOiJieXRlIn0sZ3JlZW46e2lkeDoxLHR5cGU6ImJ5dGUifSxibHVlOntpZHg6Mix0eXBlOiJieXRlIn19fSxoc2xhOntwcm9wczp7aHVlOntpZHg6MCx0eXBlOiJkZWdyZWVzIn0sc2F0dXJhdGlvbjp7aWR4OjEsdHlwZToicGVyY2VudCJ9LGxpZ2h0bmVzczp7aWR4OjIsdHlwZToicGVyY2VudCJ9fX19LHU9eyJieXRlIjp7Zmxvb3I6ITAsbWF4OjI1NX0scGVyY2VudDp7bWF4OjF9LGRlZ3JlZXM6e21vZDozNjAsZmxvb3I6ITB9fSxkPWwuc3VwcG9ydD17fSxwPXQoIjxwPiIpWzBdLGY9dC5lYWNoO3Auc3R5bGUuY3NzVGV4dD0iYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDEsMSwxLC41KSIsZC5yZ2JhPXAuc3R5bGUuYmFja2dyb3VuZENvbG9yLmluZGV4T2YoInJnYmEiKT4tMSxmKGMsZnVuY3Rpb24odCxlKXtlLmNhY2hlPSJfIit0LGUucHJvcHMuYWxwaGE9e2lkeDozLHR5cGU6InBlcmNlbnQiLGRlZjoxfX0pLGwuZm49dC5leHRlbmQobC5wcm90b3R5cGUse3BhcnNlOmZ1bmN0aW9uKG4sYSxyLGgpe2lmKG49PT1lKXJldHVybiB0aGlzLl9yZ2JhPVtudWxsLG51bGwsbnVsbCxudWxsXSx0aGlzOyhuLmpxdWVyeXx8bi5ub2RlVHlwZSkmJihuPXQobikuY3NzKGEpLGE9ZSk7dmFyIHU9dGhpcyxkPXQudHlwZShuKSxwPXRoaXMuX3JnYmE9W107cmV0dXJuIGEhPT1lJiYobj1bbixhLHIsaF0sZD0iYXJyYXkiKSwic3RyaW5nIj09PWQ/dGhpcy5wYXJzZShzKG4pfHxvLl9kZWZhdWx0KToiYXJyYXkiPT09ZD8oZihjLnJnYmEucHJvcHMsZnVuY3Rpb24odCxlKXtwW2UuaWR4XT1pKG5bZS5pZHhdLGUpfSksdGhpcyk6Im9iamVjdCI9PT1kPyhuIGluc3RhbmNlb2YgbD9mKGMsZnVuY3Rpb24odCxlKXtuW2UuY2FjaGVdJiYodVtlLmNhY2hlXT1uW2UuY2FjaGVdLnNsaWNlKCkpfSk6ZihjLGZ1bmN0aW9uKGUscyl7dmFyIG89cy5jYWNoZTtmKHMucHJvcHMsZnVuY3Rpb24odCxlKXtpZighdVtvXSYmcy50byl7aWYoImFscGhhIj09PXR8fG51bGw9PW5bdF0pcmV0dXJuO3Vbb109cy50byh1Ll9yZ2JhKX11W29dW2UuaWR4XT1pKG5bdF0sZSwhMCl9KSx1W29dJiYwPnQuaW5BcnJheShudWxsLHVbb10uc2xpY2UoMCwzKSkmJih1W29dWzNdPTEscy5mcm9tJiYodS5fcmdiYT1zLmZyb20odVtvXSkpKX0pLHRoaXMpOmV9LGlzOmZ1bmN0aW9uKHQpe3ZhciBpPWwodCkscz0hMCxuPXRoaXM7cmV0dXJuIGYoYyxmdW5jdGlvbih0LG8pe3ZhciBhLHI9aVtvLmNhY2hlXTtyZXR1cm4gciYmKGE9bltvLmNhY2hlXXx8by50byYmby50byhuLl9yZ2JhKXx8W10sZihvLnByb3BzLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG51bGwhPXJbaS5pZHhdP3M9cltpLmlkeF09PT1hW2kuaWR4XTplfSkpLHN9KSxzfSxfc3BhY2U6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXM7cmV0dXJuIGYoYyxmdW5jdGlvbihpLHMpe2Vbcy5jYWNoZV0mJnQucHVzaChpKX0pLHQucG9wKCl9LHRyYW5zaXRpb246ZnVuY3Rpb24odCxlKXt2YXIgcz1sKHQpLG49cy5fc3BhY2UoKSxvPWNbbl0sYT0wPT09dGhpcy5hbHBoYSgpP2woInRyYW5zcGFyZW50Iik6dGhpcyxyPWFbby5jYWNoZV18fG8udG8oYS5fcmdiYSksaD1yLnNsaWNlKCk7cmV0dXJuIHM9c1tvLmNhY2hlXSxmKG8ucHJvcHMsZnVuY3Rpb24odCxuKXt2YXIgbz1uLmlkeCxhPXJbb10sbD1zW29dLGM9dVtuLnR5cGVdfHx7fTtudWxsIT09bCYmKG51bGw9PT1hP2hbb109bDooYy5tb2QmJihsLWE+Yy5tb2QvMj9hKz1jLm1vZDphLWw+Yy5tb2QvMiYmKGEtPWMubW9kKSksaFtvXT1pKChsLWEpKmUrYSxuKSkpfSksdGhpc1tuXShoKX0sYmxlbmQ6ZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMuX3JnYmFbM10pcmV0dXJuIHRoaXM7dmFyIGk9dGhpcy5fcmdiYS5zbGljZSgpLHM9aS5wb3AoKSxuPWwoZSkuX3JnYmE7cmV0dXJuIGwodC5tYXAoaSxmdW5jdGlvbih0LGUpe3JldHVybigxLXMpKm5bZV0rcyp0fSkpfSx0b1JnYmFTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0icmdiYSgiLGk9dC5tYXAodGhpcy5fcmdiYSxmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P2U+Mj8xOjA6dH0pO3JldHVybiAxPT09aVszXSYmKGkucG9wKCksZT0icmdiKCIpLGUraS5qb2luKCkrIikifSx0b0hzbGFTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iaHNsYSgiLGk9dC5tYXAodGhpcy5oc2xhKCksZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dCYmKHQ9ZT4yPzE6MCksZSYmMz5lJiYodD1NYXRoLnJvdW5kKDEwMCp0KSsiJSIpLHR9KTtyZXR1cm4gMT09PWlbM10mJihpLnBvcCgpLGU9ImhzbCgiKSxlK2kuam9pbigpKyIpIn0sdG9IZXhTdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5fcmdiYS5zbGljZSgpLHM9aS5wb3AoKTtyZXR1cm4gZSYmaS5wdXNoKH5+KDI1NSpzKSksIiMiK3QubWFwKGksZnVuY3Rpb24odCl7cmV0dXJuIHQ9KHR8fDApLnRvU3RyaW5nKDE2KSwxPT09dC5sZW5ndGg/IjAiK3Q6dH0pLmpvaW4oIiIpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fcmdiYVszXT8idHJhbnNwYXJlbnQiOnRoaXMudG9SZ2JhU3RyaW5nKCl9fSksbC5mbi5wYXJzZS5wcm90b3R5cGU9bC5mbixjLmhzbGEudG89ZnVuY3Rpb24odCl7aWYobnVsbD09dFswXXx8bnVsbD09dFsxXXx8bnVsbD09dFsyXSlyZXR1cm5bbnVsbCxudWxsLG51bGwsdFszXV07dmFyIGUsaSxzPXRbMF0vMjU1LG49dFsxXS8yNTUsbz10WzJdLzI1NSxhPXRbM10scj1NYXRoLm1heChzLG4sbyksaD1NYXRoLm1pbihzLG4sbyksbD1yLWgsYz1yK2gsdT0uNSpjO3JldHVybiBlPWg9PT1yPzA6cz09PXI/NjAqKG4tbykvbCszNjA6bj09PXI/NjAqKG8tcykvbCsxMjA6NjAqKHMtbikvbCsyNDAsaT0wPT09bD8wOi41Pj11P2wvYzpsLygyLWMpLFtNYXRoLnJvdW5kKGUpJTM2MCxpLHUsbnVsbD09YT8xOmFdfSxjLmhzbGEuZnJvbT1mdW5jdGlvbih0KXtpZihudWxsPT10WzBdfHxudWxsPT10WzFdfHxudWxsPT10WzJdKXJldHVybltudWxsLG51bGwsbnVsbCx0WzNdXTt2YXIgZT10WzBdLzM2MCxpPXRbMV0scz10WzJdLG89dFszXSxhPS41Pj1zP3MqKDEraSk6cytpLXMqaSxyPTIqcy1hO3JldHVybltNYXRoLnJvdW5kKDI1NSpuKHIsYSxlKzEvMykpLE1hdGgucm91bmQoMjU1Km4ocixhLGUpKSxNYXRoLnJvdW5kKDI1NSpuKHIsYSxlLTEvMykpLG9dfSxmKGMsZnVuY3Rpb24ocyxuKXt2YXIgbz1uLnByb3BzLGE9bi5jYWNoZSxoPW4udG8sYz1uLmZyb207bC5mbltzXT1mdW5jdGlvbihzKXtpZihoJiYhdGhpc1thXSYmKHRoaXNbYV09aCh0aGlzLl9yZ2JhKSkscz09PWUpcmV0dXJuIHRoaXNbYV0uc2xpY2UoKTt2YXIgbixyPXQudHlwZShzKSx1PSJhcnJheSI9PT1yfHwib2JqZWN0Ij09PXI/czphcmd1bWVudHMsZD10aGlzW2FdLnNsaWNlKCk7cmV0dXJuIGYobyxmdW5jdGlvbih0LGUpe3ZhciBzPXVbIm9iamVjdCI9PT1yP3Q6ZS5pZHhdO251bGw9PXMmJihzPWRbZS5pZHhdKSxkW2UuaWR4XT1pKHMsZSl9KSxjPyhuPWwoYyhkKSksblthXT1kLG4pOmwoZCl9LGYobyxmdW5jdGlvbihlLGkpe2wuZm5bZV18fChsLmZuW2VdPWZ1bmN0aW9uKG4pe3ZhciBvLGE9dC50eXBlKG4pLGg9ImFscGhhIj09PWU/dGhpcy5faHNsYT8iaHNsYSI6InJnYmEiOnMsbD10aGlzW2hdKCksYz1sW2kuaWR4XTtyZXR1cm4idW5kZWZpbmVkIj09PWE/YzooImZ1bmN0aW9uIj09PWEmJihuPW4uY2FsbCh0aGlzLGMpLGE9dC50eXBlKG4pKSxudWxsPT1uJiZpLmVtcHR5P3RoaXM6KCJzdHJpbmciPT09YSYmKG89ci5leGVjKG4pLG8mJihuPWMrcGFyc2VGbG9hdChvWzJdKSooIisiPT09b1sxXT8xOi0xKSkpLGxbaS5pZHhdPW4sdGhpc1toXShsKSkpfSl9KX0pLGwuaG9vaz1mdW5jdGlvbihlKXt2YXIgaT1lLnNwbGl0KCIgIik7ZihpLGZ1bmN0aW9uKGUsaSl7dC5jc3NIb29rc1tpXT17c2V0OmZ1bmN0aW9uKGUsbil7dmFyIG8sYSxyPSIiO2lmKCJ0cmFuc3BhcmVudCIhPT1uJiYoInN0cmluZyIhPT10LnR5cGUobil8fChvPXMobikpKSl7aWYobj1sKG98fG4pLCFkLnJnYmEmJjEhPT1uLl9yZ2JhWzNdKXtmb3IoYT0iYmFja2dyb3VuZENvbG9yIj09PWk/ZS5wYXJlbnROb2RlOmU7KCIiPT09cnx8InRyYW5zcGFyZW50Ij09PXIpJiZhJiZhLnN0eWxlOyl0cnl7cj10LmNzcyhhLCJiYWNrZ3JvdW5kQ29sb3IiKSxhPWEucGFyZW50Tm9kZX1jYXRjaChoKXt9bj1uLmJsZW5kKHImJiJ0cmFuc3BhcmVudCIhPT1yP3I6Il9kZWZhdWx0Iil9bj1uLnRvUmdiYVN0cmluZygpfXRyeXtlLnN0eWxlW2ldPW59Y2F0Y2goaCl7fX19LHQuZnguc3RlcFtpXT1mdW5jdGlvbihlKXtlLmNvbG9ySW5pdHx8KGUuc3RhcnQ9bChlLmVsZW0saSksZS5lbmQ9bChlLmVuZCksZS5jb2xvckluaXQ9ITApLHQuY3NzSG9va3NbaV0uc2V0KGUuZWxlbSxlLnN0YXJ0LnRyYW5zaXRpb24oZS5lbmQsZS5wb3MpKX19KX0sbC5ob29rKGEpLHQuY3NzSG9va3MuYm9yZGVyQ29sb3I9e2V4cGFuZDpmdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gZihbIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGZ1bmN0aW9uKGkscyl7ZVsiYm9yZGVyIitzKyJDb2xvciJdPXR9KSxlfX0sbz10LkNvbG9yLm5hbWVzPXthcXVhOiIjMDBmZmZmIixibGFjazoiIzAwMDAwMCIsYmx1ZToiIzAwMDBmZiIsZnVjaHNpYToiI2ZmMDBmZiIsZ3JheToiIzgwODA4MCIsZ3JlZW46IiMwMDgwMDAiLGxpbWU6IiMwMGZmMDAiLG1hcm9vbjoiIzgwMDAwMCIsbmF2eToiIzAwMDA4MCIsb2xpdmU6IiM4MDgwMDAiLHB1cnBsZToiIzgwMDA4MCIscmVkOiIjZmYwMDAwIixzaWx2ZXI6IiNjMGMwYzAiLHRlYWw6IiMwMDgwODAiLHdoaXRlOiIjZmZmZmZmIix5ZWxsb3c6IiNmZmZmMDAiLHRyYW5zcGFyZW50OltudWxsLG51bGwsbnVsbCwwXSxfZGVmYXVsdDoiI2ZmZmZmZiJ9fSh2KSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIGkscyxuPWUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz9lLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpOmUuY3VycmVudFN0eWxlLG89e307aWYobiYmbi5sZW5ndGgmJm5bMF0mJm5bblswXV0pZm9yKHM9bi5sZW5ndGg7cy0tOylpPW5bc10sInN0cmluZyI9PXR5cGVvZiBuW2ldJiYob1t0LmNhbWVsQ2FzZShpKV09bltpXSk7ZWxzZSBmb3IoaSBpbiBuKSJzdHJpbmciPT10eXBlb2YgbltpXSYmKG9baV09bltpXSk7cmV0dXJuIG99ZnVuY3Rpb24gaShlLGkpe3ZhciBzLG8sYT17fTtmb3IocyBpbiBpKW89aVtzXSxlW3NdIT09byYmKG5bc118fCh0LmZ4LnN0ZXBbc118fCFpc05hTihwYXJzZUZsb2F0KG8pKSkmJihhW3NdPW8pKTtyZXR1cm4gYX12YXIgcz1bImFkZCIsInJlbW92ZSIsInRvZ2dsZSJdLG49e2JvcmRlcjoxLGJvcmRlckJvdHRvbToxLGJvcmRlckNvbG9yOjEsYm9yZGVyTGVmdDoxLGJvcmRlclJpZ2h0OjEsYm9yZGVyVG9wOjEsYm9yZGVyV2lkdGg6MSxtYXJnaW46MSxwYWRkaW5nOjF9O3QuZWFjaChbImJvcmRlckxlZnRTdHlsZSIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJCb3R0b21TdHlsZSIsImJvcmRlclRvcFN0eWxlIl0sZnVuY3Rpb24oZSxpKXt0LmZ4LnN0ZXBbaV09ZnVuY3Rpb24odCl7KCJub25lIiE9PXQuZW5kJiYhdC5zZXRBdHRyfHwxPT09dC5wb3MmJiF0LnNldEF0dHIpJiYodi5zdHlsZSh0LmVsZW0saSx0LmVuZCksdC5zZXRBdHRyPSEwKX19KSx0LmZuLmFkZEJhY2t8fCh0LmZuLmFkZEJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PXQ/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIodCkpfSksdC5lZmZlY3RzLmFuaW1hdGVDbGFzcz1mdW5jdGlvbihuLG8sYSxyKXt2YXIgaD10LnNwZWVkKG8sYSxyKTtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBvLGE9dCh0aGlzKSxyPWEuYXR0cigiY2xhc3MiKXx8IiIsbD1oLmNoaWxkcmVuP2EuZmluZCgiKiIpLmFkZEJhY2soKTphO2w9bC5tYXAoZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpO3JldHVybntlbDppLHN0YXJ0OmUodGhpcyl9fSksbz1mdW5jdGlvbigpe3QuZWFjaChzLGZ1bmN0aW9uKHQsZSl7bltlXSYmYVtlKyJDbGFzcyJdKG5bZV0pfSl9LG8oKSxsPWwubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kPWUodGhpcy5lbFswXSksdGhpcy5kaWZmPWkodGhpcy5zdGFydCx0aGlzLmVuZCksdGhpc30pLGEuYXR0cigiY2xhc3MiLHIpLGw9bC5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9dC5EZWZlcnJlZCgpLHM9dC5leHRlbmQoe30saCx7cXVldWU6ITEsY29tcGxldGU6ZnVuY3Rpb24oKXtpLnJlc29sdmUoZSl9fSk7cmV0dXJuIHRoaXMuZWwuYW5pbWF0ZSh0aGlzLmRpZmYscyksaS5wcm9taXNlKCl9KSx0LndoZW4uYXBwbHkodCxsLmdldCgpKS5kb25lKGZ1bmN0aW9uKCl7bygpLHQuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVsO3QuZWFjaCh0aGlzLmRpZmYsZnVuY3Rpb24odCl7ZS5jc3ModCwiIil9KX0pLGguY29tcGxldGUuY2FsbChhWzBdKX0pfSl9LHQuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oaSxzLG4sbyl7cmV0dXJuIHM/dC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKHRoaXMse2FkZDppfSxzLG4sbyk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSh0LmZuLmFkZENsYXNzKSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oaSxzLG4sbyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90LmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7cmVtb3ZlOml9LHMsbixvKTplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KHQuZm4ucmVtb3ZlQ2xhc3MpLHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihpLHMsbixvLGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHN8fHZvaWQgMD09PXM/bj90LmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyxzP3thZGQ6aX06e3JlbW92ZTppfSxuLG8sYSk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKHRoaXMse3RvZ2dsZTppfSxzLG4sbyl9fSh0LmZuLnRvZ2dsZUNsYXNzKSxzd2l0Y2hDbGFzczpmdW5jdGlvbihlLGkscyxuLG8pe3JldHVybiB0LmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOmkscmVtb3ZlOmV9LHMsbixvKX19KX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxpLHMsbil7cmV0dXJuIHQuaXNQbGFpbk9iamVjdChlKSYmKGk9ZSxlPWUuZWZmZWN0KSxlPXtlZmZlY3Q6ZX0sbnVsbD09aSYmKGk9e30pLHQuaXNGdW5jdGlvbihpKSYmKG49aSxzPW51bGwsaT17fSksKCJudW1iZXIiPT10eXBlb2YgaXx8dC5meC5zcGVlZHNbaV0pJiYobj1zLHM9aSxpPXt9KSx0LmlzRnVuY3Rpb24ocykmJihuPXMscz1udWxsKSxpJiZ0LmV4dGVuZChlLGkpLHM9c3x8aS5kdXJhdGlvbixlLmR1cmF0aW9uPXQuZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBzP3M6cyBpbiB0LmZ4LnNwZWVkcz90LmZ4LnNwZWVkc1tzXTp0LmZ4LnNwZWVkcy5fZGVmYXVsdCxlLmNvbXBsZXRlPW58fGkuY29tcGxldGUsZX1mdW5jdGlvbiBpKGUpe3JldHVybiFlfHwibnVtYmVyIj09dHlwZW9mIGV8fHQuZnguc3BlZWRzW2VdPyEwOiJzdHJpbmciIT10eXBlb2YgZXx8dC5lZmZlY3RzLmVmZmVjdFtlXT90LmlzRnVuY3Rpb24oZSk/ITA6Im9iamVjdCIhPXR5cGVvZiBlfHxlLmVmZmVjdD8hMTohMDohMH1mdW5jdGlvbiBzKHQsZSl7dmFyIGk9ZS5vdXRlcldpZHRoKCkscz1lLm91dGVySGVpZ2h0KCksbj0vXnJlY3RcKCgtP1xkKlwuP1xkKnB4fC0/XGQrJXxhdXRvKSw/XHMqKC0/XGQqXC4/XGQqcHh8LT9cZCslfGF1dG8pLD9ccyooLT9cZCpcLj9cZCpweHwtP1xkKyV8YXV0byksP1xzKigtP1xkKlwuP1xkKnB4fC0/XGQrJXxhdXRvKVwpJC8sbz1uLmV4ZWModCl8fFsiIiwwLGkscywwXTtyZXR1cm57dG9wOnBhcnNlRmxvYXQob1sxXSl8fDAscmlnaHQ6ImF1dG8iPT09b1syXT9pOnBhcnNlRmxvYXQob1syXSksYm90dG9tOiJhdXRvIj09PW9bM10/czpwYXJzZUZsb2F0KG9bM10pLGxlZnQ6cGFyc2VGbG9hdChvWzRdKXx8MH19dC5leHByJiZ0LmV4cHIuZmlsdGVycyYmdC5leHByLmZpbHRlcnMuYW5pbWF0ZWQmJih0LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuISF0KGkpLmRhdGEoZyl8fGUoaSl9fSh0LmV4cHIuZmlsdGVycy5hbmltYXRlZCkpLHQudWlCYWNrQ29tcGF0IT09ITEmJnQuZXh0ZW5kKHQuZWZmZWN0cyx7c2F2ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHM9ZS5sZW5ndGg7cz5pO2krKyludWxsIT09ZVtpXSYmdC5kYXRhKGYrZVtpXSx0WzBdLnN0eWxlW2VbaV1dKX0scmVzdG9yZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxzPTAsbj1lLmxlbmd0aDtuPnM7cysrKW51bGwhPT1lW3NdJiYoaT10LmRhdGEoZitlW3NdKSx0LmNzcyhlW3NdLGkpKX0sc2V0TW9kZTpmdW5jdGlvbih0LGUpe3JldHVybiJ0b2dnbGUiPT09ZSYmKGU9dC5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLGV9LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7aWYoZS5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiBlLnBhcmVudCgpO3ZhciBpPXt3aWR0aDplLm91dGVyV2lkdGgoITApLGhlaWdodDplLm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOmUuY3NzKCJmbG9hdCIpfSxzPXQoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLG49e3dpZHRoOmUud2lkdGgoKSxoZWlnaHQ6ZS5oZWlnaHQoKX0sbz1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXtvLmlkfWNhdGNoKGEpe289ZG9jdW1lbnQuYm9keX1yZXR1cm4gZS53cmFwKHMpLChlWzBdPT09b3x8dC5jb250YWlucyhlWzBdLG8pKSYmdChvKS50cmlnZ2VyKCJmb2N1cyIpLHM9ZS5wYXJlbnQoKSwic3RhdGljIj09PWUuY3NzKCJwb3NpdGlvbiIpPyhzLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLGUuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOih0LmV4dGVuZChpLHtwb3NpdGlvbjplLmNzcygicG9zaXRpb24iKSx6SW5kZXg6ZS5jc3MoInotaW5kZXgiKX0pLHQuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKHQscyl7aVtzXT1lLmNzcyhzKSxpc05hTihwYXJzZUludChpW3NdLDEwKSkmJihpW3NdPSJhdXRvIil9KSxlLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksZS5jc3Mobikscy5jc3MoaSkuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIGUucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSYmKGUucGFyZW50KCkucmVwbGFjZVdpdGgoZSksKGVbMF09PT1pfHx0LmNvbnRhaW5zKGVbMF0saSkpJiZ0KGkpLnRyaWdnZXIoImZvY3VzIikpLGV9fSksdC5leHRlbmQodC5lZmZlY3RzLHt2ZXJzaW9uOiIxLjEyLjEiLGRlZmluZTpmdW5jdGlvbihlLGkscyl7cmV0dXJuIHN8fChzPWksaT0iZWZmZWN0IiksdC5lZmZlY3RzLmVmZmVjdFtlXT1zLHQuZWZmZWN0cy5lZmZlY3RbZV0ubW9kZT1pLHN9LHNjYWxlZERpbWVuc2lvbnM6ZnVuY3Rpb24odCxlLGkpe2lmKDA9PT1lKXJldHVybntoZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTt2YXIgcz0iaG9yaXpvbnRhbCIhPT1pPyhlfHwxMDApLzEwMDoxLG49InZlcnRpY2FsIiE9PWk/KGV8fDEwMCkvMTAwOjE7cmV0dXJue2hlaWdodDp0LmhlaWdodCgpKm4sd2lkdGg6dC53aWR0aCgpKnMsb3V0ZXJIZWlnaHQ6dC5vdXRlckhlaWdodCgpKm4sb3V0ZXJXaWR0aDp0Lm91dGVyV2lkdGgoKSpzfX0sY2xpcFRvQm94OmZ1bmN0aW9uKHQpe3JldHVybnt3aWR0aDp0LmNsaXAucmlnaHQtdC5jbGlwLmxlZnQsaGVpZ2h0OnQuY2xpcC5ib3R0b20tdC5jbGlwLnRvcCxsZWZ0OnQuY2xpcC5sZWZ0LHRvcDp0LmNsaXAudG9wfX0sdW5zaGlmdDpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dC5xdWV1ZSgpO2U+MSYmcy5zcGxpY2UuYXBwbHkocyxbMSwwXS5jb25jYXQocy5zcGxpY2UoZSxpKSkpLHQuZGVxdWV1ZSgpfSxzYXZlU3R5bGU6ZnVuY3Rpb24odCl7dC5kYXRhKG0sdFswXS5zdHlsZS5jc3NUZXh0KX0scmVzdG9yZVN0eWxlOmZ1bmN0aW9uKHQpe3RbMF0uc3R5bGUuY3NzVGV4dD10LmRhdGEobSl8fCIiLHQucmVtb3ZlRGF0YShtKX0sbW9kZTpmdW5jdGlvbih0LGUpe3ZhciBpPXQuaXMoIjpoaWRkZW4iKTtyZXR1cm4idG9nZ2xlIj09PWUmJihlPWk/InNob3ciOiJoaWRlIiksKGk/ImhpZGUiPT09ZToic2hvdyI9PT1lKSYmKGU9Im5vbmUiKSxlfSxnZXRCYXNlbGluZTpmdW5jdGlvbih0LGUpe3ZhciBpLHM7c3dpdGNoKHRbMF0pe2Nhc2UidG9wIjppPTA7YnJlYWs7Y2FzZSJtaWRkbGUiOmk9LjU7YnJlYWs7Y2FzZSJib3R0b20iOmk9MTticmVhaztkZWZhdWx0Omk9dFswXS9lLmhlaWdodH1zd2l0Y2godFsxXSl7Y2FzZSJsZWZ0IjpzPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOnM9LjU7YnJlYWs7Y2FzZSJyaWdodCI6cz0xO2JyZWFrO2RlZmF1bHQ6cz10WzFdL2Uud2lkdGh9cmV0dXJue3g6cyx5Oml9fSxjcmVhdGVQbGFjZWhvbGRlcjpmdW5jdGlvbihlKXt2YXIgaSxzPWUuY3NzKCJwb3NpdGlvbiIpLG49ZS5wb3NpdGlvbigpO3JldHVybiBlLmNzcyh7bWFyZ2luVG9wOmUuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5Cb3R0b206ZS5jc3MoIm1hcmdpbkJvdHRvbSIpLG1hcmdpbkxlZnQ6ZS5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5SaWdodDplLmNzcygibWFyZ2luUmlnaHQiKX0pLm91dGVyV2lkdGgoZS5vdXRlcldpZHRoKCkpLm91dGVySGVpZ2h0KGUub3V0ZXJIZWlnaHQoKSksL14oc3RhdGljfHJlbGF0aXZlKS8udGVzdChzKSYmKHM9ImFic29sdXRlIixpPXQoIjwiK2VbMF0ubm9kZU5hbWUrIj4iKS5pbnNlcnRBZnRlcihlKS5jc3Moe2Rpc3BsYXk6L14oaW5saW5lfHJ1YnkpLy50ZXN0KGUuY3NzKCJkaXNwbGF5IikpPyJpbmxpbmUtYmxvY2siOiJibG9jayIsdmlzaWJpbGl0eToiaGlkZGVuIixtYXJnaW5Ub3A6ZS5jc3MoIm1hcmdpblRvcCIpLG1hcmdpbkJvdHRvbTplLmNzcygibWFyZ2luQm90dG9tIiksbWFyZ2luTGVmdDplLmNzcygibWFyZ2luTGVmdCIpLG1hcmdpblJpZ2h0OmUuY3NzKCJtYXJnaW5SaWdodCIpLCJmbG9hdCI6ZS5jc3MoImZsb2F0Iil9KS5vdXRlcldpZHRoKGUub3V0ZXJXaWR0aCgpKS5vdXRlckhlaWdodChlLm91dGVySGVpZ2h0KCkpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLXBsYWNlaG9sZGVyIiksZS5kYXRhKGYrInBsYWNlaG9sZGVyIixpKSksZS5jc3Moe3Bvc2l0aW9uOnMsbGVmdDpuLmxlZnQsdG9wOm4udG9wfSksaX0scmVtb3ZlUGxhY2Vob2xkZXI6ZnVuY3Rpb24odCl7dmFyIGU9ZisicGxhY2Vob2xkZXIiLGk9dC5kYXRhKGUpO2kmJihpLnJlbW92ZSgpLHQucmVtb3ZlRGF0YShlKSl9LGNsZWFuVXA6ZnVuY3Rpb24oZSl7dC5lZmZlY3RzLnJlc3RvcmVTdHlsZShlKSx0LmVmZmVjdHMucmVtb3ZlUGxhY2Vob2xkZXIoZSl9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24oZSxpLHMsbil7cmV0dXJuIG49bnx8e30sdC5lYWNoKGksZnVuY3Rpb24odCxpKXt2YXIgbz1lLmNzc1VuaXQoaSk7b1swXT4wJiYobltpXT1vWzBdKnMrb1sxXSl9KSxufX0pLHQuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKGUpe2Z1bmN0aW9uIGkoKXtyLnJlbW92ZURhdGEoZyksdC5lZmZlY3RzLmNsZWFuVXAociksImhpZGUiPT09cy5tb2RlJiZyLmhpZGUoKSxhKCl9ZnVuY3Rpb24gYSgpe3QuaXNGdW5jdGlvbihoKSYmaC5jYWxsKHJbMF0pLHQuaXNGdW5jdGlvbihlKSYmZSgpfXZhciByPXQodGhpcyk7cy5tb2RlPWMuc2hpZnQoKSx0LnVpQmFja0NvbXBhdD09PSExfHxvPyJub25lIj09PXMubW9kZT8ocltsXSgpLGEoKSk6bi5jYWxsKHJbMF0scyxpKTooci5pcygiOmhpZGRlbiIpPyJoaWRlIj09PWw6InNob3ciPT09bCk/KHJbbF0oKSxhKCkpOm4uY2FsbChyWzBdLHMsYSl9dmFyIHM9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj10LmVmZmVjdHMuZWZmZWN0W3MuZWZmZWN0XSxvPW4ubW9kZSxhPXMucXVldWUscj1hfHwiZngiLGg9cy5jb21wbGV0ZSxsPXMubW9kZSxjPVtdLHU9ZnVuY3Rpb24oZSl7dmFyIGk9dCh0aGlzKSxzPXQuZWZmZWN0cy5tb2RlKGksbCl8fG87aS5kYXRhKGcsITApLGMucHVzaChzKSxvJiYoInNob3ciPT09c3x8cz09PW8mJiJoaWRlIj09PXMpJiZpLnNob3coKSxvJiYibm9uZSI9PT1zfHx0LmVmZmVjdHMuc2F2ZVN0eWxlKGkpLHQuaXNGdW5jdGlvbihlKSYmZSgpfTtyZXR1cm4gdC5meC5vZmZ8fCFuP2w/dGhpc1tsXShzLmR1cmF0aW9uLGgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2gmJmguY2FsbCh0aGlzKX0pOmE9PT0hMT90aGlzLmVhY2godSkuZWFjaChpKTp0aGlzLnF1ZXVlKHIsdSkucXVldWUocixpKX0sc2hvdzpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKSlyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0ic2hvdyIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLG4pfX0odC5mbi5zaG93KSxoaWRlOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpKXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fSh0LmZuLmhpZGUpLHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKXx8ImJvb2xlYW4iPT10eXBlb2YgcylyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0idG9nZ2xlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fSh0LmZuLnRvZ2dsZSksY3NzVW5pdDpmdW5jdGlvbihlKXt2YXIgaT10aGlzLmNzcyhlKSxzPVtdO3JldHVybiB0LmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24odCxlKXtpLmluZGV4T2YoZSk+MCYmKHM9W3BhcnNlRmxvYXQoaSksZV0pfSksc30sY3NzQ2xpcDpmdW5jdGlvbih0KXtyZXR1cm4gdD90aGlzLmNzcygiY2xpcCIsInJlY3QoIit0LnRvcCsicHggIit0LnJpZ2h0KyJweCAiK3QuYm90dG9tKyJweCAiK3QubGVmdCsicHgpIik6cyh0aGlzLmNzcygiY2xpcCIpLHRoaXMpfSx0cmFuc2ZlcjpmdW5jdGlvbihlLGkpe3ZhciBzPXQodGhpcyksbj10KGUudG8pLG89ImZpeGVkIj09PW4uY3NzKCJwb3NpdGlvbiIpLGE9dCgiYm9keSIpLHI9bz9hLnNjcm9sbFRvcCgpOjAsaD1vP2Euc2Nyb2xsTGVmdCgpOjAsbD1uLm9mZnNldCgpLGM9e3RvcDpsLnRvcC1yLGxlZnQ6bC5sZWZ0LWgsaGVpZ2h0Om4uaW5uZXJIZWlnaHQoKSx3aWR0aDpuLmlubmVyV2lkdGgoKX0sdT1zLm9mZnNldCgpLGQ9dCgiPGRpdiBjbGFzcz0ndWktZWZmZWN0cy10cmFuc2Zlcic+PC9kaXY+IikuYXBwZW5kVG8oImJvZHkiKS5hZGRDbGFzcyhlLmNsYXNzTmFtZSkuY3NzKHt0b3A6dS50b3AtcixsZWZ0OnUubGVmdC1oLGhlaWdodDpzLmlubmVySGVpZ2h0KCksd2lkdGg6cy5pbm5lcldpZHRoKCkscG9zaXRpb246bz8iZml4ZWQiOiJhYnNvbHV0ZSJ9KS5hbmltYXRlKGMsZS5kdXJhdGlvbixlLmVhc2luZyxmdW5jdGlvbigpe2QucmVtb3ZlKCksdC5pc0Z1bmN0aW9uKGkpJiZpKCl9KX19KSx0LmZ4LnN0ZXAuY2xpcD1mdW5jdGlvbihlKXtlLmNsaXBJbml0fHwoZS5zdGFydD10KGUuZWxlbSkuY3NzQ2xpcCgpLCJzdHJpbmciPT10eXBlb2YgZS5lbmQmJihlLmVuZD1zKGUuZW5kLGUuZWxlbSkpLGUuY2xpcEluaXQ9ITApLHQoZS5lbGVtKS5jc3NDbGlwKHt0b3A6ZS5wb3MqKGUuZW5kLnRvcC1lLnN0YXJ0LnRvcCkrZS5zdGFydC50b3AscmlnaHQ6ZS5wb3MqKGUuZW5kLnJpZ2h0LWUuc3RhcnQucmlnaHQpK2Uuc3RhcnQucmlnaHQsYm90dG9tOmUucG9zKihlLmVuZC5ib3R0b20tZS5zdGFydC5ib3R0b20pK2Uuc3RhcnQuYm90dG9tLGxlZnQ6ZS5wb3MqKGUuZW5kLmxlZnQtZS5zdGFydC5sZWZ0KStlLnN0YXJ0LmxlZnR9KX19KCksZnVuY3Rpb24oKXt2YXIgZT17fTt0LmVhY2goWyJRdWFkIiwiQ3ViaWMiLCJRdWFydCIsIlF1aW50IiwiRXhwbyJdLGZ1bmN0aW9uKHQsaSl7ZVtpXT1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coZSx0KzIpfX0pLHQuZXh0ZW5kKGUse1NpbmU6ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpNYXRoLlBJLzIpfSxDaXJjOmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LEVsYXN0aWM6ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10fHwxPT09dD90Oi1NYXRoLnBvdygyLDgqKHQtMSkpKk1hdGguc2luKCg4MCoodC0xKS03LjUpKk1hdGguUEkvMTUpfSxCYWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKDMqdC0yKX0sQm91bmNlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPTQ7KChlPU1hdGgucG93KDIsLS1pKSktMSkvMTE+dDspO3JldHVybiAxL01hdGgucG93KDQsMy1pKS03LjU2MjUqTWF0aC5wb3coKDMqZS0yKS8yMi10LDIpfX0pLHQuZWFjaChlLGZ1bmN0aW9uKGUsaSl7dC5lYXNpbmdbImVhc2VJbiIrZV09aSx0LmVhc2luZ1siZWFzZU91dCIrZV09ZnVuY3Rpb24odCl7cmV0dXJuIDEtaSgxLXQpfSx0LmVhc2luZ1siZWFzZUluT3V0IitlXT1mdW5jdGlvbih0KXtyZXR1cm4uNT50P2koMip0KS8yOjEtaSgtMip0KzIpLzJ9fSl9KCk7dmFyIF89dC5lZmZlY3RzO3QuZWZmZWN0cy5kZWZpbmUoImJsaW5kIiwiaGlkZSIsZnVuY3Rpb24oZSxpKXt2YXIgcz17dXA6WyJib3R0b20iLCJ0b3AiXSx2ZXJ0aWNhbDpbImJvdHRvbSIsInRvcCJdLGRvd246WyJ0b3AiLCJib3R0b20iXSxsZWZ0OlsicmlnaHQiLCJsZWZ0Il0saG9yaXpvbnRhbDpbInJpZ2h0IiwibGVmdCJdLHJpZ2h0OlsibGVmdCIsInJpZ2h0Il19LG49dCh0aGlzKSxvPWUuZGlyZWN0aW9ufHwidXAiLGE9bi5jc3NDbGlwKCkscj17Y2xpcDp0LmV4dGVuZCh7fSxhKX0saD10LmVmZmVjdHMuY3JlYXRlUGxhY2Vob2xkZXIobik7ci5jbGlwW3Nbb11bMF1dPXIuY2xpcFtzW29dWzFdXSwic2hvdyI9PT1lLm1vZGUmJihuLmNzc0NsaXAoci5jbGlwKSxoJiZoLmNzcyh0LmVmZmVjdHMuY2xpcFRvQm94KHIpKSxyLmNsaXA9YSksaCYmaC5hbmltYXRlKHQuZWZmZWN0cy5jbGlwVG9Cb3gociksZS5kdXJhdGlvbixlLmVhc2luZyksbi5hbmltYXRlKHIse3F1ZXVlOiExLGR1cmF0aW9uOmUuZHVyYXRpb24sZWFzaW5nOmUuZWFzaW5nLGNvbXBsZXRlOml9KX0pLHQuZWZmZWN0cy5kZWZpbmUoImJvdW5jZSIsZnVuY3Rpb24oZSxpKXt2YXIgcyxuLG8sYT10KHRoaXMpLHI9ZS5tb2RlLGg9ImhpZGUiPT09cixsPSJzaG93Ij09PXIsYz1lLmRpcmVjdGlvbnx8InVwIix1PWUuZGlzdGFuY2UsZD1lLnRpbWVzfHw1LHA9MipkKyhsfHxoPzE6MCksZj1lLmR1cmF0aW9uL3AsbT1lLmVhc2luZyxnPSJ1cCI9PT1jfHwiZG93biI9PT1jPyJ0b3AiOiJsZWZ0Iix2PSJ1cCI9PT1jfHwibGVmdCI9PT1jLF89MCxiPWEucXVldWUoKS5sZW5ndGg7Zm9yKHQuZWZmZWN0cy5jcmVhdGVQbGFjZWhvbGRlcihhKSxvPWEuY3NzKGcpLHV8fCh1PWFbInRvcCI9PT1nPyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSgpLzMpLGwmJihuPXtvcGFjaXR5OjF9LG5bZ109byxhLmNzcygib3BhY2l0eSIsMCkuY3NzKGcsdj8yKi11OjIqdSkuYW5pbWF0ZShuLGYsbSkpLGgmJih1Lz1NYXRoLnBvdygyLGQtMSkpLG49e30sbltnXT1vO2Q+XztfKyspcz17fSxzW2ddPSh2PyItPSI6Iis9IikrdSxhLmFuaW1hdGUocyxmLG0pLmFuaW1hdGUobixmLG0pLHU9aD8yKnU6dS8yO2gmJihzPXtvcGFjaXR5OjB9LHNbZ109KHY/Ii09IjoiKz0iKSt1LGEuYW5pbWF0ZShzLGYsbSkpLGEucXVldWUoaSksdC5lZmZlY3RzLnVuc2hpZnQoYSxiLHArMSl9KSx0LmVmZmVjdHMuZGVmaW5lKCJjbGlwIiwiaGlkZSIsZnVuY3Rpb24oZSxpKXt2YXIgcyxuPXt9LG89dCh0aGlzKSxhPWUuZGlyZWN0aW9ufHwidmVydGljYWwiLHI9ImJvdGgiPT09YSxoPXJ8fCJob3Jpem9udGFsIj09PWEsbD1yfHwidmVydGljYWwiPT09YTtzPW8uY3NzQ2xpcCgpLG4uY2xpcD17dG9wOmw/KHMuYm90dG9tLXMudG9wKS8yOnMudG9wLHJpZ2h0Omg/KHMucmlnaHQtcy5sZWZ0KS8yOnMucmlnaHQsYm90dG9tOmw/KHMuYm90dG9tLXMudG9wKS8yOnMuYm90dG9tLGxlZnQ6aD8ocy5yaWdodC1zLmxlZnQpLzI6cy5sZWZ0fSx0LmVmZmVjdHMuY3JlYXRlUGxhY2Vob2xkZXIobyksInNob3ciPT09ZS5tb2RlJiYoby5jc3NDbGlwKG4uY2xpcCksbi5jbGlwPXMpLG8uYW5pbWF0ZShuLHtxdWV1ZTohMSxkdXJhdGlvbjplLmR1cmF0aW9uLGVhc2luZzplLmVhc2luZyxjb21wbGV0ZTppfSl9KSx0LmVmZmVjdHMuZGVmaW5lKCJkcm9wIiwiaGlkZSIsZnVuY3Rpb24oZSxpKXt2YXIgcyxuPXQodGhpcyksbz1lLm1vZGUsYT0ic2hvdyI9PT1vLHI9ZS5kaXJlY3Rpb258fCJsZWZ0IixoPSJ1cCI9PT1yfHwiZG93biI9PT1yPyJ0b3AiOiJsZWZ0IixsPSJ1cCI9PT1yfHwibGVmdCI9PT1yPyItPSI6Iis9IixjPSIrPSI9PT1sPyItPSI6Iis9Iix1PXtvcGFjaXR5OjB9O3QuZWZmZWN0cy5jcmVhdGVQbGFjZWhvbGRlcihuKSxzPWUuZGlzdGFuY2V8fG5bInRvcCI9PT1oPyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSghMCkvMix1W2hdPWwrcyxhJiYobi5jc3ModSksdVtoXT1jK3MsdS5vcGFjaXR5PTEpLG4uYW5pbWF0ZSh1LHtxdWV1ZTohMSxkdXJhdGlvbjplLmR1cmF0aW9uLGVhc2luZzplLmVhc2luZyxjb21wbGV0ZTppfSl9KSx0LmVmZmVjdHMuZGVmaW5lKCJleHBsb2RlIiwiaGlkZSIsZnVuY3Rpb24oZSxpKXtmdW5jdGlvbiBzKCl7Yi5wdXNoKHRoaXMpLGIubGVuZ3RoPT09dSpkJiZuKCl9ZnVuY3Rpb24gbigpe3AuY3NzKHt2aXNpYmlsaXR5OiJ2aXNpYmxlIn0pLHQoYikucmVtb3ZlKCksaSgpfXZhciBvLGEscixoLGwsYyx1PWUucGllY2VzP01hdGgucm91bmQoTWF0aC5zcXJ0KGUucGllY2VzKSk6MyxkPXUscD10KHRoaXMpLGY9ZS5tb2RlLG09InNob3ciPT09ZixnPXAuc2hvdygpLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLm9mZnNldCgpLHY9TWF0aC5jZWlsKHAub3V0ZXJXaWR0aCgpL2QpLF89TWF0aC5jZWlsKHAub3V0ZXJIZWlnaHQoKS91KSxiPVtdO2ZvcihvPTA7dT5vO28rKylmb3IoaD1nLnRvcCtvKl8sYz1vLSh1LTEpLzIsYT0wO2Q+YTthKyspcj1nLmxlZnQrYSp2LGw9YS0oZC0xKS8yLHAuY2xvbmUoKS5hcHBlbmRUbygiYm9keSIpLndyYXAoIjxkaXY+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6InZpc2libGUiLGxlZnQ6LWEqdix0b3A6LW8qX30pLnBhcmVudCgpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLWV4cGxvZGUiKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6dixoZWlnaHQ6XyxsZWZ0OnIrKG0/bCp2OjApLHRvcDpoKyhtP2MqXzowKSxvcGFjaXR5Om0/MDoxfSkuYW5pbWF0ZSh7bGVmdDpyKyhtPzA6bCp2KSx0b3A6aCsobT8wOmMqXyksb3BhY2l0eTptPzE6MH0sZS5kdXJhdGlvbnx8NTAwLGUuZWFzaW5nLHMpfSksdC5lZmZlY3RzLmRlZmluZSgiZmFkZSIsInRvZ2dsZSIsZnVuY3Rpb24oZSxpKXt2YXIgcz0ic2hvdyI9PT1lLm1vZGU7dCh0aGlzKS5jc3MoIm9wYWNpdHkiLHM/MDoxKS5hbmltYXRlKHtvcGFjaXR5OnM/MTowfSx7cXVldWU6ITEsZHVyYXRpb246ZS5kdXJhdGlvbixlYXNpbmc6ZS5lYXNpbmcsY29tcGxldGU6aX0pfSksdC5lZmZlY3RzLmRlZmluZSgiZm9sZCIsImhpZGUiLGZ1bmN0aW9uKGUsaSl7dmFyIHM9dCh0aGlzKSxuPWUubW9kZSxvPSJzaG93Ij09PW4sYT0iaGlkZSI9PT1uLHI9ZS5zaXplfHwxNSxoPS8oWzAtOV0rKSUvLmV4ZWMociksbD0hIWUuaG9yaXpGaXJzdCxjPWw/WyJyaWdodCIsImJvdHRvbSJdOlsiYm90dG9tIiwicmlnaHQiXSx1PWUuZHVyYXRpb24vMixkPXQuZWZmZWN0cy5jcmVhdGVQbGFjZWhvbGRlcihzKSxwPXMuY3NzQ2xpcCgpLGY9e2NsaXA6dC5leHRlbmQoe30scCl9LG09e2NsaXA6dC5leHRlbmQoe30scCl9LGc9W3BbY1swXV0scFtjWzFdXV0sdj1zLnF1ZXVlKCkubGVuZ3RoO2gmJihyPXBhcnNlSW50KGhbMV0sMTApLzEwMCpnW2E/MDoxXSksZi5jbGlwW2NbMF1dPXIsbS5jbGlwW2NbMF1dPXIsbS5jbGlwW2NbMV1dPTAsbyYmKHMuY3NzQ2xpcChtLmNsaXApLGQmJmQuY3NzKHQuZWZmZWN0cy5jbGlwVG9Cb3gobSkpLG0uY2xpcD1wKSxzLnF1ZXVlKGZ1bmN0aW9uKGkpe2QmJmQuYW5pbWF0ZSh0LmVmZmVjdHMuY2xpcFRvQm94KGYpLHUsZS5lYXNpbmcpLmFuaW1hdGUodC5lZmZlY3RzLmNsaXBUb0JveChtKSx1LGUuZWFzaW5nKSxpKCl9KS5hbmltYXRlKGYsdSxlLmVhc2luZykuYW5pbWF0ZShtLHUsZS5lYXNpbmcpLnF1ZXVlKGkpLHQuZWZmZWN0cy51bnNoaWZ0KHMsdiw0KX0pLHQuZWZmZWN0cy5kZWZpbmUoImhpZ2hsaWdodCIsInNob3ciLGZ1bmN0aW9uKGUsaSl7dmFyIHM9dCh0aGlzKSxuPXtiYWNrZ3JvdW5kQ29sb3I6cy5jc3MoImJhY2tncm91bmRDb2xvciIpfTsiaGlkZSI9PT1lLm1vZGUmJihuLm9wYWNpdHk9MCksdC5lZmZlY3RzLnNhdmVTdHlsZShzKSxzLmNzcyh7YmFja2dyb3VuZEltYWdlOiJub25lIixiYWNrZ3JvdW5kQ29sb3I6ZS5jb2xvcnx8IiNmZmZmOTkifSkuYW5pbWF0ZShuLHtxdWV1ZTohMSxkdXJhdGlvbjplLmR1cmF0aW9uLGVhc2luZzplLmVhc2luZyxjb21wbGV0ZTppfSl9KSx0LmVmZmVjdHMuZGVmaW5lKCJzaXplIixmdW5jdGlvbihlLGkpe3ZhciBzLG4sbyxhPXQodGhpcykscj1bImZvbnRTaXplIl0saD1bImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLGw9WyJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxjPWUubW9kZSx1PSJlZmZlY3QiIT09YyxkPWUuc2NhbGV8fCJib3RoIixwPWUub3JpZ2lufHxbIm1pZGRsZSIsImNlbnRlciJdLGY9YS5jc3MoInBvc2l0aW9uIiksbT1hLnBvc2l0aW9uKCksZz10LmVmZmVjdHMuc2NhbGVkRGltZW5zaW9ucyhhKSx2PWUuZnJvbXx8ZyxfPWUudG98fHQuZWZmZWN0cy5zY2FsZWREaW1lbnNpb25zKGEsMCk7dC5lZmZlY3RzLmNyZWF0ZVBsYWNlaG9sZGVyKGEpLCJzaG93Ij09PWMmJihvPXYsdj1fLF89byksbj17ZnJvbTp7eTp2LmhlaWdodC9nLmhlaWdodCx4OnYud2lkdGgvZy53aWR0aH0sdG86e3k6Xy5oZWlnaHQvZy5oZWlnaHQseDpfLndpZHRoL2cud2lkdGh9fSwoImJveCI9PT1kfHwiYm90aCI9PT1kKSYmKG4uZnJvbS55IT09bi50by55JiYodj10LmVmZmVjdHMuc2V0VHJhbnNpdGlvbihhLGgsbi5mcm9tLnksdiksXz10LmVmZmVjdHMuc2V0VHJhbnNpdGlvbihhLGgsbi50by55LF8pKSxuLmZyb20ueCE9PW4udG8ueCYmKHY9dC5lZmZlY3RzLnNldFRyYW5zaXRpb24oYSxsLG4uZnJvbS54LHYpLF89dC5lZmZlY3RzLnNldFRyYW5zaXRpb24oYSxsLG4udG8ueCxfKSkpLCgiY29udGVudCI9PT1kfHwiYm90aCI9PT1kKSYmbi5mcm9tLnkhPT1uLnRvLnkmJih2PXQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGEscixuLmZyb20ueSx2KSxfPXQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGEscixuLnRvLnksXykpLHAmJihzPXQuZWZmZWN0cy5nZXRCYXNlbGluZShwLGcpLHYudG9wPShnLm91dGVySGVpZ2h0LXYub3V0ZXJIZWlnaHQpKnMueSttLnRvcCx2LmxlZnQ9KGcub3V0ZXJXaWR0aC12Lm91dGVyV2lkdGgpKnMueCttLmxlZnQsXy50b3A9KGcub3V0ZXJIZWlnaHQtXy5vdXRlckhlaWdodCkqcy55K20udG9wLF8ubGVmdD0oZy5vdXRlcldpZHRoLV8ub3V0ZXJXaWR0aCkqcy54K20ubGVmdCksYS5jc3ModiksKCJjb250ZW50Ij09PWR8fCJib3RoIj09PWQpJiYoaD1oLmNvbmNhdChbIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSJdKS5jb25jYXQociksbD1sLmNvbmNhdChbIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCJdKSxhLmZpbmQoIipbd2lkdGhdIikuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQodGhpcykscz10LmVmZmVjdHMuc2NhbGVkRGltZW5zaW9ucyhpKSxvPXtoZWlnaHQ6cy5oZWlnaHQqbi5mcm9tLnksd2lkdGg6cy53aWR0aCpuLmZyb20ueCxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0Km4uZnJvbS55LG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKm4uZnJvbS54fSxhPXtoZWlnaHQ6cy5oZWlnaHQqbi50by55LHdpZHRoOnMud2lkdGgqbi50by54LG91dGVySGVpZ2h0OnMuaGVpZ2h0Km4udG8ueSxvdXRlcldpZHRoOnMud2lkdGgqbi50by54fTtuLmZyb20ueSE9PW4udG8ueSYmKG89dC5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxoLG4uZnJvbS55LG8pLGE9dC5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxoLG4udG8ueSxhKSksbi5mcm9tLnghPT1uLnRvLngmJihvPXQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksbCxuLmZyb20ueCxvKSxhPXQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksbCxuLnRvLngsYSkpLHUmJnQuZWZmZWN0cy5zYXZlU3R5bGUoaSksaS5jc3MobyksaS5hbmltYXRlKGEsZS5kdXJhdGlvbixlLmVhc2luZyxmdW5jdGlvbigpe3UmJnQuZWZmZWN0cy5yZXN0b3JlU3R5bGUoaSl9KX0pKSxhLmFuaW1hdGUoXyx7cXVldWU6ITEsZHVyYXRpb246ZS5kdXJhdGlvbixlYXNpbmc6ZS5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXt2YXIgZT1hLm9mZnNldCgpOzA9PT1fLm9wYWNpdHkmJmEuY3NzKCJvcGFjaXR5Iix2Lm9wYWNpdHkpLHV8fChhLmNzcygicG9zaXRpb24iLCJzdGF0aWMiPT09Zj8icmVsYXRpdmUiOmYpLm9mZnNldChlKSx0LmVmZmVjdHMuc2F2ZVN0eWxlKGEpKSxpKCl9fSl9KSx0LmVmZmVjdHMuZGVmaW5lKCJzY2FsZSIsZnVuY3Rpb24oZSxpKXt2YXIgcz10KHRoaXMpLG49ZS5tb2RlLG89cGFyc2VJbnQoZS5wZXJjZW50LDEwKXx8KDA9PT1wYXJzZUludChlLnBlcmNlbnQsMTApPzA6ImVmZmVjdCIhPT1uPzA6MTAwKSxhPXQuZXh0ZW5kKCEwLHtmcm9tOnQuZWZmZWN0cy5zY2FsZWREaW1lbnNpb25zKHMpLHRvOnQuZWZmZWN0cy5zY2FsZWREaW1lbnNpb25zKHMsbyxlLmRpcmVjdGlvbnx8ImJvdGgiKSxvcmlnaW46ZS5vcmlnaW58fFsibWlkZGxlIiwiY2VudGVyIl19LGUpO2UuZmFkZSYmKGEuZnJvbS5vcGFjaXR5PTEsYS50by5vcGFjaXR5PTApLHQuZWZmZWN0cy5lZmZlY3Quc2l6ZS5jYWxsKHRoaXMsYSxpKX0pLHQuZWZmZWN0cy5kZWZpbmUoInB1ZmYiLCJoaWRlIixmdW5jdGlvbihlLGkpe3ZhciBzPXQuZXh0ZW5kKCEwLHt9LGUse2ZhZGU6ITAscGVyY2VudDpwYXJzZUludChlLnBlcmNlbnQsMTApfHwxNTB9KTt0LmVmZmVjdHMuZWZmZWN0LnNjYWxlLmNhbGwodGhpcyxzLGkpfSksdC5lZmZlY3RzLmRlZmluZSgicHVsc2F0ZSIsInNob3ciLGZ1bmN0aW9uKGUsaSl7dmFyIHM9dCh0aGlzKSxuPWUubW9kZSxvPSJzaG93Ij09PW4sYT0iaGlkZSI9PT1uLHI9b3x8YSxoPTIqKGUudGltZXN8fDUpKyhyPzE6MCksbD1lLmR1cmF0aW9uL2gsYz0wLHU9MSxkPXMucXVldWUoKS5sZW5ndGg7Zm9yKChvfHwhcy5pcygiOnZpc2libGUiKSkmJihzLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLGM9MSk7aD51O3UrKylzLmFuaW1hdGUoe29wYWNpdHk6Y30sbCxlLmVhc2luZyksYz0xLWM7cy5hbmltYXRlKHtvcGFjaXR5OmN9LGwsZS5lYXNpbmcpLHMucXVldWUoaSksdC5lZmZlY3RzLnVuc2hpZnQocyxkLGgrMSl9KSx0LmVmZmVjdHMuZGVmaW5lKCJzaGFrZSIsZnVuY3Rpb24oZSxpKXt2YXIgcz0xLG49dCh0aGlzKSxvPWUuZGlyZWN0aW9ufHwibGVmdCIsYT1lLmRpc3RhbmNlfHwyMCxyPWUudGltZXN8fDMsaD0yKnIrMSxsPU1hdGgucm91bmQoZS5kdXJhdGlvbi9oKSxjPSJ1cCI9PT1vfHwiZG93biI9PT1vPyJ0b3AiOiJsZWZ0Iix1PSJ1cCI9PT1vfHwibGVmdCI9PT1vLGQ9e30scD17fSxmPXt9LG09bi5xdWV1ZSgpLmxlbmd0aDtmb3IodC5lZmZlY3RzLmNyZWF0ZVBsYWNlaG9sZGVyKG4pLGRbY109KHU/Ii09IjoiKz0iKSthLHBbY109KHU/Iis9IjoiLT0iKSsyKmEsZltjXT0odT8iLT0iOiIrPSIpKzIqYSxuLmFuaW1hdGUoZCxsLGUuZWFzaW5nKTtyPnM7cysrKW4uYW5pbWF0ZShwLGwsZS5lYXNpbmcpLmFuaW1hdGUoZixsLGUuZWFzaW5nKTtuLmFuaW1hdGUocCxsLGUuZWFzaW5nKS5hbmltYXRlKGQsbC8yLGUuZWFzaW5nKS5xdWV1ZShpKSx0LmVmZmVjdHMudW5zaGlmdChuLG0saCsxKX0pLHQuZWZmZWN0cy5kZWZpbmUoInNsaWRlIiwic2hvdyIsZnVuY3Rpb24oZSxpKXt2YXIgcyxuLG89dCh0aGlzKSxhPXt1cDpbImJvdHRvbSIsInRvcCJdLGRvd246WyJ0b3AiLCJib3R0b20iXSxsZWZ0OlsicmlnaHQiLCJsZWZ0Il0scmlnaHQ6WyJsZWZ0IiwicmlnaHQiXX0scj1lLm1vZGUsaD1lLmRpcmVjdGlvbnx8ImxlZnQiLGw9InVwIj09PWh8fCJkb3duIj09PWg/InRvcCI6ImxlZnQiLGM9InVwIj09PWh8fCJsZWZ0Ij09PWgsdT1lLmRpc3RhbmNlfHxvWyJ0b3AiPT09bD8ib3V0ZXJIZWlnaHQiOiJvdXRlcldpZHRoIl0oITApLGQ9e307dC5lZmZlY3RzLmNyZWF0ZVBsYWNlaG9sZGVyKG8pLHM9by5jc3NDbGlwKCksbj1vLnBvc2l0aW9uKClbbF0sZFtsXT0oYz8tMToxKSp1K24sZC5jbGlwPW8uY3NzQ2xpcCgpLGQuY2xpcFthW2hdWzFdXT1kLmNsaXBbYVtoXVswXV0sInNob3ciPT09ciYmKG8uY3NzQ2xpcChkLmNsaXApLG8uY3NzKGwsZFtsXSksZC5jbGlwPXMsZFtsXT1uKSxvLmFuaW1hdGUoZCx7cXVldWU6ITEsZHVyYXRpb246ZS5kdXJhdGlvbixlYXNpbmc6ZS5lYXNpbmcsY29tcGxldGU6aX0pfSk7dmFyIF87dC51aUJhY2tDb21wYXQhPT0hMSYmKF89dC5lZmZlY3RzLmRlZmluZSgidHJhbnNmZXIiLGZ1bmN0aW9uKGUsaSl7dCh0aGlzKS50cmFuc2ZlcihlLGkpfSkpfSk7"}},"time_used":723,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":422,"receive":301,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/echarts-liquidfill.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.311Z","timestamp":1785147795311,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/echarts-liquidfill.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:38 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 39524\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":117983,"size_decoded":40069,"mime_type":"text/javascript","magic":"JavaScript source, Unicode text, UTF-8 text, with very long lines (32017)","md5":"5d2ad7339533b387c00b112ef7d1d752","sha1":"531887bb37d21955c170820bbc184893fd7fb363","sha256":"0c22012c7dee36e1a23e3211f0d72336169e16f45523364f248a3c2324c87b64","sha512":"abefb99ef64d9813f1be9a2ac9e380a79b2b859cff8d27492799e3ea0007bf199923fffe0aebc1596bf2c47a1bf9bbffed470f4902470e6320fff2c459f214a3","ssdeep":"1536:321fcFRLWZ7CaRbHBJRCtv98rspkagnxL0lPRK:G1GYuaRbTRY+B5","tlshash":"28b3f8d87288b02943a35274446f214be13b7a09750ecd94f72ad5cabcbc58d52bbf39","first_seen":"2025-04-28T11:07:48.492318Z","last_seen":"2026-08-11T00:25:55.256396Z","times_seen":30,"resource_available":true,"data":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoImVjaGFydHMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJlY2hhcnRzIl0sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHNbImVjaGFydHMtbGlxdWlkZmlsbCJdPWUocmVxdWlyZSgiZWNoYXJ0cyIpKTp0WyJlY2hhcnRzLWxpcXVpZGZpbGwiXT1lKHQuZWNoYXJ0cyl9KHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7aWYocltuXSlyZXR1cm4gcltuXS5leHBvcnRzO3ZhciBpPXJbbl09e2V4cG9ydHM6e30saWQ6bixsb2FkZWQ6ITF9O3JldHVybiB0W25dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLGUpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgcj17fTtyZXR1cm4gZS5tPXQsZS5jPXIsZS5wPSIiLGUoMCl9KFtmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPXIoMjYpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCl7aWYobnVsbD09dHx8Im9iamVjdCIhPXR5cGVvZiB0KXJldHVybiB0O3ZhciBlPXQsbj1FLmNhbGwodCk7aWYoIltvYmplY3QgQXJyYXldIj09PW4pe2U9W107Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKWVbaV09cih0W2ldKX1lbHNlIGlmKFdbbl0pe3ZhciBvPXQuY29uc3RydWN0b3I7aWYodC5jb25zdHJ1Y3Rvci5mcm9tKWU9by5mcm9tKHQpO2Vsc2V7ZT1uZXcgbyh0Lmxlbmd0aCk7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKWVbaV09cih0W2ldKX19ZWxzZSBpZighcVtuXSYmIUIodCkmJiFNKHQpKXtlPXt9O2Zvcih2YXIgcyBpbiB0KXQuaGFzT3duUHJvcGVydHkocykmJihlW3NdPXIodFtzXSkpfXJldHVybiBlfWZ1bmN0aW9uIG4odCxlLGkpe2lmKCFTKGUpfHwhUyh0KSlyZXR1cm4gaT9yKGUpOnQ7Zm9yKHZhciBhIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIG89dFthXSxzPWVbYV07IVMocyl8fCFTKG8pfHxfKHMpfHxfKG8pfHxNKHMpfHxNKG8pfHxUKHMpfHxUKG8pfHxCKHMpfHxCKG8pPyFpJiZhIGluIHR8fCh0W2FdPXIoZVthXSwhMCkpOm4obyxzLGkpfXJldHVybiB0fWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9dFswXSxpPTEsYT10Lmxlbmd0aDtpPGE7aSsrKXI9bihyLHRbaV0sZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIG8odCxlLHIpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJihyP251bGwhPWVbbl06bnVsbD09dFtuXSkmJih0W25dPWVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIHMoKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIil9ZnVuY3Rpb24gbCgpe3JldHVybiB6fHwoej0kLmNyZWF0ZUNhbnZhcygpLmdldENvbnRleHQoIjJkIikpLHp9ZnVuY3Rpb24gaCh0LGUpe2lmKHQpe2lmKHQuaW5kZXhPZilyZXR1cm4gdC5pbmRleE9mKGUpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcn1yZXR1cm4tMX1mdW5jdGlvbiB1KHQsZSl7ZnVuY3Rpb24gcigpe312YXIgbj10LnByb3RvdHlwZTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcjtmb3IodmFyIGkgaW4gbil0LnByb3RvdHlwZVtpXT1uW2ldO3QucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5zdXBlckNsYXNzPWV9ZnVuY3Rpb24gYyh0LGUscil7dD0icHJvdG90eXBlImluIHQ/dC5wcm90b3R5cGU6dCxlPSJwcm90b3R5cGUiaW4gZT9lLnByb3RvdHlwZTplLG8odCxlLHIpfWZ1bmN0aW9uIGYodCl7aWYodClyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGh9ZnVuY3Rpb24gZCh0LGUscil7aWYodCYmZSlpZih0LmZvckVhY2gmJnQuZm9yRWFjaD09PUgpdC5mb3JFYWNoKGUscik7ZWxzZSBpZih0Lmxlbmd0aD09PSt0Lmxlbmd0aClmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTtuKyspZS5jYWxsKHIsdFtuXSxuLHQpO2Vsc2UgZm9yKHZhciBhIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShhKSYmZS5jYWxsKHIsdFthXSxhLHQpfWZ1bmN0aW9uIHAodCxlLHIpe2lmKHQmJmUpe2lmKHQubWFwJiZ0Lm1hcD09PVgpcmV0dXJuIHQubWFwKGUscik7Zm9yKHZhciBuPVtdLGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspbi5wdXNoKGUuY2FsbChyLHRbaV0saSx0KSk7cmV0dXJuIG59fWZ1bmN0aW9uIGcodCxlLHIsbil7aWYodCYmZSl7aWYodC5yZWR1Y2UmJnQucmVkdWNlPT09RylyZXR1cm4gdC5yZWR1Y2UoZSxyLG4pO2Zvcih2YXIgaT0wLGE9dC5sZW5ndGg7aTxhO2krKylyPWUuY2FsbChuLHIsdFtpXSxpLHQpO3JldHVybiByfX1mdW5jdGlvbiB2KHQsZSxyKXtpZih0JiZlKXtpZih0LmZpbHRlciYmdC5maWx0ZXI9PT1qKXJldHVybiB0LmZpbHRlcihlLHIpO2Zvcih2YXIgbj1bXSxpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKWUuY2FsbChyLHRbaV0saSx0KSYmbi5wdXNoKHRbaV0pO3JldHVybiBufX1mdW5jdGlvbiBtKHQsZSxyKXtpZih0JiZlKWZvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpO24rKylpZihlLmNhbGwocix0W25dLG4sdCkpcmV0dXJuIHRbbl19ZnVuY3Rpb24geCh0LGUpe3ZhciByPVYuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxyLmNvbmNhdChWLmNhbGwoYXJndW1lbnRzKSkpfX1mdW5jdGlvbiB5KHQpe3ZhciBlPVYuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxlLmNvbmNhdChWLmNhbGwoYXJndW1lbnRzKSkpfX1mdW5jdGlvbiBfKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1FLmNhbGwodCl9ZnVuY3Rpb24gdyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBiKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09RS5jYWxsKHQpfWZ1bmN0aW9uIFModCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuImZ1bmN0aW9uIj09PWV8fCEhdCYmIm9iamVjdCI9PWV9ZnVuY3Rpb24gVCh0KXtyZXR1cm4hIXFbRS5jYWxsKHQpXX1mdW5jdGlvbiBNKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0Lm5vZGVUeXBlJiYib2JqZWN0Ij09dHlwZW9mIHQub3duZXJEb2N1bWVudH1mdW5jdGlvbiBQKHQpe3JldHVybiB0IT09dH1mdW5jdGlvbiBrKHQpe2Zvcih2YXIgZT0wLHI9YXJndW1lbnRzLmxlbmd0aDtlPHI7ZSsrKWlmKG51bGwhPWFyZ3VtZW50c1tlXSlyZXR1cm4gYXJndW1lbnRzW2VdfWZ1bmN0aW9uIEModCxlKXtyZXR1cm4gbnVsbCE9dD90OmV9ZnVuY3Rpb24gSSh0LGUscil7cmV0dXJuIG51bGwhPXQ/dDpudWxsIT1lP2U6cn1mdW5jdGlvbiBBKCl7cmV0dXJuIEZ1bmN0aW9uLmNhbGwuYXBwbHkoVixhcmd1bWVudHMpfWZ1bmN0aW9uIE8odCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVyblt0LHQsdCx0XTt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gMj09PWU/W3RbMF0sdFsxXSx0WzBdLHRbMV1dOjM9PT1lP1t0WzBdLHRbMV0sdFsyXSx0WzFdXTp0fWZ1bmN0aW9uIEQodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gTCh0KXt0W1ldPSEwfWZ1bmN0aW9uIEIodCl7cmV0dXJuIHRbWV19ZnVuY3Rpb24gRih0KXt0JiZkKHQsZnVuY3Rpb24odCxlKXt0aGlzLnNldChlLHQpfSx0aGlzKX1mdW5jdGlvbiBSKHQpe3JldHVybiBuZXcgRih0KX12YXIgeixxPXsiW29iamVjdCBGdW5jdGlvbl0iOjEsIltvYmplY3QgUmVnRXhwXSI6MSwiW29iamVjdCBEYXRlXSI6MSwiW29iamVjdCBFcnJvcl0iOjEsIltvYmplY3QgQ2FudmFzR3JhZGllbnRdIjoxLCJbb2JqZWN0IENhbnZhc1BhdHRlcm5dIjoxLCJbb2JqZWN0IEltYWdlXSI6MSwiW29iamVjdCBDYW52YXNdIjoxfSxXPXsiW29iamVjdCBJbnQ4QXJyYXldIjoxLCJbb2JqZWN0IFVpbnQ4QXJyYXldIjoxLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSI6MSwiW29iamVjdCBJbnQxNkFycmF5XSI6MSwiW29iamVjdCBVaW50MTZBcnJheV0iOjEsIltvYmplY3QgSW50MzJBcnJheV0iOjEsIltvYmplY3QgVWludDMyQXJyYXldIjoxLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iOjEsIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6MX0sRT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLE49QXJyYXkucHJvdG90eXBlLEg9Ti5mb3JFYWNoLGo9Ti5maWx0ZXIsVj1OLnNsaWNlLFg9Ti5tYXAsRz1OLnJlZHVjZSxZPSJfX2VjX3ByaW1pdGl2ZV9fIixVPSJfZWNfIixaPTQ7Ri5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkYsZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW1UrdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzW1UrdF09ZSxlfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZSYmKHQ9eCh0LGUpKTtmb3IodmFyIHIgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KHIpJiZ0KHRoaXNbcl0sci5zbGljZShaKSl9LHJlbW92ZUtleTpmdW5jdGlvbih0KXtkZWxldGUgdGhpc1t0XX19O3ZhciAkPXtpbmhlcml0czp1LG1peGluOmMsY2xvbmU6cixtZXJnZTpuLG1lcmdlQWxsOmksZXh0ZW5kOmEsZGVmYXVsdHM6byxnZXRDb250ZXh0OmwsY3JlYXRlQ2FudmFzOnMsaW5kZXhPZjpoLHNsaWNlOkEsZmluZDptLGlzQXJyYXlMaWtlOmYsZWFjaDpkLG1hcDpwLHJlZHVjZTpnLGZpbHRlcjp2LGJpbmQ6eCxjdXJyeTp5LGlzQXJyYXk6Xyxpc1N0cmluZzpiLGlzT2JqZWN0OlMsaXNGdW5jdGlvbjp3LGlzQnVpbHRJbk9iamVjdDpULGlzRG9tOk0sZXFOYU46UCxyZXRyaWV2ZTprLHJldHJpZXZlMjpDLHJldHJpZXZlMzpJLGFzc2VydDpELHNldEFzUHJpbWl0aXZlOkwsY3JlYXRlSGFzaE1hcDpSLG5vcm1hbGl6ZUNzc0FycmF5Ok8sbm9vcDpmdW5jdGlvbigpe319O3QuZXhwb3J0cz0kfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtpLmNhbGwodGhpcyx0KSx0aGlzLnBhdGg9bnVsbH12YXIgaT1yKDExKSxhPXIoMSksbz1yKDcpLHM9cig0NyksbD1yKDU3KSxoPWwucHJvdG90eXBlLmdldENhbnZhc1BhdHRlcm4sdT1NYXRoLmFicyxjPW5ldyBvKCEwKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bix0eXBlOiJwYXRoIixfX2RpcnR5UGF0aDohMCxzdHJva2VDb250YWluVGhyZXNob2xkOjUsYnJ1c2g6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnN0eWxlLG49dGhpcy5wYXRofHxjLGk9ci5oYXNTdHJva2UoKSxhPXIuaGFzRmlsbCgpLG89ci5maWxsLHM9ci5zdHJva2UsbD1hJiYhIW8uY29sb3JTdG9wcyx1PWkmJiEhcy5jb2xvclN0b3BzLGY9YSYmISFvLmltYWdlLGQ9aSYmISFzLmltYWdlO2lmKHIuYmluZCh0LHRoaXMsZSksdGhpcy5zZXRUcmFuc2Zvcm0odCksdGhpcy5fX2RpcnR5KXt2YXIgcDtsJiYocD1wfHx0aGlzLmdldEJvdW5kaW5nUmVjdCgpLHRoaXMuX2ZpbGxHcmFkaWVudD1yLmdldEdyYWRpZW50KHQsbyxwKSksdSYmKHA9cHx8dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSx0aGlzLl9zdHJva2VHcmFkaWVudD1yLmdldEdyYWRpZW50KHQscyxwKSl9bD90LmZpbGxTdHlsZT10aGlzLl9maWxsR3JhZGllbnQ6ZiYmKHQuZmlsbFN0eWxlPWguY2FsbChvLHQpKSx1P3Quc3Ryb2tlU3R5bGU9dGhpcy5fc3Ryb2tlR3JhZGllbnQ6ZCYmKHQuc3Ryb2tlU3R5bGU9aC5jYWxsKHMsdCkpO3ZhciBnPXIubGluZURhc2gsdj1yLmxpbmVEYXNoT2Zmc2V0LG09ISF0LnNldExpbmVEYXNoLHg9dGhpcy5nZXRHbG9iYWxTY2FsZSgpO24uc2V0U2NhbGUoeFswXSx4WzFdKSx0aGlzLl9fZGlydHlQYXRofHxnJiYhbSYmaT8obi5iZWdpblBhdGgodCksZyYmIW0mJihuLnNldExpbmVEYXNoKGcpLG4uc2V0TGluZURhc2hPZmZzZXQodikpLHRoaXMuYnVpbGRQYXRoKG4sdGhpcy5zaGFwZSwhMSksdGhpcy5wYXRoJiYodGhpcy5fX2RpcnR5UGF0aD0hMSkpOih0LmJlZ2luUGF0aCgpLHRoaXMucGF0aC5yZWJ1aWxkUGF0aCh0KSksYSYmbi5maWxsKHQpLGcmJm0mJih0LnNldExpbmVEYXNoKGcpLHQubGluZURhc2hPZmZzZXQ9diksaSYmbi5zdHJva2UodCksZyYmbSYmdC5zZXRMaW5lRGFzaChbXSksdGhpcy5yZXN0b3JlVHJhbnNmb3JtKHQpLG51bGwhPXIudGV4dCYmdGhpcy5kcmF3UmVjdFRleHQodCx0aGlzLmdldEJvdW5kaW5nUmVjdCgpKX0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSxyKXt9LGNyZWF0ZVBhdGhQcm94eTpmdW5jdGlvbigpe3RoaXMucGF0aD1uZXcgb30sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVjdCxlPXRoaXMuc3R5bGUscj0hdDtpZihyKXt2YXIgbj10aGlzLnBhdGg7bnx8KG49dGhpcy5wYXRoPW5ldyBvKSx0aGlzLl9fZGlydHlQYXRoJiYobi5iZWdpblBhdGgoKSx0aGlzLmJ1aWxkUGF0aChuLHRoaXMuc2hhcGUsITEpKSx0PW4uZ2V0Qm91bmRpbmdSZWN0KCl9aWYodGhpcy5fcmVjdD10LGUuaGFzU3Ryb2tlKCkpe3ZhciBpPXRoaXMuX3JlY3RXaXRoU3Ryb2tlfHwodGhpcy5fcmVjdFdpdGhTdHJva2U9dC5jbG9uZSgpKTtpZih0aGlzLl9fZGlydHl8fHIpe2kuY29weSh0KTt2YXIgYT1lLmxpbmVXaWR0aCxzPWUuc3Ryb2tlTm9TY2FsZT90aGlzLmdldExpbmVTY2FsZSgpOjE7ZS5oYXNGaWxsKCl8fChhPU1hdGgubWF4KGEsdGhpcy5zdHJva2VDb250YWluVGhyZXNob2xkfHw0KSkscz4xZS0xMCYmKGkud2lkdGgrPWEvcyxpLmhlaWdodCs9YS9zLGkueC09YS9zLzIsaS55LT1hL3MvMil9cmV0dXJuIGl9cmV0dXJuIHR9LGNvbnRhaW46ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnRyYW5zZm9ybUNvb3JkVG9Mb2NhbCh0LGUpLG49dGhpcy5nZXRCb3VuZGluZ1JlY3QoKSxpPXRoaXMuc3R5bGU7aWYodD1yWzBdLGU9clsxXSxuLmNvbnRhaW4odCxlKSl7dmFyIGE9dGhpcy5wYXRoLmRhdGE7aWYoaS5oYXNTdHJva2UoKSl7dmFyIG89aS5saW5lV2lkdGgsbD1pLnN0cm9rZU5vU2NhbGU/dGhpcy5nZXRMaW5lU2NhbGUoKToxO2lmKGw+MWUtMTAmJihpLmhhc0ZpbGwoKXx8KG89TWF0aC5tYXgobyx0aGlzLnN0cm9rZUNvbnRhaW5UaHJlc2hvbGQpKSxzLmNvbnRhaW5TdHJva2UoYSxvL2wsdCxlKSkpcmV0dXJuITB9aWYoaS5oYXNGaWxsKCkpcmV0dXJuIHMuY29udGFpbihhLHQsZSl9cmV0dXJuITF9LGRpcnR5OmZ1bmN0aW9uKHQpe251bGw9PXQmJih0PSEwKSx0JiYodGhpcy5fX2RpcnR5UGF0aD10LHRoaXMuX3JlY3Q9bnVsbCksdGhpcy5fX2RpcnR5PSEwLHRoaXMuX196ciYmdGhpcy5fX3pyLnJlZnJlc2goKSx0aGlzLl9fY2xpcFRhcmdldCYmdGhpcy5fX2NsaXBUYXJnZXQuZGlydHkoKX0sYW5pbWF0ZVNoYXBlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuaW1hdGUoInNoYXBlIix0KX0sYXR0cktWOmZ1bmN0aW9uKHQsZSl7InNoYXBlIj09PXQ/KHRoaXMuc2V0U2hhcGUoZSksdGhpcy5fX2RpcnR5UGF0aD0hMCx0aGlzLl9yZWN0PW51bGwpOmkucHJvdG90eXBlLmF0dHJLVi5jYWxsKHRoaXMsdCxlKX0sc2V0U2hhcGU6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnNoYXBlO2lmKHIpe2lmKGEuaXNPYmplY3QodCkpZm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHJbbl09dFtuXSk7ZWxzZSByW3RdPWU7dGhpcy5kaXJ0eSghMCl9cmV0dXJuIHRoaXN9LGdldExpbmVTY2FsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudHJhbnNmb3JtO3JldHVybiB0JiZ1KHRbMF0tMSk+MWUtMTAmJnUodFszXS0xKT4xZS0xMD9NYXRoLnNxcnQodSh0WzBdKnRbM10tdFsyXSp0WzFdKSk6MX19LG4uZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpLHQuc3R5bGUmJnRoaXMuc3R5bGUuZXh0ZW5kRnJvbSh0LnN0eWxlLCExKTt2YXIgcj10LnNoYXBlO2lmKHIpe3RoaXMuc2hhcGU9dGhpcy5zaGFwZXx8e307dmFyIGk9dGhpcy5zaGFwZTtmb3IodmFyIGEgaW4gcikhaS5oYXNPd25Qcm9wZXJ0eShhKSYmci5oYXNPd25Qcm9wZXJ0eShhKSYmKGlbYV09clthXSl9dC5pbml0JiZ0LmluaXQuY2FsbCh0aGlzLGUpfTthLmluaGVyaXRzKGUsbik7Zm9yKHZhciByIGluIHQpInN0eWxlIiE9PXImJiJzaGFwZSIhPT1yJiYoZS5wcm90b3R5cGVbcl09dFtyXSk7cmV0dXJuIGV9LGEuaW5oZXJpdHMobixpKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgcj0idW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0MzJBcnJheT9BcnJheTpGbG9hdDMyQXJyYXksbj17Y3JlYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHIoMik7cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PWUmJihlPTApLG5bMF09dCxuWzFdPWUsbn0sY29weTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHR9LGNsb25lOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyByKDIpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGV9LHNldDpmdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZSx0WzFdPXIsdH0sYWRkOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdH0sc2NhbGVBbmRBZGQ6ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0fSxzdWI6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0tclswXSx0WzFdPWVbMV0tclsxXSx0fSxsZW46ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmxlblNxdWFyZSh0KSl9LGxlblNxdWFyZTpmdW5jdGlvbih0KXtyZXR1cm4gdFswXSp0WzBdK3RbMV0qdFsxXX0sbXVsOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnJbMF0sdFsxXT1lWzFdKnJbMV0sdH0sZGl2OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdL3JbMF0sdFsxXT1lWzFdL3JbMV0sdH0sZG90OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV19LHNjYWxlOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnIsdFsxXT1lWzFdKnIsdH0sbm9ybWFsaXplOmZ1bmN0aW9uKHQsZSl7dmFyIHI9bi5sZW4oZSk7cmV0dXJuIDA9PT1yPyh0WzBdPTAsdFsxXT0wKToodFswXT1lWzBdL3IsdFsxXT1lWzFdL3IpLHR9LGRpc3RhbmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguc3FydCgodFswXS1lWzBdKSoodFswXS1lWzBdKSsodFsxXS1lWzFdKSoodFsxXS1lWzFdKSl9LGRpc3RhbmNlU3F1YXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKHRbMF0tZVswXSkqKHRbMF0tZVswXSkrKHRbMV0tZVsxXSkqKHRbMV0tZVsxXSl9LG5lZ2F0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdH0sbGVycDpmdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFswXT1lWzBdK24qKHJbMF0tZVswXSksdFsxXT1lWzFdK24qKHJbMV0tZVsxXSksdH0sYXBwbHlUcmFuc2Zvcm06ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPXJbMF0qbityWzJdKmkrcls0XSx0WzFdPXJbMV0qbityWzNdKmkrcls1XSx0fSxtaW46ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWluKGVbMF0sclswXSksdFsxXT1NYXRoLm1pbihlWzFdLHJbMV0pLHR9LG1heDpmdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09TWF0aC5tYXgoZVswXSxyWzBdKSx0WzFdPU1hdGgubWF4KGVbMV0sclsxXSksdH19O24ubGVuZ3RoPW4ubGVuLG4ubGVuZ3RoU3F1YXJlPW4ubGVuU3F1YXJlLG4uZGlzdD1uLmRpc3RhbmNlLG4uZGlzdFNxdWFyZT1uLmRpc3RhbmNlU3F1YXJlLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbil7cjwwJiYodCs9cixyPS1yKSxuPDAmJihlKz1uLG49LW4pLHRoaXMueD10LHRoaXMueT1lLHRoaXMud2lkdGg9cix0aGlzLmhlaWdodD1ufXZhciBpPXIoMyksYT1yKDEwKSxvPWkuYXBwbHlUcmFuc2Zvcm0scz1NYXRoLm1pbixsPU1hdGgubWF4O24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHVuaW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXModC54LHRoaXMueCkscj1zKHQueSx0aGlzLnkpO3RoaXMud2lkdGg9bCh0LngrdC53aWR0aCx0aGlzLngrdGhpcy53aWR0aCktZSx0aGlzLmhlaWdodD1sKHQueSt0LmhlaWdodCx0aGlzLnkrdGhpcy5oZWlnaHQpLXIsdGhpcy54PWUsdGhpcy55PXJ9LGFwcGx5VHJhbnNmb3JtOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT1bXSxyPVtdLG49W107cmV0dXJuIGZ1bmN0aW9uKGkpe2lmKGkpe3RbMF09clswXT10aGlzLngsdFsxXT1uWzFdPXRoaXMueSxlWzBdPW5bMF09dGhpcy54K3RoaXMud2lkdGgsZVsxXT1yWzFdPXRoaXMueSt0aGlzLmhlaWdodCxvKHQsdCxpKSxvKGUsZSxpKSxvKHIscixpKSxvKG4sbixpKSx0aGlzLng9cyh0WzBdLGVbMF0sclswXSxuWzBdKSx0aGlzLnk9cyh0WzFdLGVbMV0sclsxXSxuWzFdKTt2YXIgYT1sKHRbMF0sZVswXSxyWzBdLG5bMF0pLGg9bCh0WzFdLGVbMV0sclsxXSxuWzFdKTt0aGlzLndpZHRoPWEtdGhpcy54LHRoaXMuaGVpZ2h0PWgtdGhpcy55fX19KCksY2FsY3VsYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj10LndpZHRoL2Uud2lkdGgsbj10LmhlaWdodC9lLmhlaWdodCxpPWEuY3JlYXRlKCk7cmV0dXJuIGEudHJhbnNsYXRlKGksaSxbLWUueCwtZS55XSksYS5zY2FsZShpLGksW3Isbl0pLGEudHJhbnNsYXRlKGksaSxbdC54LHQueV0pLGl9LGludGVyc2VjdDpmdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTt0IGluc3RhbmNlb2Ygbnx8KHQ9bi5jcmVhdGUodCkpO3ZhciBlPXRoaXMscj1lLngsaT1lLngrZS53aWR0aCxhPWUueSxvPWUueStlLmhlaWdodCxzPXQueCxsPXQueCt0LndpZHRoLGg9dC55LHU9dC55K3QuaGVpZ2h0O3JldHVybiEoaTxzfHxsPHJ8fG88aHx8dTxhKX0sY29udGFpbjpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXM7cmV0dXJuIHQ+PXIueCYmdDw9ci54K3Iud2lkdGgmJmU+PXIueSYmZTw9ci55K3IuaGVpZ2h0fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLngsdGhpcy55LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpfSxjb3B5OmZ1bmN0aW9uKHQpe3RoaXMueD10LngsdGhpcy55PXQueSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHR9LHBsYWluOmZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy54LHk6dGhpcy55LHdpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0fX19LG4uY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0LngsdC55LHQud2lkdGgsdC5oZWlnaHQpfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0Pi1iJiZ0PGJ9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdD5ifHx0PC1ifWZ1bmN0aW9uIGEodCxlLHIsbixpKXt2YXIgYT0xLWk7cmV0dXJuIGEqYSooYSp0KzMqaSplKStpKmkqKGkqbiszKmEqcil9ZnVuY3Rpb24gbyh0LGUscixuLGkpe3ZhciBhPTEtaTtyZXR1cm4gMyooKChlLXQpKmErMiooci1lKSppKSphKyhuLXIpKmkqaSl9ZnVuY3Rpb24gcyh0LGUscixpLGEsbyl7dmFyIHM9aSszKihlLXIpLXQsbD0zKihyLTIqZSt0KSxoPTMqKGUtdCksdT10LWEsYz1sKmwtMypzKmgsZj1sKmgtOSpzKnUsZD1oKmgtMypsKnUscD0wO2lmKG4oYykmJm4oZikpaWYobihsKSlvWzBdPTA7ZWxzZXt2YXIgZz0taC9sO2c+PTAmJmc8PTEmJihvW3ArK109Zyl9ZWxzZXt2YXIgdj1mKmYtNCpjKmQ7aWYobih2KSl7dmFyIG09Zi9jLGc9LWwvcyttLHg9LW0vMjtnPj0wJiZnPD0xJiYob1twKytdPWcpLHg+PTAmJng8PTEmJihvW3ArK109eCl9ZWxzZSBpZih2PjApe3ZhciB5PXcodiksYj1jKmwrMS41KnMqKC1mK3kpLFM9YypsKzEuNSpzKigtZi15KTtiPWI8MD8tXygtYixNKTpfKGIsTSksUz1TPDA/LV8oLVMsTSk6XyhTLE0pO3ZhciBnPSgtbC0oYitTKSkvKDMqcyk7Zz49MCYmZzw9MSYmKG9bcCsrXT1nKX1lbHNle3ZhciBQPSgyKmMqbC0zKnMqZikvKDIqdyhjKmMqYykpLGs9TWF0aC5hY29zKFApLzMsQz13KGMpLEk9TWF0aC5jb3MoayksZz0oLWwtMipDKkkpLygzKnMpLHg9KC1sK0MqKEkrVCpNYXRoLnNpbihrKSkpLygzKnMpLEE9KC1sK0MqKEktVCpNYXRoLnNpbihrKSkpLygzKnMpO2c+PTAmJmc8PTEmJihvW3ArK109ZykseD49MCYmeDw9MSYmKG9bcCsrXT14KSxBPj0wJiZBPD0xJiYob1twKytdPUEpfX1yZXR1cm4gcH1mdW5jdGlvbiBsKHQsZSxyLGEsbyl7dmFyIHM9NipyLTEyKmUrNip0LGw9OSplKzMqYS0zKnQtOSpyLGg9MyplLTMqdCx1PTA7aWYobihsKSl7aWYoaShzKSl7dmFyIGM9LWgvcztjPj0wJiZjPD0xJiYob1t1KytdPWMpfX1lbHNle3ZhciBmPXMqcy00KmwqaDtpZihuKGYpKW9bMF09LXMvKDIqbCk7ZWxzZSBpZihmPjApe3ZhciBkPXcoZiksYz0oLXMrZCkvKDIqbCkscD0oLXMtZCkvKDIqbCk7Yz49MCYmYzw9MSYmKG9bdSsrXT1jKSxwPj0wJiZwPD0xJiYob1t1KytdPXApfX1yZXR1cm4gdX1mdW5jdGlvbiBoKHQsZSxyLG4saSxhKXt2YXIgbz0oZS10KSppK3Qscz0oci1lKSppK2UsbD0obi1yKSppK3IsaD0ocy1vKSppK28sdT0obC1zKSppK3MsYz0odS1oKSppK2g7YVswXT10LGFbMV09byxhWzJdPWgsYVszXT1jLGFbNF09YyxhWzVdPXUsYVs2XT1sLGFbN109bn1mdW5jdGlvbiB1KHQsZSxyLG4saSxvLHMsbCxoLHUsYyl7dmFyIGYsZCxwLGcsdixtPS4wMDUseD0xLzA7UFswXT1oLFBbMV09dTtmb3IodmFyIF89MDtfPDE7Xys9LjA1KWtbMF09YSh0LHIsaSxzLF8pLGtbMV09YShlLG4sbyxsLF8pLGc9eShQLGspLGc8eCYmKGY9Xyx4PWcpO3g9MS8wO2Zvcih2YXIgYj0wO2I8MzImJiEobTxTKTtiKyspZD1mLW0scD1mK20sa1swXT1hKHQscixpLHMsZCksa1sxXT1hKGUsbixvLGwsZCksZz15KGssUCksZD49MCYmZzx4PyhmPWQseD1nKTooQ1swXT1hKHQscixpLHMscCksQ1sxXT1hKGUsbixvLGwscCksdj15KEMsUCkscDw9MSYmdjx4PyhmPXAseD12KTptKj0uNSk7cmV0dXJuIGMmJihjWzBdPWEodCxyLGkscyxmKSxjWzFdPWEoZSxuLG8sbCxmKSksdyh4KX1mdW5jdGlvbiBjKHQsZSxyLG4pe3ZhciBpPTEtbjtyZXR1cm4gaSooaSp0KzIqbiplKStuKm4qcn1mdW5jdGlvbiBmKHQsZSxyLG4pe3JldHVybiAyKigoMS1uKSooZS10KStuKihyLWUpKX1mdW5jdGlvbiBkKHQsZSxyLGEsbyl7dmFyIHM9dC0yKmUrcixsPTIqKGUtdCksaD10LWEsdT0wO2lmKG4ocykpe2lmKGkobCkpe3ZhciBjPS1oL2w7Yz49MCYmYzw9MSYmKG9bdSsrXT1jKX19ZWxzZXt2YXIgZj1sKmwtNCpzKmg7aWYobihmKSl7dmFyIGM9LWwvKDIqcyk7Yz49MCYmYzw9MSYmKG9bdSsrXT1jKX1lbHNlIGlmKGY+MCl7dmFyIGQ9dyhmKSxjPSgtbCtkKS8oMipzKSxwPSgtbC1kKS8oMipzKTtjPj0wJiZjPD0xJiYob1t1KytdPWMpLHA+PTAmJnA8PTEmJihvW3UrK109cCl9fXJldHVybiB1fWZ1bmN0aW9uIHAodCxlLHIpe3ZhciBuPXQrci0yKmU7cmV0dXJuIDA9PT1uPy41Oih0LWUpL259ZnVuY3Rpb24gZyh0LGUscixuLGkpe3ZhciBhPShlLXQpKm4rdCxvPShyLWUpKm4rZSxzPShvLWEpKm4rYTtpWzBdPXQsaVsxXT1hLGlbMl09cyxpWzNdPXMsaVs0XT1vLGlbNV09cn1mdW5jdGlvbiB2KHQsZSxyLG4saSxhLG8scyxsKXt2YXIgaCx1PS4wMDUsZj0xLzA7UFswXT1vLFBbMV09cztmb3IodmFyIGQ9MDtkPDE7ZCs9LjA1KXtrWzBdPWModCxyLGksZCksa1sxXT1jKGUsbixhLGQpO3ZhciBwPXkoUCxrKTtwPGYmJihoPWQsZj1wKX1mPTEvMDtmb3IodmFyIGc9MDtnPDMyJiYhKHU8Uyk7ZysrKXt2YXIgdj1oLXUsbT1oK3U7a1swXT1jKHQscixpLHYpLGtbMV09YyhlLG4sYSx2KTt2YXIgcD15KGssUCk7aWYodj49MCYmcDxmKWg9dixmPXA7ZWxzZXtDWzBdPWModCxyLGksbSksQ1sxXT1jKGUsbixhLG0pO3ZhciB4PXkoQyxQKTttPD0xJiZ4PGY/KGg9bSxmPXgpOnUqPS41fX1yZXR1cm4gbCYmKGxbMF09Yyh0LHIsaSxoKSxsWzFdPWMoZSxuLGEsaCkpLHcoZil9dmFyIG09cigzKSx4PW0uY3JlYXRlLHk9bS5kaXN0U3F1YXJlLF89TWF0aC5wb3csdz1NYXRoLnNxcnQsYj0xZS04LFM9MWUtNCxUPXcoMyksTT0xLzMsUD14KCksaz14KCksQz14KCk7dC5leHBvcnRzPXtjdWJpY0F0OmEsY3ViaWNEZXJpdmF0aXZlQXQ6byxjdWJpY1Jvb3RBdDpzLGN1YmljRXh0cmVtYTpsLGN1YmljU3ViZGl2aWRlOmgsY3ViaWNQcm9qZWN0UG9pbnQ6dSxxdWFkcmF0aWNBdDpjLHF1YWRyYXRpY0Rlcml2YXRpdmVBdDpmLHF1YWRyYXRpY1Jvb3RBdDpkLHF1YWRyYXRpY0V4dHJlbXVtOnAscXVhZHJhdGljU3ViZGl2aWRlOmcscXVhZHJhdGljUHJvamVjdFBvaW50OnZ9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe2U9ZXx8azt2YXIgcj10KyI6IitlO2lmKFNbcl0pcmV0dXJuIFNbcl07Zm9yKHZhciBuPSh0KyIiKS5zcGxpdCgiXG4iKSxpPTAsYT0wLG89bi5sZW5ndGg7YTxvO2ErKylpPU1hdGgubWF4KEEubWVhc3VyZVRleHQoblthXSxlKS53aWR0aCxpKTtyZXR1cm4gVD5NJiYoVD0wLFM9e30pLFQrKyxTW3JdPWksaX1mdW5jdGlvbiBpKHQsZSxyLG4saSxzLGwpe3JldHVybiBzP28odCxlLHIsbixpLHMsbCk6YSh0LGUscixuLGksbCl9ZnVuY3Rpb24gYSh0LGUscixpLGEsbyl7dmFyIGg9dih0LGUsYSxvKSx1PW4odCxlKTthJiYodSs9YVsxXSthWzNdKTt2YXIgYz1oLm91dGVySGVpZ2h0LGY9cygwLHUsciksZD1sKDAsYyxpKSxwPW5ldyB3KGYsZCx1LGMpO3JldHVybiBwLmxpbmVIZWlnaHQ9aC5saW5lSGVpZ2h0LHB9ZnVuY3Rpb24gbyh0LGUscixuLGksYSxvKXt2YXIgaD1tKHQse3JpY2g6YSx0cnVuY2F0ZTpvLGZvbnQ6ZSx0ZXh0QWxpZ246cix0ZXh0UGFkZGluZzppfSksdT1oLm91dGVyV2lkdGgsYz1oLm91dGVySGVpZ2h0LGY9cygwLHUsciksZD1sKDAsYyxuKTtyZXR1cm4gbmV3IHcoZixkLHUsYyl9ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuInJpZ2h0Ij09PXI/dC09ZToiY2VudGVyIj09PXImJih0LT1lLzIpLHR9ZnVuY3Rpb24gbCh0LGUscil7cmV0dXJuIm1pZGRsZSI9PT1yP3QtPWUvMjoiYm90dG9tIj09PXImJih0LT1lKSx0fWZ1bmN0aW9uIGgodCxlLHIpe3ZhciBuPWUueCxpPWUueSxhPWUuaGVpZ2h0LG89ZS53aWR0aCxzPWEvMixsPSJsZWZ0IixoPSJ0b3AiO3N3aXRjaCh0KXtjYXNlImxlZnQiOm4tPXIsaSs9cyxsPSJyaWdodCIsaD0ibWlkZGxlIjticmVhaztjYXNlInJpZ2h0IjpuKz1yK28saSs9cyxoPSJtaWRkbGUiO2JyZWFrO2Nhc2UidG9wIjpuKz1vLzIsaS09cixsPSJjZW50ZXIiLGg9ImJvdHRvbSI7YnJlYWs7Y2FzZSJib3R0b20iOm4rPW8vMixpKz1hK3IsbD0iY2VudGVyIjticmVhaztjYXNlImluc2lkZSI6bis9by8yLGkrPXMsbD0iY2VudGVyIixoPSJtaWRkbGUiO2JyZWFrO2Nhc2UiaW5zaWRlTGVmdCI6bis9cixpKz1zLGg9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVSaWdodCI6bis9by1yLGkrPXMsbD0icmlnaHQiLGg9Im1pZGRsZSI7YnJlYWs7Y2FzZSJpbnNpZGVUb3AiOm4rPW8vMixpKz1yLGw9ImNlbnRlciI7YnJlYWs7Y2FzZSJpbnNpZGVCb3R0b20iOm4rPW8vMixpKz1hLXIsbD0iY2VudGVyIixoPSJib3R0b20iO2JyZWFrO2Nhc2UiaW5zaWRlVG9wTGVmdCI6bis9cixpKz1yO2JyZWFrO2Nhc2UiaW5zaWRlVG9wUmlnaHQiOm4rPW8tcixpKz1yLGw9InJpZ2h0IjticmVhaztjYXNlImluc2lkZUJvdHRvbUxlZnQiOm4rPXIsaSs9YS1yLGg9ImJvdHRvbSI7YnJlYWs7Y2FzZSJpbnNpZGVCb3R0b21SaWdodCI6bis9by1yLGkrPWEtcixsPSJyaWdodCIsaD0iYm90dG9tIn1yZXR1cm57eDpuLHk6aSx0ZXh0QWxpZ246bCx0ZXh0VmVydGljYWxBbGlnbjpofX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7aWYoIWUpcmV0dXJuIiI7dmFyIGE9KHQrIiIpLnNwbGl0KCJcbiIpO2k9YyhlLHIsbixpKTtmb3IodmFyIG89MCxzPWEubGVuZ3RoO288cztvKyspYVtvXT1mKGFbb10saSk7cmV0dXJuIGEuam9pbigiXG4iKX1mdW5jdGlvbiBjKHQsZSxyLGkpe2k9Xy5leHRlbmQoe30saSksaS5mb250PWU7dmFyIHI9QyhyLCIuLi4iKTtpLm1heEl0ZXJhdGlvbnM9QyhpLm1heEl0ZXJhdGlvbnMsMik7dmFyIGE9aS5taW5DaGFyPUMoaS5taW5DaGFyLDApO2kuY25DaGFyV2lkdGg9bigi5Zu9IixlKTt2YXIgbz1pLmFzY0NoYXJXaWR0aD1uKCJhIixlKTtpLnBsYWNlaG9sZGVyPUMoaS5wbGFjZWhvbGRlciwiIik7Zm9yKHZhciBzPXQ9TWF0aC5tYXgoMCx0LTEpLGw9MDtsPGEmJnM+PW87bCsrKXMtPW87dmFyIGg9bihyKTtyZXR1cm4gaD5zJiYocj0iIixoPTApLHM9dC1oLGkuZWxsaXBzaXM9cixpLmVsbGlwc2lzV2lkdGg9aCxpLmNvbnRlbnRXaWR0aD1zLGkuY29udGFpbmVyV2lkdGg9dCxpfWZ1bmN0aW9uIGYodCxlKXt2YXIgcj1lLmNvbnRhaW5lcldpZHRoLGk9ZS5mb250LGE9ZS5jb250ZW50V2lkdGg7aWYoIXIpcmV0dXJuIiI7dmFyIG89bih0LGkpO2lmKG88PXIpcmV0dXJuIHQ7Zm9yKHZhciBzPTA7O3MrKyl7aWYobzw9YXx8cz49ZS5tYXhJdGVyYXRpb25zKXt0Kz1lLmVsbGlwc2lzO2JyZWFrfXZhciBsPTA9PT1zP2QodCxhLGUuYXNjQ2hhcldpZHRoLGUuY25DaGFyV2lkdGgpOm8+MD9NYXRoLmZsb29yKHQubGVuZ3RoKmEvbyk6MDt0PXQuc3Vic3RyKDAsbCksbz1uKHQsaSl9cmV0dXJuIiI9PT10JiYodD1lLnBsYWNlaG9sZGVyKSx0fWZ1bmN0aW9uIGQodCxlLHIsbil7Zm9yKHZhciBpPTAsYT0wLG89dC5sZW5ndGg7YTxvJiZpPGU7YSsrKXt2YXIgcz10LmNoYXJDb2RlQXQoYSk7aSs9MDw9cyYmczw9MTI3P3I6bn1yZXR1cm4gYX1mdW5jdGlvbiBwKHQpe3JldHVybiBuKCLlm70iLHQpfWZ1bmN0aW9uIGcodCxlKXt2YXIgcj1fLmdldENvbnRleHQoKTtyZXR1cm4gci5mb250PWV8fGssci5tZWFzdXJlVGV4dCh0KX1mdW5jdGlvbiB2KHQsZSxyLG4pe251bGwhPXQmJih0Kz0iIik7dmFyIGk9cChlKSxhPXQ/dC5zcGxpdCgiXG4iKTpbXSxvPWEubGVuZ3RoKmkscz1vO2lmKHImJihzKz1yWzBdK3JbMl0pLHQmJm4pe3ZhciBsPW4ub3V0ZXJIZWlnaHQsaD1uLm91dGVyV2lkdGg7aWYobnVsbCE9bCYmcz5sKXQ9IiIsYT1bXTtlbHNlIGlmKG51bGwhPWgpZm9yKHZhciB1PWMoaC0ocj9yWzFdK3JbM106MCksZSxuLmVsbGlwc2lzLHttaW5DaGFyOm4ubWluQ2hhcixwbGFjZWhvbGRlcjpuLnBsYWNlaG9sZGVyfSksZD0wLGc9YS5sZW5ndGg7ZDxnO2QrKylhW2RdPWYoYVtkXSx1KX1yZXR1cm57bGluZXM6YSxoZWlnaHQ6byxvdXRlckhlaWdodDpzLGxpbmVIZWlnaHQ6aX19ZnVuY3Rpb24gbSh0LGUpe3ZhciByPXtsaW5lczpbXSx3aWR0aDowLGhlaWdodDowfTtpZihudWxsIT10JiYodCs9IiIpLCF0KXJldHVybiByO2Zvcih2YXIgbixpPVAubGFzdEluZGV4PTA7bnVsbCE9KG49UC5leGVjKHQpKTspe3ZhciBhPW4uaW5kZXg7YT5pJiZ4KHIsdC5zdWJzdHJpbmcoaSxhKSkseChyLG5bMl0sblsxXSksaT1QLmxhc3RJbmRleH1pPHQubGVuZ3RoJiZ4KHIsdC5zdWJzdHJpbmcoaSx0Lmxlbmd0aCkpO3ZhciBvPXIubGluZXMscz0wLGw9MCxoPVtdLGM9ZS50ZXh0UGFkZGluZyxmPWUudHJ1bmNhdGUsZD1mJiZmLm91dGVyV2lkdGgscD1mJiZmLm91dGVySGVpZ2h0O2MmJihudWxsIT1kJiYoZC09Y1sxXStjWzNdKSxudWxsIT1wJiYocC09Y1swXStjWzJdKSk7Zm9yKHZhciBnPTA7ZzxvLmxlbmd0aDtnKyspe2Zvcih2YXIgdj1vW2ddLG09MCx5PTAsXz0wO188di50b2tlbnMubGVuZ3RoO18rKyl7dmFyIHc9di50b2tlbnNbX10sUz13LnN0eWxlTmFtZSYmZS5yaWNoW3cuc3R5bGVOYW1lXXx8e30sVD13LnRleHRQYWRkaW5nPVMudGV4dFBhZGRpbmcsTT13LmZvbnQ9Uy5mb250fHxlLmZvbnQsaz13LnRleHRIZWlnaHQ9QyhTLnRleHRIZWlnaHQsQS5nZXRMaW5lSGVpZ2h0KE0pKTtpZihUJiYoays9VFswXStUWzJdKSx3LmhlaWdodD1rLHcubGluZUhlaWdodD1JKFMudGV4dExpbmVIZWlnaHQsZS50ZXh0TGluZUhlaWdodCxrKSx3LnRleHRBbGlnbj1TJiZTLnRleHRBbGlnbnx8ZS50ZXh0QWxpZ24sdy50ZXh0VmVydGljYWxBbGlnbj1TJiZTLnRleHRWZXJ0aWNhbEFsaWdufHwibWlkZGxlIixudWxsIT1wJiZzK3cubGluZUhlaWdodD5wKXJldHVybntsaW5lczpbXSx3aWR0aDowLGhlaWdodDowfTt3LnRleHRXaWR0aD1BLmdldFdpZHRoKHcudGV4dCxNKTt2YXIgTz1TLnRleHRXaWR0aCxEPW51bGw9PU98fCJhdXRvIj09PU87aWYoInN0cmluZyI9PXR5cGVvZiBPJiYiJSI9PT1PLmNoYXJBdChPLmxlbmd0aC0xKSl3LnBlcmNlbnRXaWR0aD1PLGgucHVzaCh3KSxPPTA7ZWxzZXtpZihEKXtPPXcudGV4dFdpZHRoO3ZhciBMPVMudGV4dEJhY2tncm91bmRDb2xvcixCPUwmJkwuaW1hZ2U7QiYmKEI9Yi5maW5kRXhpc3RJbWFnZShCKSxiLmlzSW1hZ2VSZWFkeShCKSYmKE89TWF0aC5tYXgoTyxCLndpZHRoKmsvQi5oZWlnaHQpKSl9dmFyIEY9VD9UWzFdK1RbM106MDtPKz1GO3ZhciBSPW51bGwhPWQ/ZC15Om51bGw7bnVsbCE9UiYmUjxPJiYoIUR8fFI8Rj8ody50ZXh0PSIiLHcudGV4dFdpZHRoPU89MCk6KHcudGV4dD11KHcudGV4dCxSLUYsTSxmLmVsbGlwc2lzLHttaW5DaGFyOmYubWluQ2hhcn0pLHcudGV4dFdpZHRoPUEuZ2V0V2lkdGgody50ZXh0LE0pLE89dy50ZXh0V2lkdGgrRikpfXkrPXcud2lkdGg9TyxTJiYobT1NYXRoLm1heChtLHcubGluZUhlaWdodCkpfXYud2lkdGg9eSx2LmxpbmVIZWlnaHQ9bSxzKz1tLGw9TWF0aC5tYXgobCx5KX1yLm91dGVyV2lkdGg9ci53aWR0aD1DKGUudGV4dFdpZHRoLGwpLHIub3V0ZXJIZWlnaHQ9ci5oZWlnaHQ9QyhlLnRleHRIZWlnaHQscyksYyYmKHIub3V0ZXJXaWR0aCs9Y1sxXStjWzNdLHIub3V0ZXJIZWlnaHQrPWNbMF0rY1syXSk7Zm9yKHZhciBnPTA7ZzxoLmxlbmd0aDtnKyspe3ZhciB3PWhbZ10sej13LnBlcmNlbnRXaWR0aDt3LndpZHRoPXBhcnNlSW50KHosMTApLzEwMCpsfXJldHVybiByfWZ1bmN0aW9uIHgodCxlLHIpe2Zvcih2YXIgbj0iIj09PWUsaT1lLnNwbGl0KCJcbiIpLGE9dC5saW5lcyxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBzPWlbb10sbD17c3R5bGVOYW1lOnIsdGV4dDpzLGlzTGluZUhvbGRlcjohcyYmIW59O2lmKG8pYS5wdXNoKHt0b2tlbnM6W2xdfSk7ZWxzZXt2YXIgaD0oYVthLmxlbmd0aC0xXXx8KGFbMF09e3Rva2VuczpbXX0pKS50b2tlbnMsdT1oLmxlbmd0aDsxPT09dSYmaFswXS5pc0xpbmVIb2xkZXI/aFswXT1sOihzfHwhdXx8bikmJmgucHVzaChsKX19fWZ1bmN0aW9uIHkodCl7cmV0dXJuKHQuZm9udFNpemV8fHQuZm9udEZhbWlseSkmJlt0LmZvbnRTdHlsZSx0LmZvbnRXZWlnaHQsKHQuZm9udFNpemV8fDEyKSsicHgiLHQuZm9udEZhbWlseXx8InNhbnMtc2VyaWYiXS5qb2luKCIgIil8fHQudGV4dEZvbnR8fHQuZm9udH12YXIgXz1yKDEpLHc9cig0KSxiPXIoMTIpLFM9e30sVD0wLE09NWUzLFA9L1x7KFthLXpBLVowLTlfXSspXHwoW159XSopXH0vZyxrPSIxMnB4IHNhbnMtc2VyaWYiLEM9Xy5yZXRyaWV2ZTIsST1fLnJldHJpZXZlMyxBPXtnZXRXaWR0aDpuLGdldEJvdW5kaW5nUmVjdDppLGFkanVzdFRleHRQb3NpdGlvbk9uUmVjdDpoLHRydW5jYXRlVGV4dDp1LG1lYXN1cmVUZXh0OmcsZ2V0TGluZUhlaWdodDpwLHBhcnNlUGxhaW5UZXh0OnYscGFyc2VSaWNoVGV4dDptLGFkanVzdFRleHRYOnMsYWRqdXN0VGV4dFk6bCxtYWtlRm9udDp5LERFRkFVTFRfRk9OVDprfTt0LmV4cG9ydHM9QX0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDUpLGk9cigzKSxhPXIoNTEpLG89cig0KSxzPXIoMTcpLmRldmljZVBpeGVsUmF0aW8sbD17TToxLEw6MixDOjMsUTo0LEE6NSxaOjYsUjo3fSxoPVtdLHU9W10sYz1bXSxmPVtdLGQ9TWF0aC5taW4scD1NYXRoLm1heCxnPU1hdGguY29zLHY9TWF0aC5zaW4sbT1NYXRoLnNxcnQseD1NYXRoLmFicyx5PSJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5LF89ZnVuY3Rpb24odCl7dGhpcy5fc2F2ZURhdGE9IXQsdGhpcy5fc2F2ZURhdGEmJih0aGlzLmRhdGE9W10pLHRoaXMuX2N0eD1udWxsfTtfLnByb3RvdHlwZT17Y29uc3RydWN0b3I6XyxfeGk6MCxfeWk6MCxfeDA6MCxfeTA6MCxfdXg6MCxfdXk6MCxfbGVuOjAsX2xpbmVEYXNoOm51bGwsX2Rhc2hPZmZzZXQ6MCxfZGFzaElkeDowLF9kYXNoU3VtOjAsc2V0U2NhbGU6ZnVuY3Rpb24odCxlKXt0aGlzLl91eD14KDEvcy90KXx8MCx0aGlzLl91eT14KDEvcy9lKXx8MH0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdHh9LGJlZ2luUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3R4PXQsdCYmdC5iZWdpblBhdGgoKSx0JiYodGhpcy5kcHI9dC5kcHIpLHRoaXMuX3NhdmVEYXRhJiYodGhpcy5fbGVuPTApLHRoaXMuX2xpbmVEYXNoJiYodGhpcy5fbGluZURhc2g9bnVsbCx0aGlzLl9kYXNoT2Zmc2V0PTApLHRoaXN9LG1vdmVUbzpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZERhdGEobC5NLHQsZSksdGhpcy5fY3R4JiZ0aGlzLl9jdHgubW92ZVRvKHQsZSksdGhpcy5feDA9dCx0aGlzLl95MD1lLHRoaXMuX3hpPXQsdGhpcy5feWk9ZSx0aGlzfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt2YXIgcj14KHQtdGhpcy5feGkpPnRoaXMuX3V4fHx4KGUtdGhpcy5feWkpPnRoaXMuX3V5fHx0aGlzLl9sZW48NTtyZXR1cm4gdGhpcy5hZGREYXRhKGwuTCx0LGUpLHRoaXMuX2N0eCYmciYmKHRoaXMuX25lZWRzRGFzaCgpP3RoaXMuX2Rhc2hlZExpbmVUbyh0LGUpOnRoaXMuX2N0eC5saW5lVG8odCxlKSksciYmKHRoaXMuX3hpPXQsdGhpcy5feWk9ZSksdGhpc30sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUscixuLGksYSl7cmV0dXJuIHRoaXMuYWRkRGF0YShsLkMsdCxlLHIsbixpLGEpLHRoaXMuX2N0eCYmKHRoaXMuX25lZWRzRGFzaCgpP3RoaXMuX2Rhc2hlZEJlemllclRvKHQsZSxyLG4saSxhKTp0aGlzLl9jdHguYmV6aWVyQ3VydmVUbyh0LGUscixuLGksYSkpLHRoaXMuX3hpPWksdGhpcy5feWk9YSx0aGlzfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0aGlzLmFkZERhdGEobC5RLHQsZSxyLG4pLHRoaXMuX2N0eCYmKHRoaXMuX25lZWRzRGFzaCgpP3RoaXMuX2Rhc2hlZFF1YWRyYXRpY1RvKHQsZSxyLG4pOnRoaXMuX2N0eC5xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxyLG4pKSx0aGlzLl94aT1yLHRoaXMuX3lpPW4sdGhpc30sYXJjOmZ1bmN0aW9uKHQsZSxyLG4saSxhKXtyZXR1cm4gdGhpcy5hZGREYXRhKGwuQSx0LGUscixyLG4saS1uLDAsYT8wOjEpLHRoaXMuX2N0eCYmdGhpcy5fY3R4LmFyYyh0LGUscixuLGksYSksdGhpcy5feGk9ZyhpKSpyK3QsdGhpcy5feWk9dihpKSpyK3QsdGhpc30sYXJjVG86ZnVuY3Rpb24odCxlLHIsbixpKXtyZXR1cm4gdGhpcy5fY3R4JiZ0aGlzLl9jdHguYXJjVG8odCxlLHIsbixpKSx0aGlzfSxyZWN0OmZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0aGlzLl9jdHgmJnRoaXMuX2N0eC5yZWN0KHQsZSxyLG4pLHRoaXMuYWRkRGF0YShsLlIsdCxlLHIsbiksdGhpc30sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5hZGREYXRhKGwuWik7dmFyIHQ9dGhpcy5fY3R4LGU9dGhpcy5feDAscj10aGlzLl95MDtyZXR1cm4gdCYmKHRoaXMuX25lZWRzRGFzaCgpJiZ0aGlzLl9kYXNoZWRMaW5lVG8oZSxyKSx0LmNsb3NlUGF0aCgpKSx0aGlzLl94aT1lLHRoaXMuX3lpPXIsdGhpc30sZmlsbDpmdW5jdGlvbih0KXt0JiZ0LmZpbGwoKSx0aGlzLnRvU3RhdGljKCl9LHN0cm9rZTpmdW5jdGlvbih0KXt0JiZ0LnN0cm9rZSgpLHRoaXMudG9TdGF0aWMoKX0sc2V0TGluZURhc2g6ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFycmF5KXt0aGlzLl9saW5lRGFzaD10LHRoaXMuX2Rhc2hJZHg9MDtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDtyKyspZSs9dFtyXTt0aGlzLl9kYXNoU3VtPWV9cmV0dXJuIHRoaXN9LHNldExpbmVEYXNoT2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kYXNoT2Zmc2V0PXQsdGhpc30sbGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xlbn0sc2V0RGF0YTpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLmRhdGEmJnRoaXMuZGF0YS5sZW5ndGg9PWV8fCF5fHwodGhpcy5kYXRhPW5ldyBGbG9hdDMyQXJyYXkoZSkpO2Zvcih2YXIgcj0wO3I8ZTtyKyspdGhpcy5kYXRhW3JdPXRbcl07dGhpcy5fbGVuPWV9LGFwcGVuZFBhdGg6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEFycmF5fHwodD1bdF0pO2Zvcih2YXIgZT10Lmxlbmd0aCxyPTAsbj10aGlzLl9sZW4saT0wO2k8ZTtpKyspcis9dFtpXS5sZW4oKTt5JiZ0aGlzLmRhdGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkmJih0aGlzLmRhdGE9bmV3IEZsb2F0MzJBcnJheShuK3IpKTtmb3IodmFyIGk9MDtpPGU7aSsrKWZvcih2YXIgYT10W2ldLmRhdGEsbz0wO288YS5sZW5ndGg7bysrKXRoaXMuZGF0YVtuKytdPWFbb107dGhpcy5fbGVuPW59LGFkZERhdGE6ZnVuY3Rpb24odCl7aWYodGhpcy5fc2F2ZURhdGEpe3ZhciBlPXRoaXMuZGF0YTt0aGlzLl9sZW4rYXJndW1lbnRzLmxlbmd0aD5lLmxlbmd0aCYmKHRoaXMuX2V4cGFuZERhdGEoKSxlPXRoaXMuZGF0YSk7Zm9yKHZhciByPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3RoaXMuX2xlbisrXT1hcmd1bWVudHNbcl07dGhpcy5fcHJldkNtZD10fX0sX2V4cGFuZERhdGE6ZnVuY3Rpb24oKXtpZighKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEFycmF5KSl7Zm9yKHZhciB0PVtdLGU9MDtlPHRoaXMuX2xlbjtlKyspdFtlXT10aGlzLmRhdGFbZV07dGhpcy5kYXRhPXR9fSxfbmVlZHNEYXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpbmVEYXNofSxfZGFzaGVkTGluZVRvOmZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPXRoaXMuX2Rhc2hTdW0sYT10aGlzLl9kYXNoT2Zmc2V0LG89dGhpcy5fbGluZURhc2gscz10aGlzLl9jdHgsbD10aGlzLl94aSxoPXRoaXMuX3lpLHU9dC1sLGM9ZS1oLGY9bSh1KnUrYypjKSxnPWwsdj1oLHg9by5sZW5ndGg7Zm9yKHUvPWYsYy89ZixhPDAmJihhPWkrYSksYSU9aSxnLT1hKnUsdi09YSpjO3U+MCYmZzw9dHx8dTwwJiZnPj10fHwwPT11JiYoYz4wJiZ2PD1lfHxjPDAmJnY+PWUpOyluPXRoaXMuX2Rhc2hJZHgscj1vW25dLGcrPXUqcix2Kz1jKnIsdGhpcy5fZGFzaElkeD0obisxKSV4LHU+MCYmZzxsfHx1PDAmJmc+bHx8Yz4wJiZ2PGh8fGM8MCYmdj5ofHxzW24lMj8ibW92ZVRvIjoibGluZVRvIl0odT49MD9kKGcsdCk6cChnLHQpLGM+PTA/ZCh2LGUpOnAodixlKSk7dT1nLXQsYz12LWUsdGhpcy5fZGFzaE9mZnNldD0tbSh1KnUrYypjKX0sX2Rhc2hlZEJlemllclRvOmZ1bmN0aW9uKHQsZSxyLGksYSxvKXt2YXIgcyxsLGgsdSxjLGY9dGhpcy5fZGFzaFN1bSxkPXRoaXMuX2Rhc2hPZmZzZXQscD10aGlzLl9saW5lRGFzaCxnPXRoaXMuX2N0eCx2PXRoaXMuX3hpLHg9dGhpcy5feWkseT1uLmN1YmljQXQsXz0wLHc9dGhpcy5fZGFzaElkeCxiPXAubGVuZ3RoLFM9MDtmb3IoZDwwJiYoZD1mK2QpLGQlPWYscz0wO3M8MTtzKz0uMSlsPXkodix0LHIsYSxzKy4xKS15KHYsdCxyLGEscyksaD15KHgsZSxpLG8scysuMSkteSh4LGUsaSxvLHMpLF8rPW0obCpsK2gqaCk7Zm9yKDt3PGImJihTKz1wW3ddLCEoUz5kKSk7dysrKTtmb3Iocz0oUy1kKS9fO3M8PTE7KXU9eSh2LHQscixhLHMpLGM9eSh4LGUsaSxvLHMpLHclMj9nLm1vdmVUbyh1LGMpOmcubGluZVRvKHUsYykscys9cFt3XS9fLHc9KHcrMSklYjt3JTIhPT0wJiZnLmxpbmVUbyhhLG8pLGw9YS11LGg9by1jLHRoaXMuX2Rhc2hPZmZzZXQ9LW0obCpsK2gqaCl9LF9kYXNoZWRRdWFkcmF0aWNUbzpmdW5jdGlvbih0LGUscixuKXt2YXIgaT1yLGE9bjtyPShyKzIqdCkvMyxuPShuKzIqZSkvMyx0PSh0aGlzLl94aSsyKnQpLzMsZT0odGhpcy5feWkrMiplKS8zLHRoaXMuX2Rhc2hlZEJlemllclRvKHQsZSxyLG4saSxhKX0sdG9TdGF0aWM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRhdGE7dCBpbnN0YW5jZW9mIEFycmF5JiYodC5sZW5ndGg9dGhpcy5fbGVuLHkmJih0aGlzLmRhdGE9bmV3IEZsb2F0MzJBcnJheSh0KSkpfSxnZXRCb3VuZGluZ1JlY3Q6ZnVuY3Rpb24oKXtoWzBdPWhbMV09Y1swXT1jWzFdPU51bWJlci5NQVhfVkFMVUUsdVswXT11WzFdPWZbMF09ZlsxXT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IodmFyIHQ9dGhpcy5kYXRhLGU9MCxyPTAsbj0wLHM9MCxkPTA7ZDx0Lmxlbmd0aDspe3ZhciBwPXRbZCsrXTtzd2l0Y2goMT09ZCYmKGU9dFtkXSxyPXRbZCsxXSxuPWUscz1yKSxwKXtjYXNlIGwuTTpuPXRbZCsrXSxzPXRbZCsrXSxlPW4scj1zLGNbMF09bixjWzFdPXMsZlswXT1uLGZbMV09czticmVhaztjYXNlIGwuTDphLmZyb21MaW5lKGUscix0W2RdLHRbZCsxXSxjLGYpLGU9dFtkKytdLHI9dFtkKytdO2JyZWFrO2Nhc2UgbC5DOmEuZnJvbUN1YmljKGUscix0W2QrK10sdFtkKytdLHRbZCsrXSx0W2QrK10sdFtkXSx0W2QrMV0sYyxmKSxlPXRbZCsrXSxyPXRbZCsrXTticmVhaztjYXNlIGwuUTphLmZyb21RdWFkcmF0aWMoZSxyLHRbZCsrXSx0W2QrK10sdFtkXSx0W2QrMV0sYyxmKSxlPXRbZCsrXSxyPXRbZCsrXTticmVhaztjYXNlIGwuQTp2YXIgbT10W2QrK10seD10W2QrK10seT10W2QrK10sXz10W2QrK10sdz10W2QrK10sYj10W2QrK10rdyxTPSh0W2QrK10sMS10W2QrK10pOzE9PWQmJihuPWcodykqeSttLHM9dih3KSpfK3gpLGEuZnJvbUFyYyhtLHgseSxfLHcsYixTLGMsZiksZT1nKGIpKnkrbSxyPXYoYikqXyt4O2JyZWFrO2Nhc2UgbC5SOm49ZT10W2QrK10scz1yPXRbZCsrXTt2YXIgVD10W2QrK10sTT10W2QrK107YS5mcm9tTGluZShuLHMsbitULHMrTSxjLGYpO2JyZWFrO2Nhc2UgbC5aOmU9bixyPXN9aS5taW4oaCxoLGMpLGkubWF4KHUsdSxmKX1yZXR1cm4gMD09PWQmJihoWzBdPWhbMV09dVswXT11WzFdPTApLG5ldyBvKGhbMF0saFsxXSx1WzBdLWhbMF0sdVsxXS1oWzFdKX0scmVidWlsZFBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbixpLGEsbyxzPXRoaXMuZGF0YSxoPXRoaXMuX3V4LHU9dGhpcy5fdXksYz10aGlzLl9sZW4sZj0wO2Y8Yzspe3ZhciBkPXNbZisrXTtzd2l0Y2goMT09ZiYmKG49c1tmXSxpPXNbZisxXSxlPW4scj1pKSxkKXtjYXNlIGwuTTplPW49c1tmKytdLHI9aT1zW2YrK10sdC5tb3ZlVG8obixpKTticmVhaztjYXNlIGwuTDphPXNbZisrXSxvPXNbZisrXSwoeChhLW4pPmh8fHgoby1pKT51fHxmPT09Yy0xKSYmKHQubGluZVRvKGEsbyksbj1hLGk9byk7YnJlYWs7Y2FzZSBsLkM6dC5iZXppZXJDdXJ2ZVRvKHNbZisrXSxzW2YrK10sc1tmKytdLHNbZisrXSxzW2YrK10sc1tmKytdKSxuPXNbZi0yXSxpPXNbZi0xXTticmVhaztjYXNlIGwuUTp0LnF1YWRyYXRpY0N1cnZlVG8oc1tmKytdLHNbZisrXSxzW2YrK10sc1tmKytdKSxuPXNbZi0yXSxpPXNbZi0xXTticmVhaztjYXNlIGwuQTp2YXIgcD1zW2YrK10sbT1zW2YrK10seT1zW2YrK10sXz1zW2YrK10sdz1zW2YrK10sYj1zW2YrK10sUz1zW2YrK10sVD1zW2YrK10sTT15Pl8/eTpfLFA9eT5fPzE6eS9fLGs9eT5fP18veToxLEM9TWF0aC5hYnMoeS1fKT4uMDAxLEk9dytiO0M/KHQudHJhbnNsYXRlKHAsbSksdC5yb3RhdGUoUyksdC5zY2FsZShQLGspLHQuYXJjKDAsMCxNLHcsSSwxLVQpLHQuc2NhbGUoMS9QLDEvayksdC5yb3RhdGUoLVMpLHQudHJhbnNsYXRlKC1wLC1tKSk6dC5hcmMocCxtLE0sdyxJLDEtVCksMT09ZiYmKGU9Zyh3KSp5K3Ascj12KHcpKl8rbSksbj1nKEkpKnkrcCxpPXYoSSkqXyttO2JyZWFrO2Nhc2UgbC5SOmU9bj1zW2ZdLHI9aT1zW2YrMV0sdC5yZWN0KHNbZisrXSxzW2YrK10sc1tmKytdLHNbZisrXSk7YnJlYWs7Y2FzZSBsLlo6dC5jbG9zZVBhdGgoKSxuPWUsaT1yfX19fSxfLkNNRD1sLHQuZXhwb3J0cz1ffSxmdW5jdGlvbihlLHIpe2UuZXhwb3J0cz10fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXVsxXXx8KHRbZV1bMV09dFtlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPXt9LGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIG89dFthXVsxXTtpZighKGUmJm4uaW5kZXhPZihlLG8pPj0wfHxyJiZuLmluZGV4T2YocixvKTwwKSl7dmFyIHM9dGhpcy5nZXRTaGFsbG93KG8pO251bGwhPXMmJihpW3RbYV1bMF1dPXMpfX1yZXR1cm4gaX19fSxmdW5jdGlvbih0LGUpe3ZhciByPSJ1bmRlZmluZWQiPT10eXBlb2YgRmxvYXQzMkFycmF5P0FycmF5OkZsb2F0MzJBcnJheSxuPXtjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgcig2KTtyZXR1cm4gbi5pZGVudGl0eSh0KSx0fSxpZGVudGl0eTpmdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH0sY29weTpmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0fSxtdWw6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0qclswXStlWzJdKnJbMV0saT1lWzFdKnJbMF0rZVszXSpyWzFdLGE9ZVswXSpyWzJdK2VbMl0qclszXSxvPWVbMV0qclsyXStlWzNdKnJbM10scz1lWzBdKnJbNF0rZVsyXSpyWzVdK2VbNF0sbD1lWzFdKnJbNF0rZVszXSpyWzVdK2VbNV07cmV0dXJuIHRbMF09bix0WzFdPWksdFsyXT1hLHRbM109byx0WzRdPXMsdFs1XT1sLHR9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0rclswXSx0WzVdPWVbNV0rclsxXSx0fSxyb3RhdGU6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzJdLGE9ZVs0XSxvPWVbMV0scz1lWzNdLGw9ZVs1XSxoPU1hdGguc2luKHIpLHU9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09bip1K28qaCx0WzFdPS1uKmgrbyp1LHRbMl09aSp1K3MqaCx0WzNdPS1pKmgrdSpzLHRbNF09dSphK2gqbCx0WzVdPXUqbC1oKmEsdH0sc2NhbGU6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXJbMF0saT1yWzFdO3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qaSx0WzJdPWVbMl0qbix0WzNdPWVbM10qaSx0WzRdPWVbNF0qbix0WzVdPWVbNV0qaSx0fSxpbnZlcnQ6ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsyXSxpPWVbNF0sYT1lWzFdLG89ZVszXSxzPWVbNV0sbD1yKm8tYSpuO3JldHVybiBsPyhsPTEvbCx0WzBdPW8qbCx0WzFdPS1hKmwsdFsyXT0tbipsLHRbM109cipsLHRbNF09KG4qcy1vKmkpKmwsdFs1XT0oYSppLXIqcykqbCx0KTpudWxsfX07dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3Q9dHx8e30sby5jYWxsKHRoaXMsdCk7Zm9yKHZhciBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmInN0eWxlIiE9PWUmJih0aGlzW2VdPXRbZV0pO3RoaXMuc3R5bGU9bmV3IGEodC5zdHlsZSx0aGlzKSx0aGlzLl9yZWN0PW51bGwsdGhpcy5fX2NsaXBQYXRocz1bXX12YXIgaT1yKDEpLGE9cig1OSksbz1yKDE2KSxzPXIoNjQpO24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHR5cGU6ImRpc3BsYXlhYmxlIixfX2RpcnR5OiEwLGludmlzaWJsZTohMSx6OjAsejI6MCx6bGV2ZWw6MCxkcmFnZ2FibGU6ITEsZHJhZ2dpbmc6ITEsc2lsZW50OiExLGN1bGxpbmc6ITEsY3Vyc29yOiJwb2ludGVyIixyZWN0SG92ZXI6ITEscHJvZ3Jlc3NpdmU6LTEsYmVmb3JlQnJ1c2g6ZnVuY3Rpb24odCl7fSxhZnRlckJydXNoOmZ1bmN0aW9uKHQpe30sYnJ1c2g6ZnVuY3Rpb24odCxlKXt9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe30sY29udGFpbjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlY3RDb250YWluKHQsZSl9LHRyYXZlcnNlOmZ1bmN0aW9uKHQsZSl7dC5jYWxsKGUsdGhpcyl9LHJlY3RDb250YWluOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy50cmFuc2Zvcm1Db29yZFRvTG9jYWwodCxlKSxuPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIG4uY29udGFpbihyWzBdLHJbMV0pfSxkaXJ0eTpmdW5jdGlvbigpe3RoaXMuX19kaXJ0eT0hMCx0aGlzLl9yZWN0PW51bGwsdGhpcy5fX3pyJiZ0aGlzLl9fenIucmVmcmVzaCgpfSxhbmltYXRlU3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5pbWF0ZSgic3R5bGUiLHQpfSxhdHRyS1Y6ZnVuY3Rpb24odCxlKXsic3R5bGUiIT09dD9vLnByb3RvdHlwZS5hdHRyS1YuY2FsbCh0aGlzLHQsZSk6dGhpcy5zdHlsZS5zZXQoZSl9LHNldFN0eWxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUuc2V0KHQsZSksdGhpcy5kaXJ0eSghMSksdGhpc30sdXNlU3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGU9bmV3IGEodCx0aGlzKSx0aGlzLmRpcnR5KCExKSx0aGlzfX0saS5pbmhlcml0cyhuLG8pLGkubWl4aW4obixzKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oKXt2YXIgdD10aGlzLl9fY2FjaGVkSW1nT2JqO3RoaXMub25sb2FkPXRoaXMuX19jYWNoZWRJbWdPYmo9bnVsbDtmb3IodmFyIGU9MDtlPHQucGVuZGluZy5sZW5ndGg7ZSsrKXt2YXIgcj10LnBlbmRpbmdbZV0sbj1yLmNiO24mJm4odGhpcyxyLmNiUGF5bG9hZCksci5ob3N0RWwuZGlydHkoKX10LnBlbmRpbmcubGVuZ3RoPTB9dmFyIGk9cigxOSksYT1uZXcgaSg1MCksbz17fTtvLmZpbmRFeGlzdEltYWdlPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9YS5nZXQodCk7cmV0dXJuIGUmJmUuaW1hZ2V9cmV0dXJuIHR9LG8uY3JlYXRlT3JVcGRhdGVJbWFnZT1mdW5jdGlvbih0LGUscixpLG8pe2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoZSYmZS5fX3pySW1hZ2VTcmM9PT10fHwhcilyZXR1cm4gZTt2YXIgbD1hLmdldCh0KSxoPXtob3N0RWw6cixjYjppLGNiUGF5bG9hZDpvfTtyZXR1cm4gbD8oZT1sLmltYWdlLCFzKGUpJiZsLnBlbmRpbmcucHVzaChoKSk6KCFlJiYoZT1uZXcgSW1hZ2UpLGUub25sb2FkPW4sYS5wdXQodCxlLl9fY2FjaGVkSW1nT2JqPXtpbWFnZTplLHBlbmRpbmc6W2hdfSksZS5zcmM9ZS5fX3pySW1hZ2VTcmM9dCksZX1yZXR1cm4gdH1yZXR1cm4gZX07dmFyIHM9by5pc0ltYWdlUmVhZHk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQud2lkdGgmJnQuaGVpZ2h0fTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7aWYodCl7dC5mb250PXYubWFrZUZvbnQodCk7dmFyIGU9dC50ZXh0QWxpZ247Im1pZGRsZSI9PT1lJiYoZT0iY2VudGVyIiksdC50ZXh0QWxpZ249bnVsbD09ZXx8YltlXT9lOiJsZWZ0Ijt2YXIgcj10LnRleHRWZXJ0aWNhbEFsaWdufHx0LnRleHRCYXNlbGluZTsiY2VudGVyIj09PXImJihyPSJtaWRkbGUiKSx0LnRleHRWZXJ0aWNhbEFsaWduPW51bGw9PXJ8fFNbcl0/cjoidG9wIjt2YXIgbj10LnRleHRQYWRkaW5nO24mJih0LnRleHRQYWRkaW5nPW0ubm9ybWFsaXplQ3NzQXJyYXkodC50ZXh0UGFkZGluZykpfX1mdW5jdGlvbiBpKHQsZSxyLG4saSl7dmFyIGE9ZChlLCJmb250IixuLmZvbnR8fHYuREVGQVVMVF9GT05UKSxvPW4udGV4dFBhZGRpbmcsbD10Ll9fdGV4dENvdGVudEJsb2NrO2wmJiF0Ll9fZGlydHl8fChsPXQuX190ZXh0Q290ZW50QmxvY2s9di5wYXJzZVBsYWluVGV4dChyLGEsbyxuLnRydW5jYXRlKSk7dmFyIGM9bC5vdXRlckhlaWdodCxwPWwubGluZXMsbT1sLmxpbmVIZWlnaHQseD1mKGMsbixpKSx5PXguYmFzZVgsXz14LmJhc2VZLHc9eC50ZXh0QWxpZ24sYj14LnRleHRWZXJ0aWNhbEFsaWduO3MoZSxuLGkseSxfKTt2YXIgUz12LmFkanVzdFRleHRZKF8sYyxiKSxUPXksaz1TLEM9aChuKTtpZihDfHxvKXt2YXIgST12LmdldFdpZHRoKHIsYSksQT1JO28mJihBKz1vWzFdK29bM10pO3ZhciBPPXYuYWRqdXN0VGV4dFgoeSxBLHcpO0MmJnUodCxlLG4sTyxTLEEsYyksbyYmKFQ9Zyh5LHcsbyksays9b1swXSl9ZChlLCJ0ZXh0QWxpZ24iLHd8fCJsZWZ0IiksZChlLCJ0ZXh0QmFzZWxpbmUiLCJtaWRkbGUiKSxkKGUsInNoYWRvd0JsdXIiLG4udGV4dFNoYWRvd0JsdXJ8fDApLGQoZSwic2hhZG93Q29sb3IiLG4udGV4dFNoYWRvd0NvbG9yfHwidHJhbnNwYXJlbnQiKSxkKGUsInNoYWRvd09mZnNldFgiLG4udGV4dFNoYWRvd09mZnNldFh8fDApLGQoZSwic2hhZG93T2Zmc2V0WSIsbi50ZXh0U2hhZG93T2Zmc2V0WXx8MCksays9bS8yO3ZhciBEPW4udGV4dExpbmVXaWR0aCxMPU0obi50ZXh0U3Ryb2tlLEQpLEI9UChuLnRleHRGaWxsKTtMJiYoZChlLCJsaW5lV2lkdGgiLEQpLGQoZSwic3Ryb2tlU3R5bGUiLEwpKSxCJiZkKGUsImZpbGxTdHlsZSIsQik7Zm9yKHZhciBGPTA7RjxwLmxlbmd0aDtGKyspTCYmZS5zdHJva2VUZXh0KHBbRl0sVCxrKSxCJiZlLmZpbGxUZXh0KHBbRl0sVCxrKSxrKz1tfWZ1bmN0aW9uIGEodCxlLHIsbixpKXt2YXIgYT10Ll9fdGV4dENvdGVudEJsb2NrO2EmJiF0Ll9fZGlydHl8fChhPXQuX190ZXh0Q290ZW50QmxvY2s9di5wYXJzZVJpY2hUZXh0KHIsbikpLG8odCxlLGEsbixpKX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7dmFyIGE9ci53aWR0aCxvPXIub3V0ZXJXaWR0aCxjPXIub3V0ZXJIZWlnaHQsZD1uLnRleHRQYWRkaW5nLHA9ZihjLG4saSksZz1wLmJhc2VYLG09cC5iYXNlWSx4PXAudGV4dEFsaWduLHk9cC50ZXh0VmVydGljYWxBbGlnbjtzKGUsbixpLGcsbSk7dmFyIF89di5hZGp1c3RUZXh0WChnLG8seCksdz12LmFkanVzdFRleHRZKG0sYyx5KSxiPV8sUz13O2QmJihiKz1kWzNdLFMrPWRbMF0pO3ZhciBUPWIrYTtoKG4pJiZ1KHQsZSxuLF8sdyxvLGMpO2Zvcih2YXIgTT0wO008ci5saW5lcy5sZW5ndGg7TSsrKXtmb3IodmFyIFAsaz1yLmxpbmVzW01dLEM9ay50b2tlbnMsST1DLmxlbmd0aCxBPWsubGluZUhlaWdodCxPPWsud2lkdGgsRD0wLEw9YixCPVQsRj1JLTE7RDxJJiYoUD1DW0RdLCFQLnRleHRBbGlnbnx8ImxlZnQiPT09UC50ZXh0QWxpZ24pOylsKHQsZSxQLG4sQSxTLEwsImxlZnQiKSxPLT1QLndpZHRoLEwrPVAud2lkdGgsRCsrO2Zvcig7Rj49MCYmKFA9Q1tGXSwicmlnaHQiPT09UC50ZXh0QWxpZ24pOylsKHQsZSxQLG4sQSxTLEIsInJpZ2h0IiksTy09UC53aWR0aCxCLT1QLndpZHRoLEYtLTtmb3IoTCs9KGEtKEwtYiktKFQtQiktTykvMjtEPD1GOylQPUNbRF0sbCh0LGUsUCxuLEEsUyxMK1Aud2lkdGgvMiwiY2VudGVyIiksTCs9UC53aWR0aCxEKys7Uys9QX19ZnVuY3Rpb24gcyh0LGUscixuLGkpe2lmKHImJmUudGV4dFJvdGF0aW9uKXt2YXIgYT1lLnRleHRPcmlnaW47ImNlbnRlciI9PT1hPyhuPXIud2lkdGgvMityLngsaT1yLmhlaWdodC8yK3IueSk6YSYmKG49YVswXStyLngsaT1hWzFdK3IueSksdC50cmFuc2xhdGUobixpKSx0LnJvdGF0ZSgtZS50ZXh0Um90YXRpb24pLHQudHJhbnNsYXRlKC1uLC1pKX19ZnVuY3Rpb24gbCh0LGUscixuLGksYSxvLHMpe3ZhciBsPW4ucmljaFtyLnN0eWxlTmFtZV18fHt9LGM9ci50ZXh0VmVydGljYWxBbGlnbixmPWEraS8yOyJ0b3AiPT09Yz9mPWErci5oZWlnaHQvMjoiYm90dG9tIj09PWMmJihmPWEraS1yLmhlaWdodC8yKSwhci5pc0xpbmVIb2xkZXImJmgobCkmJnUodCxlLGwsInJpZ2h0Ij09PXM/by1yLndpZHRoOiJjZW50ZXIiPT09cz9vLXIud2lkdGgvMjpvLGYtci5oZWlnaHQvMixyLndpZHRoLHIuaGVpZ2h0KTt2YXIgcD1yLnRleHRQYWRkaW5nO3AmJihvPWcobyxzLHApLGYtPXIuaGVpZ2h0LzItcFsyXS1yLnRleHRIZWlnaHQvMiksZChlLCJzaGFkb3dCbHVyIixfKGwudGV4dFNoYWRvd0JsdXIsbi50ZXh0U2hhZG93Qmx1ciwwKSksZChlLCJzaGFkb3dDb2xvciIsbC50ZXh0U2hhZG93Q29sb3J8fG4udGV4dFNoYWRvd0NvbG9yfHwidHJhbnNwYXJlbnQiKSxkKGUsInNoYWRvd09mZnNldFgiLF8obC50ZXh0U2hhZG93T2Zmc2V0WCxuLnRleHRTaGFkb3dPZmZzZXRYLDApKSxkKGUsInNoYWRvd09mZnNldFkiLF8obC50ZXh0U2hhZG93T2Zmc2V0WSxuLnRleHRTaGFkb3dPZmZzZXRZLDApKSwKZChlLCJ0ZXh0QWxpZ24iLHMpLGQoZSwidGV4dEJhc2VsaW5lIiwibWlkZGxlIiksZChlLCJmb250IixyLmZvbnR8fHYuREVGQVVMVF9GT05UKTt2YXIgbT1NKGwudGV4dFN0cm9rZXx8bi50ZXh0U3Ryb2tlLHkpLHg9UChsLnRleHRGaWxsfHxuLnRleHRGaWxsKSx5PXcobC50ZXh0TGluZVdpZHRoLG4udGV4dExpbmVXaWR0aCk7bSYmKGQoZSwibGluZVdpZHRoIix5KSxkKGUsInN0cm9rZVN0eWxlIixtKSxlLnN0cm9rZVRleHQoci50ZXh0LG8sZikpLHgmJihkKGUsImZpbGxTdHlsZSIseCksZS5maWxsVGV4dChyLnRleHQsbyxmKSl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gdC50ZXh0QmFja2dyb3VuZENvbG9yfHx0LnRleHRCb3JkZXJXaWR0aCYmdC50ZXh0Qm9yZGVyQ29sb3J9ZnVuY3Rpb24gdSh0LGUscixuLGksYSxvKXt2YXIgcz1yLnRleHRCYWNrZ3JvdW5kQ29sb3IsbD1yLnRleHRCb3JkZXJXaWR0aCxoPXIudGV4dEJvcmRlckNvbG9yLHU9bS5pc1N0cmluZyhzKTtpZihkKGUsInNoYWRvd0JsdXIiLHIudGV4dEJveFNoYWRvd0JsdXJ8fDApLGQoZSwic2hhZG93Q29sb3IiLHIudGV4dEJveFNoYWRvd0NvbG9yfHwidHJhbnNwYXJlbnQiKSxkKGUsInNoYWRvd09mZnNldFgiLHIudGV4dEJveFNoYWRvd09mZnNldFh8fDApLGQoZSwic2hhZG93T2Zmc2V0WSIsci50ZXh0Qm94U2hhZG93T2Zmc2V0WXx8MCksdXx8bCYmaCl7ZS5iZWdpblBhdGgoKTt2YXIgZj1yLnRleHRCb3JkZXJSYWRpdXM7Zj94LmJ1aWxkUGF0aChlLHt4Om4seTppLHdpZHRoOmEsaGVpZ2h0Om8scjpmfSk6ZS5yZWN0KG4saSxhLG8pLGUuY2xvc2VQYXRoKCl9aWYodSlkKGUsImZpbGxTdHlsZSIscyksZS5maWxsKCk7ZWxzZSBpZihtLmlzT2JqZWN0KHMpKXt2YXIgcD1zLmltYWdlO3A9eS5jcmVhdGVPclVwZGF0ZUltYWdlKHAsbnVsbCx0LGMscykscCYmeS5pc0ltYWdlUmVhZHkocCkmJmUuZHJhd0ltYWdlKHAsbixpLGEsbyl9bCYmaCYmKGQoZSwibGluZVdpZHRoIixsKSxkKGUsInN0cm9rZVN0eWxlIixoKSxlLnN0cm9rZSgpKX1mdW5jdGlvbiBjKHQsZSl7ZS5pbWFnZT10fWZ1bmN0aW9uIGYodCxlLHIpe3ZhciBuPWUueHx8MCxpPWUueXx8MCxhPWUudGV4dEFsaWduLG89ZS50ZXh0VmVydGljYWxBbGlnbjtpZihyKXt2YXIgcz1lLnRleHRQb3NpdGlvbjtpZihzIGluc3RhbmNlb2YgQXJyYXkpbj1yLngrcChzWzBdLHIud2lkdGgpLGk9ci55K3Aoc1sxXSxyLmhlaWdodCk7ZWxzZXt2YXIgbD12LmFkanVzdFRleHRQb3NpdGlvbk9uUmVjdChzLHIsZS50ZXh0RGlzdGFuY2UpO249bC54LGk9bC55LGE9YXx8bC50ZXh0QWxpZ24sbz1vfHxsLnRleHRWZXJ0aWNhbEFsaWdufXZhciBoPWUudGV4dE9mZnNldDtoJiYobis9aFswXSxpKz1oWzFdKX1yZXR1cm57YmFzZVg6bixiYXNlWTppLHRleHRBbGlnbjphLHRleHRWZXJ0aWNhbEFsaWduOm99fWZ1bmN0aW9uIGQodCxlLHIpe3JldHVybiB0W2VdPXQuX19jdXJyZW50VmFsdWVzW2VdPXIsdFtlXX1mdW5jdGlvbiBwKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3QubGFzdEluZGV4T2YoIiUiKT49MD9wYXJzZUZsb2F0KHQpLzEwMCplOnBhcnNlRmxvYXQodCk6dH1mdW5jdGlvbiBnKHQsZSxyKXtyZXR1cm4icmlnaHQiPT09ZT90LXJbMV06ImNlbnRlciI9PT1lP3QrclszXS8yLXJbMV0vMjp0K3JbM119dmFyIHY9cig2KSxtPXIoMSkseD1yKDIzKSx5PXIoMTIpLF89bS5yZXRyaWV2ZTMsdz1tLnJldHJpZXZlMixiPXtsZWZ0OjEscmlnaHQ6MSxjZW50ZXI6MX0sUz17dG9wOjEsYm90dG9tOjEsbWlkZGxlOjF9LFQ9e307VC5ub3JtYWxpemVUZXh0U3R5bGU9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCksbS5lYWNoKHQucmljaCxuKSx0fSxULnJlbmRlclRleHQ9ZnVuY3Rpb24odCxlLHIsbixvKXtuLnJpY2g/YSh0LGUscixuLG8pOmkodCxlLHIsbixvKX07dmFyIE09VC5nZXRTdHJva2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dHx8ZTw9MHx8InRyYW5zcGFyZW50Ij09PXR8fCJub25lIj09PXQ/bnVsbDp0LmltYWdlfHx0LmNvbG9yU3RvcHM/IiMwMDAiOnR9LFA9VC5nZXRGaWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwibm9uZSI9PT10P251bGw6dC5pbWFnZXx8dC5jb2xvclN0b3BzPyIjMDAwIjp0fTtULm5lZWREcmF3VGV4dD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiYodHx8ZS50ZXh0QmFja2dyb3VuZENvbG9yfHxlLnRleHRCb3JkZXJXaWR0aCYmZS50ZXh0Qm9yZGVyQ29sb3J8fGUudGV4dFBhZGRpbmcpfSx0LmV4cG9ydHM9VH0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiBudWxsIT10JiYibm9uZSIhPXR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/VC5saWZ0KHQsLS4xKTp0fWZ1bmN0aW9uIGEodCl7aWYodC5fX2hvdmVyU3RsRGlydHkpe3ZhciBlPXQuc3R5bGUuc3Ryb2tlLHI9dC5zdHlsZS5maWxsLGE9dC5fX2hvdmVyU3RsO2EuZmlsbD1hLmZpbGx8fChuKHIpP2kocik6bnVsbCksYS5zdHJva2U9YS5zdHJva2V8fChuKGUpP2koZSk6bnVsbCk7dmFyIG89e307Zm9yKHZhciBzIGluIGEpbnVsbCE9YVtzXSYmKG9bc109dC5zdHlsZVtzXSk7dC5fX25vcm1hbFN0bD1vLHQuX19ob3ZlclN0bERpcnR5PSExfX1mdW5jdGlvbiBvKHQpe3QuX19pc0hvdmVyfHwoYSh0KSx0LnVzZUhvdmVyTGF5ZXI/dC5fX3pyJiZ0Ll9fenIuYWRkSG92ZXIodCx0Ll9faG92ZXJTdGwpOih0LnN0eWxlLmV4dGVuZEZyb20odC5fX2hvdmVyU3RsKSx0LmRpcnR5KCExKSx0LnoyKz0xKSx0Ll9faXNIb3Zlcj0hMCl9ZnVuY3Rpb24gcyh0KXtpZih0Ll9faXNIb3Zlcil7dmFyIGU9dC5fX25vcm1hbFN0bDt0LnVzZUhvdmVyTGF5ZXI/dC5fX3pyJiZ0Ll9fenIucmVtb3ZlSG92ZXIodCk6KGUmJnQuc2V0U3R5bGUoZSksdC56Mi09MSksdC5fX2lzSG92ZXI9ITF9fWZ1bmN0aW9uIGwodCl7Imdyb3VwIj09PXQudHlwZT90LnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJncm91cCIhPT10LnR5cGUmJm8odCl9KTpvKHQpfWZ1bmN0aW9uIGgodCl7Imdyb3VwIj09PXQudHlwZT90LnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyJncm91cCIhPT10LnR5cGUmJnModCl9KTpzKHQpfWZ1bmN0aW9uIHUodCxlKXt0Ll9faG92ZXJTdGw9dC5ob3ZlclN0eWxlfHxlfHx7fSx0Ll9faG92ZXJTdGxEaXJ0eT0hMCx0Ll9faXNIb3ZlciYmYSh0KX1mdW5jdGlvbiBjKHQpe3RoaXMuX19ob3ZlclNpbGVudE9uVG91Y2gmJnQuenJCeVRvdWNofHwhdGhpcy5fX2lzRW1waGFzaXMmJmwodGhpcyl9ZnVuY3Rpb24gZih0KXt0aGlzLl9faG92ZXJTaWxlbnRPblRvdWNoJiZ0LnpyQnlUb3VjaHx8IXRoaXMuX19pc0VtcGhhc2lzJiZoKHRoaXMpfWZ1bmN0aW9uIGQoKXt0aGlzLl9faXNFbXBoYXNpcz0hMCxsKHRoaXMpfWZ1bmN0aW9uIHAoKXt0aGlzLl9faXNFbXBoYXNpcz0hMSxoKHRoaXMpfWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gZSYmZS5pbmRleE9mKCJpbnNpZGUiKT49MH1mdW5jdGlvbiB2KHQsZSxyKXtpZihyPXJ8fEQsci5pc1JlY3RUZXh0KXt2YXIgbj1lLmdldFNoYWxsb3coInBvc2l0aW9uIil8fChyLmZvck1lcmdlP251bGw6Imluc2lkZSIpOyJvdXRzaWRlIj09PW4mJihuPSJ0b3AiKSx0LnRleHRQb3NpdGlvbj1uLHQudGV4dE9mZnNldD1lLmdldFNoYWxsb3coIm9mZnNldCIpO3ZhciBpPWUuZ2V0U2hhbGxvdygicm90YXRlIik7bnVsbCE9aSYmKGkqPU1hdGguUEkvMTgwKSx0LnRleHRSb3RhdGlvbj1pLHQudGV4dERpc3RhbmNlPXcucmV0cmlldmUyKGUuZ2V0U2hhbGxvdygiZGlzdGFuY2UiKSxyLmZvck1lcmdlP251bGw6NSl9dmFyIGEsbz1lLmVjTW9kZWwscz1vJiZvLm9wdGlvbi50ZXh0U3R5bGUsbD1tKGUpO2lmKGwpe2E9e307Zm9yKHZhciBoIGluIGwpaWYobC5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIHU9ZS5nZXRNb2RlbChbInJpY2giLGhdKTt4KGFbaF09e30sdSxzLHIpfX1yZXR1cm4gdC5yaWNoPWEseCh0LGUscyxyLCEwKSxyLmZvcmNlUmljaCYmIXIudGV4dFN0eWxlJiYoci50ZXh0U3R5bGU9e30pLHR9ZnVuY3Rpb24gbSh0KXtmb3IodmFyIGU7dCYmdCE9PXQuZWNNb2RlbDspe3ZhciByPSh0Lm9wdGlvbnx8RCkucmljaDtpZihyKXtlPWV8fHt9O2Zvcih2YXIgbiBpbiByKXIuaGFzT3duUHJvcGVydHkobikmJihlW25dPTEpfXQ9dC5wYXJlbnRNb2RlbH1yZXR1cm4gZX1mdW5jdGlvbiB4KHQsZSxyLG4saSl7dmFyIGE9bi5mb3JNZXJnZTtyPSFhJiZyfHxEO3ZhciBvPXkoZS5nZXRTaGFsbG93KCJjb2xvciIpKSxzPXkoZS5nZXRTaGFsbG93KCJ0ZXh0Qm9yZGVyQ29sb3IiKSksbD1lLmdldFNoYWxsb3coInRleHRCb3JkZXJXaWR0aCIpO2F8fChudWxsPT1vJiYobz1yLmNvbG9yKSxudWxsPT1zJiYocz1yLnRleHRCb3JkZXJDb2xvciksbnVsbD09bCYmKGw9ci50ZXh0Qm9yZGVyV2lkdGgpLG51bGw9PW8mJm4uY2hlY2tJbnNpZGUmJm4uY2hlY2tJbnNpZGUoZSx0LnRleHRQb3NpdGlvbikmJihvPSIjZmZmIixudWxsPT1zJiYocz1uLmRlZmF1bHRUZXh0Q29sb3IsbnVsbD09bCYmKGw9MikpKSxudWxsPT1vJiYobz1uLmRlZmF1bHRUZXh0Q29sb3IpKSx0LnRleHRGaWxsPW8sdC50ZXh0U3Ryb2tlPXMsdC50ZXh0TGluZVdpZHRoPWwsdC5mb250U3R5bGU9ZS5nZXRTaGFsbG93KCJmb250U3R5bGUiKXx8ci5mb250U3R5bGUsdC5mb250V2VpZ2h0PWUuZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpfHxyLmZvbnRXZWlnaHQsdC5mb250U2l6ZT1lLmdldFNoYWxsb3coImZvbnRTaXplIil8fHIuZm9udFNpemUsdC5mb250RmFtaWx5PWUuZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfHxyLmZvbnRGYW1pbHksdC50ZXh0QWxpZ249ZS5nZXRTaGFsbG93KCJhbGlnbiIpLHQudGV4dFZlcnRpY2FsQWxpZ249ZS5nZXRTaGFsbG93KCJ2ZXJ0aWNhbEFsaWduIil8fGUuZ2V0U2hhbGxvdygiYmFzZWxpbmUiKSx0LnRleHRMaW5lSGVpZ2h0PWUuZ2V0U2hhbGxvdygibGluZUhlaWdodCIpLHQudGV4dFdpZHRoPWUuZ2V0U2hhbGxvdygid2lkdGgiKSx0LnRleHRIZWlnaHQ9ZS5nZXRTaGFsbG93KCJoZWlnaHQiKSx0LnRleHRUYWc9ZS5nZXRTaGFsbG93KCJ0YWciKSxpJiZuLmRpc2FibGVCb3h8fCh0LnRleHRCYWNrZ3JvdW5kQ29sb3I9eShlLmdldFNoYWxsb3coImJhY2tncm91bmRDb2xvciIpLG4pLHQudGV4dFBhZGRpbmc9ZS5nZXRTaGFsbG93KCJwYWRkaW5nIiksdC50ZXh0Qm9yZGVyQ29sb3I9eShlLmdldFNoYWxsb3coImJvcmRlckNvbG9yIiksbiksdC50ZXh0Qm9yZGVyV2lkdGg9ZS5nZXRTaGFsbG93KCJib3JkZXJXaWR0aCIpLHQudGV4dEJvcmRlclJhZGl1cz1lLmdldFNoYWxsb3coImJvcmRlclJhZGl1cyIpLHQudGV4dEJveFNoYWRvd0NvbG9yPWUuZ2V0U2hhbGxvdygic2hhZG93Q29sb3IiKSx0LnRleHRCb3hTaGFkb3dCbHVyPWUuZ2V0U2hhbGxvdygic2hhZG93Qmx1ciIpLHQudGV4dEJveFNoYWRvd09mZnNldFg9ZS5nZXRTaGFsbG93KCJzaGFkb3dPZmZzZXRYIiksdC50ZXh0Qm94U2hhZG93T2Zmc2V0WT1lLmdldFNoYWxsb3coInNoYWRvd09mZnNldFkiKSksdC50ZXh0U2hhZG93Q29sb3I9ZS5nZXRTaGFsbG93KCJ0ZXh0U2hhZG93Q29sb3IiKXx8ci50ZXh0U2hhZG93Q29sb3IsdC50ZXh0U2hhZG93Qmx1cj1lLmdldFNoYWxsb3coInRleHRTaGFkb3dCbHVyIil8fHIudGV4dFNoYWRvd0JsdXIsdC50ZXh0U2hhZG93T2Zmc2V0WD1lLmdldFNoYWxsb3coInRleHRTaGFkb3dPZmZzZXRYIil8fHIudGV4dFNoYWRvd09mZnNldFgsdC50ZXh0U2hhZG93T2Zmc2V0WT1lLmdldFNoYWxsb3coInRleHRTaGFkb3dPZmZzZXRZIil8fHIudGV4dFNoYWRvd09mZnNldFl9ZnVuY3Rpb24geSh0LGUpe3JldHVybiJhdXRvIiE9PXQ/dDplJiZlLmF1dG9Db2xvcj9lLmF1dG9Db2xvcjpudWxsfWZ1bmN0aW9uIF8odCxlLHIsbixpLGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoYT1pLGk9bnVsbCk7dmFyIG89biYmbi5pc0FuaW1hdGlvbkVuYWJsZWQoKTtpZihvKXt2YXIgcz10PyJVcGRhdGUiOiIiLGw9bi5nZXRTaGFsbG93KCJhbmltYXRpb25EdXJhdGlvbiIrcyksaD1uLmdldFNoYWxsb3coImFuaW1hdGlvbkVhc2luZyIrcyksdT1uLmdldFNoYWxsb3coImFuaW1hdGlvbkRlbGF5IitzKTsiZnVuY3Rpb24iPT10eXBlb2YgdSYmKHU9dShpLG4uZ2V0QW5pbWF0aW9uRGVsYXlQYXJhbXM/bi5nZXRBbmltYXRpb25EZWxheVBhcmFtcyhlLGkpOm51bGwpKSwiZnVuY3Rpb24iPT10eXBlb2YgbCYmKGw9bChpKSksbD4wP2UuYW5pbWF0ZVRvKHIsbCx1fHwwLGgsYSwhIWEpOihlLnN0b3BBbmltYXRpb24oKSxlLmF0dHIociksYSYmYSgpKX1lbHNlIGUuc3RvcEFuaW1hdGlvbigpLGUuYXR0cihyKSxhJiZhKCl9dmFyIHc9cigxKSxiPXIoNzYpLFM9cigyKSxUPXIoMjUpLE09cigxMCksUD1yKDMpLGs9cigyNCksQz1yKDQpLEk9TWF0aC5yb3VuZCxBPU1hdGgubWF4LE89TWF0aC5taW4sRD17fSxMPXt9O0wuR3JvdXA9cig1MCksTC5JbWFnZT1yKDU1KSxMLlRleHQ9cig2MCksTC5DaXJjbGU9cig2NyksTC5TZWN0b3I9cig3MyksTC5SaW5nPXIoNzIpLEwuUG9seWdvbj1yKDY5KSxMLlBvbHlsaW5lPXIoNzApLEwuUmVjdD1yKDcxKSxMLkxpbmU9cig2OCksTC5CZXppZXJDdXJ2ZT1yKDY2KSxMLkFyYz1yKDY1KSxMLkNvbXBvdW5kUGF0aD1yKDU0KSxMLkxpbmVhckdyYWRpZW50PXIoNTYpLEwuUmFkaWFsR3JhZGllbnQ9cig1OCksTC5Cb3VuZGluZ1JlY3Q9QyxMLmV4dGVuZFNoYXBlPWZ1bmN0aW9uKHQpe3JldHVybiBTLmV4dGVuZCh0KX0sTC5leHRlbmRQYXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGIuZXh0ZW5kRnJvbVN0cmluZyh0LGUpfSxMLm1ha2VQYXRoPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWIuY3JlYXRlRnJvbVN0cmluZyh0LGUpLGE9aS5nZXRCb3VuZGluZ1JlY3QoKTtpZihyKXt2YXIgbz1hLndpZHRoL2EuaGVpZ2h0O2lmKCJjZW50ZXIiPT09bil7dmFyIHMsbD1yLmhlaWdodCpvO2w8PXIud2lkdGg/cz1yLmhlaWdodDoobD1yLndpZHRoLHM9bC9vKTt2YXIgaD1yLngrci53aWR0aC8yLHU9ci55K3IuaGVpZ2h0LzI7ci54PWgtbC8yLHIueT11LXMvMixyLndpZHRoPWwsci5oZWlnaHQ9c31MLnJlc2l6ZVBhdGgoaSxyKX1yZXR1cm4gaX0sTC5tZXJnZVBhdGg9Yi5tZXJnZVBhdGgsTC5yZXNpemVQYXRoPWZ1bmN0aW9uKHQsZSl7aWYodC5hcHBseVRyYW5zZm9ybSl7dmFyIHI9dC5nZXRCb3VuZGluZ1JlY3QoKSxuPXIuY2FsY3VsYXRlVHJhbnNmb3JtKGUpO3QuYXBwbHlUcmFuc2Zvcm0obil9fSxMLnN1YlBpeGVsT3B0aW1pemVMaW5lPWZ1bmN0aW9uKHQpe3ZhciBlPUwuc3ViUGl4ZWxPcHRpbWl6ZSxyPXQuc2hhcGUsbj10LnN0eWxlLmxpbmVXaWR0aDtyZXR1cm4gSSgyKnIueDEpPT09SSgyKnIueDIpJiYoci54MT1yLngyPWUoci54MSxuLCEwKSksSSgyKnIueTEpPT09SSgyKnIueTIpJiYoci55MT1yLnkyPWUoci55MSxuLCEwKSksdH0sTC5zdWJQaXhlbE9wdGltaXplUmVjdD1mdW5jdGlvbih0KXt2YXIgZT1MLnN1YlBpeGVsT3B0aW1pemUscj10LnNoYXBlLG49dC5zdHlsZS5saW5lV2lkdGgsaT1yLngsYT1yLnksbz1yLndpZHRoLHM9ci5oZWlnaHQ7cmV0dXJuIHIueD1lKHIueCxuLCEwKSxyLnk9ZShyLnksbiwhMCksci53aWR0aD1NYXRoLm1heChlKGkrbyxuLCExKS1yLngsMD09PW8/MDoxKSxyLmhlaWdodD1NYXRoLm1heChlKGErcyxuLCExKS1yLnksMD09PXM/MDoxKSx0fSxMLnN1YlBpeGVsT3B0aW1pemU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPUkoMip0KTtyZXR1cm4obitJKGUpKSUyPT09MD9uLzI6KG4rKHI/MTotMSkpLzJ9LEwuc2V0SG92ZXJTdHlsZT1mdW5jdGlvbih0LGUscil7dC5fX2hvdmVyU2lsZW50T25Ub3VjaD1yJiZyLmhvdmVyU2lsZW50T25Ub3VjaCwiZ3JvdXAiPT09dC50eXBlP3QudHJhdmVyc2UoZnVuY3Rpb24odCl7Imdyb3VwIiE9PXQudHlwZSYmdSh0LGUpfSk6dSh0LGUpLHQub24oIm1vdXNlb3ZlciIsYykub24oIm1vdXNlb3V0IixmKSx0Lm9uKCJlbXBoYXNpcyIsZCkub24oIm5vcm1hbCIscCl9LEwuc2V0VGV4dFN0eWxlPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB2KHQsZSxuKSxyJiZ3LmV4dGVuZCh0LHIpLHQuaG9zdCYmdC5ob3N0LmRpcnR5JiZ0Lmhvc3QuZGlydHkoITEpLHR9LEwuc2V0VGV4dD1mdW5jdGlvbih0LGUscil7dmFyIG49e2lzUmVjdFRleHQ6ITB9O3I9PT0hMT9uLmZvck1lcmdlPSEwOihuLmRlZmF1bHRUZXh0Q29sb3I9bi5hdXRvQ29sb3I9cixuLmNoZWNrSW5zaWRlPWcpLHYodCxlLG4pLHQuaG9zdCYmdC5ob3N0LmRpcnR5JiZ0Lmhvc3QuZGlydHkoITEpfSxMLmdldEZvbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lfHxlLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKTtyZXR1cm5bdC5mb250U3R5bGV8fHImJnIuZ2V0U2hhbGxvdygiZm9udFN0eWxlIil8fCIiLHQuZm9udFdlaWdodHx8ciYmci5nZXRTaGFsbG93KCJmb250V2VpZ2h0Iil8fCIiLCh0LmZvbnRTaXplfHxyJiZyLmdldFNoYWxsb3coImZvbnRTaXplIil8fDEyKSsicHgiLHQuZm9udEZhbWlseXx8ciYmci5nZXRTaGFsbG93KCJmb250RmFtaWx5Iil8fCJzYW5zLXNlcmlmIl0uam9pbigiICIpfSxMLnVwZGF0ZVByb3BzPWZ1bmN0aW9uKHQsZSxyLG4saSl7XyghMCx0LGUscixuLGkpfSxMLmluaXRQcm9wcz1mdW5jdGlvbih0LGUscixuLGkpe18oITEsdCxlLHIsbixpKX0sTC5nZXRUcmFuc2Zvcm09ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9TS5pZGVudGl0eShbXSk7dCYmdCE9PWU7KU0ubXVsKHIsdC5nZXRMb2NhbFRyYW5zZm9ybSgpLHIpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LEwuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlJiYhdy5pc0FycmF5TGlrZShlKSYmKGU9ay5nZXRMb2NhbFRyYW5zZm9ybShlKSksciYmKGU9TS5pbnZlcnQoW10sZSkpLFAuYXBwbHlUcmFuc2Zvcm0oW10sdCxlKX0sTC50cmFuc2Zvcm1EaXJlY3Rpb249ZnVuY3Rpb24odCxlLHIpe3ZhciBuPTA9PT1lWzRdfHwwPT09ZVs1XXx8MD09PWVbMF0/MTpNYXRoLmFicygyKmVbNF0vZVswXSksaT0wPT09ZVs0XXx8MD09PWVbNV18fDA9PT1lWzJdPzE6TWF0aC5hYnMoMiplWzRdL2VbMl0pLGE9WyJsZWZ0Ij09PXQ/LW46InJpZ2h0Ij09PXQ/bjowLCJ0b3AiPT09dD8taToiYm90dG9tIj09PXQ/aTowXTtyZXR1cm4gYT1MLmFwcGx5VHJhbnNmb3JtKGEsZSxyKSxNYXRoLmFicyhhWzBdKT5NYXRoLmFicyhhWzFdKT9hWzBdPjA/InJpZ2h0IjoibGVmdCI6YVsxXT4wPyJib3R0b20iOiJ0b3AifSxMLmdyb3VwVHJhbnNpdGlvbj1mdW5jdGlvbih0LGUscixuKXtmdW5jdGlvbiBpKHQpe3ZhciBlPXt9O3JldHVybiB0LnRyYXZlcnNlKGZ1bmN0aW9uKHQpeyF0LmlzR3JvdXAmJnQuYW5pZCYmKGVbdC5hbmlkXT10KX0pLGV9ZnVuY3Rpb24gYSh0KXt2YXIgZT17cG9zaXRpb246UC5jbG9uZSh0LnBvc2l0aW9uKSxyb3RhdGlvbjp0LnJvdGF0aW9ufTtyZXR1cm4gdC5zaGFwZSYmKGUuc2hhcGU9dy5leHRlbmQoe30sdC5zaGFwZSkpLGV9aWYodCYmZSl7dmFyIG89aSh0KTtlLnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2lmKCF0LmlzR3JvdXAmJnQuYW5pZCl7dmFyIGU9b1t0LmFuaWRdO2lmKGUpe3ZhciBuPWEodCk7dC5hdHRyKGEoZSkpLEwudXBkYXRlUHJvcHModCxuLHIsdC5kYXRhSW5kZXgpfX19KX19LEwuY2xpcFBvaW50c0J5UmVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB3Lm1hcCh0LGZ1bmN0aW9uKHQpe3ZhciByPXRbMF07cj1BKHIsZS54KSxyPU8ocixlLngrZS53aWR0aCk7dmFyIG49dFsxXTtyZXR1cm4gbj1BKG4sZS55KSxuPU8obixlLnkrZS5oZWlnaHQpLFtyLG5dfSl9LEwuY2xpcFJlY3RCeVJlY3Q9ZnVuY3Rpb24odCxlKXt2YXIgcj1BKHQueCxlLngpLG49Tyh0LngrdC53aWR0aCxlLngrZS53aWR0aCksaT1BKHQueSxlLnkpLGE9Tyh0LnkrdC5oZWlnaHQsZS55K2UuaGVpZ2h0KTtpZihuPj1yJiZhPj1pKXJldHVybnt4OnIseTppLHdpZHRoOm4tcixoZWlnaHQ6YS1pfX0sTC5jcmVhdGVJY29uPWZ1bmN0aW9uKHQsZSxyKXtlPXcuZXh0ZW5kKHtyZWN0SG92ZXI6ITB9LGUpO3ZhciBuPWUuc3R5bGU9e3N0cm9rZU5vU2NhbGU6ITB9O2lmKHI9cnx8e3g6LTEseTotMSx3aWR0aDoyLGhlaWdodDoyfSx0KXJldHVybiAwPT09dC5pbmRleE9mKCJpbWFnZTovLyIpPyhuLmltYWdlPXQuc2xpY2UoOCksdy5kZWZhdWx0cyhuLHIpLG5ldyBMLkltYWdlKGUpKTpMLm1ha2VQYXRoKHQucmVwbGFjZSgicGF0aDovLyIsIiIpLGUsciwiY2VudGVyIil9LHQuZXhwb3J0cz1MfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjEwKX12YXIgYT1yKDEpLG89e30scz0xZS00O28ubGluZWFyTWFwPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWVbMV0tZVswXSxhPXJbMV0tclswXTtpZigwPT09aSlyZXR1cm4gMD09PWE/clswXTooclswXStyWzFdKS8yO2lmKG4paWYoaT4wKXtpZih0PD1lWzBdKXJldHVybiByWzBdO2lmKHQ+PWVbMV0pcmV0dXJuIHJbMV19ZWxzZXtpZih0Pj1lWzBdKXJldHVybiByWzBdO2lmKHQ8PWVbMV0pcmV0dXJuIHJbMV19ZWxzZXtpZih0PT09ZVswXSlyZXR1cm4gclswXTtpZih0PT09ZVsxXSlyZXR1cm4gclsxXX1yZXR1cm4odC1lWzBdKS9pKmErclswXX0sby5wYXJzZVBlcmNlbnQ9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSJjZW50ZXIiOmNhc2UibWlkZGxlIjp0PSI1MCUiO2JyZWFrO2Nhc2UibGVmdCI6Y2FzZSJ0b3AiOnQ9IjAlIjticmVhaztjYXNlInJpZ2h0IjpjYXNlImJvdHRvbSI6dD0iMTAwJSJ9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P24odCkubWF0Y2goLyUkLyk/cGFyc2VGbG9hdCh0KS8xMDAqZTpwYXJzZUZsb2F0KHQpOm51bGw9PXQ/TmFOOit0fSxvLnJvdW5kPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbnVsbD09ZSYmKGU9MTApLGU9TWF0aC5taW4oTWF0aC5tYXgoMCxlKSwyMCksdD0oK3QpLnRvRml4ZWQoZSkscj90Oit0fSxvLmFzYz1mdW5jdGlvbih0KXtyZXR1cm4gdC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pLHR9LG8uZ2V0UHJlY2lzaW9uPWZ1bmN0aW9uKHQpe2lmKHQ9K3QsaXNOYU4odCkpcmV0dXJuIDA7Zm9yKHZhciBlPTEscj0wO01hdGgucm91bmQodCplKS9lIT09dDspZSo9MTAscisrO3JldHVybiByfSxvLmdldFByZWNpc2lvblNhZmU9ZnVuY3Rpb24odCl7dmFyIGU9dC50b1N0cmluZygpLHI9ZS5pbmRleE9mKCJlIik7aWYocj4wKXt2YXIgbj0rZS5zbGljZShyKzEpO3JldHVybiBuPDA/LW46MH12YXIgaT1lLmluZGV4T2YoIi4iKTtyZXR1cm4gaTwwPzA6ZS5sZW5ndGgtMS1pfSxvLmdldFBpeGVsUHJlY2lzaW9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5sb2csbj1NYXRoLkxOMTAsaT1NYXRoLmZsb29yKHIodFsxXS10WzBdKS9uKSxhPU1hdGgucm91bmQocihNYXRoLmFicyhlWzFdLWVbMF0pKS9uKSxvPU1hdGgubWluKE1hdGgubWF4KC1pK2EsMCksMjApO3JldHVybiBpc0Zpbml0ZShvKT9vOjIwfSxvLmdldFBlcmNlbnRXaXRoUHJlY2lzaW9uPWZ1bmN0aW9uKHQsZSxyKXtpZighdFtlXSlyZXR1cm4gMDt2YXIgbj1hLnJlZHVjZSh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrKGlzTmFOKGUpPzA6ZSl9LDApO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgaT1NYXRoLnBvdygxMCxyKSxvPWEubWFwKHQsZnVuY3Rpb24odCl7cmV0dXJuKGlzTmFOKHQpPzA6dCkvbippKjEwMH0pLHM9MTAwKmksbD1hLm1hcChvLGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQpfSksaD1hLnJlZHVjZShsLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCksdT1hLm1hcChvLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtbFtlXX0pO2g8czspe2Zvcih2YXIgYz1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksZj1udWxsLGQ9MCxwPXUubGVuZ3RoO2Q8cDsrK2QpdVtkXT5jJiYoYz11W2RdLGY9ZCk7KytsW2ZdLHVbZl09MCwrK2h9cmV0dXJuIGxbZV0vaX0sby5NQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsby5yZW1SYWRpYW49ZnVuY3Rpb24odCl7dmFyIGU9MipNYXRoLlBJO3JldHVybih0JWUrZSklZX0sby5pc1JhZGlhbkFyb3VuZFplcm89ZnVuY3Rpb24odCl7cmV0dXJuIHQ+LXMmJnQ8c307dmFyIGw9L14oPzooXGR7NH0pKD86Wy1cL10oXGR7MSwyfSkoPzpbLVwvXShcZHsxLDJ9KSg/OltUIF0oXGR7MSwyfSkoPzo6KFxkXGQpKD86OihcZFxkKSg/OlsuLF0oXGQrKSk/KT8pPyhafFtcK1wtXVxkXGQ6P1xkXGQpPyk/KT8pPyk/JC87by5nZXRUaW1lem9uZU9mZnNldD1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZXpvbmVPZmZzZXQoKX0sby5wYXJzZURhdGU9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQ7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1sLmV4ZWModCk7aWYoIWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7dmFyIHI9by5nZXRUaW1lem9uZU9mZnNldCgpLG49ZVs4XT8iWiI9PT1lWzhdLnRvVXBwZXJDYXNlKCk/cjo2MCorZVs4XS5zbGljZSgwLDMpK3I6MDtyZXR1cm4gbmV3IERhdGUoK2VbMV0sKyhlWzJdfHwxKS0xLCtlWzNdfHwxLCtlWzRdfHwwLCsoZVs1XXx8MCktbiwrZVs2XXx8MCwrZVs3XXx8MCl9cmV0dXJuIG51bGw9PXQ/bmV3IERhdGUoTmFOKTpuZXcgRGF0ZShNYXRoLnJvdW5kKHQpKX0sby5xdWFudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3coMTAsaSh0KSl9LG8ubmljZT1mdW5jdGlvbih0LGUpe3ZhciByLG49aSh0KSxhPU1hdGgucG93KDEwLG4pLG89dC9hO3JldHVybiByPWU/bzwxLjU/MTpvPDIuNT8yOm88ND8zOm88Nz81OjEwOm88MT8xOm88Mj8yOm88Mz8zOm88NT81OjEwLHQ9ciphLG4+PS0yMD8rdC50b0ZpeGVkKG48MD8tbjowKTp0fSxvLnJlZm9ybUludGVydmFscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQscixuKXtyZXR1cm4gdC5pbnRlcnZhbFtuXTxyLmludGVydmFsW25dfHx0LmludGVydmFsW25dPT09ci5pbnRlcnZhbFtuXSYmKHQuY2xvc2Vbbl0tci5jbG9zZVtuXT09PShuPy0xOjEpfHwhbiYmZSh0LHIsMSkpfXQuc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKHQsciwwKT8tMToxfSk7Zm9yKHZhciByPS0oMS8wKSxuPTEsaT0wO2k8dC5sZW5ndGg7KXtmb3IodmFyIGE9dFtpXS5pbnRlcnZhbCxvPXRbaV0uY2xvc2Uscz0wO3M8MjtzKyspYVtzXTw9ciYmKGFbc109cixvW3NdPXM/MToxLW4pLHI9YVtzXSxuPW9bc107YVswXT09PWFbMV0mJm9bMF0qb1sxXSE9PTE/dC5zcGxpY2UoaSwxKTppKyt9cmV0dXJuIHR9LG8uaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3JldHVybiB0LXBhcnNlRmxvYXQodCk+PTB9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTIpLGk9cig3NSksYT1yKDI0KSxvPXIoNzQpLHM9cigxKSxsPWZ1bmN0aW9uKHQpe2EuY2FsbCh0aGlzLHQpLGkuY2FsbCh0aGlzLHQpLG8uY2FsbCh0aGlzLHQpLHRoaXMuaWQ9dC5pZHx8bigpfTtsLnByb3RvdHlwZT17dHlwZToiZWxlbWVudCIsbmFtZToiIixfX3pyOm51bGwsaWdub3JlOiExLGNsaXBQYXRoOm51bGwsZHJpZnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5kcmFnZ2FibGUpe2Nhc2UiaG9yaXpvbnRhbCI6ZT0wO2JyZWFrO2Nhc2UidmVydGljYWwiOnQ9MH12YXIgcj10aGlzLnRyYW5zZm9ybTtyfHwocj10aGlzLnRyYW5zZm9ybT1bMSwwLDAsMSwwLDBdKSxyWzRdKz10LHJbNV0rPWUsdGhpcy5kZWNvbXBvc2VUcmFuc2Zvcm0oKSx0aGlzLmRpcnR5KCExKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7fSxhZnRlclVwZGF0ZTpmdW5jdGlvbigpe30sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVUcmFuc2Zvcm0oKX0sdHJhdmVyc2U6ZnVuY3Rpb24odCxlKXt9LGF0dHJLVjpmdW5jdGlvbih0LGUpe2lmKCJwb3NpdGlvbiI9PT10fHwic2NhbGUiPT09dHx8Im9yaWdpbiI9PT10KXtpZihlKXt2YXIgcj10aGlzW3RdO3J8fChyPXRoaXNbdF09W10pLHJbMF09ZVswXSxyWzFdPWVbMV19fWVsc2UgdGhpc1t0XT1lfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmU9ITAsdGhpcy5fX3pyJiZ0aGlzLl9fenIucmVmcmVzaCgpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmU9ITEsdGhpcy5fX3pyJiZ0aGlzLl9fenIucmVmcmVzaCgpfSxhdHRyOmZ1bmN0aW9uKHQsZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRoaXMuYXR0cktWKHQsZSk7ZWxzZSBpZihzLmlzT2JqZWN0KHQpKWZvcih2YXIgciBpbiB0KXQuaGFzT3duUHJvcGVydHkocikmJnRoaXMuYXR0cktWKHIsdFtyXSk7cmV0dXJuIHRoaXMuZGlydHkoITEpLHRoaXN9LHNldENsaXBQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX196cjtlJiZ0LmFkZFNlbGZUb1pyKGUpLHRoaXMuY2xpcFBhdGgmJnRoaXMuY2xpcFBhdGghPT10JiZ0aGlzLnJlbW92ZUNsaXBQYXRoKCksdGhpcy5jbGlwUGF0aD10LHQuX196cj1lLHQuX19jbGlwVGFyZ2V0PXRoaXMsdGhpcy5kaXJ0eSghMSl9LHJlbW92ZUNsaXBQYXRoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jbGlwUGF0aDt0JiYodC5fX3pyJiZ0LnJlbW92ZVNlbGZGcm9tWnIodC5fX3pyKSx0Ll9fenI9bnVsbCx0Ll9fY2xpcFRhcmdldD1udWxsLHRoaXMuY2xpcFBhdGg9bnVsbCx0aGlzLmRpcnR5KCExKSl9LGFkZFNlbGZUb1pyOmZ1bmN0aW9uKHQpe3RoaXMuX196cj10O3ZhciBlPXRoaXMuYW5pbWF0b3JzO2lmKGUpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdC5hbmltYXRpb24uYWRkQW5pbWF0b3IoZVtyXSk7dGhpcy5jbGlwUGF0aCYmdGhpcy5jbGlwUGF0aC5hZGRTZWxmVG9acih0KX0scmVtb3ZlU2VsZkZyb21acjpmdW5jdGlvbih0KXt0aGlzLl9fenI9bnVsbDt2YXIgZT10aGlzLmFuaW1hdG9ycztpZihlKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXQuYW5pbWF0aW9uLnJlbW92ZUFuaW1hdG9yKGVbcl0pO3RoaXMuY2xpcFBhdGgmJnRoaXMuY2xpcFBhdGgucmVtb3ZlU2VsZkZyb21acih0KX19LHMubWl4aW4obCxvKSxzLm1peGluKGwsYSkscy5taXhpbihsLGkpLHQuZXhwb3J0cz1sfSxmdW5jdGlvbih0LGUpe3ZhciByPTE7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJihyPU1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxLDEpKTt2YXIgbj17ZGVidWdNb2RlOjAsZGV2aWNlUGl4ZWxSYXRpbzpyfTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgcj0yKk1hdGguUEk7dC5leHBvcnRzPXtub3JtYWxpemVSYWRpYW46ZnVuY3Rpb24odCl7cmV0dXJuIHQlPXIsdDwwJiYodCs9ciksdH19fSxmdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5fbGVuPTB9LG49ci5wcm90b3R5cGU7bi5pbnNlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGkodCk7cmV0dXJuIHRoaXMuaW5zZXJ0RW50cnkoZSksZX0sbi5pbnNlcnRFbnRyeT1mdW5jdGlvbih0KXt0aGlzLmhlYWQ/KHRoaXMudGFpbC5uZXh0PXQsdC5wcmV2PXRoaXMudGFpbCx0Lm5leHQ9bnVsbCx0aGlzLnRhaWw9dCk6dGhpcy5oZWFkPXRoaXMudGFpbD10LHRoaXMuX2xlbisrfSxuLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10LnByZXYscj10Lm5leHQ7ZT9lLm5leHQ9cjp0aGlzLmhlYWQ9cixyP3IucHJldj1lOnRoaXMudGFpbD1lLHQubmV4dD10LnByZXY9bnVsbCx0aGlzLl9sZW4tLX0sbi5sZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVufSxuLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMuX2xlbj0wfTt2YXIgaT1mdW5jdGlvbih0KXt0aGlzLnZhbHVlPXQsdGhpcy5uZXh0LHRoaXMucHJldn0sYT1mdW5jdGlvbih0KXt0aGlzLl9saXN0PW5ldyByLHRoaXMuX21hcD17fSx0aGlzLl9tYXhTaXplPXR8fDEwLHRoaXMuX2xhc3RSZW1vdmVkRW50cnk9bnVsbH0sbz1hLnByb3RvdHlwZTtvLnB1dD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2xpc3Qsbj10aGlzLl9tYXAsYT1udWxsO2lmKG51bGw9PW5bdF0pe3ZhciBvPXIubGVuKCkscz10aGlzLl9sYXN0UmVtb3ZlZEVudHJ5O2lmKG8+PXRoaXMuX21heFNpemUmJm8+MCl7dmFyIGw9ci5oZWFkO3IucmVtb3ZlKGwpLGRlbGV0ZSBuW2wua2V5XSxhPWwudmFsdWUsdGhpcy5fbGFzdFJlbW92ZWRFbnRyeT1sfXM/cy52YWx1ZT1lOnM9bmV3IGkoZSkscy5rZXk9dCxyLmluc2VydEVudHJ5KHMpLG5bdF09c31yZXR1cm4gYX0sby5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwW3RdLHI9dGhpcy5fbGlzdDtpZihudWxsIT1lKXJldHVybiBlIT09ci50YWlsJiYoci5yZW1vdmUoZSksci5pbnNlcnRFbnRyeShlKSksZS52YWx1ZX0sby5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX2xpc3QuY2xlYXIoKSx0aGlzLl9tYXA9e319LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCl7dmFyIGU9e30scj17fSxuPXQubWF0Y2goL0ZpcmVmb3hcLyhbXGQuXSspLyksaT10Lm1hdGNoKC9NU0lFXHMoW1xkLl0rKS8pfHx0Lm1hdGNoKC9UcmlkZW50XC8uKz9ydjooKFtcZC5dKykpLyksYT10Lm1hdGNoKC9FZGdlXC8oW1xkLl0rKS8pLG89L21pY3JvbWVzc2VuZ2VyL2kudGVzdCh0KTtyZXR1cm4gbiYmKHIuZmlyZWZveD0hMCxyLnZlcnNpb249blsxXSksaSYmKHIuaWU9ITAsci52ZXJzaW9uPWlbMV0pLGEmJihyLmVkZ2U9ITAsci52ZXJzaW9uPWFbMV0pLG8mJihyLndlQ2hhdD0hMCkse2Jyb3dzZXI6cixvczplLG5vZGU6ITEsY2FudmFzU3VwcG9ydGVkOiEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCx0b3VjaEV2ZW50c1N1cHBvcnRlZDoib250b3VjaHN0YXJ0ImluIHdpbmRvdyYmIXIuaWUmJiFyLmVkZ2UscG9pbnRlckV2ZW50c1N1cHBvcnRlZDoib25wb2ludGVyZG93biJpbiB3aW5kb3cmJihyLmVkZ2V8fHIuaWUmJnIudmVyc2lvbj49MTEpfX12YXIgbj17fTtuPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yP3ticm93c2VyOnt9LG9zOnt9LG5vZGU6ITAsY2FudmFzU3VwcG9ydGVkOiEwfTpyKG5hdmlnYXRvci51c2VyQWdlbnQpLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKHQpe3RoaXMuY29sb3JTdG9wcz10fHxbXX07ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIsYWRkQ29sb3JTdG9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5jb2xvclN0b3BzLnB1c2goe29mZnNldDp0LGNvbG9yOmV9KX19LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2MyksaT1yKDYyKTt0LmV4cG9ydHM9e2J1aWxkUGF0aDpmdW5jdGlvbih0LGUscil7dmFyIGE9ZS5wb2ludHMsbz1lLnNtb290aDtpZihhJiZhLmxlbmd0aD49Mil7aWYobyYmInNwbGluZSIhPT1vKXt2YXIgcz1pKGEsbyxyLGUuc21vb3RoQ29uc3RyYWludCk7dC5tb3ZlVG8oYVswXVswXSxhWzBdWzFdKTtmb3IodmFyIGw9YS5sZW5ndGgsaD0wO2g8KHI/bDpsLTEpO2grKyl7dmFyIHU9c1syKmhdLGM9c1syKmgrMV0sZj1hWyhoKzEpJWxdO3QuYmV6aWVyQ3VydmVUbyh1WzBdLHVbMV0sY1swXSxjWzFdLGZbMF0sZlsxXSl9fWVsc2V7InNwbGluZSI9PT1vJiYoYT1uKGEscikpLHQubW92ZVRvKGFbMF1bMF0sYVswXVsxXSk7Zm9yKHZhciBoPTEsZD1hLmxlbmd0aDtoPGQ7aCsrKXQubGluZVRvKGFbaF1bMF0sYVtoXVsxXSl9ciYmdC5jbG9zZVBhdGgoKX19fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2J1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG89ZS54LHM9ZS55LGw9ZS53aWR0aCxoPWUuaGVpZ2h0LHU9ZS5yO2w8MCYmKG8rPWwsbD0tbCksaDwwJiYocys9aCxoPS1oKSwibnVtYmVyIj09dHlwZW9mIHU/cj1uPWk9YT11OnUgaW5zdGFuY2VvZiBBcnJheT8xPT09dS5sZW5ndGg/cj1uPWk9YT11WzBdOjI9PT11Lmxlbmd0aD8ocj1pPXVbMF0sbj1hPXVbMV0pOjM9PT11Lmxlbmd0aD8ocj11WzBdLG49YT11WzFdLGk9dVsyXSk6KHI9dVswXSxuPXVbMV0saT11WzJdLGE9dVszXSk6cj1uPWk9YT0wO3ZhciBjO3Irbj5sJiYoYz1yK24scio9bC9jLG4qPWwvYyksaSthPmwmJihjPWkrYSxpKj1sL2MsYSo9bC9jKSxuK2k+aCYmKGM9bitpLG4qPWgvYyxpKj1oL2MpLHIrYT5oJiYoYz1yK2Escio9aC9jLGEqPWgvYyksdC5tb3ZlVG8obytyLHMpLHQubGluZVRvKG8rbC1uLHMpLDAhPT1uJiZ0LnF1YWRyYXRpY0N1cnZlVG8obytsLHMsbytsLHMrbiksdC5saW5lVG8obytsLHMraC1pKSwwIT09aSYmdC5xdWFkcmF0aWNDdXJ2ZVRvKG8rbCxzK2gsbytsLWkscytoKSx0LmxpbmVUbyhvK2EscytoKSwwIT09YSYmdC5xdWFkcmF0aWNDdXJ2ZVRvKG8scytoLG8scytoLWEpLHQubGluZVRvKG8scytyKSwwIT09ciYmdC5xdWFkcmF0aWNDdXJ2ZVRvKG8scyxvK3Iscyl9fX0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0PnN8fHQ8LXN9dmFyIGk9cigxMCksYT1yKDMpLG89aS5pZGVudGl0eSxzPTVlLTUsbD1mdW5jdGlvbih0KXt0PXR8fHt9LHQucG9zaXRpb258fCh0aGlzLnBvc2l0aW9uPVswLDBdKSxudWxsPT10LnJvdGF0aW9uJiYodGhpcy5yb3RhdGlvbj0wKSx0LnNjYWxlfHwodGhpcy5zY2FsZT1bMSwxXSksdGhpcy5vcmlnaW49dGhpcy5vcmlnaW58fG51bGx9LGg9bC5wcm90b3R5cGU7aC50cmFuc2Zvcm09bnVsbCxoLm5lZWRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucm90YXRpb24pfHxuKHRoaXMucG9zaXRpb25bMF0pfHxuKHRoaXMucG9zaXRpb25bMV0pfHxuKHRoaXMuc2NhbGVbMF0tMSl8fG4odGhpcy5zY2FsZVsxXS0xKX0saC51cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudCxlPXQmJnQudHJhbnNmb3JtLHI9dGhpcy5uZWVkTG9jYWxUcmFuc2Zvcm0oKSxuPXRoaXMudHJhbnNmb3JtO3JldHVybiByfHxlPyhuPW58fGkuY3JlYXRlKCkscj90aGlzLmdldExvY2FsVHJhbnNmb3JtKG4pOm8obiksZSYmKHI/aS5tdWwobix0LnRyYW5zZm9ybSxuKTppLmNvcHkobix0LnRyYW5zZm9ybSkpLHRoaXMudHJhbnNmb3JtPW4sdGhpcy5pbnZUcmFuc2Zvcm09dGhpcy5pbnZUcmFuc2Zvcm18fGkuY3JlYXRlKCksdm9pZCBpLmludmVydCh0aGlzLmludlRyYW5zZm9ybSxuKSk6dm9pZChuJiZvKG4pKX0saC5nZXRMb2NhbFRyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm4gbC5nZXRMb2NhbFRyYW5zZm9ybSh0aGlzLHQpfSxoLnNldFRyYW5zZm9ybT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnRyYW5zZm9ybSxyPXQuZHByfHwxO2U/dC5zZXRUcmFuc2Zvcm0ociplWzBdLHIqZVsxXSxyKmVbMl0sciplWzNdLHIqZVs0XSxyKmVbNV0pOnQuc2V0VHJhbnNmb3JtKHIsMCwwLHIsMCwwKX0saC5yZXN0b3JlVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZHByfHwxO3Quc2V0VHJhbnNmb3JtKGUsMCwwLGUsMCwwKX07dmFyIHU9W107aC5kZWNvbXBvc2VUcmFuc2Zvcm09ZnVuY3Rpb24oKXtpZih0aGlzLnRyYW5zZm9ybSl7dmFyIHQ9dGhpcy5wYXJlbnQsZT10aGlzLnRyYW5zZm9ybTt0JiZ0LnRyYW5zZm9ybSYmKGkubXVsKHUsdC5pbnZUcmFuc2Zvcm0sZSksZT11KTt2YXIgcj1lWzBdKmVbMF0rZVsxXSplWzFdLGE9ZVsyXSplWzJdK2VbM10qZVszXSxvPXRoaXMucG9zaXRpb24scz10aGlzLnNjYWxlO24oci0xKSYmKHI9TWF0aC5zcXJ0KHIpKSxuKGEtMSkmJihhPU1hdGguc3FydChhKSksZVswXTwwJiYocj0tciksZVszXTwwJiYoYT0tYSksb1swXT1lWzRdLG9bMV09ZVs1XSxzWzBdPXIsc1sxXT1hLHRoaXMucm90YXRpb249TWF0aC5hdGFuMigtZVsxXS9hLGVbMF0vcil9fSxoLmdldEdsb2JhbFNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50cmFuc2Zvcm07aWYoIXQpcmV0dXJuWzEsMV07dmFyIGU9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLHI9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pO3JldHVybiB0WzBdPDAmJihlPS1lKSx0WzNdPDAmJihyPS1yKSxbZSxyXX0saC50cmFuc2Zvcm1Db29yZFRvTG9jYWw9ZnVuY3Rpb24odCxlKXt2YXIgcj1bdCxlXSxuPXRoaXMuaW52VHJhbnNmb3JtO3JldHVybiBuJiZhLmFwcGx5VHJhbnNmb3JtKHIscixuKSxyfSxoLnRyYW5zZm9ybUNvb3JkVG9HbG9iYWw9ZnVuY3Rpb24odCxlKXt2YXIgcj1bdCxlXSxuPXRoaXMudHJhbnNmb3JtO3JldHVybiBuJiZhLmFwcGx5VHJhbnNmb3JtKHIscixuKSxyfSxsLmdldExvY2FsVHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSl7ZT1lfHxbXSxvKGUpO3ZhciByPXQub3JpZ2luLG49dC5zY2FsZXx8WzEsMV0sYT10LnJvdGF0aW9ufHwwLHM9dC5wb3NpdGlvbnx8WzAsMF07cmV0dXJuIHImJihlWzRdLT1yWzBdLGVbNV0tPXJbMV0pLGkuc2NhbGUoZSxlLG4pLGEmJmkucm90YXRlKGUsZSxhKSxyJiYoZVs0XSs9clswXSxlWzVdKz1yWzFdKSxlWzRdKz1zWzBdLGVbNV0rPXNbMV0sZX0sdC5leHBvcnRzPWx9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0PU1hdGgucm91bmQodCksdDwwPzA6dD4yNTU/MjU1OnR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdD1NYXRoLnJvdW5kKHQpLHQ8MD8wOnQ+MzYwPzM2MDp0fWZ1bmN0aW9uIGEodCl7cmV0dXJuIHQ8MD8wOnQ+MT8xOnR9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbih0Lmxlbmd0aCYmIiUiPT09dC5jaGFyQXQodC5sZW5ndGgtMSk/cGFyc2VGbG9hdCh0KS8xMDAqMjU1OnBhcnNlSW50KHQsMTApKX1mdW5jdGlvbiBzKHQpe3JldHVybiBhKHQubGVuZ3RoJiYiJSI9PT10LmNoYXJBdCh0Lmxlbmd0aC0xKT9wYXJzZUZsb2F0KHQpLzEwMDpwYXJzZUZsb2F0KHQpKX1mdW5jdGlvbiBsKHQsZSxyKXtyZXR1cm4gcjwwP3IrPTE6cj4xJiYoci09MSksNipyPDE/dCsoZS10KSpyKjY6MipyPDE/ZTozKnI8Mj90KyhlLXQpKigyLzMtcikqNjp0fWZ1bmN0aW9uIGgodCxlLHIpe3JldHVybiB0KyhlLXQpKnJ9ZnVuY3Rpb24gdSh0LGUscixuLGkpe3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09bix0WzNdPWksdH1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0fWZ1bmN0aW9uIGYodCxlKXtQJiZjKFAsZSksUD1NLnB1dCh0LFB8fGUuc2xpY2UoKSl9ZnVuY3Rpb24gZCh0LGUpe2lmKHQpe2U9ZXx8W107dmFyIHI9TS5nZXQodCk7aWYocilyZXR1cm4gYyhlLHIpO3QrPSIiO3ZhciBuPXQucmVwbGFjZSgvIC9nLCIiKS50b0xvd2VyQ2FzZSgpO2lmKG4gaW4gVClyZXR1cm4gYyhlLFRbbl0pLGYodCxlKSxlO2lmKCIjIiE9PW4uY2hhckF0KDApKXt2YXIgaT1uLmluZGV4T2YoIigiKSxhPW4uaW5kZXhPZigiKSIpO2lmKGkhPT0tMSYmYSsxPT09bi5sZW5ndGgpe3ZhciBsPW4uc3Vic3RyKDAsaSksaD1uLnN1YnN0cihpKzEsYS0oaSsxKSkuc3BsaXQoIiwiKSxkPTE7c3dpdGNoKGwpe2Nhc2UicmdiYSI6aWYoNCE9PWgubGVuZ3RoKXJldHVybiB2b2lkIHUoZSwwLDAsMCwxKTtkPXMoaC5wb3AoKSk7Y2FzZSJyZ2IiOnJldHVybiAzIT09aC5sZW5ndGg/dm9pZCB1KGUsMCwwLDAsMSk6KHUoZSxvKGhbMF0pLG8oaFsxXSksbyhoWzJdKSxkKSxmKHQsZSksZSk7Y2FzZSJoc2xhIjpyZXR1cm4gNCE9PWgubGVuZ3RoP3ZvaWQgdShlLDAsMCwwLDEpOihoWzNdPXMoaFszXSkscChoLGUpLGYodCxlKSxlKTtjYXNlImhzbCI6cmV0dXJuIDMhPT1oLmxlbmd0aD92b2lkIHUoZSwwLDAsMCwxKToocChoLGUpLGYodCxlKSxlKTtkZWZhdWx0OnJldHVybn19dShlLDAsMCwwLDEpfWVsc2V7aWYoND09PW4ubGVuZ3RoKXt2YXIgZz1wYXJzZUludChuLnN1YnN0cigxKSwxNik7cmV0dXJuIGc+PTAmJmc8PTQwOTU/KHUoZSwoMzg0MCZnKT4+NHwoMzg0MCZnKT4+OCwyNDAmZ3woMjQwJmcpPj40LDE1Jmd8KDE1JmcpPDw0LDEpLGYodCxlKSxlKTp2b2lkIHUoZSwwLDAsMCwxKX1pZig3PT09bi5sZW5ndGgpe3ZhciBnPXBhcnNlSW50KG4uc3Vic3RyKDEpLDE2KTtyZXR1cm4gZz49MCYmZzw9MTY3NzcyMTU/KHUoZSwoMTY3MTE2ODAmZyk+PjE2LCg2NTI4MCZnKT4+OCwyNTUmZywxKSxmKHQsZSksZSk6dm9pZCB1KGUsMCwwLDAsMSl9fX19ZnVuY3Rpb24gcCh0LGUpe3ZhciByPShwYXJzZUZsb2F0KHRbMF0pJTM2MCszNjApJTM2MC8zNjAsaT1zKHRbMV0pLGE9cyh0WzJdKSxvPWE8PS41P2EqKGkrMSk6YStpLWEqaSxoPTIqYS1vO3JldHVybiBlPWV8fFtdLHUoZSxuKDI1NSpsKGgsbyxyKzEvMykpLG4oMjU1KmwoaCxvLHIpKSxuKDI1NSpsKGgsbyxyLTEvMykpLDEpLDQ9PT10Lmxlbmd0aCYmKGVbM109dFszXSksZX1mdW5jdGlvbiBnKHQpe2lmKHQpe3ZhciBlLHIsbj10WzBdLzI1NSxpPXRbMV0vMjU1LGE9dFsyXS8yNTUsbz1NYXRoLm1pbihuLGksYSkscz1NYXRoLm1heChuLGksYSksbD1zLW8saD0ocytvKS8yO2lmKDA9PT1sKWU9MCxyPTA7ZWxzZXtyPWg8LjU/bC8ocytvKTpsLygyLXMtbyk7dmFyIHU9KChzLW4pLzYrbC8yKS9sLGM9KChzLWkpLzYrbC8yKS9sLGY9KChzLWEpLzYrbC8yKS9sO249PT1zP2U9Zi1jOmk9PT1zP2U9MS8zK3UtZjphPT09cyYmKGU9Mi8zK2MtdSksZTwwJiYoZSs9MSksZT4xJiYoZS09MSl9dmFyIGQ9WzM2MCplLHIsaF07cmV0dXJuIG51bGwhPXRbM10mJmQucHVzaCh0WzNdKSxkfX1mdW5jdGlvbiB2KHQsZSl7dmFyIHI9ZCh0KTtpZihyKXtmb3IodmFyIG49MDtuPDM7bisrKWU8MD9yW25dPXJbbl0qKDEtZSl8MDpyW25dPSgyNTUtcltuXSkqZStyW25dfDA7cmV0dXJuIGIociw0PT09ci5sZW5ndGg/InJnYmEiOiJyZ2IiKX19ZnVuY3Rpb24gbSh0LGUpe3ZhciByPWQodCk7aWYocilyZXR1cm4oKDE8PDI0KSsoclswXTw8MTYpKyhyWzFdPDw4KSsgK3JbMl0pLnRvU3RyaW5nKDE2KS5zbGljZSgxKX1mdW5jdGlvbiB4KHQsZSxyKXtpZihlJiZlLmxlbmd0aCYmdD49MCYmdDw9MSl7cj1yfHxbXTt2YXIgaT10KihlLmxlbmd0aC0xKSxvPU1hdGguZmxvb3IoaSkscz1NYXRoLmNlaWwoaSksbD1lW29dLHU9ZVtzXSxjPWktbztyZXR1cm4gclswXT1uKGgobFswXSx1WzBdLGMpKSxyWzFdPW4oaChsWzFdLHVbMV0sYykpLHJbMl09bihoKGxbMl0sdVsyXSxjKSksclszXT1hKGgobFszXSx1WzNdLGMpKSxyfX1mdW5jdGlvbiB5KHQsZSxyKXtpZihlJiZlLmxlbmd0aCYmdD49MCYmdDw9MSl7dmFyIGk9dCooZS5sZW5ndGgtMSksbz1NYXRoLmZsb29yKGkpLHM9TWF0aC5jZWlsKGkpLGw9ZChlW29dKSx1PWQoZVtzXSksYz1pLW8sZj1iKFtuKGgobFswXSx1WzBdLGMpKSxuKGgobFsxXSx1WzFdLGMpKSxuKGgobFsyXSx1WzJdLGMpKSxhKGgobFszXSx1WzNdLGMpKV0sInJnYmEiKTtyZXR1cm4gcj97Y29sb3I6ZixsZWZ0SW5kZXg6byxyaWdodEluZGV4OnMsdmFsdWU6aX06Zn19ZnVuY3Rpb24gXyh0LGUscixuKXtpZih0PWQodCkpcmV0dXJuIHQ9Zyh0KSxudWxsIT1lJiYodFswXT1pKGUpKSxudWxsIT1yJiYodFsxXT1zKHIpKSxudWxsIT1uJiYodFsyXT1zKG4pKSxiKHAodCksInJnYmEiKX1mdW5jdGlvbiB3KHQsZSl7aWYodD1kKHQpLHQmJm51bGwhPWUpcmV0dXJuIHRbM109YShlKSxiKHQsInJnYmEiKX1mdW5jdGlvbiBiKHQsZSl7aWYodCYmdC5sZW5ndGgpe3ZhciByPXRbMF0rIiwiK3RbMV0rIiwiK3RbMl07cmV0dXJuInJnYmEiIT09ZSYmImhzdmEiIT09ZSYmImhzbGEiIT09ZXx8KHIrPSIsIit0WzNdKSxlKyIoIityKyIpIn19dmFyIFM9cigxOSksVD17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX0sTT1uZXcgUygyMCksUD1udWxsO3QuZXhwb3J0cz17cGFyc2U6ZCxsaWZ0OnYsdG9IZXg6bSxmYXN0TWFwVG9Db2xvcjp4LG1hcFRvQ29sb3I6eSxtb2RpZnlIU0w6Xyxtb2RpZnlBbHBoYTp3LHN0cmluZ2lmeTpifX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoOCk7cigyOCkscigyOSksbi5yZWdpc3RlclZpc3VhbChuLnV0aWwuY3Vycnkocig0MCksImxpcXVpZEZpbGwiKSl9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyLG4pe3JldHVybiAwPT09ZT9bW3QrLjUqci9NYXRoLlBJLzIsbi8yXSxbdCsuNSpyL01hdGguUEksbl0sW3Qrci80LG5dXToxPT09ZT9bW3QrLjUqci9NYXRoLlBJLzIqKE1hdGguUEktMiksbl0sW3QrLjUqci9NYXRoLlBJLzIqKE1hdGguUEktMSksbi8yXSxbdCtyLzQsMF1dOjI9PT1lP1tbdCsuNSpyL01hdGguUEkvMiwtbi8yXSxbdCsuNSpyL01hdGguUEksLW5dLFt0K3IvNCwtbl1dOltbdCsuNSpyL01hdGguUEkvMiooTWF0aC5QSS0yKSwtbl0sW3QrLjUqci9NYXRoLlBJLzIqKE1hdGguUEktMSksLW4vMl0sW3Qrci80LDBdXX12YXIgaT1yKDgpO3QuZXhwb3J0cz1pLmdyYXBoaWMuZXh0ZW5kU2hhcGUoe3R5cGU6ImVjLWxpcXVpZC1maWxsIixzaGFwZTp7d2F2ZUxlbmd0aDowLHJhZGl1czowLGN4OjAsY3k6MCx3YXRlckxldmVsOjAsYW1wbGl0dWRlOjAscGhhc2U6MCxpbnZlcnNlOiExfSxzdHlsZTp7ZmlsbDoiIzBmMCJ9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1NYXRoLm1heCgyKk1hdGguY2VpbCgyKmUucmFkaXVzL2Uud2F2ZUxlbmd0aCo0KSw4KTtlLnBoYXNlPDIqLU1hdGguUEk7KWUucGhhc2UrPTIqTWF0aC5QSTtmb3IoO2UucGhhc2U+MDspZS5waGFzZS09MipNYXRoLlBJO3ZhciBpPWUucGhhc2UvTWF0aC5QSS8yKmUud2F2ZUxlbmd0aCxhPWUuY3gtZS5yYWRpdXMraS0yKmUucmFkaXVzO3QubW92ZVRvKGEsZS53YXRlckxldmVsKTtmb3IodmFyIG89MCxzPTA7czxyOysrcyl7dmFyIGw9cyU0LGg9bihzKmUud2F2ZUxlbmd0aC80LGwsZS53YXZlTGVuZ3RoLGUuYW1wbGl0dWRlKTt0LmJlemllckN1cnZlVG8oaFswXVswXSthLC1oWzBdWzFdK2Uud2F0ZXJMZXZlbCxoWzFdWzBdK2EsLWhbMV1bMV0rZS53YXRlckxldmVsLGhbMl1bMF0rYSwtaFsyXVsxXStlLndhdGVyTGV2ZWwpLHM9PT1yLTEmJihvPWhbMl1bMF0pfWUuaW52ZXJzZT8odC5saW5lVG8obythLGUuY3ktZS5yYWRpdXMpLHQubGluZVRvKGEsZS5jeS1lLnJhZGl1cyksdC5saW5lVG8oYSxlLndhdGVyTGV2ZWwpKToodC5saW5lVG8obythLGUuY3krZS5yYWRpdXMpLHQubGluZVRvKGEsZS5jeStlLnJhZGl1cyksdC5saW5lVG8oYSxlLndhdGVyTGV2ZWwpKSx0LmNsb3NlUGF0aCgpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigzMCksaT1yKDgpO2kuZXh0ZW5kU2VyaWVzTW9kZWwoe3R5cGU6InNlcmllcy5saXF1aWRGaWxsIix2aXN1YWxDb2xvckFjY2Vzc1BhdGg6InRleHRTdHlsZS5ub3JtYWwuY29sb3IiLG9wdGlvblVwZGF0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbjt0LmdyaWRTaXplPU1hdGgubWF4KE1hdGguZmxvb3IodC5ncmlkU2l6ZSksNCl9LGdldEluaXRpYWxEYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIHI9bihbInZhbHVlIl0sdC5kYXRhKSxhPW5ldyBpLkxpc3Qocix0aGlzKTtyZXR1cm4gYS5pbml0RGF0YSh0LmRhdGEpLGF9LGRlZmF1bHRPcHRpb246e2NvbG9yOlsiIzI5NEQ5OSIsIiMxNTZBQ0YiLCIjMTU5OEVEIiwiIzQ1QkRGRiJdLGNlbnRlcjpbIjUwJSIsIjUwJSJdLHJhZGl1czoiNTAlIixhbXBsaXR1ZGU6IjglIix3YXZlTGVuZ3RoOiI4MCUiLHBoYXNlOiJhdXRvIixwZXJpb2Q6ImF1dG8iLGRpcmVjdGlvbjoicmlnaHQiLHNoYXBlOiJjaXJjbGUiLHdhdmVBbmltYXRpb246ITAsYW5pbWF0aW9uRWFzaW5nOiJsaW5lYXIiLGFuaW1hdGlvbkVhc2luZ1VwZGF0ZToibGluZWFyIixhbmltYXRpb25EdXJhdGlvbjoyZTMsYW5pbWF0aW9uRHVyYXRpb25VcGRhdGU6MWUzLG91dGxpbmU6e3Nob3c6ITAsYm9yZGVyRGlzdGFuY2U6OCxpdGVtU3R5bGU6e2NvbG9yOiJub25lIixib3JkZXJDb2xvcjoiIzI5NEQ5OSIsYm9yZGVyV2lkdGg6OCxzaGFkb3dCbHVyOjIwLHNoYWRvd0NvbG9yOiJyZ2JhKDAsIDAsIDAsIDAuMjUpIn19LGJhY2tncm91bmRTdHlsZTp7Y29sb3I6IiNFM0Y3RkYifSxpdGVtU3R5bGU6e25vcm1hbDp7b3BhY2l0eTouOTUsc2hhZG93Qmx1cjo1MCxzaGFkb3dDb2xvcjoicmdiYSgwLCAwLCAwLCAwLjQpIn0sZW1waGFzaXM6e29wYWNpdHk6Ljh9fSxsYWJlbDp7bm9ybWFsOntzaG93OiEwLGNvbG9yOiIjMjk0RDk5IixpbnNpZGVDb2xvcjoiI2ZmZiIsZm9udFNpemU6NTAsZm9udFdlaWdodDoiYm9sZCIsYWxpZ246ImNlbnRlciIsYmFzZWxpbmU6Im1pZGRsZSIscG9zaXRpb246Imluc2lkZSJ9fX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoOCksaT1uLm51bWJlcixhPXIoMzkpLG89aS5wYXJzZVBlcmNlbnQscz1yKDI3KTtuLmV4dGVuZENoYXJ0Vmlldyh7dHlwZToibGlxdWlkRmlsbCIscmVuZGVyOmZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBpKHQsZSl7aWYoQSl7aWYoMD09PUEuaW5kZXhPZigicGF0aDovLyIpKXt2YXIgcj1uLmdyYXBoaWMubWFrZVBhdGgoQS5zbGljZSg3KSx7fSksaT1yLmdldEJvdW5kaW5nUmVjdCgpLG89aS53aWR0aCxzPWkuaGVpZ2h0O28+cz8ocyo9Mip0L28sbz0yKnQpOihvKj0yKnQvcyxzPTIqdCk7dmFyIGw9ZT8wOmstby8yLGg9ZT8wOkMtcy8yO3JldHVybiByPW4uZ3JhcGhpYy5tYWtlUGF0aChBLnNsaWNlKDcpLHt9LG5ldyBuLmdyYXBoaWMuQm91bmRpbmdSZWN0KGwsaCxvLHMpKSxlJiYoci5wb3NpdGlvbj1bLW8vMiwtcy8yXSkscn1pZihJKXt2YXIgdT1lPy10WzBdOmstdFswXSxjPWU/LXRbMV06Qy10WzFdO3JldHVybiBhLmNyZWF0ZVN5bWJvbCgicmVjdCIsdSxjLDIqdFswXSwyKnRbMV0pfXZhciB1PWU/LXQ6ay10LGM9ZT8tdDpDLXQ7cmV0dXJuInBpbiI9PT1BP2MrPXQ6ImFycm93Ij09PUEmJihjLT10KSxhLmNyZWF0ZVN5bWJvbChBLHUsYywyKnQsMip0KX1yZXR1cm4gbmV3IG4uZ3JhcGhpYy5DaXJjbGUoe3NoYXBlOntjeDplPzA6ayxjeTplPzA6QyxyOnR9fSl9ZnVuY3Rpb24gbCgpe3ZhciBlPWkoVCk7cmV0dXJuIGUuc3R5bGUuZmlsbD1udWxsLGUuc2V0U3R5bGUodC5nZXRNb2RlbCgib3V0bGluZS5pdGVtU3R5bGUiKS5nZXRJdGVtU3R5bGUoKSksZX1mdW5jdGlvbiBoKCl7dmFyIGU9aShtKTtlLnNldFN0eWxlKHQuZ2V0TW9kZWwoImJhY2tncm91bmRTdHlsZSIpLmdldEl0ZW1TdHlsZSgpKSxlLnN0eWxlLmZpbGw9bnVsbCxlLnoyPTU7dmFyIHI9aShtKTtyLnNldFN0eWxlKHQuZ2V0TW9kZWwoImJhY2tncm91bmRTdHlsZSIpLmdldEl0ZW1TdHlsZSgpKSxyLnN0eWxlLnN0cm9rZT1udWxsO3ZhciBhPW5ldyBuLmdyYXBoaWMuR3JvdXA7cmV0dXJuIGEuYWRkKGUpLGEuYWRkKHIpLGF9ZnVuY3Rpb24gdSh0LGUscil7dmFyIGE9ST9tWzBdOm0sbD1JP21bMV06bSxoPXAuZ2V0SXRlbU1vZGVsKHQpLHU9aC5nZXRNb2RlbCgiaXRlbVN0eWxlIiksYz1oLmdldCgicGhhc2UiKSxmPW8oaC5nZXQoImFtcGxpdHVkZSIpLDIqbCksZD1vKGguZ2V0KCJ3YXZlTGVuZ3RoIiksMiphKSxnPXAuZ2V0KCJ2YWx1ZSIsdCksdj1sLWcqbCoyO2M9cj9yLnNoYXBlLnBoYXNlOiJhdXRvIj09PWM/dCpNYXRoLlBJLzQ6Yzt2YXIgeD11LmdldE1vZGVsKCJub3JtYWwiKS5nZXRJdGVtU3R5bGUoKTt4LmZpbGw9cC5nZXRJdGVtVmlzdWFsKHQsImNvbG9yIik7dmFyIHk9MiphLF89bmV3IHMoe3NoYXBlOnt3YXZlTGVuZ3RoOmQscmFkaXVzOmEsY3g6eSxjeTowLHdhdGVyTGV2ZWw6dixhbXBsaXR1ZGU6ZixwaGFzZTpjLGludmVyc2U6ZX0sc3R5bGU6eCxwb3NpdGlvbjpbayxDXX0pO18uc2hhcGUuX3dhdGVyTGV2ZWw9djt2YXIgdz11LmdldE1vZGVsKCJlbXBoYXNpcyIpLmdldEl0ZW1TdHlsZSgpO3cubGluZVdpZHRoPTAsbi5ncmFwaGljLnNldEhvdmVyU3R5bGUoXyx3KTt2YXIgYj1pKG0sITApO3JldHVybiBiLnNldFN0eWxlKHtmaWxsOiJ3aGl0ZSJ9KSxfLnNldENsaXBQYXRoKGIpLF99ZnVuY3Rpb24gYyh0LGUscil7dmFyIG49cC5nZXRJdGVtTW9kZWwodCksaT1uLmdldCgicGVyaW9kIiksYT1uLmdldCgiZGlyZWN0aW9uIiksbz1wLmdldCgidmFsdWUiLHQpLHM9bi5nZXQoInBoYXNlIik7cz1yP3Iuc2hhcGUucGhhc2U6ImF1dG8iPT09cz90Kk1hdGguUEkvNDpzO3ZhciBsPWZ1bmN0aW9uKGUpe3ZhciByPXAuY291bnQoKTtyZXR1cm4gMD09PXI/ZTplKiguMisoci10KS9yKi44KX0saD0wO2g9ImF1dG8iPT09aT9sKDVlMyk6ImZ1bmN0aW9uIj09dHlwZW9mIGk/aShvLHQpOmk7dmFyIHU9MDsicmlnaHQiPT09YXx8bnVsbD09YT91PU1hdGguUEk6ImxlZnQiPT09YT91PS1NYXRoLlBJOiJub25lIj09PWE/dT0wOmNvbnNvbGUuZXJyb3IoIklsbGVnYWwgZGlyZWN0aW9uIHZhbHVlIGZvciBsaXF1aWQgZmlsbC4iKSwibm9uZSIhPT1hJiZuLmdldCgid2F2ZUFuaW1hdGlvbiIpJiZlLmFuaW1hdGUoInNoYXBlIiwhMCkud2hlbigwLHsKcGhhc2U6c30pLndoZW4oaC8yLHtwaGFzZTp1K3N9KS53aGVuKGgse3BoYXNlOjIqdStzfSkuZHVyaW5nKGZ1bmN0aW9uKCl7QiYmQi5kaXJ0eSghMCl9KS5zdGFydCgpfWZ1bmN0aW9uIGYoZSl7ZnVuY3Rpb24gcigpe3ZhciBlPXQuZ2V0Rm9ybWF0dGVkTGFiZWwoMCwibm9ybWFsIikscj0xMDAqcC5nZXQoInZhbHVlIiwwKSxuPXAuZ2V0TmFtZSgwKXx8dC5uYW1lO3JldHVybiBpc05hTihyKXx8KG49ci50b0ZpeGVkKDApKyIlIiksbnVsbD09ZT9uOmV9dmFyIGE9Zy5nZXRNb2RlbCgibGFiZWwubm9ybWFsIiksbz1hLmdldE1vZGVsKCJ0ZXh0U3R5bGUiKSxzPXt6MjoxMCxzaGFwZTp7eDpELHk6TCx3aWR0aDoyKihJP21bMF06bSksaGVpZ2h0OjIqKEk/bVsxXTptKX0sc3R5bGU6e2ZpbGw6InRyYW5zcGFyZW50Iix0ZXh0OnIoKSx0ZXh0QWxpZ246by5nZXQoImFsaWduIiksdGV4dFZlcnRpY2FsQWxpZ246by5nZXQoImJhc2VsaW5lIil9LHNpbGVudDohMH0sbD1uZXcgbi5ncmFwaGljLlJlY3QocyksaD1hLmdldCgiY29sb3IiKXx8by5nZXQoImNvbG9yIik7bi5ncmFwaGljLnNldFRleHQobC5zdHlsZSxhLGgpO3ZhciB1PW5ldyBuLmdyYXBoaWMuUmVjdChzKSxjPWEuZ2V0KCJpbnNpZGVDb2xvciIpfHxvLmdldCgiaW5zaWRlQ29sb3IiKTtuLmdyYXBoaWMuc2V0VGV4dCh1LnN0eWxlLGEsYyksdS5zdHlsZS50ZXh0RmlsbD1jO3ZhciBmPW5ldyBuLmdyYXBoaWMuR3JvdXA7Zi5hZGQobCksZi5hZGQodSk7dmFyIGQ9aShtLCEwKTtyZXR1cm4gQj1uZXcgbi5ncmFwaGljLkNvbXBvdW5kUGF0aCh7c2hhcGU6e3BhdGhzOmV9LHBvc2l0aW9uOltrLENdfSksQi5zZXRDbGlwUGF0aChkKSx1LnNldENsaXBQYXRoKEIpLGZ9dmFyIGQ9dGhpcy5ncm91cDtkLnJlbW92ZUFsbCgpO3ZhciBwPXQuZ2V0RGF0YSgpLGc9cC5nZXRJdGVtTW9kZWwoMCksdj1nLmdldCgiY2VudGVyIiksbT1nLmdldCgicmFkaXVzIikseD1yLmdldFdpZHRoKCkseT1yLmdldEhlaWdodCgpLF89TWF0aC5taW4oeCx5KSx3PTAsYj0wLFM9dC5nZXQoIm91dGxpbmUuc2hvdyIpO1MmJih3PXQuZ2V0KCJvdXRsaW5lLmJvcmRlckRpc3RhbmNlIiksYj1vKHQuZ2V0KCJvdXRsaW5lLml0ZW1TdHlsZS5ib3JkZXJXaWR0aCIpLF8pKTt2YXIgVCxNLFAsaz1vKHZbMF0seCksQz1vKHZbMV0seSksST0hMSxBPXQuZ2V0KCJzaGFwZSIpO2lmKCJjb250YWluZXIiPT09QT8oST0hMCxUPVt4LzIseS8yXSxNPVtUWzBdLWIvMixUWzFdLWIvMl0sUD1bbyh3LHgpLG8odyx5KV0sbT1bTVswXS1QWzBdLE1bMV0tUFsxXV0pOihUPW8obSxfKS8yLE09VC1iLzIsUD1vKHcsXyksbT1NLVApLFMpe3ZhciBPPWwoKTtPLnN0eWxlLmxpbmVXaWR0aD1iLGQuYWRkKGwoKSl9dmFyIEQ9ST8wOmstbSxMPUk/MDpDLW0sQj1udWxsO2QuYWRkKGgoKSk7dmFyIEY9dGhpcy5fZGF0YSxSPVtdO3AuZGlmZihGKS5hZGQoZnVuY3Rpb24oZSl7dmFyIHI9dShlLCExKSxpPXIuc2hhcGUud2F0ZXJMZXZlbDtyLnNoYXBlLndhdGVyTGV2ZWw9ST9tWzFdOm0sbi5ncmFwaGljLmluaXRQcm9wcyhyLHtzaGFwZTp7d2F0ZXJMZXZlbDppfX0sdCksci56Mj0yLGMoZSxyLG51bGwpLGQuYWRkKHIpLHAuc2V0SXRlbUdyYXBoaWNFbChlLHIpLFIucHVzaChyKX0pLnVwZGF0ZShmdW5jdGlvbihlLHIpe3ZhciBpPUYuZ2V0SXRlbUdyYXBoaWNFbChyKSxhPXUoZSwhMSxpKSxvPU9iamVjdC5hc3NpZ24oe30sYS5zaGFwZSkscz1PYmplY3QuYXNzaWduKHt9LGEuc3R5bGUpO3MuaG9zdD1udWxsLG4uZ3JhcGhpYy51cGRhdGVQcm9wcyhpLHtzaGFwZTpvLHN0eWxlOnN9LHQpLGkucG9zaXRpb249YS5wb3NpdGlvbixpLnNldENsaXBQYXRoKGEuY2xpcFBhdGgpLGMoZSxpLGkpLGQuYWRkKGkpLHAuc2V0SXRlbUdyYXBoaWNFbChlLGkpLFIucHVzaChpKX0pLnJlbW92ZShmdW5jdGlvbih0KXt2YXIgZT1GLmdldEl0ZW1HcmFwaGljRWwodCk7ZC5yZW1vdmUoZSl9KS5leGVjdXRlKCksZC5hZGQoZihSKSksdGhpcy5fZGF0YT1wfSxkaXNwb3NlOmZ1bmN0aW9uKCl7fX0pfSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7Y1tlXT90Lm90aGVyRGltc1tlXT1yOih0LmNvb3JkRGltPWUsdC5jb29yZERpbUluZGV4PXIsdi5zZXQoZSwhMCkpfWZ1bmN0aW9uIG8odCxlLHIpe2lmKHJ8fG51bGwhPWUuZ2V0KHQpKXtmb3IodmFyIG49MDtudWxsIT1lLmdldCh0K24pOyluKys7dCs9bn1yZXR1cm4gZS5zZXQodCwhMCksdH1lPWV8fFtdLHI9cnx8e30sdD0odHx8W10pLnNsaWNlKCk7dmFyIGQ9KHIuZGltc0RlZnx8W10pLnNsaWNlKCkscD1hLmNyZWF0ZUhhc2hNYXAoci5lbmNvZGVEZWYpLGc9YS5jcmVhdGVIYXNoTWFwKCksdj1hLmNyZWF0ZUhhc2hNYXAoKSxtPVtdLHg9ci5kaW1Db3VudDtpZihudWxsPT14KXt2YXIgeT1pKGVbMF0pO3g9TWF0aC5tYXgoYS5pc0FycmF5KHkpJiZ5Lmxlbmd0aHx8MSx0Lmxlbmd0aCxkLmxlbmd0aCkscyh0LGZ1bmN0aW9uKHQpe3ZhciBlPXQuZGltc0RlZjtlJiYoeD1NYXRoLm1heCh4LGUubGVuZ3RoKSl9KX1mb3IodmFyIF89MDtfPHg7XysrKXt2YXIgdz1sKGRbX10pP3tuYW1lOmRbX119OmRbX118fHt9LGI9dy5uYW1lLFM9bVtfXT17b3RoZXJEaW1zOnt9fTtudWxsIT1iJiZudWxsPT1nLmdldChiKSYmKFMubmFtZT1TLnRvb2x0aXBOYW1lPWIsZy5zZXQoYixfKSksbnVsbCE9dy50eXBlJiYoUy50eXBlPXcudHlwZSl9cC5lYWNoKGZ1bmN0aW9uKHQsZSl7dD1wLnNldChlLHUodCkuc2xpY2UoKSkscyh0LGZ1bmN0aW9uKHIsaSl7bChyKSYmKHI9Zy5nZXQocikpLG51bGwhPXImJnI8eCYmKHRbaV09cixuKG1bcl0sZSxpKSl9KX0pO3ZhciBUPTA7cyh0LGZ1bmN0aW9uKHQsZSl7dmFyIHIsdCxpLG87bCh0KT8ocj10LHQ9e30pOihyPXQubmFtZSx0PWEuY2xvbmUodCksaT10LmRpbXNEZWYsbz10Lm90aGVyRGltcyx0Lm5hbWU9dC5jb29yZERpbT10LmNvb3JkRGltSW5kZXg9dC5kaW1zRGVmPXQub3RoZXJEaW1zPW51bGwpO3ZhciBjPXUocC5nZXQocikpO2lmKCFjLmxlbmd0aClmb3IodmFyIGY9MDtmPChpJiZpLmxlbmd0aHx8MSk7ZisrKXtmb3IoO1Q8bS5sZW5ndGgmJm51bGwhPW1bVF0uY29vcmREaW07KVQrKztUPG0ubGVuZ3RoJiZjLnB1c2goVCsrKX1zKGMsZnVuY3Rpb24oZSxhKXt2YXIgcz1tW2VdO24oaChzLHQpLHIsYSksbnVsbD09cy5uYW1lJiZpJiYocy5uYW1lPXMudG9vbHRpcE5hbWU9aVthXSksbyYmaChzLm90aGVyRGltcyxvKX0pfSk7Zm9yKHZhciBNPXIuZXh0cmFQcmVmaXh8fCJ2YWx1ZSIsUD0wO1A8eDtQKyspe3ZhciBTPW1bUF09bVtQXXx8e30saz1TLmNvb3JkRGltO251bGw9PWsmJihTLmNvb3JkRGltPW8oTSx2LHIuZXh0cmFGcm9tWmVybyksUy5jb29yZERpbUluZGV4PTAsUy5pc0V4dHJhQ29vcmQ9ITApLG51bGw9PVMubmFtZSYmKFMubmFtZT1vKFMuY29vcmREaW0sZykpLG51bGw9PVMudHlwZSYmZihlLFApJiYoUy50eXBlPSJvcmRpbmFsIil9cmV0dXJuIG19ZnVuY3Rpb24gaSh0KXtyZXR1cm4gYS5pc0FycmF5KHQpP3Q6YS5pc09iamVjdCh0KT90LnZhbHVlOnR9dmFyIGE9cigxKSxvPXIoMzgpLHM9YS5lYWNoLGw9YS5pc1N0cmluZyxoPWEuZGVmYXVsdHMsdT1vLm5vcm1hbGl6ZVRvQXJyYXksYz17dG9vbHRpcDoxLGxhYmVsOjEsaXRlbU5hbWU6MX0sZj1uLmd1ZXNzT3JkaW5hbD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyl7dmFyIG89aSh0W3JdKTtpZighYS5pc0FycmF5KG8pKXJldHVybiExO3ZhciBvPW9bZV07aWYobnVsbCE9byYmaXNGaW5pdGUobykmJiIiIT09bylyZXR1cm4hMTtpZihsKG8pJiYiLSIhPT1vKXJldHVybiEwfXJldHVybiExfTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3RoaXMucGFyZW50TW9kZWw9ZSx0aGlzLmVjTW9kZWw9cix0aGlzLm9wdGlvbj10fWZ1bmN0aW9uIGkodCxlLHIpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGgmJighZVtuXXx8KHQ9dCYmIm9iamVjdCI9PXR5cGVvZiB0P3RbZVtuXV06bnVsbCxudWxsIT10KSk7bisrKTtyZXR1cm4gbnVsbD09dCYmciYmKHQ9ci5nZXQoZSkpLHR9ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXMuZ2V0KHQsImdldFBhcmVudCIpO3JldHVybiByP3IuY2FsbCh0LGUpOnQucGFyZW50TW9kZWx9dmFyIG89cigxKSxzPXIoMzYpLGw9cigyMCk7bi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm4saW5pdDpudWxsLG1lcmdlT3B0aW9uOmZ1bmN0aW9uKHQpe28ubWVyZ2UodGhpcy5vcHRpb24sdCwhMCl9LGdldDpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3RoaXMub3B0aW9uOmkodGhpcy5vcHRpb24sdGhpcy5wYXJzZVBhdGgodCksIWUmJmEodGhpcyx0KSl9LGdldFNoYWxsb3c6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLm9wdGlvbixuPW51bGw9PXI/cjpyW3RdLGk9IWUmJmEodGhpcyx0KTtyZXR1cm4gbnVsbD09biYmaSYmKG49aS5nZXRTaGFsbG93KHQpKSxufSxnZXRNb2RlbDpmdW5jdGlvbih0LGUpe3ZhciByLG89bnVsbD09dD90aGlzLm9wdGlvbjppKHRoaXMub3B0aW9uLHQ9dGhpcy5wYXJzZVBhdGgodCkpO3JldHVybiBlPWV8fChyPWEodGhpcyx0KSkmJnIuZ2V0TW9kZWwodCksbmV3IG4obyxlLHRoaXMuZWNNb2RlbCl9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5vcHRpb259LHJlc3RvcmVEYXRhOmZ1bmN0aW9uKCl7fSxjbG9uZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIG5ldyB0KG8uY2xvbmUodGhpcy5vcHRpb24pKX0sc2V0UmVhZE9ubHk6ZnVuY3Rpb24odCl7cy5zZXRSZWFkT25seSh0aGlzLHQpfSxwYXJzZVBhdGg6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIuIikpLHR9LGN1c3RvbWl6ZUdldFBhcmVudDpmdW5jdGlvbih0KXtzLnNldCh0aGlzLCJnZXRQYXJlbnQiLHQpfSxpc0FuaW1hdGlvbkVuYWJsZWQ6ZnVuY3Rpb24oKXtpZighbC5ub2RlKXtpZihudWxsIT10aGlzLm9wdGlvbi5hbmltYXRpb24pcmV0dXJuISF0aGlzLm9wdGlvbi5hbmltYXRpb247aWYodGhpcy5wYXJlbnRNb2RlbClyZXR1cm4gdGhpcy5wYXJlbnRNb2RlbC5pc0FuaW1hdGlvbkVuYWJsZWQoKX19fSxzLmVuYWJsZUNsYXNzRXh0ZW5kKG4pO3ZhciBoPW8ubWl4aW47aChuLHIoMzQpKSxoKG4scigzMikpLGgobixyKDM1KSksaChuLHIoMzMpKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpe3QuZXhwb3J0cz17Z2V0QXJlYVN0eWxlOnIoOSkoW1siZmlsbCIsImNvbG9yIl0sWyJzaGFkb3dCbHVyIl0sWyJzaGFkb3dPZmZzZXRYIl0sWyJzaGFkb3dPZmZzZXRZIl0sWyJvcGFjaXR5Il0sWyJzaGFkb3dDb2xvciJdXSl9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig5KShbWyJmaWxsIiwiY29sb3IiXSxbInN0cm9rZSIsImJvcmRlckNvbG9yIl0sWyJsaW5lV2lkdGgiLCJib3JkZXJXaWR0aCJdLFsib3BhY2l0eSJdLFsic2hhZG93Qmx1ciJdLFsic2hhZG93T2Zmc2V0WCJdLFsic2hhZG93T2Zmc2V0WSJdLFsic2hhZG93Q29sb3IiXSxbInRleHRQb3NpdGlvbiJdLFsidGV4dEFsaWduIl1dKTt0LmV4cG9ydHM9e2dldEl0ZW1TdHlsZTpmdW5jdGlvbih0LGUpe3ZhciByPW4uY2FsbCh0aGlzLHQsZSksaT10aGlzLmdldEJvcmRlckxpbmVEYXNoKCk7cmV0dXJuIGkmJihyLmxpbmVEYXNoPWkpLHJ9LGdldEJvcmRlckxpbmVEYXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXQoImJvcmRlclR5cGUiKTtyZXR1cm4ic29saWQiPT09dHx8bnVsbD09dD9udWxsOiJkYXNoZWQiPT09dD9bNSw1XTpbMSwxXX19fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig5KShbWyJsaW5lV2lkdGgiLCJ3aWR0aCJdLFsic3Ryb2tlIiwiY29sb3IiXSxbIm9wYWNpdHkiXSxbInNoYWRvd0JsdXIiXSxbInNoYWRvd09mZnNldFgiXSxbInNoYWRvd09mZnNldFkiXSxbInNoYWRvd0NvbG9yIl1dKTt0LmV4cG9ydHM9e2dldExpbmVTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT1uLmNhbGwodGhpcyx0KSxyPXRoaXMuZ2V0TGluZURhc2goZS5saW5lV2lkdGgpO3JldHVybiByJiYoZS5saW5lRGFzaD1yKSxlfSxnZXRMaW5lRGFzaDpmdW5jdGlvbih0KXtudWxsPT10JiYodD0xKTt2YXIgZT10aGlzLmdldCgidHlwZSIpLHI9TWF0aC5tYXgodCwyKSxuPTQqdDtyZXR1cm4ic29saWQiPT09ZXx8bnVsbD09ZT9udWxsOiJkYXNoZWQiPT09ZT9bbixuXTpbcixyXX19fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig2KSxpPXIoMTQpLGE9WyJ0ZXh0U3R5bGUiLCJjb2xvciJdO3QuZXhwb3J0cz17Z2V0VGV4dENvbG9yOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWNNb2RlbDtyZXR1cm4gdGhpcy5nZXRTaGFsbG93KCJjb2xvciIpfHwoIXQmJmU/ZS5nZXQoYSk6bnVsbCl9LGdldEZvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRGb250KHtmb250U3R5bGU6dGhpcy5nZXRTaGFsbG93KCJmb250U3R5bGUiKSxmb250V2VpZ2h0OnRoaXMuZ2V0U2hhbGxvdygiZm9udFdlaWdodCIpLGZvbnRTaXplOnRoaXMuZ2V0U2hhbGxvdygiZm9udFNpemUiKSxmb250RmFtaWx5OnRoaXMuZ2V0U2hhbGxvdygiZm9udEZhbWlseSIpfSx0aGlzLmVjTW9kZWwpfSxnZXRUZXh0UmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbi5nZXRCb3VuZGluZ1JlY3QodCx0aGlzLmdldEZvbnQoKSx0aGlzLmdldFNoYWxsb3coImFsaWduIiksdGhpcy5nZXRTaGFsbG93KCJ2ZXJ0aWNhbEFsaWduIil8fHRoaXMuZ2V0U2hhbGxvdygiYmFzZWxpbmUiKSx0aGlzLmdldFNoYWxsb3coInBhZGRpbmciKSx0aGlzLmdldFNoYWxsb3coInJpY2giKSx0aGlzLmdldFNoYWxsb3coInRydW5jYXRlVGV4dCIpKX19fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtvLmFzc2VydCgvXlthLXpBLVowLTlfXSsoWy5dW2EtekEtWjAtOV9dKyk/JC8udGVzdCh0KSwnY29tcG9uZW50VHlwZSAiJyt0KyciIGlsbGVnYWwnKX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9by5zbGljZShhcmd1bWVudHMsMik7cmV0dXJuIHRoaXMuc3VwZXJDbGFzcy5wcm90b3R5cGVbZV0uYXBwbHkodCxyKX1mdW5jdGlvbiBhKHQsZSxyKXtyZXR1cm4gdGhpcy5zdXBlckNsYXNzLnByb3RvdHlwZVtlXS5hcHBseSh0LHIpfXZhciBvPXIoMSkscz17fSxsPSIuIixoPSJfX19FQ19fQ09NUE9ORU5UX19DT05UQUlORVJfX18iLHU9IlwwZWNfXDAiO3Muc2V0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFt1K2VdPXJ9LHMuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbdStlXX0scy5oYXNPd249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eSh1K2UpfTt2YXIgYz1zLnBhcnNlQ2xhc3NUeXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXttYWluOiIiLHN1YjoiIn07cmV0dXJuIHQmJih0PXQuc3BsaXQobCksZS5tYWluPXRbMF18fCIiLGUuc3ViPXRbMV18fCIiKSxlfTtzLmVuYWJsZUNsYXNzRXh0ZW5kPWZ1bmN0aW9uKHQsZSl7dC4kY29uc3RydWN0b3I9dCx0LmV4dGVuZD1mdW5jdGlvbih0KXtfX0RFVl9fJiZvLmVhY2goZSxmdW5jdGlvbihlKXt0W2VdfHxjb25zb2xlLndhcm4oIk1ldGhvZCBgIitlKyJgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCIrKHQudHlwZT8iIGluICIrdC50eXBlOiIiKSsiLiIpfSk7dmFyIHI9dGhpcyxuPWZ1bmN0aW9uKCl7dC4kY29uc3RydWN0b3I/dC4kY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gby5leHRlbmQobi5wcm90b3R5cGUsdCksbi5leHRlbmQ9dGhpcy5leHRlbmQsbi5zdXBlckNhbGw9aSxuLnN1cGVyQXBwbHk9YSxvLmluaGVyaXRzKG4sdGhpcyksbi5zdXBlckNsYXNzPXIsbn19LHMuZW5hYmxlQ2xhc3NNYW5hZ2VtZW50PWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1pW3QubWFpbl07cmV0dXJuIGUmJmVbaF18fChlPWlbdC5tYWluXT17fSxlW2hdPSEwKSxlfWU9ZXx8e307dmFyIGk9e307aWYodC5yZWdpc3RlckNsYXNzPWZ1bmN0aW9uKHQsZSl7aWYoZSlpZihuKGUpLGU9YyhlKSxlLnN1Yil7aWYoZS5zdWIhPT1oKXt2YXIgYT1yKGUpO2FbZS5zdWJdPXR9fWVsc2UgX19ERVZfXyYmaVtlLm1haW5dJiZjb25zb2xlLndhcm4oZS5tYWluKyIgZXhpc3RzLiIpLGlbZS5tYWluXT10O3JldHVybiB0fSx0LmdldENsYXNzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1pW3RdO2lmKG4mJm5baF0mJihuPWU/bltlXTpudWxsKSxyJiYhbil0aHJvdyBuZXcgRXJyb3IoZT8iQ29tcG9uZW50ICIrdCsiLiIrKGV8fCIiKSsiIG5vdCBleGlzdHMuIExvYWQgaXQgZmlyc3QuIjp0KyIudHlwZSBzaG91bGQgYmUgc3BlY2lmaWVkLiIpO3JldHVybiBufSx0LmdldENsYXNzZXNCeU1haW5UeXBlPWZ1bmN0aW9uKHQpe3Q9Yyh0KTt2YXIgZT1bXSxyPWlbdC5tYWluXTtyZXR1cm4gciYmcltoXT9vLmVhY2gocixmdW5jdGlvbih0LHIpe3IhPT1oJiZlLnB1c2godCl9KTplLnB1c2gociksZX0sdC5oYXNDbGFzcz1mdW5jdGlvbih0KXtyZXR1cm4gdD1jKHQpLCEhaVt0Lm1haW5dfSx0LmdldEFsbENsYXNzTWFpblR5cGVzPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIG8uZWFjaChpLGZ1bmN0aW9uKGUscil7dC5wdXNoKHIpfSksdH0sdC5oYXNTdWJUeXBlcz1mdW5jdGlvbih0KXt0PWModCk7dmFyIGU9aVt0Lm1haW5dO3JldHVybiBlJiZlW2hdfSx0LnBhcnNlQ2xhc3NUeXBlPWMsZS5yZWdpc3RlcldoZW5FeHRlbmQpe3ZhciBhPXQuZXh0ZW5kO2EmJih0LmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgcj1hLmNhbGwodGhpcyxlKTtyZXR1cm4gdC5yZWdpc3RlckNsYXNzKHIsZS50eXBlKX0pfXJldHVybiB0fSxzLnNldFJlYWRPbmx5PWZ1bmN0aW9uKHQsZSl7fSx0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMSksaT1yKDE1KSxhPXIoNiksbz17fTtvLmFkZENvbW1hcz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odCk/Ii0iOih0PSh0KyIiKS5zcGxpdCgiLiIpLHRbMF0ucmVwbGFjZSgvKFxkezEsM30pKD89KD86XGR7M30pKyg/IVxkKSkvZywiJDEsIikrKHQubGVuZ3RoPjE/Ii4iK3RbMV06IiIpKX0sby50b0NhbWVsQ2FzZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PSh0fHwiIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24odCxlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSksZSYmdCYmKHQ9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpKSx0fSxvLm5vcm1hbGl6ZUNzc0FycmF5PW4ubm9ybWFsaXplQ3NzQXJyYXk7dmFyIHM9by5lbmNvZGVIVE1MPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCkucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzM5OyIpfSxsPVsiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyJdLGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4ieyIrdCsobnVsbD09ZT8iIjplKSsifSJ9O28uZm9ybWF0VHBsPWZ1bmN0aW9uKHQsZSxyKXtuLmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9ZS5sZW5ndGg7aWYoIWkpcmV0dXJuIiI7Zm9yKHZhciBhPWVbMF0uJHZhcnN8fFtdLG89MDtvPGEubGVuZ3RoO28rKyl7dmFyIHU9bFtvXSxjPWgodSwwKTt0PXQucmVwbGFjZShoKHUpLHI/cyhjKTpjKX1mb3IodmFyIGY9MDtmPGk7ZisrKWZvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1lW2ZdW2FbZF1dO3Q9dC5yZXBsYWNlKGgobFtkXSxmKSxyP3MoYyk6Yyl9cmV0dXJuIHR9LG8uZm9ybWF0VHBsU2ltcGxlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbi5lYWNoKGUsZnVuY3Rpb24oZSxuKXt0PXQucmVwbGFjZSgieyIrbisifSIscj9zKGUpOmUpfSksdH0sby5nZXRUb29sdGlwTWFya2VyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ/JzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6NXB4O2JvcmRlci1yYWRpdXM6MTBweDt3aWR0aDo5cHg7aGVpZ2h0OjlweDtiYWNrZ3JvdW5kLWNvbG9yOicrby5lbmNvZGVIVE1MKHQpKyI7IisoZXx8IiIpKyciPjwvc3Bhbj4nOiIifTt2YXIgdT1mdW5jdGlvbih0KXtyZXR1cm4gdDwxMD8iMCIrdDp0fTtvLmZvcm1hdFRpbWU9ZnVuY3Rpb24odCxlLHIpeyJ3ZWVrIiE9PXQmJiJtb250aCIhPT10JiYicXVhcnRlciIhPT10JiYiaGFsZi15ZWFyIiE9PXQmJiJ5ZWFyIiE9PXR8fCh0PSJNTS1kZFxueXl5eSIpO3ZhciBuPWkucGFyc2VEYXRlKGUpLGE9cj8iVVRDIjoiIixvPW5bImdldCIrYSsiRnVsbFllYXIiXSgpLHM9blsiZ2V0IithKyJNb250aCJdKCkrMSxsPW5bImdldCIrYSsiRGF0ZSJdKCksaD1uWyJnZXQiK2ErIkhvdXJzIl0oKSxjPW5bImdldCIrYSsiTWludXRlcyJdKCksZj1uWyJnZXQiK2ErIlNlY29uZHMiXSgpO3JldHVybiB0PXQucmVwbGFjZSgiTU0iLHUocykpLnJlcGxhY2UoIk0iLHMpLnJlcGxhY2UoInl5eXkiLG8pLnJlcGxhY2UoInl5IixvJTEwMCkucmVwbGFjZSgiZGQiLHUobCkpLnJlcGxhY2UoImQiLGwpLnJlcGxhY2UoImhoIix1KGgpKS5yZXBsYWNlKCJoIixoKS5yZXBsYWNlKCJtbSIsdShjKSkucmVwbGFjZSgibSIsYykucmVwbGFjZSgic3MiLHUoZikpLnJlcGxhY2UoInMiLGYpfSxvLmNhcGl0YWxGaXJzdD1mdW5jdGlvbih0KXtyZXR1cm4gdD90LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpOnR9LG8udHJ1bmNhdGVUZXh0PWEudHJ1bmNhdGVUZXh0LG8uZ2V0VGV4dFJlY3Q9YS5nZXRCb3VuZGluZ1JlY3QsdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHQmJnQuaGFzT3duUHJvcGVydHkoZSl9dmFyIGk9cigzNyksYT1yKDE1KSxvPXIoMzEpLHM9cigxKSxsPXMuZWFjaCxoPXMuaXNPYmplY3QsdT17fTt1Lm5vcm1hbGl6ZVRvQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheT90Om51bGw9PXQ/W106W3RdfSx1LmRlZmF1bHRFbXBoYXNpcz1mdW5jdGlvbih0LGUpe2lmKHQpZm9yKHZhciByPXQuZW1waGFzaXM9dC5lbXBoYXNpc3x8e30sbj10Lm5vcm1hbD10Lm5vcm1hbHx8e30saT0wLGE9ZS5sZW5ndGg7aTxhO2krKyl7dmFyIG89ZVtpXTshci5oYXNPd25Qcm9wZXJ0eShvKSYmbi5oYXNPd25Qcm9wZXJ0eShvKSYmKHJbb109bltvXSl9fSx1LlRFWFRfU1RZTEVfT1BUSU9OUz1bImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJyaWNoIiwidGFnIiwiY29sb3IiLCJ0ZXh0Qm9yZGVyQ29sb3IiLCJ0ZXh0Qm9yZGVyV2lkdGgiLCJ3aWR0aCIsImhlaWdodCIsImxpbmVIZWlnaHQiLCJhbGlnbiIsInZlcnRpY2FsQWxpZ24iLCJiYXNlbGluZSIsInNoYWRvd0NvbG9yIiwic2hhZG93Qmx1ciIsInNoYWRvd09mZnNldFgiLCJzaGFkb3dPZmZzZXRZIiwidGV4dFNoYWRvd0NvbG9yIiwidGV4dFNoYWRvd0JsdXIiLCJ0ZXh0U2hhZG93T2Zmc2V0WCIsInRleHRTaGFkb3dPZmZzZXRZIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsImJvcmRlclJhZGl1cyIsInBhZGRpbmciXSx1LmdldERhdGFJdGVtVmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJihudWxsPT10LnZhbHVlP3Q6dC52YWx1ZSl9LHUuaXNEYXRhSXRlbU9wdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gaCh0KSYmISh0IGluc3RhbmNlb2YgQXJyYXkpfSx1LmNvbnZlckRhdGFWYWx1ZT1mdW5jdGlvbih0LGUpe3ZhciByPWUmJmUudHlwZTtyZXR1cm4ib3JkaW5hbCI9PT1yP3Q6KCJ0aW1lIj09PXImJiJudW1iZXIiIT10eXBlb2YgdCYmbnVsbCE9dCYmIi0iIT09dCYmKHQ9K2EucGFyc2VEYXRlKHQpKSxudWxsPT10fHwiIj09PXQ/TmFOOit0KX0sdS5jcmVhdGVEYXRhRm9ybWF0TW9kZWw9ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgbztyZXR1cm4gcy5taXhpbihyLHUuZGF0YUZvcm1hdE1peGluKSxyLnNlcmllc0luZGV4PWUuc2VyaWVzSW5kZXgsci5uYW1lPWUubmFtZXx8IiIsci5tYWluVHlwZT1lLm1haW5UeXBlLHIuc3ViVHlwZT1lLnN1YlR5cGUsci5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LHJ9LHUuZGF0YUZvcm1hdE1peGluPXtnZXREYXRhUGFyYW1zOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5nZXREYXRhKGUpLG49dGhpcy5nZXRSYXdWYWx1ZSh0LGUpLGE9ci5nZXRSYXdJbmRleCh0KSxvPXIuZ2V0TmFtZSh0LCEwKSxzPXIuZ2V0UmF3RGF0YUl0ZW0odCksbD1yLmdldEl0ZW1WaXN1YWwodCwiY29sb3IiKTtyZXR1cm57Y29tcG9uZW50VHlwZTp0aGlzLm1haW5UeXBlLGNvbXBvbmVudFN1YlR5cGU6dGhpcy5zdWJUeXBlLHNlcmllc1R5cGU6InNlcmllcyI9PT10aGlzLm1haW5UeXBlP3RoaXMuc3ViVHlwZTpudWxsLHNlcmllc0luZGV4OnRoaXMuc2VyaWVzSW5kZXgsc2VyaWVzSWQ6dGhpcy5pZCxzZXJpZXNOYW1lOnRoaXMubmFtZSxuYW1lOm8sZGF0YUluZGV4OmEsZGF0YTpzLGRhdGFUeXBlOmUsdmFsdWU6bixjb2xvcjpsLG1hcmtlcjppLmdldFRvb2x0aXBNYXJrZXIobCksJHZhcnM6WyJzZXJpZXNOYW1lIiwibmFtZSIsInZhbHVlIl19fSxnZXRGb3JtYXR0ZWRMYWJlbDpmdW5jdGlvbih0LGUscixuLGEpe2U9ZXx8Im5vcm1hbCI7dmFyIG89dGhpcy5nZXREYXRhKHIpLHM9by5nZXRJdGVtTW9kZWwodCksbD10aGlzLmdldERhdGFQYXJhbXModCxyKTtudWxsIT1uJiZsLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkmJihsLnZhbHVlPWwudmFsdWVbbl0pO3ZhciBoPXMuZ2V0KFthfHwibGFiZWwiLGUsImZvcm1hdHRlciJdKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaD8obC5zdGF0dXM9ZSxoKGwpKToic3RyaW5nIj09dHlwZW9mIGg/aS5mb3JtYXRUcGwoaCxsKTp2b2lkIDB9LGdldFJhd1ZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5nZXREYXRhKGUpLG49ci5nZXRSYXdEYXRhSXRlbSh0KTtpZihudWxsIT1uKXJldHVybiFoKG4pfHxuIGluc3RhbmNlb2YgQXJyYXk/bjpuLnZhbHVlfSxmb3JtYXRUb29sdGlwOnMubm9vcH0sdS5tYXBwaW5nVG9FeGlzdHM9ZnVuY3Rpb24odCxlKXtlPShlfHxbXSkuc2xpY2UoKTt2YXIgcj1zLm1hcCh0fHxbXSxmdW5jdGlvbih0LGUpe3JldHVybntleGlzdDp0fX0pO3JldHVybiBsKGUsZnVuY3Rpb24odCxuKXtpZihoKHQpKXtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylpZighcltpXS5vcHRpb24mJm51bGwhPXQuaWQmJnJbaV0uZXhpc3QuaWQ9PT10LmlkKyIiKXJldHVybiByW2ldLm9wdGlvbj10LHZvaWQoZVtuXT1udWxsKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIGE9cltpXS5leGlzdDtpZighKHJbaV0ub3B0aW9ufHxudWxsIT1hLmlkJiZudWxsIT10LmlkfHxudWxsPT10Lm5hbWV8fHUuaXNJZElubmVyKHQpfHx1LmlzSWRJbm5lcihhKXx8YS5uYW1lIT09dC5uYW1lKyIiKSlyZXR1cm4gcltpXS5vcHRpb249dCx2b2lkKGVbbl09bnVsbCl9fX0pLGwoZSxmdW5jdGlvbih0LGUpe2lmKGgodCkpe2Zvcih2YXIgbj0wO248ci5sZW5ndGg7bisrKXt2YXIgaT1yW25dLmV4aXN0O2lmKCFyW25dLm9wdGlvbiYmIXUuaXNJZElubmVyKGkpJiZudWxsPT10LmlkKXtyW25dLm9wdGlvbj10O2JyZWFrfX1uPj1yLmxlbmd0aCYmci5wdXNoKHtvcHRpb246dH0pfX0pLHJ9LHUubWFrZUlkQW5kTmFtZT1mdW5jdGlvbih0KXt2YXIgZT1zLmNyZWF0ZUhhc2hNYXAoKTtsKHQsZnVuY3Rpb24odCxyKXt2YXIgbj10LmV4aXN0O24mJmUuc2V0KG4uaWQsdCl9KSxsKHQsZnVuY3Rpb24odCxyKXt2YXIgbj10Lm9wdGlvbjtzLmFzc2VydCghbnx8bnVsbD09bi5pZHx8IWUuZ2V0KG4uaWQpfHxlLmdldChuLmlkKT09PXQsImlkIGR1cGxpY2F0ZXM6ICIrKG4mJm4uaWQpKSxuJiZudWxsIT1uLmlkJiZlLnNldChuLmlkLHQpLCF0LmtleUluZm8mJih0LmtleUluZm89e30pfSksbCh0LGZ1bmN0aW9uKHQscil7dmFyIG49dC5leGlzdCxpPXQub3B0aW9uLGE9dC5rZXlJbmZvO2lmKGgoaSkpe2lmKGEubmFtZT1udWxsIT1pLm5hbWU/aS5uYW1lKyIiOm4/bi5uYW1lOiJcMC0iLG4pYS5pZD1uLmlkO2Vsc2UgaWYobnVsbCE9aS5pZClhLmlkPWkuaWQrIiI7ZWxzZXt2YXIgbz0wO2RvIGEuaWQ9IlwwIithLm5hbWUrIlwwIitvKys7d2hpbGUoZS5nZXQoYS5pZCkpfWUuc2V0KGEuaWQsdCl9fSl9LHUuaXNJZElubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQpJiZ0LmlkJiYwPT09KHQuaWQrIiIpLmluZGV4T2YoIlwwX2VjX1wwIil9LHUuY29tcHJlc3NCYXRjaGVzPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LGUscil7Zm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWZvcih2YXIgYT10W25dLnNlcmllc0lkLG89dS5ub3JtYWxpemVUb0FycmF5KHRbbl0uZGF0YUluZGV4KSxzPXImJnJbYV0sbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7dmFyIGM9b1tsXTtzJiZzW2NdP3NbY109bnVsbDooZVthXXx8KGVbYV09e30pKVtjXT0xfX1mdW5jdGlvbiBuKHQsZSl7dmFyIHI9W107Zm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSYmbnVsbCE9dFtpXSlpZihlKXIucHVzaCgraSk7ZWxzZXt2YXIgYT1uKHRbaV0sITApO2EubGVuZ3RoJiZyLnB1c2goe3Nlcmllc0lkOmksZGF0YUluZGV4OmF9KX1yZXR1cm4gcn12YXIgaT17fSxhPXt9O3JldHVybiByKHR8fFtdLGkpLHIoZXx8W10sYSxpKSxbbihpKSxuKGEpXX0sdS5xdWVyeURhdGFJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT1lLmRhdGFJbmRleEluc2lkZT9lLmRhdGFJbmRleEluc2lkZTpudWxsIT1lLmRhdGFJbmRleD9zLmlzQXJyYXkoZS5kYXRhSW5kZXgpP3MubWFwKGUuZGF0YUluZGV4LGZ1bmN0aW9uKGUpe3JldHVybiB0LmluZGV4T2ZSYXdJbmRleChlKX0pOnQuaW5kZXhPZlJhd0luZGV4KGUuZGF0YUluZGV4KTpudWxsIT1lLm5hbWU/cy5pc0FycmF5KGUubmFtZSk/cy5tYXAoZS5uYW1lLGZ1bmN0aW9uKGUpe3JldHVybiB0LmluZGV4T2ZOYW1lKGUpfSk6dC5pbmRleE9mTmFtZShlLm5hbWUpOnZvaWQgMH0sdS5tYWtlR2V0dGVyPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT0iXDBfX2VjX3Byb3BfZ2V0dGVyXyIrdCsrO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdFtlXXx8KHRbZV09e30pfX19KCksdS5wYXJzZUZpbmRlcj1mdW5jdGlvbih0LGUscil7aWYocy5pc1N0cmluZyhlKSl7dmFyIGk9e307aVtlKyJJbmRleCJdPTAsZT1pfXZhciBhPXImJnIuZGVmYXVsdE1haW5UeXBlOyFhfHxuKGUsYSsiSW5kZXgiKXx8bihlLGErIklkIil8fG4oZSxhKyJOYW1lIil8fChlW2ErIkluZGV4Il09MCk7dmFyIG89e307cmV0dXJuIGwoZSxmdW5jdGlvbihuLGkpe3ZhciBuPWVbaV07aWYoImRhdGFJbmRleCI9PT1pfHwiZGF0YUluZGV4SW5zaWRlIj09PWkpcmV0dXJuIHZvaWQob1tpXT1uKTt2YXIgYT1pLm1hdGNoKC9eKFx3KykoSW5kZXh8SWR8TmFtZSkkLyl8fFtdLGw9YVsxXSxoPShhWzJdfHwiIikudG9Mb3dlckNhc2UoKTtpZighKCFsfHwhaHx8bnVsbD09bnx8ImluZGV4Ij09PWgmJiJub25lIj09PW58fHImJnIuaW5jbHVkZU1haW5UeXBlcyYmcy5pbmRleE9mKHIuaW5jbHVkZU1haW5UeXBlcyxsKTwwKSl7dmFyIHU9e21haW5UeXBlOmx9OyJpbmRleCI9PT1oJiYiYWxsIj09PW58fCh1W2hdPW4pO3ZhciBjPXQucXVlcnlDb21wb25lbnRzKHUpO29bbCsiTW9kZWxzIl09YyxvW2wrIk1vZGVsIl09Y1swXX19KSxvfSx1LmRhdGFEaW1Ub0Nvb3JkRGltPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5kaW1lbnNpb25zO2U9dC5nZXREaW1lbnNpb24oZSk7Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBpPXQuZ2V0RGltZW5zaW9uSW5mbyhyW25dKTtpZihpLm5hbWU9PT1lKXJldHVybiBpLmNvb3JkRGltfX0sdS5jb29yZERpbVRvRGF0YURpbT1mdW5jdGlvbih0LGUpe3ZhciByPVtdO3JldHVybiBsKHQuZGltZW5zaW9ucyxmdW5jdGlvbihuKXt2YXIgaT10LmdldERpbWVuc2lvbkluZm8obik7aS5jb29yZERpbT09PWUmJihyW2kuY29vcmREaW1JbmRleF09aS5uYW1lKX0pLHJ9LHUub3RoZXJEaW1Ub0RhdGFEaW09ZnVuY3Rpb24odCxlKXt2YXIgcj1bXTtyZXR1cm4gbCh0LmRpbWVuc2lvbnMsZnVuY3Rpb24obil7dmFyIGk9dC5nZXREaW1lbnNpb25JbmZvKG4pLGE9aS5vdGhlckRpbXMsbz1hW2VdO251bGwhPW8mJm8hPT0hMSYmKHJbb109aS5uYW1lKX0pLHJ9LHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMTQpLGk9cig0KSxhPW4uZXh0ZW5kU2hhcGUoe3R5cGU6InRyaWFuZ2xlIixzaGFwZTp7Y3g6MCxjeTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciByPWUuY3gsbj1lLmN5LGk9ZS53aWR0aC8yLGE9ZS5oZWlnaHQvMjt0Lm1vdmVUbyhyLG4tYSksdC5saW5lVG8ocitpLG4rYSksdC5saW5lVG8oci1pLG4rYSksdC5jbG9zZVBhdGgoKX19KSxvPW4uZXh0ZW5kU2hhcGUoe3R5cGU6ImRpYW1vbmQiLHNoYXBlOntjeDowLGN5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5jeCxuPWUuY3ksaT1lLndpZHRoLzIsYT1lLmhlaWdodC8yO3QubW92ZVRvKHIsbi1hKSx0LmxpbmVUbyhyK2ksbiksdC5saW5lVG8ocixuK2EpLHQubGluZVRvKHItaSxuKSx0LmNsb3NlUGF0aCgpfX0pLHM9bi5leHRlbmRTaGFwZSh7dHlwZToicGluIixzaGFwZTp7eDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLngsbj1lLnksaT1lLndpZHRoLzUqMyxhPU1hdGgubWF4KGksZS5oZWlnaHQpLG89aS8yLHM9bypvLyhhLW8pLGw9bi1hK28rcyxoPU1hdGguYXNpbihzL28pLHU9TWF0aC5jb3MoaCkqbyxjPU1hdGguc2luKGgpLGY9TWF0aC5jb3MoaCk7dC5hcmMocixsLG8sTWF0aC5QSS1oLDIqTWF0aC5QSStoKTt2YXIgZD0uNipvLHA9Ljcqbzt0LmJlemllckN1cnZlVG8ocit1LWMqZCxsK3MrZipkLHIsbi1wLHIsbiksdC5iZXppZXJDdXJ2ZVRvKHIsbi1wLHItdStjKmQsbCtzK2YqZCxyLXUsbCtzKSx0LmNsb3NlUGF0aCgpfX0pLGw9bi5leHRlbmRTaGFwZSh7dHlwZToiYXJyb3ciLHNoYXBlOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciByPWUuaGVpZ2h0LG49ZS53aWR0aCxpPWUueCxhPWUueSxvPW4vMyoyO3QubW92ZVRvKGksYSksdC5saW5lVG8oaStvLGErciksdC5saW5lVG8oaSxhK3IvNCozKSx0LmxpbmVUbyhpLW8sYStyKSx0LmxpbmVUbyhpLGEpLHQuY2xvc2VQYXRoKCl9fSksaD17bGluZTpuLkxpbmUscmVjdDpuLlJlY3Qscm91bmRSZWN0Om4uUmVjdCxzcXVhcmU6bi5SZWN0LGNpcmNsZTpuLkNpcmNsZSxkaWFtb25kOm8scGluOnMsYXJyb3c6bCx0cmlhbmdsZTphfSx1PXtsaW5lOmZ1bmN0aW9uKHQsZSxyLG4saSl7aS54MT10LGkueTE9ZStuLzIsaS54Mj10K3IsaS55Mj1lK24vMn0scmVjdDpmdW5jdGlvbih0LGUscixuLGkpe2kueD10LGkueT1lLGkud2lkdGg9cixpLmhlaWdodD1ufSxyb3VuZFJlY3Q6ZnVuY3Rpb24odCxlLHIsbixpKXtpLng9dCxpLnk9ZSxpLndpZHRoPXIsaS5oZWlnaHQ9bixpLnI9TWF0aC5taW4ocixuKS80fSxzcXVhcmU6ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT1NYXRoLm1pbihyLG4pO2kueD10LGkueT1lLGkud2lkdGg9YSxpLmhlaWdodD1hfSxjaXJjbGU6ZnVuY3Rpb24odCxlLHIsbixpKXtpLmN4PXQrci8yLGkuY3k9ZStuLzIsaS5yPU1hdGgubWluKHIsbikvMn0sZGlhbW9uZDpmdW5jdGlvbih0LGUscixuLGkpe2kuY3g9dCtyLzIsaS5jeT1lK24vMixpLndpZHRoPXIsaS5oZWlnaHQ9bn0scGluOmZ1bmN0aW9uKHQsZSxyLG4saSl7aS54PXQrci8yLGkueT1lK24vMixpLndpZHRoPXIsaS5oZWlnaHQ9bn0sYXJyb3c6ZnVuY3Rpb24odCxlLHIsbixpKXtpLng9dCtyLzIsaS55PWUrbi8yLGkud2lkdGg9cixpLmhlaWdodD1ufSx0cmlhbmdsZTpmdW5jdGlvbih0LGUscixuLGkpe2kuY3g9dCtyLzIsaS5jeT1lK24vMixpLndpZHRoPXIsaS5oZWlnaHQ9bn19LGM9e307Zm9yKHZhciBmIGluIGgpaC5oYXNPd25Qcm9wZXJ0eShmKSYmKGNbZl09bmV3IGhbZl0pO3ZhciBkPW4uZXh0ZW5kU2hhcGUoe3R5cGU6InN5bWJvbCIsc2hhcGU6e3N5bWJvbFR5cGU6IiIseDowLHk6MCx3aWR0aDowLGhlaWdodDowfSxiZWZvcmVCcnVzaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3R5bGUsZT10aGlzLnNoYXBlOyJwaW4iPT09ZS5zeW1ib2xUeXBlJiYiaW5zaWRlIj09PXQudGV4dFBvc2l0aW9uJiYodC50ZXh0UG9zaXRpb249WyI1MCUiLCI0MCUiXSx0LnRleHRBbGlnbj0iY2VudGVyIix0LnRleHRWZXJ0aWNhbEFsaWduPSJtaWRkbGUiKX0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lLnN5bWJvbFR5cGUsaT1jW25dOyJub25lIiE9PWUuc3ltYm9sVHlwZSYmKGl8fChuPSJyZWN0IixpPWNbbl0pLHVbbl0oZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0LGkuc2hhcGUpLGkuYnVpbGRQYXRoKHQsaS5zaGFwZSxyKSl9fSkscD1mdW5jdGlvbih0KXtpZigiaW1hZ2UiIT09dGhpcy50eXBlKXt2YXIgZT10aGlzLnN0eWxlLHI9dGhpcy5zaGFwZTtyJiYibGluZSI9PT1yLnN5bWJvbFR5cGU/ZS5zdHJva2U9dDp0aGlzLl9faXNFbXB0eUJydXNoPyhlLnN0cm9rZT10LGUuZmlsbD0iI2ZmZiIpOihlLmZpbGwmJihlLmZpbGw9dCksZS5zdHJva2UmJihlLnN0cm9rZT10KSksdGhpcy5kaXJ0eSghMSl9fSxnPXtjcmVhdGVTeW1ib2w6ZnVuY3Rpb24odCxlLHIsYSxvLHMpe3ZhciBsPTA9PT10LmluZGV4T2YoImVtcHR5Iik7bCYmKHQ9dC5zdWJzdHIoNSwxKS50b0xvd2VyQ2FzZSgpK3Quc3Vic3RyKDYpKTt2YXIgaDtyZXR1cm4gaD0wPT09dC5pbmRleE9mKCJpbWFnZTovLyIpP25ldyBuLkltYWdlKHtzdHlsZTp7aW1hZ2U6dC5zbGljZSg4KSx4OmUseTpyLHdpZHRoOmEsaGVpZ2h0Om99fSk6MD09PXQuaW5kZXhPZigicGF0aDovLyIpP24ubWFrZVBhdGgodC5zbGljZSg3KSx7fSxuZXcgaShlLHIsYSxvKSk6bmV3IGQoe3NoYXBlOntzeW1ib2xUeXBlOnQseDplLHk6cix3aWR0aDphLGhlaWdodDpvfX0pLGguX19pc0VtcHR5QnJ1c2g9bCxoLnNldENvbG9yPXAsaC5zZXRDb2xvcihzKSxofX07dC5leHBvcnRzPWd9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9e307ZS5lYWNoUmF3U2VyaWVzQnlUeXBlKHQsZnVuY3Rpb24odCl7dmFyIG49dC5nZXRSYXdEYXRhKCksaT17fTtpZighZS5pc1Nlcmllc0ZpbHRlcmVkKHQpKXt2YXIgYT10LmdldERhdGEoKTthLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9YS5nZXRSYXdJbmRleCh0KTtpW2VdPXR9KSxuLmVhY2goZnVuY3Rpb24oZSl7dmFyIG89aVtlXSxzPW51bGwhPW8mJmEuZ2V0SXRlbVZpc3VhbChvLCJjb2xvciIsITApO2lmKHMpbi5zZXRJdGVtVmlzdWFsKGUsImNvbG9yIixzKTtlbHNle3ZhciBsPW4uZ2V0SXRlbU1vZGVsKGUpLGg9bC5nZXQoIml0ZW1TdHlsZS5ub3JtYWwuY29sb3IiKXx8dC5nZXRDb2xvckZyb21QYWxldHRlKG4uZ2V0TmFtZShlKSxyKTtuLnNldEl0ZW1WaXN1YWwoZSwiY29sb3IiLGgpLG51bGwhPW8mJmEuc2V0SXRlbVZpc3VhbChvLCJjb2xvciIsaCl9fSl9fSl9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0W2VdfWZ1bmN0aW9uIGkodCxlLHIpe3RbZV09cn1mdW5jdGlvbiBhKHQsZSxyKXtyZXR1cm4oZS10KSpyK3R9ZnVuY3Rpb24gbyh0LGUscil7cmV0dXJuIHI+LjU/ZTp0fWZ1bmN0aW9uIHModCxlLHIsbixpKXt2YXIgbz10Lmxlbmd0aDtpZigxPT1pKWZvcih2YXIgcz0wO3M8bztzKyspbltzXT1hKHRbc10sZVtzXSxyKTtlbHNlIGZvcih2YXIgbD1vJiZ0WzBdLmxlbmd0aCxzPTA7czxvO3MrKylmb3IodmFyIGg9MDtoPGw7aCsrKW5bc11baF09YSh0W3NdW2hdLGVbc11baF0scil9ZnVuY3Rpb24gbCh0LGUscil7dmFyIG49dC5sZW5ndGgsaT1lLmxlbmd0aDtpZihuIT09aSl7dmFyIGE9bj5pO2lmKGEpdC5sZW5ndGg9aTtlbHNlIGZvcih2YXIgbz1uO288aTtvKyspdC5wdXNoKDE9PT1yP2Vbb106Xy5jYWxsKGVbb10pKX1mb3IodmFyIHM9dFswXSYmdFswXS5sZW5ndGgsbz0wO288dC5sZW5ndGg7bysrKWlmKDE9PT1yKWlzTmFOKHRbb10pJiYodFtvXT1lW29dKTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspaXNOYU4odFtvXVtsXSkmJih0W29dW2xdPWVbb11bbF0pfWZ1bmN0aW9uIGgodCxlLHIpe2lmKHQ9PT1lKXJldHVybiEwO3ZhciBuPXQubGVuZ3RoO2lmKG4hPT1lLmxlbmd0aClyZXR1cm4hMTtpZigxPT09cil7Zm9yKHZhciBpPTA7aTxuO2krKylpZih0W2ldIT09ZVtpXSlyZXR1cm4hMX1lbHNlIGZvcih2YXIgYT10WzBdLmxlbmd0aCxpPTA7aTxuO2krKylmb3IodmFyIG89MDtvPGE7bysrKWlmKHRbaV1bb10hPT1lW2ldW29dKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHUodCxlLHIsbixpLGEsbyxzLGwpe3ZhciBoPXQubGVuZ3RoO2lmKDE9PWwpZm9yKHZhciB1PTA7dTxoO3UrKylzW3VdPWModFt1XSxlW3VdLHJbdV0sblt1XSxpLGEsbyk7ZWxzZSBmb3IodmFyIGY9dFswXS5sZW5ndGgsdT0wO3U8aDt1KyspZm9yKHZhciBkPTA7ZDxmO2QrKylzW3VdW2RdPWModFt1XVtkXSxlW3VdW2RdLHJbdV1bZF0sblt1XVtkXSxpLGEsbyl9ZnVuY3Rpb24gYyh0LGUscixuLGksYSxvKXt2YXIgcz0uNSooci10KSxsPS41KihuLWUpO3JldHVybigyKihlLXIpK3MrbCkqbysoLTMqKGUtciktMipzLWwpKmErcyppK2V9ZnVuY3Rpb24gZih0KXtpZih5KHQpKXt2YXIgZT10Lmxlbmd0aDtpZih5KHRbMF0pKXtmb3IodmFyIHI9W10sbj0wO248ZTtuKyspci5wdXNoKF8uY2FsbCh0W25dKSk7cmV0dXJuIHJ9cmV0dXJuIF8uY2FsbCh0KX1yZXR1cm4gdH1mdW5jdGlvbiBkKHQpe3JldHVybiB0WzBdPU1hdGguZmxvb3IodFswXSksdFsxXT1NYXRoLmZsb29yKHRbMV0pLHRbMl09TWF0aC5mbG9vcih0WzJdKSwicmdiYSgiK3Quam9pbigiLCIpKyIpIn1mdW5jdGlvbiBwKHQpe3ZhciBlPXRbdC5sZW5ndGgtMV0udmFsdWU7cmV0dXJuIHkoZSYmZVswXSk/MjoxfWZ1bmN0aW9uIGcodCxlLHIsbixpLGYpe3ZhciBnPXQuX2dldHRlcix4PXQuX3NldHRlcixfPSJzcGxpbmUiPT09ZSx3PW4ubGVuZ3RoO2lmKHcpe3ZhciBiLFM9blswXS52YWx1ZSxUPXkoUyksTT0hMSxQPSExLGs9VD9wKG4pOjA7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGltZS1lLnRpbWV9KSxiPW5bdy0xXS50aW1lO2Zvcih2YXIgQz1bXSxJPVtdLEE9blswXS52YWx1ZSxPPSEwLEQ9MDtEPHc7RCsrKXtDLnB1c2gobltEXS50aW1lL2IpO3ZhciBMPW5bRF0udmFsdWU7aWYoVCYmaChMLEEsayl8fCFUJiZMPT09QXx8KE89ITEpLEE9TCwic3RyaW5nIj09dHlwZW9mIEwpe3ZhciBCPW0ucGFyc2UoTCk7Qj8oTD1CLE09ITApOlA9ITB9SS5wdXNoKEwpfWlmKGZ8fCFPKXtmb3IodmFyIEY9SVt3LTFdLEQ9MDtEPHctMTtEKyspVD9sKElbRF0sRixrKTohaXNOYU4oSVtEXSl8fGlzTmFOKEYpfHxQfHxNfHwoSVtEXT1GKTtUJiZsKGcodC5fdGFyZ2V0LGkpLEYsayk7dmFyIFIseixxLFcsRSxOLEg9MCxqPTA7aWYoTSl2YXIgVj1bMCwwLDAsMF07dmFyIFg9ZnVuY3Rpb24odCxlKXt2YXIgcjtpZihlPDApcj0wO2Vsc2UgaWYoZTxqKXtmb3IoUj1NYXRoLm1pbihIKzEsdy0xKSxyPVI7cj49MCYmIShDW3JdPD1lKTtyLS0pO3I9TWF0aC5taW4ocix3LTIpfWVsc2V7Zm9yKHI9SDtyPHcmJiEoQ1tyXT5lKTtyKyspO3I9TWF0aC5taW4oci0xLHctMil9SD1yLGo9ZTt2YXIgbj1DW3IrMV0tQ1tyXTtpZigwIT09bilpZih6PShlLUNbcl0pL24sXylpZihXPUlbcl0scT1JWzA9PT1yP3I6ci0xXSxFPUlbcj53LTI/dy0xOnIrMV0sTj1JW3I+dy0zP3ctMTpyKzJdLFQpdShxLFcsRSxOLHoseip6LHoqeip6LGcodCxpKSxrKTtlbHNle3ZhciBsO2lmKE0pbD11KHEsVyxFLE4seix6Knoseip6KnosViwxKSxsPWQoVik7ZWxzZXtpZihQKXJldHVybiBvKFcsRSx6KTtsPWMocSxXLEUsTix6LHoqeix6Knoqeil9eCh0LGksbCl9ZWxzZSBpZihUKXMoSVtyXSxJW3IrMV0seixnKHQsaSksayk7ZWxzZXt2YXIgbDtpZihNKXMoSVtyXSxJW3IrMV0seixWLDEpLGw9ZChWKTtlbHNle2lmKFApcmV0dXJuIG8oSVtyXSxJW3IrMV0seik7bD1hKElbcl0sSVtyKzFdLHopfXgodCxpLGwpfX0sRz1uZXcgdih7dGFyZ2V0OnQuX3RhcmdldCxsaWZlOmIsbG9vcDp0Ll9sb29wLGRlbGF5OnQuX2RlbGF5LG9uZnJhbWU6WCxvbmRlc3Ryb3k6cn0pO3JldHVybiBlJiYic3BsaW5lIiE9PWUmJihHLmVhc2luZz1lKSxHfX19dmFyIHY9cig0MiksbT1yKDI1KSx4PXIoMSkseT14LmlzQXJyYXlMaWtlLF89QXJyYXkucHJvdG90eXBlLnNsaWNlLHc9ZnVuY3Rpb24odCxlLHIsYSl7dGhpcy5fdHJhY2tzPXt9LHRoaXMuX3RhcmdldD10LHRoaXMuX2xvb3A9ZXx8ITEsdGhpcy5fZ2V0dGVyPXJ8fG4sdGhpcy5fc2V0dGVyPWF8fGksdGhpcy5fY2xpcENvdW50PTAsdGhpcy5fZGVsYXk9MCx0aGlzLl9kb25lTGlzdD1bXSx0aGlzLl9vbmZyYW1lTGlzdD1bXSx0aGlzLl9jbGlwTGlzdD1bXX07dy5wcm90b3R5cGU9e3doZW46ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl90cmFja3M7Zm9yKHZhciBuIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShuKSl7aWYoIXJbbl0pe3Jbbl09W107dmFyIGk9dGhpcy5fZ2V0dGVyKHRoaXMuX3RhcmdldCxuKTtpZihudWxsPT1pKWNvbnRpbnVlOzAhPT10JiZyW25dLnB1c2goe3RpbWU6MCx2YWx1ZTpmKGkpfSl9cltuXS5wdXNoKHt0aW1lOnQsdmFsdWU6ZVtuXX0pfXJldHVybiB0aGlzfSxkdXJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uZnJhbWVMaXN0LnB1c2godCksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX2NsaXBMaXN0Lmxlbmd0aDt0KyspdGhpcy5fY2xpcExpc3RbdF0ucGF1c2UoKTt0aGlzLl9wYXVzZWQ9ITB9LHJlc3VtZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fY2xpcExpc3QubGVuZ3RoO3QrKyl0aGlzLl9jbGlwTGlzdFt0XS5yZXN1bWUoKTt0aGlzLl9wYXVzZWQ9ITF9LGlzUGF1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9wYXVzZWR9LF9kb25lQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLl90cmFja3M9e30sdGhpcy5fY2xpcExpc3QubGVuZ3RoPTA7Zm9yKHZhciB0PXRoaXMuX2RvbmVMaXN0LGU9dC5sZW5ndGgscj0wO3I8ZTtyKyspdFtyXS5jYWxsKHRoaXMpfSxzdGFydDpmdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcyxpPTAsYT1mdW5jdGlvbigpe2ktLSxpfHxuLl9kb25lQ2FsbGJhY2soKX07Zm9yKHZhciBvIGluIHRoaXMuX3RyYWNrcylpZih0aGlzLl90cmFja3MuaGFzT3duUHJvcGVydHkobykpe3ZhciBzPWcodGhpcyx0LGEsdGhpcy5fdHJhY2tzW29dLG8sZSk7cyYmKHRoaXMuX2NsaXBMaXN0LnB1c2gocyksaSsrLHRoaXMuYW5pbWF0aW9uJiZ0aGlzLmFuaW1hdGlvbi5hZGRDbGlwKHMpLHI9cyl9aWYocil7dmFyIGw9ci5vbmZyYW1lO3Iub25mcmFtZT1mdW5jdGlvbih0LGUpe2wodCxlKTtmb3IodmFyIHI9MDtyPG4uX29uZnJhbWVMaXN0Lmxlbmd0aDtyKyspbi5fb25mcmFtZUxpc3Rbcl0odCxlKX19cmV0dXJuIGl8fHRoaXMuX2RvbmVDYWxsYmFjaygpLHRoaXN9LHN0b3A6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2NsaXBMaXN0LHI9dGhpcy5hbmltYXRpb24sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dO3QmJmkub25mcmFtZSh0aGlzLl90YXJnZXQsMSksciYmci5yZW1vdmVDbGlwKGkpfWUubGVuZ3RoPTB9LGRlbGF5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZWxheT10LHRoaXN9LGRvbmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMuX2RvbmVMaXN0LnB1c2godCksdGhpc30sZ2V0Q2xpcHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcExpc3R9fSx0LmV4cG9ydHM9d30sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7dGhpcy5fdGFyZ2V0PXQudGFyZ2V0LHRoaXMuX2xpZmU9dC5saWZlfHwxZTMsdGhpcy5fZGVsYXk9dC5kZWxheXx8MCx0aGlzLl9pbml0aWFsaXplZD0hMSx0aGlzLmxvb3A9bnVsbCE9dC5sb29wJiZ0Lmxvb3AsdGhpcy5nYXA9dC5nYXB8fDAsdGhpcy5lYXNpbmc9dC5lYXNpbmd8fCJMaW5lYXIiLHRoaXMub25mcmFtZT10Lm9uZnJhbWUsdGhpcy5vbmRlc3Ryb3k9dC5vbmRlc3Ryb3ksdGhpcy5vbnJlc3RhcnQ9dC5vbnJlc3RhcnQsdGhpcy5fcGF1c2VkVGltZT0wLHRoaXMuX3BhdXNlZD0hMX12YXIgaT1yKDQzKTtuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixzdGVwOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5faW5pdGlhbGl6ZWR8fCh0aGlzLl9zdGFydFRpbWU9dCt0aGlzLl9kZWxheSx0aGlzLl9pbml0aWFsaXplZD0hMCksdGhpcy5fcGF1c2VkKXJldHVybiB2b2lkKHRoaXMuX3BhdXNlZFRpbWUrPWUpO3ZhciByPSh0LXRoaXMuX3N0YXJ0VGltZS10aGlzLl9wYXVzZWRUaW1lKS90aGlzLl9saWZlO2lmKCEocjwwKSl7cj1NYXRoLm1pbihyLDEpO3ZhciBuPXRoaXMuZWFzaW5nLGE9InN0cmluZyI9PXR5cGVvZiBuP2lbbl06bixvPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2Eocik6cjtyZXR1cm4gdGhpcy5maXJlKCJmcmFtZSIsbyksMT09cj90aGlzLmxvb3A/KHRoaXMucmVzdGFydCh0KSwicmVzdGFydCIpOih0aGlzLl9uZWVkc1JlbW92ZT0hMCwiZGVzdHJveSIpOm51bGx9fSxyZXN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPSh0LXRoaXMuX3N0YXJ0VGltZS10aGlzLl9wYXVzZWRUaW1lKSV0aGlzLl9saWZlO3RoaXMuX3N0YXJ0VGltZT10LWUrdGhpcy5nYXAsdGhpcy5fcGF1c2VkVGltZT0wLHRoaXMuX25lZWRzUmVtb3ZlPSExfSxmaXJlOmZ1bmN0aW9uKHQsZSl7dD0ib24iK3QsdGhpc1t0XSYmdGhpc1t0XSh0aGlzLl90YXJnZXQsZSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSEwfSxyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQ9ITF9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgcj17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxxdWFkcmF0aWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0fSxxdWFkcmF0aWNPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHF1YWRyYXRpY0luT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy41KnQqdDotLjUqKC0tdCoodC0yKS0xKX0sY3ViaWNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LGN1YmljT3V0OmZ1bmN0aW9uKHQpe3JldHVybi0tdCp0KnQrMX0sY3ViaWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdDouNSooKHQtPTIpKnQqdCsyKX0scXVhcnRpY0luOmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxxdWFydGljT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAxLSAtLXQqdCp0KnR9LHF1YXJ0aWNJbk91dDpmdW5jdGlvbih0KXtyZXR1cm4odCo9Mik8MT8uNSp0KnQqdCp0Oi0uNSooKHQtPTIpKnQqdCp0LTIpfSxxdWludGljSW46ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0KnQqdH0scXVpbnRpY091dDpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KnQqdCsxfSxxdWludGljSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuKHQqPTIpPDE/LjUqdCp0KnQqdCp0Oi41KigodC09MikqdCp0KnQqdCsyKX0sc2ludXNvaWRhbEluOmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqTWF0aC5QSS8yKX0sc2ludXNvaWRhbE91dDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaW4odCpNYXRoLlBJLzIpfSxzaW51c29pZGFsSW5PdXQ6ZnVuY3Rpb24odCl7cmV0dXJuLjUqKDEtTWF0aC5jb3MoTWF0aC5QSSp0KSl9LGV4cG9uZW50aWFsSW46ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10PzA6TWF0aC5wb3coMTAyNCx0LTEpfSxleHBvbmVudGlhbE91dDpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/MToxLU1hdGgucG93KDIsLTEwKnQpfSxleHBvbmVudGlhbEluT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD8wOjE9PT10PzE6KHQqPTIpPDE/LjUqTWF0aC5wb3coMTAyNCx0LTEpOi41KigtTWF0aC5wb3coMiwtMTAqKHQtMSkpKzIpfSxjaXJjdWxhckluOmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LGNpcmN1bGFyT3V0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfSxjaXJjdWxhckluT3V0OmZ1bmN0aW9uKHQpe3JldHVybih0Kj0yKTwxPy0uNSooTWF0aC5zcXJ0KDEtdCp0KS0xKTouNSooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpfSxlbGFzdGljSW46ZnVuY3Rpb24odCl7dmFyIGUscj0uMSxuPS40O3JldHVybiAwPT09dD8wOjE9PT10PzE6KCFyfHxyPDE/KHI9MSxlPW4vNCk6ZT1uKk1hdGguYXNpbigxL3IpLygyKk1hdGguUEkpLC0ocipNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQtZSkqKDIqTWF0aC5QSSkvbikpKX0sZWxhc3RpY091dDpmdW5jdGlvbih0KXt2YXIgZSxyPS4xLG49LjQ7cmV0dXJuIDA9PT10PzA6MT09PXQ/MTooIXJ8fHI8MT8ocj0xLGU9bi80KTplPW4qTWF0aC5hc2luKDEvcikvKDIqTWF0aC5QSSkscipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodC1lKSooMipNYXRoLlBJKS9uKSsxKX0sZWxhc3RpY0luT3V0OmZ1bmN0aW9uKHQpe3ZhciBlLHI9LjEsbj0uNDtyZXR1cm4gMD09PXQ/MDoxPT09dD8xOighcnx8cjwxPyhyPTEsZT1uLzQpOmU9bipNYXRoLmFzaW4oMS9yKS8oMipNYXRoLlBJKSwodCo9Mik8MT8tLjUqKHIqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LWUpKigyKk1hdGguUEkpL24pKTpyKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKHQtZSkqKDIqTWF0aC5QSSkvbikqLjUrMSl9LGJhY2tJbjpmdW5jdGlvbih0KXt2YXIgZT0xLjcwMTU4O3JldHVybiB0KnQqKChlKzEpKnQtZSl9LGJhY2tPdXQ6ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4tLXQqdCooKGUrMSkqdCtlKSsxfSxiYWNrSW5PdXQ6ZnVuY3Rpb24odCl7dmFyIGU9Mi41OTQ5MDk1O3JldHVybih0Kj0yKTwxPy41Kih0KnQqKChlKzEpKnQtZSkpOi41KigodC09MikqdCooKGUrMSkqdCtlKSsyKX0sYm91bmNlSW46ZnVuY3Rpb24odCl7cmV0dXJuIDEtci5ib3VuY2VPdXQoMS10KX0sYm91bmNlT3V0OmZ1bmN0aW9uKHQpe3JldHVybiB0PDEvMi43NT83LjU2MjUqdCp0OnQ8Mi8yLjc1PzcuNTYyNSoodC09MS41LzIuNzUpKnQrLjc1OnQ8Mi41LzIuNzU/Ny41NjI1Kih0LT0yLjI1LzIuNzUpKnQrLjkzNzU6Ny41NjI1Kih0LT0yLjYyNS8yLjc1KSp0Ky45ODQzNzV9LGJvdW5jZUluT3V0OmZ1bmN0aW9uKHQpe3JldHVybiB0PC41Py41KnIuYm91bmNlSW4oMip0KTouNSpyLmJvdW5jZU91dCgyKnQtMSkrLjV9fTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTgpLm5vcm1hbGl6ZVJhZGlhbixpPTIqTWF0aC5QSTt0LmV4cG9ydHM9e2NvbnRhaW5TdHJva2U6ZnVuY3Rpb24odCxlLHIsYSxvLHMsbCxoLHUpe2lmKDA9PT1sKXJldHVybiExO3ZhciBjPWw7aC09dCx1LT1lO3ZhciBmPU1hdGguc3FydChoKmgrdSp1KTtpZihmLWM+cnx8ZitjPHIpcmV0dXJuITE7aWYoTWF0aC5hYnMoYS1vKSVpPDFlLTQpcmV0dXJuITA7aWYocyl7dmFyIGQ9YTthPW4obyksbz1uKGQpfWVsc2UgYT1uKGEpLG89bihvKTthPm8mJihvKz1pKTt2YXIgcD1NYXRoLmF0YW4yKHUsaCk7cmV0dXJuIHA8MCYmKHArPWkpLHA+PWEmJnA8PW98fHAraT49YSYmcCtpPD1vfX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDUpO3QuZXhwb3J0cz17Y29udGFpblN0cm9rZTpmdW5jdGlvbih0LGUscixpLGEsbyxzLGwsaCx1LGMpe2lmKDA9PT1oKXJldHVybiExO3ZhciBmPWg7aWYoYz5lK2YmJmM+aStmJiZjPm8rZiYmYz5sK2Z8fGM8ZS1mJiZjPGktZiYmYzxvLWYmJmM8bC1mfHx1PnQrZiYmdT5yK2YmJnU+YStmJiZ1PnMrZnx8dTx0LWYmJnU8ci1mJiZ1PGEtZiYmdTxzLWYpcmV0dXJuITE7dmFyIGQ9bi5jdWJpY1Byb2plY3RQb2ludCh0LGUscixpLGEsbyxzLGwsdSxjLG51bGwpO3JldHVybiBkPD1mLzJ9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e2NvbnRhaW5TdHJva2U6ZnVuY3Rpb24odCxlLHIsbixpLGEsbyl7aWYoMD09PWkpcmV0dXJuITE7dmFyIHM9aSxsPTAsaD10O2lmKG8+ZStzJiZvPm4rc3x8bzxlLXMmJm88bi1zfHxhPnQrcyYmYT5yK3N8fGE8dC1zJiZhPHItcylyZXR1cm4hMTtpZih0PT09cilyZXR1cm4gTWF0aC5hYnMoYS10KTw9cy8yO2w9KGUtbikvKHQtciksaD0odCpuLXIqZSkvKHQtcik7dmFyIHU9bCphLW8raCxjPXUqdS8obCpsKzEpO3JldHVybiBjPD1zLzIqcy8yfX19LGZ1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBNYXRoLmFicyh0LWUpPHl9ZnVuY3Rpb24gaSgpe3ZhciB0PXdbMF07d1swXT13WzFdLHdbMV09dH1mdW5jdGlvbiBhKHQsZSxyLG4sYSxvLHMsbCxoLHUpe2lmKHU+ZSYmdT5uJiZ1Pm8mJnU+bHx8dTxlJiZ1PG4mJnU8byYmdTxsKXJldHVybiAwO3ZhciBjPWcuY3ViaWNSb290QXQoZSxuLG8sbCx1LF8pO2lmKDA9PT1jKXJldHVybiAwO2Zvcih2YXIgZixkLHA9MCx2PS0xLG09MDttPGM7bSsrKXt2YXIgeD1fW21dLHk9MD09PXh8fDE9PT14Py41OjEsYj1nLmN1YmljQXQodCxyLGEscyx4KTtiPGh8fCh2PDAmJih2PWcuY3ViaWNFeHRyZW1hKGUsbixvLGwsdyksd1sxXTx3WzBdJiZ2PjEmJmkoKSxmPWcuY3ViaWNBdChlLG4sbyxsLHdbMF0pLHY+MSYmKGQ9Zy5jdWJpY0F0KGUsbixvLGwsd1sxXSkpKSxwKz0yPT12P3g8d1swXT9mPGU/eToteTp4PHdbMV0/ZDxmP3k6LXk6bDxkP3k6LXk6eDx3WzBdP2Y8ZT95Oi15Omw8Zj95Oi15KX1yZXR1cm4gcH1mdW5jdGlvbiBvKHQsZSxyLG4saSxhLG8scyl7aWYocz5lJiZzPm4mJnM+YXx8czxlJiZzPG4mJnM8YSlyZXR1cm4gMDt2YXIgbD1nLnF1YWRyYXRpY1Jvb3RBdChlLG4sYSxzLF8pO2lmKDA9PT1sKXJldHVybiAwO3ZhciBoPWcucXVhZHJhdGljRXh0cmVtdW0oZSxuLGEpO2lmKGg+PTAmJmg8PTEpe2Zvcih2YXIgdT0wLGM9Zy5xdWFkcmF0aWNBdChlLG4sYSxoKSxmPTA7ZjxsO2YrKyl7dmFyIGQ9MD09PV9bZl18fDE9PT1fW2ZdPy41OjEscD1nLnF1YWRyYXRpY0F0KHQscixpLF9bZl0pO3A8b3x8KHUrPV9bZl08aD9jPGU/ZDotZDphPGM/ZDotZCl9cmV0dXJuIHV9dmFyIGQ9MD09PV9bMF18fDE9PT1fWzBdPy41OjEscD1nLnF1YWRyYXRpY0F0KHQscixpLF9bMF0pO3JldHVybiBwPG8/MDphPGU/ZDotZH1mdW5jdGlvbiBzKHQsZSxyLG4saSxhLG8scyl7aWYocy09ZSxzPnJ8fHM8LXIpcmV0dXJuIDA7dmFyIGw9TWF0aC5zcXJ0KHIqci1zKnMpO19bMF09LWwsX1sxXT1sO3ZhciBoPU1hdGguYWJzKG4taSk7aWYoaDwxZS00KXJldHVybiAwO2lmKGgleDwxZS00KXtuPTAsaT14O3ZhciB1PWE/MTotMTtyZXR1cm4gbz49X1swXSt0JiZvPD1fWzFdK3Q/dTowfWlmKGEpe3ZhciBsPW47bj1wKGkpLGk9cChsKX1lbHNlIG49cChuKSxpPXAoaSk7bj5pJiYoaSs9eCk7Zm9yKHZhciBjPTAsZj0wO2Y8MjtmKyspe3ZhciBkPV9bZl07aWYoZCt0Pm8pe3ZhciBnPU1hdGguYXRhbjIocyxkKSx1PWE/MTotMTtnPDAmJihnPXgrZyksKGc+PW4mJmc8PWl8fGcreD49biYmZyt4PD1pKSYmKGc+TWF0aC5QSS8yJiZnPDEuNSpNYXRoLlBJJiYodT0tdSksYys9dSl9fXJldHVybiBjfWZ1bmN0aW9uIGwodCxlLHIsaSxsKXtmb3IodmFyIHU9MCxwPTAsZz0wLHg9MCx5PTAsXz0wO188dC5sZW5ndGg7KXt2YXIgdz10W18rK107c3dpdGNoKHc9PT1oLk0mJl8+MSYmKHJ8fCh1Kz12KHAsZyx4LHksaSxsKSkpLDE9PV8mJihwPXRbX10sZz10W18rMV0seD1wLHk9Zyksdyl7Y2FzZSBoLk06eD10W18rK10seT10W18rK10scD14LGc9eTticmVhaztjYXNlIGguTDppZihyKXtpZihtKHAsZyx0W19dLHRbXysxXSxlLGksbCkpcmV0dXJuITB9ZWxzZSB1Kz12KHAsZyx0W19dLHRbXysxXSxpLGwpfHwwO3A9dFtfKytdLGc9dFtfKytdO2JyZWFrO2Nhc2UgaC5DOmlmKHIpe2lmKGMuY29udGFpblN0cm9rZShwLGcsdFtfKytdLHRbXysrXSx0W18rK10sdFtfKytdLHRbX10sdFtfKzFdLGUsaSxsKSlyZXR1cm4hMH1lbHNlIHUrPWEocCxnLHRbXysrXSx0W18rK10sdFtfKytdLHRbXysrXSx0W19dLHRbXysxXSxpLGwpfHwwO3A9dFtfKytdLGc9dFtfKytdO2JyZWFrO2Nhc2UgaC5ROmlmKHIpe2lmKGYuY29udGFpblN0cm9rZShwLGcsdFtfKytdLHRbXysrXSx0W19dLHRbXysxXSxlLGksbCkpcmV0dXJuITB9ZWxzZSB1Kz1vKHAsZyx0W18rK10sdFtfKytdLHRbX10sdFtfKzFdLGksbCl8fDA7cD10W18rK10sZz10W18rK107YnJlYWs7Y2FzZSBoLkE6dmFyIGI9dFtfKytdLFM9dFtfKytdLFQ9dFtfKytdLE09dFtfKytdLFA9dFtfKytdLGs9dFtfKytdLEM9KHRbXysrXSwxLXRbXysrXSksST1NYXRoLmNvcyhQKSpUK2IsQT1NYXRoLnNpbihQKSpNK1M7Xz4xP3UrPXYocCxnLEksQSxpLGwpOih4PUkseT1BKTt2YXIgTz0oaS1iKSpNL1QrYjtpZihyKXtpZihkLmNvbnRhaW5TdHJva2UoYixTLE0sUCxQK2ssQyxlLE8sbCkpcmV0dXJuITB9ZWxzZSB1Kz1zKGIsUyxNLFAsUCtrLEMsTyxsKTtwPU1hdGguY29zKFAraykqVCtiLGc9TWF0aC5zaW4oUCtrKSpNK1M7YnJlYWs7Y2FzZSBoLlI6eD1wPXRbXysrXSx5PWc9dFtfKytdO3ZhciBEPXRbXysrXSxMPXRbXysrXSxJPXgrRCxBPXkrTDtpZihyKXtpZihtKHgseSxJLHksZSxpLGwpfHxtKEkseSxJLEEsZSxpLGwpfHxtKEksQSx4LEEsZSxpLGwpfHxtKHgsQSx4LHksZSxpLGwpKXJldHVybiEwfWVsc2UgdSs9dihJLHksSSxBLGksbCksdSs9dih4LEEseCx5LGksbCk7YnJlYWs7Y2FzZSBoLlo6aWYocil7aWYobShwLGcseCx5LGUsaSxsKSlyZXR1cm4hMH1lbHNlIHUrPXYocCxnLHgseSxpLGwpO3A9eCxnPXl9fXJldHVybiByfHxuKGcseSl8fCh1Kz12KHAsZyx4LHksaSxsKXx8MCksMCE9PXV9dmFyIGg9cig3KS5DTUQsdT1yKDQ2KSxjPXIoNDUpLGY9cig0OCksZD1yKDQ0KSxwPXIoMTgpLm5vcm1hbGl6ZVJhZGlhbixnPXIoNSksdj1yKDQ5KSxtPXUuY29udGFpblN0cm9rZSx4PTIqTWF0aC5QSSx5PTFlLTQsXz1bLTEsLTEsLTFdLHc9Wy0xLC0xXTt0LmV4cG9ydHM9e2NvbnRhaW46ZnVuY3Rpb24odCxlLHIpe3JldHVybiBsKHQsMCwhMSxlLHIpfSxjb250YWluU3Ryb2tlOmZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBsKHQsZSwhMCxyLG4pfX19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDUpO3QuZXhwb3J0cz17Y29udGFpblN0cm9rZTpmdW5jdGlvbih0LGUscixpLGEsbyxzLGwsaCl7aWYoMD09PXMpcmV0dXJuITE7dmFyIHU9cztpZihoPmUrdSYmaD5pK3UmJmg+byt1fHxoPGUtdSYmaDxpLXUmJmg8by11fHxsPnQrdSYmbD5yK3UmJmw+YSt1fHxsPHQtdSYmbDxyLXUmJmw8YS11KXJldHVybiExO3ZhciBjPW4ucXVhZHJhdGljUHJvamVjdFBvaW50KHQsZSxyLGksYSxvLGwsaCxudWxsKTtyZXR1cm4gYzw9dS8yfX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXtpZihhPmUmJmE+bnx8YTxlJiZhPG4pcmV0dXJuIDA7aWYobj09PWUpcmV0dXJuIDA7dmFyIG89bjxlPzE6LTEscz0oYS1lKS8obi1lKTsxIT09cyYmMCE9PXN8fChvPW48ZT8uNTotLjUpO3ZhciBsPXMqKHItdCkrdDtyZXR1cm4gbD5pP286MH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDEpLGk9cigxNiksYT1yKDQpLG89ZnVuY3Rpb24odCl7dD10fHx7fSxpLmNhbGwodGhpcyx0KTtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodGhpc1tlXT10W2VdKTt0aGlzLl9jaGlsZHJlbj1bXSx0aGlzLl9fc3RvcmFnZT1udWxsLHRoaXMuX19kaXJ0eT0hMH07by5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm8saXNHcm91cDohMCx0eXBlOiJncm91cCIsc2lsZW50OiExLGNoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLnNsaWNlKCl9LGNoaWxkQXQ6ZnVuY3Rpb24odCl7CnJldHVybiB0aGlzLl9jaGlsZHJlblt0XX0sY2hpbGRPZk5hbWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2NoaWxkcmVuLHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdLm5hbWU9PT10KXJldHVybiBlW3JdfSxjaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aH0sYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0IT09dGhpcyYmdC5wYXJlbnQhPT10aGlzJiYodGhpcy5fY2hpbGRyZW4ucHVzaCh0KSx0aGlzLl9kb0FkZCh0KSksdGhpc30sYWRkQmVmb3JlOmZ1bmN0aW9uKHQsZSl7aWYodCYmdCE9PXRoaXMmJnQucGFyZW50IT09dGhpcyYmZSYmZS5wYXJlbnQ9PT10aGlzKXt2YXIgcj10aGlzLl9jaGlsZHJlbixuPXIuaW5kZXhPZihlKTtuPj0wJiYoci5zcGxpY2UobiwwLHQpLHRoaXMuX2RvQWRkKHQpKX1yZXR1cm4gdGhpc30sX2RvQWRkOmZ1bmN0aW9uKHQpe3QucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCksdC5wYXJlbnQ9dGhpczt2YXIgZT10aGlzLl9fc3RvcmFnZSxyPXRoaXMuX196cjtlJiZlIT09dC5fX3N0b3JhZ2UmJihlLmFkZFRvU3RvcmFnZSh0KSx0IGluc3RhbmNlb2YgbyYmdC5hZGRDaGlsZHJlblRvU3RvcmFnZShlKSksciYmci5yZWZyZXNoKCl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fenIscj10aGlzLl9fc3RvcmFnZSxpPXRoaXMuX2NoaWxkcmVuLGE9bi5pbmRleE9mKGksdCk7cmV0dXJuIGE8MD90aGlzOihpLnNwbGljZShhLDEpLHQucGFyZW50PW51bGwsciYmKHIuZGVsRnJvbVN0b3JhZ2UodCksdCBpbnN0YW5jZW9mIG8mJnQuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZShyKSksZSYmZS5yZWZyZXNoKCksdGhpcyl9LHJlbW92ZUFsbDpmdW5jdGlvbigpe3ZhciB0LGUscj10aGlzLl9jaGlsZHJlbixuPXRoaXMuX19zdG9yYWdlO2ZvcihlPTA7ZTxyLmxlbmd0aDtlKyspdD1yW2VdLG4mJihuLmRlbEZyb21TdG9yYWdlKHQpLHQgaW5zdGFuY2VvZiBvJiZ0LmRlbENoaWxkcmVuRnJvbVN0b3JhZ2UobikpLHQucGFyZW50PW51bGw7cmV0dXJuIHIubGVuZ3RoPTAsdGhpc30sZWFjaENoaWxkOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX2NoaWxkcmVuLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIGk9cltuXTt0LmNhbGwoZSxpLG4pfXJldHVybiB0aGlzfSx0cmF2ZXJzZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wO3I8dGhpcy5fY2hpbGRyZW4ubGVuZ3RoO3IrKyl7dmFyIG49dGhpcy5fY2hpbGRyZW5bcl07dC5jYWxsKGUsbiksImdyb3VwIj09PW4udHlwZSYmbi50cmF2ZXJzZSh0LGUpfXJldHVybiB0aGlzfSxhZGRDaGlsZHJlblRvU3RvcmFnZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtlKyspe3ZhciByPXRoaXMuX2NoaWxkcmVuW2VdO3QuYWRkVG9TdG9yYWdlKHIpLHIgaW5zdGFuY2VvZiBvJiZyLmFkZENoaWxkcmVuVG9TdG9yYWdlKHQpfX0sZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtlKyspe3ZhciByPXRoaXMuX2NoaWxkcmVuW2VdO3QuZGVsRnJvbVN0b3JhZ2UociksciBpbnN0YW5jZW9mIG8mJnIuZGVsQ2hpbGRyZW5Gcm9tU3RvcmFnZSh0KX19LGRpcnR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19kaXJ0eT0hMCx0aGlzLl9fenImJnRoaXMuX196ci5yZWZyZXNoKCksdGhpc30sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLHI9bmV3IGEoMCwwLDAsMCksbj10fHx0aGlzLl9jaGlsZHJlbixpPVtdLG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIHM9bltvXTtpZighcy5pZ25vcmUmJiFzLmludmlzaWJsZSl7dmFyIGw9cy5nZXRCb3VuZGluZ1JlY3QoKSxoPXMuZ2V0TG9jYWxUcmFuc2Zvcm0oaSk7aD8oci5jb3B5KGwpLHIuYXBwbHlUcmFuc2Zvcm0oaCksZT1lfHxyLmNsb25lKCksZS51bmlvbihyKSk6KGU9ZXx8bC5jbG9uZSgpLGUudW5pb24obCkpfX1yZXR1cm4gZXx8cn19LG4uaW5oZXJpdHMobyxpKSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMyksaT1yKDUpLGE9e30sbz1NYXRoLm1pbixzPU1hdGgubWF4LGw9TWF0aC5zaW4saD1NYXRoLmNvcyx1PW4uY3JlYXRlKCksYz1uLmNyZWF0ZSgpLGY9bi5jcmVhdGUoKSxkPTIqTWF0aC5QSTthLmZyb21Qb2ludHM9ZnVuY3Rpb24odCxlLHIpe2lmKDAhPT10Lmxlbmd0aCl7dmFyIG4saT10WzBdLGE9aVswXSxsPWlbMF0saD1pWzFdLHU9aVsxXTtmb3Iobj0xO248dC5sZW5ndGg7bisrKWk9dFtuXSxhPW8oYSxpWzBdKSxsPXMobCxpWzBdKSxoPW8oaCxpWzFdKSx1PXModSxpWzFdKTtlWzBdPWEsZVsxXT1oLHJbMF09bCxyWzFdPXV9fSxhLmZyb21MaW5lPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXtpWzBdPW8odCxyKSxpWzFdPW8oZSxuKSxhWzBdPXModCxyKSxhWzFdPXMoZSxuKX07dmFyIHA9W10sZz1bXTthLmZyb21DdWJpYz1mdW5jdGlvbih0LGUscixuLGEsbCxoLHUsYyxmKXt2YXIgZCx2PWkuY3ViaWNFeHRyZW1hLG09aS5jdWJpY0F0LHg9dih0LHIsYSxoLHApO2ZvcihjWzBdPTEvMCxjWzFdPTEvMCxmWzBdPS0oMS8wKSxmWzFdPS0oMS8wKSxkPTA7ZDx4O2QrKyl7dmFyIHk9bSh0LHIsYSxoLHBbZF0pO2NbMF09byh5LGNbMF0pLGZbMF09cyh5LGZbMF0pfWZvcih4PXYoZSxuLGwsdSxnKSxkPTA7ZDx4O2QrKyl7dmFyIF89bShlLG4sbCx1LGdbZF0pO2NbMV09byhfLGNbMV0pLGZbMV09cyhfLGZbMV0pfWNbMF09byh0LGNbMF0pLGZbMF09cyh0LGZbMF0pLGNbMF09byhoLGNbMF0pLGZbMF09cyhoLGZbMF0pLGNbMV09byhlLGNbMV0pLGZbMV09cyhlLGZbMV0pLGNbMV09byh1LGNbMV0pLGZbMV09cyh1LGZbMV0pfSxhLmZyb21RdWFkcmF0aWM9ZnVuY3Rpb24odCxlLHIsbixhLGwsaCx1KXt2YXIgYz1pLnF1YWRyYXRpY0V4dHJlbXVtLGY9aS5xdWFkcmF0aWNBdCxkPXMobyhjKHQscixhKSwxKSwwKSxwPXMobyhjKGUsbixsKSwxKSwwKSxnPWYodCxyLGEsZCksdj1mKGUsbixsLHApO2hbMF09byh0LGEsZyksaFsxXT1vKGUsbCx2KSx1WzBdPXModCxhLGcpLHVbMV09cyhlLGwsdil9LGEuZnJvbUFyYz1mdW5jdGlvbih0LGUscixpLGEsbyxzLHAsZyl7dmFyIHY9bi5taW4sbT1uLm1heCx4PU1hdGguYWJzKGEtbyk7aWYoeCVkPDFlLTQmJng+MWUtNClyZXR1cm4gcFswXT10LXIscFsxXT1lLWksZ1swXT10K3Isdm9pZChnWzFdPWUraSk7aWYodVswXT1oKGEpKnIrdCx1WzFdPWwoYSkqaStlLGNbMF09aChvKSpyK3QsY1sxXT1sKG8pKmkrZSx2KHAsdSxjKSxtKGcsdSxjKSxhJT1kLGE8MCYmKGErPWQpLG8lPWQsbzwwJiYobys9ZCksYT5vJiYhcz9vKz1kOmE8byYmcyYmKGErPWQpLHMpe3ZhciB5PW87bz1hLGE9eX1mb3IodmFyIF89MDtfPG87Xys9TWF0aC5QSS8yKV8+YSYmKGZbMF09aChfKSpyK3QsZlsxXT1sKF8pKmkrZSx2KHAsZixwKSxtKGcsZixnKSl9LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe3ZhciByPTIzMTE7dC5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIrK319LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtpZigwIT09bi5kZWJ1Z01vZGUpaWYoMT09bi5kZWJ1Z01vZGUpZm9yKHZhciB0IGluIGFyZ3VtZW50cyl0aHJvdyBuZXcgRXJyb3IoYXJndW1lbnRzW3RdKTtlbHNlIGlmKG4uZGVidWdNb2RlPjEpZm9yKHZhciB0IGluIGFyZ3VtZW50cyljb25zb2xlLmxvZyhhcmd1bWVudHNbdF0pfX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMik7dC5leHBvcnRzPW4uZXh0ZW5kKHt0eXBlOiJjb21wb3VuZCIsc2hhcGU6e3BhdGhzOm51bGx9LF91cGRhdGVQYXRoRGlydHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fX2RpcnR5UGF0aCxlPXRoaXMuc2hhcGUucGF0aHMscj0wO3I8ZS5sZW5ndGg7cisrKXQ9dHx8ZVtyXS5fX2RpcnR5UGF0aDt0aGlzLl9fZGlydHlQYXRoPXQsdGhpcy5fX2RpcnR5PXRoaXMuX19kaXJ0eXx8dH0sYmVmb3JlQnJ1c2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQYXRoRGlydHkoKTtmb3IodmFyIHQ9dGhpcy5zaGFwZS5wYXRoc3x8W10sZT10aGlzLmdldEdsb2JhbFNjYWxlKCkscj0wO3I8dC5sZW5ndGg7cisrKXRbcl0ucGF0aHx8dFtyXS5jcmVhdGVQYXRoUHJveHkoKSx0W3JdLnBhdGguc2V0U2NhbGUoZVswXSxlWzFdKX0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUucGF0aHN8fFtdLG49MDtuPHIubGVuZ3RoO24rKylyW25dLmJ1aWxkUGF0aCh0LHJbbl0uc2hhcGUsITApfSxhZnRlckJydXNoOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc2hhcGUucGF0aHMsZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0uX19kaXJ0eVBhdGg9ITF9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVQYXRoRGlydHkoKSxuLnByb3RvdHlwZS5nZXRCb3VuZGluZ1JlY3QuY2FsbCh0aGlzKX19KX0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7aS5jYWxsKHRoaXMsdCl9dmFyIGk9cigxMSksYT1yKDQpLG89cigxKSxzPXIoMTIpO24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLHR5cGU6ImltYWdlIixicnVzaDpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuc3R5bGUsbj1yLmltYWdlO3IuYmluZCh0LHRoaXMsZSk7dmFyIGk9dGhpcy5faW1hZ2U9cy5jcmVhdGVPclVwZGF0ZUltYWdlKG4sdGhpcy5faW1hZ2UsdGhpcyk7aWYoaSYmcy5pc0ltYWdlUmVhZHkoaSkpe3ZhciBhPXIueHx8MCxvPXIueXx8MCxsPXIud2lkdGgsaD1yLmhlaWdodCx1PWkud2lkdGgvaS5oZWlnaHQ7aWYobnVsbD09bCYmbnVsbCE9aD9sPWgqdTpudWxsPT1oJiZudWxsIT1sP2g9bC91Om51bGw9PWwmJm51bGw9PWgmJihsPWkud2lkdGgsaD1pLmhlaWdodCksdGhpcy5zZXRUcmFuc2Zvcm0odCksci5zV2lkdGgmJnIuc0hlaWdodCl7dmFyIGM9ci5zeHx8MCxmPXIuc3l8fDA7dC5kcmF3SW1hZ2UoaSxjLGYsci5zV2lkdGgsci5zSGVpZ2h0LGEsbyxsLGgpfWVsc2UgaWYoci5zeCYmci5zeSl7dmFyIGM9ci5zeCxmPXIuc3ksZD1sLWMscD1oLWY7dC5kcmF3SW1hZ2UoaSxjLGYsZCxwLGEsbyxsLGgpfWVsc2UgdC5kcmF3SW1hZ2UoaSxhLG8sbCxoKTt0aGlzLnJlc3RvcmVUcmFuc2Zvcm0odCksbnVsbCE9ci50ZXh0JiZ0aGlzLmRyYXdSZWN0VGV4dCh0LHRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkpfX0sZ2V0Qm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdHlsZTtyZXR1cm4gdGhpcy5fcmVjdHx8KHRoaXMuX3JlY3Q9bmV3IGEodC54fHwwLHQueXx8MCx0LndpZHRofHwwLHQuaGVpZ2h0fHwwKSksdGhpcy5fcmVjdH19LG8uaW5oZXJpdHMobixpKSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDEpLGk9cigyMSksYT1mdW5jdGlvbih0LGUscixuLGEsbyl7dGhpcy54PW51bGw9PXQ/MDp0LHRoaXMueT1udWxsPT1lPzA6ZSx0aGlzLngyPW51bGw9PXI/MTpyLHRoaXMueTI9bnVsbD09bj8wOm4sdGhpcy50eXBlPSJsaW5lYXIiLHRoaXMuZ2xvYmFsPW98fCExLGkuY2FsbCh0aGlzLGEpfTthLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YX0sbi5pbmhlcml0cyhhLGkpLHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7dGhpcy5pbWFnZT10LHRoaXMucmVwZWF0PWUsdGhpcy50eXBlPSJwYXR0ZXJuIn07ci5wcm90b3R5cGUuZ2V0Q2FudmFzUGF0dGVybj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVQYXR0ZXJuKHRoaXMuaW1hZ2UsdGhpcy5yZXBlYXR8fCJyZXBlYXQiKX0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxKSxpPXIoMjEpLGE9ZnVuY3Rpb24odCxlLHIsbixhKXt0aGlzLng9bnVsbD09dD8uNTp0LHRoaXMueT1udWxsPT1lPy41OmUsdGhpcy5yPW51bGw9PXI/LjU6cix0aGlzLnR5cGU9InJhZGlhbCIsdGhpcy5nbG9iYWw9YXx8ITEsaS5jYWxsKHRoaXMsbil9O2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphfSxuLmluaGVyaXRzKGEsaSksdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1udWxsPT1lLng/MDplLngsaT1udWxsPT1lLngyPzE6ZS54MixhPW51bGw9PWUueT8wOmUueSxvPW51bGw9PWUueTI/MDplLnkyO2UuZ2xvYmFsfHwobj1uKnIud2lkdGgrci54LGk9aSpyLndpZHRoK3IueCxhPWEqci5oZWlnaHQrci55LG89bypyLmhlaWdodCtyLnkpO3ZhciBzPXQuY3JlYXRlTGluZWFyR3JhZGllbnQobixhLGksbyk7cmV0dXJuIHN9ZnVuY3Rpb24gaSh0LGUscil7dmFyIG49ci53aWR0aCxpPXIuaGVpZ2h0LGE9TWF0aC5taW4obixpKSxvPW51bGw9PWUueD8uNTplLngscz1udWxsPT1lLnk/LjU6ZS55LGw9bnVsbD09ZS5yPy41OmUucjtlLmdsb2JhbHx8KG89bypuK3IueCxzPXMqaStyLnksbCo9YSk7dmFyIGg9dC5jcmVhdGVSYWRpYWxHcmFkaWVudChvLHMsMCxvLHMsbCk7cmV0dXJuIGh9dmFyIGE9cigxMyksbz1bWyJzaGFkb3dCbHVyIiwwXSxbInNoYWRvd09mZnNldFgiLDBdLFsic2hhZG93T2Zmc2V0WSIsMF0sWyJzaGFkb3dDb2xvciIsIiMwMDAiXSxbImxpbmVDYXAiLCJidXR0Il0sWyJsaW5lSm9pbiIsIm1pdGVyIl0sWyJtaXRlckxpbWl0IiwxMF1dLHM9ZnVuY3Rpb24odCxlKXt0aGlzLmV4dGVuZEZyb20odCwhMSksdGhpcy5ob3N0PWV9O3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpzLGhvc3Q6bnVsbCxmaWxsOiIjMDAwMDAwIixzdHJva2U6bnVsbCxvcGFjaXR5OjEsbGluZURhc2g6bnVsbCxsaW5lRGFzaE9mZnNldDowLHNoYWRvd0JsdXI6MCxzaGFkb3dPZmZzZXRYOjAsc2hhZG93T2Zmc2V0WTowLGxpbmVXaWR0aDoxLHN0cm9rZU5vU2NhbGU6ITEsdGV4dDpudWxsLGZvbnQ6bnVsbCx0ZXh0Rm9udDpudWxsLGZvbnRTdHlsZTpudWxsLGZvbnRXZWlnaHQ6bnVsbCxmb250U2l6ZTpudWxsLGZvbnRGYW1pbHk6bnVsbCx0ZXh0VGFnOm51bGwsdGV4dEZpbGw6IiMwMDAiLHRleHRTdHJva2U6bnVsbCx0ZXh0V2lkdGg6bnVsbCx0ZXh0SGVpZ2h0Om51bGwsdGV4dExpbmVXaWR0aDowLHRleHRMaW5lSGVpZ2h0Om51bGwsdGV4dFBvc2l0aW9uOiJpbnNpZGUiLHRleHRSZWN0Om51bGwsdGV4dE9mZnNldDpudWxsLHRleHRBbGlnbjpudWxsLHRleHRWZXJ0aWNhbEFsaWduOm51bGwsdGV4dERpc3RhbmNlOjUsdGV4dFNoYWRvd0NvbG9yOiJ0cmFuc3BhcmVudCIsdGV4dFNoYWRvd0JsdXI6MCx0ZXh0U2hhZG93T2Zmc2V0WDowLHRleHRTaGFkb3dPZmZzZXRZOjAsdGV4dEJveFNoYWRvd0NvbG9yOiJ0cmFuc3BhcmVudCIsdGV4dEJveFNoYWRvd0JsdXI6MCx0ZXh0Qm94U2hhZG93T2Zmc2V0WDowLHRleHRCb3hTaGFkb3dPZmZzZXRZOjAsdHJhbnNmb3JtVGV4dDohMSx0ZXh0Um90YXRpb246MCx0ZXh0T3JpZ2luOm51bGwsdGV4dEJhY2tncm91bmRDb2xvcjpudWxsLHRleHRCb3JkZXJDb2xvcjpudWxsLHRleHRCb3JkZXJXaWR0aDowLHRleHRCb3JkZXJSYWRpdXM6MCx0ZXh0UGFkZGluZzpudWxsLHJpY2g6bnVsbCx0cnVuY2F0ZTpudWxsLGJsZW5kOm51bGwsbm9ybWFsaXplOmZ1bmN0aW9uKCl7YS5ub3JtYWxpemVUZXh0U3R5bGUodGhpcyl9LGJpbmQ6ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbj10aGlzLGk9ciYmci5zdHlsZSxhPSFpLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIGw9b1tzXSxoPWxbMF07KGF8fG5baF0hPT1pW2hdKSYmKHRbaF09bltoXXx8bFsxXSl9aWYoKGF8fG4uZmlsbCE9PWkuZmlsbCkmJih0LmZpbGxTdHlsZT1uLmZpbGwpLChhfHxuLnN0cm9rZSE9PWkuc3Ryb2tlKSYmKHQuc3Ryb2tlU3R5bGU9bi5zdHJva2UpLChhfHxuLm9wYWNpdHkhPT1pLm9wYWNpdHkpJiYodC5nbG9iYWxBbHBoYT1udWxsPT1uLm9wYWNpdHk/MTpuLm9wYWNpdHkpLChhfHxuLmJsZW5kIT09aS5ibGVuZCkmJih0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1uLmJsZW5kfHwic291cmNlLW92ZXIiKSx0aGlzLmhhc1N0cm9rZSgpKXt2YXIgdT1uLmxpbmVXaWR0aDt0LmxpbmVXaWR0aD11Lyh0aGlzLnN0cm9rZU5vU2NhbGUmJmUmJmUuZ2V0TGluZVNjYWxlP2UuZ2V0TGluZVNjYWxlKCk6MSl9fSxoYXNGaWxsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5maWxsO3JldHVybiBudWxsIT10JiYibm9uZSIhPT10fSxoYXNTdHJva2U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0cm9rZTtyZXR1cm4gbnVsbCE9dCYmIm5vbmUiIT09dCYmdGhpcy5saW5lV2lkdGg+MH0sZXh0ZW5kRnJvbTpmdW5jdGlvbih0LGUpe2lmKHQpZm9yKHZhciByIGluIHQpIXQuaGFzT3duUHJvcGVydHkocil8fGUhPT0hMCYmKGU9PT0hMT90aGlzLmhhc093blByb3BlcnR5KHIpOm51bGw9PXRbcl0pfHwodGhpc1tyXT10W3JdKX0sc2V0OmZ1bmN0aW9uKHQsZSl7InN0cmluZyI9PXR5cGVvZiB0P3RoaXNbdF09ZTp0aGlzLmV4dGVuZEZyb20odCwhMCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHQuZXh0ZW5kRnJvbSh0aGlzLCEwKSx0fSxnZXRHcmFkaWVudDpmdW5jdGlvbih0LGUscil7Zm9yKHZhciBhPSJyYWRpYWwiPT09ZS50eXBlP2k6bixvPWEodCxlLHIpLHM9ZS5jb2xvclN0b3BzLGw9MDtsPHMubGVuZ3RoO2wrKylvLmFkZENvbG9yU3RvcChzW2xdLm9mZnNldCxzW2xdLmNvbG9yKTtyZXR1cm4gb319O2Zvcih2YXIgbD1zLnByb3RvdHlwZSxoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciB1PW9baF07dVswXWluIGx8fChsW3VbMF1dPXVbMV0pfXMuZ2V0R3JhZGllbnQ9bC5nZXRHcmFkaWVudCx0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMTEpLGk9cigxKSxhPXIoNiksbz1yKDEzKSxzPWZ1bmN0aW9uKHQpe24uY2FsbCh0aGlzLHQpfTtzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cyx0eXBlOiJ0ZXh0IixicnVzaDpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuc3R5bGU7dGhpcy5fX2RpcnR5JiZvLm5vcm1hbGl6ZVRleHRTdHlsZShyLCEwKSxyLmZpbGw9ci5zdHJva2U9ci5zaGFkb3dCbHVyPXIuc2hhZG93Q29sb3I9ci5zaGFkb3dPZmZzZXRYPXIuc2hhZG93T2Zmc2V0WT1udWxsO3ZhciBuPXIudGV4dDtudWxsIT1uJiYobis9IiIpLHIuYmluZCh0LHRoaXMsZSksby5uZWVkRHJhd1RleHQobixyKSYmKHRoaXMuc2V0VHJhbnNmb3JtKHQpLG8ucmVuZGVyVGV4dCh0aGlzLHQsbixyKSx0aGlzLnJlc3RvcmVUcmFuc2Zvcm0odCkpfSxnZXRCb3VuZGluZ1JlY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0eWxlO2lmKHRoaXMuX19kaXJ0eSYmby5ub3JtYWxpemVUZXh0U3R5bGUodCwhMCksIXRoaXMuX3JlY3Qpe3ZhciBlPXQudGV4dDtudWxsIT1lP2UrPSIiOmU9IiI7dmFyIHI9YS5nZXRCb3VuZGluZ1JlY3QodC50ZXh0KyIiLHQuZm9udCx0LnRleHRBbGlnbix0LnRleHRWZXJ0aWNhbEFsaWduLHQudGV4dFBhZGRpbmcsdC5yaWNoKTtpZihyLngrPXQueHx8MCxyLnkrPXQueXx8MCxvLmdldFN0cm9rZSh0LnRleHRTdHJva2UsdC50ZXh0TGluZVdpZHRoKSl7dmFyIG49dC50ZXh0TGluZVdpZHRoO3IueC09bi8yLHIueS09bi8yLHIud2lkdGgrPW4sci5oZWlnaHQrPW59dGhpcy5fcmVjdD1yfXJldHVybiB0aGlzLl9yZWN0fX0saS5pbmhlcml0cyhzLG4pLHQuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyMCksaT1bWyJzaGFkb3dCbHVyIiwwXSxbInNoYWRvd0NvbG9yIiwiIzAwMCJdLFsic2hhZG93T2Zmc2V0WCIsMF0sWyJzaGFkb3dPZmZzZXRZIiwwXV07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuLmJyb3dzZXIuaWUmJm4uYnJvd3Nlci52ZXJzaW9uPj0xMT9mdW5jdGlvbigpe3ZhciBlLHI9dGhpcy5fX2NsaXBQYXRocyxuPXRoaXMuc3R5bGU7aWYocilmb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIG89clthXSxzPW8mJm8uc2hhcGUsbD1vJiZvLnR5cGU7aWYocyYmKCJzZWN0b3IiPT09bCYmcy5zdGFydEFuZ2xlPT09cy5lbmRBbmdsZXx8InJlY3QiPT09bCYmKCFzLndpZHRofHwhcy5oZWlnaHQpKSl7Zm9yKHZhciBoPTA7aDxpLmxlbmd0aDtoKyspaVtoXVsyXT1uW2lbaF1bMF1dLG5baVtoXVswXV09aVtoXVsxXTtlPSEwO2JyZWFrfX1pZih0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlKWZvcih2YXIgaD0wO2g8aS5sZW5ndGg7aCsrKW5baVtoXVswXV09aVtoXVsyXX06dH19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDMpLGk9bi5taW4sYT1uLm1heCxvPW4uc2NhbGUscz1uLmRpc3RhbmNlLGw9bi5hZGQ7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxyLGgpe3ZhciB1LGMsZixkLHA9W10sZz1bXSx2PVtdLG09W107aWYoaCl7Zj1bMS8wLDEvMF0sZD1bLSgxLzApLC0oMS8wKV07Zm9yKHZhciB4PTAseT10Lmxlbmd0aDt4PHk7eCsrKWkoZixmLHRbeF0pLGEoZCxkLHRbeF0pO2koZixmLGhbMF0pLGEoZCxkLGhbMV0pfWZvcih2YXIgeD0wLHk9dC5sZW5ndGg7eDx5O3grKyl7dmFyIF89dFt4XTtpZihyKXU9dFt4P3gtMTp5LTFdLGM9dFsoeCsxKSV5XTtlbHNle2lmKDA9PT14fHx4PT09eS0xKXtwLnB1c2gobi5jbG9uZSh0W3hdKSk7Y29udGludWV9dT10W3gtMV0sYz10W3grMV19bi5zdWIoZyxjLHUpLG8oZyxnLGUpO3ZhciB3PXMoXyx1KSxiPXMoXyxjKSxTPXcrYjswIT09UyYmKHcvPVMsYi89Uyksbyh2LGcsLXcpLG8obSxnLGIpO3ZhciBUPWwoW10sXyx2KSxNPWwoW10sXyxtKTtoJiYoYShULFQsZiksaShULFQsZCksYShNLE0sZiksaShNLE0sZCkpLHAucHVzaChUKSxwLnB1c2goTSl9cmV0dXJuIHImJnAucHVzaChwLnNoaWZ0KCkpLHB9fSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvKXt2YXIgcz0uNSooci10KSxsPS41KihuLWUpO3JldHVybigyKihlLXIpK3MrbCkqbysoLTMqKGUtciktMipzLWwpKmErcyppK2V9dmFyIGk9cigzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsYT1bXSxvPTAscz0xO3M8cjtzKyspbys9aS5kaXN0YW5jZSh0W3MtMV0sdFtzXSk7dmFyIGw9by8yO2w9bDxyP3I6bDtmb3IodmFyIHM9MDtzPGw7cysrKXt2YXIgaCx1LGMsZj1zLyhsLTEpKihlP3I6ci0xKSxkPU1hdGguZmxvb3IoZikscD1mLWQsZz10W2Qlcl07ZT8oaD10WyhkLTErciklcl0sdT10WyhkKzEpJXJdLGM9dFsoZCsyKSVyXSk6KGg9dFswPT09ZD9kOmQtMV0sdT10W2Q+ci0yP3ItMTpkKzFdLGM9dFtkPnItMz9yLTE6ZCsyXSk7dmFyIHY9cCpwLG09cCp2O2EucHVzaChbbihoWzBdLGdbMF0sdVswXSxjWzBdLHAsdixtKSxuKGhbMV0sZ1sxXSx1WzFdLGNbMV0scCx2LG0pXSl9cmV0dXJuIGF9fSxmdW5jdGlvbih0LGUscil7dmFyIG49cigxMyksaT1yKDQpLGE9bmV3IGksbz1mdW5jdGlvbigpe307by5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm8sZHJhd1JlY3RUZXh0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5zdHlsZTtlPXIudGV4dFJlY3R8fGUsdGhpcy5fX2RpcnR5JiZuLm5vcm1hbGl6ZVRleHRTdHlsZShyLCEwKTt2YXIgaT1yLnRleHQ7aWYobnVsbCE9aSYmKGkrPSIiKSxuLm5lZWREcmF3VGV4dChpLHIpKXt0LnNhdmUoKTt2YXIgbz10aGlzLnRyYW5zZm9ybTtyLnRyYW5zZm9ybVRleHQ/dGhpcy5zZXRUcmFuc2Zvcm0odCk6byYmKGEuY29weShlKSxhLmFwcGx5VHJhbnNmb3JtKG8pLGU9YSksbi5yZW5kZXJUZXh0KHRoaXMsdCxpLHIsZSksdC5yZXN0b3JlKCl9fX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxyKXt0LmV4cG9ydHM9cigyKS5leHRlbmQoe3R5cGU6ImFyYyIsc2hhcGU6e2N4OjAsY3k6MCxyOjAsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjIqTWF0aC5QSSxjbG9ja3dpc2U6ITB9LHN0eWxlOntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5jeCxuPWUuY3ksaT1NYXRoLm1heChlLnIsMCksYT1lLnN0YXJ0QW5nbGUsbz1lLmVuZEFuZ2xlLHM9ZS5jbG9ja3dpc2UsbD1NYXRoLmNvcyhhKSxoPU1hdGguc2luKGEpO3QubW92ZVRvKGwqaStyLGgqaStuKSx0LmFyYyhyLG4saSxhLG8sIXMpfX0pfSxmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPXQuY3B4MixpPXQuY3B5MjtyZXR1cm4gbnVsbD09PW58fG51bGw9PT1pP1socj9jOmgpKHQueDEsdC5jcHgxLHQuY3B4Mix0LngyLGUpLChyP2M6aCkodC55MSx0LmNweTEsdC5jcHkyLHQueTIsZSldOlsocj91OmwpKHQueDEsdC5jcHgxLHQueDIsZSksKHI/dTpsKSh0LnkxLHQuY3B5MSx0LnkyLGUpXX12YXIgaT1yKDUpLGE9cigzKSxvPWkucXVhZHJhdGljU3ViZGl2aWRlLHM9aS5jdWJpY1N1YmRpdmlkZSxsPWkucXVhZHJhdGljQXQsaD1pLmN1YmljQXQsdT1pLnF1YWRyYXRpY0Rlcml2YXRpdmVBdCxjPWkuY3ViaWNEZXJpdmF0aXZlQXQsZj1bXTt0LmV4cG9ydHM9cigyKS5leHRlbmQoe3R5cGU6ImJlemllci1jdXJ2ZSIsc2hhcGU6e3gxOjAseTE6MCx4MjowLHkyOjAsY3B4MTowLGNweTE6MCxwZXJjZW50OjF9LHN0eWxlOntzdHJva2U6IiMwMDAiLGZpbGw6bnVsbH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS54MSxuPWUueTEsaT1lLngyLGE9ZS55MixsPWUuY3B4MSxoPWUuY3B5MSx1PWUuY3B4MixjPWUuY3B5MixkPWUucGVyY2VudDswIT09ZCYmKHQubW92ZVRvKHIsbiksbnVsbD09dXx8bnVsbD09Yz8oZDwxJiYobyhyLGwsaSxkLGYpLGw9ZlsxXSxpPWZbMl0sbyhuLGgsYSxkLGYpLGg9ZlsxXSxhPWZbMl0pLHQucXVhZHJhdGljQ3VydmVUbyhsLGgsaSxhKSk6KGQ8MSYmKHMocixsLHUsaSxkLGYpLGw9ZlsxXSx1PWZbMl0saT1mWzNdLHMobixoLGMsYSxkLGYpLGg9ZlsxXSxjPWZbMl0sYT1mWzNdKSx0LmJlemllckN1cnZlVG8obCxoLHUsYyxpLGEpKSl9LHBvaW50QXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5zaGFwZSx0LCExKX0sdGFuZ2VudEF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odGhpcy5zaGFwZSx0LCEwKTtyZXR1cm4gYS5ub3JtYWxpemUoZSxlKX19KX0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9cigyKS5leHRlbmQoe3R5cGU6ImNpcmNsZSIsc2hhcGU6e2N4OjAsY3k6MCxyOjB9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUscil7ciYmdC5tb3ZlVG8oZS5jeCtlLnIsZS5jeSksdC5hcmMoZS5jeCxlLmN5LGUuciwwLDIqTWF0aC5QSSwhMCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt0LmV4cG9ydHM9cigyKS5leHRlbmQoe3R5cGU6ImxpbmUiLHNoYXBlOnt4MTowLHkxOjAseDI6MCx5MjowLHBlcmNlbnQ6MX0sc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLngxLG49ZS55MSxpPWUueDIsYT1lLnkyLG89ZS5wZXJjZW50OzAhPT1vJiYodC5tb3ZlVG8ocixuKSxvPDEmJihpPXIqKDEtbykraSpvLGE9biooMS1vKSthKm8pLHQubGluZVRvKGksYSkpfSxwb2ludEF0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2hhcGU7cmV0dXJuW2UueDEqKDEtdCkrZS54Mip0LGUueTEqKDEtdCkrZS55Mip0XX19KX0sZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIoMjIpO3QuZXhwb3J0cz1yKDIpLmV4dGVuZCh7dHlwZToicG9seWdvbiIsc2hhcGU6e3BvaW50czpudWxsLHNtb290aDohMSxzbW9vdGhDb25zdHJhaW50Om51bGx9LGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe24uYnVpbGRQYXRoKHQsZSwhMCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDIyKTt0LmV4cG9ydHM9cigyKS5leHRlbmQoe3R5cGU6InBvbHlsaW5lIixzaGFwZTp7cG9pbnRzOm51bGwsc21vb3RoOiExLHNtb290aENvbnN0cmFpbnQ6bnVsbH0sc3R5bGU6e3N0cm9rZToiIzAwMCIsZmlsbDpudWxsfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXtuLmJ1aWxkUGF0aCh0LGUsITEpfX0pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigyMyk7dC5leHBvcnRzPXIoMikuZXh0ZW5kKHt0eXBlOiJyZWN0IixzaGFwZTp7cjowLHg6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0sYnVpbGRQYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS54LGk9ZS55LGE9ZS53aWR0aCxvPWUuaGVpZ2h0O2Uucj9uLmJ1aWxkUGF0aCh0LGUpOnQucmVjdChyLGksYSxvKSx0LmNsb3NlUGF0aCgpfX0pfSxmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPXIoMikuZXh0ZW5kKHt0eXBlOiJyaW5nIixzaGFwZTp7Y3g6MCxjeTowLHI6MCxyMDowfSxidWlsZFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmN4LG49ZS5jeSxpPTIqTWF0aC5QSTt0Lm1vdmVUbyhyK2UucixuKSx0LmFyYyhyLG4sZS5yLDAsaSwhMSksdC5tb3ZlVG8ocitlLnIwLG4pLHQuYXJjKHIsbixlLnIwLDAsaSwhMCl9fSl9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yKDIpLGk9cig2MSk7dC5leHBvcnRzPW4uZXh0ZW5kKHt0eXBlOiJzZWN0b3IiLHNoYXBlOntjeDowLGN5OjAscjA6MCxyOjAsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjIqTWF0aC5QSSxjbG9ja3dpc2U6ITB9LGJydXNoOmkobi5wcm90b3R5cGUuYnJ1c2gpLGJ1aWxkUGF0aDpmdW5jdGlvbih0LGUpe3ZhciByPWUuY3gsbj1lLmN5LGk9TWF0aC5tYXgoZS5yMHx8MCwwKSxhPU1hdGgubWF4KGUuciwwKSxvPWUuc3RhcnRBbmdsZSxzPWUuZW5kQW5nbGUsbD1lLmNsb2Nrd2lzZSxoPU1hdGguY29zKG8pLHU9TWF0aC5zaW4obyk7dC5tb3ZlVG8oaCppK3IsdSppK24pLHQubGluZVRvKGgqYStyLHUqYStuKSx0LmFyYyhyLG4sYSxvLHMsIWwpLHQubGluZVRvKE1hdGguY29zKHMpKmkrcixNYXRoLnNpbihzKSppK24pLDAhPT1pJiZ0LmFyYyhyLG4saSxzLG8sbCksdC5jbG9zZVBhdGgoKX19KX0sZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDQxKSxpPXIoMSksYT1pLmlzU3RyaW5nLG89aS5pc0Z1bmN0aW9uLHM9aS5pc09iamVjdCxsPXIoNTMpLGg9ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdG9ycz1bXX07aC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmgsYW5pbWF0ZTpmdW5jdGlvbih0LGUpe3ZhciByLGE9ITEsbz10aGlzLHM9dGhpcy5fX3pyO2lmKHQpe3ZhciBoPXQuc3BsaXQoIi4iKSx1PW87YT0ic2hhcGUiPT09aFswXTtmb3IodmFyIGM9MCxmPWgubGVuZ3RoO2M8ZjtjKyspdSYmKHU9dVtoW2NdXSk7dSYmKHI9dSl9ZWxzZSByPW87aWYoIXIpcmV0dXJuIHZvaWQgbCgnUHJvcGVydHkgIicrdCsnIiBpcyBub3QgZXhpc3RlZCBpbiBlbGVtZW50ICcrby5pZCk7dmFyIGQ9by5hbmltYXRvcnMscD1uZXcgbihyLGUpO3JldHVybiBwLmR1cmluZyhmdW5jdGlvbih0KXtvLmRpcnR5KGEpfSkuZG9uZShmdW5jdGlvbigpe2Quc3BsaWNlKGkuaW5kZXhPZihkLHApLDEpfSksZC5wdXNoKHApLHMmJnMuYW5pbWF0aW9uLmFkZEFuaW1hdG9yKHApLHB9LHN0b3BBbmltYXRpb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYW5pbWF0b3JzLHI9ZS5sZW5ndGgsbj0wO248cjtuKyspZVtuXS5zdG9wKHQpO3JldHVybiBlLmxlbmd0aD0wLHRoaXN9LGFuaW1hdGVUbzpmdW5jdGlvbih0LGUscixuLGkscyl7ZnVuY3Rpb24gbCgpe3UtLSx1fHxpJiZpKCl9YShyKT8oaT1uLG49cixyPTApOm8obik/KGk9bixuPSJsaW5lYXIiLHI9MCk6byhyKT8oaT1yLHI9MCk6byhlKT8oaT1lLGU9NTAwKTplfHwoZT01MDApLHRoaXMuc3RvcEFuaW1hdGlvbigpLHRoaXMuX2FuaW1hdGVUb1NoYWxsb3coIiIsdGhpcyx0LGUscixuLGkpO3ZhciBoPXRoaXMuYW5pbWF0b3JzLnNsaWNlKCksdT1oLmxlbmd0aDt1fHxpJiZpKCk7Zm9yKHZhciBjPTA7YzxoLmxlbmd0aDtjKyspaFtjXS5kb25lKGwpLnN0YXJ0KG4scyl9LF9hbmltYXRlVG9TaGFsbG93OmZ1bmN0aW9uKHQsZSxyLG4sYSl7dmFyIG89e30sbD0wO2Zvcih2YXIgaCBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoaCkpaWYobnVsbCE9ZVtoXSlzKHJbaF0pJiYhaS5pc0FycmF5TGlrZShyW2hdKT90aGlzLl9hbmltYXRlVG9TaGFsbG93KHQ/dCsiLiIraDpoLGVbaF0scltoXSxuLGEpOihvW2hdPXJbaF0sbCsrKTtlbHNlIGlmKG51bGwhPXJbaF0paWYodCl7dmFyIHU9e307dVt0XT17fSx1W3RdW2hdPXJbaF0sdGhpcy5hdHRyKHUpfWVsc2UgdGhpcy5hdHRyKGgscltoXSk7cmV0dXJuIGw+MCYmdGhpcy5hbmltYXRlKHQsITEpLndoZW4obnVsbD09bj81MDA6bixvKS5kZWxheShhfHwwKSx0aGlzfX0sdC5leHBvcnRzPWh9LGZ1bmN0aW9uKHQsZSl7dmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLG49ZnVuY3Rpb24oKXt0aGlzLl8kaGFuZGxlcnM9e319O24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuLG9uZTpmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fJGhhbmRsZXJzO2lmKCFlfHwhdClyZXR1cm4gdGhpcztuW3RdfHwoblt0XT1bXSk7Zm9yKHZhciBpPTA7aTxuW3RdLmxlbmd0aDtpKyspaWYoblt0XVtpXS5oPT09ZSlyZXR1cm4gdGhpcztyZXR1cm4gblt0XS5wdXNoKHtoOmUsb25lOiEwLGN0eDpyfHx0aGlzfSksdGhpc30sb246ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuXyRoYW5kbGVycztpZighZXx8IXQpcmV0dXJuIHRoaXM7blt0XXx8KG5bdF09W10pO2Zvcih2YXIgaT0wO2k8blt0XS5sZW5ndGg7aSsrKWlmKG5bdF1baV0uaD09PWUpcmV0dXJuIHRoaXM7cmV0dXJuIG5bdF0ucHVzaCh7aDplLG9uZTohMSxjdHg6cnx8dGhpc30pLHRoaXN9LGlzU2lsZW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuXyRoYW5kbGVycztyZXR1cm4gZVt0XSYmZVt0XS5sZW5ndGh9LG9mZjpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuXyRoYW5kbGVycztpZighdClyZXR1cm4gdGhpcy5fJGhhbmRsZXJzPXt9LHRoaXM7aWYoZSl7aWYoclt0XSl7Zm9yKHZhciBuPVtdLGk9MCxhPXJbdF0ubGVuZ3RoO2k8YTtpKyspclt0XVtpXS5oIT1lJiZuLnB1c2goclt0XVtpXSk7clt0XT1ufXJbdF0mJjA9PT1yW3RdLmxlbmd0aCYmZGVsZXRlIHJbdF19ZWxzZSBkZWxldGUgclt0XTtyZXR1cm4gdGhpc30sdHJpZ2dlcjpmdW5jdGlvbih0KXtpZih0aGlzLl8kaGFuZGxlcnNbdF0pe3ZhciBlPWFyZ3VtZW50cyxuPWUubGVuZ3RoO24+MyYmKGU9ci5jYWxsKGUsMSkpO2Zvcih2YXIgaT10aGlzLl8kaGFuZGxlcnNbdF0sYT1pLmxlbmd0aCxvPTA7bzxhOyl7c3dpdGNoKG4pe2Nhc2UgMTppW29dLmguY2FsbChpW29dLmN0eCk7YnJlYWs7Y2FzZSAyOmlbb10uaC5jYWxsKGlbb10uY3R4LGVbMV0pO2JyZWFrO2Nhc2UgMzppW29dLmguY2FsbChpW29dLmN0eCxlWzFdLGVbMl0pO2JyZWFrO2RlZmF1bHQ6aVtvXS5oLmFwcGx5KGlbb10uY3R4LGUpfWlbb10ub25lPyhpLnNwbGljZShvLDEpLGEtLSk6bysrfX1yZXR1cm4gdGhpc30sdHJpZ2dlcldpdGhDb250ZXh0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuXyRoYW5kbGVyc1t0XSl7dmFyIGU9YXJndW1lbnRzLG49ZS5sZW5ndGg7bj40JiYoZT1yLmNhbGwoZSwxLGUubGVuZ3RoLTEpKTtmb3IodmFyIGk9ZVtlLmxlbmd0aC0xXSxhPXRoaXMuXyRoYW5kbGVyc1t0XSxvPWEubGVuZ3RoLHM9MDtzPG87KXtzd2l0Y2gobil7Y2FzZSAxOmFbc10uaC5jYWxsKGkpO2JyZWFrO2Nhc2UgMjphW3NdLmguY2FsbChpLGVbMV0pO2JyZWFrO2Nhc2UgMzphW3NdLmguY2FsbChpLGVbMV0sZVsyXSk7YnJlYWs7ZGVmYXVsdDphW3NdLmguYXBwbHkoaSxlKX1hW3NdLm9uZT8oYS5zcGxpY2UocywxKSxvLS0pOnMrK319cmV0dXJuIHRoaXN9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbixpLGEsbyxzLGwsaCxwKXt2YXIgbT1sKihkLzE4MCkseD1mKG0pKih0LXIpLzIrYyhtKSooZS1uKS8yLHk9LTEqYyhtKSoodC1yKS8yK2YobSkqKGUtbikvMixfPXgqeC8obypvKSt5KnkvKHMqcyk7Xz4xJiYobyo9dShfKSxzKj11KF8pKTt2YXIgdz0oaT09PWE/LTE6MSkqdSgobypvKihzKnMpLW8qbyooeSp5KS1zKnMqKHgqeCkpLyhvKm8qKHkqeSkrcypzKih4KngpKSl8fDAsYj13Km8qeS9zLFM9dyotcyp4L28sVD0odCtyKS8yK2YobSkqYi1jKG0pKlMsTT0oZStuKS8yK2MobSkqYitmKG0pKlMsUD12KFsxLDBdLFsoeC1iKS9vLCh5LVMpL3NdKSxrPVsoeC1iKS9vLCh5LVMpL3NdLEM9WygtMSp4LWIpL28sKC0xKnktUykvc10sST12KGssQyk7ZyhrLEMpPD0tMSYmKEk9ZCksZyhrLEMpPj0xJiYoST0wKSwwPT09YSYmST4wJiYoSS09MipkKSwxPT09YSYmSTwwJiYoSSs9MipkKSxwLmFkZERhdGEoaCxULE0sbyxzLFAsSSxtLGEpfWZ1bmN0aW9uIGkodCl7aWYoIXQpcmV0dXJuW107dmFyIGUscj10LnJlcGxhY2UoLy0vZywiIC0iKS5yZXBsYWNlKC8gIC9nLCIgIikucmVwbGFjZSgvIC9nLCIsIikucmVwbGFjZSgvLCwvZywiLCIpO2ZvcihlPTA7ZTxoLmxlbmd0aDtlKyspcj1yLnJlcGxhY2UobmV3IFJlZ0V4cChoW2VdLCJnIiksInwiK2hbZV0pO3ZhciBpLGE9ci5zcGxpdCgifCIpLG89MCxsPTAsdT1uZXcgcyxjPXMuQ01EO2ZvcihlPTE7ZTxhLmxlbmd0aDtlKyspe3ZhciBmLGQ9YVtlXSxwPWQuY2hhckF0KDApLGc9MCx2PWQuc2xpY2UoMSkucmVwbGFjZSgvZSwtL2csImUtIikuc3BsaXQoIiwiKTt2Lmxlbmd0aD4wJiYiIj09PXZbMF0mJnYuc2hpZnQoKTtmb3IodmFyIG09MDttPHYubGVuZ3RoO20rKyl2W21dPXBhcnNlRmxvYXQodlttXSk7Zm9yKDtnPHYubGVuZ3RoJiYhaXNOYU4odltnXSkmJiFpc05hTih2WzBdKTspe3ZhciB4LHksXyx3LGIsUyxULE09byxQPWw7c3dpdGNoKHApe2Nhc2UibCI6bys9dltnKytdLGwrPXZbZysrXSxmPWMuTCx1LmFkZERhdGEoZixvLGwpO2JyZWFrO2Nhc2UiTCI6bz12W2crK10sbD12W2crK10sZj1jLkwsdS5hZGREYXRhKGYsbyxsKTticmVhaztjYXNlIm0iOm8rPXZbZysrXSxsKz12W2crK10sZj1jLk0sdS5hZGREYXRhKGYsbyxsKSxwPSJsIjticmVhaztjYXNlIk0iOm89dltnKytdLGw9dltnKytdLGY9Yy5NLHUuYWRkRGF0YShmLG8sbCkscD0iTCI7YnJlYWs7Y2FzZSJoIjpvKz12W2crK10sZj1jLkwsdS5hZGREYXRhKGYsbyxsKTticmVhaztjYXNlIkgiOm89dltnKytdLGY9Yy5MLHUuYWRkRGF0YShmLG8sbCk7YnJlYWs7Y2FzZSJ2IjpsKz12W2crK10sZj1jLkwsdS5hZGREYXRhKGYsbyxsKTticmVhaztjYXNlIlYiOmw9dltnKytdLGY9Yy5MLHUuYWRkRGF0YShmLG8sbCk7YnJlYWs7Y2FzZSJDIjpmPWMuQyx1LmFkZERhdGEoZix2W2crK10sdltnKytdLHZbZysrXSx2W2crK10sdltnKytdLHZbZysrXSksbz12W2ctMl0sbD12W2ctMV07YnJlYWs7Y2FzZSJjIjpmPWMuQyx1LmFkZERhdGEoZix2W2crK10rbyx2W2crK10rbCx2W2crK10rbyx2W2crK10rbCx2W2crK10rbyx2W2crK10rbCksbys9dltnLTJdLGwrPXZbZy0xXTticmVhaztjYXNlIlMiOng9byx5PWw7dmFyIGs9dS5sZW4oKSxDPXUuZGF0YTtpPT09Yy5DJiYoeCs9by1DW2stNF0seSs9bC1DW2stM10pLGY9Yy5DLE09dltnKytdLFA9dltnKytdLG89dltnKytdLGw9dltnKytdLHUuYWRkRGF0YShmLHgseSxNLFAsbyxsKTticmVhaztjYXNlInMiOng9byx5PWw7dmFyIGs9dS5sZW4oKSxDPXUuZGF0YTtpPT09Yy5DJiYoeCs9by1DW2stNF0seSs9bC1DW2stM10pLGY9Yy5DLE09byt2W2crK10sUD1sK3ZbZysrXSxvKz12W2crK10sbCs9dltnKytdLHUuYWRkRGF0YShmLHgseSxNLFAsbyxsKTticmVhaztjYXNlIlEiOk09dltnKytdLFA9dltnKytdLG89dltnKytdLGw9dltnKytdLGY9Yy5RLHUuYWRkRGF0YShmLE0sUCxvLGwpO2JyZWFrO2Nhc2UicSI6TT12W2crK10rbyxQPXZbZysrXStsLG8rPXZbZysrXSxsKz12W2crK10sZj1jLlEsdS5hZGREYXRhKGYsTSxQLG8sbCk7YnJlYWs7Y2FzZSJUIjp4PW8seT1sO3ZhciBrPXUubGVuKCksQz11LmRhdGE7aT09PWMuUSYmKHgrPW8tQ1trLTRdLHkrPWwtQ1trLTNdKSxvPXZbZysrXSxsPXZbZysrXSxmPWMuUSx1LmFkZERhdGEoZix4LHksbyxsKTticmVhaztjYXNlInQiOng9byx5PWw7dmFyIGs9dS5sZW4oKSxDPXUuZGF0YTtpPT09Yy5RJiYoeCs9by1DW2stNF0seSs9bC1DW2stM10pLG8rPXZbZysrXSxsKz12W2crK10sZj1jLlEsdS5hZGREYXRhKGYseCx5LG8sbCk7YnJlYWs7Y2FzZSJBIjpfPXZbZysrXSx3PXZbZysrXSxiPXZbZysrXSxTPXZbZysrXSxUPXZbZysrXSxNPW8sUD1sLG89dltnKytdLGw9dltnKytdLGY9Yy5BLG4oTSxQLG8sbCxTLFQsXyx3LGIsZix1KTticmVhaztjYXNlImEiOl89dltnKytdLHc9dltnKytdLGI9dltnKytdLFM9dltnKytdLFQ9dltnKytdLE09byxQPWwsbys9dltnKytdLGwrPXZbZysrXSxmPWMuQSxuKE0sUCxvLGwsUyxULF8sdyxiLGYsdSl9fSJ6IiE9PXAmJiJaIiE9PXB8fChmPWMuWix1LmFkZERhdGEoZikpLGk9Zn1yZXR1cm4gdS50b1N0YXRpYygpLHV9ZnVuY3Rpb24gYSh0LGUpe3ZhciByPWkodCk7cmV0dXJuIGU9ZXx8e30sZS5idWlsZFBhdGg9ZnVuY3Rpb24odCl7aWYodC5zZXREYXRhKXt0LnNldERhdGEoci5kYXRhKTt2YXIgZT10LmdldENvbnRleHQoKTtlJiZ0LnJlYnVpbGRQYXRoKGUpfWVsc2V7dmFyIGU9dDtyLnJlYnVpbGRQYXRoKGUpfX0sZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbih0KXtsKHIsdCksdGhpcy5kaXJ0eSghMCl9LGV9dmFyIG89cigyKSxzPXIoNyksbD1yKDc3KSxoPVsibSIsIk0iLCJsIiwiTCIsInYiLCJWIiwiaCIsIkgiLCJ6IiwiWiIsImMiLCJDIiwicSIsIlEiLCJ0IiwiVCIsInMiLCJTIiwiYSIsIkEiXSx1PU1hdGguc3FydCxjPU1hdGguc2luLGY9TWF0aC5jb3MsZD1NYXRoLlBJLHA9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKX0sZz1mdW5jdGlvbih0LGUpe3JldHVybih0WzBdKmVbMF0rdFsxXSplWzFdKS8ocCh0KSpwKGUpKX0sdj1mdW5jdGlvbih0LGUpe3JldHVybih0WzBdKmVbMV08dFsxXSplWzBdPy0xOjEpKk1hdGguYWNvcyhnKHQsZSkpfTt0LmV4cG9ydHM9e2NyZWF0ZUZyb21TdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG8oYSh0LGUpKX0sZXh0ZW5kRnJvbVN0cmluZzpmdW5jdGlvbih0LGUpe3JldHVybiBvLmV4dGVuZChhKHQsZSkpfSxtZXJnZVBhdGg6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9W10sbj10Lmxlbmd0aCxpPTA7aTxuO2krKyl7dmFyIGE9dFtpXTthLnBhdGh8fGEuY3JlYXRlUGF0aFByb3h5KCksYS5fX2RpcnR5UGF0aCYmYS5idWlsZFBhdGgoYS5wYXRoLGEuc2hhcGUsITApLHIucHVzaChhLnBhdGgpfXZhciBzPW5ldyBvKGUpO3JldHVybiBzLmNyZWF0ZVBhdGhQcm94eSgpLHMuYnVpbGRQYXRoPWZ1bmN0aW9uKHQpe3QuYXBwZW5kUGF0aChyKTt2YXIgZT10LmdldENvbnRleHQoKTtlJiZ0LnJlYnVpbGRQYXRoKGUpfSxzfX19LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHIsbixhLHUsYyxmLGQ9dC5kYXRhLHA9aS5NLGc9aS5DLHY9aS5MLG09aS5SLHg9aS5BLHk9aS5RO2ZvcihhPTAsdT0wO2E8ZC5sZW5ndGg7KXtzd2l0Y2gocj1kW2ErK10sdT1hLG49MCxyKXtjYXNlIHA6bj0xO2JyZWFrO2Nhc2UgdjpuPTE7YnJlYWs7Y2FzZSBnOm49MzticmVhaztjYXNlIHk6bj0yO2JyZWFrO2Nhc2UgeDp2YXIgXz1lWzRdLHc9ZVs1XSxiPWwoZVswXSplWzBdK2VbMV0qZVsxXSksUz1sKGVbMl0qZVsyXStlWzNdKmVbM10pLFQ9aCgtZVsxXS9TLGVbMF0vYik7ZFthXSo9YixkW2ErK10rPV8sZFthXSo9UyxkW2ErK10rPXcsZFthKytdKj1iLGRbYSsrXSo9UyxkW2ErK10rPVQsZFthKytdKz1ULGErPTIsdT1hO2JyZWFrO2Nhc2UgbTpmWzBdPWRbYSsrXSxmWzFdPWRbYSsrXSxvKGYsZixlKSxkW3UrK109ZlswXSxkW3UrK109ZlsxXSxmWzBdKz1kW2ErK10sZlsxXSs9ZFthKytdLG8oZixmLGUpLGRbdSsrXT1mWzBdLGRbdSsrXT1mWzFdfWZvcihjPTA7YzxuO2MrKyl7dmFyIGY9c1tjXTtmWzBdPWRbYSsrXSxmWzFdPWRbYSsrXSxvKGYsZixlKSxkW3UrK109ZlswXSxkW3UrK109ZlsxXX19fXZhciBpPXIoNykuQ01ELGE9cigzKSxvPWEuYXBwbHlUcmFuc2Zvcm0scz1bW10sW10sW11dLGw9TWF0aC5zcXJ0LGg9TWF0aC5hdGFuMjt0LmV4cG9ydHM9bn1dKX0pOwo="}},"time_used":714,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":416,"receive":298,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/vc_round_chart.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.313Z","timestamp":1785147795313,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/vc_round_chart.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:38 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 674\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1657,"size_decoded":1217,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (1657), with no line terminators","md5":"2ae3362ee0683081b617e0af326a7d4a","sha1":"a1145fdb7f0b69079ddb88d958073df13b595c71","sha256":"66084728357a56cef8f76c30e1b67639826c35f0a431567767e8b817e21be765","sha512":"c2bdae710ba490352168d556e5a30b1b02c29b81eb779c9a48f0e837a21fdfc2f11301ba1deab4acca252bae646b55423590c4c2e6a48c427c6fd99dd67dc1d3","ssdeep":"","tlshash":"ff31ebe5f1202caab2a722ab462f7399d323b17d0e523109715094fc492a81f353aa3d","first_seen":"2024-11-15T12:33:52.384084Z","last_seen":"2026-08-11T00:25:55.168062Z","times_seen":36,"resource_available":true,"data":"IWZ1bmN0aW9uKCQpeyQuZm4udmNSb3VuZENoYXJ0PWZ1bmN0aW9uKCl7dmFyIHdheXBvaW50PXZvaWQgMCE9PSQuZm4ud2F5cG9pbnQ7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Z1bmN0aW9uIGFkZGNoYXJ0KCl7JHRoaXMuZGF0YSgiYW5pbWF0ZWQiKXx8KGNoYXJ0PSJkb3VnaG51dCI9PT0kdGhpcy5kYXRhKCJ2Y1R5cGUiKT9uZXcgQ2hhcnQoY3R4KS5Eb3VnaG51dChkYXRhLG9wdGlvbnMpOm5ldyBDaGFydChjdHgpLlBpZShkYXRhLG9wdGlvbnMpLCR0aGlzLmRhdGEoInZjQ2hhcnRJZCIsY2hhcnQuaWQpLCR0aGlzLmRhdGEoImNoYXJ0IixjaGFydCksJHRoaXMuZGF0YSgiYW5pbWF0ZWQiLCEwKSl9dmFyIGRhdGEsZ3JhZGllbnQsY2hhcnQsaSxqLCR0aGlzPSQodGhpcyksY3R4PSR0aGlzLmZpbmQoImNhbnZhcyIpWzBdLmdldENvbnRleHQoIjJkIiksc3Ryb2tlX3dpZHRoPSR0aGlzLmRhdGEoInZjU3Ryb2tlV2lkdGgiKT9wYXJzZUludCgkdGhpcy5kYXRhKCJ2Y1N0cm9rZVdpZHRoIiksMTApOjAsb3B0aW9ucz17c2hvd1Rvb2x0aXBzOiR0aGlzLmRhdGEoInZjVG9vbHRpcHMiKSxhbmltYXRpb25FYXNpbmc6JHRoaXMuZGF0YSgidmNBbmltYXRpb24iKSxzZWdtZW50U3Ryb2tlQ29sb3I6JHRoaXMuZGF0YSgidmNTdHJva2VDb2xvciIpLHNlZ21lbnRTaG93U3Ryb2tlOjAhPT1zdHJva2Vfd2lkdGgsc2VnbWVudFN0cm9rZVdpZHRoOnN0cm9rZV93aWR0aCxyZXNwb25zaXZlOiEwfSxjb2xvcl9rZXlzPVsiY29sb3IiLCJoaWdobGlnaHQiXTtmb3IoJHRoaXMuZGF0YSgiY2hhcnQiKSYmKCR0aGlzLmRhdGEoImNoYXJ0IikuZGVzdHJveSgpLCR0aGlzLnJlbW92ZURhdGEoImFuaW1hdGVkIikpLGRhdGE9JHRoaXMuZGF0YSgidmNWYWx1ZXMiKSxjdHguY2FudmFzLndpZHRoPSR0aGlzLndpZHRoKCksY3R4LmNhbnZhcy5oZWlnaHQ9JHRoaXMud2lkdGgoKSxpPWRhdGEubGVuZ3RoLTE7MDw9aTtpLS0pZm9yKGo9Y29sb3Jfa2V5cy5sZW5ndGgtMTswPD1qO2otLSkib2JqZWN0Ij09dHlwZW9mIGRhdGFbaV1bY29sb3Jfa2V5c1tqXV0mJjI9PT1kYXRhW2ldW2NvbG9yX2tleXNbal1dLmxlbmd0aCYmKGdyYWRpZW50PWN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLDAsMCxjdHguY2FudmFzLmhlaWdodCksZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDAsZGF0YVtpXVtjb2xvcl9rZXlzW2pdXVswXSksZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDEsZGF0YVtpXVtjb2xvcl9rZXlzW2pdXVsxXSksZGF0YVtpXVtjb2xvcl9rZXlzW2pdXT1ncmFkaWVudCk7d2F5cG9pbnQ/JHRoaXMud2F5cG9pbnQoJC5wcm94eShhZGRjaGFydCwkdGhpcykse29mZnNldDoiODUlIn0pOmFkZGNoYXJ0KCl9KSx0aGlzfSwiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LnZjX3JvdW5kX2NoYXJ0cyYmKHdpbmRvdy52Y19yb3VuZF9jaGFydHM9ZnVuY3Rpb24obW9kZWxfaWQpe3ZhciBzZWxlY3Rvcj0iLnZjX3JvdW5kLWNoYXJ0Ijt2b2lkIDAhPT1tb2RlbF9pZCYmKHNlbGVjdG9yPSdbZGF0YS1tb2RlbC1pZD0iJyttb2RlbF9pZCsnIl0gJytzZWxlY3RvciksJChzZWxlY3RvcikudmNSb3VuZENoYXJ0KCl9KSwkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeyF3aW5kb3cudmNfaWZyYW1lJiZ2Y19yb3VuZF9jaGFydHMoKX0pfShqUXVlcnkpOw=="}},"time_used":566,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":566,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/video.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.315Z","timestamp":1785147795315,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/video.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:40 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 154865\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":708812,"size_decoded":155411,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (489)","md5":"647d4c22d6fbe8941186b2001bf49d53","sha1":"e15a33a5b099648fbc1208215a3c1104666ee705","sha256":"f6f9685a8224763d2a745399f4b521661e46fd262030124833ce0485680eb007","sha512":"defec4676ce99f05c00422b240d129aa3e3ac7d0ae98d6c6853a8541c861d3be1f1e2e288250a3b4bb5522380a5911b71693ecdddcf1a2aa18681429a7dc1dc3","ssdeep":"12288:v5hjAxEMjK+CJuwnnp5iXIlP3f3CkabJ7bQKe7n5cDFMnhfF+E323HkLIc0p7kaQ:jjAxEMjK9tywabJ7bQKxjkLIc05k1Jbn","tlshash":"4de4d84975f923b1446360b8178f61c8f238812f511ad988bc9ee7e81fd5a3447faee4","first_seen":"2025-06-25T11:59:30.699376Z","last_seen":"2026-08-11T00:25:55.204912Z","times_seen":21,"resource_available":true,"data":"LyoqCiAqIEBsaWNlbnNlCiAqIFZpZGVvLmpzIDYuNi4zIDxodHRwOi8vdmlkZW9qcy5jb20vPgogKiBDb3B5cmlnaHQgQnJpZ2h0Y292ZSwgSW5jLiA8aHR0cHM6Ly93d3cuYnJpZ2h0Y292ZS5jb20vPgogKiBBdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAKICogPGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0U+CiAqCiAqIEluY2x1ZGVzIHZ0dC5qcyA8aHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvdnR0LmpzPgogKiBBdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAKICogPGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3Z0dC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFPgogKi8KCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7Cgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6Cgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOgoJKGdsb2JhbC52aWRlb2pzID0gZmFjdG9yeSgpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKCkgewoKdmFyIHZlcnNpb24gPSAiNi42LjMiOwoKdmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCgoKCgpmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7CglyZXR1cm4gbW9kdWxlID0geyBleHBvcnRzOiB7fSB9LCBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7Cn0KCnZhciB3aW47CgppZiAodHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgIHdpbiA9IHdpbmRvdzsKfSBlbHNlIGlmICh0eXBlb2YgY29tbW9uanNHbG9iYWwgIT09ICJ1bmRlZmluZWQiKSB7CiAgICB3aW4gPSBjb21tb25qc0dsb2JhbDsKfSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIpewogICAgd2luID0gc2VsZjsKfSBlbHNlIHsKICAgIHdpbiA9IHt9Owp9Cgp2YXIgd2luZG93XzEgPSB3aW47Cgp2YXIgZW1wdHkgPSB7fTsKCgp2YXIgZW1wdHkkMSA9IChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkoewoJJ2RlZmF1bHQnOiBlbXB0eQp9KTsKCnZhciBtaW5Eb2MgPSAoIGVtcHR5JDEgJiYgZW1wdHkgKSB8fCBlbXB0eSQxOwoKdmFyIHRvcExldmVsID0gdHlwZW9mIGNvbW1vbmpzR2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGNvbW1vbmpzR2xvYmFsIDoKICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge307CgoKdmFyIGRvY2N5OwoKaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIGRvY2N5ID0gZG9jdW1lbnQ7Cn0gZWxzZSB7CiAgICBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107CgogICAgaWYgKCFkb2NjeSkgewogICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYzsKICAgIH0KfQoKdmFyIGRvY3VtZW50XzEgPSBkb2NjeTsKCi8qKgogKiBAZmlsZSBicm93c2VyLmpzCiAqIEBtb2R1bGUgYnJvd3NlcgogKi8KdmFyIFVTRVJfQUdFTlQgPSB3aW5kb3dfMS5uYXZpZ2F0b3IgJiYgd2luZG93XzEubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJzsKdmFyIHdlYmtpdFZlcnNpb25NYXAgPSAvQXBwbGVXZWJLaXRcLyhbXGQuXSspL2kuZXhlYyhVU0VSX0FHRU5UKTsKdmFyIGFwcGxlV2Via2l0VmVyc2lvbiA9IHdlYmtpdFZlcnNpb25NYXAgPyBwYXJzZUZsb2F0KHdlYmtpdFZlcnNpb25NYXAucG9wKCkpIDogbnVsbDsKCi8qCiAqIERldmljZSBpcyBhbiBpUGhvbmUKICoKICogQHR5cGUge0Jvb2xlYW59CiAqIEBjb25zdGFudAogKiBAcHJpdmF0ZQogKi8KdmFyIElTX0lQQUQgPSAvaVBhZC9pLnRlc3QoVVNFUl9BR0VOVCk7CgovLyBUaGUgRmFjZWJvb2sgYXBwJ3MgVUlXZWJWaWV3IGlkZW50aWZpZXMgYXMgYm90aCBhbiBpUGhvbmUgYW5kIGlQYWQsIHNvCi8vIHRvIGlkZW50aWZ5IGlQaG9uZXMsIHdlIG5lZWQgdG8gZXhjbHVkZSBpUGFkcy4KLy8gaHR0cDovL2FydHN5LmdpdGh1Yi5pby9ibG9nLzIwMTIvMTAvMTgvdGhlLXBlcmlscy1vZi1pb3MtdXNlci1hZ2VudC1zbmlmZmluZy8KdmFyIElTX0lQSE9ORSA9IC9pUGhvbmUvaS50ZXN0KFVTRVJfQUdFTlQpICYmICFJU19JUEFEOwp2YXIgSVNfSVBPRCA9IC9pUG9kL2kudGVzdChVU0VSX0FHRU5UKTsKdmFyIElTX0lPUyA9IElTX0lQSE9ORSB8fCBJU19JUEFEIHx8IElTX0lQT0Q7Cgp2YXIgSU9TX1ZFUlNJT04gPSBmdW5jdGlvbiAoKSB7CiAgdmFyIG1hdGNoID0gVVNFUl9BR0VOVC5tYXRjaCgvT1MgKFxkKylfL2kpOwoKICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHsKICAgIHJldHVybiBtYXRjaFsxXTsKICB9CiAgcmV0dXJuIG51bGw7Cn0oKTsKCnZhciBJU19BTkRST0lEID0gL0FuZHJvaWQvaS50ZXN0KFVTRVJfQUdFTlQpOwp2YXIgQU5EUk9JRF9WRVJTSU9OID0gZnVuY3Rpb24gKCkgewogIC8vIFRoaXMgbWF0Y2hlcyBBbmRyb2lkIE1ham9yLk1pbm9yLlBhdGNoIHZlcnNpb25zCiAgLy8gQU5EUk9JRF9WRVJTSU9OIGlzIE1ham9yLk1pbm9yIGFzIGEgTnVtYmVyLCBpZiBNaW5vciBpc24ndCBhdmFpbGFibGUsIHRoZW4gb25seSBNYWpvciBpcyByZXR1cm5lZAogIHZhciBtYXRjaCA9IFVTRVJfQUdFTlQubWF0Y2goL0FuZHJvaWQgKFxkKykoPzpcLihcZCspKT8oPzpcLihcZCspKSovaSk7CgogIGlmICghbWF0Y2gpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgdmFyIG1ham9yID0gbWF0Y2hbMV0gJiYgcGFyc2VGbG9hdChtYXRjaFsxXSk7CiAgdmFyIG1pbm9yID0gbWF0Y2hbMl0gJiYgcGFyc2VGbG9hdChtYXRjaFsyXSk7CgogIGlmIChtYWpvciAmJiBtaW5vcikgewogICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMV0gKyAnLicgKyBtYXRjaFsyXSk7CiAgfSBlbHNlIGlmIChtYWpvcikgewogICAgcmV0dXJuIG1ham9yOwogIH0KICByZXR1cm4gbnVsbDsKfSgpOwoKLy8gT2xkIEFuZHJvaWQgaXMgZGVmaW5lZCBhcyBWZXJzaW9uIG9sZGVyIHRoYW4gMi4zLCBhbmQgcmVxdWlyaW5nIGEgd2Via2l0IHZlcnNpb24gb2YgdGhlIGFuZHJvaWQgYnJvd3Nlcgp2YXIgSVNfT0xEX0FORFJPSUQgPSBJU19BTkRST0lEICYmIC93ZWJraXQvaS50ZXN0KFVTRVJfQUdFTlQpICYmIEFORFJPSURfVkVSU0lPTiA8IDIuMzsKdmFyIElTX05BVElWRV9BTkRST0lEID0gSVNfQU5EUk9JRCAmJiBBTkRST0lEX1ZFUlNJT04gPCA1ICYmIGFwcGxlV2Via2l0VmVyc2lvbiA8IDUzNzsKCnZhciBJU19GSVJFRk9YID0gL0ZpcmVmb3gvaS50ZXN0KFVTRVJfQUdFTlQpOwp2YXIgSVNfRURHRSA9IC9FZGdlL2kudGVzdChVU0VSX0FHRU5UKTsKdmFyIElTX0NIUk9NRSA9ICFJU19FREdFICYmIC9DaHJvbWUvaS50ZXN0KFVTRVJfQUdFTlQpOwp2YXIgQ0hST01FX1ZFUlNJT04gPSBmdW5jdGlvbiAoKSB7CiAgdmFyIG1hdGNoID0gVVNFUl9BR0VOVC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pOwoKICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHsKICAgIHJldHVybiBwYXJzZUZsb2F0KG1hdGNoWzFdKTsKICB9CiAgcmV0dXJuIG51bGw7Cn0oKTsKdmFyIElTX0lFOCA9IC9NU0lFXHM4XC4wLy50ZXN0KFVTRVJfQUdFTlQpOwp2YXIgSUVfVkVSU0lPTiA9IGZ1bmN0aW9uICgpIHsKICB2YXIgcmVzdWx0ID0gL01TSUVccyhcZCspXC5cZC8uZXhlYyhVU0VSX0FHRU5UKTsKICB2YXIgdmVyc2lvbiA9IHJlc3VsdCAmJiBwYXJzZUZsb2F0KHJlc3VsdFsxXSk7CgogIGlmICghdmVyc2lvbiAmJiAvVHJpZGVudFwvNy4wL2kudGVzdChVU0VSX0FHRU5UKSAmJiAvcnY6MTEuMC8udGVzdChVU0VSX0FHRU5UKSkgewogICAgLy8gSUUgMTEgaGFzIGEgZGlmZmVyZW50IHVzZXIgYWdlbnQgc3RyaW5nIHRoYW4gb3RoZXIgSUUgdmVyc2lvbnMKICAgIHZlcnNpb24gPSAxMS4wOwogIH0KCiAgcmV0dXJuIHZlcnNpb247Cn0oKTsKCnZhciBJU19TQUZBUkkgPSAvU2FmYXJpL2kudGVzdChVU0VSX0FHRU5UKSAmJiAhSVNfQ0hST01FICYmICFJU19BTkRST0lEICYmICFJU19FREdFOwp2YXIgSVNfQU5ZX1NBRkFSSSA9IElTX1NBRkFSSSB8fCBJU19JT1M7Cgp2YXIgVE9VQ0hfRU5BQkxFRCA9IGlzUmVhbCgpICYmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3dfMSB8fCB3aW5kb3dfMS5Eb2N1bWVudFRvdWNoICYmIHdpbmRvd18xLmRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93XzEuRG9jdW1lbnRUb3VjaCk7Cgp2YXIgQkFDS0dST1VORF9TSVpFX1NVUFBPUlRFRCA9IGlzUmVhbCgpICYmICdiYWNrZ3JvdW5kU2l6ZScgaW4gd2luZG93XzEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKS5zdHlsZTsKCnZhciBicm93c2VyID0gKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh7CglJU19JUEFEOiBJU19JUEFELAoJSVNfSVBIT05FOiBJU19JUEhPTkUsCglJU19JUE9EOiBJU19JUE9ELAoJSVNfSU9TOiBJU19JT1MsCglJT1NfVkVSU0lPTjogSU9TX1ZFUlNJT04sCglJU19BTkRST0lEOiBJU19BTkRST0lELAoJQU5EUk9JRF9WRVJTSU9OOiBBTkRST0lEX1ZFUlNJT04sCglJU19PTERfQU5EUk9JRDogSVNfT0xEX0FORFJPSUQsCglJU19OQVRJVkVfQU5EUk9JRDogSVNfTkFUSVZFX0FORFJPSUQsCglJU19GSVJFRk9YOiBJU19GSVJFRk9YLAoJSVNfRURHRTogSVNfRURHRSwKCUlTX0NIUk9NRTogSVNfQ0hST01FLAoJQ0hST01FX1ZFUlNJT046IENIUk9NRV9WRVJTSU9OLAoJSVNfSUU4OiBJU19JRTgsCglJRV9WRVJTSU9OOiBJRV9WRVJTSU9OLAoJSVNfU0FGQVJJOiBJU19TQUZBUkksCglJU19BTllfU0FGQVJJOiBJU19BTllfU0FGQVJJLAoJVE9VQ0hfRU5BQkxFRDogVE9VQ0hfRU5BQkxFRCwKCUJBQ0tHUk9VTkRfU0laRV9TVVBQT1JURUQ6IEJBQ0tHUk9VTkRfU0laRV9TVVBQT1JURUQKfSk7Cgp2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gInN5bWJvbCIgPyBmdW5jdGlvbiAob2JqKSB7CiAgcmV0dXJuIHR5cGVvZiBvYmo7Cn0gOiBmdW5jdGlvbiAob2JqKSB7CiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKfTsKCgoKCgoKCgoKCgp2YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7CiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogIH0KfTsKCgoKCgoKCgoKCgp2YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOwogIH0KCiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICBjb25zdHJ1Y3RvcjogewogICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9CiAgfSk7CiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOwp9OwoKCgoKCgoKCgoKCnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gZnVuY3Rpb24gKHNlbGYsIGNhbGwpIHsKICBpZiAoIXNlbGYpIHsKICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgfQoKICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSA/IGNhbGwgOiBzZWxmOwp9OwoKCgoKCgoKCgoKCnZhciB0YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZSA9IGZ1bmN0aW9uIChzdHJpbmdzLCByYXcpIHsKICBzdHJpbmdzLnJhdyA9IHJhdzsKICByZXR1cm4gc3RyaW5nczsKfTsKCi8qKgogKiBAZmlsZSBvYmouanMKICogQG1vZHVsZSBvYmoKICovCgovKioKICogQGNhbGxiYWNrIG9iajpFYWNoQ2FsbGJhY2sKICoKICogQHBhcmFtIHtNaXhlZH0gdmFsdWUKICogICAgICAgIFRoZSBjdXJyZW50IGtleSBmb3IgdGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIGl0ZXJhdGVkIG92ZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICogICAgICAgIFRoZSBjdXJyZW50IGtleS12YWx1ZSBmb3Igb2JqZWN0IHRoYXQgaXMgYmVpbmcgaXRlcmF0ZWQgb3ZlcgogKi8KCi8qKgogKiBAY2FsbGJhY2sgb2JqOlJlZHVjZUNhbGxiYWNrCiAqCiAqIEBwYXJhbSB7TWl4ZWR9IGFjY3VtCiAqICAgICAgICBUaGUgdmFsdWUgdGhhdCBpcyBhY2N1bXVsYXRpbmcgb3ZlciB0aGUgcmVkdWNlIGxvb3AuCiAqCiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlCiAqICAgICAgICBUaGUgY3VycmVudCBrZXkgZm9yIHRoZSBvYmplY3QgdGhhdCBpcyBiZWluZyBpdGVyYXRlZCBvdmVyLgogKgogKiBAcGFyYW0ge3N0cmluZ30ga2V5CiAqICAgICAgICBUaGUgY3VycmVudCBrZXktdmFsdWUgZm9yIG9iamVjdCB0aGF0IGlzIGJlaW5nIGl0ZXJhdGVkIG92ZXIKICoKICogQHJldHVybiB7TWl4ZWR9CiAqICAgICAgICAgVGhlIG5ldyBhY2N1bXVsYXRlZCB2YWx1ZS4KICovCnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgovKioKICogR2V0IHRoZSBrZXlzIG9mIGFuIE9iamVjdAogKgogKiBAcGFyYW0ge09iamVjdH0KICogICAgICAgIFRoZSBPYmplY3QgdG8gZ2V0IHRoZSBrZXlzIGZyb20KICoKICogQHJldHVybiB7c3RyaW5nW119CiAqICAgICAgICAgQW4gYXJyYXkgb2YgdGhlIGtleXMgZnJvbSB0aGUgb2JqZWN0LiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZQogKiAgICAgICAgIG9iamVjdCBwYXNzZWQgaW4gd2FzIGludmFsaWQgb3IgaGFkIG5vIGtleXMuCiAqCiAqIEBwcml2YXRlCiAqLwp2YXIga2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7CiAgcmV0dXJuIGlzT2JqZWN0KG9iamVjdCkgPyBPYmplY3Qua2V5cyhvYmplY3QpIDogW107Cn07CgovKioKICogQXJyYXktbGlrZSBpdGVyYXRpb24gZm9yIG9iamVjdHMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QKICogICAgICAgIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyCiAqCiAqIEBwYXJhbSB7b2JqOkVhY2hDYWxsYmFja30gZm4KICogICAgICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgZm9yIGVhY2gga2V5IGluIHRoZSBvYmplY3QuCiAqLwpmdW5jdGlvbiBlYWNoKG9iamVjdCwgZm4pIHsKICBrZXlzKG9iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICByZXR1cm4gZm4ob2JqZWN0W2tleV0sIGtleSk7CiAgfSk7Cn0KCi8qKgogKiBBcnJheS1saWtlIHJlZHVjZSBmb3Igb2JqZWN0cy4KICoKICogQHBhcmFtIHtPYmplY3R9IG9iamVjdAogKiAgICAgICAgVGhlIE9iamVjdCB0aGF0IHlvdSB3YW50IHRvIHJlZHVjZS4KICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KICogICAgICAgICBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBmb3IgZWFjaCBrZXkgaW4gdGhlIG9iamVjdC4gSXQKICogICAgICAgICByZWNlaXZlcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgYW5kIHRoZSBwZXItaXRlcmF0aW9uIHZhbHVlIGFuZCBrZXkKICogICAgICAgICBhcyBhcmd1bWVudHMuCiAqCiAqIEBwYXJhbSB7TWl4ZWR9IFtpbml0aWFsID0gMF0KICogICAgICAgIFN0YXJ0aW5nIHZhbHVlCiAqCiAqIEByZXR1cm4ge01peGVkfQogKiAgICAgICAgIFRoZSBmaW5hbCBhY2N1bXVsYXRlZCB2YWx1ZS4KICovCmZ1bmN0aW9uIHJlZHVjZShvYmplY3QsIGZuKSB7CiAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7CgogIHJldHVybiBrZXlzKG9iamVjdCkucmVkdWNlKGZ1bmN0aW9uIChhY2N1bSwga2V5KSB7CiAgICByZXR1cm4gZm4oYWNjdW0sIG9iamVjdFtrZXldLCBrZXkpOwogIH0sIGluaXRpYWwpOwp9CgovKioKICogT2JqZWN0LmFzc2lnbi1zdHlsZSBvYmplY3Qgc2hhbGxvdyBtZXJnZS9leHRlbmQuCiAqCiAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0CiAqIEBwYXJhbSAge09iamVjdH0gLi4uc291cmNlcwogKiBAcmV0dXJuIHtPYmplY3R9CiAqLwpmdW5jdGlvbiBhc3NpZ24odGFyZ2V0KSB7CiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNvdXJjZXMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICBzb3VyY2VzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTsKICB9CgogIGlmIChPYmplY3QuYXNzaWduKSB7CiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbi5hcHBseShPYmplY3QsIFt0YXJnZXRdLmNvbmNhdChzb3VyY2VzKSk7CiAgfQoKICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkgewogICAgaWYgKCFzb3VyY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGVhY2goc291cmNlLCBmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgICB0YXJnZXRba2V5XSA9IHZhbHVlOwogICAgfSk7CiAgfSk7CgogIHJldHVybiB0YXJnZXQ7Cn0KCi8qKgogKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBhbiBvYmplY3Qgb2YgYW55IGtpbmQgLSBpbmNsdWRpbmcgRE9NIG5vZGVzLAogKiBhcnJheXMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGV0Yy4gTm90IGZ1bmN0aW9ucywgdGhvdWdoLgogKgogKiBUaGlzIGF2b2lkcyB0aGUgZ290Y2hhIHdoZXJlIHVzaW5nIGB0eXBlb2ZgIG9uIGEgYG51bGxgIHZhbHVlCiAqIHJlc3VsdHMgaW4gYCdvYmplY3QnYC4KICoKICogQHBhcmFtICB7T2JqZWN0fSB2YWx1ZQogKiBAcmV0dXJuIHtCb29sZWFufQogKi8KZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWx1ZSkpID09PSAnb2JqZWN0JzsKfQoKLyoqCiAqIFJldHVybnMgd2hldGhlciBhbiBvYmplY3QgYXBwZWFycyB0byBiZSBhICJwbGFpbiIgb2JqZWN0IC0gdGhhdCBpcywgYQogKiBkaXJlY3QgaW5zdGFuY2Ugb2YgYE9iamVjdGAuCiAqCiAqIEBwYXJhbSAge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmZ1bmN0aW9uIGlzUGxhaW4odmFsdWUpIHsKICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0Owp9CgovKioKICogQGZpbGUgbG9nLmpzCiAqIEBtb2R1bGUgbG9nCiAqLwp2YXIgbG9nID0gdm9pZCAwOwoKLy8gVGhpcyBpcyB0aGUgcHJpdmF0ZSB0cmFja2luZyB2YXJpYWJsZSBmb3IgbG9nZ2luZyBsZXZlbC4KdmFyIGxldmVsID0gJ2luZm8nOwoKLy8gVGhpcyBpcyB0aGUgcHJpdmF0ZSB0cmFja2luZyB2YXJpYWJsZSBmb3IgdGhlIGxvZ2dpbmcgaGlzdG9yeS4KdmFyIGhpc3RvcnkgPSBbXTsKCi8qKgogKiBMb2cgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgYW5kIGhpc3RvcnkgYmFzZWQgb24gdGhlIHR5cGUgb2YgbWVzc2FnZQogKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUKICogICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY29uc29sZSBtZXRob2QgdG8gdXNlLgogKgogKiBAcGFyYW0gIHtBcnJheX0gYXJncwogKiAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBtYXRjaGluZyBjb25zb2xlIG1ldGhvZC4KICoKICogQHBhcmFtICB7Ym9vbGVhbn0gW3N0cmluZ2lmeV0KICogICAgICAgICBCeSBkZWZhdWx0LCBvbmx5IG9sZCBJRXMgc2hvdWxkIGdldCBjb25zb2xlIGFyZ3VtZW50IHN0cmluZ2lmaWNhdGlvbiwKICogICAgICAgICBidXQgdGhpcyBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGZhY2lsaXRhdGUgdGVzdGluZy4KICovCnZhciBsb2dCeVR5cGUgPSBmdW5jdGlvbiBsb2dCeVR5cGUodHlwZSwgYXJncykgewogIHZhciBzdHJpbmdpZnkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICEhSUVfVkVSU0lPTiAmJiBJRV9WRVJTSU9OIDwgMTE7CgogIHZhciBsdmwgPSBsb2cubGV2ZWxzW2xldmVsXTsKICB2YXIgbHZsUmVnRXhwID0gbmV3IFJlZ0V4cCgnXignICsgbHZsICsgJykkJyk7CgogIGlmICh0eXBlICE9PSAnbG9nJykgewoKICAgIC8vIEFkZCB0aGUgdHlwZSB0byB0aGUgZnJvbnQgb2YgdGhlIG1lc3NhZ2Ugd2hlbiBpdCdzIG5vdCAibG9nIi4KICAgIGFyZ3MudW5zaGlmdCh0eXBlLnRvVXBwZXJDYXNlKCkgKyAnOicpOwogIH0KCiAgLy8gQWRkIGEgY2xvbmUgb2YgdGhlIGFyZ3MgYXQgdGhpcyBwb2ludCB0byBoaXN0b3J5LgogIGlmIChoaXN0b3J5KSB7CiAgICBoaXN0b3J5LnB1c2goW10uY29uY2F0KGFyZ3MpKTsKICB9CgogIC8vIEFkZCBjb25zb2xlIHByZWZpeCBhZnRlciBhZGRpbmcgdG8gaGlzdG9yeS4KICBhcmdzLnVuc2hpZnQoJ1ZJREVPSlM6Jyk7CgogIC8vIElmIHRoZXJlJ3Mgbm8gY29uc29sZSB0aGVuIGRvbid0IHRyeSB0byBvdXRwdXQgbWVzc2FnZXMsIGJ1dCB0aGV5IHdpbGwKICAvLyBzdGlsbCBiZSBzdG9yZWQgaW4gaGlzdG9yeS4KICBpZiAoIXdpbmRvd18xLmNvbnNvbGUpIHsKICAgIHJldHVybjsKICB9CgogIC8vIFdhcyBzZXR0aW5nIHRoZXNlIG9uY2Ugb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLCBidXQgY29udGFpbmluZyB0aGVtCiAgLy8gaW4gdGhlIGZ1bmN0aW9uIG1ha2VzIGl0IGVhc2llciB0byB0ZXN0IGNhc2VzIHdoZXJlIGNvbnNvbGUgZG9lc24ndCBleGlzdAogIC8vIHdoZW4gdGhlIG1vZHVsZSBpcyBleGVjdXRlZC4KICB2YXIgZm4gPSB3aW5kb3dfMS5jb25zb2xlW3R5cGVdOwoKICBpZiAoIWZuICYmIHR5cGUgPT09ICdkZWJ1ZycpIHsKICAgIC8vIENlcnRhaW4gYnJvd3NlcnMgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciBjb25zb2xlLmRlYnVnLiBGb3IgdGhvc2UsIHdlCiAgICAvLyBzaG91bGQgZGVmYXVsdCB0byB0aGUgY2xvc2VzdCBjb21wYXJhYmxlIGxvZy4KICAgIGZuID0gd2luZG93XzEuY29uc29sZS5pbmZvIHx8IHdpbmRvd18xLmNvbnNvbGUubG9nOwogIH0KCiAgLy8gQmFpbCBvdXQgaWYgdGhlcmUncyBubyBjb25zb2xlIG9yIGlmIHRoaXMgdHlwZSBpcyBub3QgYWxsb3dlZCBieSB0aGUKICAvLyBjdXJyZW50IGxvZ2dpbmcgbGV2ZWwuCiAgaWYgKCFmbiB8fCAhbHZsIHx8ICFsdmxSZWdFeHAudGVzdCh0eXBlKSkgewogICAgcmV0dXJuOwogIH0KCiAgLy8gSUVzIHByZXZpb3VzIHRvIDExIGxvZyBvYmplY3RzIHVzZWxlc3NseSBhcyAiW29iamVjdCBPYmplY3RdIjsgc28sIEpTT05pZnkKICAvLyBvYmplY3RzIGFuZCBhcnJheXMgZm9yIHRob3NlIGxlc3MtY2FwYWJsZSBicm93c2Vycy4KICBpZiAoc3RyaW5naWZ5KSB7CiAgICBhcmdzID0gYXJncy5tYXAoZnVuY3Rpb24gKGEpIHsKICAgICAgaWYgKGlzT2JqZWN0KGEpIHx8IEFycmF5LmlzQXJyYXkoYSkpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpOwogICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgIHJldHVybiBTdHJpbmcoYSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBDYXN0IHRvIHN0cmluZyBiZWZvcmUgam9pbmluZywgc28gd2UgZ2V0IG51bGwgYW5kIHVuZGVmaW5lZCBleHBsaWNpdGx5CiAgICAgIC8vIGluY2x1ZGVkIGluIG91dHB1dCAoYXMgd2Ugd291bGQgaW4gYSBtb2Rlcm4gY29uc29sZSkuCiAgICAgIHJldHVybiBTdHJpbmcoYSk7CiAgICB9KS5qb2luKCcgJyk7CiAgfQoKICAvLyBPbGQgSUUgdmVyc2lvbnMgZG8gbm90IGFsbG93IC5hcHBseSgpIGZvciBjb25zb2xlIG1ldGhvZHMgKHRoZXkgYXJlCiAgLy8gcmVwb3J0ZWQgYXMgb2JqZWN0cyByYXRoZXIgdGhhbiBmdW5jdGlvbnMpLgogIGlmICghZm4uYXBwbHkpIHsKICAgIGZuKGFyZ3MpOwogIH0gZWxzZSB7CiAgICBmbltBcnJheS5pc0FycmF5KGFyZ3MpID8gJ2FwcGx5JyA6ICdjYWxsJ10od2luZG93XzEuY29uc29sZSwgYXJncyk7CiAgfQp9OwoKLyoqCiAqIExvZ3MgcGxhaW4gZGVidWcgbWVzc2FnZXMuIFNpbWlsYXIgdG8gYGNvbnNvbGUubG9nYC4KICoKICogQGNsYXNzCiAqIEBwYXJhbSAgICB7TWl4ZWRbXX0gYXJncwogKiAgICAgICAgICAgT25lIG9yIG1vcmUgbWVzc2FnZXMgb3Igb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQuCiAqLwpsb2cgPSBmdW5jdGlvbiBsb2coKSB7CiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CiAgfQoKICBsb2dCeVR5cGUoJ2xvZycsIGFyZ3MpOwp9OwoKLyoqCiAqIEVudW1lcmF0aW9uIG9mIGF2YWlsYWJsZSBsb2dnaW5nIGxldmVscywgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBsZXZlbCBuYW1lcwogKiBhbmQgdGhlIHZhbHVlcyBhcmUgYHxgLXNlcGFyYXRlZCBzdHJpbmdzIGNvbnRhaW5pbmcgbG9nZ2luZyBtZXRob2RzIGFsbG93ZWQKICogaW4gdGhhdCBsb2dnaW5nIGxldmVsLiBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogKiBtYXRjaGluZyB0aGUgZnVuY3Rpb24gbmFtZSBiZWluZyBjYWxsZWQuCiAqCiAqIExldmVscyBwcm92aWRlZCBieSB2aWRlby5qcyBhcmU6CiAqCiAqIC0gYG9mZmA6IE1hdGNoZXMgbm8gY2FsbHMuIEFueSB2YWx1ZSB0aGF0IGNhbiBiZSBjYXN0IHRvIGBmYWxzZWAgd2lsbCBoYXZlCiAqICAgdGhpcyBlZmZlY3QuIFRoZSBtb3N0IHJlc3RyaWN0aXZlLgogKiAtIGBhbGxgOiBNYXRjaGVzIG9ubHkgVmlkZW8uanMtcHJvdmlkZWQgZnVuY3Rpb25zIChgZGVidWdgLCBgbG9nYCwKICogICBgbG9nLndhcm5gLCBhbmQgYGxvZy5lcnJvcmApLgogKiAtIGBkZWJ1Z2A6IE1hdGNoZXMgYGxvZy5kZWJ1Z2AsIGBsb2dgLCBgbG9nLndhcm5gLCBhbmQgYGxvZy5lcnJvcmAgY2FsbHMuCiAqIC0gYGluZm9gIChkZWZhdWx0KTogTWF0Y2hlcyBgbG9nYCwgYGxvZy53YXJuYCwgYW5kIGBsb2cuZXJyb3JgIGNhbGxzLgogKiAtIGB3YXJuYDogTWF0Y2hlcyBgbG9nLndhcm5gIGFuZCBgbG9nLmVycm9yYCBjYWxscy4KICogLSBgZXJyb3JgOiBNYXRjaGVzIG9ubHkgYGxvZy5lcnJvcmAgY2FsbHMuCiAqCiAqIEB0eXBlIHtPYmplY3R9CiAqLwpsb2cubGV2ZWxzID0gewogIGFsbDogJ2RlYnVnfGxvZ3x3YXJufGVycm9yJywKICBvZmY6ICcnLAogIGRlYnVnOiAnZGVidWd8bG9nfHdhcm58ZXJyb3InLAogIGluZm86ICdsb2d8d2FybnxlcnJvcicsCiAgd2FybjogJ3dhcm58ZXJyb3InLAogIGVycm9yOiAnZXJyb3InLAogIERFRkFVTFQ6IGxldmVsCn07CgovKioKICogR2V0IG9yIHNldCB0aGUgY3VycmVudCBsb2dnaW5nIGxldmVsLiBJZiBhIHN0cmluZyBtYXRjaGluZyBhIGtleSBmcm9tCiAqIHtAbGluayBsb2cubGV2ZWxzfSBpcyBwcm92aWRlZCwgYWN0cyBhcyBhIHNldHRlci4gUmVnYXJkbGVzcyBvZiBhcmd1bWVudCwKICogcmV0dXJucyB0aGUgY3VycmVudCBsb2dnaW5nIGxldmVsLgogKgogKiBAcGFyYW0gIHtzdHJpbmd9IFtsdmxdCiAqICAgICAgICAgUGFzcyB0byBzZXQgYSBuZXcgbG9nZ2luZyBsZXZlbC4KICoKICogQHJldHVybiB7c3RyaW5nfQogKiAgICAgICAgIFRoZSBjdXJyZW50IGxvZ2dpbmcgbGV2ZWwuCiAqLwpsb2cubGV2ZWwgPSBmdW5jdGlvbiAobHZsKSB7CiAgaWYgKHR5cGVvZiBsdmwgPT09ICdzdHJpbmcnKSB7CiAgICBpZiAoIWxvZy5sZXZlbHMuaGFzT3duUHJvcGVydHkobHZsKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJyInICsgbHZsICsgJyIgaW4gbm90IGEgdmFsaWQgbG9nIGxldmVsJyk7CiAgICB9CiAgICBsZXZlbCA9IGx2bDsKICB9CiAgcmV0dXJuIGxldmVsOwp9OwoKLyoqCiAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBldmVyeXRoaW5nIHRoYXQgaGFzIGJlZW4gbG9nZ2VkIHRvIHRoZSBoaXN0b3J5LgogKgogKiBUaGlzIGFycmF5IGlzIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgaW50ZXJuYWwgaGlzdG9yeSByZWNvcmQuIEhvd2V2ZXIsIGl0cwogKiBjb250ZW50cyBhcmUgX25vdF8gY2xvbmVkOyBzbywgbXV0YXRpbmcgb2JqZWN0cyBpbnNpZGUgdGhpcyBhcnJheSB3aWxsCiAqIG11dGF0ZSB0aGVtIGluIGhpc3RvcnkuCiAqCiAqIEByZXR1cm4ge0FycmF5fQogKi8KbG9nLmhpc3RvcnkgPSBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIGhpc3RvcnkgPyBbXS5jb25jYXQoaGlzdG9yeSkgOiBbXTsKfTsKCi8qKgogKiBDbGVhcnMgdGhlIGludGVybmFsIGhpc3RvcnkgdHJhY2tpbmcsIGJ1dCBkb2VzIG5vdCBwcmV2ZW50IGZ1cnRoZXIgaGlzdG9yeQogKiB0cmFja2luZy4KICovCmxvZy5oaXN0b3J5LmNsZWFyID0gZnVuY3Rpb24gKCkgewogIGlmIChoaXN0b3J5KSB7CiAgICBoaXN0b3J5Lmxlbmd0aCA9IDA7CiAgfQp9OwoKLyoqCiAqIERpc2FibGUgaGlzdG9yeSB0cmFja2luZyBpZiBpdCBpcyBjdXJyZW50bHkgZW5hYmxlZC4KICovCmxvZy5oaXN0b3J5LmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKGhpc3RvcnkgIT09IG51bGwpIHsKICAgIGhpc3RvcnkubGVuZ3RoID0gMDsKICAgIGhpc3RvcnkgPSBudWxsOwogIH0KfTsKCi8qKgogKiBFbmFibGUgaGlzdG9yeSB0cmFja2luZyBpZiBpdCBpcyBjdXJyZW50bHkgZGlzYWJsZWQuCiAqLwpsb2cuaGlzdG9yeS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKGhpc3RvcnkgPT09IG51bGwpIHsKICAgIGhpc3RvcnkgPSBbXTsKICB9Cn07CgovKioKICogTG9ncyBlcnJvciBtZXNzYWdlcy4gU2ltaWxhciB0byBgY29uc29sZS5lcnJvcmAuCiAqCiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJncwogKiAgICAgICAgT25lIG9yIG1vcmUgbWVzc2FnZXMgb3Igb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgYXMgYW4gZXJyb3IKICovCmxvZy5lcnJvciA9IGZ1bmN0aW9uICgpIHsKICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgewogICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdOwogIH0KCiAgcmV0dXJuIGxvZ0J5VHlwZSgnZXJyb3InLCBhcmdzKTsKfTsKCi8qKgogKiBMb2dzIHdhcm5pbmcgbWVzc2FnZXMuIFNpbWlsYXIgdG8gYGNvbnNvbGUud2FybmAuCiAqCiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJncwogKiAgICAgICAgT25lIG9yIG1vcmUgbWVzc2FnZXMgb3Igb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgYXMgYSB3YXJuaW5nLgogKi8KbG9nLndhcm4gPSBmdW5jdGlvbiAoKSB7CiAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHsKICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTsKICB9CgogIHJldHVybiBsb2dCeVR5cGUoJ3dhcm4nLCBhcmdzKTsKfTsKCi8qKgogKiBMb2dzIGRlYnVnIG1lc3NhZ2VzLiBTaW1pbGFyIHRvIGBjb25zb2xlLmRlYnVnYCwgYnV0IG1heSBhbHNvIGFjdCBhcyBhIGNvbXBhcmFibGUKICogbG9nIGlmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlCiAqCiAqIEBwYXJhbSB7TWl4ZWRbXX0gYXJncwogKiAgICAgICAgT25lIG9yIG1vcmUgbWVzc2FnZXMgb3Igb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgYXMgZGVidWcuCiAqLwpsb2cuZGVidWcgPSBmdW5jdGlvbiAoKSB7CiAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHsKICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTsKICB9CgogIHJldHVybiBsb2dCeVR5cGUoJ2RlYnVnJywgYXJncyk7Cn07Cgp2YXIgbG9nJDEgPSBsb2c7CgpmdW5jdGlvbiBjbGVhbiAocykgewogIHJldHVybiBzLnJlcGxhY2UoL1xuXHI/XHMqL2csICcnKQp9CgoKdmFyIHRzbWwgPSBmdW5jdGlvbiB0c21sIChzYSkgewogIHZhciBzID0gJycKICAgICwgaSA9IDA7CgogIGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQogICAgcyArPSBjbGVhbihzYVtpXSkgKyAoYXJndW1lbnRzW2kgKyAxXSB8fCAnJyk7CgogIHJldHVybiBzCn07CgovKioKICogQGZpbGUgY29tcHV0ZWQtc3R5bGUuanMKICogQG1vZHVsZSBjb21wdXRlZC1zdHlsZQogKi8KLyoqCiAqIEEgc2FmZSBnZXRDb21wdXRlZFN0eWxlIHdpdGggYW4gSUU4IGZhbGxiYWNrLgogKgogKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIEZpcmVmb3gsIGlmIHRoZSBwbGF5ZXIgaXMgbG9hZGVkIGluIGFuIGlmcmFtZSB3aXRoCiAqIGBkaXNwbGF5Om5vbmVgLCB0aGVuIGBnZXRDb21wdXRlZFN0eWxlYCByZXR1cm5zIGBudWxsYCwgc28sIHdlIGRvIGEgbnVsbC1jaGVjayB0bwogKiBtYWtlIHN1cmUgIHRoYXQgdGhlIHBsYXllciBkb2Vzbid0IGJyZWFrIGluIHRoZXNlIGNhc2VzLgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBUaGUgZWxlbWVudCB5b3Ugd2FudCB0aGUgY29tcHV0ZWQgc3R5bGUgb2YKICoKICogQHBhcmFtIHtzdHJpbmd9IHByb3AKICogICAgICAgIFRoZSBwcm9wZXJ0eSBuYW1lIHlvdSB3YW50CiAqCiAqIEBzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3CiAqCiAqIEBzdGF0aWMKICogQGNvbnN0CiAqLwpmdW5jdGlvbiBjb21wdXRlZFN0eWxlKGVsLCBwcm9wKSB7CiAgaWYgKCFlbCB8fCAhcHJvcCkgewogICAgcmV0dXJuICcnOwogIH0KCiAgaWYgKHR5cGVvZiB3aW5kb3dfMS5nZXRDb21wdXRlZFN0eWxlID09PSAnZnVuY3Rpb24nKSB7CiAgICB2YXIgY3MgPSB3aW5kb3dfMS5nZXRDb21wdXRlZFN0eWxlKGVsKTsKCiAgICByZXR1cm4gY3MgPyBjc1twcm9wXSA6ICcnOwogIH0KCiAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZVtwcm9wXSB8fCAnJzsKfQoKdmFyIF90ZW1wbGF0ZU9iamVjdCA9IHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnU2V0dGluZyBhdHRyaWJ1dGVzIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgY3JlYXRlRWwoKVxuICAgICAgICAgICAgICAgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSB0aGUgdGhpcmQgYXJndW1lbnQgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBjcmVhdGVFbCh0eXBlLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzKS4gQXR0ZW1wdGluZyB0byBzZXQgJywgJyB0byAnLCAnLiddLCBbJ1NldHRpbmcgYXR0cmlidXRlcyBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGNyZWF0ZUVsKClcbiAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGluc3RlYWQuXG4gICAgICAgICAgICAgICAgY3JlYXRlRWwodHlwZSwgcHJvcGVydGllcywgYXR0cmlidXRlcykuIEF0dGVtcHRpbmcgdG8gc2V0ICcsICcgdG8gJywgJy4nXSk7CgovKioKICogQGZpbGUgZG9tLmpzCiAqIEBtb2R1bGUgZG9tCiAqLwovKioKICogRGV0ZWN0IGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgd2l0aCBhbnkgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy4KICoKICogQHBhcmFtIHtzdHJpbmd9IHN0cgogKiAgICAgICAgVGhlIHN0cmluZyB0byBjaGVjawogKgogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIG5vbi1ibGFuawogKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlCiAqCiAqLwpmdW5jdGlvbiBpc05vbkJsYW5rU3RyaW5nKHN0cikgewogIHJldHVybiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiAvXFMvLnRlc3Qoc3RyKTsKfQoKLyoqCiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc2VkIHN0cmluZyBoYXMgd2hpdGVzcGFjZS4gVGhpcyBpcyB1c2VkIGJ5CiAqIGNsYXNzIG1ldGhvZHMgdG8gYmUgcmVsYXRpdmVseSBjb25zaXN0ZW50IHdpdGggdGhlIGNsYXNzTGlzdCBBUEkuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICogICAgICAgICBUaGUgc3RyaW5nIHRvIGNoZWNrIGZvciB3aGl0ZXNwYWNlLgogKgogKiBAdGhyb3dzIHtFcnJvcn0KICogICAgICAgICBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgd2hpdGVzcGFjZSBpbiB0aGUgc3RyaW5nLgogKgogKi8KZnVuY3Rpb24gdGhyb3dJZldoaXRlc3BhY2Uoc3RyKSB7CiAgaWYgKC9ccy8udGVzdChzdHIpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzIGhhcyBpbGxlZ2FsIHdoaXRlc3BhY2UgY2hhcmFjdGVycycpOwogIH0KfQoKLyoqCiAqIFByb2R1Y2UgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIGEgY2xhc3NOYW1lIHdpdGhpbiBhbiBlbGVtZW50cyBjbGFzc05hbWUuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUKICogICAgICAgICBUaGUgY2xhc3NOYW1lIHRvIGdlbmVyYXRlIHRoZSBSZWdFeHAgZm9yLgogKgogKiBAcmV0dXJuIHtSZWdFeHB9CiAqICAgICAgICAgVGhlIFJlZ0V4cCB0aGF0IHdpbGwgY2hlY2sgZm9yIGEgc3BlY2lmaWMgYGNsYXNzTmFtZWAgaW4gYW4gZWxlbWVudHMKICogICAgICAgICBjbGFzc05hbWUuCiAqLwpmdW5jdGlvbiBjbGFzc1JlZ0V4cChjbGFzc05hbWUpIHsKICByZXR1cm4gbmV3IFJlZ0V4cCgnKF58XFxzKScgKyBjbGFzc05hbWUgKyAnKCR8XFxzKScpOwp9CgovKioKICogV2hldGhlciB0aGUgY3VycmVudCBET00gaW50ZXJmYWNlIGFwcGVhcnMgdG8gYmUgcmVhbC4KICoKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmZ1bmN0aW9uIGlzUmVhbCgpIHsKICByZXR1cm4gKAoKICAgIC8vIEJvdGggZG9jdW1lbnQgYW5kIHdpbmRvdyB3aWxsIG5ldmVyIGJlIHVuZGVmaW5lZCB0aGFua3MgdG8gYGdsb2JhbGAuCiAgICBkb2N1bWVudF8xID09PSB3aW5kb3dfMS5kb2N1bWVudCAmJgoKICAgIC8vIEluIElFIDwgOSwgRE9NIG1ldGhvZHMgcmV0dXJuICJvYmplY3QiIGFzIHRoZWlyIHR5cGUsIHNvIGFsbCB3ZSBjYW4KICAgIC8vIGNvbmZpZGVudGx5IGNoZWNrIGlzIHRoYXQgaXQgZXhpc3RzLgogICAgdHlwZW9mIGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcKICApOwp9CgovKioKICogRGV0ZXJtaW5lcywgdmlhIGR1Y2sgdHlwaW5nLCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIGlzIGEgRE9NIGVsZW1lbnQuCiAqCiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlCiAqICAgICAgICBUaGUgdGhpbmcgdG8gY2hlY2sKICoKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICAtIFRydWUgaWYgaXQgaXMgYSBET00gZWxlbWVudAogKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlCiAqLwpmdW5jdGlvbiBpc0VsKHZhbHVlKSB7CiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTsKfQoKLyoqCiAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgRE9NIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZS4KICoKICogQHJldHVybiB7Ym9vbGVhbn0KICoKICovCmZ1bmN0aW9uIGlzSW5GcmFtZSgpIHsKCiAgLy8gV2UgbmVlZCBhIHRyeS9jYXRjaCBoZXJlIGJlY2F1c2UgU2FmYXJpIHdpbGwgdGhyb3cgZXJyb3JzIHdoZW4gYXR0ZW1wdGluZwogIC8vIHRvIGdldCBlaXRoZXIgYHBhcmVudGAgb3IgYHNlbGZgCiAgdHJ5IHsKICAgIHJldHVybiB3aW5kb3dfMS5wYXJlbnQgIT09IHdpbmRvd18xLnNlbGY7CiAgfSBjYXRjaCAoeCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CgovKioKICogQ3JlYXRlcyBmdW5jdGlvbnMgdG8gcXVlcnkgdGhlIERPTSB1c2luZyBhIGdpdmVuIG1ldGhvZC4KICoKICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZAogKiAgICAgICAgIFRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSBxdWVyeSB3aXRoLgogKgogKiBAcmV0dXJuIHtGdW5jdGlvbn0KICogICAgICAgICBUaGUgcXVlcnkgbWV0aG9kCiAqLwpmdW5jdGlvbiBjcmVhdGVRdWVyaWVyKG1ldGhvZCkgewogIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRleHQpIHsKICAgIGlmICghaXNOb25CbGFua1N0cmluZyhzZWxlY3RvcikpIHsKICAgICAgcmV0dXJuIGRvY3VtZW50XzFbbWV0aG9kXShudWxsKTsKICAgIH0KICAgIGlmIChpc05vbkJsYW5rU3RyaW5nKGNvbnRleHQpKSB7CiAgICAgIGNvbnRleHQgPSBkb2N1bWVudF8xLnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7CiAgICB9CgogICAgdmFyIGN0eCA9IGlzRWwoY29udGV4dCkgPyBjb250ZXh0IDogZG9jdW1lbnRfMTsKCiAgICByZXR1cm4gY3R4W21ldGhvZF0gJiYgY3R4W21ldGhvZF0oc2VsZWN0b3IpOwogIH07Cn0KCi8qKgogKiBDcmVhdGVzIGFuIGVsZW1lbnQgYW5kIGFwcGxpZXMgcHJvcGVydGllcy4KICoKICogQHBhcmFtIHtzdHJpbmd9IFt0YWdOYW1lPSdkaXYnXQogKiAgICAgICAgIE5hbWUgb2YgdGFnIHRvIGJlIGNyZWF0ZWQuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0KICogICAgICAgICBFbGVtZW50IHByb3BlcnRpZXMgdG8gYmUgYXBwbGllZC4KICoKICogQHBhcmFtIHtPYmplY3R9IFthdHRyaWJ1dGVzPXt9XQogKiAgICAgICAgIEVsZW1lbnQgYXR0cmlidXRlcyB0byBiZSBhcHBsaWVkLgogKgogKiBAcGFyYW0ge1N0cmluZ3xFbGVtZW50fFRleHROb2RlfEFycmF5fEZ1bmN0aW9ufSBbY29udGVudF0KICogICAgICAgICBDb250ZW50cyBmb3IgdGhlIGVsZW1lbnQgKHNlZToge0BsaW5rIGRvbTpub3JtYWxpemVDb250ZW50fSkKICoKICogQHJldHVybiB7RWxlbWVudH0KICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogKi8KZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgdmFyIHRhZ05hbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdkaXYnOwogIHZhciBwcm9wZXJ0aWVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307CiAgdmFyIGNvbnRlbnQgPSBhcmd1bWVudHNbM107CgogIHZhciBlbCA9IGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKCiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHsKICAgIHZhciB2YWwgPSBwcm9wZXJ0aWVzW3Byb3BOYW1lXTsKCiAgICAvLyBTZWUgIzIxNzYKICAgIC8vIFdlIG9yaWdpbmFsbHkgd2VyZSBhY2NlcHRpbmcgYm90aCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZQogICAgLy8gc2FtZSBvYmplY3QsIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yayBzbyB3ZWxsLgogICAgaWYgKHByb3BOYW1lLmluZGV4T2YoJ2FyaWEtJykgIT09IC0xIHx8IHByb3BOYW1lID09PSAncm9sZScgfHwgcHJvcE5hbWUgPT09ICd0eXBlJykgewogICAgICBsb2ckMS53YXJuKHRzbWwoX3RlbXBsYXRlT2JqZWN0LCBwcm9wTmFtZSwgdmFsKSk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShwcm9wTmFtZSwgdmFsKTsKCiAgICAgIC8vIEhhbmRsZSB0ZXh0Q29udGVudCBzaW5jZSBpdCdzIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZSBhbmQgd2UgaGF2ZSBhCiAgICAgIC8vIG1ldGhvZCBmb3IgaXQuCiAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSAndGV4dENvbnRlbnQnKSB7CiAgICAgIHRleHRDb250ZW50KGVsLCB2YWwpOwogICAgfSBlbHNlIHsKICAgICAgZWxbcHJvcE5hbWVdID0gdmFsOwogICAgfQogIH0pOwoKICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyTmFtZSkgewogICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyaWJ1dGVzW2F0dHJOYW1lXSk7CiAgfSk7CgogIGlmIChjb250ZW50KSB7CiAgICBhcHBlbmRDb250ZW50KGVsLCBjb250ZW50KTsKICB9CgogIHJldHVybiBlbDsKfQoKLyoqCiAqIEluamVjdHMgdGV4dCBpbnRvIGFuIGVsZW1lbnQsIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgY29udGVudHMgZW50aXJlbHkuCiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwKICogICAgICAgIFRoZSBlbGVtZW50IHRvIGFkZCB0ZXh0IGNvbnRlbnQgaW50bwogKgogKiBAcGFyYW0ge3N0cmluZ30gdGV4dAogKiAgICAgICAgVGhlIHRleHQgY29udGVudCB0byBhZGQuCiAqCiAqIEByZXR1cm4ge0VsZW1lbnR9CiAqICAgICAgICAgVGhlIGVsZW1lbnQgd2l0aCBhZGRlZCB0ZXh0IGNvbnRlbnQuCiAqLwpmdW5jdGlvbiB0ZXh0Q29udGVudChlbCwgdGV4dCkgewogIGlmICh0eXBlb2YgZWwudGV4dENvbnRlbnQgPT09ICd1bmRlZmluZWQnKSB7CiAgICBlbC5pbm5lclRleHQgPSB0ZXh0OwogIH0gZWxzZSB7CiAgICBlbC50ZXh0Q29udGVudCA9IHRleHQ7CiAgfQogIHJldHVybiBlbDsKfQoKLyoqCiAqIEluc2VydCBhbiBlbGVtZW50IGFzIHRoZSBmaXJzdCBjaGlsZCBub2RlIG9mIGFub3RoZXIKICoKICogQHBhcmFtIHtFbGVtZW50fSBjaGlsZAogKiAgICAgICAgRWxlbWVudCB0byBpbnNlcnQKICoKICogQHBhcmFtIHtFbGVtZW50fSBwYXJlbnQKICogICAgICAgIEVsZW1lbnQgdG8gaW5zZXJ0IGNoaWxkIGludG8KICovCmZ1bmN0aW9uIHByZXBlbmRUbyhjaGlsZCwgcGFyZW50KSB7CiAgaWYgKHBhcmVudC5maXJzdENoaWxkKSB7CiAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBwYXJlbnQuZmlyc3RDaGlsZCk7CiAgfSBlbHNlIHsKICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7CiAgfQp9CgovKioKICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3MKICoKICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAqICAgICAgICBFbGVtZW50IHRvIGNoZWNrCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvQ2hlY2sKICogICAgICAgIENsYXNzIG5hbWUgdG8gY2hlY2sgZm9yCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgLSBUcnVlIGlmIHRoZSBlbGVtZW50IGhhZCB0aGUgY2xhc3MKICogICAgICAgICAtIEZhbHNlIG90aGVyd2lzZS4KICoKICogQHRocm93cyB7RXJyb3J9CiAqICAgICAgICAgVGhyb3dzIGFuIGVycm9yIGlmIGBjbGFzc1RvQ2hlY2tgIGhhcyB3aGl0ZSBzcGFjZS4KICovCmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzVG9DaGVjaykgewogIHRocm93SWZXaGl0ZXNwYWNlKGNsYXNzVG9DaGVjayk7CiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7CiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NUb0NoZWNrKTsKICB9CiAgcmV0dXJuIGNsYXNzUmVnRXhwKGNsYXNzVG9DaGVjaykudGVzdChlbGVtZW50LmNsYXNzTmFtZSk7Cn0KCi8qKgogKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byBhbiBlbGVtZW50CiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogKiAgICAgICAgRWxlbWVudCB0byBhZGQgY2xhc3MgbmFtZSB0by4KICoKICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVG9BZGQKICogICAgICAgIENsYXNzIG5hbWUgdG8gYWRkLgogKgogKiBAcmV0dXJuIHtFbGVtZW50fQogKiAgICAgICAgIFRoZSBkb20gZWxlbWVudCB3aXRoIHRoZSBhZGRlZCBjbGFzcyBuYW1lLgogKi8KZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NUb0FkZCkgewogIGlmIChlbGVtZW50LmNsYXNzTGlzdCkgewogICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzVG9BZGQpOwoKICAgIC8vIERvbid0IG5lZWQgdG8gYHRocm93SWZXaGl0ZXNwYWNlYCBoZXJlIGJlY2F1c2UgYGhhc0VsQ2xhc3NgIHdpbGwgZG8gaXQKICAgIC8vIGluIHRoZSBjYXNlIG9mIGNsYXNzTGlzdCBub3QgYmVpbmcgc3VwcG9ydGVkLgogIH0gZWxzZSBpZiAoIWhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzVG9BZGQpKSB7CiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IChlbGVtZW50LmNsYXNzTmFtZSArICcgJyArIGNsYXNzVG9BZGQpLnRyaW0oKTsKICB9CgogIHJldHVybiBlbGVtZW50Owp9CgovKioKICogUmVtb3ZlIGEgQ1NTIGNsYXNzIG5hbWUgZnJvbSBhbiBlbGVtZW50CiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogKiAgICAgICAgRWxlbWVudCB0byByZW1vdmUgYSBjbGFzcyBuYW1lIGZyb20uCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvUmVtb3ZlCiAqICAgICAgICBDbGFzcyBuYW1lIHRvIHJlbW92ZQogKgogKiBAcmV0dXJuIHtFbGVtZW50fQogKiAgICAgICAgIFRoZSBkb20gZWxlbWVudCB3aXRoIGNsYXNzIG5hbWUgcmVtb3ZlZC4KICovCmZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzVG9SZW1vdmUpIHsKICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHsKICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc1RvUmVtb3ZlKTsKICB9IGVsc2UgewogICAgdGhyb3dJZldoaXRlc3BhY2UoY2xhc3NUb1JlbW92ZSk7CiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgcmV0dXJuIGMgIT09IGNsYXNzVG9SZW1vdmU7CiAgICB9KS5qb2luKCcgJyk7CiAgfQoKICByZXR1cm4gZWxlbWVudDsKfQoKLyoqCiAqIFRoZSBjYWxsYmFjayBkZWZpbml0aW9uIGZvciB0b2dnbGVFbENsYXNzLgogKgogKiBAY2FsbGJhY2sgRG9tflByZWRpY2F0ZUNhbGxiYWNrCiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogKiAgICAgICAgVGhlIERPTSBlbGVtZW50IG9mIHRoZSBDb21wb25lbnQuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1RvVG9nZ2xlCiAqICAgICAgICBUaGUgYGNsYXNzTmFtZWAgdGhhdCB3YW50cyB0byBiZSB0b2dnbGVkCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfQogKiAgICAgICAgIC0gSWYgdHJ1ZSB0aGUgYGNsYXNzVG9Ub2dnbGVgIHdpbGwgZ2V0IGFkZGVkIHRvIGBlbGVtZW50YC4KICogICAgICAgICAtIElmIGZhbHNlIHRoZSBgY2xhc3NUb1RvZ2dsZWAgd2lsbCBnZXQgcmVtb3ZlZCBmcm9tIGBlbGVtZW50YC4KICogICAgICAgICAtIElmIHVuZGVmaW5lZCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaWdub3JlZAogKi8KCi8qKgogKiBBZGRzIG9yIHJlbW92ZXMgYSBDU1MgY2xhc3MgbmFtZSBvbiBhbiBlbGVtZW50IGRlcGVuZGluZyBvbiBhbiBvcHRpb25hbAogKiBjb25kaXRpb24gb3IgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgdGhlIGNsYXNzIG5hbWUuCiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogKiAgICAgICAgVGhlIGVsZW1lbnQgdG8gdG9nZ2xlIGEgY2xhc3MgbmFtZSBvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVG9Ub2dnbGUKICogICAgICAgIFRoZSBjbGFzcyB0aGF0IHNob3VsZCBiZSB0b2dnbGVkCiAqCiAqIEBwYXJhbSB7Ym9vbGVhbnxQcmVkaWNhdGVDYWxsYmFja30gW3ByZWRpY2F0ZV0KICogICAgICAgIFNlZSB0aGUgcmV0dXJuIHZhbHVlIGZvciB7QGxpbmsgRG9tflByZWRpY2F0ZUNhbGxiYWNrfQogKgogKiBAcmV0dXJuIHtFbGVtZW50fQogKiAgICAgICAgIFRoZSBlbGVtZW50IHdpdGggYSBjbGFzcyB0aGF0IGhhcyBiZWVuIHRvZ2dsZWQuCiAqLwpmdW5jdGlvbiB0b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc1RvVG9nZ2xlLCBwcmVkaWNhdGUpIHsKCiAgLy8gVGhpcyBDQU5OT1QgdXNlIGBjbGFzc0xpc3RgIGludGVybmFsbHkgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZQogIC8vIHNlY29uZCBwYXJhbWV0ZXIgdG8gdGhlIGBjbGFzc0xpc3QudG9nZ2xlKClgIG1ldGhvZCEgV2hpY2ggaXMgZmluZSBiZWNhdXNlCiAgLy8gYGNsYXNzTGlzdGAgd2lsbCBiZSB1c2VkIGJ5IHRoZSBhZGQvcmVtb3ZlIGZ1bmN0aW9ucy4KICB2YXIgaGFzID0gaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7CgogIGlmICh0eXBlb2YgcHJlZGljYXRlID09PSAnZnVuY3Rpb24nKSB7CiAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7CiAgfQoKICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Jvb2xlYW4nKSB7CiAgICBwcmVkaWNhdGUgPSAhaGFzOwogIH0KCiAgLy8gSWYgdGhlIG5lY2Vzc2FyeSBjbGFzcyBvcGVyYXRpb24gbWF0Y2hlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKICAvLyBlbGVtZW50LCBubyBhY3Rpb24gaXMgcmVxdWlyZWQuCiAgaWYgKHByZWRpY2F0ZSA9PT0gaGFzKSB7CiAgICByZXR1cm47CiAgfQoKICBpZiAocHJlZGljYXRlKSB7CiAgICBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc1RvVG9nZ2xlKTsKICB9IGVsc2UgewogICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSk7CiAgfQoKICByZXR1cm4gZWxlbWVudDsKfQoKLyoqCiAqIEFwcGx5IGF0dHJpYnV0ZXMgdG8gYW4gSFRNTCBlbGVtZW50LgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBFbGVtZW50IHRvIGFkZCBhdHRyaWJ1dGVzIHRvLgogKgogKiBAcGFyYW0ge09iamVjdH0gW2F0dHJpYnV0ZXNdCiAqICAgICAgICBBdHRyaWJ1dGVzIHRvIGJlIGFwcGxpZWQuCiAqLwpmdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsLCBhdHRyaWJ1dGVzKSB7CiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0ck5hbWUpIHsKICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTsKCiAgICBpZiAoYXR0clZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBhdHRyVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IGF0dHJWYWx1ZSA9PT0gZmFsc2UpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlID09PSB0cnVlID8gJycgOiBhdHRyVmFsdWUpOwogICAgfQogIH0pOwp9CgovKioKICogR2V0IGFuIGVsZW1lbnQncyBhdHRyaWJ1dGUgdmFsdWVzLCBhcyBkZWZpbmVkIG9uIHRoZSBIVE1MIHRhZwogKiBBdHRyaWJ1dGVzIGFyZSBub3QgdGhlIHNhbWUgYXMgcHJvcGVydGllcy4gVGhleSdyZSBkZWZpbmVkIG9uIHRoZSB0YWcKICogb3Igd2l0aCBzZXRBdHRyaWJ1dGUgKHdoaWNoIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggSFRNTCkKICogVGhpcyB3aWxsIHJldHVybiB0cnVlIG9yIGZhbHNlIGZvciBib29sZWFuIGF0dHJpYnV0ZXMuCiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gdGFnCiAqICAgICAgICBFbGVtZW50IGZyb20gd2hpY2ggdG8gZ2V0IHRhZyBhdHRyaWJ1dGVzLgogKgogKiBAcmV0dXJuIHtPYmplY3R9CiAqICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQuCiAqLwpmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzKHRhZykgewogIHZhciBvYmogPSB7fTsKCiAgLy8ga25vd24gYm9vbGVhbiBhdHRyaWJ1dGVzCiAgLy8gd2UgY2FuIGNoZWNrIGZvciBtYXRjaGluZyBib29sZWFuIHByb3BlcnRpZXMsIGJ1dCBvbGRlciBicm93c2VycwogIC8vIHdvbid0IGtub3cgYWJvdXQgSFRNTDUgYm9vbGVhbiBhdHRyaWJ1dGVzIHRoYXQgd2Ugc3RpbGwgcmVhZCBmcm9tCiAgdmFyIGtub3duQm9vbGVhbnMgPSAnLCcgKyAnYXV0b3BsYXksY29udHJvbHMscGxheXNpbmxpbmUsbG9vcCxtdXRlZCxkZWZhdWx0LGRlZmF1bHRNdXRlZCcgKyAnLCc7CgogIGlmICh0YWcgJiYgdGFnLmF0dHJpYnV0ZXMgJiYgdGFnLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgewogICAgdmFyIGF0dHJzID0gdGFnLmF0dHJpYnV0ZXM7CgogICAgZm9yICh2YXIgaSA9IGF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJzW2ldLm5hbWU7CiAgICAgIHZhciBhdHRyVmFsID0gYXR0cnNbaV0udmFsdWU7CgogICAgICAvLyBjaGVjayBmb3Iga25vd24gYm9vbGVhbnMKICAgICAgLy8gdGhlIG1hdGNoaW5nIGVsZW1lbnQgcHJvcGVydHkgd2lsbCByZXR1cm4gYSB2YWx1ZSBmb3IgdHlwZW9mCiAgICAgIGlmICh0eXBlb2YgdGFnW2F0dHJOYW1lXSA9PT0gJ2Jvb2xlYW4nIHx8IGtub3duQm9vbGVhbnMuaW5kZXhPZignLCcgKyBhdHRyTmFtZSArICcsJykgIT09IC0xKSB7CiAgICAgICAgLy8gdGhlIHZhbHVlIG9mIGFuIGluY2x1ZGVkIGJvb2xlYW4gYXR0cmlidXRlIGlzIHR5cGljYWxseSBhbiBlbXB0eQogICAgICAgIC8vIHN0cmluZyAoJycpIHdoaWNoIHdvdWxkIGVxdWFsIGZhbHNlIGlmIHdlIGp1c3QgY2hlY2sgZm9yIGEgZmFsc2UgdmFsdWUuCiAgICAgICAgLy8gd2UgYWxzbyBkb24ndCB3YW50IHN1cHBvcnQgYmFkIGNvZGUgbGlrZSBhdXRvcGxheT0nZmFsc2UnCiAgICAgICAgYXR0clZhbCA9IGF0dHJWYWwgIT09IG51bGwgPyB0cnVlIDogZmFsc2U7CiAgICAgIH0KCiAgICAgIG9ialthdHRyTmFtZV0gPSBhdHRyVmFsOwogICAgfQogIH0KCiAgcmV0dXJuIG9iajsKfQoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZQogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBBIERPTSBlbGVtZW50CiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUKICogICAgICAgIEF0dHJpYnV0ZSB0byBnZXQgdGhlIHZhbHVlIG9mCiAqCiAqIEByZXR1cm4ge3N0cmluZ30KICogICAgICAgICB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCiAqLwpmdW5jdGlvbiBnZXRBdHRyaWJ1dGUoZWwsIGF0dHJpYnV0ZSkgewogIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKfQoKLyoqCiAqIFNldCB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCdzIGF0dHJpYnV0ZQogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBBIERPTSBlbGVtZW50CiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUKICogICAgICAgIEF0dHJpYnV0ZSB0byBzZXQKICoKICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAqICAgICAgICBWYWx1ZSB0byBzZXQgdGhlIGF0dHJpYnV0ZSB0bwogKi8KZnVuY3Rpb24gc2V0QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgZWwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpOwp9CgovKioKICogUmVtb3ZlIGFuIGVsZW1lbnQncyBhdHRyaWJ1dGUKICoKICogQHBhcmFtIHtFbGVtZW50fSBlbAogKiAgICAgICAgQSBET00gZWxlbWVudAogKgogKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlCiAqICAgICAgICBBdHRyaWJ1dGUgdG8gcmVtb3ZlCiAqLwpmdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGUoZWwsIGF0dHJpYnV0ZSkgewogIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwp9CgovKioKICogQXR0ZW1wdCB0byBibG9jayB0aGUgYWJpbGl0eSB0byBzZWxlY3QgdGV4dCB3aGlsZSBkcmFnZ2luZyBjb250cm9scwogKi8KZnVuY3Rpb24gYmxvY2tUZXh0U2VsZWN0aW9uKCkgewogIGRvY3VtZW50XzEuYm9keS5mb2N1cygpOwogIGRvY3VtZW50XzEub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9Owp9CgovKioKICogVHVybiBvZmYgdGV4dCBzZWxlY3Rpb24gYmxvY2tpbmcKICovCmZ1bmN0aW9uIHVuYmxvY2tUZXh0U2VsZWN0aW9uKCkgewogIGRvY3VtZW50XzEub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0cnVlOwogIH07Cn0KCi8qKgogKiBJZGVudGljYWwgdG8gdGhlIG5hdGl2ZSBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBmdW5jdGlvbiwgYnV0IGVuc3VyZXMgdGhhdAogKiB0aGUgbWV0aG9kIGlzIHN1cHBvcnRlZCBhdCBhbGwgKGl0IGlzIGluIGFsbCBicm93c2VycyB3ZSBjbGFpbSB0byBzdXBwb3J0KQogKiBhbmQgdGhhdCB0aGUgZWxlbWVudCBpcyBpbiB0aGUgRE9NIGJlZm9yZSBjb250aW51aW5nLgogKgogKiBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gYWxzbyBzaGltcyBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBub3QgcHJvdmlkZWQgYnkgc29tZQogKiBvbGRlciBicm93c2VycyAobmFtZWx5LCBJRTgpLgogKgogKiBBZGRpdGlvbmFsbHksIHNvbWUgYnJvd3NlcnMgZG8gbm90IHN1cHBvcnQgYWRkaW5nIHByb3BlcnRpZXMgdG8gYQogKiBgQ2xpZW50UmVjdGAvYERPTVJlY3RgIG9iamVjdDsgc28sIHdlIHNoYWxsb3ctY29weSBpdCB3aXRoIHRoZSBzdGFuZGFyZAogKiBwcm9wZXJ0aWVzIChleGNlcHQgYHhgIGFuZCBgeWAgd2hpY2ggYXJlIG5vdCB3aWRlbHkgc3VwcG9ydGVkKS4gVGhpcyBoZWxwcwogKiBhdm9pZCBpbXBsZW1lbnRhdGlvbnMgd2hlcmUga2V5cyBhcmUgbm9uLWVudW1lcmFibGUuCiAqCiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsCiAqICAgICAgICAgRWxlbWVudCB3aG9zZSBgQ2xpZW50UmVjdGAgd2Ugd2FudCB0byBjYWxjdWxhdGUuCiAqCiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9CiAqICAgICAgICAgQWx3YXlzIHJldHVybnMgYSBwbGFpbgogKi8KZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsKSB7CiAgaWYgKGVsICYmIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbC5wYXJlbnROb2RlKSB7CiAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHJlc3VsdCA9IHt9OwoKICAgIFsnYm90dG9tJywgJ2hlaWdodCcsICdsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICd3aWR0aCddLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgaWYgKHJlY3Rba10gIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJlc3VsdFtrXSA9IHJlY3Rba107CiAgICAgIH0KICAgIH0pOwoKICAgIGlmICghcmVzdWx0LmhlaWdodCkgewogICAgICByZXN1bHQuaGVpZ2h0ID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlKGVsLCAnaGVpZ2h0JykpOwogICAgfQoKICAgIGlmICghcmVzdWx0LndpZHRoKSB7CiAgICAgIHJlc3VsdC53aWR0aCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZShlbCwgJ3dpZHRoJykpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CgovKioKICogVGhlIHBvc3Rpb24gb2YgYSBET00gZWxlbWVudCBvbiB0aGUgcGFnZS4KICoKICogQHR5cGVkZWYge09iamVjdH0gbW9kdWxlOmRvbX5Qb3NpdGlvbgogKgogKiBAcHJvcGVydHkge251bWJlcn0gbGVmdAogKiAgICAgICAgICAgUGl4ZWxzIHRvIHRoZSBsZWZ0CiAqCiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AKICogICAgICAgICAgIFBpeGVscyBvbiB0b3AKICovCgovKioKICogT2Zmc2V0IExlZnQuCiAqIGdldEJvdW5kaW5nQ2xpZW50UmVjdCB0ZWNobmlxdWUgZnJvbQogKiBKb2huIFJlc2lnCiAqCiAqIEBzZWUgaHR0cDovL2Vqb2huLm9yZy9ibG9nL2dldGJvdW5kaW5nY2xpZW50cmVjdC1pcy1hd2Vzb21lLwogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBFbGVtZW50IGZyb20gd2hpY2ggdG8gZ2V0IG9mZnNldAogKgogKiBAcmV0dXJuIHttb2R1bGU6ZG9tflBvc2l0aW9ufQogKiAgICAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwYXNzZWQgaW4uCiAqLwpmdW5jdGlvbiBmaW5kUG9zaXRpb24oZWwpIHsKICB2YXIgYm94ID0gdm9pZCAwOwoKICBpZiAoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsLnBhcmVudE5vZGUpIHsKICAgIGJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIH0KCiAgaWYgKCFib3gpIHsKICAgIHJldHVybiB7CiAgICAgIGxlZnQ6IDAsCiAgICAgIHRvcDogMAogICAgfTsKICB9CgogIHZhciBkb2NFbCA9IGRvY3VtZW50XzEuZG9jdW1lbnRFbGVtZW50OwogIHZhciBib2R5ID0gZG9jdW1lbnRfMS5ib2R5OwoKICB2YXIgY2xpZW50TGVmdCA9IGRvY0VsLmNsaWVudExlZnQgfHwgYm9keS5jbGllbnRMZWZ0IHx8IDA7CiAgdmFyIHNjcm9sbExlZnQgPSB3aW5kb3dfMS5wYWdlWE9mZnNldCB8fCBib2R5LnNjcm9sbExlZnQ7CiAgdmFyIGxlZnQgPSBib3gubGVmdCArIHNjcm9sbExlZnQgLSBjbGllbnRMZWZ0OwoKICB2YXIgY2xpZW50VG9wID0gZG9jRWwuY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7CiAgdmFyIHNjcm9sbFRvcCA9IHdpbmRvd18xLnBhZ2VZT2Zmc2V0IHx8IGJvZHkuc2Nyb2xsVG9wOwogIHZhciB0b3AgPSBib3gudG9wICsgc2Nyb2xsVG9wIC0gY2xpZW50VG9wOwoKICAvLyBBbmRyb2lkIHNvbWV0aW1lcyByZXR1cm5zIHNsaWdodGx5IG9mZiBkZWNpbWFsIHZhbHVlcywgc28gbmVlZCB0byByb3VuZAogIHJldHVybiB7CiAgICBsZWZ0OiBNYXRoLnJvdW5kKGxlZnQpLAogICAgdG9wOiBNYXRoLnJvdW5kKHRvcCkKICB9Owp9CgovKioKICogeCBhbmQgeSBjb29yZGluYXRlcyBmb3IgYSBkb20gZWxlbWVudCBvciBtb3VzZSBwb2ludGVyCiAqCiAqIEB0eXBlZGVmIHtPYmplY3R9IERvbX5Db29yZGluYXRlcwogKgogKiBAcHJvcGVydHkge251bWJlcn0geAogKiAgICAgICAgICAgeCBjb29yZGluYXRlIGluIHBpeGVscwogKgogKiBAcHJvcGVydHkge251bWJlcn0geQogKiAgICAgICAgICAgeSBjb29yZGluYXRlIGluIHBpeGVscwogKi8KCi8qKgogKiBHZXQgcG9pbnRlciBwb3NpdGlvbiBpbiBlbGVtZW50CiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggeCBhbmQgeSBjb29yZGluYXRlcy4KICogVGhlIGJhc2Ugb24gdGhlIGNvb3JkaW5hdGVzIGFyZSB0aGUgYm90dG9tIGxlZnQgb2YgdGhlIGVsZW1lbnQuCiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwKICogICAgICAgIEVsZW1lbnQgb24gd2hpY2ggdG8gZ2V0IHRoZSBwb2ludGVyIHBvc2l0aW9uIG9uCiAqCiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAqICAgICAgICBFdmVudCBvYmplY3QKICoKICogQHJldHVybiB7RG9tfkNvb3JkaW5hdGVzfQogKiAgICAgICAgIEEgQ29vcmRpbmF0ZXMgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vdXNlIHBvc2l0aW9uLgogKgogKi8KZnVuY3Rpb24gZ2V0UG9pbnRlclBvc2l0aW9uKGVsLCBldmVudCkgewogIHZhciBwb3NpdGlvbiA9IHt9OwogIHZhciBib3ggPSBmaW5kUG9zaXRpb24oZWwpOwogIHZhciBib3hXID0gZWwub2Zmc2V0V2lkdGg7CiAgdmFyIGJveEggPSBlbC5vZmZzZXRIZWlnaHQ7CgogIHZhciBib3hZID0gYm94LnRvcDsKICB2YXIgYm94WCA9IGJveC5sZWZ0OwogIHZhciBwYWdlWSA9IGV2ZW50LnBhZ2VZOwogIHZhciBwYWdlWCA9IGV2ZW50LnBhZ2VYOwoKICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHsKICAgIHBhZ2VYID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7CiAgICBwYWdlWSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZOwogIH0KCiAgcG9zaXRpb24ueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChib3hZIC0gcGFnZVkgKyBib3hIKSAvIGJveEgpKTsKICBwb3NpdGlvbi54ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHBhZ2VYIC0gYm94WCkgLyBib3hXKSk7CgogIHJldHVybiBwb3NpdGlvbjsKfQoKLyoqCiAqIERldGVybWluZXMsIHZpYSBkdWNrIHR5cGluZywgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyBhIHRleHQgbm9kZS4KICoKICogQHBhcmFtIHtNaXhlZH0gdmFsdWUKICogICAgICAgIENoZWNrIGlmIHRoaXMgdmFsdWUgaXMgYSB0ZXh0IG5vZGUuCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgLSBUcnVlIGlmIGl0IGlzIGEgdGV4dCBub2RlCiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UKICovCmZ1bmN0aW9uIGlzVGV4dE5vZGUodmFsdWUpIHsKICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAzOwp9CgovKioKICogRW1wdGllcyB0aGUgY29udGVudHMgb2YgYW4gZWxlbWVudC4KICoKICogQHBhcmFtIHtFbGVtZW50fSBlbAogKiAgICAgICAgVGhlIGVsZW1lbnQgdG8gZW1wdHkgY2hpbGRyZW4gZnJvbQogKgogKiBAcmV0dXJuIHtFbGVtZW50fQogKiAgICAgICAgIFRoZSBlbGVtZW50IHdpdGggbm8gY2hpbGRyZW4KICovCmZ1bmN0aW9uIGVtcHR5RWwoZWwpIHsKICB3aGlsZSAoZWwuZmlyc3RDaGlsZCkgewogICAgZWwucmVtb3ZlQ2hpbGQoZWwuZmlyc3RDaGlsZCk7CiAgfQogIHJldHVybiBlbDsKfQoKLyoqCiAqIE5vcm1hbGl6ZXMgY29udGVudCBmb3IgZXZlbnR1YWwgaW5zZXJ0aW9uIGludG8gdGhlIERPTS4KICoKICogVGhpcyBhbGxvd3MgYSB3aWRlIHJhbmdlIG9mIGNvbnRlbnQgZGVmaW5pdGlvbiBtZXRob2RzLCBidXQgcHJvdGVjdHMKICogZnJvbSBmYWxsaW5nIGludG8gdGhlIHRyYXAgb2Ygc2ltcGx5IHdyaXRpbmcgdG8gYGlubmVySFRNTGAsIHdoaWNoIGlzCiAqIGFuIFhTUyBjb25jZXJuLgogKgogKiBUaGUgY29udGVudCBmb3IgYW4gZWxlbWVudCBjYW4gYmUgcGFzc2VkIGluIG11bHRpcGxlIHR5cGVzIGFuZAogKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6CiAqCiAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnQKICogICAgICAgIC0gU3RyaW5nOiBOb3JtYWxpemVkIGludG8gYSB0ZXh0IG5vZGUuCiAqICAgICAgICAtIEVsZW1lbnQvVGV4dE5vZGU6IFBhc3NlZCB0aHJvdWdoLgogKiAgICAgICAgLSBBcnJheTogQSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgb2Ygc3RyaW5ncywgZWxlbWVudHMsIG5vZGVzLCBvciBmdW5jdGlvbnMKICogICAgICAgICAgKHdoaWNoIHJldHVybiBzaW5nbGUgc3RyaW5ncywgZWxlbWVudHMsIG9yIG5vZGVzKS4KICogICAgICAgIC0gRnVuY3Rpb246IElmIHRoZSBzb2xlIGFyZ3VtZW50LCBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGEgc3RyaW5nLCBlbGVtZW50LAogKiAgICAgICAgICBub2RlLCBvciBhcnJheSBhcyBkZWZpbmVkIGFib3ZlLgogKgogKiBAcmV0dXJuIHtBcnJheX0KICogICAgICAgICBBbGwgb2YgdGhlIGNvbnRlbnQgdGhhdCB3YXMgcGFzc2VkIGluIG5vcm1hbGl6ZWQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVDb250ZW50KGNvbnRlbnQpIHsKCiAgLy8gRmlyc3QsIGludm9rZSBjb250ZW50IGlmIGl0IGlzIGEgZnVuY3Rpb24uIElmIGl0IHByb2R1Y2VzIGFuIGFycmF5LAogIC8vIHRoYXQgbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSBub3JtYWxpemF0aW9uLgogIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgY29udGVudCA9IGNvbnRlbnQoKTsKICB9CgogIC8vIE5leHQgdXAsIG5vcm1hbGl6ZSB0byBhbiBhcnJheSwgc28gb25lIG9yIG1hbnkgaXRlbXMgY2FuIGJlIG5vcm1hbGl6ZWQsCiAgLy8gZmlsdGVyZWQsIGFuZCByZXR1cm5lZC4KICByZXR1cm4gKEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50IDogW2NvbnRlbnRdKS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7CgogICAgLy8gRmlyc3QsIGludm9rZSB2YWx1ZSBpZiBpdCBpcyBhIGZ1bmN0aW9uIHRvIHByb2R1Y2UgYSBuZXcgdmFsdWUsCiAgICAvLyB3aGljaCB3aWxsIGJlIHN1YnNlcXVlbnRseSBub3JtYWxpemVkIHRvIGEgTm9kZSBvZiBzb21lIGtpbmQuCiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhbHVlID0gdmFsdWUoKTsKICAgIH0KCiAgICBpZiAoaXNFbCh2YWx1ZSkgfHwgaXNUZXh0Tm9kZSh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9cUy8udGVzdCh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIGRvY3VtZW50XzEuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwogICAgfQogIH0pLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZTsKICB9KTsKfQoKLyoqCiAqIE5vcm1hbGl6ZXMgYW5kIGFwcGVuZHMgY29udGVudCB0byBhbiBlbGVtZW50LgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBFbGVtZW50IHRvIGFwcGVuZCBub3JtYWxpemVkIGNvbnRlbnQgdG8uCiAqCiAqCiAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnQKICogICAgICAgIFNlZSB0aGUgYGNvbnRlbnRgIGFyZ3VtZW50IG9mIHtAbGluayBkb206bm9ybWFsaXplQ29udGVudH0KICoKICogQHJldHVybiB7RWxlbWVudH0KICogICAgICAgICBUaGUgZWxlbWVudCB3aXRoIGFwcGVuZGVkIG5vcm1hbGl6ZWQgY29udGVudC4KICovCmZ1bmN0aW9uIGFwcGVuZENvbnRlbnQoZWwsIGNvbnRlbnQpIHsKICBub3JtYWxpemVDb250ZW50KGNvbnRlbnQpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsKICAgIHJldHVybiBlbC5hcHBlbmRDaGlsZChub2RlKTsKICB9KTsKICByZXR1cm4gZWw7Cn0KCi8qKgogKiBOb3JtYWxpemVzIGFuZCBpbnNlcnRzIGNvbnRlbnQgaW50byBhbiBlbGVtZW50OyB0aGlzIGlzIGlkZW50aWNhbCB0bwogKiBgYXBwZW5kQ29udGVudCgpYCwgZXhjZXB0IGl0IGVtcHRpZXMgdGhlIGVsZW1lbnQgZmlyc3QuCiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwKICogICAgICAgIEVsZW1lbnQgdG8gaW5zZXJ0IG5vcm1hbGl6ZWQgY29udGVudCBpbnRvLgogKgogKiBAcGFyYW0ge1N0cmluZ3xFbGVtZW50fFRleHROb2RlfEFycmF5fEZ1bmN0aW9ufSBjb250ZW50CiAqICAgICAgICBTZWUgdGhlIGBjb250ZW50YCBhcmd1bWVudCBvZiB7QGxpbmsgZG9tOm5vcm1hbGl6ZUNvbnRlbnR9CiAqCiAqIEByZXR1cm4ge0VsZW1lbnR9CiAqICAgICAgICAgVGhlIGVsZW1lbnQgd2l0aCBpbnNlcnRlZCBub3JtYWxpemVkIGNvbnRlbnQuCiAqCiAqLwpmdW5jdGlvbiBpbnNlcnRDb250ZW50KGVsLCBjb250ZW50KSB7CiAgcmV0dXJuIGFwcGVuZENvbnRlbnQoZW1wdHlFbChlbCksIGNvbnRlbnQpOwp9CgovKioKICogQ2hlY2sgaWYgZXZlbnQgd2FzIGEgc2luZ2xlIGxlZnQgY2xpY2sKICoKICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICogICAgICAgIEV2ZW50IG9iamVjdAogKgogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVHJ1ZSBpZiBhIGxlZnQgY2xpY2sKICogICAgICAgICAtIEZhbHNlIGlmIG5vdCBhIGxlZnQgY2xpY2sKICovCmZ1bmN0aW9uIGlzU2luZ2xlTGVmdENsaWNrKGV2ZW50KSB7CiAgLy8gTm90ZTogaWYgeW91IGNyZWF0ZSBzb21ldGhpbmcgZHJhZ2dhYmxlLCBiZSBzdXJlIHRvCiAgLy8gY2FsbCBpdCBvbiBib3RoIGBtb3VzZWRvd25gIGFuZCBgbW91c2Vtb3ZlYCBldmVudCwKICAvLyBvdGhlcndpc2UgYG1vdXNlZG93bmAgc2hvdWxkIGJlIGVub3VnaCBmb3IgYSBidXR0b24KCiAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gdW5kZWZpbmVkICYmIGV2ZW50LmJ1dHRvbnMgPT09IHVuZGVmaW5lZCkgewogICAgLy8gV2h5IGRvIHdlIG5lZWQgYGJ1dHR0b25zYCA/CiAgICAvLyBCZWNhdXNlLCBtaWRkbGUgbW91c2Ugc29tZXRpbWVzIGhhdmUgdGhpczoKICAgIC8vIGUuYnV0dG9uID09PSAwIGFuZCBlLmJ1dHRvbnMgPT09IDQKICAgIC8vIEZ1cnRoZXJtb3JlLCB3ZSB3YW50IHRvIHByZXZlbnQgY29tYmluYXRpb24gY2xpY2ssIHNvbWV0aGluZyBsaWtlCiAgICAvLyBIT0xEIG1pZGRsZW1vdXNlIHRoZW4gbGVmdCBjbGljaywgdGhhdCB3b3VsZCBiZQogICAgLy8gZS5idXR0b24gPT09IDAsIGUuYnV0dG9ucyA9PT0gNQogICAgLy8ganVzdCBgYnV0dG9uYCBpcyBub3QgZ29ubmEgd29yawoKICAgIC8vIEFscmlnaHQsIHRoZW4gd2hhdCB0aGlzIGJsb2NrIGRvZXMgPwogICAgLy8gdGhpcyBpcyBmb3IgY2hyb21lIGBzaW11bGF0ZSBtb2JpbGUgZGV2aWNlc2AKICAgIC8vIEkgd2FudCB0byBzdXBwb3J0IHRoaXMgYXMgd2VsbAoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5idXR0b25zID09PSB1bmRlZmluZWQpIHsKICAgIC8vIFRvdWNoIHNjcmVlbiwgc29tZXRpbWVzIG9uIHNvbWUgc3BlY2lmaWMgZGV2aWNlLCBgYnV0dG9uc2AKICAgIC8vIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyAoc2FmYXJpIG9uIGlvcywgYmxhY2tiZXJyeS4uLikKCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGlmIChJRV9WRVJTSU9OID09PSA5KSB7CiAgICAvLyBJZ25vcmUgSUU5CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmJ1dHRvbnMgIT09IDEpIHsKICAgIC8vIFRoaXMgaXMgdGhlIHJlYXNvbiB3ZSBoYXZlIHRob3NlIGlmIGVsc2UgYmxvY2sgYWJvdmUKICAgIC8vIGlmIGFueSBzcGVjaWFsIGNhc2Ugd2UgY2FuIGNhdGNoIGFuZCBsZXQgaXQgc2xpZGUKICAgIC8vIHdlIGRvIGl0IGFib3ZlLCB3aGVuIGdldCB0byBoZXJlLCB0aGlzIGRlZmluaXRlbHkKICAgIC8vIGlzLW5vdC1sZWZ0LWNsaWNrCgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBGaW5kcyBhIHNpbmdsZSBET00gZWxlbWVudCBtYXRjaGluZyBgc2VsZWN0b3JgIHdpdGhpbiB0aGUgb3B0aW9uYWwKICogYGNvbnRleHRgIG9mIGFub3RoZXIgRE9NIGVsZW1lbnQgKGRlZmF1bHRpbmcgdG8gYGRvY3VtZW50YCkuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogKiAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYC4KICoKICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gW2NvbnRleHQ9ZG9jdW1lbnRdCiAqICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvcgogKiAgICAgICAgc3RyaW5nIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgd2lsbCBiZSB1c2VkCiAqICAgICAgICBhcyBjb250ZXh0LiBJZiBtaXNzaW5nIChvciBubyBlbGVtZW50IG1hdGNoZXMgc2VsZWN0b3IpLCBmYWxscwogKiAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLgogKgogKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9CiAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgZm91bmQgb3IgbnVsbC4KICovCnZhciAkID0gY3JlYXRlUXVlcmllcigncXVlcnlTZWxlY3RvcicpOwoKLyoqCiAqIEZpbmRzIGEgYWxsIERPTSBlbGVtZW50cyBtYXRjaGluZyBgc2VsZWN0b3JgIHdpdGhpbiB0aGUgb3B0aW9uYWwKICogYGNvbnRleHRgIG9mIGFub3RoZXIgRE9NIGVsZW1lbnQgKGRlZmF1bHRpbmcgdG8gYGRvY3VtZW50YCkuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogKiAgICAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yQWxsYC4KICoKICogQHBhcmFtIHtFbGVtZW50fFN0cmluZ30gW2NvbnRleHQ9ZG9jdW1lbnRdCiAqICAgICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvcgogKiAgICAgICAgICAgc3RyaW5nIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgd2lsbCBiZSB1c2VkCiAqICAgICAgICAgICBhcyBjb250ZXh0LiBJZiBtaXNzaW5nIChvciBubyBlbGVtZW50IG1hdGNoZXMgc2VsZWN0b3IpLCBmYWxscwogKiAgICAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLgogKgogKiBAcmV0dXJuIHtOb2RlTGlzdH0KICogICAgICAgICBBIGVsZW1lbnQgbGlzdCBvZiBlbGVtZW50cyB0aGF0IHdlcmUgZm91bmQuIFdpbGwgYmUgZW1wdHkgaWYgbm9uZSB3ZXJlIGZvdW5kLgogKgogKi8KdmFyICQkID0gY3JlYXRlUXVlcmllcigncXVlcnlTZWxlY3RvckFsbCcpOwoKCgp2YXIgRG9tID0gKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh7Cglpc1JlYWw6IGlzUmVhbCwKCWlzRWw6IGlzRWwsCglpc0luRnJhbWU6IGlzSW5GcmFtZSwKCWNyZWF0ZUVsOiBjcmVhdGVFbCwKCXRleHRDb250ZW50OiB0ZXh0Q29udGVudCwKCXByZXBlbmRUbzogcHJlcGVuZFRvLAoJaGFzQ2xhc3M6IGhhc0NsYXNzLAoJYWRkQ2xhc3M6IGFkZENsYXNzLAoJcmVtb3ZlQ2xhc3M6IHJlbW92ZUNsYXNzLAoJdG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLAoJc2V0QXR0cmlidXRlczogc2V0QXR0cmlidXRlcywKCWdldEF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXMsCglnZXRBdHRyaWJ1dGU6IGdldEF0dHJpYnV0ZSwKCXNldEF0dHJpYnV0ZTogc2V0QXR0cmlidXRlLAoJcmVtb3ZlQXR0cmlidXRlOiByZW1vdmVBdHRyaWJ1dGUsCglibG9ja1RleHRTZWxlY3Rpb246IGJsb2NrVGV4dFNlbGVjdGlvbiwKCXVuYmxvY2tUZXh0U2VsZWN0aW9uOiB1bmJsb2NrVGV4dFNlbGVjdGlvbiwKCWdldEJvdW5kaW5nQ2xpZW50UmVjdDogZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAoJZmluZFBvc2l0aW9uOiBmaW5kUG9zaXRpb24sCglnZXRQb2ludGVyUG9zaXRpb246IGdldFBvaW50ZXJQb3NpdGlvbiwKCWlzVGV4dE5vZGU6IGlzVGV4dE5vZGUsCgllbXB0eUVsOiBlbXB0eUVsLAoJbm9ybWFsaXplQ29udGVudDogbm9ybWFsaXplQ29udGVudCwKCWFwcGVuZENvbnRlbnQ6IGFwcGVuZENvbnRlbnQsCglpbnNlcnRDb250ZW50OiBpbnNlcnRDb250ZW50LAoJaXNTaW5nbGVMZWZ0Q2xpY2s6IGlzU2luZ2xlTGVmdENsaWNrLAoJJDogJCwKCSQkOiAkJAp9KTsKCi8qKgogKiBAZmlsZSBndWlkLmpzCiAqIEBtb2R1bGUgZ3VpZAogKi8KCi8qKgogKiBVbmlxdWUgSUQgZm9yIGFuIGVsZW1lbnQgb3IgZnVuY3Rpb24KICogQHR5cGUge051bWJlcn0KICovCnZhciBfZ3VpZCA9IDE7CgovKioKICogR2V0IGEgdW5pcXVlIGF1dG8taW5jcmVtZW50aW5nIElEIGJ5IG51bWJlciB0aGF0IGhhcyBub3QgYmVlbiByZXR1cm5lZCBiZWZvcmUuCiAqCiAqIEByZXR1cm4ge251bWJlcn0KICogICAgICAgICBBIG5ldyB1bmlxdWUgSUQuCiAqLwpmdW5jdGlvbiBuZXdHVUlEKCkgewogIHJldHVybiBfZ3VpZCsrOwp9CgovKioKICogQGZpbGUgZG9tLWRhdGEuanMKICogQG1vZHVsZSBkb20tZGF0YQogKi8KLyoqCiAqIEVsZW1lbnQgRGF0YSBTdG9yZS4KICoKICogQWxsb3dzIGZvciBiaW5kaW5nIGRhdGEgdG8gYW4gZWxlbWVudCB3aXRob3V0IHB1dHRpbmcgaXQgZGlyZWN0bHkgb24gdGhlCiAqIGVsZW1lbnQuIEV4LiBFdmVudCBsaXN0ZW5lcnMgYXJlIHN0b3JlZCBoZXJlLgogKiAoYWxzbyBmcm9tIGpzbmluamEuY29tLCBzbGlnaHRseSBtb2RpZmllZCBhbmQgdXBkYXRlZCBmb3IgY2xvc3VyZSBjb21waWxlcikKICoKICogQHR5cGUge09iamVjdH0KICogQHByaXZhdGUKICovCnZhciBlbERhdGEgPSB7fTsKCi8qCiAqIFVuaXF1ZSBhdHRyaWJ1dGUgbmFtZSB0byBzdG9yZSBhbiBlbGVtZW50J3MgZ3VpZCBpbgogKgogKiBAdHlwZSB7U3RyaW5nfQogKiBAY29uc3RhbnQKICogQHByaXZhdGUKICovCnZhciBlbElkQXR0ciA9ICd2ZGF0YScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCi8qKgogKiBSZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgd2hlcmUgZGF0YSBmb3IgYW4gZWxlbWVudCBpcyBzdG9yZWQKICoKICogQHBhcmFtIHtFbGVtZW50fSBlbAogKiAgICAgICAgRWxlbWVudCB0byBzdG9yZSBkYXRhIGZvci4KICoKICogQHJldHVybiB7T2JqZWN0fQogKiAgICAgICAgIFRoZSBjYWNoZSBvYmplY3QgZm9yIHRoYXQgZWwgdGhhdCB3YXMgcGFzc2VkIGluLgogKi8KZnVuY3Rpb24gZ2V0RGF0YShlbCkgewogIHZhciBpZCA9IGVsW2VsSWRBdHRyXTsKCiAgaWYgKCFpZCkgewogICAgaWQgPSBlbFtlbElkQXR0cl0gPSBuZXdHVUlEKCk7CiAgfQoKICBpZiAoIWVsRGF0YVtpZF0pIHsKICAgIGVsRGF0YVtpZF0gPSB7fTsKICB9CgogIHJldHVybiBlbERhdGFbaWRdOwp9CgovKioKICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGhhcyBjYWNoZWQgZGF0YQogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBDaGVjayBpZiB0aGlzIGVsZW1lbnQgaGFzIGNhY2hlZCBkYXRhLgogKgogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVHJ1ZSBpZiB0aGUgRE9NIGVsZW1lbnQgaGFzIGNhY2hlZCBkYXRhLgogKiAgICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gaGFzRGF0YShlbCkgewogIHZhciBpZCA9IGVsW2VsSWRBdHRyXTsKCiAgaWYgKCFpZCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgcmV0dXJuICEhT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZWxEYXRhW2lkXSkubGVuZ3RoOwp9CgovKioKICogRGVsZXRlIGRhdGEgZm9yIHRoZSBlbGVtZW50IGZyb20gdGhlIGNhY2hlIGFuZCB0aGUgZ3VpZCBhdHRyIGZyb20gZ2V0RWxlbWVudEJ5SWQKICoKICogQHBhcmFtIHtFbGVtZW50fSBlbAogKiAgICAgICAgUmVtb3ZlIGNhY2hlZCBkYXRhIGZvciB0aGlzIGVsZW1lbnQuCiAqLwpmdW5jdGlvbiByZW1vdmVEYXRhKGVsKSB7CiAgdmFyIGlkID0gZWxbZWxJZEF0dHJdOwoKICBpZiAoIWlkKSB7CiAgICByZXR1cm47CiAgfQoKICAvLyBSZW1vdmUgYWxsIHN0b3JlZCBkYXRhCiAgZGVsZXRlIGVsRGF0YVtpZF07CgogIC8vIFJlbW92ZSB0aGUgZWxJZEF0dHIgcHJvcGVydHkgZnJvbSB0aGUgRE9NIG5vZGUKICB0cnkgewogICAgZGVsZXRlIGVsW2VsSWRBdHRyXTsKICB9IGNhdGNoIChlKSB7CiAgICBpZiAoZWwucmVtb3ZlQXR0cmlidXRlKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShlbElkQXR0cik7CiAgICB9IGVsc2UgewogICAgICAvLyBJRSBkb2Vzbid0IGFwcGVhciB0byBzdXBwb3J0IHJlbW92ZUF0dHJpYnV0ZSBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudAogICAgICBlbFtlbElkQXR0cl0gPSBudWxsOwogICAgfQogIH0KfQoKLyoqCiAqIEBmaWxlIGV2ZW50cy5qcy4gQW4gRXZlbnQgU3lzdGVtIChKb2huIFJlc2lnIC0gU2VjcmV0cyBvZiBhIEpTIE5pbmphIGh0dHA6Ly9qc25pbmphLmNvbS8pCiAqIChPcmlnaW5hbCBib29rIHZlcnNpb24gd2Fzbid0IGNvbXBsZXRlbHkgdXNhYmxlLCBzbyBmaXhlZCBzb21lIHRoaW5ncyBhbmQgbWFkZSBDbG9zdXJlIENvbXBpbGVyIGNvbXBhdGlibGUpCiAqIFRoaXMgc2hvdWxkIHdvcmsgdmVyeSBzaW1pbGFybHkgdG8galF1ZXJ5J3MgZXZlbnRzLCBob3dldmVyIGl0J3MgYmFzZWQgb2ZmIHRoZSBib29rIHZlcnNpb24gd2hpY2ggaXNuJ3QgYXMKICogcm9idXN0IGFzIGpxdWVyeSdzLCBzbyB0aGVyZSdzIHByb2JhYmx5IHNvbWUgZGlmZmVyZW5jZXMuCiAqCiAqIEBtb2R1bGUgZXZlbnRzCiAqLwoKLyoqCiAqIENsZWFuIHVwIHRoZSBsaXN0ZW5lciBjYWNoZSBhbmQgZGlzcGF0Y2hlcnMKICoKICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbQogKiAgICAgICAgRWxlbWVudCB0byBjbGVhbiB1cAogKgogKiBAcGFyYW0ge3N0cmluZ30gdHlwZQogKiAgICAgICAgVHlwZSBvZiBldmVudCB0byBjbGVhbiB1cAogKi8KZnVuY3Rpb24gX2NsZWFuVXBFdmVudHMoZWxlbSwgdHlwZSkgewogIHZhciBkYXRhID0gZ2V0RGF0YShlbGVtKTsKCiAgLy8gUmVtb3ZlIHRoZSBldmVudHMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgaWYgdGhlcmUgYXJlIG5vbmUgbGVmdAogIGlmIChkYXRhLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCA9PT0gMCkgewogICAgZGVsZXRlIGRhdGEuaGFuZGxlcnNbdHlwZV07CiAgICAvLyBkYXRhLmhhbmRsZXJzW3R5cGVdID0gbnVsbDsKICAgIC8vIFNldHRpbmcgdG8gbnVsbCB3YXMgY2F1c2luZyBhbiBlcnJvciB3aXRoIGRhdGEuaGFuZGxlcnMKCiAgICAvLyBSZW1vdmUgdGhlIG1ldGEtaGFuZGxlciBmcm9tIHRoZSBlbGVtZW50CiAgICBpZiAoZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKSB7CiAgICAgIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIGZhbHNlKTsKICAgIH0gZWxzZSBpZiAoZWxlbS5kZXRhY2hFdmVudCkgewogICAgICBlbGVtLmRldGFjaEV2ZW50KCdvbicgKyB0eXBlLCBkYXRhLmRpc3BhdGNoZXIpOwogICAgfQogIH0KCiAgLy8gUmVtb3ZlIHRoZSBldmVudHMgb2JqZWN0IGlmIHRoZXJlIGFyZSBubyB0eXBlcyBsZWZ0CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRhdGEuaGFuZGxlcnMpLmxlbmd0aCA8PSAwKSB7CiAgICBkZWxldGUgZGF0YS5oYW5kbGVyczsKICAgIGRlbGV0ZSBkYXRhLmRpc3BhdGNoZXI7CiAgICBkZWxldGUgZGF0YS5kaXNhYmxlZDsKICB9CgogIC8vIEZpbmFsbHkgcmVtb3ZlIHRoZSBlbGVtZW50IGRhdGEgaWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0CiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRhdGEpLmxlbmd0aCA9PT0gMCkgewogICAgcmVtb3ZlRGF0YShlbGVtKTsKICB9Cn0KCi8qKgogKiBMb29wcyB0aHJvdWdoIGFuIGFycmF5IG9mIGV2ZW50IHR5cGVzIGFuZCBjYWxscyB0aGUgcmVxdWVzdGVkIG1ldGhvZCBmb3IgZWFjaCB0eXBlLgogKgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgogKiAgICAgICAgVGhlIGV2ZW50IG1ldGhvZCB3ZSB3YW50IHRvIHVzZS4KICoKICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbQogKiAgICAgICAgRWxlbWVudCBvciBvYmplY3QgdG8gYmluZCBsaXN0ZW5lcnMgdG8KICoKICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKICogICAgICAgIFR5cGUgb2YgZXZlbnQgdG8gYmluZCB0by4KICoKICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBjYWxsYmFjawogKiAgICAgICAgRXZlbnQgbGlzdGVuZXIuCiAqLwpmdW5jdGlvbiBfaGFuZGxlTXVsdGlwbGVFdmVudHMoZm4sIGVsZW0sIHR5cGVzLCBjYWxsYmFjaykgewogIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgIC8vIENhbGwgdGhlIGV2ZW50IG1ldGhvZCBmb3IgZWFjaCBvbmUgb2YgdGhlIHR5cGVzCiAgICBmbihlbGVtLCB0eXBlLCBjYWxsYmFjayk7CiAgfSk7Cn0KCi8qKgogKiBGaXggYSBuYXRpdmUgZXZlbnQgdG8gaGF2ZSBzdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZXMKICoKICogQHBhcmFtIHtPYmplY3R9IGV2ZW50CiAqICAgICAgICBFdmVudCBvYmplY3QgdG8gZml4LgogKgogKiBAcmV0dXJuIHtPYmplY3R9CiAqICAgICAgICAgRml4ZWQgZXZlbnQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZml4RXZlbnQoZXZlbnQpIHsKCiAgZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBUZXN0IGlmIGZpeGluZyB1cCBpcyBuZWVkZWQKICAvLyBVc2VkIHRvIGNoZWNrIGlmICFldmVudC5zdG9wUHJvcGFnYXRpb24gaW5zdGVhZCBvZiBpc1Byb3BhZ2F0aW9uU3RvcHBlZAogIC8vIEJ1dCBuYXRpdmUgZXZlbnRzIHJldHVybiB0cnVlIGZvciBzdG9wUHJvcGFnYXRpb24sIGJ1dCBkb24ndCBoYXZlCiAgLy8gb3RoZXIgZXhwZWN0ZWQgbWV0aG9kcyBsaWtlIGlzUHJvcGFnYXRpb25TdG9wcGVkLiBTZWVtcyB0byBiZSBhIHByb2JsZW0KICAvLyB3aXRoIHRoZSBKYXZhc2NyaXB0IE5pbmphIGNvZGUuIFNvIHdlJ3JlIGp1c3Qgb3ZlcnJpZGluZyBhbGwgZXZlbnRzIG5vdy4KICBpZiAoIWV2ZW50IHx8ICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCkgewogICAgdmFyIG9sZCA9IGV2ZW50IHx8IHdpbmRvd18xLmV2ZW50OwoKICAgIGV2ZW50ID0ge307CiAgICAvLyBDbG9uZSB0aGUgb2xkIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgdGhlIHZhbHVlcyBldmVudCA9IHt9OwogICAgLy8gSUU4IERvZXNuJ3QgbGlrZSB3aGVuIHlvdSBtZXNzIHdpdGggbmF0aXZlIGV2ZW50IHByb3BlcnRpZXMKICAgIC8vIEZpcmVmb3ggcmV0dXJucyBmYWxzZSBmb3IgZXZlbnQuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSBhbmQgb3RoZXIgcHJvcHMKICAgIC8vICB3aGljaCBtYWtlcyBjb3B5aW5nIG1vcmUgZGlmZmljdWx0LgogICAgLy8gVE9ETzogUHJvYmFibHkgYmVzdCB0byBjcmVhdGUgYSB3aGl0ZWxpc3Qgb2YgZXZlbnQgcHJvcHMKICAgIGZvciAodmFyIGtleSBpbiBvbGQpIHsKICAgICAgLy8gU2FmYXJpIDYuMC4zIHdhcm5zIHlvdSBpZiB5b3UgdHJ5IHRvIGNvcHkgZGVwcmVjYXRlZCBsYXllclgvWQogICAgICAvLyBDaHJvbWUgd2FybnMgeW91IGlmIHlvdSB0cnkgdG8gY29weSBkZXByZWNhdGVkIGtleWJvYXJkRXZlbnQua2V5TG9jYXRpb24KICAgICAgLy8gYW5kIHdlYmtpdE1vdmVtZW50WC9ZCiAgICAgIGlmIChrZXkgIT09ICdsYXllclgnICYmIGtleSAhPT0gJ2xheWVyWScgJiYga2V5ICE9PSAna2V5TG9jYXRpb24nICYmIGtleSAhPT0gJ3dlYmtpdE1vdmVtZW50WCcgJiYga2V5ICE9PSAnd2Via2l0TW92ZW1lbnRZJykgewogICAgICAgIC8vIENocm9tZSAzMisgd2FybnMgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQgcmV0dXJuVmFsdWUsIGJ1dAogICAgICAgIC8vIHdlIHN0aWxsIHdhbnQgdG8gaWYgcHJldmVudERlZmF1bHQgaXNuJ3Qgc3VwcG9ydGVkIChJRTgpLgogICAgICAgIGlmICghKGtleSA9PT0gJ3JldHVyblZhbHVlJyAmJiBvbGQucHJldmVudERlZmF1bHQpKSB7CiAgICAgICAgICBldmVudFtrZXldID0gb2xkW2tleV07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVGhlIGV2ZW50IG9jY3VycmVkIG9uIHRoaXMgZWxlbWVudAogICAgaWYgKCFldmVudC50YXJnZXQpIHsKICAgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudF8xOwogICAgfQoKICAgIC8vIEhhbmRsZSB3aGljaCBvdGhlciBlbGVtZW50IHRoZSBldmVudCBpcyByZWxhdGVkIHRvCiAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHsKICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKICAgIH0KCiAgICAvLyBTdG9wIHRoZSBkZWZhdWx0IGJyb3dzZXIgYWN0aW9uCiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKG9sZC5wcmV2ZW50RGVmYXVsdCkgewogICAgICAgIG9sZC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIG9sZC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsKICAgIH07CgogICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlOwoKICAgIC8vIFN0b3AgdGhlIGV2ZW50IGZyb20gYnViYmxpbmcKICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKG9sZC5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICBvbGQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0KICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKICAgICAgb2xkLmNhbmNlbEJ1YmJsZSA9IHRydWU7CiAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKICAgIH07CgogICAgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5GYWxzZTsKCiAgICAvLyBTdG9wIHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIGFuZCBleGVjdXRpbmcgb3RoZXIgaGFuZGxlcnMKICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKG9sZC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHsKICAgICAgICBvbGQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgIH0KICAgICAgZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH07CgogICAgZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5GYWxzZTsKCiAgICAvLyBIYW5kbGUgbW91c2UgcG9zaXRpb24KICAgIGlmIChldmVudC5jbGllbnRYICE9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgZG9jID0gZG9jdW1lbnRfMS5kb2N1bWVudEVsZW1lbnQ7CiAgICAgIHZhciBib2R5ID0gZG9jdW1lbnRfMS5ib2R5OwoKICAgICAgZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CiAgICAgIGV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50VG9wIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgfHwgMCk7CiAgICB9CgogICAgLy8gSGFuZGxlIGtleSBwcmVzc2VzCiAgICBldmVudC53aGljaCA9IGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmtleUNvZGU7CgogICAgLy8gRml4IGJ1dHRvbiBmb3IgbW91c2UgY2xpY2tzOgogICAgLy8gMCA9PSBsZWZ0OyAxID09IG1pZGRsZTsgMiA9PSByaWdodAogICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gbnVsbCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCkgewoKICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGRvZXMgbm90IHBhc3MgdmlkZW9qcy1zdGFuZGFyZAogICAgICAvLyBhbmQuLi4geWlrZXMuCiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovCiAgICAgIGV2ZW50LmJ1dHRvbiA9IGV2ZW50LmJ1dHRvbiAmIDEgPyAwIDogZXZlbnQuYnV0dG9uICYgNCA/IDEgOiBldmVudC5idXR0b24gJiAyID8gMiA6IDA7CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIC8vIFJldHVybnMgZml4ZWQtdXAgaW5zdGFuY2UKICByZXR1cm4gZXZlbnQ7Cn0KCi8qKgogKiBXaGV0aGVyIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZSBzdXBwb3J0ZWQKICovCnZhciBfc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7CgooZnVuY3Rpb24gKCkgewogIHRyeSB7CiAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIF9zdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KTsKCiAgICB3aW5kb3dfMS5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB3aW5kb3dfMS5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgfSBjYXRjaCAoZSkgewogICAgLy8gZGlzcmVnYXJkCiAgfQp9KSgpOwoKLyoqCiAqIFRvdWNoIGV2ZW50cyBDaHJvbWUgZXhwZWN0cyB0byBiZSBwYXNzaXZlCiAqLwp2YXIgcGFzc2l2ZUV2ZW50cyA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnXTsKCi8qKgogKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gZWxlbWVudAogKiBJdCBzdG9yZXMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBjYWNoZSBvYmplY3QKICogYW5kIGFkZHMgYSBnZW5lcmljIGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQncyBldmVudCwKICogYWxvbmcgd2l0aCBhIHVuaXF1ZSBpZCAoZ3VpZCkgdG8gdGhlIGVsZW1lbnQuCiAqCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0KICogICAgICAgIEVsZW1lbnQgb3Igb2JqZWN0IHRvIGJpbmQgbGlzdGVuZXJzIHRvCiAqCiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSB0eXBlCiAqICAgICAgICBUeXBlIG9mIGV2ZW50IHRvIGJpbmQgdG8uCiAqCiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gZm4KICogICAgICAgIEV2ZW50IGxpc3RlbmVyLgogKi8KZnVuY3Rpb24gb24oZWxlbSwgdHlwZSwgZm4pIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkgewogICAgcmV0dXJuIF9oYW5kbGVNdWx0aXBsZUV2ZW50cyhvbiwgZWxlbSwgdHlwZSwgZm4pOwogIH0KCiAgdmFyIGRhdGEgPSBnZXREYXRhKGVsZW0pOwoKICAvLyBXZSBuZWVkIGEgcGxhY2UgdG8gc3RvcmUgYWxsIG91ciBoYW5kbGVyIGRhdGEKICBpZiAoIWRhdGEuaGFuZGxlcnMpIHsKICAgIGRhdGEuaGFuZGxlcnMgPSB7fTsKICB9CgogIGlmICghZGF0YS5oYW5kbGVyc1t0eXBlXSkgewogICAgZGF0YS5oYW5kbGVyc1t0eXBlXSA9IFtdOwogIH0KCiAgaWYgKCFmbi5ndWlkKSB7CiAgICBmbi5ndWlkID0gbmV3R1VJRCgpOwogIH0KCiAgZGF0YS5oYW5kbGVyc1t0eXBlXS5wdXNoKGZuKTsKCiAgaWYgKCFkYXRhLmRpc3BhdGNoZXIpIHsKICAgIGRhdGEuZGlzYWJsZWQgPSBmYWxzZTsKCiAgICBkYXRhLmRpc3BhdGNoZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhhc2gpIHsKCiAgICAgIGlmIChkYXRhLmRpc2FibGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBldmVudCA9IGZpeEV2ZW50KGV2ZW50KTsKCiAgICAgIHZhciBoYW5kbGVycyA9IGRhdGEuaGFuZGxlcnNbZXZlbnQudHlwZV07CgogICAgICBpZiAoaGFuZGxlcnMpIHsKICAgICAgICAvLyBDb3B5IGhhbmRsZXJzIHNvIGlmIGhhbmRsZXJzIGFyZSBhZGRlZC9yZW1vdmVkIGR1cmluZyB0aGUgcHJvY2VzcyBpdCBkb2Vzbid0IHRocm93IGV2ZXJ5dGhpbmcgb2ZmLgogICAgICAgIHZhciBoYW5kbGVyc0NvcHkgPSBoYW5kbGVycy5zbGljZSgwKTsKCiAgICAgICAgZm9yICh2YXIgbSA9IDAsIG4gPSBoYW5kbGVyc0NvcHkubGVuZ3RoOyBtIDwgbjsgbSsrKSB7CiAgICAgICAgICBpZiAoZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaGFuZGxlcnNDb3B5W21dLmNhbGwoZWxlbSwgZXZlbnQsIGhhc2gpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgbG9nJDEuZXJyb3IoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQoKICBpZiAoZGF0YS5oYW5kbGVyc1t0eXBlXS5sZW5ndGggPT09IDEpIHsKICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgdmFyIG9wdGlvbnMgPSBmYWxzZTsKCiAgICAgIGlmIChfc3VwcG9ydHNQYXNzaXZlICYmIHBhc3NpdmVFdmVudHMuaW5kZXhPZih0eXBlKSA+IC0xKSB7CiAgICAgICAgb3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9OwogICAgICB9CiAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIG9wdGlvbnMpOwogICAgfSBlbHNlIGlmIChlbGVtLmF0dGFjaEV2ZW50KSB7CiAgICAgIGVsZW0uYXR0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGRhdGEuZGlzcGF0Y2hlcik7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZnJvbSBhbiBlbGVtZW50CiAqCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0KICogICAgICAgIE9iamVjdCB0byByZW1vdmUgbGlzdGVuZXJzIGZyb20uCiAqCiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdHlwZV0KICogICAgICAgIFR5cGUgb2YgbGlzdGVuZXIgdG8gcmVtb3ZlLiBEb24ndCBpbmNsdWRlIHRvIHJlbW92ZSBhbGwgZXZlbnRzIGZyb20gZWxlbWVudC4KICoKICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBbZm5dCiAqICAgICAgICBTcGVjaWZpYyBsaXN0ZW5lciB0byByZW1vdmUuIERvbid0IGluY2x1ZGUgdG8gcmVtb3ZlIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQKICogICAgICAgIHR5cGUuCiAqLwpmdW5jdGlvbiBvZmYoZWxlbSwgdHlwZSwgZm4pIHsKICAvLyBEb24ndCB3YW50IHRvIGFkZCBhIGNhY2hlIG9iamVjdCB0aHJvdWdoIGdldEVsRGF0YSBpZiBub3QgbmVlZGVkCiAgaWYgKCFoYXNEYXRhKGVsZW0pKSB7CiAgICByZXR1cm47CiAgfQoKICB2YXIgZGF0YSA9IGdldERhdGEoZWxlbSk7CgogIC8vIElmIG5vIGV2ZW50cyBleGlzdCwgbm90aGluZyB0byB1bmJpbmQKICBpZiAoIWRhdGEuaGFuZGxlcnMpIHsKICAgIHJldHVybjsKICB9CgogIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICByZXR1cm4gX2hhbmRsZU11bHRpcGxlRXZlbnRzKG9mZiwgZWxlbSwgdHlwZSwgZm4pOwogIH0KCiAgLy8gVXRpbGl0eSBmdW5jdGlvbgogIHZhciByZW1vdmVUeXBlID0gZnVuY3Rpb24gcmVtb3ZlVHlwZShlbCwgdCkgewogICAgZGF0YS5oYW5kbGVyc1t0XSA9IFtdOwogICAgX2NsZWFuVXBFdmVudHMoZWwsIHQpOwogIH07CgogIC8vIEFyZSB3ZSByZW1vdmluZyBhbGwgYm91bmQgZXZlbnRzPwogIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHsKICAgIGZvciAodmFyIHQgaW4gZGF0YS5oYW5kbGVycykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEuaGFuZGxlcnMgfHwge30sIHQpKSB7CiAgICAgICAgcmVtb3ZlVHlwZShlbGVtLCB0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuOwogIH0KCiAgdmFyIGhhbmRsZXJzID0gZGF0YS5oYW5kbGVyc1t0eXBlXTsKCiAgLy8gSWYgbm8gaGFuZGxlcnMgZXhpc3QsIG5vdGhpbmcgdG8gdW5iaW5kCiAgaWYgKCFoYW5kbGVycykgewogICAgcmV0dXJuOwogIH0KCiAgLy8gSWYgbm8gbGlzdGVuZXIgd2FzIHByb3ZpZGVkLCByZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IgdHlwZQogIGlmICghZm4pIHsKICAgIHJlbW92ZVR5cGUoZWxlbSwgdHlwZSk7CiAgICByZXR1cm47CiAgfQoKICAvLyBXZSdyZSBvbmx5IHJlbW92aW5nIGEgc2luZ2xlIGhhbmRsZXIKICBpZiAoZm4uZ3VpZCkgewogICAgZm9yICh2YXIgbiA9IDA7IG4gPCBoYW5kbGVycy5sZW5ndGg7IG4rKykgewogICAgICBpZiAoaGFuZGxlcnNbbl0uZ3VpZCA9PT0gZm4uZ3VpZCkgewogICAgICAgIGhhbmRsZXJzLnNwbGljZShuLS0sIDEpOwogICAgICB9CiAgICB9CiAgfQoKICBfY2xlYW5VcEV2ZW50cyhlbGVtLCB0eXBlKTsKfQoKLyoqCiAqIFRyaWdnZXIgYW4gZXZlbnQgZm9yIGFuIGVsZW1lbnQKICoKICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbQogKiAgICAgICAgRWxlbWVudCB0byB0cmlnZ2VyIGFuIGV2ZW50IG9uCiAqCiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR8c3RyaW5nfSBldmVudAogKiAgICAgICAgQSBzdHJpbmcgKHRoZSB0eXBlKSBvciBhbiBldmVudCBvYmplY3Qgd2l0aCBhIHR5cGUgYXR0cmlidXRlCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaF0KICogICAgICAgIGRhdGEgaGFzaCB0byBwYXNzIGFsb25nIHdpdGggdGhlIGV2ZW50CiAqCiAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfQogKiAgICAgICAgIC0gUmV0dXJucyB0aGUgb3Bwb3NpdGUgb2YgYGRlZmF1bHRQcmV2ZW50ZWRgIGlmIGRlZmF1bHQgd2FzIHByZXZlbnRlZAogKiAgICAgICAgIC0gT3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkCiAqLwpmdW5jdGlvbiB0cmlnZ2VyKGVsZW0sIGV2ZW50LCBoYXNoKSB7CiAgLy8gRmV0Y2hlcyBlbGVtZW50IGRhdGEgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgKGZvciBidWJibGluZykuCiAgLy8gRG9uJ3Qgd2FudCB0byBhZGQgYSBkYXRhIG9iamVjdCB0byBjYWNoZSBmb3IgZXZlcnkgcGFyZW50LAogIC8vIHNvIGNoZWNraW5nIGhhc0VsRGF0YSBmaXJzdC4KICB2YXIgZWxlbURhdGEgPSBoYXNEYXRhKGVsZW0pID8gZ2V0RGF0YShlbGVtKSA6IHt9OwogIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50OwogIC8vIHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LAogIC8vIGhhbmRsZXI7CgogIC8vIElmIGFuIGV2ZW50IG5hbWUgd2FzIHBhc3NlZCBhcyBhIHN0cmluZywgY3JlYXRlcyBhbiBldmVudCBvdXQgb2YgaXQKICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykgewogICAgZXZlbnQgPSB7IHR5cGU6IGV2ZW50LCB0YXJnZXQ6IGVsZW0gfTsKICB9CiAgLy8gTm9ybWFsaXplcyB0aGUgZXZlbnQgcHJvcGVydGllcy4KICBldmVudCA9IGZpeEV2ZW50KGV2ZW50KTsKCiAgLy8gSWYgdGhlIHBhc3NlZCBlbGVtZW50IGhhcyBhIGRpc3BhdGNoZXIsIGV4ZWN1dGVzIHRoZSBlc3RhYmxpc2hlZCBoYW5kbGVycy4KICBpZiAoZWxlbURhdGEuZGlzcGF0Y2hlcikgewogICAgZWxlbURhdGEuZGlzcGF0Y2hlci5jYWxsKGVsZW0sIGV2ZW50LCBoYXNoKTsKICB9CgogIC8vIFVubGVzcyBleHBsaWNpdGx5IHN0b3BwZWQgb3IgdGhlIGV2ZW50IGRvZXMgbm90IGJ1YmJsZSAoZS5nLiBtZWRpYSBldmVudHMpCiAgLy8gcmVjdXJzaXZlbHkgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBidWJibGUgdGhlIGV2ZW50IHVwIHRoZSBET00uCiAgaWYgKHBhcmVudCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSAmJiBldmVudC5idWJibGVzID09PSB0cnVlKSB7CiAgICB0cmlnZ2VyLmNhbGwobnVsbCwgcGFyZW50LCBldmVudCwgaGFzaCk7CgogICAgLy8gSWYgYXQgdGhlIHRvcCBvZiB0aGUgRE9NLCB0cmlnZ2VycyB0aGUgZGVmYXVsdCBhY3Rpb24gdW5sZXNzIGRpc2FibGVkLgogIH0gZWxzZSBpZiAoIXBhcmVudCAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgewogICAgdmFyIHRhcmdldERhdGEgPSBnZXREYXRhKGV2ZW50LnRhcmdldCk7CgogICAgLy8gQ2hlY2tzIGlmIHRoZSB0YXJnZXQgaGFzIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHRoaXMgZXZlbnQuCiAgICBpZiAoZXZlbnQudGFyZ2V0W2V2ZW50LnR5cGVdKSB7CiAgICAgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGVzIGV2ZW50IGRpc3BhdGNoaW5nIG9uIHRoZSB0YXJnZXQgYXMgd2UgaGF2ZSBhbHJlYWR5IGV4ZWN1dGVkIHRoZSBoYW5kbGVyLgogICAgICB0YXJnZXREYXRhLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgLy8gRXhlY3V0ZXMgdGhlIGRlZmF1bHQgYWN0aW9uLgogICAgICBpZiAodHlwZW9mIGV2ZW50LnRhcmdldFtldmVudC50eXBlXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50LnRhcmdldFtldmVudC50eXBlXSgpOwogICAgICB9CiAgICAgIC8vIFJlLWVuYWJsZXMgZXZlbnQgZGlzcGF0Y2hpbmcuCiAgICAgIHRhcmdldERhdGEuZGlzYWJsZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIC8vIEluZm9ybSB0aGUgdHJpZ2dlcmVyIGlmIHRoZSBkZWZhdWx0IHdhcyBwcmV2ZW50ZWQgYnkgcmV0dXJuaW5nIGZhbHNlCiAgcmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkOwp9CgovKioKICogVHJpZ2dlciBhIGxpc3RlbmVyIG9ubHkgb25jZSBmb3IgYW4gZXZlbnQKICoKICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbQogKiAgICAgICAgRWxlbWVudCBvciBvYmplY3QgdG8gYmluZCB0by4KICoKICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHR5cGUKICogICAgICAgIE5hbWUvdHlwZSBvZiBldmVudAogKgogKiBAcGFyYW0ge0V2ZW50fkV2ZW50TGlzdGVuZXJ9IGZuCiAqICAgICAgICBFdmVudCBMaXN0ZW5lciBmdW5jdGlvbgogKi8KZnVuY3Rpb24gb25lKGVsZW0sIHR5cGUsIGZuKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHsKICAgIHJldHVybiBfaGFuZGxlTXVsdGlwbGVFdmVudHMob25lLCBlbGVtLCB0eXBlLCBmbik7CiAgfQogIHZhciBmdW5jID0gZnVuY3Rpb24gZnVuYygpIHsKICAgIG9mZihlbGVtLCB0eXBlLCBmdW5jKTsKICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCiAgLy8gY29weSB0aGUgZ3VpZCB0byB0aGUgbmV3IGZ1bmN0aW9uIHNvIGl0IGNhbiByZW1vdmVkIHVzaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbidzIElECiAgZnVuYy5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgbmV3R1VJRCgpOwogIG9uKGVsZW0sIHR5cGUsIGZ1bmMpOwp9Cgp2YXIgRXZlbnRzID0gKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh7CglmaXhFdmVudDogZml4RXZlbnQsCglvbjogb24sCglvZmY6IG9mZiwKCXRyaWdnZXI6IHRyaWdnZXIsCglvbmU6IG9uZQp9KTsKCi8qKgogKiBAZmlsZSBzZXR1cC5qcyAtIEZ1bmN0aW9ucyBmb3Igc2V0dGluZyB1cCBhIHBsYXllciB3aXRob3V0CiAqIHVzZXIgaW50ZXJhY3Rpb24gYmFzZWQgb24gdGhlIGRhdGEtc2V0dXAgYGF0dHJpYnV0ZWAgb2YgdGhlIHZpZGVvIHRhZy4KICoKICogQG1vZHVsZSBzZXR1cAogKi8KdmFyIF93aW5kb3dMb2FkZWQgPSBmYWxzZTsKdmFyIHZpZGVvanMkMiA9IHZvaWQgMDsKCi8qKgogKiBTZXQgdXAgYW55IHRhZ3MgdGhhdCBoYXZlIGEgZGF0YS1zZXR1cCBgYXR0cmlidXRlYCB3aGVuIHRoZSBwbGF5ZXIgaXMgc3RhcnRlZC4KICovCnZhciBhdXRvU2V0dXAgPSBmdW5jdGlvbiBhdXRvU2V0dXAoKSB7CgogIC8vIFByb3RlY3QgYWdhaW5zdCBicmVha2FnZSBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuCiAgaWYgKCFpc1JlYWwoKSkgewogICAgcmV0dXJuOwogIH0KCiAgLy8gT25lIGRheSwgd2hlbiB3ZSBzdG9wIHN1cHBvcnRpbmcgSUU4LCBnbyBiYWNrIHRvIHRoaXMsIGJ1dCBpbiB0aGUgbWVhbnRpbWUuLi4qaGFjayBoYWNrIGhhY2sqCiAgLy8gdmFyIHZpZHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKSk7CiAgLy8gdmFyIGF1ZGlvcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhdWRpbycpKTsKICAvLyB2YXIgbWVkaWFFbHMgPSB2aWRzLmNvbmNhdChhdWRpb3MpOwoKICAvLyBCZWNhdXNlIElFOCBkb2Vzbid0IHN1cHBvcnQgY2FsbGluZyBzbGljZSBvbiBhIG5vZGUgbGlzdCwgd2UgbmVlZCB0byBsb29wCiAgLy8gdGhyb3VnaCBlYWNoIGxpc3Qgb2YgZWxlbWVudHMgdG8gYnVpbGQgdXAgYSBuZXcsIGNvbWJpbmVkIGxpc3Qgb2YgZWxlbWVudHMuCiAgdmFyIHZpZHMgPSBkb2N1bWVudF8xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogIHZhciBhdWRpb3MgPSBkb2N1bWVudF8xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhdWRpbycpOwogIHZhciBkaXZzID0gZG9jdW1lbnRfMS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8tanMnKTsKICB2YXIgbWVkaWFFbHMgPSBbXTsKCiAgaWYgKHZpZHMgJiYgdmlkcy5sZW5ndGggPiAwKSB7CiAgICBmb3IgKHZhciBpID0gMCwgZSA9IHZpZHMubGVuZ3RoOyBpIDwgZTsgaSsrKSB7CiAgICAgIG1lZGlhRWxzLnB1c2godmlkc1tpXSk7CiAgICB9CiAgfQoKICBpZiAoYXVkaW9zICYmIGF1ZGlvcy5sZW5ndGggPiAwKSB7CiAgICBmb3IgKHZhciBfaSA9IDAsIF9lID0gYXVkaW9zLmxlbmd0aDsgX2kgPCBfZTsgX2krKykgewogICAgICBtZWRpYUVscy5wdXNoKGF1ZGlvc1tfaV0pOwogICAgfQogIH0KCiAgaWYgKGRpdnMgJiYgZGl2cy5sZW5ndGggPiAwKSB7CiAgICBmb3IgKHZhciBfaTIgPSAwLCBfZTIgPSBkaXZzLmxlbmd0aDsgX2kyIDwgX2UyOyBfaTIrKykgewogICAgICBtZWRpYUVscy5wdXNoKGRpdnNbX2kyXSk7CiAgICB9CiAgfQoKICAvLyBDaGVjayBpZiBhbnkgbWVkaWEgZWxlbWVudHMgZXhpc3QKICBpZiAobWVkaWFFbHMgJiYgbWVkaWFFbHMubGVuZ3RoID4gMCkgewoKICAgIGZvciAodmFyIF9pMyA9IDAsIF9lMyA9IG1lZGlhRWxzLmxlbmd0aDsgX2kzIDwgX2UzOyBfaTMrKykgewogICAgICB2YXIgbWVkaWFFbCA9IG1lZGlhRWxzW19pM107CgogICAgICAvLyBDaGVjayBpZiBlbGVtZW50IGV4aXN0cywgaGFzIGdldEF0dHJpYnV0ZSBmdW5jLgogICAgICAvLyBJRSBzZWVtcyB0byBjb25zaWRlciB0eXBlb2YgZWwuZ2V0QXR0cmlidXRlID09ICdvYmplY3QnIGluc3RlYWQgb2YKICAgICAgLy8gJ2Z1bmN0aW9uJyBsaWtlIGV4cGVjdGVkLCBhdCBsZWFzdCB3aGVuIGxvYWRpbmcgdGhlIHBsYXllciBpbW1lZGlhdGVseS4KICAgICAgaWYgKG1lZGlhRWwgJiYgbWVkaWFFbC5nZXRBdHRyaWJ1dGUpIHsKCiAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgcGxheWVyIGhhc24ndCBhbHJlYWR5IGJlZW4gc2V0IHVwLgogICAgICAgIGlmIChtZWRpYUVsLnBsYXllciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB2YXIgb3B0aW9ucyA9IG1lZGlhRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHVwJyk7CgogICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YS1zZXR1cCBhdHRyIGV4aXN0cy4KICAgICAgICAgIC8vIFdlIG9ubHkgYXV0by1zZXR1cCBpZiB0aGV5J3ZlIGFkZGVkIHRoZSBkYXRhLXNldHVwIGF0dHIuCiAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBDcmVhdGUgbmV3IHZpZGVvLmpzIGluc3RhbmNlLgogICAgICAgICAgICB2aWRlb2pzJDIobWVkaWFFbCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBnZXRBdHRyaWJ1dGUgaXNuJ3QgZGVmaW5lZCwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgRE9NLgogICAgICB9IGVsc2UgewogICAgICAgIGF1dG9TZXR1cFRpbWVvdXQoMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICAvLyBObyB2aWRlb3Mgd2VyZSBmb3VuZCwgc28ga2VlcCBsb29waW5nIHVubGVzcyBwYWdlIGlzIGZpbmlzaGVkIGxvYWRpbmcuCiAgfSBlbHNlIGlmICghX3dpbmRvd0xvYWRlZCkgewogICAgYXV0b1NldHVwVGltZW91dCgxKTsKICB9Cn07CgovKioKICogV2FpdCB1bnRpbCB0aGUgcGFnZSBpcyBsb2FkZWQgYmVmb3JlIHJ1bm5pbmcgYXV0b1NldHVwLiBUaGlzIHdpbGwgYmUgY2FsbGVkIGluCiAqIGF1dG9TZXR1cCBpZiBgaGFzTG9hZGVkYCByZXR1cm5zIGZhbHNlLgogKgogKiBAcGFyYW0ge251bWJlcn0gd2FpdAogKiAgICAgICAgSG93IGxvbmcgdG8gd2FpdCBpbiBtcwogKgogKiBAcGFyYW0ge21vZHVsZTp2aWRlb2pzfSBbdmpzXQogKiAgICAgICAgVGhlIHZpZGVvanMgbGlicmFyeSBmdW5jdGlvbgogKi8KZnVuY3Rpb24gYXV0b1NldHVwVGltZW91dCh3YWl0LCB2anMpIHsKICBpZiAodmpzKSB7CiAgICB2aWRlb2pzJDIgPSB2anM7CiAgfQoKICB3aW5kb3dfMS5zZXRUaW1lb3V0KGF1dG9TZXR1cCwgd2FpdCk7Cn0KCmlmIChpc1JlYWwoKSAmJiBkb2N1bWVudF8xLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICBfd2luZG93TG9hZGVkID0gdHJ1ZTsKfSBlbHNlIHsKICAvKioKICAgKiBMaXN0ZW4gZm9yIHRoZSBsb2FkIGV2ZW50IG9uIHdpbmRvdywgYW5kIHNldCBfd2luZG93TG9hZGVkIHRvIHRydWUuCiAgICoKICAgKiBAbGlzdGVucyBsb2FkCiAgICovCiAgb25lKHdpbmRvd18xLCAnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgIF93aW5kb3dMb2FkZWQgPSB0cnVlOwogIH0pOwp9CgovKioKICogQGZpbGUgc3R5bGVzaGVldC5qcwogKiBAbW9kdWxlIHN0eWxlc2hlZXQKICovCi8qKgogKiBDcmVhdGUgYSBET00gc3lsZSBlbGVtZW50IGdpdmVuIGEgY2xhc3NOYW1lIGZvciBpdC4KICoKICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZQogKiAgICAgICAgVGhlIGNsYXNzTmFtZSB0byBhZGQgdG8gdGhlIGNyZWF0ZWQgc3R5bGUgZWxlbWVudC4KICoKICogQHJldHVybiB7RWxlbWVudH0KICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogKi8KdmFyIGNyZWF0ZVN0eWxlRWxlbWVudCA9IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudChjbGFzc05hbWUpIHsKICB2YXIgc3R5bGUgPSBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgogIHN0eWxlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKCiAgcmV0dXJuIHN0eWxlOwp9OwoKLyoqCiAqIEFkZCB0ZXh0IHRvIGEgRE9NIGVsZW1lbnQuCiAqCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwKICogICAgICAgIFRoZSBFbGVtZW50IHRvIGFkZCB0ZXh0IGNvbnRlbnQgdG8uCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50CiAqICAgICAgICBUaGUgdGV4dCB0byBhZGQgdG8gdGhlIGVsZW1lbnQuCiAqLwp2YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiBzZXRUZXh0Q29udGVudChlbCwgY29udGVudCkgewogIGlmIChlbC5zdHlsZVNoZWV0KSB7CiAgICBlbC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjb250ZW50OwogIH0gZWxzZSB7CiAgICBlbC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7CiAgfQp9OwoKLyoqCiAqIEBmaWxlIGZuLmpzCiAqIEBtb2R1bGUgZm4KICovCi8qKgogKiBCaW5kIChhLmsuYSBwcm94eSBvciBDb250ZXh0KS4gQSBzaW1wbGUgbWV0aG9kIGZvciBjaGFuZ2luZyB0aGUgY29udGV4dCBvZiBhIGZ1bmN0aW9uCiAqIEl0IGFsc28gc3RvcmVzIGEgdW5pcXVlIGlkIG9uIHRoZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgZWFzaWx5IHJlbW92ZWQgZnJvbSBldmVudHMuCiAqCiAqIEBwYXJhbSB7TWl4ZWR9IGNvbnRleHQKICogICAgICAgIFRoZSBvYmplY3QgdG8gYmluZCBhcyBzY29wZS4KICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBiZSBib3VuZCB0byBhIHNjb3BlLgogKgogKiBAcGFyYW0ge251bWJlcn0gW3VpZF0KICogICAgICAgIEFuIG9wdGlvbmFsIHVuaXF1ZSBJRCBmb3IgdGhlIGZ1bmN0aW9uIHRvIGJlIHNldAogKgogKiBAcmV0dXJuIHtGdW5jdGlvbn0KICogICAgICAgICBUaGUgbmV3IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBib3VuZCBpbnRvIHRoZSBjb250ZXh0IGdpdmVuCiAqLwp2YXIgYmluZCA9IGZ1bmN0aW9uIGJpbmQoY29udGV4dCwgZm4sIHVpZCkgewogIC8vIE1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaGFzIGEgdW5pcXVlIElECiAgaWYgKCFmbi5ndWlkKSB7CiAgICBmbi5ndWlkID0gbmV3R1VJRCgpOwogIH0KCiAgLy8gQ3JlYXRlIHRoZSBuZXcgZnVuY3Rpb24gdGhhdCBjaGFuZ2VzIHRoZSBjb250ZXh0CiAgdmFyIGJvdW5kID0gZnVuY3Rpb24gYm91bmQoKSB7CiAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTsKICB9OwoKICAvLyBBbGxvdyBmb3IgdGhlIGFiaWxpdHkgdG8gaW5kaXZpZHVhbGl6ZSB0aGlzIGZ1bmN0aW9uCiAgLy8gTmVlZGVkIGluIHRoZSBjYXNlIHdoZXJlIG11bHRpcGxlIG9iamVjdHMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgcHJvdG90eXBlCiAgLy8gSUYgYm90aCBpdGVtcyBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbiwgdGhlbiB5b3UgdHJ5IHRvIHJlbW92ZSBqdXN0IG9uZQogIC8vIGl0IHdpbGwgcmVtb3ZlIGJvdGggYmVjYXVzZSB0aGV5IGJvdGggaGF2ZSB0aGUgc2FtZSBndWlkLgogIC8vIHdoZW4gdXNpbmcgdGhpcywgeW91IG5lZWQgdG8gdXNlIHRoZSBiaW5kIG1ldGhvZCB3aGVuIHlvdSByZW1vdmUgdGhlIGxpc3RlbmVyIGFzIHdlbGwuCiAgLy8gY3VycmVudGx5IHVzZWQgaW4gdGV4dCB0cmFja3MKICBib3VuZC5ndWlkID0gdWlkID8gdWlkICsgJ18nICsgZm4uZ3VpZCA6IGZuLmd1aWQ7CgogIHJldHVybiBib3VuZDsKfTsKCi8qKgogKiBXcmFwcyB0aGUgZ2l2ZW4gZnVuY3Rpb24sIGBmbmAsIHdpdGggYSBuZXcgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZuYAogKiBhdCBtb3N0IG9uY2UgcGVyIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuCiAqCiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbgogKiAgICAgICAgIFRoZSBmdW5jdGlvbiB0byBiZSB0aHJvdHRsZWQuCiAqCiAqIEBwYXJhbSAge051bWJlcn0gICB3YWl0CiAqICAgICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYnkgd2hpY2ggdG8gdGhyb3R0bGUuCiAqCiAqIEByZXR1cm4ge0Z1bmN0aW9ufQogKi8KdmFyIHRocm90dGxlID0gZnVuY3Rpb24gdGhyb3R0bGUoZm4sIHdhaXQpIHsKICB2YXIgbGFzdCA9IERhdGUubm93KCk7CgogIHZhciB0aHJvdHRsZWQgPSBmdW5jdGlvbiB0aHJvdHRsZWQoKSB7CiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTsKCiAgICBpZiAobm93IC0gbGFzdCA+PSB3YWl0KSB7CiAgICAgIGZuLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgbGFzdCA9IG5vdzsKICAgIH0KICB9OwoKICByZXR1cm4gdGhyb3R0bGVkOwp9OwoKLyoqCiAqIEBmaWxlIHNyYy9qcy9ldmVudC10YXJnZXQuanMKICovCi8qKgogKiBgRXZlbnRUYXJnZXRgIGlzIGEgY2xhc3MgdGhhdCBjYW4gaGF2ZSB0aGUgc2FtZSBBUEkgYXMgdGhlIERPTSBgRXZlbnRUYXJnZXRgLiBJdAogKiBhZGRzIHNob3J0aGFuZCBmdW5jdGlvbnMgdGhhdCB3cmFwIGFyb3VuZCBsZW5ndGh5IGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6CiAqIHRoZSBgb25gIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBhcm91bmQgYGFkZEV2ZW50TGlzdGVuZXJgLgogKgogKiBAc2VlIFtFdmVudFRhcmdldCBTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItRXZlbnRzL2V2ZW50cy5odG1sI0V2ZW50cy1FdmVudFRhcmdldH0KICogQGNsYXNzIEV2ZW50VGFyZ2V0CiAqLwp2YXIgRXZlbnRUYXJnZXQgPSBmdW5jdGlvbiBFdmVudFRhcmdldCgpIHt9OwoKLyoqCiAqIEEgQ3VzdG9tIERPTSBldmVudC4KICoKICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRUYXJnZXR+RXZlbnQKICogQHNlZSBbUHJvcGVydGllc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50fQogKi8KCi8qKgogKiBBbGwgZXZlbnQgbGlzdGVuZXJzIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBmb3JtYXQuCiAqCiAqIEBjYWxsYmFjayBFdmVudFRhcmdldH5FdmVudExpc3RlbmVyCiAqIEB0aGlzIHtFdmVudFRhcmdldH0KICoKICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICogICAgICAgIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBbaGFzaF0KICogICAgICAgIGhhc2ggb2YgZGF0YSBzZW50IGR1cmluZyB0aGUgZXZlbnQKICovCgovKioKICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZXZlbnQgbmFtZXMgYXMga2V5cyBhbmQgYm9vbGVhbnMgYXMgdmFsdWVzLgogKgogKiA+IE5PVEU6IElmIGFuIGV2ZW50IG5hbWUgaXMgc2V0IHRvIGEgdHJ1ZSB2YWx1ZSBoZXJlIHtAbGluayBFdmVudFRhcmdldCN0cmlnZ2VyfQogKiAgICAgICAgIHdpbGwgaGF2ZSBleHRyYSBmdW5jdGlvbmFsaXR5LiBTZWUgdGhhdCBmdW5jdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogQHByb3BlcnR5IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXwogKiBAcHJpdmF0ZQogKi8KRXZlbnRUYXJnZXQucHJvdG90eXBlLmFsbG93ZWRFdmVudHNfID0ge307CgovKioKICogQWRkcyBhbiBgZXZlbnQgbGlzdGVuZXJgIHRvIGFuIGluc3RhbmNlIG9mIGFuIGBFdmVudFRhcmdldGAuIEFuIGBldmVudCBsaXN0ZW5lcmAgaXMgYQogKiBmdW5jdGlvbiB0aGF0IHdpbGwgZ2V0IGNhbGxlZCB3aGVuIGFuIGV2ZW50IHdpdGggYSBjZXJ0YWluIG5hbWUgZ2V0cyB0cmlnZ2VyZWQuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSB0eXBlCiAqICAgICAgICBBbiBldmVudCBuYW1lIG9yIGFuIGFycmF5IG9mIGV2ZW50IG5hbWVzLgogKgogKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZuCiAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aXRoIGBFdmVudFRhcmdldGBzCiAqLwpFdmVudFRhcmdldC5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodHlwZSwgZm4pIHsKICAvLyBSZW1vdmUgdGhlIGFkZEV2ZW50TGlzdGVuZXIgYWxpYXMgYmVmb3JlIGNhbGxpbmcgRXZlbnRzLm9uCiAgLy8gc28gd2UgZG9uJ3QgZ2V0IGludG8gYW4gaW5maW5pdGUgdHlwZSBsb29wCiAgdmFyIGFlbCA9IHRoaXMuYWRkRXZlbnRMaXN0ZW5lcjsKCiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKCkge307CiAgb24odGhpcywgdHlwZSwgZm4pOwogIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9IGFlbDsKfTsKCi8qKgogKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjb259LiBBbGxvd3MgYEV2ZW50VGFyZ2V0YCB0byBtaW1pYwogKiB0aGUgc3RhbmRhcmQgRE9NIEFQSS4KICoKICogQGZ1bmN0aW9uCiAqIEBzZWUge0BsaW5rIEV2ZW50VGFyZ2V0I29ufQogKi8KRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBFdmVudFRhcmdldC5wcm90b3R5cGUub247CgovKioKICogUmVtb3ZlcyBhbiBgZXZlbnQgbGlzdGVuZXJgIGZvciBhIHNwZWNpZmljIGV2ZW50IGZyb20gYW4gaW5zdGFuY2Ugb2YgYEV2ZW50VGFyZ2V0YC4KICogVGhpcyBtYWtlcyBpdCBzbyB0aGF0IHRoZSBgZXZlbnQgbGlzdGVuZXJgIHdpbGwgbm8gbG9uZ2VyIGdldCBjYWxsZWQgd2hlbiB0aGUKICogbmFtZWQgZXZlbnQgaGFwcGVucy4KICoKICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHR5cGUKICogICAgICAgIEFuIGV2ZW50IG5hbWUgb3IgYW4gYXJyYXkgb2YgZXZlbnQgbmFtZXMuCiAqCiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnRMaXN0ZW5lcn0gZm4KICogICAgICAgIFRoZSBmdW5jdGlvbiB0byByZW1vdmUuCiAqLwpFdmVudFRhcmdldC5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7CiAgb2ZmKHRoaXMsIHR5cGUsIGZuKTsKfTsKCi8qKgogKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjb2ZmfS4gQWxsb3dzIGBFdmVudFRhcmdldGAgdG8gbWltaWMKICogdGhlIHN0YW5kYXJkIERPTSBBUEkuCiAqCiAqIEBmdW5jdGlvbgogKiBAc2VlIHtAbGluayBFdmVudFRhcmdldCNvZmZ9CiAqLwpFdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5vZmY7CgovKioKICogVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhbiBgZXZlbnQgbGlzdGVuZXJgIHRoYXQgZ2V0cyB0cmlnZ2VyZWQgb25seSBvbmNlLiBBZnRlciB0aGUKICogZmlyc3QgdHJpZ2dlciBpdCB3aWxsIGdldCByZW1vdmVkLiBUaGlzIGlzIGxpa2UgYWRkaW5nIGFuIGBldmVudCBsaXN0ZW5lcmAKICogd2l0aCB7QGxpbmsgRXZlbnRUYXJnZXQjb259IHRoYXQgY2FsbHMge0BsaW5rIEV2ZW50VGFyZ2V0I29mZn0gb24gaXRzZWxmLgogKgogKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gdHlwZQogKiAgICAgICAgQW4gZXZlbnQgbmFtZSBvciBhbiBhcnJheSBvZiBldmVudCBuYW1lcy4KICoKICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBmbgogKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGV2ZW50IG5hbWUuCiAqLwpFdmVudFRhcmdldC5wcm90b3R5cGUub25lID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7CiAgLy8gUmVtb3ZlIHRoZSBhZGRFdmVudExpc3RlbmVyIGFsaWFsaW5nIEV2ZW50cy5vbgogIC8vIHNvIHdlIGRvbid0IGdldCBpbnRvIGFuIGluZmluaXRlIHR5cGUgbG9vcAogIHZhciBhZWwgPSB0aGlzLmFkZEV2ZW50TGlzdGVuZXI7CgogIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHt9OwogIG9uZSh0aGlzLCB0eXBlLCBmbik7CiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gYWVsOwp9OwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFuIGV2ZW50IHRvIGhhcHBlbi4gVGhpcyB3aWxsIHRoZW4gY2F1c2UgYW55IGBldmVudCBsaXN0ZW5lcnNgCiAqIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoYXQgZXZlbnQsIHRvIGdldCBjYWxsZWQuIElmIHRoZXJlIGFyZSBubyBgZXZlbnQgbGlzdGVuZXJzYAogKiBmb3IgYW4gZXZlbnQgdGhlbiBub3RoaW5nIHdpbGwgaGFwcGVuLgogKgogKiBJZiB0aGUgbmFtZSBvZiB0aGUgYEV2ZW50YCB0aGF0IGlzIGJlaW5nIHRyaWdnZXJlZCBpcyBpbiBgRXZlbnRUYXJnZXQuYWxsb3dlZEV2ZW50c19gLgogKiBUcmlnZ2VyIHdpbGwgYWxzbyBjYWxsIHRoZSBgb25gICsgYHVwcGVyY2FzZUV2ZW50TmFtZWAgZnVuY3Rpb24uCiAqCiAqIEV4YW1wbGU6CiAqICdjbGljaycgaXMgaW4gYEV2ZW50VGFyZ2V0LmFsbG93ZWRFdmVudHNfYCwgc28sIHRyaWdnZXIgd2lsbCBhdHRlbXB0IHRvIGNhbGwKICogYG9uQ2xpY2tgIGlmIGl0IGV4aXN0cy4KICoKICogQHBhcmFtIHtzdHJpbmd8RXZlbnRUYXJnZXR+RXZlbnR8T2JqZWN0fSBldmVudAogKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGV2ZW50LCBhbiBgRXZlbnRgLCBvciBhbiBvYmplY3Qgd2l0aCBhIGtleSBvZiB0eXBlIHNldCB0bwogKiAgICAgICAgYW4gZXZlbnQgbmFtZS4KICovCkV2ZW50VGFyZ2V0LnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50OwoKICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykgewogICAgZXZlbnQgPSB7IHR5cGU6IHR5cGUgfTsKICB9CiAgZXZlbnQgPSBmaXhFdmVudChldmVudCk7CgogIGlmICh0aGlzLmFsbG93ZWRFdmVudHNfW3R5cGVdICYmIHRoaXNbJ29uJyArIHR5cGVdKSB7CiAgICB0aGlzWydvbicgKyB0eXBlXShldmVudCk7CiAgfQoKICB0cmlnZ2VyKHRoaXMsIGV2ZW50KTsKfTsKCi8qKgogKiBBbiBhbGlhcyBvZiB7QGxpbmsgRXZlbnRUYXJnZXQjdHJpZ2dlcn0uIEFsbG93cyBgRXZlbnRUYXJnZXRgIHRvIG1pbWljCiAqIHRoZSBzdGFuZGFyZCBET00gQVBJLgogKgogKiBAZnVuY3Rpb24KICogQHNlZSB7QGxpbmsgRXZlbnRUYXJnZXQjdHJpZ2dlcn0KICovCkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gRXZlbnRUYXJnZXQucHJvdG90eXBlLnRyaWdnZXI7CgovKioKICogQGZpbGUgbWl4aW5zL2V2ZW50ZWQuanMKICogQG1vZHVsZSBldmVudGVkCiAqLwovKioKICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaGFzIGhhZCB0aGUgZXZlbnRlZCBtaXhpbiBhcHBsaWVkLgogKgogKiBAcGFyYW0gIHtPYmplY3R9IG9iamVjdAogKiAgICAgICAgIEFuIG9iamVjdCB0byB0ZXN0LgogKgogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgYXBwZWFycyB0byBiZSBldmVudGVkLgogKi8KdmFyIGlzRXZlbnRlZCA9IGZ1bmN0aW9uIGlzRXZlbnRlZChvYmplY3QpIHsKICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQgfHwgISFvYmplY3QuZXZlbnRCdXNFbF8gJiYgWydvbicsICdvbmUnLCAnb2ZmJywgJ3RyaWdnZXInXS5ldmVyeShmdW5jdGlvbiAoaykgewogICAgcmV0dXJuIHR5cGVvZiBvYmplY3Rba10gPT09ICdmdW5jdGlvbic7CiAgfSk7Cn07CgovKioKICogV2hldGhlciBhIHZhbHVlIGlzIGEgdmFsaWQgZXZlbnQgdHlwZSAtIG5vbi1lbXB0eSBzdHJpbmcgb3IgYXJyYXkuCiAqCiAqIEBwcml2YXRlCiAqIEBwYXJhbSAge3N0cmluZ3xBcnJheX0gdHlwZQogKiAgICAgICAgIFRoZSB0eXBlIHZhbHVlIHRvIHRlc3QuCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHR5cGUgaXMgYSB2YWxpZCBldmVudCB0eXBlLgogKi8KdmFyIGlzVmFsaWRFdmVudFR5cGUgPSBmdW5jdGlvbiBpc1ZhbGlkRXZlbnRUeXBlKHR5cGUpIHsKICByZXR1cm4gKAogICAgLy8gVGhlIHJlZ2V4IGhlcmUgdmVyaWZpZXMgdGhhdCB0aGUgYHR5cGVgIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBub24tCiAgICAvLyB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KICAgIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyAmJiAvXFMvLnRlc3QodHlwZSkgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSAmJiAhIXR5cGUubGVuZ3RoCiAgKTsKfTsKCi8qKgogKiBWYWxpZGF0ZXMgYSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSB2YWxpZCBldmVudCB0YXJnZXQuIFRocm93cyBpZiBub3QuCiAqCiAqIEBwcml2YXRlCiAqIEB0aHJvd3Mge0Vycm9yfQogKiAgICAgICAgIElmIHRoZSB0YXJnZXQgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgZXZlbnQgdGFyZ2V0LgogKgogKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldAogKiAgICAgICAgIFRoZSBvYmplY3QgdG8gdGVzdC4KICovCnZhciB2YWxpZGF0ZVRhcmdldCA9IGZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCkgewogIGlmICghdGFyZ2V0Lm5vZGVOYW1lICYmICFpc0V2ZW50ZWQodGFyZ2V0KSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhcmdldDsgbXVzdCBiZSBhIERPTSBub2RlIG9yIGV2ZW50ZWQgb2JqZWN0LicpOwogIH0KfTsKCi8qKgogKiBWYWxpZGF0ZXMgYSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSB2YWxpZCBldmVudCB0YXJnZXQuIFRocm93cyBpZiBub3QuCiAqCiAqIEBwcml2YXRlCiAqIEB0aHJvd3Mge0Vycm9yfQogKiAgICAgICAgIElmIHRoZSB0eXBlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGV2ZW50IHR5cGUuCiAqCiAqIEBwYXJhbSAge3N0cmluZ3xBcnJheX0gdHlwZQogKiAgICAgICAgIFRoZSB0eXBlIHRvIHRlc3QuCiAqLwp2YXIgdmFsaWRhdGVFdmVudFR5cGUgPSBmdW5jdGlvbiB2YWxpZGF0ZUV2ZW50VHlwZSh0eXBlKSB7CiAgaWYgKCFpc1ZhbGlkRXZlbnRUeXBlKHR5cGUpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZTsgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYXJyYXkuJyk7CiAgfQp9OwoKLyoqCiAqIFZhbGlkYXRlcyBhIHZhbHVlIHRvIGRldGVybWluZSBpZiBpdCBpcyBhIHZhbGlkIGxpc3RlbmVyLiBUaHJvd3MgaWYgbm90LgogKgogKiBAcHJpdmF0ZQogKiBAdGhyb3dzIHtFcnJvcn0KICogICAgICAgICBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IGEgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBsaXN0ZW5lcgogKiAgICAgICAgIFRoZSBsaXN0ZW5lciB0byB0ZXN0LgogKi8KdmFyIHZhbGlkYXRlTGlzdGVuZXIgPSBmdW5jdGlvbiB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSB7CiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3RlbmVyOyBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7CiAgfQp9OwoKLyoqCiAqIFRha2VzIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBnaXZlbiB0byBgb24oKWAgb3IgYG9uZSgpYCwgdmFsaWRhdGVzIHRoZW0sIGFuZAogKiBub3JtYWxpemVzIHRoZW0gaW50byBhbiBvYmplY3QuCiAqCiAqIEBwcml2YXRlCiAqIEBwYXJhbSAge09iamVjdH0gc2VsZgogKiAgICAgICAgIFRoZSBldmVudGVkIG9iamVjdCBvbiB3aGljaCBgb24oKWAgb3IgYG9uZSgpYCB3YXMgY2FsbGVkLiBUaGlzCiAqICAgICAgICAgb2JqZWN0IHdpbGwgYmUgYm91bmQgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgdGhlIGxpc3RlbmVyLgogKgogKiBAcGFyYW0gIHtBcnJheX0gYXJncwogKiAgICAgICAgIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYG9uKClgIG9yIGBvbmUoKWAuCiAqCiAqIEByZXR1cm4ge09iamVjdH0KICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyB1c2VmdWwgdmFsdWVzIGZvciBgb24oKWAgb3IgYG9uZSgpYCBjYWxscy4KICovCnZhciBub3JtYWxpemVMaXN0ZW5BcmdzID0gZnVuY3Rpb24gbm9ybWFsaXplTGlzdGVuQXJncyhzZWxmLCBhcmdzKSB7CgogIC8vIElmIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGlzIGxlc3MgdGhhbiAzLCB0aGUgdGFyZ2V0IGlzIGFsd2F5cyB0aGUKICAvLyBldmVudGVkIG9iamVjdCBpdHNlbGYuCiAgdmFyIGlzVGFyZ2V0aW5nU2VsZiA9IGFyZ3MubGVuZ3RoIDwgMyB8fCBhcmdzWzBdID09PSBzZWxmIHx8IGFyZ3NbMF0gPT09IHNlbGYuZXZlbnRCdXNFbF87CiAgdmFyIHRhcmdldCA9IHZvaWQgMDsKICB2YXIgdHlwZSA9IHZvaWQgMDsKICB2YXIgbGlzdGVuZXIgPSB2b2lkIDA7CgogIGlmIChpc1RhcmdldGluZ1NlbGYpIHsKICAgIHRhcmdldCA9IHNlbGYuZXZlbnRCdXNFbF87CgogICAgLy8gRGVhbCB3aXRoIGNhc2VzIHdoZXJlIHdlIGdvdCAzIGFyZ3VtZW50cywgYnV0IHdlIGFyZSBzdGlsbCBsaXN0ZW5pbmcgdG8KICAgIC8vIHRoZSBldmVudGVkIG9iamVjdCBpdHNlbGYuCiAgICBpZiAoYXJncy5sZW5ndGggPj0gMykgewogICAgICBhcmdzLnNoaWZ0KCk7CiAgICB9CgogICAgdHlwZSA9IGFyZ3NbMF07CiAgICBsaXN0ZW5lciA9IGFyZ3NbMV07CiAgfSBlbHNlIHsKICAgIHRhcmdldCA9IGFyZ3NbMF07CiAgICB0eXBlID0gYXJnc1sxXTsKICAgIGxpc3RlbmVyID0gYXJnc1syXTsKICB9CgogIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCk7CiAgdmFsaWRhdGVFdmVudFR5cGUodHlwZSk7CiAgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lcik7CgogIGxpc3RlbmVyID0gYmluZChzZWxmLCBsaXN0ZW5lcik7CgogIHJldHVybiB7IGlzVGFyZ2V0aW5nU2VsZjogaXNUYXJnZXRpbmdTZWxmLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07Cn07CgovKioKICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGV2ZW50IHR5cGUocykgb24gdGhlIHRhcmdldCwgbm9ybWFsaXppbmcgZm9yCiAqIHRoZSB0eXBlIG9mIHRhcmdldC4KICoKICogQHByaXZhdGUKICogQHBhcmFtICB7RWxlbWVudHxPYmplY3R9IHRhcmdldAogKiAgICAgICAgIEEgRE9NIG5vZGUgb3IgZXZlbnRlZCBvYmplY3QuCiAqCiAqIEBwYXJhbSAge3N0cmluZ30gbWV0aG9kCiAqICAgICAgICAgVGhlIGV2ZW50IGJpbmRpbmcgbWV0aG9kIHRvIHVzZSAoIm9uIiBvciAib25lIikuCiAqCiAqIEBwYXJhbSAge3N0cmluZ3xBcnJheX0gdHlwZQogKiAgICAgICAgIE9uZSBvciBtb3JlIGV2ZW50IHR5cGUocykuCiAqCiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBsaXN0ZW5lcgogKiAgICAgICAgIEEgbGlzdGVuZXIgZnVuY3Rpb24uCiAqLwp2YXIgbGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgbWV0aG9kLCB0eXBlLCBsaXN0ZW5lcikgewogIHZhbGlkYXRlVGFyZ2V0KHRhcmdldCk7CgogIGlmICh0YXJnZXQubm9kZU5hbWUpIHsKICAgIEV2ZW50c1ttZXRob2RdKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpOwogIH0gZWxzZSB7CiAgICB0YXJnZXRbbWV0aG9kXSh0eXBlLCBsaXN0ZW5lcik7CiAgfQp9OwoKLyoqCiAqIENvbnRhaW5zIG1ldGhvZHMgdGhhdCBwcm92aWRlIGV2ZW50IGNhcGFiaWxpdGVzIHRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWQKICogdG8ge0BsaW5rIG1vZHVsZTpldmVudGVkfGV2ZW50ZWR9LgogKgogKiBAbWl4aW4gRXZlbnRlZE1peGluCiAqLwp2YXIgRXZlbnRlZE1peGluID0gewoKICAvKioKICAgKiBBZGQgYSBsaXN0ZW5lciB0byBhbiBldmVudCAob3IgZXZlbnRzKSBvbiB0aGlzIG9iamVjdCBvciBhbm90aGVyIGV2ZW50ZWQKICAgKiBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl8RWxlbWVudHxPYmplY3R9IHRhcmdldE9yVHlwZQogICAqICAgICAgICAgSWYgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSwgaXQgcmVwcmVzZW50cyB0aGUgZXZlbnQgdHlwZShzKQogICAqICAgICAgICAgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGxpc3RlbmVyLgogICAqCiAgICogICAgICAgICBBbm90aGVyIGV2ZW50ZWQgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaGVyZSBpbnN0ZWFkLCB3aGljaCB3aWxsCiAgICogICAgICAgICBjYXVzZSB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBldmVudHMgb24gX3RoYXRfIG9iamVjdC4KICAgKgogICAqICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoZSBsaXN0ZW5lcidzIGB0aGlzYCB2YWx1ZSB3aWxsIGJlIGJvdW5kIHRvCiAgICogICAgICAgICB0aGlzIG9iamVjdC4KICAgKgogICAqIEBwYXJhbSAge3N0cmluZ3xBcnJheXxGdW5jdGlvbn0gdHlwZU9yTGlzdGVuZXIKICAgKiAgICAgICAgIElmIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgYSBzdHJpbmcgb3IgYXJyYXksIHRoaXMgc2hvdWxkIGJlIHRoZQogICAqICAgICAgICAgbGlzdGVuZXIgZnVuY3Rpb24uIE90aGVyd2lzZSwgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSBvZiBldmVudAogICAqICAgICAgICAgdHlwZShzKS4KICAgKgogICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbbGlzdGVuZXJdCiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGFub3RoZXIgZXZlbnRlZCBvYmplY3QsIHRoaXMgd2lsbCBiZQogICAqICAgICAgICAgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uLgogICAqLwogIG9uOiBmdW5jdGlvbiBvbiQkMSgpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgIH0KCiAgICB2YXIgX25vcm1hbGl6ZUxpc3RlbkFyZ3MgPSBub3JtYWxpemVMaXN0ZW5BcmdzKHRoaXMsIGFyZ3MpLAogICAgICAgIGlzVGFyZ2V0aW5nU2VsZiA9IF9ub3JtYWxpemVMaXN0ZW5BcmdzLmlzVGFyZ2V0aW5nU2VsZiwKICAgICAgICB0YXJnZXQgPSBfbm9ybWFsaXplTGlzdGVuQXJncy50YXJnZXQsCiAgICAgICAgdHlwZSA9IF9ub3JtYWxpemVMaXN0ZW5BcmdzLnR5cGUsCiAgICAgICAgbGlzdGVuZXIgPSBfbm9ybWFsaXplTGlzdGVuQXJncy5saXN0ZW5lcjsKCiAgICBsaXN0ZW4odGFyZ2V0LCAnb24nLCB0eXBlLCBsaXN0ZW5lcik7CgogICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgbGlzdGVuaW5nIHRvIGFub3RoZXIgZXZlbnRlZCBvYmplY3QuCiAgICBpZiAoIWlzVGFyZ2V0aW5nU2VsZikgewoKICAgICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgbGlzdGVuZXIuCiAgICAgIHZhciByZW1vdmVMaXN0ZW5lck9uRGlzcG9zZSA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyT25EaXNwb3NlKCkgewogICAgICAgIHJldHVybiBfdGhpcy5vZmYodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcik7CiAgICAgIH07CgogICAgICAvLyBVc2UgdGhlIHNhbWUgZnVuY3Rpb24gSUQgYXMgdGhlIGxpc3RlbmVyIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIgaXQKICAgICAgLy8gdXNpbmcgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lci4KICAgICAgcmVtb3ZlTGlzdGVuZXJPbkRpc3Bvc2UuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7CgogICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0byB0aGUgdGFyZ2V0J3MgZGlzcG9zZSBldmVudCBhcyB3ZWxsLiBUaGlzIGVuc3VyZXMKICAgICAgLy8gdGhhdCBpZiB0aGUgdGFyZ2V0IGlzIGRpc3Bvc2VkIEJFRk9SRSB0aGlzIG9iamVjdCwgd2UgcmVtb3ZlIHRoZQogICAgICAvLyByZW1vdmFsIGxpc3RlbmVyIHRoYXQgd2FzIGp1c3QgYWRkZWQuIE90aGVyd2lzZSwgd2UgY3JlYXRlIGEgbWVtb3J5IGxlYWsuCiAgICAgIHZhciByZW1vdmVSZW1vdmVyT25UYXJnZXREaXNwb3NlID0gZnVuY3Rpb24gcmVtb3ZlUmVtb3Zlck9uVGFyZ2V0RGlzcG9zZSgpIHsKICAgICAgICByZXR1cm4gX3RoaXMub2ZmKCdkaXNwb3NlJywgcmVtb3ZlTGlzdGVuZXJPbkRpc3Bvc2UpOwogICAgICB9OwoKICAgICAgLy8gVXNlIHRoZSBzYW1lIGZ1bmN0aW9uIElEIGFzIHRoZSBsaXN0ZW5lciBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyCiAgICAgIC8vIGl0IHVzaW5nIHRoZSBJRCBvZiB0aGUgb3JpZ2luYWwgbGlzdGVuZXIuCiAgICAgIHJlbW92ZVJlbW92ZXJPblRhcmdldERpc3Bvc2UuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7CgogICAgICBsaXN0ZW4odGhpcywgJ29uJywgJ2Rpc3Bvc2UnLCByZW1vdmVMaXN0ZW5lck9uRGlzcG9zZSk7CiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbicsICdkaXNwb3NlJywgcmVtb3ZlUmVtb3Zlck9uVGFyZ2V0RGlzcG9zZSk7CiAgICB9CiAgfSwKCgogIC8qKgogICAqIEFkZCBhIGxpc3RlbmVyIHRvIGFuIGV2ZW50IChvciBldmVudHMpIG9uIHRoaXMgb2JqZWN0IG9yIGFub3RoZXIgZXZlbnRlZAogICAqIG9iamVjdC4gVGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBjYWxsZWQgb25jZSBhbmQgdGhlbiByZW1vdmVkLgogICAqCiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEVsZW1lbnR8T2JqZWN0fSB0YXJnZXRPclR5cGUKICAgKiAgICAgICAgIElmIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXksIGl0IHJlcHJlc2VudHMgdGhlIGV2ZW50IHR5cGUocykKICAgKiAgICAgICAgIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBsaXN0ZW5lci4KICAgKgogICAqICAgICAgICAgQW5vdGhlciBldmVudGVkIG9iamVjdCBjYW4gYmUgcGFzc2VkIGhlcmUgaW5zdGVhZCwgd2hpY2ggd2lsbAogICAqICAgICAgICAgY2F1c2UgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgZXZlbnRzIG9uIF90aGF0XyBvYmplY3QuCiAgICoKICAgKiAgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGUgbGlzdGVuZXIncyBgdGhpc2AgdmFsdWUgd2lsbCBiZSBib3VuZCB0bwogICAqICAgICAgICAgdGhpcyBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl8RnVuY3Rpb259IHR5cGVPckxpc3RlbmVyCiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGEgc3RyaW5nIG9yIGFycmF5LCB0aGlzIHNob3VsZCBiZSB0aGUKICAgKiAgICAgICAgIGxpc3RlbmVyIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXkgb2YgZXZlbnQKICAgKiAgICAgICAgIHR5cGUocykuCiAgICoKICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW2xpc3RlbmVyXQogICAqICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LCB0aGlzIHdpbGwgYmUKICAgKiAgICAgICAgIHRoZSBsaXN0ZW5lciBmdW5jdGlvbi4KICAgKi8KICBvbmU6IGZ1bmN0aW9uIG9uZSQkMSgpIHsKICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTsKICAgIH0KCiAgICB2YXIgX25vcm1hbGl6ZUxpc3RlbkFyZ3MyID0gbm9ybWFsaXplTGlzdGVuQXJncyh0aGlzLCBhcmdzKSwKICAgICAgICBpc1RhcmdldGluZ1NlbGYgPSBfbm9ybWFsaXplTGlzdGVuQXJnczIuaXNUYXJnZXRpbmdTZWxmLAogICAgICAgIHRhcmdldCA9IF9ub3JtYWxpemVMaXN0ZW5BcmdzMi50YXJnZXQsCiAgICAgICAgdHlwZSA9IF9ub3JtYWxpemVMaXN0ZW5BcmdzMi50eXBlLAogICAgICAgIGxpc3RlbmVyID0gX25vcm1hbGl6ZUxpc3RlbkFyZ3MyLmxpc3RlbmVyOwoKICAgIC8vIFRhcmdldGluZyB0aGlzIGV2ZW50ZWQgb2JqZWN0LgoKCiAgICBpZiAoaXNUYXJnZXRpbmdTZWxmKSB7CiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbmUnLCB0eXBlLCBsaXN0ZW5lcik7CgogICAgICAvLyBUYXJnZXRpbmcgYW5vdGhlciBldmVudGVkIG9iamVjdC4KICAgIH0gZWxzZSB7CiAgICAgIHZhciB3cmFwcGVyID0gZnVuY3Rpb24gd3JhcHBlcigpIHsKICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGxhcmdzID0gQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHsKICAgICAgICAgIGxhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107CiAgICAgICAgfQoKICAgICAgICBfdGhpczIub2ZmKHRhcmdldCwgdHlwZSwgd3JhcHBlcik7CiAgICAgICAgbGlzdGVuZXIuYXBwbHkobnVsbCwgbGFyZ3MpOwogICAgICB9OwoKICAgICAgLy8gVXNlIHRoZSBzYW1lIGZ1bmN0aW9uIElEIGFzIHRoZSBsaXN0ZW5lciBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyCiAgICAgIC8vIGl0IHVzaW5nIHRoZSBJRCBvZiB0aGUgb3JpZ2luYWwgbGlzdGVuZXIuCiAgICAgIHdyYXBwZXIuZ3VpZCA9IGxpc3RlbmVyLmd1aWQ7CiAgICAgIGxpc3Rlbih0YXJnZXQsICdvbmUnLCB0eXBlLCB3cmFwcGVyKTsKICAgIH0KICB9LAoKCiAgLyoqCiAgICogUmVtb3ZlcyBsaXN0ZW5lcihzKSBmcm9tIGV2ZW50KHMpIG9uIGFuIGV2ZW50ZWQgb2JqZWN0LgogICAqCiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEVsZW1lbnR8T2JqZWN0fSBbdGFyZ2V0T3JUeXBlXQogICAqICAgICAgICAgSWYgdGhpcyBpcyBhIHN0cmluZyBvciBhcnJheSwgaXQgcmVwcmVzZW50cyB0aGUgZXZlbnQgdHlwZShzKS4KICAgKgogICAqICAgICAgICAgQW5vdGhlciBldmVudGVkIG9iamVjdCBjYW4gYmUgcGFzc2VkIGhlcmUgaW5zdGVhZCwgaW4gd2hpY2ggY2FzZQogICAqICAgICAgICAgQUxMIDMgYXJndW1lbnRzIGFyZSBfcmVxdWlyZWRfLgogICAqCiAgICogQHBhcmFtICB7c3RyaW5nfEFycmF5fEZ1bmN0aW9ufSBbdHlwZU9yTGlzdGVuZXJdCiAgICogICAgICAgICBJZiB0aGUgZmlyc3QgYXJndW1lbnQgd2FzIGEgc3RyaW5nIG9yIGFycmF5LCB0aGlzIG1heSBiZSB0aGUKICAgKiAgICAgICAgIGxpc3RlbmVyIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHRoaXMgaXMgYSBzdHJpbmcgb3IgYXJyYXkgb2YgZXZlbnQKICAgKiAgICAgICAgIHR5cGUocykuCiAgICoKICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW2xpc3RlbmVyXQogICAqICAgICAgICAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LCB0aGlzIHdpbGwgYmUKICAgKiAgICAgICAgIHRoZSBsaXN0ZW5lciBmdW5jdGlvbjsgb3RoZXJ3aXNlLCBfYWxsXyBsaXN0ZW5lcnMgYm91bmQgdG8gdGhlCiAgICogICAgICAgICBldmVudCB0eXBlKHMpIHdpbGwgYmUgcmVtb3ZlZC4KICAgKi8KICBvZmY6IGZ1bmN0aW9uIG9mZiQkMSh0YXJnZXRPclR5cGUsIHR5cGVPckxpc3RlbmVyLCBsaXN0ZW5lcikgewoKICAgIC8vIFRhcmdldGluZyB0aGlzIGV2ZW50ZWQgb2JqZWN0LgogICAgaWYgKCF0YXJnZXRPclR5cGUgfHwgaXNWYWxpZEV2ZW50VHlwZSh0YXJnZXRPclR5cGUpKSB7CiAgICAgIG9mZih0aGlzLmV2ZW50QnVzRWxfLCB0YXJnZXRPclR5cGUsIHR5cGVPckxpc3RlbmVyKTsKCiAgICAgIC8vIFRhcmdldGluZyBhbm90aGVyIGV2ZW50ZWQgb2JqZWN0LgogICAgfSBlbHNlIHsKICAgICAgdmFyIHRhcmdldCA9IHRhcmdldE9yVHlwZTsKICAgICAgdmFyIHR5cGUgPSB0eXBlT3JMaXN0ZW5lcjsKCiAgICAgIC8vIEZhaWwgZmFzdCBhbmQgaW4gYSBtZWFuaW5nZnVsIHdheSEKICAgICAgdmFsaWRhdGVUYXJnZXQodGFyZ2V0KTsKICAgICAgdmFsaWRhdGVFdmVudFR5cGUodHlwZSk7CiAgICAgIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgLy8gRW5zdXJlIHRoZXJlJ3MgYXQgbGVhc3QgYSBndWlkLCBldmVuIGlmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgYmVlbiB1c2VkCiAgICAgIGxpc3RlbmVyID0gYmluZCh0aGlzLCBsaXN0ZW5lcik7CgogICAgICAvLyBSZW1vdmUgdGhlIGRpc3Bvc2UgbGlzdGVuZXIgb24gdGhpcyBldmVudGVkIG9iamVjdCwgd2hpY2ggd2FzIGdpdmVuCiAgICAgIC8vIHRoZSBzYW1lIGd1aWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVyIGluIG9uKCkuCiAgICAgIHRoaXMub2ZmKCdkaXNwb3NlJywgbGlzdGVuZXIpOwoKICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZSkgewogICAgICAgIG9mZih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKTsKICAgICAgICBvZmYodGFyZ2V0LCAnZGlzcG9zZScsIGxpc3RlbmVyKTsKICAgICAgfSBlbHNlIGlmIChpc0V2ZW50ZWQodGFyZ2V0KSkgewogICAgICAgIHRhcmdldC5vZmYodHlwZSwgbGlzdGVuZXIpOwogICAgICAgIHRhcmdldC5vZmYoJ2Rpc3Bvc2UnLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgIH0KICB9LAoKCiAgLyoqCiAgICogRmlyZSBhbiBldmVudCBvbiB0aGlzIGV2ZW50ZWQgb2JqZWN0LCBjYXVzaW5nIGl0cyBsaXN0ZW5lcnMgdG8gYmUgY2FsbGVkLgogICAqCiAgICogQHBhcmFtICAge3N0cmluZ3xPYmplY3R9IGV2ZW50CiAgICogICAgICAgICAgQW4gZXZlbnQgdHlwZSBvciBhbiBvYmplY3Qgd2l0aCBhIHR5cGUgcHJvcGVydHkuCiAgICoKICAgKiBAcGFyYW0gICB7T2JqZWN0fSBbaGFzaF0KICAgKiAgICAgICAgICBBbiBhZGRpdGlvbmFsIG9iamVjdCB0byBwYXNzIGFsb25nIHRvIGxpc3RlbmVycy4KICAgKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdhcyBwcmV2ZW50ZWQuCiAgICovCiAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlciQkMShldmVudCwgaGFzaCkgewogICAgcmV0dXJuIHRyaWdnZXIodGhpcy5ldmVudEJ1c0VsXywgZXZlbnQsIGhhc2gpOwogIH0KfTsKCi8qKgogKiBBcHBsaWVzIHtAbGluayBtb2R1bGU6ZXZlbnRlZH5FdmVudGVkTWl4aW58RXZlbnRlZE1peGlufSB0byBhIHRhcmdldCBvYmplY3QuCiAqCiAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0CiAqICAgICAgICAgVGhlIG9iamVjdCB0byB3aGljaCB0byBhZGQgZXZlbnQgbWV0aG9kcy4KICoKICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICogICAgICAgICBPcHRpb25zIGZvciBjdXN0b21pemluZyB0aGUgbWl4aW4gYmVoYXZpb3IuCiAqCiAqIEBwYXJhbSAge1N0cmluZ30gW29wdGlvbnMuZXZlbnRCdXNLZXldCiAqICAgICAgICAgQnkgZGVmYXVsdCwgYWRkcyBhIGBldmVudEJ1c0VsX2AgRE9NIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBvYmplY3QsCiAqICAgICAgICAgd2hpY2ggaXMgdXNlZCBhcyBhbiBldmVudCBidXMuIElmIHRoZSB0YXJnZXQgb2JqZWN0IGFscmVhZHkgaGFzIGEKICogICAgICAgICBET00gZWxlbWVudCB0aGF0IHNob3VsZCBiZSB1c2VkLCBwYXNzIGl0cyBrZXkgaGVyZS4KICoKICogQHJldHVybiB7T2JqZWN0fQogKiAgICAgICAgIFRoZSB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXZlbnRlZCh0YXJnZXQpIHsKICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgdmFyIGV2ZW50QnVzS2V5ID0gb3B0aW9ucy5ldmVudEJ1c0tleTsKCiAgLy8gU2V0IG9yIGNyZWF0ZSB0aGUgZXZlbnRCdXNFbF8uCgogIGlmIChldmVudEJ1c0tleSkgewogICAgaWYgKCF0YXJnZXRbZXZlbnRCdXNLZXldLm5vZGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGV2ZW50QnVzS2V5ICInICsgZXZlbnRCdXNLZXkgKyAnIiBkb2VzIG5vdCByZWZlciB0byBhbiBlbGVtZW50LicpOwogICAgfQogICAgdGFyZ2V0LmV2ZW50QnVzRWxfID0gdGFyZ2V0W2V2ZW50QnVzS2V5XTsKICB9IGVsc2UgewogICAgdGFyZ2V0LmV2ZW50QnVzRWxfID0gY3JlYXRlRWwoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ3Zqcy1ldmVudC1idXMnIH0pOwogIH0KCiAgYXNzaWduKHRhcmdldCwgRXZlbnRlZE1peGluKTsKCiAgLy8gV2hlbiBhbnkgZXZlbnRlZCBvYmplY3QgaXMgZGlzcG9zZWQsIGl0IHJlbW92ZXMgYWxsIGl0cyBsaXN0ZW5lcnMuCiAgdGFyZ2V0Lm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKCkgewogICAgdGFyZ2V0Lm9mZigpOwogICAgd2luZG93XzEuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIHRhcmdldC5ldmVudEJ1c0VsXyA9IG51bGw7CiAgICB9LCAwKTsKICB9KTsKCiAgcmV0dXJuIHRhcmdldDsKfQoKLyoqCiAqIEBmaWxlIG1peGlucy9zdGF0ZWZ1bC5qcwogKiBAbW9kdWxlIHN0YXRlZnVsCiAqLwovKioKICogQ29udGFpbnMgbWV0aG9kcyB0aGF0IHByb3ZpZGUgc3RhdGVmdWxuZXNzIHRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWQKICogdG8ge0BsaW5rIG1vZHVsZTpzdGF0ZWZ1bH0uCiAqCiAqIEBtaXhpbiBTdGF0ZWZ1bE1peGluCiAqLwp2YXIgU3RhdGVmdWxNaXhpbiA9IHsKCiAgLyoqCiAgICogQSBoYXNoIGNvbnRhaW5pbmcgYXJiaXRyYXJ5IGtleXMgYW5kIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mCiAgICogdGhlIG9iamVjdC4KICAgKgogICAqIEB0eXBlIHtPYmplY3R9CiAgICovCiAgc3RhdGU6IHt9LAoKICAvKioKICAgKiBTZXQgdGhlIHN0YXRlIG9mIGFuIG9iamVjdCBieSBtdXRhdGluZyBpdHMKICAgKiB7QGxpbmsgbW9kdWxlOnN0YXRlZnVsflN0YXRlZnVsTWl4aW4uc3RhdGV8c3RhdGV9IG9iamVjdCBpbiBwbGFjZS4KICAgKgogICAqIEBmaXJlcyAgIG1vZHVsZTpzdGF0ZWZ1bH5TdGF0ZWZ1bE1peGluI3N0YXRlY2hhbmdlZAogICAqIEBwYXJhbSAgIHtPYmplY3R8RnVuY3Rpb259IHN0YXRlVXBkYXRlcwogICAqICAgICAgICAgIEEgbmV3IHNldCBvZiBwcm9wZXJ0aWVzIHRvIHNoYWxsb3ctbWVyZ2UgaW50byB0aGUgcGx1Z2luIHN0YXRlLgogICAqICAgICAgICAgIENhbiBiZSBhIHBsYWluIG9iamVjdCBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHBsYWluIG9iamVjdC4KICAgKgogICAqIEByZXR1cm5zIHtPYmplY3R8dW5kZWZpbmVkfQogICAqICAgICAgICAgIEFuIG9iamVjdCBjb250YWluaW5nIGNoYW5nZXMgdGhhdCBvY2N1cnJlZC4gSWYgbm8gY2hhbmdlcwogICAqICAgICAgICAgIG9jY3VycmVkLCByZXR1cm5zIGB1bmRlZmluZWRgLgogICAqLwogIHNldFN0YXRlOiBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZVVwZGF0ZXMpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgLy8gU3VwcG9ydCBwcm92aWRpbmcgdGhlIGBzdGF0ZVVwZGF0ZXNgIHN0YXRlIGFzIGEgZnVuY3Rpb24uCiAgICBpZiAodHlwZW9mIHN0YXRlVXBkYXRlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBzdGF0ZVVwZGF0ZXMgPSBzdGF0ZVVwZGF0ZXMoKTsKICAgIH0KCiAgICB2YXIgY2hhbmdlcyA9IHZvaWQgMDsKCiAgICBlYWNoKHN0YXRlVXBkYXRlcywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHsKCiAgICAgIC8vIFJlY29yZCB0aGUgY2hhbmdlIGlmIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0J3MgaW4gdGhlCiAgICAgIC8vIGN1cnJlbnQgc3RhdGUuCiAgICAgIGlmIChfdGhpcy5zdGF0ZVtrZXldICE9PSB2YWx1ZSkgewogICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzIHx8IHt9OwogICAgICAgIGNoYW5nZXNba2V5XSA9IHsKICAgICAgICAgIGZyb206IF90aGlzLnN0YXRlW2tleV0sCiAgICAgICAgICB0bzogdmFsdWUKICAgICAgICB9OwogICAgICB9CgogICAgICBfdGhpcy5zdGF0ZVtrZXldID0gdmFsdWU7CiAgICB9KTsKCiAgICAvLyBPbmx5IHRyaWdnZXIgInN0YXRlY2hhbmdlIiBpZiB0aGVyZSB3ZXJlIGNoYW5nZXMgQU5EIHdlIGhhdmUgYSB0cmlnZ2VyCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgdXMgdG8gbm90IHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0IG9iamVjdCBiZSBhbgogICAgLy8gZXZlbnRlZCBvYmplY3QuCiAgICBpZiAoY2hhbmdlcyAmJiBpc0V2ZW50ZWQodGhpcykpIHsKCiAgICAgIC8qKgogICAgICAgKiBBbiBldmVudCB0cmlnZ2VyZWQgb24gYW4gb2JqZWN0IHRoYXQgaXMgYm90aAogICAgICAgKiB7QGxpbmsgbW9kdWxlOnN0YXRlZnVsfHN0YXRlZnVsfSBhbmQge0BsaW5rIG1vZHVsZTpldmVudGVkfGV2ZW50ZWR9CiAgICAgICAqIGluZGljYXRpbmcgdGhhdCBpdHMgc3RhdGUgaGFzIGNoYW5nZWQuCiAgICAgICAqCiAgICAgICAqIEBldmVudCAgICBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbiNzdGF0ZWNoYW5nZWQKICAgICAgICogQHR5cGUgICAgIHtPYmplY3R9CiAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjaGFuZ2VzCiAgICAgICAqICAgICAgICAgICBBIGhhc2ggY29udGFpbmluZyB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgY2hhbmdlZCBhbmQKICAgICAgICogICAgICAgICAgIHRoZSB2YWx1ZXMgdGhleSB3ZXJlIGNoYW5nZWQgYGZyb21gIGFuZCBgdG9gLgogICAgICAgKi8KICAgICAgdGhpcy50cmlnZ2VyKHsKICAgICAgICBjaGFuZ2VzOiBjaGFuZ2VzLAogICAgICAgIHR5cGU6ICdzdGF0ZWNoYW5nZWQnCiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBjaGFuZ2VzOwogIH0KfTsKCi8qKgogKiBBcHBsaWVzIHtAbGluayBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbnxTdGF0ZWZ1bE1peGlufSB0byBhIHRhcmdldAogKiBvYmplY3QuCiAqCiAqIElmIHRoZSB0YXJnZXQgb2JqZWN0IGlzIHtAbGluayBtb2R1bGU6ZXZlbnRlZHxldmVudGVkfSBhbmQgaGFzIGEKICogYGhhbmRsZVN0YXRlQ2hhbmdlZGAgbWV0aG9kLCB0aGF0IG1ldGhvZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYm91bmQgdG8gdGhlCiAqIGBzdGF0ZWNoYW5nZWRgIGV2ZW50IG9uIGl0c2VsZi4KICoKICogQHBhcmFtICAge09iamVjdH0gdGFyZ2V0CiAqICAgICAgICAgIFRoZSBvYmplY3QgdG8gYmUgbWFkZSBzdGF0ZWZ1bC4KICoKICogQHBhcmFtICAge09iamVjdH0gW2RlZmF1bHRTdGF0ZV0KICogICAgICAgICAgQSBkZWZhdWx0IHNldCBvZiBwcm9wZXJ0aWVzIHRvIHBvcHVsYXRlIHRoZSBuZXdseS1zdGF0ZWZ1bCBvYmplY3QncwogKiAgICAgICAgICBgc3RhdGVgIHByb3BlcnR5LgogKgogKiBAcmV0dXJucyB7T2JqZWN0fQogKiAgICAgICAgICBSZXR1cm5zIHRoZSBgdGFyZ2V0YC4KICovCmZ1bmN0aW9uIHN0YXRlZnVsKHRhcmdldCwgZGVmYXVsdFN0YXRlKSB7CiAgYXNzaWduKHRhcmdldCwgU3RhdGVmdWxNaXhpbik7CgogIC8vIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgbWl4aW5nLWluIGJlY2F1c2Ugd2UgbmVlZCB0byByZXBsYWNlIHRoZSBgc3RhdGVgCiAgLy8gYWRkZWQgaW4gdGhhdCBzdGVwLgogIHRhcmdldC5zdGF0ZSA9IGFzc2lnbih7fSwgdGFyZ2V0LnN0YXRlLCBkZWZhdWx0U3RhdGUpOwoKICAvLyBBdXRvLWJpbmQgdGhlIGBoYW5kbGVTdGF0ZUNoYW5nZWRgIG1ldGhvZCBvZiB0aGUgdGFyZ2V0IG9iamVjdCBpZiBpdCBleGlzdHMuCiAgaWYgKHR5cGVvZiB0YXJnZXQuaGFuZGxlU3RhdGVDaGFuZ2VkID09PSAnZnVuY3Rpb24nICYmIGlzRXZlbnRlZCh0YXJnZXQpKSB7CiAgICB0YXJnZXQub24oJ3N0YXRlY2hhbmdlZCcsIHRhcmdldC5oYW5kbGVTdGF0ZUNoYW5nZWQpOwogIH0KCiAgcmV0dXJuIHRhcmdldDsKfQoKLyoqCiAqIEBmaWxlIHRvLXRpdGxlLWNhc2UuanMKICogQG1vZHVsZSB0by10aXRsZS1jYXNlCiAqLwoKLyoqCiAqIFVwcGVyY2FzZSB0aGUgZmlyc3QgbGV0dGVyIG9mIGEgc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nCiAqICAgICAgICBTdHJpbmcgdG8gYmUgdXBwZXJjYXNlZAogKgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqICAgICAgICAgVGhlIHN0cmluZyB3aXRoIGFuIHVwcGVyY2FzZWQgZmlyc3QgbGV0dGVyCiAqLwpmdW5jdGlvbiB0b1RpdGxlQ2FzZShzdHJpbmcpIHsKICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBzdHJpbmc7CiAgfQoKICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpOwp9CgovKioKICogQ29tcGFyZXMgdGhlIFRpdGxlQ2FzZSB2ZXJzaW9ucyBvZiB0aGUgdHdvIHN0cmluZ3MgZm9yIGVxdWFsaXR5LgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyMQogKiAgICAgICAgVGhlIGZpcnN0IHN0cmluZyB0byBjb21wYXJlCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIyCiAqICAgICAgICBUaGUgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgV2hldGhlciB0aGUgVGl0bGVDYXNlIHZlcnNpb25zIG9mIHRoZSBzdHJpbmdzIGFyZSBlcXVhbAogKi8KZnVuY3Rpb24gdGl0bGVDYXNlRXF1YWxzKHN0cjEsIHN0cjIpIHsKICByZXR1cm4gdG9UaXRsZUNhc2Uoc3RyMSkgPT09IHRvVGl0bGVDYXNlKHN0cjIpOwp9CgovKioKICogQGZpbGUgbWVyZ2Utb3B0aW9ucy5qcwogKiBAbW9kdWxlIG1lcmdlLW9wdGlvbnMKICovCi8qKgogKiBEZWVwLW1lcmdlIG9uZSBvciBtb3JlIG9wdGlvbnMgb2JqZWN0cywgcmVjdXJzaXZlbHkgbWVyZ2luZyAqKm9ubHkqKiBwbGFpbgogKiBvYmplY3QgcHJvcGVydGllcy4KICoKICogQHBhcmFtICAge09iamVjdFtdfSBzb3VyY2VzCiAqICAgICAgICAgIE9uZSBvciBtb3JlIG9iamVjdHMgdG8gbWVyZ2UgaW50byBhIG5ldyBvYmplY3QuCiAqCiAqIEByZXR1cm5zIHtPYmplY3R9CiAqICAgICAgICAgIEEgbmV3IG9iamVjdCB0aGF0IGlzIHRoZSBtZXJnZWQgcmVzdWx0IG9mIGFsbCBzb3VyY2VzLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zKCkgewogIHZhciByZXN1bHQgPSB7fTsKCiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNvdXJjZXMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgIHNvdXJjZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CiAgfQoKICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkgewogICAgaWYgKCFzb3VyY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGVhY2goc291cmNlLCBmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgICBpZiAoIWlzUGxhaW4odmFsdWUpKSB7CiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICghaXNQbGFpbihyZXN1bHRba2V5XSkpIHsKICAgICAgICByZXN1bHRba2V5XSA9IHt9OwogICAgICB9CgogICAgICByZXN1bHRba2V5XSA9IG1lcmdlT3B0aW9ucyhyZXN1bHRba2V5XSwgdmFsdWUpOwogICAgfSk7CiAgfSk7CgogIHJldHVybiByZXN1bHQ7Cn0KCi8qKgogKiBQbGF5ZXIgQ29tcG9uZW50IC0gQmFzZSBjbGFzcyBmb3IgYWxsIFVJIG9iamVjdHMKICoKICogQGZpbGUgY29tcG9uZW50LmpzCiAqLwovKioKICogQmFzZSBjbGFzcyBmb3IgYWxsIFVJIENvbXBvbmVudHMuCiAqIENvbXBvbmVudHMgYXJlIFVJIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50IGJvdGggYSBqYXZhc2NyaXB0IG9iamVjdCBhbmQgYW4gZWxlbWVudAogKiBpbiB0aGUgRE9NLiBUaGV5IGNhbiBiZSBjaGlsZHJlbiBvZiBvdGhlciBjb21wb25lbnRzLCBhbmQgY2FuIGhhdmUKICogY2hpbGRyZW4gdGhlbXNlbHZlcy4KICoKICogQ29tcG9uZW50cyBjYW4gYWxzbyB1c2UgbWV0aG9kcyBmcm9tIHtAbGluayBFdmVudFRhcmdldH0KICovCgp2YXIgQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewoKICAvKioKICAgKiBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBjb21wb25lbnQgaXMgcmVhZHkuIERvZXMgbm90IGhhdmUgYW55CiAgICogcGFyYW10ZXJzIGFuZCBhbnkgY2FsbGJhY2sgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgogICAqCiAgICogQGNhbGxiYWNrIENvbXBvbmVudH5SZWFkeUNhbGxiYWNrCiAgICogQHRoaXMgQ29tcG9uZW50CiAgICovCgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdFtdfSBbb3B0aW9ucy5jaGlsZHJlbl0KICAgKiAgICAgICAgQW4gYXJyYXkgb2YgY2hpbGRyZW4gb2JqZWN0cyB0byBpbnRpYWxpemUgdGhpcyBjb21wb25lbnQgd2l0aC4gQ2hpbGRyZW4gb2JqZWN0cyBoYXZlCiAgICogICAgICAgIGEgbmFtZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgdXNlZCBpZiBtb3JlIHRoYW4gb25lIGNvbXBvbmVudCBvZiB0aGUgc2FtZSB0eXBlIG5lZWRzIHRvIGJlCiAgICogICAgICAgIGFkZGVkLgogICAqCiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XQogICAqICAgICAgICBGdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gdGhlIGBDb21wb25lbnRgIGlzIHJlYWR5LgogICAqLwogIGZ1bmN0aW9uIENvbXBvbmVudChwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpOwoKCiAgICAvLyBUaGUgY29tcG9uZW50IG1pZ2h0IGJlIHRoZSBwbGF5ZXIgaXRzZWxmIGFuZCB3ZSBjYW4ndCBwYXNzIGB0aGlzYCB0byBzdXBlcgogICAgaWYgKCFwbGF5ZXIgJiYgdGhpcy5wbGF5KSB7CiAgICAgIHRoaXMucGxheWVyXyA9IHBsYXllciA9IHRoaXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxheWVyXyA9IHBsYXllcjsKICAgIH0KCiAgICAvLyBNYWtlIGEgY29weSBvZiBwcm90b3R5cGUub3B0aW9uc18gdG8gcHJvdGVjdCBhZ2FpbnN0IG92ZXJyaWRpbmcgZGVmYXVsdHMKICAgIHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnMoe30sIHRoaXMub3B0aW9uc18pOwoKICAgIC8vIFVwZGF0ZWQgb3B0aW9ucyB3aXRoIHN1cHBsaWVkIG9wdGlvbnMKICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9uc18sIG9wdGlvbnMpOwoKICAgIC8vIEdldCBJRCBmcm9tIG9wdGlvbnMgb3Igb3B0aW9ucyBlbGVtZW50IGlmIG9uZSBpcyBzdXBwbGllZAogICAgdGhpcy5pZF8gPSBvcHRpb25zLmlkIHx8IG9wdGlvbnMuZWwgJiYgb3B0aW9ucy5lbC5pZDsKCiAgICAvLyBJZiB0aGVyZSB3YXMgbm8gSUQgZnJvbSB0aGUgb3B0aW9ucywgZ2VuZXJhdGUgb25lCiAgICBpZiAoIXRoaXMuaWRfKSB7CiAgICAgIC8vIERvbid0IHJlcXVpcmUgdGhlIHBsYXllciBJRCBmdW5jdGlvbiBpbiB0aGUgY2FzZSBvZiBtb2NrIHBsYXllcnMKICAgICAgdmFyIGlkID0gcGxheWVyICYmIHBsYXllci5pZCAmJiBwbGF5ZXIuaWQoKSB8fCAnbm9fcGxheWVyJzsKCiAgICAgIHRoaXMuaWRfID0gaWQgKyAnX2NvbXBvbmVudF8nICsgbmV3R1VJRCgpOwogICAgfQoKICAgIHRoaXMubmFtZV8gPSBvcHRpb25zLm5hbWUgfHwgbnVsbDsKCiAgICAvLyBDcmVhdGUgZWxlbWVudCBpZiBvbmUgd2Fzbid0IHByb3ZpZGVkIGluIG9wdGlvbnMKICAgIGlmIChvcHRpb25zLmVsKSB7CiAgICAgIHRoaXMuZWxfID0gb3B0aW9ucy5lbDsKICAgIH0gZWxzZSBpZiAob3B0aW9ucy5jcmVhdGVFbCAhPT0gZmFsc2UpIHsKICAgICAgdGhpcy5lbF8gPSB0aGlzLmNyZWF0ZUVsKCk7CiAgICB9CgogICAgLy8gaWYgZXZlbnRlZCBpcyBhbnl0aGluZyBleGNlcHQgZmFsc2UsIHdlIHdhbnQgdG8gbWl4aW4gaW4gZXZlbnRlZAogICAgaWYgKG9wdGlvbnMuZXZlbnRlZCAhPT0gZmFsc2UpIHsKICAgICAgLy8gTWFrZSB0aGlzIGFuIGV2ZW50ZWQgb2JqZWN0IGFuZCB1c2UgYGVsX2AsIGlmIGF2YWlsYWJsZSwgYXMgaXRzIGV2ZW50IGJ1cwogICAgICBldmVudGVkKHRoaXMsIHsgZXZlbnRCdXNLZXk6IHRoaXMuZWxfID8gJ2VsXycgOiBudWxsIH0pOwogICAgfQogICAgc3RhdGVmdWwodGhpcywgdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0U3RhdGUpOwoKICAgIHRoaXMuY2hpbGRyZW5fID0gW107CiAgICB0aGlzLmNoaWxkSW5kZXhfID0ge307CiAgICB0aGlzLmNoaWxkTmFtZUluZGV4XyA9IHt9OwoKICAgIC8vIEFkZCBhbnkgY2hpbGQgY29tcG9uZW50cyBpbiBvcHRpb25zCiAgICBpZiAob3B0aW9ucy5pbml0Q2hpbGRyZW4gIT09IGZhbHNlKSB7CiAgICAgIHRoaXMuaW5pdENoaWxkcmVuKCk7CiAgICB9CgogICAgdGhpcy5yZWFkeShyZWFkeSk7CiAgICAvLyBEb24ndCB3YW50IHRvIHRyaWdnZXIgcmVhZHkgaGVyZSBvciBpdCB3aWxsIGJlZm9yZSBpbml0IGlzIGFjdHVhbGx5CiAgICAvLyBmaW5pc2hlZCBmb3IgYWxsIGNoaWxkcmVuIHRoYXQgcnVuIHRoaXMgY29uc3RydWN0b3IKCiAgICBpZiAob3B0aW9ucy5yZXBvcnRUb3VjaEFjdGl2aXR5ICE9PSBmYWxzZSkgewogICAgICB0aGlzLmVuYWJsZVRvdWNoQWN0aXZpdHkoKTsKICAgIH0KICB9CgogIC8qKgogICAqIERpc3Bvc2Ugb2YgdGhlIGBDb21wb25lbnRgIGFuZCBhbGwgY2hpbGQgY29tcG9uZW50cy4KICAgKgogICAqIEBmaXJlcyBDb21wb25lbnQjZGlzcG9zZQogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHsKCiAgICAvKioKICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgYENvbXBvbmVudGAgaXMgZGlzcG9zZWQuCiAgICAgKgogICAgICogQGV2ZW50IENvbXBvbmVudCNkaXNwb3NlCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKgogICAgICogQHByb3BlcnR5IHtib29sZWFufSBbYnViYmxlcz1mYWxzZV0KICAgICAqICAgICAgICAgICBzZXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUgY2xvc2UgZXZlbnQgZG9lcyBub3QKICAgICAqICAgICAgICAgICBidWJibGUgdXAKICAgICAqLwogICAgdGhpcy50cmlnZ2VyKHsgdHlwZTogJ2Rpc3Bvc2UnLCBidWJibGVzOiBmYWxzZSB9KTsKCiAgICAvLyBEaXNwb3NlIGFsbCBjaGlsZHJlbi4KICAgIGlmICh0aGlzLmNoaWxkcmVuXykgewogICAgICBmb3IgKHZhciBpID0gdGhpcy5jaGlsZHJlbl8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAodGhpcy5jaGlsZHJlbl9baV0uZGlzcG9zZSkgewogICAgICAgICAgdGhpcy5jaGlsZHJlbl9baV0uZGlzcG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIERlbGV0ZSBjaGlsZCByZWZlcmVuY2VzCiAgICB0aGlzLmNoaWxkcmVuXyA9IG51bGw7CiAgICB0aGlzLmNoaWxkSW5kZXhfID0gbnVsbDsKICAgIHRoaXMuY2hpbGROYW1lSW5kZXhfID0gbnVsbDsKCiAgICBpZiAodGhpcy5lbF8pIHsKICAgICAgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBET00KICAgICAgaWYgKHRoaXMuZWxfLnBhcmVudE5vZGUpIHsKICAgICAgICB0aGlzLmVsXy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxfKTsKICAgICAgfQoKICAgICAgcmVtb3ZlRGF0YSh0aGlzLmVsXyk7CiAgICAgIHRoaXMuZWxfID0gbnVsbDsKICAgIH0KCiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBwbGF5ZXIgYWZ0ZXIgZGlzcG9zaW5nIG9mIHRoZSBlbGVtZW50CiAgICB0aGlzLnBsYXllcl8gPSBudWxsOwogIH07CgogIC8qKgogICAqIFJldHVybiB0aGUge0BsaW5rIFBsYXllcn0gdGhhdCB0aGUgYENvbXBvbmVudGAgaGFzIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHJldHVybiB7UGxheWVyfQogICAqICAgICAgICAgVGhlIHBsYXllciB0aGF0IHRoaXMgYENvbXBvbmVudGAgaGFzIGF0dGFjaGVkIHRvLgogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5wbGF5ZXIgPSBmdW5jdGlvbiBwbGF5ZXIoKSB7CiAgICByZXR1cm4gdGhpcy5wbGF5ZXJfOwogIH07CgogIC8qKgogICAqIERlZXAgbWVyZ2Ugb2Ygb3B0aW9ucyBvYmplY3RzIHdpdGggbmV3IG9wdGlvbnMuCiAgICogPiBOb3RlOiBXaGVuIGJvdGggYG9iamAgYW5kIGBvcHRpb25zYCBjb250YWluIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzIGFyZSBvYmplY3RzLgogICAqICAgICAgICAgVGhlIHR3byBwcm9wZXJ0aWVzIGdldCBtZXJnZWQgdXNpbmcge0BsaW5rIG1vZHVsZTptZXJnZU9wdGlvbnN9CiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gb2JqCiAgICogICAgICAgIFRoZSBvYmplY3QgdGhhdCBjb250YWlucyBuZXcgb3B0aW9ucy4KICAgKgogICAqIEByZXR1cm4ge09iamVjdH0KICAgKiAgICAgICAgIEEgbmV3IG9iamVjdCBvZiBgdGhpcy5vcHRpb25zX2AgYW5kIGBvYmpgIG1lcmdlZCB0b2dldGhlci4KICAgKgogICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gNQogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5vcHRpb25zID0gZnVuY3Rpb24gb3B0aW9ucyhvYmopIHsKICAgIGxvZyQxLndhcm4oJ3RoaXMub3B0aW9ucygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluIDYuMCcpOwoKICAgIGlmICghb2JqKSB7CiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNfOwogICAgfQoKICAgIHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXywgb2JqKTsKICAgIHJldHVybiB0aGlzLm9wdGlvbnNfOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgYENvbXBvbmVudGBzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIERPTSBlbGVtZW50IGZvciB0aGlzIGBDb21wb25lbnRgLgogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5lbCA9IGZ1bmN0aW9uIGVsKCkgewogICAgcmV0dXJuIHRoaXMuZWxfOwogIH07CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGBzIERPTSBlbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWdOYW1lXQogICAqICAgICAgICBFbGVtZW50J3MgRE9NIG5vZGUgdHlwZS4gZS5nLiAnZGl2JwogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXQogICAqICAgICAgICBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW2F0dHJpYnV0ZXNdCiAgICogICAgICAgIEFuIG9iamVjdCBvZiBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHNldC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSh0YWdOYW1lLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gY3JlYXRlRWwodGFnTmFtZSwgcHJvcGVydGllcywgYXR0cmlidXRlcyk7CiAgfTsKCiAgLyoqCiAgICogTG9jYWxpemUgYSBzdHJpbmcgZ2l2ZW4gdGhlIHN0cmluZyBpbiBlbmdsaXNoLgogICAqCiAgICogSWYgdG9rZW5zIGFyZSBwcm92aWRlZCwgaXQnbGwgdHJ5IGFuZCBydW4gYSBzaW1wbGUgdG9rZW4gcmVwbGFjZW1lbnQgb24gdGhlIHByb3ZpZGVkIHN0cmluZy4KICAgKiBUaGUgdG9rZW5zIGl0IGxvb29rcyBmb3IgbG9vayBsaWtlIGB7MX1gIHdpdGggdGhlIGluZGV4IGJlaW5nIDEtaW5kZXhlZCBpbnRvIHRoZSB0b2tlbnMgYXJyYXkuCiAgICoKICAgKiBJZiBhIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBpdCdsbCB1c2UgdGhhdCBvdmVyIGBzdHJpbmdgLAogICAqIGlmIGEgdmFsdWUgaXNuJ3QgZm91bmQgaW4gcHJvdmlkZWQgbGFuZ3VhZ2UgZmlsZXMuCiAgICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRlc2NyaXB0aXZlIGtleSBmb3IgdG9rZW4gcmVwbGFjZW1lbnQKICAgKiBidXQgaGF2ZSBhIHN1Y2NpbmN0IGxvY2FsaXplZCBzdHJpbmcgYW5kIG5vdCByZXF1aXJlIGBlbi5qc29uYCB0byBiZSBpbmNsdWRlZC4KICAgKgogICAqIEN1cnJlbnRseSwgaXQgaXMgdXNlZCBmb3IgdGhlIHByb2dyZXNzIGJhciB0aW1pbmcuCiAgICogYGBganMKICAgKiB7CiAgICogICAicHJvZ3Jlc3MgYmFyIHRpbWluZzogY3VycmVudFRpbWU9ezF9IGR1cmF0aW9uPXsyfSI6ICJ7MX0gb2YgezJ9IgogICAqIH0KICAgKiBgYGAKICAgKiBJdCBpcyB0aGVuIHVzZWQgbGlrZSBzbzoKICAgKiBgYGBqcwogICAqIHRoaXMubG9jYWxpemUoJ3Byb2dyZXNzIGJhciB0aW1pbmc6IGN1cnJlbnRUaW1lPXsxfSBkdXJhdGlvbnsyfScsCiAgICogICAgICAgICAgICAgICBbdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCksIHRoaXMucGxheWVyXy5kdXJhdGlvbigpXSwKICAgKiAgICAgICAgICAgICAgICd7MX0gb2YgezJ9Jyk7CiAgICogYGBgCiAgICoKICAgKiBXaGljaCBvdXRwdXRzIHNvbWV0aGluZyBsaWtlOiBgMDE6MjMgb2YgMjQ6NTZgLgogICAqCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nCiAgICogICAgICAgIFRoZSBzdHJpbmcgdG8gbG9jYWxpemUgYW5kIHRoZSBrZXkgdG8gbG9va3VwIGluIHRoZSBsYW5ndWFnZSBmaWxlcy4KICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdG9rZW5zXQogICAqICAgICAgICBJZiB0aGUgY3VycmVudCBpdGVtIGhhcyB0b2tlbiByZXBsYWNlbWVudHMsIHByb3ZpZGUgdGhlIHRva2VucyBoZXJlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVmYXVsdFZhbHVlXQogICAqICAgICAgICBEZWZhdWx0cyB0byBgc3RyaW5nYC4gQ2FuIGJlIGEgZGVmYXVsdCB2YWx1ZSB0byB1c2UgZm9yIHRva2VuIHJlcGxhY2VtZW50CiAgICogICAgICAgIGlmIHRoZSBsb29rdXAga2V5IGlzIG5lZWRlZCB0byBiZSBzZXBhcmF0ZS4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBsb2NhbGl6ZWQgc3RyaW5nIG9yIGlmIG5vIGxvY2FsaXphdGlvbiBleGlzdHMgdGhlIGVuZ2xpc2ggc3RyaW5nLgogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5sb2NhbGl6ZSA9IGZ1bmN0aW9uIGxvY2FsaXplKHN0cmluZywgdG9rZW5zKSB7CiAgICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBzdHJpbmc7CgogICAgdmFyIGNvZGUgPSB0aGlzLnBsYXllcl8ubGFuZ3VhZ2UgJiYgdGhpcy5wbGF5ZXJfLmxhbmd1YWdlKCk7CiAgICB2YXIgbGFuZ3VhZ2VzID0gdGhpcy5wbGF5ZXJfLmxhbmd1YWdlcyAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2VzKCk7CiAgICB2YXIgbGFuZ3VhZ2UgPSBsYW5ndWFnZXMgJiYgbGFuZ3VhZ2VzW2NvZGVdOwogICAgdmFyIHByaW1hcnlDb2RlID0gY29kZSAmJiBjb2RlLnNwbGl0KCctJylbMF07CiAgICB2YXIgcHJpbWFyeUxhbmcgPSBsYW5ndWFnZXMgJiYgbGFuZ3VhZ2VzW3ByaW1hcnlDb2RlXTsKCiAgICB2YXIgbG9jYWxpemVkU3RyaW5nID0gZGVmYXVsdFZhbHVlOwoKICAgIGlmIChsYW5ndWFnZSAmJiBsYW5ndWFnZVtzdHJpbmddKSB7CiAgICAgIGxvY2FsaXplZFN0cmluZyA9IGxhbmd1YWdlW3N0cmluZ107CiAgICB9IGVsc2UgaWYgKHByaW1hcnlMYW5nICYmIHByaW1hcnlMYW5nW3N0cmluZ10pIHsKICAgICAgbG9jYWxpemVkU3RyaW5nID0gcHJpbWFyeUxhbmdbc3RyaW5nXTsKICAgIH0KCiAgICBpZiAodG9rZW5zKSB7CiAgICAgIGxvY2FsaXplZFN0cmluZyA9IGxvY2FsaXplZFN0cmluZy5yZXBsYWNlKC9ceyhcZCspXH0vZywgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRva2Vuc1tpbmRleCAtIDFdOwogICAgICAgIHZhciByZXQgPSB2YWx1ZTsKCiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHJldCA9IG1hdGNoOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGxvY2FsaXplZFN0cmluZzsKICB9OwoKICAvKioKICAgKiBSZXR1cm4gdGhlIGBDb21wb25lbnRgcyBET00gZWxlbWVudC4gVGhpcyBpcyB3aGVyZSBjaGlsZHJlbiBnZXQgaW5zZXJ0ZWQuCiAgICogVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50IHJldHVybmVkIGluIHtAbGluayBDb21wb25lbnQjZWx9LgogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBjb250ZW50IGVsZW1lbnQgZm9yIHRoaXMgYENvbXBvbmVudGAuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmNvbnRlbnRFbCA9IGZ1bmN0aW9uIGNvbnRlbnRFbCgpIHsKICAgIHJldHVybiB0aGlzLmNvbnRlbnRFbF8gfHwgdGhpcy5lbF87CiAgfTsKCiAgLyoqCiAgICogR2V0IHRoaXMgYENvbXBvbmVudGBzIElECiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgaWQgb2YgdGhpcyBgQ29tcG9uZW50YAogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5pZCA9IGZ1bmN0aW9uIGlkKCkgewogICAgcmV0dXJuIHRoaXMuaWRfOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgYENvbXBvbmVudGBzIG5hbWUuIFRoZSBuYW1lIGdldHMgdXNlZCB0byByZWZlcmVuY2UgdGhlIGBDb21wb25lbnRgCiAgICogYW5kIGlzIHNldCBkdXJpbmcgcmVnaXN0cmF0aW9uLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyBgQ29tcG9uZW50YC4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uIG5hbWUoKSB7CiAgICByZXR1cm4gdGhpcy5uYW1lXzsKICB9OwoKICAvKioKICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIGNoaWxkIGNvbXBvbmVudHMKICAgKgogICAqIEByZXR1cm4ge0FycmF5fQogICAqICAgICAgICAgVGhlIGNoaWxkcmVuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24gY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbl87CiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY2hpbGQgYENvbXBvbmVudGAgd2l0aCB0aGUgZ2l2ZW4gYGlkYC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBpZAogICAqICAgICAgICBUaGUgaWQgb2YgdGhlIGNoaWxkIGBDb21wb25lbnRgIHRvIGdldC4KICAgKgogICAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9CiAgICogICAgICAgICBUaGUgY2hpbGQgYENvbXBvbmVudGAgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBvciB1bmRlZmluZWQuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmdldENoaWxkQnlJZCA9IGZ1bmN0aW9uIGdldENoaWxkQnlJZChpZCkgewogICAgcmV0dXJuIHRoaXMuY2hpbGRJbmRleF9baWRdOwogIH07CgogIC8qKgogICAqIFJldHVybnMgdGhlIGNoaWxkIGBDb21wb25lbnRgIHdpdGggdGhlIGdpdmVuIGBuYW1lYC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjaGlsZCBgQ29tcG9uZW50YCB0byBnZXQuCiAgICoKICAgKiBAcmV0dXJuIHtDb21wb25lbnR8dW5kZWZpbmVkfQogICAqICAgICAgICAgVGhlIGNoaWxkIGBDb21wb25lbnRgIHdpdGggdGhlIGdpdmVuIGBuYW1lYCBvciB1bmRlZmluZWQuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gZ2V0Q2hpbGQobmFtZSkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7CgogICAgcmV0dXJuIHRoaXMuY2hpbGROYW1lSW5kZXhfW25hbWVdOwogIH07CgogIC8qKgogICAqIEFkZCBhIGNoaWxkIGBDb21wb25lbnRgIGluc2lkZSB0aGUgY3VycmVudCBgQ29tcG9uZW50YC4KICAgKgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd8Q29tcG9uZW50fSBjaGlsZAogICAqICAgICAgICBUaGUgbmFtZSBvciBpbnN0YW5jZSBvZiBhIGNoaWxkIHRvIGFkZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBvcHRpb25zIHRoYXQgd2lsbCBnZXQgcGFzc2VkIHRvIGNoaWxkcmVuIG9mCiAgICogICAgICAgIHRoZSBjaGlsZC4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9dGhpcy5jaGlsZHJlbl8ubGVuZ3RoXQogICAqICAgICAgICBUaGUgaW5kZXggdG8gYXR0ZW1wdCB0byBhZGQgYSBjaGlsZCBpbnRvLgogICAqCiAgICogQHJldHVybiB7Q29tcG9uZW50fQogICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgZ2V0cyBhZGRlZCBhcyBhIGNoaWxkLiBXaGVuIHVzaW5nIGEgc3RyaW5nIHRoZQogICAqICAgICAgICAgYENvbXBvbmVudGAgd2lsbCBnZXQgY3JlYXRlZCBieSB0aGlzIHByb2Nlc3MuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQoY2hpbGQpIHsKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIHZhciBpbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdGhpcy5jaGlsZHJlbl8ubGVuZ3RoOwoKICAgIHZhciBjb21wb25lbnQgPSB2b2lkIDA7CiAgICB2YXIgY29tcG9uZW50TmFtZSA9IHZvaWQgMDsKCiAgICAvLyBJZiBjaGlsZCBpcyBhIHN0cmluZywgY3JlYXRlIGNvbXBvbmVudCB3aXRoIG9wdGlvbnMKICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7CiAgICAgIGNvbXBvbmVudE5hbWUgPSB0b1RpdGxlQ2FzZShjaGlsZCk7CgogICAgICB2YXIgY29tcG9uZW50Q2xhc3NOYW1lID0gb3B0aW9ucy5jb21wb25lbnRDbGFzcyB8fCBjb21wb25lbnROYW1lOwoKICAgICAgLy8gU2V0IG5hbWUgdGhyb3VnaCBvcHRpb25zCiAgICAgIG9wdGlvbnMubmFtZSA9IGNvbXBvbmVudE5hbWU7CgogICAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0ICYgZWxlbWVudCBmb3IgdGhpcyBjb250cm9scyBzZXQKICAgICAgLy8gSWYgdGhlcmUncyBubyAucGxheWVyXywgdGhpcyBpcyBhIHBsYXllcgogICAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KGNvbXBvbmVudENsYXNzTmFtZSk7CgogICAgICBpZiAoIUNvbXBvbmVudENsYXNzKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgJyArIGNvbXBvbmVudENsYXNzTmFtZSArICcgZG9lcyBub3QgZXhpc3QnKTsKICAgICAgfQoKICAgICAgLy8gZGF0YSBzdG9yZWQgZGlyZWN0bHkgb24gdGhlIHZpZGVvanMgb2JqZWN0IG1heSBiZQogICAgICAvLyBtaXNpZGVudGlmaWVkIGFzIGEgY29tcG9uZW50IHRvIHJldGFpbgogICAgICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIDQueC4gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZQogICAgICAvLyBjb21wb25lbnQgY2xhc3MgY2FuIGJlIGluc3RhbnRpYXRlZC4KICAgICAgaWYgKHR5cGVvZiBDb21wb25lbnRDbGFzcyAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50Q2xhc3ModGhpcy5wbGF5ZXJfIHx8IHRoaXMsIG9wdGlvbnMpOwoKICAgICAgLy8gY2hpbGQgaXMgYSBjb21wb25lbnQgaW5zdGFuY2UKICAgIH0gZWxzZSB7CiAgICAgIGNvbXBvbmVudCA9IGNoaWxkOwogICAgfQoKICAgIHRoaXMuY2hpbGRyZW5fLnNwbGljZShpbmRleCwgMCwgY29tcG9uZW50KTsKCiAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5pZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0aGlzLmNoaWxkSW5kZXhfW2NvbXBvbmVudC5pZCgpXSA9IGNvbXBvbmVudDsKICAgIH0KCiAgICAvLyBJZiBhIG5hbWUgd2Fzbid0IHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQsIGNoZWNrIGlmIHdlIGNhbiB1c2UgdGhlCiAgICAvLyBuYW1lIGZ1bmN0aW9uIG9mIHRoZSBjb21wb25lbnQKICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IGNvbXBvbmVudC5uYW1lICYmIHRvVGl0bGVDYXNlKGNvbXBvbmVudC5uYW1lKCkpOwoKICAgIGlmIChjb21wb25lbnROYW1lKSB7CiAgICAgIHRoaXMuY2hpbGROYW1lSW5kZXhfW2NvbXBvbmVudE5hbWVdID0gY29tcG9uZW50OwogICAgfQoKICAgIC8vIEFkZCB0aGUgVUkgb2JqZWN0J3MgZWxlbWVudCB0byB0aGUgY29udGFpbmVyIGRpdiAoYm94KQogICAgLy8gSGF2aW5nIGFuIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkCiAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5lbCA9PT0gJ2Z1bmN0aW9uJyAmJiBjb21wb25lbnQuZWwoKSkgewogICAgICB2YXIgY2hpbGROb2RlcyA9IHRoaXMuY29udGVudEVsKCkuY2hpbGRyZW47CiAgICAgIHZhciByZWZOb2RlID0gY2hpbGROb2Rlc1tpbmRleF0gfHwgbnVsbDsKCiAgICAgIHRoaXMuY29udGVudEVsKCkuaW5zZXJ0QmVmb3JlKGNvbXBvbmVudC5lbCgpLCByZWZOb2RlKTsKICAgIH0KCiAgICAvLyBSZXR1cm4gc28gaXQgY2FuIHN0b3JlZCBvbiBwYXJlbnQgb2JqZWN0IGlmIGRlc2lyZWQuCiAgICByZXR1cm4gY29tcG9uZW50OwogIH07CgogIC8qKgogICAqIFJlbW92ZSBhIGNoaWxkIGBDb21wb25lbnRgIGZyb20gdGhpcyBgQ29tcG9uZW50YHMgbGlzdCBvZiBjaGlsZHJlbi4gQWxzbyByZW1vdmVzCiAgICogdGhlIGNoaWxkIGBDb21wb25lbnRgcyBlbGVtZW50IGZyb20gdGhpcyBgQ29tcG9uZW50YHMgZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQKICAgKiAgICAgICAgVGhlIGNoaWxkIGBDb21wb25lbnRgIHRvIHJlbW92ZS4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZChjb21wb25lbnQpIHsKICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSAnc3RyaW5nJykgewogICAgICBjb21wb25lbnQgPSB0aGlzLmdldENoaWxkKGNvbXBvbmVudCk7CiAgICB9CgogICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuY2hpbGRyZW5fKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgY2hpbGRGb3VuZCA9IGZhbHNlOwoKICAgIGZvciAodmFyIGkgPSB0aGlzLmNoaWxkcmVuXy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBpZiAodGhpcy5jaGlsZHJlbl9baV0gPT09IGNvbXBvbmVudCkgewogICAgICAgIGNoaWxkRm91bmQgPSB0cnVlOwogICAgICAgIHRoaXMuY2hpbGRyZW5fLnNwbGljZShpLCAxKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmICghY2hpbGRGb3VuZCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5jaGlsZEluZGV4X1tjb21wb25lbnQuaWQoKV0gPSBudWxsOwogICAgdGhpcy5jaGlsZE5hbWVJbmRleF9bY29tcG9uZW50Lm5hbWUoKV0gPSBudWxsOwoKICAgIHZhciBjb21wRWwgPSBjb21wb25lbnQuZWwoKTsKCiAgICBpZiAoY29tcEVsICYmIGNvbXBFbC5wYXJlbnROb2RlID09PSB0aGlzLmNvbnRlbnRFbCgpKSB7CiAgICAgIHRoaXMuY29udGVudEVsKCkucmVtb3ZlQ2hpbGQoY29tcG9uZW50LmVsKCkpOwogICAgfQogIH07CgogIC8qKgogICAqIEFkZCBhbmQgaW5pdGlhbGl6ZSBkZWZhdWx0IGNoaWxkIGBDb21wb25lbnRgcyBiYXNlZCB1cG9uIG9wdGlvbnMuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmluaXRDaGlsZHJlbiA9IGZ1bmN0aW9uIGluaXRDaGlsZHJlbigpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5vcHRpb25zXy5jaGlsZHJlbjsKCiAgICBpZiAoY2hpbGRyZW4pIHsKICAgICAgLy8gYHRoaXNgIGlzIGBwYXJlbnRgCiAgICAgIHZhciBwYXJlbnRPcHRpb25zID0gdGhpcy5vcHRpb25zXzsKCiAgICAgIHZhciBoYW5kbGVBZGQgPSBmdW5jdGlvbiBoYW5kbGVBZGQoY2hpbGQpIHsKICAgICAgICB2YXIgbmFtZSA9IGNoaWxkLm5hbWU7CiAgICAgICAgdmFyIG9wdHMgPSBjaGlsZC5vcHRzOwoKICAgICAgICAvLyBBbGxvdyBvcHRpb25zIGZvciBjaGlsZHJlbiB0byBiZSBzZXQgYXQgdGhlIHBhcmVudCBvcHRpb25zCiAgICAgICAgLy8gZS5nLiB2aWRlb2pzKGlkLCB7IGNvbnRyb2xCYXI6IGZhbHNlIH0pOwogICAgICAgIC8vIGluc3RlYWQgb2YgdmlkZW9qcyhpZCwgeyBjaGlsZHJlbjogeyBjb250cm9sQmFyOiBmYWxzZSB9KTsKICAgICAgICBpZiAocGFyZW50T3B0aW9uc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBvcHRzID0gcGFyZW50T3B0aW9uc1tuYW1lXTsKICAgICAgICB9CgogICAgICAgIC8vIEFsbG93IGZvciBkaXNhYmxpbmcgZGVmYXVsdCBjb21wb25lbnRzCiAgICAgICAgLy8gZS5nLiBvcHRpb25zWydjaGlsZHJlbiddWydwb3N0ZXJJbWFnZSddID0gZmFsc2UKICAgICAgICBpZiAob3B0cyA9PT0gZmFsc2UpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEFsbG93IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGFzIGEgc2ltcGxlIGJvb2xlYW4gaWYgbm8gY29uZmlndXJhdGlvbgogICAgICAgIC8vIGlzIG5lY2Vzc2FyeS4KICAgICAgICBpZiAob3B0cyA9PT0gdHJ1ZSkgewogICAgICAgICAgb3B0cyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgLy8gV2UgYWxzbyB3YW50IHRvIHBhc3MgdGhlIG9yaWdpbmFsIHBsYXllciBvcHRpb25zCiAgICAgICAgLy8gdG8gZWFjaCBjb21wb25lbnQgYXMgd2VsbCBzbyB0aGV5IGRvbid0IG5lZWQgdG8KICAgICAgICAvLyByZWFjaCBiYWNrIGludG8gdGhlIHBsYXllciBmb3Igb3B0aW9ucyBsYXRlci4KICAgICAgICBvcHRzLnBsYXllck9wdGlvbnMgPSBfdGhpcy5vcHRpb25zXy5wbGF5ZXJPcHRpb25zOwoKICAgICAgICAvLyBDcmVhdGUgYW5kIGFkZCB0aGUgY2hpbGQgY29tcG9uZW50LgogICAgICAgIC8vIEFkZCBhIGRpcmVjdCByZWZlcmVuY2UgdG8gdGhlIGNoaWxkIGJ5IG5hbWUgb24gdGhlIHBhcmVudCBpbnN0YW5jZS4KICAgICAgICAvLyBJZiB0d28gb2YgdGhlIHNhbWUgY29tcG9uZW50IGFyZSB1c2VkLCBkaWZmZXJlbnQgbmFtZXMgc2hvdWxkIGJlIHN1cHBsaWVkCiAgICAgICAgLy8gZm9yIGVhY2gKICAgICAgICB2YXIgbmV3Q2hpbGQgPSBfdGhpcy5hZGRDaGlsZChuYW1lLCBvcHRzKTsKCiAgICAgICAgaWYgKG5ld0NoaWxkKSB7CiAgICAgICAgICBfdGhpc1tuYW1lXSA9IG5ld0NoaWxkOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIC8vIEFsbG93IGZvciBhbiBhcnJheSBvZiBjaGlsZHJlbiBkZXRhaWxzIHRvIHBhc3NlZCBpbiB0aGUgb3B0aW9ucwogICAgICB2YXIgd29ya2luZ0NoaWxkcmVuID0gdm9pZCAwOwogICAgICB2YXIgVGVjaCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoJ1RlY2gnKTsKCiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICAgIHdvcmtpbmdDaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgICB9IGVsc2UgewogICAgICAgIHdvcmtpbmdDaGlsZHJlbiA9IE9iamVjdC5rZXlzKGNoaWxkcmVuKTsKICAgICAgfQoKICAgICAgd29ya2luZ0NoaWxkcmVuCiAgICAgIC8vIGNoaWxkcmVuIHRoYXQgYXJlIGluIHRoaXMub3B0aW9uc18gYnV0IGFsc28gaW4gd29ya2luZ0NoaWxkcmVuICB3b3VsZAogICAgICAvLyBnaXZlIHVzIGV4dHJhIGNoaWxkcmVuIHdlIGRvIG5vdCB3YW50LiBTbywgd2Ugd2FudCB0byBmaWx0ZXIgdGhlbSBvdXQuCiAgICAgIC5jb25jYXQoT2JqZWN0LmtleXModGhpcy5vcHRpb25zXykuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkgewogICAgICAgIHJldHVybiAhd29ya2luZ0NoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKHdjaGlsZCkgewogICAgICAgICAgaWYgKHR5cGVvZiB3Y2hpbGQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiBjaGlsZCA9PT0gd2NoaWxkOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNoaWxkID09PSB3Y2hpbGQubmFtZTsKICAgICAgICB9KTsKICAgICAgfSkpLm1hcChmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICB2YXIgbmFtZSA9IHZvaWQgMDsKICAgICAgICB2YXIgb3B0cyA9IHZvaWQgMDsKCiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgIG5hbWUgPSBjaGlsZDsKICAgICAgICAgIG9wdHMgPSBjaGlsZHJlbltuYW1lXSB8fCBfdGhpcy5vcHRpb25zX1tuYW1lXSB8fCB7fTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZSA9IGNoaWxkLm5hbWU7CiAgICAgICAgICBvcHRzID0gY2hpbGQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4geyBuYW1lOiBuYW1lLCBvcHRzOiBvcHRzIH07CiAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAvLyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IGNoaWxkLm5hbWUgaXNuJ3QgaW4gdGhlIHRlY2hPcmRlciBzaW5jZQogICAgICAgIC8vIHRlY2hzIGFyZSByZWdpc3RlcmQgYXMgQ29tcG9uZW50cyBidXQgY2FuJ3QgYXJlbid0IGNvbXBhdGlibGUKICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpZGVvanMvdmlkZW8uanMvaXNzdWVzLzI3NzIKICAgICAgICB2YXIgYyA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGQub3B0cy5jb21wb25lbnRDbGFzcyB8fCB0b1RpdGxlQ2FzZShjaGlsZC5uYW1lKSk7CgogICAgICAgIHJldHVybiBjICYmICFUZWNoLmlzVGVjaChjKTsKICAgICAgfSkuZm9yRWFjaChoYW5kbGVBZGQpOwogICAgfQogIH07CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gY2xhc3MgbmFtZS4gU2hvdWxkIGJlIG92ZXJyaWRlbiBieSBzdWItY29tcG9uZW50cy4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBET00gY2xhc3MgbmFtZSBmb3IgdGhpcyBvYmplY3QuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICAvLyBDaGlsZCBjbGFzc2VzIGNhbiBpbmNsdWRlIGEgZnVuY3Rpb24gdGhhdCBkb2VzOgogICAgLy8gcmV0dXJuICdDTEFTUyBOQU1FJyArIHRoaXMuX3N1cGVyKCk7CiAgICByZXR1cm4gJyc7CiAgfTsKCiAgLyoqCiAgICogQmluZCBhIGxpc3RlbmVyIHRvIHRoZSBjb21wb25lbnQncyByZWFkeSBzdGF0ZS4KICAgKiBEaWZmZXJlbnQgZnJvbSBldmVudCBsaXN0ZW5lcnMgaW4gdGhhdCBpZiB0aGUgcmVhZHkgZXZlbnQgaGFzIGFscmVhZHkgaGFwcGVuZWQKICAgKiBpdCB3aWxsIHRyaWdnZXIgdGhlIGZ1bmN0aW9uIGltbWVkaWF0ZWx5LgogICAqCiAgICogQHJldHVybiB7Q29tcG9uZW50fQogICAqICAgICAgICAgUmV0dXJucyBpdHNlbGY7IG1ldGhvZCBjYW4gYmUgY2hhaW5lZC4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUucmVhZHkgPSBmdW5jdGlvbiByZWFkeShmbikgewogICAgdmFyIHN5bmMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOwoKICAgIGlmICghZm4pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghdGhpcy5pc1JlYWR5XykgewogICAgICB0aGlzLnJlYWR5UXVldWVfID0gdGhpcy5yZWFkeVF1ZXVlXyB8fCBbXTsKICAgICAgdGhpcy5yZWFkeVF1ZXVlXy5wdXNoKGZuKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChzeW5jKSB7CiAgICAgIGZuLmNhbGwodGhpcyk7CiAgICB9IGVsc2UgewogICAgICAvLyBDYWxsIHRoZSBmdW5jdGlvbiBhc3luY2hyb25vdXNseSBieSBkZWZhdWx0IGZvciBjb25zaXN0ZW5jeQogICAgICB0aGlzLnNldFRpbWVvdXQoZm4sIDEpOwogICAgfQogIH07CgogIC8qKgogICAqIFRyaWdnZXIgYWxsIHRoZSByZWFkeSBsaXN0ZW5lcnMgZm9yIHRoaXMgYENvbXBvbmVudGAuCiAgICoKICAgKiBAZmlyZXMgQ29tcG9uZW50I3JlYWR5CiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLnRyaWdnZXJSZWFkeSA9IGZ1bmN0aW9uIHRyaWdnZXJSZWFkeSgpIHsKICAgIHRoaXMuaXNSZWFkeV8gPSB0cnVlOwoKICAgIC8vIEVuc3VyZSByZWFkeSBpcyB0cmlnZ2VyZCBhc3luY2hyb25vdXNseQogICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHJlYWR5UXVldWUgPSB0aGlzLnJlYWR5UXVldWVfOwoKICAgICAgLy8gUmVzZXQgUmVhZHkgUXVldWUKICAgICAgdGhpcy5yZWFkeVF1ZXVlXyA9IFtdOwoKICAgICAgaWYgKHJlYWR5UXVldWUgJiYgcmVhZHlRdWV1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgcmVhZHlRdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uIChmbikgewogICAgICAgICAgZm4uY2FsbCh0aGlzKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfQoKICAgICAgLy8gQWxsb3cgZm9yIHVzaW5nIGV2ZW50IGxpc3RlbmVycyBhbHNvCiAgICAgIC8qKgogICAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGBDb21wb25lbnRgIGlzIHJlYWR5LgogICAgICAgKgogICAgICAgKiBAZXZlbnQgQ29tcG9uZW50I3JlYWR5CiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICovCiAgICAgIHRoaXMudHJpZ2dlcigncmVhZHknKTsKICAgIH0sIDEpOwogIH07CgogIC8qKgogICAqIEZpbmQgYSBzaW5nbGUgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYSBgc2VsZWN0b3JgLiBUaGlzIGNhbiBiZSB3aXRoaW4gdGhlIGBDb21wb25lbnRgcwogICAqIGBjb250ZW50RWwoKWAgb3IgYW5vdGhlciBjdXN0b20gY29udGV4dC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqICAgICAgICBBIHZhbGlkIENTUyBzZWxlY3Rvciwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYHF1ZXJ5U2VsZWN0b3JgLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gW2NvbnRleHQ9dGhpcy5jb250ZW50RWwoKV0KICAgKiAgICAgICAgQSBET00gZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gcXVlcnkuIENhbiBhbHNvIGJlIGEgc2VsZWN0b3Igc3RyaW5nIGluCiAgICogICAgICAgIHdoaWNoIGNhc2UgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgd2lsbCBnZXQgdXNlZCBhcyBjb250ZXh0LiBJZgogICAqICAgICAgICBtaXNzaW5nIGB0aGlzLmNvbnRlbnRFbCgpYCBnZXRzIHVzZWQuIElmICBgdGhpcy5jb250ZW50RWwoKWAgcmV0dXJucwogICAqICAgICAgICBub3RoaW5nIGl0IGZhbGxzIGJhY2sgdG8gYGRvY3VtZW50YC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH0KICAgKiAgICAgICAgIHRoZSBkb20gZWxlbWVudCB0aGF0IHdhcyBmb3VuZCwgb3IgbnVsbAogICAqCiAgICogQHNlZSBbSW5mb3JtYXRpb24gb24gQ1NTIFNlbGVjdG9yc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvR3VpZGUvQ1NTL0dldHRpbmdfU3RhcnRlZC9TZWxlY3RvcnMpCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLiQgPSBmdW5jdGlvbiAkJCQxKHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgICByZXR1cm4gJChzZWxlY3RvciwgY29udGV4dCB8fCB0aGlzLmNvbnRlbnRFbCgpKTsKICB9OwoKICAvKioKICAgKiBGaW5kcyBhbGwgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYSBgc2VsZWN0b3JgLiBUaGlzIGNhbiBiZSB3aXRoaW4gdGhlIGBDb21wb25lbnRgcwogICAqIGBjb250ZW50RWwoKWAgb3IgYW5vdGhlciBjdXN0b20gY29udGV4dC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqICAgICAgICBBIHZhbGlkIENTUyBzZWxlY3Rvciwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gYHF1ZXJ5U2VsZWN0b3JBbGxgLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gW2NvbnRleHQ9dGhpcy5jb250ZW50RWwoKV0KICAgKiAgICAgICAgQSBET00gZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gcXVlcnkuIENhbiBhbHNvIGJlIGEgc2VsZWN0b3Igc3RyaW5nIGluCiAgICogICAgICAgIHdoaWNoIGNhc2UgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgd2lsbCBnZXQgdXNlZCBhcyBjb250ZXh0LiBJZgogICAqICAgICAgICBtaXNzaW5nIGB0aGlzLmNvbnRlbnRFbCgpYCBnZXRzIHVzZWQuIElmICBgdGhpcy5jb250ZW50RWwoKWAgcmV0dXJucwogICAqICAgICAgICBub3RoaW5nIGl0IGZhbGxzIGJhY2sgdG8gYGRvY3VtZW50YC4KICAgKgogICAqIEByZXR1cm4ge05vZGVMaXN0fQogICAqICAgICAgICAgYSBsaXN0IG9mIGRvbSBlbGVtZW50cyB0aGF0IHdlcmUgZm91bmQKICAgKgogICAqIEBzZWUgW0luZm9ybWF0aW9uIG9uIENTUyBTZWxlY3RvcnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0d1aWRlL0NTUy9HZXR0aW5nX1N0YXJ0ZWQvU2VsZWN0b3JzKQogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS4kJCA9IGZ1bmN0aW9uICQkJCQxKHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgICByZXR1cm4gJCQoc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZW50RWwoKSk7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQncyBlbGVtZW50IGhhcyBhIENTUyBjbGFzcyBuYW1lLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVG9DaGVjawogICAqICAgICAgICBDU1MgY2xhc3MgbmFtZSB0byBjaGVjay4KICAgKgogICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICogICAgICAgICAtIFRydWUgaWYgdGhlIGBDb21wb25lbnRgIGhhcyB0aGUgY2xhc3MuCiAgICogICAgICAgICAtIEZhbHNlIGlmIHRoZSBgQ29tcG9uZW50YCBkb2VzIG5vdCBoYXZlIHRoZSBjbGFzc2AKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuaGFzQ2xhc3MgPSBmdW5jdGlvbiBoYXNDbGFzcyQkMShjbGFzc1RvQ2hlY2spIHsKICAgIHJldHVybiBoYXNDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0NoZWNrKTsKICB9OwoKICAvKioKICAgKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb0FkZAogICAqICAgICAgICBDU1MgY2xhc3MgbmFtZSB0byBhZGQKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuYWRkQ2xhc3MgPSBmdW5jdGlvbiBhZGRDbGFzcyQkMShjbGFzc1RvQWRkKSB7CiAgICBhZGRDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0FkZCk7CiAgfTsKCiAgLyoqCiAgICogUmVtb3ZlIGEgQ1NTIGNsYXNzIG5hbWUgZnJvbSB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NUb1JlbW92ZQogICAqICAgICAgICBDU1MgY2xhc3MgbmFtZSB0byByZW1vdmUKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiByZW1vdmVDbGFzcyQkMShjbGFzc1RvUmVtb3ZlKSB7CiAgICByZW1vdmVDbGFzcyh0aGlzLmVsXywgY2xhc3NUb1JlbW92ZSk7CiAgfTsKCiAgLyoqCiAgICogQWRkIG9yIHJlbW92ZSBhIENTUyBjbGFzcyBuYW1lIGZyb20gdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQuCiAgICogLSBgY2xhc3NUb1RvZ2dsZWAgZ2V0cyBhZGRlZCB3aGVuIHtAbGluayBDb21wb25lbnQjaGFzQ2xhc3N9IHdvdWxkIHJldHVybiBmYWxzZS4KICAgKiAtIGBjbGFzc1RvVG9nZ2xlYCBnZXRzIHJlbW92ZWQgd2hlbiB7QGxpbmsgQ29tcG9uZW50I2hhc0NsYXNzfSB3b3VsZCByZXR1cm4gdHJ1ZS4KICAgKgogICAqIEBwYXJhbSAge3N0cmluZ30gY2xhc3NUb1RvZ2dsZQogICAqICAgICAgICAgVGhlIGNsYXNzIHRvIGFkZCBvciByZW1vdmUgYmFzZWQgb24gKEBsaW5rIENvbXBvbmVudCNoYXNDbGFzc30KICAgKgogICAqIEBwYXJhbSAge2Jvb2xlYW58RG9tfnByZWRpY2F0ZX0gW3ByZWRpY2F0ZV0KICAgKiAgICAgICAgIEFuIHtAbGluayBEb21+cHJlZGljYXRlfSBmdW5jdGlvbiBvciBhIGJvb2xlYW4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUudG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbiB0b2dnbGVDbGFzcyQkMShjbGFzc1RvVG9nZ2xlLCBwcmVkaWNhdGUpIHsKICAgIHRvZ2dsZUNsYXNzKHRoaXMuZWxfLCBjbGFzc1RvVG9nZ2xlLCBwcmVkaWNhdGUpOwogIH07CgogIC8qKgogICAqIFNob3cgdGhlIGBDb21wb25lbnRgcyBlbGVtZW50IGlmIGl0IGlzIGhpZGRlbiBieSByZW1vdmluZyB0aGUKICAgKiAndmpzLWhpZGRlbicgY2xhc3MgbmFtZSBmcm9tIGl0LgogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1oaWRkZW4nKTsKICB9OwoKICAvKioKICAgKiBIaWRlIHRoZSBgQ29tcG9uZW50YHMgZWxlbWVudCBpZiBpdCBpcyBjdXJyZW50bHkgc2hvd2luZyBieSBhZGRpbmcgdGhlCiAgICogJ3Zqcy1oaWRkZW5gIGNsYXNzIG5hbWUgdG8gaXQuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkgewogICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpOwogIH07CgogIC8qKgogICAqIExvY2sgYSBgQ29tcG9uZW50YHMgZWxlbWVudCBpbiBpdHMgdmlzaWJsZSBzdGF0ZSBieSBhZGRpbmcgdGhlICd2anMtbG9jay1zaG93aW5nJwogICAqIGNsYXNzIG5hbWUgdG8gaXQuIFVzZWQgZHVyaW5nIGZhZGVJbi9mYWRlT3V0LgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUubG9ja1Nob3dpbmcgPSBmdW5jdGlvbiBsb2NrU2hvd2luZygpIHsKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1sb2NrLXNob3dpbmcnKTsKICB9OwoKICAvKioKICAgKiBVbmxvY2sgYSBgQ29tcG9uZW50YHMgZWxlbWVudCBmcm9tIGl0cyB2aXNpYmxlIHN0YXRlIGJ5IHJlbW92aW5nIHRoZSAndmpzLWxvY2stc2hvd2luZycKICAgKiBjbGFzcyBuYW1lIGZyb20gaXQuIFVzZWQgZHVyaW5nIGZhZGVJbi9mYWRlT3V0LgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUudW5sb2NrU2hvd2luZyA9IGZ1bmN0aW9uIHVubG9ja1Nob3dpbmcoKSB7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtbG9jay1zaG93aW5nJyk7CiAgfTsKCiAgLyoqCiAgICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhlIGBDb21wb25lbnRgcyBlbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZQogICAqICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9CiAgICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgd2FzIGFza2VkIGZvci4KICAgKiAgICAgICAgIC0gQ2FuIGJlIGFuIGVtcHR5IHN0cmluZyBvbiBzb21lIGJyb3dzZXJzIGlmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3QKICAgKiAgICAgICAgICAgb3IgaGFzIG5vIHZhbHVlCiAgICogICAgICAgICAtIE1vc3QgYnJvd3NlcnMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgYXR0aWJ1dGUgZG9lcyBub3QgZXhpc3Qgb3IgaGFzCiAgICogICAgICAgICAgIG5vIHZhbHVlLgogICAqCiAgICogQHNlZSBbRE9NIEFQSV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0QXR0cmlidXRlfQogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUkJDEoYXR0cmlidXRlKSB7CiAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHRoaXMuZWxfLCBhdHRyaWJ1dGUpOwogIH07CgogIC8qKgogICAqIFNldCB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIG9uIHRoZSBgQ29tcG9uZW50YCdzIGVsZW1lbnQKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUKICAgKiAgICAgICAgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQogICAqICAgICAgICBWYWx1ZSB0byBzZXQgdGhlIGF0dHJpYnV0ZSB0by4KICAgKgogICAqIEBzZWUgW0RPTSBBUElde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3NldEF0dHJpYnV0ZX0KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gc2V0QXR0cmlidXRlJCQxKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgIHNldEF0dHJpYnV0ZSh0aGlzLmVsXywgYXR0cmlidXRlLCB2YWx1ZSk7CiAgfTsKCiAgLyoqCiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBgQ29tcG9uZW50YHMgZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUKICAgKiAgICAgICAgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJlbW92ZS4KICAgKgogICAqIEBzZWUgW0RPTSBBUElde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlbW92ZUF0dHJpYnV0ZX0KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlJCQxKGF0dHJpYnV0ZSkgewogICAgcmVtb3ZlQXR0cmlidXRlKHRoaXMuZWxfLCBhdHRyaWJ1dGUpOwogIH07CgogIC8qKgogICAqIEdldCBvciBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjb21wb25lbnQgYmFzZWQgdXBvbiB0aGUgQ1NTIHN0eWxlcy4KICAgKiBTZWUge0BsaW5rIENvbXBvbmVudCNkaW1lbnNpb259IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgogICAqCiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbbnVtXQogICAqICAgICAgICBUaGUgd2lkdGggdGhhdCB5b3Ugd2FudCB0byBzZXQgcG9zdGZpeGVkIHdpdGggJyUnLCAncHgnIG9yIG5vdGhpbmcuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXQogICAqICAgICAgICBTa2lwIHRoZSBjb21wb25lbnRyZXNpemUgZXZlbnQgdHJpZ2dlcgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfHN0cmluZ30KICAgKiAgICAgICAgIFRoZSB3aWR0aCB3aGVuIGdldHRpbmcsIHplcm8gaWYgdGhlcmUgaXMgbm8gd2lkdGguIENhbiBiZSBhIHN0cmluZwogICAqICAgICAgICAgICBwb3N0cGl4ZWQgd2l0aCAnJScgb3IgJ3B4Jy4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aChudW0sIHNraXBMaXN0ZW5lcnMpIHsKICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbignd2lkdGgnLCBudW0sIHNraXBMaXN0ZW5lcnMpOwogIH07CgogIC8qKgogICAqIEdldCBvciBzZXQgdGhlIGhlaWdodCBvZiB0aGUgY29tcG9uZW50IGJhc2VkIHVwb24gdGhlIENTUyBzdHlsZXMuCiAgICogU2VlIHtAbGluayBDb21wb25lbnQjZGltZW5zaW9ufSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW251bV0KICAgKiAgICAgICAgVGhlIGhlaWdodCB0aGF0IHlvdSB3YW50IHRvIHNldCBwb3N0Zml4ZWQgd2l0aCAnJScsICdweCcgb3Igbm90aGluZy4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBMaXN0ZW5lcnNdCiAgICogICAgICAgIFNraXAgdGhlIGNvbXBvbmVudHJlc2l6ZSBldmVudCB0cmlnZ2VyCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ8c3RyaW5nfQogICAqICAgICAgICAgVGhlIHdpZHRoIHdoZW4gZ2V0dGluZywgemVybyBpZiB0aGVyZSBpcyBubyB3aWR0aC4gQ2FuIGJlIGEgc3RyaW5nCiAgICogICAgICAgICBwb3N0cGl4ZWQgd2l0aCAnJScgb3IgJ3B4Jy4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuaGVpZ2h0ID0gZnVuY3Rpb24gaGVpZ2h0KG51bSwgc2tpcExpc3RlbmVycykgewogICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uKCdoZWlnaHQnLCBudW0sIHNraXBMaXN0ZW5lcnMpOwogIH07CgogIC8qKgogICAqIFNldCBib3RoIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YCBlbGVtZW50IGF0IHRoZSBzYW1lIHRpbWUuCiAgICoKICAgKiBAcGFyYW0gIHtudW1iZXJ8c3RyaW5nfSB3aWR0aAogICAqICAgICAgICAgV2lkdGggdG8gc2V0IHRoZSBgQ29tcG9uZW50YHMgZWxlbWVudCB0by4KICAgKgogICAqIEBwYXJhbSAge251bWJlcnxzdHJpbmd9IGhlaWdodAogICAqICAgICAgICAgSGVpZ2h0IHRvIHNldCB0aGUgYENvbXBvbmVudGBzIGVsZW1lbnQgdG8uCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmRpbWVuc2lvbnMgPSBmdW5jdGlvbiBkaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpIHsKICAgIC8vIFNraXAgY29tcG9uZW50cmVzaXplIGxpc3RlbmVycyBvbiB3aWR0aCBmb3Igb3B0aW1pemF0aW9uCiAgICB0aGlzLndpZHRoKHdpZHRoLCB0cnVlKTsKICAgIHRoaXMuaGVpZ2h0KGhlaWdodCk7CiAgfTsKCiAgLyoqCiAgICogR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGBDb21wb25lbnRgIGVsZW1lbnQuIFRoaXMgaXMgdGhlIHNoYXJlZCBjb2RlCiAgICogZm9yIHRoZSB7QGxpbmsgQ29tcG9uZW50I3dpZHRofSBhbmQge0BsaW5rIENvbXBvbmVudCNoZWlnaHR9LgogICAqCiAgICogVGhpbmdzIHRvIGtub3c6CiAgICogLSBJZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGluIGFuIG51bWJlciB0aGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgcG9zdGZpeGVkIHdpdGggJ3B4Jy4KICAgKiAtIElmIHRoZSB3aWR0aC9oZWlnaHQgaXMgYSBwZXJjZW50IHRoaXMgd2lsbCByZXR1cm4gdGhlIHBlcmNlbnQgcG9zdGZpeGVkIHdpdGggJyUnCiAgICogLSBIaWRkZW4gZWxlbWVudHMgaGF2ZSBhIHdpZHRoIG9mIDAgd2l0aCBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLiBUaGlzIGZ1bmN0aW9uCiAgICogICBkZWZhdWx0cyB0byB0aGUgYENvbXBvbmVudGBzIGBzdHlsZS53aWR0aGAgYW5kIGZhbGxzIGJhY2sgdG8gYHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlYC4KICAgKiAgIFNlZSBbdGhpc117QGxpbmsgaHR0cDovL3d3dy5mb2xpb3Rlay5jb20vZGV2YmxvZy9nZXR0aW5nLXRoZS13aWR0aC1vZi1hLWhpZGRlbi1lbGVtZW50LXdpdGgtanF1ZXJ5LXVzaW5nLXdpZHRoL30KICAgKiAgIGZvciBtb3JlIGluZm9ybWF0aW9uCiAgICogLSBJZiB5b3Ugd2FudCB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhlIGNvbXBvbmVudCwgdXNlIHtAbGluayBDb21wb25lbnQjY3VycmVudFdpZHRofQogICAqICAgYW5kIHtAbGluayB7Q29tcG9uZW50I2N1cnJlbnRIZWlnaHR9CiAgICoKICAgKiBAZmlyZXMgQ29tcG9uZW50I2NvbXBvbmVudHJlc2l6ZQogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoT3JIZWlnaHQKICAgOCAgICAgICAgJ3dpZHRoJyBvciAnaGVpZ2h0JwogICAqCiAgICogQHBhcmFtICB7bnVtYmVyfHN0cmluZ30gW251bV0KICAgOCAgICAgICAgIE5ldyBkaW1lbnNpb24KICAgKgogICAqIEBwYXJhbSAge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXQogICAqICAgICAgICAgU2tpcCBjb21wb25lbnRyZXNpemUgZXZlbnQgdHJpZ2dlcgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgVGhlIGRpbWVuc2lvbiB3aGVuIGdldHRpbmcgb3IgMCBpZiB1bnNldAogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbiBkaW1lbnNpb24od2lkdGhPckhlaWdodCwgbnVtLCBza2lwTGlzdGVuZXJzKSB7CiAgICBpZiAobnVtICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gU2V0IHRvIHplcm8gaWYgbnVsbCBvciBsaXRlcmFsbHkgTmFOIChOYU4gIT09IE5hTikKICAgICAgaWYgKG51bSA9PT0gbnVsbCB8fCBudW0gIT09IG51bSkgewogICAgICAgIG51bSA9IDA7CiAgICAgIH0KCiAgICAgIC8vIENoZWNrIGlmIHVzaW5nIGNzcyB3aWR0aC9oZWlnaHQgKCUgb3IgcHgpIGFuZCBhZGp1c3QKICAgICAgaWYgKCgnJyArIG51bSkuaW5kZXhPZignJScpICE9PSAtMSB8fCAoJycgKyBudW0pLmluZGV4T2YoJ3B4JykgIT09IC0xKSB7CiAgICAgICAgdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF0gPSBudW07CiAgICAgIH0gZWxzZSBpZiAobnVtID09PSAnYXV0bycpIHsKICAgICAgICB0aGlzLmVsXy5zdHlsZVt3aWR0aE9ySGVpZ2h0XSA9ICcnOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZWxfLnN0eWxlW3dpZHRoT3JIZWlnaHRdID0gbnVtICsgJ3B4JzsKICAgICAgfQoKICAgICAgLy8gc2tpcExpc3RlbmVycyBhbGxvd3MgdXMgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGUgcmVzaXplIGV2ZW50IHdoZW4gc2V0dGluZyBib3RoIHdpZHRoIGFuZCBoZWlnaHQKICAgICAgaWYgKCFza2lwTGlzdGVuZXJzKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb21wb25lbnQgaXMgcmVzaXplZC4KICAgICAgICAgKgogICAgICAgICAqIEBldmVudCBDb21wb25lbnQjY29tcG9uZW50cmVzaXplCiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgICAqLwogICAgICAgIHRoaXMudHJpZ2dlcignY29tcG9uZW50cmVzaXplJyk7CiAgICAgIH0KCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBOb3Qgc2V0dGluZyBhIHZhbHVlLCBzbyBnZXR0aW5nIGl0CiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudCBleGlzdHMKICAgIGlmICghdGhpcy5lbF8pIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gR2V0IGRpbWVuc2lvbiB2YWx1ZSBmcm9tIHN0eWxlCiAgICB2YXIgdmFsID0gdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF07CiAgICB2YXIgcHhJbmRleCA9IHZhbC5pbmRleE9mKCdweCcpOwoKICAgIGlmIChweEluZGV4ICE9PSAtMSkgewogICAgICAvLyBSZXR1cm4gdGhlIHBpeGVsIHZhbHVlIHdpdGggbm8gJ3B4JwogICAgICByZXR1cm4gcGFyc2VJbnQodmFsLnNsaWNlKDAsIHB4SW5kZXgpLCAxMCk7CiAgICB9CgogICAgLy8gTm8gcHggc28gdXNpbmcgJSBvciBubyBzdHlsZSB3YXMgc2V0LCBzbyBmYWxsaW5nIGJhY2sgdG8gb2Zmc2V0V2lkdGgvaGVpZ2h0CiAgICAvLyBJZiBjb21wb25lbnQgaGFzIGRpc3BsYXk6bm9uZSwgb2Zmc2V0IHdpbGwgcmV0dXJuIDAKICAgIC8vIFRPRE86IGhhbmRsZSBkaXNwbGF5Om5vbmUgYW5kIG5vIGRpbWVuc2lvbiBzdHlsZSB1c2luZyBweAogICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZWxfWydvZmZzZXQnICsgdG9UaXRsZUNhc2Uod2lkdGhPckhlaWdodCldLCAxMCk7CiAgfTsKCiAgLyoqCiAgICogR2V0IHRoZSB3aWR0aCBvciB0aGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YCBlbGVtZW50cyBjb21wdXRlZCBzdHlsZS4gVXNlcwogICAqIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhPckhlaWdodAogICAqICAgICAgICBBIHN0cmluZyBjb250YWluaW5nICd3aWR0aCcgb3IgJ2hlaWdodCcuIFdoaWNoZXZlciBvbmUgeW91IHdhbnQgdG8gZ2V0LgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgVGhlIGRpbWVuc2lvbiB0aGF0IGdldHMgYXNrZWQgZm9yIG9yIDAgaWYgbm90aGluZyB3YXMgc2V0CiAgICogICAgICAgICBmb3IgdGhhdCBkaW1lbnNpb24uCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmN1cnJlbnREaW1lbnNpb24gPSBmdW5jdGlvbiBjdXJyZW50RGltZW5zaW9uKHdpZHRoT3JIZWlnaHQpIHsKICAgIHZhciBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSAwOwoKICAgIGlmICh3aWR0aE9ySGVpZ2h0ICE9PSAnd2lkdGgnICYmIHdpZHRoT3JIZWlnaHQgIT09ICdoZWlnaHQnKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignY3VycmVudERpbWVuc2lvbiBvbmx5IGFjY2VwdHMgd2lkdGggb3IgaGVpZ2h0IHZhbHVlJyk7CiAgICB9CgogICAgaWYgKHR5cGVvZiB3aW5kb3dfMS5nZXRDb21wdXRlZFN0eWxlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93XzEuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsXyk7CgogICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUod2lkdGhPckhlaWdodCkgfHwgY29tcHV0ZWRTdHlsZVt3aWR0aE9ySGVpZ2h0XTsKICAgIH0KCiAgICAvLyByZW1vdmUgJ3B4JyBmcm9tIHZhcmlhYmxlIGFuZCBwYXJzZSBhcyBpbnRlZ2VyCiAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkV2lkdGhPckhlaWdodCk7CgogICAgLy8gaWYgdGhlIGNvbXB1dGVkIHZhbHVlIGlzIHN0aWxsIDAsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgYnJvd3NlciBpcyBseWluZwogICAgLy8gYW5kIHdlIHdhbnQgdG8gY2hlY2sgdGhlIG9mZnNldCB2YWx1ZXMuCiAgICAvLyBUaGlzIGNvZGUgYWxzbyBydW5zIG9uIElFOCBhbmQgd2hlcmV2ZXIgZ2V0Q29tcHV0ZWRTdHlsZSBkb2Vzbid0IGV4aXN0LgogICAgaWYgKGNvbXB1dGVkV2lkdGhPckhlaWdodCA9PT0gMCkgewogICAgICB2YXIgcnVsZSA9ICdvZmZzZXQnICsgdG9UaXRsZUNhc2Uod2lkdGhPckhlaWdodCk7CgogICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSB0aGlzLmVsX1tydWxlXTsKICAgIH0KCiAgICByZXR1cm4gY29tcHV0ZWRXaWR0aE9ySGVpZ2h0OwogIH07CgogIC8qKgogICAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIG9mIHRoZSBgQ29tcG9uZW50YHMKICAgKiBjb21wdXRlZCBzdHlsZS4gVXNlcyBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLgogICAqCiAgICogQHR5cGVkZWYge09iamVjdH0gQ29tcG9uZW50fkRpbWVuc2lvbk9iamVjdAogICAqCiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoCiAgICogICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgYENvbXBvbmVudGBzIGNvbXB1dGVkIHN0eWxlLgogICAqCiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodAogICAqICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YHMgY29tcHV0ZWQgc3R5bGUuCiAgICovCgogIC8qKgogICAqIEdldCBhbiBvYmplY3QgdGhhdCBjb250YWlucyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBvZiB0aGUgYENvbXBvbmVudGBzCiAgICogY29tcHV0ZWQgc3R5bGUuCiAgICoKICAgKiBAcmV0dXJuIHtDb21wb25lbnR+RGltZW5zaW9uT2JqZWN0fQogICAqICAgICAgICAgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGNvbXBvbmVudHMgZWxlbWVudAogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5jdXJyZW50RGltZW5zaW9ucyA9IGZ1bmN0aW9uIGN1cnJlbnREaW1lbnNpb25zKCkgewogICAgcmV0dXJuIHsKICAgICAgd2lkdGg6IHRoaXMuY3VycmVudERpbWVuc2lvbignd2lkdGgnKSwKICAgICAgaGVpZ2h0OiB0aGlzLmN1cnJlbnREaW1lbnNpb24oJ2hlaWdodCcpCiAgICB9OwogIH07CgogIC8qKgogICAqIEdldCB0aGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS4gVXNlcyBgd2luZG93LmdldENvbXB1dGVkU3R5bGVgLgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfSB3aWR0aAogICAqICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIGBDb21wb25lbnRgcyBjb21wdXRlZCBzdHlsZS4KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuY3VycmVudFdpZHRoID0gZnVuY3Rpb24gY3VycmVudFdpZHRoKCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudERpbWVuc2lvbignd2lkdGgnKTsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIGhlaWdodCBvZiB0aGUgYENvbXBvbmVudGBzIGNvbXB1dGVkIHN0eWxlLiBVc2VzIGB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZWAuCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9IGhlaWdodAogICAqICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBgQ29tcG9uZW50YHMgY29tcHV0ZWQgc3R5bGUuCiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmN1cnJlbnRIZWlnaHQgPSBmdW5jdGlvbiBjdXJyZW50SGVpZ2h0KCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudERpbWVuc2lvbignaGVpZ2h0Jyk7CiAgfTsKCiAgLyoqCiAgICogU2V0IHRoZSBmb2N1cyB0byB0aGlzIGNvbXBvbmVudAogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkgewogICAgdGhpcy5lbF8uZm9jdXMoKTsKICB9OwoKICAvKioKICAgKiBSZW1vdmUgdGhlIGZvY3VzIGZyb20gdGhpcyBjb21wb25lbnQKICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uIGJsdXIoKSB7CiAgICB0aGlzLmVsXy5ibHVyKCk7CiAgfTsKCiAgLyoqCiAgICogRW1pdCBhICd0YXAnIGV2ZW50cyB3aGVuIHRvdWNoIGV2ZW50IHN1cHBvcnQgZ2V0cyBkZXRlY3RlZC4gVGhpcyBnZXRzIHVzZWQgdG8KICAgKiBzdXBwb3J0IHRvZ2dsaW5nIHRoZSBjb250cm9scyB0aHJvdWdoIGEgdGFwIG9uIHRoZSB2aWRlby4gVGhleSBnZXQgZW5hYmxlZAogICAqIGJlY2F1c2UgZXZlcnkgc3ViLWNvbXBvbmVudCB3b3VsZCBoYXZlIGV4dHJhIG92ZXJoZWFkIG90aGVyd2lzZS4KICAgKgogICAqIEBwcml2YXRlCiAgICogQGZpcmVzIENvbXBvbmVudCN0YXAKICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2hzdGFydAogICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaG1vdmUKICAgKiBAbGlzdGVucyBDb21wb25lbnQjdG91Y2hsZWF2ZQogICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGNhbmNlbAogICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGVuZAogICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuZW1pdFRhcEV2ZW50cyA9IGZ1bmN0aW9uIGVtaXRUYXBFdmVudHMoKSB7CiAgICAvLyBUcmFjayB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGhvdyBsb25nIHRoZSB0b3VjaCBsYXN0ZWQKICAgIHZhciB0b3VjaFN0YXJ0ID0gMDsKICAgIHZhciBmaXJzdFRvdWNoID0gbnVsbDsKCiAgICAvLyBNYXhpbXVtIG1vdmVtZW50IGFsbG93ZWQgZHVyaW5nIGEgdG91Y2ggZXZlbnQgdG8gc3RpbGwgYmUgY29uc2lkZXJlZCBhIHRhcAogICAgLy8gT3RoZXIgcG9wdWxhciBsaWJzIHVzZSBhbnl3aGVyZSBmcm9tIDIgKGhhbW1lci5qcykgdG8gMTUsCiAgICAvLyBzbyAxMCBzZWVtcyBsaWtlIGEgbmljZSwgcm91bmQgbnVtYmVyLgogICAgdmFyIHRhcE1vdmVtZW50VGhyZXNob2xkID0gMTA7CgogICAgLy8gVGhlIG1heGltdW0gbGVuZ3RoIGEgdG91Y2ggY2FuIGJlIHdoaWxlIHN0aWxsIGJlaW5nIGNvbnNpZGVyZWQgYSB0YXAKICAgIHZhciB0b3VjaFRpbWVUaHJlc2hvbGQgPSAyMDA7CgogICAgdmFyIGNvdWxkQmVUYXAgPSB2b2lkIDA7CgogICAgdGhpcy5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGZpbmdlciwgZG9uJ3QgY29uc2lkZXIgdHJlYXRpbmcgdGhpcyBhcyBhIGNsaWNrCiAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgIC8vIENvcHkgcGFnZVgvcGFnZVkgZnJvbSB0aGUgb2JqZWN0CiAgICAgICAgZmlyc3RUb3VjaCA9IHsKICAgICAgICAgIHBhZ2VYOiBldmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgICAgcGFnZVk6IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkKICAgICAgICB9OwogICAgICAgIC8vIFJlY29yZCBzdGFydCB0aW1lIHNvIHdlIGNhbiBkZXRlY3QgYSB0YXAgdnMuICJ0b3VjaCBhbmQgaG9sZCIKICAgICAgICB0b3VjaFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgLy8gUmVzZXQgY291bGRCZVRhcCB0cmFja2luZwogICAgICAgIGNvdWxkQmVUYXAgPSB0cnVlOwogICAgICB9CiAgICB9KTsKCiAgICB0aGlzLm9uKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBmaW5nZXIsIGRvbid0IGNvbnNpZGVyIHRyZWF0aW5nIHRoaXMgYXMgYSBjbGljawogICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxKSB7CiAgICAgICAgY291bGRCZVRhcCA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKGZpcnN0VG91Y2gpIHsKICAgICAgICAvLyBTb21lIGRldmljZXMgd2lsbCB0aHJvdyB0b3VjaG1vdmVzIGZvciBhbGwgYnV0IHRoZSBzbGlnaHRlc3Qgb2YgdGFwcy4KICAgICAgICAvLyBTbywgaWYgd2UgbW92ZWQgb25seSBhIHNtYWxsIGRpc3RhbmNlLCB0aGlzIGNvdWxkIHN0aWxsIGJlIGEgdGFwCiAgICAgICAgdmFyIHhkaWZmID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWCAtIGZpcnN0VG91Y2gucGFnZVg7CiAgICAgICAgdmFyIHlkaWZmID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGZpcnN0VG91Y2gucGFnZVk7CiAgICAgICAgdmFyIHRvdWNoRGlzdGFuY2UgPSBNYXRoLnNxcnQoeGRpZmYgKiB4ZGlmZiArIHlkaWZmICogeWRpZmYpOwoKICAgICAgICBpZiAodG91Y2hEaXN0YW5jZSA+IHRhcE1vdmVtZW50VGhyZXNob2xkKSB7CiAgICAgICAgICBjb3VsZEJlVGFwID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICB2YXIgbm9UYXAgPSBmdW5jdGlvbiBub1RhcCgpIHsKICAgICAgY291bGRCZVRhcCA9IGZhbHNlOwogICAgfTsKCiAgICAvLyBUT0RPOiBMaXN0ZW4gdG8gdGhlIG9yaWdpbmFsIHRhcmdldC4gaHR0cDovL3lvdXR1LmJlL0R1amZwWE9LVXA4P3Q9MTNtOHMKICAgIHRoaXMub24oJ3RvdWNobGVhdmUnLCBub1RhcCk7CiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIG5vVGFwKTsKCiAgICAvLyBXaGVuIHRoZSB0b3VjaCBlbmRzLCBtZWFzdXJlIGhvdyBsb25nIGl0IHRvb2sgYW5kIHRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlCiAgICAvLyBldmVudAogICAgdGhpcy5vbigndG91Y2hlbmQnLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgZmlyc3RUb3VjaCA9IG51bGw7CiAgICAgIC8vIFByb2NlZWQgb25seSBpZiB0aGUgdG91Y2htb3ZlL2xlYXZlL2NhbmNlbCBldmVudCBkaWRuJ3QgaGFwcGVuCiAgICAgIGlmIChjb3VsZEJlVGFwID09PSB0cnVlKSB7CiAgICAgICAgLy8gTWVhc3VyZSBob3cgbG9uZyB0aGUgdG91Y2ggbGFzdGVkCiAgICAgICAgdmFyIHRvdWNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdG91Y2hTdGFydDsKCiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0b3VjaCB3YXMgbGVzcyB0aGFuIHRoZSB0aHJlc2hvbGQgdG8gYmUgY29uc2lkZXJlZCBhIHRhcAogICAgICAgIGlmICh0b3VjaFRpbWUgPCB0b3VjaFRpbWVUaHJlc2hvbGQpIHsKICAgICAgICAgIC8vIERvbid0IGxldCBicm93c2VyIHR1cm4gdGhpcyBpbnRvIGEgY2xpY2sKICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgYENvbXBvbmVudGAgaXMgdGFwcGVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBldmVudCBDb21wb25lbnQjdGFwCiAgICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAgICAgKi8KICAgICAgICAgIHRoaXMudHJpZ2dlcigndGFwJyk7CiAgICAgICAgICAvLyBJdCBtYXkgYmUgZ29vZCB0byBjb3B5IHRoZSB0b3VjaGVuZCBldmVudCBvYmplY3QgYW5kIGNoYW5nZSB0aGUKICAgICAgICAgIC8vIHR5cGUgdG8gdGFwLCBpZiB0aGUgb3RoZXIgZXZlbnQgcHJvcGVydGllcyBhcmVuJ3QgZXhhY3QgYWZ0ZXIKICAgICAgICAgIC8vIEV2ZW50cy5maXhFdmVudCBydW5zIChlLmcuIGV2ZW50LnRhcmdldCkKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH07CgogIC8qKgogICAqIFRoaXMgZnVuY3Rpb24gcmVwb3J0cyB1c2VyIGFjdGl2aXR5IHdoZW5ldmVyIHRvdWNoIGV2ZW50cyBoYXBwZW4uIFRoaXMgY2FuIGdldAogICAqIHR1cm5lZCBvZmYgYnkgYW55IHN1Yi1jb21wb25lbnRzIHRoYXQgd2FudHMgdG91Y2ggZXZlbnRzIHRvIGFjdCBhbm90aGVyIHdheS4KICAgKgogICAqIFJlcG9ydCB1c2VyIHRvdWNoIGFjdGl2aXR5IHdoZW4gdG91Y2ggZXZlbnRzIG9jY3VyLiBVc2VyIGFjdGl2aXR5IGdldHMgdXNlZCB0bwogICAqIGRldGVybWluZSB3aGVuIGNvbnRyb2xzIHNob3VsZCBzaG93L2hpZGUuIEl0IGlzIHNpbXBsZSB3aGVuIGl0IGNvbWVzIHRvIG1vdXNlCiAgICogZXZlbnRzLCBiZWNhdXNlIGFueSBtb3VzZSBldmVudCBzaG91bGQgc2hvdyB0aGUgY29udHJvbHMuIFNvIHdlIGNhcHR1cmUgbW91c2UKICAgKiBldmVudHMgdGhhdCBidWJibGUgdXAgdG8gdGhlIHBsYXllciBhbmQgcmVwb3J0IGFjdGl2aXR5IHdoZW4gdGhhdCBoYXBwZW5zLgogICAqIFdpdGggdG91Y2ggZXZlbnRzIGl0IGlzbid0IGFzIGVhc3kgYXMgYHRvdWNoc3RhcnRgIGFuZCBgdG91Y2hlbmRgIHRvZ2dsZSBwbGF5ZXIKICAgKiBjb250cm9scy4gU28gdG91Y2ggZXZlbnRzIGNhbid0IGhlbHAgdXMgYXQgdGhlIHBsYXllciBsZXZlbCBlaXRoZXIuCiAgICoKICAgKiBVc2VyIGFjdGl2aXR5IGdldHMgY2hlY2tlZCBhc3luY2hyb25vdXNseS4gU28gd2hhdCBjb3VsZCBoYXBwZW4gaXMgYSB0YXAgZXZlbnQKICAgKiBvbiB0aGUgdmlkZW8gdHVybnMgdGhlIGNvbnRyb2xzIG9mZi4gVGhlbiB0aGUgYHRvdWNoZW5kYCBldmVudCBidWJibGVzIHVwIHRvCiAgICogdGhlIHBsYXllci4gV2hpY2gsIGlmIGl0IHJlcG9ydGVkIHVzZXIgYWN0aXZpdHksIHdvdWxkIHR1cm4gdGhlIGNvbnRyb2xzIHJpZ2h0CiAgICogYmFjayBvbi4gV2UgYWxzbyBkb24ndCB3YW50IHRvIGNvbXBsZXRlbHkgYmxvY2sgdG91Y2ggZXZlbnRzIGZyb20gYnViYmxpbmcgdXAuCiAgICogRnVydGhlcm1vcmUgYSBgdG91Y2htb3ZlYCBldmVudCBhbmQgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHRhcCwgc2hvdWxkIG5vdCB0dXJuCiAgICogY29udHJvbHMgYmFjayBvbi4KICAgKgogICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaHN0YXJ0CiAgICogQGxpc3RlbnMgQ29tcG9uZW50I3RvdWNobW92ZQogICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGVuZAogICAqIEBsaXN0ZW5zIENvbXBvbmVudCN0b3VjaGNhbmNlbAogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5lbmFibGVUb3VjaEFjdGl2aXR5ID0gZnVuY3Rpb24gZW5hYmxlVG91Y2hBY3Rpdml0eSgpIHsKICAgIC8vIERvbid0IGNvbnRpbnVlIGlmIHRoZSByb290IHBsYXllciBkb2Vzbid0IHN1cHBvcnQgcmVwb3J0aW5nIHVzZXIgYWN0aXZpdHkKICAgIGlmICghdGhpcy5wbGF5ZXIoKSB8fCAhdGhpcy5wbGF5ZXIoKS5yZXBvcnRVc2VyQWN0aXZpdHkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIGxpc3RlbmVyIGZvciByZXBvcnRpbmcgdGhhdCB0aGUgdXNlciBpcyBhY3RpdmUKICAgIHZhciByZXBvcnQgPSBiaW5kKHRoaXMucGxheWVyKCksIHRoaXMucGxheWVyKCkucmVwb3J0VXNlckFjdGl2aXR5KTsKCiAgICB2YXIgdG91Y2hIb2xkaW5nID0gdm9pZCAwOwoKICAgIHRoaXMub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJlcG9ydCgpOwogICAgICAvLyBGb3IgYXMgbG9uZyBhcyB0aGUgdGhleSBhcmUgdG91Y2hpbmcgdGhlIGRldmljZSBvciBoYXZlIHRoZWlyIG1vdXNlIGRvd24sCiAgICAgIC8vIHdlIGNvbnNpZGVyIHRoZW0gYWN0aXZlIGV2ZW4gaWYgdGhleSdyZSBub3QgbW92aW5nIHRoZWlyIGZpbmdlciBvciBtb3VzZS4KICAgICAgLy8gU28gd2Ugd2FudCB0byBjb250aW51ZSB0byB1cGRhdGUgdGhhdCB0aGV5IGFyZSBhY3RpdmUKICAgICAgdGhpcy5jbGVhckludGVydmFsKHRvdWNoSG9sZGluZyk7CiAgICAgIC8vIHJlcG9ydCBhdCB0aGUgc2FtZSBpbnRlcnZhbCBhcyBhY3Rpdml0eUNoZWNrCiAgICAgIHRvdWNoSG9sZGluZyA9IHRoaXMuc2V0SW50ZXJ2YWwocmVwb3J0LCAyNTApOwogICAgfSk7CgogICAgdmFyIHRvdWNoRW5kID0gZnVuY3Rpb24gdG91Y2hFbmQoZXZlbnQpIHsKICAgICAgcmVwb3J0KCk7CiAgICAgIC8vIHN0b3AgdGhlIGludGVydmFsIHRoYXQgbWFpbnRhaW5zIGFjdGl2aXR5IGlmIHRoZSB0b3VjaCBpcyBob2xkaW5nCiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0b3VjaEhvbGRpbmcpOwogICAgfTsKCiAgICB0aGlzLm9uKCd0b3VjaG1vdmUnLCByZXBvcnQpOwogICAgdGhpcy5vbigndG91Y2hlbmQnLCB0b3VjaEVuZCk7CiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIHRvdWNoRW5kKTsKICB9OwoKICAvKioKICAgKiBBIGNhbGxiYWNrIHRoYXQgaGFzIG5vIHBhcmFtZXRlcnMgYW5kIGlzIGJvdW5kIGludG8gYENvbXBvbmVudGBzIGNvbnRleHQuCiAgICoKICAgKiBAY2FsbGJhY2sgQ29tcG9uZW50fkdlbmVyaWNDYWxsYmFjawogICAqIEB0aGlzIENvbXBvbmVudAogICAqLwoKICAvKioKICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBydW5zIGFmdGVyIGFuIGB4YCBtaWxsaXNlY29uZCB0aW1lb3V0LiBUaGlzIGZ1bmN0aW9uIGlzIGEKICAgKiB3cmFwcGVyIGFyb3VuZCBgd2luZG93LnNldFRpbWVvdXRgLiBUaGVyZSBhcmUgYSBmZXcgcmVhc29ucyB0byB1c2UgdGhpcyBvbmUKICAgKiBpbnN0ZWFkIHRob3VnaDoKICAgKiAxLiBJdCBnZXRzIGNsZWFyZWQgdmlhICB7QGxpbmsgQ29tcG9uZW50I2NsZWFyVGltZW91dH0gd2hlbgogICAqICAgIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0gZ2V0cyBjYWxsZWQuCiAgICogMi4gVGhlIGZ1bmN0aW9uIGNhbGxiYWNrIHdpbGwgZ2V0cyB0dXJuZWQgaW50byBhIHtAbGluayBDb21wb25lbnR+R2VuZXJpY0NhbGxiYWNrfQogICAqCiAgICogPiBOb3RlOiBZb3UgY2FuIHVzZSBgd2luZG93LmNsZWFyVGltZW91dGAgb24gdGhlIGlkIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRoaXMKICAgKiAgICAgICAgIHdpbGwgY2F1c2UgaXRzIGRpc3Bvc2UgbGlzdGVuZXIgbm90IHRvIGdldCBjbGVhbmVkIHVwISBQbGVhc2UgdXNlCiAgICogICAgICAgICB7QGxpbmsgQ29tcG9uZW50I2NsZWFyVGltZW91dH0gb3Ige0BsaW5rIENvbXBvbmVudCNkaXNwb3NlfS4KICAgKgogICAqIEBwYXJhbSB7Q29tcG9uZW50fkdlbmVyaWNDYWxsYmFja30gZm4KICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBydW4gYWZ0ZXIgYHRpbWVvdXRgLgogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQKICAgKiAgICAgICAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIGV4ZWN1dGluZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgUmV0dXJucyBhIHRpbWVvdXQgSUQgdGhhdCBnZXRzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRpbWVvdXQuIEl0IGNhbiBhbHNvCiAgICogICAgICAgICBnZXQgdXNlZCBpbiB7QGxpbmsgQ29tcG9uZW50I2NsZWFyVGltZW91dH0gdG8gY2xlYXIgdGhlIHRpbWVvdXQgdGhhdAogICAqICAgICAgICAgd2FzIHNldC4KICAgKgogICAqIEBsaXN0ZW5zIENvbXBvbmVudCNkaXNwb3NlCiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd1RpbWVycy9zZXRUaW1lb3V0fQogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0VGltZW91dChmbiwgdGltZW91dCkgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgZm4gPSBiaW5kKHRoaXMsIGZuKTsKCiAgICB2YXIgdGltZW91dElkID0gd2luZG93XzEuc2V0VGltZW91dChmbiwgdGltZW91dCk7CiAgICB2YXIgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkgewogICAgICByZXR1cm4gX3RoaXMyLmNsZWFyVGltZW91dCh0aW1lb3V0SWQpOwogICAgfTsKCiAgICBkaXNwb3NlRm4uZ3VpZCA9ICd2anMtdGltZW91dC0nICsgdGltZW91dElkOwoKICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pOwoKICAgIHJldHVybiB0aW1lb3V0SWQ7CiAgfTsKCiAgLyoqCiAgICogQ2xlYXJzIGEgdGltZW91dCB0aGF0IGdldHMgY3JlYXRlZCB2aWEgYHdpbmRvdy5zZXRUaW1lb3V0YCBvcgogICAqIHtAbGluayBDb21wb25lbnQjc2V0VGltZW91dH0uIElmIHlvdSBzZXQgYSB0aW1lb3V0IHZpYSB7QGxpbmsgQ29tcG9uZW50I3NldFRpbWVvdXR9CiAgICogdXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBgd2luZG93LmNsZWFyVGltb3V0YC4gSWYgeW91IGRvbid0IHlvdXIgZGlzcG9zZQogICAqIGxpc3RlbmVyIHdpbGwgbm90IGdldCBjbGVhbmVkIHVwIHVudGlsIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0hCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dElkCiAgICogICAgICAgIFRoZSBpZCBvZiB0aGUgdGltZW91dCB0byBjbGVhci4gVGhlIHJldHVybiB2YWx1ZSBvZgogICAqICAgICAgICB7QGxpbmsgQ29tcG9uZW50I3NldFRpbWVvdXR9IG9yIGB3aW5kb3cuc2V0VGltZW91dGAuCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBSZXR1cm5zIHRoZSB0aW1lb3V0IGlkIHRoYXQgd2FzIGNsZWFyZWQuCiAgICoKICAgKiBAc2VlIFtTaW1pbGFyIHRvXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93VGltZXJzL2NsZWFyVGltZW91dH0KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCkgewogICAgd2luZG93XzEuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CgogICAgdmFyIGRpc3Bvc2VGbiA9IGZ1bmN0aW9uIGRpc3Bvc2VGbigpIHt9OwoKICAgIGRpc3Bvc2VGbi5ndWlkID0gJ3Zqcy10aW1lb3V0LScgKyB0aW1lb3V0SWQ7CgogICAgdGhpcy5vZmYoJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pOwoKICAgIHJldHVybiB0aW1lb3V0SWQ7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBydW4gZXZlcnkgYHhgIG1pbGxpc2Vjb25kcy4gVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIKICAgKiBhcm91bmQgYHdpbmRvdy5zZXRJbnRlcnZhbGAuIFRoZXJlIGFyZSBhIGZldyByZWFzb25zIHRvIHVzZSB0aGlzIG9uZSBpbnN0ZWFkIHRob3VnaC4KICAgKiAxLiBJdCBnZXRzIGNsZWFyZWQgdmlhICB7QGxpbmsgQ29tcG9uZW50I2NsZWFySW50ZXJ2YWx9IHdoZW4KICAgKiAgICB7QGxpbmsgQ29tcG9uZW50I2Rpc3Bvc2V9IGdldHMgY2FsbGVkLgogICAqIDIuIFRoZSBmdW5jdGlvbiBjYWxsYmFjayB3aWxsIGJlIGEge0BsaW5rIENvbXBvbmVudH5HZW5lcmljQ2FsbGJhY2t9CiAgICoKICAgKiBAcGFyYW0ge0NvbXBvbmVudH5HZW5lcmljQ2FsbGJhY2t9IGZuCiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBydW4gZXZlcnkgYHhgIHNlY29uZHMuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWwKICAgKiAgICAgICAgRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGV2ZXJ5IGB4YCBtaWxsaXNlY29uZHMuCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBSZXR1cm5zIGFuIGlkIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGludGVydmFsLiBJdCBjYW4gYWxzbyBiZSBiZSB1c2VkIGluCiAgICogICAgICAgICB7QGxpbmsgQ29tcG9uZW50I2NsZWFySW50ZXJ2YWx9IHRvIGNsZWFyIHRoZSBpbnRlcnZhbC4KICAgKgogICAqIEBsaXN0ZW5zIENvbXBvbmVudCNkaXNwb3NlCiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd1RpbWVycy9zZXRJbnRlcnZhbH0KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiBzZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpIHsKICAgIHZhciBfdGhpczMgPSB0aGlzOwoKICAgIGZuID0gYmluZCh0aGlzLCBmbik7CgogICAgdmFyIGludGVydmFsSWQgPSB3aW5kb3dfMS5zZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpOwoKICAgIHZhciBkaXNwb3NlRm4gPSBmdW5jdGlvbiBkaXNwb3NlRm4oKSB7CiAgICAgIHJldHVybiBfdGhpczMuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTsKICAgIH07CgogICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLWludGVydmFsLScgKyBpbnRlcnZhbElkOwoKICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pOwoKICAgIHJldHVybiBpbnRlcnZhbElkOwogIH07CgogIC8qKgogICAqIENsZWFycyBhbiBpbnRlcnZhbCB0aGF0IGdldHMgY3JlYXRlZCB2aWEgYHdpbmRvdy5zZXRJbnRlcnZhbGAgb3IKICAgKiB7QGxpbmsgQ29tcG9uZW50I3NldEludGVydmFsfS4gSWYgeW91IHNldCBhbiBpbnRldmFsIHZpYSB7QGxpbmsgQ29tcG9uZW50I3NldEludGVydmFsfQogICAqIHVzZSB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgYHdpbmRvdy5jbGVhckludGVydmFsYC4gSWYgeW91IGRvbid0IHlvdXIgZGlzcG9zZQogICAqIGxpc3RlbmVyIHdpbGwgbm90IGdldCBjbGVhbmVkIHVwIHVudGlsIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0hCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWxJZAogICAqICAgICAgICBUaGUgaWQgb2YgdGhlIGludGVydmFsIHRvIGNsZWFyLiBUaGUgcmV0dXJuIHZhbHVlIG9mCiAgICogICAgICAgIHtAbGluayBDb21wb25lbnQjc2V0SW50ZXJ2YWx9IG9yIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgUmV0dXJucyB0aGUgaW50ZXJ2YWwgaWQgdGhhdCB3YXMgY2xlYXJlZC4KICAgKgogICAqIEBzZWUgW1NpbWlsYXIgdG9de0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3dUaW1lcnMvY2xlYXJJbnRlcnZhbH0KICAgKi8KCgogIENvbXBvbmVudC5wcm90b3R5cGUuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCkgewogICAgd2luZG93XzEuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTsKCiAgICB2YXIgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge307CgogICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLWludGVydmFsLScgKyBpbnRlcnZhbElkOwoKICAgIHRoaXMub2ZmKCdkaXNwb3NlJywgZGlzcG9zZUZuKTsKCiAgICByZXR1cm4gaW50ZXJ2YWxJZDsKICB9OwoKICAvKioKICAgKiBRdWV1ZXMgdXAgYSBjYWxsYmFjayB0byBiZSBwYXNzZWQgdG8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIChyQUYpLCBidXQKICAgKiB3aXRoIGEgZmV3IGV4dHJhIGJvbnVzZXM6CiAgICoKICAgKiAtIFN1cHBvcnRzIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgckFGIGJ5IGZhbGxpbmcgYmFjayB0bwogICAqICAge0BsaW5rIENvbXBvbmVudCNzZXRUaW1lb3V0fS4KICAgKgogICAqIC0gVGhlIGNhbGxiYWNrIGlzIHR1cm5lZCBpbnRvIGEge0BsaW5rIENvbXBvbmVudH5HZW5lcmljQ2FsbGJhY2t9IChpLmUuCiAgICogICBib3VuZCB0byB0aGUgY29tcG9uZW50KS4KICAgKgogICAqIC0gQXV0b21hdGljIGNhbmNlbGxhdGlvbiBvZiB0aGUgckFGIGNhbGxiYWNrIGlzIGhhbmRsZWQgaWYgdGhlIGNvbXBvbmVudAogICAqICAgaXMgZGlzcG9zZWQgYmVmb3JlIGl0IGlzIGNhbGxlZC4KICAgKgogICAqIEBwYXJhbSAge0NvbXBvbmVudH5HZW5lcmljQ2FsbGJhY2t9IGZuCiAgICogICAgICAgICBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBib3VuZCB0byB0aGlzIGNvbXBvbmVudCBhbmQgZXhlY3V0ZWQganVzdAogICAqICAgICAgICAgYmVmb3JlIHRoZSBicm93c2VyJ3MgbmV4dCByZXBhaW50LgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgUmV0dXJucyBhbiByQUYgSUQgdGhhdCBnZXRzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRpbWVvdXQuIEl0IGNhbgogICAqICAgICAgICAgYWxzbyBiZSB1c2VkIGluIHtAbGluayBDb21wb25lbnQjY2FuY2VsQW5pbWF0aW9uRnJhbWV9IHRvIGNhbmNlbAogICAqICAgICAgICAgdGhlIGFuaW1hdGlvbiBmcmFtZSBjYWxsYmFjay4KICAgKgogICAqIEBsaXN0ZW5zIENvbXBvbmVudCNkaXNwb3NlCiAgICogQHNlZSBbU2ltaWxhciB0b117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWV9CiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbikgewogICAgdmFyIF90aGlzNCA9IHRoaXM7CgogICAgaWYgKHRoaXMuc3VwcG9ydHNSYWZfKSB7CiAgICAgIGZuID0gYmluZCh0aGlzLCBmbik7CgogICAgICB2YXIgaWQgPSB3aW5kb3dfMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICB2YXIgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkgewogICAgICAgIHJldHVybiBfdGhpczQuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICB9OwoKICAgICAgZGlzcG9zZUZuLmd1aWQgPSAndmpzLXJhZi0nICsgaWQ7CiAgICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBkaXNwb3NlRm4pOwoKICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIC8vIEZhbGwgYmFjayB0byB1c2luZyBhIHRpbWVyLgogICAgcmV0dXJuIHRoaXMuc2V0VGltZW91dChmbiwgMTAwMCAvIDYwKTsKICB9OwoKICAvKioKICAgKiBDYW5jZWxzIGEgcXVldWVkIGNhbGxiYWNrIHBhc3NlZCB0byB7QGxpbmsgQ29tcG9uZW50I3JlcXVlc3RBbmltYXRpb25GcmFtZX0KICAgKiAockFGKS4KICAgKgogICAqIElmIHlvdSBxdWV1ZSBhbiByQUYgY2FsbGJhY2sgdmlhIHtAbGluayBDb21wb25lbnQjcmVxdWVzdEFuaW1hdGlvbkZyYW1lfSwKICAgKiB1c2UgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkIG9mIGB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWVgLiBJZiB5b3UgZG9uJ3QsCiAgICogeW91ciBkaXNwb3NlIGxpc3RlbmVyIHdpbGwgbm90IGdldCBjbGVhbmVkIHVwIHVudGlsIHtAbGluayBDb21wb25lbnQjZGlzcG9zZX0hCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gaWQKICAgKiAgICAgICAgVGhlIHJBRiBJRCB0byBjbGVhci4gVGhlIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgQ29tcG9uZW50I3JlcXVlc3RBbmltYXRpb25GcmFtZX0uCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBSZXR1cm5zIHRoZSByQUYgSUQgdGhhdCB3YXMgY2xlYXJlZC4KICAgKgogICAqIEBzZWUgW1NpbWlsYXIgdG9de0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvY2FuY2VsQW5pbWF0aW9uRnJhbWV9CiAgICovCgoKICBDb21wb25lbnQucHJvdG90eXBlLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpIHsKICAgIGlmICh0aGlzLnN1cHBvcnRzUmFmXykgewogICAgICB3aW5kb3dfMS5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7CgogICAgICB2YXIgZGlzcG9zZUZuID0gZnVuY3Rpb24gZGlzcG9zZUZuKCkge307CgogICAgICBkaXNwb3NlRm4uZ3VpZCA9ICd2anMtcmFmLScgKyBpZDsKCiAgICAgIHRoaXMub2ZmKCdkaXNwb3NlJywgZGlzcG9zZUZuKTsKCiAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICAvLyBGYWxsIGJhY2sgdG8gdXNpbmcgYSB0aW1lci4KICAgIHJldHVybiB0aGlzLmNsZWFyVGltZW91dChpZCk7CiAgfTsKCiAgLyoqCiAgICogUmVnaXN0ZXIgYSBgQ29tcG9uZW50YCB3aXRoIGB2aWRlb2pzYCBnaXZlbiB0aGUgbmFtZSBhbmQgdGhlIGNvbXBvbmVudC4KICAgKgogICAqID4gTk9URToge0BsaW5rIFRlY2h9cyBzaG91bGQgbm90IGJlIHJlZ2lzdGVyZWQgYXMgYSBgQ29tcG9uZW50YC4ge0BsaW5rIFRlY2h9cwogICAqICAgICAgICAgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rIFRlY2gucmVnaXN0ZXJUZWNofSBvcgogICAqICAgICAgICAge0BsaW5rIHZpZGVvanM6dmlkZW9qcy5yZWdpc3RlclRlY2h9LgogICAqCiAgICogPiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIHNlZW4gb24gdmlkZW9qcyBhcwogICAqICAgICAgICAge0BsaW5rIHZpZGVvanM6dmlkZW9qcy5yZWdpc3RlckNvbXBvbmVudH0uCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogICAqICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYENvbXBvbmVudGAgdG8gcmVnaXN0ZXIuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gQ29tcG9uZW50VG9SZWdpc3RlcgogICAqICAgICAgICBUaGUgYENvbXBvbmVudGAgY2xhc3MgdG8gcmVnaXN0ZXIuCiAgICoKICAgKiBAcmV0dXJuIHtDb21wb25lbnR9CiAgICogICAgICAgICBUaGUgYENvbXBvbmVudGAgdGhhdCB3YXMgcmVnaXN0ZXJlZC4KICAgKi8KCgogIENvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCA9IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50KG5hbWUsIENvbXBvbmVudFRvUmVnaXN0ZXIpIHsKICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgIW5hbWUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGNvbXBvbmVudCBuYW1lLCAiJyArIG5hbWUgKyAnIjsgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7CiAgICB9CgogICAgdmFyIFRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KCdUZWNoJyk7CgogICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBjaGVjayBpcyBvbmx5IGRvbmUgaWYgVGVjaCBoYXMgYmVlbiByZWdpc3RlcmVkLgogICAgdmFyIGlzVGVjaCA9IFRlY2ggJiYgVGVjaC5pc1RlY2goQ29tcG9uZW50VG9SZWdpc3Rlcik7CiAgICB2YXIgaXNDb21wID0gQ29tcG9uZW50ID09PSBDb21wb25lbnRUb1JlZ2lzdGVyIHx8IENvbXBvbmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihDb21wb25lbnRUb1JlZ2lzdGVyLnByb3RvdHlwZSk7CgogICAgaWYgKGlzVGVjaCB8fCAhaXNDb21wKSB7CiAgICAgIHZhciByZWFzb24gPSB2b2lkIDA7CgogICAgICBpZiAoaXNUZWNoKSB7CiAgICAgICAgcmVhc29uID0gJ3RlY2hzIG11c3QgYmUgcmVnaXN0ZXJlZCB1c2luZyBUZWNoLnJlZ2lzdGVyVGVjaCgpJzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWFzb24gPSAnbXVzdCBiZSBhIENvbXBvbmVudCBzdWJjbGFzcyc7CiAgICAgIH0KCiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBjb21wb25lbnQsICInICsgbmFtZSArICciOyAnICsgcmVhc29uICsgJy4nKTsKICAgIH0KCiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7CgogICAgaWYgKCFDb21wb25lbnQuY29tcG9uZW50c18pIHsKICAgICAgQ29tcG9uZW50LmNvbXBvbmVudHNfID0ge307CiAgICB9CgogICAgdmFyIFBsYXllciA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoJ1BsYXllcicpOwoKICAgIGlmIChuYW1lID09PSAnUGxheWVyJyAmJiBQbGF5ZXIgJiYgUGxheWVyLnBsYXllcnMpIHsKICAgICAgdmFyIHBsYXllcnMgPSBQbGF5ZXIucGxheWVyczsKICAgICAgdmFyIHBsYXllck5hbWVzID0gT2JqZWN0LmtleXMocGxheWVycyk7CgogICAgICAvLyBJZiB3ZSBoYXZlIHBsYXllcnMgdGhhdCB3ZXJlIGRpc3Bvc2VkLCB0aGVuIHRoZWlyIG5hbWUgd2lsbCBzdGlsbCBiZQogICAgICAvLyBpbiBQbGF5ZXJzLnBsYXllcnMuIFNvLCB3ZSBtdXN0IGxvb3AgdGhyb3VnaCBhbmQgdmVyaWZ5IHRoYXQgdGhlIHZhbHVlCiAgICAgIC8vIGZvciBlYWNoIGl0ZW0gaXMgbm90IG51bGwuIFRoaXMgYWxsb3dzIHJlZ2lzdHJhdGlvbiBvZiB0aGUgUGxheWVyIGNvbXBvbmVudAogICAgICAvLyBhZnRlciBhbGwgcGxheWVycyBoYXZlIGJlZW4gZGlzcG9zZWQgb3IgYmVmb3JlIGFueSB3ZXJlIGNyZWF0ZWQuCiAgICAgIGlmIChwbGF5ZXJzICYmIHBsYXllck5hbWVzLmxlbmd0aCA+IDAgJiYgcGxheWVyTmFtZXMubWFwKGZ1bmN0aW9uIChwbmFtZSkgewogICAgICAgIHJldHVybiBwbGF5ZXJzW3BuYW1lXTsKICAgICAgfSkuZXZlcnkoQm9vbGVhbikpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgcmVnaXN0ZXIgUGxheWVyIGNvbXBvbmVudCBhZnRlciBwbGF5ZXIgaGFzIGJlZW4gY3JlYXRlZC4nKTsKICAgICAgfQogICAgfQoKICAgIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXSA9IENvbXBvbmVudFRvUmVnaXN0ZXI7CgogICAgcmV0dXJuIENvbXBvbmVudFRvUmVnaXN0ZXI7CiAgfTsKCiAgLyoqCiAgICogR2V0IGEgYENvbXBvbmVudGAgYmFzZWQgb24gdGhlIG5hbWUgaXQgd2FzIHJlZ2lzdGVyZWQgd2l0aC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogICAgICAgIFRoZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gZ2V0LgogICAqCiAgICogQHJldHVybiB7Q29tcG9uZW50fQogICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgZ290IHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGdpdmVuIG5hbWUuCiAgICoKICAgKiBAZGVwcmVjYXRlZCBJbiBgdmlkZW9qc2AgNiB0aGlzIHdpbGwgbm90IHJldHVybiBgQ29tcG9uZW50YHMgdGhhdCB3ZXJlIG5vdAogICAqICAgICAgICAgICAgIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rIENvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudH0uIEN1cnJlbnRseSB3ZQogICAqICAgICAgICAgICAgIGNoZWNrIHRoZSBnbG9iYWwgYHZpZGVvanNgIG9iamVjdCBmb3IgYSBgQ29tcG9uZW50YCBuYW1lIGFuZAogICAqICAgICAgICAgICAgIHJldHVybiB0aGF0IGlmIGl0IGV4aXN0cy4KICAgKi8KCgogIENvbXBvbmVudC5nZXRDb21wb25lbnQgPSBmdW5jdGlvbiBnZXRDb21wb25lbnQobmFtZSkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7CgogICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzXyAmJiBDb21wb25lbnQuY29tcG9uZW50c19bbmFtZV0pIHsKICAgICAgcmV0dXJuIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXTsKICAgIH0KICB9OwoKICByZXR1cm4gQ29tcG9uZW50Owp9KCk7CgovKioKICogV2hldGhlciBvciBub3QgdGhpcyBjb21wb25lbnQgc3VwcG9ydHMgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuCiAqCiAqIFRoaXMgaXMgZXhwb3NlZCBwcmltYXJpbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuCiAqCiAqIEBwcml2YXRlCiAqIEB0eXBlIHtCb29sZWFufQogKi8KCgpDb21wb25lbnQucHJvdG90eXBlLnN1cHBvcnRzUmFmXyA9IHR5cGVvZiB3aW5kb3dfMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHdpbmRvd18xLmNhbmNlbEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDb21wb25lbnQnLCBDb21wb25lbnQpOwoKLyoqCiAqIEBmaWxlIHRpbWUtcmFuZ2VzLmpzCiAqIEBtb2R1bGUgdGltZS1yYW5nZXMKICovCgovKioKICogUmV0dXJucyB0aGUgdGltZSBmb3IgdGhlIHNwZWNpZmllZCBpbmRleCBhdCB0aGUgc3RhcnQgb3IgZW5kCiAqIG9mIGEgVGltZVJhbmdlIG9iamVjdC4KICoKICogQGZ1bmN0aW9uIHRpbWUtcmFuZ2VzOmluZGV4RnVuY3Rpb24KICoKICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleD0wXQogKiAgICAgICAgVGhlIHJhbmdlIG51bWJlciB0byByZXR1cm4gdGhlIHRpbWUgZm9yLgogKgogKiBAcmV0dXJuIHtudW1iZXJ9CiAqICAgICAgICAgVGhlIHRpbWUgdGhhdCBvZmZzZXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICoKICogQGRlcHJpY2F0ZWQgaW5kZXggbXVzdCBiZSBzZXQgdG8gYSB2YWx1ZSwgaW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IuCiAqLwoKLyoqCiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHJhbmdlcyBvZiB0aW1lIGZvciB2YXJpb3VzIHJlYXNvbnMuCiAqCiAqIEB0eXBlZGVmIHtPYmplY3R9IFRpbWVSYW5nZQogKgogKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoCiAqICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRpbWUgcmFuZ2VzIHJlcHJlc2VudGVkIGJ5IHRoaXMgT2JqZWN0CiAqCiAqIEBwcm9wZXJ0eSB7dGltZS1yYW5nZXM6aW5kZXhGdW5jdGlvbn0gc3RhcnQKICogICAgICAgICAgIFJldHVybnMgdGhlIHRpbWUgb2Zmc2V0IGF0IHdoaWNoIGEgc3BlY2lmaWVkIHRpbWUgcmFuZ2UgYmVnaW5zLgogKgogKiBAcHJvcGVydHkge3RpbWUtcmFuZ2VzOmluZGV4RnVuY3Rpb259IGVuZAogKiAgICAgICAgICAgUmV0dXJucyB0aGUgdGltZSBvZmZzZXQgYXQgd2hpY2ggYSBzcGVjaWZpZWQgdGltZSByYW5nZSBiZWdpbnMuCiAqCiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RpbWVSYW5nZXMKICovCgovKioKICogQ2hlY2sgaWYgYW55IG9mIHRoZSB0aW1lIHJhbmdlcyBhcmUgb3ZlciB0aGUgbWF4aW11bSBpbmRleC4KICoKICogQHBhcmFtIHtzdHJpbmd9IGZuTmFtZQogKiAgICAgICAgVGhlIGZ1bmN0aW9uIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nCiAqCiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleAogKiAgICAgICAgVGhlIGluZGV4IHRvIGNoZWNrCiAqCiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhJbmRleAogKiAgICAgICAgVGhlIG1heGltdW0gcG9zc2libGUgaW5kZXgKICoKICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSB0aW1lUmFuZ2VzIHByb3ZpZGVkIGFyZSBvdmVyIHRoZSBtYXhJbmRleAogKi8KZnVuY3Rpb24gcmFuZ2VDaGVjayhmbk5hbWUsIGluZGV4LCBtYXhJbmRleCkgewogIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IG1heEluZGV4KSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwnJyArIGZuTmFtZSArICdcJyBvbiBcJ1RpbWVSYW5nZXNcJzogVGhlIGluZGV4IHByb3ZpZGVkICgnICsgaW5kZXggKyAnKSBpcyBub24tbnVtZXJpYyBvciBvdXQgb2YgYm91bmRzICgwLScgKyBtYXhJbmRleCArICcpLicpOwogIH0KfQoKLyoqCiAqIENoZWNrIGlmIGFueSBvZiB0aGUgdGltZSByYW5nZXMgYXJlIG92ZXIgdGhlIG1heGltdW0gaW5kZXguCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBmbk5hbWUKICogICAgICAgIFRoZSBmdW5jdGlvbiBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZwogKgogKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVJbmRleAogKiAgICAgICAgVGhlIHByb3ByZXR5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IHRoZSB0aW1lLiBzaG91bGQgYmUgJ3N0YXJ0JyBvciAnZW5kJwogKgogKiBAcGFyYW0ge0FycmF5fSByYW5nZXMKICogICAgICAgIEFuIGFycmF5IG9mIHRpbWUgcmFuZ2VzCiAqCiAqIEBwYXJhbSB7QXJyYXl9IFtyYW5nZUluZGV4PTBdCiAqICAgICAgICBUaGUgaW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaCBhdAogKgogKiBAcmV0dXJuIHtudW1iZXJ9CiAqICAgICAgICAgVGhlIHRpbWUgdGhhdCBvZmZzZXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICoKICoKICogQGRlcHJpY2F0ZWQgcmFuZ2VJbmRleCBtdXN0IGJlIHNldCB0byBhIHZhbHVlLCBpbiB0aGUgZnV0dXJlIHRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvci4KICogQHRocm93cyB7RXJyb3J9IGlmIHJhbmdlSW5kZXggaXMgbW9yZSB0aGFuIHRoZSBsZW5ndGggb2YgcmFuZ2VzCiAqLwpmdW5jdGlvbiBnZXRSYW5nZShmbk5hbWUsIHZhbHVlSW5kZXgsIHJhbmdlcywgcmFuZ2VJbmRleCkgewogIHJhbmdlQ2hlY2soZm5OYW1lLCByYW5nZUluZGV4LCByYW5nZXMubGVuZ3RoIC0gMSk7CiAgcmV0dXJuIHJhbmdlc1tyYW5nZUluZGV4XVt2YWx1ZUluZGV4XTsKfQoKLyoqCiAqIENyZWF0ZSBhIHRpbWUgcmFuZ2Ugb2JqZWN0IGdpdmVudCByYW5nZXMgb2YgdGltZS4KICoKICogQHBhcmFtIHtBcnJheX0gW3Jhbmdlc10KICogICAgICAgIEFuIGFycmF5IG9mIHRpbWUgcmFuZ2VzLgogKi8KZnVuY3Rpb24gY3JlYXRlVGltZVJhbmdlc09iaihyYW5nZXMpIHsKICBpZiAocmFuZ2VzID09PSB1bmRlZmluZWQgfHwgcmFuZ2VzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHsKICAgICAgbGVuZ3RoOiAwLAogICAgICBzdGFydDogZnVuY3Rpb24gc3RhcnQoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIFRpbWVSYW5nZXMgb2JqZWN0IGlzIGVtcHR5Jyk7CiAgICAgIH0sCiAgICAgIGVuZDogZnVuY3Rpb24gZW5kKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBUaW1lUmFuZ2VzIG9iamVjdCBpcyBlbXB0eScpOwogICAgICB9CiAgICB9OwogIH0KICByZXR1cm4gewogICAgbGVuZ3RoOiByYW5nZXMubGVuZ3RoLAogICAgc3RhcnQ6IGdldFJhbmdlLmJpbmQobnVsbCwgJ3N0YXJ0JywgMCwgcmFuZ2VzKSwKICAgIGVuZDogZ2V0UmFuZ2UuYmluZChudWxsLCAnZW5kJywgMSwgcmFuZ2VzKQogIH07Cn0KCi8qKgogKiBTaG91bGQgY3JlYXRlIGEgZmFrZSBgVGltZVJhbmdlYCBvYmplY3Qgd2hpY2ggbWltaWNzIGFuIEhUTUw1IHRpbWUgcmFuZ2UgaW5zdGFuY2UuCiAqCiAqIEBwYXJhbSB7bnVtYmVyfEFycmF5fSBzdGFydAogKiAgICAgICAgVGhlIHN0YXJ0IG9mIGEgc2luZ2xlIHJhbmdlIG9yIGFuIGFycmF5IG9mIHJhbmdlcwogKgogKiBAcGFyYW0ge251bWJlcn0gZW5kCiAqICAgICAgICBUaGUgZW5kIG9mIGEgc2luZ2xlIHJhbmdlLgogKgogKiBAcHJpdmF0ZQogKi8KZnVuY3Rpb24gY3JlYXRlVGltZVJhbmdlcyhzdGFydCwgZW5kKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhcnQpKSB7CiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlc09iaihzdGFydCk7CiAgfSBlbHNlIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlc09iaigpOwogIH0KICByZXR1cm4gY3JlYXRlVGltZVJhbmdlc09iaihbW3N0YXJ0LCBlbmRdXSk7Cn0KCi8qKgogKiBAZmlsZSBidWZmZXIuanMKICogQG1vZHVsZSBidWZmZXIKICovCi8qKgogKiBDb21wdXRlIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBtZWRpYSB0aGF0IGhhcyBiZWVuIGJ1ZmZlcmVkLgogKgogKiBAcGFyYW0ge1RpbWVSYW5nZX0gYnVmZmVyZWQKICogICAgICAgIFRoZSBjdXJyZW50IGBUaW1lUmFuZ2VgIG9iamVjdCByZXByZXNlbnRpbmcgYnVmZmVyZWQgdGltZSByYW5nZXMKICoKICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uCiAqICAgICAgICBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgbWVkaWEKICoKICogQHJldHVybiB7bnVtYmVyfQogKiAgICAgICAgIFBlcmNlbnQgYnVmZmVyZWQgb2YgdGhlIHRvdGFsIGR1cmF0aW9uIGluIGRlY2ltYWwgZm9ybS4KICovCmZ1bmN0aW9uIGJ1ZmZlcmVkUGVyY2VudChidWZmZXJlZCwgZHVyYXRpb24pIHsKICB2YXIgYnVmZmVyZWREdXJhdGlvbiA9IDA7CiAgdmFyIHN0YXJ0ID0gdm9pZCAwOwogIHZhciBlbmQgPSB2b2lkIDA7CgogIGlmICghZHVyYXRpb24pIHsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKCFidWZmZXJlZCB8fCAhYnVmZmVyZWQubGVuZ3RoKSB7CiAgICBidWZmZXJlZCA9IGNyZWF0ZVRpbWVSYW5nZXMoMCwgMCk7CiAgfQoKICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7CiAgICBzdGFydCA9IGJ1ZmZlcmVkLnN0YXJ0KGkpOwogICAgZW5kID0gYnVmZmVyZWQuZW5kKGkpOwoKICAgIC8vIGJ1ZmZlcmVkIGVuZCBjYW4gYmUgYmlnZ2VyIHRoYW4gZHVyYXRpb24gYnkgYSB2ZXJ5IHNtYWxsIGZyYWN0aW9uCiAgICBpZiAoZW5kID4gZHVyYXRpb24pIHsKICAgICAgZW5kID0gZHVyYXRpb247CiAgICB9CgogICAgYnVmZmVyZWREdXJhdGlvbiArPSBlbmQgLSBzdGFydDsKICB9CgogIHJldHVybiBidWZmZXJlZER1cmF0aW9uIC8gZHVyYXRpb247Cn0KCi8qKgogKiBAZmlsZSBmdWxsc2NyZWVuLWFwaS5qcwogKiBAbW9kdWxlIGZ1bGxzY3JlZW4tYXBpCiAqIEBwcml2YXRlCiAqLwovKioKICogU3RvcmUgdGhlIGJyb3dzZXItc3BlY2lmaWMgbWV0aG9kcyBmb3IgdGhlIGZ1bGxzY3JlZW4gQVBJLgogKgogKiBAdHlwZSB7T2JqZWN0fQogKiBAc2VlIFtTcGVjaWZpY2F0aW9uXXtAbGluayBodHRwczovL2Z1bGxzY3JlZW4uc3BlYy53aGF0d2cub3JnfQogKiBAc2VlIFtNYXAgQXBwcm9hY2ggRnJvbSBTY3JlZW5mdWxsLmpzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3NjcmVlbmZ1bGwuanN9CiAqLwp2YXIgRnVsbHNjcmVlbkFwaSA9IHt9OwoKLy8gYnJvd3NlciBBUEkgbWV0aG9kcwp2YXIgYXBpTWFwID0gW1sncmVxdWVzdEZ1bGxzY3JlZW4nLCAnZXhpdEZ1bGxzY3JlZW4nLCAnZnVsbHNjcmVlbkVsZW1lbnQnLCAnZnVsbHNjcmVlbkVuYWJsZWQnLCAnZnVsbHNjcmVlbmNoYW5nZScsICdmdWxsc2NyZWVuZXJyb3InXSwKLy8gV2ViS2l0Clsnd2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4nLCAnd2Via2l0RXhpdEZ1bGxzY3JlZW4nLCAnd2Via2l0RnVsbHNjcmVlbkVsZW1lbnQnLCAnd2Via2l0RnVsbHNjcmVlbkVuYWJsZWQnLCAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsICd3ZWJraXRmdWxsc2NyZWVuZXJyb3InXSwKLy8gT2xkIFdlYktpdCAoU2FmYXJpIDUuMSkKWyd3ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbicsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCcsICd3ZWJraXRDYW5jZWxGdWxsU2NyZWVuJywgJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ10sCi8vIE1vemlsbGEKWydtb3pSZXF1ZXN0RnVsbFNjcmVlbicsICdtb3pDYW5jZWxGdWxsU2NyZWVuJywgJ21vekZ1bGxTY3JlZW5FbGVtZW50JywgJ21vekZ1bGxTY3JlZW5FbmFibGVkJywgJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAnbW96ZnVsbHNjcmVlbmVycm9yJ10sCi8vIE1pY3Jvc29mdApbJ21zUmVxdWVzdEZ1bGxzY3JlZW4nLCAnbXNFeGl0RnVsbHNjcmVlbicsICdtc0Z1bGxzY3JlZW5FbGVtZW50JywgJ21zRnVsbHNjcmVlbkVuYWJsZWQnLCAnTVNGdWxsc2NyZWVuQ2hhbmdlJywgJ01TRnVsbHNjcmVlbkVycm9yJ11dOwoKdmFyIHNwZWNBcGkgPSBhcGlNYXBbMF07CnZhciBicm93c2VyQXBpID0gdm9pZCAwOwoKLy8gZGV0ZXJtaW5lIHRoZSBzdXBwb3J0ZWQgc2V0IG9mIGZ1bmN0aW9ucwpmb3IgKHZhciBpID0gMDsgaSA8IGFwaU1hcC5sZW5ndGg7IGkrKykgewogIC8vIGNoZWNrIGZvciBleGl0RnVsbHNjcmVlbiBmdW5jdGlvbgogIGlmIChhcGlNYXBbaV1bMV0gaW4gZG9jdW1lbnRfMSkgewogICAgYnJvd3NlckFwaSA9IGFwaU1hcFtpXTsKICAgIGJyZWFrOwogIH0KfQoKLy8gbWFwIHRoZSBicm93c2VyIEFQSSBuYW1lcyB0byB0aGUgc3BlYyBBUEkgbmFtZXMKaWYgKGJyb3dzZXJBcGkpIHsKICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYnJvd3NlckFwaS5sZW5ndGg7IF9pKyspIHsKICAgIEZ1bGxzY3JlZW5BcGlbc3BlY0FwaVtfaV1dID0gYnJvd3NlckFwaVtfaV07CiAgfQp9CgovKioKICogQGZpbGUgbWVkaWEtZXJyb3IuanMKICovCi8qKgogKiBBIEN1c3RvbSBgTWVkaWFFcnJvcmAgY2xhc3Mgd2hpY2ggbWltaWNzIHRoZSBzdGFuZGFyZCBIVE1MNSBgTWVkaWFFcnJvcmAgY2xhc3MuCiAqCiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xPYmplY3R8TWVkaWFFcnJvcn0gdmFsdWUKICogICAgICAgIFRoaXMgY2FuIGJlIG9mIG11bHRpcGxlIHR5cGVzOgogKiAgICAgICAgLSBudW1iZXI6IHNob3VsZCBiZSBhIHN0YW5kYXJkIGVycm9yIGNvZGUKICogICAgICAgIC0gc3RyaW5nOiBhbiBlcnJvciBtZXNzYWdlICh0aGUgY29kZSB3aWxsIGJlIDApCiAqICAgICAgICAtIE9iamVjdDogYXJiaXRyYXJ5IHByb3BlcnRpZXMKICogICAgICAgIC0gYE1lZGlhRXJyb3JgIChuYXRpdmUpOiB1c2VkIHRvIHBvcHVsYXRlIGEgdmlkZW8uanMgYE1lZGlhRXJyb3JgIG9iamVjdAogKiAgICAgICAgLSBgTWVkaWFFcnJvcmAgKHZpZGVvLmpzKTogd2lsbCByZXR1cm4gaXRzZWxmIGlmIGl0J3MgYWxyZWFkeSBhCiAqICAgICAgICAgIHZpZGVvLmpzIGBNZWRpYUVycm9yYCBvYmplY3QuCiAqCiAqIEBzZWUgW01lZGlhRXJyb3IgU3BlY117QGxpbmsgaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMtYXV0aG9yLXZpZXcvdmlkZW8uaHRtbCNtZWRpYWVycm9yfQogKiBAc2VlIFtFbmNyeXB0ZWQgTWVkaWFFcnJvciBTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1lbmNyeXB0ZWQtbWVkaWEtMjAxMzA1MTAvI2Vycm9yLWNvZGVzfQogKgogKiBAY2xhc3MgTWVkaWFFcnJvcgogKi8KZnVuY3Rpb24gTWVkaWFFcnJvcih2YWx1ZSkgewoKICAvLyBBbGxvdyByZWR1bmRhbnQgY2FsbHMgdG8gdGhpcyBjb25zdHJ1Y3RvciB0byBhdm9pZCBoYXZpbmcgYGluc3RhbmNlb2ZgCiAgLy8gY2hlY2tzIHBlcHBlcmVkIGFyb3VuZCB0aGUgY29kZS4KICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZWRpYUVycm9yKSB7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgewogICAgdGhpcy5jb2RlID0gdmFsdWU7CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAvLyBkZWZhdWx0IGNvZGUgaXMgemVybywgc28gdGhpcyBpcyBhIGN1c3RvbSBlcnJvcgogICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7CiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKCiAgICAvLyBXZSBhc3NpZ24gdGhlIGBjb2RlYCBwcm9wZXJ0eSBtYW51YWxseSBiZWNhdXNlIG5hdGl2ZSBgTWVkaWFFcnJvcmAgb2JqZWN0cwogICAgLy8gZG8gbm90IGV4cG9zZSBpdCBhcyBhbiBvd24vZW51bWVyYWJsZSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LgogICAgaWYgKHR5cGVvZiB2YWx1ZS5jb2RlID09PSAnbnVtYmVyJykgewogICAgICB0aGlzLmNvZGUgPSB2YWx1ZS5jb2RlOwogICAgfQoKICAgIGFzc2lnbih0aGlzLCB2YWx1ZSk7CiAgfQoKICBpZiAoIXRoaXMubWVzc2FnZSkgewogICAgdGhpcy5tZXNzYWdlID0gTWVkaWFFcnJvci5kZWZhdWx0TWVzc2FnZXNbdGhpcy5jb2RlXSB8fCAnJzsKICB9Cn0KCi8qKgogKiBUaGUgZXJyb3IgY29kZSB0aGF0IHJlZmVycyB0d28gb25lIG9mIHRoZSBkZWZpbmVkIGBNZWRpYUVycm9yYCB0eXBlcwogKgogKiBAdHlwZSB7TnVtYmVyfQogKi8KTWVkaWFFcnJvci5wcm90b3R5cGUuY29kZSA9IDA7CgovKioKICogQW4gb3B0aW9uYWwgbWVzc2FnZSB0aGF0IHRvIHNob3cgd2l0aCB0aGUgZXJyb3IuIE1lc3NhZ2UgaXMgbm90IHBhcnQgb2YgdGhlIEhUTUw1CiAqIHZpZGVvIHNwZWMgYnV0IGFsbG93cyBmb3IgbW9yZSBpbmZvcm1hdGl2ZSBjdXN0b20gZXJyb3JzLgogKgogKiBAdHlwZSB7U3RyaW5nfQogKi8KTWVkaWFFcnJvci5wcm90b3R5cGUubWVzc2FnZSA9ICcnOwoKLyoqCiAqIEFuIG9wdGlvbmFsIHN0YXR1cyBjb2RlIHRoYXQgY2FuIGJlIHNldCBieSBwbHVnaW5zIHRvIGFsbG93IGV2ZW4gbW9yZSBkZXRhaWwgYWJvdXQKICogdGhlIGVycm9yLiBGb3IgZXhhbXBsZSBhIHBsdWdpbiBtaWdodCBwcm92aWRlIGEgc3BlY2lmaWMgSFRUUCBzdGF0dXMgY29kZSBhbmQgYW4KICogZXJyb3IgbWVzc2FnZSBmb3IgdGhhdCBjb2RlLiBUaGVuIHdoZW4gdGhlIHBsdWdpbiBnZXRzIHRoYXQgZXJyb3IgdGhpcyBjbGFzcyB3aWxsCiAqIGtub3cgaG93IHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBmb3IgaXQuIFRoaXMgYWxsb3dzIGEgY3VzdG9tIG1lc3NhZ2UgdG8gc2hvdwogKiB1cCBvbiB0aGUgYFBsYXllcmAgZXJyb3Igb3ZlcmxheS4KICoKICogQHR5cGUge0FycmF5fQogKi8KTWVkaWFFcnJvci5wcm90b3R5cGUuc3RhdHVzID0gbnVsbDsKCi8qKgogKiBFcnJvcnMgaW5kZXhlZCBieSB0aGUgVzNDIHN0YW5kYXJkLiBUaGUgb3JkZXIgKipDQU5OT1QgQ0hBTkdFKiohIFNlZSB0aGUKICogc3BlY2lmaWNhdGlvbiBsaXN0ZWQgdW5kZXIge0BsaW5rIE1lZGlhRXJyb3J9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiBAZW51bSB7YXJyYXl9CiAqIEByZWFkb25seQogKiBAcHJvcGVydHkge3N0cmluZ30gMCAtIE1FRElBX0VSUl9DVVNUT00KICogQHByb3BlcnR5IHtzdHJpbmd9IDEgLSBNRURJQV9FUlJfQ1VTVE9NCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSAyIC0gTUVESUFfRVJSX0FCT1JURUQKICogQHByb3BlcnR5IHtzdHJpbmd9IDMgLSBNRURJQV9FUlJfTkVUV09SSwogKiBAcHJvcGVydHkge3N0cmluZ30gNCAtIE1FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRAogKiBAcHJvcGVydHkge3N0cmluZ30gNSAtIE1FRElBX0VSUl9FTkNSWVBURUQKICovCk1lZGlhRXJyb3IuZXJyb3JUeXBlcyA9IFsnTUVESUFfRVJSX0NVU1RPTScsICdNRURJQV9FUlJfQUJPUlRFRCcsICdNRURJQV9FUlJfTkVUV09SSycsICdNRURJQV9FUlJfREVDT0RFJywgJ01FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRCcsICdNRURJQV9FUlJfRU5DUllQVEVEJ107CgovKioKICogVGhlIGRlZmF1bHQgYE1lZGlhRXJyb3JgIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSB7QGxpbmsgTWVkaWFFcnJvci5lcnJvclR5cGVzfS4KICoKICogQHR5cGUge0FycmF5fQogKiBAY29uc3RhbnQKICovCk1lZGlhRXJyb3IuZGVmYXVsdE1lc3NhZ2VzID0gewogIDE6ICdZb3UgYWJvcnRlZCB0aGUgbWVkaWEgcGxheWJhY2snLAogIDI6ICdBIG5ldHdvcmsgZXJyb3IgY2F1c2VkIHRoZSBtZWRpYSBkb3dubG9hZCB0byBmYWlsIHBhcnQtd2F5LicsCiAgMzogJ1RoZSBtZWRpYSBwbGF5YmFjayB3YXMgYWJvcnRlZCBkdWUgdG8gYSBjb3JydXB0aW9uIHByb2JsZW0gb3IgYmVjYXVzZSB0aGUgbWVkaWEgdXNlZCBmZWF0dXJlcyB5b3VyIGJyb3dzZXIgZGlkIG5vdCBzdXBwb3J0LicsCiAgNDogJ1RoZSBtZWRpYSBjb3VsZCBub3QgYmUgbG9hZGVkLCBlaXRoZXIgYmVjYXVzZSB0aGUgc2VydmVyIG9yIG5ldHdvcmsgZmFpbGVkIG9yIGJlY2F1c2UgdGhlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLicsCiAgNTogJ1RoZSBtZWRpYSBpcyBlbmNyeXB0ZWQgYW5kIHdlIGRvIG5vdCBoYXZlIHRoZSBrZXlzIHRvIGRlY3J5cHQgaXQuJwp9OwoKLy8gQWRkIHR5cGVzIGFzIHByb3BlcnRpZXMgb24gTWVkaWFFcnJvcgovLyBlLmcuIE1lZGlhRXJyb3IuTUVESUFfRVJSX1NSQ19OT1RfU1VQUE9SVEVEID0gNDsKZm9yICh2YXIgZXJyTnVtID0gMDsgZXJyTnVtIDwgTWVkaWFFcnJvci5lcnJvclR5cGVzLmxlbmd0aDsgZXJyTnVtKyspIHsKICBNZWRpYUVycm9yW01lZGlhRXJyb3IuZXJyb3JUeXBlc1tlcnJOdW1dXSA9IGVyck51bTsKICAvLyB2YWx1ZXMgc2hvdWxkIGJlIGFjY2Vzc2libGUgb24gYm90aCB0aGUgY2xhc3MgYW5kIGluc3RhbmNlCiAgTWVkaWFFcnJvci5wcm90b3R5cGVbTWVkaWFFcnJvci5lcnJvclR5cGVzW2Vyck51bV1dID0gZXJyTnVtOwp9Cgp2YXIgdHVwbGUgPSBTYWZlUGFyc2VUdXBsZTsKCmZ1bmN0aW9uIFNhZmVQYXJzZVR1cGxlKG9iaiwgcmV2aXZlcikgewogICAgdmFyIGpzb247CiAgICB2YXIgZXJyb3IgPSBudWxsOwoKICAgIHRyeSB7CiAgICAgICAganNvbiA9IEpTT04ucGFyc2Uob2JqLCByZXZpdmVyKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGVycm9yID0gZXJyOwogICAgfQoKICAgIHJldHVybiBbZXJyb3IsIGpzb25dCn0KCi8qKgogKiBSZXR1cm5zIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGBQcm9taXNlYC1saWtlIChpLmUuIGhhcyBhIGB0aGVuYCBtZXRob2QpLgogKgogKiBAcGFyYW0gIHtPYmplY3R9ICB2YWx1ZQogKiAgICAgICAgIEFuIG9iamVjdCB0aGF0IG1heSBvciBtYXkgbm90IGJlIGBQcm9taXNlYC1saWtlLgogKgogKiBAcmV0dXJuIHtCb29sZWFufQogKiAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYFByb21pc2VgLWxpa2UuCiAqLwpmdW5jdGlvbiBpc1Byb21pc2UodmFsdWUpIHsKICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJzsKfQoKLyoqCiAqIFNpbGVuY2UgYSBQcm9taXNlLWxpa2Ugb2JqZWN0LgogKgogKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmcgbm9uLWhhcm1mdWwsIGJ1dCBwb3RlbnRpYWxseSBjb25mdXNpbmcgInVuY2F1Z2h0CiAqIHBsYXkgcHJvbWlzZSIgcmVqZWN0aW9uIGVycm9yIG1lc3NhZ2VzLgogKgogKiBAcGFyYW0gIHtPYmplY3R9IHZhbHVlCiAqICAgICAgICAgQW4gb2JqZWN0IHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYFByb21pc2VgLWxpa2UuCiAqLwpmdW5jdGlvbiBzaWxlbmNlUHJvbWlzZSh2YWx1ZSkgewogIGlmIChpc1Byb21pc2UodmFsdWUpKSB7CiAgICB2YWx1ZS50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7fSk7CiAgfQp9CgovKioKICogQGZpbGUgdGV4dC10cmFjay1saXN0LWNvbnZlcnRlci5qcyBVdGlsaXRpZXMgZm9yIGNhcHR1cmluZyB0ZXh0IHRyYWNrIHN0YXRlIGFuZAogKiByZS1jcmVhdGluZyB0cmFja3MgYmFzZWQgb24gYSBjYXB0dXJlLgogKgogKiBAbW9kdWxlIHRleHQtdHJhY2stbGlzdC1jb252ZXJ0ZXIKICovCgovKioKICogRXhhbWluZSBhIHNpbmdsZSB7QGxpbmsgVGV4dFRyYWNrfSBhbmQgcmV0dXJuIGEgSlNPTi1jb21wYXRpYmxlIGphdmFzY3JpcHQgb2JqZWN0IHRoYXQKICogcmVwcmVzZW50cyB0aGUge0BsaW5rIFRleHRUcmFja30ncyBzdGF0ZS4KICoKICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrCiAqICAgICAgICBUaGUgdGV4dCB0cmFjayB0byBxdWVyeS4KICoKICogQHJldHVybiB7T2JqZWN0fQogKiAgICAgICAgIEEgc2VyaWFsaXphYmxlIGphdmFzY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFRleHRUcmFjay4KICogQHByaXZhdGUKICovCnZhciB0cmFja1RvSnNvbl8gPSBmdW5jdGlvbiB0cmFja1RvSnNvbl8odHJhY2spIHsKICB2YXIgcmV0ID0gWydraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2lkJywgJ2luQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGUnLCAnbW9kZScsICdzcmMnXS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcHJvcCwgaSkgewoKICAgIGlmICh0cmFja1twcm9wXSkgewogICAgICBhY2NbcHJvcF0gPSB0cmFja1twcm9wXTsKICAgIH0KCiAgICByZXR1cm4gYWNjOwogIH0sIHsKICAgIGN1ZXM6IHRyYWNrLmN1ZXMgJiYgQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHRyYWNrLmN1ZXMsIGZ1bmN0aW9uIChjdWUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzdGFydFRpbWU6IGN1ZS5zdGFydFRpbWUsCiAgICAgICAgZW5kVGltZTogY3VlLmVuZFRpbWUsCiAgICAgICAgdGV4dDogY3VlLnRleHQsCiAgICAgICAgaWQ6IGN1ZS5pZAogICAgICB9OwogICAgfSkKICB9KTsKCiAgcmV0dXJuIHJldDsKfTsKCi8qKgogKiBFeGFtaW5lIGEge0BsaW5rIFRlY2h9IGFuZCByZXR1cm4gYSBKU09OLWNvbXBhdGlibGUgamF2YXNjcmlwdCBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlCiAqIHN0YXRlIG9mIGFsbCB7QGxpbmsgVGV4dFRyYWNrfXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuIFRoZSByZXR1cm4gYXJyYXkgaXMgY29tcGF0aWJsZSB3aXRoCiAqIHtAbGluayB0ZXh0LXRyYWNrLWxpc3QtY29udmVydGVyOmpzb25Ub1RleHRUcmFja3N9LgogKgogKiBAcGFyYW0ge1RlY2h9IHRlY2gKICogICAgICAgIFRoZSB0ZWNoIG9iamVjdCB0byBxdWVyeQogKgogKiBAcmV0dXJuIHtBcnJheX0KICogICAgICAgICBBIHNlcmlhbGl6YWJsZSBqYXZhc2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7QGxpbmsgVGVjaH1zCiAqICAgICAgICAge0BsaW5rIFRleHRUcmFja0xpc3R9LgogKi8KdmFyIHRleHRUcmFja3NUb0pzb24gPSBmdW5jdGlvbiB0ZXh0VHJhY2tzVG9Kc29uKHRlY2gpIHsKCiAgdmFyIHRyYWNrRWxzID0gdGVjaC4kJCgndHJhY2snKTsKCiAgdmFyIHRyYWNrT2JqcyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0cmFja0VscywgZnVuY3Rpb24gKHQpIHsKICAgIHJldHVybiB0LnRyYWNrOwogIH0pOwogIHZhciB0cmFja3MgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodHJhY2tFbHMsIGZ1bmN0aW9uICh0cmFja0VsKSB7CiAgICB2YXIganNvbiA9IHRyYWNrVG9Kc29uXyh0cmFja0VsLnRyYWNrKTsKCiAgICBpZiAodHJhY2tFbC5zcmMpIHsKICAgICAganNvbi5zcmMgPSB0cmFja0VsLnNyYzsKICAgIH0KICAgIHJldHVybiBqc29uOwogIH0pOwoKICByZXR1cm4gdHJhY2tzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodGVjaC50ZXh0VHJhY2tzKCksIGZ1bmN0aW9uICh0cmFjaykgewogICAgcmV0dXJuIHRyYWNrT2Jqcy5pbmRleE9mKHRyYWNrKSA9PT0gLTE7CiAgfSkubWFwKHRyYWNrVG9Kc29uXykpOwp9OwoKLyoqCiAqIENyZWF0ZSBhIHNldCBvZiByZW1vdGUge0BsaW5rIFRleHRUcmFja31zIG9uIGEge0BsaW5rIFRlY2h9IGJhc2VkIG9uIGFuIGFycmF5IG9mIGphdmFzY3JpcHQKICogb2JqZWN0IHtAbGluayBUZXh0VHJhY2t9IHJlcHJlc2VudGF0aW9ucy4KICoKICogQHBhcmFtIHtBcnJheX0ganNvbgogKiAgICAgICAgQW4gYXJyYXkgb2YgYFRleHRUcmFja2AgcmVwcmVzZW50YXRpb24gb2JqZWN0cywgbGlrZSB0aG9zZSB0aGF0IHdvdWxkIGJlCiAqICAgICAgICBwcm9kdWNlZCBieSBgdGV4dFRyYWNrc1RvSnNvbmAuCiAqCiAqIEBwYXJhbSB7VGVjaH0gdGVjaAogKiAgICAgICAgVGhlIGBUZWNoYCB0byBjcmVhdGUgdGhlIGBUZXh0VHJhY2tgcyBvbi4KICovCnZhciBqc29uVG9UZXh0VHJhY2tzID0gZnVuY3Rpb24ganNvblRvVGV4dFRyYWNrcyhqc29uLCB0ZWNoKSB7CiAganNvbi5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgewogICAgdmFyIGFkZGVkVHJhY2sgPSB0ZWNoLmFkZFJlbW90ZVRleHRUcmFjayh0cmFjaykudHJhY2s7CgogICAgaWYgKCF0cmFjay5zcmMgJiYgdHJhY2suY3VlcykgewogICAgICB0cmFjay5jdWVzLmZvckVhY2goZnVuY3Rpb24gKGN1ZSkgewogICAgICAgIHJldHVybiBhZGRlZFRyYWNrLmFkZEN1ZShjdWUpOwogICAgICB9KTsKICAgIH0KICB9KTsKCiAgcmV0dXJuIHRlY2gudGV4dFRyYWNrcygpOwp9OwoKdmFyIHRleHRUcmFja0NvbnZlcnRlciA9IHsgdGV4dFRyYWNrc1RvSnNvbjogdGV4dFRyYWNrc1RvSnNvbiwganNvblRvVGV4dFRyYWNrczoganNvblRvVGV4dFRyYWNrcywgdHJhY2tUb0pzb25fOiB0cmFja1RvSnNvbl8gfTsKCi8qKgogKiBAZmlsZSBtb2RhbC1kaWFsb2cuanMKICovCnZhciBNT0RBTF9DTEFTU19OQU1FID0gJ3Zqcy1tb2RhbC1kaWFsb2cnOwp2YXIgRVNDID0gMjc7CgovKioKICogVGhlIGBNb2RhbERpYWxvZ2AgZGlzcGxheXMgb3ZlciB0aGUgdmlkZW8gYW5kIGl0cyBjb250cm9scywgd2hpY2ggYmxvY2tzCiAqIGludGVyYWN0aW9uIHdpdGggdGhlIHBsYXllciB1bnRpbCBpdCBpcyBjbG9zZWQuCiAqCiAqIE1vZGFsIGRpYWxvZ3MgaW5jbHVkZSBhICJDbG9zZSIgYnV0dG9uIGFuZCB3aWxsIGNsb3NlIHdoZW4gdGhhdCBidXR0b24KICogaXMgYWN0aXZhdGVkIC0gb3Igd2hlbiBFU0MgaXMgcHJlc3NlZCBhbnl3aGVyZS4KICoKICogQGV4dGVuZHMgQ29tcG9uZW50CiAqLwoKdmFyIE1vZGFsRGlhbG9nID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHsKICBpbmhlcml0cyhNb2RhbERpYWxvZywgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKgogICAqIEBwYXJhbSB7TWl4ZWR9IFtvcHRpb25zLmNvbnRlbnQ9dW5kZWZpbmVkXQogICAqICAgICAgICBQcm92aWRlIGN1c3RvbWl6ZWQgY29udGVudCBmb3IgdGhpcyBtb2RhbC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5kZXNjcmlwdGlvbl0KICAgKiAgICAgICAgQSB0ZXh0IGRlc2NyaXB0aW9uIGZvciB0aGUgbW9kYWwsIHByaW1hcmlseSBmb3IgYWNjZXNzaWJpbGl0eS4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmlsbEFsd2F5cz1mYWxzZV0KICAgKiAgICAgICAgTm9ybWFsbHksIG1vZGFscyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgb25seSB0aGUgZmlyc3QgdGltZQogICAqICAgICAgICB0aGV5IG9wZW4uIFRoaXMgdGVsbHMgdGhlIG1vZGFsIHRvIHJlZnJlc2ggaXRzIGNvbnRlbnQKICAgKiAgICAgICAgZXZlcnkgdGltZSBpdCBvcGVucy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0KICAgKiAgICAgICAgQSB0ZXh0IGxhYmVsIGZvciB0aGUgbW9kYWwsIHByaW1hcmlseSBmb3IgYWNjZXNzaWJpbGl0eS4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudGVtcG9yYXJ5PXRydWVdCiAgICogICAgICAgIElmIGB0cnVlYCwgdGhlIG1vZGFsIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlOyBpdCB3aWxsIGJlCiAgICogICAgICAgIGRpc3Bvc2VkIGFzIHNvb24gYXMgaXQncyBjbG9zZWQuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVuY2xvc2VhYmxlPWZhbHNlXQogICAqICAgICAgICBJZiBgdHJ1ZWAsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gY2xvc2UgdGhlIG1vZGFsCiAgICogICAgICAgIHRocm91Z2ggdGhlIFVJIGluIHRoZSBub3JtYWwgd2F5cy4gUHJvZ3JhbW1hdGljIGNsb3NpbmcgaXMKICAgKiAgICAgICAgc3RpbGwgcG9zc2libGUuCiAgICovCiAgZnVuY3Rpb24gTW9kYWxEaWFsb2cocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RhbERpYWxvZyk7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMub3BlbmVkXyA9IF90aGlzLmhhc0JlZW5PcGVuZWRfID0gX3RoaXMuaGFzQmVlbkZpbGxlZF8gPSBmYWxzZTsKCiAgICBfdGhpcy5jbG9zZWFibGUoIV90aGlzLm9wdGlvbnNfLnVuY2xvc2VhYmxlKTsKICAgIF90aGlzLmNvbnRlbnQoX3RoaXMub3B0aW9uc18uY29udGVudCk7CgogICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50RWwgaXMgZGVmaW5lZCBBRlRFUiBhbnkgY2hpbGRyZW4gYXJlIGluaXRpYWxpemVkCiAgICAvLyBiZWNhdXNlIHdlIG9ubHkgd2FudCB0aGUgY29udGVudHMgb2YgdGhlIG1vZGFsIGluIHRoZSBjb250ZW50RWwKICAgIC8vIChub3QgdGhlIFVJIGVsZW1lbnRzIGxpa2UgdGhlIGNsb3NlIGJ1dHRvbikuCiAgICBfdGhpcy5jb250ZW50RWxfID0gY3JlYXRlRWwoJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiBNT0RBTF9DTEFTU19OQU1FICsgJy1jb250ZW50JwogICAgfSwgewogICAgICByb2xlOiAnZG9jdW1lbnQnCiAgICB9KTsKCiAgICBfdGhpcy5kZXNjRWxfID0gY3JlYXRlRWwoJ3AnLCB7CiAgICAgIGNsYXNzTmFtZTogTU9EQUxfQ0xBU1NfTkFNRSArICctZGVzY3JpcHRpb24gdmpzLWNvbnRyb2wtdGV4dCcsCiAgICAgIGlkOiBfdGhpcy5lbCgpLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpCiAgICB9KTsKCiAgICB0ZXh0Q29udGVudChfdGhpcy5kZXNjRWxfLCBfdGhpcy5kZXNjcmlwdGlvbigpKTsKICAgIF90aGlzLmVsXy5hcHBlbmRDaGlsZChfdGhpcy5kZXNjRWxfKTsKICAgIF90aGlzLmVsXy5hcHBlbmRDaGlsZChfdGhpcy5jb250ZW50RWxfKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYE1vZGFsRGlhbG9nYCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIERPTSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLgogICAqLwoKCiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7CiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpLAogICAgICB0YWJJbmRleDogLTEKICAgIH0sIHsKICAgICAgJ2FyaWEtZGVzY3JpYmVkYnknOiB0aGlzLmlkKCkgKyAnX2Rlc2NyaXB0aW9uJywKICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLAogICAgICAnYXJpYS1sYWJlbCc6IHRoaXMubGFiZWwoKSwKICAgICAgJ3JvbGUnOiAnZGlhbG9nJwogICAgfSk7CiAgfTsKCiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgdGhpcy5jb250ZW50RWxfID0gbnVsbDsKICAgIHRoaXMuZGVzY0VsXyA9IG51bGw7CiAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsOwoKICAgIF9Db21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gTU9EQUxfQ0xBU1NfTkFNRSArICcgdmpzLWhpZGRlbiAnICsgX0NvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIEhhbmRsZXMgYGtleWRvd25gIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQsIGxvb2tpbmcgZm9yIEVTQywgd2hpY2ggY2xvc2VzCiAgICogdGhlIG1vZGFsLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZQogICAqICAgICAgICBUaGUga2V5cHJlc3MgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudC4KICAgKgogICAqIEBsaXN0ZW5zIGtleWRvd24KICAgKi8KCgogIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGUpIHsKICAgIGlmIChlLndoaWNoID09PSBFU0MgJiYgdGhpcy5jbG9zZWFibGUoKSkgewogICAgICB0aGlzLmNsb3NlKCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgbGFiZWwgc3RyaW5nIGZvciB0aGlzIG1vZGFsLiBQcmltYXJpbHkgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eS4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIHRoZSBsb2NhbGl6ZWQgb3IgcmF3IGxhYmVsIG9mIHRoaXMgbW9kYWwuCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiBsYWJlbCgpIHsKICAgIHJldHVybiB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwgfHwgJ01vZGFsIFdpbmRvdycpOwogIH07CgogIC8qKgogICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBmb3IgdGhpcyBtb2RhbC4gUHJpbWFyaWx5IHVzZWQgZm9yCiAgICogYWNjZXNzaWJpbGl0eS4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBsb2NhbGl6ZWQgb3IgcmF3IGRlc2NyaXB0aW9uIG9mIHRoaXMgbW9kYWwuCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZGVzY3JpcHRpb24gPSBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHsKICAgIHZhciBkZXNjID0gdGhpcy5vcHRpb25zXy5kZXNjcmlwdGlvbiB8fCB0aGlzLmxvY2FsaXplKCdUaGlzIGlzIGEgbW9kYWwgd2luZG93LicpOwoKICAgIC8vIEFwcGVuZCBhIHVuaXZlcnNhbCBjbG9zZWFiaWxpdHkgbWVzc2FnZSBpZiB0aGUgbW9kYWwgaXMgY2xvc2VhYmxlLgogICAgaWYgKHRoaXMuY2xvc2VhYmxlKCkpIHsKICAgICAgZGVzYyArPSAnICcgKyB0aGlzLmxvY2FsaXplKCdUaGlzIG1vZGFsIGNhbiBiZSBjbG9zZWQgYnkgcHJlc3NpbmcgdGhlIEVzY2FwZSBrZXkgb3IgYWN0aXZhdGluZyB0aGUgY2xvc2UgYnV0dG9uLicpOwogICAgfQoKICAgIHJldHVybiBkZXNjOwogIH07CgogIC8qKgogICAqIE9wZW5zIHRoZSBtb2RhbC4KICAgKgogICAqIEBmaXJlcyBNb2RhbERpYWxvZyNiZWZvcmVtb2RhbG9wZW4KICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjbW9kYWxvcGVuCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIG9wZW4oKSB7CiAgICBpZiAoIXRoaXMub3BlbmVkXykgewogICAgICB2YXIgcGxheWVyID0gdGhpcy5wbGF5ZXIoKTsKCiAgICAgIC8qKgogICAgICAgICogRmlyZWQganVzdCBiZWZvcmUgYSBgTW9kYWxEaWFsb2dgIGlzIG9wZW5lZC4KICAgICAgICAqCiAgICAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxvcGVuCiAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAgKi8KICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbG9wZW4nKTsKICAgICAgdGhpcy5vcGVuZWRfID0gdHJ1ZTsKCiAgICAgIC8vIEZpbGwgY29udGVudCBpZiB0aGUgbW9kYWwgaGFzIG5ldmVyIG9wZW5lZCBiZWZvcmUgYW5kCiAgICAgIC8vIG5ldmVyIGJlZW4gZmlsbGVkLgogICAgICBpZiAodGhpcy5vcHRpb25zXy5maWxsQWx3YXlzIHx8ICF0aGlzLmhhc0JlZW5PcGVuZWRfICYmICF0aGlzLmhhc0JlZW5GaWxsZWRfKSB7CiAgICAgICAgdGhpcy5maWxsKCk7CiAgICAgIH0KCiAgICAgIC8vIElmIHRoZSBwbGF5ZXIgd2FzIHBsYXlpbmcsIHBhdXNlIGl0IGFuZCB0YWtlIG5vdGUgb2YgaXRzIHByZXZpb3VzbHkKICAgICAgLy8gcGxheWluZyBzdGF0ZS4KICAgICAgdGhpcy53YXNQbGF5aW5nXyA9ICFwbGF5ZXIucGF1c2VkKCk7CgogICAgICBpZiAodGhpcy5vcHRpb25zXy5wYXVzZU9uT3BlbiAmJiB0aGlzLndhc1BsYXlpbmdfKSB7CiAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgIH0KCiAgICAgIGlmICh0aGlzLmNsb3NlYWJsZSgpKSB7CiAgICAgICAgdGhpcy5vbih0aGlzLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpOwogICAgICB9CgogICAgICAvLyBIaWRlIGNvbnRyb2xzIGFuZCBub3RlIGlmIHRoZXkgd2VyZSBlbmFibGVkLgogICAgICB0aGlzLmhhZENvbnRyb2xzXyA9IHBsYXllci5jb250cm9scygpOwogICAgICBwbGF5ZXIuY29udHJvbHMoZmFsc2UpOwoKICAgICAgdGhpcy5zaG93KCk7CiAgICAgIHRoaXMuY29uZGl0aW9uYWxGb2N1c18oKTsKICAgICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTsKCiAgICAgIC8qKgogICAgICAgICogRmlyZWQganVzdCBhZnRlciBhIGBNb2RhbERpYWxvZ2AgaXMgb3BlbmVkLgogICAgICAgICoKICAgICAgICAqIEBldmVudCBNb2RhbERpYWxvZyNtb2RhbG9wZW4KICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoJ21vZGFsb3BlbicpOwogICAgICB0aGlzLmhhc0JlZW5PcGVuZWRfID0gdHJ1ZTsKICAgIH0KICB9OwoKICAvKioKICAgKiBJZiB0aGUgYE1vZGFsRGlhbG9nYCBpcyBjdXJyZW50bHkgb3BlbiBvciBjbG9zZWQuCiAgICoKICAgKiBAcGFyYW0gIHtib29sZWFufSBbdmFsdWVdCiAgICogICAgICAgICBJZiBnaXZlbiwgaXQgd2lsbCBvcGVuIChgdHJ1ZWApIG9yIGNsb3NlIChgZmFsc2VgKSB0aGUgbW9kYWwuCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgdGhlIGN1cnJlbnQgb3BlbiBzdGF0ZSBvZiB0aGUgbW9kYWxkaWFsb2cKICAgKi8KCgogIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcGVuZWQgPSBmdW5jdGlvbiBvcGVuZWQodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgewogICAgICB0aGlzW3ZhbHVlID8gJ29wZW4nIDogJ2Nsb3NlJ10oKTsKICAgIH0KICAgIHJldHVybiB0aGlzLm9wZW5lZF87CiAgfTsKCiAgLyoqCiAgICogQ2xvc2VzIHRoZSBtb2RhbCwgZG9lcyBub3RoaW5nIGlmIHRoZSBgTW9kYWxEaWFsb2dgIGlzCiAgICogbm90IG9wZW4uCiAgICoKICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxjbG9zZQogICAqIEBmaXJlcyBNb2RhbERpYWxvZyNtb2RhbGNsb3NlCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZSgpIHsKICAgIGlmICghdGhpcy5vcGVuZWRfKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBwbGF5ZXIgPSB0aGlzLnBsYXllcigpOwoKICAgIC8qKgogICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIGEgYE1vZGFsRGlhbG9nYCBpcyBjbG9zZWQuCiAgICAgICoKICAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxjbG9zZQogICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignYmVmb3JlbW9kYWxjbG9zZScpOwogICAgdGhpcy5vcGVuZWRfID0gZmFsc2U7CgogICAgaWYgKHRoaXMud2FzUGxheWluZ18gJiYgdGhpcy5vcHRpb25zXy5wYXVzZU9uT3BlbikgewogICAgICBwbGF5ZXIucGxheSgpOwogICAgfQoKICAgIGlmICh0aGlzLmNsb3NlYWJsZSgpKSB7CiAgICAgIHRoaXMub2ZmKHRoaXMuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7CiAgICB9CgogICAgaWYgKHRoaXMuaGFkQ29udHJvbHNfKSB7CiAgICAgIHBsYXllci5jb250cm9scyh0cnVlKTsKICAgIH0KCiAgICB0aGlzLmhpZGUoKTsKICAgIHRoaXMuZWwoKS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKCiAgICAvKioKICAgICAgKiBGaXJlZCBqdXN0IGFmdGVyIGEgYE1vZGFsRGlhbG9nYCBpcyBjbG9zZWQuCiAgICAgICoKICAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjbW9kYWxjbG9zZQogICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignbW9kYWxjbG9zZScpOwogICAgdGhpcy5jb25kaXRpb25hbEJsdXJfKCk7CgogICAgaWYgKHRoaXMub3B0aW9uc18udGVtcG9yYXJ5KSB7CiAgICAgIHRoaXMuZGlzcG9zZSgpOwogICAgfQogIH07CgogIC8qKgogICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgYE1vZGFsRGlhbG9nYCBpcyBjbG9zZWFibGUgdmlhIHRoZSBVSS4KICAgKgogICAqIEBwYXJhbSAge2Jvb2xlYW59IFt2YWx1ZV0KICAgKiAgICAgICAgIElmIGdpdmVuIGFzIGEgYm9vbGVhbiwgaXQgd2lsbCBzZXQgdGhlIGBjbG9zZWFibGVgIG9wdGlvbi4KICAgKgogICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICogICAgICAgICBSZXR1cm5zIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgY2xvc2FibGUgb3B0aW9uLgogICAqLwoKCiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNsb3NlYWJsZSA9IGZ1bmN0aW9uIGNsb3NlYWJsZSh2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgIHZhciBjbG9zZWFibGUgPSB0aGlzLmNsb3NlYWJsZV8gPSAhIXZhbHVlOwogICAgICB2YXIgY2xvc2UgPSB0aGlzLmdldENoaWxkKCdjbG9zZUJ1dHRvbicpOwoKICAgICAgLy8gSWYgdGhpcyBpcyBiZWluZyBtYWRlIGNsb3NlYWJsZSBhbmQgaGFzIG5vIGNsb3NlIGJ1dHRvbiwgYWRkIG9uZS4KICAgICAgaWYgKGNsb3NlYWJsZSAmJiAhY2xvc2UpIHsKCiAgICAgICAgLy8gVGhlIGNsb3NlIGJ1dHRvbiBzaG91bGQgYmUgYSBjaGlsZCBvZiB0aGUgbW9kYWwgLSBub3QgaXRzCiAgICAgICAgLy8gY29udGVudCBlbGVtZW50LCBzbyB0ZW1wb3JhcmlseSBjaGFuZ2UgdGhlIGNvbnRlbnQgZWxlbWVudC4KICAgICAgICB2YXIgdGVtcCA9IHRoaXMuY29udGVudEVsXzsKCiAgICAgICAgdGhpcy5jb250ZW50RWxfID0gdGhpcy5lbF87CiAgICAgICAgY2xvc2UgPSB0aGlzLmFkZENoaWxkKCdjbG9zZUJ1dHRvbicsIHsgY29udHJvbFRleHQ6ICdDbG9zZSBNb2RhbCBEaWFsb2cnIH0pOwogICAgICAgIHRoaXMuY29udGVudEVsXyA9IHRlbXA7CiAgICAgICAgdGhpcy5vbihjbG9zZSwgJ2Nsb3NlJywgdGhpcy5jbG9zZSk7CiAgICAgIH0KCiAgICAgIC8vIElmIHRoaXMgaXMgYmVpbmcgbWFkZSB1bmNsb3NlYWJsZSBhbmQgaGFzIGEgY2xvc2UgYnV0dG9uLCByZW1vdmUgaXQuCiAgICAgIGlmICghY2xvc2VhYmxlICYmIGNsb3NlKSB7CiAgICAgICAgdGhpcy5vZmYoY2xvc2UsICdjbG9zZScsIHRoaXMuY2xvc2UpOwogICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2UpOwogICAgICAgIGNsb3NlLmRpc3Bvc2UoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMuY2xvc2VhYmxlXzsKICB9OwoKICAvKioKICAgKiBGaWxsIHRoZSBtb2RhbCdzIGNvbnRlbnQgZWxlbWVudCB3aXRoIHRoZSBtb2RhbCdzICJjb250ZW50IiBvcHRpb24uCiAgICogVGhlIGNvbnRlbnQgZWxlbWVudCB3aWxsIGJlIGVtcHRpZWQgYmVmb3JlIHRoaXMgY2hhbmdlIHRha2VzIHBsYWNlLgogICAqLwoKCiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsKCkgewogICAgdGhpcy5maWxsV2l0aCh0aGlzLmNvbnRlbnQoKSk7CiAgfTsKCiAgLyoqCiAgICogRmlsbCB0aGUgbW9kYWwncyBjb250ZW50IGVsZW1lbnQgd2l0aCBhcmJpdHJhcnkgY29udGVudC4KICAgKiBUaGUgY29udGVudCBlbGVtZW50IHdpbGwgYmUgZW1wdGllZCBiZWZvcmUgdGhpcyBjaGFuZ2UgdGFrZXMgcGxhY2UuCiAgICoKICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxmaWxsCiAgICogQGZpcmVzIE1vZGFsRGlhbG9nI21vZGFsZmlsbAogICAqCiAgICogQHBhcmFtIHtNaXhlZH0gW2NvbnRlbnRdCiAgICogICAgICAgIFRoZSBzYW1lIHJ1bGVzIGFwcGx5IHRvIHRoaXMgYXMgYXBwbHkgdG8gdGhlIGBjb250ZW50YCBvcHRpb24uCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZmlsbFdpdGggPSBmdW5jdGlvbiBmaWxsV2l0aChjb250ZW50KSB7CiAgICB2YXIgY29udGVudEVsID0gdGhpcy5jb250ZW50RWwoKTsKICAgIHZhciBwYXJlbnRFbCA9IGNvbnRlbnRFbC5wYXJlbnROb2RlOwogICAgdmFyIG5leHRTaWJsaW5nRWwgPSBjb250ZW50RWwubmV4dFNpYmxpbmc7CgogICAgLyoqCiAgICAgKiBGaXJlZCBqdXN0IGJlZm9yZSBhIGBNb2RhbERpYWxvZ2AgaXMgZmlsbGVkIHdpdGggY29udGVudC4KICAgICAqCiAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxmaWxsCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignYmVmb3JlbW9kYWxmaWxsJyk7CiAgICB0aGlzLmhhc0JlZW5GaWxsZWRfID0gdHJ1ZTsKCiAgICAvLyBEZXRhY2ggdGhlIGNvbnRlbnQgZWxlbWVudCBmcm9tIHRoZSBET00gYmVmb3JlIHBlcmZvcm1pbmcKICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBtb2RpZnlpbmcgdGhlIGxpdmUgRE9NIG11bHRpcGxlIHRpbWVzLgogICAgcGFyZW50RWwucmVtb3ZlQ2hpbGQoY29udGVudEVsKTsKICAgIHRoaXMuZW1wdHkoKTsKICAgIGluc2VydENvbnRlbnQoY29udGVudEVsLCBjb250ZW50KTsKICAgIC8qKgogICAgICogRmlyZWQganVzdCBhZnRlciBhIGBNb2RhbERpYWxvZ2AgaXMgZmlsbGVkIHdpdGggY29udGVudC4KICAgICAqCiAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjbW9kYWxmaWxsCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignbW9kYWxmaWxsJyk7CgogICAgLy8gUmUtaW5qZWN0IHRoZSByZS1maWxsZWQgY29udGVudCBlbGVtZW50LgogICAgaWYgKG5leHRTaWJsaW5nRWwpIHsKICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKGNvbnRlbnRFbCwgbmV4dFNpYmxpbmdFbCk7CiAgICB9IGVsc2UgewogICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChjb250ZW50RWwpOwogICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjbG9zZSBidXR0b24gaXMgbGFzdCBpbiB0aGUgZGlhbG9nIERPTQogICAgdmFyIGNsb3NlQnV0dG9uID0gdGhpcy5nZXRDaGlsZCgnY2xvc2VCdXR0b24nKTsKCiAgICBpZiAoY2xvc2VCdXR0b24pIHsKICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQoY2xvc2VCdXR0b24uZWxfKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBFbXB0aWVzIHRoZSBjb250ZW50IGVsZW1lbnQuIFRoaXMgaGFwcGVucyBhbnl0aW1lIHRoZSBtb2RhbCBpcyBmaWxsZWQuCiAgICoKICAgKiBAZmlyZXMgTW9kYWxEaWFsb2cjYmVmb3JlbW9kYWxlbXB0eQogICAqIEBmaXJlcyBNb2RhbERpYWxvZyNtb2RhbGVtcHR5CiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiBlbXB0eSgpIHsKICAgIC8qKgogICAgICogRmlyZWQganVzdCBiZWZvcmUgYSBgTW9kYWxEaWFsb2dgIGlzIGVtcHRpZWQuCiAgICAgKgogICAgICogQGV2ZW50IE1vZGFsRGlhbG9nI2JlZm9yZW1vZGFsZW1wdHkKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbGVtcHR5Jyk7CiAgICBlbXB0eUVsKHRoaXMuY29udGVudEVsKCkpOwoKICAgIC8qKgogICAgICogRmlyZWQganVzdCBhZnRlciBhIGBNb2RhbERpYWxvZ2AgaXMgZW1wdGllZC4KICAgICAqCiAgICAgKiBAZXZlbnQgTW9kYWxEaWFsb2cjbW9kYWxlbXB0eQogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCiAgICB0aGlzLnRyaWdnZXIoJ21vZGFsZW1wdHknKTsKICB9OwoKICAvKioKICAgKiBHZXRzIG9yIHNldHMgdGhlIG1vZGFsIGNvbnRlbnQsIHdoaWNoIGdldHMgbm9ybWFsaXplZCBiZWZvcmUgYmVpbmcKICAgKiByZW5kZXJlZCBpbnRvIHRoZSBET00uCiAgICoKICAgKiBUaGlzIGRvZXMgbm90IHVwZGF0ZSB0aGUgRE9NIG9yIGZpbGwgdGhlIG1vZGFsLCBidXQgaXQgaXMgY2FsbGVkIGR1cmluZwogICAqIHRoYXQgcHJvY2Vzcy4KICAgKgogICAqIEBwYXJhbSAge01peGVkfSBbdmFsdWVdCiAgICogICAgICAgICBJZiBkZWZpbmVkLCBzZXRzIHRoZSBpbnRlcm5hbCBjb250ZW50IHZhbHVlIHRvIGJlIHVzZWQgb24gdGhlCiAgICogICAgICAgICBuZXh0IGNhbGwocykgdG8gYGZpbGxgLiBUaGlzIHZhbHVlIGlzIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nCiAgICogICAgICAgICBpbnNlcnRlZC4gVG8gImNsZWFyIiB0aGUgaW50ZXJuYWwgY29udGVudCB2YWx1ZSwgcGFzcyBgbnVsbGAuCiAgICoKICAgKiBAcmV0dXJuIHtNaXhlZH0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIG1vZGFsIGRpYWxvZwogICAqLwoKCiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLmNvbnRlbnQgPSBmdW5jdGlvbiBjb250ZW50KHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykgewogICAgICB0aGlzLmNvbnRlbnRfID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb250ZW50XzsKICB9OwoKICAvKioKICAgKiBjb25kaXRpb25hbGx5IGZvY3VzIHRoZSBtb2RhbCBkaWFsb2cgaWYgZm9jdXMgd2FzIHByZXZpb3VzbHkgb24gdGhlIHBsYXllci4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY29uZGl0aW9uYWxGb2N1c18gPSBmdW5jdGlvbiBjb25kaXRpb25hbEZvY3VzXygpIHsKICAgIHZhciBhY3RpdmVFbCA9IGRvY3VtZW50XzEuYWN0aXZlRWxlbWVudDsKICAgIHZhciBwbGF5ZXJFbCA9IHRoaXMucGxheWVyXy5lbF87CgogICAgdGhpcy5wcmV2aW91c2x5QWN0aXZlRWxfID0gbnVsbDsKCiAgICBpZiAocGxheWVyRWwuY29udGFpbnMoYWN0aXZlRWwpIHx8IHBsYXllckVsID09PSBhY3RpdmVFbCkgewogICAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBhY3RpdmVFbDsKCiAgICAgIHRoaXMuZm9jdXMoKTsKCiAgICAgIHRoaXMub24oZG9jdW1lbnRfMSwgJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pOwogICAgfQogIH07CgogIC8qKgogICAqIGNvbmRpdGlvbmFsbHkgYmx1ciB0aGUgZWxlbWVudCBhbmQgcmVmb2N1cyB0aGUgbGFzdCBmb2N1c2VkIGVsZW1lbnQKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuY29uZGl0aW9uYWxCbHVyXyA9IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQmx1cl8oKSB7CiAgICBpZiAodGhpcy5wcmV2aW91c2x5QWN0aXZlRWxfKSB7CiAgICAgIHRoaXMucHJldmlvdXNseUFjdGl2ZUVsXy5mb2N1cygpOwogICAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsOwogICAgfQoKICAgIHRoaXMub2ZmKGRvY3VtZW50XzEsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTsKICB9OwoKICAvKioKICAgKiBLZXlkb3duIGhhbmRsZXIuIEF0dGFjaGVkIHdoZW4gbW9kYWwgaXMgZm9jdXNlZC4KICAgKgogICAqIEBsaXN0ZW5zIGtleWRvd24KICAgKi8KCgogIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkgewogICAgLy8gZXhpdCBlYXJseSBpZiBpdCBpc24ndCBhIHRhYiBrZXkKICAgIGlmIChldmVudC53aGljaCAhPT0gOSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGZvY3VzYWJsZUVscyA9IHRoaXMuZm9jdXNhYmxlRWxzXygpOwogICAgdmFyIGFjdGl2ZUVsID0gdGhpcy5lbF8ucXVlcnlTZWxlY3RvcignOmZvY3VzJyk7CiAgICB2YXIgZm9jdXNJbmRleCA9IHZvaWQgMDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvY3VzYWJsZUVscy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoYWN0aXZlRWwgPT09IGZvY3VzYWJsZUVsc1tpXSkgewogICAgICAgIGZvY3VzSW5kZXggPSBpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYgKGRvY3VtZW50XzEuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5lbF8pIHsKICAgICAgZm9jdXNJbmRleCA9IDA7CiAgICB9CgogICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGZvY3VzSW5kZXggPT09IDApIHsKICAgICAgZm9jdXNhYmxlRWxzW2ZvY3VzYWJsZUVscy5sZW5ndGggLSAxXS5mb2N1cygpOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgZm9jdXNJbmRleCA9PT0gZm9jdXNhYmxlRWxzLmxlbmd0aCAtIDEpIHsKICAgICAgZm9jdXNhYmxlRWxzWzBdLmZvY3VzKCk7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogZ2V0IGFsbCBmb2N1c2FibGUgZWxlbWVudHMKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBNb2RhbERpYWxvZy5wcm90b3R5cGUuZm9jdXNhYmxlRWxzXyA9IGZ1bmN0aW9uIGZvY3VzYWJsZUVsc18oKSB7CiAgICB2YXIgYWxsQ2hpbGRyZW4gPSB0aGlzLmVsXy5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7CgogICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhbGxDaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgIHJldHVybiAoY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3dfMS5IVE1MQW5jaG9yRWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIHdpbmRvd18xLkhUTUxBcmVhRWxlbWVudCkgJiYgY2hpbGQuaGFzQXR0cmlidXRlKCdocmVmJykgfHwgKGNoaWxkIGluc3RhbmNlb2Ygd2luZG93XzEuSFRNTElucHV0RWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIHdpbmRvd18xLkhUTUxTZWxlY3RFbGVtZW50IHx8IGNoaWxkIGluc3RhbmNlb2Ygd2luZG93XzEuSFRNTFRleHRBcmVhRWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIHdpbmRvd18xLkhUTUxCdXR0b25FbGVtZW50KSAmJiAhY2hpbGQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IGNoaWxkIGluc3RhbmNlb2Ygd2luZG93XzEuSFRNTElGcmFtZUVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiB3aW5kb3dfMS5IVE1MT2JqZWN0RWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIHdpbmRvd18xLkhUTUxFbWJlZEVsZW1lbnQgfHwgY2hpbGQuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpICYmIGNoaWxkLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSAhPT0gLTEgfHwgY2hpbGQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTsKICAgIH0pOwogIH07CgogIHJldHVybiBNb2RhbERpYWxvZzsKfShDb21wb25lbnQpOwoKLyoqCiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgYE1vZGFsRGlhbG9nYCBkZWZhdWx0IG9wdGlvbnMuCiAqCiAqIEB0eXBlIHtPYmplY3R9CiAqIEBwcml2YXRlCiAqLwoKCk1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcHRpb25zXyA9IHsKICBwYXVzZU9uT3BlbjogdHJ1ZSwKICB0ZW1wb3Jhcnk6IHRydWUKfTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTW9kYWxEaWFsb2cnLCBNb2RhbERpYWxvZyk7CgovKioKICogQGZpbGUgdHJhY2stbGlzdC5qcwogKi8KLyoqCiAqIENvbW1vbiBmdW5jdGlvbmFsaXkgYmV0d2VlbiB7QGxpbmsgVGV4dFRyYWNrTGlzdH0sIHtAbGluayBBdWRpb1RyYWNrTGlzdH0sIGFuZAogKiB7QGxpbmsgVmlkZW9UcmFja0xpc3R9CiAqCiAqIEBleHRlbmRzIEV2ZW50VGFyZ2V0CiAqLwoKdmFyIFRyYWNrTGlzdCA9IGZ1bmN0aW9uIChfRXZlbnRUYXJnZXQpIHsKICBpbmhlcml0cyhUcmFja0xpc3QsIF9FdmVudFRhcmdldCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCiAgICoKICAgKiBAcGFyYW0ge1RyYWNrW119IHRyYWNrcwogICAqICAgICAgICBBIGxpc3Qgb2YgdHJhY2tzIHRvIGluaXRpYWxpemUgdGhlIGxpc3Qgd2l0aC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbbGlzdF0KICAgKiAgICAgICAgVGhlIGNoaWxkIG9iamVjdCB3aXRoIGluaGVyaXRhbmNlIGRvbmUgbWFudWFsbHkgZm9yIGllOC4KICAgKgogICAqIEBhYnN0cmFjdAogICAqLwogIGZ1bmN0aW9uIFRyYWNrTGlzdCgpIHsKICAgIHZhciB0cmFja3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdOwoKICAgIHZhciBfcmV0OwoKICAgIHZhciBsaXN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsOwogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhY2tMaXN0KTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FdmVudFRhcmdldC5jYWxsKHRoaXMpKTsKCiAgICBpZiAoIWxpc3QpIHsKICAgICAgbGlzdCA9IF90aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lCiAgICAgIGlmIChJU19JRTgpIHsKICAgICAgICBsaXN0ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTsKICAgICAgICBmb3IgKHZhciBwcm9wIGluIFRyYWNrTGlzdC5wcm90b3R5cGUpIHsKICAgICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7CiAgICAgICAgICAgIGxpc3RbcHJvcF0gPSBUcmFja0xpc3QucHJvdG90eXBlW3Byb3BdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGxpc3QudHJhY2tzXyA9IFtdOwoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIFRyYWNrTGlzdAogICAgICogQG1lbWJlciB7bnVtYmVyfSBsZW5ndGgKICAgICAqICAgICAgICAgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGBUcmFja2BzIGluIHRoZSB0aGlzIFRyYWNraXN0LgogICAgICogQGluc3RhbmNlCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsaXN0LCAnbGVuZ3RoJywgewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHsKICAgICAgICByZXR1cm4gdGhpcy50cmFja3NfLmxlbmd0aDsKICAgICAgfQogICAgfSk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgbGlzdC5hZGRUcmFjayh0cmFja3NbaV0pOwogICAgfQoKICAgIC8vIG11c3QgcmV0dXJuIHRoZSBvYmplY3QsIGFzIGZvciBpZTggaXQgd2lsbCBub3QgYmUgdGhpcwogICAgLy8gYnV0IGEgcmVmZXJlbmNlIHRvIGEgZG9jdW1lbnQgb2JqZWN0CiAgICByZXR1cm4gX3JldCA9IGxpc3QsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpOwogIH0KCiAgLyoqCiAgICogQWRkIGEge0BsaW5rIFRyYWNrfSB0byB0aGUgYFRyYWNrTGlzdGAKICAgKgogICAqIEBwYXJhbSB7VHJhY2t9IHRyYWNrCiAgICogICAgICAgIFRoZSBhdWRpbywgdmlkZW8sIG9yIHRleHQgdHJhY2sgdG8gYWRkIHRvIHRoZSBsaXN0LgogICAqCiAgICogQGZpcmVzIFRyYWNrTGlzdCNhZGR0cmFjawogICAqLwoKCiAgVHJhY2tMaXN0LnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uIGFkZFRyYWNrKHRyYWNrKSB7CiAgICB2YXIgaW5kZXggPSB0aGlzLnRyYWNrc18ubGVuZ3RoOwoKICAgIGlmICghKCcnICsgaW5kZXggaW4gdGhpcykpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGluZGV4LCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy50cmFja3NfW2luZGV4XTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIHRyYWNrcwogICAgaWYgKHRoaXMudHJhY2tzXy5pbmRleE9mKHRyYWNrKSA9PT0gLTEpIHsKICAgICAgdGhpcy50cmFja3NfLnB1c2godHJhY2spOwogICAgICAvKioKICAgICAgICogVHJpZ2dlcmVkIHdoZW4gYSB0cmFjayBpcyBhZGRlZCB0byBhIHRyYWNrIGxpc3QuCiAgICAgICAqCiAgICAgICAqIEBldmVudCBUcmFja0xpc3QjYWRkdHJhY2sKICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgKiBAcHJvcGVydHkge1RyYWNrfSB0cmFjawogICAgICAgKiAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gdHJhY2sgdGhhdCB3YXMgYWRkZWQuCiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoewogICAgICAgIHRyYWNrOiB0cmFjaywKICAgICAgICB0eXBlOiAnYWRkdHJhY2snCiAgICAgIH0pOwogICAgfQogIH07CgogIC8qKgogICAqIFJlbW92ZSBhIHtAbGluayBUcmFja30gZnJvbSB0aGUgYFRyYWNrTGlzdGAKICAgKgogICAqIEBwYXJhbSB7VHJhY2t9IHJ0cmFjawogICAqICAgICAgICBUaGUgYXVkaW8sIHZpZGVvLCBvciB0ZXh0IHRyYWNrIHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0LgogICAqCiAgICogQGZpcmVzIFRyYWNrTGlzdCNyZW1vdmV0cmFjawogICAqLwoKCiAgVHJhY2tMaXN0LnByb3RvdHlwZS5yZW1vdmVUcmFjayA9IGZ1bmN0aW9uIHJlbW92ZVRyYWNrKHJ0cmFjaykgewogICAgdmFyIHRyYWNrID0gdm9pZCAwOwoKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgaWYgKHRoaXNbaV0gPT09IHJ0cmFjaykgewogICAgICAgIHRyYWNrID0gdGhpc1tpXTsKICAgICAgICBpZiAodHJhY2sub2ZmKSB7CiAgICAgICAgICB0cmFjay5vZmYoKTsKICAgICAgICB9CgogICAgICAgIHRoaXMudHJhY2tzXy5zcGxpY2UoaSwgMSk7CgogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgaWYgKCF0cmFjaykgewogICAgICByZXR1cm47CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0cmFjayBsaXN0LgogICAgICoKICAgICAqIEBldmVudCBUcmFja0xpc3QjcmVtb3ZldHJhY2sKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqIEBwcm9wZXJ0eSB7VHJhY2t9IHRyYWNrCiAgICAgKiAgICAgICAgICAgQSByZWZlcmVuY2UgdG8gdHJhY2sgdGhhdCB3YXMgcmVtb3ZlZC4KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKHsKICAgICAgdHJhY2s6IHRyYWNrLAogICAgICB0eXBlOiAncmVtb3ZldHJhY2snCiAgICB9KTsKICB9OwoKICAvKioKICAgKiBHZXQgYSBUcmFjayBmcm9tIHRoZSBUcmFja0xpc3QgYnkgYSB0cmFja3MgaWQKICAgKgogICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIHRoZSBpZCBvZiB0aGUgdHJhY2sgdG8gZ2V0CiAgICogQG1ldGhvZCBnZXRUcmFja0J5SWQKICAgKiBAcmV0dXJuIHtUcmFja30KICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgVHJhY2tMaXN0LnByb3RvdHlwZS5nZXRUcmFja0J5SWQgPSBmdW5jdGlvbiBnZXRUcmFja0J5SWQoaWQpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHRyYWNrID0gdGhpc1tpXTsKCiAgICAgIGlmICh0cmFjay5pZCA9PT0gaWQpIHsKICAgICAgICByZXN1bHQgPSB0cmFjazsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgcmV0dXJuIFRyYWNrTGlzdDsKfShFdmVudFRhcmdldCk7CgovKioKICogVHJpZ2dlcmVkIHdoZW4gYSBkaWZmZXJlbnQgdHJhY2sgaXMgc2VsZWN0ZWQvZW5hYmxlZC4KICoKICogQGV2ZW50IFRyYWNrTGlzdCNjaGFuZ2UKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KCi8qKgogKiBFdmVudHMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggb24gKyBldmVudE5hbWUuIFNlZSB7QGxpbmsgRXZlbnRIYW5kbGVyfS4KICoKICogQHByb3BlcnR5IHtPYmplY3R9IFRyYWNrTGlzdCNhbGxvd2VkRXZlbnRzXwogKiBAcHJpdmF0ZQogKi8KCgpUcmFja0xpc3QucHJvdG90eXBlLmFsbG93ZWRFdmVudHNfID0gewogIGNoYW5nZTogJ2NoYW5nZScsCiAgYWRkdHJhY2s6ICdhZGR0cmFjaycsCiAgcmVtb3ZldHJhY2s6ICdyZW1vdmV0cmFjaycKfTsKCi8vIGVtdWxhdGUgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBzdXBwb3J0IHRvIGFsbG93IGZvciBmZWF0dXJlIGRldGVjdGlvbgpmb3IgKHZhciBldmVudCBpbiBUcmFja0xpc3QucHJvdG90eXBlLmFsbG93ZWRFdmVudHNfKSB7CiAgVHJhY2tMaXN0LnByb3RvdHlwZVsnb24nICsgZXZlbnRdID0gbnVsbDsKfQoKLyoqCiAqIEBmaWxlIGF1ZGlvLXRyYWNrLWxpc3QuanMKICovCi8qKgogKiBBbnl3aGVyZSB3ZSBjYWxsIHRoaXMgZnVuY3Rpb24gd2UgZGl2ZXJnZSBmcm9tIHRoZSBzcGVjCiAqIGFzIHdlIG9ubHkgc3VwcG9ydCBvbmUgZW5hYmxlZCBhdWRpb3RyYWNrIGF0IGEgdGltZQogKgogKiBAcGFyYW0ge0F1ZGlvVHJhY2tMaXN0fSBsaXN0CiAqICAgICAgICBsaXN0IHRvIHdvcmsgb24KICoKICogQHBhcmFtIHtBdWRpb1RyYWNrfSB0cmFjawogKiAgICAgICAgVGhlIHRyYWNrIHRvIHNraXAKICoKICogQHByaXZhdGUKICovCnZhciBkaXNhYmxlT3RoZXJzID0gZnVuY3Rpb24gZGlzYWJsZU90aGVycyhsaXN0LCB0cmFjaykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgaWYgKCFPYmplY3Qua2V5cyhsaXN0W2ldKS5sZW5ndGggfHwgdHJhY2suaWQgPT09IGxpc3RbaV0uaWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICAvLyBhbm90aGVyIGF1ZGlvIHRyYWNrIGlzIGVuYWJsZWQsIGRpc2FibGUgaXQKICAgIGxpc3RbaV0uZW5hYmxlZCA9IGZhbHNlOwogIH0KfTsKCi8qKgogKiBUaGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBBdWRpb1RyYWNrfSBmb3IgYSBtZWRpYSBmaWxlLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjYXVkaW90cmFja2xpc3R9CiAqIEBleHRlbmRzIFRyYWNrTGlzdAogKi8KCnZhciBBdWRpb1RyYWNrTGlzdCA9IGZ1bmN0aW9uIChfVHJhY2tMaXN0KSB7CiAgaW5oZXJpdHMoQXVkaW9UcmFja0xpc3QsIF9UcmFja0xpc3QpOwoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7QXVkaW9UcmFja1tdfSBbdHJhY2tzPVtdXQogICAqICAgICAgICBBIGxpc3Qgb2YgYEF1ZGlvVHJhY2tgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguCiAgICovCiAgZnVuY3Rpb24gQXVkaW9UcmFja0xpc3QoKSB7CiAgICB2YXIgX3RoaXMsIF9yZXQ7CgogICAgdmFyIHRyYWNrcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBdWRpb1RyYWNrTGlzdCk7CgogICAgdmFyIGxpc3QgPSB2b2lkIDA7CgogICAgLy8gbWFrZSBzdXJlIG9ubHkgMSB0cmFjayBpcyBlbmFibGVkCiAgICAvLyBzb3J0ZWQgZnJvbSBsYXN0IGluZGV4IHRvIGZpcnN0IGluZGV4CiAgICBmb3IgKHZhciBpID0gdHJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGlmICh0cmFja3NbaV0uZW5hYmxlZCkgewogICAgICAgIGRpc2FibGVPdGhlcnModHJhY2tzLCB0cmFja3NbaV0pOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgLy8gSUU4IGZvcmNlcyB1cyB0byBpbXBsZW1lbnQgaW5oZXJpdGFuY2Ugb3Vyc2VsdmVzCiAgICAvLyBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBwcm9wZXJseQogICAgaWYgKElTX0lFOCkgewogICAgICBsaXN0ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHsKICAgICAgICAgIGxpc3RbcHJvcF0gPSBUcmFja0xpc3QucHJvdG90eXBlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHZhciBfcHJvcCBpbiBBdWRpb1RyYWNrTGlzdC5wcm90b3R5cGUpIHsKICAgICAgICBpZiAoX3Byb3AgIT09ICdjb25zdHJ1Y3RvcicpIHsKICAgICAgICAgIGxpc3RbX3Byb3BdID0gQXVkaW9UcmFja0xpc3QucHJvdG90eXBlW19wcm9wXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBsaXN0ID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tMaXN0LmNhbGwodGhpcywgdHJhY2tzLCBsaXN0KSksIF90aGlzKTsKICAgIGxpc3QuY2hhbmdpbmdfID0gZmFsc2U7CgogICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTsKICB9CgogIC8qKgogICAqIEFkZCBhbiB7QGxpbmsgQXVkaW9UcmFja30gdG8gdGhlIGBBdWRpb1RyYWNrTGlzdGAuCiAgICoKICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2t9IHRyYWNrCiAgICogICAgICAgIFRoZSBBdWRpb1RyYWNrIHRvIGFkZCB0byB0aGUgbGlzdAogICAqCiAgICogQGZpcmVzIFRyYWNrTGlzdCNhZGR0cmFjawogICAqLwoKCiAgQXVkaW9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrID0gZnVuY3Rpb24gYWRkVHJhY2sodHJhY2spIHsKICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgIGlmICh0cmFjay5lbmFibGVkKSB7CiAgICAgIGRpc2FibGVPdGhlcnModGhpcywgdHJhY2spOwogICAgfQoKICAgIF9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrLmNhbGwodGhpcywgdHJhY2spOwogICAgLy8gbmF0aXZlIHRyYWNrcyBkb24ndCBoYXZlIHRoaXMKICAgIGlmICghdHJhY2suYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICByZXR1cm47CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGlzdGVucyBBdWRpb1RyYWNrI2VuYWJsZWRjaGFuZ2UKICAgICAqIEBmaXJlcyBUcmFja0xpc3QjY2hhbmdlCiAgICAgKi8KICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2VuYWJsZWRjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIC8vIHdoZW4gd2UgYXJlIGRpc2FibGluZyBvdGhlciB0cmFja3MgKHNpbmNlIHdlIGRvbid0IHN1cHBvcnQKICAgICAgLy8gbW9yZSB0aGFuIG9uZSB0cmFjayBhdCBhIHRpbWUpIHdlIHdpbGwgc2V0IGNoYW5naW5nXwogICAgICAvLyB0byB0cnVlIHNvIHRoYXQgd2UgZG9uJ3QgdHJpZ2dlciBhZGRpdGlvbmFsIGNoYW5nZSBldmVudHMKICAgICAgaWYgKF90aGlzMi5jaGFuZ2luZ18pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgX3RoaXMyLmNoYW5naW5nXyA9IHRydWU7CiAgICAgIGRpc2FibGVPdGhlcnMoX3RoaXMyLCB0cmFjayk7CiAgICAgIF90aGlzMi5jaGFuZ2luZ18gPSBmYWxzZTsKICAgICAgX3RoaXMyLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIEF1ZGlvVHJhY2tMaXN0Owp9KFRyYWNrTGlzdCk7CgovKioKICogQGZpbGUgdmlkZW8tdHJhY2stbGlzdC5qcwogKi8KLyoqCiAqIFVuLXNlbGVjdCBhbGwgb3RoZXIge0BsaW5rIFZpZGVvVHJhY2t9cyB0aGF0IGFyZSBzZWxlY3RlZC4KICoKICogQHBhcmFtIHtWaWRlb1RyYWNrTGlzdH0gbGlzdAogKiAgICAgICAgbGlzdCB0byB3b3JrIG9uCiAqCiAqIEBwYXJhbSB7VmlkZW9UcmFja30gdHJhY2sKICogICAgICAgIFRoZSB0cmFjayB0byBza2lwCiAqCiAqIEBwcml2YXRlCiAqLwp2YXIgZGlzYWJsZU90aGVycyQxID0gZnVuY3Rpb24gZGlzYWJsZU90aGVycyhsaXN0LCB0cmFjaykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgaWYgKCFPYmplY3Qua2V5cyhsaXN0W2ldKS5sZW5ndGggfHwgdHJhY2suaWQgPT09IGxpc3RbaV0uaWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICAvLyBhbm90aGVyIHZpZGVvIHRyYWNrIGlzIGVuYWJsZWQsIGRpc2FibGUgaXQKICAgIGxpc3RbaV0uc2VsZWN0ZWQgPSBmYWxzZTsKICB9Cn07CgovKioKICogVGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgVmlkZW9UcmFja30gZm9yIGEgdmlkZW8uCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN2aWRlb3RyYWNrbGlzdH0KICogQGV4dGVuZHMgVHJhY2tMaXN0CiAqLwoKdmFyIFZpZGVvVHJhY2tMaXN0ID0gZnVuY3Rpb24gKF9UcmFja0xpc3QpIHsKICBpbmhlcml0cyhWaWRlb1RyYWNrTGlzdCwgX1RyYWNrTGlzdCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtWaWRlb1RyYWNrW119IFt0cmFja3M9W11dCiAgICogICAgICAgIEEgbGlzdCBvZiBgVmlkZW9UcmFja2AgdG8gaW5zdGFudGlhdGUgdGhlIGxpc3Qgd2l0aC4KICAgKi8KICBmdW5jdGlvbiBWaWRlb1RyYWNrTGlzdCgpIHsKICAgIHZhciBfdGhpcywgX3JldDsKCiAgICB2YXIgdHJhY2tzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZGVvVHJhY2tMaXN0KTsKCiAgICB2YXIgbGlzdCA9IHZvaWQgMDsKCiAgICAvLyBtYWtlIHN1cmUgb25seSAxIHRyYWNrIGlzIGVuYWJsZWQKICAgIC8vIHNvcnRlZCBmcm9tIGxhc3QgaW5kZXggdG8gZmlyc3QgaW5kZXgKICAgIGZvciAodmFyIGkgPSB0cmFja3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgaWYgKHRyYWNrc1tpXS5zZWxlY3RlZCkgewogICAgICAgIGRpc2FibGVPdGhlcnMkMSh0cmFja3MsIHRyYWNrc1tpXSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJRTggZm9yY2VzIHVzIHRvIGltcGxlbWVudCBpbmhlcml0YW5jZSBvdXJzZWx2ZXMKICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5CiAgICBpZiAoSVNfSUU4KSB7CiAgICAgIGxpc3QgPSBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpOwogICAgICBmb3IgKHZhciBwcm9wIGluIFRyYWNrTGlzdC5wcm90b3R5cGUpIHsKICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykgewogICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodmFyIF9wcm9wIGluIFZpZGVvVHJhY2tMaXN0LnByb3RvdHlwZSkgewogICAgICAgIGlmIChfcHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykgewogICAgICAgICAgbGlzdFtfcHJvcF0gPSBWaWRlb1RyYWNrTGlzdC5wcm90b3R5cGVbX3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGxpc3QgPSAoX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UcmFja0xpc3QuY2FsbCh0aGlzLCB0cmFja3MsIGxpc3QpKSwgX3RoaXMpOwogICAgbGlzdC5jaGFuZ2luZ18gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEBtZW1iZXIge251bWJlcn0gVmlkZW9UcmFja0xpc3Qjc2VsZWN0ZWRJbmRleAogICAgICogICAgICAgICBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgc2VsZWN0ZWQge0BsaW5rIFZpZGVvVHJhY2tgfS4KICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3QsICdzZWxlY3RlZEluZGV4JywgewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHsKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIGlmICh0aGlzW19pXS5zZWxlY3RlZCkgewogICAgICAgICAgICByZXR1cm4gX2k7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoKSB7fQogICAgfSk7CgogICAgcmV0dXJuIF9yZXQgPSBsaXN0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTsKICB9CgogIC8qKgogICAqIEFkZCBhIHtAbGluayBWaWRlb1RyYWNrfSB0byB0aGUgYFZpZGVvVHJhY2tMaXN0YC4KICAgKgogICAqIEBwYXJhbSB7VmlkZW9UcmFja30gdHJhY2sKICAgKiAgICAgICAgVGhlIFZpZGVvVHJhY2sgdG8gYWRkIHRvIHRoZSBsaXN0CiAgICoKICAgKiBAZmlyZXMgVHJhY2tMaXN0I2FkZHRyYWNrCiAgICovCgoKICBWaWRlb1RyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2sgPSBmdW5jdGlvbiBhZGRUcmFjayh0cmFjaykgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgaWYgKHRyYWNrLnNlbGVjdGVkKSB7CiAgICAgIGRpc2FibGVPdGhlcnMkMSh0aGlzLCB0cmFjayk7CiAgICB9CgogICAgX1RyYWNrTGlzdC5wcm90b3R5cGUuYWRkVHJhY2suY2FsbCh0aGlzLCB0cmFjayk7CiAgICAvLyBuYXRpdmUgdHJhY2tzIGRvbid0IGhhdmUgdGhpcwogICAgaWYgKCF0cmFjay5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaXN0ZW5zIFZpZGVvVHJhY2sjc2VsZWN0ZWRjaGFuZ2UKICAgICAqIEBmaXJlcyBUcmFja0xpc3QjY2hhbmdlCiAgICAgKi8KICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGVkY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAoX3RoaXMyLmNoYW5naW5nXykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfdGhpczIuY2hhbmdpbmdfID0gdHJ1ZTsKICAgICAgZGlzYWJsZU90aGVycyQxKF90aGlzMiwgdHJhY2spOwogICAgICBfdGhpczIuY2hhbmdpbmdfID0gZmFsc2U7CiAgICAgIF90aGlzMi50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgIH0pOwogIH07CgogIHJldHVybiBWaWRlb1RyYWNrTGlzdDsKfShUcmFja0xpc3QpOwoKLyoqCiAqIEBmaWxlIHRleHQtdHJhY2stbGlzdC5qcwogKi8KLyoqCiAqIFRoZSBjdXJyZW50IGxpc3Qgb2Yge0BsaW5rIFRleHRUcmFja30gZm9yIGEgbWVkaWEgZmlsZS4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja2xpc3R9CiAqIEBleHRlbmRzIFRyYWNrTGlzdAogKi8KCnZhciBUZXh0VHJhY2tMaXN0ID0gZnVuY3Rpb24gKF9UcmFja0xpc3QpIHsKICBpbmhlcml0cyhUZXh0VHJhY2tMaXN0LCBfVHJhY2tMaXN0KTsKCiAgLyoqCiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1RleHRUcmFja1tdfSBbdHJhY2tzPVtdXQogICAqICAgICAgICBBIGxpc3Qgb2YgYFRleHRUcmFja2AgdG8gaW5zdGFudGlhdGUgdGhlIGxpc3Qgd2l0aC4KICAgKi8KICBmdW5jdGlvbiBUZXh0VHJhY2tMaXN0KCkgewogICAgdmFyIF90aGlzLCBfcmV0OwoKICAgIHZhciB0cmFja3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdOwogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFRyYWNrTGlzdCk7CgogICAgdmFyIGxpc3QgPSB2b2lkIDA7CgogICAgLy8gSUU4IGZvcmNlcyB1cyB0byBpbXBsZW1lbnQgaW5oZXJpdGFuY2Ugb3Vyc2VsdmVzCiAgICAvLyBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBwcm9wZXJseQogICAgaWYgKElTX0lFOCkgewogICAgICBsaXN0ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHsKICAgICAgICAgIGxpc3RbcHJvcF0gPSBUcmFja0xpc3QucHJvdG90eXBlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHZhciBfcHJvcCBpbiBUZXh0VHJhY2tMaXN0LnByb3RvdHlwZSkgewogICAgICAgIGlmIChfcHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykgewogICAgICAgICAgbGlzdFtfcHJvcF0gPSBUZXh0VHJhY2tMaXN0LnByb3RvdHlwZVtfcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgbGlzdCA9IChfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrTGlzdC5jYWxsKHRoaXMsIHRyYWNrcywgbGlzdCkpLCBfdGhpcyk7CiAgICByZXR1cm4gX3JldCA9IGxpc3QsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpOwogIH0KCiAgLyoqCiAgICogQWRkIGEge0BsaW5rIFRleHRUcmFja30gdG8gdGhlIGBUZXh0VHJhY2tMaXN0YAogICAqCiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrCiAgICogICAgICAgIFRoZSB0ZXh0IHRyYWNrIHRvIGFkZCB0byB0aGUgbGlzdC4KICAgKgogICAqIEBmaXJlcyBUcmFja0xpc3QjYWRkdHJhY2sKICAgKi8KCgogIFRleHRUcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrID0gZnVuY3Rpb24gYWRkVHJhY2sodHJhY2spIHsKICAgIF9UcmFja0xpc3QucHJvdG90eXBlLmFkZFRyYWNrLmNhbGwodGhpcywgdHJhY2spOwoKICAgIC8qKgogICAgICogQGxpc3RlbnMgVGV4dFRyYWNrI21vZGVjaGFuZ2UKICAgICAqIEBmaXJlcyBUcmFja0xpc3QjY2hhbmdlCiAgICAgKi8KICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgIH0pKTsKCiAgICB2YXIgbm9uTGFuZ3VhZ2VUZXh0VHJhY2tLaW5kID0gWydtZXRhZGF0YScsICdjaGFwdGVycyddOwoKICAgIGlmIChub25MYW5ndWFnZVRleHRUcmFja0tpbmQuaW5kZXhPZih0cmFjay5raW5kKSA9PT0gLTEpIHsKICAgICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignbW9kZWNoYW5nZScsIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMudHJpZ2dlcignc2VsZWN0ZWRsYW5ndWFnZWNoYW5nZScpOwogICAgICB9KSk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFRleHRUcmFja0xpc3Q7Cn0oVHJhY2tMaXN0KTsKCi8qKgogKiBAZmlsZSBodG1sLXRyYWNrLWVsZW1lbnQtbGlzdC5qcwogKi8KCi8qKgogKiBUaGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBIdG1sVHJhY2tFbGVtZW50fXMuCiAqLwoKdmFyIEh0bWxUcmFja0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gKCkgewoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7SHRtbFRyYWNrRWxlbWVudFtdfSBbdHJhY2tzPVtdXQogICAqICAgICAgICBBIGxpc3Qgb2YgYEh0bWxUcmFja0VsZW1lbnRgIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGguCiAgICovCiAgZnVuY3Rpb24gSHRtbFRyYWNrRWxlbWVudExpc3QoKSB7CiAgICB2YXIgdHJhY2tFbGVtZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIdG1sVHJhY2tFbGVtZW50TGlzdCk7CgogICAgdmFyIGxpc3QgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lCgogICAgaWYgKElTX0lFOCkgewogICAgICBsaXN0ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTsKCiAgICAgIGZvciAodmFyIHByb3AgaW4gSHRtbFRyYWNrRWxlbWVudExpc3QucHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHsKICAgICAgICAgIGxpc3RbcHJvcF0gPSBIdG1sVHJhY2tFbGVtZW50TGlzdC5wcm90b3R5cGVbcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgbGlzdC50cmFja0VsZW1lbnRzXyA9IFtdOwoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIEh0bWxUcmFja0VsZW1lbnRMaXN0CiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9IGxlbmd0aAogICAgICogICAgICAgICBUaGUgY3VycmVudCBudW1iZXIgb2YgYFRyYWNrYHMgaW4gdGhlIHRoaXMgVHJhY2tpc3QuCiAgICAgKiBAaW5zdGFuY2UKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3QsICdsZW5ndGgnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkgewogICAgICAgIHJldHVybiB0aGlzLnRyYWNrRWxlbWVudHNfLmxlbmd0aDsKICAgICAgfQogICAgfSk7CgogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRyYWNrRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgbGlzdC5hZGRUcmFja0VsZW1lbnRfKHRyYWNrRWxlbWVudHNbaV0pOwogICAgfQoKICAgIGlmIChJU19JRTgpIHsKICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGQgYW4ge0BsaW5rIEh0bWxUcmFja0VsZW1lbnR9IHRvIHRoZSBgSHRtbFRyYWNrRWxlbWVudExpc3RgCiAgICoKICAgKiBAcGFyYW0ge0h0bWxUcmFja0VsZW1lbnR9IHRyYWNrRWxlbWVudAogICAqICAgICAgICBUaGUgdHJhY2sgZWxlbWVudCB0byBhZGQgdG8gdGhlIGxpc3QuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgSHRtbFRyYWNrRWxlbWVudExpc3QucHJvdG90eXBlLmFkZFRyYWNrRWxlbWVudF8gPSBmdW5jdGlvbiBhZGRUcmFja0VsZW1lbnRfKHRyYWNrRWxlbWVudCkgewogICAgdmFyIGluZGV4ID0gdGhpcy50cmFja0VsZW1lbnRzXy5sZW5ndGg7CgogICAgaWYgKCEoJycgKyBpbmRleCBpbiB0aGlzKSkgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaW5kZXgsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnRyYWNrRWxlbWVudHNfW2luZGV4XTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIGVsZW1lbnRzCiAgICBpZiAodGhpcy50cmFja0VsZW1lbnRzXy5pbmRleE9mKHRyYWNrRWxlbWVudCkgPT09IC0xKSB7CiAgICAgIHRoaXMudHJhY2tFbGVtZW50c18ucHVzaCh0cmFja0VsZW1lbnQpOwogICAgfQogIH07CgogIC8qKgogICAqIEdldCBhbiB7QGxpbmsgSHRtbFRyYWNrRWxlbWVudH0gZnJvbSB0aGUgYEh0bWxUcmFja0VsZW1lbnRMaXN0YCBnaXZlbiBhbgogICAqIHtAbGluayBUZXh0VHJhY2t9LgogICAqCiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrCiAgICogICAgICAgIFRoZSB0cmFjayBhc3NvY2lhdGVkIHdpdGggYSB0cmFjayBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7SHRtbFRyYWNrRWxlbWVudHx1bmRlZmluZWR9CiAgICogICAgICAgICBUaGUgdHJhY2sgZWxlbWVudCB0aGF0IHdhcyBmb3VuZCBvciB1bmRlZmluZWQuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgSHRtbFRyYWNrRWxlbWVudExpc3QucHJvdG90eXBlLmdldFRyYWNrRWxlbWVudEJ5VHJhY2tfID0gZnVuY3Rpb24gZ2V0VHJhY2tFbGVtZW50QnlUcmFja18odHJhY2spIHsKICAgIHZhciB0cmFja0VsZW1lbnRfID0gdm9pZCAwOwoKICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLnRyYWNrRWxlbWVudHNfLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmFjayA9PT0gdGhpcy50cmFja0VsZW1lbnRzX1tpXS50cmFjaykgewogICAgICAgIHRyYWNrRWxlbWVudF8gPSB0aGlzLnRyYWNrRWxlbWVudHNfW2ldOwoKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cmFja0VsZW1lbnRfOwogIH07CgogIC8qKgogICAqIFJlbW92ZSBhIHtAbGluayBIdG1sVHJhY2tFbGVtZW50fSBmcm9tIHRoZSBgSHRtbFRyYWNrRWxlbWVudExpc3RgCiAgICoKICAgKiBAcGFyYW0ge0h0bWxUcmFja0VsZW1lbnR9IHRyYWNrRWxlbWVudAogICAqICAgICAgICBUaGUgdHJhY2sgZWxlbWVudCB0byByZW1vdmUgZnJvbSB0aGUgbGlzdC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBIdG1sVHJhY2tFbGVtZW50TGlzdC5wcm90b3R5cGUucmVtb3ZlVHJhY2tFbGVtZW50XyA9IGZ1bmN0aW9uIHJlbW92ZVRyYWNrRWxlbWVudF8odHJhY2tFbGVtZW50KSB7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy50cmFja0VsZW1lbnRzXy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAodHJhY2tFbGVtZW50ID09PSB0aGlzLnRyYWNrRWxlbWVudHNfW2ldKSB7CiAgICAgICAgdGhpcy50cmFja0VsZW1lbnRzXy5zcGxpY2UoaSwgMSk7CgogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfTsKCiAgcmV0dXJuIEh0bWxUcmFja0VsZW1lbnRMaXN0Owp9KCk7CgovKioKICogQGZpbGUgdGV4dC10cmFjay1jdWUtbGlzdC5qcwogKi8KLyoqCiAqIEB0eXBlZGVmIHtPYmplY3R9IFRleHRUcmFja0N1ZUxpc3R+VGV4dFRyYWNrQ3VlCiAqCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZAogKiAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBmb3IgdGhpcyB0ZXh0IHRyYWNrIGN1ZQogKgogKiBAcHJvcGVydHkge251bWJlcn0gc3RhcnRUaW1lCiAqICAgICAgICAgICBUaGUgc3RhcnQgdGltZSBmb3IgdGhpcyB0ZXh0IHRyYWNrIGN1ZQogKgogKiBAcHJvcGVydHkge251bWJlcn0gZW5kVGltZQogKiAgICAgICAgICAgVGhlIGVuZCB0aW1lIGZvciB0aGlzIHRleHQgdHJhY2sgY3VlCiAqCiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGF1c2VPbkV4aXQKICogICAgICAgICAgIFBhdXNlIHdoZW4gdGhlIGVuZCB0aW1lIGlzIHJlYWNoZWQgaWYgdHJ1ZS4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja2N1ZX0KICovCgovKioKICogQSBMaXN0IG9mIFRleHRUcmFja0N1ZXMuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2tjdWVsaXN0fQogKi8KCnZhciBUZXh0VHJhY2tDdWVMaXN0ID0gZnVuY3Rpb24gKCkgewoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4uCiAgICoKICAgKiBAcGFyYW0ge0FycmF5fSBjdWVzCiAgICogICAgICAgIEEgbGlzdCBvZiBjdWVzIHRvIGJlIGluaXRpYWxpemVkIHdpdGgKICAgKi8KICBmdW5jdGlvbiBUZXh0VHJhY2tDdWVMaXN0KGN1ZXMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja0N1ZUxpc3QpOwoKICAgIHZhciBsaXN0ID0gdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIGlmIChJU19JRTgpIHsKICAgICAgbGlzdCA9IGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7CgogICAgICBmb3IgKHZhciBwcm9wIGluIFRleHRUcmFja0N1ZUxpc3QucHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHsKICAgICAgICAgIGxpc3RbcHJvcF0gPSBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZVtwcm9wXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXy5jYWxsKGxpc3QsIGN1ZXMpOwoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIFRleHRUcmFja0N1ZUxpc3QKICAgICAqIEBtZW1iZXIge251bWJlcn0gbGVuZ3RoCiAgICAgKiAgICAgICAgIFRoZSBjdXJyZW50IG51bWJlciBvZiBgVGV4dFRyYWNrQ3VlYHMgaW4gdGhlIFRleHRUcmFja0N1ZUxpc3QuCiAgICAgKiBAaW5zdGFuY2UKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3QsICdsZW5ndGgnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aF87CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChJU19JRTgpIHsKICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CiAgfQoKICAvKioKICAgKiBBIHNldHRlciBmb3IgY3VlcyBpbiB0aGlzIGxpc3QuIENyZWF0ZXMgZ2V0dGVycwogICAqIGFuIGFuIGluZGV4IGZvciB0aGUgY3Vlcy4KICAgKgogICAqIEBwYXJhbSB7QXJyYXl9IGN1ZXMKICAgKiAgICAgICAgQW4gYXJyYXkgb2YgY3VlcyB0byBzZXQKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXyA9IGZ1bmN0aW9uIHNldEN1ZXNfKGN1ZXMpIHsKICAgIHZhciBvbGRMZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAwOwogICAgdmFyIGkgPSAwOwogICAgdmFyIGwgPSBjdWVzLmxlbmd0aDsKCiAgICB0aGlzLmN1ZXNfID0gY3VlczsKICAgIHRoaXMubGVuZ3RoXyA9IGN1ZXMubGVuZ3RoOwoKICAgIHZhciBkZWZpbmVQcm9wID0gZnVuY3Rpb24gZGVmaW5lUHJvcChpbmRleCkgewogICAgICBpZiAoISgnJyArIGluZGV4IGluIHRoaXMpKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICcnICsgaW5kZXgsIHsKICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jdWVzX1tpbmRleF07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKG9sZExlbmd0aCA8IGwpIHsKICAgICAgaSA9IG9sZExlbmd0aDsKCiAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgZGVmaW5lUHJvcC5jYWxsKHRoaXMsIGkpOwogICAgICB9CiAgICB9CiAgfTsKCiAgLyoqCiAgICogR2V0IGEgYFRleHRUcmFja0N1ZWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gdGhlIGBUZXh0VHJhY2tDdWVMaXN0YCBieSBpZC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBpZAogICAqICAgICAgICBUaGUgaWQgb2YgdGhlIGN1ZSB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IuCiAgICoKICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tDdWVMaXN0flRleHRUcmFja0N1ZXxudWxsfQogICAqICAgICAgICAgQSBzaW5nbGUgY3VlIG9yIG51bGwgaWYgbm9uZSB3YXMgZm91bmQuCiAgICovCgoKICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5nZXRDdWVCeUlkID0gZnVuY3Rpb24gZ2V0Q3VlQnlJZChpZCkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CgogICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY3VlID0gdGhpc1tpXTsKCiAgICAgIGlmIChjdWUuaWQgPT09IGlkKSB7CiAgICAgICAgcmVzdWx0ID0gY3VlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9OwoKICByZXR1cm4gVGV4dFRyYWNrQ3VlTGlzdDsKfSgpOwoKLyoqCiAqIEBmaWxlIHRyYWNrLWtpbmRzLmpzCiAqLwoKLyoqCiAqIEFsbCBwb3NzaWJsZSBgVmlkZW9UcmFja0tpbmRgcwogKgogKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tdmlkZW90cmFjay1raW5kCiAqIEB0eXBlZGVmIFZpZGVvVHJhY2t+S2luZAogKiBAZW51bQogKi8KdmFyIFZpZGVvVHJhY2tLaW5kID0gewogIGFsdGVybmF0aXZlOiAnYWx0ZXJuYXRpdmUnLAogIGNhcHRpb25zOiAnY2FwdGlvbnMnLAogIG1haW46ICdtYWluJywKICBzaWduOiAnc2lnbicsCiAgc3VidGl0bGVzOiAnc3VidGl0bGVzJywKICBjb21tZW50YXJ5OiAnY29tbWVudGFyeScKfTsKCi8qKgogKiBBbGwgcG9zc2libGUgYEF1ZGlvVHJhY2tLaW5kYHMKICoKICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLWF1ZGlvdHJhY2sta2luZAogKiBAdHlwZWRlZiBBdWRpb1RyYWNrfktpbmQKICogQGVudW0KICovCnZhciBBdWRpb1RyYWNrS2luZCA9IHsKICAnYWx0ZXJuYXRpdmUnOiAnYWx0ZXJuYXRpdmUnLAogICdkZXNjcmlwdGlvbnMnOiAnZGVzY3JpcHRpb25zJywKICAnbWFpbic6ICdtYWluJywKICAnbWFpbi1kZXNjJzogJ21haW4tZGVzYycsCiAgJ3RyYW5zbGF0aW9uJzogJ3RyYW5zbGF0aW9uJywKICAnY29tbWVudGFyeSc6ICdjb21tZW50YXJ5Jwp9OwoKLyoqCiAqIEFsbCBwb3NzaWJsZSBgVGV4dFRyYWNrS2luZGBzCiAqCiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS10ZXh0dHJhY2sta2luZAogKiBAdHlwZWRlZiBUZXh0VHJhY2t+S2luZAogKiBAZW51bQogKi8KdmFyIFRleHRUcmFja0tpbmQgPSB7CiAgc3VidGl0bGVzOiAnc3VidGl0bGVzJywKICBjYXB0aW9uczogJ2NhcHRpb25zJywKICBkZXNjcmlwdGlvbnM6ICdkZXNjcmlwdGlvbnMnLAogIGNoYXB0ZXJzOiAnY2hhcHRlcnMnLAogIG1ldGFkYXRhOiAnbWV0YWRhdGEnCn07CgovKioKICogQWxsIHBvc3NpYmxlIGBUZXh0VHJhY2tNb2RlYHMKICoKICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjdGV4dHRyYWNrbW9kZQogKiBAdHlwZWRlZiBUZXh0VHJhY2t+TW9kZQogKiBAZW51bQogKi8KdmFyIFRleHRUcmFja01vZGUgPSB7CiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsCiAgaGlkZGVuOiAnaGlkZGVuJywKICBzaG93aW5nOiAnc2hvd2luZycKfTsKCi8qKgogKiBAZmlsZSB0cmFjay5qcwogKi8KLyoqCiAqIEEgVHJhY2sgY2xhc3MgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgQXVkaW9UcmFja30sCiAqIHtAbGluayBWaWRlb1RyYWNrfSwgYW5kIHtAbGluayBUZXh0VHJhY2t9LgogKgogKiA+IE5vdGU6IFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5CiAqCiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbH0KICogQGV4dGVuZHMgRXZlbnRUYXJnZXQKICogQGFic3RyYWN0CiAqLwoKdmFyIFRyYWNrID0gZnVuY3Rpb24gKF9FdmVudFRhcmdldCkgewogIGluaGVyaXRzKFRyYWNrLCBfRXZlbnRUYXJnZXQpOwoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2luZD0nJ10KICAgKiAgICAgICAgQSB2YWxpZCBraW5kIGZvciB0aGUgdHJhY2sgdHlwZSB5b3UgYXJlIGNyZWF0aW5nLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmlkPSd2anNfdHJhY2tfJyArIEd1aWQubmV3R1VJRCgpXQogICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsPScnXQogICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYW5ndWFnZT0nJ10KICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KICBmdW5jdGlvbiBUcmFjaygpIHsKICAgIHZhciBfcmV0OwoKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYWNrKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FdmVudFRhcmdldC5jYWxsKHRoaXMpKTsKCiAgICB2YXIgdHJhY2sgPSBfdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIGlmIChJU19JRTgpIHsKICAgICAgdHJhY2sgPSBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpOwogICAgICBmb3IgKHZhciBwcm9wIGluIFRyYWNrLnByb3RvdHlwZSkgewogICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7CiAgICAgICAgICB0cmFja1twcm9wXSA9IFRyYWNrLnByb3RvdHlwZVtwcm9wXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdHJhY2tQcm9wcyA9IHsKICAgICAgaWQ6IG9wdGlvbnMuaWQgfHwgJ3Zqc190cmFja18nICsgbmV3R1VJRCgpLAogICAgICBraW5kOiBvcHRpb25zLmtpbmQgfHwgJycsCiAgICAgIGxhYmVsOiBvcHRpb25zLmxhYmVsIHx8ICcnLAogICAgICBsYW5ndWFnZTogb3B0aW9ucy5sYW5ndWFnZSB8fCAnJwogICAgfTsKCiAgICAvKioKICAgICAqIEBtZW1iZXJvZiBUcmFjawogICAgICogQG1lbWJlciB7c3RyaW5nfSBpZAogICAgICogICAgICAgICBUaGUgaWQgb2YgdGhpcyB0cmFjay4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24uCiAgICAgKiBAaW5zdGFuY2UKICAgICAqCiAgICAgKiBAcmVhZG9ubHkKICAgICAqLwoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIFRyYWNrCiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9IGtpbmQKICAgICAqICAgICAgICAgVGhlIGtpbmQgb2YgdHJhY2sgdGhhdCB0aGlzIGlzLiBDYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbi4KICAgICAqIEBpbnN0YW5jZQogICAgICoKICAgICAqIEByZWFkb25seQogICAgICovCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgVHJhY2sKICAgICAqIEBtZW1iZXIge3N0cmluZ30gbGFiZWwKICAgICAqICAgICAgICAgVGhlIGxhYmVsIG9mIHRoaXMgdHJhY2suIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uLgogICAgICogQGluc3RhbmNlCiAgICAgKgogICAgICogQHJlYWRvbmx5CiAgICAgKi8KCiAgICAvKioKICAgICAqIEBtZW1iZXJvZiBUcmFjawogICAgICogQG1lbWJlciB7c3RyaW5nfSBsYW5ndWFnZQogICAgICogICAgICAgICBUaGUgdHdvIGxldHRlciBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIHRyYWNrLiBDYW5ub3QgYmUgY2hhbmdlZCBhZnRlcgogICAgICogICAgICAgICBjcmVhdGlvbi4KICAgICAqIEBpbnN0YW5jZQogICAgICoKICAgICAqIEByZWFkb25seQogICAgICovCgogICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aoa2V5KSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFjaywga2V5LCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7CiAgICAgICAgICByZXR1cm4gdHJhY2tQcm9wc1trZXldOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEoKSB7fQogICAgICB9KTsKICAgIH07CgogICAgZm9yICh2YXIga2V5IGluIHRyYWNrUHJvcHMpIHsKICAgICAgX2xvb3Aoa2V5KTsKICAgIH0KCiAgICByZXR1cm4gX3JldCA9IHRyYWNrLCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTsKICB9CgogIHJldHVybiBUcmFjazsKfShFdmVudFRhcmdldCk7CgovKioKICogQGZpbGUgdXJsLmpzCiAqIEBtb2R1bGUgdXJsCiAqLwovKioKICogQHR5cGVkZWYge09iamVjdH0gdXJsOlVSTE9iamVjdAogKgogKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2wKICogICAgICAgICAgIFRoZSBwcm90b2NvbCBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC4KICoKICogQHByb3BlcnR5IHtzdHJpbmd9IGhvc3RuYW1lCiAqICAgICAgICAgICBUaGUgaG9zdG5hbWUgb2YgdGhlIHVybCB0aGF0IHdhcyBwYXJzZWQuCiAqCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwb3J0CiAqICAgICAgICAgICBUaGUgcG9ydCBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC4KICoKICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhuYW1lCiAqICAgICAgICAgICBUaGUgcGF0aG5hbWUgb2YgdGhlIHVybCB0aGF0IHdhcyBwYXJzZWQuCiAqCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWFyY2gKICogICAgICAgICAgIFRoZSBzZWFyY2ggcXVlcnkgb2YgdGhlIHVybCB0aGF0IHdhcyBwYXJzZWQuCiAqCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoYXNoCiAqICAgICAgICAgICBUaGUgaGFzaCBvZiB0aGUgdXJsIHRoYXQgd2FzIHBhcnNlZC4KICoKICogQHByb3BlcnR5IHtzdHJpbmd9IGhvc3QKICogICAgICAgICAgIFRoZSBob3N0IG9mIHRoZSB1cmwgdGhhdCB3YXMgcGFyc2VkLgogKi8KCi8qKgogKiBSZXNvbHZlIGFuZCBwYXJzZSB0aGUgZWxlbWVudHMgb2YgYSBVUkwuCiAqCiAqIEBwYXJhbSAge1N0cmluZ30gdXJsCiAqICAgICAgICAgVGhlIHVybCB0byBwYXJzZQogKgogKiBAcmV0dXJuIHt1cmw6VVJMT2JqZWN0fQogKiAgICAgICAgIEFuIG9iamVjdCBvZiB1cmwgZGV0YWlscwogKi8KdmFyIHBhcnNlVXJsID0gZnVuY3Rpb24gcGFyc2VVcmwodXJsKSB7CiAgdmFyIHByb3BzID0gWydwcm90b2NvbCcsICdob3N0bmFtZScsICdwb3J0JywgJ3BhdGhuYW1lJywgJ3NlYXJjaCcsICdoYXNoJywgJ2hvc3QnXTsKCiAgLy8gYWRkIHRoZSB1cmwgdG8gYW4gYW5jaG9yIGFuZCBsZXQgdGhlIGJyb3dzZXIgcGFyc2UgdGhlIFVSTAogIHZhciBhID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdhJyk7CgogIGEuaHJlZiA9IHVybDsKCiAgLy8gSUU4IChhbmQgOT8pIEZpeAogIC8vIGllOCBkb2Vzbid0IHBhcnNlIHRoZSBVUkwgY29ycmVjdGx5IHVudGlsIHRoZSBhbmNob3IgaXMgYWN0dWFsbHkKICAvLyBhZGRlZCB0byB0aGUgYm9keSwgYW5kIGFuIGlubmVySFRNTCBpcyBuZWVkZWQgdG8gdHJpZ2dlciB0aGUgcGFyc2luZwogIHZhciBhZGRUb0JvZHkgPSBhLmhvc3QgPT09ICcnICYmIGEucHJvdG9jb2wgIT09ICdmaWxlOic7CiAgdmFyIGRpdiA9IHZvaWQgMDsKCiAgaWYgKGFkZFRvQm9keSkgewogICAgZGl2ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5pbm5lckhUTUwgPSAnPGEgaHJlZj0iJyArIHVybCArICciPjwvYT4nOwogICAgYSA9IGRpdi5maXJzdENoaWxkOwogICAgLy8gcHJldmVudCB0aGUgZGl2IGZyb20gYWZmZWN0aW5nIGxheW91dAogICAgZGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTpub25lOyBwb3NpdGlvbjphYnNvbHV0ZTsnKTsKICAgIGRvY3VtZW50XzEuYm9keS5hcHBlbmRDaGlsZChkaXYpOwogIH0KCiAgLy8gQ29weSB0aGUgc3BlY2lmaWMgVVJMIHByb3BlcnRpZXMgdG8gYSBuZXcgb2JqZWN0CiAgLy8gVGhpcyBpcyBhbHNvIG5lZWRlZCBmb3IgSUU4IGJlY2F1c2UgdGhlIGFuY2hvciBsb3NlcyBpdHMKICAvLyBwcm9wZXJ0aWVzIHdoZW4gaXQncyByZW1vdmVkIGZyb20gdGhlIGRvbQogIHZhciBkZXRhaWxzID0ge307CgogIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgIGRldGFpbHNbcHJvcHNbaV1dID0gYVtwcm9wc1tpXV07CiAgfQoKICAvLyBJRTkgYWRkcyB0aGUgcG9ydCB0byB0aGUgaG9zdCBwcm9wZXJ0eSB1bmxpa2UgZXZlcnlvbmUgZWxzZS4gSWYKICAvLyBhIHBvcnQgaWRlbnRpZmllciBpcyBhZGRlZCBmb3Igc3RhbmRhcmQgcG9ydHMsIHN0cmlwIGl0LgogIGlmIChkZXRhaWxzLnByb3RvY29sID09PSAnaW5kZXguaHRtbCcpIHsKICAgIGRldGFpbHMuaG9zdCA9IGRldGFpbHMuaG9zdC5yZXBsYWNlKC86ODAkLywgJycpOwogIH0KCiAgaWYgKGRldGFpbHMucHJvdG9jb2wgPT09ICdpbmRleC5odG1sJykgewogICAgZGV0YWlscy5ob3N0ID0gZGV0YWlscy5ob3N0LnJlcGxhY2UoLzo0NDMkLywgJycpOwogIH0KCiAgaWYgKCFkZXRhaWxzLnByb3RvY29sKSB7CiAgICBkZXRhaWxzLnByb3RvY29sID0gd2luZG93XzEubG9jYXRpb24ucHJvdG9jb2w7CiAgfQoKICBpZiAoYWRkVG9Cb2R5KSB7CiAgICBkb2N1bWVudF8xLmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTsKICB9CgogIHJldHVybiBkZXRhaWxzOwp9OwoKLyoqCiAqIEdldCBhYnNvbHV0ZSB2ZXJzaW9uIG9mIHJlbGF0aXZlIFVSTC4gVXNlZCB0byB0ZWxsIGZsYXNoIGNvcnJlY3QgVVJMLgogKgogKgogKiBAcGFyYW0gIHtzdHJpbmd9IHVybAogKiAgICAgICAgIFVSTCB0byBtYWtlIGFic29sdXRlCiAqCiAqIEByZXR1cm4ge3N0cmluZ30KICogICAgICAgICBBYnNvbHV0ZSBVUkwKICoKICogQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3MDgzMi9nZXR0aW5nLWFuLWFic29sdXRlLXVybC1mcm9tLWEtcmVsYXRpdmUtb25lLWllNi1pc3N1ZQogKi8KdmFyIGdldEFic29sdXRlVVJMID0gZnVuY3Rpb24gZ2V0QWJzb2x1dGVVUkwodXJsKSB7CiAgLy8gQ2hlY2sgaWYgYWJzb2x1dGUgVVJMCiAgaWYgKCF1cmwubWF0Y2goL15odHRwcz86XC9cLy8pKSB7CiAgICAvLyBDb252ZXJ0IHRvIGFic29sdXRlIFVSTC4gRmxhc2ggaG9zdGVkIG9mZi1zaXRlIG5lZWRzIGFuIGFic29sdXRlIFVSTC4KICAgIHZhciBkaXYgPSBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgIGRpdi5pbm5lckhUTUwgPSAnPGEgaHJlZj0iJyArIHVybCArICciPng8L2E+JzsKICAgIHVybCA9IGRpdi5maXJzdENoaWxkLmhyZWY7CiAgfQoKICByZXR1cm4gdXJsOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgcGFzc2VkIGZpbGUgbmFtZS4gSXQgd2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCiAqIGlmIHBhc3NlZCBhbiBpbnZhbGlkIHBhdGguCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqICAgICAgICBUaGUgZmlsZU5hbWUgcGF0aCBsaWtlICcvcGF0aC90by9maWxlLm1wNCcKICoKICogQHJldHVybnMge3N0cmluZ30KICogICAgICAgICAgVGhlIGV4dGVuc2lvbiBpbiBsb3dlciBjYXNlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubwogKiAgICAgICAgICBleHRlbnNpb24gY291bGQgYmUgZm91bmQuCiAqLwp2YXIgZ2V0RmlsZUV4dGVuc2lvbiA9IGZ1bmN0aW9uIGdldEZpbGVFeHRlbnNpb24ocGF0aCkgewogIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHsKICAgIHZhciBzcGxpdFBhdGhSZSA9IC9eKFwvPykoW1xzXFNdKj8pKCg/OlwuezEsMn18W15cL10rPykoXC4oW15cLlwvXD9dKykpKSg/OltcL10qfFtcP10uKikkL2k7CiAgICB2YXIgcGF0aFBhcnRzID0gc3BsaXRQYXRoUmUuZXhlYyhwYXRoKTsKCiAgICBpZiAocGF0aFBhcnRzKSB7CiAgICAgIHJldHVybiBwYXRoUGFydHMucG9wKCkudG9Mb3dlckNhc2UoKTsKICAgIH0KICB9CgogIHJldHVybiAnJzsKfTsKCi8qKgogKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVybCBwYXNzZWQgaXMgYSBjcm9zcyBkb21haW4gcmVxdWVzdCBvciBub3QuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICogICAgICAgIFRoZSB1cmwgdG8gY2hlY2suCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgV2hldGhlciBpdCBpcyBhIGNyb3NzIGRvbWFpbiByZXF1ZXN0IG9yIG5vdC4KICovCnZhciBpc0Nyb3NzT3JpZ2luID0gZnVuY3Rpb24gaXNDcm9zc09yaWdpbih1cmwpIHsKICB2YXIgd2luTG9jID0gd2luZG93XzEubG9jYXRpb247CiAgdmFyIHVybEluZm8gPSBwYXJzZVVybCh1cmwpOwoKICAvLyBJRTggcHJvdG9jb2wgcmVsYXRpdmUgdXJscyB3aWxsIHJldHVybiAnOicgZm9yIHByb3RvY29sCiAgdmFyIHNyY1Byb3RvY29sID0gdXJsSW5mby5wcm90b2NvbCA9PT0gJzonID8gd2luTG9jLnByb3RvY29sIDogdXJsSW5mby5wcm90b2NvbDsKCiAgLy8gQ2hlY2sgaWYgdXJsIGlzIGZvciBhbm90aGVyIGRvbWFpbi9vcmlnaW4KICAvLyBJRTggZG9lc24ndCBrbm93IGxvY2F0aW9uLm9yaWdpbiwgc28gd2Ugd29uJ3QgcmVseSBvbiBpdCBoZXJlCiAgdmFyIGNyb3NzT3JpZ2luID0gc3JjUHJvdG9jb2wgKyB1cmxJbmZvLmhvc3QgIT09IHdpbkxvYy5wcm90b2NvbCArIHdpbkxvYy5ob3N0OwoKICByZXR1cm4gY3Jvc3NPcmlnaW47Cn07Cgp2YXIgVXJsID0gKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh7CglwYXJzZVVybDogcGFyc2VVcmwsCglnZXRBYnNvbHV0ZVVSTDogZ2V0QWJzb2x1dGVVUkwsCglnZXRGaWxlRXh0ZW5zaW9uOiBnZXRGaWxlRXh0ZW5zaW9uLAoJaXNDcm9zc09yaWdpbjogaXNDcm9zc09yaWdpbgp9KTsKCnZhciBpc0Z1bmN0aW9uXzEgPSBpc0Z1bmN0aW9uOwoKdmFyIHRvU3RyaW5nJDEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwoKZnVuY3Rpb24gaXNGdW5jdGlvbiAoZm4pIHsKICB2YXIgc3RyaW5nID0gdG9TdHJpbmckMS5jYWxsKGZuKTsKICByZXR1cm4gc3RyaW5nID09PSAnW29iamVjdCBGdW5jdGlvbl0nIHx8CiAgICAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHN0cmluZyAhPT0gJ1tvYmplY3QgUmVnRXhwXScpIHx8CiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAvLyBJRTggYW5kIGJlbG93CiAgICAgKGZuID09PSB3aW5kb3cuc2V0VGltZW91dCB8fAogICAgICBmbiA9PT0gd2luZG93LmFsZXJ0IHx8CiAgICAgIGZuID09PSB3aW5kb3cuY29uZmlybSB8fAogICAgICBmbiA9PT0gd2luZG93LnByb21wdCkpCn0KCnZhciB0cmltXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07CgpmdW5jdGlvbiB0cmltKHN0cil7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXHMqfFxzKiQvZywgJycpOwp9CgpleHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpewogIHJldHVybiBzdHIucmVwbGFjZSgvXlxzKi8sICcnKTsKfTsKCmV4cG9ydHMucmlnaHQgPSBmdW5jdGlvbihzdHIpewogIHJldHVybiBzdHIucmVwbGFjZSgvXHMqJC8sICcnKTsKfTsKfSk7Cgp2YXIgZm9yRWFjaF8xID0gZm9yRWFjaDsKCnZhciB0b1N0cmluZyQyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKCmZ1bmN0aW9uIGZvckVhY2gobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIGlmICghaXNGdW5jdGlvbl8xKGl0ZXJhdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpCiAgICB9CgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICAgICAgY29udGV4dCA9IHRoaXM7CiAgICB9CiAgICAKICAgIGlmICh0b1N0cmluZyQyLmNhbGwobGlzdCkgPT09ICdbb2JqZWN0IEFycmF5XScpCiAgICAgICAgZm9yRWFjaEFycmF5JDEobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpOwogICAgZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKQogICAgICAgIGZvckVhY2hTdHJpbmcobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpOwogICAgZWxzZQogICAgICAgIGZvckVhY2hPYmplY3QobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpOwp9CgpmdW5jdGlvbiBmb3JFYWNoQXJyYXkkMShhcnJheSwgaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCBpKSkgewogICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIGFycmF5W2ldLCBpLCBhcnJheSk7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIGNvbnRleHQpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy4KICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZyk7CiAgICB9Cn0KCmZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgY29udGV4dCkgewogICAgZm9yICh2YXIgayBpbiBvYmplY3QpIHsKICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGspKSB7CiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqZWN0W2tdLCBrLCBvYmplY3QpOwogICAgICAgIH0KICAgIH0KfQoKdmFyIGlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHsKICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nOwogICAgfTsKCnZhciBwYXJzZUhlYWRlcnMgPSBmdW5jdGlvbiAoaGVhZGVycykgewogIGlmICghaGVhZGVycykKICAgIHJldHVybiB7fQoKICB2YXIgcmVzdWx0ID0ge307CgogIGZvckVhY2hfMSgKICAgICAgdHJpbV8xKGhlYWRlcnMpLnNwbGl0KCdcbicpCiAgICAsIGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICB2YXIgaW5kZXggPSByb3cuaW5kZXhPZignOicpCiAgICAgICAgICAsIGtleSA9IHRyaW1fMShyb3cuc2xpY2UoMCwgaW5kZXgpKS50b0xvd2VyQ2FzZSgpCiAgICAgICAgICAsIHZhbHVlID0gdHJpbV8xKHJvdy5zbGljZShpbmRleCArIDEpKTsKCiAgICAgICAgaWYgKHR5cGVvZihyZXN1bHRba2V5XSkgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXN1bHRba2V5XSkpIHsKICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IFsgcmVzdWx0W2tleV0sIHZhbHVlIF07CiAgICAgICAgfQogICAgICB9CiAgKTsKCiAgcmV0dXJuIHJlc3VsdAp9OwoKdmFyIGltbXV0YWJsZSA9IGV4dGVuZDsKCnZhciBoYXNPd25Qcm9wZXJ0eSQxID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKCmZ1bmN0aW9uIGV4dGVuZCgpIHsKICAgIHZhciB0YXJnZXQgPSB7fTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CgogICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5JDEuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRhcmdldAp9Cgp2YXIgeGhyID0gY3JlYXRlWEhSOwpjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3dfMS5YTUxIdHRwUmVxdWVzdCB8fCBub29wOwpjcmVhdGVYSFIuWERvbWFpblJlcXVlc3QgPSAid2l0aENyZWRlbnRpYWxzIiBpbiAobmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpKSA/IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCA6IHdpbmRvd18xLlhEb21haW5SZXF1ZXN0OwoKZm9yRWFjaEFycmF5KFsiZ2V0IiwgInB1dCIsICJwb3N0IiwgInBhdGNoIiwgImhlYWQiLCAiZGVsZXRlIl0sIGZ1bmN0aW9uKG1ldGhvZCkgewogICAgY3JlYXRlWEhSW21ldGhvZCA9PT0gImRlbGV0ZSIgPyAiZGVsIiA6IG1ldGhvZF0gPSBmdW5jdGlvbih1cmksIG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICAgICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjayk7CiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTsKICAgICAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKQogICAgfTsKfSk7CgpmdW5jdGlvbiBmb3JFYWNoQXJyYXkoYXJyYXksIGl0ZXJhdG9yKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaXRlcmF0b3IoYXJyYXlbaV0pOwogICAgfQp9CgpmdW5jdGlvbiBpc0VtcHR5KG9iail7CiAgICBmb3IodmFyIGkgaW4gb2JqKXsKICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoaSkpIHJldHVybiBmYWxzZQogICAgfQogICAgcmV0dXJuIHRydWUKfQoKZnVuY3Rpb24gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICB2YXIgcGFyYW1zID0gdXJpOwoKICAgIGlmIChpc0Z1bmN0aW9uXzEob3B0aW9ucykpIHsKICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7CiAgICAgICAgaWYgKHR5cGVvZiB1cmkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHBhcmFtcyA9IHt1cmk6dXJpfTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHBhcmFtcyA9IGltbXV0YWJsZShvcHRpb25zLCB7dXJpOiB1cml9KTsKICAgIH0KCiAgICBwYXJhbXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIHJldHVybiBwYXJhbXMKfQoKZnVuY3Rpb24gY3JlYXRlWEhSKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHsKICAgIG9wdGlvbnMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spOwogICAgcmV0dXJuIF9jcmVhdGVYSFIob3B0aW9ucykKfQoKZnVuY3Rpb24gX2NyZWF0ZVhIUihvcHRpb25zKSB7CiAgICBpZih0eXBlb2Ygb3B0aW9ucy5jYWxsYmFjayA9PT0gInVuZGVmaW5lZCIpewogICAgICAgIHRocm93IG5ldyBFcnJvcigiY2FsbGJhY2sgYXJndW1lbnQgbWlzc2luZyIpCiAgICB9CgogICAgdmFyIGNhbGxlZCA9IGZhbHNlOwogICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2JPbmNlKGVyciwgcmVzcG9uc2UsIGJvZHkpewogICAgICAgIGlmKCFjYWxsZWQpewogICAgICAgICAgICBjYWxsZWQgPSB0cnVlOwogICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKGVyciwgcmVzcG9uc2UsIGJvZHkpOwogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gcmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgICAgc2V0VGltZW91dChsb2FkRnVuYywgMCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJvZHkoKSB7CiAgICAgICAgLy8gQ2hyb21lIHdpdGggcmVxdWVzdFR5cGU9YmxvYiB0aHJvd3MgZXJyb3JzIGFycm91bmQgd2hlbiBldmVuIHRlc3RpbmcgYWNjZXNzIHRvIHJlc3BvbnNlVGV4dAogICAgICAgIHZhciBib2R5ID0gdW5kZWZpbmVkOwoKICAgICAgICBpZiAoeGhyLnJlc3BvbnNlKSB7CiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVRleHQgfHwgZ2V0WG1sKHhocik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNKc29uKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICB9CgogICAgICAgIHJldHVybiBib2R5CiAgICB9CgogICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0VGltZXIpOwogICAgICAgIGlmKCEoZXZ0IGluc3RhbmNlb2YgRXJyb3IpKXsKICAgICAgICAgICAgZXZ0ID0gbmV3IEVycm9yKCIiICsgKGV2dCB8fCAiVW5rbm93biBYTUxIdHRwUmVxdWVzdCBFcnJvciIpICk7CiAgICAgICAgfQogICAgICAgIGV2dC5zdGF0dXNDb2RlID0gMDsKICAgICAgICByZXR1cm4gY2FsbGJhY2soZXZ0LCBmYWlsdXJlUmVzcG9uc2UpCiAgICB9CgogICAgLy8gd2lsbCBsb2FkIHRoZSBkYXRhICYgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW4gYSBzcGVjaWFsIHJlc3BvbnNlIG9iamVjdAogICAgZnVuY3Rpb24gbG9hZEZ1bmMoKSB7CiAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVybgogICAgICAgIHZhciBzdGF0dXM7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcik7CiAgICAgICAgaWYob3B0aW9ucy51c2VYRFIgJiYgeGhyLnN0YXR1cz09PXVuZGVmaW5lZCkgewogICAgICAgICAgICAvL0lFOCBDT1JTIEdFVCBzdWNjZXNzZnVsIHJlc3BvbnNlIGRvZXNuJ3QgaGF2ZSBhIHN0YXR1cyBmaWVsZCwgYnV0IGJvZHkgaXMgZmluZQogICAgICAgICAgICBzdGF0dXMgPSAyMDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdHVzID0gKHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzKTsKICAgICAgICB9CiAgICAgICAgdmFyIHJlc3BvbnNlID0gZmFpbHVyZVJlc3BvbnNlOwogICAgICAgIHZhciBlcnIgPSBudWxsOwoKICAgICAgICBpZiAoc3RhdHVzICE9PSAwKXsKICAgICAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICAgICAgICBib2R5OiBnZXRCb2R5KCksCiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXMsCiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LAogICAgICAgICAgICAgICAgdXJsOiB1cmksCiAgICAgICAgICAgICAgICByYXdSZXF1ZXN0OiB4aHIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycyl7IC8vcmVtZW1iZXIgeGhyIGNhbiBpbiBmYWN0IGJlIFhEUiBmb3IgQ09SUyBpbiBJRQogICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCJJbnRlcm5hbCBYTUxIdHRwUmVxdWVzdCBFcnJvciIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCByZXNwb25zZSwgcmVzcG9uc2UuYm9keSkKICAgIH0KCiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgbnVsbDsKCiAgICBpZiAoIXhocikgewogICAgICAgIGlmIChvcHRpb25zLmNvcnMgfHwgb3B0aW9ucy51c2VYRFIpIHsKICAgICAgICAgICAgeGhyID0gbmV3IGNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCgpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBrZXk7CiAgICB2YXIgYWJvcnRlZDsKICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmw7CiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8ICJHRVQiOwogICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5kYXRhOwogICAgdmFyIGhlYWRlcnMgPSB4aHIuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTsKICAgIHZhciBzeW5jID0gISFvcHRpb25zLnN5bmM7CiAgICB2YXIgaXNKc29uID0gZmFsc2U7CiAgICB2YXIgdGltZW91dFRpbWVyOwogICAgdmFyIGZhaWx1cmVSZXNwb25zZSA9IHsKICAgICAgICBib2R5OiB1bmRlZmluZWQsCiAgICAgICAgaGVhZGVyczoge30sCiAgICAgICAgc3RhdHVzQ29kZTogMCwKICAgICAgICBtZXRob2Q6IG1ldGhvZCwKICAgICAgICB1cmw6IHVyaSwKICAgICAgICByYXdSZXF1ZXN0OiB4aHIKICAgIH07CgogICAgaWYgKCJqc29uIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuanNvbiAhPT0gZmFsc2UpIHsKICAgICAgICBpc0pzb24gPSB0cnVlOwogICAgICAgIGhlYWRlcnNbImFjY2VwdCJdIHx8IGhlYWRlcnNbIkFjY2VwdCJdIHx8IChoZWFkZXJzWyJBY2NlcHQiXSA9ICJhcHBsaWNhdGlvbi9qc29uIik7IC8vRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYWNjZXB0IGhlYWRlciBkZWNsYXJlZCBieSB1c2VyCiAgICAgICAgaWYgKG1ldGhvZCAhPT0gIkdFVCIgJiYgbWV0aG9kICE9PSAiSEVBRCIpIHsKICAgICAgICAgICAgaGVhZGVyc1siY29udGVudC10eXBlIl0gfHwgaGVhZGVyc1siQ29udGVudC1UeXBlIl0gfHwgKGhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iKTsgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXIKICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuanNvbiA9PT0gdHJ1ZSA/IGJvZHkgOiBvcHRpb25zLmpzb24pOwogICAgICAgIH0KICAgIH0KCiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gcmVhZHlzdGF0ZWNoYW5nZTsKICAgIHhoci5vbmxvYWQgPSBsb2FkRnVuYzsKICAgIHhoci5vbmVycm9yID0gZXJyb3JGdW5jOwogICAgLy8gSUU5IG11c3QgaGF2ZSBvbnByb2dyZXNzIGJlIHNldCB0byBhIHVuaXF1ZSBmdW5jdGlvbi4KICAgIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIElFIG11c3QgZGllCiAgICB9OwogICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpewogICAgICAgIGFib3J0ZWQgPSB0cnVlOwogICAgfTsKICAgIHhoci5vbnRpbWVvdXQgPSBlcnJvckZ1bmM7CiAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgIXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQpOwogICAgLy9oYXMgdG8gYmUgYWZ0ZXIgb3BlbgogICAgaWYoIXN5bmMpIHsKICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRpb25zLndpdGhDcmVkZW50aWFsczsKICAgIH0KICAgIC8vIENhbm5vdCBzZXQgdGltZW91dCB3aXRoIHN5bmMgcmVxdWVzdAogICAgLy8gbm90IHNldHRpbmcgdGltZW91dCBvbiB0aGUgeGhyIG9iamVjdCwgYmVjYXVzZSBvZiBvbGQgd2Via2l0cyBldGMuIG5vdCBoYW5kbGluZyB0aGF0IGNvcnJlY3RseQogICAgLy8gYm90aCBucG0ncyByZXF1ZXN0IGFuZCBqcXVlcnkgMS54IHVzZSB0aGlzIGtpbmQgb2YgdGltZW91dCwgc28gdGhpcyBpcyBiZWluZyBjb25zaXN0ZW50CiAgICBpZiAoIXN5bmMgJiYgb3B0aW9ucy50aW1lb3V0ID4gMCApIHsKICAgICAgICB0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm4KICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7Ly9JRTkgbWF5IHN0aWxsIGNhbGwgcmVhZHlzdGF0ZWNoYW5nZQogICAgICAgICAgICB4aHIuYWJvcnQoInRpbWVvdXQiKTsKICAgICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXQiKTsKICAgICAgICAgICAgZS5jb2RlID0gIkVUSU1FRE9VVCI7CiAgICAgICAgICAgIGVycm9yRnVuYyhlKTsKICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKTsKICAgIH0KCiAgICBpZiAoeGhyLnNldFJlcXVlc3RIZWFkZXIpIHsKICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpewogICAgICAgICAgICBpZihoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpewogICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChvcHRpb25zLmhlYWRlcnMgJiYgIWlzRW1wdHkob3B0aW9ucy5oZWFkZXJzKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdCIpCiAgICB9CgogICAgaWYgKCJyZXNwb25zZVR5cGUiIGluIG9wdGlvbnMpIHsKICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gb3B0aW9ucy5yZXNwb25zZVR5cGU7CiAgICB9CgogICAgaWYgKCJiZWZvcmVTZW5kIiBpbiBvcHRpb25zICYmCiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gImZ1bmN0aW9uIgogICAgKSB7CiAgICAgICAgb3B0aW9ucy5iZWZvcmVTZW5kKHhocik7CiAgICB9CgogICAgLy8gTWljcm9zb2Z0IEVkZ2UgYnJvd3NlciBzZW5kcyAidW5kZWZpbmVkIiB3aGVuIHNlbmQgaXMgY2FsbGVkIHdpdGggdW5kZWZpbmVkIHZhbHVlLgogICAgLy8gWE1MSHR0cFJlcXVlc3Qgc3BlYyBzYXlzIHRvIHBhc3MgbnVsbCBhcyBib2R5IHRvIGluZGljYXRlIG5vIGJvZHkKICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbmF1Z3R1ci94aHIvaXNzdWVzLzEwMC4KICAgIHhoci5zZW5kKGJvZHkgfHwgbnVsbCk7CgogICAgcmV0dXJuIHhocgoKCn0KCmZ1bmN0aW9uIGdldFhtbCh4aHIpIHsKICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSAiZG9jdW1lbnQiKSB7CiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTAogICAgfQogICAgdmFyIGZpcmVmb3hCdWdUYWtlbkVmZmVjdCA9IHhoci5yZXNwb25zZVhNTCAmJiB4aHIucmVzcG9uc2VYTUwuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lID09PSAicGFyc2VyZXJyb3IiOwogICAgaWYgKHhoci5yZXNwb25zZVR5cGUgPT09ICIiICYmICFmaXJlZm94QnVnVGFrZW5FZmZlY3QpIHsKICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlWE1MCiAgICB9CgogICAgcmV0dXJuIG51bGwKfQoKZnVuY3Rpb24gbm9vcCgpIHt9CgovKioKICogQGZpbGUgdGV4dC10cmFjay5qcwogKi8KLyoqCiAqIFRha2VzIGEgd2VidnR0IGZpbGUgY29udGVudHMgYW5kIHBhcnNlcyBpdCBpbnRvIGN1ZXMKICoKICogQHBhcmFtIHtzdHJpbmd9IHNyY0NvbnRlbnQKICogICAgICAgIHdlYlZUVCBmaWxlIGNvbnRlbnRzCiAqCiAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFjawogKiAgICAgICAgVGV4dFRyYWNrIHRvIGFkZCBjdWVzIHRvLiBDdWVzIGNvbWUgZnJvbSB0aGUgc3JjQ29udGVudC4KICoKICogQHByaXZhdGUKICovCnZhciBwYXJzZUN1ZXMgPSBmdW5jdGlvbiBwYXJzZUN1ZXMoc3JjQ29udGVudCwgdHJhY2spIHsKICB2YXIgcGFyc2VyID0gbmV3IHdpbmRvd18xLldlYlZUVC5QYXJzZXIod2luZG93XzEsIHdpbmRvd18xLnZ0dGpzLCB3aW5kb3dfMS5XZWJWVFQuU3RyaW5nRGVjb2RlcigpKTsKICB2YXIgZXJyb3JzID0gW107CgogIHBhcnNlci5vbmN1ZSA9IGZ1bmN0aW9uIChjdWUpIHsKICAgIHRyYWNrLmFkZEN1ZShjdWUpOwogIH07CgogIHBhcnNlci5vbnBhcnNpbmdlcnJvciA9IGZ1bmN0aW9uIChlcnJvcikgewogICAgZXJyb3JzLnB1c2goZXJyb3IpOwogIH07CgogIHBhcnNlci5vbmZsdXNoID0gZnVuY3Rpb24gKCkgewogICAgdHJhY2sudHJpZ2dlcih7CiAgICAgIHR5cGU6ICdsb2FkZWRkYXRhJywKICAgICAgdGFyZ2V0OiB0cmFjawogICAgfSk7CiAgfTsKCiAgcGFyc2VyLnBhcnNlKHNyY0NvbnRlbnQpOwogIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgewogICAgaWYgKHdpbmRvd18xLmNvbnNvbGUgJiYgd2luZG93XzEuY29uc29sZS5ncm91cENvbGxhcHNlZCkgewogICAgICB3aW5kb3dfMS5jb25zb2xlLmdyb3VwQ29sbGFwc2VkKCdUZXh0IFRyYWNrIHBhcnNpbmcgZXJyb3JzIGZvciAnICsgdHJhY2suc3JjKTsKICAgIH0KICAgIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikgewogICAgICByZXR1cm4gbG9nJDEuZXJyb3IoZXJyb3IpOwogICAgfSk7CiAgICBpZiAod2luZG93XzEuY29uc29sZSAmJiB3aW5kb3dfMS5jb25zb2xlLmdyb3VwRW5kKSB7CiAgICAgIHdpbmRvd18xLmNvbnNvbGUuZ3JvdXBFbmQoKTsKICAgIH0KICB9CgogIHBhcnNlci5mbHVzaCgpOwp9OwoKLyoqCiAqIExvYWQgYSBgVGV4dFRyYWNrYCBmcm9tIGEgc3BlY2lmZWQgdXJsLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3JjCiAqICAgICAgICBVcmwgdG8gbG9hZCB0cmFjayBmcm9tLgogKgogKiBAcGFyYW0ge1RleHRUcmFja30gdHJhY2sKICogICAgICAgIFRyYWNrIHRvIGFkZCBjdWVzIHRvLiBDb21lcyBmcm9tIHRoZSBjb250ZW50IGF0IHRoZSBlbmQgb2YgYHVybGAuCiAqCiAqIEBwcml2YXRlCiAqLwp2YXIgbG9hZFRyYWNrID0gZnVuY3Rpb24gbG9hZFRyYWNrKHNyYywgdHJhY2spIHsKICB2YXIgb3B0cyA9IHsKICAgIHVyaTogc3JjCiAgfTsKICB2YXIgY3Jvc3NPcmlnaW4gPSBpc0Nyb3NzT3JpZ2luKHNyYyk7CgogIGlmIChjcm9zc09yaWdpbikgewogICAgb3B0cy5jb3JzID0gY3Jvc3NPcmlnaW47CiAgfQoKICB4aHIob3B0cywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyLCByZXNwb25zZSwgcmVzcG9uc2VCb2R5KSB7CiAgICBpZiAoZXJyKSB7CiAgICAgIHJldHVybiBsb2ckMS5lcnJvcihlcnIsIHJlc3BvbnNlKTsKICAgIH0KCiAgICB0cmFjay5sb2FkZWRfID0gdHJ1ZTsKCiAgICAvLyBNYWtlIHN1cmUgdGhhdCB2dHRqcyBoYXMgbG9hZGVkLCBvdGhlcndpc2UsIHdhaXQgdGlsbCBpdCBmaW5pc2hlZCBsb2FkaW5nCiAgICAvLyBOT1RFOiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGFsdC92aWRlby5ub3Z0dC5qcyBidWlsZAogICAgaWYgKHR5cGVvZiB3aW5kb3dfMS5XZWJWVFQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgaWYgKHRyYWNrLnRlY2hfKSB7CiAgICAgICAgdmFyIGxvYWRIYW5kbGVyID0gZnVuY3Rpb24gbG9hZEhhbmRsZXIoKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VDdWVzKHJlc3BvbnNlQm9keSwgdHJhY2spOwogICAgICAgIH07CgogICAgICAgIHRyYWNrLnRlY2hfLm9uKCd2dHRqc2xvYWRlZCcsIGxvYWRIYW5kbGVyKTsKICAgICAgICB0cmFjay50ZWNoXy5vbigndnR0anNlcnJvcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGxvZyQxLmVycm9yKCd2dHRqcyBmYWlsZWQgdG8gbG9hZCwgc3RvcHBpbmcgdHJ5aW5nIHRvIHByb2Nlc3MgJyArIHRyYWNrLnNyYyk7CiAgICAgICAgICB0cmFjay50ZWNoXy5vZmYoJ3Z0dGpzbG9hZGVkJywgbG9hZEhhbmRsZXIpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwYXJzZUN1ZXMocmVzcG9uc2VCb2R5LCB0cmFjayk7CiAgICB9CiAgfSkpOwp9OwoKLyoqCiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYFRleHRUcmFja2AuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2t9CiAqIEBleHRlbmRzIFRyYWNrCiAqLwoKdmFyIFRleHRUcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHsKICBpbmhlcml0cyhUZXh0VHJhY2ssIF9UcmFjayk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnM9e30KICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzCiAgICoKICAgKiBAcGFyYW0ge1RlY2h9IG9wdGlvbnMudGVjaAogICAqICAgICAgICBBIHJlZmVyZW5jZSB0byB0aGUgdGVjaCB0aGF0IG93bnMgdGhpcyBUZXh0VHJhY2suCiAgICoKICAgKiBAcGFyYW0ge1RleHRUcmFja35LaW5kfSBbb3B0aW9ucy5raW5kPSdzdWJ0aXRsZXMnXQogICAqICAgICAgICBBIHZhbGlkIHRleHQgdHJhY2sga2luZC4KICAgKgogICAqIEBwYXJhbSB7VGV4dFRyYWNrfk1vZGV9IFtvcHRpb25zLm1vZGU9J2Rpc2FibGVkJ10KICAgKiAgICAgICAgQSB2YWxpZCB0ZXh0IHRyYWNrIG1vZGUuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldCiAgICogICAgICAgIEEgdW5pcXVlIGlkIGZvciB0aGlzIFRleHRUcmFjay4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbD0nJ10KICAgKiAgICAgICAgVGhlIG1lbnUgbGFiZWwgZm9yIHRoaXMgdHJhY2suCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9JyddCiAgICogICAgICAgIEEgdmFsaWQgdHdvIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY2xhbmc9JyddCiAgICogICAgICAgIEEgdmFsaWQgdHdvIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlLiBBbiBhbHRlcm5hdGl2ZSwgYnV0IGRlcHJpb3JpdGl6ZWQKICAgKiAgICAgICAgdmVzaW9uIG9mIGBvcHRpb25zLmxhbmd1YWdlYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY10KICAgKiAgICAgICAgQSB1cmwgdG8gVGV4dFRyYWNrIGN1ZXMuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRlZmF1bHRdCiAgICogICAgICAgIElmIHRoaXMgdHJhY2sgc2hvdWxkIGRlZmF1bHQgdG8gb24gb3Igb2ZmLgogICAqLwogIGZ1bmN0aW9uIFRleHRUcmFjaygpIHsKICAgIHZhciBfdGhpcywgX3JldDsKCiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0VHJhY2spOwoKICAgIGlmICghb3B0aW9ucy50ZWNoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQSB0ZWNoIHdhcyBub3QgcHJvdmlkZWQuJyk7CiAgICB9CgogICAgdmFyIHNldHRpbmdzID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHsKICAgICAga2luZDogVGV4dFRyYWNrS2luZFtvcHRpb25zLmtpbmRdIHx8ICdzdWJ0aXRsZXMnLAogICAgICBsYW5ndWFnZTogb3B0aW9ucy5sYW5ndWFnZSB8fCBvcHRpb25zLnNyY2xhbmcgfHwgJycKICAgIH0pOwogICAgdmFyIG1vZGUgPSBUZXh0VHJhY2tNb2RlW3NldHRpbmdzLm1vZGVdIHx8ICdkaXNhYmxlZCc7CiAgICB2YXIgZGVmYXVsdF8gPSBzZXR0aW5nc1snZGVmYXVsdCddOwoKICAgIGlmIChzZXR0aW5ncy5raW5kID09PSAnbWV0YWRhdGEnIHx8IHNldHRpbmdzLmtpbmQgPT09ICdjaGFwdGVycycpIHsKICAgICAgbW9kZSA9ICdoaWRkZW4nOwogICAgfQogICAgLy8gb24gSUU4IHRoaXMgd2lsbCBiZSBhIGRvY3VtZW50IGVsZW1lbnQKICAgIC8vIGZvciBldmVyeSBvdGhlciBicm93c2VyIHRoaXMgd2lsbCBiZSBhIG5vcm1hbCBvYmplY3QKICAgIHZhciB0dCA9IChfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrLmNhbGwodGhpcywgc2V0dGluZ3MpKSwgX3RoaXMpOwoKICAgIHR0LnRlY2hfID0gc2V0dGluZ3MudGVjaDsKCiAgICBpZiAoSVNfSUU4KSB7CiAgICAgIGZvciAodmFyIHByb3AgaW4gVGV4dFRyYWNrLnByb3RvdHlwZSkgewogICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7CiAgICAgICAgICB0dFtwcm9wXSA9IFRleHRUcmFjay5wcm90b3R5cGVbcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdHQuY3Vlc18gPSBbXTsKICAgIHR0LmFjdGl2ZUN1ZXNfID0gW107CgogICAgdmFyIGN1ZXMgPSBuZXcgVGV4dFRyYWNrQ3VlTGlzdCh0dC5jdWVzXyk7CiAgICB2YXIgYWN0aXZlQ3VlcyA9IG5ldyBUZXh0VHJhY2tDdWVMaXN0KHR0LmFjdGl2ZUN1ZXNfKTsKICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7CiAgICB2YXIgdGltZXVwZGF0ZUhhbmRsZXIgPSBiaW5kKHR0LCBmdW5jdGlvbiAoKSB7CgogICAgICAvLyBBY2Nlc3NpbmcgdGhpcy5hY3RpdmVDdWVzIGZvciB0aGUgc2lkZS1lZmZlY3RzIG9mIHVwZGF0aW5nIGl0c2VsZgogICAgICAvLyBkdWUgdG8gaXQncyBuYXR1cmUgYXMgYSBnZXR0ZXIgZnVuY3Rpb24uIERvIG5vdCByZW1vdmUgb3IgY3VlcyB3aWxsCiAgICAgIC8vIHN0b3AgdXBkYXRpbmchCiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqLwogICAgICB0aGlzLmFjdGl2ZUN1ZXM7CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovCiAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgdGhpcy50cmlnZ2VyKCdjdWVjaGFuZ2UnKTsKICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChtb2RlICE9PSAnZGlzYWJsZWQnKSB7CiAgICAgIHR0LnRlY2hfLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICB0dC50ZWNoXy5vbigndGltZXVwZGF0ZScsIHRpbWV1cGRhdGVIYW5kbGVyKTsKICAgICAgfSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgVGV4dFRyYWNrCiAgICAgKiBAbWVtYmVyIHtib29sZWFufSBkZWZhdWx0CiAgICAgKiAgICAgICAgIElmIHRoaXMgdHJhY2sgd2FzIHNldCB0byBiZSBvbiBvciBvZmYgYnkgZGVmYXVsdC4gQ2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIKICAgICAqICAgICAgICAgY3JlYXRpb24uCiAgICAgKiBAaW5zdGFuY2UKICAgICAqCiAgICAgKiBAcmVhZG9ubHkKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCAnZGVmYXVsdCcsIHsKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRfOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9CiAgICB9KTsKCiAgICAvKioKICAgICAqIEBtZW1iZXJvZiBUZXh0VHJhY2sKICAgICAqIEBtZW1iZXIge3N0cmluZ30gbW9kZQogICAgICogICAgICAgICBTZXQgdGhlIG1vZGUgb2YgdGhpcyBUZXh0VHJhY2sgdG8gYSB2YWxpZCB7QGxpbmsgVGV4dFRyYWNrfk1vZGV9LiBXaWxsCiAgICAgKiAgICAgICAgIG5vdCBiZSBzZXQgaWYgc2V0dGluZyB0byBhbiBpbnZhbGlkIG1vZGUuCiAgICAgKiBAaW5zdGFuY2UKICAgICAqCiAgICAgKiBAZmlyZXMgVGV4dFRyYWNrI21vZGVjaGFuZ2UKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCAnbW9kZScsIHsKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7CiAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG5ld01vZGUpIHsKICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgICAgaWYgKCFUZXh0VHJhY2tNb2RlW25ld01vZGVdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG1vZGUgPSBuZXdNb2RlOwogICAgICAgIGlmIChtb2RlID09PSAnc2hvd2luZycpIHsKCiAgICAgICAgICB0aGlzLnRlY2hfLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMyLnRlY2hfLm9uKCd0aW1ldXBkYXRlJywgdGltZXVwZGF0ZUhhbmRsZXIpOwogICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiBtb2RlIGNoYW5nZXMgb24gdGhpcyB0cmFjay4gVGhpcyBhbGxvd3MKICAgICAgICAgKiB0aGUgVGV4dFRyYWNrTGlzdCB0aGF0IGhvbGRzIHRoaXMgdHJhY2sgdG8gYWN0IGFjY29yZGluZ2x5LgogICAgICAgICAqCiAgICAgICAgICogPiBOb3RlOiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBzcGVjIQogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IFRleHRUcmFjayNtb2RlY2hhbmdlCiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgICAqLwogICAgICAgIHRoaXMudHJpZ2dlcignbW9kZWNoYW5nZScpOwogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgICAqIEBtZW1iZXJvZiBUZXh0VHJhY2sKICAgICAqIEBtZW1iZXIge1RleHRUcmFja0N1ZUxpc3R9IGN1ZXMKICAgICAqICAgICAgICAgVGhlIHRleHQgdHJhY2sgY3VlIGxpc3QgZm9yIHRoaXMgVGV4dFRyYWNrLgogICAgICogQGluc3RhbmNlCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwgJ2N1ZXMnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkgewogICAgICAgIGlmICghdGhpcy5sb2FkZWRfKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjdWVzOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMSgpIHt9CiAgICB9KTsKCiAgICAvKioKICAgICAqIEBtZW1iZXJvZiBUZXh0VHJhY2sKICAgICAqIEBtZW1iZXIge1RleHRUcmFja0N1ZUxpc3R9IGFjdGl2ZUN1ZXMKICAgICAqICAgICAgICAgVGhlIGxpc3QgdGV4dCB0cmFjayBjdWVzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgVGV4dFRyYWNrLgogICAgICogQGluc3RhbmNlCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0dCwgJ2FjdGl2ZUN1ZXMnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gZ2V0JCQxKCkgewogICAgICAgIGlmICghdGhpcy5sb2FkZWRfKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICBpZiAodGhpcy5jdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIGFjdGl2ZUN1ZXM7CiAgICAgICAgfQoKICAgICAgICB2YXIgY3QgPSB0aGlzLnRlY2hfLmN1cnJlbnRUaW1lKCk7CiAgICAgICAgdmFyIGFjdGl2ZSA9IFtdOwoKICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuY3Vlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIHZhciBjdWUgPSB0aGlzLmN1ZXNbaV07CgogICAgICAgICAgaWYgKGN1ZS5zdGFydFRpbWUgPD0gY3QgJiYgY3VlLmVuZFRpbWUgPj0gY3QpIHsKICAgICAgICAgICAgYWN0aXZlLnB1c2goY3VlKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLnN0YXJ0VGltZSA9PT0gY3VlLmVuZFRpbWUgJiYgY3VlLnN0YXJ0VGltZSA8PSBjdCAmJiBjdWUuc3RhcnRUaW1lICsgMC41ID49IGN0KSB7CiAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGN1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjaGFuZ2VkID0gZmFsc2U7CgogICAgICAgIGlmIChhY3RpdmUubGVuZ3RoICE9PSB0aGlzLmFjdGl2ZUN1ZXNfLmxlbmd0aCkgewogICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhY3RpdmUubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUN1ZXNfLmluZGV4T2YoYWN0aXZlW19pXSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuYWN0aXZlQ3Vlc18gPSBhY3RpdmU7CiAgICAgICAgYWN0aXZlQ3Vlcy5zZXRDdWVzXyh0aGlzLmFjdGl2ZUN1ZXNfKTsKCiAgICAgICAgcmV0dXJuIGFjdGl2ZUN1ZXM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKCkge30KICAgIH0pOwoKICAgIGlmIChzZXR0aW5ncy5zcmMpIHsKICAgICAgdHQuc3JjID0gc2V0dGluZ3Muc3JjOwogICAgICBsb2FkVHJhY2soc2V0dGluZ3Muc3JjLCB0dCk7CiAgICB9IGVsc2UgewogICAgICB0dC5sb2FkZWRfID0gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gX3JldCA9IHR0LCBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTsKICB9CgogIC8qKgogICAqIEFkZCBhIGN1ZSB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBjdWVzLgogICAqCiAgICogQHBhcmFtIHtUZXh0VHJhY2t+Q3VlfSBjdWUKICAgKiAgICAgICAgVGhlIGN1ZSB0byBhZGQgdG8gb3VyIGludGVybmFsIGxpc3QKICAgKi8KCgogIFRleHRUcmFjay5wcm90b3R5cGUuYWRkQ3VlID0gZnVuY3Rpb24gYWRkQ3VlKG9yaWdpbmFsQ3VlKSB7CiAgICB2YXIgY3VlID0gb3JpZ2luYWxDdWU7CgogICAgaWYgKHdpbmRvd18xLnZ0dGpzICYmICEob3JpZ2luYWxDdWUgaW5zdGFuY2VvZiB3aW5kb3dfMS52dHRqcy5WVFRDdWUpKSB7CiAgICAgIGN1ZSA9IG5ldyB3aW5kb3dfMS52dHRqcy5WVFRDdWUob3JpZ2luYWxDdWUuc3RhcnRUaW1lLCBvcmlnaW5hbEN1ZS5lbmRUaW1lLCBvcmlnaW5hbEN1ZS50ZXh0KTsKCiAgICAgIGZvciAodmFyIHByb3AgaW4gb3JpZ2luYWxDdWUpIHsKICAgICAgICBpZiAoIShwcm9wIGluIGN1ZSkpIHsKICAgICAgICAgIGN1ZVtwcm9wXSA9IG9yaWdpbmFsQ3VlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYGlkYCBpcyBjb3BpZWQgb3ZlcgogICAgICBjdWUuaWQgPSBvcmlnaW5hbEN1ZS5pZDsKICAgICAgY3VlLm9yaWdpbmFsQ3VlXyA9IG9yaWdpbmFsQ3VlOwogICAgfQoKICAgIHZhciB0cmFja3MgPSB0aGlzLnRlY2hfLnRleHRUcmFja3MoKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodHJhY2tzW2ldICE9PSB0aGlzKSB7CiAgICAgICAgdHJhY2tzW2ldLnJlbW92ZUN1ZShjdWUpOwogICAgICB9CiAgICB9CgogICAgdGhpcy5jdWVzXy5wdXNoKGN1ZSk7CiAgICB0aGlzLmN1ZXMuc2V0Q3Vlc18odGhpcy5jdWVzXyk7CiAgfTsKCiAgLyoqCiAgICogUmVtb3ZlIGEgY3VlIGZyb20gb3VyIGludGVybmFsIGxpc3QKICAgKgogICAqIEBwYXJhbSB7VGV4dFRyYWNrfkN1ZX0gcmVtb3ZlQ3VlCiAgICogICAgICAgIFRoZSBjdWUgdG8gcmVtb3ZlIGZyb20gb3VyIGludGVybmFsIGxpc3QKICAgKi8KCgogIFRleHRUcmFjay5wcm90b3R5cGUucmVtb3ZlQ3VlID0gZnVuY3Rpb24gcmVtb3ZlQ3VlKF9yZW1vdmVDdWUpIHsKICAgIHZhciBpID0gdGhpcy5jdWVzXy5sZW5ndGg7CgogICAgd2hpbGUgKGktLSkgewogICAgICB2YXIgY3VlID0gdGhpcy5jdWVzX1tpXTsKCiAgICAgIGlmIChjdWUgPT09IF9yZW1vdmVDdWUgfHwgY3VlLm9yaWdpbmFsQ3VlXyAmJiBjdWUub3JpZ2luYWxDdWVfID09PSBfcmVtb3ZlQ3VlKSB7CiAgICAgICAgdGhpcy5jdWVzXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgdGhpcy5jdWVzLnNldEN1ZXNfKHRoaXMuY3Vlc18pOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfTsKCiAgcmV0dXJuIFRleHRUcmFjazsKfShUcmFjayk7CgovKioKICogY3VlY2hhbmdlIC0gT25lIG9yIG1vcmUgY3VlcyBpbiB0aGUgdHJhY2sgaGF2ZSBiZWNvbWUgYWN0aXZlIG9yIHN0b3BwZWQgYmVpbmcgYWN0aXZlLgogKi8KCgpUZXh0VHJhY2sucHJvdG90eXBlLmFsbG93ZWRFdmVudHNfID0gewogIGN1ZWNoYW5nZTogJ2N1ZWNoYW5nZScKfTsKCi8qKgogKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGBBdWRpb1RyYWNrYC4gSWYgaXQgaXMgcGFydCBvZiBhbiB7QGxpbmsgQXVkaW9UcmFja0xpc3R9CiAqIG9ubHkgb25lIGBBdWRpb1RyYWNrYCBpbiB0aGUgbGlzdCB3aWxsIGJlIGVuYWJsZWQgYXQgYSB0aW1lLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjYXVkaW90cmFja30KICogQGV4dGVuZHMgVHJhY2sKICovCgp2YXIgQXVkaW9UcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHsKICBpbmhlcml0cyhBdWRpb1RyYWNrLCBfVHJhY2spOwoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzCiAgICoKICAgKiBAcGFyYW0ge0F1ZGlvVHJhY2t+S2luZH0gW29wdGlvbnMua2luZD0nJ10KICAgKiAgICAgICAgQSB2YWxpZCBhdWRpbyB0cmFjayBraW5kCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldCiAgICogICAgICAgIEEgdW5pcXVlIGlkIGZvciB0aGlzIEF1ZGlvVHJhY2suCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWw9JyddCiAgICogICAgICAgIFRoZSBtZW51IGxhYmVsIGZvciB0aGlzIHRyYWNrLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlPScnXQogICAqICAgICAgICBBIHZhbGlkIHR3byBjaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZS4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5hYmxlZF0KICAgKiAgICAgICAgSWYgdGhpcyB0cmFjayBpcyB0aGUgb25lIHRoYXQgaXMgY3VycmVudGx5IHBsYXlpbmcuIElmIHRoaXMgdHJhY2sgaXMgcGFydCBvZgogICAqICAgICAgICBhbiB7QGxpbmsgQXVkaW9UcmFja0xpc3R9LCBvbmx5IG9uZSB7QGxpbmsgQXVkaW9UcmFja30gd2lsbCBiZSBlbmFibGVkLgogICAqLwogIGZ1bmN0aW9uIEF1ZGlvVHJhY2soKSB7CiAgICB2YXIgX3RoaXMsIF9yZXQ7CgogICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQXVkaW9UcmFjayk7CgogICAgdmFyIHNldHRpbmdzID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHsKICAgICAga2luZDogQXVkaW9UcmFja0tpbmRbb3B0aW9ucy5raW5kXSB8fCAnJwogICAgfSk7CiAgICAvLyBvbiBJRTggdGhpcyB3aWxsIGJlIGEgZG9jdW1lbnQgZWxlbWVudAogICAgLy8gZm9yIGV2ZXJ5IG90aGVyIGJyb3dzZXIgdGhpcyB3aWxsIGJlIGEgbm9ybWFsIG9iamVjdAogICAgdmFyIHRyYWNrID0gKF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2suY2FsbCh0aGlzLCBzZXR0aW5ncykpLCBfdGhpcyk7CiAgICB2YXIgZW5hYmxlZCA9IGZhbHNlOwoKICAgIGlmIChJU19JRTgpIHsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBBdWRpb1RyYWNrLnByb3RvdHlwZSkgewogICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7CiAgICAgICAgICB0cmFja1twcm9wXSA9IEF1ZGlvVHJhY2sucHJvdG90eXBlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgQXVkaW9UcmFjawogICAgICogQG1lbWJlciB7Ym9vbGVhbn0gZW5hYmxlZAogICAgICogICAgICAgICBJZiB0aGlzIGBBdWRpb1RyYWNrYCBpcyBlbmFibGVkIG9yIG5vdC4gV2hlbiBzZXR0aW5nIHRoaXMgd2lsbAogICAgICogICAgICAgICBmaXJlIHtAbGluayBBdWRpb1RyYWNrI2VuYWJsZWRjaGFuZ2V9IGlmIHRoZSBzdGF0ZSBvZiBlbmFibGVkIGlzIGNoYW5nZWQuCiAgICAgKiBAaW5zdGFuY2UKICAgICAqCiAgICAgKiBAZmlyZXMgVmlkZW9UcmFjayNzZWxlY3RlZGNoYW5nZQogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJhY2ssICdlbmFibGVkJywgewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHsKICAgICAgICByZXR1cm4gZW5hYmxlZDsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQkJDEobmV3RW5hYmxlZCkgewogICAgICAgIC8vIGFuIGludmFsaWQgb3IgdW5jaGFuZ2VkIHZhbHVlCiAgICAgICAgaWYgKHR5cGVvZiBuZXdFbmFibGVkICE9PSAnYm9vbGVhbicgfHwgbmV3RW5hYmxlZCA9PT0gZW5hYmxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbmFibGVkID0gbmV3RW5hYmxlZDsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gZXZlbnQgdGhhdCBmaXJlcyB3aGVuIGVuYWJsZWQgY2hhbmdlcyBvbiB0aGlzIHRyYWNrLiBUaGlzIGFsbG93cwogICAgICAgICAqIHRoZSBBdWRpb1RyYWNrTGlzdCB0aGF0IGhvbGRzIHRoaXMgdHJhY2sgdG8gYWN0IGFjY29yZGluZ2x5LgogICAgICAgICAqCiAgICAgICAgICogPiBOb3RlOiBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBzcGVjISBOYXRpdmUgdHJhY2tzIHdpbGwgZG8KICAgICAgICAgKiAgICAgICAgIHRoaXMgaW50ZXJuYWxseSB3aXRob3V0IGFuIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IEF1ZGlvVHJhY2sjZW5hYmxlZGNoYW5nZQogICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICAgKi8KICAgICAgICB0aGlzLnRyaWdnZXIoJ2VuYWJsZWRjaGFuZ2UnKTsKICAgICAgfQogICAgfSk7CgogICAgLy8gaWYgdGhlIHVzZXIgc2V0cyB0aGlzIHRyYWNrIHRvIHNlbGVjdGVkIHRoZW4KICAgIC8vIHNldCBzZWxlY3RlZCB0byB0aGF0IHRydWUgdmFsdWUgb3RoZXJ3aXNlCiAgICAvLyB3ZSBrZWVwIGl0IGZhbHNlCiAgICBpZiAoc2V0dGluZ3MuZW5hYmxlZCkgewogICAgICB0cmFjay5lbmFibGVkID0gc2V0dGluZ3MuZW5hYmxlZDsKICAgIH0KICAgIHRyYWNrLmxvYWRlZF8gPSB0cnVlOwoKICAgIHJldHVybiBfcmV0ID0gdHJhY2ssIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpOwogIH0KCiAgcmV0dXJuIEF1ZGlvVHJhY2s7Cn0oVHJhY2spOwoKLyoqCiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgYFZpZGVvVHJhY2tgLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjdmlkZW90cmFja30KICogQGV4dGVuZHMgVHJhY2sKICovCgp2YXIgVmlkZW9UcmFjayA9IGZ1bmN0aW9uIChfVHJhY2spIHsKICBpbmhlcml0cyhWaWRlb1RyYWNrLCBfVHJhY2spOwoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICAgKiAgICAgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2luZD0nJ10KICAgKiAgICAgICAgQSB2YWxpZCB7QGxpbmsgVmlkZW9UcmFja35LaW5kfQogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmlkPSd2anNfdHJhY2tfJyArIEd1aWQubmV3R1VJRCgpXQogICAqICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhpcyBBdWRpb1RyYWNrLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsPScnXQogICAqICAgICAgICBUaGUgbWVudSBsYWJlbCBmb3IgdGhpcyB0cmFjay4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYW5ndWFnZT0nJ10KICAgKiAgICAgICAgQSB2YWxpZCB0d28gY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlbGVjdGVkXQogICAqICAgICAgICBJZiB0aGlzIHRyYWNrIGlzIHRoZSBvbmUgdGhhdCBpcyBjdXJyZW50bHkgcGxheWluZy4KICAgKi8KICBmdW5jdGlvbiBWaWRlb1RyYWNrKCkgewogICAgdmFyIF90aGlzLCBfcmV0OwoKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZGVvVHJhY2spOwoKICAgIHZhciBzZXR0aW5ncyA9IG1lcmdlT3B0aW9ucyhvcHRpb25zLCB7CiAgICAgIGtpbmQ6IFZpZGVvVHJhY2tLaW5kW29wdGlvbnMua2luZF0gfHwgJycKICAgIH0pOwoKICAgIC8vIG9uIElFOCB0aGlzIHdpbGwgYmUgYSBkb2N1bWVudCBlbGVtZW50CiAgICAvLyBmb3IgZXZlcnkgb3RoZXIgYnJvd3NlciB0aGlzIHdpbGwgYmUgYSBub3JtYWwgb2JqZWN0CiAgICB2YXIgdHJhY2sgPSAoX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UcmFjay5jYWxsKHRoaXMsIHNldHRpbmdzKSksIF90aGlzKTsKICAgIHZhciBzZWxlY3RlZCA9IGZhbHNlOwoKICAgIGlmIChJU19JRTgpIHsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBWaWRlb1RyYWNrLnByb3RvdHlwZSkgewogICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7CiAgICAgICAgICB0cmFja1twcm9wXSA9IFZpZGVvVHJhY2sucHJvdG90eXBlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIFZpZGVvVHJhY2sKICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IHNlbGVjdGVkCiAgICAgKiAgICAgICAgIElmIHRoaXMgYFZpZGVvVHJhY2tgIGlzIHNlbGVjdGVkIG9yIG5vdC4gV2hlbiBzZXR0aW5nIHRoaXMgd2lsbAogICAgICogICAgICAgICBmaXJlIHtAbGluayBWaWRlb1RyYWNrI3NlbGVjdGVkY2hhbmdlfSBpZiB0aGUgc3RhdGUgb2Ygc2VsZWN0ZWQgY2hhbmdlZC4KICAgICAqIEBpbnN0YW5jZQogICAgICoKICAgICAqIEBmaXJlcyBWaWRlb1RyYWNrI3NlbGVjdGVkY2hhbmdlCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFjaywgJ3NlbGVjdGVkJywgewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHsKICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKG5ld1NlbGVjdGVkKSB7CiAgICAgICAgLy8gYW4gaW52YWxpZCBvciB1bmNoYW5nZWQgdmFsdWUKICAgICAgICBpZiAodHlwZW9mIG5ld1NlbGVjdGVkICE9PSAnYm9vbGVhbicgfHwgbmV3U2VsZWN0ZWQgPT09IHNlbGVjdGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGVjdGVkID0gbmV3U2VsZWN0ZWQ7CgogICAgICAgIC8qKgogICAgICAgICAqIEFuIGV2ZW50IHRoYXQgZmlyZXMgd2hlbiBzZWxlY3RlZCBjaGFuZ2VzIG9uIHRoaXMgdHJhY2suIFRoaXMgYWxsb3dzCiAgICAgICAgICogdGhlIFZpZGVvVHJhY2tMaXN0IHRoYXQgaG9sZHMgdGhpcyB0cmFjayB0byBhY3QgYWNjb3JkaW5nbHkuCiAgICAgICAgICoKICAgICAgICAgKiA+IE5vdGU6IFRoaXMgaXMgbm90IHBhcnQgb2YgdGhlIHNwZWMhIE5hdGl2ZSB0cmFja3Mgd2lsbCBkbwogICAgICAgICAqICAgICAgICAgdGhpcyBpbnRlcm5hbGx5IHdpdGhvdXQgYW4gZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXZlbnQgVmlkZW9UcmFjayNzZWxlY3RlZGNoYW5nZQogICAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICAgKi8KICAgICAgICB0aGlzLnRyaWdnZXIoJ3NlbGVjdGVkY2hhbmdlJyk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIGlmIHRoZSB1c2VyIHNldHMgdGhpcyB0cmFjayB0byBzZWxlY3RlZCB0aGVuCiAgICAvLyBzZXQgc2VsZWN0ZWQgdG8gdGhhdCB0cnVlIHZhbHVlIG90aGVyd2lzZQogICAgLy8gd2Uga2VlcCBpdCBmYWxzZQogICAgaWYgKHNldHRpbmdzLnNlbGVjdGVkKSB7CiAgICAgIHRyYWNrLnNlbGVjdGVkID0gc2V0dGluZ3Muc2VsZWN0ZWQ7CiAgICB9CgogICAgcmV0dXJuIF9yZXQgPSB0cmFjaywgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7CiAgfQoKICByZXR1cm4gVmlkZW9UcmFjazsKfShUcmFjayk7CgovKioKICogQGZpbGUgaHRtbC10cmFjay1lbGVtZW50LmpzCiAqLwoKLyoqCiAqIEBtZW1iZXJvZiBIVE1MVHJhY2tFbGVtZW50CiAqIEB0eXBlZGVmIHtIVE1MVHJhY2tFbGVtZW50flJlYWR5U3RhdGV9CiAqIEBlbnVtIHtudW1iZXJ9CiAqLwp2YXIgTk9ORSA9IDA7CnZhciBMT0FESU5HID0gMTsKdmFyIExPQURFRCA9IDI7CnZhciBFUlJPUiA9IDM7CgovKioKICogQSBzaW5nbGUgdHJhY2sgcmVwcmVzZW50ZWQgaW4gdGhlIERPTS4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2h0bWx0cmFja2VsZW1lbnR9CiAqIEBleHRlbmRzIEV2ZW50VGFyZ2V0CiAqLwoKdmFyIEhUTUxUcmFja0VsZW1lbnQgPSBmdW5jdGlvbiAoX0V2ZW50VGFyZ2V0KSB7CiAgaW5oZXJpdHMoSFRNTFRyYWNrRWxlbWVudCwgX0V2ZW50VGFyZ2V0KTsKCiAgLyoqCiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucz17fQogICAqICAgICAgICBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXMKICAgKgogICAqIEBwYXJhbSB7VGVjaH0gb3B0aW9ucy50ZWNoCiAgICogICAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSB0ZWNoIHRoYXQgb3ducyB0aGlzIEhUTUxUcmFja0VsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge1RleHRUcmFja35LaW5kfSBbb3B0aW9ucy5raW5kPSdzdWJ0aXRsZXMnXQogICAqICAgICAgICBBIHZhbGlkIHRleHQgdHJhY2sga2luZC4KICAgKgogICAqIEBwYXJhbSB7VGV4dFRyYWNrfk1vZGV9IFtvcHRpb25zLm1vZGU9J2Rpc2FibGVkJ10KICAgKiAgICAgICAgQSB2YWxpZCB0ZXh0IHRyYWNrIG1vZGUuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuaWQ9J3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCldCiAgICogICAgICAgIEEgdW5pcXVlIGlkIGZvciB0aGlzIFRleHRUcmFjay4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbD0nJ10KICAgKiAgICAgICAgVGhlIG1lbnUgbGFiZWwgZm9yIHRoaXMgdHJhY2suCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9JyddCiAgICogICAgICAgIEEgdmFsaWQgdHdvIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY2xhbmc9JyddCiAgICogICAgICAgIEEgdmFsaWQgdHdvIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlLiBBbiBhbHRlcm5hdGl2ZSwgYnV0IGRlcHJpb3JpdGl6ZWQKICAgKiAgICAgICAgdmVzaW9uIG9mIGBvcHRpb25zLmxhbmd1YWdlYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY10KICAgKiAgICAgICAgQSB1cmwgdG8gVGV4dFRyYWNrIGN1ZXMuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRlZmF1bHRdCiAgICogICAgICAgIElmIHRoaXMgdHJhY2sgc2hvdWxkIGRlZmF1bHQgdG8gb24gb3Igb2ZmLgogICAqLwogIGZ1bmN0aW9uIEhUTUxUcmFja0VsZW1lbnQoKSB7CiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIVE1MVHJhY2tFbGVtZW50KTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9FdmVudFRhcmdldC5jYWxsKHRoaXMpKTsKCiAgICB2YXIgcmVhZHlTdGF0ZSA9IHZvaWQgMDsKICAgIHZhciB0cmFja0VsZW1lbnQgPSBfdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIGlmIChJU19JRTgpIHsKICAgICAgdHJhY2tFbGVtZW50ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdjdXN0b20nKTsKCiAgICAgIGZvciAodmFyIHByb3AgaW4gSFRNTFRyYWNrRWxlbWVudC5wcm90b3R5cGUpIHsKICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykgewogICAgICAgICAgdHJhY2tFbGVtZW50W3Byb3BdID0gSFRNTFRyYWNrRWxlbWVudC5wcm90b3R5cGVbcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIHRyYWNrID0gbmV3IFRleHRUcmFjayhvcHRpb25zKTsKCiAgICB0cmFja0VsZW1lbnQua2luZCA9IHRyYWNrLmtpbmQ7CiAgICB0cmFja0VsZW1lbnQuc3JjID0gdHJhY2suc3JjOwogICAgdHJhY2tFbGVtZW50LnNyY2xhbmcgPSB0cmFjay5sYW5ndWFnZTsKICAgIHRyYWNrRWxlbWVudC5sYWJlbCA9IHRyYWNrLmxhYmVsOwogICAgdHJhY2tFbGVtZW50WydkZWZhdWx0J10gPSB0cmFja1snZGVmYXVsdCddOwoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnQKICAgICAqIEBtZW1iZXIge0hUTUxUcmFja0VsZW1lbnR+UmVhZHlTdGF0ZX0gcmVhZHlTdGF0ZQogICAgICogICAgICAgICBUaGUgY3VycmVudCByZWFkeSBzdGF0ZSBvZiB0aGUgdHJhY2sgZWxlbWVudC4KICAgICAqIEBpbnN0YW5jZQogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJhY2tFbGVtZW50LCAncmVhZHlTdGF0ZScsIHsKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkJDEoKSB7CiAgICAgICAgcmV0dXJuIHJlYWR5U3RhdGU7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQG1lbWJlcm9mIEhUTUxUcmFja0VsZW1lbnQKICAgICAqIEBtZW1iZXIge1RleHRUcmFja30gdHJhY2sKICAgICAqICAgICAgICAgVGhlIHVuZGVybHlpbmcgVGV4dFRyYWNrIG9iamVjdC4KICAgICAqIEBpbnN0YW5jZQogICAgICoKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyYWNrRWxlbWVudCwgJ3RyYWNrJywgewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQkMSgpIHsKICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgIH0KICAgIH0pOwoKICAgIHJlYWR5U3RhdGUgPSBOT05FOwoKICAgIC8qKgogICAgICogQGxpc3RlbnMgVGV4dFRyYWNrI2xvYWRlZGRhdGEKICAgICAqIEBmaXJlcyBIVE1MVHJhY2tFbGVtZW50I2xvYWQKICAgICAqLwogICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgcmVhZHlTdGF0ZSA9IExPQURFRDsKCiAgICAgIHRyYWNrRWxlbWVudC50cmlnZ2VyKHsKICAgICAgICB0eXBlOiAnbG9hZCcsCiAgICAgICAgdGFyZ2V0OiB0cmFja0VsZW1lbnQKICAgICAgfSk7CiAgICB9KTsKCiAgICBpZiAoSVNfSUU4KSB7CiAgICAgIHZhciBfcmV0OwoKICAgICAgcmV0dXJuIF9yZXQgPSB0cmFja0VsZW1lbnQsIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpOwogICAgfQogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgcmV0dXJuIEhUTUxUcmFja0VsZW1lbnQ7Cn0oRXZlbnRUYXJnZXQpOwoKSFRNTFRyYWNrRWxlbWVudC5wcm90b3R5cGUuYWxsb3dlZEV2ZW50c18gPSB7CiAgbG9hZDogJ2xvYWQnCn07CgpIVE1MVHJhY2tFbGVtZW50Lk5PTkUgPSBOT05FOwpIVE1MVHJhY2tFbGVtZW50LkxPQURJTkcgPSBMT0FESU5HOwpIVE1MVHJhY2tFbGVtZW50LkxPQURFRCA9IExPQURFRDsKSFRNTFRyYWNrRWxlbWVudC5FUlJPUiA9IEVSUk9SOwoKLyoKICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0cmFjayBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWQgaW4KICogcGxheWVyLmpzLCB0ZWNoLmpzLCBodG1sNS5qcyBhbmQgcG9zc2libHkgb3RoZXIgdGVjaHMgaW4gdGhlIGZ1dHVyZS4KICovCgp2YXIgTk9STUFMID0gewogIGF1ZGlvOiB7CiAgICBMaXN0Q2xhc3M6IEF1ZGlvVHJhY2tMaXN0LAogICAgVHJhY2tDbGFzczogQXVkaW9UcmFjaywKICAgIGNhcGl0YWxOYW1lOiAnQXVkaW8nCiAgfSwKICB2aWRlbzogewogICAgTGlzdENsYXNzOiBWaWRlb1RyYWNrTGlzdCwKICAgIFRyYWNrQ2xhc3M6IFZpZGVvVHJhY2ssCiAgICBjYXBpdGFsTmFtZTogJ1ZpZGVvJwogIH0sCiAgdGV4dDogewogICAgTGlzdENsYXNzOiBUZXh0VHJhY2tMaXN0LAogICAgVHJhY2tDbGFzczogVGV4dFRyYWNrLAogICAgY2FwaXRhbE5hbWU6ICdUZXh0JwogIH0KfTsKCk9iamVjdC5rZXlzKE5PUk1BTCkuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogIE5PUk1BTFt0eXBlXS5nZXR0ZXJOYW1lID0gdHlwZSArICdUcmFja3MnOwogIE5PUk1BTFt0eXBlXS5wcml2YXRlTmFtZSA9IHR5cGUgKyAnVHJhY2tzXyc7Cn0pOwoKdmFyIFJFTU9URSA9IHsKICByZW1vdGVUZXh0OiB7CiAgICBMaXN0Q2xhc3M6IFRleHRUcmFja0xpc3QsCiAgICBUcmFja0NsYXNzOiBUZXh0VHJhY2ssCiAgICBjYXBpdGFsTmFtZTogJ1JlbW90ZVRleHQnLAogICAgZ2V0dGVyTmFtZTogJ3JlbW90ZVRleHRUcmFja3MnLAogICAgcHJpdmF0ZU5hbWU6ICdyZW1vdGVUZXh0VHJhY2tzXycKICB9LAogIHJlbW90ZVRleHRFbDogewogICAgTGlzdENsYXNzOiBIdG1sVHJhY2tFbGVtZW50TGlzdCwKICAgIFRyYWNrQ2xhc3M6IEhUTUxUcmFja0VsZW1lbnQsCiAgICBjYXBpdGFsTmFtZTogJ1JlbW90ZVRleHRUcmFja0VscycsCiAgICBnZXR0ZXJOYW1lOiAncmVtb3RlVGV4dFRyYWNrRWxzJywKICAgIHByaXZhdGVOYW1lOiAncmVtb3RlVGV4dFRyYWNrRWxzXycKICB9Cn07Cgp2YXIgQUxMID0gbWVyZ2VPcHRpb25zKE5PUk1BTCwgUkVNT1RFKTsKClJFTU9URS5uYW1lcyA9IE9iamVjdC5rZXlzKFJFTU9URSk7Ck5PUk1BTC5uYW1lcyA9IE9iamVjdC5rZXlzKE5PUk1BTCk7CkFMTC5uYW1lcyA9IFtdLmNvbmNhdChSRU1PVEUubmFtZXMpLmNvbmNhdChOT1JNQUwubmFtZXMpOwoKLyoqCiAqIENvcHlyaWdodCAyMDEzIHZ0dC5qcyBDb250cmlidXRvcnMKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKLyogLSotIE1vZGU6IEphdmE7IHRhYi13aWR0aDogMjsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjLWJhc2ljLW9mZnNldDogMiAtKi0gKi8KLyogdmltOiBzZXQgc2hpZnR3aWR0aD0yIHRhYnN0b3A9MiBhdXRvaW5kZW50IGNpbmRlbnQgZXhwYW5kdGFiOiAqLwp2YXIgX29iakNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uKCkgewogIGZ1bmN0aW9uIEYoKSB7fQogIHJldHVybiBmdW5jdGlvbihvKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgc2hpbSBvbmx5IGFjY2VwdHMgb25lIHBhcmFtZXRlci4nKTsKICAgIH0KICAgIEYucHJvdG90eXBlID0gbzsKICAgIHJldHVybiBuZXcgRigpOwogIH07Cn0pKCk7CgovLyBDcmVhdGVzIGEgbmV3IFBhcnNlckVycm9yIG9iamVjdCBmcm9tIGFuIGVycm9yRGF0YSBvYmplY3QuIFRoZSBlcnJvckRhdGEKLy8gb2JqZWN0IHNob3VsZCBoYXZlIGRlZmF1bHQgY29kZSBhbmQgbWVzc2FnZSBwcm9wZXJ0aWVzLiBUaGUgZGVmYXVsdCBtZXNzYWdlCi8vIHByb3BlcnR5IGNhbiBiZSBvdmVycmlkZW4gYnkgcGFzc2luZyBpbiBhIG1lc3NhZ2UgcGFyYW1ldGVyLgovLyBTZWUgUGFyc2luZ0Vycm9yLkVycm9ycyBiZWxvdyBmb3IgYWNjZXB0YWJsZSBlcnJvcnMuCmZ1bmN0aW9uIFBhcnNpbmdFcnJvcihlcnJvckRhdGEsIG1lc3NhZ2UpIHsKICB0aGlzLm5hbWUgPSAiUGFyc2luZ0Vycm9yIjsKICB0aGlzLmNvZGUgPSBlcnJvckRhdGEuY29kZTsKICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IGVycm9yRGF0YS5tZXNzYWdlOwp9ClBhcnNpbmdFcnJvci5wcm90b3R5cGUgPSBfb2JqQ3JlYXRlKEVycm9yLnByb3RvdHlwZSk7ClBhcnNpbmdFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJzaW5nRXJyb3I7CgovLyBQYXJzaW5nRXJyb3IgbWV0YWRhdGEgZm9yIGFjY2VwdGFibGUgUGFyc2luZ0Vycm9ycy4KUGFyc2luZ0Vycm9yLkVycm9ycyA9IHsKICBCYWRTaWduYXR1cmU6IHsKICAgIGNvZGU6IDAsCiAgICBtZXNzYWdlOiAiTWFsZm9ybWVkIFdlYlZUVCBzaWduYXR1cmUuIgogIH0sCiAgQmFkVGltZVN0YW1wOiB7CiAgICBjb2RlOiAxLAogICAgbWVzc2FnZTogIk1hbGZvcm1lZCB0aW1lIHN0YW1wLiIKICB9Cn07CgovLyBUcnkgdG8gcGFyc2UgaW5wdXQgYXMgYSB0aW1lIHN0YW1wLgpmdW5jdGlvbiBwYXJzZVRpbWVTdGFtcChpbnB1dCkgewoKICBmdW5jdGlvbiBjb21wdXRlU2Vjb25kcyhoLCBtLCBzLCBmKSB7CiAgICByZXR1cm4gKGggfCAwKSAqIDM2MDAgKyAobSB8IDApICogNjAgKyAocyB8IDApICsgKGYgfCAwKSAvIDEwMDA7CiAgfQoKICB2YXIgbSA9IGlucHV0Lm1hdGNoKC9eKFxkKyk6KFxkezJ9KSg6XGR7Mn0pP1wuKFxkezN9KS8pOwogIGlmICghbSkgewogICAgcmV0dXJuIG51bGw7CiAgfQoKICBpZiAobVszXSkgewogICAgLy8gVGltZXN0YW1wIHRha2VzIHRoZSBmb3JtIG9mIFtob3Vyc106W21pbnV0ZXNdOltzZWNvbmRzXS5bbWlsbGlzZWNvbmRzXQogICAgcmV0dXJuIGNvbXB1dGVTZWNvbmRzKG1bMV0sIG1bMl0sIG1bM10ucmVwbGFjZSgiOiIsICIiKSwgbVs0XSk7CiAgfSBlbHNlIGlmIChtWzFdID4gNTkpIHsKICAgIC8vIFRpbWVzdGFtcCB0YWtlcyB0aGUgZm9ybSBvZiBbaG91cnNdOlttaW51dGVzXS5bbWlsbGlzZWNvbmRzXQogICAgLy8gRmlyc3QgcG9zaXRpb24gaXMgaG91cnMgYXMgaXQncyBvdmVyIDU5LgogICAgcmV0dXJuIGNvbXB1dGVTZWNvbmRzKG1bMV0sIG1bMl0sIDAsICBtWzRdKTsKICB9IGVsc2UgewogICAgLy8gVGltZXN0YW1wIHRha2VzIHRoZSBmb3JtIG9mIFttaW51dGVzXTpbc2Vjb25kc10uW21pbGxpc2Vjb25kc10KICAgIHJldHVybiBjb21wdXRlU2Vjb25kcygwLCBtWzFdLCBtWzJdLCBtWzRdKTsKICB9Cn0KCi8vIEEgc2V0dGluZ3Mgb2JqZWN0IGhvbGRzIGtleS92YWx1ZSBwYWlycyBhbmQgd2lsbCBpZ25vcmUgYW55dGhpbmcgYnV0IHRoZSBmaXJzdAovLyBhc3NpZ25tZW50IHRvIGEgc3BlY2lmaWMga2V5LgpmdW5jdGlvbiBTZXR0aW5ncygpIHsKICB0aGlzLnZhbHVlcyA9IF9vYmpDcmVhdGUobnVsbCk7Cn0KClNldHRpbmdzLnByb3RvdHlwZSA9IHsKICAvLyBPbmx5IGFjY2VwdCB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhbnkga2V5LgogIHNldDogZnVuY3Rpb24oaywgdikgewogICAgaWYgKCF0aGlzLmdldChrKSAmJiB2ICE9PSAiIikgewogICAgICB0aGlzLnZhbHVlc1trXSA9IHY7CiAgICB9CiAgfSwKICAvLyBSZXR1cm4gdGhlIHZhbHVlIGZvciBhIGtleSwgb3IgYSBkZWZhdWx0IHZhbHVlLgogIC8vIElmICdkZWZhdWx0S2V5JyBpcyBwYXNzZWQgdGhlbiAnZGZsdCcgaXMgYXNzdW1lZCB0byBiZSBhbiBvYmplY3Qgd2l0aAogIC8vIGEgbnVtYmVyIG9mIHBvc3NpYmxlIGRlZmF1bHQgdmFsdWVzIGFzIHByb3BlcnRpZXMgd2hlcmUgJ2RlZmF1bHRLZXknIGlzCiAgLy8gdGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGNob3Nlbjsgb3RoZXJ3aXNlIGl0J3MgYXNzdW1lZCB0byBiZQogIC8vIGEgc2luZ2xlIHZhbHVlLgogIGdldDogZnVuY3Rpb24oaywgZGZsdCwgZGVmYXVsdEtleSkgewogICAgaWYgKGRlZmF1bHRLZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuaGFzKGspID8gdGhpcy52YWx1ZXNba10gOiBkZmx0W2RlZmF1bHRLZXldOwogICAgfQogICAgcmV0dXJuIHRoaXMuaGFzKGspID8gdGhpcy52YWx1ZXNba10gOiBkZmx0OwogIH0sCiAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgdmFsdWUgZm9yIGEga2V5LgogIGhhczogZnVuY3Rpb24oaykgewogICAgcmV0dXJuIGsgaW4gdGhpcy52YWx1ZXM7CiAgfSwKICAvLyBBY2NlcHQgYSBzZXR0aW5nIGlmIGl0cyBvbmUgb2YgdGhlIGdpdmVuIGFsdGVybmF0aXZlcy4KICBhbHQ6IGZ1bmN0aW9uKGssIHYsIGEpIHsKICAgIGZvciAodmFyIG4gPSAwOyBuIDwgYS5sZW5ndGg7ICsrbikgewogICAgICBpZiAodiA9PT0gYVtuXSkgewogICAgICAgIHRoaXMuc2V0KGssIHYpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICAvLyBBY2NlcHQgYSBzZXR0aW5nIGlmIGl0cyBhIHZhbGlkIChzaWduZWQpIGludGVnZXIuCiAgaW50ZWdlcjogZnVuY3Rpb24oaywgdikgewogICAgaWYgKC9eLT9cZCskLy50ZXN0KHYpKSB7IC8vIGludGVnZXIKICAgICAgdGhpcy5zZXQoaywgcGFyc2VJbnQodiwgMTApKTsKICAgIH0KICB9LAogIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgcGVyY2VudGFnZS4KICBwZXJjZW50OiBmdW5jdGlvbihrLCB2KSB7CiAgICB2YXIgbTsKICAgIGlmICgobSA9IHYubWF0Y2goL14oW1xkXXsxLDN9KShcLltcZF0qKT8lJC8pKSkgewogICAgICB2ID0gcGFyc2VGbG9hdCh2KTsKICAgICAgaWYgKHYgPj0gMCAmJiB2IDw9IDEwMCkgewogICAgICAgIHRoaXMuc2V0KGssIHYpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9OwoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIGlucHV0IGludG8gZ3JvdXBzIHNlcGFyYXRlZCBieSAnZ3JvdXBEZWxpbScsIGFuZAovLyBpbnRlcnByZXRlIGVhY2ggZ3JvdXAgYXMgYSBrZXkvdmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgJ2tleVZhbHVlRGVsaW0nLgpmdW5jdGlvbiBwYXJzZU9wdGlvbnMoaW5wdXQsIGNhbGxiYWNrLCBrZXlWYWx1ZURlbGltLCBncm91cERlbGltKSB7CiAgdmFyIGdyb3VwcyA9IGdyb3VwRGVsaW0gPyBpbnB1dC5zcGxpdChncm91cERlbGltKSA6IFtpbnB1dF07CiAgZm9yICh2YXIgaSBpbiBncm91cHMpIHsKICAgIGlmICh0eXBlb2YgZ3JvdXBzW2ldICE9PSAic3RyaW5nIikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIHZhciBrdiA9IGdyb3Vwc1tpXS5zcGxpdChrZXlWYWx1ZURlbGltKTsKICAgIGlmIChrdi5sZW5ndGggIT09IDIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2YXIgayA9IGt2WzBdOwogICAgdmFyIHYgPSBrdlsxXTsKICAgIGNhbGxiYWNrKGssIHYpOwogIH0KfQoKZnVuY3Rpb24gcGFyc2VDdWUoaW5wdXQsIGN1ZSwgcmVnaW9uTGlzdCkgewogIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCBpbnB1dCBpZiB3ZSBuZWVkIHRvIHRocm93IGFuIGVycm9yLgogIHZhciBvSW5wdXQgPSBpbnB1dDsKICAvLyA0LjEgV2ViVlRUIHRpbWVzdGFtcAogIGZ1bmN0aW9uIGNvbnN1bWVUaW1lU3RhbXAoKSB7CiAgICB2YXIgdHMgPSBwYXJzZVRpbWVTdGFtcChpbnB1dCk7CiAgICBpZiAodHMgPT09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFRpbWVTdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWxmb3JtZWQgdGltZXN0YW1wOiAiICsgb0lucHV0KTsKICAgIH0KICAgIC8vIFJlbW92ZSB0aW1lIHN0YW1wIGZyb20gaW5wdXQuCiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL15bXlxzYS16QS1aLV0rLywgIiIpOwogICAgcmV0dXJuIHRzOwogIH0KCiAgLy8gNC40LjIgV2ViVlRUIGN1ZSBzZXR0aW5ncwogIGZ1bmN0aW9uIGNvbnN1bWVDdWVTZXR0aW5ncyhpbnB1dCwgY3VlKSB7CiAgICB2YXIgc2V0dGluZ3MgPSBuZXcgU2V0dGluZ3MoKTsKCiAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgIHN3aXRjaCAoaykgewogICAgICBjYXNlICJyZWdpb24iOgogICAgICAgIC8vIEZpbmQgdGhlIGxhc3QgcmVnaW9uIHdlIHBhcnNlZCB3aXRoIHRoZSBzYW1lIHJlZ2lvbiBpZC4KICAgICAgICBmb3IgKHZhciBpID0gcmVnaW9uTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgaWYgKHJlZ2lvbkxpc3RbaV0uaWQgPT09IHYpIHsKICAgICAgICAgICAgc2V0dGluZ3Muc2V0KGssIHJlZ2lvbkxpc3RbaV0ucmVnaW9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ2ZXJ0aWNhbCI6CiAgICAgICAgc2V0dGluZ3MuYWx0KGssIHYsIFsicmwiLCAibHIiXSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImxpbmUiOgogICAgICAgIHZhciB2YWxzID0gdi5zcGxpdCgiLCIpLAogICAgICAgICAgICB2YWxzMCA9IHZhbHNbMF07CiAgICAgICAgc2V0dGluZ3MuaW50ZWdlcihrLCB2YWxzMCk7CiAgICAgICAgc2V0dGluZ3MucGVyY2VudChrLCB2YWxzMCkgPyBzZXR0aW5ncy5zZXQoInNuYXBUb0xpbmVzIiwgZmFsc2UpIDogbnVsbDsKICAgICAgICBzZXR0aW5ncy5hbHQoaywgdmFsczAsIFsiYXV0byJdKTsKICAgICAgICBpZiAodmFscy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHNldHRpbmdzLmFsdCgibGluZUFsaWduIiwgdmFsc1sxXSwgWyJzdGFydCIsICJtaWRkbGUiLCAiZW5kIl0pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAicG9zaXRpb24iOgogICAgICAgIHZhbHMgPSB2LnNwbGl0KCIsIik7CiAgICAgICAgc2V0dGluZ3MucGVyY2VudChrLCB2YWxzWzBdKTsKICAgICAgICBpZiAodmFscy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHNldHRpbmdzLmFsdCgicG9zaXRpb25BbGlnbiIsIHZhbHNbMV0sIFsic3RhcnQiLCAibWlkZGxlIiwgImVuZCJdKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInNpemUiOgogICAgICAgIHNldHRpbmdzLnBlcmNlbnQoaywgdik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImFsaWduIjoKICAgICAgICBzZXR0aW5ncy5hbHQoaywgdiwgWyJzdGFydCIsICJtaWRkbGUiLCAiZW5kIiwgImxlZnQiLCAicmlnaHQiXSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0sIC86LywgL1xzLyk7CgogICAgLy8gQXBwbHkgZGVmYXVsdCB2YWx1ZXMgZm9yIGFueSBtaXNzaW5nIGZpZWxkcy4KICAgIGN1ZS5yZWdpb24gPSBzZXR0aW5ncy5nZXQoInJlZ2lvbiIsIG51bGwpOwogICAgY3VlLnZlcnRpY2FsID0gc2V0dGluZ3MuZ2V0KCJ2ZXJ0aWNhbCIsICIiKTsKICAgIGN1ZS5saW5lID0gc2V0dGluZ3MuZ2V0KCJsaW5lIiwgImF1dG8iKTsKICAgIGN1ZS5saW5lQWxpZ24gPSBzZXR0aW5ncy5nZXQoImxpbmVBbGlnbiIsICJzdGFydCIpOwogICAgY3VlLnNuYXBUb0xpbmVzID0gc2V0dGluZ3MuZ2V0KCJzbmFwVG9MaW5lcyIsIHRydWUpOwogICAgY3VlLnNpemUgPSBzZXR0aW5ncy5nZXQoInNpemUiLCAxMDApOwogICAgY3VlLmFsaWduID0gc2V0dGluZ3MuZ2V0KCJhbGlnbiIsICJtaWRkbGUiKTsKICAgIGN1ZS5wb3NpdGlvbiA9IHNldHRpbmdzLmdldCgicG9zaXRpb24iLCB7CiAgICAgIHN0YXJ0OiAwLAogICAgICBsZWZ0OiAwLAogICAgICBtaWRkbGU6IDUwLAogICAgICBlbmQ6IDEwMCwKICAgICAgcmlnaHQ6IDEwMAogICAgfSwgY3VlLmFsaWduKTsKICAgIGN1ZS5wb3NpdGlvbkFsaWduID0gc2V0dGluZ3MuZ2V0KCJwb3NpdGlvbkFsaWduIiwgewogICAgICBzdGFydDogInN0YXJ0IiwKICAgICAgbGVmdDogInN0YXJ0IiwKICAgICAgbWlkZGxlOiAibWlkZGxlIiwKICAgICAgZW5kOiAiZW5kIiwKICAgICAgcmlnaHQ6ICJlbmQiCiAgICB9LCBjdWUuYWxpZ24pOwogIH0KCiAgZnVuY3Rpb24gc2tpcFdoaXRlc3BhY2UoKSB7CiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL15ccysvLCAiIik7CiAgfQoKICAvLyA0LjEgV2ViVlRUIGN1ZSB0aW1pbmdzLgogIHNraXBXaGl0ZXNwYWNlKCk7CiAgY3VlLnN0YXJ0VGltZSA9IGNvbnN1bWVUaW1lU3RhbXAoKTsgICAvLyAoMSkgY29sbGVjdCBjdWUgc3RhcnQgdGltZQogIHNraXBXaGl0ZXNwYWNlKCk7CiAgaWYgKGlucHV0LnN1YnN0cigwLCAzKSAhPT0gIi0tPiIpIHsgICAgIC8vICgzKSBuZXh0IGNoYXJhY3RlcnMgbXVzdCBtYXRjaCAiLS0+IgogICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFRpbWVTdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCB0aW1lIHN0YW1wICh0aW1lIHN0YW1wcyBtdXN0IGJlIHNlcGFyYXRlZCBieSAnLS0+Jyk6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBvSW5wdXQpOwogIH0KICBpbnB1dCA9IGlucHV0LnN1YnN0cigzKTsKICBza2lwV2hpdGVzcGFjZSgpOwogIGN1ZS5lbmRUaW1lID0gY29uc3VtZVRpbWVTdGFtcCgpOyAgICAgLy8gKDUpIGNvbGxlY3QgY3VlIGVuZCB0aW1lCgogIC8vIDQuMSBXZWJWVFQgY3VlIHNldHRpbmdzIGxpc3QuCiAgc2tpcFdoaXRlc3BhY2UoKTsKICBjb25zdW1lQ3VlU2V0dGluZ3MoaW5wdXQsIGN1ZSk7Cn0KCnZhciBFU0NBUEUgPSB7CiAgIiZhbXA7IjogIiYiLAogICImbHQ7IjogIjwiLAogICImZ3Q7IjogIj4iLAogICImbHJtOyI6ICJcdTIwMGUiLAogICImcmxtOyI6ICJcdTIwMGYiLAogICImbmJzcDsiOiAiXHUwMGEwIgp9OwoKdmFyIFRBR19OQU1FID0gewogIGM6ICJzcGFuIiwKICBpOiAiaSIsCiAgYjogImIiLAogIHU6ICJ1IiwKICBydWJ5OiAicnVieSIsCiAgcnQ6ICJydCIsCiAgdjogInNwYW4iLAogIGxhbmc6ICJzcGFuIgp9OwoKdmFyIFRBR19BTk5PVEFUSU9OID0gewogIHY6ICJ0aXRsZSIsCiAgbGFuZzogImxhbmciCn07Cgp2YXIgTkVFRFNfUEFSRU5UID0gewogIHJ0OiAicnVieSIKfTsKCi8vIFBhcnNlIGNvbnRlbnQgaW50byBhIGRvY3VtZW50IGZyYWdtZW50LgpmdW5jdGlvbiBwYXJzZUNvbnRlbnQod2luZG93LCBpbnB1dCkgewogIGZ1bmN0aW9uIG5leHRUb2tlbigpIHsKICAgIC8vIENoZWNrIGZvciBlbmQtb2Ytc3RyaW5nLgogICAgaWYgKCFpbnB1dCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyBDb25zdW1lICduJyBjaGFyYWN0ZXJzIGZyb20gdGhlIGlucHV0LgogICAgZnVuY3Rpb24gY29uc3VtZShyZXN1bHQpIHsKICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHIocmVzdWx0Lmxlbmd0aCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIG0gPSBpbnB1dC5tYXRjaCgvXihbXjxdKikoPFtePl0rPj8pPy8pOwogICAgLy8gSWYgdGhlcmUgaXMgc29tZSB0ZXh0IGJlZm9yZSB0aGUgbmV4dCB0YWcsIHJldHVybiBpdCwgb3RoZXJ3aXNlIHJldHVybgogICAgLy8gdGhlIHRhZy4KICAgIHJldHVybiBjb25zdW1lKG1bMV0gPyBtWzFdIDogbVsyXSk7CiAgfQoKICAvLyBVbmVzY2FwZSBhIHN0cmluZyAncycuCiAgZnVuY3Rpb24gdW5lc2NhcGUxKGUpIHsKICAgIHJldHVybiBFU0NBUEVbZV07CiAgfQogIGZ1bmN0aW9uIHVuZXNjYXBlKHMpIHsKICAgIHdoaWxlICgobSA9IHMubWF0Y2goLyYoYW1wfGx0fGd0fGxybXxybG18bmJzcCk7LykpKSB7CiAgICAgIHMgPSBzLnJlcGxhY2UobVswXSwgdW5lc2NhcGUxKTsKICAgIH0KICAgIHJldHVybiBzOwogIH0KCiAgZnVuY3Rpb24gc2hvdWxkQWRkKGN1cnJlbnQsIGVsZW1lbnQpIHsKICAgIHJldHVybiAhTkVFRFNfUEFSRU5UW2VsZW1lbnQubG9jYWxOYW1lXSB8fAogICAgICAgICAgIE5FRURTX1BBUkVOVFtlbGVtZW50LmxvY2FsTmFtZV0gPT09IGN1cnJlbnQubG9jYWxOYW1lOwogIH0KCiAgLy8gQ3JlYXRlIGFuIGVsZW1lbnQgZm9yIHRoaXMgdGFnLgogIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgYW5ub3RhdGlvbikgewogICAgdmFyIHRhZ05hbWUgPSBUQUdfTkFNRVt0eXBlXTsKICAgIGlmICghdGFnTmFtZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBlbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CiAgICBlbGVtZW50LmxvY2FsTmFtZSA9IHRhZ05hbWU7CiAgICB2YXIgbmFtZSA9IFRBR19BTk5PVEFUSU9OW3R5cGVdOwogICAgaWYgKG5hbWUgJiYgYW5ub3RhdGlvbikgewogICAgICBlbGVtZW50W25hbWVdID0gYW5ub3RhdGlvbi50cmltKCk7CiAgICB9CiAgICByZXR1cm4gZWxlbWVudDsKICB9CgogIHZhciByb290RGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAogICAgICBjdXJyZW50ID0gcm9vdERpdiwKICAgICAgdCwKICAgICAgdGFnU3RhY2sgPSBbXTsKCiAgd2hpbGUgKCh0ID0gbmV4dFRva2VuKCkpICE9PSBudWxsKSB7CiAgICBpZiAodFswXSA9PT0gJzwnKSB7CiAgICAgIGlmICh0WzFdID09PSAiaW5kZXguaHRtbCIpIHsKICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyB0YWcgbWF0Y2hlcywgbW92ZSBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgbm9kZS4KICAgICAgICBpZiAodGFnU3RhY2subGVuZ3RoICYmCiAgICAgICAgICAgIHRhZ1N0YWNrW3RhZ1N0YWNrLmxlbmd0aCAtIDFdID09PSB0LnN1YnN0cigyKS5yZXBsYWNlKCI+IiwgIiIpKSB7CiAgICAgICAgICB0YWdTdGFjay5wb3AoKTsKICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIC8vIE90aGVyd2lzZSBqdXN0IGlnbm9yZSB0aGUgZW5kIHRhZy4KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB2YXIgdHMgPSBwYXJzZVRpbWVTdGFtcCh0LnN1YnN0cigxLCB0Lmxlbmd0aCAtIDIpKTsKICAgICAgdmFyIG5vZGU7CiAgICAgIGlmICh0cykgewogICAgICAgIC8vIFRpbWVzdGFtcHMgYXJlIGxlYWQgbm9kZXMgYXMgd2VsbC4KICAgICAgICBub2RlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigidGltZXN0YW1wIiwgdHMpOwogICAgICAgIGN1cnJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdmFyIG0gPSB0Lm1hdGNoKC9ePChbXi5ccy8wLTk+XSspKFwuW15cc1xcPl0rKT8oW14+XFxdKyk/KFxcPyk+PyQvKTsKICAgICAgLy8gSWYgd2UgY2FuJ3QgcGFyc2UgdGhlIHRhZywgc2tpcCB0byB0aGUgbmV4dCB0YWcuCiAgICAgIGlmICghbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8vIFRyeSB0byBjb25zdHJ1Y3QgYW4gZWxlbWVudCwgYW5kIGlnbm9yZSB0aGUgdGFnIGlmIHdlIGNvdWxkbid0LgogICAgICBub2RlID0gY3JlYXRlRWxlbWVudChtWzFdLCBtWzNdKTsKICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSB0YWcgc2hvdWxkIGJlIGFkZGVkIGJhc2VkIG9uIHRoZSBjb250ZXh0IG9mIHdoZXJlIGl0CiAgICAgIC8vIGlzIHBsYWNlZCBpbiB0aGUgY3VldGV4dC4KICAgICAgaWYgKCFzaG91bGRBZGQoY3VycmVudCwgbm9kZSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBTZXQgdGhlIGNsYXNzIGxpc3QgKGFzIGEgbGlzdCBvZiBjbGFzc2VzLCBzZXBhcmF0ZWQgYnkgc3BhY2UpLgogICAgICBpZiAobVsyXSkgewogICAgICAgIG5vZGUuY2xhc3NOYW1lID0gbVsyXS5zdWJzdHIoMSkucmVwbGFjZSgnLicsICcgJyk7CiAgICAgIH0KICAgICAgLy8gQXBwZW5kIHRoZSBub2RlIHRvIHRoZSBjdXJyZW50IG5vZGUsIGFuZCBlbnRlciB0aGUgc2NvcGUgb2YgdGhlIG5ldwogICAgICAvLyBub2RlLgogICAgICB0YWdTdGFjay5wdXNoKG1bMV0pOwogICAgICBjdXJyZW50LmFwcGVuZENoaWxkKG5vZGUpOwogICAgICBjdXJyZW50ID0gbm9kZTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gVGV4dCBub2RlcyBhcmUgbGVhZiBub2Rlcy4KICAgIGN1cnJlbnQuYXBwZW5kQ2hpbGQod2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHVuZXNjYXBlKHQpKSk7CiAgfQoKICByZXR1cm4gcm9vdERpdjsKfQoKLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIHRoZSBVbmljb2RlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGEgc3Ryb25nCi8vIHJpZ2h0LXRvLWxlZnQgY2F0ZWdvcnkuIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHRoZXNlIGNoYXJhY3RlcnMgYXJlCi8vIHdyaXR0ZW4gcmlnaHQtdG8tbGVmdCBmb3Igc3VyZS4gSXQgd2FzIGdlbmVyYXRlZCBieSBwdWxsaW5nIGFsbCB0aGUgc3Ryb25nCi8vIHJpZ2h0LXRvLWxlZnQgY2hhcmFjdGVycyBvdXQgb2YgdGhlIFVuaWNvZGUgZGF0YSB0YWJsZS4gVGhhdCB0YWJsZSBjYW4KLy8gZm91bmQgYXQ6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVW5pY29kZURhdGEudHh0CnZhciBzdHJvbmdSVExSYW5nZXMgPSBbWzB4NWJlLCAweDViZV0sIFsweDVjMCwgMHg1YzBdLCBbMHg1YzMsIDB4NWMzXSwgWzB4NWM2LCAweDVjNl0sCiBbMHg1ZDAsIDB4NWVhXSwgWzB4NWYwLCAweDVmNF0sIFsweDYwOCwgMHg2MDhdLCBbMHg2MGIsIDB4NjBiXSwgWzB4NjBkLCAweDYwZF0sCiBbMHg2MWIsIDB4NjFiXSwgWzB4NjFlLCAweDY0YV0sIFsweDY2ZCwgMHg2NmZdLCBbMHg2NzEsIDB4NmQ1XSwgWzB4NmU1LCAweDZlNl0sCiBbMHg2ZWUsIDB4NmVmXSwgWzB4NmZhLCAweDcwZF0sIFsweDcwZiwgMHg3MTBdLCBbMHg3MTIsIDB4NzJmXSwgWzB4NzRkLCAweDdhNV0sCiBbMHg3YjEsIDB4N2IxXSwgWzB4N2MwLCAweDdlYV0sIFsweDdmNCwgMHg3ZjVdLCBbMHg3ZmEsIDB4N2ZhXSwgWzB4ODAwLCAweDgxNV0sCiBbMHg4MWEsIDB4ODFhXSwgWzB4ODI0LCAweDgyNF0sIFsweDgyOCwgMHg4MjhdLCBbMHg4MzAsIDB4ODNlXSwgWzB4ODQwLCAweDg1OF0sCiBbMHg4NWUsIDB4ODVlXSwgWzB4OGEwLCAweDhhMF0sIFsweDhhMiwgMHg4YWNdLCBbMHgyMDBmLCAweDIwMGZdLAogWzB4ZmIxZCwgMHhmYjFkXSwgWzB4ZmIxZiwgMHhmYjI4XSwgWzB4ZmIyYSwgMHhmYjM2XSwgWzB4ZmIzOCwgMHhmYjNjXSwKIFsweGZiM2UsIDB4ZmIzZV0sIFsweGZiNDAsIDB4ZmI0MV0sIFsweGZiNDMsIDB4ZmI0NF0sIFsweGZiNDYsIDB4ZmJjMV0sCiBbMHhmYmQzLCAweGZkM2RdLCBbMHhmZDUwLCAweGZkOGZdLCBbMHhmZDkyLCAweGZkYzddLCBbMHhmZGYwLCAweGZkZmNdLAogWzB4ZmU3MCwgMHhmZTc0XSwgWzB4ZmU3NiwgMHhmZWZjXSwgWzB4MTA4MDAsIDB4MTA4MDVdLCBbMHgxMDgwOCwgMHgxMDgwOF0sCiBbMHgxMDgwYSwgMHgxMDgzNV0sIFsweDEwODM3LCAweDEwODM4XSwgWzB4MTA4M2MsIDB4MTA4M2NdLCBbMHgxMDgzZiwgMHgxMDg1NV0sCiBbMHgxMDg1NywgMHgxMDg1Zl0sIFsweDEwOTAwLCAweDEwOTFiXSwgWzB4MTA5MjAsIDB4MTA5MzldLCBbMHgxMDkzZiwgMHgxMDkzZl0sCiBbMHgxMDk4MCwgMHgxMDliN10sIFsweDEwOWJlLCAweDEwOWJmXSwgWzB4MTBhMDAsIDB4MTBhMDBdLCBbMHgxMGExMCwgMHgxMGExM10sCiBbMHgxMGExNSwgMHgxMGExN10sIFsweDEwYTE5LCAweDEwYTMzXSwgWzB4MTBhNDAsIDB4MTBhNDddLCBbMHgxMGE1MCwgMHgxMGE1OF0sCiBbMHgxMGE2MCwgMHgxMGE3Zl0sIFsweDEwYjAwLCAweDEwYjM1XSwgWzB4MTBiNDAsIDB4MTBiNTVdLCBbMHgxMGI1OCwgMHgxMGI3Ml0sCiBbMHgxMGI3OCwgMHgxMGI3Zl0sIFsweDEwYzAwLCAweDEwYzQ4XSwgWzB4MWVlMDAsIDB4MWVlMDNdLCBbMHgxZWUwNSwgMHgxZWUxZl0sCiBbMHgxZWUyMSwgMHgxZWUyMl0sIFsweDFlZTI0LCAweDFlZTI0XSwgWzB4MWVlMjcsIDB4MWVlMjddLCBbMHgxZWUyOSwgMHgxZWUzMl0sCiBbMHgxZWUzNCwgMHgxZWUzN10sIFsweDFlZTM5LCAweDFlZTM5XSwgWzB4MWVlM2IsIDB4MWVlM2JdLCBbMHgxZWU0MiwgMHgxZWU0Ml0sCiBbMHgxZWU0NywgMHgxZWU0N10sIFsweDFlZTQ5LCAweDFlZTQ5XSwgWzB4MWVlNGIsIDB4MWVlNGJdLCBbMHgxZWU0ZCwgMHgxZWU0Zl0sCiBbMHgxZWU1MSwgMHgxZWU1Ml0sIFsweDFlZTU0LCAweDFlZTU0XSwgWzB4MWVlNTcsIDB4MWVlNTddLCBbMHgxZWU1OSwgMHgxZWU1OV0sCiBbMHgxZWU1YiwgMHgxZWU1Yl0sIFsweDFlZTVkLCAweDFlZTVkXSwgWzB4MWVlNWYsIDB4MWVlNWZdLCBbMHgxZWU2MSwgMHgxZWU2Ml0sCiBbMHgxZWU2NCwgMHgxZWU2NF0sIFsweDFlZTY3LCAweDFlZTZhXSwgWzB4MWVlNmMsIDB4MWVlNzJdLCBbMHgxZWU3NCwgMHgxZWU3N10sCiBbMHgxZWU3OSwgMHgxZWU3Y10sIFsweDFlZTdlLCAweDFlZTdlXSwgWzB4MWVlODAsIDB4MWVlODldLCBbMHgxZWU4YiwgMHgxZWU5Yl0sCiBbMHgxZWVhMSwgMHgxZWVhM10sIFsweDFlZWE1LCAweDFlZWE5XSwgWzB4MWVlYWIsIDB4MWVlYmJdLCBbMHgxMGZmZmQsIDB4MTBmZmZkXV07CgpmdW5jdGlvbiBpc1N0cm9uZ1JUTENoYXIoY2hhckNvZGUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cm9uZ1JUTFJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgdmFyIGN1cnJlbnRSYW5nZSA9IHN0cm9uZ1JUTFJhbmdlc1tpXTsKICAgIGlmIChjaGFyQ29kZSA+PSBjdXJyZW50UmFuZ2VbMF0gJiYgY2hhckNvZGUgPD0gY3VycmVudFJhbmdlWzFdKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBkZXRlcm1pbmVCaWRpKGN1ZURpdikgewogIHZhciBub2RlU3RhY2sgPSBbXSwKICAgICAgdGV4dCA9ICIiLAogICAgICBjaGFyQ29kZTsKCiAgaWYgKCFjdWVEaXYgfHwgIWN1ZURpdi5jaGlsZE5vZGVzKSB7CiAgICByZXR1cm4gImx0ciI7CiAgfQoKICBmdW5jdGlvbiBwdXNoTm9kZXMobm9kZVN0YWNrLCBub2RlKSB7CiAgICBmb3IgKHZhciBpID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIG5vZGVTdGFjay5wdXNoKG5vZGUuY2hpbGROb2Rlc1tpXSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBuZXh0VGV4dE5vZGUobm9kZVN0YWNrKSB7CiAgICBpZiAoIW5vZGVTdGFjayB8fCAhbm9kZVN0YWNrLmxlbmd0aCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICB2YXIgbm9kZSA9IG5vZGVTdGFjay5wb3AoKSwKICAgICAgICB0ZXh0ID0gbm9kZS50ZXh0Q29udGVudCB8fCBub2RlLmlubmVyVGV4dDsKICAgIGlmICh0ZXh0KSB7CiAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIG1hdGNoIGFsbCB1bmljb2RlIHR5cGUgQiBjaGFyYWN0ZXJzIChwYXJhZ3JhcGgKICAgICAgLy8gc2VwYXJhdG9yIGNoYXJhY3RlcnMpLiBTZWUgaXNzdWUgIzExNS4KICAgICAgdmFyIG0gPSB0ZXh0Lm1hdGNoKC9eLiooXG58XHIpLyk7CiAgICAgIGlmIChtKSB7CiAgICAgICAgbm9kZVN0YWNrLmxlbmd0aCA9IDA7CiAgICAgICAgcmV0dXJuIG1bMF07CiAgICAgIH0KICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICBpZiAobm9kZS50YWdOYW1lID09PSAicnVieSIpIHsKICAgICAgcmV0dXJuIG5leHRUZXh0Tm9kZShub2RlU3RhY2spOwogICAgfQogICAgaWYgKG5vZGUuY2hpbGROb2RlcykgewogICAgICBwdXNoTm9kZXMobm9kZVN0YWNrLCBub2RlKTsKICAgICAgcmV0dXJuIG5leHRUZXh0Tm9kZShub2RlU3RhY2spOwogICAgfQogIH0KCiAgcHVzaE5vZGVzKG5vZGVTdGFjaywgY3VlRGl2KTsKICB3aGlsZSAoKHRleHQgPSBuZXh0VGV4dE5vZGUobm9kZVN0YWNrKSkpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICBjaGFyQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKTsKICAgICAgaWYgKGlzU3Ryb25nUlRMQ2hhcihjaGFyQ29kZSkpIHsKICAgICAgICByZXR1cm4gInJ0bCI7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuICJsdHIiOwp9CgpmdW5jdGlvbiBjb21wdXRlTGluZVBvcyhjdWUpIHsKICBpZiAodHlwZW9mIGN1ZS5saW5lID09PSAibnVtYmVyIiAmJgogICAgICAoY3VlLnNuYXBUb0xpbmVzIHx8IChjdWUubGluZSA+PSAwICYmIGN1ZS5saW5lIDw9IDEwMCkpKSB7CiAgICByZXR1cm4gY3VlLmxpbmU7CiAgfQogIGlmICghY3VlLnRyYWNrIHx8ICFjdWUudHJhY2sudGV4dFRyYWNrTGlzdCB8fAogICAgICAhY3VlLnRyYWNrLnRleHRUcmFja0xpc3QubWVkaWFFbGVtZW50KSB7CiAgICByZXR1cm4gLTE7CiAgfQogIHZhciB0cmFjayA9IGN1ZS50cmFjaywKICAgICAgdHJhY2tMaXN0ID0gdHJhY2sudGV4dFRyYWNrTGlzdCwKICAgICAgY291bnQgPSAwOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tMaXN0Lmxlbmd0aCAmJiB0cmFja0xpc3RbaV0gIT09IHRyYWNrOyBpKyspIHsKICAgIGlmICh0cmFja0xpc3RbaV0ubW9kZSA9PT0gInNob3dpbmciKSB7CiAgICAgIGNvdW50Kys7CiAgICB9CiAgfQogIHJldHVybiArK2NvdW50ICogLTE7Cn0KCmZ1bmN0aW9uIFN0eWxlQm94KCkgewp9CgovLyBBcHBseSBzdHlsZXMgdG8gYSBkaXYuIElmIHRoZXJlIGlzIG5vIGRpdiBwYXNzZWQgdGhlbiBpdCBkZWZhdWx0cyB0byB0aGUKLy8gZGl2IG9uICd0aGlzJy4KU3R5bGVCb3gucHJvdG90eXBlLmFwcGx5U3R5bGVzID0gZnVuY3Rpb24oc3R5bGVzLCBkaXYpIHsKICBkaXYgPSBkaXYgfHwgdGhpcy5kaXY7CiAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHsKICAgIGlmIChzdHlsZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgZGl2LnN0eWxlW3Byb3BdID0gc3R5bGVzW3Byb3BdOwogICAgfQogIH0KfTsKClN0eWxlQm94LnByb3RvdHlwZS5mb3JtYXRTdHlsZSA9IGZ1bmN0aW9uKHZhbCwgdW5pdCkgewogIHJldHVybiB2YWwgPT09IDAgPyAwIDogdmFsICsgdW5pdDsKfTsKCi8vIENvbnN0cnVjdHMgdGhlIGNvbXB1dGVkIGRpc3BsYXkgc3RhdGUgb2YgdGhlIGN1ZSAoYSBkaXYpLiBQbGFjZXMgdGhlIGRpdgovLyBpbnRvIHRoZSBvdmVybGF5IHdoaWNoIHNob3VsZCBiZSBhIGJsb2NrIGxldmVsIGVsZW1lbnQgKHVzdWFsbHkgYSBkaXYpLgpmdW5jdGlvbiBDdWVTdHlsZUJveCh3aW5kb3csIGN1ZSwgc3R5bGVPcHRpb25zKSB7CiAgdmFyIGlzSUU4ID0gKC9NU0lFXHM4XC4wLykudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgY29sb3IgPSAicmdiYSgyNTUsIDI1NSwgMjU1LCAxKSI7CiAgdmFyIGJhY2tncm91bmRDb2xvciA9ICJyZ2JhKDAsIDAsIDAsIDAuOCkiOwoKICBpZiAoaXNJRTgpIHsKICAgIGNvbG9yID0gInJnYigyNTUsIDI1NSwgMjU1KSI7CiAgICBiYWNrZ3JvdW5kQ29sb3IgPSAicmdiKDAsIDAsIDApIjsKICB9CgogIFN0eWxlQm94LmNhbGwodGhpcyk7CiAgdGhpcy5jdWUgPSBjdWU7CgogIC8vIFBhcnNlIG91ciBjdWUncyB0ZXh0IGludG8gYSBET00gdHJlZSByb290ZWQgYXQgJ2N1ZURpdicuIFRoaXMgZGl2IHdpbGwKICAvLyBoYXZlIGlubGluZSBwb3NpdGlvbmluZyBhbmQgd2lsbCBmdW5jdGlvbiBhcyB0aGUgY3VlIGJhY2tncm91bmQgYm94LgogIHRoaXMuY3VlRGl2ID0gcGFyc2VDb250ZW50KHdpbmRvdywgY3VlLnRleHQpOwogIHZhciBzdHlsZXMgPSB7CiAgICBjb2xvcjogY29sb3IsCiAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvciwKICAgIHBvc2l0aW9uOiAicmVsYXRpdmUiLAogICAgbGVmdDogMCwKICAgIHJpZ2h0OiAwLAogICAgdG9wOiAwLAogICAgYm90dG9tOiAwLAogICAgZGlzcGxheTogImlubGluZSIKICB9OwoKICBpZiAoIWlzSUU4KSB7CiAgICBzdHlsZXMud3JpdGluZ01vZGUgPSBjdWUudmVydGljYWwgPT09ICIiID8gImhvcml6b250YWwtdGIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VlLnZlcnRpY2FsID09PSAibHIiID8gInZlcnRpY2FsLWxyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJ2ZXJ0aWNhbC1ybCI7CiAgICBzdHlsZXMudW5pY29kZUJpZGkgPSAicGxhaW50ZXh0IjsKICB9CiAgdGhpcy5hcHBseVN0eWxlcyhzdHlsZXMsIHRoaXMuY3VlRGl2KTsKCiAgLy8gQ3JlYXRlIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBkaXYgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcG9zaXRpb24gdGhlIGN1ZQogIC8vIGRpdi4gTm90ZSwgYWxsIFdlYlZUVCBjdWUtc2V0dGluZyBhbGlnbm1lbnRzIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBDU1MKICAvLyBtaXJyb3JzIG9mIHRoZW0gZXhjZXB0ICJtaWRkbGUiIHdoaWNoIGlzICJjZW50ZXIiIGluIENTUy4KICB0aGlzLmRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBzdHlsZXMgPSB7CiAgICB0ZXh0QWxpZ246IGN1ZS5hbGlnbiA9PT0gIm1pZGRsZSIgPyAiY2VudGVyIiA6IGN1ZS5hbGlnbiwKICAgIGZvbnQ6IHN0eWxlT3B0aW9ucy5mb250LAogICAgd2hpdGVTcGFjZTogInByZS1saW5lIiwKICAgIHBvc2l0aW9uOiAiYWJzb2x1dGUiCiAgfTsKCiAgaWYgKCFpc0lFOCkgewogICAgc3R5bGVzLmRpcmVjdGlvbiA9IGRldGVybWluZUJpZGkodGhpcy5jdWVEaXYpOwogICAgc3R5bGVzLndyaXRpbmdNb2RlID0gY3VlLnZlcnRpY2FsID09PSAiIiA/ICJob3Jpem9udGFsLXRiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1ZS52ZXJ0aWNhbCA9PT0gImxyIiA/ICJ2ZXJ0aWNhbC1sciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAidmVydGljYWwtcmwiLgogICAgc3R5bGVzdW5pY29kZUJpZGkgPSAgInBsYWludGV4dCI7CiAgfQoKICB0aGlzLmFwcGx5U3R5bGVzKHN0eWxlcyk7CgogIHRoaXMuZGl2LmFwcGVuZENoaWxkKHRoaXMuY3VlRGl2KTsKCiAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZWZlcmVuY2UgZWRnZSBvZiB0aGUgdmlld3BvcnQgdG8gdGhlIHRleHQKICAvLyBwb3NpdGlvbiBvZiB0aGUgY3VlIGJveC4gVGhlIHJlZmVyZW5jZSBlZGdlIHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXIgd2hlbgogIC8vIHRoZSBib3ggb3JpZW50YXRpb24gc3R5bGVzIGFyZSBhcHBsaWVkLgogIHZhciB0ZXh0UG9zID0gMDsKICBzd2l0Y2ggKGN1ZS5wb3NpdGlvbkFsaWduKSB7CiAgY2FzZSAic3RhcnQiOgogICAgdGV4dFBvcyA9IGN1ZS5wb3NpdGlvbjsKICAgIGJyZWFrOwogIGNhc2UgIm1pZGRsZSI6CiAgICB0ZXh0UG9zID0gY3VlLnBvc2l0aW9uIC0gKGN1ZS5zaXplIC8gMik7CiAgICBicmVhazsKICBjYXNlICJlbmQiOgogICAgdGV4dFBvcyA9IGN1ZS5wb3NpdGlvbiAtIGN1ZS5zaXplOwogICAgYnJlYWs7CiAgfQoKICAvLyBIb3Jpem9udGFsIGJveCBvcmllbnRhdGlvbjsgdGV4dFBvcyBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZQogIC8vIGFyZWEgdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGUgYm94IGFuZCBjdWUuc2l6ZSBpcyB0aGUgZGlzdGFuY2UgZXh0ZW5kaW5nIHRvCiAgLy8gdGhlIHJpZ2h0IGZyb20gdGhlcmUuCiAgaWYgKGN1ZS52ZXJ0aWNhbCA9PT0gIiIpIHsKICAgIHRoaXMuYXBwbHlTdHlsZXMoewogICAgICBsZWZ0OiAgdGhpcy5mb3JtYXRTdHlsZSh0ZXh0UG9zLCAiJSIpLAogICAgICB3aWR0aDogdGhpcy5mb3JtYXRTdHlsZShjdWUuc2l6ZSwgIiUiKQogICAgfSk7CiAgLy8gVmVydGljYWwgYm94IG9yaWVudGF0aW9uOyB0ZXh0UG9zIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3AgZWRnZSBvZiB0aGUKICAvLyBhcmVhIHRvIHRoZSB0b3AgZWRnZSBvZiB0aGUgYm94IGFuZCBjdWUuc2l6ZSBpcyB0aGUgaGVpZ2h0IGV4dGVuZGluZwogIC8vIGRvd253YXJkcyBmcm9tIHRoZXJlLgogIH0gZWxzZSB7CiAgICB0aGlzLmFwcGx5U3R5bGVzKHsKICAgICAgdG9wOiB0aGlzLmZvcm1hdFN0eWxlKHRleHRQb3MsICIlIiksCiAgICAgIGhlaWdodDogdGhpcy5mb3JtYXRTdHlsZShjdWUuc2l6ZSwgIiUiKQogICAgfSk7CiAgfQoKICB0aGlzLm1vdmUgPSBmdW5jdGlvbihib3gpIHsKICAgIHRoaXMuYXBwbHlTdHlsZXMoewogICAgICB0b3A6IHRoaXMuZm9ybWF0U3R5bGUoYm94LnRvcCwgInB4IiksCiAgICAgIGJvdHRvbTogdGhpcy5mb3JtYXRTdHlsZShib3guYm90dG9tLCAicHgiKSwKICAgICAgbGVmdDogdGhpcy5mb3JtYXRTdHlsZShib3gubGVmdCwgInB4IiksCiAgICAgIHJpZ2h0OiB0aGlzLmZvcm1hdFN0eWxlKGJveC5yaWdodCwgInB4IiksCiAgICAgIGhlaWdodDogdGhpcy5mb3JtYXRTdHlsZShib3guaGVpZ2h0LCAicHgiKSwKICAgICAgd2lkdGg6IHRoaXMuZm9ybWF0U3R5bGUoYm94LndpZHRoLCAicHgiKQogICAgfSk7CiAgfTsKfQpDdWVTdHlsZUJveC5wcm90b3R5cGUgPSBfb2JqQ3JlYXRlKFN0eWxlQm94LnByb3RvdHlwZSk7CkN1ZVN0eWxlQm94LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1ZVN0eWxlQm94OwoKLy8gUmVwcmVzZW50cyB0aGUgY28tb3JkaW5hdGVzIG9mIGFuIEVsZW1lbnQgaW4gYSB3YXkgdGhhdCB3ZSBjYW4gZWFzaWx5Ci8vIGNvbXB1dGUgdGhpbmdzIHdpdGggc3VjaCBhcyBpZiBpdCBvdmVybGFwcyBvciBpbnRlcnNlY3RzIHdpdGggYW5vdGhlciBFbGVtZW50LgovLyBDYW4gaW5pdGlhbGl6ZSBpdCB3aXRoIGVpdGhlciBhIFN0eWxlQm94IG9yIGFub3RoZXIgQm94UG9zaXRpb24uCmZ1bmN0aW9uIEJveFBvc2l0aW9uKG9iaikgewogIHZhciBpc0lFOCA9ICgvTVNJRVxzOFwuMC8pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgogIC8vIEVpdGhlciBhIEJveFBvc2l0aW9uIHdhcyBwYXNzZWQgaW4gYW5kIHdlIG5lZWQgdG8gY29weSBpdCwgb3IgYSBTdHlsZUJveAogIC8vIHdhcyBwYXNzZWQgaW4gYW5kIHdlIG5lZWQgdG8gY29weSB0aGUgcmVzdWx0cyBvZiAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JwogIC8vIGFzIHRoZSBvYmplY3QgcmV0dXJuZWQgaXMgcmVhZG9ubHkuIEFsbCBjby1vcmRpbmF0ZSB2YWx1ZXMgYXJlIGluIHJlZmVyZW5jZQogIC8vIHRvIHRoZSB2aWV3cG9ydCBvcmlnaW4gKHRvcCBsZWZ0KS4KICB2YXIgbGgsIGhlaWdodCwgd2lkdGgsIHRvcDsKICBpZiAob2JqLmRpdikgewogICAgaGVpZ2h0ID0gb2JqLmRpdi5vZmZzZXRIZWlnaHQ7CiAgICB3aWR0aCA9IG9iai5kaXYub2Zmc2V0V2lkdGg7CiAgICB0b3AgPSBvYmouZGl2Lm9mZnNldFRvcDsKCiAgICB2YXIgcmVjdHMgPSAocmVjdHMgPSBvYmouZGl2LmNoaWxkTm9kZXMpICYmIChyZWN0cyA9IHJlY3RzWzBdKSAmJgogICAgICAgICAgICAgICAgcmVjdHMuZ2V0Q2xpZW50UmVjdHMgJiYgcmVjdHMuZ2V0Q2xpZW50UmVjdHMoKTsKICAgIG9iaiA9IG9iai5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAvLyBJbiBjZXJ0YWluIGNhc2VzIHRoZSBvdXR0ZXIgZGl2IHdpbGwgYmUgc2xpZ2h0bHkgbGFyZ2VyIHRoZW4gdGhlIHN1bSBvZgogICAgLy8gdGhlIGlubmVyIGRpdidzIGxpbmVzLiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBib2xkIHRleHQsIGV0Yywgb24gc29tZSBwbGF0Zm9ybXMuCiAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGdldCB0aGUgYXZlcmFnZSBsaW5lIGhlaWdodCBhbmQgdXNlIHRoYXQuIFRoaXMgd2lsbAogICAgLy8gcmVzdWx0IGluIHRoZSBkZXNpcmVkIGJlaGF2aW91ci4KICAgIGxoID0gcmVjdHMgPyBNYXRoLm1heCgocmVjdHNbMF0gJiYgcmVjdHNbMF0uaGVpZ2h0KSB8fCAwLCBvYmouaGVpZ2h0IC8gcmVjdHMubGVuZ3RoKQogICAgICAgICAgICAgICA6IDA7CgogIH0KICB0aGlzLmxlZnQgPSBvYmoubGVmdDsKICB0aGlzLnJpZ2h0ID0gb2JqLnJpZ2h0OwogIHRoaXMudG9wID0gb2JqLnRvcCB8fCB0b3A7CiAgdGhpcy5oZWlnaHQgPSBvYmouaGVpZ2h0IHx8IGhlaWdodDsKICB0aGlzLmJvdHRvbSA9IG9iai5ib3R0b20gfHwgKHRvcCArIChvYmouaGVpZ2h0IHx8IGhlaWdodCkpOwogIHRoaXMud2lkdGggPSBvYmoud2lkdGggfHwgd2lkdGg7CiAgdGhpcy5saW5lSGVpZ2h0ID0gbGggIT09IHVuZGVmaW5lZCA/IGxoIDogb2JqLmxpbmVIZWlnaHQ7CgogIGlmIChpc0lFOCAmJiAhdGhpcy5saW5lSGVpZ2h0KSB7CiAgICB0aGlzLmxpbmVIZWlnaHQgPSAxMzsKICB9Cn0KCi8vIE1vdmUgdGhlIGJveCBhbG9uZyBhIHBhcnRpY3VsYXIgYXhpcy4gT3B0aW9uYWxseSBwYXNzIGluIGFuIGFtb3VudCB0byBtb3ZlCi8vIHRoZSBib3guIElmIG5vIGFtb3VudCBpcyBwYXNzZWQgdGhlbiB0aGUgZGVmYXVsdCBpcyB0aGUgbGluZSBoZWlnaHQgb2YgdGhlCi8vIGJveC4KQm94UG9zaXRpb24ucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbihheGlzLCB0b01vdmUpIHsKICB0b01vdmUgPSB0b01vdmUgIT09IHVuZGVmaW5lZCA/IHRvTW92ZSA6IHRoaXMubGluZUhlaWdodDsKICBzd2l0Y2ggKGF4aXMpIHsKICBjYXNlICIreCI6CiAgICB0aGlzLmxlZnQgKz0gdG9Nb3ZlOwogICAgdGhpcy5yaWdodCArPSB0b01vdmU7CiAgICBicmVhazsKICBjYXNlICIteCI6CiAgICB0aGlzLmxlZnQgLT0gdG9Nb3ZlOwogICAgdGhpcy5yaWdodCAtPSB0b01vdmU7CiAgICBicmVhazsKICBjYXNlICIreSI6CiAgICB0aGlzLnRvcCArPSB0b01vdmU7CiAgICB0aGlzLmJvdHRvbSArPSB0b01vdmU7CiAgICBicmVhazsKICBjYXNlICIteSI6CiAgICB0aGlzLnRvcCAtPSB0b01vdmU7CiAgICB0aGlzLmJvdHRvbSAtPSB0b01vdmU7CiAgICBicmVhazsKICB9Cn07CgovLyBDaGVjayBpZiB0aGlzIGJveCBvdmVybGFwcyBhbm90aGVyIGJveCwgYjIuCkJveFBvc2l0aW9uLnByb3RvdHlwZS5vdmVybGFwcyA9IGZ1bmN0aW9uKGIyKSB7CiAgcmV0dXJuIHRoaXMubGVmdCA8IGIyLnJpZ2h0ICYmCiAgICAgICAgIHRoaXMucmlnaHQgPiBiMi5sZWZ0ICYmCiAgICAgICAgIHRoaXMudG9wIDwgYjIuYm90dG9tICYmCiAgICAgICAgIHRoaXMuYm90dG9tID4gYjIudG9wOwp9OwoKLy8gQ2hlY2sgaWYgdGhpcyBib3ggb3ZlcmxhcHMgYW55IG90aGVyIGJveGVzIGluIGJveGVzLgpCb3hQb3NpdGlvbi5wcm90b3R5cGUub3ZlcmxhcHNBbnkgPSBmdW5jdGlvbihib3hlcykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgYm94ZXMubGVuZ3RoOyBpKyspIHsKICAgIGlmICh0aGlzLm92ZXJsYXBzKGJveGVzW2ldKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9OwoKLy8gQ2hlY2sgaWYgdGhpcyBib3ggaXMgd2l0aGluIGFub3RoZXIgYm94LgpCb3hQb3NpdGlvbi5wcm90b3R5cGUud2l0aGluID0gZnVuY3Rpb24oY29udGFpbmVyKSB7CiAgcmV0dXJuIHRoaXMudG9wID49IGNvbnRhaW5lci50b3AgJiYKICAgICAgICAgdGhpcy5ib3R0b20gPD0gY29udGFpbmVyLmJvdHRvbSAmJgogICAgICAgICB0aGlzLmxlZnQgPj0gY29udGFpbmVyLmxlZnQgJiYKICAgICAgICAgdGhpcy5yaWdodCA8PSBjb250YWluZXIucmlnaHQ7Cn07CgovLyBDaGVjayBpZiB0aGlzIGJveCBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGNvbnRhaW5lciBvciBpdCBpcyBvdmVybGFwcGluZwovLyBvbiB0aGUgZWRnZSBvcHBvc2l0ZSBvZiB0aGUgYXhpcyBkaXJlY3Rpb24gcGFzc2VkLiBGb3IgZXhhbXBsZSwgaWYgIit4IiBpcwovLyBwYXNzZWQgYW5kIHRoZSBib3ggaXMgb3ZlcmxhcHBpbmcgb24gdGhlIGxlZnQgZWRnZSBvZiB0aGUgY29udGFpbmVyLCB0aGVuCi8vIHJldHVybiB0cnVlLgpCb3hQb3NpdGlvbi5wcm90b3R5cGUub3ZlcmxhcHNPcHBvc2l0ZUF4aXMgPSBmdW5jdGlvbihjb250YWluZXIsIGF4aXMpIHsKICBzd2l0Y2ggKGF4aXMpIHsKICBjYXNlICIreCI6CiAgICByZXR1cm4gdGhpcy5sZWZ0IDwgY29udGFpbmVyLmxlZnQ7CiAgY2FzZSAiLXgiOgogICAgcmV0dXJuIHRoaXMucmlnaHQgPiBjb250YWluZXIucmlnaHQ7CiAgY2FzZSAiK3kiOgogICAgcmV0dXJuIHRoaXMudG9wIDwgY29udGFpbmVyLnRvcDsKICBjYXNlICIteSI6CiAgICByZXR1cm4gdGhpcy5ib3R0b20gPiBjb250YWluZXIuYm90dG9tOwogIH0KfTsKCi8vIEZpbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGFyZWEgdGhhdCB0aGlzIGJveCBpcyBvdmVybGFwcGluZyB3aXRoIGFub3RoZXIKLy8gYm94LgpCb3hQb3NpdGlvbi5wcm90b3R5cGUuaW50ZXJzZWN0UGVyY2VudGFnZSA9IGZ1bmN0aW9uKGIyKSB7CiAgdmFyIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnJpZ2h0LCBiMi5yaWdodCkgLSBNYXRoLm1heCh0aGlzLmxlZnQsIGIyLmxlZnQpKSwKICAgICAgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuYm90dG9tLCBiMi5ib3R0b20pIC0gTWF0aC5tYXgodGhpcy50b3AsIGIyLnRvcCkpLAogICAgICBpbnRlcnNlY3RBcmVhID0geCAqIHk7CiAgcmV0dXJuIGludGVyc2VjdEFyZWEgLyAodGhpcy5oZWlnaHQgKiB0aGlzLndpZHRoKTsKfTsKCi8vIENvbnZlcnQgdGhlIHBvc2l0aW9ucyBmcm9tIHRoaXMgYm94IHRvIENTUyBjb21wYXRpYmxlIHBvc2l0aW9ucyB1c2luZwovLyB0aGUgcmVmZXJlbmNlIGNvbnRhaW5lcidzIHBvc2l0aW9ucy4gVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWNhdXNlIHRoaXMKLy8gYm94J3MgcG9zaXRpb25zIGFyZSBpbiByZWZlcmVuY2UgdG8gdGhlIHZpZXdwb3J0IG9yaWdpbiwgd2hlcmVhcywgQ1NTCi8vIHZhbHVlcyBhcmUgaW4gcmVmZXJlY25lIHRvIHRoZWlyIHJlc3BlY3RpdmUgZWRnZXMuCkJveFBvc2l0aW9uLnByb3RvdHlwZS50b0NTU0NvbXBhdFZhbHVlcyA9IGZ1bmN0aW9uKHJlZmVyZW5jZSkgewogIHJldHVybiB7CiAgICB0b3A6IHRoaXMudG9wIC0gcmVmZXJlbmNlLnRvcCwKICAgIGJvdHRvbTogcmVmZXJlbmNlLmJvdHRvbSAtIHRoaXMuYm90dG9tLAogICAgbGVmdDogdGhpcy5sZWZ0IC0gcmVmZXJlbmNlLmxlZnQsCiAgICByaWdodDogcmVmZXJlbmNlLnJpZ2h0IC0gdGhpcy5yaWdodCwKICAgIGhlaWdodDogdGhpcy5oZWlnaHQsCiAgICB3aWR0aDogdGhpcy53aWR0aAogIH07Cn07CgovLyBHZXQgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYm94J3MgcG9zaXRpb24gd2l0aG91dCBhbnl0aGluZyBleHRyYS4KLy8gQ2FuIHBhc3MgYSBTdHlsZUJveCwgSFRNTEVsZW1lbnQsIG9yIGFub3RoZXIgQm94UG9zaXRvbi4KQm94UG9zaXRpb24uZ2V0U2ltcGxlQm94UG9zaXRpb24gPSBmdW5jdGlvbihvYmopIHsKICB2YXIgaGVpZ2h0ID0gb2JqLmRpdiA/IG9iai5kaXYub2Zmc2V0SGVpZ2h0IDogb2JqLnRhZ05hbWUgPyBvYmoub2Zmc2V0SGVpZ2h0IDogMDsKICB2YXIgd2lkdGggPSBvYmouZGl2ID8gb2JqLmRpdi5vZmZzZXRXaWR0aCA6IG9iai50YWdOYW1lID8gb2JqLm9mZnNldFdpZHRoIDogMDsKICB2YXIgdG9wID0gb2JqLmRpdiA/IG9iai5kaXYub2Zmc2V0VG9wIDogb2JqLnRhZ05hbWUgPyBvYmoub2Zmc2V0VG9wIDogMDsKCiAgb2JqID0gb2JqLmRpdiA/IG9iai5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOgogICAgICAgICAgICAgICAgb2JqLnRhZ05hbWUgPyBvYmouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBvYmo7CiAgdmFyIHJldCA9IHsKICAgIGxlZnQ6IG9iai5sZWZ0LAogICAgcmlnaHQ6IG9iai5yaWdodCwKICAgIHRvcDogb2JqLnRvcCB8fCB0b3AsCiAgICBoZWlnaHQ6IG9iai5oZWlnaHQgfHwgaGVpZ2h0LAogICAgYm90dG9tOiBvYmouYm90dG9tIHx8ICh0b3AgKyAob2JqLmhlaWdodCB8fCBoZWlnaHQpKSwKICAgIHdpZHRoOiBvYmoud2lkdGggfHwgd2lkdGgKICB9OwogIHJldHVybiByZXQ7Cn07CgovLyBNb3ZlIGEgU3R5bGVCb3ggdG8gaXRzIHNwZWNpZmllZCwgb3IgbmV4dCBiZXN0LCBwb3NpdGlvbi4gVGhlIGNvbnRhaW5lckJveAovLyBpcyB0aGUgYm94IHRoYXQgY29udGFpbnMgdGhlIFN0eWxlQm94LCBzdWNoIGFzIGEgZGl2LiBib3hQb3NpdGlvbnMgYXJlCi8vIGEgbGlzdCBvZiBvdGhlciBib3hlcyB0aGF0IHRoZSBzdHlsZUJveCBjYW4ndCBvdmVybGFwIHdpdGguCmZ1bmN0aW9uIG1vdmVCb3hUb0xpbmVQb3NpdGlvbih3aW5kb3csIHN0eWxlQm94LCBjb250YWluZXJCb3gsIGJveFBvc2l0aW9ucykgewoKICAvLyBGaW5kIHRoZSBiZXN0IHBvc2l0aW9uIGZvciBhIGN1ZSBib3gsIGIsIG9uIHRoZSB2aWRlby4gVGhlIGF4aXMgcGFyYW1ldGVyCiAgLy8gaXMgYSBsaXN0IG9mIGF4aXMsIHRoZSBvcmRlciBvZiB3aGljaCwgaXQgd2lsbCBtb3ZlIHRoZSBib3ggYWxvbmcuIEZvciBleGFtcGxlOgogIC8vIFBhc3NpbmcgWyIreCIsICIteCJdIHdpbGwgbW92ZSB0aGUgYm94IGZpcnN0IGFsb25nIHRoZSB4IGF4aXMgaW4gdGhlIHBvc2l0aXZlCiAgLy8gZGlyZWN0aW9uLiBJZiBpdCBkb2Vzbid0IGZpbmQgYSBnb29kIHBvc2l0aW9uIGZvciBpdCB0aGVyZSBpdCB3aWxsIHRoZW4gbW92ZQogIC8vIGl0IGFsb25nIHRoZSB4IGF4aXMgaW4gdGhlIG5lZ2F0aXZlIGRpcmVjdGlvbi4KICBmdW5jdGlvbiBmaW5kQmVzdFBvc2l0aW9uKGIsIGF4aXMpIHsKICAgIHZhciBiZXN0UG9zaXRpb24sCiAgICAgICAgc3BlY2lmaWVkUG9zaXRpb24gPSBuZXcgQm94UG9zaXRpb24oYiksCiAgICAgICAgcGVyY2VudGFnZSA9IDE7IC8vIEhpZ2hlc3QgcG9zc2libGUgc28gdGhlIGZpcnN0IHRoaW5nIHdlIGdldCBpcyBiZXR0ZXIuCgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHdoaWxlIChiLm92ZXJsYXBzT3Bwb3NpdGVBeGlzKGNvbnRhaW5lckJveCwgYXhpc1tpXSkgfHwKICAgICAgICAgICAgIChiLndpdGhpbihjb250YWluZXJCb3gpICYmIGIub3ZlcmxhcHNBbnkoYm94UG9zaXRpb25zKSkpIHsKICAgICAgICBiLm1vdmUoYXhpc1tpXSk7CiAgICAgIH0KICAgICAgLy8gV2UgZm91bmQgYSBzcG90IHdoZXJlIHdlIGFyZW4ndCBvdmVybGFwcGluZyBhbnl0aGluZy4gVGhpcyBpcyBvdXIKICAgICAgLy8gYmVzdCBwb3NpdGlvbi4KICAgICAgaWYgKGIud2l0aGluKGNvbnRhaW5lckJveCkpIHsKICAgICAgICByZXR1cm4gYjsKICAgICAgfQogICAgICB2YXIgcCA9IGIuaW50ZXJzZWN0UGVyY2VudGFnZShjb250YWluZXJCb3gpOwogICAgICAvLyBJZiB3ZSdyZSBvdXRzaWRlIHRoZSBjb250YWluZXIgYm94IGxlc3MgdGhlbiB3ZSB3ZXJlIG9uIG91ciBsYXN0IHRyeQogICAgICAvLyB0aGVuIHJlbWVtYmVyIHRoaXMgcG9zaXRpb24gYXMgdGhlIGJlc3QgcG9zaXRpb24uCiAgICAgIGlmIChwZXJjZW50YWdlID4gcCkgewogICAgICAgIGJlc3RQb3NpdGlvbiA9IG5ldyBCb3hQb3NpdGlvbihiKTsKICAgICAgICBwZXJjZW50YWdlID0gcDsKICAgICAgfQogICAgICAvLyBSZXNldCB0aGUgYm94IHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgICAgIGIgPSBuZXcgQm94UG9zaXRpb24oc3BlY2lmaWVkUG9zaXRpb24pOwogICAgfQogICAgcmV0dXJuIGJlc3RQb3NpdGlvbiB8fCBzcGVjaWZpZWRQb3NpdGlvbjsKICB9CgogIHZhciBib3hQb3NpdGlvbiA9IG5ldyBCb3hQb3NpdGlvbihzdHlsZUJveCksCiAgICAgIGN1ZSA9IHN0eWxlQm94LmN1ZSwKICAgICAgbGluZVBvcyA9IGNvbXB1dGVMaW5lUG9zKGN1ZSksCiAgICAgIGF4aXMgPSBbXTsKCiAgLy8gSWYgd2UgaGF2ZSBhIGxpbmUgbnVtYmVyIHRvIGFsaWduIHRoZSBjdWUgdG8uCiAgaWYgKGN1ZS5zbmFwVG9MaW5lcykgewogICAgdmFyIHNpemU7CiAgICBzd2l0Y2ggKGN1ZS52ZXJ0aWNhbCkgewogICAgY2FzZSAiIjoKICAgICAgYXhpcyA9IFsgIit5IiwgIi15IiBdOwogICAgICBzaXplID0gImhlaWdodCI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAicmwiOgogICAgICBheGlzID0gWyAiK3giLCAiLXgiIF07CiAgICAgIHNpemUgPSAid2lkdGgiOwogICAgICBicmVhazsKICAgIGNhc2UgImxyIjoKICAgICAgYXhpcyA9IFsgIi14IiwgIit4IiBdOwogICAgICBzaXplID0gIndpZHRoIjsKICAgICAgYnJlYWs7CiAgICB9CgogICAgdmFyIHN0ZXAgPSBib3hQb3NpdGlvbi5saW5lSGVpZ2h0LAogICAgICAgIHBvc2l0aW9uID0gc3RlcCAqIE1hdGgucm91bmQobGluZVBvcyksCiAgICAgICAgbWF4UG9zaXRpb24gPSBjb250YWluZXJCb3hbc2l6ZV0gKyBzdGVwLAogICAgICAgIGluaXRpYWxBeGlzID0gYXhpc1swXTsKCiAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIGludGlhbCBwb3NpdGlvbiBpcyBncmVhdGVyIHRoZW4gdGhlIG1heCBwb3NpdGlvbiB0aGVuCiAgICAvLyBjbGFtcCB0aGUgYm94IHRvIHRoZSBhbW91bnQgb2Ygc3RlcHMgaXQgd291bGQgdGFrZSBmb3IgdGhlIGJveCB0bwogICAgLy8gcmVhY2ggdGhlIG1heCBwb3NpdGlvbi4KICAgIGlmIChNYXRoLmFicyhwb3NpdGlvbikgPiBtYXhQb3NpdGlvbikgewogICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uIDwgMCA/IC0xIDogMTsKICAgICAgcG9zaXRpb24gKj0gTWF0aC5jZWlsKG1heFBvc2l0aW9uIC8gc3RlcCkgKiBzdGVwOwogICAgfQoKICAgIC8vIElmIGNvbXB1dGVkIGxpbmUgcG9zaXRpb24gcmV0dXJucyBuZWdhdGl2ZSB0aGVuIGxpbmUgbnVtYmVycyBhcmUKICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gb2YgdGhlIHZpZGVvIGluc3RlYWQgb2YgdGhlIHRvcC4gVGhlcmVmb3JlLCB3ZQogICAgLy8gbmVlZCB0byBpbmNyZWFzZSBvdXIgaW5pdGlhbCBwb3NpdGlvbiBieSB0aGUgbGVuZ3RoIG9yIHdpZHRoIG9mIHRoZQogICAgLy8gdmlkZW8sIGRlcGVuZGluZyBvbiB0aGUgd3JpdGluZyBkaXJlY3Rpb24sIGFuZCByZXZlcnNlIG91ciBheGlzIGRpcmVjdGlvbnMuCiAgICBpZiAobGluZVBvcyA8IDApIHsKICAgICAgcG9zaXRpb24gKz0gY3VlLnZlcnRpY2FsID09PSAiIiA/IGNvbnRhaW5lckJveC5oZWlnaHQgOiBjb250YWluZXJCb3gud2lkdGg7CiAgICAgIGF4aXMgPSBheGlzLnJldmVyc2UoKTsKICAgIH0KCiAgICAvLyBNb3ZlIHRoZSBib3ggdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gVGhpcyBtYXkgbm90IGJlIGl0cyBiZXN0CiAgICAvLyBwb3NpdGlvbi4KICAgIGJveFBvc2l0aW9uLm1vdmUoaW5pdGlhbEF4aXMsIHBvc2l0aW9uKTsKCiAgfSBlbHNlIHsKICAgIC8vIElmIHdlIGhhdmUgYSBwZXJjZW50YWdlIGxpbmUgdmFsdWUgZm9yIHRoZSBjdWUuCiAgICB2YXIgY2FsY3VsYXRlZFBlcmNlbnRhZ2UgPSAoYm94UG9zaXRpb24ubGluZUhlaWdodCAvIGNvbnRhaW5lckJveC5oZWlnaHQpICogMTAwOwoKICAgIHN3aXRjaCAoY3VlLmxpbmVBbGlnbikgewogICAgY2FzZSAibWlkZGxlIjoKICAgICAgbGluZVBvcyAtPSAoY2FsY3VsYXRlZFBlcmNlbnRhZ2UgLyAyKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJlbmQiOgogICAgICBsaW5lUG9zIC09IGNhbGN1bGF0ZWRQZXJjZW50YWdlOwogICAgICBicmVhazsKICAgIH0KCiAgICAvLyBBcHBseSBpbml0aWFsIGxpbmUgcG9zaXRpb24gdG8gdGhlIGN1ZSBib3guCiAgICBzd2l0Y2ggKGN1ZS52ZXJ0aWNhbCkgewogICAgY2FzZSAiIjoKICAgICAgc3R5bGVCb3guYXBwbHlTdHlsZXMoewogICAgICAgIHRvcDogc3R5bGVCb3guZm9ybWF0U3R5bGUobGluZVBvcywgIiUiKQogICAgICB9KTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJybCI6CiAgICAgIHN0eWxlQm94LmFwcGx5U3R5bGVzKHsKICAgICAgICBsZWZ0OiBzdHlsZUJveC5mb3JtYXRTdHlsZShsaW5lUG9zLCAiJSIpCiAgICAgIH0pOwogICAgICBicmVhazsKICAgIGNhc2UgImxyIjoKICAgICAgc3R5bGVCb3guYXBwbHlTdHlsZXMoewogICAgICAgIHJpZ2h0OiBzdHlsZUJveC5mb3JtYXRTdHlsZShsaW5lUG9zLCAiJSIpCiAgICAgIH0pOwogICAgICBicmVhazsKICAgIH0KCiAgICBheGlzID0gWyAiK3kiLCAiLXgiLCAiK3giLCAiLXkiIF07CgogICAgLy8gR2V0IHRoZSBib3ggcG9zaXRpb24gYWdhaW4gYWZ0ZXIgd2UndmUgYXBwbGllZCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uaW5nCiAgICAvLyB0byBpdC4KICAgIGJveFBvc2l0aW9uID0gbmV3IEJveFBvc2l0aW9uKHN0eWxlQm94KTsKICB9CgogIHZhciBiZXN0UG9zaXRpb24gPSBmaW5kQmVzdFBvc2l0aW9uKGJveFBvc2l0aW9uLCBheGlzKTsKICBzdHlsZUJveC5tb3ZlKGJlc3RQb3NpdGlvbi50b0NTU0NvbXBhdFZhbHVlcyhjb250YWluZXJCb3gpKTsKfQoKZnVuY3Rpb24gV2ViVlRUJDEoKSB7CiAgLy8gTm90aGluZwp9CgovLyBIZWxwZXIgdG8gYWxsb3cgc3RyaW5ncyB0byBiZSBkZWNvZGVkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYmluYXJ5IHV0ZjggZGF0YS4KV2ViVlRUJDEuU3RyaW5nRGVjb2RlciA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB7CiAgICBkZWNvZGU6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgaWYgKCFkYXRhKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVycm9yIC0gZXhwZWN0ZWQgc3RyaW5nIGRhdGEuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQoZGF0YSkpOwogICAgfQogIH07Cn07CgpXZWJWVFQkMS5jb252ZXJ0Q3VlVG9ET01UcmVlID0gZnVuY3Rpb24od2luZG93LCBjdWV0ZXh0KSB7CiAgaWYgKCF3aW5kb3cgfHwgIWN1ZXRleHQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gcGFyc2VDb250ZW50KHdpbmRvdywgY3VldGV4dCk7Cn07Cgp2YXIgRk9OVF9TSVpFX1BFUkNFTlQgPSAwLjA1Owp2YXIgRk9OVF9TVFlMRSA9ICJzYW5zLXNlcmlmIjsKdmFyIENVRV9CQUNLR1JPVU5EX1BBRERJTkcgPSAiMS41JSI7CgovLyBSdW5zIHRoZSBwcm9jZXNzaW5nIG1vZGVsIG92ZXIgdGhlIGN1ZXMgYW5kIHJlZ2lvbnMgcGFzc2VkIHRvIGl0LgovLyBAcGFyYW0gb3ZlcmxheSBBIGJsb2NrIGxldmVsIGVsZW1lbnQgKHVzdWFsbHkgYSBkaXYpIHRoYXQgdGhlIGNvbXB1dGVkIGN1ZXMKLy8gICAgICAgICAgICAgICAgYW5kIHJlZ2lvbnMgd2lsbCBiZSBwbGFjZWQgaW50by4KV2ViVlRUJDEucHJvY2Vzc0N1ZXMgPSBmdW5jdGlvbih3aW5kb3csIGN1ZXMsIG92ZXJsYXkpIHsKICBpZiAoIXdpbmRvdyB8fCAhY3VlcyB8fCAhb3ZlcmxheSkgewogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBSZW1vdmUgYWxsIHByZXZpb3VzIGNoaWxkcmVuLgogIHdoaWxlIChvdmVybGF5LmZpcnN0Q2hpbGQpIHsKICAgIG92ZXJsYXkucmVtb3ZlQ2hpbGQob3ZlcmxheS5maXJzdENoaWxkKTsKICB9CgogIHZhciBwYWRkZWRPdmVybGF5ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIHBhZGRlZE92ZXJsYXkuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogIHBhZGRlZE92ZXJsYXkuc3R5bGUubGVmdCA9ICIwIjsKICBwYWRkZWRPdmVybGF5LnN0eWxlLnJpZ2h0ID0gIjAiOwogIHBhZGRlZE92ZXJsYXkuc3R5bGUudG9wID0gIjAiOwogIHBhZGRlZE92ZXJsYXkuc3R5bGUuYm90dG9tID0gIjAiOwogIHBhZGRlZE92ZXJsYXkuc3R5bGUubWFyZ2luID0gQ1VFX0JBQ0tHUk9VTkRfUEFERElORzsKICBvdmVybGF5LmFwcGVuZENoaWxkKHBhZGRlZE92ZXJsYXkpOwoKICAvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXNwbGF5IHN0YXRlcyBvZiB0aGUgY3Vlcy4gVGhpcyBjb3VsZAogIC8vIGJlIHRoZSBjYXNlIGlmIGEgY3VlJ3Mgc3RhdGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBjb21wdXRhdGlvbiBvcgogIC8vIGlmIGl0IGhhcyBub3QgYmVlbiBjb21wdXRlZCB5ZXQuCiAgZnVuY3Rpb24gc2hvdWxkQ29tcHV0ZShjdWVzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGN1ZXNbaV0uaGFzQmVlblJlc2V0IHx8ICFjdWVzW2ldLmRpc3BsYXlTdGF0ZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgY3VlcycgZGlzcGxheSBzdGF0ZXMuIEp1c3QgcmV1c2UgdGhlbS4KICBpZiAoIXNob3VsZENvbXB1dGUoY3VlcykpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3Vlcy5sZW5ndGg7IGkrKykgewogICAgICBwYWRkZWRPdmVybGF5LmFwcGVuZENoaWxkKGN1ZXNbaV0uZGlzcGxheVN0YXRlKTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIHZhciBib3hQb3NpdGlvbnMgPSBbXSwKICAgICAgY29udGFpbmVyQm94ID0gQm94UG9zaXRpb24uZ2V0U2ltcGxlQm94UG9zaXRpb24ocGFkZGVkT3ZlcmxheSksCiAgICAgIGZvbnRTaXplID0gTWF0aC5yb3VuZChjb250YWluZXJCb3guaGVpZ2h0ICogRk9OVF9TSVpFX1BFUkNFTlQgKiAxMDApIC8gMTAwOwogIHZhciBzdHlsZU9wdGlvbnMgPSB7CiAgICBmb250OiBmb250U2l6ZSArICJweCAiICsgRk9OVF9TVFlMRQogIH07CgogIChmdW5jdGlvbigpIHsKICAgIHZhciBzdHlsZUJveCwgY3VlOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3Vlcy5sZW5ndGg7IGkrKykgewogICAgICBjdWUgPSBjdWVzW2ldOwoKICAgICAgLy8gQ29tcHV0ZSB0aGUgaW50aWFsIHBvc2l0aW9uIGFuZCBzdHlsZXMgb2YgdGhlIGN1ZSBkaXYuCiAgICAgIHN0eWxlQm94ID0gbmV3IEN1ZVN0eWxlQm94KHdpbmRvdywgY3VlLCBzdHlsZU9wdGlvbnMpOwogICAgICBwYWRkZWRPdmVybGF5LmFwcGVuZENoaWxkKHN0eWxlQm94LmRpdik7CgogICAgICAvLyBNb3ZlIHRoZSBjdWUgZGl2IHRvIGl0J3MgY29ycmVjdCBsaW5lIHBvc2l0aW9uLgogICAgICBtb3ZlQm94VG9MaW5lUG9zaXRpb24od2luZG93LCBzdHlsZUJveCwgY29udGFpbmVyQm94LCBib3hQb3NpdGlvbnMpOwoKICAgICAgLy8gUmVtZW1iZXIgdGhlIGNvbXB1dGVkIGRpdiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIGl0IGxhdGVyCiAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgdG9vLgogICAgICBjdWUuZGlzcGxheVN0YXRlID0gc3R5bGVCb3guZGl2OwoKICAgICAgYm94UG9zaXRpb25zLnB1c2goQm94UG9zaXRpb24uZ2V0U2ltcGxlQm94UG9zaXRpb24oc3R5bGVCb3gpKTsKICAgIH0KICB9KSgpOwp9OwoKV2ViVlRUJDEuUGFyc2VyID0gZnVuY3Rpb24od2luZG93LCB2dHRqcywgZGVjb2RlcikgewogIGlmICghZGVjb2RlcikgewogICAgZGVjb2RlciA9IHZ0dGpzOwogICAgdnR0anMgPSB7fTsKICB9CiAgaWYgKCF2dHRqcykgewogICAgdnR0anMgPSB7fTsKICB9CgogIHRoaXMud2luZG93ID0gd2luZG93OwogIHRoaXMudnR0anMgPSB2dHRqczsKICB0aGlzLnN0YXRlID0gIklOSVRJQUwiOwogIHRoaXMuYnVmZmVyID0gIiI7CiAgdGhpcy5kZWNvZGVyID0gZGVjb2RlciB8fCBuZXcgVGV4dERlY29kZXIoInV0ZjgiKTsKICB0aGlzLnJlZ2lvbkxpc3QgPSBbXTsKfTsKCldlYlZUVCQxLlBhcnNlci5wcm90b3R5cGUgPSB7CiAgLy8gSWYgdGhlIGVycm9yIGlzIGEgUGFyc2luZ0Vycm9yIHRoZW4gcmVwb3J0IGl0IHRvIHRoZSBjb25zdW1lciBpZgogIC8vIHBvc3NpYmxlLiBJZiBpdCdzIG5vdCBhIFBhcnNpbmdFcnJvciB0aGVuIHRocm93IGl0IGxpa2Ugbm9ybWFsLgogIHJlcG9ydE9yVGhyb3dFcnJvcjogZnVuY3Rpb24oZSkgewogICAgaWYgKGUgaW5zdGFuY2VvZiBQYXJzaW5nRXJyb3IpIHsKICAgICAgdGhpcy5vbnBhcnNpbmdlcnJvciAmJiB0aGlzLm9ucGFyc2luZ2Vycm9yKGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZTsKICAgIH0KICB9LAogIHBhcnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgdGhlbiB3ZSB3b24ndCBkZWNvZGUgaXQsIGJ1dCB3aWxsIGp1c3QgdHJ5IHRvIHBhcnNlCiAgICAvLyB3aGF0ZXZlciBpcyBpbiBidWZmZXIgYWxyZWFkeS4gVGhpcyBtYXkgb2NjdXIgaW4gY2lyY3Vtc3RhbmNlcywgZm9yCiAgICAvLyBleGFtcGxlIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQuCiAgICBpZiAoZGF0YSkgewogICAgICAvLyBUcnkgdG8gZGVjb2RlIHRoZSBkYXRhIHRoYXQgd2UgcmVjZWl2ZWQuCiAgICAgIHNlbGYuYnVmZmVyICs9IHNlbGYuZGVjb2Rlci5kZWNvZGUoZGF0YSwge3N0cmVhbTogdHJ1ZX0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbGxlY3ROZXh0TGluZSgpIHsKICAgICAgdmFyIGJ1ZmZlciA9IHNlbGYuYnVmZmVyOwogICAgICB2YXIgcG9zID0gMDsKICAgICAgd2hpbGUgKHBvcyA8IGJ1ZmZlci5sZW5ndGggJiYgYnVmZmVyW3Bvc10gIT09ICdccicgJiYgYnVmZmVyW3Bvc10gIT09ICdcbicpIHsKICAgICAgICArK3BvczsKICAgICAgfQogICAgICB2YXIgbGluZSA9IGJ1ZmZlci5zdWJzdHIoMCwgcG9zKTsKICAgICAgLy8gQWR2YW5jZSB0aGUgYnVmZmVyIGVhcmx5IGluIGNhc2Ugd2UgZmFpbCBiZWxvdy4KICAgICAgaWYgKGJ1ZmZlcltwb3NdID09PSAnXHInKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgaWYgKGJ1ZmZlcltwb3NdID09PSAnXG4nKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgc2VsZi5idWZmZXIgPSBidWZmZXIuc3Vic3RyKHBvcyk7CiAgICAgIHJldHVybiBsaW5lOwogICAgfQoKICAgIC8vIDMuNCBXZWJWVFQgcmVnaW9uIGFuZCBXZWJWVFQgcmVnaW9uIHNldHRpbmdzIHN5bnRheAogICAgZnVuY3Rpb24gcGFyc2VSZWdpb24oaW5wdXQpIHsKICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKCk7CgogICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgc3dpdGNoIChrKSB7CiAgICAgICAgY2FzZSAiaWQiOgogICAgICAgICAgc2V0dGluZ3Muc2V0KGssIHYpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAid2lkdGgiOgogICAgICAgICAgc2V0dGluZ3MucGVyY2VudChrLCB2KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxpbmVzIjoKICAgICAgICAgIHNldHRpbmdzLmludGVnZXIoaywgdik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyZWdpb25hbmNob3IiOgogICAgICAgIGNhc2UgInZpZXdwb3J0YW5jaG9yIjoKICAgICAgICAgIHZhciB4eSA9IHYuc3BsaXQoJywnKTsKICAgICAgICAgIGlmICh4eS5sZW5ndGggIT09IDIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSBib3RoIHggYW5kIHkgcGFyc2UsIHNvIHVzZSBhIHRlbXBvcmFyeQogICAgICAgICAgLy8gc2V0dGluZ3Mgb2JqZWN0IGhlcmUuCiAgICAgICAgICB2YXIgYW5jaG9yID0gbmV3IFNldHRpbmdzKCk7CiAgICAgICAgICBhbmNob3IucGVyY2VudCgieCIsIHh5WzBdKTsKICAgICAgICAgIGFuY2hvci5wZXJjZW50KCJ5IiwgeHlbMV0pOwogICAgICAgICAgaWYgKCFhbmNob3IuaGFzKCJ4IikgfHwgIWFuY2hvci5oYXMoInkiKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHNldHRpbmdzLnNldChrICsgIlgiLCBhbmNob3IuZ2V0KCJ4IikpOwogICAgICAgICAgc2V0dGluZ3Muc2V0KGsgKyAiWSIsIGFuY2hvci5nZXQoInkiKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzY3JvbGwiOgogICAgICAgICAgc2V0dGluZ3MuYWx0KGssIHYsIFsidXAiXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0sIC89LywgL1xzLyk7CgogICAgICAvLyBDcmVhdGUgdGhlIHJlZ2lvbiwgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIGFueSB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAogICAgICAvLyBzcGVjaWZpZWQuCiAgICAgIGlmIChzZXR0aW5ncy5oYXMoImlkIikpIHsKICAgICAgICB2YXIgcmVnaW9uID0gbmV3IChzZWxmLnZ0dGpzLlZUVFJlZ2lvbiB8fCBzZWxmLndpbmRvdy5WVFRSZWdpb24pKCk7CiAgICAgICAgcmVnaW9uLndpZHRoID0gc2V0dGluZ3MuZ2V0KCJ3aWR0aCIsIDEwMCk7CiAgICAgICAgcmVnaW9uLmxpbmVzID0gc2V0dGluZ3MuZ2V0KCJsaW5lcyIsIDMpOwogICAgICAgIHJlZ2lvbi5yZWdpb25BbmNob3JYID0gc2V0dGluZ3MuZ2V0KCJyZWdpb25hbmNob3JYIiwgMCk7CiAgICAgICAgcmVnaW9uLnJlZ2lvbkFuY2hvclkgPSBzZXR0aW5ncy5nZXQoInJlZ2lvbmFuY2hvclkiLCAxMDApOwogICAgICAgIHJlZ2lvbi52aWV3cG9ydEFuY2hvclggPSBzZXR0aW5ncy5nZXQoInZpZXdwb3J0YW5jaG9yWCIsIDApOwogICAgICAgIHJlZ2lvbi52aWV3cG9ydEFuY2hvclkgPSBzZXR0aW5ncy5nZXQoInZpZXdwb3J0YW5jaG9yWSIsIDEwMCk7CiAgICAgICAgcmVnaW9uLnNjcm9sbCA9IHNldHRpbmdzLmdldCgic2Nyb2xsIiwgIiIpOwogICAgICAgIC8vIFJlZ2lzdGVyIHRoZSByZWdpb24uCiAgICAgICAgc2VsZi5vbnJlZ2lvbiAmJiBzZWxmLm9ucmVnaW9uKHJlZ2lvbik7CiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIFZUVFJlZ2lvbiBmb3IgbGF0ZXIgaW4gY2FzZSB3ZSBwYXJzZSBhbnkgVlRUQ3VlcyB0aGF0CiAgICAgICAgLy8gcmVmZXJlbmNlIGl0LgogICAgICAgIHNlbGYucmVnaW9uTGlzdC5wdXNoKHsKICAgICAgICAgIGlkOiBzZXR0aW5ncy5nZXQoImlkIiksCiAgICAgICAgICByZWdpb246IHJlZ2lvbgogICAgICAgIH0pOwogICAgICB9CiAgICB9CgogICAgLy8gZHJhZnQtcGFudG9zLWh0dHAtbGl2ZS1zdHJlYW1pbmctMjAKICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1wYW50b3MtaHR0cC1saXZlLXN0cmVhbWluZy0yMCNzZWN0aW9uLTMuNQogICAgLy8gMy41IFdlYlZUVAogICAgZnVuY3Rpb24gcGFyc2VUaW1lc3RhbXBNYXAoaW5wdXQpIHsKICAgICAgdmFyIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKCk7CgogICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uKGssIHYpIHsKICAgICAgICBzd2l0Y2goaykgewogICAgICAgIGNhc2UgIk1QRUdUIjoKICAgICAgICAgIHNldHRpbmdzLmludGVnZXIoayArICdTJywgdik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMT0NBIjoKICAgICAgICAgIHNldHRpbmdzLnNldChrICsgJ0wnLCBwYXJzZVRpbWVTdGFtcCh2KSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0sIC9bXlxkXTovLCAvLC8pOwoKICAgICAgc2VsZi5vbnRpbWVzdGFtcG1hcCAmJiBzZWxmLm9udGltZXN0YW1wbWFwKHsKICAgICAgICAiTVBFR1RTIjogc2V0dGluZ3MuZ2V0KCJNUEVHVFMiKSwKICAgICAgICAiTE9DQUwiOiBzZXR0aW5ncy5nZXQoIkxPQ0FMIikKICAgICAgfSk7CiAgICB9CgogICAgLy8gMy4yIFdlYlZUVCBtZXRhZGF0YSBoZWFkZXIgc3ludGF4CiAgICBmdW5jdGlvbiBwYXJzZUhlYWRlcihpbnB1dCkgewogICAgICBpZiAoaW5wdXQubWF0Y2goL1gtVElNRVNUQU1QLU1BUC8pKSB7CiAgICAgICAgLy8gVGhpcyBsaW5lIGNvbnRhaW5zIEhMUyBYLVRJTUVTVEFNUC1NQVAgbWV0YWRhdGEKICAgICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uKGssIHYpIHsKICAgICAgICAgIHN3aXRjaChrKSB7CiAgICAgICAgICBjYXNlICJYLVRJTUVTVEFNUC1NQVAiOgogICAgICAgICAgICBwYXJzZVRpbWVzdGFtcE1hcCh2KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSwgLz0vKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJzZU9wdGlvbnMoaW5wdXQsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgICBzd2l0Y2ggKGspIHsKICAgICAgICAgIGNhc2UgIlJlZ2lvbiI6CiAgICAgICAgICAgIC8vIDMuMyBXZWJWVFQgcmVnaW9uIG1ldGFkYXRhIGhlYWRlciBzeW50YXgKICAgICAgICAgICAgcGFyc2VSZWdpb24odik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0sIC86Lyk7CiAgICAgIH0KCiAgICB9CgogICAgLy8gNS4xIFdlYlZUVCBmaWxlIHBhcnNpbmcuCiAgICB0cnkgewogICAgICB2YXIgbGluZTsKICAgICAgaWYgKHNlbGYuc3RhdGUgPT09ICJJTklUSUFMIikgewogICAgICAgIC8vIFdlIGNhbid0IHN0YXJ0IHBhcnNpbmcgdW50aWwgd2UgaGF2ZSB0aGUgZmlyc3QgbGluZS4KICAgICAgICBpZiAoIS9cclxufFxuLy50ZXN0KHNlbGYuYnVmZmVyKSkgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQoKICAgICAgICBsaW5lID0gY29sbGVjdE5leHRMaW5lKCk7CgogICAgICAgIHZhciBtID0gbGluZS5tYXRjaCgvXldFQlZUVChbIFx0XS4qKT8kLyk7CiAgICAgICAgaWYgKCFtIHx8ICFtWzBdKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2luZ0Vycm9yKFBhcnNpbmdFcnJvci5FcnJvcnMuQmFkU2lnbmF0dXJlKTsKICAgICAgICB9CgogICAgICAgIHNlbGYuc3RhdGUgPSAiSEVBREVSIjsKICAgICAgfQoKICAgICAgdmFyIGFscmVhZHlDb2xsZWN0ZWRMaW5lID0gZmFsc2U7CiAgICAgIHdoaWxlIChzZWxmLmJ1ZmZlcikgewogICAgICAgIC8vIFdlIGNhbid0IHBhcnNlIGEgbGluZSB1bnRpbCB3ZSBoYXZlIHRoZSBmdWxsIGxpbmUuCiAgICAgICAgaWYgKCEvXHJcbnxcbi8udGVzdChzZWxmLmJ1ZmZlcikpIHsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFhbHJlYWR5Q29sbGVjdGVkTGluZSkgewogICAgICAgICAgbGluZSA9IGNvbGxlY3ROZXh0TGluZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhbHJlYWR5Q29sbGVjdGVkTGluZSA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChzZWxmLnN0YXRlKSB7CiAgICAgICAgY2FzZSAiSEVBREVSIjoKICAgICAgICAgIC8vIDEzLTE4IC0gQWxsb3cgYSBoZWFkZXIgKG1ldGFkYXRhKSB1bmRlciB0aGUgV0VCVlRUIGxpbmUuCiAgICAgICAgICBpZiAoLzovLnRlc3QobGluZSkpIHsKICAgICAgICAgICAgcGFyc2VIZWFkZXIobGluZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5lKSB7CiAgICAgICAgICAgIC8vIEFuIGVtcHR5IGxpbmUgdGVybWluYXRlcyB0aGUgaGVhZGVyIGFuZCBzdGFydHMgdGhlIGJvZHkgKGN1ZXMpLgogICAgICAgICAgICBzZWxmLnN0YXRlID0gIklEIjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgIk5PVEUiOgogICAgICAgICAgLy8gSWdub3JlIE5PVEUgYmxvY2tzLgogICAgICAgICAgaWYgKCFsaW5lKSB7CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAiSUQiOwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgY2FzZSAiSUQiOgogICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBzdGFydCBvZiBOT1RFIGJsb2Nrcy4KICAgICAgICAgIGlmICgvXk5PVEUoJHxbIFx0XSkvLnRlc3QobGluZSkpIHsKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICJOT1RFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAvLyAxOS0yOSAtIEFsbG93IGFueSBudW1iZXIgb2YgbGluZSB0ZXJtaW5hdG9ycywgdGhlbiBpbml0aWFsaXplIG5ldyBjdWUgdmFsdWVzLgogICAgICAgICAgaWYgKCFsaW5lKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc2VsZi5jdWUgPSBuZXcgKHNlbGYudnR0anMuVlRUQ3VlIHx8IHNlbGYud2luZG93LlZUVEN1ZSkoMCwgMCwgIiIpOwogICAgICAgICAgc2VsZi5zdGF0ZSA9ICJDVUUiOwogICAgICAgICAgLy8gMzAtMzkgLSBDaGVjayBpZiBzZWxmIGxpbmUgY29udGFpbnMgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvciB0aW1pbmcgZGF0YS4KICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoIi0tPiIpID09PSAtMSkgewogICAgICAgICAgICBzZWxmLmN1ZS5pZCA9IGxpbmU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgLy8gUHJvY2VzcyBsaW5lIGFzIHN0YXJ0IG9mIGEgY3VlLgogICAgICAgICAgLypmYWxscyB0aHJvdWdoKi8KICAgICAgICBjYXNlICJDVUUiOgogICAgICAgICAgLy8gNDAgLSBDb2xsZWN0IGN1ZSB0aW1pbmdzIGFuZCBzZXR0aW5ncy4KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnNlQ3VlKGxpbmUsIHNlbGYuY3VlLCBzZWxmLnJlZ2lvbkxpc3QpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzZWxmLnJlcG9ydE9yVGhyb3dFcnJvcihlKTsKICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBlcnJvciBpZ25vcmUgcmVzdCBvZiB0aGUgY3VlLgogICAgICAgICAgICBzZWxmLmN1ZSA9IG51bGw7CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAiQkFEQ1VFIjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLnN0YXRlID0gIkNVRVRFWFQiOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgY2FzZSAiQ1VFVEVYVCI6CiAgICAgICAgICB2YXIgaGFzU3Vic3RyaW5nID0gbGluZS5pbmRleE9mKCItLT4iKSAhPT0gLTE7CiAgICAgICAgICAvLyAzNCAtIElmIHdlIGhhdmUgYW4gZW1wdHkgbGluZSB0aGVuIHJlcG9ydCB0aGUgY3VlLgogICAgICAgICAgLy8gMzUgLSBJZiB3ZSBoYXZlIHRoZSBzcGVjaWFsIHN1YnN0cmluZyAnLS0+JyB0aGVuIHJlcG9ydCB0aGUgY3VlLAogICAgICAgICAgLy8gYnV0IGRvIG5vdCBjb2xsZWN0IHRoZSBsaW5lIGFzIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgY3VycmVudAogICAgICAgICAgLy8gb25lIGFzIGEgbmV3IGN1ZS4KICAgICAgICAgIGlmICghbGluZSB8fCBoYXNTdWJzdHJpbmcgJiYgKGFscmVhZHlDb2xsZWN0ZWRMaW5lID0gdHJ1ZSkpIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGRvbmUgcGFyc2luZyBzZWxmIGN1ZS4KICAgICAgICAgICAgc2VsZi5vbmN1ZSAmJiBzZWxmLm9uY3VlKHNlbGYuY3VlKTsKICAgICAgICAgICAgc2VsZi5jdWUgPSBudWxsOwogICAgICAgICAgICBzZWxmLnN0YXRlID0gIklEIjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2VsZi5jdWUudGV4dCkgewogICAgICAgICAgICBzZWxmLmN1ZS50ZXh0ICs9ICJcbiI7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmN1ZS50ZXh0ICs9IGxpbmU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlICJCQURDVUUiOiAvLyBCQURDVUUKICAgICAgICAgIC8vIDU0LTYyIC0gQ29sbGVjdCBhbmQgZGlzY2FyZCB0aGUgcmVtYWluaW5nIGN1ZS4KICAgICAgICAgIGlmICghbGluZSkgewogICAgICAgICAgICBzZWxmLnN0YXRlID0gIklEIjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnJlcG9ydE9yVGhyb3dFcnJvcihlKTsKCiAgICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBhIGN1ZSwgcmVwb3J0IHdoYXQgd2UgaGF2ZS4KICAgICAgaWYgKHNlbGYuc3RhdGUgPT09ICJDVUVURVhUIiAmJiBzZWxmLmN1ZSAmJiBzZWxmLm9uY3VlKSB7CiAgICAgICAgc2VsZi5vbmN1ZShzZWxmLmN1ZSk7CiAgICAgIH0KICAgICAgc2VsZi5jdWUgPSBudWxsOwogICAgICAvLyBFbnRlciBCQURXRUJWVFQgc3RhdGUgaWYgaGVhZGVyIHdhcyBub3QgcGFyc2VkIGNvcnJlY3RseSBvdGhlcndpc2UKICAgICAgLy8gYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQgc28gZW50ZXIgQkFEQ1VFIHN0YXRlLgogICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZSA9PT0gIklOSVRJQUwiID8gIkJBRFdFQlZUVCIgOiAiQkFEQ1VFIjsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0sCiAgZmx1c2g6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRyeSB7CiAgICAgIC8vIEZpbmlzaCBkZWNvZGluZyB0aGUgc3RyZWFtLgogICAgICBzZWxmLmJ1ZmZlciArPSBzZWxmLmRlY29kZXIuZGVjb2RlKCk7CiAgICAgIC8vIFN5bnRoZXNpemUgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBjdWUgb3IgcmVnaW9uLgogICAgICBpZiAoc2VsZi5jdWUgfHwgc2VsZi5zdGF0ZSA9PT0gIkhFQURFUiIpIHsKICAgICAgICBzZWxmLmJ1ZmZlciArPSAiXG5cbiI7CiAgICAgICAgc2VsZi5wYXJzZSgpOwogICAgICB9CiAgICAgIC8vIElmIHdlJ3ZlIGZsdXNoZWQsIHBhcnNlZCwgYW5kIHdlJ3JlIHN0aWxsIG9uIHRoZSBJTklUSUFMIHN0YXRlIHRoZW4KICAgICAgLy8gdGhhdCBtZWFucyB3ZSBkb24ndCBoYXZlIGVub3VnaCBvZiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBmaXJzdAogICAgICAvLyBsaW5lLgogICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gIklOSVRJQUwiKSB7CiAgICAgICAgdGhyb3cgbmV3IFBhcnNpbmdFcnJvcihQYXJzaW5nRXJyb3IuRXJyb3JzLkJhZFNpZ25hdHVyZSk7CiAgICAgIH0KICAgIH0gY2F0Y2goZSkgewogICAgICBzZWxmLnJlcG9ydE9yVGhyb3dFcnJvcihlKTsKICAgIH0KICAgIHNlbGYub25mbHVzaCAmJiBzZWxmLm9uZmx1c2goKTsKICAgIHJldHVybiB0aGlzOwogIH0KfTsKCnZhciB2dHQkMSA9IFdlYlZUVCQxOwoKLyoqCiAqIENvcHlyaWdodCAyMDEzIHZ0dC5qcyBDb250cmlidXRvcnMKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKdmFyIGF1dG9LZXl3b3JkID0gImF1dG8iOwp2YXIgZGlyZWN0aW9uU2V0dGluZyA9IHsKICAiIjogdHJ1ZSwKICAibHIiOiB0cnVlLAogICJybCI6IHRydWUKfTsKdmFyIGFsaWduU2V0dGluZyA9IHsKICAic3RhcnQiOiB0cnVlLAogICJtaWRkbGUiOiB0cnVlLAogICJlbmQiOiB0cnVlLAogICJsZWZ0IjogdHJ1ZSwKICAicmlnaHQiOiB0cnVlCn07CgpmdW5jdGlvbiBmaW5kRGlyZWN0aW9uU2V0dGluZyh2YWx1ZSkgewogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHZhciBkaXIgPSBkaXJlY3Rpb25TZXR0aW5nW3ZhbHVlLnRvTG93ZXJDYXNlKCldOwogIHJldHVybiBkaXIgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogZmFsc2U7Cn0KCmZ1bmN0aW9uIGZpbmRBbGlnblNldHRpbmcodmFsdWUpIHsKICBpZiAodHlwZW9mIHZhbHVlICE9PSAic3RyaW5nIikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICB2YXIgYWxpZ24gPSBhbGlnblNldHRpbmdbdmFsdWUudG9Mb3dlckNhc2UoKV07CiAgcmV0dXJuIGFsaWduID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IGZhbHNlOwp9CgpmdW5jdGlvbiBleHRlbmQkMShvYmopIHsKICB2YXIgaSA9IDE7CiAgZm9yICg7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBjb2JqID0gYXJndW1lbnRzW2ldOwogICAgZm9yICh2YXIgcCBpbiBjb2JqKSB7CiAgICAgIG9ialtwXSA9IGNvYmpbcF07CiAgICB9CiAgfQoKICByZXR1cm4gb2JqOwp9CgpmdW5jdGlvbiBWVFRDdWUoc3RhcnRUaW1lLCBlbmRUaW1lLCB0ZXh0KSB7CiAgdmFyIGN1ZSA9IHRoaXM7CiAgdmFyIGlzSUU4ID0gKC9NU0lFXHM4XC4wLykudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgYmFzZU9iaiA9IHt9OwoKICBpZiAoaXNJRTgpIHsKICAgIGN1ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpOwogIH0gZWxzZSB7CiAgICBiYXNlT2JqLmVudW1lcmFibGUgPSB0cnVlOwogIH0KCiAgLyoqCiAgICogU2hpbSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgaW4KICAgKiB0aGUgc3BlYy4KICAgKi8KCiAgLy8gTGV0cyB1cyBrbm93IHdoZW4gdGhlIFZUVEN1ZSdzIGRhdGEgaGFzIGNoYW5nZWQgaW4gc3VjaCBhIHdheSB0aGF0IHdlIG5lZWQKICAvLyB0byByZWNvbXB1dGUgaXRzIGRpc3BsYXkgc3RhdGUuIFRoaXMgbGV0cyB1cyBjb21wdXRlIGl0cyBkaXNwbGF5IHN0YXRlCiAgLy8gbGF6aWx5LgogIGN1ZS5oYXNCZWVuUmVzZXQgPSBmYWxzZTsKCiAgLyoqCiAgICogVlRUQ3VlIGFuZCBUZXh0VHJhY2tDdWUgcHJvcGVydGllcwogICAqIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnZ0dC8jdnR0Y3VlLWludGVyZmFjZQogICAqLwoKICB2YXIgX2lkID0gIiI7CiAgdmFyIF9wYXVzZU9uRXhpdCA9IGZhbHNlOwogIHZhciBfc3RhcnRUaW1lID0gc3RhcnRUaW1lOwogIHZhciBfZW5kVGltZSA9IGVuZFRpbWU7CiAgdmFyIF90ZXh0ID0gdGV4dDsKICB2YXIgX3JlZ2lvbiA9IG51bGw7CiAgdmFyIF92ZXJ0aWNhbCA9ICIiOwogIHZhciBfc25hcFRvTGluZXMgPSB0cnVlOwogIHZhciBfbGluZSA9ICJhdXRvIjsKICB2YXIgX2xpbmVBbGlnbiA9ICJzdGFydCI7CiAgdmFyIF9wb3NpdGlvbiA9IDUwOwogIHZhciBfcG9zaXRpb25BbGlnbiA9ICJtaWRkbGUiOwogIHZhciBfc2l6ZSA9IDUwOwogIHZhciBfYWxpZ24gPSAibWlkZGxlIjsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJpZCIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9pZDsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIF9pZCA9ICIiICsgdmFsdWU7CiAgICAgIH0KICAgIH0pKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJwYXVzZU9uRXhpdCIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9wYXVzZU9uRXhpdDsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIF9wYXVzZU9uRXhpdCA9ICEhdmFsdWU7CiAgICAgIH0KICAgIH0pKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJzdGFydFRpbWUiLCBleHRlbmQkMSh7fSwgYmFzZU9iaiwgewogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfc3RhcnRUaW1lOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN0YXJ0IHRpbWUgbXVzdCBiZSBzZXQgdG8gYSBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIF9zdGFydFRpbWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7CiAgICAgIH0KICAgIH0pKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJlbmRUaW1lIiwgZXh0ZW5kJDEoe30sIGJhc2VPYmosIHsKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gX2VuZFRpbWU7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRW5kIHRpbWUgbXVzdCBiZSBzZXQgdG8gYSBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIF9lbmRUaW1lID0gdmFsdWU7CiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlOwogICAgICB9CiAgICB9KSk7CgogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsCiAgICAidGV4dCIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF90ZXh0OwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgX3RleHQgPSAiIiArIHZhbHVlOwogICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTsKICAgICAgfQogICAgfSkpOwoKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLAogICAgInJlZ2lvbiIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9yZWdpb247CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBfcmVnaW9uID0gdmFsdWU7CiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlOwogICAgICB9CiAgICB9KSk7CgogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsCiAgICAidmVydGljYWwiLCBleHRlbmQkMSh7fSwgYmFzZU9iaiwgewogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfdmVydGljYWw7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgc2V0dGluZyA9IGZpbmREaXJlY3Rpb25TZXR0aW5nKHZhbHVlKTsKICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBmYWxzZSBiZWNhdXNlIHRoZSBzZXR0aW5nIGFuIGJlIGFuIGVtcHR5IHN0cmluZy4KICAgICAgICBpZiAoc2V0dGluZyA9PT0gZmFsc2UpIHsKICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLiIpOwogICAgICAgIH0KICAgICAgICBfdmVydGljYWwgPSBzZXR0aW5nOwogICAgICAgIHRoaXMuaGFzQmVlblJlc2V0ID0gdHJ1ZTsKICAgICAgfQogICAgfSkpOwoKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VlLAogICAgInNuYXBUb0xpbmVzIiwgZXh0ZW5kJDEoe30sIGJhc2VPYmosIHsKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gX3NuYXBUb0xpbmVzOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgX3NuYXBUb0xpbmVzID0gISF2YWx1ZTsKICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7CiAgICAgIH0KICAgIH0pKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJsaW5lIiwgZXh0ZW5kJDEoe30sIGJhc2VPYmosIHsKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gX2xpbmU7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIiAmJiB2YWx1ZSAhPT0gYXV0b0tleXdvcmQpIHsKICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiQW4gaW52YWxpZCBudW1iZXIgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZC4iKTsKICAgICAgICB9CiAgICAgICAgX2xpbmUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7CiAgICAgIH0KICAgIH0pKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJsaW5lQWxpZ24iLCBleHRlbmQkMSh7fSwgYmFzZU9iaiwgewogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfbGluZUFsaWduOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kQWxpZ25TZXR0aW5nKHZhbHVlKTsKICAgICAgICBpZiAoIXNldHRpbmcpIHsKICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLiIpOwogICAgICAgIH0KICAgICAgICBfbGluZUFsaWduID0gc2V0dGluZzsKICAgICAgICB0aGlzLmhhc0JlZW5SZXNldCA9IHRydWU7CiAgICAgIH0KICAgIH0pKTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1ZSwKICAgICJwb3NpdGlvbiIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9wb3NpdGlvbjsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zaXRpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC4iKTsKICAgICAgICB9CiAgICAgICAgX3Bvc2l0aW9uID0gdmFsdWU7CiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlOwogICAgICB9CiAgICB9KSk7CgogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsCiAgICAicG9zaXRpb25BbGlnbiIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9wb3NpdGlvbkFsaWduOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kQWxpZ25TZXR0aW5nKHZhbHVlKTsKICAgICAgICBpZiAoIXNldHRpbmcpIHsKICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLiIpOwogICAgICAgIH0KICAgICAgICBfcG9zaXRpb25BbGlnbiA9IHNldHRpbmc7CiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlOwogICAgICB9CiAgICB9KSk7CgogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsCiAgICAic2l6ZSIsIGV4dGVuZCQxKHt9LCBiYXNlT2JqLCB7CiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9zaXplOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEwMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTaXplIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuIik7CiAgICAgICAgfQogICAgICAgIF9zaXplID0gdmFsdWU7CiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlOwogICAgICB9CiAgICB9KSk7CgogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdWUsCiAgICAiYWxpZ24iLCBleHRlbmQkMSh7fSwgYmFzZU9iaiwgewogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfYWxpZ247CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgc2V0dGluZyA9IGZpbmRBbGlnblNldHRpbmcodmFsdWUpOwogICAgICAgIGlmICghc2V0dGluZykgewogICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuIik7CiAgICAgICAgfQogICAgICAgIF9hbGlnbiA9IHNldHRpbmc7CiAgICAgICAgdGhpcy5oYXNCZWVuUmVzZXQgPSB0cnVlOwogICAgICB9CiAgICB9KSk7CgogIC8qKgogICAqIE90aGVyIDx0cmFjaz4gc3BlYyBkZWZpbmVkIHByb3BlcnRpZXMKICAgKi8KCiAgLy8gaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLXZpZGVvLWVsZW1lbnQuaHRtbCN0ZXh0LXRyYWNrLWN1ZS1kaXNwbGF5LXN0YXRlCiAgY3VlLmRpc3BsYXlTdGF0ZSA9IHVuZGVmaW5lZDsKCiAgaWYgKGlzSUU4KSB7CiAgICByZXR1cm4gY3VlOwogIH0KfQoKLyoqCiAqIFZUVEN1ZSBtZXRob2RzCiAqLwoKVlRUQ3VlLnByb3RvdHlwZS5nZXRDdWVBc0hUTUwgPSBmdW5jdGlvbigpIHsKICAvLyBBc3N1bWUgV2ViVlRULmNvbnZlcnRDdWVUb0RPTVRyZWUgaXMgb24gdGhlIGdsb2JhbC4KICByZXR1cm4gV2ViVlRULmNvbnZlcnRDdWVUb0RPTVRyZWUod2luZG93LCB0aGlzLnRleHQpOwp9OwoKdmFyIHZ0dGN1ZSA9IFZUVEN1ZTsKCi8qKgogKiBDb3B5cmlnaHQgMjAxMyB2dHQuanMgQ29udHJpYnV0b3JzCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCnZhciBzY3JvbGxTZXR0aW5nID0gewogICIiOiB0cnVlLAogICJ1cCI6IHRydWUKfTsKCmZ1bmN0aW9uIGZpbmRTY3JvbGxTZXR0aW5nKHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgdmFyIHNjcm9sbCA9IHNjcm9sbFNldHRpbmdbdmFsdWUudG9Mb3dlckNhc2UoKV07CiAgcmV0dXJuIHNjcm9sbCA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTsKfQoKZnVuY3Rpb24gaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkgewogIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiICYmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEwMCk7Cn0KCi8vIFZUVFJlZ2lvbiBzaGltIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3dlYnZ0dC8jdnR0cmVnaW9uLWludGVyZmFjZQpmdW5jdGlvbiBWVFRSZWdpb24oKSB7CiAgdmFyIF93aWR0aCA9IDEwMDsKICB2YXIgX2xpbmVzID0gMzsKICB2YXIgX3JlZ2lvbkFuY2hvclggPSAwOwogIHZhciBfcmVnaW9uQW5jaG9yWSA9IDEwMDsKICB2YXIgX3ZpZXdwb3J0QW5jaG9yWCA9IDA7CiAgdmFyIF92aWV3cG9ydEFuY2hvclkgPSAxMDA7CiAgdmFyIF9zY3JvbGwgPSAiIjsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgIndpZHRoIjogewogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfd2lkdGg7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAoIWlzVmFsaWRQZXJjZW50VmFsdWUodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZHRoIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuIik7CiAgICAgICAgfQogICAgICAgIF93aWR0aCA9IHZhbHVlOwogICAgICB9CiAgICB9LAogICAgImxpbmVzIjogewogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfbGluZXM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIikgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiTGluZXMgbXVzdCBiZSBzZXQgdG8gYSBudW1iZXIuIik7CiAgICAgICAgfQogICAgICAgIF9saW5lcyA9IHZhbHVlOwogICAgICB9CiAgICB9LAogICAgInJlZ2lvbkFuY2hvclkiOiB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF9yZWdpb25BbmNob3JZOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKCFpc1ZhbGlkUGVyY2VudFZhbHVlKHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSZWdpb25BbmNob3JYIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuIik7CiAgICAgICAgfQogICAgICAgIF9yZWdpb25BbmNob3JZID0gdmFsdWU7CiAgICAgIH0KICAgIH0sCiAgICAicmVnaW9uQW5jaG9yWCI6IHsKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gX3JlZ2lvbkFuY2hvclg7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZighaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUmVnaW9uQW5jaG9yWSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLiIpOwogICAgICAgIH0KICAgICAgICBfcmVnaW9uQW5jaG9yWCA9IHZhbHVlOwogICAgICB9CiAgICB9LAogICAgInZpZXdwb3J0QW5jaG9yWSI6IHsKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gX3ZpZXdwb3J0QW5jaG9yWTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghaXNWYWxpZFBlcmNlbnRWYWx1ZSh2YWx1ZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVmlld3BvcnRBbmNob3JZIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuIik7CiAgICAgICAgfQogICAgICAgIF92aWV3cG9ydEFuY2hvclkgPSB2YWx1ZTsKICAgICAgfQogICAgfSwKICAgICJ2aWV3cG9ydEFuY2hvclgiOiB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF92aWV3cG9ydEFuY2hvclg7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAoIWlzVmFsaWRQZXJjZW50VmFsdWUodmFsdWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlZpZXdwb3J0QW5jaG9yWCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLiIpOwogICAgICAgIH0KICAgICAgICBfdmlld3BvcnRBbmNob3JYID0gdmFsdWU7CiAgICAgIH0KICAgIH0sCiAgICAic2Nyb2xsIjogewogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfc2Nyb2xsOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIHNldHRpbmcgPSBmaW5kU2Nyb2xsU2V0dGluZyh2YWx1ZSk7CiAgICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgZmFsc2UgYXMgYW4gZW1wdHkgc3RyaW5nIGlzIGEgbGVnYWwgdmFsdWUuCiAgICAgICAgaWYgKHNldHRpbmcgPT09IGZhbHNlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZC4iKTsKICAgICAgICB9CiAgICAgICAgX3Njcm9sbCA9IHNldHRpbmc7CiAgICAgIH0KICAgIH0KICB9KTsKfQoKdmFyIHZ0dHJlZ2lvbiA9IFZUVFJlZ2lvbjsKCnZhciBicm93c2VySW5kZXggPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7Ci8qKgogKiBDb3B5cmlnaHQgMjAxMyB2dHQuanMgQ29udHJpYnV0b3JzCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8vIERlZmF1bHQgZXhwb3J0cyBmb3IgTm9kZS4gRXhwb3J0IHRoZSBleHRlbmRlZCB2ZXJzaW9ucyBvZiBWVFRDdWUgYW5kCi8vIFZUVFJlZ2lvbiBpbiBOb2RlIHNpbmNlIHdlIGxpa2VseSB3YW50IHRoZSBjYXBhYmlsaXR5IHRvIGNvbnZlcnQgYmFjayBhbmQKLy8gZm9ydGggYmV0d2VlbiBKU09OLiBJZiB3ZSBkb24ndCB0aGVuIGl0J3Mgbm90IHRoYXQgYmlnIG9mIGEgZGVhbCBzaW5jZSB3ZSdyZQovLyBvZmYgYnJvd3Nlci4KCgoKdmFyIHZ0dGpzID0gbW9kdWxlLmV4cG9ydHMgPSB7CiAgV2ViVlRUOiB2dHQkMSwKICBWVFRDdWU6IHZ0dGN1ZSwKICBWVFRSZWdpb246IHZ0dHJlZ2lvbgp9OwoKd2luZG93XzEudnR0anMgPSB2dHRqczsKd2luZG93XzEuV2ViVlRUID0gdnR0anMuV2ViVlRUOwoKdmFyIGN1ZVNoaW0gPSB2dHRqcy5WVFRDdWU7CnZhciByZWdpb25TaGltID0gdnR0anMuVlRUUmVnaW9uOwp2YXIgbmF0aXZlVlRUQ3VlID0gd2luZG93XzEuVlRUQ3VlOwp2YXIgbmF0aXZlVlRUUmVnaW9uID0gd2luZG93XzEuVlRUUmVnaW9uOwoKdnR0anMuc2hpbSA9IGZ1bmN0aW9uKCkgewogIHdpbmRvd18xLlZUVEN1ZSA9IGN1ZVNoaW07CiAgd2luZG93XzEuVlRUUmVnaW9uID0gcmVnaW9uU2hpbTsKfTsKCnZ0dGpzLnJlc3RvcmUgPSBmdW5jdGlvbigpIHsKICB3aW5kb3dfMS5WVFRDdWUgPSBuYXRpdmVWVFRDdWU7CiAgd2luZG93XzEuVlRUUmVnaW9uID0gbmF0aXZlVlRUUmVnaW9uOwp9OwoKaWYgKCF3aW5kb3dfMS5WVFRDdWUpIHsKICB2dHRqcy5zaGltKCk7Cn0KfSk7CgovKioKICogQGZpbGUgdGVjaC5qcwogKi8KCi8qKgogKiBBbiBPYmplY3QgY29udGFpbmluZyBhIHN0cnVjdHVyZSBsaWtlOiBge3NyYzogJ3VybCcsIHR5cGU6ICdtaW1ldHlwZSd9YCBvciBzdHJpbmcKICogdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBzcmMgdXJsIGFsb25lLgogKiAqIGB2YXIgU291cmNlT2JqZWN0ID0ge3NyYzogJ2h0dHA6Ly9leC5jb20vdmlkZW8ubXA0JywgdHlwZTogJ3ZpZGVvL21wNCd9O2AKICAgKiBgdmFyIFNvdXJjZVN0cmluZyA9ICdodHRwOi8vZXhhbXBsZS5jb20vc29tZS12aWRlby5tcDQnO2AKICoKICogQHR5cGVkZWYge09iamVjdHxzdHJpbmd9IFRlY2h+U291cmNlT2JqZWN0CiAqCiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzcmMKICogICAgICAgICAgIFRoZSB1cmwgdG8gdGhlIHNvdXJjZQogKgogKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZQogKiAgICAgICAgICAgVGhlIG1pbWUgdHlwZSBvZiB0aGUgc291cmNlCiAqLwoKLyoqCiAqIEEgZnVuY3Rpb24gdXNlZCBieSB7QGxpbmsgVGVjaH0gdG8gY3JlYXRlIGEgbmV3IHtAbGluayBUZXh0VHJhY2t9LgogKgogKiBAcHJpdmF0ZQogKgogKiBAcGFyYW0ge1RlY2h9IHNlbGYKICogICAgICAgIEFuIGluc3RhbmNlIG9mIHRoZSBUZWNoIGNsYXNzLgogKgogKiBAcGFyYW0ge3N0cmluZ30ga2luZAogKiAgICAgICAgYFRleHRUcmFja2Aga2luZCAoc3VidGl0bGVzLCBjYXB0aW9ucywgZGVzY3JpcHRpb25zLCBjaGFwdGVycywgb3IgbWV0YWRhdGEpCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdCiAqICAgICAgICBMYWJlbCB0byBpZGVudGlmeSB0aGUgdGV4dCB0cmFjawogKgogKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlXQogKiAgICAgICAgVHdvIGxldHRlciBsYW5ndWFnZSBhYmJyZXZpYXRpb24KICoKICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XQogKiAgICAgICAgQW4gb2JqZWN0IHdpdGggYWRkaXRpb25hbCB0ZXh0IHRyYWNrIG9wdGlvbnMKICoKICogQHJldHVybiB7VGV4dFRyYWNrfQogKiAgICAgICAgICBUaGUgdGV4dCB0cmFjayB0aGF0IHdhcyBjcmVhdGVkLgogKi8KZnVuY3Rpb24gY3JlYXRlVHJhY2tIZWxwZXIoc2VsZiwga2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7CiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHt9OwoKICB2YXIgdHJhY2tzID0gc2VsZi50ZXh0VHJhY2tzKCk7CgogIG9wdGlvbnMua2luZCA9IGtpbmQ7CgogIGlmIChsYWJlbCkgewogICAgb3B0aW9ucy5sYWJlbCA9IGxhYmVsOwogIH0KICBpZiAobGFuZ3VhZ2UpIHsKICAgIG9wdGlvbnMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKICB9CiAgb3B0aW9ucy50ZWNoID0gc2VsZjsKCiAgdmFyIHRyYWNrID0gbmV3IEFMTC50ZXh0LlRyYWNrQ2xhc3Mob3B0aW9ucyk7CgogIHRyYWNrcy5hZGRUcmFjayh0cmFjayk7CgogIHJldHVybiB0cmFjazsKfQoKLyoqCiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1lZGlhIHBsYXliYWNrIHRlY2hub2xvZ3kgY29udHJvbGxlcnMsIHN1Y2ggYXMKICoge0BsaW5rIEZsYXNofSBhbmQge0BsaW5rIEhUTUw1fQogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgVGVjaCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoVGVjaCwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIFRlY2guCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSByZWFkeQogICAqICAgICAgICBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGBIVE1MNWAgVGVjaCBpcyByZWFkeS4KICAgKi8KICBmdW5jdGlvbiBUZWNoKCkgewogICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgdmFyIHJlYWR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRlY2gpOwoKICAgIC8vIHdlIGRvbid0IHdhbnQgdGhlIHRlY2ggdG8gcmVwb3J0IHVzZXIgYWN0aXZpdHkgYXV0b21hdGljYWxseS4KICAgIC8vIFRoaXMgaXMgZG9uZSBtYW51YWxseSBpbiBhZGRDb250cm9sc0xpc3RlbmVycwogICAgb3B0aW9ucy5yZXBvcnRUb3VjaEFjdGl2aXR5ID0gZmFsc2U7CgogICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBjdXJyZW50IHNvdXJjZSBoYXMgcGxheWVkIGF0IGFsbCB0bwogICAgLy8gaW1wbGVtZW50IGEgdmVyeSBsaW1pdGVkIHBsYXllZCgpCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBudWxsLCBvcHRpb25zLCByZWFkeSkpOwoKICAgIF90aGlzLmhhc1N0YXJ0ZWRfID0gZmFsc2U7CiAgICBfdGhpcy5vbigncGxheWluZycsIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5oYXNTdGFydGVkXyA9IHRydWU7CiAgICB9KTsKICAgIF90aGlzLm9uKCdsb2Fkc3RhcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMuaGFzU3RhcnRlZF8gPSBmYWxzZTsKICAgIH0pOwoKICAgIEFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBwcm9wcyA9IEFMTFtuYW1lXTsKCiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnNbcHJvcHMuZ2V0dGVyTmFtZV0pIHsKICAgICAgICBfdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gPSBvcHRpb25zW3Byb3BzLmdldHRlck5hbWVdOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBNYW51YWxseSB0cmFjayBwcm9ncmVzcyBpbiBjYXNlcyB3aGVyZSB0aGUgYnJvd3Nlci9mbGFzaCBwbGF5ZXIgZG9lc24ndCByZXBvcnQgaXQuCiAgICBpZiAoIV90aGlzLmZlYXR1cmVzUHJvZ3Jlc3NFdmVudHMpIHsKICAgICAgX3RoaXMubWFudWFsUHJvZ3Jlc3NPbigpOwogICAgfQoKICAgIC8vIE1hbnVhbGx5IHRyYWNrIHRpbWV1cGRhdGVzIGluIGNhc2VzIHdoZXJlIHRoZSBicm93c2VyL2ZsYXNoIHBsYXllciBkb2Vzbid0IHJlcG9ydCBpdC4KICAgIGlmICghX3RoaXMuZmVhdHVyZXNUaW1ldXBkYXRlRXZlbnRzKSB7CiAgICAgIF90aGlzLm1hbnVhbFRpbWVVcGRhdGVzT24oKTsKICAgIH0KCiAgICBbJ1RleHQnLCAnQXVkaW8nLCAnVmlkZW8nXS5mb3JFYWNoKGZ1bmN0aW9uICh0cmFjaykgewogICAgICBpZiAob3B0aW9uc1snbmF0aXZlJyArIHRyYWNrICsgJ1RyYWNrcyddID09PSBmYWxzZSkgewogICAgICAgIF90aGlzWydmZWF0dXJlc05hdGl2ZScgKyB0cmFjayArICdUcmFja3MnXSA9IGZhbHNlOwogICAgICB9CiAgICB9KTsKCiAgICBpZiAob3B0aW9ucy5uYXRpdmVDYXB0aW9ucyA9PT0gZmFsc2UgfHwgb3B0aW9ucy5uYXRpdmVUZXh0VHJhY2tzID09PSBmYWxzZSkgewogICAgICBfdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgPSBmYWxzZTsKICAgIH0gZWxzZSBpZiAob3B0aW9ucy5uYXRpdmVDYXB0aW9ucyA9PT0gdHJ1ZSB8fCBvcHRpb25zLm5hdGl2ZVRleHRUcmFja3MgPT09IHRydWUpIHsKICAgICAgX3RoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoIV90aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykgewogICAgICBfdGhpcy5lbXVsYXRlVGV4dFRyYWNrcygpOwogICAgfQoKICAgIF90aGlzLmF1dG9SZW1vdGVUZXh0VHJhY2tzXyA9IG5ldyBBTEwudGV4dC5MaXN0Q2xhc3MoKTsKCiAgICBfdGhpcy5pbml0VHJhY2tMaXN0ZW5lcnMoKTsKCiAgICAvLyBUdXJuIG9uIGNvbXBvbmVudCB0YXAgZXZlbnRzIG9ubHkgaWYgbm90IHVzaW5nIG5hdGl2ZSBjb250cm9scwogICAgaWYgKCFvcHRpb25zLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2gpIHsKICAgICAgX3RoaXMuZW1pdFRhcEV2ZW50cygpOwogICAgfQoKICAgIGlmIChfdGhpcy5jb25zdHJ1Y3RvcikgewogICAgICBfdGhpcy5uYW1lXyA9IF90aGlzLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ1Vua25vd24gVGVjaCc7CiAgICB9CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKiBGYWxsYmFja3MgZm9yIHVuc3VwcG9ydGVkIGV2ZW50IHR5cGVzCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCiAgLyoqCiAgICogUG9seWZpbGwgdGhlIGBwcm9ncmVzc2AgZXZlbnQgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCBuYXRpdmVseS4KICAgKgogICAqIEBzZWUge0BsaW5rIFRlY2gjdHJhY2tQcm9ncmVzc30KICAgKi8KCgogIFRlY2gucHJvdG90eXBlLm1hbnVhbFByb2dyZXNzT24gPSBmdW5jdGlvbiBtYW51YWxQcm9ncmVzc09uKCkgewogICAgdGhpcy5vbignZHVyYXRpb25jaGFuZ2UnLCB0aGlzLm9uRHVyYXRpb25DaGFuZ2UpOwoKICAgIHRoaXMubWFudWFsUHJvZ3Jlc3MgPSB0cnVlOwoKICAgIC8vIFRyaWdnZXIgcHJvZ3Jlc3Mgd2F0Y2hpbmcgd2hlbiBhIHNvdXJjZSBiZWdpbnMgbG9hZGluZwogICAgdGhpcy5vbmUoJ3JlYWR5JywgdGhpcy50cmFja1Byb2dyZXNzKTsKICB9OwoKICAvKioKICAgKiBUdXJuIG9mZiB0aGUgcG9seWZpbGwgZm9yIGBwcm9ncmVzc2AgZXZlbnRzIHRoYXQgd2FzIGNyZWF0ZWQgaW4KICAgKiB7QGxpbmsgVGVjaCNtYW51YWxQcm9ncmVzc09ufQogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUubWFudWFsUHJvZ3Jlc3NPZmYgPSBmdW5jdGlvbiBtYW51YWxQcm9ncmVzc09mZigpIHsKICAgIHRoaXMubWFudWFsUHJvZ3Jlc3MgPSBmYWxzZTsKICAgIHRoaXMuc3RvcFRyYWNraW5nUHJvZ3Jlc3MoKTsKCiAgICB0aGlzLm9mZignZHVyYXRpb25jaGFuZ2UnLCB0aGlzLm9uRHVyYXRpb25DaGFuZ2UpOwogIH07CgogIC8qKgogICAqIFRoaXMgaXMgdXNlZCB0byB0cmlnZ2VyIGEgYHByb2dyZXNzYCBldmVudCB3aGVuIHRoZSBidWZmZXJlZCBwZXJjZW50IGNoYW5nZXMuIEl0CiAgICogc2V0cyBhbiBpbnRlcnZhbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IDUwMCBtaWxsaXNlY29uZHMgdG8gY2hlY2sgaWYgdGhlCiAgICogYnVmZmVyIGVuZCBwZXJjZW50IGhhcyBjaGFuZ2VkLgogICAqCiAgICogPiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB7QGxpbmsgVGVjaCNtYW51YWxQcm9ncmVzc09ufQogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGByZWFkeWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBUZWNoI3JlYWR5CiAgICogQGZpcmVzIFRlY2gjcHJvZ3Jlc3MKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLnRyYWNrUHJvZ3Jlc3MgPSBmdW5jdGlvbiB0cmFja1Byb2dyZXNzKGV2ZW50KSB7CiAgICB0aGlzLnN0b3BUcmFja2luZ1Byb2dyZXNzKCk7CiAgICB0aGlzLnByb2dyZXNzSW50ZXJ2YWwgPSB0aGlzLnNldEludGVydmFsKGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAvLyBEb24ndCB0cmlnZ2VyIHVubGVzcyBidWZmZXJlZCBhbW91bnQgaXMgZ3JlYXRlciB0aGFuIGxhc3QgdGltZQoKICAgICAgdmFyIG51bUJ1ZmZlcmVkUGVyY2VudCA9IHRoaXMuYnVmZmVyZWRQZXJjZW50KCk7CgogICAgICBpZiAodGhpcy5idWZmZXJlZFBlcmNlbnRfICE9PSBudW1CdWZmZXJlZFBlcmNlbnQpIHsKICAgICAgICAvKioKICAgICAgICAgKiBTZWUge0BsaW5rIFBsYXllciNwcm9ncmVzc30KICAgICAgICAgKgogICAgICAgICAqIEBldmVudCBUZWNoI3Byb2dyZXNzCiAgICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgICAqLwogICAgICAgIHRoaXMudHJpZ2dlcigncHJvZ3Jlc3MnKTsKICAgICAgfQoKICAgICAgdGhpcy5idWZmZXJlZFBlcmNlbnRfID0gbnVtQnVmZmVyZWRQZXJjZW50OwoKICAgICAgaWYgKG51bUJ1ZmZlcmVkUGVyY2VudCA9PT0gMSkgewogICAgICAgIHRoaXMuc3RvcFRyYWNraW5nUHJvZ3Jlc3MoKTsKICAgICAgfQogICAgfSksIDUwMCk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlIG91ciBpbnRlcm5hbCBkdXJhdGlvbiBvbiBhIGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgYnkgY2FsbGluZwogICAqIHtAbGluayBUZWNoI2R1cmF0aW9ufS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgVGVjaCNkdXJhdGlvbmNoYW5nZQogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUub25EdXJhdGlvbkNoYW5nZSA9IGZ1bmN0aW9uIG9uRHVyYXRpb25DaGFuZ2UoZXZlbnQpIHsKICAgIHRoaXMuZHVyYXRpb25fID0gdGhpcy5kdXJhdGlvbigpOwogIH07CgogIC8qKgogICAqIEdldCBhbmQgY3JlYXRlIGEgYFRpbWVSYW5nZWAgb2JqZWN0IGZvciBidWZmZXJpbmcuCiAgICoKICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2V9CiAgICogICAgICAgICBUaGUgdGltZSByYW5nZSBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KCgogIFRlY2gucHJvdG90eXBlLmJ1ZmZlcmVkID0gZnVuY3Rpb24gYnVmZmVyZWQoKSB7CiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlcygwLCAwKTsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cnJlbnQgdmlkZW8gdGhhdCBpcyBjdXJyZW50bHkgYnVmZmVyZWQuCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBBIG51bWJlciBmcm9tIDAgdG8gMSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlY2ltYWwgcGVyY2VudGFnZSBvZiB0aGUKICAgKiAgICAgICAgIHZpZGVvIHRoYXQgaXMgYnVmZmVyZWQuCiAgICoKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLmJ1ZmZlcmVkUGVyY2VudCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkUGVyY2VudCQkMSgpIHsKICAgIHJldHVybiBidWZmZXJlZFBlcmNlbnQodGhpcy5idWZmZXJlZCgpLCB0aGlzLmR1cmF0aW9uXyk7CiAgfTsKCiAgLyoqCiAgICogVHVybiBvZmYgdGhlIHBvbHlmaWxsIGZvciBgcHJvZ3Jlc3NgIGV2ZW50cyB0aGF0IHdhcyBjcmVhdGVkIGluCiAgICoge0BsaW5rIFRlY2gjbWFudWFsUHJvZ3Jlc3NPbn0KICAgKiBTdG9wIG1hbnVhbGx5IHRyYWNraW5nIHByb2dyZXNzIGV2ZW50cyBieSBjbGVhcmluZyB0aGUgaW50ZXJ2YWwgdGhhdCB3YXMgc2V0IGluCiAgICoge0BsaW5rIFRlY2gjdHJhY2tQcm9ncmVzc30uCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5zdG9wVHJhY2tpbmdQcm9ncmVzcyA9IGZ1bmN0aW9uIHN0b3BUcmFja2luZ1Byb2dyZXNzKCkgewogICAgdGhpcy5jbGVhckludGVydmFsKHRoaXMucHJvZ3Jlc3NJbnRlcnZhbCk7CiAgfTsKCiAgLyoqCiAgICogUG9seWZpbGwgdGhlIGB0aW1ldXBkYXRlYCBldmVudCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LgogICAqCiAgICogQHNlZSB7QGxpbmsgVGVjaCN0cmFja0N1cnJlbnRUaW1lfQogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUubWFudWFsVGltZVVwZGF0ZXNPbiA9IGZ1bmN0aW9uIG1hbnVhbFRpbWVVcGRhdGVzT24oKSB7CiAgICB0aGlzLm1hbnVhbFRpbWVVcGRhdGVzID0gdHJ1ZTsKCiAgICB0aGlzLm9uKCdwbGF5JywgdGhpcy50cmFja0N1cnJlbnRUaW1lKTsKICAgIHRoaXMub24oJ3BhdXNlJywgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSk7CiAgfTsKCiAgLyoqCiAgICogVHVybiBvZmYgdGhlIHBvbHlmaWxsIGZvciBgdGltZXVwZGF0ZWAgZXZlbnRzIHRoYXQgd2FzIGNyZWF0ZWQgaW4KICAgKiB7QGxpbmsgVGVjaCNtYW51YWxUaW1lVXBkYXRlc09ufQogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUubWFudWFsVGltZVVwZGF0ZXNPZmYgPSBmdW5jdGlvbiBtYW51YWxUaW1lVXBkYXRlc09mZigpIHsKICAgIHRoaXMubWFudWFsVGltZVVwZGF0ZXMgPSBmYWxzZTsKICAgIHRoaXMuc3RvcFRyYWNraW5nQ3VycmVudFRpbWUoKTsKICAgIHRoaXMub2ZmKCdwbGF5JywgdGhpcy50cmFja0N1cnJlbnRUaW1lKTsKICAgIHRoaXMub2ZmKCdwYXVzZScsIHRoaXMuc3RvcFRyYWNraW5nQ3VycmVudFRpbWUpOwogIH07CgogIC8qKgogICAqIFNldHMgdXAgYW4gaW50ZXJ2YWwgZnVuY3Rpb24gdG8gdHJhY2sgY3VycmVudCB0aW1lIGFuZCB0cmlnZ2VyIGB0aW1ldXBkYXRlYCBldmVyeQogICAqIDI1MCBtaWxsaXNlY29uZHMuCiAgICoKICAgKiBAbGlzdGVucyBUZWNoI3BsYXkKICAgKiBAdHJpZ2dlcnMgVGVjaCN0aW1ldXBkYXRlCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS50cmFja0N1cnJlbnRUaW1lID0gZnVuY3Rpb24gdHJhY2tDdXJyZW50VGltZSgpIHsKICAgIGlmICh0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwpIHsKICAgICAgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpOwogICAgfQogICAgdGhpcy5jdXJyZW50VGltZUludGVydmFsID0gdGhpcy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgIC8qKgogICAgICAgKiBUcmlnZ2VyZWQgYXQgYW4gaW50ZXJ2YWwgb2YgMjUwbXMgdG8gaW5kaWNhdGVkIHRoYXQgdGltZSBpcyBwYXNzaW5nIGluIHRoZSB2aWRlby4KICAgICAgICoKICAgICAgICogQGV2ZW50IFRlY2gjdGltZXVwZGF0ZQogICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7CgogICAgICAvLyA0MiA9IDI0IGZwcyAvLyAyNTAgaXMgd2hhdCBXZWJraXQgdXNlcyAvLyBGRiB1c2VzIDE1CiAgICB9LCAyNTApOwogIH07CgogIC8qKgogICAqIFN0b3AgdGhlIGludGVydmFsIGZ1bmN0aW9uIGNyZWF0ZWQgaW4ge0BsaW5rIFRlY2gjdHJhY2tDdXJyZW50VGltZX0gc28gdGhhdCB0aGUKICAgKiBgdGltZXVwZGF0ZWAgZXZlbnQgaXMgbm8gbG9uZ2VyIHRyaWdnZXJlZC4KICAgKgogICAqIEBsaXN0ZW5zIHtUZWNoI3BhdXNlfQogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUuc3RvcFRyYWNraW5nQ3VycmVudFRpbWUgPSBmdW5jdGlvbiBzdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpIHsKICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwpOwoKICAgIC8vICMxMDAyIC0gaWYgdGhlIHZpZGVvIGVuZHMgcmlnaHQgYmVmb3JlIHRoZSBuZXh0IHRpbWV1cGRhdGUgd291bGQgaGFwcGVuLAogICAgLy8gdGhlIHByb2dyZXNzIGJhciB3b24ndCBtYWtlIGl0IGFsbCB0aGUgd2F5IHRvIHRoZSBlbmQKICAgIHRoaXMudHJpZ2dlcih7IHR5cGU6ICd0aW1ldXBkYXRlJywgdGFyZ2V0OiB0aGlzLCBtYW51YWxseVRyaWdnZXJlZDogdHJ1ZSB9KTsKICB9OwoKICAvKioKICAgKiBUdXJuIG9mZiBhbGwgZXZlbnQgcG9seWZpbGxzLCBjbGVhciB0aGUgYFRlY2hgcyB7QGxpbmsgQXVkaW9UcmFja0xpc3R9LAogICAqIHtAbGluayBWaWRlb1RyYWNrTGlzdH0sIGFuZCB7QGxpbmsgVGV4dFRyYWNrTGlzdH0sIGFuZCBkaXNwb3NlIG9mIHRoaXMgVGVjaC4KICAgKgogICAqIEBmaXJlcyBDb21wb25lbnQjZGlzcG9zZQogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CgogICAgLy8gY2xlYXIgb3V0IGFsbCB0cmFja3MgYmVjYXVzZSB3ZSBjYW4ndCByZXVzZSB0aGVtIGJldHdlZW4gdGVjaHMKICAgIHRoaXMuY2xlYXJUcmFja3MoTk9STUFMLm5hbWVzKTsKCiAgICAvLyBUdXJuIG9mZiBhbnkgbWFudWFsIHByb2dyZXNzIG9yIHRpbWV1cGRhdGUgdHJhY2tpbmcKICAgIGlmICh0aGlzLm1hbnVhbFByb2dyZXNzKSB7CiAgICAgIHRoaXMubWFudWFsUHJvZ3Jlc3NPZmYoKTsKICAgIH0KCiAgICBpZiAodGhpcy5tYW51YWxUaW1lVXBkYXRlcykgewogICAgICB0aGlzLm1hbnVhbFRpbWVVcGRhdGVzT2ZmKCk7CiAgICB9CgogICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENsZWFyIG91dCBhIHNpbmdsZSBgVHJhY2tMaXN0YCBvciBhbiBhcnJheSBvZiBgVHJhY2tMaXN0c2AgZ2l2ZW4gdGhlaXIgbmFtZXMuCiAgICoKICAgKiA+IE5vdGU6IFRlY2hzIHdpdGhvdXQgc291cmNlIGhhbmRsZXJzIHNob3VsZCBjYWxsIHRoaXMgYmV0d2VlbiBzb3VyY2VzIGZvciBgdmlkZW9gCiAgICogICAgICAgICAmIGBhdWRpb2AgdHJhY2tzLiBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlbSBiZXR3ZWVuIHRyYWNrcyEKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nW118c3RyaW5nfSB0eXBlcwogICAqICAgICAgICBUcmFja0xpc3QgbmFtZXMgdG8gY2xlYXIsIHZhbGlkIG5hbWVzIGFyZSBgdmlkZW9gLCBgYXVkaW9gLCBhbmQKICAgKiAgICAgICAgYHRleHRgLgogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUuY2xlYXJUcmFja3MgPSBmdW5jdGlvbiBjbGVhclRyYWNrcyh0eXBlcykgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgdHlwZXMgPSBbXS5jb25jYXQodHlwZXMpOwogICAgLy8gY2xlYXIgb3V0IGFsbCB0cmFja3MgYmVjYXVzZSB3ZSBjYW4ndCByZXVzZSB0aGVtIGJldHdlZW4gdGVjaHMKICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgdmFyIGxpc3QgPSBfdGhpczJbdHlwZSArICdUcmFja3MnXSgpIHx8IFtdOwogICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoOwoKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIHZhciB0cmFjayA9IGxpc3RbaV07CgogICAgICAgIGlmICh0eXBlID09PSAndGV4dCcpIHsKICAgICAgICAgIF90aGlzMi5yZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spOwogICAgICAgIH0KICAgICAgICBsaXN0LnJlbW92ZVRyYWNrKHRyYWNrKTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogUmVtb3ZlIGFueSBUZXh0VHJhY2tzIGFkZGVkIHZpYSBhZGRSZW1vdGVUZXh0VHJhY2sgdGhhdCBhcmUKICAgKiBmbGFnZ2VkIGZvciBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5jbGVhbnVwQXV0b1RleHRUcmFja3MgPSBmdW5jdGlvbiBjbGVhbnVwQXV0b1RleHRUcmFja3MoKSB7CiAgICB2YXIgbGlzdCA9IHRoaXMuYXV0b1JlbW90ZVRleHRUcmFja3NfIHx8IFtdOwogICAgdmFyIGkgPSBsaXN0Lmxlbmd0aDsKCiAgICB3aGlsZSAoaS0tKSB7CiAgICAgIHZhciB0cmFjayA9IGxpc3RbaV07CgogICAgICB0aGlzLnJlbW92ZVJlbW90ZVRleHRUcmFjayh0cmFjayk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogUmVzZXQgdGhlIHRlY2gsIHdoaWNoIHdpbGwgcmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgcmVzZXQgdGhlIGludGVybmFsIHJlYWR5U3RhdGUuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7fTsKCiAgLyoqCiAgICogR2V0IG9yIHNldCBhbiBlcnJvciBvbiB0aGUgVGVjaC4KICAgKgogICAqIEBwYXJhbSB7TWVkaWFFcnJvcn0gW2Vycl0KICAgKiAgICAgICAgRXJyb3IgdG8gc2V0IG9uIHRoZSBUZWNoCiAgICoKICAgKiBAcmV0dXJuIHtNZWRpYUVycm9yfG51bGx9CiAgICogICAgICAgICBUaGUgY3VycmVudCBlcnJvciBvYmplY3Qgb24gdGhlIHRlY2gsIG9yIG51bGwgaWYgdGhlcmUgaXNuJ3Qgb25lLgogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihlcnIpIHsKICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLmVycm9yXyA9IG5ldyBNZWRpYUVycm9yKGVycik7CiAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmVycm9yXzsKICB9OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBgVGltZVJhbmdlYHMgdGhhdCBoYXZlIGJlZW4gcGxheWVkIHRocm91Z2ggZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4KICAgKgogICAqID4gTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvbXBsZXRlLiBJdCBkb2VzIG5vdCB0cmFjayB0aGUgcGxheWVkIGBUaW1lUmFuZ2VgLgogICAqICAgICAgICAgSXQgb25seSBjaGVja3Mgd2V0aGVyIHRoZSBzb3VyY2UgaGFzIHBsYXllZCBhdCBhbGwgb3Igbm90LgogICAqCiAgICogQHJldHVybiB7VGltZVJhbmdlfQogICAqICAgICAgICAgLSBBIHNpbmdsZSB0aW1lIHJhbmdlIGlmIHRoaXMgdmlkZW8gaGFzIHBsYXllZAogICAqICAgICAgICAgLSBBbiBlbXB0eSBzZXQgb2YgcmFuZ2VzIGlmIG5vdC4KICAgKi8KCgogIFRlY2gucHJvdG90eXBlLnBsYXllZCA9IGZ1bmN0aW9uIHBsYXllZCgpIHsKICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWRfKSB7CiAgICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzKDAsIDApOwogICAgfQogICAgcmV0dXJuIGNyZWF0ZVRpbWVSYW5nZXMoKTsKICB9OwoKICAvKioKICAgKiBDYXVzZXMgYSBtYW51YWwgdGltZSB1cGRhdGUgdG8gb2NjdXIgaWYge0BsaW5rIFRlY2gjbWFudWFsVGltZVVwZGF0ZXNPbn0gd2FzCiAgICogcHJldmlvdXNseSBjYWxsZWQuCiAgICoKICAgKiBAZmlyZXMgVGVjaCN0aW1ldXBkYXRlCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5zZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uIHNldEN1cnJlbnRUaW1lKCkgewogICAgLy8gaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgbWFudWFsIHRpbWV1cGRhdGVzCiAgICBpZiAodGhpcy5tYW51YWxUaW1lVXBkYXRlcykgewogICAgICAvKioKICAgICAgICogQSBtYW51YWwgYHRpbWV1cGRhdGVgIGV2ZW50LgogICAgICAgKgogICAgICAgKiBAZXZlbnQgVGVjaCN0aW1ldXBkYXRlCiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICovCiAgICAgIHRoaXMudHJpZ2dlcih7IHR5cGU6ICd0aW1ldXBkYXRlJywgdGFyZ2V0OiB0aGlzLCBtYW51YWxseVRyaWdnZXJlZDogdHJ1ZSB9KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBUdXJuIG9uIGxpc3RlbmVycyBmb3Ige0BsaW5rIFZpZGVvVHJhY2tMaXN0fSwge0BsaW5rIHtBdWRpb1RyYWNrTGlzdH0sIGFuZAogICAqIHtAbGluayBUZXh0VHJhY2tMaXN0fSBldmVudHMuCiAgICoKICAgKiBUaGlzIGFkZHMge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJzfSBmb3IgYGFkZHRyYWNrYCwgYW5kICBgcmVtb3ZldHJhY2tgLgogICAqCiAgICogQGZpcmVzIFRlY2gjYXVkaW90cmFja2NoYW5nZQogICAqIEBmaXJlcyBUZWNoI3ZpZGVvdHJhY2tjaGFuZ2UKICAgKiBAZmlyZXMgVGVjaCN0ZXh0dHJhY2tjaGFuZ2UKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLmluaXRUcmFja0xpc3RlbmVycyA9IGZ1bmN0aW9uIGluaXRUcmFja0xpc3RlbmVycygpIHsKICAgIHZhciBfdGhpczMgPSB0aGlzOwoKICAgIC8qKgogICAgICogVHJpZ2dlcmVkIHdoZW4gdHJhY2tzIGFyZSBhZGRlZCBvciByZW1vdmVkIG9uIHRoZSBUZWNoIHtAbGluayBBdWRpb1RyYWNrTGlzdH0KICAgICAqCiAgICAgKiBAZXZlbnQgVGVjaCNhdWRpb3RyYWNrY2hhbmdlCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KCiAgICAvKioKICAgICAqIFRyaWdnZXJlZCB3aGVuIHRyYWNrcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBvbiB0aGUgVGVjaCB7QGxpbmsgVmlkZW9UcmFja0xpc3R9CiAgICAgKgogICAgICogQGV2ZW50IFRlY2gjdmlkZW90cmFja2NoYW5nZQogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCgogICAgLyoqCiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0cmFja3MgYXJlIGFkZGVkIG9yIHJlbW92ZWQgb24gdGhlIFRlY2gge0BsaW5rIFRleHRUcmFja0xpc3R9CiAgICAgKgogICAgICogQGV2ZW50IFRlY2gjdGV4dHRyYWNrY2hhbmdlCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIE5PUk1BTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBwcm9wcyA9IE5PUk1BTFtuYW1lXTsKICAgICAgdmFyIHRyYWNrTGlzdENoYW5nZXMgPSBmdW5jdGlvbiB0cmFja0xpc3RDaGFuZ2VzKCkgewogICAgICAgIF90aGlzMy50cmlnZ2VyKG5hbWUgKyAndHJhY2tjaGFuZ2UnKTsKICAgICAgfTsKCiAgICAgIHZhciB0cmFja3MgPSBfdGhpczNbcHJvcHMuZ2V0dGVyTmFtZV0oKTsKCiAgICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHRyYWNrTGlzdENoYW5nZXMpOwogICAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB0cmFja0xpc3RDaGFuZ2VzKTsKCiAgICAgIF90aGlzMy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB0cmFja0xpc3RDaGFuZ2VzKTsKICAgICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB0cmFja0xpc3RDaGFuZ2VzKTsKICAgICAgfSk7CiAgICB9KTsKICB9OwoKICAvKioKICAgKiBFbXVsYXRlIFRleHRUcmFja3MgdXNpbmcgdnR0LmpzIGlmIG5lY2Vzc2FyeQogICAqCiAgICogQGZpcmVzIFRlY2gjdnR0anNsb2FkZWQKICAgKiBAZmlyZXMgVGVjaCN2dHRqc2Vycm9yCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5hZGRXZWJWdHRTY3JpcHRfID0gZnVuY3Rpb24gYWRkV2ViVnR0U2NyaXB0XygpIHsKICAgIHZhciBfdGhpczQgPSB0aGlzOwoKICAgIGlmICh3aW5kb3dfMS5XZWJWVFQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEluaXRpYWxseSwgVGVjaC5lbF8gaXMgYSBjaGlsZCBvZiBhIGR1bW15LWRpdiB3YWl0IHVudGlsIHRoZSBDb21wb25lbnQgc3lzdGVtCiAgICAvLyBzaWduYWxzIHRoYXQgdGhlIFRlY2ggaXMgcmVhZHkgYXQgd2hpY2ggcG9pbnQgVGVjaC5lbF8gaXMgcGFydCBvZiB0aGUgRE9NCiAgICAvLyBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBXZWJWVFQgc2NyaXB0CiAgICBpZiAoZG9jdW1lbnRfMS5ib2R5LmNvbnRhaW5zKHRoaXMuZWwoKSkpIHsKCiAgICAgIC8vIGxvYWQgdmlhIHJlcXVpcmUgaWYgYXZhaWxhYmxlIGFuZCB2dHQuanMgc2NyaXB0IGxvY2F0aW9uIHdhcyBub3QgcGFzc2VkIGluCiAgICAgIC8vIGFzIGFuIG9wdGlvbi4gbm92dHQgYnVpbGRzIHdpbGwgdHVybiB0aGUgYWJvdmUgcmVxdWlyZSBjYWxsIGludG8gYW4gZW1wdHkgb2JqZWN0CiAgICAgIC8vIHdoaWNoIHdpbGwgY2F1c2UgdGhpcyBpZiBjaGVjayB0byBhbHdheXMgZmFpbC4KICAgICAgaWYgKCF0aGlzLm9wdGlvbnNfWyd2dHQuanMnXSAmJiBpc1BsYWluKGJyb3dzZXJJbmRleCkgJiYgT2JqZWN0LmtleXMoYnJvd3NlckluZGV4KS5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy50cmlnZ2VyKCd2dHRqc2xvYWRlZCcpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgLy8gbG9hZCB2dHQuanMgdmlhIHRoZSBzY3JpcHQgbG9jYXRpb24gb3B0aW9uIG9yIHRoZSBjZG4gb2Ygbm8gbG9jYXRpb24gd2FzCiAgICAgIC8vIHBhc3NlZCBpbgogICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKCiAgICAgIHNjcmlwdC5zcmMgPSB0aGlzLm9wdGlvbnNfWyd2dHQuanMnXSB8fCAnaHR0cHM6Ly92anMuemVuY2RuLm5ldC92dHRqcy8wLjEyLjQvdnR0Lm1pbi5qcyc7CiAgICAgIHNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiB2dHQuanMgaXMgbG9hZGVkLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IFRlY2gjdnR0anNsb2FkZWQKICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAgICovCiAgICAgICAgX3RoaXM0LnRyaWdnZXIoJ3Z0dGpzbG9hZGVkJyk7CiAgICAgIH07CiAgICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gdnR0LmpzIHdhcyBub3QgbG9hZGVkIGR1ZSB0byBhbiBlcnJvcgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IFRlY2gjdnR0anNsb2FkZWQKICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAgICovCiAgICAgICAgX3RoaXM0LnRyaWdnZXIoJ3Z0dGpzZXJyb3InKTsKICAgICAgfTsKICAgICAgdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzY3JpcHQub25sb2FkID0gbnVsbDsKICAgICAgICBzY3JpcHQub25lcnJvciA9IG51bGw7CiAgICAgIH0pOwogICAgICAvLyBidXQgaGF2ZSBub3QgbG9hZGVkIHlldCBhbmQgd2Ugc2V0IGl0IHRvIHRydWUgYmVmb3JlIHRoZSBpbmplY3Qgc28gdGhhdAogICAgICAvLyB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGluamVjdGVkIHdpbmRvdy5XZWJWVFQgaWYgaXQgbG9hZHMgcmlnaHQgYXdheQogICAgICB3aW5kb3dfMS5XZWJWVFQgPSB0cnVlOwogICAgICB0aGlzLmVsKCkucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZWFkeSh0aGlzLmFkZFdlYlZ0dFNjcmlwdF8pOwogICAgfQogIH07CgogIC8qKgogICAqIEVtdWxhdGUgdGV4dHRyYWNrcwogICAqCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5lbXVsYXRlVGV4dFRyYWNrcyA9IGZ1bmN0aW9uIGVtdWxhdGVUZXh0VHJhY2tzKCkgewogICAgdmFyIF90aGlzNSA9IHRoaXM7CgogICAgdmFyIHRyYWNrcyA9IHRoaXMudGV4dFRyYWNrcygpOwogICAgdmFyIHJlbW90ZVRyYWNrcyA9IHRoaXMucmVtb3RlVGV4dFRyYWNrcygpOwogICAgdmFyIGhhbmRsZUFkZFRyYWNrID0gZnVuY3Rpb24gaGFuZGxlQWRkVHJhY2soZSkgewogICAgICByZXR1cm4gdHJhY2tzLmFkZFRyYWNrKGUudHJhY2spOwogICAgfTsKICAgIHZhciBoYW5kbGVSZW1vdmVUcmFjayA9IGZ1bmN0aW9uIGhhbmRsZVJlbW92ZVRyYWNrKGUpIHsKICAgICAgcmV0dXJuIHRyYWNrcy5yZW1vdmVUcmFjayhlLnRyYWNrKTsKICAgIH07CgogICAgcmVtb3RlVHJhY2tzLm9uKCdhZGR0cmFjaycsIGhhbmRsZUFkZFRyYWNrKTsKICAgIHJlbW90ZVRyYWNrcy5vbigncmVtb3ZldHJhY2snLCBoYW5kbGVSZW1vdmVUcmFjayk7CgogICAgdGhpcy5hZGRXZWJWdHRTY3JpcHRfKCk7CgogICAgdmFyIHVwZGF0ZURpc3BsYXkgPSBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5KCkgewogICAgICByZXR1cm4gX3RoaXM1LnRyaWdnZXIoJ3RleHR0cmFja2NoYW5nZScpOwogICAgfTsKCiAgICB2YXIgdGV4dFRyYWNrc0NoYW5nZXMgPSBmdW5jdGlvbiB0ZXh0VHJhY2tzQ2hhbmdlcygpIHsKICAgICAgdXBkYXRlRGlzcGxheSgpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07CgogICAgICAgIHRyYWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIHVwZGF0ZURpc3BsYXkpOwogICAgICAgIGlmICh0cmFjay5tb2RlID09PSAnc2hvd2luZycpIHsKICAgICAgICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIHVwZGF0ZURpc3BsYXkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICB0ZXh0VHJhY2tzQ2hhbmdlcygpOwogICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRleHRUcmFja3NDaGFuZ2VzKTsKICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRleHRUcmFja3NDaGFuZ2VzKTsKICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHRleHRUcmFja3NDaGFuZ2VzKTsKCiAgICB0aGlzLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKCkgewogICAgICByZW1vdGVUcmFja3Mub2ZmKCdhZGR0cmFjaycsIGhhbmRsZUFkZFRyYWNrKTsKICAgICAgcmVtb3RlVHJhY2tzLm9mZigncmVtb3ZldHJhY2snLCBoYW5kbGVSZW1vdmVUcmFjayk7CiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7CiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRleHRUcmFja3NDaGFuZ2VzKTsKICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdGV4dFRyYWNrc0NoYW5nZXMpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07CgogICAgICAgIHRyYWNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2N1ZWNoYW5nZScsIHVwZGF0ZURpc3BsYXkpOwogICAgICB9CiAgICB9KTsKICB9OwoKICAvKioKICAgKiBDcmVhdGUgYW5kIHJldHVybnMgYSByZW1vdGUge0BsaW5rIFRleHRUcmFja30gb2JqZWN0LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQKICAgKiAgICAgICAgYFRleHRUcmFja2Aga2luZCAoc3VidGl0bGVzLCBjYXB0aW9ucywgZGVzY3JpcHRpb25zLCBjaGFwdGVycywgb3IgbWV0YWRhdGEpCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXQogICAqICAgICAgICBMYWJlbCB0byBpZGVudGlmeSB0aGUgdGV4dCB0cmFjawogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZV0KICAgKiAgICAgICAgVHdvIGxldHRlciBsYW5ndWFnZSBhYmJyZXZpYXRpb24KICAgKgogICAqIEByZXR1cm4ge1RleHRUcmFja30KICAgKiAgICAgICAgIFRoZSBUZXh0VHJhY2sgdGhhdCBnZXRzIGNyZWF0ZWQuCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5hZGRUZXh0VHJhY2sgPSBmdW5jdGlvbiBhZGRUZXh0VHJhY2soa2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7CiAgICBpZiAoIWtpbmQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0VHJhY2sga2luZCBpcyByZXF1aXJlZCBidXQgd2FzIG5vdCBwcm92aWRlZCcpOwogICAgfQoKICAgIHJldHVybiBjcmVhdGVUcmFja0hlbHBlcih0aGlzLCBraW5kLCBsYWJlbCwgbGFuZ3VhZ2UpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBhbiBlbXVsYXRlZCBUZXh0VHJhY2sgZm9yIHVzZSBieSBhZGRSZW1vdGVUZXh0VHJhY2sKICAgKgogICAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tCiAgICogVGVjaCBpbiBvcmRlciB0byBjcmVhdGUgbmF0aXZlIG9yIGN1c3RvbSBUZXh0VHJhY2tzLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgKiAgICAgICAgVGhlIG9iamVjdCBzaG91bGQgY29udGFpbiB0aGUgb3B0aW9ucyB0byBpbml0aWFsaXplIHRoZSBUZXh0VHJhY2sgd2l0aC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5raW5kXQogICAqICAgICAgICBgVGV4dFRyYWNrYCBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnMsIGNoYXB0ZXJzLCBvciBtZXRhZGF0YSkuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdLgogICAqICAgICAgICBMYWJlbCB0byBpZGVudGlmeSB0aGUgdGV4dCB0cmFjawogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhbmd1YWdlXQogICAqICAgICAgICBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvbi4KICAgKgogICAqIEByZXR1cm4ge0hUTUxUcmFja0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgdHJhY2sgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC4KICAgKi8KCgogIFRlY2gucHJvdG90eXBlLmNyZWF0ZVJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZVRleHRUcmFjayhvcHRpb25zKSB7CiAgICB2YXIgdHJhY2sgPSBtZXJnZU9wdGlvbnMob3B0aW9ucywgewogICAgICB0ZWNoOiB0aGlzCiAgICB9KTsKCiAgICByZXR1cm4gbmV3IFJFTU9URS5yZW1vdGVUZXh0RWwuVHJhY2tDbGFzcyh0cmFjayk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhbiBodG1sIHRyYWNrIGVsZW1lbnQuCiAgICoKICAgKiA+IE5vdGU6IFRoaXMgY2FuIGJlIGFuIGVtdWxhdGVkIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fSBvciBhIG5hdGl2ZSBvbmUuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAqICAgICAgICBTZWUge0BsaW5rIFRlY2gjY3JlYXRlUmVtb3RlVGV4dFRyYWNrfSBmb3IgbW9yZSBkZXRhaWxlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbbWFudWFsQ2xlYW51cD10cnVlXQogICAqICAgICAgICAtIFdoZW4gZmFsc2U6IHRoZSBUZXh0VHJhY2sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgdmlkZW8KICAgKiAgICAgICAgICBlbGVtZW50IHdoZW5ldmVyIHRoZSBzb3VyY2UgY2hhbmdlcwogICAqICAgICAgICAtIFdoZW4gVHJ1ZTogVGhlIFRleHRUcmFjayB3aWxsIGhhdmUgdG8gYmUgY2xlYW5lZCB1cCBtYW51YWxseQogICAqCiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH0KICAgKiAgICAgICAgIEFuIEh0bWwgVHJhY2sgRWxlbWVudC4KICAgKgogICAqIEBkZXByZWNhdGVkIFRoZSBkZWZhdWx0IGZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBlcXVpdmFsZW50CiAgICogICAgICAgICAgICAgdG8gIm1hbnVhbENsZWFudXA9ZmFsc2UiIGluIHRoZSBmdXR1cmUuIFRoZSBtYW51YWxDbGVhbnVwIHBhcmFtZXRlciB3aWxsCiAgICogICAgICAgICAgICAgYWxzbyBiZSByZW1vdmVkLgogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUuYWRkUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gYWRkUmVtb3RlVGV4dFRyYWNrKCkgewogICAgdmFyIF90aGlzNiA9IHRoaXM7CgogICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9OwogICAgdmFyIG1hbnVhbENsZWFudXAgPSBhcmd1bWVudHNbMV07CgogICAgdmFyIGh0bWxUcmFja0VsZW1lbnQgPSB0aGlzLmNyZWF0ZVJlbW90ZVRleHRUcmFjayhvcHRpb25zKTsKCiAgICBpZiAobWFudWFsQ2xlYW51cCAhPT0gdHJ1ZSAmJiBtYW51YWxDbGVhbnVwICE9PSBmYWxzZSkgewogICAgICAvLyBkZXByZWNhdGlvbiB3YXJuaW5nCiAgICAgIGxvZyQxLndhcm4oJ0NhbGxpbmcgYWRkUmVtb3RlVGV4dFRyYWNrIHdpdGhvdXQgZXhwbGljaXRseSBzZXR0aW5nIHRoZSAibWFudWFsQ2xlYW51cCIgcGFyYW1ldGVyIHRvIGB0cnVlYCBpcyBkZXByZWNhdGVkIGFuZCBkZWZhdWx0IHRvIGBmYWxzZWAgaW4gZnV0dXJlIHZlcnNpb24gb2YgdmlkZW8uanMnKTsKICAgICAgbWFudWFsQ2xlYW51cCA9IHRydWU7CiAgICB9CgogICAgLy8gc3RvcmUgSFRNTFRyYWNrRWxlbWVudCBhbmQgVGV4dFRyYWNrIHRvIHJlbW90ZSBsaXN0CiAgICB0aGlzLnJlbW90ZVRleHRUcmFja0VscygpLmFkZFRyYWNrRWxlbWVudF8oaHRtbFRyYWNrRWxlbWVudCk7CiAgICB0aGlzLnJlbW90ZVRleHRUcmFja3MoKS5hZGRUcmFjayhodG1sVHJhY2tFbGVtZW50LnRyYWNrKTsKCiAgICBpZiAobWFudWFsQ2xlYW51cCAhPT0gdHJ1ZSkgewogICAgICAvLyBjcmVhdGUgdGhlIFRleHRUcmFja0xpc3QgaWYgaXQgZG9lc24ndCBleGlzdAogICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXM2LmF1dG9SZW1vdGVUZXh0VHJhY2tzXy5hZGRUcmFjayhodG1sVHJhY2tFbGVtZW50LnRyYWNrKTsKICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGh0bWxUcmFja0VsZW1lbnQ7CiAgfTsKCiAgLyoqCiAgICogUmVtb3ZlIGEgcmVtb3RlIHRleHQgdHJhY2sgZnJvbSB0aGUgcmVtb3RlIGBUZXh0VHJhY2tMaXN0YC4KICAgKgogICAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFjawogICAqICAgICAgICBgVGV4dFRyYWNrYCB0byByZW1vdmUgZnJvbSB0aGUgYFRleHRUcmFja0xpc3RgCiAgICovCgoKICBUZWNoLnByb3RvdHlwZS5yZW1vdmVSZW1vdGVUZXh0VHJhY2sgPSBmdW5jdGlvbiByZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spIHsKICAgIHZhciB0cmFja0VsZW1lbnQgPSB0aGlzLnJlbW90ZVRleHRUcmFja0VscygpLmdldFRyYWNrRWxlbWVudEJ5VHJhY2tfKHRyYWNrKTsKCiAgICAvLyByZW1vdmUgSFRNTFRyYWNrRWxlbWVudCBhbmQgVGV4dFRyYWNrIGZyb20gcmVtb3RlIGxpc3QKICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkucmVtb3ZlVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnQpOwogICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tzKCkucmVtb3ZlVHJhY2sodHJhY2spOwogICAgdGhpcy5hdXRvUmVtb3RlVGV4dFRyYWNrc18ucmVtb3ZlVHJhY2sodHJhY2spOwogIH07CgogIC8qKgogICAqIEdldHMgYXZhaWxhYmxlIG1lZGlhIHBsYXliYWNrIHF1YWxpdHkgbWV0cmljcyBhcyBzcGVjaWZpZWQgYnkgdGhlIFczQydzIE1lZGlhCiAgICogUGxheWJhY2sgUXVhbGl0eSBBUEkuCiAgICoKICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhLXBsYXliYWNrLXF1YWxpdHl9CiAgICoKICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICogICAgICAgICBBbiBvYmplY3Qgd2l0aCBzdXBwb3J0ZWQgbWVkaWEgcGxheWJhY2sgcXVhbGl0eSBtZXRyaWNzCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5ID0gZnVuY3Rpb24gZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKSB7CiAgICByZXR1cm4ge307CiAgfTsKCiAgLyoqCiAgICogQSBtZXRob2QgdG8gc2V0IGEgcG9zdGVyIGZyb20gYSBgVGVjaGAuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLnNldFBvc3RlciA9IGZ1bmN0aW9uIHNldFBvc3RlcigpIHt9OwoKICAvKioKICAgKiBBIG1ldGhvZCB0byBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSAncGxheXNpbmluZScgPHZpZGVvPiBhdHRyaWJ1dGUuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLnBsYXlzaW5saW5lID0gZnVuY3Rpb24gcGxheXNpbmxpbmUoKSB7fTsKCiAgLyoqCiAgICogQSBtZXRob2QgdG8gc2V0IG9yIHVuc2V0IHRoZSAncGxheXNpbmluZScgPHZpZGVvPiBhdHRyaWJ1dGUuCiAgICoKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIFRlY2gucHJvdG90eXBlLnNldFBsYXlzaW5saW5lID0gZnVuY3Rpb24gc2V0UGxheXNpbmxpbmUoKSB7fTsKCiAgLyoKICAgKiBDaGVjayBpZiB0aGUgdGVjaCBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4gbWltZS10eXBlLgogICAqCiAgICogVGhlIGJhc2UgdGVjaCBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlLCBidXQgc291cmNlIGhhbmRsZXJzIG1pZ2h0CiAgICogb3ZlcndyaXRlIHRoaXMuCiAgICoKICAgKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUKICAgKiAgICAgICAgIFRoZSBtaW1ldHlwZSB0byBjaGVjayBmb3Igc3VwcG9ydAogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgZW1wdHkgc3RyaW5nCiAgICoKICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTE1lZGlhRWxlbWVudC9jYW5QbGF5VHlwZX0KICAgKgogICAqIEBhYnN0cmFjdAogICAqLwoKCiAgVGVjaC5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiBjYW5QbGF5VHlwZSgpIHsKICAgIHJldHVybiAnJzsKICB9OwoKICAvKioKICAgKiBDaGVjayBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB0ZWNoLgogICAqCiAgICogVGhlIGJhc2UgdGVjaCBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlLCBidXQgc291cmNlIGhhbmRsZXJzIG1pZ2h0CiAgICogb3ZlcndyaXRlIHRoaXMuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZQogICAqICAgICAgICBUaGUgbWVkaWEgdHlwZSB0byBjaGVjawogICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgbmF0aXZlIHZpZGVvIGVsZW1lbnQncyByZXNwb25zZQogICAqLwoKCiAgVGVjaC5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uIGNhblBsYXlUeXBlKCkgewogICAgcmV0dXJuICcnOwogIH07CgogIC8qKgogICAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiBzb3VyY2UKICAgKiBAcGFyYW0ge09iamVjdH0gc3JjT2JqCiAgICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0CiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgKiAgICAgICAgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB0ZWNoCiAgICogQHJldHVybiB7c3RyaW5nfSAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKQogICAqLwoKCiAgVGVjaC5jYW5QbGF5U291cmNlID0gZnVuY3Rpb24gY2FuUGxheVNvdXJjZShzcmNPYmosIG9wdGlvbnMpIHsKICAgIHJldHVybiBUZWNoLmNhblBsYXlUeXBlKHNyY09iai50eXBlKTsKICB9OwoKICAvKgogICAqIFJldHVybiB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIFRlY2ggb3Igbm90LgogICAqIENhbiBiZSBwYXNzZWQgZWl0aGVyIGEgQ2xhc3MgbGlrZSBgSHRtbDVgIG9yIGEgaW5zdGFuY2UgbGlrZSBgcGxheWVyLnRlY2hfYAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXBvbmVudAogICAqICAgICAgICBUaGUgaXRlbSB0byBjaGVjawogICAqCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiAgICAgICAgIFdoZXRoZXIgaXQgaXMgYSB0ZWNoIG9yIG5vdAogICAqICAgICAgICAgLSBUcnVlIGlmIGl0IGlzIGEgdGVjaAogICAqICAgICAgICAgLSBGYWxzZSBpZiBpdCBpcyBub3QKICAgKi8KCgogIFRlY2guaXNUZWNoID0gZnVuY3Rpb24gaXNUZWNoKGNvbXBvbmVudCkgewogICAgcmV0dXJuIGNvbXBvbmVudC5wcm90b3R5cGUgaW5zdGFuY2VvZiBUZWNoIHx8IGNvbXBvbmVudCBpbnN0YW5jZW9mIFRlY2ggfHwgY29tcG9uZW50ID09PSBUZWNoOwogIH07CgogIC8qKgogICAqIFJlZ2lzdGVycyBhIGBUZWNoYCBpbnRvIGEgc2hhcmVkIGxpc3QgZm9yIHZpZGVvanMuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogICAqICAgICAgICBOYW1lIG9mIHRoZSBgVGVjaGAgdG8gcmVnaXN0ZXIuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gdGVjaAogICAqICAgICAgICBUaGUgYFRlY2hgIGNsYXNzIHRvIHJlZ2lzdGVyLgogICAqLwoKCiAgVGVjaC5yZWdpc3RlclRlY2ggPSBmdW5jdGlvbiByZWdpc3RlclRlY2gobmFtZSwgdGVjaCkgewogICAgaWYgKCFUZWNoLnRlY2hzXykgewogICAgICBUZWNoLnRlY2hzXyA9IHt9OwogICAgfQoKICAgIGlmICghVGVjaC5pc1RlY2godGVjaCkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZWNoICcgKyBuYW1lICsgJyBtdXN0IGJlIGEgVGVjaCcpOwogICAgfQoKICAgIGlmICghVGVjaC5jYW5QbGF5VHlwZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RlY2hzIG11c3QgaGF2ZSBhIHN0YXRpYyBjYW5QbGF5VHlwZSBtZXRob2Qgb24gdGhlbScpOwogICAgfQogICAgaWYgKCFUZWNoLmNhblBsYXlTb3VyY2UpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZWNocyBtdXN0IGhhdmUgYSBzdGF0aWMgY2FuUGxheVNvdXJjZSBtZXRob2Qgb24gdGhlbScpOwogICAgfQoKICAgIG5hbWUgPSB0b1RpdGxlQ2FzZShuYW1lKTsKCiAgICBUZWNoLnRlY2hzX1tuYW1lXSA9IHRlY2g7CiAgICBpZiAobmFtZSAhPT0gJ1RlY2gnKSB7CiAgICAgIC8vIGNhbWVsIGNhc2UgdGhlIHRlY2hOYW1lIGZvciB1c2UgaW4gdGVjaE9yZGVyCiAgICAgIFRlY2guZGVmYXVsdFRlY2hPcmRlcl8ucHVzaChuYW1lKTsKICAgIH0KICAgIHJldHVybiB0ZWNoOwogIH07CgogIC8qKgogICAqIEdldCBhIGBUZWNoYCBmcm9tIHRoZSBzaGFyZWQgbGlzdCBieSBuYW1lLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKICAgKiAgICAgICAgYGNhbWVsQ2FzZWAgb3IgYFRpdGxlQ2FzZWAgbmFtZSBvZiB0aGUgVGVjaCB0byBnZXQKICAgKgogICAqIEByZXR1cm4ge1RlY2h8dW5kZWZpbmVkfQogICAqICAgICAgICAgVGhlIGBUZWNoYCBvciB1bmRlZmluZWQgaWYgdGhlcmUgd2FzIG5vIHRlY2ggd2l0aCB0aGUgbmFtZSByZXF1c3RlZC4KICAgKi8KCgogIFRlY2guZ2V0VGVjaCA9IGZ1bmN0aW9uIGdldFRlY2gobmFtZSkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBuYW1lID0gdG9UaXRsZUNhc2UobmFtZSk7CgogICAgaWYgKFRlY2gudGVjaHNfICYmIFRlY2gudGVjaHNfW25hbWVdKSB7CiAgICAgIHJldHVybiBUZWNoLnRlY2hzX1tuYW1lXTsKICAgIH0KCiAgICBpZiAod2luZG93XzEgJiYgd2luZG93XzEudmlkZW9qcyAmJiB3aW5kb3dfMS52aWRlb2pzW25hbWVdKSB7CiAgICAgIGxvZyQxLndhcm4oJ1RoZSAnICsgbmFtZSArICcgdGVjaCB3YXMgYWRkZWQgdG8gdGhlIHZpZGVvanMgb2JqZWN0IHdoZW4gaXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdmlkZW9qcy5yZWdpc3RlclRlY2gobmFtZSwgdGVjaCknKTsKICAgICAgcmV0dXJuIHdpbmRvd18xLnZpZGVvanNbbmFtZV07CiAgICB9CiAgfTsKCiAgcmV0dXJuIFRlY2g7Cn0oQ29tcG9uZW50KTsKCi8qKgogKiBHZXQgdGhlIHtAbGluayBWaWRlb1RyYWNrTGlzdH0KICoKICogQHJldHVybnMge1ZpZGVvVHJhY2tMaXN0fQogKiBAbWV0aG9kIFRlY2gucHJvdG90eXBlLnZpZGVvVHJhY2tzCiAqLwoKLyoqCiAqIEdldCB0aGUge0BsaW5rIEF1ZGlvVHJhY2tMaXN0fQogKgogKiBAcmV0dXJucyB7QXVkaW9UcmFja0xpc3R9CiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUuYXVkaW9UcmFja3MKICovCgovKioKICogR2V0IHRoZSB7QGxpbmsgVGV4dFRyYWNrTGlzdH0KICoKICogQHJldHVybnMge1RleHRUcmFja0xpc3R9CiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUudGV4dFRyYWNrcwogKi8KCi8qKgogKiBHZXQgdGhlIHJlbW90ZSBlbGVtZW50IHtAbGluayBUZXh0VHJhY2tMaXN0fQogKgogKiBAcmV0dXJucyB7VGV4dFRyYWNrTGlzdH0KICogQG1ldGhvZCBUZWNoLnByb3RvdHlwZS5yZW1vdGVUZXh0VHJhY2tzCiAqLwoKLyoqCiAqIEdldCB0aGUgcmVtb3RlIGVsZW1lbnQge0BsaW5rIEh0bWxUcmFja0VsZW1lbnRMaXN0fQogKgogKiBAcmV0dXJucyB7SHRtbFRyYWNrRWxlbWVudExpc3R9CiAqIEBtZXRob2QgVGVjaC5wcm90b3R5cGUucmVtb3RlVGV4dFRyYWNrRWxzCiAqLwoKQUxMLm5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICB2YXIgcHJvcHMgPSBBTExbbmFtZV07CgogIFRlY2gucHJvdG90eXBlW3Byb3BzLmdldHRlck5hbWVdID0gZnVuY3Rpb24gKCkgewogICAgdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gPSB0aGlzW3Byb3BzLnByaXZhdGVOYW1lXSB8fCBuZXcgcHJvcHMuTGlzdENsYXNzKCk7CiAgICByZXR1cm4gdGhpc1twcm9wcy5wcml2YXRlTmFtZV07CiAgfTsKfSk7CgovKioKICogTGlzdCBvZiBhc3NvY2lhdGVkIHRleHQgdHJhY2tzCiAqCiAqIEB0eXBlIHtUZXh0VHJhY2tMaXN0fQogKiBAcHJpdmF0ZQogKiBAcHJvcGVydHkgVGVjaCN0ZXh0VHJhY2tzXwogKi8KCi8qKgogKiBMaXN0IG9mIGFzc29jaWF0ZWQgYXVkaW8gdHJhY2tzLgogKgogKiBAdHlwZSB7QXVkaW9UcmFja0xpc3R9CiAqIEBwcml2YXRlCiAqIEBwcm9wZXJ0eSBUZWNoI2F1ZGlvVHJhY2tzXwogKi8KCi8qKgogKiBMaXN0IG9mIGFzc29jaWF0ZWQgdmlkZW8gdHJhY2tzLgogKgogKiBAdHlwZSB7VmlkZW9UcmFja0xpc3R9CiAqIEBwcml2YXRlCiAqIEBwcm9wZXJ0eSBUZWNoI3ZpZGVvVHJhY2tzXwogKi8KCi8qKgogKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgdm9sdW1lIGNvbnRyb2wuCiAqCiAqIEB0eXBlIHtib29sZWFufQogKiBAZGVmYXVsdAogKi8KVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNWb2x1bWVDb250cm9sID0gdHJ1ZTsKCi8qKgogKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydCBmdWxsc2NyZWVuIHJlc2l6ZSBjb250cm9sLgogKiBSZXNpemluZyBwbHVnaW5zIHVzaW5nIHJlcXVlc3QgZnVsbHNjcmVlbiByZWxvYWRzIHRoZSBwbHVnaW4KICoKICogQHR5cGUge2Jvb2xlYW59CiAqIEBkZWZhdWx0CiAqLwpUZWNoLnByb3RvdHlwZS5mZWF0dXJlc0Z1bGxzY3JlZW5SZXNpemUgPSBmYWxzZTsKCi8qKgogKiBCb29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHRoZSBgVGVjaGAgc3VwcG9ydHMgY2hhbmdpbmcgdGhlIHNwZWVkIGF0IHdoaWNoIHRoZSB2aWRlbwogKiBwbGF5cy4gRXhhbXBsZXM6CiAqICAgLSBTZXQgcGxheWVyIHRvIHBsYXkgMnggKHR3aWNlKSBhcyBmYXN0CiAqICAgLSBTZXQgcGxheWVyIHRvIHBsYXkgMC41eCAoaGFsZikgYXMgZmFzdAogKgogKiBAdHlwZSB7Ym9vbGVhbn0KICogQGRlZmF1bHQKICovClRlY2gucHJvdG90eXBlLmZlYXR1cmVzUGxheWJhY2tSYXRlID0gZmFsc2U7CgovKioKICogQm9vbGVhbiBpbmRpY2F0aW5nIHdldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIHRoZSBgcHJvZ3Jlc3NgIGV2ZW50LiBUaGlzIGlzIGN1cnJlbnRseQogKiBub3QgdHJpZ2dlcmVkIGJ5IHZpZGVvLWpzLXN3Zi4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCiAqIHtAbGluayBUZWNoI21hbnVhbFByb2dyZXNzT259IHNob3VsZCBiZSBjYWxsZWQuCiAqCiAqIEB0eXBlIHtib29sZWFufQogKiBAZGVmYXVsdAogKi8KVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNQcm9ncmVzc0V2ZW50cyA9IGZhbHNlOwoKLyoqCiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyB0aGUgYHRpbWV1cGRhdGVgIGV2ZW50LiBUaGlzIGlzIGN1cnJlbnRseQogKiBub3QgdHJpZ2dlcmVkIGJ5IHZpZGVvLWpzLXN3Zi4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCiAqIHtAbGluayBUZWNoI21hbnVhbFRpbWVVcGRhdGVzfSBzaG91bGQgYmUgY2FsbGVkLgogKgogKiBAdHlwZSB7Ym9vbGVhbn0KICogQGRlZmF1bHQKICovClRlY2gucHJvdG90eXBlLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cyA9IGZhbHNlOwoKLyoqCiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3ZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyB0aGUgbmF0aXZlIGBUZXh0VHJhY2tgcy4KICogVGhpcyB3aWxsIGhlbHAgdXMgaW50ZWdyYXRlIHdpdGggbmF0aXZlIGBUZXh0VHJhY2tgcyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGVtLgogKgogKiBAdHlwZSB7Ym9vbGVhbn0KICogQGRlZmF1bHQKICovClRlY2gucHJvdG90eXBlLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyA9IGZhbHNlOwoKLyoqCiAqIEEgZnVuY3Rpb25hbCBtaXhpbiBmb3IgdGVjaHMgdGhhdCB3YW50IHRvIHVzZSB0aGUgU291cmNlIEhhbmRsZXIgcGF0dGVybi4KICogU291cmNlIGhhbmRsZXJzIGFyZSBzY3JpcHRzIGZvciBoYW5kbGluZyBzcGVjaWZpYyBmb3JtYXRzLgogKiBUaGUgc291cmNlIGhhbmRsZXIgcGF0dGVybiBpcyB1c2VkIGZvciBhZGFwdGl2ZSBmb3JtYXRzIChITFMsIERBU0gpIHRoYXQKICogbWFudWFsbHkgbG9hZCB2aWRlbyBkYXRhIGFuZCBmZWVkIGl0IGludG8gYSBTb3VyY2UgQnVmZmVyIChNZWRpYSBTb3VyY2UgRXh0ZW5zaW9ucykKICogRXhhbXBsZTogYFRlY2gud2l0aFNvdXJjZUhhbmRsZXJzLmNhbGwoTXlUZWNoKTtgCiAqCiAqIEBwYXJhbSB7VGVjaH0gX1RlY2gKICogICAgICAgIFRoZSB0ZWNoIHRvIGFkZCBzb3VyY2UgaGFuZGxlciBmdW5jdGlvbnMgdG8uCiAqCiAqIEBtaXhlcyBUZWNoflNvdXJjZUhhbmRsZXJBZGRpdGlvbnMKICovClRlY2gud2l0aFNvdXJjZUhhbmRsZXJzID0gZnVuY3Rpb24gKF9UZWNoKSB7CgogIC8qKgogICAqIFJlZ2lzdGVyIGEgc291cmNlIGhhbmRsZXIKICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIKICAgKiAgICAgICAgVGhlIHNvdXJjZSBoYW5kbGVyIGNsYXNzCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XQogICAqICAgICAgICBSZWdpc3RlciBpdCBhdCB0aGUgZm9sbG93aW5nIGluZGV4CiAgICovCiAgX1RlY2gucmVnaXN0ZXJTb3VyY2VIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIsIGluZGV4KSB7CiAgICB2YXIgaGFuZGxlcnMgPSBfVGVjaC5zb3VyY2VIYW5kbGVyczsKCiAgICBpZiAoIWhhbmRsZXJzKSB7CiAgICAgIGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnMgPSBbXTsKICAgIH0KCiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgewogICAgICAvLyBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAogICAgICBpbmRleCA9IGhhbmRsZXJzLmxlbmd0aDsKICAgIH0KCiAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDAsIGhhbmRsZXIpOwogIH07CgogIC8qKgogICAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiB0eXBlLiBBbHNvIGNoZWNrcyB0aGUKICAgKiBUZWNocyBzb3VyY2VIYW5kbGVycy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICogICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2suCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKQogICAqLwogIF9UZWNoLmNhblBsYXlUeXBlID0gZnVuY3Rpb24gKHR5cGUpIHsKICAgIHZhciBoYW5kbGVycyA9IF9UZWNoLnNvdXJjZUhhbmRsZXJzIHx8IFtdOwogICAgdmFyIGNhbiA9IHZvaWQgMDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhblBsYXlUeXBlKHR5cGUpOwoKICAgICAgaWYgKGNhbikgewogICAgICAgIHJldHVybiBjYW47CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJyc7CiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgZmlyc3Qgc291cmNlIGhhbmRsZXIgdGhhdCBzdXBwb3J0cyB0aGUgc291cmNlLgogICAqCiAgICogVE9ETzogQW5zd2VyIHF1ZXN0aW9uOiBzaG91bGQgJ3Byb2JhYmx5JyBiZSBwcmlvcml0aXplZCBvdmVyICdtYXliZScKICAgKgogICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IHNvdXJjZQogICAqICAgICAgICBUaGUgc291cmNlIG9iamVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgKiAgICAgICAgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB0ZWNoCiAgICoKICAgKiBAcmV0dXJuIHtTb3VyY2VIYW5kbGVyfG51bGx9CiAgICogICAgICAgICAgVGhlIGZpcnN0IHNvdXJjZSBoYW5kbGVyIHRoYXQgc3VwcG9ydHMgdGhlIHNvdXJjZSBvciBudWxsIGlmCiAgICogICAgICAgICAgbm8gU291cmNlSGFuZGxlciBzdXBwb3J0cyB0aGUgc291cmNlCiAgICovCiAgX1RlY2guc2VsZWN0U291cmNlSGFuZGxlciA9IGZ1bmN0aW9uIChzb3VyY2UsIG9wdGlvbnMpIHsKICAgIHZhciBoYW5kbGVycyA9IF9UZWNoLnNvdXJjZUhhbmRsZXJzIHx8IFtdOwogICAgdmFyIGNhbiA9IHZvaWQgMDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhbkhhbmRsZVNvdXJjZShzb3VyY2UsIG9wdGlvbnMpOwoKICAgICAgaWYgKGNhbikgewogICAgICAgIHJldHVybiBoYW5kbGVyc1tpXTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH07CgogIC8qKgogICAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiBzb3VyY2UuCiAgICoKICAgKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fSBzcmNPYmoKICAgKiAgICAgICAgVGhlIHNvdXJjZSBvYmplY3QKICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICogICAgICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgdGVjaAogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZykKICAgKi8KICBfVGVjaC5jYW5QbGF5U291cmNlID0gZnVuY3Rpb24gKHNyY09iaiwgb3B0aW9ucykgewogICAgdmFyIHNoID0gX1RlY2guc2VsZWN0U291cmNlSGFuZGxlcihzcmNPYmosIG9wdGlvbnMpOwoKICAgIGlmIChzaCkgewogICAgICByZXR1cm4gc2guY2FuSGFuZGxlU291cmNlKHNyY09iaiwgb3B0aW9ucyk7CiAgICB9CgogICAgcmV0dXJuICcnOwogIH07CgogIC8qKgogICAqIFdoZW4gdXNpbmcgYSBzb3VyY2UgaGFuZGxlciwgcHJlZmVyIGl0cyBpbXBsZW1lbnRhdGlvbiBvZgogICAqIGFueSBmdW5jdGlvbiBub3JtYWxseSBwcm92aWRlZCBieSB0aGUgdGVjaC4KICAgKi8KICB2YXIgZGVmZXJyYWJsZSA9IFsnc2Vla2FibGUnLCAnZHVyYXRpb24nXTsKCiAgLyoqCiAgICogQSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgVGVjaCNzZWVrYWJsZX0gdGhhdCB3aWxsIGNhbGwgYSBgU291cmNlSGFuZGxlcmBzIHNlZWthYmxlCiAgICogZnVuY3Rpb24gaWYgaXQgZXhpc3RzLCB3aXRoIGEgZmFsbGJhY2sgdG8gdGhlIFRlY2hzIHNlZWthYmxlIGZ1bmN0aW9uLgogICAqCiAgICogQG1ldGhvZCBfVGVjaC5zZWVrYWJsZQogICAqLwoKICAvKioKICAgKiBBIHdyYXBwZXIgYXJvdW5kIHtAbGluayBUZWNoI2R1cmF0aW9ufSB0aGF0IHdpbGwgY2FsbCBhIGBTb3VyY2VIYW5kbGVyYHMgZHVyYXRpb24KICAgKiBmdW5jdGlvbiBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBpdCB3aWxsIGZhbGxiYWNrIHRvIHRoZSB0ZWNocyBkdXJhdGlvbiBmdW5jdGlvbi4KICAgKgogICAqIEBtZXRob2QgX1RlY2guZHVyYXRpb24KICAgKi8KCiAgZGVmZXJyYWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChmbk5hbWUpIHsKICAgIHZhciBvcmlnaW5hbEZuID0gdGhpc1tmbk5hbWVdOwoKICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxGbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm47CiAgICB9CgogICAgdGhpc1tmbk5hbWVdID0gZnVuY3Rpb24gKCkgewogICAgICBpZiAodGhpcy5zb3VyY2VIYW5kbGVyXyAmJiB0aGlzLnNvdXJjZUhhbmRsZXJfW2ZuTmFtZV0pIHsKICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VIYW5kbGVyX1tmbk5hbWVdLmFwcGx5KHRoaXMuc291cmNlSGFuZGxlcl8sIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9yaWdpbmFsRm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSwgX1RlY2gucHJvdG90eXBlKTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcgdGhlIHNvdXJjZSB1c2luZyBhIHNvdXJjZSBvYmplY3QKICAgKiBhbmQgc291cmNlIGhhbmRsZXJzLgogICAqIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgdW5sZXNzIGEgc291cmNlIGhhbmRsZXIgd2FzIGZvdW5kLgogICAqCiAgICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc291cmNlCiAgICogICAgICAgIEEgc291cmNlIG9iamVjdCB3aXRoIHNyYyBhbmQgdHlwZSBrZXlzCiAgICovCiAgX1RlY2gucHJvdG90eXBlLnNldFNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgIHZhciBzaCA9IF9UZWNoLnNlbGVjdFNvdXJjZUhhbmRsZXIoc291cmNlLCB0aGlzLm9wdGlvbnNfKTsKCiAgICBpZiAoIXNoKSB7CiAgICAgIC8vIEZhbGwgYmFjayB0byBhIG5hdGl2ZSBzb3VyY2UgaGFuZGVyIHdoZW4gdW5zdXBwb3J0ZWQgc291cmNlcyBhcmUKICAgICAgLy8gZGVsaWJlcmF0ZWx5IHNldAogICAgICBpZiAoX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcikgewogICAgICAgIHNoID0gX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBsb2ckMS5lcnJvcignTm8gc291cmNlIGhhbmRlciBmb3VuZCBmb3IgdGhlIGN1cnJlbnQgc291cmNlLicpOwogICAgICB9CiAgICB9CgogICAgLy8gRGlzcG9zZSBhbnkgZXhpc3Rpbmcgc291cmNlIGhhbmRsZXIKICAgIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIoKTsKICAgIHRoaXMub2ZmKCdkaXNwb3NlJywgdGhpcy5kaXNwb3NlU291cmNlSGFuZGxlcik7CgogICAgaWYgKHNoICE9PSBfVGVjaC5uYXRpdmVTb3VyY2VIYW5kbGVyKSB7CiAgICAgIHRoaXMuY3VycmVudFNvdXJjZV8gPSBzb3VyY2U7CiAgICB9CgogICAgdGhpcy5zb3VyY2VIYW5kbGVyXyA9IHNoLmhhbmRsZVNvdXJjZShzb3VyY2UsIHRoaXMsIHRoaXMub3B0aW9uc18pOwogICAgdGhpcy5vbignZGlzcG9zZScsIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIpOwogIH07CgogIC8qKgogICAqIENsZWFuIHVwIGFueSBleGlzdGluZyBTb3VyY2VIYW5kbGVycyBhbmQgbGlzdGVuZXJzIHdoZW4gdGhlIFRlY2ggaXMgZGlzcG9zZWQuCiAgICoKICAgKiBAbGlzdGVucyBUZWNoI2Rpc3Bvc2UKICAgKi8KICBfVGVjaC5wcm90b3R5cGUuZGlzcG9zZVNvdXJjZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAvLyBpZiB3ZSBoYXZlIGEgc291cmNlIGFuZCBnZXQgYW5vdGhlciBvbmUKICAgIC8vIHRoZW4gd2UgYXJlIGxvYWRpbmcgc29tZXRoaW5nIG5ldwogICAgLy8gdGhhbiBjbGVhciBhbGwgb2Ygb3VyIGN1cnJlbnQgdHJhY2tzCiAgICBpZiAodGhpcy5jdXJyZW50U291cmNlXykgewogICAgICB0aGlzLmNsZWFyVHJhY2tzKFsnYXVkaW8nLCAndmlkZW8nXSk7CiAgICAgIHRoaXMuY3VycmVudFNvdXJjZV8gPSBudWxsOwogICAgfQoKICAgIC8vIGFsd2F5cyBjbGVhbiB1cCBhdXRvLXRleHQgdHJhY2tzCiAgICB0aGlzLmNsZWFudXBBdXRvVGV4dFRyYWNrcygpOwoKICAgIGlmICh0aGlzLnNvdXJjZUhhbmRsZXJfKSB7CgogICAgICBpZiAodGhpcy5zb3VyY2VIYW5kbGVyXy5kaXNwb3NlKSB7CiAgICAgICAgdGhpcy5zb3VyY2VIYW5kbGVyXy5kaXNwb3NlKCk7CiAgICAgIH0KCiAgICAgIHRoaXMuc291cmNlSGFuZGxlcl8gPSBudWxsOwogICAgfQogIH07Cn07CgovLyBUaGUgYmFzZSBUZWNoIGNsYXNzIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYXMgYSBDb21wb25lbnQuIEl0IGlzIHRoZSBvbmx5Ci8vIFRlY2ggdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBhIENvbXBvbmVudC4KQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZWNoJywgVGVjaCk7ClRlY2gucmVnaXN0ZXJUZWNoKCdUZWNoJywgVGVjaCk7CgovKioKICogQSBsaXN0IG9mIHRlY2hzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRlY2hPcmRlciBvbiBQbGF5ZXJzCiAqCiAqIEBwcml2YXRlCiAqLwpUZWNoLmRlZmF1bHRUZWNoT3JkZXJfID0gW107Cgp2YXIgbWlkZGxld2FyZXMgPSB7fTsKCmZ1bmN0aW9uIHVzZSh0eXBlLCBtaWRkbGV3YXJlKSB7CiAgbWlkZGxld2FyZXNbdHlwZV0gPSBtaWRkbGV3YXJlc1t0eXBlXSB8fCBbXTsKICBtaWRkbGV3YXJlc1t0eXBlXS5wdXNoKG1pZGRsZXdhcmUpOwp9CgoKCmZ1bmN0aW9uIHNldFNvdXJjZShwbGF5ZXIsIHNyYywgbmV4dCkgewogIHBsYXllci5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBzZXRTb3VyY2VIZWxwZXIoc3JjLCBtaWRkbGV3YXJlc1tzcmMudHlwZV0sIG5leHQsIHBsYXllcik7CiAgfSwgMSk7Cn0KCmZ1bmN0aW9uIHNldFRlY2gobWlkZGxld2FyZSwgdGVjaCkgewogIG1pZGRsZXdhcmUuZm9yRWFjaChmdW5jdGlvbiAobXcpIHsKICAgIHJldHVybiBtdy5zZXRUZWNoICYmIG13LnNldFRlY2godGVjaCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGdldCQxKG1pZGRsZXdhcmUsIHRlY2gsIG1ldGhvZCkgewogIHJldHVybiBtaWRkbGV3YXJlLnJlZHVjZVJpZ2h0KG1pZGRsZXdhcmVJdGVyYXRvcihtZXRob2QpLCB0ZWNoW21ldGhvZF0oKSk7Cn0KCmZ1bmN0aW9uIHNldCQxKG1pZGRsZXdhcmUsIHRlY2gsIG1ldGhvZCwgYXJnKSB7CiAgcmV0dXJuIHRlY2hbbWV0aG9kXShtaWRkbGV3YXJlLnJlZHVjZShtaWRkbGV3YXJlSXRlcmF0b3IobWV0aG9kKSwgYXJnKSk7Cn0KCnZhciBhbGxvd2VkR2V0dGVycyA9IHsKICBidWZmZXJlZDogMSwKICBjdXJyZW50VGltZTogMSwKICBkdXJhdGlvbjogMSwKICBzZWVrYWJsZTogMSwKICBwbGF5ZWQ6IDEKfTsKCnZhciBhbGxvd2VkU2V0dGVycyA9IHsKICBzZXRDdXJyZW50VGltZTogMQp9OwoKZnVuY3Rpb24gbWlkZGxld2FyZUl0ZXJhdG9yKG1ldGhvZCkgewogIHJldHVybiBmdW5jdGlvbiAodmFsdWUsIG13KSB7CiAgICBpZiAobXdbbWV0aG9kXSkgewogICAgICByZXR1cm4gbXdbbWV0aG9kXSh2YWx1ZSk7CiAgICB9CgogICAgcmV0dXJuIHZhbHVlOwogIH07Cn0KCmZ1bmN0aW9uIHNldFNvdXJjZUhlbHBlcigpIHsKICB2YXIgc3JjID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTsKICB2YXIgbWlkZGxld2FyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107CiAgdmFyIG5leHQgPSBhcmd1bWVudHNbMl07CiAgdmFyIHBsYXllciA9IGFyZ3VtZW50c1szXTsKICB2YXIgYWNjID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBbXTsKICB2YXIgbGFzdFJ1biA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDogZmFsc2U7CiAgdmFyIG13RmFjdG9yeSA9IG1pZGRsZXdhcmVbMF0sCiAgICAgIG13cmVzdCA9IG1pZGRsZXdhcmUuc2xpY2UoMSk7CgogIC8vIGlmIG13RmFjdG9yeSBpcyBhIHN0cmluZywgdGhlbiB3ZSdyZSBhdCBhIGZvcmsgaW4gdGhlIHJvYWQKCiAgaWYgKHR5cGVvZiBtd0ZhY3RvcnkgPT09ICdzdHJpbmcnKSB7CiAgICBzZXRTb3VyY2VIZWxwZXIoc3JjLCBtaWRkbGV3YXJlc1ttd0ZhY3RvcnldLCBuZXh0LCBwbGF5ZXIsIGFjYywgbGFzdFJ1bik7CgogICAgLy8gaWYgd2UgaGF2ZSBhbiBtd0ZhY3RvcnksIGNhbGwgaXQgd2l0aCB0aGUgcGxheWVyIHRvIGdldCB0aGUgbXcsCiAgICAvLyB0aGVuIGNhbGwgdGhlIG13J3Mgc2V0U291cmNlIG1ldGhvZAogIH0gZWxzZSBpZiAobXdGYWN0b3J5KSB7CiAgICB2YXIgbXcgPSBtd0ZhY3RvcnkocGxheWVyKTsKCiAgICBtdy5zZXRTb3VyY2UoYXNzaWduKHt9LCBzcmMpLCBmdW5jdGlvbiAoZXJyLCBfc3JjKSB7CgogICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRyeSB0aGUgbmV4dCBtaWRkbGV3YXJlIG9uIHRoZSBjdXJyZW50IGxldmVsCiAgICAgIC8vIG1ha2Ugc3VyZSB0byB1c2UgdGhlIG9sZCBzcmMKICAgICAgaWYgKGVycikgewogICAgICAgIHJldHVybiBzZXRTb3VyY2VIZWxwZXIoc3JjLCBtd3Jlc3QsIG5leHQsIHBsYXllciwgYWNjLCBsYXN0UnVuKTsKICAgICAgfQoKICAgICAgLy8gd2UndmUgc3VjY2VlZGVkLCBub3cgd2UgbmVlZCB0byBnbyBkZWVwZXIKICAgICAgYWNjLnB1c2gobXcpOwoKICAgICAgLy8gaWYgaXQncyB0aGUgc2FtZSB0eXBlLCBjb250aW51ZSBkb3duIHRoZSBjdXJyZW50IGNoYWluCiAgICAgIC8vIG90aGVyd2lzZSwgd2Ugd2FudCB0byBnbyBkb3duIHRoZSBuZXcgY2hhaW4KICAgICAgc2V0U291cmNlSGVscGVyKF9zcmMsIHNyYy50eXBlID09PSBfc3JjLnR5cGUgPyBtd3Jlc3QgOiBtaWRkbGV3YXJlc1tfc3JjLnR5cGVdLCBuZXh0LCBwbGF5ZXIsIGFjYywgbGFzdFJ1bik7CiAgICB9KTsKICB9IGVsc2UgaWYgKG13cmVzdC5sZW5ndGgpIHsKICAgIHNldFNvdXJjZUhlbHBlcihzcmMsIG13cmVzdCwgbmV4dCwgcGxheWVyLCBhY2MsIGxhc3RSdW4pOwogIH0gZWxzZSBpZiAobGFzdFJ1bikgewogICAgbmV4dChzcmMsIGFjYyk7CiAgfSBlbHNlIHsKICAgIHNldFNvdXJjZUhlbHBlcihzcmMsIG1pZGRsZXdhcmVzWycqJ10sIG5leHQsIHBsYXllciwgYWNjLCB0cnVlKTsKICB9Cn0KCi8qKgogKiBAbW9kdWxlIGZpbHRlci1zb3VyY2UKICovCi8qKgogKiBGaWx0ZXIgb3V0IHNpbmdsZSBiYWQgc291cmNlIG9iamVjdHMgb3IgbXVsdGlwbGUgc291cmNlIG9iamVjdHMgaW4gYW4KICogYXJyYXkuIEFsc28gZmxhdHRlbnMgbmVzdGVkIHNvdXJjZSBvYmplY3QgYXJyYXlzIGludG8gYSAxIGRpbWVuc2lvbmFsCiAqIGFycmF5IG9mIHNvdXJjZSBvYmplY3RzLgogKgogKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fFRlY2h+U291cmNlT2JqZWN0W119IHNyYwogKiAgICAgICAgVGhlIHNyYyBvYmplY3QgdG8gZmlsdGVyCiAqCiAqIEByZXR1cm4ge1RlY2h+U291cmNlT2JqZWN0W119CiAqICAgICAgICAgQW4gYXJyYXkgb2Ygc291cmNlb2JqZWN0cyBjb250YWluaW5nIG9ubHkgdmFsaWQgc291cmNlcwogKgogKiBAcHJpdmF0ZQogKi8KdmFyIGZpbHRlclNvdXJjZSA9IGZ1bmN0aW9uIGZpbHRlclNvdXJjZShzcmMpIHsKICAvLyB0cmF2ZXJzZSBhcnJheQogIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHsKICAgIHZhciBuZXdzcmMgPSBbXTsKCiAgICBzcmMuZm9yRWFjaChmdW5jdGlvbiAoc3Jjb2JqKSB7CiAgICAgIHNyY29iaiA9IGZpbHRlclNvdXJjZShzcmNvYmopOwoKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3Jjb2JqKSkgewogICAgICAgIG5ld3NyYyA9IG5ld3NyYy5jb25jYXQoc3Jjb2JqKTsKICAgICAgfSBlbHNlIGlmIChpc09iamVjdChzcmNvYmopKSB7CiAgICAgICAgbmV3c3JjLnB1c2goc3Jjb2JqKTsKICAgICAgfQogICAgfSk7CgogICAgc3JjID0gbmV3c3JjOwogIH0gZWxzZSBpZiAodHlwZW9mIHNyYyA9PT0gJ3N0cmluZycgJiYgc3JjLnRyaW0oKSkgewogICAgLy8gY29udmVydCBzdHJpbmcgaW50byBvYmplY3QKICAgIHNyYyA9IFt7IHNyYzogc3JjIH1dOwogIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSAmJiB0eXBlb2Ygc3JjLnNyYyA9PT0gJ3N0cmluZycgJiYgc3JjLnNyYyAmJiBzcmMuc3JjLnRyaW0oKSkgewogICAgLy8gc3JjIGlzIGFscmVhZHkgdmFsaWQKICAgIHNyYyA9IFtzcmNdOwogIH0gZWxzZSB7CiAgICAvLyBpbnZhbGlkIHNvdXJjZSwgdHVybiBpdCBpbnRvIGFuIGVtcHR5IGFycmF5CiAgICBzcmMgPSBbXTsKICB9CgogIHJldHVybiBzcmM7Cn07CgovKioKICogQGZpbGUgbG9hZGVyLmpzCiAqLwovKioKICogVGhlIGBNZWRpYUxvYWRlcmAgaXMgdGhlIGBDb21wb25lbnRgIHRoYXQgZGVjaWRlcyB3aGljaCBwbGF5YmFjayB0ZWNobm9sb2d5IHRvIGxvYWQKICogd2hlbiBhIHBsYXllciBpcyBpbml0aWFsaXplZC4KICoKICogQGV4dGVuZHMgQ29tcG9uZW50CiAqLwoKdmFyIE1lZGlhTG9hZGVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHsKICBpbmhlcml0cyhNZWRpYUxvYWRlciwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBhdHRhY2ggdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3Ryb2Ugb2YgcGxheWVyIG9wdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSBbcmVhZHldCiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIHJ1biB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlYWR5LgogICAqLwogIGZ1bmN0aW9uIE1lZGlhTG9hZGVyKHBsYXllciwgb3B0aW9ucywgcmVhZHkpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lZGlhTG9hZGVyKTsKCiAgICAvLyBNZWRpYUxvYWRlciBoYXMgbm8gZWxlbWVudAogICAgdmFyIG9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKHsgY3JlYXRlRWw6IGZhbHNlIH0sIG9wdGlvbnMpOwoKICAgIC8vIElmIHRoZXJlIGFyZSBubyBzb3VyY2VzIHdoZW4gdGhlIHBsYXllciBpcyBpbml0aWFsaXplZCwKICAgIC8vIGxvYWQgdGhlIGZpcnN0IHN1cHBvcnRlZCBwbGF5YmFjayB0ZWNobm9sb2d5LgoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9uc18sIHJlYWR5KSk7CgogICAgaWYgKCFvcHRpb25zLnBsYXllck9wdGlvbnMuc291cmNlcyB8fCBvcHRpb25zLnBsYXllck9wdGlvbnMuc291cmNlcy5sZW5ndGggPT09IDApIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBvcHRpb25zLnBsYXllck9wdGlvbnMudGVjaE9yZGVyOyBpIDwgai5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciB0ZWNoTmFtZSA9IHRvVGl0bGVDYXNlKGpbaV0pOwogICAgICAgIHZhciB0ZWNoID0gVGVjaC5nZXRUZWNoKHRlY2hOYW1lKTsKCiAgICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLgogICAgICAgIC8vIFJlbW92ZSBvbmNlIHRoYXQgZGVwcmVjYXRlZCBiZWhhdmlvciBpcyByZW1vdmVkLgogICAgICAgIGlmICghdGVjaE5hbWUpIHsKICAgICAgICAgIHRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHRlY2hOYW1lKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neQogICAgICAgIGlmICh0ZWNoICYmIHRlY2guaXNTdXBwb3J0ZWQoKSkgewogICAgICAgICAgcGxheWVyLmxvYWRUZWNoXyh0ZWNoTmFtZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIExvb3AgdGhyb3VnaCBwbGF5YmFjayB0ZWNobm9sb2dpZXMgKEhUTUw1LCBGbGFzaCkgYW5kIGNoZWNrIGZvciBzdXBwb3J0LgogICAgICAvLyBUaGVuIGxvYWQgdGhlIGJlc3Qgc291cmNlLgogICAgICAvLyBBIGZldyBhc3N1bXB0aW9ucyBoZXJlOgogICAgICAvLyAgIEFsbCBwbGF5YmFjayB0ZWNobm9sb2dpZXMgcmVzcGVjdCBwcmVsb2FkIGZhbHNlLgogICAgICBwbGF5ZXIuc3JjKG9wdGlvbnMucGxheWVyT3B0aW9ucy5zb3VyY2VzKTsKICAgIH0KICAgIHJldHVybiBfdGhpczsKICB9CgogIHJldHVybiBNZWRpYUxvYWRlcjsKfShDb21wb25lbnQpOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZWRpYUxvYWRlcicsIE1lZGlhTG9hZGVyKTsKCi8qKgogKiBAZmlsZSBidXR0b24uanMKICovCi8qKgogKiBDbGlja2FibGUgQ29tcG9uZW50IHdoaWNoIGlzIGNsaWNrYWJsZSBvciBrZXlib2FyZCBhY3Rpb25hYmxlLAogKiBidXQgaXMgbm90IGEgbmF0aXZlIEhUTUwgYnV0dG9uLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgQ2xpY2thYmxlQ29tcG9uZW50ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHsKICBpbmhlcml0cyhDbGlja2FibGVDb21wb25lbnQsIF9Db21wb25lbnQpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0gIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0gIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBDbGlja2FibGVDb21wb25lbnQocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDbGlja2FibGVDb21wb25lbnQpOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLmVtaXRUYXBFdmVudHMoKTsKCiAgICBfdGhpcy5lbmFibGUoKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGBzIERPTSBlbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9ZGl2XQogICAqICAgICAgICBUaGUgZWxlbWVudCdzIG5vZGUgdHlwZS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dCiAgICogICAgICAgIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbYXR0cmlidXRlcz17fV0KICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLgogICAqLwoKCiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgdmFyIHRhZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ2Rpdic7CiAgICB2YXIgcHJvcHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgdmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9OwoKICAgIHByb3BzID0gYXNzaWduKHsKICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gYXJpYS1oaWRkZW49InRydWUiIGNsYXNzPSJ2anMtaWNvbi1wbGFjZWhvbGRlciI+PC9zcGFuPicsCiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKCksCiAgICAgIHRhYkluZGV4OiAwCiAgICB9LCBwcm9wcyk7CgogICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHsKICAgICAgbG9nJDEuZXJyb3IoJ0NyZWF0aW5nIGEgQ2xpY2thYmxlQ29tcG9uZW50IHdpdGggYW4gSFRNTCBlbGVtZW50IG9mICcgKyB0YWcgKyAnIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIEJ1dHRvbiBpbnN0ZWFkLicpOwogICAgfQoKICAgIC8vIEFkZCBBUklBIGF0dHJpYnV0ZXMgZm9yIGNsaWNrYWJsZSBlbGVtZW50IHdoaWNoIGlzIG5vdCBhIG5hdGl2ZSBIVE1MIGJ1dHRvbgogICAgYXR0cmlidXRlcyA9IGFzc2lnbih7CiAgICAgICdyb2xlJzogJ2J1dHRvbicsCgogICAgICAvLyBsZXQgdGhlIHNjcmVlbiByZWFkZXIgdXNlciBrbm93IHRoYXQgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQgbWF5IGNoYW5nZQogICAgICAnYXJpYS1saXZlJzogJ3BvbGl0ZScKICAgIH0sIGF0dHJpYnV0ZXMpOwoKICAgIHRoaXMudGFiSW5kZXhfID0gcHJvcHMudGFiSW5kZXg7CgogICAgdmFyIGVsID0gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCB0YWcsIHByb3BzLCBhdHRyaWJ1dGVzKTsKCiAgICB0aGlzLmNyZWF0ZUNvbnRyb2xUZXh0RWwoZWwpOwoKICAgIHJldHVybiBlbDsKICB9OwoKICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgLy8gcmVtb3ZlIGNvbnRyb2xUZXh0RWxfIG9uIGRpcG9zZQogICAgdGhpcy5jb250cm9sVGV4dEVsXyA9IG51bGw7CgogICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBhIGNvbnRyb2wgdGV4dCBlbGVtZW50IG9uIHRoaXMgYENvbXBvbmVudGAKICAgKgogICAqIEBwYXJhbSB7RWxlbWVudH0gW2VsXQogICAqICAgICAgICBQYXJlbnQgZWxlbWVudCBmb3IgdGhlIGNvbnRyb2wgdGV4dC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgY29udHJvbCB0ZXh0IGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuCiAgICovCgoKICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUNvbnRyb2xUZXh0RWwgPSBmdW5jdGlvbiBjcmVhdGVDb250cm9sVGV4dEVsKGVsKSB7CiAgICB0aGlzLmNvbnRyb2xUZXh0RWxfID0gY3JlYXRlRWwoJ3NwYW4nLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1jb250cm9sLXRleHQnCiAgICB9KTsKCiAgICBpZiAoZWwpIHsKICAgICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250cm9sVGV4dEVsXyk7CiAgICB9CgogICAgdGhpcy5jb250cm9sVGV4dCh0aGlzLmNvbnRyb2xUZXh0XywgZWwpOwoKICAgIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0RWxfOwogIH07CgogIC8qKgogICAqIEdldCBvciBzZXQgdGhlIGxvY2FsaXplIHRleHQgdG8gdXNlIGZvciB0aGUgY29udHJvbHMgb24gdGhlIGBDb21wb25lbnRgLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XQogICAqICAgICAgICBDb250cm9sIHRleHQgZm9yIGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbD10aGlzLmVsKCldCiAgICogICAgICAgIEVsZW1lbnQgdG8gc2V0IHRoZSB0aXRsZSBvbi4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIC0gVGhlIGNvbnRyb2wgdGV4dCB3aGVuIGdldHRpbmcKICAgKi8KCgogIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuY29udHJvbFRleHQgPSBmdW5jdGlvbiBjb250cm9sVGV4dCh0ZXh0KSB7CiAgICB2YXIgZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZWwoKTsKCiAgICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0XyB8fCAnTmVlZCBUZXh0JzsKICAgIH0KCiAgICB2YXIgbG9jYWxpemVkVGV4dCA9IHRoaXMubG9jYWxpemUodGV4dCk7CgogICAgdGhpcy5jb250cm9sVGV4dF8gPSB0ZXh0OwogICAgdGV4dENvbnRlbnQodGhpcy5jb250cm9sVGV4dEVsXywgbG9jYWxpemVkVGV4dCk7CiAgICBpZiAoIXRoaXMubm9uSWNvbkNvbnRyb2wpIHsKICAgICAgLy8gU2V0IHRpdGxlIGF0dHJpYnV0ZSBpZiBvbmx5IGFuIGljb24gaXMgc2hvd24KICAgICAgZWwuc2V0QXR0cmlidXRlKCd0aXRsZScsIGxvY2FsaXplZFRleHQpOwogICAgfQogIH07CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1jb250cm9sIHZqcy1idXR0b24gJyArIF9Db21wb25lbnQucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBFbmFibGUgdGhpcyBgQ29tcG9uZW50YHMgZWxlbWVudC4KICAgKi8KCgogIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkgewogICAgaWYgKCF0aGlzLmVuYWJsZWRfKSB7CiAgICAgIHRoaXMuZW5hYmxlZF8gPSB0cnVlOwogICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZGlzYWJsZWQnKTsKICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ2ZhbHNlJyk7CiAgICAgIGlmICh0eXBlb2YgdGhpcy50YWJJbmRleF8gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsIHRoaXMudGFiSW5kZXhfKTsKICAgICAgfQogICAgICB0aGlzLm9uKFsndGFwJywgJ2NsaWNrJ10sIHRoaXMuaGFuZGxlQ2xpY2spOwogICAgICB0aGlzLm9uKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMpOwogICAgICB0aGlzLm9uKCdibHVyJywgdGhpcy5oYW5kbGVCbHVyKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBEaXNhYmxlIHRoaXMgYENvbXBvbmVudGBzIGVsZW1lbnQuCiAgICovCgoKICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgdGhpcy5lbmFibGVkXyA9IGZhbHNlOwogICAgdGhpcy5hZGRDbGFzcygndmpzLWRpc2FibGVkJyk7CiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpOwogICAgaWYgKHR5cGVvZiB0aGlzLnRhYkluZGV4XyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgdGhpcy5lbF8ucmVtb3ZlQXR0cmlidXRlKCd0YWJJbmRleCcpOwogICAgfQogICAgdGhpcy5vZmYoWyd0YXAnLCAnY2xpY2snXSwgdGhpcy5oYW5kbGVDbGljayk7CiAgICB0aGlzLm9mZignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTsKICAgIHRoaXMub2ZmKCdibHVyJywgdGhpcy5oYW5kbGVCbHVyKTsKICB9OwoKICAvKioKICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgQ2xpY2thYmxlQ29tcG9uZW50YCBnZXRzOgogICAqIC0gQ2xpY2tlZCAodmlhIHRoZSBgY2xpY2tgIGV2ZW50LCBsaXN0ZW5pbmcgc3RhcnRzIGluIHRoZSBjb25zdHJ1Y3RvcikKICAgKiAtIFRhcHBlZCAodmlhIHRoZSBgdGFwYCBldmVudCwgbGlzdGVuaW5nIHN0YXJ0cyBpbiB0aGUgY29uc3RydWN0b3IpCiAgICogLSBUaGUgZm9sbG93aW5nIHRoaW5ncyBoYXBwZW4gaW4gb3JkZXI6CiAgICogICAxLiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUZvY3VzfSBpcyBjYWxsZWQgdmlhIGEgYGZvY3VzYCBldmVudCBvbiB0aGUKICAgKiAgICAgIGBDbGlja2FibGVDb21wb25lbnRgLgogICAqICAgMi4ge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVGb2N1c30gYWRkcyBhIGxpc3RlbmVyIGZvciBga2V5ZG93bmAgb24gdXNpbmcKICAgKiAgICAgIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlS2V5UHJlc3N9LgogICAqICAgMy4gYENsaWNrYWJsZUNvbXBvbmVudGAgaGFzIG5vdCBoYWQgYSBgYmx1cmAgZXZlbnQgKGBibHVyYCBtZWFucyB0aGF0IGZvY3VzIHdhcyBsb3N0KS4gVGhlIHVzZXIgcHJlc3NlcwogICAqICAgICAgdGhlIHNwYWNlIG9yIGVudGVyIGtleS4KICAgKiAgIDQuIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlS2V5UHJlc3N9IGNhbGxzIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgYGtleWRvd25gCiAgICogICAgICBldmVudCBhcyBhIHBhcmFtZXRlci4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUKICAgKiAgICAgICAgY2FsbGVkLgogICAqCiAgICogQGxpc3RlbnMgdGFwCiAgICogQGxpc3RlbnMgY2xpY2sKICAgKiBAYWJzdHJhY3QKICAgKi8KCgogIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge307CgogIC8qKgogICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBDbGlja2FibGVDb21wb25lbnRgIGdhaW5zIGZvY3VzIHZpYSBhIGBmb2N1c2AgZXZlbnQuCiAgICogVHVybnMgb24gbGlzdGVuaW5nIGZvciBga2V5ZG93bmAgZXZlbnRzLiBXaGVuIHRoZXkgaGFwcGVuIGl0CiAgICogY2FsbHMgYHRoaXMuaGFuZGxlS2V5UHJlc3NgLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBmb2N1c2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBmb2N1cwogICAqLwoKCiAgQ2xpY2thYmxlQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGV2ZW50KSB7CiAgICBvbihkb2N1bWVudF8xLCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpOwogIH07CgogIC8qKgogICAqIENhbGxlZCB3aGVuIHRoaXMgQ2xpY2thYmxlQ29tcG9uZW50IGhhcyBmb2N1cyBhbmQgYSBrZXkgZ2V0cyBwcmVzc2VkIGRvd24uIEJ5CiAgICogZGVmYXVsdCBpdCB3aWxsIGNhbGwgYHRoaXMuaGFuZGxlQ2xpY2tgIHdoZW4gdGhlIGtleSBpcyBzcGFjZSBvciBlbnRlci4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBga2V5ZG93bmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBrZXlkb3duCiAgICovCgoKICBDbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHsKCiAgICAvLyBTdXBwb3J0IFNwYWNlICgzMikgb3IgRW50ZXIgKDEzKSBrZXkgb3BlcmF0aW9uIHRvIGZpcmUgYSBjbGljayBldmVudAogICAgaWYgKGV2ZW50LndoaWNoID09PSAzMiB8fCBldmVudC53aGljaCA9PT0gMTMpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy50cmlnZ2VyKCdjbGljaycpOwogICAgfSBlbHNlIGlmIChfQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcykgewoKICAgICAgLy8gUGFzcyBrZXlwcmVzcyBoYW5kbGluZyB1cCBmb3IgdW5zdXBwb3J0ZWQga2V5cwogICAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcy5jYWxsKHRoaXMsIGV2ZW50KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBDYWxsZWQgd2hlbiBhIGBDbGlja2FibGVDb21wb25lbnRgIGxvc2VzIGZvY3VzLiBUdXJucyBvZmYgdGhlIGxpc3RlbmVyIGZvcgogICAqIGBrZXlkb3duYCBldmVudHMuIFdoaWNoIFN0b3BzIGB0aGlzLmhhbmRsZUtleVByZXNzYCBmcm9tIGdldHRpbmcgY2FsbGVkLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBibHVyYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KICAgKgogICAqIEBsaXN0ZW5zIGJsdXIKICAgKi8KCgogIENsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZXZlbnQpIHsKICAgIG9mZihkb2N1bWVudF8xLCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpOwogIH07CgogIHJldHVybiBDbGlja2FibGVDb21wb25lbnQ7Cn0oQ29tcG9uZW50KTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2xpY2thYmxlQ29tcG9uZW50JywgQ2xpY2thYmxlQ29tcG9uZW50KTsKCi8qKgogKiBAZmlsZSBwb3N0ZXItaW1hZ2UuanMKICovCi8qKgogKiBBIGBDbGlja2FibGVDb21wb25lbnRgIHRoYXQgaGFuZGxlcyBzaG93aW5nIHRoZSBwb3N0ZXIgaW1hZ2UgZm9yIHRoZSBwbGF5ZXIuCiAqCiAqIEBleHRlbmRzIENsaWNrYWJsZUNvbXBvbmVudAogKi8KCnZhciBQb3N0ZXJJbWFnZSA9IGZ1bmN0aW9uIChfQ2xpY2thYmxlQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoUG9zdGVySW1hZ2UsIF9DbGlja2FibGVDb21wb25lbnQpOwoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYXR0YWNoIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIFBvc3RlckltYWdlKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zdGVySW1hZ2UpOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NsaWNrYWJsZUNvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLnVwZGF0ZSgpOwogICAgcGxheWVyLm9uKCdwb3N0ZXJjaGFuZ2UnLCBiaW5kKF90aGlzLCBfdGhpcy51cGRhdGUpKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIENsZWFuIHVwIGFuZCBkaXNwb3NlIG9mIHRoZSBgUG9zdGVySW1hZ2VgLgogICAqLwoKCiAgUG9zdGVySW1hZ2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgdGhpcy5wbGF5ZXIoKS5vZmYoJ3Bvc3RlcmNoYW5nZScsIHRoaXMudXBkYXRlKTsKICAgIF9DbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBDcmVhdGUgdGhlIGBQb3N0ZXJJbWFnZWBzIERPTSBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLgogICAqLwoKCiAgUG9zdGVySW1hZ2UucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7CiAgICB2YXIgZWwgPSBjcmVhdGVFbCgnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtcG9zdGVyJywKCiAgICAgIC8vIERvbid0IHdhbnQgcG9zdGVyIHRvIGJlIHRhYmJhYmxlLgogICAgICB0YWJJbmRleDogLTEKICAgIH0pOwoKICAgIC8vIFRvIGVuc3VyZSB0aGUgcG9zdGVyIGltYWdlIHJlc2l6ZXMgd2hpbGUgbWFpbnRhaW5pbmcgaXRzIG9yaWdpbmFsIGFzcGVjdAogICAgLy8gcmF0aW8sIHVzZSBhIGRpdiB3aXRoIGBiYWNrZ3JvdW5kLXNpemVgIHdoZW4gYXZhaWxhYmxlLiBGb3IgYnJvd3NlcnMgdGhhdAogICAgLy8gZG8gbm90IHN1cHBvcnQgYGJhY2tncm91bmQtc2l6ZWAgKGUuZy4gSUU4KSwgZmFsbCBiYWNrIG9uIHVzaW5nIGEgcmVndWxhcgogICAgLy8gaW1nIGVsZW1lbnQuCiAgICBpZiAoIUJBQ0tHUk9VTkRfU0laRV9TVVBQT1JURUQpIHsKICAgICAgdGhpcy5mYWxsYmFja0ltZ18gPSBjcmVhdGVFbCgnaW1nJyk7CiAgICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuZmFsbGJhY2tJbWdfKTsKICAgIH0KCiAgICByZXR1cm4gZWw7CiAgfTsKCiAgLyoqCiAgICogQW4ge0BsaW5rIEV2ZW50VGFyZ2V0fkV2ZW50TGlzdGVuZXJ9IGZvciB7QGxpbmsgUGxheWVyI3Bvc3RlcmNoYW5nZX0gZXZlbnRzLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3Bvc3RlcmNoYW5nZQogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUgYFBsYXllciNwb3N0ZXJjaGFuZ2VgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24uCiAgICovCgoKICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7CiAgICB2YXIgdXJsID0gdGhpcy5wbGF5ZXIoKS5wb3N0ZXIoKTsKCiAgICB0aGlzLnNldFNyYyh1cmwpOwoKICAgIC8vIElmIHRoZXJlJ3Mgbm8gcG9zdGVyIHNvdXJjZSB3ZSBzaG91bGQgZGlzcGxheTpub25lIG9uIHRoaXMgY29tcG9uZW50CiAgICAvLyBzbyBpdCdzIG5vdCBzdGlsbCBjbGlja2FibGUgb3IgcmlnaHQtY2xpY2thYmxlCiAgICBpZiAodXJsKSB7CiAgICAgIHRoaXMuc2hvdygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oaWRlKCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogU2V0IHRoZSBzb3VyY2Ugb2YgdGhlIGBQb3N0ZXJJbWFnZWAgZGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IG1ldGhvZC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwKICAgKiAgICAgICAgVGhlIFVSTCB0byB0aGUgc291cmNlIGZvciB0aGUgYFBvc3RlckltYWdlYC4KICAgKi8KCgogIFBvc3RlckltYWdlLnByb3RvdHlwZS5zZXRTcmMgPSBmdW5jdGlvbiBzZXRTcmModXJsKSB7CiAgICBpZiAodGhpcy5mYWxsYmFja0ltZ18pIHsKICAgICAgdGhpcy5mYWxsYmFja0ltZ18uc3JjID0gdXJsOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGJhY2tncm91bmRJbWFnZSA9ICcnOwoKICAgICAgLy8gQW55IGZhbHNleSB2YWx1ZXMgc2hvdWxkIHN0YXkgYXMgYW4gZW1wdHkgc3RyaW5nLCBvdGhlcndpc2UKICAgICAgLy8gdGhpcyB3aWxsIHRocm93IGFuIGV4dHJhIGVycm9yCiAgICAgIGlmICh1cmwpIHsKICAgICAgICBiYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCInICsgdXJsICsgJyIpJzsKICAgICAgfQoKICAgICAgdGhpcy5lbF8uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlOwogICAgfQogIH07CgogIC8qKgogICAqIEFuIHtAbGluayBFdmVudFRhcmdldH5FdmVudExpc3RlbmVyfSBmb3IgY2xpY2tzIG9uIHRoZSBgUG9zdGVySW1hZ2VgLiBTZWUKICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUNsaWNrfSBmb3IgaW5zdGFuY2VzIHdoZXJlIHRoaXMgd2lsbCBiZSB0cmlnZ2VyZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqIEBsaXN0ZW5zIGtleWRvd24KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICsgICAgICAgIFRoZSBgY2xpY2tgLCBgdGFwYCBvciBga2V5ZG93bmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICovCgoKICBQb3N0ZXJJbWFnZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgLy8gV2UgZG9uJ3Qgd2FudCBhIGNsaWNrIHRvIHRyaWdnZXIgcGxheWJhY2sgd2hlbiBjb250cm9scyBhcmUgZGlzYWJsZWQKICAgIGlmICghdGhpcy5wbGF5ZXJfLmNvbnRyb2xzKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0aGlzLnBsYXllcl8ucGF1c2VkKCkpIHsKICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxheWVyXy5wYXVzZSgpOwogICAgfQogIH07CgogIHJldHVybiBQb3N0ZXJJbWFnZTsKfShDbGlja2FibGVDb21wb25lbnQpOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQb3N0ZXJJbWFnZScsIFBvc3RlckltYWdlKTsKCi8qKgogKiBAZmlsZSB0ZXh0LXRyYWNrLWRpc3BsYXkuanMKICovCnZhciBkYXJrR3JheSA9ICcjMjIyJzsKdmFyIGxpZ2h0R3JheSA9ICcjY2NjJzsKdmFyIGZvbnRNYXAgPSB7CiAgbW9ub3NwYWNlOiAnbW9ub3NwYWNlJywKICBzYW5zU2VyaWY6ICdzYW5zLXNlcmlmJywKICBzZXJpZjogJ3NlcmlmJywKICBtb25vc3BhY2VTYW5zU2VyaWY6ICciQW5kYWxlIE1vbm8iLCAiTHVjaWRhIENvbnNvbGUiLCBtb25vc3BhY2UnLAogIG1vbm9zcGFjZVNlcmlmOiAnIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlJywKICBwcm9wb3J0aW9uYWxTYW5zU2VyaWY6ICdzYW5zLXNlcmlmJywKICBwcm9wb3J0aW9uYWxTZXJpZjogJ3NlcmlmJywKICBjYXN1YWw6ICciQ29taWMgU2FucyBNUyIsIEltcGFjdCwgZmFudGFzeScsCiAgc2NyaXB0OiAnIk1vbm90eXBlIENvcnNpdmEiLCBjdXJzaXZlJywKICBzbWFsbGNhcHM6ICciQW5kYWxlIE1vbm8iLCAiTHVjaWRhIENvbnNvbGUiLCBtb25vc3BhY2UsIHNhbnMtc2VyaWYnCn07CgovKioKICogQ29uc3RydWN0IGFuIHJnYmEgY29sb3IgZnJvbSBhIGdpdmVuIGhleCBjb2xvciBjb2RlLgogKgogKiBAcGFyYW0ge251bWJlcn0gY29sb3IKICogICAgICAgIEhleCBudW1iZXIgZm9yIGNvbG9yLCBsaWtlICNmMGUuCiAqCiAqIEBwYXJhbSB7bnVtYmVyfSBvcGFjaXR5CiAqICAgICAgICBWYWx1ZSBmb3Igb3BhY2l0eSwgMC4wIC0gMS4wLgogKgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqICAgICAgICAgVGhlIHJnYmEgY29sb3IgdGhhdCB3YXMgY3JlYXRlZCwgbGlrZSAncmdiYSgyNTUsIDAsIDAsIDAuMyknLgogKgogKiBAcHJpdmF0ZQogKi8KZnVuY3Rpb24gY29uc3RydWN0Q29sb3IoY29sb3IsIG9wYWNpdHkpIHsKICByZXR1cm4gJ3JnYmEoJyArCiAgLy8gY29sb3IgbG9va3MgbGlrZSAiI2YwZSIKICBwYXJzZUludChjb2xvclsxXSArIGNvbG9yWzFdLCAxNikgKyAnLCcgKyBwYXJzZUludChjb2xvclsyXSArIGNvbG9yWzJdLCAxNikgKyAnLCcgKyBwYXJzZUludChjb2xvclszXSArIGNvbG9yWzNdLCAxNikgKyAnLCcgKyBvcGFjaXR5ICsgJyknOwp9CgovKioKICogVHJ5IHRvIHVwZGF0ZSB0aGUgc3R5bGUgb2YgYSBET00gZWxlbWVudC4gU29tZSBzdHlsZSBjaGFuZ2VzIHdpbGwgdGhyb3cgYW4gZXJyb3IsCiAqIHBhcnRpY3VsYXJseSBpbiBJRTguIFRob3NlIHNob3VsZCBiZSBub29wcy4KICoKICogQHBhcmFtIHtFbGVtZW50fSBlbAogKiAgICAgICAgVGhlIERPTSBlbGVtZW50IHRvIGJlIHN0eWxlZC4KICoKICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlCiAqICAgICAgICBUaGUgQ1NTIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHN0eWxlZC4KICoKICogQHBhcmFtIHtzdHJpbmd9IHJ1bGUKICogICAgICAgIFRoZSBzdHlsZSBydWxlIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHByb3BlcnR5LgogKgogKiBAcHJpdmF0ZQogKi8KZnVuY3Rpb24gdHJ5VXBkYXRlU3R5bGUoZWwsIHN0eWxlLCBydWxlKSB7CiAgdHJ5IHsKICAgIGVsLnN0eWxlW3N0eWxlXSA9IHJ1bGU7CiAgfSBjYXRjaCAoZSkgewoKICAgIC8vIFNhdGlzZmllcyBsaW50ZXIuCiAgICByZXR1cm47CiAgfQp9CgovKioKICogVGhlIGNvbXBvbmVudCBmb3IgZGlzcGxheWluZyB0ZXh0IHRyYWNrIGN1ZXMuCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBUZXh0VHJhY2tEaXNwbGF5ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHsKICBpbmhlcml0cyhUZXh0VHJhY2tEaXNwbGF5LCBfQ29tcG9uZW50KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKgogICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV0KICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBgVGV4dFRyYWNrRGlzcGxheWAgaXMgcmVhZHkuCiAgICovCiAgZnVuY3Rpb24gVGV4dFRyYWNrRGlzcGxheShwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0VHJhY2tEaXNwbGF5KTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSk7CgogICAgcGxheWVyLm9uKCdsb2Fkc3RhcnQnLCBiaW5kKF90aGlzLCBfdGhpcy50b2dnbGVEaXNwbGF5KSk7CiAgICBwbGF5ZXIub24oJ3RleHR0cmFja2NoYW5nZScsIGJpbmQoX3RoaXMsIF90aGlzLnVwZGF0ZURpc3BsYXkpKTsKICAgIHBsYXllci5vbignbG9hZHN0YXJ0JywgYmluZChfdGhpcywgX3RoaXMucHJlc2VsZWN0VHJhY2spKTsKCiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgY2FsbGVkIGR1cmluZyBwbGF5ZXIgaW5pdCwgYnV0IHdhcyBjYXVzaW5nIGFuIGVycm9yCiAgICAvLyBpZiBhIHRyYWNrIHNob3VsZCBzaG93IGJ5IGRlZmF1bHQgYW5kIHRoZSBkaXNwbGF5IGhhZG4ndCBsb2FkZWQgeWV0LgogICAgLy8gU2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIHRvIGFuIGV4dGVybmFsIHRyYWNrIGxvYWRlciB3aGVuIHdlIHN1cHBvcnQKICAgIC8vIHRyYWNrcyB0aGF0IGRvbid0IG5lZWQgYSBkaXNwbGF5LgogICAgcGxheWVyLnJlYWR5KGJpbmQoX3RoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHBsYXllci50ZWNoXyAmJiBwbGF5ZXIudGVjaF8uZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7CiAgICAgICAgdGhpcy5oaWRlKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBwbGF5ZXIub24oJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBiaW5kKHRoaXMsIHRoaXMudXBkYXRlRGlzcGxheSkpOwoKICAgICAgdmFyIHRyYWNrcyA9IHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy50cmFja3MgfHwgW107CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMucGxheWVyXy5hZGRSZW1vdGVUZXh0VHJhY2sodHJhY2tzW2ldLCB0cnVlKTsKICAgICAgfQoKICAgICAgdGhpcy5wcmVzZWxlY3RUcmFjaygpOwogICAgfSkpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgKiBQcmVzZWxlY3QgYSB0cmFjayBmb2xsb3dpbmcgdGhpcyBwcmVjZWRlbmNlOgogICogLSBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHtAbGluayBUZXh0VHJhY2t9J3MgbGFuZ3VhZ2UgYW5kIGtpbmQKICAqIC0gbWF0Y2hlcyB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCB7QGxpbmsgVGV4dFRyYWNrfSdzIGxhbmd1YWdlIG9ubHkKICAqIC0gaXMgdGhlIGZpcnN0IGRlZmF1bHQgY2FwdGlvbnMgdHJhY2sKICAqIC0gaXMgdGhlIGZpcnN0IGRlZmF1bHQgZGVzY3JpcHRpb25zIHRyYWNrCiAgKgogICogQGxpc3RlbnMgUGxheWVyI2xvYWRzdGFydAogICovCgoKICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS5wcmVzZWxlY3RUcmFjayA9IGZ1bmN0aW9uIHByZXNlbGVjdFRyYWNrKCkgewogICAgdmFyIG1vZGVzID0geyBjYXB0aW9uczogMSwgc3VidGl0bGVzOiAxIH07CiAgICB2YXIgdHJhY2tMaXN0ID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja3MoKTsKICAgIHZhciB1c2VyUHJlZiA9IHRoaXMucGxheWVyXy5jYWNoZV8uc2VsZWN0ZWRMYW5ndWFnZTsKICAgIHZhciBmaXJzdERlc2MgPSB2b2lkIDA7CiAgICB2YXIgZmlyc3RDYXB0aW9ucyA9IHZvaWQgMDsKICAgIHZhciBwcmVmZXJyZWRUcmFjayA9IHZvaWQgMDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGlzdC5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdHJhY2sgPSB0cmFja0xpc3RbaV07CgogICAgICBpZiAodXNlclByZWYgJiYgdXNlclByZWYuZW5hYmxlZCAmJiB1c2VyUHJlZi5sYW5ndWFnZSA9PT0gdHJhY2subGFuZ3VhZ2UpIHsKICAgICAgICAvLyBBbHdheXMgY2hvb3NlIHRoZSB0cmFjayB0aGF0IG1hdGNoZXMgYm90aCBsYW5ndWFnZSBhbmQga2luZAogICAgICAgIGlmICh0cmFjay5raW5kID09PSB1c2VyUHJlZi5raW5kKSB7CiAgICAgICAgICBwcmVmZXJyZWRUcmFjayA9IHRyYWNrOwogICAgICAgICAgLy8gb3IgY2hvb3NlIHRoZSBmaXJzdCB0cmFjayB0aGF0IG1hdGNoZXMgbGFuZ3VhZ2UKICAgICAgICB9IGVsc2UgaWYgKCFwcmVmZXJyZWRUcmFjaykgewogICAgICAgICAgcHJlZmVycmVkVHJhY2sgPSB0cmFjazsKICAgICAgICB9CgogICAgICAgIC8vIGNsZWFyIGV2ZXJ5dGhpbmcgaWYgb2ZmVGV4dFRyYWNrTWVudUl0ZW0gd2FzIGNsaWNrZWQKICAgICAgfSBlbHNlIGlmICh1c2VyUHJlZiAmJiAhdXNlclByZWYuZW5hYmxlZCkgewogICAgICAgIHByZWZlcnJlZFRyYWNrID0gbnVsbDsKICAgICAgICBmaXJzdERlc2MgPSBudWxsOwogICAgICAgIGZpcnN0Q2FwdGlvbnMgPSBudWxsOwogICAgICB9IGVsc2UgaWYgKHRyYWNrWydkZWZhdWx0J10pIHsKICAgICAgICBpZiAodHJhY2sua2luZCA9PT0gJ2Rlc2NyaXB0aW9ucycgJiYgIWZpcnN0RGVzYykgewogICAgICAgICAgZmlyc3REZXNjID0gdHJhY2s7CiAgICAgICAgfSBlbHNlIGlmICh0cmFjay5raW5kIGluIG1vZGVzICYmICFmaXJzdENhcHRpb25zKSB7CiAgICAgICAgICBmaXJzdENhcHRpb25zID0gdHJhY2s7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gVGhlIHByZWZlcnJlZFRyYWNrIG1hdGNoZXMgdGhlIHVzZXIgcHJlZmVyZW5jZSBhbmQgdGFrZXMKICAgIC8vIHByZWNlbmRlbmNlIG92ZXIgYWxsIHRoZSBvdGhlciB0cmFja3MuCiAgICAvLyBTbywgZGlzcGxheSB0aGUgcHJlZmVycmVkVHJhY2sgYmVmb3JlIHRoZSBmaXJzdCBkZWZhdWx0IHRyYWNrCiAgICAvLyBhbmQgdGhlIHN1YnRpdGxlcy9jYXB0aW9ucyB0cmFjayBiZWZvcmUgdGhlIGRlc2NyaXB0aW9ucyB0cmFjawogICAgaWYgKHByZWZlcnJlZFRyYWNrKSB7CiAgICAgIHByZWZlcnJlZFRyYWNrLm1vZGUgPSAnc2hvd2luZyc7CiAgICB9IGVsc2UgaWYgKGZpcnN0Q2FwdGlvbnMpIHsKICAgICAgZmlyc3RDYXB0aW9ucy5tb2RlID0gJ3Nob3dpbmcnOwogICAgfSBlbHNlIGlmIChmaXJzdERlc2MpIHsKICAgICAgZmlyc3REZXNjLm1vZGUgPSAnc2hvd2luZyc7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVHVybiBkaXNwbGF5IG9mIHtAbGluayBUZXh0VHJhY2t9J3MgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBpbnRvIHRoZSBvdGhlciBzdGF0ZS4KICAgKiBUaGVyZSBhcmUgb25seSB0d28gc3RhdGVzOgogICAqIC0gJ3Nob3duJwogICAqIC0gJ2hpZGRlbicKICAgKgogICAqIEBsaXN0ZW5zIFBsYXllciNsb2Fkc3RhcnQKICAgKi8KCgogIFRleHRUcmFja0Rpc3BsYXkucHJvdG90eXBlLnRvZ2dsZURpc3BsYXkgPSBmdW5jdGlvbiB0b2dnbGVEaXNwbGF5KCkgewogICAgaWYgKHRoaXMucGxheWVyXy50ZWNoXyAmJiB0aGlzLnBsYXllcl8udGVjaF8uZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7CiAgICAgIHRoaXMuaGlkZSgpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zaG93KCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIHRoZSB7QGxpbmsgQ29tcG9uZW50fSdzIERPTSBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCgoKICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkgewogICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiAndmpzLXRleHQtdHJhY2stZGlzcGxheScKICAgIH0sIHsKICAgICAgJ2FyaWEtbGl2ZSc6ICdvZmYnLAogICAgICAnYXJpYS1hdG9taWMnOiAndHJ1ZScKICAgIH0pOwogIH07CgogIC8qKgogICAqIENsZWFyIGFsbCBkaXNwbGF5ZWQge0BsaW5rIFRleHRUcmFja31zLgogICAqLwoKCiAgVGV4dFRyYWNrRGlzcGxheS5wcm90b3R5cGUuY2xlYXJEaXNwbGF5ID0gZnVuY3Rpb24gY2xlYXJEaXNwbGF5KCkgewogICAgaWYgKHR5cGVvZiB3aW5kb3dfMS5XZWJWVFQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgd2luZG93XzEuV2ViVlRULnByb2Nlc3NDdWVzKHdpbmRvd18xLCBbXSwgdGhpcy5lbF8pOwogICAgfQogIH07CgogIC8qKgogICAqIFVwZGF0ZSB0aGUgZGlzcGxheWVkIFRleHRUcmFjayB3aGVuIGEgZWl0aGVyIGEge0BsaW5rIFBsYXllciN0ZXh0dHJhY2tjaGFuZ2V9IG9yCiAgICogYSB7QGxpbmsgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2V9IGlzIGZpcmVkLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3RleHR0cmFja2NoYW5nZQogICAqIEBsaXN0ZW5zIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlCiAgICovCgoKICBUZXh0VHJhY2tEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVEaXNwbGF5ID0gZnVuY3Rpb24gdXBkYXRlRGlzcGxheSgpIHsKICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpOwoKICAgIHRoaXMuY2xlYXJEaXNwbGF5KCk7CgogICAgLy8gVHJhY2sgZGlzcGxheSBwcmlvcml0aXphdGlvbiBtb2RlbDogaWYgbXVsdGlwbGUgdHJhY2tzIGFyZSAnc2hvd2luZycsCiAgICAvLyAgZGlzcGxheSB0aGUgZmlyc3QgJ3N1YnRpdGxlcycgb3IgJ2NhcHRpb25zJyB0cmFjayB3aGljaCBpcyAnc2hvd2luZycsCiAgICAvLyAgb3RoZXJ3aXNlIGRpc3BsYXkgdGhlIGZpcnN0ICdkZXNjcmlwdGlvbnMnIHRyYWNrIHdoaWNoIGlzICdzaG93aW5nJwoKICAgIHZhciBkZXNjcmlwdGlvbnNUcmFjayA9IG51bGw7CiAgICB2YXIgY2FwdGlvbnNTdWJ0aXRsZXNUcmFjayA9IG51bGw7CiAgICB2YXIgaSA9IHRyYWNrcy5sZW5ndGg7CgogICAgd2hpbGUgKGktLSkgewogICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07CgogICAgICBpZiAodHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7CiAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09ICdkZXNjcmlwdGlvbnMnKSB7CiAgICAgICAgICBkZXNjcmlwdGlvbnNUcmFjayA9IHRyYWNrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYXB0aW9uc1N1YnRpdGxlc1RyYWNrID0gdHJhY2s7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGNhcHRpb25zU3VidGl0bGVzVHJhY2spIHsKICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnKSAhPT0gJ29mZicpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ29mZicpOwogICAgICB9CiAgICAgIHRoaXMudXBkYXRlRm9yVHJhY2soY2FwdGlvbnNTdWJ0aXRsZXNUcmFjayk7CiAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uc1RyYWNrKSB7CiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1saXZlJykgIT09ICdhc3NlcnRpdmUnKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdhc3NlcnRpdmUnKTsKICAgICAgfQogICAgICB0aGlzLnVwZGF0ZUZvclRyYWNrKGRlc2NyaXB0aW9uc1RyYWNrKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBBZGQgYW4ge0BsaW5rIFRleHR0cmFja30gdG8gdG8gdGhlIHtAbGluayBUZWNofXMge0BsaW5rIFRleHRUcmFja0xpc3R9LgogICAqCiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHRyYWNrCiAgICogICAgICAgIFRleHQgdHJhY2sgb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0LgogICAqLwoKCiAgVGV4dFRyYWNrRGlzcGxheS5wcm90b3R5cGUudXBkYXRlRm9yVHJhY2sgPSBmdW5jdGlvbiB1cGRhdGVGb3JUcmFjayh0cmFjaykgewogICAgaWYgKHR5cGVvZiB3aW5kb3dfMS5XZWJWVFQgIT09ICdmdW5jdGlvbicgfHwgIXRyYWNrLmFjdGl2ZUN1ZXMpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBvdmVycmlkZXMgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrU2V0dGluZ3MuZ2V0VmFsdWVzKCk7CiAgICB2YXIgY3VlcyA9IFtdOwoKICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0cmFjay5hY3RpdmVDdWVzLmxlbmd0aDsgX2krKykgewogICAgICBjdWVzLnB1c2godHJhY2suYWN0aXZlQ3Vlc1tfaV0pOwogICAgfQoKICAgIHdpbmRvd18xLldlYlZUVC5wcm9jZXNzQ3Vlcyh3aW5kb3dfMSwgY3VlcywgdGhpcy5lbF8pOwoKICAgIHZhciBpID0gY3Vlcy5sZW5ndGg7CgogICAgd2hpbGUgKGktLSkgewogICAgICB2YXIgY3VlID0gY3Vlc1tpXTsKCiAgICAgIGlmICghY3VlKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHZhciBjdWVEaXYgPSBjdWUuZGlzcGxheVN0YXRlOwoKICAgICAgaWYgKG92ZXJyaWRlcy5jb2xvcikgewogICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLmNvbG9yID0gb3ZlcnJpZGVzLmNvbG9yOwogICAgICB9CiAgICAgIGlmIChvdmVycmlkZXMudGV4dE9wYWNpdHkpIHsKICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYuZmlyc3RDaGlsZCwgJ2NvbG9yJywgY29uc3RydWN0Q29sb3Iob3ZlcnJpZGVzLmNvbG9yIHx8ICcjZmZmJywgb3ZlcnJpZGVzLnRleHRPcGFjaXR5KSk7CiAgICAgIH0KICAgICAgaWYgKG92ZXJyaWRlcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBvdmVycmlkZXMuYmFja2dyb3VuZENvbG9yOwogICAgICB9CiAgICAgIGlmIChvdmVycmlkZXMuYmFja2dyb3VuZE9wYWNpdHkpIHsKICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYuZmlyc3RDaGlsZCwgJ2JhY2tncm91bmRDb2xvcicsIGNvbnN0cnVjdENvbG9yKG92ZXJyaWRlcy5iYWNrZ3JvdW5kQ29sb3IgfHwgJyMwMDAnLCBvdmVycmlkZXMuYmFja2dyb3VuZE9wYWNpdHkpKTsKICAgICAgfQogICAgICBpZiAob3ZlcnJpZGVzLndpbmRvd0NvbG9yKSB7CiAgICAgICAgaWYgKG92ZXJyaWRlcy53aW5kb3dPcGFjaXR5KSB7CiAgICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYsICdiYWNrZ3JvdW5kQ29sb3InLCBjb25zdHJ1Y3RDb2xvcihvdmVycmlkZXMud2luZG93Q29sb3IsIG92ZXJyaWRlcy53aW5kb3dPcGFjaXR5KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1ZURpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBvdmVycmlkZXMud2luZG93Q29sb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlKSB7CiAgICAgICAgaWYgKG92ZXJyaWRlcy5lZGdlU3R5bGUgPT09ICdkcm9wc2hhZG93JykgewogICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUudGV4dFNoYWRvdyA9ICcycHggMnB4IDNweCAnICsgZGFya0dyYXkgKyAnLCAycHggMnB4IDRweCAnICsgZGFya0dyYXkgKyAnLCAycHggMnB4IDVweCAnICsgZGFya0dyYXk7CiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAncmFpc2VkJykgewogICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUudGV4dFNoYWRvdyA9ICcxcHggMXB4ICcgKyBkYXJrR3JheSArICcsIDJweCAycHggJyArIGRhcmtHcmF5ICsgJywgM3B4IDNweCAnICsgZGFya0dyYXk7CiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAnZGVwcmVzc2VkJykgewogICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUudGV4dFNoYWRvdyA9ICcxcHggMXB4ICcgKyBsaWdodEdyYXkgKyAnLCAwIDFweCAnICsgbGlnaHRHcmF5ICsgJywgLTFweCAtMXB4ICcgKyBkYXJrR3JheSArICcsIDAgLTFweCAnICsgZGFya0dyYXk7CiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAndW5pZm9ybScpIHsKICAgICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLnRleHRTaGFkb3cgPSAnMCAwIDRweCAnICsgZGFya0dyYXkgKyAnLCAwIDAgNHB4ICcgKyBkYXJrR3JheSArICcsIDAgMCA0cHggJyArIGRhcmtHcmF5ICsgJywgMCAwIDRweCAnICsgZGFya0dyYXk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvdmVycmlkZXMuZm9udFBlcmNlbnQgJiYgb3ZlcnJpZGVzLmZvbnRQZXJjZW50ICE9PSAxKSB7CiAgICAgICAgdmFyIGZvbnRTaXplID0gd2luZG93XzEucGFyc2VGbG9hdChjdWVEaXYuc3R5bGUuZm9udFNpemUpOwoKICAgICAgICBjdWVEaXYuc3R5bGUuZm9udFNpemUgPSBmb250U2l6ZSAqIG92ZXJyaWRlcy5mb250UGVyY2VudCArICdweCc7CiAgICAgICAgY3VlRGl2LnN0eWxlLmhlaWdodCA9ICdhdXRvJzsKICAgICAgICBjdWVEaXYuc3R5bGUudG9wID0gJ2F1dG8nOwogICAgICAgIGN1ZURpdi5zdHlsZS5ib3R0b20gPSAnMnB4JzsKICAgICAgfQogICAgICBpZiAob3ZlcnJpZGVzLmZvbnRGYW1pbHkgJiYgb3ZlcnJpZGVzLmZvbnRGYW1pbHkgIT09ICdkZWZhdWx0JykgewogICAgICAgIGlmIChvdmVycmlkZXMuZm9udEZhbWlseSA9PT0gJ3NtYWxsLWNhcHMnKSB7CiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5mb250VmFyaWFudCA9ICdzbWFsbC1jYXBzJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUuZm9udEZhbWlseSA9IGZvbnRNYXBbb3ZlcnJpZGVzLmZvbnRGYW1pbHldOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIHJldHVybiBUZXh0VHJhY2tEaXNwbGF5Owp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja0Rpc3BsYXknLCBUZXh0VHJhY2tEaXNwbGF5KTsKCi8qKgogKiBAZmlsZSBsb2FkaW5nLXNwaW5uZXIuanMKICovCi8qKgogKiBBIGxvYWRpbmcgc3Bpbm5lciBmb3IgdXNlIGR1cmluZyB3YWl0aW5nL2xvYWRpbmcgZXZlbnRzLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgTG9hZGluZ1NwaW5uZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKExvYWRpbmdTcGlubmVyLCBfQ29tcG9uZW50KTsKCiAgZnVuY3Rpb24gTG9hZGluZ1NwaW5uZXIoKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMb2FkaW5nU3Bpbm5lcik7CiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgTG9hZGluZ1NwaW5uZXJgcyBET00gZWxlbWVudC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZG9tIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuCiAgICovCiAgTG9hZGluZ1NwaW5uZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtbG9hZGluZy1zcGlubmVyJywKICAgICAgZGlyOiAnbHRyJwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIExvYWRpbmdTcGlubmVyOwp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0xvYWRpbmdTcGlubmVyJywgTG9hZGluZ1NwaW5uZXIpOwoKLyoqCiAqIEBmaWxlIGJ1dHRvbi5qcwogKi8KLyoqCiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBidXR0b25zLgogKgogKiBAZXh0ZW5kcyBDbGlja2FibGVDb21wb25lbnQKICovCgp2YXIgQnV0dG9uID0gZnVuY3Rpb24gKF9DbGlja2FibGVDb21wb25lbnQpIHsKICBpbmhlcml0cyhCdXR0b24sIF9DbGlja2FibGVDb21wb25lbnQpOwoKICBmdW5jdGlvbiBCdXR0b24oKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCdXR0b24pOwogICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NsaWNrYWJsZUNvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICB9CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYEJ1dHRvbmBzIERPTSBlbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9ImJ1dHRvbiJdCiAgICogICAgICAgIFRoZSBlbGVtZW50J3Mgbm9kZSB0eXBlLiBUaGlzIGFyZ3VtZW50IGlzIElHTk9SRUQ6IG5vIG1hdHRlciB3aGF0CiAgICogICAgICAgIGlzIHBhc3NlZCwgaXQgd2lsbCBhbHdheXMgY3JlYXRlIGEgYGJ1dHRvbmAgZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dCiAgICogICAgICAgIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbYXR0cmlidXRlcz17fV0KICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLgogICAqLwogIEJ1dHRvbi5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCh0YWcpIHsKICAgIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307CgogICAgdGFnID0gJ2J1dHRvbic7CgogICAgcHJvcHMgPSBhc3NpZ24oewogICAgICBpbm5lckhUTUw6ICc8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSIgY2xhc3M9InZqcy1pY29uLXBsYWNlaG9sZGVyIj48L3NwYW4+JywKICAgICAgY2xhc3NOYW1lOiB0aGlzLmJ1aWxkQ1NTQ2xhc3MoKQogICAgfSwgcHJvcHMpOwoKICAgIC8vIEFkZCBhdHRyaWJ1dGVzIGZvciBidXR0b24gZWxlbWVudAogICAgYXR0cmlidXRlcyA9IGFzc2lnbih7CgogICAgICAvLyBOZWNlc3Nhcnkgc2luY2UgdGhlIGRlZmF1bHQgYnV0dG9uIHR5cGUgaXMgInN1Ym1pdCIKICAgICAgJ3R5cGUnOiAnYnV0dG9uJywKCiAgICAgIC8vIGxldCB0aGUgc2NyZWVuIHJlYWRlciB1c2VyIGtub3cgdGhhdCB0aGUgdGV4dCBvZiB0aGUgYnV0dG9uIG1heSBjaGFuZ2UKICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnCiAgICB9LCBhdHRyaWJ1dGVzKTsKCiAgICB2YXIgZWwgPSBDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdGFnLCBwcm9wcywgYXR0cmlidXRlcyk7CgogICAgdGhpcy5jcmVhdGVDb250cm9sVGV4dEVsKGVsKTsKCiAgICByZXR1cm4gZWw7CiAgfTsKCiAgLyoqCiAgICogQWRkIGEgY2hpbGQgYENvbXBvbmVudGAgaW5zaWRlIG9mIHRoaXMgYEJ1dHRvbmAuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ3xDb21wb25lbnR9IGNoaWxkCiAgICogICAgICAgIFRoZSBuYW1lIG9yIGluc3RhbmNlIG9mIGEgY2hpbGQgdG8gYWRkLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGdldCBwYXNzZWQgdG8gY2hpbGRyZW4gb2YKICAgKiAgICAgICAgdGhlIGNoaWxkLgogICAqCiAgICogQHJldHVybiB7Q29tcG9uZW50fQogICAqICAgICAgICAgVGhlIGBDb21wb25lbnRgIHRoYXQgZ2V0cyBhZGRlZCBhcyBhIGNoaWxkLiBXaGVuIHVzaW5nIGEgc3RyaW5nIHRoZQogICAqICAgICAgICAgYENvbXBvbmVudGAgd2lsbCBnZXQgY3JlYXRlZCBieSB0aGlzIHByb2Nlc3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDUKICAgKi8KCgogIEJ1dHRvbi5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiBhZGRDaGlsZChjaGlsZCkgewogICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OwoKICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CgogICAgbG9nJDEud2FybignQWRkaW5nIGFuIGFjdGlvbmFibGUgKHVzZXIgY29udHJvbGxhYmxlKSBjaGlsZCB0byBhIEJ1dHRvbiAoJyArIGNsYXNzTmFtZSArICcpIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIENsaWNrYWJsZUNvbXBvbmVudCBpbnN0ZWFkLicpOwoKICAgIC8vIEF2b2lkIHRoZSBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBieSBDbGlja2FibGVDb21wb25lbnQncyBhZGRDaGlsZCBtZXRob2QKICAgIHJldHVybiBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkLmNhbGwodGhpcywgY2hpbGQsIG9wdGlvbnMpOwogIH07CgogIC8qKgogICAqIEVuYWJsZSB0aGUgYEJ1dHRvbmAgZWxlbWVudCBzbyB0aGF0IGl0IGNhbiBiZSBhY3RpdmF0ZWQgb3IgY2xpY2tlZC4gVXNlIHRoaXMgd2l0aAogICAqIHtAbGluayBCdXR0b24jZGlzYWJsZX0uCiAgICovCgoKICBCdXR0b24ucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZSgpIHsKICAgIF9DbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpOwogICAgdGhpcy5lbF8ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpOwogIH07CgogIC8qKgogICAqIERpc2FibGUgdGhlIGBCdXR0b25gIGVsZW1lbnQgc28gdGhhdCBpdCBjYW5ub3QgYmUgYWN0aXZhdGVkIG9yIGNsaWNrZWQuIFVzZSB0aGlzIHdpdGgKICAgKiB7QGxpbmsgQnV0dG9uI2VuYWJsZX0uCiAgICovCgoKICBCdXR0b24ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgX0NsaWNrYWJsZUNvbXBvbmVudC5wcm90b3R5cGUuZGlzYWJsZS5jYWxsKHRoaXMpOwogICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH07CgogIC8qKgogICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBCdXR0b25gIGhhcyBmb2N1cyBhbmQgYGtleWRvd25gIGlzIHRyaWdnZXJlZCB2aWEgYSBrZXkKICAgKiBwcmVzcy4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGdldCBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBrZXlkb3duCiAgICovCgoKICBCdXR0b24ucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHsKCiAgICAvLyBJZ25vcmUgU3BhY2UgKDMyKSBvciBFbnRlciAoMTMpIGtleSBvcGVyYXRpb24sIHdoaWNoIGlzIGhhbmRsZWQgYnkgdGhlIGJyb3dzZXIgZm9yIGEgYnV0dG9uLgogICAgaWYgKGV2ZW50LndoaWNoID09PSAzMiB8fCBldmVudC53aGljaCA9PT0gMTMpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFBhc3Mga2V5cHJlc3MgaGFuZGxpbmcgdXAgZm9yIHVuc3VwcG9ydGVkIGtleXMKICAgIF9DbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmhhbmRsZUtleVByZXNzLmNhbGwodGhpcywgZXZlbnQpOwogIH07CgogIHJldHVybiBCdXR0b247Cn0oQ2xpY2thYmxlQ29tcG9uZW50KTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQnV0dG9uJywgQnV0dG9uKTsKCi8qKgogKiBAZmlsZSBiaWctcGxheS1idXR0b24uanMKICovCi8qKgogKiBUaGUgaW5pdGlhbCBwbGF5IGJ1dHRvbiB0aGF0IHNob3dzIGJlZm9yZSB0aGUgdmlkZW8gaGFzIHBsYXllZC4gVGhlIGhpZGluZyBvZiB0aGUKICogYEJpZ1BsYXlCdXR0b25gIGdldCBkb25lIHZpYSBDU1MgYW5kIGBQbGF5ZXJgIHN0YXRlcy4KICoKICogQGV4dGVuZHMgQnV0dG9uCiAqLwoKdmFyIEJpZ1BsYXlCdXR0b24gPSBmdW5jdGlvbiAoX0J1dHRvbikgewogIGluaGVyaXRzKEJpZ1BsYXlCdXR0b24sIF9CdXR0b24pOwoKICBmdW5jdGlvbiBCaWdQbGF5QnV0dG9uKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQmlnUGxheUJ1dHRvbik7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMubW91c2V1c2VkXyA9IGZhbHNlOwoKICAgIF90aGlzLm9uKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVNb3VzZURvd24pOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LiBBbHdheXMgcmV0dXJucyAndmpzLWJpZy1wbGF5LWJ1dHRvbicuCiAgICovCgoKICBCaWdQbGF5QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWJpZy1wbGF5LWJ1dHRvbic7CiAgfTsKCiAgLyoqCiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgYEJpZ1BsYXlCdXR0b25gICJjbGlja2VkIi4gU2VlIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9CiAgICogZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUKICAgKiAgICAgICAgY2FsbGVkLgogICAqCiAgICogQGxpc3RlbnMgdGFwCiAgICogQGxpc3RlbnMgY2xpY2sKICAgKi8KCgogIEJpZ1BsYXlCdXR0b24ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHsKICAgIHZhciBwbGF5UHJvbWlzZSA9IHRoaXMucGxheWVyXy5wbGF5KCk7CgogICAgLy8gZXhpdCBlYXJseSBpZiBjbGlja2VkIHZpYSB0aGUgbW91c2UKICAgIGlmICh0aGlzLm1vdXNldXNlZF8gJiYgZXZlbnQuY2xpZW50WCAmJiBldmVudC5jbGllbnRZKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgY2IgPSB0aGlzLnBsYXllcl8uZ2V0Q2hpbGQoJ2NvbnRyb2xCYXInKTsKICAgIHZhciBwbGF5VG9nZ2xlID0gY2IgJiYgY2IuZ2V0Q2hpbGQoJ3BsYXlUb2dnbGUnKTsKCiAgICBpZiAoIXBsYXlUb2dnbGUpIHsKICAgICAgdGhpcy5wbGF5ZXJfLmZvY3VzKCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgcGxheUZvY3VzID0gZnVuY3Rpb24gcGxheUZvY3VzKCkgewogICAgICByZXR1cm4gcGxheVRvZ2dsZS5mb2N1cygpOwogICAgfTsKCiAgICBpZiAoaXNQcm9taXNlKHBsYXlQcm9taXNlKSkgewogICAgICBwbGF5UHJvbWlzZS50aGVuKHBsYXlGb2N1cywgZnVuY3Rpb24gKCkge30pOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXRUaW1lb3V0KHBsYXlGb2N1cywgMSk7CiAgICB9CiAgfTsKCiAgQmlnUGxheUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVLZXlQcmVzcyhldmVudCkgewogICAgdGhpcy5tb3VzZXVzZWRfID0gZmFsc2U7CgogICAgX0J1dHRvbi5wcm90b3R5cGUuaGFuZGxlS2V5UHJlc3MuY2FsbCh0aGlzLCBldmVudCk7CiAgfTsKCiAgQmlnUGxheUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2ZW50KSB7CiAgICB0aGlzLm1vdXNldXNlZF8gPSB0cnVlOwogIH07CgogIHJldHVybiBCaWdQbGF5QnV0dG9uOwp9KEJ1dHRvbik7CgovKioKICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgQmlnUGxheUJ1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCB0byBmb3IgbG9jYWxpemF0aW9uLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KCgpCaWdQbGF5QnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnUGxheSBWaWRlbyc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0JpZ1BsYXlCdXR0b24nLCBCaWdQbGF5QnV0dG9uKTsKCi8qKgogKiBAZmlsZSBjbG9zZS1idXR0b24uanMKICovCi8qKgogKiBUaGUgYENsb3NlQnV0dG9uYCBpcyBhIGB7QGxpbmsgQnV0dG9ufWAgdGhhdCBmaXJlcyBhIGBjbG9zZWAgZXZlbnQgd2hlbgogKiBpdCBnZXRzIGNsaWNrZWQuCiAqCiAqIEBleHRlbmRzIEJ1dHRvbgogKi8KCnZhciBDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIChfQnV0dG9uKSB7CiAgaW5oZXJpdHMoQ2xvc2VCdXR0b24sIF9CdXR0b24pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gQ2xvc2VCdXR0b24ocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDbG9zZUJ1dHRvbik7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMuY29udHJvbFRleHQob3B0aW9ucyAmJiBvcHRpb25zLmNvbnRyb2xUZXh0IHx8IF90aGlzLmxvY2FsaXplKCdDbG9zZScpKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIENsb3NlQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWNsb3NlLWJ1dHRvbiAnICsgX0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGBDbG9zZUJ1dHRvbmAgZ2V0cyBjbGlja2VkLiBTZWUKICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUNsaWNrfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGVuIHRoaXMgd2lsbCBiZQogICAqIHRyaWdnZXJlZAogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqIEBmaXJlcyBDbG9zZUJ1dHRvbiNjbG9zZQogICAqLwoKCiAgQ2xvc2VCdXR0b24ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHsKCiAgICAvKioKICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBhIGBDbG9zZUJ1dHRvbmAgaXMgY2xpY2tlZC4KICAgICAqCiAgICAgKiBAZXZlbnQgQ2xvc2VCdXR0b24jY2xvc2UKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqCiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtidWJibGVzPWZhbHNlXQogICAgICogICAgICAgICAgIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZSBjbG9zZSBldmVudCBkb2VzIG5vdAogICAgICogICAgICAgICAgIGJ1YmJsZSB1cCB0byBwYXJlbnRzIGlmIHRoZXJlIGlzIG5vIGxpc3RlbmVyCiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcih7IHR5cGU6ICdjbG9zZScsIGJ1YmJsZXM6IGZhbHNlIH0pOwogIH07CgogIHJldHVybiBDbG9zZUJ1dHRvbjsKfShCdXR0b24pOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDbG9zZUJ1dHRvbicsIENsb3NlQnV0dG9uKTsKCi8qKgogKiBAZmlsZSBwbGF5LXRvZ2dsZS5qcwogKi8KLyoqCiAqIEJ1dHRvbiB0byB0b2dnbGUgYmV0d2VlbiBwbGF5IGFuZCBwYXVzZS4KICoKICogQGV4dGVuZHMgQnV0dG9uCiAqLwoKdmFyIFBsYXlUb2dnbGUgPSBmdW5jdGlvbiAoX0J1dHRvbikgewogIGluaGVyaXRzKFBsYXlUb2dnbGUsIF9CdXR0b24pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIFBsYXlUb2dnbGUocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5VG9nZ2xlKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9CdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5vbihwbGF5ZXIsICdwbGF5JywgX3RoaXMuaGFuZGxlUGxheSk7CiAgICBfdGhpcy5vbihwbGF5ZXIsICdwYXVzZScsIF90aGlzLmhhbmRsZVBhdXNlKTsKICAgIF90aGlzLm9uKHBsYXllciwgJ2VuZGVkJywgX3RoaXMuaGFuZGxlRW5kZWQpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LgogICAqLwoKCiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1wbGF5LWNvbnRyb2wgJyArIF9CdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYFBsYXlUb2dnbGVgIGlzICJjbGlja2VkIi4gU2VlCiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqLwoKCiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkgewogICAgICB0aGlzLnBsYXllcl8ucGxheSgpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5wbGF5ZXJfLnBhdXNlKCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVGhpcyBnZXRzIGNhbGxlZCBvbmNlIGFmdGVyIHRoZSB2aWRlbyBoYXMgZW5kZWQgYW5kIHRoZSB1c2VyIHNlZWtzIHNvIHRoYXQKICAgKiB3ZSBjYW4gY2hhbmdlIHRoZSByZXBsYXkgYnV0dG9uIGJhY2sgdG8gYSBwbGF5IGJ1dHRvbi4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3NlZWtlZAogICAqLwoKCiAgUGxheVRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlU2Vla2VkID0gZnVuY3Rpb24gaGFuZGxlU2Vla2VkKGV2ZW50KSB7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTsKCiAgICBpZiAodGhpcy5wbGF5ZXJfLnBhdXNlZCgpKSB7CiAgICAgIHRoaXMuaGFuZGxlUGF1c2UoZXZlbnQpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oYW5kbGVQbGF5KGV2ZW50KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBBZGQgdGhlIHZqcy1wbGF5aW5nIGNsYXNzIHRvIHRoZSBlbGVtZW50IHNvIGl0IGNhbiBjaGFuZ2UgYXBwZWFyYW5jZS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3BsYXkKICAgKi8KCgogIFBsYXlUb2dnbGUucHJvdG90eXBlLmhhbmRsZVBsYXkgPSBmdW5jdGlvbiBoYW5kbGVQbGF5KGV2ZW50KSB7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wYXVzZWQnKTsKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1wbGF5aW5nJyk7CiAgICAvLyBjaGFuZ2UgdGhlIGJ1dHRvbiB0ZXh0IHRvICJQYXVzZSIKICAgIHRoaXMuY29udHJvbFRleHQoJ1BhdXNlJyk7CiAgfTsKCiAgLyoqCiAgICogQWRkIHRoZSB2anMtcGF1c2VkIGNsYXNzIHRvIHRoZSBlbGVtZW50IHNvIGl0IGNhbiBjaGFuZ2UgYXBwZWFyYW5jZS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3BhdXNlCiAgICovCgoKICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVQYXVzZSA9IGZ1bmN0aW9uIGhhbmRsZVBhdXNlKGV2ZW50KSB7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGxheWluZycpOwogICAgdGhpcy5hZGRDbGFzcygndmpzLXBhdXNlZCcpOwogICAgLy8gY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byAiUGxheSIKICAgIHRoaXMuY29udHJvbFRleHQoJ1BsYXknKTsKICB9OwoKICAvKioKICAgKiBBZGQgdGhlIHZqcy1lbmRlZCBjbGFzcyB0byB0aGUgZWxlbWVudCBzbyBpdCBjYW4gY2hhbmdlIGFwcGVhcmFuY2UKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI2VuZGVkCiAgICovCgoKICBQbGF5VG9nZ2xlLnByb3RvdHlwZS5oYW5kbGVFbmRlZCA9IGZ1bmN0aW9uIGhhbmRsZUVuZGVkKGV2ZW50KSB7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGxheWluZycpOwogICAgdGhpcy5hZGRDbGFzcygndmpzLWVuZGVkJyk7CiAgICAvLyBjaGFuZ2UgdGhlIGJ1dHRvbiB0ZXh0IHRvICJSZXBsYXkiCiAgICB0aGlzLmNvbnRyb2xUZXh0KCdSZXBsYXknKTsKCiAgICAvLyBvbiB0aGUgbmV4dCBzZWVrIHJlbW92ZSB0aGUgcmVwbGF5IGJ1dHRvbgogICAgdGhpcy5vbmUodGhpcy5wbGF5ZXJfLCAnc2Vla2VkJywgdGhpcy5oYW5kbGVTZWVrZWQpOwogIH07CgogIHJldHVybiBQbGF5VG9nZ2xlOwp9KEJ1dHRvbik7CgovKioKICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgUGxheVRvZ2dsZWBzIGNvbnRyb2xzLiBBZGRlZCBmb3IgbG9jYWxpemF0aW9uLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KCgpQbGF5VG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnUGxheSc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXlUb2dnbGUnLCBQbGF5VG9nZ2xlKTsKCi8qKgogKiBAZmlsZSBmb3JtYXQtdGltZS5qcwogKiBAbW9kdWxlIEZvcm1hdC10aW1lCiAqLwoKLyoqCiAqIEZvcm1hdCBzZWNvbmRzIGFzIGEgdGltZSBzdHJpbmcsIEg6TU06U1Mgb3IgTTpTUy4gU3VwcGx5aW5nIGEgZ3VpZGUgKGluIHNlY29uZHMpCiAqIHdpbGwgZm9yY2UgYSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcyB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBndWlkZS4KICoKICogQHBhcmFtIHtudW1iZXJ9IHNlY29uZHMKICogICAgICAgIE51bWJlciBvZiBzZWNvbmRzIHRvIGJlIHR1cm5lZCBpbnRvIGEgc3RyaW5nCiAqCiAqIEBwYXJhbSB7bnVtYmVyfSBndWlkZQogKiAgICAgICAgTnVtYmVyIChpbiBzZWNvbmRzKSB0byBtb2RlbCB0aGUgc3RyaW5nIGFmdGVyCiAqCiAqIEByZXR1cm4ge3N0cmluZ30KICogICAgICAgICBUaW1lIGZvcm1hdHRlZCBhcyBIOk1NOlNTIG9yIE06U1MKICovCmZ1bmN0aW9uIGZvcm1hdFRpbWUoc2Vjb25kcykgewogIHZhciBndWlkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogc2Vjb25kczsKCiAgc2Vjb25kcyA9IHNlY29uZHMgPCAwID8gMCA6IHNlY29uZHM7CiAgdmFyIHMgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7CiAgdmFyIG0gPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCAlIDYwKTsKICB2YXIgaCA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDM2MDApOwogIHZhciBnbSA9IE1hdGguZmxvb3IoZ3VpZGUgLyA2MCAlIDYwKTsKICB2YXIgZ2ggPSBNYXRoLmZsb29yKGd1aWRlIC8gMzYwMCk7CgogIC8vIGhhbmRsZSBpbnZhbGlkIHRpbWVzCiAgaWYgKGlzTmFOKHNlY29uZHMpIHx8IHNlY29uZHMgPT09IEluZmluaXR5KSB7CiAgICAvLyAnLScgaXMgZmFsc2UgZm9yIGFsbCByZWxhdGlvbmFsIG9wZXJhdG9ycyAoZS5nLiA8LCA+PSkgc28gdGhpcyBzZXR0aW5nCiAgICAvLyB3aWxsIGFkZCB0aGUgbWluaW11bSBudW1iZXIgb2YgZmllbGRzIHNwZWNpZmllZCBieSB0aGUgZ3VpZGUKICAgIGggPSBtID0gcyA9ICctJzsKICB9CgogIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gc2hvdyBob3VycwogIGggPSBoID4gMCB8fCBnaCA+IDAgPyBoICsgJzonIDogJyc7CgogIC8vIElmIGhvdXJzIGFyZSBzaG93aW5nLCB3ZSBtYXkgbmVlZCB0byBhZGQgYSBsZWFkaW5nIHplcm8uCiAgLy8gQWx3YXlzIHNob3cgYXQgbGVhc3Qgb25lIGRpZ2l0IG9mIG1pbnV0ZXMuCiAgbSA9ICgoaCB8fCBnbSA+PSAxMCkgJiYgbSA8IDEwID8gJzAnICsgbSA6IG0pICsgJzonOwoKICAvLyBDaGVjayBpZiBsZWFkaW5nIHplcm8gaXMgbmVlZCBmb3Igc2Vjb25kcwogIHMgPSBzIDwgMTAgPyAnMCcgKyBzIDogczsKCiAgcmV0dXJuIGggKyBtICsgczsKfQoKLyoqCiAqIEBmaWxlIHRpbWUtZGlzcGxheS5qcwogKi8KLyoqCiAqIERpc3BsYXlzIHRoZSB0aW1lIGxlZnQgaW4gdGhlIHZpZGVvCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBUaW1lRGlzcGxheSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoVGltZURpc3BsYXksIF9Db21wb25lbnQpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIFRpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGltZURpc3BsYXkpOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy51cGRhdGVDb250ZW50KSwgMjUpOwogICAgX3RoaXMub24ocGxheWVyLCAndGltZXVwZGF0ZScsIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KCgogIFRpbWVEaXNwbGF5LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKHBsYWluTmFtZSkgewogICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuYnVpbGRDU1NDbGFzcygpOwogICAgdmFyIGVsID0gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSArICcgdmpzLXRpbWUtY29udHJvbCB2anMtY29udHJvbCcKICAgIH0pOwoKICAgIHRoaXMuY29udGVudEVsXyA9IGNyZWF0ZUVsKCdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lICsgJy1kaXNwbGF5JwogICAgfSwgewogICAgICAvLyB0ZWxsIHNjcmVlbiByZWFkZXJzIG5vdCB0byBhdXRvbWF0aWNhbGx5IHJlYWQgdGhlIHRpbWUgYXMgaXQgY2hhbmdlcwogICAgICAnYXJpYS1saXZlJzogJ29mZicKICAgIH0sIGNyZWF0ZUVsKCdzcGFuJywgewogICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC10ZXh0JywKICAgICAgdGV4dENvbnRlbnQ6IHRoaXMubG9jYWxpemUodGhpcy5jb250cm9sVGV4dF8pCiAgICB9KSk7CgogICAgdGhpcy51cGRhdGVUZXh0Tm9kZV8oKTsKICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsXyk7CiAgICByZXR1cm4gZWw7CiAgfTsKCiAgVGltZURpc3BsYXkucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgdGhpcy5jb250ZW50RWxfID0gbnVsbDsKICAgIHRoaXMudGV4dE5vZGVfID0gbnVsbDsKCiAgICBfQ29tcG9uZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgInJlbWFpbmluZyB0aW1lIiB0ZXh0IG5vZGUgd2l0aCBuZXcgY29udGVudCB1c2luZyB0aGUKICAgKiBjb250ZW50cyBvZiB0aGUgYGZvcm1hdHRlZFRpbWVfYCBwcm9wZXJ0eS4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBUaW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlVGV4dE5vZGVfID0gZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGVfKCkgewogICAgaWYgKCF0aGlzLmNvbnRlbnRFbF8pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdoaWxlICh0aGlzLmNvbnRlbnRFbF8uZmlyc3RDaGlsZCkgewogICAgICB0aGlzLmNvbnRlbnRFbF8ucmVtb3ZlQ2hpbGQodGhpcy5jb250ZW50RWxfLmZpcnN0Q2hpbGQpOwogICAgfQoKICAgIHRoaXMudGV4dE5vZGVfID0gZG9jdW1lbnRfMS5jcmVhdGVUZXh0Tm9kZSh0aGlzLmZvcm1hdHRlZFRpbWVfIHx8ICcwOjAwJyk7CiAgICB0aGlzLmNvbnRlbnRFbF8uYXBwZW5kQ2hpbGQodGhpcy50ZXh0Tm9kZV8pOwogIH07CgogIC8qKgogICAqIEdlbmVyYXRlcyBhIGZvcm1hdHRlZCB0aW1lIGZvciB0aGlzIGNvbXBvbmVudCB0byB1c2UgaW4gZGlzcGxheS4KICAgKgogICAqIEBwYXJhbSAge251bWJlcn0gdGltZQogICAqICAgICAgICAgQSBudW1lcmljIHRpbWUsIGluIHNlY29uZHMuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBBIGZvcm1hdHRlZCB0aW1lCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgVGltZURpc3BsYXkucHJvdG90eXBlLmZvcm1hdFRpbWVfID0gZnVuY3Rpb24gZm9ybWF0VGltZV8odGltZSkgewogICAgcmV0dXJuIGZvcm1hdFRpbWUodGltZSk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlcyB0aGUgdGltZSBkaXNwbGF5IHRleHQgbm9kZSBpZiBpdCBoYXMgd2hhdCB3YXMgcGFzc2VkIGluIGNoYW5nZWQKICAgKiB0aGUgZm9ybWF0dGVkIHRpbWUuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gdGltZQogICAqICAgICAgICBUaGUgdGltZSB0byB1cGRhdGUgdG8KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBUaW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlRm9ybWF0dGVkVGltZV8gPSBmdW5jdGlvbiB1cGRhdGVGb3JtYXR0ZWRUaW1lXyh0aW1lKSB7CiAgICB2YXIgZm9ybWF0dGVkVGltZSA9IHRoaXMuZm9ybWF0VGltZV8odGltZSk7CgogICAgaWYgKGZvcm1hdHRlZFRpbWUgPT09IHRoaXMuZm9ybWF0dGVkVGltZV8pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRoaXMuZm9ybWF0dGVkVGltZV8gPSBmb3JtYXR0ZWRUaW1lOwogICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVUZXh0Tm9kZV8pOwogIH07CgogIC8qKgogICAqIFRvIGJlIGZpbGxlZCBvdXQgaW4gdGhlIGNoaWxkIGNsYXNzLCBzaG91bGQgdXBkYXRlIHRoZSBkaXNwbGF5ZWQgdGltZQogICAqIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgZmFjdCB0aGF0IHRoZSBjdXJyZW50IHRpbWUgaGFzIGNoYW5nZWQuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3RpbWV1cGRhdGUKICAgKi8KCgogIFRpbWVEaXNwbGF5LnByb3RvdHlwZS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gdXBkYXRlQ29udGVudChldmVudCkge307CgogIHJldHVybiBUaW1lRGlzcGxheTsKfShDb21wb25lbnQpOwoKLyoqCiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYFRpbWVEaXNwbGF5YHMgY29udHJvbHMuIEFkZGVkIHRvIGZvciBsb2NhbGl6YXRpb24uCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqIEBwcml2YXRlCiAqLwoKClRpbWVEaXNwbGF5LnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnVGltZSc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RpbWVEaXNwbGF5JywgVGltZURpc3BsYXkpOwoKLyoqCiAqIEBmaWxlIGN1cnJlbnQtdGltZS1kaXNwbGF5LmpzCiAqLwovKioKICogRGlzcGxheXMgdGhlIGN1cnJlbnQgdGltZQogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgQ3VycmVudFRpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9UaW1lRGlzcGxheSkgewogIGluaGVyaXRzKEN1cnJlbnRUaW1lRGlzcGxheSwgX1RpbWVEaXNwbGF5KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBDdXJyZW50VGltZURpc3BsYXkocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDdXJyZW50VGltZURpc3BsYXkpOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RpbWVEaXNwbGF5LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMub24ocGxheWVyLCAnZW5kZWQnLCBfdGhpcy5oYW5kbGVFbmRlZCk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBDdXJyZW50VGltZURpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtY3VycmVudC10aW1lJzsKICB9OwoKICAvKioKICAgKiBVcGRhdGUgY3VycmVudCB0aW1lIGRpc3BsYXkKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGB0aW1ldXBkYXRlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi4KICAgKgogICAqIEBsaXN0ZW5zIFBsYXllciN0aW1ldXBkYXRlCiAgICovCgoKICBDdXJyZW50VGltZURpc3BsYXkucHJvdG90eXBlLnVwZGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiB1cGRhdGVDb250ZW50KGV2ZW50KSB7CiAgICAvLyBBbGxvd3MgZm9yIHNtb290aCBzY3J1YmJpbmcsIHdoZW4gcGxheWVyIGNhbid0IGtlZXAgdXAuCiAgICB2YXIgdGltZSA9IHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7CgogICAgdGhpcy51cGRhdGVGb3JtYXR0ZWRUaW1lXyh0aW1lKTsKICB9OwoKICAvKioKICAgKiBXaGVuIHRoZSBwbGF5ZXIgZmlyZXMgZW5kZWQgdGhlcmUgc2hvdWxkIGJlIG5vIHRpbWUgbGVmdC4gU2FkbHkKICAgKiB0aGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UsIGxldHMgbWFrZSBpdCBzZWVtIGxpa2UgdGhhdCBpcyB0aGUgY2FzZQogICAqIGZvciB1c2Vycy4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGBlbmRlZGAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjZW5kZWQKICAgKi8KCgogIEN1cnJlbnRUaW1lRGlzcGxheS5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkgewogICAgaWYgKCF0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRoaXMucGxheWVyXy5kdXJhdGlvbigpKTsKICB9OwoKICByZXR1cm4gQ3VycmVudFRpbWVEaXNwbGF5Owp9KFRpbWVEaXNwbGF5KTsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBDdXJyZW50VGltZURpc3BsYXlgcyBjb250cm9scy4gQWRkZWQgdG8gZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCgoKQ3VycmVudFRpbWVEaXNwbGF5LnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQ3VycmVudCBUaW1lJzsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ3VycmVudFRpbWVEaXNwbGF5JywgQ3VycmVudFRpbWVEaXNwbGF5KTsKCi8qKgogKiBAZmlsZSBkdXJhdGlvbi1kaXNwbGF5LmpzCiAqLwovKioKICogRGlzcGxheXMgdGhlIGR1cmF0aW9uCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBEdXJhdGlvbkRpc3BsYXkgPSBmdW5jdGlvbiAoX1RpbWVEaXNwbGF5KSB7CiAgaW5oZXJpdHMoRHVyYXRpb25EaXNwbGF5LCBfVGltZURpc3BsYXkpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIER1cmF0aW9uRGlzcGxheShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIER1cmF0aW9uRGlzcGxheSk7CgogICAgLy8gd2UgZG8gbm90IHdhbnQgdG8vbmVlZCB0byB0aHJvdHRsZSBkdXJhdGlvbiBjaGFuZ2VzLAogICAgLy8gYXMgdGhleSBzaG91bGQgYWx3YXlzIGRpc3BsYXkgdGhlIGNoYW5nZWQgZHVyYXRpb24gYXMKICAgIC8vIGl0IGhhcyBjaGFuZ2VkCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UaW1lRGlzcGxheS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLm9uKHBsYXllciwgJ2R1cmF0aW9uY2hhbmdlJywgX3RoaXMudXBkYXRlQ29udGVudCk7CgogICAgLy8gQWxzbyBsaXN0ZW4gZm9yIHRpbWV1cGRhdGUgKGluIHRoZSBwYXJlbnQpIGFuZCBsb2FkZWRtZXRhZGF0YSBiZWNhdXNlIHJlbW92aW5nIHRob3NlCiAgICAvLyBsaXN0ZW5lcnMgY291bGQgaGF2ZSBicm9rZW4gZGVwZW5kZW50IGFwcGxpY2F0aW9ucy9saWJyYXJpZXMuIFRoZXNlCiAgICAvLyBjYW4gbGlrZWx5IGJlIHJlbW92ZWQgZm9yIDcuMC4KICAgIF90aGlzLm9uKHBsYXllciwgJ2xvYWRlZG1ldGFkYXRhJywgX3RoaXMudGhyb3R0bGVkVXBkYXRlQ29udGVudCk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBEdXJhdGlvbkRpc3BsYXkucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtZHVyYXRpb24nOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSBkdXJhdGlvbiB0aW1lIGRpc3BsYXkuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgZHVyYXRpb25jaGFuZ2VgLCBgdGltZXVwZGF0ZWAsIG9yIGBsb2FkZWRtZXRhZGF0YWAgZXZlbnQgdGhhdCBjYXVzZWQKICAgKiAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjZHVyYXRpb25jaGFuZ2UKICAgKiBAbGlzdGVucyBQbGF5ZXIjdGltZXVwZGF0ZQogICAqIEBsaXN0ZW5zIFBsYXllciNsb2FkZWRtZXRhZGF0YQogICAqLwoKCiAgRHVyYXRpb25EaXNwbGF5LnByb3RvdHlwZS51cGRhdGVDb250ZW50ID0gZnVuY3Rpb24gdXBkYXRlQ29udGVudChldmVudCkgewogICAgdmFyIGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7CgogICAgaWYgKGR1cmF0aW9uICYmIHRoaXMuZHVyYXRpb25fICE9PSBkdXJhdGlvbikgewogICAgICB0aGlzLmR1cmF0aW9uXyA9IGR1cmF0aW9uOwogICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKGR1cmF0aW9uKTsKICAgIH0KICB9OwoKICByZXR1cm4gRHVyYXRpb25EaXNwbGF5Owp9KFRpbWVEaXNwbGF5KTsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBEdXJhdGlvbkRpc3BsYXlgcyBjb250cm9scy4gQWRkZWQgdG8gZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCgoKRHVyYXRpb25EaXNwbGF5LnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnRHVyYXRpb24gVGltZSc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0R1cmF0aW9uRGlzcGxheScsIER1cmF0aW9uRGlzcGxheSk7CgovKioKICogQGZpbGUgdGltZS1kaXZpZGVyLmpzCiAqLwovKioKICogVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIGR1cmF0aW9uLgogKiBDYW4gYmUgaGlkZGVuIGlmIGl0J3Mgbm90IG5lZWRlZCBpbiB0aGUgZGVzaWduLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgVGltZURpdmlkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFRpbWVEaXZpZGVyLCBfQ29tcG9uZW50KTsKCiAgZnVuY3Rpb24gVGltZURpdmlkZXIoKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUaW1lRGl2aWRlcik7CiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudAogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCiAgVGltZURpdmlkZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtdGltZS1jb250cm9sIHZqcy10aW1lLWRpdmlkZXInLAogICAgICBpbm5lckhUTUw6ICc8ZGl2PjxzcGFuPi88L3NwYW4+PC9kaXY+JwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFRpbWVEaXZpZGVyOwp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RpbWVEaXZpZGVyJywgVGltZURpdmlkZXIpOwoKLyoqCiAqIEBmaWxlIHJlbWFpbmluZy10aW1lLWRpc3BsYXkuanMKICovCi8qKgogKiBEaXNwbGF5cyB0aGUgdGltZSBsZWZ0IGluIHRoZSB2aWRlbwogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgUmVtYWluaW5nVGltZURpc3BsYXkgPSBmdW5jdGlvbiAoX1RpbWVEaXNwbGF5KSB7CiAgaW5oZXJpdHMoUmVtYWluaW5nVGltZURpc3BsYXksIF9UaW1lRGlzcGxheSk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gUmVtYWluaW5nVGltZURpc3BsYXkocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSZW1haW5pbmdUaW1lRGlzcGxheSk7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVGltZURpc3BsYXkuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5vbihwbGF5ZXIsICdkdXJhdGlvbmNoYW5nZScsIF90aGlzLnRocm90dGxlZFVwZGF0ZUNvbnRlbnQpOwogICAgX3RoaXMub24ocGxheWVyLCAnZW5kZWQnLCBfdGhpcy5oYW5kbGVFbmRlZCk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBSZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1yZW1haW5pbmctdGltZSc7CiAgfTsKCiAgLyoqCiAgICogVGhlIHJlbWFpbmluZyB0aW1lIGRpc3BsYXkgcHJlZml4ZXMgbnVtYmVycyB3aXRoIGEgIm1pbnVzIiBjaGFyYWN0ZXIuCiAgICoKICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRpbWUKICAgKiAgICAgICAgIEEgbnVtZXJpYyB0aW1lLCBpbiBzZWNvbmRzLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgQSBmb3JtYXR0ZWQgdGltZQogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFJlbWFpbmluZ1RpbWVEaXNwbGF5LnByb3RvdHlwZS5mb3JtYXRUaW1lXyA9IGZ1bmN0aW9uIGZvcm1hdFRpbWVfKHRpbWUpIHsKICAgIHJldHVybiAnLScgKyBfVGltZURpc3BsYXkucHJvdG90eXBlLmZvcm1hdFRpbWVfLmNhbGwodGhpcywgdGltZSk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlIHJlbWFpbmluZyB0aW1lIGRpc3BsYXkuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgb3IgYGR1cmF0aW9uY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi4KICAgKgogICAqIEBsaXN0ZW5zIFBsYXllciN0aW1ldXBkYXRlCiAgICogQGxpc3RlbnMgUGxheWVyI2R1cmF0aW9uY2hhbmdlCiAgICovCgoKICBSZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlQ29udGVudCA9IGZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoZXZlbnQpIHsKICAgIGlmICghdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIEBkZXByZWNhdGVkIFdlIHNob3VsZCBvbmx5IHVzZSByZW1haW5pbmdUaW1lRGlzcGxheQogICAgLy8gYXMgb2YgdmlkZW8uanMgNwogICAgaWYgKHRoaXMucGxheWVyXy5yZW1haW5pbmdUaW1lRGlzcGxheSkgewogICAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKHRoaXMucGxheWVyXy5yZW1haW5pbmdUaW1lRGlzcGxheSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMudXBkYXRlRm9ybWF0dGVkVGltZV8odGhpcy5wbGF5ZXJfLnJlbWFpbmluZ1RpbWUoKSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogV2hlbiB0aGUgcGxheWVyIGZpcmVzIGVuZGVkIHRoZXJlIHNob3VsZCBiZSBubyB0aW1lIGxlZnQuIFNhZGx5CiAgICogdGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLCBsZXRzIG1ha2UgaXQgc2VlbSBsaWtlIHRoYXQgaXMgdGhlIGNhc2UKICAgKiBmb3IgdXNlcnMuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgZW5kZWRgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI2VuZGVkCiAgICovCgoKICBSZW1haW5pbmdUaW1lRGlzcGxheS5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkgewogICAgaWYgKCF0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnVwZGF0ZUZvcm1hdHRlZFRpbWVfKDApOwogIH07CgogIHJldHVybiBSZW1haW5pbmdUaW1lRGlzcGxheTsKfShUaW1lRGlzcGxheSk7CgovKioKICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgUmVtYWluaW5nVGltZURpc3BsYXlgcyBjb250cm9scy4gQWRkZWQgdG8gZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCgoKUmVtYWluaW5nVGltZURpc3BsYXkucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdSZW1haW5pbmcgVGltZSc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1JlbWFpbmluZ1RpbWVEaXNwbGF5JywgUmVtYWluaW5nVGltZURpc3BsYXkpOwoKLyoqCiAqIEBmaWxlIGxpdmUtZGlzcGxheS5qcwogKi8KLy8gVE9ETyAtIEZ1dHVyZSBtYWtlIGl0IGNsaWNrIHRvIHNuYXAgdG8gbGl2ZQoKLyoqCiAqIERpc3BsYXlzIHRoZSBsaXZlIGluZGljYXRvciB3aGVuIGR1cmF0aW9uIGlzIEluZmluaXR5LgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgTGl2ZURpc3BsYXkgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKExpdmVEaXNwbGF5LCBfQ29tcG9uZW50KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBMaXZlRGlzcGxheShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExpdmVEaXNwbGF5KTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy51cGRhdGVTaG93aW5nKCk7CiAgICBfdGhpcy5vbihfdGhpcy5wbGF5ZXIoKSwgJ2R1cmF0aW9uY2hhbmdlJywgX3RoaXMudXBkYXRlU2hvd2luZyk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnQKICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogICAqLwoKCiAgTGl2ZURpc3BsYXkucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7CiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1saXZlLWNvbnRyb2wgdmpzLWNvbnRyb2wnCiAgICB9KTsKCiAgICB0aGlzLmNvbnRlbnRFbF8gPSBjcmVhdGVFbCgnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtbGl2ZS1kaXNwbGF5JywKICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9InZqcy1jb250cm9sLXRleHQiPicgKyB0aGlzLmxvY2FsaXplKCdTdHJlYW0gVHlwZScpICsgJzwvc3Bhbj4nICsgdGhpcy5sb2NhbGl6ZSgnTElWRScpCiAgICB9LCB7CiAgICAgICdhcmlhLWxpdmUnOiAnb2ZmJwogICAgfSk7CgogICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTsKICAgIHJldHVybiBlbDsKICB9OwoKICBMaXZlRGlzcGxheS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICB0aGlzLmNvbnRlbnRFbF8gPSBudWxsOwoKICAgIF9Db21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBDaGVjayB0aGUgZHVyYXRpb24gdG8gc2VlIGlmIHRoZSBMaXZlRGlzcGxheSBzaG91bGQgYmUgc2hvd2luZyBvciBub3QuIFRoZW4gc2hvdy9oaWRlCiAgICogaXQgYWNjb3JkaW5nbHkKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIHtAbGluayBQbGF5ZXIjZHVyYXRpb25jaGFuZ2V9IGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI2R1cmF0aW9uY2hhbmdlCiAgICovCgoKICBMaXZlRGlzcGxheS5wcm90b3R5cGUudXBkYXRlU2hvd2luZyA9IGZ1bmN0aW9uIHVwZGF0ZVNob3dpbmcoZXZlbnQpIHsKICAgIGlmICh0aGlzLnBsYXllcigpLmR1cmF0aW9uKCkgPT09IEluZmluaXR5KSB7CiAgICAgIHRoaXMuc2hvdygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oaWRlKCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIExpdmVEaXNwbGF5Owp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0xpdmVEaXNwbGF5JywgTGl2ZURpc3BsYXkpOwoKLyoqCiAqIEBmaWxlIHNsaWRlci5qcwogKi8KLyoqCiAqIFRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgc2xpZGVyLiBDYW4gYmUgdmVydGljYWwgb3IgaG9yaXpvbnRhbC4KICogRm9yIGluc3RhbmNlIHRoZSB2b2x1bWUgYmFyIG9yIHRoZSBzZWVrIGJhciBvbiBhIHZpZGVvIGlzIGEgc2xpZGVyLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgU2xpZGVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHsKICBpbmhlcml0cyhTbGlkZXIsIF9Db21wb25lbnQpOwoKICAvKioKICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBTbGlkZXIocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTbGlkZXIpOwoKICAgIC8vIFNldCBwcm9wZXJ0eSBuYW1lcyB0byBiYXIgdG8gbWF0Y2ggd2l0aCB0aGUgY2hpbGQgU2xpZGVyIGNsYXNzIGlzIGxvb2tpbmcgZm9yCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5iYXIgPSBfdGhpcy5nZXRDaGlsZChfdGhpcy5vcHRpb25zXy5iYXJOYW1lKTsKCiAgICAvLyBTZXQgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGNsYXNzIG9uIHRoZSBzbGlkZXIgZGVwZW5kaW5nIG9uIHRoZSBzbGlkZXIgdHlwZQogICAgX3RoaXMudmVydGljYWwoISFfdGhpcy5vcHRpb25zXy52ZXJ0aWNhbCk7CgogICAgX3RoaXMuZW5hYmxlKCk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBBcmUgY29udHJvbHMgYXJlIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIHNsaWRlciBvciBub3QuCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgdHJ1ZSBpZiBjb250cm9scyBhcmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICovCgoKICBTbGlkZXIucHJvdG90eXBlLmVuYWJsZWQgPSBmdW5jdGlvbiBlbmFibGVkKCkgewogICAgcmV0dXJuIHRoaXMuZW5hYmxlZF87CiAgfTsKCiAgLyoqCiAgICogRW5hYmxlIGNvbnRyb2xzIGZvciB0aGlzIHNsaWRlciBpZiB0aGV5IGFyZSBkaXNhYmxlZAogICAqLwoKCiAgU2xpZGVyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoKSB7CiAgICBpZiAodGhpcy5lbmFibGVkKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRoaXMub24oJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlTW91c2VEb3duKTsKICAgIHRoaXMub24oJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7CiAgICB0aGlzLm9uKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMpOwogICAgdGhpcy5vbignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7CiAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spOwoKICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCAnY29udHJvbHN2aXNpYmxlJywgdGhpcy51cGRhdGUpOwoKICAgIGlmICh0aGlzLnBsYXllckV2ZW50KSB7CiAgICAgIHRoaXMub24odGhpcy5wbGF5ZXJfLCB0aGlzLnBsYXllckV2ZW50LCB0aGlzLnVwZGF0ZSk7CiAgICB9CgogICAgdGhpcy5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIDApOwoKICAgIHRoaXMuZW5hYmxlZF8gPSB0cnVlOwogIH07CgogIC8qKgogICAqIERpc2FibGUgY29udHJvbHMgZm9yIHRoaXMgc2xpZGVyIGlmIHRoZXkgYXJlIGVuYWJsZWQKICAgKi8KCgogIFNsaWRlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUoKSB7CiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBkb2MgPSB0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudDsKCiAgICB0aGlzLm9mZignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVNb3VzZURvd24pOwogICAgdGhpcy5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7CiAgICB0aGlzLm9mZignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTsKICAgIHRoaXMub2ZmKCdibHVyJywgdGhpcy5oYW5kbGVCbHVyKTsKICAgIHRoaXMub2ZmKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spOwogICAgdGhpcy5vZmYodGhpcy5wbGF5ZXJfLCAnY29udHJvbHN2aXNpYmxlJywgdGhpcy51cGRhdGUpOwogICAgdGhpcy5vZmYoZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpOwogICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICB0aGlzLm9mZihkb2MsICd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7CiAgICB0aGlzLm9mZihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTsKCiAgICB0aGlzLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoKICAgIGlmICh0aGlzLnBsYXllckV2ZW50KSB7CiAgICAgIHRoaXMub2ZmKHRoaXMucGxheWVyXywgdGhpcy5wbGF5ZXJFdmVudCwgdGhpcy51cGRhdGUpOwogICAgfQogICAgdGhpcy5lbmFibGVkXyA9IGZhbHNlOwogIH07CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYEJ1dHRvbmBzIERPTSBlbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKICAgKiAgICAgICAgVHlwZSBvZiBlbGVtZW50IHRvIGNyZWF0ZS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcHM9e31dCiAgICogICAgICAgIExpc3Qgb2YgcHJvcGVydGllcyBpbiBPYmplY3QgZm9ybS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbYXR0cmlidXRlcz17fV0KICAgKiAgICAgICAgbGlzdCBvZiBhdHRyaWJ1dGVzIGluIE9iamVjdCBmb3JtLgogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgZ2V0cyBjcmVhdGVkLgogICAqLwoKCiAgU2xpZGVyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKHR5cGUpIHsKICAgIHZhciBwcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307CgogICAgLy8gQWRkIHRoZSBzbGlkZXIgZWxlbWVudCBjbGFzcyB0byBhbGwgc3ViIGNsYXNzZXMKICAgIHByb3BzLmNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSArICcgdmpzLXNsaWRlcic7CiAgICBwcm9wcyA9IGFzc2lnbih7CiAgICAgIHRhYkluZGV4OiAwCiAgICB9LCBwcm9wcyk7CgogICAgYXR0cmlidXRlcyA9IGFzc2lnbih7CiAgICAgICdyb2xlJzogJ3NsaWRlcicsCiAgICAgICdhcmlhLXZhbHVlbm93JzogMCwKICAgICAgJ2FyaWEtdmFsdWVtaW4nOiAwLAogICAgICAnYXJpYS12YWx1ZW1heCc6IDEwMCwKICAgICAgJ3RhYkluZGV4JzogMAogICAgfSwgYXR0cmlidXRlcyk7CgogICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdHlwZSwgcHJvcHMsIGF0dHJpYnV0ZXMpOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBgU2xpZGVyYC4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uCiAgICoKICAgKiBAbGlzdGVucyBtb3VzZWRvd24KICAgKiBAbGlzdGVucyB0b3VjaHN0YXJ0CiAgICogQGZpcmVzIFNsaWRlciNzbGlkZXJhY3RpdmUKICAgKi8KCgogIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2ZW50KSB7CiAgICB2YXIgZG9jID0gdGhpcy5iYXIuZWxfLm93bmVyRG9jdW1lbnQ7CgogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIGJsb2NrVGV4dFNlbGVjdGlvbigpOwoKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zbGlkaW5nJyk7CiAgICAvKioKICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBzbGlkZXIgaXMgaW4gYW4gYWN0aXZlIHN0YXRlCiAgICAgKgogICAgICogQGV2ZW50IFNsaWRlciNzbGlkZXJhY3RpdmUKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdzbGlkZXJhY3RpdmUnKTsKCiAgICB0aGlzLm9uKGRvYywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgIHRoaXMub24oZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICB0aGlzLm9uKGRvYywgJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgIHRoaXMub24oZG9jLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZU1vdXNlVXApOwoKICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTsKICB9OwoKICAvKioKICAgKiBIYW5kbGUgdGhlIGBtb3VzZW1vdmVgLCBgdG91Y2htb3ZlYCwgYW5kIGBtb3VzZWRvd25gIGV2ZW50cyBvbiB0aGlzIGBTbGlkZXJgLgogICAqIFRoZSBgbW91c2Vtb3ZlYCBhbmQgYHRvdWNobW92ZWAgZXZlbnRzIHdpbGwgb25seSBvbmx5IHRyaWdnZXIgdGhpcyBmdW5jdGlvbiBkdXJpbmcKICAgKiBgbW91c2Vkb3duYCBhbmQgYHRvdWNoc3RhcnRgLiBUaGlzIGlzIGR1ZSB0byB7QGxpbmsgU2xpZGVyI2hhbmRsZU1vdXNlRG93bn0gYW5kCiAgICoge0BsaW5rIFNsaWRlciNoYW5kbGVNb3VzZVVwfS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIGBtb3VzZWRvd25gLCBgbW91c2Vtb3ZlYCwgYHRvdWNoc3RhcnRgLCBvciBgdG91Y2htb3ZlYCBldmVudCB0aGF0IHRyaWdnZXJlZAogICAqICAgICAgICB0aGlzIGZ1bmN0aW9uCiAgICoKICAgKiBAbGlzdGVucyBtb3VzZW1vdmUKICAgKiBAbGlzdGVucyB0b3VjaG1vdmUKICAgKi8KCgogIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7fTsKCiAgLyoqCiAgICogSGFuZGxlIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50cyBvbiB0aGUgYFNsaWRlcmAuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBgbW91c2V1cGAgb3IgYHRvdWNoZW5kYCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uLgogICAqCiAgICogQGxpc3RlbnMgdG91Y2hlbmQKICAgKiBAbGlzdGVucyBtb3VzZXVwCiAgICogQGZpcmVzIFNsaWRlciNzbGlkZXJpbmFjdGl2ZQogICAqLwoKCiAgU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gaGFuZGxlTW91c2VVcCgpIHsKICAgIHZhciBkb2MgPSB0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudDsKCiAgICB1bmJsb2NrVGV4dFNlbGVjdGlvbigpOwoKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkaW5nJyk7CiAgICAvKioKICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBzbGlkZXIgaXMgbm8gbG9uZ2VyIGluIGFuIGFjdGl2ZSBzdGF0ZS4KICAgICAqCiAgICAgKiBAZXZlbnQgU2xpZGVyI3NsaWRlcmluYWN0aXZlCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignc2xpZGVyaW5hY3RpdmUnKTsKCiAgICB0aGlzLm9mZihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7CiAgICB0aGlzLm9mZihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTsKICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTsKCiAgICB0aGlzLnVwZGF0ZSgpOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgYmFyIG9mIHRoZSBgU2xpZGVyYC4KICAgKgogICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICogICAgICAgICAgVGhlIHBlcmNlbnRhZ2Ugb2YgcHJvZ3Jlc3MgdGhlIHByb2dyZXNzIGJhciByZXByZXNlbnRzIGFzIGEKICAgKiAgICAgICAgICBudW1iZXIgZnJvbSAwIHRvIDEuCiAgICovCgoKICBTbGlkZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHsKCiAgICAvLyBJbiBWb2x1bWVCYXIgaW5pdCB3ZSBoYXZlIGEgc2V0VGltZW91dCBmb3IgdXBkYXRlIHRoYXQgcG9wcyBhbmQgdXBkYXRlCiAgICAvLyB0byB0aGUgZW5kIG9mIHRoZSBleGVjdXRpb24gc3RhY2suIFRoZSBwbGF5ZXIgaXMgZGVzdHJveWVkIGJlZm9yZSB0aGVuCiAgICAvLyB1cGRhdGUgd2lsbCBjYXVzZSBhbiBlcnJvcgogICAgaWYgKCF0aGlzLmVsXykgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gSWYgc2NydWJiaW5nLCB3ZSBjb3VsZCB1c2UgYSBjYWNoZWQgdmFsdWUgdG8gbWFrZSB0aGUgaGFuZGxlIGtlZXAgdXAKICAgIC8vIHdpdGggdGhlIHVzZXIncyBtb3VzZS4gT24gSFRNTDUgYnJvd3NlcnMgc2NydWJiaW5nIGlzIHJlYWxseSBzbW9vdGgsIGJ1dAogICAgLy8gc29tZSBmbGFzaCBwbGF5ZXJzIGFyZSBzbG93LCBzbyB3ZSBtaWdodCB3YW50IHRvIHV0aWxpemUgdGhpcyBsYXRlci4KICAgIC8vIHZhciBwcm9ncmVzcyA9ICAodGhpcy5wbGF5ZXJfLnNjcnViYmluZygpKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIC8gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkgOiB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUoKSAvIHRoaXMucGxheWVyXy5kdXJhdGlvbigpOwogICAgdmFyIHByb2dyZXNzID0gdGhpcy5nZXRQZXJjZW50KCk7CiAgICB2YXIgYmFyID0gdGhpcy5iYXI7CgogICAgLy8gSWYgdGhlcmUncyBubyBiYXIuLi4KICAgIGlmICghYmFyKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBQcm90ZWN0IGFnYWluc3Qgbm8gZHVyYXRpb24gYW5kIG90aGVyIGRpdmlzaW9uIGlzc3VlcwogICAgaWYgKHR5cGVvZiBwcm9ncmVzcyAhPT0gJ251bWJlcicgfHwgcHJvZ3Jlc3MgIT09IHByb2dyZXNzIHx8IHByb2dyZXNzIDwgMCB8fCBwcm9ncmVzcyA9PT0gSW5maW5pdHkpIHsKICAgICAgcHJvZ3Jlc3MgPSAwOwogICAgfQoKICAgIC8vIENvbnZlcnQgdG8gYSBwZXJjZW50YWdlIGZvciBzZXR0aW5nCiAgICB2YXIgcGVyY2VudGFnZSA9IChwcm9ncmVzcyAqIDEwMCkudG9GaXhlZCgyKSArICclJzsKICAgIHZhciBzdHlsZSA9IGJhci5lbCgpLnN0eWxlOwoKICAgIC8vIFNldCB0aGUgbmV3IGJhciB3aWR0aCBvciBoZWlnaHQKICAgIGlmICh0aGlzLnZlcnRpY2FsKCkpIHsKICAgICAgc3R5bGUuaGVpZ2h0ID0gcGVyY2VudGFnZTsKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlLndpZHRoID0gcGVyY2VudGFnZTsKICAgIH0KCiAgICByZXR1cm4gcHJvZ3Jlc3M7CiAgfTsKCiAgLyoqCiAgICogQ2FsY3VsYXRlIGRpc3RhbmNlIGZvciBzbGlkZXIKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi4KICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBTbGlkZXIuCiAgICogICAgICAgICAtIHBvc3RpdGlvbi54IGZvciB2ZXJ0aWNhbCBgU2xpZGVyYHMKICAgKiAgICAgICAgIC0gcG9zdGl0aW9uLnkgZm9yIGhvcml6b250YWwgYFNsaWRlcmBzCiAgICovCgoKICBTbGlkZXIucHJvdG90eXBlLmNhbGN1bGF0ZURpc3RhbmNlID0gZnVuY3Rpb24gY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpIHsKICAgIHZhciBwb3NpdGlvbiA9IGdldFBvaW50ZXJQb3NpdGlvbih0aGlzLmVsXywgZXZlbnQpOwoKICAgIGlmICh0aGlzLnZlcnRpY2FsKCkpIHsKICAgICAgcmV0dXJuIHBvc2l0aW9uLnk7CiAgICB9CiAgICByZXR1cm4gcG9zaXRpb24ueDsKICB9OwoKICAvKioKICAgKiBIYW5kbGUgYSBgZm9jdXNgIGV2ZW50IG9uIHRoaXMgYFNsaWRlcmAuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgYGZvY3VzYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi4KICAgKgogICAqIEBsaXN0ZW5zIGZvY3VzCiAgICovCgoKICBTbGlkZXIucHJvdG90eXBlLmhhbmRsZUZvY3VzID0gZnVuY3Rpb24gaGFuZGxlRm9jdXMoKSB7CiAgICB0aGlzLm9uKHRoaXMuYmFyLmVsXy5vd25lckRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5UHJlc3MpOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBhIGBrZXlkb3duYCBldmVudCBvbiB0aGUgYFNsaWRlcmAuIFdhdGNoZXMgZm9yIGxlZnQsIHJpZ3RoLCB1cCwgYW5kIGRvd24KICAgKiBhcnJvdyBrZXlzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgc2xpZGVyIGhhcyBmb2N1cy4gU2VlCiAgICoge0BsaW5rIFNsaWRlciNoYW5kbGVGb2N1c30gYW5kIHtAbGluayBTbGlkZXIjaGFuZGxlQmx1cn0uCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICB0aGUgYGtleWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMga2V5ZG93bgogICAqLwoKCiAgU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7CiAgICAvLyBMZWZ0IGFuZCBEb3duIEFycm93cwogICAgaWYgKGV2ZW50LndoaWNoID09PSAzNyB8fCBldmVudC53aGljaCA9PT0gNDApIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5zdGVwQmFjaygpOwoKICAgICAgLy8gVXAgYW5kIFJpZ2h0IEFycm93cwogICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PT0gMzggfHwgZXZlbnQud2hpY2ggPT09IDM5KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuc3RlcEZvcndhcmQoKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBIYW5kbGUgYSBgYmx1cmAgZXZlbnQgb24gdGhpcyBgU2xpZGVyYC4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBgYmx1cmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBibHVyCiAgICovCgogIFNsaWRlci5wcm90b3R5cGUuaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIGhhbmRsZUJsdXIoKSB7CiAgICB0aGlzLm9mZih0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleVByZXNzKTsKICB9OwoKICAvKioKICAgKiBMaXN0ZW5lciBmb3IgY2xpY2sgZXZlbnRzIG9uIHNsaWRlciwgdXNlZCB0byBwcmV2ZW50IGNsaWNrcwogICAqICAgZnJvbSBidWJibGluZyB1cCB0byBwYXJlbnQgZWxlbWVudHMgbGlrZSBidXR0b24gbWVudXMuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQKICAgKiAgICAgICAgRXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBvYmplY3QgdG8gcnVuCiAgICovCgoKICBTbGlkZXIucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHsKICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICB9OwoKICAvKioKICAgKiBHZXQvc2V0IGlmIHNsaWRlciBpcyBob3Jpem9udGFsIGZvciB2ZXJ0aWNhbAogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF0KICAgKiAgICAgICAgLSB0cnVlIGlmIHNsaWRlciBpcyB2ZXJ0aWNhbCwKICAgKiAgICAgICAgLSBmYWxzZSBpcyBob3Jpem9udGFsCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgLSB0cnVlIGlmIHNsaWRlciBpcyB2ZXJ0aWNhbCwgYW5kIGdldHRpbmcKICAgKiAgICAgICAgIC0gZmFsc2UgaWYgdGhlIHNsaWRlciBpcyBob3Jpem9udGFsLCBhbmQgZ2V0dGluZwogICAqLwoKCiAgU2xpZGVyLnByb3RvdHlwZS52ZXJ0aWNhbCA9IGZ1bmN0aW9uIHZlcnRpY2FsKGJvb2wpIHsKICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxfIHx8IGZhbHNlOwogICAgfQoKICAgIHRoaXMudmVydGljYWxfID0gISFib29sOwoKICAgIGlmICh0aGlzLnZlcnRpY2FsXykgewogICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLXZlcnRpY2FsJyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2xpZGVyLWhvcml6b250YWwnKTsKICAgIH0KICB9OwoKICByZXR1cm4gU2xpZGVyOwp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1NsaWRlcicsIFNsaWRlcik7CgovKioKICogQGZpbGUgbG9hZC1wcm9ncmVzcy1iYXIuanMKICovCi8qKgogKiBTaG93cyBsb2FkaW5nIHByb2dyZXNzCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBMb2FkUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKExvYWRQcm9ncmVzc0JhciwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gTG9hZFByb2dyZXNzQmFyKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9hZFByb2dyZXNzQmFyKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5wYXJ0RWxzXyA9IFtdOwogICAgX3RoaXMub24ocGxheWVyLCAncHJvZ3Jlc3MnLCBfdGhpcy51cGRhdGUpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KCgogIExvYWRQcm9ncmVzc0Jhci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHsKICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1sb2FkLXByb2dyZXNzJywKICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9InZqcy1jb250cm9sLXRleHQiPjxzcGFuPicgKyB0aGlzLmxvY2FsaXplKCdMb2FkZWQnKSArICc8L3NwYW4+OiAwJTwvc3Bhbj4nCiAgICB9KTsKICB9OwoKICBMb2FkUHJvZ3Jlc3NCYXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgdGhpcy5wYXJ0RWxzXyA9IG51bGw7CgogICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSBwcm9ncmVzcyBiYXIKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGBwcm9ncmVzc2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjcHJvZ3Jlc3MKICAgKi8KCgogIExvYWRQcm9ncmVzc0Jhci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7CiAgICB2YXIgYnVmZmVyZWQgPSB0aGlzLnBsYXllcl8uYnVmZmVyZWQoKTsKICAgIHZhciBkdXJhdGlvbiA9IHRoaXMucGxheWVyXy5kdXJhdGlvbigpOwogICAgdmFyIGJ1ZmZlcmVkRW5kID0gdGhpcy5wbGF5ZXJfLmJ1ZmZlcmVkRW5kKCk7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnBhcnRFbHNfOwoKICAgIC8vIGdldCB0aGUgcGVyY2VudCB3aWR0aCBvZiBhIHRpbWUgY29tcGFyZWQgdG8gdGhlIHRvdGFsIGVuZAogICAgdmFyIHBlcmNlbnRpZnkgPSBmdW5jdGlvbiBwZXJjZW50aWZ5KHRpbWUsIGVuZCkgewogICAgICAvLyBubyBOYU4KICAgICAgdmFyIHBlcmNlbnQgPSB0aW1lIC8gZW5kIHx8IDA7CgogICAgICByZXR1cm4gKHBlcmNlbnQgPj0gMSA/IDEgOiBwZXJjZW50KSAqIDEwMCArICclJzsKICAgIH07CgogICAgLy8gdXBkYXRlIHRoZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyCiAgICB0aGlzLmVsXy5zdHlsZS53aWR0aCA9IHBlcmNlbnRpZnkoYnVmZmVyZWRFbmQsIGR1cmF0aW9uKTsKCiAgICAvLyBhZGQgY2hpbGQgZWxlbWVudHMgdG8gcmVwcmVzZW50IHRoZSBpbmRpdmlkdWFsIGJ1ZmZlcmVkIHRpbWUgcmFuZ2VzCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzdGFydCA9IGJ1ZmZlcmVkLnN0YXJ0KGkpOwogICAgICB2YXIgZW5kID0gYnVmZmVyZWQuZW5kKGkpOwogICAgICB2YXIgcGFydCA9IGNoaWxkcmVuW2ldOwoKICAgICAgaWYgKCFwYXJ0KSB7CiAgICAgICAgcGFydCA9IHRoaXMuZWxfLmFwcGVuZENoaWxkKGNyZWF0ZUVsKCkpOwogICAgICAgIGNoaWxkcmVuW2ldID0gcGFydDsKICAgICAgfQoKICAgICAgLy8gc2V0IHRoZSBwZXJjZW50IGJhc2VkIG9uIHRoZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyIChidWZmZXJlZEVuZCkKICAgICAgcGFydC5zdHlsZS5sZWZ0ID0gcGVyY2VudGlmeShzdGFydCwgYnVmZmVyZWRFbmQpOwogICAgICBwYXJ0LnN0eWxlLndpZHRoID0gcGVyY2VudGlmeShlbmQgLSBzdGFydCwgYnVmZmVyZWRFbmQpOwogICAgfQoKICAgIC8vIHJlbW92ZSB1bnVzZWQgYnVmZmVyZWQgcmFuZ2UgZWxlbWVudHMKICAgIGZvciAodmFyIF9pID0gY2hpbGRyZW4ubGVuZ3RoOyBfaSA+IGJ1ZmZlcmVkLmxlbmd0aDsgX2ktLSkgewogICAgICB0aGlzLmVsXy5yZW1vdmVDaGlsZChjaGlsZHJlbltfaSAtIDFdKTsKICAgIH0KICAgIGNoaWxkcmVuLmxlbmd0aCA9IGJ1ZmZlcmVkLmxlbmd0aDsKICB9OwoKICByZXR1cm4gTG9hZFByb2dyZXNzQmFyOwp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0xvYWRQcm9ncmVzc0JhcicsIExvYWRQcm9ncmVzc0Jhcik7CgovKioKICogQGZpbGUgdGltZS10b29sdGlwLmpzCiAqLwovKioKICogVGltZSB0b29sdGlwcyBkaXNwbGF5IGEgdGltZSBhYm92ZSB0aGUgcHJvZ3Jlc3MgYmFyLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgVGltZVRvb2x0aXAgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFRpbWVUb29sdGlwLCBfQ29tcG9uZW50KTsKCiAgZnVuY3Rpb24gVGltZVRvb2x0aXAoKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUaW1lVG9vbHRpcCk7CiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSB0aW1lIHRvb2x0aXAgRE9NIGVsZW1lbnQKICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogICAqLwogIFRpbWVUb29sdGlwLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiAndmpzLXRpbWUtdG9vbHRpcCcKICAgIH0pOwogIH07CgogIC8qKgogICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0aW1lIHRvb2x0aXAgcmVsYXRpdmUgdG8gdGhlIGBTZWVrQmFyYC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBzZWVrQmFyUmVjdAogICAqICAgICAgICBUaGUgYENsaWVudFJlY3RgIGZvciB0aGUge0BsaW5rIFNlZWtCYXJ9IGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gc2Vla0JhclBvaW50CiAgICogICAgICAgIEEgbnVtYmVyIGZyb20gMCB0byAxLCByZXByZXNlbnRpbmcgYSBob3Jpem9udGFsIHJlZmVyZW5jZSBwb2ludAogICAqICAgICAgICBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHtAbGluayBTZWVrQmFyfQogICAqLwoKCiAgVGltZVRvb2x0aXAucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KSB7CiAgICB2YXIgdG9vbHRpcFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy5lbF8pOwogICAgdmFyIHBsYXllclJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy5wbGF5ZXJfLmVsKCkpOwogICAgdmFyIHNlZWtCYXJQb2ludFB4ID0gc2Vla0JhclJlY3Qud2lkdGggKiBzZWVrQmFyUG9pbnQ7CgogICAgLy8gZG8gbm90aGluZyBpZiBlaXRoZXIgcmVjdCBpc24ndCBhdmFpbGFibGUKICAgIC8vIGZvciBleGFtcGxlLCBpZiB0aGUgcGxheWVyIGlzbid0IGluIHRoZSBET00gZm9yIHRlc3RpbmcKICAgIGlmICghcGxheWVyUmVjdCB8fCAhdG9vbHRpcFJlY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFRoaXMgaXMgdGhlIHNwYWNlIGxlZnQgb2YgdGhlIGBzZWVrQmFyUG9pbnRgIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGJvdW5kcwogICAgLy8gb2YgdGhlIHBsYXllci4gV2UgY2FsY3VsYXRlIGFueSBnYXAgYmV0d2VlbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBwbGF5ZXIKICAgIC8vIGFuZCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBgU2Vla0JhcmAgYW5kIGFkZCB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUKICAgIC8vIGBTZWVrQmFyYCBiZWZvcmUgaGl0dGluZyB0aGUgYHNlZWtCYXJQb2ludGAKICAgIHZhciBzcGFjZUxlZnRPZlBvaW50ID0gc2Vla0JhclJlY3QubGVmdCAtIHBsYXllclJlY3QubGVmdCArIHNlZWtCYXJQb2ludFB4OwoKICAgIC8vIFRoaXMgaXMgdGhlIHNwYWNlIHJpZ2h0IG9mIHRoZSBgc2Vla0JhclBvaW50YCBhdmFpbGFibGUgd2l0aGluIHRoZSBib3VuZHMKICAgIC8vIG9mIHRoZSBwbGF5ZXIuIFdlIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBmcm9tIHRoZSBgc2Vla0JhclBvaW50YAogICAgLy8gdG8gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGBTZWVrQmFyYCBhbmQgYWRkIHRvIHRoYXQgYW55IGdhcCBiZXR3ZWVuIHRoZQogICAgLy8gcmlnaHQgZWRnZSBvZiB0aGUgYFNlZWtCYXJgIGFuZCB0aGUgcGxheWVyLgogICAgdmFyIHNwYWNlUmlnaHRPZlBvaW50ID0gc2Vla0JhclJlY3Qud2lkdGggLSBzZWVrQmFyUG9pbnRQeCArIChwbGF5ZXJSZWN0LnJpZ2h0IC0gc2Vla0JhclJlY3QucmlnaHQpOwoKICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMgYnkgd2hpY2ggdGhlIHRvb2x0aXAgd2lsbCBuZWVkIHRvIGJlIHB1bGxlZAogICAgLy8gZnVydGhlciB0byB0aGUgcmlnaHQgdG8gY2VudGVyIGl0IG92ZXIgdGhlIGBzZWVrQmFyUG9pbnRgLgogICAgdmFyIHB1bGxUb29sdGlwQnkgPSB0b29sdGlwUmVjdC53aWR0aCAvIDI7CgogICAgLy8gQWRqdXN0IHRoZSBgcHVsbFRvb2x0aXBCeWAgZGlzdGFuY2UgdG8gdGhlIGxlZnQgb3IgcmlnaHQgZGVwZW5kaW5nIG9uCiAgICAvLyB0aGUgcmVzdWx0cyBvZiB0aGUgc3BhY2UgY2FsY3VsYXRpb25zIGFib3ZlLgogICAgaWYgKHNwYWNlTGVmdE9mUG9pbnQgPCBwdWxsVG9vbHRpcEJ5KSB7CiAgICAgIHB1bGxUb29sdGlwQnkgKz0gcHVsbFRvb2x0aXBCeSAtIHNwYWNlTGVmdE9mUG9pbnQ7CiAgICB9IGVsc2UgaWYgKHNwYWNlUmlnaHRPZlBvaW50IDwgcHVsbFRvb2x0aXBCeSkgewogICAgICBwdWxsVG9vbHRpcEJ5ID0gc3BhY2VSaWdodE9mUG9pbnQ7CiAgICB9CgogICAgLy8gRHVlIHRvIHRoZSBpbXByZWNpc2lvbiBvZiBkZWNpbWFsL3JhdGlvIGJhc2VkIGNhbGN1bGF0aW9ucyBhbmQgdmFyeWluZwogICAgLy8gcm91bmRpbmcgYmVoYXZpb3JzLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHNwYWNpbmcgYWRqdXN0bWVudCBpcyBvZmYKICAgIC8vIGJ5IGEgcGl4ZWwgb3IgdHdvLiBUaGlzIGFkZHMgaW5zdXJhbmNlIHRvIHRoZXNlIGNhbGN1bGF0aW9ucy4KICAgIGlmIChwdWxsVG9vbHRpcEJ5IDwgMCkgewogICAgICBwdWxsVG9vbHRpcEJ5ID0gMDsKICAgIH0gZWxzZSBpZiAocHVsbFRvb2x0aXBCeSA+IHRvb2x0aXBSZWN0LndpZHRoKSB7CiAgICAgIHB1bGxUb29sdGlwQnkgPSB0b29sdGlwUmVjdC53aWR0aDsKICAgIH0KCiAgICB0aGlzLmVsXy5zdHlsZS5yaWdodCA9ICctJyArIHB1bGxUb29sdGlwQnkgKyAncHgnOwogICAgdGV4dENvbnRlbnQodGhpcy5lbF8sIGNvbnRlbnQpOwogIH07CgogIHJldHVybiBUaW1lVG9vbHRpcDsKfShDb21wb25lbnQpOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUaW1lVG9vbHRpcCcsIFRpbWVUb29sdGlwKTsKCi8qKgogKiBAZmlsZSBwbGF5LXByb2dyZXNzLWJhci5qcwogKi8KLyoqCiAqIFVzZWQgYnkge0BsaW5rIFNlZWtCYXJ9IHRvIGRpc3BsYXkgbWVkaWEgcGxheWJhY2sgcHJvZ3Jlc3MgYXMgcGFydCBvZiB0aGUKICoge0BsaW5rIFByb2dyZXNzQ29udHJvbH0uCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBQbGF5UHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFBsYXlQcm9ncmVzc0JhciwgX0NvbXBvbmVudCk7CgogIGZ1bmN0aW9uIFBsYXlQcm9ncmVzc0JhcigpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXlQcm9ncmVzc0Jhcik7CiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSB0aGUgRE9NIGVsZW1lbnQgZm9yIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KICBQbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtcGxheS1wcm9ncmVzcyB2anMtc2xpZGVyLWJhcicsCiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPSJ2anMtY29udHJvbC10ZXh0Ij48c3Bhbj4nICsgdGhpcy5sb2NhbGl6ZSgnUHJvZ3Jlc3MnKSArICc8L3NwYW4+OiAwJTwvc3Bhbj4nCiAgICB9KTsKICB9OwoKICAvKioKICAgKiBFbnF1ZXVlcyB1cGRhdGVzIHRvIGl0cyBvd24gRE9NIGFzIHdlbGwgYXMgdGhlIERPTSBvZiBpdHMKICAgKiB7QGxpbmsgVGltZVRvb2x0aXB9IGNoaWxkLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IHNlZWtCYXJSZWN0CiAgICogICAgICAgIFRoZSBgQ2xpZW50UmVjdGAgZm9yIHRoZSB7QGxpbmsgU2Vla0Jhcn0gZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBzZWVrQmFyUG9pbnQKICAgKiAgICAgICAgQSBudW1iZXIgZnJvbSAwIHRvIDEsIHJlcHJlc2VudGluZyBhIGhvcml6b250YWwgcmVmZXJlbmNlIHBvaW50CiAgICogICAgICAgIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUge0BsaW5rIFNlZWtCYXJ9CiAgICovCgoKICBQbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50KSB7CiAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAvLyBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyByQUYgSUQsIGNhbmNlbCBpdCBzbyB3ZSBkb24ndCBvdmVyLXF1ZXVlLgogICAgaWYgKHRoaXMucmFmSWRfKSB7CiAgICAgIHRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yYWZJZF8pOwogICAgfQoKICAgIHRoaXMucmFmSWRfID0gdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgewogICAgICB2YXIgdGltZSA9IF90aGlzMi5wbGF5ZXJfLnNjcnViYmluZygpID8gX3RoaXMyLnBsYXllcl8uZ2V0Q2FjaGUoKS5jdXJyZW50VGltZSA6IF90aGlzMi5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7CgogICAgICB2YXIgY29udGVudCA9IGZvcm1hdFRpbWUodGltZSwgX3RoaXMyLnBsYXllcl8uZHVyYXRpb24oKSk7CiAgICAgIHZhciB0aW1lVG9vbHRpcCA9IF90aGlzMi5nZXRDaGlsZCgndGltZVRvb2x0aXAnKTsKCiAgICAgIGlmICh0aW1lVG9vbHRpcCkgewogICAgICAgIHRpbWVUb29sdGlwLnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50LCBjb250ZW50KTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFBsYXlQcm9ncmVzc0JhcjsKfShDb21wb25lbnQpOwoKLyoqCiAqIERlZmF1bHQgb3B0aW9ucyBmb3Ige0BsaW5rIFBsYXlQcm9ncmVzc0Jhcn0uCiAqCiAqIEB0eXBlIHtPYmplY3R9CiAqIEBwcml2YXRlCiAqLwoKClBsYXlQcm9ncmVzc0Jhci5wcm90b3R5cGUub3B0aW9uc18gPSB7CiAgY2hpbGRyZW46IFtdCn07CgovLyBUaW1lIHRvb2x0aXBzIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gYSBwbGF5ZXIgb24gbW9iaWxlIGRldmljZXMgb3IgSUU4CmlmICgoIUlFX1ZFUlNJT04gfHwgSUVfVkVSU0lPTiA+IDgpICYmICFJU19JT1MgJiYgIUlTX0FORFJPSUQpIHsKICBQbGF5UHJvZ3Jlc3NCYXIucHJvdG90eXBlLm9wdGlvbnNfLmNoaWxkcmVuLnB1c2goJ3RpbWVUb29sdGlwJyk7Cn0KCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUGxheVByb2dyZXNzQmFyJywgUGxheVByb2dyZXNzQmFyKTsKCi8qKgogKiBAZmlsZSBtb3VzZS10aW1lLWRpc3BsYXkuanMKICovCi8qKgogKiBUaGUge0BsaW5rIE1vdXNlVGltZURpc3BsYXl9IGNvbXBvbmVudCB0cmFja3MgbW91c2UgbW92ZW1lbnQgb3ZlciB0aGUKICoge0BsaW5rIFByb2dyZXNzQ29udHJvbH0uIEl0IGRpc3BsYXlzIGFuIGluZGljYXRvciBhbmQgYSB7QGxpbmsgVGltZVRvb2x0aXB9CiAqIGluZGljYXRpbmcgdGhlIHRpbWUgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYSBnaXZlbiBwb2ludCBpbiB0aGUKICoge0BsaW5rIFByb2dyZXNzQ29udHJvbH0uCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBNb3VzZVRpbWVEaXNwbGF5ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHsKICBpbmhlcml0cyhNb3VzZVRpbWVEaXNwbGF5LCBfQ29tcG9uZW50KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUge0BsaW5rIFBsYXllcn0gdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBNb3VzZVRpbWVEaXNwbGF5KHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTW91c2VUaW1lRGlzcGxheSk7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMudXBkYXRlID0gdGhyb3R0bGUoYmluZChfdGhpcywgX3RoaXMudXBkYXRlKSwgMjUpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBET00gZWxlbWVudCBmb3IgdGhpcyBjbGFzcy4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogICAqLwoKCiAgTW91c2VUaW1lRGlzcGxheS5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHsKICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tb3VzZS1kaXNwbGF5JwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogRW5xdWV1ZXMgdXBkYXRlcyB0byBpdHMgb3duIERPTSBhcyB3ZWxsIGFzIHRoZSBET00gb2YgaXRzCiAgICoge0BsaW5rIFRpbWVUb29sdGlwfSBjaGlsZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBzZWVrQmFyUmVjdAogICAqICAgICAgICBUaGUgYENsaWVudFJlY3RgIGZvciB0aGUge0BsaW5rIFNlZWtCYXJ9IGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gc2Vla0JhclBvaW50CiAgICogICAgICAgIEEgbnVtYmVyIGZyb20gMCB0byAxLCByZXByZXNlbnRpbmcgYSBob3Jpem9udGFsIHJlZmVyZW5jZSBwb2ludAogICAqICAgICAgICBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHtAbGluayBTZWVrQmFyfQogICAqLwoKCiAgTW91c2VUaW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWtCYXJSZWN0LCBzZWVrQmFyUG9pbnQpIHsKICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgIC8vIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHJBRiBJRCwgY2FuY2VsIGl0IHNvIHdlIGRvbid0IG92ZXItcXVldWUuCiAgICBpZiAodGhpcy5yYWZJZF8pIHsKICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJhZklkXyk7CiAgICB9CgogICAgdGhpcy5yYWZJZF8gPSB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBkdXJhdGlvbiA9IF90aGlzMi5wbGF5ZXJfLmR1cmF0aW9uKCk7CiAgICAgIHZhciBjb250ZW50ID0gZm9ybWF0VGltZShzZWVrQmFyUG9pbnQgKiBkdXJhdGlvbiwgZHVyYXRpb24pOwoKICAgICAgX3RoaXMyLmVsXy5zdHlsZS5sZWZ0ID0gc2Vla0JhclJlY3Qud2lkdGggKiBzZWVrQmFyUG9pbnQgKyAncHgnOwogICAgICBfdGhpczIuZ2V0Q2hpbGQoJ3RpbWVUb29sdGlwJykudXBkYXRlKHNlZWtCYXJSZWN0LCBzZWVrQmFyUG9pbnQsIGNvbnRlbnQpOwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIE1vdXNlVGltZURpc3BsYXk7Cn0oQ29tcG9uZW50KTsKCi8qKgogKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBNb3VzZVRpbWVEaXNwbGF5YAogKgogKiBAdHlwZSB7T2JqZWN0fQogKiBAcHJpdmF0ZQogKi8KCgpNb3VzZVRpbWVEaXNwbGF5LnByb3RvdHlwZS5vcHRpb25zXyA9IHsKICBjaGlsZHJlbjogWyd0aW1lVG9vbHRpcCddCn07CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ01vdXNlVGltZURpc3BsYXknLCBNb3VzZVRpbWVEaXNwbGF5KTsKCi8qKgogKiBAZmlsZSBzZWVrLWJhci5qcwogKi8KLy8gVGhlIG51bWJlciBvZiBzZWNvbmRzIHRoZSBgc3RlcCpgIGZ1bmN0aW9ucyBtb3ZlIHRoZSB0aW1lbGluZS4KdmFyIFNURVBfU0VDT05EUyA9IDU7CgovLyBUaGUgaW50ZXJ2YWwgYXQgd2hpY2ggdGhlIGJhciBzaG91bGQgdXBkYXRlIGFzIGl0IHByb2dyZXNzZXMuCnZhciBVUERBVEVfUkVGUkVTSF9JTlRFUlZBTCA9IDMwOwoKLyoqCiAqIFNlZWsgYmFyIGFuZCBjb250YWluZXIgZm9yIHRoZSBwcm9ncmVzcyBiYXJzLiBVc2VzIHtAbGluayBQbGF5UHJvZ3Jlc3NCYXJ9CiAqIGFzIGl0cyBgYmFyYC4KICoKICogQGV4dGVuZHMgU2xpZGVyCiAqLwoKdmFyIFNlZWtCYXIgPSBmdW5jdGlvbiAoX1NsaWRlcikgewogIGluaGVyaXRzKFNlZWtCYXIsIF9TbGlkZXIpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIFNlZWtCYXIocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTZWVrQmFyKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9TbGlkZXIuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy51cGRhdGUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy51cGRhdGUpLCBVUERBVEVfUkVGUkVTSF9JTlRFUlZBTCk7CgogICAgX3RoaXMub24ocGxheWVyLCAndGltZXVwZGF0ZScsIF90aGlzLnVwZGF0ZSk7CiAgICBfdGhpcy5vbihwbGF5ZXIsICdlbmRlZCcsIF90aGlzLmhhbmRsZUVuZGVkKTsKCiAgICAvLyB3aGVuIHBsYXlpbmcsIGxldCdzIGVuc3VyZSB3ZSBzbW9vdGhseSB1cGRhdGUgdGhlIHBsYXkgcHJvZ3Jlc3MgYmFyCiAgICAvLyB2aWEgYW4gaW50ZXJ2YWwKICAgIF90aGlzLnVwZGF0ZUludGVydmFsID0gbnVsbDsKCiAgICBfdGhpcy5vbihwbGF5ZXIsIFsncGxheWluZyddLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzLmNsZWFySW50ZXJ2YWwoX3RoaXMudXBkYXRlSW50ZXJ2YWwpOwoKICAgICAgX3RoaXMudXBkYXRlSW50ZXJ2YWwgPSBfdGhpcy5zZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzLnVwZGF0ZSgpOwogICAgICAgIH0pOwogICAgICB9LCBVUERBVEVfUkVGUkVTSF9JTlRFUlZBTCk7CiAgICB9KTsKCiAgICBfdGhpcy5vbihwbGF5ZXIsIFsnZW5kZWQnLCAncGF1c2UnLCAnd2FpdGluZyddLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzLmNsZWFySW50ZXJ2YWwoX3RoaXMudXBkYXRlSW50ZXJ2YWwpOwogICAgfSk7CgogICAgX3RoaXMub24ocGxheWVyLCBbJ3RpbWV1cGRhdGUnLCAnZW5kZWQnXSwgX3RoaXMudXBkYXRlKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudAogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgcmV0dXJuIF9TbGlkZXIucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiAndmpzLXByb2dyZXNzLWhvbGRlcicKICAgIH0sIHsKICAgICAgJ2FyaWEtbGFiZWwnOiB0aGlzLmxvY2FsaXplKCdQcm9ncmVzcyBCYXInKQogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBwbGF5IHByb2dyZXNzIGJhciBhbmQgYWNjZXNzaWJsaXR5CiAgICogYXR0cmlidXRlcyB0byB3aGF0ZXZlciBpcyBwYXNzZWQgaW4uCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudFRpbWUKICAgKiAgICAgICAgVGhlIGN1cnJlbnRUaW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFjY2Vzc2libGl0eQogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IHBlcmNlbnQKICAgKiAgICAgICAgVGhlIHBlcmNlbnRhZ2UgYXMgYSBkZWNpbWFsIHRoYXQgdGhlIGJhciBzaG91bGQgYmUgZmlsbGVkIGZyb20gMC0xLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFNlZWtCYXIucHJvdG90eXBlLnVwZGF0ZV8gPSBmdW5jdGlvbiB1cGRhdGVfKGN1cnJlbnRUaW1lLCBwZXJjZW50KSB7CiAgICB2YXIgZHVyYXRpb24gPSB0aGlzLnBsYXllcl8uZHVyYXRpb24oKTsKCiAgICAvLyBtYWNoaW5lIHJlYWRhYmxlIHZhbHVlIG9mIHByb2dyZXNzIGJhciAocGVyY2VudGFnZSBjb21wbGV0ZSkKICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIChwZXJjZW50ICogMTAwKS50b0ZpeGVkKDIpKTsKCiAgICAvLyBodW1hbiByZWFkYWJsZSB2YWx1ZSBvZiBwcm9ncmVzcyBiYXIgKHRpbWUgY29tcGxldGUpCiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0JywgdGhpcy5sb2NhbGl6ZSgncHJvZ3Jlc3MgYmFyIHRpbWluZzogY3VycmVudFRpbWU9ezF9IGR1cmF0aW9uPXsyfScsIFtmb3JtYXRUaW1lKGN1cnJlbnRUaW1lLCBkdXJhdGlvbiksIGZvcm1hdFRpbWUoZHVyYXRpb24sIGR1cmF0aW9uKV0sICd7MX0gb2YgezJ9JykpOwoKICAgIC8vIFVwZGF0ZSB0aGUgYFBsYXlQcm9ncmVzc0JhcmAuCiAgICB0aGlzLmJhci51cGRhdGUoZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMuZWxfKSwgcGVyY2VudCk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlIHRoZSBzZWVrIGJhcidzIFVJLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUgYHRpbWV1cGRhdGVgIG9yIGBlbmRlZGAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjdGltZXVwZGF0ZQogICAqCiAgICogQHJldHVybnMge251bWJlcn0KICAgKiAgICAgICAgICBUaGUgY3VycmVudCBwZXJjZW50IGF0IGEgbnVtYmVyIGZyb20gMC0xCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHsKICAgIHZhciBwZXJjZW50ID0gX1NsaWRlci5wcm90b3R5cGUudXBkYXRlLmNhbGwodGhpcyk7CgogICAgdGhpcy51cGRhdGVfKHRoaXMuZ2V0Q3VycmVudFRpbWVfKCksIHBlcmNlbnQpOwogICAgcmV0dXJuIHBlcmNlbnQ7CiAgfTsKCiAgLyoqCiAgICogR2V0IHRoZSB2YWx1ZSBvZiBjdXJyZW50IHRpbWUgYnV0IGFsbG93cyBmb3Igc21vb3RoIHNjcnViYmluZywKICAgKiB3aGVuIHBsYXllciBjYW4ndCBrZWVwIHVwLgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgVGhlIGN1cnJlbnQgdGltZSB2YWx1ZSB0byBkaXNwbGF5CiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgU2Vla0Jhci5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWVfID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVfKCkgewogICAgcmV0dXJuIHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7CiAgfTsKCiAgLyoqCiAgICogV2Ugd2FudCB0aGUgc2VlayBiYXIgdG8gYmUgZnVsbCBvbiBlbmRlZAogICAqIG5vIG1hdHRlciB3aGF0IHRoZSBhY3R1YWwgaW50ZXJuYWwgdmFsdWVzIGFyZS4gc28gd2UgZm9yY2UgaXQuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgdGltZXVwZGF0ZWAgb3IgYGVuZGVkYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi4KICAgKgogICAqIEBsaXN0ZW5zIFBsYXllciNlbmRlZAogICAqLwoKCiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlRW5kZWQgPSBmdW5jdGlvbiBoYW5kbGVFbmRlZChldmVudCkgewogICAgdGhpcy51cGRhdGVfKHRoaXMucGxheWVyXy5kdXJhdGlvbigpLCAxKTsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgbWVkaWEgcGxheWVkIHNvIGZhci4KICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIFRoZSBwZXJjZW50YWdlIG9mIG1lZGlhIHBsYXllZCBzbyBmYXIgKDAgdG8gMSkuCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS5nZXRQZXJjZW50ID0gZnVuY3Rpb24gZ2V0UGVyY2VudCgpIHsKICAgIHZhciBwZXJjZW50ID0gdGhpcy5nZXRDdXJyZW50VGltZV8oKSAvIHRoaXMucGxheWVyXy5kdXJhdGlvbigpOwoKICAgIHJldHVybiBwZXJjZW50ID49IDEgPyAxIDogcGVyY2VudDsKICB9OwoKICAvKioKICAgKiBIYW5kbGUgbW91c2UgZG93biBvbiBzZWVrIGJhcgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBtb3VzZWRvd25gIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgbW91c2Vkb3duCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHsKICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLnBsYXllcl8uc2NydWJiaW5nKHRydWUpOwoKICAgIHRoaXMudmlkZW9XYXNQbGF5aW5nID0gIXRoaXMucGxheWVyXy5wYXVzZWQoKTsKICAgIHRoaXMucGxheWVyXy5wYXVzZSgpOwoKICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlRG93bi5jYWxsKHRoaXMsIGV2ZW50KTsKICB9OwoKICAvKioKICAgKiBIYW5kbGUgbW91c2UgbW92ZSBvbiBzZWVrIGJhcgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBtb3VzZW1vdmVgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgbW91c2Vtb3ZlCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHsKICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgbmV3VGltZSA9IHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpICogdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7CgogICAgLy8gRG9uJ3QgbGV0IHZpZGVvIGVuZCB3aGlsZSBzY3J1YmJpbmcuCiAgICBpZiAobmV3VGltZSA9PT0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHsKICAgICAgbmV3VGltZSA9IG5ld1RpbWUgLSAwLjE7CiAgICB9CgogICAgLy8gU2V0IG5ldyB0aW1lICh0ZWxsIHBsYXllciB0byBzZWVrIHRvIG5ldyB0aW1lKQogICAgdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKG5ld1RpbWUpOwogIH07CgogIFNlZWtCYXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZSgpIHsKICAgIF9TbGlkZXIucHJvdG90eXBlLmVuYWJsZS5jYWxsKHRoaXMpOwogICAgdmFyIG1vdXNlVGltZURpc3BsYXkgPSB0aGlzLmdldENoaWxkKCdtb3VzZVRpbWVEaXNwbGF5Jyk7CgogICAgaWYgKCFtb3VzZVRpbWVEaXNwbGF5KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBtb3VzZVRpbWVEaXNwbGF5LnNob3coKTsKICB9OwoKICBTZWVrQmFyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHsKICAgIF9TbGlkZXIucHJvdG90eXBlLmRpc2FibGUuY2FsbCh0aGlzKTsKICAgIHZhciBtb3VzZVRpbWVEaXNwbGF5ID0gdGhpcy5nZXRDaGlsZCgnbW91c2VUaW1lRGlzcGxheScpOwoKICAgIGlmICghbW91c2VUaW1lRGlzcGxheSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgbW91c2VUaW1lRGlzcGxheS5oaWRlKCk7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIG1vdXNlIHVwIG9uIHNlZWsgYmFyCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgYG1vdXNldXBgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgbW91c2V1cAogICAqLwoKCiAgU2Vla0Jhci5wcm90b3R5cGUuaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoZXZlbnQpIHsKICAgIF9TbGlkZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlVXAuY2FsbCh0aGlzLCBldmVudCk7CgogICAgdGhpcy5wbGF5ZXJfLnNjcnViYmluZyhmYWxzZSk7CgogICAgLyoqCiAgICAgKiBUcmlnZ2VyIHRpbWV1cGRhdGUgYmVjYXVzZSB3ZSdyZSBkb25lIHNlZWtpbmcgYW5kIHRoZSB0aW1lIGhhcyBjaGFuZ2VkLgogICAgICogVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBpZiB0aGUgcGxheWVyIGlzIHBhdXNlZCB0byB0aW1lIHRoZSB0aW1lIGRpc3BsYXlzLgogICAgICoKICAgICAqIEBldmVudCBUZWNoI3RpbWV1cGRhdGUKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy5wbGF5ZXJfLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7CiAgICBpZiAodGhpcy52aWRlb1dhc1BsYXlpbmcpIHsKICAgICAgc2lsZW5jZVByb21pc2UodGhpcy5wbGF5ZXJfLnBsYXkoKSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTW92ZSBtb3JlIHF1aWNrbHkgZmFzdCBmb3J3YXJkIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS5zdGVwRm9yd2FyZCA9IGZ1bmN0aW9uIHN0ZXBGb3J3YXJkKCkgewogICAgdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpICsgU1RFUF9TRUNPTkRTKTsKICB9OwoKICAvKioKICAgKiBNb3ZlIG1vcmUgcXVpY2tseSByZXdpbmQgZm9yIGtleWJvYXJkLW9ubHkgdXNlcnMKICAgKi8KCgogIFNlZWtCYXIucHJvdG90eXBlLnN0ZXBCYWNrID0gZnVuY3Rpb24gc3RlcEJhY2soKSB7CiAgICB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUodGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCkgLSBTVEVQX1NFQ09ORFMpOwogIH07CgogIC8qKgogICAqIFRvZ2dsZXMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBwbGF5ZXIKICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gZW50ZXIgb3Igc3BhY2UgaXMgdXNlZCBvbiB0aGUgc2Vla2JhcgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICAqCiAgICovCgoKICBTZWVrQmFyLnByb3RvdHlwZS5oYW5kbGVBY3Rpb24gPSBmdW5jdGlvbiBoYW5kbGVBY3Rpb24oZXZlbnQpIHsKICAgIGlmICh0aGlzLnBsYXllcl8ucGF1c2VkKCkpIHsKICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxheWVyXy5wYXVzZSgpOwogICAgfQogIH07CgogIC8qKgogICAqIENhbGxlZCB3aGVuIHRoaXMgU2Vla0JhciBoYXMgZm9jdXMgYW5kIGEga2V5IGdldHMgcHJlc3NlZCBkb3duLiBCeQogICAqIGRlZmF1bHQgaXQgd2lsbCBjYWxsIGB0aGlzLmhhbmRsZUFjdGlvbmAgd2hlbiB0aGUga2V5IGlzIHNwYWNlIG9yIGVudGVyLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KICAgKgogICAqIEBsaXN0ZW5zIGtleWRvd24KICAgKi8KCgogIFNlZWtCYXIucHJvdG90eXBlLmhhbmRsZUtleVByZXNzID0gZnVuY3Rpb24gaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHsKCiAgICAvLyBTdXBwb3J0IFNwYWNlICgzMikgb3IgRW50ZXIgKDEzKSBrZXkgb3BlcmF0aW9uIHRvIGZpcmUgYSBjbGljayBldmVudAogICAgaWYgKGV2ZW50LndoaWNoID09PSAzMiB8fCBldmVudC53aGljaCA9PT0gMTMpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oZXZlbnQpOwogICAgfSBlbHNlIGlmIChfU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcykgewoKICAgICAgLy8gUGFzcyBrZXlwcmVzcyBoYW5kbGluZyB1cCBmb3IgdW5zdXBwb3J0ZWQga2V5cwogICAgICBfU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcy5jYWxsKHRoaXMsIGV2ZW50KTsKICAgIH0KICB9OwoKICByZXR1cm4gU2Vla0JhcjsKfShTbGlkZXIpOwoKLyoqCiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGBTZWVrQmFyYAogKgogKiBAdHlwZSB7T2JqZWN0fQogKiBAcHJpdmF0ZQogKi8KCgpTZWVrQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHsKICBjaGlsZHJlbjogWydsb2FkUHJvZ3Jlc3NCYXInLCAncGxheVByb2dyZXNzQmFyJ10sCiAgYmFyTmFtZTogJ3BsYXlQcm9ncmVzc0JhcicKfTsKCi8vIE1vdXNlVGltZURpc3BsYXkgdG9vbHRpcHMgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBhIHBsYXllciBvbiBtb2JpbGUgZGV2aWNlcyBvciBJRTgKaWYgKCghSUVfVkVSU0lPTiB8fCBJRV9WRVJTSU9OID4gOCkgJiYgIUlTX0lPUyAmJiAhSVNfQU5EUk9JRCkgewogIFNlZWtCYXIucHJvdG90eXBlLm9wdGlvbnNfLmNoaWxkcmVuLnNwbGljZSgxLCAwLCAnbW91c2VUaW1lRGlzcGxheScpOwp9CgovKioKICogQ2FsbCB0aGUgdXBkYXRlIGV2ZW50IGZvciB0aGlzIFNsaWRlciB3aGVuIHRoaXMgZXZlbnQgaGFwcGVucyBvbiB0aGUgcGxheWVyLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKi8KU2Vla0Jhci5wcm90b3R5cGUucGxheWVyRXZlbnQgPSAndGltZXVwZGF0ZSc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1NlZWtCYXInLCBTZWVrQmFyKTsKCi8qKgogKiBAZmlsZSBwcm9ncmVzcy1jb250cm9sLmpzCiAqLwovKioKICogVGhlIFByb2dyZXNzIENvbnRyb2wgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBzZWVrIGJhciwgbG9hZCBwcm9ncmVzcywKICogYW5kIHBsYXkgcHJvZ3Jlc3MuCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBQcm9ncmVzc0NvbnRyb2wgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFByb2dyZXNzQ29udHJvbCwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gUHJvZ3Jlc3NDb250cm9sKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvZ3Jlc3NDb250cm9sKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5oYW5kbGVNb3VzZU1vdmUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpLCAyNSk7CiAgICBfdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWsgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy5oYW5kbGVNb3VzZVNlZWspLCAyNSk7CgogICAgX3RoaXMuZW5hYmxlKCk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnQKICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogICAqLwoKCiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiAndmpzLXByb2dyZXNzLWNvbnRyb2wgdmpzLWNvbnRyb2wnCiAgICB9KTsKICB9OwoKICAvKioKICAgKiBXaGVuIHRoZSBtb3VzZSBtb3ZlcyBvdmVyIHRoZSBgUHJvZ3Jlc3NDb250cm9sYCwgdGhlIHBvaW50ZXIgcG9zaXRpb24KICAgKiBnZXRzIHBhc3NlZCBkb3duIHRvIHRoZSBgTW91c2VUaW1lRGlzcGxheWAgY29tcG9uZW50LgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBtb3VzZW1vdmVgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbiBtb3VzZW1vdmUKICAgKi8KCgogIFByb2dyZXNzQ29udHJvbC5wcm90b3R5cGUuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7CiAgICB2YXIgc2Vla0JhciA9IHRoaXMuZ2V0Q2hpbGQoJ3NlZWtCYXInKTsKICAgIHZhciBtb3VzZVRpbWVEaXNwbGF5ID0gc2Vla0Jhci5nZXRDaGlsZCgnbW91c2VUaW1lRGlzcGxheScpOwogICAgdmFyIHNlZWtCYXJFbCA9IHNlZWtCYXIuZWwoKTsKICAgIHZhciBzZWVrQmFyUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzZWVrQmFyRWwpOwogICAgdmFyIHNlZWtCYXJQb2ludCA9IGdldFBvaW50ZXJQb3NpdGlvbihzZWVrQmFyRWwsIGV2ZW50KS54OwoKICAgIC8vIFRoZSBkZWZhdWx0IHNraW4gaGFzIGEgZ2FwIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBgU2Vla0JhcmAuIFRoaXMgbWVhbnMKICAgIC8vIHRoYXQgaXQncyBwb3NzaWJsZSB0byB0cmlnZ2VyIHRoaXMgYmVoYXZpb3Igb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZgogICAgLy8gdGhlIGBTZWVrQmFyYC4gVGhpcyBlbnN1cmVzIHdlIHN0YXkgd2l0aGluIGl0IGF0IGFsbCB0aW1lcy4KICAgIGlmIChzZWVrQmFyUG9pbnQgPiAxKSB7CiAgICAgIHNlZWtCYXJQb2ludCA9IDE7CiAgICB9IGVsc2UgaWYgKHNlZWtCYXJQb2ludCA8IDApIHsKICAgICAgc2Vla0JhclBvaW50ID0gMDsKICAgIH0KCiAgICBpZiAobW91c2VUaW1lRGlzcGxheSkgewogICAgICBtb3VzZVRpbWVEaXNwbGF5LnVwZGF0ZShzZWVrQmFyUmVjdCwgc2Vla0JhclBvaW50KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBBIHRocm90dGxlZCB2ZXJzaW9uIG9mIHRoZSB7QGxpbmsgUHJvZ3Jlc3NDb250cm9sI2hhbmRsZU1vdXNlU2Vla30gbGlzdGVuZXIuCiAgICoKICAgKiBAbWV0aG9kIFByb2dyZXNzQ29udHJvbCN0aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWsKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgYG1vdXNlbW92ZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uCiAgICoKICAgKiBAbGlzdGVuIG1vdXNlbW92ZQogICAqIEBsaXN0ZW4gdG91Y2htb3ZlCiAgICovCgogIC8qKgogICAqIEhhbmRsZSBgbW91c2Vtb3ZlYCBvciBgdG91Y2htb3ZlYCBldmVudHMgb24gdGhlIGBQcm9ncmVzc0NvbnRyb2xgLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24KICAgKgogICAqIEBsaXN0ZW5zIG1vdXNlbW92ZQogICAqIEBsaXN0ZW5zIHRvdWNobW92ZQogICAqLwoKCiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZVNlZWsgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZVNlZWsoZXZlbnQpIHsKICAgIHZhciBzZWVrQmFyID0gdGhpcy5nZXRDaGlsZCgnc2Vla0JhcicpOwoKICAgIHNlZWtCYXIuaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTsKICB9OwoKICAvKioKICAgKiBBcmUgY29udHJvbHMgYXJlIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGlzIHByb2dyZXNzIGNvbnRyb2wuCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgdHJ1ZSBpZiBjb250cm9scyBhcmUgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICovCgoKICBQcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLmVuYWJsZWQgPSBmdW5jdGlvbiBlbmFibGVkKCkgewogICAgcmV0dXJuIHRoaXMuZW5hYmxlZF87CiAgfTsKCiAgLyoqCiAgICogRGlzYWJsZSBhbGwgY29udHJvbHMgb24gdGhlIHByb2dyZXNzIGNvbnRyb2wgYW5kIGl0cyBjaGlsZHJlbgogICAqLwoKCiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZSgpIHsKICAgIHRoaXMuY2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkgewogICAgICByZXR1cm4gY2hpbGQuZGlzYWJsZSAmJiBjaGlsZC5kaXNhYmxlKCk7CiAgICB9KTsKCiAgICBpZiAoIXRoaXMuZW5hYmxlZCgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLm9mZihbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sIHRoaXMuaGFuZGxlTW91c2VEb3duKTsKICAgIHRoaXMub2ZmKHRoaXMuZWxfLCAnbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpOwogICAgdGhpcy5oYW5kbGVNb3VzZVVwKCk7CgogICAgdGhpcy5hZGRDbGFzcygnZGlzYWJsZWQnKTsKCiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7CiAgfTsKCiAgLyoqCiAgICogRW5hYmxlIGFsbCBjb250cm9scyBvbiB0aGUgcHJvZ3Jlc3MgY29udHJvbCBhbmQgaXRzIGNoaWxkcmVuCiAgICovCgoKICBQcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZSgpIHsKICAgIHRoaXMuY2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkgewogICAgICByZXR1cm4gY2hpbGQuZW5hYmxlICYmIGNoaWxkLmVuYWJsZSgpOwogICAgfSk7CgogICAgaWYgKHRoaXMuZW5hYmxlZCgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLm9uKFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwgdGhpcy5oYW5kbGVNb3VzZURvd24pOwogICAgdGhpcy5vbih0aGlzLmVsXywgJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CgogICAgdGhpcy5lbmFibGVkXyA9IHRydWU7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudHMgb24gdGhlIGBQcm9ncmVzc0NvbnRyb2xgLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24KICAgKgogICAqIEBsaXN0ZW5zIG1vdXNlZG93bgogICAqIEBsaXN0ZW5zIHRvdWNoc3RhcnQKICAgKi8KCgogIFByb2dyZXNzQ29udHJvbC5wcm90b3R5cGUuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2ZW50KSB7CiAgICB2YXIgZG9jID0gdGhpcy5lbF8ub3duZXJEb2N1bWVudDsKCiAgICB0aGlzLm9uKGRvYywgJ21vdXNlbW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VTZWVrKTsKICAgIHRoaXMub24oZG9jLCAndG91Y2htb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWspOwogICAgdGhpcy5vbihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTsKICAgIHRoaXMub24oZG9jLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZU1vdXNlVXApOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBgbW91c2V1cGAgb3IgYHRvdWNoZW5kYCBldmVudHMgb24gdGhlIGBQcm9ncmVzc0NvbnRyb2xgLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgYG1vdXNldXBgIG9yIGB0b3VjaGVuZGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbi4KICAgKgogICAqIEBsaXN0ZW5zIHRvdWNoZW5kCiAgICogQGxpc3RlbnMgbW91c2V1cAogICAqLwoKCiAgUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldmVudCkgewogICAgdmFyIGRvYyA9IHRoaXMuZWxfLm93bmVyRG9jdW1lbnQ7CgogICAgdGhpcy5vZmYoZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWspOwogICAgdGhpcy5vZmYoZG9jLCAndG91Y2htb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZVNlZWspOwogICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgICB0aGlzLm9mZihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgfTsKCiAgcmV0dXJuIFByb2dyZXNzQ29udHJvbDsKfShDb21wb25lbnQpOwoKLyoqCiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgYFByb2dyZXNzQ29udHJvbGAKICoKICogQHR5cGUge09iamVjdH0KICogQHByaXZhdGUKICovCgoKUHJvZ3Jlc3NDb250cm9sLnByb3RvdHlwZS5vcHRpb25zXyA9IHsKICBjaGlsZHJlbjogWydzZWVrQmFyJ10KfTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUHJvZ3Jlc3NDb250cm9sJywgUHJvZ3Jlc3NDb250cm9sKTsKCi8qKgogKiBAZmlsZSBmdWxsc2NyZWVuLXRvZ2dsZS5qcwogKi8KLyoqCiAqIFRvZ2dsZSBmdWxsc2NyZWVuIHZpZGVvCiAqCiAqIEBleHRlbmRzIEJ1dHRvbgogKi8KCnZhciBGdWxsc2NyZWVuVG9nZ2xlID0gZnVuY3Rpb24gKF9CdXR0b24pIHsKICBpbmhlcml0cyhGdWxsc2NyZWVuVG9nZ2xlLCBfQnV0dG9uKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBGdWxsc2NyZWVuVG9nZ2xlKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRnVsbHNjcmVlblRvZ2dsZSk7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMub24ocGxheWVyLCAnZnVsbHNjcmVlbmNoYW5nZScsIF90aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LgogICAqLwoKCiAgRnVsbHNjcmVlblRvZ2dsZS5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1mdWxsc2NyZWVuLWNvbnRyb2wgJyArIF9CdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBIYW5kbGVzIGZ1bGxzY3JlZW5jaGFuZ2Ugb24gdGhlIHBsYXllciBhbmQgY2hhbmdlIGNvbnRyb2wgdGV4dCBhY2NvcmRpbmdseS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIHtAbGluayBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZX0gZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZQogICAqLwoKCiAgRnVsbHNjcmVlblRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlRnVsbHNjcmVlbkNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UoZXZlbnQpIHsKICAgIGlmICh0aGlzLnBsYXllcl8uaXNGdWxsc2NyZWVuKCkpIHsKICAgICAgdGhpcy5jb250cm9sVGV4dCgnTm9uLUZ1bGxzY3JlZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuY29udHJvbFRleHQoJ0Z1bGxzY3JlZW4nKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYEZ1bGxzY3JlZW5Ub2dnbGVgIGlzICJjbGlja2VkIi4gU2VlCiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudH0gZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqLwoKCiAgRnVsbHNjcmVlblRvZ2dsZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgaWYgKCF0aGlzLnBsYXllcl8uaXNGdWxsc2NyZWVuKCkpIHsKICAgICAgdGhpcy5wbGF5ZXJfLnJlcXVlc3RGdWxsc2NyZWVuKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnBsYXllcl8uZXhpdEZ1bGxzY3JlZW4oKTsKICAgIH0KICB9OwoKICByZXR1cm4gRnVsbHNjcmVlblRvZ2dsZTsKfShCdXR0b24pOwoKLyoqCiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYEZ1bGxzY3JlZW5Ub2dnbGVgcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCgoKRnVsbHNjcmVlblRvZ2dsZS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0Z1bGxzY3JlZW4nOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdGdWxsc2NyZWVuVG9nZ2xlJywgRnVsbHNjcmVlblRvZ2dsZSk7CgovKioKICogQ2hlY2sgaWYgdm9sdW1lIGNvbnRyb2wgaXMgc3VwcG9ydGVkIGFuZCBpZiBpdCBpc24ndCBoaWRlIHRoZQogKiBgQ29tcG9uZW50YCB0aGF0IHdhcyBwYXNzZWQgIHVzaW5nIHRoZSBgdmpzLWhpZGRlbmAgY2xhc3MuCiAqCiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzZWxmCiAqICAgICAgICBUaGUgY29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIGhpZGRlbiBpZiB2b2x1bWUgaXMgdW5zdXBwb3J0ZWQKICoKICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogKiAgICAgICAgQSByZWZlcmVuY2UgdG8gdGhlIHBsYXllcgogKgogKiBAcHJpdmF0ZQogKi8KdmFyIGNoZWNrVm9sdW1lU3VwcG9ydCA9IGZ1bmN0aW9uIGNoZWNrVm9sdW1lU3VwcG9ydChzZWxmLCBwbGF5ZXIpIHsKICAvLyBoaWRlIHZvbHVtZSBjb250cm9scyB3aGVuIHRoZXkncmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCB0ZWNoCiAgaWYgKHBsYXllci50ZWNoXyAmJiAhcGxheWVyLnRlY2hfLmZlYXR1cmVzVm9sdW1lQ29udHJvbCkgewogICAgc2VsZi5hZGRDbGFzcygndmpzLWhpZGRlbicpOwogIH0KCiAgc2VsZi5vbihwbGF5ZXIsICdsb2Fkc3RhcnQnLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXBsYXllci50ZWNoXy5mZWF0dXJlc1ZvbHVtZUNvbnRyb2wpIHsKICAgICAgc2VsZi5hZGRDbGFzcygndmpzLWhpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgc2VsZi5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpOwogICAgfQogIH0pOwp9OwoKLyoqCiAqIEBmaWxlIHZvbHVtZS1sZXZlbC5qcwogKi8KLyoqCiAqIFNob3dzIHZvbHVtZSBsZXZlbAogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgVm9sdW1lTGV2ZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFZvbHVtZUxldmVsLCBfQ29tcG9uZW50KTsKCiAgZnVuY3Rpb24gVm9sdW1lTGV2ZWwoKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWb2x1bWVMZXZlbCk7CiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KICBWb2x1bWVMZXZlbC5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCgpIHsKICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtbGV2ZWwnLAogICAgICBpbm5lckhUTUw6ICc8c3BhbiBjbGFzcz0idmpzLWNvbnRyb2wtdGV4dCI+PC9zcGFuPicKICAgIH0pOwogIH07CgogIHJldHVybiBWb2x1bWVMZXZlbDsKfShDb21wb25lbnQpOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdWb2x1bWVMZXZlbCcsIFZvbHVtZUxldmVsKTsKCi8qKgogKiBAZmlsZSB2b2x1bWUtYmFyLmpzCiAqLwovLyBSZXF1aXJlZCBjaGlsZHJlbgovKioKICogVGhlIGJhciB0aGF0IGNvbnRhaW5zIHRoZSB2b2x1bWUgbGV2ZWwgYW5kIGNhbiBiZSBjbGlja2VkIG9uIHRvIGFkanVzdCB0aGUgbGV2ZWwKICoKICogQGV4dGVuZHMgU2xpZGVyCiAqLwoKdmFyIFZvbHVtZUJhciA9IGZ1bmN0aW9uIChfU2xpZGVyKSB7CiAgaW5oZXJpdHMoVm9sdW1lQmFyLCBfU2xpZGVyKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBWb2x1bWVCYXIocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBWb2x1bWVCYXIpOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1NsaWRlci5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLm9uKCdzbGlkZXJhY3RpdmUnLCBfdGhpcy51cGRhdGVMYXN0Vm9sdW1lXyk7CiAgICBfdGhpcy5vbihwbGF5ZXIsICd2b2x1bWVjaGFuZ2UnLCBfdGhpcy51cGRhdGVBUklBQXR0cmlidXRlcyk7CiAgICBwbGF5ZXIucmVhZHkoZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gX3RoaXMudXBkYXRlQVJJQUF0dHJpYnV0ZXMoKTsKICAgIH0pOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KCgogIFZvbHVtZUJhci5wcm90b3R5cGUuY3JlYXRlRWwgPSBmdW5jdGlvbiBjcmVhdGVFbCQkMSgpIHsKICAgIHJldHVybiBfU2xpZGVyLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtYmFyIHZqcy1zbGlkZXItYmFyJwogICAgfSwgewogICAgICAnYXJpYS1sYWJlbCc6IHRoaXMubG9jYWxpemUoJ1ZvbHVtZSBMZXZlbCcpLAogICAgICAnYXJpYS1saXZlJzogJ3BvbGl0ZScKICAgIH0pOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBtb3VzZSBkb3duIG9uIHZvbHVtZSBiYXIKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBgbW91c2Vkb3duYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIHRvIHJ1bi4KICAgKgogICAqIEBsaXN0ZW5zIG1vdXNlZG93bgogICAqLwoKCiAgVm9sdW1lQmFyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHsKICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBfU2xpZGVyLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24uY2FsbCh0aGlzLCBldmVudCk7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIG1vdmVtZW50IGV2ZW50cyBvbiB0aGUge0BsaW5rIFZvbHVtZU1lbnVCdXR0b259LgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgbW91c2Vtb3ZlCiAgICovCgoKICBWb2x1bWVCYXIucHJvdG90eXBlLmhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShldmVudCkgewogICAgaWYgKCFpc1NpbmdsZUxlZnRDbGljayhldmVudCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRoaXMuY2hlY2tNdXRlZCgpOwogICAgdGhpcy5wbGF5ZXJfLnZvbHVtZSh0aGlzLmNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSk7CiAgfTsKCiAgLyoqCiAgICogSWYgdGhlIHBsYXllciBpcyBtdXRlZCB1bm11dGUgaXQuCiAgICovCgoKICBWb2x1bWVCYXIucHJvdG90eXBlLmNoZWNrTXV0ZWQgPSBmdW5jdGlvbiBjaGVja011dGVkKCkgewogICAgaWYgKHRoaXMucGxheWVyXy5tdXRlZCgpKSB7CiAgICAgIHRoaXMucGxheWVyXy5tdXRlZChmYWxzZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogR2V0IHBlcmNlbnQgb2Ygdm9sdW1lIGxldmVsCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBWb2x1bWUgbGV2ZWwgcGVyY2VudCBhcyBhIGRlY2ltYWwgbnVtYmVyLgogICAqLwoKCiAgVm9sdW1lQmFyLnByb3RvdHlwZS5nZXRQZXJjZW50ID0gZnVuY3Rpb24gZ2V0UGVyY2VudCgpIHsKICAgIGlmICh0aGlzLnBsYXllcl8ubXV0ZWQoKSkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiB0aGlzLnBsYXllcl8udm9sdW1lKCk7CiAgfTsKCiAgLyoqCiAgICogSW5jcmVhc2Ugdm9sdW1lIGxldmVsIGZvciBrZXlib2FyZCB1c2VycwogICAqLwoKCiAgVm9sdW1lQmFyLnByb3RvdHlwZS5zdGVwRm9yd2FyZCA9IGZ1bmN0aW9uIHN0ZXBGb3J3YXJkKCkgewogICAgdGhpcy5jaGVja011dGVkKCk7CiAgICB0aGlzLnBsYXllcl8udm9sdW1lKHRoaXMucGxheWVyXy52b2x1bWUoKSArIDAuMSk7CiAgfTsKCiAgLyoqCiAgICogRGVjcmVhc2Ugdm9sdW1lIGxldmVsIGZvciBrZXlib2FyZCB1c2VycwogICAqLwoKCiAgVm9sdW1lQmFyLnByb3RvdHlwZS5zdGVwQmFjayA9IGZ1bmN0aW9uIHN0ZXBCYWNrKCkgewogICAgdGhpcy5jaGVja011dGVkKCk7CiAgICB0aGlzLnBsYXllcl8udm9sdW1lKHRoaXMucGxheWVyXy52b2x1bWUoKSAtIDAuMSk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlIEFSSUEgYWNjZXNzaWJpbGl0eSBhdHRyaWJ1dGVzCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgdm9sdW1lY2hhbmdlYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHJ1bi4KICAgKgogICAqIEBsaXN0ZW5zIFBsYXllciN2b2x1bWVjaGFuZ2UKICAgKi8KCgogIFZvbHVtZUJhci5wcm90b3R5cGUudXBkYXRlQVJJQUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiB1cGRhdGVBUklBQXR0cmlidXRlcyhldmVudCkgewogICAgdmFyIGFyaWFWYWx1ZSA9IHRoaXMucGxheWVyXy5tdXRlZCgpID8gMCA6IHRoaXMudm9sdW1lQXNQZXJjZW50YWdlXygpOwoKICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIGFyaWFWYWx1ZSk7CiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWV0ZXh0JywgYXJpYVZhbHVlICsgJyUnKTsKICB9OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwbGF5ZXIgdm9sdW1lIGFzIGEgcGVyY2VudGFnZQogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFZvbHVtZUJhci5wcm90b3R5cGUudm9sdW1lQXNQZXJjZW50YWdlXyA9IGZ1bmN0aW9uIHZvbHVtZUFzUGVyY2VudGFnZV8oKSB7CiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnBsYXllcl8udm9sdW1lKCkgKiAxMDApOwogIH07CgogIC8qKgogICAqIFdoZW4gdXNlciBzdGFydHMgZHJhZ2dpbmcgdGhlIFZvbHVtZUJhciwgc3RvcmUgdGhlIHZvbHVtZSBhbmQgbGlzdGVuIGZvcgogICAqIHRoZSBlbmQgb2YgdGhlIGRyYWcuIFdoZW4gdGhlIGRyYWcgZW5kcywgaWYgdGhlIHZvbHVtZSB3YXMgc2V0IHRvIHplcm8sCiAgICogc2V0IGxhc3RWb2x1bWUgdG8gdGhlIHN0b3JlZCB2b2x1bWUuCiAgICoKICAgKiBAbGlzdGVucyBzbGlkZXJhY3RpdmUKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgVm9sdW1lQmFyLnByb3RvdHlwZS51cGRhdGVMYXN0Vm9sdW1lXyA9IGZ1bmN0aW9uIHVwZGF0ZUxhc3RWb2x1bWVfKCkgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgdmFyIHZvbHVtZUJlZm9yZURyYWcgPSB0aGlzLnBsYXllcl8udm9sdW1lKCk7CgogICAgdGhpcy5vbmUoJ3NsaWRlcmluYWN0aXZlJywgZnVuY3Rpb24gKCkgewogICAgICBpZiAoX3RoaXMyLnBsYXllcl8udm9sdW1lKCkgPT09IDApIHsKICAgICAgICBfdGhpczIucGxheWVyXy5sYXN0Vm9sdW1lXyh2b2x1bWVCZWZvcmVEcmFnKTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFZvbHVtZUJhcjsKfShTbGlkZXIpOwoKLyoqCiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGBWb2x1bWVCYXJgCiAqCiAqIEB0eXBlIHtPYmplY3R9CiAqIEBwcml2YXRlCiAqLwoKClZvbHVtZUJhci5wcm90b3R5cGUub3B0aW9uc18gPSB7CiAgY2hpbGRyZW46IFsndm9sdW1lTGV2ZWwnXSwKICBiYXJOYW1lOiAndm9sdW1lTGV2ZWwnCn07CgovKioKICogQ2FsbCB0aGUgdXBkYXRlIGV2ZW50IGZvciB0aGlzIFNsaWRlciB3aGVuIHRoaXMgZXZlbnQgaGFwcGVucyBvbiB0aGUgcGxheWVyLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKi8KVm9sdW1lQmFyLnByb3RvdHlwZS5wbGF5ZXJFdmVudCA9ICd2b2x1bWVjaGFuZ2UnOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdWb2x1bWVCYXInLCBWb2x1bWVCYXIpOwoKLyoqCiAqIEBmaWxlIHZvbHVtZS1jb250cm9sLmpzCiAqLwovLyBSZXF1aXJlZCBjaGlsZHJlbgovKioKICogVGhlIGNvbXBvbmVudCBmb3IgY29udHJvbGxpbmcgdGhlIHZvbHVtZSBsZXZlbAogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgVm9sdW1lQ29udHJvbCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoVm9sdW1lQ29udHJvbCwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gVm9sdW1lQ29udHJvbChwbGF5ZXIpIHsKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZvbHVtZUNvbnRyb2wpOwoKICAgIG9wdGlvbnMudmVydGljYWwgPSBvcHRpb25zLnZlcnRpY2FsIHx8IGZhbHNlOwoKICAgIC8vIFBhc3MgdGhlIHZlcnRpY2FsIG9wdGlvbiBkb3duIHRvIHRoZSBWb2x1bWVCYXIgaWYKICAgIC8vIHRoZSBWb2x1bWVCYXIgaXMgdHVybmVkIG9uLgogICAgaWYgKHR5cGVvZiBvcHRpb25zLnZvbHVtZUJhciA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNQbGFpbihvcHRpb25zLnZvbHVtZUJhcikpIHsKICAgICAgb3B0aW9ucy52b2x1bWVCYXIgPSBvcHRpb25zLnZvbHVtZUJhciB8fCB7fTsKICAgICAgb3B0aW9ucy52b2x1bWVCYXIudmVydGljYWwgPSBvcHRpb25zLnZlcnRpY2FsOwogICAgfQoKICAgIC8vIGhpZGUgdGhpcyBjb250cm9sIGlmIHZvbHVtZSBzdXBwb3J0IGlzIG1pc3NpbmcKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIGNoZWNrVm9sdW1lU3VwcG9ydChfdGhpcywgcGxheWVyKTsKCiAgICBfdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUgPSB0aHJvdHRsZShiaW5kKF90aGlzLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpLCAyNSk7CgogICAgX3RoaXMub24oJ21vdXNlZG93bicsIF90aGlzLmhhbmRsZU1vdXNlRG93bik7CiAgICBfdGhpcy5vbigndG91Y2hzdGFydCcsIF90aGlzLmhhbmRsZU1vdXNlRG93bik7CgogICAgLy8gd2hpbGUgdGhlIHNsaWRlciBpcyBhY3RpdmUgKHRoZSBtb3VzZSBoYXMgYmVlbiBwcmVzc2VkIGRvd24gYW5kCiAgICAvLyBpcyBkcmFnZ2luZykgb3IgaW4gZm9jdXMgd2UgZG8gbm90IHdhbnQgdG8gaGlkZSB0aGUgVm9sdW1lQmFyCiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVCYXIsIFsnZm9jdXMnLCAnc2xpZGVyYWN0aXZlJ10sIGZ1bmN0aW9uICgpIHsKICAgICAgX3RoaXMudm9sdW1lQmFyLmFkZENsYXNzKCd2anMtc2xpZGVyLWFjdGl2ZScpOwogICAgICBfdGhpcy5hZGRDbGFzcygndmpzLXNsaWRlci1hY3RpdmUnKTsKICAgICAgX3RoaXMudHJpZ2dlcignc2xpZGVyYWN0aXZlJyk7CiAgICB9KTsKCiAgICBfdGhpcy5vbihfdGhpcy52b2x1bWVCYXIsIFsnYmx1cicsICdzbGlkZXJpbmFjdGl2ZSddLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzLnZvbHVtZUJhci5yZW1vdmVDbGFzcygndmpzLXNsaWRlci1hY3RpdmUnKTsKICAgICAgX3RoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7CiAgICAgIF90aGlzLnRyaWdnZXIoJ3NsaWRlcmluYWN0aXZlJyk7CiAgICB9KTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudAogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCgoKICBWb2x1bWVDb250cm9sLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkgewogICAgdmFyIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1ob3Jpem9udGFsJzsKCiAgICBpZiAodGhpcy5vcHRpb25zXy52ZXJ0aWNhbCkgewogICAgICBvcmllbnRhdGlvbkNsYXNzID0gJ3Zqcy12b2x1bWUtdmVydGljYWwnOwogICAgfQoKICAgIHJldHVybiBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtY29udHJvbCB2anMtY29udHJvbCAnICsgb3JpZW50YXRpb25DbGFzcwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudHMgb24gdGhlIGBWb2x1bWVDb250cm9sYC4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGZ1bmN0aW9uCiAgICoKICAgKiBAbGlzdGVucyBtb3VzZWRvd24KICAgKiBAbGlzdGVucyB0b3VjaHN0YXJ0CiAgICovCgoKICBWb2x1bWVDb250cm9sLnByb3RvdHlwZS5oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHsKICAgIHZhciBkb2MgPSB0aGlzLmVsXy5vd25lckRvY3VtZW50OwoKICAgIHRoaXMub24oZG9jLCAnbW91c2Vtb3ZlJywgdGhpcy50aHJvdHRsZWRIYW5kbGVNb3VzZU1vdmUpOwogICAgdGhpcy5vbihkb2MsICd0b3VjaG1vdmUnLCB0aGlzLnRocm90dGxlZEhhbmRsZU1vdXNlTW92ZSk7CiAgICB0aGlzLm9uKGRvYywgJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXApOwogICAgdGhpcy5vbihkb2MsICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIGBtb3VzZXVwYCBvciBgdG91Y2hlbmRgIGV2ZW50cyBvbiB0aGUgYFZvbHVtZUNvbnRyb2xgLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgYG1vdXNldXBgIG9yIGB0b3VjaGVuZGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbi4KICAgKgogICAqIEBsaXN0ZW5zIHRvdWNoZW5kCiAgICogQGxpc3RlbnMgbW91c2V1cAogICAqLwoKCiAgVm9sdW1lQ29udHJvbC5wcm90b3R5cGUuaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoZXZlbnQpIHsKICAgIHZhciBkb2MgPSB0aGlzLmVsXy5vd25lckRvY3VtZW50OwoKICAgIHRoaXMub2ZmKGRvYywgJ21vdXNlbW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VNb3ZlKTsKICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNobW92ZScsIHRoaXMudGhyb3R0bGVkSGFuZGxlTW91c2VNb3ZlKTsKICAgIHRoaXMub2ZmKGRvYywgJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXApOwogICAgdGhpcy5vZmYoZG9jLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZU1vdXNlVXApOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBgVm9sdW1lQ29udHJvbGAuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBgbW91c2Vkb3duYCBvciBgdG91Y2hzdGFydGAgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBmdW5jdGlvbgogICAqCiAgICogQGxpc3RlbnMgbW91c2Vkb3duCiAgICogQGxpc3RlbnMgdG91Y2hzdGFydAogICAqLwoKCiAgVm9sdW1lQ29udHJvbC5wcm90b3R5cGUuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7CiAgICB0aGlzLnZvbHVtZUJhci5oYW5kbGVNb3VzZU1vdmUoZXZlbnQpOwogIH07CgogIHJldHVybiBWb2x1bWVDb250cm9sOwp9KENvbXBvbmVudCk7CgovKioKICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYFZvbHVtZUNvbnRyb2xgCiAqCiAqIEB0eXBlIHtPYmplY3R9CiAqIEBwcml2YXRlCiAqLwoKClZvbHVtZUNvbnRyb2wucHJvdG90eXBlLm9wdGlvbnNfID0gewogIGNoaWxkcmVuOiBbJ3ZvbHVtZUJhciddCn07CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1ZvbHVtZUNvbnRyb2wnLCBWb2x1bWVDb250cm9sKTsKCi8qKgogKiBAZmlsZSBtdXRlLXRvZ2dsZS5qcwogKi8KLyoqCiAqIEEgYnV0dG9uIGNvbXBvbmVudCBmb3IgbXV0aW5nIHRoZSBhdWRpby4KICoKICogQGV4dGVuZHMgQnV0dG9uCiAqLwoKdmFyIE11dGVUb2dnbGUgPSBmdW5jdGlvbiAoX0J1dHRvbikgewogIGluaGVyaXRzKE11dGVUb2dnbGUsIF9CdXR0b24pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIE11dGVUb2dnbGUocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNdXRlVG9nZ2xlKTsKCiAgICAvLyBoaWRlIHRoaXMgY29udHJvbCBpZiB2b2x1bWUgc3VwcG9ydCBpcyBtaXNzaW5nCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9CdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBjaGVja1ZvbHVtZVN1cHBvcnQoX3RoaXMsIHBsYXllcik7CgogICAgX3RoaXMub24ocGxheWVyLCBbJ2xvYWRzdGFydCcsICd2b2x1bWVjaGFuZ2UnXSwgX3RoaXMudXBkYXRlKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIE11dGVUb2dnbGUucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtbXV0ZS1jb250cm9sICcgKyBfQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgLyoqCiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGFuIGBNdXRlVG9nZ2xlYCBpcyAiY2xpY2tlZCIuIFNlZQogICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUKICAgKiAgICAgICAgY2FsbGVkLgogICAqCiAgICogQGxpc3RlbnMgdGFwCiAgICogQGxpc3RlbnMgY2xpY2sKICAgKi8KCgogIE11dGVUb2dnbGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHsKICAgIHZhciB2b2wgPSB0aGlzLnBsYXllcl8udm9sdW1lKCk7CiAgICB2YXIgbGFzdFZvbHVtZSA9IHRoaXMucGxheWVyXy5sYXN0Vm9sdW1lXygpOwoKICAgIGlmICh2b2wgPT09IDApIHsKICAgICAgdmFyIHZvbHVtZVRvU2V0ID0gbGFzdFZvbHVtZSA8IDAuMSA/IDAuMSA6IGxhc3RWb2x1bWU7CgogICAgICB0aGlzLnBsYXllcl8udm9sdW1lKHZvbHVtZVRvU2V0KTsKICAgICAgdGhpcy5wbGF5ZXJfLm11dGVkKGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxheWVyXy5tdXRlZCh0aGlzLnBsYXllcl8ubXV0ZWQoKSA/IGZhbHNlIDogdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlIHRoZSBgTXV0ZVRvZ2dsZWAgYnV0dG9uIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiBgdm9sdW1lYCBhbmQgYG11dGVkYAogICAqIG9uIHRoZSBwbGF5ZXIuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSB7QGxpbmsgUGxheWVyI2xvYWRzdGFydH0gZXZlbnQgaWYgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkCiAgICogICAgICAgIHRocm91Z2ggYW4gZXZlbnQuCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZHN0YXJ0CiAgICogQGxpc3RlbnMgUGxheWVyI3ZvbHVtZWNoYW5nZQogICAqLwoKCiAgTXV0ZVRvZ2dsZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKGV2ZW50KSB7CiAgICB0aGlzLnVwZGF0ZUljb25fKCk7CiAgICB0aGlzLnVwZGF0ZUNvbnRyb2xUZXh0XygpOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgYE11dGVUb2dnbGVgIGljb24uCiAgICoKICAgKiBQb3NzaWJsZSBzdGF0ZXMgKGdpdmVuIGBsZXZlbGAgdmFyaWFibGUgYmVsb3cpOgogICAqIC0gMDogY3Jvc3NlZCBvdXQKICAgKiAtIDE6IHplcm8gYmFycyBvZiB2b2x1bWUKICAgKiAtIDI6IG9uZSBiYXIgb2Ygdm9sdW1lCiAgICogLSAzOiB0d28gYmFycyBvZiB2b2x1bWUKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBNdXRlVG9nZ2xlLnByb3RvdHlwZS51cGRhdGVJY29uXyA9IGZ1bmN0aW9uIHVwZGF0ZUljb25fKCkgewogICAgdmFyIHZvbCA9IHRoaXMucGxheWVyXy52b2x1bWUoKTsKICAgIHZhciBsZXZlbCA9IDM7CgogICAgaWYgKHZvbCA9PT0gMCB8fCB0aGlzLnBsYXllcl8ubXV0ZWQoKSkgewogICAgICBsZXZlbCA9IDA7CiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuMzMpIHsKICAgICAgbGV2ZWwgPSAxOwogICAgfSBlbHNlIGlmICh2b2wgPCAwLjY3KSB7CiAgICAgIGxldmVsID0gMjsKICAgIH0KCiAgICAvLyBUT0RPIGltcHJvdmUgbXV0ZWQgaWNvbiBjbGFzc2VzCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICByZW1vdmVDbGFzcyh0aGlzLmVsXywgJ3Zqcy12b2wtJyArIGkpOwogICAgfQogICAgYWRkQ2xhc3ModGhpcy5lbF8sICd2anMtdm9sLScgKyBsZXZlbCk7CiAgfTsKCiAgLyoqCiAgICogSWYgYG11dGVkYCBoYXMgY2hhbmdlZCBvbiB0aGUgcGxheWVyLCB1cGRhdGUgdGhlIGNvbnRyb2wgdGV4dAogICAqIChgdGl0bGVgIGF0dHJpYnV0ZSBvbiBgdmpzLW11dGUtY29udHJvbGAgZWxlbWVudCBhbmQgY29udGVudCBvZgogICAqIGB2anMtY29udHJvbC10ZXh0YCBlbGVtZW50KS4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBNdXRlVG9nZ2xlLnByb3RvdHlwZS51cGRhdGVDb250cm9sVGV4dF8gPSBmdW5jdGlvbiB1cGRhdGVDb250cm9sVGV4dF8oKSB7CiAgICB2YXIgc291bmRPZmYgPSB0aGlzLnBsYXllcl8ubXV0ZWQoKSB8fCB0aGlzLnBsYXllcl8udm9sdW1lKCkgPT09IDA7CiAgICB2YXIgdGV4dCA9IHNvdW5kT2ZmID8gJ1VubXV0ZScgOiAnTXV0ZSc7CgogICAgaWYgKHRoaXMuY29udHJvbFRleHQoKSAhPT0gdGV4dCkgewogICAgICB0aGlzLmNvbnRyb2xUZXh0KHRleHQpOwogICAgfQogIH07CgogIHJldHVybiBNdXRlVG9nZ2xlOwp9KEJ1dHRvbik7CgovKioKICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgTXV0ZVRvZ2dsZWBzIGNvbnRyb2xzLiBBZGRlZCBmb3IgbG9jYWxpemF0aW9uLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KCgpNdXRlVG9nZ2xlLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnTXV0ZSc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ011dGVUb2dnbGUnLCBNdXRlVG9nZ2xlKTsKCi8qKgogKiBAZmlsZSB2b2x1bWUtY29udHJvbC5qcwogKi8KLy8gUmVxdWlyZWQgY2hpbGRyZW4KLyoqCiAqIEEgQ29tcG9uZW50IHRvIGNvbnRhaW4gdGhlIE11dGVUb2dnbGUgYW5kIFZvbHVtZUNvbnRyb2wgc28gdGhhdAogKiB0aGV5IGNhbiB3b3JrIHRvZ2V0aGVyLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgVm9sdW1lUGFuZWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFZvbHVtZVBhbmVsLCBfQ29tcG9uZW50KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBWb2x1bWVQYW5lbChwbGF5ZXIpIHsKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZvbHVtZVBhbmVsKTsKCiAgICBpZiAodHlwZW9mIG9wdGlvbnMuaW5saW5lICE9PSAndW5kZWZpbmVkJykgewogICAgICBvcHRpb25zLmlubGluZSA9IG9wdGlvbnMuaW5saW5lOwogICAgfSBlbHNlIHsKICAgICAgb3B0aW9ucy5pbmxpbmUgPSB0cnVlOwogICAgfQoKICAgIC8vIHBhc3MgdGhlIGlubGluZSBvcHRpb24gZG93biB0byB0aGUgVm9sdW1lQ29udHJvbCBhcyB2ZXJ0aWNhbCBpZgogICAgLy8gdGhlIFZvbHVtZUNvbnRyb2wgaXMgb24uCiAgICBpZiAodHlwZW9mIG9wdGlvbnMudm9sdW1lQ29udHJvbCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNQbGFpbihvcHRpb25zLnZvbHVtZUNvbnRyb2wpKSB7CiAgICAgIG9wdGlvbnMudm9sdW1lQ29udHJvbCA9IG9wdGlvbnMudm9sdW1lQ29udHJvbCB8fCB7fTsKICAgICAgb3B0aW9ucy52b2x1bWVDb250cm9sLnZlcnRpY2FsID0gIW9wdGlvbnMuaW5saW5lOwogICAgfQoKICAgIC8vIGhpZGUgdGhpcyBjb250cm9sIGlmIHZvbHVtZSBzdXBwb3J0IGlzIG1pc3NpbmcKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIGNoZWNrVm9sdW1lU3VwcG9ydChfdGhpcywgcGxheWVyKTsKCiAgICAvLyB3aGlsZSB0aGUgc2xpZGVyIGlzIGFjdGl2ZSAodGhlIG1vdXNlIGhhcyBiZWVuIHByZXNzZWQgZG93biBhbmQKICAgIC8vIGlzIGRyYWdnaW5nKSB3ZSBkbyBub3Qgd2FudCB0byBoaWRlIHRoZSBWb2x1bWVCYXIKICAgIF90aGlzLm9uKF90aGlzLnZvbHVtZUNvbnRyb2wsIFsnc2xpZGVyYWN0aXZlJ10sIF90aGlzLnNsaWRlckFjdGl2ZV8pOwoKICAgIF90aGlzLm9uKF90aGlzLnZvbHVtZUNvbnRyb2wsIFsnc2xpZGVyaW5hY3RpdmUnXSwgX3RoaXMuc2xpZGVySW5hY3RpdmVfKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIEFkZCB2anMtc2xpZGVyLWFjdGl2ZSBjbGFzcyB0byB0aGUgVm9sdW1lUGFuZWwKICAgKgogICAqIEBsaXN0ZW5zIFZvbHVtZUNvbnRyb2wjc2xpZGVyYWN0aXZlCiAgICogQHByaXZhdGUKICAgKi8KCgogIFZvbHVtZVBhbmVsLnByb3RvdHlwZS5zbGlkZXJBY3RpdmVfID0gZnVuY3Rpb24gc2xpZGVyQWN0aXZlXygpIHsKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7CiAgfTsKCiAgLyoqCiAgICogUmVtb3ZlcyB2anMtc2xpZGVyLWFjdGl2ZSBjbGFzcyB0byB0aGUgVm9sdW1lUGFuZWwKICAgKgogICAqIEBsaXN0ZW5zIFZvbHVtZUNvbnRyb2wjc2xpZGVyaW5hY3RpdmUKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgVm9sdW1lUGFuZWwucHJvdG90eXBlLnNsaWRlckluYWN0aXZlXyA9IGZ1bmN0aW9uIHNsaWRlckluYWN0aXZlXygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KCgogIFZvbHVtZVBhbmVsLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKCkgewogICAgdmFyIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsJzsKCiAgICBpZiAoIXRoaXMub3B0aW9uc18uaW5saW5lKSB7CiAgICAgIG9yaWVudGF0aW9uQ2xhc3MgPSAndmpzLXZvbHVtZS1wYW5lbC12ZXJ0aWNhbCc7CiAgICB9CgogICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiAndmpzLXZvbHVtZS1wYW5lbCB2anMtY29udHJvbCAnICsgb3JpZW50YXRpb25DbGFzcwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFZvbHVtZVBhbmVsOwp9KENvbXBvbmVudCk7CgovKioKICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYFZvbHVtZUNvbnRyb2xgCiAqCiAqIEB0eXBlIHtPYmplY3R9CiAqIEBwcml2YXRlCiAqLwoKClZvbHVtZVBhbmVsLnByb3RvdHlwZS5vcHRpb25zXyA9IHsKICBjaGlsZHJlbjogWydtdXRlVG9nZ2xlJywgJ3ZvbHVtZUNvbnRyb2wnXQp9OwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdWb2x1bWVQYW5lbCcsIFZvbHVtZVBhbmVsKTsKCi8qKgogKiBAZmlsZSBtZW51LmpzCiAqLwovKioKICogVGhlIE1lbnUgY29tcG9uZW50IGlzIHVzZWQgdG8gYnVpbGQgcG9wdXAgbWVudXMsIGluY2x1ZGluZyBzdWJ0aXRsZSBhbmQKICogY2FwdGlvbnMgc2VsZWN0aW9uIG1lbnVzLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgTWVudSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoTWVudSwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICB0aGUgcGxheWVyIHRoYXQgdGhpcyBjb21wb25lbnQgc2hvdWxkIGF0dGFjaCB0bwogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXMKICAgKgogICAqLwogIGZ1bmN0aW9uIE1lbnUocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51KTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBpZiAob3B0aW9ucykgewogICAgICBfdGhpcy5tZW51QnV0dG9uXyA9IG9wdGlvbnMubWVudUJ1dHRvbjsKICAgIH0KCiAgICBfdGhpcy5mb2N1c2VkQ2hpbGRfID0gLTE7CgogICAgX3RoaXMub24oJ2tleWRvd24nLCBfdGhpcy5oYW5kbGVLZXlQcmVzcyk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBBZGQgYSB7QGxpbmsgTWVudUl0ZW19IHRvIHRoZSBtZW51LgogICAqCiAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBjb21wb25lbnQKICAgKiAgICAgICAgVGhlIG5hbWUgb3IgaW5zdGFuY2Ugb2YgdGhlIGBNZW51SXRlbWAgdG8gYWRkLgogICAqCiAgICovCgoKICBNZW51LnByb3RvdHlwZS5hZGRJdGVtID0gZnVuY3Rpb24gYWRkSXRlbShjb21wb25lbnQpIHsKICAgIHRoaXMuYWRkQ2hpbGQoY29tcG9uZW50KTsKICAgIGNvbXBvbmVudC5vbignY2xpY2snLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAvLyBVbnByZXNzIHRoZSBhc3NvY2lhdGVkIE1lbnVCdXR0b24sIGFuZCBtb3ZlIGZvY3VzIGJhY2sgdG8gaXQKICAgICAgaWYgKHRoaXMubWVudUJ1dHRvbl8pIHsKICAgICAgICB0aGlzLm1lbnVCdXR0b25fLnVucHJlc3NCdXR0b24oKTsKCiAgICAgICAgLy8gZG9uJ3QgZm9jdXMgbWVudSBidXR0b24gaWYgaXRlbSBpcyBhIGNhcHRpb24gc2V0dGluZ3MgaXRlbQogICAgICAgIC8vIGJlY2F1c2UgZm9jdXMgd2lsbCBtb3ZlIGVsc2V3aGVyZSBhbmQgaXQgbG9ncyBhbiBlcnJvciBvbiBJRTgKICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUoKSAhPT0gJ0NhcHRpb25TZXR0aW5nc01lbnVJdGVtJykgewogICAgICAgICAgdGhpcy5tZW51QnV0dG9uXy5mb2N1cygpOwogICAgICAgIH0KICAgICAgfQogICAgfSkpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYE1lbnVgcyBET00gZWxlbWVudC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICB0aGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkCiAgICovCgoKICBNZW51LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgdmFyIGNvbnRlbnRFbFR5cGUgPSB0aGlzLm9wdGlvbnNfLmNvbnRlbnRFbFR5cGUgfHwgJ3VsJzsKCiAgICB0aGlzLmNvbnRlbnRFbF8gPSBjcmVhdGVFbChjb250ZW50RWxUeXBlLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tZW51LWNvbnRlbnQnCiAgICB9KTsKCiAgICB0aGlzLmNvbnRlbnRFbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnUnKTsKCiAgICB2YXIgZWwgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsICdkaXYnLCB7CiAgICAgIGFwcGVuZDogdGhpcy5jb250ZW50RWxfLAogICAgICBjbGFzc05hbWU6ICd2anMtbWVudScKICAgIH0pOwoKICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsXyk7CgogICAgLy8gUHJldmVudCBjbGlja3MgZnJvbSBidWJibGluZyB1cC4gTmVlZGVkIGZvciBNZW51IEJ1dHRvbnMsCiAgICAvLyB3aGVyZSBhIGNsaWNrIG9uIHRoZSBwYXJlbnQgaXMgc2lnbmlmaWNhbnQKICAgIG9uKGVsLCAnY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9KTsKCiAgICByZXR1cm4gZWw7CiAgfTsKCiAgTWVudS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICB0aGlzLmNvbnRlbnRFbF8gPSBudWxsOwoKICAgIF9Db21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBIYW5kbGUgYSBga2V5ZG93bmAgZXZlbnQgb24gdGhpcyBtZW51LiBUaGlzIGxpc3RlbmVyIGlzIGFkZGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIEEgYGtleWRvd25gIGV2ZW50IHRoYXQgaGFwcGVuZWQgb24gdGhlIG1lbnUuCiAgICoKICAgKiBAbGlzdGVucyBrZXlkb3duCiAgICovCgoKICBNZW51LnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7CiAgICAvLyBMZWZ0IGFuZCBEb3duIEFycm93cwogICAgaWYgKGV2ZW50LndoaWNoID09PSAzNyB8fCBldmVudC53aGljaCA9PT0gNDApIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgdGhpcy5zdGVwRm9yd2FyZCgpOwoKICAgICAgLy8gVXAgYW5kIFJpZ2h0IEFycm93cwogICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PT0gMzggfHwgZXZlbnQud2hpY2ggPT09IDM5KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHRoaXMuc3RlcEJhY2soKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBNb3ZlIHRvIG5leHQgKGxvd2VyKSBtZW51IGl0ZW0gZm9yIGtleWJvYXJkIHVzZXJzLgogICAqLwoKCiAgTWVudS5wcm90b3R5cGUuc3RlcEZvcndhcmQgPSBmdW5jdGlvbiBzdGVwRm9yd2FyZCgpIHsKICAgIHZhciBzdGVwQ2hpbGQgPSAwOwoKICAgIGlmICh0aGlzLmZvY3VzZWRDaGlsZF8gIT09IHVuZGVmaW5lZCkgewogICAgICBzdGVwQ2hpbGQgPSB0aGlzLmZvY3VzZWRDaGlsZF8gKyAxOwogICAgfQogICAgdGhpcy5mb2N1cyhzdGVwQ2hpbGQpOwogIH07CgogIC8qKgogICAqIE1vdmUgdG8gcHJldmlvdXMgKGhpZ2hlcikgbWVudSBpdGVtIGZvciBrZXlib2FyZCB1c2Vycy4KICAgKi8KCgogIE1lbnUucHJvdG90eXBlLnN0ZXBCYWNrID0gZnVuY3Rpb24gc3RlcEJhY2soKSB7CiAgICB2YXIgc3RlcENoaWxkID0gMDsKCiAgICBpZiAodGhpcy5mb2N1c2VkQ2hpbGRfICE9PSB1bmRlZmluZWQpIHsKICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfIC0gMTsKICAgIH0KICAgIHRoaXMuZm9jdXMoc3RlcENoaWxkKTsKICB9OwoKICAvKioKICAgKiBTZXQgZm9jdXMgb24gYSB7QGxpbmsgTWVudUl0ZW19IGluIHRoZSBgTWVudWAuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IFtpdGVtPTBdCiAgICogICAgICAgIEluZGV4IG9mIGNoaWxkIGl0ZW0gc2V0IGZvY3VzIG9uLgogICAqLwoKCiAgTWVudS5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbiBmb2N1cygpIHsKICAgIHZhciBpdGVtID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwOwoKICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKS5zbGljZSgpOwogICAgdmFyIGhhdmVUaXRsZSA9IGNoaWxkcmVuLmxlbmd0aCAmJiBjaGlsZHJlblswXS5jbGFzc05hbWUgJiYgL3Zqcy1tZW51LXRpdGxlLy50ZXN0KGNoaWxkcmVuWzBdLmNsYXNzTmFtZSk7CgogICAgaWYgKGhhdmVUaXRsZSkgewogICAgICBjaGlsZHJlbi5zaGlmdCgpOwogICAgfQoKICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgIGlmIChpdGVtIDwgMCkgewogICAgICAgIGl0ZW0gPSAwOwogICAgICB9IGVsc2UgaWYgKGl0ZW0gPj0gY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgaXRlbSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7CiAgICAgIH0KCiAgICAgIHRoaXMuZm9jdXNlZENoaWxkXyA9IGl0ZW07CgogICAgICBjaGlsZHJlbltpdGVtXS5lbF8uZm9jdXMoKTsKICAgIH0KICB9OwoKICByZXR1cm4gTWVudTsKfShDb21wb25lbnQpOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZW51JywgTWVudSk7CgovKioKICogQGZpbGUgbWVudS1idXR0b24uanMKICovCi8qKgogKiBBIGBNZW51QnV0dG9uYCBjbGFzcyBmb3IgYW55IHBvcHVwIHtAbGluayBNZW51fS4KICoKICogQGV4dGVuZHMgQ29tcG9uZW50CiAqLwoKdmFyIE1lbnVCdXR0b24gPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKE1lbnVCdXR0b24sIF9Db21wb25lbnQpOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIE1lbnVCdXR0b24ocGxheWVyKSB7CiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51QnV0dG9uKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5tZW51QnV0dG9uXyA9IG5ldyBCdXR0b24ocGxheWVyLCBvcHRpb25zKTsKCiAgICBfdGhpcy5tZW51QnV0dG9uXy5jb250cm9sVGV4dChfdGhpcy5jb250cm9sVGV4dF8pOwogICAgX3RoaXMubWVudUJ1dHRvbl8uZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1oYXNwb3B1cCcsICd0cnVlJyk7CgogICAgLy8gQWRkIGJ1aWxkQ1NTQ2xhc3MgdmFsdWVzIHRvIHRoZSBidXR0b24sIG5vdCB0aGUgd3JhcHBlcgogICAgdmFyIGJ1dHRvbkNsYXNzID0gQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzKCk7CgogICAgX3RoaXMubWVudUJ1dHRvbl8uZWxfLmNsYXNzTmFtZSA9IF90aGlzLmJ1aWxkQ1NTQ2xhc3MoKSArICcgJyArIGJ1dHRvbkNsYXNzOwogICAgX3RoaXMubWVudUJ1dHRvbl8ucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9sJyk7CgogICAgX3RoaXMuYWRkQ2hpbGQoX3RoaXMubWVudUJ1dHRvbl8pOwoKICAgIF90aGlzLnVwZGF0ZSgpOwoKICAgIF90aGlzLmVuYWJsZWRfID0gdHJ1ZTsKCiAgICBfdGhpcy5vbihfdGhpcy5tZW51QnV0dG9uXywgJ3RhcCcsIF90aGlzLmhhbmRsZUNsaWNrKTsKICAgIF90aGlzLm9uKF90aGlzLm1lbnVCdXR0b25fLCAnY2xpY2snLCBfdGhpcy5oYW5kbGVDbGljayk7CiAgICBfdGhpcy5vbihfdGhpcy5tZW51QnV0dG9uXywgJ2ZvY3VzJywgX3RoaXMuaGFuZGxlRm9jdXMpOwogICAgX3RoaXMub24oX3RoaXMubWVudUJ1dHRvbl8sICdibHVyJywgX3RoaXMuaGFuZGxlQmx1cik7CgogICAgX3RoaXMub24oJ2tleWRvd24nLCBfdGhpcy5oYW5kbGVTdWJtZW51S2V5UHJlc3MpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogVXBkYXRlIHRoZSBtZW51IGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIGl0cyBpdGVtcy4KICAgKi8KCgogIE1lbnVCdXR0b24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHsKICAgIHZhciBtZW51ID0gdGhpcy5jcmVhdGVNZW51KCk7CgogICAgaWYgKHRoaXMubWVudSkgewogICAgICB0aGlzLm1lbnUuZGlzcG9zZSgpOwogICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMubWVudSk7CiAgICB9CgogICAgdGhpcy5tZW51ID0gbWVudTsKICAgIHRoaXMuYWRkQ2hpbGQobWVudSk7CgogICAgLyoqCiAgICAgKiBUcmFjayB0aGUgc3RhdGUgb2YgdGhlIG1lbnUgYnV0dG9uCiAgICAgKgogICAgICogQHR5cGUge0Jvb2xlYW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICB0aGlzLmJ1dHRvblByZXNzZWRfID0gZmFsc2U7CiAgICB0aGlzLm1lbnVCdXR0b25fLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTsKCiAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA8PSB0aGlzLmhpZGVUaHJlc2hvbGRfKSB7CiAgICAgIHRoaXMuaGlkZSgpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zaG93KCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBtZW51IGFuZCBhZGQgYWxsIGl0ZW1zIHRvIGl0LgogICAqCiAgICogQHJldHVybiB7TWVudX0KICAgKiAgICAgICAgIFRoZSBjb25zdHJ1Y3RlZCBtZW51CiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVNZW51ID0gZnVuY3Rpb24gY3JlYXRlTWVudSgpIHsKICAgIHZhciBtZW51ID0gbmV3IE1lbnUodGhpcy5wbGF5ZXJfLCB7IG1lbnVCdXR0b246IHRoaXMgfSk7CgogICAgLyoqCiAgICAgKiBIaWRlIHRoZSBtZW51IGlmIHRoZSBudW1iZXIgb2YgaXRlbXMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdGhyZXNob2xkLiBUaGlzIGRlZmF1bHRzCiAgICAgKiB0byAwIGFuZCB3aGVuZXZlciB3ZSBhZGQgaXRlbXMgd2hpY2ggY2FuIGJlIGhpZGRlbiB0byB0aGUgbWVudSB3ZSdsbCBpbmNyZW1lbnQgaXQuIFdlIGxpc3QKICAgICAqIGl0IGhlcmUgYmVjYXVzZSBldmVyeSB0aW1lIHdlIHJ1biBgY3JlYXRlTWVudWAgd2UgbmVlZCB0byByZXNldCB0aGUgdmFsdWUuCiAgICAgKgogICAgICogQHByb3RlY3RlZAogICAgICogQHR5cGUge051bWJlcn0KICAgICAqLwogICAgdGhpcy5oaWRlVGhyZXNob2xkXyA9IDA7CgogICAgLy8gQWRkIGEgdGl0bGUgbGlzdCBpdGVtIHRvIHRoZSB0b3AKICAgIGlmICh0aGlzLm9wdGlvbnNfLnRpdGxlKSB7CiAgICAgIHZhciB0aXRsZSA9IGNyZWF0ZUVsKCdsaScsIHsKICAgICAgICBjbGFzc05hbWU6ICd2anMtbWVudS10aXRsZScsCiAgICAgICAgaW5uZXJIVE1MOiB0b1RpdGxlQ2FzZSh0aGlzLm9wdGlvbnNfLnRpdGxlKSwKICAgICAgICB0YWJJbmRleDogLTEKICAgICAgfSk7CgogICAgICB0aGlzLmhpZGVUaHJlc2hvbGRfICs9IDE7CgogICAgICBtZW51LmNoaWxkcmVuXy51bnNoaWZ0KHRpdGxlKTsKICAgICAgcHJlcGVuZFRvKHRpdGxlLCBtZW51LmNvbnRlbnRFbCgpKTsKICAgIH0KCiAgICB0aGlzLml0ZW1zID0gdGhpcy5jcmVhdGVJdGVtcygpOwoKICAgIGlmICh0aGlzLml0ZW1zKSB7CiAgICAgIC8vIEFkZCBtZW51IGl0ZW1zIHRvIHRoZSBtZW51CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIG1lbnUuYWRkSXRlbSh0aGlzLml0ZW1zW2ldKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBtZW51OwogIH07CgogIC8qKgogICAqIENyZWF0ZSB0aGUgbGlzdCBvZiBtZW51IGl0ZW1zLiBTcGVjaWZpYyB0byBlYWNoIHN1YmNsYXNzLgogICAqCiAgICogQGFic3RyYWN0CiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkge307CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYE1lbnVCdXR0b25zYHMgRE9NIGVsZW1lbnQuCiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgcmV0dXJuIF9Db21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2RpdicsIHsKICAgICAgY2xhc3NOYW1lOiB0aGlzLmJ1aWxkV3JhcHBlckNTU0NsYXNzKCkKICAgIH0sIHt9KTsKICB9OwoKICAvKioKICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXMgZm9yIHRoZSB3cmFwcGVyIGVsZW1lbnQKICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBjb25zdHJ1Y3RlZCB3cmFwcGVyIERPTSBgY2xhc3NOYW1lYAogICAqLwoKCiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHsKICAgIHZhciBtZW51QnV0dG9uQ2xhc3MgPSAndmpzLW1lbnUtYnV0dG9uJzsKCiAgICAvLyBJZiB0aGUgaW5saW5lIG9wdGlvbiBpcyBwYXNzZWQsIHdlIHdhbnQgdG8gdXNlIGRpZmZlcmVudCBzdHlsZXMgYWx0b2dldGhlci4KICAgIGlmICh0aGlzLm9wdGlvbnNfLmlubGluZSA9PT0gdHJ1ZSkgewogICAgICBtZW51QnV0dG9uQ2xhc3MgKz0gJy1pbmxpbmUnOwogICAgfSBlbHNlIHsKICAgICAgbWVudUJ1dHRvbkNsYXNzICs9ICctcG9wdXAnOwogICAgfQoKICAgIC8vIFRPRE86IEZpeCB0aGUgQ1NTIHNvIHRoYXQgdGhpcyBpc24ndCBuZWNlc3NhcnkKICAgIHZhciBidXR0b25DbGFzcyA9IEJ1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcygpOwoKICAgIHJldHVybiAndmpzLW1lbnUtYnV0dG9uICcgKyBtZW51QnV0dG9uQ2xhc3MgKyAnICcgKyBidXR0b25DbGFzcyArICcgJyArIF9Db21wb25lbnQucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHZhciBtZW51QnV0dG9uQ2xhc3MgPSAndmpzLW1lbnUtYnV0dG9uJzsKCiAgICAvLyBJZiB0aGUgaW5saW5lIG9wdGlvbiBpcyBwYXNzZWQsIHdlIHdhbnQgdG8gdXNlIGRpZmZlcmVudCBzdHlsZXMgYWx0b2dldGhlci4KICAgIGlmICh0aGlzLm9wdGlvbnNfLmlubGluZSA9PT0gdHJ1ZSkgewogICAgICBtZW51QnV0dG9uQ2xhc3MgKz0gJy1pbmxpbmUnOwogICAgfSBlbHNlIHsKICAgICAgbWVudUJ1dHRvbkNsYXNzICs9ICctcG9wdXAnOwogICAgfQoKICAgIHJldHVybiAndmpzLW1lbnUtYnV0dG9uICcgKyBtZW51QnV0dG9uQ2xhc3MgKyAnICcgKyBfQ29tcG9uZW50LnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgLyoqCiAgICogR2V0IG9yIHNldCB0aGUgbG9jYWxpemVkIGNvbnRyb2wgdGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eS4KICAgKgogICAqID4gTk9URTogVGhpcyB3aWxsIGNvbWUgZnJvbSB0aGUgaW50ZXJuYWwgYG1lbnVCdXR0b25fYCBlbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XQogICAqICAgICAgICBDb250cm9sIHRleHQgZm9yIGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtlbD10aGlzLm1lbnVCdXR0b25fLmVsKCldCiAgICogICAgICAgIEVsZW1lbnQgdG8gc2V0IHRoZSB0aXRsZSBvbi4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIC0gVGhlIGNvbnRyb2wgdGV4dCB3aGVuIGdldHRpbmcKICAgKi8KCgogIE1lbnVCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0ID0gZnVuY3Rpb24gY29udHJvbFRleHQodGV4dCkgewogICAgdmFyIGVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0aGlzLm1lbnVCdXR0b25fLmVsKCk7CgogICAgcmV0dXJuIHRoaXMubWVudUJ1dHRvbl8uY29udHJvbFRleHQodGV4dCwgZWwpOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBhIGNsaWNrIG9uIGEgYE1lbnVCdXR0b25gLgogICAqIFNlZSB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50I2hhbmRsZUNsaWNrfSBmb3IgaW5zdGFuY2VzIHdoZXJlIHRoaXMgaXMgY2FsbGVkLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqLwoKCiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgLy8gV2hlbiB5b3UgY2xpY2sgdGhlIGJ1dHRvbiBpdCBhZGRzIGZvY3VzLCB3aGljaCB3aWxsIHNob3cgdGhlIG1lbnUuCiAgICAvLyBTbyB3ZSdsbCByZW1vdmUgZm9jdXMgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBidXR0b24uIEZvY3VzIGlzIG5lZWRlZAogICAgLy8gZm9yIHRhYiBuYXZpZ2F0aW9uLgoKICAgIHRoaXMub25lKHRoaXMubWVudS5jb250ZW50RWwoKSwgJ21vdXNlbGVhdmUnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlKSB7CiAgICAgIHRoaXMudW5wcmVzc0J1dHRvbigpOwogICAgICB0aGlzLmVsXy5ibHVyKCk7CiAgICB9KSk7CiAgICBpZiAodGhpcy5idXR0b25QcmVzc2VkXykgewogICAgICB0aGlzLnVucHJlc3NCdXR0b24oKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucHJlc3NCdXR0b24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBTZXQgdGhlIGZvY3VzIHRvIHRoZSBhY3R1YWwgYnV0dG9uLCBub3QgdG8gdGhpcyBlbGVtZW50CiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkgewogICAgdGhpcy5tZW51QnV0dG9uXy5mb2N1cygpOwogIH07CgogIC8qKgogICAqIFJlbW92ZSB0aGUgZm9jdXMgZnJvbSB0aGUgYWN0dWFsIGJ1dHRvbiwgbm90IHRoaXMgZWxlbWVudAogICAqLwoKCiAgTWVudUJ1dHRvbi5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uIGJsdXIoKSB7CiAgICB0aGlzLm1lbnVCdXR0b25fLmJsdXIoKTsKICB9OwoKICAvKioKICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBgTWVudUJ1dHRvbmAgZ2FpbnMgZm9jdXMgdmlhIGEgYGZvY3VzYCBldmVudC4KICAgKiBUdXJucyBvbiBsaXN0ZW5pbmcgZm9yIGBrZXlkb3duYCBldmVudHMuIFdoZW4gdGhleSBoYXBwZW4gaXQKICAgKiBjYWxscyBgdGhpcy5oYW5kbGVLZXlQcmVzc2AuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgYGZvY3VzYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KICAgKgogICAqIEBsaXN0ZW5zIGZvY3VzCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKCkgewogICAgb24oZG9jdW1lbnRfMSwgJ2tleWRvd24nLCBiaW5kKHRoaXMsIHRoaXMuaGFuZGxlS2V5UHJlc3MpKTsKICB9OwoKICAvKioKICAgKiBDYWxsZWQgd2hlbiBhIGBNZW51QnV0dG9uYCBsb3NlcyBmb2N1cy4gVHVybnMgb2ZmIHRoZSBsaXN0ZW5lciBmb3IKICAgKiBga2V5ZG93bmAgZXZlbnRzLiBXaGljaCBTdG9wcyBgdGhpcy5oYW5kbGVLZXlQcmVzc2AgZnJvbSBnZXR0aW5nIGNhbGxlZC4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBgYmx1cmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBibHVyCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cigpIHsKICAgIG9mZihkb2N1bWVudF8xLCAna2V5ZG93bicsIGJpbmQodGhpcywgdGhpcy5oYW5kbGVLZXlQcmVzcykpOwogIH07CgogIC8qKgogICAqIEhhbmRsZSB0YWIsIGVzY2FwZSwgZG93biBhcnJvdywgYW5kIHVwIGFycm93IGtleXMgZm9yIGBNZW51QnV0dG9uYC4gU2VlCiAgICoge0BsaW5rIENsaWNrYWJsZUNvbXBvbmVudCNoYW5kbGVLZXlQcmVzc30gZm9yIGluc3RhbmNlcyB3aGVyZSB0aGlzIGlzIGNhbGxlZC4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIFRoZSBga2V5ZG93bmAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBrZXlkb3duCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVLZXlQcmVzcyA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7CgogICAgLy8gRXNjYXBlICgyNykga2V5IG9yIFRhYiAoOSkga2V5IHVucHJlc3MgdGhlICdidXR0b24nCiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDI3IHx8IGV2ZW50LndoaWNoID09PSA5KSB7CiAgICAgIGlmICh0aGlzLmJ1dHRvblByZXNzZWRfKSB7CiAgICAgICAgdGhpcy51bnByZXNzQnV0dG9uKCk7CiAgICAgIH0KICAgICAgLy8gRG9uJ3QgcHJldmVudERlZmF1bHQgZm9yIFRhYiBrZXkgLSB3ZSBzdGlsbCB3YW50IHRvIGxvc2UgZm9jdXMKICAgICAgaWYgKGV2ZW50LndoaWNoICE9PSA5KSB7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAvLyBTZXQgZm9jdXMgYmFjayB0byB0aGUgbWVudSBidXR0b24ncyBidXR0b24KICAgICAgICB0aGlzLm1lbnVCdXR0b25fLmVsXy5mb2N1cygpOwogICAgICB9CiAgICAgIC8vIFVwICgzOCkga2V5IG9yIERvd24gKDQwKSBrZXkgcHJlc3MgdGhlICdidXR0b24nCiAgICB9IGVsc2UgaWYgKGV2ZW50LndoaWNoID09PSAzOCB8fCBldmVudC53aGljaCA9PT0gNDApIHsKICAgICAgaWYgKCF0aGlzLmJ1dHRvblByZXNzZWRfKSB7CiAgICAgICAgdGhpcy5wcmVzc0J1dHRvbigpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKioKICAgKiBIYW5kbGUgYSBga2V5ZG93bmAgZXZlbnQgb24gYSBzdWItbWVudS4gVGhlIGxpc3RlbmVyIGZvciB0aGlzIGlzIGFkZGVkIGluCiAgICogdGhlIGNvbnN0cnVjdG9yLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgS2V5IHByZXNzIGV2ZW50CiAgICoKICAgKiBAbGlzdGVucyBrZXlkb3duCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVTdWJtZW51S2V5UHJlc3MgPSBmdW5jdGlvbiBoYW5kbGVTdWJtZW51S2V5UHJlc3MoZXZlbnQpIHsKCiAgICAvLyBFc2NhcGUgKDI3KSBrZXkgb3IgVGFiICg5KSBrZXkgdW5wcmVzcyB0aGUgJ2J1dHRvbicKICAgIGlmIChldmVudC53aGljaCA9PT0gMjcgfHwgZXZlbnQud2hpY2ggPT09IDkpIHsKICAgICAgaWYgKHRoaXMuYnV0dG9uUHJlc3NlZF8pIHsKICAgICAgICB0aGlzLnVucHJlc3NCdXR0b24oKTsKICAgICAgfQogICAgICAvLyBEb24ndCBwcmV2ZW50RGVmYXVsdCBmb3IgVGFiIGtleSAtIHdlIHN0aWxsIHdhbnQgdG8gbG9zZSBmb2N1cwogICAgICBpZiAoZXZlbnQud2hpY2ggIT09IDkpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIC8vIFNldCBmb2N1cyBiYWNrIHRvIHRoZSBtZW51IGJ1dHRvbidzIGJ1dHRvbgogICAgICAgIHRoaXMubWVudUJ1dHRvbl8uZWxfLmZvY3VzKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKioKICAgKiBQdXQgdGhlIGN1cnJlbnQgYE1lbnVCdXR0b25gIGludG8gYSBwcmVzc2VkIHN0YXRlLgogICAqLwoKCiAgTWVudUJ1dHRvbi5wcm90b3R5cGUucHJlc3NCdXR0b24gPSBmdW5jdGlvbiBwcmVzc0J1dHRvbigpIHsKICAgIGlmICh0aGlzLmVuYWJsZWRfKSB7CiAgICAgIHRoaXMuYnV0dG9uUHJlc3NlZF8gPSB0cnVlOwogICAgICB0aGlzLm1lbnUubG9ja1Nob3dpbmcoKTsKICAgICAgdGhpcy5tZW51QnV0dG9uXy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTsKCiAgICAgIC8vIHNldCB0aGUgZm9jdXMgaW50byB0aGUgc3VibWVudSwgZXhjZXB0IG9uIGlPUyB3aGVyZSBpdCBpcyByZXN1bHRpbmcgaW4KICAgICAgLy8gdW5kZXNpcmVkIHNjcm9sbGluZyBiZWhhdmlvciB3aGVuIHRoZSBwbGF5ZXIgaXMgaW4gYW4gaWZyYW1lCiAgICAgIGlmIChJU19JT1MgJiYgaXNJbkZyYW1lKCkpIHsKICAgICAgICAvLyBSZXR1cm4gZWFybHkgc28gdGhhdCB0aGUgbWVudSBpc24ndCBmb2N1c2VkCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0aGlzLm1lbnUuZm9jdXMoKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBUYWtlIHRoZSBjdXJyZW50IGBNZW51QnV0dG9uYCBvdXQgb2YgYSBwcmVzc2VkIHN0YXRlLgogICAqLwoKCiAgTWVudUJ1dHRvbi5wcm90b3R5cGUudW5wcmVzc0J1dHRvbiA9IGZ1bmN0aW9uIHVucHJlc3NCdXR0b24oKSB7CiAgICBpZiAodGhpcy5lbmFibGVkXykgewogICAgICB0aGlzLmJ1dHRvblByZXNzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubWVudS51bmxvY2tTaG93aW5nKCk7CiAgICAgIHRoaXMubWVudUJ1dHRvbl8uZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpOwogICAgfQogIH07CgogIC8qKgogICAqIERpc2FibGUgdGhlIGBNZW51QnV0dG9uYC4gRG9uJ3QgYWxsb3cgaXQgdG8gYmUgY2xpY2tlZC4KICAgKi8KCgogIE1lbnVCdXR0b24ucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgdGhpcy51bnByZXNzQnV0dG9uKCk7CgogICAgdGhpcy5lbmFibGVkXyA9IGZhbHNlOwogICAgdGhpcy5hZGRDbGFzcygndmpzLWRpc2FibGVkJyk7CgogICAgdGhpcy5tZW51QnV0dG9uXy5kaXNhYmxlKCk7CiAgfTsKCiAgLyoqCiAgICogRW5hYmxlIHRoZSBgTWVudUJ1dHRvbmAuIEFsbG93IGl0IHRvIGJlIGNsaWNrZWQuCiAgICovCgoKICBNZW51QnV0dG9uLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoKSB7CiAgICB0aGlzLmVuYWJsZWRfID0gdHJ1ZTsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1kaXNhYmxlZCcpOwoKICAgIHRoaXMubWVudUJ1dHRvbl8uZW5hYmxlKCk7CiAgfTsKCiAgcmV0dXJuIE1lbnVCdXR0b247Cn0oQ29tcG9uZW50KTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVudUJ1dHRvbicsIE1lbnVCdXR0b24pOwoKLyoqCiAqIEBmaWxlIHRyYWNrLWJ1dHRvbi5qcwogKi8KLyoqCiAqIFRoZSBiYXNlIGNsYXNzIGZvciBidXR0b25zIHRoYXQgdG9nZ2xlIHNwZWNpZmljICB0cmFjayB0eXBlcyAoZS5nLiBzdWJ0aXRsZXMpLgogKgogKiBAZXh0ZW5kcyBNZW51QnV0dG9uCiAqLwoKdmFyIFRyYWNrQnV0dG9uID0gZnVuY3Rpb24gKF9NZW51QnV0dG9uKSB7CiAgaW5oZXJpdHMoVHJhY2tCdXR0b24sIF9NZW51QnV0dG9uKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBUcmFja0J1dHRvbihwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYWNrQnV0dG9uKTsKCiAgICB2YXIgdHJhY2tzID0gb3B0aW9ucy50cmFja3M7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUJ1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIGlmIChfdGhpcy5pdGVtcy5sZW5ndGggPD0gMSkgewogICAgICBfdGhpcy5oaWRlKCk7CiAgICB9CgogICAgaWYgKCF0cmFja3MpIHsKICAgICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMpOwogICAgfQoKICAgIHZhciB1cGRhdGVIYW5kbGVyID0gYmluZChfdGhpcywgX3RoaXMudXBkYXRlKTsKCiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB1cGRhdGVIYW5kbGVyKTsKICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHVwZGF0ZUhhbmRsZXIpOwogICAgX3RoaXMucGxheWVyXy5vbigncmVhZHknLCB1cGRhdGVIYW5kbGVyKTsKCiAgICBfdGhpcy5wbGF5ZXJfLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKCkgewogICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB1cGRhdGVIYW5kbGVyKTsKICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdXBkYXRlSGFuZGxlcik7CiAgICB9KTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIHJldHVybiBUcmFja0J1dHRvbjsKfShNZW51QnV0dG9uKTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVHJhY2tCdXR0b24nLCBUcmFja0J1dHRvbik7CgovKioKICogQGZpbGUgbWVudS1pdGVtLmpzCiAqLwovKioKICogVGhlIGNvbXBvbmVudCBmb3IgYSBtZW51IGl0ZW0uIGA8bGk+YAogKgogKiBAZXh0ZW5kcyBDbGlja2FibGVDb21wb25lbnQKICovCgp2YXIgTWVudUl0ZW0gPSBmdW5jdGlvbiAoX0NsaWNrYWJsZUNvbXBvbmVudCkgewogIGluaGVyaXRzKE1lbnVJdGVtLCBfQ2xpY2thYmxlQ29tcG9uZW50KTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICoKICAgKi8KICBmdW5jdGlvbiBNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVJdGVtKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9DbGlja2FibGVDb21wb25lbnQuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5zZWxlY3RhYmxlID0gb3B0aW9ucy5zZWxlY3RhYmxlOwoKICAgIF90aGlzLnNlbGVjdGVkKG9wdGlvbnMuc2VsZWN0ZWQpOwoKICAgIGlmIChfdGhpcy5zZWxlY3RhYmxlKSB7CiAgICAgIC8vIFRPRE86IE1heSBuZWVkIHRvIGJlIGVpdGhlciBtZW51aXRlbWNoZWNrYm94IG9yIG1lbnVpdGVtcmFkaW8sCiAgICAgIC8vICAgICAgIGFuZCBtYXkgbmVlZCBsb2dpY2FsIGdyb3VwaW5nIG9mIG1lbnUgaXRlbXMuCiAgICAgIF90aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbWVudWl0ZW1jaGVja2JveCcpOwogICAgfSBlbHNlIHsKICAgICAgX3RoaXMuZWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdtZW51aXRlbScpOwogICAgfQogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgTWVudUl0ZW0ncyBET00gZWxlbWVudAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPWxpXQogICAqICAgICAgICBFbGVtZW50J3Mgbm9kZSB0eXBlLCBub3QgYWN0dWFsbHkgdXNlZCwgYWx3YXlzIHNldCB0byBgbGlgLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wcz17fV0KICAgKiAgICAgICAgQW4gb2JqZWN0IG9mIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50CiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW2F0dHJzPXt9XQogICAqICAgICAgICBBbiBvYmplY3Qgb2YgYXR0cmlidXRlcyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIGVsZW1lbnQKICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC4KICAgKi8KCgogIE1lbnVJdGVtLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsKHR5cGUsIHByb3BzLCBhdHRycykgewogICAgLy8gVGhlIGNvbnRyb2wgaXMgdGV4dHVhbCwgbm90IGp1c3QgYW4gaWNvbgogICAgdGhpcy5ub25JY29uQ29udHJvbCA9IHRydWU7CgogICAgcmV0dXJuIF9DbGlja2FibGVDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgJ2xpJywgYXNzaWduKHsKICAgICAgY2xhc3NOYW1lOiAndmpzLW1lbnUtaXRlbScsCiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPSJ2anMtbWVudS1pdGVtLXRleHQiPicgKyB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwpICsgJzwvc3Bhbj4nLAogICAgICB0YWJJbmRleDogLTEKICAgIH0sIHByb3BzKSwgYXR0cnMpOwogIH07CgogIC8qKgogICAqIEFueSBjbGljayBvbiBhIGBNZW51SXRlbWAgcHV0cyBpbnQgaW50byB0aGUgc2VsZWN0ZWQgc3RhdGUuCiAgICogU2VlIHtAbGluayBDbGlja2FibGVDb21wb25lbnQjaGFuZGxlQ2xpY2t9IGZvciBpbnN0YW5jZXMgd2hlcmUgdGhpcyBpcyBjYWxsZWQuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlCiAgICogICAgICAgIGNhbGxlZC4KICAgKgogICAqIEBsaXN0ZW5zIHRhcAogICAqIEBsaXN0ZW5zIGNsaWNrCiAgICovCgoKICBNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgdGhpcy5zZWxlY3RlZCh0cnVlKTsKICB9OwoKICAvKioKICAgKiBTZXQgdGhlIHN0YXRlIGZvciB0aGlzIG1lbnUgaXRlbSBhcyBzZWxlY3RlZCBvciBub3QuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlbGVjdGVkCiAgICogICAgICAgIGlmIHRoZSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQgb3Igbm90CiAgICovCgoKICBNZW51SXRlbS5wcm90b3R5cGUuc2VsZWN0ZWQgPSBmdW5jdGlvbiBzZWxlY3RlZChfc2VsZWN0ZWQpIHsKICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHsKICAgICAgaWYgKF9zZWxlY3RlZCkgewogICAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zZWxlY3RlZCcpOwogICAgICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywgJ3RydWUnKTsKICAgICAgICAvLyBhcmlhLWNoZWNrZWQgaXNuJ3QgZnVsbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzL3NjcmVlbiByZWFkZXJzLAogICAgICAgIC8vIHNvIGluZGljYXRlIHNlbGVjdGVkIHN0YXRlIHRvIHNjcmVlbiByZWFkZXIgaW4gdGhlIGNvbnRyb2wgdGV4dC4KICAgICAgICB0aGlzLmNvbnRyb2xUZXh0KCcsIHNlbGVjdGVkJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNlbGVjdGVkJyk7CiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCAnZmFsc2UnKTsKICAgICAgICAvLyBJbmRpY2F0ZSB1bi1zZWxlY3RlZCBzdGF0ZSB0byBzY3JlZW4gcmVhZGVyCiAgICAgICAgdGhpcy5jb250cm9sVGV4dCgnJyk7CiAgICAgIH0KICAgIH0KICB9OwoKICByZXR1cm4gTWVudUl0ZW07Cn0oQ2xpY2thYmxlQ29tcG9uZW50KTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVudUl0ZW0nLCBNZW51SXRlbSk7CgovKioKICogQGZpbGUgdGV4dC10cmFjay1tZW51LWl0ZW0uanMKICovCi8qKgogKiBUaGUgc3BlY2lmaWMgbWVudSBpdGVtIHR5cGUgZm9yIHNlbGVjdGluZyBhIGxhbmd1YWdlIHdpdGhpbiBhIHRleHQgdHJhY2sga2luZAogKgogKiBAZXh0ZW5kcyBNZW51SXRlbQogKi8KCnZhciBUZXh0VHJhY2tNZW51SXRlbSA9IGZ1bmN0aW9uIChfTWVudUl0ZW0pIHsKICBpbmhlcml0cyhUZXh0VHJhY2tNZW51SXRlbSwgX01lbnVJdGVtKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBUZXh0VHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRUcmFja01lbnVJdGVtKTsKCiAgICB2YXIgdHJhY2sgPSBvcHRpb25zLnRyYWNrOwogICAgdmFyIHRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7CgogICAgLy8gTW9kaWZ5IG9wdGlvbnMgZm9yIHBhcmVudCBNZW51SXRlbSBjbGFzcydzIGluaXQuCiAgICBvcHRpb25zLmxhYmVsID0gdHJhY2subGFiZWwgfHwgdHJhY2subGFuZ3VhZ2UgfHwgJ1Vua25vd24nOwogICAgb3B0aW9ucy5zZWxlY3RlZCA9IHRyYWNrLm1vZGUgPT09ICdzaG93aW5nJzsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLnRyYWNrID0gdHJhY2s7CiAgICB2YXIgY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIGNoYW5nZUhhbmRsZXIoKSB7CiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgICAgfQoKICAgICAgX3RoaXMuaGFuZGxlVHJhY2tzQ2hhbmdlLmFwcGx5KF90aGlzLCBhcmdzKTsKICAgIH07CiAgICB2YXIgc2VsZWN0ZWRMYW5ndWFnZUNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbiBzZWxlY3RlZExhbmd1YWdlQ2hhbmdlSGFuZGxlcigpIHsKICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHsKICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07CiAgICAgIH0KCiAgICAgIF90aGlzLmhhbmRsZVNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2UuYXBwbHkoX3RoaXMsIGFyZ3MpOwogICAgfTsKCiAgICBwbGF5ZXIub24oWydsb2Fkc3RhcnQnLCAndGV4dHRyYWNrY2hhbmdlJ10sIGNoYW5nZUhhbmRsZXIpOwogICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpOwogICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGVkbGFuZ3VhZ2VjaGFuZ2UnLCBzZWxlY3RlZExhbmd1YWdlQ2hhbmdlSGFuZGxlcik7CiAgICBfdGhpcy5vbignZGlzcG9zZScsIGZ1bmN0aW9uICgpIHsKICAgICAgcGxheWVyLm9mZihbJ2xvYWRzdGFydCcsICd0ZXh0dHJhY2tjaGFuZ2UnXSwgY2hhbmdlSGFuZGxlcik7CiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTsKICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlbGVjdGVkbGFuZ3VhZ2VjaGFuZ2UnLCBzZWxlY3RlZExhbmd1YWdlQ2hhbmdlSGFuZGxlcik7CiAgICB9KTsKCiAgICAvLyBpT1M3IGRvZXNuJ3QgZGlzcGF0Y2ggY2hhbmdlIGV2ZW50cyB0byBUZXh0VHJhY2tMaXN0cyB3aGVuIGFuCiAgICAvLyBhc3NvY2lhdGVkIHRyYWNrJ3MgbW9kZSBjaGFuZ2VzLiBXaXRob3V0IHNvbWV0aGluZyBsaWtlCiAgICAvLyBPYmplY3Qub2JzZXJ2ZSgpIChhbHNvIG5vdCBwcmVzZW50IG9uIGlPUzcpLCBpdCdzIG5vdAogICAgLy8gcG9zc2libGUgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gdGhlIG1vZGUgYXR0cmlidXRlIGFuZCBwb2x5ZmlsbAogICAgLy8gdGhlIGNoYW5nZSBldmVudC4gQXMgYSBwb29yIHN1YnN0aXR1dGUsIHdlIG1hbnVhbGx5IGRpc3BhdGNoCiAgICAvLyBjaGFuZ2UgZXZlbnRzIHdoZW5ldmVyIHRoZSBjb250cm9scyBtb2RpZnkgdGhlIG1vZGUuCiAgICBpZiAodHJhY2tzLm9uY2hhbmdlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIGV2ZW50ID0gdm9pZCAwOwoKICAgICAgX3RoaXMub24oWyd0YXAnLCAnY2xpY2snXSwgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChfdHlwZW9mKHdpbmRvd18xLkV2ZW50KSAhPT0gJ29iamVjdCcpIHsKICAgICAgICAgIC8vIEFuZHJvaWQgMi4zIHRocm93cyBhbiBJbGxlZ2FsIENvbnN0cnVjdG9yIGVycm9yIGZvciB3aW5kb3cuRXZlbnQKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGV2ZW50ID0gbmV3IHdpbmRvd18xLkV2ZW50KCdjaGFuZ2UnKTsKICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWV2ZW50KSB7CiAgICAgICAgICBldmVudCA9IGRvY3VtZW50XzEuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7CiAgICAgICAgICBldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgdHJhY2tzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgICB9KTsKICAgIH0KCiAgICAvLyBzZXQgdGhlIGRlZmF1bHQgc3RhdGUgYmFzZWQgb24gY3VycmVudCB0cmFja3MKICAgIF90aGlzLmhhbmRsZVRyYWNrc0NoYW5nZSgpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGFuIGBUZXh0VHJhY2tNZW51SXRlbWAgaXMgImNsaWNrZWQiLiBTZWUKICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqLwoKCiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHsKICAgIHZhciBraW5kID0gdGhpcy50cmFjay5raW5kOwogICAgdmFyIGtpbmRzID0gdGhpcy50cmFjay5raW5kczsKICAgIHZhciB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpOwoKICAgIGlmICgha2luZHMpIHsKICAgICAga2luZHMgPSBba2luZF07CiAgICB9CgogICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMsIGV2ZW50KTsKCiAgICBpZiAoIXRyYWNrcykgewogICAgICByZXR1cm47CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldOwoKICAgICAgaWYgKHRyYWNrID09PSB0aGlzLnRyYWNrICYmIGtpbmRzLmluZGV4T2YodHJhY2sua2luZCkgPiAtMSkgewogICAgICAgIGlmICh0cmFjay5tb2RlICE9PSAnc2hvd2luZycpIHsKICAgICAgICAgIHRyYWNrLm1vZGUgPSAnc2hvd2luZyc7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRyYWNrLm1vZGUgIT09ICdkaXNhYmxlZCcpIHsKICAgICAgICB0cmFjay5tb2RlID0gJ2Rpc2FibGVkJzsKICAgICAgfQogICAgfQogIH07CgogIC8qKgogICAqIEhhbmRsZSB0ZXh0IHRyYWNrIGxpc3QgY2hhbmdlCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgYGNoYW5nZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyBUZXh0VHJhY2tMaXN0I2NoYW5nZQogICAqLwoKCiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZVRyYWNrc0NoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkgewogICAgdGhpcy5zZWxlY3RlZCh0aGlzLnRyYWNrLm1vZGUgPT09ICdzaG93aW5nJyk7CiAgfTsKCiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZVNlbGVjdGVkTGFuZ3VhZ2VDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVTZWxlY3RlZExhbmd1YWdlQ2hhbmdlKGV2ZW50KSB7CiAgICBpZiAodGhpcy50cmFjay5tb2RlID09PSAnc2hvd2luZycpIHsKICAgICAgdmFyIHNlbGVjdGVkTGFuZ3VhZ2UgPSB0aGlzLnBsYXllcl8uY2FjaGVfLnNlbGVjdGVkTGFuZ3VhZ2U7CgogICAgICAvLyBEb24ndCByZXBsYWNlIHRoZSBraW5kIG9mIHRyYWNrIGFjcm9zcyB0aGUgc2FtZSBsYW5ndWFnZQogICAgICBpZiAoc2VsZWN0ZWRMYW5ndWFnZSAmJiBzZWxlY3RlZExhbmd1YWdlLmVuYWJsZWQgJiYgc2VsZWN0ZWRMYW5ndWFnZS5sYW5ndWFnZSA9PT0gdGhpcy50cmFjay5sYW5ndWFnZSAmJiBzZWxlY3RlZExhbmd1YWdlLmtpbmQgIT09IHRoaXMudHJhY2sua2luZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5wbGF5ZXJfLmNhY2hlXy5zZWxlY3RlZExhbmd1YWdlID0gewogICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMudHJhY2subGFuZ3VhZ2UsCiAgICAgICAga2luZDogdGhpcy50cmFjay5raW5kCiAgICAgIH07CiAgICB9CiAgfTsKCiAgVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byB0cmFjayBvYmplY3Qgb24gZGlzcG9zZQogICAgdGhpcy50cmFjayA9IG51bGw7CgogICAgX01lbnVJdGVtLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7CiAgfTsKCiAgcmV0dXJuIFRleHRUcmFja01lbnVJdGVtOwp9KE1lbnVJdGVtKTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVGV4dFRyYWNrTWVudUl0ZW0nLCBUZXh0VHJhY2tNZW51SXRlbSk7CgovKioKICogQGZpbGUgb2ZmLXRleHQtdHJhY2stbWVudS1pdGVtLmpzCiAqLwovKioKICogQSBzcGVjaWFsIG1lbnUgaXRlbSBmb3IgdHVybmluZyBvZiBhIHNwZWNpZmljIHR5cGUgb2YgdGV4dCB0cmFjawogKgogKiBAZXh0ZW5kcyBUZXh0VHJhY2tNZW51SXRlbQogKi8KCnZhciBPZmZUZXh0VHJhY2tNZW51SXRlbSA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrTWVudUl0ZW0pIHsKICBpbmhlcml0cyhPZmZUZXh0VHJhY2tNZW51SXRlbSwgX1RleHRUcmFja01lbnVJdGVtKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBPZmZUZXh0VHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE9mZlRleHRUcmFja01lbnVJdGVtKTsKCiAgICAvLyBDcmVhdGUgcHNldWRvIHRyYWNrIGluZm8KICAgIC8vIFJlcXVpcmVzIG9wdGlvbnNbJ2tpbmQnXQogICAgb3B0aW9ucy50cmFjayA9IHsKICAgICAgcGxheWVyOiBwbGF5ZXIsCiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCwKICAgICAga2luZHM6IG9wdGlvbnMua2luZHMsCiAgICAgICdkZWZhdWx0JzogZmFsc2UsCiAgICAgIG1vZGU6ICdkaXNhYmxlZCcKICAgIH07CgogICAgaWYgKCFvcHRpb25zLmtpbmRzKSB7CiAgICAgIG9wdGlvbnMua2luZHMgPSBbb3B0aW9ucy5raW5kXTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5sYWJlbCkgewogICAgICBvcHRpb25zLnRyYWNrLmxhYmVsID0gb3B0aW9ucy5sYWJlbDsKICAgIH0gZWxzZSB7CiAgICAgIG9wdGlvbnMudHJhY2subGFiZWwgPSBvcHRpb25zLmtpbmRzLmpvaW4oJyBhbmQgJykgKyAnIG9mZic7CiAgICB9CgogICAgLy8gTWVudUl0ZW0gaXMgc2VsZWN0YWJsZQogICAgb3B0aW9ucy5zZWxlY3RhYmxlID0gdHJ1ZTsKCiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVGV4dFRyYWNrTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKICB9CgogIC8qKgogICAqIEhhbmRsZSB0ZXh0IHRyYWNrIGNoYW5nZQogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gZXZlbnQKICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuCiAgICovCgoKICBPZmZUZXh0VHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlVHJhY2tzQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KSB7CiAgICB2YXIgdHJhY2tzID0gdGhpcy5wbGF5ZXIoKS50ZXh0VHJhY2tzKCk7CiAgICB2YXIgc2VsZWN0ZWQgPSB0cnVlOwoKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdHJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07CgogICAgICBpZiAodGhpcy5vcHRpb25zXy5raW5kcy5pbmRleE9mKHRyYWNrLmtpbmQpID4gLTEgJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7CiAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIHRoaXMuc2VsZWN0ZWQoc2VsZWN0ZWQpOwogIH07CgogIE9mZlRleHRUcmFja01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVTZWxlY3RlZExhbmd1YWdlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0ZWRMYW5ndWFnZUNoYW5nZShldmVudCkgewogICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpOwogICAgdmFyIGFsbEhpZGRlbiA9IHRydWU7CgogICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0cmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTsKCiAgICAgIGlmIChbJ2NhcHRpb25zJywgJ2Rlc2NyaXB0aW9ucycsICdzdWJ0aXRsZXMnXS5pbmRleE9mKHRyYWNrLmtpbmQpID4gLTEgJiYgdHJhY2subW9kZSA9PT0gJ3Nob3dpbmcnKSB7CiAgICAgICAgYWxsSGlkZGVuID0gZmFsc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYWxsSGlkZGVuKSB7CiAgICAgIHRoaXMucGxheWVyXy5jYWNoZV8uc2VsZWN0ZWRMYW5ndWFnZSA9IHsKICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgICB9OwogICAgfQogIH07CgogIHJldHVybiBPZmZUZXh0VHJhY2tNZW51SXRlbTsKfShUZXh0VHJhY2tNZW51SXRlbSk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ09mZlRleHRUcmFja01lbnVJdGVtJywgT2ZmVGV4dFRyYWNrTWVudUl0ZW0pOwoKLyoqCiAqIEBmaWxlIHRleHQtdHJhY2stYnV0dG9uLmpzCiAqLwovKioKICogVGhlIGJhc2UgY2xhc3MgZm9yIGJ1dHRvbnMgdGhhdCB0b2dnbGUgc3BlY2lmaWMgdGV4dCB0cmFjayB0eXBlcyAoZS5nLiBzdWJ0aXRsZXMpCiAqCiAqIEBleHRlbmRzIE1lbnVCdXR0b24KICovCgp2YXIgVGV4dFRyYWNrQnV0dG9uID0gZnVuY3Rpb24gKF9UcmFja0J1dHRvbikgewogIGluaGVyaXRzKFRleHRUcmFja0J1dHRvbiwgX1RyYWNrQnV0dG9uKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKi8KICBmdW5jdGlvbiBUZXh0VHJhY2tCdXR0b24ocGxheWVyKSB7CiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0VHJhY2tCdXR0b24pOwoKICAgIG9wdGlvbnMudHJhY2tzID0gcGxheWVyLnRleHRUcmFja3MoKTsKCiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfVHJhY2tCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKICB9CgogIC8qKgogICAqIENyZWF0ZSBhIG1lbnUgaXRlbSBmb3IgZWFjaCB0ZXh0IHRyYWNrCiAgICoKICAgKiBAcGFyYW0ge1RleHRUcmFja01lbnVJdGVtW119IFtpdGVtcz1bXV0KICAgKiAgICAgICAgRXhpc3RpbmcgYXJyYXkgb2YgaXRlbXMgdG8gdXNlIGR1cmluZyBjcmVhdGlvbgogICAqCiAgICogQHJldHVybiB7VGV4dFRyYWNrTWVudUl0ZW1bXX0KICAgKiAgICAgICAgIEFycmF5IG9mIG1lbnUgaXRlbXMgdGhhdCB3ZXJlIGNyZWF0ZWQKICAgKi8KCgogIFRleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMgPSBmdW5jdGlvbiBjcmVhdGVJdGVtcygpIHsKICAgIHZhciBpdGVtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107CiAgICB2YXIgVHJhY2tNZW51SXRlbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogVGV4dFRyYWNrTWVudUl0ZW07CgoKICAgIC8vIExhYmVsIGlzIGFuIG92ZXJpZGUgZm9yIHRoZSBbdHJhY2tdIG9mZiBsYWJlbAogICAgLy8gVVNlZCB0byBsb2NhbGlzZSBjYXB0aW9ucy9zdWJ0aXRsZXMKICAgIHZhciBsYWJlbCA9IHZvaWQgMDsKCiAgICBpZiAodGhpcy5sYWJlbF8pIHsKICAgICAgbGFiZWwgPSB0aGlzLmxhYmVsXyArICcgb2ZmJzsKICAgIH0KICAgIC8vIEFkZCBhbiBPRkYgbWVudSBpdGVtIHRvIHR1cm4gYWxsIHRyYWNrcyBvZmYKICAgIGl0ZW1zLnB1c2gobmV3IE9mZlRleHRUcmFja01lbnVJdGVtKHRoaXMucGxheWVyXywgewogICAgICBraW5kczogdGhpcy5raW5kc18sCiAgICAgIGtpbmQ6IHRoaXMua2luZF8sCiAgICAgIGxhYmVsOiBsYWJlbAogICAgfSkpOwoKICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gKz0gMTsKCiAgICB2YXIgdHJhY2tzID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja3MoKTsKCiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5raW5kc18pKSB7CiAgICAgIHRoaXMua2luZHNfID0gW3RoaXMua2luZF9dOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTsKCiAgICAgIC8vIG9ubHkgYWRkIHRyYWNrcyB0aGF0IGFyZSBvZiBhbiBhcHByb3ByaWF0ZSBraW5kIGFuZCBoYXZlIGEgbGFiZWwKICAgICAgaWYgKHRoaXMua2luZHNfLmluZGV4T2YodHJhY2sua2luZCkgPiAtMSkgewoKICAgICAgICB2YXIgaXRlbSA9IG5ldyBUcmFja01lbnVJdGVtKHRoaXMucGxheWVyXywgewogICAgICAgICAgdHJhY2s6IHRyYWNrLAogICAgICAgICAgLy8gTWVudUl0ZW0gaXMgc2VsZWN0YWJsZQogICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZQogICAgICAgIH0pOwoKICAgICAgICBpdGVtLmFkZENsYXNzKCd2anMtJyArIHRyYWNrLmtpbmQgKyAnLW1lbnUtaXRlbScpOwogICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaXRlbXM7CiAgfTsKCiAgcmV0dXJuIFRleHRUcmFja0J1dHRvbjsKfShUcmFja0J1dHRvbik7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja0J1dHRvbicsIFRleHRUcmFja0J1dHRvbik7CgovKioKICogQGZpbGUgY2hhcHRlcnMtdHJhY2stbWVudS1pdGVtLmpzCiAqLwovKioKICogVGhlIGNoYXB0ZXIgdHJhY2sgbWVudSBpdGVtCiAqCiAqIEBleHRlbmRzIE1lbnVJdGVtCiAqLwoKdmFyIENoYXB0ZXJzVHJhY2tNZW51SXRlbSA9IGZ1bmN0aW9uIChfTWVudUl0ZW0pIHsKICBpbmhlcml0cyhDaGFwdGVyc1RyYWNrTWVudUl0ZW0sIF9NZW51SXRlbSk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gQ2hhcHRlcnNUcmFja01lbnVJdGVtKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hhcHRlcnNUcmFja01lbnVJdGVtKTsKCiAgICB2YXIgdHJhY2sgPSBvcHRpb25zLnRyYWNrOwogICAgdmFyIGN1ZSA9IG9wdGlvbnMuY3VlOwogICAgdmFyIGN1cnJlbnRUaW1lID0gcGxheWVyLmN1cnJlbnRUaW1lKCk7CgogICAgLy8gTW9kaWZ5IG9wdGlvbnMgZm9yIHBhcmVudCBNZW51SXRlbSBjbGFzcydzIGluaXQuCiAgICBvcHRpb25zLnNlbGVjdGFibGUgPSB0cnVlOwogICAgb3B0aW9ucy5sYWJlbCA9IGN1ZS50ZXh0OwogICAgb3B0aW9ucy5zZWxlY3RlZCA9IGN1ZS5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBjdWUuZW5kVGltZTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLnRyYWNrID0gdHJhY2s7CiAgICBfdGhpcy5jdWUgPSBjdWU7CiAgICB0cmFjay5hZGRFdmVudExpc3RlbmVyKCdjdWVjaGFuZ2UnLCBiaW5kKF90aGlzLCBfdGhpcy51cGRhdGUpKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgQ2hhcHRlcnNUcmFja01lbnVJdGVtYCBpcyAiY2xpY2tlZCIuIFNlZQogICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUKICAgKiAgICAgICAgY2FsbGVkLgogICAqCiAgICogQGxpc3RlbnMgdGFwCiAgICogQGxpc3RlbnMgY2xpY2sKICAgKi8KCgogIENoYXB0ZXJzVHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMpOwogICAgdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKHRoaXMuY3VlLnN0YXJ0VGltZSk7CiAgICB0aGlzLnVwZGF0ZSh0aGlzLmN1ZS5zdGFydFRpbWUpOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSBjaGFwdGVyIG1lbnUgaXRlbQogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUgYGN1ZWNoYW5nZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBUZXh0VHJhY2sjY3VlY2hhbmdlCiAgICovCgoKICBDaGFwdGVyc1RyYWNrTWVudUl0ZW0ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkgewogICAgdmFyIGN1ZSA9IHRoaXMuY3VlOwogICAgdmFyIGN1cnJlbnRUaW1lID0gdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7CgogICAgLy8gdmpzLmxvZyhjdXJyZW50VGltZSwgY3VlLnN0YXJ0VGltZSk7CiAgICB0aGlzLnNlbGVjdGVkKGN1ZS5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBjdWUuZW5kVGltZSk7CiAgfTsKCiAgcmV0dXJuIENoYXB0ZXJzVHJhY2tNZW51SXRlbTsKfShNZW51SXRlbSk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzVHJhY2tNZW51SXRlbScsIENoYXB0ZXJzVHJhY2tNZW51SXRlbSk7CgovKioKICogQGZpbGUgY2hhcHRlcnMtYnV0dG9uLmpzCiAqLwovKioKICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3RpbmcgY2hhcHRlcnMKICogQ2hhcHRlcnMgYWN0IG11Y2ggZGlmZmVyZW50bHkgdGhhbiBvdGhlciB0ZXh0IHRyYWNrcwogKiBDdWVzIGFyZSBuYXZpZ2F0aW9uIHZzLiBvdGhlciB0cmFja3Mgb2YgYWx0ZXJuYXRpdmUgbGFuZ3VhZ2VzCiAqCiAqIEBleHRlbmRzIFRleHRUcmFja0J1dHRvbgogKi8KCnZhciBDaGFwdGVyc0J1dHRvbiA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrQnV0dG9uKSB7CiAgaW5oZXJpdHMoQ2hhcHRlcnNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqCiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XQogICAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgcmVhZHkuCiAgICovCiAgZnVuY3Rpb24gQ2hhcHRlcnNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hhcHRlcnNCdXR0b24pOwogICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTsKICB9CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWNoYXB0ZXJzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtY2hhcHRlcnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSB0aGUgbWVudSBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBpdHMgaXRlbXMuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIEFuIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgVGV4dFRyYWNrTGlzdCNhZGR0cmFjawogICAqIEBsaXN0ZW5zIFRleHRUcmFja0xpc3QjcmVtb3ZldHJhY2sKICAgKiBAbGlzdGVucyBUZXh0VHJhY2tMaXN0I2NoYW5nZQogICAqLwoKCiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkgewogICAgaWYgKCF0aGlzLnRyYWNrXyB8fCBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2FkZHRyYWNrJyB8fCBldmVudC50eXBlID09PSAncmVtb3ZldHJhY2snKSkgewogICAgICB0aGlzLnNldFRyYWNrKHRoaXMuZmluZENoYXB0ZXJzVHJhY2soKSk7CiAgICB9CiAgICBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0cmFjayBmb3IgdGhlIGNoYXB0ZXJzIGJ1dHRvbi4KICAgKgogICAqIEBwYXJhbSB7VGV4dFRyYWNrfSB0cmFjawogICAqICAgICAgICBUaGUgbmV3IHRyYWNrIHRvIHNlbGVjdC4gTm90aGluZyB3aWxsIGNoYW5nZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKICAgKiAgICAgICAgdHJhY2suCiAgICovCgoKICBDaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUuc2V0VHJhY2sgPSBmdW5jdGlvbiBzZXRUcmFjayh0cmFjaykgewogICAgaWYgKHRoaXMudHJhY2tfID09PSB0cmFjaykgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCF0aGlzLnVwZGF0ZUhhbmRsZXJfKSB7CiAgICAgIHRoaXMudXBkYXRlSGFuZGxlcl8gPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpOwogICAgfQoKICAgIC8vIGhlcmUgdGhpcy50cmFja18gcmVmZXJzIHRvIHRoZSBvbGQgdHJhY2sgaW5zdGFuY2UKICAgIGlmICh0aGlzLnRyYWNrXykgewogICAgICB2YXIgcmVtb3RlVGV4dFRyYWNrRWwgPSB0aGlzLnBsYXllcl8ucmVtb3RlVGV4dFRyYWNrRWxzKCkuZ2V0VHJhY2tFbGVtZW50QnlUcmFja18odGhpcy50cmFja18pOwoKICAgICAgaWYgKHJlbW90ZVRleHRUcmFja0VsKSB7CiAgICAgICAgcmVtb3RlVGV4dFRyYWNrRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXMudXBkYXRlSGFuZGxlcl8pOwogICAgICB9CgogICAgICB0aGlzLnRyYWNrXyA9IG51bGw7CiAgICB9CgogICAgdGhpcy50cmFja18gPSB0cmFjazsKCiAgICAvLyBoZXJlIHRoaXMudHJhY2tfIHJlZmVycyB0byB0aGUgbmV3IHRyYWNrIGluc3RhbmNlCiAgICBpZiAodGhpcy50cmFja18pIHsKICAgICAgdGhpcy50cmFja18ubW9kZSA9ICdoaWRkZW4nOwoKICAgICAgdmFyIF9yZW1vdGVUZXh0VHJhY2tFbCA9IHRoaXMucGxheWVyXy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5nZXRUcmFja0VsZW1lbnRCeVRyYWNrXyh0aGlzLnRyYWNrXyk7CgogICAgICBpZiAoX3JlbW90ZVRleHRUcmFja0VsKSB7CiAgICAgICAgX3JlbW90ZVRleHRUcmFja0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLnVwZGF0ZUhhbmRsZXJfKTsKICAgICAgfQogICAgfQogIH07CgogIC8qKgogICAqIEZpbmQgdGhlIHRyYWNrIG9iamVjdCB0aGF0IGlzIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhpcyBDaGFwdGVyc0J1dHRvbgogICAqCiAgICogQHJldHVybiB7VGV4dFRyYWNrfHVuZGVmaW5lZH0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHRyYWNrIG9yIHVuZGVmaW5lZCBpZiBub25lIHdhcyBmb3VuZC4KICAgKi8KCgogIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5maW5kQ2hhcHRlcnNUcmFjayA9IGZ1bmN0aW9uIGZpbmRDaGFwdGVyc1RyYWNrKCkgewogICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCkgfHwgW107CgogICAgZm9yICh2YXIgaSA9IHRyYWNrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAvLyBXZSB3aWxsIGFsd2F5cyBjaG9vc2UgdGhlIGxhc3QgdHJhY2sgYXMgb3VyIGNoYXB0ZXJzVHJhY2sKICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldOwoKICAgICAgaWYgKHRyYWNrLmtpbmQgPT09IHRoaXMua2luZF8pIHsKICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKioKICAgKiBHZXQgdGhlIGNhcHRpb24gZm9yIHRoZSBDaGFwdGVyc0J1dHRvbiBiYXNlZCBvbiB0aGUgdHJhY2sgbGFiZWwuIFRoaXMgd2lsbCBhbHNvCiAgICogdXNlIHRoZSBjdXJyZW50IHRyYWNrcyBsb2NhbGl6ZWQga2luZCBhcyBhIGZhbGxiYWNrIGlmIGEgbGFiZWwgZG9lcyBub3QgZXhpc3QuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgdHJhY2tzIGN1cnJlbnQgbGFiZWwgb3IgdGhlIGxvY2FsaXplZCB0cmFjayBraW5kLgogICAqLwoKCiAgQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmdldE1lbnVDYXB0aW9uID0gZnVuY3Rpb24gZ2V0TWVudUNhcHRpb24oKSB7CiAgICBpZiAodGhpcy50cmFja18gJiYgdGhpcy50cmFja18ubGFiZWwpIHsKICAgICAgcmV0dXJuIHRoaXMudHJhY2tfLmxhYmVsOwogICAgfQogICAgcmV0dXJuIHRoaXMubG9jYWxpemUodG9UaXRsZUNhc2UodGhpcy5raW5kXykpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBtZW51IGZyb20gY2hhcHRlciB0cmFjawogICAqCiAgICogQHJldHVybiB7TWVudX0KICAgKiAgICAgICAgIE5ldyBtZW51IGZvciB0aGUgY2hhcHRlciBidXR0b25zCiAgICovCgoKICBDaGFwdGVyc0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlTWVudSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbnUoKSB7CiAgICB0aGlzLm9wdGlvbnNfLnRpdGxlID0gdGhpcy5nZXRNZW51Q2FwdGlvbigpOwogICAgcmV0dXJuIF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLmNyZWF0ZU1lbnUuY2FsbCh0aGlzKTsKICB9OwoKICAvKioKICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFjawogICAqCiAgICogQHJldHVybiB7VGV4dFRyYWNrTWVudUl0ZW1bXX0KICAgKiAgICAgICAgIEFycmF5IG9mIG1lbnUgaXRlbXMKICAgKi8KCgogIENoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkgewogICAgdmFyIGl0ZW1zID0gW107CgogICAgaWYgKCF0aGlzLnRyYWNrXykgewogICAgICByZXR1cm4gaXRlbXM7CiAgICB9CgogICAgdmFyIGN1ZXMgPSB0aGlzLnRyYWNrXy5jdWVzOwoKICAgIGlmICghY3VlcykgewogICAgICByZXR1cm4gaXRlbXM7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY3VlID0gY3Vlc1tpXTsKICAgICAgdmFyIG1pID0gbmV3IENoYXB0ZXJzVHJhY2tNZW51SXRlbSh0aGlzLnBsYXllcl8sIHsgdHJhY2s6IHRoaXMudHJhY2tfLCBjdWU6IGN1ZSB9KTsKCiAgICAgIGl0ZW1zLnB1c2gobWkpOwogICAgfQoKICAgIHJldHVybiBpdGVtczsKICB9OwoKICByZXR1cm4gQ2hhcHRlcnNCdXR0b247Cn0oVGV4dFRyYWNrQnV0dG9uKTsKCi8qKgogKiBga2luZGAgb2YgVGV4dFRyYWNrIHRvIGxvb2sgZm9yIHRvIGFzc29jaWF0ZSBpdCB3aXRoIHRoaXMgbWVudS4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCgoKQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmtpbmRfID0gJ2NoYXB0ZXJzJzsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBDaGFwdGVyc0J1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCBmb3IgbG9jYWxpemF0aW9uLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdDaGFwdGVycyc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzQnV0dG9uJywgQ2hhcHRlcnNCdXR0b24pOwoKLyoqCiAqIEBmaWxlIGRlc2NyaXB0aW9ucy1idXR0b24uanMKICovCi8qKgogKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBkZXNjcmlwdGlvbnMKICoKICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uCiAqLwoKdmFyIERlc2NyaXB0aW9uc0J1dHRvbiA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrQnV0dG9uKSB7CiAgaW5oZXJpdHMoRGVzY3JpcHRpb25zQnV0dG9uLCBfVGV4dFRyYWNrQnV0dG9uKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10KICAgKiAgICAgICAgVGhlIGtleS92YWx1ZSBzdG9yZSBvZiBwbGF5ZXIgb3B0aW9ucy4KICAgKgogICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV0KICAgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyByZWFkeS4KICAgKi8KICBmdW5jdGlvbiBEZXNjcmlwdGlvbnNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVzY3JpcHRpb25zQnV0dG9uKTsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UZXh0VHJhY2tCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSk7CgogICAgdmFyIHRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7CiAgICB2YXIgY2hhbmdlSGFuZGxlciA9IGJpbmQoX3RoaXMsIF90aGlzLmhhbmRsZVRyYWNrc0NoYW5nZSk7CgogICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpOwogICAgX3RoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTsKICAgIH0pOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogSGFuZGxlIHRleHQgdHJhY2sgY2hhbmdlCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBldmVudAogICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4KICAgKgogICAqIEBsaXN0ZW5zIFRleHRUcmFja0xpc3QjY2hhbmdlCiAgICovCgoKICBEZXNjcmlwdGlvbnNCdXR0b24ucHJvdG90eXBlLmhhbmRsZVRyYWNrc0NoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkgewogICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpOwogICAgdmFyIGRpc2FibGVkID0gZmFsc2U7CgogICAgLy8gQ2hlY2sgd2hldGhlciBhIHRyYWNrIG9mIGEgZGlmZmVyZW50IGtpbmQgaXMgc2hvd2luZwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0cmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTsKCiAgICAgIGlmICh0cmFjay5raW5kICE9PSB0aGlzLmtpbmRfICYmIHRyYWNrLm1vZGUgPT09ICdzaG93aW5nJykgewogICAgICAgIGRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIC8vIElmIGFub3RoZXIgdHJhY2sgaXMgc2hvd2luZywgZGlzYWJsZSB0aGlzIG1lbnUgYnV0dG9uCiAgICBpZiAoZGlzYWJsZWQpIHsKICAgICAgdGhpcy5kaXNhYmxlKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmVuYWJsZSgpOwogICAgfQogIH07CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIERlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1kZXNjcmlwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgRGVzY3JpcHRpb25zQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtZGVzY3JpcHRpb25zLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICByZXR1cm4gRGVzY3JpcHRpb25zQnV0dG9uOwp9KFRleHRUcmFja0J1dHRvbik7CgovKioKICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqIEBwcml2YXRlCiAqLwoKCkRlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnZGVzY3JpcHRpb25zJzsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBEZXNjcmlwdGlvbnNCdXR0b25gcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCkRlc2NyaXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0Rlc2NyaXB0aW9ucyc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0Rlc2NyaXB0aW9uc0J1dHRvbicsIERlc2NyaXB0aW9uc0J1dHRvbik7CgovKioKICogQGZpbGUgc3VidGl0bGVzLWJ1dHRvbi5qcwogKi8KLyoqCiAqIFRoZSBidXR0b24gY29tcG9uZW50IGZvciB0b2dnbGluZyBhbmQgc2VsZWN0aW5nIHN1YnRpdGxlcwogKgogKiBAZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b24KICovCgp2YXIgU3VidGl0bGVzQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHsKICBpbmhlcml0cyhTdWJ0aXRsZXNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqCiAgICogQHBhcmFtIHtDb21wb25lbnR+UmVhZHlDYWxsYmFja30gW3JlYWR5XQogICAqICAgICAgICBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlYWR5LgogICAqLwogIGZ1bmN0aW9uIFN1YnRpdGxlc0J1dHRvbihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdWJ0aXRsZXNCdXR0b24pOwogICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTsKICB9CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIFN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1zdWJ0aXRsZXMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgU3VidGl0bGVzQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtc3VidGl0bGVzLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICByZXR1cm4gU3VidGl0bGVzQnV0dG9uOwp9KFRleHRUcmFja0J1dHRvbik7CgovKioKICogYGtpbmRgIG9mIFRleHRUcmFjayB0byBsb29rIGZvciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGlzIG1lbnUuCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqIEBwcml2YXRlCiAqLwoKClN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnc3VidGl0bGVzJzsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBTdWJ0aXRsZXNCdXR0b25gcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovClN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1N1YnRpdGxlcyc7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1N1YnRpdGxlc0J1dHRvbicsIFN1YnRpdGxlc0J1dHRvbik7CgovKioKICogQGZpbGUgY2FwdGlvbi1zZXR0aW5ncy1tZW51LWl0ZW0uanMKICovCi8qKgogKiBUaGUgbWVudSBpdGVtIGZvciBjYXB0aW9uIHRyYWNrIHNldHRpbmdzIG1lbnUKICoKICogQGV4dGVuZHMgVGV4dFRyYWNrTWVudUl0ZW0KICovCgp2YXIgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0gPSBmdW5jdGlvbiAoX1RleHRUcmFja01lbnVJdGVtKSB7CiAgaW5oZXJpdHMoQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0sIF9UZXh0VHJhY2tNZW51SXRlbSk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0ocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSk7CgogICAgb3B0aW9ucy50cmFjayA9IHsKICAgICAgcGxheWVyOiBwbGF5ZXIsCiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCwKICAgICAgbGFiZWw6IG9wdGlvbnMua2luZCArICcgc2V0dGluZ3MnLAogICAgICBzZWxlY3RhYmxlOiBmYWxzZSwKICAgICAgJ2RlZmF1bHQnOiBmYWxzZSwKICAgICAgbW9kZTogJ2Rpc2FibGVkJwogICAgfTsKCiAgICAvLyBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSBoYXMgbm8gY29uY2VwdCBvZiAnc2VsZWN0ZWQnCiAgICBvcHRpb25zLnNlbGVjdGFibGUgPSBmYWxzZTsKCiAgICBvcHRpb25zLm5hbWUgPSAnQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0nOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja01lbnVJdGVtLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CgogICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy10ZXh0dHJhY2stc2V0dGluZ3MnKTsKICAgIF90aGlzLmNvbnRyb2xUZXh0KCcsIG9wZW5zICcgKyBvcHRpb25zLmtpbmQgKyAnIHNldHRpbmdzIGRpYWxvZycpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGFuIGBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbWAgaXMgImNsaWNrZWQiLiBTZWUKICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlCiAgICogICAgICAgIGNhbGxlZC4KICAgKgogICAqIEBsaXN0ZW5zIHRhcAogICAqIEBsaXN0ZW5zIGNsaWNrCiAgICovCgoKICBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogICAgdGhpcy5wbGF5ZXIoKS5nZXRDaGlsZCgndGV4dFRyYWNrU2V0dGluZ3MnKS5vcGVuKCk7CiAgfTsKCiAgcmV0dXJuIENhcHRpb25TZXR0aW5nc01lbnVJdGVtOwp9KFRleHRUcmFja01lbnVJdGVtKTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0nLCBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSk7CgovKioKICogQGZpbGUgY2FwdGlvbnMtYnV0dG9uLmpzCiAqLwovKioKICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3RpbmcgY2FwdGlvbnMKICoKICogQGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uCiAqLwoKdmFyIENhcHRpb25zQnV0dG9uID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tCdXR0b24pIHsKICBpbmhlcml0cyhDYXB0aW9uc0J1dHRvbiwgX1RleHRUcmFja0J1dHRvbik7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSBbcmVhZHldCiAgICogICAgICAgIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgcmVhZHkuCiAgICovCiAgZnVuY3Rpb24gQ2FwdGlvbnNCdXR0b24ocGxheWVyLCBvcHRpb25zLCByZWFkeSkgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FwdGlvbnNCdXR0b24pOwogICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RleHRUcmFja0J1dHRvbi5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucywgcmVhZHkpKTsKICB9CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIENhcHRpb25zQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWNhcHRpb25zLWJ1dHRvbiAnICsgX1RleHRUcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIENhcHRpb25zQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtY2FwdGlvbnMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBjYXB0aW9uIG1lbnUgaXRlbXMKICAgKgogICAqIEByZXR1cm4ge0NhcHRpb25TZXR0aW5nc01lbnVJdGVtW119CiAgICogICAgICAgICBUaGUgYXJyYXkgb2YgY3VycmVudCBtZW51IGl0ZW1zLgogICAqLwoKCiAgQ2FwdGlvbnNCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUl0ZW1zID0gZnVuY3Rpb24gY3JlYXRlSXRlbXMoKSB7CiAgICB2YXIgaXRlbXMgPSBbXTsKCiAgICBpZiAoISh0aGlzLnBsYXllcigpLnRlY2hfICYmIHRoaXMucGxheWVyKCkudGVjaF8uZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSkgewogICAgICBpdGVtcy5wdXNoKG5ldyBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSh0aGlzLnBsYXllcl8sIHsga2luZDogdGhpcy5raW5kXyB9KSk7CgogICAgICB0aGlzLmhpZGVUaHJlc2hvbGRfICs9IDE7CiAgICB9CgogICAgcmV0dXJuIF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUl0ZW1zLmNhbGwodGhpcywgaXRlbXMpOwogIH07CgogIHJldHVybiBDYXB0aW9uc0J1dHRvbjsKfShUZXh0VHJhY2tCdXR0b24pOwoKLyoqCiAqIGBraW5kYCBvZiBUZXh0VHJhY2sgdG8gbG9vayBmb3IgdG8gYXNzb2NpYXRlIGl0IHdpdGggdGhpcyBtZW51LgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KCgpDYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnY2FwdGlvbnMnOwoKLyoqCiAqIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGRpc3BsYXkgb3ZlciB0aGUgYENhcHRpb25zQnV0dG9uYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqIEBwcml2YXRlCiAqLwpDYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0NhcHRpb25zJzsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2FwdGlvbnNCdXR0b24nLCBDYXB0aW9uc0J1dHRvbik7CgovKioKICogQGZpbGUgc3Vicy1jYXBzLW1lbnUtaXRlbS5qcwogKi8KLyoqCiAqIFN1YnNDYXBzTWVudUl0ZW0gaGFzIGFuIFtjY10gaWNvbiB0byBkaXN0aW5ndWlzaCBjYXB0aW9ucyBmcm9tIHN1YnRpdGxlcwogKiBpbiB0aGUgU3Vic0NhcHNNZW51LgogKgogKiBAZXh0ZW5kcyBUZXh0VHJhY2tNZW51SXRlbQogKi8KCnZhciBTdWJzQ2Fwc01lbnVJdGVtID0gZnVuY3Rpb24gKF9UZXh0VHJhY2tNZW51SXRlbSkgewogIGluaGVyaXRzKFN1YnNDYXBzTWVudUl0ZW0sIF9UZXh0VHJhY2tNZW51SXRlbSk7CgogIGZ1bmN0aW9uIFN1YnNDYXBzTWVudUl0ZW0oKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdWJzQ2Fwc01lbnVJdGVtKTsKICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UZXh0VHJhY2tNZW51SXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICB9CgogIFN1YnNDYXBzTWVudUl0ZW0ucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwodHlwZSwgcHJvcHMsIGF0dHJzKSB7CiAgICB2YXIgaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJ2anMtbWVudS1pdGVtLXRleHQiPicgKyB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubGFiZWwpOwoKICAgIGlmICh0aGlzLm9wdGlvbnNfLnRyYWNrLmtpbmQgPT09ICdjYXB0aW9ucycpIHsKICAgICAgaW5uZXJIVE1MICs9ICdcbiAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiIGNsYXNzPSJ2anMtaWNvbi1wbGFjZWhvbGRlciI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz0idmpzLWNvbnRyb2wtdGV4dCI+ICcgKyB0aGlzLmxvY2FsaXplKCdDYXB0aW9ucycpICsgJzwvc3Bhbj5cbiAgICAgICc7CiAgICB9CgogICAgaW5uZXJIVE1MICs9ICc8L3NwYW4+JzsKCiAgICB2YXIgZWwgPSBfVGV4dFRyYWNrTWVudUl0ZW0ucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcywgdHlwZSwgYXNzaWduKHsKICAgICAgaW5uZXJIVE1MOiBpbm5lckhUTUwKICAgIH0sIHByb3BzKSwgYXR0cnMpOwoKICAgIHJldHVybiBlbDsKICB9OwoKICByZXR1cm4gU3Vic0NhcHNNZW51SXRlbTsKfShUZXh0VHJhY2tNZW51SXRlbSk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1N1YnNDYXBzTWVudUl0ZW0nLCBTdWJzQ2Fwc01lbnVJdGVtKTsKCi8qKgogKiBAZmlsZSBzdWItY2Fwcy1idXR0b24uanMKICovCi8qKgogKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBjYXB0aW9ucyBhbmQvb3Igc3VidGl0bGVzCiAqCiAqIEBleHRlbmRzIFRleHRUcmFja0J1dHRvbgogKi8KCnZhciBTdWJzQ2Fwc0J1dHRvbiA9IGZ1bmN0aW9uIChfVGV4dFRyYWNrQnV0dG9uKSB7CiAgaW5oZXJpdHMoU3Vic0NhcHNCdXR0b24sIF9UZXh0VHJhY2tCdXR0b24pOwoKICBmdW5jdGlvbiBTdWJzQ2Fwc0J1dHRvbihwbGF5ZXIpIHsKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN1YnNDYXBzQnV0dG9uKTsKCiAgICAvLyBBbHRob3VnaCBOb3J0aCBBbWVyaWNhIHVzZXMgImNhcHRpb25zIiBpbiBtb3N0IGNhc2VzIGZvcgogICAgLy8gImNhcHRpb25zIGFuZCBzdWJ0aXRsZXMiIG90aGVyIGxvY2FsZXMgdXNlICJzdWJ0aXRsZXMiCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9UZXh0VHJhY2tCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5sYWJlbF8gPSAnc3VidGl0bGVzJzsKICAgIGlmIChbJ2VuJywgJ2VuLXVzJywgJ2VuLWNhJywgJ2ZyLWNhJ10uaW5kZXhPZihfdGhpcy5wbGF5ZXJfLmxhbmd1YWdlXykgPiAtMSkgewogICAgICBfdGhpcy5sYWJlbF8gPSAnY2FwdGlvbnMnOwogICAgfQogICAgX3RoaXMubWVudUJ1dHRvbl8uY29udHJvbFRleHQodG9UaXRsZUNhc2UoX3RoaXMubGFiZWxfKSk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBTdWJzQ2Fwc0J1dHRvbi5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1zdWJzLWNhcHMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgU3Vic0NhcHNCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRXcmFwcGVyQ1NTQ2xhc3MoKSB7CiAgICByZXR1cm4gJ3Zqcy1zdWJzLWNhcHMtYnV0dG9uICcgKyBfVGV4dFRyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBjYXB0aW9uL3N1YnRpdGxlcyBtZW51IGl0ZW1zCiAgICoKICAgKiBAcmV0dXJuIHtDYXB0aW9uU2V0dGluZ3NNZW51SXRlbVtdfQogICAqICAgICAgICAgVGhlIGFycmF5IG9mIGN1cnJlbnQgbWVudSBpdGVtcy4KICAgKi8KCgogIFN1YnNDYXBzQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVJdGVtcyA9IGZ1bmN0aW9uIGNyZWF0ZUl0ZW1zKCkgewogICAgdmFyIGl0ZW1zID0gW107CgogICAgaWYgKCEodGhpcy5wbGF5ZXIoKS50ZWNoXyAmJiB0aGlzLnBsYXllcigpLnRlY2hfLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykpIHsKICAgICAgaXRlbXMucHVzaChuZXcgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7IGtpbmQ6IHRoaXMubGFiZWxfIH0pKTsKCiAgICAgIHRoaXMuaGlkZVRocmVzaG9sZF8gKz0gMTsKICAgIH0KCiAgICBpdGVtcyA9IF9UZXh0VHJhY2tCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUl0ZW1zLmNhbGwodGhpcywgaXRlbXMsIFN1YnNDYXBzTWVudUl0ZW0pOwogICAgcmV0dXJuIGl0ZW1zOwogIH07CgogIHJldHVybiBTdWJzQ2Fwc0J1dHRvbjsKfShUZXh0VHJhY2tCdXR0b24pOwoKLyoqCiAqIGBraW5kYHMgb2YgVGV4dFRyYWNrIHRvIGxvb2sgZm9yIHRvIGFzc29jaWF0ZSBpdCB3aXRoIHRoaXMgbWVudS4KICoKICogQHR5cGUge2FycmF5fQogKiBAcHJpdmF0ZQogKi8KCgpTdWJzQ2Fwc0J1dHRvbi5wcm90b3R5cGUua2luZHNfID0gWydjYXB0aW9ucycsICdzdWJ0aXRsZXMnXTsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBTdWJzQ2Fwc0J1dHRvbmBzIGNvbnRyb2xzLgogKgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KU3Vic0NhcHNCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdTdWJ0aXRsZXMnOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdTdWJzQ2Fwc0J1dHRvbicsIFN1YnNDYXBzQnV0dG9uKTsKCi8qKgogKiBAZmlsZSBhdWRpby10cmFjay1tZW51LWl0ZW0uanMKICovCi8qKgogKiBBbiB7QGxpbmsgQXVkaW9UcmFja30ge0BsaW5rIE1lbnVJdGVtfQogKgogKiBAZXh0ZW5kcyBNZW51SXRlbQogKi8KCnZhciBBdWRpb1RyYWNrTWVudUl0ZW0gPSBmdW5jdGlvbiAoX01lbnVJdGVtKSB7CiAgaW5oZXJpdHMoQXVkaW9UcmFja01lbnVJdGVtLCBfTWVudUl0ZW0pOwoKICAvKioKICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgIFRoZSBgUGxheWVyYCB0aGF0IHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogICAqICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIEF1ZGlvVHJhY2tNZW51SXRlbShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEF1ZGlvVHJhY2tNZW51SXRlbSk7CgogICAgdmFyIHRyYWNrID0gb3B0aW9ucy50cmFjazsKICAgIHZhciB0cmFja3MgPSBwbGF5ZXIuYXVkaW9UcmFja3MoKTsKCiAgICAvLyBNb2RpZnkgb3B0aW9ucyBmb3IgcGFyZW50IE1lbnVJdGVtIGNsYXNzJ3MgaW5pdC4KICAgIG9wdGlvbnMubGFiZWwgPSB0cmFjay5sYWJlbCB8fCB0cmFjay5sYW5ndWFnZSB8fCAnVW5rbm93bic7CiAgICBvcHRpb25zLnNlbGVjdGVkID0gdHJhY2suZW5hYmxlZDsKCiAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9NZW51SXRlbS5jYWxsKHRoaXMsIHBsYXllciwgb3B0aW9ucykpOwoKICAgIF90aGlzLnRyYWNrID0gdHJhY2s7CgogICAgdmFyIGNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbiBjaGFuZ2VIYW5kbGVyKCkgewogICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgewogICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CiAgICAgIH0KCiAgICAgIF90aGlzLmhhbmRsZVRyYWNrc0NoYW5nZS5hcHBseShfdGhpcywgYXJncyk7CiAgICB9OwoKICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTsKICAgIF90aGlzLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKCkgewogICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlSGFuZGxlcik7CiAgICB9KTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgQXVkaW9UcmFja01lbnVJdGVtIGlzICJjbGlja2VkIi4gU2VlIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9CiAgICogZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCBhIGNsaWNrIGNhbiBiZS4KICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGBrZXlkb3duYCwgYHRhcGAsIG9yIGBjbGlja2AgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBiZQogICAqICAgICAgICBjYWxsZWQuCiAgICoKICAgKiBAbGlzdGVucyB0YXAKICAgKiBAbGlzdGVucyBjbGljawogICAqLwoKCiAgQXVkaW9UcmFja01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7CiAgICB2YXIgdHJhY2tzID0gdGhpcy5wbGF5ZXJfLmF1ZGlvVHJhY2tzKCk7CgogICAgX01lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljay5jYWxsKHRoaXMsIGV2ZW50KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdHJhY2sgPSB0cmFja3NbaV07CgogICAgICB0cmFjay5lbmFibGVkID0gdHJhY2sgPT09IHRoaXMudHJhY2s7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIGFueSB7QGxpbmsgQXVkaW9UcmFja30gY2hhbmdlLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUge0BsaW5rIEF1ZGlvVHJhY2tMaXN0I2NoYW5nZX0gZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBBdWRpb1RyYWNrTGlzdCNjaGFuZ2UKICAgKi8KCgogIEF1ZGlvVHJhY2tNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlVHJhY2tzQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KSB7CiAgICB0aGlzLnNlbGVjdGVkKHRoaXMudHJhY2suZW5hYmxlZCk7CiAgfTsKCiAgcmV0dXJuIEF1ZGlvVHJhY2tNZW51SXRlbTsKfShNZW51SXRlbSk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0F1ZGlvVHJhY2tNZW51SXRlbScsIEF1ZGlvVHJhY2tNZW51SXRlbSk7CgovKioKICogQGZpbGUgYXVkaW8tdHJhY2stYnV0dG9uLmpzCiAqLwovKioKICogVGhlIGJhc2UgY2xhc3MgZm9yIGJ1dHRvbnMgdGhhdCB0b2dnbGUgc3BlY2lmaWMge0BsaW5rIEF1ZGlvVHJhY2t9IHR5cGVzLgogKgogKiBAZXh0ZW5kcyBUcmFja0J1dHRvbgogKi8KCnZhciBBdWRpb1RyYWNrQnV0dG9uID0gZnVuY3Rpb24gKF9UcmFja0J1dHRvbikgewogIGluaGVyaXRzKEF1ZGlvVHJhY2tCdXR0b24sIF9UcmFja0J1dHRvbik7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gQXVkaW9UcmFja0J1dHRvbihwbGF5ZXIpIHsKICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEF1ZGlvVHJhY2tCdXR0b24pOwoKICAgIG9wdGlvbnMudHJhY2tzID0gcGxheWVyLmF1ZGlvVHJhY2tzKCk7CgogICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RyYWNrQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKSk7CiAgfQoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCgoKICBBdWRpb1RyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWF1ZGlvLWJ1dHRvbiAnICsgX1RyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgQXVkaW9UcmFja0J1dHRvbi5wcm90b3R5cGUuYnVpbGRXcmFwcGVyQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZFdyYXBwZXJDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWF1ZGlvLWJ1dHRvbiAnICsgX1RyYWNrQnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBhIG1lbnUgaXRlbSBmb3IgZWFjaCBhdWRpbyB0cmFjawogICAqCiAgICogQHBhcmFtIHtBdWRpb1RyYWNrTWVudUl0ZW1bXX0gW2l0ZW1zPVtdXQogICAqICAgICAgICBBbiBhcnJheSBvZiBleGlzdGluZyBtZW51IGl0ZW1zIHRvIHVzZS4KICAgKgogICAqIEByZXR1cm4ge0F1ZGlvVHJhY2tNZW51SXRlbVtdfQogICAqICAgICAgICAgQW4gYXJyYXkgb2YgbWVudSBpdGVtcwogICAqLwoKCiAgQXVkaW9UcmFja0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlSXRlbXMgPSBmdW5jdGlvbiBjcmVhdGVJdGVtcygpIHsKICAgIHZhciBpdGVtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107CgogICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBhdWRpbyB0cmFjaywgdGhlcmUgbm8gcG9pbnQgaW4gc2hvd2luZyBpdAogICAgdGhpcy5oaWRlVGhyZXNob2xkXyA9IDE7CgogICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy5hdWRpb1RyYWNrcygpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0cmFjayA9IHRyYWNrc1tpXTsKCiAgICAgIGl0ZW1zLnB1c2gobmV3IEF1ZGlvVHJhY2tNZW51SXRlbSh0aGlzLnBsYXllcl8sIHsKICAgICAgICB0cmFjazogdHJhY2ssCiAgICAgICAgLy8gTWVudUl0ZW0gaXMgc2VsZWN0YWJsZQogICAgICAgIHNlbGVjdGFibGU6IHRydWUKICAgICAgfSkpOwogICAgfQoKICAgIHJldHVybiBpdGVtczsKICB9OwoKICByZXR1cm4gQXVkaW9UcmFja0J1dHRvbjsKfShUcmFja0J1dHRvbik7CgovKioKICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgQXVkaW9UcmFja0J1dHRvbmBzIGNvbnRyb2xzLiBBZGRlZCBmb3IgbG9jYWxpemF0aW9uLgogKgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KCgpBdWRpb1RyYWNrQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQXVkaW8gVHJhY2snOwpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0F1ZGlvVHJhY2tCdXR0b24nLCBBdWRpb1RyYWNrQnV0dG9uKTsKCi8qKgogKiBAZmlsZSBwbGF5YmFjay1yYXRlLW1lbnUtaXRlbS5qcwogKi8KLyoqCiAqIFRoZSBzcGVjaWZpYyBtZW51IGl0ZW0gdHlwZSBmb3Igc2VsZWN0aW5nIGEgcGxheWJhY2sgcmF0ZS4KICoKICogQGV4dGVuZHMgTWVudUl0ZW0KICovCgp2YXIgUGxheWJhY2tSYXRlTWVudUl0ZW0gPSBmdW5jdGlvbiAoX01lbnVJdGVtKSB7CiAgaW5oZXJpdHMoUGxheWJhY2tSYXRlTWVudUl0ZW0sIF9NZW51SXRlbSk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gUGxheWJhY2tSYXRlTWVudUl0ZW0ocGxheWVyLCBvcHRpb25zKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGF5YmFja1JhdGVNZW51SXRlbSk7CgogICAgdmFyIGxhYmVsID0gb3B0aW9ucy5yYXRlOwogICAgdmFyIHJhdGUgPSBwYXJzZUZsb2F0KGxhYmVsLCAxMCk7CgogICAgLy8gTW9kaWZ5IG9wdGlvbnMgZm9yIHBhcmVudCBNZW51SXRlbSBjbGFzcydzIGluaXQuCiAgICBvcHRpb25zLmxhYmVsID0gbGFiZWw7CiAgICBvcHRpb25zLnNlbGVjdGVkID0gcmF0ZSA9PT0gMTsKICAgIG9wdGlvbnMuc2VsZWN0YWJsZSA9IHRydWU7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTWVudUl0ZW0uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5sYWJlbCA9IGxhYmVsOwogICAgX3RoaXMucmF0ZSA9IHJhdGU7CgogICAgX3RoaXMub24ocGxheWVyLCAncmF0ZWNoYW5nZScsIF90aGlzLnVwZGF0ZSk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICAvKioKICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYW4gYFBsYXliYWNrUmF0ZU1lbnVJdGVtYCBpcyAiY2xpY2tlZCIuIFNlZQogICAqIHtAbGluayBDbGlja2FibGVDb21wb25lbnR9IGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgYSBjbGljayBjYW4gYmUuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBga2V5ZG93bmAsIGB0YXBgLCBvciBgY2xpY2tgIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gYmUKICAgKiAgICAgICAgY2FsbGVkLgogICAqCiAgICogQGxpc3RlbnMgdGFwCiAgICogQGxpc3RlbnMgY2xpY2sKICAgKi8KCgogIFBsYXliYWNrUmF0ZU1lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7CiAgICBfTWVudUl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrLmNhbGwodGhpcyk7CiAgICB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSh0aGlzLnJhdGUpOwogIH07CgogIC8qKgogICAqIFVwZGF0ZSB0aGUgUGxheWJhY2tSYXRlTWVudUl0ZW0gd2hlbiB0aGUgcGxheWJhY2tyYXRlIGNoYW5nZXMuCiAgICoKICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fkV2ZW50fSBbZXZlbnRdCiAgICogICAgICAgIFRoZSBgcmF0ZWNoYW5nZWAgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjcmF0ZWNoYW5nZQogICAqLwoKCiAgUGxheWJhY2tSYXRlTWVudUl0ZW0ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShldmVudCkgewogICAgdGhpcy5zZWxlY3RlZCh0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpID09PSB0aGlzLnJhdGUpOwogIH07CgogIHJldHVybiBQbGF5YmFja1JhdGVNZW51SXRlbTsKfShNZW51SXRlbSk7CgovKioKICogVGhlIHRleHQgdGhhdCBzaG91bGQgZGlzcGxheSBvdmVyIHRoZSBgUGxheWJhY2tSYXRlTWVudUl0ZW1gcyBjb250cm9scy4gQWRkZWQgZm9yIGxvY2FsaXphdGlvbi4KICoKICogQHR5cGUge3N0cmluZ30KICogQHByaXZhdGUKICovCgoKUGxheWJhY2tSYXRlTWVudUl0ZW0ucHJvdG90eXBlLmNvbnRlbnRFbFR5cGUgPSAnYnV0dG9uJzsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUGxheWJhY2tSYXRlTWVudUl0ZW0nLCBQbGF5YmFja1JhdGVNZW51SXRlbSk7CgovKioKICogQGZpbGUgcGxheWJhY2stcmF0ZS1tZW51LWJ1dHRvbi5qcwogKi8KLyoqCiAqIFRoZSBjb21wb25lbnQgZm9yIGNvbnRyb2xsaW5nIHRoZSBwbGF5YmFjayByYXRlLgogKgogKiBAZXh0ZW5kcyBNZW51QnV0dG9uCiAqLwoKdmFyIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24gPSBmdW5jdGlvbiAoX01lbnVCdXR0b24pIHsKICBpbmhlcml0cyhQbGF5YmFja1JhdGVNZW51QnV0dG9uLCBfTWVudUJ1dHRvbik7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIKICAgKiAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICovCiAgZnVuY3Rpb24gUGxheWJhY2tSYXRlTWVudUJ1dHRvbihwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24pOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX01lbnVCdXR0b24uY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy51cGRhdGVWaXNpYmlsaXR5KCk7CiAgICBfdGhpcy51cGRhdGVMYWJlbCgpOwoKICAgIF90aGlzLm9uKHBsYXllciwgJ2xvYWRzdGFydCcsIF90aGlzLnVwZGF0ZVZpc2liaWxpdHkpOwogICAgX3RoaXMub24ocGxheWVyLCAncmF0ZWNoYW5nZScsIF90aGlzLnVwZGF0ZUxhYmVsKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudAogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCgoKICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgdmFyIGVsID0gX01lbnVCdXR0b24ucHJvdG90eXBlLmNyZWF0ZUVsLmNhbGwodGhpcyk7CgogICAgdGhpcy5sYWJlbEVsXyA9IGNyZWF0ZUVsKCdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1wbGF5YmFjay1yYXRlLXZhbHVlJywKICAgICAgaW5uZXJIVE1MOiAnMXgnCiAgICB9KTsKCiAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsRWxfKTsKCiAgICByZXR1cm4gZWw7CiAgfTsKCiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICB0aGlzLmxhYmVsRWxfID0gbnVsbDsKCiAgICBfTWVudUJ1dHRvbi5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIEJ1aWxkcyB0aGUgZGVmYXVsdCBET00gYGNsYXNzTmFtZWAuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgRE9NIGBjbGFzc05hbWVgIGZvciB0aGlzIG9iamVjdC4KICAgKi8KCgogIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtcGxheWJhY2stcmF0ZSAnICsgX01lbnVCdXR0b24ucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MuY2FsbCh0aGlzKTsKICB9OwoKICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5idWlsZFdyYXBwZXJDU1NDbGFzcyA9IGZ1bmN0aW9uIGJ1aWxkV3JhcHBlckNTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtcGxheWJhY2stcmF0ZSAnICsgX01lbnVCdXR0b24ucHJvdG90eXBlLmJ1aWxkV3JhcHBlckNTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBwbGF5YmFjayByYXRlIG1lbnUKICAgKgogICAqIEByZXR1cm4ge01lbnV9CiAgICogICAgICAgICBNZW51IG9iamVjdCBwb3B1bGF0ZWQgd2l0aCB7QGxpbmsgUGxheWJhY2tSYXRlTWVudUl0ZW19cwogICAqLwoKCiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUuY3JlYXRlTWVudSA9IGZ1bmN0aW9uIGNyZWF0ZU1lbnUoKSB7CiAgICB2YXIgbWVudSA9IG5ldyBNZW51KHRoaXMucGxheWVyKCkpOwogICAgdmFyIHJhdGVzID0gdGhpcy5wbGF5YmFja1JhdGVzKCk7CgogICAgaWYgKHJhdGVzKSB7CiAgICAgIGZvciAodmFyIGkgPSByYXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIG1lbnUuYWRkQ2hpbGQobmV3IFBsYXliYWNrUmF0ZU1lbnVJdGVtKHRoaXMucGxheWVyKCksIHsgcmF0ZTogcmF0ZXNbaV0gKyAneCcgfSkpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG1lbnU7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlcyBBUklBIGFjY2Vzc2liaWxpdHkgYXR0cmlidXRlcwogICAqLwoKCiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUudXBkYXRlQVJJQUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiB1cGRhdGVBUklBQXR0cmlidXRlcygpIHsKICAgIC8vIEN1cnJlbnQgcGxheWJhY2sgcmF0ZQogICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMucGxheWVyKCkucGxheWJhY2tSYXRlKCkpOwogIH07CgogIC8qKgogICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhbiBgUGxheWJhY2tSYXRlTWVudUJ1dHRvbmAgaXMgImNsaWNrZWQiLiBTZWUKICAgKiB7QGxpbmsgQ2xpY2thYmxlQ29tcG9uZW50fSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IGEgY2xpY2sgY2FuIGJlLgogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUgYGtleWRvd25gLCBgdGFwYCwgb3IgYGNsaWNrYCBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIGJlCiAgICogICAgICAgIGNhbGxlZC4KICAgKgogICAqIEBsaXN0ZW5zIHRhcAogICAqIEBsaXN0ZW5zIGNsaWNrCiAgICovCgoKICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7CiAgICAvLyBzZWxlY3QgbmV4dCByYXRlIG9wdGlvbgogICAgdmFyIGN1cnJlbnRSYXRlID0gdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUoKTsKICAgIHZhciByYXRlcyA9IHRoaXMucGxheWJhY2tSYXRlcygpOwoKICAgIC8vIHRoaXMgd2lsbCBzZWxlY3QgZmlyc3Qgb25lIGlmIHRoZSBsYXN0IG9uZSBjdXJyZW50bHkgc2VsZWN0ZWQKICAgIHZhciBuZXdSYXRlID0gcmF0ZXNbMF07CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXRlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAocmF0ZXNbaV0gPiBjdXJyZW50UmF0ZSkgewogICAgICAgIG5ld1JhdGUgPSByYXRlc1tpXTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUobmV3UmF0ZSk7CiAgfTsKCiAgLyoqCiAgICogR2V0IHBvc3NpYmxlIHBsYXliYWNrIHJhdGVzCiAgICoKICAgKiBAcmV0dXJuIHtBcnJheX0KICAgKiAgICAgICAgIEFsbCBwb3NzaWJsZSBwbGF5YmFjayByYXRlcwogICAqLwoKCiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUucGxheWJhY2tSYXRlcyA9IGZ1bmN0aW9uIHBsYXliYWNrUmF0ZXMoKSB7CiAgICByZXR1cm4gdGhpcy5vcHRpb25zXy5wbGF5YmFja1JhdGVzIHx8IHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNfLnBsYXllck9wdGlvbnMucGxheWJhY2tSYXRlczsKICB9OwoKICAvKioKICAgKiBHZXQgd2hldGhlciBwbGF5YmFjayByYXRlcyBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRlY2gKICAgKiBhbmQgYW4gYXJyYXkgb2YgcGxheWJhY2sgcmF0ZXMgZXhpc3RzCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgV2hldGhlciBjaGFuZ2luZyBwbGF5YmFjayByYXRlIGlzIHN1cHBvcnRlZAogICAqLwoKCiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbi5wcm90b3R5cGUucGxheWJhY2tSYXRlU3VwcG9ydGVkID0gZnVuY3Rpb24gcGxheWJhY2tSYXRlU3VwcG9ydGVkKCkgewogICAgcmV0dXJuIHRoaXMucGxheWVyKCkudGVjaF8gJiYgdGhpcy5wbGF5ZXIoKS50ZWNoXy5mZWF0dXJlc1BsYXliYWNrUmF0ZSAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKSAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKS5sZW5ndGggPiAwOwogIH07CgogIC8qKgogICAqIEhpZGUgcGxheWJhY2sgcmF0ZSBjb250cm9scyB3aGVuIHRoZXkncmUgbm8gcGxheWJhY2sgcmF0ZSBvcHRpb25zIHRvIHNlbGVjdAogICAqCiAgICogQHBhcmFtIHtFdmVudFRhcmdldH5FdmVudH0gW2V2ZW50XQogICAqICAgICAgICBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhpcyBmdW5jdGlvbiB0byBydW4uCiAgICoKICAgKiBAbGlzdGVucyBQbGF5ZXIjbG9hZHN0YXJ0CiAgICovCgoKICBQbGF5YmFja1JhdGVNZW51QnV0dG9uLnByb3RvdHlwZS51cGRhdGVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gdXBkYXRlVmlzaWJpbGl0eShldmVudCkgewogICAgaWYgKHRoaXMucGxheWJhY2tSYXRlU3VwcG9ydGVkKCkpIHsKICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpOwogICAgfQogIH07CgogIC8qKgogICAqIFVwZGF0ZSBidXR0b24gbGFiZWwgd2hlbiByYXRlIGNoYW5nZWQKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IFtldmVudF0KICAgKiAgICAgICAgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoaXMgZnVuY3Rpb24gdG8gcnVuLgogICAqCiAgICogQGxpc3RlbnMgUGxheWVyI3JhdGVjaGFuZ2UKICAgKi8KCgogIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLnVwZGF0ZUxhYmVsID0gZnVuY3Rpb24gdXBkYXRlTGFiZWwoZXZlbnQpIHsKICAgIGlmICh0aGlzLnBsYXliYWNrUmF0ZVN1cHBvcnRlZCgpKSB7CiAgICAgIHRoaXMubGFiZWxFbF8uaW5uZXJIVE1MID0gdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUoKSArICd4JzsKICAgIH0KICB9OwoKICByZXR1cm4gUGxheWJhY2tSYXRlTWVudUJ1dHRvbjsKfShNZW51QnV0dG9uKTsKCi8qKgogKiBUaGUgdGV4dCB0aGF0IHNob3VsZCBkaXNwbGF5IG92ZXIgdGhlIGBGdWxsc2NyZWVuVG9nZ2xlYHMgY29udHJvbHMuIEFkZGVkIGZvciBsb2NhbGl6YXRpb24uCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqIEBwcml2YXRlCiAqLwoKClBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdQbGF5YmFjayBSYXRlJzsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnUGxheWJhY2tSYXRlTWVudUJ1dHRvbicsIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24pOwoKLyoqCiAqIEBmaWxlIHNwYWNlci5qcwogKi8KLyoqCiAqIEp1c3QgYW4gZW1wdHkgc3BhY2VyIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBhcHBlbmQgcG9pbnQgZm9yIHBsdWdpbnMsIGV0Yy4KICogQWxzbyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS4KICoKICogQGV4dGVuZHMgQ29tcG9uZW50CiAqLwoKdmFyIFNwYWNlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoU3BhY2VyLCBfQ29tcG9uZW50KTsKCiAgZnVuY3Rpb24gU3BhY2VyKCkgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3BhY2VyKTsKICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgfQoKICAvKioKICAgKiBCdWlsZHMgdGhlIGRlZmF1bHQgRE9NIGBjbGFzc05hbWVgLgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIERPTSBgY2xhc3NOYW1lYCBmb3IgdGhpcyBvYmplY3QuCiAgICovCiAgU3BhY2VyLnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLXNwYWNlciAnICsgX0NvbXBvbmVudC5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYENvbXBvbmVudGAncyBET00gZWxlbWVudAogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICovCgoKICBTcGFjZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpCiAgICB9KTsKICB9OwoKICByZXR1cm4gU3BhY2VyOwp9KENvbXBvbmVudCk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1NwYWNlcicsIFNwYWNlcik7CgovKioKICogQGZpbGUgY3VzdG9tLWNvbnRyb2wtc3BhY2VyLmpzCiAqLwovKioKICogU3BhY2VyIHNwZWNpZmljYWxseSBtZWFudCB0byBiZSB1c2VkIGFzIGFuIGluc2VydGlvbiBwb2ludCBmb3IgbmV3IHBsdWdpbnMsIGV0Yy4KICoKICogQGV4dGVuZHMgU3BhY2VyCiAqLwoKdmFyIEN1c3RvbUNvbnRyb2xTcGFjZXIgPSBmdW5jdGlvbiAoX1NwYWNlcikgewogIGluaGVyaXRzKEN1c3RvbUNvbnRyb2xTcGFjZXIsIF9TcGFjZXIpOwoKICBmdW5jdGlvbiBDdXN0b21Db250cm9sU3BhY2VyKCkgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ3VzdG9tQ29udHJvbFNwYWNlcik7CiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfU3BhY2VyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogIH0KCiAgLyoqCiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LgogICAqLwogIEN1c3RvbUNvbnRyb2xTcGFjZXIucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkgewogICAgcmV0dXJuICd2anMtY3VzdG9tLWNvbnRyb2wtc3BhY2VyICcgKyBfU3BhY2VyLnByb3RvdHlwZS5idWlsZENTU0NsYXNzLmNhbGwodGhpcyk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgQ29tcG9uZW50YCdzIERPTSBlbGVtZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKi8KCgogIEN1c3RvbUNvbnRyb2xTcGFjZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgICB2YXIgZWwgPSBfU3BhY2VyLnByb3RvdHlwZS5jcmVhdGVFbC5jYWxsKHRoaXMsIHsKICAgICAgY2xhc3NOYW1lOiB0aGlzLmJ1aWxkQ1NTQ2xhc3MoKQogICAgfSk7CgogICAgLy8gTm8tZmxleC90YWJsZS1jZWxsIG1vZGUgcmVxdWlyZXMgdGhlcmUgYmUgc29tZSBjb250ZW50CiAgICAvLyBpbiB0aGUgY2VsbCB0byBmaWxsIHRoZSByZW1haW5pbmcgc3BhY2Ugb2YgdGhlIHRhYmxlLgogICAgZWwuaW5uZXJIVE1MID0gJ1x4QTAnOwogICAgcmV0dXJuIGVsOwogIH07CgogIHJldHVybiBDdXN0b21Db250cm9sU3BhY2VyOwp9KFNwYWNlcik7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0N1c3RvbUNvbnRyb2xTcGFjZXInLCBDdXN0b21Db250cm9sU3BhY2VyKTsKCi8qKgogKiBAZmlsZSBjb250cm9sLWJhci5qcwogKi8KLy8gUmVxdWlyZWQgY2hpbGRyZW4KLyoqCiAqIENvbnRhaW5lciBvZiBtYWluIGNvbnRyb2xzLgogKgogKiBAZXh0ZW5kcyBDb21wb25lbnQKICovCgp2YXIgQ29udHJvbEJhciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7CiAgaW5oZXJpdHMoQ29udHJvbEJhciwgX0NvbXBvbmVudCk7CgogIGZ1bmN0aW9uIENvbnRyb2xCYXIoKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb250cm9sQmFyKTsKICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgfQoKICAvKioKICAgKiBDcmVhdGUgdGhlIGBDb21wb25lbnRgJ3MgRE9NIGVsZW1lbnQKICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkLgogICAqLwogIENvbnRyb2xCYXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwoKSB7CiAgICByZXR1cm4gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC1iYXInLAogICAgICBkaXI6ICdsdHInCiAgICB9LCB7CiAgICAgIC8vIFRoZSBjb250cm9sIGJhciBpcyBhIGdyb3VwLCBidXQgd2UgZG9uJ3QgYXJpYS1sYWJlbCBpdCB0byBhdm9pZAogICAgICAvLyAgb3Zlci1hbm5vdW5jaW5nIGJ5IEpBV1MKICAgICAgcm9sZTogJ2dyb3VwJwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIENvbnRyb2xCYXI7Cn0oQ29tcG9uZW50KTsKCi8qKgogKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGBDb250cm9sQmFyYAogKgogKiBAdHlwZSB7T2JqZWN0fQogKiBAcHJpdmF0ZQogKi8KCgpDb250cm9sQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHsKICBjaGlsZHJlbjogWydwbGF5VG9nZ2xlJywgJ3ZvbHVtZVBhbmVsJywgJ2N1cnJlbnRUaW1lRGlzcGxheScsICd0aW1lRGl2aWRlcicsICdkdXJhdGlvbkRpc3BsYXknLCAncHJvZ3Jlc3NDb250cm9sJywgJ2xpdmVEaXNwbGF5JywgJ3JlbWFpbmluZ1RpbWVEaXNwbGF5JywgJ2N1c3RvbUNvbnRyb2xTcGFjZXInLCAncGxheWJhY2tSYXRlTWVudUJ1dHRvbicsICdjaGFwdGVyc0J1dHRvbicsICdkZXNjcmlwdGlvbnNCdXR0b24nLCAnc3Vic0NhcHNCdXR0b24nLCAnYXVkaW9UcmFja0J1dHRvbicsICdmdWxsc2NyZWVuVG9nZ2xlJ10KfTsKCkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ29udHJvbEJhcicsIENvbnRyb2xCYXIpOwoKLyoqCiAqIEBmaWxlIGVycm9yLWRpc3BsYXkuanMKICovCi8qKgogKiBBIGRpc3BsYXkgdGhhdCBpbmRpY2F0ZXMgYW4gZXJyb3IgaGFzIG9jY3VycmVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHZpZGVvCiAqIGlzIHVucGxheWFibGUuCiAqCiAqIEBleHRlbmRzIE1vZGFsRGlhbG9nCiAqLwoKdmFyIEVycm9yRGlzcGxheSA9IGZ1bmN0aW9uIChfTW9kYWxEaWFsb2cpIHsKICBpbmhlcml0cyhFcnJvckRpc3BsYXksIF9Nb2RhbERpYWxvZyk7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIEBwYXJhbSAge1BsYXllcn0gcGxheWVyCiAgICogICAgICAgICBUaGUgYFBsYXllcmAgdGhhdCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhdHRhY2hlZCB0by4KICAgKgogICAqIEBwYXJhbSAge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIEVycm9yRGlzcGxheShwbGF5ZXIsIG9wdGlvbnMpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEVycm9yRGlzcGxheSk7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTW9kYWxEaWFsb2cuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy5vbihwbGF5ZXIsICdlcnJvcicsIF90aGlzLm9wZW4pOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogQnVpbGRzIHRoZSBkZWZhdWx0IERPTSBgY2xhc3NOYW1lYC4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBET00gYGNsYXNzTmFtZWAgZm9yIHRoaXMgb2JqZWN0LgogICAqCiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA1LgogICAqLwoKCiAgRXJyb3JEaXNwbGF5LnByb3RvdHlwZS5idWlsZENTU0NsYXNzID0gZnVuY3Rpb24gYnVpbGRDU1NDbGFzcygpIHsKICAgIHJldHVybiAndmpzLWVycm9yLWRpc3BsYXkgJyArIF9Nb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIEdldHMgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGJhc2VkIG9uIHRoZSBgUGxheWVyYHMgZXJyb3IuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgYFBsYXllcmBzIGVycm9yIG1lc3NhZ2UgbG9jYWxpemVkIG9yIGFuIGVtcHR5IHN0cmluZy4KICAgKi8KCgogIEVycm9yRGlzcGxheS5wcm90b3R5cGUuY29udGVudCA9IGZ1bmN0aW9uIGNvbnRlbnQoKSB7CiAgICB2YXIgZXJyb3IgPSB0aGlzLnBsYXllcigpLmVycm9yKCk7CgogICAgcmV0dXJuIGVycm9yID8gdGhpcy5sb2NhbGl6ZShlcnJvci5tZXNzYWdlKSA6ICcnOwogIH07CgogIHJldHVybiBFcnJvckRpc3BsYXk7Cn0oTW9kYWxEaWFsb2cpOwoKLyoqCiAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGFuIGBFcnJvckRpc3BsYXlgLgogKgogKiBAcHJpdmF0ZQogKi8KCgpFcnJvckRpc3BsYXkucHJvdG90eXBlLm9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKE1vZGFsRGlhbG9nLnByb3RvdHlwZS5vcHRpb25zXywgewogIHBhdXNlT25PcGVuOiBmYWxzZSwKICBmaWxsQWx3YXlzOiB0cnVlLAogIHRlbXBvcmFyeTogZmFsc2UsCiAgdW5jbG9zZWFibGU6IHRydWUKfSk7CgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0Vycm9yRGlzcGxheScsIEVycm9yRGlzcGxheSk7CgovKioKICogQGZpbGUgdGV4dC10cmFjay1zZXR0aW5ncy5qcwogKi8KdmFyIExPQ0FMX1NUT1JBR0VfS0VZID0gJ3Zqcy10ZXh0LXRyYWNrLXNldHRpbmdzJzsKCnZhciBDT0xPUl9CTEFDSyA9IFsnIzAwMCcsICdCbGFjayddOwp2YXIgQ09MT1JfQkxVRSA9IFsnIzAwRicsICdCbHVlJ107CnZhciBDT0xPUl9DWUFOID0gWycjMEZGJywgJ0N5YW4nXTsKdmFyIENPTE9SX0dSRUVOID0gWycjMEYwJywgJ0dyZWVuJ107CnZhciBDT0xPUl9NQUdFTlRBID0gWycjRjBGJywgJ01hZ2VudGEnXTsKdmFyIENPTE9SX1JFRCA9IFsnI0YwMCcsICdSZWQnXTsKdmFyIENPTE9SX1dISVRFID0gWycjRkZGJywgJ1doaXRlJ107CnZhciBDT0xPUl9ZRUxMT1cgPSBbJyNGRjAnLCAnWWVsbG93J107Cgp2YXIgT1BBQ0lUWV9PUEFRVUUgPSBbJzEnLCAnT3BhcXVlJ107CnZhciBPUEFDSVRZX1NFTUkgPSBbJzAuNScsICdTZW1pLVRyYW5zcGFyZW50J107CnZhciBPUEFDSVRZX1RSQU5TID0gWycwJywgJ1RyYW5zcGFyZW50J107CgovLyBDb25maWd1cmF0aW9uIGZvciB0aGUgdmFyaW91cyA8c2VsZWN0PiBlbGVtZW50cyBpbiB0aGUgRE9NIG9mIHRoaXMgY29tcG9uZW50LgovLwovLyBQb3NzaWJsZSBrZXlzIGluY2x1ZGU6Ci8vCi8vIGBkZWZhdWx0YDoKLy8gICBUaGUgZGVmYXVsdCBvcHRpb24gaW5kZXguIE9ubHkgbmVlZHMgdG8gYmUgcHJvdmlkZWQgaWYgbm90IHplcm8uCi8vIGBwYXJzZXJgOgovLyAgIEEgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBwYXJzZSB0aGUgdmFsdWUgZnJvbSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluCi8vICAgYSBjdXN0b21pemVkIHdheS4KLy8gYHNlbGVjdG9yYDoKLy8gICBUaGUgc2VsZWN0b3IgdXNlZCB0byBmaW5kIHRoZSBhc3NvY2lhdGVkIDxzZWxlY3Q+IGVsZW1lbnQuCnZhciBzZWxlY3RDb25maWdzID0gewogIGJhY2tncm91bmRDb2xvcjogewogICAgc2VsZWN0b3I6ICcudmpzLWJnLWNvbG9yID4gc2VsZWN0JywKICAgIGlkOiAnY2FwdGlvbnMtYmFja2dyb3VuZC1jb2xvci0lcycsCiAgICBsYWJlbDogJ0NvbG9yJywKICAgIG9wdGlvbnM6IFtDT0xPUl9CTEFDSywgQ09MT1JfV0hJVEUsIENPTE9SX1JFRCwgQ09MT1JfR1JFRU4sIENPTE9SX0JMVUUsIENPTE9SX1lFTExPVywgQ09MT1JfTUFHRU5UQSwgQ09MT1JfQ1lBTl0KICB9LAoKICBiYWNrZ3JvdW5kT3BhY2l0eTogewogICAgc2VsZWN0b3I6ICcudmpzLWJnLW9wYWNpdHkgPiBzZWxlY3QnLAogICAgaWQ6ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLW9wYWNpdHktJXMnLAogICAgbGFiZWw6ICdUcmFuc3BhcmVuY3knLAogICAgb3B0aW9uczogW09QQUNJVFlfT1BBUVVFLCBPUEFDSVRZX1NFTUksIE9QQUNJVFlfVFJBTlNdCiAgfSwKCiAgY29sb3I6IHsKICAgIHNlbGVjdG9yOiAnLnZqcy1mZy1jb2xvciA+IHNlbGVjdCcsCiAgICBpZDogJ2NhcHRpb25zLWZvcmVncm91bmQtY29sb3ItJXMnLAogICAgbGFiZWw6ICdDb2xvcicsCiAgICBvcHRpb25zOiBbQ09MT1JfV0hJVEUsIENPTE9SX0JMQUNLLCBDT0xPUl9SRUQsIENPTE9SX0dSRUVOLCBDT0xPUl9CTFVFLCBDT0xPUl9ZRUxMT1csIENPTE9SX01BR0VOVEEsIENPTE9SX0NZQU5dCiAgfSwKCiAgZWRnZVN0eWxlOiB7CiAgICBzZWxlY3RvcjogJy52anMtZWRnZS1zdHlsZSA+IHNlbGVjdCcsCiAgICBpZDogJyVzJywKICAgIGxhYmVsOiAnVGV4dCBFZGdlIFN0eWxlJywKICAgIG9wdGlvbnM6IFtbJ25vbmUnLCAnTm9uZSddLCBbJ3JhaXNlZCcsICdSYWlzZWQnXSwgWydkZXByZXNzZWQnLCAnRGVwcmVzc2VkJ10sIFsndW5pZm9ybScsICdVbmlmb3JtJ10sIFsnZHJvcHNoYWRvdycsICdEcm9wc2hhZG93J11dCiAgfSwKCiAgZm9udEZhbWlseTogewogICAgc2VsZWN0b3I6ICcudmpzLWZvbnQtZmFtaWx5ID4gc2VsZWN0JywKICAgIGlkOiAnY2FwdGlvbnMtZm9udC1mYW1pbHktJXMnLAogICAgbGFiZWw6ICdGb250IEZhbWlseScsCiAgICBvcHRpb25zOiBbWydwcm9wb3J0aW9uYWxTYW5zU2VyaWYnLCAnUHJvcG9ydGlvbmFsIFNhbnMtU2VyaWYnXSwgWydtb25vc3BhY2VTYW5zU2VyaWYnLCAnTW9ub3NwYWNlIFNhbnMtU2VyaWYnXSwgWydwcm9wb3J0aW9uYWxTZXJpZicsICdQcm9wb3J0aW9uYWwgU2VyaWYnXSwgWydtb25vc3BhY2VTZXJpZicsICdNb25vc3BhY2UgU2VyaWYnXSwgWydjYXN1YWwnLCAnQ2FzdWFsJ10sIFsnc2NyaXB0JywgJ1NjcmlwdCddLCBbJ3NtYWxsLWNhcHMnLCAnU21hbGwgQ2FwcyddXQogIH0sCgogIGZvbnRQZXJjZW50OiB7CiAgICBzZWxlY3RvcjogJy52anMtZm9udC1wZXJjZW50ID4gc2VsZWN0JywKICAgIGlkOiAnY2FwdGlvbnMtZm9udC1zaXplLSVzJywKICAgIGxhYmVsOiAnRm9udCBTaXplJywKICAgIG9wdGlvbnM6IFtbJzAuNTAnLCAnNTAlJ10sIFsnMC43NScsICc3NSUnXSwgWycxLjAwJywgJzEwMCUnXSwgWycxLjI1JywgJzEyNSUnXSwgWycxLjUwJywgJzE1MCUnXSwgWycxLjc1JywgJzE3NSUnXSwgWycyLjAwJywgJzIwMCUnXSwgWyczLjAwJywgJzMwMCUnXSwgWyc0LjAwJywgJzQwMCUnXV0sCiAgICAnZGVmYXVsdCc6IDIsCiAgICBwYXJzZXI6IGZ1bmN0aW9uIHBhcnNlcih2KSB7CiAgICAgIHJldHVybiB2ID09PSAnMS4wMCcgPyBudWxsIDogTnVtYmVyKHYpOwogICAgfQogIH0sCgogIHRleHRPcGFjaXR5OiB7CiAgICBzZWxlY3RvcjogJy52anMtdGV4dC1vcGFjaXR5ID4gc2VsZWN0JywKICAgIGlkOiAnY2FwdGlvbnMtZm9yZWdyb3VuZC1vcGFjaXR5LSVzJywKICAgIGxhYmVsOiAnVHJhbnNwYXJlbmN5JywKICAgIG9wdGlvbnM6IFtPUEFDSVRZX09QQVFVRSwgT1BBQ0lUWV9TRU1JXQogIH0sCgogIC8vIE9wdGlvbnMgZm9yIHRoaXMgb2JqZWN0IGFyZSBkZWZpbmVkIGJlbG93LgogIHdpbmRvd0NvbG9yOiB7CiAgICBzZWxlY3RvcjogJy52anMtd2luZG93LWNvbG9yID4gc2VsZWN0JywKICAgIGlkOiAnY2FwdGlvbnMtd2luZG93LWNvbG9yLSVzJywKICAgIGxhYmVsOiAnQ29sb3InCiAgfSwKCiAgLy8gT3B0aW9ucyBmb3IgdGhpcyBvYmplY3QgYXJlIGRlZmluZWQgYmVsb3cuCiAgd2luZG93T3BhY2l0eTogewogICAgc2VsZWN0b3I6ICcudmpzLXdpbmRvdy1vcGFjaXR5ID4gc2VsZWN0JywKICAgIGlkOiAnY2FwdGlvbnMtd2luZG93LW9wYWNpdHktJXMnLAogICAgbGFiZWw6ICdUcmFuc3BhcmVuY3knLAogICAgb3B0aW9uczogW09QQUNJVFlfVFJBTlMsIE9QQUNJVFlfU0VNSSwgT1BBQ0lUWV9PUEFRVUVdCiAgfQp9OwoKc2VsZWN0Q29uZmlncy53aW5kb3dDb2xvci5vcHRpb25zID0gc2VsZWN0Q29uZmlncy5iYWNrZ3JvdW5kQ29sb3Iub3B0aW9uczsKCi8qKgogKiBHZXQgdGhlIGFjdHVhbCB2YWx1ZSBvZiBhbiBvcHRpb24uCiAqCiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUKICogICAgICAgICBUaGUgdmFsdWUgdG8gZ2V0CiAqCiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbcGFyc2VyXQogKiAgICAgICAgIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgdmFsdWUuCiAqCiAqIEByZXR1cm4ge01peGVkfQogKiAgICAgICAgIC0gV2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSBleGlzdHMKICogICAgICAgICAtIFdpbGwgYmUgYHVuZGVmaW5lZGAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzICJub25lIi4KICogICAgICAgICAtIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBvdGhlcndpc2UuCiAqCiAqIEBwcml2YXRlCiAqLwpmdW5jdGlvbiBwYXJzZU9wdGlvblZhbHVlKHZhbHVlLCBwYXJzZXIpIHsKICBpZiAocGFyc2VyKSB7CiAgICB2YWx1ZSA9IHBhcnNlcih2YWx1ZSk7CiAgfQoKICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICdub25lJykgewogICAgcmV0dXJuIHZhbHVlOwogIH0KfQoKLyoqCiAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCA8b3B0aW9uPiBlbGVtZW50IHdpdGhpbiBhIDxzZWxlY3Q+IGVsZW1lbnQuCiAqCiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsCiAqICAgICAgICAgdGhlIGVsZW1lbnQgdG8gbG9vayBpbgogKgogKiBAcGFyYW0gIHtGdW5jdGlvbn0gW3BhcnNlcl0KICogICAgICAgICBPcHRpb25hbCBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIHZhbHVlLgogKgogKiBAcmV0dXJuIHtNaXhlZH0KICogICAgICAgICAtIFdpbGwgYmUgYHVuZGVmaW5lZGAgaWYgbm8gdmFsdWUgZXhpc3RzCiAqICAgICAgICAgLSBXaWxsIGJlIGB1bmRlZmluZWRgIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyAibm9uZSIuCiAqICAgICAgICAgLSBXaWxsIGJlIHRoZSBhY3R1YWwgdmFsdWUgb3RoZXJ3aXNlLgogKgogKiBAcHJpdmF0ZQogKi8KZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZShlbCwgcGFyc2VyKSB7CiAgdmFyIHZhbHVlID0gZWwub3B0aW9uc1tlbC5vcHRpb25zLnNlbGVjdGVkSW5kZXhdLnZhbHVlOwoKICByZXR1cm4gcGFyc2VPcHRpb25WYWx1ZSh2YWx1ZSwgcGFyc2VyKTsKfQoKLyoqCiAqIFNldHMgdGhlIHNlbGVjdGVkIDxvcHRpb24+IGVsZW1lbnQgd2l0aGluIGEgPHNlbGVjdD4gZWxlbWVudCBiYXNlZCBvbiBhCiAqIGdpdmVuIHZhbHVlLgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsCiAqICAgICAgICBUaGUgZWxlbWVudCB0byBsb29rIGluLgogKgogKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUKICogICAgICAgIHRoZSBwcm9wZXJ0eSB0byBsb29rIG9uLgogKgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGFyc2VyXQogKiAgICAgICAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gYWRqdXN0IHRoZSB2YWx1ZSBiZWZvcmUgY29tcGFyaW5nLgogKgogKiBAcHJpdmF0ZQogKi8KZnVuY3Rpb24gc2V0U2VsZWN0ZWRPcHRpb24oZWwsIHZhbHVlLCBwYXJzZXIpIHsKICBpZiAoIXZhbHVlKSB7CiAgICByZXR1cm47CiAgfQoKICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLm9wdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgIGlmIChwYXJzZU9wdGlvblZhbHVlKGVsLm9wdGlvbnNbaV0udmFsdWUsIHBhcnNlcikgPT09IHZhbHVlKSB7CiAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICBicmVhazsKICAgIH0KICB9Cn0KCi8qKgogKiBNYW5pcHVsYXRlIFRleHQgVHJhY2tzIHNldHRpbmdzLgogKgogKiBAZXh0ZW5kcyBNb2RhbERpYWxvZwogKi8KCnZhciBUZXh0VHJhY2tTZXR0aW5ncyA9IGZ1bmN0aW9uIChfTW9kYWxEaWFsb2cpIHsKICBpbmhlcml0cyhUZXh0VHJhY2tTZXR0aW5ncywgX01vZGFsRGlhbG9nKTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICAgVGhlIGBQbGF5ZXJgIHRoYXQgdGhpcyBjbGFzcyBzaG91bGQgYmUgYXR0YWNoZWQgdG8uCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgICBUaGUga2V5L3ZhbHVlIHN0b3JlIG9mIHBsYXllciBvcHRpb25zLgogICAqLwogIGZ1bmN0aW9uIFRleHRUcmFja1NldHRpbmdzKHBsYXllciwgb3B0aW9ucykgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFRyYWNrU2V0dGluZ3MpOwoKICAgIG9wdGlvbnMudGVtcG9yYXJ5ID0gZmFsc2U7CgogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfTW9kYWxEaWFsb2cuY2FsbCh0aGlzLCBwbGF5ZXIsIG9wdGlvbnMpKTsKCiAgICBfdGhpcy51cGRhdGVEaXNwbGF5ID0gYmluZChfdGhpcywgX3RoaXMudXBkYXRlRGlzcGxheSk7CgogICAgLy8gZmlsbCB0aGUgbW9kYWwgYW5kIHByZXRlbmQgd2UgaGF2ZSBvcGVuZWQgaXQKICAgIF90aGlzLmZpbGwoKTsKICAgIF90aGlzLmhhc0JlZW5PcGVuZWRfID0gX3RoaXMuaGFzQmVlbkZpbGxlZF8gPSB0cnVlOwoKICAgIF90aGlzLmVuZERpYWxvZyA9IGNyZWF0ZUVsKCdwJywgewogICAgICBjbGFzc05hbWU6ICd2anMtY29udHJvbC10ZXh0JywKICAgICAgdGV4dENvbnRlbnQ6IF90aGlzLmxvY2FsaXplKCdFbmQgb2YgZGlhbG9nIHdpbmRvdy4nKQogICAgfSk7CiAgICBfdGhpcy5lbCgpLmFwcGVuZENoaWxkKF90aGlzLmVuZERpYWxvZyk7CgogICAgX3RoaXMuc2V0RGVmYXVsdHMoKTsKCiAgICAvLyBHcmFiIGBwZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3NgIGZyb20gdGhlIHBsYXllciBvcHRpb25zIGlmIG5vdCBwYXNzZWQgaW4gY2hpbGQgb3B0aW9ucwogICAgaWYgKG9wdGlvbnMucGVyc2lzdFRleHRUcmFja1NldHRpbmdzID09PSB1bmRlZmluZWQpIHsKICAgICAgX3RoaXMub3B0aW9uc18ucGVyc2lzdFRleHRUcmFja1NldHRpbmdzID0gX3RoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3M7CiAgICB9CgogICAgX3RoaXMub24oX3RoaXMuJCgnLnZqcy1kb25lLWJ1dHRvbicpLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzLnNhdmVTZXR0aW5ncygpOwogICAgICBfdGhpcy5jbG9zZSgpOwogICAgfSk7CgogICAgX3RoaXMub24oX3RoaXMuJCgnLnZqcy1kZWZhdWx0LWJ1dHRvbicpLCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzLnNldERlZmF1bHRzKCk7CiAgICAgIF90aGlzLnVwZGF0ZURpc3BsYXkoKTsKICAgIH0pOwoKICAgIGVhY2goc2VsZWN0Q29uZmlncywgZnVuY3Rpb24gKGNvbmZpZykgewogICAgICBfdGhpcy5vbihfdGhpcy4kKGNvbmZpZy5zZWxlY3RvciksICdjaGFuZ2UnLCBfdGhpcy51cGRhdGVEaXNwbGF5KTsKICAgIH0pOwoKICAgIGlmIChfdGhpcy5vcHRpb25zXy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3MpIHsKICAgICAgX3RoaXMucmVzdG9yZVNldHRpbmdzKCk7CiAgICB9CiAgICByZXR1cm4gX3RoaXM7CiAgfQoKICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICB0aGlzLmVuZERpYWxvZyA9IG51bGw7CgogICAgX01vZGFsRGlhbG9nLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgPHNlbGVjdD4gZWxlbWVudCB3aXRoIGNvbmZpZ3VyZWQgb3B0aW9ucy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiAgICAgICAgQ29uZmlndXJhdGlvbiBrZXkgdG8gdXNlIGR1cmluZyBjcmVhdGlvbi4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbFNlbGVjdF8gPSBmdW5jdGlvbiBjcmVhdGVFbFNlbGVjdF8oa2V5KSB7CiAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICB2YXIgbGVnZW5kSWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnOwogICAgdmFyIHR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdsYWJlbCc7CgogICAgdmFyIGNvbmZpZyA9IHNlbGVjdENvbmZpZ3Nba2V5XTsKICAgIHZhciBpZCA9IGNvbmZpZy5pZC5yZXBsYWNlKCclcycsIHRoaXMuaWRfKTsKCiAgICByZXR1cm4gWyc8JyArIHR5cGUgKyAnIGlkPSInICsgaWQgKyAnIiBjbGFzcz0iJyArICh0eXBlID09PSAnbGFiZWwnID8gJ3Zqcy1sYWJlbCcgOiAnJykgKyAnIj4nLCB0aGlzLmxvY2FsaXplKGNvbmZpZy5sYWJlbCksICc8LycgKyB0eXBlICsgJz4nLCAnPHNlbGVjdCBhcmlhLWxhYmVsbGVkYnk9IicgKyAobGVnZW5kSWQgIT09ICcnID8gbGVnZW5kSWQgKyAnICcgOiAnJykgKyBpZCArICciPiddLmNvbmNhdChjb25maWcub3B0aW9ucy5tYXAoZnVuY3Rpb24gKG8pIHsKICAgICAgdmFyIG9wdGlvbklkID0gaWQgKyAnLScgKyBvWzFdOwoKICAgICAgcmV0dXJuIFsnPG9wdGlvbiBpZD0iJyArIG9wdGlvbklkICsgJyIgdmFsdWU9IicgKyBvWzBdICsgJyIgJywgJ2FyaWEtbGFiZWxsZWRieT0iJyArIChsZWdlbmRJZCAhPT0gJycgPyBsZWdlbmRJZCArICcgJyA6ICcnKSArIGlkICsgJyAnICsgb3B0aW9uSWQgKyAnIj4nLCBfdGhpczIubG9jYWxpemUob1sxXSksICc8L29wdGlvbj4nXS5qb2luKCcnKTsKICAgIH0pKS5jb25jYXQoJzwvc2VsZWN0PicpLmpvaW4oJycpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBmb3JlZ3JvdW5kIGNvbG9yIGVsZW1lbnQgZm9yIHRoZSBjb21wb25lbnQKICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbEZnQ29sb3JfID0gZnVuY3Rpb24gY3JlYXRlRWxGZ0NvbG9yXygpIHsKICAgIHZhciBsZWdlbmRJZCA9ICdjYXB0aW9ucy10ZXh0LWxlZ2VuZC0nICsgdGhpcy5pZF87CgogICAgcmV0dXJuIFsnPGZpZWxkc2V0IGNsYXNzPSJ2anMtZmctY29sb3IgdmpzLXRyYWNrLXNldHRpbmciPicsICc8bGVnZW5kIGlkPSInICsgbGVnZW5kSWQgKyAnIj4nLCB0aGlzLmxvY2FsaXplKCdUZXh0JyksICc8L2xlZ2VuZD4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0XygnY29sb3InLCBsZWdlbmRJZCksICc8c3BhbiBjbGFzcz0idmpzLXRleHQtb3BhY2l0eSB2anMtb3BhY2l0eSI+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ3RleHRPcGFjaXR5JywgbGVnZW5kSWQpLCAnPC9zcGFuPicsICc8L2ZpZWxkc2V0PiddLmpvaW4oJycpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBiYWNrZ3JvdW5kIGNvbG9yIGVsZW1lbnQgZm9yIHRoZSBjb21wb25lbnQKICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbEJnQ29sb3JfID0gZnVuY3Rpb24gY3JlYXRlRWxCZ0NvbG9yXygpIHsKICAgIHZhciBsZWdlbmRJZCA9ICdjYXB0aW9ucy1iYWNrZ3JvdW5kLScgKyB0aGlzLmlkXzsKCiAgICByZXR1cm4gWyc8ZmllbGRzZXQgY2xhc3M9InZqcy1iZy1jb2xvciB2anMtdHJhY2stc2V0dGluZyI+JywgJzxsZWdlbmQgaWQ9IicgKyBsZWdlbmRJZCArICciPicsIHRoaXMubG9jYWxpemUoJ0JhY2tncm91bmQnKSwgJzwvbGVnZW5kPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdiYWNrZ3JvdW5kQ29sb3InLCBsZWdlbmRJZCksICc8c3BhbiBjbGFzcz0idmpzLWJnLW9wYWNpdHkgdmpzLW9wYWNpdHkiPicsIHRoaXMuY3JlYXRlRWxTZWxlY3RfKCdiYWNrZ3JvdW5kT3BhY2l0eScsIGxlZ2VuZElkKSwgJzwvc3Bhbj4nLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKTsKICB9OwoKICAvKioKICAgKiBDcmVhdGUgd2luZG93IGNvbG9yIGVsZW1lbnQgZm9yIHRoZSBjb21wb25lbnQKICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIEFuIEhUTUwgc3RyaW5nLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5jcmVhdGVFbFdpbkNvbG9yXyA9IGZ1bmN0aW9uIGNyZWF0ZUVsV2luQ29sb3JfKCkgewogICAgdmFyIGxlZ2VuZElkID0gJ2NhcHRpb25zLXdpbmRvdy0nICsgdGhpcy5pZF87CgogICAgcmV0dXJuIFsnPGZpZWxkc2V0IGNsYXNzPSJ2anMtd2luZG93LWNvbG9yIHZqcy10cmFjay1zZXR0aW5nIj4nLCAnPGxlZ2VuZCBpZD0iJyArIGxlZ2VuZElkICsgJyI+JywgdGhpcy5sb2NhbGl6ZSgnV2luZG93JyksICc8L2xlZ2VuZD4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0Xygnd2luZG93Q29sb3InLCBsZWdlbmRJZCksICc8c3BhbiBjbGFzcz0idmpzLXdpbmRvdy1vcGFjaXR5IHZqcy1vcGFjaXR5Ij4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0Xygnd2luZG93T3BhY2l0eScsIGxlZ2VuZElkKSwgJzwvc3Bhbj4nLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKTsKICB9OwoKICAvKioKICAgKiBDcmVhdGUgY29sb3IgZWxlbWVudHMgZm9yIHRoZSBjb21wb25lbnQKICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IHdhcyBjcmVhdGVkCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNyZWF0ZUVsQ29sb3JzXyA9IGZ1bmN0aW9uIGNyZWF0ZUVsQ29sb3JzXygpIHsKICAgIHJldHVybiBjcmVhdGVFbCgnZGl2JywgewogICAgICBjbGFzc05hbWU6ICd2anMtdHJhY2stc2V0dGluZ3MtY29sb3JzJywKICAgICAgaW5uZXJIVE1MOiBbdGhpcy5jcmVhdGVFbEZnQ29sb3JfKCksIHRoaXMuY3JlYXRlRWxCZ0NvbG9yXygpLCB0aGlzLmNyZWF0ZUVsV2luQ29sb3JfKCldLmpvaW4oJycpCiAgICB9KTsKICB9OwoKICAvKioKICAgKiBDcmVhdGUgZm9udCBlbGVtZW50cyBmb3IgdGhlIGNvbXBvbmVudAogICAqCiAgICogQHJldHVybiB7RWxlbWVudH0KICAgKiAgICAgICAgIFRoZSBlbGVtZW50IHRoYXQgd2FzIGNyZWF0ZWQuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNyZWF0ZUVsRm9udF8gPSBmdW5jdGlvbiBjcmVhdGVFbEZvbnRfKCkgewogICAgcmV0dXJuIGNyZWF0ZUVsKCdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy10cmFjay1zZXR0aW5ncy1mb250Ij4nLAogICAgICBpbm5lckhUTUw6IFsnPGZpZWxkc2V0IGNsYXNzPSJ2anMtZm9udC1wZXJjZW50IHZqcy10cmFjay1zZXR0aW5nIj4nLCB0aGlzLmNyZWF0ZUVsU2VsZWN0XygnZm9udFBlcmNlbnQnLCAnJywgJ2xlZ2VuZCcpLCAnPC9maWVsZHNldD4nLCAnPGZpZWxkc2V0IGNsYXNzPSJ2anMtZWRnZS1zdHlsZSB2anMtdHJhY2stc2V0dGluZyI+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ2VkZ2VTdHlsZScsICcnLCAnbGVnZW5kJyksICc8L2ZpZWxkc2V0PicsICc8ZmllbGRzZXQgY2xhc3M9InZqcy1mb250LWZhbWlseSB2anMtdHJhY2stc2V0dGluZyI+JywgdGhpcy5jcmVhdGVFbFNlbGVjdF8oJ2ZvbnRGYW1pbHknLCAnJywgJ2xlZ2VuZCcpLCAnPC9maWVsZHNldD4nXS5qb2luKCcnKQogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIGNvbnRyb2xzIGZvciB0aGUgY29tcG9uZW50CiAgICoKICAgKiBAcmV0dXJuIHtFbGVtZW50fQogICAqICAgICAgICAgVGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY3JlYXRlRWxDb250cm9sc18gPSBmdW5jdGlvbiBjcmVhdGVFbENvbnRyb2xzXygpIHsKICAgIHZhciBkZWZhdWx0c0Rlc2NyaXB0aW9uID0gdGhpcy5sb2NhbGl6ZSgncmVzdG9yZSBhbGwgc2V0dGluZ3MgdG8gdGhlIGRlZmF1bHQgdmFsdWVzJyk7CgogICAgcmV0dXJuIGNyZWF0ZUVsKCdkaXYnLCB7CiAgICAgIGNsYXNzTmFtZTogJ3Zqcy10cmFjay1zZXR0aW5ncy1jb250cm9scycsCiAgICAgIGlubmVySFRNTDogWyc8YnV0dG9uIGNsYXNzPSJ2anMtZGVmYXVsdC1idXR0b24iIHRpdGxlPSInICsgZGVmYXVsdHNEZXNjcmlwdGlvbiArICciPicsIHRoaXMubG9jYWxpemUoJ1Jlc2V0JyksICc8c3BhbiBjbGFzcz0idmpzLWNvbnRyb2wtdGV4dCI+ICcgKyBkZWZhdWx0c0Rlc2NyaXB0aW9uICsgJzwvc3Bhbj4nLCAnPC9idXR0b24+JywgJzxidXR0b24gY2xhc3M9InZqcy1kb25lLWJ1dHRvbiI+JyArIHRoaXMubG9jYWxpemUoJ0RvbmUnKSArICc8L2J1dHRvbj4nXS5qb2luKCcnKQogICAgfSk7CiAgfTsKCiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmNvbnRlbnQgPSBmdW5jdGlvbiBjb250ZW50KCkgewogICAgcmV0dXJuIFt0aGlzLmNyZWF0ZUVsQ29sb3JzXygpLCB0aGlzLmNyZWF0ZUVsRm9udF8oKSwgdGhpcy5jcmVhdGVFbENvbnRyb2xzXygpXTsKICB9OwoKICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiBsYWJlbCgpIHsKICAgIHJldHVybiB0aGlzLmxvY2FsaXplKCdDYXB0aW9uIFNldHRpbmdzIERpYWxvZycpOwogIH07CgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkgewogICAgcmV0dXJuIHRoaXMubG9jYWxpemUoJ0JlZ2lubmluZyBvZiBkaWFsb2cgd2luZG93LiBFc2NhcGUgd2lsbCBjYW5jZWwgYW5kIGNsb3NlIHRoZSB3aW5kb3cuJyk7CiAgfTsKCiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmJ1aWxkQ1NTQ2xhc3MgPSBmdW5jdGlvbiBidWlsZENTU0NsYXNzKCkgewogICAgcmV0dXJuIF9Nb2RhbERpYWxvZy5wcm90b3R5cGUuYnVpbGRDU1NDbGFzcy5jYWxsKHRoaXMpICsgJyB2anMtdGV4dC10cmFjay1zZXR0aW5ncyc7CiAgfTsKCiAgLyoqCiAgICogR2V0cyBhbiBvYmplY3Qgb2YgdGV4dCB0cmFjayBzZXR0aW5ncyAob3IgbnVsbCkuCiAgICoKICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICogICAgICAgICBBbiBvYmplY3Qgd2l0aCBjb25maWcgdmFsdWVzIHBhcnNlZCBmcm9tIHRoZSBET00gb3IgbG9jYWxTdG9yYWdlLgogICAqLwoKCiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uIGdldFZhbHVlcygpIHsKICAgIHZhciBfdGhpczMgPSB0aGlzOwoKICAgIHJldHVybiByZWR1Y2Uoc2VsZWN0Q29uZmlncywgZnVuY3Rpb24gKGFjY3VtLCBjb25maWcsIGtleSkgewogICAgICB2YXIgdmFsdWUgPSBnZXRTZWxlY3RlZE9wdGlvblZhbHVlKF90aGlzMy4kKGNvbmZpZy5zZWxlY3RvciksIGNvbmZpZy5wYXJzZXIpOwoKICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBhY2N1bTsKICAgIH0sIHt9KTsKICB9OwoKICAvKioKICAgKiBTZXRzIHRleHQgdHJhY2sgc2V0dGluZ3MgZnJvbSBhbiBvYmplY3Qgb2YgdmFsdWVzLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcwogICAqICAgICAgICBBbiBvYmplY3Qgd2l0aCBjb25maWcgdmFsdWVzIHBhcnNlZCBmcm9tIHRoZSBET00gb3IgbG9jYWxTdG9yYWdlLgogICAqLwoKCiAgVGV4dFRyYWNrU2V0dGluZ3MucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uIHNldFZhbHVlcyh2YWx1ZXMpIHsKICAgIHZhciBfdGhpczQgPSB0aGlzOwoKICAgIGVhY2goc2VsZWN0Q29uZmlncywgZnVuY3Rpb24gKGNvbmZpZywga2V5KSB7CiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKF90aGlzNC4kKGNvbmZpZy5zZWxlY3RvciksIHZhbHVlc1trZXldLCBjb25maWcucGFyc2VyKTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIFNldHMgYWxsIGA8c2VsZWN0PmAgZWxlbWVudHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCiAgICovCgoKICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuc2V0RGVmYXVsdHMgPSBmdW5jdGlvbiBzZXREZWZhdWx0cygpIHsKICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgIGVhY2goc2VsZWN0Q29uZmlncywgZnVuY3Rpb24gKGNvbmZpZykgewogICAgICB2YXIgaW5kZXggPSBjb25maWcuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHQnKSA/IGNvbmZpZ1snZGVmYXVsdCddIDogMDsKCiAgICAgIF90aGlzNS4kKGNvbmZpZy5zZWxlY3Rvcikuc2VsZWN0ZWRJbmRleCA9IGluZGV4OwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogUmVzdG9yZSB0ZXh0dHJhY2sgc2V0dGluZ3MgZnJvbSBsb2NhbFN0b3JhZ2UKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5yZXN0b3JlU2V0dGluZ3MgPSBmdW5jdGlvbiByZXN0b3JlU2V0dGluZ3MoKSB7CiAgICB2YXIgdmFsdWVzID0gdm9pZCAwOwoKICAgIHRyeSB7CiAgICAgIHZhbHVlcyA9IEpTT04ucGFyc2Uod2luZG93XzEubG9jYWxTdG9yYWdlLmdldEl0ZW0oTE9DQUxfU1RPUkFHRV9LRVkpKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBsb2ckMS53YXJuKGVycik7CiAgICB9CgogICAgaWYgKHZhbHVlcykgewogICAgICB0aGlzLnNldFZhbHVlcyh2YWx1ZXMpOwogICAgfQogIH07CgogIC8qKgogICAqIFNhdmUgdGV4dCB0cmFjayBzZXR0aW5ncyB0byBsb2NhbFN0b3JhZ2UKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS5zYXZlU2V0dGluZ3MgPSBmdW5jdGlvbiBzYXZlU2V0dGluZ3MoKSB7CiAgICBpZiAoIXRoaXMub3B0aW9uc18ucGVyc2lzdFRleHRUcmFja1NldHRpbmdzKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTsKCiAgICB0cnkgewogICAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGgpIHsKICAgICAgICB3aW5kb3dfMS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93XzEubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfU1RPUkFHRV9LRVkpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgbG9nJDEud2FybihlcnIpOwogICAgfQogIH07CgogIC8qKgogICAqIFVwZGF0ZSBkaXNwbGF5IG9mIHRleHQgdHJhY2sgc2V0dGluZ3MKICAgKi8KCgogIFRleHRUcmFja1NldHRpbmdzLnByb3RvdHlwZS51cGRhdGVEaXNwbGF5ID0gZnVuY3Rpb24gdXBkYXRlRGlzcGxheSgpIHsKICAgIHZhciB0dERpc3BsYXkgPSB0aGlzLnBsYXllcl8uZ2V0Q2hpbGQoJ3RleHRUcmFja0Rpc3BsYXknKTsKCiAgICBpZiAodHREaXNwbGF5KSB7CiAgICAgIHR0RGlzcGxheS51cGRhdGVEaXNwbGF5KCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogY29uZGl0aW9uYWxseSBibHVyIHRoZSBlbGVtZW50IGFuZCByZWZvY3VzIHRoZSBjYXB0aW9ucyBidXR0b24KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBUZXh0VHJhY2tTZXR0aW5ncy5wcm90b3R5cGUuY29uZGl0aW9uYWxCbHVyXyA9IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQmx1cl8oKSB7CiAgICB0aGlzLnByZXZpb3VzbHlBY3RpdmVFbF8gPSBudWxsOwogICAgdGhpcy5vZmYoZG9jdW1lbnRfMSwgJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pOwoKICAgIHZhciBjYiA9IHRoaXMucGxheWVyXy5jb250cm9sQmFyOwogICAgdmFyIHN1YnNDYXBzQnRuID0gY2IgJiYgY2Iuc3Vic0NhcHNCdXR0b247CiAgICB2YXIgY2NCdG4gPSBjYiAmJiBjYi5jYXB0aW9uc0J1dHRvbjsKCiAgICBpZiAoc3Vic0NhcHNCdG4pIHsKICAgICAgc3Vic0NhcHNCdG4uZm9jdXMoKTsKICAgIH0gZWxzZSBpZiAoY2NCdG4pIHsKICAgICAgY2NCdG4uZm9jdXMoKTsKICAgIH0KICB9OwoKICByZXR1cm4gVGV4dFRyYWNrU2V0dGluZ3M7Cn0oTW9kYWxEaWFsb2cpOwoKQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZXh0VHJhY2tTZXR0aW5ncycsIFRleHRUcmFja1NldHRpbmdzKTsKCnZhciBfdGVtcGxhdGVPYmplY3QkMiA9IHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKFsnVGV4dCBUcmFja3MgYXJlIGJlaW5nIGxvYWRlZCBmcm9tIGFub3RoZXIgb3JpZ2luIGJ1dCB0aGUgY3Jvc3NvcmlnaW4gYXR0cmlidXRlIGlzblwndCB1c2VkLlxuICAgICAgICAgICAgVGhpcyBtYXkgcHJldmVudCB0ZXh0IHRyYWNrcyBmcm9tIGxvYWRpbmcuJ10sIFsnVGV4dCBUcmFja3MgYXJlIGJlaW5nIGxvYWRlZCBmcm9tIGFub3RoZXIgb3JpZ2luIGJ1dCB0aGUgY3Jvc3NvcmlnaW4gYXR0cmlidXRlIGlzblwndCB1c2VkLlxuICAgICAgICAgICAgVGhpcyBtYXkgcHJldmVudCB0ZXh0IHRyYWNrcyBmcm9tIGxvYWRpbmcuJ10pOwoKLyoqCiAqIEBmaWxlIGh0bWw1LmpzCiAqLwovKioKICogSFRNTDUgTWVkaWEgQ29udHJvbGxlciAtIFdyYXBwZXIgZm9yIEhUTUw1IE1lZGlhIEFQSQogKgogKiBAbWl4ZXMgVGVjaH5Tb3VjZUhhbmRsZXJBZGRpdGlvbnMKICogQGV4dGVuZHMgVGVjaAogKi8KCnZhciBIdG1sNSA9IGZ1bmN0aW9uIChfVGVjaCkgewogIGluaGVyaXRzKEh0bWw1LCBfVGVjaCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIFRlY2guCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIFRoZSBrZXkvdmFsdWUgc3RvcmUgb2YgcGxheWVyIG9wdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge0NvbXBvbmVudH5SZWFkeUNhbGxiYWNrfSByZWFkeQogICAqICAgICAgICBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGBIVE1MNWAgVGVjaCBpcyByZWFkeS4KICAgKi8KICBmdW5jdGlvbiBIdG1sNShvcHRpb25zLCByZWFkeSkgewogICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSHRtbDUpOwoKICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1RlY2guY2FsbCh0aGlzLCBvcHRpb25zLCByZWFkeSkpOwoKICAgIHZhciBzb3VyY2UgPSBvcHRpb25zLnNvdXJjZTsKICAgIHZhciBjcm9zc29yaWdpblRyYWNrcyA9IGZhbHNlOwoKICAgIC8vIFNldCB0aGUgc291cmNlIGlmIG9uZSBpcyBwcm92aWRlZAogICAgLy8gMSkgQ2hlY2sgaWYgdGhlIHNvdXJjZSBpcyBuZXcgKGlmIG5vdCwgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBzbyBwbGF5YmFjayBpc24ndCBpbnRlcnJ1cHRlZCkKICAgIC8vIDIpIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV0d29yayBzdGF0ZSBvZiB0aGUgdGFnIHdhcyBmYWlsZWQgYXQgaW5pdCwgYW5kIGlmIHNvLCByZXNldCB0aGUgc291cmNlCiAgICAvLyBhbnl3YXkgc28gdGhlIGVycm9yIGdldHMgZmlyZWQuCiAgICBpZiAoc291cmNlICYmIChfdGhpcy5lbF8uY3VycmVudFNyYyAhPT0gc291cmNlLnNyYyB8fCBvcHRpb25zLnRhZyAmJiBvcHRpb25zLnRhZy5pbml0TmV0d29ya1N0YXRlXyA9PT0gMykpIHsKICAgICAgX3RoaXMuc2V0U291cmNlKHNvdXJjZSk7CiAgICB9IGVsc2UgewogICAgICBfdGhpcy5oYW5kbGVMYXRlSW5pdF8oX3RoaXMuZWxfKTsKICAgIH0KCiAgICBpZiAoX3RoaXMuZWxfLmhhc0NoaWxkTm9kZXMoKSkgewoKICAgICAgdmFyIG5vZGVzID0gX3RoaXMuZWxfLmNoaWxkTm9kZXM7CiAgICAgIHZhciBub2Rlc0xlbmd0aCA9IG5vZGVzLmxlbmd0aDsKICAgICAgdmFyIHJlbW92ZU5vZGVzID0gW107CgogICAgICB3aGlsZSAobm9kZXNMZW5ndGgtLSkgewogICAgICAgIHZhciBub2RlID0gbm9kZXNbbm9kZXNMZW5ndGhdOwogICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndHJhY2snKSB7CiAgICAgICAgICBpZiAoIV90aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykgewogICAgICAgICAgICAvLyBFbXB0eSB2aWRlbyB0YWcgdHJhY2tzIHNvIHRoZSBidWlsdC1pbiBwbGF5ZXIgZG9lc24ndCB1c2UgdGhlbSBhbHNvLgogICAgICAgICAgICAvLyBUaGlzIG1heSBub3QgYmUgZmFzdCBlbm91Z2ggdG8gc3RvcCBIVE1MNSBicm93c2VycyBmcm9tIHJlYWRpbmcgdGhlIHRhZ3MKICAgICAgICAgICAgLy8gc28gd2UnbGwgbmVlZCB0byB0dXJuIG9mZiBhbnkgZGVmYXVsdCB0cmFja3MgaWYgd2UncmUgbWFudWFsbHkgZG9pbmcKICAgICAgICAgICAgLy8gY2FwdGlvbnMgYW5kIHN1YnRpdGxlcy4gdmlkZW9FbGVtZW50LnRleHRUcmFja3MKICAgICAgICAgICAgcmVtb3ZlTm9kZXMucHVzaChub2RlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHN0b3JlIEhUTUxUcmFja0VsZW1lbnQgYW5kIFRleHRUcmFjayB0byByZW1vdGUgbGlzdAogICAgICAgICAgICBfdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5hZGRUcmFja0VsZW1lbnRfKG5vZGUpOwogICAgICAgICAgICBfdGhpcy5yZW1vdGVUZXh0VHJhY2tzKCkuYWRkVHJhY2sobm9kZS50cmFjayk7CiAgICAgICAgICAgIF90aGlzLnRleHRUcmFja3MoKS5hZGRUcmFjayhub2RlLnRyYWNrKTsKICAgICAgICAgICAgaWYgKCFjcm9zc29yaWdpblRyYWNrcyAmJiAhX3RoaXMuZWxfLmhhc0F0dHJpYnV0ZSgnY3Jvc3NvcmlnaW4nKSAmJiBpc0Nyb3NzT3JpZ2luKG5vZGUuc3JjKSkgewogICAgICAgICAgICAgIGNyb3Nzb3JpZ2luVHJhY2tzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW1vdmVOb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgIF90aGlzLmVsXy5yZW1vdmVDaGlsZChyZW1vdmVOb2Rlc1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBfdGhpcy5wcm94eU5hdGl2ZVRyYWNrc18oKTsKICAgIGlmIChfdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MgJiYgY3Jvc3NvcmlnaW5UcmFja3MpIHsKICAgICAgbG9nJDEud2Fybih0c21sKF90ZW1wbGF0ZU9iamVjdCQyKSk7CiAgICB9CgogICAgLy8gcHJldmVudCBpT1MgU2FmYXJpIGZyb20gZGlzYWJsaW5nIG1ldGFkYXRhIHRleHQgdHJhY2tzIGR1cmluZyBuYXRpdmUgcGxheWJhY2sKICAgIF90aGlzLnJlc3RvcmVNZXRhZGF0YVRyYWNrc0luSU9TTmF0aXZlUGxheWVyXygpOwoKICAgIC8vIERldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWQKICAgIC8vIE91ciBnb2FsIHNob3VsZCBiZSB0byBnZXQgdGhlIGN1c3RvbSBjb250cm9scyBvbiBtb2JpbGUgc29saWQgZXZlcnl3aGVyZQogICAgLy8gc28gd2UgY2FuIHJlbW92ZSB0aGlzIGFsbCB0b2dldGhlci4gUmlnaHQgbm93IHRoaXMgd2lsbCBibG9jayBjdXN0b20KICAgIC8vIGNvbnRyb2xzIG9uIHRvdWNoIGVuYWJsZWQgbGFwdG9wcyBsaWtlIHRoZSBDaHJvbWUgUGl4ZWwKICAgIGlmICgoVE9VQ0hfRU5BQkxFRCB8fCBJU19JUEhPTkUgfHwgSVNfTkFUSVZFX0FORFJPSUQpICYmIG9wdGlvbnMubmF0aXZlQ29udHJvbHNGb3JUb3VjaCA9PT0gdHJ1ZSkgewogICAgICBfdGhpcy5zZXRDb250cm9scyh0cnVlKTsKICAgIH0KCiAgICAvLyBvbiBpT1MsIHdlIHdhbnQgdG8gcHJveHkgYHdlYmtpdGJlZ2luZnVsbHNjcmVlbmAgYW5kIGB3ZWJraXRlbmRmdWxsc2NyZWVuYAogICAgLy8gaW50byBhIGBmdWxsc2NyZWVuY2hhbmdlYCBldmVudAogICAgX3RoaXMucHJveHlXZWJraXRGdWxsc2NyZWVuXygpOwoKICAgIF90aGlzLnRyaWdnZXJSZWFkeSgpOwogICAgcmV0dXJuIF90aGlzOwogIH0KCiAgLyoqCiAgICogRGlzcG9zZSBvZiBgSFRNTDVgIG1lZGlhIGVsZW1lbnQgYW5kIHJlbW92ZSBhbGwgdHJhY2tzLgogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgSHRtbDUuZGlzcG9zZU1lZGlhRWxlbWVudCh0aGlzLmVsXyk7CiAgICB0aGlzLm9wdGlvbnNfID0gbnVsbDsKCiAgICAvLyB0ZWNoIHdpbGwgaGFuZGxlIGNsZWFyaW5nIG9mIHRoZSBlbXVsYXRlZCB0cmFjayBsaXN0CiAgICBfVGVjaC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIFdoZW4gYSBjYXB0aW9ucyB0cmFjayBpcyBlbmFibGVkIGluIHRoZSBpT1MgU2FmYXJpIG5hdGl2ZSBwbGF5ZXIsIGFsbCBvdGhlcgogICAqIHRyYWNrcyBhcmUgZGlzYWJsZWQgKGluY2x1ZGluZyBtZXRhZGF0YSB0cmFja3MpLCB3aGljaCBudWxscyBhbGwgb2YgdGhlaXIKICAgKiBhc3NvY2lhdGVkIGN1ZSBwb2ludHMuIFRoaXMgd2lsbCByZXN0b3JlIG1ldGFkYXRhIHRyYWNrcyB0byB0aGVpciBwcmUtZnVsbHNjcmVlbgogICAqIHN0YXRlIGluIHRob3NlIGNhc2VzIHNvIHRoYXQgY3VlIHBvaW50cyBhcmUgbm90IG5lZWRsZXNzbHkgbG9zdC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBIdG1sNS5wcm90b3R5cGUucmVzdG9yZU1ldGFkYXRhVHJhY2tzSW5JT1NOYXRpdmVQbGF5ZXJfID0gZnVuY3Rpb24gcmVzdG9yZU1ldGFkYXRhVHJhY2tzSW5JT1NOYXRpdmVQbGF5ZXJfKCkgewogICAgdmFyIHRleHRUcmFja3MgPSB0aGlzLnRleHRUcmFja3MoKTsKICAgIHZhciBtZXRhZGF0YVRyYWNrc1ByZUZ1bGxzY3JlZW5TdGF0ZSA9IHZvaWQgMDsKCiAgICAvLyBjYXB0dXJlcyBhIHNuYXBzaG90IG9mIGV2ZXJ5IG1ldGFkYXRhIHRyYWNrJ3MgY3VycmVudCBzdGF0ZQogICAgdmFyIHRha2VNZXRhZGF0YVRyYWNrU25hcHNob3QgPSBmdW5jdGlvbiB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KCkgewogICAgICBtZXRhZGF0YVRyYWNrc1ByZUZ1bGxzY3JlZW5TdGF0ZSA9IFtdOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0VHJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHRyYWNrID0gdGV4dFRyYWNrc1tpXTsKCiAgICAgICAgaWYgKHRyYWNrLmtpbmQgPT09ICdtZXRhZGF0YScpIHsKICAgICAgICAgIG1ldGFkYXRhVHJhY2tzUHJlRnVsbHNjcmVlblN0YXRlLnB1c2goewogICAgICAgICAgICB0cmFjazogdHJhY2ssCiAgICAgICAgICAgIHN0b3JlZE1vZGU6IHRyYWNrLm1vZGUKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvLyBzbmFwc2hvdCBlYWNoIG1ldGFkYXRhIHRyYWNrJ3MgaW5pdGlhbCBzdGF0ZSwgYW5kIHVwZGF0ZSB0aGUgc25hcHNob3QKICAgIC8vIGVhY2ggdGltZSB0aGVyZSBpcyBhIHRyYWNrICdjaGFuZ2UnIGV2ZW50CiAgICB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KCk7CiAgICB0ZXh0VHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRha2VNZXRhZGF0YVRyYWNrU25hcHNob3QpOwoKICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0ZXh0VHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRha2VNZXRhZGF0YVRyYWNrU25hcHNob3QpOwogICAgfSk7CgogICAgdmFyIHJlc3RvcmVUcmFja01vZGUgPSBmdW5jdGlvbiByZXN0b3JlVHJhY2tNb2RlKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGFkYXRhVHJhY2tzUHJlRnVsbHNjcmVlblN0YXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHN0b3JlZFRyYWNrID0gbWV0YWRhdGFUcmFja3NQcmVGdWxsc2NyZWVuU3RhdGVbaV07CgogICAgICAgIGlmIChzdG9yZWRUcmFjay50cmFjay5tb2RlID09PSAnZGlzYWJsZWQnICYmIHN0b3JlZFRyYWNrLnRyYWNrLm1vZGUgIT09IHN0b3JlZFRyYWNrLnN0b3JlZE1vZGUpIHsKICAgICAgICAgIHN0b3JlZFRyYWNrLnRyYWNrLm1vZGUgPSBzdG9yZWRUcmFjay5zdG9yZWRNb2RlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB3ZSBvbmx5IHdhbnQgdGhpcyBoYW5kbGVyIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBmaXJzdCAnY2hhbmdlJyBldmVudAogICAgICB0ZXh0VHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHJlc3RvcmVUcmFja01vZGUpOwogICAgfTsKCiAgICAvLyB3aGVuIHdlIGVudGVyIGZ1bGxzY3JlZW4gcGxheWJhY2ssIHN0b3AgdXBkYXRpbmcgdGhlIHNuYXBzaG90IGFuZAogICAgLy8gcmVzdG9yZSBhbGwgdHJhY2sgbW9kZXMgdG8gdGhlaXIgcHJlLWZ1bGxzY3JlZW4gc3RhdGUKICAgIHRoaXMub24oJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGZ1bmN0aW9uICgpIHsKICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0YWtlTWV0YWRhdGFUcmFja1NuYXBzaG90KTsKCiAgICAgIC8vIHJlbW92ZSB0aGUgbGlzdGVuZXIgYmVmb3JlIGFkZGluZyBpdCBqdXN0IGluIGNhc2UgaXQgd2Fzbid0IHByZXZpb3VzbHkgcmVtb3ZlZAogICAgICB0ZXh0VHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHJlc3RvcmVUcmFja01vZGUpOwogICAgICB0ZXh0VHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHJlc3RvcmVUcmFja01vZGUpOwogICAgfSk7CgogICAgLy8gc3RhcnQgdXBkYXRpbmcgdGhlIHNuYXBzaG90IGFnYWluIGFmdGVyIGxlYXZpbmcgZnVsbHNjcmVlbgogICAgdGhpcy5vbignd2Via2l0ZW5kZnVsbHNjcmVlbicsIGZ1bmN0aW9uICgpIHsKICAgICAgLy8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBiZWZvcmUgYWRkaW5nIGl0IGp1c3QgaW4gY2FzZSBpdCB3YXNuJ3QgcHJldmlvdXNseSByZW1vdmVkCiAgICAgIHRleHRUcmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCk7CiAgICAgIHRleHRUcmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGFrZU1ldGFkYXRhVHJhY2tTbmFwc2hvdCk7CgogICAgICAvLyByZW1vdmUgdGhlIHJlc3RvcmVUcmFja01vZGUgaGFuZGxlciBpbiBjYXNlIGl0IHdhc24ndCB0cmlnZ2VyZWQgZHVyaW5nIGZ1bGxzY3JlZW4gcGxheWJhY2sKICAgICAgdGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZXN0b3JlVHJhY2tNb2RlKTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIFByb3h5IGFsbCBuYXRpdmUgdHJhY2sgbGlzdCBldmVudHMgdG8gb3VyIHRyYWNrIGxpc3RzIGlmIHRoZSBicm93c2VyIHdlIGFyZSBwbGF5aW5nCiAgICogaW4gc3VwcG9ydHMgdGhhdCB0eXBlIG9mIHRyYWNrIGxpc3QuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnByb3h5TmF0aXZlVHJhY2tzXyA9IGZ1bmN0aW9uIHByb3h5TmF0aXZlVHJhY2tzXygpIHsKICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgIE5PUk1BTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBwcm9wcyA9IE5PUk1BTFtuYW1lXTsKICAgICAgdmFyIGVsVHJhY2tzID0gX3RoaXMyLmVsKClbcHJvcHMuZ2V0dGVyTmFtZV07CiAgICAgIHZhciB0ZWNoVHJhY2tzID0gX3RoaXMyW3Byb3BzLmdldHRlck5hbWVdKCk7CgogICAgICBpZiAoIV90aGlzMlsnZmVhdHVyZXNOYXRpdmUnICsgcHJvcHMuY2FwaXRhbE5hbWUgKyAnVHJhY2tzJ10gfHwgIWVsVHJhY2tzIHx8ICFlbFRyYWNrcy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBsaXN0ZW5lcnMgPSB7CiAgICAgICAgY2hhbmdlOiBmdW5jdGlvbiBjaGFuZ2UoZSkgewogICAgICAgICAgdGVjaFRyYWNrcy50cmlnZ2VyKHsKICAgICAgICAgICAgdHlwZTogJ2NoYW5nZScsCiAgICAgICAgICAgIHRhcmdldDogdGVjaFRyYWNrcywKICAgICAgICAgICAgY3VycmVudFRhcmdldDogdGVjaFRyYWNrcywKICAgICAgICAgICAgc3JjRWxlbWVudDogdGVjaFRyYWNrcwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBhZGR0cmFjazogZnVuY3Rpb24gYWRkdHJhY2soZSkgewogICAgICAgICAgdGVjaFRyYWNrcy5hZGRUcmFjayhlLnRyYWNrKTsKICAgICAgICB9LAogICAgICAgIHJlbW92ZXRyYWNrOiBmdW5jdGlvbiByZW1vdmV0cmFjayhlKSB7CiAgICAgICAgICB0ZWNoVHJhY2tzLnJlbW92ZVRyYWNrKGUudHJhY2spOwogICAgICAgIH0KICAgICAgfTsKICAgICAgdmFyIHJlbW92ZU9sZFRyYWNrcyA9IGZ1bmN0aW9uIHJlbW92ZU9sZFRyYWNrcygpIHsKICAgICAgICB2YXIgcmVtb3ZlVHJhY2tzID0gW107CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVjaFRyYWNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7CgogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbFRyYWNrcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICBpZiAoZWxUcmFja3Nbal0gPT09IHRlY2hUcmFja3NbaV0pIHsKICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgIHJlbW92ZVRyYWNrcy5wdXNoKHRlY2hUcmFja3NbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKHJlbW92ZVRyYWNrcy5sZW5ndGgpIHsKICAgICAgICAgIHRlY2hUcmFja3MucmVtb3ZlVHJhY2socmVtb3ZlVHJhY2tzLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIE9iamVjdC5rZXlzKGxpc3RlbmVycykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2V2ZW50TmFtZV07CgogICAgICAgIGVsVHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7CiAgICAgICAgX3RoaXMyLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBlbFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIC8vIFJlbW92ZSAobmF0aXZlKSB0cmFja3MgdGhhdCBhcmUgbm90IHVzZWQgYW55bW9yZQogICAgICBfdGhpczIub24oJ2xvYWRzdGFydCcsIHJlbW92ZU9sZFRyYWNrcyk7CiAgICAgIF90aGlzMi5vbignZGlzcG9zZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcmV0dXJuIF90aGlzMi5vZmYoJ2xvYWRzdGFydCcsIHJlbW92ZU9sZFRyYWNrcyk7CiAgICAgIH0pOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIHRoZSBgSHRtbDVgIFRlY2gncyBET00gZWxlbWVudC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgZWxlbWVudCB0aGF0IGdldHMgY3JlYXRlZC4KICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5jcmVhdGVFbCA9IGZ1bmN0aW9uIGNyZWF0ZUVsJCQxKCkgewogICAgdmFyIGVsID0gdGhpcy5vcHRpb25zXy50YWc7CgogICAgLy8gQ2hlY2sgaWYgdGhpcyBicm93c2VyIHN1cHBvcnRzIG1vdmluZyB0aGUgZWxlbWVudCBpbnRvIHRoZSBib3guCiAgICAvLyBPbiB0aGUgaVBob25lIHZpZGVvIHdpbGwgYnJlYWsgaWYgeW91IG1vdmUgdGhlIGVsZW1lbnQsCiAgICAvLyBTbyB3ZSBoYXZlIHRvIGNyZWF0ZSBhIGJyYW5kIG5ldyBlbGVtZW50LgogICAgLy8gSWYgd2UgaW5nZXN0ZWQgdGhlIHBsYXllciBkaXYsIHdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgdGhlIG1lZGlhIGVsZW1lbnQuCiAgICBpZiAoIWVsIHx8ICEodGhpcy5vcHRpb25zXy5wbGF5ZXJFbEluZ2VzdCB8fCB0aGlzLm1vdmluZ01lZGlhRWxlbWVudEluRE9NKSkgewoKICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIHRhZyBpcyBzdGlsbCB0aGVyZSwgY2xvbmUgYW5kIHJlbW92ZSBpdC4KICAgICAgaWYgKGVsKSB7CiAgICAgICAgdmFyIGNsb25lID0gZWwuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICBpZiAoZWwucGFyZW50Tm9kZSkgewogICAgICAgICAgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2xvbmUsIGVsKTsKICAgICAgICB9CiAgICAgICAgSHRtbDUuZGlzcG9zZU1lZGlhRWxlbWVudChlbCk7CiAgICAgICAgZWwgPSBjbG9uZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbCA9IGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKCiAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIG5hdGl2ZSBjb250cm9scyBzaG91bGQgYmUgdXNlZAogICAgICAgIHZhciB0YWdBdHRyaWJ1dGVzID0gdGhpcy5vcHRpb25zXy50YWcgJiYgZ2V0QXR0cmlidXRlcyh0aGlzLm9wdGlvbnNfLnRhZyk7CiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBtZXJnZU9wdGlvbnMoe30sIHRhZ0F0dHJpYnV0ZXMpOwoKICAgICAgICBpZiAoIVRPVUNIX0VOQUJMRUQgfHwgdGhpcy5vcHRpb25zXy5uYXRpdmVDb250cm9sc0ZvclRvdWNoICE9PSB0cnVlKSB7CiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy5jb250cm9sczsKICAgICAgICB9CgogICAgICAgIHNldEF0dHJpYnV0ZXMoZWwsIGFzc2lnbihhdHRyaWJ1dGVzLCB7CiAgICAgICAgICBpZDogdGhpcy5vcHRpb25zXy50ZWNoSWQsCiAgICAgICAgICAnY2xhc3MnOiAndmpzLXRlY2gnCiAgICAgICAgfSkpOwogICAgICB9CgogICAgICBlbC5wbGF5ZXJJZCA9IHRoaXMub3B0aW9uc18ucGxheWVySWQ7CiAgICB9CgogICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnNfLnByZWxvYWQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIHNldEF0dHJpYnV0ZShlbCwgJ3ByZWxvYWQnLCB0aGlzLm9wdGlvbnNfLnByZWxvYWQpOwogICAgfQoKICAgIC8vIFVwZGF0ZSBzcGVjaWZpYyB0YWcgc2V0dGluZ3MsIGluIGNhc2UgdGhleSB3ZXJlIG92ZXJyaWRkZW4KICAgIC8vIGBhdXRvcGxheWAgaGFzIHRvIGJlICpsYXN0KiBzbyB0aGF0IGBtdXRlZGAgYW5kIGBwbGF5c2lubGluZWAgYXJlIHByZXNlbnQKICAgIC8vIHdoZW4gaU9TL1NhZmFyaSBvciBvdGhlciBicm93c2VycyBhdHRlbXB0IHRvIGF1dG9wbGF5LgogICAgdmFyIHNldHRpbmdzQXR0cnMgPSBbJ2xvb3AnLCAnbXV0ZWQnLCAncGxheXNpbmxpbmUnLCAnYXV0b3BsYXknXTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldHRpbmdzQXR0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGF0dHIgPSBzZXR0aW5nc0F0dHJzW2ldOwogICAgICB2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnNfW2F0dHJdOwoKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgIHNldEF0dHJpYnV0ZShlbCwgYXR0ciwgYXR0cik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShlbCwgYXR0cik7CiAgICAgICAgfQogICAgICAgIGVsW2F0dHJdID0gdmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZWw7CiAgfTsKCiAgLyoqCiAgICogVGhpcyB3aWxsIGJlIHRyaWdnZXJlZCBpZiB0aGUgbG9hZHN0YXJ0IGV2ZW50IGhhcyBhbHJlYWR5IGZpcmVkLCBiZWZvcmUgdmlkZW9qcyB3YXMKICAgKiByZWFkeS4gVHdvIGtub3duIGV4YW1wbGVzIG9mIHdoZW4gdGhpcyBjYW4gaGFwcGVuIGFyZToKICAgKiAxLiBJZiB3ZSdyZSBsb2FkaW5nIHRoZSBwbGF5YmFjayBvYmplY3QgYWZ0ZXIgaXQgaGFzIHN0YXJ0ZWQgbG9hZGluZwogICAqIDIuIFRoZSBtZWRpYSBpcyBhbHJlYWR5IHBsYXlpbmcgdGhlIChvZnRlbiB3aXRoIGF1dG9wbGF5IG9uKSB0aGVuCiAgICoKICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlyZSBhbm90aGVyIGxvYWRzdGFydCBzbyB0aGF0IHZpZGVvanMgY2FuIGNhdGNodXAuCiAgICoKICAgKiBAZmlyZXMgVGVjaCNsb2Fkc3RhcnQKICAgKgogICAqIEByZXR1cm4ge3VuZGVmaW5lZH0KICAgKiAgICAgICAgIHJldHVybnMgbm90aGluZy4KICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5oYW5kbGVMYXRlSW5pdF8gPSBmdW5jdGlvbiBoYW5kbGVMYXRlSW5pdF8oZWwpIHsKICAgIGlmIChlbC5uZXR3b3JrU3RhdGUgPT09IDAgfHwgZWwubmV0d29ya1N0YXRlID09PSAzKSB7CiAgICAgIC8vIFRoZSB2aWRlbyBlbGVtZW50IGhhc24ndCBzdGFydGVkIGxvYWRpbmcgdGhlIHNvdXJjZSB5ZXQKICAgICAgLy8gb3IgZGlkbid0IGZpbmQgYSBzb3VyY2UKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChlbC5yZWFkeVN0YXRlID09PSAwKSB7CiAgICAgIC8vIE5ldHdvcmtTdGF0ZSBpcyBzZXQgc3luY2hyb25vdXNseSBCVVQgbG9hZHN0YXJ0IGlzIGZpcmVkIGF0IHRoZQogICAgICAvLyBlbmQgb2YgdGhlIGN1cnJlbnQgc3RhY2ssIHVzdWFsbHkgYmVmb3JlIHNldEludGVydmFsKGZuLCAwKS4KICAgICAgLy8gU28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IGxvYWRzdGFydCBtYXkgaGF2ZSBhbHJlYWR5IGZpcmVkIG9yIGlzCiAgICAgIC8vIGFib3V0IHRvIGZpcmUsIGFuZCBlaXRoZXIgd2F5IHRoZSBwbGF5ZXIgaGFzbid0IHNlZW4gaXQgeWV0LgogICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGZpcmUgbG9hZHN0YXJ0IHByZW1hdHVyZWx5IGhlcmUgYW5kIGNhdXNlIGEKICAgICAgLy8gZG91YmxlIGxvYWRzdGFydCBzbyB3ZSdsbCB3YWl0IGFuZCBzZWUgaWYgaXQgaGFwcGVucyBiZXR3ZWVuIG5vdwogICAgICAvLyBhbmQgdGhlIG5leHQgbG9vcCwgYW5kIGZpcmUgaXQgaWYgbm90LgogICAgICAvLyBIT1dFVkVSLCB3ZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGZpcmVzIGJlZm9yZSBsb2FkZWRtZXRhZGF0YQogICAgICAvLyB3aGljaCBjb3VsZCBhbHNvIGhhcHBlbiBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgbG9vcCwgc28gd2UnbGwKICAgICAgLy8gd2F0Y2ggZm9yIHRoYXQgYWxzby4KICAgICAgdmFyIGxvYWRzdGFydEZpcmVkID0gZmFsc2U7CiAgICAgIHZhciBzZXRMb2Fkc3RhcnRGaXJlZCA9IGZ1bmN0aW9uIHNldExvYWRzdGFydEZpcmVkKCkgewogICAgICAgIGxvYWRzdGFydEZpcmVkID0gdHJ1ZTsKICAgICAgfTsKCiAgICAgIHRoaXMub24oJ2xvYWRzdGFydCcsIHNldExvYWRzdGFydEZpcmVkKTsKCiAgICAgIHZhciB0cmlnZ2VyTG9hZHN0YXJ0ID0gZnVuY3Rpb24gdHJpZ2dlckxvYWRzdGFydCgpIHsKICAgICAgICAvLyBXZSBkaWQgbWlzcyB0aGUgb3JpZ2luYWwgbG9hZHN0YXJ0LiBNYWtlIHN1cmUgdGhlIHBsYXllcgogICAgICAgIC8vIHNlZXMgbG9hZHN0YXJ0IGJlZm9yZSBsb2FkZWRtZXRhZGF0YQogICAgICAgIGlmICghbG9hZHN0YXJ0RmlyZWQpIHsKICAgICAgICAgIHRoaXMudHJpZ2dlcignbG9hZHN0YXJ0Jyk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgdGhpcy5vbignbG9hZGVkbWV0YWRhdGEnLCB0cmlnZ2VyTG9hZHN0YXJ0KTsKCiAgICAgIHRoaXMucmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMub2ZmKCdsb2Fkc3RhcnQnLCBzZXRMb2Fkc3RhcnRGaXJlZCk7CiAgICAgICAgdGhpcy5vZmYoJ2xvYWRlZG1ldGFkYXRhJywgdHJpZ2dlckxvYWRzdGFydCk7CgogICAgICAgIGlmICghbG9hZHN0YXJ0RmlyZWQpIHsKICAgICAgICAgIC8vIFdlIGRpZCBtaXNzIHRoZSBvcmlnaW5hbCBuYXRpdmUgbG9hZHN0YXJ0LiBGaXJlIGl0IG5vdy4KICAgICAgICAgIHRoaXMudHJpZ2dlcignbG9hZHN0YXJ0Jyk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBGcm9tIGhlcmUgb24gd2Uga25vdyB0aGF0IGxvYWRzdGFydCBhbHJlYWR5IGZpcmVkIGFuZCB3ZSBtaXNzZWQgaXQuCiAgICAvLyBUaGUgb3RoZXIgcmVhZHlTdGF0ZSBldmVudHMgYXJlbid0IGFzIG11Y2ggb2YgYSBwcm9ibGVtIGlmIHdlIGRvdWJsZQogICAgLy8gdGhlbSwgc28gbm90IGdvaW5nIHRvIGdvIHRvIGFzIG11Y2ggdHJvdWJsZSBhcyBsb2Fkc3RhcnQgdG8gcHJldmVudAogICAgLy8gdGhhdCB1bmxlc3Mgd2UgZmluZCByZWFzb24gdG8uCiAgICB2YXIgZXZlbnRzVG9UcmlnZ2VyID0gWydsb2Fkc3RhcnQnXTsKCiAgICAvLyBsb2FkZWRtZXRhZGF0YTogbmV3bHkgZXF1YWwgdG8gSEFWRV9NRVRBREFUQSAoMSkgb3IgZ3JlYXRlcgogICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2xvYWRlZG1ldGFkYXRhJyk7CgogICAgLy8gbG9hZGVkZGF0YTogbmV3bHkgaW5jcmVhc2VkIHRvIEhBVkVfQ1VSUkVOVF9EQVRBICgyKSBvciBncmVhdGVyCiAgICBpZiAoZWwucmVhZHlTdGF0ZSA+PSAyKSB7CiAgICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKCdsb2FkZWRkYXRhJyk7CiAgICB9CgogICAgLy8gY2FucGxheTogbmV3bHkgaW5jcmVhc2VkIHRvIEhBVkVfRlVUVVJFX0RBVEEgKDMpIG9yIGdyZWF0ZXIKICAgIGlmIChlbC5yZWFkeVN0YXRlID49IDMpIHsKICAgICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2NhbnBsYXknKTsKICAgIH0KCiAgICAvLyBjYW5wbGF5dGhyb3VnaDogbmV3bHkgZXF1YWwgdG8gSEFWRV9FTk9VR0hfREFUQSAoNCkKICAgIGlmIChlbC5yZWFkeVN0YXRlID49IDQpIHsKICAgICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2NhbnBsYXl0aHJvdWdoJyk7CiAgICB9CgogICAgLy8gV2Ugc3RpbGwgbmVlZCB0byBnaXZlIHRoZSBwbGF5ZXIgdGltZSB0byBhZGQgZXZlbnQgbGlzdGVuZXJzCiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgZXZlbnRzVG9UcmlnZ2VyLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgICB0aGlzLnRyaWdnZXIodHlwZSk7CiAgICAgIH0sIHRoaXMpOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogU2V0IGN1cnJlbnQgdGltZSBmb3IgdGhlIGBIVE1MNWAgdGVjaC4KICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzCiAgICogICAgICAgIFNldCB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBtZWRpYSB0byB0aGlzLgogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lID0gZnVuY3Rpb24gc2V0Q3VycmVudFRpbWUoc2Vjb25kcykgewogICAgdHJ5IHsKICAgICAgdGhpcy5lbF8uY3VycmVudFRpbWUgPSBzZWNvbmRzOwogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2ckMShlLCAnVmlkZW8gaXMgbm90IHJlYWR5LiAoVmlkZW8uanMpJyk7CiAgICAgIC8vIHRoaXMud2FybmluZyhWaWRlb0pTLndhcm5pbmdzLnZpZGVvTm90UmVhZHkpOwogICAgfQogIH07CgogIC8qKgogICAqIEdldCB0aGUgY3VycmVudCBkdXJhdGlvbiBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC4KICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIFRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgb3IgMCBpZiB0aGVyZSBpcyBubyBkdXJhdGlvbi4KICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uIGR1cmF0aW9uKCkgewogICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgLy8gQW5kcm9pZCBDaHJvbWUgd2lsbCByZXBvcnQgZHVyYXRpb24gYXMgSW5maW5pdHkgZm9yIFZPRCBITFMgdW50aWwgYWZ0ZXIKICAgIC8vIHBsYXliYWNrIGhhcyBzdGFydGVkLCB3aGljaCB0cmlnZ2VycyB0aGUgbGl2ZSBkaXNwbGF5IGVycm9uZW91c2x5LgogICAgLy8gUmV0dXJuIE5hTiBpZiBwbGF5YmFjayBoYXMgbm90IHN0YXJ0ZWQgYW5kIHRyaWdnZXIgYSBkdXJhdGlvbnVwZGF0ZSBvbmNlCiAgICAvLyB0aGUgZHVyYXRpb24gY2FuIGJlIHJlbGlhYmx5IGtub3duLgogICAgaWYgKHRoaXMuZWxfLmR1cmF0aW9uID09PSBJbmZpbml0eSAmJiBJU19BTkRST0lEICYmIElTX0NIUk9NRSAmJiB0aGlzLmVsXy5jdXJyZW50VGltZSA9PT0gMCkgewogICAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgYHRpbWV1cGRhdGVgIHdpdGggY3VycmVudFRpbWUgPiAwIC0gdGhlcmUgbWF5IGJlCiAgICAgIC8vIHNldmVyYWwgd2l0aCAwCiAgICAgIHZhciBjaGVja1Byb2dyZXNzID0gZnVuY3Rpb24gY2hlY2tQcm9ncmVzcygpIHsKICAgICAgICBpZiAoX3RoaXMzLmVsXy5jdXJyZW50VGltZSA+IDApIHsKICAgICAgICAgIC8vIFRyaWdnZXIgZHVyYXRpb25jaGFuZ2UgZm9yIGdlbnVpbmVseSBsaXZlIHZpZGVvCiAgICAgICAgICBpZiAoX3RoaXMzLmVsXy5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgX3RoaXMzLnRyaWdnZXIoJ2R1cmF0aW9uY2hhbmdlJyk7CiAgICAgICAgICB9CiAgICAgICAgICBfdGhpczMub2ZmKCd0aW1ldXBkYXRlJywgY2hlY2tQcm9ncmVzcyk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgdGhpcy5vbigndGltZXVwZGF0ZScsIGNoZWNrUHJvZ3Jlc3MpOwogICAgICByZXR1cm4gTmFOOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWxfLmR1cmF0aW9uIHx8IE5hTjsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBUaGUgd2lkdGggb2YgdGhlIEhUTUw1IG1lZGlhIGVsZW1lbnQuCiAgICovCgoKICBIdG1sNS5wcm90b3R5cGUud2lkdGggPSBmdW5jdGlvbiB3aWR0aCgpIHsKICAgIHJldHVybiB0aGlzLmVsXy5vZmZzZXRXaWR0aDsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBIVE1MNSBtZWRpYSBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgVGhlIGhlaWd0aCBvZiB0aGUgSFRNTDUgbWVkaWEgZWxlbWVudC4KICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiBoZWlnaHQoKSB7CiAgICByZXR1cm4gdGhpcy5lbF8ub2Zmc2V0SGVpZ2h0OwogIH07CgogIC8qKgogICAqIFByb3h5IGlPUyBgd2Via2l0YmVnaW5mdWxsc2NyZWVuYCBhbmQgYHdlYmtpdGVuZGZ1bGxzY3JlZW5gIGludG8KICAgKiBgZnVsbHNjcmVlbmNoYW5nZWAgZXZlbnQuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBmaXJlcyBmdWxsc2NyZWVuY2hhbmdlCiAgICogQGxpc3RlbnMgd2Via2l0ZW5kZnVsbHNjcmVlbgogICAqIEBsaXN0ZW5zIHdlYmtpdGJlZ2luZnVsbHNjcmVlbgogICAqIEBsaXN0ZW5zIHdlYmtpdGJlZ2luZnVsbHNjcmVlbgogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnByb3h5V2Via2l0RnVsbHNjcmVlbl8gPSBmdW5jdGlvbiBwcm94eVdlYmtpdEZ1bGxzY3JlZW5fKCkgewogICAgdmFyIF90aGlzNCA9IHRoaXM7CgogICAgaWYgKCEoJ3dlYmtpdERpc3BsYXlpbmdGdWxsc2NyZWVuJyBpbiB0aGlzLmVsXykpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBlbmRGbiA9IGZ1bmN0aW9uIGVuZEZuKCkgewogICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB7IGlzRnVsbHNjcmVlbjogZmFsc2UgfSk7CiAgICB9OwoKICAgIHZhciBiZWdpbkZuID0gZnVuY3Rpb24gYmVnaW5GbigpIHsKICAgICAgaWYgKCd3ZWJraXRQcmVzZW50YXRpb25Nb2RlJyBpbiB0aGlzLmVsXyAmJiB0aGlzLmVsXy53ZWJraXRQcmVzZW50YXRpb25Nb2RlICE9PSAncGljdHVyZS1pbi1waWN0dXJlJykgewogICAgICAgIHRoaXMub25lKCd3ZWJraXRlbmRmdWxsc2NyZWVuJywgZW5kRm4pOwoKICAgICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB7IGlzRnVsbHNjcmVlbjogdHJ1ZSB9KTsKICAgICAgfQogICAgfTsKCiAgICB0aGlzLm9uKCd3ZWJraXRiZWdpbmZ1bGxzY3JlZW4nLCBiZWdpbkZuKTsKICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzNC5vZmYoJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGJlZ2luRm4pOwogICAgICBfdGhpczQub2ZmKCd3ZWJraXRlbmRmdWxsc2NyZWVuJywgZW5kRm4pOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2sgaWYgZnVsbHNjcmVlbiBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgcGxheWJhY2sgZGV2aWNlLgogICAqCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiAgICAgICAgIC0gVHJ1ZSBpZiBmdWxsc2NyZWVuIGlzIHN1cHBvcnRlZC4KICAgKiAgICAgICAgIC0gRmFsc2UgaWYgZnVsbHNjcmVlbiBpcyBub3Qgc3VwcG9ydGVkLgogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnN1cHBvcnRzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uIHN1cHBvcnRzRnVsbFNjcmVlbigpIHsKICAgIGlmICh0eXBlb2YgdGhpcy5lbF8ud2Via2l0RW50ZXJGdWxsU2NyZWVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciB1c2VyQWdlbnQgPSB3aW5kb3dfMS5uYXZpZ2F0b3IgJiYgd2luZG93XzEubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJzsKCiAgICAgIC8vIFNlZW1zIHRvIGJlIGJyb2tlbiBpbiBDaHJvbWl1bS9DaHJvbWUgJiYgU2FmYXJpIGluIExlb3BhcmQKICAgICAgaWYgKC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCkgfHwgIS9DaHJvbWV8TWFjIE9TIFggMTAuNS8udGVzdCh1c2VyQWdlbnQpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICAvKioKICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGBIVE1MNWAgVGVjaCBlbnRlciBmdWxsc2NyZWVuLgogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLmVudGVyRnVsbFNjcmVlbiA9IGZ1bmN0aW9uIGVudGVyRnVsbFNjcmVlbigpIHsKICAgIHZhciB2aWRlbyA9IHRoaXMuZWxfOwoKICAgIGlmICh2aWRlby5wYXVzZWQgJiYgdmlkZW8ubmV0d29ya1N0YXRlIDw9IHZpZGVvLkhBVkVfTUVUQURBVEEpIHsKICAgICAgLy8gYXR0ZW1wdCB0byBwcmltZSB0aGUgdmlkZW8gZWxlbWVudCBmb3IgcHJvZ3JhbW1hdGljIGFjY2VzcwogICAgICAvLyB0aGlzIGlzbid0IG5lY2Vzc2FyeSBvbiB0aGUgZGVza3RvcCBidXQgc2hvdWxkbid0IGh1cnQKICAgICAgdGhpcy5lbF8ucGxheSgpOwoKICAgICAgLy8gcGxheWluZyBhbmQgcGF1c2luZyBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byBmdWxsc2NyZWVuCiAgICAgIC8vIGNhbiBnZXQgaU9TIH42LjEgZGV2aWNlcyBpbnRvIGEgcGxheS9wYXVzZSBsb29wCiAgICAgIHRoaXMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmlkZW8ucGF1c2UoKTsKICAgICAgICB2aWRlby53ZWJraXRFbnRlckZ1bGxTY3JlZW4oKTsKICAgICAgfSwgMCk7CiAgICB9IGVsc2UgewogICAgICB2aWRlby53ZWJraXRFbnRlckZ1bGxTY3JlZW4oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGBIVE1MNWAgVGVjaCBleGl0IGZ1bGxzY3JlZW4uCiAgICovCgoKICBIdG1sNS5wcm90b3R5cGUuZXhpdEZ1bGxTY3JlZW4gPSBmdW5jdGlvbiBleGl0RnVsbFNjcmVlbigpIHsKICAgIHRoaXMuZWxfLndlYmtpdEV4aXRGdWxsU2NyZWVuKCk7CiAgfTsKCiAgLyoqCiAgICogQSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgYEh0bWw1YCBUZWNoJ3Mgc291cmNlIG9iamVjdC4KICAgKiA+IE5vdGU6IFBsZWFzZSB1c2Uge0BsaW5rIEh0bWw1I3NldFNvdXJjZX0KICAgKgogICAqIEBwYXJhbSB7VGVjaH5Tb3VyY2VPYmplY3R9IFtzcmNdCiAgICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0IHlvdSB3YW50IHRvIHNldCBvbiB0aGUgYEhUTUw1YCB0ZWNocyBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R8dW5kZWZpbmVkfQogICAqICAgICAgICAgLSBUaGUgY3VycmVudCBzb3VyY2Ugb2JqZWN0IHdoZW4gYSBzb3VyY2UgaXMgbm90IHBhc3NlZCBpbi4KICAgKiAgICAgICAgIC0gdW5kZWZpbmVkIHdoZW4gc2V0dGluZwogICAqCiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA1LgogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnNyYyA9IGZ1bmN0aW9uIHNyYyhfc3JjKSB7CiAgICBpZiAoX3NyYyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzLmVsXy5zcmM7CiAgICB9CgogICAgLy8gU2V0dGluZyBzcmMgdGhyb3VnaCBgc3JjYCBpbnN0ZWFkIG9mIGBzZXRTcmNgIHdpbGwgYmUgZGVwcmVjYXRlZAogICAgdGhpcy5zZXRTcmMoX3NyYyk7CiAgfTsKCiAgLyoqCiAgICogUmVzZXQgdGhlIHRlY2ggYnkgcmVtb3ZpbmcgYWxsIHNvdXJjZXMgYW5kIHRoZW4gY2FsbGluZwogICAqIHtAbGluayBIdG1sNS5yZXNldE1lZGlhRWxlbWVudH0uCiAgICovCgoKICBIdG1sNS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHsKICAgIEh0bWw1LnJlc2V0TWVkaWFFbGVtZW50KHRoaXMuZWxfKTsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIGN1cnJlbnQgc291cmNlIG9uIHRoZSBgSFRNTDVgIFRlY2guIEZhbGxzIGJhY2sgdG8gcmV0dXJuaW5nIHRoZSBzb3VyY2UgZnJvbQogICAqIHRoZSBIVE1MNSBtZWRpYSBlbGVtZW50LgogICAqCiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R9CiAgICogICAgICAgICBUaGUgY3VycmVudCBzb3VyY2Ugb2JqZWN0IGZyb20gdGhlIEhUTUw1IHRlY2guIFdpdGggYSBmYWxsYmFjayB0byB0aGUKICAgKiAgICAgICAgIGVsZW1lbnRzIHNvdXJjZS4KICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5jdXJyZW50U3JjID0gZnVuY3Rpb24gY3VycmVudFNyYygpIHsKICAgIGlmICh0aGlzLmN1cnJlbnRTb3VyY2VfKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2VfLnNyYzsKICAgIH0KICAgIHJldHVybiB0aGlzLmVsXy5jdXJyZW50U3JjOwogIH07CgogIC8qKgogICAqIFNldCBjb250cm9scyBhdHRyaWJ1dGUgZm9yIHRoZSBIVE1MNSBtZWRpYSBFbGVtZW50LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbAogICAqICAgICAgICBWYWx1ZSB0byBzZXQgdGhlIGNvbnRyb2xzIGF0dHJpYnV0ZSB0bwogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnNldENvbnRyb2xzID0gZnVuY3Rpb24gc2V0Q29udHJvbHModmFsKSB7CiAgICB0aGlzLmVsXy5jb250cm9scyA9ICEhdmFsOwogIH07CgogIC8qKgogICAqIENyZWF0ZSBhbmQgcmV0dXJucyBhIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSBvYmplY3QuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30ga2luZAogICAqICAgICAgICBgVGV4dFRyYWNrYCBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnMsIGNoYXB0ZXJzLCBvciBtZXRhZGF0YSkKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdCiAgICogICAgICAgIExhYmVsIHRvIGlkZW50aWZ5IHRoZSB0ZXh0IHRyYWNrCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhbmd1YWdlXQogICAqICAgICAgICBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvbgogICAqCiAgICogQHJldHVybiB7VGV4dFRyYWNrfQogICAqICAgICAgICAgVGhlIFRleHRUcmFjayB0aGF0IGdldHMgY3JlYXRlZC4KICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5hZGRUZXh0VHJhY2sgPSBmdW5jdGlvbiBhZGRUZXh0VHJhY2soa2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7CiAgICBpZiAoIXRoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzKSB7CiAgICAgIHJldHVybiBfVGVjaC5wcm90b3R5cGUuYWRkVGV4dFRyYWNrLmNhbGwodGhpcywga2luZCwgbGFiZWwsIGxhbmd1YWdlKTsKICAgIH0KCiAgICByZXR1cm4gdGhpcy5lbF8uYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBlaXRoZXIgbmF0aXZlIFRleHRUcmFjayBvciBhbiBlbXVsYXRlZCBUZXh0VHJhY2sgZGVwZW5kaW5nCiAgICogb24gdGhlIHZhbHVlIG9mIGBmZWF0dXJlc05hdGl2ZVRleHRUcmFja3NgCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAqICAgICAgICBUaGUgb2JqZWN0IHNob3VsZCBjb250YWluIHRoZSBvcHRpb25zIHRvIGludGlhbGl6ZSB0aGUgVGV4dFRyYWNrIHdpdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2luZF0KICAgKiAgICAgICAgYFRleHRUcmFja2Aga2luZCAoc3VidGl0bGVzLCBjYXB0aW9ucywgZGVzY3JpcHRpb25zLCBjaGFwdGVycywgb3IgbWV0YWRhdGEpLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXS4KICAgKiAgICAgICAgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2sKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYW5ndWFnZV0KICAgKiAgICAgICAgVHdvIGxldHRlciBsYW5ndWFnZSBhYmJyZXZpYXRpb24uCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRlZmF1bHRdCiAgICogICAgICAgIERlZmF1bHQgdGhpcyB0cmFjayB0byBvbi4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5pZF0KICAgKiAgICAgICAgVGhlIGludGVybmFsIGlkIHRvIGFzc2lnbiB0aGlzIHRyYWNrLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNyY10KICAgKiAgICAgICAgQSBzb3VyY2UgdXJsIGZvciB0aGUgdHJhY2suCiAgICoKICAgKiBAcmV0dXJuIHtIVE1MVHJhY2tFbGVtZW50fQogICAqICAgICAgICAgVGhlIHRyYWNrIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuCiAgICovCgoKICBIdG1sNS5wcm90b3R5cGUuY3JlYXRlUmVtb3RlVGV4dFRyYWNrID0gZnVuY3Rpb24gY3JlYXRlUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpIHsKICAgIGlmICghdGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHsKICAgICAgcmV0dXJuIF9UZWNoLnByb3RvdHlwZS5jcmVhdGVSZW1vdGVUZXh0VHJhY2suY2FsbCh0aGlzLCBvcHRpb25zKTsKICAgIH0KICAgIHZhciBodG1sVHJhY2tFbGVtZW50ID0gZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCd0cmFjaycpOwoKICAgIGlmIChvcHRpb25zLmtpbmQpIHsKICAgICAgaHRtbFRyYWNrRWxlbWVudC5raW5kID0gb3B0aW9ucy5raW5kOwogICAgfQogICAgaWYgKG9wdGlvbnMubGFiZWwpIHsKICAgICAgaHRtbFRyYWNrRWxlbWVudC5sYWJlbCA9IG9wdGlvbnMubGFiZWw7CiAgICB9CiAgICBpZiAob3B0aW9ucy5sYW5ndWFnZSB8fCBvcHRpb25zLnNyY2xhbmcpIHsKICAgICAgaHRtbFRyYWNrRWxlbWVudC5zcmNsYW5nID0gb3B0aW9ucy5sYW5ndWFnZSB8fCBvcHRpb25zLnNyY2xhbmc7CiAgICB9CiAgICBpZiAob3B0aW9uc1snZGVmYXVsdCddKSB7CiAgICAgIGh0bWxUcmFja0VsZW1lbnRbJ2RlZmF1bHQnXSA9IG9wdGlvbnNbJ2RlZmF1bHQnXTsKICAgIH0KICAgIGlmIChvcHRpb25zLmlkKSB7CiAgICAgIGh0bWxUcmFja0VsZW1lbnQuaWQgPSBvcHRpb25zLmlkOwogICAgfQogICAgaWYgKG9wdGlvbnMuc3JjKSB7CiAgICAgIGh0bWxUcmFja0VsZW1lbnQuc3JjID0gb3B0aW9ucy5zcmM7CiAgICB9CgogICAgcmV0dXJuIGh0bWxUcmFja0VsZW1lbnQ7CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhbiBodG1sIHRyYWNrIGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb2JqZWN0IHNob3VsZCBjb250YWluIHZhbHVlcyBmb3IKICAgKiBraW5kLCBsYW5ndWFnZSwgbGFiZWwsIGFuZCBzcmMgKGxvY2F0aW9uIG9mIHRoZSBXZWJWVFQgZmlsZSkKICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYW51YWxDbGVhbnVwPXRydWVdIGlmIHNldCB0byBmYWxzZSwgdGhlIFRleHRUcmFjayB3aWxsIGJlCiAgICogYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhlIHZpZGVvIGVsZW1lbnQgd2hlbmV2ZXIgdGhlIHNvdXJjZSBjaGFuZ2VzCiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH0gQW4gSHRtbCBUcmFjayBFbGVtZW50LgogICAqIFRoaXMgY2FuIGJlIGFuIGVtdWxhdGVkIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fSBvciBhIG5hdGl2ZSBvbmUuCiAgICogQGRlcHJlY2F0ZWQgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICJtYW51YWxDbGVhbnVwIiBwYXJhbWV0ZXIgd2lsbCBkZWZhdWx0CiAgICogdG8gImZhbHNlIiBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBWaWRlby5qcwogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLmFkZFJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIGFkZFJlbW90ZVRleHRUcmFjayhvcHRpb25zLCBtYW51YWxDbGVhbnVwKSB7CiAgICB2YXIgaHRtbFRyYWNrRWxlbWVudCA9IF9UZWNoLnByb3RvdHlwZS5hZGRSZW1vdGVUZXh0VHJhY2suY2FsbCh0aGlzLCBvcHRpb25zLCBtYW51YWxDbGVhbnVwKTsKCiAgICBpZiAodGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHsKICAgICAgdGhpcy5lbCgpLmFwcGVuZENoaWxkKGh0bWxUcmFja0VsZW1lbnQpOwogICAgfQoKICAgIHJldHVybiBodG1sVHJhY2tFbGVtZW50OwogIH07CgogIC8qKgogICAqIFJlbW92ZSByZW1vdGUgYFRleHRUcmFja2AgZnJvbSBgVGV4dFRyYWNrTGlzdGAgb2JqZWN0CiAgICoKICAgKiBAcGFyYW0ge1RleHRUcmFja30gdHJhY2sKICAgKiAgICAgICAgYFRleHRUcmFja2Agb2JqZWN0IHRvIHJlbW92ZQogICAqLwoKCiAgSHRtbDUucHJvdG90eXBlLnJlbW92ZVJlbW90ZVRleHRUcmFjayA9IGZ1bmN0aW9uIHJlbW92ZVJlbW90ZVRleHRUcmFjayh0cmFjaykgewogICAgX1RlY2gucHJvdG90eXBlLnJlbW92ZVJlbW90ZVRleHRUcmFjay5jYWxsKHRoaXMsIHRyYWNrKTsKCiAgICBpZiAodGhpcy5mZWF0dXJlc05hdGl2ZVRleHRUcmFja3MpIHsKICAgICAgdmFyIHRyYWNrcyA9IHRoaXMuJCQoJ3RyYWNrJyk7CgogICAgICB2YXIgaSA9IHRyYWNrcy5sZW5ndGg7CgogICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgaWYgKHRyYWNrID09PSB0cmFja3NbaV0gfHwgdHJhY2sgPT09IHRyYWNrc1tpXS50cmFjaykgewogICAgICAgICAgdGhpcy5lbCgpLnJlbW92ZUNoaWxkKHRyYWNrc1tpXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLyoqCiAgICogR2V0cyBhdmFpbGFibGUgbWVkaWEgcGxheWJhY2sgcXVhbGl0eSBtZXRyaWNzIGFzIHNwZWNpZmllZCBieSB0aGUgVzNDJ3MgTWVkaWEKICAgKiBQbGF5YmFjayBRdWFsaXR5IEFQSS4KICAgKgogICAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vbWVkaWEtcGxheWJhY2stcXVhbGl0eX0KICAgKgogICAqIEByZXR1cm4ge09iamVjdH0KICAgKiAgICAgICAgIEFuIG9iamVjdCB3aXRoIHN1cHBvcnRlZCBtZWRpYSBwbGF5YmFjayBxdWFsaXR5IG1ldHJpY3MKICAgKi8KCgogIEh0bWw1LnByb3RvdHlwZS5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSA9IGZ1bmN0aW9uIGdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCkgewogICAgaWYgKHR5cGVvZiB0aGlzLmVsKCkuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIHRoaXMuZWwoKS5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpOwogICAgfQoKICAgIHZhciB2aWRlb1BsYXliYWNrUXVhbGl0eSA9IHt9OwoKICAgIGlmICh0eXBlb2YgdGhpcy5lbCgpLndlYmtpdERyb3BwZWRGcmFtZUNvdW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpcy5lbCgpLndlYmtpdERlY29kZWRGcmFtZUNvdW50ICE9PSAndW5kZWZpbmVkJykgewogICAgICB2aWRlb1BsYXliYWNrUXVhbGl0eS5kcm9wcGVkVmlkZW9GcmFtZXMgPSB0aGlzLmVsKCkud2Via2l0RHJvcHBlZEZyYW1lQ291bnQ7CiAgICAgIHZpZGVvUGxheWJhY2tRdWFsaXR5LnRvdGFsVmlkZW9GcmFtZXMgPSB0aGlzLmVsKCkud2Via2l0RGVjb2RlZEZyYW1lQ291bnQ7CiAgICB9CgogICAgaWYgKHdpbmRvd18xLnBlcmZvcm1hbmNlICYmIHR5cGVvZiB3aW5kb3dfMS5wZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmlkZW9QbGF5YmFja1F1YWxpdHkuY3JlYXRpb25UaW1lID0gd2luZG93XzEucGVyZm9ybWFuY2Uubm93KCk7CiAgICB9IGVsc2UgaWYgKHdpbmRvd18xLnBlcmZvcm1hbmNlICYmIHdpbmRvd18xLnBlcmZvcm1hbmNlLnRpbWluZyAmJiB0eXBlb2Ygd2luZG93XzEucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCA9PT0gJ251bWJlcicpIHsKICAgICAgdmlkZW9QbGF5YmFja1F1YWxpdHkuY3JlYXRpb25UaW1lID0gd2luZG93XzEuRGF0ZS5ub3coKSAtIHdpbmRvd18xLnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7CiAgICB9CgogICAgcmV0dXJuIHZpZGVvUGxheWJhY2tRdWFsaXR5OwogIH07CgogIHJldHVybiBIdG1sNTsKfShUZWNoKTsKCi8qIEhUTUw1IFN1cHBvcnQgVGVzdGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoaXNSZWFsKCkpIHsKCiAgLyoqCiAgICogRWxlbWVudCBmb3IgdGVzdGluZyBicm93c2VyIEhUTUw1IG1lZGlhIGNhcGFiaWxpdGllcwogICAqCiAgICogQHR5cGUge0VsZW1lbnR9CiAgICogQGNvbnN0YW50CiAgICogQHByaXZhdGUKICAgKi8KICBIdG1sNS5URVNUX1ZJRCA9IGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICB2YXIgdHJhY2sgPSBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7CgogIHRyYWNrLmtpbmQgPSAnY2FwdGlvbnMnOwogIHRyYWNrLnNyY2xhbmcgPSAnZW4nOwogIHRyYWNrLmxhYmVsID0gJ0VuZ2xpc2gnOwogIEh0bWw1LlRFU1RfVklELmFwcGVuZENoaWxkKHRyYWNrKTsKfQoKLyoqCiAqIENoZWNrIGlmIEhUTUw1IG1lZGlhIGlzIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlLgogKgogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVHJ1ZSBpZiBIVE1MNSBtZWRpYSBpcyBzdXBwb3J0ZWQuCiAqICAgICAgICAgLSBGYWxzZSBpZiBIVE1MNSBtZWRpYSBpcyBub3Qgc3VwcG9ydGVkLgogKi8KSHRtbDUuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7CiAgLy8gSUU5IHdpdGggbm8gTWVkaWEgUGxheWVyIGlzIGEgTElBUiEgKCM5ODQpCiAgdHJ5IHsKICAgIEh0bWw1LlRFU1RfVklELnZvbHVtZSA9IDAuNTsKICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICByZXR1cm4gISEoSHRtbDUuVEVTVF9WSUQgJiYgSHRtbDUuVEVTVF9WSUQuY2FuUGxheVR5cGUpOwp9OwoKLyoqCiAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiB0eXBlCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAqICAgICAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2sKICogQHJldHVybiB7c3RyaW5nfSAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKQogKi8KSHRtbDUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkgewogIHJldHVybiBIdG1sNS5URVNUX1ZJRC5jYW5QbGF5VHlwZSh0eXBlKTsKfTsKCi8qKgogKiBDaGVjayBpZiB0aGUgdGVjaCBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4gc291cmNlCiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNPYmoKICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0CiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAqICAgICAgICBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHRlY2gKICogQHJldHVybiB7c3RyaW5nfSAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKQogKi8KSHRtbDUuY2FuUGxheVNvdXJjZSA9IGZ1bmN0aW9uIChzcmNPYmosIG9wdGlvbnMpIHsKICByZXR1cm4gSHRtbDUuY2FuUGxheVR5cGUoc3JjT2JqLnR5cGUpOwp9OwoKLyoqCiAqIENoZWNrIGlmIHRoZSB2b2x1bWUgY2FuIGJlIGNoYW5nZWQgaW4gdGhpcyBicm93c2VyL2RldmljZS4KICogVm9sdW1lIGNhbm5vdCBiZSBjaGFuZ2VkIGluIGEgbG90IG9mIG1vYmlsZSBkZXZpY2VzLgogKiBTcGVjaWZpY2FsbHksIGl0IGNhbid0IGJlIGNoYW5nZWQgZnJvbSAxIG9uIGlPUy4KICoKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICAtIFRydWUgaWYgdm9sdW1lIGNhbiBiZSBjb250cm9sbGVkCiAqICAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UKICovCkh0bWw1LmNhbkNvbnRyb2xWb2x1bWUgPSBmdW5jdGlvbiAoKSB7CiAgLy8gSUUgd2lsbCBlcnJvciBpZiBXaW5kb3dzIE1lZGlhIFBsYXllciBub3QgaW5zdGFsbGVkICMzMzE1CiAgdHJ5IHsKICAgIHZhciB2b2x1bWUgPSBIdG1sNS5URVNUX1ZJRC52b2x1bWU7CgogICAgSHRtbDUuVEVTVF9WSUQudm9sdW1lID0gdm9sdW1lIC8gMiArIDAuMTsKICAgIHJldHVybiB2b2x1bWUgIT09IEh0bWw1LlRFU1RfVklELnZvbHVtZTsKICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9OwoKLyoqCiAqIENoZWNrIGlmIHRoZSBwbGF5YmFjayByYXRlIGNhbiBiZSBjaGFuZ2VkIGluIHRoaXMgYnJvd3Nlci9kZXZpY2UuCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgLSBUcnVlIGlmIHBsYXliYWNrIHJhdGUgY2FuIGJlIGNvbnRyb2xsZWQKICogICAgICAgICAtIEZhbHNlIG90aGVyd2lzZQogKi8KSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uICgpIHsKICAvLyBQbGF5YmFjayByYXRlIEFQSSBpcyBpbXBsZW1lbnRlZCBpbiBBbmRyb2lkIENocm9tZSwgYnV0IGRvZXNuJ3QgZG8gYW55dGhpbmcKICAvLyBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMzE4MAogIGlmIChJU19BTkRST0lEICYmIElTX0NIUk9NRSAmJiBDSFJPTUVfVkVSU0lPTiA8IDU4KSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIC8vIElFIHdpbGwgZXJyb3IgaWYgV2luZG93cyBNZWRpYSBQbGF5ZXIgbm90IGluc3RhbGxlZCAjMzMxNQogIHRyeSB7CiAgICB2YXIgcGxheWJhY2tSYXRlID0gSHRtbDUuVEVTVF9WSUQucGxheWJhY2tSYXRlOwoKICAgIEh0bWw1LlRFU1RfVklELnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZSAvIDIgKyAwLjE7CiAgICByZXR1cm4gcGxheWJhY2tSYXRlICE9PSBIdG1sNS5URVNUX1ZJRC5wbGF5YmFja1JhdGU7CiAgfSBjYXRjaCAoZSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfTsKCi8qKgogKiBDaGVjayB0byBzZWUgaWYgbmF0aXZlIGBUZXh0VHJhY2tgcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci9kZXZpY2UuCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgLSBUcnVlIGlmIG5hdGl2ZSBgVGV4dFRyYWNrYHMgYXJlIHN1cHBvcnRlZC4KICogICAgICAgICAtIEZhbHNlIG90aGVyd2lzZQogKi8KSHRtbDUuc3VwcG9ydHNOYXRpdmVUZXh0VHJhY2tzID0gZnVuY3Rpb24gKCkgewogIHJldHVybiBJU19BTllfU0FGQVJJOwp9OwoKLyoqCiAqIENoZWNrIHRvIHNlZSBpZiBuYXRpdmUgYFZpZGVvVHJhY2tgcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci9kZXZpY2UKICoKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgIC0gVHJ1ZSBpZiBuYXRpdmUgYFZpZGVvVHJhY2tgcyBhcmUgc3VwcG9ydGVkLgogKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UKICovCkh0bWw1LnN1cHBvcnRzTmF0aXZlVmlkZW9UcmFja3MgPSBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuICEhKEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELnZpZGVvVHJhY2tzKTsKfTsKCi8qKgogKiBDaGVjayB0byBzZWUgaWYgbmF0aXZlIGBBdWRpb1RyYWNrYHMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAtIFRydWUgaWYgbmF0aXZlIGBBdWRpb1RyYWNrYHMgYXJlIHN1cHBvcnRlZC4KICogICAgICAgIC0gRmFsc2Ugb3RoZXJ3aXNlCiAqLwpIdG1sNS5zdXBwb3J0c05hdGl2ZUF1ZGlvVHJhY2tzID0gZnVuY3Rpb24gKCkgewogIHJldHVybiAhIShIdG1sNS5URVNUX1ZJRCAmJiBIdG1sNS5URVNUX1ZJRC5hdWRpb1RyYWNrcyk7Cn07CgovKioKICogQW4gYXJyYXkgb2YgZXZlbnRzIGF2YWlsYWJsZSBvbiB0aGUgSHRtbDUgdGVjaC4KICoKICogQHByaXZhdGUKICogQHR5cGUge0FycmF5fQogKi8KSHRtbDUuRXZlbnRzID0gWydsb2Fkc3RhcnQnLCAnc3VzcGVuZCcsICdhYm9ydCcsICdlcnJvcicsICdlbXB0aWVkJywgJ3N0YWxsZWQnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZGVkZGF0YScsICdjYW5wbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ3BsYXlpbmcnLCAnd2FpdGluZycsICdzZWVraW5nJywgJ3NlZWtlZCcsICdlbmRlZCcsICdkdXJhdGlvbmNoYW5nZScsICd0aW1ldXBkYXRlJywgJ3Byb2dyZXNzJywgJ3BsYXknLCAncGF1c2UnLCAncmF0ZWNoYW5nZScsICdyZXNpemUnLCAndm9sdW1lY2hhbmdlJ107CgovKioKICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBUZWNoYCBzdXBwb3J0cyB2b2x1bWUgY29udHJvbC4KICoKICogQHR5cGUge2Jvb2xlYW59CiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5jYW5Db250cm9sVm9sdW1lfQogKi8KSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzVm9sdW1lQ29udHJvbCA9IEh0bWw1LmNhbkNvbnRyb2xWb2x1bWUoKTsKCi8qKgogKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYFRlY2hgIHN1cHBvcnRzIGNoYW5naW5nIHRoZSBzcGVlZCBhdCB3aGljaCB0aGUgbWVkaWEKICogcGxheXMuIEV4YW1wbGVzOgogKiAgIC0gU2V0IHBsYXllciB0byBwbGF5IDJ4ICh0d2ljZSkgYXMgZmFzdAogKiAgIC0gU2V0IHBsYXllciB0byBwbGF5IDAuNXggKGhhbGYpIGFzIGZhc3QKICoKICogQHR5cGUge2Jvb2xlYW59CiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5jYW5Db250cm9sUGxheWJhY2tSYXRlfQogKi8KSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzUGxheWJhY2tSYXRlID0gSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSgpOwoKLyoqCiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgSFRNTDVgIHRlY2ggY3VycmVudGx5IHN1cHBvcnRzIHRoZSBtZWRpYSBlbGVtZW50CiAqIG1vdmluZyBpbiB0aGUgRE9NLiBpT1MgYnJlYWtzIGlmIHlvdSBtb3ZlIHRoZSBtZWRpYSBlbGVtZW50LCBzbyB0aGlzIGlzIHNldCB0aGlzIHRvCiAqIGZhbHNlIHRoZXJlLiBFdmVyeXdoZXJlIGVsc2UgdGhpcyBzaG91bGQgYmUgdHJ1ZS4KICoKICogQHR5cGUge2Jvb2xlYW59CiAqIEBkZWZhdWx0CiAqLwpIdG1sNS5wcm90b3R5cGUubW92aW5nTWVkaWFFbGVtZW50SW5ET00gPSAhSVNfSU9TOwoKLy8gVE9ETzogUHJldmlvdXMgY29tbWVudDogTm8gbG9uZ2VyIGFwcGVhcnMgdG8gYmUgdXNlZC4gQ2FuIHByb2JhYmx5IGJlIHJlbW92ZWQuCi8vICAgICAgIElzIHRoaXMgdHJ1ZT8KLyoqCiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgSFRNTDVgIHRlY2ggY3VycmVudGx5IHN1cHBvcnRzIGF1dG9tYXRpYyBtZWRpYSByZXNpemUKICogd2hlbiBnb2luZyBpbnRvIGZ1bGxzY3JlZW4uCiAqCiAqIEB0eXBlIHtib29sZWFufQogKiBAZGVmYXVsdAogKi8KSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzRnVsbHNjcmVlblJlc2l6ZSA9IHRydWU7CgovKioKICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgdGhlIHByb2dyZXNzIGV2ZW50LgogKiBJZiB0aGlzIGlzIGZhbHNlLCBtYW51YWwgYHByb2dyZXNzYCBldmVudHMgd2lsbCBiZSB0cmlnZ3JlZCBpbnN0ZWFkLgogKgogKiBAdHlwZSB7Ym9vbGVhbn0KICogQGRlZmF1bHQKICovCkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc1Byb2dyZXNzRXZlbnRzID0gdHJ1ZTsKCi8qKgogKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYEhUTUw1YCB0ZWNoIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdGltZXVwZGF0ZSBldmVudC4KICogSWYgdGhpcyBpcyBmYWxzZSwgbWFudWFsIGB0aW1ldXBkYXRlYCBldmVudHMgd2lsbCBiZSB0cmlnZ3JlZCBpbnN0ZWFkLgogKgogKiBAZGVmYXVsdAogKi8KSHRtbDUucHJvdG90eXBlLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cyA9IHRydWU7CgovKioKICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgbmF0aXZlIGBUZXh0VHJhY2tgcy4KICoKICogQHR5cGUge2Jvb2xlYW59CiAqIEBkZWZhdWx0IHtAbGluayBIdG1sNS5zdXBwb3J0c05hdGl2ZVRleHRUcmFja3N9CiAqLwpIdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzID0gSHRtbDUuc3VwcG9ydHNOYXRpdmVUZXh0VHJhY2tzKCk7CgovKioKICogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGBIVE1MNWAgdGVjaCBjdXJyZW50bHkgc3VwcG9ydHMgbmF0aXZlIGBWaWRlb1RyYWNrYHMuCiAqCiAqIEB0eXBlIHtib29sZWFufQogKiBAZGVmYXVsdCB7QGxpbmsgSHRtbDUuc3VwcG9ydHNOYXRpdmVWaWRlb1RyYWNrc30KICovCkh0bWw1LnByb3RvdHlwZS5mZWF0dXJlc05hdGl2ZVZpZGVvVHJhY2tzID0gSHRtbDUuc3VwcG9ydHNOYXRpdmVWaWRlb1RyYWNrcygpOwoKLyoqCiAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgSFRNTDVgIHRlY2ggY3VycmVudGx5IHN1cHBvcnRzIG5hdGl2ZSBgQXVkaW9UcmFja2BzLgogKgogKiBAdHlwZSB7Ym9vbGVhbn0KICogQGRlZmF1bHQge0BsaW5rIEh0bWw1LnN1cHBvcnRzTmF0aXZlQXVkaW9UcmFja3N9CiAqLwpIdG1sNS5wcm90b3R5cGUuZmVhdHVyZXNOYXRpdmVBdWRpb1RyYWNrcyA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlQXVkaW9UcmFja3MoKTsKCi8vIEhUTUw1IEZlYXR1cmUgZGV0ZWN0aW9uIGFuZCBEZXZpY2UgRml4ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCnZhciBjYW5QbGF5VHlwZSA9IEh0bWw1LlRFU1RfVklEICYmIEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZTsKdmFyIG1wZWd1cmxSRSA9IC9eYXBwbGljYXRpb25cLyg/OngtfHZuZFwuYXBwbGVcLiltcGVndXJsL2k7CnZhciBtcDRSRSA9IC9edmlkZW9cL21wNC9pOwoKSHRtbDUucGF0Y2hDYW5QbGF5VHlwZSA9IGZ1bmN0aW9uICgpIHsKCiAgLy8gQW5kcm9pZCA0LjAgYW5kIGFib3ZlIGNhbiBwbGF5IEhMUyB0byBzb21lIGV4dGVudCBidXQgaXQgcmVwb3J0cyBiZWluZyB1bmFibGUgdG8gZG8gc28KICBpZiAoQU5EUk9JRF9WRVJTSU9OID49IDQuMCAmJiAhSVNfRklSRUZPWCkgewogICAgSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlID0gZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgJiYgbXBlZ3VybFJFLnRlc3QodHlwZSkpIHsKICAgICAgICByZXR1cm4gJ21heWJlJzsKICAgICAgfQogICAgICByZXR1cm4gY2FuUGxheVR5cGUuY2FsbCh0aGlzLCB0eXBlKTsKICAgIH07CgogICAgLy8gT3ZlcnJpZGUgQW5kcm9pZCAyLjIgYW5kIGxlc3MgY2FuUGxheVR5cGUgbWV0aG9kIHdoaWNoIGlzIGJyb2tlbgogIH0gZWxzZSBpZiAoSVNfT0xEX0FORFJPSUQpIHsKICAgIEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7CiAgICAgIGlmICh0eXBlICYmIG1wNFJFLnRlc3QodHlwZSkpIHsKICAgICAgICByZXR1cm4gJ21heWJlJzsKICAgICAgfQogICAgICByZXR1cm4gY2FuUGxheVR5cGUuY2FsbCh0aGlzLCB0eXBlKTsKICAgIH07CiAgfQp9OwoKSHRtbDUudW5wYXRjaENhblBsYXlUeXBlID0gZnVuY3Rpb24gKCkgewogIHZhciByID0gSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlOwoKICBIdG1sNS5URVNUX1ZJRC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBjYW5QbGF5VHlwZTsKICByZXR1cm4gcjsKfTsKCi8vIGJ5IGRlZmF1bHQsIHBhdGNoIHRoZSBtZWRpYSBlbGVtZW50Ckh0bWw1LnBhdGNoQ2FuUGxheVR5cGUoKTsKCkh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHsKICBpZiAoIWVsKSB7CiAgICByZXR1cm47CiAgfQoKICBpZiAoZWwucGFyZW50Tm9kZSkgewogICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7CiAgfQoKICAvLyByZW1vdmUgYW55IGNoaWxkIHRyYWNrIG9yIHNvdXJjZSBub2RlcyB0byBwcmV2ZW50IHRoZWlyIGxvYWRpbmcKICB3aGlsZSAoZWwuaGFzQ2hpbGROb2RlcygpKSB7CiAgICBlbC5yZW1vdmVDaGlsZChlbC5maXJzdENoaWxkKTsKICB9CgogIC8vIHJlbW92ZSBhbnkgc3JjIHJlZmVyZW5jZS4gbm90IHNldHRpbmcgYHNyYz0nJ2AgYmVjYXVzZSB0aGF0IGNhdXNlcyBhIHdhcm5pbmcKICAvLyBpbiBmaXJlZm94CiAgZWwucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKCiAgLy8gZm9yY2UgdGhlIG1lZGlhIGVsZW1lbnQgdG8gdXBkYXRlIGl0cyBsb2FkaW5nIHN0YXRlIGJ5IGNhbGxpbmcgbG9hZCgpCiAgLy8gaG93ZXZlciBJRSBvbiBXaW5kb3dzIDdOIGhhcyBhIGJ1ZyB0aGF0IHRocm93cyBhbiBlcnJvciBzbyBuZWVkIGEgdHJ5L2NhdGNoICgjNzkzKQogIGlmICh0eXBlb2YgZWwubG9hZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgLy8gd3JhcHBpbmcgaW4gYW4gaWlmZSBzbyBpdCdzIG5vdCBkZW9wdGltaXplZCAoIzEwNjAjZGlzY3Vzc2lvbl9yMTAzMjQ0NzMpCiAgICAoZnVuY3Rpb24gKCkgewogICAgICB0cnkgewogICAgICAgIGVsLmxvYWQoKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQKICAgICAgfQogICAgfSkoKTsKICB9Cn07CgpIdG1sNS5yZXNldE1lZGlhRWxlbWVudCA9IGZ1bmN0aW9uIChlbCkgewogIGlmICghZWwpIHsKICAgIHJldHVybjsKICB9CgogIHZhciBzb3VyY2VzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnc291cmNlJyk7CiAgdmFyIGkgPSBzb3VyY2VzLmxlbmd0aDsKCiAgd2hpbGUgKGktLSkgewogICAgZWwucmVtb3ZlQ2hpbGQoc291cmNlc1tpXSk7CiAgfQoKICAvLyByZW1vdmUgYW55IHNyYyByZWZlcmVuY2UuCiAgLy8gbm90IHNldHRpbmcgYHNyYz0nJ2AgYmVjYXVzZSB0aGF0IHRocm93cyBhbiBlcnJvcgogIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3JjJyk7CgogIGlmICh0eXBlb2YgZWwubG9hZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgLy8gd3JhcHBpbmcgaW4gYW4gaWlmZSBzbyBpdCdzIG5vdCBkZW9wdGltaXplZCAoIzEwNjAjZGlzY3Vzc2lvbl9yMTAzMjQ0NzMpCiAgICAoZnVuY3Rpb24gKCkgewogICAgICB0cnkgewogICAgICAgIGVsLmxvYWQoKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIHNhdGlzZnkgbGludGVyCiAgICAgIH0KICAgIH0pKCk7CiAgfQp9OwoKLyogTmF0aXZlIEhUTUw1IGVsZW1lbnQgcHJvcGVydHkgd3JhcHBpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLy8gV3JhcCBuYXRpdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdpdGggZ2V0dGVycyB0aGF0IGNoZWNrIGJvdGggcHJvcGVydHkgYW5kIGF0dHJpYnV0ZQovLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dlZDoKLy8gbXV0ZWQsIGRlZmF1bHRNdXRlZCwgYXV0b3BsYXksIGNvbnRyb2xzLCBsb29wLCBwbGF5c2lubGluZQpbCi8qKgogKiBHZXQgdGhlIHZhbHVlIG9mIGBtdXRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYG11dGVkYCBpbmRpY2F0ZXMKICogdGhhdCB0aGUgdm9sdW1lIGZvciB0aGUgbWVkaWEgc2hvdWxkIGJlIHNldCB0byBzaWxlbnQuIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgY2hhbmdlCiAqIHRoZSBgdm9sdW1lYCBhdHRyaWJ1dGUuCiAqCiAqIEBtZXRob2QgSHRtbDUjbXV0ZWQKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICAtIFRydWUgaWYgdGhlIHZhbHVlIG9mIGB2b2x1bWVgIHNob3VsZCBiZSBpZ25vcmVkIGFuZCB0aGUgYXVkaW8gc2V0IHRvIHNpbGVudC4KICogICAgICAgICAtIEZhbHNlIGlmIHRoZSB2YWx1ZSBvZiBgdm9sdW1lYCBzaG91bGQgYmUgdXNlZC4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1tdXRlZH0KICovCidtdXRlZCcsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgZGVmYXVsdE11dGVkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgZGVmYXVsdE11dGVkYCBpbmRpY2F0ZXMKICogd2hldGhlciB0aGUgbWVkaWEgc2hvdWxkIHN0YXJ0IG11dGVkIG9yIG5vdC4gT25seSBjaGFuZ2VzIHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZQogKiBtZWRpYS4gYG11dGVkYCBhbmQgYGRlZmF1bHRNdXRlZGAgY2FuIGhhdmUgZGlmZmVyZW50IHZhbHVlcy4ge0BsaW5rIEh0bWw1I211dGVkfSBpbmRpY2F0ZXMgdGhlCiAqIGN1cnJlbnQgc3RhdGUuCiAqCiAqIEBtZXRob2QgSHRtbDUjZGVmYXVsdE11dGVkCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgLSBUaGUgdmFsdWUgb2YgYGRlZmF1bHRNdXRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4KICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCBtdXRlZC4KICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgbm90IHN0YXJ0IG11dGVkCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtZGVmYXVsdG11dGVkfQogKi8KJ2RlZmF1bHRNdXRlZCcsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgYXV0b3BsYXlgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBhdXRvcGxheWAgaW5kaWNhdGVzCiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCB0byBwbGF5IGFzIHNvb24gYXMgdGhlIHBhZ2UgaXMgcmVhZHkuCiAqCiAqIEBtZXRob2QgSHRtbDUjYXV0b3BsYXkKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgYXV0b3BsYXlgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuCiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgc3RhcnQgYXMgc29vbiBhcyB0aGUgcGFnZSBsb2Fkcy4KICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgbm90IHN0YXJ0IGFzIHNvb24gYXMgdGhlIHBhZ2UgbG9hZHMuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLWF1dG9wbGF5fQogKi8KJ2F1dG9wbGF5JywKCi8qKgogKiBHZXQgdGhlIHZhbHVlIG9mIGBjb250cm9sc2AgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGNvbnRyb2xzYCBpbmRpY2F0ZXMKICogd2hldGhlciB0aGUgbmF0aXZlIG1lZGlhIGNvbnRyb2xzIHNob3VsZCBiZSBzaG93biBvciBoaWRkZW4uCiAqCiAqIEBtZXRob2QgSHRtbDUjY29udHJvbHMKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgY29udHJvbHNgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuCiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IG5hdGl2ZSBjb250cm9scyBzaG91bGQgYmUgc2hvd2luZy4KICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IG5hdGl2ZSBjb250cm9scyBzaG91bGQgYmUgaGlkZGVuLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjYXR0ci1tZWRpYS1jb250cm9sc30KICovCidjb250cm9scycsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgbG9vcGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGxvb3BgIGluZGljYXRlcwogKiB0aGF0IHRoZSBtZWRpYSBzaG91bGQgcmV0dXJuIHRvIHRoZSBzdGFydCBvZiB0aGUgbWVkaWEgYW5kIGNvbnRpbnVlIHBsYXlpbmcgb25jZQogKiBpdCByZWFjaGVzIHRoZSBlbmQuCiAqCiAqIEBtZXRob2QgSHRtbDUjbG9vcAogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBsb29wYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LgogKiAgICAgICAgIC0gVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBwbGF5YmFjayBzaG91bGQgc2VlayBiYWNrIHRvIHN0YXJ0IG9uY2UKICogICAgICAgICAgIHRoZSBlbmQgb2YgYSBtZWRpYSBpcyByZWFjaGVkLgogKiAgICAgICAgIC0gRmFsc2UgaW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgc2hvdWxkIG5vdCBsb29wIGJhY2sgdG8gdGhlIHN0YXJ0IHdoZW4gdGhlCiAqICAgICAgICAgICBlbmQgb2YgdGhlIG1lZGlhIGlzIHJlYWNoZWQuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLW1lZGlhLWxvb3B9CiAqLwonbG9vcCcsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgcGxheXNpbmxpbmVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5c2lubGluZWAgaW5kaWNhdGVzCiAqIHRvIHRoZSBicm93c2VyIHRoYXQgbm9uLWZ1bGxzY3JlZW4gcGxheWJhY2sgaXMgcHJlZmVycmVkIHdoZW4gZnVsbHNjcmVlbgogKiBwbGF5YmFjayBpcyB0aGUgbmF0aXZlIGRlZmF1bHQsIHN1Y2ggYXMgaW4gaU9TIFNhZmFyaS4KICoKICogQG1ldGhvZCBIdG1sNSNwbGF5c2lubGluZQogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBwbGF5c2lubGluZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4KICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBwbGF5IGlubGluZS4KICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgbm90IHBsYXkgaW5saW5lLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyLXZpZGVvLXBsYXlzaW5saW5lfQogKi8KJ3BsYXlzaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgewogIEh0bWw1LnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzLmVsX1twcm9wXSB8fCB0aGlzLmVsXy5oYXNBdHRyaWJ1dGUocHJvcCk7CiAgfTsKfSk7CgovLyBXcmFwIG5hdGl2ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2l0aCBzZXR0ZXJzIHRoYXQgc2V0IGJvdGggcHJvcGVydHkgYW5kIGF0dHJpYnV0ZQovLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dlZDoKLy8gc2V0TXV0ZWQsIHNldERlZmF1bHRNdXRlZCwgc2V0QXV0b3BsYXksIHNldExvb3AsIHNldFBsYXlzaW5saW5lCi8vIHNldENvbnRyb2xzIGlzIHNwZWNpYWwtY2FzZWQgYWJvdmUKWwovKioKICogU2V0IHRoZSB2YWx1ZSBvZiBgbXV0ZWRgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgbXV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50CiAqIGF1ZGlvIGxldmVsIHNob3VsZCBiZSBzaWxlbnQuCiAqCiAqIEBtZXRob2QgSHRtbDUjc2V0TXV0ZWQKICogQHBhcmFtIHtib29sZWFufSBtdXRlZAogKiAgICAgICAgLSBUcnVlIGlmIHRoZSBhdWRpbyBzaG91bGQgYmUgc2V0IHRvIHNpbGVudAogKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UKICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1tdXRlZH0KICovCidtdXRlZCcsCgovKioKICogU2V0IHRoZSB2YWx1ZSBvZiBgZGVmYXVsdE11dGVkYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYGRlZmF1bHRNdXRlZGAgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQKICogYXVkaW8gbGV2ZWwgc2hvdWxkIGJlIHNpbGVudCwgYnV0IHdpbGwgb25seSBlZmZlY3QgdGhlIG11dGVkIGxldmVsIG9uIGludGlhbCBwbGF5YmFjay4uCiAqCiAqIEBtZXRob2QgSHRtbDUucHJvdG90eXBlLnNldERlZmF1bHRNdXRlZAogKiBAcGFyYW0ge2Jvb2xlYW59IGRlZmF1bHRNdXRlZAogKiAgICAgICAgLSBUcnVlIGlmIHRoZSBhdWRpbyBzaG91bGQgYmUgc2V0IHRvIHNpbGVudAogKiAgICAgICAgLSBGYWxzZSBvdGhlcndpc2UKICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1kZWZhdWx0bXV0ZWR9CiAqLwonZGVmYXVsdE11dGVkJywKCi8qKgogKiBTZXQgdGhlIHZhbHVlIG9mIGBhdXRvcGxheWAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBhdXRvcGxheWAgaW5kaWNhdGVzCiAqIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBzdGFydCB0byBwbGF5IGFzIHNvb24gYXMgdGhlIHBhZ2UgaXMgcmVhZHkuCiAqCiAqIEBtZXRob2QgSHRtbDUjc2V0QXV0b3BsYXkKICogQHBhcmFtIHtib29sZWFufSBhdXRvcGxheQogKiAgICAgICAgIC0gVHJ1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2hvdWxkIHN0YXJ0IGFzIHNvb24gYXMgdGhlIHBhZ2UgbG9hZHMuCiAqICAgICAgICAgLSBGYWxzZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2hvdWxkIG5vdCBzdGFydCBhcyBzb29uIGFzIHRoZSBwYWdlIGxvYWRzLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjYXR0ci1tZWRpYS1hdXRvcGxheX0KICovCidhdXRvcGxheScsCgovKioKICogU2V0IHRoZSB2YWx1ZSBvZiBgbG9vcGAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBsb29wYCBpbmRpY2F0ZXMKICogdGhhdCB0aGUgbWVkaWEgc2hvdWxkIHJldHVybiB0byB0aGUgc3RhcnQgb2YgdGhlIG1lZGlhIGFuZCBjb250aW51ZSBwbGF5aW5nIG9uY2UKICogaXQgcmVhY2hlcyB0aGUgZW5kLgogKgogKiBAbWV0aG9kIEh0bWw1I3NldExvb3AKICogQHBhcmFtIHtib29sZWFufSBsb29wCiAqICAgICAgICAgLSBUcnVlIGluZGljYXRlcyB0aGF0IHBsYXliYWNrIHNob3VsZCBzZWVrIGJhY2sgdG8gc3RhcnQgb25jZQogKiAgICAgICAgICAgdGhlIGVuZCBvZiBhIG1lZGlhIGlzIHJlYWNoZWQuCiAqICAgICAgICAgLSBGYWxzZSBpbmRpY2F0ZXMgdGhhdCBwbGF5YmFjayBzaG91bGQgbm90IGxvb3AgYmFjayB0byB0aGUgc3RhcnQgd2hlbiB0aGUKICogICAgICAgICAgIGVuZCBvZiB0aGUgbWVkaWEgaXMgcmVhY2hlZC4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtbG9vcH0KICovCidsb29wJywKCi8qKgogKiBTZXQgdGhlIHZhbHVlIG9mIGBwbGF5c2lubGluZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHBsYXlzaW5saW5lYCBpbmRpY2F0ZXMKICogdG8gdGhlIGJyb3dzZXIgdGhhdCBub24tZnVsbHNjcmVlbiBwbGF5YmFjayBpcyBwcmVmZXJyZWQgd2hlbiBmdWxsc2NyZWVuCiAqIHBsYXliYWNrIGlzIHRoZSBuYXRpdmUgZGVmYXVsdCwgc3VjaCBhcyBpbiBpT1MgU2FmYXJpLgogKgogKiBAbWV0aG9kIEh0bWw1I3NldFBsYXlzaW5saW5lCiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGxheXNpbmxpbmUKICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNob3VsZCBwbGF5IGlubGluZS4KICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzaG91bGQgbm90IHBsYXkgaW5saW5lLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyLXZpZGVvLXBsYXlzaW5saW5lfQogKi8KJ3BsYXlzaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgewogIEh0bWw1LnByb3RvdHlwZVsnc2V0JyArIHRvVGl0bGVDYXNlKHByb3ApXSA9IGZ1bmN0aW9uICh2KSB7CiAgICB0aGlzLmVsX1twcm9wXSA9IHY7CgogICAgaWYgKHYpIHsKICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKHByb3AsIHByb3ApOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5lbF8ucmVtb3ZlQXR0cmlidXRlKHByb3ApOwogICAgfQogIH07Cn0pOwoKLy8gV3JhcCBuYXRpdmUgcHJvcGVydGllcyB3aXRoIGEgZ2V0dGVyCi8vIFRoZSBsaXN0IGlzIGFzIGZvbGxvd2VkCi8vIHBhdXNlZCwgY3VycmVudFRpbWUsIGJ1ZmZlcmVkLCB2b2x1bWUsIHBvc3RlciwgcHJlbG9hZCwgZXJyb3IsIHNlZWtpbmcKLy8gc2Vla2FibGUsIGVuZGVkLCBwbGF5YmFja1JhdGUsIGRlZmF1bHRQbGF5YmFja1JhdGUsIHBsYXllZCwgbmV0d29ya1N0YXRlCi8vIHJlYWR5U3RhdGUsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0ClsKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHBhdXNlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHBhdXNlZGAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lZGlhIGVsZW1lbnQKICogaXMgY3VycmVudGx5IHBhdXNlZCBvciBub3QuCiAqCiAqIEBtZXRob2QgSHRtbDUjcGF1c2VkCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwYXVzZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGF1c2VkfQogKi8KJ3BhdXNlZCcsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgY3VycmVudFRpbWVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBjdXJyZW50VGltZWAgaW5kaWNhdGVzCiAqIHRoZSBjdXJyZW50IHNlY29uZCB0aGF0IHRoZSBtZWRpYSBpcyBhdCBpbiBwbGF5YmFjay4KICoKICogQG1ldGhvZCBIdG1sNSNjdXJyZW50VGltZQogKiBAcmV0dXJuIHtudW1iZXJ9CiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBjdXJyZW50VGltZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1jdXJyZW50dGltZX0KICovCidjdXJyZW50VGltZScsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgYnVmZmVyZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBidWZmZXJlZGAgaXMgYSBgVGltZVJhbmdlYAogKiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwYXJ0cyBvZiB0aGUgbWVkaWEgdGhhdCBhcmUgYWxyZWFkeSBkb3dubG9hZGVkIGFuZAogKiBhdmFpbGFibGUgZm9yIHBsYXliYWNrLgogKgogKiBAbWV0aG9kIEh0bWw1I2J1ZmZlcmVkCiAqIEByZXR1cm4ge1RpbWVSYW5nZX0KICogICAgICAgICBUaGUgdmFsdWUgb2YgYGJ1ZmZlcmVkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWJ1ZmZlcmVkfQogKi8KJ2J1ZmZlcmVkJywKCi8qKgogKiBHZXQgdGhlIHZhbHVlIG9mIGB2b2x1bWVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGB2b2x1bWVgIGluZGljYXRlcwogKiB0aGUgY3VycmVudCBwbGF5YmFjayB2b2x1bWUgb2YgYXVkaW8gZm9yIGEgbWVkaWEuIGB2b2x1bWVgIHdpbGwgYmUgYSB2YWx1ZSBmcm9tIDAKICogKHNpbGVudCkgdG8gMSAobG91ZGVzdCBhbmQgZGVmYXVsdCkuCiAqCiAqIEBtZXRob2QgSHRtbDUjdm9sdW1lCiAqIEByZXR1cm4ge251bWJlcn0KICogICAgICAgICBUaGUgdmFsdWUgb2YgYHZvbHVtZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gVmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAtMS4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1hLXZvbHVtZX0KICovCid2b2x1bWUnLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHBvc3RlcmAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHBvc3RlcmAgaW5kaWNhdGVzCiAqIHRoYXQgdGhlIHVybCBvZiBhbiBpbWFnZSBmaWxlIHRoYXQgY2FuL3dpbGwgYmUgc2hvd24gd2hlbiBubyBtZWRpYSBkYXRhIGlzIGF2YWlsYWJsZS4KICoKICogQG1ldGhvZCBIdG1sNSNwb3N0ZXIKICogQHJldHVybiB7c3RyaW5nfQogKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgcG9zdGVyYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBWYWx1ZSB3aWxsIGJlIGEgdXJsIHRvIGFuCiAqICAgICAgICAgaW1hZ2UuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNhdHRyLXZpZGVvLXBvc3Rlcn0KICovCidwb3N0ZXInLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHByZWxvYWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwcmVsb2FkYCBpbmRpY2F0ZXMKICogd2hhdCBzaG91bGQgZG93bmxvYWQgYmVmb3JlIHRoZSBtZWRpYSBpcyBpbnRlcmFjdGVkIHdpdGguIEl0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcKICogdmFsdWVzOgogKiAtIG5vbmU6IG5vdGhpbmcgc2hvdWxkIGJlIGRvd25sb2FkZWQKICogLSBtZXRhZGF0YTogcG9zdGVyIGFuZCB0aGUgZmlyc3QgZmV3IGZyYW1lcyBvZiB0aGUgbWVkaWEgbWF5IGJlIGRvd25sb2FkZWQgdG8gZ2V0CiAqICAgbWVkaWEgZGltZW5zaW9ucyBhbmQgb3RoZXIgbWV0YWRhdGEKICogLSBhdXRvOiBhbGxvdyB0aGUgbWVkaWEgYW5kIG1ldGFkYXRhIGZvciB0aGUgbWVkaWEgdG8gYmUgZG93bmxvYWRlZCBiZWZvcmUKICogICAgaW50ZXJhY3Rpb24KICoKICogQG1ldGhvZCBIdG1sNSNwcmVsb2FkCiAqIEByZXR1cm4ge3N0cmluZ30KICogICAgICAgICBUaGUgdmFsdWUgb2YgYHByZWxvYWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIFdpbGwgYmUgJ25vbmUnLCAnbWV0YWRhdGEnLAogKiAgICAgICAgIG9yICdhdXRvJy4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcHJlbG9hZH0KICovCidwcmVsb2FkJywKCi8qKgogKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBgZXJyb3JgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBlcnJvcmAgaW5kaWNhdGVzIGFueQogKiBNZWRpYUVycm9yIHRoYXQgbWF5IGhhdmUgb2NjdXJlZCBkdXJpbmcgcGxheWJhY2suIElmIGVycm9yIHJldHVybnMgbnVsbCB0aGVyZSBpcyBubwogKiBjdXJyZW50IGVycm9yLgogKgogKiBAbWV0aG9kIEh0bWw1I2Vycm9yCiAqIEByZXR1cm4ge01lZGlhRXJyb3J8bnVsbH0KICogICAgICAgICBUaGUgdmFsdWUgb2YgYGVycm9yYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBXaWxsIGJlIGBNZWRpYUVycm9yYCBpZiB0aGVyZQogKiAgICAgICAgIGlzIGEgY3VycmVudCBlcnJvciBhbmQgbnVsbCBvdGhlcndpc2UuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtZXJyb3J9CiAqLwonZXJyb3InLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHNlZWtpbmdgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBzZWVraW5nYCBpbmRpY2F0ZXMgd2hldGhlciB0aGUKICogbWVkaWEgaXMgY3VycmVudGx5IHNlZWtpbmcgdG8gYSBuZXcgcG9zaXRpb24gb3Igbm90LgogKgogKiBAbWV0aG9kIEh0bWw1I3NlZWtpbmcKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICAtIFRoZSB2YWx1ZSBvZiBgc2Vla2luZ2AgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4KICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGlzIGN1cnJlbnRseSBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgogKiAgICAgICAgIC0gRmxhc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGlzIG5vdCBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uIGF0IHRoaXMgdGltZS4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS1zZWVraW5nfQogKi8KJ3NlZWtpbmcnLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHNlZWthYmxlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgc2Vla2FibGVgIHJldHVybnMgYQogKiBgVGltZVJhbmdlYCBvYmplY3QgaW5kaWNhdGluZyByYW5nZXMgb2YgdGltZSB0aGF0IGNhbiBjdXJyZW50bHkgYmUgYHNlZWtlZGAgdG8uCiAqCiAqIEBtZXRob2QgSHRtbDUjc2Vla2FibGUKICogQHJldHVybiB7VGltZVJhbmdlfQogKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgc2Vla2FibGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgYFRpbWVSYW5nZWAgb2JqZWN0CiAqICAgICAgICAgaW5kaWNhdGluZyB0aGUgY3VycmVudCByYW5nZXMgb2YgdGltZSB0aGF0IGNhbiBiZSBzZWVrZWQgdG8uCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtc2Vla2FibGV9CiAqLwonc2Vla2FibGUnLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYGVuZGVkYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBgZW5kZWRgIGluZGljYXRlcyB3aGV0aGVyCiAqIHRoZSBtZWRpYSBoYXMgcmVhY2hlZCB0aGUgZW5kIG9yIG5vdC4KICoKICogQG1ldGhvZCBIdG1sNSNlbmRlZAogKiBAcmV0dXJuIHtib29sZWFufQogKiAgICAgICAgIC0gVGhlIHZhbHVlIG9mIGBlbmRlZGAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4KICogICAgICAgICAtIFRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGhhcyBlbmRlZC4KICogICAgICAgICAtIEZhbHNlIGluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBoYXMgbm90IGVuZGVkLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLWVuZGVkfQogKi8KJ2VuZGVkJywKCi8qKgogKiBHZXQgdGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5YmFja1JhdGVgIGluZGljYXRlcwogKiB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbWVkaWEgaXMgY3VycmVudGx5IHBsYXlpbmcgYmFjay4gRXhhbXBsZXM6CiAqICAgLSBpZiBwbGF5YmFja1JhdGUgaXMgc2V0IHRvIDIsIG1lZGlhIHdpbGwgcGxheSB0d2ljZSBhcyBmYXN0LgogKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAwLjUsIG1lZGlhIHdpbGwgcGxheSBoYWxmIGFzIGZhc3QuCiAqCiAqIEBtZXRob2QgSHRtbDUjcGxheWJhY2tSYXRlCiAqIEByZXR1cm4ge251bWJlcn0KICogICAgICAgICBUaGUgdmFsdWUgb2YgYHBsYXliYWNrUmF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gQSBudW1iZXIgaW5kaWNhdGluZwogKiAgICAgICAgIHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9mIHRoZSBtZWRpYSwgd2hlcmUgMSBpcyBub3JtYWwgc3BlZWQuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGxheWJhY2tyYXRlfQogKi8KJ3BsYXliYWNrUmF0ZScsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYGRlZmF1bHRQbGF5YmFja1JhdGVgIGluZGljYXRlcwogKiB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbWVkaWEgaXMgY3VycmVudGx5IHBsYXlpbmcgYmFjay4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBpbmRpY2F0ZSB0aGUgY3VycmVudAogKiBgcGxheWJhY2tSYXRlYCBhZnRlciBwbGF5YmFjayBoYXMgc3RhcnRlZCwgdXNlIHtAbGluayBIdG1sNSNwbGF5YmFja1JhdGV9IGZvciB0aGF0LgogKgogKiBFeGFtcGxlczoKICogICAtIGlmIGRlZmF1bHRQbGF5YmFja1JhdGUgaXMgc2V0IHRvIDIsIG1lZGlhIHdpbGwgcGxheSB0d2ljZSBhcyBmYXN0LgogKiAgIC0gaWYgZGVmYXVsdFBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMC41LCBtZWRpYSB3aWxsIHBsYXkgaGFsZiBhcyBmYXN0LgogKgogKiBAbWV0aG9kIEh0bWw1LnByb3RvdHlwZS5kZWZhdWx0UGxheWJhY2tSYXRlCiAqIEByZXR1cm4ge251bWJlcn0KICogICAgICAgICBUaGUgdmFsdWUgb2YgYGRlZmF1bHRQbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgbnVtYmVyIGluZGljYXRpbmcKICogICAgICAgICB0aGUgY3VycmVudCBwbGF5YmFjayBzcGVlZCBvZiB0aGUgbWVkaWEsIHdoZXJlIDEgaXMgbm9ybWFsIHNwZWVkLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZX0KICovCidkZWZhdWx0UGxheWJhY2tSYXRlJywKCi8qKgogKiBHZXQgdGhlIHZhbHVlIG9mIGBwbGF5ZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIGBwbGF5ZWRgIHJldHVybnMgYSBgVGltZVJhbmdlYAogKiBvYmplY3QgcmVwcmVzZW50aW5nIHBvaW50cyBpbiB0aGUgbWVkaWEgdGltZWxpbmUgdGhhdCBoYXZlIGJlZW4gcGxheWVkLgogKgogKiBAbWV0aG9kIEh0bWw1I3BsYXllZAogKiBAcmV0dXJuIHtUaW1lUmFuZ2V9CiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwbGF5ZWRgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgYFRpbWVSYW5nZWAgb2JqZWN0IGluZGljYXRpbmcKICogICAgICAgICB0aGUgcmFuZ2VzIG9mIHRpbWUgdGhhdCBoYXZlIGJlZW4gcGxheWVkLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBsYXllZH0KICovCidwbGF5ZWQnLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYG5ldHdvcmtTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYG5ldHdvcmtTdGF0ZWAgaW5kaWNhdGVzCiAqIHRoZSBjdXJyZW50IG5ldHdvcmsgc3RhdGUuIEl0IHJldHVybnMgYW4gZW51bWVyYXRpb24gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CiAqIC0gMDogTkVUV09SS19FTVBUWQogKiAtIDE6IE5FV09SS19JRExFCiAqIC0gMjogTkVUV09SS19MT0FESU5HCiAqIC0gMzogTkVUV09SS19OT19TT1VSQ0UKICoKICogQG1ldGhvZCBIdG1sNSNuZXR3b3JrU3RhdGUKICogQHJldHVybiB7bnVtYmVyfQogKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgbmV0d29ya1N0YXRlYCBmcm9tIHRoZSBtZWRpYSBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXIKICogICAgICAgICBmcm9tIHRoZSBsaXN0IGluIHRoZSBkZXNjcmlwdGlvbi4KICoKICogQHNlZSBbU3BlY10ge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtbmV0d29ya3N0YXRlfQogKi8KJ25ldHdvcmtTdGF0ZScsCgovKioKICogR2V0IHRoZSB2YWx1ZSBvZiBgcmVhZHlTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gYHJlYWR5U3RhdGVgIGluZGljYXRlcwogKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWVkaWEgZWxlbWVudC4gSXQgcmV0dXJucyBhbiBlbnVtZXJhdGlvbiBmcm9tIHRoZQogKiBmb2xsb3dpbmcgbGlzdDoKICogLSAwOiBIQVZFX05PVEhJTkcKICogLSAxOiBIQVZFX01FVEFEQVRBCiAqIC0gMjogSEFWRV9DVVJSRU5UX0RBVEEKICogLSAzOiBIQVZFX0ZVVFVSRV9EQVRBCiAqIC0gNDogSEFWRV9FTk9VR0hfREFUQQogKgogKiBAbWV0aG9kIEh0bWw1I3JlYWR5U3RhdGUKICogQHJldHVybiB7bnVtYmVyfQogKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgcmVhZHlTdGF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gVGhpcyB3aWxsIGJlIGEgbnVtYmVyCiAqICAgICAgICAgZnJvbSB0aGUgbGlzdCBpbiB0aGUgZGVzY3JpcHRpb24uCiAqCiAqIEBzZWUgW1NwZWNdIHtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjcmVhZHktc3RhdGVzfQogKi8KJ3JlYWR5U3RhdGUnLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHZpZGVvV2lkdGhgIGZyb20gdGhlIHZpZGVvIGVsZW1lbnQuIGB2aWRlb1dpZHRoYCBpbmRpY2F0ZXMKICogdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIHZpZGVvIGluIGNzcyBwaXhlbHMuCiAqCiAqIEBtZXRob2QgSHRtbDUjdmlkZW9XaWR0aAogKiBAcmV0dXJuIHtudW1iZXJ9CiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGB2aWRlb1dpZHRoYCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBUaGlzIHdpbGwgYmUgYSBudW1iZXIKICogICAgICAgICBpbiBjc3MgcGl4ZWxzLgogKgogKiBAc2VlIFtTcGVjXSB7QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS12aWRlby12aWRlb3dpZHRofQogKi8KJ3ZpZGVvV2lkdGgnLAoKLyoqCiAqIEdldCB0aGUgdmFsdWUgb2YgYHZpZGVvSGVpZ2h0YCBmcm9tIHRoZSB2aWRlbyBlbGVtZW50LiBgdmlkZW9IZWlndGhgIGluZGljYXRlcwogKiB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIHZpZGVvIGluIGNzcyBwaXhlbHMuCiAqCiAqIEBtZXRob2QgSHRtbDUjdmlkZW9IZWlnaHQKICogQHJldHVybiB7bnVtYmVyfQogKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgdmlkZW9IZWlnaHRgIGZyb20gdGhlIHZpZGVvIGVsZW1lbnQuIFRoaXMgd2lsbCBiZSBhIG51bWJlcgogKiAgICAgICAgIGluIGNzcyBwaXhlbHMuCiAqCiAqIEBzZWUgW1NwZWNdIHtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLXZpZGVvLXZpZGVvd2lkdGh9CiAqLwondmlkZW9IZWlnaHQnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7CiAgSHRtbDUucHJvdG90eXBlW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXMuZWxfW3Byb3BdOwogIH07Cn0pOwoKLy8gV3JhcCBuYXRpdmUgcHJvcGVydGllcyB3aXRoIGEgc2V0dGVyIGluIHRoaXMgZm9ybWF0OgovLyBzZXQgKyB0b1RpdGxlQ2FzZShuYW1lKQovLyBUaGUgbGlzdCBpcyBhcyBmb2xsb3dzOgovLyBzZXRWb2x1bWUsIHNldFNyYywgc2V0UG9zdGVyLCBzZXRQcmVsb2FkLCBzZXRQbGF5YmFja1JhdGUsIHNldERlZmF1bHRQbGF5YmFja1JhdGUKWwovKioKICogU2V0IHRoZSB2YWx1ZSBvZiBgdm9sdW1lYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYHZvbHVtZWAgaW5kaWNhdGVzIHRoZSBjdXJyZW50CiAqIGF1ZGlvIGxldmVsIGFzIGEgcGVyY2VudGFnZSBpbiBkZWNpbWFsIGZvcm0uIFRoaXMgbWVhbnMgdGhhdCAxIGlzIDEwMCUsIDAuNSBpcyA1MCUsIGFuZAogKiBzbyBvbi4KICoKICogQG1ldGhvZCBIdG1sNSNzZXRWb2x1bWUKICogQHBhcmFtIHtudW1iZXJ9IHBlcmNlbnRBc0RlY2ltYWwKICogICAgICAgIFRoZSB2b2x1bWUgcGVyY2VudCBhcyBhIGRlY2ltYWwuIFZhbGlkIHJhbmdlIGlzIGZyb20gMC0xLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLWEtdm9sdW1lfQogKi8KJ3ZvbHVtZScsCgovKioKICogU2V0IHRoZSB2YWx1ZSBvZiBgc3JjYCBvbiB0aGUgbWVkaWEgZWxlbWVudC4gYHNyY2AgaW5kaWNhdGVzIHRoZSBjdXJyZW50CiAqIHtAbGluayBUZWNoflNvdXJjZU9iamVjdH0gZm9yIHRoZSBtZWRpYS4KICoKICogQG1ldGhvZCBIdG1sNSNzZXRTcmMKICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc3JjCiAqICAgICAgICBUaGUgc291cmNlIG9iamVjdCB0byBzZXQgYXMgdGhlIGN1cnJlbnQgc291cmNlLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXNyY30KICovCidzcmMnLAoKLyoqCiAqIFNldCB0aGUgdmFsdWUgb2YgYHBvc3RlcmAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBwb3N0ZXJgIGlzIHRoZSB1cmwgdG8KICogYW4gaW1hZ2UgZmlsZSB0aGF0IGNhbi93aWxsIGJlIHNob3duIHdoZW4gbm8gbWVkaWEgZGF0YSBpcyBhdmFpbGFibGUuCiAqCiAqIEBtZXRob2QgSHRtbDUjc2V0UG9zdGVyCiAqIEBwYXJhbSB7c3RyaW5nfSBwb3N0ZXIKICogICAgICAgIFRoZSB1cmwgdG8gYW4gaW1hZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYHBvc3RlcmAgZm9yIHRoZSBtZWRpYQogKiAgICAgICAgZWxlbWVudC4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcG9zdGVyfQogKi8KJ3Bvc3RlcicsCgovKioKICogU2V0IHRoZSB2YWx1ZSBvZiBgcHJlbG9hZGAgb24gdGhlIG1lZGlhIGVsZW1lbnQuIGBwcmVsb2FkYCBpbmRpY2F0ZXMKICogd2hhdCBzaG91bGQgZG93bmxvYWQgYmVmb3JlIHRoZSBtZWRpYSBpcyBpbnRlcmFjdGVkIHdpdGguIEl0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcKICogdmFsdWVzOgogKiAtIG5vbmU6IG5vdGhpbmcgc2hvdWxkIGJlIGRvd25sb2FkZWQKICogLSBtZXRhZGF0YTogcG9zdGVyIGFuZCB0aGUgZmlyc3QgZmV3IGZyYW1lcyBvZiB0aGUgbWVkaWEgbWF5IGJlIGRvd25sb2FkZWQgdG8gZ2V0CiAqICAgbWVkaWEgZGltZW5zaW9ucyBhbmQgb3RoZXIgbWV0YWRhdGEKICogLSBhdXRvOiBhbGxvdyB0aGUgbWVkaWEgYW5kIG1ldGFkYXRhIGZvciB0aGUgbWVkaWEgdG8gYmUgZG93bmxvYWRlZCBiZWZvcmUKICogICAgaW50ZXJhY3Rpb24KICoKICogQG1ldGhvZCBIdG1sNSNzZXRQcmVsb2FkCiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVsb2FkCiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwcmVsb2FkYCB0byBzZXQgb24gdGhlIG1lZGlhIGVsZW1lbnQuIE11c3QgYmUgJ25vbmUnLCAnbWV0YWRhdGEnLAogKiAgICAgICAgIG9yICdhdXRvJy4KICoKICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2F0dHItbWVkaWEtcHJlbG9hZH0KICovCidwcmVsb2FkJywKCi8qKgogKiBTZXQgdGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgcGxheWJhY2tSYXRlYCBpbmRpY2F0ZXMKICogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIHNob3VsZCBwbGF5IGJhY2suIEV4YW1wbGVzOgogKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAyLCBtZWRpYSB3aWxsIHBsYXkgdHdpY2UgYXMgZmFzdC4KICogICAtIGlmIHBsYXliYWNrUmF0ZSBpcyBzZXQgdG8gMC41LCBtZWRpYSB3aWxsIHBsYXkgaGFsZiBhcyBmYXN0LgogKgogKiBAbWV0aG9kIEh0bWw1I3NldFBsYXliYWNrUmF0ZQogKiBAcmV0dXJuIHtudW1iZXJ9CiAqICAgICAgICAgVGhlIHZhbHVlIG9mIGBwbGF5YmFja1JhdGVgIGZyb20gdGhlIG1lZGlhIGVsZW1lbnQuIEEgbnVtYmVyIGluZGljYXRpbmcKICogICAgICAgICB0aGUgY3VycmVudCBwbGF5YmFjayBzcGVlZCBvZiB0aGUgbWVkaWEsIHdoZXJlIDEgaXMgbm9ybWFsIHNwZWVkLgogKgogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZX0KICovCidwbGF5YmFja1JhdGUnLAoKLyoqCiAqIFNldCB0aGUgdmFsdWUgb2YgYGRlZmF1bHRQbGF5YmFja1JhdGVgIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgaW5kaWNhdGVzCiAqIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBtZWRpYSBzaG91bGQgcGxheSBiYWNrIHVwb24gaW5pdGlhbCBzdGFydHVwLiBDaGFuZ2luZyB0aGlzIHZhbHVlCiAqIGFmdGVyIGEgdmlkZW8gaGFzIHN0YXJ0ZWQgd2lsbCBkbyBub3RoaW5nLiBJbnN0ZWFkIHlvdSBzaG91bGQgdXNlZCB7QGxpbmsgSHRtbDUjc2V0UGxheWJhY2tSYXRlfS4KICoKICogRXhhbXBsZSBWYWx1ZXM6CiAqICAgLSBpZiBwbGF5YmFja1JhdGUgaXMgc2V0IHRvIDIsIG1lZGlhIHdpbGwgcGxheSB0d2ljZSBhcyBmYXN0LgogKiAgIC0gaWYgcGxheWJhY2tSYXRlIGlzIHNldCB0byAwLjUsIG1lZGlhIHdpbGwgcGxheSBoYWxmIGFzIGZhc3QuCiAqCiAqIEBtZXRob2QgSHRtbDUucHJvdG90eXBlLnNldERlZmF1bHRQbGF5YmFja1JhdGUKICogQHJldHVybiB7bnVtYmVyfQogKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBgZGVmYXVsdFBsYXliYWNrUmF0ZWAgZnJvbSB0aGUgbWVkaWEgZWxlbWVudC4gQSBudW1iZXIgaW5kaWNhdGluZwogKiAgICAgICAgIHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIG9mIHRoZSBtZWRpYSwgd2hlcmUgMSBpcyBub3JtYWwgc3BlZWQuCiAqCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtZGVmYXVsdHBsYXliYWNrcmF0ZX0KICovCidkZWZhdWx0UGxheWJhY2tSYXRlJ10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgewogIEh0bWw1LnByb3RvdHlwZVsnc2V0JyArIHRvVGl0bGVDYXNlKHByb3ApXSA9IGZ1bmN0aW9uICh2KSB7CiAgICB0aGlzLmVsX1twcm9wXSA9IHY7CiAgfTsKfSk7CgovLyB3cmFwIG5hdGl2ZSBmdW5jdGlvbnMgd2l0aCBhIGZ1bmN0aW9uCi8vIFRoZSBsaXN0IGlzIGFzIGZvbGxvd3M6Ci8vIHBhdXNlLCBsb2FkIHBsYXkKWwovKioKICogQSB3cmFwcGVyIGFyb3VuZCB0aGUgbWVkaWEgZWxlbWVudHMgYHBhdXNlYCBmdW5jdGlvbi4gVGhpcyB3aWxsIGNhbGwgdGhlIGBIVE1MNWAKICogbWVkaWEgZWxlbWVudHMgYHBhdXNlYCBmdW5jdGlvbi4KICoKICogQG1ldGhvZCBIdG1sNSNwYXVzZQogKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjZG9tLW1lZGlhLXBhdXNlfQogKi8KJ3BhdXNlJywKCi8qKgogKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBtZWRpYSBlbGVtZW50cyBgbG9hZGAgZnVuY3Rpb24uIFRoaXMgd2lsbCBjYWxsIHRoZSBgSFRNTDVgcwogKiBtZWRpYSBlbGVtZW50IGBsb2FkYCBmdW5jdGlvbi4KICoKICogQG1ldGhvZCBIdG1sNSNsb2FkCiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtbG9hZH0KICovCidsb2FkJywKCi8qKgogKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBtZWRpYSBlbGVtZW50cyBgcGxheWAgZnVuY3Rpb24uIFRoaXMgd2lsbCBjYWxsIHRoZSBgSFRNTDVgcwogKiBtZWRpYSBlbGVtZW50IGBwbGF5YCBmdW5jdGlvbi4KICoKICogQG1ldGhvZCBIdG1sNSNwbGF5CiAqIEBzZWUgW1NwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtcGxheX0KICovCidwbGF5J10uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgewogIEh0bWw1LnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzLmVsX1twcm9wXSgpOwogIH07Cn0pOwoKVGVjaC53aXRoU291cmNlSGFuZGxlcnMoSHRtbDUpOwoKLyoqCiAqIE5hdGl2ZSBzb3VyY2UgaGFuZGxlciBmb3IgSHRtbDUsIHNpbXBseSBwYXNzZXMgdGhlIHNvdXJjZSB0byB0aGUgbWVkaWEgZWxlbWVudC4KICoKICogQHByb3ByZXR5IHtUZWNoflNvdXJjZU9iamVjdH0gc291cmNlCiAqICAgICAgICBUaGUgc291cmNlIG9iamVjdAogKgogKiBAcHJvcHJldHkge0h0bWw1fSB0ZWNoCiAqICAgICAgICBUaGUgaW5zdGFuY2Ugb2YgdGhlIEhUTUw1IHRlY2guCiAqLwpIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyID0ge307CgovKioKICogQ2hlY2sgaWYgdGhlIG1lZGlhIGVsZW1lbnQgY2FuIHBsYXkgdGhlIGdpdmVuIG1pbWUgdHlwZS4KICoKICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKICogICAgICAgIFRoZSBtaW1ldHlwZSB0byBjaGVjawogKgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZykKICovCkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUgPSBmdW5jdGlvbiAodHlwZSkgewogIC8vIElFOSBvbiBXaW5kb3dzIDcgd2l0aG91dCBNZWRpYVBsYXllciB0aHJvd3MgYW4gZXJyb3IgaGVyZQogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy81MTkKICB0cnkgewogICAgcmV0dXJuIEh0bWw1LlRFU1RfVklELmNhblBsYXlUeXBlKHR5cGUpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHJldHVybiAnJzsKICB9Cn07CgovKioKICogQ2hlY2sgaWYgdGhlIG1lZGlhIGVsZW1lbnQgY2FuIGhhbmRsZSBhIHNvdXJjZSBuYXRpdmVseS4KICoKICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc291cmNlCiAqICAgICAgICAgVGhlIHNvdXJjZSBvYmplY3QKICoKICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXQogKiAgICAgICAgIE9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSB0ZWNoLgogKgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZykuCiAqLwpIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmNhbkhhbmRsZVNvdXJjZSA9IGZ1bmN0aW9uIChzb3VyY2UsIG9wdGlvbnMpIHsKCiAgLy8gSWYgYSB0eXBlIHdhcyBwcm92aWRlZCB3ZSBzaG91bGQgcmVseSBvbiB0aGF0CiAgaWYgKHNvdXJjZS50eXBlKSB7CiAgICByZXR1cm4gSHRtbDUubmF0aXZlU291cmNlSGFuZGxlci5jYW5QbGF5VHlwZShzb3VyY2UudHlwZSk7CgogICAgLy8gSWYgbm8gdHlwZSwgZmFsbCBiYWNrIHRvIGNoZWNraW5nICd2aWRlby9bRVhURU5TSU9OXScKICB9IGVsc2UgaWYgKHNvdXJjZS5zcmMpIHsKICAgIHZhciBleHQgPSBnZXRGaWxlRXh0ZW5zaW9uKHNvdXJjZS5zcmMpOwoKICAgIHJldHVybiBIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmNhblBsYXlUeXBlKCd2aWRlby8nICsgZXh0KTsKICB9CgogIHJldHVybiAnJzsKfTsKCi8qKgogKiBQYXNzIHRoZSBzb3VyY2UgdG8gdGhlIG5hdGl2ZSBtZWRpYSBlbGVtZW50LgogKgogKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fSBzb3VyY2UKICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0CiAqCiAqIEBwYXJhbSB7SHRtbDV9IHRlY2gKICogICAgICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgSHRtbDUgdGVjaAogKgogKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAqICAgICAgICBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzb3VyY2UKICovCkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuaGFuZGxlU291cmNlID0gZnVuY3Rpb24gKHNvdXJjZSwgdGVjaCwgb3B0aW9ucykgewogIHRlY2guc2V0U3JjKHNvdXJjZS5zcmMpOwp9OwoKLyoqCiAqIEEgbm9vcCBmb3IgdGhlIG5hdGl2ZSBkaXNwb3NlIGZ1bmN0aW9uLCBhcyBjbGVhbnVwIGlzIG5vdCBuZWVkZWQuCiAqLwpIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7fTsKCi8vIFJlZ2lzdGVyIHRoZSBuYXRpdmUgc291cmNlIGhhbmRsZXIKSHRtbDUucmVnaXN0ZXJTb3VyY2VIYW5kbGVyKEh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIpOwoKVGVjaC5yZWdpc3RlclRlY2goJ0h0bWw1JywgSHRtbDUpOwoKdmFyIF90ZW1wbGF0ZU9iamVjdCQxID0gdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UoWydcbiAgICAgICAgVXNpbmcgdGhlIHRlY2ggZGlyZWN0bHkgY2FuIGJlIGRhbmdlcm91cy4gSSBob3BlIHlvdSBrbm93IHdoYXQgeW91XCdyZSBkb2luZy5cbiAgICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy8yNjE3IGZvciBtb3JlIGluZm8uXG4gICAgICAnXSwgWydcbiAgICAgICAgVXNpbmcgdGhlIHRlY2ggZGlyZWN0bHkgY2FuIGJlIGRhbmdlcm91cy4gSSBob3BlIHlvdSBrbm93IHdoYXQgeW91XCdyZSBkb2luZy5cbiAgICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy8yNjE3IGZvciBtb3JlIGluZm8uXG4gICAgICAnXSk7CgovKioKICogQGZpbGUgcGxheWVyLmpzCiAqLwovLyBTdWJjbGFzc2VzIENvbXBvbmVudAovLyBUaGUgZm9sbG93aW5nIGltcG9ydHMgYXJlIHVzZWQgb25seSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGVzCi8vIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIHZpZGVvLmpzIHBhY2thZ2UuIEltcG9ydGluZyB0aGUgbW9kdWxlcyB3aWxsCi8vIGV4ZWN1dGUgdGhlbSBhbmQgdGhleSB3aWxsIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCB2aWRlby5qcy4KLy8gSW1wb3J0IEh0bWw1IHRlY2gsIGF0IGxlYXN0IGZvciBkaXNwb3NpbmcgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZy4KLy8gVGhlIGZvbGxvd2luZyB0ZWNoIGV2ZW50cyBhcmUgc2ltcGx5IHJlLXRyaWdnZXJlZAovLyBvbiB0aGUgcGxheWVyIHdoZW4gdGhleSBoYXBwZW4KdmFyIFRFQ0hfRVZFTlRTX1JFVFJJR0dFUiA9IFsKLyoqCiAqIEZpcmVkIHdoaWxlIHRoZSB1c2VyIGFnZW50IGlzIGRvd25sb2FkaW5nIG1lZGlhIGRhdGEuCiAqCiAqIEBldmVudCBQbGF5ZXIjcHJvZ3Jlc3MKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KLyoqCiAqIFJldHJpZ2dlciB0aGUgYHByb2dyZXNzYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICoKICogQHByaXZhdGUKICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFByb2dyZXNzXwogKiBAZmlyZXMgUGxheWVyI3Byb2dyZXNzCiAqIEBsaXN0ZW5zIFRlY2gjcHJvZ3Jlc3MKICovCidwcm9ncmVzcycsCgovKioKICogRmlyZXMgd2hlbiB0aGUgbG9hZGluZyBvZiBhbiBhdWRpby92aWRlbyBpcyBhYm9ydGVkLgogKgogKiBAZXZlbnQgUGxheWVyI2Fib3J0CiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICovCi8qKgogKiBSZXRyaWdnZXIgdGhlIGBhYm9ydGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uCiAqCiAqIEBwcml2YXRlCiAqIEBtZXRob2QgUGxheWVyI2hhbmRsZVRlY2hBYm9ydF8KICogQGZpcmVzIFBsYXllciNhYm9ydAogKiBAbGlzdGVucyBUZWNoI2Fib3J0CiAqLwonYWJvcnQnLAoKLyoqCiAqIEZpcmVzIHdoZW4gdGhlIGJyb3dzZXIgaXMgaW50ZW50aW9uYWxseSBub3QgZ2V0dGluZyBtZWRpYSBkYXRhLgogKgogKiBAZXZlbnQgUGxheWVyI3N1c3BlbmQKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KLyoqCiAqIFJldHJpZ2dlciB0aGUgYHN1c3BlbmRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogKgogKiBAcHJpdmF0ZQogKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoU3VzcGVuZF8KICogQGZpcmVzIFBsYXllciNzdXNwZW5kCiAqIEBsaXN0ZW5zIFRlY2gjc3VzcGVuZAogKi8KJ3N1c3BlbmQnLAoKLyoqCiAqIEZpcmVzIHdoZW4gdGhlIGN1cnJlbnQgcGxheWxpc3QgaXMgZW1wdHkuCiAqCiAqIEBldmVudCBQbGF5ZXIjZW1wdGllZAogKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAqLwovKioKICogUmV0cmlnZ2VyIHRoZSBgZW1wdGllZGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uCiAqCiAqIEBwcml2YXRlCiAqIEBtZXRob2QgUGxheWVyI2hhbmRsZVRlY2hFbXB0aWVkXwogKiBAZmlyZXMgUGxheWVyI2VtcHRpZWQKICogQGxpc3RlbnMgVGVjaCNlbXB0aWVkCiAqLwonZW1wdGllZCcsCi8qKgogKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGlzIHRyeWluZyB0byBnZXQgbWVkaWEgZGF0YSwgYnV0IGRhdGEgaXMgbm90IGF2YWlsYWJsZS4KICoKICogQGV2ZW50IFBsYXllciNzdGFsbGVkCiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICovCi8qKgogKiBSZXRyaWdnZXIgdGhlIGBzdGFsbGVkYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICoKICogQHByaXZhdGUKICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFN0YWxsZWRfCiAqIEBmaXJlcyBQbGF5ZXIjc3RhbGxlZAogKiBAbGlzdGVucyBUZWNoI3N0YWxsZWQKICovCidzdGFsbGVkJywKCi8qKgogKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGhhcyBsb2FkZWQgbWV0YSBkYXRhIGZvciB0aGUgYXVkaW8vdmlkZW8uCiAqCiAqIEBldmVudCBQbGF5ZXIjbG9hZGVkbWV0YWRhdGEKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KLyoqCiAqIFJldHJpZ2dlciB0aGUgYHN0YWxsZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogKgogKiBAcHJpdmF0ZQogKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoTG9hZGVkbWV0YWRhdGFfCiAqIEBmaXJlcyBQbGF5ZXIjbG9hZGVkbWV0YWRhdGEKICogQGxpc3RlbnMgVGVjaCNsb2FkZWRtZXRhZGF0YQogKi8KJ2xvYWRlZG1ldGFkYXRhJywKCi8qKgogKiBGaXJlcyB3aGVuIHRoZSBicm93c2VyIGhhcyBsb2FkZWQgdGhlIGN1cnJlbnQgZnJhbWUgb2YgdGhlIGF1ZGlvL3ZpZGVvLgogKgogKiBAZXZlbnQgUGxheWVyI2xvYWRlZGRhdGEKICogQHR5cGUge2V2ZW50fQogKi8KLyoqCiAqIFJldHJpZ2dlciB0aGUgYGxvYWRlZGRhdGFgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogKgogKiBAcHJpdmF0ZQogKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoTG9hZGRlZGRhdGFfCiAqIEBmaXJlcyBQbGF5ZXIjbG9hZGVkZGF0YQogKiBAbGlzdGVucyBUZWNoI2xvYWRlZGRhdGEKICovCidsb2FkZWRkYXRhJywKCi8qKgogKiBGaXJlcyB3aGVuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgogKgogKiBAZXZlbnQgUGxheWVyI3RpbWV1cGRhdGUKICogQHR5cGUge2V2ZW50fQogKi8KLyoqCiAqIFJldHJpZ2dlciB0aGUgYHRpbWV1cGRhdGVgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogKgogKiBAcHJpdmF0ZQogKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoVGltZVVwZGF0ZV8KICogQGZpcmVzIFBsYXllciN0aW1ldXBkYXRlCiAqIEBsaXN0ZW5zIFRlY2gjdGltZXVwZGF0ZQogKi8KJ3RpbWV1cGRhdGUnLAoKLyoqCiAqIEZpcmVzIHdoZW4gdGhlIHBsYXlpbmcgc3BlZWQgb2YgdGhlIGF1ZGlvL3ZpZGVvIGlzIGNoYW5nZWQKICoKICogQGV2ZW50IFBsYXllciNyYXRlY2hhbmdlCiAqIEB0eXBlIHtldmVudH0KICovCi8qKgogKiBSZXRyaWdnZXIgdGhlIGByYXRlY2hhbmdlYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICoKICogQHByaXZhdGUKICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFJhdGVjaGFuZ2VfCiAqIEBmaXJlcyBQbGF5ZXIjcmF0ZWNoYW5nZQogKiBAbGlzdGVucyBUZWNoI3JhdGVjaGFuZ2UKICovCidyYXRlY2hhbmdlJywKCi8qKgogKiBGaXJlcyB3aGVuIHRoZSB2aWRlbydzIGludHJpbnNpYyBkaW1lbnNpb25zIGNoYW5nZQogKgogKiBAZXZlbnQgUGxheWVyI3Jlc2l6ZQogKiBAdHlwZSB7ZXZlbnR9CiAqLwovKioKICogUmV0cmlnZ2VyIHRoZSBgcmVzaXplYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICoKICogQHByaXZhdGUKICogQG1ldGhvZCBQbGF5ZXIjaGFuZGxlVGVjaFJlc2l6ZV8KICogQGZpcmVzIFBsYXllciNyZXNpemUKICogQGxpc3RlbnMgVGVjaCNyZXNpemUKICovCidyZXNpemUnLAoKLyoqCiAqIEZpcmVzIHdoZW4gdGhlIHZvbHVtZSBoYXMgYmVlbiBjaGFuZ2VkCiAqCiAqIEBldmVudCBQbGF5ZXIjdm9sdW1lY2hhbmdlCiAqIEB0eXBlIHtldmVudH0KICovCi8qKgogKiBSZXRyaWdnZXIgdGhlIGB2b2x1bWVjaGFuZ2VgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogKgogKiBAcHJpdmF0ZQogKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoVm9sdW1lY2hhbmdlXwogKiBAZmlyZXMgUGxheWVyI3ZvbHVtZWNoYW5nZQogKiBAbGlzdGVucyBUZWNoI3ZvbHVtZWNoYW5nZQogKi8KJ3ZvbHVtZWNoYW5nZScsCgovKioKICogRmlyZXMgd2hlbiB0aGUgdGV4dCB0cmFjayBoYXMgYmVlbiBjaGFuZ2VkCiAqCiAqIEBldmVudCBQbGF5ZXIjdGV4dHRyYWNrY2hhbmdlCiAqIEB0eXBlIHtldmVudH0KICovCi8qKgogKiBSZXRyaWdnZXIgdGhlIGB0ZXh0dHJhY2tjaGFuZ2VgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogKgogKiBAcHJpdmF0ZQogKiBAbWV0aG9kIFBsYXllciNoYW5kbGVUZWNoVGV4dHRyYWNrY2hhbmdlXwogKiBAZmlyZXMgUGxheWVyI3RleHR0cmFja2NoYW5nZQogKiBAbGlzdGVucyBUZWNoI3RleHR0cmFja2NoYW5nZQogKi8KJ3RleHR0cmFja2NoYW5nZSddOwoKLyoqCiAqIEFuIGluc3RhbmNlIG9mIHRoZSBgUGxheWVyYCBjbGFzcyBpcyBjcmVhdGVkIHdoZW4gYW55IG9mIHRoZSBWaWRlby5qcyBzZXR1cCBtZXRob2RzCiAqIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgYSB2aWRlby4KICoKICogQWZ0ZXIgYW4gaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCBpdCBjYW4gYmUgYWNjZXNzZWQgZ2xvYmFsbHkgaW4gdHdvIHdheXM6CiAqIDEuIEJ5IGNhbGxpbmcgYHZpZGVvanMoJ2V4YW1wbGVfdmlkZW9fMScpO2AKICogMi4gQnkgdXNpbmcgaXQgZGlyZWN0bHkgdmlhICBgdmlkZW9qcy5wbGF5ZXJzLmV4YW1wbGVfdmlkZW9fMTtgCiAqCiAqIEBleHRlbmRzIENvbXBvbmVudAogKi8KCnZhciBQbGF5ZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkgewogIGluaGVyaXRzKFBsYXllciwgX0NvbXBvbmVudCk7CgogIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWcKICAgKiAgICAgICAgVGhlIG9yaWdpbmFsIHZpZGVvIERPTSBlbGVtZW50IHVzZWQgZm9yIGNvbmZpZ3VyaW5nIG9wdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV0KICAgKiAgICAgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICovCiAgZnVuY3Rpb24gUGxheWVyKHRhZywgb3B0aW9ucywgcmVhZHkpIHsKICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXllcik7CgogICAgLy8gTWFrZSBzdXJlIHRhZyBJRCBleGlzdHMKICAgIHRhZy5pZCA9IHRhZy5pZCB8fCAndmpzX3ZpZGVvXycgKyBuZXdHVUlEKCk7CgogICAgLy8gU2V0IE9wdGlvbnMKICAgIC8vIFRoZSBvcHRpb25zIGFyZ3VtZW50IG92ZXJyaWRlcyBvcHRpb25zIHNldCBpbiB0aGUgdmlkZW8gdGFnCiAgICAvLyB3aGljaCBvdmVycmlkZXMgZ2xvYmFsbHkgc2V0IG9wdGlvbnMuCiAgICAvLyBUaGlzIGxhdHRlciBwYXJ0IGNvaW5jaWRlcyB3aXRoIHRoZSBsb2FkIG9yZGVyCiAgICAvLyAodGFnIG11c3QgZXhpc3QgYmVmb3JlIFBsYXllcikKICAgIG9wdGlvbnMgPSBhc3NpZ24oUGxheWVyLmdldFRhZ1NldHRpbmdzKHRhZyksIG9wdGlvbnMpOwoKICAgIC8vIERlbGF5IHRoZSBpbml0aWFsaXphdGlvbiBvZiBjaGlsZHJlbiBiZWNhdXNlIHdlIG5lZWQgdG8gc2V0IHVwCiAgICAvLyBwbGF5ZXIgcHJvcGVydGllcyBmaXJzdCwgYW5kIGNhbid0IHVzZSBgdGhpc2AgYmVmb3JlIGBzdXBlcigpYAogICAgb3B0aW9ucy5pbml0Q2hpbGRyZW4gPSBmYWxzZTsKCiAgICAvLyBTYW1lIHdpdGggY3JlYXRpbmcgdGhlIGVsZW1lbnQKICAgIG9wdGlvbnMuY3JlYXRlRWwgPSBmYWxzZTsKCiAgICAvLyBkb24ndCBhdXRvIG1peGluIHRoZSBldmVudGVkIG1peGluCiAgICBvcHRpb25zLmV2ZW50ZWQgPSBmYWxzZTsKCiAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSBwbGF5ZXIgdG8gcmVwb3J0IHRvdWNoIGFjdGl2aXR5IG9uIGl0c2VsZgogICAgLy8gc2VlIGVuYWJsZVRvdWNoQWN0aXZpdHkgaW4gQ29tcG9uZW50CiAgICBvcHRpb25zLnJlcG9ydFRvdWNoQWN0aXZpdHkgPSBmYWxzZTsKCiAgICAvLyBJZiBsYW5ndWFnZSBpcyBub3Qgc2V0LCBnZXQgdGhlIGNsb3Nlc3QgbGFuZyBhdHRyaWJ1dGUKICAgIGlmICghb3B0aW9ucy5sYW5ndWFnZSkgewogICAgICBpZiAodHlwZW9mIHRhZy5jbG9zZXN0ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGNsb3Nlc3QgPSB0YWcuY2xvc2VzdCgnW2xhbmddJyk7CgogICAgICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3QuZ2V0QXR0cmlidXRlKSB7CiAgICAgICAgICBvcHRpb25zLmxhbmd1YWdlID0gY2xvc2VzdC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSB0YWc7CgogICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHsKICAgICAgICAgIGlmIChnZXRBdHRyaWJ1dGVzKGVsZW1lbnQpLmhhc093blByb3BlcnR5KCdsYW5nJykpIHsKICAgICAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsYW5nJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBSdW4gYmFzZSBjb21wb25lbnQgaW5pdGlhbGl6aW5nIHdpdGggbmV3IG9wdGlvbnMKCiAgICAvLyBUdXJuIG9mZiBBUEkgYWNjZXNzIGJlY2F1c2Ugd2UncmUgbG9hZGluZyBhIG5ldyB0ZWNoIHRoYXQgbWlnaHQgbG9hZCBhc3luY2hyb25vdXNseQogICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucywgcmVhZHkpKTsKCiAgICBfdGhpcy5pc1JlYWR5XyA9IGZhbHNlOwoKICAgIC8vIEluaXQgc3RhdGUgaGFzU3RhcnRlZF8KICAgIF90aGlzLmhhc1N0YXJ0ZWRfID0gZmFsc2U7CgogICAgLy8gSW5pdCBzdGF0ZSB1c2VyQWN0aXZlXwogICAgX3RoaXMudXNlckFjdGl2ZV8gPSBmYWxzZTsKCiAgICAvLyBpZiB0aGUgZ2xvYmFsIG9wdGlvbiBvYmplY3Qgd2FzIGFjY2lkZW50YWxseSBibG93biBhd2F5IGJ5CiAgICAvLyBzb21lb25lLCBiYWlsIGVhcmx5IHdpdGggYW4gaW5mb3JtYXRpdmUgZXJyb3IKICAgIGlmICghX3RoaXMub3B0aW9uc18gfHwgIV90aGlzLm9wdGlvbnNfLnRlY2hPcmRlciB8fCAhX3RoaXMub3B0aW9uc18udGVjaE9yZGVyLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRlY2hPcmRlciBzcGVjaWZpZWQuIERpZCB5b3Ugb3ZlcndyaXRlICcgKyAndmlkZW9qcy5vcHRpb25zIGluc3RlYWQgb2YganVzdCBjaGFuZ2luZyB0aGUgJyArICdwcm9wZXJ0aWVzIHlvdSB3YW50IHRvIG92ZXJyaWRlPycpOwogICAgfQoKICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCB0YWcgdXNlZCB0byBzZXQgb3B0aW9ucwogICAgX3RoaXMudGFnID0gdGFnOwoKICAgIC8vIFN0b3JlIHRoZSB0YWcgYXR0cmlidXRlcyB1c2VkIHRvIHJlc3RvcmUgaHRtbDUgZWxlbWVudAogICAgX3RoaXMudGFnQXR0cmlidXRlcyA9IHRhZyAmJiBnZXRBdHRyaWJ1dGVzKHRhZyk7CgogICAgLy8gVXBkYXRlIGN1cnJlbnQgbGFuZ3VhZ2UKICAgIF90aGlzLmxhbmd1YWdlKF90aGlzLm9wdGlvbnNfLmxhbmd1YWdlKTsKCiAgICAvLyBVcGRhdGUgU3VwcG9ydGVkIExhbmd1YWdlcwogICAgaWYgKG9wdGlvbnMubGFuZ3VhZ2VzKSB7CiAgICAgIC8vIE5vcm1hbGlzZSBwbGF5ZXIgb3B0aW9uIGxhbmd1YWdlcyB0byBsb3dlcmNhc2UKICAgICAgdmFyIGxhbmd1YWdlc1RvTG93ZXIgPSB7fTsKCiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9wdGlvbnMubGFuZ3VhZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7CiAgICAgICAgbGFuZ3VhZ2VzVG9Mb3dlcltuYW1lJCQxLnRvTG93ZXJDYXNlKCldID0gb3B0aW9ucy5sYW5ndWFnZXNbbmFtZSQkMV07CiAgICAgIH0pOwogICAgICBfdGhpcy5sYW5ndWFnZXNfID0gbGFuZ3VhZ2VzVG9Mb3dlcjsKICAgIH0gZWxzZSB7CiAgICAgIF90aGlzLmxhbmd1YWdlc18gPSBQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfLmxhbmd1YWdlczsKICAgIH0KCiAgICAvLyBDYWNoZSBmb3IgdmlkZW8gcHJvcGVydHkgdmFsdWVzLgogICAgX3RoaXMuY2FjaGVfID0ge307CgogICAgLy8gU2V0IHBvc3RlcgogICAgX3RoaXMucG9zdGVyXyA9IG9wdGlvbnMucG9zdGVyIHx8ICcnOwoKICAgIC8vIFNldCBjb250cm9scwogICAgX3RoaXMuY29udHJvbHNfID0gISFvcHRpb25zLmNvbnRyb2xzOwoKICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbGFzdFZvbHVtZQogICAgX3RoaXMuY2FjaGVfLmxhc3RWb2x1bWUgPSAxOwoKICAgIC8vIE9yaWdpbmFsIHRhZyBzZXR0aW5ncyBzdG9yZWQgaW4gb3B0aW9ucwogICAgLy8gbm93IHJlbW92ZSBpbW1lZGlhdGVseSBzbyBuYXRpdmUgY29udHJvbHMgZG9uJ3QgZmxhc2guCiAgICAvLyBNYXkgYmUgdHVybmVkIGJhY2sgb24gYnkgSFRNTDUgdGVjaCBpZiBuYXRpdmVDb250cm9sc0ZvclRvdWNoIGlzIHRydWUKICAgIHRhZy5jb250cm9scyA9IGZhbHNlOwogICAgdGFnLnJlbW92ZUF0dHJpYnV0ZSgnY29udHJvbHMnKTsKCiAgICAvKgogICAgICogU3RvcmUgdGhlIGludGVybmFsIHN0YXRlIG9mIHNjcnViYmluZwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSB1c2VyIGlzIHNjcnViYmluZwogICAgICovCiAgICBfdGhpcy5zY3J1YmJpbmdfID0gZmFsc2U7CgogICAgX3RoaXMuZWxfID0gX3RoaXMuY3JlYXRlRWwoKTsKCiAgICAvLyBNYWtlIHRoaXMgYW4gZXZlbnRlZCBvYmplY3QgYW5kIHVzZSBgZWxfYCBhcyBpdHMgZXZlbnQgYnVzLgogICAgZXZlbnRlZChfdGhpcywgeyBldmVudEJ1c0tleTogJ2VsXycgfSk7CgogICAgLy8gV2UgYWxzbyB3YW50IHRvIHBhc3MgdGhlIG9yaWdpbmFsIHBsYXllciBvcHRpb25zIHRvIGVhY2ggY29tcG9uZW50IGFuZCBwbHVnaW4KICAgIC8vIGFzIHdlbGwgc28gdGhleSBkb24ndCBuZWVkIHRvIHJlYWNoIGJhY2sgaW50byB0aGUgcGxheWVyIGZvciBvcHRpb25zIGxhdGVyLgogICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRvIGFub3RoZXIgY29weSBvZiB0aGlzLm9wdGlvbnNfIHNvIHdlIGRvbid0IGVuZCB1cCB3aXRoCiAgICAvLyBhbiBpbmZpbml0ZSBsb29wLgogICAgdmFyIHBsYXllck9wdGlvbnNDb3B5ID0gbWVyZ2VPcHRpb25zKF90aGlzLm9wdGlvbnNfKTsKCiAgICAvLyBMb2FkIHBsdWdpbnMKICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHsKICAgICAgdmFyIHBsdWdpbnMgPSBvcHRpb25zLnBsdWdpbnM7CgogICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW25hbWUkJDFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0aGlzW25hbWUkJDFdKHBsdWdpbnNbbmFtZSQkMV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BsdWdpbiAiJyArIG5hbWUkJDEgKyAnIiBkb2VzIG5vdCBleGlzdCcpOwogICAgICAgIH0KICAgICAgfSwgX3RoaXMpOwogICAgfQoKICAgIF90aGlzLm9wdGlvbnNfLnBsYXllck9wdGlvbnMgPSBwbGF5ZXJPcHRpb25zQ29weTsKCiAgICBfdGhpcy5taWRkbGV3YXJlXyA9IFtdOwoKICAgIF90aGlzLmluaXRDaGlsZHJlbigpOwoKICAgIC8vIFNldCBpc0F1ZGlvIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IGFuIGF1ZGlvIHRhZyB3YXMgdXNlZAogICAgX3RoaXMuaXNBdWRpbyh0YWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1ZGlvJyk7CgogICAgLy8gVXBkYXRlIGNvbnRyb2xzIGNsYXNzTmFtZS4gQ2FuJ3QgZG8gdGhpcyB3aGVuIHRoZSBjb250cm9scyBhcmUgaW5pdGlhbGx5CiAgICAvLyBzZXQgYmVjYXVzZSB0aGUgZWxlbWVudCBkb2Vzbid0IGV4aXN0IHlldC4KICAgIGlmIChfdGhpcy5jb250cm9scygpKSB7CiAgICAgIF90aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZW5hYmxlZCcpOwogICAgfSBlbHNlIHsKICAgICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy1jb250cm9scy1kaXNhYmxlZCcpOwogICAgfQoKICAgIC8vIFNldCBBUklBIGxhYmVsIGFuZCByZWdpb24gcm9sZSBkZXBlbmRpbmcgb24gcGxheWVyIHR5cGUKICAgIF90aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncmVnaW9uJyk7CiAgICBpZiAoX3RoaXMuaXNBdWRpbygpKSB7CiAgICAgIF90aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBfdGhpcy5sb2NhbGl6ZSgnQXVkaW8gUGxheWVyJykpOwogICAgfSBlbHNlIHsKICAgICAgX3RoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIF90aGlzLmxvY2FsaXplKCdWaWRlbyBQbGF5ZXInKSk7CiAgICB9CgogICAgaWYgKF90aGlzLmlzQXVkaW8oKSkgewogICAgICBfdGhpcy5hZGRDbGFzcygndmpzLWF1ZGlvJyk7CiAgICB9CgogICAgaWYgKF90aGlzLmZsZXhOb3RTdXBwb3J0ZWRfKCkpIHsKICAgICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy1uby1mbGV4Jyk7CiAgICB9CgogICAgLy8gVE9ETzogTWFrZSB0aGlzIHNtYXJ0ZXIuIFRvZ2dsZSB1c2VyIHN0YXRlIGJldHdlZW4gdG91Y2hpbmcvbW91c2luZwogICAgLy8gdXNpbmcgZXZlbnRzLCBzaW5jZSBkZXZpY2VzIGNhbiBoYXZlIGJvdGggdG91Y2ggYW5kIG1vdXNlIGV2ZW50cy4KICAgIC8vIGlmIChicm93c2VyLlRPVUNIX0VOQUJMRUQpIHsKICAgIC8vICAgdGhpcy5hZGRDbGFzcygndmpzLXRvdWNoLWVuYWJsZWQnKTsKICAgIC8vIH0KCiAgICAvLyBpT1MgU2FmYXJpIGhhcyBicm9rZW4gaG92ZXIgaGFuZGxpbmcKICAgIGlmICghSVNfSU9TKSB7CiAgICAgIF90aGlzLmFkZENsYXNzKCd2anMtd29ya2luZ2hvdmVyJyk7CiAgICB9CgogICAgLy8gTWFrZSBwbGF5ZXIgZWFzaWx5IGZpbmRhYmxlIGJ5IElECiAgICBQbGF5ZXIucGxheWVyc1tfdGhpcy5pZF9dID0gX3RoaXM7CgogICAgLy8gQWRkIGEgbWFqb3IgdmVyc2lvbiBjbGFzcyB0byBhaWQgY3NzIGluIHBsdWdpbnMKICAgIHZhciBtYWpvclZlcnNpb24gPSB2ZXJzaW9uLnNwbGl0KCcuJylbMF07CgogICAgX3RoaXMuYWRkQ2xhc3MoJ3Zqcy12JyArIG1ham9yVmVyc2lvbik7CgogICAgLy8gV2hlbiB0aGUgcGxheWVyIGlzIGZpcnN0IGluaXRpYWxpemVkLCB0cmlnZ2VyIGFjdGl2aXR5IHNvIGNvbXBvbmVudHMKICAgIC8vIGxpa2UgdGhlIGNvbnRyb2wgYmFyIHNob3cgdGhlbXNlbHZlcyBpZiBuZWVkZWQKICAgIF90aGlzLnVzZXJBY3RpdmUodHJ1ZSk7CiAgICBfdGhpcy5yZXBvcnRVc2VyQWN0aXZpdHkoKTsKICAgIF90aGlzLmxpc3RlbkZvclVzZXJBY3Rpdml0eV8oKTsKCiAgICBfdGhpcy5vbignZnVsbHNjcmVlbmNoYW5nZScsIF90aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2VfKTsKICAgIF90aGlzLm9uKCdzdGFnZWNsaWNrJywgX3RoaXMuaGFuZGxlU3RhZ2VDbGlja18pOwoKICAgIF90aGlzLmNoYW5naW5nU3JjXyA9IGZhbHNlOwogICAgX3RoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8gPSBmYWxzZTsKICAgIF90aGlzLnBsYXlPbkxvYWRzdGFydF8gPSBudWxsOwoKICAgIF90aGlzLmZvcmNlQXV0b3BsYXlJbkNocm9tZV8oKTsKICAgIHJldHVybiBfdGhpczsKICB9CgogIC8qKgogICAqIERlc3Ryb3lzIHRoZSB2aWRlbyBwbGF5ZXIgYW5kIGRvZXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwLgogICAqCiAgICogVGhpcyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBkeW5hbWljYWxseSBhZGRpbmcgYW5kIHJlbW92aW5nIHZpZGVvcwogICAqIHRvL2Zyb20gdGhlIERPTS4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZGlzcG9zZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHsKICAgIC8qKgogICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXllciBpcyBiZWluZyBkaXNwb3NlZCBvZi4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI2Rpc3Bvc2UKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdkaXNwb3NlJyk7CiAgICAvLyBwcmV2ZW50IGRpc3Bvc2UgZnJvbSBiZWluZyBjYWxsZWQgdHdpY2UKICAgIHRoaXMub2ZmKCdkaXNwb3NlJyk7CgogICAgaWYgKHRoaXMuc3R5bGVFbF8gJiYgdGhpcy5zdHlsZUVsXy5wYXJlbnROb2RlKSB7CiAgICAgIHRoaXMuc3R5bGVFbF8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnN0eWxlRWxfKTsKICAgICAgdGhpcy5zdHlsZUVsXyA9IG51bGw7CiAgICB9CgogICAgLy8gS2lsbCByZWZlcmVuY2UgdG8gdGhpcyBwbGF5ZXIKICAgIFBsYXllci5wbGF5ZXJzW3RoaXMuaWRfXSA9IG51bGw7CgogICAgaWYgKHRoaXMudGFnICYmIHRoaXMudGFnLnBsYXllcikgewogICAgICB0aGlzLnRhZy5wbGF5ZXIgPSBudWxsOwogICAgfQoKICAgIGlmICh0aGlzLmVsXyAmJiB0aGlzLmVsXy5wbGF5ZXIpIHsKICAgICAgdGhpcy5lbF8ucGxheWVyID0gbnVsbDsKICAgIH0KCiAgICBpZiAodGhpcy50ZWNoXykgewogICAgICB0aGlzLnRlY2hfLmRpc3Bvc2UoKTsKICAgIH0KCiAgICBpZiAodGhpcy5wbGF5ZXJFbEluZ2VzdF8pIHsKICAgICAgdGhpcy5wbGF5ZXJFbEluZ2VzdF8gPSBudWxsOwogICAgfQoKICAgIGlmICh0aGlzLnRhZykgewogICAgICB0aGlzLnRhZyA9IG51bGw7CiAgICB9CgogICAgLy8gdGhlIGFjdHVhbCAuZWxfIGlzIHJlbW92ZWQgaGVyZQogICAgX0NvbXBvbmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpOwogIH07CgogIC8qKgogICAqIENyZWF0ZSB0aGUgYFBsYXllcmAncyBET00gZWxlbWVudC4KICAgKgogICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICogICAgICAgICBUaGUgRE9NIGVsZW1lbnQgdGhhdCBnZXRzIGNyZWF0ZWQuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmNyZWF0ZUVsID0gZnVuY3Rpb24gY3JlYXRlRWwkJDEoKSB7CiAgICB2YXIgdGFnID0gdGhpcy50YWc7CiAgICB2YXIgZWwgPSB2b2lkIDA7CiAgICB2YXIgcGxheWVyRWxJbmdlc3QgPSB0aGlzLnBsYXllckVsSW5nZXN0XyA9IHRhZy5wYXJlbnROb2RlICYmIHRhZy5wYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSAmJiB0YWcucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtdmpzLXBsYXllcicpOwogICAgdmFyIGRpdkVtYmVkID0gdGhpcy50YWcudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndmlkZW8tanMnOwoKICAgIGlmIChwbGF5ZXJFbEluZ2VzdCkgewogICAgICBlbCA9IHRoaXMuZWxfID0gdGFnLnBhcmVudE5vZGU7CiAgICB9IGVsc2UgaWYgKCFkaXZFbWJlZCkgewogICAgICBlbCA9IHRoaXMuZWxfID0gX0NvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCAnZGl2Jyk7CiAgICB9CgogICAgLy8gQ29weSBvdmVyIGFsbCB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSB0YWcsIGluY2x1ZGluZyBJRCBhbmQgY2xhc3MKICAgIC8vIElEIHdpbGwgbm93IHJlZmVyZW5jZSBwbGF5ZXIgYm94LCBub3QgdGhlIHZpZGVvIHRhZwogICAgdmFyIGF0dHJzID0gZ2V0QXR0cmlidXRlcyh0YWcpOwoKICAgIGlmIChkaXZFbWJlZCkgewogICAgICBlbCA9IHRoaXMuZWxfID0gdGFnOwogICAgICB0YWcgPSB0aGlzLnRhZyA9IGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICAgICAgd2hpbGUgKGVsLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHRhZy5hcHBlbmRDaGlsZChlbC5maXJzdENoaWxkKTsKICAgICAgfQoKICAgICAgaWYgKCFoYXNDbGFzcyhlbCwgJ3ZpZGVvLWpzJykpIHsKICAgICAgICBhZGRDbGFzcyhlbCwgJ3ZpZGVvLWpzJyk7CiAgICAgIH0KCiAgICAgIGVsLmFwcGVuZENoaWxkKHRhZyk7CgogICAgICBwbGF5ZXJFbEluZ2VzdCA9IHRoaXMucGxheWVyRWxJbmdlc3RfID0gZWw7CiAgICB9CgogICAgLy8gc2V0IHRhYmluZGV4IHRvIC0xIHNvIHdlIGNvdWxkIGZvY3VzIG9uIHRoZSBwbGF5ZXIgZWxlbWVudAogICAgdGFnLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTsKCiAgICAvLyBSZW1vdmUgd2lkdGgvaGVpZ2h0IGF0dHJzIGZyb20gdGFnIHNvIENTUyBjYW4gbWFrZSBpdCAxMDAlIHdpZHRoL2hlaWdodAogICAgdGFnLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTsKICAgIHRhZy5yZW1vdmVBdHRyaWJ1dGUoJ2hlaWdodCcpOwoKICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7CiAgICAgIC8vIHdvcmthcm91bmQgc28gd2UgZG9uJ3QgdG90YWxseSBicmVhayBJRTcKICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNjUzNDQ0L2Nzcy1zdHlsZXMtbm90LWFwcGxpZWQtb24tZHluYW1pYy1lbGVtZW50cy1pbi1pbnRlcm5ldC1leHBsb3Jlci03CiAgICAgIGlmIChhdHRyID09PSAnY2xhc3MnKSB7CiAgICAgICAgZWwuY2xhc3NOYW1lICs9ICcgJyArIGF0dHJzW2F0dHJdOwoKICAgICAgICBpZiAoZGl2RW1iZWQpIHsKICAgICAgICAgIHRhZy5jbGFzc05hbWUgKz0gJyAnICsgYXR0cnNbYXR0cl07CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSk7CgogICAgICAgIGlmIChkaXZFbWJlZCkgewogICAgICAgICAgdGFnLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyc1thdHRyXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvLyBVcGRhdGUgdGFnIGlkL2NsYXNzIGZvciB1c2UgYXMgSFRNTDUgcGxheWJhY2sgdGVjaAogICAgLy8gTWlnaHQgdGhpbmsgd2Ugc2hvdWxkIGRvIHRoaXMgYWZ0ZXIgZW1iZWRkaW5nIGluIGNvbnRhaW5lciBzbyAudmpzLXRlY2ggY2xhc3MKICAgIC8vIGRvZXNuJ3QgZmxhc2ggMTAwJSB3aWR0aC9oZWlnaHQsIGJ1dCBjbGFzcyBvbmx5IGFwcGxpZXMgd2l0aCAudmlkZW8tanMgcGFyZW50CiAgICB0YWcucGxheWVySWQgPSB0YWcuaWQ7CiAgICB0YWcuaWQgKz0gJ19odG1sNV9hcGknOwogICAgdGFnLmNsYXNzTmFtZSA9ICd2anMtdGVjaCc7CgogICAgLy8gTWFrZSBwbGF5ZXIgZmluZGFibGUgb24gZWxlbWVudHMKICAgIHRhZy5wbGF5ZXIgPSBlbC5wbGF5ZXIgPSB0aGlzOwogICAgLy8gRGVmYXVsdCBzdGF0ZSBvZiB2aWRlbyBpcyBwYXVzZWQKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1wYXVzZWQnKTsKCiAgICAvLyBBZGQgYSBzdHlsZSBlbGVtZW50IGluIHRoZSBwbGF5ZXIgdGhhdCB3ZSdsbCB1c2UgdG8gc2V0IHRoZSB3aWR0aC9oZWlnaHQKICAgIC8vIG9mIHRoZSBwbGF5ZXIgaW4gYSB3YXkgdGhhdCdzIHN0aWxsIG92ZXJyaWRlYWJsZSBieSBDU1MsIGp1c3QgbGlrZSB0aGUKICAgIC8vIHZpZGVvIGVsZW1lbnQKICAgIGlmICh3aW5kb3dfMS5WSURFT0pTX05PX0RZTkFNSUNfU1RZTEUgIT09IHRydWUpIHsKICAgICAgdGhpcy5zdHlsZUVsXyA9IGNyZWF0ZVN0eWxlRWxlbWVudCgndmpzLXN0eWxlcy1kaW1lbnNpb25zJyk7CiAgICAgIHZhciBkZWZhdWx0c1N0eWxlRWwgPSAkKCcudmpzLXN0eWxlcy1kZWZhdWx0cycpOwogICAgICB2YXIgaGVhZCA9ICQoJ2hlYWQnKTsKCiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHRoaXMuc3R5bGVFbF8sIGRlZmF1bHRzU3R5bGVFbCA/IGRlZmF1bHRzU3R5bGVFbC5uZXh0U2libGluZyA6IGhlYWQuZmlyc3RDaGlsZCk7CiAgICB9CgogICAgLy8gUGFzcyBpbiB0aGUgd2lkdGgvaGVpZ2h0L2FzcGVjdFJhdGlvIG9wdGlvbnMgd2hpY2ggd2lsbCB1cGRhdGUgdGhlIHN0eWxlIGVsCiAgICB0aGlzLndpZHRoKHRoaXMub3B0aW9uc18ud2lkdGgpOwogICAgdGhpcy5oZWlnaHQodGhpcy5vcHRpb25zXy5oZWlnaHQpOwogICAgdGhpcy5mbHVpZCh0aGlzLm9wdGlvbnNfLmZsdWlkKTsKICAgIHRoaXMuYXNwZWN0UmF0aW8odGhpcy5vcHRpb25zXy5hc3BlY3RSYXRpbyk7CgogICAgLy8gSGlkZSBhbnkgbGlua3Mgd2l0aGluIHRoZSB2aWRlby9hdWRpbyB0YWcsIGJlY2F1c2UgSUUgZG9lc24ndCBoaWRlIHRoZW0gY29tcGxldGVseS4KICAgIHZhciBsaW5rcyA9IHRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxpbmtFbCA9IGxpbmtzLml0ZW0oaSk7CgogICAgICBhZGRDbGFzcyhsaW5rRWwsICd2anMtaGlkZGVuJyk7CiAgICAgIGxpbmtFbC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTsKICAgIH0KCiAgICAvLyBpbnNlcnRFbEZpcnN0IHNlZW1zIHRvIGNhdXNlIHRoZSBuZXR3b3JrU3RhdGUgdG8gZmxpY2tlciBmcm9tIDMgdG8gMiwgc28KICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIGZvciBsYXRlciBzbyB3ZSBjYW4ga25vdyBpZiB0aGUgc291cmNlIG9yaWdpbmFsbHkgZmFpbGVkCiAgICB0YWcuaW5pdE5ldHdvcmtTdGF0ZV8gPSB0YWcubmV0d29ya1N0YXRlOwoKICAgIC8vIFdyYXAgdmlkZW8gdGFnIGluIGRpdiAoZWwvYm94KSBjb250YWluZXIKICAgIGlmICh0YWcucGFyZW50Tm9kZSAmJiAhcGxheWVyRWxJbmdlc3QpIHsKICAgICAgdGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsLCB0YWcpOwogICAgfQoKICAgIC8vIGluc2VydCB0aGUgdGFnIGFzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgcGxheWVyIGVsZW1lbnQKICAgIC8vIHRoZW4gbWFudWFsbHkgYWRkIGl0IHRvIHRoZSBjaGlsZHJlbiBhcnJheSBzbyB0aGF0IHRoaXMuYWRkQ2hpbGQKICAgIC8vIHdpbGwgd29yayBwcm9wZXJseSBmb3Igb3RoZXIgY29tcG9uZW50cwogICAgLy8KICAgIC8vIEJyZWFrcyBpUGhvbmUsIGZpeGVkIGluIEhUTUw1IHNldHVwLgogICAgcHJlcGVuZFRvKHRhZywgZWwpOwogICAgdGhpcy5jaGlsZHJlbl8udW5zaGlmdCh0YWcpOwoKICAgIC8vIFNldCBsYW5nIGF0dHIgb24gcGxheWVyIHRvIGVuc3VyZSBDU1MgOmxhbmcoKSBpbiBjb25zaXN0ZW50IHdpdGggcGxheWVyCiAgICAvLyBpZiBpdCdzIGJlZW4gc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdG8gdGhlIGRvYwogICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdsYW5nJywgdGhpcy5sYW5ndWFnZV8pOwoKICAgIHRoaXMuZWxfID0gZWw7CgogICAgcmV0dXJuIGVsOwogIH07CgogIC8qKgogICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3Mgd2lkdGguIFJldHVybnMgdGhlIHBsYXllcidzIGNvbmZpZ3VyZWQgdmFsdWUuCiAgICogVG8gZ2V0IHRoZSBjdXJyZW50IHdpZHRoIHVzZSBgY3VycmVudFdpZHRoKClgLgogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV0KICAgKiAgICAgICAgVGhlIHZhbHVlIHRvIHNldCB0aGUgYFBsYXllcmAncyB3aWR0aCB0by4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBMaXN0ZW5lcnNdCiAgICogICAgICAgIFNraXAgdGhlIHBsYXllcnJlc2l6ZSBldmVudCB0cmlnZ2VyCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBUaGUgY3VycmVudCB3aWR0aCBvZiB0aGUgYFBsYXllcmAgd2hlbiBnZXR0aW5nLgogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS53aWR0aCA9IGZ1bmN0aW9uIHdpZHRoKHZhbHVlLCBza2lwTGlzdGVuZXJzKSB7CiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24oJ3dpZHRoJywgdmFsdWUsIHNraXBMaXN0ZW5lcnMpOwogIH07CgogIC8qKgogICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3MgaGVpZ2h0LiBSZXR1cm5zIHRoZSBwbGF5ZXIncyBjb25maWd1cmVkIHZhbHVlLgogICAqIFRvIGdldCB0aGUgY3VycmVudCBoZWlnaHQgdXNlIGBjdXJyZW50aGVpZ2h0KClgLgogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV0KICAgKiAgICAgICAgVGhlIHZhbHVlIHRvIHNldCB0aGUgYFBsYXllcmAncyBoZWlndGggdG8uCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwTGlzdGVuZXJzXQogICAqICAgICAgICBTa2lwIHRoZSBwbGF5ZXJyZXNpemUgZXZlbnQgdHJpZ2dlcgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBgUGxheWVyYCB3aGVuIGdldHRpbmcuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhlaWdodCA9IGZ1bmN0aW9uIGhlaWdodCh2YWx1ZSwgc2tpcExpc3RlbmVycykgewogICAgcmV0dXJuIHRoaXMuZGltZW5zaW9uKCdoZWlnaHQnLCB2YWx1ZSwgc2tpcExpc3RlbmVycyk7CiAgfTsKCiAgLyoqCiAgICogQSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgYFBsYXllcmAncyB3aWR0aCAmIGhlaWdodC4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjcGxheWVycmVzaXplCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gZGltZW5zaW9uCiAgICogICAgICAgIFRoaXMgc3RyaW5nIGNhbiBiZToKICAgKiAgICAgICAgLSAnd2lkdGgnCiAgICogICAgICAgIC0gJ2hlaWdodCcKICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWVdCiAgICogICAgICAgIFZhbHVlIGZvciBkaW1lbnNpb24gc3BlY2lmaWVkIGluIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBMaXN0ZW5lcnNdCiAgICogICAgICAgIFNraXAgdGhlIHBsYXllcnJlc2l6ZSBldmVudCB0cmlnZ2VyCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBUaGUgZGltZW5zaW9uIGFyZ3VtZW50cyB2YWx1ZSB3aGVuIGdldHRpbmcgKHdpZHRoL2hlaWdodCkuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmRpbWVuc2lvbiA9IGZ1bmN0aW9uIGRpbWVuc2lvbihfZGltZW5zaW9uLCB2YWx1ZSwgc2tpcExpc3RlbmVycykgewogICAgdmFyIHByaXZEaW1lbnNpb24gPSBfZGltZW5zaW9uICsgJ18nOwoKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzW3ByaXZEaW1lbnNpb25dIHx8IDA7CiAgICB9CgogICAgaWYgKHZhbHVlID09PSAnJykgewogICAgICAvLyBJZiBhbiBlbXB0eSBzdHJpbmcgaXMgZ2l2ZW4sIHJlc2V0IHRoZSBkaW1lbnNpb24gdG8gYmUgYXV0b21hdGljCiAgICAgIHRoaXNbcHJpdkRpbWVuc2lvbl0gPSB1bmRlZmluZWQ7CiAgICAgIHRoaXMudXBkYXRlU3R5bGVFbF8oKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBwYXJzZWRWYWwgPSBwYXJzZUZsb2F0KHZhbHVlKTsKCiAgICBpZiAoaXNOYU4ocGFyc2VkVmFsKSkgewogICAgICBsb2ckMS5lcnJvcignSW1wcm9wZXIgdmFsdWUgIicgKyB2YWx1ZSArICciIHN1cHBsaWVkIGZvciBmb3IgJyArIF9kaW1lbnNpb24pOwogICAgICByZXR1cm47CiAgICB9CgogICAgdGhpc1twcml2RGltZW5zaW9uXSA9IHBhcnNlZFZhbDsKICAgIHRoaXMudXBkYXRlU3R5bGVFbF8oKTsKCiAgICAvLyBza2lwTGlzdGVuZXJzIGFsbG93cyB1cyB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSByZXNpemUgZXZlbnQgd2hlbiBzZXR0aW5nIGJvdGggd2lkdGggYW5kIGhlaWdodAogICAgaWYgKHRoaXMuaXNSZWFkeV8gJiYgIXNraXBMaXN0ZW5lcnMpIHsKICAgICAgLyoqCiAgICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBwbGF5ZXIgaXMgcmVzaXplZC4KICAgICAgICoKICAgICAgICogQGV2ZW50IFBsYXllciNwbGF5ZXJyZXNpemUKICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgKi8KICAgICAgdGhpcy50cmlnZ2VyKCdwbGF5ZXJyZXNpemUnKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBBIGdldHRlci9zZXR0ZXIvdG9nZ2xlciBmb3IgdGhlIHZqcy1mbHVpZCBgY2xhc3NOYW1lYCBvbiB0aGUgYFBsYXllcmAuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtib29sXQogICAqICAgICAgICAtIEEgdmFsdWUgb2YgdHJ1ZSBhZGRzIHRoZSBjbGFzcy4KICAgKiAgICAgICAgLSBBIHZhbHVlIG9mIGZhbHNlIHJlbW92ZXMgdGhlIGNsYXNzLgogICAqICAgICAgICAtIE5vIHZhbHVlIHdpbGwgdG9nZ2xlIHRoZSBmbHVpZCBjbGFzcy4KICAgKgogICAqIEByZXR1cm4ge2Jvb2xlYW58dW5kZWZpbmVkfQogICAqICAgICAgICAgLSBUaGUgdmFsdWUgb2YgZmx1aWQgd2hlbiBnZXR0aW5nLgogICAqICAgICAgICAgLSBgdW5kZWZpbmVkYCB3aGVuIHNldHRpbmcuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmZsdWlkID0gZnVuY3Rpb24gZmx1aWQoYm9vbCkgewogICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gISF0aGlzLmZsdWlkXzsKICAgIH0KCiAgICB0aGlzLmZsdWlkXyA9ICEhYm9vbDsKCiAgICBpZiAoYm9vbCkgewogICAgICB0aGlzLmFkZENsYXNzKCd2anMtZmx1aWQnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1mbHVpZCcpOwogICAgfQoKICAgIHRoaXMudXBkYXRlU3R5bGVFbF8oKTsKICB9OwoKICAvKioKICAgKiBHZXQvU2V0IHRoZSBhc3BlY3QgcmF0aW8KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBbcmF0aW9dCiAgICogICAgICAgIEFzcGVjdCByYXRpbyBmb3IgcGxheWVyCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfQogICAqICAgICAgICAgcmV0dXJucyB0aGUgY3VycmVudCBhc3BlY3QgcmF0aW8gd2hlbiBnZXR0aW5nCiAgICovCgogIC8qKgogICAqIEEgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGBQbGF5ZXJgJ3MgYXNwZWN0IHJhdGlvLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtyYXRpb10KICAgKiAgICAgICAgVGhlIHZhbHVlIHRvIHNldCB0aGUgYFBsYXllcidzIGFzcGVjdCByYXRpbyB0by4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9CiAgICogICAgICAgICAtIFRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBvZiB0aGUgYFBsYXllcmAgd2hlbiBnZXR0aW5nLgogICAqICAgICAgICAgLSB1bmRlZmluZWQgd2hlbiBzZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmFzcGVjdFJhdGlvID0gZnVuY3Rpb24gYXNwZWN0UmF0aW8ocmF0aW8pIHsKICAgIGlmIChyYXRpbyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzLmFzcGVjdFJhdGlvXzsKICAgIH0KCiAgICAvLyBDaGVjayBmb3Igd2lkdGg6aGVpZ2h0IGZvcm1hdAogICAgaWYgKCEvXlxkK1w6XGQrJC8udGVzdChyYXRpbykpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciB2YWx1ZSBzdXBwbGllZCBmb3IgYXNwZWN0IHJhdGlvLiBUaGUgZm9ybWF0IHNob3VsZCBiZSB3aWR0aDpoZWlnaHQsIGZvciBleGFtcGxlIDE2OjkuJyk7CiAgICB9CiAgICB0aGlzLmFzcGVjdFJhdGlvXyA9IHJhdGlvOwoKICAgIC8vIFdlJ3JlIGFzc3VtaW5nIGlmIHlvdSBzZXQgYW4gYXNwZWN0IHJhdGlvIHlvdSB3YW50IGZsdWlkIG1vZGUsCiAgICAvLyBiZWNhdXNlIGluIGZpeGVkIG1vZGUgeW91IGNvdWxkIGNhbGN1bGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IHlvdXJzZWxmLgogICAgdGhpcy5mbHVpZCh0cnVlKTsKCiAgICB0aGlzLnVwZGF0ZVN0eWxlRWxfKCk7CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlIHN0eWxlcyBvZiB0aGUgYFBsYXllcmAgZWxlbWVudCAoaGVpZ2h0LCB3aWR0aCBhbmQgYXNwZWN0IHJhdGlvKS4KICAgKgogICAqIEBwcml2YXRlCiAgICogQGxpc3RlbnMgVGVjaCNsb2FkZWRtZXRhZGF0YQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS51cGRhdGVTdHlsZUVsXyA9IGZ1bmN0aW9uIHVwZGF0ZVN0eWxlRWxfKCkgewogICAgaWYgKHdpbmRvd18xLlZJREVPSlNfTk9fRFlOQU1JQ19TVFlMRSA9PT0gdHJ1ZSkgewogICAgICB2YXIgX3dpZHRoID0gdHlwZW9mIHRoaXMud2lkdGhfID09PSAnbnVtYmVyJyA/IHRoaXMud2lkdGhfIDogdGhpcy5vcHRpb25zXy53aWR0aDsKICAgICAgdmFyIF9oZWlnaHQgPSB0eXBlb2YgdGhpcy5oZWlnaHRfID09PSAnbnVtYmVyJyA/IHRoaXMuaGVpZ2h0XyA6IHRoaXMub3B0aW9uc18uaGVpZ2h0OwogICAgICB2YXIgdGVjaEVsID0gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLmVsKCk7CgogICAgICBpZiAodGVjaEVsKSB7CiAgICAgICAgaWYgKF93aWR0aCA+PSAwKSB7CiAgICAgICAgICB0ZWNoRWwud2lkdGggPSBfd2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmIChfaGVpZ2h0ID49IDApIHsKICAgICAgICAgIHRlY2hFbC5oZWlnaHQgPSBfaGVpZ2h0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB3aWR0aCA9IHZvaWQgMDsKICAgIHZhciBoZWlnaHQgPSB2b2lkIDA7CiAgICB2YXIgYXNwZWN0UmF0aW8gPSB2b2lkIDA7CiAgICB2YXIgaWRDbGFzcyA9IHZvaWQgMDsKCiAgICAvLyBUaGUgYXNwZWN0IHJhdGlvIGlzIGVpdGhlciB1c2VkIGRpcmVjdGx5IG9yIHRvIGNhbGN1bGF0ZSB3aWR0aCBhbmQgaGVpZ2h0LgogICAgaWYgKHRoaXMuYXNwZWN0UmF0aW9fICE9PSB1bmRlZmluZWQgJiYgdGhpcy5hc3BlY3RSYXRpb18gIT09ICdhdXRvJykgewogICAgICAvLyBVc2UgYW55IGFzcGVjdFJhdGlvIHRoYXQncyBiZWVuIHNwZWNpZmljYWxseSBzZXQKICAgICAgYXNwZWN0UmF0aW8gPSB0aGlzLmFzcGVjdFJhdGlvXzsKICAgIH0gZWxzZSBpZiAodGhpcy52aWRlb1dpZHRoKCkgPiAwKSB7CiAgICAgIC8vIE90aGVyd2lzZSB0cnkgdG8gZ2V0IHRoZSBhc3BlY3QgcmF0aW8gZnJvbSB0aGUgdmlkZW8gbWV0YWRhdGEKICAgICAgYXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGgoKSArICc6JyArIHRoaXMudmlkZW9IZWlnaHQoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE9yIHVzZSBhIGRlZmF1bHQuIFRoZSB2aWRlbyBlbGVtZW50J3MgaXMgMjoxLCBidXQgMTY6OSBpcyBtb3JlIGNvbW1vbi4KICAgICAgYXNwZWN0UmF0aW8gPSAnMTY6OSc7CiAgICB9CgogICAgLy8gR2V0IHRoZSByYXRpbyBhcyBhIGRlY2ltYWwgd2UgY2FuIHVzZSB0byBjYWxjdWxhdGUgZGltZW5zaW9ucwogICAgdmFyIHJhdGlvUGFydHMgPSBhc3BlY3RSYXRpby5zcGxpdCgnOicpOwogICAgdmFyIHJhdGlvTXVsdGlwbGllciA9IHJhdGlvUGFydHNbMV0gLyByYXRpb1BhcnRzWzBdOwoKICAgIGlmICh0aGlzLndpZHRoXyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIC8vIFVzZSBhbnkgd2lkdGggdGhhdCdzIGJlZW4gc3BlY2lmaWNhbGx5IHNldAogICAgICB3aWR0aCA9IHRoaXMud2lkdGhfOwogICAgfSBlbHNlIGlmICh0aGlzLmhlaWdodF8gIT09IHVuZGVmaW5lZCkgewogICAgICAvLyBPciBjYWx1bGF0ZSB0aGUgd2lkdGggZnJvbSB0aGUgYXNwZWN0IHJhdGlvIGlmIGEgaGVpZ2h0IGhhcyBiZWVuIHNldAogICAgICB3aWR0aCA9IHRoaXMuaGVpZ2h0XyAvIHJhdGlvTXVsdGlwbGllcjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE9yIHVzZSB0aGUgdmlkZW8ncyBtZXRhZGF0YSwgb3IgdXNlIHRoZSB2aWRlbyBlbCdzIGRlZmF1bHQgb2YgMzAwCiAgICAgIHdpZHRoID0gdGhpcy52aWRlb1dpZHRoKCkgfHwgMzAwOwogICAgfQoKICAgIGlmICh0aGlzLmhlaWdodF8gIT09IHVuZGVmaW5lZCkgewogICAgICAvLyBVc2UgYW55IGhlaWdodCB0aGF0J3MgYmVlbiBzcGVjaWZpY2FsbHkgc2V0CiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0XzsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE90aGVyd2lzZSBjYWxjdWxhdGUgdGhlIGhlaWdodCBmcm9tIHRoZSByYXRpbyBhbmQgdGhlIHdpZHRoCiAgICAgIGhlaWdodCA9IHdpZHRoICogcmF0aW9NdWx0aXBsaWVyOwogICAgfQoKICAgIC8vIEVuc3VyZSB0aGUgQ1NTIGNsYXNzIGlzIHZhbGlkIGJ5IHN0YXJ0aW5nIHdpdGggYW4gYWxwaGEgY2hhcmFjdGVyCiAgICBpZiAoL15bXmEtekEtWl0vLnRlc3QodGhpcy5pZCgpKSkgewogICAgICBpZENsYXNzID0gJ2RpbWVuc2lvbnMtJyArIHRoaXMuaWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlkQ2xhc3MgPSB0aGlzLmlkKCkgKyAnLWRpbWVuc2lvbnMnOwogICAgfQoKICAgIC8vIEVuc3VyZSB0aGUgcmlnaHQgY2xhc3MgaXMgc3RpbGwgb24gdGhlIHBsYXllciBmb3IgdGhlIHN0eWxlIGVsZW1lbnQKICAgIHRoaXMuYWRkQ2xhc3MoaWRDbGFzcyk7CgogICAgc2V0VGV4dENvbnRlbnQodGhpcy5zdHlsZUVsXywgJ1xuICAgICAgLicgKyBpZENsYXNzICsgJyB7XG4gICAgICAgIHdpZHRoOiAnICsgd2lkdGggKyAncHg7XG4gICAgICAgIGhlaWdodDogJyArIGhlaWdodCArICdweDtcbiAgICAgIH1cblxuICAgICAgLicgKyBpZENsYXNzICsgJy52anMtZmx1aWQge1xuICAgICAgICBwYWRkaW5nLXRvcDogJyArIHJhdGlvTXVsdGlwbGllciAqIDEwMCArICclO1xuICAgICAgfVxuICAgICcpOwogIH07CgogIC8qKgogICAqIExvYWQvQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHBsYXliYWNrIHtAbGluayBUZWNofSBpbmNsdWRpbmcgZWxlbWVudAogICAqIGFuZCBBUEkgbWV0aG9kcy4gVGhlbiBhcHBlbmQgdGhlIGBUZWNoYCBlbGVtZW50IGluIGBQbGF5ZXJgIGFzIGEgY2hpbGQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gdGVjaE5hbWUKICAgKiAgICAgICAgbmFtZSBvZiB0aGUgcGxheWJhY2sgdGVjaG5vbG9neQogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZQogICAqICAgICAgICB2aWRlbyBzb3VyY2UKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmxvYWRUZWNoXyA9IGZ1bmN0aW9uIGxvYWRUZWNoXyh0ZWNoTmFtZSwgc291cmNlKSB7CiAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAvLyBQYXVzZSBhbmQgcmVtb3ZlIGN1cnJlbnQgcGxheWJhY2sgdGVjaG5vbG9neQogICAgaWYgKHRoaXMudGVjaF8pIHsKICAgICAgdGhpcy51bmxvYWRUZWNoXygpOwogICAgfQoKICAgIHZhciB0aXRsZVRlY2hOYW1lID0gdG9UaXRsZUNhc2UodGVjaE5hbWUpOwogICAgdmFyIGNhbWVsVGVjaE5hbWUgPSB0ZWNoTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHRlY2hOYW1lLnNsaWNlKDEpOwoKICAgIC8vIGdldCByaWQgb2YgdGhlIEhUTUw1IHZpZGVvIHRhZyBhcyBzb29uIGFzIHdlIGFyZSB1c2luZyBhbm90aGVyIHRlY2gKICAgIGlmICh0aXRsZVRlY2hOYW1lICE9PSAnSHRtbDUnICYmIHRoaXMudGFnKSB7CiAgICAgIFRlY2guZ2V0VGVjaCgnSHRtbDUnKS5kaXNwb3NlTWVkaWFFbGVtZW50KHRoaXMudGFnKTsKICAgICAgdGhpcy50YWcucGxheWVyID0gbnVsbDsKICAgICAgdGhpcy50YWcgPSBudWxsOwogICAgfQoKICAgIHRoaXMudGVjaE5hbWVfID0gdGl0bGVUZWNoTmFtZTsKCiAgICAvLyBUdXJuIG9mZiBBUEkgYWNjZXNzIGJlY2F1c2Ugd2UncmUgbG9hZGluZyBhIG5ldyB0ZWNoIHRoYXQgbWlnaHQgbG9hZCBhc3luY2hyb25vdXNseQogICAgdGhpcy5pc1JlYWR5XyA9IGZhbHNlOwoKICAgIC8vIEdyYWIgdGVjaC1zcGVjaWZpYyBvcHRpb25zIGZyb20gcGxheWVyIG9wdGlvbnMgYW5kIGFkZCBzb3VyY2UgYW5kIHBhcmVudCBlbGVtZW50IHRvIHVzZS4KICAgIHZhciB0ZWNoT3B0aW9ucyA9IHsKICAgICAgc291cmNlOiBzb3VyY2UsCiAgICAgICduYXRpdmVDb250cm9sc0ZvclRvdWNoJzogdGhpcy5vcHRpb25zXy5uYXRpdmVDb250cm9sc0ZvclRvdWNoLAogICAgICAncGxheWVySWQnOiB0aGlzLmlkKCksCiAgICAgICd0ZWNoSWQnOiB0aGlzLmlkKCkgKyAnXycgKyB0aXRsZVRlY2hOYW1lICsgJ19hcGknLAogICAgICAnYXV0b3BsYXknOiB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5LAogICAgICAncGxheXNpbmxpbmUnOiB0aGlzLm9wdGlvbnNfLnBsYXlzaW5saW5lLAogICAgICAncHJlbG9hZCc6IHRoaXMub3B0aW9uc18ucHJlbG9hZCwKICAgICAgJ2xvb3AnOiB0aGlzLm9wdGlvbnNfLmxvb3AsCiAgICAgICdtdXRlZCc6IHRoaXMub3B0aW9uc18ubXV0ZWQsCiAgICAgICdwb3N0ZXInOiB0aGlzLnBvc3RlcigpLAogICAgICAnbGFuZ3VhZ2UnOiB0aGlzLmxhbmd1YWdlKCksCiAgICAgICdwbGF5ZXJFbEluZ2VzdCc6IHRoaXMucGxheWVyRWxJbmdlc3RfIHx8IGZhbHNlLAogICAgICAndnR0LmpzJzogdGhpcy5vcHRpb25zX1sndnR0LmpzJ10KICAgIH07CgogICAgQUxMLm5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUkJDEpIHsKICAgICAgdmFyIHByb3BzID0gQUxMW25hbWUkJDFdOwoKICAgICAgdGVjaE9wdGlvbnNbcHJvcHMuZ2V0dGVyTmFtZV0gPSBfdGhpczJbcHJvcHMucHJpdmF0ZU5hbWVdOwogICAgfSk7CgogICAgYXNzaWduKHRlY2hPcHRpb25zLCB0aGlzLm9wdGlvbnNfW3RpdGxlVGVjaE5hbWVdKTsKICAgIGFzc2lnbih0ZWNoT3B0aW9ucywgdGhpcy5vcHRpb25zX1tjYW1lbFRlY2hOYW1lXSk7CiAgICBhc3NpZ24odGVjaE9wdGlvbnMsIHRoaXMub3B0aW9uc19bdGVjaE5hbWUudG9Mb3dlckNhc2UoKV0pOwoKICAgIGlmICh0aGlzLnRhZykgewogICAgICB0ZWNoT3B0aW9ucy50YWcgPSB0aGlzLnRhZzsKICAgIH0KCiAgICBpZiAoc291cmNlICYmIHNvdXJjZS5zcmMgPT09IHRoaXMuY2FjaGVfLnNyYyAmJiB0aGlzLmNhY2hlXy5jdXJyZW50VGltZSA+IDApIHsKICAgICAgdGVjaE9wdGlvbnMuc3RhcnRUaW1lID0gdGhpcy5jYWNoZV8uY3VycmVudFRpbWU7CiAgICB9CgogICAgLy8gSW5pdGlhbGl6ZSB0ZWNoIGluc3RhbmNlCiAgICB2YXIgVGVjaENsYXNzID0gVGVjaC5nZXRUZWNoKHRlY2hOYW1lKTsKCiAgICBpZiAoIVRlY2hDbGFzcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFRlY2ggbmFtZWQgXCcnICsgdGl0bGVUZWNoTmFtZSArICdcJyBleGlzdHMhIFwnJyArIHRpdGxlVGVjaE5hbWUgKyAnXCcgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdmlkZW9qcy5yZWdpc3RlclRlY2goKVwnJyk7CiAgICB9CgogICAgdGhpcy50ZWNoXyA9IG5ldyBUZWNoQ2xhc3ModGVjaE9wdGlvbnMpOwoKICAgIC8vIHBsYXllci50cmlnZ2VyUmVhZHkgaXMgYWx3YXlzIGFzeW5jLCBzbyBkb24ndCBuZWVkIHRoaXMgdG8gYmUgYXN5bmMKICAgIHRoaXMudGVjaF8ucmVhZHkoYmluZCh0aGlzLCB0aGlzLmhhbmRsZVRlY2hSZWFkeV8pLCB0cnVlKTsKCiAgICB0ZXh0VHJhY2tDb252ZXJ0ZXIuanNvblRvVGV4dFRyYWNrcyh0aGlzLnRleHRUcmFja3NKc29uXyB8fCBbXSwgdGhpcy50ZWNoXyk7CgogICAgLy8gTGlzdGVuIHRvIGFsbCBIVE1MNS1kZWZpbmVkIGV2ZW50cyBhbmQgdHJpZ2dlciB0aGVtIG9uIHRoZSBwbGF5ZXIKICAgIFRFQ0hfRVZFTlRTX1JFVFJJR0dFUi5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkgewogICAgICBfdGhpczIub24oX3RoaXMyLnRlY2hfLCBldmVudCwgX3RoaXMyWydoYW5kbGVUZWNoJyArIHRvVGl0bGVDYXNlKGV2ZW50KSArICdfJ10pOwogICAgfSk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2Fkc3RhcnQnLCB0aGlzLmhhbmRsZVRlY2hMb2FkU3RhcnRfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3dhaXRpbmcnLCB0aGlzLmhhbmRsZVRlY2hXYWl0aW5nXyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdjYW5wbGF5JywgdGhpcy5oYW5kbGVUZWNoQ2FuUGxheV8pOwogICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnY2FucGxheXRocm91Z2gnLCB0aGlzLmhhbmRsZVRlY2hDYW5QbGF5VGhyb3VnaF8pOwogICAgdGhpcy5vbih0aGlzLnRlY2hfLCAncGxheWluZycsIHRoaXMuaGFuZGxlVGVjaFBsYXlpbmdfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2VuZGVkJywgdGhpcy5oYW5kbGVUZWNoRW5kZWRfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3NlZWtpbmcnLCB0aGlzLmhhbmRsZVRlY2hTZWVraW5nXyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzZWVrZWQnLCB0aGlzLmhhbmRsZVRlY2hTZWVrZWRfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3BsYXknLCB0aGlzLmhhbmRsZVRlY2hQbGF5Xyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdmaXJzdHBsYXknLCB0aGlzLmhhbmRsZVRlY2hGaXJzdFBsYXlfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3BhdXNlJywgdGhpcy5oYW5kbGVUZWNoUGF1c2VfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoRHVyYXRpb25DaGFuZ2VfKTsKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLmhhbmRsZVRlY2hGdWxsc2NyZWVuQ2hhbmdlXyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdlcnJvcicsIHRoaXMuaGFuZGxlVGVjaEVycm9yXyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2FkZWRtZXRhZGF0YScsIHRoaXMudXBkYXRlU3R5bGVFbF8pOwogICAgdGhpcy5vbih0aGlzLnRlY2hfLCAncG9zdGVyY2hhbmdlJywgdGhpcy5oYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0ZXh0ZGF0YScsIHRoaXMuaGFuZGxlVGVjaFRleHREYXRhXyk7CgogICAgdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKHRoaXMudGVjaEdldF8oJ2NvbnRyb2xzJykpOwoKICAgIGlmICh0aGlzLmNvbnRyb2xzKCkgJiYgIXRoaXMudXNpbmdOYXRpdmVDb250cm9scygpKSB7CiAgICAgIHRoaXMuYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpOwogICAgfQoKICAgIC8vIEFkZCB0aGUgdGVjaCBlbGVtZW50IGluIHRoZSBET00gaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHRoZXJlCiAgICAvLyBNYWtlIHN1cmUgdG8gbm90IGluc2VydCB0aGUgb3JpZ2luYWwgdmlkZW8gZWxlbWVudCBpZiB1c2luZyBIdG1sNQogICAgaWYgKHRoaXMudGVjaF8uZWwoKS5wYXJlbnROb2RlICE9PSB0aGlzLmVsKCkgJiYgKHRpdGxlVGVjaE5hbWUgIT09ICdIdG1sNScgfHwgIXRoaXMudGFnKSkgewogICAgICBwcmVwZW5kVG8odGhpcy50ZWNoXy5lbCgpLCB0aGlzLmVsKCkpOwogICAgfQoKICAgIC8vIEdldCByaWQgb2YgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZyByZWZlcmVuY2UgYWZ0ZXIgdGhlIGZpcnN0IHRlY2ggaXMgbG9hZGVkCiAgICBpZiAodGhpcy50YWcpIHsKICAgICAgdGhpcy50YWcucGxheWVyID0gbnVsbDsKICAgICAgdGhpcy50YWcgPSBudWxsOwogICAgfQogIH07CgogIC8qKgogICAqIFVubG9hZCBhbmQgZGlzcG9zZSBvZiB0aGUgY3VycmVudCBwbGF5YmFjayB7QGxpbmsgVGVjaH0uCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS51bmxvYWRUZWNoXyA9IGZ1bmN0aW9uIHVubG9hZFRlY2hfKCkgewogICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgLy8gU2F2ZSB0aGUgY3VycmVudCB0ZXh0IHRyYWNrcyBzbyB0aGF0IHdlIGNhbiByZXVzZSB0aGUgc2FtZSB0ZXh0IHRyYWNrcyB3aXRoIHRoZSBuZXh0IHRlY2gKICAgIEFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7CiAgICAgIHZhciBwcm9wcyA9IEFMTFtuYW1lJCQxXTsKCiAgICAgIF90aGlzM1twcm9wcy5wcml2YXRlTmFtZV0gPSBfdGhpczNbcHJvcHMuZ2V0dGVyTmFtZV0oKTsKICAgIH0pOwogICAgdGhpcy50ZXh0VHJhY2tzSnNvbl8gPSB0ZXh0VHJhY2tDb252ZXJ0ZXIudGV4dFRyYWNrc1RvSnNvbih0aGlzLnRlY2hfKTsKCiAgICB0aGlzLmlzUmVhZHlfID0gZmFsc2U7CgogICAgdGhpcy50ZWNoXy5kaXNwb3NlKCk7CgogICAgdGhpcy50ZWNoXyA9IGZhbHNlOwogIH07CgogIC8qKgogICAqIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB7QGxpbmsgVGVjaH0uCiAgICogSXQgd2lsbCBwcmludCBhIHdhcm5pbmcgYnkgZGVmYXVsdCBhYm91dCB0aGUgZGFuZ2VyIG9mIHVzaW5nIHRoZSB0ZWNoIGRpcmVjdGx5CiAgICogYnV0IGFueSBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCBpbiB3aWxsIHNpbGVuY2UgdGhlIHdhcm5pbmcuCiAgICoKICAgKiBAcGFyYW0geyp9IFtzYWZldHldCiAgICogICAgICAgIEFueXRoaW5nIHBhc3NlZCBpbiB0byBzaWxlbmNlIHRoZSB3YXJuaW5nCiAgICoKICAgKiBAcmV0dXJuIHtUZWNofQogICAqICAgICAgICAgVGhlIFRlY2gKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUudGVjaCA9IGZ1bmN0aW9uIHRlY2goc2FmZXR5KSB7CiAgICBpZiAoc2FmZXR5ID09PSB1bmRlZmluZWQpIHsKICAgICAgbG9nJDEud2Fybih0c21sKF90ZW1wbGF0ZU9iamVjdCQxKSk7CiAgICB9CgogICAgcmV0dXJuIHRoaXMudGVjaF87CiAgfTsKCiAgLyoqCiAgICogU2V0IHVwIGNsaWNrIGFuZCB0b3VjaCBsaXN0ZW5lcnMgZm9yIHRoZSBwbGF5YmFjayBlbGVtZW50CiAgICoKICAgKiAtIE9uIGRlc2t0b3BzOiBhIGNsaWNrIG9uIHRoZSB2aWRlbyBpdHNlbGYgd2lsbCB0b2dnbGUgcGxheWJhY2sKICAgKiAtIE9uIG1vYmlsZSBkZXZpY2VzOiBhIGNsaWNrIG9uIHRoZSB2aWRlbyB0b2dnbGVzIGNvbnRyb2xzCiAgICogICB3aGljaCBpcyBkb25lIGJ5IHRvZ2dsaW5nIHRoZSB1c2VyIHN0YXRlIGJldHdlZW4gYWN0aXZlIGFuZAogICAqICAgaW5hY3RpdmUKICAgKiAtIEEgdGFwIGNhbiBzaWduYWwgdGhhdCBhIHVzZXIgaGFzIGJlY29tZSBhY3RpdmUgb3IgaGFzIGJlY29tZSBpbmFjdGl2ZQogICAqICAgZS5nLiBhIHF1aWNrIHRhcCBvbiBhbiBpUGhvbmUgbW92aWUgc2hvdWxkIHJldmVhbCB0aGUgY29udHJvbHMuIEFub3RoZXIKICAgKiAgIHF1aWNrIHRhcCBzaG91bGQgaGlkZSB0aGVtIGFnYWluIChzaWduYWxpbmcgdGhlIHVzZXIgaXMgaW4gYW4gaW5hY3RpdmUKICAgKiAgIHZpZXdpbmcgc3RhdGUpCiAgICogLSBJbiBhZGRpdGlvbiB0byB0aGlzLCB3ZSBzdGlsbCB3YW50IHRoZSB1c2VyIHRvIGJlIGNvbnNpZGVyZWQgaW5hY3RpdmUgYWZ0ZXIKICAgKiAgIGEgZmV3IHNlY29uZHMgb2YgaW5hY3Rpdml0eS4KICAgKgogICAqID4gTm90ZTogdGhlIG9ubHkgcGFydCBvZiBpT1MgaW50ZXJhY3Rpb24gd2UgY2FuJ3QgbWltaWMgd2l0aCB0aGlzIHNldHVwCiAgICogaXMgYSB0b3VjaCBhbmQgaG9sZCBvbiB0aGUgdmlkZW8gZWxlbWVudCBjb3VudGluZyBhcyBhY3Rpdml0eSBpbiBvcmRlciB0bwogICAqIGtlZXAgdGhlIGNvbnRyb2xzIHNob3dpbmcsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBhbiBpc3N1ZS4gQSB0b3VjaCBhbmQgaG9sZAogICAqIG9uIGFueSBjb250cm9scyB3aWxsIHN0aWxsIGtlZXAgdGhlIHVzZXIgYWN0aXZlCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5hZGRUZWNoQ29udHJvbHNMaXN0ZW5lcnNfID0gZnVuY3Rpb24gYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpIHsKICAgIC8vIE1ha2Ugc3VyZSB0byByZW1vdmUgYWxsIHRoZSBwcmV2aW91cyBsaXN0ZW5lcnMgaW4gY2FzZSB3ZSBhcmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgogICAgdGhpcy5yZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCk7CgogICAgLy8gU29tZSBicm93c2VycyAoQ2hyb21lICYgSUUpIGRvbid0IHRyaWdnZXIgYSBjbGljayBvbiBhIGZsYXNoIHN3ZiwgYnV0IGRvCiAgICAvLyB0cmlnZ2VyIG1vdXNlZG93bi91cC4KICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ0NDU2Mi9qYXZhc2NyaXB0LW9uY2xpY2stZXZlbnQtb3Zlci1mbGFzaC1vYmplY3QKICAgIC8vIEFueSB0b3VjaCBldmVudHMgYXJlIHNldCB0byBibG9jayB0aGUgbW91c2Vkb3duIGV2ZW50IGZyb20gaGFwcGVuaW5nCiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRlY2hDbGlja18pOwoKICAgIC8vIElmIHRoZSBjb250cm9scyB3ZXJlIGhpZGRlbiB3ZSBkb24ndCB3YW50IHRoYXQgdG8gY2hhbmdlIHdpdGhvdXQgYSB0YXAgZXZlbnQKICAgIC8vIHNvIHdlJ2xsIGNoZWNrIGlmIHRoZSBjb250cm9scyB3ZXJlIGFscmVhZHkgc2hvd2luZyBiZWZvcmUgcmVwb3J0aW5nIHVzZXIKICAgIC8vIGFjdGl2aXR5CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUZWNoVG91Y2hTdGFydF8pOwogICAgdGhpcy5vbih0aGlzLnRlY2hfLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUZWNoVG91Y2hNb3ZlXyk7CiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVGVjaFRvdWNoRW5kXyk7CgogICAgLy8gVGhlIHRhcCBsaXN0ZW5lciBuZWVkcyB0byBjb21lIGFmdGVyIHRoZSB0b3VjaGVuZCBsaXN0ZW5lciBiZWNhdXNlIHRoZSB0YXAKICAgIC8vIGxpc3RlbmVyIGNhbmNlbHMgb3V0IGFueSByZXBvcnRlZFVzZXJBY3Rpdml0eSB3aGVuIHNldHRpbmcgdXNlckFjdGl2ZShmYWxzZSkKICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3RhcCcsIHRoaXMuaGFuZGxlVGVjaFRhcF8pOwogIH07CgogIC8qKgogICAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIHVzZWQgZm9yIGNsaWNrIGFuZCB0YXAgY29udHJvbHMuIFRoaXMgaXMgbmVlZGVkIGZvcgogICAqIHRvZ2dsaW5nIHRvIGNvbnRyb2xzIGRpc2FibGVkLCB3aGVyZSBhIHRhcC90b3VjaCBzaG91bGQgZG8gbm90aGluZy4KICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18gPSBmdW5jdGlvbiByZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCkgewogICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBqdXN0IHVzZSBgdGhpcy5vZmYoKWAgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBvdGhlciBuZWVkZWQKICAgIC8vIGxpc3RlbmVycyBhZGRlZCBieSB0ZWNocyB0aGF0IGV4dGVuZCB0aGlzLgogICAgdGhpcy5vZmYodGhpcy50ZWNoXywgJ3RhcCcsIHRoaXMuaGFuZGxlVGVjaFRhcF8pOwogICAgdGhpcy5vZmYodGhpcy50ZWNoXywgJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaFN0YXJ0Xyk7CiAgICB0aGlzLm9mZih0aGlzLnRlY2hfLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUZWNoVG91Y2hNb3ZlXyk7CiAgICB0aGlzLm9mZih0aGlzLnRlY2hfLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaEVuZF8pOwogICAgdGhpcy5vZmYodGhpcy50ZWNoXywgJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVGVjaENsaWNrXyk7CiAgfTsKCiAgLyoqCiAgICogUGxheWVyIHdhaXRzIGZvciB0aGUgdGVjaCB0byBiZSByZWFkeQogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFJlYWR5XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hSZWFkeV8oKSB7CiAgICB0aGlzLnRyaWdnZXJSZWFkeSgpOwoKICAgIC8vIEtlZXAgdGhlIHNhbWUgdm9sdW1lIGFzIGJlZm9yZQogICAgaWYgKHRoaXMuY2FjaGVfLnZvbHVtZSkgewogICAgICB0aGlzLnRlY2hDYWxsXygnc2V0Vm9sdW1lJywgdGhpcy5jYWNoZV8udm9sdW1lKTsKICAgIH0KCiAgICAvLyBMb29rIGlmIHRoZSB0ZWNoIGZvdW5kIGEgaGlnaGVyIHJlc29sdXRpb24gcG9zdGVyIHdoaWxlIGxvYWRpbmcKICAgIHRoaXMuaGFuZGxlVGVjaFBvc3RlckNoYW5nZV8oKTsKCiAgICAvLyBVcGRhdGUgdGhlIGR1cmF0aW9uIGlmIGF2YWlsYWJsZQogICAgdGhpcy5oYW5kbGVUZWNoRHVyYXRpb25DaGFuZ2VfKCk7CgogICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgYm90aCBoYXZlIGlzc3VlcyB3aXRoIGF1dG9wbGF5LgogICAgLy8gSW4gU2FmYXJpICg1LjEuMSksIHdoZW4gd2UgbW92ZSB0aGUgdmlkZW8gZWxlbWVudCBpbnRvIHRoZSBjb250YWluZXIgZGl2LCBhdXRvcGxheSBkb2Vzbid0IHdvcmsuCiAgICAvLyBJbiBDaHJvbWUgKDE1KSwgaWYgeW91IGhhdmUgYXV0b3BsYXkgKyBhIHBvc3RlciArIG5vIGNvbnRyb2xzLCB0aGUgdmlkZW8gZ2V0cyBoaWRkZW4gKGJ1dCBhdWRpbyBwbGF5cykKICAgIC8vIFRoaXMgZml4ZXMgYm90aCBpc3N1ZXMuIE5lZWQgdG8gd2FpdCBmb3IgQVBJLCBzbyBpdCB1cGRhdGVzIGRpc3BsYXlzIGNvcnJlY3RseQogICAgaWYgKCh0aGlzLnNyYygpIHx8IHRoaXMuY3VycmVudFNyYygpKSAmJiB0aGlzLnRhZyAmJiB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5ICYmIHRoaXMucGF1c2VkKCkpIHsKICAgICAgdHJ5IHsKICAgICAgICAvLyBDaHJvbWUgRml4LiBGaXhlZCBpbiBDaHJvbWUgdjE2LgogICAgICAgIGRlbGV0ZSB0aGlzLnRhZy5wb3N0ZXI7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBsb2ckMSgnZGVsZXRpbmcgdGFnLnBvc3RlciB0aHJvd3MgaW4gc29tZSBicm93c2VycycsIGUpOwogICAgICB9CiAgICB9CiAgfTsKCiAgLyoqCiAgICogUmV0cmlnZ2VyIHRoZSBgbG9hZHN0YXJ0YCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4gVGhpcwogICAqIGZ1bmN0aW9uIHdpbGwgYWxzbyB0cmlnZ2VyIHtAbGluayBQbGF5ZXIjZmlyc3RwbGF5fSBpZiBpdCBpcyB0aGUgZmlyc3QgbG9hZHN0YXJ0CiAgICogZm9yIGEgdmlkZW8uCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI2xvYWRzdGFydAogICAqIEBmaXJlcyBQbGF5ZXIjZmlyc3RwbGF5CiAgICogQGxpc3RlbnMgVGVjaCNsb2Fkc3RhcnQKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoTG9hZFN0YXJ0XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hMb2FkU3RhcnRfKCkgewogICAgLy8gVE9ETzogVXBkYXRlIHRvIHVzZSBgZW1wdGllZGAgZXZlbnQgaW5zdGVhZC4gU2VlICMxMjc3LgoKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lbmRlZCcpOwogICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNlZWtpbmcnKTsKCiAgICAvLyByZXNldCB0aGUgZXJyb3Igc3RhdGUKICAgIHRoaXMuZXJyb3IobnVsbCk7CgogICAgLy8gSWYgaXQncyBhbHJlYWR5IHBsYXlpbmcgd2Ugd2FudCB0byB0cmlnZ2VyIGEgZmlyc3RwbGF5IGV2ZW50IG5vdy4KICAgIC8vIFRoZSBmaXJzdHBsYXkgZXZlbnQgcmVsaWVzIG9uIGJvdGggdGhlIHBsYXkgYW5kIGxvYWRzdGFydCBldmVudHMKICAgIC8vIHdoaWNoIGNhbiBoYXBwZW4gaW4gYW55IG9yZGVyIGZvciBhIG5ldyBzb3VyY2UKICAgIGlmICghdGhpcy5wYXVzZWQoKSkgewogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbiB0aGUgdXNlciBhZ2VudCBiZWdpbnMgbG9va2luZyBmb3IgbWVkaWEgZGF0YQogICAgICAgKgogICAgICAgKiBAZXZlbnQgUGxheWVyI2xvYWRzdGFydAogICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoJ2xvYWRzdGFydCcpOwogICAgICB0aGlzLnRyaWdnZXIoJ2ZpcnN0cGxheScpOwogICAgfSBlbHNlIHsKICAgICAgLy8gcmVzZXQgdGhlIGhhc1N0YXJ0ZWQgc3RhdGUKICAgICAgdGhpcy5oYXNTdGFydGVkKGZhbHNlKTsKICAgICAgdGhpcy50cmlnZ2VyKCdsb2Fkc3RhcnQnKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBBZGQvcmVtb3ZlIHRoZSB2anMtaGFzLXN0YXJ0ZWQgY2xhc3MKICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZmlyc3RwbGF5CiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVlc3QKICAgKiAgICAgICAgLSB0cnVlOiBhZGRzIHRoZSBjbGFzcwogICAqICAgICAgICAtIGZhbHNlOiByZW1vdmUgdGhlIGNsYXNzCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgdGhlIGJvb2xlYW4gdmFsdWUgb2YgaGFzU3RhcnRlZF8KICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFzU3RhcnRlZCA9IGZ1bmN0aW9uIGhhc1N0YXJ0ZWQocmVxdWVzdCkgewogICAgaWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkgewogICAgICAvLyBhY3QgYXMgZ2V0dGVyLCBpZiB3ZSBoYXZlIG5vIHJlcXVlc3QgdG8gY2hhbmdlCiAgICAgIHJldHVybiB0aGlzLmhhc1N0YXJ0ZWRfOwogICAgfQoKICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLmhhc1N0YXJ0ZWRfKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLmhhc1N0YXJ0ZWRfID0gcmVxdWVzdDsKCiAgICBpZiAodGhpcy5oYXNTdGFydGVkXykgewogICAgICB0aGlzLmFkZENsYXNzKCd2anMtaGFzLXN0YXJ0ZWQnKTsKICAgICAgdGhpcy50cmlnZ2VyKCdmaXJzdHBsYXknKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1oYXMtc3RhcnRlZCcpOwogICAgfQogIH07CgogIC8qKgogICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtZWRpYSBiZWdpbnMgb3IgcmVzdW1lcyBwbGF5YmFjawogICAqCiAgICogQHNlZSBbU3BlY117QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS1tZWRpYS1wbGF5fQogICAqIEBmaXJlcyBQbGF5ZXIjcGxheQogICAqIEBsaXN0ZW5zIFRlY2gjcGxheQogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hQbGF5XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hQbGF5XygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lbmRlZCcpOwogICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXBhdXNlZCcpOwogICAgdGhpcy5hZGRDbGFzcygndmpzLXBsYXlpbmcnKTsKCiAgICAvLyBoaWRlIHRoZSBwb3N0ZXIgd2hlbiB0aGUgdXNlciBoaXRzIHBsYXkKICAgIHRoaXMuaGFzU3RhcnRlZCh0cnVlKTsKICAgIC8qKgogICAgICogVHJpZ2dlcmVkIHdoZW5ldmVyIGFuIHtAbGluayBUZWNoI3BsYXl9IGV2ZW50IGhhcHBlbnMuIEluZGljYXRlcyB0aGF0CiAgICAgKiBwbGF5YmFjayBoYXMgc3RhcnRlZCBvciByZXN1bWVkLgogICAgICoKICAgICAqIEBldmVudCBQbGF5ZXIjcGxheQogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCiAgICB0aGlzLnRyaWdnZXIoJ3BsYXknKTsKICB9OwoKICAvKioKICAgKiBSZXRyaWdnZXIgdGhlIGB3YWl0aW5nYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjd2FpdGluZwogICAqIEBsaXN0ZW5zIFRlY2gjd2FpdGluZwogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hXYWl0aW5nXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hXYWl0aW5nXygpIHsKICAgIHZhciBfdGhpczQgPSB0aGlzOwoKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7CiAgICAvKioKICAgICAqIEEgcmVhZHlTdGF0ZSBjaGFuZ2Ugb24gdGhlIERPTSBlbGVtZW50IGhhcyBjYXVzZWQgcGxheWJhY2sgdG8gc3RvcC4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI3dhaXRpbmcKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCd3YWl0aW5nJyk7CiAgICB0aGlzLm9uZSgndGltZXVwZGF0ZScsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIF90aGlzNC5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIFJldHJpZ2dlciB0aGUgYGNhbnBsYXlgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogICAqID4gTm90ZTogVGhpcyBpcyBub3QgY29uc2lzdGVudCBiZXR3ZWVuIGJyb3dzZXJzLiBTZWUgIzEzNTEKICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjY2FucGxheQogICAqIEBsaXN0ZW5zIFRlY2gjY2FucGxheQogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hDYW5QbGF5XyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hDYW5QbGF5XygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7CiAgICAvKioKICAgICAqIFRoZSBtZWRpYSBoYXMgYSByZWFkeVN0YXRlIG9mIEhBVkVfRlVUVVJFX0RBVEEgb3IgZ3JlYXRlci4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI2NhbnBsYXkKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdjYW5wbGF5Jyk7CiAgfTsKCiAgLyoqCiAgICogUmV0cmlnZ2VyIHRoZSBgY2FucGxheXRocm91Z2hgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogICAqCiAgICogQGZpcmVzIFBsYXllciNjYW5wbGF5dGhyb3VnaAogICAqIEBsaXN0ZW5zIFRlY2gjY2FucGxheXRocm91Z2gKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoQ2FuUGxheVRocm91Z2hfID0gZnVuY3Rpb24gaGFuZGxlVGVjaENhblBsYXlUaHJvdWdoXygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7CiAgICAvKioKICAgICAqIFRoZSBtZWRpYSBoYXMgYSByZWFkeVN0YXRlIG9mIEhBVkVfRU5PVUdIX0RBVEEgb3IgZ3JlYXRlci4gVGhpcyBtZWFucyB0aGF0IHRoZQogICAgICogZW50aXJlIG1lZGlhIGZpbGUgY2FuIGJlIHBsYXllZCB3aXRob3V0IGJ1ZmZlcmluZy4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI2NhbnBsYXl0aHJvdWdoCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignY2FucGxheXRocm91Z2gnKTsKICB9OwoKICAvKioKICAgKiBSZXRyaWdnZXIgdGhlIGBwbGF5aW5nYCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjcGxheWluZwogICAqIEBsaXN0ZW5zIFRlY2gjcGxheWluZwogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hQbGF5aW5nXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hQbGF5aW5nXygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7CiAgICAvKioKICAgICAqIFRoZSBtZWRpYSBpcyBubyBsb25nZXIgYmxvY2tlZCBmcm9tIHBsYXliYWNrLCBhbmQgaGFzIHN0YXJ0ZWQgcGxheWluZy4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI3BsYXlpbmcKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdwbGF5aW5nJyk7CiAgfTsKCiAgLyoqCiAgICogUmV0cmlnZ2VyIHRoZSBgc2Vla2luZ2AgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI3NlZWtpbmcKICAgKiBAbGlzdGVucyBUZWNoI3NlZWtpbmcKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoU2Vla2luZ18gPSBmdW5jdGlvbiBoYW5kbGVUZWNoU2Vla2luZ18oKSB7CiAgICB0aGlzLmFkZENsYXNzKCd2anMtc2Vla2luZycpOwogICAgLyoqCiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgcGxheWVyIGlzIGp1bXBpbmcgdG8gYSBuZXcgdGltZQogICAgICoKICAgICAqIEBldmVudCBQbGF5ZXIjc2Vla2luZwogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCiAgICB0aGlzLnRyaWdnZXIoJ3NlZWtpbmcnKTsKICB9OwoKICAvKioKICAgKiBSZXRyaWdnZXIgdGhlIGBzZWVrZWRgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogICAqCiAgICogQGZpcmVzIFBsYXllciNzZWVrZWQKICAgKiBAbGlzdGVucyBUZWNoI3NlZWtlZAogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hTZWVrZWRfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFNlZWtlZF8oKSB7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2Vla2luZycpOwogICAgLyoqCiAgICAgKiBGaXJlZCB3aGVuIHRoZSBwbGF5ZXIgaGFzIGZpbmlzaGVkIGp1bXBpbmcgdG8gYSBuZXcgdGltZQogICAgICoKICAgICAqIEBldmVudCBQbGF5ZXIjc2Vla2VkCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignc2Vla2VkJyk7CiAgfTsKCiAgLyoqCiAgICogUmV0cmlnZ2VyIHRoZSBgZmlyc3RwbGF5YCBldmVudCB0aGF0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHtAbGluayBUZWNofS4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZmlyc3RwbGF5CiAgICogQGxpc3RlbnMgVGVjaCNmaXJzdHBsYXkKICAgKiBAZGVwcmVjYXRlZCBBcyBvZiA2LjAgZmlyc3RwbGF5IGV2ZW50IGlzIGRlcHJlY2F0ZWQuCiAgICogQGRlcHJlY2F0ZWQgQXMgb2YgNi4wIHBhc3NpbmcgdGhlIGBzdGFydHRpbWVgIG9wdGlvbiB0byB0aGUgcGxheWVyIGFuZCB0aGUgZmlyc3RwbGF5IGV2ZW50IGFyZSBkZXByZWNhdGVkLgogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hGaXJzdFBsYXlfID0gZnVuY3Rpb24gaGFuZGxlVGVjaEZpcnN0UGxheV8oKSB7CiAgICAvLyBJZiB0aGUgZmlyc3Qgc3RhcnR0aW1lIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQKICAgIC8vIHRoZW4gd2Ugd2lsbCBzdGFydCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGluIHNlY29uZHMKICAgIGlmICh0aGlzLm9wdGlvbnNfLnN0YXJ0dGltZSkgewogICAgICBsb2ckMS53YXJuKCdQYXNzaW5nIHRoZSBgc3RhcnR0aW1lYCBvcHRpb24gdG8gdGhlIHBsYXllciB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gNi4wJyk7CiAgICAgIHRoaXMuY3VycmVudFRpbWUodGhpcy5vcHRpb25zXy5zdGFydHRpbWUpOwogICAgfQoKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1oYXMtc3RhcnRlZCcpOwogICAgLyoqCiAgICAgKiBGaXJlZCB0aGUgZmlyc3QgdGltZSBhIHZpZGVvIGlzIHBsYXllZC4gTm90IHBhcnQgb2YgdGhlIEhMUyBzcGVjLCBhbmQgdGhpcyBpcwogICAgICogcHJvYmFibHkgbm90IHRoZSBiZXN0IGltcGxlbWVudGF0aW9uIHlldCwgc28gdXNlIHNwYXJpbmdseS4gSWYgeW91IGRvbid0IGhhdmUgYQogICAgICogcmVhc29uIHRvIHByZXZlbnQgcGxheWJhY2ssIHVzZSBgbXlQbGF5ZXIub25lKCdwbGF5Jyk7YCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBldmVudCBQbGF5ZXIjZmlyc3RwbGF5CiAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiA2LjAgZmlyc3RwbGF5IGV2ZW50IGlzIGRlcHJlY2F0ZWQuCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcignZmlyc3RwbGF5Jyk7CiAgfTsKCiAgLyoqCiAgICogUmV0cmlnZ2VyIHRoZSBgcGF1c2VgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogICAqCiAgICogQGZpcmVzIFBsYXllciNwYXVzZQogICAqIEBsaXN0ZW5zIFRlY2gjcGF1c2UKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUGF1c2VfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFBhdXNlXygpIHsKICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wbGF5aW5nJyk7CiAgICB0aGlzLmFkZENsYXNzKCd2anMtcGF1c2VkJyk7CiAgICAvKioKICAgICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtZWRpYSBoYXMgYmVlbiBwYXVzZWQKICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI3BhdXNlCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcigncGF1c2UnKTsKICB9OwoKICAvKioKICAgKiBSZXRyaWdnZXIgdGhlIGBlbmRlZGAgZXZlbnQgdGhhdCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB7QGxpbmsgVGVjaH0uCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI2VuZGVkCiAgICogQGxpc3RlbnMgVGVjaCNlbmRlZAogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hFbmRlZF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoRW5kZWRfKCkgewogICAgdGhpcy5hZGRDbGFzcygndmpzLWVuZGVkJyk7CiAgICBpZiAodGhpcy5vcHRpb25zXy5sb29wKSB7CiAgICAgIHRoaXMuY3VycmVudFRpbWUoMCk7CiAgICAgIHRoaXMucGxheSgpOwogICAgfSBlbHNlIGlmICghdGhpcy5wYXVzZWQoKSkgewogICAgICB0aGlzLnBhdXNlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXJlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIG1lZGlhIHJlc291cmNlIGlzIHJlYWNoZWQgKGN1cnJlbnRUaW1lID09IGR1cmF0aW9uKQogICAgICoKICAgICAqIEBldmVudCBQbGF5ZXIjZW5kZWQKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdlbmRlZCcpOwogIH07CgogIC8qKgogICAqIEZpcmVkIHdoZW4gdGhlIGR1cmF0aW9uIG9mIHRoZSBtZWRpYSByZXNvdXJjZSBpcyBmaXJzdCBrbm93biBvciBjaGFuZ2VkCiAgICoKICAgKiBAbGlzdGVucyBUZWNoI2R1cmF0aW9uY2hhbmdlCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaER1cmF0aW9uQ2hhbmdlXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hEdXJhdGlvbkNoYW5nZV8oKSB7CiAgICB0aGlzLmR1cmF0aW9uKHRoaXMudGVjaEdldF8oJ2R1cmF0aW9uJykpOwogIH07CgogIC8qKgogICAqIEhhbmRsZSBhIGNsaWNrIG9uIHRoZSBtZWRpYSBlbGVtZW50IHRvIHBsYXkvcGF1c2UKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIHRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGlzIGZ1bmN0aW9uIHRvIHRyaWdnZXIKICAgKgogICAqIEBsaXN0ZW5zIFRlY2gjbW91c2Vkb3duCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaENsaWNrXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hDbGlja18oZXZlbnQpIHsKICAgIGlmICghaXNTaW5nbGVMZWZ0Q2xpY2soZXZlbnQpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBXaGVuIGNvbnRyb2xzIGFyZSBkaXNhYmxlZCBhIGNsaWNrIHNob3VsZCBub3QgdG9nZ2xlIHBsYXliYWNrIGJlY2F1c2UKICAgIC8vIHRoZSBjbGljayBpcyBjb25zaWRlcmVkIGEgY29udHJvbAogICAgaWYgKCF0aGlzLmNvbnRyb2xzXykgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHRoaXMucGF1c2VkKCkpIHsKICAgICAgdGhpcy5wbGF5KCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnBhdXNlKCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIGEgdGFwIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBJdCB3aWxsIHRvZ2dsZSB0aGUgdXNlcgogICAqIGFjdGl2aXR5IHN0YXRlLCB3aGljaCBoaWRlcyBhbmQgc2hvd3MgdGhlIGNvbnRyb2xzLgogICAqCiAgICogQGxpc3RlbnMgVGVjaCN0YXAKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVGFwXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUYXBfKCkgewogICAgdGhpcy51c2VyQWN0aXZlKCF0aGlzLnVzZXJBY3RpdmUoKSk7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIHRvdWNoIHRvIHN0YXJ0CiAgICoKICAgKiBAbGlzdGVucyBUZWNoI3RvdWNoc3RhcnQKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVG91Y2hTdGFydF8gPSBmdW5jdGlvbiBoYW5kbGVUZWNoVG91Y2hTdGFydF8oKSB7CiAgICB0aGlzLnVzZXJXYXNBY3RpdmUgPSB0aGlzLnVzZXJBY3RpdmUoKTsKICB9OwoKICAvKioKICAgKiBIYW5kbGUgdG91Y2ggdG8gbW92ZQogICAqCiAgICogQGxpc3RlbnMgVGVjaCN0b3VjaG1vdmUKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVG91Y2hNb3ZlXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUb3VjaE1vdmVfKCkgewogICAgaWYgKHRoaXMudXNlcldhc0FjdGl2ZSkgewogICAgICB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSgpOwogICAgfQogIH07CgogIC8qKgogICAqIEhhbmRsZSB0b3VjaCB0byBlbmQKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIHRoZSB0b3VjaGVuZCBldmVudCB0aGF0IHRyaWdnZXJlZAogICAqICAgICAgICB0aGlzIGZ1bmN0aW9uCiAgICoKICAgKiBAbGlzdGVucyBUZWNoI3RvdWNoZW5kCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaFRvdWNoRW5kXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hUb3VjaEVuZF8oZXZlbnQpIHsKICAgIC8vIFN0b3AgdGhlIG1vdXNlIGV2ZW50cyBmcm9tIGFsc28gaGFwcGVuaW5nCiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIH07CgogIC8qKgogICAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBzd2l0Y2hlcyBpbiBvciBvdXQgb2YgZnVsbHNjcmVlbiBtb2RlCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBsaXN0ZW5zIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2VfID0gZnVuY3Rpb24gaGFuZGxlRnVsbHNjcmVlbkNoYW5nZV8oKSB7CiAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4oKSkgewogICAgICB0aGlzLmFkZENsYXNzKCd2anMtZnVsbHNjcmVlbicpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWZ1bGxzY3JlZW4nKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBuYXRpdmUgY2xpY2sgZXZlbnRzIG9uIHRoZSBTV0YgYXJlbid0IHRyaWdnZXJlZCBvbiBJRTExLCBXaW44LjFSVAogICAqIHVzZSBzdGFnZWNsaWNrIGV2ZW50cyB0cmlnZ2VyZWQgZnJvbSBpbnNpZGUgdGhlIFNXRiBpbnN0ZWFkCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBsaXN0ZW5zIHN0YWdlY2xpY2sKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFuZGxlU3RhZ2VDbGlja18gPSBmdW5jdGlvbiBoYW5kbGVTdGFnZUNsaWNrXygpIHsKICAgIHRoaXMucmVwb3J0VXNlckFjdGl2aXR5KCk7CiAgfTsKCiAgLyoqCiAgICogSGFuZGxlIFRlY2ggRnVsbHNjcmVlbiBDaGFuZ2UKICAgKgogICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR+RXZlbnR9IGV2ZW50CiAgICogICAgICAgIHRoZSBmdWxsc2NyZWVuY2hhbmdlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZnVuY3Rpb24KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhCiAgICogICAgICAgIHRoZSBkYXRhIHRoYXQgd2FzIHNlbnQgd2l0aCB0aGUgZXZlbnQKICAgKgogICAqIEBwcml2YXRlCiAgICogQGxpc3RlbnMgVGVjaCNmdWxsc2NyZWVuY2hhbmdlCiAgICogQGZpcmVzIFBsYXllciNmdWxsc2NyZWVuY2hhbmdlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmhhbmRsZVRlY2hGdWxsc2NyZWVuQ2hhbmdlXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hGdWxsc2NyZWVuQ2hhbmdlXyhldmVudCwgZGF0YSkgewogICAgaWYgKGRhdGEpIHsKICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4oZGF0YS5pc0Z1bGxzY3JlZW4pOwogICAgfQogICAgLyoqCiAgICAgKiBGaXJlZCB3aGVuIGdvaW5nIGluIGFuZCBvdXQgb2YgZnVsbHNjcmVlbi4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2UKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJyk7CiAgfTsKCiAgLyoqCiAgICogRmlyZXMgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGxvYWRpbmcgb2YgYW4gYXVkaW8vdmlkZW8uCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEBsaXN0ZW5zIFRlY2gjZXJyb3IKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaEVycm9yXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hFcnJvcl8oKSB7CiAgICB2YXIgZXJyb3IgPSB0aGlzLnRlY2hfLmVycm9yKCk7CgogICAgdGhpcy5lcnJvcihlcnJvcik7CiAgfTsKCiAgLyoqCiAgICogUmV0cmlnZ2VyIHRoZSBgdGV4dGRhdGFgIGV2ZW50IHRoYXQgd2FzIHRyaWdnZXJlZCBieSB0aGUge0BsaW5rIFRlY2h9LgogICAqCiAgICogQGZpcmVzIFBsYXllciN0ZXh0ZGF0YQogICAqIEBsaXN0ZW5zIFRlY2gjdGV4dGRhdGEKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoVGV4dERhdGFfID0gZnVuY3Rpb24gaGFuZGxlVGVjaFRleHREYXRhXygpIHsKICAgIHZhciBkYXRhID0gbnVsbDsKCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgZGF0YSA9IGFyZ3VtZW50c1sxXTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpcmVzIHdoZW4gd2UgZ2V0IGEgdGV4dGRhdGEgZXZlbnQgZnJvbSB0ZWNoCiAgICAgKgogICAgICogQGV2ZW50IFBsYXllciN0ZXh0ZGF0YQogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCiAgICB0aGlzLnRyaWdnZXIoJ3RleHRkYXRhJywgZGF0YSk7CiAgfTsKCiAgLyoqCiAgICogR2V0IG9iamVjdCBmb3IgY2FjaGVkIHZhbHVlcy4KICAgKgogICAqIEByZXR1cm4ge09iamVjdH0KICAgKiAgICAgICAgIGdldCB0aGUgY3VycmVudCBvYmplY3QgY2FjaGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuZ2V0Q2FjaGUgPSBmdW5jdGlvbiBnZXRDYWNoZSgpIHsKICAgIHJldHVybiB0aGlzLmNhY2hlXzsKICB9OwoKICAvKioKICAgKiBQYXNzIHZhbHVlcyB0byB0aGUgcGxheWJhY2sgdGVjaAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXRob2RdCiAgICogICAgICAgIHRoZSBtZXRob2QgdG8gY2FsbAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IGFyZwogICAqICAgICAgICB0aGUgYXJndW1lbnQgdG8gcGFzcwogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUudGVjaENhbGxfID0gZnVuY3Rpb24gdGVjaENhbGxfKG1ldGhvZCwgYXJnKSB7CiAgICAvLyBJZiBpdCdzIG5vdCByZWFkeSB5ZXQsIGNhbGwgbWV0aG9kIHdoZW4gaXQgaXMKCiAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKG1ldGhvZCBpbiBhbGxvd2VkU2V0dGVycykgewogICAgICAgIHJldHVybiBzZXQkMSh0aGlzLm1pZGRsZXdhcmVfLCB0aGlzLnRlY2hfLCBtZXRob2QsIGFyZyk7CiAgICAgIH0KCiAgICAgIHRyeSB7CiAgICAgICAgaWYgKHRoaXMudGVjaF8pIHsKICAgICAgICAgIHRoaXMudGVjaF9bbWV0aG9kXShhcmcpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGxvZyQxKGUpOwogICAgICAgIHRocm93IGU7CiAgICAgIH0KICAgIH0sIHRydWUpOwogIH07CgogIC8qKgogICAqIEdldCBjYWxscyBjYW4ndCB3YWl0IGZvciB0aGUgdGVjaCwgYW5kIHNvbWV0aW1lcyBkb24ndCBuZWVkIHRvLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZAogICAqICAgICAgICBUZWNoIG1ldGhvZAogICAqCiAgICogQHJldHVybiB7RnVuY3Rpb258dW5kZWZpbmVkfQogICAqICAgICAgICAgdGhlIG1ldGhvZCBvciB1bmRlZmluZWQKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnRlY2hHZXRfID0gZnVuY3Rpb24gdGVjaEdldF8obWV0aG9kKSB7CiAgICBpZiAoIXRoaXMudGVjaF8gfHwgIXRoaXMudGVjaF8uaXNSZWFkeV8pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChtZXRob2QgaW4gYWxsb3dlZEdldHRlcnMpIHsKICAgICAgcmV0dXJuIGdldCQxKHRoaXMubWlkZGxld2FyZV8sIHRoaXMudGVjaF8sIG1ldGhvZCk7CiAgICB9CgogICAgLy8gRmxhc2ggbGlrZXMgdG8gZGllIGFuZCByZWxvYWQgd2hlbiB5b3UgaGlkZSBvciByZXBvc2l0aW9uIGl0LgogICAgLy8gSW4gdGhlc2UgY2FzZXMgdGhlIG9iamVjdCBtZXRob2RzIGdvIGF3YXkgYW5kIHdlIGdldCBlcnJvcnMuCiAgICAvLyBXaGVuIHRoYXQgaGFwcGVucyB3ZSdsbCBjYXRjaCB0aGUgZXJyb3JzIGFuZCBpbmZvcm0gdGVjaCB0aGF0IGl0J3Mgbm90IHJlYWR5IGFueSBtb3JlLgogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMudGVjaF9bbWV0aG9kXSgpOwogICAgfSBjYXRjaCAoZSkgewoKICAgICAgLy8gV2hlbiBidWlsZGluZyBhZGRpdGlvbmFsIHRlY2ggbGlicywgYW4gZXhwZWN0ZWQgbWV0aG9kIG1heSBub3QgYmUgZGVmaW5lZCB5ZXQKICAgICAgaWYgKHRoaXMudGVjaF9bbWV0aG9kXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbG9nJDEoJ1ZpZGVvLmpzOiAnICsgbWV0aG9kICsgJyBtZXRob2Qgbm90IGRlZmluZWQgZm9yICcgKyB0aGlzLnRlY2hOYW1lXyArICcgcGxheWJhY2sgdGVjaG5vbG9neS4nLCBlKTsKICAgICAgICB0aHJvdyBlOwogICAgICB9CgogICAgICAvLyBXaGVuIGEgbWV0aG9kIGlzbid0IGF2YWlsYWJsZSBvbiB0aGUgb2JqZWN0IGl0IHRocm93cyBhIFR5cGVFcnJvcgogICAgICBpZiAoZS5uYW1lID09PSAnVHlwZUVycm9yJykgewogICAgICAgIGxvZyQxKCdWaWRlby5qczogJyArIG1ldGhvZCArICcgdW5hdmFpbGFibGUgb24gJyArIHRoaXMudGVjaE5hbWVfICsgJyBwbGF5YmFjayB0ZWNobm9sb2d5IGVsZW1lbnQuJywgZSk7CiAgICAgICAgdGhpcy50ZWNoXy5pc1JlYWR5XyA9IGZhbHNlOwogICAgICAgIHRocm93IGU7CiAgICAgIH0KCiAgICAgIC8vIElmIGVycm9yIHVua25vd24sIGp1c3QgbG9nIGFuZCB0aHJvdwogICAgICBsb2ckMShlKTsKICAgICAgdGhyb3cgZTsKICAgIH0KICB9OwoKICAvKioKICAgKiBBdHRlbXB0IHRvIGJlZ2luIHBsYXliYWNrIGF0IHRoZSBmaXJzdCBvcHBvcnR1bml0eS4KICAgKgogICAqIEByZXR1cm4ge1Byb21pc2V8dW5kZWZpbmVkfQogICAqICAgICAgICAgUmV0dXJucyBhIGBQcm9taXNlYCBvbmx5IGlmIHRoZSBicm93c2VyIHJldHVybnMgb25lIGFuZCB0aGUgcGxheWVyCiAgICogICAgICAgICBpcyByZWFkeSB0byBiZWdpbiBwbGF5YmFjay4gRm9yIHNvbWUgYnJvd3NlcnMgYW5kIGFsbCBub24tcmVhZHkKICAgKiAgICAgICAgIHNpdHVhdGlvbnMsIHRoaXMgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbiBwbGF5KCkgewogICAgdmFyIF90aGlzNSA9IHRoaXM7CgogICAgLy8gSWYgdGhpcyBpcyBjYWxsZWQgd2hpbGUgd2UgaGF2ZSBhIHBsYXkgcXVldWVkIHVwIG9uIGEgbG9hZHN0YXJ0LCByZW1vdmUKICAgIC8vIHRoYXQgbGlzdGVuZXIgdG8gYXZvaWQgZ2V0dGluZyBpbiBhIHBvdGVudGlhbGx5IGJhZCBzdGF0ZS4KICAgIGlmICh0aGlzLnBsYXlPbkxvYWRzdGFydF8pIHsKICAgICAgdGhpcy5vZmYoJ2xvYWRzdGFydCcsIHRoaXMucGxheU9uTG9hZHN0YXJ0Xyk7CiAgICB9CgogICAgLy8gSWYgdGhlIHBsYXllci90ZWNoIGlzIG5vdCByZWFkeSwgcXVldWUgdXAgYW5vdGhlciBjYWxsIHRvIGBwbGF5KClgIGZvcgogICAgLy8gd2hlbiBpdCBpcy4gVGhpcyB3aWxsIGxvb3AgYmFjayBpbnRvIHRoaXMgbWV0aG9kIGZvciBhbm90aGVyIGF0dGVtcHQgYXQKICAgIC8vIHBsYXliYWNrIHdoZW4gdGhlIHRlY2ggaXMgcmVhZHkuCiAgICBpZiAoIXRoaXMuaXNSZWFkeV8pIHsKCiAgICAgIC8vIEJhaWwgb3V0IGlmIHdlJ3JlIGFscmVhZHkgd2FpdGluZyBmb3IgYHJlYWR5YCEKICAgICAgaWYgKHRoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHRoaXMucGxheVdhaXRpbmdGb3JSZWFkeV8gPSB0cnVlOwogICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICBfdGhpczUucGxheVdhaXRpbmdGb3JSZWFkeV8gPSBmYWxzZTsKICAgICAgICBzaWxlbmNlUHJvbWlzZShfdGhpczUucGxheSgpKTsKICAgICAgfSk7CgogICAgICAvLyBJZiB0aGUgcGxheWVyL3RlY2ggaXMgcmVhZHkgYW5kIHdlIGhhdmUgYSBzb3VyY2UsIHdlIGNhbiBhdHRlbXB0IHBsYXliYWNrLgogICAgfSBlbHNlIGlmICghdGhpcy5jaGFuZ2luZ1NyY18gJiYgKHRoaXMuc3JjKCkgfHwgdGhpcy5jdXJyZW50U3JjKCkpKSB7CiAgICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdwbGF5Jyk7CgogICAgICAvLyBJZiB0aGUgdGVjaCBpcyByZWFkeSwgYnV0IHdlIGRvIG5vdCBoYXZlIGEgc291cmNlLCB3ZSdsbCBuZWVkIHRvIHdhaXQKICAgICAgLy8gZm9yIGJvdGggdGhlIGByZWFkeWAgYW5kIGEgYGxvYWRzdGFydGAgd2hlbiB0aGUgc291cmNlIGlzIGZpbmFsbHkKICAgICAgLy8gcmVzb2x2ZWQgYnkgbWlkZGxld2FyZSBhbmQgc2V0IG9uIHRoZSBwbGF5ZXIuCiAgICAgIC8vCiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGxheSgpYCBpcyBjYWxsZWQgd2hpbGUgY2hhbmdpbmcgc291cmNlcyBvciBiZWZvcmUKICAgICAgLy8gb25lIGhhcyBiZWVuIHNldCBvbiB0aGUgcGxheWVyLgogICAgfSBlbHNlIHsKCiAgICAgIHRoaXMucGxheU9uTG9hZHN0YXJ0XyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBfdGhpczUucGxheU9uTG9hZHN0YXJ0XyA9IG51bGw7CiAgICAgICAgc2lsZW5jZVByb21pc2UoX3RoaXM1LnBsYXkoKSk7CiAgICAgIH07CgogICAgICB0aGlzLm9uZSgnbG9hZHN0YXJ0JywgdGhpcy5wbGF5T25Mb2Fkc3RhcnRfKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBQYXVzZSB0aGUgdmlkZW8gcGxheWJhY2sKICAgKgogICAqIEByZXR1cm4ge1BsYXllcn0KICAgKiAgICAgICAgIEEgcmVmZXJlbmNlIHRvIHRoZSBwbGF5ZXIgb2JqZWN0IHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCBvbgogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uIHBhdXNlKCkgewogICAgdGhpcy50ZWNoQ2FsbF8oJ3BhdXNlJyk7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBwYXVzZWQgb3IgaGFzIHlldCB0byBwbGF5CiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgLSBmYWxzZTogaWYgdGhlIG1lZGlhIGlzIGN1cnJlbnRseSBwbGF5aW5nCiAgICogICAgICAgICAtIHRydWU6IGlmIG1lZGlhIGlzIG5vdCBjdXJyZW50bHkgcGxheWluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5wYXVzZWQgPSBmdW5jdGlvbiBwYXVzZWQoKSB7CiAgICAvLyBUaGUgaW5pdGlhbCBzdGF0ZSBvZiBwYXVzZWQgc2hvdWxkIGJlIHRydWUgKGluIFNhZmFyaSBpdCdzIGFjdHVhbGx5IGZhbHNlKQogICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3BhdXNlZCcpID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTsKICB9OwoKICAvKioKICAgKiBHZXQgYSBUaW1lUmFuZ2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCByYW5nZXMgb2YgdGltZSB0aGF0IHRoZSB1c2VyCiAgICogaGFzIHBsYXllZC4KICAgKgogICAqIEByZXR1cm4ge1RpbWVSYW5nZX0KICAgKiAgICAgICAgIEEgdGltZSByYW5nZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFsbCB0aGUgaW5jcmVtZW50cyBvZiB0aW1lIHRoYXQgaGF2ZQogICAqICAgICAgICAgYmVlbiBwbGF5ZWQuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnBsYXllZCA9IGZ1bmN0aW9uIHBsYXllZCgpIHsKICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdwbGF5ZWQnKSB8fCBjcmVhdGVUaW1lUmFuZ2VzKDAsIDApOwogIH07CgogIC8qKgogICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHVzZXIgaXMgInNjcnViYmluZyIuIFNjcnViYmluZyBpcwogICAqIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgdGhlIHByb2dyZXNzIGJhciBoYW5kbGUgYW5kIGlzCiAgICogZHJhZ2dpbmcgaXQgYWxvbmcgdGhlIHByb2dyZXNzIGJhci4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU2NydWJiaW5nXQogICAqICAgICAgICB3ZXRoZXIgdGhlIHVzZXIgaXMgb3IgaXMgbm90IHNjcnViYmluZwogICAqCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiAgICAgICAgIFRoZSB2YWx1ZSBvZiBzY3J1YmJpbmcgd2hlbiBnZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnNjcnViYmluZyA9IGZ1bmN0aW9uIHNjcnViYmluZyhpc1NjcnViYmluZykgewogICAgaWYgKHR5cGVvZiBpc1NjcnViYmluZyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuIHRoaXMuc2NydWJiaW5nXzsKICAgIH0KICAgIHRoaXMuc2NydWJiaW5nXyA9ICEhaXNTY3J1YmJpbmc7CgogICAgaWYgKGlzU2NydWJiaW5nKSB7CiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zY3J1YmJpbmcnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zY3J1YmJpbmcnKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IHRpbWUgKGluIHNlY29uZHMpCiAgICoKICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtzZWNvbmRzXQogICAqICAgICAgICBUaGUgdGltZSB0byBzZWVrIHRvIGluIHNlY29uZHMKICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIC0gdGhlIGN1cnJlbnQgdGltZSBpbiBzZWNvbmRzIHdoZW4gZ2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5jdXJyZW50VGltZSA9IGZ1bmN0aW9uIGN1cnJlbnRUaW1lKHNlY29uZHMpIHsKICAgIGlmICh0eXBlb2Ygc2Vjb25kcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgaWYgKHNlY29uZHMgPCAwKSB7CiAgICAgICAgc2Vjb25kcyA9IDA7CiAgICAgIH0KICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldEN1cnJlbnRUaW1lJywgc2Vjb25kcyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBjYWNoZSBsYXN0IGN1cnJlbnRUaW1lIGFuZCByZXR1cm4uIGRlZmF1bHQgdG8gMCBzZWNvbmRzCiAgICAvLwogICAgLy8gQ2FjaGluZyB0aGUgY3VycmVudFRpbWUgaXMgbWVhbnQgdG8gcHJldmVudCBhIG1hc3NpdmUgYW1vdW50IG9mIHJlYWRzIG9uIHRoZSB0ZWNoJ3MKICAgIC8vIGN1cnJlbnRUaW1lIHdoZW4gc2NydWJiaW5nLCBidXQgbWF5IG5vdCBwcm92aWRlIG11Y2ggcGVyZm9ybWFuY2UgYmVuZWZpdCBhZnRlcmFsbC4KICAgIC8vIFNob3VsZCBiZSB0ZXN0ZWQuIEFsc28gc29tZXRoaW5nIGhhcyB0byByZWFkIHRoZSBhY3R1YWwgY3VycmVudCB0aW1lIG9yIHRoZSBjYWNoZSB3aWxsCiAgICAvLyBuZXZlciBnZXQgdXBkYXRlZC4KICAgIHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lID0gdGhpcy50ZWNoR2V0XygnY3VycmVudFRpbWUnKSB8fCAwOwogICAgcmV0dXJuIHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lOwogIH07CgogIC8qKgogICAqIE5vcm1hbGx5IGdldHMgdGhlIGxlbmd0aCBpbiB0aW1lIG9mIHRoZSB2aWRlbyBpbiBzZWNvbmRzOwogICAqIGluIGFsbCBidXQgdGhlIHJhcmVzdCB1c2UgY2FzZXMgYW4gYXJndW1lbnQgd2lsbCBOT1QgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QKICAgKgogICAqID4gKipOT1RFKio6IFRoZSB2aWRlbyBtdXN0IGhhdmUgc3RhcnRlZCBsb2FkaW5nIGJlZm9yZSB0aGUgZHVyYXRpb24gY2FuIGJlCiAgICoga25vd24sIGFuZCBpbiB0aGUgY2FzZSBvZiBGbGFzaCwgbWF5IG5vdCBiZSBrbm93biB1bnRpbCB0aGUgdmlkZW8gc3RhcnRzCiAgICogcGxheWluZy4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZHVyYXRpb25jaGFuZ2UKICAgKgogICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kc10KICAgKiAgICAgICAgVGhlIGR1cmF0aW9uIG9mIHRoZSB2aWRlbyB0byBzZXQgaW4gc2Vjb25kcwogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgLSBUaGUgZHVyYXRpb24gb2YgdGhlIHZpZGVvIGluIHNlY29uZHMgd2hlbiBnZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24gZHVyYXRpb24oc2Vjb25kcykgewogICAgaWYgKHNlY29uZHMgPT09IHVuZGVmaW5lZCkgewogICAgICAvLyByZXR1cm4gTmFOIGlmIHRoZSBkdXJhdGlvbiBpcyBub3Qga25vd24KICAgICAgcmV0dXJuIHRoaXMuY2FjaGVfLmR1cmF0aW9uICE9PSB1bmRlZmluZWQgPyB0aGlzLmNhY2hlXy5kdXJhdGlvbiA6IE5hTjsKICAgIH0KCiAgICBzZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTsKCiAgICAvLyBTdGFuZGFyZGl6ZSBvbiBJbmlmaXR5IGZvciBzaWduYWxpbmcgdmlkZW8gaXMgbGl2ZQogICAgaWYgKHNlY29uZHMgPCAwKSB7CiAgICAgIHNlY29uZHMgPSBJbmZpbml0eTsKICAgIH0KCiAgICBpZiAoc2Vjb25kcyAhPT0gdGhpcy5jYWNoZV8uZHVyYXRpb24pIHsKICAgICAgLy8gQ2FjaGUgdGhlIGxhc3Qgc2V0IHZhbHVlIGZvciBvcHRpbWl6ZWQgc2NydWJiaW5nIChlc3AuIEZsYXNoKQogICAgICB0aGlzLmNhY2hlXy5kdXJhdGlvbiA9IHNlY29uZHM7CgogICAgICBpZiAoc2Vjb25kcyA9PT0gSW5maW5pdHkpIHsKICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtbGl2ZScpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1saXZlJyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBldmVudCBQbGF5ZXIjZHVyYXRpb25jaGFuZ2UKICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgKi8KICAgICAgdGhpcy50cmlnZ2VyKCdkdXJhdGlvbmNoYW5nZScpOwogICAgfQogIH07CgogIC8qKgogICAqIENhbGN1bGF0ZXMgaG93IG11Y2ggdGltZSBpcyBsZWZ0IGluIHRoZSB2aWRlby4gTm90IHBhcnQKICAgKiBvZiB0aGUgbmF0aXZlIHZpZGVvIEFQSS4KICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIFRoZSB0aW1lIHJlbWFpbmluZyBpbiBzZWNvbmRzCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnJlbWFpbmluZ1RpbWUgPSBmdW5jdGlvbiByZW1haW5pbmdUaW1lKCkgewogICAgcmV0dXJuIHRoaXMuZHVyYXRpb24oKSAtIHRoaXMuY3VycmVudFRpbWUoKTsKICB9OwoKICAvKioKICAgKiBBIHJlbWFpbmluZyB0aW1lIGZ1bmN0aW9uIHRoYXQgaXMgaW50ZW50ZWQgdG8gYmUgdXNlZCB3aGVuCiAgICogdGhlIHRpbWUgaXMgdG8gYmUgZGlzcGxheWVkIGRpcmVjdGx5IHRvIHRoZSB1c2VyLgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgVGhlIHJvdW5kZWQgdGltZSByZW1haW5pbmcgaW4gc2Vjb25kcwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5yZW1haW5pbmdUaW1lRGlzcGxheSA9IGZ1bmN0aW9uIHJlbWFpbmluZ1RpbWVEaXNwbGF5KCkgewogICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5kdXJhdGlvbigpKSAtIE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSgpKTsKICB9OwoKICAvLwogIC8vIEtpbmQgb2YgbGlrZSBhbiBhcnJheSBvZiBwb3J0aW9ucyBvZiB0aGUgdmlkZW8gdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZC4KCiAgLyoqCiAgICogR2V0IGEgVGltZVJhbmdlIG9iamVjdCB3aXRoIGFuIGFycmF5IG9mIHRoZSB0aW1lcyBvZiB0aGUgdmlkZW8KICAgKiB0aGF0IGhhdmUgYmVlbiBkb3dubG9hZGVkLiBJZiB5b3UganVzdCB3YW50IHRoZSBwZXJjZW50IG9mIHRoZQogICAqIHZpZGVvIHRoYXQncyBiZWVuIGRvd25sb2FkZWQsIHVzZSBidWZmZXJlZFBlcmNlbnQuCiAgICoKICAgKiBAc2VlIFtCdWZmZXJlZCBTcGVjXXtAbGluayBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL3ZpZGVvLmh0bWwjZG9tLW1lZGlhLWJ1ZmZlcmVkfQogICAqCiAgICogQHJldHVybiB7VGltZVJhbmdlfQogICAqICAgICAgICAgQSBtb2NrIFRpbWVSYW5nZSBvYmplY3QgKGZvbGxvd2luZyBIVE1MIHNwZWMpCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmJ1ZmZlcmVkID0gZnVuY3Rpb24gYnVmZmVyZWQoKSB7CiAgICB2YXIgYnVmZmVyZWQgPSB0aGlzLnRlY2hHZXRfKCdidWZmZXJlZCcpOwoKICAgIGlmICghYnVmZmVyZWQgfHwgIWJ1ZmZlcmVkLmxlbmd0aCkgewogICAgICBidWZmZXJlZCA9IGNyZWF0ZVRpbWVSYW5nZXMoMCwgMCk7CiAgICB9CgogICAgcmV0dXJuIGJ1ZmZlcmVkOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgcGVyY2VudCAoYXMgYSBkZWNpbWFsKSBvZiB0aGUgdmlkZW8gdGhhdCdzIGJlZW4gZG93bmxvYWRlZC4KICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgYSBwYXJ0IG9mIHRoZSBuYXRpdmUgSFRNTCB2aWRlbyBBUEkuCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBBIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxIHJlcHJlc2VudGluZyB0aGUgcGVyY2VudAogICAqICAgICAgICAgdGhhdCBpcyBidWZmZXJyZWQgMCBiZWluZyAwJSBhbmQgMSBiZWluZyAxMDAlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmJ1ZmZlcmVkUGVyY2VudCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkUGVyY2VudCQkMSgpIHsKICAgIHJldHVybiBidWZmZXJlZFBlcmNlbnQodGhpcy5idWZmZXJlZCgpLCB0aGlzLmR1cmF0aW9uKCkpOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgZW5kaW5nIHRpbWUgb2YgdGhlIGxhc3QgYnVmZmVyZWQgdGltZSByYW5nZQogICAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgcHJvZ3Jlc3MgYmFyIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aW1lIHJhbmdlcy4KICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIFRoZSBlbmQgb2YgdGhlIGxhc3QgYnVmZmVyZWQgdGltZSByYW5nZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5idWZmZXJlZEVuZCA9IGZ1bmN0aW9uIGJ1ZmZlcmVkRW5kKCkgewogICAgdmFyIGJ1ZmZlcmVkID0gdGhpcy5idWZmZXJlZCgpOwogICAgdmFyIGR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbigpOwogICAgdmFyIGVuZCA9IGJ1ZmZlcmVkLmVuZChidWZmZXJlZC5sZW5ndGggLSAxKTsKCiAgICBpZiAoZW5kID4gZHVyYXRpb24pIHsKICAgICAgZW5kID0gZHVyYXRpb247CiAgICB9CgogICAgcmV0dXJuIGVuZDsKICB9OwoKICAvKioKICAgKiBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IHZvbHVtZSBvZiB0aGUgbWVkaWEKICAgKgogICAqIEBwYXJhbSAge251bWJlcn0gW3BlcmNlbnRBc0RlY2ltYWxdCiAgICogICAgICAgICBUaGUgbmV3IHZvbHVtZSBhcyBhIGRlY2ltYWwgcGVyY2VudDoKICAgKiAgICAgICAgIC0gMCBpcyBtdXRlZC8wJS9vZmYKICAgKiAgICAgICAgIC0gMS4wIGlzIDEwMCUvZnVsbAogICAqICAgICAgICAgLSAwLjUgaXMgaGFsZiB2b2x1bWUgb3IgNTAlCiAgICoKICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICogICAgICAgICBUaGUgY3VycmVudCB2b2x1bWUgYXMgYSBwZXJjZW50IHdoZW4gZ2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS52b2x1bWUgPSBmdW5jdGlvbiB2b2x1bWUocGVyY2VudEFzRGVjaW1hbCkgewogICAgdmFyIHZvbCA9IHZvaWQgMDsKCiAgICBpZiAocGVyY2VudEFzRGVjaW1hbCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIC8vIEZvcmNlIHZhbHVlIHRvIGJldHdlZW4gMCBhbmQgMQogICAgICB2b2wgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwYXJzZUZsb2F0KHBlcmNlbnRBc0RlY2ltYWwpKSk7CiAgICAgIHRoaXMuY2FjaGVfLnZvbHVtZSA9IHZvbDsKICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFZvbHVtZScsIHZvbCk7CgogICAgICBpZiAodm9sID4gMCkgewogICAgICAgIHRoaXMubGFzdFZvbHVtZV8odm9sKTsKICAgICAgfQoKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIERlZmF1bHQgdG8gMSB3aGVuIHJldHVybmluZyBjdXJyZW50IHZvbHVtZS4KICAgIHZvbCA9IHBhcnNlRmxvYXQodGhpcy50ZWNoR2V0Xygndm9sdW1lJykpOwogICAgcmV0dXJuIGlzTmFOKHZvbCkgPyAxIDogdm9sOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgY3VycmVudCBtdXRlZCBzdGF0ZSwgb3IgdHVybiBtdXRlIG9uIG9yIG9mZgogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbbXV0ZWRdCiAgICogICAgICAgIC0gdHJ1ZSB0byBtdXRlCiAgICogICAgICAgIC0gZmFsc2UgdG8gdW5tdXRlCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgLSB0cnVlIGlmIG11dGUgaXMgb24gYW5kIGdldHRpbmcKICAgKiAgICAgICAgIC0gZmFsc2UgaWYgbXV0ZSBpcyBvZmYgYW5kIGdldHRpbmcKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUubXV0ZWQgPSBmdW5jdGlvbiBtdXRlZChfbXV0ZWQpIHsKICAgIGlmIChfbXV0ZWQgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnRlY2hDYWxsXygnc2V0TXV0ZWQnLCBfbXV0ZWQpOwogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnbXV0ZWQnKSB8fCBmYWxzZTsKICB9OwoKICAvKioKICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdE11dGVkIHN0YXRlLCBvciB0dXJuIGRlZmF1bHRNdXRlZCBvbiBvciBvZmYuIGRlZmF1bHRNdXRlZAogICAqIGluZGljYXRlcyB0aGUgc3RhdGUgb2YgbXV0ZWQgb24gaW50aWFsIHBsYXliYWNrLgogICAqCiAgICogYGBganMKICAgKiAgIHZhciBteVBsYXllciA9IHZpZGVvanMoJ3NvbWUtcGxheWVyLWlkJyk7CiAgICoKICAgKiAgIG15UGxheWVyLnNyYygiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wYXRoL3RvL3ZpZGVvLm1wNCIpOwogICAqCiAgICogICAvLyBnZXQsIHNob3VsZCBiZSBmYWxzZQogICAqICAgY29uc29sZS5sb2cobXlQbGF5ZXIuZGVmYXVsdE11dGVkKCkpOwogICAqICAgLy8gc2V0IHRvIHRydWUKICAgKiAgIG15UGxheWVyLmRlZmF1bHRNdXRlZCh0cnVlKTsKICAgKiAgIC8vIGdldCBzaG91bGQgYmUgdHJ1ZQogICAqICAgY29uc29sZS5sb2cobXlQbGF5ZXIuZGVmYXVsdE11dGVkKCkpOwogICAqIGBgYAogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbZGVmYXVsdE11dGVkXQogICAqICAgICAgICAtIHRydWUgdG8gbXV0ZQogICAqICAgICAgICAtIGZhbHNlIHRvIHVubXV0ZQogICAqCiAgICogQHJldHVybiB7Ym9vbGVhbnxQbGF5ZXJ9CiAgICogICAgICAgICAtIHRydWUgaWYgZGVmYXVsdE11dGVkIGlzIG9uIGFuZCBnZXR0aW5nCiAgICogICAgICAgICAtIGZhbHNlIGlmIGRlZmF1bHRNdXRlZCBpcyBvZmYgYW5kIGdldHRpbmcKICAgKiAgICAgICAgIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcGxheWVyIHdoZW4gc2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5kZWZhdWx0TXV0ZWQgPSBmdW5jdGlvbiBkZWZhdWx0TXV0ZWQoX2RlZmF1bHRNdXRlZCkgewogICAgaWYgKF9kZWZhdWx0TXV0ZWQgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ3NldERlZmF1bHRNdXRlZCcsIF9kZWZhdWx0TXV0ZWQpOwogICAgfQogICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ2RlZmF1bHRNdXRlZCcpIHx8IGZhbHNlOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgbGFzdCB2b2x1bWUsIG9yIHNldCBpdAogICAqCiAgICogQHBhcmFtICB7bnVtYmVyfSBbcGVyY2VudEFzRGVjaW1hbF0KICAgKiAgICAgICAgIFRoZSBuZXcgbGFzdCB2b2x1bWUgYXMgYSBkZWNpbWFsIHBlcmNlbnQ6CiAgICogICAgICAgICAtIDAgaXMgbXV0ZWQvMCUvb2ZmCiAgICogICAgICAgICAtIDEuMCBpcyAxMDAlL2Z1bGwKICAgKiAgICAgICAgIC0gMC41IGlzIGhhbGYgdm9sdW1lIG9yIDUwJQogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgdGhlIGN1cnJlbnQgdmFsdWUgb2YgbGFzdFZvbHVtZSBhcyBhIHBlcmNlbnQgd2hlbiBnZXR0aW5nCiAgICoKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5sYXN0Vm9sdW1lXyA9IGZ1bmN0aW9uIGxhc3RWb2x1bWVfKHBlcmNlbnRBc0RlY2ltYWwpIHsKICAgIGlmIChwZXJjZW50QXNEZWNpbWFsICE9PSB1bmRlZmluZWQgJiYgcGVyY2VudEFzRGVjaW1hbCAhPT0gMCkgewogICAgICB0aGlzLmNhY2hlXy5sYXN0Vm9sdW1lID0gcGVyY2VudEFzRGVjaW1hbDsKICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuIHRoaXMuY2FjaGVfLmxhc3RWb2x1bWU7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2sgaWYgY3VycmVudCB0ZWNoIGNhbiBzdXBwb3J0IG5hdGl2ZSBmdWxsc2NyZWVuCiAgICogKGUuZy4gd2l0aCBidWlsdCBpbiBjb250cm9scyBsaWtlIGlPUywgc28gbm90IG91ciBmbGFzaCBzd2YpCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgaWYgbmF0aXZlIGZ1bGxzY3JlZW4gaXMgc3VwcG9ydGVkCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnN1cHBvcnRzRnVsbFNjcmVlbiA9IGZ1bmN0aW9uIHN1cHBvcnRzRnVsbFNjcmVlbigpIHsKICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdzdXBwb3J0c0Z1bGxTY3JlZW4nKSB8fCBmYWxzZTsKICB9OwoKICAvKioKICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGluIGZ1bGxzY3JlZW4gbW9kZSBvciB0ZWxsIHRoZSBwbGF5ZXIgdGhhdCBpdAogICAqIGlzIG9yIGlzIG5vdCBpbiBmdWxsc2NyZWVuIG1vZGUuCiAgICoKICAgKiA+IE5PVEU6IEFzIG9mIHRoZSBsYXRlc3QgSFRNTDUgc3BlYywgaXNGdWxsc2NyZWVuIGlzIG5vIGxvbmdlciBhbiBvZmZpY2lhbAogICAqIHByb3BlcnR5IGFuZCBpbnN0ZWFkIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IGlzIHVzZWQuIEJ1dCBpc0Z1bGxzY3JlZW4gaXMKICAgKiBzdGlsbCBhIHZhbHVhYmxlIHByb3BlcnR5IGZvciBpbnRlcm5hbCBwbGF5ZXIgd29ya2luZ3MuCiAgICoKICAgKiBAcGFyYW0gIHtib29sZWFufSBbaXNGU10KICAgKiAgICAgICAgIFNldCB0aGUgcGxheWVycyBjdXJyZW50IGZ1bGxzY3JlZW4gc3RhdGUKICAgKgogICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICogICAgICAgICAtIHRydWUgaWYgZnVsbHNjcmVlbiBpcyBvbiBhbmQgZ2V0dGluZwogICAqICAgICAgICAgLSBmYWxzZSBpZiBmdWxsc2NyZWVuIGlzIG9mZiBhbmQgZ2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5pc0Z1bGxzY3JlZW4gPSBmdW5jdGlvbiBpc0Z1bGxzY3JlZW4oaXNGUykgewogICAgaWYgKGlzRlMgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLmlzRnVsbHNjcmVlbl8gPSAhIWlzRlM7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAhIXRoaXMuaXNGdWxsc2NyZWVuXzsKICB9OwoKICAvKioKICAgKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgdmlkZW8gdG8gZnVsbCBzY3JlZW4KICAgKiBJbiBzb21lIGJyb3dzZXJzLCBmdWxsIHNjcmVlbiBpcyBub3Qgc3VwcG9ydGVkIG5hdGl2ZWx5LCBzbyBpdCBlbnRlcnMKICAgKiAiZnVsbCB3aW5kb3cgbW9kZSIsIHdoZXJlIHRoZSB2aWRlbyBmaWxscyB0aGUgYnJvd3NlciB3aW5kb3cuCiAgICogSW4gYnJvd3NlcnMgYW5kIGRldmljZXMgdGhhdCBzdXBwb3J0IG5hdGl2ZSBmdWxsIHNjcmVlbiwgc29tZXRpbWVzIHRoZQogICAqIGJyb3dzZXIncyBkZWZhdWx0IGNvbnRyb2xzIHdpbGwgYmUgc2hvd24sIGFuZCBub3QgdGhlIFZpZGVvLmpzIGN1c3RvbSBza2luLgogICAqIFRoaXMgaW5jbHVkZXMgbW9zdCBtb2JpbGUgZGV2aWNlcyAoaU9TLCBBbmRyb2lkKSBhbmQgb2xkZXIgdmVyc2lvbnMgb2YKICAgKiBTYWZhcmkuCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2UKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUucmVxdWVzdEZ1bGxzY3JlZW4gPSBmdW5jdGlvbiByZXF1ZXN0RnVsbHNjcmVlbigpIHsKICAgIHZhciBmc0FwaSA9IEZ1bGxzY3JlZW5BcGk7CgogICAgdGhpcy5pc0Z1bGxzY3JlZW4odHJ1ZSk7CgogICAgaWYgKGZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuKSB7CiAgICAgIC8vIHRoZSBicm93c2VyIHN1cHBvcnRzIGdvaW5nIGZ1bGxzY3JlZW4gYXQgdGhlIGVsZW1lbnQgbGV2ZWwgc28gd2UgY2FuCiAgICAgIC8vIHRha2UgdGhlIGNvbnRyb2xzIGZ1bGxzY3JlZW4gYXMgd2VsbCBhcyB0aGUgdmlkZW8KCiAgICAgIC8vIFRyaWdnZXIgZnVsbHNjcmVlbmNoYW5nZSBldmVudCBhZnRlciBjaGFuZ2UKICAgICAgLy8gV2UgaGF2ZSB0byBzcGVjaWZpY2FsbHkgYWRkIHRoaXMgZWFjaCB0aW1lLCBhbmQgcmVtb3ZlCiAgICAgIC8vIHdoZW4gY2FuY2VsaW5nIGZ1bGxzY3JlZW4uIE90aGVyd2lzZSBpZiB0aGVyZSdzIG11bHRpcGxlCiAgICAgIC8vIHBsYXllcnMgb24gYSBwYWdlLCB0aGV5IHdvdWxkIGFsbCBiZSByZWFjdGluZyB0byB0aGUgc2FtZSBmdWxsc2NyZWVuCiAgICAgIC8vIGV2ZW50cwogICAgICBvbihkb2N1bWVudF8xLCBmc0FwaS5mdWxsc2NyZWVuY2hhbmdlLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIGRvY3VtZW50RnVsbHNjcmVlbkNoYW5nZShlKSB7CiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4oZG9jdW1lbnRfMVtmc0FwaS5mdWxsc2NyZWVuRWxlbWVudF0pOwoKICAgICAgICAvLyBJZiBjYW5jZWxsaW5nIGZ1bGxzY3JlZW4sIHJlbW92ZSBldmVudCBsaXN0ZW5lci4KICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4oKSA9PT0gZmFsc2UpIHsKICAgICAgICAgIG9mZihkb2N1bWVudF8xLCBmc0FwaS5mdWxsc2NyZWVuY2hhbmdlLCBkb2N1bWVudEZ1bGxzY3JlZW5DaGFuZ2UpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAZXZlbnQgUGxheWVyI2Z1bGxzY3JlZW5jaGFuZ2UKICAgICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAgICovCiAgICAgICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJyk7CiAgICAgIH0pKTsKCiAgICAgIHRoaXMuZWxfW2ZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuXSgpOwogICAgfSBlbHNlIGlmICh0aGlzLnRlY2hfLnN1cHBvcnRzRnVsbFNjcmVlbigpKSB7CiAgICAgIC8vIHdlIGNhbid0IHRha2UgdGhlIHZpZGVvLmpzIGNvbnRyb2xzIGZ1bGxzY3JlZW4gYnV0IHdlIGNhbiBnbyBmdWxsc2NyZWVuCiAgICAgIC8vIHdpdGggbmF0aXZlIGNvbnRyb2xzCiAgICAgIHRoaXMudGVjaENhbGxfKCdlbnRlckZ1bGxTY3JlZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGZ1bGxzY3JlZW4gaXNuJ3Qgc3VwcG9ydGVkIHNvIHdlJ2xsIGp1c3Qgc3RyZXRjaCB0aGUgdmlkZW8gZWxlbWVudCB0bwogICAgICAvLyBmaWxsIHRoZSB2aWV3cG9ydAogICAgICB0aGlzLmVudGVyRnVsbFdpbmRvdygpOwogICAgICAvKioKICAgICAgICogQGV2ZW50IFBsYXllciNmdWxsc2NyZWVuY2hhbmdlCiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICovCiAgICAgIHRoaXMudHJpZ2dlcignZnVsbHNjcmVlbmNoYW5nZScpOwogICAgfQogIH07CgogIC8qKgogICAqIFJldHVybiB0aGUgdmlkZW8gdG8gaXRzIG5vcm1hbCBzaXplIGFmdGVyIGhhdmluZyBiZWVuIGluIGZ1bGwgc2NyZWVuIG1vZGUKICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZnVsbHNjcmVlbmNoYW5nZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5leGl0RnVsbHNjcmVlbiA9IGZ1bmN0aW9uIGV4aXRGdWxsc2NyZWVuKCkgewogICAgdmFyIGZzQXBpID0gRnVsbHNjcmVlbkFwaTsKCiAgICB0aGlzLmlzRnVsbHNjcmVlbihmYWxzZSk7CgogICAgLy8gQ2hlY2sgZm9yIGJyb3dzZXIgZWxlbWVudCBmdWxsc2NyZWVuIHN1cHBvcnQKICAgIGlmIChmc0FwaS5yZXF1ZXN0RnVsbHNjcmVlbikgewogICAgICBkb2N1bWVudF8xW2ZzQXBpLmV4aXRGdWxsc2NyZWVuXSgpOwogICAgfSBlbHNlIGlmICh0aGlzLnRlY2hfLnN1cHBvcnRzRnVsbFNjcmVlbigpKSB7CiAgICAgIHRoaXMudGVjaENhbGxfKCdleGl0RnVsbFNjcmVlbicpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5leGl0RnVsbFdpbmRvdygpOwogICAgICAvKioKICAgICAgICogQGV2ZW50IFBsYXllciNmdWxsc2NyZWVuY2hhbmdlCiAgICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAgICovCiAgICAgIHRoaXMudHJpZ2dlcignZnVsbHNjcmVlbmNoYW5nZScpOwogICAgfQogIH07CgogIC8qKgogICAqIFdoZW4gZnVsbHNjcmVlbiBpc24ndCBzdXBwb3J0ZWQgd2UgY2FuIHN0cmV0Y2ggdGhlCiAgICogdmlkZW8gY29udGFpbmVyIHRvIGFzIHdpZGUgYXMgdGhlIGJyb3dzZXIgd2lsbCBsZXQgdXMuCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI2VudGVyRnVsbFdpbmRvdwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5lbnRlckZ1bGxXaW5kb3cgPSBmdW5jdGlvbiBlbnRlckZ1bGxXaW5kb3coKSB7CiAgICB0aGlzLmlzRnVsbFdpbmRvdyA9IHRydWU7CgogICAgLy8gU3RvcmluZyBvcmlnaW5hbCBkb2Mgb3ZlcmZsb3cgdmFsdWUgdG8gcmV0dXJuIHRvIHdoZW4gZnVsbHNjcmVlbiBpcyBvZmYKICAgIHRoaXMuZG9jT3JpZ092ZXJmbG93ID0gZG9jdW1lbnRfMS5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3c7CgogICAgLy8gQWRkIGxpc3RlbmVyIGZvciBlc2Mga2V5IHRvIGV4aXQgZnVsbHNjcmVlbgogICAgb24oZG9jdW1lbnRfMSwgJ2tleWRvd24nLCBiaW5kKHRoaXMsIHRoaXMuZnVsbFdpbmRvd09uRXNjS2V5KSk7CgogICAgLy8gSGlkZSBhbnkgc2Nyb2xsIGJhcnMKICAgIGRvY3VtZW50XzEuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CgogICAgLy8gQXBwbHkgZnVsbHNjcmVlbiBzdHlsZXMKICAgIGFkZENsYXNzKGRvY3VtZW50XzEuYm9keSwgJ3Zqcy1mdWxsLXdpbmRvdycpOwoKICAgIC8qKgogICAgICogQGV2ZW50IFBsYXllciNlbnRlckZ1bGxXaW5kb3cKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdlbnRlckZ1bGxXaW5kb3cnKTsKICB9OwoKICAvKioKICAgKiBDaGVjayBmb3IgY2FsbCB0byBlaXRoZXIgZXhpdCBmdWxsIHdpbmRvdyBvcgogICAqIGZ1bGwgc2NyZWVuIG9uIEVTQyBrZXkKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudAogICAqICAgICAgICBFdmVudCB0byBjaGVjayBmb3Iga2V5IHByZXNzCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmZ1bGxXaW5kb3dPbkVzY0tleSA9IGZ1bmN0aW9uIGZ1bGxXaW5kb3dPbkVzY0tleShldmVudCkgewogICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDI3KSB7CiAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbigpID09PSB0cnVlKSB7CiAgICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbigpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZXhpdEZ1bGxXaW5kb3coKTsKICAgICAgfQogICAgfQogIH07CgogIC8qKgogICAqIEV4aXQgZnVsbCB3aW5kb3cKICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZXhpdEZ1bGxXaW5kb3cKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuZXhpdEZ1bGxXaW5kb3cgPSBmdW5jdGlvbiBleGl0RnVsbFdpbmRvdygpIHsKICAgIHRoaXMuaXNGdWxsV2luZG93ID0gZmFsc2U7CiAgICBvZmYoZG9jdW1lbnRfMSwgJ2tleWRvd24nLCB0aGlzLmZ1bGxXaW5kb3dPbkVzY0tleSk7CgogICAgLy8gVW5oaWRlIHNjcm9sbCBiYXJzLgogICAgZG9jdW1lbnRfMS5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSB0aGlzLmRvY09yaWdPdmVyZmxvdzsKCiAgICAvLyBSZW1vdmUgZnVsbHNjcmVlbiBzdHlsZXMKICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50XzEuYm9keSwgJ3Zqcy1mdWxsLXdpbmRvdycpOwoKICAgIC8vIFJlc2l6ZSB0aGUgYm94LCBjb250cm9sbGVyLCBhbmQgcG9zdGVyIHRvIG9yaWdpbmFsIHNpemVzCiAgICAvLyB0aGlzLnBvc2l0aW9uQWxsKCk7CiAgICAvKioKICAgICAqIEBldmVudCBQbGF5ZXIjZXhpdEZ1bGxXaW5kb3cKICAgICAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwogICAgdGhpcy50cmlnZ2VyKCdleGl0RnVsbFdpbmRvdycpOwogIH07CgogIC8qKgogICAqIENoZWNrIHdoZXRoZXIgdGhlIHBsYXllciBjYW4gcGxheSBhIGdpdmVuIG1pbWV0eXBlCiAgICoKICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwMTEzL3ZpZGVvLmh0bWwjZG9tLW5hdmlnYXRvci1jYW5wbGF5dHlwZQogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKICAgKiAgICAgICAgVGhlIG1pbWV0eXBlIHRvIGNoZWNrCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uIGNhblBsYXlUeXBlKHR5cGUpIHsKICAgIHZhciBjYW4gPSB2b2lkIDA7CgogICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggcGxheWJhY2sgdGVjaG5vbG9neSBpbiB0aGUgb3B0aW9ucyBvcmRlcgogICAgZm9yICh2YXIgaSA9IDAsIGogPSB0aGlzLm9wdGlvbnNfLnRlY2hPcmRlcjsgaSA8IGoubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHRlY2hOYW1lID0galtpXTsKICAgICAgdmFyIHRlY2ggPSBUZWNoLmdldFRlY2godGVjaE5hbWUpOwoKICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLgogICAgICAvLyBSZW1vdmUgb25jZSB0aGF0IGRlcHJlY2F0ZWQgYmVoYXZpb3IgaXMgcmVtb3ZlZC4KICAgICAgaWYgKCF0ZWNoKSB7CiAgICAgICAgdGVjaCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQodGVjaE5hbWUpOwogICAgICB9CgogICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0ZWNoIGlzIGRlZmluZWQgYmVmb3JlIGNvbnRpbnVpbmcKICAgICAgaWYgKCF0ZWNoKSB7CiAgICAgICAgbG9nJDEuZXJyb3IoJ1RoZSAiJyArIHRlY2hOYW1lICsgJyIgdGVjaCBpcyB1bmRlZmluZWQuIFNraXBwZWQgYnJvd3NlciBzdXBwb3J0IGNoZWNrIGZvciB0aGF0IHRlY2guJyk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neQogICAgICBpZiAodGVjaC5pc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgY2FuID0gdGVjaC5jYW5QbGF5VHlwZSh0eXBlKTsKCiAgICAgICAgaWYgKGNhbikgewogICAgICAgICAgcmV0dXJuIGNhbjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJyc7CiAgfTsKCiAgLyoqCiAgICogU2VsZWN0IHNvdXJjZSBiYXNlZCBvbiB0ZWNoLW9yZGVyIG9yIHNvdXJjZS1vcmRlcgogICAqIFVzZXMgc291cmNlLW9yZGVyIHNlbGVjdGlvbiBpZiBgb3B0aW9ucy5zb3VyY2VPcmRlcmAgaXMgdHJ1dGh5LiBPdGhlcndpc2UsCiAgICogZGVmYXVsdHMgdG8gdGVjaC1vcmRlciBzZWxlY3Rpb24KICAgKgogICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZXMKICAgKiAgICAgICAgVGhlIHNvdXJjZXMgZm9yIGEgbWVkaWEgYXNzZXQKICAgKgogICAqIEByZXR1cm4ge09iamVjdHxib29sZWFufQogICAqICAgICAgICAgT2JqZWN0IG9mIHNvdXJjZSBhbmQgdGVjaCBvcmRlciBvciBmYWxzZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5zZWxlY3RTb3VyY2UgPSBmdW5jdGlvbiBzZWxlY3RTb3VyY2Uoc291cmNlcykgewogICAgdmFyIF90aGlzNiA9IHRoaXM7CgogICAgLy8gR2V0IG9ubHkgdGhlIHRlY2hzIHNwZWNpZmllZCBpbiBgdGVjaE9yZGVyYCB0aGF0IGV4aXN0IGFuZCBhcmUgc3VwcG9ydGVkIGJ5IHRoZQogICAgLy8gY3VycmVudCBwbGF0Zm9ybQogICAgdmFyIHRlY2hzID0gdGhpcy5vcHRpb25zXy50ZWNoT3JkZXIubWFwKGZ1bmN0aW9uICh0ZWNoTmFtZSkgewogICAgICByZXR1cm4gW3RlY2hOYW1lLCBUZWNoLmdldFRlY2godGVjaE5hbWUpXTsKICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoX3JlZikgewogICAgICB2YXIgdGVjaE5hbWUgPSBfcmVmWzBdLAogICAgICAgICAgdGVjaCA9IF9yZWZbMV07CgogICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0ZWNoIGlzIGRlZmluZWQgYmVmb3JlIGNvbnRpbnVpbmcKICAgICAgaWYgKHRlY2gpIHsKICAgICAgICAvLyBDaGVjayBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGlzIHRlY2hub2xvZ3kKICAgICAgICByZXR1cm4gdGVjaC5pc1N1cHBvcnRlZCgpOwogICAgICB9CgogICAgICBsb2ckMS5lcnJvcignVGhlICInICsgdGVjaE5hbWUgKyAnIiB0ZWNoIGlzIHVuZGVmaW5lZC4gU2tpcHBlZCBicm93c2VyIHN1cHBvcnQgY2hlY2sgZm9yIHRoYXQgdGVjaC4nKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggYGlubmVyQXJyYXlgIGVsZW1lbnQgb25jZSBwZXIgYG91dGVyQXJyYXlgIGVsZW1lbnQgYW5kIGV4ZWN1dGUKICAgIC8vIGB0ZXN0ZXJgIHdpdGggYm90aC4gSWYgYHRlc3RlcmAgcmV0dXJucyBhIG5vbi1mYWxzeSB2YWx1ZSwgZXhpdCBlYXJseSBhbmQgcmV0dXJuCiAgICAvLyB0aGF0IHZhbHVlLgogICAgdmFyIGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpciA9IGZ1bmN0aW9uIGZpbmRGaXJzdFBhc3NpbmdUZWNoU291cmNlUGFpcihvdXRlckFycmF5LCBpbm5lckFycmF5LCB0ZXN0ZXIpIHsKICAgICAgdmFyIGZvdW5kID0gdm9pZCAwOwoKICAgICAgb3V0ZXJBcnJheS5zb21lKGZ1bmN0aW9uIChvdXRlckNob2ljZSkgewogICAgICAgIHJldHVybiBpbm5lckFycmF5LnNvbWUoZnVuY3Rpb24gKGlubmVyQ2hvaWNlKSB7CiAgICAgICAgICBmb3VuZCA9IHRlc3RlcihvdXRlckNob2ljZSwgaW5uZXJDaG9pY2UpOwoKICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICByZXR1cm4gZm91bmQ7CiAgICB9OwoKICAgIHZhciBmb3VuZFNvdXJjZUFuZFRlY2ggPSB2b2lkIDA7CiAgICB2YXIgZmxpcCA9IGZ1bmN0aW9uIGZsaXAoZm4pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgcmV0dXJuIGZuKGIsIGEpOwogICAgICB9OwogICAgfTsKICAgIHZhciBmaW5kZXIgPSBmdW5jdGlvbiBmaW5kZXIoX3JlZjIsIHNvdXJjZSkgewogICAgICB2YXIgdGVjaE5hbWUgPSBfcmVmMlswXSwKICAgICAgICAgIHRlY2ggPSBfcmVmMlsxXTsKCiAgICAgIGlmICh0ZWNoLmNhblBsYXlTb3VyY2Uoc291cmNlLCBfdGhpczYub3B0aW9uc19bdGVjaE5hbWUudG9Mb3dlckNhc2UoKV0pKSB7CiAgICAgICAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UsIHRlY2g6IHRlY2hOYW1lIH07CiAgICAgIH0KICAgIH07CgogICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0cnV0aGluZXNzIG9mIGBvcHRpb25zLnNvdXJjZU9yZGVyYCwgd2Ugc3dhcCB0aGUgb3JkZXIgb2YgdGVjaHMgYW5kIHNvdXJjZXMKICAgIC8vIHRvIHNlbGVjdCBmcm9tIHRoZW0gYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkuCiAgICBpZiAodGhpcy5vcHRpb25zXy5zb3VyY2VPcmRlcikgewogICAgICAvLyBTb3VyY2UtZmlyc3Qgb3JkZXJpbmcKICAgICAgZm91bmRTb3VyY2VBbmRUZWNoID0gZmluZEZpcnN0UGFzc2luZ1RlY2hTb3VyY2VQYWlyKHNvdXJjZXMsIHRlY2hzLCBmbGlwKGZpbmRlcikpOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGVjaC1maXJzdCBvcmRlcmluZwogICAgICBmb3VuZFNvdXJjZUFuZFRlY2ggPSBmaW5kRmlyc3RQYXNzaW5nVGVjaFNvdXJjZVBhaXIodGVjaHMsIHNvdXJjZXMsIGZpbmRlcik7CiAgICB9CgogICAgcmV0dXJuIGZvdW5kU291cmNlQW5kVGVjaCB8fCBmYWxzZTsKICB9OwoKICAvKioKICAgKiBHZXQgb3Igc2V0IHRoZSB2aWRlbyBzb3VyY2UuCiAgICoKICAgKiBAcGFyYW0ge1RlY2h+U291cmNlT2JqZWN0fFRlY2h+U291cmNlT2JqZWN0W118c3RyaW5nfSBbc291cmNlXQogICAqICAgICAgICBBIFNvdXJjZU9iamVjdCwgYW4gYXJyYXkgb2YgU291cmNlT2JqZWN0cywgb3IgYSBzdHJpbmcgcmVmZXJlbmNpbmcKICAgKiAgICAgICAgYSBVUkwgdG8gYSBtZWRpYSBzb3VyY2UuIEl0IGlzIF9oaWdobHkgcmVjb21tZW5kZWRfIHRoYXQgYW4gb2JqZWN0CiAgICogICAgICAgIG9yIGFycmF5IG9mIG9iamVjdHMgaXMgdXNlZCBoZXJlLCBzbyB0aGF0IHNvdXJjZSBzZWxlY3Rpb24KICAgKiAgICAgICAgYWxnb3JpdGhtcyBjYW4gdGFrZSB0aGUgYHR5cGVgIGludG8gYWNjb3VudC4KICAgKgogICAqICAgICAgICBJZiBub3QgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIGFjdHMgYXMgYSBnZXR0ZXIuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfQogICAqICAgICAgICAgSWYgdGhlIGBzb3VyY2VgIGFyZ3VtZW50IGlzIG1pc3NpbmcsIHJldHVybnMgdGhlIGN1cnJlbnQgc291cmNlCiAgICogICAgICAgICBVUkwuIE90aGVyd2lzZSwgcmV0dXJucyBub3RoaW5nL3VuZGVmaW5lZC4KICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuc3JjID0gZnVuY3Rpb24gc3JjKHNvdXJjZSkgewogICAgdmFyIF90aGlzNyA9IHRoaXM7CgogICAgLy8gZ2V0dGVyIHVzYWdlCiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGVfLnNyYyB8fCAnJzsKICAgIH0KICAgIC8vIGZpbHRlciBvdXQgaW52YWxpZCBzb3VyY2VzIGFuZCB0dXJuIG91ciBzb3VyY2UgaW50bwogICAgLy8gYW4gYXJyYXkgb2Ygc291cmNlIG9iamVjdHMKICAgIHZhciBzb3VyY2VzID0gZmlsdGVyU291cmNlKHNvdXJjZSk7CgogICAgLy8gaWYgYSBzb3VyY2Ugd2FzIHBhc3NlZCBpbiB0aGVuIGl0IGlzIGludmFsaWQgYmVjYXVzZQogICAgLy8gaXQgd2FzIGZpbHRlcmVkIHRvIGEgemVybyBsZW5ndGggQXJyYXkuIFNvIHdlIGhhdmUgdG8KICAgIC8vIHNob3cgYW4gZXJyb3IKICAgIGlmICghc291cmNlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLmVycm9yKHsgY29kZTogNCwgbWVzc2FnZTogdGhpcy5sb2NhbGl6ZSh0aGlzLm9wdGlvbnNfLm5vdFN1cHBvcnRlZE1lc3NhZ2UpIH0pOwogICAgICB9LCAwKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIGludGlhbCBzb3VyY2VzCiAgICB0aGlzLmNhY2hlXy5zb3VyY2VzID0gc291cmNlczsKICAgIHRoaXMuY2hhbmdpbmdTcmNfID0gdHJ1ZTsKCiAgICAvLyBpbnRpYWwgc291cmNlCiAgICB0aGlzLmNhY2hlXy5zb3VyY2UgPSBzb3VyY2VzWzBdOwoKICAgIC8vIG1pZGRsZXdhcmVTb3VyY2UgaXMgdGhlIHNvdXJjZSBhZnRlciBpdCBoYXMgYmVlbiBjaGFuZ2VkIGJ5IG1pZGRsZXdhcmUKICAgIHNldFNvdXJjZSh0aGlzLCBzb3VyY2VzWzBdLCBmdW5jdGlvbiAobWlkZGxld2FyZVNvdXJjZSwgbXdzKSB7CiAgICAgIF90aGlzNy5taWRkbGV3YXJlXyA9IG13czsKCiAgICAgIHZhciBlcnIgPSBfdGhpczcuc3JjXyhtaWRkbGV3YXJlU291cmNlKTsKCiAgICAgIGlmIChlcnIpIHsKICAgICAgICBpZiAoc291cmNlcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXM3LnNyYyhzb3VyY2VzLnNsaWNlKDEpKTsKICAgICAgICB9CgogICAgICAgIC8vIFdlIG5lZWQgdG8gd3JhcCB0aGlzIGluIGEgdGltZW91dCB0byBnaXZlIGZvbGtzIGEgY2hhbmNlIHRvIGFkZCBlcnJvciBldmVudCBoYW5kbGVycwogICAgICAgIF90aGlzNy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRoaXMuZXJyb3IoeyBjb2RlOiA0LCBtZXNzYWdlOiB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubm90U3VwcG9ydGVkTWVzc2FnZSkgfSk7CiAgICAgICAgfSwgMCk7CgogICAgICAgIC8vIHdlIGNvdWxkIG5vdCBmaW5kIGFuIGFwcHJvcHJpYXRlIHRlY2gsIGJ1dCBsZXQncyBzdGlsbCBub3RpZnkgdGhlIGRlbGVnYXRlIHRoYXQgdGhpcyBpcyBpdAogICAgICAgIC8vIHRoaXMgbmVlZHMgYSBiZXR0ZXIgY29tbWVudCBhYm91dCB3aHkgdGhpcyBpcyBuZWVkZWQKICAgICAgICBfdGhpczcudHJpZ2dlclJlYWR5KCk7CgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgX3RoaXM3LmNoYW5naW5nU3JjXyA9IGZhbHNlOwogICAgICAvLyB2aWRlbyBlbGVtZW50IGxpc3RlZCBzb3VyY2UKICAgICAgX3RoaXM3LmNhY2hlXy5zcmMgPSBtaWRkbGV3YXJlU291cmNlLnNyYzsKCiAgICAgIHNldFRlY2gobXdzLCBfdGhpczcudGVjaF8pOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogU2V0IHRoZSBzb3VyY2Ugb2JqZWN0IG9uIHRoZSB0ZWNoLCByZXR1cm5zIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3ZXRoZXIKICAgKiB0aGVyZSBpcyBhIHRlY2ggdGhhdCBjYW4gcGxheSB0aGUgc291cmNlIG9yIG5vdAogICAqCiAgICogQHBhcmFtIHtUZWNoflNvdXJjZU9iamVjdH0gc291cmNlCiAgICogICAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHNldCBvbiB0aGUgVGVjaAogICAqCiAgICogQHJldHVybiB7Qm9vbGVhbn0KICAgKiAgICAgICAgIC0gVHJ1ZSBpZiB0aGVyZSBpcyBubyBUZWNoIHRvIHBsYXliYWNrIHRoaXMgc291cmNlCiAgICogICAgICAgICAtIEZhbHNlIG90aGVyd2lzZQogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuc3JjXyA9IGZ1bmN0aW9uIHNyY18oc291cmNlKSB7CiAgICB2YXIgc291cmNlVGVjaCA9IHRoaXMuc2VsZWN0U291cmNlKFtzb3VyY2VdKTsKCiAgICBpZiAoIXNvdXJjZVRlY2gpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKCF0aXRsZUNhc2VFcXVhbHMoc291cmNlVGVjaC50ZWNoLCB0aGlzLnRlY2hOYW1lXykpIHsKICAgICAgdGhpcy5jaGFuZ2luZ1NyY18gPSB0cnVlOwoKICAgICAgLy8gbG9hZCB0aGlzIHRlY2hub2xvZ3kgd2l0aCB0aGUgY2hvc2VuIHNvdXJjZQogICAgICB0aGlzLmxvYWRUZWNoXyhzb3VyY2VUZWNoLnRlY2gsIHNvdXJjZVRlY2guc291cmNlKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIHdhaXQgdW50aWwgdGhlIHRlY2ggaXMgcmVhZHkgdG8gc2V0IHRoZSBzb3VyY2UKICAgIHRoaXMucmVhZHkoZnVuY3Rpb24gKCkgewoKICAgICAgLy8gVGhlIHNldFNvdXJjZSB0ZWNoIG1ldGhvZCB3YXMgYWRkZWQgd2l0aCBzb3VyY2UgaGFuZGxlcnMKICAgICAgLy8gc28gb2xkZXIgdGVjaHMgd29uJ3Qgc3VwcG9ydCBpdAogICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRoZSBkaXJlY3QgcHJvdG90eXBlIGZvciB0aGUgY2FzZSB3aGVyZSBzdWJjbGFzc2VzCiAgICAgIC8vIG9mIHRoZSB0ZWNoIGRvIG5vdCBzdXBwb3J0IHNvdXJjZSBoYW5kbGVycwogICAgICBpZiAodGhpcy50ZWNoXy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoJ3NldFNvdXJjZScpKSB7CiAgICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFNvdXJjZScsIHNvdXJjZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NyYycsIHNvdXJjZS5zcmMpOwogICAgICB9CgogICAgICBpZiAodGhpcy5vcHRpb25zXy5wcmVsb2FkID09PSAnYXV0bycpIHsKICAgICAgICB0aGlzLmxvYWQoKTsKICAgICAgfQoKICAgICAgLy8gU2V0IHRoZSBzb3VyY2Ugc3luY2hyb25vdXNseSBpZiBwb3NzaWJsZSAoIzIzMjYpCiAgICB9LCB0cnVlKTsKCiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgLyoqCiAgICogQmVnaW4gbG9hZGluZyB0aGUgc3JjIGRhdGEuCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiBsb2FkKCkgewogICAgdGhpcy50ZWNoQ2FsbF8oJ2xvYWQnKTsKICB9OwoKICAvKioKICAgKiBSZXNldCB0aGUgcGxheWVyLiBMb2FkcyB0aGUgZmlyc3QgdGVjaCBpbiB0aGUgdGVjaE9yZGVyLAogICAqIGFuZCBjYWxscyBgcmVzZXRgIG9uIHRoZSB0ZWNoYC4KICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHsKICAgIHRoaXMubG9hZFRlY2hfKHRoaXMub3B0aW9uc18udGVjaE9yZGVyWzBdLCBudWxsKTsKICAgIHRoaXMudGVjaENhbGxfKCdyZXNldCcpOwogIH07CgogIC8qKgogICAqIFJldHVybnMgYWxsIG9mIHRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3RzLgogICAqCiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3RbXX0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3RzCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmN1cnJlbnRTb3VyY2VzID0gZnVuY3Rpb24gY3VycmVudFNvdXJjZXMoKSB7CiAgICB2YXIgc291cmNlID0gdGhpcy5jdXJyZW50U291cmNlKCk7CiAgICB2YXIgc291cmNlcyA9IFtdOwoKICAgIC8vIGFzc3VtZSBge31gIG9yIGB7IHNyYyB9YAogICAgaWYgKE9iamVjdC5rZXlzKHNvdXJjZSkubGVuZ3RoICE9PSAwKSB7CiAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpOwogICAgfQoKICAgIHJldHVybiB0aGlzLmNhY2hlXy5zb3VyY2VzIHx8IHNvdXJjZXM7CiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2Ugb2JqZWN0LgogICAqCiAgICogQHJldHVybiB7VGVjaH5Tb3VyY2VPYmplY3R9CiAgICogICAgICAgICBUaGUgY3VycmVudCBzb3VyY2Ugb2JqZWN0CiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmN1cnJlbnRTb3VyY2UgPSBmdW5jdGlvbiBjdXJyZW50U291cmNlKCkgewogICAgcmV0dXJuIHRoaXMuY2FjaGVfLnNvdXJjZSB8fCB7fTsKICB9OwoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgVVJMIG9mIHRoZSBjdXJyZW50IHNvdXJjZSB2YWx1ZSBlLmcuIGh0dHA6Ly9teXNpdGUuY29tL3ZpZGVvLm1wNAogICAqIENhbiBiZSB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBgY3VycmVudFR5cGVgIHRvIGFzc2lzdCBpbiByZWJ1aWxkaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3QuCiAgICoKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogICAgICAgICBUaGUgY3VycmVudCBzb3VyY2UKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuY3VycmVudFNyYyA9IGZ1bmN0aW9uIGN1cnJlbnRTcmMoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50U291cmNlKCkgJiYgdGhpcy5jdXJyZW50U291cmNlKCkuc3JjIHx8ICcnOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgY3VycmVudCBzb3VyY2UgdHlwZSBlLmcuIHZpZGVvL21wNAogICAqIFRoaXMgY2FuIGFsbG93IHlvdSByZWJ1aWxkIHRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3Qgc28gdGhhdCB5b3UgY291bGQgbG9hZCB0aGUgc2FtZQogICAqIHNvdXJjZSBhbmQgdGVjaCBsYXRlcgogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIHNvdXJjZSBNSU1FIHR5cGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuY3VycmVudFR5cGUgPSBmdW5jdGlvbiBjdXJyZW50VHlwZSgpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3VyY2UoKSAmJiB0aGlzLmN1cnJlbnRTb3VyY2UoKS50eXBlIHx8ICcnOwogIH07CgogIC8qKgogICAqIEdldCBvciBzZXQgdGhlIHByZWxvYWQgYXR0cmlidXRlCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZV0KICAgKiAgICAgICAgLSB0cnVlIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHByZWxvYWQKICAgKiAgICAgICAgLSBmYWxzZSBtYWVucyB0aGF0IHdlIHNob3VsZCBub3QgcHJlbG9hZAogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIHByZWxvYWQgYXR0cmlidXRlIHZhbHVlIHdoZW4gZ2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24gcHJlbG9hZCh2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFByZWxvYWQnLCB2YWx1ZSk7CiAgICAgIHRoaXMub3B0aW9uc18ucHJlbG9hZCA9IHZhbHVlOwogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygncHJlbG9hZCcpOwogIH07CgogIC8qKgogICAqIEdldCBvciBzZXQgdGhlIGF1dG9wbGF5IGF0dHJpYnV0ZS4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlXQogICAqICAgICAgICAtIHRydWUgbWVhbnMgdGhhdCB3ZSBzaG91bGQgYXV0b3BsYXkKICAgKiAgICAgICAgLSBmYWxzZSBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgYXV0b3BsYXkKICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGF1dG9wbGF5IHdoZW4gZ2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5hdXRvcGxheSA9IGZ1bmN0aW9uIGF1dG9wbGF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnRlY2hDYWxsXygnc2V0QXV0b3BsYXknLCB2YWx1ZSk7CiAgICAgIHRoaXMub3B0aW9uc18uYXV0b3BsYXkgPSB2YWx1ZTsKICAgICAgdGhpcy5yZWFkeSh0aGlzLmZvcmNlQXV0b3BsYXlJbkNocm9tZV8pOwogICAgICByZXR1cm47CiAgICB9CiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnYXV0b3BsYXknLCB2YWx1ZSk7CiAgfTsKCiAgLyoqCiAgICogY2hyb21lIHN0YXJ0ZWQgcGF1c2luZyB0aGUgdmlkZW8gd2hlbiBtb3ZpbmcgaW4gdGhlIERPTQogICAqIGNhdXNpbmcgYXV0b3BsYXkgdG8gbm90IGNvbnRpbnVlIGR1ZSB0byBob3cgVmlkZW8uanMgZnVuY3Rpb25zLgogICAqIFNlZSAjNDcyMCBmb3IgbW9yZSBpbmZvLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuZm9yY2VBdXRvcGxheUluQ2hyb21lXyA9IGZ1bmN0aW9uIGZvcmNlQXV0b3BsYXlJbkNocm9tZV8oKSB7CiAgICBpZiAodGhpcy5wYXVzZWQoKSAmJiAoCiAgICAvLyByZWFkIGZyb20gdGhlIHZpZGVvIGVsZW1lbnQgb3Igb3B0aW9ucwogICAgdGhpcy5hdXRvcGxheSgpIHx8IHRoaXMub3B0aW9uc18uYXV0b3BsYXkpICYmCiAgICAvLyBvbmx5IHRhcmdldCBkZXNrdG9wIGNocm9tZQogICAgSVNfQ0hST01FICYmICFJU19BTkRST0lEKSB7CiAgICAgIHRoaXMucGxheSgpOwogICAgfQogIH07CgogIC8qKgogICAqIFNldCBvciB1bnNldCB0aGUgcGxheXNpbmxpbmUgYXR0cmlidXRlLgogICAqIFBsYXlzaW5saW5lIHRlbGxzIHRoZSBicm93c2VyIHRoYXQgbm9uLWZ1bGxzY3JlZW4gcGxheWJhY2sgaXMgcHJlZmVycmVkLgogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWVdCiAgICogICAgICAgIC0gdHJ1ZSBtZWFucyB0aGF0IHdlIHNob3VsZCB0cnkgdG8gcGxheSBpbmxpbmUgYnkgZGVmYXVsdAogICAqICAgICAgICAtIGZhbHNlIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHVzZSB0aGUgYnJvd3NlcidzIGRlZmF1bHQgcGxheWJhY2sgbW9kZSwKICAgKiAgICAgICAgICB3aGljaCBpbiBtb3N0IGNhc2VzIGlzIGlubGluZS4gaU9TIFNhZmFyaSBpcyBhIG5vdGFibGUgZXhjZXB0aW9uCiAgICogICAgICAgICAgYW5kIHBsYXlzIGZ1bGxzY3JlZW4gYnkgZGVmYXVsdC4KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ3xQbGF5ZXJ9CiAgICogICAgICAgICAtIHRoZSBjdXJyZW50IHZhbHVlIG9mIHBsYXlzaW5saW5lCiAgICogICAgICAgICAtIHRoZSBwbGF5ZXIgd2hlbiBzZXR0aW5nCiAgICoKICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNhdHRyLXZpZGVvLXBsYXlzaW5saW5lfQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5wbGF5c2lubGluZSA9IGZ1bmN0aW9uIHBsYXlzaW5saW5lKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UGxheXNpbmxpbmUnLCB2YWx1ZSk7CiAgICAgIHRoaXMub3B0aW9uc18ucGxheXNpbmxpbmUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygncGxheXNpbmxpbmUnKTsKICB9OwoKICAvKioKICAgKiBHZXQgb3Igc2V0IHRoZSBsb29wIGF0dHJpYnV0ZSBvbiB0aGUgdmlkZW8gZWxlbWVudC4KICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlXQogICAqICAgICAgICAtIHRydWUgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbG9vcCB0aGUgdmlkZW8KICAgKiAgICAgICAgLSBmYWxzZSBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbG9vcCB0aGUgdmlkZW8KICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGxvb3Agd2hlbiBnZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmxvb3AgPSBmdW5jdGlvbiBsb29wKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnRlY2hDYWxsXygnc2V0TG9vcCcsIHZhbHVlKTsKICAgICAgdGhpcy5vcHRpb25zXy5sb29wID0gdmFsdWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdsb29wJyk7CiAgfTsKCiAgLyoqCiAgICogR2V0IG9yIHNldCB0aGUgcG9zdGVyIGltYWdlIHNvdXJjZSB1cmwKICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjcG9zdGVyY2hhbmdlCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW3NyY10KICAgKiAgICAgICAgUG9zdGVyIGltYWdlIHNvdXJjZSBVUkwKICAgKgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIHBvc3RlciB3aGVuIGdldHRpbmcKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUucG9zdGVyID0gZnVuY3Rpb24gcG9zdGVyKHNyYykgewogICAgaWYgKHNyYyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzLnBvc3Rlcl87CiAgICB9CgogICAgLy8gVGhlIGNvcnJlY3Qgd2F5IHRvIHJlbW92ZSBhIHBvc3RlciBpcyB0byBzZXQgYXMgYW4gZW1wdHkgc3RyaW5nCiAgICAvLyBvdGhlciBmYWxzZXkgdmFsdWVzIHdpbGwgdGhyb3cgZXJyb3JzCiAgICBpZiAoIXNyYykgewogICAgICBzcmMgPSAnJzsKICAgIH0KCiAgICAvLyB1cGRhdGUgdGhlIGludGVybmFsIHBvc3RlciB2YXJpYWJsZQogICAgdGhpcy5wb3N0ZXJfID0gc3JjOwoKICAgIC8vIHVwZGF0ZSB0aGUgdGVjaCdzIHBvc3RlcgogICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFBvc3RlcicsIHNyYyk7CgogICAgLy8gYWxlcnQgY29tcG9uZW50cyB0aGF0IHRoZSBwb3N0ZXIgaGFzIGJlZW4gc2V0CiAgICAvKioKICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgcG9zdGVyIGltYWdlIGlzIGNoYW5nZWQgb24gdGhlIHBsYXllci4KICAgICAqCiAgICAgKiBAZXZlbnQgUGxheWVyI3Bvc3RlcmNoYW5nZQogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCiAgICB0aGlzLnRyaWdnZXIoJ3Bvc3RlcmNoYW5nZScpOwogIH07CgogIC8qKgogICAqIFNvbWUgdGVjaHMgKGUuZy4gWW91VHViZSkgY2FuIHByb3ZpZGUgYSBwb3N0ZXIgc291cmNlIGluIGFuCiAgICogYXN5bmNocm9ub3VzIHdheS4gV2Ugd2FudCB0aGUgcG9zdGVyIGNvbXBvbmVudCB0byB1c2UgdGhpcwogICAqIHBvc3RlciBzb3VyY2Ugc28gdGhhdCBpdCBjb3ZlcnMgdXAgdGhlIHRlY2gncyBjb250cm9scy4KICAgKiAoWW91VHViZSdzIHBsYXkgYnV0dG9uKS4gSG93ZXZlciB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMKICAgKiBzb3VyY2UgaWYgdGhlIHBsYXllciB1c2VyIGhhc24ndCBzZXQgYSBwb3N0ZXIgdGhyb3VnaAogICAqIHRoZSBub3JtYWwgQVBJcy4KICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjcG9zdGVyY2hhbmdlCiAgICogQGxpc3RlbnMgVGVjaCNwb3N0ZXJjaGFuZ2UKICAgKiBAcHJpdmF0ZQogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5oYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXyA9IGZ1bmN0aW9uIGhhbmRsZVRlY2hQb3N0ZXJDaGFuZ2VfKCkgewogICAgaWYgKCF0aGlzLnBvc3Rlcl8gJiYgdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLnBvc3RlcikgewogICAgICB0aGlzLnBvc3Rlcl8gPSB0aGlzLnRlY2hfLnBvc3RlcigpIHx8ICcnOwoKICAgICAgLy8gTGV0IGNvbXBvbmVudHMga25vdyB0aGUgcG9zdGVyIGhhcyBjaGFuZ2VkCiAgICAgIHRoaXMudHJpZ2dlcigncG9zdGVyY2hhbmdlJyk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogR2V0IG9yIHNldCB3aGV0aGVyIG9yIG5vdCB0aGUgY29udHJvbHMgYXJlIHNob3dpbmcuCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI2NvbnRyb2xzZW5hYmxlZAogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF0KICAgKiAgICAgICAgLSB0cnVlIHRvIHR1cm4gY29udHJvbHMgb24KICAgKiAgICAgICAgLSBmYWxzZSB0byB0dXJuIGNvbnRyb2xzIG9mZgogICAqCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbnRyb2xzIHdoZW4gZ2V0dGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5jb250cm9scyA9IGZ1bmN0aW9uIGNvbnRyb2xzKGJvb2wpIHsKICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuICEhdGhpcy5jb250cm9sc187CiAgICB9CgogICAgYm9vbCA9ICEhYm9vbDsKCiAgICAvLyBEb24ndCB0cmlnZ2VyIGEgY2hhbmdlIGV2ZW50IHVubGVzcyBpdCBhY3R1YWxseSBjaGFuZ2VkCiAgICBpZiAodGhpcy5jb250cm9sc18gPT09IGJvb2wpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRoaXMuY29udHJvbHNfID0gYm9vbDsKCiAgICBpZiAodGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKCkpIHsKICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldENvbnRyb2xzJywgYm9vbCk7CiAgICB9CgogICAgaWYgKHRoaXMuY29udHJvbHNfKSB7CiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9scy1kaXNhYmxlZCcpOwogICAgICB0aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZW5hYmxlZCcpOwogICAgICAvKioKICAgICAgICogQGV2ZW50IFBsYXllciNjb250cm9sc2VuYWJsZWQKICAgICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICAgKi8KICAgICAgdGhpcy50cmlnZ2VyKCdjb250cm9sc2VuYWJsZWQnKTsKICAgICAgaWYgKCF0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHMoKSkgewogICAgICAgIHRoaXMuYWRkVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtY29udHJvbHMtZW5hYmxlZCcpOwogICAgICB0aGlzLmFkZENsYXNzKCd2anMtY29udHJvbHMtZGlzYWJsZWQnKTsKICAgICAgLyoqCiAgICAgICAqIEBldmVudCBQbGF5ZXIjY29udHJvbHNkaXNhYmxlZAogICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoJ2NvbnRyb2xzZGlzYWJsZWQnKTsKICAgICAgaWYgKCF0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHMoKSkgewogICAgICAgIHRoaXMucmVtb3ZlVGVjaENvbnRyb2xzTGlzdGVuZXJzXygpOwogICAgICB9CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVG9nZ2xlIG5hdGl2ZSBjb250cm9scyBvbi9vZmYuIE5hdGl2ZSBjb250cm9scyBhcmUgdGhlIGNvbnRyb2xzIGJ1aWx0IGludG8KICAgKiBkZXZpY2VzIChlLmcuIGRlZmF1bHQgaVBob25lIGNvbnRyb2xzKSwgRmxhc2gsIG9yIG90aGVyIHRlY2hzCiAgICogKGUuZy4gVmltZW8gQ29udHJvbHMpCiAgICogKipUaGlzIHNob3VsZCBvbmx5IGJlIHNldCBieSB0aGUgY3VycmVudCB0ZWNoLCBiZWNhdXNlIG9ubHkgdGhlIHRlY2gga25vd3MKICAgKiBpZiBpdCBjYW4gc3VwcG9ydCBuYXRpdmUgY29udHJvbHMqKgogICAqCiAgICogQGZpcmVzIFBsYXllciN1c2luZ25hdGl2ZWNvbnRyb2xzCiAgICogQGZpcmVzIFBsYXllciN1c2luZ2N1c3RvbWNvbnRyb2xzCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtib29sXQogICAqICAgICAgICAtIHRydWUgdG8gdHVybiBuYXRpdmUgY29udHJvbHMgb24KICAgKiAgICAgICAgLSBmYWxzZSB0byB0dXJuIG5hdGl2ZSBjb250cm9scyBvZmYKICAgKgogICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICogICAgICAgICBUaGUgY3VycmVudCB2YWx1ZSBvZiBuYXRpdmUgY29udHJvbHMgd2hlbiBnZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnVzaW5nTmF0aXZlQ29udHJvbHMgPSBmdW5jdGlvbiB1c2luZ05hdGl2ZUNvbnRyb2xzKGJvb2wpIHsKICAgIGlmIChib29sID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuICEhdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXzsKICAgIH0KCiAgICBib29sID0gISFib29sOwoKICAgIC8vIERvbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQgdW5sZXNzIGl0IGFjdHVhbGx5IGNoYW5nZWQKICAgIGlmICh0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHNfID09PSBib29sKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHNfID0gYm9vbDsKCiAgICBpZiAodGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXykgewogICAgICB0aGlzLmFkZENsYXNzKCd2anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzJyk7CgogICAgICAvKioKICAgICAgICogcGxheWVyIGlzIHVzaW5nIHRoZSBuYXRpdmUgZGV2aWNlIGNvbnRyb2xzCiAgICAgICAqCiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNpbmduYXRpdmVjb250cm9scwogICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoJ3VzaW5nbmF0aXZlY29udHJvbHMnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy11c2luZy1uYXRpdmUtY29udHJvbHMnKTsKCiAgICAgIC8qKgogICAgICAgKiBwbGF5ZXIgaXMgdXNpbmcgdGhlIGN1c3RvbSBIVE1MIGNvbnRyb2xzCiAgICAgICAqCiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNpbmdjdXN0b21jb250cm9scwogICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoJ3VzaW5nY3VzdG9tY29udHJvbHMnKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBTZXQgb3IgZ2V0IHRoZSBjdXJyZW50IE1lZGlhRXJyb3IKICAgKgogICAqIEBmaXJlcyBQbGF5ZXIjZXJyb3IKICAgKgogICAqIEBwYXJhbSAge01lZGlhRXJyb3J8c3RyaW5nfG51bWJlcn0gW2Vycl0KICAgKiAgICAgICAgIEEgTWVkaWFFcnJvciBvciBhIHN0cmluZy9udW1iZXIgdG8gYmUgdHVybmVkCiAgICogICAgICAgICBpbnRvIGEgTWVkaWFFcnJvcgogICAqCiAgICogQHJldHVybiB7TWVkaWFFcnJvcnxudWxsfQogICAqICAgICAgICAgVGhlIGN1cnJlbnQgTWVkaWFFcnJvciB3aGVuIGdldHRpbmcgKG9yIG51bGwpCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IoZXJyKSB7CiAgICBpZiAoZXJyID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuZXJyb3JfIHx8IG51bGw7CiAgICB9CgogICAgLy8gcmVzdG9yaW5nIHRvIGRlZmF1bHQKICAgIGlmIChlcnIgPT09IG51bGwpIHsKICAgICAgdGhpcy5lcnJvcl8gPSBlcnI7CiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1lcnJvcicpOwogICAgICBpZiAodGhpcy5lcnJvckRpc3BsYXkpIHsKICAgICAgICB0aGlzLmVycm9yRGlzcGxheS5jbG9zZSgpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLmVycm9yXyA9IG5ldyBNZWRpYUVycm9yKGVycik7CgogICAgLy8gYWRkIHRoZSB2anMtZXJyb3IgY2xhc3NuYW1lIHRvIHRoZSBwbGF5ZXIKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1lcnJvcicpOwoKICAgIC8vIGxvZyB0aGUgbmFtZSBvZiB0aGUgZXJyb3IgdHlwZSBhbmQgYW55IG1lc3NhZ2UKICAgIC8vIGllOCBqdXN0IGxvZ3MgIltvYmplY3Qgb2JqZWN0XSIgaWYgeW91IGp1c3QgbG9nIHRoZSBlcnJvciBvYmplY3QKICAgIGxvZyQxLmVycm9yKCcoQ09ERTonICsgdGhpcy5lcnJvcl8uY29kZSArICcgJyArIE1lZGlhRXJyb3IuZXJyb3JUeXBlc1t0aGlzLmVycm9yXy5jb2RlXSArICcpJywgdGhpcy5lcnJvcl8ubWVzc2FnZSwgdGhpcy5lcnJvcl8pOwoKICAgIC8qKgogICAgICogQGV2ZW50IFBsYXllciNlcnJvcgogICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogICAgICovCiAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJyk7CgogICAgcmV0dXJuOwogIH07CgogIC8qKgogICAqIFJlcG9ydCB1c2VyIGFjdGl2aXR5CiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQKICAgKiAgICAgICAgRXZlbnQgb2JqZWN0CiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnJlcG9ydFVzZXJBY3Rpdml0eSA9IGZ1bmN0aW9uIHJlcG9ydFVzZXJBY3Rpdml0eShldmVudCkgewogICAgdGhpcy51c2VyQWN0aXZpdHlfID0gdHJ1ZTsKICB9OwoKICAvKioKICAgKiBHZXQvc2V0IGlmIHVzZXIgaXMgYWN0aXZlCiAgICoKICAgKiBAZmlyZXMgUGxheWVyI3VzZXJhY3RpdmUKICAgKiBAZmlyZXMgUGxheWVyI3VzZXJpbmFjdGl2ZQogICAqCiAgICogQHBhcmFtIHtib29sZWFufSBbYm9vbF0KICAgKiAgICAgICAgLSB0cnVlIGlmIHRoZSB1c2VyIGlzIGFjdGl2ZQogICAqICAgICAgICAtIGZhbHNlIGlmIHRoZSB1c2VyIGlzIGluYWN0aXZlCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdXNlckFjdGl2ZSB3aGVuIGdldHRpbmcKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUudXNlckFjdGl2ZSA9IGZ1bmN0aW9uIHVzZXJBY3RpdmUoYm9vbCkgewogICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdGhpcy51c2VyQWN0aXZlXzsKICAgIH0KCiAgICBib29sID0gISFib29sOwoKICAgIGlmIChib29sID09PSB0aGlzLnVzZXJBY3RpdmVfKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0aGlzLnVzZXJBY3RpdmVfID0gYm9vbDsKCiAgICBpZiAodGhpcy51c2VyQWN0aXZlXykgewogICAgICB0aGlzLnVzZXJBY3Rpdml0eV8gPSB0cnVlOwogICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtdXNlci1pbmFjdGl2ZScpOwogICAgICB0aGlzLmFkZENsYXNzKCd2anMtdXNlci1hY3RpdmUnKTsKICAgICAgLyoqCiAgICAgICAqIEBldmVudCBQbGF5ZXIjdXNlcmFjdGl2ZQogICAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgICAqLwogICAgICB0aGlzLnRyaWdnZXIoJ3VzZXJhY3RpdmUnKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIENocm9tZS9TYWZhcmkvSUUgaGF2ZSBidWdzIHdoZXJlIHdoZW4geW91IGNoYW5nZSB0aGUgY3Vyc29yIGl0IGNhbgogICAgLy8gdHJpZ2dlciBhIG1vdXNlbW92ZSBldmVudC4gVGhpcyBjYXVzZXMgYW4gaXNzdWUgd2hlbiB5b3UncmUgaGlkaW5nCiAgICAvLyB0aGUgY3Vyc29yIHdoZW4gdGhlIHVzZXIgaXMgaW5hY3RpdmUsIGFuZCBhIG1vdXNlbW92ZSBzaWduYWxzIHVzZXIKICAgIC8vIGFjdGl2aXR5LiBNYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBnbyBpbnRvIGluYWN0aXZlIG1vZGUuIFNwZWNpZmljYWxseQogICAgLy8gdGhpcyBoYXBwZW5zIGluIGZ1bGxzY3JlZW4gd2hlbiB3ZSByZWFsbHkgbmVlZCB0byBoaWRlIHRoZSBjdXJzb3IuCiAgICAvLwogICAgLy8gV2hlbiB0aGlzIGdldHMgcmVzb2x2ZWQgaW4gQUxMIGJyb3dzZXJzIGl0IGNhbiBiZSByZW1vdmVkCiAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTAzMDQxCiAgICBpZiAodGhpcy50ZWNoXykgewogICAgICB0aGlzLnRlY2hfLm9uZSgnbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfSk7CiAgICB9CgogICAgdGhpcy51c2VyQWN0aXZpdHlfID0gZmFsc2U7CiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtdXNlci1hY3RpdmUnKTsKICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy11c2VyLWluYWN0aXZlJyk7CiAgICAvKioKICAgICAqIEBldmVudCBQbGF5ZXIjdXNlcmluYWN0aXZlCiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR+RXZlbnR9CiAgICAgKi8KICAgIHRoaXMudHJpZ2dlcigndXNlcmluYWN0aXZlJyk7CiAgfTsKCiAgLyoqCiAgICogTGlzdGVuIGZvciB1c2VyIGFjdGl2aXR5IGJhc2VkIG9uIHRpbWVvdXQgdmFsdWUKICAgKgogICAqIEBwcml2YXRlCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmxpc3RlbkZvclVzZXJBY3Rpdml0eV8gPSBmdW5jdGlvbiBsaXN0ZW5Gb3JVc2VyQWN0aXZpdHlfKCkgewogICAgdmFyIG1vdXNlSW5Qcm9ncmVzcyA9IHZvaWQgMDsKICAgIHZhciBsYXN0TW92ZVggPSB2b2lkIDA7CiAgICB2YXIgbGFzdE1vdmVZID0gdm9pZCAwOwogICAgdmFyIGhhbmRsZUFjdGl2aXR5ID0gYmluZCh0aGlzLCB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSk7CgogICAgdmFyIGhhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShlKSB7CiAgICAgIC8vICMxMDY4IC0gUHJldmVudCBtb3VzZW1vdmUgc3BhbW1pbmcKICAgICAgLy8gQ2hyb21lIEJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM2Njk3MAogICAgICBpZiAoZS5zY3JlZW5YICE9PSBsYXN0TW92ZVggfHwgZS5zY3JlZW5ZICE9PSBsYXN0TW92ZVkpIHsKICAgICAgICBsYXN0TW92ZVggPSBlLnNjcmVlblg7CiAgICAgICAgbGFzdE1vdmVZID0gZS5zY3JlZW5ZOwogICAgICAgIGhhbmRsZUFjdGl2aXR5KCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGhhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bigpIHsKICAgICAgaGFuZGxlQWN0aXZpdHkoKTsKICAgICAgLy8gRm9yIGFzIGxvbmcgYXMgdGhlIHRoZXkgYXJlIHRvdWNoaW5nIHRoZSBkZXZpY2Ugb3IgaGF2ZSB0aGVpciBtb3VzZSBkb3duLAogICAgICAvLyB3ZSBjb25zaWRlciB0aGVtIGFjdGl2ZSBldmVuIGlmIHRoZXkncmUgbm90IG1vdmluZyB0aGVpciBmaW5nZXIgb3IgbW91c2UuCiAgICAgIC8vIFNvIHdlIHdhbnQgdG8gY29udGludWUgdG8gdXBkYXRlIHRoYXQgdGhleSBhcmUgYWN0aXZlCiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbChtb3VzZUluUHJvZ3Jlc3MpOwogICAgICAvLyBTZXR0aW5nIHVzZXJBY3Rpdml0eT10cnVlIG5vdyBhbmQgc2V0dGluZyB0aGUgaW50ZXJ2YWwgdG8gdGhlIHNhbWUgdGltZQogICAgICAvLyBhcyB0aGUgYWN0aXZpdHlDaGVjayBpbnRlcnZhbCAoMjUwKSBzaG91bGQgZW5zdXJlIHdlIG5ldmVyIG1pc3MgdGhlCiAgICAgIC8vIG5leHQgYWN0aXZpdHlDaGVjawogICAgICBtb3VzZUluUHJvZ3Jlc3MgPSB0aGlzLnNldEludGVydmFsKGhhbmRsZUFjdGl2aXR5LCAyNTApOwogICAgfTsKCiAgICB2YXIgaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlVXAoZXZlbnQpIHsKICAgICAgaGFuZGxlQWN0aXZpdHkoKTsKICAgICAgLy8gU3RvcCB0aGUgaW50ZXJ2YWwgdGhhdCBtYWludGFpbnMgYWN0aXZpdHkgaWYgdGhlIG1vdXNlL3RvdWNoIGlzIGRvd24KICAgICAgdGhpcy5jbGVhckludGVydmFsKG1vdXNlSW5Qcm9ncmVzcyk7CiAgICB9OwoKICAgIC8vIEFueSBtb3VzZSBtb3ZlbWVudCB3aWxsIGJlIGNvbnNpZGVyZWQgdXNlciBhY3Rpdml0eQogICAgdGhpcy5vbignbW91c2Vkb3duJywgaGFuZGxlTW91c2VEb3duKTsKICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7CiAgICB0aGlzLm9uKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7CgogICAgLy8gTGlzdGVuIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uCiAgICAvLyBTaG91bGRuJ3QgbmVlZCB0byB1c2UgaW5Qcm9ncmVzcyBpbnRlcnZhbCBiZWNhdXNlIG9mIGtleSByZXBlYXQKICAgIHRoaXMub24oJ2tleWRvd24nLCBoYW5kbGVBY3Rpdml0eSk7CiAgICB0aGlzLm9uKCdrZXl1cCcsIGhhbmRsZUFjdGl2aXR5KTsKCiAgICAvLyBSdW4gYW4gaW50ZXJ2YWwgZXZlcnkgMjUwIG1pbGxpc2Vjb25kcyBpbnN0ZWFkIG9mIHN0dWZmaW5nIGV2ZXJ5dGhpbmcgaW50bwogICAgLy8gdGhlIG1vdXNlbW92ZS90b3VjaG1vdmUgZnVuY3Rpb24gaXRzZWxmLCB0byBwcmV2ZW50IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLgogICAgLy8gYHRoaXMucmVwb3J0VXNlckFjdGl2aXR5YCBzaW1wbHkgc2V0cyB0aGlzLnVzZXJBY3Rpdml0eV8gdG8gdHJ1ZSwgd2hpY2gKICAgIC8vIHRoZW4gZ2V0cyBwaWNrZWQgdXAgYnkgdGhpcyBsb29wCiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvbGVhcm5pbmctZnJvbS10d2l0dGVyLwogICAgdmFyIGluYWN0aXZpdHlUaW1lb3V0ID0gdm9pZCAwOwoKICAgIHRoaXMuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAvLyBDaGVjayB0byBzZWUgaWYgbW91c2UvdG91Y2ggYWN0aXZpdHkgaGFzIGhhcHBlbmVkCiAgICAgIGlmICghdGhpcy51c2VyQWN0aXZpdHlfKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyBSZXNldCB0aGUgYWN0aXZpdHkgdHJhY2tlcgogICAgICB0aGlzLnVzZXJBY3Rpdml0eV8gPSBmYWxzZTsKCiAgICAgIC8vIElmIHRoZSB1c2VyIHN0YXRlIHdhcyBpbmFjdGl2ZSwgc2V0IHRoZSBzdGF0ZSB0byBhY3RpdmUKICAgICAgdGhpcy51c2VyQWN0aXZlKHRydWUpOwoKICAgICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGluYWN0aXZpdHkgdGltZW91dCB0byBzdGFydCB0aGUgdGltZXIgb3ZlcgogICAgICB0aGlzLmNsZWFyVGltZW91dChpbmFjdGl2aXR5VGltZW91dCk7CgogICAgICB2YXIgdGltZW91dCA9IHRoaXMub3B0aW9uc18uaW5hY3Rpdml0eVRpbWVvdXQ7CgogICAgICBpZiAodGltZW91dCA8PSAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyBJbiA8dGltZW91dD4gbWlsbGlzZWNvbmRzLCBpZiBubyBtb3JlIGFjdGl2aXR5IGhhcyBvY2N1cnJlZCB0aGUKICAgICAgLy8gdXNlciB3aWxsIGJlIGNvbnNpZGVyZWQgaW5hY3RpdmUKICAgICAgaW5hY3Rpdml0eVRpbWVvdXQgPSB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCB0aGUgY2FzZSB3aGVyZSB0aGUgaW5hY3Rpdml0eVRpbWVvdXQgY2FuIHRyaWdnZXIganVzdAogICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCB1c2VyIGFjdGl2aXR5IGlzIHBpY2tlZCB1cCBieSB0aGUgYWN0aXZpdHkgY2hlY2sgbG9vcAogICAgICAgIC8vIGNhdXNpbmcgYSBmbGlja2VyCiAgICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpdml0eV8pIHsKICAgICAgICAgIHRoaXMudXNlckFjdGl2ZShmYWxzZSk7CiAgICAgICAgfQogICAgICB9LCB0aW1lb3V0KTsKICAgIH0sIDI1MCk7CiAgfTsKCiAgLyoqCiAgICogR2V0cyBvciBzZXRzIHRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUuIEEgcGxheWJhY2sgcmF0ZSBvZgogICAqIDEuMCByZXByZXNlbnRzIG5vcm1hbCBzcGVlZCBhbmQgMC41IHdvdWxkIGluZGljYXRlIGhhbGYtc3BlZWQKICAgKiBwbGF5YmFjaywgZm9yIGluc3RhbmNlLgogICAqCiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLW1lZGlhLXBsYXliYWNrcmF0ZQogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYXRlXQogICAqICAgICAgIE5ldyBwbGF5YmFjayByYXRlIHRvIHNldC4KICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUgd2hlbiBnZXR0aW5nIG9yIDEuMAogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5wbGF5YmFja1JhdGUgPSBmdW5jdGlvbiBwbGF5YmFja1JhdGUocmF0ZSkgewogICAgaWYgKHJhdGUgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UGxheWJhY2tSYXRlJywgcmF0ZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLmZlYXR1cmVzUGxheWJhY2tSYXRlKSB7CiAgICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdwbGF5YmFja1JhdGUnKTsKICAgIH0KICAgIHJldHVybiAxLjA7CiAgfTsKCiAgLyoqCiAgICogR2V0cyBvciBzZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgcGxheWJhY2sgcmF0ZS4gQSBkZWZhdWx0IHBsYXliYWNrIHJhdGUgb2YKICAgKiAxLjAgcmVwcmVzZW50cyBub3JtYWwgc3BlZWQgYW5kIDAuNSB3b3VsZCBpbmRpY2F0ZSBoYWxmLXNwZWVkIHBsYXliYWNrLCBmb3IgaW5zdGFuY2UuCiAgICogZGVmYXVsdFBsYXliYWNrUmF0ZSB3aWxsIG9ubHkgcmVwcmVzZW50IHdoYXQgdGhlIGludGlhbCBwbGF5YmFja1JhdGUgb2YgYSB2aWRlbyB3YXMsIG5vdAogICAqIG5vdCB0aGUgY3VycmVudCBwbGF5YmFja1JhdGUuCiAgICoKICAgKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tbWVkaWEtZGVmYXVsdHBsYXliYWNrcmF0ZQogICAqCiAgICogQHBhcmFtIHtudW1iZXJ9IFtyYXRlXQogICAqICAgICAgIE5ldyBkZWZhdWx0IHBsYXliYWNrIHJhdGUgdG8gc2V0LgogICAqCiAgICogQHJldHVybiB7bnVtYmVyfFBsYXllcn0KICAgKiAgICAgICAgIC0gVGhlIGRlZmF1bHQgcGxheWJhY2sgcmF0ZSB3aGVuIGdldHRpbmcgb3IgMS4wCiAgICogICAgICAgICAtIHRoZSBwbGF5ZXIgd2hlbiBzZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmRlZmF1bHRQbGF5YmFja1JhdGUgPSBmdW5jdGlvbiBkZWZhdWx0UGxheWJhY2tSYXRlKHJhdGUpIHsKICAgIGlmIChyYXRlICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMudGVjaENhbGxfKCdzZXREZWZhdWx0UGxheWJhY2tSYXRlJywgcmF0ZSk7CiAgICB9CgogICAgaWYgKHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy5mZWF0dXJlc1BsYXliYWNrUmF0ZSkgewogICAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnZGVmYXVsdFBsYXliYWNrUmF0ZScpOwogICAgfQogICAgcmV0dXJuIDEuMDsKICB9OwoKICAvKioKICAgKiBHZXRzIG9yIHNldHMgdGhlIGF1ZGlvIGZsYWcKICAgKgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbAogICAqICAgICAgICAtIHRydWUgc2lnbmFscyB0aGF0IHRoaXMgaXMgYW4gYXVkaW8gcGxheWVyCiAgICogICAgICAgIC0gZmFsc2Ugc2lnbmFscyB0aGF0IHRoaXMgaXMgbm90IGFuIGF1ZGlvIHBsYXllcgogICAqCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIGlzQXVkaW8gd2hlbiBnZXR0aW5nCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLmlzQXVkaW8gPSBmdW5jdGlvbiBpc0F1ZGlvKGJvb2wpIHsKICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5pc0F1ZGlvXyA9ICEhYm9vbDsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAhIXRoaXMuaXNBdWRpb187CiAgfTsKCiAgLyoqCiAgICogQSBoZWxwZXIgbWV0aG9kIGZvciBhZGRpbmcgYSB7QGxpbmsgVGV4dFRyYWNrfSB0byBvdXIKICAgKiB7QGxpbmsgVGV4dFRyYWNrTGlzdH0uCiAgICoKICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgVzNDIHNldHRpbmdzIHdlIGFsbG93IGFkZGluZyBhZGRpdGlvbmFsIGluZm8gdGhyb3VnaCBvcHRpb25zLgogICAqCiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtYWRkdGV4dHRyYWNrCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gW2tpbmRdCiAgICogICAgICAgIHRoZSBraW5kIG9mIFRleHRUcmFjayB5b3UgYXJlIGFkZGluZwogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF0KICAgKiAgICAgICAgdGhlIGxhYmVsIHRvIGdpdmUgdGhlIFRleHRUcmFjayBsYWJlbAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZV0KICAgKiAgICAgICAgdGhlIGxhbmd1YWdlIHRvIHNldCBvbiB0aGUgVGV4dFRyYWNrCiAgICoKICAgKiBAcmV0dXJuIHtUZXh0VHJhY2t8dW5kZWZpbmVkfQogICAqICAgICAgICAgdGhlIFRleHRUcmFjayB0aGF0IHdhcyBhZGRlZCBvciB1bmRlZmluZWQKICAgKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIHRlY2gKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuYWRkVGV4dFRyYWNrID0gZnVuY3Rpb24gYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSkgewogICAgaWYgKHRoaXMudGVjaF8pIHsKICAgICAgcmV0dXJuIHRoaXMudGVjaF8uYWRkVGV4dFRyYWNrKGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQ3JlYXRlIGEgcmVtb3RlIHtAbGluayBUZXh0VHJhY2t9IGFuZCBhbiB7QGxpbmsgSFRNTFRyYWNrRWxlbWVudH0uIEl0IHdpbGwKICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgdmlkZW8gZWxlbWVudCB3aGVuZXZlciB0aGUgc291cmNlIGNoYW5nZXMsIHVubGVzcwogICAqIG1hbnVhbENsZWFudXAgaXMgc2V0IHRvIGZhbHNlLgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgKiAgICAgICAgT3B0aW9ucyB0byBwYXNzIHRvIHtAbGluayBIVE1MVHJhY2tFbGVtZW50fSBkdXJpbmcgY3JlYXRpb24uIFNlZQogICAqICAgICAgICB7QGxpbmsgSFRNTFRyYWNrRWxlbWVudH0gZm9yIG9iamVjdCBwcm9wZXJ0aWVzIHRoYXQgeW91IHNob3VsZCB1c2UuCiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttYW51YWxDbGVhbnVwPXRydWVdIGlmIHNldCB0byBmYWxzZSwgdGhlIFRleHRUcmFjayB3aWxsIGJlCiAgICoKICAgKiBAcmV0dXJuIHtIdG1sVHJhY2tFbGVtZW50fQogICAqICAgICAgICAgdGhlIEhUTUxUcmFja0VsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZCBhbmQgYWRkZWQKICAgKiAgICAgICAgIHRvIHRoZSBIdG1sVHJhY2tFbGVtZW50TGlzdCBhbmQgdGhlIHJlbW90ZQogICAqICAgICAgICAgVGV4dFRyYWNrTGlzdAogICAqCiAgICogQGRlcHJlY2F0ZWQgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICJtYW51YWxDbGVhbnVwIiBwYXJhbWV0ZXIgd2lsbCBkZWZhdWx0CiAgICogICAgICAgICAgICAgdG8gImZhbHNlIiBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBWaWRlby5qcwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5hZGRSZW1vdGVUZXh0VHJhY2sgPSBmdW5jdGlvbiBhZGRSZW1vdGVUZXh0VHJhY2sob3B0aW9ucywgbWFudWFsQ2xlYW51cCkgewogICAgaWYgKHRoaXMudGVjaF8pIHsKICAgICAgcmV0dXJuIHRoaXMudGVjaF8uYWRkUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMsIG1hbnVhbENsZWFudXApOwogICAgfQogIH07CgogIC8qKgogICAqIFJlbW92ZSBhIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSBmcm9tIHRoZSByZXNwZWN0aXZlCiAgICoge0BsaW5rIFRleHRUcmFja0xpc3R9IGFuZCB7QGxpbmsgSHRtbFRyYWNrRWxlbWVudExpc3R9LgogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IHRyYWNrCiAgICogICAgICAgIFJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrfSB0byByZW1vdmUKICAgKgogICAqIEByZXR1cm4ge3VuZGVmaW5lZH0KICAgKiAgICAgICAgIGRvZXMgbm90IHJldHVybiBhbnl0aGluZwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5yZW1vdmVSZW1vdGVUZXh0VHJhY2sgPSBmdW5jdGlvbiByZW1vdmVSZW1vdGVUZXh0VHJhY2soKSB7CiAgICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LAogICAgICAgIF9yZWYzJHRyYWNrID0gX3JlZjMudHJhY2ssCiAgICAgICAgdHJhY2sgPSBfcmVmMyR0cmFjayA9PT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogX3JlZjMkdHJhY2s7CgogICAgLy8gZGVzdHJ1Y3R1cmUgdGhlIGlucHV0IGludG8gYW4gb2JqZWN0IHdpdGggYSB0cmFjayBhcmd1bWVudCwgZGVmYXVsdGluZyB0byBhcmd1bWVudHNbMF0KICAgIC8vIGRlZmF1bHQgdGhlIHdob2xlIGFyZ3VtZW50IHRvIGFuIGVtcHR5IG9iamVjdCBpZiBub3RoaW5nIHdhcyBwYXNzZWQgaW4KCiAgICBpZiAodGhpcy50ZWNoXykgewogICAgICByZXR1cm4gdGhpcy50ZWNoXy5yZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spOwogICAgfQogIH07CgogIC8qKgogICAqIEdldHMgYXZhaWxhYmxlIG1lZGlhIHBsYXliYWNrIHF1YWxpdHkgbWV0cmljcyBhcyBzcGVjaWZpZWQgYnkgdGhlIFczQydzIE1lZGlhCiAgICogUGxheWJhY2sgUXVhbGl0eSBBUEkuCiAgICoKICAgKiBAc2VlIFtTcGVjXXtAbGluayBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhLXBsYXliYWNrLXF1YWxpdHl9CiAgICoKICAgKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfQogICAqICAgICAgICAgQW4gb2JqZWN0IHdpdGggc3VwcG9ydGVkIG1lZGlhIHBsYXliYWNrIHF1YWxpdHkgbWV0cmljcyBvciB1bmRlZmluZWQgaWYgdGhlcmUKICAgKiAgICAgICAgIGlzIG5vIHRlY2ggb3IgdGhlIHRlY2ggZG9lcyBub3Qgc3VwcG9ydCBpdC4KICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkgPSBmdW5jdGlvbiBnZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpIHsKICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdnZXRWaWRlb1BsYXliYWNrUXVhbGl0eScpOwogIH07CgogIC8qKgogICAqIEdldCB2aWRlbyB3aWR0aAogICAqCiAgICogQHJldHVybiB7bnVtYmVyfQogICAqICAgICAgICAgY3VycmVudCB2aWRlbyB3aWR0aAogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS52aWRlb1dpZHRoID0gZnVuY3Rpb24gdmlkZW9XaWR0aCgpIHsKICAgIHJldHVybiB0aGlzLnRlY2hfICYmIHRoaXMudGVjaF8udmlkZW9XaWR0aCAmJiB0aGlzLnRlY2hfLnZpZGVvV2lkdGgoKSB8fCAwOwogIH07CgogIC8qKgogICAqIEdldCB2aWRlbyBoZWlnaHQKICAgKgogICAqIEByZXR1cm4ge251bWJlcn0KICAgKiAgICAgICAgIGN1cnJlbnQgdmlkZW8gaGVpZ2h0CiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnZpZGVvSGVpZ2h0ID0gZnVuY3Rpb24gdmlkZW9IZWlnaHQoKSB7CiAgICByZXR1cm4gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfLnZpZGVvSGVpZ2h0ICYmIHRoaXMudGVjaF8udmlkZW9IZWlnaHQoKSB8fCAwOwogIH07CgogIC8qKgogICAqIFRoZSBwbGF5ZXIncyBsYW5ndWFnZSBjb2RlCiAgICogTk9URTogVGhlIGxhbmd1YWdlIHNob3VsZCBiZSBzZXQgaW4gdGhlIHBsYXllciBvcHRpb25zIGlmIHlvdSB3YW50IHRoZQogICAqIHRoZSBjb250cm9scyB0byBiZSBidWlsdCB3aXRoIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuIENoYW5naW5nIHRoZSBsYW51Z2FnZQogICAqIGxhdGVyIHdpbGwgbm90IHVwZGF0ZSBjb250cm9scyB0ZXh0LgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXQogICAqICAgICAgICB0aGUgbGFuZ3VhZ2UgY29kZSB0byBzZXQgdGhlIHBsYXllciB0bwogICAqCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqICAgICAgICAgVGhlIGN1cnJlbnQgbGFuZ3VhZ2UgY29kZSB3aGVuIGdldHRpbmcKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUubGFuZ3VhZ2UgPSBmdW5jdGlvbiBsYW5ndWFnZShjb2RlKSB7CiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlXzsKICAgIH0KCiAgICB0aGlzLmxhbmd1YWdlXyA9IFN0cmluZyhjb2RlKS50b0xvd2VyQ2FzZSgpOwogIH07CgogIC8qKgogICAqIEdldCB0aGUgcGxheWVyJ3MgbGFuZ3VhZ2UgZGljdGlvbmFyeQogICAqIE1lcmdlIGV2ZXJ5IHRpbWUsIGJlY2F1c2UgYSBuZXdseSBhZGRlZCBwbHVnaW4gbWlnaHQgY2FsbCB2aWRlb2pzLmFkZExhbmd1YWdlKCkgYXQgYW55IHRpbWUKICAgKiBMYW5ndWFnZXMgc3BlY2lmaWVkIGRpcmVjdGx5IGluIHRoZSBwbGF5ZXIgb3B0aW9ucyBoYXZlIHByZWNlZGVuY2UKICAgKgogICAqIEByZXR1cm4ge0FycmF5fQogICAqICAgICAgICAgQW4gYXJyYXkgb2Ygb2Ygc3VwcG9ydGVkIGxhbmd1YWdlcwogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5sYW5ndWFnZXMgPSBmdW5jdGlvbiBsYW5ndWFnZXMoKSB7CiAgICByZXR1cm4gbWVyZ2VPcHRpb25zKFBsYXllci5wcm90b3R5cGUub3B0aW9uc18ubGFuZ3VhZ2VzLCB0aGlzLmxhbmd1YWdlc18pOwogIH07CgogIC8qKgogICAqIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdCByZXBlcmVzZW50aW5nIHRoZSBjdXJyZW50IHRyYWNrCiAgICogaW5mb3JtYXRpb24uICoqRE9FUyBub3QgcmV0dXJuIGl0IGFzIEpTT04qKgogICAqCiAgICogQHJldHVybiB7T2JqZWN0fQogICAqICAgICAgICAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBvZiB0cmFjayBpbmZvCiAgICovCgoKICBQbGF5ZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHsKICAgIHZhciBvcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9uc18pOwogICAgdmFyIHRyYWNrcyA9IG9wdGlvbnMudHJhY2tzOwoKICAgIG9wdGlvbnMudHJhY2tzID0gW107CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHRyYWNrID0gdHJhY2tzW2ldOwoKICAgICAgLy8gZGVlcCBtZXJnZSB0cmFja3MgYW5kIG51bGwgb3V0IHBsYXllciBzbyBubyBjaXJjdWxhciByZWZlcmVuY2VzCiAgICAgIHRyYWNrID0gbWVyZ2VPcHRpb25zKHRyYWNrKTsKICAgICAgdHJhY2sucGxheWVyID0gdW5kZWZpbmVkOwogICAgICBvcHRpb25zLnRyYWNrc1tpXSA9IHRyYWNrOwogICAgfQoKICAgIHJldHVybiBvcHRpb25zOwogIH07CgogIC8qKgogICAqIENyZWF0ZXMgYSBzaW1wbGUgbW9kYWwgZGlhbG9nIChhbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIE1vZGFsRGlhbG9nfQogICAqIGNvbXBvbmVudCkgdGhhdCBpbW1lZGlhdGVseSBvdmVybGF5cyB0aGUgcGxheWVyIHdpdGggYXJiaXRyYXJ5CiAgICogY29udGVudCBhbmQgcmVtb3ZlcyBpdHNlbGYgd2hlbiBjbG9zZWQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbnxFbGVtZW50fEFycmF5fG51bGx9IGNvbnRlbnQKICAgKiAgICAgICAgU2FtZSBhcyB7QGxpbmsgTW9kYWxEaWFsb2cjY29udGVudH0ncyBwYXJhbSBvZiB0aGUgc2FtZSBuYW1lLgogICAqICAgICAgICBUaGUgbW9zdCBzdHJhaWdodC1mb3J3YXJkIHVzYWdlIGlzIHRvIHByb3ZpZGUgYSBzdHJpbmcgb3IgRE9NCiAgICogICAgICAgIGVsZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAgICogICAgICAgIEV4dHJhIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIHtAbGluayBNb2RhbERpYWxvZ30uCiAgICoKICAgKiBAcmV0dXJuIHtNb2RhbERpYWxvZ30KICAgKiAgICAgICAgIHRoZSB7QGxpbmsgTW9kYWxEaWFsb2d9IHRoYXQgd2FzIGNyZWF0ZWQKICAgKi8KCgogIFBsYXllci5wcm90b3R5cGUuY3JlYXRlTW9kYWwgPSBmdW5jdGlvbiBjcmVhdGVNb2RhbChjb250ZW50LCBvcHRpb25zKSB7CiAgICB2YXIgX3RoaXM4ID0gdGhpczsKCiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQgfHwgJyc7CgogICAgdmFyIG1vZGFsID0gbmV3IE1vZGFsRGlhbG9nKHRoaXMsIG9wdGlvbnMpOwoKICAgIHRoaXMuYWRkQ2hpbGQobW9kYWwpOwogICAgbW9kYWwub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzOC5yZW1vdmVDaGlsZChtb2RhbCk7CiAgICB9KTsKCiAgICBtb2RhbC5vcGVuKCk7CiAgICByZXR1cm4gbW9kYWw7CiAgfTsKCiAgLyoqCiAgICogR2V0cyB0YWcgc2V0dGluZ3MKICAgKgogICAqIEBwYXJhbSB7RWxlbWVudH0gdGFnCiAgICogICAgICAgIFRoZSBwbGF5ZXIgdGFnCiAgICoKICAgKiBAcmV0dXJuIHtPYmplY3R9CiAgICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBhbGwgb2YgdGhlIHNldHRpbmdzCiAgICogICAgICAgICBmb3IgYSBwbGF5ZXIgdGFnCiAgICovCgoKICBQbGF5ZXIuZ2V0VGFnU2V0dGluZ3MgPSBmdW5jdGlvbiBnZXRUYWdTZXR0aW5ncyh0YWcpIHsKICAgIHZhciBiYXNlT3B0aW9ucyA9IHsKICAgICAgc291cmNlczogW10sCiAgICAgIHRyYWNrczogW10KICAgIH07CgogICAgdmFyIHRhZ09wdGlvbnMgPSBnZXRBdHRyaWJ1dGVzKHRhZyk7CiAgICB2YXIgZGF0YVNldHVwID0gdGFnT3B0aW9uc1snZGF0YS1zZXR1cCddOwoKICAgIGlmIChoYXNDbGFzcyh0YWcsICd2anMtZmx1aWQnKSkgewogICAgICB0YWdPcHRpb25zLmZsdWlkID0gdHJ1ZTsKICAgIH0KCiAgICAvLyBDaGVjayBpZiBkYXRhLXNldHVwIGF0dHIgZXhpc3RzLgogICAgaWYgKGRhdGFTZXR1cCAhPT0gbnVsbCkgewogICAgICAvLyBQYXJzZSBvcHRpb25zIEpTT04KICAgICAgLy8gSWYgZW1wdHkgc3RyaW5nLCBtYWtlIGl0IGEgcGFyc2FibGUganNvbiBvYmplY3QuCiAgICAgIHZhciBfc2FmZVBhcnNlVHVwbGUgPSB0dXBsZShkYXRhU2V0dXAgfHwgJ3t9JyksCiAgICAgICAgICBlcnIgPSBfc2FmZVBhcnNlVHVwbGVbMF0sCiAgICAgICAgICBkYXRhID0gX3NhZmVQYXJzZVR1cGxlWzFdOwoKICAgICAgaWYgKGVycikgewogICAgICAgIGxvZyQxLmVycm9yKGVycik7CiAgICAgIH0KICAgICAgYXNzaWduKHRhZ09wdGlvbnMsIGRhdGEpOwogICAgfQoKICAgIGFzc2lnbihiYXNlT3B0aW9ucywgdGFnT3B0aW9ucyk7CgogICAgLy8gR2V0IHRhZyBjaGlsZHJlbiBzZXR0aW5ncwogICAgaWYgKHRhZy5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgdmFyIGNoaWxkcmVuID0gdGFnLmNoaWxkTm9kZXM7CgogICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7IGkrKykgewogICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgIC8vIENoYW5nZSBjYXNlIG5lZWRlZDogaHR0cDovL2Vqb2huLm9yZy9ibG9nL25vZGVuYW1lLWNhc2Utc2Vuc2l0aXZpdHkvCiAgICAgICAgdmFyIGNoaWxkTmFtZSA9IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgICAgIGlmIChjaGlsZE5hbWUgPT09ICdzb3VyY2UnKSB7CiAgICAgICAgICBiYXNlT3B0aW9ucy5zb3VyY2VzLnB1c2goZ2V0QXR0cmlidXRlcyhjaGlsZCkpOwogICAgICAgIH0gZWxzZSBpZiAoY2hpbGROYW1lID09PSAndHJhY2snKSB7CiAgICAgICAgICBiYXNlT3B0aW9ucy50cmFja3MucHVzaChnZXRBdHRyaWJ1dGVzKGNoaWxkKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGJhc2VPcHRpb25zOwogIH07CgogIC8qKgogICAqIERldGVybWluZSB3ZXRoZXIgb3Igbm90IGZsZXhib3ggaXMgc3VwcG9ydGVkCiAgICoKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqICAgICAgICAgLSB0cnVlIGlmIGZsZXhib3ggaXMgc3VwcG9ydGVkCiAgICogICAgICAgICAtIGZhbHNlIGlmIGZsZXhib3ggaXMgbm90IHN1cHBvcnRlZAogICAqLwoKCiAgUGxheWVyLnByb3RvdHlwZS5mbGV4Tm90U3VwcG9ydGVkXyA9IGZ1bmN0aW9uIGZsZXhOb3RTdXBwb3J0ZWRfKCkgewogICAgdmFyIGVsZW0gPSBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ2knKTsKCiAgICAvLyBOb3RlOiBXZSBkb24ndCBhY3R1YWxseSB1c2UgZmxleEJhc2lzIChvciBmbGV4T3JkZXIpLCBidXQgaXQncyBvbmUgb2YgdGhlIG1vcmUKICAgIC8vIGNvbW1vbiBmbGV4IGZlYXR1cmVzIHRoYXQgd2UgY2FuIHJlbHkgb24gd2hlbiBjaGVja2luZyBmb3IgZmxleCBzdXBwb3J0LgogICAgcmV0dXJuICEoJ2ZsZXhCYXNpcycgaW4gZWxlbS5zdHlsZSB8fCAnd2Via2l0RmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8ICdtb3pGbGV4QmFzaXMnIGluIGVsZW0uc3R5bGUgfHwgJ21zRmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8CiAgICAvLyBJRTEwLXNwZWNpZmljICgyMDEyIGZsZXggc3BlYykKICAgICdtc0ZsZXhPcmRlcicgaW4gZWxlbS5zdHlsZSk7CiAgfTsKCiAgcmV0dXJuIFBsYXllcjsKfShDb21wb25lbnQpOwoKLyoqCiAqIEdldCB0aGUge0BsaW5rIFZpZGVvVHJhY2tMaXN0fQogKiBAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjdmlkZW90cmFja2xpc3QKICoKICogQHJldHVybiB7VmlkZW9UcmFja0xpc3R9CiAqICAgICAgICAgdGhlIGN1cnJlbnQgdmlkZW8gdHJhY2sgbGlzdAogKgogKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUudmlkZW9UcmFja3MKICovCgovKioKICogR2V0IHRoZSB7QGxpbmsgQXVkaW9UcmFja0xpc3R9CiAqIEBsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNhdWRpb3RyYWNrbGlzdAogKgogKiBAcmV0dXJuIHtBdWRpb1RyYWNrTGlzdH0KICogICAgICAgICB0aGUgY3VycmVudCBhdWRpbyB0cmFjayBsaXN0CiAqCiAqIEBtZXRob2QgUGxheWVyLnByb3RvdHlwZS5hdWRpb1RyYWNrcwogKi8KCi8qKgogKiBHZXQgdGhlIHtAbGluayBUZXh0VHJhY2tMaXN0fQogKgogKiBAbGluayBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtdGV4dHRyYWNrcwogKgogKiBAcmV0dXJuIHtUZXh0VHJhY2tMaXN0fQogKiAgICAgICAgIHRoZSBjdXJyZW50IHRleHQgdHJhY2sgbGlzdAogKgogKiBAbWV0aG9kIFBsYXllci5wcm90b3R5cGUudGV4dFRyYWNrcwogKi8KCi8qKgogKiBHZXQgdGhlIHJlbW90ZSB7QGxpbmsgVGV4dFRyYWNrTGlzdH0KICoKICogQHJldHVybiB7VGV4dFRyYWNrTGlzdH0KICogICAgICAgICBUaGUgY3VycmVudCByZW1vdGUgdGV4dCB0cmFjayBsaXN0CiAqCiAqIEBtZXRob2QgUGxheWVyLnByb3RvdHlwZS5yZW1vdGVUZXh0VHJhY2tzCiAqLwoKLyoqCiAqIEdldCB0aGUgcmVtb3RlIHtAbGluayBIdG1sVHJhY2tFbGVtZW50TGlzdH0gdHJhY2tzLgogKgogKiBAcmV0dXJuIHtIdG1sVHJhY2tFbGVtZW50TGlzdH0KICogICAgICAgICBUaGUgY3VycmVudCByZW1vdGUgdGV4dCB0cmFjayBlbGVtZW50IGxpc3QKICoKICogQG1ldGhvZCBQbGF5ZXIucHJvdG90eXBlLnJlbW90ZVRleHRUcmFja0VscwogKi8KCkFMTC5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lJCQxKSB7CiAgdmFyIHByb3BzID0gQUxMW25hbWUkJDFdOwoKICBQbGF5ZXIucHJvdG90eXBlW3Byb3BzLmdldHRlck5hbWVdID0gZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMudGVjaF8pIHsKICAgICAgcmV0dXJuIHRoaXMudGVjaF9bcHJvcHMuZ2V0dGVyTmFtZV0oKTsKICAgIH0KCiAgICAvLyBpZiB3ZSBoYXZlIG5vdCB5ZXQgbG9hZFRlY2hfLCB3ZSBjcmVhdGUge3ZpZGVvLGF1ZGlvLHRleHR9VHJhY2tzXwogICAgLy8gdGhlc2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlY2ggZHVyaW5nIGxvYWRpbmcKICAgIHRoaXNbcHJvcHMucHJpdmF0ZU5hbWVdID0gdGhpc1twcm9wcy5wcml2YXRlTmFtZV0gfHwgbmV3IHByb3BzLkxpc3RDbGFzcygpOwogICAgcmV0dXJuIHRoaXNbcHJvcHMucHJpdmF0ZU5hbWVdOwogIH07Cn0pOwoKLyoqCiAqIEdsb2JhbCBwbGF5ZXIgbGlzdAogKgogKiBAdHlwZSB7T2JqZWN0fQogKi8KUGxheWVyLnBsYXllcnMgPSB7fTsKCnZhciBuYXZpZ2F0b3IkMSA9IHdpbmRvd18xLm5hdmlnYXRvcjsKCi8qCiAqIFBsYXllciBpbnN0YW5jZSBvcHRpb25zLCBzdXJmYWNlZCB1c2luZyBvcHRpb25zCiAqIG9wdGlvbnMgPSBQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfCiAqIE1ha2UgY2hhbmdlcyBpbiBvcHRpb25zLCBub3QgaGVyZS4KICoKICogQHR5cGUge09iamVjdH0KICogQHByaXZhdGUKICovClBsYXllci5wcm90b3R5cGUub3B0aW9uc18gPSB7CiAgLy8gRGVmYXVsdCBvcmRlciBvZiBmYWxsYmFjayB0ZWNobm9sb2d5CiAgdGVjaE9yZGVyOiBUZWNoLmRlZmF1bHRUZWNoT3JkZXJfLAoKICBodG1sNToge30sCiAgZmxhc2g6IHt9LAoKICAvLyBkZWZhdWx0IGluYWN0aXZpdHkgdGltZW91dAogIGluYWN0aXZpdHlUaW1lb3V0OiAyMDAwLAoKICAvLyBkZWZhdWx0IHBsYXliYWNrIHJhdGVzCiAgcGxheWJhY2tSYXRlczogW10sCiAgLy8gQWRkIHBsYXliYWNrIHJhdGUgc2VsZWN0aW9uIGJ5IGFkZGluZyByYXRlcwogIC8vICdwbGF5YmFja1JhdGVzJzogWzAuNSwgMSwgMS41LCAyXSwKCiAgLy8gSW5jbHVkZWQgY29udHJvbCBzZXRzCiAgY2hpbGRyZW46IFsnbWVkaWFMb2FkZXInLCAncG9zdGVySW1hZ2UnLCAndGV4dFRyYWNrRGlzcGxheScsICdsb2FkaW5nU3Bpbm5lcicsICdiaWdQbGF5QnV0dG9uJywgJ2NvbnRyb2xCYXInLCAnZXJyb3JEaXNwbGF5JywgJ3RleHRUcmFja1NldHRpbmdzJ10sCgogIGxhbmd1YWdlOiBuYXZpZ2F0b3IkMSAmJiAobmF2aWdhdG9yJDEubGFuZ3VhZ2VzICYmIG5hdmlnYXRvciQxLmxhbmd1YWdlc1swXSB8fCBuYXZpZ2F0b3IkMS51c2VyTGFuZ3VhZ2UgfHwgbmF2aWdhdG9yJDEubGFuZ3VhZ2UpIHx8ICdlbicsCgogIC8vIGxvY2FsZXMgYW5kIHRoZWlyIGxhbmd1YWdlIHRyYW5zbGF0aW9ucwogIGxhbmd1YWdlczoge30sCgogIC8vIERlZmF1bHQgbWVzc2FnZSB0byBzaG93IHdoZW4gYSB2aWRlbyBjYW5ub3QgYmUgcGxheWVkLgogIG5vdFN1cHBvcnRlZE1lc3NhZ2U6ICdObyBjb21wYXRpYmxlIHNvdXJjZSB3YXMgZm91bmQgZm9yIHRoaXMgbWVkaWEuJwp9OwoKWwovKioKICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSAiZW5kZWQiIHN0YXRlLgogKgogKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHRoZSBwbGF5ZXIgaXMgaW4gdGhlIGVuZGVkIHN0YXRlLCBmYWxzZSBpZiBub3QuCiAqIEBtZXRob2QgUGxheWVyI2VuZGVkCiAqLwonZW5kZWQnLAovKioKICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSAic2Vla2luZyIgc3RhdGUuCiAqCiAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBsYXllciBpcyBpbiB0aGUgc2Vla2luZyBzdGF0ZSwgZmFsc2UgaWYgbm90LgogKiBAbWV0aG9kIFBsYXllciNzZWVraW5nCiAqLwonc2Vla2luZycsCi8qKgogKiBSZXR1cm5zIHRoZSBUaW1lUmFuZ2VzIG9mIHRoZSBtZWRpYSB0aGF0IGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlCiAqIGZvciBzZWVraW5nIHRvLgogKgogKiBAcmV0dXJuIHtUaW1lUmFuZ2VzfSB0aGUgc2Vla2FibGUgaW50ZXJ2YWxzIG9mIHRoZSBtZWRpYSB0aW1lbGluZQogKiBAbWV0aG9kIFBsYXllciNzZWVrYWJsZQogKi8KJ3NlZWthYmxlJywKLyoqCiAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV0d29yayBhY3Rpdml0eSBmb3IgdGhlIGVsZW1lbnQsIGZyb20KICogdGhlIGNvZGVzIGluIHRoZSBsaXN0IGJlbG93LgogKiAtIE5FVFdPUktfRU1QVFkgKG51bWVyaWMgdmFsdWUgMCkKICogICBUaGUgZWxlbWVudCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpc2VkLiBBbGwgYXR0cmlidXRlcyBhcmUgaW4KICogICB0aGVpciBpbml0aWFsIHN0YXRlcy4KICogLSBORVRXT1JLX0lETEUgKG51bWVyaWMgdmFsdWUgMSkKICogICBUaGUgZWxlbWVudCdzIHJlc291cmNlIHNlbGVjdGlvbiBhbGdvcml0aG0gaXMgYWN0aXZlIGFuZCBoYXMKICogICBzZWxlY3RlZCBhIHJlc291cmNlLCBidXQgaXQgaXMgbm90IGFjdHVhbGx5IHVzaW5nIHRoZSBuZXR3b3JrIGF0CiAqICAgdGhpcyB0aW1lLgogKiAtIE5FVFdPUktfTE9BRElORyAobnVtZXJpYyB2YWx1ZSAyKQogKiAgIFRoZSB1c2VyIGFnZW50IGlzIGFjdGl2ZWx5IHRyeWluZyB0byBkb3dubG9hZCBkYXRhLgogKiAtIE5FVFdPUktfTk9fU09VUkNFIChudW1lcmljIHZhbHVlIDMpCiAqICAgVGhlIGVsZW1lbnQncyByZXNvdXJjZSBzZWxlY3Rpb24gYWxnb3JpdGhtIGlzIGFjdGl2ZSwgYnV0IGl0IGhhcwogKiAgIG5vdCB5ZXQgZm91bmQgYSByZXNvdXJjZSB0byB1c2UuCiAqCiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI25ldHdvcmstc3RhdGVzCiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgbmV0d29yayBhY3Rpdml0eSBzdGF0ZQogKiBAbWV0aG9kIFBsYXllciNuZXR3b3JrU3RhdGUKICovCiduZXR3b3JrU3RhdGUnLAovKioKICogUmV0dXJucyBhIHZhbHVlIHRoYXQgZXhwcmVzc2VzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBlbGVtZW50CiAqIHdpdGggcmVzcGVjdCB0byByZW5kZXJpbmcgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24sIGZyb20gdGhlCiAqIGNvZGVzIGluIHRoZSBsaXN0IGJlbG93LgogKiAtIEhBVkVfTk9USElORyAobnVtZXJpYyB2YWx1ZSAwKQogKiAgIE5vIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgbWVkaWEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgogKiAtIEhBVkVfTUVUQURBVEEgKG51bWVyaWMgdmFsdWUgMSkKICogICBFbm91Z2ggb2YgdGhlIHJlc291cmNlIGhhcyBiZWVuIG9idGFpbmVkIHRoYXQgdGhlIGR1cmF0aW9uIG9mIHRoZQogKiAgIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KICogLSBIQVZFX0NVUlJFTlRfREFUQSAobnVtZXJpYyB2YWx1ZSAyKQogKiAgIERhdGEgZm9yIHRoZSBpbW1lZGlhdGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpcyBhdmFpbGFibGUuCiAqIC0gSEFWRV9GVVRVUkVfREFUQSAobnVtZXJpYyB2YWx1ZSAzKQogKiAgIERhdGEgZm9yIHRoZSBpbW1lZGlhdGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpcyBhdmFpbGFibGUsIGFzCiAqICAgd2VsbCBhcyBlbm91Z2ggZGF0YSBmb3IgdGhlIHVzZXIgYWdlbnQgdG8gYWR2YW5jZSB0aGUgY3VycmVudAogKiAgIHBsYXliYWNrIHBvc2l0aW9uIGluIHRoZSBkaXJlY3Rpb24gb2YgcGxheWJhY2suCiAqIC0gSEFWRV9FTk9VR0hfREFUQSAobnVtZXJpYyB2YWx1ZSA0KQogKiAgIFRoZSB1c2VyIGFnZW50IGVzdGltYXRlcyB0aGF0IGVub3VnaCBkYXRhIGlzIGF2YWlsYWJsZSBmb3IKICogICBwbGF5YmFjayB0byBwcm9jZWVkIHVuaW50ZXJydXB0ZWQuCiAqCiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS1tZWRpYS1yZWFkeXN0YXRlCiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgcGxheWJhY2sgcmVuZGVyaW5nIHN0YXRlCiAqIEBtZXRob2QgUGxheWVyI3JlYWR5U3RhdGUKICovCidyZWFkeVN0YXRlJ10uZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsKICBQbGF5ZXIucHJvdG90eXBlW2ZuXSA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKGZuKTsKICB9Owp9KTsKClRFQ0hfRVZFTlRTX1JFVFJJR0dFUi5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkgewogIFBsYXllci5wcm90b3R5cGVbJ2hhbmRsZVRlY2gnICsgdG9UaXRsZUNhc2UoZXZlbnQpICsgJ18nXSA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzLnRyaWdnZXIoZXZlbnQpOwogIH07Cn0pOwoKLyoqCiAqIEZpcmVkIHdoZW4gdGhlIHBsYXllciBoYXMgaW5pdGlhbCBkdXJhdGlvbiBhbmQgZGltZW5zaW9uIGluZm9ybWF0aW9uCiAqCiAqIEBldmVudCBQbGF5ZXIjbG9hZGVkbWV0YWRhdGEKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KCi8qKgogKiBGaXJlZCB3aGVuIHRoZSBwbGF5ZXIgaGFzIGRvd25sb2FkZWQgZGF0YSBhdCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgogKgogKiBAZXZlbnQgUGxheWVyI2xvYWRlZGRhdGEKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KCi8qKgogKiBGaXJlZCB3aGVuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGhhcyBjaGFuZ2VkICoKICogRHVyaW5nIHBsYXliYWNrIHRoaXMgaXMgZmlyZWQgZXZlcnkgMTUtMjUwIG1pbGxpc2Vjb25kcywgZGVwZW5kaW5nIG9uIHRoZQogKiBwbGF5YmFjayB0ZWNobm9sb2d5IGluIHVzZS4KICoKICogQGV2ZW50IFBsYXllciN0aW1ldXBkYXRlCiAqIEB0eXBlIHtFdmVudFRhcmdldH5FdmVudH0KICovCgovKioKICogRmlyZWQgd2hlbiB0aGUgdm9sdW1lIGNoYW5nZXMKICoKICogQGV2ZW50IFBsYXllciN2b2x1bWVjaGFuZ2UKICogQHR5cGUge0V2ZW50VGFyZ2V0fkV2ZW50fQogKi8KCi8qKgogKiBSZXBvcnRzIHdoZXRoZXIgb3Igbm90IGEgcGxheWVyIGhhcyBhIHBsdWdpbiBhdmFpbGFibGUuCiAqCiAqIFRoaXMgZG9lcyBub3QgcmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaGFzIGV2ZXIgYmVlbiBpbml0aWFsaXplZAogKiBvbiB0aGlzIHBsYXllci4gRm9yIHRoYXQsIFt1c2luZ1BsdWdpbl17QGxpbmsgUGxheWVyI3VzaW5nUGx1Z2lufS4KICoKICogQG1ldGhvZCBQbGF5ZXIjaGFzUGx1Z2luCiAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUKICogICAgICAgICBUaGUgbmFtZSBvZiBhIHBsdWdpbi4KICoKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGlzIHBsYXllciBoYXMgdGhlIHJlcXVlc3RlZCBwbHVnaW4gYXZhaWxhYmxlLgogKi8KCi8qKgogKiBSZXBvcnRzIHdoZXRoZXIgb3Igbm90IGEgcGxheWVyIGlzIHVzaW5nIGEgcGx1Z2luIGJ5IG5hbWUuCiAqCiAqIEZvciBiYXNpYyBwbHVnaW5zLCB0aGlzIG9ubHkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwbHVnaW4gaGFzIF9ldmVyXyBiZWVuCiAqIGluaXRpYWxpemVkIG9uIHRoaXMgcGxheWVyLgogKgogKiBAbWV0aG9kIFBsYXllciN1c2luZ1BsdWdpbgogKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUKICogICAgICAgICBUaGUgbmFtZSBvZiBhIHBsdWdpbi4KICoKICogQHJldHVybiB7Ym9vbGVhbn0KICogICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGlzIHBsYXllciBpcyB1c2luZyB0aGUgcmVxdWVzdGVkIHBsdWdpbi4KICovCgpDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXllcicsIFBsYXllcik7CgovKioKICogQGZpbGUgcGx1Z2luLmpzCiAqLwovKioKICogVGhlIGJhc2UgcGx1Z2luIG5hbWUuCiAqCiAqIEBwcml2YXRlCiAqIEBjb25zdGFudAogKiBAdHlwZSB7c3RyaW5nfQogKi8KdmFyIEJBU0VfUExVR0lOX05BTUUgPSAncGx1Z2luJzsKCi8qKgogKiBUaGUga2V5IG9uIHdoaWNoIGEgcGxheWVyJ3MgYWN0aXZlIHBsdWdpbnMgY2FjaGUgaXMgc3RvcmVkLgogKgogKiBAcHJpdmF0ZQogKiBAY29uc3RhbnQKICogQHR5cGUgICAgIHtzdHJpbmd9CiAqLwp2YXIgUExVR0lOX0NBQ0hFX0tFWSA9ICdhY3RpdmVQbHVnaW5zXyc7CgovKioKICogU3RvcmVzIHJlZ2lzdGVyZWQgcGx1Z2lucyBpbiBhIHByaXZhdGUgc3BhY2UuCiAqCiAqIEBwcml2YXRlCiAqIEB0eXBlICAgIHtPYmplY3R9CiAqLwp2YXIgcGx1Z2luU3RvcmFnZSA9IHt9OwoKLyoqCiAqIFJlcG9ydHMgd2hldGhlciBvciBub3QgYSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZC4KICoKICogQHByaXZhdGUKICogQHBhcmFtICAge3N0cmluZ30gbmFtZQogKiAgICAgICAgICBUaGUgbmFtZSBvZiBhIHBsdWdpbi4KICoKICogQHJldHVybnMge2Jvb2xlYW59CiAqICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaGFzIGJlZW4gcmVnaXN0ZXJlZC4KICovCnZhciBwbHVnaW5FeGlzdHMgPSBmdW5jdGlvbiBwbHVnaW5FeGlzdHMobmFtZSkgewogIHJldHVybiBwbHVnaW5TdG9yYWdlLmhhc093blByb3BlcnR5KG5hbWUpOwp9OwoKLyoqCiAqIEdldCBhIHNpbmdsZSByZWdpc3RlcmVkIHBsdWdpbiBieSBuYW1lLgogKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0gICB7c3RyaW5nfSBuYW1lCiAqICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLgogKgogKiBAcmV0dXJucyB7RnVuY3Rpb258dW5kZWZpbmVkfQogKiAgICAgICAgICBUaGUgcGx1Z2luIChvciB1bmRlZmluZWQpLgogKi8KdmFyIGdldFBsdWdpbiA9IGZ1bmN0aW9uIGdldFBsdWdpbihuYW1lKSB7CiAgcmV0dXJuIHBsdWdpbkV4aXN0cyhuYW1lKSA/IHBsdWdpblN0b3JhZ2VbbmFtZV0gOiB1bmRlZmluZWQ7Cn07CgovKioKICogTWFya3MgYSBwbHVnaW4gYXMgImFjdGl2ZSIgb24gYSBwbGF5ZXIuCiAqCiAqIEFsc28sIGVuc3VyZXMgdGhhdCB0aGUgcGxheWVyIGhhcyBhbiBvYmplY3QgZm9yIHRyYWNraW5nIGFjdGl2ZSBwbHVnaW5zLgogKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0gICB7UGxheWVyfSBwbGF5ZXIKICogICAgICAgICAgQSBWaWRlby5qcyBwbGF5ZXIgaW5zdGFuY2UuCiAqCiAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWUKICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uCiAqLwp2YXIgbWFya1BsdWdpbkFzQWN0aXZlID0gZnVuY3Rpb24gbWFya1BsdWdpbkFzQWN0aXZlKHBsYXllciwgbmFtZSkgewogIHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXSA9IHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXSB8fCB7fTsKICBwbGF5ZXJbUExVR0lOX0NBQ0hFX0tFWV1bbmFtZV0gPSB0cnVlOwp9OwoKLyoqCiAqIFRyaWdnZXJzIGEgcGFpciBvZiBwbHVnaW4gc2V0dXAgZXZlbnRzLgogKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0gIHtQbGF5ZXJ9IHBsYXllcgogKiAgICAgICAgIEEgVmlkZW8uanMgcGxheWVyIGluc3RhbmNlLgogKgogKiBAcGFyYW0gIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofSBoYXNoCiAqICAgICAgICAgQSBwbHVnaW4gZXZlbnQgaGFzaC4KICoKICogQHBhcmFtICB7Qm9vbGVhbn0gW2JlZm9yZV0KICogICAgICAgICBJZiB0cnVlLCBwcmVmaXhlcyB0aGUgZXZlbnQgbmFtZSB3aXRoICJiZWZvcmUiLiBJbiBvdGhlciB3b3JkcywKICogICAgICAgICB1c2UgdGhpcyB0byB0cmlnZ2VyICJiZWZvcmVwbHVnaW5zZXR1cCIgaW5zdGVhZCBvZiAicGx1Z2luc2V0dXAiLgogKi8KdmFyIHRyaWdnZXJTZXR1cEV2ZW50ID0gZnVuY3Rpb24gdHJpZ2dlclNldHVwRXZlbnQocGxheWVyLCBoYXNoLCBiZWZvcmUpIHsKICB2YXIgZXZlbnROYW1lID0gKGJlZm9yZSA/ICdiZWZvcmUnIDogJycpICsgJ3BsdWdpbnNldHVwJzsKCiAgcGxheWVyLnRyaWdnZXIoZXZlbnROYW1lLCBoYXNoKTsKICBwbGF5ZXIudHJpZ2dlcihldmVudE5hbWUgKyAnOicgKyBoYXNoLm5hbWUsIGhhc2gpOwp9OwoKLyoqCiAqIFRha2VzIGEgYmFzaWMgcGx1Z2luIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEgd3JhcHBlciBmdW5jdGlvbiB3aGljaCBtYXJrcwogKiBvbiB0aGUgcGxheWVyIHRoYXQgdGhlIHBsdWdpbiBoYXMgYmVlbiBhY3RpdmF0ZWQuCiAqCiAqIEBwcml2YXRlCiAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWUKICogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi4KICoKICogQHBhcmFtICAge0Z1bmN0aW9ufSBwbHVnaW4KICogICAgICAgICAgVGhlIGJhc2ljIHBsdWdpbi4KICoKICogQHJldHVybnMge0Z1bmN0aW9ufQogKiAgICAgICAgICBBIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBwbHVnaW4uCiAqLwp2YXIgY3JlYXRlQmFzaWNQbHVnaW4gPSBmdW5jdGlvbiBjcmVhdGVCYXNpY1BsdWdpbihuYW1lLCBwbHVnaW4pIHsKICB2YXIgYmFzaWNQbHVnaW5XcmFwcGVyID0gZnVuY3Rpb24gYmFzaWNQbHVnaW5XcmFwcGVyKCkgewoKICAgIC8vIFdlIHRyaWdnZXIgdGhlICJiZWZvcmVwbHVnaW5zZXR1cCIgYW5kICJwbHVnaW5zZXR1cCIgZXZlbnRzIG9uIHRoZSBwbGF5ZXIKICAgIC8vIHJlZ2FyZGxlc3MsIGJ1dCB3ZSB3YW50IHRoZSBoYXNoIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgaGFzaCBwcm92aWRlZAogICAgLy8gZm9yIGFkdmFuY2VkIHBsdWdpbnMuCiAgICAvLwogICAgLy8gVGhlIG9ubHkgcG90ZW50aWFsbHkgY291bnRlci1pbnR1aXRpdmUgdGhpbmcgaGVyZSBpcyB0aGUgYGluc3RhbmNlYCBpbgogICAgLy8gdGhlICJwbHVnaW5zZXR1cCIgZXZlbnQgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBgcGx1Z2luYCBmdW5jdGlvbi4KICAgIHRyaWdnZXJTZXR1cEV2ZW50KHRoaXMsIHsgbmFtZTogbmFtZSwgcGx1Z2luOiBwbHVnaW4sIGluc3RhbmNlOiBudWxsIH0sIHRydWUpOwoKICAgIHZhciBpbnN0YW5jZSA9IHBsdWdpbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgIG1hcmtQbHVnaW5Bc0FjdGl2ZSh0aGlzLCBuYW1lKTsKICAgIHRyaWdnZXJTZXR1cEV2ZW50KHRoaXMsIHsgbmFtZTogbmFtZSwgcGx1Z2luOiBwbHVnaW4sIGluc3RhbmNlOiBpbnN0YW5jZSB9KTsKCiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgT2JqZWN0LmtleXMocGx1Z2luKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7CiAgICBiYXNpY1BsdWdpbldyYXBwZXJbcHJvcF0gPSBwbHVnaW5bcHJvcF07CiAgfSk7CgogIHJldHVybiBiYXNpY1BsdWdpbldyYXBwZXI7Cn07CgovKioKICogVGFrZXMgYSBwbHVnaW4gc3ViLWNsYXNzIGFuZCByZXR1cm5zIGEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZwogKiBpbnN0YW5jZXMgb2YgaXQuCiAqCiAqIFRoaXMgZmFjdG9yeSBmdW5jdGlvbiB3aWxsIHJlcGxhY2UgaXRzZWxmIHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZAogKiBzdWItY2xhc3Mgb2YgUGx1Z2luLgogKgogKiBAcHJpdmF0ZQogKiBAcGFyYW0gICB7c3RyaW5nfSBuYW1lCiAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uCiAqCiAqIEBwYXJhbSAgIHtQbHVnaW59IFBsdWdpblN1YkNsYXNzCiAqICAgICAgICAgIFRoZSBhZHZhbmNlZCBwbHVnaW4uCiAqCiAqIEByZXR1cm5zIHtGdW5jdGlvbn0KICovCnZhciBjcmVhdGVQbHVnaW5GYWN0b3J5ID0gZnVuY3Rpb24gY3JlYXRlUGx1Z2luRmFjdG9yeShuYW1lLCBQbHVnaW5TdWJDbGFzcykgewoKICAvLyBBZGQgYSBgbmFtZWAgcHJvcGVydHkgdG8gdGhlIHBsdWdpbiBwcm90b3R5cGUgc28gdGhhdCBlYWNoIHBsdWdpbiBjYW4KICAvLyByZWZlciB0byBpdHNlbGYgYnkgbmFtZS4KICBQbHVnaW5TdWJDbGFzcy5wcm90b3R5cGUubmFtZSA9IG5hbWU7CgogIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICB0cmlnZ2VyU2V0dXBFdmVudCh0aGlzLCB7IG5hbWU6IG5hbWUsIHBsdWdpbjogUGx1Z2luU3ViQ2xhc3MsIGluc3RhbmNlOiBudWxsIH0sIHRydWUpOwoKICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CiAgICB9CgogICAgdmFyIGluc3RhbmNlID0gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShQbHVnaW5TdWJDbGFzcywgW251bGxdLmNvbmNhdChbdGhpc10uY29uY2F0KGFyZ3MpKSkpKCk7CgogICAgLy8gVGhlIHBsdWdpbiBpcyByZXBsYWNlZCBieSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpbnN0YW5jZS4KICAgIHRoaXNbbmFtZV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH07CgogICAgdHJpZ2dlclNldHVwRXZlbnQodGhpcywgaW5zdGFuY2UuZ2V0RXZlbnRIYXNoKCkpOwoKICAgIHJldHVybiBpbnN0YW5jZTsKICB9Owp9OwoKLyoqCiAqIFBhcmVudCBjbGFzcyBmb3IgYWxsIGFkdmFuY2VkIHBsdWdpbnMuCiAqCiAqIEBtaXhlcyAgIG1vZHVsZTpldmVudGVkfkV2ZW50ZWRNaXhpbgogKiBAbWl4ZXMgICBtb2R1bGU6c3RhdGVmdWx+U3RhdGVmdWxNaXhpbgogKiBAZmlyZXMgICBQbGF5ZXIjYmVmb3JlcGx1Z2luc2V0dXAKICogQGZpcmVzICAgUGxheWVyI2JlZm9yZXBsdWdpbnNldHVwOiRuYW1lCiAqIEBmaXJlcyAgIFBsYXllciNwbHVnaW5zZXR1cAogKiBAZmlyZXMgICBQbGF5ZXIjcGx1Z2luc2V0dXA6JG5hbWUKICogQGxpc3RlbnMgUGxheWVyI2Rpc3Bvc2UKICogQHRocm93cyAge0Vycm9yfQogKiAgICAgICAgICBJZiBhdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIHRoZSBiYXNlIHtAbGluayBQbHVnaW59IGNsYXNzCiAqICAgICAgICAgIGRpcmVjdGx5IGluc3RlYWQgb2YgdmlhIGEgc3ViLWNsYXNzLgogKi8KCnZhciBQbHVnaW4gPSBmdW5jdGlvbiAoKSB7CgogIC8qKgogICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KICAgKgogICAqIFN1Yi1jbGFzc2VzIHNob3VsZCBjYWxsIGBzdXBlcmAgdG8gZW5zdXJlIHBsdWdpbnMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLgogICAqCiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllcgogICAqICAgICAgICBBIFZpZGVvLmpzIHBsYXllciBpbnN0YW5jZS4KICAgKi8KICBmdW5jdGlvbiBQbHVnaW4ocGxheWVyKSB7CiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbHVnaW4pOwoKICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBQbHVnaW4pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW4gbXVzdCBiZSBzdWItY2xhc3NlZDsgbm90IGRpcmVjdGx5IGluc3RhbnRpYXRlZC4nKTsKICAgIH0KCiAgICB0aGlzLnBsYXllciA9IHBsYXllcjsKCiAgICAvLyBNYWtlIHRoaXMgb2JqZWN0IGV2ZW50ZWQsIGJ1dCByZW1vdmUgdGhlIGFkZGVkIGB0cmlnZ2VyYCBtZXRob2Qgc28gd2UKICAgIC8vIHVzZSB0aGUgcHJvdG90eXBlIHZlcnNpb24gaW5zdGVhZC4KICAgIGV2ZW50ZWQodGhpcyk7CiAgICBkZWxldGUgdGhpcy50cmlnZ2VyOwoKICAgIHN0YXRlZnVsKHRoaXMsIHRoaXMuY29uc3RydWN0b3IuZGVmYXVsdFN0YXRlKTsKICAgIG1hcmtQbHVnaW5Bc0FjdGl2ZShwbGF5ZXIsIHRoaXMubmFtZSk7CgogICAgLy8gQXV0by1iaW5kIHRoZSBkaXNwb3NlIG1ldGhvZCBzbyB3ZSBjYW4gdXNlIGl0IGFzIGEgbGlzdGVuZXIgYW5kIHVuYmluZAogICAgLy8gaXQgbGF0ZXIgZWFzaWx5LgogICAgdGhpcy5kaXNwb3NlID0gYmluZCh0aGlzLCB0aGlzLmRpc3Bvc2UpOwoKICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgZGlzcG9zZWQsIGRpc3Bvc2UgdGhlIHBsdWdpbi4KICAgIHBsYXllci5vbignZGlzcG9zZScsIHRoaXMuZGlzcG9zZSk7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbiB0aGF0IHdhcyBzZXQgb24gPHBsdWdpbk5hbWU+LlZFUlNJT04KICAgKi8KCgogIFBsdWdpbi5wcm90b3R5cGUudmVyc2lvbiA9IGZ1bmN0aW9uIHZlcnNpb24oKSB7CiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5WRVJTSU9OOwogIH07CgogIC8qKgogICAqIEVhY2ggZXZlbnQgdHJpZ2dlcmVkIGJ5IHBsdWdpbnMgaW5jbHVkZXMgYSBoYXNoIG9mIGFkZGl0aW9uYWwgZGF0YSB3aXRoCiAgICogY29udmVudGlvbmFsIHByb3BlcnRpZXMuCiAgICoKICAgKiBUaGlzIHJldHVybnMgdGhhdCBvYmplY3Qgb3IgbXV0YXRlcyBhbiBleGlzdGluZyBoYXNoLgogICAqCiAgICogQHBhcmFtICAge09iamVjdH0gW2hhc2g9e31dCiAgICogICAgICAgICAgQW4gb2JqZWN0IHRvIGJlIHVzZWQgYXMgZXZlbnQgYW4gZXZlbnQgaGFzaC4KICAgKgogICAqIEByZXR1cm5zIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofQogICAqICAgICAgICAgIEFuIGV2ZW50IGhhc2ggb2JqZWN0IHdpdGggcHJvdmlkZWQgcHJvcGVydGllcyBtaXhlZC1pbi4KICAgKi8KCgogIFBsdWdpbi5wcm90b3R5cGUuZ2V0RXZlbnRIYXNoID0gZnVuY3Rpb24gZ2V0RXZlbnRIYXNoKCkgewogICAgdmFyIGhhc2ggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9OwoKICAgIGhhc2gubmFtZSA9IHRoaXMubmFtZTsKICAgIGhhc2gucGx1Z2luID0gdGhpcy5jb25zdHJ1Y3RvcjsKICAgIGhhc2guaW5zdGFuY2UgPSB0aGlzOwogICAgcmV0dXJuIGhhc2g7CiAgfTsKCiAgLyoqCiAgICogVHJpZ2dlcnMgYW4gZXZlbnQgb24gdGhlIHBsdWdpbiBvYmplY3QgYW5kIG92ZXJyaWRlcwogICAqIHtAbGluayBtb2R1bGU6ZXZlbnRlZH5FdmVudGVkTWl4aW4udHJpZ2dlcnxFdmVudGVkTWl4aW4udHJpZ2dlcn0uCiAgICoKICAgKiBAcGFyYW0gICB7c3RyaW5nfE9iamVjdH0gZXZlbnQKICAgKiAgICAgICAgICBBbiBldmVudCB0eXBlIG9yIGFuIG9iamVjdCB3aXRoIGEgdHlwZSBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSAgIHtPYmplY3R9IFtoYXNoPXt9XQogICAqICAgICAgICAgIEFkZGl0aW9uYWwgZGF0YSBoYXNoIHRvIG1lcmdlIHdpdGggYQogICAqICAgICAgICAgIHtAbGluayBQbHVnaW5+UGx1Z2luRXZlbnRIYXNofFBsdWdpbkV2ZW50SGFzaH0uCiAgICoKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKiAgICAgICAgICBXaGV0aGVyIG9yIG5vdCBkZWZhdWx0IHdhcyBwcmV2ZW50ZWQuCiAgICovCgoKICBQbHVnaW4ucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiB0cmlnZ2VyJCQxKGV2ZW50KSB7CiAgICB2YXIgaGFzaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CgogICAgcmV0dXJuIHRyaWdnZXIodGhpcy5ldmVudEJ1c0VsXywgZXZlbnQsIHRoaXMuZ2V0RXZlbnRIYXNoKGhhc2gpKTsKICB9OwoKICAvKioKICAgKiBIYW5kbGVzICJzdGF0ZWNoYW5nZWQiIGV2ZW50cyBvbiB0aGUgcGx1Z2luLiBOby1vcCBieSBkZWZhdWx0LCBvdmVycmlkZSBieQogICAqIHN1YmNsYXNzaW5nLgogICAqCiAgICogQGFic3RyYWN0CiAgICogQHBhcmFtICAgIHtFdmVudH0gZQogICAqICAgICAgICAgICBBbiBldmVudCBvYmplY3QgcHJvdmlkZWQgYnkgYSAic3RhdGVjaGFuZ2VkIiBldmVudC4KICAgKgogICAqIEBwYXJhbSAgICB7T2JqZWN0fSBlLmNoYW5nZXMKICAgKiAgICAgICAgICAgQW4gb2JqZWN0IGRlc2NyaWJpbmcgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHdpdGggdGhlICJzdGF0ZWNoYW5nZWQiCiAgICogICAgICAgICAgIGV2ZW50LgogICAqLwoKCiAgUGx1Z2luLnByb3RvdHlwZS5oYW5kbGVTdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbiBoYW5kbGVTdGF0ZUNoYW5nZWQoZSkge307CgogIC8qKgogICAqIERpc3Bvc2VzIGEgcGx1Z2luLgogICAqCiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBpZiB0aGV5IHdhbnQsIGJ1dCBmb3IgdGhlIHNha2Ugb2Ygc2FmZXR5LAogICAqIGl0J3MgcHJvYmFibHkgYmVzdCB0byBzdWJzY3JpYmUgdGhlICJkaXNwb3NlIiBldmVudC4KICAgKgogICAqIEBmaXJlcyBQbHVnaW4jZGlzcG9zZQogICAqLwoKCiAgUGx1Z2luLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHsKICAgIHZhciBuYW1lID0gdGhpcy5uYW1lLAogICAgICAgIHBsYXllciA9IHRoaXMucGxheWVyOwoKICAgIC8qKgogICAgICogU2lnbmFscyB0aGF0IGEgYWR2YW5jZWQgcGx1Z2luIGlzIGFib3V0IHRvIGJlIGRpc3Bvc2VkLgogICAgICoKICAgICAqIEBldmVudCBQbHVnaW4jZGlzcG9zZQogICAgICogQHR5cGUgIHtFdmVudFRhcmdldH5FdmVudH0KICAgICAqLwoKICAgIHRoaXMudHJpZ2dlcignZGlzcG9zZScpOwogICAgdGhpcy5vZmYoKTsKICAgIHBsYXllci5vZmYoJ2Rpc3Bvc2UnLCB0aGlzLmRpc3Bvc2UpOwoKICAgIC8vIEVsaW1pbmF0ZSBhbnkgcG9zc2libGUgc291cmNlcyBvZiBsZWFraW5nIG1lbW9yeSBieSBjbGVhcmluZyB1cAogICAgLy8gcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwbGF5ZXIgYW5kIHRoZSBwbHVnaW4gaW5zdGFuY2UgYW5kIG51bGxpbmcgb3V0CiAgICAvLyB0aGUgcGx1Z2luJ3Mgc3RhdGUgYW5kIHJlcGxhY2luZyBtZXRob2RzIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRocm93cy4KICAgIHBsYXllcltQTFVHSU5fQ0FDSEVfS0VZXVtuYW1lXSA9IGZhbHNlOwogICAgdGhpcy5wbGF5ZXIgPSB0aGlzLnN0YXRlID0gbnVsbDsKCiAgICAvLyBGaW5hbGx5LCByZXBsYWNlIHRoZSBwbHVnaW4gbmFtZSBvbiB0aGUgcGxheWVyIHdpdGggYSBuZXcgZmFjdG9yeQogICAgLy8gZnVuY3Rpb24sIHNvIHRoYXQgdGhlIHBsdWdpbiBpcyByZWFkeSB0byBiZSBzZXQgdXAgYWdhaW4uCiAgICBwbGF5ZXJbbmFtZV0gPSBjcmVhdGVQbHVnaW5GYWN0b3J5KG5hbWUsIHBsdWdpblN0b3JhZ2VbbmFtZV0pOwogIH07CgogIC8qKgogICAqIERldGVybWluZXMgaWYgYSBwbHVnaW4gaXMgYSBiYXNpYyBwbHVnaW4gKGkuZS4gbm90IGEgc3ViLWNsYXNzIG9mIGBQbHVnaW5gKS4KICAgKgogICAqIEBwYXJhbSAgIHtzdHJpbmd8RnVuY3Rpb259IHBsdWdpbgogICAqICAgICAgICAgIElmIGEgc3RyaW5nLCBtYXRjaGVzIHRoZSBuYW1lIG9mIGEgcGx1Z2luLiBJZiBhIGZ1bmN0aW9uLCB3aWxsIGJlCiAgICogICAgICAgICAgdGVzdGVkIGRpcmVjdGx5LgogICAqCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICogICAgICAgICAgV2hldGhlciBvciBub3QgYSBwbHVnaW4gaXMgYSBiYXNpYyBwbHVnaW4uCiAgICovCgoKICBQbHVnaW4uaXNCYXNpYyA9IGZ1bmN0aW9uIGlzQmFzaWMocGx1Z2luKSB7CiAgICB2YXIgcCA9IHR5cGVvZiBwbHVnaW4gPT09ICdzdHJpbmcnID8gZ2V0UGx1Z2luKHBsdWdpbikgOiBwbHVnaW47CgogICAgcmV0dXJuIHR5cGVvZiBwID09PSAnZnVuY3Rpb24nICYmICFQbHVnaW4ucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocC5wcm90b3R5cGUpOwogIH07CgogIC8qKgogICAqIFJlZ2lzdGVyIGEgVmlkZW8uanMgcGx1Z2luLgogICAqCiAgICogQHBhcmFtICAge3N0cmluZ30gbmFtZQogICAqICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdG8gYmUgcmVnaXN0ZXJlZC4gTXVzdCBiZSBhIHN0cmluZyBhbmQKICAgKiAgICAgICAgICBtdXN0IG5vdCBtYXRjaCBhbiBleGlzdGluZyBwbHVnaW4gb3IgYSBtZXRob2Qgb24gdGhlIGBQbGF5ZXJgCiAgICogICAgICAgICAgcHJvdG90eXBlLgogICAqCiAgICogQHBhcmFtICAge0Z1bmN0aW9ufSBwbHVnaW4KICAgKiAgICAgICAgICBBIHN1Yi1jbGFzcyBvZiBgUGx1Z2luYCBvciBhIGZ1bmN0aW9uIGZvciBiYXNpYyBwbHVnaW5zLgogICAqCiAgICogQHJldHVybnMge0Z1bmN0aW9ufQogICAqICAgICAgICAgIEZvciBhZHZhbmNlZCBwbHVnaW5zLCBhIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoYXQgcGx1Z2luLiBGb3IKICAgKiAgICAgICAgICBiYXNpYyBwbHVnaW5zLCBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGUgcGx1Z2luLgogICAqLwoKCiAgUGx1Z2luLnJlZ2lzdGVyUGx1Z2luID0gZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gbmFtZSwgIicgKyBuYW1lICsgJyIsIG11c3QgYmUgYSBzdHJpbmcsIHdhcyAnICsgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihuYW1lKSkgKyAnLicpOwogICAgfQoKICAgIGlmIChwbHVnaW5FeGlzdHMobmFtZSkpIHsKICAgICAgbG9nJDEud2FybignQSBwbHVnaW4gbmFtZWQgIicgKyBuYW1lICsgJyIgYWxyZWFkeSBleGlzdHMuIFlvdSBtYXkgd2FudCB0byBhdm9pZCByZS1yZWdpc3RlcmluZyBwbHVnaW5zIScpOwogICAgfSBlbHNlIGlmIChQbGF5ZXIucHJvdG90eXBlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gbmFtZSwgIicgKyBuYW1lICsgJyIsIGNhbm5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhbiBleGlzdGluZyBwbGF5ZXIgbWV0aG9kIScpOwogICAgfQoKICAgIGlmICh0eXBlb2YgcGx1Z2luICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBwbHVnaW4gZm9yICInICsgbmFtZSArICciLCBtdXN0IGJlIGEgZnVuY3Rpb24sIHdhcyAnICsgKHR5cGVvZiBwbHVnaW4gPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHBsdWdpbikpICsgJy4nKTsKICAgIH0KCiAgICBwbHVnaW5TdG9yYWdlW25hbWVdID0gcGx1Z2luOwoKICAgIC8vIEFkZCBhIHBsYXllciBwcm90b3R5cGUgbWV0aG9kIGZvciBhbGwgc3ViLWNsYXNzZWQgcGx1Z2lucyAoYnV0IG5vdCBmb3IKICAgIC8vIHRoZSBiYXNlIFBsdWdpbiBjbGFzcykuCiAgICBpZiAobmFtZSAhPT0gQkFTRV9QTFVHSU5fTkFNRSkgewogICAgICBpZiAoUGx1Z2luLmlzQmFzaWMocGx1Z2luKSkgewogICAgICAgIFBsYXllci5wcm90b3R5cGVbbmFtZV0gPSBjcmVhdGVCYXNpY1BsdWdpbihuYW1lLCBwbHVnaW4pOwogICAgICB9IGVsc2UgewogICAgICAgIFBsYXllci5wcm90b3R5cGVbbmFtZV0gPSBjcmVhdGVQbHVnaW5GYWN0b3J5KG5hbWUsIHBsdWdpbik7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcGx1Z2luOwogIH07CgogIC8qKgogICAqIERlLXJlZ2lzdGVyIGEgVmlkZW8uanMgcGx1Z2luLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKICAgKiAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0byBiZSBkZXJlZ2lzdGVyZWQuCiAgICovCgoKICBQbHVnaW4uZGVyZWdpc3RlclBsdWdpbiA9IGZ1bmN0aW9uIGRlcmVnaXN0ZXJQbHVnaW4obmFtZSkgewogICAgaWYgKG5hbWUgPT09IEJBU0VfUExVR0lOX05BTUUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGUtcmVnaXN0ZXIgYmFzZSBwbHVnaW4uJyk7CiAgICB9CiAgICBpZiAocGx1Z2luRXhpc3RzKG5hbWUpKSB7CiAgICAgIGRlbGV0ZSBwbHVnaW5TdG9yYWdlW25hbWVdOwogICAgICBkZWxldGUgUGxheWVyLnByb3RvdHlwZVtuYW1lXTsKICAgIH0KICB9OwoKICAvKioKICAgKiBHZXRzIGFuIG9iamVjdCBjb250YWluaW5nIG11bHRpcGxlIFZpZGVvLmpzIHBsdWdpbnMuCiAgICoKICAgKiBAcGFyYW0gICB7QXJyYXl9IFtuYW1lc10KICAgKiAgICAgICAgICBJZiBwcm92aWRlZCwgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHBsdWdpbiBuYW1lcy4gRGVmYXVsdHMgdG8gX2FsbF8KICAgKiAgICAgICAgICBwbHVnaW4gbmFtZXMuCiAgICoKICAgKiBAcmV0dXJucyB7T2JqZWN0fHVuZGVmaW5lZH0KICAgKiAgICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBwbHVnaW4ocykgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIG5hbWUocykgb3IKICAgKiAgICAgICAgICBgdW5kZWZpbmVkYCBpZiBubyBtYXRjaGluZyBwbHVnaW5zIGV4aXN0KS4KICAgKi8KCgogIFBsdWdpbi5nZXRQbHVnaW5zID0gZnVuY3Rpb24gZ2V0UGx1Z2lucygpIHsKICAgIHZhciBuYW1lcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogT2JqZWN0LmtleXMocGx1Z2luU3RvcmFnZSk7CgogICAgdmFyIHJlc3VsdCA9IHZvaWQgMDsKCiAgICBuYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBwbHVnaW4gPSBnZXRQbHVnaW4obmFtZSk7CgogICAgICBpZiAocGx1Z2luKSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9OwogICAgICAgIHJlc3VsdFtuYW1lXSA9IHBsdWdpbjsKICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9OwoKICAvKioKICAgKiBHZXRzIGEgcGx1Z2luJ3MgdmVyc2lvbiwgaWYgYXZhaWxhYmxlCiAgICoKICAgKiBAcGFyYW0gICB7c3RyaW5nfSBuYW1lCiAgICogICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uCiAgICoKICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAqICAgICAgICAgIFRoZSBwbHVnaW4ncyB2ZXJzaW9uIG9yIGFuIGVtcHR5IHN0cmluZy4KICAgKi8KCgogIFBsdWdpbi5nZXRQbHVnaW5WZXJzaW9uID0gZnVuY3Rpb24gZ2V0UGx1Z2luVmVyc2lvbihuYW1lKSB7CiAgICB2YXIgcGx1Z2luID0gZ2V0UGx1Z2luKG5hbWUpOwoKICAgIHJldHVybiBwbHVnaW4gJiYgcGx1Z2luLlZFUlNJT04gfHwgJyc7CiAgfTsKCiAgcmV0dXJuIFBsdWdpbjsKfSgpOwoKLyoqCiAqIEdldHMgYSBwbHVnaW4gYnkgbmFtZSBpZiBpdCBleGlzdHMuCiAqCiAqIEBzdGF0aWMKICogQG1ldGhvZCAgIGdldFBsdWdpbgogKiBAbWVtYmVyT2YgUGx1Z2luCiAqIEBwYXJhbSAgICB7c3RyaW5nfSBuYW1lCiAqICAgICAgICAgICBUaGUgbmFtZSBvZiBhIHBsdWdpbi4KICoKICogQHJldHVybnMgIHtGdW5jdGlvbnx1bmRlZmluZWR9CiAqICAgICAgICAgICBUaGUgcGx1Z2luIChvciBgdW5kZWZpbmVkYCkuCiAqLwoKClBsdWdpbi5nZXRQbHVnaW4gPSBnZXRQbHVnaW47CgovKioKICogVGhlIG5hbWUgb2YgdGhlIGJhc2UgcGx1Z2luIGNsYXNzIGFzIGl0IGlzIHJlZ2lzdGVyZWQuCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqLwpQbHVnaW4uQkFTRV9QTFVHSU5fTkFNRSA9IEJBU0VfUExVR0lOX05BTUU7CgpQbHVnaW4ucmVnaXN0ZXJQbHVnaW4oQkFTRV9QTFVHSU5fTkFNRSwgUGx1Z2luKTsKCi8qKgogKiBEb2N1bWVudGVkIGluIHBsYXllci5qcwogKgogKiBAaWdub3JlCiAqLwpQbGF5ZXIucHJvdG90eXBlLnVzaW5nUGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gISF0aGlzW1BMVUdJTl9DQUNIRV9LRVldICYmIHRoaXNbUExVR0lOX0NBQ0hFX0tFWV1bbmFtZV0gPT09IHRydWU7Cn07CgovKioKICogRG9jdW1lbnRlZCBpbiBwbGF5ZXIuanMKICoKICogQGlnbm9yZQogKi8KUGxheWVyLnByb3RvdHlwZS5oYXNQbHVnaW4gPSBmdW5jdGlvbiAobmFtZSkgewogIHJldHVybiAhIXBsdWdpbkV4aXN0cyhuYW1lKTsKfTsKCi8qKgogKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaXMgYWJvdXQgdG8gYmUgc2V0IHVwIG9uIGEgcGxheWVyLgogKgogKiBAZXZlbnQgICAgUGxheWVyI2JlZm9yZXBsdWdpbnNldHVwCiAqIEB0eXBlICAgICB7UGx1Z2luflBsdWdpbkV2ZW50SGFzaH0KICovCgovKioKICogU2lnbmFscyB0aGF0IGEgcGx1Z2luIGlzIGFib3V0IHRvIGJlIHNldCB1cCBvbiBhIHBsYXllciAtIGJ5IG5hbWUuIFRoZSBuYW1lCiAqIGlzIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4uCiAqCiAqIEBldmVudCAgICBQbGF5ZXIjYmVmb3JlcGx1Z2luc2V0dXA6JG5hbWUKICogQHR5cGUgICAgIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofQogKi8KCi8qKgogKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaGFzIGp1c3QgYmVlbiBzZXQgdXAgb24gYSBwbGF5ZXIuCiAqCiAqIEBldmVudCAgICBQbGF5ZXIjcGx1Z2luc2V0dXAKICogQHR5cGUgICAgIHtQbHVnaW5+UGx1Z2luRXZlbnRIYXNofQogKi8KCi8qKgogKiBTaWduYWxzIHRoYXQgYSBwbHVnaW4gaGFzIGp1c3QgYmVlbiBzZXQgdXAgb24gYSBwbGF5ZXIgLSBieSBuYW1lLiBUaGUgbmFtZQogKiBpcyB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luLgogKgogKiBAZXZlbnQgICAgUGxheWVyI3BsdWdpbnNldHVwOiRuYW1lCiAqIEB0eXBlICAgICB7UGx1Z2luflBsdWdpbkV2ZW50SGFzaH0KICovCgovKioKICogQHR5cGVkZWYgIHtPYmplY3R9IFBsdWdpbn5QbHVnaW5FdmVudEhhc2gKICoKICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbmNlCiAqICAgICAgICAgICBGb3IgYmFzaWMgcGx1Z2lucywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGx1Z2luIGZ1bmN0aW9uLiBGb3IKICogICAgICAgICAgIGFkdmFuY2VkIHBsdWdpbnMsIHRoZSBwbHVnaW4gaW5zdGFuY2Ugb24gd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLgogKgogKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZQogKiAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbi4KICoKICogQHByb3BlcnR5IHtzdHJpbmd9IHBsdWdpbgogKiAgICAgICAgICAgRm9yIGJhc2ljIHBsdWdpbnMsIHRoZSBwbHVnaW4gZnVuY3Rpb24uIEZvciBhZHZhbmNlZCBwbHVnaW5zLCB0aGUKICogICAgICAgICAgIHBsdWdpbiBjbGFzcy9jb25zdHJ1Y3Rvci4KICovCgovKioKICogQGZpbGUgZXh0ZW5kLmpzCiAqIEBtb2R1bGUgZXh0ZW5kCiAqLwoKLyoqCiAqIEEgY29tYmluYXRpb24gb2Ygbm9kZSBpbmhlcml0cyBhbmQgYmFiZWwncyBpbmhlcml0cyAoYWZ0ZXIgdHJhbnNwaWxlKS4KICogQm90aCB3b3JrIHRoZSBzYW1lIGJ1dCBub2RlIGFkZHMgYHN1cGVyX2AgdG8gdGhlIHN1YkNsYXNzCiAqIGFuZCBCYWJsZSBhZGRzIHRoZSBzdXBlckNsYXNzIGFzIF9fcHJvdG9fXy4gQm90aCBzZWVtIHVzZWZ1bC4KICoKICogQHBhcmFtIHtPYmplY3R9IHN1YkNsYXNzCiAqICAgICAgICBUaGUgY2xhc3MgdG8gaW5oZXJpdCB0bwogKgogKiBAcGFyYW0ge09iamVjdH0gc3VwZXJDbGFzcwogKiAgICAgICAgVGhlIGNsYXNzIHRvIGluaGVyaXQgZnJvbQogKgogKiBAcHJpdmF0ZQogKi8KdmFyIF9pbmhlcml0cyA9IGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgewogIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyAodHlwZW9mIHN1cGVyQ2xhc3MgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHN1cGVyQ2xhc3MpKSk7CiAgfQoKICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgIHZhbHVlOiBzdWJDbGFzcywKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFibGU6IHRydWUKICAgIH0KICB9KTsKCiAgaWYgKHN1cGVyQ2xhc3MpIHsKICAgIC8vIG5vZGUKICAgIHN1YkNsYXNzLnN1cGVyXyA9IHN1cGVyQ2xhc3M7CiAgfQp9OwoKLyoqCiAqIEZ1bmN0aW9uIGZvciBzdWJjbGFzc2luZyB1c2luZyB0aGUgc2FtZSBpbmhlcml0YW5jZSB0aGF0CiAqIHZpZGVvanMgdXNlcyBpbnRlcm5hbGx5CiAqCiAqIEBzdGF0aWMKICogQGNvbnN0CiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBzdXBlckNsYXNzCiAqICAgICAgICBUaGUgY2xhc3MgdG8gaW5oZXJpdCBmcm9tCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBbc3ViQ2xhc3NNZXRob2RzPXt9XQogKiAgICAgICAgVGhlIGNsYXNzIHRvIGluaGVyaXQgdG8KICoKICogQHJldHVybiB7T2JqZWN0fQogKiAgICAgICAgIFRoZSBuZXcgb2JqZWN0IHdpdGggc3ViQ2xhc3NNZXRob2RzIHRoYXQgaW5oZXJpdGVkIHN1cGVyQ2xhc3MuCiAqLwp2YXIgZXh0ZW5kRm4gPSBmdW5jdGlvbiBleHRlbmRGbihzdXBlckNsYXNzKSB7CiAgdmFyIHN1YkNsYXNzTWV0aG9kcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CgogIHZhciBzdWJDbGFzcyA9IGZ1bmN0aW9uIHN1YkNsYXNzKCkgewogICAgc3VwZXJDbGFzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIHZhciBtZXRob2RzID0ge307CgogIGlmICgodHlwZW9mIHN1YkNsYXNzTWV0aG9kcyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoc3ViQ2xhc3NNZXRob2RzKSkgPT09ICdvYmplY3QnKSB7CiAgICBpZiAoc3ViQ2xhc3NNZXRob2RzLmNvbnN0cnVjdG9yICE9PSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7CiAgICAgIHN1YkNsYXNzID0gc3ViQ2xhc3NNZXRob2RzLmNvbnN0cnVjdG9yOwogICAgfQogICAgbWV0aG9kcyA9IHN1YkNsYXNzTWV0aG9kczsKICB9IGVsc2UgaWYgKHR5cGVvZiBzdWJDbGFzc01ldGhvZHMgPT09ICdmdW5jdGlvbicpIHsKICAgIHN1YkNsYXNzID0gc3ViQ2xhc3NNZXRob2RzOwogIH0KCiAgX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsKCiAgLy8gRXh0ZW5kIHN1Yk9iaidzIHByb3RvdHlwZSB3aXRoIGZ1bmN0aW9ucyBhbmQgb3RoZXIgcHJvcGVydGllcyBmcm9tIHByb3BzCiAgZm9yICh2YXIgbmFtZSBpbiBtZXRob2RzKSB7CiAgICBpZiAobWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBzdWJDbGFzcy5wcm90b3R5cGVbbmFtZV0gPSBtZXRob2RzW25hbWVdOwogICAgfQogIH0KCiAgcmV0dXJuIHN1YkNsYXNzOwp9OwoKLyoqCiAqIEBmaWxlIHZpZGVvLmpzCiAqIEBtb2R1bGUgdmlkZW9qcwogKi8KLy8gSW5jbHVkZSB0aGUgYnVpbHQtaW4gdGVjaHMKLy8gSFRNTDUgRWxlbWVudCBTaGltIGZvciBJRTgKaWYgKHR5cGVvZiBIVE1MVmlkZW9FbGVtZW50ID09PSAndW5kZWZpbmVkJyAmJiBpc1JlYWwoKSkgewogIGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCgndmlkZW8nKTsKICBkb2N1bWVudF8xLmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJyk7CiAgZG9jdW1lbnRfMS5jcmVhdGVFbGVtZW50KCd0cmFjaycpOwogIGRvY3VtZW50XzEuY3JlYXRlRWxlbWVudCgndmlkZW8tanMnKTsKfQoKLyoqCiAqIERvdWJsZXMgYXMgdGhlIG1haW4gZnVuY3Rpb24gZm9yIHVzZXJzIHRvIGNyZWF0ZSBhIHBsYXllciBpbnN0YW5jZSBhbmQgYWxzbwogKiB0aGUgbWFpbiBsaWJyYXJ5IG9iamVjdC4KICogVGhlIGB2aWRlb2pzYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIG9yIHJldHJpZXZlIGEgcGxheWVyLgogICoKICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gaWQKICogICAgICAgIFZpZGVvIGVsZW1lbnQgb3IgdmlkZW8gZWxlbWVudCBJRAogKgogKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdCiAqICAgICAgICBPcHRpb25hbCBvcHRpb25zIG9iamVjdCBmb3IgY29uZmlnL3NldHRpbmdzCiAqCiAqIEBwYXJhbSB7Q29tcG9uZW50flJlYWR5Q2FsbGJhY2t9IFtyZWFkeV0KICogICAgICAgIE9wdGlvbmFsIHJlYWR5IGNhbGxiYWNrCiAqCiAqIEByZXR1cm4ge1BsYXllcn0KICogICAgICAgICBBIHBsYXllciBpbnN0YW5jZQogKi8KZnVuY3Rpb24gdmlkZW9qcyhpZCwgb3B0aW9ucywgcmVhZHkpIHsKICB2YXIgdGFnID0gdm9pZCAwOwoKICAvLyBBbGxvdyBmb3IgZWxlbWVudCBvciBJRCB0byBiZSBwYXNzZWQgaW4KICAvLyBTdHJpbmcgSUQKICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykgewogICAgdmFyIHBsYXllcnMgPSB2aWRlb2pzLmdldFBsYXllcnMoKTsKCiAgICAvLyBBZGp1c3QgZm9yIGpRdWVyeSBJRCBzeW50YXgKICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHsKICAgICAgaWQgPSBpZC5zbGljZSgxKTsKICAgIH0KCiAgICAvLyBJZiBhIHBsYXllciBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgSUQgcmV0dXJuIGl0LgogICAgaWYgKHBsYXllcnNbaWRdKSB7CgogICAgICAvLyBJZiBvcHRpb25zIG9yIHJlYWR5IGZ1bmN0aW9uIGFyZSBwYXNzZWQsIHdhcm4KICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICBsb2ckMS53YXJuKCdQbGF5ZXIgIicgKyBpZCArICciIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQuIE9wdGlvbnMgd2lsbCBub3QgYmUgYXBwbGllZC4nKTsKICAgICAgfQoKICAgICAgaWYgKHJlYWR5KSB7CiAgICAgICAgcGxheWVyc1tpZF0ucmVhZHkocmVhZHkpOwogICAgICB9CgogICAgICByZXR1cm4gcGxheWVyc1tpZF07CiAgICB9CgogICAgLy8gT3RoZXJ3aXNlIGdldCBlbGVtZW50IGZvciBJRAogICAgdGFnID0gJCgnIycgKyBpZCk7CgogICAgLy8gSUQgaXMgYSBtZWRpYSBlbGVtZW50CiAgfSBlbHNlIHsKICAgIHRhZyA9IGlkOwogIH0KCiAgLy8gQ2hlY2sgZm9yIGEgdXNlYWJsZSBlbGVtZW50CiAgLy8gcmU6IG5vZGVOYW1lLCBjb3VsZCBiZSBhIGJveCBkaXYgYWxzbwogIGlmICghdGFnIHx8ICF0YWcubm9kZU5hbWUpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBlbGVtZW50IG9yIElEIHN1cHBsaWVkIGlzIG5vdCB2YWxpZC4gKHZpZGVvanMpJyk7CiAgfQoKICAvLyBFbGVtZW50IG1heSBoYXZlIGEgcGxheWVyIGF0dHIgcmVmZXJyaW5nIHRvIGFuIGFscmVhZHkgY3JlYXRlZCBwbGF5ZXIgaW5zdGFuY2UuCiAgLy8gSWYgc28gcmV0dXJuIHRoYXQgb3RoZXJ3aXNlIHNldCB1cCBhIG5ldyBwbGF5ZXIgYmVsb3cKICBpZiAodGFnLnBsYXllciB8fCBQbGF5ZXIucGxheWVyc1t0YWcucGxheWVySWRdKSB7CiAgICByZXR1cm4gdGFnLnBsYXllciB8fCBQbGF5ZXIucGxheWVyc1t0YWcucGxheWVySWRdOwogIH0KCiAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUgRE9NCiAgaWYgKGlzRWwodGFnKSAmJiAhZG9jdW1lbnRfMS5ib2R5LmNvbnRhaW5zKHRhZykpIHsKICAgIGxvZyQxLndhcm4oJ1RoZSBlbGVtZW50IHN1cHBsaWVkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRE9NJyk7CiAgfQoKICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgdmlkZW9qcy5ob29rcygnYmVmb3Jlc2V0dXAnKS5mb3JFYWNoKGZ1bmN0aW9uIChob29rRnVuY3Rpb24pIHsKICAgIHZhciBvcHRzID0gaG9va0Z1bmN0aW9uKHRhZywgbWVyZ2VPcHRpb25zKG9wdGlvbnMpKTsKCiAgICBpZiAoIWlzT2JqZWN0KG9wdHMpIHx8IEFycmF5LmlzQXJyYXkob3B0cykpIHsKICAgICAgbG9nJDEuZXJyb3IoJ3BsZWFzZSByZXR1cm4gYW4gb2JqZWN0IGluIGJlZm9yZXNldHVwIGhvb2tzJyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBvcHRpb25zID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIG9wdHMpOwogIH0pOwoKICB2YXIgUGxheWVyQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldENvbXBvbmVudCgnUGxheWVyJyk7CiAgLy8gSWYgbm90LCBzZXQgdXAgYSBuZXcgcGxheWVyCiAgdmFyIHBsYXllciA9IG5ldyBQbGF5ZXJDb21wb25lbnQodGFnLCBvcHRpb25zLCByZWFkeSk7CgogIHZpZGVvanMuaG9va3MoJ3NldHVwJykuZm9yRWFjaChmdW5jdGlvbiAoaG9va0Z1bmN0aW9uKSB7CiAgICByZXR1cm4gaG9va0Z1bmN0aW9uKHBsYXllcik7CiAgfSk7CgogIHJldHVybiBwbGF5ZXI7Cn0KCi8qKgogKiBBbiBPYmplY3QgdGhhdCBjb250YWlucyBsaWZlY3ljbGUgaG9va3MgYXMga2V5cyB3aGljaCBwb2ludCB0byBhbiBhcnJheQogKiBvZiBmdW5jdGlvbnMgdGhhdCBhcmUgcnVuIHdoZW4gYSBsaWZlY3ljbGUgaXMgdHJpZ2dlcmVkCiAqLwp2aWRlb2pzLmhvb2tzXyA9IHt9OwoKLyoqCiAqIEdldCBhIGxpc3Qgb2YgaG9va3MgZm9yIGEgc3BlY2lmaWMgbGlmZWN5Y2xlCiAqIEBmdW5jdGlvbiB2aWRlb2pzLmhvb2tzCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAqICAgICAgICB0aGUgbGlmZWN5bGUgdG8gZ2V0IGhvb2tzIGZyb20KICoKICogQHBhcmFtIHtGdW5jdGlvbnxGdW5jdGlvbltdfSBbZm5dCiAqICAgICAgICBPcHRpb25hbGx5IGFkZCBhIGhvb2sgKG9yIGhvb2tzKSB0byB0aGUgbGlmZWN5Y2xlIHRoYXQgeW91ciBhcmUgZ2V0dGluZy4KICoKICogQHJldHVybiB7QXJyYXl9CiAqICAgICAgICAgYW4gYXJyYXkgb2YgaG9va3MsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBub25lLgogKi8KdmlkZW9qcy5ob29rcyA9IGZ1bmN0aW9uICh0eXBlLCBmbikgewogIHZpZGVvanMuaG9va3NfW3R5cGVdID0gdmlkZW9qcy5ob29rc19bdHlwZV0gfHwgW107CiAgaWYgKGZuKSB7CiAgICB2aWRlb2pzLmhvb2tzX1t0eXBlXSA9IHZpZGVvanMuaG9va3NfW3R5cGVdLmNvbmNhdChmbik7CiAgfQogIHJldHVybiB2aWRlb2pzLmhvb2tzX1t0eXBlXTsKfTsKCi8qKgogKiBBZGQgYSBmdW5jdGlvbiBob29rIHRvIGEgc3BlY2lmaWMgdmlkZW9qcyBsaWZlY3ljbGUuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAqICAgICAgICB0aGUgbGlmZWN5Y2xlIHRvIGhvb2sgdGhlIGZ1bmN0aW9uIHRvLgogKgogKiBAcGFyYW0ge0Z1bmN0aW9ufEZ1bmN0aW9uW119CiAqICAgICAgICBUaGUgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGF0dGFjaC4KICovCnZpZGVvanMuaG9vayA9IGZ1bmN0aW9uICh0eXBlLCBmbikgewogIHZpZGVvanMuaG9va3ModHlwZSwgZm4pOwp9OwoKLyoqCiAqIEFkZCBhIGZ1bmN0aW9uIGhvb2sgdGhhdCB3aWxsIG9ubHkgcnVuIG9uY2UgdG8gYSBzcGVjaWZpYyB2aWRlb2pzIGxpZmVjeWNsZS4KICoKICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKICogICAgICAgIHRoZSBsaWZlY3ljbGUgdG8gaG9vayB0aGUgZnVuY3Rpb24gdG8uCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb258RnVuY3Rpb25bXX0KICogICAgICAgIFRoZSBmdW5jdGlvbiBvciBhcnJheSBvZiBmdW5jdGlvbnMgdG8gYXR0YWNoLgogKi8KdmlkZW9qcy5ob29rT25jZSA9IGZ1bmN0aW9uICh0eXBlLCBmbikgewogIHZpZGVvanMuaG9va3ModHlwZSwgW10uY29uY2F0KGZuKS5tYXAoZnVuY3Rpb24gKG9yaWdpbmFsKSB7CiAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uIHdyYXBwZXIoKSB7CiAgICAgIHZpZGVvanMucmVtb3ZlSG9vayh0eXBlLCB3cmFwcGVyKTsKICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgIH07CgogICAgcmV0dXJuIHdyYXBwZXI7CiAgfSkpOwp9OwoKLyoqCiAqIFJlbW92ZSBhIGhvb2sgZnJvbSBhIHNwZWNpZmljIHZpZGVvanMgbGlmZWN5Y2xlLgogKgogKiBAcGFyYW0ge3N0cmluZ30gdHlwZQogKiAgICAgICAgdGhlIGxpZmVjeWNsZSB0aGF0IHRoZSBmdW5jdGlvbiBob29rZWQgdG8KICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KICogICAgICAgIFRoZSBob29rZWQgZnVuY3Rpb24gdG8gcmVtb3ZlCiAqCiAqIEByZXR1cm4ge2Jvb2xlYW59CiAqICAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgd2FzIHJlbW92ZWQgb3IgdW5kZWYKICovCnZpZGVvanMucmVtb3ZlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBmbikgewogIHZhciBpbmRleCA9IHZpZGVvanMuaG9va3ModHlwZSkuaW5kZXhPZihmbik7CgogIGlmIChpbmRleCA8PSAtMSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdmlkZW9qcy5ob29rc19bdHlwZV0gPSB2aWRlb2pzLmhvb2tzX1t0eXBlXS5zbGljZSgpOwogIHZpZGVvanMuaG9va3NfW3R5cGVdLnNwbGljZShpbmRleCwgMSk7CgogIHJldHVybiB0cnVlOwp9OwoKLy8gQWRkIGRlZmF1bHQgc3R5bGVzCmlmICh3aW5kb3dfMS5WSURFT0pTX05PX0RZTkFNSUNfU1RZTEUgIT09IHRydWUgJiYgaXNSZWFsKCkpIHsKICB2YXIgc3R5bGUgPSAkKCcudmpzLXN0eWxlcy1kZWZhdWx0cycpOwoKICBpZiAoIXN0eWxlKSB7CiAgICBzdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudCgndmpzLXN0eWxlcy1kZWZhdWx0cycpOwogICAgdmFyIGhlYWQgPSAkKCdoZWFkJyk7CgogICAgaWYgKGhlYWQpIHsKICAgICAgaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGUsIGhlYWQuZmlyc3RDaGlsZCk7CiAgICB9CiAgICBzZXRUZXh0Q29udGVudChzdHlsZSwgJ1xuICAgICAgLnZpZGVvLWpzIHtcbiAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICBoZWlnaHQ6IDE1MHB4O1xuICAgICAgfVxuXG4gICAgICAudmpzLWZsdWlkIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDU2LjI1JVxuICAgICAgfVxuICAgICcpOwogIH0KfQoKLy8gUnVuIEF1dG8tbG9hZCBwbGF5ZXJzCi8vIFlvdSBoYXZlIHRvIHdhaXQgYXQgbGVhc3Qgb25jZSBpbiBjYXNlIHRoaXMgc2NyaXB0IGlzIGxvYWRlZCBhZnRlciB5b3VyCi8vIHZpZGVvIGluIHRoZSBET00gKHdlaXJkIGJlaGF2aW9yIG9ubHkgd2l0aCBtaW5pZmllZCB2ZXJzaW9uKQphdXRvU2V0dXBUaW1lb3V0KDEsIHZpZGVvanMpOwoKLyoqCiAqIEN1cnJlbnQgc29mdHdhcmUgdmVyc2lvbi4gRm9sbG93cyBzZW12ZXIuCiAqCiAqIEB0eXBlIHtzdHJpbmd9CiAqLwp2aWRlb2pzLlZFUlNJT04gPSB2ZXJzaW9uOwoKLyoqCiAqIFRoZSBnbG9iYWwgb3B0aW9ucyBvYmplY3QuIFRoZXNlIGFyZSB0aGUgc2V0dGluZ3MgdGhhdCB0YWtlIGVmZmVjdAogKiBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3aGVuIHRoZSBwbGF5ZXIgaXMgY3JlYXRlZC4KICoKICogQHR5cGUge09iamVjdH0KICovCnZpZGVvanMub3B0aW9ucyA9IFBsYXllci5wcm90b3R5cGUub3B0aW9uc187CgovKioKICogR2V0IGFuIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50bHkgY3JlYXRlZCBwbGF5ZXJzLCBrZXllZCBieSBwbGF5ZXIgSUQKICoKICogQHJldHVybiB7T2JqZWN0fQogKiAgICAgICAgIFRoZSBjcmVhdGVkIHBsYXllcnMKICovCnZpZGVvanMuZ2V0UGxheWVycyA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gUGxheWVyLnBsYXllcnM7Cn07CgovKioKICogRXhwb3NlIHBsYXllcnMgb2JqZWN0LgogKgogKiBAbWVtYmVyT2YgdmlkZW9qcwogKiBAcHJvcGVydHkge09iamVjdH0gcGxheWVycwogKi8KdmlkZW9qcy5wbGF5ZXJzID0gUGxheWVyLnBsYXllcnM7CgovKioKICogR2V0IGEgY29tcG9uZW50IGNsYXNzIG9iamVjdCBieSBuYW1lCiAqCiAqIEBib3Jyb3dzIENvbXBvbmVudC5nZXRDb21wb25lbnQgYXMgdmlkZW9qcy5nZXRDb21wb25lbnQKICovCnZpZGVvanMuZ2V0Q29tcG9uZW50ID0gQ29tcG9uZW50LmdldENvbXBvbmVudDsKCi8qKgogKiBSZWdpc3RlciBhIGNvbXBvbmVudCBzbyBpdCBjYW4gcmVmZXJyZWQgdG8gYnkgbmFtZS4gVXNlZCB3aGVuIGFkZGluZyB0byBvdGhlcgogKiBjb21wb25lbnRzLCBlaXRoZXIgdGhyb3VnaCBhZGRDaGlsZCBgY29tcG9uZW50LmFkZENoaWxkKCdteUNvbXBvbmVudCcpYCBvciB0aHJvdWdoCiAqIGRlZmF1bHQgY2hpbGRyZW4gb3B0aW9ucyAgYHsgY2hpbGRyZW46IFsnbXlDb21wb25lbnQnXSB9YC4KICoKICogPiBOT1RFOiBZb3UgY291bGQgYWxzbyBqdXN0IGluaXRpYWxpemUgdGhlIGNvbXBvbmVudCBiZWZvcmUgYWRkaW5nLgogKiBgY29tcG9uZW50LmFkZENoaWxkKG5ldyBNeUNvbXBvbmVudCgpKTtgCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgY29tcG9uZW50CiAqCiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wCiAqICAgICAgICBUaGUgY29tcG9uZW50IGNsYXNzCiAqCiAqIEByZXR1cm4ge0NvbXBvbmVudH0KICogICAgICAgICBUaGUgbmV3bHkgcmVnaXN0ZXJlZCBjb21wb25lbnQKICovCnZpZGVvanMucmVnaXN0ZXJDb21wb25lbnQgPSBmdW5jdGlvbiAobmFtZSQkMSwgY29tcCkgewogIGlmIChUZWNoLmlzVGVjaChjb21wKSkgewogICAgbG9nJDEud2FybignVGhlICcgKyBuYW1lJCQxICsgJyB0ZWNoIHdhcyByZWdpc3RlcmVkIGFzIGEgY29tcG9uZW50LiBJdCBzaG91bGQgaW5zdGVhZCBiZSByZWdpc3RlcmVkIHVzaW5nIHZpZGVvanMucmVnaXN0ZXJUZWNoKG5hbWUsIHRlY2gpJyk7CiAgfQoKICBDb21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQuY2FsbChDb21wb25lbnQsIG5hbWUkJDEsIGNvbXApOwp9OwoKLyoqCiAqIEdldCBhIFRlY2ggY2xhc3Mgb2JqZWN0IGJ5IG5hbWUKICoKICogQGJvcnJvd3MgVGVjaC5nZXRUZWNoIGFzIHZpZGVvanMuZ2V0VGVjaAogKi8KdmlkZW9qcy5nZXRUZWNoID0gVGVjaC5nZXRUZWNoOwoKLyoqCiAqIFJlZ2lzdGVyIGEgVGVjaCBzbyBpdCBjYW4gcmVmZXJyZWQgdG8gYnkgbmFtZS4KICogVGhpcyBpcyB1c2VkIGluIHRoZSB0ZWNoIG9yZGVyIGZvciB0aGUgcGxheWVyLgogKgogKiBAYm9ycm93cyBUZWNoLnJlZ2lzdGVyVGVjaCBhcyB2aWRlb2pzLnJlZ2lzdGVyVGVjaAogKi8KdmlkZW9qcy5yZWdpc3RlclRlY2ggPSBUZWNoLnJlZ2lzdGVyVGVjaDsKCnZpZGVvanMudXNlID0gdXNlOwoKLyoqCiAqIEEgc3VpdGUgb2YgYnJvd3NlciBhbmQgZGV2aWNlIHRlc3RzIGZyb20ge0BsaW5rIGJyb3dzZXJ9LgogKgogKiBAdHlwZSB7T2JqZWN0fQogKiBAcHJpdmF0ZQogKi8KdmlkZW9qcy5icm93c2VyID0gYnJvd3NlcjsKCi8qKgogKiBXaGV0aGVyIG9yIG5vdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0b3VjaCBldmVudHMuIEluY2x1ZGVkIGZvciBiYWNrd2FyZAogKiBjb21wYXRpYmlsaXR5IHdpdGggNC54LCBidXQgZGVwcmVjYXRlZC4gVXNlIGB2aWRlb2pzLmJyb3dzZXIuVE9VQ0hfRU5BQkxFRGAKICogaW5zdGVhZCBnb2luZyBmb3J3YXJkLgogKgogKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDUuMAogKiBAdHlwZSB7Ym9vbGVhbn0KICovCnZpZGVvanMuVE9VQ0hfRU5BQkxFRCA9IFRPVUNIX0VOQUJMRUQ7CgovKioKICogU3ViY2xhc3MgYW4gZXhpc3RpbmcgY2xhc3MKICogTWltaWNzIEVTNiBzdWJjbGFzc2luZyB3aXRoIHRoZSBgZXh0ZW5kYCBrZXl3b3JkCiAqCiAqIEBib3Jyb3dzIGV4dGVuZDpleHRlbmRGbiBhcyB2aWRlb2pzLmV4dGVuZAogKi8KdmlkZW9qcy5leHRlbmQgPSBleHRlbmRGbjsKCi8qKgogKiBNZXJnZSB0d28gb3B0aW9ucyBvYmplY3RzIHJlY3Vyc2l2ZWx5CiAqIFBlcmZvcm1zIGEgZGVlcCBtZXJnZSBsaWtlIGxvZGFzaC5tZXJnZSBidXQgKipvbmx5IG1lcmdlcyBwbGFpbiBvYmplY3RzKioKICogKG5vdCBhcnJheXMsIGVsZW1lbnRzLCBhbnl0aGluZyBlbHNlKQogKiBPdGhlciB2YWx1ZXMgd2lsbCBiZSBjb3BpZWQgZGlyZWN0bHkgZnJvbSB0aGUgc2Vjb25kIG9iamVjdC4KICoKICogQGJvcnJvd3MgbWVyZ2Utb3B0aW9uczptZXJnZU9wdGlvbnMgYXMgdmlkZW9qcy5tZXJnZU9wdGlvbnMKICovCnZpZGVvanMubWVyZ2VPcHRpb25zID0gbWVyZ2VPcHRpb25zOwoKLyoqCiAqIENoYW5nZSB0aGUgY29udGV4dCAodGhpcykgb2YgYSBmdW5jdGlvbgogKgogKiA+IE5PVEU6IGFzIG9mIHY1LjAgd2UgcmVxdWlyZSBhbiBFUzUgc2hpbSwgc28geW91IHNob3VsZCB1c2UgdGhlIG5hdGl2ZQogKiBgZnVuY3Rpb24oKSB7fS5iaW5kKG5ld0NvbnRleHQpO2AgaW5zdGVhZCBvZiB0aGlzLgogKgogKiBAYm9ycm93cyBmbjpiaW5kIGFzIHZpZGVvanMuYmluZAogKi8KdmlkZW9qcy5iaW5kID0gYmluZDsKCi8qKgogKiBSZWdpc3RlciBhIFZpZGVvLmpzIHBsdWdpbi4KICoKICogQGJvcnJvd3MgcGx1Z2luOnJlZ2lzdGVyUGx1Z2luIGFzIHZpZGVvanMucmVnaXN0ZXJQbHVnaW4KICogQG1ldGhvZCByZWdpc3RlclBsdWdpbgogKgogKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUKICogICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRvIGJlIHJlZ2lzdGVyZWQuIE11c3QgYmUgYSBzdHJpbmcgYW5kCiAqICAgICAgICAgbXVzdCBub3QgbWF0Y2ggYW4gZXhpc3RpbmcgcGx1Z2luIG9yIGEgbWV0aG9kIG9uIHRoZSBgUGxheWVyYAogKiAgICAgICAgIHByb3RvdHlwZS4KICoKICogQHBhcmFtICB7RnVuY3Rpb259IHBsdWdpbgogKiAgICAgICAgIEEgc3ViLWNsYXNzIG9mIGBQbHVnaW5gIG9yIGEgZnVuY3Rpb24gZm9yIGJhc2ljIHBsdWdpbnMuCiAqCiAqIEByZXR1cm4ge0Z1bmN0aW9ufQogKiAgICAgICAgIEZvciBhZHZhbmNlZCBwbHVnaW5zLCBhIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoYXQgcGx1Z2luLiBGb3IKICogICAgICAgICBiYXNpYyBwbHVnaW5zLCBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGUgcGx1Z2luLgogKi8KdmlkZW9qcy5yZWdpc3RlclBsdWdpbiA9IFBsdWdpbi5yZWdpc3RlclBsdWdpbjsKCi8qKgogKiBEZXByZWNhdGVkIG1ldGhvZCB0byByZWdpc3RlciBhIHBsdWdpbiB3aXRoIFZpZGVvLmpzCiAqCiAqIEBkZXByZWNhdGVkCiAqICAgICAgICB2aWRlb2pzLnBsdWdpbigpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB2aWRlb2pzLnJlZ2lzdGVyUGx1Z2luKCkgaW5zdGVhZAogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogKiAgICAgICAgVGhlIHBsdWdpbiBuYW1lCiAqCiAqIEBwYXJhbSB7UGx1Z2lufEZ1bmN0aW9ufSBwbHVnaW4KICogICAgICAgICBUaGUgcGx1Z2luIHN1Yi1jbGFzcyBvciBmdW5jdGlvbgogKi8KdmlkZW9qcy5wbHVnaW4gPSBmdW5jdGlvbiAobmFtZSQkMSwgcGx1Z2luKSB7CiAgbG9nJDEud2FybigndmlkZW9qcy5wbHVnaW4oKSBpcyBkZXByZWNhdGVkOyB1c2UgdmlkZW9qcy5yZWdpc3RlclBsdWdpbigpIGluc3RlYWQnKTsKICByZXR1cm4gUGx1Z2luLnJlZ2lzdGVyUGx1Z2luKG5hbWUkJDEsIHBsdWdpbik7Cn07CgovKioKICogR2V0cyBhbiBvYmplY3QgY29udGFpbmluZyBtdWx0aXBsZSBWaWRlby5qcyBwbHVnaW5zLgogKgogKiBAcGFyYW0gIHtBcnJheX0gW25hbWVzXQogKiAgICAgICAgIElmIHByb3ZpZGVkLCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgcGx1Z2luIG5hbWVzLiBEZWZhdWx0cyB0byBfYWxsXwogKiAgICAgICAgIHBsdWdpbiBuYW1lcy4KICoKICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH0KICogICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBwbHVnaW4ocykgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIG5hbWUocykgb3IKICogICAgICAgICBgdW5kZWZpbmVkYCBpZiBubyBtYXRjaGluZyBwbHVnaW5zIGV4aXN0KS4KICovCnZpZGVvanMuZ2V0UGx1Z2lucyA9IFBsdWdpbi5nZXRQbHVnaW5zOwoKLyoqCiAqIEdldHMgYSBwbHVnaW4gYnkgbmFtZSBpZiBpdCBleGlzdHMuCiAqCiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZQogKiAgICAgICAgIFRoZSBuYW1lIG9mIGEgcGx1Z2luLgogKgogKiBAcmV0dXJuIHtGdW5jdGlvbnx1bmRlZmluZWR9CiAqICAgICAgICAgVGhlIHBsdWdpbiAob3IgYHVuZGVmaW5lZGApLgogKi8KdmlkZW9qcy5nZXRQbHVnaW4gPSBQbHVnaW4uZ2V0UGx1Z2luOwoKLyoqCiAqIEdldHMgYSBwbHVnaW4ncyB2ZXJzaW9uLCBpZiBhdmFpbGFibGUKICoKICogQHBhcmFtICB7c3RyaW5nfSBuYW1lCiAqICAgICAgICAgVGhlIG5hbWUgb2YgYSBwbHVnaW4uCiAqCiAqIEByZXR1cm4ge3N0cmluZ30KICogICAgICAgICBUaGUgcGx1Z2luJ3MgdmVyc2lvbiBvciBhbiBlbXB0eSBzdHJpbmcuCiAqLwp2aWRlb2pzLmdldFBsdWdpblZlcnNpb24gPSBQbHVnaW4uZ2V0UGx1Z2luVmVyc2lvbjsKCi8qKgogKiBBZGRpbmcgbGFuZ3VhZ2VzIHNvIHRoYXQgdGhleSdyZSBhdmFpbGFibGUgdG8gYWxsIHBsYXllcnMuCiAqIEV4YW1wbGU6IGB2aWRlb2pzLmFkZExhbmd1YWdlKCdlcycsIHsgJ0hlbGxvJzogJ0hvbGEnIH0pO2AKICoKICogQHBhcmFtIHtzdHJpbmd9IGNvZGUKICogICAgICAgIFRoZSBsYW5ndWFnZSBjb2RlIG9yIGRpY3Rpb25hcnkgcHJvcGVydHkKICoKICogQHBhcmFtIHtPYmplY3R9IGRhdGEKICogICAgICAgIFRoZSBkYXRhIHZhbHVlcyB0byBiZSB0cmFuc2xhdGVkCiAqCiAqIEByZXR1cm4ge09iamVjdH0KICogICAgICAgICBUaGUgcmVzdWx0aW5nIGxhbmd1YWdlIGRpY3Rpb25hcnkgb2JqZWN0CiAqLwp2aWRlb2pzLmFkZExhbmd1YWdlID0gZnVuY3Rpb24gKGNvZGUsIGRhdGEpIHsKICB2YXIgX21lcmdlT3B0aW9uczsKCiAgY29kZSA9ICgnJyArIGNvZGUpLnRvTG93ZXJDYXNlKCk7CgogIHZpZGVvanMub3B0aW9ucy5sYW5ndWFnZXMgPSBtZXJnZU9wdGlvbnModmlkZW9qcy5vcHRpb25zLmxhbmd1YWdlcywgKF9tZXJnZU9wdGlvbnMgPSB7fSwgX21lcmdlT3B0aW9uc1tjb2RlXSA9IGRhdGEsIF9tZXJnZU9wdGlvbnMpKTsKCiAgcmV0dXJuIHZpZGVvanMub3B0aW9ucy5sYW5ndWFnZXNbY29kZV07Cn07CgovKioKICogTG9nIG1lc3NhZ2VzCiAqCiAqIEBib3Jyb3dzIGxvZzpsb2cgYXMgdmlkZW9qcy5sb2cKICovCnZpZGVvanMubG9nID0gbG9nJDE7CgovKioKICogQ3JlYXRlcyBhbiBlbXVsYXRlZCBUaW1lUmFuZ2Ugb2JqZWN0LgogKgogKiBAYm9ycm93cyB0aW1lLXJhbmdlczpjcmVhdGVUaW1lUmFuZ2VzIGFzIHZpZGVvanMuY3JlYXRlVGltZVJhbmdlCiAqLwovKioKICogQGJvcnJvd3MgdGltZS1yYW5nZXM6Y3JlYXRlVGltZVJhbmdlcyBhcyB2aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZXMKICovCnZpZGVvanMuY3JlYXRlVGltZVJhbmdlID0gdmlkZW9qcy5jcmVhdGVUaW1lUmFuZ2VzID0gY3JlYXRlVGltZVJhbmdlczsKCi8qKgogKiBGb3JtYXQgc2Vjb25kcyBhcyBhIHRpbWUgc3RyaW5nLCBIOk1NOlNTIG9yIE06U1MKICogU3VwcGx5aW5nIGEgZ3VpZGUgKGluIHNlY29uZHMpIHdpbGwgZm9yY2UgYSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcwogKiB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBndWlkZQogKgogKiBAYm9ycm93cyBmb3JtYXQtdGltZTpmb3JtYXRUaW1lIGFzIHZpZGVvanMuZm9ybWF0VGltZQogKi8KdmlkZW9qcy5mb3JtYXRUaW1lID0gZm9ybWF0VGltZTsKCi8qKgogKiBSZXNvbHZlIGFuZCBwYXJzZSB0aGUgZWxlbWVudHMgb2YgYSBVUkwKICoKICogQGJvcnJvd3MgdXJsOnBhcnNlVXJsIGFzIHZpZGVvanMucGFyc2VVcmwKICovCnZpZGVvanMucGFyc2VVcmwgPSBwYXJzZVVybDsKCi8qKgogKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHVybCBwYXNzZWQgaXMgYSBjcm9zcyBkb21haW4gcmVxdWVzdCBvciBub3QuCiAqCiAqIEBib3Jyb3dzIHVybDppc0Nyb3NzT3JpZ2luIGFzIHZpZGVvanMuaXNDcm9zc09yaWdpbgogKi8KdmlkZW9qcy5pc0Nyb3NzT3JpZ2luID0gaXNDcm9zc09yaWdpbjsKCi8qKgogKiBFdmVudCB0YXJnZXQgY2xhc3MuCiAqCiAqIEBib3Jyb3dzIEV2ZW50VGFyZ2V0IGFzIHZpZGVvanMuRXZlbnRUYXJnZXQKICovCnZpZGVvanMuRXZlbnRUYXJnZXQgPSBFdmVudFRhcmdldDsKCi8qKgogKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gZWxlbWVudAogKiBJdCBzdG9yZXMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBjYWNoZSBvYmplY3QKICogYW5kIGFkZHMgYSBnZW5lcmljIGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQncyBldmVudCwKICogYWxvbmcgd2l0aCBhIHVuaXF1ZSBpZCAoZ3VpZCkgdG8gdGhlIGVsZW1lbnQuCiAqCiAqIEBib3Jyb3dzIGV2ZW50czpvbiBhcyB2aWRlb2pzLm9uCiAqLwp2aWRlb2pzLm9uID0gb247CgovKioKICogVHJpZ2dlciBhIGxpc3RlbmVyIG9ubHkgb25jZSBmb3IgYW4gZXZlbnQKICoKICogQGJvcnJvd3MgZXZlbnRzOm9uZSBhcyB2aWRlb2pzLm9uZQogKi8KdmlkZW9qcy5vbmUgPSBvbmU7CgovKioKICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZnJvbSBhbiBlbGVtZW50CiAqCiAqIEBib3Jyb3dzIGV2ZW50czpvZmYgYXMgdmlkZW9qcy5vZmYKICovCnZpZGVvanMub2ZmID0gb2ZmOwoKLyoqCiAqIFRyaWdnZXIgYW4gZXZlbnQgZm9yIGFuIGVsZW1lbnQKICoKICogQGJvcnJvd3MgZXZlbnRzOnRyaWdnZXIgYXMgdmlkZW9qcy50cmlnZ2VyCiAqLwp2aWRlb2pzLnRyaWdnZXIgPSB0cmlnZ2VyOwoKLyoqCiAqIEEgY3Jvc3MtYnJvd3NlciBYTUxIdHRwUmVxdWVzdCB3cmFwcGVyLiBIZXJlJ3MgYSBzaW1wbGUgZXhhbXBsZToKICoKICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICogICAgICAgIHNldHRpbmdzIGZvciB0aGUgcmVxdWVzdC4KICoKICogQHJldHVybiB7WE1MSHR0cFJlcXVlc3R8WERvbWFpblJlcXVlc3R9CiAqICAgICAgICAgVGhlIHJlcXVlc3Qgb2JqZWN0LgogKgogKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SYXlub3MveGhyCiAqLwp2aWRlb2pzLnhociA9IHhocjsKCi8qKgogKiBUZXh0VHJhY2sgY2xhc3MKICoKICogQGJvcnJvd3MgVGV4dFRyYWNrIGFzIHZpZGVvanMuVGV4dFRyYWNrCiAqLwp2aWRlb2pzLlRleHRUcmFjayA9IFRleHRUcmFjazsKCi8qKgogKiBleHBvcnQgdGhlIEF1ZGlvVHJhY2sgY2xhc3Mgc28gdGhhdCBzb3VyY2UgaGFuZGxlcnMgY2FuIGNyZWF0ZQogKiBBdWRpb1RyYWNrcyBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgcGxheWVycyBBdWRpb1RyYWNrTGlzdAogKgogKiBAYm9ycm93cyBBdWRpb1RyYWNrIGFzIHZpZGVvanMuQXVkaW9UcmFjawogKi8KdmlkZW9qcy5BdWRpb1RyYWNrID0gQXVkaW9UcmFjazsKCi8qKgogKiBleHBvcnQgdGhlIFZpZGVvVHJhY2sgY2xhc3Mgc28gdGhhdCBzb3VyY2UgaGFuZGxlcnMgY2FuIGNyZWF0ZQogKiBWaWRlb1RyYWNrcyBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgcGxheWVycyBWaWRlb1RyYWNrTGlzdAogKgogKiBAYm9ycm93cyBWaWRlb1RyYWNrIGFzIHZpZGVvanMuVmlkZW9UcmFjawogKi8KdmlkZW9qcy5WaWRlb1RyYWNrID0gVmlkZW9UcmFjazsKCi8qKgogKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSBET00gZWxlbWVudC4KICoKICogQGJvcnJvd3MgZG9tOmlzRWwgYXMgdmlkZW9qcy5pc0VsCiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5pc0VsKCkgaW5zdGVhZAogKi8KCi8qKgogKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSB0ZXh0IG5vZGUuCiAqCiAqIEBib3Jyb3dzIGRvbTppc1RleHROb2RlIGFzIHZpZGVvanMuaXNUZXh0Tm9kZQogKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uaXNUZXh0Tm9kZSgpIGluc3RlYWQKICovCgovKioKICogQ3JlYXRlcyBhbiBlbGVtZW50IGFuZCBhcHBsaWVzIHByb3BlcnRpZXMuCiAqCiAqIEBib3Jyb3dzIGRvbTpjcmVhdGVFbCBhcyB2aWRlb2pzLmNyZWF0ZUVsCiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5jcmVhdGVFbCgpIGluc3RlYWQKICovCgovKioKICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3MKICoKICogQGJvcnJvd3MgZG9tOmhhc0VsQ2xhc3MgYXMgdmlkZW9qcy5oYXNDbGFzcwogKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uaGFzQ2xhc3MoKSBpbnN0ZWFkCiAqLwoKLyoqCiAqIEFkZCBhIENTUyBjbGFzcyBuYW1lIHRvIGFuIGVsZW1lbnQKICoKICogQGJvcnJvd3MgZG9tOmFkZEVsQ2xhc3MgYXMgdmlkZW9qcy5hZGRDbGFzcwogKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uYWRkQ2xhc3MoKSBpbnN0ZWFkCiAqLwoKLyoqCiAqIFJlbW92ZSBhIENTUyBjbGFzcyBuYW1lIGZyb20gYW4gZWxlbWVudAogKgogKiBAYm9ycm93cyBkb206cmVtb3ZlRWxDbGFzcyBhcyB2aWRlb2pzLnJlbW92ZUNsYXNzCiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5yZW1vdmVDbGFzcygpIGluc3RlYWQKICovCgovKioKICogQWRkcyBvciByZW1vdmVzIGEgQ1NTIGNsYXNzIG5hbWUgb24gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gYW4gb3B0aW9uYWwKICogY29uZGl0aW9uIG9yIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIHRoZSBjbGFzcyBuYW1lLgogKgogKiBAYm9ycm93cyBkb206dG9nZ2xlRWxDbGFzcyBhcyB2aWRlb2pzLnRvZ2dsZUNsYXNzCiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS50b2dnbGVDbGFzcygpIGluc3RlYWQKICovCgovKioKICogQXBwbHkgYXR0cmlidXRlcyB0byBhbiBIVE1MIGVsZW1lbnQuCiAqCiAqIEBib3Jyb3dzIGRvbTpzZXRFbEF0dHJpYnV0ZXMgYXMgdmlkZW9qcy5zZXRBdHRyaWJ1dGUKICogQGRlcHJlY2F0ZWQgVXNlIHZpZGVvanMuZG9tLnNldEF0dHJpYnV0ZXMoKSBpbnN0ZWFkCiAqLwoKLyoqCiAqIEdldCBhbiBlbGVtZW50J3MgYXR0cmlidXRlIHZhbHVlcywgYXMgZGVmaW5lZCBvbiB0aGUgSFRNTCB0YWcKICogQXR0cmlidXRlcyBhcmUgbm90IHRoZSBzYW1lIGFzIHByb3BlcnRpZXMuIFRoZXkncmUgZGVmaW5lZCBvbiB0aGUgdGFnCiAqIG9yIHdpdGggc2V0QXR0cmlidXRlICh3aGljaCBzaG91bGRuJ3QgYmUgdXNlZCB3aXRoIEhUTUwpCiAqIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBvciBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzLgogKgogKiBAYm9ycm93cyBkb206Z2V0RWxBdHRyaWJ1dGVzIGFzIHZpZGVvanMuZ2V0QXR0cmlidXRlcwogKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uZ2V0QXR0cmlidXRlcygpIGluc3RlYWQKICovCgovKioKICogRW1wdGllcyB0aGUgY29udGVudHMgb2YgYW4gZWxlbWVudC4KICoKICogQGJvcnJvd3MgZG9tOmVtcHR5RWwgYXMgdmlkZW9qcy5lbXB0eUVsCiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5lbXB0eUVsKCkgaW5zdGVhZAogKi8KCi8qKgogKiBOb3JtYWxpemVzIGFuZCBhcHBlbmRzIGNvbnRlbnQgdG8gYW4gZWxlbWVudC4KICoKICogVGhlIGNvbnRlbnQgZm9yIGFuIGVsZW1lbnQgY2FuIGJlIHBhc3NlZCBpbiBtdWx0aXBsZSB0eXBlcyBhbmQKICogY29tYmluYXRpb25zLCB3aG9zZSBiZWhhdmlvciBpcyBhcyBmb2xsb3dzOgogKgogKiAtIFN0cmluZwogKiAgIE5vcm1hbGl6ZWQgaW50byBhIHRleHQgbm9kZS4KICoKICogLSBFbGVtZW50LCBUZXh0Tm9kZQogKiAgIFBhc3NlZCB0aHJvdWdoLgogKgogKiAtIEFycmF5CiAqICAgQSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgb2Ygc3RyaW5ncywgZWxlbWVudHMsIG5vZGVzLCBvciBmdW5jdGlvbnMgKHdoaWNoCiAqICAgcmV0dXJuIHNpbmdsZSBzdHJpbmdzLCBlbGVtZW50cywgb3Igbm9kZXMpLgogKgogKiAtIEZ1bmN0aW9uCiAqICAgSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsCiAqICAgbm9kZSwgb3IgYXJyYXkuCiAqCiAqIEBib3Jyb3dzIGRvbTphcHBlbmRDb250ZW50cyBhcyB2aWRlb2pzLmFwcGVuZENvbnRldAogKiBAZGVwcmVjYXRlZCBVc2UgdmlkZW9qcy5kb20uYXBwZW5kQ29udGVudCgpIGluc3RlYWQKICovCgovKioKICogTm9ybWFsaXplcyBhbmQgaW5zZXJ0cyBjb250ZW50IGludG8gYW4gZWxlbWVudDsgdGhpcyBpcyBpZGVudGljYWwgdG8KICogYGFwcGVuZENvbnRlbnQoKWAsIGV4Y2VwdCBpdCBlbXB0aWVzIHRoZSBlbGVtZW50IGZpcnN0LgogKgogKiBUaGUgY29udGVudCBmb3IgYW4gZWxlbWVudCBjYW4gYmUgcGFzc2VkIGluIG11bHRpcGxlIHR5cGVzIGFuZAogKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6CiAqCiAqIC0gU3RyaW5nCiAqICAgTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLgogKgogKiAtIEVsZW1lbnQsIFRleHROb2RlCiAqICAgUGFzc2VkIHRocm91Z2guCiAqCiAqIC0gQXJyYXkKICogICBBIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLCBlbGVtZW50cywgbm9kZXMsIG9yIGZ1bmN0aW9ucyAod2hpY2gKICogICByZXR1cm4gc2luZ2xlIHN0cmluZ3MsIGVsZW1lbnRzLCBvciBub2RlcykuCiAqCiAqIC0gRnVuY3Rpb24KICogICBJZiB0aGUgc29sZSBhcmd1bWVudCwgaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIHN0cmluZywgZWxlbWVudCwKICogICBub2RlLCBvciBhcnJheS4KICoKICogQGJvcnJvd3MgZG9tOmluc2VydENvbnRlbnQgYXMgdmlkZW9qcy5pbnNlcnRDb250ZW50CiAqIEBkZXByZWNhdGVkIFVzZSB2aWRlb2pzLmRvbS5pbnNlcnRDb250ZW50KCkgaW5zdGVhZAogKi8KWydpc0VsJywgJ2lzVGV4dE5vZGUnLCAnY3JlYXRlRWwnLCAnaGFzQ2xhc3MnLCAnYWRkQ2xhc3MnLCAncmVtb3ZlQ2xhc3MnLCAndG9nZ2xlQ2xhc3MnLCAnc2V0QXR0cmlidXRlcycsICdnZXRBdHRyaWJ1dGVzJywgJ2VtcHR5RWwnLCAnYXBwZW5kQ29udGVudCcsICdpbnNlcnRDb250ZW50J10uZm9yRWFjaChmdW5jdGlvbiAoaykgewogIHZpZGVvanNba10gPSBmdW5jdGlvbiAoKSB7CiAgICBsb2ckMS53YXJuKCd2aWRlb2pzLicgKyBrICsgJygpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB2aWRlb2pzLmRvbS4nICsgayArICcoKSBpbnN0ZWFkJyk7CiAgICByZXR1cm4gRG9tW2tdLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgfTsKfSk7CgovKioKICogQSBzYWZlIGdldENvbXB1dGVkU3R5bGUgd2l0aCBhbiBJRTggZmFsbGJhY2suCiAqCiAqIFRoaXMgaXMgYmVjYXVzZSBpbiBGaXJlZm94LCBpZiB0aGUgcGxheWVyIGlzIGxvYWRlZCBpbiBhbiBpZnJhbWUgd2l0aCBgZGlzcGxheTpub25lYCwKICogdGhlbiBgZ2V0Q29tcHV0ZWRTdHlsZWAgcmV0dXJucyBgbnVsbGAsIHNvLCB3ZSBkbyBhIG51bGwtY2hlY2sgdG8gbWFrZSBzdXJlCiAqIHRoYXQgdGhlIHBsYXllciBkb2Vzbid0IGJyZWFrIGluIHRoZXNlIGNhc2VzLgogKiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3IGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIEBib3Jyb3dzIGNvbXB1dGVkLXN0eWxlOmNvbXB1dGVkU3R5bGUgYXMgdmlkZW9qcy5jb21wdXRlZFN0eWxlCiAqLwp2aWRlb2pzLmNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoKLyoqCiAqIEV4cG9ydCB0aGUgRG9tIHV0aWxpdGllcyBmb3IgdXNlIGluIGV4dGVybmFsIHBsdWdpbnMKICogYW5kIFRlY2gncwogKi8KdmlkZW9qcy5kb20gPSBEb207CgovKioKICogRXhwb3J0IHRoZSBVcmwgdXRpbGl0aWVzIGZvciB1c2UgaW4gZXh0ZXJuYWwgcGx1Z2lucwogKiBhbmQgVGVjaCdzCiAqLwp2aWRlb2pzLnVybCA9IFVybDsKCnJldHVybiB2aWRlb2pzOwoKfSkpKTsKCiFmdW5jdGlvbigpeyFmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnZpZGVvanM7YiYmKGIuQ0ROX1ZFUlNJT049IjYuNi4zIil9KHdpbmRvdyksZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YiYmYi5IRUxQX0lNUFJPVkVfVklERU9KUyE9PSExJiYoZS5yYW5kb20oKT4uMDF8fChmPWIubG9jYXRpb24sZz1iLnZpZGVvanN8fHt9LGEuc3JjPSIuLi93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vX191dG1hMDJkLmdpZj91dG13dj01LjQuMiZhbXA7dXRtYWM9VUEtMTY1MDUyOTYtMyZhbXA7dXRtbj0xJmFtcDt1dG1obj0iK2QoZi5ob3N0bmFtZSkrIiZ1dG1zcj0iK2Iuc2NyZWVuLmF2YWlsV2lkdGgrIngiK2Iuc2NyZWVuLmF2YWlsSGVpZ2h0KyImdXRtdWw9IisoYy5sYW5ndWFnZXx8Yy51c2VyTGFuZ3VhZ2V8fCIiKS50b0xvd2VyQ2FzZSgpKyImdXRtcj0iK2QoZi5ocmVmKSsiJnV0bXA9IitkKGYuaG9zdG5hbWUrZi5wYXRobmFtZSkrIiZ1dG1jYz1fX3V0bWElM0QxLiIrZS5mbG9vcigxZTEwKmUucmFuZG9tKCkpKyIuMS4xLjEuMSUzQiZ1dG1lPTgodmpzdipjZG52KTkoIitnLlZFUlNJT04rIioiK2cuQ0ROX1ZFUlNJT04rIikiKSl9KG5ldyBJbWFnZSx3aW5kb3csbmF2aWdhdG9yLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoKX0oKTs="}},"time_used":745,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":563,"receive":182,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/Youtube.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.316Z","timestamp":1785147795316,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/Youtube.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:40 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 3390\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":13020,"size_decoded":3934,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (13020), with no line terminators","md5":"93195cb8fc7d3563e794c324465e9f6a","sha1":"90ec2d713eaa6365edc463cec1daadc6395a96c4","sha256":"06820c101c846dca9541f27b45ba4a77bba52edd5d3d60799a10bc0b6635eaf1","sha512":"048fdb5523d27afa831dc9008e1b03a6b8ad8fbb767f72b2171b99c3c0b3dede4f97d6724c46f201a051c1b606b6a35069b825a7179aaea4694fc54ff8abf938","ssdeep":"192:Y8gmvE6B3tol3TGxXeF6hAiVpQ/5RFTS820SWzeZRDtpzqujWx:Y8gmvdIl3TiVpQ/5RFS8SWqZRDtpzqD","tlshash":"4a42a70d2654929a44ebd0e0ac1f010cb175e2ea9585816df575ffeceebcd0a407fab4","first_seen":"2025-06-25T11:59:30.661467Z","last_seen":"2026-08-11T00:25:55.182628Z","times_seen":21,"resource_available":true,"data":"KGZ1bmN0aW9uKHJvb3QsZmFjdG9yeSl7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKXttb2R1bGUuZXhwb3J0cz1mYWN0b3J5KHJlcXVpcmUoInZpZGVvLmh0bWwiKSl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFsidmlkZW9qcyJdLGZ1bmN0aW9uKHZpZGVvanMpe3JldHVybiByb290LllvdXR1YmU9ZmFjdG9yeSh2aWRlb2pzKX0pfWVsc2V7cm9vdC5Zb3V0dWJlPWZhY3Rvcnkocm9vdC52aWRlb2pzKX19KSh0aGlzLGZ1bmN0aW9uKHZpZGVvanMpeyJ1c2Ugc3RyaWN0Ijt2YXIgX2lzT25Nb2JpbGU9dmlkZW9qcy5icm93c2VyLklTX0lPU3x8dmlkZW9qcy5icm93c2VyLklTX0FORFJPSUQ7dmFyIFRlY2g9dmlkZW9qcy5nZXRUZWNoKCJUZWNoIik7dmFyIFlvdXR1YmU9dmlkZW9qcy5leHRlbmQoVGVjaCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24ob3B0aW9ucyxyZWFkeSl7VGVjaC5jYWxsKHRoaXMsb3B0aW9ucyxyZWFkeSk7dGhpcy5zZXRQb3N0ZXIob3B0aW9ucy5wb3N0ZXIpO3RoaXMuc2V0U3JjKHRoaXMub3B0aW9uc18uc291cmNlLHRydWUpO3RoaXMuc2V0VGltZW91dChmdW5jdGlvbigpe2lmKHRoaXMuZWxfKXt0aGlzLmVsXy5wYXJlbnROb2RlLmNsYXNzTmFtZSs9IiB2anMteW91dHViZSI7aWYoX2lzT25Nb2JpbGUpe3RoaXMuZWxfLnBhcmVudE5vZGUuY2xhc3NOYW1lKz0iIHZqcy15b3V0dWJlLW1vYmlsZSJ9aWYoWW91dHViZS5pc0FwaVJlYWR5KXt0aGlzLmluaXRZVFBsYXllcigpfWVsc2V7WW91dHViZS5hcGlSZWFkeVF1ZXVlLnB1c2godGhpcyl9fX0uYmluZCh0aGlzKSl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtpZih0aGlzLnl0UGxheWVyKXtpZih0aGlzLnl0UGxheWVyLnN0b3BWaWRlbyl7dGhpcy55dFBsYXllci5zdG9wVmlkZW8oKX1pZih0aGlzLnl0UGxheWVyLmRlc3Ryb3kpe3RoaXMueXRQbGF5ZXIuZGVzdHJveSgpfX1lbHNle3ZhciBpbmRleD1Zb3V0dWJlLmFwaVJlYWR5UXVldWUuaW5kZXhPZih0aGlzKTtpZihpbmRleCE9PS0xKXtZb3V0dWJlLmFwaVJlYWR5UXVldWUuc3BsaWNlKGluZGV4LDEpfX10aGlzLnl0UGxheWVyPW51bGw7dGhpcy5lbF8ucGFyZW50Tm9kZS5jbGFzc05hbWU9dGhpcy5lbF8ucGFyZW50Tm9kZS5jbGFzc05hbWUucmVwbGFjZSgiIHZqcy15b3V0dWJlIiwiIikucmVwbGFjZSgiIHZqcy15b3V0dWJlLW1vYmlsZSIsIiIpO3RoaXMuZWxfLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbF8pO1RlY2gucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKX0sY3JlYXRlRWw6ZnVuY3Rpb24oKXt2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rpdi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLm9wdGlvbnNfLnRlY2hJZCk7ZGl2LnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZSIpO2Rpdi5zZXRBdHRyaWJ1dGUoImNsYXNzIiwidmpzLXRlY2giKTt2YXIgZGl2V3JhcHBlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkaXZXcmFwcGVyLmFwcGVuZENoaWxkKGRpdik7aWYoIV9pc09uTW9iaWxlJiYhdGhpcy5vcHRpb25zXy55dENvbnRyb2xzKXt2YXIgZGl2QmxvY2tlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkaXZCbG9ja2VyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJ2anMtaWZyYW1lLWJsb2NrZXIiKTtkaXZCbG9ja2VyLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJSIpO2RpdkJsb2NrZXIub25jbGljaz1mdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKTtkaXZXcmFwcGVyLmFwcGVuZENoaWxkKGRpdkJsb2NrZXIpfXJldHVybiBkaXZXcmFwcGVyfSxpbml0WVRQbGF5ZXI6ZnVuY3Rpb24oKXt2YXIgcGxheWVyVmFycz17Y29udHJvbHM6MCxtb2Rlc3RicmFuZGluZzoxLHJlbDowLHNob3dpbmZvOjAsbG9vcDp0aGlzLm9wdGlvbnNfLmxvb3A/MTowfTtpZih0eXBlb2YgdGhpcy5vcHRpb25zXy5hdXRvaGlkZSE9PSJ1bmRlZmluZWQiKXtwbGF5ZXJWYXJzLmF1dG9oaWRlPXRoaXMub3B0aW9uc18uYXV0b2hpZGV9aWYodHlwZW9mIHRoaXMub3B0aW9uc19bImNjX2xvYWRfcG9saWN5Il0hPT0idW5kZWZpbmVkIil7cGxheWVyVmFyc1siY2NfbG9hZF9wb2xpY3kiXT10aGlzLm9wdGlvbnNfWyJjY19sb2FkX3BvbGljeSJdfWlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfLnl0Q29udHJvbHMhPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5jb250cm9scz10aGlzLm9wdGlvbnNfLnl0Q29udHJvbHN9aWYodHlwZW9mIHRoaXMub3B0aW9uc18uZGlzYWJsZWtiIT09InVuZGVmaW5lZCIpe3BsYXllclZhcnMuZGlzYWJsZWtiPXRoaXMub3B0aW9uc18uZGlzYWJsZWtifWlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfLmVuZCE9PSJ1bmRlZmluZWQiKXtwbGF5ZXJWYXJzLmVuZD10aGlzLm9wdGlvbnNfLmVuZH1pZih0eXBlb2YgdGhpcy5vcHRpb25zXy5jb2xvciE9PSJ1bmRlZmluZWQiKXtwbGF5ZXJWYXJzLmNvbG9yPXRoaXMub3B0aW9uc18uY29sb3J9aWYoIXBsYXllclZhcnMuY29udHJvbHMpe3BsYXllclZhcnMuZnM9MH1lbHNlIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfLmZzIT09InVuZGVmaW5lZCIpe3BsYXllclZhcnMuZnM9dGhpcy5vcHRpb25zXy5mc31pZih0eXBlb2YgdGhpcy5vcHRpb25zXy5lbmQhPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5lbmQ9dGhpcy5vcHRpb25zXy5lbmR9aWYodHlwZW9mIHRoaXMub3B0aW9uc18uaGwhPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5obD10aGlzLm9wdGlvbnNfLmhsfWVsc2UgaWYodHlwZW9mIHRoaXMub3B0aW9uc18ubGFuZ3VhZ2UhPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5obD10aGlzLm9wdGlvbnNfLmxhbmd1YWdlLnN1YnN0cigwLDIpfWlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfWyJpdl9sb2FkX3BvbGljeSJdIT09InVuZGVmaW5lZCIpe3BsYXllclZhcnNbIml2X2xvYWRfcG9saWN5Il09dGhpcy5vcHRpb25zX1siaXZfbG9hZF9wb2xpY3kiXX1pZih0eXBlb2YgdGhpcy5vcHRpb25zXy5saXN0IT09InVuZGVmaW5lZCIpe3BsYXllclZhcnMubGlzdD10aGlzLm9wdGlvbnNfLmxpc3R9ZWxzZSBpZih0aGlzLnVybCYmdHlwZW9mIHRoaXMudXJsLmxpc3RJZCE9PSJ1bmRlZmluZWQiKXtwbGF5ZXJWYXJzLmxpc3Q9dGhpcy51cmwubGlzdElkfWlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfLmxpc3RUeXBlIT09InVuZGVmaW5lZCIpe3BsYXllclZhcnMubGlzdFR5cGU9dGhpcy5vcHRpb25zXy5saXN0VHlwZX1pZih0eXBlb2YgdGhpcy5vcHRpb25zXy5tb2Rlc3RicmFuZGluZyE9PSJ1bmRlZmluZWQiKXtwbGF5ZXJWYXJzLm1vZGVzdGJyYW5kaW5nPXRoaXMub3B0aW9uc18ubW9kZXN0YnJhbmRpbmd9aWYodHlwZW9mIHRoaXMub3B0aW9uc18ucGxheWxpc3QhPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5wbGF5bGlzdD10aGlzLm9wdGlvbnNfLnBsYXlsaXN0fWlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfLnBsYXlzaW5saW5lIT09InVuZGVmaW5lZCIpe3BsYXllclZhcnMucGxheXNpbmxpbmU9dGhpcy5vcHRpb25zXy5wbGF5c2lubGluZX1pZih0eXBlb2YgdGhpcy5vcHRpb25zXy5yZWwhPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5yZWw9dGhpcy5vcHRpb25zXy5yZWx9aWYodHlwZW9mIHRoaXMub3B0aW9uc18uc2hvd2luZm8hPT0idW5kZWZpbmVkIil7cGxheWVyVmFycy5zaG93aW5mbz10aGlzLm9wdGlvbnNfLnNob3dpbmZvfWlmKHR5cGVvZiB0aGlzLm9wdGlvbnNfLnN0YXJ0IT09InVuZGVmaW5lZCIpe3BsYXllclZhcnMuc3RhcnQ9dGhpcy5vcHRpb25zXy5zdGFydH1pZih0eXBlb2YgdGhpcy5vcHRpb25zXy50aGVtZSE9PSJ1bmRlZmluZWQiKXtwbGF5ZXJWYXJzLnRoZW1lPXRoaXMub3B0aW9uc18udGhlbWV9aWYodHlwZW9mIHRoaXMub3B0aW9uc18uY3VzdG9tVmFycyE9PSJ1bmRlZmluZWQiKXt2YXIgY3VzdG9tVmFycz10aGlzLm9wdGlvbnNfLmN1c3RvbVZhcnM7T2JqZWN0LmtleXMoY3VzdG9tVmFycykuZm9yRWFjaChmdW5jdGlvbihrZXkpe3BsYXllclZhcnNba2V5XT1jdXN0b21WYXJzW2tleV19KX10aGlzLmFjdGl2ZVZpZGVvSWQ9dGhpcy51cmw/dGhpcy51cmwudmlkZW9JZDpudWxsO3RoaXMuYWN0aXZlTGlzdD1wbGF5ZXJWYXJzLmxpc3Q7dGhpcy55dFBsYXllcj1uZXcgWVQuUGxheWVyKHRoaXMub3B0aW9uc18udGVjaElkLHt2aWRlb0lkOnRoaXMuYWN0aXZlVmlkZW9JZCxwbGF5ZXJWYXJzOnBsYXllclZhcnMsZXZlbnRzOntvblJlYWR5OnRoaXMub25QbGF5ZXJSZWFkeS5iaW5kKHRoaXMpLG9uUGxheWJhY2tRdWFsaXR5Q2hhbmdlOnRoaXMub25QbGF5ZXJQbGF5YmFja1F1YWxpdHlDaGFuZ2UuYmluZCh0aGlzKSxvblBsYXliYWNrUmF0ZUNoYW5nZTp0aGlzLm9uUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlLmJpbmQodGhpcyksb25TdGF0ZUNoYW5nZTp0aGlzLm9uUGxheWVyU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSxvblZvbHVtZUNoYW5nZTp0aGlzLm9uUGxheWVyVm9sdW1lQ2hhbmdlLmJpbmQodGhpcyksb25FcnJvcjp0aGlzLm9uUGxheWVyRXJyb3IuYmluZCh0aGlzKX19KX0sb25QbGF5ZXJSZWFkeTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9uc18ubXV0ZWQpe3RoaXMueXRQbGF5ZXIubXV0ZSgpfXZhciBwbGF5YmFja1JhdGVzPXRoaXMueXRQbGF5ZXIuZ2V0QXZhaWxhYmxlUGxheWJhY2tSYXRlcygpO2lmKHBsYXliYWNrUmF0ZXMubGVuZ3RoPjEpe3RoaXMuZmVhdHVyZXNQbGF5YmFja1JhdGU9dHJ1ZX10aGlzLnBsYXllclJlYWR5Xz10cnVlO3RoaXMudHJpZ2dlclJlYWR5KCk7aWYodGhpcy5wbGF5T25SZWFkeSl7dGhpcy5wbGF5KCl9ZWxzZSBpZih0aGlzLmN1ZU9uUmVhZHkpe3RoaXMuY3VlVmlkZW9CeUlkXyh0aGlzLnVybC52aWRlb0lkKTt0aGlzLmFjdGl2ZVZpZGVvSWQ9dGhpcy51cmwudmlkZW9JZH19LG9uUGxheWVyUGxheWJhY2tRdWFsaXR5Q2hhbmdlOmZ1bmN0aW9uKCl7fSxvblBsYXllclBsYXliYWNrUmF0ZUNoYW5nZTpmdW5jdGlvbigpe3RoaXMudHJpZ2dlcigicmF0ZWNoYW5nZSIpfSxvblBsYXllclN0YXRlQ2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciBzdGF0ZT1lLmRhdGE7aWYoc3RhdGU9PT10aGlzLmxhc3RTdGF0ZXx8dGhpcy5lcnJvck51bWJlcil7cmV0dXJufXRoaXMubGFzdFN0YXRlPXN0YXRlO3N3aXRjaChzdGF0ZSl7Y2FzZS0xOnRoaXMudHJpZ2dlcigibG9hZHN0YXJ0Iik7dGhpcy50cmlnZ2VyKCJsb2FkZWRtZXRhZGF0YSIpO3RoaXMudHJpZ2dlcigiZHVyYXRpb25jaGFuZ2UiKTt0aGlzLnRyaWdnZXIoInJhdGVjaGFuZ2UiKTticmVhaztjYXNlIFlULlBsYXllclN0YXRlLkVOREVEOnRoaXMudHJpZ2dlcigiZW5kZWQiKTticmVhaztjYXNlIFlULlBsYXllclN0YXRlLlBMQVlJTkc6dGhpcy50cmlnZ2VyKCJ0aW1ldXBkYXRlIik7dGhpcy50cmlnZ2VyKCJkdXJhdGlvbmNoYW5nZSIpO3RoaXMudHJpZ2dlcigicGxheWluZyIpO3RoaXMudHJpZ2dlcigicGxheSIpO2lmKHRoaXMuaXNTZWVraW5nKXt0aGlzLm9uU2Vla2VkKCl9YnJlYWs7Y2FzZSBZVC5QbGF5ZXJTdGF0ZS5QQVVTRUQ6dGhpcy50cmlnZ2VyKCJjYW5wbGF5Iik7aWYodGhpcy5pc1NlZWtpbmcpe3RoaXMub25TZWVrZWQoKX1lbHNle3RoaXMudHJpZ2dlcigicGF1c2UiKX1icmVhaztjYXNlIFlULlBsYXllclN0YXRlLkJVRkZFUklORzp0aGlzLnBsYXllcl8udHJpZ2dlcigidGltZXVwZGF0ZSIpO3RoaXMucGxheWVyXy50cmlnZ2VyKCJ3YWl0aW5nIik7YnJlYWt9fSxvblBsYXllclZvbHVtZUNoYW5nZTpmdW5jdGlvbigpe3RoaXMudHJpZ2dlcigidm9sdW1lY2hhbmdlIil9LG9uUGxheWVyRXJyb3I6ZnVuY3Rpb24oZSl7dGhpcy5lcnJvck51bWJlcj1lLmRhdGE7dGhpcy50cmlnZ2VyKCJwYXVzZSIpO3RoaXMudHJpZ2dlcigiZXJyb3IiKX0sZXJyb3I6ZnVuY3Rpb24oKXt2YXIgY29kZT0xZTMrdGhpcy5lcnJvck51bWJlcjtzd2l0Y2godGhpcy5lcnJvck51bWJlcil7Y2FzZSA1OnJldHVybntjb2RlOmNvZGUsbWVzc2FnZToiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHBsYXkgdGhlIHZpZGVvIn07Y2FzZSAyOmNhc2UgMTAwOnJldHVybntjb2RlOmNvZGUsbWVzc2FnZToiVW5hYmxlIHRvIGZpbmQgdGhlIHZpZGVvIn07Y2FzZSAxMDE6Y2FzZSAxNTA6cmV0dXJue2NvZGU6Y29kZSxtZXNzYWdlOiJQbGF5YmFjayBvbiBvdGhlciBXZWJzaXRlcyBoYXMgYmVlbiBkaXNhYmxlZCBieSB0aGUgdmlkZW8gb3duZXIuIn19cmV0dXJue2NvZGU6Y29kZSxtZXNzYWdlOiJZb3VUdWJlIHVua25vd24gZXJyb3IgKCIrdGhpcy5lcnJvck51bWJlcisiKSJ9fSxsb2FkVmlkZW9CeUlkXzpmdW5jdGlvbihpZCl7dmFyIG9wdGlvbnM9e3ZpZGVvSWQ6aWR9O2lmKHRoaXMub3B0aW9uc18uc3RhcnQpe29wdGlvbnMuc3RhcnRTZWNvbmRzPXRoaXMub3B0aW9uc18uc3RhcnR9aWYodGhpcy5vcHRpb25zXy5lbmQpe29wdGlvbnMuZW5kRW5kPXRoaXMub3B0aW9uc18uZW5kfXRoaXMueXRQbGF5ZXIubG9hZFZpZGVvQnlJZChvcHRpb25zKX0sY3VlVmlkZW9CeUlkXzpmdW5jdGlvbihpZCl7dmFyIG9wdGlvbnM9e3ZpZGVvSWQ6aWR9O2lmKHRoaXMub3B0aW9uc18uc3RhcnQpe29wdGlvbnMuc3RhcnRTZWNvbmRzPXRoaXMub3B0aW9uc18uc3RhcnR9aWYodGhpcy5vcHRpb25zXy5lbmQpe29wdGlvbnMuZW5kRW5kPXRoaXMub3B0aW9uc18uZW5kfXRoaXMueXRQbGF5ZXIuY3VlVmlkZW9CeUlkKG9wdGlvbnMpfSxzcmM6ZnVuY3Rpb24oc3JjKXtpZihzcmMpe3RoaXMuc2V0U3JjKHtzcmM6c3JjfSl9cmV0dXJuIHRoaXMuc291cmNlfSxwb3N0ZXI6ZnVuY3Rpb24oKXtpZihfaXNPbk1vYmlsZSl7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMucG9zdGVyX30sc2V0UG9zdGVyOmZ1bmN0aW9uKHBvc3Rlcil7dGhpcy5wb3N0ZXJfPXBvc3Rlcn0sc2V0U3JjOmZ1bmN0aW9uKHNvdXJjZSl7aWYoIXNvdXJjZXx8IXNvdXJjZS5zcmMpe3JldHVybn1kZWxldGUgdGhpcy5lcnJvck51bWJlcjt0aGlzLnNvdXJjZT1zb3VyY2U7dGhpcy51cmw9WW91dHViZS5wYXJzZVVybChzb3VyY2Uuc3JjKTtpZighdGhpcy5vcHRpb25zXy5wb3N0ZXIpe2lmKHRoaXMudXJsLnZpZGVvSWQpe3RoaXMucG9zdGVyXz0iaHR0cHM6Ly9pbWcueW91dHViZS5jb20vdmkvIit0aGlzLnVybC52aWRlb0lkKyIvMC5qcGciO3RoaXMudHJpZ2dlcigicG9zdGVyY2hhbmdlIik7dGhpcy5jaGVja0hpZ2hSZXNQb3N0ZXIoKX19aWYodGhpcy5vcHRpb25zXy5hdXRvcGxheSYmIV9pc09uTW9iaWxlKXtpZih0aGlzLmlzUmVhZHlfKXt0aGlzLnBsYXkoKX1lbHNle3RoaXMucGxheU9uUmVhZHk9dHJ1ZX19ZWxzZSBpZih0aGlzLmFjdGl2ZVZpZGVvSWQhPT10aGlzLnVybC52aWRlb0lkKXtpZih0aGlzLmlzUmVhZHlfKXt0aGlzLmN1ZVZpZGVvQnlJZF8odGhpcy51cmwudmlkZW9JZCk7dGhpcy5hY3RpdmVWaWRlb0lkPXRoaXMudXJsLnZpZGVvSWR9ZWxzZXt0aGlzLmN1ZU9uUmVhZHk9dHJ1ZX19fSxhdXRvcGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5fSxzZXRBdXRvcGxheTpmdW5jdGlvbih2YWwpe3RoaXMub3B0aW9uc18uYXV0b3BsYXk9dmFsfSxsb29wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uc18ubG9vcH0sc2V0TG9vcDpmdW5jdGlvbih2YWwpe3RoaXMub3B0aW9uc18ubG9vcD12YWx9LHBsYXk6ZnVuY3Rpb24oKXtpZighdGhpcy51cmx8fCF0aGlzLnVybC52aWRlb0lkKXtyZXR1cm59dGhpcy53YXNQYXVzZWRCZWZvcmVTZWVrPWZhbHNlO2lmKHRoaXMuaXNSZWFkeV8pe2lmKHRoaXMudXJsLmxpc3RJZCl7aWYodGhpcy5hY3RpdmVMaXN0PT09dGhpcy51cmwubGlzdElkKXt0aGlzLnl0UGxheWVyLnBsYXlWaWRlbygpfWVsc2V7dGhpcy55dFBsYXllci5sb2FkUGxheWxpc3QodGhpcy51cmwubGlzdElkKTt0aGlzLmFjdGl2ZUxpc3Q9dGhpcy51cmwubGlzdElkfX1pZih0aGlzLmFjdGl2ZVZpZGVvSWQ9PT10aGlzLnVybC52aWRlb0lkKXt0aGlzLnl0UGxheWVyLnBsYXlWaWRlbygpfWVsc2V7dGhpcy5sb2FkVmlkZW9CeUlkXyh0aGlzLnVybC52aWRlb0lkKTt0aGlzLmFjdGl2ZVZpZGVvSWQ9dGhpcy51cmwudmlkZW9JZH19ZWxzZXt0aGlzLnRyaWdnZXIoIndhaXRpbmciKTt0aGlzLnBsYXlPblJlYWR5PXRydWV9fSxwYXVzZTpmdW5jdGlvbigpe2lmKHRoaXMueXRQbGF5ZXIpe3RoaXMueXRQbGF5ZXIucGF1c2VWaWRlbygpfX0scGF1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueXRQbGF5ZXI/dGhpcy5sYXN0U3RhdGUhPT1ZVC5QbGF5ZXJTdGF0ZS5QTEFZSU5HJiZ0aGlzLmxhc3RTdGF0ZSE9PVlULlBsYXllclN0YXRlLkJVRkZFUklORzp0cnVlfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl0UGxheWVyP3RoaXMueXRQbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTowfSxzZXRDdXJyZW50VGltZTpmdW5jdGlvbihzZWNvbmRzKXtpZih0aGlzLmxhc3RTdGF0ZT09PVlULlBsYXllclN0YXRlLlBBVVNFRCl7dGhpcy50aW1lQmVmb3JlU2Vlaz10aGlzLmN1cnJlbnRUaW1lKCl9aWYoIXRoaXMuaXNTZWVraW5nKXt0aGlzLndhc1BhdXNlZEJlZm9yZVNlZWs9dGhpcy5wYXVzZWQoKX10aGlzLnl0UGxheWVyLnNlZWtUbyhzZWNvbmRzLHRydWUpO3RoaXMudHJpZ2dlcigidGltZXVwZGF0ZSIpO3RoaXMudHJpZ2dlcigic2Vla2luZyIpO3RoaXMuaXNTZWVraW5nPXRydWU7aWYodGhpcy5sYXN0U3RhdGU9PT1ZVC5QbGF5ZXJTdGF0ZS5QQVVTRUQmJnRoaXMudGltZUJlZm9yZVNlZWshPT1zZWNvbmRzKXtjbGVhckludGVydmFsKHRoaXMuY2hlY2tTZWVrZWRJblBhdXNlSW50ZXJ2YWwpO3RoaXMuY2hlY2tTZWVrZWRJblBhdXNlSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZih0aGlzLmxhc3RTdGF0ZSE9PVlULlBsYXllclN0YXRlLlBBVVNFRHx8IXRoaXMuaXNTZWVraW5nKXtjbGVhckludGVydmFsKHRoaXMuY2hlY2tTZWVrZWRJblBhdXNlSW50ZXJ2YWwpfWVsc2UgaWYodGhpcy5jdXJyZW50VGltZSgpIT09dGhpcy50aW1lQmVmb3JlU2Vlayl7dGhpcy50cmlnZ2VyKCJ0aW1ldXBkYXRlIik7dGhpcy5vblNlZWtlZCgpfX0uYmluZCh0aGlzKSwyNTApfX0sc2Vla2luZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzU2Vla2luZ30sc2Vla2FibGU6ZnVuY3Rpb24oKXtpZighdGhpcy55dFBsYXllcil7cmV0dXJuIHZpZGVvanMuY3JlYXRlVGltZVJhbmdlKCl9cmV0dXJuIHZpZGVvanMuY3JlYXRlVGltZVJhbmdlKDAsdGhpcy55dFBsYXllci5nZXREdXJhdGlvbigpKX0sb25TZWVrZWQ6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuY2hlY2tTZWVrZWRJblBhdXNlSW50ZXJ2YWwpO3RoaXMuaXNTZWVraW5nPWZhbHNlO2lmKHRoaXMud2FzUGF1c2VkQmVmb3JlU2Vlayl7dGhpcy5wYXVzZSgpfXRoaXMudHJpZ2dlcigic2Vla2VkIil9LHBsYXliYWNrUmF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl0UGxheWVyP3RoaXMueXRQbGF5ZXIuZ2V0UGxheWJhY2tSYXRlKCk6MX0sc2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKHN1Z2dlc3RlZFJhdGUpe2lmKCF0aGlzLnl0UGxheWVyKXtyZXR1cm59dGhpcy55dFBsYXllci5zZXRQbGF5YmFja1JhdGUoc3VnZ2VzdGVkUmF0ZSl9LGR1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueXRQbGF5ZXI/dGhpcy55dFBsYXllci5nZXREdXJhdGlvbigpOjB9LGN1cnJlbnRTcmM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2UmJnRoaXMuc291cmNlLnNyY30sZW5kZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55dFBsYXllcj90aGlzLmxhc3RTdGF0ZT09PVlULlBsYXllclN0YXRlLkVOREVEOmZhbHNlfSx2b2x1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55dFBsYXllcj90aGlzLnl0UGxheWVyLmdldFZvbHVtZSgpLzEwMDoxfSxzZXRWb2x1bWU6ZnVuY3Rpb24ocGVyY2VudEFzRGVjaW1hbCl7aWYoIXRoaXMueXRQbGF5ZXIpe3JldHVybn10aGlzLnl0UGxheWVyLnNldFZvbHVtZShwZXJjZW50QXNEZWNpbWFsKjEwMCl9LG11dGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueXRQbGF5ZXI/dGhpcy55dFBsYXllci5pc011dGVkKCk6ZmFsc2V9LHNldE11dGVkOmZ1bmN0aW9uKG11dGUpe2lmKCF0aGlzLnl0UGxheWVyKXtyZXR1cm59ZWxzZXt0aGlzLm11dGVkKHRydWUpfWlmKG11dGUpe3RoaXMueXRQbGF5ZXIubXV0ZSgpfWVsc2V7dGhpcy55dFBsYXllci51bk11dGUoKX10aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyaWdnZXIoInZvbHVtZWNoYW5nZSIpfSw1MCl9LGJ1ZmZlcmVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMueXRQbGF5ZXJ8fCF0aGlzLnl0UGxheWVyLmdldFZpZGVvTG9hZGVkRnJhY3Rpb24pe3JldHVybiB2aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZSgpfXZhciBidWZmZXJlZEVuZD10aGlzLnl0UGxheWVyLmdldFZpZGVvTG9hZGVkRnJhY3Rpb24oKSp0aGlzLnl0UGxheWVyLmdldER1cmF0aW9uKCk7cmV0dXJuIHZpZGVvanMuY3JlYXRlVGltZVJhbmdlKDAsYnVmZmVyZWRFbmQpfSxwcmVsb2FkOmZ1bmN0aW9uKCl7fSxsb2FkOmZ1bmN0aW9uKCl7fSxyZXNldDpmdW5jdGlvbigpe30sc3VwcG9ydHNGdWxsU2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LGNoZWNrSGlnaFJlc1Bvc3RlcjpmdW5jdGlvbigpe3ZhciB1cmk9Imh0dHBzOi8vaW1nLnlvdXR1YmUuY29tL3ZpLyIrdGhpcy51cmwudmlkZW9JZCsiL21heHJlc2RlZmF1bHQuanBnIjt0cnl7dmFyIGltYWdlPW5ldyBJbWFnZTtpbWFnZS5vbmxvYWQ9ZnVuY3Rpb24oKXtpZigibmF0dXJhbEhlaWdodCJpbiBpbWFnZSl7aWYoaW1hZ2UubmF0dXJhbEhlaWdodDw9OTB8fGltYWdlLm5hdHVyYWxXaWR0aDw9MTIwKXtyZXR1cm59fWVsc2UgaWYoaW1hZ2UuaGVpZ2h0PD05MHx8aW1hZ2Uud2lkdGg8PTEyMCl7cmV0dXJufXRoaXMucG9zdGVyXz11cmk7dGhpcy50cmlnZ2VyKCJwb3N0ZXJjaGFuZ2UiKX0uYmluZCh0aGlzKTtpbWFnZS5vbmVycm9yPWZ1bmN0aW9uKCl7fTtpbWFnZS5zcmM9dXJpfWNhdGNoKGUpe319fSk7WW91dHViZS5pc1N1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiB0cnVlfTtZb3V0dWJlLmNhblBsYXlTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIFlvdXR1YmUuY2FuUGxheVR5cGUoZS50eXBlKX07WW91dHViZS5jYW5QbGF5VHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PSJ2aWRlby95b3V0dWJlIn07WW91dHViZS5wYXJzZVVybD1mdW5jdGlvbih1cmwpe3ZhciByZXN1bHQ9e3ZpZGVvSWQ6bnVsbH07dmFyIHJlZ2V4PS9eLiooeW91dHUuYmVcL3x2XC98dVwvXHdcL3xlbWJlZFwvfHdhdGNoXD92PXxcJnY9KShbXiNcJlw/XSopLiovO3ZhciBtYXRjaD11cmwubWF0Y2gocmVnZXgpO2lmKG1hdGNoJiZtYXRjaFsyXS5sZW5ndGg9PT0xMSl7cmVzdWx0LnZpZGVvSWQ9bWF0Y2hbMl19dmFyIHJlZ1BsYXlsaXN0PS9bPyZdbGlzdD0oW14jXCZcP10rKS87bWF0Y2g9dXJsLm1hdGNoKHJlZ1BsYXlsaXN0KTtpZihtYXRjaCYmbWF0Y2hbMV0pe3Jlc3VsdC5saXN0SWQ9bWF0Y2hbMV19cmV0dXJuIHJlc3VsdH07ZnVuY3Rpb24gYXBpTG9hZGVkKCl7WVQucmVhZHkoZnVuY3Rpb24oKXtZb3V0dWJlLmlzQXBpUmVhZHk9dHJ1ZTtmb3IodmFyIGk9MDtpPFlvdXR1YmUuYXBpUmVhZHlRdWV1ZS5sZW5ndGg7KytpKXtZb3V0dWJlLmFwaVJlYWR5UXVldWVbaV0uaW5pdFlUUGxheWVyKCl9fSl9ZnVuY3Rpb24gbG9hZFNjcmlwdChzcmMsY2FsbGJhY2spe3ZhciBsb2FkZWQ9ZmFsc2U7dmFyIHRhZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt2YXIgZmlyc3RTY3JpcHRUYWc9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdO2ZpcnN0U2NyaXB0VGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhZyxmaXJzdFNjcmlwdFRhZyk7dGFnLm9ubG9hZD1mdW5jdGlvbigpe2lmKCFsb2FkZWQpe2xvYWRlZD10cnVlO2NhbGxiYWNrKCl9fTt0YWcub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoIWxvYWRlZCYmKHRoaXMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSJ8fHRoaXMucmVhZHlTdGF0ZT09PSJsb2FkZWQiKSl7bG9hZGVkPXRydWU7Y2FsbGJhY2soKX19O3RhZy5zcmM9c3JjfWZ1bmN0aW9uIGluamVjdENzcygpe3ZhciBjc3M9Ii52anMteW91dHViZSAudmpzLWlmcmFtZS1ibG9ja2VyIHsgZGlzcGxheTogbm9uZTsgfSIrIi52anMteW91dHViZS52anMtdXNlci1pbmFjdGl2ZSAudmpzLWlmcmFtZS1ibG9ja2VyIHsgZGlzcGxheTogYmxvY2s7fSIrIi52anMteW91dHViZSAudmpzLXBvc3RlciB7IGJhY2tncm91bmQtc2l6ZTogY292ZXI7IH0iKyIudmpzLXlvdXR1YmUtbW9iaWxlIC52anMtYmlnLXBsYXktYnV0dG9uIHsgZGlzcGxheTogbm9uZTsgfSI7dmFyIGhlYWQ9ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTt2YXIgc3R5bGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtzdHlsZS50eXBlPSJ0ZXh0L2NzcyI7aWYoc3R5bGUuc3R5bGVTaGVldCl7c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0PWNzc31lbHNle3N0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpfWhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpfVlvdXR1YmUuYXBpUmVhZHlRdWV1ZT1bXTtpZih0eXBlb2YgZG9jdW1lbnQhPT0idW5kZWZpbmVkIil7bG9hZFNjcmlwdCgiaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSIsYXBpTG9hZGVkKTtpbmplY3RDc3MoKX1pZih0eXBlb2YgdmlkZW9qcy5yZWdpc3RlclRlY2ghPT0idW5kZWZpbmVkIil7dmlkZW9qcy5yZWdpc3RlclRlY2goIllvdXR1YmUiLFlvdXR1YmUpfWVsc2V7dmlkZW9qcy5yZWdpc3RlckNvbXBvbmVudCgiWW91dHViZSIsWW91dHViZSl9fSk7"}},"time_used":563,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":563,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/about/1.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.525Z","timestamp":1785147795525,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/about/1.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 23255\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":23255,"size_decoded":23730,"mime_type":"image/png","magic":"PNG image data, 288 x 397, 8-bit colormap, non-interlaced","md5":"bee7d8fbbeb07bf5bf1ea0b034a66f5b","sha1":"cb0bfee05416707d4fad620925c5f4dfb7f9a5d8","sha256":"1532da74c44db69c50f95cd04cfae3be0d438df60533bc3fd0793d71b4bb761f","sha512":"1f95cb62974c479afc6a0edefe9aee4319890a118c2d6003b43a70042ef6c70116e17f50444d31bc3c818abcdf1894a903c9005c0f931995d7bb78a0875409df","ssdeep":"384:Ok1hDeLWhvk7ifycvfpdfCpEVqPwE2BYclxVBreLj3N57a7QUhCJJr:Obq8nUGpEM4EGYQxV1efd5eM/r","tlshash":"67a2e17fec2f9dba818a28b3750db181b636a4a2f4367aa15914a01f6c065c0d0ccd5d","first_seen":"2025-05-31T01:51:37.364975Z","last_seen":"2026-08-11T00:25:55.229291Z","times_seen":25,"resource_available":false,"data":"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"}},"time_used":547,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":516,"receive":31,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/vendor/modernizr-2.8.3.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.285Z","timestamp":1785147795285,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/vendor/modernizr-2.8.3.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:24 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 6012\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":15524,"size_decoded":6556,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (14866)","md5":"baa31b73aedd668e9ab4b706b79b9cb2","sha1":"f543cb4bffc7525eb65fd7bb0d9fb6faad5bdf5c","sha256":"d5448f267dc6b4a999e770b3438b3cedff09bd09f606028a8e031c46eb90caff","sha512":"6a8db463c38a9ba3b89e1eda35f540a43622189cec098b165e72ea5a279c49dfde8be57f9651a9235efb26218995b212f4dc1558c44d1ba65e1adaf7205ffcf8","ssdeep":"384:AEDDCHW519TpJGd+xedmAnx6KQoZRY5y60Hh5pD:ACDtjecAgKr25y60H5","tlshash":"2562facdb153b1168397607a61bf460ff23e9899a8184854e059c5ecbe74ca8473bf1e","first_seen":"2025-01-06T16:40:49.922215Z","last_seen":"2026-08-11T00:25:55.223715Z","times_seen":53,"resource_available":true,"data":"LyogTW9kZXJuaXpyIDIuOC4zIChDdXN0b20gQnVpbGQpIHwgTUlUICYgQlNECiAqIEJ1aWxkOiBodHRwOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZC8jLWZvbnRmYWNlLWJhY2tncm91bmRzaXplLWJvcmRlcmltYWdlLWJvcmRlcnJhZGl1cy1ib3hzaGFkb3ctZmxleGJveC1oc2xhLW11bHRpcGxlYmdzLW9wYWNpdHktcmdiYS10ZXh0c2hhZG93LWNzc2FuaW1hdGlvbnMtY3NzY29sdW1ucy1nZW5lcmF0ZWRjb250ZW50LWNzc2dyYWRpZW50cy1jc3NyZWZsZWN0aW9ucy1jc3N0cmFuc2Zvcm1zLWNzc3RyYW5zZm9ybXMzZC1jc3N0cmFuc2l0aW9ucy1hcHBsaWNhdGlvbmNhY2hlLWNhbnZhcy1jYW52YXN0ZXh0LWRyYWdhbmRkcm9wLWhhc2hjaGFuZ2UtaGlzdG9yeS1hdWRpby12aWRlby1pbmRleGVkZGItaW5wdXQtaW5wdXR0eXBlcy1sb2NhbHN0b3JhZ2UtcG9zdG1lc3NhZ2Utc2Vzc2lvbnN0b3JhZ2Utd2Vic29ja2V0cy13ZWJzcWxkYXRhYmFzZS13ZWJ3b3JrZXJzLWdlb2xvY2F0aW9uLWlubGluZXN2Zy1zbWlsLXN2Zy1zdmdjbGlwcGF0aHMtdG91Y2gtd2ViZ2wtc2hpdi1tcS1jc3NjbGFzc2VzLWFkZHRlc3QtcHJlZml4ZWQtdGVzdHN0eWxlcy10ZXN0cHJvcC10ZXN0YWxscHJvcHMtaGFzZXZlbnQtcHJlZml4ZXMtZG9tcHJlZml4ZXMtbG9hZAogKi8KO3dpbmRvdy5Nb2Rlcm5penI9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIEQoYSl7ai5jc3NUZXh0PWF9ZnVuY3Rpb24gRShhLGIpe3JldHVybiBEKG4uam9pbihhKyI7IikrKGJ8fCIiKSl9ZnVuY3Rpb24gRihhLGIpe3JldHVybiB0eXBlb2YgYT09PWJ9ZnVuY3Rpb24gRyhhLGIpe3JldHVybiEhfigiIithKS5pbmRleE9mKGIpfWZ1bmN0aW9uIEgoYSxiKXtmb3IodmFyIGQgaW4gYSl7dmFyIGU9YVtkXTtpZighRyhlLCItIikmJmpbZV0hPT1jKXJldHVybiBiPT0icGZ4Ij9lOiEwfXJldHVybiExfWZ1bmN0aW9uIEkoYSxiLGQpe2Zvcih2YXIgZSBpbiBhKXt2YXIgZj1iW2FbZV1dO2lmKGYhPT1jKXJldHVybiBkPT09ITE/YVtlXTpGKGYsImZ1bmN0aW9uIik/Zi5iaW5kKGR8fGIpOmZ9cmV0dXJuITF9ZnVuY3Rpb24gSihhLGIsYyl7dmFyIGQ9YS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpLGU9KGErIiAiK3Auam9pbihkKyIgIikrZCkuc3BsaXQoIiAiKTtyZXR1cm4gRihiLCJzdHJpbmciKXx8RihiLCJ1bmRlZmluZWQiKT9IKGUsYik6KGU9KGErIiAiK3Euam9pbihkKyIgIikrZCkuc3BsaXQoIiAiKSxJKGUsYixjKSl9ZnVuY3Rpb24gSygpe2UuaW5wdXQ9ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aDtkPGU7ZCsrKXVbY1tkXV09Y1tkXWluIGs7cmV0dXJuIHUubGlzdCYmKHUubGlzdD0hIWIuY3JlYXRlRWxlbWVudCgiZGF0YWxpc3QiKSYmISFhLkhUTUxEYXRhTGlzdEVsZW1lbnQpLHV9KCJhdXRvY29tcGxldGUgYXV0b2ZvY3VzIGxpc3QgcGxhY2Vob2xkZXIgbWF4IG1pbiBtdWx0aXBsZSBwYXR0ZXJuIHJlcXVpcmVkIHN0ZXAiLnNwbGl0KCIgIikpLGUuaW5wdXR0eXBlcz1mdW5jdGlvbihhKXtmb3IodmFyIGQ9MCxlLGYsaCxpPWEubGVuZ3RoO2Q8aTtkKyspay5zZXRBdHRyaWJ1dGUoInR5cGUiLGY9YVtkXSksZT1rLnR5cGUhPT0idGV4dCIsZSYmKGsudmFsdWU9bCxrLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuOyIsL15yYW5nZSQvLnRlc3QoZikmJmsuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSE9PWM/KGcuYXBwZW5kQ2hpbGQoayksaD1iLmRlZmF1bHRWaWV3LGU9aC5nZXRDb21wdXRlZFN0eWxlJiZoLmdldENvbXB1dGVkU3R5bGUoayxudWxsKS5XZWJraXRBcHBlYXJhbmNlIT09InRleHRmaWVsZCImJmsub2Zmc2V0SGVpZ2h0IT09MCxnLnJlbW92ZUNoaWxkKGspKTovXihzZWFyY2h8dGVsKSQvLnRlc3QoZil8fCgvXih1cmx8ZW1haWwpJC8udGVzdChmKT9lPWsuY2hlY2tWYWxpZGl0eSYmay5jaGVja1ZhbGlkaXR5KCk9PT0hMTplPWsudmFsdWUhPWwpKSx0W2FbZF1dPSEhZTtyZXR1cm4gdH0oInNlYXJjaCB0ZWwgdXJsIGVtYWlsIGRhdGV0aW1lIGRhdGUgbW9udGggd2VlayB0aW1lIGRhdGV0aW1lLWxvY2FsIG51bWJlciByYW5nZSBjb2xvciIuc3BsaXQoIiAiKSl9dmFyIGQ9IjIuOC4zIixlPXt9LGY9ITAsZz1iLmRvY3VtZW50RWxlbWVudCxoPSJtb2Rlcm5penIiLGk9Yi5jcmVhdGVFbGVtZW50KGgpLGo9aS5zdHlsZSxrPWIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxsPSI6KSIsbT17fS50b1N0cmluZyxuPSIgLXdlYmtpdC0gLW1vei0gLW8tIC1tcy0gIi5zcGxpdCgiICIpLG89IldlYmtpdCBNb3ogTyBtcyIscD1vLnNwbGl0KCIgIikscT1vLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKSxyPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn0scz17fSx0PXt9LHU9e30sdj1bXSx3PXYuc2xpY2UseCx5PWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGksaixrLGw9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxtPWIuYm9keSxuPW18fGIuY3JlYXRlRWxlbWVudCgiYm9keSIpO2lmKHBhcnNlSW50KGQsMTApKXdoaWxlKGQtLSlqPWIuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5pZD1lP2VbZF06aCsoZCsxKSxsLmFwcGVuZENoaWxkKGopO3JldHVybiBmPVsiJiMxNzM7IiwnPHN0eWxlIGlkPSJzJyxoLCciPicsYSwiPC9zdHlsZT4iXS5qb2luKCIiKSxsLmlkPWgsKG0/bDpuKS5pbm5lckhUTUwrPWYsbi5hcHBlbmRDaGlsZChsKSxtfHwobi5zdHlsZS5iYWNrZ3JvdW5kPSIiLG4uc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsaz1nLnN0eWxlLm92ZXJmbG93LGcuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZy5hcHBlbmRDaGlsZChuKSksaT1jKGwsYSksbT9sLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCk6KG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSxnLnN0eWxlLm92ZXJmbG93PWspLCEhaX0sej1mdW5jdGlvbihiKXt2YXIgYz1hLm1hdGNoTWVkaWF8fGEubXNNYXRjaE1lZGlhO2lmKGMpcmV0dXJuIGMoYikmJmMoYikubWF0Y2hlc3x8ITE7dmFyIGQ7cmV0dXJuIHkoIkBtZWRpYSAiK2IrIiB7ICMiK2grIiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9IixmdW5jdGlvbihiKXtkPShhLmdldENvbXB1dGVkU3R5bGU/Z2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlKVsicG9zaXRpb24iXT09ImFic29sdXRlIn0pLGR9LEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkKGQsZSl7ZT1lfHxiLmNyZWF0ZUVsZW1lbnQoYVtkXXx8ImRpdiIpLGQ9Im9uIitkO3ZhciBmPWQgaW4gZTtyZXR1cm4gZnx8KGUuc2V0QXR0cmlidXRlfHwoZT1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxlLnNldEF0dHJpYnV0ZSYmZS5yZW1vdmVBdHRyaWJ1dGUmJihlLnNldEF0dHJpYnV0ZShkLCIiKSxmPUYoZVtkXSwiZnVuY3Rpb24iKSxGKGVbZF0sInVuZGVmaW5lZCIpfHwoZVtkXT1jKSxlLnJlbW92ZUF0dHJpYnV0ZShkKSkpLGU9bnVsbCxmfXZhciBhPXtzZWxlY3Q6ImlucHV0IixjaGFuZ2U6ImlucHV0IixzdWJtaXQ6ImZvcm0iLHJlc2V0OiJmb3JtIixlcnJvcjoiaW1nIixsb2FkOiJpbWciLGFib3J0OiJpbWcifTtyZXR1cm4gZH0oKSxCPXt9Lmhhc093blByb3BlcnR5LEM7IUYoQiwidW5kZWZpbmVkIikmJiFGKEIuY2FsbCwidW5kZWZpbmVkIik/Qz1mdW5jdGlvbihhLGIpe3JldHVybiBCLmNhbGwoYSxiKX06Qz1mdW5jdGlvbihhLGIpe3JldHVybiBiIGluIGEmJkYoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbYl0sInVuZGVmaW5lZCIpfSxGdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYodHlwZW9mIGMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD13LmNhbGwoYXJndW1lbnRzLDEpLGU9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIGE9ZnVuY3Rpb24oKXt9O2EucHJvdG90eXBlPWMucHJvdG90eXBlO3ZhciBmPW5ldyBhLGc9Yy5hcHBseShmLGQuY29uY2F0KHcuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIE9iamVjdChnKT09PWc/ZzpmfXJldHVybiBjLmFwcGx5KGIsZC5jb25jYXQody5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIGV9KSxzLmZsZXhib3g9ZnVuY3Rpb24oKXtyZXR1cm4gSigiZmxleFdyYXAiKX0scy5jYW52YXM9ZnVuY3Rpb24oKXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiEhYS5nZXRDb250ZXh0JiYhIWEuZ2V0Q29udGV4dCgiMmQiKX0scy5jYW52YXN0ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuISFlLmNhbnZhcyYmISFGKGIuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKS5maWxsVGV4dCwiZnVuY3Rpb24iKX0scy53ZWJnbD1mdW5jdGlvbigpe3JldHVybiEhYS5XZWJHTFJlbmRlcmluZ0NvbnRleHR9LHMudG91Y2g9ZnVuY3Rpb24oKXt2YXIgYztyZXR1cm4ib250b3VjaHN0YXJ0ImluIGF8fGEuRG9jdW1lbnRUb3VjaCYmYiBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2g/Yz0hMDp5KFsiQG1lZGlhICgiLG4uam9pbigidG91Y2gtZW5hYmxlZCksKCIpLGgsIikiLCJ7I21vZGVybml6cnt0b3A6OXB4O3Bvc2l0aW9uOmFic29sdXRlfX0iXS5qb2luKCIiKSxmdW5jdGlvbihhKXtjPWEub2Zmc2V0VG9wPT09OX0pLGN9LHMuZ2VvbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4iZ2VvbG9jYXRpb24iaW4gbmF2aWdhdG9yfSxzLnBvc3RtZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuISFhLnBvc3RNZXNzYWdlfSxzLndlYnNxbGRhdGFiYXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFhLm9wZW5EYXRhYmFzZX0scy5pbmRleGVkREI9ZnVuY3Rpb24oKXtyZXR1cm4hIUooImluZGV4ZWREQiIsYSl9LHMuaGFzaGNoYW5nZT1mdW5jdGlvbigpe3JldHVybiBBKCJoYXNoY2hhbmdlIixhKSYmKGIuZG9jdW1lbnRNb2RlPT09Y3x8Yi5kb2N1bWVudE1vZGU+Nyl9LHMuaGlzdG9yeT1mdW5jdGlvbigpe3JldHVybiEhYS5oaXN0b3J5JiYhIWhpc3RvcnkucHVzaFN0YXRlfSxzLmRyYWdhbmRkcm9wPWZ1bmN0aW9uKCl7dmFyIGE9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4iZHJhZ2dhYmxlImluIGF8fCJvbmRyYWdzdGFydCJpbiBhJiYib25kcm9wImluIGF9LHMud2Vic29ja2V0cz1mdW5jdGlvbigpe3JldHVybiJXZWJTb2NrZXQiaW4gYXx8Ik1veldlYlNvY2tldCJpbiBhfSxzLnJnYmE9ZnVuY3Rpb24oKXtyZXR1cm4gRCgiYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE1MCwyNTUsMTUwLC41KSIpLEcoai5iYWNrZ3JvdW5kQ29sb3IsInJnYmEiKX0scy5oc2xhPWZ1bmN0aW9uKCl7cmV0dXJuIEQoImJhY2tncm91bmQtY29sb3I6aHNsYSgxMjAsNDAlLDEwMCUsLjUpIiksRyhqLmJhY2tncm91bmRDb2xvciwicmdiYSIpfHxHKGouYmFja2dyb3VuZENvbG9yLCJoc2xhIil9LHMubXVsdGlwbGViZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gRCgiYmFja2dyb3VuZDp1cmwoaHR0cHM6Ly8pLHVybChodHRwczovLykscmVkIHVybChodHRwczovLykiKSwvKHVybFxzKlwoLio/KXszfS8udGVzdChqLmJhY2tncm91bmQpfSxzLmJhY2tncm91bmRzaXplPWZ1bmN0aW9uKCl7cmV0dXJuIEooImJhY2tncm91bmRTaXplIil9LHMuYm9yZGVyaW1hZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gSigiYm9yZGVySW1hZ2UiKX0scy5ib3JkZXJyYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gSigiYm9yZGVyUmFkaXVzIil9LHMuYm94c2hhZG93PWZ1bmN0aW9uKCl7cmV0dXJuIEooImJveFNoYWRvdyIpfSxzLnRleHRzaGFkb3c9ZnVuY3Rpb24oKXtyZXR1cm4gYi5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS50ZXh0U2hhZG93PT09IiJ9LHMub3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiBFKCJvcGFjaXR5Oi41NSIpLC9eMC41NSQvLnRlc3Qoai5vcGFjaXR5KX0scy5jc3NhbmltYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIEooImFuaW1hdGlvbk5hbWUiKX0scy5jc3Njb2x1bW5zPWZ1bmN0aW9uKCl7cmV0dXJuIEooImNvbHVtbkNvdW50Iil9LHMuY3NzZ3JhZGllbnRzPWZ1bmN0aW9uKCl7dmFyIGE9ImJhY2tncm91bmQtaW1hZ2U6IixiPSJncmFkaWVudChsaW5lYXIsbGVmdCB0b3AscmlnaHQgYm90dG9tLGZyb20oIzlmOSksdG8od2hpdGUpKTsiLGM9ImxpbmVhci1ncmFkaWVudChsZWZ0IHRvcCwjOWY5LCB3aGl0ZSk7IjtyZXR1cm4gRCgoYSsiLXdlYmtpdC0gIi5zcGxpdCgiICIpLmpvaW4oYithKStuLmpvaW4oYythKSkuc2xpY2UoMCwtYS5sZW5ndGgpKSxHKGouYmFja2dyb3VuZEltYWdlLCJncmFkaWVudCIpfSxzLmNzc3JlZmxlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIEooImJveFJlZmxlY3QiKX0scy5jc3N0cmFuc2Zvcm1zPWZ1bmN0aW9uKCl7cmV0dXJuISFKKCJ0cmFuc2Zvcm0iKX0scy5jc3N0cmFuc2Zvcm1zM2Q9ZnVuY3Rpb24oKXt2YXIgYT0hIUooInBlcnNwZWN0aXZlIik7cmV0dXJuIGEmJiJ3ZWJraXRQZXJzcGVjdGl2ZSJpbiBnLnN0eWxlJiZ5KCJAbWVkaWEgKHRyYW5zZm9ybS0zZCksKC13ZWJraXQtdHJhbnNmb3JtLTNkKXsjbW9kZXJuaXpye2xlZnQ6OXB4O3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDozcHg7fX0iLGZ1bmN0aW9uKGIsYyl7YT1iLm9mZnNldExlZnQ9PT05JiZiLm9mZnNldEhlaWdodD09PTN9KSxhfSxzLmNzc3RyYW5zaXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIEooInRyYW5zaXRpb24iKX0scy5mb250ZmFjZT1mdW5jdGlvbigpe3ZhciBhO3JldHVybiB5KCdAZm9udC1mYWNlIHtmb250LWZhbWlseToiZm9udCI7c3JjOnVybCgiaHR0cHM6Ly8vIil9JyxmdW5jdGlvbihjLGQpe3ZhciBlPWIuZ2V0RWxlbWVudEJ5SWQoInNtb2Rlcm5penIiKSxmPWUuc2hlZXR8fGUuc3R5bGVTaGVldCxnPWY/Zi5jc3NSdWxlcyYmZi5jc3NSdWxlc1swXT9mLmNzc1J1bGVzWzBdLmNzc1RleHQ6Zi5jc3NUZXh0fHwiIjoiIjthPS9zcmMvaS50ZXN0KGcpJiZnLmluZGV4T2YoZC5zcGxpdCgiICIpWzBdKT09PTB9KSxhfSxzLmdlbmVyYXRlZGNvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4geShbIiMiLGgsIntmb250OjAvMCBhfSMiLGgsJzphZnRlcntjb250ZW50OiInLGwsJyI7dmlzaWJpbGl0eTpoaWRkZW47Zm9udDozcHgvMSBhfSddLmpvaW4oIiIpLGZ1bmN0aW9uKGIpe2E9Yi5vZmZzZXRIZWlnaHQ+PTN9KSxhfSxzLnZpZGVvPWZ1bmN0aW9uKCl7dmFyIGE9Yi5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLGM9ITE7dHJ5e2lmKGM9ISFhLmNhblBsYXlUeXBlKWM9bmV3IEJvb2xlYW4oYyksYy5vZ2c9YS5jYW5QbGF5VHlwZSgndmlkZW8vb2dnOyBjb2RlY3M9InRoZW9yYSInKS5yZXBsYWNlKC9ebm8kLywiIiksYy5oMjY0PWEuY2FuUGxheVR5cGUoJ3ZpZGVvL21wNDsgY29kZWNzPSJhdmMxLjQyRTAxRSInKS5yZXBsYWNlKC9ebm8kLywiIiksYy53ZWJtPWEuY2FuUGxheVR5cGUoJ3ZpZGVvL3dlYm07IGNvZGVjcz0idnA4LCB2b3JiaXMiJykucmVwbGFjZSgvXm5vJC8sIiIpfWNhdGNoKGQpe31yZXR1cm4gY30scy5hdWRpbz1mdW5jdGlvbigpe3ZhciBhPWIuY3JlYXRlRWxlbWVudCgiYXVkaW8iKSxjPSExO3RyeXtpZihjPSEhYS5jYW5QbGF5VHlwZSljPW5ldyBCb29sZWFuKGMpLGMub2dnPWEuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPSJ2b3JiaXMiJykucmVwbGFjZSgvXm5vJC8sIiIpLGMubXAzPWEuY2FuUGxheVR5cGUoImF1ZGlvL21wZWc7IikucmVwbGFjZSgvXm5vJC8sIiIpLGMud2F2PWEuY2FuUGxheVR5cGUoJ2F1ZGlvL3dhdjsgY29kZWNzPSIxIicpLnJlcGxhY2UoL15ubyQvLCIiKSxjLm00YT0oYS5jYW5QbGF5VHlwZSgiYXVkaW8veC1tNGE7Iil8fGEuY2FuUGxheVR5cGUoImF1ZGlvL2FhYzsiKSkucmVwbGFjZSgvXm5vJC8sIiIpfWNhdGNoKGQpe31yZXR1cm4gY30scy5sb2NhbHN0b3JhZ2U9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGgsaCksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oaCksITB9Y2F0Y2goYSl7cmV0dXJuITF9fSxzLnNlc3Npb25zdG9yYWdlPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGgsaCksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoKSwhMH1jYXRjaChhKXtyZXR1cm4hMX19LHMud2Vid29ya2Vycz1mdW5jdGlvbigpe3JldHVybiEhYS5Xb3JrZXJ9LHMuYXBwbGljYXRpb25jYWNoZT1mdW5jdGlvbigpe3JldHVybiEhYS5hcHBsaWNhdGlvbkNhY2hlfSxzLnN2Zz1mdW5jdGlvbigpe3JldHVybiEhYi5jcmVhdGVFbGVtZW50TlMmJiEhYi5jcmVhdGVFbGVtZW50TlMoci5zdmcsInN2ZyIpLmNyZWF0ZVNWR1JlY3R9LHMuaW5saW5lc3ZnPWZ1bmN0aW9uKCl7dmFyIGE9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gYS5pbm5lckhUTUw9IjxzdmcvPiIsKGEuZmlyc3RDaGlsZCYmYS5maXJzdENoaWxkLm5hbWVzcGFjZVVSSSk9PXIuc3ZnfSxzLnNtaWw9ZnVuY3Rpb24oKXtyZXR1cm4hIWIuY3JlYXRlRWxlbWVudE5TJiYvU1ZHQW5pbWF0ZS8udGVzdChtLmNhbGwoYi5jcmVhdGVFbGVtZW50TlMoci5zdmcsImFuaW1hdGUiKSkpfSxzLnN2Z2NsaXBwYXRocz1mdW5jdGlvbigpe3JldHVybiEhYi5jcmVhdGVFbGVtZW50TlMmJi9TVkdDbGlwUGF0aC8udGVzdChtLmNhbGwoYi5jcmVhdGVFbGVtZW50TlMoci5zdmcsImNsaXBQYXRoIikpKX07Zm9yKHZhciBMIGluIHMpQyhzLEwpJiYoeD1MLnRvTG93ZXJDYXNlKCksZVt4XT1zW0xdKCksdi5wdXNoKChlW3hdPyIiOiJuby0iKSt4KSk7cmV0dXJuIGUuaW5wdXR8fEsoKSxlLmFkZFRlc3Q9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im9iamVjdCIpZm9yKHZhciBkIGluIGEpQyhhLGQpJiZlLmFkZFRlc3QoZCxhW2RdKTtlbHNle2E9YS50b0xvd2VyQ2FzZSgpO2lmKGVbYV0hPT1jKXJldHVybiBlO2I9dHlwZW9mIGI9PSJmdW5jdGlvbiI/YigpOmIsdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiZmJiYoZy5jbGFzc05hbWUrPSIgIisoYj8iIjoibm8tIikrYSksZVthXT1ifXJldHVybiBlfSxEKCIiKSxpPWs9bnVsbCxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGwoYSxiKXt2YXIgYz1hLmNyZWF0ZUVsZW1lbnQoInAiKSxkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8YS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGMuaW5uZXJIVE1MPSJ4PHN0eWxlPiIrYisiPC9zdHlsZT4iLGQuaW5zZXJ0QmVmb3JlKGMubGFzdENoaWxkLGQuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gbSgpe3ZhciBhPXMuZWxlbWVudHM7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIj9hLnNwbGl0KCIgIik6YX1mdW5jdGlvbiBuKGEpe3ZhciBiPWpbYVtoXV07cmV0dXJuIGJ8fChiPXt9LGkrKyxhW2hdPWksaltpXT1iKSxifWZ1bmN0aW9uIG8oYSxjLGQpe2N8fChjPWIpO2lmKGspcmV0dXJuIGMuY3JlYXRlRWxlbWVudChhKTtkfHwoZD1uKGMpKTt2YXIgZztyZXR1cm4gZC5jYWNoZVthXT9nPWQuY2FjaGVbYV0uY2xvbmVOb2RlKCk6Zi50ZXN0KGEpP2c9KGQuY2FjaGVbYV09ZC5jcmVhdGVFbGVtKGEpKS5jbG9uZU5vZGUoKTpnPWQuY3JlYXRlRWxlbShhKSxnLmNhbkhhdmVDaGlsZHJlbiYmIWUudGVzdChhKSYmIWcudGFnVXJuP2QuZnJhZy5hcHBlbmRDaGlsZChnKTpnfWZ1bmN0aW9uIHAoYSxjKXthfHwoYT1iKTtpZihrKXJldHVybiBhLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjPWN8fG4oYSk7dmFyIGQ9Yy5mcmFnLmNsb25lTm9kZSgpLGU9MCxmPW0oKSxnPWYubGVuZ3RoO2Zvcig7ZTxnO2UrKylkLmNyZWF0ZUVsZW1lbnQoZltlXSk7cmV0dXJuIGR9ZnVuY3Rpb24gcShhLGIpe2IuY2FjaGV8fChiLmNhY2hlPXt9LGIuY3JlYXRlRWxlbT1hLmNyZWF0ZUVsZW1lbnQsYi5jcmVhdGVGcmFnPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxiLmZyYWc9Yi5jcmVhdGVGcmFnKCkpLGEuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihjKXtyZXR1cm4gcy5zaGl2TWV0aG9kcz9vKGMsYSxiKTpiLmNyZWF0ZUVsZW0oYyl9LGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD1GdW5jdGlvbigiaCxmIiwicmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDtoLnNoaXZNZXRob2RzJiYoIittKCkuam9pbigpLnJlcGxhY2UoL1tcd1wtXSsvZyxmdW5jdGlvbihhKXtyZXR1cm4gYi5jcmVhdGVFbGVtKGEpLGIuZnJhZy5jcmVhdGVFbGVtZW50KGEpLCdjKCInK2ErJyIpJ30pKyIpO3JldHVybiBufSIpKHMsYi5mcmFnKX1mdW5jdGlvbiByKGEpe2F8fChhPWIpO3ZhciBjPW4oYSk7cmV0dXJuIHMuc2hpdkNTUyYmIWcmJiFjLmhhc0NTUyYmKGMuaGFzQ1NTPSEhbChhLCJhcnRpY2xlLGFzaWRlLGRpYWxvZyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxtYWluLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2t9bWFya3tiYWNrZ3JvdW5kOiNGRjA7Y29sb3I6IzAwMH10ZW1wbGF0ZXtkaXNwbGF5Om5vbmV9IikpLGt8fHEoYSxjKSxhfXZhciBjPSIzLjcuMCIsZD1hLmh0bWw1fHx7fSxlPS9ePHxeKD86YnV0dG9ufG1hcHxzZWxlY3R8dGV4dGFyZWF8b2JqZWN0fGlmcmFtZXxvcHRpb258b3B0Z3JvdXApJC9pLGY9L14oPzphfGJ8Y29kZXxkaXZ8ZmllbGRzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aXxsYWJlbHxsaXxvbHxwfHF8c3BhbnxzdHJvbmd8c3R5bGV8dGFibGV8dGJvZHl8dGR8dGh8dHJ8dWwpJC9pLGcsaD0iX2h0bWw1c2hpdiIsaT0wLGo9e30sazsoZnVuY3Rpb24oKXt0cnl7dmFyIGE9Yi5jcmVhdGVFbGVtZW50KCJhIik7YS5pbm5lckhUTUw9Ijx4eXo+PC94eXo+IixnPSJoaWRkZW4iaW4gYSxrPWEuY2hpbGROb2Rlcy5sZW5ndGg9PTF8fGZ1bmN0aW9uKCl7Yi5jcmVhdGVFbGVtZW50KCJhIik7dmFyIGE9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7cmV0dXJuIHR5cGVvZiBhLmNsb25lTm9kZT09InVuZGVmaW5lZCJ8fHR5cGVvZiBhLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQifHx0eXBlb2YgYS5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIn0oKX1jYXRjaChjKXtnPSEwLGs9ITB9fSkoKTt2YXIgcz17ZWxlbWVudHM6ZC5lbGVtZW50c3x8ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBkaWFsb2cgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFpbiBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcHJvZ3Jlc3Mgc2VjdGlvbiBzdW1tYXJ5IHRlbXBsYXRlIHRpbWUgdmlkZW8iLHZlcnNpb246YyxzaGl2Q1NTOmQuc2hpdkNTUyE9PSExLHN1cHBvcnRzVW5rbm93bkVsZW1lbnRzOmssc2hpdk1ldGhvZHM6ZC5zaGl2TWV0aG9kcyE9PSExLHR5cGU6ImRlZmF1bHQiLHNoaXZEb2N1bWVudDpyLGNyZWF0ZUVsZW1lbnQ6byxjcmVhdGVEb2N1bWVudEZyYWdtZW50OnB9O2EuaHRtbDU9cyxyKGIpfSh0aGlzLGIpLGUuX3ZlcnNpb249ZCxlLl9wcmVmaXhlcz1uLGUuX2RvbVByZWZpeGVzPXEsZS5fY3Nzb21QcmVmaXhlcz1wLGUubXE9eixlLmhhc0V2ZW50PUEsZS50ZXN0UHJvcD1mdW5jdGlvbihhKXtyZXR1cm4gSChbYV0pfSxlLnRlc3RBbGxQcm9wcz1KLGUudGVzdFN0eWxlcz15LGUucHJlZml4ZWQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiP0ooYSxiLGMpOkooYSwicGZ4Iil9LGcuY2xhc3NOYW1lPWcuY2xhc3NOYW1lLnJlcGxhY2UoLyhefFxzKW5vLWpzKFxzfCQpLywiJDEkMiIpKyhmPyIganMgIit2LmpvaW4oIiAiKToiIiksZX0odGhpcyx0aGlzLmRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1vLmNhbGwoYSl9ZnVuY3Rpb24gZShhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGF9ZnVuY3Rpb24gZigpe31mdW5jdGlvbiBnKGEpe3JldHVybiFhfHwibG9hZGVkIj09YXx8ImNvbXBsZXRlIj09YXx8InVuaW5pdGlhbGl6ZWQiPT1hfWZ1bmN0aW9uIGgoKXt2YXIgYT1wLnNoaWZ0KCk7cT0xLGE/YS50P20oZnVuY3Rpb24oKXsoImMiPT1hLnQ/Qi5pbmplY3RDc3M6Qi5pbmplY3RKcykoYS5zLDAsYS5hLGEueCxhLmUsMSl9LDApOihhKCksaCgpKTpxPTB9ZnVuY3Rpb24gaShhLGMsZCxlLGYsaSxqKXtmdW5jdGlvbiBrKGIpe2lmKCFvJiZnKGwucmVhZHlTdGF0ZSkmJih1LnI9bz0xLCFxJiZoKCksbC5vbmxvYWQ9bC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiKSl7ImltZyIhPWEmJm0oZnVuY3Rpb24oKXt0LnJlbW92ZUNoaWxkKGwpfSw1MCk7Zm9yKHZhciBkIGluIHlbY10peVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmeVtjXVtkXS5vbmxvYWQoKX19dmFyIGo9anx8Qi5lcnJvclRpbWVvdXQsbD1iLmNyZWF0ZUVsZW1lbnQoYSksbz0wLHI9MCx1PXt0OmQsczpjLGU6ZixhOmkseDpqfTsxPT09eVtjXSYmKHI9MSx5W2NdPVtdKSwib2JqZWN0Ij09YT9sLmRhdGE9YzoobC5zcmM9YyxsLnR5cGU9YSksbC53aWR0aD1sLmhlaWdodD0iMCIsbC5vbmVycm9yPWwub25sb2FkPWwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ay5jYWxsKHRoaXMscil9LHAuc3BsaWNlKGUsMCx1KSwiaW1nIiE9YSYmKHJ8fDI9PT15W2NdPyh0Lmluc2VydEJlZm9yZShsLHM/bnVsbDpuKSxtKGssaikpOnlbY10ucHVzaChsKSl9ZnVuY3Rpb24gaihhLGIsYyxkLGYpe3JldHVybiBxPTAsYj1ifHwiaiIsZShhKT9pKCJjIj09Yj92OnUsYSxiLHRoaXMuaSsrLGMsZCxmKToocC5zcGxpY2UodGhpcy5pKyssMCxhKSwxPT1wLmxlbmd0aCYmaCgpKSx0aGlzfWZ1bmN0aW9uIGsoKXt2YXIgYT1CO3JldHVybiBhLmxvYWRlcj17bG9hZDpqLGk6MH0sYX12YXIgbD1iLmRvY3VtZW50RWxlbWVudCxtPWEuc2V0VGltZW91dCxuPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdLG89e30udG9TdHJpbmcscD1bXSxxPTAscj0iTW96QXBwZWFyYW5jZSJpbiBsLnN0eWxlLHM9ciYmISFiLmNyZWF0ZVJhbmdlKCkuY29tcGFyZU5vZGUsdD1zP2w6bi5wYXJlbnROb2RlLGw9YS5vcGVyYSYmIltvYmplY3QgT3BlcmFdIj09by5jYWxsKGEub3BlcmEpLGw9ISFiLmF0dGFjaEV2ZW50JiYhbCx1PXI/Im9iamVjdCI6bD8ic2NyaXB0IjoiaW1nIix2PWw/InNjcmlwdCI6dSx3PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW8uY2FsbChhKX0seD1bXSx5PXt9LHo9e3RpbWVvdXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5sZW5ndGgmJihhLnRpbWVvdXQ9YlswXSksYX19LEEsQjtCPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGE9YS5zcGxpdCgiISIpLGI9eC5sZW5ndGgsYz1hLnBvcCgpLGQ9YS5sZW5ndGgsYz17dXJsOmMsb3JpZ1VybDpjLHByZWZpeGVzOmF9LGUsZixnO2ZvcihmPTA7ZjxkO2YrKylnPWFbZl0uc3BsaXQoIj0iKSwoZT16W2cuc2hpZnQoKV0pJiYoYz1lKGMsZykpO2ZvcihmPTA7ZjxiO2YrKyljPXhbZl0oYyk7cmV0dXJuIGN9ZnVuY3Rpb24gZyhhLGUsZixnLGgpe3ZhciBpPWIoYSksaj1pLmF1dG9DYWxsYmFjaztpLnVybC5zcGxpdCgiLiIpLnBvcCgpLnNwbGl0KCI/Iikuc2hpZnQoKSxpLmJ5cGFzc3x8KGUmJihlPWQoZSk/ZTplW2FdfHxlW2ddfHxlW2Euc3BsaXQoImluZGV4Lmh0bWwiKS5wb3AoKS5zcGxpdCgiPyIpWzBdXSksaS5pbnN0ZWFkP2kuaW5zdGVhZChhLGUsZixnLGgpOih5W2kudXJsXT9pLm5vZXhlYz0hMDp5W2kudXJsXT0xLGYubG9hZChpLnVybCxpLmZvcmNlQ1NTfHwhaS5mb3JjZUpTJiYiY3NzIj09aS51cmwuc3BsaXQoIi4iKS5wb3AoKS5zcGxpdCgiPyIpLnNoaWZ0KCk/ImMiOmMsaS5ub2V4ZWMsaS5hdHRycyxpLnRpbWVvdXQpLChkKGUpfHxkKGopKSYmZi5sb2FkKGZ1bmN0aW9uKCl7aygpLGUmJmUoaS5vcmlnVXJsLGgsZyksaiYmaihpLm9yaWdVcmwsaCxnKSx5W2kudXJsXT0yfSkpKX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gYyhhLGMpe2lmKGEpe2lmKGUoYSkpY3x8KGo9ZnVuY3Rpb24oKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ay5hcHBseSh0aGlzLGEpLGwoKX0pLGcoYSxqLGIsMCxoKTtlbHNlIGlmKE9iamVjdChhKT09PWEpZm9yKG4gaW4gbT1mdW5jdGlvbigpe3ZhciBiPTAsYztmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJmIrKztyZXR1cm4gYn0oKSxhKWEuaGFzT3duUHJvcGVydHkobikmJighYyYmIS0tbSYmKGQoaik/aj1mdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtrLmFwcGx5KHRoaXMsYSksbCgpfTpqW25dPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBiPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTthJiZhLmFwcGx5KHRoaXMsYiksbCgpfX0oa1tuXSkpLGcoYVtuXSxqLGIsbixoKSl9ZWxzZSFjJiZsKCl9dmFyIGg9ISFhLnRlc3QsaT1hLmxvYWR8fGEuYm90aCxqPWEuY2FsbGJhY2t8fGYsaz1qLGw9YS5jb21wbGV0ZXx8ZixtLG47YyhoP2EueWVwOmEubm9wZSwhIWkpLGkmJmMoaSl9dmFyIGksaixsPXRoaXMueWVwbm9wZS5sb2FkZXI7aWYoZShhKSlnKGEsMCxsLDApO2Vsc2UgaWYodyhhKSlmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWo9YVtpXSxlKGopP2coaiwwLGwsMCk6dyhqKT9CKGopOk9iamVjdChqKT09PWomJmgoaixsKTtlbHNlIE9iamVjdChhKT09PWEmJmgoYSxsKX0sQi5hZGRQcmVmaXg9ZnVuY3Rpb24oYSxiKXt6W2FdPWJ9LEIuYWRkRmlsdGVyPWZ1bmN0aW9uKGEpe3gucHVzaChhKX0sQi5lcnJvclRpbWVvdXQ9MWU0LG51bGw9PWIucmVhZHlTdGF0ZSYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5yZWFkeVN0YXRlPSJsb2FkaW5nIixiLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEE9ZnVuY3Rpb24oKXtiLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEEsMCksYi5yZWFkeVN0YXRlPSJjb21wbGV0ZSJ9LDApKSxhLnllcG5vcGU9aygpLGEueWVwbm9wZS5leGVjdXRlU3RhY2s9aCxhLnllcG5vcGUuaW5qZWN0SnM9ZnVuY3Rpb24oYSxjLGQsZSxpLGope3ZhciBrPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksbCxvLGU9ZXx8Qi5lcnJvclRpbWVvdXQ7ay5zcmM9YTtmb3IobyBpbiBkKWsuc2V0QXR0cmlidXRlKG8sZFtvXSk7Yz1qP2g6Y3x8ZixrLm9ucmVhZHlzdGF0ZWNoYW5nZT1rLm9ubG9hZD1mdW5jdGlvbigpeyFsJiZnKGsucmVhZHlTdGF0ZSkmJihsPTEsYygpLGsub25sb2FkPWsub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSxtKGZ1bmN0aW9uKCl7bHx8KGw9MSxjKDEpKX0sZSksaT9rLm9ubG9hZCgpOm4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoayxuKX0sYS55ZXBub3BlLmluamVjdENzcz1mdW5jdGlvbihhLGMsZCxlLGcsaSl7dmFyIGU9Yi5jcmVhdGVFbGVtZW50KCJsaW5rIiksaixjPWk/aDpjfHxmO2UuaHJlZj1hLGUucmVsPSJzdHlsZXNoZWV0IixlLnR5cGU9InRleHQvY3NzIjtmb3IoaiBpbiBkKWUuc2V0QXR0cmlidXRlKGosZFtqXSk7Z3x8KG4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxuKSxtKGMsMCkpfX0odGhpcyxkb2N1bWVudCksTW9kZXJuaXpyLmxvYWQ9ZnVuY3Rpb24oKXt5ZXBub3BlLmFwcGx5KHdpbmRvdyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9Owo="}},"time_used":441,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":441,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/bootstrap.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.301Z","timestamp":1785147795301,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/bootstrap.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 10666\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":50397,"size_decoded":11211,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (550)","md5":"f7b290eb457738f20d2341ebb764789f","sha1":"608c30854d7ee9e1b3acc27e32d7267b53537a38","sha256":"4635187907fff87cff8287d3bf6b46f641542170e7921ce3c6ccb36264b0df19","sha512":"439289555cdb2946af85b3927d81c5215c1a99b6718a4fe1ac34083710de86523418020ce8a643a2f973b321674ef00425cf8b2b84f70d6b9ec80ff46063dda8","ssdeep":"768:6g2oEy7P5alWbrMAD/r5oyAoxUJxmoz5zOtpjnqZY0WUPnkoISarEj/l5Jl46Zl7:Z3EUBtbrd54ftzcnv/MXJl4+l1v2u","tlshash":"db33840bb7f22062576bb0a58e5f45087235492fa64bdc4c3c6c92e06f6583855bbfbc","first_seen":"2025-06-25T11:59:30.65386Z","last_seen":"2026-08-11T00:25:55.268776Z","times_seen":21,"resource_available":true,"data":"LyohCiAqIEJvb3RzdHJhcCB2My4zLjcgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqLwppZiAoInVuZGVmaW5lZCIgPT0gdHlwZW9mIGpRdWVyeSkgdGhyb3cgbmV3IEVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeSIpOyArIGZ1bmN0aW9uKGEpIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBiID0gYS5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpOwogICAgaWYgKGJbMF0gPCAyICYmIGJbMV0gPCA5IHx8IDEgPT0gYlswXSAmJiA5ID09IGJbMV0gJiYgYlsyXSA8IDEgfHwgYlswXSA+IDMpIHRocm93IG5ldyBFcnJvcigiQm9vdHN0cmFwJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBqUXVlcnkgdmVyc2lvbiAxLjkuMSBvciBoaWdoZXIsIGJ1dCBsb3dlciB0aGFuIHZlcnNpb24gNCIpCn0oalF1ZXJ5KSwgKyBmdW5jdGlvbihhKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgZnVuY3Rpb24gYigpIHsKICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJvb3RzdHJhcCIpLAogICAgICAgICAgICBiID0gewogICAgICAgICAgICAgICAgV2Via2l0VHJhbnNpdGlvbjogIndlYmtpdFRyYW5zaXRpb25FbmQiLAogICAgICAgICAgICAgICAgTW96VHJhbnNpdGlvbjogInRyYW5zaXRpb25lbmQiLAogICAgICAgICAgICAgICAgT1RyYW5zaXRpb246ICJvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCIsCiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAidHJhbnNpdGlvbmVuZCIKICAgICAgICAgICAgfTsKICAgICAgICBmb3IgKHZhciBjIGluIGIpCiAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGEuc3R5bGVbY10pIHJldHVybiB7CiAgICAgICAgICAgICAgICBlbmQ6IGJbY10KICAgICAgICAgICAgfTsKICAgICAgICByZXR1cm4gITEKICAgIH0KICAgIGEuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgdmFyIGMgPSAhMSwKICAgICAgICAgICAgZCA9IHRoaXM7CiAgICAgICAgYSh0aGlzKS5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjID0gITAKICAgICAgICB9KTsKICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjIHx8IGEoZCkudHJpZ2dlcihhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc2V0VGltZW91dChlLCBiKSwgdGhpcwogICAgfSwgYShmdW5jdGlvbigpIHsKICAgICAgICBhLnN1cHBvcnQudHJhbnNpdGlvbiA9IGIoKSwgYS5zdXBwb3J0LnRyYW5zaXRpb24gJiYgKGEuZXZlbnQuc3BlY2lhbC5ic1RyYW5zaXRpb25FbmQgPSB7CiAgICAgICAgICAgIGJpbmRUeXBlOiBhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsCiAgICAgICAgICAgIGRlbGVnYXRlVHlwZTogYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLAogICAgICAgICAgICBoYW5kbGU6IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICAgIGlmIChhKGIudGFyZ2V0KS5pcyh0aGlzKSkgcmV0dXJuIGIuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0pCn0oalF1ZXJ5KSwgKyBmdW5jdGlvbihhKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgZnVuY3Rpb24gYihiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGMgPSBhKHRoaXMpLAogICAgICAgICAgICAgICAgZSA9IGMuZGF0YSgiYnMuYWxlcnQiKTsKICAgICAgICAgICAgZSB8fCBjLmRhdGEoImJzLmFsZXJ0IiwgZSA9IG5ldyBkKHRoaXMpKSwgInN0cmluZyIgPT0gdHlwZW9mIGIgJiYgZVtiXS5jYWxsKGMpCiAgICAgICAgfSkKICAgIH0KICAgIHZhciBjID0gJ1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLAogICAgICAgIGQgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgIGEoYikub24oImNsaWNrIiwgYywgdGhpcy5jbG9zZSkKICAgICAgICB9OwogICAgZC5WRVJTSU9OID0gIjMuMy43IiwgZC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwLCBkLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICBnLmRldGFjaCgpLnRyaWdnZXIoImNsb3NlZC5icy5hbGVydCIpLnJlbW92ZSgpCiAgICAgICAgfQogICAgICAgIHZhciBlID0gYSh0aGlzKSwKICAgICAgICAgICAgZiA9IGUuYXR0cigiZGF0YS10YXJnZXQiKTsKICAgICAgICBmIHx8IChmID0gZS5hdHRyKCJocmVmIiksIGYgPSBmICYmIGYucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCAiIikpOwogICAgICAgIHZhciBnID0gYSgiIyIgPT09IGYgPyBbXSA6IGYpOwogICAgICAgIGIgJiYgYi5wcmV2ZW50RGVmYXVsdCgpLCBnLmxlbmd0aCB8fCAoZyA9IGUuY2xvc2VzdCgiLmFsZXJ0IikpLCBnLnRyaWdnZXIoYiA9IGEuRXZlbnQoImNsb3NlLmJzLmFsZXJ0IikpLCBiLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IChnLnJlbW92ZUNsYXNzKCJpbiIpLCBhLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBnLmhhc0NsYXNzKCJmYWRlIikgPyBnLm9uZSgiYnNUcmFuc2l0aW9uRW5kIiwgYykuZW11bGF0ZVRyYW5zaXRpb25FbmQoZC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6IGMoKSkKICAgIH07CiAgICB2YXIgZSA9IGEuZm4uYWxlcnQ7CiAgICBhLmZuLmFsZXJ0ID0gYiwgYS5mbi5hbGVydC5Db25zdHJ1Y3RvciA9IGQsIGEuZm4uYWxlcnQubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBhLmZuLmFsZXJ0ID0gZSwgdGhpcwogICAgfSwgYShkb2N1bWVudCkub24oImNsaWNrLmJzLmFsZXJ0LmRhdGEtYXBpIiwgYywgZC5wcm90b3R5cGUuY2xvc2UpCn0oalF1ZXJ5KSwgKyBmdW5jdGlvbihhKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgZnVuY3Rpb24gYihiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGQgPSBhKHRoaXMpLAogICAgICAgICAgICAgICAgZSA9IGQuZGF0YSgiYnMuYnV0dG9uIiksCiAgICAgICAgICAgICAgICBmID0gIm9iamVjdCIgPT0gdHlwZW9mIGIgJiYgYjsKICAgICAgICAgICAgZSB8fCBkLmRhdGEoImJzLmJ1dHRvbiIsIGUgPSBuZXcgYyh0aGlzLCBmKSksICJ0b2dnbGUiID09IGIgPyBlLnRvZ2dsZSgpIDogYiAmJiBlLnNldFN0YXRlKGIpCiAgICAgICAgfSkKICAgIH0KICAgIHZhciBjID0gZnVuY3Rpb24oYiwgZCkgewogICAgICAgIHRoaXMuJGVsZW1lbnQgPSBhKGIpLCB0aGlzLm9wdGlvbnMgPSBhLmV4dGVuZCh7fSwgYy5ERUZBVUxUUywgZCksIHRoaXMuaXNMb2FkaW5nID0gITEKICAgIH07CiAgICBjLlZFUlNJT04gPSAiMy4zLjciLCBjLkRFRkFVTFRTID0gewogICAgICAgIGxvYWRpbmdUZXh0OiAibG9hZGluZy4uLiIKICAgIH0sIGMucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24oYikgewogICAgICAgIHZhciBjID0gImRpc2FibGVkIiwKICAgICAgICAgICAgZCA9IHRoaXMuJGVsZW1lbnQsCiAgICAgICAgICAgIGUgPSBkLmlzKCJpbnB1dCIpID8gInZhbCIgOiAiaHRtbCIsCiAgICAgICAgICAgIGYgPSBkLmRhdGEoKTsKICAgICAgICBiICs9ICJUZXh0IiwgbnVsbCA9PSBmLnJlc2V0VGV4dCAmJiBkLmRhdGEoInJlc2V0VGV4dCIsIGRbZV0oKSksIHNldFRpbWVvdXQoYS5wcm94eShmdW5jdGlvbigpIHsKICAgICAgICAgICAgZFtlXShudWxsID09IGZbYl0gPyB0aGlzLm9wdGlvbnNbYl0gOiBmW2JdKSwgImxvYWRpbmdUZXh0IiA9PSBiID8gKHRoaXMuaXNMb2FkaW5nID0gITAsIGQuYWRkQ2xhc3MoYykuYXR0cihjLCBjKS5wcm9wKGMsICEwKSkgOiB0aGlzLmlzTG9hZGluZyAmJiAodGhpcy5pc0xvYWRpbmcgPSAhMSwgZC5yZW1vdmVDbGFzcyhjKS5yZW1vdmVBdHRyKGMpLnByb3AoYywgITEpKQogICAgICAgIH0sIHRoaXMpLCAwKQogICAgfSwgYy5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSAhMCwKICAgICAgICAgICAgYiA9IHRoaXMuJGVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtdG9nZ2xlPSJidXR0b25zIl0nKTsKICAgICAgICBpZiAoYi5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLiRlbGVtZW50LmZpbmQoImlucHV0Iik7CiAgICAgICAgICAgICJyYWRpbyIgPT0gYy5wcm9wKCJ0eXBlIikgPyAoYy5wcm9wKCJjaGVja2VkIikgJiYgKGEgPSAhMSksIGIuZmluZCgiLmFjdGl2ZSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSwgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygiYWN0aXZlIikpIDogImNoZWNrYm94IiA9PSBjLnByb3AoInR5cGUiKSAmJiAoYy5wcm9wKCJjaGVja2VkIikgIT09IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImFjdGl2ZSIpICYmIChhID0gITEpLCB0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKCJhY3RpdmUiKSksIGMucHJvcCgiY2hlY2tlZCIsIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImFjdGl2ZSIpKSwgYSAmJiBjLnRyaWdnZXIoImNoYW5nZSIpCiAgICAgICAgfSBlbHNlIHRoaXMuJGVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIiwgIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImFjdGl2ZSIpKSwgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygiYWN0aXZlIikKICAgIH07CiAgICB2YXIgZCA9IGEuZm4uYnV0dG9uOwogICAgYS5mbi5idXR0b24gPSBiLCBhLmZuLmJ1dHRvbi5Db25zdHJ1Y3RvciA9IGMsIGEuZm4uYnV0dG9uLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYS5mbi5idXR0b24gPSBkLCB0aGlzCiAgICB9LCBhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpIiwgJ1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJywgZnVuY3Rpb24oYykgewogICAgICAgIHZhciBkID0gYShjLnRhcmdldCkuY2xvc2VzdCgiLmJ0biIpOwogICAgICAgIGIuY2FsbChkLCAidG9nZ2xlIiksIGEoYy50YXJnZXQpLmlzKCdpbnB1dFt0eXBlPSJyYWRpbyJdLCBpbnB1dFt0eXBlPSJjaGVja2JveCJdJykgfHwgKGMucHJldmVudERlZmF1bHQoKSwgZC5pcygiaW5wdXQsYnV0dG9uIikgPyBkLnRyaWdnZXIoImZvY3VzIikgOiBkLmZpbmQoImlucHV0OnZpc2libGUsYnV0dG9uOnZpc2libGUiKS5maXJzdCgpLnRyaWdnZXIoImZvY3VzIikpCiAgICB9KS5vbigiZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpIiwgJ1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJywgZnVuY3Rpb24oYikgewogICAgICAgIGEoYi50YXJnZXQpLmNsb3Nlc3QoIi5idG4iKS50b2dnbGVDbGFzcygiZm9jdXMiLCAvXmZvY3VzKGluKT8kLy50ZXN0KGIudHlwZSkpCiAgICB9KQp9KGpRdWVyeSksICsgZnVuY3Rpb24oYSkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIGZ1bmN0aW9uIGIoYikgewogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkID0gYSh0aGlzKSwKICAgICAgICAgICAgICAgIGUgPSBkLmRhdGEoImJzLmNhcm91c2VsIiksCiAgICAgICAgICAgICAgICBmID0gYS5leHRlbmQoe30sIGMuREVGQVVMVFMsIGQuZGF0YSgpLCAib2JqZWN0IiA9PSB0eXBlb2YgYiAmJiBiKSwKICAgICAgICAgICAgICAgIGcgPSAic3RyaW5nIiA9PSB0eXBlb2YgYiA/IGIgOiBmLnNsaWRlOwogICAgICAgICAgICBlIHx8IGQuZGF0YSgiYnMuY2Fyb3VzZWwiLCBlID0gbmV3IGModGhpcywgZikpLCAibnVtYmVyIiA9PSB0eXBlb2YgYiA/IGUudG8oYikgOiBnID8gZVtnXSgpIDogZi5pbnRlcnZhbCAmJiBlLnBhdXNlKCkuY3ljbGUoKQogICAgICAgIH0pCiAgICB9CiAgICB2YXIgYyA9IGZ1bmN0aW9uKGIsIGMpIHsKICAgICAgICB0aGlzLiRlbGVtZW50ID0gYShiKSwgdGhpcy4kaW5kaWNhdG9ycyA9IHRoaXMuJGVsZW1lbnQuZmluZCgiLmNhcm91c2VsLWluZGljYXRvcnMiKSwgdGhpcy5vcHRpb25zID0gYywgdGhpcy5wYXVzZWQgPSBudWxsLCB0aGlzLnNsaWRpbmcgPSBudWxsLCB0aGlzLmludGVydmFsID0gbnVsbCwgdGhpcy4kYWN0aXZlID0gbnVsbCwgdGhpcy4kaXRlbXMgPSBudWxsLCB0aGlzLm9wdGlvbnMua2V5Ym9hcmQgJiYgdGhpcy4kZWxlbWVudC5vbigia2V5ZG93bi5icy5jYXJvdXNlbCIsIGEucHJveHkodGhpcy5rZXlkb3duLCB0aGlzKSksICJob3ZlciIgPT0gdGhpcy5vcHRpb25zLnBhdXNlICYmICEoIm9udG91Y2hzdGFydCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSAmJiB0aGlzLiRlbGVtZW50Lm9uKCJtb3VzZWVudGVyLmJzLmNhcm91c2VsIiwgYS5wcm94eSh0aGlzLnBhdXNlLCB0aGlzKSkub24oIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLCBhLnByb3h5KHRoaXMuY3ljbGUsIHRoaXMpKQogICAgfTsKICAgIGMuVkVSU0lPTiA9ICIzLjMuNyIsIGMuVFJBTlNJVElPTl9EVVJBVElPTiA9IDYwMCwgYy5ERUZBVUxUUyA9IHsKICAgICAgICBpbnRlcnZhbDogMCwKICAgICAgICBwYXVzZTogImhvdmVyIiwKICAgICAgICB3cmFwOiAhMCwKICAgICAgICBrZXlib2FyZDogITAKICAgIH0sIGMucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbihhKSB7CiAgICAgICAgaWYgKCEvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGEudGFyZ2V0LnRhZ05hbWUpKSB7CiAgICAgICAgICAgIHN3aXRjaCAoYS53aGljaCkgewogICAgICAgICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXYoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIGEucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KICAgIH0sIGMucHJvdG90eXBlLmN5Y2xlID0gZnVuY3Rpb24oYikgewogICAgICAgIHJldHVybiBiIHx8ICh0aGlzLnBhdXNlZCA9ICExKSwgdGhpcy5pbnRlcnZhbCAmJiBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpLCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwgJiYgIXRoaXMucGF1c2VkICYmICh0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoYS5wcm94eSh0aGlzLm5leHQsIHRoaXMpLCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKSwgdGhpcwogICAgfSwgYy5wcm90b3R5cGUuZ2V0SXRlbUluZGV4ID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiB0aGlzLiRpdGVtcyA9IGEucGFyZW50KCkuY2hpbGRyZW4oIi5pdGVtIiksIHRoaXMuJGl0ZW1zLmluZGV4KGEgfHwgdGhpcy4kYWN0aXZlKQogICAgfSwgYy5wcm90b3R5cGUuZ2V0SXRlbUZvckRpcmVjdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IHRoaXMuZ2V0SXRlbUluZGV4KGIpLAogICAgICAgICAgICBkID0gInByZXYiID09IGEgJiYgMCA9PT0gYyB8fCAibmV4dCIgPT0gYSAmJiBjID09IHRoaXMuJGl0ZW1zLmxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGQgJiYgIXRoaXMub3B0aW9ucy53cmFwKSByZXR1cm4gYjsKICAgICAgICB2YXIgZSA9ICJwcmV2IiA9PSBhID8gLTEgOiAxLAogICAgICAgICAgICBmID0gKGMgKyBlKSAlIHRoaXMuJGl0ZW1zLmxlbmd0aDsKICAgICAgICByZXR1cm4gdGhpcy4kaXRlbXMuZXEoZikKICAgIH0sIGMucHJvdG90eXBlLnRvID0gZnVuY3Rpb24oYSkgewogICAgICAgIHZhciBiID0gdGhpcywKICAgICAgICAgICAgYyA9IHRoaXMuZ2V0SXRlbUluZGV4KHRoaXMuJGFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuZmluZCgiLml0ZW0uYWN0aXZlIikpOwogICAgICAgIGlmICghKGEgPiB0aGlzLiRpdGVtcy5sZW5ndGggLSAxIHx8IGEgPCAwKSkgcmV0dXJuIHRoaXMuc2xpZGluZyA/IHRoaXMuJGVsZW1lbnQub25lKCJzbGlkLmJzLmNhcm91c2VsIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGIudG8oYSkKICAgICAgICB9KSA6IGMgPT0gYSA/IHRoaXMucGF1c2UoKS5jeWNsZSgpIDogdGhpcy5zbGlkZShhID4gYyA/ICJuZXh0IiA6ICJwcmV2IiwgdGhpcy4kaXRlbXMuZXEoYSkpCiAgICB9LCBjLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICByZXR1cm4gYiB8fCAodGhpcy5wYXVzZWQgPSAhMCksIHRoaXMuJGVsZW1lbnQuZmluZCgiLm5leHQsIC5wcmV2IikubGVuZ3RoICYmIGEuc3VwcG9ydC50cmFuc2l0aW9uICYmICh0aGlzLiRlbGVtZW50LnRyaWdnZXIoYS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKSwgdGhpcy5jeWNsZSghMCkpLCB0aGlzLmludGVydmFsID0gY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKSwgdGhpcwogICAgfSwgYy5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5zbGlkaW5nKSByZXR1cm4gdGhpcy5zbGlkZSgibmV4dCIpCiAgICB9LCBjLnByb3RvdHlwZS5wcmV2ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLnNsaWRpbmcpIHJldHVybiB0aGlzLnNsaWRlKCJwcmV2IikKICAgIH0sIGMucHJvdG90eXBlLnNsaWRlID0gZnVuY3Rpb24oYiwgZCkgewogICAgICAgIHZhciBlID0gdGhpcy4kZWxlbWVudC5maW5kKCIuaXRlbS5hY3RpdmUiKSwKICAgICAgICAgICAgZiA9IGQgfHwgdGhpcy5nZXRJdGVtRm9yRGlyZWN0aW9uKGIsIGUpLAogICAgICAgICAgICBnID0gdGhpcy5pbnRlcnZhbCwKICAgICAgICAgICAgaCA9ICJuZXh0IiA9PSBiID8gImxlZnQiIDogInJpZ2h0IiwKICAgICAgICAgICAgaSA9IHRoaXM7CiAgICAgICAgaWYgKGYuaGFzQ2xhc3MoImFjdGl2ZSIpKSByZXR1cm4gdGhpcy5zbGlkaW5nID0gITE7CiAgICAgICAgdmFyIGogPSBmWzBdLAogICAgICAgICAgICBrID0gYS5FdmVudCgic2xpZGUuYnMuY2Fyb3VzZWwiLCB7CiAgICAgICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBqLAogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBoCiAgICAgICAgICAgIH0pOwogICAgICAgIGlmICh0aGlzLiRlbGVtZW50LnRyaWdnZXIoayksICFrLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNsaWRpbmcgPSAhMCwgZyAmJiB0aGlzLnBhdXNlKCksIHRoaXMuJGluZGljYXRvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRpbmRpY2F0b3JzLmZpbmQoIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7CiAgICAgICAgICAgICAgICB2YXIgbCA9IGEodGhpcy4kaW5kaWNhdG9ycy5jaGlsZHJlbigpW3RoaXMuZ2V0SXRlbUluZGV4KGYpXSk7CiAgICAgICAgICAgICAgICBsICYmIGwuYWRkQ2xhc3MoImFjdGl2ZSIpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG0gPSBhLkV2ZW50KCJzbGlkLmJzLmNhcm91c2VsIiwgewogICAgICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogaiwKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogaAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGEuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoInNsaWRlIikgPyAoZi5hZGRDbGFzcyhiKSwgZlswXS5vZmZzZXRXaWR0aCwgZS5hZGRDbGFzcyhoKSwgZi5hZGRDbGFzcyhoKSwgZS5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZi5yZW1vdmVDbGFzcyhbYiwgaF0uam9pbigiICIpKS5hZGRDbGFzcygiYWN0aXZlIiksIGUucmVtb3ZlQ2xhc3MoWyJhY3RpdmUiLCBoXS5qb2luKCIgIikpLCBpLnNsaWRpbmcgPSAhMSwgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpLiRlbGVtZW50LnRyaWdnZXIobSkKICAgICAgICAgICAgICAgIH0sIDApCiAgICAgICAgICAgIH0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTikpIDogKGUucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLCBmLmFkZENsYXNzKCJhY3RpdmUiKSwgdGhpcy5zbGlkaW5nID0gITEsIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihtKSksIGcgJiYgdGhpcy5jeWNsZSgpLCB0aGlzCiAgICAgICAgfQogICAgfTsKICAgIHZhciBkID0gYS5mbi5jYXJvdXNlbDsKICAgIGEuZm4uY2Fyb3VzZWwgPSBiLCBhLmZuLmNhcm91c2VsLkNvbnN0cnVjdG9yID0gYywgYS5mbi5jYXJvdXNlbC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGEuZm4uY2Fyb3VzZWwgPSBkLCB0aGlzCiAgICB9OwogICAgdmFyIGUgPSBmdW5jdGlvbihjKSB7CiAgICAgICAgdmFyIGQsIGUgPSBhKHRoaXMpLAogICAgICAgICAgICBmID0gYShlLmF0dHIoImRhdGEtdGFyZ2V0IikgfHwgKGQgPSBlLmF0dHIoImhyZWYiKSkgJiYgZC5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sICIiKSk7CiAgICAgICAgaWYgKGYuaGFzQ2xhc3MoImNhcm91c2VsIikpIHsKICAgICAgICAgICAgdmFyIGcgPSBhLmV4dGVuZCh7fSwgZi5kYXRhKCksIGUuZGF0YSgpKSwKICAgICAgICAgICAgICAgIGggPSBlLmF0dHIoImRhdGEtc2xpZGUtdG8iKTsKICAgICAgICAgICAgaCAmJiAoZy5pbnRlcnZhbCA9ICExKSwgYi5jYWxsKGYsIGcpLCBoICYmIGYuZGF0YSgiYnMuY2Fyb3VzZWwiKS50byhoKSwgYy5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQogICAgfTsKICAgIGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaSIsICJbZGF0YS1zbGlkZV0iLCBlKS5vbigiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCAiW2RhdGEtc2xpZGUtdG9dIiwgZSksIGEod2luZG93KS5vbigibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIGEoJ1tkYXRhLXJpZGU9ImNhcm91c2VsIl0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYyA9IGEodGhpcyk7CiAgICAgICAgICAgIGIuY2FsbChjLCBjLmRhdGEoKSkKICAgICAgICB9KQogICAgfSkKfShqUXVlcnkpLCArIGZ1bmN0aW9uKGEpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBmdW5jdGlvbiBiKGIpIHsKICAgICAgICB2YXIgYywgZCA9IGIuYXR0cigiZGF0YS10YXJnZXQiKSB8fCAoYyA9IGIuYXR0cigiaHJlZiIpKSAmJiBjLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywgIiIpOwogICAgICAgIHJldHVybiBhKGQpCiAgICB9CgogICAgZnVuY3Rpb24gYyhiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGMgPSBhKHRoaXMpLAogICAgICAgICAgICAgICAgZSA9IGMuZGF0YSgiYnMuY29sbGFwc2UiKSwKICAgICAgICAgICAgICAgIGYgPSBhLmV4dGVuZCh7fSwgZC5ERUZBVUxUUywgYy5kYXRhKCksICJvYmplY3QiID09IHR5cGVvZiBiICYmIGIpOwogICAgICAgICAgICAhZSAmJiBmLnRvZ2dsZSAmJiAvc2hvd3xoaWRlLy50ZXN0KGIpICYmIChmLnRvZ2dsZSA9ICExKSwgZSB8fCBjLmRhdGEoImJzLmNvbGxhcHNlIiwgZSA9IG5ldyBkKHRoaXMsIGYpKSwgInN0cmluZyIgPT0gdHlwZW9mIGIgJiYgZVtiXSgpCiAgICAgICAgfSkKICAgIH0KICAgIHZhciBkID0gZnVuY3Rpb24oYiwgYykgewogICAgICAgIHRoaXMuJGVsZW1lbnQgPSBhKGIpLCB0aGlzLm9wdGlvbnMgPSBhLmV4dGVuZCh7fSwgZC5ERUZBVUxUUywgYyksIHRoaXMuJHRyaWdnZXIgPSBhKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycgKyBiLmlkICsgJyJdLFtkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXVtkYXRhLXRhcmdldD0iIycgKyBiLmlkICsgJyJdJyksIHRoaXMudHJhbnNpdGlvbmluZyA9IG51bGwsIHRoaXMub3B0aW9ucy5wYXJlbnQgPyB0aGlzLiRwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpIDogdGhpcy5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy4kZWxlbWVudCwgdGhpcy4kdHJpZ2dlciksIHRoaXMub3B0aW9ucy50b2dnbGUgJiYgdGhpcy50b2dnbGUoKQogICAgfTsKICAgIGQuVkVSU0lPTiA9ICIzLjMuNyIsIGQuVFJBTlNJVElPTl9EVVJBVElPTiA9IDM1MCwgZC5ERUZBVUxUUyA9IHsKICAgICAgICB0b2dnbGU6ICEwCiAgICB9LCBkLnByb3RvdHlwZS5kaW1lbnNpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoIndpZHRoIik7CiAgICAgICAgcmV0dXJuIGEgPyAid2lkdGgiIDogImhlaWdodCIKICAgIH0sIGQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMudHJhbnNpdGlvbmluZyAmJiAhdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiaW4iKSkgewogICAgICAgICAgICB2YXIgYiwgZSA9IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuY2hpbGRyZW4oIi5wYW5lbCIpLmNoaWxkcmVuKCIuaW4sIC5jb2xsYXBzaW5nIik7CiAgICAgICAgICAgIGlmICghKGUgJiYgZS5sZW5ndGggJiYgKGIgPSBlLmRhdGEoImJzLmNvbGxhcHNlIiksIGIgJiYgYi50cmFuc2l0aW9uaW5nKSkpIHsKICAgICAgICAgICAgICAgIHZhciBmID0gYS5FdmVudCgic2hvdy5icy5jb2xsYXBzZSIpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsZW1lbnQudHJpZ2dlcihmKSwgIWYuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICBlICYmIGUubGVuZ3RoICYmIChjLmNhbGwoZSwgImhpZGUiKSwgYiB8fCBlLmRhdGEoImJzLmNvbGxhcHNlIiwgbnVsbCkpOwogICAgICAgICAgICAgICAgICAgIHZhciBnID0gdGhpcy5kaW1lbnNpb24oKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJjb2xsYXBzZSIpLmFkZENsYXNzKCJjb2xsYXBzaW5nIilbZ10oMCkuYXR0cigiYXJpYS1leHBhbmRlZCIsICEwKSwgdGhpcy4kdHJpZ2dlci5yZW1vdmVDbGFzcygiY29sbGFwc2VkIikuYXR0cigiYXJpYS1leHBhbmRlZCIsICEwKSwgdGhpcy50cmFuc2l0aW9uaW5nID0gMTsKICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJjb2xsYXBzaW5nIikuYWRkQ2xhc3MoImNvbGxhcHNlIGluIilbZ10oIiIpLCB0aGlzLnRyYW5zaXRpb25pbmcgPSAwLCB0aGlzLiRlbGVtZW50LnRyaWdnZXIoInNob3duLmJzLmNvbGxhcHNlIikKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmICghYS5zdXBwb3J0LnRyYW5zaXRpb24pIHJldHVybiBoLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhLmNhbWVsQ2FzZShbInNjcm9sbCIsIGddLmpvaW4oIi0iKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGEucHJveHkoaCwgdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGQuVFJBTlNJVElPTl9EVVJBVElPTilbZ10odGhpcy4kZWxlbWVudFswXVtpXSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sIGQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMudHJhbnNpdGlvbmluZyAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJpbiIpKSB7CiAgICAgICAgICAgIHZhciBiID0gYS5FdmVudCgiaGlkZS5icy5jb2xsYXBzZSIpOwogICAgICAgICAgICBpZiAodGhpcy4kZWxlbWVudC50cmlnZ2VyKGIpLCAhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgdmFyIGMgPSB0aGlzLmRpbWVuc2lvbigpOwogICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudFtjXSh0aGlzLiRlbGVtZW50W2NdKCkpWzBdLm9mZnNldEhlaWdodCwgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygiY29sbGFwc2luZyIpLnJlbW92ZUNsYXNzKCJjb2xsYXBzZSBpbiIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCAhMSksIHRoaXMuJHRyaWdnZXIuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCAhMSksIHRoaXMudHJhbnNpdGlvbmluZyA9IDE7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IDAsIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoImNvbGxhcHNpbmciKS5hZGRDbGFzcygiY29sbGFwc2UiKS50cmlnZ2VyKCJoaWRkZW4uYnMuY29sbGFwc2UiKQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBhLnN1cHBvcnQudHJhbnNpdGlvbiA/IHZvaWQgdGhpcy4kZWxlbWVudFtjXSgwKS5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGEucHJveHkoZSwgdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGQuVFJBTlNJVElPTl9EVVJBVElPTikgOiBlLmNhbGwodGhpcykKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sIGQucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXNbdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiaW4iKSA/ICJoaWRlIiA6ICJzaG93Il0oKQogICAgfSwgZC5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGEodGhpcy5vcHRpb25zLnBhcmVudCkuZmluZCgnW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInICsgdGhpcy5vcHRpb25zLnBhcmVudCArICciXScpLmVhY2goYS5wcm94eShmdW5jdGlvbihjLCBkKSB7CiAgICAgICAgICAgIHZhciBlID0gYShkKTsKICAgICAgICAgICAgdGhpcy5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoYihlKSwgZSkKICAgICAgICB9LCB0aGlzKSkuZW5kKCkKICAgIH0sIGQucHJvdG90eXBlLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGEuaGFzQ2xhc3MoImluIik7CiAgICAgICAgYS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwgYyksIGIudG9nZ2xlQ2xhc3MoImNvbGxhcHNlZCIsICFjKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwgYykKICAgIH07CiAgICB2YXIgZSA9IGEuZm4uY29sbGFwc2U7CiAgICBhLmZuLmNvbGxhcHNlID0gYywgYS5mbi5jb2xsYXBzZS5Db25zdHJ1Y3RvciA9IGQsIGEuZm4uY29sbGFwc2Uubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBhLmZuLmNvbGxhcHNlID0gZSwgdGhpcwogICAgfSwgYShkb2N1bWVudCkub24oImNsaWNrLmJzLmNvbGxhcHNlLmRhdGEtYXBpIiwgJ1tkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXScsIGZ1bmN0aW9uKGQpIHsKICAgICAgICB2YXIgZSA9IGEodGhpcyk7CiAgICAgICAgZS5hdHRyKCJkYXRhLXRhcmdldCIpIHx8IGQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB2YXIgZiA9IGIoZSksCiAgICAgICAgICAgIGcgPSBmLmRhdGEoImJzLmNvbGxhcHNlIiksCiAgICAgICAgICAgIGggPSBnID8gInRvZ2dsZSIgOiBlLmRhdGEoKTsKICAgICAgICBjLmNhbGwoZiwgaCkKICAgIH0pCn0oalF1ZXJ5KSwgKyBmdW5jdGlvbihhKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgZnVuY3Rpb24gYihiKSB7CiAgICAgICAgdmFyIGMgPSBiLmF0dHIoImRhdGEtdGFyZ2V0Iik7CiAgICAgICAgYyB8fCAoYyA9IGIuYXR0cigiaHJlZiIpLCBjID0gYyAmJiAvI1tBLVphLXpdLy50ZXN0KGMpICYmIGMucmVwbGFjZSgvLiooPz0jW15cc10qJCkvLCAiIikpOwogICAgICAgIHZhciBkID0gYyAmJiBhKGMpOwogICAgICAgIHJldHVybiBkICYmIGQubGVuZ3RoID8gZCA6IGIucGFyZW50KCkKICAgIH0KCiAgICBmdW5jdGlvbiBjKGMpIHsKICAgICAgICBjICYmIDMgPT09IGMud2hpY2ggfHwgKGEoZSkucmVtb3ZlKCksIGEoZikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGQgPSBhKHRoaXMpLAogICAgICAgICAgICAgICAgZSA9IGIoZCksCiAgICAgICAgICAgICAgICBmID0gewogICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIGUuaGFzQ2xhc3MoIm9wZW4iKSAmJiAoYyAmJiAiY2xpY2siID09IGMudHlwZSAmJiAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGMudGFyZ2V0LnRhZ05hbWUpICYmIGEuY29udGFpbnMoZVswXSwgYy50YXJnZXQpIHx8IChlLnRyaWdnZXIoYyA9IGEuRXZlbnQoImhpZGUuYnMuZHJvcGRvd24iLCBmKSksIGMuaXNEZWZhdWx0UHJldmVudGVkKCkgfHwgKGQuYXR0cigiYXJpYS1leHBhbmRlZCIsICJmYWxzZSIpLCBlLnJlbW92ZUNsYXNzKCJvcGVuIikudHJpZ2dlcihhLkV2ZW50KCJoaWRkZW4uYnMuZHJvcGRvd24iLCBmKSkpKSkKICAgICAgICB9KSkKICAgIH0KCiAgICBmdW5jdGlvbiBkKGIpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgYyA9IGEodGhpcyksCiAgICAgICAgICAgICAgICBkID0gYy5kYXRhKCJicy5kcm9wZG93biIpOwogICAgICAgICAgICBkIHx8IGMuZGF0YSgiYnMuZHJvcGRvd24iLCBkID0gbmV3IGcodGhpcykpLCAic3RyaW5nIiA9PSB0eXBlb2YgYiAmJiBkW2JdLmNhbGwoYykKICAgICAgICB9KQogICAgfQogICAgdmFyIGUgPSAiLmRyb3Bkb3duLWJhY2tkcm9wIiwKICAgICAgICBmID0gJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsCiAgICAgICAgZyA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgYShiKS5vbigiY2xpY2suYnMuZHJvcGRvd24iLCB0aGlzLnRvZ2dsZSkKICAgICAgICB9OwogICAgZy5WRVJTSU9OID0gIjMuMy43IiwgZy5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24oZCkgewogICAgICAgIHZhciBlID0gYSh0aGlzKTsKICAgICAgICBpZiAoIWUuaXMoIi5kaXNhYmxlZCwgOmRpc2FibGVkIikpIHsKICAgICAgICAgICAgdmFyIGYgPSBiKGUpLAogICAgICAgICAgICAgICAgZyA9IGYuaGFzQ2xhc3MoIm9wZW4iKTsKICAgICAgICAgICAgaWYgKGMoKSwgIWcpIHsKICAgICAgICAgICAgICAgICJvbnRvdWNoc3RhcnQiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAhZi5jbG9zZXN0KCIubmF2YmFyLW5hdiIpLmxlbmd0aCAmJiBhKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygiZHJvcGRvd24tYmFja2Ryb3AiKS5pbnNlcnRBZnRlcihhKHRoaXMpKS5vbigiY2xpY2siLCBjKTsKICAgICAgICAgICAgICAgIHZhciBoID0gewogICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoZi50cmlnZ2VyKGQgPSBhLkV2ZW50KCJzaG93LmJzLmRyb3Bkb3duIiwgaCkpLCBkLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm47CiAgICAgICAgICAgICAgICBlLnRyaWdnZXIoImZvY3VzIikuYXR0cigiYXJpYS1leHBhbmRlZCIsICJ0cnVlIiksIGYudG9nZ2xlQ2xhc3MoIm9wZW4iKS50cmlnZ2VyKGEuRXZlbnQoInNob3duLmJzLmRyb3Bkb3duIiwgaCkpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICExCiAgICAgICAgfQogICAgfSwgZy5wcm90b3R5cGUua2V5ZG93biA9IGZ1bmN0aW9uKGMpIHsKICAgICAgICBpZiAoLygzOHw0MHwyN3wzMikvLnRlc3QoYy53aGljaCkgJiYgIS9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoYy50YXJnZXQudGFnTmFtZSkpIHsKICAgICAgICAgICAgdmFyIGQgPSBhKHRoaXMpOwogICAgICAgICAgICBpZiAoYy5wcmV2ZW50RGVmYXVsdCgpLCBjLnN0b3BQcm9wYWdhdGlvbigpLCAhZC5pcygiLmRpc2FibGVkLCA6ZGlzYWJsZWQiKSkgewogICAgICAgICAgICAgICAgdmFyIGUgPSBiKGQpLAogICAgICAgICAgICAgICAgICAgIGcgPSBlLmhhc0NsYXNzKCJvcGVuIik7CiAgICAgICAgICAgICAgICBpZiAoIWcgJiYgMjcgIT0gYy53aGljaCB8fCBnICYmIDI3ID09IGMud2hpY2gpIHJldHVybiAyNyA9PSBjLndoaWNoICYmIGUuZmluZChmKS50cmlnZ2VyKCJmb2N1cyIpLCBkLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgICAgICAgICB2YXIgaCA9ICIgbGk6bm90KC5kaXNhYmxlZCk6dmlzaWJsZSBhIiwKICAgICAgICAgICAgICAgICAgICBpID0gZS5maW5kKCIuZHJvcGRvd24tbWVudSIgKyBoKTsKICAgICAgICAgICAgICAgIGlmIChpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHZhciBqID0gaS5pbmRleChjLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgMzggPT0gYy53aGljaCAmJiBqID4gMCAmJiBqLS0sIDQwID09IGMud2hpY2ggJiYgaiA8IGkubGVuZ3RoIC0gMSAmJiBqKyssIH5qIHx8IChqID0gMCksIGkuZXEoaikudHJpZ2dlcigiZm9jdXMiKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIHZhciBoID0gYS5mbi5kcm9wZG93bjsKICAgIGEuZm4uZHJvcGRvd24gPSBkLCBhLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yID0gZywgYS5mbi5kcm9wZG93bi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGEuZm4uZHJvcGRvd24gPSBoLCB0aGlzCiAgICB9LCBhKGRvY3VtZW50KS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLCBjKS5vbigiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLCAiLmRyb3Bkb3duIGZvcm0iLCBmdW5jdGlvbihhKSB7CiAgICAgICAgYS5zdG9wUHJvcGFnYXRpb24oKQogICAgfSkub24oImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwgZiwgZy5wcm90b3R5cGUudG9nZ2xlKS5vbigia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsIGYsIGcucHJvdG90eXBlLmtleWRvd24pLm9uKCJrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwgIi5kcm9wZG93bi1tZW51IiwgZy5wcm90b3R5cGUua2V5ZG93bikKfShqUXVlcnkpLCArIGZ1bmN0aW9uKGEpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBmdW5jdGlvbiBiKGIsIGQpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZSA9IGEodGhpcyksCiAgICAgICAgICAgICAgICBmID0gZS5kYXRhKCJicy5tb2RhbCIpLAogICAgICAgICAgICAgICAgZyA9IGEuZXh0ZW5kKHt9LCBjLkRFRkFVTFRTLCBlLmRhdGEoKSwgIm9iamVjdCIgPT0gdHlwZW9mIGIgJiYgYik7CiAgICAgICAgICAgIGYgfHwgZS5kYXRhKCJicy5tb2RhbCIsIGYgPSBuZXcgYyh0aGlzLCBnKSksICJzdHJpbmciID09IHR5cGVvZiBiID8gZltiXShkKSA6IGcuc2hvdyAmJiBmLnNob3coZCkKICAgICAgICB9KQogICAgfQogICAgdmFyIGMgPSBmdW5jdGlvbihiLCBjKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gYywgdGhpcy4kYm9keSA9IGEoZG9jdW1lbnQuYm9keSksIHRoaXMuJGVsZW1lbnQgPSBhKGIpLCB0aGlzLiRkaWFsb2cgPSB0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSwgdGhpcy4kYmFja2Ryb3AgPSBudWxsLCB0aGlzLmlzU2hvd24gPSBudWxsLCB0aGlzLm9yaWdpbmFsQm9keVBhZCA9IG51bGwsIHRoaXMuc2Nyb2xsYmFyV2lkdGggPSAwLCB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2sgPSAhMSwgdGhpcy5vcHRpb25zLnJlbW90ZSAmJiB0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLCBhLnByb3h5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpCiAgICAgICAgfSwgdGhpcykpCiAgICB9OwogICAgYy5WRVJTSU9OID0gIjMuMy43IiwgYy5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMzAwLCBjLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04gPSAxNTAsIGMuREVGQVVMVFMgPSB7CiAgICAgICAgYmFja2Ryb3A6ICEwLAogICAgICAgIGtleWJvYXJkOiAhMCwKICAgICAgICBzaG93OiAhMAogICAgfSwgYy5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiB0aGlzLmlzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhhKQogICAgfSwgYy5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICB2YXIgZCA9IHRoaXMsCiAgICAgICAgICAgIGUgPSBhLkV2ZW50KCJzaG93LmJzLm1vZGFsIiwgewogICAgICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogYgogICAgICAgICAgICB9KTsKICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSksIHRoaXMuaXNTaG93biB8fCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8ICh0aGlzLmlzU2hvd24gPSAhMCwgdGhpcy5jaGVja1Njcm9sbGJhcigpLCB0aGlzLnNldFNjcm9sbGJhcigpLCB0aGlzLiRib2R5LmFkZENsYXNzKCJtb2RhbC1vcGVuIiksIHRoaXMuZXNjYXBlKCksIHRoaXMucmVzaXplKCksIHRoaXMuJGVsZW1lbnQub24oImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLCAnW2RhdGEtZGlzbWlzcz0ibW9kYWwiXScsIGEucHJveHkodGhpcy5oaWRlLCB0aGlzKSksIHRoaXMuJGRpYWxvZy5vbigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZC4kZWxlbWVudC5vbmUoIm1vdXNldXAuZGlzbWlzcy5icy5tb2RhbCIsIGZ1bmN0aW9uKGIpIHsKICAgICAgICAgICAgICAgIGEoYi50YXJnZXQpLmlzKGQuJGVsZW1lbnQpICYmIChkLmlnbm9yZUJhY2tkcm9wQ2xpY2sgPSAhMCkKICAgICAgICAgICAgfSkKICAgICAgICB9KSwgdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGUgPSBhLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBkLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7CiAgICAgICAgICAgIGQuJGVsZW1lbnQucGFyZW50KCkubGVuZ3RoIHx8IGQuJGVsZW1lbnQuYXBwZW5kVG8oZC4kYm9keSksIGQuJGVsZW1lbnQuc2hvdygpLnNjcm9sbFRvcCgwKSwgZC5hZGp1c3REaWFsb2coKSwgZSAmJiBkLiRlbGVtZW50WzBdLm9mZnNldFdpZHRoLCBkLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLCBkLmVuZm9yY2VGb2N1cygpOwogICAgICAgICAgICB2YXIgZiA9IGEuRXZlbnQoInNob3duLmJzLm1vZGFsIiwgewogICAgICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogYgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZSA/IGQuJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZC4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIoZikKICAgICAgICAgICAgfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6IGQuJGVsZW1lbnQudHJpZ2dlcigiZm9jdXMiKS50cmlnZ2VyKGYpCiAgICAgICAgfSkpCiAgICB9LCBjLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oYikgewogICAgICAgIGIgJiYgYi5wcmV2ZW50RGVmYXVsdCgpLCBiID0gYS5FdmVudCgiaGlkZS5icy5tb2RhbCIpLCB0aGlzLiRlbGVtZW50LnRyaWdnZXIoYiksIHRoaXMuaXNTaG93biAmJiAhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAodGhpcy5pc1Nob3duID0gITEsIHRoaXMuZXNjYXBlKCksIHRoaXMucmVzaXplKCksIGEoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLCB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksIHRoaXMuJGRpYWxvZy5vZmYoIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIiksIGEuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKSA/IHRoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLCBhLnByb3h5KHRoaXMuaGlkZU1vZGFsLCB0aGlzKSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYy5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6IHRoaXMuaGlkZU1vZGFsKCkpCiAgICB9LCBjLnByb3RvdHlwZS5lbmZvcmNlRm9jdXMgPSBmdW5jdGlvbigpIHsKICAgICAgICBhKGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKS5vbigiZm9jdXNpbi5icy5tb2RhbCIsIGEucHJveHkoZnVuY3Rpb24oYSkgewogICAgICAgICAgICBkb2N1bWVudCA9PT0gYS50YXJnZXQgfHwgdGhpcy4kZWxlbWVudFswXSA9PT0gYS50YXJnZXQgfHwgdGhpcy4kZWxlbWVudC5oYXMoYS50YXJnZXQpLmxlbmd0aCB8fCB0aGlzLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikKICAgICAgICB9LCB0aGlzKSkKICAgIH0sIGMucHJvdG90eXBlLmVzY2FwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaXNTaG93biAmJiB0aGlzLm9wdGlvbnMua2V5Ym9hcmQgPyB0aGlzLiRlbGVtZW50Lm9uKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiLCBhLnByb3h5KGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgMjcgPT0gYS53aGljaCAmJiB0aGlzLmhpZGUoKQogICAgICAgIH0sIHRoaXMpKSA6IHRoaXMuaXNTaG93biB8fCB0aGlzLiRlbGVtZW50Lm9mZigia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsIikKICAgIH0sIGMucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaXNTaG93biA/IGEod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIiwgYS5wcm94eSh0aGlzLmhhbmRsZVVwZGF0ZSwgdGhpcykpIDogYSh3aW5kb3cpLm9mZigicmVzaXplLmJzLm1vZGFsIikKICAgIH0sIGMucHJvdG90eXBlLmhpZGVNb2RhbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpczsKICAgICAgICB0aGlzLiRlbGVtZW50LmhpZGUoKSwgdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpIHsKICAgICAgICAgICAgYS4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLCBhLnJlc2V0QWRqdXN0bWVudHMoKSwgYS5yZXNldFNjcm9sbGJhcigpLCBhLiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpCiAgICAgICAgfSkKICAgIH0sIGMucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kYmFja2Ryb3AgJiYgdGhpcy4kYmFja2Ryb3AucmVtb3ZlKCksIHRoaXMuJGJhY2tkcm9wID0gbnVsbAogICAgfSwgYy5wcm90b3R5cGUuYmFja2Ryb3AgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgdmFyIGQgPSB0aGlzLAogICAgICAgICAgICBlID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpID8gImZhZGUiIDogIiI7CiAgICAgICAgaWYgKHRoaXMuaXNTaG93biAmJiB0aGlzLm9wdGlvbnMuYmFja2Ryb3ApIHsKICAgICAgICAgICAgdmFyIGYgPSBhLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBlOwogICAgICAgICAgICBpZiAodGhpcy4kYmFja2Ryb3AgPSBhKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIiArIGUpLmFwcGVuZFRvKHRoaXMuJGJvZHkpLCB0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIiwgYS5wcm94eShmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWdub3JlQmFja2Ryb3BDbGljayA/IHZvaWQodGhpcy5pZ25vcmVCYWNrZHJvcENsaWNrID0gITEpIDogdm9pZChhLnRhcmdldCA9PT0gYS5jdXJyZW50VGFyZ2V0ICYmICgic3RhdGljIiA9PSB0aGlzLm9wdGlvbnMuYmFja2Ryb3AgPyB0aGlzLiRlbGVtZW50WzBdLmZvY3VzKCkgOiB0aGlzLmhpZGUoKSkpCiAgICAgICAgICAgICAgICB9LCB0aGlzKSksIGYgJiYgdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsIHRoaXMuJGJhY2tkcm9wLmFkZENsYXNzKCJpbiIpLCAhYikgcmV0dXJuOwogICAgICAgICAgICBmID8gdGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLCBiKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pIDogYigpCiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1Nob3duICYmIHRoaXMuJGJhY2tkcm9wKSB7CiAgICAgICAgICAgIHRoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpOwogICAgICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZC5yZW1vdmVCYWNrZHJvcCgpLCBiICYmIGIoKQogICAgICAgICAgICB9OwogICAgICAgICAgICBhLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIikgPyB0aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGcpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTikgOiBnKCkKICAgICAgICB9IGVsc2UgYiAmJiBiKCkKICAgIH0sIGMucHJvdG90eXBlLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYWRqdXN0RGlhbG9nKCkKICAgIH0sIGMucHJvdG90eXBlLmFkanVzdERpYWxvZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpcy4kZWxlbWVudFswXS5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICAgIHRoaXMuJGVsZW1lbnQuY3NzKHsKICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICF0aGlzLmJvZHlJc092ZXJmbG93aW5nICYmIGEgPyB0aGlzLnNjcm9sbGJhcldpZHRoIDogIiIsCiAgICAgICAgICAgIHBhZGRpbmdSaWdodDogdGhpcy5ib2R5SXNPdmVyZmxvd2luZyAmJiAhYSA/IHRoaXMuc2Nyb2xsYmFyV2lkdGggOiAiIgogICAgICAgIH0pCiAgICB9LCBjLnByb3RvdHlwZS5yZXNldEFkanVzdG1lbnRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kZWxlbWVudC5jc3MoewogICAgICAgICAgICBwYWRkaW5nTGVmdDogIiIsCiAgICAgICAgICAgIHBhZGRpbmdSaWdodDogIiIKICAgICAgICB9KQogICAgfSwgYy5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHdpbmRvdy5pbm5lcldpZHRoOwogICAgICAgIGlmICghYSkgewogICAgICAgICAgICB2YXIgYiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgYSA9IGIucmlnaHQgLSBNYXRoLmFicyhiLmxlZnQpCiAgICAgICAgfQogICAgICAgIHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgYSwgdGhpcy5zY3JvbGxiYXJXaWR0aCA9IHRoaXMubWVhc3VyZVNjcm9sbGJhcigpCiAgICB9LCBjLnByb3RvdHlwZS5zZXRTY3JvbGxiYXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0IikgfHwgMCwgMTApOwogICAgICAgIHRoaXMub3JpZ2luYWxCb2R5UGFkID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgfHwgIiIsIHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgJiYgdGhpcy4kYm9keS5jc3MoInBhZGRpbmctcmlnaHQiLCBhICsgdGhpcy5zY3JvbGxiYXJXaWR0aCkKICAgIH0sIGMucHJvdG90eXBlLnJlc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kYm9keS5jc3MoInBhZGRpbmctcmlnaHQiLCB0aGlzLm9yaWdpbmFsQm9keVBhZCkKICAgIH0sIGMucHJvdG90eXBlLm1lYXN1cmVTY3JvbGxiYXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIGEuY2xhc3NOYW1lID0gIm1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIiwgdGhpcy4kYm9keS5hcHBlbmQoYSk7CiAgICAgICAgdmFyIGIgPSBhLm9mZnNldFdpZHRoIC0gYS5jbGllbnRXaWR0aDsKICAgICAgICByZXR1cm4gdGhpcy4kYm9keVswXS5yZW1vdmVDaGlsZChhKSwgYgogICAgfTsKICAgIHZhciBkID0gYS5mbi5tb2RhbDsKICAgIGEuZm4ubW9kYWwgPSBiLCBhLmZuLm1vZGFsLkNvbnN0cnVjdG9yID0gYywgYS5mbi5tb2RhbC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGEuZm4ubW9kYWwgPSBkLCB0aGlzCiAgICB9LCBhKGRvY3VtZW50KS5vbigiY2xpY2suYnMubW9kYWwuZGF0YS1hcGkiLCAnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJywgZnVuY3Rpb24oYykgewogICAgICAgIHZhciBkID0gYSh0aGlzKSwKICAgICAgICAgICAgZSA9IGQuYXR0cigiaHJlZiIpLAogICAgICAgICAgICBmID0gYShkLmF0dHIoImRhdGEtdGFyZ2V0IikgfHwgZSAmJiBlLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywgIiIpKSwKICAgICAgICAgICAgZyA9IGYuZGF0YSgiYnMubW9kYWwiKSA/ICJ0b2dnbGUiIDogYS5leHRlbmQoewogICAgICAgICAgICAgICAgcmVtb3RlOiAhLyMvLnRlc3QoZSkgJiYgZQogICAgICAgICAgICB9LCBmLmRhdGEoKSwgZC5kYXRhKCkpOwogICAgICAgIGQuaXMoImEiKSAmJiBjLnByZXZlbnREZWZhdWx0KCksIGYub25lKCJzaG93LmJzLm1vZGFsIiwgZnVuY3Rpb24oYSkgewogICAgICAgICAgICBhLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGYub25lKCJoaWRkZW4uYnMubW9kYWwiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGQuaXMoIjp2aXNpYmxlIikgJiYgZC50cmlnZ2VyKCJmb2N1cyIpCiAgICAgICAgICAgIH0pCiAgICAgICAgfSksIGIuY2FsbChmLCBnLCB0aGlzKQogICAgfSkKfShqUXVlcnkpLCArIGZ1bmN0aW9uKGEpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBmdW5jdGlvbiBiKGIpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZCA9IGEodGhpcyksCiAgICAgICAgICAgICAgICBlID0gZC5kYXRhKCJicy50b29sdGlwIiksCiAgICAgICAgICAgICAgICBmID0gIm9iamVjdCIgPT0gdHlwZW9mIGIgJiYgYjsKICAgICAgICAgICAgIWUgJiYgL2Rlc3Ryb3l8aGlkZS8udGVzdChiKSB8fCAoZSB8fCBkLmRhdGEoImJzLnRvb2x0aXAiLCBlID0gbmV3IGModGhpcywgZikpLCAic3RyaW5nIiA9PSB0eXBlb2YgYiAmJiBlW2JdKCkpCiAgICAgICAgfSkKICAgIH0KICAgIHZhciBjID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgIHRoaXMudHlwZSA9IG51bGwsIHRoaXMub3B0aW9ucyA9IG51bGwsIHRoaXMuZW5hYmxlZCA9IG51bGwsIHRoaXMudGltZW91dCA9IG51bGwsIHRoaXMuaG92ZXJTdGF0ZSA9IG51bGwsIHRoaXMuJGVsZW1lbnQgPSBudWxsLCB0aGlzLmluU3RhdGUgPSBudWxsLCB0aGlzLmluaXQoInRvb2x0aXAiLCBhLCBiKQogICAgfTsKICAgIGMuVkVSU0lPTiA9ICIzLjMuNyIsIGMuVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MCwgYy5ERUZBVUxUUyA9IHsKICAgICAgICBhbmltYXRpb246ICEwLAogICAgICAgIHBsYWNlbWVudDogInRvcCIsCiAgICAgICAgc2VsZWN0b3I6ICExLAogICAgICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz0idG9vbHRpcCIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+JywKICAgICAgICB0cmlnZ2VyOiAiaG92ZXIgZm9jdXMiLAogICAgICAgIHRpdGxlOiAiIiwKICAgICAgICBkZWxheTogMCwKICAgICAgICBodG1sOiAhMSwKICAgICAgICBjb250YWluZXI6ICExLAogICAgICAgIHZpZXdwb3J0OiB7CiAgICAgICAgICAgIHNlbGVjdG9yOiAiYm9keSIsCiAgICAgICAgICAgIHBhZGRpbmc6IDAKICAgICAgICB9CiAgICB9LCBjLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oYiwgYywgZCkgewogICAgICAgIGlmICh0aGlzLmVuYWJsZWQgPSAhMCwgdGhpcy50eXBlID0gYiwgdGhpcy4kZWxlbWVudCA9IGEoYyksIHRoaXMub3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucyhkKSwgdGhpcy4kdmlld3BvcnQgPSB0aGlzLm9wdGlvbnMudmlld3BvcnQgJiYgYShhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZpZXdwb3J0KSA/IHRoaXMub3B0aW9ucy52aWV3cG9ydC5jYWxsKHRoaXMsIHRoaXMuJGVsZW1lbnQpIDogdGhpcy5vcHRpb25zLnZpZXdwb3J0LnNlbGVjdG9yIHx8IHRoaXMub3B0aW9ucy52aWV3cG9ydCksIHRoaXMuaW5TdGF0ZSA9IHsKICAgICAgICAgICAgICAgIGNsaWNrOiAhMSwKICAgICAgICAgICAgICAgIGhvdmVyOiAhMSwKICAgICAgICAgICAgICAgIGZvY3VzOiAhMQogICAgICAgICAgICB9LCB0aGlzLiRlbGVtZW50WzBdIGluc3RhbmNlb2YgZG9jdW1lbnQuY29uc3RydWN0b3IgJiYgIXRoaXMub3B0aW9ucy5zZWxlY3RvcikgdGhyb3cgbmV3IEVycm9yKCJgc2VsZWN0b3JgIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIGluaXRpYWxpemluZyAiICsgdGhpcy50eXBlICsgIiBvbiB0aGUgd2luZG93LmRvY3VtZW50IG9iamVjdCEiKTsKICAgICAgICBmb3IgKHZhciBlID0gdGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoIiAiKSwgZiA9IGUubGVuZ3RoOyBmLS07KSB7CiAgICAgICAgICAgIHZhciBnID0gZVtmXTsKICAgICAgICAgICAgaWYgKCJjbGljayIgPT0gZykgdGhpcy4kZWxlbWVudC5vbigiY2xpY2suIiArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCBhLnByb3h5KHRoaXMudG9nZ2xlLCB0aGlzKSk7CiAgICAgICAgICAgIGVsc2UgaWYgKCJtYW51YWwiICE9IGcpIHsKICAgICAgICAgICAgICAgIHZhciBoID0gImhvdmVyIiA9PSBnID8gIm1vdXNlZW50ZXIiIDogImZvY3VzaW4iLAogICAgICAgICAgICAgICAgICAgIGkgPSAiaG92ZXIiID09IGcgPyAibW91c2VsZWF2ZSIgOiAiZm9jdXNvdXQiOwogICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5vbihoICsgIi4iICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsIGEucHJveHkodGhpcy5lbnRlciwgdGhpcykpLCB0aGlzLiRlbGVtZW50Lm9uKGkgKyAiLiIgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgYS5wcm94eSh0aGlzLmxlYXZlLCB0aGlzKSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPyB0aGlzLl9vcHRpb25zID0gYS5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgewogICAgICAgICAgICB0cmlnZ2VyOiAibWFudWFsIiwKICAgICAgICAgICAgc2VsZWN0b3I6ICIiCiAgICAgICAgfSkgOiB0aGlzLmZpeFRpdGxlKCkKICAgIH0sIGMucHJvdG90eXBlLmdldERlZmF1bHRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGMuREVGQVVMVFMKICAgIH0sIGMucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgcmV0dXJuIGIgPSBhLmV4dGVuZCh7fSwgdGhpcy5nZXREZWZhdWx0cygpLCB0aGlzLiRlbGVtZW50LmRhdGEoKSwgYiksIGIuZGVsYXkgJiYgIm51bWJlciIgPT0gdHlwZW9mIGIuZGVsYXkgJiYgKGIuZGVsYXkgPSB7CiAgICAgICAgICAgIHNob3c6IGIuZGVsYXksCiAgICAgICAgICAgIGhpZGU6IGIuZGVsYXkKICAgICAgICB9KSwgYgogICAgfSwgYy5wcm90b3R5cGUuZ2V0RGVsZWdhdGVPcHRpb25zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGIgPSB7fSwKICAgICAgICAgICAgYyA9IHRoaXMuZ2V0RGVmYXVsdHMoKTsKICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucyAmJiBhLmVhY2godGhpcy5fb3B0aW9ucywgZnVuY3Rpb24oYSwgZCkgewogICAgICAgICAgICBjW2FdICE9IGQgJiYgKGJbYV0gPSBkKQogICAgICAgIH0pLCBiCiAgICB9LCBjLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICB2YXIgYyA9IGIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yID8gYiA6IGEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iICsgdGhpcy50eXBlKTsKICAgICAgICByZXR1cm4gYyB8fCAoYyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGIuY3VycmVudFRhcmdldCwgdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSksIGEoYi5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iICsgdGhpcy50eXBlLCBjKSksIGIgaW5zdGFuY2VvZiBhLkV2ZW50ICYmIChjLmluU3RhdGVbImZvY3VzaW4iID09IGIudHlwZSA/ICJmb2N1cyIgOiAiaG92ZXIiXSA9ICEwKSwgYy50aXAoKS5oYXNDbGFzcygiaW4iKSB8fCAiaW4iID09IGMuaG92ZXJTdGF0ZSA/IHZvaWQoYy5ob3ZlclN0YXRlID0gImluIikgOiAoY2xlYXJUaW1lb3V0KGMudGltZW91dCksIGMuaG92ZXJTdGF0ZSA9ICJpbiIsIGMub3B0aW9ucy5kZWxheSAmJiBjLm9wdGlvbnMuZGVsYXkuc2hvdyA/IHZvaWQoYy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgImluIiA9PSBjLmhvdmVyU3RhdGUgJiYgYy5zaG93KCkKICAgICAgICB9LCBjLm9wdGlvbnMuZGVsYXkuc2hvdykpIDogYy5zaG93KCkpCiAgICB9LCBjLnByb3RvdHlwZS5pc0luU3RhdGVUcnVlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgYSBpbiB0aGlzLmluU3RhdGUpCiAgICAgICAgICAgIGlmICh0aGlzLmluU3RhdGVbYV0pIHJldHVybiAhMDsKICAgICAgICByZXR1cm4gITEKICAgIH0sIGMucHJvdG90eXBlLmxlYXZlID0gZnVuY3Rpb24oYikgewogICAgICAgIHZhciBjID0gYiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IgPyBiIDogYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIgKyB0aGlzLnR5cGUpOwogICAgICAgIGlmIChjIHx8IChjID0gbmV3IHRoaXMuY29uc3RydWN0b3IoYi5jdXJyZW50VGFyZ2V0LCB0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSwgYShiLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIgKyB0aGlzLnR5cGUsIGMpKSwgYiBpbnN0YW5jZW9mIGEuRXZlbnQgJiYgKGMuaW5TdGF0ZVsiZm9jdXNvdXQiID09IGIudHlwZSA/ICJmb2N1cyIgOiAiaG92ZXIiXSA9ICExKSwgIWMuaXNJblN0YXRlVHJ1ZSgpKSByZXR1cm4gY2xlYXJUaW1lb3V0KGMudGltZW91dCksIGMuaG92ZXJTdGF0ZSA9ICJvdXQiLCBjLm9wdGlvbnMuZGVsYXkgJiYgYy5vcHRpb25zLmRlbGF5LmhpZGUgPyB2b2lkKGMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICJvdXQiID09IGMuaG92ZXJTdGF0ZSAmJiBjLmhpZGUoKQogICAgICAgIH0sIGMub3B0aW9ucy5kZWxheS5oaWRlKSkgOiBjLmhpZGUoKQogICAgfSwgYy5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBiID0gYS5FdmVudCgic2hvdy5icy4iICsgdGhpcy50eXBlKTsKICAgICAgICBpZiAodGhpcy5oYXNDb250ZW50KCkgJiYgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihiKTsKICAgICAgICAgICAgdmFyIGQgPSBhLmNvbnRhaW5zKHRoaXMuJGVsZW1lbnRbMF0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHRoaXMuJGVsZW1lbnRbMF0pOwogICAgICAgICAgICBpZiAoYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSB8fCAhZCkgcmV0dXJuOwogICAgICAgICAgICB2YXIgZSA9IHRoaXMsCiAgICAgICAgICAgICAgICBmID0gdGhpcy50aXAoKSwKICAgICAgICAgICAgICAgIGcgPSB0aGlzLmdldFVJRCh0aGlzLnR5cGUpOwogICAgICAgICAgICB0aGlzLnNldENvbnRlbnQoKSwgZi5hdHRyKCJpZCIsIGcpLCB0aGlzLiRlbGVtZW50LmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLCBnKSwgdGhpcy5vcHRpb25zLmFuaW1hdGlvbiAmJiBmLmFkZENsYXNzKCJmYWRlIik7CiAgICAgICAgICAgIHZhciBoID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgdGhpcy5vcHRpb25zLnBsYWNlbWVudCA/IHRoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLCBmWzBdLCB0aGlzLiRlbGVtZW50WzBdKSA6IHRoaXMub3B0aW9ucy5wbGFjZW1lbnQsCiAgICAgICAgICAgICAgICBpID0gL1xzP2F1dG8/XHM/L2ksCiAgICAgICAgICAgICAgICBqID0gaS50ZXN0KGgpOwogICAgICAgICAgICBqICYmIChoID0gaC5yZXBsYWNlKGksICIiKSB8fCAidG9wIiksIGYuZGV0YWNoKCkuY3NzKHsKICAgICAgICAgICAgICAgIHRvcDogMCwKICAgICAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgICAgICBkaXNwbGF5OiAiYmxvY2siCiAgICAgICAgICAgIH0pLmFkZENsYXNzKGgpLmRhdGEoImJzLiIgKyB0aGlzLnR5cGUsIHRoaXMpLCB0aGlzLm9wdGlvbnMuY29udGFpbmVyID8gZi5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSA6IGYuaW5zZXJ0QWZ0ZXIodGhpcy4kZWxlbWVudCksIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigiaW5zZXJ0ZWQuYnMuIiArIHRoaXMudHlwZSk7CiAgICAgICAgICAgIHZhciBrID0gdGhpcy5nZXRQb3NpdGlvbigpLAogICAgICAgICAgICAgICAgbCA9IGZbMF0ub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgICBtID0gZlswXS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgIGlmIChqKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IGgsCiAgICAgICAgICAgICAgICAgICAgbyA9IHRoaXMuZ2V0UG9zaXRpb24odGhpcy4kdmlld3BvcnQpOwogICAgICAgICAgICAgICAgaCA9ICJib3R0b20iID09IGggJiYgay5ib3R0b20gKyBtID4gby5ib3R0b20gPyAidG9wIiA6ICJ0b3AiID09IGggJiYgay50b3AgLSBtIDwgby50b3AgPyAiYm90dG9tIiA6ICJyaWdodCIgPT0gaCAmJiBrLnJpZ2h0ICsgbCA+IG8ud2lkdGggPyAibGVmdCIgOiAibGVmdCIgPT0gaCAmJiBrLmxlZnQgLSBsIDwgby5sZWZ0ID8gInJpZ2h0IiA6IGgsIGYucmVtb3ZlQ2xhc3MobikuYWRkQ2xhc3MoaCkKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcCA9IHRoaXMuZ2V0Q2FsY3VsYXRlZE9mZnNldChoLCBrLCBsLCBtKTsKICAgICAgICAgICAgdGhpcy5hcHBseVBsYWNlbWVudChwLCBoKTsKICAgICAgICAgICAgdmFyIHEgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBhID0gZS5ob3ZlclN0YXRlOwogICAgICAgICAgICAgICAgZS4kZWxlbWVudC50cmlnZ2VyKCJzaG93bi5icy4iICsgZS50eXBlKSwgZS5ob3ZlclN0YXRlID0gbnVsbCwgIm91dCIgPT0gYSAmJiBlLmxlYXZlKGUpCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGEuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJHRpcC5oYXNDbGFzcygiZmFkZSIpID8gZi5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIHEpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTikgOiBxKCkKICAgICAgICB9CiAgICB9LCBjLnByb3RvdHlwZS5hcHBseVBsYWNlbWVudCA9IGZ1bmN0aW9uKGIsIGMpIHsKICAgICAgICB2YXIgZCA9IHRoaXMudGlwKCksCiAgICAgICAgICAgIGUgPSBkWzBdLm9mZnNldFdpZHRoLAogICAgICAgICAgICBmID0gZFswXS5vZmZzZXRIZWlnaHQsCiAgICAgICAgICAgIGcgPSBwYXJzZUludChkLmNzcygibWFyZ2luLXRvcCIpLCAxMCksCiAgICAgICAgICAgIGggPSBwYXJzZUludChkLmNzcygibWFyZ2luLWxlZnQiKSwgMTApOwogICAgICAgIGlzTmFOKGcpICYmIChnID0gMCksIGlzTmFOKGgpICYmIChoID0gMCksIGIudG9wICs9IGcsIGIubGVmdCArPSBoLCBhLm9mZnNldC5zZXRPZmZzZXQoZFswXSwgYS5leHRlbmQoewogICAgICAgICAgICB1c2luZzogZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgZC5jc3MoewogICAgICAgICAgICAgICAgICAgIHRvcDogTWF0aC5yb3VuZChhLnRvcCksCiAgICAgICAgICAgICAgICAgICAgbGVmdDogTWF0aC5yb3VuZChhLmxlZnQpCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfSwgYiksIDApLCBkLmFkZENsYXNzKCJpbiIpOwogICAgICAgIHZhciBpID0gZFswXS5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgaiA9IGRbMF0ub2Zmc2V0SGVpZ2h0OwogICAgICAgICJ0b3AiID09IGMgJiYgaiAhPSBmICYmIChiLnRvcCA9IGIudG9wICsgZiAtIGopOwogICAgICAgIHZhciBrID0gdGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEoYywgYiwgaSwgaik7CiAgICAgICAgay5sZWZ0ID8gYi5sZWZ0ICs9IGsubGVmdCA6IGIudG9wICs9IGsudG9wOwogICAgICAgIHZhciBsID0gL3RvcHxib3R0b20vLnRlc3QoYyksCiAgICAgICAgICAgIG0gPSBsID8gMiAqIGsubGVmdCAtIGUgKyBpIDogMiAqIGsudG9wIC0gZiArIGosCiAgICAgICAgICAgIG4gPSBsID8gIm9mZnNldFdpZHRoIiA6ICJvZmZzZXRIZWlnaHQiOwogICAgICAgIGQub2Zmc2V0KGIpLCB0aGlzLnJlcGxhY2VBcnJvdyhtLCBkWzBdW25dLCBsKQogICAgfSwgYy5wcm90b3R5cGUucmVwbGFjZUFycm93ID0gZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgIHRoaXMuYXJyb3coKS5jc3MoYyA/ICJsZWZ0IiA6ICJ0b3AiLCA1MCAqICgxIC0gYSAvIGIpICsgIiUiKS5jc3MoYyA/ICJ0b3AiIDogImxlZnQiLCAiIikKICAgIH0sIGMucHJvdG90eXBlLnNldENvbnRlbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMudGlwKCksCiAgICAgICAgICAgIGIgPSB0aGlzLmdldFRpdGxlKCk7CiAgICAgICAgYS5maW5kKCIudG9vbHRpcC1pbm5lciIpW3RoaXMub3B0aW9ucy5odG1sID8gImh0bWwiIDogInRleHQiXShiKSwgYS5yZW1vdmVDbGFzcygiZmFkZSBpbiB0b3AgYm90dG9tIGxlZnQgcmlnaHQiKQogICAgfSwgYy5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGIpIHsKICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAiaW4iICE9IGUuaG92ZXJTdGF0ZSAmJiBmLmRldGFjaCgpLCBlLiRlbGVtZW50ICYmIGUuJGVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1kZXNjcmliZWRieSIpLnRyaWdnZXIoImhpZGRlbi5icy4iICsgZS50eXBlKSwgYiAmJiBiKCkKICAgICAgICB9CiAgICAgICAgdmFyIGUgPSB0aGlzLAogICAgICAgICAgICBmID0gYSh0aGlzLiR0aXApLAogICAgICAgICAgICBnID0gYS5FdmVudCgiaGlkZS5icy4iICsgdGhpcy50eXBlKTsKICAgICAgICBpZiAodGhpcy4kZWxlbWVudC50cmlnZ2VyKGcpLCAhZy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuIGYucmVtb3ZlQ2xhc3MoImluIiksIGEuc3VwcG9ydC50cmFuc2l0aW9uICYmIGYuaGFzQ2xhc3MoImZhZGUiKSA/IGYub25lKCJic1RyYW5zaXRpb25FbmQiLCBkKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChjLlRSQU5TSVRJT05fRFVSQVRJT04pIDogZCgpLCB0aGlzLmhvdmVyU3RhdGUgPSBudWxsLCB0aGlzCiAgICB9LCBjLnByb3RvdHlwZS5maXhUaXRsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpcy4kZWxlbWVudDsKICAgICAgICAoYS5hdHRyKCJ0aXRsZSIpIHx8ICJzdHJpbmciICE9IHR5cGVvZiBhLmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiKSkgJiYgYS5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIiwgYS5hdHRyKCJ0aXRsZSIpIHx8ICIiKS5hdHRyKCJ0aXRsZSIsICIiKQogICAgfSwgYy5wcm90b3R5cGUuaGFzQ29udGVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkKICAgIH0sIGMucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oYikgewogICAgICAgIGIgPSBiIHx8IHRoaXMuJGVsZW1lbnQ7CiAgICAgICAgdmFyIGMgPSBiWzBdLAogICAgICAgICAgICBkID0gIkJPRFkiID09IGMudGFnTmFtZSwKICAgICAgICAgICAgZSA9IGMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgbnVsbCA9PSBlLndpZHRoICYmIChlID0gYS5leHRlbmQoe30sIGUsIHsKICAgICAgICAgICAgd2lkdGg6IGUucmlnaHQgLSBlLmxlZnQsCiAgICAgICAgICAgIGhlaWdodDogZS5ib3R0b20gLSBlLnRvcAogICAgICAgIH0pKTsKICAgICAgICB2YXIgZiA9IHdpbmRvdy5TVkdFbGVtZW50ICYmIGMgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCwKICAgICAgICAgICAgZyA9IGQgPyB7CiAgICAgICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgICAgICBsZWZ0OiAwCiAgICAgICAgICAgIH0gOiBmID8gbnVsbCA6IGIub2Zmc2V0KCksCiAgICAgICAgICAgIGggPSB7CiAgICAgICAgICAgICAgICBzY3JvbGw6IGQgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIDogYi5zY3JvbGxUb3AoKQogICAgICAgICAgICB9LAogICAgICAgICAgICBpID0gZCA/IHsKICAgICAgICAgICAgICAgIHdpZHRoOiBhKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgIGhlaWdodDogYSh3aW5kb3cpLmhlaWdodCgpCiAgICAgICAgICAgIH0gOiBudWxsOwogICAgICAgIHJldHVybiBhLmV4dGVuZCh7fSwgZSwgaCwgaSwgZykKICAgIH0sIGMucHJvdG90eXBlLmdldENhbGN1bGF0ZWRPZmZzZXQgPSBmdW5jdGlvbihhLCBiLCBjLCBkKSB7CiAgICAgICAgcmV0dXJuICJib3R0b20iID09IGEgPyB7CiAgICAgICAgICAgIHRvcDogYi50b3AgKyBiLmhlaWdodCwKICAgICAgICAgICAgbGVmdDogYi5sZWZ0ICsgYi53aWR0aCAvIDIgLSBjIC8gMgogICAgICAgIH0gOiAidG9wIiA9PSBhID8gewogICAgICAgICAgICB0b3A6IGIudG9wIC0gZCwKICAgICAgICAgICAgbGVmdDogYi5sZWZ0ICsgYi53aWR0aCAvIDIgLSBjIC8gMgogICAgICAgIH0gOiAibGVmdCIgPT0gYSA/IHsKICAgICAgICAgICAgdG9wOiBiLnRvcCArIGIuaGVpZ2h0IC8gMiAtIGQgLyAyLAogICAgICAgICAgICBsZWZ0OiBiLmxlZnQgLSBjCiAgICAgICAgfSA6IHsKICAgICAgICAgICAgdG9wOiBiLnRvcCArIGIuaGVpZ2h0IC8gMiAtIGQgLyAyLAogICAgICAgICAgICBsZWZ0OiBiLmxlZnQgKyBiLndpZHRoCiAgICAgICAgfQogICAgfSwgYy5wcm90b3R5cGUuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhID0gZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgICAgIHZhciBlID0gewogICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgIGxlZnQ6IDAKICAgICAgICB9OwogICAgICAgIGlmICghdGhpcy4kdmlld3BvcnQpIHJldHVybiBlOwogICAgICAgIHZhciBmID0gdGhpcy5vcHRpb25zLnZpZXdwb3J0ICYmIHRoaXMub3B0aW9ucy52aWV3cG9ydC5wYWRkaW5nIHx8IDAsCiAgICAgICAgICAgIGcgPSB0aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTsKICAgICAgICBpZiAoL3JpZ2h0fGxlZnQvLnRlc3QoYSkpIHsKICAgICAgICAgICAgdmFyIGggPSBiLnRvcCAtIGYgLSBnLnNjcm9sbCwKICAgICAgICAgICAgICAgIGkgPSBiLnRvcCArIGYgLSBnLnNjcm9sbCArIGQ7CiAgICAgICAgICAgIGggPCBnLnRvcCA/IGUudG9wID0gZy50b3AgLSBoIDogaSA+IGcudG9wICsgZy5oZWlnaHQgJiYgKGUudG9wID0gZy50b3AgKyBnLmhlaWdodCAtIGkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGogPSBiLmxlZnQgLSBmLAogICAgICAgICAgICAgICAgayA9IGIubGVmdCArIGYgKyBjOwogICAgICAgICAgICBqIDwgZy5sZWZ0ID8gZS5sZWZ0ID0gZy5sZWZ0IC0gaiA6IGsgPiBnLnJpZ2h0ICYmIChlLmxlZnQgPSBnLmxlZnQgKyBnLndpZHRoIC0gaykKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUKICAgIH0sIGMucHJvdG90eXBlLmdldFRpdGxlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEsIGIgPSB0aGlzLiRlbGVtZW50LAogICAgICAgICAgICBjID0gdGhpcy5vcHRpb25zOwogICAgICAgIHJldHVybiBhID0gYi5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIikgfHwgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGMudGl0bGUgPyBjLnRpdGxlLmNhbGwoYlswXSkgOiBjLnRpdGxlKQogICAgfSwgYy5wcm90b3R5cGUuZ2V0VUlEID0gZnVuY3Rpb24oYSkgewogICAgICAgIGRvIGEgKz0gfn4oMWU2ICogTWF0aC5yYW5kb20oKSk7IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7CiAgICAgICAgcmV0dXJuIGEKICAgIH0sIGMucHJvdG90eXBlLnRpcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy4kdGlwICYmICh0aGlzLiR0aXAgPSBhKHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksIDEgIT0gdGhpcy4kdGlwLmxlbmd0aCkpIHRocm93IG5ldyBFcnJvcih0aGlzLnR5cGUgKyAiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7CiAgICAgICAgcmV0dXJuIHRoaXMuJHRpcAogICAgfSwgYy5wcm90b3R5cGUuYXJyb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kYXJyb3cgPSB0aGlzLiRhcnJvdyB8fCB0aGlzLnRpcCgpLmZpbmQoIi50b29sdGlwLWFycm93IikKICAgIH0sIGMucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuZW5hYmxlZCA9ICEwCiAgICB9LCBjLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5lbmFibGVkID0gITEKICAgIH0sIGMucHJvdG90eXBlLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkCiAgICB9LCBjLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgdmFyIGMgPSB0aGlzOwogICAgICAgIGIgJiYgKGMgPSBhKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIiArIHRoaXMudHlwZSksIGMgfHwgKGMgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihiLmN1cnJlbnRUYXJnZXQsIHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLCBhKGIuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIiArIHRoaXMudHlwZSwgYykpKSwgYiA/IChjLmluU3RhdGUuY2xpY2sgPSAhYy5pblN0YXRlLmNsaWNrLCBjLmlzSW5TdGF0ZVRydWUoKSA/IGMuZW50ZXIoYykgOiBjLmxlYXZlKGMpKSA6IGMudGlwKCkuaGFzQ2xhc3MoImluIikgPyBjLmxlYXZlKGMpIDogYy5lbnRlcihjKQogICAgfSwgYy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpczsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KSwgdGhpcy5oaWRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBhLiRlbGVtZW50Lm9mZigiLiIgKyBhLnR5cGUpLnJlbW92ZURhdGEoImJzLiIgKyBhLnR5cGUpLCBhLiR0aXAgJiYgYS4kdGlwLmRldGFjaCgpLCBhLiR0aXAgPSBudWxsLCBhLiRhcnJvdyA9IG51bGwsIGEuJHZpZXdwb3J0ID0gbnVsbCwgYS4kZWxlbWVudCA9IG51bGwKICAgICAgICB9KQogICAgfTsKICAgIHZhciBkID0gYS5mbi50b29sdGlwOwogICAgYS5mbi50b29sdGlwID0gYiwgYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yID0gYywgYS5mbi50b29sdGlwLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYS5mbi50b29sdGlwID0gZCwgdGhpcwogICAgfQp9KGpRdWVyeSksICsgZnVuY3Rpb24oYSkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIGZ1bmN0aW9uIGIoYikgewogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkID0gYSh0aGlzKSwKICAgICAgICAgICAgICAgIGUgPSBkLmRhdGEoImJzLnBvcG92ZXIiKSwKICAgICAgICAgICAgICAgIGYgPSAib2JqZWN0IiA9PSB0eXBlb2YgYiAmJiBiOwogICAgICAgICAgICAhZSAmJiAvZGVzdHJveXxoaWRlLy50ZXN0KGIpIHx8IChlIHx8IGQuZGF0YSgiYnMucG9wb3ZlciIsIGUgPSBuZXcgYyh0aGlzLCBmKSksICJzdHJpbmciID09IHR5cGVvZiBiICYmIGVbYl0oKSkKICAgICAgICB9KQogICAgfQogICAgdmFyIGMgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdGhpcy5pbml0KCJwb3BvdmVyIiwgYSwgYikKICAgIH07CiAgICBpZiAoIWEuZm4udG9vbHRpcCkgdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyJTIwcmVxdWlyZXMlMjB0b29sdGlwLmh0bWwiKTsKICAgIGMuVkVSU0lPTiA9ICIzLjMuNyIsIGMuREVGQVVMVFMgPSBhLmV4dGVuZCh7fSwgYS5mbi50b29sdGlwLkNvbnN0cnVjdG9yLkRFRkFVTFRTLCB7CiAgICAgICAgcGxhY2VtZW50OiAicmlnaHQiLAogICAgICAgIHRyaWdnZXI6ICJjbGljayIsCiAgICAgICAgY29udGVudDogIiIsCiAgICAgICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPSJwb3BvdmVyIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+PGgzIGNsYXNzPSJwb3BvdmVyLXRpdGxlIj48L2gzPjxkaXYgY2xhc3M9InBvcG92ZXItY29udGVudCI+PC9kaXY+PC9kaXY+JwogICAgfSksIGMucHJvdG90eXBlID0gYS5leHRlbmQoe30sIGEuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5wcm90b3R5cGUpLCBjLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGMsIGMucHJvdG90eXBlLmdldERlZmF1bHRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGMuREVGQVVMVFMKICAgIH0sIGMucHJvdG90eXBlLnNldENvbnRlbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMudGlwKCksCiAgICAgICAgICAgIGIgPSB0aGlzLmdldFRpdGxlKCksCiAgICAgICAgICAgIGMgPSB0aGlzLmdldENvbnRlbnQoKTsKICAgICAgICBhLmZpbmQoIi5wb3BvdmVyLXRpdGxlIilbdGhpcy5vcHRpb25zLmh0bWwgPyAiaHRtbCIgOiAidGV4dCJdKGIpLCBhLmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpW3RoaXMub3B0aW9ucy5odG1sID8gInN0cmluZyIgPT0gdHlwZW9mIGMgPyAiaHRtbCIgOiAiYXBwZW5kIiA6ICJ0ZXh0Il0oYyksIGEucmVtb3ZlQ2xhc3MoImZhZGUgdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0IGluIiksIGEuZmluZCgiLnBvcG92ZXItdGl0bGUiKS5odG1sKCkgfHwgYS5maW5kKCIucG9wb3Zlci10aXRsZSIpLmhpZGUoKQogICAgfSwgYy5wcm90b3R5cGUuaGFzQ29udGVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFRpdGxlKCkgfHwgdGhpcy5nZXRDb250ZW50KCkKICAgIH0sIGMucHJvdG90eXBlLmdldENvbnRlbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuJGVsZW1lbnQsCiAgICAgICAgICAgIGIgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgcmV0dXJuIGEuYXR0cigiZGF0YS1jb250ZW50IikgfHwgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGIuY29udGVudCA/IGIuY29udGVudC5jYWxsKGFbMF0pIDogYi5jb250ZW50KQogICAgfSwgYy5wcm90b3R5cGUuYXJyb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy4kYXJyb3cgPSB0aGlzLiRhcnJvdyB8fCB0aGlzLnRpcCgpLmZpbmQoIi5hcnJvdyIpCiAgICB9OwogICAgdmFyIGQgPSBhLmZuLnBvcG92ZXI7CiAgICBhLmZuLnBvcG92ZXIgPSBiLCBhLmZuLnBvcG92ZXIuQ29uc3RydWN0b3IgPSBjLCBhLmZuLnBvcG92ZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBhLmZuLnBvcG92ZXIgPSBkLCB0aGlzCiAgICB9Cn0oalF1ZXJ5KSwgKyBmdW5jdGlvbihhKSB7CiAgICAidXNlIHN0cmljdCI7CgogICAgZnVuY3Rpb24gYihjLCBkKSB7CiAgICAgICAgdGhpcy4kYm9keSA9IGEoZG9jdW1lbnQuYm9keSksIHRoaXMuJHNjcm9sbEVsZW1lbnQgPSBhKGEoYykuaXMoZG9jdW1lbnQuYm9keSkgPyB3aW5kb3cgOiBjKSwgdGhpcy5vcHRpb25zID0gYS5leHRlbmQoe30sIGIuREVGQVVMVFMsIGQpLCB0aGlzLnNlbGVjdG9yID0gKHRoaXMub3B0aW9ucy50YXJnZXQgfHwgIiIpICsgIiAubmF2IGxpID4gYSIsIHRoaXMub2Zmc2V0cyA9IFtdLCB0aGlzLnRhcmdldHMgPSBbXSwgdGhpcy5hY3RpdmVUYXJnZXQgPSBudWxsLCB0aGlzLnNjcm9sbEhlaWdodCA9IDAsIHRoaXMuJHNjcm9sbEVsZW1lbnQub24oInNjcm9sbC5icy5zY3JvbGxzcHkiLCBhLnByb3h5KHRoaXMucHJvY2VzcywgdGhpcykpLCB0aGlzLnJlZnJlc2goKSwgdGhpcy5wcm9jZXNzKCkKICAgIH0KCiAgICBmdW5jdGlvbiBjKGMpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgZCA9IGEodGhpcyksCiAgICAgICAgICAgICAgICBlID0gZC5kYXRhKCJicy5zY3JvbGxzcHkiKSwKICAgICAgICAgICAgICAgIGYgPSAib2JqZWN0IiA9PSB0eXBlb2YgYyAmJiBjOwogICAgICAgICAgICBlIHx8IGQuZGF0YSgiYnMuc2Nyb2xsc3B5IiwgZSA9IG5ldyBiKHRoaXMsIGYpKSwgInN0cmluZyIgPT0gdHlwZW9mIGMgJiYgZVtjXSgpCiAgICAgICAgfSkKICAgIH0KICAgIGIuVkVSU0lPTiA9ICIzLjMuNyIsIGIuREVGQVVMVFMgPSB7CiAgICAgICAgb2Zmc2V0OiAxMAogICAgfSwgYi5wcm90b3R5cGUuZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJHNjcm9sbEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0IHx8IE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KQogICAgfSwgYi5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBiID0gdGhpcywKICAgICAgICAgICAgYyA9ICJvZmZzZXQiLAogICAgICAgICAgICBkID0gMDsKICAgICAgICB0aGlzLm9mZnNldHMgPSBbXSwgdGhpcy50YXJnZXRzID0gW10sIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGhpcy5nZXRTY3JvbGxIZWlnaHQoKSwgYS5pc1dpbmRvdyh0aGlzLiRzY3JvbGxFbGVtZW50WzBdKSB8fCAoYyA9ICJwb3NpdGlvbiIsIGQgPSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpKSwgdGhpcy4kYm9keS5maW5kKHRoaXMuc2VsZWN0b3IpLm1hcChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGIgPSBhKHRoaXMpLAogICAgICAgICAgICAgICAgZSA9IGIuZGF0YSgidGFyZ2V0IikgfHwgYi5hdHRyKCJocmVmIiksCiAgICAgICAgICAgICAgICBmID0gL14jLi8udGVzdChlKSAmJiBhKGUpOwogICAgICAgICAgICByZXR1cm4gZiAmJiBmLmxlbmd0aCAmJiBmLmlzKCI6dmlzaWJsZSIpICYmIFsKICAgICAgICAgICAgICAgIFtmW2NdKCkudG9wICsgZCwgZV0KICAgICAgICAgICAgXSB8fCBudWxsCiAgICAgICAgfSkuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBhWzBdIC0gYlswXQogICAgICAgIH0pLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGIub2Zmc2V0cy5wdXNoKHRoaXNbMF0pLCBiLnRhcmdldHMucHVzaCh0aGlzWzFdKQogICAgICAgIH0pCiAgICB9LCBiLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEsIGIgPSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpICsgdGhpcy5vcHRpb25zLm9mZnNldCwKICAgICAgICAgICAgYyA9IHRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCksCiAgICAgICAgICAgIGQgPSB0aGlzLm9wdGlvbnMub2Zmc2V0ICsgYyAtIHRoaXMuJHNjcm9sbEVsZW1lbnQuaGVpZ2h0KCksCiAgICAgICAgICAgIGUgPSB0aGlzLm9mZnNldHMsCiAgICAgICAgICAgIGYgPSB0aGlzLnRhcmdldHMsCiAgICAgICAgICAgIGcgPSB0aGlzLmFjdGl2ZVRhcmdldDsKICAgICAgICBpZiAodGhpcy5zY3JvbGxIZWlnaHQgIT0gYyAmJiB0aGlzLnJlZnJlc2goKSwgYiA+PSBkKSByZXR1cm4gZyAhPSAoYSA9IGZbZi5sZW5ndGggLSAxXSkgJiYgdGhpcy5hY3RpdmF0ZShhKTsKICAgICAgICBpZiAoZyAmJiBiIDwgZVswXSkgcmV0dXJuIHRoaXMuYWN0aXZlVGFyZ2V0ID0gbnVsbCwgdGhpcy5jbGVhcigpOwogICAgICAgIGZvciAoYSA9IGUubGVuZ3RoOyBhLS07KSBnICE9IGZbYV0gJiYgYiA+PSBlW2FdICYmICh2b2lkIDAgPT09IGVbYSArIDFdIHx8IGIgPCBlW2EgKyAxXSkgJiYgdGhpcy5hY3RpdmF0ZShmW2FdKQogICAgfSwgYi5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbihiKSB7CiAgICAgICAgdGhpcy5hY3RpdmVUYXJnZXQgPSBiLCB0aGlzLmNsZWFyKCk7CiAgICAgICAgdmFyIGMgPSB0aGlzLnNlbGVjdG9yICsgJ1tkYXRhLXRhcmdldD0iJyArIGIgKyAnIl0sJyArIHRoaXMuc2VsZWN0b3IgKyAnW2hyZWY9IicgKyBiICsgJyJdJywKICAgICAgICAgICAgZCA9IGEoYykucGFyZW50cygibGkiKS5hZGRDbGFzcygiYWN0aXZlIik7CiAgICAgICAgZC5wYXJlbnQoIi5kcm9wZG93bi1tZW51IikubGVuZ3RoICYmIChkID0gZC5jbG9zZXN0KCJsaS5kcm9wZG93biIpLmFkZENsYXNzKCJhY3RpdmUiKSksIGQudHJpZ2dlcigiYWN0aXZhdGUuYnMuc2Nyb2xsc3B5IikKICAgIH0sIGIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgYSh0aGlzLnNlbGVjdG9yKS5wYXJlbnRzVW50aWwodGhpcy5vcHRpb25zLnRhcmdldCwgIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIikKICAgIH07CiAgICB2YXIgZCA9IGEuZm4uc2Nyb2xsc3B5OwogICAgYS5mbi5zY3JvbGxzcHkgPSBjLCBhLmZuLnNjcm9sbHNweS5Db25zdHJ1Y3RvciA9IGIsIGEuZm4uc2Nyb2xsc3B5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYS5mbi5zY3JvbGxzcHkgPSBkLCB0aGlzCiAgICB9LCBhKHdpbmRvdykub24oImxvYWQuYnMuc2Nyb2xsc3B5LmRhdGEtYXBpIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgYSgnW2RhdGEtc3B5PSJzY3JvbGwiXScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBiID0gYSh0aGlzKTsKICAgICAgICAgICAgYy5jYWxsKGIsIGIuZGF0YSgpKQogICAgICAgIH0pCiAgICB9KQp9KGpRdWVyeSksICsgZnVuY3Rpb24oYSkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIGZ1bmN0aW9uIGIoYikgewogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkID0gYSh0aGlzKSwKICAgICAgICAgICAgICAgIGUgPSBkLmRhdGEoImJzLnRhYiIpOwogICAgICAgICAgICBlIHx8IGQuZGF0YSgiYnMudGFiIiwgZSA9IG5ldyBjKHRoaXMpKSwgInN0cmluZyIgPT0gdHlwZW9mIGIgJiYgZVtiXSgpCiAgICAgICAgfSkKICAgIH0KICAgIHZhciBjID0gZnVuY3Rpb24oYikgewogICAgICAgIHRoaXMuZWxlbWVudCA9IGEoYikKICAgIH07CiAgICBjLlZFUlNJT04gPSAiMy4zLjciLCBjLlRSQU5TSVRJT05fRFVSQVRJT04gPSAxNTAsIGMucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYiA9IHRoaXMuZWxlbWVudCwKICAgICAgICAgICAgYyA9IGIuY2xvc2VzdCgidWw6bm90KC5kcm9wZG93bi1tZW51KSIpLAogICAgICAgICAgICBkID0gYi5kYXRhKCJ0YXJnZXQiKTsKICAgICAgICBpZiAoZCB8fCAoZCA9IGIuYXR0cigiaHJlZiIpLCBkID0gZCAmJiBkLnJlcGxhY2UoLy4qKD89I1teXHNdKiQpLywgIiIpKSwgIWIucGFyZW50KCJsaSIpLmhhc0NsYXNzKCJhY3RpdmUiKSkgewogICAgICAgICAgICB2YXIgZSA9IGMuZmluZCgiLmFjdGl2ZTpsYXN0IGEiKSwKICAgICAgICAgICAgICAgIGYgPSBhLkV2ZW50KCJoaWRlLmJzLnRhYiIsIHsKICAgICAgICAgICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBiWzBdCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgIGcgPSBhLkV2ZW50KCJzaG93LmJzLnRhYiIsIHsKICAgICAgICAgICAgICAgICAgICByZWxhdGVkVGFyZ2V0OiBlWzBdCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKGUudHJpZ2dlcihmKSwgYi50cmlnZ2VyKGcpLCAhZy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhZi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgdmFyIGggPSBhKGQpOwogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZShiLmNsb3Nlc3QoImxpIiksIGMpLCB0aGlzLmFjdGl2YXRlKGgsIGgucGFyZW50KCksIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGUudHJpZ2dlcih7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJoaWRkZW4uYnMudGFiIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogYlswXQogICAgICAgICAgICAgICAgICAgIH0pLCBiLnRyaWdnZXIoewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAic2hvd24uYnMudGFiIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogZVswXQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwgYy5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbihiLCBkLCBlKSB7CiAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgZy5yZW1vdmVDbGFzcygiYWN0aXZlIikuZmluZCgiPiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIikuZW5kKCkuZmluZCgnW2RhdGEtdG9nZ2xlPSJ0YWIiXScpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCAhMSksIGIuYWRkQ2xhc3MoImFjdGl2ZSIpLmZpbmQoJ1tkYXRhLXRvZ2dsZT0idGFiIl0nKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwgITApLCBoID8gKGJbMF0ub2Zmc2V0V2lkdGgsIGIuYWRkQ2xhc3MoImluIikpIDogYi5yZW1vdmVDbGFzcygiZmFkZSIpLCBiLnBhcmVudCgiLmRyb3Bkb3duLW1lbnUiKS5sZW5ndGggJiYgYi5jbG9zZXN0KCJsaS5kcm9wZG93biIpLmFkZENsYXNzKCJhY3RpdmUiKS5lbmQoKS5maW5kKCdbZGF0YS10b2dnbGU9InRhYiJdJykuYXR0cigiYXJpYS1leHBhbmRlZCIsICEwKSwgZSAmJiBlKCkKICAgICAgICB9CiAgICAgICAgdmFyIGcgPSBkLmZpbmQoIj4gLmFjdGl2ZSIpLAogICAgICAgICAgICBoID0gZSAmJiBhLnN1cHBvcnQudHJhbnNpdGlvbiAmJiAoZy5sZW5ndGggJiYgZy5oYXNDbGFzcygiZmFkZSIpIHx8ICEhZC5maW5kKCI+IC5mYWRlIikubGVuZ3RoKTsKICAgICAgICBnLmxlbmd0aCAmJiBoID8gZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsIGYpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMuVFJBTlNJVElPTl9EVVJBVElPTikgOiBmKCksIGcucmVtb3ZlQ2xhc3MoImluIikKICAgIH07CiAgICB2YXIgZCA9IGEuZm4udGFiOwogICAgYS5mbi50YWIgPSBiLCBhLmZuLnRhYi5Db25zdHJ1Y3RvciA9IGMsIGEuZm4udGFiLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYS5mbi50YWIgPSBkLCB0aGlzCiAgICB9OwogICAgdmFyIGUgPSBmdW5jdGlvbihjKSB7CiAgICAgICAgYy5wcmV2ZW50RGVmYXVsdCgpLCBiLmNhbGwoYSh0aGlzKSwgInNob3ciKQogICAgfTsKICAgIGEoZG9jdW1lbnQpLm9uKCJjbGljay5icy50YWIuZGF0YS1hcGkiLCAnW2RhdGEtdG9nZ2xlPSJ0YWIiXScsIGUpLm9uKCJjbGljay5icy50YWIuZGF0YS1hcGkiLCAnW2RhdGEtdG9nZ2xlPSJwaWxsIl0nLCBlKQp9KGpRdWVyeSksICsgZnVuY3Rpb24oYSkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIGZ1bmN0aW9uIGIoYikgewogICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkID0gYSh0aGlzKSwKICAgICAgICAgICAgICAgIGUgPSBkLmRhdGEoImJzLmFmZml4IiksCiAgICAgICAgICAgICAgICBmID0gIm9iamVjdCIgPT0gdHlwZW9mIGIgJiYgYjsKICAgICAgICAgICAgZSB8fCBkLmRhdGEoImJzLmFmZml4IiwgZSA9IG5ldyBjKHRoaXMsIGYpKSwgInN0cmluZyIgPT0gdHlwZW9mIGIgJiYgZVtiXSgpCiAgICAgICAgfSkKICAgIH0KICAgIHZhciBjID0gZnVuY3Rpb24oYiwgZCkgewogICAgICAgIHRoaXMub3B0aW9ucyA9IGEuZXh0ZW5kKHt9LCBjLkRFRkFVTFRTLCBkKSwgdGhpcy4kdGFyZ2V0ID0gYSh0aGlzLm9wdGlvbnMudGFyZ2V0KS5vbigic2Nyb2xsLmJzLmFmZml4LmRhdGEtYXBpIiwgYS5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sIHRoaXMpKS5vbigiY2xpY2suYnMuYWZmaXguZGF0YS1hcGkiLCBhLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AsIHRoaXMpKSwgdGhpcy4kZWxlbWVudCA9IGEoYiksIHRoaXMuYWZmaXhlZCA9IG51bGwsIHRoaXMudW5waW4gPSBudWxsLCB0aGlzLnBpbm5lZE9mZnNldCA9IG51bGwsIHRoaXMuY2hlY2tQb3NpdGlvbigpCiAgICB9OwogICAgYy5WRVJTSU9OID0gIjMuMy43IiwgYy5SRVNFVCA9ICJhZmZpeCBhZmZpeC10b3AgYWZmaXgtYm90dG9tIiwgYy5ERUZBVUxUUyA9IHsKICAgICAgICBvZmZzZXQ6IDAsCiAgICAgICAgdGFyZ2V0OiB3aW5kb3cKICAgIH0sIGMucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgICAgIHZhciBlID0gdGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpLAogICAgICAgICAgICBmID0gdGhpcy4kZWxlbWVudC5vZmZzZXQoKSwKICAgICAgICAgICAgZyA9IHRoaXMuJHRhcmdldC5oZWlnaHQoKTsKICAgICAgICBpZiAobnVsbCAhPSBjICYmICJ0b3AiID09IHRoaXMuYWZmaXhlZCkgcmV0dXJuIGUgPCBjICYmICJ0b3AiOwogICAgICAgIGlmICgiYm90dG9tIiA9PSB0aGlzLmFmZml4ZWQpIHJldHVybiBudWxsICE9IGMgPyAhKGUgKyB0aGlzLnVucGluIDw9IGYudG9wKSAmJiAiYm90dG9tIiA6ICEoZSArIGcgPD0gYSAtIGQpICYmICJib3R0b20iOwogICAgICAgIHZhciBoID0gbnVsbCA9PSB0aGlzLmFmZml4ZWQsCiAgICAgICAgICAgIGkgPSBoID8gZSA6IGYudG9wLAogICAgICAgICAgICBqID0gaCA/IGcgOiBiOwogICAgICAgIHJldHVybiBudWxsICE9IGMgJiYgZSA8PSBjID8gInRvcCIgOiBudWxsICE9IGQgJiYgaSArIGogPj0gYSAtIGQgJiYgImJvdHRvbSIKICAgIH0sIGMucHJvdG90eXBlLmdldFBpbm5lZE9mZnNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnBpbm5lZE9mZnNldCkgcmV0dXJuIHRoaXMucGlubmVkT2Zmc2V0OwogICAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoYy5SRVNFVCkuYWRkQ2xhc3MoImFmZml4Iik7CiAgICAgICAgdmFyIGEgPSB0aGlzLiR0YXJnZXQuc2Nyb2xsVG9wKCksCiAgICAgICAgICAgIGIgPSB0aGlzLiRlbGVtZW50Lm9mZnNldCgpOwogICAgICAgIHJldHVybiB0aGlzLnBpbm5lZE9mZnNldCA9IGIudG9wIC0gYQogICAgfSwgYy5wcm90b3R5cGUuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AgPSBmdW5jdGlvbigpIHsKICAgICAgICBzZXRUaW1lb3V0KGEucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLCB0aGlzKSwgMSkKICAgIH0sIGMucHJvdG90eXBlLmNoZWNrUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy4kZWxlbWVudC5pcygiOnZpc2libGUiKSkgewogICAgICAgICAgICB2YXIgYiA9IHRoaXMuJGVsZW1lbnQuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICBkID0gdGhpcy5vcHRpb25zLm9mZnNldCwKICAgICAgICAgICAgICAgIGUgPSBkLnRvcCwKICAgICAgICAgICAgICAgIGYgPSBkLmJvdHRvbSwKICAgICAgICAgICAgICAgIGcgPSBNYXRoLm1heChhKGRvY3VtZW50KS5oZWlnaHQoKSwgYShkb2N1bWVudC5ib2R5KS5oZWlnaHQoKSk7CiAgICAgICAgICAgICJvYmplY3QiICE9IHR5cGVvZiBkICYmIChmID0gZSA9IGQpLCAiZnVuY3Rpb24iID09IHR5cGVvZiBlICYmIChlID0gZC50b3AodGhpcy4kZWxlbWVudCkpLCAiZnVuY3Rpb24iID09IHR5cGVvZiBmICYmIChmID0gZC5ib3R0b20odGhpcy4kZWxlbWVudCkpOwogICAgICAgICAgICB2YXIgaCA9IHRoaXMuZ2V0U3RhdGUoZywgYiwgZSwgZik7CiAgICAgICAgICAgIGlmICh0aGlzLmFmZml4ZWQgIT0gaCkgewogICAgICAgICAgICAgICAgbnVsbCAhPSB0aGlzLnVucGluICYmIHRoaXMuJGVsZW1lbnQuY3NzKCJ0b3AiLCAiIik7CiAgICAgICAgICAgICAgICB2YXIgaSA9ICJhZmZpeCIgKyAoaCA/ICItIiArIGggOiAiIiksCiAgICAgICAgICAgICAgICAgICAgaiA9IGEuRXZlbnQoaSArICIuYnMuYWZmaXgiKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLiRlbGVtZW50LnRyaWdnZXIoaiksIGouaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVybjsKICAgICAgICAgICAgICAgIHRoaXMuYWZmaXhlZCA9IGgsIHRoaXMudW5waW4gPSAiYm90dG9tIiA9PSBoID8gdGhpcy5nZXRQaW5uZWRPZmZzZXQoKSA6IG51bGwsIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoYy5SRVNFVCkuYWRkQ2xhc3MoaSkudHJpZ2dlcihpLnJlcGxhY2UoImFmZml4IiwgImFmZml4ZWQiKSArICIuYnMuYWZmaXgiKQogICAgICAgICAgICB9CiAgICAgICAgICAgICJib3R0b20iID09IGggJiYgdGhpcy4kZWxlbWVudC5vZmZzZXQoewogICAgICAgICAgICAgICAgdG9wOiBnIC0gYiAtIGYKICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9OwogICAgdmFyIGQgPSBhLmZuLmFmZml4OwogICAgYS5mbi5hZmZpeCA9IGIsIGEuZm4uYWZmaXguQ29uc3RydWN0b3IgPSBjLCBhLmZuLmFmZml4Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYS5mbi5hZmZpeCA9IGQsIHRoaXMKICAgIH0sIGEod2luZG93KS5vbigibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIGEoJ1tkYXRhLXNweT0iYWZmaXgiXScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBjID0gYSh0aGlzKSwKICAgICAgICAgICAgICAgIGQgPSBjLmRhdGEoKTsKICAgICAgICAgICAgZC5vZmZzZXQgPSBkLm9mZnNldCB8fCB7fSwgbnVsbCAhPSBkLm9mZnNldEJvdHRvbSAmJiAoZC5vZmZzZXQuYm90dG9tID0gZC5vZmZzZXRCb3R0b20pLCBudWxsICE9IGQub2Zmc2V0VG9wICYmIChkLm9mZnNldC50b3AgPSBkLm9mZnNldFRvcCksIGIuY2FsbChjLCBkKQogICAgICAgIH0pCiAgICB9KQp9KGpRdWVyeSk7"}},"time_used":424,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":424,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/1.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.518Z","timestamp":1785147795518,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/1.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:26 GMT\r\naccept-ranges: bytes\r\ncontent-length: 3454\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":3454,"size_decoded":3928,"mime_type":"image/png","magic":"PNG image data, 52 x 52, 8-bit/color RGBA, non-interlaced","md5":"e4f816f34f01c9cbe5aafdbdb489ee79","sha1":"81e1535cf307a77e1f02a5c5fed0ca13610f388b","sha256":"c08074d0f5675f40774b5d443ac28a7a99dec53dd765f56f26516723bc5ae7a9","sha512":"61b74ba9aa6bb39f87aeed9a8d8ae4385c63652d87dc343e9b7c60bad62870a536dfd869f140714a452f1206353dc0f5875b6edd7f59b0750a47057b7c0ef445","ssdeep":"","tlshash":"a0616d4317c236959e629921633cdfdd93722b4b7568834faf3ee162f90271a60d3029","first_seen":"2025-05-31T01:51:37.486861Z","last_seen":"2026-08-11T00:25:55.168791Z","times_seen":24,"resource_available":false,"data":"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"}},"time_used":513,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":508,"receive":5,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/4.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.523Z","timestamp":1785147795523,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/4.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1862\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1862,"size_decoded":2336,"mime_type":"image/png","magic":"PNG image data, 50 x 50, 8-bit colormap, non-interlaced","md5":"795212eff3adf6cb5d53fb6c45b4dfd7","sha1":"df3ce26bd3202d3a6bce345a83228fa32d4aec4b","sha256":"8886c555e61ee7ca55ddabddf78eb6d4669fd465bc6b6d35fb5280043b58a462","sha512":"fdaa17f44174e5fd45aff528fe639c30bdb8989db2bfafcf1d372c875daa01643378d5d46755c90415e36b3e47bb4b21de0e2259d9783441a3a1df9ce0e76a56","ssdeep":"","tlshash":"9531a51ed2150c36294f057e6da62d1edad96d5f84582329617ccba80a19b812f61c0d","first_seen":"2025-05-31T01:51:37.423069Z","last_seen":"2026-08-11T00:25:55.219338Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":516,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":514,"receive":2,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/features/3.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.527Z","timestamp":1785147795527,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/features/3.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:28 GMT\r\naccept-ranges: bytes\r\ncontent-length: 20919\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":20919,"size_decoded":21394,"mime_type":"image/png","magic":"PNG image data, 423 x 338, 8-bit/color RGBA, non-interlaced","md5":"47464118f3edb7a0eb3ee50688f3baea","sha1":"e65b7651841b4ad88751040d1eaf8192adb2e663","sha256":"eebf9fc8b6bb933411049d8d07461a0e75689ebdddf0f626d545f019e7bee032","sha512":"d1828e552541df13b4060f42189a414fa6928f805473ac0aeef7118fe9ff2c37b29eabfb96f0b039a2b053ec761b49e1a8cb78e8d008131d1d550aaf7ee3c9aa","ssdeep":"384:40tXjA2bXuQn/BEli3Qufu2iIJKjfqjylHLleARqzI0dU1lfFq3u8sXV:7TAY+Qnt9f8I+fqjSLleAR2dUXfE3u8k","tlshash":"7a92e1d988aaf8b0b8065e01d16b218fc317d9ab753f4ad8e7b04173c384239d36994f","first_seen":"2025-05-31T01:51:37.462125Z","last_seen":"2026-08-11T00:25:55.284623Z","times_seen":25,"resource_available":false,"data":"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"}},"time_used":597,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":318,"receive":279,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/9.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.543Z","timestamp":1785147795543,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/9.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:34 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1618\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1618,"size_decoded":2092,"mime_type":"image/png","magic":"PNG image data, 50 x 48, 8-bit colormap, non-interlaced","md5":"b00b3e3e28023b0b8aaffe912c8a118a","sha1":"de167b07fc0123e2eac44b8453177933fbb496bb","sha256":"1d5b61988821757133fdbf6e1f94e4fe58d8c056dbfac83a4c98edff235261f8","sha512":"dc46f537dbbdda35420a78b2733f8c32acf6d1c3802d4a05877429681cafc5b7248785806f9aef21ab9269624144a591e2dc5ed095e14f9ab7d7351714467c0b","ssdeep":"","tlshash":"f031b5d325808f3b893514a262f74134e4834e6b23ad81271f323bf14ab719c444e12d","first_seen":"2025-05-31T01:51:37.412453Z","last_seen":"2026-08-11T00:25:55.252957Z","times_seen":28,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAADIAAAAwCAMAAABkKdmIAAACTFBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+o4BUNAAAAw3RSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHR4hIyQnKCkqLC0uMDIzNDY3ODo7PD0+P0BBQkNERkdMTU5PUVJTVFVWV1hZWltdXl9gYWJjZGZnaWxtbm9wcXJ0dnd4ent9fn+AgYKDhIWGh4iJioyNj5CRkpOUlpqcnp+ho6SmqaqrrK2ur7Gys7S3uLq7vL2+v8PHycrLzM7P0dPV19ja29zd3t/g4eLj5ebn6Onq6+3u7/Hz9PX29/j5+vv8/f7tuZo8AAAC8klEQVRIiZWV+TuUURTHj7FFhIihTZZkooVkpGRJUrI1FdkqRGWQkq1lUhIpU0Shkham1drYJsv5x7r3neV95513tu8P7znP+Z7Pc+89d565ADq5XBhcmFWmOoDN8h1ARgpHWwmHl6iT3FZEqidwWWwjcseAYLapK5LfvCuL8TUudrJIuSlyfHDhc0mFaurGJU6xjUUucptTNtBvHy4FtKfnYV8hxzrDIuGcsne53B8gLPvH/O7bsT24HgLsSd3G9UQPd5GSX+qvpC214rGyXbUub4KjmG4wJbNaYmwLh3D6gqgckjJ5+MnkrGhQ4GHWDn6+irjUupm7SOppfLJT1p9P8+LS/iSR89wM56rFuS2deRuNJ+VZhTWJ99NQLoJADc4oepvxgcF0rF6m23rmZ8w4No2UXduPV69A0SqGNib/xRSm7MIZ8qinMQOFD6X9OJwjauhSh3VsUi15kJr0j6YeIg0jfsRD4JgacdoN/Ct+V2bKtPMcI31Rxey1nOMze0ayqml0zXmPyEyCtmVeZpHFaD4TpAjUZaNrYiEEp4L5jEgXt+MACCL4M55c4pHGtgg+WoBlZhDEiQ8L5DvrzUNeY4hZRKdYY8Ln3ycQQsa/GdI5LzhVxtE9rBdE3vg0a7ST64gA1xXjZaOEEbKBjOu1RVJ3akad4CoGzCFUdYuCpyNSxQkjceYAoglhJNECMm0yMTob2Y4XZomVfC1SyqvPx4RKJHLT/kMSSYDu+El8r5fs7rwp4sVOzGmE5323ikDQW96OnawiIEpuU2r1ijG3WUG6aw0q9gM1LR2wgnClcvtIQ4YFZI1fPsi8TqUWEN65UbO1lYYmC0jYunE1D8pp6LKApJFsspE5+q1RklfBWWoOW0DqSKb/H/JepI9FPDWnLSAthoxIRX/KwYzrbg/iyri77EHgD3UT7ELeUTfXLuQpdSvtQhqsIDXkhXTWI0PMi7yPvJqrkZA2ZCIPpks8PF+gJyBxcmIvCdKu7gQwq/8vuNyTyV0cDQAAAABJRU5ErkJggg=="}},"time_used":348,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":345,"receive":3,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/meanmenu.min.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.269Z","timestamp":1785147795269,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/meanmenu.min.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 711\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":2613,"size_decoded":1247,"mime_type":"text/css","magic":"ASCII text, with very long lines (2408)","md5":"258dc9a657edfcfc99de35a8a2fbda98","sha1":"a92ea5d8fea718cd59a5f00ae9cc198a4b1e2060","sha256":"5fbd6c86593dc305bf8d2e188bfba4f236f3f02f3006e88d9e1466bcf3b6d691","sha512":"4350e84b9ddee483267d110933374dbe580b50098fe066fbf8e8623524fcec7c1b441d8cf074988fa0d1faa2246bad70bc305d1ef973e2c66e071511a26bacb2","ssdeep":"","tlshash":"2151dc62d6762028bffe8178e802d36d79f4a01fef0bc9a8aa7ce125c8853c971555c4","first_seen":"2023-04-14T10:55:10Z","last_seen":"2026-08-11T00:25:55.268012Z","times_seen":206,"resource_available":false,"data":"LyohICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJTWVhbk1lbnUgMi4wLjcKCS0tLS0tLS0tCgoJVG8gYmUgdXNlZCB3aXRoIGpxdWVyeS5tZWFubWVudS5qcyBieSBDaHJpcyBXaGFydG9uIChodHRwOi8vd3d3Lm1lYW50aGVtZXMuY29tL3BsdWdpbnMvbWVhbm1lbnUvKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi9hLm1lYW5tZW51LXJldmVhbHtkaXNwbGF5Om5vbmV9Lm1lYW4tY29udGFpbmVyIC5tZWFuLWJhcntmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojMGMxOTIzO3BhZGRpbmc6NHB4IDA7bWluLWhlaWdodDo0MnB4O3otaW5kZXg6OTk5OTk5fS5tZWFuLWNvbnRhaW5lciBhLm1lYW5tZW51LXJldmVhbHt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O3BhZGRpbmc6MTNweCAxM3B4IDExcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtjdXJzb3I6cG9pbnRlcjtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxNnB4O3RleHQtaW5kZW50Oi05OTk5ZW07bGluZS1oZWlnaHQ6MjJweDtmb250LXNpemU6MXB4O2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6QXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NzAwfS5tZWFuLWNvbnRhaW5lciBhLm1lYW5tZW51LXJldmVhbCBzcGFue2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZDojZmZmO2hlaWdodDozcHg7bWFyZ2luLXRvcDozcHh9Lm1lYW4tY29udGFpbmVyIC5tZWFuLW5hdntmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7YmFja2dyb3VuZDojMGMxOTIzO21hcmdpbi10b3A6NDRweH0ubWVhbi1jb250YWluZXIgLm1lYW4tbmF2IHVse3BhZGRpbmc6MDttYXJnaW46MDt3aWR0aDoxMDAlO2xpc3Qtc3R5bGUtdHlwZTpub25lfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGl7cG9zaXRpb246cmVsYXRpdmU7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgYXtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7d2lkdGg6OTAlO3BhZGRpbmc6MWVtIDUlO21hcmdpbjowO3RleHQtYWxpZ246bGVmdDtjb2xvcjojZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICMzODM4Mzg7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuNSk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgbGkgYXt3aWR0aDo4MCU7cGFkZGluZzoxZW0gMTAlO2JvcmRlci10b3A6MXB4IHNvbGlkICNmMWYxZjE7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMjUpO29wYWNpdHk6Ljc1O2ZpbHRlcjphbHBoYShvcGFjaXR5PTc1KTt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OnZpc2libGV9Lm1lYW4tY29udGFpbmVyIC5tZWFuLW5hdiB1bCBsaS5tZWFuLWxhc3QgYXtib3JkZXItYm90dG9tOjA7bWFyZ2luLWJvdHRvbTowfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgbGkgbGkgYXt3aWR0aDo3MCU7cGFkZGluZzoxZW0gMTUlfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgbGkgbGkgbGkgYXt3aWR0aDo2MCU7cGFkZGluZzoxZW0gMjAlfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgbGkgbGkgbGkgbGkgYXt3aWR0aDo1MCU7cGFkZGluZzoxZW0gMjUlfS5tZWFuLWNvbnRhaW5lciAubWVhbi1uYXYgdWwgbGkgYTpob3ZlcntiYWNrZ3JvdW5kOiMyNTI1MjU7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWVhbi1jb250YWluZXIgLm1lYW4tbmF2IHVsIGxpIGEubWVhbi1leHBhbmR7bWFyZ2luLXRvcDoxcHg7d2lkdGg6MjZweDtoZWlnaHQ6MzJweDtwYWRkaW5nOjEycHghaW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjA7ei1pbmRleDoyO2ZvbnQtd2VpZ2h0OjcwMDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpO2JvcmRlcjowIWltcG9ydGFudDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuNCkhaW1wb3J0YW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpIWltcG9ydGFudH0ubWVhbi1jb250YWluZXIgLm1lYW4tbmF2IHVsIGxpIGEubWVhbi1leHBhbmQ6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC45KX0ubWVhbi1jb250YWluZXIgLm1lYW4tcHVzaHtmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7cGFkZGluZzowO21hcmdpbjowO2NsZWFyOmJvdGh9Lm1lYW4tbmF2IC53cmFwcGVye3dpZHRoOjEwMCU7cGFkZGluZzowO21hcmdpbjowfS5tZWFuLWNvbnRhaW5lciAubWVhbi1iYXIsLm1lYW4tY29udGFpbmVyIC5tZWFuLWJhciAqey13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveH0ubWVhbi1yZW1vdmV7ZGlzcGxheTpub25lIWltcG9ydGFudH0K"}},"time_used":301,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":301,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/owl.carousel.min.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.274Z","timestamp":1785147795274,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/owl.carousel.min.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 1104\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":5849,"size_decoded":1641,"mime_type":"text/css","magic":"ASCII text, with very long lines (5849), with no line terminators","md5":"044c5746afb4b9c4abefef2df0d57167","sha1":"767890b76efc192cceaa98a243fb61082fbe1b68","sha256":"c5b5520e7ce00b15fd4c0c39d13ba45bf1e4b1936d0b5da7ef0faab188fe80cf","sha512":"669c963fd6ec035bd96addfff394f8a33791a09b236c9d499b47d8e8570800f6520081ecb29f583703597e02a6ef662851d4a09e68fdba87705ffe8d74727d2a","ssdeep":"48:egpq7TuS6H5MGv+dDOmrdXYSjlriq5W0eWFds68l9mgdb5hdfO5IyO:vb5Zmr1YSjlrLW0eWvyl9t4IyO","tlshash":"62c102a94186138c90ab874077c8fac90a5c85e3683359ef71cdbd49c745ada22bf74f","first_seen":"2025-06-25T11:59:30.694082Z","last_seen":"2026-08-11T00:25:55.160383Z","times_seen":21,"resource_available":false,"data":"Lm93bC1jYXJvdXNlbCAub3dsLXdyYXBwZXI6YWZ0ZXJ7Y29udGVudDoiLiI7ZGlzcGxheTpibG9jaztjbGVhcjpib3RoO3Zpc2liaWxpdHk6aGlkZGVuO2xpbmUtaGVpZ2h0OjA7aGVpZ2h0OjB9Lm93bC1jYXJvdXNlbHtkaXNwbGF5Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTstbXMtdG91Y2gtYWN0aW9uOnBhbi15fS5vd2wtY2Fyb3VzZWwgLm93bC13cmFwcGVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZX0ub3dsLWNhcm91c2VsIC5vd2wtd3JhcHBlci1vdXRlcntvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJX0ub3dsLWNhcm91c2VsIC5vd2wtd3JhcHBlci1vdXRlci5hdXRvSGVpZ2h0ey13ZWJraXQtdHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOmhlaWdodCA1MDBtcyBlYXNlLWluLW91dDstbXMtdHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgZWFzZS1pbi1vdXR9Lm93bC1jYXJvdXNlbCAub3dsLWl0ZW17ZmxvYXQ6bGVmdH0ub3dsLWNvbnRyb2xzIC5vd2wtYnV0dG9ucyBkaXYsLm93bC1jb250cm9scyAub3dsLXBhZ2V7Y3Vyc29yOnBvaW50ZXJ9Lm93bC1jb250cm9sc3std2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LWtodG1sLXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCl9LmdyYWJiaW5ne2N1cnNvcjp1cmwoZ3JhYmJpbmcucG5nKSA4IDgsbW92ZX0ub3dsLWNhcm91c2VsIC5vd2wtaXRlbSwub3dsLWNhcm91c2VsIC5vd2wtd3JhcHBlcnstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47LW1zLWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9Lm93bC10aGVtZSAub3dsLWNvbnRyb2xze21hcmdpbi10b3A6MTBweDt0ZXh0LWFsaWduOmNlbnRlcn0ub3dsLXRoZW1lIC5vd2wtY29udHJvbHMgLm93bC1idXR0b25zIGRpdntjb2xvcjojRkZGO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3pvb206MTsqZGlzcGxheTppbmxpbmU7bWFyZ2luOjVweDtwYWRkaW5nOjNweCAxMHB4O2ZvbnQtc2l6ZToxMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozMHB4Oy1tb3otYm9yZGVyLXJhZGl1czozMHB4O2JvcmRlci1yYWRpdXM6MzBweDtiYWNrZ3JvdW5kOiM4Njk3OTE7ZmlsdGVyOkFscGhhKE9wYWNpdHk9NTApO29wYWNpdHk6LjV9Lm93bC10aGVtZSAub3dsLWNvbnRyb2xzLmNsaWNrYWJsZSAub3dsLWJ1dHRvbnMgZGl2OmhvdmVye2ZpbHRlcjpBbHBoYShPcGFjaXR5PTEwMCk7b3BhY2l0eToxO3RleHQtZGVjb3JhdGlvbjpub25lfS5vd2wtdGhlbWUgLm93bC1jb250cm9scyAub3dsLXBhZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7em9vbToxOypkaXNwbGF5OmlubGluZX0ub3dsLXRoZW1lIC5vd2wtY29udHJvbHMgLm93bC1wYWdlIHNwYW57ZGlzcGxheTpibG9jazt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O21hcmdpbjo1cHggN3B4O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTUwKTtvcGFjaXR5Oi41Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoyMHB4Oy1tb3otYm9yZGVyLXJhZGl1czoyMHB4O2JvcmRlci1yYWRpdXM6MjBweDtiYWNrZ3JvdW5kOiM4Njk3OTF9Lm93bC10aGVtZSAub3dsLWNvbnRyb2xzIC5vd2wtcGFnZS5hY3RpdmUgc3Bhbiwub3dsLXRoZW1lIC5vd2wtY29udHJvbHMuY2xpY2thYmxlIC5vd2wtcGFnZTpob3ZlciBzcGFue2ZpbHRlcjpBbHBoYShPcGFjaXR5PTEwMCk7b3BhY2l0eToxfS5vd2wtdGhlbWUgLm93bC1jb250cm9scyAub3dsLXBhZ2Ugc3Bhbi5vd2wtbnVtYmVyc3toZWlnaHQ6YXV0bzt3aWR0aDphdXRvO2NvbG9yOiNGRkY7cGFkZGluZzoycHggMTBweDtmb250LXNpemU6MTJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MzBweDstbW96LWJvcmRlci1yYWRpdXM6MzBweDtib3JkZXItcmFkaXVzOjMwcHh9Lm93bC1pdGVtLmxvYWRpbmd7bWluLWhlaWdodDoxNTBweDtiYWNrZ3JvdW5kOnVybCguLi93ZWJzdHJvdC5jb20vaHRtbC9iaXRtb25leS9sYW5kaW5nX3BhZ2UvY3NzL0FqYXhMb2FkZXIuaHRtbCkgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXJ9Lm93bC1vcmlnaW57LXdlYmtpdC1wZXJzcGVjdGl2ZToxMjAwcHg7LXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW4teDo1MCU7LXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW4teTo1MCU7LW1vei1wZXJzcGVjdGl2ZToxMjAwcHg7LW1vei1wZXJzcGVjdGl2ZS1vcmlnaW4teDo1MCU7LW1vei1wZXJzcGVjdGl2ZS1vcmlnaW4teTo1MCU7cGVyc3BlY3RpdmU6MTIwMHB4fS5vd2wtZmFkZS1vdXR7ei1pbmRleDoxMDstd2Via2l0LWFuaW1hdGlvbjpmYWRlT3V0IC43cyBib3RoIGVhc2U7LW1vei1hbmltYXRpb246ZmFkZU91dCAuN3MgYm90aCBlYXNlO2FuaW1hdGlvbjpmYWRlT3V0IC43cyBib3RoIGVhc2V9Lm93bC1mYWRlLWluey13ZWJraXQtYW5pbWF0aW9uOmZhZGVJbiAuN3MgYm90aCBlYXNlOy1tb3otYW5pbWF0aW9uOmZhZGVJbiAuN3MgYm90aCBlYXNlO2FuaW1hdGlvbjpmYWRlSW4gLjdzIGJvdGggZWFzZX0ub3dsLWJhY2tTbGlkZS1vdXR7LXdlYmtpdC1hbmltYXRpb246YmFja1NsaWRlT3V0IDFzIGJvdGggZWFzZTstbW96LWFuaW1hdGlvbjpiYWNrU2xpZGVPdXQgMXMgYm90aCBlYXNlO2FuaW1hdGlvbjpiYWNrU2xpZGVPdXQgMXMgYm90aCBlYXNlfS5vd2wtYmFja1NsaWRlLWluey13ZWJraXQtYW5pbWF0aW9uOmJhY2tTbGlkZUluIDFzIGJvdGggZWFzZTstbW96LWFuaW1hdGlvbjpiYWNrU2xpZGVJbiAxcyBib3RoIGVhc2U7YW5pbWF0aW9uOmJhY2tTbGlkZUluIDFzIGJvdGggZWFzZX0ub3dsLWdvRG93bi1vdXR7LXdlYmtpdC1hbmltYXRpb246c2NhbGVUb0ZhZGUgLjdzIGVhc2UgYm90aDstbW96LWFuaW1hdGlvbjpzY2FsZVRvRmFkZSAuN3MgZWFzZSBib3RoO2FuaW1hdGlvbjpzY2FsZVRvRmFkZSAuN3MgZWFzZSBib3RofS5vd2wtZ29Eb3duLWluey13ZWJraXQtYW5pbWF0aW9uOmdvRG93biAuNnMgZWFzZSBib3RoOy1tb3otYW5pbWF0aW9uOmdvRG93biAuNnMgZWFzZSBib3RoO2FuaW1hdGlvbjpnb0Rvd24gLjZzIGVhc2UgYm90aH0ub3dsLWZhZGVVcC1pbnstd2Via2l0LWFuaW1hdGlvbjpzY2FsZVVwRnJvbSAuNXMgZWFzZSBib3RoOy1tb3otYW5pbWF0aW9uOnNjYWxlVXBGcm9tIC41cyBlYXNlIGJvdGg7YW5pbWF0aW9uOnNjYWxlVXBGcm9tIC41cyBlYXNlIGJvdGh9Lm93bC1mYWRlVXAtb3V0ey13ZWJraXQtYW5pbWF0aW9uOnNjYWxlVXBUbyAuNXMgZWFzZSBib3RoOy1tb3otYW5pbWF0aW9uOnNjYWxlVXBUbyAuNXMgZWFzZSBib3RoO2FuaW1hdGlvbjpzY2FsZVVwVG8gLjVzIGVhc2UgYm90aH1ALXdlYmtpdC1rZXlmcmFtZXMgZW1wdHl7MCV7b3BhY2l0eToxfX1ALW1vei1rZXlmcmFtZXMgZW1wdHl7MCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGVtcHR5ezAle29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUAtbW96LWtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QC1tb3ota2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgYmFja1NsaWRlT3V0ezI1JXtvcGFjaXR5Oi41Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooLTUwMHB4KX0xMDAlLDc1JXtvcGFjaXR5Oi41Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooLTUwMHB4KSB0cmFuc2xhdGVYKC0yMDAlKX19QC1tb3ota2V5ZnJhbWVzIGJhY2tTbGlkZU91dHsyNSV7b3BhY2l0eTouNTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGVaKC01MDBweCl9MTAwJSw3NSV7b3BhY2l0eTouNTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGVaKC01MDBweCkgdHJhbnNsYXRlWCgtMjAwJSl9fUBrZXlmcmFtZXMgYmFja1NsaWRlT3V0ezI1JXtvcGFjaXR5Oi41O3RyYW5zZm9ybTp0cmFuc2xhdGVaKC01MDBweCl9MTAwJSw3NSV7b3BhY2l0eTouNTt0cmFuc2Zvcm06dHJhbnNsYXRlWigtNTAwcHgpIHRyYW5zbGF0ZVgoLTIwMCUpfX1ALXdlYmtpdC1rZXlmcmFtZXMgYmFja1NsaWRlSW57MCUsMjUle29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigtNTAwcHgpIHRyYW5zbGF0ZVgoMjAwJSl9NzUle29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigtNTAwcHgpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCkgdHJhbnNsYXRlWCgwKX19QC1tb3ota2V5ZnJhbWVzIGJhY2tTbGlkZUluezAlLDI1JXtvcGFjaXR5Oi41Oy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZVooLTUwMHB4KSB0cmFuc2xhdGVYKDIwMCUpfTc1JXtvcGFjaXR5Oi41Oy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZVooLTUwMHB4KX0xMDAle29wYWNpdHk6MTstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApIHRyYW5zbGF0ZVgoMCl9fUBrZXlmcmFtZXMgYmFja1NsaWRlSW57MCUsMjUle29wYWNpdHk6LjU7dHJhbnNmb3JtOnRyYW5zbGF0ZVooLTUwMHB4KSB0cmFuc2xhdGVYKDIwMCUpfTc1JXtvcGFjaXR5Oi41O3RyYW5zZm9ybTp0cmFuc2xhdGVaKC01MDBweCl9MTAwJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCkgdHJhbnNsYXRlWCgwKX19QC13ZWJraXQta2V5ZnJhbWVzIHNjYWxlVG9GYWRle3Rve29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOCl9fUAtbW96LWtleWZyYW1lcyBzY2FsZVRvRmFkZXt0b3tvcGFjaXR5OjA7LW1vei10cmFuc2Zvcm06c2NhbGUoLjgpfX1Aa2V5ZnJhbWVzIHNjYWxlVG9GYWRle3Rve29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjgpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZ29Eb3due2Zyb217LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9fUAtbW96LWtleWZyYW1lcyBnb0Rvd257ZnJvbXstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKX19QGtleWZyYW1lcyBnb0Rvd257ZnJvbXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9fUAtd2Via2l0LWtleWZyYW1lcyBzY2FsZVVwRnJvbXtmcm9te29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjUpfX1ALW1vei1rZXlmcmFtZXMgc2NhbGVVcEZyb217ZnJvbXtvcGFjaXR5OjA7LW1vei10cmFuc2Zvcm06c2NhbGUoMS41KX19QGtleWZyYW1lcyBzY2FsZVVwRnJvbXtmcm9te29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoMS41KX19QC13ZWJraXQta2V5ZnJhbWVzIHNjYWxlVXBUb3t0b3tvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS41KX19QC1tb3ota2V5ZnJhbWVzIHNjYWxlVXBUb3t0b3tvcGFjaXR5OjA7LW1vei10cmFuc2Zvcm06c2NhbGUoMS41KX19QGtleWZyYW1lcyBzY2FsZVVwVG97dG97b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgxLjUpfX0="}},"time_used":297,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":297,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/flaticon.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.275Z","timestamp":1785147795275,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/flaticon.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 342\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":945,"size_decoded":878,"mime_type":"text/css","magic":"ASCII text","md5":"55f645d87373eb5c4736e85ef4c4aa6c","sha1":"75fe650982c3d16661d19994bf6f8cc94c613054","sha256":"a4bd642bca0ae430bef26a9139adb6ecd49864fb9950a15f95ff10b646113317","sha512":"139ebbe64496ee543285e510da0e72c9390343d81a30517ea874660436c55507fbac3dc3712d7432e44ee2b3df65bbdc46349345aaf652913cf0c7f87facb692","ssdeep":"","tlshash":"10113d5482a9251157021f4e12de2390ff0570267e80fc17a36c4d9acffacb887e4b1d","first_seen":"2025-06-25T11:59:30.676596Z","last_seen":"2026-07-27T10:24:01.512323Z","times_seen":12,"resource_available":false,"data":"CS8qCiAgCUZsYXRpY29uIGljb24gZm9udDogRmxhdGljb24KICAJQ3JlYXRpb24gZGF0ZTogMDcvMDIvMjAxOCAxNzoyMwogIAkqLwoKQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICJGbGF0aWNvbiI7CiAgc3JjOiB1cmwoIi4uL2ZvbnRzL2ZsYWN0aWNvbi9GbGF0aWNvbi5odG1sIik7CiAgc3JjOiB1cmwoIi4uL2ZvbnRzL2ZsYWN0aWNvbi9GbGF0aWNvbmQ0MWRkNDFkZDQxZC5odG1sPyNpZWZpeCIpIGZvcm1hdCgiZW1iZWRkZWQtb3BlbnR5cGUiKSwKICAgICAgIHVybCgiLi4vZm9udHMvZmxhY3RpY29uL0ZsYXRpY29uLTIuaHRtbCIpIGZvcm1hdCgid29mZiIpLAogICAgICAgdXJsKCIuLi9mb250cy9mbGFjdGljb24vRmxhdGljb24udHRmIikgZm9ybWF0KCJ0cnVldHlwZSIpLAogICAgICAgdXJsKCIuLi9mb250cy9mbGFjdGljb24vRmxhdGljb24uc3ZnI0ZsYXRpY29uIikgZm9ybWF0KCJzdmciKTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKQG1lZGlhIHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzowKSB7CiAgQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogIkZsYXRpY29uIjsKICAgIHNyYzogdXJsKCIuLi9mb250cy9mbGFjdGljb24vRmxhdGljb24uc3ZnI0ZsYXRpY29uIikgZm9ybWF0KCJzdmciKTsKICB9Cn0KCltjbGFzc149ImZsYXRpY29uLSJdOmJlZm9yZSwgW2NsYXNzKj0iIGZsYXRpY29uLSJdOmJlZm9yZSwKW2NsYXNzXj0iZmxhdGljb24tIl06YWZ0ZXIsIFtjbGFzcyo9IiBmbGF0aWNvbi0iXTphZnRlciB7ICAgCiAgZm9udC1mYW1pbHk6IEZsYXRpY29uOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLmZsYXRpY29uLWFwcHM6YmVmb3JlIHsgY29udGVudDogIlxmMTAwIjsgfQouZmxhdGljb24tbWVudTpiZWZvcmUgeyBjb250ZW50OiAiXGYxMDEiOyB9"}},"time_used":296,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":296,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/video-js.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.278Z","timestamp":1785147795278,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/video-js.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 15200\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":56414,"size_decoded":15738,"mime_type":"text/css","magic":"ASCII text, with very long lines (14763)","md5":"01fa42cd65791a0e7befeb5d46875641","sha1":"72284a471633436fe112e139f054193af77d8672","sha256":"dd4b455fd2212c70ff1a69a7d3bf1262817edc7abf45784f02053db300dc8abe","sha512":"9543ca8bb8a1144d3722d6f7da6cc6bb4005d48d12fac2974b55145a1668070970ad62bf6bff8c97b465ae04ccff38e6bf5f463648bd29682c3c21315b6c0065","ssdeep":"768:lsNiPtgGNaGQCMSlARDeZidT7jLaYE5lTgNaxbFFI:lciKntk2/LaYE5lTgNaxbFq","tlshash":"2e43c8b671648ae4113e8440eec29b521f3cf423d995e8dcab932a6ccfda24535723dd","first_seen":"2025-05-31T01:51:37.390647Z","last_seen":"2026-08-11T00:25:55.199987Z","times_seen":25,"resource_available":false,"data":"LnZpZGVvLWpzIC52anMtYmlnLXBsYXktYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsIC52anMtYnV0dG9uID4gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbW9kYWwtZGlhbG9nLCAudmpzLW1vZGFsLWRpYWxvZyAudmpzLW1vZGFsLWRpYWxvZy1jb250ZW50IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOyB9CgoudmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZqcy1idXR0b24gPiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIHNyYzogdXJsKCJodHRwOi8vd2Vic3Ryb3QuY29tL2h0bWwvYml0bW9uZXkvbGFuZGluZ19wYWdlL2ZvbnQvMi4xLjAvVmlkZW9KUy5lb3QjaWVmaXgiKSBmb3JtYXQoImVvdCIpOyB9CgpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBQkJJQUFzQUFBQUFHb1FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkhVMVZDQUFBQkNBQUFBRHNBQUFCVUlJc2xlazlUTHpJQUFBRkVBQUFBUGdBQUFGWlJpVjNSWTIxaGNBQUFBWVFBQUFEUUFBQURJam4wOThabmJIbG1BQUFDVkFBQUN2NEFBQkVJQXduU3cyaGxZV1FBQUExVUFBQUFLd0FBQURZU3kyaExhR2hsWVFBQURZQUFBQUFiQUFBQUpBNERCeUZvYlhSNEFBQU5uQUFBQUE4QUFBQ0U0QUFBQUd4dlkyRUFBQTJzQUFBQVJBQUFBRVE5TkVIR2JXRjRjQUFBRGZBQUFBQWZBQUFBSUFFeUFJRnVZVzFsQUFBT0VBQUFBU1VBQUFJSzFjZjFvSEJ2YzNRQUFBODRBQUFCRHdBQUFaNUFBbC8wZUp4allHUmdZT0JpTUdDd1kyQnljZk1KWWVETFNTekpZNUJpWUdHQUFKQThNcHN4SnpNOWtZRUR4Z1BLc1lCcERpQm1nNGdDQUNZN0JVZ0FlSnhqWUdRN3hUaUJnWldCZ2FXUTVSa0RBOE12Q00wY3d4RE9lSTZCZ1ltQmxaa0JLd2hJYzAxaGNQakkrRkdCSGNSZHlBNFJaZ1FSQUM0SEN3RUFBSGljN2RGcHJzSWdBRVhoZzhVNjFYbWVXY0JiMUZ1UVA0dzdaUVhLNWJvTW0zeWNsRkRTQU5BSG11S3ZpQkJlQlBROHlteW84dzNqT2gvNXIydWk1bk42djhzWU5KYjNXTWRlV1J2TGppMERob3pLZHhNNnBzeVlzMkRKaWpVYnR1elljK0RJaVRNWHJ0eTRrOG9HTGIrbjB4Q2UzN2VrTTdaNjZqMURiVXkzbDZQcEhuTGZkTE81TmRTQm9RNE5kV1NvWTlPTjU0bWhkcWEveTFORG5SbnEzRkFYaHJvMDFKV2hyZzExWTZoYlE5MFo2dDVRRDRaNk5OU1RvWjROOVdLb1YwTzlHZXJkVUpPUlBxa2hUZDU0bkoxWURYQlUxUlYrNTc2L0pCczJiUFlQa3JEWnQ1dnNKcnY1M1YvSTVtY2xoR0RDVHdnR0JRUVNURWppNGhDa1lJQUdkNFRHSVdGQWhWMFJRVHBXbVFwMXh2NmhBNE9UT2xOcjJ6RkFOYkhVWWJxMk90TkNwVmlScXNrK2UrN2JUUUFoenRpOHZQZnVQZmZjYzg4OTU5enpuYmNNTVBqSEQvS0RER0VZMEFCcFlYMzg0Tmhsb21JWWxvNEpJU0dFWTltTWgyRlNpZFlpcWtFVXBodE5ZRFNZL2RYZzkwMjNsNERkeGxxVWwwY2h1WlJobmNKS3JzQ1FISXdjR3V3Zm5oTUl6Qm51SDRTeW0rMUQyemFHamhlWGxoWWZEMjM4ejgwbUtZTW12SjVYZU9UemQ4ejlldWpiTXhKTmh1NEM5eFBFL2JDTWlEdVNOSVdna1RRd0JFNTVoTFNBRTdad2hySExuQUhaT0dWL2ttQkdUaU5qWnh6STc3SGI3SHFqejY4VGpUNnZoKzVKVC9jQ0lrcVMwRDZDcVBmNWpYNFFqZHg1ajZ2bERmWk00YVpGZGJWWEl4dE9sSmFQL1dvdHRNbkg2Q0pRM2JUaXVlM1ByWTIzSGpuQ2h0dWFteHd2dnpGanhrUHJOajN6MHRHOVQ1NjFIRFlmNk9nbVJXdmxZM0pRSG9RYjhsdFYyWWV0N1lmV2N0RWpSMUF0eFMvY1NYNlU0YWxmNk5KRUJRN1lLZzl3clhRS2QwSWVaQ2IydXg3NVVoaDFVbitOeis5TFRPRTdQSzc3N25ONXhxZFRuZVRCaENieDQ0Nm1acmhuVWtyQ3oyWWhBOWRTTXhhRzBTWW1UOGhpOVpQdTFFOTRQSllRU0g2TFJtaHhlYzdRN1plWG50Z1F1VnBiaCthNHFXTnNja1Z5VGRuMFA3bzdEcGdQVzg0K3VSY3EwQklUZmxCaWtHZFVqQVo5d1lCVkkzbXRyTnZyOWtwZzFVc2FLNnQzNjkwYW9vckMxbGcwR3BNSDJIQU10a1pqc1NpNUlnOUVTVm9zT2g3R1FmTGpLTkx2S3BNS2tMU0tORkFrYTcxMEdkZ1NpOG9ETVNvTmhxamtLQlhUZ24zc3d0YXh5ekdrVXpJemFlOVJ0TGRXa1NsWjFLRFg2RXpnbGx6VjROVjRTb0RGU09HRDQrSENlUVVGOHdyWjVIczh6SWI1RWFWeHk4RFlGVGJNQ0pQbkxJV1p4dWdaRTJObGl2QzBnYzFxRVFVUjhqRUtnWmNBWGVIMThCaUNnbDVubEhoMENyakI0SGI1Zlg0Z2IwSjdjOVB1SFZzZmdreDJuL3ZUWS9KVjhrbjhQR3hmN2ZhT1o4cVg4SlZCeXVJZjR3aGs5c3FYbGkyaHZQSlY5aHJwMGhZN2w4cjJ4Mzd5ZGFWc2I0eHZYdi80N3YyTmpmQ2w4bTVvUkRKY2xGTW9FMXlrMFVoMVRlNC9tOGxGWGU5cUJaRDBFa2hlaWNlYlh2ekkyUExDdW9LQ3VrTHVoUEllS3dhSFBFb3V4dzNrTXFhSVVYRFExcDBtaXArTXlDT1JTQ1Fhb1VzblkxVlozOG5VVHJHMjFXdlZvNGYxT3NFSkZodlNmQUZ3R2ZUOFZIUk1lQVZVcHdMT29MempUL1JFSWozTzNGaHVVUkUrbkVSRiswcFRJZDVGeXh2NXNmd0d5ZzRPK215NHZadjBzWm03b2VRbEZaT1JpQit0RzBNd2VWTnJhZWl0bDd5eGlQSUhUazQvZGlWeHM5NG81bEVZaXNoQjJpQXRrY2hFbnNBY3RvRXB4NDRGbzhYbnNRTWFBMjJCbHFDMjBSbWhCS3pZb2paeVlheGcrSmdnTWM0SEhZMm0rTDlFa1dTWWxqaXJPaXNyTzdkM1Zvcnh6eVo2VmM0bEpxSVRBdTFiMndPQmRyTEVsQVArYkZjMmVHYVpGVmJrbUprdHY1dVQ2Smx6NUQvTW5CRm9yNmlnL0pQblJWaUJzVjNMTktHR3FCMUNoSjB0Z1F5d2xWTEZKSXVRZ1RGdHR3a2lLeGh5UWRBWk1kTVl0U2FvQWV3cWZ2WFZZUEFiRFQ2LzFtZXo4NVlTOEZTRHl3UTZOZkFuZWY2Rk5FR01pbG5wcHl2bjVyQjZ0VHlxMXBPY2VSV25wMldKRVpGWEhlWDVveW9lbTFuVFRnZHFjNGhlRFk3Yk9lS3o2M3ZueisvZFJ4K3MzMUh0MkpHYW5RNXNlaXJmV0pMOXRqb3pVLzEyVG5Fam41b3V4OU96VTNja0diQnpCd05PeWs2OUp5a0tIMG4vMExNOUE3MnR1d00zelFwSVJ1NEF4aVRvc2VFcGdQT21iUk95RmU5L1gyeWVVdm9Vc0N5RXZqY2dzN2ZwV1AzL2FLbEZOMCs2SEZVZTZEOUhGei9YUHdCbE45dFRxTnlaakZKOFVPMlJVVDUvaDRDcHRDY3RFeWVpc25PeVhqQUxFcDdkWEthUUtmNk83SU1uR2pOTkFDUk1MeHFkWUpYOGVNTHZtbWQ2OEQrYXlCTHlLS1lad1l4RHQvR05oekVUREowNVF4bHlpM3BpMy9aOTNuZFlWU3VtZ2owVi9La0lGbE82KzFLM2ZGMiszZzBxK1l0dVNJZjBidm1McVYwOW5ub2JJNmh3Y2pJUDhhUENLYXlqc0Y1SkJZM0xhS0FlUkxTeVlCMWg4MW9Ud2U5U2xQTWtYQjdHMG1mTDlxNzFnYXFxd1BxdTY3UVJLUzErT2JUeCtzYlF5OVFWMk9RSEVTY0drZEZCZVQ3djdxaXNxcXJzNk41Mmk3OC9SKzZTMHFRT05WajI2YWdPVm9zd0N5UVdJVjVEODZ2SDUzYnhOVWVYVjBLK1haYUh2L25tL0tzSGhPdnlsd3NXbkpYL0hFOGwvNFdDdjV4K2w1bjA4ejZVVThiVU1hM01CcFNtTTdGNjNBeG50ZEM5ZUJDS0VaVzlIcitBQk5xdHhnQVFyU2JNdG1yVzdsS1F1b1NnQmhTclRheldWVTJRQUtXWTh3aWl1aHFGbVFnV0pCZ29YaXVXSW00Mk43aHFaYkJzZ1h6NTJPNVA1dVN2YU5nRkduT3V2c1J3OEk4TGFoYTkxd012RHV4cVdGaGVONy84R1Z0VGx0ZFM4M0RRc1hSbXFjNVp0Y0pYRVZybFYyZG9UV2s1K1l1bm03MWRHNWY1NW0vcVkwTWpJOTN2djkvTmZweFhWOXNVWHJ4eTJmYk55MW9yNjVjT2xEUm5Pb0tGZWVYY2J3NDJIL2JORFQ1UXMzZmxnczMxZ1dDMWxEMW5mVVYvWDdOZENuU1VkSFkyZThhZnpmS3NxWjVabGpmRHFqTE9tazNVZWJOWEIrYUhBclBZRFJzKy9IRER4ZVQ1RGlQK3NGZzdPcFJhVlFNR0JWODlQcGVCZGoyMmhDRTBVdWIwVXF3THJOV3NHMGN1eWFkZ0xYVGVSNXJiTzQrM2MvdmwxNWN1cjJuUnErVFhDUURjUzNTTytzNmFrK2U1L2VNUysxZHczYnR1M1lHMnR2Rkw4WGRJWnZkamRXNlRPLzRCN0lkclpXVlBtY3RtNS81OUFnc1BJdFRTYkNpSUJyMk9xSUd6bXUyMFNNS0FTN3lxd0dCVWZHZmdqRFlsTExEZUYwU2ZjTEIyTFN4OGZsVCswOC9reno2eU9qOTZyZnQ0cnBUamRQUWNtTGQ0N3VLaWJiRHE3WlN6L1h0Ykgybk43MTdOZDYyclUrYzhJY2V2dnY3STA5d0E2V3ZqVmNhZmIrRnNiTkcrWlE4MFJuNlpac3ZyUDd0ZVAyZHpUZG9FVHZOaGpDbXNyOEZJRDJzSjY5Vll2ZFVjeGs0QXpZUmxLY2FFMzhlWE5SbGZXOUgxYXM5aTZhY0xIcDFYcHVOQjVLN0RJdmtYMDh5MVpZdmgzS2ZXYWlDekgrenRyU0RtRDdMdVg3M3gvbUplbEI4WWozOXQ4bmhOUUpKMkNBdGhwb0ZHTHNHZ3RTT0NKb29DR29hSkFNVGpTV0hWWjA4WUFhMUZnOWxQSTVVNkRPc0dWakRhc0plWlorWXloZkN3Zk96Q3hsQkE2OU05WExYdHphN0gvcmF2KzlUanE1eE5pMHdwS1FJUk5PNExyeno3eXA1UVZZTTZKZC9vYzFVdm4vbVFoaHVXaDZFTlhvUzJZVFo4UVQ0MmJGNWQvNTU5enA1cjBVZmYyVm5SMnRkZjIvV0NPZDJjTzBNdzZxcFdQbnZ4cFYwbnJ0NWZaZDJ5SXRjMTk5R1dlOHZsTmZORHErQ0gvN3lBQW5COWhuN1Q0UU80YzFnOVNjeHNaZ216bnRuRS9JREduZHRITXc2OWxGd29DbllzTUd4K3JCcDhKU0JxZEx6QnI5UVJQcS9QYmhXTVdGdFFacDF4Z3V5L2hhdzNURUhtM1RXQW54RldRUVdndDdNNU9WMGxDejFWUll1Y3BXbGl5N3o2WmQ0dXJ3UEl5ZVpRcWxpMkxnZzdzekpWMDlQeXNBVGJPUXRZSXJCMll6YmtKWWtHZ0owbTRBalBVYXAxcHZZdTFLOXFyOTd6MFlsM3AzMzJiMkxZQjc4bmNZSWxSa2F1LzhHT2JTc09sWmFuY0FDRTVkNWlseStjMis3aDVZajRscWhWbVhYQitpWExmdmRxU2dxZkt0UXZmSERWME9udlFSMXFodzQyWFMvdmt2c2gvaFhjckRGUDBhK1NKTklvbUVmRDFuc3JZR08rMWJnVE9KaE04SHY2ZWsrN3ZWZ2x4dVNSd29LbjE3UzkzN2JtNllKQ2VTU0cwT3Axbis3dEUzN3RjWi9wN2RzVHY0RVVyR3BEYld1ZUtpZ3NMSGhxVFZzb0VqK0pVMGthU2puajl0ejgvZ3J5UVd3SjlCY0pYQkMvN3NtTytJL0lGVVJKZXRGUHJkdDVXY29MNkRiRUpheWdJOENUSGZRVGpmNDBvZkQrRHdhbFRxSUFBSGljWTJCa1lHQUE0akM1dDIvaitXMitNbkN6TTREQXRUQys1Y2cwT3lOWW5JT0JDVVFCQUFjZUI5MEFlSnhqWUdSZ1lHY0FBUkQ1L3o4N0l3TWpBeXBRQkFBdGd3STRBSGljWTJCZ1lHQWZZQXdBT2tRQTRRQUFBQUFBQUE0QWFBQitBTXdBNEFFQ0FVSUJiQUdZQWNJQ0dBSllBclFDNEFNd0E3QUQzZ1F3QkpZRTNBVWtCV1lGaWdZZ0JtWUd0QWJxQjFnSUVnaFlDRzRJaEhpY1kyQmtZR0JRWkNobFlHY0FBU1lnNWdKQ0JvYi9ZRDREQUJmVEFiUUFlSnhka0UxcWcwQVlobDhUazlBSW9WRGFWU216YWhjRjg3UE1BUkxJTW9GQWwwWkhZMUJIZEJKSVQ5QVQ5QVE5UlE5UWVxeSt5dGVOTXpEemZNKzg4dzBLNEJZL2NOQU1CNk4yYlVhUFBCTHVreWJDTHZsZWVBQVBqOEpEK2hmaE1WN2hDM3U0d3hzN09PNE56UVNaY0kvOEx0d25md2k3NUUvaEFSN3dKVHlrL3hZZVk0OWZZUS9QenRNK2piVFo3TFk2T1dkQkpkWC9wcXM2TllXYSt6TXhhMTNvS3JBNlVvZXJxaS9Kd3RwWXhaWEoxY29VVm1lWlVXVmxUanEwL3RIYWNqbWR4dUw5ME9SOE8wVUVEWU1OZHRpU0VwejVYUUdxemxtMzBrelVkQVlGRk9iOFI3Tk9aazBxMmx3QXl6MWk3b0FyMXhvWHZyT2d0WWhaeDh3WTVLUlYyNjlKWjV5R3BtelBUalFodlk5amU2dkVFbFBPdUpQM21XS25QNU0zVitZQUFBQjRuRzJQeVhMQ01CQkUzWUNORFdFTDJmZms3bzhTOG9DbmtDVkhDNUMvanpCUWxVUDZJSFZQell5ZWtsNXkwaUw1WDUvb29ZOEJVbVFZSWtlQkVjYTR3Z1JUekRESEF0ZFk0Z2EzdU1NOUh2Q0lKenpqQmE5NHd6cys4SW12Wk5BcThUTStIcVZrS3hXbHJRaU94anVqUWtObEV6eU56bDZaL2NVMlhGMDZhdDdVODNWUXlrbExwRXZTbnV6c2IrSEFQblBmUVZnYXVwYTFKbHU0c1BMc0ZibGNpdGF6MGRIVTBaRjFxYXRqWjErYVRYWUNtcDZ1MGdTdldOUHlITHRGWitaZVhXVlNhRWtxczNUOFM3NFdrbGJHYk5OTnE0TEw0K0NXS3RaRHYyY2ZYOGw4YUZiS0ZoRW5KbkorSVVMRnBxd29Rbk5IbEhhVlF0UEJsK3lwbWJTV2RteUM2MUtTL0FLWkMzWStBQT09KSBmb3JtYXQoIndvZmYiKSwgdXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXR0ZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxBQUVBQUFBTEFJQUFBd0F3UjFOVlFpQ0xKWG9BQUFFNEFBQUFWRTlUTHpKUmlWM1JBQUFCakFBQUFGWmpiV0Z3T2ZUM3hnQUFBbWdBQUFNaVoyeDVaZ01KMHNNQUFBWFFBQUFSQ0dobFlXUVN5MmhMQUFBQTRBQUFBRFpvYUdWaERnTUhJUUFBQUx3QUFBQWthRzEwZU9BQUFBQUFBQUhrQUFBQWhHeHZZMkU5TkVIR0FBQUZqQUFBQUVSdFlYaHdBVElBZ1FBQUFSZ0FBQUFnYm1GdFpkWEg5YUFBQUJiWUFBQUNDbkJ2YzNSQUFsLzBBQUFZNUFBQUFaNEFBUUFBQndBQUFBQUFCd0FBQVAvL0J3RUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFDRUFBUUFBQUFFQUFGWWZUd2xmRHp6MUFBc0hBQUFBQUFEV1ZnNm5BQUFBQU5aV0RxY0FBQUFBQndFSEFBQUFBQWdBQWdBQUFBQUFBQUFCQUFBQUlRQjFBQWNBQUFBQUFBSUFBQUFLQUFvQUFBRC9BQUFBQUFBQUFBRUFBQUFLQURBQVBnQUNSRVpNVkFBT2JHRjBiZ0FhQUFRQUFBQUFBQUFBQVFBQUFBUUFBQUFBQUFBQUFRQUFBQUZzYVdkaEFBZ0FBQUFCQUFBQUFRQUVBQVFBQUFBQkFBZ0FBUUFHQUFBQUFRQUFBQUVHeWdHUUFBVUFBQVJ4Qk9ZQUFBRDZCSEVFNWdBQUExd0FWd0hPQUFBQ0FBVURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUZCbVJXUUFRUEVCOFNBSEFBQUFBS0VIQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFIQUFBQUJ3QUFBQWNBQUFBSEFBQUFCd0FBQUFjQUFBQUhBQUFBQndBQUFBY0FBQUFIQUFBQUJ3QUFBQWNBQUFBSEFBQUFCd0FBQUFjQUFBQUhBQUFBQndBQUFBY0FBQUFIQUFBQUJ3QUFBQWNBQUFBSEFBQUFCd0FBQUFjQUFBQUhBQUFBQndBQUFBY0FBQUFIQUFBQUJ3QUFBQWNBQUFBSEFBQUFCd0FBQUFBQUFBVUFBQUFEQUFBQUxBQUFBQVFBQUFHU0FBRUFBQUFBQUl3QUF3QUJBQUFBTEFBREFBb0FBQUdTQUFRQVlBQUFBQVFBQkFBQkFBRHhJUC8vQUFEeEFmLy9BQUFBQVFBRUFBQUFBUUFDQUFNQUJBQUZBQVlBQndBSUFBa0FDZ0FMQUF3QURRQU9BQThBRUFBUkFCSUFFd0FVQUJVQUZnQVhBQmdBR1FBYUFCc0FIQUFkQUI0QUh3QWdBQUFCQmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUFBQUFBR1FBQUFBQUFBQUFDQUFBUEVCQUFEeEFRQUFBQUVBQVBFQ0FBRHhBZ0FBQUFJQUFQRURBQUR4QXdBQUFBTUFBUEVFQUFEeEJBQUFBQVFBQVBFRkFBRHhCUUFBQUFVQUFQRUdBQUR4QmdBQUFBWUFBUEVIQUFEeEJ3QUFBQWNBQVBFSUFBRHhDQUFBQUFnQUFQRUpBQUR4Q1FBQUFBa0FBUEVLQUFEeENnQUFBQW9BQVBFTEFBRHhDd0FBQUFzQUFQRU1BQUR4REFBQUFBd0FBUEVOQUFEeERRQUFBQTBBQVBFT0FBRHhEZ0FBQUE0QUFQRVBBQUR4RHdBQUFBOEFBUEVRQUFEeEVBQUFBQkFBQVBFUkFBRHhFUUFBQUJFQUFQRVNBQUR4RWdBQUFCSUFBUEVUQUFEeEV3QUFBQk1BQVBFVUFBRHhGQUFBQUJRQUFQRVZBQUR4RlFBQUFCVUFBUEVXQUFEeEZnQUFBQllBQVBFWEFBRHhGd0FBQUJjQUFQRVlBQUR4R0FBQUFCZ0FBUEVaQUFEeEdRQUFBQmtBQVBFYUFBRHhHZ0FBQUJvQUFQRWJBQUR4R3dBQUFCc0FBUEVjQUFEeEhBQUFBQndBQVBFZEFBRHhIUUFBQUIwQUFQRWVBQUR4SGdBQUFCNEFBUEVmQUFEeEh3QUFBQjhBQVBFZ0FBRHhJQUFBQUNBQUFBQUFBQUFBRGdCb0FINEF6QURnQVFJQlFnRnNBWmdCd2dJWUFsZ0N0QUxnQXpBRHNBUGVCREFFbGdUY0JTUUZaZ1dLQmlBR1pnYTBCdW9IV0FnU0NGZ0liZ2lFQUFFQUFBQUFCWXNGaXdBQ0FBQUJFUUVDVlFNMkJZdjc2Z0lMQUFBREFBQUFBQVpyQm1zQUFnQWJBRFFBQUFrQ0V5SUhEZ0VIQmhBWEhnRVhGaUEzUGdFM05oQW5MZ0VuSmdNaUp5NEJKeVkwTno0Qk56WXlGeDRCRnhZVUJ3NEJCd1lDNndIQS9rQ1ZtSXVHemprN096bk9ob3NCTUl1R3pqazdPem5PaG91WWVXOXJwaTB2THkybWEyL3liMnVtTFM4dkxhWnJid0l3QVZBQlVBR2JPem5PaG92KzBJdUd6ams3T3puT2hvc0JNSXVHemprNytzQXZMYVpyYi9KdmE2WXRMeTh0cG10djhtOXJwaTB2QUFBQ0FBQUFBQVZBQllzQUF3QUhBQUFCSVJFcEFSRWhFUUhBQVN2KzFRSlZBU3NCZFFRVysrb0VGZ0FBQUFRQUFBQUFCaUVHSUFBSEFCY0FKd0FxQUFBQk5DY21KeFVYTmpjVUJ4YzJOVFFuTGdFbkZSNEJGeFlCQndFaEVTRUJFUUVHQnhVMk54YzNBUWNYQk5BME1sVzRBN3NwY1UxRlErNlZiS292TWZ1MFh3RmgvcDhCS3dGMUFUNVFXWmw2bVYvOVlKeWNBNEJoVWxBcXBiZ1lHR05pY1pLa25ZeUh2U0thSUpObGFRSXNYLzZmL2tEK2l3SDIvc0k5RzVvalpKaGZCSmFjbkFBQUFBRUFBQUFBQktzRjFnQUZBQUFCRVNFQkVRRUNDd0VxQVhiK2lnUmcva0QraXdTcS9vc0FBQUFDQUFBQUFBVm1CZFlBQ0FBT0FBQUJOQ2NtSnhFMk56WUJFU0VCRVFFRlpUUXlWRlF5TlB3UUFTc0JkZjZMQTRCaFVsQXEvYVlxVUZJQlFmNUEvb3NFcXY2TEFBTUFBQUFBQmlBR0R3QUZBQTRBSWdBQUV4RWhBUkVCQlRRbkppY1JOamMyQXhVZUFSY1dGQWNPQVFjVlBnRTNOaEFuTGdIZ0FTc0JkZjZMQXNVME1sVlZNalM3Yktvdk1URXZxbXlWN2tORlJVUHVCR0QrUVA2TEJLcitpK0JoVWxBcS9hWXFVRklDOEpvZ2syVnA2R2xsa3lDYUlyMkhqQUU2akllOUFBQUFCQUFBQUFBRml3V0xBQVVBQ3dBUkFCY0FBQUVqRVNFMUl3TXpOVE0xSVFFakZTRVJJd01WTXhVekVRSUxsZ0YyNEphVzRQNktBNERnQVhhVzRPQ1dBdXYraXBZQ0N1Q1cvSUNXQVhZQ29KYmdBWFlBQkFBQUFBQUZpd1dMQUFVQUN3QVJBQmNBQUFFekZUTVJJUk1qRlNFUkl3RXpOVE0xSVJNMUl4RWhOUUYxNEpiK2l1RGdBWGFXQWNDVzRQNktscFlCZGdKVjRBRjJBY0NXQVhiNzZ1Q1dBY0RnL29xV0FBQUFBQUlBQUFBQUJkWUYxZ0FUQUJjQUFBRWhJZzRCRlJFVUhnRXpJVEkrQVRVUk5DNEJBeUVSSVFWQS9JQXBSQ2dvUkNrRGdDbEVLQ2hFS2Z5QUE0QUYxU2hFS2Z5QUtVUW9LRVFwQTRBcFJDajc2d09BQUFZQUFBQUFCbXNHYXdBSUFBMEFGUUFlQUNNQUxBQUFDUUVtSXlJSEJnY0JKUzRCSndFRklRRTJOelkxTkFVQkJnY0dGUlFYSVFVZUFSY0JNd0VXTXpJM05qY0JBcjRCWkZKUWhIdDJZd0VTQTQ0ejdaLys3Z0xsL2RBQmVsMHpOZndTL3QxZE16VVBBakQ5NURQdG53RVNlUDdkVTArRWUzWmovdTREOEFKb0V5MHJVZjRuZDZQNlBQNG5TLzF6Wm4rRWowdExBZmhtZjRTUFMwcExvL284QWRuK0NCTXRLMUVCMlFBRkFBQUFBQVpyQmRZQUV3QVhBQnNBSHdBakFBQUJJU0lPQVJVUkZCNEJNeUV5UGdFMUVUUXVBUUVoRlNFQklUVWhCU0UxSVRVaE5TRUYxZnRXS1VVb0tFVXBCS29wUlNnb1Jmc3RBU3IrMWdMcS9SWUM2Z0hBL3RZQkt2MFdBdW9GMVNoRUtmeUFLVVFvS0VRcEE0QXBSQ2o5cTVYKzFaV1ZsWmFWQUFBQUFBTUFBQUFBQmlBRjFnQVRBQ3NBUXdBQUFTRWlEZ0VWRVJRZUFUTWhNajRCTlJFMExnRUJJelVqRlRNMU14VVVCaXNCSWlZMUVUUTJPd0V5RmhVRkl6VWpGVE0xTXhVVUJpc0JJaVkxRVRRMk93RXlGaFVGaS92cUtFVW9LRVVvQkJZb1JTZ29SZjJDY0pXVmNDc2Y0QjhzTEIvZ0h5c0NDM0NWbFhBc0grQWZLeXNmNEI4c0JkVW9SQ244Z0NsRUtDaEVLUU9BS1VRby9mWWw0Q1ZLSHl3c0h3RXFIeXdzSDBvbDRDVktIeXdzSHdFcUh5d3NId0FHQUFBQUFBWWdCUFlBQXdBSEFBc0FEd0FUQUJjQUFCTXpOU01STXpVakVUTTFJd0VoTlNFUklUVWhFUlVoTmVDVmxaV1ZsWlVCS3dRVisrc0VGZnZyQkJVRE5aYitRSlVCd0pYK1FKYitRSlVDVlpXVkFBQUFBUUFBQUFBR0lRWnNBREVBQUFFaUJnY0JOalFuQVI0Qk16SStBVFF1QVNJT0FSVVVGd0V1QVNNaURnRVVIZ0V6TWpZM0FRWVZGQjRCTWo0Qk5DNEJCVUFxU3g3OTdBY0hBZzhlVHlzOVp6dzhaM3BuUEFmOThSNVBLejFuUER4blBTdFBIZ0lVQmp0a2RtUTdPMlFDVHg0Y0FUY2JNaHNCTkIwZ1BHZDZaenc4WnowWkcvN05IQ0E4WjNwblBDQWMvc29aR0R0a09qcGtkbVE3QUFBQUFBSUFBQUFBQmxrR2F3QkRBRkFBQUFFMk5DYzNQZ0VuQXk0QkR3RW1Md0V1QVNNaElnWVBBUVlISnlZR0J3TUdGaDhCQmhRWEJ3NEJGeE1lQVQ4QkZoOEJIZ0V6SVRJMlB3RTJOeGNXTmpjVE5pWW5CU0l1QVRRK0FUSWVBUlFPQVFXckJRV2VDZ1lIbGdjYURMbzhRaHdERlE3KzFnNFZBaHhFT3JvTkdnZVZCd1VMblFVRm5Rc0ZCNVVIR2cyNk8wTWNBaFVPQVNvT0ZRSWNSRHE2RFJvSGxRY0ZDLzA0UjNoR1JuaU9lRVpHZUFNM0tqNHFld2tiREFFRERBa0ZTeTRieGc0U0VnN0dIQzFMQlFrTS92ME1Hd2w3S2o0cWV3a2JEUDc5REFrRlN5NGJ4ZzRTRWc3R0hDMUxCUWtNQVFNTUd3bEJSbmlPZUVaR2VJNTRSZ0FCQUFBQUFBWnJCbXNBR0FBQUV4UVhIZ0VYRmlBM1BnRTNOaEFuTGdFbkppQUhEZ0VIQnBVN09jNkdpd0V3aTRiT09UczdPYzZHaS83UWk0Yk9PVHNEZ0ppTGhzNDVPenM1em9hTEFUQ0xoczQ1T3pzNXpvYUxBQUFBQUFJQUFBQUFCbXNHYXdBWUFERUFBQUVpQnc0QkJ3WVFGeDRCRnhZZ056NEJOellRSnk0Qkp5WURJaWN1QVNjbU5EYytBVGMyTWhjZUFSY1dGQWNPQVFjR0E0Q1lpNGJPT1RzN09jNkdpd0V3aTRiT09UczdPYzZHaTVoNWIydW1MUzh2TGFacmIvSnZhNll0THk4dHBtdHZCbXM3T2M2R2kvN1FpNGJPT1RzN09jNkdpd0V3aTRiT09UdjZ3Qzh0cG10djhtOXJwaTB2THkybWEyL3liMnVtTFM4QUF3QUFBQUFHYXdackFCZ0FNUUErQUFBQklnY09BUWNHRUJjZUFSY1dJRGMrQVRjMkVDY3VBU2NtQXlJbkxnRW5KalEzUGdFM05qSVhIZ0VYRmhRSERnRUhCaE1VRGdFaUxnRTBQZ0V5SGdFRGdKaUtoczg1T3pzNXo0YUtBVENLaHM4NU96czV6NGFLbUhsdmE2WXRMeTh0cG10djhtOXJwaTB2THkybWEyOW5QR2Q2Wnp3OFozcG5QQVpyT3puUGhvciswSXFHenprN096blBob29CTUlxR3p6azcrc0F2TGFacmIvSnZhNll0THk4dHBtdHY4bTlycGkwdkFsVTlaenc4WjNwblBEeG5BQUFBQkFBQUFBQUdJQVloQUJNQUh3QXBBQzBBQUFFaElnNEJGUkVVSGdFeklUSStBVFVSTkM0QkFTTTFJeFVqRVRNVk16VTdBU0V5RmhVUkZBWWpJVGN6TlNNRmkvdnFLRVVvS0VVb0JCWW9SU2dvUmYyQ2NKVndjSlZ3bGdFcUh5d3NILzdXY0pXVkJpQW9SU2o3NmloRktDaEZLQVFXS0VVby9JQ1ZsUUhBdTdzc0gvN1dIeXh3NEFBQUFBQUNBQUFBQUFackJtc0FHQUFrQUFBQklnY09BUWNHRUJjZUFSY1dJRGMrQVRjMkVDY3VBU2NtRXdjSkFTY0pBVGNKQVJjQkE0Q1lpNGJPT1RzN09jNkdpd0V3aTRiT09UczdPYzZHaTkxcC92VCs5R2tCQy83MWFRRU1BUXhwL3ZVR2F6czV6b2FML3RDTGhzNDVPenM1em9hTEFUQ0xoczQ1Ty93SmFRRUwvdlZwQVF3QkRHbis5UUVMYWY3MEFBQUJBQUFBQUFYV0JyWUFKd0FBQVJFSkFSRXlGeFlYRmhRSEJnY0dJaWNtSnlZMUl4UVhIZ0VYRmpJM1BnRTNOalFuTGdFbkpnT0Evb3NCZFhwb1pqczlQVHRtYVBSb1pqczlsUzh0cFd0djlHOXJwUzB2THkybGEyOEZpd0VxL292K2l3RXFQVHRtYVBOcFpUdzlQVHhsYVhsNWIydW1MUzh2TGFacmIvTnZhNlV1THdBQkFBQUFBQVUvQndBQUZBQUFBUkVqSWdZZEFTRURJeEVoRVNNUk16VTBOak15QlQrZFZqd0JKU2YrL3M3Ly85Q3Rrd2IwL3ZoSVNMMysyUDBKQXZjQktOcTZ6UUFBQUFBRUFBQUFBQWFPQndBQU1BQkZBR0FBYkFBQUFSUWVBeFVVQndZRUl5SW1KeVkxTkRZM05pVXVBVFUwTndZaklpWTFORFkzUGdFeklRY2pIZ0VWRkE0REp6STJOelkxTkM0Q0l5SUdCd1lWRkI0REV6SStBalUwTGdFdkFTWXZBaVlqSWc0REZSUWVBZ0V6RlNNVkl6VWpOVE0xTXdNZlFGdGFRREJJL3VxZmhPVTVKVmxLZ3dFUklCOFZMaGFVeTBnL1RkTndBYUtLZzBwTU1VVkdNWkltVUJvMUlqOXFRQ3BSR1M4VUt6MVpOanByV3pjT0R4TWVDaHdsVGhBZ05XaHZVelpHY1gwRGE5WFZhZFRVYVFQa0pFVkRVSUJPV2xONmMxTmdQRWRSaWk1U0VpcEFLU1F4Qk1HVVVwbzJRa0JZUDR4YVNITkhPMEErSVJzNVpqcUdmVkluSVR0bExtZG5ValQ4bHhvMFhqNFpNQ1FZSXdzWEhUZ0NEaVE0WFR0R2F6c2RBMnhzMjl0czJRQURBQUFBQUFhQUJtd0FBd0FPQUNvQUFBRVJJUkVCRmdZckFTSW1ORFl5RmdFUklSRTBKaU1pQmdjR0ZSRWhFaEF2QVNFVkl6NERNeklXQWQzK3RnRmZBV2RVQWxKa1o2WmtCSS8rdDFGV1AxVVZDLzYzQWdFQkFVa0NGQ3BIWnorcjBBU1AvQ0VEM3dFeVNXSmlrMkZoL04zOXlBSVNhWGRGTXg0ei9kY0Jqd0h3TURDUUlEQTRIK01BQUFFQUFBQUFCcFFHQUFBeEFBQUJCZ2NXRlJRQ0RnRUVJeUFuRmpNeU55NEJKeFl6TWpjdUFUMEJGaGN1QVRVME54WUVGeVkxTkRZek1oYzJOd1lITmdhVVExOEJUSnZXL3RLcy92SGhJeXZoc0dtbUh5RWNLeXB3azBST1FrNHNlUUZieGdpOWhveGdiV0FsYVYwRmFHSkZEaHlDL3YzdXQyMlJCSW9DZldFRkN4ZXhkUVFtQXl5T1UxaExsYk1LSmlTR3ZXWVZPWE0vQ2dBQUFBRUFBQUFBQllBSEFBQWlBQUFCRnc0QkJ3WXVBelVSSXpVK0JEYytBVHNCRVNFVklSRVVIZ0kzTmdVd1VCZXdXV2l0Y0U0aHFFaHlSREFVQlFFSEJQUUJUZjZ5RFNCRE1FNEJ6KzBqUGdFQ09GeDRlRG9DSU5jYVYxMXZWeTBGQi81WS9QMzZIalExSGdFQ0FBRUFBQUFBQm9BR2dBQktBQUFCRkFJRUl5SW5OajhCSGdFek1qNEJOVFF1QVNNaURnTVZGQllYRmo4Qk5qYzJKeVkxTkRZek1oWVZGQVlqSWlZM1BnSTFOQ1lqSWdZVkZCY0RCaGNtQWpVMEVpUWdCQklHZ003K245RnZhenNUTmhScVBYbSthSGZpam1tMmYxc3JVRTBlQ0FnR0FnWVJNOUdwbDZtSmF6MUtEZ2dsRnpZeVBsWVpZeEVFenY3T0FXRUJvZ0ZoemdPQTBmNmZ6aUJkUjlNbk9ZbndsbkxJZmpwZ2ZZWkRhSjRnRENBZkdBWVhGRDFhbDlta2c2cnVWejBqZFZrZk1rSnlWVWt4L2w1R2Exc0JmT25SQVdIT3p2NmZBQUFIQUFBQUFBY0JCTThBRndBaEFEZ0FUd0JtQUhFQWRBQUFBUkV6TmhjV0Z4WVhGaGNXQnc0QkJ3WUhCaWNtTHdFbU54WTJOell1QVFjUkZBVVdOelkvQVRZM05qVTJKeU1HRnhZZkFSWVhGaGNVRnhZM05qOEJOamMyTnpZbkl3WVhGaDhCRmhjV0ZSWVhGamMyUHdFMk56WTNOaWNqQmhjV0h3RVdGeFlWRmdVelB3RVZNeEVqQmdzQkFSVW5BeHdjYUM1TU5EMHNUU3N2Q2dkVlJFZFROV2cxS2dFQ3ExSnJDUWN3WWtBQmZob1NDeEFLSkJRWEFYNGRBUU1DQmdNbkZ4c0JKQm9TQ3hBS0pCUVdBUUYrSGdFRUFnVUVKeGNiQVNNWkV3c1FDaVFVRmdFQmZoNEJCQUlGQkNjWEd3SDVRKzVCNGFyTkRmSHZBaGFPQWNrQy9RSUJBd3dQSHpkY1pYbFptQzh4Q0FRQkFRSURCTUlEVmt4Q1pEUUYvcFVId2djVEN5QVVRRWRQVThldENBZ0ZDUVpIVEZ4YndMb0hFd3NnRkVCSFQxUEhyUWdJQlFrR1IweGNXOEM2QnhNTElCUkFSMDlUeDYwSUNBVUpCa2RNWEZ2QXdHUUJaUU1NRmY2RC9vWUIvZmtCQUFBQkFBQUFBQVloQnJZQUxBQUFBU0lIRGdFSEJoVVJGQjRCT3dFUklUVTBOejRCTnpZeUZ4NEJGeFlkQVNFUk16SStBVFVSTkNjdUFTY21BNENKZlhpNk16VThaejNnL3RVcEtKRmVZZFJoWHBFb0tmN1Y0RDFuUERVenVuaDlCclUwTTd0NGZZbjk5ajFuUEFKVmxXdGhYcEFvS1Nrb2tGNWhhNVg5cXp4blBRSUtpWDE0dXpNMEFBQUFBQUlBQUFBQUJVQUZRQUFDQUFZQUFBa0NJUkV6RVFIQUFudjloUUxybFFIQUFjQUJ3UHlBQTRBQUFBQUFBZ0FBQUFBRlFBVkFBQU1BQmdBQUFUTVJJd2tCRVFIQWxaVUJCUUo3QlVEOGdBSEEva0FEZ0FBQUFBQUFBQkFBeGdBQkFBQUFBQUFCQUFjQUFBQUJBQUFBQUFBQ0FBY0FCd0FCQUFBQUFBQURBQWNBRGdBQkFBQUFBQUFFQUFjQUZRQUJBQUFBQUFBRkFBc0FIQUFCQUFBQUFBQUdBQWNBSndBQkFBQUFBQUFLQUNzQUxnQUJBQUFBQUFBTEFCTUFXUUFEQUFFRUNRQUJBQTRBYkFBREFBRUVDUUFDQUE0QWVnQURBQUVFQ1FBREFBNEFpQUFEQUFFRUNRQUVBQTRBbGdBREFBRUVDUUFGQUJZQXBBQURBQUVFQ1FBR0FBNEF1Z0FEQUFFRUNRQUtBRllBeUFBREFBRUVDUUFMQUNZQkhsWnBaR1Z2U2xOU1pXZDFiR0Z5Vm1sa1pXOUtVMVpwWkdWdlNsTldaWEp6YVc5dUlERXVNRlpwWkdWdlNsTkhaVzVsY21GMFpXUWdZbmtnYzNabk1uUjBaaUJtY205dElFWnZiblJsYkd4dklIQnliMnBsWTNRdWFIUjBjRG92TDJadmJuUmxiR3h2TG1OdmJRQldBR2tBWkFCbEFHOEFTZ0JUQUZJQVpRQm5BSFVBYkFCaEFISUFWZ0JwQUdRQVpRQnZBRW9BVXdCV0FHa0FaQUJsQUc4QVNnQlRBRllBWlFCeUFITUFhUUJ2QUc0QUlBQXhBQzRBTUFCV0FHa0FaQUJsQUc4QVNnQlRBRWNBWlFCdUFHVUFjZ0JoQUhRQVpRQmtBQ0FBWWdCNUFDQUFjd0IyQUdjQU1nQjBBSFFBWmdBZ0FHWUFjZ0J2QUcwQUlBQkdBRzhBYmdCMEFHVUFiQUJzQUc4QUlBQndBSElBYndCcUFHVUFZd0IwQUM0QWFBQjBBSFFBY0FBNkFDOEFMd0JtQUc4QWJnQjBBR1VBYkFCc0FHOEFMZ0JqQUc4QWJRQUFBQUlBQUFBQUFBQUFFUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlRRUNBUU1CQkFFRkFRWUJCd0VJQVFrQkNnRUxBUXdCRFFFT0FROEJFQUVSQVJJQkV3RVVBUlVCRmdFWEFSZ0JHUUVhQVJzQkhBRWRBUjRCSHdFZ0FTRUJJZ0FFY0d4aGVRdHdiR0Y1TFdOcGNtTnNaUVZ3WVhWelpRdDJiMngxYldVdGJYVjBaUXAyYjJ4MWJXVXRiRzkzQ25admJIVnRaUzF0YVdRTGRtOXNkVzFsTFdocFoyZ1FablZzYkhOamNtVmxiaTFsYm5SbGNnOW1kV3hzYzJOeVpXVnVMV1Y0YVhRR2MzRjFZWEpsQjNOd2FXNXVaWElKYzNWaWRHbDBiR1Z6Q0dOaGNIUnBiMjV6Q0dOb1lYQjBaWEp6QlhOb1lYSmxBMk52WndaamFYSmpiR1VPWTJseVkyeGxMVzkxZEd4cGJtVVRZMmx5WTJ4bExXbHVibVZ5TFdOcGNtTnNaUUpvWkFaallXNWpaV3dHY21Wd2JHRjVDR1poWTJWaWIyOXJCV2R3YkhWekNHeHBibXRsWkdsdUIzUjNhWFIwWlhJR2RIVnRZbXh5Q1hCcGJuUmxjbVZ6ZEJGaGRXUnBieTFrWlhOamNtbHdkR2x2YmdWaGRXUnBid2x1WlhoMExXbDBaVzBOY0hKbGRtbHZkWE10YVhSbGJRQUFBQUE9KSBmb3JtYXQoInRydWV0eXBlIik7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KCi52anMtaWNvbi1wbGF5LCAudmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tcGxheTpiZWZvcmUsIC52aWRlby1qcyAudmpzLWJpZy1wbGF5LWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMDEiOyB9CgoudmpzLWljb24tcGxheS1jaXJjbGUgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLXBsYXktY2lyY2xlOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMDIiOyB9CgoudmpzLWljb24tcGF1c2UsIC52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtcGxheWluZyAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLXBhdXNlOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sLnZqcy1wbGF5aW5nIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTAzIjsgfQoKLnZqcy1pY29uLXZvbHVtZS1tdXRlLCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0wIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tdm9sdW1lLW11dGU6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0wIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTA0IjsgfQoKLnZqcy1pY29uLXZvbHVtZS1sb3csIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTEgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi12b2x1bWUtbG93OmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMSAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjEwNSI7IH0KCi52anMtaWNvbi12b2x1bWUtbWlkLCAudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wudmpzLXZvbC0yIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tdm9sdW1lLW1pZDpiZWZvcmUsIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTIgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMDYiOyB9CgoudmpzLWljb24tdm9sdW1lLWhpZ2gsIC52aWRlby1qcyAudmpzLW11dGUtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLXZvbHVtZS1oaWdoOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTA3IjsgfQoKLnZqcy1pY29uLWZ1bGxzY3JlZW4tZW50ZXIsIC52aWRlby1qcyAudmpzLWZ1bGxzY3JlZW4tY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWZ1bGxzY3JlZW4tZW50ZXI6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMDgiOyB9CgoudmpzLWljb24tZnVsbHNjcmVlbi1leGl0LCAudmlkZW8tanMudmpzLWZ1bGxzY3JlZW4gLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1mdWxsc2NyZWVuLWV4aXQ6YmVmb3JlLCAudmlkZW8tanMudmpzLWZ1bGxzY3JlZW4gLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMDkiOyB9CgoudmpzLWljb24tc3F1YXJlIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1zcXVhcmU6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjEwYSI7IH0KCi52anMtaWNvbi1zcGlubmVyIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1zcGlubmVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMGIiOyB9CgoudmpzLWljb24tc3VidGl0bGVzLCAudmlkZW8tanMgLnZqcy1zdWJ0aXRsZXMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciwgLnZpZGVvLWpzIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsCi52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLUdCKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyLAoudmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1JRSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciwKLnZpZGVvLWpzLnZpZGVvLWpzOmxhbmcoZW4tQVUpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsCi52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLU5aKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1zdWJ0aXRsZXM6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1zdWJ0aXRsZXMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsIC52aWRlby1qcyAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwKICAudmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1HQikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsCiAgLnZpZGVvLWpzLnZpZGVvLWpzOmxhbmcoZW4tSUUpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlLAogIC52aWRlby1qcy52aWRlby1qczpsYW5nKGVuLUFVKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwKICAudmlkZW8tanMudmlkZW8tanM6bGFuZyhlbi1OWikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTBjIjsgfQoKLnZqcy1pY29uLWNhcHRpb25zLCAudmlkZW8tanMgLnZqcy1jYXB0aW9ucy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyLCAudmlkZW8tanM6bGFuZyhlbikgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciwKLnZpZGVvLWpzOmxhbmcoZnItQ0EpIC52anMtc3Vicy1jYXBzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWNhcHRpb25zOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtY2FwdGlvbnMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUsIC52aWRlby1qczpsYW5nKGVuKSAudmpzLXN1YnMtY2Fwcy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwKICAudmlkZW8tanM6bGFuZyhmci1DQSkgLnZqcy1zdWJzLWNhcHMtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTBkIjsgfQoKLnZqcy1pY29uLWNoYXB0ZXJzLCAudmlkZW8tanMgLnZqcy1jaGFwdGVycy1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1jaGFwdGVyczpiZWZvcmUsIC52aWRlby1qcyAudmpzLWNoYXB0ZXJzLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjEwZSI7IH0KCi52anMtaWNvbi1zaGFyZSB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tc2hhcmU6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjEwZiI7IH0KCi52anMtaWNvbi1jb2cgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWNvZzpiZWZvcmUgewogICAgY29udGVudDogIlxmMTEwIjsgfQoKLnZqcy1pY29uLWNpcmNsZSwgLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzcywgLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1jaXJjbGU6YmVmb3JlLCAudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMTEiOyB9CgoudmpzLWljb24tY2lyY2xlLW91dGxpbmUgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWNpcmNsZS1vdXRsaW5lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMTIiOyB9CgoudmpzLWljb24tY2lyY2xlLWlubmVyLWNpcmNsZSB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tY2lyY2xlLWlubmVyLWNpcmNsZTpiZWZvcmUgewogICAgY29udGVudDogIlxmMTEzIjsgfQoKLnZqcy1pY29uLWhkIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1oZDpiZWZvcmUgewogICAgY29udGVudDogIlxmMTE0IjsgfQoKLnZqcy1pY29uLWNhbmNlbCwgLnZpZGVvLWpzIC52anMtY29udHJvbC52anMtY2xvc2UtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tY2FuY2VsOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtY29udHJvbC52anMtY2xvc2UtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTE1IjsgfQoKLnZqcy1pY29uLXJlcGxheSwgLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sLnZqcy1lbmRlZCAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLXJlcGxheTpiZWZvcmUsIC52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtZW5kZWQgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMTYiOyB9CgoudmpzLWljb24tZmFjZWJvb2sgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWZhY2Vib29rOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMTciOyB9CgoudmpzLWljb24tZ3BsdXMgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWdwbHVzOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMTgiOyB9CgoudmpzLWljb24tbGlua2VkaW4gewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWxpbmtlZGluOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMTkiOyB9CgoudmpzLWljb24tdHdpdHRlciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tdHdpdHRlcjpiZWZvcmUgewogICAgY29udGVudDogIlxmMTFhIjsgfQoKLnZqcy1pY29uLXR1bWJsciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tdHVtYmxyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMWIiOyB9CgoudmpzLWljb24tcGludGVyZXN0IHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1waW50ZXJlc3Q6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjExYyI7IH0KCi52anMtaWNvbi1hdWRpby1kZXNjcmlwdGlvbiwgLnZpZGVvLWpzIC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOyB9CiAgLnZqcy1pY29uLWF1ZGlvLWRlc2NyaXB0aW9uOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjExZCI7IH0KCi52anMtaWNvbi1hdWRpbywgLnZpZGVvLWpzIC52anMtYXVkaW8tYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgZm9udC1mYW1pbHk6IFZpZGVvSlM7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBmb250LXN0eWxlOiBub3JtYWw7IH0KICAudmpzLWljb24tYXVkaW86YmVmb3JlLCAudmlkZW8tanMgLnZqcy1hdWRpby1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMWUiOyB9CgoudmpzLWljb24tbmV4dC1pdGVtIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1uZXh0LWl0ZW06YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjExZiI7IH0KCi52anMtaWNvbi1wcmV2aW91cy1pdGVtIHsKICBmb250LWZhbWlseTogVmlkZW9KUzsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsgfQogIC52anMtaWNvbi1wcmV2aW91cy1pdGVtOmJlZm9yZSB7CiAgICBjb250ZW50OiAiXGYxMjAiOyB9CgoudmlkZW8tanMgewogIGRpc3BsYXk6IGJsb2NrOwogIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBjb2xvcjogI2ZmZjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBwYWRkaW5nOiAwOwogIGZvbnQtc2l6ZTogMTBweDsKICBsaW5lLWhlaWdodDogMTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICB3b3JkLWJyZWFrOiBpbml0aWFsOyB9CiAgLnZpZGVvLWpzOi1tb3otZnVsbC1zY3JlZW4gewogICAgcG9zaXRpb246IGFic29sdXRlOyB9CiAgLnZpZGVvLWpzOi13ZWJraXQtZnVsbC1zY3JlZW4gewogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OyB9CgoudmlkZW8tanNbdGFiaW5kZXg9Ii0xIl0gewogIG91dGxpbmU6IG5vbmU7IH0KCi52aWRlby1qcyAqLAoudmlkZW8tanMgKjpiZWZvcmUsCi52aWRlby1qcyAqOmFmdGVyIHsKICBib3gtc2l6aW5nOiBpbmhlcml0OyB9CgoudmlkZW8tanMgdWwgewogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOwogIG1hcmdpbi1sZWZ0OiAwOwogIG1hcmdpbi1yaWdodDogMDsKICBtYXJnaW4tdG9wOiAwOwogIG1hcmdpbi1ib3R0b206IDA7IH0KCi52aWRlby1qcy52anMtZmx1aWQsCi52aWRlby1qcy52anMtMTYtOSwKLnZpZGVvLWpzLnZqcy00LTMgewogIHdpZHRoOiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBoZWlnaHQ6IDA7IH0KCi52aWRlby1qcy52anMtMTYtOSB7CiAgcGFkZGluZy10b3A6IDU2LjI1JTsgfQoKLnZpZGVvLWpzLnZqcy00LTMgewogIHBhZGRpbmctdG9wOiA3NSU7IH0KCi52aWRlby1qcy52anMtZmlsbCB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOyB9CgoudmlkZW8tanMgLnZqcy10ZWNoIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOyB9Cgpib2R5LnZqcy1mdWxsLXdpbmRvdyB7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93LXk6IGF1dG87IH0KCi52anMtZnVsbC13aW5kb3cgLnZpZGVvLWpzLnZqcy1mdWxsc2NyZWVuIHsKICBwb3NpdGlvbjogZml4ZWQ7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB6LWluZGV4OiAxMDAwOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKICByaWdodDogMDsgfQoKLnZpZGVvLWpzLnZqcy1mdWxsc2NyZWVuIHsKICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogIHBhZGRpbmctdG9wOiAwICFpbXBvcnRhbnQ7IH0KCi52aWRlby1qcy52anMtZnVsbHNjcmVlbi52anMtdXNlci1pbmFjdGl2ZSB7CiAgY3Vyc29yOiBub25lOyB9CgoudmpzLWhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CgoudmpzLWRpc2FibGVkIHsKICBvcGFjaXR5OiAwLjU7CiAgY3Vyc29yOiBkZWZhdWx0OyB9CgoudmlkZW8tanMgLnZqcy1vZmZzY3JlZW4gewogIGhlaWdodDogMXB4OwogIGxlZnQ6IC05OTk5cHg7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICB3aWR0aDogMXB4OyB9CgoudmpzLWxvY2stc2hvd2luZyB7CiAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICBvcGFjaXR5OiAxOwogIHZpc2liaWxpdHk6IHZpc2libGU7IH0KCi52anMtbm8tanMgewogIHBhZGRpbmc6IDIwcHg7CiAgY29sb3I6ICNmZmY7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICBmb250LXNpemU6IDE4cHg7CiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAzMDBweDsKICBoZWlnaHQ6IDE1MHB4OwogIG1hcmdpbjogMHB4IGF1dG87IH0KCi52anMtbm8tanMgYSwKLnZqcy1uby1qcyBhOnZpc2l0ZWQgewogIGNvbG9yOiAjNjZBOENDOyB9CgoudmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b24gewogIGZvbnQtc2l6ZTogM2VtOwogIGxpbmUtaGVpZ2h0OiAxLjVlbTsKICBoZWlnaHQ6IDEuNWVtOwogIHdpZHRoOiAzZW07CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMTBweDsKICBsZWZ0OiAxMHB4OwogIHBhZGRpbmc6IDA7CiAgY3Vyc29yOiBwb2ludGVyOwogIG9wYWNpdHk6IDE7CiAgYm9yZGVyOiAwLjA2NjY2ZW0gc29saWQgI2ZmZjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkIzMzNGOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDAuM2VtOwogIC1tb3otYm9yZGVyLXJhZGl1czogMC4zZW07CiAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC40czsKICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjRzOwogIC1tcy10cmFuc2l0aW9uOiBhbGwgMC40czsKICAtby10cmFuc2l0aW9uOiBhbGwgMC40czsKICB0cmFuc2l0aW9uOiBhbGwgMC40czsgfQoKLnZqcy1iaWctcGxheS1jZW50ZXJlZCAudmpzLWJpZy1wbGF5LWJ1dHRvbiB7CiAgdG9wOiA1MCU7CiAgbGVmdDogNTAlOwogIG1hcmdpbi10b3A6IC0wLjc1ZW07CiAgbWFyZ2luLWxlZnQ6IC0xLjVlbTsgfQoKLnZpZGVvLWpzOmhvdmVyIC52anMtYmlnLXBsYXktYnV0dG9uLAoudmlkZW8tanMgLnZqcy1iaWctcGxheS1idXR0b246Zm9jdXMgewogIGJvcmRlci1jb2xvcjogI2ZmZjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzM4NTlmOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC41KTsKICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwczsKICAtbW96LXRyYW5zaXRpb246IGFsbCAwczsKICAtbXMtdHJhbnNpdGlvbjogYWxsIDBzOwogIC1vLXRyYW5zaXRpb246IGFsbCAwczsKICB0cmFuc2l0aW9uOiBhbGwgMHM7IH0KCi52anMtY29udHJvbHMtZGlzYWJsZWQgLnZqcy1iaWctcGxheS1idXR0b24sCi52anMtaGFzLXN0YXJ0ZWQgLnZqcy1iaWctcGxheS1idXR0b24sCi52anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzIC52anMtYmlnLXBsYXktYnV0dG9uLAoudmpzLWVycm9yIC52anMtYmlnLXBsYXktYnV0dG9uIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmpzLWhhcy1zdGFydGVkLnZqcy1wYXVzZWQudmpzLXNob3ctYmlnLXBsYXktYnV0dG9uLW9uLXBhdXNlIC52anMtYmlnLXBsYXktYnV0dG9uIHsKICBkaXNwbGF5OiBibG9jazsgfQoKLnZpZGVvLWpzIGJ1dHRvbiB7CiAgYmFja2dyb3VuZDogbm9uZTsKICBib3JkZXI6IG5vbmU7CiAgY29sb3I6IGluaGVyaXQ7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG92ZXJmbG93OiB2aXNpYmxlOwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgdHJhbnNpdGlvbjogbm9uZTsKICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogIGFwcGVhcmFuY2U6IG5vbmU7IH0KCi52anMtY29udHJvbCAudmpzLWJ1dHRvbiB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOyB9CgoudmlkZW8tanMgLnZqcy1jb250cm9sLnZqcy1jbG9zZS1idXR0b24gewogIGN1cnNvcjogcG9pbnRlcjsKICBoZWlnaHQ6IDNlbTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwLjVlbTsKICB6LWluZGV4OiAyOyB9CgoudmlkZW8tanMgLnZqcy1tb2RhbC1kaWFsb2cgewogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgtOTBkZWcsIHJnYmEoMCwgMCwgMCwgMC44KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSk7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgwLCAwLCAwLCAwLjgpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDApKTsKICBvdmVyZmxvdzogYXV0bzsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQoKLnZpZGVvLWpzIC52anMtbW9kYWwtZGlhbG9nID4gKiB7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQoKLnZqcy1tb2RhbC1kaWFsb2cgLnZqcy1tb2RhbC1kaWFsb2ctY29udGVudCB7CiAgZm9udC1zaXplOiAxLjJlbTsKICBsaW5lLWhlaWdodDogMS41OwogIHBhZGRpbmc6IDIwcHggMjRweDsKICB6LWluZGV4OiAxOyB9CgoudmpzLW1lbnUtYnV0dG9uIHsKICBjdXJzb3I6IHBvaW50ZXI7IH0KCi52anMtbWVudS1idXR0b24udmpzLWRpc2FibGVkIHsKICBjdXJzb3I6IGRlZmF1bHQ7IH0KCi52anMtd29ya2luZ2hvdmVyIC52anMtbWVudS1idXR0b24udmpzLWRpc2FibGVkOmhvdmVyIC52anMtbWVudSB7CiAgZGlzcGxheTogbm9uZTsgfQoKLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50IHsKICBkaXNwbGF5OiBibG9jazsKICBwYWRkaW5nOiAwOwogIG1hcmdpbjogMDsKICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICBvdmVyZmxvdzogYXV0bzsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQoKLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50ID4gKiB7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQoKLnZqcy1zY3J1YmJpbmcgLnZqcy1tZW51LWJ1dHRvbjpob3ZlciAudmpzLW1lbnUgewogIGRpc3BsYXk6IG5vbmU7IH0KCi52anMtbWVudSBsaSB7CiAgbGlzdC1zdHlsZTogbm9uZTsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMC4yZW0gMDsKICBsaW5lLWhlaWdodDogMS40ZW07CiAgZm9udC1zaXplOiAxLjJlbTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC10cmFuc2Zvcm06IGxvd2VyY2FzZTsgfQoKLnZqcy1tZW51IGxpLnZqcy1tZW51LWl0ZW06Zm9jdXMsCi52anMtbWVudSBsaS52anMtbWVudS1pdGVtOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzM4NTlmOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC41KTsgfQoKLnZqcy1tZW51IGxpLnZqcy1zZWxlY3RlZCwKLnZqcy1tZW51IGxpLnZqcy1zZWxlY3RlZDpmb2N1cywKLnZqcy1tZW51IGxpLnZqcy1zZWxlY3RlZDpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICBjb2xvcjogIzJCMzMzRjsgfQoKLnZqcy1tZW51IGxpLnZqcy1tZW51LXRpdGxlIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBmb250LXNpemU6IDFlbTsKICBsaW5lLWhlaWdodDogMmVtOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luOiAwIDAgMC4zZW0gMDsKICBmb250LXdlaWdodDogYm9sZDsKICBjdXJzb3I6IGRlZmF1bHQ7IH0KCi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IHsKICBkaXNwbGF5OiBub25lOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDA7CiAgd2lkdGg6IDEwZW07CiAgbGVmdDogLTNlbTsKICBoZWlnaHQ6IDBlbTsKICBtYXJnaW4tYm90dG9tOiAxLjVlbTsKICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDQzLCA1MSwgNjMsIDAuNyk7IH0KCi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkIzMzNGOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43KTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgYm90dG9tOiAxLjVlbTsKICBtYXgtaGVpZ2h0OiAxNWVtOyB9CgoudmpzLXdvcmtpbmdob3ZlciAudmpzLW1lbnUtYnV0dG9uLXBvcHVwOmhvdmVyIC52anMtbWVudSwKLnZqcy1tZW51LWJ1dHRvbi1wb3B1cCAudmpzLW1lbnUudmpzLWxvY2stc2hvd2luZyB7CiAgZGlzcGxheTogYmxvY2s7IH0KCi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZSB7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC40czsKICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjRzOwogIC1tcy10cmFuc2l0aW9uOiBhbGwgMC40czsKICAtby10cmFuc2l0aW9uOiBhbGwgMC40czsKICB0cmFuc2l0aW9uOiBhbGwgMC40czsKICBvdmVyZmxvdzogaGlkZGVuOyB9CgoudmlkZW8tanMgLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6YmVmb3JlIHsKICB3aWR0aDogMi4yMjIyMjIyMjJlbTsgfQoKLnZpZGVvLWpzIC52anMtbWVudS1idXR0b24taW5saW5lOmhvdmVyLAoudmlkZW8tanMgLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmU6Zm9jdXMsCi52aWRlby1qcyAudmpzLW1lbnUtYnV0dG9uLWlubGluZS52anMtc2xpZGVyLWFjdGl2ZSwKLnZpZGVvLWpzLnZqcy1uby1mbGV4IC52anMtbWVudS1idXR0b24taW5saW5lIHsKICB3aWR0aDogMTJlbTsgfQoKLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51IHsKICBvcGFjaXR5OiAwOwogIGhlaWdodDogMTAwJTsKICB3aWR0aDogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNGVtOwogIHRvcDogMDsKICBwYWRkaW5nOiAwOwogIG1hcmdpbjogMDsKICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjRzOwogIC1tb3otdHJhbnNpdGlvbjogYWxsIDAuNHM7CiAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjRzOwogIC1vLXRyYW5zaXRpb246IGFsbCAwLjRzOwogIHRyYW5zaXRpb246IGFsbCAwLjRzOyB9CgoudmpzLW1lbnUtYnV0dG9uLWlubGluZTpob3ZlciAudmpzLW1lbnUsCi52anMtbWVudS1idXR0b24taW5saW5lOmZvY3VzIC52anMtbWVudSwKLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUudmpzLXNsaWRlci1hY3RpdmUgLnZqcy1tZW51IHsKICBkaXNwbGF5OiBibG9jazsKICBvcGFjaXR5OiAxOyB9CgoudmpzLW5vLWZsZXggLnZqcy1tZW51LWJ1dHRvbi1pbmxpbmUgLnZqcy1tZW51IHsKICBkaXNwbGF5OiBibG9jazsKICBvcGFjaXR5OiAxOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aWR0aDogYXV0bzsgfQoKLnZqcy1uby1mbGV4IC52anMtbWVudS1idXR0b24taW5saW5lOmhvdmVyIC52anMtbWVudSwKLnZqcy1uby1mbGV4IC52anMtbWVudS1idXR0b24taW5saW5lOmZvY3VzIC52anMtbWVudSwKLnZqcy1uby1mbGV4IC52anMtbWVudS1idXR0b24taW5saW5lLnZqcy1zbGlkZXItYWN0aXZlIC52anMtbWVudSB7CiAgd2lkdGg6IGF1dG87IH0KCi52anMtbWVudS1idXR0b24taW5saW5lIC52anMtbWVudS1jb250ZW50IHsKICB3aWR0aDogYXV0bzsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47IH0KCi52aWRlby1qcyAudmpzLWNvbnRyb2wtYmFyIHsKICBkaXNwbGF5OiBub25lOwogIHdpZHRoOiAxMDAlOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICByaWdodDogMDsKICBoZWlnaHQ6IDMuMGVtOwogIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg0MywgNTEsIDYzLCAwLjcpOyB9CgoudmpzLWhhcy1zdGFydGVkIC52anMtY29udHJvbC1iYXIgewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiBmbGV4OwogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgb3BhY2l0eTogMTsKICAtd2Via2l0LXRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzOwogIC1tb3otdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzLCBvcGFjaXR5IDAuMXM7CiAgLW1zLXRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzOwogIC1vLXRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzOwogIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzOyB9CgoudmpzLWhhcy1zdGFydGVkLnZqcy11c2VyLWluYWN0aXZlLnZqcy1wbGF5aW5nIC52anMtY29udHJvbC1iYXIgewogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgb3BhY2l0eTogMDsKICAtd2Via2l0LXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXM7CiAgLW1vei10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDFzLCBvcGFjaXR5IDFzOwogIC1tcy10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDFzLCBvcGFjaXR5IDFzOwogIC1vLXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXM7CiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxczsgfQoKLnZqcy1jb250cm9scy1kaXNhYmxlZCAudmpzLWNvbnRyb2wtYmFyLAoudmpzLXVzaW5nLW5hdGl2ZS1jb250cm9scyAudmpzLWNvbnRyb2wtYmFyLAoudmpzLWVycm9yIC52anMtY29udHJvbC1iYXIgewogIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQoKLnZqcy1hdWRpby52anMtaGFzLXN0YXJ0ZWQudmpzLXVzZXItaW5hY3RpdmUudmpzLXBsYXlpbmcgLnZqcy1jb250cm9sLWJhciB7CiAgb3BhY2l0eTogMTsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOyB9CgoudmpzLWhhcy1zdGFydGVkLnZqcy1uby1mbGV4IC52anMtY29udHJvbC1iYXIgewogIGRpc3BsYXk6IHRhYmxlOyB9CgoudmlkZW8tanMgLnZqcy1jb250cm9sIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAwOwogIGhlaWdodDogMTAwJTsKICB3aWR0aDogNGVtOwogIC13ZWJraXQtYm94LWZsZXg6IG5vbmU7CiAgLW1vei1ib3gtZmxleDogbm9uZTsKICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgLW1zLWZsZXg6IG5vbmU7CiAgZmxleDogbm9uZTsgfQoKLnZqcy1idXR0b24gPiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBmb250LXNpemU6IDEuOGVtOwogIGxpbmUtaGVpZ2h0OiAxLjY3OyB9CgoudmlkZW8tanMgLnZqcy1jb250cm9sOmZvY3VzOmJlZm9yZSwKLnZpZGVvLWpzIC52anMtY29udHJvbDpob3ZlcjpiZWZvcmUsCi52aWRlby1qcyAudmpzLWNvbnRyb2w6Zm9jdXMgewogIHRleHQtc2hhZG93OiAwZW0gMGVtIDFlbSB3aGl0ZTsgfQoKLnZpZGVvLWpzIC52anMtY29udHJvbC10ZXh0IHsKICBib3JkZXI6IDA7CiAgY2xpcDogcmVjdCgwIDAgMCAwKTsKICBoZWlnaHQ6IDFweDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IDA7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxcHg7IH0KCi52anMtbm8tZmxleCAudmpzLWNvbnRyb2wgewogIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfQoKLnZpZGVvLWpzIC52anMtY3VzdG9tLWNvbnRyb2wtc3BhY2VyIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgLXdlYmtpdC1ib3gtZmxleDogYXV0bzsKICAtbW96LWJveC1mbGV4OiBhdXRvOwogIC13ZWJraXQtZmxleDogYXV0bzsKICAtbXMtZmxleDogYXV0bzsKICBmbGV4OiBhdXRvOwogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiBmbGV4OwogIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7CiAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtaW4td2lkdGg6IDRlbTsgfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbC5kaXNhYmxlZCB7CiAgY3Vyc29yOiBkZWZhdWx0OyB9CgoudmpzLWxpdmUgLnZqcy1wcm9ncmVzcy1jb250cm9sIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmpzLW5vLWZsZXggLnZqcy1wcm9ncmVzcy1jb250cm9sIHsKICB3aWR0aDogYXV0bzsgfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHsKICAtd2Via2l0LWJveC1mbGV4OiBhdXRvOwogIC1tb3otYm94LWZsZXg6IGF1dG87CiAgLXdlYmtpdC1mbGV4OiBhdXRvOwogIC1tcy1mbGV4OiBhdXRvOwogIGZsZXg6IGF1dG87CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4yczsKICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjJzOwogIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yczsKICAtby10cmFuc2l0aW9uOiBhbGwgMC4yczsKICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKICBoZWlnaHQ6IDAuM2VtOyB9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtcHJvZ3Jlc3MtaG9sZGVyIHsKICBtYXJnaW46IDAgMTBweDsgfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbDpob3ZlciAudmpzLXByb2dyZXNzLWhvbGRlciB7CiAgZm9udC1zaXplOiAxLjY2NjY2NjY2NjY2NjY2NjY2NmVtOyB9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sOmhvdmVyIC52anMtcHJvZ3Jlc3MtaG9sZGVyLmRpc2FibGVkIHsKICBmb250LXNpemU6IDFlbTsgfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyIC52anMtcGxheS1wcm9ncmVzcywKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyIC52anMtbG9hZC1wcm9ncmVzcywKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtaG9sZGVyIC52anMtbG9hZC1wcm9ncmVzcyBkaXYgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBkaXNwbGF5OiBibG9jazsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7CiAgd2lkdGg6IDA7CiAgbGVmdDogMDsKICB0b3A6IDA7IH0KCi52aWRlby1qcyAudmpzLXBsYXktcHJvZ3Jlc3MgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7IH0KICAudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzOmJlZm9yZSB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IC0wLjVlbTsKICAgIHRvcDogLTAuMzMzMzMzMzMzMzMzMzMzZW07CiAgICB6LWluZGV4OiAxOyB9CgoudmlkZW8tanMgLnZqcy1sb2FkLXByb2dyZXNzIHsKICBiYWNrZ3JvdW5kOiAjYmZjN2QzOwogIGJhY2tncm91bmQ6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC41KTsgfQoKLnZpZGVvLWpzIC52anMtbG9hZC1wcm9ncmVzcyBkaXYgewogIGJhY2tncm91bmQ6IHdoaXRlOwogIGJhY2tncm91bmQ6IHJnYmEoMTE1LCAxMzMsIDE1OSwgMC43NSk7IH0KCi52aWRlby1qcyAudmpzLXRpbWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwLjNlbTsKICAtbW96LWJvcmRlci1yYWRpdXM6IDAuM2VtOwogIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogIGNvbG9yOiAjMDAwOwogIGZsb2F0OiByaWdodDsKICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDFlbTsKICBwYWRkaW5nOiA2cHggOHB4IDhweCA4cHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogLTMuNGVtOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKICB6LWluZGV4OiAxOyB9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1ob2xkZXI6Zm9jdXMgLnZqcy10aW1lLXRvb2x0aXAgewogIGRpc3BsYXk6IG5vbmU7IH0KCi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2w6aG92ZXIgLnZqcy10aW1lLXRvb2x0aXAsCi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2w6aG92ZXIgLnZqcy1wcm9ncmVzcy1ob2xkZXI6Zm9jdXMgLnZqcy10aW1lLXRvb2x0aXAgewogIGRpc3BsYXk6IGJsb2NrOwogIGZvbnQtc2l6ZTogMC42ZW07CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsgfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbC5kaXNhYmxlZDpob3ZlciAudmpzLXRpbWUtdG9vbHRpcCB7CiAgZm9udC1zaXplOiAxZW07IH0KCi52aWRlby1qcyAudmpzLXByb2dyZXNzLWNvbnRyb2wgLnZqcy1tb3VzZS1kaXNwbGF5IHsKICBkaXNwbGF5OiBub25lOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMXB4OwogIGhlaWdodDogMTAwJTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogIHotaW5kZXg6IDE7IH0KCi52anMtbm8tZmxleCAudmpzLXByb2dyZXNzLWNvbnRyb2wgLnZqcy1tb3VzZS1kaXNwbGF5IHsKICB6LWluZGV4OiAwOyB9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sOmhvdmVyIC52anMtbW91c2UtZGlzcGxheSB7CiAgZGlzcGxheTogYmxvY2s7IH0KCi52aWRlby1qcy52anMtdXNlci1pbmFjdGl2ZSAudmpzLXByb2dyZXNzLWNvbnRyb2wgLnZqcy1tb3VzZS1kaXNwbGF5IHsKICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgb3BhY2l0eTogMDsKICAtd2Via2l0LXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXM7CiAgLW1vei10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDFzLCBvcGFjaXR5IDFzOwogIC1tcy10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDFzLCBvcGFjaXR5IDFzOwogIC1vLXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXM7CiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxczsgfQoKLnZpZGVvLWpzLnZqcy11c2VyLWluYWN0aXZlLnZqcy1uby1mbGV4IC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLW1vdXNlLWRpc3BsYXkgewogIGRpc3BsYXk6IG5vbmU7IH0KCi52anMtbW91c2UtZGlzcGxheSAudmpzLXRpbWUtdG9vbHRpcCB7CiAgY29sb3I6ICNmZmY7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7IH0KCi52aWRlby1qcyAudmpzLXNsaWRlciB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGN1cnNvcjogcG9pbnRlcjsKICBwYWRkaW5nOiAwOwogIG1hcmdpbjogMCAwLjQ1ZW0gMCAwLjQ1ZW07CiAgLyogaU9TIFNhZmFyaSAqLwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAvKiBTYWZhcmkgKi8KICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogIC8qIEtvbnF1ZXJvciBIVE1MICovCiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC8qIEZpcmVmb3ggKi8KICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC8qIEludGVybmV0IEV4cGxvcmVyL0VkZ2UgKi8KICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLyogTm9uLXByZWZpeGVkIHZlcnNpb24sIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQ2hyb21lIGFuZCBPcGVyYSAqLwogIHVzZXItc2VsZWN0OiBub25lOwogIGJhY2tncm91bmQtY29sb3I6ICM3Mzg1OWY7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMTUsIDEzMywgMTU5LCAwLjUpOyB9CgoudmlkZW8tanMgLnZqcy1zbGlkZXIuZGlzYWJsZWQgewogIGN1cnNvcjogZGVmYXVsdDsgfQoKLnZpZGVvLWpzIC52anMtc2xpZGVyOmZvY3VzIHsKICB0ZXh0LXNoYWRvdzogMGVtIDBlbSAxZW0gd2hpdGU7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMWVtICNmZmY7CiAgLW1vei1ib3gtc2hhZG93OiAwIDAgMWVtICNmZmY7CiAgYm94LXNoYWRvdzogMCAwIDFlbSAjZmZmOyB9CgoudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wgewogIGN1cnNvcjogcG9pbnRlcjsKICAtd2Via2l0LWJveC1mbGV4OiBub25lOwogIC1tb3otYm94LWZsZXg6IG5vbmU7CiAgLXdlYmtpdC1mbGV4OiBub25lOwogIC1tcy1mbGV4OiBub25lOwogIGZsZXg6IG5vbmU7CiAgcGFkZGluZy1sZWZ0OiAyZW07CiAgcGFkZGluZy1yaWdodDogMmVtOwogIHBhZGRpbmctYm90dG9tOiAzZW07IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1jb250cm9sIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgbWFyZ2luLXJpZ2h0OiAxZW07CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IGZsZXg7IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtaG9yaXpvbnRhbCB7CiAgd2lkdGg6IDVlbTsgfQoKLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wgewogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgb3BhY2l0eTogMDsKICB3aWR0aDogMXB4OwogIGhlaWdodDogMXB4OwogIG1hcmdpbi1sZWZ0OiAtMXB4OyB9CgoudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsIHsKICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MCkiOyB9CiAgLnZqcy1uby1mbGV4IC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCAudmpzLXZvbHVtZS1iYXIsCiAgLnZqcy1uby1mbGV4IC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCB7CiAgICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MCkiOyB9CgoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgewogIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMXM7CiAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAxczsKICAtbXMtdHJhbnNpdGlvbjogd2lkdGggMXM7CiAgLW8tdHJhbnNpdGlvbjogd2lkdGggMXM7CiAgdHJhbnNpdGlvbjogd2lkdGggMXM7IH0KICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWw6aG92ZXIgLnZqcy12b2x1bWUtY29udHJvbCwKICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWw6YWN0aXZlIC52anMtdm9sdW1lLWNvbnRyb2wsCiAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wsCiAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2w6aG92ZXIsCiAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2w6YWN0aXZlLAogIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLW11dGUtY29udHJvbDpob3ZlciB+IC52anMtdm9sdW1lLWNvbnRyb2wsCiAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXNsaWRlci1hY3RpdmUgewogICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgIG9wYWNpdHk6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAtd2Via2l0LXRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzLCBoZWlnaHQgMC4xcywgd2lkdGggMC4xcywgbGVmdCAwcywgdG9wIDBzOwogICAgLW1vei10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMXMsIG9wYWNpdHkgMC4xcywgaGVpZ2h0IDAuMXMsIHdpZHRoIDAuMXMsIGxlZnQgMHMsIHRvcCAwczsKICAgIC1tcy10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMXMsIG9wYWNpdHkgMC4xcywgaGVpZ2h0IDAuMXMsIHdpZHRoIDAuMXMsIGxlZnQgMHMsIHRvcCAwczsKICAgIC1vLXRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4xcywgb3BhY2l0eSAwLjFzLCBoZWlnaHQgMC4xcywgd2lkdGggMC4xcywgbGVmdCAwcywgdG9wIDBzOwogICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzLCBvcGFjaXR5IDAuMXMsIGhlaWdodCAwLjFzLCB3aWR0aCAwLjFzLCBsZWZ0IDBzLCB0b3AgMHM7IH0KICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpob3ZlciAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtaG9yaXpvbnRhbCwKICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsCiAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWw6Zm9jdXMgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsCiAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDpob3Zlci52anMtdm9sdW1lLWhvcml6b250YWwsCiAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDphY3RpdmUudmpzLXZvbHVtZS1ob3Jpem9udGFsLAogICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtbXV0ZS1jb250cm9sOmhvdmVyIH4gLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwsCiAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZS52anMtdm9sdW1lLWhvcml6b250YWwgewogICAgICB3aWR0aDogNWVtOwogICAgICBoZWlnaHQ6IDNlbTsgfQogICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCwKICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsLAogICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCwKICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sOmhvdmVyLnZqcy12b2x1bWUtdmVydGljYWwsCiAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDphY3RpdmUudmpzLXZvbHVtZS12ZXJ0aWNhbCwKICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLW11dGUtY29udHJvbDpob3ZlciB+IC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCwKICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy1zbGlkZXItYWN0aXZlLnZqcy12b2x1bWUtdmVydGljYWwgewogICAgICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MTAwKSI7IH0KICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS12ZXJ0aWNhbCAudmpzLXZvbHVtZS1iYXIsCiAgICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpob3ZlciAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwgLnZqcy12b2x1bWUtbGV2ZWwsCiAgICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsIC52anMtdm9sdW1lLWJhciwKICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmFjdGl2ZSAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwgLnZqcy12b2x1bWUtbGV2ZWwsCiAgICAgIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDpmb2N1cyAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwgLnZqcy12b2x1bWUtYmFyLAogICAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWw6Zm9jdXMgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsLAogICAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDpob3Zlci52anMtdm9sdW1lLXZlcnRpY2FsIC52anMtdm9sdW1lLWJhciwKICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2w6aG92ZXIudmpzLXZvbHVtZS12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCwKICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2w6YWN0aXZlLnZqcy12b2x1bWUtdmVydGljYWwgLnZqcy12b2x1bWUtYmFyLAogICAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDphY3RpdmUudmpzLXZvbHVtZS12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCwKICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtbXV0ZS1jb250cm9sOmhvdmVyIH4gLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsIC52anMtdm9sdW1lLWJhciwKICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtbXV0ZS1jb250cm9sOmhvdmVyIH4gLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsLAogICAgICAudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtc2xpZGVyLWFjdGl2ZS52anMtdm9sdW1lLXZlcnRpY2FsIC52anMtdm9sdW1lLWJhciwKICAgICAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXNsaWRlci1hY3RpdmUudmpzLXZvbHVtZS12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCB7CiAgICAgICAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTEwMCkiOyB9CiAgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDpob3ZlciwgLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsLnZqcy12b2x1bWUtcGFuZWwtaG9yaXpvbnRhbDphY3RpdmUsIC52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLXNsaWRlci1hY3RpdmUgewogICAgd2lkdGg6IDllbTsKICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMC4xczsKICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMC4xczsKICAgIC1tcy10cmFuc2l0aW9uOiB3aWR0aCAwLjFzOwogICAgLW8tdHJhbnNpdGlvbjogd2lkdGggMC4xczsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMXM7IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtdmVydGljYWwgewogIGhlaWdodDogOGVtOwogIHdpZHRoOiAzZW07CiAgbGVmdDogLTMuNWVtOwogIC13ZWJraXQtdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcyAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzOwogIC1tb3otdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcyAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzOwogIC1tcy10cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDFzLCBvcGFjaXR5IDFzLCBoZWlnaHQgMXMgMXMsIHdpZHRoIDFzIDFzLCBsZWZ0IDFzIDFzLCB0b3AgMXMgMXM7CiAgLW8tdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcyAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzOwogIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXMsIGhlaWdodCAxcyAxcywgd2lkdGggMXMgMXMsIGxlZnQgMXMgMXMsIHRvcCAxcyAxczsgfQoKLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsIC52anMtdm9sdW1lLWNvbnRyb2wudmpzLXZvbHVtZS1ob3Jpem9udGFsIHsKICAtd2Via2l0LXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXMsIGhlaWdodCAxcyAxcywgd2lkdGggMXMsIGxlZnQgMXMgMXMsIHRvcCAxcyAxczsKICAtbW96LXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXMsIGhlaWdodCAxcyAxcywgd2lkdGggMXMsIGxlZnQgMXMgMXMsIHRvcCAxcyAxczsKICAtbXMtdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAxcywgb3BhY2l0eSAxcywgaGVpZ2h0IDFzIDFzLCB3aWR0aCAxcywgbGVmdCAxcyAxcywgdG9wIDFzIDFzOwogIC1vLXRyYW5zaXRpb246IHZpc2liaWxpdHkgMXMsIG9wYWNpdHkgMXMsIGhlaWdodCAxcyAxcywgd2lkdGggMXMsIGxlZnQgMXMgMXMsIHRvcCAxcyAxczsKICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDFzLCBvcGFjaXR5IDFzLCBoZWlnaHQgMXMgMXMsIHdpZHRoIDFzLCBsZWZ0IDFzIDFzLCB0b3AgMXMgMXM7IH0KCi52aWRlby1qcy52anMtbm8tZmxleCAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy12b2x1bWUtaG9yaXpvbnRhbCB7CiAgd2lkdGg6IDVlbTsKICBoZWlnaHQ6IDNlbTsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIG9wYWNpdHk6IDE7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTsKICAtbW96LXRyYW5zaXRpb246IG5vbmU7CiAgLW1zLXRyYW5zaXRpb246IG5vbmU7CiAgLW8tdHJhbnNpdGlvbjogbm9uZTsKICB0cmFuc2l0aW9uOiBub25lOyB9CgoudmlkZW8tanMudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsLAoudmlkZW8tanMudmpzLW5vLWZsZXggLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLXZlcnRpY2FsIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYm90dG9tOiAzZW07CiAgbGVmdDogMC41ZW07IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IGZsZXg7IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1iYXIgewogIG1hcmdpbjogMS4zNWVtIDAuNDVlbTsgfQoKLnZqcy12b2x1bWUtYmFyLnZqcy1zbGlkZXItaG9yaXpvbnRhbCB7CiAgd2lkdGg6IDVlbTsKICBoZWlnaHQ6IDAuM2VtOyB9CgoudmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci12ZXJ0aWNhbCB7CiAgd2lkdGg6IDAuM2VtOwogIGhlaWdodDogNWVtOwogIG1hcmdpbjogMS4zNWVtIGF1dG87IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1sZXZlbCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGJvdHRvbTogMDsKICBsZWZ0OiAwOwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7IH0KICAudmlkZW8tanMgLnZqcy12b2x1bWUtbGV2ZWw6YmVmb3JlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGZvbnQtc2l6ZTogMC45ZW07IH0KCi52anMtc2xpZGVyLXZlcnRpY2FsIC52anMtdm9sdW1lLWxldmVsIHsKICB3aWR0aDogMC4zZW07IH0KICAudmpzLXNsaWRlci12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbDpiZWZvcmUgewogICAgdG9wOiAtMC41ZW07CiAgICBsZWZ0OiAtMC4zZW07IH0KCi52anMtc2xpZGVyLWhvcml6b250YWwgLnZqcy12b2x1bWUtbGV2ZWwgewogIGhlaWdodDogMC4zZW07IH0KICAudmpzLXNsaWRlci1ob3Jpem9udGFsIC52anMtdm9sdW1lLWxldmVsOmJlZm9yZSB7CiAgICB0b3A6IC0wLjNlbTsKICAgIHJpZ2h0OiAtMC41ZW07IH0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLXZlcnRpY2FsIHsKICB3aWR0aDogNGVtOyB9CgoudmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci12ZXJ0aWNhbCAudmpzLXZvbHVtZS1sZXZlbCB7CiAgaGVpZ2h0OiAxMDAlOyB9CgoudmpzLXZvbHVtZS1iYXIudmpzLXNsaWRlci1ob3Jpem9udGFsIC52anMtdm9sdW1lLWxldmVsIHsKICB3aWR0aDogMTAwJTsgfQoKLnZpZGVvLWpzIC52anMtdm9sdW1lLXZlcnRpY2FsIHsKICB3aWR0aDogM2VtOwogIGhlaWdodDogOGVtOwogIGJvdHRvbTogOGVtOwogIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg0MywgNTEsIDYzLCAwLjcpOyB9CgoudmlkZW8tanMgLnZqcy12b2x1bWUtaG9yaXpvbnRhbCAudmpzLW1lbnUgewogIGxlZnQ6IC0yZW07IH0KCi52anMtcG9zdGVyIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSA1MCU7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7CiAgY3Vyc29yOiBwb2ludGVyOwogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgaGVpZ2h0OiAxMDAlOyB9CgoudmpzLXBvc3RlciBpbWcgewogIGRpc3BsYXk6IGJsb2NrOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgbWFyZ2luOiAwIGF1dG87CiAgbWF4LWhlaWdodDogMTAwJTsKICBwYWRkaW5nOiAwOwogIHdpZHRoOiAxMDAlOyB9CgoudmpzLWhhcy1zdGFydGVkIC52anMtcG9zdGVyIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmpzLWF1ZGlvLnZqcy1oYXMtc3RhcnRlZCAudmpzLXBvc3RlciB7CiAgZGlzcGxheTogYmxvY2s7IH0KCi52anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzIC52anMtcG9zdGVyIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmlkZW8tanMgLnZqcy1saXZlLWNvbnRyb2wgewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiBmbGV4OwogIC13ZWJraXQtYm94LWFsaWduOiBmbGV4LXN0YXJ0OwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgLW1zLWZsZXgtYWxpZ246IGZsZXgtc3RhcnQ7CiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgLXdlYmtpdC1ib3gtZmxleDogYXV0bzsKICAtbW96LWJveC1mbGV4OiBhdXRvOwogIC13ZWJraXQtZmxleDogYXV0bzsKICAtbXMtZmxleDogYXV0bzsKICBmbGV4OiBhdXRvOwogIGZvbnQtc2l6ZTogMWVtOwogIGxpbmUtaGVpZ2h0OiAzZW07IH0KCi52anMtbm8tZmxleCAudmpzLWxpdmUtY29udHJvbCB7CiAgZGlzcGxheTogdGFibGUtY2VsbDsKICB3aWR0aDogYXV0bzsKICB0ZXh0LWFsaWduOiBsZWZ0OyB9CgoudmlkZW8tanMgLnZqcy10aW1lLWNvbnRyb2wgewogIC13ZWJraXQtYm94LWZsZXg6IG5vbmU7CiAgLW1vei1ib3gtZmxleDogbm9uZTsKICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgLW1zLWZsZXg6IG5vbmU7CiAgZmxleDogbm9uZTsKICBmb250LXNpemU6IDFlbTsKICBsaW5lLWhlaWdodDogM2VtOwogIG1pbi13aWR0aDogMmVtOwogIHdpZHRoOiBhdXRvOwogIHBhZGRpbmctbGVmdDogMWVtOwogIHBhZGRpbmctcmlnaHQ6IDFlbTsgfQoKLnZqcy1saXZlIC52anMtdGltZS1jb250cm9sIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmlkZW8tanMgLnZqcy1jdXJyZW50LXRpbWUsCi52anMtbm8tZmxleCAudmpzLWN1cnJlbnQtdGltZSB7CiAgZGlzcGxheTogbm9uZTsgfQoKLnZqcy1uby1mbGV4IC52anMtcmVtYWluaW5nLXRpbWUudmpzLXRpbWUtY29udHJvbC52anMtY29udHJvbCB7CiAgd2lkdGg6IDBweCAhaW1wb3J0YW50OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7IH0KCi52aWRlby1qcyAudmpzLWR1cmF0aW9uLAoudmpzLW5vLWZsZXggLnZqcy1kdXJhdGlvbiB7CiAgZGlzcGxheTogbm9uZTsgfQoKLnZqcy10aW1lLWRpdmlkZXIgewogIGRpc3BsYXk6IG5vbmU7CiAgbGluZS1oZWlnaHQ6IDNlbTsgfQoKLnZqcy1saXZlIC52anMtdGltZS1kaXZpZGVyIHsKICBkaXNwbGF5OiBub25lOyB9CgoudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgLXdlYmtpdC1ib3gtZmxleDogbm9uZTsKICAtbW96LWJveC1mbGV4OiBub25lOwogIC13ZWJraXQtZmxleDogbm9uZTsKICAtbXMtZmxleDogbm9uZTsKICBmbGV4OiBub25lOyB9CgoudmpzLXRleHQtdHJhY2stZGlzcGxheSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGJvdHRvbTogM2VtOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwogIHBvaW50ZXItZXZlbnRzOiBub25lOyB9CgoudmlkZW8tanMudmpzLXVzZXItaW5hY3RpdmUudmpzLXBsYXlpbmcgLnZqcy10ZXh0LXRyYWNrLWRpc3BsYXkgewogIGJvdHRvbTogMWVtOyB9CgoudmlkZW8tanMgLnZqcy10ZXh0LXRyYWNrIHsKICBmb250LXNpemU6IDEuNGVtOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW4tYm90dG9tOiAwLjFlbTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTsgfQoKLnZqcy1zdWJ0aXRsZXMgewogIGNvbG9yOiAjZmZmOyB9CgoudmpzLWNhcHRpb25zIHsKICBjb2xvcjogI2ZjNjsgfQoKLnZqcy10dC1jdWUgewogIGRpc3BsYXk6IGJsb2NrOyB9Cgp2aWRlbzo6LXdlYmtpdC1tZWRpYS10ZXh0LXRyYWNrLWRpc3BsYXkgewogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zZW0pOwogIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTNlbSk7CiAgLW8tdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zZW0pOwogIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zZW0pOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM2VtKTsgfQoKLnZpZGVvLWpzLnZqcy11c2VyLWluYWN0aXZlLnZqcy1wbGF5aW5nIHZpZGVvOjotd2Via2l0LW1lZGlhLXRleHQtdHJhY2stZGlzcGxheSB7CiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNWVtKTsKICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjVlbSk7CiAgLW8tdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjVlbSk7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNWVtKTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNWVtKTsgfQoKLnZpZGVvLWpzIC52anMtZnVsbHNjcmVlbi1jb250cm9sIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgLXdlYmtpdC1ib3gtZmxleDogbm9uZTsKICAtbW96LWJveC1mbGV4OiBub25lOwogIC13ZWJraXQtZmxleDogbm9uZTsKICAtbXMtZmxleDogbm9uZTsKICBmbGV4OiBub25lOyB9CgoudmpzLXBsYXliYWNrLXJhdGUgPiAudmpzLW1lbnUtYnV0dG9uLAoudmpzLXBsYXliYWNrLXJhdGUgLnZqcy1wbGF5YmFjay1yYXRlLXZhbHVlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOyB9CgoudmpzLXBsYXliYWNrLXJhdGUgLnZqcy1wbGF5YmFjay1yYXRlLXZhbHVlIHsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKICBmb250LXNpemU6IDEuNWVtOwogIGxpbmUtaGVpZ2h0OiAyOwogIHRleHQtYWxpZ246IGNlbnRlcjsgfQoKLnZqcy1wbGF5YmFjay1yYXRlIC52anMtbWVudSB7CiAgd2lkdGg6IDRlbTsKICBsZWZ0OiAwZW07IH0KCi52anMtZXJyb3IgLnZqcy1lcnJvci1kaXNwbGF5IC52anMtbW9kYWwtZGlhbG9nLWNvbnRlbnQgewogIGZvbnQtc2l6ZTogMS40ZW07CiAgdGV4dC1hbGlnbjogY2VudGVyOyB9CgoudmpzLWVycm9yIC52anMtZXJyb3ItZGlzcGxheTpiZWZvcmUgewogIGNvbG9yOiAjZmZmOwogIGNvbnRlbnQ6ICdYJzsKICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDRlbTsKICBsZWZ0OiAwOwogIGxpbmUtaGVpZ2h0OiAxOwogIG1hcmdpbi10b3A6IC0wLjVlbTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1zaGFkb3c6IDAuMDVlbSAwLjA1ZW0gMC4xZW0gIzAwMDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdG9wOiA1MCU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsgfQoKLnZqcy1sb2FkaW5nLXNwaW5uZXIgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICBtYXJnaW46IC0yNXB4IDAgMCAtMjVweDsKICBvcGFjaXR5OiAwLjg1OwogIHRleHQtYWxpZ246IGxlZnQ7CiAgYm9yZGVyOiA2cHggc29saWQgcmdiYSg0MywgNTEsIDYzLCAwLjcpOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICB3aWR0aDogNTBweDsKICBoZWlnaHQ6IDUwcHg7CiAgYm9yZGVyLXJhZGl1czogMjVweDsKICB2aXNpYmlsaXR5OiBoaWRkZW47IH0KCi52anMtc2Vla2luZyAudmpzLWxvYWRpbmctc3Bpbm5lciwKLnZqcy13YWl0aW5nIC52anMtbG9hZGluZy1zcGlubmVyIHsKICBkaXNwbGF5OiBibG9jazsKICBhbmltYXRpb246IDBzIGxpbmVhciAwLjNzIGZvcndhcmRzIHZqcy1zcGlubmVyLXNob3c7IH0KCi52anMtbG9hZGluZy1zcGlubmVyOmJlZm9yZSwKLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIgewogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBtYXJnaW46IC02cHg7CiAgYm94LXNpemluZzogaW5oZXJpdDsKICB3aWR0aDogaW5oZXJpdDsKICBoZWlnaHQ6IGluaGVyaXQ7CiAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICBvcGFjaXR5OiAxOwogIGJvcmRlcjogaW5oZXJpdDsKICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci10b3AtY29sb3I6IHdoaXRlOyB9CgoudmpzLXNlZWtpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YmVmb3JlLAoudmpzLXNlZWtpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIsCi52anMtd2FpdGluZyAudmpzLWxvYWRpbmctc3Bpbm5lcjpiZWZvcmUsCi52anMtd2FpdGluZyAudmpzLWxvYWRpbmctc3Bpbm5lcjphZnRlciB7CiAgLXdlYmtpdC1hbmltYXRpb246IHZqcy1zcGlubmVyLXNwaW4gMS4xcyBjdWJpYy1iZXppZXIoMC42LCAwLjIsIDAsIDAuOCkgaW5maW5pdGUsIHZqcy1zcGlubmVyLWZhZGUgMS4xcyBsaW5lYXIgaW5maW5pdGU7CiAgYW5pbWF0aW9uOiB2anMtc3Bpbm5lci1zcGluIDEuMXMgY3ViaWMtYmV6aWVyKDAuNiwgMC4yLCAwLCAwLjgpIGluZmluaXRlLCB2anMtc3Bpbm5lci1mYWRlIDEuMXMgbGluZWFyIGluZmluaXRlOyB9CgoudmpzLXNlZWtpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YmVmb3JlLAoudmpzLXdhaXRpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YmVmb3JlIHsKICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTsgfQoKLnZqcy1zZWVraW5nIC52anMtbG9hZGluZy1zcGlubmVyOmFmdGVyLAoudmpzLXdhaXRpbmcgLnZqcy1sb2FkaW5nLXNwaW5uZXI6YWZ0ZXIgewogIGJvcmRlci10b3AtY29sb3I6IHdoaXRlOwogIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjQ0czsKICBhbmltYXRpb24tZGVsYXk6IDAuNDRzOyB9CgpAa2V5ZnJhbWVzIHZqcy1zcGlubmVyLXNob3cgewogIHRvIHsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7IH0gfQoKQC13ZWJraXQta2V5ZnJhbWVzIHZqcy1zcGlubmVyLXNob3cgewogIHRvIHsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7IH0gfQoKQGtleWZyYW1lcyB2anMtc3Bpbm5lci1zcGluIHsKICAxMDAlIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0gfQoKQC13ZWJraXQta2V5ZnJhbWVzIHZqcy1zcGlubmVyLXNwaW4gewogIDEwMCUgewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH0KCkBrZXlmcmFtZXMgdmpzLXNwaW5uZXItZmFkZSB7CiAgMCUgewogICAgYm9yZGVyLXRvcC1jb2xvcjogIzczODU5ZjsgfQogIDIwJSB7CiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmOyB9CiAgMzUlIHsKICAgIGJvcmRlci10b3AtY29sb3I6IHdoaXRlOyB9CiAgNjAlIHsKICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7IH0KICAxMDAlIHsKICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7IH0gfQoKQC13ZWJraXQta2V5ZnJhbWVzIHZqcy1zcGlubmVyLWZhZGUgewogIDAlIHsKICAgIGJvcmRlci10b3AtY29sb3I6ICM3Mzg1OWY7IH0KICAyMCUgewogICAgYm9yZGVyLXRvcC1jb2xvcjogIzczODU5ZjsgfQogIDM1JSB7CiAgICBib3JkZXItdG9wLWNvbG9yOiB3aGl0ZTsgfQogIDYwJSB7CiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmOyB9CiAgMTAwJSB7CiAgICBib3JkZXItdG9wLWNvbG9yOiAjNzM4NTlmOyB9IH0KCi52anMtY2hhcHRlcnMtYnV0dG9uIC52anMtbWVudSB1bCB7CiAgd2lkdGg6IDI0ZW07IH0KCi52aWRlby1qcyAudmpzLXN1YnMtY2Fwcy1idXR0b24gKyAudmpzLW1lbnUgLnZqcy1jYXB0aW9ucy1tZW51LWl0ZW0gLnZqcy1tZW51LWl0ZW0tdGV4dCAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQoKLnZpZGVvLWpzIC52anMtc3Vicy1jYXBzLWJ1dHRvbiArIC52anMtbWVudSAudmpzLWNhcHRpb25zLW1lbnUtaXRlbSAudmpzLW1lbnUtaXRlbS10ZXh0IC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGZvbnQtZmFtaWx5OiBWaWRlb0pTOwogIGNvbnRlbnQ6ICJcZjEwZCI7CiAgZm9udC1zaXplOiAxLjVlbTsKICBsaW5lLWhlaWdodDogaW5oZXJpdDsgfQoKLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLWN1c3RvbS1jb250cm9sLXNwYWNlciB7CiAgLXdlYmtpdC1ib3gtZmxleDogYXV0bzsKICAtbW96LWJveC1mbGV4OiBhdXRvOwogIC13ZWJraXQtZmxleDogYXV0bzsKICAtbXMtZmxleDogYXV0bzsKICBmbGV4OiBhdXRvOyB9CgoudmlkZW8tanMudmpzLWxheW91dC10aW55Om5vdCgudmpzLWZ1bGxzY3JlZW4pLnZqcy1uby1mbGV4IC52anMtY3VzdG9tLWNvbnRyb2wtc3BhY2VyIHsKICB3aWR0aDogYXV0bzsgfQoKLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLWN1cnJlbnQtdGltZSwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXRpbWUtZGl2aWRlciwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLWR1cmF0aW9uLCAudmlkZW8tanMudmpzLWxheW91dC10aW55Om5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtcmVtYWluaW5nLXRpbWUsCi52aWRlby1qcy52anMtbGF5b3V0LXRpbnk6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1wbGF5YmFjay1yYXRlLCAudmlkZW8tanMudmpzLWxheW91dC10aW55Om5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtcHJvZ3Jlc3MtY29udHJvbCwKLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLW11dGUtY29udHJvbCwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXZvbHVtZS1jb250cm9sLAoudmlkZW8tanMudmpzLWxheW91dC10aW55Om5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtY2hhcHRlcnMtYnV0dG9uLCAudmlkZW8tanMudmpzLWxheW91dC10aW55Om5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbiwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLWNhcHRpb25zLWJ1dHRvbiwKLnZpZGVvLWpzLnZqcy1sYXlvdXQtdGlueTpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXN1YnRpdGxlcy1idXR0b24sIC52aWRlby1qcy52anMtbGF5b3V0LXRpbnk6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1hdWRpby1idXR0b24gewogIGRpc3BsYXk6IG5vbmU7IH0KCi52aWRlby1qcy52anMtbGF5b3V0LXgtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1jdXJyZW50LXRpbWUsIC52aWRlby1qcy52anMtbGF5b3V0LXgtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy10aW1lLWRpdmlkZXIsIC52aWRlby1qcy52anMtbGF5b3V0LXgtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1kdXJhdGlvbiwgLnZpZGVvLWpzLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXJlbWFpbmluZy10aW1lLAoudmlkZW8tanMudmpzLWxheW91dC14LXNtYWxsOm5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtcGxheWJhY2stcmF0ZSwKLnZpZGVvLWpzLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLW11dGUtY29udHJvbCwgLnZpZGVvLWpzLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXZvbHVtZS1jb250cm9sLAoudmlkZW8tanMudmpzLWxheW91dC14LXNtYWxsOm5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtY2hhcHRlcnMtYnV0dG9uLCAudmlkZW8tanMudmpzLWxheW91dC14LXNtYWxsOm5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbiwgLnZpZGVvLWpzLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLWNhcHRpb25zLWJ1dHRvbiwKLnZpZGVvLWpzLnZqcy1sYXlvdXQteC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXN1YnRpdGxlcy1idXR0b24sIC52aWRlby1qcy52anMtbGF5b3V0LXgtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1hdWRpby1idXR0b24gewogIGRpc3BsYXk6IG5vbmU7IH0KCi52aWRlby1qcy52anMtbGF5b3V0LXNtYWxsOm5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtY3VycmVudC10aW1lLCAudmlkZW8tanMudmpzLWxheW91dC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLXRpbWUtZGl2aWRlciwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1kdXJhdGlvbiwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1yZW1haW5pbmctdGltZSwKLnZpZGVvLWpzLnZqcy1sYXlvdXQtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1wbGF5YmFjay1yYXRlLAoudmlkZW8tanMudmpzLWxheW91dC1zbWFsbDpub3QoLnZqcy1mdWxsc2NyZWVuKSAudmpzLW11dGUtY29udHJvbCwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy12b2x1bWUtY29udHJvbCwKLnZpZGVvLWpzLnZqcy1sYXlvdXQtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1jaGFwdGVycy1idXR0b24sIC52aWRlby1qcy52anMtbGF5b3V0LXNtYWxsOm5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtZGVzY3JpcHRpb25zLWJ1dHRvbiwgLnZpZGVvLWpzLnZqcy1sYXlvdXQtc21hbGw6bm90KC52anMtZnVsbHNjcmVlbikgLnZqcy1jYXB0aW9ucy1idXR0b24sCi52aWRlby1qcy52anMtbGF5b3V0LXNtYWxsOm5vdCgudmpzLWZ1bGxzY3JlZW4pIC52anMtc3VidGl0bGVzLWJ1dHRvbiAudmpzLWF1ZGlvLWJ1dHRvbiB7CiAgZGlzcGxheTogbm9uZTsgfQoKLnZqcy1tb2RhbC1kaWFsb2cudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgewogIGJhY2tncm91bmQtY29sb3I6ICMyQjMzM0Y7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg0MywgNTEsIDYzLCAwLjc1KTsKICBjb2xvcjogI2ZmZjsKICBoZWlnaHQ6IDcwJTsgfQoKLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIC52anMtbW9kYWwtZGlhbG9nLWNvbnRlbnQgewogIGRpc3BsYXk6IHRhYmxlOyB9CgoudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy10cmFjay1zZXR0aW5ncy1jb2xvcnMsCi52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLXRyYWNrLXNldHRpbmdzLWZvbnQsCi52anMtdGV4dC10cmFjay1zZXR0aW5ncyAudmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIHsKICBkaXNwbGF5OiB0YWJsZS1jZWxsOyB9CgoudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsgfQoKLnZqcy10ZXh0LXRyYWNrLXNldHRpbmdzIGZpZWxkc2V0IHsKICBtYXJnaW46IDVweDsKICBwYWRkaW5nOiAzcHg7CiAgYm9yZGVyOiBub25lOyB9CgoudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgZmllbGRzZXQgc3BhbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiA1cHg7IH0KCi52anMtdGV4dC10cmFjay1zZXR0aW5ncyBsZWdlbmQgewogIGNvbG9yOiAjZmZmOwogIG1hcmdpbjogMCAwIDVweCAwOyB9CgoudmpzLXRleHQtdHJhY2stc2V0dGluZ3MgLnZqcy1sYWJlbCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsKICBjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgcGFkZGluZzogMDsKICBib3JkZXI6IDA7CiAgaGVpZ2h0OiAxcHg7CiAgd2lkdGg6IDFweDsKICBvdmVyZmxvdzogaGlkZGVuOyB9CgoudmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIGJ1dHRvbjpmb2N1cywKLnZqcy10cmFjay1zZXR0aW5ncy1jb250cm9scyBidXR0b246YWN0aXZlIHsKICBvdXRsaW5lLXN0eWxlOiBzb2xpZDsKICBvdXRsaW5lLXdpZHRoOiBtZWRpdW07CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDBkZWcsICNmZmYgODglLCAjNzM4NTlmIDEwMCUpOyB9CgoudmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIGJ1dHRvbjpob3ZlciB7CiAgY29sb3I6IHJnYmEoNDMsIDUxLCA2MywgMC43NSk7IH0KCi52anMtdHJhY2stc2V0dGluZ3MtY29udHJvbHMgYnV0dG9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgtMTgwZGVnLCAjZmZmIDg4JSwgIzczODU5ZiAxMDAlKTsKICBjb2xvcjogIzJCMzMzRjsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyLXJhZGl1czogMnB4OyB9CgoudmpzLXRyYWNrLXNldHRpbmdzLWNvbnRyb2xzIC52anMtZGVmYXVsdC1idXR0b24gewogIG1hcmdpbi1yaWdodDogMWVtOyB9CgpAbWVkaWEgcHJpbnQgewogIC52aWRlby1qcyA+ICo6bm90KC52anMtdGVjaCk6bm90KC52anMtcG9zdGVyKSB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47IH0gfQoKQG1lZGlhIFwwc2NyZWVuIHsKICAudmpzLXVzZXItaW5hY3RpdmUudmpzLXBsYXlpbmcgLnZqcy1jb250cm9sLWJhciA6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogIH0KfQoKQG1lZGlhIFwwc2NyZWVuIHsKICAudmpzLWhhcy1zdGFydGVkLnZqcy11c2VyLWluYWN0aXZlLnZqcy1wbGF5aW5nIC52anMtY29udHJvbC1iYXIgewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogIH0KfQo="}},"time_used":293,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":293,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/mod.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.282Z","timestamp":1785147795282,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/mod.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sat, 06 Jul 2024 09:33:41 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 290\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":815,"size_decoded":826,"mime_type":"text/css","magic":"ASCII text","md5":"7bd1612595522f56dcca5a9a85e18cc8","sha1":"7738da2b4c6ae3ecfcdc083c605821a58ae36e22","sha256":"0f5d0b7ac0b50c84e50432be706e01571edb6d47b120aaf1a4904802cb277860","sha512":"932085f768451f69c5f8b949708c76f901f95217bef8e9af6c05a4488158c3cbd1585ba3573b8579571fad2c3f63427dfbb3930905ea3e99fb6bcb73a0996f5b","ssdeep":"","tlshash":"7201495d4bbb1604ea6bc0a81fbe27462319948b429eca047fc16208cf86045d8a3bdd","first_seen":"2025-05-31T01:51:37.485178Z","last_seen":"2026-08-11T00:25:55.221373Z","times_seen":25,"resource_available":false,"data":"LmxvZ28tbW9kIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDI5MHB4OwogICAgaGVpZ2h0OiA0OHB4OwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubG9nby1tb2QgLmxvZ28tcGFkIHsKICAgIHdpZHRoOiA2MCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBsZWZ0OiAzMCU7CiAgICByaWdodDogMTAlOwogICAgZGlzcGxheTogZmxleDsKfQoKLmxvZ28tbW9kIGltZyB7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCi5sb2dvLW1vZCAubG9nby10ZXh0IHsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKICAgIGhlaWdodDogODAlOwogICAgbWFyZ2luLXRvcDogYXV0bzsKICAgIG1hcmdpbi1ib3R0b206IGF1dG87CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0Owp9CgoubG9nby1tb2QgLmxvZ28tdGV4dCBzcGFuIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiA5MDA7CiAgICBsaW5lLWhlaWdodDogaW5pdGlhbDsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBjb2xvcjogI2ZmZjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogNHB4Owp9CgoubG9nby1tb2QgLmxvZ28tdGV4dCBzcGFuLnNwYWNlLW91dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0="}},"time_used":289,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":289,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/owl.carousel.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.303Z","timestamp":1785147795303,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/owl.carousel.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 6271\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":23890,"size_decoded":6815,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (635)","md5":"88d0fe722f04973e2888b58a63aa0570","sha1":"f947512e51f8ef4b15bba3f701de64e53a7f7f9b","sha256":"e0e2bc4e1d3ee5024c4e1aa58a6cad9aa42fc63a8c89ce18013a1c8f2b94875c","sha512":"f425865c5489fbf5f42d6cd2442645b0e3e149f9ba8db9cbf8ca6aa34a3c29ed9262bf2b093a9be3fc069bef67d771ed0c4d4d4290043ab31e703670e055d01a","ssdeep":"384:SKwx0bG/ON7gum0tQt8RYgKpJz8vYHpElIVombV:y//ONetpb8QHpEqj","tlshash":"afb2a54bb2242345069372b9419b110d713bfb78fc41855c70badadfaa4b84e9277b3d","first_seen":"2023-03-07T01:07:29Z","last_seen":"2026-08-14T15:20:47.742346Z","times_seen":11335,"resource_available":true,"data":"ImZ1bmN0aW9uIiE9PXR5cGVvZiBPYmplY3QuY3JlYXRlJiYoT2JqZWN0LmNyZWF0ZT1mdW5jdGlvbihmKXtmdW5jdGlvbiBnKCl7fWcucHJvdG90eXBlPWY7cmV0dXJuIG5ldyBnfSk7CihmdW5jdGlvbihmLGcsayl7dmFyIGw9e2luaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLiRlbGVtPWYoYik7dGhpcy5vcHRpb25zPWYuZXh0ZW5kKHt9LGYuZm4ub3dsQ2Fyb3VzZWwub3B0aW9ucyx0aGlzLiRlbGVtLmRhdGEoKSxhKTt0aGlzLnVzZXJPcHRpb25zPWE7dGhpcy5sb2FkQ29udGVudCgpfSxsb2FkQ29udGVudDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7dmFyIGQsZT0iIjtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIub3B0aW9ucy5qc29uU3VjY2VzcyliLm9wdGlvbnMuanNvblN1Y2Nlc3MuYXBwbHkodGhpcyxbYV0pO2Vsc2V7Zm9yKGQgaW4gYS5vd2wpYS5vd2wuaGFzT3duUHJvcGVydHkoZCkmJihlKz1hLm93bFtkXS5pdGVtKTtiLiRlbGVtLmh0bWwoZSl9Yi5sb2dJbigpfXZhciBiPXRoaXMsZTsiZnVuY3Rpb24iPT09dHlwZW9mIGIub3B0aW9ucy5iZWZvcmVJbml0JiZiLm9wdGlvbnMuYmVmb3JlSW5pdC5hcHBseSh0aGlzLFtiLiRlbGVtXSk7InN0cmluZyI9PT10eXBlb2YgYi5vcHRpb25zLmpzb25QYXRoPwooZT1iLm9wdGlvbnMuanNvblBhdGgsZi5nZXRKU09OKGUsYSkpOmIubG9nSW4oKX0sbG9nSW46ZnVuY3Rpb24oKXt0aGlzLiRlbGVtLmRhdGEoIm93bC1vcmlnaW5hbFN0eWxlcyIsdGhpcy4kZWxlbS5hdHRyKCJzdHlsZSIpKTt0aGlzLiRlbGVtLmRhdGEoIm93bC1vcmlnaW5hbENsYXNzZXMiLHRoaXMuJGVsZW0uYXR0cigiY2xhc3MiKSk7dGhpcy4kZWxlbS5jc3Moe29wYWNpdHk6MH0pO3RoaXMub3JpZ25hbEl0ZW1zPXRoaXMub3B0aW9ucy5pdGVtczt0aGlzLmNoZWNrQnJvd3NlcigpO3RoaXMud3JhcHBlcldpZHRoPTA7dGhpcy5jaGVja1Zpc2libGU9bnVsbDt0aGlzLnNldFZhcnMoKX0sc2V0VmFyczpmdW5jdGlvbigpe2lmKDA9PT10aGlzLiRlbGVtLmNoaWxkcmVuKCkubGVuZ3RoKXJldHVybiExO3RoaXMuYmFzZUNsYXNzKCk7dGhpcy5ldmVudFR5cGVzKCk7dGhpcy4kdXNlckl0ZW1zPXRoaXMuJGVsZW0uY2hpbGRyZW4oKTt0aGlzLml0ZW1zQW1vdW50PXRoaXMuJHVzZXJJdGVtcy5sZW5ndGg7CnRoaXMud3JhcEl0ZW1zKCk7dGhpcy4kb3dsSXRlbXM9dGhpcy4kZWxlbS5maW5kKCIub3dsLWl0ZW0iKTt0aGlzLiRvd2xXcmFwcGVyPXRoaXMuJGVsZW0uZmluZCgiLm93bC13cmFwcGVyIik7dGhpcy5wbGF5RGlyZWN0aW9uPSJuZXh0Ijt0aGlzLnByZXZJdGVtPTA7dGhpcy5wcmV2QXJyPVswXTt0aGlzLmN1cnJlbnRJdGVtPTA7dGhpcy5jdXN0b21FdmVudHMoKTt0aGlzLm9uU3RhcnR1cCgpfSxvblN0YXJ0dXA6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZUl0ZW1zKCk7dGhpcy5jYWxjdWxhdGVBbGwoKTt0aGlzLmJ1aWxkQ29udHJvbHMoKTt0aGlzLnVwZGF0ZUNvbnRyb2xzKCk7dGhpcy5yZXNwb25zZSgpO3RoaXMubW92ZUV2ZW50cygpO3RoaXMuc3RvcE9uSG92ZXIoKTt0aGlzLm93bFN0YXR1cygpOyExIT09dGhpcy5vcHRpb25zLnRyYW5zaXRpb25TdHlsZSYmdGhpcy50cmFuc2l0aW9uVHlwZXModGhpcy5vcHRpb25zLnRyYW5zaXRpb25TdHlsZSk7ITA9PT10aGlzLm9wdGlvbnMuYXV0b1BsYXkmJgoodGhpcy5vcHRpb25zLmF1dG9QbGF5PTVFMyk7dGhpcy5wbGF5KCk7dGhpcy4kZWxlbS5maW5kKCIub3dsLXdyYXBwZXIiKS5jc3MoImRpc3BsYXkiLCJibG9jayIpO3RoaXMuJGVsZW0uaXMoIjp2aXNpYmxlIik/dGhpcy4kZWxlbS5jc3MoIm9wYWNpdHkiLDEpOnRoaXMud2F0Y2hWaXNpYmlsaXR5KCk7dGhpcy5vbnN0YXJ0dXA9ITE7dGhpcy5lYWNoTW92ZVVwZGF0ZSgpOyJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5vcHRpb25zLmFmdGVySW5pdCYmdGhpcy5vcHRpb25zLmFmdGVySW5pdC5hcHBseSh0aGlzLFt0aGlzLiRlbGVtXSl9LGVhY2hNb3ZlVXBkYXRlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLm9wdGlvbnMubGF6eUxvYWQmJnRoaXMubGF6eUxvYWQoKTshMD09PXRoaXMub3B0aW9ucy5hdXRvSGVpZ2h0JiZ0aGlzLmF1dG9IZWlnaHQoKTt0aGlzLm9uVmlzaWJsZUl0ZW1zKCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm9wdGlvbnMuYWZ0ZXJBY3Rpb24mJnRoaXMub3B0aW9ucy5hZnRlckFjdGlvbi5hcHBseSh0aGlzLApbdGhpcy4kZWxlbV0pfSx1cGRhdGVWYXJzOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlJiZ0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLmFwcGx5KHRoaXMsW3RoaXMuJGVsZW1dKTt0aGlzLndhdGNoVmlzaWJpbGl0eSgpO3RoaXMudXBkYXRlSXRlbXMoKTt0aGlzLmNhbGN1bGF0ZUFsbCgpO3RoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLnVwZGF0ZUNvbnRyb2xzKCk7dGhpcy5lYWNoTW92ZVVwZGF0ZSgpOyJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5vcHRpb25zLmFmdGVyVXBkYXRlJiZ0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGUuYXBwbHkodGhpcyxbdGhpcy4kZWxlbV0pfSxyZWxvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2cuc2V0VGltZW91dChmdW5jdGlvbigpe2EudXBkYXRlVmFycygpfSwwKX0sd2F0Y2hWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZighMT09PWEuJGVsZW0uaXMoIjp2aXNpYmxlIikpYS4kZWxlbS5jc3Moe29wYWNpdHk6MH0pLApnLmNsZWFySW50ZXJ2YWwoYS5hdXRvUGxheUludGVydmFsKSxnLmNsZWFySW50ZXJ2YWwoYS5jaGVja1Zpc2libGUpO2Vsc2UgcmV0dXJuITE7YS5jaGVja1Zpc2libGU9Zy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe2EuJGVsZW0uaXMoIjp2aXNpYmxlIikmJihhLnJlbG9hZCgpLGEuJGVsZW0uYW5pbWF0ZSh7b3BhY2l0eToxfSwyMDApLGcuY2xlYXJJbnRlcnZhbChhLmNoZWNrVmlzaWJsZSkpfSw1MDApfSx3cmFwSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLiR1c2VySXRlbXMud3JhcEFsbCgnPGRpdiBjbGFzcz0ib3dsLXdyYXBwZXIiPicpLndyYXAoJzxkaXYgY2xhc3M9Im93bC1pdGVtIj48L2Rpdj4nKTt0aGlzLiRlbGVtLmZpbmQoIi5vd2wtd3JhcHBlciIpLndyYXAoJzxkaXYgY2xhc3M9Im93bC13cmFwcGVyLW91dGVyIj4nKTt0aGlzLndyYXBwZXJPdXRlcj10aGlzLiRlbGVtLmZpbmQoIi5vd2wtd3JhcHBlci1vdXRlciIpO3RoaXMuJGVsZW0uY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sCmJhc2VDbGFzczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGVsZW0uaGFzQ2xhc3ModGhpcy5vcHRpb25zLmJhc2VDbGFzcyksYj10aGlzLiRlbGVtLmhhc0NsYXNzKHRoaXMub3B0aW9ucy50aGVtZSk7YXx8dGhpcy4kZWxlbS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYmFzZUNsYXNzKTtifHx0aGlzLiRlbGVtLmFkZENsYXNzKHRoaXMub3B0aW9ucy50aGVtZSl9LHVwZGF0ZUl0ZW1zOmZ1bmN0aW9uKCl7dmFyIGEsYjtpZighMT09PXRoaXMub3B0aW9ucy5yZXNwb25zaXZlKXJldHVybiExO2lmKCEwPT09dGhpcy5vcHRpb25zLnNpbmdsZUl0ZW0pcmV0dXJuIHRoaXMub3B0aW9ucy5pdGVtcz10aGlzLm9yaWduYWxJdGVtcz0xLHRoaXMub3B0aW9ucy5pdGVtc0N1c3RvbT0hMSx0aGlzLm9wdGlvbnMuaXRlbXNEZXNrdG9wPSExLHRoaXMub3B0aW9ucy5pdGVtc0Rlc2t0b3BTbWFsbD0hMSx0aGlzLm9wdGlvbnMuaXRlbXNUYWJsZXQ9ITEsdGhpcy5vcHRpb25zLml0ZW1zVGFibGV0U21hbGw9CiExLHRoaXMub3B0aW9ucy5pdGVtc01vYmlsZT0hMTthPWYodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlV2lkdGgpLndpZHRoKCk7YT4odGhpcy5vcHRpb25zLml0ZW1zRGVza3RvcFswXXx8dGhpcy5vcmlnbmFsSXRlbXMpJiYodGhpcy5vcHRpb25zLml0ZW1zPXRoaXMub3JpZ25hbEl0ZW1zKTtpZighMSE9PXRoaXMub3B0aW9ucy5pdGVtc0N1c3RvbSlmb3IodGhpcy5vcHRpb25zLml0ZW1zQ3VzdG9tLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVswXS1iWzBdfSksYj0wO2I8dGhpcy5vcHRpb25zLml0ZW1zQ3VzdG9tLmxlbmd0aDtiKz0xKXRoaXMub3B0aW9ucy5pdGVtc0N1c3RvbVtiXVswXTw9YSYmKHRoaXMub3B0aW9ucy5pdGVtcz10aGlzLm9wdGlvbnMuaXRlbXNDdXN0b21bYl1bMV0pO2Vsc2UgYTw9dGhpcy5vcHRpb25zLml0ZW1zRGVza3RvcFswXSYmITEhPT10aGlzLm9wdGlvbnMuaXRlbXNEZXNrdG9wJiYodGhpcy5vcHRpb25zLml0ZW1zPXRoaXMub3B0aW9ucy5pdGVtc0Rlc2t0b3BbMV0pLAphPD10aGlzLm9wdGlvbnMuaXRlbXNEZXNrdG9wU21hbGxbMF0mJiExIT09dGhpcy5vcHRpb25zLml0ZW1zRGVza3RvcFNtYWxsJiYodGhpcy5vcHRpb25zLml0ZW1zPXRoaXMub3B0aW9ucy5pdGVtc0Rlc2t0b3BTbWFsbFsxXSksYTw9dGhpcy5vcHRpb25zLml0ZW1zVGFibGV0WzBdJiYhMSE9PXRoaXMub3B0aW9ucy5pdGVtc1RhYmxldCYmKHRoaXMub3B0aW9ucy5pdGVtcz10aGlzLm9wdGlvbnMuaXRlbXNUYWJsZXRbMV0pLGE8PXRoaXMub3B0aW9ucy5pdGVtc1RhYmxldFNtYWxsWzBdJiYhMSE9PXRoaXMub3B0aW9ucy5pdGVtc1RhYmxldFNtYWxsJiYodGhpcy5vcHRpb25zLml0ZW1zPXRoaXMub3B0aW9ucy5pdGVtc1RhYmxldFNtYWxsWzFdKSxhPD10aGlzLm9wdGlvbnMuaXRlbXNNb2JpbGVbMF0mJiExIT09dGhpcy5vcHRpb25zLml0ZW1zTW9iaWxlJiYodGhpcy5vcHRpb25zLml0ZW1zPXRoaXMub3B0aW9ucy5pdGVtc01vYmlsZVsxXSk7dGhpcy5vcHRpb25zLml0ZW1zPnRoaXMuaXRlbXNBbW91bnQmJgohMD09PXRoaXMub3B0aW9ucy5pdGVtc1NjYWxlVXAmJih0aGlzLm9wdGlvbnMuaXRlbXM9dGhpcy5pdGVtc0Ftb3VudCl9LHJlc3BvbnNlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiLGU7aWYoITAhPT1hLm9wdGlvbnMucmVzcG9uc2l2ZSlyZXR1cm4hMTtlPWYoZykud2lkdGgoKTthLnJlc2l6ZXI9ZnVuY3Rpb24oKXtmKGcpLndpZHRoKCkhPT1lJiYoITEhPT1hLm9wdGlvbnMuYXV0b1BsYXkmJmcuY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5SW50ZXJ2YWwpLGcuY2xlYXJUaW1lb3V0KGIpLGI9Zy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1mKGcpLndpZHRoKCk7YS51cGRhdGVWYXJzKCl9LGEub3B0aW9ucy5yZXNwb25zaXZlUmVmcmVzaFJhdGUpKX07ZihnKS5yZXNpemUoYS5yZXNpemVyKX0sdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmp1bXBUbyh0aGlzLmN1cnJlbnRJdGVtKTshMSE9PXRoaXMub3B0aW9ucy5hdXRvUGxheSYmdGhpcy5jaGVja0FwKCl9LGFwcGVuZEl0ZW1zU2l6ZXM6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcyxiPTAsZT1hLml0ZW1zQW1vdW50LWEub3B0aW9ucy5pdGVtczthLiRvd2xJdGVtcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWYodGhpcyk7ZC5jc3Moe3dpZHRoOmEuaXRlbVdpZHRofSkuZGF0YSgib3dsLWl0ZW0iLE51bWJlcihjKSk7aWYoMD09PWMlYS5vcHRpb25zLml0ZW1zfHxjPT09ZSljPmV8fChiKz0xKTtkLmRhdGEoIm93bC1yb3VuZFBhZ2VzIixiKX0pfSxhcHBlbmRXcmFwcGVyU2l6ZXM6ZnVuY3Rpb24oKXt0aGlzLiRvd2xXcmFwcGVyLmNzcyh7d2lkdGg6dGhpcy4kb3dsSXRlbXMubGVuZ3RoKnRoaXMuaXRlbVdpZHRoKjIsbGVmdDowfSk7dGhpcy5hcHBlbmRJdGVtc1NpemVzKCl9LGNhbGN1bGF0ZUFsbDpmdW5jdGlvbigpe3RoaXMuY2FsY3VsYXRlV2lkdGgoKTt0aGlzLmFwcGVuZFdyYXBwZXJTaXplcygpO3RoaXMubG9vcHMoKTt0aGlzLm1heCgpfSxjYWxjdWxhdGVXaWR0aDpmdW5jdGlvbigpe3RoaXMuaXRlbVdpZHRoPU1hdGgucm91bmQodGhpcy4kZWxlbS53aWR0aCgpLwp0aGlzLm9wdGlvbnMuaXRlbXMpfSxtYXg6ZnVuY3Rpb24oKXt2YXIgYT0tMSoodGhpcy5pdGVtc0Ftb3VudCp0aGlzLml0ZW1XaWR0aC10aGlzLm9wdGlvbnMuaXRlbXMqdGhpcy5pdGVtV2lkdGgpO3RoaXMub3B0aW9ucy5pdGVtcz50aGlzLml0ZW1zQW1vdW50P3RoaXMubWF4aW11bVBpeGVscz1hPXRoaXMubWF4aW11bUl0ZW09MDoodGhpcy5tYXhpbXVtSXRlbT10aGlzLml0ZW1zQW1vdW50LXRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLm1heGltdW1QaXhlbHM9YSk7cmV0dXJuIGF9LG1pbjpmdW5jdGlvbigpe3JldHVybiAwfSxsb29wczpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGUsYzt0aGlzLnBvc2l0aW9uc0luQXJyYXk9WzBdO3RoaXMucGFnZXNJbkFycmF5PVtdO2ZvcihlPTA7ZTx0aGlzLml0ZW1zQW1vdW50O2UrPTEpYis9dGhpcy5pdGVtV2lkdGgsdGhpcy5wb3NpdGlvbnNJbkFycmF5LnB1c2goLWIpLCEwPT09dGhpcy5vcHRpb25zLnNjcm9sbFBlclBhZ2UmJihjPWYodGhpcy4kb3dsSXRlbXNbZV0pLApjPWMuZGF0YSgib3dsLXJvdW5kUGFnZXMiKSxjIT09YSYmKHRoaXMucGFnZXNJbkFycmF5W2FdPXRoaXMucG9zaXRpb25zSW5BcnJheVtlXSxhPWMpKX0sYnVpbGRDb250cm9sczpmdW5jdGlvbigpe2lmKCEwPT09dGhpcy5vcHRpb25zLm5hdmlnYXRpb258fCEwPT09dGhpcy5vcHRpb25zLnBhZ2luYXRpb24pdGhpcy5vd2xDb250cm9scz1mKCc8ZGl2IGNsYXNzPSJvd2wtY29udHJvbHMiLz4nKS50b2dnbGVDbGFzcygiY2xpY2thYmxlIiwhdGhpcy5icm93c2VyLmlzVG91Y2gpLmFwcGVuZFRvKHRoaXMuJGVsZW0pOyEwPT09dGhpcy5vcHRpb25zLnBhZ2luYXRpb24mJnRoaXMuYnVpbGRQYWdpbmF0aW9uKCk7ITA9PT10aGlzLm9wdGlvbnMubmF2aWdhdGlvbiYmdGhpcy5idWlsZEJ1dHRvbnMoKX0sYnVpbGRCdXR0b25zOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWYoJzxkaXYgY2xhc3M9Im93bC1idXR0b25zIi8+Jyk7YS5vd2xDb250cm9scy5hcHBlbmQoYik7YS5idXR0b25QcmV2PQpmKCI8ZGl2Lz4iLHsiY2xhc3MiOiJvd2wtcHJldiIsaHRtbDphLm9wdGlvbnMubmF2aWdhdGlvblRleHRbMF18fCIifSk7YS5idXR0b25OZXh0PWYoIjxkaXYvPiIseyJjbGFzcyI6Im93bC1uZXh0IixodG1sOmEub3B0aW9ucy5uYXZpZ2F0aW9uVGV4dFsxXXx8IiJ9KTtiLmFwcGVuZChhLmJ1dHRvblByZXYpLmFwcGVuZChhLmJ1dHRvbk5leHQpO2Iub24oInRvdWNoc3RhcnQub3dsQ29udHJvbHMgbW91c2Vkb3duLm93bENvbnRyb2xzIiwnZGl2W2NsYXNzXj0ib3dsIl0nLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pO2Iub24oInRvdWNoZW5kLm93bENvbnRyb2xzIG1vdXNldXAub3dsQ29udHJvbHMiLCdkaXZbY2xhc3NePSJvd2wiXScsZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO2YodGhpcykuaGFzQ2xhc3MoIm93bC1uZXh0Iik/YS5uZXh0KCk6YS5wcmV2KCl9KX0sYnVpbGRQYWdpbmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpczthLnBhZ2luYXRpb25XcmFwcGVyPQpmKCc8ZGl2IGNsYXNzPSJvd2wtcGFnaW5hdGlvbiIvPicpO2Eub3dsQ29udHJvbHMuYXBwZW5kKGEucGFnaW5hdGlvbldyYXBwZXIpO2EucGFnaW5hdGlvbldyYXBwZXIub24oInRvdWNoZW5kLm93bENvbnRyb2xzIG1vdXNldXAub3dsQ29udHJvbHMiLCIub3dsLXBhZ2UiLGZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKTtOdW1iZXIoZih0aGlzKS5kYXRhKCJvd2wtcGFnZSIpKSE9PWEuY3VycmVudEl0ZW0mJmEuZ29UbyhOdW1iZXIoZih0aGlzKS5kYXRhKCJvd2wtcGFnZSIpKSwhMCl9KX0sdXBkYXRlUGFnaW5hdGlvbjpmdW5jdGlvbigpe3ZhciBhLGIsZSxjLGQsZztpZighMT09PXRoaXMub3B0aW9ucy5wYWdpbmF0aW9uKXJldHVybiExO3RoaXMucGFnaW5hdGlvbldyYXBwZXIuaHRtbCgiIik7YT0wO2I9dGhpcy5pdGVtc0Ftb3VudC10aGlzLml0ZW1zQW1vdW50JXRoaXMub3B0aW9ucy5pdGVtcztmb3IoYz0wO2M8dGhpcy5pdGVtc0Ftb3VudDtjKz0xKTA9PT1jJXRoaXMub3B0aW9ucy5pdGVtcyYmCihhKz0xLGI9PT1jJiYoZT10aGlzLml0ZW1zQW1vdW50LXRoaXMub3B0aW9ucy5pdGVtcyksZD1mKCI8ZGl2Lz4iLHsiY2xhc3MiOiJvd2wtcGFnZSJ9KSxnPWYoIjxzcGFuPjwvc3Bhbj4iLHt0ZXh0OiEwPT09dGhpcy5vcHRpb25zLnBhZ2luYXRpb25OdW1iZXJzP2E6IiIsImNsYXNzIjohMD09PXRoaXMub3B0aW9ucy5wYWdpbmF0aW9uTnVtYmVycz8ib3dsLW51bWJlcnMiOiIifSksZC5hcHBlbmQoZyksZC5kYXRhKCJvd2wtcGFnZSIsYj09PWM/ZTpjKSxkLmRhdGEoIm93bC1yb3VuZFBhZ2VzIixhKSx0aGlzLnBhZ2luYXRpb25XcmFwcGVyLmFwcGVuZChkKSk7dGhpcy5jaGVja1BhZ2luYXRpb24oKX0sY2hlY2tQYWdpbmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZighMT09PWEub3B0aW9ucy5wYWdpbmF0aW9uKXJldHVybiExO2EucGFnaW5hdGlvbldyYXBwZXIuZmluZCgiLm93bC1wYWdlIikuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZGF0YSgib3dsLXJvdW5kUGFnZXMiKT09PQpmKGEuJG93bEl0ZW1zW2EuY3VycmVudEl0ZW1dKS5kYXRhKCJvd2wtcm91bmRQYWdlcyIpJiYoYS5wYWdpbmF0aW9uV3JhcHBlci5maW5kKCIub3dsLXBhZ2UiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksZih0aGlzKS5hZGRDbGFzcygiYWN0aXZlIikpfSl9LGNoZWNrTmF2aWdhdGlvbjpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5vcHRpb25zLm5hdmlnYXRpb24pcmV0dXJuITE7ITE9PT10aGlzLm9wdGlvbnMucmV3aW5kTmF2JiYoMD09PXRoaXMuY3VycmVudEl0ZW0mJjA9PT10aGlzLm1heGltdW1JdGVtPyh0aGlzLmJ1dHRvblByZXYuYWRkQ2xhc3MoImRpc2FibGVkIiksdGhpcy5idXR0b25OZXh0LmFkZENsYXNzKCJkaXNhYmxlZCIpKTowPT09dGhpcy5jdXJyZW50SXRlbSYmMCE9PXRoaXMubWF4aW11bUl0ZW0/KHRoaXMuYnV0dG9uUHJldi5hZGRDbGFzcygiZGlzYWJsZWQiKSx0aGlzLmJ1dHRvbk5leHQucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOnRoaXMuY3VycmVudEl0ZW09PT0KdGhpcy5tYXhpbXVtSXRlbT8odGhpcy5idXR0b25QcmV2LnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLHRoaXMuYnV0dG9uTmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSk6MCE9PXRoaXMuY3VycmVudEl0ZW0mJnRoaXMuY3VycmVudEl0ZW0hPT10aGlzLm1heGltdW1JdGVtJiYodGhpcy5idXR0b25QcmV2LnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLHRoaXMuYnV0dG9uTmV4dC5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKSkpfSx1cGRhdGVDb250cm9sczpmdW5jdGlvbigpe3RoaXMudXBkYXRlUGFnaW5hdGlvbigpO3RoaXMuY2hlY2tOYXZpZ2F0aW9uKCk7dGhpcy5vd2xDb250cm9scyYmKHRoaXMub3B0aW9ucy5pdGVtcz49dGhpcy5pdGVtc0Ftb3VudD90aGlzLm93bENvbnRyb2xzLmhpZGUoKTp0aGlzLm93bENvbnRyb2xzLnNob3coKSl9LGRlc3Ryb3lDb250cm9sczpmdW5jdGlvbigpe3RoaXMub3dsQ29udHJvbHMmJnRoaXMub3dsQ29udHJvbHMucmVtb3ZlKCl9LG5leHQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc1RyYW5zaXRpb24pcmV0dXJuITE7CnRoaXMuY3VycmVudEl0ZW0rPSEwPT09dGhpcy5vcHRpb25zLnNjcm9sbFBlclBhZ2U/dGhpcy5vcHRpb25zLml0ZW1zOjE7aWYodGhpcy5jdXJyZW50SXRlbT50aGlzLm1heGltdW1JdGVtKyghMD09PXRoaXMub3B0aW9ucy5zY3JvbGxQZXJQYWdlP3RoaXMub3B0aW9ucy5pdGVtcy0xOjApKWlmKCEwPT09dGhpcy5vcHRpb25zLnJld2luZE5hdil0aGlzLmN1cnJlbnRJdGVtPTAsYT0icmV3aW5kIjtlbHNlIHJldHVybiB0aGlzLmN1cnJlbnRJdGVtPXRoaXMubWF4aW11bUl0ZW0sITE7dGhpcy5nb1RvKHRoaXMuY3VycmVudEl0ZW0sYSl9LHByZXY6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc1RyYW5zaXRpb24pcmV0dXJuITE7dGhpcy5jdXJyZW50SXRlbT0hMD09PXRoaXMub3B0aW9ucy5zY3JvbGxQZXJQYWdlJiYwPHRoaXMuY3VycmVudEl0ZW0mJnRoaXMuY3VycmVudEl0ZW08dGhpcy5vcHRpb25zLml0ZW1zPzA6dGhpcy5jdXJyZW50SXRlbS0oITA9PT10aGlzLm9wdGlvbnMuc2Nyb2xsUGVyUGFnZT8KdGhpcy5vcHRpb25zLml0ZW1zOjEpO2lmKDA+dGhpcy5jdXJyZW50SXRlbSlpZighMD09PXRoaXMub3B0aW9ucy5yZXdpbmROYXYpdGhpcy5jdXJyZW50SXRlbT10aGlzLm1heGltdW1JdGVtLGE9InJld2luZCI7ZWxzZSByZXR1cm4gdGhpcy5jdXJyZW50SXRlbT0wLCExO3RoaXMuZ29Ubyh0aGlzLmN1cnJlbnRJdGVtLGEpfSxnb1RvOmZ1bmN0aW9uKGEsYixlKXt2YXIgYz10aGlzO2lmKGMuaXNUcmFuc2l0aW9uKXJldHVybiExOyJmdW5jdGlvbiI9PT10eXBlb2YgYy5vcHRpb25zLmJlZm9yZU1vdmUmJmMub3B0aW9ucy5iZWZvcmVNb3ZlLmFwcGx5KHRoaXMsW2MuJGVsZW1dKTthPj1jLm1heGltdW1JdGVtP2E9Yy5tYXhpbXVtSXRlbTowPj1hJiYoYT0wKTtjLmN1cnJlbnRJdGVtPWMub3dsLmN1cnJlbnRJdGVtPWE7aWYoITEhPT1jLm9wdGlvbnMudHJhbnNpdGlvblN0eWxlJiYiZHJhZyIhPT1lJiYxPT09Yy5vcHRpb25zLml0ZW1zJiYhMD09PWMuYnJvd3Nlci5zdXBwb3J0M2QpcmV0dXJuIGMuc3dhcFNwZWVkKDApLAohMD09PWMuYnJvd3Nlci5zdXBwb3J0M2Q/Yy50cmFuc2l0aW9uM2QoYy5wb3NpdGlvbnNJbkFycmF5W2FdKTpjLmNzczJzbGlkZShjLnBvc2l0aW9uc0luQXJyYXlbYV0sMSksYy5hZnRlckdvKCksYy5zaW5nbGVJdGVtVHJhbnNpdGlvbigpLCExO2E9Yy5wb3NpdGlvbnNJbkFycmF5W2FdOyEwPT09Yy5icm93c2VyLnN1cHBvcnQzZD8oYy5pc0NzczNGaW5pc2g9ITEsITA9PT1iPyhjLnN3YXBTcGVlZCgicGFnaW5hdGlvblNwZWVkIiksZy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5pc0NzczNGaW5pc2g9ITB9LGMub3B0aW9ucy5wYWdpbmF0aW9uU3BlZWQpKToicmV3aW5kIj09PWI/KGMuc3dhcFNwZWVkKGMub3B0aW9ucy5yZXdpbmRTcGVlZCksZy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5pc0NzczNGaW5pc2g9ITB9LGMub3B0aW9ucy5yZXdpbmRTcGVlZCkpOihjLnN3YXBTcGVlZCgic2xpZGVTcGVlZCIpLGcuc2V0VGltZW91dChmdW5jdGlvbigpe2MuaXNDc3MzRmluaXNoPSEwfSwKYy5vcHRpb25zLnNsaWRlU3BlZWQpKSxjLnRyYW5zaXRpb24zZChhKSk6ITA9PT1iP2MuY3NzMnNsaWRlKGEsYy5vcHRpb25zLnBhZ2luYXRpb25TcGVlZCk6InJld2luZCI9PT1iP2MuY3NzMnNsaWRlKGEsYy5vcHRpb25zLnJld2luZFNwZWVkKTpjLmNzczJzbGlkZShhLGMub3B0aW9ucy5zbGlkZVNwZWVkKTtjLmFmdGVyR28oKX0sanVtcFRvOmZ1bmN0aW9uKGEpeyJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5vcHRpb25zLmJlZm9yZU1vdmUmJnRoaXMub3B0aW9ucy5iZWZvcmVNb3ZlLmFwcGx5KHRoaXMsW3RoaXMuJGVsZW1dKTthPj10aGlzLm1heGltdW1JdGVtfHwtMT09PWE/YT10aGlzLm1heGltdW1JdGVtOjA+PWEmJihhPTApO3RoaXMuc3dhcFNwZWVkKDApOyEwPT09dGhpcy5icm93c2VyLnN1cHBvcnQzZD90aGlzLnRyYW5zaXRpb24zZCh0aGlzLnBvc2l0aW9uc0luQXJyYXlbYV0pOnRoaXMuY3NzMnNsaWRlKHRoaXMucG9zaXRpb25zSW5BcnJheVthXSwxKTt0aGlzLmN1cnJlbnRJdGVtPQp0aGlzLm93bC5jdXJyZW50SXRlbT1hO3RoaXMuYWZ0ZXJHbygpfSxhZnRlckdvOmZ1bmN0aW9uKCl7dGhpcy5wcmV2QXJyLnB1c2godGhpcy5jdXJyZW50SXRlbSk7dGhpcy5wcmV2SXRlbT10aGlzLm93bC5wcmV2SXRlbT10aGlzLnByZXZBcnJbdGhpcy5wcmV2QXJyLmxlbmd0aC0yXTt0aGlzLnByZXZBcnIuc2hpZnQoMCk7dGhpcy5wcmV2SXRlbSE9PXRoaXMuY3VycmVudEl0ZW0mJih0aGlzLmNoZWNrUGFnaW5hdGlvbigpLHRoaXMuY2hlY2tOYXZpZ2F0aW9uKCksdGhpcy5lYWNoTW92ZVVwZGF0ZSgpLCExIT09dGhpcy5vcHRpb25zLmF1dG9QbGF5JiZ0aGlzLmNoZWNrQXAoKSk7ImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLm9wdGlvbnMuYWZ0ZXJNb3ZlJiZ0aGlzLnByZXZJdGVtIT09dGhpcy5jdXJyZW50SXRlbSYmdGhpcy5vcHRpb25zLmFmdGVyTW92ZS5hcHBseSh0aGlzLFt0aGlzLiRlbGVtXSl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmFwU3RhdHVzPSJzdG9wIjtnLmNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUGxheUludGVydmFsKX0sCmNoZWNrQXA6ZnVuY3Rpb24oKXsic3RvcCIhPT10aGlzLmFwU3RhdHVzJiZ0aGlzLnBsYXkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXM7YS5hcFN0YXR1cz0icGxheSI7aWYoITE9PT1hLm9wdGlvbnMuYXV0b1BsYXkpcmV0dXJuITE7Zy5jbGVhckludGVydmFsKGEuYXV0b1BsYXlJbnRlcnZhbCk7YS5hdXRvUGxheUludGVydmFsPWcuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthLm5leHQoITApfSxhLm9wdGlvbnMuYXV0b1BsYXkpfSxzd2FwU3BlZWQ6ZnVuY3Rpb24oYSl7InNsaWRlU3BlZWQiPT09YT90aGlzLiRvd2xXcmFwcGVyLmNzcyh0aGlzLmFkZENzc1NwZWVkKHRoaXMub3B0aW9ucy5zbGlkZVNwZWVkKSk6InBhZ2luYXRpb25TcGVlZCI9PT1hP3RoaXMuJG93bFdyYXBwZXIuY3NzKHRoaXMuYWRkQ3NzU3BlZWQodGhpcy5vcHRpb25zLnBhZ2luYXRpb25TcGVlZCkpOiJzdHJpbmciIT09dHlwZW9mIGEmJnRoaXMuJG93bFdyYXBwZXIuY3NzKHRoaXMuYWRkQ3NzU3BlZWQoYSkpfSwKYWRkQ3NzU3BlZWQ6ZnVuY3Rpb24oYSl7cmV0dXJueyItd2Via2l0LXRyYW5zaXRpb24iOiJhbGwgIithKyJtcyBlYXNlIiwiLW1vei10cmFuc2l0aW9uIjoiYWxsICIrYSsibXMgZWFzZSIsIi1vLXRyYW5zaXRpb24iOiJhbGwgIithKyJtcyBlYXNlIix0cmFuc2l0aW9uOiJhbGwgIithKyJtcyBlYXNlIn19LHJlbW92ZVRyYW5zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm57Ii13ZWJraXQtdHJhbnNpdGlvbiI6IiIsIi1tb3otdHJhbnNpdGlvbiI6IiIsIi1vLXRyYW5zaXRpb24iOiIiLHRyYW5zaXRpb246IiJ9fSxkb1RyYW5zbGF0ZTpmdW5jdGlvbihhKXtyZXR1cm57Ii13ZWJraXQtdHJhbnNmb3JtIjoidHJhbnNsYXRlM2QoIithKyJweCwgMHB4LCAwcHgpIiwiLW1vei10cmFuc2Zvcm0iOiJ0cmFuc2xhdGUzZCgiK2ErInB4LCAwcHgsIDBweCkiLCItby10cmFuc2Zvcm0iOiJ0cmFuc2xhdGUzZCgiK2ErInB4LCAwcHgsIDBweCkiLCItbXMtdHJhbnNmb3JtIjoidHJhbnNsYXRlM2QoIisKYSsicHgsIDBweCwgMHB4KSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUzZCgiK2ErInB4LCAwcHgsMHB4KSJ9fSx0cmFuc2l0aW9uM2Q6ZnVuY3Rpb24oYSl7dGhpcy4kb3dsV3JhcHBlci5jc3ModGhpcy5kb1RyYW5zbGF0ZShhKSl9LGNzczJtb3ZlOmZ1bmN0aW9uKGEpe3RoaXMuJG93bFdyYXBwZXIuY3NzKHtsZWZ0OmF9KX0sY3NzMnNsaWRlOmZ1bmN0aW9uKGEsYil7dmFyIGU9dGhpcztlLmlzQ3NzRmluaXNoPSExO2UuJG93bFdyYXBwZXIuc3RvcCghMCwhMCkuYW5pbWF0ZSh7bGVmdDphfSx7ZHVyYXRpb246Ynx8ZS5vcHRpb25zLnNsaWRlU3BlZWQsY29tcGxldGU6ZnVuY3Rpb24oKXtlLmlzQ3NzRmluaXNoPSEwfX0pfSxjaGVja0Jyb3dzZXI6ZnVuY3Rpb24oKXt2YXIgYT1rLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc3R5bGUuY3NzVGV4dD0iICAtbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KTsgLW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KTsgLW8tdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpOyAtd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KTsgdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpIjsKYT1hLnN0eWxlLmNzc1RleHQubWF0Y2goL3RyYW5zbGF0ZTNkXCgwcHgsIDBweCwgMHB4XCkvZyk7dGhpcy5icm93c2VyPXtzdXBwb3J0M2Q6bnVsbCE9PWEmJjE9PT1hLmxlbmd0aCxpc1RvdWNoOiJvbnRvdWNoc3RhcnQiaW4gZ3x8Zy5uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50c319LG1vdmVFdmVudHM6ZnVuY3Rpb24oKXtpZighMSE9PXRoaXMub3B0aW9ucy5tb3VzZURyYWd8fCExIT09dGhpcy5vcHRpb25zLnRvdWNoRHJhZyl0aGlzLmdlc3R1cmVzKCksdGhpcy5kaXNhYmxlZEV2ZW50cygpfSxldmVudFR5cGVzOmZ1bmN0aW9uKCl7dmFyIGE9WyJzIiwiZSIsIngiXTt0aGlzLmV2X3R5cGVzPXt9OyEwPT09dGhpcy5vcHRpb25zLm1vdXNlRHJhZyYmITA9PT10aGlzLm9wdGlvbnMudG91Y2hEcmFnP2E9WyJ0b3VjaHN0YXJ0Lm93bCBtb3VzZWRvd24ub3dsIiwidG91Y2htb3ZlLm93bCBtb3VzZW1vdmUub3dsIiwidG91Y2hlbmQub3dsIHRvdWNoY2FuY2VsLm93bCBtb3VzZXVwLm93bCJdOgohMT09PXRoaXMub3B0aW9ucy5tb3VzZURyYWcmJiEwPT09dGhpcy5vcHRpb25zLnRvdWNoRHJhZz9hPVsidG91Y2hzdGFydC5vd2wiLCJ0b3VjaG1vdmUub3dsIiwidG91Y2hlbmQub3dsIHRvdWNoY2FuY2VsLm93bCJdOiEwPT09dGhpcy5vcHRpb25zLm1vdXNlRHJhZyYmITE9PT10aGlzLm9wdGlvbnMudG91Y2hEcmFnJiYoYT1bIm1vdXNlZG93bi5vd2wiLCJtb3VzZW1vdmUub3dsIiwibW91c2V1cC5vd2wiXSk7dGhpcy5ldl90eXBlcy5zdGFydD1hWzBdO3RoaXMuZXZfdHlwZXMubW92ZT1hWzFdO3RoaXMuZXZfdHlwZXMuZW5kPWFbMl19LGRpc2FibGVkRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbS5vbigiZHJhZ3N0YXJ0Lm93bCIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSk7dGhpcy4kZWxlbS5vbigibW91c2Vkb3duLmRpc2FibGVUZXh0U2VsZWN0IixmdW5jdGlvbihhKXtyZXR1cm4gZihhLnRhcmdldCkuaXMoImlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBvcHRpb24iKX0pfSwKZ2VzdHVyZXM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2lmKHZvaWQgMCE9PWEudG91Y2hlcylyZXR1cm57eDphLnRvdWNoZXNbMF0ucGFnZVgseTphLnRvdWNoZXNbMF0ucGFnZVl9O2lmKHZvaWQgMD09PWEudG91Y2hlcyl7aWYodm9pZCAwIT09YS5wYWdlWClyZXR1cm57eDphLnBhZ2VYLHk6YS5wYWdlWX07aWYodm9pZCAwPT09YS5wYWdlWClyZXR1cm57eDphLmNsaWVudFgseTphLmNsaWVudFl9fX1mdW5jdGlvbiBiKGEpeyJvbiI9PT1hPyhmKGspLm9uKGQuZXZfdHlwZXMubW92ZSxlKSxmKGspLm9uKGQuZXZfdHlwZXMuZW5kLGMpKToib2ZmIj09PWEmJihmKGspLm9mZihkLmV2X3R5cGVzLm1vdmUpLGYoaykub2ZmKGQuZXZfdHlwZXMuZW5kKSl9ZnVuY3Rpb24gZShiKXtiPWIub3JpZ2luYWxFdmVudHx8Ynx8Zy5ldmVudDtkLm5ld1Bvc1g9YShiKS54LWgub2Zmc2V0WDtkLm5ld1Bvc1k9YShiKS55LWgub2Zmc2V0WTtkLm5ld1JlbGF0aXZlWD1kLm5ld1Bvc1gtaC5yZWxhdGl2ZVBvczsKImZ1bmN0aW9uIj09PXR5cGVvZiBkLm9wdGlvbnMuc3RhcnREcmFnZ2luZyYmITAhPT1oLmRyYWdnaW5nJiYwIT09ZC5uZXdSZWxhdGl2ZVgmJihoLmRyYWdnaW5nPSEwLGQub3B0aW9ucy5zdGFydERyYWdnaW5nLmFwcGx5KGQsW2QuJGVsZW1dKSk7KDg8ZC5uZXdSZWxhdGl2ZVh8fC04PmQubmV3UmVsYXRpdmVYKSYmITA9PT1kLmJyb3dzZXIuaXNUb3VjaCYmKHZvaWQgMCE9PWIucHJldmVudERlZmF1bHQ/Yi5wcmV2ZW50RGVmYXVsdCgpOmIucmV0dXJuVmFsdWU9ITEsaC5zbGlkaW5nPSEwKTsoMTA8ZC5uZXdQb3NZfHwtMTA+ZC5uZXdQb3NZKSYmITE9PT1oLnNsaWRpbmcmJmYoaykub2ZmKCJ0b3VjaG1vdmUub3dsIik7ZC5uZXdQb3NYPU1hdGgubWF4KE1hdGgubWluKGQubmV3UG9zWCxkLm5ld1JlbGF0aXZlWC81KSxkLm1heGltdW1QaXhlbHMrZC5uZXdSZWxhdGl2ZVgvNSk7ITA9PT1kLmJyb3dzZXIuc3VwcG9ydDNkP2QudHJhbnNpdGlvbjNkKGQubmV3UG9zWCk6ZC5jc3MybW92ZShkLm5ld1Bvc1gpfQpmdW5jdGlvbiBjKGEpe2E9YS5vcmlnaW5hbEV2ZW50fHxhfHxnLmV2ZW50O3ZhciBjO2EudGFyZ2V0PWEudGFyZ2V0fHxhLnNyY0VsZW1lbnQ7aC5kcmFnZ2luZz0hMTshMCE9PWQuYnJvd3Nlci5pc1RvdWNoJiZkLiRvd2xXcmFwcGVyLnJlbW92ZUNsYXNzKCJncmFiYmluZyIpO2QuZHJhZ0RpcmVjdGlvbj0wPmQubmV3UmVsYXRpdmVYP2Qub3dsLmRyYWdEaXJlY3Rpb249ImxlZnQiOmQub3dsLmRyYWdEaXJlY3Rpb249InJpZ2h0IjswIT09ZC5uZXdSZWxhdGl2ZVgmJihjPWQuZ2V0TmV3UG9zaXRpb24oKSxkLmdvVG8oYywhMSwiZHJhZyIpLGgudGFyZ2V0RWxlbWVudD09PWEudGFyZ2V0JiYhMCE9PWQuYnJvd3Nlci5pc1RvdWNoJiYoZihhLnRhcmdldCkub24oImNsaWNrLmRpc2FibGUiLGZ1bmN0aW9uKGEpe2Euc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7YS5zdG9wUHJvcGFnYXRpb24oKTthLnByZXZlbnREZWZhdWx0KCk7ZihhLnRhcmdldCkub2ZmKCJjbGljay5kaXNhYmxlIil9KSwKYT1mLl9kYXRhKGEudGFyZ2V0LCJldmVudHMiKS5jbGljayxjPWEucG9wKCksYS5zcGxpY2UoMCwwLGMpKSk7Yigib2ZmIil9dmFyIGQ9dGhpcyxoPXtvZmZzZXRYOjAsb2Zmc2V0WTowLGJhc2VFbFdpZHRoOjAscmVsYXRpdmVQb3M6MCxwb3NpdGlvbjpudWxsLG1pblN3aXBlOm51bGwsbWF4U3dpcGU6bnVsbCxzbGlkaW5nOm51bGwsZGFyZ2dpbmc6bnVsbCx0YXJnZXRFbGVtZW50Om51bGx9O2QuaXNDc3NGaW5pc2g9ITA7ZC4kZWxlbS5vbihkLmV2X3R5cGVzLnN0YXJ0LCIub3dsLXdyYXBwZXIiLGZ1bmN0aW9uKGMpe2M9Yy5vcmlnaW5hbEV2ZW50fHxjfHxnLmV2ZW50O3ZhciBlO2lmKDM9PT1jLndoaWNoKXJldHVybiExO2lmKCEoZC5pdGVtc0Ftb3VudDw9ZC5vcHRpb25zLml0ZW1zKSl7aWYoITE9PT1kLmlzQ3NzRmluaXNoJiYhZC5vcHRpb25zLmRyYWdCZWZvcmVBbmltRmluaXNofHwhMT09PWQuaXNDc3MzRmluaXNoJiYhZC5vcHRpb25zLmRyYWdCZWZvcmVBbmltRmluaXNoKXJldHVybiExOwohMSE9PWQub3B0aW9ucy5hdXRvUGxheSYmZy5jbGVhckludGVydmFsKGQuYXV0b1BsYXlJbnRlcnZhbCk7ITA9PT1kLmJyb3dzZXIuaXNUb3VjaHx8ZC4kb3dsV3JhcHBlci5oYXNDbGFzcygiZ3JhYmJpbmciKXx8ZC4kb3dsV3JhcHBlci5hZGRDbGFzcygiZ3JhYmJpbmciKTtkLm5ld1Bvc1g9MDtkLm5ld1JlbGF0aXZlWD0wO2YodGhpcykuY3NzKGQucmVtb3ZlVHJhbnNpdGlvbigpKTtlPWYodGhpcykucG9zaXRpb24oKTtoLnJlbGF0aXZlUG9zPWUubGVmdDtoLm9mZnNldFg9YShjKS54LWUubGVmdDtoLm9mZnNldFk9YShjKS55LWUudG9wO2IoIm9uIik7aC5zbGlkaW5nPSExO2gudGFyZ2V0RWxlbWVudD1jLnRhcmdldHx8Yy5zcmNFbGVtZW50fX0pfSxnZXROZXdQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2xvc2VzdEl0ZW0oKTthPnRoaXMubWF4aW11bUl0ZW0/YT10aGlzLmN1cnJlbnRJdGVtPXRoaXMubWF4aW11bUl0ZW06MDw9dGhpcy5uZXdQb3NYJiYodGhpcy5jdXJyZW50SXRlbT0KYT0wKTtyZXR1cm4gYX0sY2xvc2VzdEl0ZW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9ITA9PT1hLm9wdGlvbnMuc2Nyb2xsUGVyUGFnZT9hLnBhZ2VzSW5BcnJheTphLnBvc2l0aW9uc0luQXJyYXksZT1hLm5ld1Bvc1gsYz1udWxsO2YuZWFjaChiLGZ1bmN0aW9uKGQsZyl7ZS1hLml0ZW1XaWR0aC8yMD5iW2QrMV0mJmUtYS5pdGVtV2lkdGgvMjA8ZyYmImxlZnQiPT09YS5tb3ZlRGlyZWN0aW9uKCk/KGM9ZyxhLmN1cnJlbnRJdGVtPSEwPT09YS5vcHRpb25zLnNjcm9sbFBlclBhZ2U/Zi5pbkFycmF5KGMsYS5wb3NpdGlvbnNJbkFycmF5KTpkKTplK2EuaXRlbVdpZHRoLzIwPGcmJmUrYS5pdGVtV2lkdGgvMjA+KGJbZCsxXXx8YltkXS1hLml0ZW1XaWR0aCkmJiJyaWdodCI9PT1hLm1vdmVEaXJlY3Rpb24oKSYmKCEwPT09YS5vcHRpb25zLnNjcm9sbFBlclBhZ2U/KGM9YltkKzFdfHxiW2IubGVuZ3RoLTFdLGEuY3VycmVudEl0ZW09Zi5pbkFycmF5KGMsYS5wb3NpdGlvbnNJbkFycmF5KSk6CihjPWJbZCsxXSxhLmN1cnJlbnRJdGVtPWQrMSkpfSk7cmV0dXJuIGEuY3VycmVudEl0ZW19LG1vdmVEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYTswPnRoaXMubmV3UmVsYXRpdmVYPyhhPSJyaWdodCIsdGhpcy5wbGF5RGlyZWN0aW9uPSJuZXh0Iik6KGE9ImxlZnQiLHRoaXMucGxheURpcmVjdGlvbj0icHJldiIpO3JldHVybiBhfSxjdXN0b21FdmVudHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2EuJGVsZW0ub24oIm93bC5uZXh0IixmdW5jdGlvbigpe2EubmV4dCgpfSk7YS4kZWxlbS5vbigib3dsLnByZXYiLGZ1bmN0aW9uKCl7YS5wcmV2KCl9KTthLiRlbGVtLm9uKCJvd2wucGxheSIsZnVuY3Rpb24oYixlKXthLm9wdGlvbnMuYXV0b1BsYXk9ZTthLnBsYXkoKTthLmhvdmVyU3RhdHVzPSJwbGF5In0pO2EuJGVsZW0ub24oIm93bC5zdG9wIixmdW5jdGlvbigpe2Euc3RvcCgpO2EuaG92ZXJTdGF0dXM9InN0b3AifSk7YS4kZWxlbS5vbigib3dsLmdvVG8iLGZ1bmN0aW9uKGIsZSl7YS5nb1RvKGUpfSk7CmEuJGVsZW0ub24oIm93bC5qdW1wVG8iLGZ1bmN0aW9uKGIsZSl7YS5qdW1wVG8oZSl9KX0sc3RvcE9uSG92ZXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzOyEwPT09YS5vcHRpb25zLnN0b3BPbkhvdmVyJiYhMCE9PWEuYnJvd3Nlci5pc1RvdWNoJiYhMSE9PWEub3B0aW9ucy5hdXRvUGxheSYmKGEuJGVsZW0ub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXthLnN0b3AoKX0pLGEuJGVsZW0ub24oIm1vdXNlb3V0IixmdW5jdGlvbigpeyJzdG9wIiE9PWEuaG92ZXJTdGF0dXMmJmEucGxheSgpfSkpfSxsYXp5TG9hZDpmdW5jdGlvbigpe3ZhciBhLGIsZSxjLGQ7aWYoITE9PT10aGlzLm9wdGlvbnMubGF6eUxvYWQpcmV0dXJuITE7Zm9yKGE9MDthPHRoaXMuaXRlbXNBbW91bnQ7YSs9MSliPWYodGhpcy4kb3dsSXRlbXNbYV0pLCJsb2FkZWQiIT09Yi5kYXRhKCJvd2wtbG9hZGVkIikmJihlPWIuZGF0YSgib3dsLWl0ZW0iKSxjPWIuZmluZCgiLmxhenlPd2wiKSwic3RyaW5nIiE9PXR5cGVvZiBjLmRhdGEoInNyYyIpPwpiLmRhdGEoIm93bC1sb2FkZWQiLCJsb2FkZWQiKToodm9pZCAwPT09Yi5kYXRhKCJvd2wtbG9hZGVkIikmJihjLmhpZGUoKSxiLmFkZENsYXNzKCJsb2FkaW5nIikuZGF0YSgib3dsLWxvYWRlZCIsImNoZWNrZWQiKSksKGQ9ITA9PT10aGlzLm9wdGlvbnMubGF6eUZvbGxvdz9lPj10aGlzLmN1cnJlbnRJdGVtOiEwKSYmZTx0aGlzLmN1cnJlbnRJdGVtK3RoaXMub3B0aW9ucy5pdGVtcyYmYy5sZW5ndGgmJnRoaXMubGF6eVByZWxvYWQoYixjKSkpfSxsYXp5UHJlbG9hZDpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGUoKXthLmRhdGEoIm93bC1sb2FkZWQiLCJsb2FkZWQiKS5yZW1vdmVDbGFzcygibG9hZGluZyIpO2IucmVtb3ZlQXR0cigiZGF0YS1zcmMiKTsiZmFkZSI9PT1kLm9wdGlvbnMubGF6eUVmZmVjdD9iLmZhZGVJbig0MDApOmIuc2hvdygpOyJmdW5jdGlvbiI9PT10eXBlb2YgZC5vcHRpb25zLmFmdGVyTGF6eUxvYWQmJmQub3B0aW9ucy5hZnRlckxhenlMb2FkLmFwcGx5KHRoaXMsCltkLiRlbGVtXSl9ZnVuY3Rpb24gYygpe2YrPTE7ZC5jb21wbGV0ZUltZyhiLmdldCgwKSl8fCEwPT09az9lKCk6MTAwPj1mP2cuc2V0VGltZW91dChjLDEwMCk6ZSgpfXZhciBkPXRoaXMsZj0wLGs7IkRJViI9PT1iLnByb3AoInRhZ05hbWUiKT8oYi5jc3MoImJhY2tncm91bmQtaW1hZ2UiLCJ1cmwoIitiLmRhdGEoInNyYyIpKyIpIiksaz0hMCk6YlswXS5zcmM9Yi5kYXRhKCJzcmMiKTtjKCl9LGF1dG9IZWlnaHQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIGE9ZihlLiRvd2xJdGVtc1tlLmN1cnJlbnRJdGVtXSkuaGVpZ2h0KCk7ZS53cmFwcGVyT3V0ZXIuY3NzKCJoZWlnaHQiLGErInB4Iik7ZS53cmFwcGVyT3V0ZXIuaGFzQ2xhc3MoImF1dG9IZWlnaHQiKXx8Zy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS53cmFwcGVyT3V0ZXIuYWRkQ2xhc3MoImF1dG9IZWlnaHQiKX0sMCl9ZnVuY3Rpb24gYigpe2QrPTE7ZS5jb21wbGV0ZUltZyhjLmdldCgwKSk/YSgpOjEwMD49ZD9nLnNldFRpbWVvdXQoYiwKMTAwKTplLndyYXBwZXJPdXRlci5jc3MoImhlaWdodCIsIiIpfXZhciBlPXRoaXMsYz1mKGUuJG93bEl0ZW1zW2UuY3VycmVudEl0ZW1dKS5maW5kKCJpbWciKSxkO3ZvaWQgMCE9PWMuZ2V0KDApPyhkPTAsYigpKTphKCl9LGNvbXBsZXRlSW1nOmZ1bmN0aW9uKGEpe3JldHVybiFhLmNvbXBsZXRlfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBhLm5hdHVyYWxXaWR0aCYmMD09PWEubmF0dXJhbFdpZHRoPyExOiEwfSxvblZpc2libGVJdGVtczpmdW5jdGlvbigpe3ZhciBhOyEwPT09dGhpcy5vcHRpb25zLmFkZENsYXNzQWN0aXZlJiZ0aGlzLiRvd2xJdGVtcy5yZW1vdmVDbGFzcygiYWN0aXZlIik7dGhpcy52aXNpYmxlSXRlbXM9W107Zm9yKGE9dGhpcy5jdXJyZW50SXRlbTthPHRoaXMuY3VycmVudEl0ZW0rdGhpcy5vcHRpb25zLml0ZW1zO2ErPTEpdGhpcy52aXNpYmxlSXRlbXMucHVzaChhKSwhMD09PXRoaXMub3B0aW9ucy5hZGRDbGFzc0FjdGl2ZSYmZih0aGlzLiRvd2xJdGVtc1thXSkuYWRkQ2xhc3MoImFjdGl2ZSIpOwp0aGlzLm93bC52aXNpYmxlSXRlbXM9dGhpcy52aXNpYmxlSXRlbXN9LHRyYW5zaXRpb25UeXBlczpmdW5jdGlvbihhKXt0aGlzLm91dENsYXNzPSJvd2wtIithKyItb3V0Ijt0aGlzLmluQ2xhc3M9Im93bC0iK2ErIi1pbiJ9LHNpbmdsZUl0ZW1UcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEub3V0Q2xhc3MsZT1hLmluQ2xhc3MsYz1hLiRvd2xJdGVtcy5lcShhLmN1cnJlbnRJdGVtKSxkPWEuJG93bEl0ZW1zLmVxKGEucHJldkl0ZW0pLGY9TWF0aC5hYnMoYS5wb3NpdGlvbnNJbkFycmF5W2EuY3VycmVudEl0ZW1dKSthLnBvc2l0aW9uc0luQXJyYXlbYS5wcmV2SXRlbV0sZz1NYXRoLmFicyhhLnBvc2l0aW9uc0luQXJyYXlbYS5jdXJyZW50SXRlbV0pK2EuaXRlbVdpZHRoLzI7YS5pc1RyYW5zaXRpb249ITA7YS4kb3dsV3JhcHBlci5hZGRDbGFzcygib3dsLW9yaWdpbiIpLmNzcyh7Ii13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbiI6ZysicHgiLCItbW96LXBlcnNwZWN0aXZlLW9yaWdpbiI6ZysKInB4IiwicGVyc3BlY3RpdmUtb3JpZ2luIjpnKyJweCJ9KTtkLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixsZWZ0OmYrInB4In0pLmFkZENsYXNzKGIpLm9uKCJ3ZWJraXRBbmltYXRpb25FbmQgb0FuaW1hdGlvbkVuZCBNU0FuaW1hdGlvbkVuZCBhbmltYXRpb25lbmQiLGZ1bmN0aW9uKCl7YS5lbmRQcmV2PSEwO2Qub2ZmKCJ3ZWJraXRBbmltYXRpb25FbmQgb0FuaW1hdGlvbkVuZCBNU0FuaW1hdGlvbkVuZCBhbmltYXRpb25lbmQiKTthLmNsZWFyVHJhbnNTdHlsZShkLGIpfSk7Yy5hZGRDbGFzcyhlKS5vbigid2Via2l0QW5pbWF0aW9uRW5kIG9BbmltYXRpb25FbmQgTVNBbmltYXRpb25FbmQgYW5pbWF0aW9uZW5kIixmdW5jdGlvbigpe2EuZW5kQ3VycmVudD0hMDtjLm9mZigid2Via2l0QW5pbWF0aW9uRW5kIG9BbmltYXRpb25FbmQgTVNBbmltYXRpb25FbmQgYW5pbWF0aW9uZW5kIik7YS5jbGVhclRyYW5zU3R5bGUoYyxlKX0pfSxjbGVhclRyYW5zU3R5bGU6ZnVuY3Rpb24oYSwKYil7YS5jc3Moe3Bvc2l0aW9uOiIiLGxlZnQ6IiJ9KS5yZW1vdmVDbGFzcyhiKTt0aGlzLmVuZFByZXYmJnRoaXMuZW5kQ3VycmVudCYmKHRoaXMuJG93bFdyYXBwZXIucmVtb3ZlQ2xhc3MoIm93bC1vcmlnaW4iKSx0aGlzLmlzVHJhbnNpdGlvbj10aGlzLmVuZEN1cnJlbnQ9dGhpcy5lbmRQcmV2PSExKX0sb3dsU3RhdHVzOmZ1bmN0aW9uKCl7dGhpcy5vd2w9e3VzZXJPcHRpb25zOnRoaXMudXNlck9wdGlvbnMsYmFzZUVsZW1lbnQ6dGhpcy4kZWxlbSx1c2VySXRlbXM6dGhpcy4kdXNlckl0ZW1zLG93bEl0ZW1zOnRoaXMuJG93bEl0ZW1zLGN1cnJlbnRJdGVtOnRoaXMuY3VycmVudEl0ZW0scHJldkl0ZW06dGhpcy5wcmV2SXRlbSx2aXNpYmxlSXRlbXM6dGhpcy52aXNpYmxlSXRlbXMsaXNUb3VjaDp0aGlzLmJyb3dzZXIuaXNUb3VjaCxicm93c2VyOnRoaXMuYnJvd3NlcixkcmFnRGlyZWN0aW9uOnRoaXMuZHJhZ0RpcmVjdGlvbn19LGNsZWFyRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbS5vZmYoIi5vd2wgb3dsIG1vdXNlZG93bi5kaXNhYmxlVGV4dFNlbGVjdCIpOwpmKGspLm9mZigiLm93bCBvd2wiKTtmKGcpLm9mZigicmVzaXplIix0aGlzLnJlc2l6ZXIpfSx1bldyYXA6ZnVuY3Rpb24oKXswIT09dGhpcy4kZWxlbS5jaGlsZHJlbigpLmxlbmd0aCYmKHRoaXMuJG93bFdyYXBwZXIudW53cmFwKCksdGhpcy4kdXNlckl0ZW1zLnVud3JhcCgpLnVud3JhcCgpLHRoaXMub3dsQ29udHJvbHMmJnRoaXMub3dsQ29udHJvbHMucmVtb3ZlKCkpO3RoaXMuY2xlYXJFdmVudHMoKTt0aGlzLiRlbGVtLmF0dHIoInN0eWxlIix0aGlzLiRlbGVtLmRhdGEoIm93bC1vcmlnaW5hbFN0eWxlcyIpfHwiIikuYXR0cigiY2xhc3MiLHRoaXMuJGVsZW0uZGF0YSgib3dsLW9yaWdpbmFsQ2xhc3NlcyIpKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuc3RvcCgpO2cuY2xlYXJJbnRlcnZhbCh0aGlzLmNoZWNrVmlzaWJsZSk7dGhpcy51bldyYXAoKTt0aGlzLiRlbGVtLnJlbW92ZURhdGEoKX0scmVpbml0OmZ1bmN0aW9uKGEpe2E9Zi5leHRlbmQoe30sdGhpcy51c2VyT3B0aW9ucywKYSk7dGhpcy51bldyYXAoKTt0aGlzLmluaXQoYSx0aGlzLiRlbGVtKX0sYWRkSXRlbTpmdW5jdGlvbihhLGIpe3ZhciBlO2lmKCFhKXJldHVybiExO2lmKDA9PT10aGlzLiRlbGVtLmNoaWxkcmVuKCkubGVuZ3RoKXJldHVybiB0aGlzLiRlbGVtLmFwcGVuZChhKSx0aGlzLnNldFZhcnMoKSwhMTt0aGlzLnVuV3JhcCgpO2U9dm9pZCAwPT09Ynx8LTE9PT1iPy0xOmI7ZT49dGhpcy4kdXNlckl0ZW1zLmxlbmd0aHx8LTE9PT1lP3RoaXMuJHVzZXJJdGVtcy5lcSgtMSkuYWZ0ZXIoYSk6dGhpcy4kdXNlckl0ZW1zLmVxKGUpLmJlZm9yZShhKTt0aGlzLnNldFZhcnMoKX0scmVtb3ZlSXRlbTpmdW5jdGlvbihhKXtpZigwPT09dGhpcy4kZWxlbS5jaGlsZHJlbigpLmxlbmd0aClyZXR1cm4hMTthPXZvaWQgMD09PWF8fC0xPT09YT8tMTphO3RoaXMudW5XcmFwKCk7dGhpcy4kdXNlckl0ZW1zLmVxKGEpLnJlbW92ZSgpO3RoaXMuc2V0VmFycygpfX07Zi5mbi5vd2xDYXJvdXNlbD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoITA9PT0KZih0aGlzKS5kYXRhKCJvd2wtaW5pdCIpKXJldHVybiExO2YodGhpcykuZGF0YSgib3dsLWluaXQiLCEwKTt2YXIgYj1PYmplY3QuY3JlYXRlKGwpO2IuaW5pdChhLHRoaXMpO2YuZGF0YSh0aGlzLCJvd2xDYXJvdXNlbCIsYil9KX07Zi5mbi5vd2xDYXJvdXNlbC5vcHRpb25zPXtpdGVtczo1LGl0ZW1zQ3VzdG9tOiExLGl0ZW1zRGVza3RvcDpbMTE5OSw0XSxpdGVtc0Rlc2t0b3BTbWFsbDpbOTc5LDNdLGl0ZW1zVGFibGV0Ols3NjgsMl0saXRlbXNUYWJsZXRTbWFsbDohMSxpdGVtc01vYmlsZTpbNDc5LDFdLHNpbmdsZUl0ZW06ITEsaXRlbXNTY2FsZVVwOiExLHNsaWRlU3BlZWQ6MjAwLHBhZ2luYXRpb25TcGVlZDo4MDAscmV3aW5kU3BlZWQ6MUUzLGF1dG9QbGF5OiExLHN0b3BPbkhvdmVyOiExLG5hdmlnYXRpb246ITEsbmF2aWdhdGlvblRleHQ6WyJwcmV2IiwibmV4dCJdLHJld2luZE5hdjohMCxzY3JvbGxQZXJQYWdlOiExLHBhZ2luYXRpb246ITAscGFnaW5hdGlvbk51bWJlcnM6ITEsCnJlc3BvbnNpdmU6ITAscmVzcG9uc2l2ZVJlZnJlc2hSYXRlOjIwMCxyZXNwb25zaXZlQmFzZVdpZHRoOmcsYmFzZUNsYXNzOiJvd2wtY2Fyb3VzZWwiLHRoZW1lOiJvd2wtdGhlbWUiLGxhenlMb2FkOiExLGxhenlGb2xsb3c6ITAsbGF6eUVmZmVjdDoiZmFkZSIsYXV0b0hlaWdodDohMSxqc29uUGF0aDohMSxqc29uU3VjY2VzczohMSxkcmFnQmVmb3JlQW5pbUZpbmlzaDohMCxtb3VzZURyYWc6ITAsdG91Y2hEcmFnOiEwLGFkZENsYXNzQWN0aXZlOiExLHRyYW5zaXRpb25TdHlsZTohMSxiZWZvcmVVcGRhdGU6ITEsYWZ0ZXJVcGRhdGU6ITEsYmVmb3JlSW5pdDohMSxhZnRlckluaXQ6ITEsYmVmb3JlTW92ZTohMSxhZnRlck1vdmU6ITEsYWZ0ZXJBY3Rpb246ITEsc3RhcnREcmFnZ2luZzohMSxhZnRlckxhenlMb2FkOiExfX0pKGpRdWVyeSx3aW5kb3csZG9jdW1lbnQpOw=="}},"time_used":423,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":423,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/plugins.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.309Z","timestamp":1785147795309,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/plugins.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:38 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 1155\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":2803,"size_decoded":1699,"mime_type":"text/javascript","magic":"JavaScript source, Unicode text, UTF-8 text, with very long lines (1872)","md5":"9804c7bf8abf3f5d12e8c4c3aee800bb","sha1":"971c69aa6cfb6501146930d199ecd43d34f1d065","sha256":"ba7e001a1400281e75bad35572d8b4ce6631b1d0a978a3d98e232545a12941ad","sha512":"5c610ed4510b2f88ec8bdd22973cc26c88736edea594838ca88ad9365b6e930dcb39b41d5f182bee17d7046b64a00d75d9c07a3e6b84aa28dab9000fda4c7e01","ssdeep":"","tlshash":"325174496b95a52101df723cc46b1f09e060909bfe1ae0f9745cdeb80f61b7081af2fa","first_seen":"2023-03-07T01:33:05Z","last_seen":"2026-08-11T00:25:55.218351Z","times_seen":386,"resource_available":true,"data":"Ly8gQXZvaWQgYGNvbnNvbGVgIGVycm9ycyBpbiBicm93c2VycyB0aGF0IGxhY2sgYSBjb25zb2xlLgooZnVuY3Rpb24oKSB7CiAgICB2YXIgbWV0aG9kOwogICAgdmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTsKICAgIHZhciBtZXRob2RzID0gWwogICAgICAgICdhc3NlcnQnLCAnY2xlYXInLCAnY291bnQnLCAnZGVidWcnLCAnZGlyJywgJ2RpcnhtbCcsICdlcnJvcicsCiAgICAgICAgJ2V4Y2VwdGlvbicsICdncm91cCcsICdncm91cENvbGxhcHNlZCcsICdncm91cEVuZCcsICdpbmZvJywgJ2xvZycsCiAgICAgICAgJ21hcmtUaW1lbGluZScsICdwcm9maWxlJywgJ3Byb2ZpbGVFbmQnLCAndGFibGUnLCAndGltZScsICd0aW1lRW5kJywKICAgICAgICAndGltZWxpbmUnLCAndGltZWxpbmVFbmQnLCAndGltZVN0YW1wJywgJ3RyYWNlJywgJ3dhcm4nCiAgICBdOwogICAgdmFyIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoOwogICAgdmFyIGNvbnNvbGUgPSAod2luZG93LmNvbnNvbGUgPSB3aW5kb3cuY29uc29sZSB8fCB7fSk7CgogICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgbWV0aG9kID0gbWV0aG9kc1tsZW5ndGhdOwoKICAgICAgICAvLyBPbmx5IHN0dWIgdW5kZWZpbmVkIG1ldGhvZHMuCiAgICAgICAgaWYgKCFjb25zb2xlW21ldGhvZF0pIHsKICAgICAgICAgICAgY29uc29sZVttZXRob2RdID0gbm9vcDsKICAgICAgICB9CiAgICB9Cn0oKSk7CgovLyBQbGFjZSBhbnkgalF1ZXJ5L2hlbHBlciBwbHVnaW5zIGluIGhlcmUuCgovKiEKICogc2Nyb2xsdXAgdjIuNC4xCiAqIFVybDogaHR0cDovL21hcmtnb29keWVhci5jb20vbGFicy9zY3JvbGx1cC8KICogQ29weXJpZ2h0IChjKSBNYXJrIEdvb2R5ZWFyIOKAlCBAbWFya2dkeXIg4oCUIGh0dHA6Ly9tYXJrZ29vZHllYXIuY29tCiAqIExpY2Vuc2U6IE1JVAogKi8KIWZ1bmN0aW9uKGwsbyxlKXsidXNlIHN0cmljdCI7bC5mbi5zY3JvbGxVcD1mdW5jdGlvbihvKXtsLmRhdGEoZS5ib2R5LCJzY3JvbGxVcCIpfHwobC5kYXRhKGUuYm9keSwic2Nyb2xsVXAiLCEwKSxsLmZuLnNjcm9sbFVwLmluaXQobykpfSxsLmZuLnNjcm9sbFVwLmluaXQ9ZnVuY3Rpb24ocil7dmFyIHMsdCxjLGksbixhLGQscD1sLmZuLnNjcm9sbFVwLnNldHRpbmdzPWwuZXh0ZW5kKHt9LGwuZm4uc2Nyb2xsVXAuZGVmYXVsdHMsciksZj0hMTtzd2l0Y2goZD1wLnNjcm9sbFRyaWdnZXI/bChwLnNjcm9sbFRyaWdnZXIpOmwoIjxhLz4iLHtpZDpwLnNjcm9sbE5hbWUsaHJlZjoiI3RvcCJ9KSxwLnNjcm9sbFRpdGxlJiZkLmF0dHIoInRpdGxlIixwLnNjcm9sbFRpdGxlKSxkLmFwcGVuZFRvKCJib2R5IikscC5zY3JvbGxJbWd8fHAuc2Nyb2xsVHJpZ2dlcnx8ZC5odG1sKHAuc2Nyb2xsVGV4dCksZC5jc3Moe2Rpc3BsYXk6Im5vbmUiLHBvc2l0aW9uOiJmaXhlZCIsekluZGV4OnAuekluZGV4fSkscC5hY3RpdmVPdmVybGF5JiZsKCI8ZGl2Lz4iLHtpZDpwLnNjcm9sbE5hbWUrIi1hY3RpdmUifSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDpwLnNjcm9sbERpc3RhbmNlKyJweCIsd2lkdGg6IjEwMCUiLGJvcmRlclRvcDoiMXB4IGRvdHRlZCIrcC5hY3RpdmVPdmVybGF5LHpJbmRleDpwLnpJbmRleH0pLmFwcGVuZFRvKCJib2R5IikscC5hbmltYXRpb24pe2Nhc2UiZmFkZSI6cz0iZmFkZUluIix0PSJmYWRlT3V0IixjPXAuYW5pbWF0aW9uU3BlZWQ7YnJlYWs7Y2FzZSJzbGlkZSI6cz0ic2xpZGVEb3duIix0PSJzbGlkZVVwIixjPXAuYW5pbWF0aW9uU3BlZWQ7YnJlYWs7ZGVmYXVsdDpzPSJzaG93Iix0PSJoaWRlIixjPTB9aT0idG9wIj09PXAuc2Nyb2xsRnJvbT9wLnNjcm9sbERpc3RhbmNlOmwoZSkuaGVpZ2h0KCktbChvKS5oZWlnaHQoKS1wLnNjcm9sbERpc3RhbmNlLG49bChvKS5zY3JvbGwoZnVuY3Rpb24oKXtsKG8pLnNjcm9sbFRvcCgpPmk/Znx8KGRbc10oYyksZj0hMCk6ZiYmKGRbdF0oYyksZj0hMSl9KSxwLnNjcm9sbFRhcmdldD8ibnVtYmVyIj09dHlwZW9mIHAuc2Nyb2xsVGFyZ2V0P2E9cC5zY3JvbGxUYXJnZXQ6InN0cmluZyI9PXR5cGVvZiBwLnNjcm9sbFRhcmdldCYmKGE9TWF0aC5mbG9vcihsKHAuc2Nyb2xsVGFyZ2V0KS5vZmZzZXQoKS50b3ApKTphPTAsZC5jbGljayhmdW5jdGlvbihvKXtvLnByZXZlbnREZWZhdWx0KCksbCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDphfSxwLnNjcm9sbFNwZWVkLHAuZWFzaW5nVHlwZSl9KX0sbC5mbi5zY3JvbGxVcC5kZWZhdWx0cz17c2Nyb2xsTmFtZToic2Nyb2xsVXAiLHNjcm9sbERpc3RhbmNlOjMwMCxzY3JvbGxGcm9tOiJ0b3AiLHNjcm9sbFNwZWVkOjMwMCxlYXNpbmdUeXBlOiJsaW5lYXIiLGFuaW1hdGlvbjoiZmFkZSIsYW5pbWF0aW9uU3BlZWQ6MjAwLHNjcm9sbFRyaWdnZXI6ITEsc2Nyb2xsVGFyZ2V0OiExLHNjcm9sbFRleHQ6IlNjcm9sbCB0byB0b3AiLHNjcm9sbFRpdGxlOiExLHNjcm9sbEltZzohMSxhY3RpdmVPdmVybGF5OiExLHpJbmRleDoyMTQ3NDgzNjQ3fSxsLmZuLnNjcm9sbFVwLmRlc3Ryb3k9ZnVuY3Rpb24ocil7bC5yZW1vdmVEYXRhKGUuYm9keSwic2Nyb2xsVXAiKSxsKCIjIitsLmZuLnNjcm9sbFVwLnNldHRpbmdzLnNjcm9sbE5hbWUpLnJlbW92ZSgpLGwoIiMiK2wuZm4uc2Nyb2xsVXAuc2V0dGluZ3Muc2Nyb2xsTmFtZSsiLWFjdGl2ZSIpLnJlbW92ZSgpLGwuZm4uanF1ZXJ5LnNwbGl0KCIuIilbMV0+PTc/bChvKS5vZmYoInNjcm9sbCIscik6bChvKS51bmJpbmQoInNjcm9sbCIscil9LGwuc2Nyb2xsVXA9bC5mbi5zY3JvbGxVcH0oalF1ZXJ5LHdpbmRvdyxkb2N1bWVudCk7CgoKCgoKCg=="}},"time_used":569,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":569,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/8.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.552Z","timestamp":1785147795552,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/8.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16073\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16073,"size_decoded":16548,"mime_type":"image/png","magic":"PNG image data, 110 x 40, 8-bit/color RGBA, non-interlaced","md5":"deedfdd06586e009ab45347ccbadb2ef","sha1":"1a0b25d5fb9659a2a2d014eba0569f83ff1bd53f","sha256":"8d3894ca92df42d0c50e8c268947819c8d22b237c935a263918b20d5b3ac1764","sha512":"9913c3d646afa8d89dcd936a8c569ec2f8b5eb37debcab03ac8e3b012f61a9e8904cef33b4fdaa00cdb3c8010d56a8a7f787c37bfffb12480125ec360a95eb12","ssdeep":"96:LSmkEWRdxNXZsc5tH3HGsd6E6DAPdfx+4YXWrggU:LSmktHZBd6nkV58gU","tlshash":"4b72e711fdf072a2928dd5312cc42a4a9c334983ec91cc06badd9c5b7f01baa5e5f5d6","first_seen":"2025-05-31T01:51:37.48838Z","last_seen":"2026-08-11T00:25:55.272867Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAG4AAAAoCAYAAAAfWs+KAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4JWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjZUMjA6MjI6MTgrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNDozMyswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjQ6MzMrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6N2QwZGIyYjEtZWI1ZC05MjQwLWFlNTQtZmZjZjE3YmZjZjY3PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjdkMGRiMmIxLWViNWQtOTI0MC1hZTU0LWZmY2YxN2JmY2Y2NzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjdkMGRiMmIxLWViNWQtOTI0MC1hZTU0LWZmY2YxN2JmY2Y2NzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3ZDBkYjJiMS1lYjVkLTkyNDAtYWU1NC1mZmNmMTdiZmNmNjc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjZUMjA6MjI6MTgrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTEwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg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"}},"time_used":733,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":722,"receive":11,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/6.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.529Z","timestamp":1785147795529,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/6.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 13369\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":13369,"size_decoded":13844,"mime_type":"image/png","magic":"PNG image data, 92 x 92, 8-bit/color RGBA, non-interlaced","md5":"c9b7d635d890c40956282f9246d05138","sha1":"42d00e3e59f713f7d954d964b348459ce0300b01","sha256":"56496f2c3167ae0a7d9e6cd5b795d3371f8faacc18bdd7af41a20ba15510a37d","sha512":"30003704ee1b49d38ca1b530e6d9b148881aa77cf7db9ce641da6f8db105e90b883105fb54fcadfe2de032eed8fbf23e42b7159429456db9862004cbe82aaebe","ssdeep":"192:EUhu52D4RIdculDE7sUsry9IxgqOQLxwmcLyZ2czdKUlTco3XxEiyiBkJjv3Hsre:EUhC20RIdr12Lsr/aqDjjKU3HXYjfHD1","tlshash":"5552bf6c100f7d988d8827975e53793ea6f02ccfdf4f964ef8745a47955372408301aa","first_seen":"2024-08-19T19:56:19.369619Z","last_seen":"2026-08-11T00:25:55.230134Z","times_seen":28,"resource_available":false,"data":"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"}},"time_used":611,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":602,"receive":9,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/icons/10.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.533Z","timestamp":1785147795533,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/icons/10.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 5653\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":5653,"size_decoded":6127,"mime_type":"image/png","magic":"PNG image data, 85 x 85, 8-bit/color RGBA, non-interlaced","md5":"e72feba5a49e16fdabc94fe7b610975d","sha1":"5f355384b7f6e9b86d83b646576b885525c23759","sha256":"1b3a24cae4ed97dcda9e1fed7deee36b58006652f9934e1c9e2f78b39811d06b","sha512":"1e0be0b48e53081d8b4f6f4cdc8033ae8f8039414f57363cba5f505fd100724ffdff78e5d3d2738a326a6872286c7a80caa3c1479dad72b58d6ebd3bf165180b","ssdeep":"96:2YKiPNX20tMbb8b73C1kc03W/Aj+yDjQlS30g/evc/AjTL6Oz3lxK:DB2sW073Zn6yQlS30MgOyK","tlshash":"cdc19f0648d4de89d6bb7e4df49f85a0e1068393db2fb59dcca1a1bb6109cd18135602","first_seen":"2025-05-31T01:51:37.480712Z","last_seen":"2026-08-11T00:25:55.232136Z","times_seen":27,"resource_available":false,"data":"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"}},"time_used":612,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":334,"receive":278,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/media/7.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.550Z","timestamp":1785147795550,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/media/7.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-length: 16708\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":16708,"size_decoded":17183,"mime_type":"image/png","magic":"PNG image data, 165 x 48, 8-bit/color RGBA, non-interlaced","md5":"ab23d83a1a226b57919579b4eb933ab0","sha1":"961b1473f3a522a7fc21b59e2eba7fcbb2fd43a1","sha256":"f56e4e244971d759e6f7166fb37c016bf3b1e9fbd5a0312938073a08aaba6126","sha512":"a4275634b39be24e230d8e30e3c3c3c48eac2a36e660cc745462f2548848c40f3d777757f8481427a7a262d4ecbd41c5d056d31141a71294cdb729cd579de4e0","ssdeep":"96:6SmkEWRG8bxNXJsc5B3P04z58n0E7xQbWPlkL5fUJiVg:6SmktG8dhc65YvQgBiVg","tlshash":"09721918bc7072a5e99fd8325ed13846aca20a438ac09c44facd5c676f44bf26c5f5da","first_seen":"2025-05-31T01:51:37.436463Z","last_seen":"2026-08-11T00:25:55.151351Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAAKUAAAAwCAYAAABwgLoqAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4JWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDYtMjZUMjA6MjI6MTgrMDU6MzA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wNi0yNlQyMDoyNDo0OSswNTozMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDYtMjZUMjA6MjQ6NDkrMDU6MzA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NmNlNWE0Y2MtMjEwMC0zMDQyLWI1MDUtNzNhYzI5Y2JmZGQwPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjZjZTVhNGNjLTIxMDAtMzA0Mi1iNTA1LTczYWMyOWNiZmRkMDwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjZjZTVhNGNjLTIxMDAtMzA0Mi1iNTA1LTczYWMyOWNiZmRkMDwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2Y2U1YTRjYy0yMTAwLTMwNDItYjUwNS03M2FjMjljYmZkZDA8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDYtMjZUMjA6MjI6MTgrMDU6MzA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTY1PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjQ4PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg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"}},"time_used":730,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":717,"receive":13,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"fonts.googleapis.com/css?family=Lato:300,300i,400,400i,700,700i,900","fqdn":"fonts.googleapis.com","domain":"fonts.googleapis.com","tld":"googleapis.com"},"ip":{"addr":"142.250.178.106","port":443,"asn":15169,"as":"GOOGLE","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.651Z","timestamp":1785147795651,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_AES_256_GCM_SHA384","key_group_name":"mlkem768x25519","signature_name":"ECDSA-P256-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"upload.video.google.com","organization":""},"issuer":{"commonName":"WE2","organization":"Google Trust Services"},"validity":{"start":"Mon, 29 Jun 2026 08:39:27 GMT","end":"Mon, 21 Sep 2026 08:39:26 GMT"},"fingerprint":{"sha1":"50:37:CF:61:33:A1:EE:47:D9:3D:A6:5E:07:BA:4C:FF:F7:25:9F:76","sha256":"7D:4D:21:06:63:E2:5E:F0:8C:59:8E:EB:B7:94:2B:81:70:11:D3:F4:C0:A0:81:A6:1B:E7:27:FD:56:10:1A:11"}}},"request":{"raw":"GET /css?family=Lato:300,300i,400,400i,700,700i,900 HTTP/1.1\r\nHost: fonts.googleapis.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-Fetch-Storage-Access: none\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: cross-site\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncontent-type: text/css; charset=utf-8\r\nvary: Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site\r\naccess-control-allow-origin: *\r\ntiming-allow-origin: *\r\nlink: \u003chttps://fonts.gstatic.com\u003e; rel=preconnect; crossorigin\r\nstrict-transport-security: max-age=31536000\r\nexpires: Mon, 27 Jul 2026 10:23:15 GMT\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\ncache-control: private, max-age=86400\r\ncross-origin-opener-policy: same-origin-allow-popups\r\ncross-origin-resource-policy: cross-origin\r\ncontent-encoding: gzip\r\nserver: ESF\r\nx-xss-protection: 0\r\nx-frame-options: SAMEORIGIN\r\nx-content-type-options: nosniff\r\nalt-svc: h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"HSTS","description":"HTTP Strict Transport Security (HSTS) informs browsers that the site should only be accessed using HTTPS.","website":"https://www.rfc-editor.org/rfc/rfc6797#section-6.1","common_platform_enumeration":"","icon":"","categories":["Security"]}],"data":{"size":5473,"size_decoded":1204,"mime_type":"text/css; charset=utf-8","magic":"ASCII text","md5":"e66768eda810920697a1a019093a55e5","sha1":"001c5b34d05bf9f6d6cd44380c447299752a566e","sha256":"d2fbbb3b75e99d3934df22a8171aefab4059651105bfa8df0bd89e7594da8fef","sha512":"8cf16f4aefd56c6a3fb83a4c537be43e7769509c6d1a97ff5174efe1c8006d80676275de5aa4af9c2a57b0103e6a7aff23d316c45a4acbbce351ee5cfaf6f50c","ssdeep":"96:HYgW/pJc+u7YgW/jNKYgLUJc+u7YgLeNKYgC/KJc+u7YgC/gNKOWhJc+u7OWSNKi:4l/J3l/lkw3kip/i3p/jR6E7nx5u77QD","tlshash":"feb1c092096fb508db930dc212da7d32ef0fa25064459835eeff14d8bc93d6a9362b0d","first_seen":"2025-09-19T03:03:16.886645Z","last_seen":"2026-08-13T22:20:06.262076Z","times_seen":971,"resource_available":false,"data":"LyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dV93NEJNVVRQSGp4c0k5dzJfRlFmdDFkdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMkJBLCBVKzAyQkQtMDJDNSwgVSswMkM3LTAyQ0MsIFUrMDJDRS0wMkQ3LCBVKzAyREQtMDJGRiwgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsxRDAwLTFEQkYsIFUrMUUwMC0xRTlGLCBVKzFFRjItMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQzAsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9Ci8qIGxhdGluICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dV93NEJNVVRQSGp4c0k5dzJfR3dmdC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsyMDAwLTIwNkYsIFUrMjBBQywgVSsyMTIyLCBVKzIxOTEsIFUrMjE5MywgVSsyMjEyLCBVKzIyMTUsIFUrRkVGRiwgVStGRkZEOwp9Ci8qIGxhdGluLWV4dCAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ0xhdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9sYXRvL3YyNS9TNnU4dzRCTVVUUEhqeHNBVWktcUpDWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMkJBLCBVKzAyQkQtMDJDNSwgVSswMkM3LTAyQ0MsIFUrMDJDRS0wMkQ3LCBVKzAyREQtMDJGRiwgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsxRDAwLTFEQkYsIFUrMUUwMC0xRTlGLCBVKzFFRjItMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQzAsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9Ci8qIGxhdGluICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dTh3NEJNVVRQSGp4c0FYQy1xLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzAzMDQsIFUrMDMwOCwgVSswMzI5LCBVKzIwMDAtMjA2RiwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7Cn0KLyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dV93NEJNVVRQSGp4c0k1d3FfRlFmdDFkdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMkJBLCBVKzAyQkQtMDJDNSwgVSswMkM3LTAyQ0MsIFUrMDJDRS0wMkQ3LCBVKzAyREQtMDJGRiwgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsxRDAwLTFEQkYsIFUrMUUwMC0xRTlGLCBVKzFFRjItMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQzAsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9Ci8qIGxhdGluICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dV93NEJNVVRQSGp4c0k1d3FfR3dmdC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsyMDAwLTIwNkYsIFUrMjBBQywgVSsyMTIyLCBVKzIxOTEsIFUrMjE5MywgVSsyMjEyLCBVKzIyMTUsIFUrRkVGRiwgVStGRkZEOwp9Ci8qIGxhdGluLWV4dCAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ0xhdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9sYXRvL3YyNS9TNnU5dzRCTVVUUEhoN1VTU3dhUEdSX3Aud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDJCQSwgVSswMkJELTAyQzUsIFUrMDJDNy0wMkNDLCBVKzAyQ0UtMDJENywgVSswMkRELTAyRkYsIFUrMDMwNCwgVSswMzA4LCBVKzAzMjksIFUrMUQwMC0xREJGLCBVKzFFMDAtMUU5RiwgVSsxRUYyLTFFRkYsIFUrMjAyMCwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMEMwLCBVKzIxMTMsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQovKiBsYXRpbiAqLwpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ0xhdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9sYXRvL3YyNS9TNnU5dzRCTVVUUEhoN1VTU3dpUEdRLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzAzMDQsIFUrMDMwOCwgVSswMzI5LCBVKzIwMDAtMjA2RiwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7Cn0KLyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dXl3NEJNVVRQSGp4QXdYamV1LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyQkEsIFUrMDJCRC0wMkM1LCBVKzAyQzctMDJDQywgVSswMkNFLTAyRDcsIFUrMDJERC0wMkZGLCBVKzAzMDQsIFUrMDMwOCwgVSswMzI5LCBVKzFEMDAtMURCRiwgVSsxRTAwLTFFOUYsIFUrMUVGMi0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDMCwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KLyogbGF0aW4gKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvbGF0by92MjUvUzZ1eXc0Qk1VVFBIang0d1hnLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzAzMDQsIFUrMDMwOCwgVSswMzI5LCBVKzIwMDAtMjA2RiwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7Cn0KLyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dTl3NEJNVVRQSGg2VVZTd2FQR1JfcC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMkJBLCBVKzAyQkQtMDJDNSwgVSswMkM3LTAyQ0MsIFUrMDJDRS0wMkQ3LCBVKzAyREQtMDJGRiwgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsxRDAwLTFEQkYsIFUrMUUwMC0xRTlGLCBVKzFFRjItMUVGRiwgVSsyMDIwLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQzAsIFUrMjExMywgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9Ci8qIGxhdGluICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjI1L1M2dTl3NEJNVVRQSGg2VVZTd2lQR1Eud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkJCLTAyQkMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMDMwNCwgVSswMzA4LCBVKzAzMjksIFUrMjAwMC0yMDZGLCBVKzIwQUMsIFUrMjEyMiwgVSsyMTkxLCBVKzIxOTMsIFUrMjIxMiwgVSsyMjE1LCBVK0ZFRkYsIFUrRkZGRDsKfQovKiBsYXRpbi1leHQgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICBzcmM6IHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvbGF0by92MjUvUzZ1OXc0Qk1VVFBIaDUwWFN3YVBHUl9wLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyQkEsIFUrMDJCRC0wMkM1LCBVKzAyQzctMDJDQywgVSswMkNFLTAyRDcsIFUrMDJERC0wMkZGLCBVKzAzMDQsIFUrMDMwOCwgVSswMzI5LCBVKzFEMDAtMURCRiwgVSsxRTAwLTFFOUYsIFUrMUVGMi0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDMCwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KLyogbGF0aW4gKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDkwMDsKICBzcmM6IHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvbGF0by92MjUvUzZ1OXc0Qk1VVFBIaDUwWFN3aVBHUS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSswMzA0LCBVKzAzMDgsIFUrMDMyOSwgVSsyMDAwLTIwNkYsIFUrMjBBQywgVSsyMTIyLCBVKzIxOTEsIFUrMjE5MywgVSsyMjEyLCBVKzIyMTUsIFUrRkVGRiwgVStGRkZEOwp9Cg=="}},"time_used":83,"timings":{"blocked":0,"dns":2,"connect":16,"send":0,"wait":33,"receive":0,"ssl":32},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/Projector.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.290Z","timestamp":1785147795290,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/Projector.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:26 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 4716\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":23132,"size_decoded":5260,"mime_type":"text/javascript","magic":"ASCII text","md5":"e0ca8d67a365d5082b5dcc4340e9315b","sha1":"7781a5d088c723b68da499b645dc143a23ed25f8","sha256":"de80859053200b4e1c03d918715beca3fda2421367019ba08af39ce8ad968ad6","sha512":"2f4ad1d346ceea6c6c71f67f5f34fb31dfa2b62af4fa9921c47194b2c4d5503cb54fc1fcc637ea9e2749f644034acbb5af5e57a57d39952d085a038d622745e2","ssdeep":"384:gViDsE5YW8HEcVYxeE5zhGZTyfRZTo55AQGspr6nBhfQZb6a5DSTUFayQSmYz7bI:gViIQVIEcVJE5l7Q516nfsbdmYz/xEVh","tlshash":"eea261e4576e995e4d3bb358d41948c4e17c90b29400e6bf7e8cd8b169c183807befea","first_seen":"2023-03-10T20:08:11Z","last_seen":"2026-08-11T00:25:55.239406Z","times_seen":50,"resource_available":true,"data":"LyoqCiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvCiAqIEBhdXRob3IganVsaWFud2EgLyBodHRwczovL2dpdGh1Yi5jb20vanVsaWFud2EKICovCgpUSFJFRS5SZW5kZXJhYmxlT2JqZWN0ID0gZnVuY3Rpb24gKCkgewoKCXRoaXMuaWQgPSAwOwoKCXRoaXMub2JqZWN0ID0gbnVsbDsKCXRoaXMueiA9IDA7Cgl0aGlzLnJlbmRlck9yZGVyID0gMDsKCn07CgovLwoKVEhSRUUuUmVuZGVyYWJsZUZhY2UgPSBmdW5jdGlvbiAoKSB7CgoJdGhpcy5pZCA9IDA7CgoJdGhpcy52MSA9IG5ldyBUSFJFRS5SZW5kZXJhYmxlVmVydGV4KCk7Cgl0aGlzLnYyID0gbmV3IFRIUkVFLlJlbmRlcmFibGVWZXJ0ZXgoKTsKCXRoaXMudjMgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZVZlcnRleCgpOwoKCXRoaXMubm9ybWFsTW9kZWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpOwoKCXRoaXMudmVydGV4Tm9ybWFsc01vZGVsID0gWyBuZXcgVEhSRUUuVmVjdG9yMygpLCBuZXcgVEhSRUUuVmVjdG9yMygpLCBuZXcgVEhSRUUuVmVjdG9yMygpIF07Cgl0aGlzLnZlcnRleE5vcm1hbHNMZW5ndGggPSAwOwoKCXRoaXMuY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKTsKCXRoaXMubWF0ZXJpYWwgPSBudWxsOwoJdGhpcy51dnMgPSBbIG5ldyBUSFJFRS5WZWN0b3IyKCksIG5ldyBUSFJFRS5WZWN0b3IyKCksIG5ldyBUSFJFRS5WZWN0b3IyKCkgXTsKCgl0aGlzLnogPSAwOwoJdGhpcy5yZW5kZXJPcmRlciA9IDA7Cgp9OwoKLy8KClRIUkVFLlJlbmRlcmFibGVWZXJ0ZXggPSBmdW5jdGlvbiAoKSB7CgoJdGhpcy5wb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7Cgl0aGlzLnBvc2l0aW9uV29ybGQgPSBuZXcgVEhSRUUuVmVjdG9yMygpOwoJdGhpcy5wb3NpdGlvblNjcmVlbiA9IG5ldyBUSFJFRS5WZWN0b3I0KCk7CgoJdGhpcy52aXNpYmxlID0gdHJ1ZTsKCn07CgpUSFJFRS5SZW5kZXJhYmxlVmVydGV4LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCB2ZXJ0ZXggKSB7CgoJdGhpcy5wb3NpdGlvbldvcmxkLmNvcHkoIHZlcnRleC5wb3NpdGlvbldvcmxkICk7Cgl0aGlzLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHZlcnRleC5wb3NpdGlvblNjcmVlbiApOwoKfTsKCi8vCgpUSFJFRS5SZW5kZXJhYmxlTGluZSA9IGZ1bmN0aW9uICgpIHsKCgl0aGlzLmlkID0gMDsKCgl0aGlzLnYxID0gbmV3IFRIUkVFLlJlbmRlcmFibGVWZXJ0ZXgoKTsKCXRoaXMudjIgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZVZlcnRleCgpOwoKCXRoaXMudmVydGV4Q29sb3JzID0gWyBuZXcgVEhSRUUuQ29sb3IoKSwgbmV3IFRIUkVFLkNvbG9yKCkgXTsKCXRoaXMubWF0ZXJpYWwgPSBudWxsOwoKCXRoaXMueiA9IDA7Cgl0aGlzLnJlbmRlck9yZGVyID0gMDsKCn07CgovLwoKVEhSRUUuUmVuZGVyYWJsZVNwcml0ZSA9IGZ1bmN0aW9uICgpIHsKCgl0aGlzLmlkID0gMDsKCgl0aGlzLm9iamVjdCA9IG51bGw7CgoJdGhpcy54ID0gMDsKCXRoaXMueSA9IDA7Cgl0aGlzLnogPSAwOwoKCXRoaXMucm90YXRpb24gPSAwOwoJdGhpcy5zY2FsZSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CgoJdGhpcy5tYXRlcmlhbCA9IG51bGw7Cgl0aGlzLnJlbmRlck9yZGVyID0gMDsKCn07CgovLwoKVEhSRUUuUHJvamVjdG9yID0gZnVuY3Rpb24gKCkgewoKCXZhciBfb2JqZWN0LCBfb2JqZWN0Q291bnQsIF9vYmplY3RQb29sID0gW10sIF9vYmplY3RQb29sTGVuZ3RoID0gMCwKCQlfdmVydGV4LCBfdmVydGV4Q291bnQsIF92ZXJ0ZXhQb29sID0gW10sIF92ZXJ0ZXhQb29sTGVuZ3RoID0gMCwKCQlfZmFjZSwgX2ZhY2VDb3VudCwgX2ZhY2VQb29sID0gW10sIF9mYWNlUG9vbExlbmd0aCA9IDAsCgkJX2xpbmUsIF9saW5lQ291bnQsIF9saW5lUG9vbCA9IFtdLCBfbGluZVBvb2xMZW5ndGggPSAwLAoJCV9zcHJpdGUsIF9zcHJpdGVDb3VudCwgX3Nwcml0ZVBvb2wgPSBbXSwgX3Nwcml0ZVBvb2xMZW5ndGggPSAwLAoKCQlfcmVuZGVyRGF0YSA9IHsgb2JqZWN0czogW10sIGxpZ2h0czogW10sIGVsZW1lbnRzOiBbXSB9LAoKCQlfdmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCksCgkJX3ZlY3RvcjQgPSBuZXcgVEhSRUUuVmVjdG9yNCgpLAoKCQlfY2xpcEJveCA9IG5ldyBUSFJFRS5Cb3gzKCBuZXcgVEhSRUUuVmVjdG9yMyggLSAxLCAtIDEsIC0gMSApLCBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMSwgMSApICksCgkJX2JvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKSwKCQlfcG9pbnRzMyA9IG5ldyBBcnJheSggMyApLAoKCQlfdmlld01hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXg0KCksCgkJX3ZpZXdQcm9qZWN0aW9uTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKSwKCgkJX21vZGVsTWF0cml4LAoJCV9tb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKSwKCgkJX25vcm1hbE1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXgzKCksCgoJCV9mcnVzdHVtID0gbmV3IFRIUkVFLkZydXN0dW0oKSwKCgkJX2NsaXBwZWRWZXJ0ZXgxUG9zaXRpb25TY3JlZW4gPSBuZXcgVEhSRUUuVmVjdG9yNCgpLAoJCV9jbGlwcGVkVmVydGV4MlBvc2l0aW9uU2NyZWVuID0gbmV3IFRIUkVFLlZlY3RvcjQoKTsKCgkvLwoKCXRoaXMucHJvamVjdFZlY3RvciA9IGZ1bmN0aW9uICggdmVjdG9yLCBjYW1lcmEgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7CgkJdmVjdG9yLnByb2plY3QoIGNhbWVyYSApOwoKCX07CgoJdGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5Qcm9qZWN0b3I6IC51bnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnVucHJvamVjdCgpLicgKTsKCQl2ZWN0b3IudW5wcm9qZWN0KCBjYW1lcmEgKTsKCgl9OwoKCXRoaXMucGlja2luZ1JheSA9IGZ1bmN0aW9uICgpIHsKCgkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvcjogLnBpY2tpbmdSYXkoKSBpcyBub3cgcmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoKS4nICk7CgoJfTsKCgkvLwoKCXZhciBSZW5kZXJMaXN0ID0gZnVuY3Rpb24gKCkgewoKCQl2YXIgbm9ybWFscyA9IFtdOwoJCXZhciBjb2xvcnMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCXZhciBvYmplY3QgPSBudWxsOwoJCXZhciBtYXRlcmlhbCA9IG51bGw7CgoJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4MygpOwoKCQlmdW5jdGlvbiBzZXRPYmplY3QoIHZhbHVlICkgewoKCQkJb2JqZWN0ID0gdmFsdWU7CgkJCW1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKCQkJbm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7CgoJCQlub3JtYWxzLmxlbmd0aCA9IDA7CgkJCWNvbG9ycy5sZW5ndGggPSAwOwoJCQl1dnMubGVuZ3RoID0gMDsKCgkJfQoKCQlmdW5jdGlvbiBwcm9qZWN0VmVydGV4KCB2ZXJ0ZXggKSB7CgoJCQl2YXIgcG9zaXRpb24gPSB2ZXJ0ZXgucG9zaXRpb247CgkJCXZhciBwb3NpdGlvbldvcmxkID0gdmVydGV4LnBvc2l0aW9uV29ybGQ7CgkJCXZhciBwb3NpdGlvblNjcmVlbiA9IHZlcnRleC5wb3NpdGlvblNjcmVlbjsKCgkJCXBvc2l0aW9uV29ybGQuY29weSggcG9zaXRpb24gKS5hcHBseU1hdHJpeDQoIF9tb2RlbE1hdHJpeCApOwoJCQlwb3NpdGlvblNjcmVlbi5jb3B5KCBwb3NpdGlvbldvcmxkICkuYXBwbHlNYXRyaXg0KCBfdmlld1Byb2plY3Rpb25NYXRyaXggKTsKCgkJCXZhciBpbnZXID0gMSAvIHBvc2l0aW9uU2NyZWVuLnc7CgoJCQlwb3NpdGlvblNjcmVlbi54ICo9IGludlc7CgkJCXBvc2l0aW9uU2NyZWVuLnkgKj0gaW52VzsKCQkJcG9zaXRpb25TY3JlZW4ueiAqPSBpbnZXOwoKCQkJdmVydGV4LnZpc2libGUgPSBwb3NpdGlvblNjcmVlbi54ID49IC0gMSAmJiBwb3NpdGlvblNjcmVlbi54IDw9IDEgJiYKCQkJCQkgcG9zaXRpb25TY3JlZW4ueSA+PSAtIDEgJiYgcG9zaXRpb25TY3JlZW4ueSA8PSAxICYmCgkJCQkJIHBvc2l0aW9uU2NyZWVuLnogPj0gLSAxICYmIHBvc2l0aW9uU2NyZWVuLnogPD0gMTsKCgkJfQoKCQlmdW5jdGlvbiBwdXNoVmVydGV4KCB4LCB5LCB6ICkgewoKCQkJX3ZlcnRleCA9IGdldE5leHRWZXJ0ZXhJblBvb2woKTsKCQkJX3ZlcnRleC5wb3NpdGlvbi5zZXQoIHgsIHksIHogKTsKCgkJCXByb2plY3RWZXJ0ZXgoIF92ZXJ0ZXggKTsKCgkJfQoKCQlmdW5jdGlvbiBwdXNoTm9ybWFsKCB4LCB5LCB6ICkgewoKCQkJbm9ybWFscy5wdXNoKCB4LCB5LCB6ICk7CgoJCX0KCgkJZnVuY3Rpb24gcHVzaENvbG9yKCByLCBnLCBiICkgewoKCQkJY29sb3JzLnB1c2goIHIsIGcsIGIgKTsKCgkJfQoKCQlmdW5jdGlvbiBwdXNoVXYoIHgsIHkgKSB7CgoJCQl1dnMucHVzaCggeCwgeSApOwoKCQl9CgoJCWZ1bmN0aW9uIGNoZWNrVHJpYW5nbGVWaXNpYmlsaXR5KCB2MSwgdjIsIHYzICkgewoKCQkJaWYgKCB2MS52aXNpYmxlID09PSB0cnVlIHx8IHYyLnZpc2libGUgPT09IHRydWUgfHwgdjMudmlzaWJsZSA9PT0gdHJ1ZSApIHJldHVybiB0cnVlOwoKCQkJX3BvaW50czNbIDAgXSA9IHYxLnBvc2l0aW9uU2NyZWVuOwoJCQlfcG9pbnRzM1sgMSBdID0gdjIucG9zaXRpb25TY3JlZW47CgkJCV9wb2ludHMzWyAyIF0gPSB2My5wb3NpdGlvblNjcmVlbjsKCgkJCXJldHVybiBfY2xpcEJveC5pbnRlcnNlY3RzQm94KCBfYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggX3BvaW50czMgKSApOwoKCQl9CgoJCWZ1bmN0aW9uIGNoZWNrQmFja2ZhY2VDdWxsaW5nKCB2MSwgdjIsIHYzICkgewoKCQkJcmV0dXJuICggKCB2My5wb3NpdGlvblNjcmVlbi54IC0gdjEucG9zaXRpb25TY3JlZW4ueCApICoKCQkJCSAgICAoIHYyLnBvc2l0aW9uU2NyZWVuLnkgLSB2MS5wb3NpdGlvblNjcmVlbi55ICkgLQoJCQkJICAgICggdjMucG9zaXRpb25TY3JlZW4ueSAtIHYxLnBvc2l0aW9uU2NyZWVuLnkgKSAqCgkJCQkgICAgKCB2Mi5wb3NpdGlvblNjcmVlbi54IC0gdjEucG9zaXRpb25TY3JlZW4ueCApICkgPCAwOwoKCQl9CgoJCWZ1bmN0aW9uIHB1c2hMaW5lKCBhLCBiICkgewoKCQkJdmFyIHYxID0gX3ZlcnRleFBvb2xbIGEgXTsKCQkJdmFyIHYyID0gX3ZlcnRleFBvb2xbIGIgXTsKCgkJCS8vIENsaXAKCgkJCXYxLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHYxLnBvc2l0aW9uICkuYXBwbHlNYXRyaXg0KCBfbW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCApOwoJCQl2Mi5wb3NpdGlvblNjcmVlbi5jb3B5KCB2Mi5wb3NpdGlvbiApLmFwcGx5TWF0cml4NCggX21vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggKTsKCgkJCWlmICggY2xpcExpbmUoIHYxLnBvc2l0aW9uU2NyZWVuLCB2Mi5wb3NpdGlvblNjcmVlbiApID09PSB0cnVlICkgewoKCQkJCS8vIFBlcmZvcm0gdGhlIHBlcnNwZWN0aXZlIGRpdmlkZQoJCQkJdjEucG9zaXRpb25TY3JlZW4ubXVsdGlwbHlTY2FsYXIoIDEgLyB2MS5wb3NpdGlvblNjcmVlbi53ICk7CgkJCQl2Mi5wb3NpdGlvblNjcmVlbi5tdWx0aXBseVNjYWxhciggMSAvIHYyLnBvc2l0aW9uU2NyZWVuLncgKTsKCgkJCQlfbGluZSA9IGdldE5leHRMaW5lSW5Qb29sKCk7CgkJCQlfbGluZS5pZCA9IG9iamVjdC5pZDsKCQkJCV9saW5lLnYxLmNvcHkoIHYxICk7CgkJCQlfbGluZS52Mi5jb3B5KCB2MiApOwoJCQkJX2xpbmUueiA9IE1hdGgubWF4KCB2MS5wb3NpdGlvblNjcmVlbi56LCB2Mi5wb3NpdGlvblNjcmVlbi56ICk7CgkJCQlfbGluZS5yZW5kZXJPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjsKCgkJCQlfbGluZS5tYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKCgkJCQlpZiAoIG9iamVjdC5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPT09IFRIUkVFLlZlcnRleENvbG9ycyApIHsKCgkJCQkJX2xpbmUudmVydGV4Q29sb3JzWyAwIF0uZnJvbUFycmF5KCBjb2xvcnMsIGEgKiAzICk7CgkJCQkJX2xpbmUudmVydGV4Q29sb3JzWyAxIF0uZnJvbUFycmF5KCBjb2xvcnMsIGIgKiAzICk7CgoJCQkJfQoKCQkJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLnB1c2goIF9saW5lICk7CgoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gcHVzaFRyaWFuZ2xlKCBhLCBiLCBjICkgewoKCQkJdmFyIHYxID0gX3ZlcnRleFBvb2xbIGEgXTsKCQkJdmFyIHYyID0gX3ZlcnRleFBvb2xbIGIgXTsKCQkJdmFyIHYzID0gX3ZlcnRleFBvb2xbIGMgXTsKCgkJCWlmICggY2hlY2tUcmlhbmdsZVZpc2liaWxpdHkoIHYxLCB2MiwgdjMgKSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQlpZiAoIG1hdGVyaWFsLnNpZGUgPT09IFRIUkVFLkRvdWJsZVNpZGUgfHwgY2hlY2tCYWNrZmFjZUN1bGxpbmcoIHYxLCB2MiwgdjMgKSA9PT0gdHJ1ZSApIHsKCgkJCQlfZmFjZSA9IGdldE5leHRGYWNlSW5Qb29sKCk7CgoJCQkJX2ZhY2UuaWQgPSBvYmplY3QuaWQ7CgkJCQlfZmFjZS52MS5jb3B5KCB2MSApOwoJCQkJX2ZhY2UudjIuY29weSggdjIgKTsKCQkJCV9mYWNlLnYzLmNvcHkoIHYzICk7CgkJCQlfZmFjZS56ID0gKCB2MS5wb3NpdGlvblNjcmVlbi56ICsgdjIucG9zaXRpb25TY3JlZW4ueiArIHYzLnBvc2l0aW9uU2NyZWVuLnogKSAvIDM7CgkJCQlfZmFjZS5yZW5kZXJPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjsKCgkJCQkvLyB1c2UgZmlyc3QgdmVydGV4IG5vcm1hbCBhcyBmYWNlIG5vcm1hbAoKCQkJCV9mYWNlLm5vcm1hbE1vZGVsLmZyb21BcnJheSggbm9ybWFscywgYSAqIDMgKTsKCQkJCV9mYWNlLm5vcm1hbE1vZGVsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgoJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgMzsgaSArKyApIHsKCgkJCQkJdmFyIG5vcm1hbCA9IF9mYWNlLnZlcnRleE5vcm1hbHNNb2RlbFsgaSBdOwoJCQkJCW5vcm1hbC5mcm9tQXJyYXkoIG5vcm1hbHMsIGFyZ3VtZW50c1sgaSBdICogMyApOwoJCQkJCW5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwoKCQkJCQl2YXIgdXYgPSBfZmFjZS51dnNbIGkgXTsKCQkJCQl1di5mcm9tQXJyYXkoIHV2cywgYXJndW1lbnRzWyBpIF0gKiAyICk7CgoJCQkJfQoKCQkJCV9mYWNlLnZlcnRleE5vcm1hbHNMZW5ndGggPSAzOwoKCQkJCV9mYWNlLm1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKCQkJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLnB1c2goIF9mYWNlICk7CgoJCQl9CgoJCX0KCgkJcmV0dXJuIHsKCQkJc2V0T2JqZWN0OiBzZXRPYmplY3QsCgkJCXByb2plY3RWZXJ0ZXg6IHByb2plY3RWZXJ0ZXgsCgkJCWNoZWNrVHJpYW5nbGVWaXNpYmlsaXR5OiBjaGVja1RyaWFuZ2xlVmlzaWJpbGl0eSwKCQkJY2hlY2tCYWNrZmFjZUN1bGxpbmc6IGNoZWNrQmFja2ZhY2VDdWxsaW5nLAoJCQlwdXNoVmVydGV4OiBwdXNoVmVydGV4LAoJCQlwdXNoTm9ybWFsOiBwdXNoTm9ybWFsLAoJCQlwdXNoQ29sb3I6IHB1c2hDb2xvciwKCQkJcHVzaFV2OiBwdXNoVXYsCgkJCXB1c2hMaW5lOiBwdXNoTGluZSwKCQkJcHVzaFRyaWFuZ2xlOiBwdXNoVHJpYW5nbGUKCQl9OwoKCX07CgoJdmFyIHJlbmRlckxpc3QgPSBuZXcgUmVuZGVyTGlzdCgpOwoKCWZ1bmN0aW9uIHByb2plY3RPYmplY3QoIG9iamVjdCApIHsKCgkJaWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCWlmICggb2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuTGlnaHQgKSB7CgoJCQlfcmVuZGVyRGF0YS5saWdodHMucHVzaCggb2JqZWN0ICk7CgoJCX0gZWxzZSBpZiAoIG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLk1lc2ggfHwgb2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuTGluZSB8fCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5Qb2ludHMgKSB7CgoJCQlpZiAoIG9iamVjdC5tYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCQkJaWYgKCBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9PT0gdHJ1ZSAmJiBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQlhZGRPYmplY3QoIG9iamVjdCApOwoKCQl9IGVsc2UgaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5TcHJpdGUgKSB7CgoJCQlpZiAoIG9iamVjdC5tYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCQkJaWYgKCBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9PT0gdHJ1ZSAmJiBfZnJ1c3R1bS5pbnRlcnNlY3RzU3ByaXRlKCBvYmplY3QgKSA9PT0gZmFsc2UgKSByZXR1cm47CgoJCQlhZGRPYmplY3QoIG9iamVjdCApOwoKCQl9CgoJCXZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKCgkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCgkJCXByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0gKTsKCgkJfQoKCX0KCglmdW5jdGlvbiBhZGRPYmplY3QoIG9iamVjdCApIHsKCgkJX29iamVjdCA9IGdldE5leHRPYmplY3RJblBvb2woKTsKCQlfb2JqZWN0LmlkID0gb2JqZWN0LmlkOwoJCV9vYmplY3Qub2JqZWN0ID0gb2JqZWN0OwoKCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApOwoJCV92ZWN0b3IzLmFwcGx5TWF0cml4NCggX3ZpZXdQcm9qZWN0aW9uTWF0cml4ICk7CgkJX29iamVjdC56ID0gX3ZlY3RvcjMuejsKCQlfb2JqZWN0LnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwoKCQlfcmVuZGVyRGF0YS5vYmplY3RzLnB1c2goIF9vYmplY3QgKTsKCgl9CgoJdGhpcy5wcm9qZWN0U2NlbmUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHNvcnRPYmplY3RzLCBzb3J0RWxlbWVudHMgKSB7CgoJCV9mYWNlQ291bnQgPSAwOwoJCV9saW5lQ291bnQgPSAwOwoJCV9zcHJpdGVDb3VudCA9IDA7CgoJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLmxlbmd0aCA9IDA7CgoJCWlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgkJaWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgoJCV92aWV3TWF0cml4LmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKCQlfdmlld1Byb2plY3Rpb25NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIF92aWV3TWF0cml4ICk7CgoJCV9mcnVzdHVtLnNldEZyb21NYXRyaXgoIF92aWV3UHJvamVjdGlvbk1hdHJpeCApOwoKCQkvLwoKCQlfb2JqZWN0Q291bnQgPSAwOwoKCQlfcmVuZGVyRGF0YS5vYmplY3RzLmxlbmd0aCA9IDA7CgkJX3JlbmRlckRhdGEubGlnaHRzLmxlbmd0aCA9IDA7CgoJCXByb2plY3RPYmplY3QoIHNjZW5lICk7CgoJCWlmICggc29ydE9iamVjdHMgPT09IHRydWUgKSB7CgoJCQlfcmVuZGVyRGF0YS5vYmplY3RzLnNvcnQoIHBhaW50ZXJTb3J0ICk7CgoJCX0KCgkJLy8KCgkJdmFyIG9iamVjdHMgPSBfcmVuZGVyRGF0YS5vYmplY3RzOwoKCQlmb3IgKCB2YXIgbyA9IDAsIG9sID0gb2JqZWN0cy5sZW5ndGg7IG8gPCBvbDsgbyArKyApIHsKCgkJCXZhciBvYmplY3QgPSBvYmplY3RzWyBvIF0ub2JqZWN0OwoJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CgoJCQlyZW5kZXJMaXN0LnNldE9iamVjdCggb2JqZWN0ICk7CgoJCQlfbW9kZWxNYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CgoJCQlfdmVydGV4Q291bnQgPSAwOwoKCQkJaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5NZXNoICkgewoKCQkJCWlmICggZ2VvbWV0cnkgaW5zdGFuY2VvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoJCQkJCXZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CgoJCQkJCWlmICggYXR0cmlidXRlcy5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkICkgY29udGludWU7CgoJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwoKCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkgewoKCQkJCQkJcmVuZGVyTGlzdC5wdXNoVmVydGV4KCBwb3NpdGlvbnNbIGkgXSwgcG9zaXRpb25zWyBpICsgMSBdLCBwb3NpdGlvbnNbIGkgKyAyIF0gKTsKCgkJCQkJfQoKCQkJCQlpZiAoIGF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OwoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbm9ybWFscy5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQkJcmVuZGVyTGlzdC5wdXNoTm9ybWFsKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1hbHNbIGkgKyAyIF0gKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQlpZiAoIGF0dHJpYnV0ZXMudXYgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2LmFycmF5OwoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdXZzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHsKCgkJCQkJCQlyZW5kZXJMaXN0LnB1c2hVdiggdXZzWyBpIF0sIHV2c1sgaSArIDEgXSApOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJCWlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7CgoJCQkJCQl2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4LmFycmF5OwoKCQkJCQkJaWYgKCBncm91cHMubGVuZ3RoID4gMCApIHsKCgkJCQkJCQlmb3IgKCB2YXIgZyA9IDA7IGcgPCBncm91cHMubGVuZ3RoOyBnICsrICkgewoKCQkJCQkJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGcgXTsKCgkJCQkJCQkJZm9yICggdmFyIGkgPSBncm91cC5zdGFydCwgbCA9IGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQkJCQlyZW5kZXJMaXN0LnB1c2hUcmlhbmdsZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkgewoKCQkJCQkJCQlyZW5kZXJMaXN0LnB1c2hUcmlhbmdsZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7CgoJCQkJCQkJfQoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQkJcmVuZGVyTGlzdC5wdXNoVHJpYW5nbGUoIGksIGkgKyAxLCBpICsgMiApOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkgaW5zdGFuY2VvZiBUSFJFRS5HZW9tZXRyeSApIHsKCgkJCQkJdmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7CgkJCQkJdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CgkJCQkJdmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF07CgoJCQkJCV9ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBfbW9kZWxNYXRyaXggKTsKCgkJCQkJdmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKCQkJCQl2YXIgaXNNdWx0aU1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKTsKCgkJCQkJZm9yICggdmFyIHYgPSAwLCB2bCA9IHZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkgewoKCQkJCQkJdmFyIHZlcnRleCA9IHZlcnRpY2VzWyB2IF07CgoJCQkJCQlfdmVjdG9yMy5jb3B5KCB2ZXJ0ZXggKTsKCgkJCQkJCWlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICkgewoKCQkJCQkJCXZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7CgkJCQkJCQl2YXIgbW9ycGhJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlczsKCgkJCQkJCQlmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkgewoKCQkJCQkJCQl2YXIgaW5mbHVlbmNlID0gbW9ycGhJbmZsdWVuY2VzWyB0IF07CgoJCQkJCQkJCWlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7CgoJCQkJCQkJCXZhciB0YXJnZXQgPSBtb3JwaFRhcmdldHNbIHQgXTsKCQkJCQkJCQl2YXIgdGFyZ2V0VmVydGV4ID0gdGFyZ2V0LnZlcnRpY2VzWyB2IF07CgoJCQkJCQkJCV92ZWN0b3IzLnggKz0gKCB0YXJnZXRWZXJ0ZXgueCAtIHZlcnRleC54ICkgKiBpbmZsdWVuY2U7CgkJCQkJCQkJX3ZlY3RvcjMueSArPSAoIHRhcmdldFZlcnRleC55IC0gdmVydGV4LnkgKSAqIGluZmx1ZW5jZTsKCQkJCQkJCQlfdmVjdG9yMy56ICs9ICggdGFyZ2V0VmVydGV4LnogLSB2ZXJ0ZXgueiApICogaW5mbHVlbmNlOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCXJlbmRlckxpc3QucHVzaFZlcnRleCggX3ZlY3RvcjMueCwgX3ZlY3RvcjMueSwgX3ZlY3RvcjMueiApOwoKCQkJCQl9CgoJCQkJCWZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCgkJCQkJCXZhciBmYWNlID0gZmFjZXNbIGYgXTsKCgkJCQkJCW1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID09PSB0cnVlCgkJCQkJCQkgPyBvYmplY3QubWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdCgkJCQkJCQkgOiBvYmplY3QubWF0ZXJpYWw7CgoJCQkJCQlpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSBjb250aW51ZTsKCgkJCQkJCXZhciBzaWRlID0gbWF0ZXJpYWwuc2lkZTsKCgkJCQkJCXZhciB2MSA9IF92ZXJ0ZXhQb29sWyBmYWNlLmEgXTsKCQkJCQkJdmFyIHYyID0gX3ZlcnRleFBvb2xbIGZhY2UuYiBdOwoJCQkJCQl2YXIgdjMgPSBfdmVydGV4UG9vbFsgZmFjZS5jIF07CgoJCQkJCQlpZiAoIHJlbmRlckxpc3QuY2hlY2tUcmlhbmdsZVZpc2liaWxpdHkoIHYxLCB2MiwgdjMgKSA9PT0gZmFsc2UgKSBjb250aW51ZTsKCgkJCQkJCXZhciB2aXNpYmxlID0gcmVuZGVyTGlzdC5jaGVja0JhY2tmYWNlQ3VsbGluZyggdjEsIHYyLCB2MyApOwoKCQkJCQkJaWYgKCBzaWRlICE9PSBUSFJFRS5Eb3VibGVTaWRlICkgewoKCQkJCQkJCWlmICggc2lkZSA9PT0gVEhSRUUuRnJvbnRTaWRlICYmIHZpc2libGUgPT09IGZhbHNlICkgY29udGludWU7CgkJCQkJCQlpZiAoIHNpZGUgPT09IFRIUkVFLkJhY2tTaWRlICYmIHZpc2libGUgPT09IHRydWUgKSBjb250aW51ZTsKCgkJCQkJCX0KCgkJCQkJCV9mYWNlID0gZ2V0TmV4dEZhY2VJblBvb2woKTsKCgkJCQkJCV9mYWNlLmlkID0gb2JqZWN0LmlkOwoJCQkJCQlfZmFjZS52MS5jb3B5KCB2MSApOwoJCQkJCQlfZmFjZS52Mi5jb3B5KCB2MiApOwoJCQkJCQlfZmFjZS52My5jb3B5KCB2MyApOwoKCQkJCQkJX2ZhY2Uubm9ybWFsTW9kZWwuY29weSggZmFjZS5ub3JtYWwgKTsKCgkJCQkJCWlmICggdmlzaWJsZSA9PT0gZmFsc2UgJiYgKCBzaWRlID09PSBUSFJFRS5CYWNrU2lkZSB8fCBzaWRlID09PSBUSFJFRS5Eb3VibGVTaWRlICkgKSB7CgoJCQkJCQkJX2ZhY2Uubm9ybWFsTW9kZWwubmVnYXRlKCk7CgoJCQkJCQl9CgoJCQkJCQlfZmFjZS5ub3JtYWxNb2RlbC5hcHBseU1hdHJpeDMoIF9ub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTsKCgkJCQkJCXZhciBmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFsczsKCgkJCQkJCWZvciAoIHZhciBuID0gMCwgbmwgPSBNYXRoLm1pbiggZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoLCAzICk7IG4gPCBubDsgbiArKyApIHsKCgkJCQkJCQl2YXIgbm9ybWFsTW9kZWwgPSBfZmFjZS52ZXJ0ZXhOb3JtYWxzTW9kZWxbIG4gXTsKCQkJCQkJCW5vcm1hbE1vZGVsLmNvcHkoIGZhY2VWZXJ0ZXhOb3JtYWxzWyBuIF0gKTsKCgkJCQkJCQlpZiAoIHZpc2libGUgPT09IGZhbHNlICYmICggc2lkZSA9PT0gVEhSRUUuQmFja1NpZGUgfHwgc2lkZSA9PT0gVEhSRUUuRG91YmxlU2lkZSApICkgewoKCQkJCQkJCQlub3JtYWxNb2RlbC5uZWdhdGUoKTsKCgkJCQkJCQl9CgoJCQkJCQkJbm9ybWFsTW9kZWwuYXBwbHlNYXRyaXgzKCBfbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgoJCQkJCQl9CgoJCQkJCQlfZmFjZS52ZXJ0ZXhOb3JtYWxzTGVuZ3RoID0gZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoOwoKCQkJCQkJdmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGYgXTsKCgkJCQkJCWlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkJZm9yICggdmFyIHUgPSAwOyB1IDwgMzsgdSArKyApIHsKCgkJCQkJCQkJX2ZhY2UudXZzWyB1IF0uY29weSggdmVydGV4VXZzWyB1IF0gKTsKCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCQlfZmFjZS5jb2xvciA9IGZhY2UuY29sb3I7CgkJCQkJCV9mYWNlLm1hdGVyaWFsID0gbWF0ZXJpYWw7CgoJCQkJCQlfZmFjZS56ID0gKCB2MS5wb3NpdGlvblNjcmVlbi56ICsgdjIucG9zaXRpb25TY3JlZW4ueiArIHYzLnBvc2l0aW9uU2NyZWVuLnogKSAvIDM7CgkJCQkJCV9mYWNlLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwoKCQkJCQkJX3JlbmRlckRhdGEuZWxlbWVudHMucHVzaCggX2ZhY2UgKTsKCgkJCQkJfQoKCQkJCX0KCgkJCX0gZWxzZSBpZiAoIG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkxpbmUgKSB7CgoJCQkJX21vZGVsVmlld1Byb2plY3Rpb25NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggX3ZpZXdQcm9qZWN0aW9uTWF0cml4LCBfbW9kZWxNYXRyaXggKTsKCgkJCQlpZiAoIGdlb21ldHJ5IGluc3RhbmNlb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkgKSB7CgoJCQkJCXZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKCgkJCQkJaWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQkJcmVuZGVyTGlzdC5wdXNoVmVydGV4KCBwb3NpdGlvbnNbIGkgXSwgcG9zaXRpb25zWyBpICsgMSBdLCBwb3NpdGlvbnNbIGkgKyAyIF0gKTsKCgkJCQkJCX0KCgkJCQkJCWlmICggYXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJCXZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5OwoKCQkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQkJCXJlbmRlckxpc3QucHVzaENvbG9yKCBjb2xvcnNbIGkgXSwgY29sb3JzWyBpICsgMSBdLCBjb2xvcnNbIGkgKyAyIF0gKTsKCgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCQlpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkgewoKCQkJCQkJCXZhciBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXguYXJyYXk7CgoJCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7CgoJCQkJCQkJCXJlbmRlckxpc3QucHVzaExpbmUoIGluZGljZXNbIGkgXSwgaW5kaWNlc1sgaSArIDEgXSApOwoKCQkJCQkJCX0KCgkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJdmFyIHN0ZXAgPSBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5MaW5lU2VnbWVudHMgPyAyIDogMTsKCgkJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIHBvc2l0aW9ucy5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkgewoKCQkJCQkJCQlyZW5kZXJMaXN0LnB1c2hMaW5lKCBpLCBpICsgMSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5IGluc3RhbmNlb2YgVEhSRUUuR2VvbWV0cnkgKSB7CgoJCQkJCXZhciB2ZXJ0aWNlcyA9IG9iamVjdC5nZW9tZXRyeS52ZXJ0aWNlczsKCgkJCQkJaWYgKCB2ZXJ0aWNlcy5sZW5ndGggPT09IDAgKSBjb250aW51ZTsKCgkJCQkJdjEgPSBnZXROZXh0VmVydGV4SW5Qb29sKCk7CgkJCQkJdjEucG9zaXRpb25TY3JlZW4uY29weSggdmVydGljZXNbIDAgXSApLmFwcGx5TWF0cml4NCggX21vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggKTsKCgkJCQkJdmFyIHN0ZXAgPSBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5MaW5lU2VnbWVudHMgPyAyIDogMTsKCgkJCQkJZm9yICggdmFyIHYgPSAxLCB2bCA9IHZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkgewoKCQkJCQkJdjEgPSBnZXROZXh0VmVydGV4SW5Qb29sKCk7CgkJCQkJCXYxLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHZlcnRpY2VzWyB2IF0gKS5hcHBseU1hdHJpeDQoIF9tb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4ICk7CgoJCQkJCQlpZiAoICggdiArIDEgKSAlIHN0ZXAgPiAwICkgY29udGludWU7CgoJCQkJCQl2MiA9IF92ZXJ0ZXhQb29sWyBfdmVydGV4Q291bnQgLSAyIF07CgoJCQkJCQlfY2xpcHBlZFZlcnRleDFQb3NpdGlvblNjcmVlbi5jb3B5KCB2MS5wb3NpdGlvblNjcmVlbiApOwoJCQkJCQlfY2xpcHBlZFZlcnRleDJQb3NpdGlvblNjcmVlbi5jb3B5KCB2Mi5wb3NpdGlvblNjcmVlbiApOwoKCQkJCQkJaWYgKCBjbGlwTGluZSggX2NsaXBwZWRWZXJ0ZXgxUG9zaXRpb25TY3JlZW4sIF9jbGlwcGVkVmVydGV4MlBvc2l0aW9uU2NyZWVuICkgPT09IHRydWUgKSB7CgoJCQkJCQkJLy8gUGVyZm9ybSB0aGUgcGVyc3BlY3RpdmUgZGl2aWRlCgkJCQkJCQlfY2xpcHBlZFZlcnRleDFQb3NpdGlvblNjcmVlbi5tdWx0aXBseVNjYWxhciggMSAvIF9jbGlwcGVkVmVydGV4MVBvc2l0aW9uU2NyZWVuLncgKTsKCQkJCQkJCV9jbGlwcGVkVmVydGV4MlBvc2l0aW9uU2NyZWVuLm11bHRpcGx5U2NhbGFyKCAxIC8gX2NsaXBwZWRWZXJ0ZXgyUG9zaXRpb25TY3JlZW4udyApOwoKCQkJCQkJCV9saW5lID0gZ2V0TmV4dExpbmVJblBvb2woKTsKCgkJCQkJCQlfbGluZS5pZCA9IG9iamVjdC5pZDsKCQkJCQkJCV9saW5lLnYxLnBvc2l0aW9uU2NyZWVuLmNvcHkoIF9jbGlwcGVkVmVydGV4MVBvc2l0aW9uU2NyZWVuICk7CgkJCQkJCQlfbGluZS52Mi5wb3NpdGlvblNjcmVlbi5jb3B5KCBfY2xpcHBlZFZlcnRleDJQb3NpdGlvblNjcmVlbiApOwoKCQkJCQkJCV9saW5lLnogPSBNYXRoLm1heCggX2NsaXBwZWRWZXJ0ZXgxUG9zaXRpb25TY3JlZW4ueiwgX2NsaXBwZWRWZXJ0ZXgyUG9zaXRpb25TY3JlZW4ueiApOwoJCQkJCQkJX2xpbmUucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7CgoJCQkJCQkJX2xpbmUubWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CgoJCQkJCQkJaWYgKCBvYmplY3QubWF0ZXJpYWwudmVydGV4Q29sb3JzID09PSBUSFJFRS5WZXJ0ZXhDb2xvcnMgKSB7CgoJCQkJCQkJCV9saW5lLnZlcnRleENvbG9yc1sgMCBdLmNvcHkoIG9iamVjdC5nZW9tZXRyeS5jb2xvcnNbIHYgXSApOwoJCQkJCQkJCV9saW5lLnZlcnRleENvbG9yc1sgMSBdLmNvcHkoIG9iamVjdC5nZW9tZXRyeS5jb2xvcnNbIHYgLSAxIF0gKTsKCgkJCQkJCQl9CgoJCQkJCQkJX3JlbmRlckRhdGEuZWxlbWVudHMucHVzaCggX2xpbmUgKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0KCgkJCX0gZWxzZSBpZiAoIG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLlBvaW50cyApIHsKCgkJCQlfbW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBfdmlld1Byb2plY3Rpb25NYXRyaXgsIF9tb2RlbE1hdHJpeCApOwoKCQkJCWlmICggZ2VvbWV0cnkgaW5zdGFuY2VvZiBUSFJFRS5HZW9tZXRyeSApIHsKCgkJCQkJdmFyIHZlcnRpY2VzID0gb2JqZWN0Lmdlb21ldHJ5LnZlcnRpY2VzOwoKCQkJCQlmb3IgKCB2YXIgdiA9IDAsIHZsID0gdmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7CgoJCQkJCQl2YXIgdmVydGV4ID0gdmVydGljZXNbIHYgXTsKCgkJCQkJCV92ZWN0b3I0LnNldCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiwgMSApOwoJCQkJCQlfdmVjdG9yNC5hcHBseU1hdHJpeDQoIF9tb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4ICk7CgoJCQkJCQlwdXNoUG9pbnQoIF92ZWN0b3I0LCBvYmplY3QsIGNhbWVyYSApOwoKCQkJCQl9CgoJCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkgaW5zdGFuY2VvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoKCQkJCQlpZiAoIGF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKCgkJCQkJCQlfdmVjdG9yNC5zZXQoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSwgMSApOwoJCQkJCQkJX3ZlY3RvcjQuYXBwbHlNYXRyaXg0KCBfbW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCApOwoKCQkJCQkJCXB1c2hQb2ludCggX3ZlY3RvcjQsIG9iamVjdCwgY2FtZXJhICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5TcHJpdGUgKSB7CgoJCQkJX3ZlY3RvcjQuc2V0KCBfbW9kZWxNYXRyaXguZWxlbWVudHNbIDEyIF0sIF9tb2RlbE1hdHJpeC5lbGVtZW50c1sgMTMgXSwgX21vZGVsTWF0cml4LmVsZW1lbnRzWyAxNCBdLCAxICk7CgkJCQlfdmVjdG9yNC5hcHBseU1hdHJpeDQoIF92aWV3UHJvamVjdGlvbk1hdHJpeCApOwoKCQkJCXB1c2hQb2ludCggX3ZlY3RvcjQsIG9iamVjdCwgY2FtZXJhICk7CgoJCQl9CgoJCX0KCgkJaWYgKCBzb3J0RWxlbWVudHMgPT09IHRydWUgKSB7CgoJCQlfcmVuZGVyRGF0YS5lbGVtZW50cy5zb3J0KCBwYWludGVyU29ydCApOwoKCQl9CgoJCXJldHVybiBfcmVuZGVyRGF0YTsKCgl9OwoKCWZ1bmN0aW9uIHB1c2hQb2ludCggX3ZlY3RvcjQsIG9iamVjdCwgY2FtZXJhICkgewoKCQl2YXIgaW52VyA9IDEgLyBfdmVjdG9yNC53OwoKCQlfdmVjdG9yNC56ICo9IGludlc7CgoJCWlmICggX3ZlY3RvcjQueiA+PSAtIDEgJiYgX3ZlY3RvcjQueiA8PSAxICkgewoKCQkJX3Nwcml0ZSA9IGdldE5leHRTcHJpdGVJblBvb2woKTsKCQkJX3Nwcml0ZS5pZCA9IG9iamVjdC5pZDsKCQkJX3Nwcml0ZS54ID0gX3ZlY3RvcjQueCAqIGludlc7CgkJCV9zcHJpdGUueSA9IF92ZWN0b3I0LnkgKiBpbnZXOwoJCQlfc3ByaXRlLnogPSBfdmVjdG9yNC56OwoJCQlfc3ByaXRlLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwoJCQlfc3ByaXRlLm9iamVjdCA9IG9iamVjdDsKCgkJCV9zcHJpdGUucm90YXRpb24gPSBvYmplY3Qucm90YXRpb247CgoJCQlfc3ByaXRlLnNjYWxlLnggPSBvYmplY3Quc2NhbGUueCAqIE1hdGguYWJzKCBfc3ByaXRlLnggLSAoIF92ZWN0b3I0LnggKyBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdICkgLyAoIF92ZWN0b3I0LncgKyBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMTIgXSApICk7CgkJCV9zcHJpdGUuc2NhbGUueSA9IG9iamVjdC5zY2FsZS55ICogTWF0aC5hYnMoIF9zcHJpdGUueSAtICggX3ZlY3RvcjQueSArIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF0gKSAvICggX3ZlY3RvcjQudyArIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxMyBdICkgKTsKCgkJCV9zcHJpdGUubWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CgoJCQlfcmVuZGVyRGF0YS5lbGVtZW50cy5wdXNoKCBfc3ByaXRlICk7CgoJCX0KCgl9CgoJLy8gUG9vbHMKCglmdW5jdGlvbiBnZXROZXh0T2JqZWN0SW5Qb29sKCkgewoKCQlpZiAoIF9vYmplY3RDb3VudCA9PT0gX29iamVjdFBvb2xMZW5ndGggKSB7CgoJCQl2YXIgb2JqZWN0ID0gbmV3IFRIUkVFLlJlbmRlcmFibGVPYmplY3QoKTsKCQkJX29iamVjdFBvb2wucHVzaCggb2JqZWN0ICk7CgkJCV9vYmplY3RQb29sTGVuZ3RoICsrOwoJCQlfb2JqZWN0Q291bnQgKys7CgkJCXJldHVybiBvYmplY3Q7CgoJCX0KCgkJcmV0dXJuIF9vYmplY3RQb29sWyBfb2JqZWN0Q291bnQgKysgXTsKCgl9CgoJZnVuY3Rpb24gZ2V0TmV4dFZlcnRleEluUG9vbCgpIHsKCgkJaWYgKCBfdmVydGV4Q291bnQgPT09IF92ZXJ0ZXhQb29sTGVuZ3RoICkgewoKCQkJdmFyIHZlcnRleCA9IG5ldyBUSFJFRS5SZW5kZXJhYmxlVmVydGV4KCk7CgkJCV92ZXJ0ZXhQb29sLnB1c2goIHZlcnRleCApOwoJCQlfdmVydGV4UG9vbExlbmd0aCArKzsKCQkJX3ZlcnRleENvdW50ICsrOwoJCQlyZXR1cm4gdmVydGV4OwoKCQl9CgoJCXJldHVybiBfdmVydGV4UG9vbFsgX3ZlcnRleENvdW50ICsrIF07CgoJfQoKCWZ1bmN0aW9uIGdldE5leHRGYWNlSW5Qb29sKCkgewoKCQlpZiAoIF9mYWNlQ291bnQgPT09IF9mYWNlUG9vbExlbmd0aCApIHsKCgkJCXZhciBmYWNlID0gbmV3IFRIUkVFLlJlbmRlcmFibGVGYWNlKCk7CgkJCV9mYWNlUG9vbC5wdXNoKCBmYWNlICk7CgkJCV9mYWNlUG9vbExlbmd0aCArKzsKCQkJX2ZhY2VDb3VudCArKzsKCQkJcmV0dXJuIGZhY2U7CgoJCX0KCgkJcmV0dXJuIF9mYWNlUG9vbFsgX2ZhY2VDb3VudCArKyBdOwoKCgl9CgoJZnVuY3Rpb24gZ2V0TmV4dExpbmVJblBvb2woKSB7CgoJCWlmICggX2xpbmVDb3VudCA9PT0gX2xpbmVQb29sTGVuZ3RoICkgewoKCQkJdmFyIGxpbmUgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZUxpbmUoKTsKCQkJX2xpbmVQb29sLnB1c2goIGxpbmUgKTsKCQkJX2xpbmVQb29sTGVuZ3RoICsrOwoJCQlfbGluZUNvdW50ICsrOwoJCQlyZXR1cm4gbGluZTsKCgkJfQoKCQlyZXR1cm4gX2xpbmVQb29sWyBfbGluZUNvdW50ICsrIF07CgoJfQoKCWZ1bmN0aW9uIGdldE5leHRTcHJpdGVJblBvb2woKSB7CgoJCWlmICggX3Nwcml0ZUNvdW50ID09PSBfc3ByaXRlUG9vbExlbmd0aCApIHsKCgkJCXZhciBzcHJpdGUgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZVNwcml0ZSgpOwoJCQlfc3ByaXRlUG9vbC5wdXNoKCBzcHJpdGUgKTsKCQkJX3Nwcml0ZVBvb2xMZW5ndGggKys7CgkJCV9zcHJpdGVDb3VudCArKzsKCQkJcmV0dXJuIHNwcml0ZTsKCgkJfQoKCQlyZXR1cm4gX3Nwcml0ZVBvb2xbIF9zcHJpdGVDb3VudCArKyBdOwoKCX0KCgkvLwoKCWZ1bmN0aW9uIHBhaW50ZXJTb3J0KCBhLCBiICkgewoKCQlpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7CgoJCQlyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7CgoJCX0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkgewoKCQkJcmV0dXJuIGIueiAtIGEuejsKCgkJfSBlbHNlIGlmICggYS5pZCAhPT0gYi5pZCApIHsKCgkJCXJldHVybiBhLmlkIC0gYi5pZDsKCgkJfSBlbHNlIHsKCgkJCXJldHVybiAwOwoKCQl9CgoJfQoKCWZ1bmN0aW9uIGNsaXBMaW5lKCBzMSwgczIgKSB7CgoJCXZhciBhbHBoYTEgPSAwLCBhbHBoYTIgPSAxLAoKCQkvLyBDYWxjdWxhdGUgdGhlIGJvdW5kYXJ5IGNvb3JkaW5hdGUgb2YgZWFjaCB2ZXJ0ZXggZm9yIHRoZSBuZWFyIGFuZCBmYXIgY2xpcCBwbGFuZXMsCgkJLy8gWiA9IC0xIGFuZCBaID0gKzEsIHJlc3BlY3RpdmVseS4KCgkJCWJjMW5lYXIgPSBzMS56ICsgczEudywKCQkJYmMybmVhciA9IHMyLnogKyBzMi53LAoJCQliYzFmYXIgPSAtIHMxLnogKyBzMS53LAoJCQliYzJmYXIgPSAtIHMyLnogKyBzMi53OwoKCQlpZiAoIGJjMW5lYXIgPj0gMCAmJiBiYzJuZWFyID49IDAgJiYgYmMxZmFyID49IDAgJiYgYmMyZmFyID49IDAgKSB7CgoJCQkvLyBCb3RoIHZlcnRpY2VzIGxpZSBlbnRpcmVseSB3aXRoaW4gYWxsIGNsaXAgcGxhbmVzLgoJCQlyZXR1cm4gdHJ1ZTsKCgkJfSBlbHNlIGlmICggKCBiYzFuZWFyIDwgMCAmJiBiYzJuZWFyIDwgMCApIHx8ICggYmMxZmFyIDwgMCAmJiBiYzJmYXIgPCAwICkgKSB7CgoJCQkvLyBCb3RoIHZlcnRpY2VzIGxpZSBlbnRpcmVseSBvdXRzaWRlIG9uZSBvZiB0aGUgY2xpcCBwbGFuZXMuCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCgkJCS8vIFRoZSBsaW5lIHNlZ21lbnQgc3BhbnMgYXQgbGVhc3Qgb25lIGNsaXAgcGxhbmUuCgoJCQlpZiAoIGJjMW5lYXIgPCAwICkgewoKCQkJCS8vIHYxIGxpZXMgb3V0c2lkZSB0aGUgbmVhciBwbGFuZSwgdjIgaW5zaWRlCgkJCQlhbHBoYTEgPSBNYXRoLm1heCggYWxwaGExLCBiYzFuZWFyIC8gKCBiYzFuZWFyIC0gYmMybmVhciApICk7CgoJCQl9IGVsc2UgaWYgKCBiYzJuZWFyIDwgMCApIHsKCgkJCQkvLyB2MiBsaWVzIG91dHNpZGUgdGhlIG5lYXIgcGxhbmUsIHYxIGluc2lkZQoJCQkJYWxwaGEyID0gTWF0aC5taW4oIGFscGhhMiwgYmMxbmVhciAvICggYmMxbmVhciAtIGJjMm5lYXIgKSApOwoKCQkJfQoKCQkJaWYgKCBiYzFmYXIgPCAwICkgewoKCQkJCS8vIHYxIGxpZXMgb3V0c2lkZSB0aGUgZmFyIHBsYW5lLCB2MiBpbnNpZGUKCQkJCWFscGhhMSA9IE1hdGgubWF4KCBhbHBoYTEsIGJjMWZhciAvICggYmMxZmFyIC0gYmMyZmFyICkgKTsKCgkJCX0gZWxzZSBpZiAoIGJjMmZhciA8IDAgKSB7CgoJCQkJLy8gdjIgbGllcyBvdXRzaWRlIHRoZSBmYXIgcGxhbmUsIHYyIGluc2lkZQoJCQkJYWxwaGEyID0gTWF0aC5taW4oIGFscGhhMiwgYmMxZmFyIC8gKCBiYzFmYXIgLSBiYzJmYXIgKSApOwoKCQkJfQoKCQkJaWYgKCBhbHBoYTIgPCBhbHBoYTEgKSB7CgoJCQkJLy8gVGhlIGxpbmUgc2VnbWVudCBzcGFucyB0d28gYm91bmRhcmllcywgYnV0IGlzIG91dHNpZGUgYm90aCBvZiB0aGVtLgoJCQkJLy8gKFRoaXMgY2FuJ3QgaGFwcGVuIHdoZW4gd2UncmUgb25seSBjbGlwcGluZyBhZ2FpbnN0IGp1c3QgbmVhci9mYXIgYnV0IGdvb2QKCQkJCS8vICB0byBsZWF2ZSB0aGUgY2hlY2sgaGVyZSBmb3IgZnV0dXJlIHVzYWdlIGlmIG90aGVyIGNsaXAgcGxhbmVzIGFyZSBhZGRlZC4pCgkJCQlyZXR1cm4gZmFsc2U7CgoJCQl9IGVsc2UgewoKCQkJCS8vIFVwZGF0ZSB0aGUgczEgYW5kIHMyIHZlcnRpY2VzIHRvIG1hdGNoIHRoZSBjbGlwcGVkIGxpbmUgc2VnbWVudC4KCQkJCXMxLmxlcnAoIHMyLCBhbHBoYTEgKTsKCQkJCXMyLmxlcnAoIHMxLCAxIC0gYWxwaGEyICk7CgoJCQkJcmV0dXJuIHRydWU7CgoJCQl9CgoJCX0KCgl9Cgp9Owo="}},"time_used":437,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":437,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/vendor/jquery-3.2.1.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.298Z","timestamp":1785147795298,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/vendor/jquery-3.2.1.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 29485\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":86659,"size_decoded":30030,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (32058)","md5":"c9f5aeeca3ad37bf2aa006139b935f0a","sha1":"1055018c28ab41087ef9ccefe411606893dabea2","sha256":"87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de","sha512":"dcff2b5c2b8625d3593a7531ff4ddcd633939cc9f7acfeb79c18a9e6038fdaa99487960075502f159d44f902d965b0b5aed32b41bfa66a1dc07d85b5d5152b58","ssdeep":"1536:YNhEyjjTikEJO4edXXe9J578go6MWX2xkj8e4c4j2ll2AckaXEP6n15HZ+FhFcQ7:uxc2yjx4j2uX/kcQDU8Cu9","tlshash":"4483e6d9b2c67062977730b950bf410bb17a98dab44c8c60f158d9d47eb8a8d907bf2c","first_seen":"2023-03-07T01:02:00Z","last_seen":"2026-08-14T16:08:28.030102Z","times_seen":99569,"resource_available":true,"data":"LyohIGpRdWVyeSB2My4yLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIGIoYSl9OmIoYSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO3ZhciBjPVtdLGQ9YS5kb2N1bWVudCxlPU9iamVjdC5nZXRQcm90b3R5cGVPZixmPWMuc2xpY2UsZz1jLmNvbmNhdCxoPWMucHVzaCxpPWMuaW5kZXhPZixqPXt9LGs9ai50b1N0cmluZyxsPWouaGFzT3duUHJvcGVydHksbT1sLnRvU3RyaW5nLG49bS5jYWxsKE9iamVjdCksbz17fTtmdW5jdGlvbiBwKGEsYil7Yj1ifHxkO3ZhciBjPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50ZXh0PWEsYi5oZWFkLmFwcGVuZENoaWxkKGMpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9dmFyIHE9IjMuMi4xIixyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyByLmZuLmluaXQoYSxiKX0scz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdD0vXi1tcy0vLHU9Ly0oW2Etel0pL2csdj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O3IuZm49ci5wcm90b3R5cGU9e2pxdWVyeTpxLGNvbnN0cnVjdG9yOnIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBmLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9mLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPXIubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiByLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhyLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoYTwwP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmM8Yj9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aCxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LHIuZXh0ZW5kPXIuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxyLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2g8aTtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYoci5pc1BsYWluT2JqZWN0KGQpfHwoZT1BcnJheS5pc0FycmF5KGQpKSk/KGU/KGU9ITEsZj1jJiZBcnJheS5pc0FycmF5KGMpP2M6W10pOmY9YyYmci5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1yLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sci5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKHErTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PXIudHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3ZhciBiPXIudHlwZShhKTtyZXR1cm4oIm51bWJlciI9PT1ifHwic3RyaW5nIj09PWIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiEoIWF8fCJbb2JqZWN0IE9iamVjdF0iIT09ay5jYWxsKGEpKSYmKCEoYj1lKGEpKXx8KGM9bC5jYWxsKGIsImNvbnN0cnVjdG9yIikmJmIuY29uc3RydWN0b3IsImZ1bmN0aW9uIj09dHlwZW9mIGMmJm0uY2FsbChjKT09PW4pKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErIiI6Im9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYT9qW2suY2FsbChhKV18fCJvYmplY3QiOnR5cGVvZiBhfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGEpe3AoYSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHQsIm1zLSIpLnJlcGxhY2UodSx2KX0sZWFjaDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtpZih3KGEpKXtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVha31lbHNlIGZvcihkIGluIGEpaWYoYi5jYWxsKGFbZF0sZCxhW2RdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKHMsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtyZXR1cm4gbnVsbCE9YSYmKHcoT2JqZWN0KGEpKT9yLm1lcmdlKGMsInN0cmluZyI9PXR5cGVvZiBhP1thXTphKTpoLmNhbGwoYyxhKSksY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/LTE6aS5jYWxsKGIsYSxjKX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO2Q8YztkKyspYVtlKytdPWJbZF07cmV0dXJuIGEubGVuZ3RoPWUsYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGU9W10sZj0wLGc9YS5sZW5ndGgsaD0hYztmPGc7ZisrKWQ9IWIoYVtmXSxmKSxkIT09aCYmZS5wdXNoKGFbZl0pO3JldHVybiBlfSxtYXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj0wLGg9W107aWYodyhhKSlmb3IoZD1hLmxlbmd0aDtmPGQ7ZisrKWU9YihhW2ZdLGYsYyksbnVsbCE9ZSYmaC5wdXNoKGUpO2Vsc2UgZm9yKGYgaW4gYSllPWIoYVtmXSxmLGMpLG51bGwhPWUmJmgucHVzaChlKTtyZXR1cm4gZy5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlO2lmKCJzdHJpbmciPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxyLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGQ9Zi5jYWxsKGFyZ3VtZW50cywyKSxlPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxkLmNvbmNhdChmLmNhbGwoYXJndW1lbnRzKSkpfSxlLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8ci5ndWlkKyssZX0sbm93OkRhdGUubm93LHN1cHBvcnQ6b30pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihyLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxyLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7alsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiB3KGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPXIudHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iIT09YyYmIXIuaXNXaW5kb3coYSkmJigiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYSl9dmFyIHg9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEQ9W10sRT1ELnBvcCxGPUQucHVzaCxHPUQucHVzaCxIPUQuc2xpY2UsST1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX0sSj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLEs9IltcXHgyMFxcdFxcclxcblxcZl0iLEw9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixNPSJcXFsiK0srIiooIitMKyIpKD86IitLKyIqKFsqXiR8IX5dPz0pIitLKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTCsiKSl8KSIrSysiKlxcXSIsTj0iOigiK0wrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK00rIikqKXwuKilcXCl8KSIsTz1uZXcgUmVnRXhwKEsrIisiLCJnIiksUD1uZXcgUmVnRXhwKCJeIitLKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0srIiskIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrSysiKiwiK0srIioiKSxSPW5ldyBSZWdFeHAoIl4iK0srIiooWz4rfl18IitLKyIpIitLKyIqIiksUz1uZXcgUmVnRXhwKCI9IitLKyIqKFteXFxdJ1wiXSo/KSIrSysiKlxcXSIsImciKSxUPW5ldyBSZWdFeHAoTiksVT1uZXcgUmVnRXhwKCJeIitMKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitMKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK0wrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK0wrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitNKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitLKyI/fCgiK0srIil8LikiLCJpZyIpLGFhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6ZDwwP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxiYT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxjYT1mdW5jdGlvbihhLGIpe3JldHVybiBiPyJcMCI9PT1hPyJcdWZmZmQiOmEuc2xpY2UoMCwtMSkrIlxcIithLmNoYXJDb2RlQXQoYS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2F9LGRhPWZ1bmN0aW9uKCl7bSgpfSxlYT10YShmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwJiYoImZvcm0iaW4gYXx8ImxhYmVsImluIGEpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0cuYXBwbHkoRD1ILmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLERbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0c9e2FwcGx5OkQubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ri5hcHBseShhLEguY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHM9YiYmYi5vd25lckRvY3VtZW50LHc9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09dyYmOSE9PXcmJjExIT09dylyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXcmJihsPVouZXhlYyhhKSkpaWYoZj1sWzFdKXtpZig5PT09dyl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHMmJihqPXMuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKGxbMl0pcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPWxbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gRy5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09dylzPWIscj1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShiYSxjYSk6Yi5zZXRBdHRyaWJ1dGUoImlkIixrPXUpLG89ZyhhKSxoPW8ubGVuZ3RoO3doaWxlKGgtLSlvW2hdPSIjIitrKyIgIitzYShvW2hdKTtyPW8uam9pbigiLCIpLHM9JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxifWlmKHIpdHJ5e3JldHVybiBHLmFwcGx5KGQscy5xdWVyeVNlbGVjdG9yQWxsKHIpKSxkfWNhdGNoKHgpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShQLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1jLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiZhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImZvcm0iaW4gYj9iLnBhcmVudE5vZGUmJmIuZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gYj8ibGFiZWwiaW4gYi5wYXJlbnROb2RlP2IucGFyZW50Tm9kZS5kaXNhYmxlZD09PWE6Yi5kaXNhYmxlZD09PWE6Yi5pc0Rpc2FibGVkPT09YXx8Yi5pc0Rpc2FibGVkIT09IWEmJmVhKGIpPT09YTpiLmRpc2FibGVkPT09YToibGFiZWwiaW4gYiYmYi5kaXNhYmxlZD09PWF9fWZ1bmN0aW9uIHBhKGEpe3JldHVybiBpYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixpYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1nYS5zdXBwb3J0PXt9LGY9Z2EuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhYiYmIkhUTUwiIT09Yi5ub2RlTmFtZX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSx2IT09biYmKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVkudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19LGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShfLGFhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjLGQsZSxmPWIuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZil7aWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdO2U9Yi5nZXRFbGVtZW50c0J5TmFtZShhKSxkPTA7d2hpbGUoZj1lW2QrK10paWYoYz1mLmdldEF0dHJpYnV0ZU5vZGUoImlkIiksYyYmYy52YWx1ZT09PWEpcmV0dXJuW2ZdfXJldHVybltdfX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnApcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKX0scj1bXSxxPVtdLChjLnFzYT1ZLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrSysiKlsqXiR8IX5dPz0iKSwyIT09YS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmcS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLG8uYXBwZW5kQ2hpbGQoYSkuZGlzYWJsZWQ9ITAsMiE9PWEucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVkudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiKiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixOKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9WS50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8WS50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09bnx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1ufHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0koayxhKS1JKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsZz1bYV0saD1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09bj8tMTpiPT09bj8xOmU/LTE6Zj8xOms/SShrLGEpLUkoayxiKTowO2lmKGU9PT1mKXJldHVybiBsYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSlnLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTt3aGlsZShnW2RdPT09aFtkXSlkKys7cmV0dXJuIGQ/bGEoZ1tkXSxoW2RdKTpnW2RdPT09dj8tMTpoW2RdPT09dj8xOjB9LG4pOm59LGdhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ2EoYSxudWxsLG51bGwsYil9LGdhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShTLCI9JyQxJ10iKSxjLm1hdGNoZXNTZWxlY3RvciYmcCYmIUFbYisiICJdJiYoIXJ8fCFyLnRlc3QoYikpJiYoIXF8fCFxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZDLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoYmEsY2EpfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKF8sYWEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKF8sYWEpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxnYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZnYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVi5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZULnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0srIikiK2ErIigiK0srInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjohYnx8KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShPLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iJiYoZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxnYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2lhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1JKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmlhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFt1XT9pYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZ2EoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczppYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoXyxhYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKF8sYWEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6b2EoITEpLGRpc2FibGVkOm9hKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6cGEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnBhKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpwYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuW2M8MD9jK2I6Y119KSxldmVuOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOnBhKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7YzxiO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6cGEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1jPDA/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpwYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bWEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bmEoYik7ZnVuY3Rpb24gcmEoKXt9cmEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyByYSxnPWdhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1RLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1SLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFAsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1WW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBzYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7YjxjO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHRhKGEsYixjKXt2YXIgZD1iLmRpcixlPWIubmV4dCxmPWV8fGQsZz1jJiYicGFyZW50Tm9kZSI9PT1mLGg9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxlKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGcpcmV0dXJuIGEoYixjLGUpO3JldHVybiExfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG09W3csaF07aWYoaSl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZykmJmEoYixjLGkpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxnKWlmKGw9Ylt1XXx8KGJbdV09e30pLGs9bFtiLnVuaXF1ZUlEXXx8KGxbYi51bmlxdWVJRF09e30pLGUmJmU9PT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpYj1iW2RdfHxiO2Vsc2V7aWYoKGo9a1tmXSkmJmpbMF09PT13JiZqWzFdPT09aClyZXR1cm4gbVsyXT1qWzJdO2lmKGtbZl09bSxtWzJdPWEoYixjLGkpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB1YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB2YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB3YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtoPGk7aCsrKShmPWFbaF0pJiYoYyYmIWMoZixkLGUpfHwoZy5wdXNoKGYpLGomJmIucHVzaChoKSkpO3JldHVybiBnfWZ1bmN0aW9uIHhhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXhhKGQpKSxlJiYhZVt1XSYmKGU9eGEoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dmEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6d2EocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXdhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj13YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6Ry5hcHBseShnLHIpfSl9ZnVuY3Rpb24geWEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz10YShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9dGEoZnVuY3Rpb24oYSl7cmV0dXJuIEkoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2k8ZjtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bdGEodWEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7ZTxmO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHhhKGk+MSYmdWEobSksaT4xJiZzYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxpPGUmJnlhKGEuc2xpY2UoaSxlKSksZTxmJiZ5YShhPWEuc2xpY2UoZSkpLGU8ZiYmc2EoYSkpfW0ucHVzaChjKX1yZXR1cm4gdWEobSl9ZnVuY3Rpb24gemEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbyxxLHI9MCxzPSIwIix0PWYmJltdLHU9W10sdj1qLHg9Znx8ZSYmZC5maW5kLlRBRygiKiIsaykseT13Kz1udWxsPT12PzE6TWF0aC5yYW5kb20oKXx8LjEsej14Lmxlbmd0aDtmb3IoayYmKGo9Zz09PW58fGd8fGspO3MhPT16JiZudWxsIT0obD14W3NdKTtzKyspe2lmKGUmJmwpe289MCxnfHxsLm93bmVyRG9jdW1lbnQ9PT1ufHwobShsKSxoPSFwKTt3aGlsZShxPWFbbysrXSlpZihxKGwsZ3x8bixoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXkpfWMmJigobD0hcSYmbCkmJnItLSxmJiZ0LnB1c2gobCkpfWlmKHIrPXMsYyYmcyE9PXIpe289MDt3aGlsZShxPWJbbysrXSlxKHQsdSxnLGgpO2lmKGYpe2lmKHI+MCl3aGlsZShzLS0pdFtzXXx8dVtzXXx8KHVbc109RS5jYWxsKGkpKTt1PXdhKHUpfUcuYXBwbHkoaSx1KSxrJiYhZiYmdS5sZW5ndGg+MCYmcitiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz15LGo9diksdH07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eWEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHphKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsaSxqLGssbCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG49IWUmJmcoYT1tLnNlbGVjdG9yfHxhKTtpZihjPWN8fFtdLDE9PT1uLmxlbmd0aCl7aWYoaT1uWzBdPW5bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShfLGFhKSxiKXx8W10pWzBdLCFiKXJldHVybiBjO20mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGkuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWY9Vi5uZWVkc0NvbnRleHQudGVzdChhKT8wOmkubGVuZ3RoO3doaWxlKGYtLSl7aWYoaj1pW2ZdLGQucmVsYXRpdmVbaz1qLnR5cGVdKWJyZWFrO2lmKChsPWQuZmluZFtrXSkmJihlPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoXyxhYSksJC50ZXN0KGlbMF0udHlwZSkmJnFhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoaS5zcGxpY2UoZiwxKSxhPWUubGVuZ3RoJiZzYShpKSwhYSlyZXR1cm4gRy5hcHBseShjLGUpLGM7YnJlYWt9fX1yZXR1cm4obXx8aChhLG4pKShlLGIsIXAsYywhYnx8JC50ZXN0KGEpJiZxYShiLnBhcmVudE5vZGUpfHxiKSxjfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtpZighYylyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7aWYoIWMmJiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEosZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFjKXJldHVybiBhW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTtyLmZpbmQ9eCxyLmV4cHI9eC5zZWxlY3RvcnMsci5leHByWyI6Il09ci5leHByLnBzZXVkb3Msci51bmlxdWVTb3J0PXIudW5pcXVlPXgudW5pcXVlU29ydCxyLnRleHQ9eC5nZXRUZXh0LHIuaXNYTUxEb2M9eC5pc1hNTCxyLmNvbnRhaW5zPXguY29udGFpbnMsci5lc2NhcGVTZWxlY3Rvcj14LmVzY2FwZTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT12b2lkIDAhPT1jO3doaWxlKChhPWFbYl0pJiY5IT09YS5ub2RlVHlwZSlpZigxPT09YS5ub2RlVHlwZSl7aWYoZSYmcihhKS5pcyhjKSlicmVhaztkLnB1c2goYSl9cmV0dXJuIGR9LHo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9LEE9ci5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBCKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIudG9Mb3dlckNhc2UoKX12YXIgQz0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaSxEPS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gRShhLGIsYyl7cmV0dXJuIHIuaXNGdW5jdGlvbihiKT9yLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTpiLm5vZGVUeXBlP3IuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KToic3RyaW5nIiE9dHlwZW9mIGI/ci5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGkuY2FsbChiLGEpPi0xIT09Y30pOkQudGVzdChiKT9yLmZpbHRlcihiLGEsYyk6KGI9ci5maWx0ZXIoYixhKSxyLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gaS5jYWxsKGIsYSk+LTEhPT1jJiYxPT09YS5ub2RlVHlwZX0pKX1yLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9yLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOnIuZmluZC5tYXRjaGVzKGEsci5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxyLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjLGQ9dGhpcy5sZW5ndGgsZT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2socihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYoci5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihjPXRoaXMucHVzaFN0YWNrKFtdKSxiPTA7YjxkO2IrKylyLmZpbmQoYSxlW2JdLGMpO3JldHVybiBkPjE/ci51bmlxdWVTb3J0KGMpOmN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRSh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhRSh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmQS50ZXN0KGEpP3IoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgRixHPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC8sSD1yLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxGLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hWzBdJiYiPiI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOkcuZXhlYyhhKSwhZXx8IWVbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxjKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihlWzFdKXtpZihiPWIgaW5zdGFuY2VvZiByP2JbMF06YixyLm1lcmdlKHRoaXMsci5wYXJzZUhUTUwoZVsxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpkLCEwKSksQy50ZXN0KGVbMV0pJiZyLmlzUGxhaW5PYmplY3QoYikpZm9yKGUgaW4gYilyLmlzRnVuY3Rpb24odGhpc1tlXSk/dGhpc1tlXShiW2VdKTp0aGlzLmF0dHIoZSxiW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gZj1kLmdldEVsZW1lbnRCeUlkKGVbMl0pLGYmJih0aGlzWzBdPWYsdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6ci5pc0Z1bmN0aW9uKGEpP3ZvaWQgMCE9PWMucmVhZHk/Yy5yZWFkeShhKTphKHIpOnIubWFrZUFycmF5KGEsdGhpcyl9O0gucHJvdG90eXBlPXIuZm4sRj1yKGQpO3ZhciBJPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEo9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07ci5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYj1yKGEsdGhpcyksYz1iLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGM7YSsrKWlmKHIuY29udGFpbnModGhpcyxiW2FdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPSJzdHJpbmciIT10eXBlb2YgYSYmcihhKTtpZighQS50ZXN0KGEpKWZvcig7ZDxlO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJnIuZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9yLnVuaXF1ZVNvcnQoZik6Zil9LGluZGV4OmZ1bmN0aW9uKGEpe3JldHVybiBhPyJzdHJpbmciPT10eXBlb2YgYT9pLmNhbGwocihhKSx0aGlzWzBdKTppLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIudW5pcXVlU29ydChyLm1lcmdlKHRoaXMuZ2V0KCkscihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBLKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1yLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB5KGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEsoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4geShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4geShhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHkoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHooKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiB6KGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBCKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50OihCKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksci5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsYil7ci5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXIubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9ci5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKEpbYV18fHIudW5pcXVlU29ydChlKSxJLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgTD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIE0oYSl7dmFyIGI9e307cmV0dXJuIHIuZWFjaChhLm1hdGNoKEwpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifXIuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP00oYSk6ci5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWV8fGEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe3IuZWFjaChiLGZ1bmN0aW9uKGIsYyl7ci5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PXIudHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiByLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9ci5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxjPD1oJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ci5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9Zz1bXSxjfHxifHwoZj1jPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfTtmdW5jdGlvbiBOKGEpe3JldHVybiBhfWZ1bmN0aW9uIE8oYSl7dGhyb3cgYX1mdW5jdGlvbiBQKGEsYixjLGQpe3ZhciBlO3RyeXthJiZyLmlzRnVuY3Rpb24oZT1hLnByb21pc2UpP2UuY2FsbChhKS5kb25lKGIpLmZhaWwoYyk6YSYmci5pc0Z1bmN0aW9uKGU9YS50aGVuKT9lLmNhbGwoYSxiLGMpOmIuYXBwbHkodm9pZCAwLFthXS5zbGljZShkKSl9Y2F0Y2goYSl7Yy5hcHBseSh2b2lkIDAsW2FdKX19ci5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGIpe3ZhciBjPVtbIm5vdGlmeSIsInByb2dyZXNzIixyLkNhbGxiYWNrcygibWVtb3J5Iiksci5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxyLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxkPSJwZW5kaW5nIixlPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBkfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZi5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIGUudGhlbihudWxsLGEpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGIpe3IuZWFjaChjLGZ1bmN0aW9uKGMsZCl7dmFyIGU9ci5pc0Z1bmN0aW9uKGFbZFs0XV0pJiZhW2RbNF1dO2ZbZFsxXV0oZnVuY3Rpb24oKXt2YXIgYT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZyLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhiLm5vdGlmeSkuZG9uZShiLnJlc29sdmUpLmZhaWwoYi5yZWplY3QpOmJbZFswXSsiV2l0aCJdKHRoaXMsZT9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKGIsZCxlKXt2YXIgZj0wO2Z1bmN0aW9uIGcoYixjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcyxpPWFyZ3VtZW50cyxqPWZ1bmN0aW9uKCl7dmFyIGEsajtpZighKGI8Zikpe2lmKGE9ZC5hcHBseShoLGkpLGE9PT1jLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtqPWEmJigib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhKSYmYS50aGVuLHIuaXNGdW5jdGlvbihqKT9lP2ouY2FsbChhLGcoZixjLE4sZSksZyhmLGMsTyxlKSk6KGYrKyxqLmNhbGwoYSxnKGYsYyxOLGUpLGcoZixjLE8sZSksZyhmLGMsTixjLm5vdGlmeVdpdGgpKSk6KGQhPT1OJiYoaD12b2lkIDAsaT1bYV0pLChlfHxjLnJlc29sdmVXaXRoKShoLGkpKX19LGs9ZT9qOmZ1bmN0aW9uKCl7dHJ5e2ooKX1jYXRjaChhKXtyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJnIuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhhLGsuc3RhY2tUcmFjZSksYisxPj1mJiYoZCE9PU8mJihoPXZvaWQgMCxpPVthXSksYy5yZWplY3RXaXRoKGgsaSkpfX07Yj9rKCk6KHIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoay5zdGFja1RyYWNlPXIuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGEuc2V0VGltZW91dChrKSl9fXJldHVybiByLkRlZmVycmVkKGZ1bmN0aW9uKGEpe2NbMF1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihlKT9lOk4sYS5ub3RpZnlXaXRoKSksY1sxXVszXS5hZGQoZygwLGEsci5pc0Z1bmN0aW9uKGIpP2I6TikpLGNbMl1bM10uYWRkKGcoMCxhLHIuaXNGdW5jdGlvbihkKT9kOk8pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9yLmV4dGVuZChhLGUpOmV9fSxmPXt9O3JldHVybiByLmVhY2goYyxmdW5jdGlvbihhLGIpe3ZhciBnPWJbMl0saD1iWzVdO2VbYlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtkPWh9LGNbMy1hXVsyXS5kaXNhYmxlLGNbMF1bMl0ubG9jayksZy5hZGQoYlszXS5maXJlKSxmW2JbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGZbYlswXSsiV2l0aCJdKHRoaXM9PT1mP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZltiWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGUucHJvbWlzZShmKSxiJiZiLmNhbGwoZixmKSxmfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGgsYz1iLGQ9QXJyYXkoYyksZT1mLmNhbGwoYXJndW1lbnRzKSxnPXIuRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtkW2FdPXRoaXMsZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/Zi5jYWxsKGFyZ3VtZW50cyk6YywtLWJ8fGcucmVzb2x2ZVdpdGgoZCxlKX19O2lmKGI8PTEmJihQKGEsZy5kb25lKGgoYykpLnJlc29sdmUsZy5yZWplY3QsIWIpLCJwZW5kaW5nIj09PWcuc3RhdGUoKXx8ci5pc0Z1bmN0aW9uKGVbY10mJmVbY10udGhlbikpKXJldHVybiBnLnRoZW4oKTt3aGlsZShjLS0pUChlW2NdLGgoYyksZy5yZWplY3QpO3JldHVybiBnLnByb21pc2UoKX19KTt2YXIgUT0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztyLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oYixjKXthLmNvbnNvbGUmJmEuY29uc29sZS53YXJuJiZiJiZRLnRlc3QoYi5uYW1lKSYmYS5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrYi5tZXNzYWdlLGIuc3RhY2ssYyl9LHIucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oYil7YS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYn0pfTt2YXIgUj1yLkRlZmVycmVkKCk7ci5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gUi50aGVuKGEpWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe3IucmVhZHlFeGNlcHRpb24oYSl9KSx0aGlzfSxyLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tci5yZWFkeVdhaXQ6ci5pc1JlYWR5KXx8KHIuaXNSZWFkeT0hMCxhIT09ITAmJi0tci5yZWFkeVdhaXQ+MHx8Ui5yZXNvbHZlV2l0aChkLFtyXSkpfX0pLHIucmVhZHkudGhlbj1SLnRoZW47ZnVuY3Rpb24gUygpe2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsUyksCmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUyksci5yZWFkeSgpfSJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Euc2V0VGltZW91dChyLnJlYWR5KTooZC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixTKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLFMpKTt2YXIgVD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09ci50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpVChhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxyLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwocihhKSxjKX0pKSxiKSlmb3IoO2g8aTtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxVPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gVigpe3RoaXMuZXhwYW5kbz1yLmV4cGFuZG8rVi51aWQrK31WLnVpZD0xLFYucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihhKXt2YXIgYj1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGJ8fChiPXt9LFUoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1iOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSkpLGJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmNhY2hlKGEpO2lmKCJzdHJpbmciPT10eXBlb2YgYillW3IuY2FtZWxDYXNlKGIpXT1jO2Vsc2UgZm9yKGQgaW4gYillW3IuY2FtZWxDYXNlKGQpXT1iW2RdO3JldHVybiBlfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW3IuY2FtZWxDYXNlKGIpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmInN0cmluZyI9PXR5cGVvZiBiJiZ2b2lkIDA9PT1jP3RoaXMuZ2V0KGEsYik6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9YVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PWQpe2lmKHZvaWQgMCE9PWIpe0FycmF5LmlzQXJyYXkoYik/Yj1iLm1hcChyLmNhbWVsQ2FzZSk6KGI9ci5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIubWF0Y2goTCl8fFtdKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlkZWxldGUgZFtiW2NdXX0odm9pZCAwPT09Ynx8ci5pc0VtcHR5T2JqZWN0KGQpKSYmKGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgYVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT1iJiYhci5pc0VtcHR5T2JqZWN0KGIpfX07dmFyIFc9bmV3IFYsWD1uZXcgVixZPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sWj0vW0EtWl0vZztmdW5jdGlvbiAkKGEpe3JldHVybiJ0cnVlIj09PWF8fCJmYWxzZSIhPT1hJiYoIm51bGwiPT09YT9udWxsOmE9PT0rYSsiIj8rYTpZLnRlc3QoYSk/SlNPTi5wYXJzZShhKTphKX1mdW5jdGlvbiBfKGEsYixjKXt2YXIgZDtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSlpZihkPSJkYXRhLSIrYi5yZXBsYWNlKFosIi0kJiIpLnRvTG93ZXJDYXNlKCksYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSQoYyl9Y2F0Y2goZSl7fVguc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfXIuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBYLmhhc0RhdGEoYSl8fFcuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFguYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1gucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gVy5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe1cucmVtb3ZlKGEsYil9fSksci5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1YLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIVcuZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPXIuY2FtZWxDYXNlKGQuc2xpY2UoNSkpLF8oZixkLGVbZF0pKSk7Vy5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSl9KTpUKHRoaXMsZnVuY3Rpb24oYil7dmFyIGM7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1YLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1fKGYsYSksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe1guc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtYLnJlbW92ZSh0aGlzLGEpfSl9fSksci5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXJldHVybiBiPShifHwiZngiKSsicXVldWUiLGQ9Vy5nZXQoYSxiKSxjJiYoIWR8fEFycmF5LmlzQXJyYXkoYyk/ZD1XLmFjY2VzcyhhLGIsci5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W119LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9ci5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1yLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe3IuZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBXLmdldChhLGMpfHxXLmFjY2VzcyhhLGMse2VtcHR5OnIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1cucmVtb3ZlKGEsW2IrInF1ZXVlIixjXSl9KX0pfX0pLHIuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9yLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPXIucXVldWUodGhpcyxhLGIpO3IuX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmci5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPXIuRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9Vy5nZXQoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIGFhPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGJhPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIithYSsiKShbYS16JV0qKSQiLCJpIiksY2E9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxkYT1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09YS5zdHlsZS5kaXNwbGF5fHwiIj09PWEuc3R5bGUuZGlzcGxheSYmci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSkmJiJub25lIj09PXIuY3NzKGEsImRpc3BsYXkiKX0sZWE9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O2Z1bmN0aW9uIGZhKGEsYixjLGQpe3ZhciBlLGY9MSxnPTIwLGg9ZD9mdW5jdGlvbigpe3JldHVybiBkLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiByLmNzcyhhLGIsIiIpfSxpPWgoKSxqPWMmJmNbM118fChyLmNzc051bWJlcltiXT8iIjoicHgiKSxrPShyLmNzc051bWJlcltiXXx8InB4IiE9PWomJitpKSYmYmEuZXhlYyhyLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixyLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBnYT17fTtmdW5jdGlvbiBoYShhKXt2YXIgYixjPWEub3duZXJEb2N1bWVudCxkPWEubm9kZU5hbWUsZT1nYVtkXTtyZXR1cm4gZT9lOihiPWMuYm9keS5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoZCkpLGU9ci5jc3MoYiwiZGlzcGxheSIpLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSwibm9uZSI9PT1lJiYoZT0iYmxvY2siKSxnYVtkXT1lLGUpfWZ1bmN0aW9uIGlhKGEsYil7Zm9yKHZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWQ9YVtmXSxkLnN0eWxlJiYoYz1kLnN0eWxlLmRpc3BsYXksYj8oIm5vbmUiPT09YyYmKGVbZl09Vy5nZXQoZCwiZGlzcGxheSIpfHxudWxsLGVbZl18fChkLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmZGEoZCkmJihlW2ZdPWhhKGQpKSk6Im5vbmUiIT09YyYmKGVbZl09Im5vbmUiLFcuc2V0KGQsImRpc3BsYXkiLGMpKSk7Zm9yKGY9MDtmPGc7ZisrKW51bGwhPWVbZl0mJihhW2ZdLnN0eWxlLmRpc3BsYXk9ZVtmXSk7cmV0dXJuIGF9ci5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaWEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGEodGhpcyk/cih0aGlzKS5zaG93KCk6cih0aGlzKS5oaWRlKCl9KX19KTt2YXIgamE9L14oPzpjaGVja2JveHxyYWRpbykkL2ksa2E9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSspL2ksbGE9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG1hPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07bWEub3B0Z3JvdXA9bWEub3B0aW9uLG1hLnRib2R5PW1hLnRmb290PW1hLmNvbGdyb3VwPW1hLmNhcHRpb249bWEudGhlYWQsbWEudGg9bWEudGQ7ZnVuY3Rpb24gbmEoYSxiKXt2YXIgYztyZXR1cm4gYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdLHZvaWQgMD09PWJ8fGImJkIoYSxiKT9yLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIG9hKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKVcuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxXLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBwYT0vPHwmIz9cdys7LztmdW5jdGlvbiBxYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG49MCxvPWEubGVuZ3RoO248bztuKyspaWYoZj1hW25dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09ci50eXBlKGYpKXIubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKHBhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShrYS5leGVjKGYpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGk9bWFbaF18fG1hLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rci5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO3IubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixuPTA7d2hpbGUoZj1tW24rK10paWYoZCYmci5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1yLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPW5hKGwuYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGomJm9hKGcpLGMpe2s9MDt3aGlsZShmPWdbaysrXSlsYS50ZXN0KGYudHlwZXx8IiIpJiZjLnB1c2goZil9cmV0dXJuIGx9IWZ1bmN0aW9uKCl7dmFyIGE9ZC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYj1hLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGM9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxjLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxjLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxiLmFwcGVuZENoaWxkKGMpLG8uY2hlY2tDbG9uZT1iLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsby5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciByYT1kLmRvY3VtZW50RWxlbWVudCxzYT0vXmtleS8sdGE9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLHVhPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiB2YSgpe3JldHVybiEwfWZ1bmN0aW9uIHdhKCl7cmV0dXJuITF9ZnVuY3Rpb24geGEoKXt0cnl7cmV0dXJuIGQuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fWZ1bmN0aW9uIHlhKGEsYixjLGQsZSxmKXt2YXIgZyxoO2lmKCJvYmplY3QiPT10eXBlb2YgYil7InN0cmluZyIhPXR5cGVvZiBjJiYoZD1kfHxjLGM9dm9pZCAwKTtmb3IoaCBpbiBiKXlhKGEsaCxjLGQsYltoXSxmKTtyZXR1cm4gYX1pZihudWxsPT1kJiZudWxsPT1lPyhlPWMsZD1jPXZvaWQgMCk6bnVsbD09ZSYmKCJzdHJpbmciPT10eXBlb2YgYz8oZT1kLGQ9dm9pZCAwKTooZT1kLGQ9YyxjPXZvaWQgMCkpLGU9PT0hMSllPXdhO2Vsc2UgaWYoIWUpcmV0dXJuIGE7cmV0dXJuIDE9PT1mJiYoZz1lLGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9ci5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LmFkZCh0aGlzLGIsZSxkLGMpfSl9ci5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbixvLHAscT1XLmdldChhKTtpZihxKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxlJiZyLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJhLGUpLGMuZ3VpZHx8KGMuZ3VpZD1yLmd1aWQrKyksKGk9cS5ldmVudHMpfHwoaT1xLmV2ZW50cz17fSksKGc9cS5oYW5kbGUpfHwoZz1xLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHImJnIuZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP3IuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSloPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuJiYobD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LG49KGU/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG4sbD1yLmV2ZW50LnNwZWNpYWxbbl18fHt9LGs9ci5leHRlbmQoe3R5cGU6bixvcmlnVHlwZTpwLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmci5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpvLmpvaW4oIi4iKX0sZiksKG09aVtuXSl8fChtPWlbbl09W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxvLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG4sZykpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxyLmV2ZW50Lmdsb2JhbFtuXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG4sbyxwLHE9Vy5oYXNEYXRhKGEpJiZXLmdldChhKTtpZihxJiYoaT1xLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChMKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPXVhLmV4ZWMoYltqXSl8fFtdLG49cD1oWzFdLG89KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxuKXtsPXIuZXZlbnQuc3BlY2lhbFtuXXx8e30sbj0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8bixtPWlbbl18fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrby5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcCE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEsbyxxLmhhbmRsZSkhPT0hMXx8ci5yZW1vdmVFdmVudChhLG4scS5oYW5kbGUpLGRlbGV0ZSBpW25dKX1lbHNlIGZvcihuIGluIGkpci5ldmVudC5yZW1vdmUoYSxuK2Jbal0sYyxkLCEwKTtyLmlzRW1wdHlPYmplY3QoaSkmJlcucmVtb3ZlKGEsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZhciBiPXIuZXZlbnQuZml4KGEpLGMsZCxlLGYsZyxoLGk9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGo9KFcuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYi50eXBlXXx8W10saz1yLmV2ZW50LnNwZWNpYWxbYi50eXBlXXx8e307Zm9yKGlbMF09YixjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylpW2NdPWFyZ3VtZW50c1tjXTtpZihiLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGIpIT09ITEpe2g9ci5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYixqKSxjPTA7d2hpbGUoKGY9aFtjKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7Yi5jdXJyZW50VGFyZ2V0PWYuZWxlbSxkPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tkKytdKSYmIWIuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSliLnJuYW1lc3BhY2UmJiFiLnJuYW1lc3BhY2UudGVzdChnLm5hbWVzcGFjZSl8fChiLmhhbmRsZU9iaj1nLGIuZGF0YT1nLmRhdGEsZT0oKHIuZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGIucmVzdWx0PWUpPT09ITEmJihiLnByZXZlbnREZWZhdWx0KCksYi5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGIpLGIucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg9W10saT1iLmRlbGVnYXRlQ291bnQsaj1hLnRhcmdldDtpZihpJiZqLm5vZGVUeXBlJiYhKCJjbGljayI9PT1hLnR5cGUmJmEuYnV0dG9uPj0xKSlmb3IoO2ohPT10aGlzO2o9ai5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1qLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8ai5kaXNhYmxlZCE9PSEwKSl7Zm9yKGY9W10sZz17fSxjPTA7YzxpO2MrKylkPWJbY10sZT1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1nW2VdJiYoZ1tlXT1kLm5lZWRzQ29udGV4dD9yKGUsdGhpcykuaW5kZXgoaik+LTE6ci5maW5kKGUsdGhpcyxudWxsLFtqXSkubGVuZ3RoKSxnW2VdJiZmLnB1c2goZCk7Zi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmZ9KX1yZXR1cm4gaj10aGlzLGk8Yi5sZW5ndGgmJmgucHVzaCh7ZWxlbTpqLGhhbmRsZXJzOmIuc2xpY2UoaSl9KSxofSxhZGRQcm9wOmZ1bmN0aW9uKGEsYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIuRXZlbnQucHJvdG90eXBlLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpyLmlzRnVuY3Rpb24oYik/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGIodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFthXX0sc2V0OmZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19KX0sZml4OmZ1bmN0aW9uKGEpe3JldHVybiBhW3IuZXhwYW5kb10/YTpuZXcgci5FdmVudChhKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PXhhKCkmJnRoaXMuZm9jdXMpcmV0dXJuIHRoaXMuZm9jdXMoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXM9PT14YSgpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZigiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZCKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fSxyLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMpfSxyLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT92YTp3YSx0aGlzLnRhcmdldD1hLnRhcmdldCYmMz09PWEudGFyZ2V0Lm5vZGVUeXBlP2EudGFyZ2V0LnBhcmVudE5vZGU6YS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWEuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9YSxiJiZyLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxyLm5vdygpLHZvaWQodGhpc1tyLmV4cGFuZG9dPSEwKSk6bmV3IHIuRXZlbnQoYSxiKX0sci5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnIuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOndhLGlzUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOndhLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXZhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD12YSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sci5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLCJjaGFyIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihhKXt2YXIgYj1hLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS53aGljaCYmc2EudGVzdChhLnR5cGUpP251bGwhPWEuY2hhckNvZGU/YS5jaGFyQ29kZTphLmtleUNvZGU6IWEud2hpY2gmJnZvaWQgMCE9PWImJnRhLnRlc3QoYS50eXBlKT8xJmI/MToyJmI/Mzo0JmI/MjowOmEud2hpY2h9fSxyLmV2ZW50LmFkZFByb3ApLHIuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtyLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fHIuY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLHIuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4geWEodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB5YSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixyKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9d2EpLHRoaXMuZWFjaChmdW5jdGlvbigpe3IuZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9fSk7dmFyIHphPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxBYT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxCYT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxDYT0vXnRydWVcLyguKikvLERhPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBFYShhLGIpe3JldHVybiBCKGEsInRhYmxlIikmJkIoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP3IoIj50Ym9keSIsYSlbMF18fGE6YX1mdW5jdGlvbiBGYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIEdhKGEpe3ZhciBiPUNhLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gSGEoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihXLmhhc0RhdGEoYSkmJihmPVcuYWNjZXNzKGEpLGc9Vy5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2M8ZDtjKyspci5ldmVudC5hZGQoYixlLGpbZV1bY10pfVguaGFzRGF0YShhKSYmKGg9WC5hY2Nlc3MoYSksaT1yLmV4dGVuZCh7fSxoKSxYLnNldChiLGkpKX19ZnVuY3Rpb24gSWEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PWMmJmphLnRlc3QoYS50eXBlKT9iLmNoZWNrZWQ9YS5jaGVja2VkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBKYShhLGIsYyxkKXtiPWcuYXBwbHkoW10sYik7dmFyIGUsZixoLGksaixrLGw9MCxtPWEubGVuZ3RoLG49bS0xLHE9YlswXSxzPXIuaXNGdW5jdGlvbihxKTtpZihzfHxtPjEmJiJzdHJpbmciPT10eXBlb2YgcSYmIW8uY2hlY2tDbG9uZSYmQmEudGVzdChxKSlyZXR1cm4gYS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWEuZXEoZSk7cyYmKGJbMF09cS5jYWxsKHRoaXMsZSxmLmh0bWwoKSkpLEphKGYsYixjLGQpfSk7aWYobSYmKGU9cWEoYixhWzBdLm93bmVyRG9jdW1lbnQsITEsYSxkKSxmPWUuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9ZiksZnx8ZCkpe2ZvcihoPXIubWFwKG5hKGUsInNjcmlwdCIpLEZhKSxpPWgubGVuZ3RoO2w8bTtsKyspaj1lLGwhPT1uJiYoaj1yLmNsb25lKGosITAsITApLGkmJnIubWVyZ2UoaCxuYShqLCJzY3JpcHQiKSkpLGMuY2FsbChhW2xdLGosbCk7aWYoaSlmb3Ioaz1oW2gubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsci5tYXAoaCxHYSksbD0wO2w8aTtsKyspaj1oW2xdLGxhLnRlc3Qoai50eXBlfHwiIikmJiFXLmFjY2VzcyhqLCJnbG9iYWxFdmFsIikmJnIuY29udGFpbnMoayxqKSYmKGouc3JjP3IuX2V2YWxVcmwmJnIuX2V2YWxVcmwoai5zcmMpOnAoai50ZXh0Q29udGVudC5yZXBsYWNlKERhLCIiKSxrKSl9cmV0dXJuIGF9ZnVuY3Rpb24gS2EoYSxiLGMpe2Zvcih2YXIgZCxlPWI/ci5maWx0ZXIoYixhKTphLGY9MDtudWxsIT0oZD1lW2ZdKTtmKyspY3x8MSE9PWQubm9kZVR5cGV8fHIuY2xlYW5EYXRhKG5hKGQpKSxkLnBhcmVudE5vZGUmJihjJiZyLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmb2EobmEoZCwic2NyaXB0IikpLGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSk7cmV0dXJuIGF9ci5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh6YSwiPCQxPjwvJDI+Iil9LGNsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPXIuY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoby5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8ci5pc1hNTERvYyhhKSkpZm9yKGc9bmEoaCksZj1uYShhKSxkPTAsZT1mLmxlbmd0aDtkPGU7ZCsrKUlhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG5hKGEpLGc9Z3x8bmEoaCksZD0wLGU9Zi5sZW5ndGg7ZDxlO2QrKylIYShmW2RdLGdbZF0pO2Vsc2UgSGEoYSxoKTtyZXR1cm4gZz1uYShoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZvYShnLCFpJiZuYShhLCJzY3JpcHQiKSksaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZT1yLmV2ZW50LnNwZWNpYWwsZj0wO3ZvaWQgMCE9PShjPWFbZl0pO2YrKylpZihVKGMpKXtpZihiPWNbVy5leHBhbmRvXSl7aWYoYi5ldmVudHMpZm9yKGQgaW4gYi5ldmVudHMpZVtkXT9yLmV2ZW50LnJlbW92ZShjLGQpOnIucmVtb3ZlRXZlbnQoYyxkLGIuaGFuZGxlKTtjW1cuZXhwYW5kb109dm9pZCAwfWNbWC5leHBhbmRvXSYmKGNbWC5leHBhbmRvXT12b2lkIDApfX19KSxyLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBLYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIEthKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9yLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSmEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUVhKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9RWEodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBKYSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYoci5jbGVhbkRhdGEobmEoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGwhPWEmJmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiByLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIUFhLnRlc3QoYSkmJiFtYVsoa2EuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9ci5odG1sUHJlZmlsdGVyKGEpO3RyeXtmb3IoO2M8ZDtjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKHIuY2xlYW5EYXRhKG5hKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIEphKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMucGFyZW50Tm9kZTtyLmluQXJyYXkodGhpcyxhKTwwJiYoci5jbGVhbkRhdGEobmEodGhpcykpLGMmJmMucmVwbGFjZUNoaWxkKGIsdGhpcykpfSxhKX19KSxyLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W10sZT1yKGEpLGY9ZS5sZW5ndGgtMSxnPTA7Zzw9ZjtnKyspYz1nPT09Zj90aGlzOnRoaXMuY2xvbmUoITApLHIoZVtnXSlbYl0oYyksaC5hcHBseShkLGMuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhkKX19KTt2YXIgTGE9L15tYXJnaW4vLE1hPW5ldyBSZWdFeHAoIl4oIithYSsiKSg/IXB4KVthLXolXSskIiwiaSIpLE5hPWZ1bmN0aW9uKGIpe3ZhciBjPWIub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gYyYmYy5vcGVuZXJ8fChjPWEpLGMuZ2V0Q29tcHV0ZWRTdHlsZShiKX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2lmKGkpe2kuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixpLmlubmVySFRNTD0iIixyYS5hcHBlbmRDaGlsZChoKTt2YXIgYj1hLmdldENvbXB1dGVkU3R5bGUoaSk7Yz0iMSUiIT09Yi50b3AsZz0iMnB4Ij09PWIubWFyZ2luTGVmdCxlPSI0cHgiPT09Yi53aWR0aCxpLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGY9IjRweCI9PT1iLm1hcmdpblJpZ2h0LHJhLnJlbW92ZUNoaWxkKGgpLGk9bnVsbH19dmFyIGMsZSxmLGcsaD1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlJiYoaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixvLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxoLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixoLmFwcGVuZENoaWxkKGkpLHIuZXh0ZW5kKG8se3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGN9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxlfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIGIoKSxmfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYigpLGd9fSkpfSgpO2Z1bmN0aW9uIE9hKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8TmEoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdLCIiIT09Z3x8ci5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPXIuc3R5bGUoYSxiKSksIW8ucGl4ZWxNYXJnaW5SaWdodCgpJiZNYS50ZXN0KGcpJiZMYS50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiBQYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgUWE9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFJhPS9eLS0vLFNhPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sVWE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFZhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gV2EoYSl7aWYoYSBpbiBWYSlyZXR1cm4gYTt2YXIgYj1hWzBdLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPVVhLmxlbmd0aDt3aGlsZShjLS0paWYoYT1VYVtjXStiLGEgaW4gVmEpcmV0dXJuIGF9ZnVuY3Rpb24gWGEoYSl7dmFyIGI9ci5jc3NQcm9wc1thXTtyZXR1cm4gYnx8KGI9ci5jc3NQcm9wc1thXT1XYShhKXx8YSksYn1mdW5jdGlvbiBZYShhLGIsYyl7dmFyIGQ9YmEuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMl0tKGN8fDApKSsoZFszXXx8InB4Iik6Yn1mdW5jdGlvbiBaYShhLGIsYyxkLGUpe3ZhciBmLGc9MDtmb3IoZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MDtmPDQ7Zis9MikibWFyZ2luIj09PWMmJihnKz1yLmNzcyhhLGMrY2FbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1yLmNzcyhhLCJwYWRkaW5nIitjYVtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09ci5jc3MoYSwiYm9yZGVyIitjYVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPXIuY3NzKGEsInBhZGRpbmciK2NhW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1yLmNzcyhhLCJib3JkZXIiK2NhW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiAkYShhLGIsYyl7dmFyIGQsZT1OYShhKSxmPU9hKGEsYixlKSxnPSJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZSk7cmV0dXJuIE1hLnRlc3QoZik/ZjooZD1nJiYoby5ib3hTaXppbmdSZWxpYWJsZSgpfHxmPT09YS5zdHlsZVtiXSksImF1dG8iPT09ZiYmKGY9YVsib2Zmc2V0IitiWzBdLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKV0pLGY9cGFyc2VGbG9hdChmKXx8MCxmK1phKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZSkrInB4Iil9ci5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYShhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpLGo9YS5zdHlsZTtyZXR1cm4gaXx8KGI9WGEoaCkpLGc9ci5jc3NIb29rc1tiXXx8ci5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTpqW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9YmEuZXhlYyhjKSkmJmVbMV0mJihjPWZhKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChyLmNzc051bWJlcltoXT8iIjoicHgiKSksby5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaltiXT0iaW5oZXJpdCIpLGcmJiJzZXQiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGk/ai5zZXRQcm9wZXJ0eShiLGMpOmpbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9ci5jYW1lbENhc2UoYiksaT1SYS50ZXN0KGIpO3JldHVybiBpfHwoYj1YYShoKSksZz1yLmNzc0hvb2tzW2JdfHxyLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZSYmKGU9T2EoYSxiLGQpKSwibm9ybWFsIj09PWUmJmIgaW4gVGEmJihlPVRhW2JdKSwiIj09PWN8fGM/KGY9cGFyc2VGbG9hdChlKSxjPT09ITB8fGlzRmluaXRlKGYpP2Z8fDA6ZSk6ZX19KSxyLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7ci5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiFRYS50ZXN0KHIuY3NzKGEsImRpc3BsYXkiKSl8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/JGEoYSxiLGQpOmVhKGEsU2EsZnVuY3Rpb24oKXtyZXR1cm4gJGEoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj1kJiZOYShhKSxnPWQmJlphKGEsYixkLCJib3JkZXItYm94Ij09PXIuY3NzKGEsImJveFNpemluZyIsITEsZiksZik7cmV0dXJuIGcmJihlPWJhLmV4ZWMoYykpJiYicHgiIT09KGVbM118fCJweCIpJiYoYS5zdHlsZVtiXT1jLGM9ci5jc3MoYSxiKSksWWEoYSxjLGcpfX19KSxyLmNzc0hvb2tzLm1hcmdpbkxlZnQ9UGEoby5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxiKXtpZihiKXJldHVybihwYXJzZUZsb2F0KE9hKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1lYShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksci5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ZDw0O2QrKyllW2ErY2FbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sTGEudGVzdChhKXx8KHIuY3NzSG9va3NbYStiXS5zZXQ9WWEpfSksci5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKGQ9TmEoYSksZT1iLmxlbmd0aDtnPGU7ZysrKWZbYltnXV09ci5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP3Iuc3R5bGUoYSxiLGMpOnIuY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIF9hKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBfYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfXIuVHdlZW49X2EsX2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxyLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KHIuY3NzTnVtYmVyW2NdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1fYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6X2EucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9X2EucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPXIuZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpfYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxfYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9X2EucHJvdG90eXBlLF9hLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gMSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbCE9YS5lbGVtW2EucHJvcF0mJm51bGw9PWEuZWxlbS5zdHlsZVthLnByb3BdP2EuZWxlbVthLnByb3BdOihiPXIuY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKX0sc2V0OmZ1bmN0aW9uKGEpe3IuZnguc3RlcFthLnByb3BdP3IuZnguc3RlcFthLnByb3BdKGEpOjEhPT1hLmVsZW0ubm9kZVR5cGV8fG51bGw9PWEuZWxlbS5zdHlsZVtyLmNzc1Byb3BzW2EucHJvcF1dJiYhci5jc3NIb29rc1thLnByb3BdP2EuZWxlbVthLnByb3BdPWEubm93OnIuc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpfX19LF9hLnByb3BIb29rcy5zY3JvbGxUb3A9X2EucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sci5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxyLmZ4PV9hLnByb3RvdHlwZS5pbml0LHIuZnguc3RlcD17fTt2YXIgYWIsYmIsY2I9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGRiPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZWIoKXtiYiYmKGQuaGlkZGVuPT09ITEmJmEucmVxdWVzdEFuaW1hdGlvbkZyYW1lP2EucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGViKTphLnNldFRpbWVvdXQoZWIsci5meC5pbnRlcnZhbCksci5meC50aWNrKCkpfWZ1bmN0aW9uIGZiKCl7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe2FiPXZvaWQgMH0pLGFiPXIubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowO2Q8NDtkKz0yLWIpYz1jYVtkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIGhiKGEsYixjKXtmb3IodmFyIGQsZT0oa2IudHdlZW5lcnNbYl18fFtdKS5jb25jYXQoa2IudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7ZjxnO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gaWIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD0id2lkdGgiaW4gYnx8ImhlaWdodCJpbiBiLG09dGhpcyxuPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJmRhKGEpLHE9Vy5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGc9ci5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWcudW5xdWV1ZWQmJihnLnVucXVldWVkPTAsaD1nLmVtcHR5LmZpcmUsZy5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7Zy51bnF1ZXVlZHx8aCgpfSksZy51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtnLnVucXVldWVkLS0sci5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8Zy5lbXB0eS5maXJlKCl9KX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxjYi50ZXN0KGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHA/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFxfHx2b2lkIDA9PT1xW2RdKWNvbnRpbnVlO3A9ITB9bltkXT1xJiZxW2RdfHxyLnN0eWxlKGEsZCl9aWYoaT0hci5pc0VtcHR5T2JqZWN0KGIpLGl8fCFyLmlzRW1wdHlPYmplY3Qobikpe2wmJjE9PT1hLm5vZGVUeXBlJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1xJiZxLmRpc3BsYXksbnVsbD09aiYmKGo9Vy5nZXQoYSwiZGlzcGxheSIpKSxrPXIuY3NzKGEsImRpc3BsYXkiKSwibm9uZSI9PT1rJiYoaj9rPWo6KGlhKFthXSwhMCksaj1hLnN0eWxlLmRpc3BsYXl8fGosaz1yLmNzcyhhLCJkaXNwbGF5IiksaWEoW2FdKSkpLCgiaW5saW5lIj09PWt8fCJpbmxpbmUtYmxvY2siPT09ayYmbnVsbCE9aikmJiJub25lIj09PXIuY3NzKGEsImZsb2F0IikmJihpfHwobS5kb25lKGZ1bmN0aW9uKCl7by5kaXNwbGF5PWp9KSxudWxsPT1qJiYoaz1vLmRpc3BsYXksaj0ibm9uZSI9PT1rPyIiOmspKSxvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixtLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSksaT0hMTtmb3IoZCBpbiBuKWl8fChxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9Vy5hY2Nlc3MoYSwiZnhzaG93Iix7ZGlzcGxheTpqfSksZiYmKHEuaGlkZGVuPSFwKSxwJiZpYShbYV0sITApLG0uZG9uZShmdW5jdGlvbigpe3B8fGlhKFthXSksVy5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGQgaW4gbilyLnN0eWxlKGEsZCxuW2RdKX0pKSxpPWhiKHA/cVtkXTowLGQsbSksZCBpbiBxfHwocVtkXT1pLnN0YXJ0LHAmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPXIuY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sQXJyYXkuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9ci5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBrYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1rYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPXIuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWFifHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtnPGk7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksZjwxJiZpP2M6KGl8fGgubm90aWZ5V2l0aChhLFtqLDEsMF0pLGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpyLmV4dGVuZCh7fSxiKSxvcHRzOnIuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpyLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmFifHxmYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ci5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmPGc7ZisrKWlmKGQ9a2IucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIHIuaXNGdW5jdGlvbihkLnN0b3ApJiYoci5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPXIucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiByLm1hcChrLGhiLGopLHIuaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpLHIuZngudGltZXIoci5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksan1yLkFuaW1hdGlvbj1yLmV4dGVuZChrYix7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYik7cmV0dXJuIGZhKGMuZWxlbSxhLGJhLmV4ZWMoYiksYyksY31dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsYil7ci5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bIioiXSk6YT1hLm1hdGNoKEwpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWM9YVtkXSxrYi50d2VlbmVyc1tjXT1rYi50d2VlbmVyc1tjXXx8W10sa2IudHdlZW5lcnNbY10udW5zaGlmdChiKX0scHJlZmlsdGVyczpbaWJdLHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/a2IucHJlZmlsdGVycy51bnNoaWZ0KGEpOmtiLnByZWZpbHRlcnMucHVzaChhKX19KSxyLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiYib2JqZWN0Ij09dHlwZW9mIGE/ci5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxyLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXIuaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIHIuZngub2ZmP2QuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIGQuZHVyYXRpb24mJihkLmR1cmF0aW9uIGluIHIuZnguc3BlZWRzP2QuZHVyYXRpb249ci5meC5zcGVlZHNbZC5kdXJhdGlvbl06ZC5kdXJhdGlvbj1yLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtyLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJnIuZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxyLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihkYSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ci5pc0VtcHR5T2JqZWN0KGEpLGY9ci5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsci5leHRlbmQoe30sYSksZik7KGV8fFcuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9ci50aW1lcnMsZz1XLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZkYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxyLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1XLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9ci50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLHIucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2I8ZztiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksci5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPXIuZm5bYl07ci5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxyLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe3IuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksci50aW1lcnM9W10sci5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9ci50aW1lcnM7Zm9yKGFiPXIubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8ci5meC5zdG9wKCksYWI9dm9pZCAwfSxyLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe3IudGltZXJzLnB1c2goYSksci5meC5zdGFydCgpfSxyLmZ4LmludGVydmFsPTEzLHIuZnguc3RhcnQ9ZnVuY3Rpb24oKXtiYnx8KGJiPSEwLGViKCkpfSxyLmZ4LnN0b3A9ZnVuY3Rpb24oKXtiYj1udWxsfSxyLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxyLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9ci5meD9yLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGM9Yi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTthLnR5cGU9ImNoZWNrYm94IixvLmNoZWNrT249IiIhPT1hLnZhbHVlLG8ub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxhPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixvLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGIsbWI9ci5leHByLmF0dHJIYW5kbGU7ci5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVCh0aGlzLHIuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ci5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxyLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGEuZ2V0QXR0cmlidXRlP3IucHJvcChhLGIsYyk6KDE9PT1mJiZyLmlzWE1MRG9jKGEpfHwoZT1yLmF0dHJIb29rc1tiLnRvTG93ZXJDYXNlKCldfHwoci5leHByLm1hdGNoLmJvb2wudGVzdChiKT9sYjp2b2lkIDApKSx2b2lkIDAhPT1jP251bGw9PT1jP3ZvaWQgci5yZW1vdmVBdHRyKGEsYik6ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDooZD1yLmZpbmQuYXR0cihhLGIpLApudWxsPT1kP3ZvaWQgMDpkKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIW8ucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJkIoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTAsZT1iJiZiLm1hdGNoKEwpO2lmKGUmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZVtkKytdKWEucmVtb3ZlQXR0cmlidXRlKGMpfX0pLGxiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/ci5yZW1vdmVBdHRyKGEsYyk6YS5zZXRBdHRyaWJ1dGUoYyxjKSxjfX0sci5lYWNoKHIuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9bWJbYl18fHIuZmluZC5hdHRyO21iW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGc9Yi50b0xvd2VyQ2FzZSgpO3JldHVybiBkfHwoZj1tYltnXSxtYltnXT1lLGU9bnVsbCE9YyhhLGIsZCk/ZzpudWxsLG1iW2ddPWYpLGV9fSk7dmFyIG5iPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksb2I9L14oPzphfGFyZWEpJC9pO3IuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFQodGhpcyxyLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3IucHJvcEZpeFthXXx8YV19KX19KSxyLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gMT09PWYmJnIuaXNYTUxEb2MoYSl8fChiPXIucHJvcEZpeFtiXXx8YixlPXIucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1yLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOm5iLnRlc3QoYS5ub2RlTmFtZSl8fG9iLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLG8ub3B0U2VsZWN0ZWR8fChyLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksci5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtyLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSk7ZnVuY3Rpb24gcGIoYSl7dmFyIGI9YS5tYXRjaChMKXx8W107cmV0dXJuIGIuam9pbigiICIpfWZ1bmN0aW9uIHFiKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifXIuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYoci5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7cih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHFiKHRoaXMpKSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pZC5pbmRleE9mKCIgIitmKyIgIik8MCYmKGQrPWYrIiAiKTtoPXBiKGQpLGUhPT1oJiZjLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaT0wO2lmKHIuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYixxYih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChMKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1xYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYiICIrcGIoZSkrIiAiKXtnPTA7d2hpbGUoZj1iW2crK10pd2hpbGUoZC5pbmRleE9mKCIgIitmKyIgIik+LTEpZD1kLnJlcGxhY2UoIiAiK2YrIiAiLCIgIik7aD1wYihkKSxlIT09aCYmYy5zZXRBdHRyaWJ1dGUoImNsYXNzIixoKX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnIuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHFiKHRoaXMpLGIpLGIpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsZCxlLGY7aWYoInN0cmluZyI9PT1jKXtkPTAsZT1yKHRoaXMpLGY9YS5tYXRjaChMKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZSB2b2lkIDAhPT1hJiYiYm9vbGVhbiIhPT1jfHwoYj1xYih0aGlzKSxiJiZXLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixiKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixifHxhPT09ITE/IiI6Vy5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0wO2I9IiAiK2ErIiAiO3doaWxlKGM9dGhpc1tkKytdKWlmKDE9PT1jLm5vZGVUeXBlJiYoIiAiK3BiKHFiKGMpKSsiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHJiPS9cci9nO3IuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1yLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMscih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOkFycmF5LmlzQXJyYXkoZSkmJihlPXIubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPXIudmFsSG9va3NbdGhpcy50eXBlXXx8ci52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPXIudmFsSG9va3NbZS50eXBlXXx8ci52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UocmIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLHIuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9ci5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOnBiKHIudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1hLm9wdGlvbnMsZj1hLnNlbGVjdGVkSW5kZXgsZz0ic2VsZWN0LW9uZSI9PT1hLnR5cGUsaD1nP251bGw6W10saT1nP2YrMTplLmxlbmd0aDtmb3IoZD1mPDA/aTpnP2Y6MDtkPGk7ZCsrKWlmKGM9ZVtkXSwoYy5zZWxlY3RlZHx8ZD09PWYpJiYhYy5kaXNhYmxlZCYmKCFjLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFCKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9cihjKS52YWwoKSxnKXJldHVybiBiO2gucHVzaChiKX1yZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPXIubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWQ9ZVtnXSwoZC5zZWxlY3RlZD1yLmluQXJyYXkoci52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPi0xKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksci5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ci52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7aWYoQXJyYXkuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPXIuaW5BcnJheShyKGEpLnZhbCgpLGIpPi0xfX0sby5jaGVja09ufHwoci52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBzYj0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC87ci5leHRlbmQoci5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZyxoLGksaixrLG0sbixvPVtlfHxkXSxwPWwuY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1sLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWk9ZT1lfHxkLDMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmIXNiLnRlc3QocCtyLmV2ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT4tMSYmKHE9cC5zcGxpdCgiLiIpLHA9cS5zaGlmdCgpLHEuc29ydCgpKSxrPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCxiPWJbci5leHBhbmRvXT9iOm5ldyByLkV2ZW50KHAsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1mPzI6MyxiLm5hbWVzcGFjZT1xLmpvaW4oIi4iKSxiLnJuYW1lc3BhY2U9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWUpLGM9bnVsbD09Yz9bYl06ci5tYWtlQXJyYXkoYyxbYl0pLG49ci5ldmVudC5zcGVjaWFsW3BdfHx7fSxmfHwhbi50cmlnZ2VyfHxuLnRyaWdnZXIuYXBwbHkoZSxjKSE9PSExKSl7aWYoIWYmJiFuLm5vQnViYmxlJiYhci5pc1dpbmRvdyhlKSl7Zm9yKGo9bi5kZWxlZ2F0ZVR5cGV8fHAsc2IudGVzdChqK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGk9aDtpPT09KGUub3duZXJEb2N1bWVudHx8ZCkmJm8ucHVzaChpLmRlZmF1bHRWaWV3fHxpLnBhcmVudFdpbmRvd3x8YSl9Zz0wO3doaWxlKChoPW9bZysrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWc+MT9qOm4uYmluZFR5cGV8fHAsbT0oVy5nZXQoaCwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZXLmdldChoLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGgsYyksbT1rJiZoW2tdLG0mJm0uYXBwbHkmJlUoaCkmJihiLnJlc3VsdD1tLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXAsZnx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8bi5fZGVmYXVsdCYmbi5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpIT09ITF8fCFVKGUpfHxrJiZyLmlzRnVuY3Rpb24oZVtwXSkmJiFyLmlzV2luZG93KGUpJiYoaT1lW2tdLGkmJihlW2tdPW51bGwpLHIuZXZlbnQudHJpZ2dlcmVkPXAsZVtwXSgpLHIuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxpJiYoZVtrXT1pKSksYi5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ci5leHRlbmQobmV3IHIuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7ci5ldmVudC50cmlnZ2VyKGQsbnVsbCxiKX19KSxyLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtpZihjKXJldHVybiByLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApfX0pLHIuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3IuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLHIuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxvLmZvY3VzaW49Im9uZm9jdXNpbiJpbiBhLG8uZm9jdXNpbnx8ci5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe3IuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxyLmV2ZW50LmZpeChhKSl9O3IuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1XLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLFcuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9Vy5hY2Nlc3MoZCxiKS0xO2U/Vy5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxXLnJlbW92ZShkLGIpKX19fSk7dmFyIHRiPWEubG9jYXRpb24sdWI9ci5ub3coKSx2Yj0vXD8vO3IucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGM7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7Yz0obmV3IGEuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKX1jYXRjaChkKXtjPXZvaWQgMH1yZXR1cm4gYyYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxyLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgd2I9L1xbXF0kLyx4Yj0vXHI/XG4vZyx5Yj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIEFiKGEsYixjLGQpe3ZhciBlO2lmKEFycmF5LmlzQXJyYXkoYikpci5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHx3Yi50ZXN0KGEpP2QoYSxlKTpBYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09ci50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpQWIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfXIucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1yLmlzRnVuY3Rpb24oYik/YigpOmI7ZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09Yz8iIjpjKX07aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFyLmlzUGxhaW5PYmplY3QoYSkpci5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlBYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIil9LHIuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gci5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXIucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP3IubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXIodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IWphLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9cih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOkFycmF5LmlzQXJyYXkoYyk/ci5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhiLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YiwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBCYj0vJTIwL2csQ2I9LyMuKiQvLERiPS8oWz8mXSlfPVteJl0qLyxFYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEZiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLEdiPS9eKD86R0VUfEhFQUQpJC8sSGI9L15cL1wvLyxJYj17fSxKYj17fSxLYj0iKi8iLmNvbmNhdCgiKiIpLExiPWQuY3JlYXRlRWxlbWVudCgiYSIpO0xiLmhyZWY9dGIuaHJlZjtmdW5jdGlvbiBNYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8W107aWYoci5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxyLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYihhLGIpe3ZhciBjLGQsZT1yLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZyLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31pZihmKXJldHVybiBmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl19ZnVuY3Rpb24gUWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1yLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6dGIuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6RmIudGVzdCh0Yi5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpLYix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6ci5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/T2IoT2IoYSxyLmFqYXhTZXR0aW5ncyksYik6T2Ioci5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6TWIoSWIpLGFqYXhUcmFuc3BvcnQ6TWIoSmIpLGFqYXg6ZnVuY3Rpb24oYixjKXsib2JqZWN0Ij09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGM9Y3x8e307dmFyIGUsZixnLGgsaSxqLGssbCxtLG4sbz1yLmFqYXhTZXR1cCh7fSxjKSxwPW8uY29udGV4dHx8byxxPW8uY29udGV4dCYmKHAubm9kZVR5cGV8fHAuanF1ZXJ5KT9yKHApOnIuZXZlbnQscz1yLkRlZmVycmVkKCksdD1yLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1PW8uc3RhdHVzQ29kZXx8e30sdj17fSx3PXt9LHg9ImNhbmNlbGVkIix5PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoayl7aWYoIWgpe2g9e307d2hpbGUoYj1FYi5leGVjKGcpKWhbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9aFthLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGs/ZzpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWsmJihhPXdbYS50b0xvd2VyQ2FzZSgpXT13W2EudG9Mb3dlckNhc2UoKV18fGEsdlthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1rJiYoby5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoayl5LmFsd2F5cyhhW3kuc3RhdHVzXSk7ZWxzZSBmb3IoYiBpbiBhKXVbYl09W3VbYl0sYVtiXV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHg7cmV0dXJuIGUmJmUuYWJvcnQoYiksQSgwLGIpLHRoaXN9fTtpZihzLnByb21pc2UoeSksby51cmw9KChifHxvLnVybHx8dGIuaHJlZikrIiIpLnJlcGxhY2UoSGIsdGIucHJvdG9jb2wrIi8vIiksby50eXBlPWMubWV0aG9kfHxjLnR5cGV8fG8ubWV0aG9kfHxvLnR5cGUsby5kYXRhVHlwZXM9KG8uZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChMKXx8WyIiXSxudWxsPT1vLmNyb3NzRG9tYWluKXtqPWQuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtqLmhyZWY9by51cmwsai5ocmVmPWouaHJlZixvLmNyb3NzRG9tYWluPUxiLnByb3RvY29sKyIvLyIrTGIuaG9zdCE9ai5wcm90b2NvbCsiLy8iK2ouaG9zdH1jYXRjaCh6KXtvLmNyb3NzRG9tYWluPSEwfX1pZihvLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygby5kYXRhJiYoby5kYXRhPXIucGFyYW0oby5kYXRhLG8udHJhZGl0aW9uYWwpKSxOYihJYixvLGMseSksaylyZXR1cm4geTtsPXIuZXZlbnQmJm8uZ2xvYmFsLGwmJjA9PT1yLmFjdGl2ZSsrJiZyLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLG8udHlwZT1vLnR5cGUudG9VcHBlckNhc2UoKSxvLmhhc0NvbnRlbnQ9IUdiLnRlc3Qoby50eXBlKSxmPW8udXJsLnJlcGxhY2UoQ2IsIiIpLG8uaGFzQ29udGVudD9vLmRhdGEmJm8ucHJvY2Vzc0RhdGEmJjA9PT0oby5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoby5kYXRhPW8uZGF0YS5yZXBsYWNlKEJiLCIrIikpOihuPW8udXJsLnNsaWNlKGYubGVuZ3RoKSxvLmRhdGEmJihmKz0odmIudGVzdChmKT8iJiI6Ij8iKStvLmRhdGEsZGVsZXRlIG8uZGF0YSksby5jYWNoZT09PSExJiYoZj1mLnJlcGxhY2UoRGIsIiQxIiksbj0odmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK3ViKysgK24pLG8udXJsPWYrbiksby5pZk1vZGlmaWVkJiYoci5sYXN0TW9kaWZpZWRbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHIubGFzdE1vZGlmaWVkW2ZdKSxyLmV0YWdbZl0mJnkuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsci5ldGFnW2ZdKSksKG8uZGF0YSYmby5oYXNDb250ZW50JiZvLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsby5jb250ZW50VHlwZSkseS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLG8uZGF0YVR5cGVzWzBdJiZvLmFjY2VwdHNbby5kYXRhVHlwZXNbMF1dP28uYWNjZXB0c1tvLmRhdGFUeXBlc1swXV0rKCIqIiE9PW8uZGF0YVR5cGVzWzBdPyIsICIrS2IrIjsgcT0wLjAxIjoiIik6by5hY2NlcHRzWyIqIl0pO2ZvcihtIGluIG8uaGVhZGVycyl5LnNldFJlcXVlc3RIZWFkZXIobSxvLmhlYWRlcnNbbV0pO2lmKG8uYmVmb3JlU2VuZCYmKG8uYmVmb3JlU2VuZC5jYWxsKHAseSxvKT09PSExfHxrKSlyZXR1cm4geS5hYm9ydCgpO2lmKHg9ImFib3J0Iix0LmFkZChvLmNvbXBsZXRlKSx5LmRvbmUoby5zdWNjZXNzKSx5LmZhaWwoby5lcnJvciksZT1OYihKYixvLGMseSkpe2lmKHkucmVhZHlTdGF0ZT0xLGwmJnEudHJpZ2dlcigiYWpheFNlbmQiLFt5LG9dKSxrKXJldHVybiB5O28uYXN5bmMmJm8udGltZW91dD4wJiYoaT1hLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt5LmFib3J0KCJ0aW1lb3V0Iil9LG8udGltZW91dCkpO3RyeXtrPSExLGUuc2VuZCh2LEEpfWNhdGNoKHope2lmKGspdGhyb3cgejtBKC0xLHopfX1lbHNlIEEoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIEEoYixjLGQsaCl7dmFyIGosbSxuLHYsdyx4PWM7a3x8KGs9ITAsaSYmYS5jbGVhclRpbWVvdXQoaSksZT12b2lkIDAsZz1ofHwiIix5LnJlYWR5U3RhdGU9Yj4wPzQ6MCxqPWI+PTIwMCYmYjwzMDB8fDMwND09PWIsZCYmKHY9UGIobyx5LGQpKSx2PVFiKG8sdix5LGopLGo/KG8uaWZNb2RpZmllZCYmKHc9eS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihyLmxhc3RNb2RpZmllZFtmXT13KSx3PXkuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoci5ldGFnW2ZdPXcpKSwyMDQ9PT1ifHwiSEVBRCI9PT1vLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1iP3g9Im5vdG1vZGlmaWVkIjooeD12LnN0YXRlLG09di5kYXRhLG49di5lcnJvcixqPSFuKSk6KG49eCwhYiYmeHx8KHg9ImVycm9yIixiPDAmJihiPTApKSkseS5zdGF0dXM9Yix5LnN0YXR1c1RleHQ9KGN8fHgpKyIiLGo/cy5yZXNvbHZlV2l0aChwLFttLHgseV0pOnMucmVqZWN0V2l0aChwLFt5LHgsbl0pLHkuc3RhdHVzQ29kZSh1KSx1PXZvaWQgMCxsJiZxLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt5LG8saj9tOm5dKSx0LmZpcmVXaXRoKHAsW3kseF0pLGwmJihxLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3ksb10pLC0tci5hY3RpdmV8fHIuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB5fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gci5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHIuZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLHIuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe3JbYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHIuaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLHIuYWpheChyLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sci5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksci5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gci5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxyLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gdGhpc1swXSYmKHIuaXNGdW5jdGlvbihhKSYmKGE9YS5jYWxsKHRoaXNbMF0pKSxiPXIoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiByLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3IodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXIodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9ci5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7cih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxyLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIXIuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LHIuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxyLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319O3ZhciBSYj17MDoyMDAsMTIyMzoyMDR9LFNiPXIuYWpheFNldHRpbmdzLnhocigpO28uY29ycz0hIVNiJiYid2l0aENyZWRlbnRpYWxzImluIFNiLG8uYWpheD1TYj0hIVNiLHIuYWpheFRyYW5zcG9ydChmdW5jdGlvbihiKXt2YXIgYyxkO2lmKG8uY29yc3x8U2ImJiFiLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7dmFyIGcsaD1iLnhocigpO2lmKGgub3BlbihiLnR5cGUsYi51cmwsYi5hc3luYyxiLnVzZXJuYW1lLGIucGFzc3dvcmQpLGIueGhyRmllbGRzKWZvcihnIGluIGIueGhyRmllbGRzKWhbZ109Yi54aHJGaWVsZHNbZ107Yi5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYi5taW1lVHlwZSksYi5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihnIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGcsZVtnXSk7Yz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtjJiYoYz1kPWgub25sb2FkPWgub25lcnJvcj1oLm9uYWJvcnQ9aC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09YT9oLmFib3J0KCk6ImVycm9yIj09PWE/Im51bWJlciIhPXR5cGVvZiBoLnN0YXR1cz9mKDAsImVycm9yIik6ZihoLnN0YXR1cyxoLnN0YXR1c1RleHQpOmYoUmJbaC5zdGF0dXNdfHxoLnN0YXR1cyxoLnN0YXR1c1RleHQsInRleHQiIT09KGgucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIGgucmVzcG9uc2VUZXh0P3tiaW5hcnk6aC5yZXNwb25zZX06e3RleHQ6aC5yZXNwb25zZVRleHR9LGguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGgub25sb2FkPWMoKSxkPWgub25lcnJvcj1jKCJlcnJvciIpLHZvaWQgMCE9PWgub25hYm9ydD9oLm9uYWJvcnQ9ZDpoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1oLnJlYWR5U3RhdGUmJmEuc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmQoKX0pfSxjPWMoImFib3J0Iik7dHJ5e2guc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCl9Y2F0Y2goaSl7aWYoYyl0aHJvdyBpfX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX0pLHIuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXthLmNyb3NzRG9tYWluJiYoYS5jb250ZW50cy5zY3JpcHQ9ITEpfSksci5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ2xvYmFsRXZhbChhKSxhfX19KSxyLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksci5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXtiPXIoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZigiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGQuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgVGI9W10sVWI9Lyg9KVw/KD89JnwkKXxcP1w/LztyLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9VGIucG9wKCl8fHIuZXhwYW5kbysiXyIrdWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLHIuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKFViLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVWIudGVzdChiLmRhdGEpJiYiZGF0YSIpO2lmKGh8fCJqc29ucCI9PT1iLmRhdGFUeXBlc1swXSlyZXR1cm4gZT1iLmpzb25wQ2FsbGJhY2s9ci5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGg/YltoXT1iW2hdLnJlcGxhY2UoVWIsIiQxIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KHZiLnRlc3QoYi51cmwpPyImIjoiPyIpK2IuanNvbnArIj0iK2UpLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBnfHxyLmVycm9yKGUrIiB3YXMgbm90IGNhbGxlZCIpLGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWY/cihhKS5yZW1vdmVQcm9wKGUpOmFbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxUYi5wdXNoKGUpKSxnJiZyLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLCJzY3JpcHQifSksby5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1kLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09YS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxyLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybltdOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSk7dmFyIGUsZixnO3JldHVybiBifHwoby5jcmVhdGVIVE1MRG9jdW1lbnQ/KGI9ZC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLGU9Yi5jcmVhdGVFbGVtZW50KCJiYXNlIiksZS5ocmVmPWQubG9jYXRpb24uaHJlZixiLmhlYWQuYXBwZW5kQ2hpbGQoZSkpOmI9ZCksZj1DLmV4ZWMoYSksZz0hYyYmW10sZj9bYi5jcmVhdGVFbGVtZW50KGZbMV0pXTooZj1xYShbYV0sYixnKSxnJiZnLmxlbmd0aCYmcihnKS5yZW1vdmUoKSxyLm1lcmdlKFtdLGYuY2hpbGROb2RlcykpfSxyLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD4tMSYmKGQ9cGIoYS5zbGljZShoKSksYT1hLnNsaWNlKDAsaCkpLHIuaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmci5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP3IoIjxkaXY+IikuYXBwZW5kKHIucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sci5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtyLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksci5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHIuZ3JlcChyLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0sci5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1yLmNzcyhhLCJwb3NpdGlvbiIpLGw9cihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9ci5jc3MoYSwidG9wIiksaT1yLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxyLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsci5leHRlbmQoe30saCkpKSxudWxsIT1iLnRvcCYmKG0udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG0ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sci5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3Iub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQsZSxmPXRoaXNbMF07aWYoZilyZXR1cm4gZi5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGI9Zi5vd25lckRvY3VtZW50LGM9Yi5kb2N1bWVudEVsZW1lbnQsZT1iLmRlZmF1bHRWaWV3LHt0b3A6ZC50b3ArZS5wYWdlWU9mZnNldC1jLmNsaWVudFRvcCxsZWZ0OmQubGVmdCtlLnBhZ2VYT2Zmc2V0LWMuY2xpZW50TGVmdH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXIuY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLEIoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkPXt0b3A6ZC50b3Arci5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxsZWZ0OmQubGVmdCtyLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKX0pLHt0b3A6Yi50b3AtZC50b3Atci5jc3MoYywibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtZC5sZWZ0LXIuY3NzKGMsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYic3RhdGljIj09PXIuY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8cmF9KX19KSxyLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0icGFnZVlPZmZzZXQiPT09YjtyLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBUKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmO3JldHVybiByLmlzV2luZG93KGEpP2Y9YTo5PT09YS5ub2RlVHlwZSYmKGY9YS5kZWZhdWx0Vmlldyksdm9pZCAwPT09ZT9mP2ZbYl06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP2YucGFnZVhPZmZzZXQ6ZSxjP2U6Zi5wYWdlWU9mZnNldCk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgpfX0pLHIuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe3IuY3NzSG9va3NbYl09UGEoby5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7aWYoYylyZXR1cm4gYz1PYShhLGIpLE1hLnRlc3QoYyk/cihhKS5wb3NpdGlvbigpW2JdKyJweCI6Y30pfSksci5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtyLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7ci5mbltkXT1mdW5jdGlvbihlLGYpe3ZhciBnPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxoPWN8fChlPT09ITB8fGY9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFQodGhpcyxmdW5jdGlvbihiLGMsZSl7dmFyIGY7cmV0dXJuIHIuaXNXaW5kb3coYik/MD09PWQuaW5kZXhPZigib3V0ZXIiKT9iWyJpbm5lciIrYV06Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGY9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGZbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGZbIm9mZnNldCIrYV0sZlsiY2xpZW50IithXSkpOnZvaWQgMD09PWU/ci5jc3MoYixjLGgpOnIuc3R5bGUoYixjLGUsaCl9LGIsZz9lOnZvaWQgMCxnKX19KX0pLHIuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KSxyLmhvbGRSZWFkeT1mdW5jdGlvbihhKXthP3IucmVhZHlXYWl0Kys6ci5yZWFkeSghMCl9LHIuaXNBcnJheT1BcnJheS5pc0FycmF5LHIucGFyc2VKU09OPUpTT04ucGFyc2Usci5ub2RlTmFtZT1CLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIFZiPWEualF1ZXJ5LFdiPWEuJDtyZXR1cm4gci5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1yJiYoYS4kPVdiKSxiJiZhLmpRdWVyeT09PXImJihhLmpRdWVyeT1WYikscn0sYnx8KGEualF1ZXJ5PWEuJD1yKSxyfSk7Cg=="}},"time_used":580,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":427,"receive":153,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/tether.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.300Z","timestamp":1785147795300,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/tether.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:36 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 7222\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":25005,"size_decoded":7766,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (25005), with no line terminators","md5":"4addc615e1906aad0cb15b5440d794a3","sha1":"d34f1f7de9a90bb18855ee82d17a979451ed5f83","sha256":"d5c88d31b9e65ff1a15b7c237c495c5c2a92a692c2ada646f3858354f6c9ac2c","sha512":"adf846344ca643f534ad04dc15ae4d3892cb406293d47e65bce6433c90a97e03f24a39ba84db5a3c2c29c3ab06c341e6524a9b14dac0a6f221734659d3f956ac","ssdeep":"768:1Jc67wdFbgSo6h+T7zMczQvoK/ww8l31g9CZQ5nAgM:zn74bFopz+AK/wM5Af","tlshash":"9fb2d6a8725170b681db5263907f930e7132c17463879054b63cc9f58db8d8e62abf7e","first_seen":"2025-06-25T11:59:30.667338Z","last_seen":"2026-08-11T00:25:55.274606Z","times_seen":29,"resource_available":true,"data":"IWZ1bmN0aW9uKHQsZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSxleHBvcnRzLG1vZHVsZSk6dC5UZXRoZXI9ZSgpfSh0aGlzLGZ1bmN0aW9uKHQsZSxvKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG4odCl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPXt9O2Zvcih2YXIgaSBpbiBlKW9baV09ZVtpXTtpZih0Lm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudCl7dmFyIHI9dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmZyYW1lRWxlbWVudDtpZihyKXt2YXIgcz1uKHIpO28udG9wKz1zLnRvcCxvLmJvdHRvbSs9cy50b3Asby5sZWZ0Kz1zLmxlZnQsby5yaWdodCs9cy5sZWZ0fX1yZXR1cm4gb31mdW5jdGlvbiByKHQpe3ZhciBlPWdldENvbXB1dGVkU3R5bGUodCl8fHt9LG89ZS5wb3NpdGlvbixpPVtdO2lmKCJmaXhlZCI9PT1vKXJldHVyblt0XTtmb3IodmFyIG49dDsobj1uLnBhcmVudE5vZGUpJiZuJiYxPT09bi5ub2RlVHlwZTspe3ZhciByPXZvaWQgMDt0cnl7cj1nZXRDb21wdXRlZFN0eWxlKG4pfWNhdGNoKHMpe31pZigidW5kZWZpbmVkIj09dHlwZW9mIHJ8fG51bGw9PT1yKXJldHVybiBpLnB1c2gobiksaTt2YXIgYT1yLGY9YS5vdmVyZmxvdyxsPWEub3ZlcmZsb3dYLGg9YS5vdmVyZmxvd1k7LyhhdXRvfHNjcm9sbCkvLnRlc3QoZitoK2wpJiYoImFic29sdXRlIiE9PW98fFsicmVsYXRpdmUiLCJhYnNvbHV0ZSIsImZpeGVkIl0uaW5kZXhPZihyLnBvc2l0aW9uKT49MCkmJmkucHVzaChuKX1yZXR1cm4gaS5wdXNoKHQub3duZXJEb2N1bWVudC5ib2R5KSx0Lm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudCYmaS5wdXNoKHQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyksaX1mdW5jdGlvbiBzKCl7QSYmZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChBKSxBPW51bGx9ZnVuY3Rpb24gYSh0KXt2YXIgZT12b2lkIDA7dD09PWRvY3VtZW50PyhlPWRvY3VtZW50LHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTplPXQub3duZXJEb2N1bWVudDt2YXIgbz1lLmRvY3VtZW50RWxlbWVudCxpPW4odCkscj1QKCk7cmV0dXJuIGkudG9wLT1yLnRvcCxpLmxlZnQtPXIubGVmdCwidW5kZWZpbmVkIj09dHlwZW9mIGkud2lkdGgmJihpLndpZHRoPWRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGgtaS5sZWZ0LWkucmlnaHQpLCJ1bmRlZmluZWQiPT10eXBlb2YgaS5oZWlnaHQmJihpLmhlaWdodD1kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodC1pLnRvcC1pLmJvdHRvbSksaS50b3A9aS50b3Atby5jbGllbnRUb3AsaS5sZWZ0PWkubGVmdC1vLmNsaWVudExlZnQsaS5yaWdodD1lLmJvZHkuY2xpZW50V2lkdGgtaS53aWR0aC1pLmxlZnQsaS5ib3R0b209ZS5ib2R5LmNsaWVudEhlaWdodC1pLmhlaWdodC1pLnRvcCxpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQub2Zmc2V0UGFyZW50fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gbCgpe2lmKE0pcmV0dXJuIE07dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5zdHlsZS53aWR0aD0iMTAwJSIsdC5zdHlsZS5oZWlnaHQ9IjIwMHB4Ijt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoKGUuc3R5bGUse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHBvaW50ZXJFdmVudHM6Im5vbmUiLHZpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6IjIwMHB4IixoZWlnaHQ6IjE1MHB4IixvdmVyZmxvdzoiaGlkZGVuIn0pLGUuYXBwZW5kQ2hpbGQodCksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgbz10Lm9mZnNldFdpZHRoO2Uuc3R5bGUub3ZlcmZsb3c9InNjcm9sbCI7dmFyIGk9dC5vZmZzZXRXaWR0aDtvPT09aSYmKGk9ZS5jbGllbnRXaWR0aCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlKTt2YXIgbj1vLWk7cmV0dXJuIE09e3dpZHRoOm4saGVpZ2h0Om59fWZ1bmN0aW9uIGgoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/e306YXJndW1lbnRzWzBdLGU9W107cmV0dXJuIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsYXJndW1lbnRzKSxlLnNsaWNlKDEpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG8gaW4gZSkoe30pLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSl9KSx0fWZ1bmN0aW9uIGQodCxlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuY2xhc3NMaXN0KWUuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UudHJpbSgpJiZ0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KTtlbHNle3ZhciBvPW5ldyBSZWdFeHAoIihefCApIitlLnNwbGl0KCIgIikuam9pbigifCIpKyIoIHwkKSIsImdpIiksaT1jKHQpLnJlcGxhY2UobywiICIpO2codCxpKX19ZnVuY3Rpb24gcCh0LGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5jbGFzc0xpc3QpZS5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS50cmltKCkmJnQuY2xhc3NMaXN0LmFkZChlKX0pO2Vsc2V7ZCh0LGUpO3ZhciBvPWModCkrKCIgIitlKTtnKHQsbyl9fWZ1bmN0aW9uIHUodCxlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuY2xhc3NMaXN0KXJldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhlKTt2YXIgbz1jKHQpO3JldHVybiBuZXcgUmVnRXhwKCIoXnwgKSIrZSsiKCB8JCkiLCJnaSIpLnRlc3Qobyl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdC5jbGFzc05hbWUgaW5zdGFuY2VvZiB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuU1ZHQW5pbWF0ZWRTdHJpbmc/dC5jbGFzc05hbWUuYmFzZVZhbDp0LmNsYXNzTmFtZX1mdW5jdGlvbiBnKHQsZSl7dC5zZXRBdHRyaWJ1dGUoImNsYXNzIixlKX1mdW5jdGlvbiBtKHQsZSxvKXtvLmZvckVhY2goZnVuY3Rpb24obyl7ZS5pbmRleE9mKG8pPT09LTEmJnUodCxvKSYmZCh0LG8pfSksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UodCxlKXx8cCh0LGUpfSl9ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHYodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHkodCxlKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPD0yfHx2b2lkIDA9PT1hcmd1bWVudHNbMl0/MTphcmd1bWVudHNbMl07cmV0dXJuIHQrbz49ZSYmZT49dC1vfWZ1bmN0aW9uIGIoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHBlcmZvcm1hbmNlJiYidW5kZWZpbmVkIiE9dHlwZW9mIHBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTorbmV3IERhdGV9ZnVuY3Rpb24gdygpe2Zvcih2YXIgdD17dG9wOjAsbGVmdDowfSxlPWFyZ3VtZW50cy5sZW5ndGgsbz1BcnJheShlKSxpPTA7aTxlO2krKylvW2ldPWFyZ3VtZW50c1tpXTtyZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvPWUudG9wLGk9ZS5sZWZ0OyJzdHJpbmciPT10eXBlb2YgbyYmKG89cGFyc2VGbG9hdChvLDEwKSksInN0cmluZyI9PXR5cGVvZiBpJiYoaT1wYXJzZUZsb2F0KGksMTApKSx0LnRvcCs9byx0LmxlZnQrPWl9KSx0fWZ1bmN0aW9uIEModCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubGVmdCYmdC5sZWZ0LmluZGV4T2YoIiUiKSE9PS0xJiYodC5sZWZ0PXBhcnNlRmxvYXQodC5sZWZ0LDEwKS8xMDAqZS53aWR0aCksInN0cmluZyI9PXR5cGVvZiB0LnRvcCYmdC50b3AuaW5kZXhPZigiJSIpIT09LTEmJih0LnRvcD1wYXJzZUZsb2F0KHQudG9wLDEwKS8xMDAqZS5oZWlnaHQpLHR9ZnVuY3Rpb24gTyh0LGUpe3JldHVybiJzY3JvbGxQYXJlbnQiPT09ZT9lPXQuc2Nyb2xsUGFyZW50c1swXToid2luZG93Ij09PWUmJihlPVtwYWdlWE9mZnNldCxwYWdlWU9mZnNldCxpbm5lcldpZHRoK3BhZ2VYT2Zmc2V0LGlubmVySGVpZ2h0K3BhZ2VZT2Zmc2V0XSksZT09PWRvY3VtZW50JiYoZT1lLmRvY3VtZW50RWxlbWVudCksInVuZGVmaW5lZCIhPXR5cGVvZiBlLm5vZGVUeXBlJiYhZnVuY3Rpb24oKXt2YXIgdD1lLG89YShlKSxpPW8sbj1nZXRDb21wdXRlZFN0eWxlKGUpO2lmKGU9W2kubGVmdCxpLnRvcCxvLndpZHRoK2kubGVmdCxvLmhlaWdodCtpLnRvcF0sdC5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQpe3ZhciByPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztlWzBdKz1yLnBhZ2VYT2Zmc2V0LGVbMV0rPXIucGFnZVlPZmZzZXQsZVsyXSs9ci5wYWdlWE9mZnNldCxlWzNdKz1yLnBhZ2VZT2Zmc2V0fUcuZm9yRWFjaChmdW5jdGlvbih0LG8pe3Q9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpLCJUb3AiPT09dHx8IkxlZnQiPT09dD9lW29dKz1wYXJzZUZsb2F0KG5bImJvcmRlciIrdCsiV2lkdGgiXSk6ZVtvXS09cGFyc2VGbG9hdChuWyJib3JkZXIiK3QrIldpZHRoIl0pfSl9KCksZX12YXIgRT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIGk9ZVtvXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1yZXR1cm4gZnVuY3Rpb24oZSxvLGkpe3JldHVybiBvJiZ0KGUucHJvdG90eXBlLG8pLGkmJnQoZSxpKSxlfX0oKSx4PXZvaWQgMDsidW5kZWZpbmVkIj09dHlwZW9mIHgmJih4PXttb2R1bGVzOltdfSk7dmFyIEE9bnVsbCxUPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4rK3R9fSgpLFM9e30sUD1mdW5jdGlvbigpe3ZhciB0PUE7dCYmZG9jdW1lbnQuYm9keS5jb250YWlucyh0KXx8KHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5zZXRBdHRyaWJ1dGUoImRhdGEtdGV0aGVyLWlkIixUKCkpLGgodC5zdHlsZSx7dG9wOjAsbGVmdDowLHBvc2l0aW9uOiJhYnNvbHV0ZSJ9KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpLEE9dCk7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGV0aGVyLWlkIik7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBTW2VdJiYoU1tlXT1uKHQpLGsoZnVuY3Rpb24oKXtkZWxldGUgU1tlXX0pKSxTW2VdfSxNPW51bGwsVz1bXSxrPWZ1bmN0aW9uKHQpe1cucHVzaCh0KX0sXz1mdW5jdGlvbigpe2Zvcih2YXIgdD12b2lkIDA7dD1XLnBvcCgpOyl0KCl9LEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7aSh0aGlzLHQpfXJldHVybiBFKHQsW3trZXk6Im9uIix2YWx1ZTpmdW5jdGlvbih0LGUsbyl7dmFyIGk9IShhcmd1bWVudHMubGVuZ3RoPD0zfHx2b2lkIDA9PT1hcmd1bWVudHNbM10pJiZhcmd1bWVudHNbM107InVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLmJpbmRpbmdzJiYodGhpcy5iaW5kaW5ncz17fSksInVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLmJpbmRpbmdzW3RdJiYodGhpcy5iaW5kaW5nc1t0XT1bXSksdGhpcy5iaW5kaW5nc1t0XS5wdXNoKHtoYW5kbGVyOmUsY3R4Om8sb25jZTppfSl9fSx7a2V5OiJvbmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbyl7dGhpcy5vbih0LGUsbywhMCl9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLmJpbmRpbmdzJiYidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuYmluZGluZ3NbdF0paWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlKWRlbGV0ZSB0aGlzLmJpbmRpbmdzW3RdO2Vsc2UgZm9yKHZhciBvPTA7bzx0aGlzLmJpbmRpbmdzW3RdLmxlbmd0aDspdGhpcy5iaW5kaW5nc1t0XVtvXS5oYW5kbGVyPT09ZT90aGlzLmJpbmRpbmdzW3RdLnNwbGljZShvLDEpOisrb319LHtrZXk6InRyaWdnZXIiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5iaW5kaW5ncyYmdGhpcy5iaW5kaW5nc1t0XSl7Zm9yKHZhciBlPTAsbz1hcmd1bWVudHMubGVuZ3RoLGk9QXJyYXkobz4xP28tMTowKSxuPTE7bjxvO24rKylpW24tMV09YXJndW1lbnRzW25dO2Zvcig7ZTx0aGlzLmJpbmRpbmdzW3RdLmxlbmd0aDspe3ZhciByPXRoaXMuYmluZGluZ3NbdF1bZV0scz1yLmhhbmRsZXIsYT1yLmN0eCxmPXIub25jZSxsPWE7InVuZGVmaW5lZCI9PXR5cGVvZiBsJiYobD10aGlzKSxzLmFwcGx5KGwsaSksZj90aGlzLmJpbmRpbmdzW3RdLnNwbGljZShlLDEpOisrZX19fX1dKSx0fSgpO3guVXRpbHM9e2dldEFjdHVhbEJvdW5kaW5nQ2xpZW50UmVjdDpuLGdldFNjcm9sbFBhcmVudHM6cixnZXRCb3VuZHM6YSxnZXRPZmZzZXRQYXJlbnQ6ZixleHRlbmQ6aCxhZGRDbGFzczpwLHJlbW92ZUNsYXNzOmQsaGFzQ2xhc3M6dSx1cGRhdGVDbGFzc2VzOm0sZGVmZXI6ayxmbHVzaDpfLHVuaXF1ZUlkOlQsRXZlbnRlZDpCLGdldFNjcm9sbEJhclNpemU6bCxyZW1vdmVVdGlsRWxlbWVudHM6c307dmFyIHo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG89W10saT0hMCxuPSExLHI9dm9pZCAwO3RyeXtmb3IodmFyIHMsYT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KHM9YS5uZXh0KCkpLmRvbmUpJiYoby5wdXNoKHMudmFsdWUpLCFlfHxvLmxlbmd0aCE9PWUpO2k9ITApO31jYXRjaChmKXtuPSEwLHI9Zn1maW5hbGx5e3RyeXshaSYmYVsicmV0dXJuIl0mJmFbInJldHVybiJdKCl9ZmluYWxseXtpZihuKXRocm93IHJ9fXJldHVybiBvfXJldHVybiBmdW5jdGlvbihlLG8pe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSlyZXR1cm4gdChlLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCksRT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIGk9ZVtvXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1yZXR1cm4gZnVuY3Rpb24oZSxvLGkpe3JldHVybiBvJiZ0KGUucHJvdG90eXBlLG8pLGkmJnQoZSxpKSxlfX0oKSxqPWZ1bmN0aW9uKHQsZSxvKXtmb3IodmFyIGk9ITA7aTspe3ZhciBuPXQscj1lLHM9bztpPSExLG51bGw9PT1uJiYobj1GdW5jdGlvbi5wcm90b3R5cGUpO3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixyKTtpZih2b2lkIDAhPT1hKXtpZigidmFsdWUiaW4gYSlyZXR1cm4gYS52YWx1ZTt2YXIgZj1hLmdldDtpZih2b2lkIDA9PT1mKXJldHVybjtyZXR1cm4gZi5jYWxsKHMpfXZhciBsPU9iamVjdC5nZXRQcm90b3R5cGVPZihuKTtpZihudWxsPT09bClyZXR1cm47dD1sLGU9cixvPXMsaT0hMCxhPWw9dm9pZCAwfX07aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB4KXRocm93IG5ldyBFcnJvcigiWW91JTIwbXVzdCUyMGluY2x1ZGUlMjB0aGUlMjB1dGlscy5qcyUyMGZpbGUlMjBiZWZvcmUlMjB0ZXRoZXIuaHRtbCIpO3ZhciBZPXguVXRpbHMscj1ZLmdldFNjcm9sbFBhcmVudHMsYT1ZLmdldEJvdW5kcyxmPVkuZ2V0T2Zmc2V0UGFyZW50LGg9WS5leHRlbmQscD1ZLmFkZENsYXNzLGQ9WS5yZW1vdmVDbGFzcyxtPVkudXBkYXRlQ2xhc3NlcyxrPVkuZGVmZXIsXz1ZLmZsdXNoLGw9WS5nZXRTY3JvbGxCYXJTaXplLHM9WS5yZW1vdmVVdGlsRWxlbWVudHMsTD1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQpcmV0dXJuIiI7Zm9yKHZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGU9WyJ0cmFuc2Zvcm0iLCJXZWJraXRUcmFuc2Zvcm0iLCJPVHJhbnNmb3JtIiwiTW96VHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iXSxvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBpPWVbb107aWYodm9pZCAwIT09dC5zdHlsZVtpXSlyZXR1cm4gaX19KCksRD1bXSxYPWZ1bmN0aW9uKCl7RC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucG9zaXRpb24oITEpfSksXygpfTshZnVuY3Rpb24oKXt2YXIgdD1udWxsLGU9bnVsbCxvPW51bGwsaT1mdW5jdGlvbiBuKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBlJiZlPjE2PyhlPU1hdGgubWluKGUtMTYsMjUwKSx2b2lkKG89c2V0VGltZW91dChuLDI1MCkpKTp2b2lkKCJ1bmRlZmluZWQiIT10eXBlb2YgdCYmYigpLXQ8MTB8fChudWxsIT1vJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksdD1iKCksWCgpLGU9YigpLXQpKX07InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJlsicmVzaXplIiwic2Nyb2xsIiwidG91Y2htb3ZlIl0uZm9yRWFjaChmdW5jdGlvbih0KXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0LGkpfSl9KCk7dmFyIEY9e2NlbnRlcjoiY2VudGVyIixsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQifSxIPXttaWRkbGU6Im1pZGRsZSIsdG9wOiJib3R0b20iLGJvdHRvbToidG9wIn0sTj17dG9wOjAsbGVmdDowLG1pZGRsZToiNTAlIixjZW50ZXI6IjUwJSIsYm90dG9tOiIxMDAlIixyaWdodDoiMTAwJSJ9LFU9ZnVuY3Rpb24odCxlKXt2YXIgbz10LmxlZnQsaT10LnRvcDtyZXR1cm4iYXV0byI9PT1vJiYobz1GW2UubGVmdF0pLCJhdXRvIj09PWkmJihpPUhbZS50b3BdKSx7bGVmdDpvLHRvcDppfX0sVj1mdW5jdGlvbih0KXt2YXIgZT10LmxlZnQsbz10LnRvcDtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIE5bdC5sZWZ0XSYmKGU9Tlt0LmxlZnRdKSwidW5kZWZpbmVkIiE9dHlwZW9mIE5bdC50b3BdJiYobz1OW3QudG9wXSkse2xlZnQ6ZSx0b3A6b319LFI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiICIpLG89eihlLDIpLGk9b1swXSxuPW9bMV07cmV0dXJue3RvcDppLGxlZnQ6bn19LHE9UixJPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG89dGhpcztpKHRoaXMsZSksaihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZS5wcm90b3R5cGUpLCJjb25zdHJ1Y3RvciIsdGhpcykuY2FsbCh0aGlzKSx0aGlzLnBvc2l0aW9uPXRoaXMucG9zaXRpb24uYmluZCh0aGlzKSxELnB1c2godGhpcyksdGhpcy5oaXN0b3J5PVtdLHRoaXMuc2V0T3B0aW9ucyh0LCExKSx4Lm1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbih0KXsidW5kZWZpbmVkIiE9dHlwZW9mIHQuaW5pdGlhbGl6ZSYmdC5pbml0aWFsaXplLmNhbGwobyl9KSx0aGlzLnBvc2l0aW9uKCl9cmV0dXJuIHYoZSx0KSxFKGUsW3trZXk6ImdldENsYXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg8PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT8iIjphcmd1bWVudHNbMF0sZT10aGlzLm9wdGlvbnMuY2xhc3NlcztyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGUmJmVbdF0/dGhpcy5vcHRpb25zLmNsYXNzZXNbdF06dGhpcy5vcHRpb25zLmNsYXNzUHJlZml4P3RoaXMub3B0aW9ucy5jbGFzc1ByZWZpeCsiLSIrdDp0fX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxvPWFyZ3VtZW50cy5sZW5ndGg8PTF8fHZvaWQgMD09PWFyZ3VtZW50c1sxXXx8YXJndW1lbnRzWzFdLGk9e29mZnNldDoiMCAwIix0YXJnZXRPZmZzZXQ6IjAgMCIsdGFyZ2V0QXR0YWNobWVudDoiYXV0byBhdXRvIixjbGFzc1ByZWZpeDoidGV0aGVyIn07dGhpcy5vcHRpb25zPWgoaSx0KTt2YXIgbj10aGlzLm9wdGlvbnMscz1uLmVsZW1lbnQsYT1uLnRhcmdldCxmPW4udGFyZ2V0TW9kaWZpZXI7aWYodGhpcy5lbGVtZW50PXMsdGhpcy50YXJnZXQ9YSx0aGlzLnRhcmdldE1vZGlmaWVyPWYsInZpZXdwb3J0Ij09PXRoaXMudGFyZ2V0Pyh0aGlzLnRhcmdldD1kb2N1bWVudC5ib2R5LHRoaXMudGFyZ2V0TW9kaWZpZXI9InZpc2libGUiKToic2Nyb2xsLWhhbmRsZSI9PT10aGlzLnRhcmdldCYmKHRoaXMudGFyZ2V0PWRvY3VtZW50LmJvZHksdGhpcy50YXJnZXRNb2RpZmllcj0ic2Nyb2xsLWhhbmRsZSIpLFsiZWxlbWVudCIsInRhcmdldCJdLmZvckVhY2goZnVuY3Rpb24odCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW3RdKXRocm93IG5ldyBFcnJvcigiVGV0aGVyIEVycm9yOiBCb3RoIGVsZW1lbnQgYW5kIHRhcmdldCBtdXN0IGJlIGRlZmluZWQiKTsidW5kZWZpbmVkIiE9dHlwZW9mIGVbdF0uanF1ZXJ5P2VbdF09ZVt0XVswXToic3RyaW5nIj09dHlwZW9mIGVbdF0mJihlW3RdPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZVt0XSkpfSkscCh0aGlzLmVsZW1lbnQsdGhpcy5nZXRDbGFzcygiZWxlbWVudCIpKSx0aGlzLm9wdGlvbnMuYWRkVGFyZ2V0Q2xhc3NlcyE9PSExJiZwKHRoaXMudGFyZ2V0LHRoaXMuZ2V0Q2xhc3MoInRhcmdldCIpKSwhdGhpcy5vcHRpb25zLmF0dGFjaG1lbnQpdGhyb3cgbmV3IEVycm9yKCJUZXRoZXIgRXJyb3I6IFlvdSBtdXN0IHByb3ZpZGUgYW4gYXR0YWNobWVudCIpO3RoaXMudGFyZ2V0QXR0YWNobWVudD1xKHRoaXMub3B0aW9ucy50YXJnZXRBdHRhY2htZW50KSx0aGlzLmF0dGFjaG1lbnQ9cSh0aGlzLm9wdGlvbnMuYXR0YWNobWVudCksdGhpcy5vZmZzZXQ9Uih0aGlzLm9wdGlvbnMub2Zmc2V0KSx0aGlzLnRhcmdldE9mZnNldD1SKHRoaXMub3B0aW9ucy50YXJnZXRPZmZzZXQpLCJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5zY3JvbGxQYXJlbnRzJiZ0aGlzLmRpc2FibGUoKSwic2Nyb2xsLWhhbmRsZSI9PT10aGlzLnRhcmdldE1vZGlmaWVyP3RoaXMuc2Nyb2xsUGFyZW50cz1bdGhpcy50YXJnZXRdOnRoaXMuc2Nyb2xsUGFyZW50cz1yKHRoaXMudGFyZ2V0KSx0aGlzLm9wdGlvbnMuZW5hYmxlZCE9PSExJiZ0aGlzLmVuYWJsZShvKX19LHtrZXk6ImdldFRhcmdldEJvdW5kcyIsdmFsdWU6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMudGFyZ2V0TW9kaWZpZXIpcmV0dXJuIGEodGhpcy50YXJnZXQpO2lmKCJ2aXNpYmxlIj09PXRoaXMudGFyZ2V0TW9kaWZpZXIpe2lmKHRoaXMudGFyZ2V0PT09ZG9jdW1lbnQuYm9keSlyZXR1cm57dG9wOnBhZ2VZT2Zmc2V0LGxlZnQ6cGFnZVhPZmZzZXQsaGVpZ2h0OmlubmVySGVpZ2h0LHdpZHRoOmlubmVyV2lkdGh9O3ZhciB0PWEodGhpcy50YXJnZXQpLGU9e2hlaWdodDp0LmhlaWdodCx3aWR0aDp0LndpZHRoLHRvcDp0LnRvcCxsZWZ0OnQubGVmdH07cmV0dXJuIGUuaGVpZ2h0PU1hdGgubWluKGUuaGVpZ2h0LHQuaGVpZ2h0LShwYWdlWU9mZnNldC10LnRvcCkpLGUuaGVpZ2h0PU1hdGgubWluKGUuaGVpZ2h0LHQuaGVpZ2h0LSh0LnRvcCt0LmhlaWdodC0ocGFnZVlPZmZzZXQraW5uZXJIZWlnaHQpKSksZS5oZWlnaHQ9TWF0aC5taW4oaW5uZXJIZWlnaHQsZS5oZWlnaHQpLGUuaGVpZ2h0LT0yLGUud2lkdGg9TWF0aC5taW4oZS53aWR0aCx0LndpZHRoLShwYWdlWE9mZnNldC10LmxlZnQpKSxlLndpZHRoPU1hdGgubWluKGUud2lkdGgsdC53aWR0aC0odC5sZWZ0K3Qud2lkdGgtKHBhZ2VYT2Zmc2V0K2lubmVyV2lkdGgpKSksZS53aWR0aD1NYXRoLm1pbihpbm5lcldpZHRoLGUud2lkdGgpLGUud2lkdGgtPTIsZS50b3A8cGFnZVlPZmZzZXQmJihlLnRvcD1wYWdlWU9mZnNldCksZS5sZWZ0PHBhZ2VYT2Zmc2V0JiYoZS5sZWZ0PXBhZ2VYT2Zmc2V0KSxlfWlmKCJzY3JvbGwtaGFuZGxlIj09PXRoaXMudGFyZ2V0TW9kaWZpZXIpe3ZhciB0PXZvaWQgMCxvPXRoaXMudGFyZ2V0O289PT1kb2N1bWVudC5ib2R5PyhvPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0PXtsZWZ0OnBhZ2VYT2Zmc2V0LHRvcDpwYWdlWU9mZnNldCxoZWlnaHQ6aW5uZXJIZWlnaHQsd2lkdGg6aW5uZXJXaWR0aH0pOnQ9YShvKTt2YXIgaT1nZXRDb21wdXRlZFN0eWxlKG8pLG49by5zY3JvbGxXaWR0aD5vLmNsaWVudFdpZHRofHxbaS5vdmVyZmxvdyxpLm92ZXJmbG93WF0uaW5kZXhPZigic2Nyb2xsIik+PTB8fHRoaXMudGFyZ2V0IT09ZG9jdW1lbnQuYm9keSxyPTA7biYmKHI9MTUpO3ZhciBzPXQuaGVpZ2h0LXBhcnNlRmxvYXQoaS5ib3JkZXJUb3BXaWR0aCktcGFyc2VGbG9hdChpLmJvcmRlckJvdHRvbVdpZHRoKS1yLGU9e3dpZHRoOjE1LGhlaWdodDouOTc1KnMqKHMvby5zY3JvbGxIZWlnaHQpLGxlZnQ6dC5sZWZ0K3Qud2lkdGgtcGFyc2VGbG9hdChpLmJvcmRlckxlZnRXaWR0aCktMTV9LGY9MDtzPDQwOCYmdGhpcy50YXJnZXQ9PT1kb2N1bWVudC5ib2R5JiYoZj0tMTFlLTUqTWF0aC5wb3cocywyKS0uMDA3MjcqcysyMi41OCksdGhpcy50YXJnZXQhPT1kb2N1bWVudC5ib2R5JiYoZS5oZWlnaHQ9TWF0aC5tYXgoZS5oZWlnaHQsMjQpKTt2YXIgbD10aGlzLnRhcmdldC5zY3JvbGxUb3AvKG8uc2Nyb2xsSGVpZ2h0LXMpO3JldHVybiBlLnRvcD1sKihzLWUuaGVpZ2h0LWYpK3QudG9wK3BhcnNlRmxvYXQoaS5ib3JkZXJUb3BXaWR0aCksdGhpcy50YXJnZXQ9PT1kb2N1bWVudC5ib2R5JiYoZS5oZWlnaHQ9TWF0aC5tYXgoZS5oZWlnaHQsMjQpKSxlfX19LHtrZXk6ImNsZWFyQ2FjaGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fY2FjaGU9e319fSx7a2V5OiJjYWNoZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX2NhY2hlJiYodGhpcy5fY2FjaGU9e30pLCJ1bmRlZmluZWQiPT10eXBlb2YgdGhpcy5fY2FjaGVbdF0mJih0aGlzLl9jYWNoZVt0XT1lLmNhbGwodGhpcykpLHRoaXMuX2NhY2hlW3RdfX0se2tleToiZW5hYmxlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF18fGFyZ3VtZW50c1swXTt0aGlzLm9wdGlvbnMuYWRkVGFyZ2V0Q2xhc3NlcyE9PSExJiZwKHRoaXMudGFyZ2V0LHRoaXMuZ2V0Q2xhc3MoImVuYWJsZWQiKSkscCh0aGlzLmVsZW1lbnQsdGhpcy5nZXRDbGFzcygiZW5hYmxlZCIpKSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5zY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSE9PXQudGFyZ2V0Lm93bmVyRG9jdW1lbnQmJmUuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0LnBvc2l0aW9uKX0pLGUmJnRoaXMucG9zaXRpb24oKX19LHtrZXk6ImRpc2FibGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztkKHRoaXMudGFyZ2V0LHRoaXMuZ2V0Q2xhc3MoImVuYWJsZWQiKSksZCh0aGlzLmVsZW1lbnQsdGhpcy5nZXRDbGFzcygiZW5hYmxlZCIpKSx0aGlzLmVuYWJsZWQ9ITEsInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLnNjcm9sbFBhcmVudHMmJnRoaXMuc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0LnBvc2l0aW9uKX0pfX0se2tleToiZGVzdHJveSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZGlzYWJsZSgpLEQuZm9yRWFjaChmdW5jdGlvbihlLG8pe2U9PT10JiZELnNwbGljZShvLDEpfSksMD09PUQubGVuZ3RoJiZzKCl9fSx7a2V5OiJ1cGRhdGVBdHRhY2hDbGFzc2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBvPXRoaXM7dD10fHx0aGlzLmF0dGFjaG1lbnQsZT1lfHx0aGlzLnRhcmdldEF0dGFjaG1lbnQ7dmFyIGk9WyJsZWZ0IiwidG9wIiwiYm90dG9tIiwicmlnaHQiLCJtaWRkbGUiLCJjZW50ZXIiXTsidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2FkZEF0dGFjaENsYXNzZXMmJnRoaXMuX2FkZEF0dGFjaENsYXNzZXMubGVuZ3RoJiZ0aGlzLl9hZGRBdHRhY2hDbGFzc2VzLnNwbGljZSgwLHRoaXMuX2FkZEF0dGFjaENsYXNzZXMubGVuZ3RoKSwidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX2FkZEF0dGFjaENsYXNzZXMmJih0aGlzLl9hZGRBdHRhY2hDbGFzc2VzPVtdKTt2YXIgbj10aGlzLl9hZGRBdHRhY2hDbGFzc2VzO3QudG9wJiZuLnB1c2godGhpcy5nZXRDbGFzcygiZWxlbWVudC1hdHRhY2hlZCIpKyItIit0LnRvcCksdC5sZWZ0JiZuLnB1c2godGhpcy5nZXRDbGFzcygiZWxlbWVudC1hdHRhY2hlZCIpKyItIit0LmxlZnQpLGUudG9wJiZuLnB1c2godGhpcy5nZXRDbGFzcygidGFyZ2V0LWF0dGFjaGVkIikrIi0iK2UudG9wKSxlLmxlZnQmJm4ucHVzaCh0aGlzLmdldENsYXNzKCJ0YXJnZXQtYXR0YWNoZWQiKSsiLSIrZS5sZWZ0KTt2YXIgcj1bXTtpLmZvckVhY2goZnVuY3Rpb24odCl7ci5wdXNoKG8uZ2V0Q2xhc3MoImVsZW1lbnQtYXR0YWNoZWQiKSsiLSIrdCksci5wdXNoKG8uZ2V0Q2xhc3MoInRhcmdldC1hdHRhY2hlZCIpKyItIit0KX0pLGsoZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9dHlwZW9mIG8uX2FkZEF0dGFjaENsYXNzZXMmJihtKG8uZWxlbWVudCxvLl9hZGRBdHRhY2hDbGFzc2VzLHIpLG8ub3B0aW9ucy5hZGRUYXJnZXRDbGFzc2VzIT09ITEmJm0oby50YXJnZXQsby5fYWRkQXR0YWNoQ2xhc3NlcyxyKSxkZWxldGUgby5fYWRkQXR0YWNoQ2xhc3Nlcyl9KX19LHtrZXk6InBvc2l0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF18fGFyZ3VtZW50c1swXTtpZih0aGlzLmVuYWJsZWQpe3RoaXMuY2xlYXJDYWNoZSgpO3ZhciBvPVUodGhpcy50YXJnZXRBdHRhY2htZW50LHRoaXMuYXR0YWNobWVudCk7dGhpcy51cGRhdGVBdHRhY2hDbGFzc2VzKHRoaXMuYXR0YWNobWVudCxvKTt2YXIgaT10aGlzLmNhY2hlKCJlbGVtZW50LWJvdW5kcyIsZnVuY3Rpb24oKXtyZXR1cm4gYSh0LmVsZW1lbnQpfSksbj1pLndpZHRoLHI9aS5oZWlnaHQ7aWYoMD09PW4mJjA9PT1yJiYidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMubGFzdFNpemUpe3ZhciBzPXRoaXMubGFzdFNpemU7bj1zLndpZHRoLHI9cy5oZWlnaHR9ZWxzZSB0aGlzLmxhc3RTaXplPXt3aWR0aDpuLGhlaWdodDpyfTt2YXIgaD10aGlzLmNhY2hlKCJ0YXJnZXQtYm91bmRzIixmdW5jdGlvbigpe3JldHVybiB0LmdldFRhcmdldEJvdW5kcygpfSksZD1oLHA9QyhWKHRoaXMuYXR0YWNobWVudCkse3dpZHRoOm4saGVpZ2h0OnJ9KSx1PUMoVihvKSxkKSxjPUModGhpcy5vZmZzZXQse3dpZHRoOm4saGVpZ2h0OnJ9KSxnPUModGhpcy50YXJnZXRPZmZzZXQsZCk7cD13KHAsYyksdT13KHUsZyk7Zm9yKHZhciBtPWgubGVmdCt1LmxlZnQtcC5sZWZ0LHY9aC50b3ArdS50b3AtcC50b3AseT0wO3k8eC5tb2R1bGVzLmxlbmd0aDsrK3kpe3ZhciBiPXgubW9kdWxlc1t5XSxPPWIucG9zaXRpb24uY2FsbCh0aGlzLHtsZWZ0Om0sdG9wOnYsdGFyZ2V0QXR0YWNobWVudDpvLHRhcmdldFBvczpoLGVsZW1lbnRQb3M6aSxvZmZzZXQ6cCx0YXJnZXRPZmZzZXQ6dSxtYW51YWxPZmZzZXQ6YyxtYW51YWxUYXJnZXRPZmZzZXQ6ZyxzY3JvbGxiYXJTaXplOlMsYXR0YWNobWVudDp0aGlzLmF0dGFjaG1lbnR9KTtpZihPPT09ITEpcmV0dXJuITE7InVuZGVmaW5lZCIhPXR5cGVvZiBPJiYib2JqZWN0Ij09dHlwZW9mIE8mJih2PU8udG9wLG09Ty5sZWZ0KX12YXIgRT17cGFnZTp7dG9wOnYsbGVmdDptfSx2aWV3cG9ydDp7dG9wOnYtcGFnZVlPZmZzZXQsYm90dG9tOnBhZ2VZT2Zmc2V0LXYtcitpbm5lckhlaWdodCxsZWZ0Om0tcGFnZVhPZmZzZXQscmlnaHQ6cGFnZVhPZmZzZXQtbS1uK2lubmVyV2lkdGh9fSxBPXRoaXMudGFyZ2V0Lm93bmVyRG9jdW1lbnQsVD1BLmRlZmF1bHRWaWV3LFM9dm9pZCAwO3JldHVybiBULmlubmVySGVpZ2h0PkEuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCYmKFM9dGhpcy5jYWNoZSgic2Nyb2xsYmFyLXNpemUiLGwpLEUudmlld3BvcnQuYm90dG9tLT1TLmhlaWdodCksVC5pbm5lcldpZHRoPkEuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoJiYoUz10aGlzLmNhY2hlKCJzY3JvbGxiYXItc2l6ZSIsbCksRS52aWV3cG9ydC5yaWdodC09Uy53aWR0aCksWyIiLCJzdGF0aWMiXS5pbmRleE9mKEEuYm9keS5zdHlsZS5wb3NpdGlvbikhPT0tMSYmWyIiLCJzdGF0aWMiXS5pbmRleE9mKEEuYm9keS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uKSE9PS0xfHwoRS5wYWdlLmJvdHRvbT1BLmJvZHkuc2Nyb2xsSGVpZ2h0LXYtcixFLnBhZ2UucmlnaHQ9QS5ib2R5LnNjcm9sbFdpZHRoLW0tbiksInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLm9wdGlvbnMub3B0aW1pemF0aW9ucyYmdGhpcy5vcHRpb25zLm9wdGltaXphdGlvbnMubW92ZUVsZW1lbnQhPT0hMSYmInVuZGVmaW5lZCI9PXR5cGVvZiB0aGlzLnRhcmdldE1vZGlmaWVyJiYhZnVuY3Rpb24oKXt2YXIgZT10LmNhY2hlKCJ0YXJnZXQtb2Zmc2V0cGFyZW50IixmdW5jdGlvbigpe3JldHVybiBmKHQudGFyZ2V0KX0pLG89dC5jYWNoZSgidGFyZ2V0LW9mZnNldHBhcmVudC1ib3VuZHMiLGZ1bmN0aW9uKCl7cmV0dXJuIGEoZSl9KSxpPWdldENvbXB1dGVkU3R5bGUoZSksbj1vLHI9e307aWYoWyJUb3AiLCJMZWZ0IiwiQm90dG9tIiwiUmlnaHQiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JbdC50b0xvd2VyQ2FzZSgpXT1wYXJzZUZsb2F0KGlbImJvcmRlciIrdCsiV2lkdGgiXSl9KSxvLnJpZ2h0PUEuYm9keS5zY3JvbGxXaWR0aC1vLmxlZnQtbi53aWR0aCtyLnJpZ2h0LG8uYm90dG9tPUEuYm9keS5zY3JvbGxIZWlnaHQtby50b3Atbi5oZWlnaHQrci5ib3R0b20sRS5wYWdlLnRvcD49by50b3Arci50b3AmJkUucGFnZS5ib3R0b20+PW8uYm90dG9tJiZFLnBhZ2UubGVmdD49by5sZWZ0K3IubGVmdCYmRS5wYWdlLnJpZ2h0Pj1vLnJpZ2h0KXt2YXIgcz1lLnNjcm9sbFRvcCxsPWUuc2Nyb2xsTGVmdDtFLm9mZnNldD17dG9wOkUucGFnZS50b3Atby50b3Arcy1yLnRvcCxsZWZ0OkUucGFnZS5sZWZ0LW8ubGVmdCtsLXIubGVmdH19fSgpLHRoaXMubW92ZShFKSx0aGlzLmhpc3RvcnkudW5zaGlmdChFKSx0aGlzLmhpc3RvcnkubGVuZ3RoPjMmJnRoaXMuaGlzdG9yeS5wb3AoKSxlJiZfKCksITB9fX0se2tleToibW92ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlKXt2YXIgbz17fTtmb3IodmFyIGkgaW4gdCl7b1tpXT17fTtmb3IodmFyIG4gaW4gdFtpXSl7Zm9yKHZhciByPSExLHM9MDtzPHRoaXMuaGlzdG9yeS5sZW5ndGg7KytzKXt2YXIgYT10aGlzLmhpc3Rvcnlbc107aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBhW2ldJiYheShhW2ldW25dLHRbaV1bbl0pKXtyPSEwO2JyZWFrfX1yfHwob1tpXVtuXT0hMCl9fXZhciBsPXt0b3A6IiIsbGVmdDoiIixyaWdodDoiIixib3R0b206IiJ9LGQ9ZnVuY3Rpb24odCxvKXt2YXIgaT0idW5kZWZpbmVkIiE9dHlwZW9mIGUub3B0aW9ucy5vcHRpbWl6YXRpb25zLG49aT9lLm9wdGlvbnMub3B0aW1pemF0aW9ucy5ncHU6bnVsbDtpZihuIT09ITEpe3ZhciByPXZvaWQgMCxzPXZvaWQgMDtpZih0LnRvcD8obC50b3A9MCxyPW8udG9wKToobC5ib3R0b209MCxyPS1vLmJvdHRvbSksdC5sZWZ0PyhsLmxlZnQ9MCxzPW8ubGVmdCk6KGwucmlnaHQ9MCxzPS1vLnJpZ2h0KSx3aW5kb3cubWF0Y2hNZWRpYSl7dmFyIGE9d2luZG93Lm1hdGNoTWVkaWEoIm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDEuM2RwcHgpIikubWF0Y2hlc3x8d2luZG93Lm1hdGNoTWVkaWEoIm9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAxLjMpIikubWF0Y2hlczthfHwocz1NYXRoLnJvdW5kKHMpLHI9TWF0aC5yb3VuZChyKSl9bFtMXT0idHJhbnNsYXRlWCgiK3MrInB4KSB0cmFuc2xhdGVZKCIrcisicHgpIiwibXNUcmFuc2Zvcm0iIT09TCYmKGxbTF0rPSIgdHJhbnNsYXRlWigwKSIpfWVsc2UgdC50b3A/bC50b3A9by50b3ArInB4IjpsLmJvdHRvbT1vLmJvdHRvbSsicHgiLHQubGVmdD9sLmxlZnQ9by5sZWZ0KyJweCI6bC5yaWdodD1vLnJpZ2h0KyJweCJ9LHA9ITE7aWYoKG8ucGFnZS50b3B8fG8ucGFnZS5ib3R0b20pJiYoby5wYWdlLmxlZnR8fG8ucGFnZS5yaWdodCk/KGwucG9zaXRpb249ImFic29sdXRlIixkKG8ucGFnZSx0LnBhZ2UpKTooby52aWV3cG9ydC50b3B8fG8udmlld3BvcnQuYm90dG9tKSYmKG8udmlld3BvcnQubGVmdHx8by52aWV3cG9ydC5yaWdodCk/KGwucG9zaXRpb249ImZpeGVkIixkKG8udmlld3BvcnQsdC52aWV3cG9ydCkpOiJ1bmRlZmluZWQiIT10eXBlb2Ygby5vZmZzZXQmJm8ub2Zmc2V0LnRvcCYmby5vZmZzZXQubGVmdD8hZnVuY3Rpb24oKXtsLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dmFyIGk9ZS5jYWNoZSgidGFyZ2V0LW9mZnNldHBhcmVudCIsZnVuY3Rpb24oKXtyZXR1cm4gZihlLnRhcmdldCl9KTtmKGUuZWxlbWVudCkhPT1pJiZrKGZ1bmN0aW9uKCl7ZS5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5lbGVtZW50KSxpLmFwcGVuZENoaWxkKGUuZWxlbWVudCl9KSxkKG8ub2Zmc2V0LHQub2Zmc2V0KSxwPSEwfSgpOihsLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZCh7dG9wOiEwLGxlZnQ6ITB9LHQucGFnZSkpLCFwKWlmKHRoaXMub3B0aW9ucy5ib2R5RWxlbWVudCl0aGlzLm9wdGlvbnMuYm9keUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtlbHNle2Zvcih2YXIgdT0hMCxjPXRoaXMuZWxlbWVudC5wYXJlbnROb2RlO2MmJjE9PT1jLm5vZGVUeXBlJiYiQk9EWSIhPT1jLnRhZ05hbWU7KXtpZigic3RhdGljIiE9PWdldENvbXB1dGVkU3R5bGUoYykucG9zaXRpb24pe3U9ITE7YnJlYWt9Yz1jLnBhcmVudE5vZGV9dXx8KHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpKX12YXIgZz17fSxtPSExO2Zvcih2YXIgbiBpbiBsKXt2YXIgdj1sW25dLGI9dGhpcy5lbGVtZW50LnN0eWxlW25dO2IhPT12JiYobT0hMCxnW25dPXYpfW0mJmsoZnVuY3Rpb24oKXtoKGUuZWxlbWVudC5zdHlsZSxnKSxlLnRyaWdnZXIoInJlcG9zaXRpb25lZCIpfSl9fX1dKSxlfShCKTtJLm1vZHVsZXM9W10seC5wb3NpdGlvbj1YO3ZhciAkPWgoSSx4KSx6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBvPVtdLGk9ITAsbj0hMSxyPXZvaWQgMDt0cnl7Zm9yKHZhciBzLGE9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShpPShzPWEubmV4dCgpKS5kb25lKSYmKG8ucHVzaChzLnZhbHVlKSwhZXx8by5sZW5ndGghPT1lKTtpPSEwKTt9Y2F0Y2goZil7bj0hMCxyPWZ9ZmluYWxseXt0cnl7IWkmJmFbInJldHVybiJdJiZhWyJyZXR1cm4iXSgpfWZpbmFsbHl7aWYobil0aHJvdyByfX1yZXR1cm4gb31yZXR1cm4gZnVuY3Rpb24oZSxvKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIHQoZSxvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLFk9eC5VdGlscyxhPVkuZ2V0Qm91bmRzLGg9WS5leHRlbmQsbT1ZLnVwZGF0ZUNsYXNzZXMsaz1ZLmRlZmVyLEc9WyJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iXTt4Lm1vZHVsZXMucHVzaCh7cG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxvPXQudG9wLGk9dC5sZWZ0LG49dC50YXJnZXRBdHRhY2htZW50O2lmKCF0aGlzLm9wdGlvbnMuY29uc3RyYWludHMpcmV0dXJuITA7dmFyIHI9dGhpcy5jYWNoZSgiZWxlbWVudC1ib3VuZHMiLGZ1bmN0aW9uKCl7cmV0dXJuIGEoZS5lbGVtZW50KX0pLHM9ci5oZWlnaHQsZj1yLndpZHRoO2lmKDA9PT1mJiYwPT09cyYmInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLmxhc3RTaXplKXt2YXIgbD10aGlzLmxhc3RTaXplO2Y9bC53aWR0aCxzPWwuaGVpZ2h0fXZhciBkPXRoaXMuY2FjaGUoInRhcmdldC1ib3VuZHMiLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0VGFyZ2V0Qm91bmRzKCl9KSxwPWQuaGVpZ2h0LHU9ZC53aWR0aCxjPVt0aGlzLmdldENsYXNzKCJwaW5uZWQiKSx0aGlzLmdldENsYXNzKCJvdXQtb2YtYm91bmRzIildO3RoaXMub3B0aW9ucy5jb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXQub3V0T2ZCb3VuZHNDbGFzcyxvPXQucGlubmVkQ2xhc3M7ZSYmYy5wdXNoKGUpLG8mJmMucHVzaChvKX0pLGMuZm9yRWFjaChmdW5jdGlvbih0KXtbImxlZnQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSJdLmZvckVhY2goZnVuY3Rpb24oZSl7Yy5wdXNoKHQrIi0iK2UpfSl9KTt2YXIgZz1bXSx2PWgoe30sbikseT1oKHt9LHRoaXMuYXR0YWNobWVudCk7cmV0dXJuIHRoaXMub3B0aW9ucy5jb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPXQudG8sYT10LmF0dGFjaG1lbnQsbD10LnBpbjsidW5kZWZpbmVkIj09dHlwZW9mIGEmJihhPSIiKTt2YXIgaD12b2lkIDAsZD12b2lkIDA7aWYoYS5pbmRleE9mKCIgIik+PTApe3ZhciBjPWEuc3BsaXQoIiAiKSxtPXooYywyKTtkPW1bMF0saD1tWzFdfWVsc2UgaD1kPWE7dmFyIGI9TyhlLHIpOyJ0YXJnZXQiIT09ZCYmImJvdGgiIT09ZHx8KG88YlsxXSYmInRvcCI9PT12LnRvcCYmKG8rPXAsdi50b3A9ImJvdHRvbSIpLG8rcz5iWzNdJiYiYm90dG9tIj09PXYudG9wJiYoby09cCx2LnRvcD0idG9wIikpLCJ0b2dldGhlciI9PT1kJiYoInRvcCI9PT12LnRvcCYmKCJib3R0b20iPT09eS50b3AmJm88YlsxXT8obys9cCx2LnRvcD0iYm90dG9tIixvKz1zLHkudG9wPSJ0b3AiKToidG9wIj09PXkudG9wJiZvK3M+YlszXSYmby0ocy1wKT49YlsxXSYmKG8tPXMtcCx2LnRvcD0iYm90dG9tIix5LnRvcD0iYm90dG9tIikpLCJib3R0b20iPT09di50b3AmJigidG9wIj09PXkudG9wJiZvK3M+YlszXT8oby09cCx2LnRvcD0idG9wIixvLT1zLHkudG9wPSJib3R0b20iKToiYm90dG9tIj09PXkudG9wJiZvPGJbMV0mJm8rKDIqcy1wKTw9YlszXSYmKG8rPXMtcCx2LnRvcD0idG9wIix5LnRvcD0idG9wIikpLCJtaWRkbGUiPT09di50b3AmJihvK3M+YlszXSYmInRvcCI9PT15LnRvcD8oby09cyx5LnRvcD0iYm90dG9tIik6bzxiWzFdJiYiYm90dG9tIj09PXkudG9wJiYobys9cyx5LnRvcD0idG9wIikpKSwidGFyZ2V0IiE9PWgmJiJib3RoIiE9PWh8fChpPGJbMF0mJiJsZWZ0Ij09PXYubGVmdCYmKGkrPXUsdi5sZWZ0PSJyaWdodCIpLGkrZj5iWzJdJiYicmlnaHQiPT09di5sZWZ0JiYoaS09dSx2LmxlZnQ9ImxlZnQiKSksInRvZ2V0aGVyIj09PWgmJihpPGJbMF0mJiJsZWZ0Ij09PXYubGVmdD8icmlnaHQiPT09eS5sZWZ0PyhpKz11LHYubGVmdD0icmlnaHQiLGkrPWYseS5sZWZ0PSJsZWZ0Iik6ImxlZnQiPT09eS5sZWZ0JiYoaSs9dSx2LmxlZnQ9InJpZ2h0IixpLT1mLHkubGVmdD0icmlnaHQiKTppK2Y+YlsyXSYmInJpZ2h0Ij09PXYubGVmdD8ibGVmdCI9PT15LmxlZnQ/KGktPXUsdi5sZWZ0PSJsZWZ0IixpLT1mLHkubGVmdD0icmlnaHQiKToicmlnaHQiPT09eS5sZWZ0JiYoaS09dSx2LmxlZnQ9ImxlZnQiLGkrPWYseS5sZWZ0PSJsZWZ0Iik6ImNlbnRlciI9PT12LmxlZnQmJihpK2Y+YlsyXSYmImxlZnQiPT09eS5sZWZ0PyhpLT1mLHkubGVmdD0icmlnaHQiKTppPGJbMF0mJiJyaWdodCI9PT15LmxlZnQmJihpKz1mLHkubGVmdD0ibGVmdCIpKSksImVsZW1lbnQiIT09ZCYmImJvdGgiIT09ZHx8KG88YlsxXSYmImJvdHRvbSI9PT15LnRvcCYmKG8rPXMseS50b3A9InRvcCIpLG8rcz5iWzNdJiYidG9wIj09PXkudG9wJiYoby09cyx5LnRvcD0iYm90dG9tIikpLCJlbGVtZW50IiE9PWgmJiJib3RoIiE9PWh8fChpPGJbMF0mJigicmlnaHQiPT09eS5sZWZ0PyhpKz1mLHkubGVmdD0ibGVmdCIpOiJjZW50ZXIiPT09eS5sZWZ0JiYoaSs9Zi8yLHkubGVmdD0ibGVmdCIpKSxpK2Y+YlsyXSYmKCJsZWZ0Ij09PXkubGVmdD8oaS09Zix5LmxlZnQ9InJpZ2h0Iik6ImNlbnRlciI9PT15LmxlZnQmJihpLT1mLzIseS5sZWZ0PSJyaWdodCIpKSksInN0cmluZyI9PXR5cGVvZiBsP2w9bC5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTpsPT09ITAmJihsPVsidG9wIiwibGVmdCIsInJpZ2h0IiwiYm90dG9tIl0pLGw9bHx8W107dmFyIHc9W10sQz1bXTtvPGJbMV0mJihsLmluZGV4T2YoInRvcCIpPj0wPyhvPWJbMV0sdy5wdXNoKCJ0b3AiKSk6Qy5wdXNoKCJ0b3AiKSksbytzPmJbM10mJihsLmluZGV4T2YoImJvdHRvbSIpPj0wPyhvPWJbM10tcyx3LnB1c2goImJvdHRvbSIpKTpDLnB1c2goImJvdHRvbSIpKSxpPGJbMF0mJihsLmluZGV4T2YoImxlZnQiKT49MD8oaT1iWzBdLHcucHVzaCgibGVmdCIpKTpDLnB1c2goImxlZnQiKSksaStmPmJbMl0mJihsLmluZGV4T2YoInJpZ2h0Iik+PTA/KGk9YlsyXS1mLHcucHVzaCgicmlnaHQiKSk6Qy5wdXNoKCJyaWdodCIpKSx3Lmxlbmd0aCYmIWZ1bmN0aW9uKCl7dmFyIHQ9dm9pZCAwO3Q9InVuZGVmaW5lZCIhPXR5cGVvZiBlLm9wdGlvbnMucGlubmVkQ2xhc3M/ZS5vcHRpb25zLnBpbm5lZENsYXNzOmUuZ2V0Q2xhc3MoInBpbm5lZCIpLGcucHVzaCh0KSx3LmZvckVhY2goZnVuY3Rpb24oZSl7Zy5wdXNoKHQrIi0iK2UpfSl9KCksQy5sZW5ndGgmJiFmdW5jdGlvbigpe3ZhciB0PXZvaWQgMDt0PSJ1bmRlZmluZWQiIT10eXBlb2YgZS5vcHRpb25zLm91dE9mQm91bmRzQ2xhc3M/ZS5vcHRpb25zLm91dE9mQm91bmRzQ2xhc3M6ZS5nZXRDbGFzcygib3V0LW9mLWJvdW5kcyIpLGcucHVzaCh0KSxDLmZvckVhY2goZnVuY3Rpb24oZSl7Zy5wdXNoKHQrIi0iK2UpfSl9KCksKHcuaW5kZXhPZigibGVmdCIpPj0wfHx3LmluZGV4T2YoInJpZ2h0Iik+PTApJiYoeS5sZWZ0PXYubGVmdD0hMSksKHcuaW5kZXhPZigidG9wIik+PTB8fHcuaW5kZXhPZigiYm90dG9tIik+PTApJiYoeS50b3A9di50b3A9ITEpLHYudG9wPT09bi50b3AmJnYubGVmdD09PW4ubGVmdCYmeS50b3A9PT1lLmF0dGFjaG1lbnQudG9wJiZ5LmxlZnQ9PT1lLmF0dGFjaG1lbnQubGVmdHx8KGUudXBkYXRlQXR0YWNoQ2xhc3Nlcyh5LHYpLGUudHJpZ2dlcigidXBkYXRlIix7YXR0YWNobWVudDp5LHRhcmdldEF0dGFjaG1lbnQ6dn0pKX0pLGsoZnVuY3Rpb24oKXtlLm9wdGlvbnMuYWRkVGFyZ2V0Q2xhc3NlcyE9PSExJiZtKGUudGFyZ2V0LGcsYyksbShlLmVsZW1lbnQsZyxjKX0pLHt0b3A6byxsZWZ0Oml9fX0pO3ZhciBZPXguVXRpbHMsYT1ZLmdldEJvdW5kcyxtPVkudXBkYXRlQ2xhc3NlcyxrPVkuZGVmZXI7eC5tb2R1bGVzLnB1c2goe3Bvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbz10LnRvcCxpPXQubGVmdCxuPXRoaXMuY2FjaGUoImVsZW1lbnQtYm91bmRzIixmdW5jdGlvbigpe3JldHVybiBhKGUuZWxlbWVudCl9KSxyPW4uaGVpZ2h0LHM9bi53aWR0aCxmPXRoaXMuZ2V0VGFyZ2V0Qm91bmRzKCksbD1vK3IsaD1pK3MsZD1bXTtvPD1mLmJvdHRvbSYmbD49Zi50b3AmJlsibGVmdCIsInJpZ2h0Il0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1mW3RdO2UhPT1pJiZlIT09aHx8ZC5wdXNoKHQpfSksaTw9Zi5yaWdodCYmaD49Zi5sZWZ0JiZbInRvcCIsImJvdHRvbSJdLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9Zlt0XTtlIT09byYmZSE9PWx8fGQucHVzaCh0KX0pO3ZhciBwPVtdLHU9W10sYz1bImxlZnQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSJdO3JldHVybiBwLnB1c2godGhpcy5nZXRDbGFzcygiYWJ1dHRlZCIpKSxjLmZvckVhY2goZnVuY3Rpb24odCl7cC5wdXNoKGUuZ2V0Q2xhc3MoImFidXR0ZWQiKSsiLSIrdCl9KSxkLmxlbmd0aCYmdS5wdXNoKHRoaXMuZ2V0Q2xhc3MoImFidXR0ZWQiKSksZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3UucHVzaChlLmdldENsYXNzKCJhYnV0dGVkIikrIi0iK3QpfSksayhmdW5jdGlvbigpe2Uub3B0aW9ucy5hZGRUYXJnZXRDbGFzc2VzIT09ITEmJm0oZS50YXJnZXQsdSxwKSxtKGUuZWxlbWVudCx1LHApfSksITB9fSk7dmFyIHo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG89W10saT0hMCxuPSExLHI9dm9pZCAwO3RyeXtmb3IodmFyIHMsYT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KHM9YS5uZXh0KCkpLmRvbmUpJiYoby5wdXNoKHMudmFsdWUpLCFlfHxvLmxlbmd0aCE9PWUpO2k9ITApO31jYXRjaChmKXtuPSEwLHI9Zn1maW5hbGx5e3RyeXshaSYmYVsicmV0dXJuIl0mJmFbInJldHVybiJdKCl9ZmluYWxseXtpZihuKXRocm93IHJ9fXJldHVybiBvfXJldHVybiBmdW5jdGlvbihlLG8pe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSlyZXR1cm4gdChlLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCk7cmV0dXJuIHgubW9kdWxlcy5wdXNoKHtwb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10LnRvcCxvPXQubGVmdDtpZih0aGlzLm9wdGlvbnMuc2hpZnQpe3ZhciBpPXRoaXMub3B0aW9ucy5zaGlmdDsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLnNoaWZ0JiYoaT10aGlzLm9wdGlvbnMuc2hpZnQuY2FsbCh0aGlzLHt0b3A6ZSxsZWZ0Om99KSk7dmFyIG49dm9pZCAwLHI9dm9pZCAwO2lmKCJzdHJpbmciPT10eXBlb2YgaSl7aT1pLnNwbGl0KCIgIiksaVsxXT1pWzFdfHxpWzBdO3ZhciBzPWksYT16KHMsMik7bj1hWzBdLHI9YVsxXSxuPXBhcnNlRmxvYXQobiwxMCkscj1wYXJzZUZsb2F0KHIsMTApfWVsc2Ugbj1pLnRvcCxyPWkubGVmdDtyZXR1cm4gZSs9bixvKz1yLHt0b3A6ZSxsZWZ0Om99fX19KSwkfSk7"}},"time_used":427,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":427,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/js/wow.min.js","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.307Z","timestamp":1785147795307,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /js/wow.min.js HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/javascript\r\nlast-modified: Sun, 30 Jun 2024 21:09:38 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 2575\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":8426,"size_decoded":3119,"mime_type":"text/javascript","magic":"JavaScript source, ASCII text, with very long lines (8396)","md5":"161ba788d7ca4d554b4a0c609ce2cd67","sha1":"4ec798a81020992a75f08b37584fb5314ac8516f","sha256":"167d7ca784f3d3948837ea87c90fae712a158e7f34d02fc8dcdc091aefa62c7f","sha512":"1366d1965793c33869d80ecd65e138beacac426a465ebda14d81893a9c05ee1bf9dd5fa3b2ec353b05155a3723da8e99d25ee7bb20fabbb86de37111916aecb6","ssdeep":"96:zrZgL1xvPV6GqKyR6TYLWHFMLJAMpOROVEE1fosvGeaMozHImBaoqbl:zry9PVfSFrlAnROVEEdos+eatzHILoA","tlshash":"d30277c97a967031d75796f6833f0106b6361aeeb028047cb5b88dd57c78868523bf38","first_seen":"2023-03-07T01:07:29Z","last_seen":"2026-08-14T02:30:39.089162Z","times_seen":3133,"resource_available":true,"data":"LyohIFdPVyAtIHYxLjEuMiAtIDIwMTUtMDgtMTkKKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWF0dGhpZXUgQXVzc2FndWVsOyBMaWNlbnNlZCBNSVQgKi8oZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLGFyZ3VtZW50cyl9fSxnPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5sZW5ndGg7Yz5iO2IrKylpZihiIGluIHRoaXMmJnRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfTtiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31yZXR1cm4gYS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtmb3IoYyBpbiBiKWQ9YltjXSxudWxsPT1hW2NdJiYoYVtjXT1kKTtyZXR1cm4gYX0sYS5wcm90b3R5cGUuaXNNb2JpbGU9ZnVuY3Rpb24oYSl7cmV0dXJuL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KGEpfSxhLnByb3RvdHlwZS5jcmVhdGVFdmVudD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtyZXR1cm4gbnVsbD09YiYmKGI9ITEpLG51bGw9PWMmJihjPSExKSxudWxsPT1kJiYoZD1udWxsKSxudWxsIT1kb2N1bWVudC5jcmVhdGVFdmVudD8oZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxlLmluaXRDdXN0b21FdmVudChhLGIsYyxkKSk6bnVsbCE9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3Q/KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSxlLmV2ZW50VHlwZT1hKTplLmV2ZW50TmFtZT1hLGV9LGEucHJvdG90eXBlLmVtaXRFdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiBudWxsIT1hLmRpc3BhdGNoRXZlbnQ/YS5kaXNwYXRjaEV2ZW50KGIpOmIgaW4obnVsbCE9YSk/YVtiXSgpOiJvbiIrYiBpbihudWxsIT1hKT9hWyJvbiIrYl0oKTp2b2lkIDB9LGEucHJvdG90eXBlLmFkZEV2ZW50PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbCE9YS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpOm51bGwhPWEuYXR0YWNoRXZlbnQ/YS5hdHRhY2hFdmVudCgib24iK2IsYyk6YVtiXT1jfSxhLnByb3RvdHlwZS5yZW1vdmVFdmVudD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG51bGwhPWEucmVtb3ZlRXZlbnRMaXN0ZW5lcj9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKTpudWxsIT1hLmRldGFjaEV2ZW50P2EuZGV0YWNoRXZlbnQoIm9uIitiLGMpOmRlbGV0ZSBhW2JdfSxhLnByb3RvdHlwZS5pbm5lckhlaWdodD1mdW5jdGlvbigpe3JldHVybiJpbm5lckhlaWdodCJpbiB3aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR9LGF9KCksYz10aGlzLldlYWtNYXB8fHRoaXMuTW96V2Vha01hcHx8KGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dGhpcy5rZXlzPVtdLHRoaXMudmFsdWVzPVtdfXJldHVybiBhLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjtmb3IoZj10aGlzLmtleXMsYj1kPTAsZT1mLmxlbmd0aDtlPmQ7Yj0rK2QpaWYoYz1mW2JdLGM9PT1hKXJldHVybiB0aGlzLnZhbHVlc1tiXX0sYS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoZz10aGlzLmtleXMsYz1lPTAsZj1nLmxlbmd0aDtmPmU7Yz0rK2UpaWYoZD1nW2NdLGQ9PT1hKXJldHVybiB2b2lkKHRoaXMudmFsdWVzW2NdPWIpO3JldHVybiB0aGlzLmtleXMucHVzaChhKSx0aGlzLnZhbHVlcy5wdXNoKGIpfSxhfSgpKSxhPXRoaXMuTXV0YXRpb25PYnNlcnZlcnx8dGhpcy5XZWJraXRNdXRhdGlvbk9ic2VydmVyfHx0aGlzLk1vek11dGF0aW9uT2JzZXJ2ZXJ8fChhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpeyJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmbnVsbCE9PWNvbnNvbGUmJmNvbnNvbGUud2FybigiTXV0YXRpb25PYnNlcnZlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgYnJvd3Nlci4iKSwidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJm51bGwhPT1jb25zb2xlJiZjb25zb2xlLndhcm4oIldPVy5qcyBjYW5ub3QgZGV0ZWN0IGRvbSBtdXRhdGlvbnMsIHBsZWFzZSBjYWxsIC5zeW5jKCkgYWZ0ZXIgbG9hZGluZyBuZXcgY29udGVudC4iKX1yZXR1cm4gYS5ub3RTdXBwb3J0ZWQ9ITAsYS5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbigpe30sYX0oKSksZD10aGlzLmdldENvbXB1dGVkU3R5bGV8fGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWU9ZnVuY3Rpb24oYil7dmFyIGM7cmV0dXJuImZsb2F0Ij09PWImJihiPSJzdHlsZUZsb2F0IiksZS50ZXN0KGIpJiZiLnJlcGxhY2UoZSxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KSwobnVsbCE9KGM9YS5jdXJyZW50U3R5bGUpP2NbYl06dm9pZCAwKXx8bnVsbH0sdGhpc30sZT0vKFwtKFthLXpdKXsxfSkvZyx0aGlzLldPVz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoYSl7bnVsbD09YSYmKGE9e30pLHRoaXMuc2Nyb2xsQ2FsbGJhY2s9Zih0aGlzLnNjcm9sbENhbGxiYWNrLHRoaXMpLHRoaXMuc2Nyb2xsSGFuZGxlcj1mKHRoaXMuc2Nyb2xsSGFuZGxlcix0aGlzKSx0aGlzLnJlc2V0QW5pbWF0aW9uPWYodGhpcy5yZXNldEFuaW1hdGlvbix0aGlzKSx0aGlzLnN0YXJ0PWYodGhpcy5zdGFydCx0aGlzKSx0aGlzLnNjcm9sbGVkPSEwLHRoaXMuY29uZmlnPXRoaXMudXRpbCgpLmV4dGVuZChhLHRoaXMuZGVmYXVsdHMpLG51bGwhPWEuc2Nyb2xsQ29udGFpbmVyJiYodGhpcy5jb25maWcuc2Nyb2xsQ29udGFpbmVyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYS5zY3JvbGxDb250YWluZXIpKSx0aGlzLmFuaW1hdGlvbk5hbWVDYWNoZT1uZXcgYyx0aGlzLndvd0V2ZW50PXRoaXMudXRpbCgpLmNyZWF0ZUV2ZW50KHRoaXMuY29uZmlnLmJveENsYXNzKX1yZXR1cm4gZS5wcm90b3R5cGUuZGVmYXVsdHM9e2JveENsYXNzOiJ3b3ciLGFuaW1hdGVDbGFzczoiYW5pbWF0ZWQiLG9mZnNldDowLG1vYmlsZTohMCxsaXZlOiEwLGNhbGxiYWNrOm51bGwsc2Nyb2xsQ29udGFpbmVyOm51bGx9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gdGhpcy5lbGVtZW50PXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsImludGVyYWN0aXZlIj09PShhPWRvY3VtZW50LnJlYWR5U3RhdGUpfHwiY29tcGxldGUiPT09YT90aGlzLnN0YXJ0KCk6dGhpcy51dGlsKCkuYWRkRXZlbnQoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLHRoaXMuc3RhcnQpLHRoaXMuZmluaXNoZWQ9W119LGUucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7aWYodGhpcy5zdG9wcGVkPSExLHRoaXMuYm94ZXM9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZTtmb3IoZD10aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLiIrdGhpcy5jb25maWcuYm94Q2xhc3MpLGU9W10sYT0wLGM9ZC5sZW5ndGg7Yz5hO2ErKyliPWRbYV0sZS5wdXNoKGIpO3JldHVybiBlfS5jYWxsKHRoaXMpLHRoaXMuYWxsPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGU7Zm9yKGQ9dGhpcy5ib3hlcyxlPVtdLGE9MCxjPWQubGVuZ3RoO2M+YTthKyspYj1kW2FdLGUucHVzaChiKTtyZXR1cm4gZX0uY2FsbCh0aGlzKSx0aGlzLmJveGVzLmxlbmd0aClpZih0aGlzLmRpc2FibGVkKCkpdGhpcy5yZXNldFN0eWxlKCk7ZWxzZSBmb3IoZT10aGlzLmJveGVzLGM9MCxkPWUubGVuZ3RoO2Q+YztjKyspYj1lW2NdLHRoaXMuYXBwbHlTdHlsZShiLCEwKTtyZXR1cm4gdGhpcy5kaXNhYmxlZCgpfHwodGhpcy51dGlsKCkuYWRkRXZlbnQodGhpcy5jb25maWcuc2Nyb2xsQ29udGFpbmVyfHx3aW5kb3csInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKSx0aGlzLnV0aWwoKS5hZGRFdmVudCh3aW5kb3csInJlc2l6ZSIsdGhpcy5zY3JvbGxIYW5kbGVyKSx0aGlzLmludGVydmFsPXNldEludGVydmFsKHRoaXMuc2Nyb2xsQ2FsbGJhY2ssNTApKSx0aGlzLmNvbmZpZy5saXZlP25ldyBhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYyxkLGUsZixnO2ZvcihnPVtdLGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspZj1iW2NdLGcucHVzaChmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2ZvcihjPWYuYWRkZWROb2Rlc3x8W10sZD1bXSxhPTAsYj1jLmxlbmd0aDtiPmE7YSsrKWU9Y1thXSxkLnB1c2godGhpcy5kb1N5bmMoZSkpO3JldHVybiBkfS5jYWxsKGEpKTtyZXR1cm4gZ319KHRoaXMpKS5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk6dm9pZCAwfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RvcHBlZD0hMCx0aGlzLnV0aWwoKS5yZW1vdmVFdmVudCh0aGlzLmNvbmZpZy5zY3JvbGxDb250YWluZXJ8fHdpbmRvdywic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpLHRoaXMudXRpbCgpLnJlbW92ZUV2ZW50KHdpbmRvdywicmVzaXplIix0aGlzLnNjcm9sbEhhbmRsZXIpLG51bGwhPXRoaXMuaW50ZXJ2YWw/Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTp2b2lkIDB9LGUucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oKXtyZXR1cm4gYS5ub3RTdXBwb3J0ZWQ/dGhpcy5kb1N5bmModGhpcy5lbGVtZW50KTp2b2lkIDB9LGUucHJvdG90eXBlLmRvU3luYz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO2lmKG51bGw9PWEmJihhPXRoaXMuZWxlbWVudCksMT09PWEubm9kZVR5cGUpe2ZvcihhPWEucGFyZW50Tm9kZXx8YSxlPWEucXVlcnlTZWxlY3RvckFsbCgiLiIrdGhpcy5jb25maWcuYm94Q2xhc3MpLGY9W10sYz0wLGQ9ZS5sZW5ndGg7ZD5jO2MrKyliPWVbY10sZy5jYWxsKHRoaXMuYWxsLGIpPDA/KHRoaXMuYm94ZXMucHVzaChiKSx0aGlzLmFsbC5wdXNoKGIpLHRoaXMuc3RvcHBlZHx8dGhpcy5kaXNhYmxlZCgpP3RoaXMucmVzZXRTdHlsZSgpOnRoaXMuYXBwbHlTdHlsZShiLCEwKSxmLnB1c2godGhpcy5zY3JvbGxlZD0hMCkpOmYucHVzaCh2b2lkIDApO3JldHVybiBmfX0sZS5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcHBseVN0eWxlKGEpLGEuY2xhc3NOYW1lPWEuY2xhc3NOYW1lKyIgIit0aGlzLmNvbmZpZy5hbmltYXRlQ2xhc3MsbnVsbCE9dGhpcy5jb25maWcuY2FsbGJhY2smJnRoaXMuY29uZmlnLmNhbGxiYWNrKGEpLHRoaXMudXRpbCgpLmVtaXRFdmVudChhLHRoaXMud293RXZlbnQpLHRoaXMudXRpbCgpLmFkZEV2ZW50KGEsImFuaW1hdGlvbmVuZCIsdGhpcy5yZXNldEFuaW1hdGlvbiksdGhpcy51dGlsKCkuYWRkRXZlbnQoYSwib2FuaW1hdGlvbmVuZCIsdGhpcy5yZXNldEFuaW1hdGlvbiksdGhpcy51dGlsKCkuYWRkRXZlbnQoYSwid2Via2l0QW5pbWF0aW9uRW5kIix0aGlzLnJlc2V0QW5pbWF0aW9uKSx0aGlzLnV0aWwoKS5hZGRFdmVudChhLCJNU0FuaW1hdGlvbkVuZCIsdGhpcy5yZXNldEFuaW1hdGlvbiksYX0sZS5wcm90b3R5cGUuYXBwbHlTdHlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZTtyZXR1cm4gZD1hLmdldEF0dHJpYnV0ZSgiZGF0YS13b3ctZHVyYXRpb24iKSxjPWEuZ2V0QXR0cmlidXRlKCJkYXRhLXdvdy1kZWxheSIpLGU9YS5nZXRBdHRyaWJ1dGUoImRhdGEtd293LWl0ZXJhdGlvbiIpLHRoaXMuYW5pbWF0ZShmdW5jdGlvbihmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZi5jdXN0b21TdHlsZShhLGIsZCxjLGUpfX0odGhpcykpfSxlLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKCl7cmV0dXJuInJlcXVlc3RBbmltYXRpb25GcmFtZSJpbiB3aW5kb3c/ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhKCl9fSgpLGUucHJvdG90eXBlLnJlc2V0U3R5bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2ZvcihkPXRoaXMuYm94ZXMsZT1bXSxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKWE9ZFtiXSxlLnB1c2goYS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIik7cmV0dXJuIGV9LGUucHJvdG90eXBlLnJlc2V0QW5pbWF0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBhLnR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJhbmltYXRpb25lbmQiKT49MD8oYj1hLnRhcmdldHx8YS5zcmNFbGVtZW50LGIuY2xhc3NOYW1lPWIuY2xhc3NOYW1lLnJlcGxhY2UodGhpcy5jb25maWcuYW5pbWF0ZUNsYXNzLCIiKS50cmltKCkpOnZvaWQgMH0sZS5wcm90b3R5cGUuY3VzdG9tU3R5bGU9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gYiYmdGhpcy5jYWNoZUFuaW1hdGlvbk5hbWUoYSksYS5zdHlsZS52aXNpYmlsaXR5PWI/ImhpZGRlbiI6InZpc2libGUiLGMmJnRoaXMudmVuZG9yU2V0KGEuc3R5bGUse2FuaW1hdGlvbkR1cmF0aW9uOmN9KSxkJiZ0aGlzLnZlbmRvclNldChhLnN0eWxlLHthbmltYXRpb25EZWxheTpkfSksZSYmdGhpcy52ZW5kb3JTZXQoYS5zdHlsZSx7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ZX0pLHRoaXMudmVuZG9yU2V0KGEuc3R5bGUse2FuaW1hdGlvbk5hbWU6Yj8ibm9uZSI6dGhpcy5jYWNoZWRBbmltYXRpb25OYW1lKGEpfSksYX0sZS5wcm90b3R5cGUudmVuZG9ycz1bIm1veiIsIndlYmtpdCJdLGUucHJvdG90eXBlLnZlbmRvclNldD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmO2Q9W107Zm9yKGMgaW4gYillPWJbY10sYVsiIitjXT1lLGQucHVzaChmdW5jdGlvbigpe3ZhciBiLGQsZyxoO2ZvcihnPXRoaXMudmVuZG9ycyxoPVtdLGI9MCxkPWcubGVuZ3RoO2Q+YjtiKyspZj1nW2JdLGgucHVzaChhWyIiK2YrYy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStjLnN1YnN0cigxKV09ZSk7cmV0dXJuIGh9LmNhbGwodGhpcykpO3JldHVybiBkfSxlLnByb3RvdHlwZS52ZW5kb3JDU1M9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGk7Zm9yKGg9ZChhKSxnPWguZ2V0UHJvcGVydHlDU1NWYWx1ZShiKSxmPXRoaXMudmVuZG9ycyxjPTAsZT1mLmxlbmd0aDtlPmM7YysrKWk9ZltjXSxnPWd8fGguZ2V0UHJvcGVydHlDU1NWYWx1ZSgiLSIraSsiLSIrYik7cmV0dXJuIGd9LGUucHJvdG90eXBlLmFuaW1hdGlvbk5hbWU9ZnVuY3Rpb24oYSl7dmFyIGI7dHJ5e2I9dGhpcy52ZW5kb3JDU1MoYSwiYW5pbWF0aW9uLW5hbWUiKS5jc3NUZXh0fWNhdGNoKGMpe2I9ZChhKS5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tbmFtZSIpfXJldHVybiJub25lIj09PWI/IiI6Yn0sZS5wcm90b3R5cGUuY2FjaGVBbmltYXRpb25OYW1lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFuaW1hdGlvbk5hbWVDYWNoZS5zZXQoYSx0aGlzLmFuaW1hdGlvbk5hbWUoYSkpfSxlLnByb3RvdHlwZS5jYWNoZWRBbmltYXRpb25OYW1lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFuaW1hdGlvbk5hbWVDYWNoZS5nZXQoYSl9LGUucHJvdG90eXBlLnNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxlZD0hMH0sZS5wcm90b3R5cGUuc2Nyb2xsQ2FsbGJhY2s9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4hdGhpcy5zY3JvbGxlZHx8KHRoaXMuc2Nyb2xsZWQ9ITEsdGhpcy5ib3hlcz1mdW5jdGlvbigpe3ZhciBiLGMsZCxlO2ZvcihkPXRoaXMuYm94ZXMsZT1bXSxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKWE9ZFtiXSxhJiYodGhpcy5pc1Zpc2libGUoYSk/dGhpcy5zaG93KGEpOmUucHVzaChhKSk7cmV0dXJuIGV9LmNhbGwodGhpcyksdGhpcy5ib3hlcy5sZW5ndGh8fHRoaXMuY29uZmlnLmxpdmUpP3ZvaWQgMDp0aGlzLnN0b3AoKX0sZS5wcm90b3R5cGUub2Zmc2V0VG9wPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYjt2b2lkIDA9PT1hLm9mZnNldFRvcDspYT1hLnBhcmVudE5vZGU7Zm9yKGI9YS5vZmZzZXRUb3A7YT1hLm9mZnNldFBhcmVudDspYis9YS5vZmZzZXRUb3A7cmV0dXJuIGJ9LGUucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO3JldHVybiBjPWEuZ2V0QXR0cmlidXRlKCJkYXRhLXdvdy1vZmZzZXQiKXx8dGhpcy5jb25maWcub2Zmc2V0LGY9dGhpcy5jb25maWcuc2Nyb2xsQ29udGFpbmVyJiZ0aGlzLmNvbmZpZy5zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wfHx3aW5kb3cucGFnZVlPZmZzZXQsZT1mK01hdGgubWluKHRoaXMuZWxlbWVudC5jbGllbnRIZWlnaHQsdGhpcy51dGlsKCkuaW5uZXJIZWlnaHQoKSktYyxkPXRoaXMub2Zmc2V0VG9wKGEpLGI9ZCthLmNsaWVudEhlaWdodCxlPj1kJiZiPj1mfSxlLnByb3RvdHlwZS51dGlsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuX3V0aWw/dGhpcy5fdXRpbDp0aGlzLl91dGlsPW5ldyBifSxlLnByb3RvdHlwZS5kaXNhYmxlZD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmNvbmZpZy5tb2JpbGUmJnRoaXMudXRpbCgpLmlzTW9iaWxlKG5hdmlnYXRvci51c2VyQWdlbnQpfSxlfSgpfSkuY2FsbCh0aGlzKTs="}},"time_used":569,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":569,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/css/bootstrap.min.css","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"stylesheet","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.264Z","timestamp":1785147795264,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /css/bootstrap.min.css HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/css,*/*;q=0.1\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: style\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=2\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ncache-control: public, max-age=2592000\r\nexpires: Wed, 26 Aug 2026 10:23:15 GMT\r\ncontent-type: text/css\r\nlast-modified: Sun, 30 Jun 2024 21:09:22 GMT\r\naccept-ranges: bytes\r\ncontent-encoding: br\r\nvary: Accept-Encoding\r\ncontent-length: 18277\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":121217,"size_decoded":18815,"mime_type":"text/css","magic":"ASCII text, with very long lines (65371)","md5":"cc0480f9ef7e44e21dfad7a983b4f103","sha1":"c2743b1c15dd653f049a4136d3d1f58b598502d9","sha256":"f0e71c474474ceedae050c344f527cdf8779f2981c88022d91c2755f31d72e89","sha512":"a00a9f2c25de2fad08e7d81ee2f4d2ced59a27bb36ddd59d6008bec1543719f6c5bd603274601b39dfd856b326b2b08ecb863b7ea09c39ae6d4e08d60a2f1e82","ssdeep":"768:VyDGxw/Vc/QWlJxtQOIuiHlq5mzI4X8OAduFKbv2ctg2Bd8JP7ecQVvH1FS:Vw/a1fIuiHlq5mN8lDbNmPbh","tlshash":"98c3c7a0f21031ea7333c55a75d0ed872219a153e56a4fb7f22f25d88f846ca1673f1a","first_seen":"2025-06-25T11:59:30.661996Z","last_seen":"2026-07-27T10:24:01.488093Z","times_seen":12,"resource_available":false,"data":"LyohCiAqIEJvb3RzdHJhcCB2My4zLjcgKGh0dHA6Ly9nZXRib290c3RyYXAuY29tKQogKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy4KICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSkKICovLyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL2h0bWx7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXJ0aWNsZSxhc2lkZSxkZXRhaWxzLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG1haW4sbWVudSxuYXYsc2VjdGlvbixzdW1tYXJ5e2Rpc3BsYXk6YmxvY2t9YXVkaW8sY2FudmFzLHByb2dyZXNzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfWF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjB9W2hpZGRlbl0sdGVtcGxhdGV7ZGlzcGxheTpub25lfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH1hOmFjdGl2ZSxhOmhvdmVye291dGxpbmU6MH1hYmJyW3RpdGxlXXtib3JkZXItYm90dG9tOjFweCBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6NzAwfWRmbntmb250LXN0eWxlOml0YWxpY31oMXttYXJnaW46LjY3ZW0gMDtmb250LXNpemU6MmVtfW1hcmt7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kOiNmZjB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdXB7dG9wOi0uNWVtfXN1Yntib3R0b206LS4yNWVtfWltZ3tib3JkZXI6MH1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59ZmlndXJle21hcmdpbjoxZW0gNDBweH1ocntoZWlnaHQ6MDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3h9cHJle292ZXJmbG93OmF1dG99Y29kZSxrYmQscHJlLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWJ1dHRvbixpbnB1dCxvcHRncm91cCxzZWxlY3QsdGV4dGFyZWF7bWFyZ2luOjA7Zm9udDppbmhlcml0O2NvbG9yOmluaGVyaXR9YnV0dG9ue292ZXJmbG93OnZpc2libGV9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfWJ1dHRvbixodG1sIGlucHV0W3R5cGU9YnV0dG9uXSxpbnB1dFt0eXBlPXJlc2V0XSxpbnB1dFt0eXBlPXN1Ym1pdF17LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtjdXJzb3I6cG9pbnRlcn1idXR0b25bZGlzYWJsZWRdLGh0bWwgaW5wdXRbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixpbnB1dDo6LW1vei1mb2N1cy1pbm5lcntwYWRkaW5nOjA7Ym9yZGVyOjB9aW5wdXR7bGluZS1oZWlnaHQ6bm9ybWFsfWlucHV0W3R5cGU9Y2hlY2tib3hdLGlucHV0W3R5cGU9cmFkaW9dey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjB9aW5wdXRbdHlwZT1udW1iZXJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLGlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31pbnB1dFt0eXBlPXNlYXJjaF17LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGR9aW5wdXRbdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLGlucHV0W3R5cGU9c2VhcmNoXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1maWVsZHNldHtwYWRkaW5nOi4zNWVtIC42MjVlbSAuNzVlbTttYXJnaW46MCAycHg7Ym9yZGVyOjFweCBzb2xpZCBzaWx2ZXJ9bGVnZW5ke3BhZGRpbmc6MDtib3JkZXI6MH10ZXh0YXJlYXtvdmVyZmxvdzphdXRvfW9wdGdyb3Vwe2ZvbnQtd2VpZ2h0OjcwMH10YWJsZXtib3JkZXItc3BhY2luZzowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX10ZCx0aHtwYWRkaW5nOjB9LyohIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvYmxvYi9tYXN0ZXIvc3JjL2Nzcy9tYWluLmNzcyAqL0BtZWRpYSBwcmludHsqLDphZnRlciw6YmVmb3Jle2NvbG9yOiMwMDAhaW1wb3J0YW50O3RleHQtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH1hLGE6dmlzaXRlZHt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfWFbaHJlZl06YWZ0ZXJ7Y29udGVudDoiICgiIGF0dHIoaHJlZikgIikifWFiYnJbdGl0bGVdOmFmdGVye2NvbnRlbnQ6IiAoIiBhdHRyKHRpdGxlKSAiKSJ9YVtocmVmXj0iamF2YXNjcmlwdDoiXTphZnRlcixhW2hyZWZePSIjIl06YWZ0ZXJ7Y29udGVudDoiIn1ibG9ja3F1b3RlLHByZXtib3JkZXI6MXB4IHNvbGlkICM5OTk7cGFnZS1icmVhay1pbnNpZGU6YXZvaWR9dGhlYWR7ZGlzcGxheTp0YWJsZS1oZWFkZXItZ3JvdXB9aW1nLHRye3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkfWltZ3ttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnR9aDIsaDMscHtvcnBoYW5zOjM7d2lkb3dzOjN9aDIsaDN7cGFnZS1icmVhay1hZnRlcjphdm9pZH0ubmF2YmFye2Rpc3BsYXk6bm9uZX0uYnRuPi5jYXJldCwuZHJvcHVwPi5idG4+LmNhcmV0e2JvcmRlci10b3AtY29sb3I6IzAwMCFpbXBvcnRhbnR9LmxhYmVse2JvcmRlcjoxcHggc29saWQgIzAwMH0udGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIWltcG9ydGFudH0udGFibGUgdGQsLnRhYmxlIHRoe2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnR9LnRhYmxlLWJvcmRlcmVkIHRkLC50YWJsZS1ib3JkZXJlZCB0aHtib3JkZXI6MXB4IHNvbGlkICNkZGQhaW1wb3J0YW50fX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OidHbHlwaGljb25zIEhhbGZsaW5ncyc7c3JjOnVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLmh0bWwpO3NyYzp1cmwoLi4vZm9udHMvZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhcmQ0MWRkNDFkZDQxZC5odG1sPyNpZWZpeCkgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLHVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLTIuaHRtbCkgZm9ybWF0KCd3b2ZmMicpLHVybCguLi9mb250cy9nbHlwaGljb25zLWhhbGZsaW5ncy1yZWd1bGFyLTMuaHRtbCkgZm9ybWF0KCd3b2ZmJyksdXJsKC4uL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIudHRmKSBmb3JtYXQoJ3RydWV0eXBlJyksdXJsKC4uL2ZvbnRzL2dseXBoaWNvbnMtaGFsZmxpbmdzLXJlZ3VsYXIuc3ZnI2dseXBoaWNvbnNfaGFsZmxpbmdzcmVndWxhcikgZm9ybWF0KCdzdmcnKX0uZ2x5cGhpY29ue3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDoxcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1mYW1pbHk6J0dseXBoaWNvbnMgSGFsZmxpbmdzJztmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZX0uZ2x5cGhpY29uLWFzdGVyaXNrOmJlZm9yZXtjb250ZW50OiJcMDAyYSJ9LmdseXBoaWNvbi1wbHVzOmJlZm9yZXtjb250ZW50OiJcMDAyYiJ9LmdseXBoaWNvbi1ldXI6YmVmb3JlLC5nbHlwaGljb24tZXVybzpiZWZvcmV7Y29udGVudDoiXDIwYWMifS5nbHlwaGljb24tbWludXM6YmVmb3Jle2NvbnRlbnQ6IlwyMjEyIn0uZ2x5cGhpY29uLWNsb3VkOmJlZm9yZXtjb250ZW50OiJcMjYwMSJ9LmdseXBoaWNvbi1lbnZlbG9wZTpiZWZvcmV7Y29udGVudDoiXDI3MDkifS5nbHlwaGljb24tcGVuY2lsOmJlZm9yZXtjb250ZW50OiJcMjcwZiJ9LmdseXBoaWNvbi1nbGFzczpiZWZvcmV7Y29udGVudDoiXGUwMDEifS5nbHlwaGljb24tbXVzaWM6YmVmb3Jle2NvbnRlbnQ6IlxlMDAyIn0uZ2x5cGhpY29uLXNlYXJjaDpiZWZvcmV7Y29udGVudDoiXGUwMDMifS5nbHlwaGljb24taGVhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDA1In0uZ2x5cGhpY29uLXN0YXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDA2In0uZ2x5cGhpY29uLXN0YXItZW1wdHk6YmVmb3Jle2NvbnRlbnQ6IlxlMDA3In0uZ2x5cGhpY29uLXVzZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDA4In0uZ2x5cGhpY29uLWZpbG06YmVmb3Jle2NvbnRlbnQ6IlxlMDA5In0uZ2x5cGhpY29uLXRoLWxhcmdlOmJlZm9yZXtjb250ZW50OiJcZTAxMCJ9LmdseXBoaWNvbi10aDpiZWZvcmV7Y29udGVudDoiXGUwMTEifS5nbHlwaGljb24tdGgtbGlzdDpiZWZvcmV7Y29udGVudDoiXGUwMTIifS5nbHlwaGljb24tb2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDEzIn0uZ2x5cGhpY29uLXJlbW92ZTpiZWZvcmV7Y29udGVudDoiXGUwMTQifS5nbHlwaGljb24tem9vbS1pbjpiZWZvcmV7Y29udGVudDoiXGUwMTUifS5nbHlwaGljb24tem9vbS1vdXQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDE2In0uZ2x5cGhpY29uLW9mZjpiZWZvcmV7Y29udGVudDoiXGUwMTcifS5nbHlwaGljb24tc2lnbmFsOmJlZm9yZXtjb250ZW50OiJcZTAxOCJ9LmdseXBoaWNvbi1jb2c6YmVmb3Jle2NvbnRlbnQ6IlxlMDE5In0uZ2x5cGhpY29uLXRyYXNoOmJlZm9yZXtjb250ZW50OiJcZTAyMCJ9LmdseXBoaWNvbi1ob21lOmJlZm9yZXtjb250ZW50OiJcZTAyMSJ9LmdseXBoaWNvbi1maWxlOmJlZm9yZXtjb250ZW50OiJcZTAyMiJ9LmdseXBoaWNvbi10aW1lOmJlZm9yZXtjb250ZW50OiJcZTAyMyJ9LmdseXBoaWNvbi1yb2FkOmJlZm9yZXtjb250ZW50OiJcZTAyNCJ9LmdseXBoaWNvbi1kb3dubG9hZC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDI1In0uZ2x5cGhpY29uLWRvd25sb2FkOmJlZm9yZXtjb250ZW50OiJcZTAyNiJ9LmdseXBoaWNvbi11cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDI3In0uZ2x5cGhpY29uLWluYm94OmJlZm9yZXtjb250ZW50OiJcZTAyOCJ9LmdseXBoaWNvbi1wbGF5LWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGUwMjkifS5nbHlwaGljb24tcmVwZWF0OmJlZm9yZXtjb250ZW50OiJcZTAzMCJ9LmdseXBoaWNvbi1yZWZyZXNoOmJlZm9yZXtjb250ZW50OiJcZTAzMSJ9LmdseXBoaWNvbi1saXN0LWFsdDpiZWZvcmV7Y29udGVudDoiXGUwMzIifS5nbHlwaGljb24tbG9jazpiZWZvcmV7Y29udGVudDoiXGUwMzMifS5nbHlwaGljb24tZmxhZzpiZWZvcmV7Y29udGVudDoiXGUwMzQifS5nbHlwaGljb24taGVhZHBob25lczpiZWZvcmV7Y29udGVudDoiXGUwMzUifS5nbHlwaGljb24tdm9sdW1lLW9mZjpiZWZvcmV7Y29udGVudDoiXGUwMzYifS5nbHlwaGljb24tdm9sdW1lLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMDM3In0uZ2x5cGhpY29uLXZvbHVtZS11cDpiZWZvcmV7Y29udGVudDoiXGUwMzgifS5nbHlwaGljb24tcXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZTAzOSJ9LmdseXBoaWNvbi1iYXJjb2RlOmJlZm9yZXtjb250ZW50OiJcZTA0MCJ9LmdseXBoaWNvbi10YWc6YmVmb3Jle2NvbnRlbnQ6IlxlMDQxIn0uZ2x5cGhpY29uLXRhZ3M6YmVmb3Jle2NvbnRlbnQ6IlxlMDQyIn0uZ2x5cGhpY29uLWJvb2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDQzIn0uZ2x5cGhpY29uLWJvb2ttYXJrOmJlZm9yZXtjb250ZW50OiJcZTA0NCJ9LmdseXBoaWNvbi1wcmludDpiZWZvcmV7Y29udGVudDoiXGUwNDUifS5nbHlwaGljb24tY2FtZXJhOmJlZm9yZXtjb250ZW50OiJcZTA0NiJ9LmdseXBoaWNvbi1mb250OmJlZm9yZXtjb250ZW50OiJcZTA0NyJ9LmdseXBoaWNvbi1ib2xkOmJlZm9yZXtjb250ZW50OiJcZTA0OCJ9LmdseXBoaWNvbi1pdGFsaWM6YmVmb3Jle2NvbnRlbnQ6IlxlMDQ5In0uZ2x5cGhpY29uLXRleHQtaGVpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA1MCJ9LmdseXBoaWNvbi10ZXh0LXdpZHRoOmJlZm9yZXtjb250ZW50OiJcZTA1MSJ9LmdseXBoaWNvbi1hbGlnbi1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTA1MiJ9LmdseXBoaWNvbi1hbGlnbi1jZW50ZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMDUzIn0uZ2x5cGhpY29uLWFsaWduLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA1NCJ9LmdseXBoaWNvbi1hbGlnbi1qdXN0aWZ5OmJlZm9yZXtjb250ZW50OiJcZTA1NSJ9LmdseXBoaWNvbi1saXN0OmJlZm9yZXtjb250ZW50OiJcZTA1NiJ9LmdseXBoaWNvbi1pbmRlbnQtbGVmdDpiZWZvcmV7Y29udGVudDoiXGUwNTcifS5nbHlwaGljb24taW5kZW50LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTA1OCJ9LmdseXBoaWNvbi1mYWNldGltZS12aWRlbzpiZWZvcmV7Y29udGVudDoiXGUwNTkifS5nbHlwaGljb24tcGljdHVyZTpiZWZvcmV7Y29udGVudDoiXGUwNjAifS5nbHlwaGljb24tbWFwLW1hcmtlcjpiZWZvcmV7Y29udGVudDoiXGUwNjIifS5nbHlwaGljb24tYWRqdXN0OmJlZm9yZXtjb250ZW50OiJcZTA2MyJ9LmdseXBoaWNvbi10aW50OmJlZm9yZXtjb250ZW50OiJcZTA2NCJ9LmdseXBoaWNvbi1lZGl0OmJlZm9yZXtjb250ZW50OiJcZTA2NSJ9LmdseXBoaWNvbi1zaGFyZTpiZWZvcmV7Y29udGVudDoiXGUwNjYifS5nbHlwaGljb24tY2hlY2s6YmVmb3Jle2NvbnRlbnQ6IlxlMDY3In0uZ2x5cGhpY29uLW1vdmU6YmVmb3Jle2NvbnRlbnQ6IlxlMDY4In0uZ2x5cGhpY29uLXN0ZXAtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDY5In0uZ2x5cGhpY29uLWZhc3QtYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDcwIn0uZ2x5cGhpY29uLWJhY2t3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA3MSJ9LmdseXBoaWNvbi1wbGF5OmJlZm9yZXtjb250ZW50OiJcZTA3MiJ9LmdseXBoaWNvbi1wYXVzZTpiZWZvcmV7Y29udGVudDoiXGUwNzMifS5nbHlwaGljb24tc3RvcDpiZWZvcmV7Y29udGVudDoiXGUwNzQifS5nbHlwaGljb24tZm9yd2FyZDpiZWZvcmV7Y29udGVudDoiXGUwNzUifS5nbHlwaGljb24tZmFzdC1mb3J3YXJkOmJlZm9yZXtjb250ZW50OiJcZTA3NiJ9LmdseXBoaWNvbi1zdGVwLWZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDc3In0uZ2x5cGhpY29uLWVqZWN0OmJlZm9yZXtjb250ZW50OiJcZTA3OCJ9LmdseXBoaWNvbi1jaGV2cm9uLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDc5In0uZ2x5cGhpY29uLWNoZXZyb24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMDgwIn0uZ2x5cGhpY29uLXBsdXMtc2lnbjpiZWZvcmV7Y29udGVudDoiXGUwODEifS5nbHlwaGljb24tbWludXMtc2lnbjpiZWZvcmV7Y29udGVudDoiXGUwODIifS5nbHlwaGljb24tcmVtb3ZlLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDgzIn0uZ2x5cGhpY29uLW9rLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDg0In0uZ2x5cGhpY29uLXF1ZXN0aW9uLXNpZ246YmVmb3Jle2NvbnRlbnQ6IlxlMDg1In0uZ2x5cGhpY29uLWluZm8tc2lnbjpiZWZvcmV7Y29udGVudDoiXGUwODYifS5nbHlwaGljb24tc2NyZWVuc2hvdDpiZWZvcmV7Y29udGVudDoiXGUwODcifS5nbHlwaGljb24tcmVtb3ZlLWNpcmNsZTpiZWZvcmV7Y29udGVudDoiXGUwODgifS5nbHlwaGljb24tb2stY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZTA4OSJ9LmdseXBoaWNvbi1iYW4tY2lyY2xlOmJlZm9yZXtjb250ZW50OiJcZTA5MCJ9LmdseXBoaWNvbi1hcnJvdy1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTA5MSJ9LmdseXBoaWNvbi1hcnJvdy1yaWdodDpiZWZvcmV7Y29udGVudDoiXGUwOTIifS5nbHlwaGljb24tYXJyb3ctdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMDkzIn0uZ2x5cGhpY29uLWFycm93LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMDk0In0uZ2x5cGhpY29uLXNoYXJlLWFsdDpiZWZvcmV7Y29udGVudDoiXGUwOTUifS5nbHlwaGljb24tcmVzaXplLWZ1bGw6YmVmb3Jle2NvbnRlbnQ6IlxlMDk2In0uZ2x5cGhpY29uLXJlc2l6ZS1zbWFsbDpiZWZvcmV7Y29udGVudDoiXGUwOTcifS5nbHlwaGljb24tZXhjbGFtYXRpb24tc2lnbjpiZWZvcmV7Y29udGVudDoiXGUxMDEifS5nbHlwaGljb24tZ2lmdDpiZWZvcmV7Y29udGVudDoiXGUxMDIifS5nbHlwaGljb24tbGVhZjpiZWZvcmV7Y29udGVudDoiXGUxMDMifS5nbHlwaGljb24tZmlyZTpiZWZvcmV7Y29udGVudDoiXGUxMDQifS5nbHlwaGljb24tZXllLW9wZW46YmVmb3Jle2NvbnRlbnQ6IlxlMTA1In0uZ2x5cGhpY29uLWV5ZS1jbG9zZTpiZWZvcmV7Y29udGVudDoiXGUxMDYifS5nbHlwaGljb24td2FybmluZy1zaWduOmJlZm9yZXtjb250ZW50OiJcZTEwNyJ9LmdseXBoaWNvbi1wbGFuZTpiZWZvcmV7Y29udGVudDoiXGUxMDgifS5nbHlwaGljb24tY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTA5In0uZ2x5cGhpY29uLXJhbmRvbTpiZWZvcmV7Y29udGVudDoiXGUxMTAifS5nbHlwaGljb24tY29tbWVudDpiZWZvcmV7Y29udGVudDoiXGUxMTEifS5nbHlwaGljb24tbWFnbmV0OmJlZm9yZXtjb250ZW50OiJcZTExMiJ9LmdseXBoaWNvbi1jaGV2cm9uLXVwOmJlZm9yZXtjb250ZW50OiJcZTExMyJ9LmdseXBoaWNvbi1jaGV2cm9uLWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMTE0In0uZ2x5cGhpY29uLXJldHdlZXQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTE1In0uZ2x5cGhpY29uLXNob3BwaW5nLWNhcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTE2In0uZ2x5cGhpY29uLWZvbGRlci1jbG9zZTpiZWZvcmV7Y29udGVudDoiXGUxMTcifS5nbHlwaGljb24tZm9sZGVyLW9wZW46YmVmb3Jle2NvbnRlbnQ6IlxlMTE4In0uZ2x5cGhpY29uLXJlc2l6ZS12ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDoiXGUxMTkifS5nbHlwaGljb24tcmVzaXplLWhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6IlxlMTIwIn0uZ2x5cGhpY29uLWhkZDpiZWZvcmV7Y29udGVudDoiXGUxMjEifS5nbHlwaGljb24tYnVsbGhvcm46YmVmb3Jle2NvbnRlbnQ6IlxlMTIyIn0uZ2x5cGhpY29uLWJlbGw6YmVmb3Jle2NvbnRlbnQ6IlxlMTIzIn0uZ2x5cGhpY29uLWNlcnRpZmljYXRlOmJlZm9yZXtjb250ZW50OiJcZTEyNCJ9LmdseXBoaWNvbi10aHVtYnMtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMTI1In0uZ2x5cGhpY29uLXRodW1icy1kb3duOmJlZm9yZXtjb250ZW50OiJcZTEyNiJ9LmdseXBoaWNvbi1oYW5kLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTEyNyJ9LmdseXBoaWNvbi1oYW5kLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTI4In0uZ2x5cGhpY29uLWhhbmQtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMTI5In0uZ2x5cGhpY29uLWhhbmQtZG93bjpiZWZvcmV7Y29udGVudDoiXGUxMzAifS5nbHlwaGljb24tY2lyY2xlLWFycm93LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTEzMSJ9LmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctbGVmdDpiZWZvcmV7Y29udGVudDoiXGUxMzIifS5nbHlwaGljb24tY2lyY2xlLWFycm93LXVwOmJlZm9yZXtjb250ZW50OiJcZTEzMyJ9LmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93bjpiZWZvcmV7Y29udGVudDoiXGUxMzQifS5nbHlwaGljb24tZ2xvYmU6YmVmb3Jle2NvbnRlbnQ6IlxlMTM1In0uZ2x5cGhpY29uLXdyZW5jaDpiZWZvcmV7Y29udGVudDoiXGUxMzYifS5nbHlwaGljb24tdGFza3M6YmVmb3Jle2NvbnRlbnQ6IlxlMTM3In0uZ2x5cGhpY29uLWZpbHRlcjpiZWZvcmV7Y29udGVudDoiXGUxMzgifS5nbHlwaGljb24tYnJpZWZjYXNlOmJlZm9yZXtjb250ZW50OiJcZTEzOSJ9LmdseXBoaWNvbi1mdWxsc2NyZWVuOmJlZm9yZXtjb250ZW50OiJcZTE0MCJ9LmdseXBoaWNvbi1kYXNoYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTQxIn0uZ2x5cGhpY29uLXBhcGVyY2xpcDpiZWZvcmV7Y29udGVudDoiXGUxNDIifS5nbHlwaGljb24taGVhcnQtZW1wdHk6YmVmb3Jle2NvbnRlbnQ6IlxlMTQzIn0uZ2x5cGhpY29uLWxpbms6YmVmb3Jle2NvbnRlbnQ6IlxlMTQ0In0uZ2x5cGhpY29uLXBob25lOmJlZm9yZXtjb250ZW50OiJcZTE0NSJ9LmdseXBoaWNvbi1wdXNocGluOmJlZm9yZXtjb250ZW50OiJcZTE0NiJ9LmdseXBoaWNvbi11c2Q6YmVmb3Jle2NvbnRlbnQ6IlxlMTQ4In0uZ2x5cGhpY29uLWdicDpiZWZvcmV7Y29udGVudDoiXGUxNDkifS5nbHlwaGljb24tc29ydDpiZWZvcmV7Y29udGVudDoiXGUxNTAifS5nbHlwaGljb24tc29ydC1ieS1hbHBoYWJldDpiZWZvcmV7Y29udGVudDoiXGUxNTEifS5nbHlwaGljb24tc29ydC1ieS1hbHBoYWJldC1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTUyIn0uZ2x5cGhpY29uLXNvcnQtYnktb3JkZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTUzIn0uZ2x5cGhpY29uLXNvcnQtYnktb3JkZXItYWx0OmJlZm9yZXtjb250ZW50OiJcZTE1NCJ9LmdseXBoaWNvbi1zb3J0LWJ5LWF0dHJpYnV0ZXM6YmVmb3Jle2NvbnRlbnQ6IlxlMTU1In0uZ2x5cGhpY29uLXNvcnQtYnktYXR0cmlidXRlcy1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTU2In0uZ2x5cGhpY29uLXVuY2hlY2tlZDpiZWZvcmV7Y29udGVudDoiXGUxNTcifS5nbHlwaGljb24tZXhwYW5kOmJlZm9yZXtjb250ZW50OiJcZTE1OCJ9LmdseXBoaWNvbi1jb2xsYXBzZS1kb3duOmJlZm9yZXtjb250ZW50OiJcZTE1OSJ9LmdseXBoaWNvbi1jb2xsYXBzZS11cDpiZWZvcmV7Y29udGVudDoiXGUxNjAifS5nbHlwaGljb24tbG9nLWluOmJlZm9yZXtjb250ZW50OiJcZTE2MSJ9LmdseXBoaWNvbi1mbGFzaDpiZWZvcmV7Y29udGVudDoiXGUxNjIifS5nbHlwaGljb24tbG9nLW91dDpiZWZvcmV7Y29udGVudDoiXGUxNjMifS5nbHlwaGljb24tbmV3LXdpbmRvdzpiZWZvcmV7Y29udGVudDoiXGUxNjQifS5nbHlwaGljb24tcmVjb3JkOmJlZm9yZXtjb250ZW50OiJcZTE2NSJ9LmdseXBoaWNvbi1zYXZlOmJlZm9yZXtjb250ZW50OiJcZTE2NiJ9LmdseXBoaWNvbi1vcGVuOmJlZm9yZXtjb250ZW50OiJcZTE2NyJ9LmdseXBoaWNvbi1zYXZlZDpiZWZvcmV7Y29udGVudDoiXGUxNjgifS5nbHlwaGljb24taW1wb3J0OmJlZm9yZXtjb250ZW50OiJcZTE2OSJ9LmdseXBoaWNvbi1leHBvcnQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTcwIn0uZ2x5cGhpY29uLXNlbmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTcxIn0uZ2x5cGhpY29uLWZsb3BweS1kaXNrOmJlZm9yZXtjb250ZW50OiJcZTE3MiJ9LmdseXBoaWNvbi1mbG9wcHktc2F2ZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTczIn0uZ2x5cGhpY29uLWZsb3BweS1yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6IlxlMTc0In0uZ2x5cGhpY29uLWZsb3BweS1zYXZlOmJlZm9yZXtjb250ZW50OiJcZTE3NSJ9LmdseXBoaWNvbi1mbG9wcHktb3BlbjpiZWZvcmV7Y29udGVudDoiXGUxNzYifS5nbHlwaGljb24tY3JlZGl0LWNhcmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTc3In0uZ2x5cGhpY29uLXRyYW5zZmVyOmJlZm9yZXtjb250ZW50OiJcZTE3OCJ9LmdseXBoaWNvbi1jdXRsZXJ5OmJlZm9yZXtjb250ZW50OiJcZTE3OSJ9LmdseXBoaWNvbi1oZWFkZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMTgwIn0uZ2x5cGhpY29uLWNvbXByZXNzZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTgxIn0uZ2x5cGhpY29uLWVhcnBob25lOmJlZm9yZXtjb250ZW50OiJcZTE4MiJ9LmdseXBoaWNvbi1waG9uZS1hbHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTgzIn0uZ2x5cGhpY29uLXRvd2VyOmJlZm9yZXtjb250ZW50OiJcZTE4NCJ9LmdseXBoaWNvbi1zdGF0czpiZWZvcmV7Y29udGVudDoiXGUxODUifS5nbHlwaGljb24tc2QtdmlkZW86YmVmb3Jle2NvbnRlbnQ6IlxlMTg2In0uZ2x5cGhpY29uLWhkLXZpZGVvOmJlZm9yZXtjb250ZW50OiJcZTE4NyJ9LmdseXBoaWNvbi1zdWJ0aXRsZXM6YmVmb3Jle2NvbnRlbnQ6IlxlMTg4In0uZ2x5cGhpY29uLXNvdW5kLXN0ZXJlbzpiZWZvcmV7Y29udGVudDoiXGUxODkifS5nbHlwaGljb24tc291bmQtZG9sYnk6YmVmb3Jle2NvbnRlbnQ6IlxlMTkwIn0uZ2x5cGhpY29uLXNvdW5kLTUtMTpiZWZvcmV7Y29udGVudDoiXGUxOTEifS5nbHlwaGljb24tc291bmQtNi0xOmJlZm9yZXtjb250ZW50OiJcZTE5MiJ9LmdseXBoaWNvbi1zb3VuZC03LTE6YmVmb3Jle2NvbnRlbnQ6IlxlMTkzIn0uZ2x5cGhpY29uLWNvcHlyaWdodC1tYXJrOmJlZm9yZXtjb250ZW50OiJcZTE5NCJ9LmdseXBoaWNvbi1yZWdpc3RyYXRpb24tbWFyazpiZWZvcmV7Y29udGVudDoiXGUxOTUifS5nbHlwaGljb24tY2xvdWQtZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMTk3In0uZ2x5cGhpY29uLWNsb3VkLXVwbG9hZDpiZWZvcmV7Y29udGVudDoiXGUxOTgifS5nbHlwaGljb24tdHJlZS1jb25pZmVyOmJlZm9yZXtjb250ZW50OiJcZTE5OSJ9LmdseXBoaWNvbi10cmVlLWRlY2lkdW91czpiZWZvcmV7Y29udGVudDoiXGUyMDAifS5nbHlwaGljb24tY2Q6YmVmb3Jle2NvbnRlbnQ6IlxlMjAxIn0uZ2x5cGhpY29uLXNhdmUtZmlsZTpiZWZvcmV7Y29udGVudDoiXGUyMDIifS5nbHlwaGljb24tb3Blbi1maWxlOmJlZm9yZXtjb250ZW50OiJcZTIwMyJ9LmdseXBoaWNvbi1sZXZlbC11cDpiZWZvcmV7Y29udGVudDoiXGUyMDQifS5nbHlwaGljb24tY29weTpiZWZvcmV7Y29udGVudDoiXGUyMDUifS5nbHlwaGljb24tcGFzdGU6YmVmb3Jle2NvbnRlbnQ6IlxlMjA2In0uZ2x5cGhpY29uLWFsZXJ0OmJlZm9yZXtjb250ZW50OiJcZTIwOSJ9LmdseXBoaWNvbi1lcXVhbGl6ZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMjEwIn0uZ2x5cGhpY29uLWtpbmc6YmVmb3Jle2NvbnRlbnQ6IlxlMjExIn0uZ2x5cGhpY29uLXF1ZWVuOmJlZm9yZXtjb250ZW50OiJcZTIxMiJ9LmdseXBoaWNvbi1wYXduOmJlZm9yZXtjb250ZW50OiJcZTIxMyJ9LmdseXBoaWNvbi1iaXNob3A6YmVmb3Jle2NvbnRlbnQ6IlxlMjE0In0uZ2x5cGhpY29uLWtuaWdodDpiZWZvcmV7Y29udGVudDoiXGUyMTUifS5nbHlwaGljb24tYmFieS1mb3JtdWxhOmJlZm9yZXtjb250ZW50OiJcZTIxNiJ9LmdseXBoaWNvbi10ZW50OmJlZm9yZXtjb250ZW50OiJcMjZmYSJ9LmdseXBoaWNvbi1ibGFja2JvYXJkOmJlZm9yZXtjb250ZW50OiJcZTIxOCJ9LmdseXBoaWNvbi1iZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjE5In0uZ2x5cGhpY29uLWFwcGxlOmJlZm9yZXtjb250ZW50OiJcZjhmZiJ9LmdseXBoaWNvbi1lcmFzZTpiZWZvcmV7Y29udGVudDoiXGUyMjEifS5nbHlwaGljb24taG91cmdsYXNzOmJlZm9yZXtjb250ZW50OiJcMjMxYiJ9LmdseXBoaWNvbi1sYW1wOmJlZm9yZXtjb250ZW50OiJcZTIyMyJ9LmdseXBoaWNvbi1kdXBsaWNhdGU6YmVmb3Jle2NvbnRlbnQ6IlxlMjI0In0uZ2x5cGhpY29uLXBpZ2d5LWJhbms6YmVmb3Jle2NvbnRlbnQ6IlxlMjI1In0uZ2x5cGhpY29uLXNjaXNzb3JzOmJlZm9yZXtjb250ZW50OiJcZTIyNiJ9LmdseXBoaWNvbi1iaXRjb2luOmJlZm9yZXtjb250ZW50OiJcZTIyNyJ9LmdseXBoaWNvbi1idGM6YmVmb3Jle2NvbnRlbnQ6IlxlMjI3In0uZ2x5cGhpY29uLXhidDpiZWZvcmV7Y29udGVudDoiXGUyMjcifS5nbHlwaGljb24teWVuOmJlZm9yZXtjb250ZW50OiJcMDBhNSJ9LmdseXBoaWNvbi1qcHk6YmVmb3Jle2NvbnRlbnQ6IlwwMGE1In0uZ2x5cGhpY29uLXJ1YmxlOmJlZm9yZXtjb250ZW50OiJcMjBiZCJ9LmdseXBoaWNvbi1ydWI6YmVmb3Jle2NvbnRlbnQ6IlwyMGJkIn0uZ2x5cGhpY29uLXNjYWxlOmJlZm9yZXtjb250ZW50OiJcZTIzMCJ9LmdseXBoaWNvbi1pY2UtbG9sbHk6YmVmb3Jle2NvbnRlbnQ6IlxlMjMxIn0uZ2x5cGhpY29uLWljZS1sb2xseS10YXN0ZWQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjMyIn0uZ2x5cGhpY29uLWVkdWNhdGlvbjpiZWZvcmV7Y29udGVudDoiXGUyMzMifS5nbHlwaGljb24tb3B0aW9uLWhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6IlxlMjM0In0uZ2x5cGhpY29uLW9wdGlvbi12ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDoiXGUyMzUifS5nbHlwaGljb24tbWVudS1oYW1idXJnZXI6YmVmb3Jle2NvbnRlbnQ6IlxlMjM2In0uZ2x5cGhpY29uLW1vZGFsLXdpbmRvdzpiZWZvcmV7Y29udGVudDoiXGUyMzcifS5nbHlwaGljb24tb2lsOmJlZm9yZXtjb250ZW50OiJcZTIzOCJ9LmdseXBoaWNvbi1ncmFpbjpiZWZvcmV7Y29udGVudDoiXGUyMzkifS5nbHlwaGljb24tc3VuZ2xhc3NlczpiZWZvcmV7Y29udGVudDoiXGUyNDAifS5nbHlwaGljb24tdGV4dC1zaXplOmJlZm9yZXtjb250ZW50OiJcZTI0MSJ9LmdseXBoaWNvbi10ZXh0LWNvbG9yOmJlZm9yZXtjb250ZW50OiJcZTI0MiJ9LmdseXBoaWNvbi10ZXh0LWJhY2tncm91bmQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjQzIn0uZ2x5cGhpY29uLW9iamVjdC1hbGlnbi10b3A6YmVmb3Jle2NvbnRlbnQ6IlxlMjQ0In0uZ2x5cGhpY29uLW9iamVjdC1hbGlnbi1ib3R0b206YmVmb3Jle2NvbnRlbnQ6IlxlMjQ1In0uZ2x5cGhpY29uLW9iamVjdC1hbGlnbi1ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OiJcZTI0NiJ9LmdseXBoaWNvbi1vYmplY3QtYWxpZ24tbGVmdDpiZWZvcmV7Y29udGVudDoiXGUyNDcifS5nbHlwaGljb24tb2JqZWN0LWFsaWduLXZlcnRpY2FsOmJlZm9yZXtjb250ZW50OiJcZTI0OCJ9LmdseXBoaWNvbi1vYmplY3QtYWxpZ24tcmlnaHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjQ5In0uZ2x5cGhpY29uLXRyaWFuZ2xlLXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTI1MCJ9LmdseXBoaWNvbi10cmlhbmdsZS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTI1MSJ9LmdseXBoaWNvbi10cmlhbmdsZS1ib3R0b206YmVmb3Jle2NvbnRlbnQ6IlxlMjUyIn0uZ2x5cGhpY29uLXRyaWFuZ2xlLXRvcDpiZWZvcmV7Y29udGVudDoiXGUyNTMifS5nbHlwaGljb24tY29uc29sZTpiZWZvcmV7Y29udGVudDoiXGUyNTQifS5nbHlwaGljb24tc3VwZXJzY3JpcHQ6YmVmb3Jle2NvbnRlbnQ6IlxlMjU1In0uZ2x5cGhpY29uLXN1YnNjcmlwdDpiZWZvcmV7Y29udGVudDoiXGUyNTYifS5nbHlwaGljb24tbWVudS1sZWZ0OmJlZm9yZXtjb250ZW50OiJcZTI1NyJ9LmdseXBoaWNvbi1tZW51LXJpZ2h0OmJlZm9yZXtjb250ZW50OiJcZTI1OCJ9LmdseXBoaWNvbi1tZW51LWRvd246YmVmb3Jle2NvbnRlbnQ6IlxlMjU5In0uZ2x5cGhpY29uLW1lbnUtdXA6YmVmb3Jle2NvbnRlbnQ6IlxlMjYwIn0qey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH06YWZ0ZXIsOmJlZm9yZXstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9aHRtbHtmb250LXNpemU6MTBweDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX1ib2R5e2ZvbnQtZmFtaWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2ZmZn1idXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6aW5oZXJpdH1he2NvbG9yOiMzMzdhYjc7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpmb2N1cyxhOmhvdmVye2NvbG9yOiMyMzUyN2M7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hOmZvY3Vze291dGxpbmU6NXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO291dGxpbmUtb2Zmc2V0Oi0ycHh9ZmlndXJle21hcmdpbjowfWltZ3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmNhcm91c2VsLWlubmVyPi5pdGVtPmE+aW1nLC5jYXJvdXNlbC1pbm5lcj4uaXRlbT5pbWcsLmltZy1yZXNwb25zaXZlLC50aHVtYm5haWwgYT5pbWcsLnRodW1ibmFpbD5pbWd7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30uaW1nLXJvdW5kZWR7Ym9yZGVyLXJhZGl1czo2cHh9LmltZy10aHVtYm5haWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG87cGFkZGluZzo0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0MztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjJzIGVhc2UtaW4tb3V0Oy1vLXRyYW5zaXRpb246YWxsIC4ycyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXR9LmltZy1jaXJjbGV7Ym9yZGVyLXJhZGl1czo1MCV9aHJ7bWFyZ2luLXRvcDoyMHB4O21hcmdpbi1ib3R0b206MjBweDtib3JkZXI6MDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlfS5zci1vbmx5e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4O3BhZGRpbmc6MDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDAsMCwwLDApO2JvcmRlcjowfS5zci1vbmx5LWZvY3VzYWJsZTphY3RpdmUsLnNyLW9ubHktZm9jdXNhYmxlOmZvY3Vze3Bvc2l0aW9uOnN0YXRpYzt3aWR0aDphdXRvO2hlaWdodDphdXRvO21hcmdpbjowO292ZXJmbG93OnZpc2libGU7Y2xpcDphdXRvfVtyb2xlPWJ1dHRvbl17Y3Vyc29yOnBvaW50ZXJ9LmgxLC5oMiwuaDMsLmg0LC5oNSwuaDYsaDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDo1MDA7bGluZS1oZWlnaHQ6MS4xO2NvbG9yOmluaGVyaXR9LmgxIC5zbWFsbCwuaDEgc21hbGwsLmgyIC5zbWFsbCwuaDIgc21hbGwsLmgzIC5zbWFsbCwuaDMgc21hbGwsLmg0IC5zbWFsbCwuaDQgc21hbGwsLmg1IC5zbWFsbCwuaDUgc21hbGwsLmg2IC5zbWFsbCwuaDYgc21hbGwsaDEgLnNtYWxsLGgxIHNtYWxsLGgyIC5zbWFsbCxoMiBzbWFsbCxoMyAuc21hbGwsaDMgc21hbGwsaDQgLnNtYWxsLGg0IHNtYWxsLGg1IC5zbWFsbCxoNSBzbWFsbCxoNiAuc21hbGwsaDYgc21hbGx7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjE7Y29sb3I6Izc3N30uaDEsLmgyLC5oMyxoMSxoMixoM3ttYXJnaW4tdG9wOjIwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS5oMSAuc21hbGwsLmgxIHNtYWxsLC5oMiAuc21hbGwsLmgyIHNtYWxsLC5oMyAuc21hbGwsLmgzIHNtYWxsLGgxIC5zbWFsbCxoMSBzbWFsbCxoMiAuc21hbGwsaDIgc21hbGwsaDMgLnNtYWxsLGgzIHNtYWxse2ZvbnQtc2l6ZTo2NSV9Lmg0LC5oNSwuaDYsaDQsaDUsaDZ7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0uaDQgLnNtYWxsLC5oNCBzbWFsbCwuaDUgLnNtYWxsLC5oNSBzbWFsbCwuaDYgLnNtYWxsLC5oNiBzbWFsbCxoNCAuc21hbGwsaDQgc21hbGwsaDUgLnNtYWxsLGg1IHNtYWxsLGg2IC5zbWFsbCxoNiBzbWFsbHtmb250LXNpemU6NzUlfS5oMSxoMXtmb250LXNpemU6MzZweH0uaDIsaDJ7Zm9udC1zaXplOjMwcHh9LmgzLGgze2ZvbnQtc2l6ZToyNHB4fS5oNCxoNHtmb250LXNpemU6MThweH0uaDUsaDV7Zm9udC1zaXplOjE0cHh9Lmg2LGg2e2ZvbnQtc2l6ZToxMnB4fXB7bWFyZ2luOjAgMCAxMHB4fS5sZWFke21hcmdpbi1ib3R0b206MjBweDtmb250LXNpemU6MTZweDtmb250LXdlaWdodDozMDA7bGluZS1oZWlnaHQ6MS40fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubGVhZHtmb250LXNpemU6MjFweH19LnNtYWxsLHNtYWxse2ZvbnQtc2l6ZTo4NSV9Lm1hcmssbWFya3twYWRkaW5nOi4yZW07YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS50ZXh0LWp1c3RpZnl7dGV4dC1hbGlnbjpqdXN0aWZ5fS50ZXh0LW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LnRleHQtbG93ZXJjYXNle3RleHQtdHJhbnNmb3JtOmxvd2VyY2FzZX0udGV4dC11cHBlcmNhc2V7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS50ZXh0LWNhcGl0YWxpemV7dGV4dC10cmFuc2Zvcm06Y2FwaXRhbGl6ZX0udGV4dC1tdXRlZHtjb2xvcjojNzc3fS50ZXh0LXByaW1hcnl7Y29sb3I6IzMzN2FiN31hLnRleHQtcHJpbWFyeTpmb2N1cyxhLnRleHQtcHJpbWFyeTpob3Zlcntjb2xvcjojMjg2MDkwfS50ZXh0LXN1Y2Nlc3N7Y29sb3I6IzNjNzYzZH1hLnRleHQtc3VjY2Vzczpmb2N1cyxhLnRleHQtc3VjY2Vzczpob3Zlcntjb2xvcjojMmI1NDJjfS50ZXh0LWluZm97Y29sb3I6IzMxNzA4Zn1hLnRleHQtaW5mbzpmb2N1cyxhLnRleHQtaW5mbzpob3Zlcntjb2xvcjojMjQ1MjY5fS50ZXh0LXdhcm5pbmd7Y29sb3I6IzhhNmQzYn1hLnRleHQtd2FybmluZzpmb2N1cyxhLnRleHQtd2FybmluZzpob3Zlcntjb2xvcjojNjY1MTJjfS50ZXh0LWRhbmdlcntjb2xvcjojYTk0NDQyfWEudGV4dC1kYW5nZXI6Zm9jdXMsYS50ZXh0LWRhbmdlcjpob3Zlcntjb2xvcjojODQzNTM0fS5iZy1wcmltYXJ5e2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3fWEuYmctcHJpbWFyeTpmb2N1cyxhLmJnLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjg2MDkwfS5iZy1zdWNjZXNze2JhY2tncm91bmQtY29sb3I6I2RmZjBkOH1hLmJnLXN1Y2Nlc3M6Zm9jdXMsYS5iZy1zdWNjZXNzOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2MxZTJiM30uYmctaW5mb3tiYWNrZ3JvdW5kLWNvbG9yOiNkOWVkZjd9YS5iZy1pbmZvOmZvY3VzLGEuYmctaW5mbzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhZmQ5ZWV9LmJnLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZmNmOGUzfWEuYmctd2FybmluZzpmb2N1cyxhLmJnLXdhcm5pbmc6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjdlY2I1fS5iZy1kYW5nZXJ7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlfWEuYmctZGFuZ2VyOmZvY3VzLGEuYmctZGFuZ2VyOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U0YjliOX0ucGFnZS1oZWFkZXJ7cGFkZGluZy1ib3R0b206OXB4O21hcmdpbjo0MHB4IDAgMjBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlfW9sLHVse21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjEwcHh9b2wgb2wsb2wgdWwsdWwgb2wsdWwgdWx7bWFyZ2luLWJvdHRvbTowfS5saXN0LXVuc3R5bGVke3BhZGRpbmctbGVmdDowO2xpc3Qtc3R5bGU6bm9uZX0ubGlzdC1pbmxpbmV7cGFkZGluZy1sZWZ0OjA7bWFyZ2luLWxlZnQ6LTVweDtsaXN0LXN0eWxlOm5vbmV9Lmxpc3QtaW5saW5lPmxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctcmlnaHQ6NXB4O3BhZGRpbmctbGVmdDo1cHh9ZGx7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MjBweH1kZCxkdHtsaW5lLWhlaWdodDoxLjQyODU3MTQzfWR0e2ZvbnQtd2VpZ2h0OjcwMH1kZHttYXJnaW4tbGVmdDowfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuZGwtaG9yaXpvbnRhbCBkdHtmbG9hdDpsZWZ0O3dpZHRoOjE2MHB4O292ZXJmbG93OmhpZGRlbjtjbGVhcjpsZWZ0O3RleHQtYWxpZ246cmlnaHQ7dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LmRsLWhvcml6b250YWwgZGR7bWFyZ2luLWxlZnQ6MTgwcHh9fWFiYnJbZGF0YS1vcmlnaW5hbC10aXRsZV0sYWJiclt0aXRsZV17Y3Vyc29yOmhlbHA7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICM3Nzd9LmluaXRpYWxpc217Zm9udC1zaXplOjkwJTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9YmxvY2txdW90ZXtwYWRkaW5nOjEwcHggMjBweDttYXJnaW46MCAwIDIwcHg7Zm9udC1zaXplOjE3LjVweDtib3JkZXItbGVmdDo1cHggc29saWQgI2VlZX1ibG9ja3F1b3RlIG9sOmxhc3QtY2hpbGQsYmxvY2txdW90ZSBwOmxhc3QtY2hpbGQsYmxvY2txdW90ZSB1bDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH1ibG9ja3F1b3RlIC5zbWFsbCxibG9ja3F1b3RlIGZvb3RlcixibG9ja3F1b3RlIHNtYWxse2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjgwJTtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2NvbG9yOiM3Nzd9YmxvY2txdW90ZSAuc21hbGw6YmVmb3JlLGJsb2NrcXVvdGUgZm9vdGVyOmJlZm9yZSxibG9ja3F1b3RlIHNtYWxsOmJlZm9yZXtjb250ZW50OidcMjAxNCBcMDBBMCd9LmJsb2NrcXVvdGUtcmV2ZXJzZSxibG9ja3F1b3RlLnB1bGwtcmlnaHR7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDowO3RleHQtYWxpZ246cmlnaHQ7Ym9yZGVyLXJpZ2h0OjVweCBzb2xpZCAjZWVlO2JvcmRlci1sZWZ0OjB9LmJsb2NrcXVvdGUtcmV2ZXJzZSAuc21hbGw6YmVmb3JlLC5ibG9ja3F1b3RlLXJldmVyc2UgZm9vdGVyOmJlZm9yZSwuYmxvY2txdW90ZS1yZXZlcnNlIHNtYWxsOmJlZm9yZSxibG9ja3F1b3RlLnB1bGwtcmlnaHQgLnNtYWxsOmJlZm9yZSxibG9ja3F1b3RlLnB1bGwtcmlnaHQgZm9vdGVyOmJlZm9yZSxibG9ja3F1b3RlLnB1bGwtcmlnaHQgc21hbGw6YmVmb3Jle2NvbnRlbnQ6Jyd9LmJsb2NrcXVvdGUtcmV2ZXJzZSAuc21hbGw6YWZ0ZXIsLmJsb2NrcXVvdGUtcmV2ZXJzZSBmb290ZXI6YWZ0ZXIsLmJsb2NrcXVvdGUtcmV2ZXJzZSBzbWFsbDphZnRlcixibG9ja3F1b3RlLnB1bGwtcmlnaHQgLnNtYWxsOmFmdGVyLGJsb2NrcXVvdGUucHVsbC1yaWdodCBmb290ZXI6YWZ0ZXIsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxsOmFmdGVye2NvbnRlbnQ6J1wwMEEwIFwyMDE0J31hZGRyZXNze21hcmdpbi1ib3R0b206MjBweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxLjQyODU3MTQzfWNvZGUsa2JkLHByZSxzYW1we2ZvbnQtZmFtaWx5Ok1lbmxvLE1vbmFjbyxDb25zb2xhcywiQ291cmllciBOZXciLG1vbm9zcGFjZX1jb2Rle3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6OTAlO2NvbG9yOiNjNzI1NGU7YmFja2dyb3VuZC1jb2xvcjojZjlmMmY0O2JvcmRlci1yYWRpdXM6NHB4fWtiZHtwYWRkaW5nOjJweCA0cHg7Zm9udC1zaXplOjkwJTtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzMzMztib3JkZXItcmFkaXVzOjNweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMjUpO2JveC1zaGFkb3c6aW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMjUpfWtiZCBrYmR7cGFkZGluZzowO2ZvbnQtc2l6ZToxMDAlO2ZvbnQtd2VpZ2h0OjcwMDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9cHJle2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo5LjVweDttYXJnaW46MCAwIDEwcHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzMzO3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtd3JhcDpicmVhay13b3JkO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHh9cHJlIGNvZGV7cGFkZGluZzowO2ZvbnQtc2l6ZTppbmhlcml0O2NvbG9yOmluaGVyaXQ7d2hpdGUtc3BhY2U6cHJlLXdyYXA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjB9LnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGx9LmNvbnRhaW5lcntwYWRkaW5nLXJpZ2h0OjE1cHg7cGFkZGluZy1sZWZ0OjE1cHg7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0b31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmNvbnRhaW5lcnt3aWR0aDo3NTBweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5jb250YWluZXJ7d2lkdGg6OTcwcHh9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LmNvbnRhaW5lcnt3aWR0aDoxMTcwcHh9fS5jb250YWluZXItZmx1aWR7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDoxNXB4O21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG99LnJvd3ttYXJnaW4tcmlnaHQ6LTE1cHg7bWFyZ2luLWxlZnQ6LTE1cHh9LmNvbC1sZy0xLC5jb2wtbGctMTAsLmNvbC1sZy0xMSwuY29sLWxnLTEyLC5jb2wtbGctMiwuY29sLWxnLTMsLmNvbC1sZy00LC5jb2wtbGctNSwuY29sLWxnLTYsLmNvbC1sZy03LC5jb2wtbGctOCwuY29sLWxnLTksLmNvbC1tZC0xLC5jb2wtbWQtMTAsLmNvbC1tZC0xMSwuY29sLW1kLTEyLC5jb2wtbWQtMiwuY29sLW1kLTMsLmNvbC1tZC00LC5jb2wtbWQtNSwuY29sLW1kLTYsLmNvbC1tZC03LC5jb2wtbWQtOCwuY29sLW1kLTksLmNvbC1zbS0xLC5jb2wtc20tMTAsLmNvbC1zbS0xMSwuY29sLXNtLTEyLC5jb2wtc20tMiwuY29sLXNtLTMsLmNvbC1zbS00LC5jb2wtc20tNSwuY29sLXNtLTYsLmNvbC1zbS03LC5jb2wtc20tOCwuY29sLXNtLTksLmNvbC14cy0xLC5jb2wteHMtMTAsLmNvbC14cy0xMSwuY29sLXhzLTEyLC5jb2wteHMtMiwuY29sLXhzLTMsLmNvbC14cy00LC5jb2wteHMtNSwuY29sLXhzLTYsLmNvbC14cy03LC5jb2wteHMtOCwuY29sLXhzLTl7cG9zaXRpb246cmVsYXRpdmU7bWluLWhlaWdodDoxcHg7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDoxNXB4fS5jb2wteHMtMSwuY29sLXhzLTEwLC5jb2wteHMtMTEsLmNvbC14cy0xMiwuY29sLXhzLTIsLmNvbC14cy0zLC5jb2wteHMtNCwuY29sLXhzLTUsLmNvbC14cy02LC5jb2wteHMtNywuY29sLXhzLTgsLmNvbC14cy05e2Zsb2F0OmxlZnR9LmNvbC14cy0xMnt3aWR0aDoxMDAlfS5jb2wteHMtMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wteHMtMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wteHMtOXt3aWR0aDo3NSV9LmNvbC14cy04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLXhzLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wteHMtNnt3aWR0aDo1MCV9LmNvbC14cy01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLXhzLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wteHMtM3t3aWR0aDoyNSV9LmNvbC14cy0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLXhzLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC14cy1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLXhzLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wteHMtcHVsbC05e3JpZ2h0Ojc1JX0uY29sLXhzLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC14cy1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wteHMtcHVsbC02e3JpZ2h0OjUwJX0uY29sLXhzLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC14cy1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wteHMtcHVsbC0ze3JpZ2h0OjI1JX0uY29sLXhzLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC14cy1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC14cy1wdWxsLTB7cmlnaHQ6YXV0b30uY29sLXhzLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wteHMtcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLXhzLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC14cy1wdXNoLTl7bGVmdDo3NSV9LmNvbC14cy1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC14cy1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC14cy1wdXNoLTZ7bGVmdDo1MCV9LmNvbC14cy1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC14cy1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC14cy1wdXNoLTN7bGVmdDoyNSV9LmNvbC14cy1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC14cy1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLXhzLXB1c2gtMHtsZWZ0OmF1dG99LmNvbC14cy1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLXhzLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC14cy1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wteHMtb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wteHMtb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wteHMtb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wteHMtb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wteHMtb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wteHMtb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wteHMtb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wteHMtb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wteHMtb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC14cy1vZmZzZXQtMHttYXJnaW4tbGVmdDowfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuY29sLXNtLTEsLmNvbC1zbS0xMCwuY29sLXNtLTExLC5jb2wtc20tMTIsLmNvbC1zbS0yLC5jb2wtc20tMywuY29sLXNtLTQsLmNvbC1zbS01LC5jb2wtc20tNiwuY29sLXNtLTcsLmNvbC1zbS04LC5jb2wtc20tOXtmbG9hdDpsZWZ0fS5jb2wtc20tMTJ7d2lkdGg6MTAwJX0uY29sLXNtLTExe3dpZHRoOjkxLjY2NjY2NjY3JX0uY29sLXNtLTEwe3dpZHRoOjgzLjMzMzMzMzMzJX0uY29sLXNtLTl7d2lkdGg6NzUlfS5jb2wtc20tOHt3aWR0aDo2Ni42NjY2NjY2NyV9LmNvbC1zbS03e3dpZHRoOjU4LjMzMzMzMzMzJX0uY29sLXNtLTZ7d2lkdGg6NTAlfS5jb2wtc20tNXt3aWR0aDo0MS42NjY2NjY2NyV9LmNvbC1zbS00e3dpZHRoOjMzLjMzMzMzMzMzJX0uY29sLXNtLTN7d2lkdGg6MjUlfS5jb2wtc20tMnt3aWR0aDoxNi42NjY2NjY2NyV9LmNvbC1zbS0xe3dpZHRoOjguMzMzMzMzMzMlfS5jb2wtc20tcHVsbC0xMntyaWdodDoxMDAlfS5jb2wtc20tcHVsbC0xMXtyaWdodDo5MS42NjY2NjY2NyV9LmNvbC1zbS1wdWxsLTEwe3JpZ2h0OjgzLjMzMzMzMzMzJX0uY29sLXNtLXB1bGwtOXtyaWdodDo3NSV9LmNvbC1zbS1wdWxsLTh7cmlnaHQ6NjYuNjY2NjY2NjclfS5jb2wtc20tcHVsbC03e3JpZ2h0OjU4LjMzMzMzMzMzJX0uY29sLXNtLXB1bGwtNntyaWdodDo1MCV9LmNvbC1zbS1wdWxsLTV7cmlnaHQ6NDEuNjY2NjY2NjclfS5jb2wtc20tcHVsbC00e3JpZ2h0OjMzLjMzMzMzMzMzJX0uY29sLXNtLXB1bGwtM3tyaWdodDoyNSV9LmNvbC1zbS1wdWxsLTJ7cmlnaHQ6MTYuNjY2NjY2NjclfS5jb2wtc20tcHVsbC0xe3JpZ2h0OjguMzMzMzMzMzMlfS5jb2wtc20tcHVsbC0we3JpZ2h0OmF1dG99LmNvbC1zbS1wdXNoLTEye2xlZnQ6MTAwJX0uY29sLXNtLXB1c2gtMTF7bGVmdDo5MS42NjY2NjY2NyV9LmNvbC1zbS1wdXNoLTEwe2xlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtc20tcHVzaC05e2xlZnQ6NzUlfS5jb2wtc20tcHVzaC04e2xlZnQ6NjYuNjY2NjY2NjclfS5jb2wtc20tcHVzaC03e2xlZnQ6NTguMzMzMzMzMzMlfS5jb2wtc20tcHVzaC02e2xlZnQ6NTAlfS5jb2wtc20tcHVzaC01e2xlZnQ6NDEuNjY2NjY2NjclfS5jb2wtc20tcHVzaC00e2xlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtc20tcHVzaC0ze2xlZnQ6MjUlfS5jb2wtc20tcHVzaC0ye2xlZnQ6MTYuNjY2NjY2NjclfS5jb2wtc20tcHVzaC0xe2xlZnQ6OC4zMzMzMzMzMyV9LmNvbC1zbS1wdXNoLTB7bGVmdDphdXRvfS5jb2wtc20tb2Zmc2V0LTEye21hcmdpbi1sZWZ0OjEwMCV9LmNvbC1zbS1vZmZzZXQtMTF7bWFyZ2luLWxlZnQ6OTEuNjY2NjY2NjclfS5jb2wtc20tb2Zmc2V0LTEwe21hcmdpbi1sZWZ0OjgzLjMzMzMzMzMzJX0uY29sLXNtLW9mZnNldC05e21hcmdpbi1sZWZ0Ojc1JX0uY29sLXNtLW9mZnNldC04e21hcmdpbi1sZWZ0OjY2LjY2NjY2NjY3JX0uY29sLXNtLW9mZnNldC03e21hcmdpbi1sZWZ0OjU4LjMzMzMzMzMzJX0uY29sLXNtLW9mZnNldC02e21hcmdpbi1sZWZ0OjUwJX0uY29sLXNtLW9mZnNldC01e21hcmdpbi1sZWZ0OjQxLjY2NjY2NjY3JX0uY29sLXNtLW9mZnNldC00e21hcmdpbi1sZWZ0OjMzLjMzMzMzMzMzJX0uY29sLXNtLW9mZnNldC0ze21hcmdpbi1sZWZ0OjI1JX0uY29sLXNtLW9mZnNldC0ye21hcmdpbi1sZWZ0OjE2LjY2NjY2NjY3JX0uY29sLXNtLW9mZnNldC0xe21hcmdpbi1sZWZ0OjguMzMzMzMzMzMlfS5jb2wtc20tb2Zmc2V0LTB7bWFyZ2luLWxlZnQ6MH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5jb2wtbWQtMSwuY29sLW1kLTEwLC5jb2wtbWQtMTEsLmNvbC1tZC0xMiwuY29sLW1kLTIsLmNvbC1tZC0zLC5jb2wtbWQtNCwuY29sLW1kLTUsLmNvbC1tZC02LC5jb2wtbWQtNywuY29sLW1kLTgsLmNvbC1tZC05e2Zsb2F0OmxlZnR9LmNvbC1tZC0xMnt3aWR0aDoxMDAlfS5jb2wtbWQtMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wtbWQtMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wtbWQtOXt3aWR0aDo3NSV9LmNvbC1tZC04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLW1kLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wtbWQtNnt3aWR0aDo1MCV9LmNvbC1tZC01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLW1kLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wtbWQtM3t3aWR0aDoyNSV9LmNvbC1tZC0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLW1kLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC1tZC1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLW1kLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wtbWQtcHVsbC05e3JpZ2h0Ojc1JX0uY29sLW1kLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC1tZC1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wtbWQtcHVsbC02e3JpZ2h0OjUwJX0uY29sLW1kLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC1tZC1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wtbWQtcHVsbC0ze3JpZ2h0OjI1JX0uY29sLW1kLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC1tZC1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC1tZC1wdWxsLTB7cmlnaHQ6YXV0b30uY29sLW1kLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wtbWQtcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLW1kLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC1tZC1wdXNoLTl7bGVmdDo3NSV9LmNvbC1tZC1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1tZC1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1tZC1wdXNoLTZ7bGVmdDo1MCV9LmNvbC1tZC1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC1tZC1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC1tZC1wdXNoLTN7bGVmdDoyNSV9LmNvbC1tZC1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC1tZC1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLW1kLXB1c2gtMHtsZWZ0OmF1dG99LmNvbC1tZC1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLW1kLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC1tZC1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtbWQtb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wtbWQtb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wtbWQtb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wtbWQtb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wtbWQtb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wtbWQtb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtbWQtb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wtbWQtb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wtbWQtb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC1tZC1vZmZzZXQtMHttYXJnaW4tbGVmdDowfX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey5jb2wtbGctMSwuY29sLWxnLTEwLC5jb2wtbGctMTEsLmNvbC1sZy0xMiwuY29sLWxnLTIsLmNvbC1sZy0zLC5jb2wtbGctNCwuY29sLWxnLTUsLmNvbC1sZy02LC5jb2wtbGctNywuY29sLWxnLTgsLmNvbC1sZy05e2Zsb2F0OmxlZnR9LmNvbC1sZy0xMnt3aWR0aDoxMDAlfS5jb2wtbGctMTF7d2lkdGg6OTEuNjY2NjY2NjclfS5jb2wtbGctMTB7d2lkdGg6ODMuMzMzMzMzMzMlfS5jb2wtbGctOXt3aWR0aDo3NSV9LmNvbC1sZy04e3dpZHRoOjY2LjY2NjY2NjY3JX0uY29sLWxnLTd7d2lkdGg6NTguMzMzMzMzMzMlfS5jb2wtbGctNnt3aWR0aDo1MCV9LmNvbC1sZy01e3dpZHRoOjQxLjY2NjY2NjY3JX0uY29sLWxnLTR7d2lkdGg6MzMuMzMzMzMzMzMlfS5jb2wtbGctM3t3aWR0aDoyNSV9LmNvbC1sZy0ye3dpZHRoOjE2LjY2NjY2NjY3JX0uY29sLWxnLTF7d2lkdGg6OC4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTEye3JpZ2h0OjEwMCV9LmNvbC1sZy1wdWxsLTExe3JpZ2h0OjkxLjY2NjY2NjY3JX0uY29sLWxnLXB1bGwtMTB7cmlnaHQ6ODMuMzMzMzMzMzMlfS5jb2wtbGctcHVsbC05e3JpZ2h0Ojc1JX0uY29sLWxnLXB1bGwtOHtyaWdodDo2Ni42NjY2NjY2NyV9LmNvbC1sZy1wdWxsLTd7cmlnaHQ6NTguMzMzMzMzMzMlfS5jb2wtbGctcHVsbC02e3JpZ2h0OjUwJX0uY29sLWxnLXB1bGwtNXtyaWdodDo0MS42NjY2NjY2NyV9LmNvbC1sZy1wdWxsLTR7cmlnaHQ6MzMuMzMzMzMzMzMlfS5jb2wtbGctcHVsbC0ze3JpZ2h0OjI1JX0uY29sLWxnLXB1bGwtMntyaWdodDoxNi42NjY2NjY2NyV9LmNvbC1sZy1wdWxsLTF7cmlnaHQ6OC4zMzMzMzMzMyV9LmNvbC1sZy1wdWxsLTB7cmlnaHQ6YXV0b30uY29sLWxnLXB1c2gtMTJ7bGVmdDoxMDAlfS5jb2wtbGctcHVzaC0xMXtsZWZ0OjkxLjY2NjY2NjY3JX0uY29sLWxnLXB1c2gtMTB7bGVmdDo4My4zMzMzMzMzMyV9LmNvbC1sZy1wdXNoLTl7bGVmdDo3NSV9LmNvbC1sZy1wdXNoLTh7bGVmdDo2Ni42NjY2NjY2NyV9LmNvbC1sZy1wdXNoLTd7bGVmdDo1OC4zMzMzMzMzMyV9LmNvbC1sZy1wdXNoLTZ7bGVmdDo1MCV9LmNvbC1sZy1wdXNoLTV7bGVmdDo0MS42NjY2NjY2NyV9LmNvbC1sZy1wdXNoLTR7bGVmdDozMy4zMzMzMzMzMyV9LmNvbC1sZy1wdXNoLTN7bGVmdDoyNSV9LmNvbC1sZy1wdXNoLTJ7bGVmdDoxNi42NjY2NjY2NyV9LmNvbC1sZy1wdXNoLTF7bGVmdDo4LjMzMzMzMzMzJX0uY29sLWxnLXB1c2gtMHtsZWZ0OmF1dG99LmNvbC1sZy1vZmZzZXQtMTJ7bWFyZ2luLWxlZnQ6MTAwJX0uY29sLWxnLW9mZnNldC0xMXttYXJnaW4tbGVmdDo5MS42NjY2NjY2NyV9LmNvbC1sZy1vZmZzZXQtMTB7bWFyZ2luLWxlZnQ6ODMuMzMzMzMzMzMlfS5jb2wtbGctb2Zmc2V0LTl7bWFyZ2luLWxlZnQ6NzUlfS5jb2wtbGctb2Zmc2V0LTh7bWFyZ2luLWxlZnQ6NjYuNjY2NjY2NjclfS5jb2wtbGctb2Zmc2V0LTd7bWFyZ2luLWxlZnQ6NTguMzMzMzMzMzMlfS5jb2wtbGctb2Zmc2V0LTZ7bWFyZ2luLWxlZnQ6NTAlfS5jb2wtbGctb2Zmc2V0LTV7bWFyZ2luLWxlZnQ6NDEuNjY2NjY2NjclfS5jb2wtbGctb2Zmc2V0LTR7bWFyZ2luLWxlZnQ6MzMuMzMzMzMzMzMlfS5jb2wtbGctb2Zmc2V0LTN7bWFyZ2luLWxlZnQ6MjUlfS5jb2wtbGctb2Zmc2V0LTJ7bWFyZ2luLWxlZnQ6MTYuNjY2NjY2NjclfS5jb2wtbGctb2Zmc2V0LTF7bWFyZ2luLWxlZnQ6OC4zMzMzMzMzMyV9LmNvbC1sZy1vZmZzZXQtMHttYXJnaW4tbGVmdDowfX10YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fWNhcHRpb257cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweDtjb2xvcjojNzc3O3RleHQtYWxpZ246bGVmdH10aHt0ZXh0LWFsaWduOmxlZnR9LnRhYmxle3dpZHRoOjEwMCU7bWF4LXdpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToyMHB4fS50YWJsZT50Ym9keT50cj50ZCwudGFibGU+dGJvZHk+dHI+dGgsLnRhYmxlPnRmb290PnRyPnRkLC50YWJsZT50Zm9vdD50cj50aCwudGFibGU+dGhlYWQ+dHI+dGQsLnRhYmxlPnRoZWFkPnRyPnRoe3BhZGRpbmc6OHB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGR9LnRhYmxlPnRoZWFkPnRyPnRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTtib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZGRkfS50YWJsZT5jYXB0aW9uK3RoZWFkPnRyOmZpcnN0LWNoaWxkPnRkLC50YWJsZT5jYXB0aW9uK3RoZWFkPnRyOmZpcnN0LWNoaWxkPnRoLC50YWJsZT5jb2xncm91cCt0aGVhZD50cjpmaXJzdC1jaGlsZD50ZCwudGFibGU+Y29sZ3JvdXArdGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGgsLnRhYmxlPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkPnRkLC50YWJsZT50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZD50aHtib3JkZXItdG9wOjB9LnRhYmxlPnRib2R5K3Rib2R5e2JvcmRlci10b3A6MnB4IHNvbGlkICNkZGR9LnRhYmxlIC50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnRhYmxlLWNvbmRlbnNlZD50Ym9keT50cj50ZCwudGFibGUtY29uZGVuc2VkPnRib2R5PnRyPnRoLC50YWJsZS1jb25kZW5zZWQ+dGZvb3Q+dHI+dGQsLnRhYmxlLWNvbmRlbnNlZD50Zm9vdD50cj50aCwudGFibGUtY29uZGVuc2VkPnRoZWFkPnRyPnRkLC50YWJsZS1jb25kZW5zZWQ+dGhlYWQ+dHI+dGh7cGFkZGluZzo1cHh9LnRhYmxlLWJvcmRlcmVke2JvcmRlcjoxcHggc29saWQgI2RkZH0udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQsLnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoLC50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZCwudGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGgsLnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkLC50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aHtib3JkZXI6MXB4IHNvbGlkICNkZGR9LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkLC50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aHtib3JkZXItYm90dG9tLXdpZHRoOjJweH0udGFibGUtc3RyaXBlZD50Ym9keT50cjpudGgtb2YtdHlwZShvZGQpe2JhY2tncm91bmQtY29sb3I6I2Y5ZjlmOX0udGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fXRhYmxlIGNvbFtjbGFzcyo9Y29sLV17cG9zaXRpb246c3RhdGljO2Rpc3BsYXk6dGFibGUtY29sdW1uO2Zsb2F0Om5vbmV9dGFibGUgdGRbY2xhc3MqPWNvbC1dLHRhYmxlIHRoW2NsYXNzKj1jb2wtXXtwb3NpdGlvbjpzdGF0aWM7ZGlzcGxheTp0YWJsZS1jZWxsO2Zsb2F0Om5vbmV9LnRhYmxlPnRib2R5PnRyLmFjdGl2ZT50ZCwudGFibGU+dGJvZHk+dHIuYWN0aXZlPnRoLC50YWJsZT50Ym9keT50cj50ZC5hY3RpdmUsLnRhYmxlPnRib2R5PnRyPnRoLmFjdGl2ZSwudGFibGU+dGZvb3Q+dHIuYWN0aXZlPnRkLC50YWJsZT50Zm9vdD50ci5hY3RpdmU+dGgsLnRhYmxlPnRmb290PnRyPnRkLmFjdGl2ZSwudGFibGU+dGZvb3Q+dHI+dGguYWN0aXZlLC50YWJsZT50aGVhZD50ci5hY3RpdmU+dGQsLnRhYmxlPnRoZWFkPnRyLmFjdGl2ZT50aCwudGFibGU+dGhlYWQ+dHI+dGQuYWN0aXZlLC50YWJsZT50aGVhZD50cj50aC5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fS50YWJsZS1ob3Zlcj50Ym9keT50ci5hY3RpdmU6aG92ZXI+dGQsLnRhYmxlLWhvdmVyPnRib2R5PnRyLmFjdGl2ZTpob3Zlcj50aCwudGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXI+LmFjdGl2ZSwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGQuYWN0aXZlOmhvdmVyLC50YWJsZS1ob3Zlcj50Ym9keT50cj50aC5hY3RpdmU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4fS50YWJsZT50Ym9keT50ci5zdWNjZXNzPnRkLC50YWJsZT50Ym9keT50ci5zdWNjZXNzPnRoLC50YWJsZT50Ym9keT50cj50ZC5zdWNjZXNzLC50YWJsZT50Ym9keT50cj50aC5zdWNjZXNzLC50YWJsZT50Zm9vdD50ci5zdWNjZXNzPnRkLC50YWJsZT50Zm9vdD50ci5zdWNjZXNzPnRoLC50YWJsZT50Zm9vdD50cj50ZC5zdWNjZXNzLC50YWJsZT50Zm9vdD50cj50aC5zdWNjZXNzLC50YWJsZT50aGVhZD50ci5zdWNjZXNzPnRkLC50YWJsZT50aGVhZD50ci5zdWNjZXNzPnRoLC50YWJsZT50aGVhZD50cj50ZC5zdWNjZXNzLC50YWJsZT50aGVhZD50cj50aC5zdWNjZXNze2JhY2tncm91bmQtY29sb3I6I2RmZjBkOH0udGFibGUtaG92ZXI+dGJvZHk+dHIuc3VjY2Vzczpob3Zlcj50ZCwudGFibGUtaG92ZXI+dGJvZHk+dHIuc3VjY2Vzczpob3Zlcj50aCwudGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXI+LnN1Y2Nlc3MsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRkLnN1Y2Nlc3M6aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRoLnN1Y2Nlc3M6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDBlOWM2fS50YWJsZT50Ym9keT50ci5pbmZvPnRkLC50YWJsZT50Ym9keT50ci5pbmZvPnRoLC50YWJsZT50Ym9keT50cj50ZC5pbmZvLC50YWJsZT50Ym9keT50cj50aC5pbmZvLC50YWJsZT50Zm9vdD50ci5pbmZvPnRkLC50YWJsZT50Zm9vdD50ci5pbmZvPnRoLC50YWJsZT50Zm9vdD50cj50ZC5pbmZvLC50YWJsZT50Zm9vdD50cj50aC5pbmZvLC50YWJsZT50aGVhZD50ci5pbmZvPnRkLC50YWJsZT50aGVhZD50ci5pbmZvPnRoLC50YWJsZT50aGVhZD50cj50ZC5pbmZvLC50YWJsZT50aGVhZD50cj50aC5pbmZve2JhY2tncm91bmQtY29sb3I6I2Q5ZWRmN30udGFibGUtaG92ZXI+dGJvZHk+dHIuaW5mbzpob3Zlcj50ZCwudGFibGUtaG92ZXI+dGJvZHk+dHIuaW5mbzpob3Zlcj50aCwudGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXI+LmluZm8sLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRkLmluZm86aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRoLmluZm86aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzRlM2YzfS50YWJsZT50Ym9keT50ci53YXJuaW5nPnRkLC50YWJsZT50Ym9keT50ci53YXJuaW5nPnRoLC50YWJsZT50Ym9keT50cj50ZC53YXJuaW5nLC50YWJsZT50Ym9keT50cj50aC53YXJuaW5nLC50YWJsZT50Zm9vdD50ci53YXJuaW5nPnRkLC50YWJsZT50Zm9vdD50ci53YXJuaW5nPnRoLC50YWJsZT50Zm9vdD50cj50ZC53YXJuaW5nLC50YWJsZT50Zm9vdD50cj50aC53YXJuaW5nLC50YWJsZT50aGVhZD50ci53YXJuaW5nPnRkLC50YWJsZT50aGVhZD50ci53YXJuaW5nPnRoLC50YWJsZT50aGVhZD50cj50ZC53YXJuaW5nLC50YWJsZT50aGVhZD50cj50aC53YXJuaW5ne2JhY2tncm91bmQtY29sb3I6I2ZjZjhlM30udGFibGUtaG92ZXI+dGJvZHk+dHIud2FybmluZzpob3Zlcj50ZCwudGFibGUtaG92ZXI+dGJvZHk+dHIud2FybmluZzpob3Zlcj50aCwudGFibGUtaG92ZXI+dGJvZHk+dHI6aG92ZXI+Lndhcm5pbmcsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRkLndhcm5pbmc6aG92ZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRoLndhcm5pbmc6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFmMmNjfS50YWJsZT50Ym9keT50ci5kYW5nZXI+dGQsLnRhYmxlPnRib2R5PnRyLmRhbmdlcj50aCwudGFibGU+dGJvZHk+dHI+dGQuZGFuZ2VyLC50YWJsZT50Ym9keT50cj50aC5kYW5nZXIsLnRhYmxlPnRmb290PnRyLmRhbmdlcj50ZCwudGFibGU+dGZvb3Q+dHIuZGFuZ2VyPnRoLC50YWJsZT50Zm9vdD50cj50ZC5kYW5nZXIsLnRhYmxlPnRmb290PnRyPnRoLmRhbmdlciwudGFibGU+dGhlYWQ+dHIuZGFuZ2VyPnRkLC50YWJsZT50aGVhZD50ci5kYW5nZXI+dGgsLnRhYmxlPnRoZWFkPnRyPnRkLmRhbmdlciwudGFibGU+dGhlYWQ+dHI+dGguZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2YyZGVkZX0udGFibGUtaG92ZXI+dGJvZHk+dHIuZGFuZ2VyOmhvdmVyPnRkLC50YWJsZS1ob3Zlcj50Ym9keT50ci5kYW5nZXI6aG92ZXI+dGgsLnRhYmxlLWhvdmVyPnRib2R5PnRyOmhvdmVyPi5kYW5nZXIsLnRhYmxlLWhvdmVyPnRib2R5PnRyPnRkLmRhbmdlcjpob3ZlciwudGFibGUtaG92ZXI+dGJvZHk+dHI+dGguZGFuZ2VyOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ViY2NjY30udGFibGUtcmVzcG9uc2l2ZXttaW4taGVpZ2h0Oi4wMSU7b3ZlcmZsb3cteDphdXRvfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey50YWJsZS1yZXNwb25zaXZle3dpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToxNXB4O292ZXJmbG93LXk6aGlkZGVuOy1tcy1vdmVyZmxvdy1zdHlsZTotbXMtYXV0b2hpZGluZy1zY3JvbGxiYXI7Ym9yZGVyOjFweCBzb2xpZCAjZGRkfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZXttYXJnaW4tYm90dG9tOjB9LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlPnRib2R5PnRyPnRkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZT50Ym9keT50cj50aCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGU+dGZvb3Q+dHI+dGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlPnRmb290PnRyPnRoLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZT50aGVhZD50cj50ZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGU+dGhlYWQ+dHI+dGh7d2hpdGUtc3BhY2U6bm93cmFwfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZHtib3JkZXI6MH0udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6Zmlyc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoOmZpcnN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpmaXJzdC1jaGlsZCwudGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6Zmlyc3QtY2hpbGQsLnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkOmZpcnN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDowfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50ZDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cj50aDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50aDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50ZDpsYXN0LWNoaWxkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDowfS50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRoLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRkLC50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRoe2JvcmRlci1ib3R0b206MH19ZmllbGRzZXR7bWluLXdpZHRoOjA7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowfWxlZ2VuZHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZzowO21hcmdpbi1ib3R0b206MjBweDtmb250LXNpemU6MjFweDtsaW5lLWhlaWdodDppbmhlcml0O2NvbG9yOiMzMzM7Ym9yZGVyOjA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U1ZTVlNX1sYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazttYXgtd2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjVweDtmb250LXdlaWdodDo3MDB9aW5wdXRbdHlwZT1zZWFyY2hdey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH1pbnB1dFt0eXBlPWNoZWNrYm94XSxpbnB1dFt0eXBlPXJhZGlvXXttYXJnaW46NHB4IDAgMDttYXJnaW4tdG9wOjFweFw5O2xpbmUtaGVpZ2h0Om5vcm1hbH1pbnB1dFt0eXBlPWZpbGVde2Rpc3BsYXk6YmxvY2t9aW5wdXRbdHlwZT1yYW5nZV17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfXNlbGVjdFttdWx0aXBsZV0sc2VsZWN0W3NpemVde2hlaWdodDphdXRvfWlucHV0W3R5cGU9ZmlsZV06Zm9jdXMsaW5wdXRbdHlwZT1jaGVja2JveF06Zm9jdXMsaW5wdXRbdHlwZT1yYWRpb106Zm9jdXN7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweH1vdXRwdXR7ZGlzcGxheTpibG9jaztwYWRkaW5nLXRvcDo3cHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojNTU1fS5mb3JtLWNvbnRyb2x7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDozNHB4O3BhZGRpbmc6NnB4IDEycHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOy13ZWJraXQtdHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cywtd2Via2l0LWJveC1zaGFkb3cgZWFzZS1pbi1vdXQgLjE1czstby10cmFuc2l0aW9uOmJvcmRlci1jb2xvciBlYXNlLWluLW91dCAuMTVzLGJveC1zaGFkb3cgZWFzZS1pbi1vdXQgLjE1czt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciBlYXNlLWluLW91dCAuMTVzLGJveC1zaGFkb3cgZWFzZS1pbi1vdXQgLjE1c30uZm9ybS1jb250cm9sOmZvY3Vze2JvcmRlci1jb2xvcjojNjZhZmU5O291dGxpbmU6MDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNil9LmZvcm0tY29udHJvbDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojOTk5O29wYWNpdHk6MX0uZm9ybS1jb250cm9sOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojOTk5fS5mb3JtLWNvbnRyb2w6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6Izk5OX0uZm9ybS1jb250cm9sOjotbXMtZXhwYW5ke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjB9LmZvcm0tY29udHJvbFtkaXNhYmxlZF0sLmZvcm0tY29udHJvbFtyZWFkb25seV0sZmllbGRzZXRbZGlzYWJsZWRdIC5mb3JtLWNvbnRyb2x7YmFja2dyb3VuZC1jb2xvcjojZWVlO29wYWNpdHk6MX0uZm9ybS1jb250cm9sW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmZvcm0tY29udHJvbHtjdXJzb3I6bm90LWFsbG93ZWR9dGV4dGFyZWEuZm9ybS1jb250cm9se2hlaWdodDphdXRvfWlucHV0W3R5cGU9c2VhcmNoXXstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1AbWVkaWEgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjApe2lucHV0W3R5cGU9ZGF0ZV0uZm9ybS1jb250cm9sLGlucHV0W3R5cGU9dGltZV0uZm9ybS1jb250cm9sLGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLmZvcm0tY29udHJvbCxpbnB1dFt0eXBlPW1vbnRoXS5mb3JtLWNvbnRyb2x7bGluZS1oZWlnaHQ6MzRweH0uaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT1kYXRlXSwuaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT10aW1lXSwuaW5wdXQtZ3JvdXAtc20gaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLmlucHV0LWdyb3VwLXNtIGlucHV0W3R5cGU9bW9udGhdLGlucHV0W3R5cGU9ZGF0ZV0uaW5wdXQtc20saW5wdXRbdHlwZT10aW1lXS5pbnB1dC1zbSxpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXS5pbnB1dC1zbSxpbnB1dFt0eXBlPW1vbnRoXS5pbnB1dC1zbXtsaW5lLWhlaWdodDozMHB4fS5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPWRhdGVdLC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPXRpbWVdLC5pbnB1dC1ncm91cC1sZyBpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwuaW5wdXQtZ3JvdXAtbGcgaW5wdXRbdHlwZT1tb250aF0saW5wdXRbdHlwZT1kYXRlXS5pbnB1dC1sZyxpbnB1dFt0eXBlPXRpbWVdLmlucHV0LWxnLGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLmlucHV0LWxnLGlucHV0W3R5cGU9bW9udGhdLmlucHV0LWxne2xpbmUtaGVpZ2h0OjQ2cHh9fS5mb3JtLWdyb3Vwe21hcmdpbi1ib3R0b206MTVweH0uY2hlY2tib3gsLnJhZGlve3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0uY2hlY2tib3ggbGFiZWwsLnJhZGlvIGxhYmVse21pbi1oZWlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDttYXJnaW4tYm90dG9tOjA7Zm9udC13ZWlnaHQ6NDAwO2N1cnNvcjpwb2ludGVyfS5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XSwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdLC5yYWRpbyBpbnB1dFt0eXBlPXJhZGlvXSwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9de3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbi10b3A6NHB4XDk7bWFyZ2luLWxlZnQ6LTIwcHh9LmNoZWNrYm94Ky5jaGVja2JveCwucmFkaW8rLnJhZGlve21hcmdpbi10b3A6LTVweH0uY2hlY2tib3gtaW5saW5lLC5yYWRpby1pbmxpbmV7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1sZWZ0OjIwcHg7bWFyZ2luLWJvdHRvbTowO2ZvbnQtd2VpZ2h0OjQwMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y3Vyc29yOnBvaW50ZXJ9LmNoZWNrYm94LWlubGluZSsuY2hlY2tib3gtaW5saW5lLC5yYWRpby1pbmxpbmUrLnJhZGlvLWlubGluZXttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MTBweH1maWVsZHNldFtkaXNhYmxlZF0gaW5wdXRbdHlwZT1jaGVja2JveF0sZmllbGRzZXRbZGlzYWJsZWRdIGlucHV0W3R5cGU9cmFkaW9dLGlucHV0W3R5cGU9Y2hlY2tib3hdLmRpc2FibGVkLGlucHV0W3R5cGU9Y2hlY2tib3hdW2Rpc2FibGVkXSxpbnB1dFt0eXBlPXJhZGlvXS5kaXNhYmxlZCxpbnB1dFt0eXBlPXJhZGlvXVtkaXNhYmxlZF17Y3Vyc29yOm5vdC1hbGxvd2VkfS5jaGVja2JveC1pbmxpbmUuZGlzYWJsZWQsLnJhZGlvLWlubGluZS5kaXNhYmxlZCxmaWVsZHNldFtkaXNhYmxlZF0gLmNoZWNrYm94LWlubGluZSxmaWVsZHNldFtkaXNhYmxlZF0gLnJhZGlvLWlubGluZXtjdXJzb3I6bm90LWFsbG93ZWR9LmNoZWNrYm94LmRpc2FibGVkIGxhYmVsLC5yYWRpby5kaXNhYmxlZCBsYWJlbCxmaWVsZHNldFtkaXNhYmxlZF0gLmNoZWNrYm94IGxhYmVsLGZpZWxkc2V0W2Rpc2FibGVkXSAucmFkaW8gbGFiZWx7Y3Vyc29yOm5vdC1hbGxvd2VkfS5mb3JtLWNvbnRyb2wtc3RhdGlje21pbi1oZWlnaHQ6MzRweDtwYWRkaW5nLXRvcDo3cHg7cGFkZGluZy1ib3R0b206N3B4O21hcmdpbi1ib3R0b206MH0uZm9ybS1jb250cm9sLXN0YXRpYy5pbnB1dC1sZywuZm9ybS1jb250cm9sLXN0YXRpYy5pbnB1dC1zbXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjB9LmlucHV0LXNte2hlaWdodDozMHB4O3BhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS41O2JvcmRlci1yYWRpdXM6M3B4fXNlbGVjdC5pbnB1dC1zbXtoZWlnaHQ6MzBweDtsaW5lLWhlaWdodDozMHB4fXNlbGVjdFttdWx0aXBsZV0uaW5wdXQtc20sdGV4dGFyZWEuaW5wdXQtc217aGVpZ2h0OmF1dG99LmZvcm0tZ3JvdXAtc20gLmZvcm0tY29udHJvbHtoZWlnaHQ6MzBweDtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH0uZm9ybS1ncm91cC1zbSBzZWxlY3QuZm9ybS1jb250cm9se2hlaWdodDozMHB4O2xpbmUtaGVpZ2h0OjMwcHh9LmZvcm0tZ3JvdXAtc20gc2VsZWN0W211bHRpcGxlXS5mb3JtLWNvbnRyb2wsLmZvcm0tZ3JvdXAtc20gdGV4dGFyZWEuZm9ybS1jb250cm9se2hlaWdodDphdXRvfS5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wtc3RhdGlje2hlaWdodDozMHB4O21pbi1oZWlnaHQ6MzJweDtwYWRkaW5nOjZweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNX0uaW5wdXQtbGd7aGVpZ2h0OjQ2cHg7cGFkZGluZzoxMHB4IDE2cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MS4zMzMzMzMzO2JvcmRlci1yYWRpdXM6NnB4fXNlbGVjdC5pbnB1dC1sZ3toZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fXNlbGVjdFttdWx0aXBsZV0uaW5wdXQtbGcsdGV4dGFyZWEuaW5wdXQtbGd7aGVpZ2h0OmF1dG99LmZvcm0tZ3JvdXAtbGcgLmZvcm0tY29udHJvbHtoZWlnaHQ6NDZweDtwYWRkaW5nOjEwcHggMTZweDtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoxLjMzMzMzMzM7Ym9yZGVyLXJhZGl1czo2cHh9LmZvcm0tZ3JvdXAtbGcgc2VsZWN0LmZvcm0tY29udHJvbHtoZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fS5mb3JtLWdyb3VwLWxnIHNlbGVjdFttdWx0aXBsZV0uZm9ybS1jb250cm9sLC5mb3JtLWdyb3VwLWxnIHRleHRhcmVhLmZvcm0tY29udHJvbHtoZWlnaHQ6YXV0b30uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sLXN0YXRpY3toZWlnaHQ6NDZweDttaW4taGVpZ2h0OjM4cHg7cGFkZGluZzoxMXB4IDE2cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MS4zMzMzMzMzfS5oYXMtZmVlZGJhY2t7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9se3BhZGRpbmctcmlnaHQ6NDIuNXB4fS5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDt6LWluZGV4OjI7ZGlzcGxheTpibG9jazt3aWR0aDozNHB4O2hlaWdodDozNHB4O2xpbmUtaGVpZ2h0OjM0cHg7dGV4dC1hbGlnbjpjZW50ZXI7cG9pbnRlci1ldmVudHM6bm9uZX0uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sKy5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssLmlucHV0LWdyb3VwLWxnKy5mb3JtLWNvbnRyb2wtZmVlZGJhY2ssLmlucHV0LWxnKy5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7d2lkdGg6NDZweDtoZWlnaHQ6NDZweDtsaW5lLWhlaWdodDo0NnB4fS5mb3JtLWdyb3VwLXNtIC5mb3JtLWNvbnRyb2wrLmZvcm0tY29udHJvbC1mZWVkYmFjaywuaW5wdXQtZ3JvdXAtc20rLmZvcm0tY29udHJvbC1mZWVkYmFjaywuaW5wdXQtc20rLmZvcm0tY29udHJvbC1mZWVkYmFja3t3aWR0aDozMHB4O2hlaWdodDozMHB4O2xpbmUtaGVpZ2h0OjMwcHh9Lmhhcy1zdWNjZXNzIC5jaGVja2JveCwuaGFzLXN1Y2Nlc3MgLmNoZWNrYm94LWlubGluZSwuaGFzLXN1Y2Nlc3MgLmNvbnRyb2wtbGFiZWwsLmhhcy1zdWNjZXNzIC5oZWxwLWJsb2NrLC5oYXMtc3VjY2VzcyAucmFkaW8sLmhhcy1zdWNjZXNzIC5yYWRpby1pbmxpbmUsLmhhcy1zdWNjZXNzLmNoZWNrYm94IGxhYmVsLC5oYXMtc3VjY2Vzcy5jaGVja2JveC1pbmxpbmUgbGFiZWwsLmhhcy1zdWNjZXNzLnJhZGlvIGxhYmVsLC5oYXMtc3VjY2Vzcy5yYWRpby1pbmxpbmUgbGFiZWx7Y29sb3I6IzNjNzYzZH0uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbHtib3JkZXItY29sb3I6IzNjNzYzZDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KX0uaGFzLXN1Y2Nlc3MgLmZvcm0tY29udHJvbDpmb2N1c3tib3JkZXItY29sb3I6IzJiNTQyYzstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjNjdiMTY4O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDZweCAjNjdiMTY4fS5oYXMtc3VjY2VzcyAuaW5wdXQtZ3JvdXAtYWRkb257Y29sb3I6IzNjNzYzZDtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDg7Ym9yZGVyLWNvbG9yOiMzYzc2M2R9Lmhhcy1zdWNjZXNzIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7Y29sb3I6IzNjNzYzZH0uaGFzLXdhcm5pbmcgLmNoZWNrYm94LC5oYXMtd2FybmluZyAuY2hlY2tib3gtaW5saW5lLC5oYXMtd2FybmluZyAuY29udHJvbC1sYWJlbCwuaGFzLXdhcm5pbmcgLmhlbHAtYmxvY2ssLmhhcy13YXJuaW5nIC5yYWRpbywuaGFzLXdhcm5pbmcgLnJhZGlvLWlubGluZSwuaGFzLXdhcm5pbmcuY2hlY2tib3ggbGFiZWwsLmhhcy13YXJuaW5nLmNoZWNrYm94LWlubGluZSBsYWJlbCwuaGFzLXdhcm5pbmcucmFkaW8gbGFiZWwsLmhhcy13YXJuaW5nLnJhZGlvLWlubGluZSBsYWJlbHtjb2xvcjojOGE2ZDNifS5oYXMtd2FybmluZyAuZm9ybS1jb250cm9se2JvcmRlci1jb2xvcjojOGE2ZDNiOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpfS5oYXMtd2FybmluZyAuZm9ybS1jb250cm9sOmZvY3Vze2JvcmRlci1jb2xvcjojNjY1MTJjOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgNnB4ICNjMGExNmI7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgNnB4ICNjMGExNmJ9Lmhhcy13YXJuaW5nIC5pbnB1dC1ncm91cC1hZGRvbntjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlMztib3JkZXItY29sb3I6IzhhNmQzYn0uaGFzLXdhcm5pbmcgLmZvcm0tY29udHJvbC1mZWVkYmFja3tjb2xvcjojOGE2ZDNifS5oYXMtZXJyb3IgLmNoZWNrYm94LC5oYXMtZXJyb3IgLmNoZWNrYm94LWlubGluZSwuaGFzLWVycm9yIC5jb250cm9sLWxhYmVsLC5oYXMtZXJyb3IgLmhlbHAtYmxvY2ssLmhhcy1lcnJvciAucmFkaW8sLmhhcy1lcnJvciAucmFkaW8taW5saW5lLC5oYXMtZXJyb3IuY2hlY2tib3ggbGFiZWwsLmhhcy1lcnJvci5jaGVja2JveC1pbmxpbmUgbGFiZWwsLmhhcy1lcnJvci5yYWRpbyBsYWJlbCwuaGFzLWVycm9yLnJhZGlvLWlubGluZSBsYWJlbHtjb2xvcjojYTk0NDQyfS5oYXMtZXJyb3IgLmZvcm0tY29udHJvbHtib3JkZXItY29sb3I6I2E5NDQ0Mjstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KX0uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2w6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM4NDM1MzQ7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA2cHggI2NlODQ4Mztib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA2cHggI2NlODQ4M30uaGFzLWVycm9yIC5pbnB1dC1ncm91cC1hZGRvbntjb2xvcjojYTk0NDQyO2JhY2tncm91bmQtY29sb3I6I2YyZGVkZTtib3JkZXItY29sb3I6I2E5NDQ0Mn0uaGFzLWVycm9yIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7Y29sb3I6I2E5NDQ0Mn0uaGFzLWZlZWRiYWNrIGxhYmVsfi5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjI1cHh9Lmhhcy1mZWVkYmFjayBsYWJlbC5zci1vbmx5fi5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjB9LmhlbHAtYmxvY2t7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjVweDttYXJnaW4tYm90dG9tOjEwcHg7Y29sb3I6IzczNzM3M31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmZvcm0taW5saW5lIC5mb3JtLWdyb3Vwe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2x7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0bzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5mb3JtLWNvbnRyb2wtc3RhdGlje2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXB7ZGlzcGxheTppbmxpbmUtdGFibGU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5mb3JtLWlubGluZSAuaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbCwuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1hZGRvbiwuZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwIC5pbnB1dC1ncm91cC1idG57d2lkdGg6YXV0b30uZm9ybS1pbmxpbmUgLmlucHV0LWdyb3VwPi5mb3JtLWNvbnRyb2x7d2lkdGg6MTAwJX0uZm9ybS1pbmxpbmUgLmNvbnRyb2wtbGFiZWx7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZm9ybS1pbmxpbmUgLmNoZWNrYm94LC5mb3JtLWlubGluZSAucmFkaW97ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZvcm0taW5saW5lIC5jaGVja2JveCBsYWJlbCwuZm9ybS1pbmxpbmUgLnJhZGlvIGxhYmVse3BhZGRpbmctbGVmdDowfS5mb3JtLWlubGluZSAuY2hlY2tib3ggaW5wdXRbdHlwZT1jaGVja2JveF0sLmZvcm0taW5saW5lIC5yYWRpbyBpbnB1dFt0eXBlPXJhZGlvXXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tbGVmdDowfS5mb3JtLWlubGluZSAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7dG9wOjB9fS5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LC5mb3JtLWhvcml6b250YWwgLmNoZWNrYm94LWlubGluZSwuZm9ybS1ob3Jpem9udGFsIC5yYWRpbywuZm9ybS1ob3Jpem9udGFsIC5yYWRpby1pbmxpbmV7cGFkZGluZy10b3A6N3B4O21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LmZvcm0taG9yaXpvbnRhbCAuY2hlY2tib3gsLmZvcm0taG9yaXpvbnRhbCAucmFkaW97bWluLWhlaWdodDoyN3B4fS5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXB7bWFyZ2luLXJpZ2h0Oi0xNXB4O21hcmdpbi1sZWZ0Oi0xNXB4fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsuZm9ybS1ob3Jpem9udGFsIC5jb250cm9sLWxhYmVse3BhZGRpbmctdG9wOjdweDttYXJnaW4tYm90dG9tOjA7dGV4dC1hbGlnbjpyaWdodH19LmZvcm0taG9yaXpvbnRhbCAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2t7cmlnaHQ6MTVweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cC1sZyAuY29udHJvbC1sYWJlbHtwYWRkaW5nLXRvcDoxMXB4O2ZvbnQtc2l6ZToxOHB4fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cC1zbSAuY29udHJvbC1sYWJlbHtwYWRkaW5nLXRvcDo2cHg7Zm9udC1zaXplOjEycHh9fS5idG57ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzo2cHggMTJweDttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTstbXMtdG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweH0uYnRuLmFjdGl2ZS5mb2N1cywuYnRuLmFjdGl2ZTpmb2N1cywuYnRuLmZvY3VzLC5idG46YWN0aXZlLmZvY3VzLC5idG46YWN0aXZlOmZvY3VzLC5idG46Zm9jdXN7b3V0bGluZTo1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7b3V0bGluZS1vZmZzZXQ6LTJweH0uYnRuLmZvY3VzLC5idG46Zm9jdXMsLmJ0bjpob3Zlcntjb2xvcjojMzMzO3RleHQtZGVjb3JhdGlvbjpub25lfS5idG4uYWN0aXZlLC5idG46YWN0aXZle2JhY2tncm91bmQtaW1hZ2U6bm9uZTtvdXRsaW5lOjA7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLC4xMjUpO2JveC1zaGFkb3c6aW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSl9LmJ0bi5kaXNhYmxlZCwuYnRuW2Rpc2FibGVkXSxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bntjdXJzb3I6bm90LWFsbG93ZWQ7ZmlsdGVyOmFscGhhKG9wYWNpdHk9NjUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtvcGFjaXR5Oi42NX1hLmJ0bi5kaXNhYmxlZCxmaWVsZHNldFtkaXNhYmxlZF0gYS5idG57cG9pbnRlci1ldmVudHM6bm9uZX0uYnRuLWRlZmF1bHR7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNjY2N9LmJ0bi1kZWZhdWx0LmZvY3VzLC5idG4tZGVmYXVsdDpmb2N1c3tjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNjtib3JkZXItY29sb3I6IzhjOGM4Y30uYnRuLWRlZmF1bHQ6aG92ZXJ7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNlNmU2ZTY7Ym9yZGVyLWNvbG9yOiNhZGFkYWR9LmJ0bi1kZWZhdWx0LmFjdGl2ZSwuYnRuLWRlZmF1bHQ6YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHR7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNlNmU2ZTY7Ym9yZGVyLWNvbG9yOiNhZGFkYWR9LmJ0bi1kZWZhdWx0LmFjdGl2ZS5mb2N1cywuYnRuLWRlZmF1bHQuYWN0aXZlOmZvY3VzLC5idG4tZGVmYXVsdC5hY3RpdmU6aG92ZXIsLmJ0bi1kZWZhdWx0OmFjdGl2ZS5mb2N1cywuYnRuLWRlZmF1bHQ6YWN0aXZlOmZvY3VzLC5idG4tZGVmYXVsdDphY3RpdmU6aG92ZXIsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdC5mb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1kZWZhdWx0OmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHQ6aG92ZXJ7Y29sb3I6IzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNkNGQ0ZDQ7Ym9yZGVyLWNvbG9yOiM4YzhjOGN9LmJ0bi1kZWZhdWx0LmFjdGl2ZSwuYnRuLWRlZmF1bHQ6YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5idG4tZGVmYXVsdC5kaXNhYmxlZC5mb2N1cywuYnRuLWRlZmF1bHQuZGlzYWJsZWQ6Zm9jdXMsLmJ0bi1kZWZhdWx0LmRpc2FibGVkOmhvdmVyLC5idG4tZGVmYXVsdFtkaXNhYmxlZF0uZm9jdXMsLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpmb2N1cywuYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRlZmF1bHQuZm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGVmYXVsdDpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kZWZhdWx0OmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItY29sb3I6I2NjY30uYnRuLWRlZmF1bHQgLmJhZGdle2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzMzfS5idG4tcHJpbWFyeXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzMzN2FiNztib3JkZXItY29sb3I6IzJlNmRhNH0uYnRuLXByaW1hcnkuZm9jdXMsLmJ0bi1wcmltYXJ5OmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMjg2MDkwO2JvcmRlci1jb2xvcjojMTIyYjQwfS5idG4tcHJpbWFyeTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzI4NjA5MDtib3JkZXItY29sb3I6IzIwNGQ3NH0uYnRuLXByaW1hcnkuYWN0aXZlLC5idG4tcHJpbWFyeTphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tcHJpbWFyeXtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzI4NjA5MDtib3JkZXItY29sb3I6IzIwNGQ3NH0uYnRuLXByaW1hcnkuYWN0aXZlLmZvY3VzLC5idG4tcHJpbWFyeS5hY3RpdmU6Zm9jdXMsLmJ0bi1wcmltYXJ5LmFjdGl2ZTpob3ZlciwuYnRuLXByaW1hcnk6YWN0aXZlLmZvY3VzLC5idG4tcHJpbWFyeTphY3RpdmU6Zm9jdXMsLmJ0bi1wcmltYXJ5OmFjdGl2ZTpob3Zlciwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1wcmltYXJ5LmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXByaW1hcnk6Zm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tcHJpbWFyeTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzIwNGQ3NDtib3JkZXItY29sb3I6IzEyMmI0MH0uYnRuLXByaW1hcnkuYWN0aXZlLC5idG4tcHJpbWFyeTphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tcHJpbWFyeXtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi1wcmltYXJ5LmRpc2FibGVkLmZvY3VzLC5idG4tcHJpbWFyeS5kaXNhYmxlZDpmb2N1cywuYnRuLXByaW1hcnkuZGlzYWJsZWQ6aG92ZXIsLmJ0bi1wcmltYXJ5W2Rpc2FibGVkXS5mb2N1cywuYnRuLXByaW1hcnlbZGlzYWJsZWRdOmZvY3VzLC5idG4tcHJpbWFyeVtkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tcHJpbWFyeS5mb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1wcmltYXJ5OmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3O2JvcmRlci1jb2xvcjojMmU2ZGE0fS5idG4tcHJpbWFyeSAuYmFkZ2V7Y29sb3I6IzMzN2FiNztiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ0bi1zdWNjZXNze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNWNiODVjO2JvcmRlci1jb2xvcjojNGNhZTRjfS5idG4tc3VjY2Vzcy5mb2N1cywuYnRuLXN1Y2Nlc3M6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0NDlkNDQ7Ym9yZGVyLWNvbG9yOiMyNTU2MjV9LmJ0bi1zdWNjZXNzOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNDQ5ZDQ0O2JvcmRlci1jb2xvcjojMzk4NDM5fS5idG4tc3VjY2Vzcy5hY3RpdmUsLmJ0bi1zdWNjZXNzOmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1zdWNjZXNze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNDQ5ZDQ0O2JvcmRlci1jb2xvcjojMzk4NDM5fS5idG4tc3VjY2Vzcy5hY3RpdmUuZm9jdXMsLmJ0bi1zdWNjZXNzLmFjdGl2ZTpmb2N1cywuYnRuLXN1Y2Nlc3MuYWN0aXZlOmhvdmVyLC5idG4tc3VjY2VzczphY3RpdmUuZm9jdXMsLmJ0bi1zdWNjZXNzOmFjdGl2ZTpmb2N1cywuYnRuLXN1Y2Nlc3M6YWN0aXZlOmhvdmVyLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXN1Y2Nlc3MuZm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tc3VjY2Vzczpmb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1zdWNjZXNzOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzk4NDM5O2JvcmRlci1jb2xvcjojMjU1NjI1fS5idG4tc3VjY2Vzcy5hY3RpdmUsLmJ0bi1zdWNjZXNzOmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1zdWNjZXNze2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uYnRuLXN1Y2Nlc3MuZGlzYWJsZWQuZm9jdXMsLmJ0bi1zdWNjZXNzLmRpc2FibGVkOmZvY3VzLC5idG4tc3VjY2Vzcy5kaXNhYmxlZDpob3ZlciwuYnRuLXN1Y2Nlc3NbZGlzYWJsZWRdLmZvY3VzLC5idG4tc3VjY2Vzc1tkaXNhYmxlZF06Zm9jdXMsLmJ0bi1zdWNjZXNzW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1zdWNjZXNzLmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXN1Y2Nlc3M6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tc3VjY2Vzczpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM1Y2I4NWM7Ym9yZGVyLWNvbG9yOiM0Y2FlNGN9LmJ0bi1zdWNjZXNzIC5iYWRnZXtjb2xvcjojNWNiODVjO2JhY2tncm91bmQtY29sb3I6I2ZmZn0uYnRuLWluZm97Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM1YmMwZGU7Ym9yZGVyLWNvbG9yOiM0NmI4ZGF9LmJ0bi1pbmZvLmZvY3VzLC5idG4taW5mbzpmb2N1c3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzMxYjBkNTtib3JkZXItY29sb3I6IzFiNmQ4NX0uYnRuLWluZm86aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMWIwZDU7Ym9yZGVyLWNvbG9yOiMyNjlhYmN9LmJ0bi1pbmZvLmFjdGl2ZSwuYnRuLWluZm86YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWluZm97Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzMWIwZDU7Ym9yZGVyLWNvbG9yOiMyNjlhYmN9LmJ0bi1pbmZvLmFjdGl2ZS5mb2N1cywuYnRuLWluZm8uYWN0aXZlOmZvY3VzLC5idG4taW5mby5hY3RpdmU6aG92ZXIsLmJ0bi1pbmZvOmFjdGl2ZS5mb2N1cywuYnRuLWluZm86YWN0aXZlOmZvY3VzLC5idG4taW5mbzphY3RpdmU6aG92ZXIsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4taW5mby5mb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1pbmZvOmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWluZm86aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyNjlhYmM7Ym9yZGVyLWNvbG9yOiMxYjZkODV9LmJ0bi1pbmZvLmFjdGl2ZSwuYnRuLWluZm86YWN0aXZlLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWluZm97YmFja2dyb3VuZC1pbWFnZTpub25lfS5idG4taW5mby5kaXNhYmxlZC5mb2N1cywuYnRuLWluZm8uZGlzYWJsZWQ6Zm9jdXMsLmJ0bi1pbmZvLmRpc2FibGVkOmhvdmVyLC5idG4taW5mb1tkaXNhYmxlZF0uZm9jdXMsLmJ0bi1pbmZvW2Rpc2FibGVkXTpmb2N1cywuYnRuLWluZm9bZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWluZm8uZm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4taW5mbzpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1pbmZvOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzViYzBkZTtib3JkZXItY29sb3I6IzQ2YjhkYX0uYnRuLWluZm8gLmJhZGdle2NvbG9yOiM1YmMwZGU7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idG4td2FybmluZ3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2YwYWQ0ZTtib3JkZXItY29sb3I6I2VlYTIzNn0uYnRuLXdhcm5pbmcuZm9jdXMsLmJ0bi13YXJuaW5nOmZvY3Vze2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojZWM5NzFmO2JvcmRlci1jb2xvcjojOTg1ZjBkfS5idG4td2FybmluZzpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2VjOTcxZjtib3JkZXItY29sb3I6I2Q1ODUxMn0uYnRuLXdhcm5pbmcuYWN0aXZlLC5idG4td2FybmluZzphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4td2FybmluZ3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2VjOTcxZjtib3JkZXItY29sb3I6I2Q1ODUxMn0uYnRuLXdhcm5pbmcuYWN0aXZlLmZvY3VzLC5idG4td2FybmluZy5hY3RpdmU6Zm9jdXMsLmJ0bi13YXJuaW5nLmFjdGl2ZTpob3ZlciwuYnRuLXdhcm5pbmc6YWN0aXZlLmZvY3VzLC5idG4td2FybmluZzphY3RpdmU6Zm9jdXMsLmJ0bi13YXJuaW5nOmFjdGl2ZTpob3Zlciwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi13YXJuaW5nLmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLXdhcm5pbmc6Zm9jdXMsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4td2FybmluZzpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6I2Q1ODUxMjtib3JkZXItY29sb3I6Izk4NWYwZH0uYnRuLXdhcm5pbmcuYWN0aXZlLC5idG4td2FybmluZzphY3RpdmUsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4td2FybmluZ3tiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmJ0bi13YXJuaW5nLmRpc2FibGVkLmZvY3VzLC5idG4td2FybmluZy5kaXNhYmxlZDpmb2N1cywuYnRuLXdhcm5pbmcuZGlzYWJsZWQ6aG92ZXIsLmJ0bi13YXJuaW5nW2Rpc2FibGVkXS5mb2N1cywuYnRuLXdhcm5pbmdbZGlzYWJsZWRdOmZvY3VzLC5idG4td2FybmluZ1tkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4td2FybmluZy5mb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi13YXJuaW5nOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLXdhcm5pbmc6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjBhZDRlO2JvcmRlci1jb2xvcjojZWVhMjM2fS5idG4td2FybmluZyAuYmFkZ2V7Y29sb3I6I2YwYWQ0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ0bi1kYW5nZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNkOTUzNGY7Ym9yZGVyLWNvbG9yOiNkNDNmM2F9LmJ0bi1kYW5nZXIuZm9jdXMsLmJ0bi1kYW5nZXI6Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNjOTMwMmM7Ym9yZGVyLWNvbG9yOiM3NjFjMTl9LmJ0bi1kYW5nZXI6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNjOTMwMmM7Ym9yZGVyLWNvbG9yOiNhYzI5MjV9LmJ0bi1kYW5nZXIuYWN0aXZlLC5idG4tZGFuZ2VyOmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1kYW5nZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNjOTMwMmM7Ym9yZGVyLWNvbG9yOiNhYzI5MjV9LmJ0bi1kYW5nZXIuYWN0aXZlLmZvY3VzLC5idG4tZGFuZ2VyLmFjdGl2ZTpmb2N1cywuYnRuLWRhbmdlci5hY3RpdmU6aG92ZXIsLmJ0bi1kYW5nZXI6YWN0aXZlLmZvY3VzLC5idG4tZGFuZ2VyOmFjdGl2ZTpmb2N1cywuYnRuLWRhbmdlcjphY3RpdmU6aG92ZXIsLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGFuZ2VyLmZvY3VzLC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRhbmdlcjpmb2N1cywub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1kYW5nZXI6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNhYzI5MjU7Ym9yZGVyLWNvbG9yOiM3NjFjMTl9LmJ0bi1kYW5nZXIuYWN0aXZlLC5idG4tZGFuZ2VyOmFjdGl2ZSwub3Blbj4uZHJvcGRvd24tdG9nZ2xlLmJ0bi1kYW5nZXJ7YmFja2dyb3VuZC1pbWFnZTpub25lfS5idG4tZGFuZ2VyLmRpc2FibGVkLmZvY3VzLC5idG4tZGFuZ2VyLmRpc2FibGVkOmZvY3VzLC5idG4tZGFuZ2VyLmRpc2FibGVkOmhvdmVyLC5idG4tZGFuZ2VyW2Rpc2FibGVkXS5mb2N1cywuYnRuLWRhbmdlcltkaXNhYmxlZF06Zm9jdXMsLmJ0bi1kYW5nZXJbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWRhbmdlci5mb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1kYW5nZXI6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tZGFuZ2VyOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2Q5NTM0Zjtib3JkZXItY29sb3I6I2Q0M2YzYX0uYnRuLWRhbmdlciAuYmFkZ2V7Y29sb3I6I2Q5NTM0ZjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmJ0bi1saW5re2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojMzM3YWI3O2JvcmRlci1yYWRpdXM6MH0uYnRuLWxpbmssLmJ0bi1saW5rLmFjdGl2ZSwuYnRuLWxpbms6YWN0aXZlLC5idG4tbGlua1tkaXNhYmxlZF0sZmllbGRzZXRbZGlzYWJsZWRdIC5idG4tbGlua3tiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0uYnRuLWxpbmssLmJ0bi1saW5rOmFjdGl2ZSwuYnRuLWxpbms6Zm9jdXMsLmJ0bi1saW5rOmhvdmVye2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uYnRuLWxpbms6Zm9jdXMsLmJ0bi1saW5rOmhvdmVye2NvbG9yOiMyMzUyN2M7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsLmJ0bi1saW5rW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmJ0bi1saW5rOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuYnRuLWxpbms6aG92ZXJ7Y29sb3I6Izc3Nzt0ZXh0LWRlY29yYXRpb246bm9uZX0uYnRuLWdyb3VwLWxnPi5idG4sLmJ0bi1sZ3twYWRkaW5nOjEwcHggMTZweDtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoxLjMzMzMzMzM7Ym9yZGVyLXJhZGl1czo2cHh9LmJ0bi1ncm91cC1zbT4uYnRuLC5idG4tc217cGFkZGluZzo1cHggMTBweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjU7Ym9yZGVyLXJhZGl1czozcHh9LmJ0bi1ncm91cC14cz4uYnRuLC5idG4teHN7cGFkZGluZzoxcHggNXB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH0uYnRuLWJsb2Nre2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX0uYnRuLWJsb2NrKy5idG4tYmxvY2t7bWFyZ2luLXRvcDo1cHh9aW5wdXRbdHlwZT1idXR0b25dLmJ0bi1ibG9jayxpbnB1dFt0eXBlPXJlc2V0XS5idG4tYmxvY2ssaW5wdXRbdHlwZT1zdWJtaXRdLmJ0bi1ibG9ja3t3aWR0aDoxMDAlfS5mYWRle29wYWNpdHk6MDstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMTVzIGxpbmVhcjstby10cmFuc2l0aW9uOm9wYWNpdHkgLjE1cyBsaW5lYXI7dHJhbnNpdGlvbjpvcGFjaXR5IC4xNXMgbGluZWFyfS5mYWRlLmlue29wYWNpdHk6MX0uY29sbGFwc2V7ZGlzcGxheTpub25lfS5jb2xsYXBzZS5pbntkaXNwbGF5OmJsb2NrfXRyLmNvbGxhcHNlLmlue2Rpc3BsYXk6dGFibGUtcm93fXRib2R5LmNvbGxhcHNlLmlue2Rpc3BsYXk6dGFibGUtcm93LWdyb3VwfS5jb2xsYXBzaW5ne3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDowO292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7LW8tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjouMzVzOy1vLXRyYW5zaXRpb24tZHVyYXRpb246LjM1czt0cmFuc2l0aW9uLWR1cmF0aW9uOi4zNXM7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OmhlaWdodCx2aXNpYmlsaXR5Oy1vLXRyYW5zaXRpb24tcHJvcGVydHk6aGVpZ2h0LHZpc2liaWxpdHk7dHJhbnNpdGlvbi1wcm9wZXJ0eTpoZWlnaHQsdmlzaWJpbGl0eX0uY2FyZXR7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDttYXJnaW4tbGVmdDoycHg7dmVydGljYWwtYWxpZ246bWlkZGxlO2JvcmRlci10b3A6NHB4IGRhc2hlZDtib3JkZXItdG9wOjRweCBzb2xpZFw5O2JvcmRlci1yaWdodDo0cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkIHRyYW5zcGFyZW50fS5kcm9wZG93biwuZHJvcHVwe3Bvc2l0aW9uOnJlbGF0aXZlfS5kcm9wZG93bi10b2dnbGU6Zm9jdXN7b3V0bGluZTowfS5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MDt6LWluZGV4OjEwMDA7ZGlzcGxheTpub25lO2Zsb2F0OmxlZnQ7bWluLXdpZHRoOjE2MHB4O3BhZGRpbmc6NXB4IDA7bWFyZ2luOjJweCAwIDA7Zm9udC1zaXplOjE0cHg7dGV4dC1hbGlnbjpsZWZ0O2xpc3Qtc3R5bGU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjE1KTtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6MCA2cHggMTJweCByZ2JhKDAsMCwwLC4xNzUpO2JveC1zaGFkb3c6MCA2cHggMTJweCByZ2JhKDAsMCwwLC4xNzUpfS5kcm9wZG93bi1tZW51LnB1bGwtcmlnaHR7cmlnaHQ6MDtsZWZ0OmF1dG99LmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7aGVpZ2h0OjFweDttYXJnaW46OXB4IDA7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2U1ZTVlNX0uZHJvcGRvd24tbWVudT5saT5he2Rpc3BsYXk6YmxvY2s7cGFkZGluZzozcHggMjBweDtjbGVhcjpib3RoO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2NvbG9yOiMzMzM7d2hpdGUtc3BhY2U6bm93cmFwfS5kcm9wZG93bi1tZW51PmxpPmE6Zm9jdXMsLmRyb3Bkb3duLW1lbnU+bGk+YTpob3Zlcntjb2xvcjojMjYyNjI2O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0uZHJvcGRvd24tbWVudT4uYWN0aXZlPmEsLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hOmZvY3VzLC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpob3Zlcntjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6IzMzN2FiNztvdXRsaW5lOjB9LmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmEsLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6Zm9jdXMsLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6Izc3N30uZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpmb2N1cywuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChlbmFibGVkPWZhbHNlKX0ub3Blbj4uZHJvcGRvd24tbWVudXtkaXNwbGF5OmJsb2NrfS5vcGVuPmF7b3V0bGluZTowfS5kcm9wZG93bi1tZW51LXJpZ2h0e3JpZ2h0OjA7bGVmdDphdXRvfS5kcm9wZG93bi1tZW51LWxlZnR7cmlnaHQ6YXV0bztsZWZ0OjB9LmRyb3Bkb3duLWhlYWRlcntkaXNwbGF5OmJsb2NrO3BhZGRpbmc6M3B4IDIwcHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojNzc3O3doaXRlLXNwYWNlOm5vd3JhcH0uZHJvcGRvd24tYmFja2Ryb3B7cG9zaXRpb246Zml4ZWQ7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7ei1pbmRleDo5OTB9LnB1bGwtcmlnaHQ+LmRyb3Bkb3duLW1lbnV7cmlnaHQ6MDtsZWZ0OmF1dG99LmRyb3B1cCAuY2FyZXQsLm5hdmJhci1maXhlZC1ib3R0b20gLmRyb3Bkb3duIC5jYXJldHtjb250ZW50OiIiO2JvcmRlci10b3A6MDtib3JkZXItYm90dG9tOjRweCBkYXNoZWQ7Ym9yZGVyLWJvdHRvbTo0cHggc29saWRcOX0uZHJvcHVwIC5kcm9wZG93bi1tZW51LC5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biAuZHJvcGRvd24tbWVudXt0b3A6YXV0bztib3R0b206MTAwJTttYXJnaW4tYm90dG9tOjJweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1yaWdodCAuZHJvcGRvd24tbWVudXtyaWdodDowO2xlZnQ6YXV0b30ubmF2YmFyLXJpZ2h0IC5kcm9wZG93bi1tZW51LWxlZnR7cmlnaHQ6YXV0bztsZWZ0OjB9fS5idG4tZ3JvdXAsLmJ0bi1ncm91cC12ZXJ0aWNhbHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLC5idG4tZ3JvdXA+LmJ0bntwb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpsZWZ0fS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi5hY3RpdmUsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmFjdGl2ZSwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46Zm9jdXMsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmhvdmVyLC5idG4tZ3JvdXA+LmJ0bi5hY3RpdmUsLmJ0bi1ncm91cD4uYnRuOmFjdGl2ZSwuYnRuLWdyb3VwPi5idG46Zm9jdXMsLmJ0bi1ncm91cD4uYnRuOmhvdmVye3otaW5kZXg6Mn0uYnRuLWdyb3VwIC5idG4rLmJ0biwuYnRuLWdyb3VwIC5idG4rLmJ0bi1ncm91cCwuYnRuLWdyb3VwIC5idG4tZ3JvdXArLmJ0biwuYnRuLWdyb3VwIC5idG4tZ3JvdXArLmJ0bi1ncm91cHttYXJnaW4tbGVmdDotMXB4fS5idG4tdG9vbGJhcnttYXJnaW4tbGVmdDotNXB4fS5idG4tdG9vbGJhciAuYnRuLC5idG4tdG9vbGJhciAuYnRuLWdyb3VwLC5idG4tdG9vbGJhciAuaW5wdXQtZ3JvdXB7ZmxvYXQ6bGVmdH0uYnRuLXRvb2xiYXI+LmJ0biwuYnRuLXRvb2xiYXI+LmJ0bi1ncm91cCwuYnRuLXRvb2xiYXI+LmlucHV0LWdyb3Vwe21hcmdpbi1sZWZ0OjVweH0uYnRuLWdyb3VwPi5idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSl7Ym9yZGVyLXJhZGl1czowfS5idG4tZ3JvdXA+LmJ0bjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5idG4tZ3JvdXA+LmJ0bjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCksLmJ0bi1ncm91cD4uZHJvcGRvd24tdG9nZ2xlOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuLWdyb3Vwe2Zsb2F0OmxlZnR9LmJ0bi1ncm91cD4uYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk+LmJ0bntib3JkZXItcmFkaXVzOjB9LmJ0bi1ncm91cD4uYnRuLWdyb3VwOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCk+LmJ0bjpsYXN0LWNoaWxkLC5idG4tZ3JvdXA+LmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpPi5kcm9wZG93bi10b2dnbGV7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5idG4tZ3JvdXA+LmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG46Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uYnRuLWdyb3VwIC5kcm9wZG93bi10b2dnbGU6YWN0aXZlLC5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xle291dGxpbmU6MH0uYnRuLWdyb3VwPi5idG4rLmRyb3Bkb3duLXRvZ2dsZXtwYWRkaW5nLXJpZ2h0OjhweDtwYWRkaW5nLWxlZnQ6OHB4fS5idG4tZ3JvdXA+LmJ0bi1sZysuZHJvcGRvd24tdG9nZ2xle3BhZGRpbmctcmlnaHQ6MTJweDtwYWRkaW5nLWxlZnQ6MTJweH0uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZXstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSk7Ym94LXNoYWRvdzppbnNldCAwIDNweCA1cHggcmdiYSgwLDAsMCwuMTI1KX0uYnRuLWdyb3VwLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5idG4tbGlua3std2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LmJ0biAuY2FyZXR7bWFyZ2luLWxlZnQ6MH0uYnRuLWxnIC5jYXJldHtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci1ib3R0b20td2lkdGg6MH0uZHJvcHVwIC5idG4tbGcgLmNhcmV0e2JvcmRlci13aWR0aDowIDVweCA1cHh9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cCwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA+LmJ0bntkaXNwbGF5OmJsb2NrO2Zsb2F0Om5vbmU7d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJX0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA+LmJ0bntmbG9hdDpub25lfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bisuYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bisuYnRuLWdyb3VwLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cCsuYnRuLC5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cCsuYnRuLWdyb3Vwe21hcmdpbi10b3A6LTFweDttYXJnaW4tbGVmdDowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MH0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG46Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4fS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpPi5idG57Ym9yZGVyLXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpPi5idG46bGFzdC1jaGlsZCwuYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKT4uZHJvcGRvd24tdG9nZ2xle2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG46Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LmJ0bi1ncm91cC1qdXN0aWZpZWR7ZGlzcGxheTp0YWJsZTt3aWR0aDoxMDAlO3RhYmxlLWxheW91dDpmaXhlZDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGV9LmJ0bi1ncm91cC1qdXN0aWZpZWQ+LmJ0biwuYnRuLWdyb3VwLWp1c3RpZmllZD4uYnRuLWdyb3Vwe2Rpc3BsYXk6dGFibGUtY2VsbDtmbG9hdDpub25lO3dpZHRoOjElfS5idG4tZ3JvdXAtanVzdGlmaWVkPi5idG4tZ3JvdXAgLmJ0bnt3aWR0aDoxMDAlfS5idG4tZ3JvdXAtanVzdGlmaWVkPi5idG4tZ3JvdXAgLmRyb3Bkb3duLW1lbnV7bGVmdDphdXRvfVtkYXRhLXRvZ2dsZT1idXR0b25zXT4uYnRuIGlucHV0W3R5cGU9Y2hlY2tib3hdLFtkYXRhLXRvZ2dsZT1idXR0b25zXT4uYnRuIGlucHV0W3R5cGU9cmFkaW9dLFtkYXRhLXRvZ2dsZT1idXR0b25zXT4uYnRuLWdyb3VwPi5idG4gaW5wdXRbdHlwZT1jaGVja2JveF0sW2RhdGEtdG9nZ2xlPWJ1dHRvbnNdPi5idG4tZ3JvdXA+LmJ0biBpbnB1dFt0eXBlPXJhZGlvXXtwb3NpdGlvbjphYnNvbHV0ZTtjbGlwOnJlY3QoMCwwLDAsMCk7cG9pbnRlci1ldmVudHM6bm9uZX0uaW5wdXQtZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6c2VwYXJhdGV9LmlucHV0LWdyb3VwW2NsYXNzKj1jb2wtXXtmbG9hdDpub25lO3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH0uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjI7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MH0uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpmb2N1c3t6LWluZGV4OjN9LmlucHV0LWdyb3VwLWxnPi5mb3JtLWNvbnRyb2wsLmlucHV0LWdyb3VwLWxnPi5pbnB1dC1ncm91cC1hZGRvbiwuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDo0NnB4O3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMzMzMzMzMztib3JkZXItcmFkaXVzOjZweH1zZWxlY3QuaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCxzZWxlY3QuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdC5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjQ2cHg7bGluZS1oZWlnaHQ6NDZweH1zZWxlY3RbbXVsdGlwbGVdLmlucHV0LWdyb3VwLWxnPi5mb3JtLWNvbnRyb2wsc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYWRkb24sc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYnRuPi5idG4sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtbGc+LmZvcm0tY29udHJvbCx0ZXh0YXJlYS5pbnB1dC1ncm91cC1sZz4uaW5wdXQtZ3JvdXAtYWRkb24sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtbGc+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDphdXRvfS5pbnB1dC1ncm91cC1zbT4uZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sLmlucHV0LWdyb3VwLXNtPi5pbnB1dC1ncm91cC1idG4+LmJ0bntoZWlnaHQ6MzBweDtwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNTtib3JkZXItcmFkaXVzOjNweH1zZWxlY3QuaW5wdXQtZ3JvdXAtc20+LmZvcm0tY29udHJvbCxzZWxlY3QuaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWFkZG9uLHNlbGVjdC5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYnRuPi5idG57aGVpZ2h0OjMwcHg7bGluZS1oZWlnaHQ6MzBweH1zZWxlY3RbbXVsdGlwbGVdLmlucHV0LWdyb3VwLXNtPi5mb3JtLWNvbnRyb2wsc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sc2VsZWN0W211bHRpcGxlXS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYnRuPi5idG4sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtc20+LmZvcm0tY29udHJvbCx0ZXh0YXJlYS5pbnB1dC1ncm91cC1zbT4uaW5wdXQtZ3JvdXAtYWRkb24sdGV4dGFyZWEuaW5wdXQtZ3JvdXAtc20+LmlucHV0LWdyb3VwLWJ0bj4uYnRue2hlaWdodDphdXRvfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sLC5pbnB1dC1ncm91cC1hZGRvbiwuaW5wdXQtZ3JvdXAtYnRue2Rpc3BsYXk6dGFibGUtY2VsbH0uaW5wdXQtZ3JvdXAgLmZvcm0tY29udHJvbDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLC5pbnB1dC1ncm91cC1hZGRvbjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLC5pbnB1dC1ncm91cC1idG46bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKXtib3JkZXItcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFkZG9uLC5pbnB1dC1ncm91cC1idG57d2lkdGg6MSU7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uaW5wdXQtZ3JvdXAtYWRkb257cGFkZGluZzo2cHggMTJweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojNTU1O3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6I2VlZTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHh9LmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LXNte3BhZGRpbmc6NXB4IDEwcHg7Zm9udC1zaXplOjEycHg7Ym9yZGVyLXJhZGl1czozcHh9LmlucHV0LWdyb3VwLWFkZG9uLmlucHV0LWxne3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2JvcmRlci1yYWRpdXM6NnB4fS5pbnB1dC1ncm91cC1hZGRvbiBpbnB1dFt0eXBlPWNoZWNrYm94XSwuaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXRbdHlwZT1yYWRpb117bWFyZ2luLXRvcDowfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmZpcnN0LWNoaWxkLC5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCwuaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLWdyb3VwPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uZHJvcGRvd24tdG9nZ2xlLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLWdyb3VwOm5vdCg6bGFzdC1jaGlsZCk+LmJ0biwuaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmlucHV0LWdyb3VwLWFkZG9uOmZpcnN0LWNoaWxke2JvcmRlci1yaWdodDowfS5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmxhc3QtY2hpbGQsLmlucHV0LWdyb3VwLWFkZG9uOmxhc3QtY2hpbGQsLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuOm5vdCg6Zmlyc3QtY2hpbGQpLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLC5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZD4uYnRuLWdyb3VwPi5idG4sLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkPi5kcm9wZG93bi10b2dnbGV7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZHtib3JkZXItbGVmdDowfS5pbnB1dC1ncm91cC1idG57cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjA7d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dC1ncm91cC1idG4+LmJ0bntwb3NpdGlvbjpyZWxhdGl2ZX0uaW5wdXQtZ3JvdXAtYnRuPi5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5pbnB1dC1ncm91cC1idG4+LmJ0bjphY3RpdmUsLmlucHV0LWdyb3VwLWJ0bj4uYnRuOmZvY3VzLC5pbnB1dC1ncm91cC1idG4+LmJ0bjpob3Zlcnt6LWluZGV4OjJ9LmlucHV0LWdyb3VwLWJ0bjpmaXJzdC1jaGlsZD4uYnRuLC5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQ+LmJ0bi1ncm91cHttYXJnaW4tcmlnaHQ6LTFweH0uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0biwuaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQ+LmJ0bi1ncm91cHt6LWluZGV4OjI7bWFyZ2luLWxlZnQ6LTFweH0ubmF2e3BhZGRpbmctbGVmdDowO21hcmdpbi1ib3R0b206MDtsaXN0LXN0eWxlOm5vbmV9Lm5hdj5saXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrfS5uYXY+bGk+YXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTBweCAxNXB4fS5uYXY+bGk+YTpmb2N1cywubmF2PmxpPmE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5uYXY+bGkuZGlzYWJsZWQ+YXtjb2xvcjojNzc3fS5uYXY+bGkuZGlzYWJsZWQ+YTpmb2N1cywubmF2PmxpLmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6Izc3Nzt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2IC5vcGVuPmEsLm5hdiAub3Blbj5hOmZvY3VzLC5uYXYgLm9wZW4+YTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Ym9yZGVyLWNvbG9yOiMzMzdhYjd9Lm5hdiAubmF2LWRpdmlkZXJ7aGVpZ2h0OjFweDttYXJnaW46OXB4IDA7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2U1ZTVlNX0ubmF2PmxpPmE+aW1ne21heC13aWR0aDpub25lfS5uYXYtdGFic3tib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkfS5uYXYtdGFicz5saXtmbG9hdDpsZWZ0O21hcmdpbi1ib3R0b206LTFweH0ubmF2LXRhYnM+bGk+YXttYXJnaW4tcmlnaHQ6MnB4O2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweCA0cHggMCAwfS5uYXYtdGFicz5saT5hOmhvdmVye2JvcmRlci1jb2xvcjojZWVlICNlZWUgI2RkZH0ubmF2LXRhYnM+bGkuYWN0aXZlPmEsLm5hdi10YWJzPmxpLmFjdGl2ZT5hOmZvY3VzLC5uYXYtdGFicz5saS5hY3RpdmU+YTpob3Zlcntjb2xvcjojNTU1O2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudH0ubmF2LXRhYnMubmF2LWp1c3RpZmllZHt3aWR0aDoxMDAlO2JvcmRlci1ib3R0b206MH0ubmF2LXRhYnMubmF2LWp1c3RpZmllZD5saXtmbG9hdDpub25lfS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPmxpPmF7bWFyZ2luLWJvdHRvbTo1cHg7dGV4dC1hbGlnbjpjZW50ZXJ9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmRyb3Bkb3duIC5kcm9wZG93bi1tZW51e3RvcDphdXRvO2xlZnQ6YXV0b31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+bGl7ZGlzcGxheTp0YWJsZS1jZWxsO3dpZHRoOjElfS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPmxpPmF7bWFyZ2luLWJvdHRvbTowfX0ubmF2LXRhYnMubmF2LWp1c3RpZmllZD5saT5he21hcmdpbi1yaWdodDowO2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtdGFicy5uYXYtanVzdGlmaWVkPi5hY3RpdmU+YSwubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uYWN0aXZlPmE6Zm9jdXMsLm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmhvdmVye2JvcmRlcjoxcHggc29saWQgI2RkZH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+bGk+YXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDB9Lm5hdi10YWJzLm5hdi1qdXN0aWZpZWQ+LmFjdGl2ZT5hLC5uYXYtdGFicy5uYXYtanVzdGlmaWVkPi5hY3RpdmU+YTpmb2N1cywubmF2LXRhYnMubmF2LWp1c3RpZmllZD4uYWN0aXZlPmE6aG92ZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZmZmfX0ubmF2LXBpbGxzPmxpe2Zsb2F0OmxlZnR9Lm5hdi1waWxscz5saT5he2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtcGlsbHM+bGkrbGl7bWFyZ2luLWxlZnQ6MnB4fS5uYXYtcGlsbHM+bGkuYWN0aXZlPmEsLm5hdi1waWxscz5saS5hY3RpdmU+YTpmb2N1cywubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3fS5uYXYtc3RhY2tlZD5saXtmbG9hdDpub25lfS5uYXYtc3RhY2tlZD5saStsaXttYXJnaW4tdG9wOjJweDttYXJnaW4tbGVmdDowfS5uYXYtanVzdGlmaWVke3dpZHRoOjEwMCV9Lm5hdi1qdXN0aWZpZWQ+bGl7ZmxvYXQ6bm9uZX0ubmF2LWp1c3RpZmllZD5saT5he21hcmdpbi1ib3R0b206NXB4O3RleHQtYWxpZ246Y2VudGVyfS5uYXYtanVzdGlmaWVkPi5kcm9wZG93biAuZHJvcGRvd24tbWVudXt0b3A6YXV0bztsZWZ0OmF1dG99QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXYtanVzdGlmaWVkPmxpe2Rpc3BsYXk6dGFibGUtY2VsbDt3aWR0aDoxJX0ubmF2LWp1c3RpZmllZD5saT5he21hcmdpbi1ib3R0b206MH19Lm5hdi10YWJzLWp1c3RpZmllZHtib3JkZXItYm90dG9tOjB9Lm5hdi10YWJzLWp1c3RpZmllZD5saT5he21hcmdpbi1yaWdodDowO2JvcmRlci1yYWRpdXM6NHB4fS5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hLC5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmZvY3VzLC5uYXYtdGFicy1qdXN0aWZpZWQ+LmFjdGl2ZT5hOmhvdmVye2JvcmRlcjoxcHggc29saWQgI2RkZH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdi10YWJzLWp1c3RpZmllZD5saT5he2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czo0cHggNHB4IDAgMH0ubmF2LXRhYnMtanVzdGlmaWVkPi5hY3RpdmU+YSwubmF2LXRhYnMtanVzdGlmaWVkPi5hY3RpdmU+YTpmb2N1cywubmF2LXRhYnMtanVzdGlmaWVkPi5hY3RpdmU+YTpob3Zlcntib3JkZXItYm90dG9tLWNvbG9yOiNmZmZ9fS50YWItY29udGVudD4udGFiLXBhbmV7ZGlzcGxheTpub25lfS50YWItY29udGVudD4uYWN0aXZle2Rpc3BsYXk6YmxvY2t9Lm5hdi10YWJzIC5kcm9wZG93bi1tZW51e21hcmdpbi10b3A6LTFweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0ubmF2YmFye3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6NTBweDttYXJnaW4tYm90dG9tOjIwcHg7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhcntib3JkZXItcmFkaXVzOjRweH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItaGVhZGVye2Zsb2F0OmxlZnR9fS5uYXZiYXItY29sbGFwc2V7cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDoxNXB4O292ZXJmbG93LXg6dmlzaWJsZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDtib3JkZXItdG9wOjFweCBzb2xpZCB0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm5hdmJhci1jb2xsYXBzZS5pbntvdmVyZmxvdy15OmF1dG99QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItY29sbGFwc2V7d2lkdGg6YXV0bztib3JkZXItdG9wOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5uYXZiYXItY29sbGFwc2UuY29sbGFwc2V7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8haW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjA7b3ZlcmZsb3c6dmlzaWJsZSFpbXBvcnRhbnR9Lm5hdmJhci1jb2xsYXBzZS5pbntvdmVyZmxvdy15OnZpc2libGV9Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNlLC5uYXZiYXItc3RhdGljLXRvcCAubmF2YmFyLWNvbGxhcHNle3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MH19Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNle21heC1oZWlnaHQ6MzQwcHh9QG1lZGlhIChtYXgtZGV2aWNlLXdpZHRoOjQ4MHB4KSBhbmQgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSl7Lm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWZpeGVkLXRvcCAubmF2YmFyLWNvbGxhcHNle21heC1oZWlnaHQ6MjAwcHh9fS5jb250YWluZXItZmx1aWQ+Lm5hdmJhci1jb2xsYXBzZSwuY29udGFpbmVyLWZsdWlkPi5uYXZiYXItaGVhZGVyLC5jb250YWluZXI+Lm5hdmJhci1jb2xsYXBzZSwuY29udGFpbmVyPi5uYXZiYXItaGVhZGVye21hcmdpbi1yaWdodDotMTVweDttYXJnaW4tbGVmdDotMTVweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7LmNvbnRhaW5lci1mbHVpZD4ubmF2YmFyLWNvbGxhcHNlLC5jb250YWluZXItZmx1aWQ+Lm5hdmJhci1oZWFkZXIsLmNvbnRhaW5lcj4ubmF2YmFyLWNvbGxhcHNlLC5jb250YWluZXI+Lm5hdmJhci1oZWFkZXJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MH19Lm5hdmJhci1zdGF0aWMtdG9we3otaW5kZXg6MTAwMDtib3JkZXItd2lkdGg6MCAwIDFweH1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1zdGF0aWMtdG9we2JvcmRlci1yYWRpdXM6MH19Lm5hdmJhci1maXhlZC1ib3R0b20sLm5hdmJhci1maXhlZC10b3B7cG9zaXRpb246Zml4ZWQ7cmlnaHQ6MDtsZWZ0OjA7ei1pbmRleDoxMDMwfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWZpeGVkLWJvdHRvbSwubmF2YmFyLWZpeGVkLXRvcHtib3JkZXItcmFkaXVzOjB9fS5uYXZiYXItZml4ZWQtdG9we3RvcDowO2JvcmRlci13aWR0aDowIDAgMXB4fS5uYXZiYXItZml4ZWQtYm90dG9te2JvdHRvbTowO21hcmdpbi1ib3R0b206MDtib3JkZXItd2lkdGg6MXB4IDAgMH0ubmF2YmFyLWJyYW5ke2Zsb2F0OmxlZnQ7aGVpZ2h0OjUwcHg7cGFkZGluZzoxNXB4IDE1cHg7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjBweH0ubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItYnJhbmQ6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm5hdmJhci1icmFuZD5pbWd7ZGlzcGxheTpibG9ja31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhcj4uY29udGFpbmVyIC5uYXZiYXItYnJhbmQsLm5hdmJhcj4uY29udGFpbmVyLWZsdWlkIC5uYXZiYXItYnJhbmR7bWFyZ2luLWxlZnQ6LTE1cHh9fS5uYXZiYXItdG9nZ2xle3Bvc2l0aW9uOnJlbGF0aXZlO2Zsb2F0OnJpZ2h0O3BhZGRpbmc6OXB4IDEwcHg7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLXJpZ2h0OjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjRweH0ubmF2YmFyLXRvZ2dsZTpmb2N1c3tvdXRsaW5lOjB9Lm5hdmJhci10b2dnbGUgLmljb24tYmFye2Rpc3BsYXk6YmxvY2s7d2lkdGg6MjJweDtoZWlnaHQ6MnB4O2JvcmRlci1yYWRpdXM6MXB4fS5uYXZiYXItdG9nZ2xlIC5pY29uLWJhcisuaWNvbi1iYXJ7bWFyZ2luLXRvcDo0cHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItdG9nZ2xle2Rpc3BsYXk6bm9uZX19Lm5hdmJhci1uYXZ7bWFyZ2luOjcuNXB4IC0xNXB4fS5uYXZiYXItbmF2PmxpPmF7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2xpbmUtaGVpZ2h0OjIwcHh9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51e3Bvc2l0aW9uOnN0YXRpYztmbG9hdDpub25lO3dpZHRoOmF1dG87bWFyZ2luLXRvcDowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1oZWFkZXIsLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YXtwYWRkaW5nOjVweCAxNXB4IDVweCAyNXB4fS5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmF7bGluZS1oZWlnaHQ6MjBweH0ubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmZvY3VzLC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTpub25lfX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7Lm5hdmJhci1uYXZ7ZmxvYXQ6bGVmdDttYXJnaW46MH0ubmF2YmFyLW5hdj5saXtmbG9hdDpsZWZ0fS5uYXZiYXItbmF2PmxpPmF7cGFkZGluZy10b3A6MTVweDtwYWRkaW5nLWJvdHRvbToxNXB4fX0ubmF2YmFyLWZvcm17cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLXJpZ2h0Oi0xNXB4O21hcmdpbi1ib3R0b206OHB4O21hcmdpbi1sZWZ0Oi0xNXB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwuMSl9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItZm9ybSAuZm9ybS1ncm91cHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuZm9ybS1jb250cm9se2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuZm9ybS1jb250cm9sLXN0YXRpY3tkaXNwbGF5OmlubGluZS1ibG9ja30ubmF2YmFyLWZvcm0gLmlucHV0LWdyb3Vwe2Rpc3BsYXk6aW5saW5lLXRhYmxlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubmF2YmFyLWZvcm0gLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2wsLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYWRkb24sLm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cCAuaW5wdXQtZ3JvdXAtYnRue3dpZHRoOmF1dG99Lm5hdmJhci1mb3JtIC5pbnB1dC1ncm91cD4uZm9ybS1jb250cm9se3dpZHRoOjEwMCV9Lm5hdmJhci1mb3JtIC5jb250cm9sLWxhYmVse21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm5hdmJhci1mb3JtIC5jaGVja2JveCwubmF2YmFyLWZvcm0gLnJhZGlve2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS5uYXZiYXItZm9ybSAuY2hlY2tib3ggbGFiZWwsLm5hdmJhci1mb3JtIC5yYWRpbyBsYWJlbHtwYWRkaW5nLWxlZnQ6MH0ubmF2YmFyLWZvcm0gLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdLC5uYXZiYXItZm9ybSAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb117cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWxlZnQ6MH0ubmF2YmFyLWZvcm0gLmhhcy1mZWVkYmFjayAuZm9ybS1jb250cm9sLWZlZWRiYWNre3RvcDowfX1AbWVkaWEgKG1heC13aWR0aDo3NjdweCl7Lm5hdmJhci1mb3JtIC5mb3JtLWdyb3Vwe21hcmdpbi1ib3R0b206NXB4fS5uYXZiYXItZm9ybSAuZm9ybS1ncm91cDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItZm9ybXt3aWR0aDphdXRvO3BhZGRpbmctdG9wOjA7cGFkZGluZy1ib3R0b206MDttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDowO2JvcmRlcjowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX19Lm5hdmJhci1uYXY+bGk+LmRyb3Bkb3duLW1lbnV7bWFyZ2luLXRvcDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5uYXZiYXItZml4ZWQtYm90dG9tIC5uYXZiYXItbmF2PmxpPi5kcm9wZG93bi1tZW51e21hcmdpbi1ib3R0b206MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lm5hdmJhci1idG57bWFyZ2luLXRvcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHh9Lm5hdmJhci1idG4uYnRuLXNte21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHh9Lm5hdmJhci1idG4uYnRuLXhze21hcmdpbi10b3A6MTRweDttYXJnaW4tYm90dG9tOjE0cHh9Lm5hdmJhci10ZXh0e21hcmdpbi10b3A6MTVweDttYXJnaW4tYm90dG9tOjE1cHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpey5uYXZiYXItdGV4dHtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxNXB4O21hcmdpbi1sZWZ0OjE1cHh9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubmF2YmFyLWxlZnR7ZmxvYXQ6bGVmdCFpbXBvcnRhbnR9Lm5hdmJhci1yaWdodHtmbG9hdDpyaWdodCFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0Oi0xNXB4fS5uYXZiYXItcmlnaHR+Lm5hdmJhci1yaWdodHttYXJnaW4tcmlnaHQ6MH19Lm5hdmJhci1kZWZhdWx0e2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmODtib3JkZXItY29sb3I6I2U3ZTdlN30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZHtjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWJyYW5kOmhvdmVye2NvbG9yOiM1ZTVlNWU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10ZXh0e2NvbG9yOiM3Nzd9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpPmF7Y29sb3I6Izc3N30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpmb2N1cywubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2Pi5hY3RpdmU+YSwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+LmFjdGl2ZT5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4uYWN0aXZlPmE6aG92ZXJ7Y29sb3I6IzU1NTtiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTd9Lm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2Pi5kaXNhYmxlZD5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4uZGlzYWJsZWQ+YTpmb2N1cywubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+LmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6I2NjYztiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLXRvZ2dsZXtib3JkZXItY29sb3I6I2RkZH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGU6Zm9jdXMsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItdG9nZ2xlOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2RkZH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6Izg4OH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1mb3Jte2JvcmRlci1jb2xvcjojZTdlN2U3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj4ub3Blbj5hOmhvdmVye2NvbG9yOiM1NTU7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+bGk+YXtjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5hOmhvdmVye2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uYWN0aXZlPmE6Zm9jdXMsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpob3Zlcntjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmEsLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YTpob3Zlcntjb2xvcjojY2NjO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9fS5uYXZiYXItZGVmYXVsdCAubmF2YmFyLWxpbmt7Y29sb3I6Izc3N30ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1saW5rOmhvdmVye2NvbG9yOiMzMzN9Lm5hdmJhci1kZWZhdWx0IC5idG4tbGlua3tjb2xvcjojNzc3fS5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbms6Zm9jdXMsLm5hdmJhci1kZWZhdWx0IC5idG4tbGluazpob3Zlcntjb2xvcjojMzMzfS5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmtbZGlzYWJsZWRdOmZvY3VzLC5uYXZiYXItZGVmYXVsdCAuYnRuLWxpbmtbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAubmF2YmFyLWRlZmF1bHQgLmJ0bi1saW5rOmhvdmVye2NvbG9yOiNjY2N9Lm5hdmJhci1pbnZlcnNle2JhY2tncm91bmQtY29sb3I6IzIyMjtib3JkZXItY29sb3I6IzA4MDgwOH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1icmFuZHtjb2xvcjojOWQ5ZDlkfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWJyYW5kOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci10ZXh0e2NvbG9yOiM5ZDlkOWR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2PmxpPmF7Y29sb3I6IzlkOWQ5ZH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+bGk+YTpmb2N1cywubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+bGk+YTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2Pi5hY3RpdmU+YSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+LmFjdGl2ZT5hOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4uYWN0aXZlPmE6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMwODA4MDh9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2Pi5kaXNhYmxlZD5hLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4uZGlzYWJsZWQ+YTpmb2N1cywubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXY+LmRpc2FibGVkPmE6aG92ZXJ7Y29sb3I6IzQ0NDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLXRvZ2dsZXtib3JkZXItY29sb3I6IzMzM30ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGU6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItdG9nZ2xlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzMzM30ubmF2YmFyLWludmVyc2UgLm5hdmJhci10b2dnbGUgLmljb24tYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1jb2xsYXBzZSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1mb3Jte2JvcmRlci1jb2xvcjojMTAxMDEwfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hOmZvY3VzLC5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdj4ub3Blbj5hOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRyb3Bkb3duLWhlYWRlcntib3JkZXItY29sb3I6IzA4MDgwOH0ubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnUgLmRpdmlkZXJ7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT5saT5he2NvbG9yOiM5ZDlkOWR9Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51PmxpPmE6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uYWN0aXZlPmEsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5hY3RpdmU+YTpmb2N1cywubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmFjdGl2ZT5hOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMDgwODA4fS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLW5hdiAub3BlbiAuZHJvcGRvd24tbWVudT4uZGlzYWJsZWQ+YSwubmF2YmFyLWludmVyc2UgLm5hdmJhci1uYXYgLm9wZW4gLmRyb3Bkb3duLW1lbnU+LmRpc2FibGVkPmE6Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbmF2IC5vcGVuIC5kcm9wZG93bi1tZW51Pi5kaXNhYmxlZD5hOmhvdmVye2NvbG9yOiM0NDQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH19Lm5hdmJhci1pbnZlcnNlIC5uYXZiYXItbGlua3tjb2xvcjojOWQ5ZDlkfS5uYXZiYXItaW52ZXJzZSAubmF2YmFyLWxpbms6aG92ZXJ7Y29sb3I6I2ZmZn0ubmF2YmFyLWludmVyc2UgLmJ0bi1saW5re2NvbG9yOiM5ZDlkOWR9Lm5hdmJhci1pbnZlcnNlIC5idG4tbGluazpmb2N1cywubmF2YmFyLWludmVyc2UgLmJ0bi1saW5rOmhvdmVye2NvbG9yOiNmZmZ9Lm5hdmJhci1pbnZlcnNlIC5idG4tbGlua1tkaXNhYmxlZF06Zm9jdXMsLm5hdmJhci1pbnZlcnNlIC5idG4tbGlua1tkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5uYXZiYXItaW52ZXJzZSAuYnRuLWxpbms6aG92ZXJ7Y29sb3I6IzQ0NH0uYnJlYWRjcnVtYntwYWRkaW5nOjhweCAxNXB4O21hcmdpbi1ib3R0b206MjBweDtsaXN0LXN0eWxlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1yYWRpdXM6NHB4fS5icmVhZGNydW1iPmxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5icmVhZGNydW1iPmxpK2xpOmJlZm9yZXtwYWRkaW5nOjAgNXB4O2NvbG9yOiNjY2M7Y29udGVudDoiL1wwMGEwIn0uYnJlYWRjcnVtYj4uYWN0aXZle2NvbG9yOiM3Nzd9LnBhZ2luYXRpb257ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZy1sZWZ0OjA7bWFyZ2luOjIwcHggMDtib3JkZXItcmFkaXVzOjRweH0ucGFnaW5hdGlvbj5saXtkaXNwbGF5OmlubGluZX0ucGFnaW5hdGlvbj5saT5hLC5wYWdpbmF0aW9uPmxpPnNwYW57cG9zaXRpb246cmVsYXRpdmU7ZmxvYXQ6bGVmdDtwYWRkaW5nOjZweCAxMnB4O21hcmdpbi1sZWZ0Oi0xcHg7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzM3YWI3O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGR9LnBhZ2luYXRpb24+bGk6Zmlyc3QtY2hpbGQ+YSwucGFnaW5hdGlvbj5saTpmaXJzdC1jaGlsZD5zcGFue21hcmdpbi1sZWZ0OjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LnBhZ2luYXRpb24+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4fS5wYWdpbmF0aW9uPmxpPmE6Zm9jdXMsLnBhZ2luYXRpb24+bGk+YTpob3ZlciwucGFnaW5hdGlvbj5saT5zcGFuOmZvY3VzLC5wYWdpbmF0aW9uPmxpPnNwYW46aG92ZXJ7ei1pbmRleDoyO2NvbG9yOiMyMzUyN2M7YmFja2dyb3VuZC1jb2xvcjojZWVlO2JvcmRlci1jb2xvcjojZGRkfS5wYWdpbmF0aW9uPi5hY3RpdmU+YSwucGFnaW5hdGlvbj4uYWN0aXZlPmE6Zm9jdXMsLnBhZ2luYXRpb24+LmFjdGl2ZT5hOmhvdmVyLC5wYWdpbmF0aW9uPi5hY3RpdmU+c3BhbiwucGFnaW5hdGlvbj4uYWN0aXZlPnNwYW46Zm9jdXMsLnBhZ2luYXRpb24+LmFjdGl2ZT5zcGFuOmhvdmVye3otaW5kZXg6Mztjb2xvcjojZmZmO2N1cnNvcjpkZWZhdWx0O2JhY2tncm91bmQtY29sb3I6IzMzN2FiNztib3JkZXItY29sb3I6IzMzN2FiN30ucGFnaW5hdGlvbj4uZGlzYWJsZWQ+YSwucGFnaW5hdGlvbj4uZGlzYWJsZWQ+YTpmb2N1cywucGFnaW5hdGlvbj4uZGlzYWJsZWQ+YTpob3ZlciwucGFnaW5hdGlvbj4uZGlzYWJsZWQ+c3BhbiwucGFnaW5hdGlvbj4uZGlzYWJsZWQ+c3Bhbjpmb2N1cywucGFnaW5hdGlvbj4uZGlzYWJsZWQ+c3Bhbjpob3Zlcntjb2xvcjojNzc3O2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLWNvbG9yOiNkZGR9LnBhZ2luYXRpb24tbGc+bGk+YSwucGFnaW5hdGlvbi1sZz5saT5zcGFue3BhZGRpbmc6MTBweCAxNnB4O2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMzMzMzMzM30ucGFnaW5hdGlvbi1sZz5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLWxnPmxpOmZpcnN0LWNoaWxkPnNwYW57Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo2cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo2cHh9LnBhZ2luYXRpb24tbGc+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLWxnPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo2cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NnB4fS5wYWdpbmF0aW9uLXNtPmxpPmEsLnBhZ2luYXRpb24tc20+bGk+c3BhbntwYWRkaW5nOjVweCAxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNX0ucGFnaW5hdGlvbi1zbT5saTpmaXJzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLXNtPmxpOmZpcnN0LWNoaWxkPnNwYW57Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9LnBhZ2luYXRpb24tc20+bGk6bGFzdC1jaGlsZD5hLC5wYWdpbmF0aW9uLXNtPmxpOmxhc3QtY2hpbGQ+c3Bhbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4fS5wYWdlcntwYWRkaW5nLWxlZnQ6MDttYXJnaW46MjBweCAwO3RleHQtYWxpZ246Y2VudGVyO2xpc3Qtc3R5bGU6bm9uZX0ucGFnZXIgbGl7ZGlzcGxheTppbmxpbmV9LnBhZ2VyIGxpPmEsLnBhZ2VyIGxpPnNwYW57ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzo1cHggMTRweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6MTVweH0ucGFnZXIgbGk+YTpmb2N1cywucGFnZXIgbGk+YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9LnBhZ2VyIC5uZXh0PmEsLnBhZ2VyIC5uZXh0PnNwYW57ZmxvYXQ6cmlnaHR9LnBhZ2VyIC5wcmV2aW91cz5hLC5wYWdlciAucHJldmlvdXM+c3BhbntmbG9hdDpsZWZ0fS5wYWdlciAuZGlzYWJsZWQ+YSwucGFnZXIgLmRpc2FibGVkPmE6Zm9jdXMsLnBhZ2VyIC5kaXNhYmxlZD5hOmhvdmVyLC5wYWdlciAuZGlzYWJsZWQ+c3Bhbntjb2xvcjojNzc3O2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmxhYmVse2Rpc3BsYXk6aW5saW5lO3BhZGRpbmc6LjJlbSAuNmVtIC4zZW07Zm9udC1zaXplOjc1JTtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtib3JkZXItcmFkaXVzOi4yNWVtfWEubGFiZWw6Zm9jdXMsYS5sYWJlbDpob3Zlcntjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpwb2ludGVyfS5sYWJlbDplbXB0eXtkaXNwbGF5Om5vbmV9LmJ0biAubGFiZWx7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0xcHh9LmxhYmVsLWRlZmF1bHR7YmFja2dyb3VuZC1jb2xvcjojNzc3fS5sYWJlbC1kZWZhdWx0W2hyZWZdOmZvY3VzLC5sYWJlbC1kZWZhdWx0W2hyZWZdOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzVlNWU1ZX0ubGFiZWwtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiMzMzdhYjd9LmxhYmVsLXByaW1hcnlbaHJlZl06Zm9jdXMsLmxhYmVsLXByaW1hcnlbaHJlZl06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjg2MDkwfS5sYWJlbC1zdWNjZXNze2JhY2tncm91bmQtY29sb3I6IzVjYjg1Y30ubGFiZWwtc3VjY2Vzc1tocmVmXTpmb2N1cywubGFiZWwtc3VjY2Vzc1tocmVmXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM0NDlkNDR9LmxhYmVsLWluZm97YmFja2dyb3VuZC1jb2xvcjojNWJjMGRlfS5sYWJlbC1pbmZvW2hyZWZdOmZvY3VzLC5sYWJlbC1pbmZvW2hyZWZdOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzMxYjBkNX0ubGFiZWwtd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmMGFkNGV9LmxhYmVsLXdhcm5pbmdbaHJlZl06Zm9jdXMsLmxhYmVsLXdhcm5pbmdbaHJlZl06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZWM5NzFmfS5sYWJlbC1kYW5nZXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1MzRmfS5sYWJlbC1kYW5nZXJbaHJlZl06Zm9jdXMsLmxhYmVsLWRhbmdlcltocmVmXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjOTMwMmN9LmJhZGdle2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi13aWR0aDoxMHB4O3BhZGRpbmc6M3B4IDdweDtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YmFja2dyb3VuZC1jb2xvcjojNzc3O2JvcmRlci1yYWRpdXM6MTBweH0uYmFkZ2U6ZW1wdHl7ZGlzcGxheTpub25lfS5idG4gLmJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDotMXB4fS5idG4tZ3JvdXAteHM+LmJ0biAuYmFkZ2UsLmJ0bi14cyAuYmFkZ2V7dG9wOjA7cGFkZGluZzoxcHggNXB4fWEuYmFkZ2U6Zm9jdXMsYS5iYWRnZTpob3Zlcntjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpwb2ludGVyfS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlPi5iYWRnZSwubmF2LXBpbGxzPi5hY3RpdmU+YT4uYmFkZ2V7Y29sb3I6IzMzN2FiNztiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lmxpc3QtZ3JvdXAtaXRlbT4uYmFkZ2V7ZmxvYXQ6cmlnaHR9Lmxpc3QtZ3JvdXAtaXRlbT4uYmFkZ2UrLmJhZGdle21hcmdpbi1yaWdodDo1cHh9Lm5hdi1waWxscz5saT5hPi5iYWRnZXttYXJnaW4tbGVmdDozcHh9Lmp1bWJvdHJvbntwYWRkaW5nLXRvcDozMHB4O3BhZGRpbmctYm90dG9tOjMwcHg7bWFyZ2luLWJvdHRvbTozMHB4O2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5qdW1ib3Ryb24gLmgxLC5qdW1ib3Ryb24gaDF7Y29sb3I6aW5oZXJpdH0uanVtYm90cm9uIHB7bWFyZ2luLWJvdHRvbToxNXB4O2ZvbnQtc2l6ZToyMXB4O2ZvbnQtd2VpZ2h0OjIwMH0uanVtYm90cm9uPmhye2JvcmRlci10b3AtY29sb3I6I2Q1ZDVkNX0uY29udGFpbmVyIC5qdW1ib3Ryb24sLmNvbnRhaW5lci1mbHVpZCAuanVtYm90cm9ue3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MTVweDtib3JkZXItcmFkaXVzOjZweH0uanVtYm90cm9uIC5jb250YWluZXJ7bWF4LXdpZHRoOjEwMCV9QG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7Lmp1bWJvdHJvbntwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjQ4cHh9LmNvbnRhaW5lciAuanVtYm90cm9uLC5jb250YWluZXItZmx1aWQgLmp1bWJvdHJvbntwYWRkaW5nLXJpZ2h0OjYwcHg7cGFkZGluZy1sZWZ0OjYwcHh9Lmp1bWJvdHJvbiAuaDEsLmp1bWJvdHJvbiBoMXtmb250LXNpemU6NjNweH19LnRodW1ibmFpbHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6NHB4O21hcmdpbi1ib3R0b206MjBweDtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJhZGl1czo0cHg7LXdlYmtpdC10cmFuc2l0aW9uOmJvcmRlciAuMnMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpib3JkZXIgLjJzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246Ym9yZGVyIC4ycyBlYXNlLWluLW91dH0udGh1bWJuYWlsIGE+aW1nLC50aHVtYm5haWw+aW1ne21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG99YS50aHVtYm5haWwuYWN0aXZlLGEudGh1bWJuYWlsOmZvY3VzLGEudGh1bWJuYWlsOmhvdmVye2JvcmRlci1jb2xvcjojMzM3YWI3fS50aHVtYm5haWwgLmNhcHRpb257cGFkZGluZzo5cHg7Y29sb3I6IzMzM30uYWxlcnR7cGFkZGluZzoxNXB4O21hcmdpbi1ib3R0b206MjBweDtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NHB4fS5hbGVydCBoNHttYXJnaW4tdG9wOjA7Y29sb3I6aW5oZXJpdH0uYWxlcnQgLmFsZXJ0LWxpbmt7Zm9udC13ZWlnaHQ6NzAwfS5hbGVydD5wLC5hbGVydD51bHttYXJnaW4tYm90dG9tOjB9LmFsZXJ0PnArcHttYXJnaW4tdG9wOjVweH0uYWxlcnQtZGlzbWlzc2FibGUsLmFsZXJ0LWRpc21pc3NpYmxle3BhZGRpbmctcmlnaHQ6MzVweH0uYWxlcnQtZGlzbWlzc2FibGUgLmNsb3NlLC5hbGVydC1kaXNtaXNzaWJsZSAuY2xvc2V7cG9zaXRpb246cmVsYXRpdmU7dG9wOi0ycHg7cmlnaHQ6LTIxcHg7Y29sb3I6aW5oZXJpdH0uYWxlcnQtc3VjY2Vzc3tjb2xvcjojM2M3NjNkO2JhY2tncm91bmQtY29sb3I6I2RmZjBkODtib3JkZXItY29sb3I6I2Q2ZTljNn0uYWxlcnQtc3VjY2VzcyBocntib3JkZXItdG9wLWNvbG9yOiNjOWUyYjN9LmFsZXJ0LXN1Y2Nlc3MgLmFsZXJ0LWxpbmt7Y29sb3I6IzJiNTQyY30uYWxlcnQtaW5mb3tjb2xvcjojMzE3MDhmO2JhY2tncm91bmQtY29sb3I6I2Q5ZWRmNztib3JkZXItY29sb3I6I2JjZThmMX0uYWxlcnQtaW5mbyBocntib3JkZXItdG9wLWNvbG9yOiNhNmUxZWN9LmFsZXJ0LWluZm8gLmFsZXJ0LWxpbmt7Y29sb3I6IzI0NTI2OX0uYWxlcnQtd2FybmluZ3tjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlMztib3JkZXItY29sb3I6I2ZhZWJjY30uYWxlcnQtd2FybmluZyBocntib3JkZXItdG9wLWNvbG9yOiNmN2UxYjV9LmFsZXJ0LXdhcm5pbmcgLmFsZXJ0LWxpbmt7Y29sb3I6IzY2NTEyY30uYWxlcnQtZGFuZ2Vye2NvbG9yOiNhOTQ0NDI7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlO2JvcmRlci1jb2xvcjojZWJjY2QxfS5hbGVydC1kYW5nZXIgaHJ7Ym9yZGVyLXRvcC1jb2xvcjojZTRiOWMwfS5hbGVydC1kYW5nZXIgLmFsZXJ0LWxpbmt7Y29sb3I6Izg0MzUzNH1ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXN7ZnJvbXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjQwcHggMH10b3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH19QC1vLWtleWZyYW1lcyBwcm9ncmVzcy1iYXItc3RyaXBlc3tmcm9te2JhY2tncm91bmQtcG9zaXRpb246NDBweCAwfXRve2JhY2tncm91bmQtcG9zaXRpb246MCAwfX1Aa2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVze2Zyb217YmFja2dyb3VuZC1wb3NpdGlvbjo0MHB4IDB9dG97YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9fS5wcm9ncmVzc3toZWlnaHQ6MjBweDttYXJnaW4tYm90dG9tOjIwcHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXItcmFkaXVzOjRweDstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjEpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjEpfS5wcm9ncmVzcy1iYXJ7ZmxvYXQ6bGVmdDt3aWR0aDowO2hlaWdodDoxMDAlO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjIwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMzMzdhYjc7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjE1KTtib3gtc2hhZG93Omluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsLjE1KTstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjZzIGVhc2U7LW8tdHJhbnNpdGlvbjp3aWR0aCAuNnMgZWFzZTt0cmFuc2l0aW9uOndpZHRoIC42cyBlYXNlfS5wcm9ncmVzcy1iYXItc3RyaXBlZCwucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFye2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7LXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6NDBweCA0MHB4O2JhY2tncm91bmQtc2l6ZTo0MHB4IDQwcHh9LnByb2dyZXNzLWJhci5hY3RpdmUsLnByb2dyZXNzLmFjdGl2ZSAucHJvZ3Jlc3MtYmFyey13ZWJraXQtYW5pbWF0aW9uOnByb2dyZXNzLWJhci1zdHJpcGVzIDJzIGxpbmVhciBpbmZpbml0ZTstby1hbmltYXRpb246cHJvZ3Jlc3MtYmFyLXN0cmlwZXMgMnMgbGluZWFyIGluZmluaXRlO2FuaW1hdGlvbjpwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGV9LnByb2dyZXNzLWJhci1zdWNjZXNze2JhY2tncm91bmQtY29sb3I6IzVjYjg1Y30ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLXN1Y2Nlc3N7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ucHJvZ3Jlc3MtYmFyLWluZm97YmFja2dyb3VuZC1jb2xvcjojNWJjMGRlfS5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItaW5mb3tiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpfS5wcm9ncmVzcy1iYXItd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmMGFkNGV9LnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhci13YXJuaW5ne2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCl9LnByb2dyZXNzLWJhci1kYW5nZXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1MzRmfS5wcm9ncmVzcy1zdHJpcGVkIC5wcm9ncmVzcy1iYXItZGFuZ2Vye2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQoNDVkZWcscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDI1JSx0cmFuc3BhcmVudCAyNSUsdHJhbnNwYXJlbnQgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDc1JSx0cmFuc3BhcmVudCA3NSUsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgMjUlLHRyYW5zcGFyZW50IDI1JSx0cmFuc3BhcmVudCA1MCUscmdiYSgyNTUsMjU1LDI1NSwuMTUpIDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNzUlLHRyYW5zcGFyZW50IDc1JSx0cmFuc3BhcmVudCl9Lm1lZGlhe21hcmdpbi10b3A6MTVweH0ubWVkaWE6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS5tZWRpYSwubWVkaWEtYm9keXtvdmVyZmxvdzpoaWRkZW47em9vbToxfS5tZWRpYS1ib2R5e3dpZHRoOjEwMDAwcHh9Lm1lZGlhLW9iamVjdHtkaXNwbGF5OmJsb2NrfS5tZWRpYS1vYmplY3QuaW1nLXRodW1ibmFpbHttYXgtd2lkdGg6bm9uZX0ubWVkaWEtcmlnaHQsLm1lZGlhPi5wdWxsLXJpZ2h0e3BhZGRpbmctbGVmdDoxMHB4fS5tZWRpYS1sZWZ0LC5tZWRpYT4ucHVsbC1sZWZ0e3BhZGRpbmctcmlnaHQ6MTBweH0ubWVkaWEtYm9keSwubWVkaWEtbGVmdCwubWVkaWEtcmlnaHR7ZGlzcGxheTp0YWJsZS1jZWxsO3ZlcnRpY2FsLWFsaWduOnRvcH0ubWVkaWEtbWlkZGxle3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWVkaWEtYm90dG9te3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0ubWVkaWEtaGVhZGluZ3ttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTo1cHh9Lm1lZGlhLWxpc3R7cGFkZGluZy1sZWZ0OjA7bGlzdC1zdHlsZTpub25lfS5saXN0LWdyb3Vwe3BhZGRpbmctbGVmdDowO21hcmdpbi1ib3R0b206MjBweH0ubGlzdC1ncm91cC1pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoxMHB4IDE1cHg7bWFyZ2luLWJvdHRvbTotMXB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNkZGR9Lmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHh9Lmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9YS5saXN0LWdyb3VwLWl0ZW0sYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbXtjb2xvcjojNTU1fWEubGlzdC1ncm91cC1pdGVtIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxidXR0b24ubGlzdC1ncm91cC1pdGVtIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjojMzMzfWEubGlzdC1ncm91cC1pdGVtOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtOmhvdmVyLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW06Zm9jdXMsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbTpob3Zlcntjb2xvcjojNTU1O3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX1idXR0b24ubGlzdC1ncm91cC1pdGVte3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpsZWZ0fS5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQsLmxpc3QtZ3JvdXAtaXRlbS5kaXNhYmxlZDpmb2N1cywubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmhvdmVye2NvbG9yOiM3Nzc7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZywubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZywubGlzdC1ncm91cC1pdGVtLmRpc2FibGVkOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fS5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LC5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LC5saXN0LWdyb3VwLWl0ZW0uZGlzYWJsZWQ6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0e2NvbG9yOiM3Nzd9Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXJ7ei1pbmRleDoyO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzM3YWI3O2JvcmRlci1jb2xvcjojMzM3YWI3fS5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZywubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmc+LnNtYWxsLC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZz5zbWFsbCwubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6Zm9jdXMgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nPi5zbWFsbCwubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmc+c21hbGwsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmhvdmVyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZz4uc21hbGwsLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nPnNtYWxse2NvbG9yOmluaGVyaXR9Lmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0LC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIC5saXN0LWdyb3VwLWl0ZW0tdGV4dCwubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciAubGlzdC1ncm91cC1pdGVtLXRleHR7Y29sb3I6I2M3ZGRlZn0ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3N7Y29sb3I6IzNjNzYzZDtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDh9YS5saXN0LWdyb3VwLWl0ZW0tc3VjY2VzcyxidXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3N7Y29sb3I6IzNjNzYzZH1hLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyxidXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne2NvbG9yOmluaGVyaXR9YS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpmb2N1cyxhLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzOmhvdmVyLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzczpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3M6aG92ZXJ7Y29sb3I6IzNjNzYzZDtiYWNrZ3JvdW5kLWNvbG9yOiNkMGU5YzZ9YS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmUsYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6Zm9jdXMsYS5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1zdWNjZXNzLmFjdGl2ZSxidXR0b24ubGlzdC1ncm91cC1pdGVtLXN1Y2Nlc3MuYWN0aXZlOmZvY3VzLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tc3VjY2Vzcy5hY3RpdmU6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzYzc2M2Q7Ym9yZGVyLWNvbG9yOiMzYzc2M2R9Lmxpc3QtZ3JvdXAtaXRlbS1pbmZve2NvbG9yOiMzMTcwOGY7YmFja2dyb3VuZC1jb2xvcjojZDllZGY3fWEubGlzdC1ncm91cC1pdGVtLWluZm8sYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZve2NvbG9yOiMzMTcwOGZ9YS5saXN0LWdyb3VwLWl0ZW0taW5mbyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fWEubGlzdC1ncm91cC1pdGVtLWluZm86Zm9jdXMsYS5saXN0LWdyb3VwLWl0ZW0taW5mbzpob3ZlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm86Zm9jdXMsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvOmhvdmVye2NvbG9yOiMzMTcwOGY7YmFja2dyb3VuZC1jb2xvcjojYzRlM2YzfWEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlLGEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmhvdmVyLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0taW5mby5hY3RpdmUsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1pbmZvLmFjdGl2ZTpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtLWluZm8uYWN0aXZlOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzE3MDhmO2JvcmRlci1jb2xvcjojMzE3MDhmfS5saXN0LWdyb3VwLWl0ZW0td2FybmluZ3tjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlM31hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZ3tjb2xvcjojOGE2ZDNifWEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZyAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmd7Y29sb3I6aW5oZXJpdH1hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtLXdhcm5pbmc6aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nOmZvY3VzLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZzpob3Zlcntjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZhZjJjY31hLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZSxhLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpmb2N1cyxhLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpob3ZlcixidXR0b24ubGlzdC1ncm91cC1pdGVtLXdhcm5pbmcuYWN0aXZlLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0td2FybmluZy5hY3RpdmU6Zm9jdXMsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS13YXJuaW5nLmFjdGl2ZTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzhhNmQzYjtib3JkZXItY29sb3I6IzhhNmQzYn0ubGlzdC1ncm91cC1pdGVtLWRhbmdlcntjb2xvcjojYTk0NDQyO2JhY2tncm91bmQtY29sb3I6I2YyZGVkZX1hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXJ7Y29sb3I6I2E5NDQ0Mn1hLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZ3tjb2xvcjppbmhlcml0fWEubGlzdC1ncm91cC1pdGVtLWRhbmdlcjpmb2N1cyxhLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6Zm9jdXMsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXI6aG92ZXJ7Y29sb3I6I2E5NDQ0MjtiYWNrZ3JvdW5kLWNvbG9yOiNlYmNjY2N9YS5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZSxhLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlOmZvY3VzLGEubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6aG92ZXIsYnV0dG9uLmxpc3QtZ3JvdXAtaXRlbS1kYW5nZXIuYWN0aXZlLGJ1dHRvbi5saXN0LWdyb3VwLWl0ZW0tZGFuZ2VyLmFjdGl2ZTpmb2N1cyxidXR0b24ubGlzdC1ncm91cC1pdGVtLWRhbmdlci5hY3RpdmU6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiNhOTQ0NDI7Ym9yZGVyLWNvbG9yOiNhOTQ0NDJ9Lmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5ne21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjVweH0ubGlzdC1ncm91cC1pdGVtLXRleHR7bWFyZ2luLWJvdHRvbTowO2xpbmUtaGVpZ2h0OjEuM30ucGFuZWx7bWFyZ2luLWJvdHRvbToyMHB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO2JveC1zaGFkb3c6MCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KX0ucGFuZWwtYm9keXtwYWRkaW5nOjE1cHh9LnBhbmVsLWhlYWRpbmd7cGFkZGluZzoxMHB4IDE1cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4fS5wYW5lbC1oZWFkaW5nPi5kcm9wZG93biAuZHJvcGRvd24tdG9nZ2xle2NvbG9yOmluaGVyaXR9LnBhbmVsLXRpdGxle21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Y29sb3I6aW5oZXJpdH0ucGFuZWwtdGl0bGU+LnNtYWxsLC5wYW5lbC10aXRsZT4uc21hbGw+YSwucGFuZWwtdGl0bGU+YSwucGFuZWwtdGl0bGU+c21hbGwsLnBhbmVsLXRpdGxlPnNtYWxsPmF7Y29sb3I6aW5oZXJpdH0ucGFuZWwtZm9vdGVye3BhZGRpbmc6MTBweCAxNXB4O2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXItdG9wOjFweCBzb2xpZCAjZGRkO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweH0ucGFuZWw+Lmxpc3QtZ3JvdXAsLnBhbmVsPi5wYW5lbC1jb2xsYXBzZT4ubGlzdC1ncm91cHttYXJnaW4tYm90dG9tOjB9LnBhbmVsPi5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW0sLnBhbmVsPi5wYW5lbC1jb2xsYXBzZT4ubGlzdC1ncm91cCAubGlzdC1ncm91cC1pdGVte2JvcmRlci13aWR0aDoxcHggMDtib3JkZXItcmFkaXVzOjB9LnBhbmVsPi5saXN0LWdyb3VwOmZpcnN0LWNoaWxkIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQsLnBhbmVsPi5wYW5lbC1jb2xsYXBzZT4ubGlzdC1ncm91cDpmaXJzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3A6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjNweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsPi5saXN0LWdyb3VwOmxhc3QtY2hpbGQgLmxpc3QtZ3JvdXAtaXRlbTpsYXN0LWNoaWxkLC5wYW5lbD4ucGFuZWwtY29sbGFwc2U+Lmxpc3QtZ3JvdXA6bGFzdC1jaGlsZCAubGlzdC1ncm91cC1pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweH0ucGFuZWw+LnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5saXN0LWdyb3VwIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LnBhbmVsLWhlYWRpbmcrLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLXdpZHRoOjB9Lmxpc3QtZ3JvdXArLnBhbmVsLWZvb3Rlcntib3JkZXItdG9wLXdpZHRoOjB9LnBhbmVsPi5wYW5lbC1jb2xsYXBzZT4udGFibGUsLnBhbmVsPi50YWJsZSwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxle21hcmdpbi1ib3R0b206MH0ucGFuZWw+LnBhbmVsLWNvbGxhcHNlPi50YWJsZSBjYXB0aW9uLC5wYW5lbD4udGFibGUgY2FwdGlvbiwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlIGNhcHRpb257cGFkZGluZy1yaWdodDoxNXB4O3BhZGRpbmctbGVmdDoxNXB4fS5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjNweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjNweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6Zmlyc3QtY2hpbGQ+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkPi50YWJsZTpmaXJzdC1jaGlsZD50aGVhZDpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpmaXJzdC1jaGlsZD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpmaXJzdC1jaGlsZD50Ym9keTpmaXJzdC1jaGlsZD50cjpmaXJzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6Zmlyc3QtY2hpbGQ+dGhlYWQ6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmZpcnN0LWNoaWxkPnRoZWFkOmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4fS5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Zm9vdDpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU6bGFzdC1jaGlsZD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlOmxhc3QtY2hpbGQ+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGZvb3Q6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmZpcnN0LWNoaWxke2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6M3B4fS5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRib2R5Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Ym9keTpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlOmxhc3QtY2hpbGQ+dGJvZHk6bGFzdC1jaGlsZD50cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZTpsYXN0LWNoaWxkPnRmb290Omxhc3QtY2hpbGQ+dHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGU6bGFzdC1jaGlsZD50Zm9vdDpsYXN0LWNoaWxkPnRyOmxhc3QtY2hpbGQgdGg6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czozcHh9LnBhbmVsPi5wYW5lbC1ib2R5Ky50YWJsZSwucGFuZWw+LnBhbmVsLWJvZHkrLnRhYmxlLXJlc3BvbnNpdmUsLnBhbmVsPi50YWJsZSsucGFuZWwtYm9keSwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmUrLnBhbmVsLWJvZHl7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZH0ucGFuZWw+LnRhYmxlPnRib2R5OmZpcnN0LWNoaWxkPnRyOmZpcnN0LWNoaWxkIHRkLC5wYW5lbD4udGFibGU+dGJvZHk6Zmlyc3QtY2hpbGQ+dHI6Zmlyc3QtY2hpbGQgdGh7Ym9yZGVyLXRvcDowfS5wYW5lbD4udGFibGUtYm9yZGVyZWQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZHtib3JkZXI6MH0ucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRkOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGg6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpmaXJzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyPnRoOmZpcnN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI+dGQ6Zmlyc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDowfS5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI+dGQ6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyPnRoOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cj50ZDpsYXN0LWNoaWxkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI+dGg6bGFzdC1jaGlsZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyPnRkOmxhc3QtY2hpbGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cj50aDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDowfS5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6Zmlyc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpmaXJzdC1jaGlsZD50aCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRoZWFkPnRyOmZpcnN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGgsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpmaXJzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmZpcnN0LWNoaWxkPnRoLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGhlYWQ+dHI6Zmlyc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50aGVhZD50cjpmaXJzdC1jaGlsZD50aHtib3JkZXItYm90dG9tOjB9LnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Ym9keT50cjpsYXN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6bGFzdC1jaGlsZD50aCwucGFuZWw+LnRhYmxlLWJvcmRlcmVkPnRmb290PnRyOmxhc3QtY2hpbGQ+dGQsLnBhbmVsPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRoLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGJvZHk+dHI6bGFzdC1jaGlsZD50ZCwucGFuZWw+LnRhYmxlLXJlc3BvbnNpdmU+LnRhYmxlLWJvcmRlcmVkPnRib2R5PnRyOmxhc3QtY2hpbGQ+dGgsLnBhbmVsPi50YWJsZS1yZXNwb25zaXZlPi50YWJsZS1ib3JkZXJlZD50Zm9vdD50cjpsYXN0LWNoaWxkPnRkLC5wYW5lbD4udGFibGUtcmVzcG9uc2l2ZT4udGFibGUtYm9yZGVyZWQ+dGZvb3Q+dHI6bGFzdC1jaGlsZD50aHtib3JkZXItYm90dG9tOjB9LnBhbmVsPi50YWJsZS1yZXNwb25zaXZle21hcmdpbi1ib3R0b206MDtib3JkZXI6MH0ucGFuZWwtZ3JvdXB7bWFyZ2luLWJvdHRvbToyMHB4fS5wYW5lbC1ncm91cCAucGFuZWx7bWFyZ2luLWJvdHRvbTowO2JvcmRlci1yYWRpdXM6NHB4fS5wYW5lbC1ncm91cCAucGFuZWwrLnBhbmVse21hcmdpbi10b3A6NXB4fS5wYW5lbC1ncm91cCAucGFuZWwtaGVhZGluZ3tib3JkZXItYm90dG9tOjB9LnBhbmVsLWdyb3VwIC5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZT4ubGlzdC1ncm91cCwucGFuZWwtZ3JvdXAgLnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGR9LnBhbmVsLWdyb3VwIC5wYW5lbC1mb290ZXJ7Ym9yZGVyLXRvcDowfS5wYW5lbC1ncm91cCAucGFuZWwtZm9vdGVyKy5wYW5lbC1jb2xsYXBzZSAucGFuZWwtYm9keXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGRkfS5wYW5lbC1kZWZhdWx0e2JvcmRlci1jb2xvcjojZGRkfS5wYW5lbC1kZWZhdWx0Pi5wYW5lbC1oZWFkaW5ne2NvbG9yOiMzMzM7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1jb2xvcjojZGRkfS5wYW5lbC1kZWZhdWx0Pi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNkZGR9LnBhbmVsLWRlZmF1bHQ+LnBhbmVsLWhlYWRpbmcgLmJhZGdle2NvbG9yOiNmNWY1ZjU7YmFja2dyb3VuZC1jb2xvcjojMzMzfS5wYW5lbC1kZWZhdWx0Pi5wYW5lbC1mb290ZXIrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci1ib3R0b20tY29sb3I6I2RkZH0ucGFuZWwtcHJpbWFyeXtib3JkZXItY29sb3I6IzMzN2FiN30ucGFuZWwtcHJpbWFyeT4ucGFuZWwtaGVhZGluZ3tjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzMzN2FiNztib3JkZXItY29sb3I6IzMzN2FiN30ucGFuZWwtcHJpbWFyeT4ucGFuZWwtaGVhZGluZysucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLXRvcC1jb2xvcjojMzM3YWI3fS5wYW5lbC1wcmltYXJ5Pi5wYW5lbC1oZWFkaW5nIC5iYWRnZXtjb2xvcjojMzM3YWI3O2JhY2tncm91bmQtY29sb3I6I2ZmZn0ucGFuZWwtcHJpbWFyeT4ucGFuZWwtZm9vdGVyKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItYm90dG9tLWNvbG9yOiMzMzdhYjd9LnBhbmVsLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNkNmU5YzZ9LnBhbmVsLXN1Y2Nlc3M+LnBhbmVsLWhlYWRpbmd7Y29sb3I6IzNjNzYzZDtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZDg7Ym9yZGVyLWNvbG9yOiNkNmU5YzZ9LnBhbmVsLXN1Y2Nlc3M+LnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci10b3AtY29sb3I6I2Q2ZTljNn0ucGFuZWwtc3VjY2Vzcz4ucGFuZWwtaGVhZGluZyAuYmFkZ2V7Y29sb3I6I2RmZjBkODtiYWNrZ3JvdW5kLWNvbG9yOiMzYzc2M2R9LnBhbmVsLXN1Y2Nlc3M+LnBhbmVsLWZvb3RlcisucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLWJvdHRvbS1jb2xvcjojZDZlOWM2fS5wYW5lbC1pbmZve2JvcmRlci1jb2xvcjojYmNlOGYxfS5wYW5lbC1pbmZvPi5wYW5lbC1oZWFkaW5ne2NvbG9yOiMzMTcwOGY7YmFja2dyb3VuZC1jb2xvcjojZDllZGY3O2JvcmRlci1jb2xvcjojYmNlOGYxfS5wYW5lbC1pbmZvPi5wYW5lbC1oZWFkaW5nKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItdG9wLWNvbG9yOiNiY2U4ZjF9LnBhbmVsLWluZm8+LnBhbmVsLWhlYWRpbmcgLmJhZGdle2NvbG9yOiNkOWVkZjc7YmFja2dyb3VuZC1jb2xvcjojMzE3MDhmfS5wYW5lbC1pbmZvPi5wYW5lbC1mb290ZXIrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci1ib3R0b20tY29sb3I6I2JjZThmMX0ucGFuZWwtd2FybmluZ3tib3JkZXItY29sb3I6I2ZhZWJjY30ucGFuZWwtd2FybmluZz4ucGFuZWwtaGVhZGluZ3tjb2xvcjojOGE2ZDNiO2JhY2tncm91bmQtY29sb3I6I2ZjZjhlMztib3JkZXItY29sb3I6I2ZhZWJjY30ucGFuZWwtd2FybmluZz4ucGFuZWwtaGVhZGluZysucGFuZWwtY29sbGFwc2U+LnBhbmVsLWJvZHl7Ym9yZGVyLXRvcC1jb2xvcjojZmFlYmNjfS5wYW5lbC13YXJuaW5nPi5wYW5lbC1oZWFkaW5nIC5iYWRnZXtjb2xvcjojZmNmOGUzO2JhY2tncm91bmQtY29sb3I6IzhhNmQzYn0ucGFuZWwtd2FybmluZz4ucGFuZWwtZm9vdGVyKy5wYW5lbC1jb2xsYXBzZT4ucGFuZWwtYm9keXtib3JkZXItYm90dG9tLWNvbG9yOiNmYWViY2N9LnBhbmVsLWRhbmdlcntib3JkZXItY29sb3I6I2ViY2NkMX0ucGFuZWwtZGFuZ2VyPi5wYW5lbC1oZWFkaW5ne2NvbG9yOiNhOTQ0NDI7YmFja2dyb3VuZC1jb2xvcjojZjJkZWRlO2JvcmRlci1jb2xvcjojZWJjY2QxfS5wYW5lbC1kYW5nZXI+LnBhbmVsLWhlYWRpbmcrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci10b3AtY29sb3I6I2ViY2NkMX0ucGFuZWwtZGFuZ2VyPi5wYW5lbC1oZWFkaW5nIC5iYWRnZXtjb2xvcjojZjJkZWRlO2JhY2tncm91bmQtY29sb3I6I2E5NDQ0Mn0ucGFuZWwtZGFuZ2VyPi5wYW5lbC1mb290ZXIrLnBhbmVsLWNvbGxhcHNlPi5wYW5lbC1ib2R5e2JvcmRlci1ib3R0b20tY29sb3I6I2ViY2NkMX0uZW1iZWQtcmVzcG9uc2l2ZXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2hlaWdodDowO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW59LmVtYmVkLXJlc3BvbnNpdmUgLmVtYmVkLXJlc3BvbnNpdmUtaXRlbSwuZW1iZWQtcmVzcG9uc2l2ZSBlbWJlZCwuZW1iZWQtcmVzcG9uc2l2ZSBpZnJhbWUsLmVtYmVkLXJlc3BvbnNpdmUgb2JqZWN0LC5lbWJlZC1yZXNwb25zaXZlIHZpZGVve3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjowfS5lbWJlZC1yZXNwb25zaXZlLTE2Ynk5e3BhZGRpbmctYm90dG9tOjU2LjI1JX0uZW1iZWQtcmVzcG9uc2l2ZS00Ynkze3BhZGRpbmctYm90dG9tOjc1JX0ud2VsbHttaW4taGVpZ2h0OjIwcHg7cGFkZGluZzoxOXB4O21hcmdpbi1ib3R0b206MjBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyOjFweCBzb2xpZCAjZTNlM2UzO2JvcmRlci1yYWRpdXM6NHB4Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KX0ud2VsbCBibG9ja3F1b3Rle2JvcmRlci1jb2xvcjojZGRkO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xNSl9LndlbGwtbGd7cGFkZGluZzoyNHB4O2JvcmRlci1yYWRpdXM6NnB4fS53ZWxsLXNte3BhZGRpbmc6OXB4O2JvcmRlci1yYWRpdXM6M3B4fS5jbG9zZXtmbG9hdDpyaWdodDtmb250LXNpemU6MjFweDtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTtjb2xvcjojMDAwO3RleHQtc2hhZG93OjAgMXB4IDAgI2ZmZjtmaWx0ZXI6YWxwaGEob3BhY2l0eT0yMCk7b3BhY2l0eTouMn0uY2xvc2U6Zm9jdXMsLmNsb3NlOmhvdmVye2NvbG9yOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZmlsdGVyOmFscGhhKG9wYWNpdHk9NTApO29wYWNpdHk6LjV9YnV0dG9uLmNsb3Nley13ZWJraXQtYXBwZWFyYW5jZTpub25lO3BhZGRpbmc6MDtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOjAgMDtib3JkZXI6MH0ubW9kYWwtb3BlbntvdmVyZmxvdzpoaWRkZW59Lm1vZGFse3Bvc2l0aW9uOmZpeGVkO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3otaW5kZXg6MTA1MDtkaXNwbGF5Om5vbmU7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO291dGxpbmU6MH0ubW9kYWwuZmFkZSAubW9kYWwtZGlhbG9ney13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZS1vdXQ7LW8tdHJhbnNpdGlvbjotby10cmFuc2Zvcm0gLjNzIGVhc2Utb3V0O3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyBlYXNlLW91dDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwtMjUlKTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZSgwLC0yNSUpOy1vLXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwtMjUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlKDAsLTI1JSl9Lm1vZGFsLmluIC5tb2RhbC1kaWFsb2d7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDAsMCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUoMCwwKTstby10cmFuc2Zvcm06dHJhbnNsYXRlKDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSgwLDApfS5tb2RhbC1vcGVuIC5tb2RhbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG99Lm1vZGFsLWRpYWxvZ3twb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDphdXRvO21hcmdpbjoxMHB4fS5tb2RhbC1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQtY29sb3I6I2ZmZjstd2Via2l0LWJhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjOTk5O2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7Ym9yZGVyLXJhZGl1czo2cHg7b3V0bGluZTowOy13ZWJraXQtYm94LXNoYWRvdzowIDNweCA5cHggcmdiYSgwLDAsMCwuNSk7Ym94LXNoYWRvdzowIDNweCA5cHggcmdiYSgwLDAsMCwuNSl9Lm1vZGFsLWJhY2tkcm9we3Bvc2l0aW9uOmZpeGVkO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3otaW5kZXg6MTA0MDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1vZGFsLWJhY2tkcm9wLmZhZGV7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowfS5tb2RhbC1iYWNrZHJvcC5pbntmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCk7b3BhY2l0eTouNX0ubW9kYWwtaGVhZGVye3BhZGRpbmc6MTVweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTVlNWU1fS5tb2RhbC1oZWFkZXIgLmNsb3Nle21hcmdpbi10b3A6LTJweH0ubW9kYWwtdGl0bGV7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MS40Mjg1NzE0M30ubW9kYWwtYm9keXtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjE1cHh9Lm1vZGFsLWZvb3RlcntwYWRkaW5nOjE1cHg7dGV4dC1hbGlnbjpyaWdodDtib3JkZXItdG9wOjFweCBzb2xpZCAjZTVlNWU1fS5tb2RhbC1mb290ZXIgLmJ0bisuYnRue21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDo1cHh9Lm1vZGFsLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0bnttYXJnaW4tbGVmdDotMXB4fS5tb2RhbC1mb290ZXIgLmJ0bi1ibG9jaysuYnRuLWJsb2Nre21hcmdpbi1sZWZ0OjB9Lm1vZGFsLXNjcm9sbGJhci1tZWFzdXJle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6c2Nyb2xsfUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXsubW9kYWwtZGlhbG9ne3dpZHRoOjYwMHB4O21hcmdpbjozMHB4IGF1dG99Lm1vZGFsLWNvbnRlbnR7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDE1cHggcmdiYSgwLDAsMCwuNSk7Ym94LXNoYWRvdzowIDVweCAxNXB4IHJnYmEoMCwwLDAsLjUpfS5tb2RhbC1zbXt3aWR0aDozMDBweH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpey5tb2RhbC1sZ3t3aWR0aDo5MDBweH19LnRvb2x0aXB7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDcwO2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6IkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mzt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXNoYWRvdzpub25lO3RleHQtdHJhbnNmb3JtOm5vbmU7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO3dvcmQtYnJlYWs6bm9ybWFsO3dvcmQtc3BhY2luZzpub3JtYWw7d29yZC13cmFwOm5vcm1hbDt3aGl0ZS1zcGFjZTpub3JtYWw7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MCk7b3BhY2l0eTowO2xpbmUtYnJlYWs6YXV0b30udG9vbHRpcC5pbntmaWx0ZXI6YWxwaGEob3BhY2l0eT05MCk7b3BhY2l0eTouOX0udG9vbHRpcC50b3B7cGFkZGluZzo1cHggMDttYXJnaW4tdG9wOi0zcHh9LnRvb2x0aXAucmlnaHR7cGFkZGluZzowIDVweDttYXJnaW4tbGVmdDozcHh9LnRvb2x0aXAuYm90dG9te3BhZGRpbmc6NXB4IDA7bWFyZ2luLXRvcDozcHh9LnRvb2x0aXAubGVmdHtwYWRkaW5nOjAgNXB4O21hcmdpbi1sZWZ0Oi0zcHh9LnRvb2x0aXAtaW5uZXJ7bWF4LXdpZHRoOjIwMHB4O3BhZGRpbmc6M3B4IDhweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDtib3JkZXItcmFkaXVzOjRweH0udG9vbHRpcC1hcnJvd3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowO2hlaWdodDowO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LnRvb2x0aXAudG9wIC50b29sdGlwLWFycm93e2JvdHRvbTowO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym9yZGVyLXdpZHRoOjVweCA1cHggMDtib3JkZXItdG9wLWNvbG9yOiMwMDB9LnRvb2x0aXAudG9wLWxlZnQgLnRvb2x0aXAtYXJyb3d7cmlnaHQ6NXB4O2JvdHRvbTowO21hcmdpbi1ib3R0b206LTVweDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci10b3AtY29sb3I6IzAwMH0udG9vbHRpcC50b3AtcmlnaHQgLnRvb2x0aXAtYXJyb3d7Ym90dG9tOjA7bGVmdDo1cHg7bWFyZ2luLWJvdHRvbTotNXB4O2JvcmRlci13aWR0aDo1cHggNXB4IDA7Ym9yZGVyLXRvcC1jb2xvcjojMDAwfS50b29sdGlwLnJpZ2h0IC50b29sdGlwLWFycm93e3RvcDo1MCU7bGVmdDowO21hcmdpbi10b3A6LTVweDtib3JkZXItd2lkdGg6NXB4IDVweCA1cHggMDtib3JkZXItcmlnaHQtY29sb3I6IzAwMH0udG9vbHRpcC5sZWZ0IC50b29sdGlwLWFycm93e3RvcDo1MCU7cmlnaHQ6MDttYXJnaW4tdG9wOi01cHg7Ym9yZGVyLXdpZHRoOjVweCAwIDVweCA1cHg7Ym9yZGVyLWxlZnQtY29sb3I6IzAwMH0udG9vbHRpcC5ib3R0b20gLnRvb2x0aXAtYXJyb3d7dG9wOjA7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTVweDtib3JkZXItd2lkdGg6MCA1cHggNXB4O2JvcmRlci1ib3R0b20tY29sb3I6IzAwMH0udG9vbHRpcC5ib3R0b20tbGVmdCAudG9vbHRpcC1hcnJvd3t0b3A6MDtyaWdodDo1cHg7bWFyZ2luLXRvcDotNXB4O2JvcmRlci13aWR0aDowIDVweCA1cHg7Ym9yZGVyLWJvdHRvbS1jb2xvcjojMDAwfS50b29sdGlwLmJvdHRvbS1yaWdodCAudG9vbHRpcC1hcnJvd3t0b3A6MDtsZWZ0OjVweDttYXJnaW4tdG9wOi01cHg7Ym9yZGVyLXdpZHRoOjAgNXB4IDVweDtib3JkZXItYm90dG9tLWNvbG9yOiMwMDB9LnBvcG92ZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3otaW5kZXg6MTA2MDtkaXNwbGF5Om5vbmU7bWF4LXdpZHRoOjI3NnB4O3BhZGRpbmc6MXB4O2ZvbnQtZmFtaWx5OiJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dGV4dC1hbGlnbjpsZWZ0O3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1zaGFkb3c6bm9uZTt0ZXh0LXRyYW5zZm9ybTpub25lO2xldHRlci1zcGFjaW5nOm5vcm1hbDt3b3JkLWJyZWFrOm5vcm1hbDt3b3JkLXNwYWNpbmc6bm9ybWFsO3dvcmQtd3JhcDpub3JtYWw7d2hpdGUtc3BhY2U6bm9ybWFsO2JhY2tncm91bmQtY29sb3I6I2ZmZjstd2Via2l0LWJhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtiYWNrZ3JvdW5kLWNsaXA6cGFkZGluZy1ib3g7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7Ym9yZGVyLXJhZGl1czo2cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzowIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpO2xpbmUtYnJlYWs6YXV0b30ucG9wb3Zlci50b3B7bWFyZ2luLXRvcDotMTBweH0ucG9wb3Zlci5yaWdodHttYXJnaW4tbGVmdDoxMHB4fS5wb3BvdmVyLmJvdHRvbXttYXJnaW4tdG9wOjEwcHh9LnBvcG92ZXIubGVmdHttYXJnaW4tbGVmdDotMTBweH0ucG9wb3Zlci10aXRsZXtwYWRkaW5nOjhweCAxNHB4O21hcmdpbjowO2ZvbnQtc2l6ZToxNHB4O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NXB4IDVweCAwIDB9LnBvcG92ZXItY29udGVudHtwYWRkaW5nOjlweCAxNHB4fS5wb3BvdmVyPi5hcnJvdywucG9wb3Zlcj4uYXJyb3c6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWR9LnBvcG92ZXI+LmFycm93e2JvcmRlci13aWR0aDoxMXB4fS5wb3BvdmVyPi5hcnJvdzphZnRlcntjb250ZW50OiIiO2JvcmRlci13aWR0aDoxMHB4fS5wb3BvdmVyLnRvcD4uYXJyb3d7Ym90dG9tOi0xMXB4O2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0xMXB4O2JvcmRlci10b3AtY29sb3I6Izk5OTtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjI1KTtib3JkZXItYm90dG9tLXdpZHRoOjB9LnBvcG92ZXIudG9wPi5hcnJvdzphZnRlcntib3R0b206MXB4O21hcmdpbi1sZWZ0Oi0xMHB4O2NvbnRlbnQ6IiAiO2JvcmRlci10b3AtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tLXdpZHRoOjB9LnBvcG92ZXIucmlnaHQ+LmFycm93e3RvcDo1MCU7bGVmdDotMTFweDttYXJnaW4tdG9wOi0xMXB4O2JvcmRlci1yaWdodC1jb2xvcjojOTk5O2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSk7Ym9yZGVyLWxlZnQtd2lkdGg6MH0ucG9wb3Zlci5yaWdodD4uYXJyb3c6YWZ0ZXJ7Ym90dG9tOi0xMHB4O2xlZnQ6MXB4O2NvbnRlbnQ6IiAiO2JvcmRlci1yaWdodC1jb2xvcjojZmZmO2JvcmRlci1sZWZ0LXdpZHRoOjB9LnBvcG92ZXIuYm90dG9tPi5hcnJvd3t0b3A6LTExcHg7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTExcHg7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20tY29sb3I6Izk5OTtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjI1KX0ucG9wb3Zlci5ib3R0b20+LmFycm93OmFmdGVye3RvcDoxcHg7bWFyZ2luLWxlZnQ6LTEwcHg7Y29udGVudDoiICI7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZn0ucG9wb3Zlci5sZWZ0Pi5hcnJvd3t0b3A6NTAlO3JpZ2h0Oi0xMXB4O21hcmdpbi10b3A6LTExcHg7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLWxlZnQtY29sb3I6Izk5OTtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4yNSl9LnBvcG92ZXIubGVmdD4uYXJyb3c6YWZ0ZXJ7cmlnaHQ6MXB4O2JvdHRvbTotMTBweDtjb250ZW50OiIgIjtib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItbGVmdC1jb2xvcjojZmZmfS5jYXJvdXNlbHtwb3NpdGlvbjpyZWxhdGl2ZX0uY2Fyb3VzZWwtaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW59LmNhcm91c2VsLWlubmVyPi5pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTstd2Via2l0LXRyYW5zaXRpb246LjZzIGVhc2UtaW4tb3V0IGxlZnQ7LW8tdHJhbnNpdGlvbjouNnMgZWFzZS1pbi1vdXQgbGVmdDt0cmFuc2l0aW9uOi42cyBlYXNlLWluLW91dCBsZWZ0fS5jYXJvdXNlbC1pbm5lcj4uaXRlbT5hPmltZywuY2Fyb3VzZWwtaW5uZXI+Lml0ZW0+aW1ne2xpbmUtaGVpZ2h0OjF9QG1lZGlhIGFsbCBhbmQgKHRyYW5zZm9ybS0zZCksKC13ZWJraXQtdHJhbnNmb3JtLTNkKXsuY2Fyb3VzZWwtaW5uZXI+Lml0ZW17LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC42cyBlYXNlLWluLW91dDstby10cmFuc2l0aW9uOi1vLXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0Oy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC1wZXJzcGVjdGl2ZToxMDAwcHg7cGVyc3BlY3RpdmU6MTAwMHB4fS5jYXJvdXNlbC1pbm5lcj4uaXRlbS5hY3RpdmUucmlnaHQsLmNhcm91c2VsLWlubmVyPi5pdGVtLm5leHR7bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfS5jYXJvdXNlbC1pbm5lcj4uaXRlbS5hY3RpdmUubGVmdCwuY2Fyb3VzZWwtaW5uZXI+Lml0ZW0ucHJldntsZWZ0OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0uY2Fyb3VzZWwtaW5uZXI+Lml0ZW0uYWN0aXZlLC5jYXJvdXNlbC1pbm5lcj4uaXRlbS5uZXh0LmxlZnQsLmNhcm91c2VsLWlubmVyPi5pdGVtLnByZXYucmlnaHR7bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfX0uY2Fyb3VzZWwtaW5uZXI+LmFjdGl2ZSwuY2Fyb3VzZWwtaW5uZXI+Lm5leHQsLmNhcm91c2VsLWlubmVyPi5wcmV2e2Rpc3BsYXk6YmxvY2t9LmNhcm91c2VsLWlubmVyPi5hY3RpdmV7bGVmdDowfS5jYXJvdXNlbC1pbm5lcj4ubmV4dCwuY2Fyb3VzZWwtaW5uZXI+LnByZXZ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwJX0uY2Fyb3VzZWwtaW5uZXI+Lm5leHR7bGVmdDoxMDAlfS5jYXJvdXNlbC1pbm5lcj4ucHJldntsZWZ0Oi0xMDAlfS5jYXJvdXNlbC1pbm5lcj4ubmV4dC5sZWZ0LC5jYXJvdXNlbC1pbm5lcj4ucHJldi5yaWdodHtsZWZ0OjB9LmNhcm91c2VsLWlubmVyPi5hY3RpdmUubGVmdHtsZWZ0Oi0xMDAlfS5jYXJvdXNlbC1pbm5lcj4uYWN0aXZlLnJpZ2h0e2xlZnQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTUlO2ZvbnQtc2l6ZToyMHB4O2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1zaGFkb3c6MCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTtmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCk7b3BhY2l0eTouNX0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCxyZ2JhKDAsMCwwLC41KSAwLHJnYmEoMCwwLDAsLjAwMDEpIDEwMCUpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KGxlZnQscmdiYSgwLDAsMCwuNSkgMCxyZ2JhKDAsMCwwLC4wMDAxKSAxMDAlKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IHRvcCxmcm9tKHJnYmEoMCwwLDAsLjUpKSx0byhyZ2JhKDAsMCwwLC4wMDAxKSkpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjUpIDAscmdiYSgwLDAsMCwuMDAwMSkgMTAwJSk7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjODAwMDAwMDAnLCBlbmRDb2xvcnN0cj0nIzAwMDAwMDAwJywgR3JhZGllbnRUeXBlPTEpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e3JpZ2h0OjA7bGVmdDphdXRvO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KGxlZnQscmdiYSgwLDAsMCwuMDAwMSkgMCxyZ2JhKDAsMCwwLC41KSAxMDAlKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IHRvcCxmcm9tKHJnYmEoMCwwLDAsLjAwMDEpKSx0byhyZ2JhKDAsMCwwLC41KSkpO2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDAwMDAwMDAnLCBlbmRDb2xvcnN0cj0nIzgwMDAwMDAwJywgR3JhZGllbnRUeXBlPTEpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sOmZvY3VzLC5jYXJvdXNlbC1jb250cm9sOmhvdmVye2NvbG9yOiNmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7ZmlsdGVyOmFscGhhKG9wYWNpdHk9OTApO291dGxpbmU6MDtvcGFjaXR5Oi45fS5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LC5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCwuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXZ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMTBweH0uY2Fyb3VzZWwtY29udHJvbCAuZ2x5cGhpY29uLWNoZXZyb24tbGVmdCwuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2e2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi0xMHB4fS5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCwuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0e3JpZ2h0OjUwJTttYXJnaW4tcmlnaHQ6LTEwcHh9LmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dCwuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2e3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Zm9udC1mYW1pbHk6c2VyaWY7bGluZS1oZWlnaHQ6MX0uY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1wcmV2OmJlZm9yZXtjb250ZW50OidcMjAzOSd9LmNhcm91c2VsLWNvbnRyb2wgLmljb24tbmV4dDpiZWZvcmV7Y29udGVudDonXDIwM2EnfS5jYXJvdXNlbC1pbmRpY2F0b3Jze3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbToxMHB4O2xlZnQ6NTAlO3otaW5kZXg6MTU7d2lkdGg6NjAlO3BhZGRpbmctbGVmdDowO21hcmdpbi1sZWZ0Oi0zMCU7dGV4dC1hbGlnbjpjZW50ZXI7bGlzdC1zdHlsZTpub25lfS5jYXJvdXNlbC1pbmRpY2F0b3JzIGxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7bWFyZ2luOjFweDt0ZXh0LWluZGVudDotOTk5cHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwXDk7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApO2JvcmRlcjoxcHggc29saWQgI2ZmZjtib3JkZXItcmFkaXVzOjEwcHh9LmNhcm91c2VsLWluZGljYXRvcnMgLmFjdGl2ZXt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O21hcmdpbjowO2JhY2tncm91bmQtY29sb3I6I2ZmZn0uY2Fyb3VzZWwtY2FwdGlvbntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxNSU7Ym90dG9tOjIwcHg7bGVmdDoxNSU7ei1pbmRleDoxMDtwYWRkaW5nLXRvcDoyMHB4O3BhZGRpbmctYm90dG9tOjIwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIDFweCAycHggcmdiYSgwLDAsMCwuNil9LmNhcm91c2VsLWNhcHRpb24gLmJ0bnt0ZXh0LXNoYWRvdzpub25lfUBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpey5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LC5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCwuY2Fyb3VzZWwtY29udHJvbCAuaWNvbi1uZXh0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXZ7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDttYXJnaW4tdG9wOi0xMHB4O2ZvbnQtc2l6ZTozMHB4fS5jYXJvdXNlbC1jb250cm9sIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLXByZXZ7bWFyZ2luLWxlZnQ6LTEwcHh9LmNhcm91c2VsLWNvbnRyb2wgLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0LC5jYXJvdXNlbC1jb250cm9sIC5pY29uLW5leHR7bWFyZ2luLXJpZ2h0Oi0xMHB4fS5jYXJvdXNlbC1jYXB0aW9ue3JpZ2h0OjIwJTtsZWZ0OjIwJTtwYWRkaW5nLWJvdHRvbTozMHB4fS5jYXJvdXNlbC1pbmRpY2F0b3Jze2JvdHRvbToyMHB4fX0uYnRuLWdyb3VwLXZlcnRpY2FsPi5idG4tZ3JvdXA6YWZ0ZXIsLmJ0bi1ncm91cC12ZXJ0aWNhbD4uYnRuLWdyb3VwOmJlZm9yZSwuYnRuLXRvb2xiYXI6YWZ0ZXIsLmJ0bi10b29sYmFyOmJlZm9yZSwuY2xlYXJmaXg6YWZ0ZXIsLmNsZWFyZml4OmJlZm9yZSwuY29udGFpbmVyLWZsdWlkOmFmdGVyLC5jb250YWluZXItZmx1aWQ6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXIsLmNvbnRhaW5lcjpiZWZvcmUsLmRsLWhvcml6b250YWwgZGQ6YWZ0ZXIsLmRsLWhvcml6b250YWwgZGQ6YmVmb3JlLC5mb3JtLWhvcml6b250YWwgLmZvcm0tZ3JvdXA6YWZ0ZXIsLmZvcm0taG9yaXpvbnRhbCAuZm9ybS1ncm91cDpiZWZvcmUsLm1vZGFsLWZvb3RlcjphZnRlciwubW9kYWwtZm9vdGVyOmJlZm9yZSwubW9kYWwtaGVhZGVyOmFmdGVyLC5tb2RhbC1oZWFkZXI6YmVmb3JlLC5uYXY6YWZ0ZXIsLm5hdjpiZWZvcmUsLm5hdmJhci1jb2xsYXBzZTphZnRlciwubmF2YmFyLWNvbGxhcHNlOmJlZm9yZSwubmF2YmFyLWhlYWRlcjphZnRlciwubmF2YmFyLWhlYWRlcjpiZWZvcmUsLm5hdmJhcjphZnRlciwubmF2YmFyOmJlZm9yZSwucGFnZXI6YWZ0ZXIsLnBhZ2VyOmJlZm9yZSwucGFuZWwtYm9keTphZnRlciwucGFuZWwtYm9keTpiZWZvcmUsLnJvdzphZnRlciwucm93OmJlZm9yZXtkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6IiAifS5idG4tZ3JvdXAtdmVydGljYWw+LmJ0bi1ncm91cDphZnRlciwuYnRuLXRvb2xiYXI6YWZ0ZXIsLmNsZWFyZml4OmFmdGVyLC5jb250YWluZXItZmx1aWQ6YWZ0ZXIsLmNvbnRhaW5lcjphZnRlciwuZGwtaG9yaXpvbnRhbCBkZDphZnRlciwuZm9ybS1ob3Jpem9udGFsIC5mb3JtLWdyb3VwOmFmdGVyLC5tb2RhbC1mb290ZXI6YWZ0ZXIsLm1vZGFsLWhlYWRlcjphZnRlciwubmF2OmFmdGVyLC5uYXZiYXItY29sbGFwc2U6YWZ0ZXIsLm5hdmJhci1oZWFkZXI6YWZ0ZXIsLm5hdmJhcjphZnRlciwucGFnZXI6YWZ0ZXIsLnBhbmVsLWJvZHk6YWZ0ZXIsLnJvdzphZnRlcntjbGVhcjpib3RofS5jZW50ZXItYmxvY2t7ZGlzcGxheTpibG9jazttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvfS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0IWltcG9ydGFudH0ucHVsbC1sZWZ0e2Zsb2F0OmxlZnQhaW1wb3J0YW50fS5oaWRle2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnNob3d7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0udGV4dC1oaWRle2ZvbnQ6MC8wIGE7Y29sb3I6dHJhbnNwYXJlbnQ7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowfS5oaWRkZW57ZGlzcGxheTpub25lIWltcG9ydGFudH0uYWZmaXh7cG9zaXRpb246Zml4ZWR9QC1tcy12aWV3cG9ydHt3aWR0aDpkZXZpY2Utd2lkdGh9LnZpc2libGUtbGcsLnZpc2libGUtbWQsLnZpc2libGUtc20sLnZpc2libGUteHN7ZGlzcGxheTpub25lIWltcG9ydGFudH0udmlzaWJsZS1sZy1ibG9jaywudmlzaWJsZS1sZy1pbmxpbmUsLnZpc2libGUtbGctaW5saW5lLWJsb2NrLC52aXNpYmxlLW1kLWJsb2NrLC52aXNpYmxlLW1kLWlubGluZSwudmlzaWJsZS1tZC1pbmxpbmUtYmxvY2ssLnZpc2libGUtc20tYmxvY2ssLnZpc2libGUtc20taW5saW5lLC52aXNpYmxlLXNtLWlubGluZS1ibG9jaywudmlzaWJsZS14cy1ibG9jaywudmlzaWJsZS14cy1pbmxpbmUsLnZpc2libGUteHMtaW5saW5lLWJsb2Nre2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey52aXNpYmxlLXhze2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fXRhYmxlLnZpc2libGUteHN7ZGlzcGxheTp0YWJsZSFpbXBvcnRhbnR9dHIudmlzaWJsZS14c3tkaXNwbGF5OnRhYmxlLXJvdyFpbXBvcnRhbnR9dGQudmlzaWJsZS14cyx0aC52aXNpYmxlLXhze2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsudmlzaWJsZS14cy1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey52aXNpYmxlLXhzLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9fUBtZWRpYSAobWF4LXdpZHRoOjc2N3B4KXsudmlzaWJsZS14cy1pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2shaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey52aXNpYmxlLXNte2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fXRhYmxlLnZpc2libGUtc217ZGlzcGxheTp0YWJsZSFpbXBvcnRhbnR9dHIudmlzaWJsZS1zbXtkaXNwbGF5OnRhYmxlLXJvdyFpbXBvcnRhbnR9dGQudmlzaWJsZS1zbSx0aC52aXNpYmxlLXNte2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LnZpc2libGUtc20tYmxvY2t7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LnZpc2libGUtc20taW5saW5le2Rpc3BsYXk6aW5saW5lIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudmlzaWJsZS1zbS1pbmxpbmUtYmxvY2t7ZGlzcGxheTppbmxpbmUtYmxvY2shaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCkgYW5kIChtYXgtd2lkdGg6MTE5OXB4KXsudmlzaWJsZS1tZHtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLW1ke2Rpc3BsYXk6dGFibGUhaW1wb3J0YW50fXRyLnZpc2libGUtbWR7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fXRkLnZpc2libGUtbWQsdGgudmlzaWJsZS1tZHtkaXNwbGF5OnRhYmxlLWNlbGwhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCkgYW5kIChtYXgtd2lkdGg6MTE5OXB4KXsudmlzaWJsZS1tZC1ibG9ja3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnZpc2libGUtbWQtaW5saW5le2Rpc3BsYXk6aW5saW5lIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnZpc2libGUtbWQtaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsudmlzaWJsZS1sZ3tkaXNwbGF5OmJsb2NrIWltcG9ydGFudH10YWJsZS52aXNpYmxlLWxne2Rpc3BsYXk6dGFibGUhaW1wb3J0YW50fXRyLnZpc2libGUtbGd7ZGlzcGxheTp0YWJsZS1yb3chaW1wb3J0YW50fXRkLnZpc2libGUtbGcsdGgudmlzaWJsZS1sZ3tkaXNwbGF5OnRhYmxlLWNlbGwhaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey52aXNpYmxlLWxnLWJsb2Nre2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fX1AbWVkaWEgKG1pbi13aWR0aDoxMjAwcHgpey52aXNpYmxlLWxnLWlubGluZXtkaXNwbGF5OmlubGluZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7LnZpc2libGUtbGctaW5saW5lLWJsb2Nre2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudH19QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpey5oaWRkZW4teHN7ZGlzcGxheTpub25lIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsuaGlkZGVuLXNte2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSAobWluLXdpZHRoOjk5MnB4KSBhbmQgKG1heC13aWR0aDoxMTk5cHgpey5oaWRkZW4tbWR7ZGlzcGxheTpub25lIWltcG9ydGFudH19QG1lZGlhIChtaW4td2lkdGg6MTIwMHB4KXsuaGlkZGVuLWxne2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fS52aXNpYmxlLXByaW50e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIHByaW50ey52aXNpYmxlLXByaW50e2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fXRhYmxlLnZpc2libGUtcHJpbnR7ZGlzcGxheTp0YWJsZSFpbXBvcnRhbnR9dHIudmlzaWJsZS1wcmludHtkaXNwbGF5OnRhYmxlLXJvdyFpbXBvcnRhbnR9dGQudmlzaWJsZS1wcmludCx0aC52aXNpYmxlLXByaW50e2Rpc3BsYXk6dGFibGUtY2VsbCFpbXBvcnRhbnR9fS52aXNpYmxlLXByaW50LWJsb2Nre2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIHByaW50ey52aXNpYmxlLXByaW50LWJsb2Nre2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fX0udmlzaWJsZS1wcmludC1pbmxpbmV7ZGlzcGxheTpub25lIWltcG9ydGFudH1AbWVkaWEgcHJpbnR7LnZpc2libGUtcHJpbnQtaW5saW5le2Rpc3BsYXk6aW5saW5lIWltcG9ydGFudH19LnZpc2libGUtcHJpbnQtaW5saW5lLWJsb2Nre2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIHByaW50ey52aXNpYmxlLXByaW50LWlubGluZS1ibG9ja3tkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9fUBtZWRpYSBwcmludHsuaGlkZGVuLXByaW50e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fQovKiMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAubWluLmNzcy5tYXAgKi8="}},"time_used":153,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":153,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/12.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.535Z","timestamp":1785147795535,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/12.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:30 GMT\r\naccept-ranges: bytes\r\ncontent-length: 146963\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":146963,"size_decoded":147439,"mime_type":"image/png","magic":"PNG image data, 796 x 427, 8-bit/color RGBA, non-interlaced","md5":"b9a74705f14930458f3a564e57ab9ea0","sha1":"d691036290ffa0b0c6fa93f6e9d98fd37e8ddb0e","sha256":"fd9e8c086aa29a891f01f5f4e7b19955af47139191c907b9a5f928b5d9460eaa","sha512":"7db2760cd7892c77571ecbf6bba63ba03705827b6e07d3ff1b43550cb57c8265cd8809646e1b99a86a002280f97365ffe66faad25e0cb4ccbc6f2ef66ad777e0","ssdeep":"3072:+POAcepmhdGPNSpb1QCOqNq0cUF9UT5l0MksK9A6EEZCF+D/M:F3eGUyZQCOSOcM5l0MklEEMu/M","tlshash":"57e312ecefb84a467d4f37905fe9da05c2c0f368668eb48a9acb294c3917d0095d44d1","first_seen":"2025-06-25T11:59:30.672162Z","last_seen":"2026-08-11T00:25:55.287372Z","times_seen":18,"resource_available":false,"data":"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"}},"time_used":696,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":338,"receive":358,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/images/video/2.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.536Z","timestamp":1785147795536,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /images/video/2.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=5, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:15 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 30 Jun 2024 21:09:32 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1023\r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1023,"size_decoded":1497,"mime_type":"image/png","magic":"PNG image data, 37 x 50, 8-bit colormap, non-interlaced","md5":"28cb98a3122ea224fd0219a73c05f69b","sha1":"7b2bee4f58f33d2d2644ea8c39c0b173d338edfa","sha256":"a30c329b67906b33e968ba606501139123b41b86a0332aa78c3a8a81d1b53741","sha512":"f9e192ddc840fa859b46a7c13ef2362c2b755ac1d576357c6b5305e5e170beb87600527775ea27e8d3a779245f4e368eb46b49889edb9d5c73a0fff64ddba748","ssdeep":"","tlshash":"c51144ae82d067f5e690123a560f9061cd216c9f60c04b04f20ef9a6b7712088267bcb","first_seen":"2025-05-31T01:51:37.455559Z","last_seen":"2026-08-11T00:25:55.275494Z","times_seen":27,"resource_available":false,"data":"iVBORw0KGgoAAAANSUhEUgAAACUAAAAyCAMAAADsk+ISAAABSlBMVEX///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9pDjIzAAAAbXRSTlMAAQIEBQYKDA8QFBUWGBobHR4fIiMoKSouLzEzNTY5P0BESE1SVFVeX2JkZ2hpbnByc3d4f4GEhoiJiouVlpmbnJ2eoKWmqqyvsra5u72+v8DCxMXGx8nM0tXY2drb3d7i7u/w8/b3+Pn6+/z+S9uGjAAAAfdJREFUOI2N1etfEkEUBuBXRDSuUSJKZaZGqWnkJVNJy7wiVhqKqajlffX8/187yy4yMzuHX++H3WXmYfacYQHASBcRdZmDSmKGillMavU8rqnY+WrKRKEa0aJ70d7/tL/dvVgkqoVMNkp0FFFeRw6JRgN3DFUKYW0gXPgVWIqZe4i/KZbKpeLb+MNIML3rt+TFWe815uKVAW+xWYeacWa9pQb2vB3hZlb41LlJejY7eXTFbz3Fd5kCOrbJzHYHMEl0m3RZbueEu5sPIKJ57vRkJ+cV1vYE6LuzqLs+IN2mtLBhQUQbep9J21K8WFJTY1ZENKapZUEt+/PVarUH+CGon0APC/DlY+BAUAfcJJ9cxWvtC2qf13JVPp+PAmuCWgOiLPzqPgjqvdZjRlDd+rb+lorXUrCqd4oYnAMeXVjQX37CPg3WTbREThqYs6iPvFsOlXgPED4iWgASlwF0wdMLRIf179YQlbN8KgYUvxfZMg15db2sH9M3BrpMKLMP+Waoz7Alp6P7rFVhT1Pf7QgTmhoXVLem0oLCmYJOJYQtRW2JaniymWFR/V+eH/9p5PiFqL4qdX0R1evmz5yTFxUSzxpJtCgs+6oR4UN0M6LUNSKqJUUtiSqze+2b691Mi8JmfDXTwvC/T6WOKpGWCpHp2lVt2kT/AOhIR+Csu739AAAAAElFTkSuQmCC"}},"time_used":692,"timings":{"blocked":-1,"dns":0,"connect":0,"send":0,"wait":692,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cdn.gtranslate.net/widgets/latest/float.js","fqdn":"cdn.gtranslate.net","domain":"gtranslate.net","tld":"net"},"ip":{"addr":"172.67.68.204","port":443,"asn":13335,"as":"CLOUDFLARENET","country":"","country_code":"zz"},"is_navigation_request":false,"resource_type":"script","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:15.505Z","timestamp":1785147795505,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_AES_128_GCM_SHA256","key_group_name":"mlkem768x25519","signature_name":"ECDSA-P256-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"gtranslate.net","organization":""},"issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validity":{"start":"Thu, 25 Jun 2026 02:04:42 GMT","end":"Wed, 23 Sep 2026 03:04:28 GMT"},"fingerprint":{"sha1":"7E:41:C7:FB:AD:E5:FE:5D:B3:02:94:54:88:D4:EE:DD:EA:46:BC:9C","sha256":"0F:62:03:25:71:9E:01:C5:E5:A6:FD:62:89:4B:D6:28:CC:04:66:24:A5:08:2F:E1:17:68:AA:E7:51:AA:E9:A3"}}},"request":{"raw":"GET /widgets/latest/float.js HTTP/1.1\r\nHost: cdn.gtranslate.net\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: */*\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-Fetch-Storage-Access: none\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nSec-Fetch-Dest: script\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: cross-site\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ndate: Mon, 27 Jul 2026 10:23:15 GMT\r\ncontent-type: application/javascript\r\nserver: cloudflare\r\nlast-modified: Wed, 06 May 2026 19:42:51 GMT\r\nnel: {\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}\r\nvary: accept-encoding\r\nexpires: Thu, 01 Jul 2027 02:02:58 GMT\r\ncache-control: max-age=31536000\r\nreport-to: {\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=KVVt5nJvf%2FlE3nmRMDFMqh7hEXsv3pT%2BF%2B6GaP37jD6PFRKdygjyNIiDS8%2BHbREs%2FK3CvuMncHRBr267SQ3SN4rYpmkWVK2nYoofrh9ysllIhYz1yegJEsUVefZFAj6Y3tvA4A%3D%3D\"}]}\r\nage: 2276417\r\ncf-cache-status: HIT\r\netag: W/\"69fb99bb-5a62\"\r\ncontent-encoding: br\r\ncf-ray: a21aed7a0ce20b4d-OSL\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"Cloudflare","description":"Cloudflare is a web-infrastructure and website-security company, providing content-delivery-network services, DDoS mitigation, Internet security, and distributed domain-name-server services.","website":"https://www.cloudflare.com","common_platform_enumeration":"","icon":"CloudFlare.svg","categories":["CDN"]}],"data":{"size":23138,"size_decoded":7509,"mime_type":"application/javascript","magic":"JavaScript source, ASCII text, with very long lines (3129)","md5":"68ee10aa7ede43f8bb3293b220daf775","sha1":"1f26a636577ea9aaa524c0a23ae8cf342be925e9","sha256":"76e28fc0425d80422e45305464ada45c7c9b4a00132c65012c737c22814c259f","sha512":"531d2baf5f4d61c0def2c5f45fd8d9b69b143c24d0474a01291d858b086b45c233d1cca885cc722d6e6eaff3f8cb62e637df797beca8f5aec20d090f0e23fe08","ssdeep":"384:UzCKMPZATN09o0mtvwfEXMb5TZ/dDszCnfYI:UVMhAh060svwcX0T1dhh","tlshash":"10a2c62921b3003a49531265efff165c607a02b78004ec24bfaeddc2dfd59a9caa77d5","first_seen":"2026-05-06T20:53:53.345523Z","last_seen":"2026-08-14T11:22:40.52916Z","times_seen":2313,"resource_available":true,"data":"LyohIENvcHlyaWdodCAoQykgR1RyYW5zbGF0ZSBJbmMuICovCihmdW5jdGlvbigpe2lmKCEoZG9jdW1lbnQuY3VycmVudFNjcmlwdCBpbnN0YW5jZW9mIEhUTUxTY3JpcHRFbGVtZW50KSlyZXR1cm47CiAgICB2YXIgZ3QgPSB3aW5kb3cuZ3RyYW5zbGF0ZVNldHRpbmdzIHx8IHt9OwogICAgZ3QgPSBndFtkb2N1bWVudC5jdXJyZW50U2NyaXB0LmdldEF0dHJpYnV0ZSgnZGF0YS1ndC13aWRnZXQtaWQnKV0gfHwgZ3Q7CgogICAgaWYoZ3QuZGVmYXVsdF9sYW5ndWFnZSA9PSBudWxsKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2d0cmFuc2xhdGVTZXR0aW5ncyBpcyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQnKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGxhbmdfYXJyYXlfZW5nbGlzaCA9IHsiYWYiOiJBZnJpa2FhbnMiLCJzcSI6IkFsYmFuaWFuIiwiYW0iOiJBbWhhcmljIiwiYXIiOiJBcmFiaWMiLCJoeSI6IkFybWVuaWFuIiwiYXoiOiJBemVyYmFpamFuaSIsImV1IjoiQmFzcXVlIiwiYmUiOiJCZWxhcnVzaWFuIiwiYm4iOiJCZW5nYWxpIiwiYnMiOiJCb3NuaWFuIiwiYmciOiJCdWxnYXJpYW4iLCJjYSI6IkNhdGFsYW4iLCJjZWIiOiJDZWJ1YW5vIiwibnkiOiJDaGljaGV3YSIsInpoLUNOIjoiQ2hpbmVzZSAoU2ltcGxpZmllZCkiLCJ6aC1UVyI6IkNoaW5lc2UgKFRyYWRpdGlvbmFsKSIsImNvIjoiQ29yc2ljYW4iLCJociI6IkNyb2F0aWFuIiwiY3MiOiJDemVjaCIsImRhIjoiRGFuaXNoIiwibmwiOiJEdXRjaCIsImVuIjoiRW5nbGlzaCIsImVvIjoiRXNwZXJhbnRvIiwiZXQiOiJFc3RvbmlhbiIsInRsIjoiRmlsaXBpbm8iLCJmaSI6IkZpbm5pc2giLCJmciI6IkZyZW5jaCIsImZ5IjoiRnJpc2lhbiIsImdsIjoiR2FsaWNpYW4iLCJrYSI6Ikdlb3JnaWFuIiwiZGUiOiJHZXJtYW4iLCJlbCI6IkdyZWVrIiwiZ3UiOiJHdWphcmF0aSIsImh0IjoiSGFpdGlhbiBDcmVvbGUiLCJoYSI6IkhhdXNhIiwiaGF3IjoiSGF3YWlpYW4iLCJpdyI6IkhlYnJldyIsImhpIjoiSGluZGkiLCJobW4iOiJIbW9uZyIsImh1IjoiSHVuZ2FyaWFuIiwiaXMiOiJJY2VsYW5kaWMiLCJpZyI6IklnYm8iLCJpZCI6IkluZG9uZXNpYW4iLCJnYSI6IklyaXNoIiwiaXQiOiJJdGFsaWFuIiwiamEiOiJKYXBhbmVzZSIsImp3IjoiSmF2YW5lc2UiLCJrbiI6Ikthbm5hZGEiLCJrayI6IkthemFraCIsImttIjoiS2htZXIiLCJrbyI6IktvcmVhbiIsImt1IjoiS3VyZGlzaCAoS3VybWFuamkpIiwia3kiOiJLeXJneXoiLCJsbyI6IkxhbyIsImxhIjoiTGF0aW4iLCJsdiI6IkxhdHZpYW4iLCJsdCI6IkxpdGh1YW5pYW4iLCJsYiI6Ikx1eGVtYm91cmdpc2giLCJtayI6Ik1hY2Vkb25pYW4iLCJtZyI6Ik1hbGFnYXN5IiwibXMiOiJNYWxheSIsIm1sIjoiTWFsYXlhbGFtIiwibXQiOiJNYWx0ZXNlIiwibWkiOiJNYW9yaSIsIm1yIjoiTWFyYXRoaSIsIm1uIjoiTW9uZ29saWFuIiwibXkiOiJNeWFubWFyIChCdXJtZXNlKSIsIm5lIjoiTmVwYWxpIiwibm8iOiJOb3J3ZWdpYW4iLCJwcyI6IlBhc2h0byIsImZhIjoiUGVyc2lhbiIsInBsIjoiUG9saXNoIiwicHQiOiJQb3J0dWd1ZXNlIiwicGEiOiJQdW5qYWJpIiwicm8iOiJSb21hbmlhbiIsInJ1IjoiUnVzc2lhbiIsInNtIjoiU2Ftb2FuIiwiZ2QiOiJTY290dGlzaCBHYWVsaWMiLCJzciI6IlNlcmJpYW4iLCJzdCI6IlNlc290aG8iLCJzbiI6IlNob25hIiwic2QiOiJTaW5kaGkiLCJzaSI6IlNpbmhhbGEiLCJzayI6IlNsb3ZhayIsInNsIjoiU2xvdmVuaWFuIiwic28iOiJTb21hbGkiLCJlcyI6IlNwYW5pc2giLCJzdSI6IlN1bmRhbmVzZSIsInN3IjoiU3dhaGlsaSIsInN2IjoiU3dlZGlzaCIsInRnIjoiVGFqaWsiLCJ0YSI6IlRhbWlsIiwidGUiOiJUZWx1Z3UiLCJ0aCI6IlRoYWkiLCJ0ciI6IlR1cmtpc2giLCJ1ayI6IlVrcmFpbmlhbiIsInVyIjoiVXJkdSIsInV6IjoiVXpiZWsiLCJ2aSI6IlZpZXRuYW1lc2UiLCJjeSI6IldlbHNoIiwieGgiOiJYaG9zYSIsInlpIjoiWWlkZGlzaCIsInlvIjoiWW9ydWJhIiwienUiOiJadWx1In07CiAgICB2YXIgbGFuZ19hcnJheV9uYXRpdmUgPSB7ImFmIjoiQWZyaWthYW5zIiwic3EiOiJTaHFpcCIsImFtIjoiXHUxMmEwXHUxMjFiXHUxMjJkXHUxMjliIiwiYXIiOiJcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjkiLCJoeSI6Ilx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiIsImF6IjoiQXpcdTAyNTlyYmF5Y2FuIGRpbGkiLCJldSI6IkV1c2thcmEiLCJiZSI6Ilx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiBcdTA0M2NcdTA0M2VcdTA0MzJcdTA0MzAiLCJibiI6Ilx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSIsImJzIjoiQm9zYW5za2kiLCJiZyI6Ilx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCIsImNhIjoiQ2F0YWxcdTAwZTAiLCJjZWIiOiJDZWJ1YW5vIiwibnkiOiJDaGljaGV3YSIsInpoLUNOIjoiXHU3YjgwXHU0ZjUzXHU0ZTJkXHU2NTg3IiwiemgtVFciOiJcdTdlNDFcdTlhZDRcdTRlMmRcdTY1ODciLCJjbyI6IkNvcnN1IiwiaHIiOiJIcnZhdHNraSIsImNzIjoiXHUwMTBjZVx1MDE2MXRpbmFcdTIwMGUiLCJkYSI6IkRhbnNrIiwibmwiOiJOZWRlcmxhbmRzIiwiZW4iOiJFbmdsaXNoIiwiZW8iOiJFc3BlcmFudG8iLCJldCI6IkVlc3RpIiwidGwiOiJGaWxpcGlubyIsImZpIjoiU3VvbWkiLCJmciI6IkZyYW5cdTAwZTdhaXMiLCJmeSI6IkZyeXNrIiwiZ2wiOiJHYWxlZ28iLCJrYSI6Ilx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCIsImRlIjoiRGV1dHNjaCIsImVsIjoiXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjIiwiZ3UiOiJcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAiLCJodCI6IktyZXlvbCBheWlzeWVuIiwiaGEiOiJIYXJzaGVuIEhhdXNhIiwiaGF3IjoiXHUwMTRjbGVsbyBIYXdhaVx1MDJiYmkiLCJpdyI6Ilx1MDVlMlx1MDViNFx1MDVkMVx1MDViMFx1MDVlOFx1MDViNFx1MDVkOVx1MDVlYSIsImhpIjoiXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwIiwiaG1uIjoiSG1vbmciLCJodSI6Ik1hZ3lhciIsImlzIjoiXHUwMGNkc2xlbnNrYSIsImlnIjoiSWdibyIsImlkIjoiQmFoYXNhIEluZG9uZXNpYSIsImdhIjoiR2FlaWxnZSIsIml0IjoiSXRhbGlhbm8iLCJqYSI6Ilx1NjVlNVx1NjcyY1x1OGE5ZSIsImp3IjoiQmFzYSBKYXdhIiwia24iOiJcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEiLCJrayI6Ilx1MDQ5YVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ5YiBcdTA0NDJcdTA0NTZcdTA0M2JcdTA0NTYiLCJrbSI6Ilx1MTc5N1x1MTdiNlx1MTc5Zlx1MTdiNlx1MTc4MVx1MTdkMlx1MTc5OFx1MTdjMlx1MTc5YSIsImtvIjoiXHVkNTVjXHVhZDZkXHVjNWI0Iiwia3UiOiJcdTA2NDNcdTA2NDhcdTA2MzFcdTA2MmZcdTA2Y2NcdTIwMGUiLCJreSI6Ilx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCIsImxvIjoiXHUwZTllXHUwZWIyXHUwZWFhXHUwZWIyXHUwZWE1XHUwZWIyXHUwZWE3IiwibGEiOiJMYXRpbiIsImx2IjoiTGF0dmllXHUwMTYxdSB2YWxvZGEiLCJsdCI6IkxpZXR1dmlcdTAxNzMga2FsYmEiLCJsYiI6IkxcdTAwZWJ0emVidWVyZ2VzY2giLCJtayI6Ilx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCBcdTA0NThcdTA0MzBcdTA0MzdcdTA0MzhcdTA0M2EiLCJtZyI6Ik1hbGFnYXN5IiwibXMiOiJCYWhhc2EgTWVsYXl1IiwibWwiOiJcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIiLCJtdCI6Ik1hbHRlc2UiLCJtaSI6IlRlIFJlbyBNXHUwMTAxb3JpIiwibXIiOiJcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAiLCJtbiI6Ilx1MDQxY1x1MDQzZVx1MDQzZFx1MDQzM1x1MDQzZVx1MDQzYiIsIm15IjoiXHUxMDE3XHUxMDE5XHUxMDJjXHUxMDA1XHUxMDJjIiwibmUiOiJcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzJcdTA5NDAiLCJubyI6Ik5vcnNrIGJva21cdTAwZTVsIiwicHMiOiJcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgiLCJmYSI6Ilx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYyIsInBsIjoiUG9sc2tpIiwicHQiOiJQb3J0dWd1XHUwMGVhcyIsInBhIjoiXHUwYTJhXHUwYTcwXHUwYTFjXHUwYTNlXHUwYTJjXHUwYTQwIiwicm8iOiJSb21cdTAwZTJuXHUwMTAzIiwicnUiOiJcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCJzbSI6IlNhbW9hbiIsImdkIjoiR1x1MDBlMGlkaGxpZyIsInNyIjoiXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFx1MDQ1OFx1MDQzNVx1MDQzN1x1MDQzOFx1MDQzYSIsInN0IjoiU2Vzb3RobyIsInNuIjoiU2hvbmEiLCJzZCI6Ilx1MDYzM1x1MDY0Nlx1MDY4Y1x1MDY0YSIsInNpIjoiXHUwZGMzXHUwZGQyXHUwZDgyXHUwZGM0XHUwZGJkIiwic2siOiJTbG92ZW5cdTAxMGRpbmEiLCJzbCI6IlNsb3Zlblx1MDE2MVx1MDEwZGluYSIsInNvIjoiQWZzb29tYWFsaSIsImVzIjoiRXNwYVx1MDBmMW9sIiwic3UiOiJCYXNhIFN1bmRhIiwic3ciOiJLaXN3YWhpbGkiLCJzdiI6IlN2ZW5za2EiLCJ0ZyI6Ilx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMyIsInRhIjoiXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkIiwidGUiOiJcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEiLCJ0aCI6Ilx1MGU0NFx1MGUxN1x1MGUyMiIsInRyIjoiVFx1MDBmY3JrXHUwMGU3ZSIsInVrIjoiXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwIiwidXIiOiJcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgiLCJ1eiI6Ik9cdTIwMTh6YmVrY2hhIiwidmkiOiJUaVx1MWViZm5nIFZpXHUxZWM3dCIsImN5IjoiQ3ltcmFlZyIsInhoIjoiaXNpWGhvc2EiLCJ5aSI6Ilx1MDVkOVx1MDVkOVx1MDVkM1x1MDVkOVx1MDVlOSIsInlvIjoiWW9yXHUwMGY5Ylx1MDBlMSIsInp1IjoiWnVsdSJ9OwoKICAgIHZhciBkZWZhdWx0X2xhbmd1YWdlID0gZ3QuZGVmYXVsdF9sYW5ndWFnZTsKICAgIHZhciBsYW5ndWFnZXMgPSBndC5sYW5ndWFnZXN8fE9iamVjdC5rZXlzKGxhbmdfYXJyYXlfZW5nbGlzaCk7CiAgICB2YXIgYWx0X2ZsYWdzID0gZ3QuYWx0X2ZsYWdzfHx7fTsKICAgIHZhciBmbGFnX3N0eWxlID0gZ3QuZmxhZ19zdHlsZXx8JzJkJzsKICAgIHZhciBmbGFnc19sb2NhdGlvbiA9IGd0LmZsYWdzX2xvY2F0aW9ufHwnaHR0cHM6Ly9jZG4uZ3RyYW5zbGF0ZS5uZXQvZmxhZ3MvJzsKICAgIHZhciB1cmxfc3RydWN0dXJlID0gZ3QudXJsX3N0cnVjdHVyZXx8J25vbmUnOwogICAgdmFyIGN1c3RvbV9kb21haW5zID0gZ3QuY3VzdG9tX2RvbWFpbnN8fHt9OwogICAgdmFyIHN3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24gPSBndC5zd2l0Y2hlcl9ob3Jpem9udGFsX3Bvc2l0aW9ufHwnbGVmdCc7CiAgICB2YXIgc3dpdGNoZXJfdmVydGljYWxfcG9zaXRpb24gPSBndC5zd2l0Y2hlcl92ZXJ0aWNhbF9wb3NpdGlvbnx8J2JvdHRvbSc7CiAgICB2YXIgZmxvYXRfc3dpdGNoZXJfb3Blbl9kaXJlY3Rpb24gPSBndC5mbG9hdF9zd2l0Y2hlcl9vcGVuX2RpcmVjdGlvbnx8J3RvcCc7CiAgICB2YXIgbmF0aXZlX2xhbmd1YWdlX25hbWVzID0gZ3QubmF0aXZlX2xhbmd1YWdlX25hbWVzfHxmYWxzZTsKICAgIHZhciBkZXRlY3RfYnJvd3Nlcl9sYW5ndWFnZSA9IGd0LmRldGVjdF9icm93c2VyX2xhbmd1YWdlfHxmYWxzZTsKICAgIHZhciB3cmFwcGVyX3NlbGVjdG9yID0gZ3Qud3JhcHBlcl9zZWxlY3Rvcnx8Jy5ndHJhbnNsYXRlX3dyYXBwZXInOwoKICAgIHZhciBjdXN0b21fY3NzID0gZ3QuY3VzdG9tX2Nzc3x8Jyc7CiAgICB2YXIgbGFuZ19hcnJheSA9IG5hdGl2ZV9sYW5ndWFnZV9uYW1lcyAmJiBsYW5nX2FycmF5X25hdGl2ZSB8fCBsYW5nX2FycmF5X2VuZ2xpc2g7CgogICAgdmFyIHVfY2xhc3MgPSAnLmd0X2NvbnRhaW5lci0nK0FycmF5LmZyb20oJ2Zsb2F0Jyt3cmFwcGVyX3NlbGVjdG9yKS5yZWR1Y2UoZnVuY3Rpb24oaCxjKXtyZXR1cm4gMHwoMzEqaCtjLmNoYXJDb2RlQXQoMCkpfSwwKS50b1N0cmluZygzNik7CgogICAgdmFyIHdpZGdldF9jb2RlID0gJzwhLS0gR1RyYW5zbGF0ZTogaHR0cHM6Ly9ndHJhbnNsYXRlLmNvbSAtLT4nOwogICAgdmFyIHdpZGdldF9jc3MgPSBjdXN0b21fY3NzOwoKICAgIGZsYWdzX2xvY2F0aW9uICs9IChmbGFnX3N0eWxlPT0nM2QnPzMyOidzdmcnKSsnLyc7CiAgICB2YXIgZmxhZ19leHQgPSBmbGFnX3N0eWxlPT0nM2QnPycucG5nJzonLnN2Zyc7CgogICAgLy8gaGVscGVyIGZ1bmN0aW9ucwogICAgZnVuY3Rpb24gZ2V0X2ZsYWdfc3JjKGxhbmcpIHsKICAgICAgICBpZighYWx0X2ZsYWdzW2xhbmddKQogICAgICAgICAgICByZXR1cm4gZmxhZ3NfbG9jYXRpb24rbGFuZytmbGFnX2V4dDsKICAgICAgICBlbHNlIGlmKGFsdF9mbGFnc1tsYW5nXSA9PSAndXNhJykKICAgICAgICAgICAgcmV0dXJuIGZsYWdzX2xvY2F0aW9uKydlbi11cycrZmxhZ19leHQ7CiAgICAgICAgZWxzZSBpZihhbHRfZmxhZ3NbbGFuZ10gPT0gJ2NhbmFkYScpCiAgICAgICAgICAgIHJldHVybiBmbGFnc19sb2NhdGlvbisnZW4tY2EnK2ZsYWdfZXh0OwogICAgICAgIGVsc2UgaWYoYWx0X2ZsYWdzW2xhbmddID09ICdicmF6aWwnKQogICAgICAgICAgICByZXR1cm4gZmxhZ3NfbG9jYXRpb24rJ3B0LWJyJytmbGFnX2V4dDsKICAgICAgICBlbHNlIGlmKGFsdF9mbGFnc1tsYW5nXSA9PSAnbWV4aWNvJykKICAgICAgICAgICAgcmV0dXJuIGZsYWdzX2xvY2F0aW9uKydlcy1teCcrZmxhZ19leHQ7CiAgICAgICAgZWxzZSBpZihhbHRfZmxhZ3NbbGFuZ10gPT0gJ2FyZ2VudGluYScpCiAgICAgICAgICAgIHJldHVybiBmbGFnc19sb2NhdGlvbisnZXMtYXInK2ZsYWdfZXh0OwogICAgICAgIGVsc2UgaWYoYWx0X2ZsYWdzW2xhbmddID09ICdjb2xvbWJpYScpCiAgICAgICAgICAgIHJldHVybiBmbGFnc19sb2NhdGlvbisnZXMtY28nK2ZsYWdfZXh0OwogICAgICAgIGVsc2UgaWYoYWx0X2ZsYWdzW2xhbmddID09ICdxdWViZWMnKQogICAgICAgICAgICByZXR1cm4gZmxhZ3NfbG9jYXRpb24rJ2ZyLXFjJytmbGFnX2V4dDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBhbHRfZmxhZ3NbbGFuZ107CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0X2xhbmdfaHJlZihsYW5nKSB7CiAgICAgICAgdmFyIGhyZWYgPSAnIyc7CgogICAgICAgIGlmKHVybF9zdHJ1Y3R1cmUgPT0gJ3N1Yl9kaXJlY3RvcnknKSB7CiAgICAgICAgICAgIHZhciBndF9yZXF1ZXN0X3VyaSA9IChkb2N1bWVudC5jdXJyZW50U2NyaXB0LmdldEF0dHJpYnV0ZSgnZGF0YS1ndC1vcmlnLXVybCcpIHx8IChsb2NhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvJytjdXJyZW50X2xhbmcrJy8nKSAmJiAnLycrbG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKS5zbGljZSgyKS5qb2luKCcvJykgfHwgbG9jYXRpb24ucGF0aG5hbWUpKSArIGxvY2F0aW9uLnNlYXJjaCArIGxvY2F0aW9uLmhhc2g7CiAgICAgICAgICAgIGhyZWYgPSAobGFuZyA9PSBkZWZhdWx0X2xhbmd1YWdlKSAmJiBsb2NhdGlvbi5wcm90b2NvbCsnLy8nK2xvY2F0aW9uLmhvc3RuYW1lK2d0X3JlcXVlc3RfdXJpIHx8IGxvY2F0aW9uLnByb3RvY29sKycvLycrbG9jYXRpb24uaG9zdG5hbWUrJy8nK2xhbmcrZ3RfcmVxdWVzdF91cmk7CiAgICAgICAgfSBlbHNlIGlmKHVybF9zdHJ1Y3R1cmUgPT0gJ3N1Yl9kb21haW4nKSB7CiAgICAgICAgICAgIHZhciBndF9yZXF1ZXN0X3VyaSA9IChkb2N1bWVudC5jdXJyZW50U2NyaXB0LmdldEF0dHJpYnV0ZSgnZGF0YS1ndC1vcmlnLXVybCcpIHx8IGxvY2F0aW9uLnBhdGhuYW1lKSArIGxvY2F0aW9uLnNlYXJjaCArIGxvY2F0aW9uLmhhc2g7CiAgICAgICAgICAgIHZhciBkb21haW4gPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LmdldEF0dHJpYnV0ZSgnZGF0YS1ndC1vcmlnLWRvbWFpbicpIHx8IGxvY2F0aW9uLmhvc3RuYW1lOwogICAgICAgICAgICBpZih0eXBlb2YgY3VzdG9tX2RvbWFpbnMgPT0gJ29iamVjdCcgJiYgY3VzdG9tX2RvbWFpbnNbbGFuZ10pCiAgICAgICAgICAgICAgICBocmVmID0gKGxhbmcgPT0gZGVmYXVsdF9sYW5ndWFnZSkgJiYgbG9jYXRpb24ucHJvdG9jb2wrJy8vJytkb21haW4rZ3RfcmVxdWVzdF91cmkgfHwgbG9jYXRpb24ucHJvdG9jb2wrJy8vJytjdXN0b21fZG9tYWluc1tsYW5nXStndF9yZXF1ZXN0X3VyaTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgaHJlZiA9IChsYW5nID09IGRlZmF1bHRfbGFuZ3VhZ2UpICYmIGxvY2F0aW9uLnByb3RvY29sKycvLycrZG9tYWluK2d0X3JlcXVlc3RfdXJpIHx8IGxvY2F0aW9uLnByb3RvY29sKycvLycrbGFuZysnLicrZG9tYWluLnJlcGxhY2UoL153d3dcLi8sICcnKStndF9yZXF1ZXN0X3VyaTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBocmVmOwogICAgfQoKICAgIHZhciBjdXJyZW50X2xhbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJykuZ2V0QXR0cmlidXRlKCdsYW5nJyl8fGRlZmF1bHRfbGFuZ3VhZ2U7CiAgICBpZih1cmxfc3RydWN0dXJlID09ICdub25lJykgewogICAgICAgIHZhciBnb29ndHJhbnNfbWF0Y2hlcyA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCgnKF58OykgP2dvb2d0cmFucz0oW147XSopKDt8JCknKTsKICAgICAgICBjdXJyZW50X2xhbmcgPSBnb29ndHJhbnNfbWF0Y2hlcyAmJiBnb29ndHJhbnNfbWF0Y2hlc1syXS5zcGxpdCgnLycpWzJdIHx8IGN1cnJlbnRfbGFuZzsKICAgIH0KCiAgICBpZighbGFuZ19hcnJheVtjdXJyZW50X2xhbmddKQogICAgICAgIGN1cnJlbnRfbGFuZyA9IGRlZmF1bHRfbGFuZ3VhZ2U7CgogICAgaWYodXJsX3N0cnVjdHVyZSA9PSAnbm9uZScpIHsKICAgICAgICB3aWRnZXRfY29kZSArPSAnPGRpdiBpZD0iZ29vZ2xlX3RyYW5zbGF0ZV9lbGVtZW50MiI+PC9kaXY+JzsKCiAgICAgICAgd2lkZ2V0X2NzcyArPSAiZGl2LnNraXB0cmFuc2xhdGUsI2dvb2dsZV90cmFuc2xhdGVfZWxlbWVudDJ7ZGlzcGxheTpub25lIWltcG9ydGFudH0iOwogICAgICAgIHdpZGdldF9jc3MgKz0gImJvZHl7dG9wOjAhaW1wb3J0YW50fSI7CiAgICAgICAgd2lkZ2V0X2NzcyArPSAiZm9udCBmb250e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7cG9zaXRpb246aW5pdGlhbCFpbXBvcnRhbnR9IjsKICAgIH0KCiAgICB3aWRnZXRfY3NzICs9ICcuZ3RfZmxvYXRfc3dpdGNoZXJ7Zm9udC1mYW1pbHk6QXJpYWw7Zm9udC1zaXplOjIwcHg7Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6IzU1NTtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyMHB4O2JveC1zaGFkb3c6cmdiYSgwLDAsMCwwLjE1KSAwIDVweCAxNXB4O2JhY2tncm91bmQ6I2ZmZjtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjphbGwgLjVzIGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpfSc7CiAgICB3aWRnZXRfY3NzICs9ICcuZ3RfZmxvYXRfc3dpdGNoZXIgaW1ne3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDozM3B4O2hlaWdodDphdXRvO21hcmdpbjowIDVweCAwIDA7Ym9yZGVyLXJhZGl1czozcHh9JzsKICAgIGlmKGZsb2F0X3N3aXRjaGVyX29wZW5fZGlyZWN0aW9uID09ICdsZWZ0JyB8fCBmbG9hdF9zd2l0Y2hlcl9vcGVuX2RpcmVjdGlvbiA9PSAncmlnaHQnKSB7CiAgICAgICAgdmFyIG1heF93aWR0aCA9IDAuNyAqIHdpbmRvdy5pbm5lcldpZHRoIC0gMTIwOwogICAgICAgIGlmKHdpbmRvdy5pbm5lcldpZHRoIDwgMTAwMCkKICAgICAgICAgICAgbWF4X3dpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSAyNjA7CiAgICAgICAgbWF4X3dpZHRoICs9ICdweCc7CgogICAgICAgIGlmKHN3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24gPT0gJ2lubGluZScpCiAgICAgICAgICAgIG1heF93aWR0aCA9ICdjYWxjKDEwMCUgLSAxMjJweCknOwoKICAgICAgICAvLyB0b2RvOiBvcHRpbWl6ZQogICAgICAgIHdpZGdldF9jc3MgKz0gJy5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Rfb3B0aW9uc3twb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4Ojc3Nzt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxvYXQ6JytmbG9hdF9zd2l0Y2hlcl9vcGVuX2RpcmVjdGlvbisnO21heC13aWR0aDonK21heF93aWR0aCsnO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtJyt3aW5kb3cuaW5uZXJXaWR0aCsncHgpO29wYWNpdHk6MDtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmFsbCAuOHMgY3ViaWMtYmV6aWVyKC4zLDEuMSwuNCwxLjEpfSc7CiAgICAgICAgd2lkZ2V0X2NzcyArPSAnLmd0X2Zsb2F0X3N3aXRjaGVyIC5ndF9vcHRpb25zIGF7ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cGFkZGluZzonKyhmbGFnX3N0eWxlPT0nM2QnPzY6MTApKydweCAxNXB4O2NvbG9yOiM0NDQ7dHJhbnNpdGlvbjpjb2xvciAuNHMgbGluZWFyfSc7CiAgICAgICAgd2lkZ2V0X2NzcyArPSAnLmd0X2Zsb2F0X3N3aXRjaGVyIC5ndC1zZWxlY3RlZHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4Ojg4ODtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7ZmxvYXQ6bGVmdDtjdXJzb3I6cG9pbnRlcjt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7b3ZlcmZsb3c6aGlkZGVuOycrKHN3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24gIT0gJ2lubGluZScgJiYgJ3RleHQtYWxpZ246Jytzd2l0Y2hlcl9ob3Jpem9udGFsX3Bvc2l0aW9uKSsnfSc7CiAgICB9IGVsc2UgewogICAgICAgIHdpZGdldF9jc3MgKz0gJy5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Rfb3B0aW9uc3twb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4Ojc3NzttYXgtaGVpZ2h0OjI1MHB4O292ZXJmbG93LXk6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMzBweCk7b3BhY2l0eTowO2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YWxsIC44cyBjdWJpYy1iZXppZXIoLjMsMS4xLC40LDEuMSl9JzsKICAgICAgICB3aWRnZXRfY3NzICs9ICcuZ3RfZmxvYXRfc3dpdGNoZXIgLmd0X29wdGlvbnMgYXtkaXNwbGF5OmJsb2NrO3RleHQtZGVjb3JhdGlvbjpub25lO3BhZGRpbmc6JysoZmxhZ19zdHlsZT09JzNkJz82OjEwKSsncHggMTVweDtjb2xvcjojNDQ0O3RyYW5zaXRpb246Y29sb3IgLjRzIGxpbmVhcn0nOwogICAgICAgIHdpZGdldF9jc3MgKz0gJy5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Qtc2VsZWN0ZWR7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDo4ODg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtvdmVyZmxvdzpoaWRkZW47Jysoc3dpdGNoZXJfaG9yaXpvbnRhbF9wb3NpdGlvbiAhPSAnaW5saW5lJyAmJiAndGV4dC1hbGlnbjonK3N3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24pKyd9JzsKICAgIH0KICAgIHdpZGdldF9jc3MgKz0gJy5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Rfb3B0aW9ucy5ndC1vcGVue29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwcHgpfSc7CgogICAgd2lkZ2V0X2NzcyArPSAnLmd0X2Zsb2F0X3N3aXRjaGVyIC5ndF9vcHRpb25zOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjV9JzsKICAgIHdpZGdldF9jc3MgKz0gJy5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Rfb3B0aW9uczo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6NXB4fSc7CiAgICB3aWRnZXRfY3NzICs9ICcuZ3RfZmxvYXRfc3dpdGNoZXIgLmd0X29wdGlvbnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQtY29sb3I6Izg4OH0nOwogICAgd2lkZ2V0X2NzcyArPSAnLmd0X2Zsb2F0X3N3aXRjaGVyIC5ndF9vcHRpb25zIGE6aG92ZXJ7YmFja2dyb3VuZDojNjA3MGEwO2NvbG9yOiNmZmZ9JzsKICAgIHdpZGdldF9jc3MgKz0gJy5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Rfb3B0aW9ucyBhLmd0LWN1cnJlbnR7ZGlzcGxheTpub25lfSc7CiAgICB3aWRnZXRfY3NzICs9ICcuZ3RfZmxvYXRfc3dpdGNoZXIgLmd0LXNlbGVjdGVkIC5ndC1jdXJyZW50LWxhbmd7cGFkZGluZzonKyhmbGFnX3N0eWxlPT0nM2QnPzY6MTApKydweCAxNXB4O2NvbG9yOiMzMzM7Zm9udC13ZWlnaHQ6Ym9sZH0nOwogICAgd2lkZ2V0X2NzcyArPSAnLmd0X2Zsb2F0X3N3aXRjaGVyIC5ndC1zZWxlY3RlZCAuZ3QtY3VycmVudC1sYW5nIHNwYW4uZ3QtbGFuZy1jb2Rle3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDoycHh9JzsKCiAgICB2YXIgYXJyX2FuZ2xlID0gKGZsb2F0X3N3aXRjaGVyX29wZW5fZGlyZWN0aW9uID09ICdsZWZ0J3x8ZmxvYXRfc3dpdGNoZXJfb3Blbl9kaXJlY3Rpb24gPT0gJ3JpZ2h0Jyk/OTA6MDsKICAgIHdpZGdldF9jc3MgKz0gIi5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Qtc2VsZWN0ZWQgLmd0LWN1cnJlbnQtbGFuZyBzcGFuLmd0X2Zsb2F0X3N3aXRjaGVyLWFycm93e2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyNHB4O3dpZHRoOjE1cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDI4NSAyODUnPjxwYXRoIGQ9J00yODIgNzYuNWwtMTQuMi0xNC4zYTkgOSAwIDAgMC0xMy4xIDBMMTQyLjUgMTc0LjQgMzAuMyA2Mi4yYTkgOSAwIDAgMC0xMy4yIDBMMyA3Ni41YTkgOSAwIDAgMCAwIDEzLjFsMTMzIDEzM2E5IDkgMCAwIDAgMTMuMSAwbDEzMy0xMzNhOSA5IDAgMCAwIDAtMTN6JyBzdHlsZT0nZmlsbDolMjM2NjYnLz48L3N2Zz5cIik7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7YmFja2dyb3VuZC1zaXplOjExcHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O3RyYW5zaXRpb246YWxsIC4zczt0cmFuc2Zvcm06cm90YXRlKCIrKGFycl9hbmdsZS0xODApKyJkZWcpfSI7CiAgICB3aWRnZXRfY3NzICs9ICcuZ3RfZmxvYXRfc3dpdGNoZXIgLmd0LXNlbGVjdGVkIC5ndC1jdXJyZW50LWxhbmcgc3Bhbi5ndF9mbG9hdF9zd2l0Y2hlci1hcnJvdy5ndF9hcnJvd19yb3RhdGV7dHJhbnNmb3JtOnJvdGF0ZSgnK2Fycl9hbmdsZSsnZGVnKX0nOwoKICAgIGlmKHN3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24gPT0gJ2lubGluZScpCiAgICAgICAgd2lkZ2V0X2NvZGUgKz0gJzxkaXYgaWQ9Imd0X2Zsb2F0X3dyYXBwZXIiPjxkaXYgY2xhc3M9Imd0X2Zsb2F0X3N3aXRjaGVyIG5vdHJhbnNsYXRlIiBzdHlsZT0ib3BhY2l0eTowIj4nOwogICAgZWxzZQogICAgICAgIHdpZGdldF9jb2RlICs9ICc8ZGl2IGlkPSJndF9mbG9hdF93cmFwcGVyIiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7Jytzd2l0Y2hlcl92ZXJ0aWNhbF9wb3NpdGlvbisnOjIwcHg7Jytzd2l0Y2hlcl9ob3Jpem9udGFsX3Bvc2l0aW9uKyc6MjBweDt6LWluZGV4Ojk5OTk5OTsiPjxkaXYgY2xhc3M9Imd0X2Zsb2F0X3N3aXRjaGVyIG5vdHJhbnNsYXRlIiBzdHlsZT0ib3BhY2l0eTowIj4nOwoKICAgIHZhciBndF9jdXJyZW50X2RpdiA9ICc8ZGl2IGNsYXNzPSJndC1zZWxlY3RlZCI+PGRpdiBjbGFzcz0iZ3QtY3VycmVudC1sYW5nIj48aW1nIHNyYz0iJytnZXRfZmxhZ19zcmMoY3VycmVudF9sYW5nKSsnIiBhbHQ9IicrY3VycmVudF9sYW5nKyciPiA8c3BhbiBjbGFzcz0iZ3QtbGFuZy1jb2RlIj4nK2N1cnJlbnRfbGFuZysnPC9zcGFuPiA8c3BhbiBjbGFzcz0iZ3RfZmxvYXRfc3dpdGNoZXItYXJyb3ciPjwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgdmFyIGd0X29wdGlvbnNfZGl2ID0gJzxkaXYgY2xhc3M9Imd0X29wdGlvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPic7CiAgICBsYW5ndWFnZXMuZm9yRWFjaChmdW5jdGlvbihsYW5nKSB7CiAgICAgICAgdmFyIGVsX2EgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgZWxfYS5ocmVmID0gZ2V0X2xhbmdfaHJlZihsYW5nKTsKICAgICAgICBlbF9hLmNsYXNzTGlzdC5hZGQoJ250dXJsJyk7CiAgICAgICAgY3VycmVudF9sYW5nID09IGxhbmcgJiYgZWxfYS5jbGFzc0xpc3QuYWRkKCdndC1jdXJyZW50Jyk7CiAgICAgICAgZWxfYS5zZXRBdHRyaWJ1dGUoJ2RhdGEtZ3QtbGFuZycsIGxhbmcpOwoKICAgICAgICB2YXIgZWxfaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgZWxfaW1nLnNldEF0dHJpYnV0ZSgnZGF0YS1ndC1sYXp5LXNyYycsIGdldF9mbGFnX3NyYyhsYW5nKSk7CiAgICAgICAgZWxfaW1nLmFsdCA9IGxhbmc7CgogICAgICAgIGVsX2EuYXBwZW5kQ2hpbGQoZWxfaW1nKTsKICAgICAgICBlbF9hLmlubmVySFRNTCArPSAnICcgKyBsYW5nX2FycmF5W2xhbmddOwoKICAgICAgICBndF9vcHRpb25zX2RpdiArPSBlbF9hLm91dGVySFRNTDsKICAgIH0pOwogICAgZ3Rfb3B0aW9uc19kaXYgKz0gJzwvZGl2Pic7CgogICAgaWYoKHN3aXRjaGVyX3ZlcnRpY2FsX3Bvc2l0aW9uID09ICd0b3AnICYmIGZsb2F0X3N3aXRjaGVyX29wZW5fZGlyZWN0aW9uID09ICdib3R0b20nKSB8fCAoc3dpdGNoZXJfdmVydGljYWxfcG9zaXRpb24gPT0gJ2JvdHRvbScgJiYgZmxvYXRfc3dpdGNoZXJfb3Blbl9kaXJlY3Rpb24gPT0gJ2JvdHRvbScpKQogICAgICAgIHdpZGdldF9jb2RlICs9IGd0X2N1cnJlbnRfZGl2ICsgZ3Rfb3B0aW9uc19kaXY7CiAgICBlbHNlCiAgICAgICAgd2lkZ2V0X2NvZGUgKz0gZ3Rfb3B0aW9uc19kaXYgKyBndF9jdXJyZW50X2RpdjsKCiAgICB3aWRnZXRfY29kZSArPSAnPC9kaXY+PC9kaXY+JzsKCiAgICB2YXIgYWRkX2NzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBhZGRfY3NzLmNsYXNzTGlzdC5hZGQoJ2d0cmFuc2xhdGVfY3NzJyk7CiAgICBhZGRfY3NzLnRleHRDb250ZW50ID0gd2lkZ2V0X2NzczsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYWRkX2Nzcyk7CgogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh3cmFwcGVyX3NlbGVjdG9yKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmFkZCh1X2NsYXNzLnN1YnN0cmluZygxKSk7ZS5pbm5lckhUTUwrPXdpZGdldF9jb2RlfSk7CgogICAgaWYodXJsX3N0cnVjdHVyZSA9PSAnbm9uZScpIHsKICAgICAgICBmdW5jdGlvbiBnZXRfY3VycmVudF9sYW5nKCkge3ZhciBrZXlWYWx1ZSA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCgnKF58OykgP2dvb2d0cmFucz0oW147XSopKDt8JCknKTtyZXR1cm4ga2V5VmFsdWUgPyBrZXlWYWx1ZVsyXS5zcGxpdCgnLycpWzJdIDogbnVsbDt9CiAgICAgICAgZnVuY3Rpb24gZmlyZV9ldmVudChlbGVtZW50LGV2ZW50KXt0cnl7aWYoZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3Qpe3ZhciBldnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtlbGVtZW50LmZpcmVFdmVudCgnb24nK2V2ZW50LGV2dCl9ZWxzZXt2YXIgZXZ0PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7ZXZ0LmluaXRFdmVudChldmVudCx0cnVlLHRydWUpO2VsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpfX1jYXRjaChlKXt9fQogICAgICAgIGZ1bmN0aW9uIGxvYWRfdGxpYigpe2lmKCF3aW5kb3cuZ3RfdHJhbnNsYXRlX3NjcmlwdCl7d2luZG93Lmd0X3RyYW5zbGF0ZV9zY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7Z3RfdHJhbnNsYXRlX3NjcmlwdC5zcmM9J2h0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZS5jb20vdHJhbnNsYXRlX2EvZWxlbWVudC5qcz9jYj1nb29nbGVUcmFuc2xhdGVFbGVtZW50SW5pdDInO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZ3RfdHJhbnNsYXRlX3NjcmlwdCk7fX0KICAgICAgICB3aW5kb3cuZG9HVHJhbnNsYXRlID0gZnVuY3Rpb24obGFuZ19wYWlyKXtpZihsYW5nX3BhaXIudmFsdWUpbGFuZ19wYWlyPWxhbmdfcGFpci52YWx1ZTtpZihsYW5nX3BhaXI9PScnKXJldHVybjt2YXIgbGFuZz1sYW5nX3BhaXIuc3BsaXQoJ3wnKVsxXTtpZihnZXRfY3VycmVudF9sYW5nKCkgPT0gbnVsbCAmJiBsYW5nID09IGxhbmdfcGFpci5zcGxpdCgnfCcpWzBdKXJldHVybjt2YXIgdGVDb21ibzt2YXIgc2VsPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWxlY3QnKTtmb3IodmFyIGk9MDtpPHNlbC5sZW5ndGg7aSsrKWlmKHNlbFtpXS5jbGFzc05hbWUuaW5kZXhPZignZ29vZy10ZS1jb21ibycpIT0tMSl7dGVDb21ibz1zZWxbaV07YnJlYWs7fWlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb29nbGVfdHJhbnNsYXRlX2VsZW1lbnQyJyk9PW51bGx8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb29nbGVfdHJhbnNsYXRlX2VsZW1lbnQyJykuaW5uZXJIVE1MLmxlbmd0aD09MHx8dGVDb21iby5sZW5ndGg9PTB8fHRlQ29tYm8uaW5uZXJIVE1MLmxlbmd0aD09MCl7c2V0VGltZW91dChmdW5jdGlvbigpe2RvR1RyYW5zbGF0ZShsYW5nX3BhaXIpfSw1MDApfWVsc2V7dGVDb21iby52YWx1ZT1sYW5nO2ZpcmVfZXZlbnQodGVDb21ibywnY2hhbmdlJyk7ZmlyZV9ldmVudCh0ZUNvbWJvLCdjaGFuZ2UnKX19CiAgICAgICAgd2luZG93Lmdvb2dsZVRyYW5zbGF0ZUVsZW1lbnRJbml0Mj1mdW5jdGlvbigpe25ldyBnb29nbGUudHJhbnNsYXRlLlRyYW5zbGF0ZUVsZW1lbnQoe3BhZ2VMYW5ndWFnZTpkZWZhdWx0X2xhbmd1YWdlLGF1dG9EaXNwbGF5OmZhbHNlfSwnZ29vZ2xlX3RyYW5zbGF0ZV9lbGVtZW50MicpfTsKCiAgICAgICAgaWYoY3VycmVudF9sYW5nICE9IGRlZmF1bHRfbGFuZ3VhZ2UpCiAgICAgICAgICAgIGxvYWRfdGxpYigpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh1X2NsYXNzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJyxsb2FkX3RsaWIpO2UuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsbG9hZF90bGliKX0pOwogICAgfQoKICAgIHZhciBndF9mbG9hdF9vcGVuID0gZmFsc2U7CiAgICBmdW5jdGlvbiBndF9oc2Nyb2xsKGV2dCl7dmFyIHRndCA9IGV2dC50YXJnZXQ7aWYodGd0LnRhZ05hbWUgPT0gJ0EnKXRndD10Z3QucGFyZW50Tm9kZTtlbHNlIGlmKHRndC50YWdOYW1lID09ICdJTUcnKXRndD10Z3QucGFyZW50Tm9kZS5wYXJlbnROb2RlO2lmKGV2dC50eXBlID09ICdtb3VzZXdoZWVsJyl7ZXZ0LnByZXZlbnREZWZhdWx0KCk7dGd0LnNjcm9sbExlZnQgLT0gTWF0aC5zaWduKGV2dC53aGVlbERlbHRhKSAqIDg4O31lbHNlIGlmKGV2dC50eXBlID09ICd0b3VjaHN0YXJ0Jyl7Z3RfdG91Y2hzdGFydF9wb3N4ID0gZ3RfdG91Y2hzdGFydF9wb3N4X3N0YXRpYyA9IGV2dC50b3VjaGVzWzBdLnBhZ2VYO2d0X3RvdWNoc3RhcnRfdGltZXN0YW1wID0gZXZ0LnRpbWVTdGFtcDt9ZWxzZSBpZihldnQudHlwZSA9PSAndG91Y2htb3ZlJyl7ZXZ0LnByZXZlbnREZWZhdWx0KCk7dGd0LnNjcm9sbExlZnQgKz0gTWF0aC5zaWduKGd0X3RvdWNoc3RhcnRfcG9zeCAtIGV2dC50b3VjaGVzWzBdLnBhZ2VYKSAqIDEwO2d0X3RvdWNoc3RhcnRfcG9zeCA9IGV2dC50b3VjaGVzWzBdLnBhZ2VYO31lbHNlIGlmKGV2dC50eXBlID09ICd0b3VjaGVuZCcpe3ZhciBzY3JvbGxfc3BlZWQgPSAoZ3RfdG91Y2hzdGFydF9wb3N4X3N0YXRpYyAtIGV2dC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCkgLyAoZXZ0LnRpbWVTdGFtcCAtIGd0X3RvdWNoc3RhcnRfdGltZXN0YW1wKTt0Z3Quc2Nyb2xsVG8oe2xlZnQ6IHRndC5zY3JvbGxMZWZ0ICsgc2Nyb2xsX3NwZWVkICogNTAwLCBiZWhhdmlvcjogJ3Ntb290aCd9KTt9fQogICAgZnVuY3Rpb24gZ3Rfc2hvd19mbG9hdF9zd2l0Y2hlcihlbCl7CiAgICAgICAgZ3RfZmxvYXRfb3Blbj10cnVlOwogICAgICAgIGlmKHN3aXRjaGVyX2hvcml6b250YWxfcG9zaXRpb24gPT0gJ2lubGluZScpCiAgICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IodV9jbGFzcyArICcgLmd0X29wdGlvbnMnKS5zdHlsZS5tYXhXaWR0aCA9IChlbC5wYXJlbnROb2RlLmNsaWVudFdpZHRoIC0gZWwuY2xpZW50V2lkdGggLSAxKSArICdweCc7CiAgICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCh1X2NsYXNzICsgJyAuZ3Rfb3B0aW9ucyBhIGltZzpub3QoW3NyY10pJykuZm9yRWFjaChmdW5jdGlvbihpbWcpe2ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ3QtbGF6eS1zcmMnKSk7fSk7CiAgICAgICAgZWwucXVlcnlTZWxlY3Rvcih1X2NsYXNzICsgJyAuZ3Qtc2VsZWN0ZWQgc3Bhbi5ndF9mbG9hdF9zd2l0Y2hlci1hcnJvdycpLmNsYXNzTGlzdC5hZGQoJ2d0X2Fycm93X3JvdGF0ZScpOwogICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3JBbGwodV9jbGFzcyArICcgLmd0X29wdGlvbnMnKS5mb3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICAgICAgICBlLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZS5jbGFzc0xpc3QuYWRkKCdndC1vcGVuJyk7CiAgICAgICAgICAgICAgICBpZihmbG9hdF9zd2l0Y2hlcl9vcGVuX2RpcmVjdGlvbiA9PSAnbGVmdCcgfHwgZmxvYXRfc3dpdGNoZXJfb3Blbl9kaXJlY3Rpb24gPT0gJ3JpZ2h0JykgewogICAgICAgICAgICAgICAgICAgIGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIGd0X2hzY3JvbGwpOwogICAgICAgICAgICAgICAgICAgIGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGd0X2hzY3JvbGwpOwogICAgICAgICAgICAgICAgICAgIGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZ3RfaHNjcm9sbCk7CiAgICAgICAgICAgICAgICAgICAgZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGd0X2hzY3JvbGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LDIwMCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBndF9oaWRlX2Zsb2F0X3N3aXRjaGVyKCl7CiAgICAgICAgZ3RfZmxvYXRfb3Blbj1mYWxzZTsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHVfY2xhc3MgKyAnIC5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Qtc2VsZWN0ZWQgc3Bhbi5ndF9mbG9hdF9zd2l0Y2hlci1hcnJvdy5ndF9hcnJvd19yb3RhdGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LnJlbW92ZSgnZ3RfYXJyb3dfcm90YXRlJyl9KTsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHVfY2xhc3MgKyAnIC5ndF9mbG9hdF9zd2l0Y2hlciAuZ3Rfb3B0aW9ucy5ndC1vcGVuJykuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgICAgICAgaWYoZmxvYXRfc3dpdGNoZXJfb3Blbl9kaXJlY3Rpb24gPT0gJ2xlZnQnIHx8IGZsb2F0X3N3aXRjaGVyX29wZW5fZGlyZWN0aW9uID09ICdyaWdodCcpIHsKICAgICAgICAgICAgICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIGd0X2hzY3JvbGwpOwogICAgICAgICAgICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZ3RfaHNjcm9sbCk7CiAgICAgICAgICAgICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGd0X2hzY3JvbGwpOwogICAgICAgICAgICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGd0X2hzY3JvbGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGUuY2xhc3NMaXN0LnJlbW92ZSgnZ3Qtb3BlbicpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PSdub25lJ30sMjAwKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGd0X3VwZGF0ZV9mbG9hdF9sYW5ndWFnZShlbCl7CiAgICAgICAgdmFyIGxhbmc9ZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWd0LWxhbmcnKTsKICAgICAgICB2YXIgaW1nX3NyYz1lbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJ2FbZGF0YS1ndC1sYW5nPSInK2xhbmcrJyJdIGltZycpLmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe2VsLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignYS5ndC1jdXJyZW50JykuY2xhc3NMaXN0LnJlbW92ZSgnZ3QtY3VycmVudCcpO2VsLmNsYXNzTGlzdC5hZGQoJ2d0LWN1cnJlbnQnKTt9LDQwMCk7CiAgICAgICAgZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5ndC1zZWxlY3RlZCBpbWcnKS5zZXRBdHRyaWJ1dGUoJ3NyYycsaW1nX3NyYyk7CiAgICAgICAgZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5ndC1zZWxlY3RlZCBzcGFuLmd0LWxhbmctY29kZScpLmlubmVyVGV4dD1sYW5nOwogICAgICAgIGd0X2hpZGVfZmxvYXRfc3dpdGNoZXIoKTsKICAgIH0KCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh1X2NsYXNzICsgJyAuZ3RfZmxvYXRfc3dpdGNoZXInKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3R5bGUub3BhY2l0eT0xfSl9LDIwKTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodV9jbGFzcyArICcgYVtkYXRhLWd0LWxhbmddJykuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihldnQpewogICAgICAgIGlmKHVybF9zdHJ1Y3R1cmUgPT0gJ25vbmUnKSB7CiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBkb0dUcmFuc2xhdGUoZGVmYXVsdF9sYW5ndWFnZSsnfCcrZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ3QtbGFuZycpKTsKICAgICAgICB9CiAgICAgICAgZ3RfdXBkYXRlX2Zsb2F0X2xhbmd1YWdlKGUpOwogICAgfSl9KTsKCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHVfY2xhc3MgKyAnIGRpdi5ndC1zZWxlY3RlZCcpLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgICAgZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZXZ0KXtldnQuc3RvcFByb3BhZ2F0aW9uKCk7aWYoZ3RfZmxvYXRfb3BlbilndF9oaWRlX2Zsb2F0X3N3aXRjaGVyKCk7ZWxzZSBndF9zaG93X2Zsb2F0X3N3aXRjaGVyKGUucGFyZW50Tm9kZSk7fSk7CiAgICAgICAgZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLGZ1bmN0aW9uKGV2dCl7ZXZ0LnRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ndF9vcHRpb25zIGltZzpub3QoW3NyY10pJykuZm9yRWFjaChmdW5jdGlvbihpbWcpe2ltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZ3QtbGF6eS1zcmMnKSl9KX0pOwogICAgfSk7CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7aWYoZ3RfZmxvYXRfb3BlbilndF9oaWRlX2Zsb2F0X3N3aXRjaGVyKCl9KTsKCiAgICBpZihkZXRlY3RfYnJvd3Nlcl9sYW5ndWFnZSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlICYmIHdpbmRvdy5uYXZpZ2F0b3IgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2d0X2F1dG9zd2l0Y2gnKSA9PSBudWxsICYmICEvYm90fHNwaWRlcnxzbHVycHxmYWNlYm9vay9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsKICAgICAgICB2YXIgYWNjZXB0X2xhbmd1YWdlID0gKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkudG9Mb3dlckNhc2UoKTsKICAgICAgICBzd2l0Y2goYWNjZXB0X2xhbmd1YWdlKSB7CiAgICAgICAgICAgIGNhc2UgJ3poJzoKICAgICAgICAgICAgY2FzZSAnemgtY24nOnZhciBwcmVmZXJyZWRfbGFuZ3VhZ2UgPSAnemgtQ04nO2JyZWFrOwogICAgICAgICAgICBjYXNlICd6aC10dyc6CiAgICAgICAgICAgIGNhc2UgJ3poLWhrJzp2YXIgcHJlZmVycmVkX2xhbmd1YWdlID0gJ3poLVRXJzticmVhazsKICAgICAgICAgICAgY2FzZSAnaGUnOnZhciBwcmVmZXJyZWRfbGFuZ3VhZ2UgPSAnaXcnO2JyZWFrOwogICAgICAgICAgICBkZWZhdWx0OnZhciBwcmVmZXJyZWRfbGFuZ3VhZ2UgPSBhY2NlcHRfbGFuZ3VhZ2Uuc3Vic3RyKDAsMik7YnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihjdXJyZW50X2xhbmcgPT0gZGVmYXVsdF9sYW5ndWFnZSAmJiBwcmVmZXJyZWRfbGFuZ3VhZ2UgIT0gZGVmYXVsdF9sYW5ndWFnZSAmJiBsYW5ndWFnZXMuaW5jbHVkZXMocHJlZmVycmVkX2xhbmd1YWdlKSkgewogICAgICAgICAgICBpZih1cmxfc3RydWN0dXJlID09ICdub25lJykgewogICAgICAgICAgICAgICAgbG9hZF90bGliKCk7CiAgICAgICAgICAgICAgICB3aW5kb3cuZ3RfdHJhbnNsYXRlX3NjcmlwdC5vbmxvYWQ9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBkb0dUcmFuc2xhdGUoZGVmYXVsdF9sYW5ndWFnZSsnfCcrcHJlZmVycmVkX2xhbmd1YWdlKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHVfY2xhc3MrJyBhW2RhdGEtZ3QtbGFuZz0iJytwcmVmZXJyZWRfbGFuZ3VhZ2UrJyJdJyk7CiAgICAgICAgICAgICAgICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnaW1nOm5vdChbc3JjXSknKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCdzcmMnLCBlLmdldEF0dHJpYnV0ZSgnZGF0YS1ndC1sYXp5LXNyYycpKX0pOwogICAgICAgICAgICAgICAgICAgIGd0X3VwZGF0ZV9mbG9hdF9sYW5ndWFnZShlbCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodV9jbGFzcysnIGFbZGF0YS1ndC1sYW5nPSInK3ByZWZlcnJlZF9sYW5ndWFnZSsnIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2xvY2F0aW9uLmhyZWY9ZS5ocmVmfSk7CiAgICAgICAgfQoKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ3RfYXV0b3N3aXRjaCcsIDEpOwogICAgfQp9KSgpOwo="}},"time_used":28,"timings":{"blocked":-1,"dns":3,"connect":1,"send":0,"wait":10,"receive":0,"ssl":14},"alerts":{"ids":null,"analyzer":null,"urlquery":null}},{"url":{"schema":"https","addr":"cyptokion.vip/assets/images/logoIcon/favicon.png","fqdn":"cyptokion.vip","domain":"cyptokion.vip","tld":"vip"},"ip":{"addr":"162.245.237.212","port":443,"asn":27323,"as":"SERVERSTADIUM","country":"United States","country_code":"US"},"is_navigation_request":false,"resource_type":"img","requested_by":"https://cyptokion.vip/","date":"2026-07-27T10:23:16.888Z","timestamp":1785147796888,"http_version":"HTTP/3","security_state":"secure","security_info":{"cipher_suite":"TLS_CHACHA20_POLY1305_SHA256","key_group_name":"x25519","signature_name":"RSA-PSS-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"*.cyptokion.vip","organization":""},"issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validity":{"start":"Sat, 25 Jul 2026 16:03:40 GMT","end":"Fri, 23 Oct 2026 16:03:39 GMT"},"fingerprint":{"sha1":"6A:D8:40:E5:0D:87:9F:45:90:70:19:D9:F7:F3:4A:8A:D0:B3:BE:30","sha256":"3D:36:66:B0:E5:7B:D0:B1:B8:3C:E1:A2:44:95:DC:81:9E:32:EE:2B:4E:96:67:63:5C:6E:9A:51:C2:80:1B:37"}}},"request":{"raw":"GET /assets/images/logoIcon/favicon.png HTTP/1.1\r\nHost: cyptokion.vip\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: image/avif,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nReferer: https://cyptokion.vip/\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nCookie: XSRF-TOKEN=eyJpdiI6ImRRZmlzZEo4YlU4VVlOM1B2eUVld2c9PSIsInZhbHVlIjoidmpGWEJoaXpMbFBUS3FmNGhpME1yN0N0NVJaZTNHSmZvS1EwbUlnVFV3aFFtL1ErU3FaUi9za3hPNkZrSDBIZ1AxYlhyWjZpUWVKcXkzOWdHNitMNFhPL2Q5QnE5VlpFakhDNStGWnFERlN4Z0R5blA2NzB0eTc2QXlCODNNL1UiLCJtYWMiOiJhOGRhNmQxM2M4OTI1MDIxMmE2MDEzM2EzOWQzNTQzOTFjZDA3ZjBmZDRjOGMyMTUzNGJiZGMwMWVjZjcwZjQ4IiwidGFnIjoiIn0%3D; hyiplab_session=eyJpdiI6Im9sNTVJNndrYnBHWDJvRHl5cVoyTWc9PSIsInZhbHVlIjoiK0JETjdZbVhhbDdVWHFXenJrYWlZbWxXcjZNc1FuclZlRWdOWG9Lc2VRMGVmRzd6T2RZL2Z2WVV6OS9JTTVnZUw2eVZsd0JILzVqaUlVYkJFT0ZGMnVKVjdCUW1Mb0pTUlRlL2laNmY3R3Yrd2o1b21MRGN6VG5acFc5NUJvbGciLCJtYWMiOiI2YmM2MTk2OWM4ZjExNTJjYzQ5NTZhZTIzOTY4NGU5YThiNmU3MWVhMmQyNGEzNTM2MWZiNzUzMjU2YmUyNTNlIiwidGFnIjoiIn0%3D\r\nSec-Fetch-Dest: image\r\nSec-Fetch-Mode: no-cors\r\nSec-Fetch-Site: same-origin\r\nPriority: u=6\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/3 200 \r\ncache-control: public, max-age=31536000\r\nexpires: Tue, 27 Jul 2027 10:23:16 GMT\r\ncontent-type: image/png\r\nlast-modified: Sun, 14 Jul 2024 21:16:36 GMT\r\naccept-ranges: bytes\r\ncontent-length: 1575\r\ndate: Mon, 27 Jul 2026 10:23:16 GMT\r\nserver: LiteSpeed\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nx-frame-options: SAMEORIGIN\r\nreferrer-policy: strict-origin-when-cross-origin\r\npermissions-policy: geolocation=(), microphone=(), camera=()\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"LiteSpeed","description":"LiteSpeed is a high-scalability web server.","website":"https://litespeedtech.com","common_platform_enumeration":"cpe:2.3:a:litespeedtech:litespeed_web_server:*:*:*:*:*:*:*:*","icon":"LiteSpeed.svg","categories":["Web servers"]}],"data":{"size":1575,"size_decoded":2049,"mime_type":"image/png","magic":"PNG image data, 128 x 128, 8-bit/color RGBA, non-interlaced","md5":"d32a9ab58e8cf677f31e11e629654979","sha1":"fbc061e729f5b122e085a78c49507591ad4602a9","sha256":"d182cb983e480310167004f964508975f85e6c97d23b31f685b331002ea96f71","sha512":"5f7572a14607690cc6bc231bdffd4e5a86052617b01aa00ac27b0677e70ce58822d3866c63aa7dd43d2a5bf0d49ae4c5110773adedf2b12b31550d015d20033e","ssdeep":"","tlshash":"b231e7dff205711e488daca02291cbb33e0628e5ea57112c8168e309dfdec7d2446e1b","first_seen":"2025-06-25T11:59:30.688346Z","last_seen":"2026-08-11T00:25:55.280189Z","times_seen":21,"resource_available":false,"data":"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"}},"time_used":145,"timings":{"blocked":0,"dns":0,"connect":0,"send":0,"wait":145,"receive":0,"ssl":0},"alerts":{"ids":null,"analyzer":null,"urlquery":null}}]}
