{"id":7283,"date":"2026-11-10T13:11:43","date_gmt":"2026-11-10T13:11:43","guid":{"rendered":"https:\/\/northernvaluegroup.com\/?page_id=7283"},"modified":"2026-11-10T13:49:31","modified_gmt":"2026-11-10T13:49:31","slug":"homes-weve-purchased","status":"publish","type":"page","link":"https:\/\/northernvaluegroup.com\/?page_id=7283","title":{"rendered":"Home sellers we&#8217;ve worked with"},"content":{"rendered":"\n<!-- Leaflet 1.9.4 CSS (BSD-2-Clause), self-hosted inline; marker images inlined -->\n<style>\/* required styles *\/\n\n.leaflet-pane,\n.leaflet-tile,\n.leaflet-marker-icon,\n.leaflet-marker-shadow,\n.leaflet-tile-container,\n.leaflet-pane > svg,\n.leaflet-pane > canvas,\n.leaflet-zoom-box,\n.leaflet-image-layer,\n.leaflet-layer {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\t}\n.leaflet-container {\n\toverflow: hidden;\n\t}\n.leaflet-tile,\n.leaflet-marker-icon,\n.leaflet-marker-shadow {\n\t-webkit-user-select: none;\n\t   -moz-user-select: none;\n\t        user-select: none;\n\t  -webkit-user-drag: none;\n\t}\n\/* Prevents IE11 from highlighting tiles in blue *\/\n.leaflet-tile::selection {\n\tbackground: transparent;\n}\n\/* Safari renders non-retina tile on retina better with this, but Chrome is worse *\/\n.leaflet-safari .leaflet-tile {\n\timage-rendering: -webkit-optimize-contrast;\n\t}\n\/* hack that prevents hw layers \"stretching\" when loading new tiles *\/\n.leaflet-safari .leaflet-tile-container {\n\twidth: 1600px;\n\theight: 1600px;\n\t-webkit-transform-origin: 0 0;\n\t}\n.leaflet-marker-icon,\n.leaflet-marker-shadow {\n\tdisplay: block;\n\t}\n\/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x *\/\n\/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles *\/\n.leaflet-container .leaflet-overlay-pane svg {\n\tmax-width: none !important;\n\tmax-height: none !important;\n\t}\n.leaflet-container .leaflet-marker-pane img,\n.leaflet-container .leaflet-shadow-pane img,\n.leaflet-container .leaflet-tile-pane img,\n.leaflet-container img.leaflet-image-layer,\n.leaflet-container .leaflet-tile {\n\tmax-width: none !important;\n\tmax-height: none !important;\n\twidth: auto;\n\tpadding: 0;\n\t}\n\n.leaflet-container img.leaflet-tile {\n\t\/* See: https:\/\/bugs.chromium.org\/p\/chromium\/issues\/detail?id=600120 *\/\n\tmix-blend-mode: plus-lighter;\n}\n\n.leaflet-container.leaflet-touch-zoom {\n\t-ms-touch-action: pan-x pan-y;\n\ttouch-action: pan-x pan-y;\n\t}\n.leaflet-container.leaflet-touch-drag {\n\t-ms-touch-action: pinch-zoom;\n\t\/* Fallback for FF which doesn't support pinch-zoom *\/\n\ttouch-action: none;\n\ttouch-action: pinch-zoom;\n}\n.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.leaflet-container {\n\t-webkit-tap-highlight-color: transparent;\n}\n.leaflet-container a {\n\t-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);\n}\n.leaflet-tile {\n\tfilter: inherit;\n\tvisibility: hidden;\n\t}\n.leaflet-tile-loaded {\n\tvisibility: inherit;\n\t}\n.leaflet-zoom-box {\n\twidth: 0;\n\theight: 0;\n\t-moz-box-sizing: border-box;\n\t     box-sizing: border-box;\n\tz-index: 800;\n\t}\n\/* workaround for https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=888319 *\/\n.leaflet-overlay-pane svg {\n\t-moz-user-select: none;\n\t}\n\n.leaflet-pane         { z-index: 400; }\n\n.leaflet-tile-pane    { z-index: 200; }\n.leaflet-overlay-pane { z-index: 400; }\n.leaflet-shadow-pane  { z-index: 500; }\n.leaflet-marker-pane  { z-index: 600; }\n.leaflet-tooltip-pane   { z-index: 650; }\n.leaflet-popup-pane   { z-index: 700; }\n\n.leaflet-map-pane canvas { z-index: 100; }\n.leaflet-map-pane svg    { z-index: 200; }\n\n.leaflet-vml-shape {\n\twidth: 1px;\n\theight: 1px;\n\t}\n.lvml {\n\tbehavior: url(#default#VML);\n\tdisplay: inline-block;\n\tposition: absolute;\n\t}\n\n\n\/* control positioning *\/\n\n.leaflet-control {\n\tposition: relative;\n\tz-index: 800;\n\tpointer-events: visiblePainted; \/* IE 9-10 doesn't have auto *\/\n\tpointer-events: auto;\n\t}\n.leaflet-top,\n.leaflet-bottom {\n\tposition: absolute;\n\tz-index: 1000;\n\tpointer-events: none;\n\t}\n.leaflet-top {\n\ttop: 0;\n\t}\n.leaflet-right {\n\tright: 0;\n\t}\n.leaflet-bottom {\n\tbottom: 0;\n\t}\n.leaflet-left {\n\tleft: 0;\n\t}\n.leaflet-control {\n\tfloat: left;\n\tclear: both;\n\t}\n.leaflet-right .leaflet-control {\n\tfloat: right;\n\t}\n.leaflet-top .leaflet-control {\n\tmargin-top: 10px;\n\t}\n.leaflet-bottom .leaflet-control {\n\tmargin-bottom: 10px;\n\t}\n.leaflet-left .leaflet-control {\n\tmargin-left: 10px;\n\t}\n.leaflet-right .leaflet-control {\n\tmargin-right: 10px;\n\t}\n\n\n\/* zoom and fade animations *\/\n\n.leaflet-fade-anim .leaflet-popup {\n\topacity: 0;\n\t-webkit-transition: opacity 0.2s linear;\n\t   -moz-transition: opacity 0.2s linear;\n\t        transition: opacity 0.2s linear;\n\t}\n.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\n\topacity: 1;\n\t}\n.leaflet-zoom-animated {\n\t-webkit-transform-origin: 0 0;\n\t    -ms-transform-origin: 0 0;\n\t        transform-origin: 0 0;\n\t}\nsvg.leaflet-zoom-animated {\n\twill-change: transform;\n}\n\n.leaflet-zoom-anim .leaflet-zoom-animated {\n\t-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\n\t   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\n\t        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);\n\t}\n.leaflet-zoom-anim .leaflet-tile,\n.leaflet-pan-anim .leaflet-tile {\n\t-webkit-transition: none;\n\t   -moz-transition: none;\n\t        transition: none;\n\t}\n\n.leaflet-zoom-anim .leaflet-zoom-hide {\n\tvisibility: hidden;\n\t}\n\n\n\/* cursors *\/\n\n.leaflet-interactive {\n\tcursor: pointer;\n\t}\n.leaflet-grab {\n\tcursor: -webkit-grab;\n\tcursor:    -moz-grab;\n\tcursor:         grab;\n\t}\n.leaflet-crosshair,\n.leaflet-crosshair .leaflet-interactive {\n\tcursor: crosshair;\n\t}\n.leaflet-popup-pane,\n.leaflet-control {\n\tcursor: auto;\n\t}\n.leaflet-dragging .leaflet-grab,\n.leaflet-dragging .leaflet-grab .leaflet-interactive,\n.leaflet-dragging .leaflet-marker-draggable {\n\tcursor: move;\n\tcursor: -webkit-grabbing;\n\tcursor:    -moz-grabbing;\n\tcursor:         grabbing;\n\t}\n\n\/* marker & overlays interactivity *\/\n.leaflet-marker-icon,\n.leaflet-marker-shadow,\n.leaflet-image-layer,\n.leaflet-pane > svg path,\n.leaflet-tile-container {\n\tpointer-events: none;\n\t}\n\n.leaflet-marker-icon.leaflet-interactive,\n.leaflet-image-layer.leaflet-interactive,\n.leaflet-pane > svg path.leaflet-interactive,\nsvg.leaflet-image-layer.leaflet-interactive path {\n\tpointer-events: visiblePainted; \/* IE 9-10 doesn't have auto *\/\n\tpointer-events: auto;\n\t}\n\n\/* visual tweaks *\/\n\n.leaflet-container {\n\tbackground: #ddd;\n\toutline-offset: 1px;\n\t}\n.leaflet-container a {\n\tcolor: #0078A8;\n\t}\n.leaflet-zoom-box {\n\tborder: 2px dotted #38f;\n\tbackground: rgba(255,255,255,0.5);\n\t}\n\n\n\/* general typography *\/\n.leaflet-container {\n\tfont-family: \"Helvetica Neue\", Arial, Helvetica, sans-serif;\n\tfont-size: 12px;\n\tfont-size: 0.75rem;\n\tline-height: 1.5;\n\t}\n\n\n\/* general toolbar styles *\/\n\n.leaflet-bar {\n\tbox-shadow: 0 1px 5px rgba(0,0,0,0.65);\n\tborder-radius: 4px;\n\t}\n.leaflet-bar a {\n\tbackground-color: #fff;\n\tborder-bottom: 1px solid #ccc;\n\twidth: 26px;\n\theight: 26px;\n\tline-height: 26px;\n\tdisplay: block;\n\ttext-align: center;\n\ttext-decoration: none;\n\tcolor: black;\n\t}\n.leaflet-bar a,\n.leaflet-control-layers-toggle {\n\tbackground-position: 50% 50%;\n\tbackground-repeat: no-repeat;\n\tdisplay: block;\n\t}\n.leaflet-bar a:hover,\n.leaflet-bar a:focus {\n\tbackground-color: #f4f4f4;\n\t}\n.leaflet-bar a:first-child {\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\t}\n.leaflet-bar a:last-child {\n\tborder-bottom-left-radius: 4px;\n\tborder-bottom-right-radius: 4px;\n\tborder-bottom: none;\n\t}\n.leaflet-bar a.leaflet-disabled {\n\tcursor: default;\n\tbackground-color: #f4f4f4;\n\tcolor: #bbb;\n\t}\n\n.leaflet-touch .leaflet-bar a {\n\twidth: 30px;\n\theight: 30px;\n\tline-height: 30px;\n\t}\n.leaflet-touch .leaflet-bar a:first-child {\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\t}\n.leaflet-touch .leaflet-bar a:last-child {\n\tborder-bottom-left-radius: 2px;\n\tborder-bottom-right-radius: 2px;\n\t}\n\n\/* zoom control *\/\n\n.leaflet-control-zoom-in,\n.leaflet-control-zoom-out {\n\tfont: bold 18px 'Lucida Console', Monaco, monospace;\n\ttext-indent: 1px;\n\t}\n\n.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out  {\n\tfont-size: 22px;\n\t}\n\n\n\/* layers control *\/\n\n.leaflet-control-layers {\n\tbox-shadow: 0 1px 5px rgba(0,0,0,0.4);\n\tbackground: #fff;\n\tborder-radius: 5px;\n\t}\n.leaflet-control-layers-toggle {\n\tbackground-image: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6\/ee\/XeCQ4D3ykPtL5tHno4n0d\/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi\/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM\/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a\/PG2yutpS\/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6\/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M\/82yIDtC\/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS\/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);\n\twidth: 36px;\n\theight: 36px;\n\t}\n.leaflet-retina .leaflet-control-layers-toggle {\n\tbackground-image: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad\/+V\/fVzMdMT2g9Cv9guXGv\/7pYOrXh2U+RRR3dSd9JRx6bIFc\/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT\/Ifff+\/kDk2u\/w\/33\/IeCMOSaWZ4glosqT3DNnNZQ7Cs58\/3Ce5HL78iZH\/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z\/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm\/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm\/ayYjHW5\/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5\/3v61RMCO9Jx2EEYYhb0rmNQMX\/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA\/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw\/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3\/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao\/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd\/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo\/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc\/0PstHHcfEdQ+UAAAAASUVORK5CYII=);\n\tbackground-size: 26px 26px;\n\t}\n.leaflet-touch .leaflet-control-layers-toggle {\n\twidth: 44px;\n\theight: 44px;\n\t}\n.leaflet-control-layers .leaflet-control-layers-list,\n.leaflet-control-layers-expanded .leaflet-control-layers-toggle {\n\tdisplay: none;\n\t}\n.leaflet-control-layers-expanded .leaflet-control-layers-list {\n\tdisplay: block;\n\tposition: relative;\n\t}\n.leaflet-control-layers-expanded {\n\tpadding: 6px 10px 6px 6px;\n\tcolor: #333;\n\tbackground: #fff;\n\t}\n.leaflet-control-layers-scrollbar {\n\toverflow-y: scroll;\n\toverflow-x: hidden;\n\tpadding-right: 5px;\n\t}\n.leaflet-control-layers-selector {\n\tmargin-top: 2px;\n\tposition: relative;\n\ttop: 1px;\n\t}\n.leaflet-control-layers label {\n\tdisplay: block;\n\tfont-size: 13px;\n\tfont-size: 1.08333em;\n\t}\n.leaflet-control-layers-separator {\n\theight: 0;\n\tborder-top: 1px solid #ddd;\n\tmargin: 5px -10px 5px -6px;\n\t}\n\n\/* Default icon URLs *\/\n.leaflet-default-icon-path { \/* used only in path-guessing heuristic, see L.Icon.Default *\/\n\tbackground-image: url(data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq\/bXZtrp\/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq\/RBpykd8oZUb\/kaJutow8r1aP9II0WmLKLIsJyv1w\/kqw9Ch2MYdB++12Onxee\/QMwvf4\/Dk\/Lfp\/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg\/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7\/XZKNH+9+hBLOHYozuKQPxyMPUKkrX\/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue\/uDivd3fkWRbS6\/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7\/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5\/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn\/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g\/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2\/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD\/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF\/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk\/4kggu40ZTvIEm5g24qtU4KjBrx\/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG\/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR\/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+\/FrIjweHQS4\/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=);\n\t}\n\n\n\/* attribution and scale controls *\/\n\n.leaflet-container .leaflet-control-attribution {\n\tbackground: #fff;\n\tbackground: rgba(255, 255, 255, 0.8);\n\tmargin: 0;\n\t}\n.leaflet-control-attribution,\n.leaflet-control-scale-line {\n\tpadding: 0 5px;\n\tcolor: #333;\n\tline-height: 1.4;\n\t}\n.leaflet-control-attribution a {\n\ttext-decoration: none;\n\t}\n.leaflet-control-attribution a:hover,\n.leaflet-control-attribution a:focus {\n\ttext-decoration: underline;\n\t}\n.leaflet-attribution-flag {\n\tdisplay: inline !important;\n\tvertical-align: baseline !important;\n\twidth: 1em;\n\theight: 0.6669em;\n\t}\n.leaflet-left .leaflet-control-scale {\n\tmargin-left: 5px;\n\t}\n.leaflet-bottom .leaflet-control-scale {\n\tmargin-bottom: 5px;\n\t}\n.leaflet-control-scale-line {\n\tborder: 2px solid #777;\n\tborder-top: none;\n\tline-height: 1.1;\n\tpadding: 2px 5px 1px;\n\twhite-space: nowrap;\n\t-moz-box-sizing: border-box;\n\t     box-sizing: border-box;\n\tbackground: rgba(255, 255, 255, 0.8);\n\ttext-shadow: 1px 1px #fff;\n\t}\n.leaflet-control-scale-line:not(:first-child) {\n\tborder-top: 2px solid #777;\n\tborder-bottom: none;\n\tmargin-top: -2px;\n\t}\n.leaflet-control-scale-line:not(:first-child):not(:last-child) {\n\tborder-bottom: 2px solid #777;\n\t}\n\n.leaflet-touch .leaflet-control-attribution,\n.leaflet-touch .leaflet-control-layers,\n.leaflet-touch .leaflet-bar {\n\tbox-shadow: none;\n\t}\n.leaflet-touch .leaflet-control-layers,\n.leaflet-touch .leaflet-bar {\n\tborder: 2px solid rgba(0,0,0,0.2);\n\tbackground-clip: padding-box;\n\t}\n\n\n\/* popup *\/\n\n.leaflet-popup {\n\tposition: absolute;\n\ttext-align: center;\n\tmargin-bottom: 20px;\n\t}\n.leaflet-popup-content-wrapper {\n\tpadding: 1px;\n\ttext-align: left;\n\tborder-radius: 12px;\n\t}\n.leaflet-popup-content {\n\tmargin: 13px 24px 13px 20px;\n\tline-height: 1.3;\n\tfont-size: 13px;\n\tfont-size: 1.08333em;\n\tmin-height: 1px;\n\t}\n.leaflet-popup-content p {\n\tmargin: 17px 0;\n\tmargin: 1.3em 0;\n\t}\n.leaflet-popup-tip-container {\n\twidth: 40px;\n\theight: 20px;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-top: -1px;\n\tmargin-left: -20px;\n\toverflow: hidden;\n\tpointer-events: none;\n\t}\n.leaflet-popup-tip {\n\twidth: 17px;\n\theight: 17px;\n\tpadding: 1px;\n\n\tmargin: -10px auto 0;\n\tpointer-events: auto;\n\n\t-webkit-transform: rotate(45deg);\n\t   -moz-transform: rotate(45deg);\n\t    -ms-transform: rotate(45deg);\n\t        transform: rotate(45deg);\n\t}\n.leaflet-popup-content-wrapper,\n.leaflet-popup-tip {\n\tbackground: white;\n\tcolor: #333;\n\tbox-shadow: 0 3px 14px rgba(0,0,0,0.4);\n\t}\n.leaflet-container a.leaflet-popup-close-button {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tborder: none;\n\ttext-align: center;\n\twidth: 24px;\n\theight: 24px;\n\tfont: 16px\/24px Tahoma, Verdana, sans-serif;\n\tcolor: #757575;\n\ttext-decoration: none;\n\tbackground: transparent;\n\t}\n.leaflet-container a.leaflet-popup-close-button:hover,\n.leaflet-container a.leaflet-popup-close-button:focus {\n\tcolor: #585858;\n\t}\n.leaflet-popup-scrolled {\n\toverflow: auto;\n\t}\n\n.leaflet-oldie .leaflet-popup-content-wrapper {\n\t-ms-zoom: 1;\n\t}\n.leaflet-oldie .leaflet-popup-tip {\n\twidth: 24px;\n\tmargin: 0 auto;\n\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\";\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\n\t}\n\n.leaflet-oldie .leaflet-control-zoom,\n.leaflet-oldie .leaflet-control-layers,\n.leaflet-oldie .leaflet-popup-content-wrapper,\n.leaflet-oldie .leaflet-popup-tip {\n\tborder: 1px solid #999;\n\t}\n\n\n\/* div icon *\/\n\n.leaflet-div-icon {\n\tbackground: #fff;\n\tborder: 1px solid #666;\n\t}\n\n\n\/* Tooltip *\/\n\/* Base styles for the element that has a tooltip *\/\n.leaflet-tooltip {\n\tposition: absolute;\n\tpadding: 6px;\n\tbackground-color: #fff;\n\tborder: 1px solid #fff;\n\tborder-radius: 3px;\n\tcolor: #222;\n\twhite-space: nowrap;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tpointer-events: none;\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.4);\n\t}\n.leaflet-tooltip.leaflet-interactive {\n\tcursor: pointer;\n\tpointer-events: auto;\n\t}\n.leaflet-tooltip-top:before,\n.leaflet-tooltip-bottom:before,\n.leaflet-tooltip-left:before,\n.leaflet-tooltip-right:before {\n\tposition: absolute;\n\tpointer-events: none;\n\tborder: 6px solid transparent;\n\tbackground: transparent;\n\tcontent: \"\";\n\t}\n\n\/* Directions *\/\n\n.leaflet-tooltip-bottom {\n\tmargin-top: 6px;\n}\n.leaflet-tooltip-top {\n\tmargin-top: -6px;\n}\n.leaflet-tooltip-bottom:before,\n.leaflet-tooltip-top:before {\n\tleft: 50%;\n\tmargin-left: -6px;\n\t}\n.leaflet-tooltip-top:before {\n\tbottom: 0;\n\tmargin-bottom: -12px;\n\tborder-top-color: #fff;\n\t}\n.leaflet-tooltip-bottom:before {\n\ttop: 0;\n\tmargin-top: -12px;\n\tmargin-left: -6px;\n\tborder-bottom-color: #fff;\n\t}\n.leaflet-tooltip-left {\n\tmargin-left: -6px;\n}\n.leaflet-tooltip-right {\n\tmargin-left: 6px;\n}\n.leaflet-tooltip-left:before,\n.leaflet-tooltip-right:before {\n\ttop: 50%;\n\tmargin-top: -6px;\n\t}\n.leaflet-tooltip-left:before {\n\tright: 0;\n\tmargin-right: -12px;\n\tborder-left-color: #fff;\n\t}\n.leaflet-tooltip-right:before {\n\tleft: 0;\n\tmargin-left: -12px;\n\tborder-right-color: #fff;\n\t}\n\n\/* Printing *\/\n\n@media print {\n\t\/* Prevent printers from removing background-images of controls. *\/\n\t.leaflet-control {\n\t\t-webkit-print-color-adjust: exact;\n\t\tprint-color-adjust: exact;\n\t\t}\n\t}\n<\/style>\n<style>.nvg-rd .deal-map{height:560px;width:100%;border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow);border:1px solid var(--border);margin-bottom:.75rem}@media(max-width:700px){.nvg-rd .deal-map{height:440px}}.nvg-rd .leaflet-container img{max-width:none!important;max-height:none!important;display:block}.nvg-rd .leaflet-container a{color:#0078a8}<\/style>\n<!-- NVG redesign LIVE 11\/9\/2026: homes -->\n<style>@import url(\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=Fraunces:opsz,wght@9..144,600;9..144,700&display=swap\");.nvg-rd{--navy:#0f2744;--navy-mid:#1a3a5c;--navy-light:#2a5080;--forest:#1e4d3d;--amber:#d4a017;--amber-hover:#b8860b;--amber-soft:#faf3e0;--cream:#f7f5f1;--white:#ffffff;--text:#1a2332;--text-muted:#5a6577;--border:#e2e6ed;--success:#2d6a4f;--danger-soft:#fef2f2;--radius:10px;--radius-lg:16px;--shadow:0 4px 24px rgba(15, 39, 68, 0.08);--shadow-lg:0 12px 40px rgba(15, 39, 68, 0.12);--font:\"DM Sans\", system-ui, -apple-system, sans-serif;--font-display:\"Fraunces\", Georgia, serif;--max:1120px;--header-h:72px}.nvg-rd *,.nvg-rd *::before,.nvg-rd *::after{box-sizing:border-box;margin:0;padding:0}.nvg-rd{scroll-behavior:smooth}.nvg-rd{font-family:var(--font);color:var(--text);background:var(--white);line-height:1.6;font-size:1rem;-webkit-font-smoothing:antialiased}.nvg-rd img{max-width:100%;height:auto;display:block}.nvg-rd a{color:var(--navy-light);text-decoration:none}.nvg-rd a:hover{color:var(--amber-hover)}.nvg-rd ul{list-style:none}.nvg-rd button,.nvg-rd input,.nvg-rd select,.nvg-rd textarea{font:inherit}.nvg-rd .container{width:min(100% - 2rem, var(--max));margin-inline:auto}.nvg-rd h1,.nvg-rd h2,.nvg-rd h3{font-family:var(--font-display);font-weight:600;line-height:1.2;color:var(--navy)}.nvg-rd h1{font-size:clamp(1.85rem, 4vw, 2.75rem)}.nvg-rd h2{font-size:clamp(1.5rem, 3vw, 2.1rem);margin-bottom:0.75rem}.nvg-rd h3{font-size:1.2rem;margin-bottom:0.5rem}.nvg-rd .lead{font-size:1.125rem;color:var(--text-muted);max-width:42rem}.nvg-rd .eyebrow{display:inline-block;font-size:0.8rem;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;color:var(--amber-hover);margin-bottom:0.5rem}.nvg-rd .btn{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;padding:0.85rem 1.5rem;border-radius:var(--radius);font-weight:600;border:2px solid transparent;cursor:pointer;transition:background 0.15s, color 0.15s, border-color 0.15s, transform 0.1s;text-align:center;text-decoration:none;line-height:1.2}.nvg-rd .btn:active{transform:scale(0.98)}.nvg-rd .btn-primary{background:var(--amber);color:var(--navy);border-color:var(--amber)}.nvg-rd .btn-primary:hover{background:var(--amber-hover);border-color:var(--amber-hover);color:var(--navy)}.nvg-rd .btn-sm{padding:0.55rem 1rem;font-size:0.9rem}.nvg-rd .phone-pending{display:inline-flex;flex-wrap:wrap;align-items:center;gap:0.4rem}.nvg-rd .site-header{position:sticky;top:0;z-index:100;background:var(--white);border-bottom:1px solid var(--border);box-shadow:0 1px 0 rgba(15,39,68,0.04)}.nvg-rd .header-inner{display:flex;align-items:center;justify-content:space-between;min-height:var(--header-h);gap:1rem}.nvg-rd .logo{display:flex;flex-direction:column;text-decoration:none;color:var(--navy);line-height:1.15}.nvg-rd .logo-mark{font-family:var(--font-display);font-weight:700;font-size:1.15rem;color:var(--navy)}.nvg-rd .logo-sub{font-size:0.7rem;color:var(--text-muted);font-weight:500}.nvg-rd .nav-main{display:none;align-items:center;gap:0.25rem}.nvg-rd .nav-main a{color:var(--text);font-weight:500;font-size:0.9rem;padding:0.5rem 0.7rem;border-radius:6px}.nvg-rd .nav-main a:hover{background:var(--cream);color:var(--navy)}.nvg-rd .nav-cta{display:none}.nvg-rd .nav-toggle{display:flex;flex-direction:column;gap:5px;background:none;border:none;padding:0.5rem;cursor:pointer}.nvg-rd .nav-toggle span{display:block;width:22px;height:2px;background:var(--navy);border-radius:1px}.nvg-rd .nav-mobile{display:none;flex-direction:column;padding:0.5rem 0 1rem;border-top:1px solid var(--border);gap:0.15rem}.nvg-rd .nav-mobile.open{display:flex}.nvg-rd .nav-mobile a{color:var(--text);font-weight:500;padding:0.75rem 0.5rem;border-radius:6px}.nvg-rd .nav-mobile a:hover{background:var(--cream)}.nvg-rd .secondary-nav{background:var(--navy);color:var(--white);font-size:0.8rem}.nvg-rd .secondary-nav .container{display:flex;flex-wrap:wrap;gap:0.25rem 1.25rem;padding:0.45rem 1rem;justify-content:flex-end}.nvg-rd .secondary-nav a{color:rgba(255,255,255,0.85)}.nvg-rd .secondary-nav a:hover{color:var(--amber)}@media (min-width: 900px){.nvg-rd .nav-main{display:flex}.nvg-rd .nav-cta{display:inline-flex}.nvg-rd .nav-toggle{display:none}}.nvg-rd .form-disclaimer{font-size:0.7rem;color:var(--text-muted);margin-top:0.75rem;line-height:1.45}.nvg-rd .section{padding:3.5rem 0}.nvg-rd .site-footer{background:var(--navy);color:rgba(255,255,255,0.8);padding:3rem 0 1.5rem;font-size:0.9rem}.nvg-rd .footer-grid{display:grid;gap:2rem;margin-bottom:2rem}@media (min-width: 700px){.nvg-rd .footer-grid{grid-template-columns:1.4fr 1fr 1fr 1fr}}.nvg-rd .site-footer h4{font-family:var(--font);font-size:0.8rem;text-transform:uppercase;letter-spacing:0.05em;color:var(--amber);margin-bottom:0.85rem}.nvg-rd .site-footer a{color:rgba(255,255,255,0.8)}.nvg-rd .site-footer a:hover{color:var(--amber)}.nvg-rd .site-footer ul li{margin-bottom:0.4rem}.nvg-rd .footer-brand .logo-mark{color:var(--white);margin-bottom:0.5rem}.nvg-rd .footer-nap{line-height:1.7}.nvg-rd .footer-bottom{border-top:1px solid rgba(255,255,255,0.12);padding-top:1.25rem;display:flex;flex-wrap:wrap;gap:0.75rem 1.5rem;justify-content:space-between;font-size:0.8rem;color:rgba(255,255,255,0.55)}.nvg-rd .page-hero{background:var(--navy);color:var(--white);padding:2.5rem 0}.nvg-rd .page-hero h1{color:var(--white)}.nvg-rd .page-hero .lead{color:rgba(255,255,255,0.85)}@media (max-width: 899px){.nvg-rd.has-sticky-cta{padding-bottom:72px}}.nvg-rd .skip-link{position:absolute;left:-9999px;top:0;background:var(--amber);color:var(--navy);padding:0.5rem 1rem;z-index:200;font-weight:700}.nvg-rd .skip-link:focus{left:0}.nvg-rd .mt-1{margin-top:0.5rem}.nvg-rd .broker-disclosure{font-size:0.82rem;line-height:1.5;color:rgba(255, 255, 255, 0.85);margin:1rem 0 0.75rem;max-width:62rem}.nvg-rd{--radius:18px;--radius-lg:26px}.nvg-rd .btn{border-radius:999px}.nvg-rd .photo-note{font-size:0.72rem;color:var(--text-muted);text-align:right;margin-top:0.5rem}.bg-overlay>.container>header,.edit-post-link,.content-without-sidebar article>.tbl-bottom,.content-without-sidebar .page-h1-divider{display:none!important}.bg-overlay>.container{width:auto!important;max-width:none!important;padding-left:0!important;padding-right:0!important}.content-without-sidebar{width:100%!important;margin:0!important;padding:0!important;float:none!important;background:transparent!important;box-shadow:none!important;border:0!important}.content-without-sidebar>.block-inner{padding:0!important}.nvg-rd{margin:0}<\/style>\n<div class=\"nvg-rd\">\n<a class=\"skip-link\" href=\"#main\">Skip to content<\/a>\n<div class=\"secondary-nav\"><div class=\"container\"><a href=\"https:\/\/northernvaluegroup.com\/?page_id=45\">Agents &amp; Brokers<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=6\">Lenders &amp; Lienholders<\/a><\/div><\/div>\n<header class=\"site-header\">\n<div class=\"container header-inner\">\n<a class=\"logo\" href=\"https:\/\/northernvaluegroup.com\/\"><span class=\"logo-mark\">Northern Value Group<\/span><span class=\"logo-sub\">Twin Cities cash home buyers<\/span><\/a>\n<nav aria-label=\"Primary\" class=\"nav-main\"><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7203\">How It Works<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7283\">Home sellers we&#39;ve worked with<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7201\">About<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=12\">Contact<\/a><\/nav>\n<a class=\"btn btn-primary btn-sm nav-cta\" href=\"https:\/\/northernvaluegroup.com\/#offer\">Get a Cash Offer<\/a>\n<button aria-expanded=\"false\" aria-label=\"Open menu\" class=\"nav-toggle\" type=\"button\"><span><\/span><span><\/span><span><\/span><\/button>\n<\/div>\n<nav aria-label=\"Mobile\" class=\"nav-mobile container\"><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7203\">How It Works<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7283\">Home sellers we&#39;ve worked with<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7201\">About<\/a><a href=\"https:\/\/northernvaluegroup.com\/?page_id=12\">Contact<\/a><a href=\"https:\/\/northernvaluegroup.com\/#offer\">Get a Cash Offer<\/a><\/nav>\n<\/header>\n<main id=\"main\"><section class=\"page-hero\"><div class=\"container\"><p class=\"eyebrow\" style=\"color:var(--amber)\">Our track record<\/p><h1>Home sellers we&#39;ve worked with<\/h1><p class=\"lead\">Each pin shows where Northern Value Group has made a custom sale transaction for a seller.<\/p><\/div><\/section>\n<section class=\"section\"><div class=\"container\"><div aria-label=\"Map of approximate purchase locations\" class=\"deal-map\" id=\"nvg-deal-map\" role=\"img\"><\/div><p class=\"photo-note\" style=\"text-align:left\">Pin locations are approximate. Exact addresses are not shown.<\/p><\/div><\/section><\/main>\n<footer class=\"site-footer\"><div class=\"container\">\n<div class=\"footer-grid\">\n<div class=\"footer-brand\"><div class=\"logo-mark\">Northern Value Group LLC<\/div><p class=\"footer-nap mt-1\"><a href=\"mailto:info@nvgmn.com\">info@nvgmn.com<\/a><br\/><span class=\"phone-pending\"><a href=\"tel:+16514893322\">(651) 489-3322<\/a> <\/span><\/p><\/div>\n<div><h4>Sellers<\/h4><ul><li><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7203\">How It Works<\/a><\/li><li><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7283\">Home sellers we&#39;ve worked with<\/a><\/li><\/ul><\/div>\n<div><h4>Company<\/h4><ul><li><a href=\"https:\/\/northernvaluegroup.com\/?page_id=7201\">About<\/a><\/li><li><a href=\"https:\/\/northernvaluegroup.com\/?page_id=12\">Contact<\/a><\/li><\/ul><\/div>\n<div><h4>Partners<\/h4><ul><li><a href=\"https:\/\/northernvaluegroup.com\/?page_id=45\">Agents<\/a><\/li><li><a href=\"https:\/\/northernvaluegroup.com\/?page_id=6\">Lenders<\/a><\/li><\/ul><\/div>\n<\/div>\n<div class=\"footer-bottom\"><span>\u00a9 Northern Value Group LLC.<\/span><a href=\"https:\/\/northernvaluegroup.com\/?page_id=86\">Privacy Policy<\/a><\/div>\n<p class=\"broker-disclosure\">Doug Grimm, an owner of Northern Value Group, is a licensed Minnesota real estate broker with Grimm Realty Group; Northern Value Group buys for its own account and does not represent you.<\/p>\n<\/div><\/footer>\n<\/div>\n<script>(function(){var R=document.currentScript;while(R&&!(R.classList&&R.classList.contains(\"nvg-rd\")))R=R.previousElementSibling;R=R||document.querySelector(\".nvg-rd\");if(!R)return;\nvar t=R.querySelector(\".nav-toggle\"),m=R.querySelector(\".nav-mobile\");if(t&&m)t.addEventListener(\"click\",function(){var o=m.classList.toggle(\"open\");t.setAttribute(\"aria-expanded\",o?\"true\":\"false\")});\n})();<\/script>\n<!-- Leaflet 1.9.4 JS (BSD-2-Clause, (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade), self-hosted inline as base64 so WordPress cannot alter it -->\n<script>(function(){if(window.L)return;var s=document.createElement(\"script\");s.text=decodeURIComponent(escape(atob(\"LyogQHByZXNlcnZlCiAqIExlYWZsZXQgMS45LjQsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4gaHR0cHM6Ly9sZWFmbGV0anMuY29tCiAqIChjKSAyMDEwLTIwMjMgVmxhZGltaXIgQWdhZm9ua2luLCAoYykgMjAxMC0yMDExIENsb3VkTWFkZQogKi8KIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9lKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ\/ZGVmaW5lKFsiZXhwb3J0cyJdLGUpOmUoKHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikubGVhZmxldD17fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwodCl7Zm9yKHZhciBlLGksbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcihlIGluIGk9YXJndW1lbnRzW25dKXRbZV09aVtlXTtyZXR1cm4gdH12YXIgUj1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbih0KXtyZXR1cm4gTi5wcm90b3R5cGU9dCxuZXcgTn07ZnVuY3Rpb24gTigpe31mdW5jdGlvbiBhKHQsZSl7dmFyIGksbj1BcnJheS5wcm90b3R5cGUuc2xpY2U7cmV0dXJuIHQuYmluZD90LmJpbmQuYXBwbHkodCxuLmNhbGwoYXJndW1lbnRzLDEpKTooaT1uLmNhbGwoYXJndW1lbnRzLDIpLGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxpLmxlbmd0aD9pLmNvbmNhdChuLmNhbGwoYXJndW1lbnRzKSk6YXJndW1lbnRzKX0pfXZhciBEPTA7ZnVuY3Rpb24gaCh0KXtyZXR1cm4iX2xlYWZsZXRfaWQiaW4gdHx8KHQuX2xlYWZsZXRfaWQ9KytEKSx0Ll9sZWFmbGV0X2lkfWZ1bmN0aW9uIGoodCxlLGkpe3ZhciBuLG8scz1mdW5jdGlvbigpe249ITEsbyYmKHIuYXBwbHkoaSxvKSxvPSExKX0scj1mdW5jdGlvbigpe24\/bz1hcmd1bWVudHM6KHQuYXBwbHkoaSxhcmd1bWVudHMpLHNldFRpbWVvdXQocyxlKSxuPSEwKX07cmV0dXJuIHJ9ZnVuY3Rpb24gSCh0LGUsaSl7dmFyIG49ZVsxXSxlPWVbMF0sbz1uLWU7cmV0dXJuIHQ9PT1uJiZpP3Q6KCh0LWUpJW8rbyklbytlfWZ1bmN0aW9uIHUoKXtyZXR1cm4hMX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuITE9PT1lP3Q6KGU9TWF0aC5wb3coMTAsdm9pZCAwPT09ZT82OmUpLE1hdGgucm91bmQodCplKS9lKX1mdW5jdGlvbiBXKHQpe3JldHVybiB0LnRyaW0\/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gRih0KXtyZXR1cm4gVyh0KS5zcGxpdCgvXHMrLyl9ZnVuY3Rpb24gYyh0LGUpe2Zvcih2YXIgaSBpbiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwib3B0aW9ucyIpfHwodC5vcHRpb25zPXQub3B0aW9ucz9SKHQub3B0aW9ucyk6e30pLGUpdC5vcHRpb25zW2ldPWVbaV07cmV0dXJuIHQub3B0aW9uc31mdW5jdGlvbiBVKHQsZSxpKXt2YXIgbixvPVtdO2ZvcihuIGluIHQpby5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChpP24udG9VcHBlckNhc2UoKTpuKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHRbbl0pKTtyZXR1cm4oZSYmLTEhPT1lLmluZGV4T2YoIj8iKT8iJiI6Ij8iKStvLmpvaW4oIiYiKX12YXIgVj0vXHsgKihbXHdfIC1dKykgKlx9L2c7ZnVuY3Rpb24gcSh0LGkpe3JldHVybiB0LnJlcGxhY2UoVixmdW5jdGlvbih0LGUpe2U9aVtlXTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiTm8gdmFsdWUgcHJvdmlkZWQgZm9yIHZhcmlhYmxlICIrdCk7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU\/ZShpKTplfSl9dmFyIGQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX07ZnVuY3Rpb24gRyh0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybi0xfXZhciBLPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHM9IjtmdW5jdGlvbiBZKHQpe3JldHVybiB3aW5kb3dbIndlYmtpdCIrdF18fHdpbmRvd1sibW96Iit0XXx8d2luZG93WyJtcyIrdF19dmFyIFg9MDtmdW5jdGlvbiBKKHQpe3ZhciBlPStuZXcgRGF0ZSxpPU1hdGgubWF4KDAsMTYtKGUtWCkpO3JldHVybiBYPWUraSx3aW5kb3cuc2V0VGltZW91dCh0LGkpfXZhciAkPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fFkoIlJlcXVlc3RBbmltYXRpb25GcmFtZSIpfHxKLFE9d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHxZKCJDYW5jZWxBbmltYXRpb25GcmFtZSIpfHxZKCJDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKXx8ZnVuY3Rpb24odCl7d2luZG93LmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24geCh0LGUsaSl7aWYoIWl8fCQhPT1KKXJldHVybiAkLmNhbGwod2luZG93LGEodCxlKSk7dC5jYWxsKGUpfWZ1bmN0aW9uIHIodCl7dCYmUS5jYWxsKHdpbmRvdyx0KX12YXIgdHQ9e19fcHJvdG9fXzpudWxsLGV4dGVuZDpsLGNyZWF0ZTpSLGJpbmQ6YSxnZXQgbGFzdElkKCl7cmV0dXJuIER9LHN0YW1wOmgsdGhyb3R0bGU6aix3cmFwTnVtOkgsZmFsc2VGbjp1LGZvcm1hdE51bTppLHRyaW06VyxzcGxpdFdvcmRzOkYsc2V0T3B0aW9uczpjLGdldFBhcmFtU3RyaW5nOlUsdGVtcGxhdGU6cSxpc0FycmF5OmQsaW5kZXhPZjpHLGVtcHR5SW1hZ2VVcmw6SyxyZXF1ZXN0Rm46JCxjYW5jZWxGbjpRLHJlcXVlc3RBbmltRnJhbWU6eCxjYW5jZWxBbmltRnJhbWU6cn07ZnVuY3Rpb24gZXQoKXt9ZXQuZXh0ZW5kPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtjKHRoaXMpLHRoaXMuaW5pdGlhbGl6ZSYmdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNhbGxJbml0SG9va3MoKX12YXIgaSxuPWUuX19zdXBlcl9fPXRoaXMucHJvdG90eXBlLG89UihuKTtmb3IoaSBpbihvLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZT1vLHRoaXMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsaSkmJiJwcm90b3R5cGUiIT09aSYmIl9fc3VwZXJfXyIhPT1pJiYoZVtpXT10aGlzW2ldKTtpZih0LnN0YXRpY3MmJmwoZSx0LnN0YXRpY3MpLHQuaW5jbHVkZXMpe3ZhciBzPXQuaW5jbHVkZXM7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBMJiZMJiZMLk1peGluKXtzPWQocyk\/czpbc107Zm9yKHZhciByPTA7cjxzLmxlbmd0aDtyKyspc1tyXT09PUwuTWl4aW4uRXZlbnRzJiZjb25zb2xlLndhcm4oIkRlcHJlY2F0ZWQgaW5jbHVkZSBvZiBMLk1peGluLkV2ZW50czogdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLCBwbGVhc2UgaW5oZXJpdCBmcm9tIEwuRXZlbnRlZCBpbnN0ZWFkLiIsKG5ldyBFcnJvcikuc3RhY2spfWwuYXBwbHkobnVsbCxbb10uY29uY2F0KHQuaW5jbHVkZXMpKX1yZXR1cm4gbChvLHQpLGRlbGV0ZSBvLnN0YXRpY3MsZGVsZXRlIG8uaW5jbHVkZXMsby5vcHRpb25zJiYoby5vcHRpb25zPW4ub3B0aW9ucz9SKG4ub3B0aW9ucyk6e30sbChvLm9wdGlvbnMsdC5vcHRpb25zKSksby5faW5pdEhvb2tzPVtdLG8uY2FsbEluaXRIb29rcz1mdW5jdGlvbigpe2lmKCF0aGlzLl9pbml0SG9va3NDYWxsZWQpe24uY2FsbEluaXRIb29rcyYmbi5jYWxsSW5pdEhvb2tzLmNhbGwodGhpcyksdGhpcy5faW5pdEhvb2tzQ2FsbGVkPSEwO2Zvcih2YXIgdD0wLGU9by5faW5pdEhvb2tzLmxlbmd0aDt0PGU7dCsrKW8uX2luaXRIb29rc1t0XS5jYWxsKHRoaXMpfX0sZX0sZXQuaW5jbHVkZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb3RvdHlwZS5vcHRpb25zO3JldHVybiBsKHRoaXMucHJvdG90eXBlLHQpLHQub3B0aW9ucyYmKHRoaXMucHJvdG90eXBlLm9wdGlvbnM9ZSx0aGlzLm1lcmdlT3B0aW9ucyh0Lm9wdGlvbnMpKSx0aGlzfSxldC5tZXJnZU9wdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGwodGhpcy5wcm90b3R5cGUub3B0aW9ucyx0KSx0aGlzfSxldC5hZGRJbml0SG9vaz1mdW5jdGlvbih0KXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7dGhpc1t0XS5hcHBseSh0aGlzLGUpfTtyZXR1cm4gdGhpcy5wcm90b3R5cGUuX2luaXRIb29rcz10aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzfHxbXSx0aGlzLnByb3RvdHlwZS5faW5pdEhvb2tzLnB1c2goaSksdGhpc307dmFyIGU9e29uOmZ1bmN0aW9uKHQsZSxpKXtpZigib2JqZWN0Ij09dHlwZW9mIHQpZm9yKHZhciBuIGluIHQpdGhpcy5fb24obix0W25dLGUpO2Vsc2UgZm9yKHZhciBvPTAscz0odD1GKHQpKS5sZW5ndGg7bzxzO28rKyl0aGlzLl9vbih0W29dLGUsaSk7cmV0dXJuIHRoaXN9LG9mZjpmdW5jdGlvbih0LGUsaSl7aWYoYXJndW1lbnRzLmxlbmd0aClpZigib2JqZWN0Ij09dHlwZW9mIHQpZm9yKHZhciBuIGluIHQpdGhpcy5fb2ZmKG4sdFtuXSxlKTtlbHNle3Q9Rih0KTtmb3IodmFyIG89MT09PWFyZ3VtZW50cy5sZW5ndGgscz0wLHI9dC5sZW5ndGg7czxyO3MrKylvP3RoaXMuX29mZih0W3NdKTp0aGlzLl9vZmYodFtzXSxlLGkpfWVsc2UgZGVsZXRlIHRoaXMuX2V2ZW50cztyZXR1cm4gdGhpc30sX29uOmZ1bmN0aW9uKHQsZSxpLG4peyJmdW5jdGlvbiIhPXR5cGVvZiBlP2NvbnNvbGUud2Fybigid3JvbmcgbGlzdGVuZXIgdHlwZTogIit0eXBlb2YgZSk6ITE9PT10aGlzLl9saXN0ZW5zKHQsZSxpKSYmKGU9e2ZuOmUsY3R4Omk9aT09PXRoaXM\/dm9pZCAwOml9LG4mJihlLm9uY2U9ITApLHRoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX2V2ZW50c1t0XT10aGlzLl9ldmVudHNbdF18fFtdLHRoaXMuX2V2ZW50c1t0XS5wdXNoKGUpKX0sX29mZjpmdW5jdGlvbih0LGUsaSl7dmFyIG4sbyxzO2lmKHRoaXMuX2V2ZW50cyYmKG49dGhpcy5fZXZlbnRzW3RdKSlpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYodGhpcy5fZmlyaW5nQ291bnQpZm9yKG89MCxzPW4ubGVuZ3RoO288cztvKyspbltvXS5mbj11O2RlbGV0ZSB0aGlzLl9ldmVudHNbdF19ZWxzZSJmdW5jdGlvbiIhPXR5cGVvZiBlP2NvbnNvbGUud2Fybigid3JvbmcgbGlzdGVuZXIgdHlwZTogIit0eXBlb2YgZSk6ITEhPT0oZT10aGlzLl9saXN0ZW5zKHQsZSxpKSkmJihpPW5bZV0sdGhpcy5fZmlyaW5nQ291bnQmJihpLmZuPXUsdGhpcy5fZXZlbnRzW3RdPW49bi5zbGljZSgpKSxuLnNwbGljZShlLDEpKX0sZmlyZTpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5saXN0ZW5zKHQsaSkpe3ZhciBuPWwoe30sZSx7dHlwZTp0LHRhcmdldDp0aGlzLHNvdXJjZVRhcmdldDplJiZlLnNvdXJjZVRhcmdldHx8dGhpc30pO2lmKHRoaXMuX2V2ZW50cyl7dmFyIG89dGhpcy5fZXZlbnRzW3RdO2lmKG8pe3RoaXMuX2ZpcmluZ0NvdW50PXRoaXMuX2ZpcmluZ0NvdW50KzF8fDE7Zm9yKHZhciBzPTAscj1vLmxlbmd0aDtzPHI7cysrKXt2YXIgYT1vW3NdLGg9YS5mbjthLm9uY2UmJnRoaXMub2ZmKHQsaCxhLmN0eCksaC5jYWxsKGEuY3R4fHx0aGlzLG4pfXRoaXMuX2ZpcmluZ0NvdW50LS19fWkmJnRoaXMuX3Byb3BhZ2F0ZUV2ZW50KG4pfXJldHVybiB0aGlzfSxsaXN0ZW5zOmZ1bmN0aW9uKHQsZSxpLG4peyJzdHJpbmciIT10eXBlb2YgdCYmY29uc29sZS53YXJuKCcic3RyaW5nIiB0eXBlIGFyZ3VtZW50IGV4cGVjdGVkJyk7dmFyIG89ZSxzPSgiZnVuY3Rpb24iIT10eXBlb2YgZSYmKG49ISFlLGk9bz12b2lkIDApLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdKTtpZihzJiZzLmxlbmd0aCYmITEhPT10aGlzLl9saXN0ZW5zKHQsbyxpKSlyZXR1cm4hMDtpZihuKWZvcih2YXIgciBpbiB0aGlzLl9ldmVudFBhcmVudHMpaWYodGhpcy5fZXZlbnRQYXJlbnRzW3JdLmxpc3RlbnModCxlLGksbikpcmV0dXJuITA7cmV0dXJuITF9LF9saXN0ZW5zOmZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLl9ldmVudHMpe3ZhciBuPXRoaXMuX2V2ZW50c1t0XXx8W107aWYoIWUpcmV0dXJuISFuLmxlbmd0aDtpPT09dGhpcyYmKGk9dm9pZCAwKTtmb3IodmFyIG89MCxzPW4ubGVuZ3RoO288cztvKyspaWYobltvXS5mbj09PWUmJm5bb10uY3R4PT09aSlyZXR1cm4gb31yZXR1cm4hMX0sb25jZTpmdW5jdGlvbih0LGUsaSl7aWYoIm9iamVjdCI9PXR5cGVvZiB0KWZvcih2YXIgbiBpbiB0KXRoaXMuX29uKG4sdFtuXSxlLCEwKTtlbHNlIGZvcih2YXIgbz0wLHM9KHQ9Rih0KSkubGVuZ3RoO288cztvKyspdGhpcy5fb24odFtvXSxlLGksITApO3JldHVybiB0aGlzfSxhZGRFdmVudFBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRQYXJlbnRzPXRoaXMuX2V2ZW50UGFyZW50c3x8e30sdGhpcy5fZXZlbnRQYXJlbnRzW2godCldPXQsdGhpc30scmVtb3ZlRXZlbnRQYXJlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50UGFyZW50cyYmZGVsZXRlIHRoaXMuX2V2ZW50UGFyZW50c1toKHQpXSx0aGlzfSxfcHJvcGFnYXRlRXZlbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX2V2ZW50UGFyZW50cyl0aGlzLl9ldmVudFBhcmVudHNbZV0uZmlyZSh0LnR5cGUsbCh7bGF5ZXI6dC50YXJnZXQscHJvcGFnYXRlZEZyb206dC50YXJnZXR9LHQpLCEwKX19LGl0PShlLmFkZEV2ZW50TGlzdGVuZXI9ZS5vbixlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZS5jbGVhckFsbEV2ZW50TGlzdGVuZXJzPWUub2ZmLGUuYWRkT25lVGltZUV2ZW50TGlzdGVuZXI9ZS5vbmNlLGUuZmlyZUV2ZW50PWUuZmlyZSxlLmhhc0V2ZW50TGlzdGVuZXJzPWUubGlzdGVucyxldC5leHRlbmQoZSkpO2Z1bmN0aW9uIHAodCxlLGkpe3RoaXMueD1pP01hdGgucm91bmQodCk6dCx0aGlzLnk9aT9NYXRoLnJvdW5kKGUpOmV9dmFyIG50PU1hdGgudHJ1bmN8fGZ1bmN0aW9uKHQpe3JldHVybiAwPHQ\/TWF0aC5mbG9vcih0KTpNYXRoLmNlaWwodCl9O2Z1bmN0aW9uIG0odCxlLGkpe3JldHVybiB0IGluc3RhbmNlb2YgcD90OmQodCk\/bmV3IHAodFswXSx0WzFdKTpudWxsPT10P3Q6Im9iamVjdCI9PXR5cGVvZiB0JiYieCJpbiB0JiYieSJpbiB0P25ldyBwKHQueCx0LnkpOm5ldyBwKHQsZSxpKX1mdW5jdGlvbiBmKHQsZSl7aWYodClmb3IodmFyIGk9ZT9bdCxlXTp0LG49MCxvPWkubGVuZ3RoO248bztuKyspdGhpcy5leHRlbmQoaVtuXSl9ZnVuY3Rpb24gXyh0LGUpe3JldHVybiF0fHx0IGluc3RhbmNlb2YgZj90Om5ldyBmKHQsZSl9ZnVuY3Rpb24gcyh0LGUpe2lmKHQpZm9yKHZhciBpPWU\/W3QsZV06dCxuPTAsbz1pLmxlbmd0aDtuPG87bisrKXRoaXMuZXh0ZW5kKGlbbl0pfWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHM\/dDpuZXcgcyh0LGUpfWZ1bmN0aW9uIHYodCxlLGkpe2lmKGlzTmFOKHQpfHxpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgTGF0TG5nIG9iamVjdDogKCIrdCsiLCAiK2UrIikiKTt0aGlzLmxhdD0rdCx0aGlzLmxuZz0rZSx2b2lkIDAhPT1pJiYodGhpcy5hbHQ9K2kpfWZ1bmN0aW9uIHcodCxlLGkpe3JldHVybiB0IGluc3RhbmNlb2Ygdj90OmQodCkmJiJvYmplY3QiIT10eXBlb2YgdFswXT8zPT09dC5sZW5ndGg\/bmV3IHYodFswXSx0WzFdLHRbMl0pOjI9PT10Lmxlbmd0aD9uZXcgdih0WzBdLHRbMV0pOm51bGw6bnVsbD09dD90OiJvYmplY3QiPT10eXBlb2YgdCYmImxhdCJpbiB0P25ldyB2KHQubGF0LCJsbmciaW4gdD90LmxuZzp0Lmxvbix0LmFsdCk6dm9pZCAwPT09ZT9udWxsOm5ldyB2KHQsZSxpKX1wLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAodGhpcy54LHRoaXMueSl9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQobSh0KSl9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LHN1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1YnRyYWN0KG0odCkpfSxfc3VidHJhY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LGRpdmlkZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2RpdmlkZUJ5KHQpfSxfZGl2aWRlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0aXBseUJ5KHQpfSxfbXVsdGlwbHlCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxzY2FsZUJ5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcCh0aGlzLngqdC54LHRoaXMueSp0LnkpfSx1bnNjYWxlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwKHRoaXMueC90LngsdGhpcy55L3QueSl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfSxmbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2Zsb29yKCl9LF9mbG9vcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc30sY2VpbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX2NlaWwoKX0sX2NlaWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfSx0cnVuYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3RydW5jKCl9LF90cnVuYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9bnQodGhpcy54KSx0aGlzLnk9bnQodGhpcy55KSx0aGlzfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3ZhciBlPSh0PW0odCkpLngtdGhpcy54LHQ9dC55LXRoaXMueTtyZXR1cm4gTWF0aC5zcXJ0KGUqZSt0KnQpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9bSh0KSkueD09PXRoaXMueCYmdC55PT09dGhpcy55fSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdD1tKHQpLE1hdGguYWJzKHQueCk8PU1hdGguYWJzKHRoaXMueCkmJk1hdGguYWJzKHQueSk8PU1hdGguYWJzKHRoaXMueSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIlBvaW50KCIraSh0aGlzLngpKyIsICIraSh0aGlzLnkpKyIpIn19LGYucHJvdG90eXBlPXtleHRlbmQ6ZnVuY3Rpb24odCl7dmFyIGUsaTtpZih0KXtpZih0IGluc3RhbmNlb2YgcHx8Im51bWJlciI9PXR5cGVvZiB0WzBdfHwieCJpbiB0KWU9aT1tKHQpO2Vsc2UgaWYoZT0odD1fKHQpKS5taW4saT10Lm1heCwhZXx8IWkpcmV0dXJuIHRoaXM7dGhpcy5taW58fHRoaXMubWF4Pyh0aGlzLm1pbi54PU1hdGgubWluKGUueCx0aGlzLm1pbi54KSx0aGlzLm1heC54PU1hdGgubWF4KGkueCx0aGlzLm1heC54KSx0aGlzLm1pbi55PU1hdGgubWluKGUueSx0aGlzLm1pbi55KSx0aGlzLm1heC55PU1hdGgubWF4KGkueSx0aGlzLm1heC55KSk6KHRoaXMubWluPWUuY2xvbmUoKSx0aGlzLm1heD1pLmNsb25lKCkpfXJldHVybiB0aGlzfSxnZXRDZW50ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG0oKHRoaXMubWluLngrdGhpcy5tYXgueCkvMiwodGhpcy5taW4ueSt0aGlzLm1heC55KS8yLHQpfSxnZXRCb3R0b21MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcy5taW4ueCx0aGlzLm1heC55KX0sZ2V0VG9wUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gbSh0aGlzLm1heC54LHRoaXMubWluLnkpfSxnZXRUb3BMZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWlufSxnZXRCb3R0b21SaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heH0sZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC5zdWJ0cmFjdCh0aGlzLm1pbil9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3ZhciBlLGk7cmV0dXJuKHQ9KCJudW1iZXIiPT10eXBlb2YgdFswXXx8dCBpbnN0YW5jZW9mIHA\/bTpfKSh0KSlpbnN0YW5jZW9mIGY\/KGU9dC5taW4saT10Lm1heCk6ZT1pPXQsZS54Pj10aGlzLm1pbi54JiZpLng8PXRoaXMubWF4LngmJmUueT49dGhpcy5taW4ueSYmaS55PD10aGlzLm1heC55fSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQpe3Q9Xyh0KTt2YXIgZT10aGlzLm1pbixpPXRoaXMubWF4LG49dC5taW4sdD10Lm1heCxvPXQueD49ZS54JiZuLng8PWkueCx0PXQueT49ZS55JiZuLnk8PWkueTtyZXR1cm4gbyYmdH0sb3ZlcmxhcHM6ZnVuY3Rpb24odCl7dD1fKHQpO3ZhciBlPXRoaXMubWluLGk9dGhpcy5tYXgsbj10Lm1pbix0PXQubWF4LG89dC54PmUueCYmbi54PGkueCx0PXQueT5lLnkmJm4ueTxpLnk7cmV0dXJuIG8mJnR9LGlzVmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLm1pbnx8IXRoaXMubWF4KX0scGFkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWluLGk9dGhpcy5tYXgsbj1NYXRoLmFicyhlLngtaS54KSp0LHQ9TWF0aC5hYnMoZS55LWkueSkqdDtyZXR1cm4gXyhtKGUueC1uLGUueS10KSxtKGkueCtuLGkueSt0KSl9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4hIXQmJih0PV8odCksdGhpcy5taW4uZXF1YWxzKHQuZ2V0VG9wTGVmdCgpKSYmdGhpcy5tYXguZXF1YWxzKHQuZ2V0Qm90dG9tUmlnaHQoKSkpfX0scy5wcm90b3R5cGU9e2V4dGVuZDpmdW5jdGlvbih0KXt2YXIgZSxpLG49dGhpcy5fc291dGhXZXN0LG89dGhpcy5fbm9ydGhFYXN0O2lmKHQgaW5zdGFuY2VvZiB2KWk9ZT10O2Vsc2V7aWYoISh0IGluc3RhbmNlb2YgcykpcmV0dXJuIHQ\/dGhpcy5leHRlbmQodyh0KXx8Zyh0KSk6dGhpcztpZihlPXQuX3NvdXRoV2VzdCxpPXQuX25vcnRoRWFzdCwhZXx8IWkpcmV0dXJuIHRoaXN9cmV0dXJuIG58fG8\/KG4ubGF0PU1hdGgubWluKGUubGF0LG4ubGF0KSxuLmxuZz1NYXRoLm1pbihlLmxuZyxuLmxuZyksby5sYXQ9TWF0aC5tYXgoaS5sYXQsby5sYXQpLG8ubG5nPU1hdGgubWF4KGkubG5nLG8ubG5nKSk6KHRoaXMuX3NvdXRoV2VzdD1uZXcgdihlLmxhdCxlLmxuZyksdGhpcy5fbm9ydGhFYXN0PW5ldyB2KGkubGF0LGkubG5nKSksdGhpc30scGFkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3NvdXRoV2VzdCxpPXRoaXMuX25vcnRoRWFzdCxuPU1hdGguYWJzKGUubGF0LWkubGF0KSp0LHQ9TWF0aC5hYnMoZS5sbmctaS5sbmcpKnQ7cmV0dXJuIG5ldyBzKG5ldyB2KGUubGF0LW4sZS5sbmctdCksbmV3IHYoaS5sYXQrbixpLmxuZyt0KSl9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgdigodGhpcy5fc291dGhXZXN0LmxhdCt0aGlzLl9ub3J0aEVhc3QubGF0KS8yLCh0aGlzLl9zb3V0aFdlc3QubG5nK3RoaXMuX25vcnRoRWFzdC5sbmcpLzIpfSxnZXRTb3V0aFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291dGhXZXN0fSxnZXROb3J0aEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0fSxnZXROb3J0aFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHYodGhpcy5nZXROb3J0aCgpLHRoaXMuZ2V0V2VzdCgpKX0sZ2V0U291dGhFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2KHRoaXMuZ2V0U291dGgoKSx0aGlzLmdldEVhc3QoKSl9LGdldFdlc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291dGhXZXN0LmxuZ30sZ2V0U291dGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291dGhXZXN0LmxhdH0sZ2V0RWFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub3J0aEVhc3QubG5nfSxnZXROb3J0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub3J0aEVhc3QubGF0fSxjb250YWluczpmdW5jdGlvbih0KXt0PSgibnVtYmVyIj09dHlwZW9mIHRbMF18fHQgaW5zdGFuY2VvZiB2fHwibGF0ImluIHQ\/dzpnKSh0KTt2YXIgZSxpLG49dGhpcy5fc291dGhXZXN0LG89dGhpcy5fbm9ydGhFYXN0O3JldHVybiB0IGluc3RhbmNlb2Ygcz8oZT10LmdldFNvdXRoV2VzdCgpLGk9dC5nZXROb3J0aEVhc3QoKSk6ZT1pPXQsZS5sYXQ+PW4ubGF0JiZpLmxhdDw9by5sYXQmJmUubG5nPj1uLmxuZyYmaS5sbmc8PW8ubG5nfSxpbnRlcnNlY3RzOmZ1bmN0aW9uKHQpe3Q9Zyh0KTt2YXIgZT10aGlzLl9zb3V0aFdlc3QsaT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLHQ9dC5nZXROb3J0aEVhc3QoKSxvPXQubGF0Pj1lLmxhdCYmbi5sYXQ8PWkubGF0LHQ9dC5sbmc+PWUubG5nJiZuLmxuZzw9aS5sbmc7cmV0dXJuIG8mJnR9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9Zyh0KTt2YXIgZT10aGlzLl9zb3V0aFdlc3QsaT10aGlzLl9ub3J0aEVhc3Qsbj10LmdldFNvdXRoV2VzdCgpLHQ9dC5nZXROb3J0aEVhc3QoKSxvPXQubGF0PmUubGF0JiZuLmxhdDxpLmxhdCx0PXQubG5nPmUubG5nJiZuLmxuZzxpLmxuZztyZXR1cm4gbyYmdH0sdG9CQm94U3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZ2V0V2VzdCgpLHRoaXMuZ2V0U291dGgoKSx0aGlzLmdldEVhc3QoKSx0aGlzLmdldE5vcnRoKCldLmpvaW4oIiwiKX0sZXF1YWxzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuISF0JiYodD1nKHQpLHRoaXMuX3NvdXRoV2VzdC5lcXVhbHModC5nZXRTb3V0aFdlc3QoKSxlKSYmdGhpcy5fbm9ydGhFYXN0LmVxdWFscyh0LmdldE5vcnRoRWFzdCgpLGUpKX0saXNWYWxpZDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXMuX3NvdXRoV2VzdHx8IXRoaXMuX25vcnRoRWFzdCl9fTt2YXIgb3Q9e2xhdExuZ1RvUG9pbnQ6ZnVuY3Rpb24odCxlKXt0PXRoaXMucHJvamVjdGlvbi5wcm9qZWN0KHQpLGU9dGhpcy5zY2FsZShlKTtyZXR1cm4gdGhpcy50cmFuc2Zvcm1hdGlvbi5fdHJhbnNmb3JtKHQsZSl9LHBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCxlKXtlPXRoaXMuc2NhbGUoZSksdD10aGlzLnRyYW5zZm9ybWF0aW9uLnVudHJhbnNmb3JtKHQsZSk7cmV0dXJuIHRoaXMucHJvamVjdGlvbi51bnByb2plY3QodCl9LHByb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvamVjdGlvbi5wcm9qZWN0KHQpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvamVjdGlvbi51bnByb2plY3QodCl9LHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAyNTYqTWF0aC5wb3coMix0KX0sem9vbTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codC8yNTYpL01hdGguTE4yfSxnZXRQcm9qZWN0ZWRCb3VuZHM6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHRoaXMuaW5maW5pdGU\/bnVsbDooZT10aGlzLnByb2plY3Rpb24uYm91bmRzLHQ9dGhpcy5zY2FsZSh0KSxuZXcgZih0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShlLm1pbix0KSx0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShlLm1heCx0KSkpfSxpbmZpbml0ZTohKHYucHJvdG90eXBlPXtlcXVhbHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4hIXQmJih0PXcodCksTWF0aC5tYXgoTWF0aC5hYnModGhpcy5sYXQtdC5sYXQpLE1hdGguYWJzKHRoaXMubG5nLXQubG5nKSk8PSh2b2lkIDA9PT1lPzFlLTk6ZSkpfSx0b1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4iTGF0TG5nKCIraSh0aGlzLmxhdCx0KSsiLCAiK2kodGhpcy5sbmcsdCkrIikifSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBzdC5kaXN0YW5jZSh0aGlzLHcodCkpfSx3cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHN0LndyYXBMYXRMbmcodGhpcyl9LHRvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciB0PTE4MCp0LzQwMDc1MDE3LGU9dC9NYXRoLmNvcyhNYXRoLlBJLzE4MCp0aGlzLmxhdCk7cmV0dXJuIGcoW3RoaXMubGF0LXQsdGhpcy5sbmctZV0sW3RoaXMubGF0K3QsdGhpcy5sbmcrZV0pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmxhdCx0aGlzLmxuZyx0aGlzLmFsdCl9fSksd3JhcExhdExuZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLndyYXBMbmc\/SCh0LmxuZyx0aGlzLndyYXBMbmcsITApOnQubG5nO3JldHVybiBuZXcgdih0aGlzLndyYXBMYXQ\/SCh0LmxhdCx0aGlzLndyYXBMYXQsITApOnQubGF0LGUsdC5hbHQpfSx3cmFwTGF0TG5nQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q2VudGVyKCksaT10aGlzLndyYXBMYXRMbmcoZSksbj1lLmxhdC1pLmxhdCxlPWUubG5nLWkubG5nO3JldHVybiAwPT1uJiYwPT1lP3Q6KGk9dC5nZXRTb3V0aFdlc3QoKSx0PXQuZ2V0Tm9ydGhFYXN0KCksbmV3IHMobmV3IHYoaS5sYXQtbixpLmxuZy1lKSxuZXcgdih0LmxhdC1uLHQubG5nLWUpKSl9fSxzdD1sKHt9LG90LHt3cmFwTG5nOlstMTgwLDE4MF0sUjo2MzcxZTMsZGlzdGFuY2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLlBJLzE4MCxuPXQubGF0Kmksbz1lLmxhdCppLHM9TWF0aC5zaW4oKGUubGF0LXQubGF0KSppLzIpLGU9TWF0aC5zaW4oKGUubG5nLXQubG5nKSppLzIpLHQ9cypzK01hdGguY29zKG4pKk1hdGguY29zKG8pKmUqZSxpPTIqTWF0aC5hdGFuMihNYXRoLnNxcnQodCksTWF0aC5zcXJ0KDEtdCkpO3JldHVybiB0aGlzLlIqaX19KSxydD02Mzc4MTM3LHJ0PXtSOnJ0LE1BWF9MQVRJVFVERTo4NS4wNTExMjg3Nzk4LHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5QSS8xODAsaT10aGlzLk1BWF9MQVRJVFVERSxpPU1hdGgubWF4KE1hdGgubWluKGksdC5sYXQpLC1pKSxpPU1hdGguc2luKGkqZSk7cmV0dXJuIG5ldyBwKHRoaXMuUip0LmxuZyplLHRoaXMuUipNYXRoLmxvZygoMStpKS8oMS1pKSkvMil9LHVucHJvamVjdDpmdW5jdGlvbih0KXt2YXIgZT0xODAvTWF0aC5QSTtyZXR1cm4gbmV3IHYoKDIqTWF0aC5hdGFuKE1hdGguZXhwKHQueS90aGlzLlIpKS1NYXRoLlBJLzIpKmUsdC54KmUvdGhpcy5SKX0sYm91bmRzOm5ldyBmKFstKHJ0PXJ0Kk1hdGguUEkpLC1ydF0sW3J0LHJ0XSl9O2Z1bmN0aW9uIGF0KHQsZSxpLG4pe2QodCk\/KHRoaXMuX2E9dFswXSx0aGlzLl9iPXRbMV0sdGhpcy5fYz10WzJdLHRoaXMuX2Q9dFszXSk6KHRoaXMuX2E9dCx0aGlzLl9iPWUsdGhpcy5fYz1pLHRoaXMuX2Q9bil9ZnVuY3Rpb24gaHQodCxlLGksbil7cmV0dXJuIG5ldyBhdCh0LGUsaSxuKX1hdC5wcm90b3R5cGU9e3RyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm0odC5jbG9uZSgpLGUpfSxfdHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueD0oZT1lfHwxKSoodGhpcy5fYSp0LngrdGhpcy5fYiksdC55PWUqKHRoaXMuX2MqdC55K3RoaXMuX2QpLHR9LHVudHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBwKCh0LngvKGU9ZXx8MSktdGhpcy5fYikvdGhpcy5fYSwodC55L2UtdGhpcy5fZCkvdGhpcy5fYyl9fTt2YXIgbHQ9bCh7fSxzdCx7Y29kZToiRVBTRzozODU3Iixwcm9qZWN0aW9uOnJ0LHRyYW5zZm9ybWF0aW9uOmh0KGx0PS41LyhNYXRoLlBJKnJ0LlIpLC41LC1sdCwuNSl9KSx1dD1sKHt9LGx0LHtjb2RlOiJFUFNHOjkwMDkxMyJ9KTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCl9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIGksbixvLHMscj0iIixhPTAsaD10Lmxlbmd0aDthPGg7YSsrKXtmb3IoaT0wLG49KG89dFthXSkubGVuZ3RoO2k8bjtpKyspcis9KGk\/IkwiOiJNIikrKHM9b1tpXSkueCsiICIrcy55O3IrPWU\/Yi5zdmc\/InoiOiJ4IjoiIn1yZXR1cm4gcnx8Ik0wIDAifXZhciBfdD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUscHQ9IkFjdGl2ZVhPYmplY3QiaW4gd2luZG93LG10PXB0JiYhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcixuPSJtc0xhdW5jaFVyaSJpbiBuYXZpZ2F0b3ImJiEoImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCksZnQ9eSgid2Via2l0IiksZ3Q9eSgiYW5kcm9pZCIpLHZ0PXkoImFuZHJvaWQgMiIpfHx5KCJhbmRyb2lkIDMiKSx5dD1wYXJzZUludCgvV2ViS2l0XC8oWzAtOV0rKXwkLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpWzFdLDEwKSx5dD1ndCYmeSgiR29vZ2xlIikmJnl0PDUzNyYmISgiQXVkaW9Ob2RlImluIHdpbmRvdykseHQ9ISF3aW5kb3cub3BlcmEsd3Q9IW4mJnkoImNocm9tZSIpLGJ0PXkoImdlY2tvIikmJiFmdCYmIXh0JiYhcHQsUHQ9IXd0JiZ5KCJzYWZhcmkiKSxMdD15KCJwaGFudG9tIiksbz0iT1RyYW5zaXRpb24iaW4gX3QsVHQ9MD09PW5hdmlnYXRvci5wbGF0Zm9ybS5pbmRleE9mKCJXaW4iKSxNdD1wdCYmInRyYW5zaXRpb24iaW4gX3QsenQ9IldlYktpdENTU01hdHJpeCJpbiB3aW5kb3cmJiJtMTEiaW4gbmV3IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgmJiF2dCxfdD0iTW96UGVyc3BlY3RpdmUiaW4gX3QsQ3Q9IXdpbmRvdy5MX0RJU0FCTEVfM0QmJihNdHx8enR8fF90KSYmIW8mJiFMdCxadD0idW5kZWZpbmVkIiE9dHlwZW9mIG9yaWVudGF0aW9ufHx5KCJtb2JpbGUiKSxTdD1adCYmZnQsRXQ9WnQmJnp0LGt0PSF3aW5kb3cuUG9pbnRlckV2ZW50JiZ3aW5kb3cuTVNQb2ludGVyRXZlbnQsT3Q9ISghd2luZG93LlBvaW50ZXJFdmVudCYmIWt0KSxBdD0ib250b3VjaHN0YXJ0ImluIHdpbmRvd3x8ISF3aW5kb3cuVG91Y2hFdmVudCxCdD0hd2luZG93LkxfTk9fVE9VQ0gmJihBdHx8T3QpLEl0PVp0JiZ4dCxSdD1adCYmYnQsTnQ9MTwod2luZG93LmRldmljZVBpeGVsUmF0aW98fHdpbmRvdy5zY3JlZW4uZGV2aWNlWERQSS93aW5kb3cuc2NyZWVuLmxvZ2ljYWxYRFBJKSxEdD1mdW5jdGlvbigpe3ZhciB0PSExO3RyeXt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXt0PSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCIsdSxlKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdFBhc3NpdmVFdmVudFN1cHBvcnQiLHUsZSl9Y2F0Y2godCl7fXJldHVybiB0fSgpLGp0PSEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCxIdD0hKCFkb2N1bWVudC5jcmVhdGVFbGVtZW50TlN8fCFjdCgic3ZnIikuY3JlYXRlU1ZHUmVjdCksV3Q9ISFIdCYmKChXdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPSI8c3ZnLz4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI9PT0oV3QuZmlyc3RDaGlsZCYmV3QuZmlyc3RDaGlsZC5uYW1lc3BhY2VVUkkpKTtmdW5jdGlvbiB5KHQpe3JldHVybiAwPD1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KX12YXIgYj17aWU6cHQsaWVsdDk6bXQsZWRnZTpuLHdlYmtpdDpmdCxhbmRyb2lkOmd0LGFuZHJvaWQyMzp2dCxhbmRyb2lkU3RvY2s6eXQsb3BlcmE6eHQsY2hyb21lOnd0LGdlY2tvOmJ0LHNhZmFyaTpQdCxwaGFudG9tOkx0LG9wZXJhMTI6byx3aW46VHQsaWUzZDpNdCx3ZWJraXQzZDp6dCxnZWNrbzNkOl90LGFueTNkOkN0LG1vYmlsZTpadCxtb2JpbGVXZWJraXQ6U3QsbW9iaWxlV2Via2l0M2Q6RXQsbXNQb2ludGVyOmt0LHBvaW50ZXI6T3QsdG91Y2g6QnQsdG91Y2hOYXRpdmU6QXQsbW9iaWxlT3BlcmE6SXQsbW9iaWxlR2Vja286UnQscmV0aW5hOk50LHBhc3NpdmVFdmVudHM6RHQsY2FudmFzOmp0LHN2ZzpIdCx2bWw6IUh0JiZmdW5jdGlvbigpe3RyeXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPSh0LmlubmVySFRNTD0nPHY6c2hhcGUgYWRqPSIxIi8+Jyx0LmZpcnN0Q2hpbGQpO3JldHVybiBlLnN0eWxlLmJlaGF2aW9yPSJ1cmwoI2RlZmF1bHQjVk1MKSIsZSYmIm9iamVjdCI9PXR5cGVvZiBlLmFkan1jYXRjaCh0KXtyZXR1cm4hMX19KCksaW5saW5lU3ZnOld0LG1hYzowPT09bmF2aWdhdG9yLnBsYXRmb3JtLmluZGV4T2YoIk1hYyIpLGxpbnV4OjA9PT1uYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZigiTGludXgiKX0sRnQ9Yi5tc1BvaW50ZXI\/Ik1TUG9pbnRlckRvd24iOiJwb2ludGVyZG93biIsVXQ9Yi5tc1BvaW50ZXI\/Ik1TUG9pbnRlck1vdmUiOiJwb2ludGVybW92ZSIsVnQ9Yi5tc1BvaW50ZXI\/Ik1TUG9pbnRlclVwIjoicG9pbnRlcnVwIixxdD1iLm1zUG9pbnRlcj8iTVNQb2ludGVyQ2FuY2VsIjoicG9pbnRlcmNhbmNlbCIsR3Q9e3RvdWNoc3RhcnQ6RnQsdG91Y2htb3ZlOlV0LHRvdWNoZW5kOlZ0LHRvdWNoY2FuY2VsOnF0fSxLdD17dG91Y2hzdGFydDpmdW5jdGlvbih0LGUpe2UuTVNQT0lOVEVSX1RZUEVfVE9VQ0gmJmUucG9pbnRlclR5cGU9PT1lLk1TUE9JTlRFUl9UWVBFX1RPVUNIJiZPKGUpO2VlKHQsZSl9LHRvdWNobW92ZTplZSx0b3VjaGVuZDplZSx0b3VjaGNhbmNlbDplZX0sWXQ9e30sWHQ9ITE7ZnVuY3Rpb24gSnQodCxlLGkpe3JldHVybiJ0b3VjaHN0YXJ0IiE9PWV8fFh0fHwoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGdCwkdCwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihVdCxRdCwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihWdCx0ZSwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihxdCx0ZSwhMCksWHQ9ITApLEt0W2VdPyhpPUt0W2VdLmJpbmQodGhpcyxpKSx0LmFkZEV2ZW50TGlzdGVuZXIoR3RbZV0saSwhMSksaSk6KGNvbnNvbGUud2Fybigid3JvbmcgZXZlbnQgc3BlY2lmaWVkOiIsZSksdSl9ZnVuY3Rpb24gJHQodCl7WXRbdC5wb2ludGVySWRdPXR9ZnVuY3Rpb24gUXQodCl7WXRbdC5wb2ludGVySWRdJiYoWXRbdC5wb2ludGVySWRdPXQpfWZ1bmN0aW9uIHRlKHQpe2RlbGV0ZSBZdFt0LnBvaW50ZXJJZF19ZnVuY3Rpb24gZWUodCxlKXtpZihlLnBvaW50ZXJUeXBlIT09KGUuTVNQT0lOVEVSX1RZUEVfTU9VU0V8fCJtb3VzZSIpKXtmb3IodmFyIGkgaW4gZS50b3VjaGVzPVtdLFl0KWUudG91Y2hlcy5wdXNoKFl0W2ldKTtlLmNoYW5nZWRUb3VjaGVzPVtlXSx0KGUpfX12YXIgaWU9MjAwO2Z1bmN0aW9uIG5lKHQsaSl7dC5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsaSk7dmFyIG4sbz0wO2Z1bmN0aW9uIGUodCl7dmFyIGU7MSE9PXQuZGV0YWlsP249dC5kZXRhaWw6Im1vdXNlIj09PXQucG9pbnRlclR5cGV8fHQuc291cmNlQ2FwYWJpbGl0aWVzJiYhdC5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50c3x8KChlPU5lKHQpKS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgSFRNTExhYmVsRWxlbWVudCYmdC5hdHRyaWJ1dGVzLmZvcn0pJiYhZS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50fSl8fCgoZT1EYXRlLm5vdygpKS1vPD1pZT8yPT09KytuJiZpKGZ1bmN0aW9uKHQpe3ZhciBlLGksbj17fTtmb3IoaSBpbiB0KWU9dFtpXSxuW2ldPWUmJmUuYmluZD9lLmJpbmQodCk6ZTtyZXR1cm4odD1uKS50eXBlPSJkYmxjbGljayIsbi5kZXRhaWw9MixuLmlzVHJ1c3RlZD0hMSxuLl9zaW11bGF0ZWQ9ITAsbn0odCkpOm49MSxvPWUpKX1yZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZSkse2RibGNsaWNrOmksc2ltRGJsY2xpY2s6ZX19dmFyIG9lLHNlLHJlLGFlLGhlLGxlLHVlPXdlKFsidHJhbnNmb3JtIiwid2Via2l0VHJhbnNmb3JtIiwiT1RyYW5zZm9ybSIsIk1velRyYW5zZm9ybSIsIm1zVHJhbnNmb3JtIl0pLGNlPXdlKFsid2Via2l0VHJhbnNpdGlvbiIsInRyYW5zaXRpb24iLCJPVHJhbnNpdGlvbiIsIk1velRyYW5zaXRpb24iLCJtc1RyYW5zaXRpb24iXSksZGU9IndlYmtpdFRyYW5zaXRpb24iPT09Y2V8fCJPVHJhbnNpdGlvbiI9PT1jZT9jZSsiRW5kIjoidHJhbnNpdGlvbmVuZCI7ZnVuY3Rpb24gX2UodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpOnR9ZnVuY3Rpb24gcGUodCxlKXt2YXIgaT10LnN0eWxlW2VdfHx0LmN1cnJlbnRTdHlsZSYmdC5jdXJyZW50U3R5bGVbZV07cmV0dXJuImF1dG8iPT09KGk9aSYmImF1dG8iIT09aXx8IWRvY3VtZW50LmRlZmF1bHRWaWV3P2k6KHQ9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpKT90W2VdOm51bGwpP251bGw6aX1mdW5jdGlvbiBQKHQsZSxpKXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCk7cmV0dXJuIHQuY2xhc3NOYW1lPWV8fCIiLGkmJmkuYXBwZW5kQ2hpbGQodCksdH1mdW5jdGlvbiBUKHQpe3ZhciBlPXQucGFyZW50Tm9kZTtlJiZlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIG1lKHQpe2Zvcig7dC5maXJzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gZmUodCl7dmFyIGU9dC5wYXJlbnROb2RlO2UmJmUubGFzdENoaWxkIT09dCYmZS5hcHBlbmRDaGlsZCh0KX1mdW5jdGlvbiBnZSh0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmZS5maXJzdENoaWxkIT09dCYmZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIHZlKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXQuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LmNvbnRhaW5zKGUpOjA8KHQ9eGUodCkpLmxlbmd0aCYmbmV3IFJlZ0V4cCgiKF58XFxzKSIrZSsiKFxcc3wkKSIpLnRlc3QodCl9ZnVuY3Rpb24gTSh0LGUpe3ZhciBpO2lmKHZvaWQgMCE9PXQuY2xhc3NMaXN0KWZvcih2YXIgbj1GKGUpLG89MCxzPW4ubGVuZ3RoO288cztvKyspdC5jbGFzc0xpc3QuYWRkKG5bb10pO2Vsc2UgdmUodCxlKXx8eWUodCwoKGk9eGUodCkpP2krIiAiOiIiKStlKX1mdW5jdGlvbiB6KHQsZSl7dm9pZCAwIT09dC5jbGFzc0xpc3Q\/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOnllKHQsVygoIiAiK3hlKHQpKyIgIikucmVwbGFjZSgiICIrZSsiICIsIiAiKSkpfWZ1bmN0aW9uIHllKHQsZSl7dm9pZCAwPT09dC5jbGFzc05hbWUuYmFzZVZhbD90LmNsYXNzTmFtZT1lOnQuY2xhc3NOYW1lLmJhc2VWYWw9ZX1mdW5jdGlvbiB4ZSh0KXtyZXR1cm4gdm9pZCAwPT09KHQ9dC5jb3JyZXNwb25kaW5nRWxlbWVudD90LmNvcnJlc3BvbmRpbmdFbGVtZW50OnQpLmNsYXNzTmFtZS5iYXNlVmFsP3QuY2xhc3NOYW1lOnQuY2xhc3NOYW1lLmJhc2VWYWx9ZnVuY3Rpb24gQyh0LGUpe2lmKCJvcGFjaXR5ImluIHQuc3R5bGUpdC5zdHlsZS5vcGFjaXR5PWU7ZWxzZSBpZigiZmlsdGVyImluIHQuc3R5bGUpe3ZhciBpPSExLG49IkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhIjt0cnl7aT10LmZpbHRlcnMuaXRlbShuKX1jYXRjaCh0KXtpZigxPT09ZSlyZXR1cm59ZT1NYXRoLnJvdW5kKDEwMCplKSxpPyhpLkVuYWJsZWQ9MTAwIT09ZSxpLk9wYWNpdHk9ZSk6dC5zdHlsZS5maWx0ZXIrPSIgcHJvZ2lkOiIrbisiKG9wYWNpdHk9IitlKyIpIn19ZnVuY3Rpb24gd2UodCl7Zm9yKHZhciBlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxpPTA7aTx0Lmxlbmd0aDtpKyspaWYodFtpXWluIGUpcmV0dXJuIHRbaV07cmV0dXJuITF9ZnVuY3Rpb24gYmUodCxlLGkpe2U9ZXx8bmV3IHAoMCwwKTt0LnN0eWxlW3VlXT0oYi5pZTNkPyJ0cmFuc2xhdGUoIitlLngrInB4LCIrZS55KyJweCkiOiJ0cmFuc2xhdGUzZCgiK2UueCsicHgsIitlLnkrInB4LDApIikrKGk\/IiBzY2FsZSgiK2krIikiOiIiKX1mdW5jdGlvbiBaKHQsZSl7dC5fbGVhZmxldF9wb3M9ZSxiLmFueTNkP2JlKHQsZSk6KHQuc3R5bGUubGVmdD1lLngrInB4Iix0LnN0eWxlLnRvcD1lLnkrInB4Iil9ZnVuY3Rpb24gUGUodCl7cmV0dXJuIHQuX2xlYWZsZXRfcG9zfHxuZXcgcCgwLDApfWZ1bmN0aW9uIExlKCl7Uyh3aW5kb3csImRyYWdzdGFydCIsTyl9ZnVuY3Rpb24gVGUoKXtrKHdpbmRvdywiZHJhZ3N0YXJ0IixPKX1mdW5jdGlvbiBNZSh0KXtmb3IoOy0xPT09dC50YWJJbmRleDspdD10LnBhcmVudE5vZGU7dC5zdHlsZSYmKHplKCksbGU9KGhlPXQpLnN0eWxlLm91dGxpbmVTdHlsZSx0LnN0eWxlLm91dGxpbmVTdHlsZT0ibm9uZSIsUyh3aW5kb3csImtleWRvd24iLHplKSl9ZnVuY3Rpb24gemUoKXtoZSYmKGhlLnN0eWxlLm91dGxpbmVTdHlsZT1sZSxsZT1oZT12b2lkIDAsayh3aW5kb3csImtleWRvd24iLHplKSl9ZnVuY3Rpb24gQ2UodCl7Zm9yKDshKCh0PXQucGFyZW50Tm9kZSkub2Zmc2V0V2lkdGgmJnQub2Zmc2V0SGVpZ2h0fHx0PT09ZG9jdW1lbnQuYm9keSk7KTtyZXR1cm4gdH1mdW5jdGlvbiBaZSh0KXt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4OmUud2lkdGgvdC5vZmZzZXRXaWR0aHx8MSx5OmUuaGVpZ2h0L3Qub2Zmc2V0SGVpZ2h0fHwxLGJvdW5kaW5nQ2xpZW50UmVjdDplfX1hZT0ib25zZWxlY3RzdGFydCJpbiBkb2N1bWVudD8ocmU9ZnVuY3Rpb24oKXtTKHdpbmRvdywic2VsZWN0c3RhcnQiLE8pfSxmdW5jdGlvbigpe2sod2luZG93LCJzZWxlY3RzdGFydCIsTyl9KTooc2U9d2UoWyJ1c2VyU2VsZWN0IiwiV2Via2l0VXNlclNlbGVjdCIsIk9Vc2VyU2VsZWN0IiwiTW96VXNlclNlbGVjdCIsIm1zVXNlclNlbGVjdCJdKSxyZT1mdW5jdGlvbigpe3ZhciB0O3NlJiYodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsb2U9dFtzZV0sdFtzZV09Im5vbmUiKX0sZnVuY3Rpb24oKXtzZSYmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZVtzZV09b2Usb2U9dm9pZCAwKX0pO3B0PXtfX3Byb3RvX186bnVsbCxUUkFOU0ZPUk06dWUsVFJBTlNJVElPTjpjZSxUUkFOU0lUSU9OX0VORDpkZSxnZXQ6X2UsZ2V0U3R5bGU6cGUsY3JlYXRlOlAscmVtb3ZlOlQsZW1wdHk6bWUsdG9Gcm9udDpmZSx0b0JhY2s6Z2UsaGFzQ2xhc3M6dmUsYWRkQ2xhc3M6TSxyZW1vdmVDbGFzczp6LHNldENsYXNzOnllLGdldENsYXNzOnhlLHNldE9wYWNpdHk6Qyx0ZXN0UHJvcDp3ZSxzZXRUcmFuc2Zvcm06YmUsc2V0UG9zaXRpb246WixnZXRQb3NpdGlvbjpQZSxnZXQgZGlzYWJsZVRleHRTZWxlY3Rpb24oKXtyZXR1cm4gcmV9LGdldCBlbmFibGVUZXh0U2VsZWN0aW9uKCl7cmV0dXJuIGFlfSxkaXNhYmxlSW1hZ2VEcmFnOkxlLGVuYWJsZUltYWdlRHJhZzpUZSxwcmV2ZW50T3V0bGluZTpNZSxyZXN0b3JlT3V0bGluZTp6ZSxnZXRTaXplZFBhcmVudE5vZGU6Q2UsZ2V0U2NhbGU6WmV9O2Z1bmN0aW9uIFModCxlLGksbil7aWYoZSYmIm9iamVjdCI9PXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKWtlKHQsbyxlW29dLGkpO2Vsc2UgZm9yKHZhciBzPTAscj0oZT1GKGUpKS5sZW5ndGg7czxyO3MrKylrZSh0LGVbc10saSxuKTtyZXR1cm4gdGhpc312YXIgRT0iX2xlYWZsZXRfZXZlbnRzIjtmdW5jdGlvbiBrKHQsZSxpLG4pe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKVNlKHQpLGRlbGV0ZSB0W0VdO2Vsc2UgaWYoZSYmIm9iamVjdCI9PXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKU9lKHQsbyxlW29dLGkpO2Vsc2UgaWYoZT1GKGUpLDI9PT1hcmd1bWVudHMubGVuZ3RoKVNlKHQsZnVuY3Rpb24odCl7cmV0dXJuLTEhPT1HKGUsdCl9KTtlbHNlIGZvcih2YXIgcz0wLHI9ZS5sZW5ndGg7czxyO3MrKylPZSh0LGVbc10saSxuKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBTZSh0LGUpe2Zvcih2YXIgaSBpbiB0W0VdKXt2YXIgbj1pLnNwbGl0KC9cZC8pWzBdO2UmJiFlKG4pfHxPZSh0LG4sbnVsbCxudWxsLGkpfX12YXIgRWU9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHdoZWVsOiEoIm9ud2hlZWwiaW4gd2luZG93KSYmIm1vdXNld2hlZWwifTtmdW5jdGlvbiBrZShlLHQsaSxuKXt2YXIgbyxzLHI9dCtoKGkpKyhuPyJfIitoKG4pOiIiKTtlW0VdJiZlW0VdW3JdfHwocz1vPWZ1bmN0aW9uKHQpe3JldHVybiBpLmNhbGwobnx8ZSx0fHx3aW5kb3cuZXZlbnQpfSwhYi50b3VjaE5hdGl2ZSYmYi5wb2ludGVyJiYwPT09dC5pbmRleE9mKCJ0b3VjaCIpP289SnQoZSx0LG8pOmIudG91Y2gmJiJkYmxjbGljayI9PT10P289bmUoZSxvKToiYWRkRXZlbnRMaXN0ZW5lciJpbiBlPyJ0b3VjaHN0YXJ0Ij09PXR8fCJ0b3VjaG1vdmUiPT09dHx8IndoZWVsIj09PXR8fCJtb3VzZXdoZWVsIj09PXQ\/ZS5hZGRFdmVudExpc3RlbmVyKEVlW3RdfHx0LG8sISFiLnBhc3NpdmVFdmVudHMmJntwYXNzaXZlOiExfSk6Im1vdXNlZW50ZXIiPT09dHx8Im1vdXNlbGVhdmUiPT09dD9lLmFkZEV2ZW50TGlzdGVuZXIoRWVbdF0sbz1mdW5jdGlvbih0KXt0PXR8fHdpbmRvdy5ldmVudCxXZShlLHQpJiZzKHQpfSwhMSk6ZS5hZGRFdmVudExpc3RlbmVyKHQscywhMSk6ZS5hdHRhY2hFdmVudCgib24iK3QsbyksZVtFXT1lW0VdfHx7fSxlW0VdW3JdPW8pfWZ1bmN0aW9uIE9lKHQsZSxpLG4sbyl7bz1vfHxlK2goaSkrKG4\/Il8iK2gobik6IiIpO3ZhciBzLHIsaT10W0VdJiZ0W0VdW29dO2kmJighYi50b3VjaE5hdGl2ZSYmYi5wb2ludGVyJiYwPT09ZS5pbmRleE9mKCJ0b3VjaCIpPyhuPXQscj1pLEd0W3M9ZV0\/bi5yZW1vdmVFdmVudExpc3RlbmVyKEd0W3NdLHIsITEpOmNvbnNvbGUud2Fybigid3JvbmcgZXZlbnQgc3BlY2lmaWVkOiIscykpOmIudG91Y2gmJiJkYmxjbGljayI9PT1lPyhuPWksKHI9dCkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLG4uZGJsY2xpY2spLHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4uc2ltRGJsY2xpY2spKToicmVtb3ZlRXZlbnRMaXN0ZW5lciJpbiB0P3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihFZVtlXXx8ZSxpLCExKTp0LmRldGFjaEV2ZW50KCJvbiIrZSxpKSx0W0VdW29dPW51bGwpfWZ1bmN0aW9uIEFlKHQpe3JldHVybiB0LnN0b3BQcm9wYWdhdGlvbj90LnN0b3BQcm9wYWdhdGlvbigpOnQub3JpZ2luYWxFdmVudD90Lm9yaWdpbmFsRXZlbnQuX3N0b3BwZWQ9ITA6dC5jYW5jZWxCdWJibGU9ITAsdGhpc31mdW5jdGlvbiBCZSh0KXtyZXR1cm4ga2UodCwid2hlZWwiLEFlKSx0aGlzfWZ1bmN0aW9uIEllKHQpe3JldHVybiBTKHQsIm1vdXNlZG93biB0b3VjaHN0YXJ0IGRibGNsaWNrIGNvbnRleHRtZW51IixBZSksdC5fbGVhZmxldF9kaXNhYmxlX2NsaWNrPSEwLHRoaXN9ZnVuY3Rpb24gTyh0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMSx0aGlzfWZ1bmN0aW9uIFJlKHQpe3JldHVybiBPKHQpLEFlKHQpLHRoaXN9ZnVuY3Rpb24gTmUodCl7aWYodC5jb21wb3NlZFBhdGgpcmV0dXJuIHQuY29tcG9zZWRQYXRoKCk7Zm9yKHZhciBlPVtdLGk9dC50YXJnZXQ7aTspZS5wdXNoKGkpLGk9aS5wYXJlbnROb2RlO3JldHVybiBlfWZ1bmN0aW9uIERlKHQsZSl7dmFyIGksbjtyZXR1cm4gZT8obj0oaT1aZShlKSkuYm91bmRpbmdDbGllbnRSZWN0LG5ldyBwKCh0LmNsaWVudFgtbi5sZWZ0KS9pLngtZS5jbGllbnRMZWZ0LCh0LmNsaWVudFktbi50b3ApL2kueS1lLmNsaWVudFRvcCkpOm5ldyBwKHQuY2xpZW50WCx0LmNsaWVudFkpfXZhciBqZT1iLmxpbnV4JiZiLmNocm9tZT93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzpiLm1hYz8zKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjA8d2luZG93LmRldmljZVBpeGVsUmF0aW8\/Mip3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxO2Z1bmN0aW9uIEhlKHQpe3JldHVybiBiLmVkZ2U\/dC53aGVlbERlbHRhWS8yOnQuZGVsdGFZJiYwPT09dC5kZWx0YU1vZGU\/LXQuZGVsdGFZL2plOnQuZGVsdGFZJiYxPT09dC5kZWx0YU1vZGU\/MjAqLXQuZGVsdGFZOnQuZGVsdGFZJiYyPT09dC5kZWx0YU1vZGU\/NjAqLXQuZGVsdGFZOnQuZGVsdGFYfHx0LmRlbHRhWj8wOnQud2hlZWxEZWx0YT8odC53aGVlbERlbHRhWXx8dC53aGVlbERlbHRhKS8yOnQuZGV0YWlsJiZNYXRoLmFicyh0LmRldGFpbCk8MzI3NjU\/MjAqLXQuZGV0YWlsOnQuZGV0YWlsP3QuZGV0YWlsLy0zMjc2NSo2MDowfWZ1bmN0aW9uIFdlKHQsZSl7dmFyIGk9ZS5yZWxhdGVkVGFyZ2V0O2lmKCFpKXJldHVybiEwO3RyeXtmb3IoO2kmJmkhPT10OylpPWkucGFyZW50Tm9kZX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4gaSE9PXR9dmFyIG10PXtfX3Byb3RvX186bnVsbCxvbjpTLG9mZjprLHN0b3BQcm9wYWdhdGlvbjpBZSxkaXNhYmxlU2Nyb2xsUHJvcGFnYXRpb246QmUsZGlzYWJsZUNsaWNrUHJvcGFnYXRpb246SWUscHJldmVudERlZmF1bHQ6TyxzdG9wOlJlLGdldFByb3BhZ2F0aW9uUGF0aDpOZSxnZXRNb3VzZVBvc2l0aW9uOkRlLGdldFdoZWVsRGVsdGE6SGUsaXNFeHRlcm5hbFRhcmdldDpXZSxhZGRMaXN0ZW5lcjpTLHJlbW92ZUxpc3RlbmVyOmt9LEZlPWl0LmV4dGVuZCh7cnVuOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9kdXJhdGlvbj1pfHwuMjUsdGhpcy5fZWFzZU91dFBvd2VyPTEvTWF0aC5tYXgobnx8LjUsLjIpLHRoaXMuX3N0YXJ0UG9zPVBlKHQpLHRoaXMuX29mZnNldD1lLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9zKSx0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlLHRoaXMuZmlyZSgic3RhcnQiKSx0aGlzLl9hbmltYXRlKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9pblByb2dyZXNzJiYodGhpcy5fc3RlcCghMCksdGhpcy5fY29tcGxldGUoKSl9LF9hbmltYXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbUlkPXgodGhpcy5fYW5pbWF0ZSx0aGlzKSx0aGlzLl9zdGVwKCl9LF9zdGVwOmZ1bmN0aW9uKHQpe3ZhciBlPStuZXcgRGF0ZS10aGlzLl9zdGFydFRpbWUsaT0xZTMqdGhpcy5fZHVyYXRpb247ZTxpP3RoaXMuX3J1bkZyYW1lKHRoaXMuX2Vhc2VPdXQoZS9pKSx0KToodGhpcy5fcnVuRnJhbWUoMSksdGhpcy5fY29tcGxldGUoKSl9LF9ydW5GcmFtZTpmdW5jdGlvbih0LGUpe3Q9dGhpcy5fc3RhcnRQb3MuYWRkKHRoaXMuX29mZnNldC5tdWx0aXBseUJ5KHQpKTtlJiZ0Ll9yb3VuZCgpLFoodGhpcy5fZWwsdCksdGhpcy5maXJlKCJzdGVwIil9LF9jb21wbGV0ZTpmdW5jdGlvbigpe3IodGhpcy5fYW5pbUlkKSx0aGlzLl9pblByb2dyZXNzPSExLHRoaXMuZmlyZSgiZW5kIil9LF9lYXNlT3V0OmZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCx0aGlzLl9lYXNlT3V0UG93ZXIpfX0pLEE9aXQuZXh0ZW5kKHtvcHRpb25zOntjcnM6bHQsY2VudGVyOnZvaWQgMCx6b29tOnZvaWQgMCxtaW5ab29tOnZvaWQgMCxtYXhab29tOnZvaWQgMCxsYXllcnM6W10sbWF4Qm91bmRzOnZvaWQgMCxyZW5kZXJlcjp2b2lkIDAsem9vbUFuaW1hdGlvbjohMCx6b29tQW5pbWF0aW9uVGhyZXNob2xkOjQsZmFkZUFuaW1hdGlvbjohMCxtYXJrZXJab29tQW5pbWF0aW9uOiEwLHRyYW5zZm9ybTNETGltaXQ6ODM4ODYwOCx6b29tU25hcDoxLHpvb21EZWx0YToxLHRyYWNrUmVzaXplOiEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7ZT1jKHRoaXMsZSksdGhpcy5faGFuZGxlcnM9W10sdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX3pvb21Cb3VuZExheWVycz17fSx0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLl9pbml0Q29udGFpbmVyKHQpLHRoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl9vblJlc2l6ZT1hKHRoaXMuX29uUmVzaXplLHRoaXMpLHRoaXMuX2luaXRFdmVudHMoKSxlLm1heEJvdW5kcyYmdGhpcy5zZXRNYXhCb3VuZHMoZS5tYXhCb3VuZHMpLHZvaWQgMCE9PWUuem9vbSYmKHRoaXMuX3pvb209dGhpcy5fbGltaXRab29tKGUuem9vbSkpLGUuY2VudGVyJiZ2b2lkIDAhPT1lLnpvb20mJnRoaXMuc2V0Vmlldyh3KGUuY2VudGVyKSxlLnpvb20se3Jlc2V0OiEwfSksdGhpcy5jYWxsSW5pdEhvb2tzKCksdGhpcy5fem9vbUFuaW1hdGVkPWNlJiZiLmFueTNkJiYhYi5tb2JpbGVPcGVyYSYmdGhpcy5vcHRpb25zLnpvb21BbmltYXRpb24sdGhpcy5fem9vbUFuaW1hdGVkJiYodGhpcy5fY3JlYXRlQW5pbVByb3h5KCksUyh0aGlzLl9wcm94eSxkZSx0aGlzLl9jYXRjaFRyYW5zaXRpb25FbmQsdGhpcykpLHRoaXMuX2FkZExheWVycyh0aGlzLm9wdGlvbnMubGF5ZXJzKX0sc2V0VmlldzpmdW5jdGlvbih0LGUsaSl7aWYoKGU9dm9pZCAwPT09ZT90aGlzLl96b29tOnRoaXMuX2xpbWl0Wm9vbShlKSx0PXRoaXMuX2xpbWl0Q2VudGVyKHcodCksZSx0aGlzLm9wdGlvbnMubWF4Qm91bmRzKSxpPWl8fHt9LHRoaXMuX3N0b3AoKSx0aGlzLl9sb2FkZWQmJiFpLnJlc2V0JiYhMCE9PWkpJiYodm9pZCAwIT09aS5hbmltYXRlJiYoaS56b29tPWwoe2FuaW1hdGU6aS5hbmltYXRlfSxpLnpvb20pLGkucGFuPWwoe2FuaW1hdGU6aS5hbmltYXRlLGR1cmF0aW9uOmkuZHVyYXRpb259LGkucGFuKSksdGhpcy5fem9vbSE9PWU\/dGhpcy5fdHJ5QW5pbWF0ZWRab29tJiZ0aGlzLl90cnlBbmltYXRlZFpvb20odCxlLGkuem9vbSk6dGhpcy5fdHJ5QW5pbWF0ZWRQYW4odCxpLnBhbikpKXJldHVybiBjbGVhclRpbWVvdXQodGhpcy5fc2l6ZVRpbWVyKSx0aGlzO3JldHVybiB0aGlzLl9yZXNldFZpZXcodCxlLGkucGFuJiZpLnBhbi5ub01vdmVTdGFydCksdGhpc30sc2V0Wm9vbTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9sb2FkZWQ\/dGhpcy5zZXRWaWV3KHRoaXMuZ2V0Q2VudGVyKCksdCx7em9vbTplfSk6KHRoaXMuX3pvb209dCx0aGlzKX0sem9vbUluOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dHx8KGIuYW55M2Q\/dGhpcy5vcHRpb25zLnpvb21EZWx0YToxKSx0aGlzLnNldFpvb20odGhpcy5fem9vbSt0LGUpfSx6b29tT3V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dHx8KGIuYW55M2Q\/dGhpcy5vcHRpb25zLnpvb21EZWx0YToxKSx0aGlzLnNldFpvb20odGhpcy5fem9vbS10LGUpfSxzZXRab29tQXJvdW5kOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLmdldFpvb21TY2FsZShlKSxvPXRoaXMuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIpLHQ9KHQgaW5zdGFuY2VvZiBwP3Q6dGhpcy5sYXRMbmdUb0NvbnRhaW5lclBvaW50KHQpKS5zdWJ0cmFjdChvKS5tdWx0aXBseUJ5KDEtMS9uKSxuPXRoaXMuY29udGFpbmVyUG9pbnRUb0xhdExuZyhvLmFkZCh0KSk7cmV0dXJuIHRoaXMuc2V0VmlldyhuLGUse3pvb206aX0pfSxfZ2V0Qm91bmRzQ2VudGVyWm9vbTpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdD10LmdldEJvdW5kcz90LmdldEJvdW5kcygpOmcodCk7dmFyIGk9bShlLnBhZGRpbmdUb3BMZWZ0fHxlLnBhZGRpbmd8fFswLDBdKSxuPW0oZS5wYWRkaW5nQm90dG9tUmlnaHR8fGUucGFkZGluZ3x8WzAsMF0pLG89dGhpcy5nZXRCb3VuZHNab29tKHQsITEsaS5hZGQobikpO3JldHVybihvPSJudW1iZXIiPT10eXBlb2YgZS5tYXhab29tP01hdGgubWluKGUubWF4Wm9vbSxvKTpvKT09PTEvMD97Y2VudGVyOnQuZ2V0Q2VudGVyKCksem9vbTpvfTooZT1uLnN1YnRyYWN0KGkpLmRpdmlkZUJ5KDIpLG49dGhpcy5wcm9qZWN0KHQuZ2V0U291dGhXZXN0KCksbyksaT10aGlzLnByb2plY3QodC5nZXROb3J0aEVhc3QoKSxvKSx7Y2VudGVyOnRoaXMudW5wcm9qZWN0KG4uYWRkKGkpLmRpdmlkZUJ5KDIpLmFkZChlKSxvKSx6b29tOm99KX0sZml0Qm91bmRzOmZ1bmN0aW9uKHQsZSl7aWYoKHQ9Zyh0KSkuaXNWYWxpZCgpKXJldHVybiB0PXRoaXMuX2dldEJvdW5kc0NlbnRlclpvb20odCxlKSx0aGlzLnNldFZpZXcodC5jZW50ZXIsdC56b29tLGUpO3Rocm93IG5ldyBFcnJvcigiQm91bmRzIGFyZSBub3QgdmFsaWQuIil9LGZpdFdvcmxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpdEJvdW5kcyhbWy05MCwtMTgwXSxbOTAsMTgwXV0sdCl9LHBhblRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2V0Vmlldyh0LHRoaXMuX3pvb20se3BhbjplfSl9LHBhbkJ5OmZ1bmN0aW9uKHQsZSl7dmFyIGk7cmV0dXJuIGU9ZXx8e30sKHQ9bSh0KS5yb3VuZCgpKS54fHx0Lnk\/KCEwPT09ZS5hbmltYXRlfHx0aGlzLmdldFNpemUoKS5jb250YWlucyh0KT8odGhpcy5fcGFuQW5pbXx8KHRoaXMuX3BhbkFuaW09bmV3IEZlLHRoaXMuX3BhbkFuaW0ub24oe3N0ZXA6dGhpcy5fb25QYW5UcmFuc2l0aW9uU3RlcCxlbmQ6dGhpcy5fb25QYW5UcmFuc2l0aW9uRW5kfSx0aGlzKSksZS5ub01vdmVTdGFydHx8dGhpcy5maXJlKCJtb3Zlc3RhcnQiKSwhMSE9PWUuYW5pbWF0ZT8oTSh0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXBhbi1hbmltIiksaT10aGlzLl9nZXRNYXBQYW5lUG9zKCkuc3VidHJhY3QodCkucm91bmQoKSx0aGlzLl9wYW5BbmltLnJ1bih0aGlzLl9tYXBQYW5lLGksZS5kdXJhdGlvbnx8LjI1LGUuZWFzZUxpbmVhcml0eSkpOih0aGlzLl9yYXdQYW5CeSh0KSx0aGlzLmZpcmUoIm1vdmUiKS5maXJlKCJtb3ZlZW5kIikpKTp0aGlzLl9yZXNldFZpZXcodGhpcy51bnByb2plY3QodGhpcy5wcm9qZWN0KHRoaXMuZ2V0Q2VudGVyKCkpLmFkZCh0KSksdGhpcy5nZXRab29tKCkpLHRoaXMpOnRoaXMuZmlyZSgibW92ZWVuZCIpfSxmbHlUbzpmdW5jdGlvbihuLG8sdCl7aWYoITE9PT0odD10fHx7fSkuYW5pbWF0ZXx8IWIuYW55M2QpcmV0dXJuIHRoaXMuc2V0VmlldyhuLG8sdCk7dGhpcy5fc3RvcCgpO3ZhciBzPXRoaXMucHJvamVjdCh0aGlzLmdldENlbnRlcigpKSxyPXRoaXMucHJvamVjdChuKSxlPXRoaXMuZ2V0U2l6ZSgpLGE9dGhpcy5fem9vbSxoPShuPXcobiksbz12b2lkIDA9PT1vP2E6byxNYXRoLm1heChlLngsZS55KSksaT1oKnRoaXMuZ2V0Wm9vbVNjYWxlKGEsbyksbD1yLmRpc3RhbmNlVG8ocyl8fDEsdT0xLjQyLGM9dSp1O2Z1bmN0aW9uIGQodCl7dD0oaSppLWgqaCsodD8tMToxKSpjKmMqbCpsKS8oMioodD9pOmgpKmMqbCksdD1NYXRoLnNxcnQodCp0KzEpLXQ7cmV0dXJuIHQ8MWUtOT8tMTg6TWF0aC5sb2codCl9ZnVuY3Rpb24gXyh0KXtyZXR1cm4oTWF0aC5leHAodCktTWF0aC5leHAoLXQpKS8yfWZ1bmN0aW9uIHAodCl7cmV0dXJuKE1hdGguZXhwKHQpK01hdGguZXhwKC10KSkvMn12YXIgbT1kKDApO2Z1bmN0aW9uIGYodCl7cmV0dXJuIGgqKHAobSkqKF8odD1tK3UqdCkvcCh0KSktXyhtKSkvY312YXIgZz1EYXRlLm5vdygpLHY9KGQoMSktbSkvdSx5PXQuZHVyYXRpb24\/MWUzKnQuZHVyYXRpb246MWUzKnYqLjg7cmV0dXJuIHRoaXMuX21vdmVTdGFydCghMCx0Lm5vTW92ZVN0YXJ0KSxmdW5jdGlvbiB0KCl7dmFyIGU9KERhdGUubm93KCktZykveSxpPSgxLU1hdGgucG93KDEtZSwxLjUpKSp2O2U8PTE\/KHRoaXMuX2ZseVRvRnJhbWU9eCh0LHRoaXMpLHRoaXMuX21vdmUodGhpcy51bnByb2plY3Qocy5hZGQoci5zdWJ0cmFjdChzKS5tdWx0aXBseUJ5KGYoaSkvbCkpLGEpLHRoaXMuZ2V0U2NhbGVab29tKGgvKGU9aSxoKihwKG0pL3AobSt1KmUpKSksYSkse2ZseVRvOiEwfSkpOnRoaXMuX21vdmUobixvKS5fbW92ZUVuZCghMCl9LmNhbGwodGhpcyksdGhpc30sZmx5VG9Cb3VuZHM6ZnVuY3Rpb24odCxlKXt0PXRoaXMuX2dldEJvdW5kc0NlbnRlclpvb20odCxlKTtyZXR1cm4gdGhpcy5mbHlUbyh0LmNlbnRlcix0Lnpvb20sZSl9LHNldE1heEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdD1nKHQpLHRoaXMubGlzdGVucygibW92ZWVuZCIsdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzKSYmdGhpcy5vZmYoIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcyksdC5pc1ZhbGlkKCk\/KHRoaXMub3B0aW9ucy5tYXhCb3VuZHM9dCx0aGlzLl9sb2FkZWQmJnRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcygpLHRoaXMub24oIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcykpOih0aGlzLm9wdGlvbnMubWF4Qm91bmRzPW51bGwsdGhpcyl9LHNldE1pblpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLm1pblpvb207cmV0dXJuIHRoaXMub3B0aW9ucy5taW5ab29tPXQsdGhpcy5fbG9hZGVkJiZlIT09dCYmKHRoaXMuZmlyZSgiem9vbWxldmVsc2NoYW5nZSIpLHRoaXMuZ2V0Wm9vbSgpPHRoaXMub3B0aW9ucy5taW5ab29tKT90aGlzLnNldFpvb20odCk6dGhpc30sc2V0TWF4Wm9vbTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubWF4Wm9vbTtyZXR1cm4gdGhpcy5vcHRpb25zLm1heFpvb209dCx0aGlzLl9sb2FkZWQmJmUhPT10JiYodGhpcy5maXJlKCJ6b29tbGV2ZWxzY2hhbmdlIiksdGhpcy5nZXRab29tKCk+dGhpcy5vcHRpb25zLm1heFpvb20pP3RoaXMuc2V0Wm9vbSh0KTp0aGlzfSxwYW5JbnNpZGVCb3VuZHM6ZnVuY3Rpb24odCxlKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHM9ITA7dmFyIGk9dGhpcy5nZXRDZW50ZXIoKSx0PXRoaXMuX2xpbWl0Q2VudGVyKGksdGhpcy5fem9vbSxnKHQpKTtyZXR1cm4gaS5lcXVhbHModCl8fHRoaXMucGFuVG8odCxlKSx0aGlzLl9lbmZvcmNpbmdCb3VuZHM9ITEsdGhpc30scGFuSW5zaWRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bSgoZT1lfHx7fSkucGFkZGluZ1RvcExlZnR8fGUucGFkZGluZ3x8WzAsMF0pLG49bShlLnBhZGRpbmdCb3R0b21SaWdodHx8ZS5wYWRkaW5nfHxbMCwwXSksbz10aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSksdD10aGlzLnByb2plY3QodCkscz10aGlzLmdldFBpeGVsQm91bmRzKCksaT1fKFtzLm1pbi5hZGQoaSkscy5tYXguc3VidHJhY3QobildKSxzPWkuZ2V0U2l6ZSgpO3JldHVybiBpLmNvbnRhaW5zKHQpfHwodGhpcy5fZW5mb3JjaW5nQm91bmRzPSEwLG49dC5zdWJ0cmFjdChpLmdldENlbnRlcigpKSxpPWkuZXh0ZW5kKHQpLmdldFNpemUoKS5zdWJ0cmFjdChzKSxvLngrPW4ueDwwPy1pLng6aS54LG8ueSs9bi55PDA\/LWkueTppLnksdGhpcy5wYW5Ubyh0aGlzLnVucHJvamVjdChvKSxlKSx0aGlzLl9lbmZvcmNpbmdCb3VuZHM9ITEpLHRoaXN9LGludmFsaWRhdGVTaXplOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9sb2FkZWQpcmV0dXJuIHRoaXM7dD1sKHthbmltYXRlOiExLHBhbjohMH0sITA9PT10P3thbmltYXRlOiEwfTp0KTt2YXIgZT10aGlzLmdldFNpemUoKSxpPSh0aGlzLl9zaXplQ2hhbmdlZD0hMCx0aGlzLl9sYXN0Q2VudGVyPW51bGwsdGhpcy5nZXRTaXplKCkpLG49ZS5kaXZpZGVCeSgyKS5yb3VuZCgpLG89aS5kaXZpZGVCeSgyKS5yb3VuZCgpLG49bi5zdWJ0cmFjdChvKTtyZXR1cm4gbi54fHxuLnk\/KHQuYW5pbWF0ZSYmdC5wYW4\/dGhpcy5wYW5CeShuKToodC5wYW4mJnRoaXMuX3Jhd1BhbkJ5KG4pLHRoaXMuZmlyZSgibW92ZSIpLHQuZGVib3VuY2VNb3ZlZW5kPyhjbGVhclRpbWVvdXQodGhpcy5fc2l6ZVRpbWVyKSx0aGlzLl9zaXplVGltZXI9c2V0VGltZW91dChhKHRoaXMuZmlyZSx0aGlzLCJtb3ZlZW5kIiksMjAwKSk6dGhpcy5maXJlKCJtb3ZlZW5kIikpLHRoaXMuZmlyZSgicmVzaXplIix7b2xkU2l6ZTplLG5ld1NpemU6aX0pKTp0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0Wm9vbSh0aGlzLl9saW1pdFpvb20odGhpcy5fem9vbSkpLHRoaXMub3B0aW9ucy56b29tU25hcHx8dGhpcy5maXJlKCJ2aWV3cmVzZXQiKSx0aGlzLl9zdG9wKCl9LGxvY2F0ZTpmdW5jdGlvbih0KXt2YXIgZSxpO3JldHVybiB0PXRoaXMuX2xvY2F0ZU9wdGlvbnM9bCh7dGltZW91dDoxZTQsd2F0Y2g6ITF9LHQpLCJnZW9sb2NhdGlvbiJpbiBuYXZpZ2F0b3I\/KGU9YSh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvblJlc3BvbnNlLHRoaXMpLGk9YSh0aGlzLl9oYW5kbGVHZW9sb2NhdGlvbkVycm9yLHRoaXMpLHQud2F0Y2g\/dGhpcy5fbG9jYXRpb25XYXRjaElkPW5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKGUsaSx0KTpuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGUsaSx0KSk6dGhpcy5faGFuZGxlR2VvbG9jYXRpb25FcnJvcih7Y29kZTowLG1lc3NhZ2U6Ikdlb2xvY2F0aW9uIG5vdCBzdXBwb3J0ZWQuIn0pLHRoaXN9LHN0b3BMb2NhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uJiZuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCYmbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fbG9jYXRpb25XYXRjaElkKSx0aGlzLl9sb2NhdGVPcHRpb25zJiYodGhpcy5fbG9jYXRlT3B0aW9ucy5zZXRWaWV3PSExKSx0aGlzfSxfaGFuZGxlR2VvbG9jYXRpb25FcnJvcjpmdW5jdGlvbih0KXt2YXIgZTt0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQmJihlPXQuY29kZSx0PXQubWVzc2FnZXx8KDE9PT1lPyJwZXJtaXNzaW9uIGRlbmllZCI6Mj09PWU\/InBvc2l0aW9uIHVuYXZhaWxhYmxlIjoidGltZW91dCIpLHRoaXMuX2xvY2F0ZU9wdGlvbnMuc2V0VmlldyYmIXRoaXMuX2xvYWRlZCYmdGhpcy5maXRXb3JsZCgpLHRoaXMuZmlyZSgibG9jYXRpb25lcnJvciIse2NvZGU6ZSxtZXNzYWdlOiJHZW9sb2NhdGlvbiBlcnJvcjogIit0KyIuIn0pKX0sX2hhbmRsZUdlb2xvY2F0aW9uUmVzcG9uc2U6ZnVuY3Rpb24odCl7aWYodGhpcy5fY29udGFpbmVyLl9sZWFmbGV0X2lkKXt2YXIgZSxpLG49bmV3IHYodC5jb29yZHMubGF0aXR1ZGUsdC5jb29yZHMubG9uZ2l0dWRlKSxvPW4udG9Cb3VuZHMoMip0LmNvb3Jkcy5hY2N1cmFjeSkscz10aGlzLl9sb2NhdGVPcHRpb25zLHI9KHMuc2V0VmlldyYmKGU9dGhpcy5nZXRCb3VuZHNab29tKG8pLHRoaXMuc2V0VmlldyhuLHMubWF4Wm9vbT9NYXRoLm1pbihlLHMubWF4Wm9vbSk6ZSkpLHtsYXRsbmc6bixib3VuZHM6byx0aW1lc3RhbXA6dC50aW1lc3RhbXB9KTtmb3IoaSBpbiB0LmNvb3JkcykibnVtYmVyIj09dHlwZW9mIHQuY29vcmRzW2ldJiYocltpXT10LmNvb3Jkc1tpXSk7dGhpcy5maXJlKCJsb2NhdGlvbmZvdW5kIixyKX19LGFkZEhhbmRsZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSYmKGU9dGhpc1t0XT1uZXcgZSh0aGlzKSx0aGlzLl9oYW5kbGVycy5wdXNoKGUpLHRoaXMub3B0aW9uc1t0XSYmZS5lbmFibGUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYodGhpcy5faW5pdEV2ZW50cyghMCksdGhpcy5vcHRpb25zLm1heEJvdW5kcyYmdGhpcy5vZmYoIm1vdmVlbmQiLHRoaXMuX3Bhbkluc2lkZU1heEJvdW5kcyksdGhpcy5fY29udGFpbmVySWQhPT10aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQpdGhyb3cgbmV3IEVycm9yKCJNYXAgY29udGFpbmVyIGlzIGJlaW5nIHJldXNlZCBieSBhbm90aGVyIGluc3RhbmNlIik7dHJ5e2RlbGV0ZSB0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQsZGVsZXRlIHRoaXMuX2NvbnRhaW5lcklkfWNhdGNoKHQpe3RoaXMuX2NvbnRhaW5lci5fbGVhZmxldF9pZD12b2lkIDAsdGhpcy5fY29udGFpbmVySWQ9dm9pZCAwfWZvcih2YXIgdCBpbiB2b2lkIDAhPT10aGlzLl9sb2NhdGlvbldhdGNoSWQmJnRoaXMuc3RvcExvY2F0ZSgpLHRoaXMuX3N0b3AoKSxUKHRoaXMuX21hcFBhbmUpLHRoaXMuX2NsZWFyQ29udHJvbFBvcyYmdGhpcy5fY2xlYXJDb250cm9sUG9zKCksdGhpcy5fcmVzaXplUmVxdWVzdCYmKHIodGhpcy5fcmVzaXplUmVxdWVzdCksdGhpcy5fcmVzaXplUmVxdWVzdD1udWxsKSx0aGlzLl9jbGVhckhhbmRsZXJzKCksdGhpcy5fbG9hZGVkJiZ0aGlzLmZpcmUoInVubG9hZCIpLHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0ucmVtb3ZlKCk7Zm9yKHQgaW4gdGhpcy5fcGFuZXMpVCh0aGlzLl9wYW5lc1t0XSk7cmV0dXJuIHRoaXMuX2xheWVycz1bXSx0aGlzLl9wYW5lcz1bXSxkZWxldGUgdGhpcy5fbWFwUGFuZSxkZWxldGUgdGhpcy5fcmVuZGVyZXIsdGhpc30sY3JlYXRlUGFuZTpmdW5jdGlvbih0LGUpe2U9UCgiZGl2IiwibGVhZmxldC1wYW5lIisodD8iIGxlYWZsZXQtIit0LnJlcGxhY2UoIlBhbmUiLCIiKSsiLXBhbmUiOiIiKSxlfHx0aGlzLl9tYXBQYW5lKTtyZXR1cm4gdCYmKHRoaXMuX3BhbmVzW3RdPWUpLGV9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5fbGFzdENlbnRlciYmIXRoaXMuX21vdmVkKCk\/dGhpcy5fbGFzdENlbnRlci5jbG9uZSgpOnRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX2dldENlbnRlckxheWVyUG9pbnQoKSl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQaXhlbEJvdW5kcygpO3JldHVybiBuZXcgcyh0aGlzLnVucHJvamVjdCh0LmdldEJvdHRvbUxlZnQoKSksdGhpcy51bnByb2plY3QodC5nZXRUb3BSaWdodCgpKSl9LGdldE1pblpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20\/dGhpcy5fbGF5ZXJzTWluWm9vbXx8MDp0aGlzLm9wdGlvbnMubWluWm9vbX0sZ2V0TWF4Wm9vbTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnMubWF4Wm9vbT92b2lkIDA9PT10aGlzLl9sYXllcnNNYXhab29tPzEvMDp0aGlzLl9sYXllcnNNYXhab29tOnRoaXMub3B0aW9ucy5tYXhab29tfSxnZXRCb3VuZHNab29tOmZ1bmN0aW9uKHQsZSxpKXt0PWcodCksaT1tKGl8fFswLDBdKTt2YXIgbj10aGlzLmdldFpvb20oKXx8MCxvPXRoaXMuZ2V0TWluWm9vbSgpLHM9dGhpcy5nZXRNYXhab29tKCkscj10LmdldE5vcnRoV2VzdCgpLHQ9dC5nZXRTb3V0aEVhc3QoKSxpPXRoaXMuZ2V0U2l6ZSgpLnN1YnRyYWN0KGkpLHQ9Xyh0aGlzLnByb2plY3QodCxuKSx0aGlzLnByb2plY3QocixuKSkuZ2V0U2l6ZSgpLHI9Yi5hbnkzZD90aGlzLm9wdGlvbnMuem9vbVNuYXA6MSxhPWkueC90LngsaT1pLnkvdC55LHQ9ZT9NYXRoLm1heChhLGkpOk1hdGgubWluKGEsaSksbj10aGlzLmdldFNjYWxlWm9vbSh0LG4pO3JldHVybiByJiYobj1NYXRoLnJvdW5kKG4vKHIvMTAwKSkqKHIvMTAwKSxuPWU\/TWF0aC5jZWlsKG4vcikqcjpNYXRoLmZsb29yKG4vcikqciksTWF0aC5tYXgobyxNYXRoLm1pbihzLG4pKX0sZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplJiYhdGhpcy5fc2l6ZUNoYW5nZWR8fCh0aGlzLl9zaXplPW5ldyBwKHRoaXMuX2NvbnRhaW5lci5jbGllbnRXaWR0aHx8MCx0aGlzLl9jb250YWluZXIuY2xpZW50SGVpZ2h0fHwwKSx0aGlzLl9zaXplQ2hhbmdlZD0hMSksdGhpcy5fc2l6ZS5jbG9uZSgpfSxnZXRQaXhlbEJvdW5kczpmdW5jdGlvbih0LGUpe3Q9dGhpcy5fZ2V0VG9wTGVmdFBvaW50KHQsZSk7cmV0dXJuIG5ldyBmKHQsdC5hZGQodGhpcy5nZXRTaXplKCkpKX0sZ2V0UGl4ZWxPcmlnaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hlY2tJZkxvYWRlZCgpLHRoaXMuX3BpeGVsT3JpZ2lufSxnZXRQaXhlbFdvcmxkQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLmdldFByb2plY3RlZEJvdW5kcyh2b2lkIDA9PT10P3RoaXMuZ2V0Wm9vbSgpOnQpfSxnZXRQYW5lOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90aGlzLl9wYW5lc1t0XTp0fSxnZXRQYW5lczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYW5lc30sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sZ2V0Wm9vbVNjYWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb25zLmNycztyZXR1cm4gZT12b2lkIDA9PT1lP3RoaXMuX3pvb206ZSxpLnNjYWxlKHQpL2kuc2NhbGUoZSl9LGdldFNjYWxlWm9vbTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5jcnMsdD0oZT12b2lkIDA9PT1lP3RoaXMuX3pvb206ZSxpLnpvb20odCppLnNjYWxlKGUpKSk7cmV0dXJuIGlzTmFOKHQpPzEvMDp0fSxwcm9qZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9dm9pZCAwPT09ZT90aGlzLl96b29tOmUsdGhpcy5vcHRpb25zLmNycy5sYXRMbmdUb1BvaW50KHcodCksZSl9LHVucHJvamVjdDpmdW5jdGlvbih0LGUpe3JldHVybiBlPXZvaWQgMD09PWU\/dGhpcy5fem9vbTplLHRoaXMub3B0aW9ucy5jcnMucG9pbnRUb0xhdExuZyhtKHQpLGUpfSxsYXllclBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7dD1tKHQpLmFkZCh0aGlzLmdldFBpeGVsT3JpZ2luKCkpO3JldHVybiB0aGlzLnVucHJvamVjdCh0KX0sbGF0TG5nVG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByb2plY3Qodyh0KSkuX3JvdW5kKCkuX3N1YnRyYWN0KHRoaXMuZ2V0UGl4ZWxPcmlnaW4oKSl9LHdyYXBMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMud3JhcExhdExuZyh3KHQpKX0sd3JhcExhdExuZ0JvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy53cmFwTGF0TG5nQm91bmRzKGcodCkpfSxkaXN0YW5jZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLmRpc3RhbmNlKHcodCksdyhlKSl9LGNvbnRhaW5lclBvaW50VG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBtKHQpLnN1YnRyYWN0KHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LGxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiBtKHQpLmFkZCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpfSxjb250YWluZXJQb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQpe3Q9dGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChtKHQpKTtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9MYXRMbmcodCl9LGxhdExuZ1RvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodGhpcy5sYXRMbmdUb0xheWVyUG9pbnQodyh0KSkpfSxtb3VzZUV2ZW50VG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gRGUodCx0aGlzLl9jb250YWluZXIpfSxtb3VzZUV2ZW50VG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHRoaXMubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCkpfSxtb3VzZUV2ZW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSl9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKHQpe3Q9dGhpcy5fY29udGFpbmVyPV9lKHQpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiTWFwIGNvbnRhaW5lciBub3QgZm91bmQuIik7aWYodC5fbGVhZmxldF9pZCl0aHJvdyBuZXcgRXJyb3IoIk1hcCBjb250YWluZXIgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4iKTtTKHQsInNjcm9sbCIsdGhpcy5fb25TY3JvbGwsdGhpcyksdGhpcy5fY29udGFpbmVySWQ9aCh0KX0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXIsZT0odGhpcy5fZmFkZUFuaW1hdGVkPXRoaXMub3B0aW9ucy5mYWRlQW5pbWF0aW9uJiZiLmFueTNkLE0odCwibGVhZmxldC1jb250YWluZXIiKyhiLnRvdWNoPyIgbGVhZmxldC10b3VjaCI6IiIpKyhiLnJldGluYT8iIGxlYWZsZXQtcmV0aW5hIjoiIikrKGIuaWVsdDk\/IiBsZWFmbGV0LW9sZGllIjoiIikrKGIuc2FmYXJpPyIgbGVhZmxldC1zYWZhcmkiOiIiKSsodGhpcy5fZmFkZUFuaW1hdGVkPyIgbGVhZmxldC1mYWRlLWFuaW0iOiIiKSkscGUodCwicG9zaXRpb24iKSk7ImFic29sdXRlIiE9PWUmJiJyZWxhdGl2ZSIhPT1lJiYiZml4ZWQiIT09ZSYmInN0aWNreSIhPT1lJiYodC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSx0aGlzLl9pbml0UGFuZXMoKSx0aGlzLl9pbml0Q29udHJvbFBvcyYmdGhpcy5faW5pdENvbnRyb2xQb3MoKX0sX2luaXRQYW5lczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BhbmVzPXt9O3RoaXMuX3BhbmVSZW5kZXJlcnM9e30sdGhpcy5fbWFwUGFuZT10aGlzLmNyZWF0ZVBhbmUoIm1hcFBhbmUiLHRoaXMuX2NvbnRhaW5lciksWih0aGlzLl9tYXBQYW5lLG5ldyBwKDAsMCkpLHRoaXMuY3JlYXRlUGFuZSgidGlsZVBhbmUiKSx0aGlzLmNyZWF0ZVBhbmUoIm92ZXJsYXlQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJzaGFkb3dQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJtYXJrZXJQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJ0b29sdGlwUGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgicG9wdXBQYW5lIiksdGhpcy5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb258fChNKHQubWFya2VyUGFuZSwibGVhZmxldC16b29tLWhpZGUiKSxNKHQuc2hhZG93UGFuZSwibGVhZmxldC16b29tLWhpZGUiKSl9LF9yZXNldFZpZXc6ZnVuY3Rpb24odCxlLGkpe1oodGhpcy5fbWFwUGFuZSxuZXcgcCgwLDApKTt2YXIgbj0hdGhpcy5fbG9hZGVkLG89KHRoaXMuX2xvYWRlZD0hMCxlPXRoaXMuX2xpbWl0Wm9vbShlKSx0aGlzLmZpcmUoInZpZXdwcmVyZXNldCIpLHRoaXMuX3pvb20hPT1lKTt0aGlzLl9tb3ZlU3RhcnQobyxpKS5fbW92ZSh0LGUpLl9tb3ZlRW5kKG8pLHRoaXMuZmlyZSgidmlld3Jlc2V0IiksbiYmdGhpcy5maXJlKCJsb2FkIil9LF9tb3ZlU3RhcnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdGhpcy5maXJlKCJ6b29tc3RhcnQiKSxlfHx0aGlzLmZpcmUoIm1vdmVzdGFydCIpLHRoaXN9LF9tb3ZlOmZ1bmN0aW9uKHQsZSxpLG4pe3ZvaWQgMD09PWUmJihlPXRoaXMuX3pvb20pO3ZhciBvPXRoaXMuX3pvb20hPT1lO3JldHVybiB0aGlzLl96b29tPWUsdGhpcy5fbGFzdENlbnRlcj10LHRoaXMuX3BpeGVsT3JpZ2luPXRoaXMuX2dldE5ld1BpeGVsT3JpZ2luKHQpLG4\/aSYmaS5waW5jaCYmdGhpcy5maXJlKCJ6b29tIixpKTooKG98fGkmJmkucGluY2gpJiZ0aGlzLmZpcmUoInpvb20iLGkpLHRoaXMuZmlyZSgibW92ZSIsaSkpLHRoaXN9LF9tb3ZlRW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLmZpcmUoInpvb21lbmQiKSx0aGlzLmZpcmUoIm1vdmVlbmQiKX0sX3N0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLl9mbHlUb0ZyYW1lKSx0aGlzLl9wYW5BbmltJiZ0aGlzLl9wYW5BbmltLnN0b3AoKSx0aGlzfSxfcmF3UGFuQnk6ZnVuY3Rpb24odCl7Wih0aGlzLl9tYXBQYW5lLHRoaXMuX2dldE1hcFBhbmVQb3MoKS5zdWJ0cmFjdCh0KSl9LF9nZXRab29tU3BhbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1heFpvb20oKS10aGlzLmdldE1pblpvb20oKX0sX3Bhbkluc2lkZU1heEJvdW5kczpmdW5jdGlvbigpe3RoaXMuX2VuZm9yY2luZ0JvdW5kc3x8dGhpcy5wYW5JbnNpZGVCb3VuZHModGhpcy5vcHRpb25zLm1heEJvdW5kcyl9LF9jaGVja0lmTG9hZGVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2xvYWRlZCl0aHJvdyBuZXcgRXJyb3IoIlNldCBtYXAgY2VudGVyIGFuZCB6b29tIGZpcnN0LiIpfSxfaW5pdEV2ZW50czpmdW5jdGlvbih0KXt0aGlzLl90YXJnZXRzPXt9O3ZhciBlPXQ\/azpTO2UoKHRoaXMuX3RhcmdldHNbaCh0aGlzLl9jb250YWluZXIpXT10aGlzKS5fY29udGFpbmVyLCJjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2Vtb3ZlIGNvbnRleHRtZW51IGtleXByZXNzIGtleWRvd24ga2V5dXAiLHRoaXMuX2hhbmRsZURPTUV2ZW50LHRoaXMpLHRoaXMub3B0aW9ucy50cmFja1Jlc2l6ZSYmZSh3aW5kb3csInJlc2l6ZSIsdGhpcy5fb25SZXNpemUsdGhpcyksYi5hbnkzZCYmdGhpcy5vcHRpb25zLnRyYW5zZm9ybTNETGltaXQmJih0P3RoaXMub2ZmOnRoaXMub24pLmNhbGwodGhpcywibW92ZWVuZCIsdGhpcy5fb25Nb3ZlRW5kKX0sX29uUmVzaXplOmZ1bmN0aW9uKCl7cih0aGlzLl9yZXNpemVSZXF1ZXN0KSx0aGlzLl9yZXNpemVSZXF1ZXN0PXgoZnVuY3Rpb24oKXt0aGlzLmludmFsaWRhdGVTaXplKHtkZWJvdW5jZU1vdmVlbmQ6ITB9KX0sdGhpcyl9LF9vblNjcm9sbDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lci5zY3JvbGxUb3A9MCx0aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdD0wfSxfb25Nb3ZlRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO01hdGgubWF4KE1hdGguYWJzKHQueCksTWF0aC5hYnModC55KSk+PXRoaXMub3B0aW9ucy50cmFuc2Zvcm0zRExpbWl0JiZ0aGlzLl9yZXNldFZpZXcodGhpcy5nZXRDZW50ZXIoKSx0aGlzLmdldFpvb20oKSl9LF9maW5kRXZlbnRUYXJnZXRzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG49W10sbz0ibW91c2VvdXQiPT09ZXx8Im1vdXNlb3ZlciI9PT1lLHM9dC50YXJnZXR8fHQuc3JjRWxlbWVudCxyPSExO3M7KXtpZigoaT10aGlzLl90YXJnZXRzW2gocyldKSYmKCJjbGljayI9PT1lfHwicHJlY2xpY2siPT09ZSkmJnRoaXMuX2RyYWdnYWJsZU1vdmVkKGkpKXtyPSEwO2JyZWFrfWlmKGkmJmkubGlzdGVucyhlLCEwKSl7aWYobyYmIVdlKHMsdCkpYnJlYWs7aWYobi5wdXNoKGkpLG8pYnJlYWt9aWYocz09PXRoaXMuX2NvbnRhaW5lcilicmVhaztzPXMucGFyZW50Tm9kZX1yZXR1cm4gbj1uLmxlbmd0aHx8cnx8b3x8IXRoaXMubGlzdGVucyhlLCEwKT9uOlt0aGlzXX0sX2lzQ2xpY2tEaXNhYmxlZDpmdW5jdGlvbih0KXtmb3IoO3QmJnQhPT10aGlzLl9jb250YWluZXI7KXtpZih0Ll9sZWFmbGV0X2Rpc2FibGVfY2xpY2spcmV0dXJuITA7dD10LnBhcmVudE5vZGV9fSxfaGFuZGxlRE9NRXZlbnQ6ZnVuY3Rpb24odCl7dmFyIGUsaT10LnRhcmdldHx8dC5zcmNFbGVtZW50OyF0aGlzLl9sb2FkZWR8fGkuX2xlYWZsZXRfZGlzYWJsZV9ldmVudHN8fCJjbGljayI9PT10LnR5cGUmJnRoaXMuX2lzQ2xpY2tEaXNhYmxlZChpKXx8KCJtb3VzZWRvd24iPT09KGU9dC50eXBlKSYmTWUoaSksdGhpcy5fZmlyZURPTUV2ZW50KHQsZSkpfSxfbW91c2VFdmVudHM6WyJjbGljayIsImRibGNsaWNrIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJjb250ZXh0bWVudSJdLF9maXJlRE9NRXZlbnQ6ZnVuY3Rpb24odCxlLGkpeyJjbGljayI9PT10LnR5cGUmJigoYT1sKHt9LHQpKS50eXBlPSJwcmVjbGljayIsdGhpcy5fZmlyZURPTUV2ZW50KGEsYS50eXBlLGkpKTt2YXIgbj10aGlzLl9maW5kRXZlbnRUYXJnZXRzKHQsZSk7aWYoaSl7Zm9yKHZhciBvPVtdLHM9MDtzPGkubGVuZ3RoO3MrKylpW3NdLmxpc3RlbnMoZSwhMCkmJm8ucHVzaChpW3NdKTtuPW8uY29uY2F0KG4pfWlmKG4ubGVuZ3RoKXsiY29udGV4dG1lbnUiPT09ZSYmTyh0KTt2YXIgcixhPW5bMF0saD17b3JpZ2luYWxFdmVudDp0fTtmb3IoImtleXByZXNzIiE9PXQudHlwZSYmImtleWRvd24iIT09dC50eXBlJiYia2V5dXAiIT09dC50eXBlJiYocj1hLmdldExhdExuZyYmKCFhLl9yYWRpdXN8fGEuX3JhZGl1czw9MTApLGguY29udGFpbmVyUG9pbnQ9cj90aGlzLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQoYS5nZXRMYXRMbmcoKSk6dGhpcy5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSxoLmxheWVyUG9pbnQ9dGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChoLmNvbnRhaW5lclBvaW50KSxoLmxhdGxuZz1yP2EuZ2V0TGF0TG5nKCk6dGhpcy5sYXllclBvaW50VG9MYXRMbmcoaC5sYXllclBvaW50KSkscz0wO3M8bi5sZW5ndGg7cysrKWlmKG5bc10uZmlyZShlLGgsITApLGgub3JpZ2luYWxFdmVudC5fc3RvcHBlZHx8ITE9PT1uW3NdLm9wdGlvbnMuYnViYmxpbmdNb3VzZUV2ZW50cyYmLTEhPT1HKHRoaXMuX21vdXNlRXZlbnRzLGUpKXJldHVybn19LF9kcmFnZ2FibGVNb3ZlZDpmdW5jdGlvbih0KXtyZXR1cm4odD10LmRyYWdnaW5nJiZ0LmRyYWdnaW5nLmVuYWJsZWQoKT90OnRoaXMpLmRyYWdnaW5nJiZ0LmRyYWdnaW5nLm1vdmVkKCl8fHRoaXMuYm94Wm9vbSYmdGhpcy5ib3hab29tLm1vdmVkKCl9LF9jbGVhckhhbmRsZXJzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLl9oYW5kbGVycy5sZW5ndGg7dDxlO3QrKyl0aGlzLl9oYW5kbGVyc1t0XS5kaXNhYmxlKCl9LHdoZW5SZWFkeTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9sb2FkZWQ\/dC5jYWxsKGV8fHRoaXMse3RhcmdldDp0aGlzfSk6dGhpcy5vbigibG9hZCIsdCxlKSx0aGlzfSxfZ2V0TWFwUGFuZVBvczpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLl9tYXBQYW5lKXx8bmV3IHAoMCwwKX0sX21vdmVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO3JldHVybiB0JiYhdC5lcXVhbHMoWzAsMF0pfSxfZ2V0VG9wTGVmdFBvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQmJnZvaWQgMCE9PWU\/dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4odCxlKTp0aGlzLmdldFBpeGVsT3JpZ2luKCkpLnN1YnRyYWN0KHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LF9nZXROZXdQaXhlbE9yaWdpbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKTtyZXR1cm4gdGhpcy5wcm9qZWN0KHQsZSkuX3N1YnRyYWN0KGkpLl9hZGQodGhpcy5fZ2V0TWFwUGFuZVBvcygpKS5fcm91bmQoKX0sX2xhdExuZ1RvTmV3TGF5ZXJQb2ludDpmdW5jdGlvbih0LGUsaSl7aT10aGlzLl9nZXROZXdQaXhlbE9yaWdpbihpLGUpO3JldHVybiB0aGlzLnByb2plY3QodCxlKS5fc3VidHJhY3QoaSl9LF9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzOmZ1bmN0aW9uKHQsZSxpKXtpPXRoaXMuX2dldE5ld1BpeGVsT3JpZ2luKGksZSk7cmV0dXJuIF8oW3RoaXMucHJvamVjdCh0LmdldFNvdXRoV2VzdCgpLGUpLl9zdWJ0cmFjdChpKSx0aGlzLnByb2plY3QodC5nZXROb3J0aFdlc3QoKSxlKS5fc3VidHJhY3QoaSksdGhpcy5wcm9qZWN0KHQuZ2V0U291dGhFYXN0KCksZSkuX3N1YnRyYWN0KGkpLHRoaXMucHJvamVjdCh0LmdldE5vcnRoRWFzdCgpLGUpLl9zdWJ0cmFjdChpKV0pfSxfZ2V0Q2VudGVyTGF5ZXJQb2ludDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHRoaXMuZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKSl9LF9nZXRDZW50ZXJPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF0TG5nVG9MYXllclBvaW50KHQpLnN1YnRyYWN0KHRoaXMuX2dldENlbnRlckxheWVyUG9pbnQoKSl9LF9saW1pdENlbnRlcjpmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztyZXR1cm4haXx8KG49dGhpcy5wcm9qZWN0KHQsZSksbz10aGlzLmdldFNpemUoKS5kaXZpZGVCeSgyKSxvPW5ldyBmKG4uc3VidHJhY3Qobyksbi5hZGQobykpLG89dGhpcy5fZ2V0Qm91bmRzT2Zmc2V0KG8saSxlKSxNYXRoLmFicyhvLngpPD0xJiZNYXRoLmFicyhvLnkpPD0xKT90OnRoaXMudW5wcm9qZWN0KG4uYWRkKG8pLGUpfSxfbGltaXRPZmZzZXQ6ZnVuY3Rpb24odCxlKXt2YXIgaTtyZXR1cm4gZT8oaT1uZXcgZigoaT10aGlzLmdldFBpeGVsQm91bmRzKCkpLm1pbi5hZGQodCksaS5tYXguYWRkKHQpKSx0LmFkZCh0aGlzLl9nZXRCb3VuZHNPZmZzZXQoaSxlKSkpOnR9LF9nZXRCb3VuZHNPZmZzZXQ6ZnVuY3Rpb24odCxlLGkpe2U9Xyh0aGlzLnByb2plY3QoZS5nZXROb3J0aEVhc3QoKSxpKSx0aGlzLnByb2plY3QoZS5nZXRTb3V0aFdlc3QoKSxpKSksaT1lLm1pbi5zdWJ0cmFjdCh0Lm1pbiksZT1lLm1heC5zdWJ0cmFjdCh0Lm1heCk7cmV0dXJuIG5ldyBwKHRoaXMuX3JlYm91bmQoaS54LC1lLngpLHRoaXMuX3JlYm91bmQoaS55LC1lLnkpKX0sX3JlYm91bmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gMDx0K2U\/TWF0aC5yb3VuZCh0LWUpLzI6TWF0aC5tYXgoMCxNYXRoLmNlaWwodCkpLU1hdGgubWF4KDAsTWF0aC5mbG9vcihlKSl9LF9saW1pdFpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRNaW5ab29tKCksaT10aGlzLmdldE1heFpvb20oKSxuPWIuYW55M2Q\/dGhpcy5vcHRpb25zLnpvb21TbmFwOjE7cmV0dXJuIG4mJih0PU1hdGgucm91bmQodC9uKSpuKSxNYXRoLm1heChlLE1hdGgubWluKGksdCkpfSxfb25QYW5UcmFuc2l0aW9uU3RlcDpmdW5jdGlvbigpe3RoaXMuZmlyZSgibW92ZSIpfSxfb25QYW5UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7eih0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXBhbi1hbmltIiksdGhpcy5maXJlKCJtb3ZlZW5kIil9LF90cnlBbmltYXRlZFBhbjpmdW5jdGlvbih0LGUpe3Q9dGhpcy5fZ2V0Q2VudGVyT2Zmc2V0KHQpLl90cnVuYygpO3JldHVybiEoITAhPT0oZSYmZS5hbmltYXRlKSYmIXRoaXMuZ2V0U2l6ZSgpLmNvbnRhaW5zKHQpKSYmKHRoaXMucGFuQnkodCxlKSwhMCl9LF9jcmVhdGVBbmltUHJveHk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wcm94eT1QKCJkaXYiLCJsZWFmbGV0LXByb3h5IGxlYWZsZXQtem9vbS1hbmltYXRlZCIpO3RoaXMuX3BhbmVzLm1hcFBhbmUuYXBwZW5kQ2hpbGQodCksdGhpcy5vbigiem9vbWFuaW0iLGZ1bmN0aW9uKHQpe3ZhciBlPXVlLGk9dGhpcy5fcHJveHkuc3R5bGVbZV07YmUodGhpcy5fcHJveHksdGhpcy5wcm9qZWN0KHQuY2VudGVyLHQuem9vbSksdGhpcy5nZXRab29tU2NhbGUodC56b29tLDEpKSxpPT09dGhpcy5fcHJveHkuc3R5bGVbZV0mJnRoaXMuX2FuaW1hdGluZ1pvb20mJnRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQoKX0sdGhpcyksdGhpcy5vbigibG9hZCBtb3ZlZW5kIix0aGlzLl9hbmltTW92ZUVuZCx0aGlzKSx0aGlzLl9vbigidW5sb2FkIix0aGlzLl9kZXN0cm95QW5pbVByb3h5LHRoaXMpfSxfZGVzdHJveUFuaW1Qcm94eTpmdW5jdGlvbigpe1QodGhpcy5fcHJveHkpLHRoaXMub2ZmKCJsb2FkIG1vdmVlbmQiLHRoaXMuX2FuaW1Nb3ZlRW5kLHRoaXMpLGRlbGV0ZSB0aGlzLl9wcm94eX0sX2FuaW1Nb3ZlRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDZW50ZXIoKSxlPXRoaXMuZ2V0Wm9vbSgpO2JlKHRoaXMuX3Byb3h5LHRoaXMucHJvamVjdCh0LGUpLHRoaXMuZ2V0Wm9vbVNjYWxlKGUsMSkpfSxfY2F0Y2hUcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKHQpe3RoaXMuX2FuaW1hdGluZ1pvb20mJjA8PXQucHJvcGVydHlOYW1lLmluZGV4T2YoInRyYW5zZm9ybSIpJiZ0aGlzLl9vblpvb21UcmFuc2l0aW9uRW5kKCl9LF9ub3RoaW5nVG9BbmltYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKS5sZW5ndGh9LF90cnlBbmltYXRlZFpvb206ZnVuY3Rpb24odCxlLGkpe2lmKCF0aGlzLl9hbmltYXRpbmdab29tKXtpZihpPWl8fHt9LCF0aGlzLl96b29tQW5pbWF0ZWR8fCExPT09aS5hbmltYXRlfHx0aGlzLl9ub3RoaW5nVG9BbmltYXRlKCl8fE1hdGguYWJzKGUtdGhpcy5fem9vbSk+dGhpcy5vcHRpb25zLnpvb21BbmltYXRpb25UaHJlc2hvbGQpcmV0dXJuITE7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoZSksbj10aGlzLl9nZXRDZW50ZXJPZmZzZXQodCkuX2RpdmlkZUJ5KDEtMS9uKTtpZighMCE9PWkuYW5pbWF0ZSYmIXRoaXMuZ2V0U2l6ZSgpLmNvbnRhaW5zKG4pKXJldHVybiExO3goZnVuY3Rpb24oKXt0aGlzLl9tb3ZlU3RhcnQoITAsaS5ub01vdmVTdGFydHx8ITEpLl9hbmltYXRlWm9vbSh0LGUsITApfSx0aGlzKX1yZXR1cm4hMH0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQsZSxpLG4pe3RoaXMuX21hcFBhbmUmJihpJiYodGhpcy5fYW5pbWF0aW5nWm9vbT0hMCx0aGlzLl9hbmltYXRlVG9DZW50ZXI9dCx0aGlzLl9hbmltYXRlVG9ab29tPWUsTSh0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXpvb20tYW5pbSIpKSx0aGlzLmZpcmUoInpvb21hbmltIix7Y2VudGVyOnQsem9vbTplLG5vVXBkYXRlOm59KSx0aGlzLl90ZW1wRmlyZVpvb21FdmVudHx8KHRoaXMuX3RlbXBGaXJlWm9vbUV2ZW50PXRoaXMuX3pvb20hPT10aGlzLl9hbmltYXRlVG9ab29tKSx0aGlzLl9tb3ZlKHRoaXMuX2FuaW1hdGVUb0NlbnRlcix0aGlzLl9hbmltYXRlVG9ab29tLHZvaWQgMCwhMCksc2V0VGltZW91dChhKHRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQsdGhpcyksMjUwKSl9LF9vblpvb21UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nWm9vbSYmKHRoaXMuX21hcFBhbmUmJnoodGhpcy5fbWFwUGFuZSwibGVhZmxldC16b29tLWFuaW0iKSx0aGlzLl9hbmltYXRpbmdab29tPSExLHRoaXMuX21vdmUodGhpcy5fYW5pbWF0ZVRvQ2VudGVyLHRoaXMuX2FuaW1hdGVUb1pvb20sdm9pZCAwLCEwKSx0aGlzLl90ZW1wRmlyZVpvb21FdmVudCYmdGhpcy5maXJlKCJ6b29tIiksZGVsZXRlIHRoaXMuX3RlbXBGaXJlWm9vbUV2ZW50LHRoaXMuZmlyZSgibW92ZSIpLHRoaXMuX21vdmVFbmQoITApKX19KTtmdW5jdGlvbiBVZSh0KXtyZXR1cm4gbmV3IEIodCl9dmFyIEI9ZXQuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjoidG9wcmlnaHQifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2ModGhpcyx0KX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9ufSxzZXRQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXA7cmV0dXJuIGUmJmUucmVtb3ZlQ29udHJvbCh0aGlzKSx0aGlzLm9wdGlvbnMucG9zaXRpb249dCxlJiZlLmFkZENvbnRyb2wodGhpcyksdGhpc30sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sYWRkVG86ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmUoKSx0aGlzLl9tYXA9dDt2YXIgZT10aGlzLl9jb250YWluZXI9dGhpcy5vbkFkZCh0KSxpPXRoaXMuZ2V0UG9zaXRpb24oKSx0PXQuX2NvbnRyb2xDb3JuZXJzW2ldO3JldHVybiBNKGUsImxlYWZsZXQtY29udHJvbCIpLC0xIT09aS5pbmRleE9mKCJib3R0b20iKT90Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCk6dC5hcHBlbmRDaGlsZChlKSx0aGlzLl9tYXAub24oInVubG9hZCIsdGhpcy5yZW1vdmUsdGhpcyksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKFQodGhpcy5fY29udGFpbmVyKSx0aGlzLm9uUmVtb3ZlJiZ0aGlzLm9uUmVtb3ZlKHRoaXMuX21hcCksdGhpcy5fbWFwLm9mZigidW5sb2FkIix0aGlzLnJlbW92ZSx0aGlzKSx0aGlzLl9tYXA9bnVsbCksdGhpc30sX3JlZm9jdXNPbk1hcDpmdW5jdGlvbih0KXt0aGlzLl9tYXAmJnQmJjA8dC5zY3JlZW5YJiYwPHQuc2NyZWVuWSYmdGhpcy5fbWFwLmdldENvbnRhaW5lcigpLmZvY3VzKCl9fSksVmU9KEEuaW5jbHVkZSh7YWRkQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRUbyh0aGlzKSx0aGlzfSxyZW1vdmVDb250cm9sOmZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbW92ZSgpLHRoaXN9LF9pbml0Q29udHJvbFBvczpmdW5jdGlvbigpe3ZhciBpPXRoaXMuX2NvbnRyb2xDb3JuZXJzPXt9LG49ImxlYWZsZXQtIixvPXRoaXMuX2NvbnRyb2xDb250YWluZXI9UCgiZGl2IixuKyJjb250cm9sLWNvbnRhaW5lciIsdGhpcy5fY29udGFpbmVyKTtmdW5jdGlvbiB0KHQsZSl7aVt0K2VdPVAoImRpdiIsbit0KyIgIituK2Usbyl9dCgidG9wIiwibGVmdCIpLHQoInRvcCIsInJpZ2h0IiksdCgiYm90dG9tIiwibGVmdCIpLHQoImJvdHRvbSIsInJpZ2h0Iil9LF9jbGVhckNvbnRyb2xQb3M6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fY29udHJvbENvcm5lcnMpVCh0aGlzLl9jb250cm9sQ29ybmVyc1t0XSk7VCh0aGlzLl9jb250cm9sQ29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udHJvbENvcm5lcnMsZGVsZXRlIHRoaXMuX2NvbnRyb2xDb250YWluZXJ9fSksQi5leHRlbmQoe29wdGlvbnM6e2NvbGxhcHNlZDohMCxwb3NpdGlvbjoidG9wcmlnaHQiLGF1dG9aSW5kZXg6ITAsaGlkZVNpbmdsZUJhc2U6ITEsc29ydExheWVyczohMSxzb3J0RnVuY3Rpb246ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIGk8bj8tMTpuPGk\/MTowfX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuIGluIGModGhpcyxpKSx0aGlzLl9sYXllckNvbnRyb2xJbnB1dHM9W10sdGhpcy5fbGF5ZXJzPVtdLHRoaXMuX2xhc3RaSW5kZXg9MCx0aGlzLl9oYW5kbGluZ0NsaWNrPSExLHRoaXMuX3ByZXZlbnRDbGljaz0hMSx0KXRoaXMuX2FkZExheWVyKHRbbl0sbik7Zm9yKG4gaW4gZSl0aGlzLl9hZGRMYXllcihlW25dLG4sITApfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9pbml0TGF5b3V0KCksdGhpcy5fdXBkYXRlKCksKHRoaXMuX21hcD10KS5vbigiem9vbWVuZCIsdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycyx0aGlzKTtmb3IodmFyIGU9MDtlPHRoaXMuX2xheWVycy5sZW5ndGg7ZSsrKXRoaXMuX2xheWVyc1tlXS5sYXllci5vbigiYWRkIHJlbW92ZSIsdGhpcy5fb25MYXllckNoYW5nZSx0aGlzKTtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gQi5wcm90b3R5cGUuYWRkVG8uY2FsbCh0aGlzLHQpLHRoaXMuX2V4cGFuZElmTm90Q29sbGFwc2VkKCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiem9vbWVuZCIsdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycyx0aGlzKTtmb3IodmFyIHQ9MDt0PHRoaXMuX2xheWVycy5sZW5ndGg7dCsrKXRoaXMuX2xheWVyc1t0XS5sYXllci5vZmYoImFkZCByZW1vdmUiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyl9LGFkZEJhc2VMYXllcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9hZGRMYXllcih0LGUpLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxhZGRPdmVybGF5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2FkZExheWVyKHQsZSwhMCksdGhpcy5fbWFwP3RoaXMuX3VwZGF0ZSgpOnRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3Qub2ZmKCJhZGQgcmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpO3Q9dGhpcy5fZ2V0TGF5ZXIoaCh0KSk7cmV0dXJuIHQmJnRoaXMuX2xheWVycy5zcGxpY2UodGhpcy5fbGF5ZXJzLmluZGV4T2YodCksMSksdGhpcy5fbWFwP3RoaXMuX3VwZGF0ZSgpOnRoaXN9LGV4cGFuZDpmdW5jdGlvbigpe00odGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLWV4cGFuZGVkIiksdGhpcy5fc2VjdGlvbi5zdHlsZS5oZWlnaHQ9bnVsbDt2YXIgdD10aGlzLl9tYXAuZ2V0U2l6ZSgpLnktKHRoaXMuX2NvbnRhaW5lci5vZmZzZXRUb3ArNTApO3JldHVybiB0PHRoaXMuX3NlY3Rpb24uY2xpZW50SGVpZ2h0PyhNKHRoaXMuX3NlY3Rpb24sImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2Nyb2xsYmFyIiksdGhpcy5fc2VjdGlvbi5zdHlsZS5oZWlnaHQ9dCsicHgiKTp6KHRoaXMuX3NlY3Rpb24sImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2Nyb2xsYmFyIiksdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycygpLHRoaXN9LGNvbGxhcHNlOmZ1bmN0aW9uKCl7cmV0dXJuIHoodGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLWV4cGFuZGVkIiksdGhpc30sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt2YXIgdD0ibGVhZmxldC1jb250cm9sLWxheWVycyIsZT10aGlzLl9jb250YWluZXI9UCgiZGl2Iix0KSxpPXRoaXMub3B0aW9ucy5jb2xsYXBzZWQsbj0oZS5zZXRBdHRyaWJ1dGUoImFyaWEtaGFzcG9wdXAiLCEwKSxJZShlKSxCZShlKSx0aGlzLl9zZWN0aW9uPVAoInNlY3Rpb24iLHQrIi1saXN0IikpLG89KGkmJih0aGlzLl9tYXAub24oImNsaWNrIix0aGlzLmNvbGxhcHNlLHRoaXMpLFMoZSx7bW91c2VlbnRlcjp0aGlzLl9leHBhbmRTYWZlbHksbW91c2VsZWF2ZTp0aGlzLmNvbGxhcHNlfSx0aGlzKSksdGhpcy5fbGF5ZXJzTGluaz1QKCJhIix0KyItdG9nZ2xlIixlKSk7by5ocmVmPSIjIixvLnRpdGxlPSJMYXllcnMiLG8uc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIiksUyhvLHtrZXlkb3duOmZ1bmN0aW9uKHQpezEzPT09dC5rZXlDb2RlJiZ0aGlzLl9leHBhbmRTYWZlbHkoKX0sY2xpY2s6ZnVuY3Rpb24odCl7Tyh0KSx0aGlzLl9leHBhbmRTYWZlbHkoKX19LHRoaXMpLGl8fHRoaXMuZXhwYW5kKCksdGhpcy5fYmFzZUxheWVyc0xpc3Q9UCgiZGl2Iix0KyItYmFzZSIsbiksdGhpcy5fc2VwYXJhdG9yPVAoImRpdiIsdCsiLXNlcGFyYXRvciIsbiksdGhpcy5fb3ZlcmxheXNMaXN0PVAoImRpdiIsdCsiLW92ZXJsYXlzIixuKSxlLmFwcGVuZENoaWxkKG4pfSxfZ2V0TGF5ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sYXllcnMubGVuZ3RoO2UrKylpZih0aGlzLl9sYXllcnNbZV0mJmgodGhpcy5fbGF5ZXJzW2VdLmxheWVyKT09PXQpcmV0dXJuIHRoaXMuX2xheWVyc1tlXX0sX2FkZExheWVyOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9tYXAmJnQub24oImFkZCByZW1vdmUiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyksdGhpcy5fbGF5ZXJzLnB1c2goe2xheWVyOnQsbmFtZTplLG92ZXJsYXk6aX0pLHRoaXMub3B0aW9ucy5zb3J0TGF5ZXJzJiZ0aGlzLl9sYXllcnMuc29ydChhKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3J0RnVuY3Rpb24odC5sYXllcixlLmxheWVyLHQubmFtZSxlLm5hbWUpfSx0aGlzKSksdGhpcy5vcHRpb25zLmF1dG9aSW5kZXgmJnQuc2V0WkluZGV4JiYodGhpcy5fbGFzdFpJbmRleCsrLHQuc2V0WkluZGV4KHRoaXMuX2xhc3RaSW5kZXgpKSx0aGlzLl9leHBhbmRJZk5vdENvbGxhcHNlZCgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fY29udGFpbmVyKXttZSh0aGlzLl9iYXNlTGF5ZXJzTGlzdCksbWUodGhpcy5fb3ZlcmxheXNMaXN0KSx0aGlzLl9sYXllckNvbnRyb2xJbnB1dHM9W107Zm9yKHZhciB0LGUsaSxuPTAsbz0wO288dGhpcy5fbGF5ZXJzLmxlbmd0aDtvKyspaT10aGlzLl9sYXllcnNbb10sdGhpcy5fYWRkSXRlbShpKSxlPWV8fGkub3ZlcmxheSx0PXR8fCFpLm92ZXJsYXksbis9aS5vdmVybGF5PzA6MTt0aGlzLm9wdGlvbnMuaGlkZVNpbmdsZUJhc2UmJih0aGlzLl9iYXNlTGF5ZXJzTGlzdC5zdHlsZS5kaXNwbGF5PSh0PXQmJjE8bik\/IiI6Im5vbmUiKSx0aGlzLl9zZXBhcmF0b3Iuc3R5bGUuZGlzcGxheT1lJiZ0PyIiOiJub25lIn1yZXR1cm4gdGhpc30sX29uTGF5ZXJDaGFuZ2U6ZnVuY3Rpb24odCl7dGhpcy5faGFuZGxpbmdDbGlja3x8dGhpcy5fdXBkYXRlKCk7dmFyIGU9dGhpcy5fZ2V0TGF5ZXIoaCh0LnRhcmdldCkpLHQ9ZS5vdmVybGF5PyJhZGQiPT09dC50eXBlPyJvdmVybGF5YWRkIjoib3ZlcmxheXJlbW92ZSI6ImFkZCI9PT10LnR5cGU\/ImJhc2VsYXllcmNoYW5nZSI6bnVsbDt0JiZ0aGlzLl9tYXAuZmlyZSh0LGUpfSxfY3JlYXRlUmFkaW9FbGVtZW50OmZ1bmN0aW9uKHQsZSl7dD0nPGlucHV0IHR5cGU9InJhZGlvIiBjbGFzcz0ibGVhZmxldC1jb250cm9sLWxheWVycy1zZWxlY3RvciIgbmFtZT0iJyt0KyciJysoZT8nIGNoZWNrZWQ9ImNoZWNrZWQiJzoiIikrIi8+IixlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmlubmVySFRNTD10LGUuZmlyc3RDaGlsZH0sX2FkZEl0ZW06ZnVuY3Rpb24odCl7dmFyIGUsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLG49dGhpcy5fbWFwLmhhc0xheWVyKHQubGF5ZXIpLG49KHQub3ZlcmxheT8oKGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudHlwZT0iY2hlY2tib3giLGUuY2xhc3NOYW1lPSJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLXNlbGVjdG9yIixlLmRlZmF1bHRDaGVja2VkPW4pOmU9dGhpcy5fY3JlYXRlUmFkaW9FbGVtZW50KCJsZWFmbGV0LWJhc2UtbGF5ZXJzXyIraCh0aGlzKSxuKSx0aGlzLl9sYXllckNvbnRyb2xJbnB1dHMucHVzaChlKSxlLmxheWVySWQ9aCh0LmxheWVyKSxTKGUsImNsaWNrIix0aGlzLl9vbklucHV0Q2xpY2ssdGhpcyksZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKSxvPShuLmlubmVySFRNTD0iICIrdC5uYW1lLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSk7cmV0dXJuIGkuYXBwZW5kQ2hpbGQobyksby5hcHBlbmRDaGlsZChlKSxvLmFwcGVuZENoaWxkKG4pLCh0Lm92ZXJsYXk\/dGhpcy5fb3ZlcmxheXNMaXN0OnRoaXMuX2Jhc2VMYXllcnNMaXN0KS5hcHBlbmRDaGlsZChpKSx0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzKCksaX0sX29uSW5wdXRDbGljazpmdW5jdGlvbigpe2lmKCF0aGlzLl9wcmV2ZW50Q2xpY2spe3ZhciB0LGUsaT10aGlzLl9sYXllckNvbnRyb2xJbnB1dHMsbj1bXSxvPVtdO3RoaXMuX2hhbmRsaW5nQ2xpY2s9ITA7Zm9yKHZhciBzPWkubGVuZ3RoLTE7MDw9cztzLS0pdD1pW3NdLGU9dGhpcy5fZ2V0TGF5ZXIodC5sYXllcklkKS5sYXllcix0LmNoZWNrZWQ\/bi5wdXNoKGUpOnQuY2hlY2tlZHx8by5wdXNoKGUpO2ZvcihzPTA7czxvLmxlbmd0aDtzKyspdGhpcy5fbWFwLmhhc0xheWVyKG9bc10pJiZ0aGlzLl9tYXAucmVtb3ZlTGF5ZXIob1tzXSk7Zm9yKHM9MDtzPG4ubGVuZ3RoO3MrKyl0aGlzLl9tYXAuaGFzTGF5ZXIobltzXSl8fHRoaXMuX21hcC5hZGRMYXllcihuW3NdKTt0aGlzLl9oYW5kbGluZ0NsaWNrPSExLHRoaXMuX3JlZm9jdXNPbk1hcCgpfX0sX2NoZWNrRGlzYWJsZWRMYXllcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxpPXRoaXMuX2xheWVyQ29udHJvbElucHV0cyxuPXRoaXMuX21hcC5nZXRab29tKCksbz1pLmxlbmd0aC0xOzA8PW87by0tKXQ9aVtvXSxlPXRoaXMuX2dldExheWVyKHQubGF5ZXJJZCkubGF5ZXIsdC5kaXNhYmxlZD12b2lkIDAhPT1lLm9wdGlvbnMubWluWm9vbSYmbjxlLm9wdGlvbnMubWluWm9vbXx8dm9pZCAwIT09ZS5vcHRpb25zLm1heFpvb20mJm4+ZS5vcHRpb25zLm1heFpvb219LF9leHBhbmRJZk5vdENvbGxhcHNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJiF0aGlzLm9wdGlvbnMuY29sbGFwc2VkJiZ0aGlzLmV4cGFuZCgpLHRoaXN9LF9leHBhbmRTYWZlbHk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zZWN0aW9uLGU9KHRoaXMuX3ByZXZlbnRDbGljaz0hMCxTKHQsImNsaWNrIixPKSx0aGlzLmV4cGFuZCgpLHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrKHQsImNsaWNrIixPKSxlLl9wcmV2ZW50Q2xpY2s9ITF9KX19KSkscWU9Qi5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJ0b3BsZWZ0Iix6b29tSW5UZXh0Oic8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+Kzwvc3Bhbj4nLHpvb21JblRpdGxlOiJab29tIGluIix6b29tT3V0VGV4dDonPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiYjeDIyMTI7PC9zcGFuPicsem9vbU91dFRpdGxlOiJab29tIG91dCJ9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBlPSJsZWFmbGV0LWNvbnRyb2wtem9vbSIsaT1QKCJkaXYiLGUrIiBsZWFmbGV0LWJhciIpLG49dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLl96b29tSW5CdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG4uem9vbUluVGV4dCxuLnpvb21JblRpdGxlLGUrIi1pbiIsaSx0aGlzLl96b29tSW4pLHRoaXMuX3pvb21PdXRCdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKG4uem9vbU91dFRleHQsbi56b29tT3V0VGl0bGUsZSsiLW91dCIsaSx0aGlzLl96b29tT3V0KSx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHQub24oInpvb21lbmQgem9vbWxldmVsc2NoYW5nZSIsdGhpcy5fdXBkYXRlRGlzYWJsZWQsdGhpcyksaX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dC5vZmYoInpvb21lbmQgem9vbWxldmVsc2NoYW5nZSIsdGhpcy5fdXBkYXRlRGlzYWJsZWQsdGhpcyl9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9ITAsdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5fdXBkYXRlRGlzYWJsZWQoKSx0aGlzfSxfem9vbUluOmZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNhYmxlZCYmdGhpcy5fbWFwLl96b29tPHRoaXMuX21hcC5nZXRNYXhab29tKCkmJnRoaXMuX21hcC56b29tSW4odGhpcy5fbWFwLm9wdGlvbnMuem9vbURlbHRhKih0LnNoaWZ0S2V5PzM6MSkpfSxfem9vbU91dDpmdW5jdGlvbih0KXshdGhpcy5fZGlzYWJsZWQmJnRoaXMuX21hcC5fem9vbT50aGlzLl9tYXAuZ2V0TWluWm9vbSgpJiZ0aGlzLl9tYXAuem9vbU91dCh0aGlzLl9tYXAub3B0aW9ucy56b29tRGVsdGEqKHQuc2hpZnRLZXk\/MzoxKSl9LF9jcmVhdGVCdXR0b246ZnVuY3Rpb24odCxlLGksbixvKXtpPVAoImEiLGksbik7cmV0dXJuIGkuaW5uZXJIVE1MPXQsaS5ocmVmPSIjIixpLnRpdGxlPWUsaS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKSxpLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsZSksSWUoaSksUyhpLCJjbGljayIsUmUpLFMoaSwiY2xpY2siLG8sdGhpcyksUyhpLCJjbGljayIsdGhpcy5fcmVmb2N1c09uTWFwLHRoaXMpLGl9LF91cGRhdGVEaXNhYmxlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxlPSJsZWFmbGV0LWRpc2FibGVkIjt6KHRoaXMuX3pvb21JbkJ1dHRvbixlKSx6KHRoaXMuX3pvb21PdXRCdXR0b24sZSksdGhpcy5fem9vbUluQnV0dG9uLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsImZhbHNlIiksdGhpcy5fem9vbU91dEJ1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCJmYWxzZSIpLCF0aGlzLl9kaXNhYmxlZCYmdC5fem9vbSE9PXQuZ2V0TWluWm9vbSgpfHwoTSh0aGlzLl96b29tT3V0QnV0dG9uLGUpLHRoaXMuX3pvb21PdXRCdXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpKSwhdGhpcy5fZGlzYWJsZWQmJnQuX3pvb20hPT10LmdldE1heFpvb20oKXx8KE0odGhpcy5fem9vbUluQnV0dG9uLGUpLHRoaXMuX3pvb21JbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIikpfX0pLEdlPShBLm1lcmdlT3B0aW9ucyh7em9vbUNvbnRyb2w6ITB9KSxBLmFkZEluaXRIb29rKGZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnpvb21Db250cm9sJiYodGhpcy56b29tQ29udHJvbD1uZXcgcWUsdGhpcy5hZGRDb250cm9sKHRoaXMuem9vbUNvbnRyb2wpKX0pLEIuZXh0ZW5kKHtvcHRpb25zOntwb3NpdGlvbjoiYm90dG9tbGVmdCIsbWF4V2lkdGg6MTAwLG1ldHJpYzohMCxpbXBlcmlhbDohMH0sb25BZGQ6ZnVuY3Rpb24odCl7dmFyIGU9ImxlYWZsZXQtY29udHJvbC1zY2FsZSIsaT1QKCJkaXYiLGUpLG49dGhpcy5vcHRpb25zO3JldHVybiB0aGlzLl9hZGRTY2FsZXMobixlKyItbGluZSIsaSksdC5vbihuLnVwZGF0ZVdoZW5JZGxlPyJtb3ZlZW5kIjoibW92ZSIsdGhpcy5fdXBkYXRlLHRoaXMpLHQud2hlblJlYWR5KHRoaXMuX3VwZGF0ZSx0aGlzKSxpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZih0aGlzLm9wdGlvbnMudXBkYXRlV2hlbklkbGU\/Im1vdmVlbmQiOiJtb3ZlIix0aGlzLl91cGRhdGUsdGhpcyl9LF9hZGRTY2FsZXM6ZnVuY3Rpb24odCxlLGkpe3QubWV0cmljJiYodGhpcy5fbVNjYWxlPVAoImRpdiIsZSxpKSksdC5pbXBlcmlhbCYmKHRoaXMuX2lTY2FsZT1QKCJkaXYiLGUsaSkpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGU9dC5nZXRTaXplKCkueS8yLHQ9dC5kaXN0YW5jZSh0LmNvbnRhaW5lclBvaW50VG9MYXRMbmcoWzAsZV0pLHQuY29udGFpbmVyUG9pbnRUb0xhdExuZyhbdGhpcy5vcHRpb25zLm1heFdpZHRoLGVdKSk7dGhpcy5fdXBkYXRlU2NhbGVzKHQpfSxfdXBkYXRlU2NhbGVzOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5tZXRyaWMmJnQmJnRoaXMuX3VwZGF0ZU1ldHJpYyh0KSx0aGlzLm9wdGlvbnMuaW1wZXJpYWwmJnQmJnRoaXMuX3VwZGF0ZUltcGVyaWFsKHQpfSxfdXBkYXRlTWV0cmljOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldFJvdW5kTnVtKHQpO3RoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX21TY2FsZSxlPDFlMz9lKyIgbSI6ZS8xZTMrIiBrbSIsZS90KX0sX3VwZGF0ZUltcGVyaWFsOmZ1bmN0aW9uKHQpe3ZhciBlLGksdD0zLjI4MDgzOTkqdDs1MjgwPHQ\/KGk9dGhpcy5fZ2V0Um91bmROdW0oZT10LzUyODApLHRoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX2lTY2FsZSxpKyIgbWkiLGkvZSkpOihpPXRoaXMuX2dldFJvdW5kTnVtKHQpLHRoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX2lTY2FsZSxpKyIgZnQiLGkvdCkpfSxfdXBkYXRlU2NhbGU6ZnVuY3Rpb24odCxlLGkpe3Quc3R5bGUud2lkdGg9TWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMubWF4V2lkdGgqaSkrInB4Iix0LmlubmVySFRNTD1lfSxfZ2V0Um91bmROdW06ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5wb3coMTAsKE1hdGguZmxvb3IodCkrIiIpLmxlbmd0aC0xKSx0PXQvZTtyZXR1cm4gZSoodD0xMDw9dD8xMDo1PD10PzU6Mzw9dD8zOjI8PXQ\/MjoxKX19KSksS2U9Qi5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJib3R0b21yaWdodCIscHJlZml4Oic8YSBocmVmPSJodHRwczovL2xlYWZsZXRqcy5jb20iIHRpdGxlPSJBIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcyI+JysoYi5pbmxpbmVTdmc\/JzxzdmcgYXJpYS1oaWRkZW49InRydWUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEyIiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAxMiA4IiBjbGFzcz0ibGVhZmxldC1hdHRyaWJ1dGlvbi1mbGFnIj48cGF0aCBmaWxsPSIjNEM3QkUxIiBkPSJNMCAwaDEydjRIMHoiLz48cGF0aCBmaWxsPSIjRkZENTAwIiBkPSJNMCA0aDEydjNIMHoiLz48cGF0aCBmaWxsPSIjRTBCQzAwIiBkPSJNMCA3aDEydjFIMHoiLz48L3N2Zz4gJzoiIikrIkxlYWZsZXQ8L2E+In0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtjKHRoaXMsdCksdGhpcy5fYXR0cmlidXRpb25zPXt9fSxvbkFkZDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4odC5hdHRyaWJ1dGlvbkNvbnRyb2w9dGhpcykuX2NvbnRhaW5lcj1QKCJkaXYiLCJsZWFmbGV0LWNvbnRyb2wtYXR0cmlidXRpb24iKSxJZSh0aGlzLl9jb250YWluZXIpLHQuX2xheWVycyl0Ll9sYXllcnNbZV0uZ2V0QXR0cmlidXRpb24mJnRoaXMuYWRkQXR0cmlidXRpb24odC5fbGF5ZXJzW2VdLmdldEF0dHJpYnV0aW9uKCkpO3JldHVybiB0aGlzLl91cGRhdGUoKSx0Lm9uKCJsYXllcmFkZCIsdGhpcy5fYWRkQXR0cmlidXRpb24sdGhpcyksdGhpcy5fY29udGFpbmVyfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZigibGF5ZXJhZGQiLHRoaXMuX2FkZEF0dHJpYnV0aW9uLHRoaXMpfSxfYWRkQXR0cmlidXRpb246ZnVuY3Rpb24odCl7dC5sYXllci5nZXRBdHRyaWJ1dGlvbiYmKHRoaXMuYWRkQXR0cmlidXRpb24odC5sYXllci5nZXRBdHRyaWJ1dGlvbigpKSx0LmxheWVyLm9uY2UoInJlbW92ZSIsZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0aW9uKHQubGF5ZXIuZ2V0QXR0cmlidXRpb24oKSl9LHRoaXMpKX0sc2V0UHJlZml4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMucHJlZml4PXQsdGhpcy5fdXBkYXRlKCksdGhpc30sYWRkQXR0cmlidXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0aGlzLl9hdHRyaWJ1dGlvbnNbdF18fCh0aGlzLl9hdHRyaWJ1dGlvbnNbdF09MCksdGhpcy5fYXR0cmlidXRpb25zW3RdKyssdGhpcy5fdXBkYXRlKCkpLHRoaXN9LHJlbW92ZUF0dHJpYnV0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9hdHRyaWJ1dGlvbnNbdF0mJih0aGlzLl9hdHRyaWJ1dGlvbnNbdF0tLSx0aGlzLl91cGRhdGUoKSksdGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQsZT1bXTtmb3IodCBpbiB0aGlzLl9hdHRyaWJ1dGlvbnMpdGhpcy5fYXR0cmlidXRpb25zW3RdJiZlLnB1c2godCk7dmFyIGk9W107dGhpcy5vcHRpb25zLnByZWZpeCYmaS5wdXNoKHRoaXMub3B0aW9ucy5wcmVmaXgpLGUubGVuZ3RoJiZpLnB1c2goZS5qb2luKCIsICIpKSx0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPWkuam9pbignIDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj58PC9zcGFuPiAnKX19fSksbj0oQS5tZXJnZU9wdGlvbnMoe2F0dHJpYnV0aW9uQ29udHJvbDohMH0pLEEuYWRkSW5pdEhvb2soZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXR0cmlidXRpb25Db250cm9sJiYobmV3IEtlKS5hZGRUbyh0aGlzKX0pLEIuTGF5ZXJzPVZlLEIuWm9vbT1xZSxCLlNjYWxlPUdlLEIuQXR0cmlidXRpb249S2UsVWUubGF5ZXJzPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IFZlKHQsZSxpKX0sVWUuem9vbT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFlKHQpfSxVZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEdlKHQpfSxVZS5hdHRyaWJ1dGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEtlKHQpfSxldC5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXR9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmFibGVkfHwodGhpcy5fZW5hYmxlZD0hMCx0aGlzLmFkZEhvb2tzKCkpLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5hYmxlZCYmKHRoaXMuX2VuYWJsZWQ9ITEsdGhpcy5yZW1vdmVIb29rcygpKSx0aGlzfSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9lbmFibGVkfX0pKSxmdD0obi5hZGRUbz1mdW5jdGlvbih0LGUpe3JldHVybiB0LmFkZEhhbmRsZXIoZSx0aGlzKSx0aGlzfSx7RXZlbnRzOmV9KSxZZT1iLnRvdWNoPyJ0b3VjaHN0YXJ0IG1vdXNlZG93biI6Im1vdXNlZG93biIsWGU9aXQuZXh0ZW5kKHtvcHRpb25zOntjbGlja1RvbGVyYW5jZTozfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSxpLG4pe2ModGhpcyxuKSx0aGlzLl9lbGVtZW50PXQsdGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0PWV8fHQsdGhpcy5fcHJldmVudE91dGxpbmU9aX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZHx8KFModGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0LFllLHRoaXMuX29uRG93bix0aGlzKSx0aGlzLl9lbmFibGVkPSEwKX0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VuYWJsZWQmJihYZS5fZHJhZ2dpbmc9PT10aGlzJiZ0aGlzLmZpbmlzaERyYWcoITApLGsodGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0LFllLHRoaXMuX29uRG93bix0aGlzKSx0aGlzLl9lbmFibGVkPSExLHRoaXMuX21vdmVkPSExKX0sX29uRG93bjpmdW5jdGlvbih0KXt2YXIgZSxpO3RoaXMuX2VuYWJsZWQmJih0aGlzLl9tb3ZlZD0hMSx2ZSh0aGlzLl9lbGVtZW50LCJsZWFmbGV0LXpvb20tYW5pbSIpfHwodC50b3VjaGVzJiYxIT09dC50b3VjaGVzLmxlbmd0aD9YZS5fZHJhZ2dpbmc9PT10aGlzJiZ0aGlzLmZpbmlzaERyYWcoKTpYZS5fZHJhZ2dpbmd8fHQuc2hpZnRLZXl8fDEhPT10LndoaWNoJiYxIT09dC5idXR0b24mJiF0LnRvdWNoZXN8fCgoWGUuX2RyYWdnaW5nPXRoaXMpLl9wcmV2ZW50T3V0bGluZSYmTWUodGhpcy5fZWxlbWVudCksTGUoKSxyZSgpLHRoaXMuX21vdmluZ3x8KHRoaXMuZmlyZSgiZG93biIpLGk9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LGU9Q2UodGhpcy5fZWxlbWVudCksdGhpcy5fc3RhcnRQb2ludD1uZXcgcChpLmNsaWVudFgsaS5jbGllbnRZKSx0aGlzLl9zdGFydFBvcz1QZSh0aGlzLl9lbGVtZW50KSx0aGlzLl9wYXJlbnRTY2FsZT1aZShlKSxpPSJtb3VzZWRvd24iPT09dC50eXBlLFMoZG9jdW1lbnQsaT8ibW91c2Vtb3ZlIjoidG91Y2htb3ZlIix0aGlzLl9vbk1vdmUsdGhpcyksUyhkb2N1bWVudCxpPyJtb3VzZXVwIjoidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHRoaXMuX29uVXAsdGhpcykpKSkpfSxfb25Nb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlO3RoaXMuX2VuYWJsZWQmJih0LnRvdWNoZXMmJjE8dC50b3VjaGVzLmxlbmd0aD90aGlzLl9tb3ZlZD0hMDohKGU9bmV3IHAoKGU9dC50b3VjaGVzJiYxPT09dC50b3VjaGVzLmxlbmd0aD90LnRvdWNoZXNbMF06dCkuY2xpZW50WCxlLmNsaWVudFkpLl9zdWJ0cmFjdCh0aGlzLl9zdGFydFBvaW50KSkueCYmIWUueXx8TWF0aC5hYnMoZS54KStNYXRoLmFicyhlLnkpPHRoaXMub3B0aW9ucy5jbGlja1RvbGVyYW5jZXx8KGUueC89dGhpcy5fcGFyZW50U2NhbGUueCxlLnkvPXRoaXMuX3BhcmVudFNjYWxlLnksTyh0KSx0aGlzLl9tb3ZlZHx8KHRoaXMuZmlyZSgiZHJhZ3N0YXJ0IiksdGhpcy5fbW92ZWQ9ITAsTShkb2N1bWVudC5ib2R5LCJsZWFmbGV0LWRyYWdnaW5nIiksdGhpcy5fbGFzdFRhcmdldD10LnRhcmdldHx8dC5zcmNFbGVtZW50LHdpbmRvdy5TVkdFbGVtZW50SW5zdGFuY2UmJnRoaXMuX2xhc3RUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudEluc3RhbmNlJiYodGhpcy5fbGFzdFRhcmdldD10aGlzLl9sYXN0VGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSxNKHRoaXMuX2xhc3RUYXJnZXQsImxlYWZsZXQtZHJhZy10YXJnZXQiKSksdGhpcy5fbmV3UG9zPXRoaXMuX3N0YXJ0UG9zLmFkZChlKSx0aGlzLl9tb3Zpbmc9ITAsdGhpcy5fbGFzdEV2ZW50PXQsdGhpcy5fdXBkYXRlUG9zaXRpb24oKSkpfSxfdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD17b3JpZ2luYWxFdmVudDp0aGlzLl9sYXN0RXZlbnR9O3RoaXMuZmlyZSgicHJlZHJhZyIsdCksWih0aGlzLl9lbGVtZW50LHRoaXMuX25ld1BvcyksdGhpcy5maXJlKCJkcmFnIix0KX0sX29uVXA6ZnVuY3Rpb24oKXt0aGlzLl9lbmFibGVkJiZ0aGlzLmZpbmlzaERyYWcoKX0sZmluaXNoRHJhZzpmdW5jdGlvbih0KXt6KGRvY3VtZW50LmJvZHksImxlYWZsZXQtZHJhZ2dpbmciKSx0aGlzLl9sYXN0VGFyZ2V0JiYoeih0aGlzLl9sYXN0VGFyZ2V0LCJsZWFmbGV0LWRyYWctdGFyZ2V0IiksdGhpcy5fbGFzdFRhcmdldD1udWxsKSxrKGRvY3VtZW50LCJtb3VzZW1vdmUgdG91Y2htb3ZlIix0aGlzLl9vbk1vdmUsdGhpcyksayhkb2N1bWVudCwibW91c2V1cCB0b3VjaGVuZCB0b3VjaGNhbmNlbCIsdGhpcy5fb25VcCx0aGlzKSxUZSgpLGFlKCk7dmFyIGU9dGhpcy5fbW92ZWQmJnRoaXMuX21vdmluZzt0aGlzLl9tb3Zpbmc9ITEsWGUuX2RyYWdnaW5nPSExLGUmJnRoaXMuZmlyZSgiZHJhZ2VuZCIse25vSW5lcnRpYTp0LGRpc3RhbmNlOnRoaXMuX25ld1Bvcy5kaXN0YW5jZVRvKHRoaXMuX3N0YXJ0UG9zKX0pfX0pO2Z1bmN0aW9uIEplKHQsZSxpKXtmb3IodmFyIG4sbyxzLHIsYSxoLGwsdT1bMSw0LDIsOF0sYz0wLGQ9dC5sZW5ndGg7YzxkO2MrKyl0W2NdLl9jb2RlPXNpKHRbY10sZSk7Zm9yKHM9MDtzPDQ7cysrKXtmb3IoaD11W3NdLG49W10sYz0wLG89KGQ9dC5sZW5ndGgpLTE7YzxkO289YysrKXI9dFtjXSxhPXRbb10sci5fY29kZSZoP2EuX2NvZGUmaHx8KChsPW9pKGEscixoLGUsaSkpLl9jb2RlPXNpKGwsZSksbi5wdXNoKGwpKTooYS5fY29kZSZoJiYoKGw9b2koYSxyLGgsZSxpKSkuX2NvZGU9c2kobCxlKSxuLnB1c2gobCkpLG4ucHVzaChyKSk7dD1ufXJldHVybiB0fWZ1bmN0aW9uICRlKHQsZSl7dmFyIGksbixvLHMscixhLGg7aWYoIXR8fDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImxhdGxuZ3Mgbm90IHBhc3NlZCIpO0kodCl8fChjb25zb2xlLndhcm4oImxhdGxuZ3MgYXJlIG5vdCBmbGF0ISBPbmx5IHRoZSBmaXJzdCByaW5nIHdpbGwgYmUgdXNlZCIpLHQ9dFswXSk7Zm9yKHZhciBsPXcoWzAsMF0pLHU9Zyh0KSxjPSh1LmdldE5vcnRoV2VzdCgpLmRpc3RhbmNlVG8odS5nZXRTb3V0aFdlc3QoKSkqdS5nZXROb3J0aEVhc3QoKS5kaXN0YW5jZVRvKHUuZ2V0Tm9ydGhXZXN0KCkpPDE3MDAmJihsPVFlKHQpKSx0Lmxlbmd0aCksZD1bXSxfPTA7XzxjO18rKyl7dmFyIHA9dyh0W19dKTtkLnB1c2goZS5wcm9qZWN0KHcoW3AubGF0LWwubGF0LHAubG5nLWwubG5nXSkpKX1mb3IoXz1yPWE9aD0wLGk9Yy0xO188YztpPV8rKyluPWRbX10sbz1kW2ldLHM9bi55Km8ueC1vLnkqbi54LGErPShuLngrby54KSpzLGgrPShuLnkrby55KSpzLHIrPTMqczt1PTA9PT1yP2RbMF06W2EvcixoL3JdLHU9ZS51bnByb2plY3QobSh1KSk7cmV0dXJuIHcoW3UubGF0K2wubGF0LHUubG5nK2wubG5nXSl9ZnVuY3Rpb24gUWUodCl7Zm9yKHZhciBlPTAsaT0wLG49MCxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBzPXcodFtvXSk7ZSs9cy5sYXQsaSs9cy5sbmcsbisrfXJldHVybiB3KFtlL24saS9uXSl9dmFyIHRpLGd0PXtfX3Byb3RvX186bnVsbCxjbGlwUG9seWdvbjpKZSxwb2x5Z29uQ2VudGVyOiRlLGNlbnRyb2lkOlFlfTtmdW5jdGlvbiBlaSh0LGUpe2lmKGUmJnQubGVuZ3RoKXt2YXIgaT10PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPVt0WzBdXSxuPTEsbz0wLHM9dC5sZW5ndGg7bjxzO24rKykoZnVuY3Rpb24odCxlKXt2YXIgaT1lLngtdC54LGU9ZS55LXQueTtyZXR1cm4gaSppK2UqZX0pKHRbbl0sdFtvXSk+ZSYmKGkucHVzaCh0W25dKSxvPW4pO288cy0xJiZpLnB1c2godFtzLTFdKTtyZXR1cm4gaX0odCxlPWUqZSksbj1pLmxlbmd0aCxvPW5ldyh0eXBlb2YgVWludDhBcnJheSE9dm9pZCAwKyIiP1VpbnQ4QXJyYXk6QXJyYXkpKG4pO29bMF09b1tuLTFdPTEsZnVuY3Rpb24gdChlLGksbixvLHMpe3ZhciByLGEsaCxsPTA7Zm9yKGE9bysxO2E8PXMtMTthKyspaD1yaShlW2FdLGVbb10sZVtzXSwhMCksbDxoJiYocj1hLGw9aCk7bjxsJiYoaVtyXT0xLHQoZSxpLG4sbyxyKSx0KGUsaSxuLHIscykpfShpLG8sZSwwLG4tMSk7dmFyIHMscj1bXTtmb3Iocz0wO3M8bjtzKyspb1tzXSYmci5wdXNoKGlbc10pO3JldHVybiByfXJldHVybiB0LnNsaWNlKCl9ZnVuY3Rpb24gaWkodCxlLGkpe3JldHVybiBNYXRoLnNxcnQocmkodCxlLGksITApKX1mdW5jdGlvbiBuaSh0LGUsaSxuLG8pe3ZhciBzLHIsYSxoPW4\/dGk6c2kodCxpKSxsPXNpKGUsaSk7Zm9yKHRpPWw7Oyl7aWYoIShofGwpKXJldHVyblt0LGVdO2lmKGgmbClyZXR1cm4hMTthPXNpKHI9b2kodCxlLHM9aHx8bCxpLG8pLGkpLHM9PT1oPyh0PXIsaD1hKTooZT1yLGw9YSl9fWZ1bmN0aW9uIG9pKHQsZSxpLG4sbyl7dmFyIHMscixhPWUueC10LngsZT1lLnktdC55LGg9bi5taW4sbj1uLm1heDtyZXR1cm4gOCZpPyhzPXQueCthKihuLnktdC55KS9lLHI9bi55KTo0Jmk\/KHM9dC54K2EqKGgueS10LnkpL2Uscj1oLnkpOjImaT8ocz1uLngscj10LnkrZSoobi54LXQueCkvYSk6MSZpJiYocz1oLngscj10LnkrZSooaC54LXQueCkvYSksbmV3IHAocyxyLG8pfWZ1bmN0aW9uIHNpKHQsZSl7dmFyIGk9MDtyZXR1cm4gdC54PGUubWluLng\/aXw9MTp0Lng+ZS5tYXgueCYmKGl8PTIpLHQueTxlLm1pbi55P2l8PTQ6dC55PmUubWF4LnkmJihpfD04KSxpfWZ1bmN0aW9uIHJpKHQsZSxpLG4pe3ZhciBvPWUueCxlPWUueSxzPWkueC1vLHI9aS55LWUsYT1zKnMrcipyO3JldHVybiAwPGEmJigxPChhPSgodC54LW8pKnMrKHQueS1lKSpyKS9hKT8obz1pLngsZT1pLnkpOjA8YSYmKG8rPXMqYSxlKz1yKmEpKSxzPXQueC1vLHI9dC55LWUsbj9zKnMrcipyOm5ldyBwKG8sZSl9ZnVuY3Rpb24gSSh0KXtyZXR1cm4hZCh0WzBdKXx8Im9iamVjdCIhPXR5cGVvZiB0WzBdWzBdJiZ2b2lkIDAhPT10WzBdWzBdfWZ1bmN0aW9uIGFpKHQpe3JldHVybiBjb25zb2xlLndhcm4oIkRlcHJlY2F0ZWQgdXNlIG9mIF9mbGF0LCBwbGVhc2UgdXNlIEwuTGluZVV0aWwuaXNGbGF0IGluc3RlYWQuIiksSSh0KX1mdW5jdGlvbiBoaSh0LGUpe3ZhciBpLG4sbyxzLHIsYTtpZighdHx8MD09PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigibGF0bG5ncyBub3QgcGFzc2VkIik7SSh0KXx8KGNvbnNvbGUud2FybigibGF0bG5ncyBhcmUgbm90IGZsYXQhIE9ubHkgdGhlIGZpcnN0IHJpbmcgd2lsbCBiZSB1c2VkIiksdD10WzBdKTtmb3IodmFyIGg9dyhbMCwwXSksbD1nKHQpLHU9KGwuZ2V0Tm9ydGhXZXN0KCkuZGlzdGFuY2VUbyhsLmdldFNvdXRoV2VzdCgpKSpsLmdldE5vcnRoRWFzdCgpLmRpc3RhbmNlVG8obC5nZXROb3J0aFdlc3QoKSk8MTcwMCYmKGg9UWUodCkpLHQubGVuZ3RoKSxjPVtdLGQ9MDtkPHU7ZCsrKXt2YXIgXz13KHRbZF0pO2MucHVzaChlLnByb2plY3QodyhbXy5sYXQtaC5sYXQsXy5sbmctaC5sbmddKSkpfWZvcihpPWQ9MDtkPHUtMTtkKyspaSs9Y1tkXS5kaXN0YW5jZVRvKGNbZCsxXSkvMjtpZigwPT09aSlhPWNbMF07ZWxzZSBmb3Iobj1kPTA7ZDx1LTE7ZCsrKWlmKG89Y1tkXSxzPWNbZCsxXSxpPChuKz1yPW8uZGlzdGFuY2VUbyhzKSkpe2E9W3MueC0ocj0obi1pKS9yKSoocy54LW8ueCkscy55LXIqKHMueS1vLnkpXTticmVha31sPWUudW5wcm9qZWN0KG0oYSkpO3JldHVybiB3KFtsLmxhdCtoLmxhdCxsLmxuZytoLmxuZ10pfXZhciB2dD17X19wcm90b19fOm51bGwsc2ltcGxpZnk6ZWkscG9pbnRUb1NlZ21lbnREaXN0YW5jZTppaSxjbG9zZXN0UG9pbnRPblNlZ21lbnQ6ZnVuY3Rpb24odCxlLGkpe3JldHVybiByaSh0LGUsaSl9LGNsaXBTZWdtZW50Om5pLF9nZXRFZGdlSW50ZXJzZWN0aW9uOm9pLF9nZXRCaXRDb2RlOnNpLF9zcUNsb3Nlc3RQb2ludE9uU2VnbWVudDpyaSxpc0ZsYXQ6SSxfZmxhdDphaSxwb2x5bGluZUNlbnRlcjpoaX0seXQ9e3Byb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwKHQubG5nLHQubGF0KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdih0LnksdC54KX0sYm91bmRzOm5ldyBmKFstMTgwLC05MF0sWzE4MCw5MF0pfSx4dD17Ujo2Mzc4MTM3LFJfTUlOT1I6NjM1Njc1Mi4zMTQyNDUxNzksYm91bmRzOm5ldyBmKFstMjAwMzc1MDguMzQyNzksLTE1NDk2NTcwLjczOTcyXSxbMjAwMzc1MDguMzQyNzksMTg3NjQ2NTYuMjMxMzhdKSxwcm9qZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguUEkvMTgwLGk9dGhpcy5SLG49dC5sYXQqZSxvPXRoaXMuUl9NSU5PUi9pLG89TWF0aC5zcXJ0KDEtbypvKSxzPW8qTWF0aC5zaW4obikscz1NYXRoLnRhbihNYXRoLlBJLzQtbi8yKS9NYXRoLnBvdygoMS1zKS8oMStzKSxvLzIpLG49LWkqTWF0aC5sb2coTWF0aC5tYXgocywxZS0xMCkpO3JldHVybiBuZXcgcCh0LmxuZyplKmksbil9LHVucHJvamVjdDpmdW5jdGlvbih0KXtmb3IodmFyIGUsaT0xODAvTWF0aC5QSSxuPXRoaXMuUixvPXRoaXMuUl9NSU5PUi9uLHM9TWF0aC5zcXJ0KDEtbypvKSxyPU1hdGguZXhwKC10LnkvbiksYT1NYXRoLlBJLzItMipNYXRoLmF0YW4ociksaD0wLGw9LjE7aDwxNSYmMWUtNzxNYXRoLmFicyhsKTtoKyspZT1zKk1hdGguc2luKGEpLGU9TWF0aC5wb3coKDEtZSkvKDErZSkscy8yKSxhKz1sPU1hdGguUEkvMi0yKk1hdGguYXRhbihyKmUpLWE7cmV0dXJuIG5ldyB2KGEqaSx0LngqaS9uKX19LHd0PXtfX3Byb3RvX186bnVsbCxMb25MYXQ6eXQsTWVyY2F0b3I6eHQsU3BoZXJpY2FsTWVyY2F0b3I6cnR9LFB0PWwoe30sc3Qse2NvZGU6IkVQU0c6MzM5NSIscHJvamVjdGlvbjp4dCx0cmFuc2Zvcm1hdGlvbjpodChidD0uNS8oTWF0aC5QSSp4dC5SKSwuNSwtYnQsLjUpfSksbGk9bCh7fSxzdCx7Y29kZToiRVBTRzo0MzI2Iixwcm9qZWN0aW9uOnl0LHRyYW5zZm9ybWF0aW9uOmh0KDEvMTgwLDEsLTEvMTgwLC41KX0pLEx0PWwoe30sb3Qse3Byb2plY3Rpb246eXQsdHJhbnNmb3JtYXRpb246aHQoMSwwLC0xLDApLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfSx6b29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLkxOMn0sZGlzdGFuY2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmxuZy10LmxuZyxlPWUubGF0LXQubGF0O3JldHVybiBNYXRoLnNxcnQoaSppK2UqZSl9LGluZmluaXRlOiEwfSksbz0ob3QuRWFydGg9c3Qsb3QuRVBTRzMzOTU9UHQsb3QuRVBTRzM4NTc9bHQsb3QuRVBTRzkwMDkxMz11dCxvdC5FUFNHNDMyNj1saSxvdC5TaW1wbGU9THQsaXQuZXh0ZW5kKHtvcHRpb25zOntwYW5lOiJvdmVybGF5UGFuZSIsYXR0cmlidXRpb246bnVsbCxidWJibGluZ01vdXNlRXZlbnRzOiEwfSxhZGRUbzpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRMYXllcih0aGlzKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVGcm9tKHRoaXMuX21hcHx8dGhpcy5fbWFwVG9BZGQpfSxyZW1vdmVGcm9tOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0LnJlbW92ZUxheWVyKHRoaXMpLHRoaXN9LGdldFBhbmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcC5nZXRQYW5lKHQ\/dGhpcy5vcHRpb25zW3RdfHx0OnRoaXMub3B0aW9ucy5wYW5lKX0sYWRkSW50ZXJhY3RpdmVUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcC5fdGFyZ2V0c1toKHQpXT10aGlzfSxyZW1vdmVJbnRlcmFjdGl2ZVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gZGVsZXRlIHRoaXMuX21hcC5fdGFyZ2V0c1toKHQpXSx0aGlzfSxnZXRBdHRyaWJ1dGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRpb259LF9sYXllckFkZDpmdW5jdGlvbih0KXt2YXIgZSxpPXQudGFyZ2V0O2kuaGFzTGF5ZXIodGhpcykmJih0aGlzLl9tYXA9aSx0aGlzLl96b29tQW5pbWF0ZWQ9aS5fem9vbUFuaW1hdGVkLHRoaXMuZ2V0RXZlbnRzJiYoZT10aGlzLmdldEV2ZW50cygpLGkub24oZSx0aGlzKSx0aGlzLm9uY2UoInJlbW92ZSIsZnVuY3Rpb24oKXtpLm9mZihlLHRoaXMpfSx0aGlzKSksdGhpcy5vbkFkZChpKSx0aGlzLmZpcmUoImFkZCIpLGkuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjp0aGlzfSkpfX0pKSx1aT0oQS5pbmNsdWRlKHthZGRMYXllcjpmdW5jdGlvbih0KXt2YXIgZTtpZih0Ll9sYXllckFkZClyZXR1cm4gZT1oKHQpLHRoaXMuX2xheWVyc1tlXXx8KCh0aGlzLl9sYXllcnNbZV09dCkuX21hcFRvQWRkPXRoaXMsdC5iZWZvcmVBZGQmJnQuYmVmb3JlQWRkKHRoaXMpLHRoaXMud2hlblJlYWR5KHQuX2xheWVyQWRkLHQpKSx0aGlzO3Rocm93IG5ldyBFcnJvcigiVGhlIHByb3ZpZGVkIG9iamVjdCBpcyBub3QgYSBMYXllci4iKX0scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdJiYodGhpcy5fbG9hZGVkJiZ0Lm9uUmVtb3ZlKHRoaXMpLGRlbGV0ZSB0aGlzLl9sYXllcnNbZV0sdGhpcy5fbG9hZGVkJiYodGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOnR9KSx0LmZpcmUoInJlbW92ZSIpKSx0Ll9tYXA9dC5fbWFwVG9BZGQ9bnVsbCksdGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGgodClpbiB0aGlzLl9sYXllcnN9LGVhY2hMYXllcjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiB0aGlzLl9sYXllcnMpdC5jYWxsKGUsdGhpcy5fbGF5ZXJzW2ldKTtyZXR1cm4gdGhpc30sX2FkZExheWVyczpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPSh0PXQ\/ZCh0KT90Olt0XTpbXSkubGVuZ3RoO2U8aTtlKyspdGhpcy5hZGRMYXllcih0W2VdKX0sX2FkZFpvb21MaW1pdDpmdW5jdGlvbih0KXtpc05hTih0Lm9wdGlvbnMubWF4Wm9vbSkmJmlzTmFOKHQub3B0aW9ucy5taW5ab29tKXx8KHRoaXMuX3pvb21Cb3VuZExheWVyc1toKHQpXT10LHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF9yZW1vdmVab29tTGltaXQ6ZnVuY3Rpb24odCl7dD1oKHQpO3RoaXMuX3pvb21Cb3VuZExheWVyc1t0XSYmKGRlbGV0ZSB0aGlzLl96b29tQm91bmRMYXllcnNbdF0sdGhpcy5fdXBkYXRlWm9vbUxldmVscygpKX0sX3VwZGF0ZVpvb21MZXZlbHM6ZnVuY3Rpb24oKXt2YXIgdCxlPTEvMCxpPS0xLzAsbj10aGlzLl9nZXRab29tU3BhbigpO2Zvcih0IGluIHRoaXMuX3pvb21Cb3VuZExheWVycyl2YXIgbz10aGlzLl96b29tQm91bmRMYXllcnNbdF0ub3B0aW9ucyxlPXZvaWQgMD09PW8ubWluWm9vbT9lOk1hdGgubWluKGUsby5taW5ab29tKSxpPXZvaWQgMD09PW8ubWF4Wm9vbT9pOk1hdGgubWF4KGksby5tYXhab29tKTt0aGlzLl9sYXllcnNNYXhab29tPWk9PT0tMS8wP3ZvaWQgMDppLHRoaXMuX2xheWVyc01pblpvb209ZT09PTEvMD92b2lkIDA6ZSxuIT09dGhpcy5fZ2V0Wm9vbVNwYW4oKSYmdGhpcy5maXJlKCJ6b29tbGV2ZWxzY2hhbmdlIiksdm9pZCAwPT09dGhpcy5vcHRpb25zLm1heFpvb20mJnRoaXMuX2xheWVyc01heFpvb20mJnRoaXMuZ2V0Wm9vbSgpPnRoaXMuX2xheWVyc01heFpvb20mJnRoaXMuc2V0Wm9vbSh0aGlzLl9sYXllcnNNYXhab29tKSx2b2lkIDA9PT10aGlzLm9wdGlvbnMubWluWm9vbSYmdGhpcy5fbGF5ZXJzTWluWm9vbSYmdGhpcy5nZXRab29tKCk8dGhpcy5fbGF5ZXJzTWluWm9vbSYmdGhpcy5zZXRab29tKHRoaXMuX2xheWVyc01pblpvb20pfX0pLG8uZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGksbjtpZihjKHRoaXMsZSksdGhpcy5fbGF5ZXJzPXt9LHQpZm9yKGk9MCxuPXQubGVuZ3RoO2k8bjtpKyspdGhpcy5hZGRMYXllcih0W2ldKX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9sYXllcnNbZV09dCx0aGlzLl9tYXAmJnRoaXMuX21hcC5hZGRMYXllcih0KSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt0PXQgaW4gdGhpcy5fbGF5ZXJzP3Q6dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9tYXAmJnRoaXMuX2xheWVyc1t0XSYmdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2xheWVyc1t0XSksZGVsZXRlIHRoaXMuX2xheWVyc1t0XSx0aGlzfSxoYXNMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5nZXRMYXllcklkKHQpKWluIHRoaXMuX2xheWVyc30sY2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIodGhpcy5yZW1vdmVMYXllcix0aGlzKX0saW52b2tlOmZ1bmN0aW9uKHQpe3ZhciBlLGksbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Zm9yKGUgaW4gdGhpcy5fbGF5ZXJzKShpPXRoaXMuX2xheWVyc1tlXSlbdF0mJmlbdF0uYXBwbHkoaSxuKTtyZXR1cm4gdGhpc30sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5lYWNoTGF5ZXIodC5hZGRMYXllcix0KX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5lYWNoTGF5ZXIodC5yZW1vdmVMYXllcix0KX0sZWFjaExheWVyOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIHRoaXMuX2xheWVycyl0LmNhbGwoZSx0aGlzLl9sYXllcnNbaV0pO3JldHVybiB0aGlzfSxnZXRMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGF5ZXJzW3RdfSxnZXRMYXllcnM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoTGF5ZXIodC5wdXNoLHQpLHR9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZva2UoInNldFpJbmRleCIsdCl9LGdldExheWVySWQ6aH0pKSxjaT11aS5leHRlbmQoe2FkZExheWVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhhc0xheWVyKHQpP3RoaXM6KHQuYWRkRXZlbnRQYXJlbnQodGhpcyksdWkucHJvdG90eXBlLmFkZExheWVyLmNhbGwodGhpcyx0KSx0aGlzLmZpcmUoImxheWVyYWRkIix7bGF5ZXI6dH0pKX0scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCk\/KCh0PXQgaW4gdGhpcy5fbGF5ZXJzP3RoaXMuX2xheWVyc1t0XTp0KS5yZW1vdmVFdmVudFBhcmVudCh0aGlzKSx1aS5wcm90b3R5cGUucmVtb3ZlTGF5ZXIuY2FsbCh0aGlzLHQpLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjp0fSkpOnRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludm9rZSgic2V0U3R5bGUiLHQpfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnZva2UoImJyaW5nVG9Gcm9udCIpfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZSgiYnJpbmdUb0JhY2siKX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgcztmb3IodCBpbiB0aGlzLl9sYXllcnMpe3ZhciBpPXRoaXMuX2xheWVyc1t0XTtlLmV4dGVuZChpLmdldEJvdW5kcz9pLmdldEJvdW5kcygpOmkuZ2V0TGF0TG5nKCkpfXJldHVybiBlfX0pLGRpPWV0LmV4dGVuZCh7b3B0aW9uczp7cG9wdXBBbmNob3I6WzAsMF0sdG9vbHRpcEFuY2hvcjpbMCwwXSxjcm9zc09yaWdpbjohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtjKHRoaXMsdCl9LGNyZWF0ZUljb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUljb24oImljb24iLHQpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUljb24oInNoYWRvdyIsdCl9LF9jcmVhdGVJY29uOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0SWNvblVybCh0KTtpZihpKXJldHVybiBpPXRoaXMuX2NyZWF0ZUltZyhpLGUmJiJJTUciPT09ZS50YWdOYW1lP2U6bnVsbCksdGhpcy5fc2V0SWNvblN0eWxlcyhpLHQpLCF0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4mJiIiIT09dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2lufHwoaS5jcm9zc09yaWdpbj0hMD09PXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbj8iIjp0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pLGk7aWYoImljb24iPT09dCl0aHJvdyBuZXcgRXJyb3IoImljb25Vcmwgbm90IHNldCBpbiBJY29uIG9wdGlvbnMgKHNlZSB0aGUgZG9jcykuIik7cmV0dXJuIG51bGx9LF9zZXRJY29uU3R5bGVzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5vcHRpb25zLG49aVtlKyJTaXplIl0sbj1tKG49Im51bWJlciI9PXR5cGVvZiBuP1tuLG5dOm4pLG89bSgic2hhZG93Ij09PWUmJmkuc2hhZG93QW5jaG9yfHxpLmljb25BbmNob3J8fG4mJm4uZGl2aWRlQnkoMiwhMCkpO3QuY2xhc3NOYW1lPSJsZWFmbGV0LW1hcmtlci0iK2UrIiAiKyhpLmNsYXNzTmFtZXx8IiIpLG8mJih0LnN0eWxlLm1hcmdpbkxlZnQ9LW8ueCsicHgiLHQuc3R5bGUubWFyZ2luVG9wPS1vLnkrInB4IiksbiYmKHQuc3R5bGUud2lkdGg9bi54KyJweCIsdC5zdHlsZS5oZWlnaHQ9bi55KyJweCIpfSxfY3JlYXRlSW1nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikpLnNyYz10LGV9LF9nZXRJY29uVXJsOmZ1bmN0aW9uKHQpe3JldHVybiBiLnJldGluYSYmdGhpcy5vcHRpb25zW3QrIlJldGluYVVybCJdfHx0aGlzLm9wdGlvbnNbdCsiVXJsIl19fSk7dmFyIF9pPWRpLmV4dGVuZCh7b3B0aW9uczp7aWNvblVybDoibWFya2VyLWljb24ucG5nIixpY29uUmV0aW5hVXJsOiJtYXJrZXItaWNvbi0yeC5wbmciLHNoYWRvd1VybDoibWFya2VyLXNoYWRvdy5wbmciLGljb25TaXplOlsyNSw0MV0saWNvbkFuY2hvcjpbMTIsNDFdLHBvcHVwQW5jaG9yOlsxLC0zNF0sdG9vbHRpcEFuY2hvcjpbMTYsLTI4XSxzaGFkb3dTaXplOls0MSw0MV19LF9nZXRJY29uVXJsOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgX2kuaW1hZ2VQYXRoJiYoX2kuaW1hZ2VQYXRoPXRoaXMuX2RldGVjdEljb25QYXRoKCkpLCh0aGlzLm9wdGlvbnMuaW1hZ2VQYXRofHxfaS5pbWFnZVBhdGgpK2RpLnByb3RvdHlwZS5fZ2V0SWNvblVybC5jYWxsKHRoaXMsdCl9LF9zdHJpcFVybDpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxpKXtyZXR1cm4oZT1lLmV4ZWModCkpJiZlW2ldfXJldHVybih0PWUodCwvXnVybFwoKFsnIl0pPyguKylcMVwpJC8sMikpJiZlKHQsL14oLiopbWFya2VyLWljb25cLnBuZyQvLDEpfSxfZGV0ZWN0SWNvblBhdGg6ZnVuY3Rpb24oKXt2YXIgdD1QKCJkaXYiLCJsZWFmbGV0LWRlZmF1bHQtaWNvbi1wYXRoIixkb2N1bWVudC5ib2R5KSxlPXBlKHQsImJhY2tncm91bmQtaW1hZ2UiKXx8cGUodCwiYmFja2dyb3VuZEltYWdlIik7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksKGU9dGhpcy5fc3RyaXBVcmwoZSkpP2U6KHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmJD0ibGVhZmxldC5jc3MiXScpKT90LmhyZWYuc3Vic3RyaW5nKDAsdC5ocmVmLmxlbmd0aC0ibGVhZmxldC5jc3MiLmxlbmd0aC0xKToiIn19KSxwaT1uLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLl9tYXJrZXI9dH0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXJrZXIuX2ljb247dGhpcy5fZHJhZ2dhYmxlfHwodGhpcy5fZHJhZ2dhYmxlPW5ldyBYZSh0LHQsITApKSx0aGlzLl9kcmFnZ2FibGUub24oe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxwcmVkcmFnOnRoaXMuX29uUHJlRHJhZyxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcykuZW5hYmxlKCksTSh0LCJsZWFmbGV0LW1hcmtlci1kcmFnZ2FibGUiKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt0aGlzLl9kcmFnZ2FibGUub2ZmKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQscHJlZHJhZzp0aGlzLl9vblByZURyYWcsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLmRpc2FibGUoKSx0aGlzLl9tYXJrZXIuX2ljb24mJnoodGhpcy5fbWFya2VyLl9pY29uLCJsZWFmbGV0LW1hcmtlci1kcmFnZ2FibGUiKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ2dhYmxlJiZ0aGlzLl9kcmFnZ2FibGUuX21vdmVkfSxfYWRqdXN0UGFuOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcmtlcixpPWUuX21hcCxuPXRoaXMuX21hcmtlci5vcHRpb25zLmF1dG9QYW5TcGVlZCxvPXRoaXMuX21hcmtlci5vcHRpb25zLmF1dG9QYW5QYWRkaW5nLHM9UGUoZS5faWNvbikscj1pLmdldFBpeGVsQm91bmRzKCksYT1pLmdldFBpeGVsT3JpZ2luKCksYT1fKHIubWluLl9zdWJ0cmFjdChhKS5hZGQobyksci5tYXguX3N1YnRyYWN0KGEpLnN1YnRyYWN0KG8pKTthLmNvbnRhaW5zKHMpfHwobz1tKChNYXRoLm1heChhLm1heC54LHMueCktYS5tYXgueCkvKHIubWF4LngtYS5tYXgueCktKE1hdGgubWluKGEubWluLngscy54KS1hLm1pbi54KS8oci5taW4ueC1hLm1pbi54KSwoTWF0aC5tYXgoYS5tYXgueSxzLnkpLWEubWF4LnkpLyhyLm1heC55LWEubWF4LnkpLShNYXRoLm1pbihhLm1pbi55LHMueSktYS5taW4ueSkvKHIubWluLnktYS5taW4ueSkpLm11bHRpcGx5QnkobiksaS5wYW5CeShvLHthbmltYXRlOiExfSksdGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MuX2FkZChvKSx0aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zLl9hZGQobyksWihlLl9pY29uLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zKSx0aGlzLl9vbkRyYWcodCksdGhpcy5fcGFuUmVxdWVzdD14KHRoaXMuX2FkanVzdFBhbi5iaW5kKHRoaXMsdCkpKX0sX29uRHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fb2xkTGF0TG5nPXRoaXMuX21hcmtlci5nZXRMYXRMbmcoKSx0aGlzLl9tYXJrZXIuY2xvc2VQb3B1cCYmdGhpcy5fbWFya2VyLmNsb3NlUG9wdXAoKSx0aGlzLl9tYXJrZXIuZmlyZSgibW92ZXN0YXJ0IikuZmlyZSgiZHJhZ3N0YXJ0Iil9LF9vblByZURyYWc6ZnVuY3Rpb24odCl7dGhpcy5fbWFya2VyLm9wdGlvbnMuYXV0b1BhbiYmKHIodGhpcy5fcGFuUmVxdWVzdCksdGhpcy5fcGFuUmVxdWVzdD14KHRoaXMuX2FkanVzdFBhbi5iaW5kKHRoaXMsdCkpKX0sX29uRHJhZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXJrZXIsaT1lLl9zaGFkb3csbj1QZShlLl9pY29uKSxvPWUuX21hcC5sYXllclBvaW50VG9MYXRMbmcobik7aSYmWihpLG4pLGUuX2xhdGxuZz1vLHQubGF0bG5nPW8sdC5vbGRMYXRMbmc9dGhpcy5fb2xkTGF0TG5nLGUuZmlyZSgibW92ZSIsdCkuZmlyZSgiZHJhZyIsdCl9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7cih0aGlzLl9wYW5SZXF1ZXN0KSxkZWxldGUgdGhpcy5fb2xkTGF0TG5nLHRoaXMuX21hcmtlci5maXJlKCJtb3ZlZW5kIikuZmlyZSgiZHJhZ2VuZCIsdCl9fSksbWk9by5leHRlbmQoe29wdGlvbnM6e2ljb246bmV3IF9pLGludGVyYWN0aXZlOiEwLGtleWJvYXJkOiEwLHRpdGxlOiIiLGFsdDoiTWFya2VyIix6SW5kZXhPZmZzZXQ6MCxvcGFjaXR5OjEscmlzZU9uSG92ZXI6ITEscmlzZU9mZnNldDoyNTAscGFuZToibWFya2VyUGFuZSIsc2hhZG93UGFuZToic2hhZG93UGFuZSIsYnViYmxpbmdNb3VzZUV2ZW50czohMSxhdXRvUGFuT25Gb2N1czohMCxkcmFnZ2FibGU6ITEsYXV0b1BhbjohMSxhdXRvUGFuUGFkZGluZzpbNTAsNTBdLGF1dG9QYW5TcGVlZDoxMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2ModGhpcyxlKSx0aGlzLl9sYXRsbmc9dyh0KX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fem9vbUFuaW1hdGVkPXRoaXMuX3pvb21BbmltYXRlZCYmdC5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb24sdGhpcy5fem9vbUFuaW1hdGVkJiZ0Lm9uKCJ6b29tYW5pbSIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyksdGhpcy5faW5pdEljb24oKSx0aGlzLnVwZGF0ZSgpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLmRyYWdnaW5nJiZ0aGlzLmRyYWdnaW5nLmVuYWJsZWQoKSYmKHRoaXMub3B0aW9ucy5kcmFnZ2FibGU9ITAsdGhpcy5kcmFnZ2luZy5yZW1vdmVIb29rcygpKSxkZWxldGUgdGhpcy5kcmFnZ2luZyx0aGlzLl96b29tQW5pbWF0ZWQmJnQub2ZmKCJ6b29tYW5pbSIsdGhpcy5fYW5pbWF0ZVpvb20sdGhpcyksdGhpcy5fcmVtb3ZlSWNvbigpLHRoaXMuX3JlbW92ZVNoYWRvdygpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXtyZXR1cm57em9vbTp0aGlzLnVwZGF0ZSx2aWV3cmVzZXQ6dGhpcy51cGRhdGV9fSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbGF0bG5nO3JldHVybiB0aGlzLl9sYXRsbmc9dyh0KSx0aGlzLnVwZGF0ZSgpLHRoaXMuZmlyZSgibW92ZSIse29sZExhdExuZzplLGxhdGxuZzp0aGlzLl9sYXRsbmd9KX0sc2V0WkluZGV4T2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4T2Zmc2V0PXQsdGhpcy51cGRhdGUoKX0sZ2V0SWNvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbn0sc2V0SWNvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb249dCx0aGlzLl9tYXAmJih0aGlzLl9pbml0SWNvbigpLHRoaXMudXBkYXRlKCkpLHRoaXMuX3BvcHVwJiZ0aGlzLmJpbmRQb3B1cCh0aGlzLl9wb3B1cCx0aGlzLl9wb3B1cC5vcHRpb25zKSx0aGlzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb259LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLl9pY29uJiZ0aGlzLl9tYXAmJih0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKS5yb3VuZCgpLHRoaXMuX3NldFBvcyh0KSksdGhpc30sX2luaXRJY29uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGU9ImxlYWZsZXQtem9vbS0iKyh0aGlzLl96b29tQW5pbWF0ZWQ\/ImFuaW1hdGVkIjoiaGlkZSIpLGk9dC5pY29uLmNyZWF0ZUljb24odGhpcy5faWNvbiksbj0hMSxpPShpIT09dGhpcy5faWNvbiYmKHRoaXMuX2ljb24mJnRoaXMuX3JlbW92ZUljb24oKSxuPSEwLHQudGl0bGUmJihpLnRpdGxlPXQudGl0bGUpLCJJTUciPT09aS50YWdOYW1lJiYoaS5hbHQ9dC5hbHR8fCIiKSksTShpLGUpLHQua2V5Ym9hcmQmJihpLnRhYkluZGV4PSIwIixpLnNldEF0dHJpYnV0ZSgicm9sZSIsImJ1dHRvbiIpKSx0aGlzLl9pY29uPWksdC5yaXNlT25Ib3ZlciYmdGhpcy5vbih7bW91c2VvdmVyOnRoaXMuX2JyaW5nVG9Gcm9udCxtb3VzZW91dDp0aGlzLl9yZXNldFpJbmRleH0pLHRoaXMub3B0aW9ucy5hdXRvUGFuT25Gb2N1cyYmUyhpLCJmb2N1cyIsdGhpcy5fcGFuT25Gb2N1cyx0aGlzKSx0Lmljb24uY3JlYXRlU2hhZG93KHRoaXMuX3NoYWRvdykpLG89ITE7aSE9PXRoaXMuX3NoYWRvdyYmKHRoaXMuX3JlbW92ZVNoYWRvdygpLG89ITApLGkmJihNKGksZSksaS5hbHQ9IiIpLHRoaXMuX3NoYWRvdz1pLHQub3BhY2l0eTwxJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksbiYmdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5faWNvbiksdGhpcy5faW5pdEludGVyYWN0aW9uKCksaSYmbyYmdGhpcy5nZXRQYW5lKHQuc2hhZG93UGFuZSkuYXBwZW5kQ2hpbGQodGhpcy5fc2hhZG93KX0sX3JlbW92ZUljb246ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMucmlzZU9uSG92ZXImJnRoaXMub2ZmKHttb3VzZW92ZXI6dGhpcy5fYnJpbmdUb0Zyb250LG1vdXNlb3V0OnRoaXMuX3Jlc2V0WkluZGV4fSksdGhpcy5vcHRpb25zLmF1dG9QYW5PbkZvY3VzJiZrKHRoaXMuX2ljb24sImZvY3VzIix0aGlzLl9wYW5PbkZvY3VzLHRoaXMpLFQodGhpcy5faWNvbiksdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pY29uKSx0aGlzLl9pY29uPW51bGx9LF9yZW1vdmVTaGFkb3c6ZnVuY3Rpb24oKXt0aGlzLl9zaGFkb3cmJlQodGhpcy5fc2hhZG93KSx0aGlzLl9zaGFkb3c9bnVsbH0sX3NldFBvczpmdW5jdGlvbih0KXt0aGlzLl9pY29uJiZaKHRoaXMuX2ljb24sdCksdGhpcy5fc2hhZG93JiZaKHRoaXMuX3NoYWRvdyx0KSx0aGlzLl96SW5kZXg9dC55K3RoaXMub3B0aW9ucy56SW5kZXhPZmZzZXQsdGhpcy5fcmVzZXRaSW5kZXgoKX0sX3VwZGF0ZVpJbmRleDpmdW5jdGlvbih0KXt0aGlzLl9pY29uJiYodGhpcy5faWNvbi5zdHlsZS56SW5kZXg9dGhpcy5fekluZGV4K3QpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dD10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKS5yb3VuZCgpO3RoaXMuX3NldFBvcyh0KX0sX2luaXRJbnRlcmFjdGlvbjpmdW5jdGlvbigpe3ZhciB0O3RoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmKE0odGhpcy5faWNvbiwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuYWRkSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faWNvbikscGkmJih0PXRoaXMub3B0aW9ucy5kcmFnZ2FibGUsdGhpcy5kcmFnZ2luZyYmKHQ9dGhpcy5kcmFnZ2luZy5lbmFibGVkKCksdGhpcy5kcmFnZ2luZy5kaXNhYmxlKCkpLHRoaXMuZHJhZ2dpbmc9bmV3IHBpKHRoaXMpLHQmJnRoaXMuZHJhZ2dpbmcuZW5hYmxlKCkpKX0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcGFjaXR5O3RoaXMuX2ljb24mJkModGhpcy5faWNvbix0KSx0aGlzLl9zaGFkb3cmJkModGhpcy5fc2hhZG93LHQpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWkluZGV4KHRoaXMub3B0aW9ucy5yaXNlT2Zmc2V0KX0sX3Jlc2V0WkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWkluZGV4KDApfSxfcGFuT25Gb2N1czpmdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLl9tYXA7aSYmKHQ9KGU9dGhpcy5vcHRpb25zLmljb24ub3B0aW9ucykuaWNvblNpemU\/bShlLmljb25TaXplKTptKDAsMCksZT1lLmljb25BbmNob3I\/bShlLmljb25BbmNob3IpOm0oMCwwKSxpLnBhbkluc2lkZSh0aGlzLl9sYXRsbmcse3BhZGRpbmdUb3BMZWZ0OmUscGFkZGluZ0JvdHRvbVJpZ2h0OnQuc3VidHJhY3QoZSl9KSl9LF9nZXRQb3B1cEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbi5vcHRpb25zLnBvcHVwQW5jaG9yfSxfZ2V0VG9vbHRpcEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuaWNvbi5vcHRpb25zLnRvb2x0aXBBbmNob3J9fSk7dmFyIGZpPW8uZXh0ZW5kKHtvcHRpb25zOntzdHJva2U6ITAsY29sb3I6IiMzMzg4ZmYiLHdlaWdodDozLG9wYWNpdHk6MSxsaW5lQ2FwOiJyb3VuZCIsbGluZUpvaW46InJvdW5kIixkYXNoQXJyYXk6bnVsbCxkYXNoT2Zmc2V0Om51bGwsZmlsbDohMSxmaWxsQ29sb3I6bnVsbCxmaWxsT3BhY2l0eTouMixmaWxsUnVsZToiZXZlbm9kZCIsaW50ZXJhY3RpdmU6ITAsYnViYmxpbmdNb3VzZUV2ZW50czohMH0sYmVmb3JlQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX3JlbmRlcmVyPXQuZ2V0UmVuZGVyZXIodGhpcyl9LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX2luaXRQYXRoKHRoaXMpLHRoaXMuX3Jlc2V0KCksdGhpcy5fcmVuZGVyZXIuX2FkZFBhdGgodGhpcyl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3JlbW92ZVBhdGgodGhpcyl9LHJlZHJhdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJnRoaXMuX3JlbmRlcmVyLl91cGRhdGVQYXRoKHRoaXMpLHRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHRoaXMsdCksdGhpcy5fcmVuZGVyZXImJih0aGlzLl9yZW5kZXJlci5fdXBkYXRlU3R5bGUodGhpcyksdGhpcy5vcHRpb25zLnN0cm9rZSYmdCYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIndlaWdodCIpJiZ0aGlzLl91cGRhdGVCb3VuZHMoKSksdGhpc30sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fYnJpbmdUb0Zyb250KHRoaXMpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fYnJpbmdUb0JhY2sodGhpcyksdGhpc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXRofSxfcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0KCksdGhpcy5fdXBkYXRlKCl9LF9jbGlja1RvbGVyYW5jZTpmdW5jdGlvbigpe3JldHVybih0aGlzLm9wdGlvbnMuc3Ryb2tlP3RoaXMub3B0aW9ucy53ZWlnaHQvMjowKSsodGhpcy5fcmVuZGVyZXIub3B0aW9ucy50b2xlcmFuY2V8fDApfX0pLGdpPWZpLmV4dGVuZCh7b3B0aW9uczp7ZmlsbDohMCxyYWRpdXM6MTB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtjKHRoaXMsZSksdGhpcy5fbGF0bG5nPXcodCksdGhpcy5fcmFkaXVzPXRoaXMub3B0aW9ucy5yYWRpdXN9LHNldExhdExuZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sYXRsbmc7cmV0dXJuIHRoaXMuX2xhdGxuZz13KHQpLHRoaXMucmVkcmF3KCksdGhpcy5maXJlKCJtb3ZlIix7b2xkTGF0TG5nOmUsbGF0bG5nOnRoaXMuX2xhdGxuZ30pfSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5yYWRpdXM9dGhpcy5fcmFkaXVzPXQsdGhpcy5yZWRyYXcoKX0sZ2V0UmFkaXVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGl1c30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5yYWRpdXN8fHRoaXMuX3JhZGl1cztyZXR1cm4gZmkucHJvdG90eXBlLnNldFN0eWxlLmNhbGwodGhpcyx0KSx0aGlzLnNldFJhZGl1cyhlKSx0aGlzfSxfcHJvamVjdDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSx0aGlzLl91cGRhdGVCb3VuZHMoKX0sX3VwZGF0ZUJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JhZGl1cyxlPXRoaXMuX3JhZGl1c1l8fHQsaT10aGlzLl9jbGlja1RvbGVyYW5jZSgpLHQ9W3QraSxlK2ldO3RoaXMuX3B4Qm91bmRzPW5ldyBmKHRoaXMuX3BvaW50LnN1YnRyYWN0KHQpLHRoaXMuX3BvaW50LmFkZCh0KSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZVBhdGgoKX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5fdXBkYXRlQ2lyY2xlKHRoaXMpfSxfZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaXVzJiYhdGhpcy5fcmVuZGVyZXIuX2JvdW5kcy5pbnRlcnNlY3RzKHRoaXMuX3B4Qm91bmRzKX0sX2NvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLl9wb2ludCk8PXRoaXMuX3JhZGl1cyt0aGlzLl9jbGlja1RvbGVyYW5jZSgpfX0pO3ZhciB2aT1naS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlLGkpe2lmKGModGhpcyxlPSJudW1iZXIiPT10eXBlb2YgZT9sKHt9LGkse3JhZGl1czplfSk6ZSksdGhpcy5fbGF0bG5nPXcodCksaXNOYU4odGhpcy5vcHRpb25zLnJhZGl1cykpdGhyb3cgbmV3IEVycm9yKCJDaXJjbGUgcmFkaXVzIGNhbm5vdCBiZSBOYU4iKTt0aGlzLl9tUmFkaXVzPXRoaXMub3B0aW9ucy5yYWRpdXN9LHNldFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbVJhZGl1cz10LHRoaXMucmVkcmF3KCl9LGdldFJhZGl1czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tUmFkaXVzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5fcmFkaXVzLHRoaXMuX3JhZGl1c1l8fHRoaXMuX3JhZGl1c107cmV0dXJuIG5ldyBzKHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcodGhpcy5fcG9pbnQuc3VidHJhY3QodCkpLHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcodGhpcy5fcG9pbnQuYWRkKHQpKSl9LHNldFN0eWxlOmZpLnByb3RvdHlwZS5zZXRTdHlsZSxfcHJvamVjdDpmdW5jdGlvbigpe3ZhciB0LGUsaSxuLG8scz10aGlzLl9sYXRsbmcubG5nLHI9dGhpcy5fbGF0bG5nLmxhdCxhPXRoaXMuX21hcCxoPWEub3B0aW9ucy5jcnM7aC5kaXN0YW5jZT09PXN0LmRpc3RhbmNlPyhuPU1hdGguUEkvMTgwLG89dGhpcy5fbVJhZGl1cy9zdC5SL24sdD1hLnByb2plY3QoW3IrbyxzXSksZT1hLnByb2plY3QoW3ItbyxzXSksZT10LmFkZChlKS5kaXZpZGVCeSgyKSxpPWEudW5wcm9qZWN0KGUpLmxhdCxuPU1hdGguYWNvcygoTWF0aC5jb3MobypuKS1NYXRoLnNpbihyKm4pKk1hdGguc2luKGkqbikpLyhNYXRoLmNvcyhyKm4pKk1hdGguY29zKGkqbikpKS9uLCFpc05hTihuKSYmMCE9PW58fChuPW8vTWF0aC5jb3MoTWF0aC5QSS8xODAqcikpLHRoaXMuX3BvaW50PWUuc3VidHJhY3QoYS5nZXRQaXhlbE9yaWdpbigpKSx0aGlzLl9yYWRpdXM9aXNOYU4obik\/MDplLngtYS5wcm9qZWN0KFtpLHMtbl0pLngsdGhpcy5fcmFkaXVzWT1lLnktdC55KToobz1oLnVucHJvamVjdChoLnByb2plY3QodGhpcy5fbGF0bG5nKS5zdWJ0cmFjdChbdGhpcy5fbVJhZGl1cywwXSkpLHRoaXMuX3BvaW50PWEubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksdGhpcy5fcmFkaXVzPXRoaXMuX3BvaW50LngtYS5sYXRMbmdUb0xheWVyUG9pbnQobykueCksdGhpcy5fdXBkYXRlQm91bmRzKCl9fSk7dmFyIHlpPWZpLmV4dGVuZCh7b3B0aW9uczp7c21vb3RoRmFjdG9yOjEsbm9DbGlwOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7Yyh0aGlzLGUpLHRoaXMuX3NldExhdExuZ3ModCl9LGdldExhdExuZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nc30sc2V0TGF0TG5nczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc2V0TGF0TG5ncyh0KSx0aGlzLnJlZHJhdygpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2xhdGxuZ3MubGVuZ3RofSxjbG9zZXN0TGF5ZXJQb2ludDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MS8wLGk9bnVsbCxuPXJpLG89MCxzPXRoaXMuX3BhcnRzLmxlbmd0aDtvPHM7bysrKWZvcih2YXIgcj10aGlzLl9wYXJ0c1tvXSxhPTEsaD1yLmxlbmd0aDthPGg7YSsrKXt2YXIgbCx1LGM9bih0LGw9clthLTFdLHU9clthXSwhMCk7YzxlJiYoZT1jLGk9bih0LGwsdSkpfXJldHVybiBpJiYoaS5kaXN0YW5jZT1NYXRoLnNxcnQoZSkpLGl9LGdldENlbnRlcjpmdW5jdGlvbigpe2lmKHRoaXMuX21hcClyZXR1cm4gaGkodGhpcy5fZGVmYXVsdFNoYXBlKCksdGhpcy5fbWFwLm9wdGlvbnMuY3JzKTt0aHJvdyBuZXcgRXJyb3IoIk11c3QgYWRkIGxheWVyIHRvIG1hcCBiZWZvcmUgdXNpbmcgZ2V0Q2VudGVyKCkiKX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sYWRkTGF0TG5nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ZXx8dGhpcy5fZGVmYXVsdFNoYXBlKCksdD13KHQpLGUucHVzaCh0KSx0aGlzLl9ib3VuZHMuZXh0ZW5kKHQpLHRoaXMucmVkcmF3KCl9LF9zZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3RoaXMuX2JvdW5kcz1uZXcgcyx0aGlzLl9sYXRsbmdzPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHQpfSxfZGVmYXVsdFNoYXBlOmZ1bmN0aW9uKCl7cmV0dXJuIEkodGhpcy5fbGF0bG5ncyk\/dGhpcy5fbGF0bG5nczp0aGlzLl9sYXRsbmdzWzBdfSxfY29udmVydExhdExuZ3M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9SSh0KSxuPTAsbz10Lmxlbmd0aDtuPG87bisrKWk\/KGVbbl09dyh0W25dKSx0aGlzLl9ib3VuZHMuZXh0ZW5kKGVbbl0pKTplW25dPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHRbbl0pO3JldHVybiBlfSxfcHJvamVjdDpmdW5jdGlvbigpe3ZhciB0PW5ldyBmO3RoaXMuX3JpbmdzPVtdLHRoaXMuX3Byb2plY3RMYXRsbmdzKHRoaXMuX2xhdGxuZ3MsdGhpcy5fcmluZ3MsdCksdGhpcy5fYm91bmRzLmlzVmFsaWQoKSYmdC5pc1ZhbGlkKCkmJih0aGlzLl9yYXdQeEJvdW5kcz10LHRoaXMuX3VwZGF0ZUJvdW5kcygpKX0sX3VwZGF0ZUJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NsaWNrVG9sZXJhbmNlKCksdD1uZXcgcCh0LHQpO3RoaXMuX3Jhd1B4Qm91bmRzJiYodGhpcy5fcHhCb3VuZHM9bmV3IGYoW3RoaXMuX3Jhd1B4Qm91bmRzLm1pbi5zdWJ0cmFjdCh0KSx0aGlzLl9yYXdQeEJvdW5kcy5tYXguYWRkKHQpXSkpfSxfcHJvamVjdExhdGxuZ3M6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLG8scz10WzBdaW5zdGFuY2VvZiB2LHI9dC5sZW5ndGg7aWYocyl7Zm9yKG89W10sbj0wO248cjtuKyspb1tuXT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRbbl0pLGkuZXh0ZW5kKG9bbl0pO2UucHVzaChvKX1lbHNlIGZvcihuPTA7bjxyO24rKyl0aGlzLl9wcm9qZWN0TGF0bG5ncyh0W25dLGUsaSl9LF9jbGlwUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVuZGVyZXIuX2JvdW5kcztpZih0aGlzLl9wYXJ0cz1bXSx0aGlzLl9weEJvdW5kcyYmdGhpcy5fcHhCb3VuZHMuaW50ZXJzZWN0cyh0KSlpZih0aGlzLm9wdGlvbnMubm9DbGlwKXRoaXMuX3BhcnRzPXRoaXMuX3JpbmdzO2Vsc2UgZm9yKHZhciBlLGksbixvLHM9dGhpcy5fcGFydHMscj0wLGE9MCxoPXRoaXMuX3JpbmdzLmxlbmd0aDtyPGg7cisrKWZvcihlPTAsaT0obz10aGlzLl9yaW5nc1tyXSkubGVuZ3RoO2U8aS0xO2UrKykobj1uaShvW2VdLG9bZSsxXSx0LGUsITApKSYmKHNbYV09c1thXXx8W10sc1thXS5wdXNoKG5bMF0pLG5bMV09PT1vW2UrMV0mJmUhPT1pLTJ8fChzW2FdLnB1c2goblsxXSksYSsrKSl9LF9zaW1wbGlmeVBvaW50czpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9wYXJ0cyxlPXRoaXMub3B0aW9ucy5zbW9vdGhGYWN0b3IsaT0wLG49dC5sZW5ndGg7aTxuO2krKyl0W2ldPWVpKHRbaV0sZSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jbGlwUG9pbnRzKCksdGhpcy5fc2ltcGxpZnlQb2ludHMoKSx0aGlzLl91cGRhdGVQYXRoKCkpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl91cGRhdGVQb2x5KHRoaXMpfSxfY29udGFpbnNQb2ludDpmdW5jdGlvbih0LGUpe3ZhciBpLG4sbyxzLHIsYSxoPXRoaXMuX2NsaWNrVG9sZXJhbmNlKCk7aWYodGhpcy5fcHhCb3VuZHMmJnRoaXMuX3B4Qm91bmRzLmNvbnRhaW5zKHQpKWZvcihpPTAscz10aGlzLl9wYXJ0cy5sZW5ndGg7aTxzO2krKylmb3Iobj0wLG89KHI9KGE9dGhpcy5fcGFydHNbaV0pLmxlbmd0aCktMTtuPHI7bz1uKyspaWYoKGV8fDAhPT1uKSYmaWkodCxhW29dLGFbbl0pPD1oKXJldHVybiEwO3JldHVybiExfX0pO3lpLl9mbGF0PWFpO3ZhciB4aT15aS5leHRlbmQoe29wdGlvbnM6e2ZpbGw6ITB9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fbGF0bG5ncy5sZW5ndGh8fCF0aGlzLl9sYXRsbmdzWzBdLmxlbmd0aH0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXJldHVybiAkZSh0aGlzLl9kZWZhdWx0U2hhcGUoKSx0aGlzLl9tYXAub3B0aW9ucy5jcnMpO3Rocm93IG5ldyBFcnJvcigiTXVzdCBhZGQgbGF5ZXIgdG8gbWFwIGJlZm9yZSB1c2luZyBnZXRDZW50ZXIoKSIpfSxfY29udmVydExhdExuZ3M6ZnVuY3Rpb24odCl7dmFyIHQ9eWkucHJvdG90eXBlLl9jb252ZXJ0TGF0TG5ncy5jYWxsKHRoaXMsdCksZT10Lmxlbmd0aDtyZXR1cm4gMjw9ZSYmdFswXWluc3RhbmNlb2YgdiYmdFswXS5lcXVhbHModFtlLTFdKSYmdC5wb3AoKSx0fSxfc2V0TGF0TG5nczpmdW5jdGlvbih0KXt5aS5wcm90b3R5cGUuX3NldExhdExuZ3MuY2FsbCh0aGlzLHQpLEkodGhpcy5fbGF0bG5ncykmJih0aGlzLl9sYXRsbmdzPVt0aGlzLl9sYXRsbmdzXSl9LF9kZWZhdWx0U2hhcGU6ZnVuY3Rpb24oKXtyZXR1cm4oSSh0aGlzLl9sYXRsbmdzWzBdKT90aGlzLl9sYXRsbmdzOnRoaXMuX2xhdGxuZ3NbMF0pWzBdfSxfY2xpcFBvaW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlbmRlcmVyLl9ib3VuZHMsZT10aGlzLm9wdGlvbnMud2VpZ2h0LGU9bmV3IHAoZSxlKSx0PW5ldyBmKHQubWluLnN1YnRyYWN0KGUpLHQubWF4LmFkZChlKSk7aWYodGhpcy5fcGFydHM9W10sdGhpcy5fcHhCb3VuZHMmJnRoaXMuX3B4Qm91bmRzLmludGVyc2VjdHModCkpaWYodGhpcy5vcHRpb25zLm5vQ2xpcCl0aGlzLl9wYXJ0cz10aGlzLl9yaW5ncztlbHNlIGZvcih2YXIgaSxuPTAsbz10aGlzLl9yaW5ncy5sZW5ndGg7bjxvO24rKykoaT1KZSh0aGlzLl9yaW5nc1tuXSx0LCEwKSkubGVuZ3RoJiZ0aGlzLl9wYXJ0cy5wdXNoKGkpfSxfdXBkYXRlUGF0aDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl91cGRhdGVQb2x5KHRoaXMsITApfSxfY29udGFpbnNQb2ludDpmdW5jdGlvbih0KXt2YXIgZSxpLG4sbyxzLHIsYSxoLGw9ITE7aWYoIXRoaXMuX3B4Qm91bmRzfHwhdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKG89MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDtvPGE7bysrKWZvcihzPTAscj0oaD0oZT10aGlzLl9wYXJ0c1tvXSkubGVuZ3RoKS0xO3M8aDtyPXMrKylpPWVbc10sbj1lW3JdLGkueT50LnkhPW4ueT50LnkmJnQueDwobi54LWkueCkqKHQueS1pLnkpLyhuLnktaS55KStpLngmJihsPSFsKTtyZXR1cm4gbHx8eWkucHJvdG90eXBlLl9jb250YWluc1BvaW50LmNhbGwodGhpcyx0LCEwKX19KTt2YXIgd2k9Y2kuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7Yyh0aGlzLGUpLHRoaXMuX2xheWVycz17fSx0JiZ0aGlzLmFkZERhdGEodCl9LGFkZERhdGE6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLG89ZCh0KT90OnQuZmVhdHVyZXM7aWYobyl7Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspKChuPW9bZV0pLmdlb21ldHJpZXN8fG4uZ2VvbWV0cnl8fG4uZmVhdHVyZXN8fG4uY29vcmRpbmF0ZXMpJiZ0aGlzLmFkZERhdGEobik7cmV0dXJuIHRoaXN9dmFyIHMscj10aGlzLm9wdGlvbnM7cmV0dXJuKCFyLmZpbHRlcnx8ci5maWx0ZXIodCkpJiYocz1iaSh0LHIpKT8ocy5mZWF0dXJlPVppKHQpLHMuZGVmYXVsdE9wdGlvbnM9cy5vcHRpb25zLHRoaXMucmVzZXRTdHlsZShzKSxyLm9uRWFjaEZlYXR1cmUmJnIub25FYWNoRmVhdHVyZSh0LHMpLHRoaXMuYWRkTGF5ZXIocykpOnRoaXN9LHJlc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ\/dGhpcy5lYWNoTGF5ZXIodGhpcy5yZXNldFN0eWxlLHRoaXMpOih0Lm9wdGlvbnM9bCh7fSx0LmRlZmF1bHRPcHRpb25zKSx0aGlzLl9zZXRMYXllclN0eWxlKHQsdGhpcy5vcHRpb25zLnN0eWxlKSx0aGlzKX0sc2V0U3R5bGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKHQpe3RoaXMuX3NldExheWVyU3R5bGUodCxlKX0sdGhpcyl9LF9zZXRMYXllclN0eWxlOmZ1bmN0aW9uKHQsZSl7dC5zZXRTdHlsZSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1lKHQuZmVhdHVyZSkpLHQuc2V0U3R5bGUoZSkpfX0pO2Z1bmN0aW9uIGJpKHQsZSl7dmFyIGksbixvLHMscj0iRmVhdHVyZSI9PT10LnR5cGU\/dC5nZW9tZXRyeTp0LGE9cj9yLmNvb3JkaW5hdGVzOm51bGwsaD1bXSxsPWUmJmUucG9pbnRUb0xheWVyLHU9ZSYmZS5jb29yZHNUb0xhdExuZ3x8TGk7aWYoIWEmJiFyKXJldHVybiBudWxsO3N3aXRjaChyLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiBQaShsLHQsaT11KGEpLGUpO2Nhc2UiTXVsdGlQb2ludCI6Zm9yKG89MCxzPWEubGVuZ3RoO288cztvKyspaT11KGFbb10pLGgucHVzaChQaShsLHQsaSxlKSk7cmV0dXJuIG5ldyBjaShoKTtjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpyZXR1cm4gbj1UaShhLCJMaW5lU3RyaW5nIj09PXIudHlwZT8wOjEsdSksbmV3IHlpKG4sZSk7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIG49VGkoYSwiUG9seWdvbiI9PT1yLnR5cGU\/MToyLHUpLG5ldyB4aShuLGUpO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpmb3Iobz0wLHM9ci5nZW9tZXRyaWVzLmxlbmd0aDtvPHM7bysrKXt2YXIgYz1iaSh7Z2VvbWV0cnk6ci5nZW9tZXRyaWVzW29dLHR5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6dC5wcm9wZXJ0aWVzfSxlKTtjJiZoLnB1c2goYyl9cmV0dXJuIG5ldyBjaShoKTtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpmb3Iobz0wLHM9ci5mZWF0dXJlcy5sZW5ndGg7bzxzO28rKyl7dmFyIGQ9Ymkoci5mZWF0dXJlc1tvXSxlKTtkJiZoLnB1c2goZCl9cmV0dXJuIG5ldyBjaShoKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBHZW9KU09OIG9iamVjdC4iKX19ZnVuY3Rpb24gUGkodCxlLGksbil7cmV0dXJuIHQ\/dChlLGkpOm5ldyBtaShpLG4mJm4ubWFya2Vyc0luaGVyaXRPcHRpb25zJiZuKX1mdW5jdGlvbiBMaSh0KXtyZXR1cm4gbmV3IHYodFsxXSx0WzBdLHRbMl0pfWZ1bmN0aW9uIFRpKHQsZSxpKXtmb3IodmFyIG4sbz1bXSxzPTAscj10Lmxlbmd0aDtzPHI7cysrKW49ZT9UaSh0W3NdLGUtMSxpKTooaXx8TGkpKHRbc10pLG8ucHVzaChuKTtyZXR1cm4gb31mdW5jdGlvbiBNaSh0LGUpe3JldHVybiB2b2lkIDAhPT0odD13KHQpKS5hbHQ\/W2kodC5sbmcsZSksaSh0LmxhdCxlKSxpKHQuYWx0LGUpXTpbaSh0LmxuZyxlKSxpKHQubGF0LGUpXX1mdW5jdGlvbiB6aSh0LGUsaSxuKXtmb3IodmFyIG89W10scz0wLHI9dC5sZW5ndGg7czxyO3MrKylvLnB1c2goZT96aSh0W3NdLEkodFtzXSk\/MDplLTEsaSxuKTpNaSh0W3NdLG4pKTtyZXR1cm4hZSYmaSYmMDxvLmxlbmd0aCYmby5wdXNoKG9bMF0uc2xpY2UoKSksb31mdW5jdGlvbiBDaSh0LGUpe3JldHVybiB0LmZlYXR1cmU\/bCh7fSx0LmZlYXR1cmUse2dlb21ldHJ5OmV9KTpaaShlKX1mdW5jdGlvbiBaaSh0KXtyZXR1cm4iRmVhdHVyZSI9PT10LnR5cGV8fCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGU\/dDp7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7fSxnZW9tZXRyeTp0fX1UdD17dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiBDaSh0aGlzLHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6TWkodGhpcy5nZXRMYXRMbmcoKSx0KX0pfX07ZnVuY3Rpb24gU2kodCxlKXtyZXR1cm4gbmV3IHdpKHQsZSl9bWkuaW5jbHVkZShUdCksdmkuaW5jbHVkZShUdCksZ2kuaW5jbHVkZShUdCkseWkuaW5jbHVkZSh7dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3ZhciBlPSFJKHRoaXMuX2xhdGxuZ3MpO3JldHVybiBDaSh0aGlzLHt0eXBlOihlPyJNdWx0aSI6IiIpKyJMaW5lU3RyaW5nIixjb29yZGluYXRlczp6aSh0aGlzLl9sYXRsbmdzLGU\/MTowLCExLHQpfSl9fSkseGkuaW5jbHVkZSh7dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3ZhciBlPSFJKHRoaXMuX2xhdGxuZ3MpLGk9ZSYmIUkodGhpcy5fbGF0bG5nc1swXSksdD16aSh0aGlzLl9sYXRsbmdzLGk\/MjplPzE6MCwhMCx0KTtyZXR1cm4gQ2kodGhpcyx7dHlwZTooaT8iTXVsdGkiOiIiKSsiUG9seWdvbiIsY29vcmRpbmF0ZXM6dD1lP3Q6W3RdfSl9fSksdWkuaW5jbHVkZSh7dG9NdWx0aVBvaW50OmZ1bmN0aW9uKGUpe3ZhciBpPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXtpLnB1c2godC50b0dlb0pTT04oZSkuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpfSksQ2kodGhpcyx7dHlwZToiTXVsdGlQb2ludCIsY29vcmRpbmF0ZXM6aX0pfSx0b0dlb0pTT046ZnVuY3Rpb24oZSl7dmFyIGksbix0PXRoaXMuZmVhdHVyZSYmdGhpcy5mZWF0dXJlLmdlb21ldHJ5JiZ0aGlzLmZlYXR1cmUuZ2VvbWV0cnkudHlwZTtyZXR1cm4iTXVsdGlQb2ludCI9PT10P3RoaXMudG9NdWx0aVBvaW50KGUpOihpPSJHZW9tZXRyeUNvbGxlY3Rpb24iPT09dCxuPVtdLHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKHQpe3QudG9HZW9KU09OJiYodD10LnRvR2VvSlNPTihlKSxpP24ucHVzaCh0Lmdlb21ldHJ5KToiRmVhdHVyZUNvbGxlY3Rpb24iPT09KHQ9WmkodCkpLnR5cGU\/bi5wdXNoLmFwcGx5KG4sdC5mZWF0dXJlcyk6bi5wdXNoKHQpKX0pLGk\/Q2kodGhpcyx7Z2VvbWV0cmllczpuLHR5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiJ9KTp7dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOm59KX19KTt2YXIgTXQ9U2ksRWk9by5leHRlbmQoe29wdGlvbnM6e29wYWNpdHk6MSxhbHQ6IiIsaW50ZXJhY3RpdmU6ITEsY3Jvc3NPcmlnaW46ITEsZXJyb3JPdmVybGF5VXJsOiIiLHpJbmRleDoxLGNsYXNzTmFtZToiIn0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5fdXJsPXQsdGhpcy5fYm91bmRzPWcoZSksYyh0aGlzLGkpfSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX2ltYWdlfHwodGhpcy5faW5pdEltYWdlKCksdGhpcy5vcHRpb25zLm9wYWNpdHk8MSYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpKSx0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUmJihNKHRoaXMuX2ltYWdlLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pbWFnZSkpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2ltYWdlKSx0aGlzLl9yZXNldCgpfSxvblJlbW92ZTpmdW5jdGlvbigpe1QodGhpcy5faW1hZ2UpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pbWFnZSl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5faW1hZ2UmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGFjaXR5JiZ0aGlzLnNldE9wYWNpdHkodC5vcGFjaXR5KSx0aGlzfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZmZSh0aGlzLl9pbWFnZSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZnZSh0aGlzLl9pbWFnZSksdGhpc30sc2V0VXJsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91cmw9dCx0aGlzLl9pbWFnZSYmKHRoaXMuX2ltYWdlLnNyYz10KSx0aGlzfSxzZXRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JvdW5kcz1nKHQpLHRoaXMuX21hcCYmdGhpcy5fcmVzZXQoKSx0aGlzfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17em9vbTp0aGlzLl9yZXNldCx2aWV3cmVzZXQ6dGhpcy5fcmVzZXR9O3JldHVybiB0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX2FuaW1hdGVab29tKSx0fSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy56SW5kZXg9dCx0aGlzLl91cGRhdGVaSW5kZXgoKSx0aGlzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ltYWdlfSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9IklNRyI9PT10aGlzLl91cmwudGFnTmFtZSxlPXRoaXMuX2ltYWdlPXQ\/dGhpcy5fdXJsOlAoImltZyIpO00oZSwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX3pvb21BbmltYXRlZCYmTShlLCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lJiZNKGUsdGhpcy5vcHRpb25zLmNsYXNzTmFtZSksZS5vbnNlbGVjdHN0YXJ0PXUsZS5vbm1vdXNlbW92ZT11LGUub25sb2FkPWEodGhpcy5maXJlLHRoaXMsImxvYWQiKSxlLm9uZXJyb3I9YSh0aGlzLl9vdmVybGF5T25FcnJvcix0aGlzLCJlcnJvciIpLCF0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4mJiIiIT09dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2lufHwoZS5jcm9zc09yaWdpbj0hMD09PXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbj8iIjp0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pLHRoaXMub3B0aW9ucy56SW5kZXgmJnRoaXMuX3VwZGF0ZVpJbmRleCgpLHQ\/dGhpcy5fdXJsPWUuc3JjOihlLnNyYz10aGlzLl91cmwsZS5hbHQ9dGhpcy5vcHRpb25zLmFsdCl9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKHQuem9vbSksdD10aGlzLl9tYXAuX2xhdExuZ0JvdW5kc1RvTmV3TGF5ZXJCb3VuZHModGhpcy5fYm91bmRzLHQuem9vbSx0LmNlbnRlcikubWluO2JlKHRoaXMuX2ltYWdlLHQsZSl9LF9yZXNldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ltYWdlLGU9bmV3IGYodGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9ib3VuZHMuZ2V0Tm9ydGhXZXN0KCkpLHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldFNvdXRoRWFzdCgpKSksaT1lLmdldFNpemUoKTtaKHQsZS5taW4pLHQuc3R5bGUud2lkdGg9aS54KyJweCIsdC5zdHlsZS5oZWlnaHQ9aS55KyJweCJ9LF91cGRhdGVPcGFjaXR5OmZ1bmN0aW9uKCl7Qyh0aGlzLl9pbWFnZSx0aGlzLm9wdGlvbnMub3BhY2l0eSl9LF91cGRhdGVaSW5kZXg6ZnVuY3Rpb24oKXt0aGlzLl9pbWFnZSYmdm9pZCAwIT09dGhpcy5vcHRpb25zLnpJbmRleCYmbnVsbCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJih0aGlzLl9pbWFnZS5zdHlsZS56SW5kZXg9dGhpcy5vcHRpb25zLnpJbmRleCl9LF9vdmVybGF5T25FcnJvcjpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZXJyb3IiKTt2YXIgdD10aGlzLm9wdGlvbnMuZXJyb3JPdmVybGF5VXJsO3QmJnRoaXMuX3VybCE9PXQmJih0aGlzLl91cmw9dCx0aGlzLl9pbWFnZS5zcmM9dCl9LGdldENlbnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZHMuZ2V0Q2VudGVyKCl9fSksa2k9RWkuZXh0ZW5kKHtvcHRpb25zOnthdXRvcGxheTohMCxsb29wOiEwLGtlZXBBc3BlY3RSYXRpbzohMCxtdXRlZDohMSxwbGF5c0lubGluZTohMH0sX2luaXRJbWFnZTpmdW5jdGlvbigpe3ZhciB0PSJWSURFTyI9PT10aGlzLl91cmwudGFnTmFtZSxlPXRoaXMuX2ltYWdlPXQ\/dGhpcy5fdXJsOlAoInZpZGVvIik7aWYoTShlLCJsZWFmbGV0LWltYWdlLWxheWVyIiksdGhpcy5fem9vbUFuaW1hdGVkJiZNKGUsImxlYWZsZXQtem9vbS1hbmltYXRlZCIpLHRoaXMub3B0aW9ucy5jbGFzc05hbWUmJk0oZSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lKSxlLm9uc2VsZWN0c3RhcnQ9dSxlLm9ubW91c2Vtb3ZlPXUsZS5vbmxvYWRlZGRhdGE9YSh0aGlzLmZpcmUsdGhpcywibG9hZCIpLHQpe2Zvcih2YXIgaT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKSxuPVtdLG89MDtvPGkubGVuZ3RoO28rKyluLnB1c2goaVtvXS5zcmMpO3RoaXMuX3VybD0wPGkubGVuZ3RoP246W2Uuc3JjXX1lbHNle2QodGhpcy5fdXJsKXx8KHRoaXMuX3VybD1bdGhpcy5fdXJsXSksIXRoaXMub3B0aW9ucy5rZWVwQXNwZWN0UmF0aW8mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLnN0eWxlLCJvYmplY3RGaXQiKSYmKGUuc3R5bGUub2JqZWN0Rml0PSJmaWxsIiksZS5hdXRvcGxheT0hIXRoaXMub3B0aW9ucy5hdXRvcGxheSxlLmxvb3A9ISF0aGlzLm9wdGlvbnMubG9vcCxlLm11dGVkPSEhdGhpcy5vcHRpb25zLm11dGVkLGUucGxheXNJbmxpbmU9ISF0aGlzLm9wdGlvbnMucGxheXNJbmxpbmU7Zm9yKHZhciBzPTA7czx0aGlzLl91cmwubGVuZ3RoO3MrKyl7dmFyIHI9UCgic291cmNlIik7ci5zcmM9dGhpcy5fdXJsW3NdLGUuYXBwZW5kQ2hpbGQocil9fX19KTt2YXIgT2k9RWkuZXh0ZW5kKHtfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW1hZ2U9dGhpcy5fdXJsO00odCwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX3pvb21BbmltYXRlZCYmTSh0LCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lJiZNKHQsdGhpcy5vcHRpb25zLmNsYXNzTmFtZSksdC5vbnNlbGVjdHN0YXJ0PXUsdC5vbm1vdXNlbW92ZT11fX0pO3ZhciBBaT1vLmV4dGVuZCh7b3B0aW9uczp7aW50ZXJhY3RpdmU6ITEsb2Zmc2V0OlswLDBdLGNsYXNzTmFtZToiIixwYW5lOnZvaWQgMCxjb250ZW50OiIifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7dCYmKHQgaW5zdGFuY2VvZiB2fHxkKHQpKT8odGhpcy5fbGF0bG5nPXcodCksYyh0aGlzLGUpKTooYyh0aGlzLHQpLHRoaXMuX3NvdXJjZT1lKSx0aGlzLm9wdGlvbnMuY29udGVudCYmKHRoaXMuX2NvbnRlbnQ9dGhpcy5vcHRpb25zLmNvbnRlbnQpfSxvcGVuT246ZnVuY3Rpb24odCl7cmV0dXJuKHQ9YXJndW1lbnRzLmxlbmd0aD90OnRoaXMuX3NvdXJjZS5fbWFwKS5oYXNMYXllcih0aGlzKXx8dC5hZGRMYXllcih0aGlzKSx0aGlzfSxjbG9zZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJnRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzKSx0aGlzfSx0b2dnbGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21hcD90aGlzLmNsb3NlKCk6KGFyZ3VtZW50cy5sZW5ndGg\/dGhpcy5fc291cmNlPXQ6dD10aGlzLl9zb3VyY2UsdGhpcy5fcHJlcGFyZU9wZW4oKSx0aGlzLm9wZW5Pbih0Ll9tYXApKSx0aGlzfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl96b29tQW5pbWF0ZWQ9dC5fem9vbUFuaW1hdGVkLHRoaXMuX2NvbnRhaW5lcnx8dGhpcy5faW5pdExheW91dCgpLHQuX2ZhZGVBbmltYXRlZCYmQyh0aGlzLl9jb250YWluZXIsMCksY2xlYXJUaW1lb3V0KHRoaXMuX3JlbW92ZVRpbWVvdXQpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy51cGRhdGUoKSx0Ll9mYWRlQW5pbWF0ZWQmJkModGhpcy5fY29udGFpbmVyLDEpLHRoaXMuYnJpbmdUb0Zyb250KCksdGhpcy5vcHRpb25zLmludGVyYWN0aXZlJiYoTSh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2NvbnRhaW5lcikpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Ll9mYWRlQW5pbWF0ZWQ\/KEModGhpcy5fY29udGFpbmVyLDApLHRoaXMuX3JlbW92ZVRpbWVvdXQ9c2V0VGltZW91dChhKFQsdm9pZCAwLHRoaXMuX2NvbnRhaW5lciksMjAwKSk6VCh0aGlzLl9jb250YWluZXIpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmKHoodGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9jb250YWluZXIpKX0sZ2V0TGF0TG5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ30sc2V0TGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXRsbmc9dyh0KSx0aGlzLl9tYXAmJih0aGlzLl91cGRhdGVQb3NpdGlvbigpLHRoaXMuX2FkanVzdFBhbigpKSx0aGlzfSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9LHNldENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl91cGRhdGVDb250ZW50KCksdGhpcy5fdXBkYXRlTGF5b3V0KCksdGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT0iIix0aGlzLl9hZGp1c3RQYW4oKSl9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt6b29tOnRoaXMuX3VwZGF0ZVBvc2l0aW9uLHZpZXdyZXNldDp0aGlzLl91cGRhdGVQb3NpdGlvbn07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fbWFwJiZ0aGlzLl9tYXAuaGFzTGF5ZXIodGhpcyl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJmZlKHRoaXMuX2NvbnRhaW5lciksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZnZSh0aGlzLl9jb250YWluZXIpLHRoaXN9LF9wcmVwYXJlT3BlbjpmdW5jdGlvbih0KXtpZighKGk9dGhpcy5fc291cmNlKS5fbWFwKXJldHVybiExO2lmKGkgaW5zdGFuY2VvZiBjaSl7dmFyIGUsaT1udWxsLG49dGhpcy5fc291cmNlLl9sYXllcnM7Zm9yKGUgaW4gbilpZihuW2VdLl9tYXApe2k9bltlXTticmVha31pZighaSlyZXR1cm4hMTt0aGlzLl9zb3VyY2U9aX1pZighdClpZihpLmdldENlbnRlcil0PWkuZ2V0Q2VudGVyKCk7ZWxzZSBpZihpLmdldExhdExuZyl0PWkuZ2V0TGF0TG5nKCk7ZWxzZXtpZighaS5nZXRCb3VuZHMpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZ2V0IHNvdXJjZSBsYXllciBMYXRMbmcuIik7dD1pLmdldEJvdW5kcygpLmdldENlbnRlcigpfXJldHVybiB0aGlzLnNldExhdExuZyh0KSx0aGlzLl9tYXAmJnRoaXMudXBkYXRlKCksITB9LF91cGRhdGVDb250ZW50OmZ1bmN0aW9uKCl7aWYodGhpcy5fY29udGVudCl7dmFyIHQ9dGhpcy5fY29udGVudE5vZGUsZT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fY29udGVudD90aGlzLl9jb250ZW50KHRoaXMuX3NvdXJjZXx8dGhpcyk6dGhpcy5fY29udGVudDtpZigic3RyaW5nIj09dHlwZW9mIGUpdC5pbm5lckhUTUw9ZTtlbHNle2Zvcig7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0LmFwcGVuZENoaWxkKGUpfXRoaXMuZmlyZSgiY29udGVudHVwZGF0ZSIpfX0sX3VwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQsZSxpO3RoaXMuX21hcCYmKGU9dGhpcy5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLHQ9bSh0aGlzLm9wdGlvbnMub2Zmc2V0KSxpPXRoaXMuX2dldEFuY2hvcigpLHRoaXMuX3pvb21BbmltYXRlZD9aKHRoaXMuX2NvbnRhaW5lcixlLmFkZChpKSk6dD10LmFkZChlKS5hZGQoaSksZT10aGlzLl9jb250YWluZXJCb3R0b209LXQueSxpPXRoaXMuX2NvbnRhaW5lckxlZnQ9LU1hdGgucm91bmQodGhpcy5fY29udGFpbmVyV2lkdGgvMikrdC54LHRoaXMuX2NvbnRhaW5lci5zdHlsZS5ib3R0b209ZSsicHgiLHRoaXMuX2NvbnRhaW5lci5zdHlsZS5sZWZ0PWkrInB4Iil9LF9nZXRBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm5bMCwwXX19KSxCaT0oQS5pbmNsdWRlKHtfaW5pdE92ZXJsYXk6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89ZTtyZXR1cm4gbyBpbnN0YW5jZW9mIHR8fChvPW5ldyB0KG4pLnNldENvbnRlbnQoZSkpLGkmJm8uc2V0TGF0TG5nKGkpLG99fSksby5pbmNsdWRlKHtfaW5pdE92ZXJsYXk6ZnVuY3Rpb24odCxlLGksbil7dmFyIG89aTtyZXR1cm4gbyBpbnN0YW5jZW9mIHQ\/KGMobyxuKSxvLl9zb3VyY2U9dGhpcyk6KG89ZSYmIW4\/ZTpuZXcgdChuLHRoaXMpKS5zZXRDb250ZW50KGkpLG99fSksQWkuZXh0ZW5kKHtvcHRpb25zOntwYW5lOiJwb3B1cFBhbmUiLG9mZnNldDpbMCw3XSxtYXhXaWR0aDozMDAsbWluV2lkdGg6NTAsbWF4SGVpZ2h0Om51bGwsYXV0b1BhbjohMCxhdXRvUGFuUGFkZGluZ1RvcExlZnQ6bnVsbCxhdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0Om51bGwsYXV0b1BhblBhZGRpbmc6WzUsNV0sa2VlcEluVmlldzohMSxjbG9zZUJ1dHRvbjohMCxhdXRvQ2xvc2U6ITAsY2xvc2VPbkVzY2FwZUtleTohMCxjbGFzc05hbWU6IiJ9LG9wZW5PbjpmdW5jdGlvbih0KXtyZXR1cm4hKHQ9YXJndW1lbnRzLmxlbmd0aD90OnRoaXMuX3NvdXJjZS5fbWFwKS5oYXNMYXllcih0aGlzKSYmdC5fcG9wdXAmJnQuX3BvcHVwLm9wdGlvbnMuYXV0b0Nsb3NlJiZ0LnJlbW92ZUxheWVyKHQuX3BvcHVwKSx0Ll9wb3B1cD10aGlzLEFpLnByb3RvdHlwZS5vcGVuT24uY2FsbCh0aGlzLHQpfSxvbkFkZDpmdW5jdGlvbih0KXtBaS5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpLHQuZmlyZSgicG9wdXBvcGVuIix7cG9wdXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMuX3NvdXJjZS5maXJlKCJwb3B1cG9wZW4iLHtwb3B1cDp0aGlzfSwhMCksdGhpcy5fc291cmNlIGluc3RhbmNlb2YgZml8fHRoaXMuX3NvdXJjZS5vbigicHJlY2xpY2siLEFlKSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe0FpLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKCJwb3B1cGNsb3NlIix7cG9wdXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMuX3NvdXJjZS5maXJlKCJwb3B1cGNsb3NlIix7cG9wdXA6dGhpc30sITApLHRoaXMuX3NvdXJjZSBpbnN0YW5jZW9mIGZpfHx0aGlzLl9zb3VyY2Uub2ZmKCJwcmVjbGljayIsQWUpKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9QWkucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybih2b2lkIDAhPT10aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrP3RoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2s6dGhpcy5fbWFwLm9wdGlvbnMuY2xvc2VQb3B1cE9uQ2xpY2spJiYodC5wcmVjbGljaz10aGlzLmNsb3NlKSx0aGlzLm9wdGlvbnMua2VlcEluVmlldyYmKHQubW92ZWVuZD10aGlzLl9hZGp1c3RQYW4pLHR9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9ImxlYWZsZXQtcG9wdXAiLGU9dGhpcy5fY29udGFpbmVyPVAoImRpdiIsdCsiICIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fCIiKSsiIGxlYWZsZXQtem9vbS1hbmltYXRlZCIpLGk9dGhpcy5fd3JhcHBlcj1QKCJkaXYiLHQrIi1jb250ZW50LXdyYXBwZXIiLGUpO3RoaXMuX2NvbnRlbnROb2RlPVAoImRpdiIsdCsiLWNvbnRlbnQiLGkpLEllKGUpLEJlKHRoaXMuX2NvbnRlbnROb2RlKSxTKGUsImNvbnRleHRtZW51IixBZSksdGhpcy5fdGlwQ29udGFpbmVyPVAoImRpdiIsdCsiLXRpcC1jb250YWluZXIiLGUpLHRoaXMuX3RpcD1QKCJkaXYiLHQrIi10aXAiLHRoaXMuX3RpcENvbnRhaW5lciksdGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uJiYoKGk9dGhpcy5fY2xvc2VCdXR0b249UCgiYSIsdCsiLWNsb3NlLWJ1dHRvbiIsZSkpLnNldEF0dHJpYnV0ZSgicm9sZSIsImJ1dHRvbiIpLGkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiQ2xvc2UgcG9wdXAiKSxpLmhyZWY9IiNjbG9zZSIsaS5pbm5lckhUTUw9JzxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mIzIxNTs8L3NwYW4+JyxTKGksImNsaWNrIixmdW5jdGlvbih0KXtPKHQpLHRoaXMuY2xvc2UoKX0sdGhpcykpfSxfdXBkYXRlTGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGVudE5vZGUsZT10LnN0eWxlLGk9KGUud2lkdGg9IiIsZS53aGl0ZVNwYWNlPSJub3dyYXAiLHQub2Zmc2V0V2lkdGgpLGk9TWF0aC5taW4oaSx0aGlzLm9wdGlvbnMubWF4V2lkdGgpLGk9KGk9TWF0aC5tYXgoaSx0aGlzLm9wdGlvbnMubWluV2lkdGgpLGUud2lkdGg9aSsxKyJweCIsZS53aGl0ZVNwYWNlPSIiLGUuaGVpZ2h0PSIiLHQub2Zmc2V0SGVpZ2h0KSxuPXRoaXMub3B0aW9ucy5tYXhIZWlnaHQsbz0ibGVhZmxldC1wb3B1cC1zY3JvbGxlZCI7KG4mJm48aT8oZS5oZWlnaHQ9bisicHgiLE0pOnopKHQsbyksdGhpcy5fY29udGFpbmVyV2lkdGg9dGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRofSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIHQ9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlciksZT10aGlzLl9nZXRBbmNob3IoKTtaKHRoaXMuX2NvbnRhaW5lcix0LmFkZChlKSl9LF9hZGp1c3RQYW46ZnVuY3Rpb24oKXt2YXIgdCxlLGksbixvLHMscixhO3RoaXMub3B0aW9ucy5hdXRvUGFuJiYodGhpcy5fbWFwLl9wYW5BbmltJiZ0aGlzLl9tYXAuX3BhbkFuaW0uc3RvcCgpLHRoaXMuX2F1dG9wYW5uaW5nP3RoaXMuX2F1dG9wYW5uaW5nPSExOih0PXRoaXMuX21hcCxlPXBhcnNlSW50KHBlKHRoaXMuX2NvbnRhaW5lciwibWFyZ2luQm90dG9tIiksMTApfHwwLGU9dGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCtlLGE9dGhpcy5fY29udGFpbmVyV2lkdGgsKGk9bmV3IHAodGhpcy5fY29udGFpbmVyTGVmdCwtZS10aGlzLl9jb250YWluZXJCb3R0b20pKS5fYWRkKFBlKHRoaXMuX2NvbnRhaW5lcikpLGk9dC5sYXllclBvaW50VG9Db250YWluZXJQb2ludChpKSxvPW0odGhpcy5vcHRpb25zLmF1dG9QYW5QYWRkaW5nKSxuPW0odGhpcy5vcHRpb25zLmF1dG9QYW5QYWRkaW5nVG9wTGVmdHx8byksbz1tKHRoaXMub3B0aW9ucy5hdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0fHxvKSxzPXQuZ2V0U2l6ZSgpLHI9MCxpLngrYStvLng+cy54JiYocj1pLngrYS1zLngrby54KSxpLngtci1uLng8KGE9MCkmJihyPWkueC1uLngpLGkueStlK28ueT5zLnkmJihhPWkueStlLXMueStvLnkpLGkueS1hLW4ueTwwJiYoYT1pLnktbi55KSwocnx8YSkmJih0aGlzLm9wdGlvbnMua2VlcEluVmlldyYmKHRoaXMuX2F1dG9wYW5uaW5nPSEwKSx0LmZpcmUoImF1dG9wYW5zdGFydCIpLnBhbkJ5KFtyLGFdKSkpKX0sX2dldEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiBtKHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLl9nZXRQb3B1cEFuY2hvcj90aGlzLl9zb3VyY2UuX2dldFBvcHVwQW5jaG9yKCk6WzAsMF0pfX0pKSxJaT0oQS5tZXJnZU9wdGlvbnMoe2Nsb3NlUG9wdXBPbkNsaWNrOiEwfSksQS5pbmNsdWRlKHtvcGVuUG9wdXA6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLl9pbml0T3ZlcmxheShCaSx0LGUsaSkub3Blbk9uKHRoaXMpLHRoaXN9LGNsb3NlUG9wdXA6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9YXJndW1lbnRzLmxlbmd0aD90OnRoaXMuX3BvcHVwKSYmdC5jbG9zZSgpLHRoaXN9fSksby5pbmNsdWRlKHtiaW5kUG9wdXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcG9wdXA9dGhpcy5faW5pdE92ZXJsYXkoQmksdGhpcy5fcG9wdXAsdCxlKSx0aGlzLl9wb3B1cEhhbmRsZXJzQWRkZWR8fCh0aGlzLm9uKHtjbGljazp0aGlzLl9vcGVuUG9wdXAsa2V5cHJlc3M6dGhpcy5fb25LZXlQcmVzcyxyZW1vdmU6dGhpcy5jbG9zZVBvcHVwLG1vdmU6dGhpcy5fbW92ZVBvcHVwfSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkPSEwKSx0aGlzfSx1bmJpbmRQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmKHRoaXMub2ZmKHtjbGljazp0aGlzLl9vcGVuUG9wdXAsa2V5cHJlc3M6dGhpcy5fb25LZXlQcmVzcyxyZW1vdmU6dGhpcy5jbG9zZVBvcHVwLG1vdmU6dGhpcy5fbW92ZVBvcHVwfSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkPSExLHRoaXMuX3BvcHVwPW51bGwpLHRoaXN9LG9wZW5Qb3B1cDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9wdXAmJih0aGlzIGluc3RhbmNlb2YgY2l8fCh0aGlzLl9wb3B1cC5fc291cmNlPXRoaXMpLHRoaXMuX3BvcHVwLl9wcmVwYXJlT3Blbih0fHx0aGlzLl9sYXRsbmcpJiZ0aGlzLl9wb3B1cC5vcGVuT24odGhpcy5fbWFwKSksdGhpc30sY2xvc2VQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuY2xvc2UoKSx0aGlzfSx0b2dnbGVQb3B1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAudG9nZ2xlKHRoaXMpLHRoaXN9LGlzUG9wdXBPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAuaXNPcGVuKCl9LHNldFBvcHVwQ29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLnNldENvbnRlbnQodCksdGhpc30sZ2V0UG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXB9LF9vcGVuUG9wdXA6ZnVuY3Rpb24odCl7dmFyIGU7dGhpcy5fcG9wdXAmJnRoaXMuX21hcCYmKFJlKHQpLGU9dC5sYXllcnx8dC50YXJnZXQsdGhpcy5fcG9wdXAuX3NvdXJjZSE9PWV8fGUgaW5zdGFuY2VvZiBmaT8odGhpcy5fcG9wdXAuX3NvdXJjZT1lLHRoaXMub3BlblBvcHVwKHQubGF0bG5nKSk6dGhpcy5fbWFwLmhhc0xheWVyKHRoaXMuX3BvcHVwKT90aGlzLmNsb3NlUG9wdXAoKTp0aGlzLm9wZW5Qb3B1cCh0LmxhdGxuZykpfSxfbW92ZVBvcHVwOmZ1bmN0aW9uKHQpe3RoaXMuX3BvcHVwLnNldExhdExuZyh0LmxhdGxuZyl9LF9vbktleVByZXNzOmZ1bmN0aW9uKHQpezEzPT09dC5vcmlnaW5hbEV2ZW50LmtleUNvZGUmJnRoaXMuX29wZW5Qb3B1cCh0KX19KSxBaS5leHRlbmQoe29wdGlvbnM6e3BhbmU6InRvb2x0aXBQYW5lIixvZmZzZXQ6WzAsMF0sZGlyZWN0aW9uOiJhdXRvIixwZXJtYW5lbnQ6ITEsc3RpY2t5OiExLG9wYWNpdHk6Ljl9LG9uQWRkOmZ1bmN0aW9uKHQpe0FpLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsdCksdGhpcy5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5vcGFjaXR5KSx0LmZpcmUoInRvb2x0aXBvcGVuIix7dG9vbHRpcDp0aGlzfSksdGhpcy5fc291cmNlJiYodGhpcy5hZGRFdmVudFBhcmVudCh0aGlzLl9zb3VyY2UpLHRoaXMuX3NvdXJjZS5maXJlKCJ0b29sdGlwb3BlbiIse3Rvb2x0aXA6dGhpc30sITApKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7QWkucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyx0KSx0LmZpcmUoInRvb2x0aXBjbG9zZSIse3Rvb2x0aXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMucmVtb3ZlRXZlbnRQYXJlbnQodGhpcy5fc291cmNlKSx0aGlzLl9zb3VyY2UuZmlyZSgidG9vbHRpcGNsb3NlIix7dG9vbHRpcDp0aGlzfSwhMCkpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1BaS5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuIHRoaXMub3B0aW9ucy5wZXJtYW5lbnR8fCh0LnByZWNsaWNrPXRoaXMuY2xvc2UpLHR9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9ImxlYWZsZXQtdG9vbHRpcCAiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHwiIikrIiBsZWFmbGV0LXpvb20tIisodGhpcy5fem9vbUFuaW1hdGVkPyJhbmltYXRlZCI6ImhpZGUiKTt0aGlzLl9jb250ZW50Tm9kZT10aGlzLl9jb250YWluZXI9UCgiZGl2Iix0KSx0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKCJyb2xlIiwidG9vbHRpcCIpLHRoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImlkIiwibGVhZmxldC10b29sdGlwLSIraCh0aGlzKSl9LF91cGRhdGVMYXlvdXQ6ZnVuY3Rpb24oKXt9LF9hZGp1c3RQYW46ZnVuY3Rpb24oKXt9LF9zZXRQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMuX21hcCxuPXRoaXMuX2NvbnRhaW5lcixvPWkubGF0TG5nVG9Db250YWluZXJQb2ludChpLmdldENlbnRlcigpKSxpPWkubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodCkscz10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLHI9bi5vZmZzZXRXaWR0aCxhPW4ub2Zmc2V0SGVpZ2h0LGg9bSh0aGlzLm9wdGlvbnMub2Zmc2V0KSxsPXRoaXMuX2dldEFuY2hvcigpLGk9InRvcCI9PT1zPyhlPXIvMixhKToiYm90dG9tIj09PXM\/KGU9ci8yLDApOihlPSJjZW50ZXIiPT09cz9yLzI6InJpZ2h0Ij09PXM\/MDoibGVmdCI9PT1zP3I6aS54PG8ueD8ocz0icmlnaHQiLDApOihzPSJsZWZ0IixyKzIqKGgueCtsLngpKSxhLzIpO3Q9dC5zdWJ0cmFjdChtKGUsaSwhMCkpLmFkZChoKS5hZGQobCkseihuLCJsZWFmbGV0LXRvb2x0aXAtcmlnaHQiKSx6KG4sImxlYWZsZXQtdG9vbHRpcC1sZWZ0IikseihuLCJsZWFmbGV0LXRvb2x0aXAtdG9wIikseihuLCJsZWFmbGV0LXRvb2x0aXAtYm90dG9tIiksTShuLCJsZWFmbGV0LXRvb2x0aXAtIitzKSxaKG4sdCl9LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKTt0aGlzLl9zZXRQb3NpdGlvbih0KX0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX2NvbnRhaW5lciYmQyh0aGlzLl9jb250YWluZXIsdCl9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt0PXRoaXMuX21hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyx0Lnpvb20sdC5jZW50ZXIpO3RoaXMuX3NldFBvc2l0aW9uKHQpfSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG0odGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2UuX2dldFRvb2x0aXBBbmNob3ImJiF0aGlzLm9wdGlvbnMuc3RpY2t5P3RoaXMuX3NvdXJjZS5fZ2V0VG9vbHRpcEFuY2hvcigpOlswLDBdKX19KSksUmk9KEEuaW5jbHVkZSh7b3BlblRvb2x0aXA6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLl9pbml0T3ZlcmxheShJaSx0LGUsaSkub3Blbk9uKHRoaXMpLHRoaXN9LGNsb3NlVG9vbHRpcDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jbG9zZSgpLHRoaXN9fSksby5pbmNsdWRlKHtiaW5kVG9vbHRpcDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90b29sdGlwJiZ0aGlzLmlzVG9vbHRpcE9wZW4oKSYmdGhpcy51bmJpbmRUb29sdGlwKCksdGhpcy5fdG9vbHRpcD10aGlzLl9pbml0T3ZlcmxheShJaSx0aGlzLl90b29sdGlwLHQsZSksdGhpcy5faW5pdFRvb2x0aXBJbnRlcmFjdGlvbnMoKSx0aGlzLl90b29sdGlwLm9wdGlvbnMucGVybWFuZW50JiZ0aGlzLl9tYXAmJnRoaXMuX21hcC5oYXNMYXllcih0aGlzKSYmdGhpcy5vcGVuVG9vbHRpcCgpLHRoaXN9LHVuYmluZFRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zKCEwKSx0aGlzLmNsb3NlVG9vbHRpcCgpLHRoaXMuX3Rvb2x0aXA9bnVsbCksdGhpc30sX2luaXRUb29sdGlwSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKHQpe3ZhciBlLGk7IXQmJnRoaXMuX3Rvb2x0aXBIYW5kbGVyc0FkZGVkfHwoZT10PyJvZmYiOiJvbiIsaT17cmVtb3ZlOnRoaXMuY2xvc2VUb29sdGlwLG1vdmU6dGhpcy5fbW92ZVRvb2x0aXB9LHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5wZXJtYW5lbnQ\/aS5hZGQ9dGhpcy5fb3BlblRvb2x0aXA6KGkubW91c2VvdmVyPXRoaXMuX29wZW5Ub29sdGlwLGkubW91c2VvdXQ9dGhpcy5jbG9zZVRvb2x0aXAsaS5jbGljaz10aGlzLl9vcGVuVG9vbHRpcCx0aGlzLl9tYXA\/dGhpcy5fYWRkRm9jdXNMaXN0ZW5lcnMoKTppLmFkZD10aGlzLl9hZGRGb2N1c0xpc3RlbmVycyksdGhpcy5fdG9vbHRpcC5vcHRpb25zLnN0aWNreSYmKGkubW91c2Vtb3ZlPXRoaXMuX21vdmVUb29sdGlwKSx0aGlzW2VdKGkpLHRoaXMuX3Rvb2x0aXBIYW5kbGVyc0FkZGVkPSF0KX0sb3BlblRvb2x0aXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJih0aGlzIGluc3RhbmNlb2YgY2l8fCh0aGlzLl90b29sdGlwLl9zb3VyY2U9dGhpcyksdGhpcy5fdG9vbHRpcC5fcHJlcGFyZU9wZW4odCkmJih0aGlzLl90b29sdGlwLm9wZW5Pbih0aGlzLl9tYXApLHRoaXMuZ2V0RWxlbWVudD90aGlzLl9zZXRBcmlhRGVzY3JpYmVkQnlPbkxheWVyKHRoaXMpOnRoaXMuZWFjaExheWVyJiZ0aGlzLmVhY2hMYXllcih0aGlzLl9zZXRBcmlhRGVzY3JpYmVkQnlPbkxheWVyLHRoaXMpKSksdGhpc30sY2xvc2VUb29sdGlwOmZ1bmN0aW9uKCl7aWYodGhpcy5fdG9vbHRpcClyZXR1cm4gdGhpcy5fdG9vbHRpcC5jbG9zZSgpfSx0b2dnbGVUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJnRoaXMuX3Rvb2x0aXAudG9nZ2xlKHRoaXMpLHRoaXN9LGlzVG9vbHRpcE9wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcC5pc09wZW4oKX0sc2V0VG9vbHRpcENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJnRoaXMuX3Rvb2x0aXAuc2V0Q29udGVudCh0KSx0aGlzfSxnZXRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXB9LF9hZGRGb2N1c0xpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuZ2V0RWxlbWVudD90aGlzLl9hZGRGb2N1c0xpc3RlbmVyc09uTGF5ZXIodGhpcyk6dGhpcy5lYWNoTGF5ZXImJnRoaXMuZWFjaExheWVyKHRoaXMuX2FkZEZvY3VzTGlzdGVuZXJzT25MYXllcix0aGlzKX0sX2FkZEZvY3VzTGlzdGVuZXJzT25MYXllcjpmdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC5nZXRFbGVtZW50JiZ0LmdldEVsZW1lbnQoKTtlJiYoUyhlLCJmb2N1cyIsZnVuY3Rpb24oKXt0aGlzLl90b29sdGlwLl9zb3VyY2U9dCx0aGlzLm9wZW5Ub29sdGlwKCl9LHRoaXMpLFMoZSwiYmx1ciIsdGhpcy5jbG9zZVRvb2x0aXAsdGhpcykpfSxfc2V0QXJpYURlc2NyaWJlZEJ5T25MYXllcjpmdW5jdGlvbih0KXt0PSJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldEVsZW1lbnQmJnQuZ2V0RWxlbWVudCgpO3QmJnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iix0aGlzLl90b29sdGlwLl9jb250YWluZXIuaWQpfSxfb3BlblRvb2x0aXA6ZnVuY3Rpb24odCl7dmFyIGU7dGhpcy5fdG9vbHRpcCYmdGhpcy5fbWFwJiYodGhpcy5fbWFwLmRyYWdnaW5nJiZ0aGlzLl9tYXAuZHJhZ2dpbmcubW92aW5nKCkmJiF0aGlzLl9vcGVuT25jZUZsYWc\/KHRoaXMuX29wZW5PbmNlRmxhZz0hMCwoZT10aGlzKS5fbWFwLm9uY2UoIm1vdmVlbmQiLGZ1bmN0aW9uKCl7ZS5fb3Blbk9uY2VGbGFnPSExLGUuX29wZW5Ub29sdGlwKHQpfSkpOih0aGlzLl90b29sdGlwLl9zb3VyY2U9dC5sYXllcnx8dC50YXJnZXQsdGhpcy5vcGVuVG9vbHRpcCh0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5P3QubGF0bG5nOnZvaWQgMCkpKX0sX21vdmVUb29sdGlwOmZ1bmN0aW9uKHQpe3ZhciBlPXQubGF0bG5nO3RoaXMuX3Rvb2x0aXAub3B0aW9ucy5zdGlja3kmJnQub3JpZ2luYWxFdmVudCYmKHQ9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQub3JpZ2luYWxFdmVudCksdD10aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQodCksZT10aGlzLl9tYXAubGF5ZXJQb2ludFRvTGF0TG5nKHQpKSx0aGlzLl90b29sdGlwLnNldExhdExuZyhlKX19KSxkaS5leHRlbmQoe29wdGlvbnM6e2ljb25TaXplOlsxMiwxMl0saHRtbDohMSxiZ1BvczpudWxsLGNsYXNzTmFtZToibGVhZmxldC1kaXYtaWNvbiJ9LGNyZWF0ZUljb246ZnVuY3Rpb24odCl7dmFyIHQ9dCYmIkRJViI9PT10LnRhZ05hbWU\/dDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXRoaXMub3B0aW9ucztyZXR1cm4gZS5odG1sIGluc3RhbmNlb2YgRWxlbWVudD8obWUodCksdC5hcHBlbmRDaGlsZChlLmh0bWwpKTp0LmlubmVySFRNTD0hMSE9PWUuaHRtbD9lLmh0bWw6IiIsZS5iZ1BvcyYmKGU9bShlLmJnUG9zKSx0LnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbj0tZS54KyJweCAiKy1lLnkrInB4IiksdGhpcy5fc2V0SWNvblN0eWxlcyh0LCJpY29uIiksdH0sY3JlYXRlU2hhZG93OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSkpO2RpLkRlZmF1bHQ9X2k7dmFyIE5pPW8uZXh0ZW5kKHtvcHRpb25zOnt0aWxlU2l6ZToyNTYsb3BhY2l0eToxLHVwZGF0ZVdoZW5JZGxlOmIubW9iaWxlLHVwZGF0ZVdoZW5ab29taW5nOiEwLHVwZGF0ZUludGVydmFsOjIwMCx6SW5kZXg6MSxib3VuZHM6bnVsbCxtaW5ab29tOjAsbWF4Wm9vbTp2b2lkIDAsbWF4TmF0aXZlWm9vbTp2b2lkIDAsbWluTmF0aXZlWm9vbTp2b2lkIDAsbm9XcmFwOiExLHBhbmU6InRpbGVQYW5lIixjbGFzc05hbWU6IiIsa2VlcEJ1ZmZlcjoyfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2ModGhpcyx0KX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9pbml0Q29udGFpbmVyKCksdGhpcy5fbGV2ZWxzPXt9LHRoaXMuX3RpbGVzPXt9LHRoaXMuX3Jlc2V0VmlldygpfSxiZWZvcmVBZGQ6ZnVuY3Rpb24odCl7dC5fYWRkWm9vbUxpbWl0KHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9yZW1vdmVBbGxUaWxlcygpLFQodGhpcy5fY29udGFpbmVyKSx0Ll9yZW1vdmVab29tTGltaXQodGhpcyksdGhpcy5fY29udGFpbmVyPW51bGwsdGhpcy5fdGlsZVpvb209dm9pZCAwfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYoZmUodGhpcy5fY29udGFpbmVyKSx0aGlzLl9zZXRBdXRvWkluZGV4KE1hdGgubWF4KSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYoZ2UodGhpcy5fY29udGFpbmVyKSx0aGlzLl9zZXRBdXRvWkluZGV4KE1hdGgubWluKSksdGhpc30sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpc30sc2V0WkluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuekluZGV4PXQsdGhpcy5fdXBkYXRlWkluZGV4KCksdGhpc30saXNMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvYWRpbmd9LHJlZHJhdzpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLl9tYXAmJih0aGlzLl9yZW1vdmVBbGxUaWxlcygpLCh0PXRoaXMuX2NsYW1wWm9vbSh0aGlzLl9tYXAuZ2V0Wm9vbSgpKSkhPT10aGlzLl90aWxlWm9vbSYmKHRoaXMuX3RpbGVab29tPXQsdGhpcy5fdXBkYXRlTGV2ZWxzKCkpLHRoaXMuX3VwZGF0ZSgpKSx0aGlzfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17dmlld3ByZXJlc2V0OnRoaXMuX2ludmFsaWRhdGVBbGwsdmlld3Jlc2V0OnRoaXMuX3Jlc2V0Vmlldyx6b29tOnRoaXMuX3Jlc2V0Vmlldyxtb3ZlZW5kOnRoaXMuX29uTW92ZUVuZH07cmV0dXJuIHRoaXMub3B0aW9ucy51cGRhdGVXaGVuSWRsZXx8KHRoaXMuX29uTW92ZXx8KHRoaXMuX29uTW92ZT1qKHRoaXMuX29uTW92ZUVuZCx0aGlzLm9wdGlvbnMudXBkYXRlSW50ZXJ2YWwsdGhpcykpLHQubW92ZT10aGlzLl9vbk1vdmUpLHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGNyZWF0ZVRpbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LGdldFRpbGVTaXplOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnRpbGVTaXplO3JldHVybiB0IGluc3RhbmNlb2YgcD90Om5ldyBwKHQsdCl9LF91cGRhdGVaSW5kZXg6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXImJnZvaWQgMCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJm51bGwhPT10aGlzLm9wdGlvbnMuekluZGV4JiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnpJbmRleD10aGlzLm9wdGlvbnMuekluZGV4KX0sX3NldEF1dG9aSW5kZXg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dGhpcy5nZXRQYW5lKCkuY2hpbGRyZW4sbj0tdCgtMS8wLDEvMCksbz0wLHM9aS5sZW5ndGg7bzxzO28rKyllPWlbb10uc3R5bGUuekluZGV4LGlbb10hPT10aGlzLl9jb250YWluZXImJmUmJihuPXQobiwrZSkpO2lzRmluaXRlKG4pJiYodGhpcy5vcHRpb25zLnpJbmRleD1uK3QoLTEsMSksdGhpcy5fdXBkYXRlWkluZGV4KCkpfSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCYmIWIuaWVsdDkpe0ModGhpcy5fY29udGFpbmVyLHRoaXMub3B0aW9ucy5vcGFjaXR5KTt2YXIgdCxlPStuZXcgRGF0ZSxpPSExLG49ITE7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpe3ZhciBvLHM9dGhpcy5fdGlsZXNbdF07cy5jdXJyZW50JiZzLmxvYWRlZCYmKG89TWF0aC5taW4oMSwoZS1zLmxvYWRlZCkvMjAwKSxDKHMuZWwsbyksbzwxP2k9ITA6KHMuYWN0aXZlP249ITA6dGhpcy5fb25PcGFxdWVUaWxlKHMpLHMuYWN0aXZlPSEwKSl9biYmIXRoaXMuX25vUHJ1bmUmJnRoaXMuX3BydW5lVGlsZXMoKSxpJiYocih0aGlzLl9mYWRlRnJhbWUpLHRoaXMuX2ZhZGVGcmFtZT14KHRoaXMuX3VwZGF0ZU9wYWNpdHksdGhpcykpfX0sX29uT3BhcXVlVGlsZTp1LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyfHwodGhpcy5fY29udGFpbmVyPVAoImRpdiIsImxlYWZsZXQtbGF5ZXIgIisodGhpcy5vcHRpb25zLmNsYXNzTmFtZXx8IiIpKSx0aGlzLl91cGRhdGVaSW5kZXgoKSx0aGlzLm9wdGlvbnMub3BhY2l0eTwxJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSl9LF91cGRhdGVMZXZlbHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90aWxlWm9vbSxlPXRoaXMub3B0aW9ucy5tYXhab29tO2lmKHZvaWQgMCE9PXQpe2Zvcih2YXIgaSBpbiB0aGlzLl9sZXZlbHMpaT1OdW1iZXIoaSksdGhpcy5fbGV2ZWxzW2ldLmVsLmNoaWxkcmVuLmxlbmd0aHx8aT09PXQ\/KHRoaXMuX2xldmVsc1tpXS5lbC5zdHlsZS56SW5kZXg9ZS1NYXRoLmFicyh0LWkpLHRoaXMuX29uVXBkYXRlTGV2ZWwoaSkpOihUKHRoaXMuX2xldmVsc1tpXS5lbCksdGhpcy5fcmVtb3ZlVGlsZXNBdFpvb20oaSksdGhpcy5fb25SZW1vdmVMZXZlbChpKSxkZWxldGUgdGhpcy5fbGV2ZWxzW2ldKTt2YXIgbj10aGlzLl9sZXZlbHNbdF0sbz10aGlzLl9tYXA7cmV0dXJuIG58fCgobj10aGlzLl9sZXZlbHNbdF09e30pLmVsPVAoImRpdiIsImxlYWZsZXQtdGlsZS1jb250YWluZXIgbGVhZmxldC16b29tLWFuaW1hdGVkIix0aGlzLl9jb250YWluZXIpLG4uZWwuc3R5bGUuekluZGV4PWUsbi5vcmlnaW49by5wcm9qZWN0KG8udW5wcm9qZWN0KG8uZ2V0UGl4ZWxPcmlnaW4oKSksdCkucm91bmQoKSxuLnpvb209dCx0aGlzLl9zZXRab29tVHJhbnNmb3JtKG4sby5nZXRDZW50ZXIoKSxvLmdldFpvb20oKSksdShuLmVsLm9mZnNldFdpZHRoKSx0aGlzLl9vbkNyZWF0ZUxldmVsKG4pKSx0aGlzLl9sZXZlbD1ufX0sX29uVXBkYXRlTGV2ZWw6dSxfb25SZW1vdmVMZXZlbDp1LF9vbkNyZWF0ZUxldmVsOnUsX3BydW5lVGlsZXM6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0LGUsaSxuPXRoaXMuX21hcC5nZXRab29tKCk7aWYobj50aGlzLm9wdGlvbnMubWF4Wm9vbXx8bjx0aGlzLm9wdGlvbnMubWluWm9vbSl0aGlzLl9yZW1vdmVBbGxUaWxlcygpO2Vsc2V7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpKGk9dGhpcy5fdGlsZXNbdF0pLnJldGFpbj1pLmN1cnJlbnQ7Zm9yKHQgaW4gdGhpcy5fdGlsZXMpKGk9dGhpcy5fdGlsZXNbdF0pLmN1cnJlbnQmJiFpLmFjdGl2ZSYmKGU9aS5jb29yZHMsdGhpcy5fcmV0YWluUGFyZW50KGUueCxlLnksZS56LGUuei01KXx8dGhpcy5fcmV0YWluQ2hpbGRyZW4oZS54LGUueSxlLnosZS56KzIpKTtmb3IodCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5yZXRhaW58fHRoaXMuX3JlbW92ZVRpbGUodCl9fX0sX3JlbW92ZVRpbGVzQXRab29tOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1tlXS5jb29yZHMuej09PXQmJnRoaXMuX3JlbW92ZVRpbGUoZSl9LF9yZW1vdmVBbGxUaWxlczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl90aWxlcyl0aGlzLl9yZW1vdmVUaWxlKHQpfSxfaW52YWxpZGF0ZUFsbDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sZXZlbHMpVCh0aGlzLl9sZXZlbHNbdF0uZWwpLHRoaXMuX29uUmVtb3ZlTGV2ZWwoTnVtYmVyKHQpKSxkZWxldGUgdGhpcy5fbGV2ZWxzW3RdO3RoaXMuX3JlbW92ZUFsbFRpbGVzKCksdGhpcy5fdGlsZVpvb209dm9pZCAwfSxfcmV0YWluUGFyZW50OmZ1bmN0aW9uKHQsZSxpLG4pe3ZhciB0PU1hdGguZmxvb3IodC8yKSxlPU1hdGguZmxvb3IoZS8yKSxpPWktMSxvPW5ldyBwKCt0LCtlKSxvPShvLno9aSx0aGlzLl90aWxlQ29vcmRzVG9LZXkobykpLG89dGhpcy5fdGlsZXNbb107cmV0dXJuIG8mJm8uYWN0aXZlP28ucmV0YWluPSEwOihvJiZvLmxvYWRlZCYmKG8ucmV0YWluPSEwKSxuPGkmJnRoaXMuX3JldGFpblBhcmVudCh0LGUsaSxuKSl9LF9yZXRhaW5DaGlsZHJlbjpmdW5jdGlvbih0LGUsaSxuKXtmb3IodmFyIG89Mip0O288Mip0KzI7bysrKWZvcih2YXIgcz0yKmU7czwyKmUrMjtzKyspe3ZhciByPW5ldyBwKG8scykscj0oci56PWkrMSx0aGlzLl90aWxlQ29vcmRzVG9LZXkocikpLHI9dGhpcy5fdGlsZXNbcl07ciYmci5hY3RpdmU\/ci5yZXRhaW49ITA6KHImJnIubG9hZGVkJiYoci5yZXRhaW49ITApLGkrMTxuJiZ0aGlzLl9yZXRhaW5DaGlsZHJlbihvLHMsaSsxLG4pKX19LF9yZXNldFZpZXc6ZnVuY3Rpb24odCl7dD10JiYodC5waW5jaHx8dC5mbHlUbyk7dGhpcy5fc2V0Vmlldyh0aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fbWFwLmdldFpvb20oKSx0LHQpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dGhpcy5fc2V0Vmlldyh0LmNlbnRlcix0Lnpvb20sITAsdC5ub1VwZGF0ZSl9LF9jbGFtcFpvb206ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVybiB2b2lkIDAhPT1lLm1pbk5hdGl2ZVpvb20mJnQ8ZS5taW5OYXRpdmVab29tP2UubWluTmF0aXZlWm9vbTp2b2lkIDAhPT1lLm1heE5hdGl2ZVpvb20mJmUubWF4TmF0aXZlWm9vbTx0P2UubWF4TmF0aXZlWm9vbTp0fSxfc2V0VmlldzpmdW5jdGlvbih0LGUsaSxuKXt2YXIgbz1NYXRoLnJvdW5kKGUpLG89dm9pZCAwIT09dGhpcy5vcHRpb25zLm1heFpvb20mJm8+dGhpcy5vcHRpb25zLm1heFpvb218fHZvaWQgMCE9PXRoaXMub3B0aW9ucy5taW5ab29tJiZvPHRoaXMub3B0aW9ucy5taW5ab29tP3ZvaWQgMDp0aGlzLl9jbGFtcFpvb20obykscz10aGlzLm9wdGlvbnMudXBkYXRlV2hlblpvb21pbmcmJm8hPT10aGlzLl90aWxlWm9vbTtuJiYhc3x8KHRoaXMuX3RpbGVab29tPW8sdGhpcy5fYWJvcnRMb2FkaW5nJiZ0aGlzLl9hYm9ydExvYWRpbmcoKSx0aGlzLl91cGRhdGVMZXZlbHMoKSx0aGlzLl9yZXNldEdyaWQoKSx2b2lkIDAhPT1vJiZ0aGlzLl91cGRhdGUodCksaXx8dGhpcy5fcHJ1bmVUaWxlcygpLHRoaXMuX25vUHJ1bmU9ISFpKSx0aGlzLl9zZXRab29tVHJhbnNmb3Jtcyh0LGUpfSxfc2V0Wm9vbVRyYW5zZm9ybXM6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gdGhpcy5fbGV2ZWxzKXRoaXMuX3NldFpvb21UcmFuc2Zvcm0odGhpcy5fbGV2ZWxzW2ldLHQsZSl9LF9zZXRab29tVHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9tYXAuZ2V0Wm9vbVNjYWxlKGksdC56b29tKSxlPXQub3JpZ2luLm11bHRpcGx5Qnkobikuc3VidHJhY3QodGhpcy5fbWFwLl9nZXROZXdQaXhlbE9yaWdpbihlLGkpKS5yb3VuZCgpO2IuYW55M2Q\/YmUodC5lbCxlLG4pOloodC5lbCxlKX0sX3Jlc2V0R3JpZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxlPXQub3B0aW9ucy5jcnMsaT10aGlzLl90aWxlU2l6ZT10aGlzLmdldFRpbGVTaXplKCksbj10aGlzLl90aWxlWm9vbSxvPXRoaXMuX21hcC5nZXRQaXhlbFdvcmxkQm91bmRzKHRoaXMuX3RpbGVab29tKTtvJiYodGhpcy5fZ2xvYmFsVGlsZVJhbmdlPXRoaXMuX3B4Qm91bmRzVG9UaWxlUmFuZ2UobykpLHRoaXMuX3dyYXBYPWUud3JhcExuZyYmIXRoaXMub3B0aW9ucy5ub1dyYXAmJltNYXRoLmZsb29yKHQucHJvamVjdChbMCxlLndyYXBMbmdbMF1dLG4pLngvaS54KSxNYXRoLmNlaWwodC5wcm9qZWN0KFswLGUud3JhcExuZ1sxXV0sbikueC9pLnkpXSx0aGlzLl93cmFwWT1lLndyYXBMYXQmJiF0aGlzLm9wdGlvbnMubm9XcmFwJiZbTWF0aC5mbG9vcih0LnByb2plY3QoW2Uud3JhcExhdFswXSwwXSxuKS55L2kueCksTWF0aC5jZWlsKHQucHJvamVjdChbZS53cmFwTGF0WzFdLDBdLG4pLnkvaS55KV19LF9vbk1vdmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJiF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20mJnRoaXMuX3VwZGF0ZSgpfSxfZ2V0VGlsZWRQaXhlbEJvdW5kczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXAsaT1lLl9hbmltYXRpbmdab29tP01hdGgubWF4KGUuX2FuaW1hdGVUb1pvb20sZS5nZXRab29tKCkpOmUuZ2V0Wm9vbSgpLGk9ZS5nZXRab29tU2NhbGUoaSx0aGlzLl90aWxlWm9vbSksdD1lLnByb2plY3QodCx0aGlzLl90aWxlWm9vbSkuZmxvb3IoKSxlPWUuZ2V0U2l6ZSgpLmRpdmlkZUJ5KDIqaSk7cmV0dXJuIG5ldyBmKHQuc3VidHJhY3QoZSksdC5hZGQoZSkpfSxfdXBkYXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtpZihlKXt2YXIgaT10aGlzLl9jbGFtcFpvb20oZS5nZXRab29tKCkpO2lmKHZvaWQgMD09PXQmJih0PWUuZ2V0Q2VudGVyKCkpLHZvaWQgMCE9PXRoaXMuX3RpbGVab29tKXt2YXIgbixlPXRoaXMuX2dldFRpbGVkUGl4ZWxCb3VuZHModCksbz10aGlzLl9weEJvdW5kc1RvVGlsZVJhbmdlKGUpLHM9by5nZXRDZW50ZXIoKSxyPVtdLGU9dGhpcy5vcHRpb25zLmtlZXBCdWZmZXIsYT1uZXcgZihvLmdldEJvdHRvbUxlZnQoKS5zdWJ0cmFjdChbZSwtZV0pLG8uZ2V0VG9wUmlnaHQoKS5hZGQoW2UsLWVdKSk7aWYoIShpc0Zpbml0ZShvLm1pbi54KSYmaXNGaW5pdGUoby5taW4ueSkmJmlzRmluaXRlKG8ubWF4LngpJiZpc0Zpbml0ZShvLm1heC55KSkpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gbG9hZCBhbiBpbmZpbml0ZSBudW1iZXIgb2YgdGlsZXMiKTtmb3IobiBpbiB0aGlzLl90aWxlcyl7dmFyIGg9dGhpcy5fdGlsZXNbbl0uY29vcmRzO2guej09PXRoaXMuX3RpbGVab29tJiZhLmNvbnRhaW5zKG5ldyBwKGgueCxoLnkpKXx8KHRoaXMuX3RpbGVzW25dLmN1cnJlbnQ9ITEpfWlmKDE8TWF0aC5hYnMoaS10aGlzLl90aWxlWm9vbSkpdGhpcy5fc2V0Vmlldyh0LGkpO2Vsc2V7Zm9yKHZhciBsPW8ubWluLnk7bDw9by5tYXgueTtsKyspZm9yKHZhciB1PW8ubWluLng7dTw9by5tYXgueDt1Kyspe3ZhciBjLGQ9bmV3IHAodSxsKTtkLno9dGhpcy5fdGlsZVpvb20sdGhpcy5faXNWYWxpZFRpbGUoZCkmJigoYz10aGlzLl90aWxlc1t0aGlzLl90aWxlQ29vcmRzVG9LZXkoZCldKT9jLmN1cnJlbnQ9ITA6ci5wdXNoKGQpKX1pZihyLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXN0YW5jZVRvKHMpLWUuZGlzdGFuY2VUbyhzKX0pLDAhPT1yLmxlbmd0aCl7dGhpcy5fbG9hZGluZ3x8KHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5maXJlKCJsb2FkaW5nIikpO2Zvcih2YXIgXz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksdT0wO3U8ci5sZW5ndGg7dSsrKXRoaXMuX2FkZFRpbGUoclt1XSxfKTt0aGlzLl9sZXZlbC5lbC5hcHBlbmRDaGlsZChfKX19fX19LF9pc1ZhbGlkVGlsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXAub3B0aW9ucy5jcnM7aWYoIWUuaW5maW5pdGUpe3ZhciBpPXRoaXMuX2dsb2JhbFRpbGVSYW5nZTtpZighZS53cmFwTG5nJiYodC54PGkubWluLnh8fHQueD5pLm1heC54KXx8IWUud3JhcExhdCYmKHQueTxpLm1pbi55fHx0Lnk+aS5tYXgueSkpcmV0dXJuITF9cmV0dXJuIXRoaXMub3B0aW9ucy5ib3VuZHN8fChlPXRoaXMuX3RpbGVDb29yZHNUb0JvdW5kcyh0KSxnKHRoaXMub3B0aW9ucy5ib3VuZHMpLm92ZXJsYXBzKGUpKX0sX2tleVRvQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90aWxlQ29vcmRzVG9Cb3VuZHModGhpcy5fa2V5VG9UaWxlQ29vcmRzKHQpKX0sX3RpbGVDb29yZHNUb053U2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLGk9dGhpcy5nZXRUaWxlU2l6ZSgpLG49dC5zY2FsZUJ5KGkpLGk9bi5hZGQoaSk7cmV0dXJuW2UudW5wcm9qZWN0KG4sdC56KSxlLnVucHJvamVjdChpLHQueildfSxfdGlsZUNvb3Jkc1RvQm91bmRzOmZ1bmN0aW9uKHQpe3Q9dGhpcy5fdGlsZUNvb3Jkc1RvTndTZSh0KSx0PW5ldyBzKHRbMF0sdFsxXSk7cmV0dXJuIHQ9dGhpcy5vcHRpb25zLm5vV3JhcD90OnRoaXMuX21hcC53cmFwTGF0TG5nQm91bmRzKHQpfSxfdGlsZUNvb3Jkc1RvS2V5OmZ1bmN0aW9uKHQpe3JldHVybiB0LngrIjoiK3QueSsiOiIrdC56fSxfa2V5VG9UaWxlQ29vcmRzOmZ1bmN0aW9uKHQpe3ZhciB0PXQuc3BsaXQoIjoiKSxlPW5ldyBwKCt0WzBdLCt0WzFdKTtyZXR1cm4gZS56PSt0WzJdLGV9LF9yZW1vdmVUaWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbGVzW3RdO2UmJihUKGUuZWwpLGRlbGV0ZSB0aGlzLl90aWxlc1t0XSx0aGlzLmZpcmUoInRpbGV1bmxvYWQiLHt0aWxlOmUuZWwsY29vcmRzOnRoaXMuX2tleVRvVGlsZUNvb3Jkcyh0KX0pKX0sX2luaXRUaWxlOmZ1bmN0aW9uKHQpe00odCwibGVhZmxldC10aWxlIik7dmFyIGU9dGhpcy5nZXRUaWxlU2l6ZSgpO3Quc3R5bGUud2lkdGg9ZS54KyJweCIsdC5zdHlsZS5oZWlnaHQ9ZS55KyJweCIsdC5vbnNlbGVjdHN0YXJ0PXUsdC5vbm1vdXNlbW92ZT11LGIuaWVsdDkmJnRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJkModCx0aGlzLm9wdGlvbnMub3BhY2l0eSl9LF9hZGRUaWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0VGlsZVBvcyh0KSxuPXRoaXMuX3RpbGVDb29yZHNUb0tleSh0KSxvPXRoaXMuY3JlYXRlVGlsZSh0aGlzLl93cmFwQ29vcmRzKHQpLGEodGhpcy5fdGlsZVJlYWR5LHRoaXMsdCkpO3RoaXMuX2luaXRUaWxlKG8pLHRoaXMuY3JlYXRlVGlsZS5sZW5ndGg8MiYmeChhKHRoaXMuX3RpbGVSZWFkeSx0aGlzLHQsbnVsbCxvKSksWihvLGkpLHRoaXMuX3RpbGVzW25dPXtlbDpvLGNvb3Jkczp0LGN1cnJlbnQ6ITB9LGUuYXBwZW5kQ2hpbGQobyksdGhpcy5maXJlKCJ0aWxlbG9hZHN0YXJ0Iix7dGlsZTpvLGNvb3Jkczp0fSl9LF90aWxlUmVhZHk6ZnVuY3Rpb24odCxlLGkpe2UmJnRoaXMuZmlyZSgidGlsZWVycm9yIix7ZXJyb3I6ZSx0aWxlOmksY29vcmRzOnR9KTt2YXIgbj10aGlzLl90aWxlQ29vcmRzVG9LZXkodCk7KGk9dGhpcy5fdGlsZXNbbl0pJiYoaS5sb2FkZWQ9K25ldyBEYXRlLHRoaXMuX21hcC5fZmFkZUFuaW1hdGVkPyhDKGkuZWwsMCkscih0aGlzLl9mYWRlRnJhbWUpLHRoaXMuX2ZhZGVGcmFtZT14KHRoaXMuX3VwZGF0ZU9wYWNpdHksdGhpcykpOihpLmFjdGl2ZT0hMCx0aGlzLl9wcnVuZVRpbGVzKCkpLGV8fChNKGkuZWwsImxlYWZsZXQtdGlsZS1sb2FkZWQiKSx0aGlzLmZpcmUoInRpbGVsb2FkIix7dGlsZTppLmVsLGNvb3Jkczp0fSkpLHRoaXMuX25vVGlsZXNUb0xvYWQoKSYmKHRoaXMuX2xvYWRpbmc9ITEsdGhpcy5maXJlKCJsb2FkIiksYi5pZWx0OXx8IXRoaXMuX21hcC5fZmFkZUFuaW1hdGVkP3godGhpcy5fcHJ1bmVUaWxlcyx0aGlzKTpzZXRUaW1lb3V0KGEodGhpcy5fcHJ1bmVUaWxlcyx0aGlzKSwyNTApKSl9LF9nZXRUaWxlUG9zOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNjYWxlQnkodGhpcy5nZXRUaWxlU2l6ZSgpKS5zdWJ0cmFjdCh0aGlzLl9sZXZlbC5vcmlnaW4pfSxfd3JhcENvb3JkczpmdW5jdGlvbih0KXt2YXIgZT1uZXcgcCh0aGlzLl93cmFwWD9IKHQueCx0aGlzLl93cmFwWCk6dC54LHRoaXMuX3dyYXBZP0godC55LHRoaXMuX3dyYXBZKTp0LnkpO3JldHVybiBlLno9dC56LGV9LF9weEJvdW5kc1RvVGlsZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0VGlsZVNpemUoKTtyZXR1cm4gbmV3IGYodC5taW4udW5zY2FsZUJ5KGUpLmZsb29yKCksdC5tYXgudW5zY2FsZUJ5KGUpLmNlaWwoKS5zdWJ0cmFjdChbMSwxXSkpfSxfbm9UaWxlc1RvTG9hZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl90aWxlcylpZighdGhpcy5fdGlsZXNbdF0ubG9hZGVkKXJldHVybiExO3JldHVybiEwfX0pO3ZhciBEaT1OaS5leHRlbmQoe29wdGlvbnM6e21pblpvb206MCxtYXhab29tOjE4LHN1YmRvbWFpbnM6ImFiYyIsZXJyb3JUaWxlVXJsOiIiLHpvb21PZmZzZXQ6MCx0bXM6ITEsem9vbVJldmVyc2U6ITEsZGV0ZWN0UmV0aW5hOiExLGNyb3NzT3JpZ2luOiExLHJlZmVycmVyUG9saWN5OiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7dGhpcy5fdXJsPXQsKGU9Yyh0aGlzLGUpKS5kZXRlY3RSZXRpbmEmJmIucmV0aW5hJiYwPGUubWF4Wm9vbT8oZS50aWxlU2l6ZT1NYXRoLmZsb29yKGUudGlsZVNpemUvMiksZS56b29tUmV2ZXJzZT8oZS56b29tT2Zmc2V0LS0sZS5taW5ab29tPU1hdGgubWluKGUubWF4Wm9vbSxlLm1pblpvb20rMSkpOihlLnpvb21PZmZzZXQrKyxlLm1heFpvb209TWF0aC5tYXgoZS5taW5ab29tLGUubWF4Wm9vbS0xKSksZS5taW5ab29tPU1hdGgubWF4KDAsZS5taW5ab29tKSk6ZS56b29tUmV2ZXJzZT9lLm1pblpvb209TWF0aC5taW4oZS5tYXhab29tLGUubWluWm9vbSk6ZS5tYXhab29tPU1hdGgubWF4KGUubWluWm9vbSxlLm1heFpvb20pLCJzdHJpbmciPT10eXBlb2YgZS5zdWJkb21haW5zJiYoZS5zdWJkb21haW5zPWUuc3ViZG9tYWlucy5zcGxpdCgiIikpLHRoaXMub24oInRpbGV1bmxvYWQiLHRoaXMuX29uVGlsZVJlbW92ZSl9LHNldFVybDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl91cmw9PT10JiZ2b2lkIDA9PT1lJiYoZT0hMCksdGhpcy5fdXJsPXQsZXx8dGhpcy5yZWRyYXcoKSx0aGlzfSxjcmVhdGVUaWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7cmV0dXJuIFMoaSwibG9hZCIsYSh0aGlzLl90aWxlT25Mb2FkLHRoaXMsZSxpKSksUyhpLCJlcnJvciIsYSh0aGlzLl90aWxlT25FcnJvcix0aGlzLGUsaSkpLCF0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4mJiIiIT09dGhpcy5vcHRpb25zLmNyb3NzT3JpZ2lufHwoaS5jcm9zc09yaWdpbj0hMD09PXRoaXMub3B0aW9ucy5jcm9zc09yaWdpbj8iIjp0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4pLCJzdHJpbmciPT10eXBlb2YgdGhpcy5vcHRpb25zLnJlZmVycmVyUG9saWN5JiYoaS5yZWZlcnJlclBvbGljeT10aGlzLm9wdGlvbnMucmVmZXJyZXJQb2xpY3kpLGkuYWx0PSIiLGkuc3JjPXRoaXMuZ2V0VGlsZVVybCh0KSxpfSxnZXRUaWxlVXJsOmZ1bmN0aW9uKHQpe3ZhciBlPXtyOmIucmV0aW5hPyJAMngiOiIiLHM6dGhpcy5fZ2V0U3ViZG9tYWluKHQpLHg6dC54LHk6dC55LHo6dGhpcy5fZ2V0Wm9vbUZvclVybCgpfTtyZXR1cm4gdGhpcy5fbWFwJiYhdGhpcy5fbWFwLm9wdGlvbnMuY3JzLmluZmluaXRlJiYodD10aGlzLl9nbG9iYWxUaWxlUmFuZ2UubWF4LnktdC55LHRoaXMub3B0aW9ucy50bXMmJihlLnk9dCksZVsiLXkiXT10KSxxKHRoaXMuX3VybCxsKGUsdGhpcy5vcHRpb25zKSl9LF90aWxlT25Mb2FkOmZ1bmN0aW9uKHQsZSl7Yi5pZWx0OT9zZXRUaW1lb3V0KGEodCx0aGlzLG51bGwsZSksMCk6dChudWxsLGUpfSxfdGlsZU9uRXJyb3I6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMub3B0aW9ucy5lcnJvclRpbGVVcmw7biYmZS5nZXRBdHRyaWJ1dGUoInNyYyIpIT09biYmKGUuc3JjPW4pLHQoaSxlKX0sX29uVGlsZVJlbW92ZTpmdW5jdGlvbih0KXt0LnRpbGUub25sb2FkPW51bGx9LF9nZXRab29tRm9yVXJsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlsZVpvb20sZT10aGlzLm9wdGlvbnMubWF4Wm9vbTtyZXR1cm4odD10aGlzLm9wdGlvbnMuem9vbVJldmVyc2U\/ZS10OnQpK3RoaXMub3B0aW9ucy56b29tT2Zmc2V0fSxfZ2V0U3ViZG9tYWluOmZ1bmN0aW9uKHQpe3Q9TWF0aC5hYnModC54K3QueSkldGhpcy5vcHRpb25zLnN1YmRvbWFpbnMubGVuZ3RoO3JldHVybiB0aGlzLm9wdGlvbnMuc3ViZG9tYWluc1t0XX0sX2Fib3J0TG9hZGluZzpmdW5jdGlvbigpe3ZhciB0LGUsaTtmb3IodCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5jb29yZHMueiE9PXRoaXMuX3RpbGVab29tJiYoKGk9dGhpcy5fdGlsZXNbdF0uZWwpLm9ubG9hZD11LGkub25lcnJvcj11LGkuY29tcGxldGV8fChpLnNyYz1LLGU9dGhpcy5fdGlsZXNbdF0uY29vcmRzLFQoaSksZGVsZXRlIHRoaXMuX3RpbGVzW3RdLHRoaXMuZmlyZSgidGlsZWFib3J0Iix7dGlsZTppLGNvb3JkczplfSkpKX0sX3JlbW92ZVRpbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlsZXNbdF07aWYoZSlyZXR1cm4gZS5lbC5zZXRBdHRyaWJ1dGUoInNyYyIsSyksTmkucHJvdG90eXBlLl9yZW1vdmVUaWxlLmNhbGwodGhpcyx0KX0sX3RpbGVSZWFkeTpmdW5jdGlvbih0LGUsaSl7aWYodGhpcy5fbWFwJiYoIWl8fGkuZ2V0QXR0cmlidXRlKCJzcmMiKSE9PUspKXJldHVybiBOaS5wcm90b3R5cGUuX3RpbGVSZWFkeS5jYWxsKHRoaXMsdCxlLGkpfX0pO2Z1bmN0aW9uIGppKHQsZSl7cmV0dXJuIG5ldyBEaSh0LGUpfXZhciBIaT1EaS5leHRlbmQoe2RlZmF1bHRXbXNQYXJhbXM6e3NlcnZpY2U6IldNUyIscmVxdWVzdDoiR2V0TWFwIixsYXllcnM6IiIsc3R5bGVzOiIiLGZvcm1hdDoiaW1hZ2UvanBlZyIsdHJhbnNwYXJlbnQ6ITEsdmVyc2lvbjoiMS4xLjEifSxvcHRpb25zOntjcnM6bnVsbCx1cHBlcmNhc2U6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXt0aGlzLl91cmw9dDt2YXIgaSxuPWwoe30sdGhpcy5kZWZhdWx0V21zUGFyYW1zKTtmb3IoaSBpbiBlKWkgaW4gdGhpcy5vcHRpb25zfHwobltpXT1lW2ldKTt2YXIgdD0oZT1jKHRoaXMsZSkpLmRldGVjdFJldGluYSYmYi5yZXRpbmE\/MjoxLG89dGhpcy5nZXRUaWxlU2l6ZSgpO24ud2lkdGg9by54KnQsbi5oZWlnaHQ9by55KnQsdGhpcy53bXNQYXJhbXM9bn0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fY3JzPXRoaXMub3B0aW9ucy5jcnN8fHQub3B0aW9ucy5jcnMsdGhpcy5fd21zVmVyc2lvbj1wYXJzZUZsb2F0KHRoaXMud21zUGFyYW1zLnZlcnNpb24pO3ZhciBlPTEuMzw9dGhpcy5fd21zVmVyc2lvbj8iY3JzIjoic3JzIjt0aGlzLndtc1BhcmFtc1tlXT10aGlzLl9jcnMuY29kZSxEaS5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpfSxnZXRUaWxlVXJsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbGVDb29yZHNUb053U2UodCksaT10aGlzLl9jcnMsaT1fKGkucHJvamVjdChlWzBdKSxpLnByb2plY3QoZVsxXSkpLGU9aS5taW4saT1pLm1heCxlPSgxLjM8PXRoaXMuX3dtc1ZlcnNpb24mJnRoaXMuX2Nycz09PWxpP1tlLnksZS54LGkueSxpLnhdOltlLngsZS55LGkueCxpLnldKS5qb2luKCIsIiksaT1EaS5wcm90b3R5cGUuZ2V0VGlsZVVybC5jYWxsKHRoaXMsdCk7cmV0dXJuIGkrVSh0aGlzLndtc1BhcmFtcyxpLHRoaXMub3B0aW9ucy51cHBlcmNhc2UpKyh0aGlzLm9wdGlvbnMudXBwZXJjYXNlPyImQkJPWD0iOiImYmJveD0iKStlfSxzZXRQYXJhbXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbCh0aGlzLndtc1BhcmFtcyx0KSxlfHx0aGlzLnJlZHJhdygpLHRoaXN9fSk7RGkuV01TPUhpLGppLndtcz1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgSGkodCxlKX07dmFyIFdpPW8uZXh0ZW5kKHtvcHRpb25zOntwYWRkaW5nOi4xfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2ModGhpcyx0KSxoKHRoaXMpLHRoaXMuX2xheWVycz10aGlzLl9sYXllcnN8fHt9fSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2luaXRDb250YWluZXIoKSxNKHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC16b29tLWFuaW1hdGVkIikpLHRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fdXBkYXRlKCksdGhpcy5vbigidXBkYXRlIix0aGlzLl91cGRhdGVQYXRocyx0aGlzKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLm9mZigidXBkYXRlIix0aGlzLl91cGRhdGVQYXRocyx0aGlzKSx0aGlzLl9kZXN0cm95Q29udGFpbmVyKCl9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt2aWV3cmVzZXQ6dGhpcy5fcmVzZXQsem9vbTp0aGlzLl9vblpvb20sbW92ZWVuZDp0aGlzLl91cGRhdGUsem9vbWVuZDp0aGlzLl9vblpvb21FbmR9O3JldHVybiB0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX29uQW5pbVpvb20pLHR9LF9vbkFuaW1ab29tOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZVRyYW5zZm9ybSh0LmNlbnRlcix0Lnpvb20pfSxfb25ab29tOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlVHJhbnNmb3JtKHRoaXMuX21hcC5nZXRDZW50ZXIoKSx0aGlzLl9tYXAuZ2V0Wm9vbSgpKX0sX3VwZGF0ZVRyYW5zZm9ybTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX21hcC5nZXRab29tU2NhbGUoZSx0aGlzLl96b29tKSxuPXRoaXMuX21hcC5nZXRTaXplKCkubXVsdGlwbHlCeSguNSt0aGlzLm9wdGlvbnMucGFkZGluZyksbz10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9jZW50ZXIsZSksbj1uLm11bHRpcGx5QnkoLWkpLmFkZChvKS5zdWJ0cmFjdCh0aGlzLl9tYXAuX2dldE5ld1BpeGVsT3JpZ2luKHQsZSkpO2IuYW55M2Q\/YmUodGhpcy5fY29udGFpbmVyLG4saSk6Wih0aGlzLl9jb250YWluZXIsbil9LF9yZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl91cGRhdGUoKSx0aGlzLl91cGRhdGVUcmFuc2Zvcm0odGhpcy5fY2VudGVyLHRoaXMuX3pvb20pLHRoaXMuX2xheWVycyl0aGlzLl9sYXllcnNbdF0uX3Jlc2V0KCl9LF9vblpvb21FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5fcHJvamVjdCgpfSxfdXBkYXRlUGF0aHM6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5fdXBkYXRlKCl9LF91cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMucGFkZGluZyxlPXRoaXMuX21hcC5nZXRTaXplKCksaT10aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoZS5tdWx0aXBseUJ5KC10KSkucm91bmQoKTt0aGlzLl9ib3VuZHM9bmV3IGYoaSxpLmFkZChlLm11bHRpcGx5QnkoMSsyKnQpKS5yb3VuZCgpKSx0aGlzLl9jZW50ZXI9dGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX3pvb209dGhpcy5fbWFwLmdldFpvb20oKX19KSxGaT1XaS5leHRlbmQoe29wdGlvbnM6e3RvbGVyYW5jZTowfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1XaS5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuIHQudmlld3ByZXJlc2V0PXRoaXMuX29uVmlld1ByZVJlc2V0LHR9LF9vblZpZXdQcmVSZXNldDpmdW5jdGlvbigpe3RoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHM9ITB9LG9uQWRkOmZ1bmN0aW9uKCl7V2kucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyksdGhpcy5fZHJhdygpfSxfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtTKHQsIm1vdXNlbW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUsdGhpcyksUyh0LCJjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBjb250ZXh0bWVudSIsdGhpcy5fb25DbGljayx0aGlzKSxTKHQsIm1vdXNlb3V0Iix0aGlzLl9oYW5kbGVNb3VzZU91dCx0aGlzKSx0Ll9sZWFmbGV0X2Rpc2FibGVfZXZlbnRzPSEwLHRoaXMuX2N0eD10LmdldENvbnRleHQoIjJkIil9LF9kZXN0cm95Q29udGFpbmVyOmZ1bmN0aW9uKCl7cih0aGlzLl9yZWRyYXdSZXF1ZXN0KSxkZWxldGUgdGhpcy5fY3R4LFQodGhpcy5fY29udGFpbmVyKSxrKHRoaXMuX2NvbnRhaW5lciksZGVsZXRlIHRoaXMuX2NvbnRhaW5lcn0sX3VwZGF0ZVBhdGhzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHMpe2Zvcih2YXIgdCBpbiB0aGlzLl9yZWRyYXdCb3VuZHM9bnVsbCx0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl91cGRhdGUoKTt0aGlzLl9yZWRyYXcoKX19LF91cGRhdGU6ZnVuY3Rpb24oKXt2YXIgdCxlLGksbjt0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20mJnRoaXMuX2JvdW5kc3x8KFdpLnByb3RvdHlwZS5fdXBkYXRlLmNhbGwodGhpcyksdD10aGlzLl9ib3VuZHMsZT10aGlzLl9jb250YWluZXIsaT10LmdldFNpemUoKSxuPWIucmV0aW5hPzI6MSxaKGUsdC5taW4pLGUud2lkdGg9bippLngsZS5oZWlnaHQ9bippLnksZS5zdHlsZS53aWR0aD1pLngrInB4IixlLnN0eWxlLmhlaWdodD1pLnkrInB4IixiLnJldGluYSYmdGhpcy5fY3R4LnNjYWxlKDIsMiksdGhpcy5fY3R4LnRyYW5zbGF0ZSgtdC5taW4ueCwtdC5taW4ueSksdGhpcy5maXJlKCJ1cGRhdGUiKSl9LF9yZXNldDpmdW5jdGlvbigpe1dpLnByb3RvdHlwZS5fcmVzZXQuY2FsbCh0aGlzKSx0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzJiYodGhpcy5fcG9zdHBvbmVVcGRhdGVQYXRocz0hMSx0aGlzLl91cGRhdGVQYXRocygpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZURhc2hBcnJheSh0KTt0PSh0aGlzLl9sYXllcnNbaCh0KV09dCkuX29yZGVyPXtsYXllcjp0LHByZXY6dGhpcy5fZHJhd0xhc3QsbmV4dDpudWxsfTt0aGlzLl9kcmF3TGFzdCYmKHRoaXMuX2RyYXdMYXN0Lm5leHQ9dCksdGhpcy5fZHJhd0xhc3Q9dCx0aGlzLl9kcmF3Rmlyc3Q9dGhpcy5fZHJhd0ZpcnN0fHx0aGlzLl9kcmF3TGFzdH0sX2FkZFBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7dmFyIGU9dC5fb3JkZXIsaT1lLm5leHQsZT1lLnByZXY7aT9pLnByZXY9ZTp0aGlzLl9kcmF3TGFzdD1lLGU\/ZS5uZXh0PWk6dGhpcy5fZHJhd0ZpcnN0PWksZGVsZXRlIHQuX29yZGVyLGRlbGV0ZSB0aGlzLl9sYXllcnNbaCh0KV0sdGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24odCl7dGhpcy5fZXh0ZW5kUmVkcmF3Qm91bmRzKHQpLHQuX3Byb2plY3QoKSx0Ll91cGRhdGUoKSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlRGFzaEFycmF5KHQpLHRoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF91cGRhdGVEYXNoQXJyYXk6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0Lm9wdGlvbnMuZGFzaEFycmF5KXtmb3IodmFyIGUsaT10Lm9wdGlvbnMuZGFzaEFycmF5LnNwbGl0KC9bLCBdKy8pLG49W10sbz0wO288aS5sZW5ndGg7bysrKXtpZihlPU51bWJlcihpW29dKSxpc05hTihlKSlyZXR1cm47bi5wdXNoKGUpfXQub3B0aW9ucy5fZGFzaEFycmF5PW59ZWxzZSB0Lm9wdGlvbnMuX2Rhc2hBcnJheT10Lm9wdGlvbnMuZGFzaEFycmF5fSxfcmVxdWVzdFJlZHJhdzpmdW5jdGlvbih0KXt0aGlzLl9tYXAmJih0aGlzLl9leHRlbmRSZWRyYXdCb3VuZHModCksdGhpcy5fcmVkcmF3UmVxdWVzdD10aGlzLl9yZWRyYXdSZXF1ZXN0fHx4KHRoaXMuX3JlZHJhdyx0aGlzKSl9LF9leHRlbmRSZWRyYXdCb3VuZHM6ZnVuY3Rpb24odCl7dmFyIGU7dC5fcHhCb3VuZHMmJihlPSh0Lm9wdGlvbnMud2VpZ2h0fHwwKSsxLHRoaXMuX3JlZHJhd0JvdW5kcz10aGlzLl9yZWRyYXdCb3VuZHN8fG5ldyBmLHRoaXMuX3JlZHJhd0JvdW5kcy5leHRlbmQodC5fcHhCb3VuZHMubWluLnN1YnRyYWN0KFtlLGVdKSksdGhpcy5fcmVkcmF3Qm91bmRzLmV4dGVuZCh0Ll9weEJvdW5kcy5tYXguYWRkKFtlLGVdKSkpfSxfcmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fcmVkcmF3UmVxdWVzdD1udWxsLHRoaXMuX3JlZHJhd0JvdW5kcyYmKHRoaXMuX3JlZHJhd0JvdW5kcy5taW4uX2Zsb29yKCksdGhpcy5fcmVkcmF3Qm91bmRzLm1heC5fY2VpbCgpKSx0aGlzLl9jbGVhcigpLHRoaXMuX2RyYXcoKSx0aGlzLl9yZWRyYXdCb3VuZHM9bnVsbH0sX2NsZWFyOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLl9yZWRyYXdCb3VuZHM7ZT8odD1lLmdldFNpemUoKSx0aGlzLl9jdHguY2xlYXJSZWN0KGUubWluLngsZS5taW4ueSx0LngsdC55KSk6KHRoaXMuX2N0eC5zYXZlKCksdGhpcy5fY3R4LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksdGhpcy5fY3R4LmNsZWFyUmVjdCgwLDAsdGhpcy5fY29udGFpbmVyLndpZHRoLHRoaXMuX2NvbnRhaW5lci5oZWlnaHQpLHRoaXMuX2N0eC5yZXN0b3JlKCkpfSxfZHJhdzpmdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLl9yZWRyYXdCb3VuZHM7dGhpcy5fY3R4LnNhdmUoKSxpJiYoZT1pLmdldFNpemUoKSx0aGlzLl9jdHguYmVnaW5QYXRoKCksdGhpcy5fY3R4LnJlY3QoaS5taW4ueCxpLm1pbi55LGUueCxlLnkpLHRoaXMuX2N0eC5jbGlwKCkpLHRoaXMuX2RyYXdpbmc9ITA7Zm9yKHZhciBuPXRoaXMuX2RyYXdGaXJzdDtuO249bi5uZXh0KXQ9bi5sYXllciwoIWl8fHQuX3B4Qm91bmRzJiZ0Ll9weEJvdW5kcy5pbnRlcnNlY3RzKGkpKSYmdC5fdXBkYXRlUGF0aCgpO3RoaXMuX2RyYXdpbmc9ITEsdGhpcy5fY3R4LnJlc3RvcmUoKX0sX3VwZGF0ZVBvbHk6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kcmF3aW5nKXt2YXIgaSxuLG8scyxyPXQuX3BhcnRzLGE9ci5sZW5ndGgsaD10aGlzLl9jdHg7aWYoYSl7Zm9yKGguYmVnaW5QYXRoKCksaT0wO2k8YTtpKyspe2ZvcihuPTAsbz1yW2ldLmxlbmd0aDtuPG87bisrKXM9cltpXVtuXSxoW24\/ImxpbmVUbyI6Im1vdmVUbyJdKHMueCxzLnkpO2UmJmguY2xvc2VQYXRoKCl9dGhpcy5fZmlsbFN0cm9rZShoLHQpfX19LF91cGRhdGVDaXJjbGU6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLG87dGhpcy5fZHJhd2luZyYmIXQuX2VtcHR5KCkmJihlPXQuX3BvaW50LGk9dGhpcy5fY3R4LG49TWF0aC5tYXgoTWF0aC5yb3VuZCh0Ll9yYWRpdXMpLDEpLDEhPShvPShNYXRoLm1heChNYXRoLnJvdW5kKHQuX3JhZGl1c1kpLDEpfHxuKS9uKSYmKGkuc2F2ZSgpLGkuc2NhbGUoMSxvKSksaS5iZWdpblBhdGgoKSxpLmFyYyhlLngsZS55L28sbiwwLDIqTWF0aC5QSSwhMSksMSE9byYmaS5yZXN0b3JlKCksdGhpcy5fZmlsbFN0cm9rZShpLHQpKX0sX2ZpbGxTdHJva2U6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLm9wdGlvbnM7aS5maWxsJiYodC5nbG9iYWxBbHBoYT1pLmZpbGxPcGFjaXR5LHQuZmlsbFN0eWxlPWkuZmlsbENvbG9yfHxpLmNvbG9yLHQuZmlsbChpLmZpbGxSdWxlfHwiZXZlbm9kZCIpKSxpLnN0cm9rZSYmMCE9PWkud2VpZ2h0JiYodC5zZXRMaW5lRGFzaCYmdC5zZXRMaW5lRGFzaChlLm9wdGlvbnMmJmUub3B0aW9ucy5fZGFzaEFycmF5fHxbXSksdC5nbG9iYWxBbHBoYT1pLm9wYWNpdHksdC5saW5lV2lkdGg9aS53ZWlnaHQsdC5zdHJva2VTdHlsZT1pLmNvbG9yLHQubGluZUNhcD1pLmxpbmVDYXAsdC5saW5lSm9pbj1pLmxpbmVKb2luLHQuc3Ryb2tlKCkpfSxfb25DbGljazpmdW5jdGlvbih0KXtmb3IodmFyIGUsaSxuPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpLG89dGhpcy5fZHJhd0ZpcnN0O287bz1vLm5leHQpKGU9by5sYXllcikub3B0aW9ucy5pbnRlcmFjdGl2ZSYmZS5fY29udGFpbnNQb2ludChuKSYmKCgiY2xpY2siPT09dC50eXBlfHwicHJlY2xpY2siPT09dC50eXBlKSYmdGhpcy5fbWFwLl9kcmFnZ2FibGVNb3ZlZChlKXx8KGk9ZSkpO3RoaXMuX2ZpcmVFdmVudCghIWkmJltpXSx0KX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlOyF0aGlzLl9tYXB8fHRoaXMuX21hcC5kcmFnZ2luZy5tb3ZpbmcoKXx8dGhpcy5fbWFwLl9hbmltYXRpbmdab29tfHwoZT10aGlzLl9tYXAubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSx0aGlzLl9oYW5kbGVNb3VzZUhvdmVyKHQsZSkpfSxfaGFuZGxlTW91c2VPdXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faG92ZXJlZExheWVyO2UmJih6KHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuX2ZpcmVFdmVudChbZV0sdCwibW91c2VvdXQiKSx0aGlzLl9ob3ZlcmVkTGF5ZXI9bnVsbCx0aGlzLl9tb3VzZUhvdmVyVGhyb3R0bGVkPSExKX0sX2hhbmRsZU1vdXNlSG92ZXI6ZnVuY3Rpb24odCxlKXtpZighdGhpcy5fbW91c2VIb3ZlclRocm90dGxlZCl7Zm9yKHZhciBpLG4sbz10aGlzLl9kcmF3Rmlyc3Q7bztvPW8ubmV4dCkoaT1vLmxheWVyKS5vcHRpb25zLmludGVyYWN0aXZlJiZpLl9jb250YWluc1BvaW50KGUpJiYobj1pKTtuIT09dGhpcy5faG92ZXJlZExheWVyJiYodGhpcy5faGFuZGxlTW91c2VPdXQodCksbiYmKE0odGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5fZmlyZUV2ZW50KFtuXSx0LCJtb3VzZW92ZXIiKSx0aGlzLl9ob3ZlcmVkTGF5ZXI9bikpLHRoaXMuX2ZpcmVFdmVudCghIXRoaXMuX2hvdmVyZWRMYXllciYmW3RoaXMuX2hvdmVyZWRMYXllcl0sdCksdGhpcy5fbW91c2VIb3ZlclRocm90dGxlZD0hMCxzZXRUaW1lb3V0KGEoZnVuY3Rpb24oKXt0aGlzLl9tb3VzZUhvdmVyVGhyb3R0bGVkPSExfSx0aGlzKSwzMil9fSxfZmlyZUV2ZW50OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9tYXAuX2ZpcmVET01FdmVudChlLGl8fGUudHlwZSx0KX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXt2YXIgZSxpLG49dC5fb3JkZXI7biYmKGU9bi5uZXh0LGk9bi5wcmV2LGUmJigoZS5wcmV2PWkpP2kubmV4dD1lOmUmJih0aGlzLl9kcmF3Rmlyc3Q9ZSksbi5wcmV2PXRoaXMuX2RyYXdMYXN0LCh0aGlzLl9kcmF3TGFzdC5uZXh0PW4pLm5leHQ9bnVsbCx0aGlzLl9kcmF3TGFzdD1uLHRoaXMuX3JlcXVlc3RSZWRyYXcodCkpKX0sX2JyaW5nVG9CYWNrOmZ1bmN0aW9uKHQpe3ZhciBlLGksbj10Ll9vcmRlcjtuJiYoZT1uLm5leHQsKGk9bi5wcmV2KSYmKChpLm5leHQ9ZSk\/ZS5wcmV2PWk6aSYmKHRoaXMuX2RyYXdMYXN0PWkpLG4ucHJldj1udWxsLG4ubmV4dD10aGlzLl9kcmF3Rmlyc3QsdGhpcy5fZHJhd0ZpcnN0LnByZXY9bix0aGlzLl9kcmF3Rmlyc3Q9bix0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpKSl9fSk7ZnVuY3Rpb24gVWkodCl7cmV0dXJuIGIuY2FudmFzP25ldyBGaSh0KTpudWxsfXZhciBWaT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZG9jdW1lbnQubmFtZXNwYWNlcy5hZGQoImx2bWwiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpLGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCI8bHZtbDoiK3QrJyBjbGFzcz0ibHZtbCI+Jyl9fWNhdGNoKHQpe31yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIjwiK3QrJyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LmNvbTp2bWwiIGNsYXNzPSJsdm1sIj4nKX19KCksenQ9e19pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyPVAoImRpdiIsImxlYWZsZXQtdm1sLWNvbnRhaW5lciIpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9hbmltYXRpbmdab29tfHwoV2kucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKSx0aGlzLmZpcmUoInVwZGF0ZSIpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2NvbnRhaW5lcj1WaSgic2hhcGUiKTtNKGUsImxlYWZsZXQtdm1sLXNoYXBlICIrKHRoaXMub3B0aW9ucy5jbGFzc05hbWV8fCIiKSksZS5jb29yZHNpemU9IjEgMSIsdC5fcGF0aD1WaSgicGF0aCIpLGUuYXBwZW5kQ2hpbGQodC5fcGF0aCksdGhpcy5fdXBkYXRlU3R5bGUodCksdGhpcy5fbGF5ZXJzW2godCldPXR9LF9hZGRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2NvbnRhaW5lcjt0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoZSksdC5vcHRpb25zLmludGVyYWN0aXZlJiZ0LmFkZEludGVyYWN0aXZlVGFyZ2V0KGUpfSxfcmVtb3ZlUGF0aDpmdW5jdGlvbih0KXt2YXIgZT10Ll9jb250YWluZXI7VChlKSx0LnJlbW92ZUludGVyYWN0aXZlVGFyZ2V0KGUpLGRlbGV0ZSB0aGlzLl9sYXllcnNbaCh0KV19LF91cGRhdGVTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT10Ll9zdHJva2UsaT10Ll9maWxsLG49dC5vcHRpb25zLG89dC5fY29udGFpbmVyO28uc3Ryb2tlZD0hIW4uc3Ryb2tlLG8uZmlsbGVkPSEhbi5maWxsLG4uc3Ryb2tlPyhlPWV8fCh0Ll9zdHJva2U9VmkoInN0cm9rZSIpKSxvLmFwcGVuZENoaWxkKGUpLGUud2VpZ2h0PW4ud2VpZ2h0KyJweCIsZS5jb2xvcj1uLmNvbG9yLGUub3BhY2l0eT1uLm9wYWNpdHksbi5kYXNoQXJyYXk\/ZS5kYXNoU3R5bGU9ZChuLmRhc2hBcnJheSk\/bi5kYXNoQXJyYXkuam9pbigiICIpOm4uZGFzaEFycmF5LnJlcGxhY2UoLyggKiwgKikvZywiICIpOmUuZGFzaFN0eWxlPSIiLGUuZW5kY2FwPW4ubGluZUNhcC5yZXBsYWNlKCJidXR0IiwiZmxhdCIpLGUuam9pbnN0eWxlPW4ubGluZUpvaW4pOmUmJihvLnJlbW92ZUNoaWxkKGUpLHQuX3N0cm9rZT1udWxsKSxuLmZpbGw\/KGk9aXx8KHQuX2ZpbGw9VmkoImZpbGwiKSksby5hcHBlbmRDaGlsZChpKSxpLmNvbG9yPW4uZmlsbENvbG9yfHxuLmNvbG9yLGkub3BhY2l0eT1uLmZpbGxPcGFjaXR5KTppJiYoby5yZW1vdmVDaGlsZChpKSx0Ll9maWxsPW51bGwpfSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuX3BvaW50LnJvdW5kKCksaT1NYXRoLnJvdW5kKHQuX3JhZGl1cyksbj1NYXRoLnJvdW5kKHQuX3JhZGl1c1l8fGkpO3RoaXMuX3NldFBhdGgodCx0Ll9lbXB0eSgpPyJNMCAwIjoiQUwgIitlLngrIiwiK2UueSsiICIraSsiLCIrbisiIDAsMjM1OTI2MDAiKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxlKXt0Ll9wYXRoLnY9ZX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXtmZSh0Ll9jb250YWluZXIpfSxfYnJpbmdUb0JhY2s6ZnVuY3Rpb24odCl7Z2UodC5fY29udGFpbmVyKX19LHFpPWIudm1sP1ZpOmN0LEdpPVdpLmV4dGVuZCh7X2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9cWkoInN2ZyIpLHRoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLHRoaXMuX3Jvb3RHcm91cD1xaSgiZyIpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb290R3JvdXApfSxfZGVzdHJveUNvbnRhaW5lcjpmdW5jdGlvbigpe1QodGhpcy5fY29udGFpbmVyKSxrKHRoaXMuX2NvbnRhaW5lciksZGVsZXRlIHRoaXMuX2NvbnRhaW5lcixkZWxldGUgdGhpcy5fcm9vdEdyb3VwLGRlbGV0ZSB0aGlzLl9zdmdTaXplfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIHQsZSxpO3RoaXMuX21hcC5fYW5pbWF0aW5nWm9vbSYmdGhpcy5fYm91bmRzfHwoV2kucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKSxlPSh0PXRoaXMuX2JvdW5kcykuZ2V0U2l6ZSgpLGk9dGhpcy5fY29udGFpbmVyLHRoaXMuX3N2Z1NpemUmJnRoaXMuX3N2Z1NpemUuZXF1YWxzKGUpfHwodGhpcy5fc3ZnU2l6ZT1lLGkuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZS54KSxpLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlLnkpKSxaKGksdC5taW4pLGkuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IixbdC5taW4ueCx0Lm1pbi55LGUueCxlLnldLmpvaW4oIiAiKSksdGhpcy5maXJlKCJ1cGRhdGUiKSl9LF9pbml0UGF0aDpmdW5jdGlvbih0KXt2YXIgZT10Ll9wYXRoPXFpKCJwYXRoIik7dC5vcHRpb25zLmNsYXNzTmFtZSYmTShlLHQub3B0aW9ucy5jbGFzc05hbWUpLHQub3B0aW9ucy5pbnRlcmFjdGl2ZSYmTShlLCJsZWFmbGV0LWludGVyYWN0aXZlIiksdGhpcy5fdXBkYXRlU3R5bGUodCksdGhpcy5fbGF5ZXJzW2godCldPXR9LF9hZGRQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX3Jvb3RHcm91cHx8dGhpcy5faW5pdENvbnRhaW5lcigpLHRoaXMuX3Jvb3RHcm91cC5hcHBlbmRDaGlsZCh0Ll9wYXRoKSx0LmFkZEludGVyYWN0aXZlVGFyZ2V0KHQuX3BhdGgpfSxfcmVtb3ZlUGF0aDpmdW5jdGlvbih0KXtUKHQuX3BhdGgpLHQucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodC5fcGF0aCksZGVsZXRlIHRoaXMuX2xheWVyc1toKHQpXX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24odCl7dC5fcHJvamVjdCgpLHQuX3VwZGF0ZSgpfSxfdXBkYXRlU3R5bGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5fcGF0aCx0PXQub3B0aW9ucztlJiYodC5zdHJva2U\/KGUuc2V0QXR0cmlidXRlKCJzdHJva2UiLHQuY29sb3IpLGUuc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsdC5vcGFjaXR5KSxlLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIix0LndlaWdodCksZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lY2FwIix0LmxpbmVDYXApLGUuc2V0QXR0cmlidXRlKCJzdHJva2UtbGluZWpvaW4iLHQubGluZUpvaW4pLHQuZGFzaEFycmF5P2Uuc2V0QXR0cmlidXRlKCJzdHJva2UtZGFzaGFycmF5Iix0LmRhc2hBcnJheSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiKSx0LmRhc2hPZmZzZXQ\/ZS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNob2Zmc2V0Iix0LmRhc2hPZmZzZXQpOmUucmVtb3ZlQXR0cmlidXRlKCJzdHJva2UtZGFzaG9mZnNldCIpKTplLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwibm9uZSIpLHQuZmlsbD8oZS5zZXRBdHRyaWJ1dGUoImZpbGwiLHQuZmlsbENvbG9yfHx0LmNvbG9yKSxlLnNldEF0dHJpYnV0ZSgiZmlsbC1vcGFjaXR5Iix0LmZpbGxPcGFjaXR5KSxlLnNldEF0dHJpYnV0ZSgiZmlsbC1ydWxlIix0LmZpbGxSdWxlfHwiZXZlbm9kZCIpKTplLnNldEF0dHJpYnV0ZSgiZmlsbCIsIm5vbmUiKSl9LF91cGRhdGVQb2x5OmZ1bmN0aW9uKHQsZSl7dGhpcy5fc2V0UGF0aCh0LGR0KHQuX3BhcnRzLGUpKX0sX3VwZGF0ZUNpcmNsZTpmdW5jdGlvbih0KXt2YXIgZT10Ll9wb2ludCxpPU1hdGgubWF4KE1hdGgucm91bmQodC5fcmFkaXVzKSwxKSxuPSJhIitpKyIsIisoTWF0aC5tYXgoTWF0aC5yb3VuZCh0Ll9yYWRpdXNZKSwxKXx8aSkrIiAwIDEsMCAiLGU9dC5fZW1wdHkoKT8iTTAgMCI6Ik0iKyhlLngtaSkrIiwiK2UueStuKzIqaSsiLDAgIituKzIqLWkrIiwwICI7dGhpcy5fc2V0UGF0aCh0LGUpfSxfc2V0UGF0aDpmdW5jdGlvbih0LGUpe3QuX3BhdGguc2V0QXR0cmlidXRlKCJkIixlKX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXtmZSh0Ll9wYXRoKX0sX2JyaW5nVG9CYWNrOmZ1bmN0aW9uKHQpe2dlKHQuX3BhdGgpfX0pO2Z1bmN0aW9uIEtpKHQpe3JldHVybiBiLnN2Z3x8Yi52bWw\/bmV3IEdpKHQpOm51bGx9Yi52bWwmJkdpLmluY2x1ZGUoenQpLEEuaW5jbHVkZSh7Z2V0UmVuZGVyZXI6ZnVuY3Rpb24odCl7dD0odD10Lm9wdGlvbnMucmVuZGVyZXJ8fHRoaXMuX2dldFBhbmVSZW5kZXJlcih0Lm9wdGlvbnMucGFuZSl8fHRoaXMub3B0aW9ucy5yZW5kZXJlcnx8dGhpcy5fcmVuZGVyZXIpfHwodGhpcy5fcmVuZGVyZXI9dGhpcy5fY3JlYXRlUmVuZGVyZXIoKSk7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCl8fHRoaXMuYWRkTGF5ZXIodCksdH0sX2dldFBhbmVSZW5kZXJlcjpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ib3ZlcmxheVBhbmUiIT09dCYmdm9pZCAwIT09dCYmKHZvaWQgMD09PShlPXRoaXMuX3BhbmVSZW5kZXJlcnNbdF0pJiYoZT10aGlzLl9jcmVhdGVSZW5kZXJlcih7cGFuZTp0fSksdGhpcy5fcGFuZVJlbmRlcmVyc1t0XT1lKSxlKX0sX2NyZWF0ZVJlbmRlcmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMucHJlZmVyQ2FudmFzJiZVaSh0KXx8S2kodCl9fSk7dmFyIFlpPXhpLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe3hpLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyx0aGlzLl9ib3VuZHNUb0xhdExuZ3ModCksZSl9LHNldEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRMYXRMbmdzKHRoaXMuX2JvdW5kc1RvTGF0TG5ncyh0KSl9LF9ib3VuZHNUb0xhdExuZ3M6ZnVuY3Rpb24odCl7cmV0dXJuWyh0PWcodCkpLmdldFNvdXRoV2VzdCgpLHQuZ2V0Tm9ydGhXZXN0KCksdC5nZXROb3J0aEVhc3QoKSx0LmdldFNvdXRoRWFzdCgpXX19KTtHaS5jcmVhdGU9cWksR2kucG9pbnRzVG9QYXRoPWR0LHdpLmdlb21ldHJ5VG9MYXllcj1iaSx3aS5jb29yZHNUb0xhdExuZz1MaSx3aS5jb29yZHNUb0xhdExuZ3M9VGksd2kubGF0TG5nVG9Db29yZHM9TWksd2kubGF0TG5nc1RvQ29vcmRzPXppLHdpLmdldEZlYXR1cmU9Q2ksd2kuYXNGZWF0dXJlPVppLEEubWVyZ2VPcHRpb25zKHtib3hab29tOiEwfSk7dmFyIF90PW4uZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX2NvbnRhaW5lcj10Ll9jb250YWluZXIsdGhpcy5fcGFuZT10Ll9wYW5lcy5vdmVybGF5UGFuZSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD0wLHQub24oInVubG9hZCIsdGhpcy5fZGVzdHJveSx0aGlzKX0sYWRkSG9va3M6ZnVuY3Rpb24oKXtTKHRoaXMuX2NvbnRhaW5lciwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bix0aGlzKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtrKHRoaXMuX2NvbnRhaW5lciwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bix0aGlzKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW92ZWR9LF9kZXN0cm95OmZ1bmN0aW9uKCl7VCh0aGlzLl9wYW5lKSxkZWxldGUgdGhpcy5fcGFuZX0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFN0YXRlVGltZW91dD0wLHRoaXMuX21vdmVkPSExfSxfY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGU6ZnVuY3Rpb24oKXswIT09dGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQpLHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0PTApfSxfb25Nb3VzZURvd246ZnVuY3Rpb24odCl7aWYoIXQuc2hpZnRLZXl8fDEhPT10LndoaWNoJiYxIT09dC5idXR0b24pcmV0dXJuITE7dGhpcy5fY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGUoKSx0aGlzLl9yZXNldFN0YXRlKCkscmUoKSxMZSgpLHRoaXMuX3N0YXJ0UG9pbnQ9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpLFMoZG9jdW1lbnQse2NvbnRleHRtZW51OlJlLG1vdXNlbW92ZTp0aGlzLl9vbk1vdXNlTW92ZSxtb3VzZXVwOnRoaXMuX29uTW91c2VVcCxrZXlkb3duOnRoaXMuX29uS2V5RG93bn0sdGhpcyl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt0aGlzLl9tb3ZlZHx8KHRoaXMuX21vdmVkPSEwLHRoaXMuX2JveD1QKCJkaXYiLCJsZWFmbGV0LXpvb20tYm94Iix0aGlzLl9jb250YWluZXIpLE0odGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWNyb3NzaGFpciIpLHRoaXMuX21hcC5maXJlKCJib3h6b29tc3RhcnQiKSksdGhpcy5fcG9pbnQ9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpO3ZhciB0PW5ldyBmKHRoaXMuX3BvaW50LHRoaXMuX3N0YXJ0UG9pbnQpLGU9dC5nZXRTaXplKCk7Wih0aGlzLl9ib3gsdC5taW4pLHRoaXMuX2JveC5zdHlsZS53aWR0aD1lLngrInB4Iix0aGlzLl9ib3guc3R5bGUuaGVpZ2h0PWUueSsicHgifSxfZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJihUKHRoaXMuX2JveCkseih0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY3Jvc3NoYWlyIikpLGFlKCksVGUoKSxrKGRvY3VtZW50LHtjb250ZXh0bWVudTpSZSxtb3VzZW1vdmU6dGhpcy5fb25Nb3VzZU1vdmUsbW91c2V1cDp0aGlzLl9vbk1vdXNlVXAsa2V5ZG93bjp0aGlzLl9vbktleURvd259LHRoaXMpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKHQpezEhPT10LndoaWNoJiYxIT09dC5idXR0b258fCh0aGlzLl9maW5pc2goKSx0aGlzLl9tb3ZlZCYmKHRoaXMuX2NsZWFyRGVmZXJyZWRSZXNldFN0YXRlKCksdGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQ9c2V0VGltZW91dChhKHRoaXMuX3Jlc2V0U3RhdGUsdGhpcyksMCksdD1uZXcgcyh0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9zdGFydFBvaW50KSx0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludCkpLHRoaXMuX21hcC5maXRCb3VuZHModCkuZmlyZSgiYm94em9vbWVuZCIse2JveFpvb21Cb3VuZHM6dH0pKSl9LF9vbktleURvd246ZnVuY3Rpb24odCl7Mjc9PT10LmtleUNvZGUmJih0aGlzLl9maW5pc2goKSx0aGlzLl9jbGVhckRlZmVycmVkUmVzZXRTdGF0ZSgpLHRoaXMuX3Jlc2V0U3RhdGUoKSl9fSksQ3Q9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJib3hab29tIixfdCksQS5tZXJnZU9wdGlvbnMoe2RvdWJsZUNsaWNrWm9vbTohMH0pLG4uZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3RoaXMuX21hcC5vbigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LF9vbkRvdWJsZUNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPWUuZ2V0Wm9vbSgpLG49ZS5vcHRpb25zLnpvb21EZWx0YSxpPXQub3JpZ2luYWxFdmVudC5zaGlmdEtleT9pLW46aStuOyJjZW50ZXIiPT09ZS5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbT9lLnNldFpvb20oaSk6ZS5zZXRab29tQXJvdW5kKHQuY29udGFpbmVyUG9pbnQsaSl9fSkpLFp0PShBLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwiZG91YmxlQ2xpY2tab29tIixDdCksQS5tZXJnZU9wdGlvbnMoe2RyYWdnaW5nOiEwLGluZXJ0aWE6ITAsaW5lcnRpYURlY2VsZXJhdGlvbjozNDAwLGluZXJ0aWFNYXhTcGVlZDoxLzAsZWFzZUxpbmVhcml0eTouMix3b3JsZENvcHlKdW1wOiExLG1heEJvdW5kc1Zpc2Nvc2l0eTowfSksbi5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ7dGhpcy5fZHJhZ2dhYmxlfHwodD10aGlzLl9tYXAsdGhpcy5fZHJhZ2dhYmxlPW5ldyBYZSh0Ll9tYXBQYW5lLHQuX2NvbnRhaW5lciksdGhpcy5fZHJhZ2dhYmxlLm9uKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLHRoaXMuX2RyYWdnYWJsZS5vbigicHJlZHJhZyIsdGhpcy5fb25QcmVEcmFnTGltaXQsdGhpcyksdC5vcHRpb25zLndvcmxkQ29weUp1bXAmJih0aGlzLl9kcmFnZ2FibGUub24oInByZWRyYWciLHRoaXMuX29uUHJlRHJhZ1dyYXAsdGhpcyksdC5vbigiem9vbWVuZCIsdGhpcy5fb25ab29tRW5kLHRoaXMpLHQud2hlblJlYWR5KHRoaXMuX29uWm9vbUVuZCx0aGlzKSkpLE0odGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtZ3JhYiBsZWFmbGV0LXRvdWNoLWRyYWciKSx0aGlzLl9kcmFnZ2FibGUuZW5hYmxlKCksdGhpcy5fcG9zaXRpb25zPVtdLHRoaXMuX3RpbWVzPVtdfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3oodGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtZ3JhYiIpLHoodGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtdG91Y2gtZHJhZyIpLHRoaXMuX2RyYWdnYWJsZS5kaXNhYmxlKCl9LG1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3ZlZH0sbW92aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3Zpbmd9LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fbWFwO2UuX3N0b3AoKSx0aGlzLl9tYXAub3B0aW9ucy5tYXhCb3VuZHMmJnRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kc1Zpc2Nvc2l0eT8odD1nKHRoaXMuX21hcC5vcHRpb25zLm1heEJvdW5kcyksdGhpcy5fb2Zmc2V0TGltaXQ9Xyh0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludCh0LmdldE5vcnRoV2VzdCgpKS5tdWx0aXBseUJ5KC0xKSx0aGlzLl9tYXAubGF0TG5nVG9Db250YWluZXJQb2ludCh0LmdldFNvdXRoRWFzdCgpKS5tdWx0aXBseUJ5KC0xKS5hZGQodGhpcy5fbWFwLmdldFNpemUoKSkpLHRoaXMuX3Zpc2Nvc2l0eT1NYXRoLm1pbigxLE1hdGgubWF4KDAsdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzVmlzY29zaXR5KSkpOnRoaXMuX29mZnNldExpbWl0PW51bGwsZS5maXJlKCJtb3Zlc3RhcnQiKS5maXJlKCJkcmFnc3RhcnQiKSxlLm9wdGlvbnMuaW5lcnRpYSYmKHRoaXMuX3Bvc2l0aW9ucz1bXSx0aGlzLl90aW1lcz1bXSl9LF9vbkRyYWc6ZnVuY3Rpb24odCl7dmFyIGUsaTt0aGlzLl9tYXAub3B0aW9ucy5pbmVydGlhJiYoZT10aGlzLl9sYXN0VGltZT0rbmV3IERhdGUsaT10aGlzLl9sYXN0UG9zPXRoaXMuX2RyYWdnYWJsZS5fYWJzUG9zfHx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcyx0aGlzLl9wb3NpdGlvbnMucHVzaChpKSx0aGlzLl90aW1lcy5wdXNoKGUpLHRoaXMuX3BydW5lUG9zaXRpb25zKGUpKSx0aGlzLl9tYXAuZmlyZSgibW92ZSIsdCkuZmlyZSgiZHJhZyIsdCl9LF9wcnVuZVBvc2l0aW9uczpmdW5jdGlvbih0KXtmb3IoOzE8dGhpcy5fcG9zaXRpb25zLmxlbmd0aCYmNTA8dC10aGlzLl90aW1lc1swXTspdGhpcy5fcG9zaXRpb25zLnNoaWZ0KCksdGhpcy5fdGltZXMuc2hpZnQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksZT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KFswLDBdKTt0aGlzLl9pbml0aWFsV29ybGRPZmZzZXQ9ZS5zdWJ0cmFjdCh0KS54LHRoaXMuX3dvcmxkV2lkdGg9dGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKS5nZXRTaXplKCkueH0sX3Zpc2NvdXNMaW1pdDpmdW5jdGlvbih0LGUpe3JldHVybiB0LSh0LWUpKnRoaXMuX3Zpc2Nvc2l0eX0sX29uUHJlRHJhZ0xpbWl0OmZ1bmN0aW9uKCl7dmFyIHQsZTt0aGlzLl92aXNjb3NpdHkmJnRoaXMuX29mZnNldExpbWl0JiYodD10aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5zdWJ0cmFjdCh0aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zKSxlPXRoaXMuX29mZnNldExpbWl0LHQueDxlLm1pbi54JiYodC54PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LngsZS5taW4ueCkpLHQueTxlLm1pbi55JiYodC55PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LnksZS5taW4ueSkpLHQueD5lLm1heC54JiYodC54PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LngsZS5tYXgueCkpLHQueT5lLm1heC55JiYodC55PXRoaXMuX3Zpc2NvdXNMaW1pdCh0LnksZS5tYXgueSkpLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zPXRoaXMuX2RyYWdnYWJsZS5fc3RhcnRQb3MuYWRkKHQpKX0sX29uUHJlRHJhZ1dyYXA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93b3JsZFdpZHRoLGU9TWF0aC5yb3VuZCh0LzIpLGk9dGhpcy5faW5pdGlhbFdvcmxkT2Zmc2V0LG49dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MueCxvPShuLWUraSkldCtlLWksbj0obitlK2kpJXQtZS1pLHQ9TWF0aC5hYnMobytpKTxNYXRoLmFicyhuK2kpP286bjt0aGlzLl9kcmFnZ2FibGUuX2Fic1Bvcz10aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5jbG9uZSgpLHRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLng9dH0sX29uRHJhZ0VuZDpmdW5jdGlvbih0KXt2YXIgZSxpLG4sbyxzPXRoaXMuX21hcCxyPXMub3B0aW9ucyxhPSFyLmluZXJ0aWF8fHQubm9JbmVydGlhfHx0aGlzLl90aW1lcy5sZW5ndGg8MjtzLmZpcmUoImRyYWdlbmQiLHQpLCFhJiYodGhpcy5fcHJ1bmVQb3NpdGlvbnMoK25ldyBEYXRlKSx0PXRoaXMuX2xhc3RQb3Muc3VidHJhY3QodGhpcy5fcG9zaXRpb25zWzBdKSxhPSh0aGlzLl9sYXN0VGltZS10aGlzLl90aW1lc1swXSkvMWUzLGU9ci5lYXNlTGluZWFyaXR5LGE9KHQ9dC5tdWx0aXBseUJ5KGUvYSkpLmRpc3RhbmNlVG8oWzAsMF0pLGk9TWF0aC5taW4oci5pbmVydGlhTWF4U3BlZWQsYSksdD10Lm11bHRpcGx5QnkoaS9hKSxuPWkvKHIuaW5lcnRpYURlY2VsZXJhdGlvbiplKSwobz10Lm11bHRpcGx5QnkoLW4vMikucm91bmQoKSkueHx8by55KT8obz1zLl9saW1pdE9mZnNldChvLHMub3B0aW9ucy5tYXhCb3VuZHMpLHgoZnVuY3Rpb24oKXtzLnBhbkJ5KG8se2R1cmF0aW9uOm4sZWFzZUxpbmVhcml0eTplLG5vTW92ZVN0YXJ0OiEwLGFuaW1hdGU6ITB9KX0pKTpzLmZpcmUoIm1vdmVlbmQiKX19KSksU3Q9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJkcmFnZ2luZyIsWnQpLEEubWVyZ2VPcHRpb25zKHtrZXlib2FyZDohMCxrZXlib2FyZFBhbkRlbHRhOjgwfSksbi5leHRlbmQoe2tleUNvZGVzOntsZWZ0OlszN10scmlnaHQ6WzM5XSxkb3duOls0MF0sdXA6WzM4XSx6b29tSW46WzE4NywxMDcsNjEsMTcxXSx6b29tT3V0OlsxODksMTA5LDU0LDE3M119LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fc2V0UGFuRGVsdGEodC5vcHRpb25zLmtleWJvYXJkUGFuRGVsdGEpLHRoaXMuX3NldFpvb21EZWx0YSh0Lm9wdGlvbnMuem9vbURlbHRhKX0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAuX2NvbnRhaW5lcjt0LnRhYkluZGV4PD0wJiYodC50YWJJbmRleD0iMCIpLFModCx7Zm9jdXM6dGhpcy5fb25Gb2N1cyxibHVyOnRoaXMuX29uQmx1cixtb3VzZWRvd246dGhpcy5fb25Nb3VzZURvd259LHRoaXMpLHRoaXMuX21hcC5vbih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlSG9va3MoKSxrKHRoaXMuX21hcC5fY29udGFpbmVyLHtmb2N1czp0aGlzLl9vbkZvY3VzLGJsdXI6dGhpcy5fb25CbHVyLG1vdXNlZG93bjp0aGlzLl9vbk1vdXNlRG93bn0sdGhpcyksdGhpcy5fbWFwLm9mZih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LF9vbk1vdXNlRG93bjpmdW5jdGlvbigpe3ZhciB0LGUsaTt0aGlzLl9mb2N1c2VkfHwoaT1kb2N1bWVudC5ib2R5LHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9aS5zY3JvbGxUb3B8fHQuc2Nyb2xsVG9wLGk9aS5zY3JvbGxMZWZ0fHx0LnNjcm9sbExlZnQsdGhpcy5fbWFwLl9jb250YWluZXIuZm9jdXMoKSx3aW5kb3cuc2Nyb2xsVG8oaSxlKSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZD0hMCx0aGlzLl9tYXAuZmlyZSgiZm9jdXMiKX0sX29uQmx1cjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQ9ITEsdGhpcy5fbWFwLmZpcmUoImJsdXIiKX0sX3NldFBhbkRlbHRhOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9wYW5LZXlzPXt9LGk9dGhpcy5rZXlDb2RlcyxuPTAsbz1pLmxlZnQubGVuZ3RoO248bztuKyspZVtpLmxlZnRbbl1dPVstMSp0LDBdO2ZvcihuPTAsbz1pLnJpZ2h0Lmxlbmd0aDtuPG87bisrKWVbaS5yaWdodFtuXV09W3QsMF07Zm9yKG49MCxvPWkuZG93bi5sZW5ndGg7bjxvO24rKyllW2kuZG93bltuXV09WzAsdF07Zm9yKG49MCxvPWkudXAubGVuZ3RoO248bztuKyspZVtpLnVwW25dXT1bMCwtMSp0XX0sX3NldFpvb21EZWx0YTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fem9vbUtleXM9e30saT10aGlzLmtleUNvZGVzLG49MCxvPWkuem9vbUluLmxlbmd0aDtuPG87bisrKWVbaS56b29tSW5bbl1dPXQ7Zm9yKG49MCxvPWkuem9vbU91dC5sZW5ndGg7bjxvO24rKyllW2kuem9vbU91dFtuXV09LXR9LF9hZGRIb29rczpmdW5jdGlvbigpe1MoZG9jdW1lbnQsImtleWRvd24iLHRoaXMuX29uS2V5RG93bix0aGlzKX0sX3JlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7ayhkb2N1bWVudCwia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLHRoaXMpfSxfb25LZXlEb3duOmZ1bmN0aW9uKHQpe2lmKCEodC5hbHRLZXl8fHQuY3RybEtleXx8dC5tZXRhS2V5KSl7dmFyIGUsaSxuPXQua2V5Q29kZSxvPXRoaXMuX21hcDtpZihuIGluIHRoaXMuX3BhbktleXMpby5fcGFuQW5pbSYmby5fcGFuQW5pbS5faW5Qcm9ncmVzc3x8KGk9dGhpcy5fcGFuS2V5c1tuXSx0LnNoaWZ0S2V5JiYoaT1tKGkpLm11bHRpcGx5QnkoMykpLG8ub3B0aW9ucy5tYXhCb3VuZHMmJihpPW8uX2xpbWl0T2Zmc2V0KG0oaSksby5vcHRpb25zLm1heEJvdW5kcykpLG8ub3B0aW9ucy53b3JsZENvcHlKdW1wPyhlPW8ud3JhcExhdExuZyhvLnVucHJvamVjdChvLnByb2plY3Qoby5nZXRDZW50ZXIoKSkuYWRkKGkpKSksby5wYW5UbyhlKSk6by5wYW5CeShpKSk7ZWxzZSBpZihuIGluIHRoaXMuX3pvb21LZXlzKW8uc2V0Wm9vbShvLmdldFpvb20oKSsodC5zaGlmdEtleT8zOjEpKnRoaXMuX3pvb21LZXlzW25dKTtlbHNle2lmKDI3IT09bnx8IW8uX3BvcHVwfHwhby5fcG9wdXAub3B0aW9ucy5jbG9zZU9uRXNjYXBlS2V5KXJldHVybjtvLmNsb3NlUG9wdXAoKX1SZSh0KX19fSkpLEV0PShBLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwia2V5Ym9hcmQiLFN0KSxBLm1lcmdlT3B0aW9ucyh7c2Nyb2xsV2hlZWxab29tOiEwLHdoZWVsRGVib3VuY2VUaW1lOjQwLHdoZWVsUHhQZXJab29tTGV2ZWw6NjB9KSxuLmV4dGVuZCh7YWRkSG9va3M6ZnVuY3Rpb24oKXtTKHRoaXMuX21hcC5fY29udGFpbmVyLCJ3aGVlbCIsdGhpcy5fb25XaGVlbFNjcm9sbCx0aGlzKSx0aGlzLl9kZWx0YT0wfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2sodGhpcy5fbWFwLl9jb250YWluZXIsIndoZWVsIix0aGlzLl9vbldoZWVsU2Nyb2xsLHRoaXMpfSxfb25XaGVlbFNjcm9sbDpmdW5jdGlvbih0KXt2YXIgZT1IZSh0KSxpPXRoaXMuX21hcC5vcHRpb25zLndoZWVsRGVib3VuY2VUaW1lLGU9KHRoaXMuX2RlbHRhKz1lLHRoaXMuX2xhc3RNb3VzZVBvcz10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksdGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPStuZXcgRGF0ZSksTWF0aC5tYXgoaS0oK25ldyBEYXRlLXRoaXMuX3N0YXJ0VGltZSksMCkpO2NsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9c2V0VGltZW91dChhKHRoaXMuX3BlcmZvcm1ab29tLHRoaXMpLGUpLFJlKHQpfSxfcGVyZm9ybVpvb206ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsZT10LmdldFpvb20oKSxpPXRoaXMuX21hcC5vcHRpb25zLnpvb21TbmFwfHwwLG49KHQuX3N0b3AoKSx0aGlzLl9kZWx0YS8oNCp0aGlzLl9tYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsKSksbj00Kk1hdGgubG9nKDIvKDErTWF0aC5leHAoLU1hdGguYWJzKG4pKSkpL01hdGguTE4yLGk9aT9NYXRoLmNlaWwobi9pKSppOm4sbj10Ll9saW1pdFpvb20oZSsoMDx0aGlzLl9kZWx0YT9pOi1pKSktZTt0aGlzLl9kZWx0YT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLG4mJigiY2VudGVyIj09PXQub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20\/dC5zZXRab29tKGUrbik6dC5zZXRab29tQXJvdW5kKHRoaXMuX2xhc3RNb3VzZVBvcyxlK24pKX19KSksa3Q9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJzY3JvbGxXaGVlbFpvb20iLEV0KSxBLm1lcmdlT3B0aW9ucyh7dGFwSG9sZDpiLnRvdWNoTmF0aXZlJiZiLnNhZmFyaSYmYi5tb2JpbGUsdGFwVG9sZXJhbmNlOjE1fSksbi5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7Uyh0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Eb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe2sodGhpcy5fbWFwLl9jb250YWluZXIsInRvdWNoc3RhcnQiLHRoaXMuX29uRG93bix0aGlzKX0sX29uRG93bjpmdW5jdGlvbih0KXt2YXIgZTtjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpLDE9PT10LnRvdWNoZXMubGVuZ3RoJiYoZT10LnRvdWNoZXNbMF0sdGhpcy5fc3RhcnRQb3M9dGhpcy5fbmV3UG9zPW5ldyBwKGUuY2xpZW50WCxlLmNsaWVudFkpLHRoaXMuX2hvbGRUaW1lb3V0PXNldFRpbWVvdXQoYShmdW5jdGlvbigpe3RoaXMuX2NhbmNlbCgpLHRoaXMuX2lzVGFwVmFsaWQoKSYmKFMoZG9jdW1lbnQsInRvdWNoZW5kIixPKSxTKGRvY3VtZW50LCJ0b3VjaGVuZCB0b3VjaGNhbmNlbCIsdGhpcy5fY2FuY2VsQ2xpY2tQcmV2ZW50KSx0aGlzLl9zaW11bGF0ZUV2ZW50KCJjb250ZXh0bWVudSIsZSkpfSx0aGlzKSw2MDApLFMoZG9jdW1lbnQsInRvdWNoZW5kIHRvdWNoY2FuY2VsIGNvbnRleHRtZW51Iix0aGlzLl9jYW5jZWwsdGhpcyksUyhkb2N1bWVudCwidG91Y2htb3ZlIix0aGlzLl9vbk1vdmUsdGhpcykpfSxfY2FuY2VsQ2xpY2tQcmV2ZW50OmZ1bmN0aW9uIHQoKXtrKGRvY3VtZW50LCJ0b3VjaGVuZCIsTyksayhkb2N1bWVudCwidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHQpfSxfY2FuY2VsOmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KSxrKGRvY3VtZW50LCJ0b3VjaGVuZCB0b3VjaGNhbmNlbCBjb250ZXh0bWVudSIsdGhpcy5fY2FuY2VsLHRoaXMpLGsoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5fb25Nb3ZlLHRoaXMpfSxfb25Nb3ZlOmZ1bmN0aW9uKHQpe3Q9dC50b3VjaGVzWzBdO3RoaXMuX25ld1Bvcz1uZXcgcCh0LmNsaWVudFgsdC5jbGllbnRZKX0sX2lzVGFwVmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV3UG9zLmRpc3RhbmNlVG8odGhpcy5fc3RhcnRQb3MpPD10aGlzLl9tYXAub3B0aW9ucy50YXBUb2xlcmFuY2V9LF9zaW11bGF0ZUV2ZW50OmZ1bmN0aW9uKHQsZSl7dD1uZXcgTW91c2VFdmVudCh0LHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsdmlldzp3aW5kb3csc2NyZWVuWDplLnNjcmVlblgsc2NyZWVuWTplLnNjcmVlblksY2xpZW50WDplLmNsaWVudFgsY2xpZW50WTplLmNsaWVudFl9KTt0Ll9zaW11bGF0ZWQ9ITAsZS50YXJnZXQuZGlzcGF0Y2hFdmVudCh0KX19KSksT3Q9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0YXBIb2xkIixrdCksQS5tZXJnZU9wdGlvbnMoe3RvdWNoWm9vbTpiLnRvdWNoLGJvdW5jZUF0Wm9vbUxpbWl0czohMH0pLG4uZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe00odGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtdG91Y2gtem9vbSIpLFModGhpcy5fbWFwLl9jb250YWluZXIsInRvdWNoc3RhcnQiLHRoaXMuX29uVG91Y2hTdGFydCx0aGlzKX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXt6KHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LXRvdWNoLXpvb20iKSxrKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24odCl7dmFyIGUsaSxuPXRoaXMuX21hcDshdC50b3VjaGVzfHwyIT09dC50b3VjaGVzLmxlbmd0aHx8bi5fYW5pbWF0aW5nWm9vbXx8dGhpcy5fem9vbWluZ3x8KGU9bi5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0LnRvdWNoZXNbMF0pLGk9bi5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0LnRvdWNoZXNbMV0pLHRoaXMuX2NlbnRlclBvaW50PW4uZ2V0U2l6ZSgpLl9kaXZpZGVCeSgyKSx0aGlzLl9zdGFydExhdExuZz1uLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodGhpcy5fY2VudGVyUG9pbnQpLCJjZW50ZXIiIT09bi5vcHRpb25zLnRvdWNoWm9vbSYmKHRoaXMuX3BpbmNoU3RhcnRMYXRMbmc9bi5jb250YWluZXJQb2ludFRvTGF0TG5nKGUuYWRkKGkpLl9kaXZpZGVCeSgyKSkpLHRoaXMuX3N0YXJ0RGlzdD1lLmRpc3RhbmNlVG8oaSksdGhpcy5fc3RhcnRab29tPW4uZ2V0Wm9vbSgpLHRoaXMuX21vdmVkPSExLHRoaXMuX3pvb21pbmc9ITAsbi5fc3RvcCgpLFMoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUsdGhpcyksUyhkb2N1bWVudCwidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksTyh0KSl9LF9vblRvdWNoTW92ZTpmdW5jdGlvbih0KXtpZih0LnRvdWNoZXMmJjI9PT10LnRvdWNoZXMubGVuZ3RoJiZ0aGlzLl96b29taW5nKXt2YXIgZT10aGlzLl9tYXAsaT1lLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1swXSksbj1lLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1sxXSksbz1pLmRpc3RhbmNlVG8obikvdGhpcy5fc3RhcnREaXN0O2lmKHRoaXMuX3pvb209ZS5nZXRTY2FsZVpvb20obyx0aGlzLl9zdGFydFpvb20pLCFlLm9wdGlvbnMuYm91bmNlQXRab29tTGltaXRzJiYodGhpcy5fem9vbTxlLmdldE1pblpvb20oKSYmbzwxfHx0aGlzLl96b29tPmUuZ2V0TWF4Wm9vbSgpJiYxPG8pJiYodGhpcy5fem9vbT1lLl9saW1pdFpvb20odGhpcy5fem9vbSkpLCJjZW50ZXIiPT09ZS5vcHRpb25zLnRvdWNoWm9vbSl7aWYodGhpcy5fY2VudGVyPXRoaXMuX3N0YXJ0TGF0TG5nLDE9PW8pcmV0dXJufWVsc2V7aT1pLl9hZGQobikuX2RpdmlkZUJ5KDIpLl9zdWJ0cmFjdCh0aGlzLl9jZW50ZXJQb2ludCk7aWYoMT09byYmMD09PWkueCYmMD09PWkueSlyZXR1cm47dGhpcy5fY2VudGVyPWUudW5wcm9qZWN0KGUucHJvamVjdCh0aGlzLl9waW5jaFN0YXJ0TGF0TG5nLHRoaXMuX3pvb20pLnN1YnRyYWN0KGkpLHRoaXMuX3pvb20pfXRoaXMuX21vdmVkfHwoZS5fbW92ZVN0YXJ0KCEwLCExKSx0aGlzLl9tb3ZlZD0hMCkscih0aGlzLl9hbmltUmVxdWVzdCk7bj1hKGUuX21vdmUsZSx0aGlzLl9jZW50ZXIsdGhpcy5fem9vbSx7cGluY2g6ITAscm91bmQ6ITF9LHZvaWQgMCk7dGhpcy5fYW5pbVJlcXVlc3Q9eChuLHRoaXMsITApLE8odCl9fSxfb25Ub3VjaEVuZDpmdW5jdGlvbigpe3RoaXMuX21vdmVkJiZ0aGlzLl96b29taW5nPyh0aGlzLl96b29taW5nPSExLHIodGhpcy5fYW5pbVJlcXVlc3QpLGsoZG9jdW1lbnQsInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUsdGhpcyksayhkb2N1bWVudCwidG91Y2hlbmQgdG91Y2hjYW5jZWwiLHRoaXMuX29uVG91Y2hFbmQsdGhpcyksdGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbj90aGlzLl9tYXAuX2FuaW1hdGVab29tKHRoaXMuX2NlbnRlcix0aGlzLl9tYXAuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSwhMCx0aGlzLl9tYXAub3B0aW9ucy56b29tU25hcCk6dGhpcy5fbWFwLl9yZXNldFZpZXcodGhpcy5fY2VudGVyLHRoaXMuX21hcC5fbGltaXRab29tKHRoaXMuX3pvb20pKSk6dGhpcy5fem9vbWluZz0hMX19KSksWGk9KEEuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0b3VjaFpvb20iLE90KSxBLkJveFpvb209X3QsQS5Eb3VibGVDbGlja1pvb209Q3QsQS5EcmFnPVp0LEEuS2V5Ym9hcmQ9U3QsQS5TY3JvbGxXaGVlbFpvb209RXQsQS5UYXBIb2xkPWt0LEEuVG91Y2hab29tPU90LHQuQm91bmRzPWYsdC5Ccm93c2VyPWIsdC5DUlM9b3QsdC5DYW52YXM9RmksdC5DaXJjbGU9dmksdC5DaXJjbGVNYXJrZXI9Z2ksdC5DbGFzcz1ldCx0LkNvbnRyb2w9Qix0LkRpdkljb249UmksdC5EaXZPdmVybGF5PUFpLHQuRG9tRXZlbnQ9bXQsdC5Eb21VdGlsPXB0LHQuRHJhZ2dhYmxlPVhlLHQuRXZlbnRlZD1pdCx0LkZlYXR1cmVHcm91cD1jaSx0Lkdlb0pTT049d2ksdC5HcmlkTGF5ZXI9TmksdC5IYW5kbGVyPW4sdC5JY29uPWRpLHQuSW1hZ2VPdmVybGF5PUVpLHQuTGF0TG5nPXYsdC5MYXRMbmdCb3VuZHM9cyx0LkxheWVyPW8sdC5MYXllckdyb3VwPXVpLHQuTGluZVV0aWw9dnQsdC5NYXA9QSx0Lk1hcmtlcj1taSx0Lk1peGluPWZ0LHQuUGF0aD1maSx0LlBvaW50PXAsdC5Qb2x5VXRpbD1ndCx0LlBvbHlnb249eGksdC5Qb2x5bGluZT15aSx0LlBvcHVwPUJpLHQuUG9zQW5pbWF0aW9uPUZlLHQuUHJvamVjdGlvbj13dCx0LlJlY3RhbmdsZT1ZaSx0LlJlbmRlcmVyPVdpLHQuU1ZHPUdpLHQuU1ZHT3ZlcmxheT1PaSx0LlRpbGVMYXllcj1EaSx0LlRvb2x0aXA9SWksdC5UcmFuc2Zvcm1hdGlvbj1hdCx0LlV0aWw9dHQsdC5WaWRlb092ZXJsYXk9a2ksdC5iaW5kPWEsdC5ib3VuZHM9Xyx0LmNhbnZhcz1VaSx0LmNpcmNsZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG5ldyB2aSh0LGUsaSl9LHQuY2lyY2xlTWFya2VyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBnaSh0LGUpfSx0LmNvbnRyb2w9VWUsdC5kaXZJY29uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUmkodCl9LHQuZXh0ZW5kPWwsdC5mZWF0dXJlR3JvdXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGNpKHQsZSl9LHQuZ2VvSlNPTj1TaSx0Lmdlb0pzb249TXQsdC5ncmlkTGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBOaSh0KX0sdC5pY29uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZGkodCl9LHQuaW1hZ2VPdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IEVpKHQsZSxpKX0sdC5sYXRMbmc9dyx0LmxhdExuZ0JvdW5kcz1nLHQubGF5ZXJHcm91cD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgdWkodCxlKX0sdC5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEEodCxlKX0sdC5tYXJrZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG1pKHQsZSl9LHQucG9pbnQ9bSx0LnBvbHlnb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHhpKHQsZSl9LHQucG9seWxpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHlpKHQsZSl9LHQucG9wdXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEJpKHQsZSl9LHQucmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBZaSh0LGUpfSx0LnNldE9wdGlvbnM9Yyx0LnN0YW1wPWgsdC5zdmc9S2ksdC5zdmdPdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IE9pKHQsZSxpKX0sdC50aWxlTGF5ZXI9amksdC50b29sdGlwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBJaSh0LGUpfSx0LnRyYW5zZm9ybWF0aW9uPWh0LHQudmVyc2lvbj0iMS45LjQiLHQudmlkZW9PdmVybGF5PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbmV3IGtpKHQsZSxpKX0sd2luZG93LkwpO3Qubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuTD1YaSx0aGlzfSx3aW5kb3cuTD10fSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWxlYWZsZXQuanMubWFw\")));document.head.appendChild(s)})();<\/script>\n<script>(function(){function go(){if(!window.L){return setTimeout(go,100)}var el=document.getElementById(\"nvg-deal-map\");if(!el||el._nvg)return;el._nvg=1;\nvar pins=[{\"lat\": 44.813971, \"lng\": -93.265804}, {\"lat\": 45.198157, \"lng\": -93.255843}, {\"lat\": 45.077977, \"lng\": -93.331911}, {\"lat\": 45.106381, \"lng\": -93.367936}, {\"lat\": 45.108061, \"lng\": -93.380367}, {\"lat\": 45.000687, \"lng\": -93.317435}, {\"lat\": 44.993817, \"lng\": -93.251208}, {\"lat\": 45.036459, \"lng\": -93.375509}, {\"lat\": 44.951839, \"lng\": -93.349114}, {\"lat\": 44.961142, \"lng\": -93.025376}, {\"lat\": 44.986882, \"lng\": -93.044605}, {\"lat\": 45.076045, \"lng\": -93.290005}, {\"lat\": 44.95544, \"lng\": -93.135805}, {\"lat\": 44.910569, \"lng\": -93.752307}, {\"lat\": 44.923108, \"lng\": -93.355551}, {\"lat\": 45.035882, \"lng\": -93.350306}, {\"lat\": 44.978214, \"lng\": -93.448754}, {\"lat\": 45.034277, \"lng\": -93.168345}, {\"lat\": 44.86927, \"lng\": -93.266758}, {\"lat\": 44.947284, \"lng\": -93.185561}, {\"lat\": 44.936731, \"lng\": -93.219117}, {\"lat\": 45.250887, \"lng\": -93.394355}, {\"lat\": 45.258096, \"lng\": -93.293534}, {\"lat\": 44.955777, \"lng\": -93.033571}, {\"lat\": 44.964385, \"lng\": -93.217593}, {\"lat\": 44.944151, \"lng\": -93.152946}, {\"lat\": 45.024031, \"lng\": -92.777127}, {\"lat\": 44.984126, \"lng\": -93.018532}, {\"lat\": 44.949676, \"lng\": -93.349556}, {\"lat\": 44.878467, \"lng\": -93.313146}, {\"lat\": 45.037888, \"lng\": -93.247319}, {\"lat\": 44.963925, \"lng\": -93.279471}, {\"lat\": 44.949146, \"lng\": -93.277912}, {\"lat\": 44.956441, \"lng\": -93.260779}, {\"lat\": 44.951868, \"lng\": -93.217075}, {\"lat\": 44.947663, \"lng\": -93.364288}, {\"lat\": 44.903122, \"lng\": -93.528324}, {\"lat\": 44.861575, \"lng\": -93.25442}, {\"lat\": 45.05327, \"lng\": -93.227941}, {\"lat\": 44.930857, \"lng\": -93.276743}, {\"lat\": 44.925641, \"lng\": -93.42041}, {\"lat\": 44.956173, \"lng\": -93.407507}, {\"lat\": 44.947253, \"lng\": -93.358229}, {\"lat\": 44.959654, \"lng\": -93.047605}, {\"lat\": 44.980822, \"lng\": -93.068958}, {\"lat\": 44.922498, \"lng\": -93.092901}, {\"lat\": 44.929748, \"lng\": -93.168862}, {\"lat\": 45.034668, \"lng\": -93.225495}, {\"lat\": 44.931706, \"lng\": -93.28652}, {\"lat\": 44.838729, \"lng\": -93.408524}, {\"lat\": 44.959183, \"lng\": -93.172132}, {\"lat\": 44.959615, \"lng\": -93.298973}, {\"lat\": 45.040678, \"lng\": -93.251246}, {\"lat\": 44.957271, \"lng\": -93.40753}, {\"lat\": 45.299171, \"lng\": -93.600094}, {\"lat\": 44.972729, \"lng\": -93.308437}, {\"lat\": 44.82126, \"lng\": -92.960876}, {\"lat\": 44.964594, \"lng\": -93.349599}, {\"lat\": 45.225204, \"lng\": -92.879359}, {\"lat\": 44.823288, \"lng\": -93.040336}, {\"lat\": 44.971019, \"lng\": -93.057299}, {\"lat\": 44.937874, \"lng\": -93.273412}, {\"lat\": 44.958052, \"lng\": -93.102827}, {\"lat\": 44.973725, \"lng\": -93.056251}, {\"lat\": 44.977981, \"lng\": -93.129409}, {\"lat\": 44.946171, \"lng\": -92.946408}, {\"lat\": 44.838616, \"lng\": -93.44553}, {\"lat\": 44.901724, \"lng\": -93.061649}, {\"lat\": 44.873004, \"lng\": -93.640558}, {\"lat\": 44.911917, \"lng\": -93.17759}, {\"lat\": 45.074136, \"lng\": -93.366089}, {\"lat\": 44.816162, \"lng\": -93.618031}, {\"lat\": 44.901464, \"lng\": -93.604989}, {\"lat\": 44.961146, \"lng\": -93.4689}, {\"lat\": 44.937728, \"lng\": -93.235687}, {\"lat\": 44.880548, \"lng\": -93.249615}, {\"lat\": 44.968944, \"lng\": -93.080782}, {\"lat\": 44.886172, \"lng\": -93.35804}, {\"lat\": 44.956837, \"lng\": -93.362105}, {\"lat\": 44.832336, \"lng\": -93.440384}, {\"lat\": 44.852851, \"lng\": -93.647038}, {\"lat\": 44.822372, \"lng\": -93.408828}, {\"lat\": 45.022924, \"lng\": -93.159142}, {\"lat\": 44.990471, \"lng\": -93.076619}, {\"lat\": 44.95322, \"lng\": -93.356119}, {\"lat\": 45.262672, \"lng\": -92.960949}, {\"lat\": 45.036958, \"lng\": -93.392093}, {\"lat\": 44.946081, \"lng\": -93.46148}, {\"lat\": 44.880694, \"lng\": -93.248444}, {\"lat\": 44.756617, \"lng\": -93.292285}, {\"lat\": 45.038144, \"lng\": -93.235453}, {\"lat\": 44.960936, \"lng\": -93.145876}, {\"lat\": 44.871039, \"lng\": -93.513484}, {\"lat\": 44.871668, \"lng\": -93.031414}, {\"lat\": 44.757703, \"lng\": -93.291111}, {\"lat\": 44.945275, \"lng\": -93.464434}, {\"lat\": 45.017527, \"lng\": -93.254127}, {\"lat\": 44.879621, \"lng\": -93.44964}, {\"lat\": 44.875124, \"lng\": -93.261562}, {\"lat\": 44.988069, \"lng\": -93.042863}, {\"lat\": 44.937259, \"lng\": -93.254445}, {\"lat\": 44.931633, \"lng\": -93.275641}, {\"lat\": 44.880058, \"lng\": -92.981278}, {\"lat\": 44.881356, \"lng\": -93.116999}, {\"lat\": 44.877814, \"lng\": -93.384208}, {\"lat\": 44.95483, \"lng\": -93.064948}, {\"lat\": 44.797369, \"lng\": -93.146407}, {\"lat\": 44.957946, \"lng\": -93.22758}, {\"lat\": 44.942803, \"lng\": -93.232815}, {\"lat\": 45.092338, \"lng\": -93.367226}, {\"lat\": 44.755168, \"lng\": -93.239851}, {\"lat\": 44.912672, \"lng\": -93.476948}, {\"lat\": 45.117735, \"lng\": -93.365016}, {\"lat\": 44.953897, \"lng\": -93.415155}, {\"lat\": 45.042153, \"lng\": -93.243203}, {\"lat\": 44.912892, \"lng\": -93.181811}, {\"lat\": 45.003308, \"lng\": -93.397681}, {\"lat\": 45.075446, \"lng\": -93.15913}, {\"lat\": 45.393182, \"lng\": -93.87689}, {\"lat\": 46.011341, \"lng\": -92.944371}, {\"lat\": 45.386428, \"lng\": -93.359708}, {\"lat\": 44.955674, \"lng\": -93.224471}, {\"lat\": 44.943923, \"lng\": -93.27557}, {\"lat\": 44.936676, \"lng\": -93.080023}, {\"lat\": 44.981391, \"lng\": -93.306534}, {\"lat\": 44.751414, \"lng\": -93.323567}];\nvar ic=L.icon({iconUrl:\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq\/bXZtrp\/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq\/RBpykd8oZUb\/kaJutow8r1aP9II0WmLKLIsJyv1w\/kqw9Ch2MYdB++12Onxee\/QMwvf4\/Dk\/Lfp\/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg\/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7\/XZKNH+9+hBLOHYozuKQPxyMPUKkrX\/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue\/uDivd3fkWRbS6\/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7\/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5\/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn\/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g\/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2\/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD\/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF\/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk\/4kggu40ZTvIEm5g24qtU4KjBrx\/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG\/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR\/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+\/FrIjweHQS4\/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=\",iconRetinaUrl:\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABSCAMAAAAhFXfZAAAC91BMVEVMaXEzeak2f7I4g7g3g7cua5gzeKg8hJo3grY4g7c3grU0gLI2frE0daAubJc2gbQwd6QzeKk2gLMtd5sxdKIua5g1frA2f7IydaM0e6w2fq41fK01eqo3grgubJgta5cxdKI1f7AydaQydaMxc6EubJgvbJkwcZ4ubZkwcJwubZgubJcydqUydKIxapgubJctbJcubZcubJcvbJYubJcvbZkubJctbJctbZcubJg2f7AubJcrbZcubJcubJcua5g3grY0fq8ubJcubJdEkdEwhsw6i88vhswuhcsuhMtBjMgthMsrg8srgss6is8qgcs8i9A9iMYtg8spgcoogMo7hcMngMonf8olfso4gr8kfck5iM8jfMk4iM8he8k1fro7itAgesk2hs8eecgzfLcofssdeMg0hc4cd8g2hcsxeLQbdsgZdcgxeLImfcszhM0vda4xgckzhM4xg84wf8Yxgs4udKsvfcQucqhUndROmdM1fK0wcZ8vb5w0eqpQm9MzeKhXoNVcpdYydKNWn9VZotVKltJFjsIwcJ1Rms9OlslLmtH\/\/\/8+kc9epdYzd6dbo9VHkMM2f7FHmNBClM8ydqVcpNY9hro3gLM9hLczealQmcw3fa46f7A8gLMxc6I3eagyc6FIldJMl9JSnNRSntNNl9JPnNJFi75UnM9ZodVKksg8kM45jc09e6ZHltFBk883gbRBh7pDk9EwcaBzn784g7dKkcY2i81Om9M7j85Llc81is09g7Q4grY\/j9A0eqxKmdFFltBEjcXf6fFImdBCiLxJl9FGlNFBi78yiMxVndEvbpo6js74+vx+psPP3+o\/ks5HkcpGmNCjwdZCkNDM3ehYoNJEls+lxNkxh8xHks0+jdC1zd5Lg6r+\/v\/H2ufz9\/o3jM3t8\/edvdM\/k89Th61OiLBSjbZklbaTt9BfptdjmL1AicBHj8hGk9FAgK1dkLNTjLRekrdClc\/k7fM0icy0y9tgp9c4jc2NtM9Dlc8zicxeXZn3AAAAQ3RSTlMAHDdTb4yPA+LtnEQmC4L2EmHqB7XA0d0sr478x4\/Yd5i1zOfyPkf1sLVq4Nh3FvjxopQ2\/STNuFzUwFIwxKaejILpIBEV9wAABhVJREFUeF6s1NdyFEcYBeBeoQIhRAkLlRDGrhIgY3BJL8CVeKzuyXFzzjkn5ZxzzuScg3PO8cKzu70JkO0LfxdTU\/\/pM9vTu7Xgf6KqOVTb9X7toRrVEfBf1HTVjZccrT\/2by1VV928Yty9ZbVuucdz90frG8DBjl9pVApbOstvmMuvVgaNXSfAAd6pGxpy6yxf5ph43pS\/4f3uoaGm2rdu72S9xzOvMymkZFq\/ptDrk90mhW7e4zl7HLzhxGWPR20xmSxJ\/VqldG5m9XhaVOA1DadsNh3Pu5L2N6QtPO\/32JpqQBVVk20oy\/Pi2s23WEvyfHbe1thadVQttvm7Llf65gGmXK67XtupyoM7HQhmXdLS8oGWJNeOJ3C5fG5XCEJnkez3\/oFdsvgJ4l2ANZwhrJKk\/7OSXa+3Vw2WJMlKnGkobouYk6T0TyX30klOUnTD9HJ5qpckL3EW\/w4XF3Xd0FGywXUrstrclVsqz5Pd\/sXFYyDnPdrLcQODmGOK47IZb4CmibmMn+MYRzFZ5jg33ZL\/EJrWcszHmANy3ARBK\/IXtciJy8VsitPSdE3uuHxzougojcUdr8\/32atnz\/ev3f\/K5wtpxUTpcaI45zusVDpYtZi+jg0oU9b3x74h7+n9ABvYEZeKaVq0sh0AtLKsFtqNBdeT0MrSzwwlq9+x6xAO4tgOtSzbCjrNQQiNvQUbUEubvzBUeGw26yDCsRHCoLkTHDa7IdOLIThs\/gHvChszh2CimE8peRs47cxANI0lYNB5y1DljpOF0IhzBDPOZnDOqYYbeGKECbPzWnXludPphw5c2YBq5zlwXphIbO4VDCZ0gnPfUO1TwZoYwAs2ExPCedAu9DAjfQUjzITQb3jNj0KG2Sgt6BHaQUdYzWz+XmBktOHwanXjaSTcwwziBcuMOtwBmqPrTOxFQR\/DRKKPqyur0aiW6cULYsx6tBm0jXpR\/AUWR6HRq9WVW6MRhIq5jLyjbaCTDCijyYJNpCajdyobP\/eTw0iexBAKkJ3gA5KcQb2zBXsIBckn+xVv8jkZSaEFHE+jFEleAEfayRU0MouNoBmB\/L50Ai\/HSLIHxcrpCvnhSQAuakKp2C\/YbCylJjXRVy\/z3+Kv\/RrNcCo+WUzlVEhzKffnTQnxeN9fWF88fiNCUdSTsaufaChKWInHeysygfpIqagoakW+vV20J8uyl6TyNKEZWV4oRSPyCkWpgOLSbkCObT8o2r6tlG58HQquf6O0v50tB7JM7F4EORd2dx\/K0w\/KHsVkLPaoYrwgP\/y7krr3SSMA4zj+OBgmjYkxcdIJQyQRKgg2viX9Hddi9UBb29LrKR7CVVEEEXWojUkXNyfTNDE14W9gbHJNuhjDettN3ZvbOvdOqCD3Jp\/9l+\/wJE+9PkYGjx\/fqkys3S2rMozM\/o2106rfMUINo6hVqz+eu\/hd1c4xTg0TAfy5kV+4UG6+IthHTU9woWmxuKNbTfuCSfovBCxq7EtHqvYL4Sm6F8GVxsSXHMQ07TOi1DKtZxjWaaIyi4CXWjxPccUw8WVbMYY5wxC1mzEyXMJWkllpRloi+Kkoq69sxBTlElF6aAxYUbjXNlhlDZilDnM4U5SlN5biRsRHnbx3mbeWjEh4mEyiuJDl5XcWVmX5GvNkFgLWZM5qwsop4\/AWfLhU1cR7k1VVvcYCWRkOI6Xy5gmnphCYIkvzuNYzHzosq2oNk2RtSs8khfUOfHIDgR6ysYBaMpl4uEgk2U\/oJTs9AaTSwma7dT69geAE2ZpEjUsn2ieJNHeKfrI3EcAGJ2ZaNgVuC8EBctCLc57P5u5led6IOBkIYkuQMrmmjChs4VkfOerHqSBkPzZlhe06RslZ3zMjk2sscqKwY0RcjKK+LWbzd7KiHhkncs\/siFJ+V5eXxD34B8nVuJEpGJNmxN2gH3vSvp7J70tF+D1Ej8qUJD1TkErAND2GZwTFg\/LubvmgiBG3SOvdlsqFQrkEzJCL1rstlnVFROixZoDDSuXQFHESwVGlcuQcMb\/b42NgjLowh5MTDFE3vNB5qStRIErdCQEh6pLPR92anSUb\/wAIhldAaDMpGgAAAABJRU5ErkJggg==\",shadowUrl:\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz\/f9\/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL\/Th\/\/\/dyQN2TH6f3y\/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp\/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1\/TM+04kkBiAAAAAElFTkSuQmCC\",iconSize:[25,41],iconAnchor:[12,41],shadowSize:[41,41]});\nvar map=L.map(el,{scrollWheelZoom:false}).setView([44.9778,-93.265],10);\nL.tileLayer(\"https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png\",{maxZoom:15,attribution:'&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a>'}).addTo(map);\nvar b=[];pins.forEach(function(p){L.marker([p.lat,p.lng],{icon:ic,keyboard:false,interactive:false}).addTo(map);b.push([p.lat,p.lng])});\nif(b.length>1)map.fitBounds(b,{padding:[30,30]});}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",go);else go();})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Skip to content Agents &amp; BrokersLenders &amp; Lienholders Northern Value GroupTwin Cities cash home buyers <a href=\"https:\/\/northernvaluegroup.com\/?page_id=7283\">Read more<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-full-width.php","meta":{"footnotes":""},"class_list":["post-7283","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=\/wp\/v2\/pages\/7283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7283"}],"version-history":[{"count":11,"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=\/wp\/v2\/pages\/7283\/revisions"}],"predecessor-version":[{"id":7317,"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=\/wp\/v2\/pages\/7283\/revisions\/7317"}],"wp:attachment":[{"href":"https:\/\/northernvaluegroup.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}