{"id":1124,"date":"2023-09-01T07:19:42","date_gmt":"2023-09-01T07:19:42","guid":{"rendered":"https:\/\/hotellerv6-5.themegoods.com\/?page_id=1124"},"modified":"2026-10-26T17:17:18","modified_gmt":"2026-10-26T16:17:18","slug":"home-2","status":"publish","type":"page","link":"https:\/\/www.suitedelpittore.com\/en\/","title":{"rendered":"Home"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1124\" class=\"elementor elementor-1124\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3255a75 e-con-full e-flex e-con e-parent\" data-id=\"3255a75\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;hoteller_ext_is_background_parallax&quot;:&quot;false&quot;,&quot;hoteller_ext_is_background_backdrop&quot;:&quot;false&quot;,&quot;hoteller_ext_is_background_on_scroll&quot;:&quot;false&quot;,&quot;hoteller_ext_link_sidemenu&quot;:&quot;false&quot;,&quot;hoteller_ext_link_fullmenu&quot;:&quot;false&quot;,&quot;hoteller_ext_link_closed_fullmenu&quot;:&quot;false&quot;,&quot;hoteller_ext_is_scrollme&quot;:&quot;false&quot;,&quot;hoteller_ext_is_smoove&quot;:&quot;false&quot;,&quot;hoteller_ext_is_parallax_mouse&quot;:&quot;false&quot;,&quot;hoteller_ext_is_infinite&quot;:&quot;false&quot;,&quot;hoteller_ext_is_fadeout_animation&quot;:&quot;false&quot;,&quot;hoteller_ext_mobile_static&quot;:&quot;false&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-43c1b72 elementor-widget elementor-widget-html\" data-id=\"43c1b72\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;hoteller_ext_link_sidemenu&quot;:&quot;false&quot;,&quot;hoteller_ext_link_fullmenu&quot;:&quot;false&quot;,&quot;hoteller_ext_link_closed_fullmenu&quot;:&quot;false&quot;,&quot;hoteller_ext_is_scrollme&quot;:&quot;false&quot;,&quot;hoteller_ext_is_smoove&quot;:&quot;false&quot;,&quot;hoteller_ext_is_parallax_mouse&quot;:&quot;false&quot;,&quot;hoteller_ext_is_infinite&quot;:&quot;false&quot;,&quot;hoteller_ext_is_fadeout_animation&quot;:&quot;false&quot;,&quot;hoteller_ext_mobile_static&quot;:&quot;false&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>.elementor-element-43c1b72{display:none !important}<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bea74cc elementor-widget elementor-widget-html\" data-id=\"bea74cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;hoteller_ext_link_sidemenu&quot;:&quot;false&quot;,&quot;hoteller_ext_link_fullmenu&quot;:&quot;false&quot;,&quot;hoteller_ext_link_closed_fullmenu&quot;:&quot;false&quot;,&quot;hoteller_ext_is_scrollme&quot;:&quot;false&quot;,&quot;hoteller_ext_is_smoove&quot;:&quot;false&quot;,&quot;hoteller_ext_is_parallax_mouse&quot;:&quot;false&quot;,&quot;hoteller_ext_is_infinite&quot;:&quot;false&quot;,&quot;hoteller_ext_is_fadeout_animation&quot;:&quot;false&quot;,&quot;hoteller_ext_mobile_static&quot;:&quot;false&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style id=\"sdp-prenota-top-css\">html #sdp .sdp-prenota-top{position:fixed;top:24px;left:max(23px,calc((100vw - var(--maxw))\/2 + 23px));z-index:70;height:48px;display:inline-flex;align-items:center;padding:0 20px;border:1px solid var(--sand);border-radius:24px;background:rgba(43,38,33,.72);color:var(--sand);font-family:var(--body);font-size:.72rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;text-decoration:none;white-space:nowrap;transition:background .2s,color .2s}html #sdp .sdp-prenota-top:hover,html #sdp .sdp-prenota-top:focus-visible{background:var(--sand);color:var(--ink)}html body.admin-bar #sdp .sdp-prenota-top{top:56px}@media (max-width:420px){html #sdp .sdp-prenota-top{left:16px;padding:0 14px;font-size:.64rem;letter-spacing:.12em}}<\/style>\n<style>@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n#sdp{all:revert;display:block}\n#sdp :where(*:not(svg,svg *)){all:revert}\n#sdp :where(script,style,template,[hidden]){display:none}\nbody{margin:0;background:#2B2621}\n@media (min-width: 1024px){#sdp .copertina.intera{height: 82vh; min-height: 520px; overflow: hidden;}\n#sdp .copertina.intera > img.ph{height: 100%; width: 100%; object-fit: cover;}\n#sdp figure.figura{max-width: 560px; margin-left: auto; margin-right: auto;}\n#sdp .coppia{max-width: 1000px; margin-left: auto; margin-right: auto;}\n#sdp .about{display: grid; grid-template-columns: 1fr 1fr; column-gap: 56px; max-width: var(--maxw); margin: 0px auto; padding-left: var(--gutter); padding-right: var(--gutter);}\n#sdp .about .about-head{grid-column: 1 \/ -1; padding-left: 0px; padding-right: 0px;}\n#sdp .about .plan3d{grid-column: 1; padding-top: 0px;}\n#sdp .about .plan3d iframe{height: 520px;}\n#sdp .about .about-body{grid-column: 2; padding: 0px;}\n#sdp .rooms{max-width: var(--maxw); margin-left: auto; margin-right: auto;}\n#sdp .track{max-width: 1000px; margin-left: auto; margin-right: auto;}\n#sdp .dark .g-nav{max-width: 1000px; margin-left: auto; margin-right: auto; padding: 0px;}}\nhtml #sdp .dots{gap: 2px; right: calc(var(--gutter) - 8px); bottom: calc(var(--s2) - 8px);}\nhtml #sdp .dots button{width: 24px; height: 24px; border: 0px; background: none; padding: 0px; display: grid; place-items: center; border-radius: 0px;}\nhtml #sdp .dots button::before{content: \"\"; width: 8px; height: 8px; border-radius: 50%; border: 1px solid rgba(255, 255, 255, 0.85); box-sizing: border-box;}\nhtml #sdp .dots button[aria-current=\"true\"]{background: none;}\nhtml #sdp .dots button[aria-current=\"true\"]::before{background: rgb(255, 255, 255);}\n#sdp{--cream: #F7F0E8; --sand: #EADCCB; --stone: #DED0BF; --ink: #2B2621; --ink-soft: #B9AC9A; --line: rgba(234,220,203,.24); --display: \"Cormorant Garamond\",Georgia,serif; --body: \"Karla\",-apple-system,Segoe UI,sans-serif; --s1: 8px; --s2: 16px; --s3: 24px; --s4: 40px; --s5: 64px; --s6: 96px; --gutter: 24px; --maxw: 1180px; --readw: 64ch;}\n#sdp *{box-sizing: border-box;}\n#sdp{text-size-adjust: 100%;}\n#sdp{margin: 0px; background: var(--ink); color: var(--sand); font-family: var(--body); font-weight: 300; font-size: 17px; line-height: 1.7; overflow-x: hidden; overflow-wrap: break-word;}\n#sdp img{max-width: 100%; display: block;}\n#sdp a{color: inherit;}\n#sdp .wrap{max-width: var(--maxw); margin: 0px auto; padding: 0 var(--gutter);}\n#sdp .read{max-width: var(--readw);}\n#sdp section{padding: var(--s6) 0;}\n@media (max-width: 760px){#sdp section{padding: var(--s5) 0;}}\n#sdp h1,#sdp h2,#sdp h3{font-family: var(--display); font-weight: 400; margin: 0px; letter-spacing: 0.01em;}\n#sdp h2{font-size: clamp(2rem, 5.5vw, 3rem); line-height: 1.1; margin-bottom: var(--s3);}\n#sdp h2 em{font-style: italic;}\n#sdp h3{font-size: 1.45rem; line-height: 1.25; margin-bottom: var(--s1);}\n#sdp p{margin: 0px 0px 1.1em;}\n#sdp p:last-child{margin-bottom: 0px;}\n#sdp header{position: sticky; top: 0px; z-index: 60; background: var(--ink); border: 0px; color: rgb(255, 255, 255);}\n#sdp .bar{position: relative; max-width: var(--maxw); margin: 0px auto; padding: 14px var(--gutter); min-height: 96px; display: flex; align-items: center; justify-content: flex-end;}\n#sdp .logo{position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: block; text-decoration: none; color: inherit;}\n#sdp .burger{background: none; border: 0px; padding: 10px; cursor: pointer; color: inherit; appearance: none; display: flex; flex-direction: column; gap: 5px;}\n#sdp .burger span{display: block; width: 26px; height: 1.5px; background: currentcolor;}\n#sdp .btn{display: inline-block; font-family: var(--body); font-size: 0.82rem; letter-spacing: 0.14em; text-transform: uppercase; text-decoration: none; padding: 13px 24px; border: 1px solid var(--sand); background: transparent; color: var(--sand); cursor: pointer; transition: background 0.18s, color 0.18s;}\n#sdp .btn:hover,#sdp .btn:focus-visible{background: var(--sand); color: var(--ink);}\n#sdp .btn--solid{background: var(--sand); color: var(--ink);}\n#sdp .btn--solid:hover,#sdp .btn--solid:focus-visible{background: transparent; color: var(--sand);}\n#sdp .menu{position: fixed; inset: 0px; z-index: 80; background: var(--ink); color: var(--sand); padding: var(--s4) var(--gutter); display: none; flex-direction: column;}\n#sdp .menu[data-open=\"true\"]{display: flex;}\n#sdp .menu-top{display: flex; justify-content: flex-end;}\n#sdp .menu-close{background: none; border: 0px; font-size: 1.7rem; line-height: 1; cursor: pointer; color: var(--sand); appearance: none; padding: 4px 8px;}\n#sdp .menu nav{flex: 1 1 0%; display: flex; flex-direction: column; justify-content: flex-start; gap: 16px; max-width: var(--maxw); margin: var(--s3) auto 0; width: 100%;}\n#sdp .menu nav a{font-family: var(--display); font-size: clamp(1.8rem, 7vw, 2.6rem); text-decoration: none; line-height: 1;}\n#sdp .menu nav a:hover{font-style: italic;}\n#sdp .menu-foot{font-size: 0.85rem; color: var(--ink-soft); max-width: var(--maxw); margin: 0px auto; width: 100%;}\n#sdp .hero{position: relative; height: 82vh; min-height: 480px; overflow: hidden; padding: 0px;}\n#sdp .hero .slide{position: absolute; inset: 0px; opacity: 0; transition: opacity 0.9s;}\n#sdp .hero .slide img{width: 100%; height: 100%; object-fit: cover; object-position: center center;}\n#sdp .hero .slide.on{opacity: 1;}\n#sdp .hero-copy{position: absolute; left: 0px; right: 0px; bottom: 0px; z-index: 3; padding: var(--s5) var(--gutter); background: linear-gradient(to top, rgba(28, 24, 20, 0.78), rgba(28, 24, 20, 0)); color: rgb(255, 255, 255);}\n#sdp .hero-copy .inner{max-width: var(--maxw); margin: 0px auto;}\n#sdp .hero h1{font-size: clamp(2.6rem, 8vw, 5rem); line-height: 1.05; margin: 0 0 var(--s3); font-weight: 300; text-wrap: balance;}\n#sdp .hero h1 em{font-style: italic; display: block; font-size: 0.72em; letter-spacing: 0.01em; margin-bottom: 0.12em;}\n#sdp .hero p{max-width: 52ch; font-size: 1.02rem; margin: 0px;}\n#sdp .dots{position: absolute; bottom: var(--s2); right: var(--gutter); z-index: 4; display: flex; gap: 9px;}\n#sdp .dots button{width: 8px; height: 8px; border-radius: 50%; border: 1px solid rgba(255, 255, 255, 0.85); background: transparent; padding: 0px; cursor: pointer;}\n#sdp .dots button[aria-current=\"true\"]{background: rgb(255, 255, 255);}\n#sdp .ph{width: 100%; height: 100%; background: var(--stone); display: flex; align-items: center; justify-content: center; font-family: var(--body); font-size: 0.72rem; letter-spacing: 0.2em; text-transform: uppercase; color: rgb(138, 122, 103); text-align: center; padding: var(--s2);}\n#sdp .ph--tall{aspect-ratio: 4 \/ 5; height: auto;}\n#sdp .ph--wide{aspect-ratio: 3 \/ 2; height: auto;}\n#sdp .about{background: var(--ink);}\n#sdp .split{display: grid; grid-template-columns: 1fr 1fr; gap: 0px; align-items: start;}\n#sdp .split .txt{padding: 0px clamp(24px, 5vw, 80px);}\n@media (max-width: 860px){#sdp .split{grid-template-columns: 1fr;}\n#sdp .split .txt{padding: var(--s4) var(--gutter) 0;}}\n#sdp .facts{list-style: none; margin: 0 0 var(--s4); padding: 0px; border-top: 1px solid var(--line);}\n#sdp .facts li{display: flex; justify-content: space-between; gap: var(--s2); padding: 12px 0px; border-bottom: 1px solid var(--line); font-size: 0.95rem;}\n#sdp .facts span:first-child{color: var(--ink-soft);}\n#sdp .actions{display: flex; flex-wrap: wrap; gap: 12px; margin-top: var(--s4);}\n#sdp .dark{background: var(--ink); color: var(--sand);}\n#sdp .dark h2,#sdp .dark h3,#sdp .dark h4{color: var(--sand);}\n#sdp .rooms{display: grid; grid-template-columns: 1fr 1fr; gap: 0px; margin-top: var(--s5);}\n@media (max-width: 760px){#sdp .rooms{grid-template-columns: 1fr; margin-top: var(--s4);}}\n#sdp .room figure{margin: 0px;}\n#sdp .room .cap{padding: var(--s3) var(--gutter) 0;}\n@media (min-width: 761px){#sdp .room:last-child .cap{padding-left: var(--s4);}}\n#sdp .room ul{list-style: none; margin: var(--s2) 0 0; padding: 0px; font-size: 0.94rem;}\n#sdp .room ul li{padding: 7px 0px; border-bottom: 1px solid rgba(234, 220, 203, 0.22);}\n#sdp .room .txt{font-size: 0.98rem; margin-top: var(--s2);}\n@media (max-width: 760px){#sdp .room + .room{margin-top: var(--s5);}}\n#sdp .track{position: relative; aspect-ratio: 2 \/ 1; overflow: hidden; margin-top: var(--s5);}\n@media (max-width: 760px){#sdp .track{aspect-ratio: 3 \/ 2;}}\n#sdp .track .slide{position: absolute; inset: 0px; opacity: 0; transition: opacity 0.5s;}\n#sdp .track .slide.on{opacity: 1;}\n#sdp .g-nav{display: flex; align-items: center; gap: var(--s2); margin-top: var(--s2);}\n#sdp .g-nav button{background: none; border: 1px solid rgba(234, 220, 203, 0.35); width: 44px; height: 44px; cursor: pointer; font-size: 1.1rem; line-height: 1; color: var(--sand);}\n#sdp .g-nav button:hover{background: rgba(234, 220, 203, 0.12);}\n#sdp .g-count{font-size: 0.85rem; color: rgba(234, 220, 203, 0.7); margin-left: auto;}\n#sdp .where{background: var(--ink);}\n#sdp .routes{display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s4); margin-top: var(--s5);}\n@media (max-width: 760px){#sdp .routes{grid-template-columns: 1fr; gap: var(--s3); margin-top: var(--s4);}}\n#sdp .route{border-top: 1px solid var(--line); padding-top: var(--s2);}\n#sdp .route h3{font-size: 1.2rem; margin-bottom: 6px;}\n#sdp .route p{font-size: 0.95rem;}\n#sdp .quote{background: var(--ink);}\n#sdp .quote .cols{display: grid; grid-template-columns: 1fr 1.15fr; gap: var(--s5); align-items: start;}\n@media (max-width: 860px){#sdp .quote .cols{grid-template-columns: 1fr; gap: var(--s4);}}\n#sdp .field{margin-bottom: var(--s3);}\n#sdp .field label{display: block; font-size: 0.78rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-soft); margin-bottom: 7px;}\n#sdp .field input,#sdp .field select,#sdp .field textarea{width: 100%; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-language-override: inherit; font-size: 16px; color: var(--sand); background: transparent; border: 1px solid var(--sand); border-radius: 0px; padding: 13px 14px; appearance: none; color-scheme: dark;}\n#sdp .field input::placeholder,#sdp .field textarea::placeholder{color: rgba(234, 220, 203, 0.45);}\n#sdp .field textarea{min-height: 110px; resize: vertical;}\n#sdp .field input:focus,#sdp .field select:focus,#sdp .field textarea:focus{outline: 2px solid var(--sand); outline-offset: -2px;}\n#sdp .two{display: grid; grid-template-columns: 1fr 1fr; gap: var(--s2);}\n#sdp .note{font-size: 0.85rem; color: var(--ink-soft); margin-top: var(--s2);}\n#sdp footer{padding: var(--s5) 0 var(--s3);}\n#sdp footer a{text-decoration: none; color: var(--sand);}\n#sdp footer a:hover{text-decoration: underline;}\n#sdp .f-grid{display: grid; grid-template-columns: 1.2fr 1fr 1fr; gap: var(--s4);}\n@media (max-width: 760px){#sdp .f-grid{grid-template-columns: 1fr; gap: var(--s3);}}\n#sdp .f-grid h4{font-family: var(--display); font-weight: 400; font-size: 1.2rem; margin: 0 0 var(--s1);}\n#sdp .f-grid p,#sdp .f-grid li{font-size: 0.92rem; line-height: 1.8; color: rgba(234, 220, 203, 0.8);}\n#sdp .f-grid ul{list-style: none; margin: 0px; padding: 0px;}\n#sdp .f-bot{border-top: 1px solid rgba(234, 220, 203, 0.2); margin-top: var(--s4); padding-top: var(--s2); display: flex; flex-wrap: wrap; gap: var(--s2); justify-content: space-between; font-size: 0.82rem; color: rgba(234, 220, 203, 0.65);}\n#sdp .mark{height: 67px; width: 58.5px; color: currentcolor; display: block;}\n#sdp .logo .mark{margin: 0px auto;}\n#sdp .menu-top{align-items: center; justify-content: flex-end;}\n#sdp footer .mark{height: 74px; width: 64.7px; margin-bottom: var(--s2);}\n#sdp .sr{position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap;}\n@media (prefers-reduced-motion: reduce){#sdp *{transition: none !important; animation: auto ease 0s 1 normal none running none !important;}}\n#sdp .plan3d{margin: 0px; padding: var(--s4) 0; background: transparent;}\n#sdp .plan3d iframe{display: block; width: 100%; height: 400px; border: 0px; background: var(--ink);}\n@media (max-width: 760px){#sdp .plan3d iframe{height: 330px;}}\n#sdp img.ph--nat{display: block; width: 100%; height: auto;}\n#sdp img.ph--wide{display: block; width: 100%; aspect-ratio: 1 \/ 1; height: auto; object-fit: cover;}\n#sdp img.ph--free{display: block; width: 100%; aspect-ratio: 1 \/ 1; height: auto; object-fit: cover; object-position: center center;}\n#sdp .about-head,#sdp .about-body{max-width: var(--maxw); margin: 0px auto; padding: 0 var(--gutter);}\n#sdp .about-head{padding-bottom: var(--s4);}\n#sdp .about img.ph--nat{width: 100%; height: auto; display: block;}\n#sdp .track{aspect-ratio: 3 \/ 2;}\n@media (max-width: 760px){#sdp .track{aspect-ratio: 3 \/ 2;}}\n#sdp .track .slide img{width: 100%; height: 100%; object-fit: cover; object-position: center center;}\n#sdp .about img.ph--nat,#sdp .room figure img,#sdp .track{border-radius: 0px;}\nhtml #sdp hr.sep{display:block;height:0;border:0;border-top:1px solid rgba(234,220,203,.22);width:min(624px,calc(100% - 2 * var(--gutter)));margin:0 auto var(--s5);padding:0}\n\nhtml #sdp .hero .slide{transition:opacity 1.4s ease-in-out}\n\nhtml #sdp #track{cursor:pointer;-webkit-tap-highlight-color:transparent}\nhtml #sdp .g-dots{display:flex;justify-content:center;gap:2px;margin-top:var(--s2)}\nhtml #sdp .g-dots button{all:unset;box-sizing:border-box;width:24px;height:24px;cursor:pointer;position:relative}\nhtml #sdp .g-dots button::after{content:\"\";position:absolute;left:50%;top:50%;width:7px;height:7px;margin:-3.5px 0 0 -3.5px;border-radius:50%;background:rgba(234,220,203,.35);transition:background .3s}\nhtml #sdp .g-dots button[aria-current]::after{background:var(--sand)}\nhtml #sdp .g-dots button:focus-visible{outline:1px solid var(--sand);outline-offset:2px}\n@media (hover:hover){html #sdp #track::before,html #sdp #track::after{content:\"\\2039\";position:absolute;top:50%;transform:translateY(-50%);z-index:2;font-family:var(--display);font-weight:300;font-size:3rem;line-height:1;color:#fff;opacity:0;transition:opacity .3s;text-shadow:0 1px 10px rgba(0,0,0,.55);pointer-events:none}html #sdp #track::before{left:20px}html #sdp #track::after{content:\"\\203A\";right:20px}html #sdp #track:hover::before,html #sdp #track:hover::after{opacity:.9}}\nhtml body #sdp .about-head h2,html body #sdp section > .wrap > h2{font-size:clamp(2.375rem,calc(2.2vw + 1.9rem),3.5rem)}\n<\/style>\n<div id=\"sdp\" lang=\"en\" data-no-translation=\"\">\n\n\n\n<header>\n  <div class=\"bar\">\n    <a class=\"sdp-prenota-top\" href=\"\/en\/verifica-disponibilita\/\">Book Now<\/a>\n    <a class=\"logo\" href=\"\/en\/\"><svg class=\"mark\" role=\"img\" aria-label=\"Suite del Pittore\"><use href=\"\/wp-content\/uploads\/2026\/10\/logo-pittore-sprite.svg#logo-pittore\"><\/use><\/svg><\/a>\n    <button class=\"burger\" id=\"open\" aria-label=\"Open menu\"><span><\/span><span><\/span><span><\/span><\/button>\n  <\/div>\n<\/header>\n\n<div class=\"menu\" id=\"menu\" data-open=\"false\">\n  <div class=\"menu-top\"><button class=\"menu-close\" id=\"close\" aria-label=\"Close menu\">\u00d7<\/button><\/div>\n  <nav>\n    <a href=\"\/en\/lastruttura\/\">The Suite<\/a>\n    <a href=\"\/en\/dintorni\/\">Explore Tivoli<\/a>\n    <a href=\"\/en\/galleria\/\">Gallery<\/a>\n    <a href=\"\/en\/contatti\/\">Contact<\/a>\n    <a href=\"\/en\/verifica-disponibilita\/\">Book Now<\/a>\n  <\/nav>\n  <div class=\"menu-foot\">Vicolo del Pittore 1, 00019 Tivoli (RM), Italy \u2014 +39 342 6637430<\/div>\n<\/div>\n\n<!-- HERO -->\n<section class=\"hero\" id=\"hero\">\n  \n  \n  \n  <div class=\"slide on\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-768x1024.jpeg.webp\" alt=\"The entrance of the Suite del Pittore\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-35-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 100vw, 100vw\"><\/div><div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-768x1024.jpeg.webp\" alt=\"The double bedroom\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-17-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 100vw, 100vw\"><\/div><div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-768x1024.jpeg.webp\" alt=\"Exposed stone wall at the Suite del Pittore\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1551-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 100vw, 100vw\"><\/div><div class=\"hero-copy\">\n    <div class=\"inner\">\n      <h1><em>Welcome to<\/em> Suite del Pittore<\/h1>\n      <p>An authentic experience in the heart of Tivoli's historic center. Every detail of our holiday home has been crafted with local materials, to offer you an unforgettable stay immersed in art, history, and comfort.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"dots\" id=\"dots\"><\/div>\n<\/section>\n\n<!-- ABOUT -->\n<section class=\"about dark\">\n  <div class=\"about-head\">\n    <h2><em>Discover the<\/em><br>Suite del Pittore<\/h2>\n  <\/div>\n    <div class=\"plan3d\">\n    <iframe title=\"3D floor plan of the Suite del Pittore\" srcdoc=\"&lt;!doctype html&gt;\n&lt;html lang=&quot;en&quot;&gt;&lt;head&gt;&lt;style id=&quot;sdp-fonts&quot;&gt;@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:italic;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-italic-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Cormorant Garamond';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-cormorant-normal-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:300;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:400;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}\n@font-face{font-family:'Karla';font-style:normal;font-weight:500;font-display:swap;src:url(https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/sdp-font-karla-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}&lt;\/style&gt;\n&lt;meta charset=&quot;utf-8&quot;&gt;\n&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;\n&lt;title&gt;Suite del Pittore \u2014 planimetria 3D, versione notturna&lt;\/title&gt;\n\n&lt;style&gt;\n:root{\n  --cream:#2B2621; --sand:#EADCCB; --ink:#EDE2D2; --ink-soft:#9C9186; --line:#4A423A;\n}\n*{box-sizing:border-box}\nhtml,body{margin:0;height:100%}\nbody{\n  background:var(--cream);color:var(--ink);\n  font-family:&quot;Karla&quot;,-apple-system,Segoe UI,sans-serif;font-weight:300;\n  display:flex;flex-direction:column;overflow:hidden;\n}\nheader{padding:12px 24px 6px}\nh1{font-family:&quot;Cormorant Garamond&quot;,Georgia,serif;font-weight:400;font-size:1.5rem;margin:0}\nheader p{margin:2px 0 0;font-size:.85rem;color:var(--ink-soft)}\n\n#stage{flex:1;position:relative;touch-action:none;cursor:grab;min-height:0}\n#stage.dragging{cursor:grabbing}\ncanvas{display:block}\n\n\n.controls{\n  position:absolute;left:0;right:0;bottom:0;\n  display:flex;gap:8px;align-items:center;flex-wrap:wrap;\n  padding:14px 24px;background:linear-gradient(to top,var(--cream) 65%,transparent);\n}\nbutton{\n  font:inherit;font-size:.78rem;letter-spacing:.12em;text-transform:uppercase;\n  padding:10px 16px;border:1px solid var(--ink);background:transparent;color:var(--ink);\n  cursor:pointer;-webkit-appearance:none;appearance:none;\n}\nbutton:hover,button[aria-pressed=&quot;true&quot;]{background:var(--ink);color:var(--cream)}\n.hint{margin-left:auto;font-size:.8rem;color:var(--ink-soft)}\n.exp{display:flex;align-items:center;gap:8px;font-size:.72rem;letter-spacing:.12em;\n  text-transform:uppercase;color:var(--ink-soft)}\n.exp input{width:110px}\n.exp b{font-weight:400;color:var(--ink);min-width:2.6em}\n@media(max-width:600px){ .hint{width:100%;margin:4px 0 0;text-align:center} }\n&lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\n&lt;header&gt;\n  &lt;h1&gt;The Suite in 3D&lt;\/h1&gt;\n  &lt;p&gt;Drag to rotate. Pinch or scroll to zoom.&lt;\/p&gt;\n&lt;\/header&gt;\n\n&lt;div id=&quot;stage&quot;&gt;\n  &lt;div class=&quot;controls&quot;&gt;\n    &lt;button id=&quot;reset&quot;&gt;Initial view&lt;\/button&gt;\n    &lt;button id=&quot;spin&quot; aria-pressed=&quot;false&quot;&gt;Auto-rotate&lt;\/button&gt;\n    &lt;button id=&quot;walls&quot; aria-pressed=&quot;true&quot;&gt;Walls&lt;\/button&gt;\n    &lt;label class=&quot;exp&quot;&gt;Light &lt;input id=&quot;exp&quot; type=&quot;range&quot; min=&quot;0.4&quot; max=&quot;2.6&quot; step=&quot;0.05&quot; value=&quot;1&quot;&gt;&lt;b id=&quot;expv&quot;&gt;1.00&lt;\/b&gt;&lt;\/label&gt;\n    &lt;span class=&quot;hint&quot;&gt;Indicative floor plan \u00b7 60 m\u00b2&lt;\/span&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n\n&lt;script src=&quot;https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/three-r128.min_.js&quot;&gt;&lt;\/script&gt;\n&lt;script&gt;(0,eval)(new TextDecoder().decode(Uint8Array.from(atob(&quot;CmNvbnN0IEMgPSB7CiAgZmxvb3I6MHg5RTkwNzgsIHJ1ZzoweEJGQTg4OCwgd2FsbDoweEZBRjdGMiwgd2FsbFRvcDoweEVERTdEQywKICB3b29kOjB4N0E1QjQyLCB3b29kRGFyazoweDRBMzUyNywgZmFicmljOjB4OEM4NjcyLCB3aGl0ZToweEZDRkFGNiwKICBzdG9uZToweEQyRDBDQiwgd2F0ZXI6MHhCRkQ0RDIsIGdyZWVuOjB4NUU3MzU1LCBicmFzczoweEIwOEQ1NywgaW5rOjB4MkIyNjIxLAogIGNhYmluZXQ6MHhGNEVGRTYsIHRpbGU6MHg5RTkwNzgsIHNvZmE6MHg2QjQ2MzAsIHNvZmFMaWdodDoweDhBNUEzRCwKICBzdG9uZVdhbGw6MHhDNkI2OUIsIHN0b25lV2FybToweENGQkZBMiwgd29vZE9sZDoweDNFMkMxRiwgYmxhY2s6MHgyQTI3MjQKfTsKCmNvbnN0IHN0YWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YWdlJyk7CmNvbnN0IHNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7CnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHgyQjI2MjEpOwoKLy8gdmlzdGEgYXNzb25vbWV0cmljYTogbmVzc3VuYSBwcm9zcGV0dGl2YSwgY29tZSB1biBtb2RlbGxpbm8KbGV0IGFzcGVjdCA9IDEsIGZydXN0dW0gPSAxMC41Owpjb25zdCBjYW0gPSBuZXcgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKC0xLDEsMSwtMSwwLjEsMTAwKTsKY2FtLnBvc2l0aW9uLnNldCg5LDksOSk7CmNhbS5sb29rQXQoMCwwLjYsLTAuMSk7Cgpjb25zdCByZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6dHJ1ZX0pOwpyZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9IHRydWU7CnJlbmRlcmVyLnNoYWRvd01hcC50eXBlID0gVEhSRUUuUENGU29mdFNoYWRvd01hcDsKc3RhZ2UuYXBwZW5kQ2hpbGQocmVuZGVyZXIuZG9tRWxlbWVudCk7CgovLyAtLS0tIHJlc2EgZm90b2dyYWZpY2EgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBjb2xvcmkgaW4gc3BhemlvIHNSR0IgZSBjdXJ2YSBmaWxtaWNhOiBsZSBhbHRlIGx1Y2kgbm9uIHNpIGJydWNpYW5vIHBpdScKcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBUSFJFRS5zUkdCRW5jb2Rpbmc7CnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOwpyZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wMDsKCi8vIGNpZWxvIG5vdHR1cm5vIGRpIHJpZmVyaW1lbnRvOiBkYScgcmlmbGVzc2kgZSBsdWNlIGQnYW1iaWVudGUgYSBvZ25pIHN1cGVyZmljaWUKY29uc3QgRU5WID0gKGZ1bmN0aW9uKCl7CiAgY29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGN2LndpZHRoPTI1NjsgY3YuaGVpZ2h0PTEyODsKICBjb25zdCBnPWN2LmdldENvbnRleHQoJzJkJyk7CiAgY29uc3QgZ3I9Zy5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLDAsMCwxMjgpOwogIGdyLmFkZENvbG9yU3RvcCgwLjAwLCcjMEIwRTE0Jyk7ICAgLy8gemVuaXQsIGJsdWFzdHJvCiAgZ3IuYWRkQ29sb3JTdG9wKDAuNDUsJyMxRDE5MTUnKTsKICBnci5hZGRDb2xvclN0b3AoMC42NCwnIzJFMjAxNScpOyAgIC8vIGJhbmRhIGNhbGRhIGFsbCdhbHRlenphIGRlbGxlIGxhbXBhZGUKICBnci5hZGRDb2xvclN0b3AoMS4wMCwnIzA3MDYwNScpOwogIGcuZmlsbFN0eWxlPWdyOyBnLmZpbGxSZWN0KDAsMCwyNTYsMTI4KTsKICBjb25zdCB0PW5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGN2KTsKICB0Lm1hcHBpbmc9VEhSRUUuRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc7CiAgY29uc3QgcG09bmV3IFRIUkVFLlBNUkVNR2VuZXJhdG9yKHJlbmRlcmVyKTsKICBjb25zdCBlbnY9cG0uZnJvbUVxdWlyZWN0YW5ndWxhcih0KS50ZXh0dXJlOwogIHBtLmRpc3Bvc2UoKTsgdC5kaXNwb3NlKCk7CiAgcmV0dXJuIGVudjsKfSkoKTsKc2NlbmUuZW52aXJvbm1lbnQgPSBFTlY7CgpzY2VuZS5hZGQobmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCgweDJDMzQ0MCwgMHgwRTBCMDgsIDAuMTApKTsKY29uc3Qgc3VuID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHg5NEE2QzQsIDAuMTQpOyAgIC8vIGx1bmEKc3VuLnBvc2l0aW9uLnNldCg3LDE0LDYpOwpzdW4uY2FzdFNoYWRvdyA9IHRydWU7CnN1bi5zaGFkb3cubWFwU2l6ZS5zZXQoMTAyNCwxMDI0KTsKY29uc3QgZHNoID0gMTI7Ck9iamVjdC5hc3NpZ24oc3VuLnNoYWRvdy5jYW1lcmEse2xlZnQ6LWRzaCxyaWdodDpkc2gsdG9wOmRzaCxib3R0b206LWRzaCxuZWFyOjEsZmFyOjUwfSk7CnNjZW5lLmFkZChzdW4pOwoKY29uc3Qgd29ybGQgPSBuZXcgVEhSRUUuR3JvdXAoKTsgICAgICAvLyBydW90YSB0dXR0byBpbnNpZW1lCnNjZW5lLmFkZCh3b3JsZCk7CgovLyAtLS0tIGx1Y2kgY2FsZGUgZGVsbGEgc2VyYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBPZ25pIHBhcmV0ZSBpbiBwaWV0cmEgaGEgbGEgc3VhIGx1Y2UgcmFkZW50ZSwgY29tZSBpIHRhZ2xpIGRpIGx1Y2UgdmVyaS4KWyAvLyB4LCAgICAgeSwgICAgeiwgICAgIGNvbG9yZSwgIGZvcnphLCByYWdnaW8KICAvLyBwYXJldGkgaW4gcGlldHJhCiAgWyAxLjU1LCAxLjYyLCAtMS4wMiwgMHhGRkMwNzgsIDAuNTIsIDMuNF0sICAgLy8gcGlldHJhIGNhbWVyYSAoZGl2aXNvcmlvKQogIFstMi4zNCwgMS42MCwgLTIuMTAsIDB4RkZDMDc4LCAwLjQ3LCAzLjJdLCAgIC8vIHBpZXRyYSBhbmdvbG8gdmFzY2EKICBbIDEuNjUsIDEuNTgsICAzLjg2LCAweEZGQzA3OCwgMC40NywgMy4yXSwgICAvLyBwaWV0cmEgem9uYSBwcmFuem8KICBbLTIuMzQsIDEuNTUsICAwLjEzLCAweEZGQzA3OCwgMC4zOCwgMi42XSwgICAvLyBwaWV0cmEgYmFnbm8sIGRpZXRybyBpbCBsYXZhYm8KICBbLTAuOTksIDEuNTUsICAwLjcwLCAweEZGQzA3OCwgMC4zNiwgMi40XSwgICAvLyBwaWV0cmEgYmFnbm8sIHBhcmV0ZSBkaSBmb25kbwogIC8vIGFtYmllbnRpCiAgWyAxLjQwLCAxLjcyLCAtMy4yMCwgMHhGRkIyNjgsIDAuNTAsIDYuMF0sICAgLy8gY2FtZXJhLCBzb3ByYSBpbCBsZXR0bwogIFsgMS41NSwgMS42OCwgLTAuNTIsIDB4RkZEMkEwLCAwLjM4LCAyLjJdLCAgIC8vIGZhcmV0dG8gc3VsIGRpc2NvIGluIHRyYXZlcnRpbm8KICBbLTEuNzUsIDEuNjIsICAwLjEwLCAweEZGQjI2OCwgMC4zMiwgMy40XSwgICAvLyBiYWdubwogIFstMi4xMiwgMS42NiwgIDIuMTcsIDB4RkZDODkwLCAwLjMyLCAzLjBdLCAgIC8vIGRvY2NpYQogIFstMC44NSwgMS4zNCwgIDEuODUsIDB4RkZFMEIwLCAwLjM4LCAxLjldLCAgIC8vIHNvdHRvcGVuc2lsZSBkZWxsYSBjdWNpbmEKICBbIDEuNjIsIDEuNjAsICAzLjAwLCAweEZGQjI2OCwgMC41MCwgNS4wXSwgICAvLyBzb3ByYSBpbCB0YXZvbG8KICBbIDIuMjgsIDEuNTUsICAxLjQwLCAweEZGQTQ1MSwgMC4yNSwgMi42XSwgICAvLyBwb3J0YSBkJ2luZ3Jlc3NvCiAgLy8gcG9jbyBkYXZhbnRpIGFsbGEgY3VjaW5hLCBsYXRvIHNvZ2dpb3JubzogaWxsdW1pbmFubyBpbCB2YW5vIGUgbGEgY2FydGEKICBbLTAuMTUsIDEuNjIsICAxLjUyLCAweEZGQzA3OCwgMC40MCwgMy4wXSwKICBbLTAuMTUsIDEuNjIsICAyLjI4LCAweEZGQzA3OCwgMC40MCwgMy4wXQpdLmZvckVhY2goKFt4LHkseixjLGksZF0pPT57CiAgY29uc3QgTD1uZXcgVEhSRUUuUG9pbnRMaWdodChjLGksZCwyKTsKICBMLnBvc2l0aW9uLnNldCh4LHkseik7IHdvcmxkLmFkZChMKTsKfSk7Cgpjb25zdCB3YWxsR3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTsKd29ybGQuYWRkKHdhbGxHcm91cCk7CgovLyAtLS0tIHV0aWxpdMOgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gbWF0KGNvbG9yKXsgcmV0dXJuIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3IsIHJvdWdobmVzczowLjk0LCBtZXRhbG5lc3M6MC4wfSk7IH0KZnVuY3Rpb24gYm94KHcsaCxkcCxjb2xvcix4LHkseixyeT0wKXsKICBjb25zdCBtID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KHcsaCxkcCksIG1hdChjb2xvcikpOwogIG0ucG9zaXRpb24uc2V0KHgseStoLzIseik7IG0ucm90YXRpb24ueSA9IHJ5OwogIG0uY2FzdFNoYWRvdyA9IHRydWU7IG0ucmVjZWl2ZVNoYWRvdyA9IHRydWU7CiAgd29ybGQuYWRkKG0pOyByZXR1cm4gbTsKfQpmdW5jdGlvbiBjeWwocixoLGNvbG9yLHgseSx6LHNlZz0yNCl7CiAgY29uc3QgbSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KHIscixoLHNlZyksIG1hdChjb2xvcikpOwogIG0ucG9zaXRpb24uc2V0KHgseStoLzIseik7IG0uY2FzdFNoYWRvdyA9IHRydWU7IG0ucmVjZWl2ZVNoYWRvdyA9IHRydWU7CiAgd29ybGQuYWRkKG0pOyByZXR1cm4gbTsKfQovLyBtdXJvIGZyYSBkdWUgcHVudGkgZGVsIHBpYW5vCmZ1bmN0aW9uIHdhbGwoeDEsejEseDIsejIsaD0xLjgwLHQ9MC4xNCl7CiAgY29uc3QgZHg9eDIteDEsIGR6PXoyLXoxLCBsZW49TWF0aC5oeXBvdChkeCxkeik7CiAgY29uc3QgbSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShsZW4saCx0KSwgbWF0KEMud2FsbCkpOwogIG0ucG9zaXRpb24uc2V0KCh4MSt4MikvMiwgaC8yLCAoejErejIpLzIpOwogIG0ucm90YXRpb24ueSA9IC1NYXRoLmF0YW4yKGR6LGR4KTsKICBtLmNhc3RTaGFkb3cgPSB0cnVlOyBtLnJlY2VpdmVTaGFkb3cgPSB0cnVlOwogIHdhbGxHcm91cC5hZGQobSk7CiAgY29uc3QgY2FwID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KGxlbiwwLjA0LHQrMC4wMDUpLCBtYXQoQy53YWxsVG9wKSk7CiAgY2FwLnBvc2l0aW9uLmNvcHkobS5wb3NpdGlvbik7IGNhcC5wb3NpdGlvbi55ID0gaDsKICBjYXAucm90YXRpb24ueSA9IG0ucm90YXRpb24ueTsKICB3YWxsR3JvdXAuYWRkKGNhcCk7Cn0KZnVuY3Rpb24gc2xhYih3LGRwLGNvbG9yLHgseix5PTAuMDAxKXsKICBjb25zdCBtID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KHcsMC4wMixkcCksIG1hdChjb2xvcikpOwogIG0ucG9zaXRpb24uc2V0KHgseSx6KTsgbS5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsgd29ybGQuYWRkKG0pOyByZXR1cm4gbTsKfQpmdW5jdGlvbiBwbGFudCh4LHoscz0xKXsKICBjeWwoMC4xNipzLDAuMjIqcyxDLnN0b25lLHgsMCx6KTsKICBjeWwoMC4wNCpzLDAuNSpzLEMud29vZCx4LDAuMjIqcyx6LDgpOwogIGZvcihsZXQgaT0wO2k8NTtpKyspewogICAgY29uc3QgYT1pLzUqTWF0aC5QSSoyOwogICAgY29uc3QgbGVhZj1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoMC4xNypzLDEwLDgpLCBtYXQoQy5ncmVlbikpOwogICAgbGVhZi5wb3NpdGlvbi5zZXQoeCtNYXRoLmNvcyhhKSowLjE0KnMsIDAuNzQqcytNYXRoLnNpbihpKSowLjA2LCB6K01hdGguc2luKGEpKjAuMTQqcyk7CiAgICBsZWFmLnNjYWxlLnk9MC41NTsgbGVhZi5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChsZWFmKTsKICB9Cn0KLy8gVm9sdW1lIGNvbiBnbGkgc3BpZ29saSBhcnJvdG9uZGF0aSwgaW4gdW4gcGV6em8gc29sby4KLy8gVW4gbWF0ZXJhc3NvIG8gdW4gY3VzY2lubyBub24gaGFubm8gc3BpZ29saSB2aXZpOiBlJyBzb3ByYXR0dXR0byBxdWVzdG8KLy8gYSB0b2dsaWVyZSBsJ2FyaWEgZGkgY2FydG9uZSBhZ2xpIGltYm90dGl0aS4KZnVuY3Rpb24gc29mdEJveCh3LGgsZCxyLGJldixtLHgseSx6KXsKICBjb25zdCBhPXcvMi1yLCBiPWQvMi1yOwogIGNvbnN0IHM9bmV3IFRIUkVFLlNoYXBlKCk7CiAgcy5tb3ZlVG8oLWEtciwtYik7CiAgcy5saW5lVG8oLWEtciwgYik7ICBzLnF1YWRyYXRpY0N1cnZlVG8oLWEtciwgYityLCAtYSwgYityKTsKICBzLmxpbmVUbyggYSwgYityKTsgIHMucXVhZHJhdGljQ3VydmVUbyggYStyLCBiK3IsIGErciwgYik7CiAgcy5saW5lVG8oIGErciwtYik7ICBzLnF1YWRyYXRpY0N1cnZlVG8oIGErciwtYi1yLCBhLC1iLXIpOwogIHMubGluZVRvKC1hLC1iLXIpOyAgcy5xdWFkcmF0aWNDdXJ2ZVRvKC1hLXIsLWItciwtYS1yLC1iKTsKICBjb25zdCBnPW5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkocyx7ZGVwdGg6TWF0aC5tYXgoMC4wMDIsaC1iZXYqMiksCiAgICBiZXZlbEVuYWJsZWQ6dHJ1ZSwgYmV2ZWxTZWdtZW50czoyLCBiZXZlbFNpemU6YmV2LCBiZXZlbFRoaWNrbmVzczpiZXYsIGN1cnZlU2VnbWVudHM6NH0pOwogIGcucm90YXRlWCgtTWF0aC5QSS8yKTsgICAgICAgICAgLy8gaWwgcHJvZmlsbyBwYXNzYSBkYWwgcGlhbm8gWFkgYSBxdWVsbG8gWFoKICBnLnRyYW5zbGF0ZSgwLGJldiwwKTsgICAgICAgICAgIC8vIGFwcG9nZ2lhdG8gYSBxdW90YSB5CiAgY29uc3Qgbz1uZXcgVEhSRUUuTWVzaChnLG0pOwogIG8ucG9zaXRpb24uc2V0KHgseSx6KTsKICBvLmNhc3RTaGFkb3c9dHJ1ZTsgby5yZWNlaXZlU2hhZG93PXRydWU7IHdvcmxkLmFkZChvKTsKICByZXR1cm4gbzsKfQovLyBsZWdubyBzY3VybyB2ZW5hdG8KZnVuY3Rpb24gd29vZFRleHR1cmUoKXsKICBjb25zdCBXPTUxMixIPTUxMjsKICBjb25zdCBjdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgY3Yud2lkdGg9VzsgY3YuaGVpZ2h0PUg7CiAgY29uc3QgZz1jdi5nZXRDb250ZXh0KCcyZCcpOwogIGxldCBzPTQ0NzE7CiAgY29uc3Qgcm5kPSgpPT57IHM9KHMqMTY2NDUyNSsxMDEzOTA0MjIzKT4+PjA7IHJldHVybiBzLzQyOTQ5NjcyOTY7IH07CiAgZy5maWxsU3R5bGU9JyMzQTJBMUUnOyBnLmZpbGxSZWN0KDAsMCxXLEgpOwogIGZvcihsZXQgaT0wO2k8MjIwO2krKyl7ICAgICAgICAgICAgICAgICAgICAgLy8gdmVuYXR1cmUKICAgIGNvbnN0IHk9cm5kKCkqSCwgYW1wPTMrcm5kKCkqOSwgdz0wLjQrcm5kKCkqMS44OwogICAgY29uc3QgbHVtPXJuZCgpPjAuNTUgPyAncmdiYSgxMjYsOTQsNjYsJyA6ICdyZ2JhKDE4LDEyLDgsJzsKICAgIGcuc3Ryb2tlU3R5bGU9bHVtKygwLjEwK3JuZCgpKjAuMzApKycpJzsgZy5saW5lV2lkdGg9dzsKICAgIGcuYmVnaW5QYXRoKCk7IGcubW92ZVRvKDAseSk7CiAgICBmb3IobGV0IHg9MDt4PD1XO3grPTMyKSBnLmxpbmVUbyh4LCB5K01hdGguc2luKHgvNjAraSkqYW1wKTsKICAgIGcuc3Ryb2tlKCk7CiAgfQogIGZvcihsZXQgaT0wO2k8NztpKyspeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGkKICAgIGNvbnN0IG54PXJuZCgpKlcsIG55PXJuZCgpKkgsIHI9NitybmQoKSoxMzsKICAgIGZvcihsZXQgaz0wO2s8NTtrKyspewogICAgICBnLnN0cm9rZVN0eWxlPSdyZ2JhKDE0LDksNiwnKygwLjMwLWsqMC4wNSkrJyknOyBnLmxpbmVXaWR0aD0xLjQ7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcuZWxsaXBzZShueCxueSxyK2sqMywocitrKjMpKjAuNTUsMC40LDAsNi4yODMpOyBnLnN0cm9rZSgpOwogICAgfQogIH0KICBjb25zdCB0PW5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGN2KTsgdC5hbmlzb3Ryb3B5PTQ7IHQuZW5jb2Rpbmc9VEhSRUUuc1JHQkVuY29kaW5nOwogIHJldHVybiB0Owp9CgovLyBjYXJ0YSBkYSBwYXJhdGkgaW4gZmlicmEgbmF0dXJhbGU6IHRyYW1hIGZpdHRhIG9yaXp6b250YWxlLCB0b25vIGJlaWdlIGNhbGRvCmZ1bmN0aW9uIGNhcnRhVGV4dHVyZSgpewogIGNvbnN0IFM9NzYwOwogIGNvbnN0IGN2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBjdi53aWR0aD1TOyBjdi5oZWlnaHQ9UzsKICBjb25zdCBnPWN2LmdldENvbnRleHQoJzJkJyk7CiAgbGV0IHM9NTE1MjQ5OwogIGNvbnN0IHJuZD0oKT0+eyBzPShzKjE2NjQ1MjUrMTAxMzkwNDIyMyk+Pj4wOyByZXR1cm4gcy80Mjk0OTY3Mjk2OyB9OwoKICBnLmZpbGxTdHlsZT0ncmdiKDE2OCwxNDUsMTIwKSc7IGcuZmlsbFJlY3QoMCwwLFMsUyk7CgogIC8vIHRyYW1hOiBmaWxpIG9yaXp6b250YWxpIGZpdHRpLCBvZ251bm8gY29uIHRvbm8gdmFyaWFiaWxlIGx1bmdvIGxhIGx1bmdoZXp6YQogIGxldCB5PTA7CiAgd2hpbGUoeTxTKXsKICAgIGNvbnN0IGg9MSsocm5kKCk+MC42PzE6MCk7CiAgICBjb25zdCBiYXNlPTE1Misocm5kKCkqMzR8MCk7CiAgICBsZXQgeD0wOwogICAgd2hpbGUoeDxTKXsKICAgICAgY29uc3Qgc2VnPTE0K3JuZCgpKjQ2OwogICAgICBjb25zdCB2PWJhc2UrKChybmQoKS0wLjUpKjI2fDApOwogICAgICBnLmZpbGxTdHlsZT0ncmdiKCcrdisnLCcrKHYqMC44NjV8MCkrJywnKyh2KjAuNzE1fDApKycpJzsKICAgICAgZy5maWxsUmVjdCh4LHksc2VnLGgpOwogICAgICB4Kz1zZWc7CiAgICB9CiAgICB5Kz1oKyhybmQoKT4wLjc1PzE6MCk7CiAgfQoKICAvLyBvcmRpdG86IHZlcnRpY2FsaSBhcHBlbmEgcGVyY2V0dGliaWxpCiAgZm9yKGxldCBrPTA7azw3MDA7aysrKXsKICAgIGNvbnN0IHg9cm5kKCkqUywgdz0wLjYrcm5kKCkqMS4zLCBhPSgxMCtybmQoKSoxNCkvMjU1OwogICAgZy5maWxsU3R5bGUgPSBybmQoKT4wLjUgPyAncmdiYSgyMTQsMTk2LDE3MCwnK2ErJyknIDogJ3JnYmEoMTA4LDkyLDcyLCcrYSsnKSc7CiAgICBnLmZpbGxSZWN0KHgsMCx3LFMpOwogIH0KCiAgLy8gbm9kaSBlIGlycmVnb2xhcml0YScgZGVsbGEgZmlicmEKICBmb3IobGV0IGs9MDtrPDIyMDA7aysrKXsKICAgIGNvbnN0IHg9cm5kKCkqUywgeTI9cm5kKCkqUywgTD0zK3JuZCgpKjE2LCBhPSgyMitybmQoKSozMCkvMjU1OwogICAgZy5maWxsU3R5bGUgPSBybmQoKT4wLjQ1ID8gJ3JnYmEoMjI2LDIxMCwxODYsJythKycpJyA6ICdyZ2JhKDk2LDgwLDYyLCcrYSsnKSc7CiAgICBnLmZpbGxSZWN0KHgseTIsTCwxK3JuZCgpKjEuNCk7CiAgfQoKICAvLyBnaXVuemlvbmkgZnJhIGkgdGVsaQogIGZvcihsZXQgaz0wO2s8NDtrKyspewogICAgY29uc3QgeDA9aypTLzQsIGE9KDEwK3JuZCgpKjEwKS8yNTU7CiAgICBnLmZpbGxTdHlsZSA9IGslMiA\/ICdyZ2JhKDIyMCwyMDQsMTgwLCcrYSsnKScgOiAncmdiYSgxMTAsOTQsNzQsJythKycpJzsKICAgIGcuZmlsbFJlY3QoeDAsMCxTLzQsUyk7CiAgICBnLmZpbGxTdHlsZT0ncmdiYSg5Miw3OCw2MCwuMTMpJzsgZy5maWxsUmVjdCh4MCwwLDEuNCxTKTsKICB9CgogIGNvbnN0IHQ9bmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY3YpOwogIHQuZW5jb2Rpbmc9VEhSRUUuc1JHQkVuY29kaW5nOwogIHQud3JhcFM9dC53cmFwVD1USFJFRS5SZXBlYXRXcmFwcGluZzsgdC5hbmlzb3Ryb3B5PTE2OwogIHJldHVybiB0Owp9CgovLyB0cmF2ZXJ0aW5vOiBmb25kbyBjcmVtYSBudXZvbG9zbywgc3RydXR0dXJhIGZpYnJvc2EsIGNhdml0YScgaXJyZWdvbGFyaQpmdW5jdGlvbiB0cmF2ZXJ0aW5vVGV4dHVyZSgpewogIGNvbnN0IFM9NzAwOwogIGNvbnN0IGN2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBjdi53aWR0aD1TOyBjdi5oZWlnaHQ9UzsKICBjb25zdCBnPWN2LmdldENvbnRleHQoJzJkJyk7CiAgbGV0IHM9OTkxNzM7CiAgY29uc3Qgcm5kPSgpPT57IHM9KHMqMTY2NDUyNSsxMDEzOTA0MjIzKT4+PjA7IHJldHVybiBzLzQyOTQ5NjcyOTY7IH07CiAgY29uc3QgcG9seT0ocHRzLGZpbGwpPT57CiAgICBnLmJlZ2luUGF0aCgpOyBnLm1vdmVUbyhwdHNbMF1bMF0scHRzWzBdWzFdKTsKICAgIGZvcihsZXQgaT0xO2k8cHRzLmxlbmd0aDtpKyspIGcubGluZVRvKHB0c1tpXVswXSxwdHNbaV1bMV0pOwogICAgZy5jbG9zZVBhdGgoKTsgZy5maWxsU3R5bGU9ZmlsbDsgZy5maWxsKCk7CiAgfTsKCiAgZy5maWxsU3R5bGU9JyNERUQzQkMnOyBnLmZpbGxSZWN0KDAsMCxTLFMpOwogIGcuZmlsdGVyPSdibHVyKDIycHgpJzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9uZG8gYSBudXZvbGUKICBmb3IobGV0IGs9MDtrPDEyMDtrKyspewogICAgY29uc3QgY3g9cm5kKCkqUywgY3k9cm5kKCkqUywgcj00NStybmQoKSoxNTA7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmVsbGlwc2UoY3gsY3kscixyKjAuNzIsMCwwLDYuMjgzKTsKICAgIGcuZmlsbFN0eWxlID0gcm5kKCk+MC40NiA\/ICdyZ2JhKDIzNywyMjksMjExLC4yNCknIDogJ3JnYmEoMTk4LDE4NCwxNTYsLjI0KSc7CiAgICBnLmZpbGwoKTsKICB9CiAgZy5maWx0ZXI9J2JsdXIoMS4ycHgpJzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1dHR1cmEgZmlicm9zYSwgc3RyYXRpZmljYXRhCiAgZy5zdHJva2VTdHlsZT0ncmdiYSgxOTAsMTc4LDE1NCwuMTgpJzsKICBmb3IobGV0IGs9MDtrPDQwMDtrKyspewogICAgY29uc3QgeD1ybmQoKSpTLCB5PXJuZCgpKlMsIEw9MjArcm5kKCkqOTAsIGE9KHJuZCgpLTAuNSkqMC41OwogICAgZy5saW5lV2lkdGg9MStybmQoKSoyLjU7CiAgICBnLmJlZ2luUGF0aCgpOyBnLm1vdmVUbyh4LHkpOyBnLmxpbmVUbyh4K01hdGguY29zKGEpKkwsIHkrTWF0aC5zaW4oYSkqTCk7IGcuc3Ryb2tlKCk7CiAgfQogIGcuZmlsdGVyPSdub25lJzsKCiAgZnVuY3Rpb24gY2F2aXRhKGN4LGN5LHIpeyAgICAgICAgICAgICAgICAgICAgICAvLyBjYXZpdGEnIGRhbCBjb250b3JubyBpcnJlZ29sYXJlCiAgICBjb25zdCBuPTcrKHJuZCgpKjR8MCksIHNxPTAuNitybmQoKSowLjQsIHB0cz1bXTsKICAgIGZvcihsZXQgaT0wO2k8bjtpKyspewogICAgICBjb25zdCBhPWkvbio2LjI4MywgcnI9ciooMC42MitybmQoKSowLjc2KTsKICAgICAgcHRzLnB1c2goW2N4K01hdGguY29zKGEpKnJyLCBjeStNYXRoLnNpbihhKSpycipzcV0pOwogICAgfQogICAgcG9seShwdHMubWFwKChbeCx5XSk9Plt4LHkrciowLjM0XSksICdyZ2JhKDI1NSwyNTEsMjQwLC4yNCknKTsgICAvLyBsYWJicm8gaW4gbHVjZQogICAgY29uc3QgZGs9MTUwKyhybmQoKSoyNnwwKTsKICAgIHBvbHkocHRzLCAncmdiYSgnK2RrKycsJysoZGstOSkrJywnKyhkay0yNCkrJywuMzMpJyk7CiAgICBpZihyPjUpIHBvbHkocHRzLm1hcCgoW3gseV0pPT5bY3grKHgtY3gpKjAuNTUsIGN5Kyh5LWN5KSowLjU1XSksICdyZ2JhKDEyMiwxMTIsOTQsLjMxKScpOwogIH0KICBmb3IobGV0IGs9MDtrPDE5MDtrKyspeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdml0YScgYSBncmFwcG9sbwogICAgY29uc3QgZ3g9cm5kKCkqUywgZ3k9cm5kKCkqUywgc3A9MjArcm5kKCkqNjA7CiAgICBjb25zdCBuPTQrKHJuZCgpKjE0fDApOwogICAgZm9yKGxldCBpPTA7aTxuO2krKyl7CiAgICAgIGNvbnN0IHU9cm5kKCk7CiAgICAgIGNhdml0YShneCsocm5kKCktMC41KSpzcCoyLCBneSsocm5kKCktMC41KSpzcCoyLCAxLjQrTWF0aC5wb3codSwyLjYpKjEzKTsKICAgIH0KICB9CiAgZm9yKGxldCBrPTA7azwzMDtrKyspIGNhdml0YShybmQoKSpTLCBybmQoKSpTLCA4K3JuZCgpKjEwKTsKCiAgZm9yKGxldCBrPTA7azwxNDAwMDtrKyspeyAgICAgICAgICAgICAgICAgICAgICAvLyBncmFuYSBmaW5lCiAgICBjb25zdCB4PXJuZCgpKlMsIHk9cm5kKCkqUywgcT0wLjQrcm5kKCkqMS4xOwogICAgZy5iZWdpblBhdGgoKTsgZy5hcmMoeCx5LHEsMCw2LjI4Myk7CiAgICBnLmZpbGxTdHlsZSA9IHJuZCgpPjAuNSA\/ICdyZ2JhKDI1NSwyNTIsMjQ2LC4xNiknIDogJ3JnYmEoMTQwLDEzMCwxMTAsLjE2KSc7CiAgICBnLmZpbGwoKTsKICB9CgogIGNvbnN0IHQ9bmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY3YpOyB0LmFuaXNvdHJvcHk9ODsgdC5lbmNvZGluZz1USFJFRS5zUkdCRW5jb2Rpbmc7CiAgcmV0dXJuIHQ7Cn0KCi8vIG11cmF0dXJhIGEgc2FjY28gaW4gcGlldHJhIOKAlCBhbHRhIHJpc29sdXppb25lLCBjb24gcmlsaWV2bwpmdW5jdGlvbiBzdG9uZVdhbGxUZXh0dXJlKCl7CiAgY29uc3QgVz0yMDQ4LCBIPTEyMDA7CiAgY29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGN2LndpZHRoPVc7IGN2LmhlaWdodD1IOwogIGNvbnN0IGJ2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBidi53aWR0aD1XOyBidi5oZWlnaHQ9SDsKICBjb25zdCBnPWN2LmdldENvbnRleHQoJzJkJyksIGI9YnYuZ2V0Q29udGV4dCgnMmQnKTsKICBsZXQgcz03NzExNDQ7CiAgY29uc3Qgcm5kPSgpPT57IHM9KHMqMTY2NDUyNSsxMDEzOTA0MjIzKT4+PjA7IHJldHVybiBzLzQyOTQ5NjcyOTY7IH07CiAgY29uc3QgcGljaz1hPT5hW01hdGguZmxvb3Iocm5kKCkqYS5sZW5ndGgpXTsKCiAgZy5maWxsU3R5bGU9JyNDREMwQTYnOyBnLmZpbGxSZWN0KDAsMCxXLEgpOwogIGIuZmlsbFN0eWxlPScjNUE1QTVBJzsgYi5maWxsUmVjdCgwLDAsVyxIKTsgICAgICAgICAgLy8gbWFsdGEgPSBpbmNhdm8KCiAgY29uc3Qgc3RvbmU9WycjRThFMENFJywnI0RERDNCRScsJyNEMEM1QUQnLCcjQzRCNzlDJywnI0VGRTlEQScsJyNCOUFCOTAnLAogICAgICAgICAgICAgICAnI0UyREFDNicsJyNENkNCQjQnLCcjQ0FCREEyJ107CiAgY29uc3QgcGxhY2VkPVtdOwogIGNvbnN0IGZyZWU9KGN4LGN5LHIpPT57CiAgICBmb3IobGV0IGk9MDtpPHBsYWNlZC5sZW5ndGg7aSsrKXsKICAgICAgY29uc3QgcD1wbGFjZWRbaV0sIGR4PWN4LXBbMF0sIGR5PWN5LXBbMV0sIG09KHIrcFsyXSkqMC41MDsKICAgICAgaWYoZHgqZHgrZHkqZHkgPCBtKm0pIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH07CiAgY29uc3QgZmlsbFBvbHk9KGN0eCxwLGNvbCk9PnsKICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyhwWzBdWzBdLHBbMF1bMV0pOwogICAgZm9yKGxldCBpPTE7aTxwLmxlbmd0aDtpKyspIGN0eC5saW5lVG8ocFtpXVswXSxwW2ldWzFdKTsKICAgIGN0eC5jbG9zZVBhdGgoKTsgY3R4LmZpbGxTdHlsZT1jb2w7IGN0eC5maWxsKCk7CiAgfTsKCgoKICAvLyBwaWV0cmUgdG9uZGVnZ2lhbnRpLCBmaXR0ZQogIGZ1bmN0aW9uIHJvY2soY3gsY3kscixzcSl7CiAgICBjb25zdCBuPTgrKHJuZCgpKjR8MCksIHA9W107CiAgICBmb3IobGV0IGk9MDtpPG47aSsrKXsKICAgICAgY29uc3QgYT1pL24qNi4yODMsIHJyPXIqKDAuNzgrcm5kKCkqMC4zMik7CiAgICAgIHAucHVzaChbY3grTWF0aC5jb3MoYSkqcnIsIGN5K01hdGguc2luKGEpKnJyKnNxXSk7CiAgICB9CiAgICBjb25zdCBjb2w9cGljayhzdG9uZSk7CiAgICBmaWxsUG9seShnLHAsY29sKTsKICAgIGNvbnN0IGx2PTE5MCsocm5kKCkqNTZ8MCk7CiAgICBmaWxsUG9seShiLHAsJ3JnYignK2x2KycsJytsdisnLCcrbHYrJyknKTsKICAgIGcuZ2xvYmFsQWxwaGE9LjQyOwogICAgZm9yKGxldCBrPTA7azwoci82fDApKzI7aysrKXsKICAgICAgY29uc3QgcHg9Y3grKHJuZCgpLTAuNSkqcioxLjQsIHB5PWN5KyhybmQoKS0wLjUpKnIqMS40KnNxLCBxPTEuMitybmQoKSoyLjY7CiAgICAgIGcuYmVnaW5QYXRoKCk7IGcuYXJjKHB4LHB5LHEsMCw2LjI4Myk7CiAgICAgIGcuZmlsbFN0eWxlID0gcm5kKCk+MC41ID8gJ3JnYmEoMjU1LDI1NSwyNTUsLjYpJyA6ICdyZ2JhKDc4LDY0LDQ4LC41KSc7CiAgICAgIGcuZmlsbCgpOwogICAgfQogICAgZy5nbG9iYWxBbHBoYT0xOwogICAgZy5maWxsU3R5bGU9J3JnYmEoNzIsNjAsNDQsLjA4KSc7CiAgICBnLmZpbGxSZWN0KGN4LXIsIGN5K3Iqc3EqMC40NSwgcioyLCByKnNxKjAuNTUpOwogIH0KCiAgW1s3MiwxNTAwXSxbNTAsMjIwMF0sWzMyLDI4MDBdLFsyMCwyNjAwXV0uZm9yRWFjaCgoW3JtYXgsdHJpZXNdKT0+ewogICAgZm9yKGxldCB0PTA7dDx0cmllczt0KyspewogICAgICBjb25zdCByPXJtYXgqKDAuNTUrcm5kKCkqMC40NSk7CiAgICAgIGNvbnN0IGN4PXJuZCgpKihXKzE2MCktODAsIGN5PXJuZCgpKihIKzE2MCktODAsIHNxPTAuNjIrcm5kKCkqMC40NTsKCiAgICAgIGlmKCFmcmVlKGN4LGN5LHIqMC44MCkpIGNvbnRpbnVlOwogICAgICByb2NrKGN4LGN5LHIsc3EpOyBwbGFjZWQucHVzaChbY3gsY3ksciowLjgwXSk7CiAgICB9CiAgfSk7CgogIC8vIGx1Y2UgcmFkZW50ZSBkYWxsJ2FsdG8KICBjb25zdCBncj1nLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsMCwwLEgpOwogIGdyLmFkZENvbG9yU3RvcCgwLCAgICdyZ2JhKDI1NSwyNDQsMjIwLC4zOCknKTsKICBnci5hZGRDb2xvclN0b3AoMC4zMCwncmdiYSgyNTUsMjQ0LDIyMCwuMDMpJyk7CiAgZ3IuYWRkQ29sb3JTdG9wKDEsICAgJ3JnYmEoNTgsNDYsMzQsLjIzKScpOwogIGcuZmlsbFN0eWxlPWdyOyBnLmZpbGxSZWN0KDAsMCxXLEgpOwoKICBjb25zdCBtYXA9bmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY3YpLCBidW1wPW5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGJ2KTsKICBtYXAuYW5pc290cm9weT04OyBidW1wLmFuaXNvdHJvcHk9ODsgbWFwLmVuY29kaW5nPVRIUkVFLnNSR0JFbmNvZGluZzsKICByZXR1cm4ge21hcCxidW1wfTsKfQoKY29uc3QgU1RPTkUgPSBzdG9uZVdhbGxUZXh0dXJlKCk7ICAgLy8gdW5hIHNvbGEgbXVyYXR1cmEsIHVzYXRhIHN1IHR1dHRlIGxlIHBhcmV0aSBpbiBwaWV0cmEKCi8vIHRyYXR0byBkaSBtdXJvIHNvcHJhIHVuJ2FwZXJ0dXJhCmZ1bmN0aW9uIGxpbnRlbCh4MSx6MSx4Mix6Mix5MCx5MSx0PTAuMTQpewogIGNvbnN0IGR4PXgyLXgxLCBkej16Mi16MSwgbGVuPU1hdGguaHlwb3QoZHgsZHopLCBoPXkxLXkwOwogIGNvbnN0IG09bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KGxlbixoLHQpLCBtYXQoQy53YWxsKSk7CiAgbS5wb3NpdGlvbi5zZXQoKHgxK3gyKS8yLCB5MCtoLzIsICh6MSt6MikvMik7CiAgbS5yb3RhdGlvbi55PS1NYXRoLmF0YW4yKGR6LGR4KTsKICBtLmNhc3RTaGFkb3c9dHJ1ZTsgbS5yZWNlaXZlU2hhZG93PXRydWU7IHdhbGxHcm91cC5hZGQobSk7CiAgY29uc3QgY2FwPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShsZW4sMC4wNCx0KzAuMDA1KSwgbWF0KEMud2FsbFRvcCkpOwogIGNhcC5wb3NpdGlvbi5zZXQoKHgxK3gyKS8yLCB5MSwgKHoxK3oyKS8yKTsgY2FwLnJvdGF0aW9uLnk9bS5yb3RhdGlvbi55OwogIHdhbGxHcm91cC5hZGQoY2FwKTsKfQoKLy8gbXVybyBjb24gbXVyYXR1cmEgYSB2aXN0YSBzdSB1bmEgZGVsbGUgZHVlIGZhY2NlCmZ1bmN0aW9uIHN0b25lV2FsbCh4MSx6MSx4Mix6Mix0ZXgsaD0xLjgwLHQ9MC4xNCl7CiAgY29uc3QgZHg9eDIteDEsIGR6PXoyLXoxLCBsZW49TWF0aC5oeXBvdChkeCxkeik7CiAgY29uc3QgcGxhaW49bWF0KEMud2FsbCk7CiAgY29uc3QgZmFjZT1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe21hcDp0ZXgubWFwLCBidW1wTWFwOnRleC5idW1wLCBidW1wU2NhbGU6MC4wOSwgcm91Z2huZXNzOjAuOTUsIG1ldGFsbmVzczowLjB9KTsKICAvLyBvcmRpbmUgZmFjY2U6ICtYLC1YLCtZLC1ZLCtaLC1aIOKAlCBsYSBwaWV0cmEgc3RhIHN1bGxhIGZhY2NpYSAtWiAodmVyc28gbGEgY2FtZXJhKQogIGNvbnN0IG09bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KGxlbixoLHQpLAogICAgW3BsYWluLHBsYWluLG1hdChDLndhbGxUb3ApLHBsYWluLHBsYWluLGZhY2VdKTsKICBtLnBvc2l0aW9uLnNldCgoeDEreDIpLzIsaC8yLCh6MSt6MikvMik7CiAgbS5yb3RhdGlvbi55PS1NYXRoLmF0YW4yKGR6LGR4KTsKICBtLmNhc3RTaGFkb3c9dHJ1ZTsgbS5yZWNlaXZlU2hhZG93PXRydWU7IHdhbGxHcm91cC5hZGQobSk7Cn0KCi8vIGZpbmVzdHJhIDF4MSBtIHN1bGxhIHBhcmV0ZSBlc3QsIGNvbiBjb3JuaWNlCmZ1bmN0aW9uIGVhc3RXaW5kb3coemMsIHd3PTEuMCl7CiAgY29uc3Qgd3g9Mi43LCB3eTA9MC44MCwgd2g9MS4wMCwgZnI9MC4wNDsKICBjb25zdCBnID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuMDUsIHdoLCB3dyksCiAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4Q0ZFMEU0LCB0cmFuc3BhcmVudDp0cnVlLCBvcGFjaXR5OjAuMzUsIHJvdWdobmVzczowLjkwLCBtZXRhbG5lc3M6MC4wfSkpOwogIGcucG9zaXRpb24uc2V0KHd4LCB3eTArd2gvMiwgemMpOyB3b3JsZC5hZGQoZyk7CiAgYm94KDAuMDYsIGZyLCB3dytmcioyLCBDLndoaXRlLCB3eCwgd3kwLWZyLCB6Yyk7ICAgICAgICAgICAgICAvLyBkYXZhbnphbGUKICBib3goMC4wNiwgd2grZnIqMiwgZnIsIEMud2hpdGUsIHd4LCB3eTAtZnIsIHpjLXd3LzItZnIvMik7ICAgIC8vIG1vbnRhbnRlIG5vcmQKICBib3goMC4wNiwgd2grZnIqMiwgZnIsIEMud2hpdGUsIHd4LCB3eTAtZnIsIHpjK3d3LzIrZnIvMik7ICAgIC8vIG1vbnRhbnRlIHN1ZAp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUElBTlRBIOKAlCBkYWxsZSBtaXN1cmUgZGVsbGEgcGxhbmltZXRyaWEgZmlybWF0YSAoVmljb2xvIGRlbCBQaXR0b3JlIDEpCi8vIHg6IG92ZXN0KC0pIOKGkiBlc3QoKykgICB6OiBub3JkL2NhbWVyYSgtKSDihpIgc3VkL1ZpYSBkZWwgRHVvbW8oKykKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLyBwZXJpbWV0cm8sIGNvbiBhbmdvbG8gYXJyb3RvbmRhdG8gYSBub3JkLW92ZXN0IChwYXJldGUgaW4gY2FydG9uZ2Vzc28gY3VydmEpIGUgZmFjY2lhdGEgc3VkIGEgZ3JhZGlubwooZnVuY3Rpb24oKXsKICAvLyByYWNjb3JkbyBzZW1pY2lyY29sYXJlIGZyYSBwYXJldGUgb3Zlc3QgZSBwYXJldGUgbm9yZCwgcmFnZ2lvIDAuNzUgbQogIGNvbnN0IFI9MC43NSwgT3g9LTEuOTUsIE96PS0zLjU1LCBOPTY7CiAgbGV0IHByZXY9W094LVIsIE96XTsgICAgICAgICAgICAgICAgICAgICAgLy8gdGFuZ2VudGUgc3VsbGEgcGFyZXRlIG92ZXN0CiAgZm9yKGxldCBrPTE7azw9TjtrKyspewogICAgY29uc3QgdGggPSBNYXRoLlBJICsgayooMC41Kk1hdGguUEkpL047CiAgICBjb25zdCBwID0gW094K1IqTWF0aC5jb3ModGgpLCBPeitSKk1hdGguc2luKHRoKV07CiAgICB3YWxsKHByZXZbMF0scHJldlsxXSwgcFswXSxwWzFdKTsKICAgIHByZXYgPSBwOwogIH0KfSkoKTsKd2FsbCgtMS45NSwtNC4zLCAgMi43LC00LjMpOyAgICAgICAgICAgICAvLyBub3JkIOKAlCBjYW1lcmEKd2FsbCggMi43LC00LjMsICAyLjcsLTQuMTUpOyAgICAgICAgICAgICAgLy8gZXN0IOKAlCB0cmF0dG8gcGllbm8Kd2FsbCggMi43LC00LjE1LCAyLjcsLTMuMTUsIDAuODApOyAgICAgICAgLy8gZXN0IOKAlCBkYXZhbnphbGUgZmluZXN0cmEgMQp3YWxsKCAyLjcsLTMuMTUsIDIuNywtMi4xNSk7ICAgICAgICAgICAgICAvLyBlc3Qg4oCUIHRyYXR0byBwaWVubyBmcmEgbGUgZmluZXN0cmUKd2FsbCggMi43LC0yLjE1LCAyLjcsLTEuMTUsIDAuODApOyAgICAgICAgLy8gZXN0IOKAlCBkYXZhbnphbGUgZmluZXN0cmEgMgp3YWxsKCAyLjcsLTEuMTUsIDIuNywgMC45NSk7ICAgICAgICAgICAgICAvLyBlc3Qg4oCUIGZpbm8gYWxsYSBwb3J0YSBkJ2luZ3Jlc3NvCndhbGwoIDIuNywgMS44NSwgMi43LCAyLjE1KTsgICAgICAgICAgICAgIC8vIGVzdCDigJQgdHJhdHRvIHBpZW5vIGFjY2FudG8gYWxsYSBwb3J0YQp3YWxsKCAyLjcsIDIuMTUsIDIuNywgMy4zNSwgMC44MCk7ICAgICAgICAvLyBlc3Qg4oCUIGRhdmFuemFsZSBkZWxsYSBmaW5lc3RyYSBkYSAxLDIwCndhbGwoIDIuNywgMy4zNSwgMi43LCA0LjE1KTsgICAgICAgICAgICAgIC8vIGVzdCDigJQgZmlubyBhbGwnYW5nb2xvCgovLyBwb3J0YSBibGluZGF0YSBkJ2luZ3Jlc3NvLCA5MCBjbSwgYXBlcnRhIHZlcnNvIGwnaW50ZXJuby4KLy8gQW50YSBtb25vbGl0aWNhOiBiaWFuY2EgZGVudHJvLCBsZWdubyB2ZXJzbyBsJ2VzdGVybm8uCihmdW5jdGlvbigpewogIGNvbnN0IGR4PTIuNzAsIHpjPTEuNDAsIGR3PTAuOTAsIGRoPTEuODAsIGFwPU1hdGguUEkqMC41NjsgICAvLyB+MTAwIGdyYWRpCiAgY29uc3QgYmlhbmNvID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtjb2xvcjoweEYyRUVFNywgcm91Z2huZXNzOjAuODAsIG1ldGFsbmVzczowLjB9KTsKICBjb25zdCBsZWdubyAgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe21hcDp3b29kVGV4dHVyZSgpLCBjb2xvcjoweEZBQ0I5NSwgcm91Z2huZXNzOjAuODgsIG1ldGFsbmVzczowLjB9KTsKICBjb25zdCBib3JkbyAgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RTZFMEQ2LCByb3VnaG5lc3M6MC44NiwgbWV0YWxuZXNzOjAuMH0pOwoKICAvLyBjYXJkaW5lIHN1bCBsYXRvIHZlcnNvIGxhIHpvbmEgcHJhbnpvCiAgY29uc3QgY2FyZGluZSA9IG5ldyBUSFJFRS5Hcm91cCgpOwogIGNhcmRpbmUucG9zaXRpb24uc2V0KGR4LCAwLCB6Yytkdy8yKTsKICBjYXJkaW5lLnJvdGF0aW9uLnkgPSBhcDsKICB3b3JsZC5hZGQoY2FyZGluZSk7CgogIC8vIG9yZGluZSBmYWNjZTogK1ggZXN0ZXJubyAobGVnbm8pLCAtWCBpbnRlcm5vIChiaWFuY28pCiAgY29uc3QgYW50YSA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgwLjA3LGRoLGR3KSwKICAgIFtsZWdubywgYmlhbmNvLCBib3JkbywgYm9yZG8sIGJvcmRvLCBib3Jkb10pOwogIGFudGEucG9zaXRpb24uc2V0KDAsIGRoLzIsIC1kdy8yKTsKICBhbnRhLmNhc3RTaGFkb3c9dHJ1ZTsgYW50YS5yZWNlaXZlU2hhZG93PXRydWU7IGNhcmRpbmUuYWRkKGFudGEpOwoKICAvLyBtYW5pZ2xpYSBzdWwgbGF0byBpbnRlcm5vLCBpbiBmb25kbyBhbGwnYW50YQogIGNvbnN0IG1ldD1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4OEY4QTgzLCByb3VnaG5lc3M6MC4yOCwgbWV0YWxuZXNzOjAuOTB9KTsKICBjb25zdCBybz1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAyOCwwLjAyOCwwLjAzLDEyKSwgbWV0KTsKICByby5wb3NpdGlvbi5zZXQoLTAuMDUsMS4wMiwtKGR3LTAuMTQpKTsgcm8ucm90YXRpb24uej1NYXRoLlBJLzI7IGNhcmRpbmUuYWRkKHJvKTsKICBjb25zdCBobT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAxMywwLjAxMywwLjE0LDgpLCBtZXQpOwogIGhtLnBvc2l0aW9uLnNldCgtMC4xMCwxLjAyLC0oZHctMC4xNCkpOyBobS5yb3RhdGlvbi56PU1hdGguUEkvMjsgY2FyZGluZS5hZGQoaG0pOwoKICAvLyBzdGlwaXRpIGZpc3NpIG5lbCBtdXJvCiAgYm94KDAuMTAsZGgsMC4wNTUsQy53YWxsLCBkeCwgMCwgemMtZHcvMi0wLjAyOCk7CiAgYm94KDAuMTAsZGgsMC4wNTUsQy53YWxsLCBkeCwgMCwgemMrZHcvMiswLjAyOCk7Cn0pKCk7CndhbGwoLTIuNywtMy41NSwgLTIuNywgMy4zKTsgICAgICAgICAgICAgLy8gb3Zlc3Qg4oCUIGNvbnRpbnVhCgovLyBkaXZpc29yaW8gY2FtZXJhIC8gY29ycmlkb2lvOiB0cmF0dG8gaW4gcGlldHJhIGEgdmlzdGEgKyB0cmF0dG8gaW50b25hY2F0byBiaWFuY28Kd2FsbCgtMi43LC0wLjgsIC0wLjQzLC0wLjgpOyAgICAgICAgICAgICAgICAgICAgICAvLyBiaWFuY28sIGEgZmlsbyBjb2wgZnJvbnRlCnN0b25lV2FsbCggMC40LC0wLjgsICAyLjcsLTAuOCwgU1RPTkUpOyAgIC8vIGluIHBpZXRyYQoKLy8gY29ybmljZSBkaSBpbnRvbmFjbyBzdWxsYSBwYXJldGUgaW4gcGlldHJhOiBmYXNjaWEgYmFzc2EgKyBtb250YW50ZSBzdWwgbGF0byBwb3J0YQooZnVuY3Rpb24oKXsKICBjb25zdCB6Zj0tMC44ODUsIG09bWF0KEMud2FsbCk7ICAgICAgICAgICAgICAgICAvLyBmaWxvIHBpZXRyYSArIDEsNSBjbSBkaSBpbnRvbmFjbwogIGNvbnN0IGFkZD0odyxoLHgseSk9PnsKICAgIGNvbnN0IHA9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KHcsaCwwLjAzNSksIG0pOwogICAgcC5wb3NpdGlvbi5zZXQoeCx5K2gvMix6Zik7CiAgICBwLmNhc3RTaGFkb3c9dHJ1ZTsgcC5yZWNlaXZlU2hhZG93PXRydWU7IHdhbGxHcm91cC5hZGQocCk7CiAgfTsKICBhZGQoMi4zMCwgMC4zMCwgMS41NSwgMCk7ICAgICAgIC8vIGZhc2NpYSBiYXNzYSwgYWx0YSAzMCBjbSwgcGVyIHR1dHRhIGxhIGxhcmdoZXp6YQogIGFkZCgwLjUwLCAxLjgwLCAwLjY1LCAwKTsgICAgICAgLy8gbW9udGFudGUgZGVzdHJvLCBsYXJnbyA1MCBjbSwgZmlubyBhbCBzb2ZmaXR0bwp9KSgpOwoKLy8gRlJPTlRFIExJTkVBUkUgdmVyc28gaWwgc29nZ2lvcm5vICh4ID0gLTAuNSksIGNvbiBxdWF0dHJvIGFwZXJ0dXJlOgovLyBwb3J0YSBiYWdubywgaSBkdWUgc3BvcnRlbGxpIGRlbGwnYW5nb2xvIGNvdHR1cmEsIHBvcnRhIGRlbCByaXBvc3RpZ2xpbwp3YWxsKC0wLjUsLTAuODAsIC0wLjUsIDAuMzUpOyAgICAgLy8gcGllbm8sIGRhbGwnYW5nb2xvIGNhbWVyYSBmaW5vIGFsbGEgcG9ydGEKLy8gUE9SVEEgQkFHTk8gZGEgNzAgY206IHogMC4zNSAuLiAxLjA1LCBhY2NhbnRvIGFsIG11cm8gZGVsbGEgZG9jY2lhCndhbGwoLTAuNSwgMS4wNSwgLTAuNSwgMS4xNSk7ICAgICAvLyBwaWVubywgZmlubyBhZ2xpIHNwb3J0ZWxsaSBkZWxsYSBjdWNpbmEKd2FsbCgtMC41LCAyLjY1LCAtMC41LCAyLjcyKTsgICAgIC8vIHBpZW5vLCBmcmEgY3VjaW5hIGUgcmlwb3N0aWdsaW8Kd2FsbCgtMC41LCAyLjcyLCAtMC41LCAzLjMwKTsgICAgIC8vIHBpZW5vLCBmaW5vIGFsIGZvbmRvCgovLyBjYXJ0YSBkYSBwYXJhdGkgc3VsIGZyb250ZSwgbGF0byBzb2dnaW9ybm86IHVuIHRlbG8gY29udGludW8gc3VpIHRyYXR0aSBwaWVuaQooZnVuY3Rpb24oKXsKICBjb25zdCB0ZXg9Y2FydGFUZXh0dXJlKCk7CiAgY29uc3QgeGY9LTAuNDE1OyAgICAgICAgICAgICAgICAgICAgICAgLy8gMSw1IGNtIGRhdmFudGkgYWwgZmlsbyBkZWwgbXVybwogIGNvbnN0IEg9MS44MDsKICBjb25zdCB0ZWxvPSh6MCx6MSk9PnsKICAgIGNvbnN0IEw9ejEtejA7CiAgICBjb25zdCB0PXRleC5jbG9uZSgpOyB0Lm5lZWRzVXBkYXRlPXRydWU7CiAgICB0LnJlcGVhdC5zZXQoTC8xLjA1LCBILzEuMDUpOyAgICAgICAgLy8gMSB0ZWxvIG9nbmkgMTA1IGNtLCBjb21lIGxhIGNhcnRhIHZlcmEKICAgIHQub2Zmc2V0LnNldCgoejArMi4wKS8xLjA1LCAwKTsgICAgICAvLyBjb250aW51aXRhJyBkZWwgZGlzZWdubyBmcmEgaSB0cmF0dGkKICAgIGNvbnN0IG09bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuMDIsSCxMKSwKICAgICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHttYXA6dCwgYnVtcE1hcDp0LCBidW1wU2NhbGU6MC4wMTIsCiAgICAgICAgcm91Z2huZXNzOjAuOTUsIG1ldGFsbmVzczowLjAsCiAgICAgICAgcG9seWdvbk9mZnNldDp0cnVlLCBwb2x5Z29uT2Zmc2V0RmFjdG9yOi0xLCBwb2x5Z29uT2Zmc2V0VW5pdHM6LTF9KSk7CiAgICBtLnBvc2l0aW9uLnNldCh4ZixILzIsKHowK3oxKS8yKTsKICAgIG0ucmVjZWl2ZVNoYWRvdz10cnVlOyB3b3JsZC5hZGQobSk7CiAgfTsKICB0ZWxvKC0wLjgwLCAwLjM1KTsgICAgICAgICAgICAgICAgICAgICAvLyB0cmF0dG8gdmVyc28gbGEgY2FtZXJhCiAgdGVsbyggMS4wNSwgMS4xNSk7ICAgICAgICAgICAgICAgICAgICAgLy8gZnJhIHBvcnRhIGJhZ25vIGUgY3VjaW5hCiAgdGVsbyggMi42NSwgMy4zMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZG9wbyBsYSBjdWNpbmEKICB0ZWxvKCAzLjMwLCA0LjE1KTsgICAgICAgICAgICAgICAgICAgICAvLyBmaW5vIGFsbGEgZmFjY2lhdGEgc3VkCgogIC8vIHNwYWxsZSAoc2d1aW5jaSkgZGVsbGUgZHVlIGFwZXJ0dXJlOiBhbmNoZSBsbyBzcGVzc29yZSBkZWwgbXVybyBlJyByaXZlc3RpdG8KICBjb25zdCBzcGFsbGE9KHpjLHZlcnNvLFgwKT0+ewogICAgY29uc3QgWDE9LTAuNDMsIEw9WDEtWDA7CiAgICBjb25zdCB0PXRleC5jbG9uZSgpOyB0Lm5lZWRzVXBkYXRlPXRydWU7CiAgICB0LnJlcGVhdC5zZXQoTC8xLjA1LCBILzEuMDUpOwogICAgdC5vZmZzZXQuc2V0KCh6YysyLjApLzEuMDUsIDApOwogICAgY29uc3QgbT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoTCxILDAuMDIpLAogICAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe21hcDp0LCBidW1wTWFwOnQsIGJ1bXBTY2FsZTowLjAxMiwKICAgICAgICByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMCwKICAgICAgICBwb2x5Z29uT2Zmc2V0OnRydWUsIHBvbHlnb25PZmZzZXRGYWN0b3I6LTEsIHBvbHlnb25PZmZzZXRVbml0czotMX0pKTsKICAgIG0ucG9zaXRpb24uc2V0KChYMCtYMSkvMiwgSC8yLCB6Yyt2ZXJzbyowLjAxNSk7CiAgICBtLnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKG0pOwogIH07CiAgLy8gZGF2YW50aSBhbGxhIGN1Y2luYSBsbyBzZ3VpbmNpbyBzaSBmZXJtYSBhbCBmaWxvIGRlbCBtb2JpbGUKICBzcGFsbGEoMS4xNSwgKzEsIC0wLjUwKTsgICAgICAgICAgICAgICAvLyBzZ3VpbmNpbyBub3JkIGRlbGxhIGN1Y2luYQogIHNwYWxsYSgyLjY1LCAtMSwgLTAuNTApOyAgICAgICAgICAgICAgIC8vIHNndWluY2lvIHN1ZCBkZWxsYSBjdWNpbmEKICBzcGFsbGEoMC4zNSwgKzEsIC0wLjU3KTsgICAgICAgICAgICAgICAvLyBzZ3VpbmNpbyBub3JkIGRlbGxhIHBvcnRhIGJhZ25vCiAgc3BhbGxhKDEuMDUsIC0xLCAtMC41Nyk7ICAgICAgICAgICAgICAgLy8gc2d1aW5jaW8gc3VkIGRlbGxhIHBvcnRhIGJhZ25vCn0pKCk7CgovLyBkaXZpc29yaW8gYmFnbm8gLyBmYXNjaWEgYmFzc2EgKGRvY2NpYSArIGN1Y2luYSArIHJpcG9zdGlnbGlvKQovLyBzZXR0byBwaWVubyBmcmEgYmFnbm8gZSBjdWNpbmE6IGJsb2NjbyBtYXNzaWNjaW8sIHNlbnphIGZlc3N1cmUKKGZ1bmN0aW9uKCl7CiAgY29uc3QgeDA9LTEuMjYsIHgxPS0wLjQzLCB6MD0wLjk0LCB6MT0xLjE5LCBoPTEuODA7CiAgY29uc3QgbT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoeDEteDAsaCx6MS16MCksIG1hdChDLndhbGwpKTsKICBtLnBvc2l0aW9uLnNldCgoeDAreDEpLzIsaC8yLCh6MCt6MSkvMik7CiAgbS5jYXN0U2hhZG93PXRydWU7IG0ucmVjZWl2ZVNoYWRvdz10cnVlOyB3YWxsR3JvdXAuYWRkKG0pOwogIGNvbnN0IGNhcD1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoeDEteDArMC4wMDUsMC4wNCx6MS16MCswLjAwNSksIG1hdChDLndhbGxUb3ApKTsKICBjYXAucG9zaXRpb24uc2V0KCh4MCt4MSkvMixoLCh6MCt6MSkvMik7IHdhbGxHcm91cC5hZGQoY2FwKTsKfSkoKTsKCi8vIHNldHRpIGNoZSBzZXBhcmFubyBkb2NjaWEsIGFuZ29sbyBjb3R0dXJhIGUgcmlwb3N0aWdsaW8KLy8gYmxvY2NvIHBpZW5vIGZyYSBkb2NjaWEgZSBjdWNpbmE6IG5lc3N1bmEgaW50ZXJjYXBlZGluZSB2dW90YQooZnVuY3Rpb24oKXsKICBjb25zdCB4MD0tMS41NSwgeDE9LTEuMjAsIHowPTAuOTgsIHoxPTMuMzAsIGg9MS44MDsgICAvLyBmaWxvIGFsbGluZWF0byBhbCBtdXJvIGEgej0xLjA1CiAgY29uc3QgbT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoeDEteDAsaCx6MS16MCksIG1hdChDLndhbGwpKTsKICBtLnBvc2l0aW9uLnNldCgoeDAreDEpLzIsaC8yLCh6MCt6MSkvMik7CiAgbS5jYXN0U2hhZG93PXRydWU7IG0ucmVjZWl2ZVNoYWRvdz10cnVlOyB3YWxsR3JvdXAuYWRkKG0pOwogIGNvbnN0IGNhcD1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoeDEteDArMC4wMDUsMC4wNCx6MS16MCswLjAwNSksIG1hdChDLndhbGxUb3ApKTsKICBjYXAucG9zaXRpb24uc2V0KCh4MCt4MSkvMixoLCh6MCt6MSkvMik7IHdhbGxHcm91cC5hZGQoY2FwKTsKfSkoKTsKd2FsbCgtMS4yMCwgMi42OCwgLTAuNSwgMi42OCk7ICAgIC8vIGZyYSBhbmdvbG8gY290dHVyYSBlIHJpcG9zdGlnbGlvCgovLyBmYWNjaWF0YSBzdWQsIGEgZ3JhZGlubywgY29uIHZhcmNvIHBlciBsJ2luZ3Jlc3NvCndhbGwoLTIuNywgMy4zLCAtMC41LCAzLjMpOwp3YWxsKC0wLjUsIDMuMywgLTAuNSwgNC4xNSk7CndhbGwoLTAuNSwgNC4xNSwtMC4zLCA0LjE1KTsKLy8gZmluZXN0cmEgc3VsbGEgZmFjY2lhdGEgc3VkLCBub24gdW4gaW5ncmVzc286IHNvdHRvIHJlc3RhIGlsIGRhdmFuemFsZQp3YWxsKC0wLjMsIDQuMTUsIDAuNiwgNC4xNSwgMC44MCk7CihmdW5jdGlvbigpewogIGNvbnN0IHpjPTQuMTUsIHhjPTAuMTUsIHdsPTAuOTAsIHd5MD0wLjgwLCB3aD0xLjAwLCBmcj0wLjA0OwogIGNvbnN0IGc9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KHdsLHdoLDAuMDUpLAogICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtjb2xvcjoweENGRTBFNCwgdHJhbnNwYXJlbnQ6dHJ1ZSwgb3BhY2l0eTowLjM1LCByb3VnaG5lc3M6MC45MCwgbWV0YWxuZXNzOjAuMH0pKTsKICBnLnBvc2l0aW9uLnNldCh4Yywgd3kwK3doLzIsIHpjKTsgd29ybGQuYWRkKGcpOwogIGJveCh3bCtmcioyLCBmciwgMC4wNiwgQy53aGl0ZSwgeGMsIHd5MC1mciwgemMpOyAgICAgICAgICAgIC8vIGRhdmFuemFsZQogIGJveChmciwgd2grZnIqMiwgMC4wNiwgQy53aGl0ZSwgeGMtd2wvMi1mci8yLCB3eTAtZnIsIHpjKTsgIC8vIG1vbnRhbnRlIG92ZXN0CiAgYm94KGZyLCB3aCtmcioyLCAwLjA2LCBDLndoaXRlLCB4Yyt3bC8yK2ZyLzIsIHd5MC1mciwgemMpOyAgLy8gbW9udGFudGUgZXN0Cn0pKCk7CnN0b25lV2FsbCggMC42LCA0LjE1LCAyLjcsIDQuMTUsIFNUT05FKTsgICAvLyB6b25hIHByYW56bywgcGlldHJhIGEgdmlzdGEKLy8gYmFzYW1lbnRvIGRpIGludG9uYWNvIGFsbGEgYmFzZSBkZWxsYSBwaWV0cmEsIGFsdG8gNTAgY20KKGZ1bmN0aW9uKCl7CiAgY29uc3QgemY9NC4xNS0wLjA3LTAuMDE3NTsgICAgICAgICAgICAgICAgICAgIC8vIGZpbG8gcGlldHJhICsgMSw1IGNtIGRpIGludG9uYWNvCiAgY29uc3QgYj1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoMi4xMCwwLjUwLDAuMDM1KSwgbWF0KEMud2FsbCkpOwogIGIucG9zaXRpb24uc2V0KDEuNjUsMC4yNSx6Zik7CiAgYi5jYXN0U2hhZG93PXRydWU7IGIucmVjZWl2ZVNoYWRvdz10cnVlOyB3YWxsR3JvdXAuYWRkKGIpOwp9KSgpOwoKLy8gc29sZXR0YSBlIHBhdmltZW50aQpjb25zdCBiYXNlID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDUuNywwLjE2LDguNzUpLCBtYXQoQy5zdG9uZSkpOwpiYXNlLnBvc2l0aW9uLnNldCgwLC0wLjA4LC0wLjA3NSk7IGJhc2UucmVjZWl2ZVNoYWRvdz10cnVlOyB3b3JsZC5hZGQoYmFzZSk7CnNsYWIoNS40LDMuNSwgQy5mbG9vciwgICAwLCAgIC0yLjU1KTsgICAvLyBjYW1lcmEKc2xhYigyLjIwLDEuODUsIEMudGlsZSwgICAtMS42MCwgMC4xMjUpOyAgLy8gYmFnbm8Kc2xhYigxLjE1LDIuMjUsIEMuZmxvb3IsICAtMi4xMiwgMi4xNzUpOyAgLy8gZG9jY2lhIOKAlCBzdGVzc28gcGF2aW1lbnRvIGRlbGxhIGNhc2EKc2xhYigwLjcwLDEuNjAsIDB4OUU5MDc4LCAtMC44NSwgMS44NTApOyAgLy8gYW5nb2xvIGNvdHR1cmEgKDE1MCBjbSBkaSBmcm9udGUpCnNsYWIoMy4yLDQuOTUsQy5mbG9vciwgICAxLjEsICAxLjY3NSk7ICAvLyBzb2dnaW9ybm8KCi8vIGR1ZSBmaW5lc3RyZSAxeDEgbSBzdWxsYSBwYXJldGUgZXN0IGRlbGxhIGNhbWVyYSwgdmljaW5vIGFsIGxldHRvCmVhc3RXaW5kb3coLTMuNjUpOwplYXN0V2luZG93KC0xLjY1KTsKZWFzdFdpbmRvdygyLjc1LCAxLjIwKTsgICAvLyBhY2NhbnRvIGFsbGEgcG9ydGEgZCdpbmdyZXNzbwoKLy8gLS0tLSBDQU1FUkEgKGggcmVhbGUgMiw3MCBtKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY29uc3QgYmVkWCA9IDEuNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfjUwIGNtIGRhbGxhIHBhcmV0ZSBlc3QKKGZ1bmN0aW9uKCl7CiAgY29uc3QgQlo9LTMuMTUsIEJXPTEuNjUsIEJEPTIuMDA7ICAgICAgICAgICAgICAgICAgIC8vIGNlbnRybywgbGFyZ2hlenphLCBwcm9mb25kaXRhJwogIGNvbnN0IGxlZ25vID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHttYXA6d29vZFRleHR1cmUoKSwgY29sb3I6MHg4QTZBNEUsIHJvdWdobmVzczowLjg4LCBtZXRhbG5lc3M6MC4wfSk7CiAgY29uc3QgbGlubyAgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RjJFQ0UxLCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGxpbm8yID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtjb2xvcjoweEU3REZEMSwgcm91Z2huZXNzOjAuOTUsIG1ldGFsbmVzczowLjB9KTsKICBjb25zdCBjb3ByaSA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHhEM0M3QjIsIHJvdWdobmVzczowLjk1LCBtZXRhbG5lc3M6MC4wfSk7CiAgY29uc3QgZGVjbyAgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4OEM4NjcyLCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IHBpZWRlID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtjb2xvcjoweDNBMkExRSwgcm91Z2huZXNzOjAuODksIG1ldGFsbmVzczowLjB9KTsKCiAgLy8gcGllZGluaTogaWwgbGV0dG8gc3RhY2NhIGRhIHRlcnJhIGludmVjZSBkaSBlc3NlcmUgdW4gYmxvY2NvIGFwcG9nZ2lhdG8KICBbWy0xLC0xXSxbMSwtMV0sWy0xLDFdLFsxLDFdXS5mb3JFYWNoKChbc3gsc3pdKT0+ewogICAgY29uc3QgZz1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAzMCwwLjAyMiwwLjE0LDgpLCBwaWVkZSk7CiAgICBnLnBvc2l0aW9uLnNldChiZWRYK3N4KihCVy8yLTAuMTIpLCAwLjA3LCBCWitzeiooQkQvMi0wLjEyKSk7CiAgICBnLmNhc3RTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKGcpOwogIH0pOwogIHNvZnRCb3goQlcsMC4yMCxCRCwwLjAzLDAuMDEyLCBsZWdubywgYmVkWCwwLjE0LEJaKTsgICAgICAgICAgICAvLyBnaXJvbGV0dG8KCiAgLy8gbWF0ZXJhc3NvIGluIGR1ZSBzdHJhdGk6IGJhc2UgcGl1JyBzb2RhLCBzb3ByYSBxdWVsbG8gbW9yYmlkbwogIHNvZnRCb3goQlctMC4wOCwwLjE3LEJELTAuMDYsMC4wNSwwLjAyNSwgbGlubzIsIGJlZFgsMC4zNCxCWik7CiAgc29mdEJveChCVy0wLjEwLDAuMDksQkQtMC4wOCwwLjA0NSwwLjAzMCwgbGlubywgIGJlZFgsMC41MSxCWik7CgogIC8vIHBpdW1vbmU6IGNvcHJlIGkgZHVlIHRlcnppIGJhc3NpLCBkZWJvcmRhIHN1aSBsYXRpLCBjb24gaWwgcmlzdm9sdG8gaW4gYWx0bwogIHNvZnRCb3goQlcrMC4wNiwwLjEzLDEuMjgsMC4wNywwLjA1MCwgY29wcmksIGJlZFgsMC41NixCWiswLjMyKTsKICBzb2Z0Qm94KEJXKzAuMDcsMC4wNiwwLjE2LDAuMDMsMC4wMjUsIGxpbm8sICBiZWRYLDAuNjgsQlotMC4zMik7CgogIC8vIGd1YW5jaWFsaSBhcHBvZ2dpYXRpIGFsbGEgdGVzdGllcmE6IHNmZXJlIHNjaGlhY2NpYXRlLCBub24gcGFyYWxsZWxlcGlwZWRpCiAgWy0wLjM4LDAuMzhdLmZvckVhY2gob3g9PnsKICAgIGNvbnN0IGM9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMzAsMTgsMTIpLCBsaW5vKTsKICAgIGMuc2NhbGUuc2V0KDEuMDUsMC4zMCwwLjYyKTsKICAgIGMucG9zaXRpb24uc2V0KGJlZFgrb3gsMC42NixCWi0wLjgwKTsKICAgIGMucm90YXRpb24ueD0tMC4yMjsKICAgIGMuY2FzdFNoYWRvdz10cnVlOyBjLnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKGMpOwogIH0pOwogIC8vIGR1ZSBjdXNjaW5pIGRlY29yYXRpdmkgZGF2YW50aQogIFstMC4yOCwwLjI4XS5mb3JFYWNoKG94PT57CiAgICBjb25zdCBjPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSgwLjIwLDE2LDEwKSwgZGVjbyk7CiAgICBjLnNjYWxlLnNldCgxLjAsMC4zNCwwLjcyKTsKICAgIGMucG9zaXRpb24uc2V0KGJlZFgrb3gsMC42NixCWi0wLjUwKTsKICAgIGMucm90YXRpb24ueD0tMC4zMDsKICAgIGMuY2FzdFNoYWRvdz10cnVlOyB3b3JsZC5hZGQoYyk7CiAgfSk7CgogIC8vIHRlc3RpZXJhOiBwYW5uZWxsbyBhcnJldHJhdG8gcGl1JyBkb2doZSB2ZXJ0aWNhbGkgaW4gcmlsaWV2bwogIHNvZnRCb3goQlcrMC4xMCwwLjY2LDAuMDgsMC4wMiwwLjAxMiwgbGVnbm8sIGJlZFgsMC4zMCxCWi1CRC8yLTAuMDUpOwogIGZvcihsZXQgaT0tNDtpPD00O2krKykKICAgIHNvZnRCb3goMC4xNSwwLjYwLDAuMDM1LDAuMDEyLDAuMDA4LCBsZWdubywgYmVkWCtpKjAuMTc1LDAuMzMsQlotQkQvMi0wLjAwNSk7Cn0pKCk7Ci8vIChwYW5jYSBhaSBwaWVkaSBkZWwgbGV0dG8gcmltb3NzYSBzdSByaWNoaWVzdGEpCi8vIGRpc2NvIGluIHJhZmlhIHNvcHJhIGxhIHRlc3RpZXJhCmNvbnN0IGRpc2MgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjQsMC40LDAuMDUsMjgpLCBtYXQoQy5icmFzcykpOwpkaXNjLnJvdGF0aW9uLnggPSBNYXRoLlBJLzI7IGRpc2MucG9zaXRpb24uc2V0KGJlZFgsMS4xNSwtNC4yKTsKZGlzYy5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChkaXNjKTsKcGxhbnQoYmVkWC0xLjE1LC00LjAsMC45KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGlhbnRpbmEgYWwgcG9zdG8gZGVsIGNvbW9kaW5vLCBwacO5IGdyYW5kZQpzbGFiKDEuNSwxLjAsQy5ydWcsYmVkWCwtMi41NSwwLjAyKTsKCi8vIC0tLS0gYW5nb2xvIHZhc2NhOiBwYXJldGUgaW4gcGlldHJhLCB2YXNjYSBhZCBhbmdvbG8sIGNhc3NhcGFuY2EsIHNwZWNjaGlvIC0tCmNvbnN0IFdYID0gLTIuNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbG8gaW50ZXJubyBwYXJldGUgb3Zlc3QKCi8vIHBhbm5lbGxvIGRpIHBpZXRyYSBhIHZpc3RhIOKAlCByZXN0YSB2aXNpYmlsZSBhbmNoZSBuYXNjb25kZW5kbyBpIG11cmkKKGZ1bmN0aW9uKCl7CiAgY29uc3Qgc2lkZSA9IG1hdCgweEI5QUE5MCk7CiAgY29uc3QgZmFjZSA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7bWFwOlNUT05FLm1hcCwgYnVtcE1hcDpTVE9ORS5idW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBTY2FsZTowLjA5LCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIC8vIG9yZGluZSBmYWNjZSBCb3hHZW9tZXRyeTogK1gsIC1YLCArWSwgLVksICtaLCAtWiDigJQgbGEgZmFjY2lhIGEgdmlzdGEgw6ggK1gKICBjb25zdCBwID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuMDcsMS43MiwyLjMwKSwKICAgIFtmYWNlLCBzaWRlLCBzaWRlLCBzaWRlLCBzaWRlLCBzaWRlXSk7CiAgcC5wb3NpdGlvbi5zZXQoV1grMC4xMCwgMC45MywgLTIuMTApOwogIHAuY2FzdFNoYWRvdz10cnVlOyBwLnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKHApOwp9KSgpOwovLyB6b2Njb2xvIGJpYW5jbyBhbGxhIGJhc2UgZGVsbGEgcGlldHJhCmJveCgwLjI2LDAuMTQsMi4zMCwgQy53aGl0ZSwgV1grMC4yMSwwLC0yLjEwKTsKCi8vIHZhc2NhIGlkcm9tYXNzYWdnaW8gYWQgYW5nb2xvIOKAlCBxdWFydG8gZGkgY2VyY2hpbwpjb25zdCBUUj0xLjA1LCBUSD0wLjU1LCB0Y3g9V1grMC4wNywgdGN6PS0wLjkwOwpjb25zdCB0dWIgPSBuZXcgVEhSRUUuTWVzaCgKICBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShUUixUUiowLjkzLFRILDMyLDEsZmFsc2UsTWF0aC5QSS8yLE1hdGguUEkvMiksIG1hdChDLndoaXRlKSk7CnR1Yi5wb3NpdGlvbi5zZXQodGN4LFRILzIsdGN6KTsKdHViLmNhc3RTaGFkb3c9dHJ1ZTsgdHViLnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKHR1Yik7CmNvbnN0IHR1YlcgPSBuZXcgVEhSRUUuTWVzaCgKICBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShUUiowLjkwLFRSKjAuOTAsMC4xMCwzMiwxLGZhbHNlLE1hdGguUEkvMixNYXRoLlBJLzIpLAogIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHgyRThBQTAsIGVtaXNzaXZlOjB4MEUzQTQ2LCByb3VnaG5lc3M6MC4xOCwgbWV0YWxuZXNzOjAuMH0pKTsKdHViVy5wb3NpdGlvbi5zZXQodGN4LFRILTAuMDcsdGN6KTsgd29ybGQuYWRkKHR1YlcpOwoKLy8geXVjY2EgaW4gdmFzbyBkaSB0ZXJyYWNvdHRhLCBhY2NhbnRvIGFsbGEgdmFzY2EKKGZ1bmN0aW9uKCl7CiAgY29uc3QgcHg9LTEuMzgsIHB6PS0xLjAyOwogIGNvbnN0IHBvdD1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjE2NSwwLjEyNSwwLjI4LDE4KSwgbWF0KDB4N0E0QTJFKSk7CiAgcG90LnBvc2l0aW9uLnNldChweCwwLjE0LHB6KTsgcG90LmNhc3RTaGFkb3c9dHJ1ZTsgcG90LnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKHBvdCk7CiAgY29uc3QgcmltPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMTc1LDAuMTc1LDAuMDM1LDE4KSwgbWF0KDB4OEM1ODNBKSk7CiAgcmltLnBvc2l0aW9uLnNldChweCwwLjI5LHB6KTsgd29ybGQuYWRkKHJpbSk7CiAgY3lsKDAuMDMyLDAuMjAsMHg2QjU1NDAscHgsMC4yOCxweiw4KTsgICAgICAgICAgICAvLyB0cm9uY28KICAvLyBkdWUgY29yb25lIGRpIGZvZ2xpZSBsdW5naGUgZSBhcHB1bnRpdGUKICBbWzAuNDYsMC45NSwweDRFNkI0NF0sWzAuMzQsMS4yNSwweDVDN0E1MF1dLmZvckVhY2goKFtiYXNlLHRpbHQsY29sXSxyKT0+ewogICAgZm9yKGxldCBpPTA7aTwxMztpKyspewogICAgICBjb25zdCBhPWkvMTMqNi4yODMgKyByKjAuMjQ7CiAgICAgIGNvbnN0IGxlbj0wLjMwKygoaSozKSU0KSowLjA3OwogICAgICBjb25zdCBsZj1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ29uZUdlb21ldHJ5KDAuMDI2LGxlbiw0KSwgbWF0KGNvbCkpOwogICAgICBjb25zdCB0PXRpbHQqKDAuODArKChpKjUpJTMpKjAuMTMpOwogICAgICBsZi5wb3NpdGlvbi5zZXQocHgrTWF0aC5jb3MoYSkqTWF0aC5zaW4odCkqbGVuKjAuNDUsCiAgICAgICAgICAgICAgICAgICAgICBiYXNlK01hdGguY29zKHQpKmxlbiowLjQ1LAogICAgICAgICAgICAgICAgICAgICAgcHorTWF0aC5zaW4oYSkqTWF0aC5zaW4odCkqbGVuKjAuNDUpOwogICAgICBsZi5yb3RhdGlvbi5zZXQoTWF0aC5zaW4oYSkqdCwgMCwgLU1hdGguY29zKGEpKnQpOwogICAgICBsZi5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChsZik7CiAgICB9CiAgfSk7Cn0pKCk7CgovLyBjYXNzYXBhbmNhIGluIGxlZ25vIHNjdXJvIGNvbiBmcm9udGFsaSBpbiBjYW5uYWdlLCBhcHBvZ2dpYXRhIGFsbGEgcGFyZXRlIG5vcmQKKGZ1bmN0aW9uKCl7CiAgY29uc3QgY3g9LTEuMDAsIGN6PS00LjA0LCBMPTAuOTYsIEQ9MC4zNDsgICAgICAgICAgLy8gMjAlIHBpw7kgcGljY29sYQogIC8vIGdhbWJlIGEgc3BpbGxvIGluY2xpbmF0ZQogIFtbLTAuMzcsLTAuMTFdLFswLjM3LC0wLjExXSxbLTAuMzcsMC4xMV0sWzAuMzcsMC4xMV1dLmZvckVhY2goKFtveCxvel0pPT57CiAgICBjb25zdCBnPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE4LDAuMDEzLDAuMTYsOCksIG1hdChDLndvb2RPbGQpKTsKICAgIGcucG9zaXRpb24uc2V0KGN4K294LDAuMDgsY3orb3opOwogICAgZy5yb3RhdGlvbi56PW94PDA\/MC4xMjotMC4xMjsgZy5yb3RhdGlvbi54PW96PDA\/LTAuMTA6MC4xMDsKICAgIGcuY2FzdFNoYWRvdz10cnVlOyB3b3JsZC5hZGQoZyk7CiAgfSk7CiAgYm94KEwsMC4yNCxELCBDLndvb2RPbGQsIGN4LDAuMTUsY3opOyAgICAgICAgICAgICAgLy8gY2Fzc2EKICAvLyBkdWUgcGFubmVsbGkgaW4gY2FubmFnZSBzdWwgZnJvbnRlLCB2ZXJzbyBsYSBzdGFuemEKICBbLTAuMjMsMC4yM10uZm9yRWFjaChveD0+IGJveCgwLjQwLDAuMTYsMC4wMTYsIDB4MkUyMTE5LCBjeCtveCwwLjE5LGN6K0QvMikpOwogIGJveChMKzAuMDMsMC4wOSxEKzAuMDMsIDB4NkU2NTU3LCBjeCwwLjM5LGN6KTsgICAgIC8vIHNlZHV0YSBpbWJvdHRpdGEKfSkoKTsKCi8vIGFwcGVuZGlhYml0aTogYmFycmEgbmVyYSBhIG11cm8gc29wcmEgbGEgY2Fzc2FwYW5jYSwgY29uIHN0YW1wZWxsZQooZnVuY3Rpb24oKXsKICBjb25zdCBieD0tMS4wMCwgYno9LTMuOTYsIEw9MC45NiwgaHk9MC45NCwgTlo9LTQuMzA7CiAgY29uc3QgdHViZT1tYXQoQy5ibGFjayk7CiAgY29uc3QgYmFyPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE4LDAuMDE4LEwsMTApLCB0dWJlKTsKICBiYXIucG9zaXRpb24uc2V0KGJ4LGh5LGJ6KTsgYmFyLnJvdGF0aW9uLno9TWF0aC5QSS8yOwogIGJhci5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChiYXIpOwogIC8vIGR1ZSBicmFjY2kgY2hlIGxhIGFnZ2FuY2lhbm8gYWxsYSBwYXJldGUgbm9yZAogIFstTC8yKzAuMDcsIEwvMi0wLjA3XS5mb3JFYWNoKG94PT57CiAgICBjb25zdCBhPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE0LDAuMDE0LDAuNDIsOCksIHR1YmUpOwogICAgYS5wb3NpdGlvbi5zZXQoYngrb3gsaHksKGJ6K05aKS8yKzAuMDMpOyBhLnJvdGF0aW9uLng9TWF0aC5QSS8yOwogICAgYS5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChhKTsKICB9KTsKICAvLyBzdGFtcGVsbGUgYmlhbmNoZQogIGZvcihsZXQgaT0wO2k8NTtpKyspewogICAgY29uc3QgeD1ieC1MLzIrMC4xNCtpKjAuMTc7CiAgICBjb25zdCBob29rPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Ub3J1c0dlb21ldHJ5KDAuMDI4LDAuMDA2LDYsMTIsTWF0aC5QSSksIG1hdChDLndoaXRlKSk7CiAgICBob29rLnBvc2l0aW9uLnNldCh4LGh5LTAuMDE2LGJ6KTsgd29ybGQuYWRkKGhvb2spOwogICAgY29uc3Qgc3A9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMDgsMC4wMDgsMC4xMCw2KSwgbWF0KEMud2hpdGUpKTsKICAgIHNwLnBvc2l0aW9uLnNldCh4LGh5LTAuMDgsYnopOyB3b3JsZC5hZGQoc3ApOwogICAgWy0xLDFdLmZvckVhY2goaz0+ewogICAgICBjb25zdCBhcm09bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuMDE2LDAuMDE0LDAuMTYpLCBtYXQoQy53aGl0ZSkpOwogICAgICBhcm0ucG9zaXRpb24uc2V0KHgsaHktMC4xNCxieitrKjAuMDcyKTsgYXJtLnJvdGF0aW9uLng9LWsqMC4zMDsKICAgICAgYXJtLmNhc3RTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKGFybSk7CiAgICB9KTsKICAgIGNvbnN0IGJvdD1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoMC4wMTMsMC4wMTEsMC4yNyksIG1hdChDLndoaXRlKSk7CiAgICBib3QucG9zaXRpb24uc2V0KHgsaHktMC4xNzYsYnopOyB3b3JsZC5hZGQoYm90KTsKICB9Cn0pKCk7CgovLyBzcGVjY2hpbyBhcmN1YXRvIGNvbiBjb3JuaWNlIG5lcmEsIHN1bGxhIHBhcmV0ZSBjdXJ2YQooZnVuY3Rpb24oKXsKICBjb25zdCBteD0tMi40MCwgbXo9LTQuMDAsIHJ5PU1hdGguUEkvNCwgV209MC41MiwgSG09MS4yOCwgcj1XbS8yOwogIGZ1bmN0aW9uIHNhZ29tYSh3LGgpewogICAgY29uc3Qgcz1uZXcgVEhSRUUuU2hhcGUoKTsKICAgIHMubW92ZVRvKC13LzIsMCk7IHMubGluZVRvKC13LzIsaC13LzIpOwogICAgcy5hYnNhcmMoMCxoLXcvMix3LzIsTWF0aC5QSSwwLHRydWUpOwogICAgcy5saW5lVG8ody8yLDApOyBzLmxpbmVUbygtdy8yLDApOwogICAgcmV0dXJuIHM7CiAgfQogIGNvbnN0IGZyYW1lPW5ldyBUSFJFRS5NZXNoKAogICAgbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeShzYWdvbWEoV20sSG0pLHtkZXB0aDowLjAzNSxiZXZlbEVuYWJsZWQ6ZmFsc2V9KSwKICAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHgxRjFDMTkscm91Z2huZXNzOjAuNzcsIG1ldGFsbmVzczowLjB9KSk7CiAgZnJhbWUucG9zaXRpb24uc2V0KG14LDAsbXopOyBmcmFtZS5yb3RhdGlvbi55PXJ5OwogIGZyYW1lLmNhc3RTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKGZyYW1lKTsKICAvLyBsYXN0cmEgcmlmbGV0dGVudGUsIGxlZ2dlcm1lbnRlIHJpZW50cmF0YQogIGNvbnN0IGdsYXNzPW5ldyBUSFJFRS5NZXNoKAogICAgbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeShzYWdvbWEoV20tMC4wNTUsSG0tMC4wNTUpLHtkZXB0aDowLjAyLGJldmVsRW5hYmxlZDpmYWxzZX0pLAogICAgbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtjb2xvcjoweEMzRDJENixyb3VnaG5lc3M6MC4wNSwgbWV0YWxuZXNzOjEuMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpdml0eToxfSkpOwogIGdsYXNzLnBvc2l0aW9uLnNldChteCtNYXRoLnNpbihyeSkqMC4wMywgMC4wMjgsIG16K01hdGguY29zKHJ5KSowLjAzKTsKICBnbGFzcy5yb3RhdGlvbi55PXJ5OyB3b3JsZC5hZGQoZ2xhc3MpOwp9KSgpOwoKLy8gY2Fzc2FwYW5jYSBhbnRpY2EgaW4gbGVnbm8gc2N1cm8sIHRyYSBsYSB2YXNjYSBlIGxvIHNwZWNjaGlvLCBzb3R0byBsYSBwYXJldGUgaW4gcGlldHJhCihmdW5jdGlvbigpewogIGNvbnN0IGN4PVdYKzAuMzAsIGN6PS0yLjYyLCBMPTEuMTUsIEQ9MC40NiwgSGM9MC40MDsKICBjb25zdCB3b29kPW5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7bWFwOndvb2RUZXh0dXJlKCksIGNvbG9yOjB4RjNENEI2LCByb3VnaG5lc3M6MC45MCwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGRhcms9bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHttYXA6d29vZFRleHR1cmUoKSwgY29sb3I6MHhBQzk0N0UsIHJvdWdobmVzczowLjkwLCBtZXRhbG5lc3M6MC4wfSk7CiAgLy8gY2Fzc2EKICBjb25zdCBjPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShELEhjLEwpLCB3b29kKTsKICBjLnBvc2l0aW9uLnNldChjeCxIYy8yLGN6KTsgYy5jYXN0U2hhZG93PXRydWU7IGMucmVjZWl2ZVNoYWRvdz10cnVlOyB3b3JsZC5hZGQoYyk7CiAgLy8gY29wZXJjaGlvIGxlZ2dlcm1lbnRlIHNwb3JnZW50ZQogIGNvbnN0IGxpZD1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoRCswLjA0LDAuMDU1LEwrMC4wNCksIGRhcmspOwogIGxpZC5wb3NpdGlvbi5zZXQoY3gsSGMrMC4wMjcsY3opOyBsaWQuY2FzdFNoYWRvdz10cnVlOyBsaWQucmVjZWl2ZVNoYWRvdz10cnVlOyB3b3JsZC5hZGQobGlkKTsKICAvLyB6b2Njb2xvIGUgY29ybmljaSBkZWkgcGFubmVsbGkKICBib3goRCswLjAzLDAuMDUsTCswLjAzLCAweDM4MjcxRCwgY3gsMCxjeik7CiAgWy0wLjI5LDAuMjldLmZvckVhY2gob3o9PnsKICAgIGNvbnN0IHA9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuMDEyLDAuMjQsMC40NiksIGRhcmspOwogICAgcC5wb3NpdGlvbi5zZXQoY3grRC8yLDAuMjEsY3orb3opOyB3b3JsZC5hZGQocCk7CiAgfSk7CiAgLy8gZHVlIHBpbGUgZGkgYXNjaXVnYW1hbmkgc3VsIGNvcGVyY2hpbwogIGNvbnN0IHkwPUhjKzAuMDU1OwogIFtbLTAuMjgsMHhGMkVCRTAsMHhFNEQ5QzhdLFswLjI4LDB4RURFNEQ2LDB4REZEMkJFXV0uZm9yRWFjaCgoW296LGMxLGMyXSk9PnsKICAgIGJveCgwLjMwLDAuMDQ1LDAuMjIsIGMxLCBjeCx5MCwgICAgICBjeitveik7CiAgICBib3goMC4yOCwwLjA0MCwwLjIwLCBjMiwgY3gseTArMC4wNDUsY3orb3opOwogICAgYm94KDAuMjYsMC4wMzUsMC4xOCwgYzEsIGN4LHkwKzAuMDg1LGN6K296KTsKICB9KTsKfSkoKTsKCi8vIChhbmdvbG8gaWRyb21hc3NhZ2dpbyByaW1vc3NvIHN1IHJpY2hpZXN0YSkKCi8vIC0tLS0gQkFHTk86IGxhdmFibyBkaSBmcm9udGUgYWxsYSBwb3J0YSwgc2FuaXRhcmkgYSBkZXN0cmEsIGRvY2NpYSBhIHNpbmlzdHJhCi8vIHBhcmV0ZSBkaWV0cm8gaWwgbGF2YWJvIGluIHBpZXRyYSBhIHZpc3RhLCBzdGVzc2EgbXVyYXR1cmEgZGVsIHJlc3RvIGRlbGxhIGNhc2EKKGZ1bmN0aW9uKCl7CiAgY29uc3Qgc2lkZT1tYXQoMHhCOUFBOTApOwogIGNvbnN0IGZhY2U9bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHttYXA6U1RPTkUubWFwLCBidW1wTWFwOlNUT05FLmJ1bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBTY2FsZTowLjA5LCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIC8vIG9yZGluZSBmYWNjZTogK1gsIC1YLCArWSwgLVksICtaLCAtWiDigJQgYSB2aXN0YSBlJyBsYSArWCwgdmVyc28gaWwgYmFnbm8KICBjb25zdCB3PW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgwLjA1LDEuNzIsMS43MSksCiAgICBbZmFjZSwgc2lkZSwgc2lkZSwgc2lkZSwgc2lkZSwgc2lkZV0pOwogIHcucG9zaXRpb24uc2V0KC0yLjYxNSwgMC45MywgMC4xMjUpOwogIHcuY2FzdFNoYWRvdz10cnVlOyB3LnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKHcpOwp9KSgpOwoKLy8gZ3JlcyBwb3JjZWxsYW5hdG8gbWFycm9uZSBzdSB0dXR0ZSBsZSBhbHRyZSBwYXJldGkgZGkgYmFnbm8gZSBkb2NjaWEKKGZ1bmN0aW9uKCl7CiAgY29uc3QgZ3Jlcz1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4NEEyQjFCLCByb3VnaG5lc3M6MC42MywgbWV0YWxuZXNzOjAuMCwKICAgIHBvbHlnb25PZmZzZXQ6dHJ1ZSwgcG9seWdvbk9mZnNldEZhY3RvcjotMSwgcG9seWdvbk9mZnNldFVuaXRzOi0xfSk7CiAgY29uc3QgVD0wLjAzLCBIPTEuNzIsIFk9MC44NjsKICAvLyBwYW5uZWxsbyB2ZXJ0aWNhbGU6IGFzc2UgJ3gnID0gbHVuZ28gWCwgYXNzZSAneicgPSBsdW5nbyBaCiAgY29uc3QgcGFuPShhc3NlLGx1bmcsY3gsY3opPT57CiAgICBjb25zdCBnID0gYXNzZT09PSd4JyA\/IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShsdW5nLEgsVCkgOiBuZXcgVEhSRUUuQm94R2VvbWV0cnkoVCxILGx1bmcpOwogICAgY29uc3QgbT1uZXcgVEhSRUUuTWVzaChnLGdyZXMpOwogICAgbS5wb3NpdGlvbi5zZXQoY3gsWSxjeik7IG0ucmVjZWl2ZVNoYWRvdz10cnVlOyB3b3JsZC5hZGQobSk7CiAgfTsKICAvLyBvZ25pIHBhbm5lbGxvIHN0YSAxIGNtIGRhdmFudGkgYWwgbXVybzogc2UgbGUgZHVlIHN1cGVyZmljaSBjb2luY2lkZXNzZXJvCiAgLy8gbGEgc2NoZWRhIGdyYWZpY2EgYWx0ZXJuZXJlYmJlIGkgY29sb3JpIGdpcmFuZG8gbGEgdmlzdGEKICAvLyBCQUdOTwogIHBhbigneCcsIDIuMjEsIC0xLjUzNSwgLTAuNzA1KTsgICAvLyBwYXJldGUgdmVyc28gbGEgY2FtZXJhCiAgcGFuKCd6JywgMS4wOCwgLTAuNTc1LCAtMC4xOTApOyAgIC8vIGZyb250ZSwgdHJhdHRvIHBpZW5vIGFjY2FudG8gYWxsYSBwb3J0YQogIC8vIERPQ0NJQQogIHBhbigneicsIDIuMzIsIC0yLjYwNSwgIDIuMTQwKTsgICAvLyBwYXJldGUgZXN0ZXJuYQogIHBhbigneCcsIDEuMDgsIC0yLjA5MCwgIDMuMjA1KTsgICAvLyBmb25kbwogIHBhbigneicsIDIuMzIsIC0xLjU3NSwgIDIuMTQwKTsgICAvLyB2ZXJzbyBpbCBibG9jY28gcGllbm8KfSkoKTsKCi8vIHBhcmV0ZSBkaSBmb25kbyBkZWwgYmFnbm8gKHZlcnNvIGRvY2NpYSBlIGN1Y2luYSkgaW4gcGlldHJhIGEgdmlzdGEKKGZ1bmN0aW9uKCl7CiAgY29uc3Qgc2lkZT1tYXQoMHhCOUFBOTApOwogIGNvbnN0IGZhY2U9bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHttYXA6U1RPTkUubWFwLCBidW1wTWFwOlNUT05FLmJ1bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBTY2FsZTowLjA5LCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIC8vIG9yZGluZSBmYWNjZTogK1gsIC1YLCArWSwgLVksICtaLCAtWiDigJQgYSB2aXN0YSBlJyBsYSAtWiwgdmVyc28gaWwgYmFnbm8KICBjb25zdCB3PW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgxLjEyLDEuNzIsMC4wNSksCiAgICBbc2lkZSwgc2lkZSwgc2lkZSwgc2lkZSwgc2lkZSwgZmFjZV0pOwogIHcucG9zaXRpb24uc2V0KC0wLjk5LCAwLjkzLCAwLjk1NSk7CiAgdy5jYXN0U2hhZG93PXRydWU7IHcucmVjZWl2ZVNoYWRvdz10cnVlOyB3b3JsZC5hZGQodyk7Cn0pKCk7CgovLyBsYXZhYm8gYSBjb2xvbm5hLCBjZW50cmF0byBzdWxsJ2Fzc2UgZGVsbGEgcG9ydGEgKHogPSAwLjcwKQpjeWwoMC4yMSwwLjg2LEMuc3RvbmUsLTIuMzUsMCwwLjcwLDIwKTsKY3lsKDAuMjMsMC4wNixDLndoaXRlLC0yLjM1LDAuODYsMC43MCwyMCk7CmN5bCgwLjAxNSwwLjIyLEMuaW5rLC0yLjM1LDAuOTIsMC44NSwxMCk7ICAgICAgICAgICAgICAvLyBydWJpbmV0dG8KKGZ1bmN0aW9uKCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjY2hpbyB0b25kbyBzb3ByYSBpbCBsYXZhYm8KICBjb25zdCBtPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMjMsMC4yMywwLjA0LDI2KSwKICAgIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHhDM0QyRDYsIHJvdWdobmVzczowLjA1LCBtZXRhbG5lc3M6MS4wMH0pKTsKICBtLnJvdGF0aW9uLno9TWF0aC5QSS8yOyBtLnBvc2l0aW9uLnNldCgtMi41NjUsMS4zMiwwLjcwKTsgd29ybGQuYWRkKG0pOwp9KSgpOwoKLy8gc2FuaXRhcmlvIGUgYmlkZXQgc29zcGVzaSwgYXBwb2dnaWF0aSBhbGxhIHBhcmV0ZSB2ZXJzbyBsYSBjYW1lcmEKKGZ1bmN0aW9uKCl7CiAgY29uc3Qgenc9LTAuNzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsbyBpbnRlcm5vIGRlbGxhIHBhcmV0ZQogIGNvbnN0IGNlcj1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RkJGQUY3LCByb3VnaG5lc3M6MC40NiwgbWV0YWxuZXNzOjAuMH0pOwogIGZ1bmN0aW9uIHNvc3Blc28oY3gsRCxXLGNvbkNhc3NldHRhKXsKICAgIGNvbnN0IHkwPTAuMjAsIEg9MC4yMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3NwZXNvOiBzdGFjY2EgZGEgdGVycmEKICAgIGNvbnN0IHpjPXp3K0QvMjsKICAgIGNvbnN0IGI9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KFcsSCxELTAuMTQpLCBjZXIpOwogICAgYi5wb3NpdGlvbi5zZXQoY3gseTArSC8yLHpjLTAuMDcpOyBiLmNhc3RTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKGIpOwogICAgY29uc3QgZj1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeShILzIsSC8yLFcsMjApLCBjZXIpOyAgLy8gZnJvbnRlIGFycm90b25kYXRvCiAgICBmLnJvdGF0aW9uLno9TWF0aC5QSS8yOyBmLnBvc2l0aW9uLnNldChjeCx5MCtILzIsemMrRC8yLTAuMDcpOwogICAgZi5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChmKTsKICAgIGNvbnN0IGM9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KFcsMC4wMjgsRC0wLjA1KSwgY2VyKTsgICAgIC8vIHBpYW5vIHN1cGVyaW9yZQogICAgYy5wb3NpdGlvbi5zZXQoY3gseTArSCswLjAxNCx6Yy0wLjAyKTsgYy5jYXN0U2hhZG93PXRydWU7IHdvcmxkLmFkZChjKTsKICAgIGlmKGNvbkNhc3NldHRhKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjY2EgZGkgc2NhcmljbyBhIG11cm8KICAgICAgY29uc3QgcGw9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuMjIsMC4xNSwwLjAyKSwKICAgICAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RURFQUU0LCByb3VnaG5lc3M6MC42OSwgbWV0YWxuZXNzOjAuMH0pKTsKICAgICAgcGwucG9zaXRpb24uc2V0KGN4LDAuOTgsencrMC4wMSk7IHdvcmxkLmFkZChwbCk7CiAgICB9CiAgfQogIHNvc3Blc28oLTEuMDUsIDAuNTQsIDAuMzcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgIC8vIHdjCiAgc29zcGVzbygtMS43OCwgMC41MCwgMC4zNSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgLy8gYmlkZXQsIDIwIGNtIHBpdScgdmVyc28gaWwgbGF2YWJvCn0pKCk7CgovLyBET0NDSUEgb3BlbiBzcGFjZSwgMSwxNSB4IDIsMjUsIHNlbnphIHBpYXR0byByaWFsemF0bwpjeWwoMC4wMjIsMS4xMCxDLmluaywtMi42MiwwLjk1LDIuNjAsMTApOyAgICAgICAgICAgICAgIC8vIGNvbG9ubmEgZG9jY2lhCmJveCgwLjI2LDAuMDUsMC4yMixDLmluaywtMi41MCwyLjAwLDIuNjApOyAgICAgICAgICAgICAgLy8gc29mZmlvbmUKCi8vIC0tLS0gQU5HT0xPIENPVFRVUkEgZGlldHJvIGkgZHVlIHNwb3J0ZWxsaSwgZnJvbnRlIDE1MCBjbSAtLS0tLS0tLS0tLS0tLS0tLS0KKGZ1bmN0aW9uKCl7CiAgY29uc3QgeDA9LTEuMjAsIHgxPS0wLjUwLCB6MD0xLjA1LCB6MT0yLjY1OwogIGNvbnN0IEQ9eDEteDAsIGN4PSh4MCt4MSkvMiwgY3o9KHowK3oxKS8yLCBMPXoxLXowOwogIGNvbnN0IGJpYW5jbz1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RjZGNEYwLCByb3VnaG5lc3M6MC43MSwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGxlZ25vID1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe21hcDp3b29kVGV4dHVyZSgpLCBjb2xvcjoweEUwQjY4OCwgcm91Z2huZXNzOjAuODMsIG1ldGFsbmVzczowLjB9KTsKICBjb25zdCBhY2MgICA9bmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtjb2xvcjoweEM2QzhDNiwgcm91Z2huZXNzOjAuMjUsIG1ldGFsbmVzczowLjk1fSk7CiAgY29uc3QgbmVybyAgPW5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHgyMjIwMUUsIHJvdWdobmVzczowLjMwLCBtZXRhbG5lc3M6MC41NX0pOwogIGNvbnN0IGFkZD0oZyxtLHgseSx6KT0+eyBjb25zdCBvPW5ldyBUSFJFRS5NZXNoKGcsbSk7IG8ucG9zaXRpb24uc2V0KHgseSx6KTsKICAgIG8uY2FzdFNoYWRvdz10cnVlOyBvLnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKG8pOyByZXR1cm4gbzsgfTsKCiAgLy8gYmFzZSBiaWFuY2Egc3Ugem9jY29sbyBhcnJldHJhdG8KICBhZGQobmV3IFRIUkVFLkJveEdlb21ldHJ5KEQtMC4xMCwwLjEwLEwtMC4wNCksIGJpYW5jbywgY3gsMC4wNSxjeik7CiAgYWRkKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShELDAuNzgsTC0wLjA0KSwgYmlhbmNvLCBjeCwwLjQ5LGN6KTsKICAvLyBtYW5pZ2xpZSB2ZXJ0aWNhbGkgZGVsbGUgYW50ZQogIFstMC41MiwtMC4xMCwwLjMwLDAuNjJdLmZvckVhY2gob3o9PgogICAgYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDA4LDAuMDA4LDAuMzAsOCksIGFjYywgeDEtMC4wMTIsMC41MixjeitveikpOwogIC8vIGNhc3NldHRvIGluIGFsdG8gYSBzaW5pc3RyYQogIGFkZChuZXcgVEhSRUUuQm94R2VvbWV0cnkoMC4wMTIsMC4wMiwwLjYwKSwgYWNjLCB4MS0wLjAwNiwwLjgwLGN6LTAuNDApOwoKICAvLyB0b3AgaW4gbGVnbm8gY29uIGJvcmRvCiAgYWRkKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShELDAuMDQ1LEwpLCBsZWdubywgY3gsMC45MDUsY3opOwogIC8vIHNjaGllbmFsZSBpbiBhY2NpYWlvCiAgYWRkKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgwLjAyLDAuNDcsTCksIGFjYywgeDArMC4wMywxLjE2Myxjeik7CgogIC8vIGxhdmVsbG8gdG9uZG8gbmVybywgb3JhIHN1bCBsYXRvIHZlcnNvIGlsIGJhZ25vCiAgYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMTU1LDAuMTM1LDAuMDUsMjYpLCBuZXJvLCBjeCwwLjkxOCxjei0wLjQ0KTsKICAvLyBtaXNjZWxhdG9yZTogc3RlbG8gZGlldHJvIGFsIGxhdmVsbG8gZSBicmFjY2lvIGNoZSBzcG9yZ2UgaW4gYXZhbnRpCiAgYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDE4LDAuMDE4LDAuMjYsMTApLCBuZXJvLCB4MCswLjE1LDEuMDUsY3otMC40NCk7CiAgY29uc3QgYnI9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMTYsMC4wMTYsMC4yMCwxMCksIG5lcm8pOwogIGJyLnBvc2l0aW9uLnNldCh4MCswLjI1LDEuMTcsY3otMC40NCk7IGJyLnJvdGF0aW9uLno9TWF0aC5QSS8yOwogIGJyLmNhc3RTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKGJyKTsKICBhZGQobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMTMsMC4wMTMsMC4wNiwxMCksIG5lcm8sIHgwKzAuMzUsMS4xNCxjei0wLjQ0KTsKCiAgLy8gcGlhbm8gY290dHVyYSBhIGluZHV6aW9uZSwgZHVlIGZ1b2NoaSwgb3JpenpvbnRhbGUgc3VsIGxhdG8gcmlwb3N0aWdsaW8KICBhZGQobmV3IFRIUkVFLkJveEdlb21ldHJ5KDAuNDQsMC4wMTQsMC41NiksIG5lcm8sIGN4LDAuOTM0LGN6KzAuNDQpOwogIFstMC4xNDUsMC4xNDVdLmZvckVhY2gob3o9PgogICAgYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDg1LDAuMDg1LDAuMDA0LDI0KSwKICAgICAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4M0EzNzM0LCByb3VnaG5lc3M6MC41NCwgbWV0YWxuZXNzOjAuMH0pLAogICAgICAgIGN4LDAuOTQzLGN6KzAuNDQrb3opKTsKCiAgLy8gcGVuc2lsaTogZHVlIGFudGUgY2llY2hlIGUgZHVlIGEgdmV0cm8sIGNvbiBsdWNlIHNvdHRvcGVuc2lsZQogIGNvbnN0IHlQPTEuNjAsIGhQPTAuNDA7CiAgYWRkKG5ldyBUSFJFRS5Cb3hHZW9tZXRyeShELTAuMDYsaFAsTCowLjUyKSwgYmlhbmNvLCBjeCx5UCxjei1MKjAuMjQpOwogIGFkZChuZXcgVEhSRUUuQm94R2VvbWV0cnkoRC0wLjA2LGhQLEwqMC40NiksIGJpYW5jbywgY3gseVAsY3orTCowLjI3KTsKICBjb25zdCB2ZXRybz1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RDNERkUwLCB0cmFuc3BhcmVudDp0cnVlLCBvcGFjaXR5OjAuNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VnaG5lc3M6MC4xOCwgbWV0YWxuZXNzOjAuMH0pOwogIGFkZChuZXcgVEhSRUUuQm94R2VvbWV0cnkoMC4wMTIsaFAtMC4wOCxMKjAuNDIpLCB2ZXRybywgeDEtMC4wNCx5UCxjeitMKjAuMjcpOwogIFstTCowLjI0LCtMKjAuMjddLmZvckVhY2gob3o9PgogICAgYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDA3LDAuMDA3LDAuMjYsOCksIGFjYywgeDEtMC4wNDUseVAsY3orb3opKTsKICBhZGQobmV3IFRIUkVFLkJveEdlb21ldHJ5KEQtMC4xMCwwLjAxOCxMLTAuMTApLAogICAgICBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4RkZGM0Q4LCBlbWlzc2l2ZToweEZGREZBNiwgcm91Z2huZXNzOjAuOTAsIG1ldGFsbmVzczowLjB9KSwKICAgICAgY3gseVAtaFAvMi0wLjAxMixjeik7ICAgICAgICAgIC8vIGJhcnJhIGx1Y2Ugc290dG9wZW5zaWxlCn0pKCk7CgovLyAtLS0tIGFsIHBvc3RvIGRlbCByaXBvc3RpZ2xpbywgbXVybyBwaWVubyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKGZ1bmN0aW9uKCl7CiAgY29uc3QgeDA9LTEuMjYsIHgxPS0wLjQzLCB6MD0yLjYyLCB6MT0zLjMwLCBoPTEuODA7CiAgY29uc3QgbT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoeDEteDAsaCx6MS16MCksIG1hdChDLndhbGwpKTsKICBtLnBvc2l0aW9uLnNldCgoeDAreDEpLzIsaC8yLCh6MCt6MSkvMik7CiAgbS5jYXN0U2hhZG93PXRydWU7IG0ucmVjZWl2ZVNoYWRvdz10cnVlOyB3YWxsR3JvdXAuYWRkKG0pOwogIGNvbnN0IGNhcD1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQm94R2VvbWV0cnkoeDEteDArMC4wMDUsMC4wNCx6MS16MCswLjAwNSksIG1hdChDLndhbGxUb3ApKTsKICBjYXAucG9zaXRpb24uc2V0KCh4MCt4MSkvMixoLCh6MCt6MSkvMik7IHdhbGxHcm91cC5hZGQoY2FwKTsKfSkoKTsKCi8vIC0tLS0gem9uYSBwcmFuem86IHRhdm9sbyB0b25kbyBpbiBsZWdubyBjb24gcXVhdHRybyBzZWRpZSAtLS0tLS0tLS0tLS0tLS0tLS0KKGZ1bmN0aW9uKCl7CiAgY29uc3QgVFg9MS42MiwgVFo9My4wMCwgSD0wLjcyLCBSPTAuNDg7ICAgICAgICAgICAgICAvLyBwaXUgcGljY29sbyBkaSBwcmltYQogIGNvbnN0IHdvb2QgID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHttYXA6d29vZFRleHR1cmUoKSwgY29sb3I6MHhDOUE4ODIsIHJvdWdobmVzczowLjg4LCBtZXRhbG5lc3M6MC4wfSk7CiAgY29uc3Qgd29vZDIgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe21hcDp3b29kVGV4dHVyZSgpLCBjb2xvcjoweEE5OEE2OSwgcm91Z2huZXNzOjAuOTEsIG1ldGFsbmVzczowLjB9KTsKICBjb25zdCBhZGQ9KGcsbSx4LHkseixyeSk9PnsgY29uc3Qgbz1uZXcgVEhSRUUuTWVzaChnLG0pOyBvLnBvc2l0aW9uLnNldCh4LHkseik7CiAgICBpZihyeSkgby5yb3RhdGlvbi55PXJ5OyBvLmNhc3RTaGFkb3c9dHJ1ZTsgby5yZWNlaXZlU2hhZG93PXRydWU7IHdvcmxkLmFkZChvKTsgcmV0dXJuIG87IH07CgogIC8vIGJhc2U6IHRyb25jbyBtYXNzaWNjaW8sIGNvbWUgcXVlbGxvIHZlcm8KICBhZGQobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4yNSwwLjI3LEgtMC4wNCwyNiksIHdvb2QyLCBUWCwoSC0wLjA0KS8yLFRaKTsKICAvLyBwaWFubyBjb24gYm9yZG8gc211c3NhdG8KICBhZGQobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoUixSLDAuMDQyLDQ0KSwgd29vZCwgVFgsSCswLjAyMSxUWik7CiAgYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KFItMC4wMjUsUi0wLjA2LDAuMDI0LDQ0KSwgd29vZCwgVFgsSC0wLjAxMixUWik7CgogIC8vIHF1YXR0cm8gc2VkaWUgYSBzY29jY2EsIGdhbWJlIGEgc3BpbGxvIGluIGxlZ25vIGNoaWFybwogIGNvbnN0IHNoZWxsPW5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHhCMkFCQTAsIHJvdWdobmVzczowLjc3LCBtZXRhbG5lc3M6MC4wLCBzaWRlOlRIUkVFLkRvdWJsZVNpZGV9KTsKICBjb25zdCBsZWd3ID1uZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4QzlBODdDLCByb3VnaG5lc3M6MC44NiwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGJsayAgPW5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7Y29sb3I6MHgyQTI3MjQsIHJvdWdobmVzczowLjM1LCBtZXRhbG5lc3M6MC42MH0pOwoKICAvLyBndXNjaW86IGFsdG8gZGlldHJvIGNvbWUgc2NoaWVuYWxlLCBjaGUgc2NlbmRlIGFpIGxhdGkgZmlubyBhIGRpdmVudGFyZSBicmFjY2lvbG8KICBmdW5jdGlvbiBndXNjaW8oKXsKICAgIGNvbnN0IHNlZz00NCwgQTA9LTIuNTAsIEExPTIuNTAsIHJCPTAuMjM1OwogICAgY29uc3QgcG9zPVtdLCBpZHg9W107CiAgICBmb3IobGV0IGk9MDtpPD1zZWc7aSsrKXsKICAgICAgY29uc3QgdD1BMCsoQTEtQTApKmkvc2VnOwogICAgICBjb25zdCBrPU1hdGgubWF4KDAsIE1hdGguY29zKHQqMC42MikpOyAgICAgICAgLy8gMSBkaWV0cm8sIHF1YXNpIDAgc3VsIGRhdmFudGkKICAgICAgY29uc3QgaGg9MC4xMDUrMC4zMzUqazsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2hpZW5hbGUgNDQgY20sIGJyYWNjaW9sbyAxMQogICAgICBjb25zdCByVD1yQiswLjAzMCprOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvIHNjaGllbmFsZSBzaSBpbmNsaW5hIGluZGlldHJvCiAgICAgIGNvbnN0IHN4PU1hdGguc2luKHQpLCBzej1NYXRoLmNvcyh0KTsKICAgICAgcG9zLnB1c2goc3gqckIsMCxzeipyQiwgc3gqclQsaGgsc3oqclQpOwogICAgfQogICAgZm9yKGxldCBpPTA7aTxzZWc7aSsrKXsKICAgICAgY29uc3QgYT1pKjI7IGlkeC5wdXNoKGEsYSsxLGErMywgYSxhKzMsYSsyKTsKICAgIH0KICAgIGNvbnN0IGc9bmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7CiAgICBnLnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShwb3MsMykpOwogICAgZy5zZXRJbmRleChpZHgpOyBnLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7CiAgICByZXR1cm4gZzsKICB9CgogIFtNYXRoLlBJKjAuMjUsIE1hdGguUEkqMC43NSwgTWF0aC5QSSoxLjI1LCBNYXRoLlBJKjEuNzVdLmZvckVhY2goQT0+ewogICAgY29uc3QgZD0wLjU4LCBjeD1UWCtNYXRoLnNpbihBKSpkLCBjej1UWitNYXRoLmNvcyhBKSpkOwogICAgY29uc3QgZz1uZXcgVEhSRUUuR3JvdXAoKTsKICAgIC8vIHNlZHV0YTogZGlzY28gc290dGlsZQogICAgY29uc3Qgcz1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjIzNSwwLjIyNSwwLjA0NSwzMCksIHNoZWxsKTsKICAgIHMucG9zaXRpb24ueT0wLjQyNTsgcy5jYXN0U2hhZG93PXRydWU7IHMucmVjZWl2ZVNoYWRvdz10cnVlOyBnLmFkZChzKTsKICAgIC8vIGd1c2NpbyBhdnZvbGdlbnRlLCBhcGVydG8gdmVyc28gaWwgdGF2b2xvCiAgICBjb25zdCBiPW5ldyBUSFJFRS5NZXNoKGd1c2NpbygpLCBzaGVsbCk7CiAgICBiLnBvc2l0aW9uLnk9MC40NDU7IGIuY2FzdFNoYWRvdz10cnVlOyBnLmFkZChiKTsKICAgIC8vIHF1YXR0cm8gZ2FtYmUgYXBwZW5hIGRpdmFyaWNhdGUsIGNvbiBpbm5lc3RvIG5lcm8gc290dG8gbGEgc2VkdXRhCiAgICBbWy0wLjEwNiwtMC4xMDZdLFswLjEwNiwtMC4xMDZdLFstMC4xMDYsMC4xMDZdLFswLjEwNiwwLjEwNl1dLmZvckVhY2goKFtveCxvel0pPT57CiAgICAgIGNvbnN0IGw9bmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4wMTQ1LDAuMDA5NSwwLjQ0LDgpLCBsZWd3KTsKICAgICAgbC5wb3NpdGlvbi5zZXQob3gqMS4yOSwwLjIwMixveioxLjI5KTsKICAgICAgbC5yb3RhdGlvbi56PS1veCoxLjk7IGwucm90YXRpb24ueD1veioxLjk7CiAgICAgIGwuY2FzdFNoYWRvdz10cnVlOyBnLmFkZChsKTsKICAgICAgY29uc3Qgaz1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjAxNywwLjAxNywwLjA1LDgpLCBibGspOwogICAgICBrLnBvc2l0aW9uLnNldChveCoxLjEyLDAuMzg1LG96KjEuMTIpOyBnLmFkZChrKTsKICAgIH0pOwogICAgZy5wb3NpdGlvbi5zZXQoY3gsMCxjeik7IGcucm90YXRpb24ueT1BOwogICAgZy5zY2FsZS5zZXQoMC43MCwwLjg4LDAuNzApOyAgICAgICAgLy8gaW5nb21icm8gYSB0ZXJyYSAtMzAlLCBhbHRlenphIHF1YXNpIGludmFyaWF0YQogICAgd29ybGQuYWRkKGcpOwogIH0pOwp9KSgpOwoKLy8gLS0tLSBkaXZhbm8gbGV0dG8sIGFkZG9zc2F0byBhbGxhIHBhcmV0ZSBkZWxsYSBjYW1lcmEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQooZnVuY3Rpb24oKXsKICBjb25zdCBTWD0xLjU1LCBTWj0tMC40MiwgTD0xLjY4LCBEPTAuNzA7ICAgICAgICAgICAgIC8vIGNlbnRyYXRvIHN1bGxhIHBhcmV0ZQogIGNvbnN0IGZhYiAgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4NEEzNTI2LCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGZhYjIgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4NTczRjJELCByb3VnaG5lc3M6MC45NSwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGxlZyAgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOjB4M0EyQTFFLCByb3VnaG5lc3M6MC44OSwgbWV0YWxuZXNzOjAuMH0pOwogIGNvbnN0IGFkZD0oZyxtLHgseSx6KT0+eyBjb25zdCBvPW5ldyBUSFJFRS5NZXNoKGcsbSk7IG8ucG9zaXRpb24uc2V0KHgseSx6KTsKICAgIG8uY2FzdFNoYWRvdz10cnVlOyBvLnJlY2VpdmVTaGFkb3c9dHJ1ZTsgd29ybGQuYWRkKG8pOyByZXR1cm4gbzsgfTsKCiAgLy8gcGllZGluaQogIFtbLUwvMiswLjEwLC1ELzIrMC4xMF0sW0wvMi0wLjEwLC1ELzIrMC4xMF0sWy1MLzIrMC4xMCxELzItMC4xMF0sW0wvMi0wLjEwLEQvMi0wLjEwXV0KICAgLmZvckVhY2goKFtveCxvel0pPT4gYWRkKG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KDAuMDI0LDAuMDE4LDAuMTIsOCksIGxlZywgU1grb3gsMC4wNixTWitveikpOwoKICAvLyBjYXNzYSBlIHNwYWxsYSBkZWxsbyBzY2hpZW5hbGUsIHNwaWdvbGkgYXBwZW5hIHNtdXNzYXRpCiAgc29mdEJveChMLDAuMjAsRCwwLjAzNSwwLjAxOCwgZmFiLCBTWCwwLjEyLFNaKTsKICBzb2Z0Qm94KEwsMC41MCwwLjE4LDAuMDQwLDAuMDIyLCBmYWIsIFNYLDAuMzIsU1otRC8yKzAuMDkpOwoKICAvLyBkdWUgY3VzY2luaSBkaSBzZWR1dGEsIGJvbWJhdGkgZSBzZXBhcmF0aSBkYSB1bmEgZnVnYQogIFstMC40MSwwLjQxXS5mb3JFYWNoKG94PT4gc29mdEJveCgwLjgwLDAuMTcsRC0wLjI0LDAuMDY1LDAuMDUwLCBmYWIyLCBTWCtveCwwLjMyLFNaKzAuMDgpKTsKCiAgLy8gZHVlIGN1c2NpbmkgZGkgc2NoaWVuYWxlLCBpbmNsaW5hdGkgYWxsJ2luZGlldHJvIGNvbWUgcXVhbmRvIGNpIHNpIGFwcG9nZ2lhCiAgWy0wLjQxLDAuNDFdLmZvckVhY2gob3g9PnsKICAgIGNvbnN0IG89c29mdEJveCgwLjc4LDAuMzgsMC4xNywwLjA2MCwwLjA0OCwgZmFiMiwgU1grb3gsMC40OSxTWi1ELzIrMC4yNSk7CiAgICBvLnJvdGF0aW9uLng9MC4xMTsKICB9KTsKCiAgLy8gYnJhY2Npb2xpLCBjb24gaWwgYm9yZG8gc3VwZXJpb3JlIHRvbmRvCiAgWy1MLzIrMC4wOSwgTC8yLTAuMDldLmZvckVhY2gob3g9PgogICAgc29mdEJveCgwLjE4LDAuNDQsRCwwLjA1MCwwLjAzOCwgZmFiLCBTWCtveCwwLjEyLFNaKSk7CgogIC8vIHVuIGN1c2Npbm8gZCdhcHBvZ2dpbywgYnV0dGF0byBkaSBzYmllY28KICBjb25zdCBjdXM9c29mdEJveCgwLjM0LDAuMTMsMC4zNCwwLjA1NSwwLjA0NSwgZmFiMiwgU1gtMC40NCwwLjUwLFNaKzAuMDQpOwogIGN1cy5yb3RhdGlvbi5zZXQoLTAuNDIsMC4zNCwwLjE0KTsKCiAgLy8gZGlzY28gaW4gdHJhdmVydGlubyBhIHBhcmV0ZSwgc29wcmEgaWwgZGl2YW5vIOKAlCBkaWFtZXRybyA1MCBjbQogIChmdW5jdGlvbigpewogICAgY29uc3QgUj0wLjI1LCBjeT0xLjI0LCBjej0tMC43MzsKICAgIGNvbnN0IHNoPW5ldyBUSFJFRS5TaGFwZSgpOwogICAgZm9yKGxldCBpPTA7aTw9ODQ7aSsrKXsgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvcmRvIGlycmVnb2xhcmUsIGNvbWUgbGEgcGlldHJhIHNwYWNjYXRhCiAgICAgIGNvbnN0IGE9aS84NCpNYXRoLlBJKjI7CiAgICAgIGNvbnN0IHI9UiooMC45MCArIE1hdGguYWJzKE1hdGguc2luKGEqNi4zKSkqMC4wNTUKICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoTWF0aC5jb3MoYSoxMS4xKSkqMC4wMzUKICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoTWF0aC5zaW4oYSoxOS43KSkqMC4wMjApOwogICAgICBjb25zdCB4PU1hdGguY29zKGEpKnIsIHk9TWF0aC5zaW4oYSkqcjsKICAgICAgaT09PTAgPyBzaC5tb3ZlVG8oeCx5KSA6IHNoLmxpbmVUbyh4LHkpOwogICAgfQogICAgY29uc3QgdGV4PXRyYXZlcnRpbm9UZXh0dXJlKCk7CiAgICBjb25zdCBnPW5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkoc2gse2RlcHRoOjAuMDUsYmV2ZWxFbmFibGVkOmZhbHNlfSk7CiAgICBjb25zdCBtPW5ldyBUSFJFRS5NZXNoKGcsIG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7CiAgICAgIG1hcDp0ZXgsIGJ1bXBNYXA6dGV4LCBidW1wU2NhbGU6MC4wNiwgcm91Z2huZXNzOjAuOTIsIG1ldGFsbmVzczowLjAsCiAgICAgIHBvbHlnb25PZmZzZXQ6dHJ1ZSwgcG9seWdvbk9mZnNldEZhY3RvcjotMSwgcG9seWdvbk9mZnNldFVuaXRzOi0xfSkpOwogICAgLy8gYXBwb2dnaWF0byBzdWwgbGF0byBzb2dnaW9ybm8sIDEsNSBjbSBzdGFjY2F0byBkYWwgZmlsbyBkZWwgbXVybwogICAgbS5wb3NpdGlvbi5zZXQoU1gsIGN5LCBjeiswLjAxNSk7CiAgICBtLmNhc3RTaGFkb3c9dHJ1ZTsgbS5yZWNlaXZlU2hhZG93PXRydWU7IHdvcmxkLmFkZChtKTsKICB9KSgpOwoKfSkoKTsKCgovLyAtLS0tIG9tYnJlIGRpIGNvbnRhdHRvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBVbmEgbHVjZSBwdW50aWZvcm1lIGRhIHNvbGEgbGFzY2lhIGdsaSBvZ2dldHRpICJhcHBvZ2dpYXRpIHN1bCBudWxsYSI6Ci8vIHF1ZXN0YSBtYWNjaGlhIG1vcmJpZGEgc290dG8gb2duaSBhcnJlZG8gZScgY2lvJyBjaGUgbGkgcmFkaWNhIGFsIHBhdmltZW50by4KY29uc3QgT01CUkEgPSAoZnVuY3Rpb24oKXsKICBjb25zdCBjdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgY3Yud2lkdGg9Y3YuaGVpZ2h0PTEyODsKICBjb25zdCBnPWN2LmdldENvbnRleHQoJzJkJyk7CiAgY29uc3QgZ3I9Zy5jcmVhdGVSYWRpYWxHcmFkaWVudCg2NCw2NCwzLDY0LDY0LDYyKTsKICBnci5hZGRDb2xvclN0b3AoMC4wMCwncmdiYSgwLDAsMCwuODApJyk7CiAgZ3IuYWRkQ29sb3JTdG9wKDAuNDIsJ3JnYmEoMCwwLDAsLjQwKScpOwogIGdyLmFkZENvbG9yU3RvcCgxLjAwLCdyZ2JhKDAsMCwwLDApJyk7CiAgZy5maWxsU3R5bGU9Z3I7IGcuZmlsbFJlY3QoMCwwLDEyOCwxMjgpOwogIGNvbnN0IHQ9bmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY3YpOyB0LmFuaXNvdHJvcHk9NDsKICByZXR1cm4gdDsKfSkoKTsKZnVuY3Rpb24gb21icmEoeCx6LHJ4LHJ6LG9wKXsKICBjb25zdCBtPW5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KHJ4KjIscnoqMiksCiAgICBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe21hcDpPTUJSQSwgdHJhbnNwYXJlbnQ6dHJ1ZSwgb3BhY2l0eTpvcCwgZGVwdGhXcml0ZTpmYWxzZX0pKTsKICBtLnJvdGF0aW9uLng9LU1hdGguUEkvMjsKICBtLnBvc2l0aW9uLnNldCh4LDAuMDE4LHopOyAgIC8vIHNvcHJhIGlsIGZpbG8gZGVsIHBhdmltZW50byAoMC4wMTEpCiAgbS5yZW5kZXJPcmRlcj0xOyB3b3JsZC5hZGQobSk7Cn0Kb21icmEoIDEuNDAsLTMuMTUsIDEuMDUsIDEuMjgsIDAuNTUpOyAgIC8vIGxldHRvCm9tYnJhKCAwLjI1LC00LjAwLCAwLjIwLCAwLjIwLCAwLjQ1KTsgICAvLyBwaWFudGluYSBpbiBjYW1lcmEKb21icmEoLTIuNDAsLTIuNjIsIDAuMzQsIDAuNzQsIDAuNTApOyAgIC8vIGNhc3NhcGFuY2EgYW50aWNhCm9tYnJhKC0xLjAwLC00LjA0LCAwLjYyLCAwLjI4LCAwLjQ4KTsgICAvLyBjYXNzYXBhbmNhIGluIGNhbm5hZ2UKb21icmEoLTEuMzgsLTEuMDIsIDAuMjQsIDAuMjQsIDAuNTApOyAgIC8vIHZhc28gZGVsbGEgeXVjY2EKb21icmEoLTEuMDUsLTAuNDUsIDAuMjYsIDAuMzQsIDAuMzIpOyAgIC8vIHdjIHNvc3Blc28Kb21icmEoLTEuNzgsLTAuNDgsIDAuMjUsIDAuMzIsIDAuMzIpOyAgIC8vIGJpZGV0IHNvc3Blc28Kb21icmEoLTIuMzUsIDAuNzAsIDAuMjQsIDAuMjQsIDAuNDUpOyAgIC8vIGxhdmFibyBhIGNvbG9ubmEKb21icmEoLTAuODUsIDEuODUsIDAuMzgsIDAuODYsIDAuNTApOyAgIC8vIG1vYmlsZSBkZWxsYSBjdWNpbmEKb21icmEoIDEuNTUsLTAuNDIsIDEuMDAsIDAuNTAsIDAuNTUpOyAgIC8vIGRpdmFubwpvbWJyYSggMS42MiwgMy4wMCwgMC40MiwgMC40MiwgMC41MCk7ICAgLy8gYmFzZSBkZWwgdGF2b2xvCltbIDAuNDEsIDAuNDFdLFswLjQxLC0wLjQxXSxbLTAuNDEsMC40MV0sWy0wLjQxLC0wLjQxXV0uZm9yRWFjaCgoW294LG96XSk9PgogIG9tYnJhKDEuNjIrb3gsIDMuMDArb3osIDAuMjAsIDAuMjAsIDAuMzgpKTsgICAvLyBzZWRpZQoKLy8gLS0tLSBub21pIGRlbGxlIHN0YW56ZSwgaW5jaXNpIHN1bCBwYXZpbWVudG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gZmxvb3JMYWJlbCh0ZXh0LHgseixoLHJvdCl7CiAgY29uc3QgZnM9NjQsIGxzPTE1LCBwYWQ9MTA7CiAgY29uc3QgbWVhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpOwogIG1lYXMuZm9udD0nNTAwICcrZnMrJ3B4IEthcmxhLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJzsKICBsZXQgdz0wOyBmb3IoY29uc3QgY2ggb2YgdGV4dCkgdys9bWVhcy5tZWFzdXJlVGV4dChjaCkud2lkdGgrbHM7CiAgY29uc3QgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgY3Yud2lkdGg9TWF0aC5jZWlsKHcrcGFkKjIpOyBjdi5oZWlnaHQ9TWF0aC5jZWlsKGZzKjEuNSk7CiAgY29uc3QgZz1jdi5nZXRDb250ZXh0KCcyZCcpOwogIGcuZm9udD0nNTAwICcrZnMrJ3B4IEthcmxhLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJzsKICBnLnRleHRCYXNlbGluZT0nbWlkZGxlJzsgZy5maWxsU3R5bGU9J3JnYmEoMjQ2LDIzMiwyMTAsLjMyKSc7CiAgbGV0IGN4PXBhZDsKICBmb3IoY29uc3QgY2ggb2YgdGV4dCl7IGcuZmlsbFRleHQoY2gsY3gsY3YuaGVpZ2h0LzIpOyBjeCs9Zy5tZWFzdXJlVGV4dChjaCkud2lkdGgrbHM7IH0KICBjb25zdCB0PW5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGN2KTsgdC5hbmlzb3Ryb3B5PTg7CiAgY29uc3QgbT1uZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShoKmN2LndpZHRoL2N2LmhlaWdodCwgaCksCiAgICBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe21hcDp0LCB0cmFuc3BhcmVudDp0cnVlLCBkZXB0aFdyaXRlOmZhbHNlfSkpOwogIG0ucm90YXRpb24ueD0tTWF0aC5QSS8yOyBtLnJvdGF0aW9uLno9cm90fHwwOwogIG0ucG9zaXRpb24uc2V0KHgsMC4wMjgseik7CiAgbS5yZW5kZXJPcmRlcj0yOwogIHdvcmxkLmFkZChtKTsKfQpmbG9vckxhYmVsKCdCRURST09NJywgICAgICAgICAgICAgIDAuMjAsLTEuMzUsIDAuMjYpOwpmbG9vckxhYmVsKCdCQVRIUk9PTScsICAgICAgICAgICAgICAtMS43NSwgMC4xMCwgMC4yNCk7CmZsb29yTGFiZWwoJ0xJVklORyAmIEtJVENIRU4nLCAgMC44NSwgMi45MCwgMC4yMik7CgovLyAtLS0tIGludGVyYXppb25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpsZXQgeWF3ID0gLTAuNTUsIHBpdGNoID0gMC45LCB6b29tID0gMTsKbGV0IGRyYWc9ZmFsc2UsIGxhc3RYPTAsIGxhc3RZPTAsIGF1dG9TcGluPWZhbHNlOwoKZnVuY3Rpb24gcGxhY2UoKXsKICBjb25zdCByID0gZnJ1c3R1bS96b29tOwogIGNhbS5sZWZ0PS1yKmFzcGVjdDsgY2FtLnJpZ2h0PXIqYXNwZWN0OyBjYW0udG9wPXI7IGNhbS5ib3R0b209LXI7CiAgY2FtLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICB3b3JsZC5yb3RhdGlvbi55ID0geWF3OwogIGNvbnN0IGRpc3Q9MTYuNTsKICBjYW0ucG9zaXRpb24uc2V0KDAsIE1hdGguc2luKHBpdGNoKSpkaXN0LCBNYXRoLmNvcyhwaXRjaCkqZGlzdCk7CiAgY2FtLmxvb2tBdCgwLDEuMDEsMCk7Cn0KCmZ1bmN0aW9uIG9uRG93bihlKXsKICBkcmFnPXRydWU7IHN0YWdlLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7CiAgY29uc3QgdD1lLnRvdWNoZXM\/ZS50b3VjaGVzWzBdOmU7IGxhc3RYPXQuY2xpZW50WDsgbGFzdFk9dC5jbGllbnRZOwp9CmZ1bmN0aW9uIG9uTW92ZShlKXsKICBpZighZHJhZykgcmV0dXJuOwogIGNvbnN0IHQ9ZS50b3VjaGVzP2UudG91Y2hlc1swXTplOwogIHlhdyAgICs9ICh0LmNsaWVudFgtbGFzdFgpKjAuMDA4OwogIHBpdGNoICs9ICh0LmNsaWVudFktbGFzdFkpKjAuMDA1OwogIHBpdGNoID0gTWF0aC5tYXgoMC4yNSwgTWF0aC5taW4oMS40NSwgcGl0Y2gpKTsKICBsYXN0WD10LmNsaWVudFg7IGxhc3RZPXQuY2xpZW50WTsKICBlLnByZXZlbnREZWZhdWx0KCk7Cn0KZnVuY3Rpb24gb25VcCgpeyBkcmFnPWZhbHNlOyBzdGFnZS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZ2luZycpOyB9CgpzdGFnZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLG9uRG93bik7CmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsb25Nb3ZlKTsKYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsb25VcCk7CnN0YWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLG9uRG93bix7cGFzc2l2ZTp0cnVlfSk7CnN0YWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsb25Nb3ZlLHtwYXNzaXZlOmZhbHNlfSk7CnN0YWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJyxvblVwKTsKc3RhZ2UuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLGU9PnsKICB6b29tID0gTWF0aC5tYXgoMC40NSwgTWF0aC5taW4oMi42LCB6b29tICogKGUuZGVsdGFZPjA\/MC45MzoxLjA3KSkpOwogIGUucHJldmVudERlZmF1bHQoKTsKfSx7cGFzc2l2ZTpmYWxzZX0pOwoKbGV0IHBpbmNoPTA7CnN0YWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLGU9PnsKICBpZihlLnRvdWNoZXMubGVuZ3RoPT09Mil7CiAgICBwaW5jaD1NYXRoLmh5cG90KGUudG91Y2hlc1swXS5jbGllbnRYLWUudG91Y2hlc1sxXS5jbGllbnRYLAogICAgICAgICAgICAgICAgICAgICBlLnRvdWNoZXNbMF0uY2xpZW50WS1lLnRvdWNoZXNbMV0uY2xpZW50WSk7CiAgICBkcmFnPWZhbHNlOwogIH0KfSx7cGFzc2l2ZTp0cnVlfSk7CnN0YWdlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsZT0+ewogIGlmKGUudG91Y2hlcy5sZW5ndGg9PT0yICYmIHBpbmNoKXsKICAgIGNvbnN0IGROb3c9TWF0aC5oeXBvdChlLnRvdWNoZXNbMF0uY2xpZW50WC1lLnRvdWNoZXNbMV0uY2xpZW50WCwKICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvdWNoZXNbMF0uY2xpZW50WS1lLnRvdWNoZXNbMV0uY2xpZW50WSk7CiAgICB6b29tID0gTWF0aC5tYXgoMC40NSwgTWF0aC5taW4oMi42LCB6b29tICogKGROb3cvcGluY2gpKSk7CiAgICBwaW5jaD1kTm93OyBlLnByZXZlbnREZWZhdWx0KCk7CiAgfQp9LHtwYXNzaXZlOmZhbHNlfSk7Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQnKS5vbmNsaWNrPSgpPT57IHlhdz0tMC41NTsgcGl0Y2g9MC45OyB6b29tPTE7IH07CihmdW5jdGlvbigpewogIGNvbnN0IHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cCcpLCB2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHB2Jyk7CiAgaWYoIXMpIHJldHVybjsKICBzLm9uaW5wdXQ9KCk9PnsgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZT0rcy52YWx1ZTsgdi50ZXh0Q29udGVudD0oK3MudmFsdWUpLnRvRml4ZWQoMik7IH07Cn0pKCk7CmNvbnN0IHNwaW5CdG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwaW4nKTsKc3BpbkJ0bi5vbmNsaWNrPSgpPT57IGF1dG9TcGluPSFhdXRvU3Bpbjsgc3BpbkJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsYXV0b1NwaW4pOyB9Owpjb25zdCB3YWxsQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3YWxscycpOwp3YWxsQnRuLm9uY2xpY2s9KCk9PnsKICB3YWxsR3JvdXAudmlzaWJsZT0hd2FsbEdyb3VwLnZpc2libGU7CiAgd2FsbEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsd2FsbEdyb3VwLnZpc2libGUpOwp9OwoKZnVuY3Rpb24gcmVzaXplKCl7CiAgY29uc3Qgdz1zdGFnZS5jbGllbnRXaWR0aCwgaD1zdGFnZS5jbGllbnRIZWlnaHQ7CiAgYXNwZWN0PXcvaDsKICBmcnVzdHVtID0gTWF0aC5tYXgoNS4xLCA1LjQgKiBNYXRoLm1pbigxLCA2MjAvTWF0aC5tYXgodyw0MjApKSk7CiAgcmVuZGVyZXIuc2V0U2l6ZSh3LGgpOwogIHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oTWF0aC5taW4oZGV2aWNlUGl4ZWxSYXRpbywyKSk7Cn0KYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxyZXNpemUpOyByZXNpemUoKTsKCmZ1bmN0aW9uIGxvb3AoKXsKICBpZihhdXRvU3BpbiAmJiAhZHJhZykgeWF3ICs9IDAuMDAzNTsKICBwbGFjZSgpOwogIHJlbmRlcmVyLnJlbmRlcihzY2VuZSxjYW0pOwogIHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKfQpsb29wKCk7CiAgLy8gZGVudHJvIGlsIHNpdG8gbCdpbnRlc3RhemlvbmUgZGkgbGF2b3JvIG5vbiBzZXJ2ZQogIGlmKHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wKXsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2hlYWRlciwgLmNvbnRyb2xzJykuZm9yRWFjaChlbD0+IGVsLnN0eWxlLmRpc3BsYXk9J25vbmUnKTsKICAgIHJlc2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWwgY2FudmFzIGRldmUgcmllbXBpcmUgbG8gc3BhemlvIGxpYmVyYXRvCiAgfQo=&quot;),function(c){return c.charCodeAt(0)})))&lt;\/script&gt;\n\n\n&lt;\/body&gt;&lt;\/html&gt;\"><\/iframe>\n  <\/div>\n  <div class=\"about-body\">\n    <ul class=\"facts\">\n        <li><span>Size<\/span><span>60 m\u00b2<\/span><\/li>\n        <li><span>Rooms<\/span><span>Living area and bedroom with hot tub<\/span><\/li>\n        <li><span>Guests<\/span><span>Up to 4<\/span><\/li>\n        <li><span>Location<\/span><span>Historic centre of Tivoli<\/span><\/li>\n      <\/ul>\n      <div class=\"read\">\n        <p>The property has been carefully restored, using traditional local materials to preserve its authenticity and strengthen its bond with the surrounding culture. The interiors convey an atmosphere of elegance and warmth, enhanced by refined furnishings and details that reflect the artistic and historical soul of Tivoli.<\/p>\n        <p>An independent apartment, ideal for hosting up to 4 guests, offering the perfect retreat for couples or intimate groups. Each space has been thoughtfully crafted to combine comfort and relaxation in an atmosphere of refined charm.<\/p>\n        <p>Whether traveling as a couple, with family, or to explore Tivoli's cultural treasures, Suite del Pittore offers the ideal stay to enjoy the city with comfort and authenticity.<\/p>\n      <\/div>\n      <div class=\"actions\">\n        <a class=\"btn\" href=\"\/en\/lastruttura\/\">Discover more<\/a>\n      <\/div>\n  <\/div>\n<\/section>\n\n<!-- LIVING & RELAX -->\n<section class=\"living dark\"><hr class=\"sep\" aria-hidden=\"true\">\n  <div class=\"wrap\">\n    <h2><em>Living<\/em><br>&amp; Relax<\/h2>\n    <div class=\"read\">\n      <p>The Suite del Pittore apartment unfolds into two distinct spaces: a welcoming living area, designed for relaxation and intimate moments in an atmosphere of refined comfort, and a generous double bedroom featuring an indulgent whirlpool corner.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"rooms\">\n    <div class=\"room\">\n      <figure><img decoding=\"async\" class=\"ph--wide\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-1024x768.jpeg.webp\" alt=\"Concealed equipped kitchen with its doors open\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-scaled-600x450.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-768x576.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-1024x768.jpeg.webp 1024w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-1536x1152.jpeg.webp 1536w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-scaled.jpeg.webp 1920w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-25-2048x1536.jpeg.webp 2048w\" sizes=\"(min-width:1024px) 43vw, 100vw\"><\/figure>\n      <div class=\"cap\">\n        <h3>Equipped Kitchen<\/h3>\n        <ul>\n          <li>Nespresso coffee machine<\/li>\n          <li>Kettle<\/li>\n          <li>Minibar<\/li>\n          <li>Crockery<\/li>\n          <li>Induction hob<\/li>\n          <li>Wine glasses<\/li>\n        <\/ul>\n      <\/div>\n    <\/div>\n    <div class=\"room\">\n      <figure><img decoding=\"async\" class=\"ph--free\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-768x1024.jpeg.webp\" alt=\"Detail of the hot tub with waterfall spout and jets\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1527-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 43vw, 100vw\"><\/figure>\n      <div class=\"cap\">\n        <h3>Hot Tub<\/h3>\n        <p class=\"txt\">After a day exploring the wonders of Tivoli, sink into a restorative atmosphere and let yourself be wrapped in the comfort of the bubbles and the calm of the room.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- TIPS & DETAILS -->\n<section class=\"dark\"><hr class=\"sep\" aria-hidden=\"true\">\n  <div class=\"wrap\">\n    <h2><em>Attention<\/em><br>to Detail<\/h2>\n    <div class=\"read\">\n      <p>Every detail of the Suite del Pittore has been carefully curated to offer a unique and refined experience. The use of local materials, handcrafted furnishings, and a thoughtful layout create an atmosphere of comfort and authenticity.<\/p>\n      <p>From the choice of colors inspired by Tivoli's artistic heritage to the soft lighting that enhances the charm of the historic setting, every element contributes to making your stay special. We believe that true hospitality lies in the small touches: a welcoming atmosphere, high-quality linens, and thoughtful details designed to make every guest feel at home.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"track\" id=\"track\">\n    <div class=\"slide on\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-768x1024.jpeg\" alt=\"Dining area seen through the half-open door\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-scaled-600x800.jpeg 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-660x913.jpeg 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-768x1024.jpeg 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-1152x1536.jpeg 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/FullSizeRender-3-1536x2048.jpeg 1536w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n    <div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-1024x768.jpeg.webp\" alt=\"The hot tub with the yucca plant and jute rug\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-scaled-600x450.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-768x576.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-1024x768.jpeg.webp 1024w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-1536x1152.jpeg.webp 1536w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-scaled.jpeg.webp 1920w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1564-2048x1536.jpeg.webp 2048w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n    <div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-768x1024.jpeg.webp\" alt=\"Overview of the bedroom\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n    <div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-768x1024.jpeg.webp\" alt=\"The bathroom with the pedestal basin\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1579-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n    <div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-768x1024.jpeg.webp\" alt=\"The dining area with the round tree-trunk table\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-scaled-600x800.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-660x913.jpeg.webp 660w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-768x1024.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-1152x1536.jpeg.webp 1152w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-scaled.jpeg.webp 1440w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/01\/IMG_1538-1536x2048.jpeg.webp 1536w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n    <div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-1024x768.jpeg.webp\" alt=\"The bathroom with the walk-in shower\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-scaled-600x450.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-768x576.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-1024x768.jpeg.webp 1024w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-1536x1152.jpeg.webp 1536w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-scaled.jpeg.webp 1920w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-3-2048x1536.jpeg.webp 2048w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n    <div class=\"slide\"><img decoding=\"async\" src=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592-1024x1004.jpeg.webp\" alt=\"The illuminated stone disc on the wall\" srcset=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/elementor\/thumbs\/FullSizeRender-27-scaled-e1740510207592-r21f49lwmrmmt0m9v5suws91tflx1su8p5xhppra14.jpeg 500w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592-600x588.jpeg.webp 600w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592-610x610.jpeg.webp 610w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592-768x753.jpeg.webp 768w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/elementor\/thumbs\/FullSizeRender-27-scaled-e1740510207592-r21f49m0abzxn13h3wed90s4xg8t12hecjp05x6y4g.jpeg 800w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/elementor\/thumbs\/FullSizeRender-27-scaled-e1740510207592-r21f49m2q1ksv1exxq4ph6gv04o2ckwu44vcgq5e6o.jpeg 1000w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592-1024x1004.jpeg.webp 1024w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592-1536x1506.jpeg.webp 1536w, https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-27-scaled-e1740510207592.jpeg.webp 1920w\" sizes=\"(min-width:1024px) 73vw, 100vw\"><\/div>\n  <\/div>\n  <div class=\"wrap g-dots\" id=\"gdots\"><\/div>\n<\/section>\n\n<!-- DOVE SIAMO -->\n<section class=\"where\"><hr class=\"sep\" aria-hidden=\"true\">\n  <div class=\"wrap\">\n    <h2><em>Where<\/em><br>We Are<\/h2>\n    <div class=\"read\">\n      <p>The Suite del Pittore is located in the heart of the historic center of Tivoli, in a privileged position facing the historic Mensa Ponderaria and the majestic Cathedral of San Lorenzo. A few steps away you can admire the evocative Temple of Hercules Victor, one of the archaeological symbols of the city, and the splendid Villa d'Este, famous for its Renaissance fountains and gardens, a UNESCO World Heritage Site.<\/p>\n      <p>This extraordinary itinerary of beauty and history is completed by the breathtaking views of Villa Gregoriana, a romantic 19th-century park nestled among natural caves, spectacular waterfalls and trails surrounded by greenery, close to the ancient acropolis of the city. A short distance away is Villa Adriana, the imposing imperial residence of the Emperor Hadrian.<\/p>\n      <p>Located in a characteristic building, the Suite combines the charm of history with modern comfort, offering an authentic experience in a refined setting featuring typical local materials.<\/p>\n    <\/div>\n    <div class=\"routes\">\n      <div class=\"route\">\n        <h3>By train<\/h3>\n        <p>From Roma Termini or Roma Tiburtina, take the regional train to Tivoli (about 45 minutes from Tiburtina, 50 from Termini). From the station, the Suite is about a 15-minute walk or a short ride on the local bus.<\/p>\n      <\/div>\n      <div class=\"route\">\n        <h3>By car<\/h3>\n        <p>From Rome, take the A24 motorway (Rome\u2013L'Aquila), exit at Tivoli and follow the signs for the historic centre. There are public car parks near the Suite.<\/p>\n      <\/div>\n      <div class=\"route\">\n        <h3>By bus<\/h3>\n        <p>From Rome, take a Cotral bus from Ponte Mammolo metro station (line B) to Tivoli centre. From there, the Suite is just a few minutes' walk away.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- PREVENTIVO -->\n<section class=\"quote\" id=\"preventivo\">\n  <div class=\"wrap cols\">\n    <div>\n      <h2>Book your stay<\/h2>\n      <div class=\"read\">\n        <p>Choose your dates on the calendar, see the price straight away and book direct, with no booking-site fees.<\/p>\n        <p style=\"font-size:.95rem;color:var(--ink-soft)\">Would you rather write to us?<br><a href=\"tel:+393426637430\">+39 342 6637430<\/a> \u00b7 <a href=\"mailto:info@suitedelpittore.com\">info@suitedelpittore.com<\/a><\/p>\n      <\/div>\n    <\/div>\n    <div class=\"sdp-cal-col\">\n      <iframe class=\"sdp-cal-embed\" src=\"\/en\/calendario-prenota\/\" loading=\"lazy\" title=\"Availability calendar\" style=\"display:block;width:100%;height:740px;border:0;background:transparent\" scrolling=\"no\"><\/iframe>\n      <p class=\"note\">Flexible rate with free cancellation up to 7 days before arrival, or non-refundable rate at a 10% lower price. Secure payment through Nexi.<\/p>\n    <\/div>\n    <script>window.addEventListener(\"message\",function(e){if(e.origin!==location.origin||!e.data||!e.data.sdpCalH)return;document.querySelectorAll(\"iframe.sdp-cal-embed\").forEach(function(f){if(f.contentWindow===e.source)f.style.height=e.data.sdpCalH+\"px\";});});<\/script>\n  <\/div>\n<\/section>\n\n<footer class=\"dark\">\n  <div class=\"wrap f-grid\">\n    <div>\n      <svg class=\"mark\" role=\"img\" aria-label=\"Suite del Pittore\"><use href=\"\/wp-content\/uploads\/2026\/10\/logo-pittore-sprite.svg#logo-pittore\"><\/use><\/svg>\n      <span class=\"sr\">Suite del Pittore<\/span>\n      <p>Vicolo del Pittore 1<br>00019 Tivoli (RM), Italy<\/p>\n    <\/div>\n    <div>\n      <h4>Contact<\/h4>\n      <ul>\n        <li><a href=\"tel:+393426637430\">+39 342 6637430<\/a><\/li>\n        <li><a href=\"mailto:info@suitedelpittore.com\">info@suitedelpittore.com<\/a><\/li>\n      <\/ul>\n    <\/div>\n    <div>\n      <h4>Information<\/h4>\n      <ul>\n        <li><a href=\"https:\/\/www.suitedelpittore.com\/en\/regolamento\/\">House Rules<\/a><\/li>\n        <li><a href=\"https:\/\/www.suitedelpittore.com\/en\/condizioni-di-prenotazione\/\">Booking Conditions<\/a><\/li>\n        <li><a href=\"https:\/\/www.suitedelpittore.com\/en\/privacy-policy\/\">Privacy Policy<\/a><\/li>\n        <li>CIN: IT058104B4HDI4SUMP<\/li>\n      <\/ul>\n    <\/div>\n  <\/div>\n  <div class=\"wrap f-bot\">\n    <span>Arges Group S.r.l. \u2013 Registered office: Circonvallazione Nomentana 516, 00162 Rome, Italy \u2013 VAT number 15896681002 \u2013 REA RM-1621535<\/span>\n  <\/div>\n<\/footer>\n\n<script>\nconst menu=document.getElementById('menu');\ndocument.getElementById('open').onclick=()=>{menu.dataset.open='true';document.body.style.overflow='hidden'};\ndocument.getElementById('close').onclick=()=>{menu.dataset.open='false';document.body.style.overflow=''};\nmenu.querySelectorAll('a').forEach(a=>a.onclick=()=>{menu.dataset.open='false';document.body.style.overflow=''});\ndocument.addEventListener('keydown',e=>{if(e.key==='Escape'){menu.dataset.open='false';document.body.style.overflow=''}});\n\nconst hs=document.querySelectorAll('#hero .slide'), dots=document.getElementById('dots');\nlet hi=0;\nhs.forEach((_,i)=>{\n  const b=document.createElement('button');\n  b.setAttribute('aria-label','Foto '+(i+1));\n  b.onclick=()=>go(i);\n  dots.appendChild(b);\n});\nfunction go(i){\n  hs[hi].classList.remove('on'); dots.children[hi].removeAttribute('aria-current');\n  hi=i;\n  hs[hi].classList.add('on'); dots.children[hi].setAttribute('aria-current','true');\n}\ngo(0);\nif(!matchMedia('(prefers-reduced-motion: reduce)').matches){\n  setInterval(()=>go((hi+1)%hs.length),7500);\n}\n\nconst gs=document.querySelectorAll('#track .slide'), gd=document.getElementById('gdots'), tr=document.getElementById('track');\nlet gi=0;\ngs.forEach((_,i)=>{const b=document.createElement('button');b.type='button';b.setAttribute('aria-label','Photo '+(i+1));b.onclick=()=>gGo(i);gd.appendChild(b);});\nfunction gGo(n){gs[gi].classList.remove('on');gd.children[gi].removeAttribute('aria-current');gi=(n+gs.length)%gs.length;gs[gi].classList.add('on');gd.children[gi].setAttribute('aria-current','true');}\ngGo(0);\ntr.setAttribute('tabindex','0');tr.setAttribute('aria-label','Photo gallery: click or swipe to change photo');\ntr.addEventListener('click',e=>{const r=tr.getBoundingClientRect();gGo(e.clientX-r.left<r.width\/3?gi-1:gi+1);});\ntr.addEventListener('keydown',e=>{if(e.key==='ArrowLeft')gGo(gi-1);if(e.key==='ArrowRight'||e.key==='Enter')gGo(gi+1);});\nlet x0=null;\ntr.addEventListener('touchstart',e=>{x0=e.touches[0].clientX},{passive:true});\ntr.addEventListener('touchend',e=>{if(x0===null)return;const dx=e.changedTouches[0].clientX-x0;if(Math.abs(dx)>40){gGo(dx<0?gi+1:gi-1);}x0=null;},{passive:true});\n<\/script>\n<\/div><script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"LodgingBusiness\",\"@id\":\"https:\/\/www.suitedelpittore.com\/en\/#organization\",\"name\":\"Suite del Pittore\",\"description\":\"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, a 2-minute walk from Villa d'Este: double bedroom with hot tub, living room with sofa bed and kitchen.\",\"url\":\"https:\/\/www.suitedelpittore.com\/en\/\",\"telephone\":\"+39 342 663 7430\",\"email\":\"info@suitedelpittore.com\",\"image\":[\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg\",\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-40-768x1024.jpeg\",\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2023\/08\/WhatsApp-Image-2025-01-25-at-23.13.03-768x1024.jpeg\",\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-45-1024x768.jpeg\"],\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"Vicolo del Pittore 1\",\"addressLocality\":\"Tivoli\",\"postalCode\":\"00019\",\"addressRegion\":\"RM\",\"addressCountry\":\"IT\"},\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":41.9650423,\"longitude\":12.7971033},\"hasMap\":\"https:\/\/maps.google.com\/?cid=4010167223752929020\",\"checkinTime\":\"15:00\",\"checkoutTime\":\"11:00\",\"smokingAllowed\":false,\"numberOfRooms\":2,\"amenityFeature\":[{\"@type\":\"LocationFeatureSpecification\",\"name\":\"Hot tub\",\"value\":true},{\"@type\":\"LocationFeatureSpecification\",\"name\":\"Wi-Fi\",\"value\":true},{\"@type\":\"LocationFeatureSpecification\",\"name\":\"Air conditioning\",\"value\":true},{\"@type\":\"LocationFeatureSpecification\",\"name\":\"Equipped kitchen\",\"value\":true},{\"@type\":\"LocationFeatureSpecification\",\"name\":\"Private entrance\",\"value\":true},{\"@type\":\"LocationFeatureSpecification\",\"name\":\"Self check-in\",\"value\":true}],\"identifier\":{\"@type\":\"PropertyValue\",\"name\":\"CIN\",\"value\":\"IT058104B4HDI4SUMP\"},\"containsPlace\":{\"@type\":\"Suite\",\"name\":\"Suite del Pittore\",\"floorSize\":{\"@type\":\"QuantitativeValue\",\"value\":60,\"unitCode\":\"MTK\"},\"occupancy\":{\"@type\":\"QuantitativeValue\",\"maxValue\":4},\"numberOfRooms\":2,\"bed\":[{\"@type\":\"BedDetails\",\"numberOfBeds\":1,\"typeOfBed\":\"King-size double bed\"},{\"@type\":\"BedDetails\",\"numberOfBeds\":1,\"typeOfBed\":\"Double sofa bed\"}]},\"parentOrganization\":{\"@type\":\"Organization\",\"name\":\"Arges Group S.r.l.\",\"vatID\":\"IT15896681002\"}}]}<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Prenota ora \u00d7 La Struttura Dintorni Galleria Contatti Prenota ora Vicolo del Pittore 1, 00019 Tivoli (RM) \u2014 +39 342 6637430 Benvenuti alla Suite del Pittore Un&#8217;esperienza autentica nel cuore del centro storico di Tivoli. Ogni dettaglio della nostra casa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-1124","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d&#039;Este. Hot tub, self check-in, kitchen. Book direct.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"google-site-verification\" content=\"Cz8lZ_4QI6uBCHHzIONvIM7EJHTjTv8MS_SufH1xZ34\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.suitedelpittore.com\/en\/\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Suite del Pittore\" \/>\n\t\t<meta property=\"og:type\" content=\"website\" \/>\n\t\t<meta property=\"og:title\" content=\"Suite del Pittore \u2013 Holiday home in Tivoli with hot tub\" \/>\n\t\t<meta property=\"og:description\" content=\"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d&#039;Este. Hot tub, self check-in, kitchen. Book direct.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.suitedelpittore.com\/en\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Suite del Pittore \u2013 Holiday home in Tivoli with hot tub\" \/>\n\t\t<meta name=\"twitter:description\" content=\"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d&#039;Este. Hot tub, self check-in, kitchen. Book direct.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#listItem\",\"position\":2,\"name\":\"Home\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#organization\",\"name\":\"Suite del Pittore\",\"url\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/\",\"telephone\":\"+393426637430\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.suitedelpittore.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/suite-del-pittore-logo.png\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#organizationLogo\",\"width\":600,\"height\":600,\"caption\":\"Logo Suite del Pittore\"},\"image\":{\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#organizationLogo\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#webpage\",\"url\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/\",\"name\":\"Suite del Pittore \\u2013 Holiday home in Tivoli with hot tub\",\"description\":\"60 m\\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d'Este. Hot tub, self check-in, kitchen. Book direct.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#breadcrumblist\"},\"datePublished\":\"2023-09-01T07:19:42+02:00\",\"dateModified\":\"2026-10-26T17:17:18+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/\",\"name\":\"Suite del Pittore\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.suitedelpittore.com\\\/en\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Suite del Pittore \u2013 Holiday home in Tivoli with hot tub","description":"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d'Este. Hot tub, self check-in, kitchen. Book direct.","canonical_url":"https:\/\/www.suitedelpittore.com\/en\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"Cz8lZ_4QI6uBCHHzIONvIM7EJHTjTv8MS_SufH1xZ34","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.suitedelpittore.com\/en\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.suitedelpittore.com\/en\/#listItem","position":1,"name":"Home","item":"https:\/\/www.suitedelpittore.com\/en\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.suitedelpittore.com\/en\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.suitedelpittore.com\/en\/#listItem","position":2,"name":"Home","previousItem":{"@type":"ListItem","@id":"https:\/\/www.suitedelpittore.com\/en\/#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/www.suitedelpittore.com\/en\/#organization","name":"Suite del Pittore","url":"https:\/\/www.suitedelpittore.com\/en\/","telephone":"+393426637430","logo":{"@type":"ImageObject","url":"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2026\/10\/suite-del-pittore-logo.png","@id":"https:\/\/www.suitedelpittore.com\/en\/#organizationLogo","width":600,"height":600,"caption":"Logo Suite del Pittore"},"image":{"@id":"https:\/\/www.suitedelpittore.com\/en\/#organizationLogo"}},{"@type":"WebPage","@id":"https:\/\/www.suitedelpittore.com\/en\/#webpage","url":"https:\/\/www.suitedelpittore.com\/en\/","name":"Suite del Pittore \u2013 Holiday home in Tivoli with hot tub","description":"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d'Este. Hot tub, self check-in, kitchen. Book direct.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.suitedelpittore.com\/en\/#website"},"breadcrumb":{"@id":"https:\/\/www.suitedelpittore.com\/en\/#breadcrumblist"},"datePublished":"2023-09-01T07:19:42+02:00","dateModified":"2026-10-26T17:17:18+01:00"},{"@type":"WebSite","@id":"https:\/\/www.suitedelpittore.com\/en\/#website","url":"https:\/\/www.suitedelpittore.com\/en\/","name":"Suite del Pittore","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.suitedelpittore.com\/en\/#organization"}}]},"og:locale":"en_US","og:site_name":"Suite del Pittore","og:type":"website","og:title":"Suite del Pittore \u2013 Holiday home in Tivoli with hot tub","og:description":"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d'Este. Hot tub, self check-in, kitchen. Book direct.","og:url":"https:\/\/www.suitedelpittore.com\/en\/","og:image":"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg","og:image:secure_url":"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg","twitter:card":"summary_large_image","twitter:title":"Suite del Pittore \u2013 Holiday home in Tivoli with hot tub","twitter:description":"60 m\u00b2 suite for 4 guests in the historic centre of Tivoli, 2 minutes from Villa d'Este. Hot tub, self check-in, kitchen. Book direct.","twitter:image":"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg"},"aioseo_meta_data":{"post_id":"1124","title":"Suite del Pittore \u2013 Casa vacanze a Tivoli con idromassaggio","description":"Suite di 60 m\u00b2 per 4 ospiti nel centro storico di Tivoli, a 2 minuti da Villa d'Este. Vasca idromassaggio, self check-in, cucina. Prenota direttamente.","keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"website","og_image_type":"custom_image","og_image_url":"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg","og_image_width":"0","og_image_height":"0","og_image_custom_url":"https:\/\/www.suitedelpittore.com\/wp-content\/uploads\/2025\/02\/FullSizeRender-51-1536x1152.jpeg","og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":true,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":0,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2025-01-12 18:37:24","updated":"2026-10-26 17:53:48","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.suitedelpittore.com\/en\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tHome\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.suitedelpittore.com\/en\/"},{"label":"Home","link":"https:\/\/www.suitedelpittore.com\/en\/"}],"_links":{"self":[{"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/pages\/1124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/comments?post=1124"}],"version-history":[{"count":265,"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/pages\/1124\/revisions"}],"predecessor-version":[{"id":3147,"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/pages\/1124\/revisions\/3147"}],"wp:attachment":[{"href":"https:\/\/www.suitedelpittore.com\/en\/wp-json\/wp\/v2\/media?parent=1124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}