diff --git a/assets/built/app.css b/assets/built/app.css index 4d70c1f7..e6266b79 100644 --- a/assets/built/app.css +++ b/assets/built/app.css @@ -1,3 +1,3 @@ -*,:after,:before{box-sizing:border-box;margin:0;padding:0}button{background:none;border:none;cursor:pointer}:root[color-mode=light]{--text:#0a0a0a;--textInverse:#f5f5f5;--text1:#171717;--text2:#39393a;--text3:#5a5a5c;--text4:#9ea0a2;--surface:#ebebeb;--surface1:#f0f0f0;--surface2:#f5f5f5;--surface3:#fafafa;--surface4:#fff;--primary:#0d48a0;--secondary:#a4002e;--three:#643791;--four:#8b1c76;--five:#a00053;--success:#48a00d;--error:#a40000;--error-hover:#520000;--gradient:linear-gradient(to right top,#0d48a0,#643791,#8b1c76,#a00053,#a4002e);--gradient-reverse:linear-gradient(to left top,#0d48a0,#643791,#8b1c76,#a00053,#a4002e)}:root[color-mode=dark]{--text:#f5f5f5;--textInverse:#0a0a0a;--text1:#e8e9e9;--text2:#c6c6c7;--text3:#a5a5a7;--text4:#616365;--surface:#181818;--surface1:#202020;--surface2:#282828;--surface3:#303030;--surface4:#383838;--primary:#80deea;--secondary:#ffab91;--three:#8cdbbf;--four:#b4d195;--five:#e0c081;--success:#b4d195;--error:#ff8f8f;--error-hover:#ff5c5c;--gradient:linear-gradient(to right top,#80deea,#8cdbbf,#b4d195,#e0c081,#ffab91);--gradient-reverse:linear-gradient(to left top,#80deea,#8cdbbf,#b4d195,#e0c081,#ffab91)}html{background-color:#202020;background-color:var(--surface1,#202020);color:#f5f5f5;color:var(--text,#f5f5f5);scroll-behavior:smooth}strong{font-weight:700}em{font-style:italic}:link{text-decoration:none}:link,:visited{color:currentColor}::-moz-selection{background-color:#e0c081;color:#111}::selection{background-color:#e0c081;color:#111}:target{margin-top:-3.25rem;padding-top:3.25rem}@media (min-width:1024px){:target{margin-top:5.5rem;margin-top:-5.5rem;padding-top:5.5rem}}:focus{outline-color:#a5a5a7;outline-color:var(--text3,#a5a5a7);outline-offset:3px;outline-style:dotted;outline-width:1px}a:active,button:active{outline:none}::-moz-focus-inner{border:none;outline:none}html{text-rendering:optimizeLegibility;font-size:1rem;font-size:clamp(1rem,.9090909090909091rem + .45454545454545453vw,1.25rem);font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{font-feature-settings:"liga","clig";font-family:"DM Serif Text",georgia,serif;font-variant-ligatures:common-ligatures;font-weight:400;line-height:1.2;margin:3rem 0 1.38rem}h1{font-size:2.488rem;margin-top:0}h2{font-size:2.074rem}h3{font-size:1.728rem}h4{font-size:1.44rem}h5{font-size:1.2rem}h6{font-size:1.1rem}.sm-text-small,small{font-size:.833rem}@-webkit-keyframes popup{0%{opacity:0;transform:translate(-50%,20px) scale(.8)}75%{opacity:1}to{transform:translate(-50%) scale(1)}}@keyframes popup{0%{opacity:0;transform:translate(-50%,20px) scale(.8)}75%{opacity:1}to{transform:translate(-50%) scale(1)}}@-webkit-keyframes slide-in{0%{opacity:0;top:-100%}to{opacity:1;top:1rem}}@keyframes slide-in{0%{opacity:0;top:-100%}to{opacity:1;top:1rem}}@-webkit-keyframes slide-out{0%{opacity:1;top:1rem}to{opacity:0;top:-100%}}@keyframes slide-out{0%{opacity:1;top:1rem}to{opacity:0;top:-100%}}@-webkit-keyframes mesh{0%{background-position:0 0,0 100%,50% 0,50% 25%,50% 100%}15%{background-position:1% 1%,1% 101%,51% 1%,51% 26%,51% 101%}30%{background-position:2% 2%,2% 102%,52% 2%,52% 26%,52% 102%}45%{background-position:3% 3%,3% 103%,53% 3%,53% 27%,53% 103%}60%{background-position:4% 4%,4% 104%,54% 4%,54% 28%,54% 104%}75%{background-position:5% 5%,5% 105%,55% 5%,55% 29%,55% 105%}90%{background-position:6% 6%,6% 106%,56% 6%,56% 30%,56% 106%}}@keyframes mesh{0%{background-position:0 0,0 100%,50% 0,50% 25%,50% 100%}15%{background-position:1% 1%,1% 101%,51% 1%,51% 26%,51% 101%}30%{background-position:2% 2%,2% 102%,52% 2%,52% 26%,52% 102%}45%{background-position:3% 3%,3% 103%,53% 3%,53% 27%,53% 103%}60%{background-position:4% 4%,4% 104%,54% 4%,54% 28%,54% 104%}75%{background-position:5% 5%,5% 105%,55% 5%,55% 29%,55% 105%}90%{background-position:6% 6%,6% 106%,56% 6%,56% 30%,56% 106%}}.sm-outer-container,.sm-outer-container--footer{padding:1rem;position:relative;width:100%}@media (min-width:600px){.sm-outer-container,.sm-outer-container--footer{padding:1rem 3rem 2rem}}@media (min-width:1024px){.sm-outer-container,.sm-outer-container--footer{padding:1rem 4rem 2rem}}.sm-outer-container--footer{background-color:#181818;background-color:var(--surface,#181818);border-bottom:none;color:#e8e9e9;color:var(--text1,#e8e9e9);font-size:.9rem;min-height:250px;padding-bottom:3rem}@media (min-width:1024px){.sm-outer-container--footer{padding-bottom:1rem}}.sm-inner-container,.sm-inner-container--author,.sm-inner-container--footer,.sm-inner-container--hero{margin:0 auto 1rem;max-width:1024px}.sm-inner-container--hero{height:100%;margin-bottom:0;position:relative}.sm-inner-container--author{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1rem;padding-bottom:1rem}@media (min-width:600px){.sm-inner-container--author{flex-direction:row}}.sm-footer__section,.sm-footer__section--latest{display:flex;flex-direction:column}.sm-footer__section--latest{color:#e8e9e9;color:var(--text1,#e8e9e9)}.sm-footer__section--latest:nth-child(3){padding-bottom:.5rem}.sm-footer__section--latest:last-child{padding-top:0}.sm-footer__section--latest:last-child>p:first-child{display:block}.sm-footer__link{margin-bottom:.15rem}.sm-footer__description{color:#c7c7c8;color:var(--text2,#c7c7c8);margin-bottom:.25rem}.sm-footer__date{color:#a5a5a7;color:var(--text3,#a5a5a7);font-size:.75rem;margin-bottom:.25rem;text-transform:uppercase}.sm-footer__title{color:#c7c7c8;color:var(--text2,#c7c7c8);margin-bottom:1rem;max-width:12rem;transition:color .2s;width:100%}.sm-footer__title:hover{color:#80deea;color:var(--primary,#80deea)}.sm-footer__header--serif{font-size:115%;margin-bottom:.5rem}.sm-footer__social{grid-gap:1rem;display:grid;grid-template-columns:repeat(auto-fit,1rem);margin-top:.5rem;transition:all .2s}@supports not (gap:1.5rem){.sm-footer__social{display:flex;flex-wrap:wrap}.sm-footer__social a{margin:.5rem}}.sm-footer__social a{border-radius:4px;margin:0}.sm-footer__social svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);fill:#c7c7c8;fill:var(--text2,#c7c7c8);height:100%;width:100%}.sm-footer__card-tag{align-items:center;color:#c7c7c8;color:var(--text2,#c7c7c8);display:flex}.sm-footer__card-tag p{margin:0;text-transform:uppercase;transition:all .2s}.sm-footer__card-tag svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);stroke-width:2px;align-self:flex-start;flex-shrink:0;height:.9375rem;transform:translateY(.2em);transition:all .2s;width:.9375rem}.sm-footer__card-tag:active p,.sm-footer__card-tag:hover p{color:#ffab91;color:var(--secondary,#ffab91);outline:none}.sm-footer__card-tag:active svg,.sm-footer__card-tag:hover svg{stroke:#ffab91;stroke:var(--secondary,#ffab91)}.sm-footer__published-by-ghost{color:#a5a5a7;color:var(--text3,#a5a5a7);font-size:.8rem;padding:.5rem;text-align:center}.sm-menu__link{transition:color .2s}.sm-menu__link:focus{color:#80deea;color:var(--primary,#80deea);outline:none}.sm-navbar{background-color:#282828;background-color:var(--surface2,#282828);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);display:block;font-size:.9rem;padding:0 1rem;position:fixed;top:0;transition:all .2s;width:100%;z-index:5}@media (min-width:600px){.sm-navbar{padding:0 3rem}}@media (min-width:1024px){.sm-navbar{padding:0 4rem}}.sm-navbar__bottom,.sm-navbar__top{margin:0 auto;max-width:1024px}.sm-navbar__top{border-bottom:1px solid #383838;border-bottom-color:var(--surface4,#383838);display:none;height:2.25rem}@media (min-width:1024px){.sm-navbar__top{align-items:center;display:flex;font-size:.8rem;justify-content:space-between}}.sm-navbar__top--left,.sm-navbar__top--right{align-items:center;display:flex}.sm-navbar__top--right button{margin-right:0}.sm-navbar__new-tag,.sm-navbar__new-tag--text{background-color:#ffab91;background-color:var(--secondary,#ffab91);border-radius:4px;color:#0a0a0a;color:var(--textInverse,#0a0a0a);font-size:.6rem;letter-spacing:.2px;line-height:1;margin-right:4px;padding:.15rem;text-transform:uppercase}.sm-navbar__new-tag--text{background:none;color:var(--text2)}.sm-navbar__new-link{color:#c7c7c8;color:var(--text2,#c7c7c8);font-size:.95em;line-height:1;transition:color .2s}.sm-navbar__new-link:hover{color:#f5f5f5;color:var(--text,#f5f5f5)}.sm-navbar__bottom{align-items:center;display:flex;height:3.25rem}.sm-navbar__bottom--center{display:none;line-height:0;margin-left:2rem;transform:translateY(1px)}@media (min-width:1024px){.sm-navbar__bottom--center{display:block}}.sm-navbar__bottom div:last-child{margin-left:auto}.sm-navbar__bottom--right{display:none;margin-left:auto}@media (min-width:1024px){.sm-navbar__bottom--right{align-items:center;display:flex}}.sm-navbar__bottom--right--mobile{line-height:0;margin:0 0 0 auto}@media (min-width:1024px){.sm-navbar__bottom--right--mobile{display:none}}.sm-navbar__brand--serif{align-items:center;display:flex;font-family:"DM Serif Text",georgia,serif;font-size:1.25rem;font-weight:400;line-height:1}.sm-navbar__brand--serif img{height:1.25rem;margin-right:.25rem;width:1.25rem}.sm-navbar__signin,.sm-navbar__signup{color:#c7c7c8;color:var(--text2,#c7c7c8);font-family:Lato,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen,ubuntu,cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:.8rem;line-height:1;margin:0 .5rem 0 0;transition:color .2s}.sm-navbar__signin:hover{color:#f5f5f5;color:var(--text,#f5f5f5)}.sm-navbar__signup{background-color:#80deea;background-color:var(--primary,#80deea);border-radius:4px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);color:#0a0a0a;color:var(--textInverse,#0a0a0a);font-weight:700;margin-right:0;padding:.25rem;transition:background-color .2s}.sm-navbar__signup:hover{background-color:#ffab91;background-color:var(--secondary,#ffab91)}.sm-navbar__hamburger-btn{height:1.5rem;width:1.5rem}.sm-navbar__hamburger-btn svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;width:100%}.sm-navbar__hamburger-btn svg:hover{stroke:#f5f5f5;stroke:var(--text,#f5f5f5)}.sm-navbar__search{display:none;height:1.5em;line-height:1;margin-left:.5rem;width:1.5em}.sm-navbar__search svg{fill:transparent;stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;transition:stroke .2s;width:100%}.sm-navbar__search svg:hover{stroke:#f5f5f5;stroke:var(--text,#f5f5f5)}.sm-navbar .sm-color-mode-btn{height:1.5em;line-height:1;margin:0 .5rem;width:1.5em}.sm-navbar .sm-color-mode-btn svg{fill:transparent;stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;transition:stroke .2s,fill .2s;width:100%}.sm-navbar .sm-color-mode-btn svg:hover{fill:#eee8aa;stroke:#f5f5f5;stroke:var(--text,#f5f5f5)}:root[color-mode=dark] .sm-color-mode-btn.dark,:root[color-mode=light] .sm-color-mode-btn.light{display:none}.sm-navigation__social-media-item{color:#c7c7c8;color:var(--text2,#c7c7c8);height:1.25em;margin-right:.5rem;width:1.25em}.sm-navigation__social-media-item:last-child{margin-right:0}.sm-navigation__social-media-item svg{height:100%;width:100%}.sm-navigation__ul{list-style-type:none}.sm-navigation__li{font-size:1.25rem;margin:.5rem 0}@media (min-width:1024px){.sm-navigation__li{display:inline-block;font-size:.8rem;line-height:1;margin:0 1rem 0 0}.sm-navigation__li:first-child{margin-left:0}.sm-navigation__li:last-child{margin-right:0}}.pagination{align-items:center;color:#c7c7c8;color:var(--text2,#c7c7c8);display:flex;justify-content:space-between}.pagination>*{margin:2rem 1rem 0}.pagination>:first-child{margin-left:0}.pagination>:last-child{margin-right:0}.pagination a{transition:color .2s}.pagination a:hover{color:#80deea;color:var(--primary,#80deea)}.sm-button,.sm-button--color,.sm-button--search{align-items:center;background-color:none;background-color:#303030;background-color:var(--surface3,#303030);border:none;border-radius:4px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);color:currentColor;cursor:pointer;display:flex;font-family:inherit;font-size:1rem;justify-content:center;line-height:inherit;margin-left:auto;margin-right:auto;padding:.25rem .5rem;transition:background-color .2s;width:10rem}.sm-button+.sm-button,.sm-button+.sm-button--color,.sm-button+.sm-button--search,.sm-button--color+.sm-button,.sm-button--color+.sm-button--color,.sm-button--color+.sm-button--search,.sm-button--search+.sm-button,.sm-button--search+.sm-button--color,.sm-button--search+.sm-button--search{margin-top:1rem}.sm-button--color:hover,.sm-button--search:hover,.sm-button:hover{background-color:#383838;background-color:var(--surface4,#383838);outline:none}.color-mode-btn.sm-button--color:hover svg,.color-mode-btn.sm-button--search:hover svg,.sm-button.color-mode-btn:hover svg{fill:#eee8aa}.sm-button--color:active,.sm-button--search:active,.sm-button:active{box-shadow:1px 1px 2px rgba(0,0,0,.35)}.sm-button--color svg,.sm-button--search svg,.sm-button svg{fill:transparent;stroke:currentColor;height:1rem;margin-right:.15rem;transform:translateY(-1px);transition:fill .2s;width:1rem}.sm-button--color{background-color:#80deea;background-color:var(--primary,#80deea);transition:background-color .2s}.sm-button--color,.sm-button--color:hover{color:#0a0a0a;color:var(--textInverse,#0a0a0a)}.sm-button--color:hover{background-color:#ffab91;background-color:var(--secondary,#ffab91)}.sm-button--color:active{box-shadow:1px 1px 2px rgba(0,0,0,.35)}.sm-button--search{display:none}.sm-card,.sm-card--tags{background-color:#282828;background-color:var(--surface2,#282828);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);max-width:100%;position:relative}.sm-card,.sm-card--tags,.sm-card__link{border-radius:4px;display:flex;flex-direction:column}.sm-card__link{height:100%;transition:box-shadow .2s,color .2s}.sm-card__link:focus,.sm-card__link:hover{box-shadow:0 0 0 4px #80deea;box-shadow:0 0 0 4px color(primary);box-shadow:0 0 0 4px var(--primary,color(primary))}.sm-card__link:focus .sm-card--tags__title,.sm-card__link:focus .sm-card__title,.sm-card__link:hover .sm-card--tags__title,.sm-card__link:hover .sm-card__title{color:#80deea;color:var(--primary,#80deea)}.sm-card--tags__img-container,.sm-card__img-container{border-top-left-radius:4px;border-top-right-radius:4px;height:0;overflow:hidden;padding-top:50%;position:relative;width:100%}.members.sm-card--tags__img-container:after,.paid.sm-card--tags__img-container:after,.sm-card__img-container.members:after,.sm-card__img-container.paid:after{background-color:#e8e9e9;background-color:var(--text1,#e8e9e9);bottom:0;color:#202020;color:var(--surface1,#202020);content:"Members";font-size:14px;left:1.25rem;letter-spacing:-.2px;padding:.25em .5em;position:absolute;text-transform:uppercase}.sm-card--tags__img,.sm-card--tags__no-img,.sm-card__img,.sm-card__no-img{border-top-left-radius:4px;border-top-right-radius:4px;display:block;height:100%;left:0;-o-object-fit:cover;object-fit:cover;overflow:hidden;position:absolute;top:0;width:100%}.sm-card--tags__no-img,.sm-card__no-img{background-color:var(--secondary);background-image:radial-gradient(var(--primary) 0,transparent 63%),radial-gradient(var(--three) 0,transparent 42%),radial-gradient(var(--four) 0,transparent 59%),radial-gradient(var(--five) 0,transparent 50%),radial-gradient(var(--secondary) 0,transparent 55%);background-position:-16% -35%,-21% -45%,5% 10%,19% 35%,25% 19%;background-repeat:no-repeat;background-size:87% 65%,62% 84%,69% 68%,62% 97%,65% 60%;content:"";height:100%;left:0;overflow:hidden;position:absolute;top:0;transform:scale(3);transition:background-position 2s;width:100%}.sm-card--tags__body,.sm-card__body{align-items:flex-start;display:flex;flex-direction:column;height:100%;margin:1.25rem 0;padding:0 1.25rem}.sm-card--tags__date,.sm-card__date{color:#e8e9e9;color:var(--text1,#e8e9e9);display:flex;font-size:.75rem;font-weight:400;padding:1px;text-transform:uppercase}.sm-card--tags__title,.sm-card__title{color:#f5f5f5;color:var(--text,#f5f5f5);font-size:1.5rem;line-height:1.1;margin:.25rem 0 1.5rem;position:relative;transition:color .2s}.sm-card__excerpt{display:none}.sm-card--tags{overflow:hidden}.sm-card--tags__link:focus .sm-card--tags__img-container:after,.sm-card--tags__link:hover .sm-card--tags__img-container:after{background:transparent}.sm-card--tags__img-container:after{background:rgba(0,0,0,.5);border-radius:4px;content:"";height:100%;left:0;position:absolute;top:0;transition:background .2s;width:100%}.sm-card--tags__no-img{background:#80deea;background:var(--primary,#80deea)}.sm-card--tags__no-img:after{background:none}.sm-card--tags__img,.sm-card--tags__no-img{border-radius:4px}.sm-card--tags__body{align-items:stretch;flex-direction:row;height:auto;left:0;position:absolute;top:0;transition:box-shadow .2s;z-index:2}.sm-card--tags__title{background:#202020;background:var(--surface1,#202020);border-bottom-left-radius:4px;border-top-left-radius:4px;color:#f5f5f5;color:var(--text,#f5f5f5);font-size:2rem;margin:0;padding:.25rem 0 .25rem .5rem}@media (min-width:600px){.sm-card--tags__title{font-size:1.5rem}}.sm-card--tags__date{font-feature-settings:"tnum";background:#202020;background:var(--surface1,#202020);border-bottom-right-radius:4px;border-top-right-radius:4px;color:#ffab91;color:var(--secondary,#ffab91);font-family:Lato,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen,ubuntu,cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:2rem;font-variant-numeric:tabular-nums;line-height:1;padding:.375rem .5rem}@media (min-width:600px){.sm-card--tags__date{font-size:1.5rem}}.sm-card--tags:nth-child(2n) .sm-card--tags__no-img,.sm-card--tags:nth-child(2n) .sm-card__no-img{background:#8cdbbf;background:var(--three,#8cdbbf)}.sm-card--tags:nth-child(3n) .sm-card--tags__no-img,.sm-card--tags:nth-child(3n) .sm-card__no-img{background:#b4d195;background:var(--four,#b4d195)}.sm-card--tags:nth-child(4n) .sm-card--tags__no-img,.sm-card--tags:nth-child(4n) .sm-card__no-img{background:#e0c081;background:var(--five,#e0c081)}.sm-card--tags:nth-child(5n) .sm-card--tags__no-img,.sm-card--tags:nth-child(5n) .sm-card__no-img{background:#ffab91;background:var(--secondary,#ffab91)}hr{background:linear-gradient(to right,var(--surface2),var(--surface3),var(--surface4),var(--surface3),var(--surface2));border:none;border-radius:4px;height:.15rem;margin:2rem 0}.sm-form{display:flex;flex-direction:column;font-size:1rem}.sm-form__input,.sm-form textarea{background-color:#282828;background-color:var(--surface2,#282828);border:1px solid;border-radius:4px;color:#e8e9e9;color:var(--text1,#e8e9e9);font-family:Lato,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen,ubuntu,cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1rem;margin:.25rem 0;padding:.25rem;transition:all .2s;width:100%}.sm-form__input:focus,.sm-form textarea:focus{background-color:#303030;background-color:var(--surface3,#303030);border:1px solid #80deea;border:1px solid var(--primary);color:#f5f5f5;color:var(--text,#f5f5f5);outline:none;transition:all .2s}.sm-form textarea{flex-basis:auto;height:8rem}.sm-form .sm-button--color{margin:1rem 0 0}.sm-grid,.sm-grid-container,.sm-grid-container--footer,.sm-grid-container--tags{display:flex;flex-wrap:wrap}.sm-grid-container--footer .sm-card,.sm-grid-container--tags .sm-card,.sm-grid-container .sm-card,.sm-grid .sm-card{margin-bottom:1rem;min-width:14.375rem;width:50%}.sm-grid-container--footer .sm-card:first-child,.sm-grid-container--tags .sm-card:first-child,.sm-grid-container .sm-card:first-child,.sm-grid .sm-card:first-child{width:100%}@supports (gap:1.5rem){.sm-grid,.sm-grid-container,.sm-grid-container--footer,.sm-grid-container--tags{grid-gap:1.5rem;display:grid;gap:1.5rem}.sm-grid-container--footer .sm-card,.sm-grid-container--tags .sm-card,.sm-grid-container .sm-card,.sm-grid .sm-card{margin-bottom:0;min-width:0;min-width:auto;width:auto}.sm-grid-container--footer .sm-card:first-child,.sm-grid-container--tags .sm-card:first-child,.sm-grid-container .sm-card:first-child,.sm-grid .sm-card:first-child{width:auto}}@media (min-width:600px){.sm-card-1{grid-area:one}.sm-card-2{grid-area:two}.sm-card-3{grid-area:three}.sm-card-4{grid-area:four}.sm-card-5{grid-area:five}.sm-card-6{grid-area:six}.sm-card-7{grid-area:seven}.sm-card-8{grid-area:eight}.sm-card-9{grid-area:nine}.sm-card-10{grid-area:ten}}.sm-grid-container,.sm-grid-container--footer,.sm-grid-container--tags{align-content:stretch;grid-template-columns:repeat(auto-fit,minmax(292px,1fr));margin:1rem 0;max-width:100%}.sm-grid-container--footer{grid-gap:2rem;grid-template-columns:repeat(2,1fr)}@media (min-width:1024px){.sm-grid-container--footer{grid-gap:2rem;grid-template-columns:repeat(4,1fr)}}@media (min-width:600px){.sm-grid-container-1{grid-template-areas:"one";grid-template-columns:minmax(292px,1fr)}.sm-grid-container-1 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-1 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-1 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-1 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-2{grid-template-areas:"one two";grid-template-columns:1fr 1fr}.sm-grid-container-3{grid-template-areas:"one one" "two three";grid-template-columns:1fr 1fr}.sm-grid-container-3 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-3 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-3 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-3 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-4{grid-template-areas:"one two" "three four";grid-template-columns:1fr 1fr}.sm-grid-container-5{grid-template-areas:"one one" "two three" "four five";grid-template-columns:1fr 1fr}.sm-grid-container-6{grid-template-areas:"one one one two two two" "three three three four four four" "five five five six six six"}.sm-grid-container-6,.sm-grid-container-7{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-7{grid-template-areas:"one one one one one one" "two two two three three three" "four four four five five five" "six six six seven seven seven"}.sm-grid-container-7 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-7 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-7 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-7 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-8{grid-template-areas:"one one one two two two" "three three three four four four" "five five five six six six" "seven seven seven eight eight eight"}.sm-grid-container-8,.sm-grid-container-9{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-9{grid-template-areas:"one one one one one one" "two two two three three three" "four four four five five five" "six six six seven seven seven" "eight eight eight nine nine nine"}.sm-grid-container-9 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-9 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-9 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-9 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-10{grid-template-areas:"one one one two two two" "three three three four four four" "five five five six six six" "seven seven seven eight eight eight" "nine nine nine ten ten ten";grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}}@media (min-width:1024px){.sm-grid-container-5{grid-template-areas:"one one one two two two" "three three four four five five"}.sm-grid-container-5,.sm-grid-container-6{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-6{grid-template-areas:"one one one one one one" "two two two three three three" "four four five five six six"}.sm-grid-container-6 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-6 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-6 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-6 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-7{grid-template-areas:"one one one one one one" "two two three three four four" "five five six six seven seven";grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-7 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-7 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-7 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-7 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-8{grid-template-areas:"one one one two two two" "three three four four five five" "six six seven seven eight eight"}.sm-grid-container-8,.sm-grid-container-9{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-9{grid-template-areas:"one one one one one one" "two two two three three three" "four four five five six six" "seven seven eight eight nine nine"}.sm-grid-container-9 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-9 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-9 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-9 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-10{grid-template-areas:"one one one one one one" "two two three three four four" "five five six six seven seven" "eight eight nine nine ten ten";grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-10 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-10 .sm-card-1 .sm-card__img-container{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-10 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-10 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}}.sm-link{display:inline;position:relative;text-decoration:none}.sm-link:before{background-color:#80deea;background-color:var(--primary,#80deea);border-radius:4px;bottom:-1px;-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0);content:"";height:2px;left:0;position:absolute;width:100%;z-index:-1}.sm-link:before,.sm-link:hover:before{transition:-webkit-clip-path .2s;transition:clip-path .2s;transition:clip-path .2s,-webkit-clip-path .2s}.sm-link:hover:before{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}.sm-link.sm-nav-current:before{-webkit-clip-path:none;clip-path:none}.sm-content-wrap:before{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:linear-gradient(315deg,rgba(0,0,0,.5),rgba(0,0,0,.3));content:"";height:100%;left:0;opacity:0;top:0;transition:opacity .2s;width:100%;z-index:7}.sm-expanded-menu .sm-content-wrap:before,.sm-expanded-modal .sm-content-wrap:before{opacity:1;position:fixed}.sm-modal{background-color:#282828;background-color:var(--surface2,#282828);color:#f5f5f5;color:var(--text,#f5f5f5);height:100%;left:0;opacity:0;overflow:hidden;pointer-events:none;position:fixed;text-align:center;top:0;transition:opacity .2s ease-in;width:100%;z-index:10}@media (min-width:1024px){.sm-modal{border-radius:4px;box-shadow:-3px 0 10px rgba(0,0,0,.25);left:50%;margin-top:15vmin;max-height:75%;max-width:100vw;transform:translate(-50%);width:380px}}.sm-modal__container{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:space-between;padding:1rem}.sm-modal[aria-expanded=true]{opacity:1;overflow-y:auto;pointer-events:all}@media (min-width:1024px){.sm-modal[aria-expanded=true]{-webkit-animation:popup .25s ease-out;animation:popup .25s ease-out}}.sm-modal__header{display:flex;flex-direction:column;width:100%}.sm-modal__header .sm-navigation__ul{margin:2rem}.sm-modal__close-btn{align-self:flex-end;height:1.5rem;line-height:0;margin:0 0 1rem 1rem;width:1.5rem}.sm-modal__close-btn:hover svg{stroke:#ffab91;stroke:var(--secondary,#ffab91)}.sm-modal__close-btn svg{stroke-width:3;stroke:#e8e9e9;stroke:var(--text1,#e8e9e9);height:1.5rem;transition:all .2s;width:1.5rem}.sm-modal__title{margin:0}.sm-modal__footer{display:flex;flex-wrap:wrap;justify-content:center;width:100%}.sm-modal__footer a{height:2rem;margin:.5rem;width:2rem}.sm-modal__footer a:last-child{margin-right:0}.sm-modal__footer a svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;width:100%}.sm-search__modal .sm-modal__container{justify-content:flex-start}.sm-search__modal .sm-modal__header{margin:0 auto;max-width:600px}.sm-search__modal .sm-small-header{text-align:left}.sm-search__button--loading{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;display:none}.loading .sm-search__button--loading{display:inline-block;transform:none}.loading .sm-search__button--content{display:none}.sm-search__input-container{display:flex}.sm-search__input-container button,.sm-search__input-container input{line-height:1;margin:0}.sm-search__input-container input{flex:2;margin-right:.25rem}.sm-search__input-container button{flex:1}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}.sm-search-results{height:100%;margin:1rem auto 0;max-width:600px;width:100%}.sm-search-results__container{padding-bottom:1rem}.sm-search-results .sm-small-header{text-align:left}.sm-search-results__item{background-color:#303030;background-color:var(--surface3,#303030);border-radius:4px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);margin-top:1rem;text-align:left}.sm-search-results__item:first-child{margin-top:.25rem}.sm-search-results__link{border:3px solid transparent;border-radius:4px;display:block;height:100%;padding:1rem;transition:box-shadow .2s,color .2s;width:100%}.sm-search-results__link:hover{box-shadow:0 0 0 4px #80deea;box-shadow:0 0 0 4px var(--primary)}.sm-search-results__link:hover .sm-search-results__title{color:#80deea;color:var(--primary,#80deea)}.sm-search-results__date{background:none;color:#e8e9e9;color:var(--text1,#e8e9e9);font-size:.8rem}.sm-search-results__title{font-family:"DM Serif Text",georgia,serif;font-size:1.1rem;font-weight:400;line-height:1.2;margin:.25rem 0;transition:color .2s}.sm-search-results__excerpt{-webkit-box-orient:vertical;-webkit-line-clamp:3;display:-webkit-box;font-size:.9rem;text-overflow:ellipsis}.sm-post-share-bar,.sm-search-results__excerpt{color:#c7c7c8;color:var(--text2,#c7c7c8);overflow:hidden}.sm-post-share-bar{align-items:center;background-color:#303030;background-color:var(--surface3,#303030);border-bottom:3px solid var(--surface4);bottom:0;display:flex;flex-direction:row;flex-wrap:wrap;font-weight:700;justify-content:center;position:fixed;text-align:center;width:100%;z-index:5}@media (min-width:1024px){.sm-post-share-bar{display:none}}.sm-post-share-bar__link,.sm-post-share-bar__link--copy,.sm-post-share-bar__link--facebook,.sm-post-share-bar__link--linkedin,.sm-post-share-bar__link--twitter{border-radius:4px;height:2.5rem;padding:.5rem;transition:background-color .2s;width:2.5rem}.sm-post-share-bar__link--copy svg,.sm-post-share-bar__link--facebook svg,.sm-post-share-bar__link--linkedin svg,.sm-post-share-bar__link--twitter svg,.sm-post-share-bar__link svg{fill:transparent;stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;transition:stroke .2s;width:100%}@media (min-width:1024px){.sm-post-share-bar__link,.sm-post-share-bar__link--copy,.sm-post-share-bar__link--facebook,.sm-post-share-bar__link--linkedin,.sm-post-share-bar__link--twitter{height:1.8rem;padding:.36rem;width:1.8rem}}.sm-post-share-bar__link--twitter:active,.sm-post-share-bar__link--twitter:hover{background-color:#1da1f2}.sm-post-share-bar__link--twitter:active svg,.sm-post-share-bar__link--twitter:hover svg{stroke:#fff}.sm-post-share-bar__link--facebook:active,.sm-post-share-bar__link--facebook:hover{background-color:#1877f2}.sm-post-share-bar__link--facebook:active svg,.sm-post-share-bar__link--facebook:hover svg{stroke:#fff}.sm-post-share-bar__link--linkedin:active,.sm-post-share-bar__link--linkedin:hover{background-color:#0077b5}.sm-post-share-bar__link--linkedin:active svg,.sm-post-share-bar__link--linkedin:hover svg{stroke:#fff}.sm-post-share-bar__link--copy:active,.sm-post-share-bar__link--copy:hover{background-color:#80deea;background-color:var(--primary,#80deea)}.sm-post-share-bar__link--copy:active svg,.sm-post-share-bar__link--copy:hover svg{stroke:#fff}:root[color-mode=dark] .sm-post-share-bar__link--copy:active svg,:root[color-mode=dark] .sm-post-share-bar__link--copy:hover svg{stroke:#000}.sm-skip-to-content{left:50%;opacity:0;position:fixed;top:0;transform:translate3d(-50%,-125%,0);transition:background-color .2s,transform .25s ease-out,opacity .25s;z-index:15}.sm-skip-to-content:focus{opacity:1;transform:translate3d(-50%,.5rem,0);transition:transform .25s ease-in,opacity .25s}.sm-small-header,label{color:#a5a5a7;color:var(--text3,#a5a5a7);font-size:.8rem;font-weight:700;margin-top:1rem;text-transform:uppercase}.academia svg{fill:currentColor;transition:all .2s}.academia svg:focus,.academia svg:hover{fill:#80deea;fill:var(--primary,#80deea)}.facebook{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.facebook:hover{background-color:#1877f2}.facebook:hover svg{stroke:#fff}.facebook svg{fill:none;stroke:currentColor;transition:stroke .2s}.github{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.github:hover{background-color:#4078c0}.github:hover svg{stroke:#fff}.github svg{fill:none;stroke:currentColor;transition:stroke .2s}.gitlab{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.gitlab:hover{background-color:#fca326}.gitlab:hover svg{stroke:#fff}.gitlab svg{fill:none;stroke:currentColor;transition:stroke .2s}.instagram{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.instagram:hover{background-color:#c13584}.instagram:hover svg{stroke:#fff}.instagram svg{fill:none;stroke:currentColor;transition:stroke .2s}.linkedin{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.linkedin:hover{background-color:#0077b5}.linkedin:hover svg{stroke:#fff}.linkedin svg{fill:none;stroke:currentColor;transition:stroke .2s}.rss{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.rss:hover{background-color:#f26522}.rss:hover svg{stroke:#fff}.rss svg{fill:none;stroke:currentColor;transition:stroke .2s}.twitch{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.twitch:hover{background-color:#6441a5}.twitch:hover svg{stroke:#fff}.twitch svg{fill:none;stroke:currentColor;transition:stroke .2s}.twitter{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.twitter:hover{background-color:#1da1f2}.twitter:hover svg{stroke:#fff}.twitter svg{fill:none;stroke:currentColor;transition:stroke .2s}.map svg,.website svg{fill:transparent;stroke:currentColor;transition:all .2s}.map svg:focus,.map svg:hover,.website svg:focus,.website svg:hover{stroke:#80deea;stroke:var(--primary,#80deea)}.website{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.website:hover{background-color:#80deea;background-color:var(--primary,#80deea)}.website:hover svg{stroke:#0a0a0a;stroke:var(--textInverse,#0a0a0a)}.website svg{fill:none;stroke:currentColor;transition:stroke .2s}.youtube{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.youtube:hover{background-color:red}.youtube:hover svg{stroke:#fff}.youtube svg{fill:none;stroke:currentColor;transition:stroke .2s}.sm-tag{color:#c7c7c8;color:var(--text2,#c7c7c8);display:inline-block;font-size:.8rem;letter-spacing:.2px;text-transform:uppercase;transition:color .2s}.sm-tag:before{content:"#"}.sm-tag:not(.sm-card .sm-tag):hover{color:#f5f5f5;color:var(--text,#f5f5f5)}.sm-card .sm-tag{margin-top:auto}.sm-post__tag-bar .sm-tag:not(:last-child){margin-right:.5rem}.sm-main,.sm-main--index{overflow-x:hidden;width:100%}.sm-main--index{margin-top:3.25rem}@media (min-width:1024px){.sm-main--index{margin-top:5.5rem}}.sm-main__outer-container{padding:1rem;position:relative;width:100%}@media (min-width:600px) and (max-width:1023px){.sm-main__outer-container{padding:1rem 3rem 2rem}}@media (min-width:1024px){.sm-main__outer-container{padding:1rem 4rem 2rem}}.sm-main__inner-container{margin:0 auto 1rem;max-width:1024px}.sm-main__header{display:inline;margin:0}.sm-main__read-more{color:#f5f5f5;color:var(--text,#f5f5f5);display:inline-block;transition:color .2s}.sm-main__read-more h2{margin:0}.sm-main__read-more:hover{color:#ffab91;color:var(--secondary,#ffab91)}.sm-hero{background-color:#202020;background-color:var(--surface1,#202020);background-position:50%;background-size:cover;height:27.5rem;margin-bottom:2rem;margin-top:3.25rem;overflow:hidden;position:relative;width:100%}@media (min-width:1024px){.sm-hero{margin-top:5.5rem}}@media (min-height:60rem) and (min-width:1280px){.sm-hero{height:37.5rem}}.sm-hero:before{background:radial-gradient(rgba(0,0,0,.5),rgba(0,0,0,.75));content:"";height:100%;left:0;position:absolute;top:0;width:100%}.sm-hero__text-container{position:absolute;top:50%;transform:translateY(-50%);width:100%}.sm-hero__site-title{color:#fff;line-height:1.1;margin:0 0 .5rem}.sm-hero__site-description{color:#eee;font-size:1.25rem;line-height:1.2;margin:0}.sm-author__header{margin:0 auto;max-width:1024px}.sm-author__img-container{align-items:center;border-radius:50%;display:flex;flex-shrink:0;justify-content:center;margin-bottom:2rem;position:relative}@media (min-width:600px){.sm-author__img-container{margin-bottom:0}}.sm-author__img-container:before{background:linear-gradient(45deg,#80deea,#ffab91);background:var(--gradient);border-radius:50%;content:"";height:100%;left:0;position:absolute;top:0;width:100%}.sm-author__img,.sm-author__no-img{border-radius:50%;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);height:9rem;margin:.25rem;position:relative;width:9rem;z-index:1}.sm-author__no-img{background:linear-gradient(45deg,#80deea,#ffab91);background:var(--gradient);overflow:hidden}.sm-author__no-img svg{fill:transparent;color:#0a0a0a;color:var(--textInverse,#0a0a0a);display:block;height:90%;margin:0 auto;width:90%}@media (min-width:600px){.sm-author__text{margin-left:4rem}}.sm-author__name{font-family:"DM Serif Text",georgia,serif;font-weight:400;margin:0}.sm-author__location svg:hover{stroke:currentColor}.sm-author__meta{align-items:center;display:flex}.sm-author__meta a{line-height:1;margin-right:.5rem}.sm-author__meta a:last-child{margin-right:0}.sm-author__meta svg{height:1rem;transition:all .2s;width:1rem}.sm-author__location{align-items:center;display:flex}.sm-author__location p{margin-left:.25rem}.sm-author__location svg{height:1rem;width:1rem}.sm-main--error__heading{font-family:"DM Serif Text",georgia,serif;font-size:4rem;font-weight:400;margin-bottom:0;position:relative;text-align:center}.sm-main--error__text{color:#e8e9e9;color:var(--text1,#e8e9e9);font-size:1.5rem;text-align:center} +*,:after,:before{box-sizing:border-box;margin:0;padding:0}button{background:none;border:none;cursor:pointer}:root[color-mode=light]{--text:#0a0a0a;--textInverse:#f5f5f5;--text1:#171717;--text2:#39393a;--text3:#5a5a5c;--text4:#9ea0a2;--surface:#ebebeb;--surface1:#f0f0f0;--surface2:#f5f5f5;--surface3:#fafafa;--surface4:#fff;--primary:#0d48a0;--secondary:#a4002e;--three:#643791;--four:#8b1c76;--five:#a00053;--success:#48a00d;--error:#a40000;--error-hover:#520000;--gradient:linear-gradient(to right top,#0d48a0,#071955)}:root[color-mode=dark]{--text:#f5f5f5;--textInverse:#0a0a0a;--text1:#e8e9e9;--text2:#c6c6c7;--text3:#a5a5a7;--text4:#616365;--surface:#181818;--surface1:#202020;--surface2:#282828;--surface3:#303030;--surface4:#383838;--primary:#80deea;--secondary:#ffab91;--three:#8cdbbf;--four:#b4d195;--five:#e0c081;--success:#b4d195;--error:#ff8f8f;--error-hover:#ff5c5c;--gradient:linear-gradient(to right top,#80deea,#d3f8fd)}html{background-color:#202020;background-color:var(--surface1,#202020);color:#f5f5f5;color:var(--text,#f5f5f5);scroll-behavior:smooth}strong{font-weight:700}em{font-style:italic}:link{text-decoration:none}:link,:visited{color:currentColor}::-moz-selection{background-color:#e0c081;color:#111}::selection{background-color:#e0c081;color:#111}:target{margin-top:-3.25rem;padding-top:3.25rem}@media(min-width:1024px){:target{margin-top:5.5rem;margin-top:-5.5rem;padding-top:5.5rem}}:focus{outline-color:#a5a5a7;outline-color:var(--text3,#a5a5a7);outline-offset:3px;outline-style:dotted;outline-width:1px}a:active,button:active{outline:none}::-moz-focus-inner{border:none;outline:none}html{text-rendering:optimizeLegibility;font-size:1rem;font-size:clamp(1rem,.9090909090909091rem + .45454545454545453vw,1.25rem);font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{font-feature-settings:"liga","clig";font-family:"DM Serif Text",georgia,serif;font-variant-ligatures:common-ligatures;font-weight:400;line-height:1.2;margin:3rem 0 1.38rem}h1{font-size:2.488rem;margin-top:0}h2{font-size:2.074rem}h3{font-size:1.728rem}h4{font-size:1.44rem}h5{font-size:1.2rem}h6{font-size:1.1rem}.sm-text-small,small{font-size:.833rem}@-webkit-keyframes popup{0%{opacity:0;transform:translate(-50%,20px) scale(.8)}75%{opacity:1}to{transform:translate(-50%) scale(1)}}@keyframes popup{0%{opacity:0;transform:translate(-50%,20px) scale(.8)}75%{opacity:1}to{transform:translate(-50%) scale(1)}}@-webkit-keyframes slide-in{0%{opacity:0;top:-100%}to{opacity:1;top:1rem}}@keyframes slide-in{0%{opacity:0;top:-100%}to{opacity:1;top:1rem}}@-webkit-keyframes slide-out{0%{opacity:1;top:1rem}to{opacity:0;top:-100%}}@keyframes slide-out{0%{opacity:1;top:1rem}to{opacity:0;top:-100%}}@-webkit-keyframes mesh{0%{background-position:0 0,0 100%,50% 0,50% 25%,50% 100%}15%{background-position:1% 1%,1% 101%,51% 1%,51% 26%,51% 101%}30%{background-position:2% 2%,2% 102%,52% 2%,52% 26%,52% 102%}45%{background-position:3% 3%,3% 103%,53% 3%,53% 27%,53% 103%}60%{background-position:4% 4%,4% 104%,54% 4%,54% 28%,54% 104%}75%{background-position:5% 5%,5% 105%,55% 5%,55% 29%,55% 105%}90%{background-position:6% 6%,6% 106%,56% 6%,56% 30%,56% 106%}}@keyframes mesh{0%{background-position:0 0,0 100%,50% 0,50% 25%,50% 100%}15%{background-position:1% 1%,1% 101%,51% 1%,51% 26%,51% 101%}30%{background-position:2% 2%,2% 102%,52% 2%,52% 26%,52% 102%}45%{background-position:3% 3%,3% 103%,53% 3%,53% 27%,53% 103%}60%{background-position:4% 4%,4% 104%,54% 4%,54% 28%,54% 104%}75%{background-position:5% 5%,5% 105%,55% 5%,55% 29%,55% 105%}90%{background-position:6% 6%,6% 106%,56% 6%,56% 30%,56% 106%}}.sm-outer-container,.sm-outer-container--footer{padding:1rem;position:relative;width:100%}@media(min-width:600px){.sm-outer-container,.sm-outer-container--footer{padding:1rem 3rem 2rem}}@media(min-width:1024px){.sm-outer-container,.sm-outer-container--footer{padding:1rem 4rem 2rem}}.sm-outer-container--footer{background-color:#181818;background-color:var(--surface,#181818);border-bottom:none;color:#e8e9e9;color:var(--text1,#e8e9e9);font-size:.9rem;min-height:250px;padding-bottom:3rem}@media(min-width:1024px){.sm-outer-container--footer{padding-bottom:1rem}}.sm-inner-container,.sm-inner-container--author,.sm-inner-container--footer,.sm-inner-container--hero{margin:0 auto 1rem;max-width:1024px}.sm-inner-container--hero{height:100%;margin-bottom:0;position:relative}.sm-inner-container--author{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1rem;padding-bottom:1rem}@media(min-width:600px){.sm-inner-container--author{flex-direction:row}}.sm-footer__section,.sm-footer__section--latest{display:flex;flex-direction:column}.sm-footer__section--latest{color:#e8e9e9;color:var(--text1,#e8e9e9)}.sm-footer__section--latest:nth-child(3){padding-bottom:.5rem}.sm-footer__section--latest:last-child{padding-top:0}.sm-footer__section--latest:last-child>p:first-child{display:block}.sm-footer__link{margin-bottom:.15rem}.sm-footer__description{color:#c7c7c8;color:var(--text2,#c7c7c8);margin-bottom:.25rem}.sm-footer__date{color:#a5a5a7;color:var(--text3,#a5a5a7);font-size:.75rem;margin-bottom:.25rem;text-transform:uppercase}.sm-footer__title{color:#c7c7c8;color:var(--text2,#c7c7c8);margin-bottom:1rem;max-width:12rem;transition:color .2s;width:100%}.sm-footer__title:hover{color:#80deea;color:var(--primary,#80deea)}.sm-footer__header--serif{font-size:115%;margin-bottom:.5rem}.sm-footer__social{grid-gap:1rem;display:grid;grid-template-columns:repeat(auto-fit,1rem);margin-top:.5rem;transition:all .2s}@supports not (gap:1.5rem){.sm-footer__social{display:flex;flex-wrap:wrap}.sm-footer__social a{margin:.5rem}}.sm-footer__social a{border-radius:4px;margin:0}.sm-footer__social svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);fill:#c7c7c8;fill:var(--text2,#c7c7c8);height:100%;width:100%}.sm-footer__card-tag{align-items:center;color:#c7c7c8;color:var(--text2,#c7c7c8);display:flex}.sm-footer__card-tag p{margin:0;text-transform:uppercase;transition:all .2s}.sm-footer__card-tag svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);stroke-width:2px;align-self:flex-start;flex-shrink:0;height:.9375rem;transform:translateY(.2em);transition:all .2s;width:.9375rem}.sm-footer__card-tag:active p,.sm-footer__card-tag:hover p{color:#ffab91;color:var(--secondary,#ffab91);outline:none}.sm-footer__card-tag:active svg,.sm-footer__card-tag:hover svg{stroke:#ffab91;stroke:var(--secondary,#ffab91)}.sm-footer__published-by-ghost{color:#a5a5a7;color:var(--text3,#a5a5a7);font-size:.8rem;padding:.5rem;text-align:center}.sm-menu__link{transition:color .2s}.sm-menu__link:focus{color:#80deea;color:var(--primary,#80deea);outline:none}.sm-navbar{background-color:#282828;background-color:var(--surface2,#282828);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);display:block;font-size:.9rem;padding:0 1rem;position:fixed;top:0;transition:all .2s;width:100%;z-index:5}@media(min-width:600px){.sm-navbar{padding:0 3rem}}@media(min-width:1024px){.sm-navbar{padding:0 4rem}}.sm-navbar__bottom,.sm-navbar__top{margin:0 auto;max-width:1024px}.sm-navbar__divider{background-color:var(--text1);display:none;height:1px;left:0;opacity:.1;position:absolute;transform:translateY(6px);width:100vw}@media(min-width:1024px){.sm-navbar__divider{display:block}}.sm-navbar__top{display:none;height:2.25rem}@media(min-width:1024px){.sm-navbar__top{align-items:center;display:flex;font-size:.8rem;justify-content:space-between}}.sm-navbar__top--left,.sm-navbar__top--right{align-items:center;display:flex}.sm-navbar__top--right button{margin-right:0}.sm-navbar__new-tag,.sm-navbar__new-tag--text{background-color:#ffab91;background-color:var(--secondary,#ffab91);border-radius:4px;color:#0a0a0a;color:var(--textInverse,#0a0a0a);font-size:.6rem;letter-spacing:.2px;line-height:1;margin-right:4px;padding:.15rem;text-transform:uppercase}.sm-navbar__new-tag--text{background:none;color:var(--text2)}.sm-navbar__new-link{color:#c7c7c8;color:var(--text2,#c7c7c8);font-size:.95em;line-height:1;transition:color .2s}.sm-navbar__new-link:hover{color:#f5f5f5;color:var(--text,#f5f5f5)}.sm-navbar__bottom{align-items:center;display:flex;height:3.25rem}.sm-navbar__bottom--center{display:none;line-height:0;margin-left:2rem;transform:translateY(1px)}@media(min-width:1024px){.sm-navbar__bottom--center{display:block}}.sm-navbar__bottom div:last-child{margin-left:auto}.sm-navbar__bottom--right{display:none;margin-left:auto}@media(min-width:1024px){.sm-navbar__bottom--right{align-items:center;display:flex}}.sm-navbar__bottom--right--mobile{line-height:0;margin:0 0 0 auto}@media(min-width:1024px){.sm-navbar__bottom--right--mobile{display:none}}.sm-navbar__brand--serif{align-items:center;display:flex;font-family:"DM Serif Text",georgia,serif;font-size:1.25rem;font-weight:400;line-height:1}.sm-navbar__brand--serif img{height:1.25rem;margin-right:.25rem;width:1.25rem}.sm-navbar__signin,.sm-navbar__signup{color:#c7c7c8;color:var(--text2,#c7c7c8);font-family:Lato,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen,ubuntu,cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:.8rem;line-height:1;margin:0 .5rem 0 0;transition:color .2s}.sm-navbar__signin:hover{color:#f5f5f5;color:var(--text,#f5f5f5)}.sm-navbar__signup{background-color:#80deea;background-color:var(--primary,#80deea);border-radius:4px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);color:#0a0a0a;color:var(--textInverse,#0a0a0a);font-weight:700;margin-right:0;padding:.25rem;transition:background-color .2s}.sm-navbar__signup:hover{background-color:#ffab91;background-color:var(--secondary,#ffab91)}.sm-navbar__hamburger-btn{height:1.5rem;width:1.5rem}.sm-navbar__hamburger-btn svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;width:100%}.sm-navbar__hamburger-btn svg:hover{stroke:#f5f5f5;stroke:var(--text,#f5f5f5)}.sm-navbar__search{display:none;height:1.5em;line-height:1;margin-left:.5rem;width:1.5em}.sm-navbar__search svg{fill:transparent;stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;transition:stroke .2s;width:100%}.sm-navbar__search svg:hover{stroke:#f5f5f5;stroke:var(--text,#f5f5f5)}.sm-navbar .sm-color-mode-btn{height:1.5em;line-height:1;margin:0 .5rem;width:1.5em}.sm-navbar .sm-color-mode-btn svg{fill:transparent;stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;transition:stroke .2s,fill .2s;width:100%}.sm-navbar .sm-color-mode-btn svg:hover{fill:#eee8aa;stroke:#f5f5f5;stroke:var(--text,#f5f5f5)}:root[color-mode=dark] .sm-color-mode-btn.dark,:root[color-mode=light] .sm-color-mode-btn.light{display:none}.sm-navigation__social-media-item{color:#c7c7c8;color:var(--text2,#c7c7c8);height:1.25em;margin-right:.5rem;width:1.25em}.sm-navigation__social-media-item:last-child{margin-right:0}.sm-navigation__social-media-item svg{height:100%;width:100%}.sm-navigation__ul{list-style-type:none}.sm-navigation__li{font-size:1.25rem;margin:.5rem 0}@media(min-width:1024px){.sm-navigation__li{display:inline-block;font-size:.8rem;line-height:1;margin:0 1rem 0 0}.sm-navigation__li:first-child{margin-left:0}.sm-navigation__li:last-child{margin-right:0}}.pagination{align-items:center;color:#c7c7c8;color:var(--text2,#c7c7c8);display:flex;justify-content:space-between}.pagination>*{margin:2rem 1rem 0}.pagination>:first-child{margin-left:0}.pagination>:last-child{margin-right:0}.pagination a{transition:color .2s}.pagination a:hover{color:#80deea;color:var(--primary,#80deea)}.sm-button,.sm-button--color,.sm-button--search{align-items:center;background-color:none;background-color:#303030;background-color:var(--surface3,#303030);border:none;border-radius:4px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);color:currentColor;cursor:pointer;display:flex;font-family:inherit;font-size:1rem;justify-content:center;line-height:inherit;margin-left:auto;margin-right:auto;padding:.25rem .5rem;transition:background-color .2s;width:10rem}.sm-button+.sm-button,.sm-button+.sm-button--color,.sm-button+.sm-button--search,.sm-button--color+.sm-button,.sm-button--color+.sm-button--color,.sm-button--color+.sm-button--search,.sm-button--search+.sm-button,.sm-button--search+.sm-button--color,.sm-button--search+.sm-button--search{margin-top:1rem}.sm-button--color:hover,.sm-button--search:hover,.sm-button:hover{background-color:#383838;background-color:var(--surface4,#383838);outline:none}.color-mode-btn.sm-button--color:hover svg,.color-mode-btn.sm-button--search:hover svg,.sm-button.color-mode-btn:hover svg{fill:#eee8aa}.sm-button--color:active,.sm-button--search:active,.sm-button:active{box-shadow:1px 1px 2px rgba(0,0,0,.35)}.sm-button--color svg,.sm-button--search svg,.sm-button svg{fill:transparent;stroke:currentColor;height:1rem;margin-right:.15rem;transform:translateY(-1px);transition:fill .2s;width:1rem}.sm-button--color{background-color:#80deea;background-color:var(--primary,#80deea);transition:background-color .2s}.sm-button--color,.sm-button--color:hover{color:#0a0a0a;color:var(--textInverse,#0a0a0a)}.sm-button--color:hover{background-color:#ffab91;background-color:var(--secondary,#ffab91)}.sm-button--color:active{box-shadow:1px 1px 2px rgba(0,0,0,.35)}.sm-button--search{display:none}.sm-card,.sm-card--tags{background-color:#282828;background-color:var(--surface2,#282828);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);max-width:100%;position:relative}.sm-card,.sm-card--tags,.sm-card__link{border-radius:4px;display:flex;flex-direction:column}.sm-card__link{height:100%;transition:box-shadow .2s,color .2s}.sm-card__link:focus,.sm-card__link:hover{box-shadow:0 0 0 4px #80deea;box-shadow:0 0 0 4px color(primary);box-shadow:0 0 0 4px var(--primary,color(primary))}.sm-card__link:focus .sm-card--tags__title,.sm-card__link:focus .sm-card__title,.sm-card__link:hover .sm-card--tags__title,.sm-card__link:hover .sm-card__title{color:#80deea;color:var(--primary,#80deea)}.sm-card--tags__img-container,.sm-card__img-container{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px;height:0;overflow:hidden;padding-top:50%;position:relative;width:100%}.members.sm-card--tags__img-container:after,.paid.sm-card--tags__img-container:after,.sm-card__img-container.members:after,.sm-card__img-container.paid:after{background-color:#e8e9e9;background-color:var(--text1,#e8e9e9);bottom:0;color:#202020;color:var(--surface1,#202020);content:"Members";font-size:14px;left:1.25rem;letter-spacing:-.2px;padding:.25em .5em;position:absolute;text-transform:uppercase}.sm-card--tags__img,.sm-card--tags__no-img,.sm-card__img,.sm-card__no-img{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px;display:block;height:100%;left:0;-o-object-fit:cover;object-fit:cover;overflow:hidden;position:absolute;top:0;width:100%}.sm-card--tags__no-img,.sm-card__no-img{background-image:var(--gradient)}.sm-card--tags__body,.sm-card__body{align-items:flex-start;display:flex;flex-direction:column;height:100%;margin:1.25rem 0;padding:0 1.25rem}.sm-card--tags__date,.sm-card__date{color:#e8e9e9;color:var(--text1,#e8e9e9);display:flex;font-size:.75rem;font-weight:400;padding:1px;text-transform:uppercase}.sm-card--tags__title,.sm-card__title{color:#f5f5f5;color:var(--text,#f5f5f5);font-size:1.5rem;line-height:1.1;margin:.25rem 0 1.5rem;position:relative;transition:color .2s}.sm-card__excerpt{display:none}.sm-card--tags{overflow:hidden}.sm-card--tags__link:focus .sm-card--tags__img-container:after,.sm-card--tags__link:hover .sm-card--tags__img-container:after{background:transparent}.sm-card--tags__img-container:after{background:rgba(0,0,0,.5);border-radius:4px;content:"";height:100%;left:0;position:absolute;top:0;transition:background .2s;width:100%}.sm-card--tags__no-img{background:#80deea;background:var(--primary,#80deea)}.sm-card--tags__no-img:after{background:none}.sm-card--tags__img,.sm-card--tags__no-img{border-radius:4px}.sm-card--tags__body{align-items:stretch;flex-direction:row;height:auto;left:0;position:absolute;top:0;transition:box-shadow .2s;z-index:2}.sm-card--tags__title{background:#202020;background:var(--surface1,#202020);border-bottom-left-radius:4px;border-top-left-radius:4px;color:#f5f5f5;color:var(--text,#f5f5f5);font-size:2rem;margin:0;padding:.25rem 0 .25rem .5rem}@media(min-width:600px){.sm-card--tags__title{font-size:1.5rem}}.sm-card--tags__date{font-feature-settings:"tnum";background:#202020;background:var(--surface1,#202020);border-bottom-right-radius:4px;border-top-right-radius:4px;color:#ffab91;color:var(--secondary,#ffab91);font-family:Lato,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen,ubuntu,cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:2rem;font-variant-numeric:tabular-nums;line-height:1;padding:.375rem .5rem}@media(min-width:600px){.sm-card--tags__date{font-size:1.5rem}}.sm-card--tags:nth-child(2n) .sm-card--tags__no-img,.sm-card--tags:nth-child(2n) .sm-card__no-img{background:#8cdbbf;background:var(--three,#8cdbbf)}.sm-card--tags:nth-child(3n) .sm-card--tags__no-img,.sm-card--tags:nth-child(3n) .sm-card__no-img{background:#b4d195;background:var(--four,#b4d195)}.sm-card--tags:nth-child(4n) .sm-card--tags__no-img,.sm-card--tags:nth-child(4n) .sm-card__no-img{background:#e0c081;background:var(--five,#e0c081)}.sm-card--tags:nth-child(5n) .sm-card--tags__no-img,.sm-card--tags:nth-child(5n) .sm-card__no-img{background:#ffab91;background:var(--secondary,#ffab91)}hr{background:linear-gradient(to right,var(--surface2),var(--surface3),var(--surface4),var(--surface3),var(--surface2));border:none;border-radius:4px;height:.15rem;margin:2rem 0}.sm-form{display:flex;flex-direction:column;font-size:1rem}.sm-form__input,.sm-form textarea{background-color:#282828;background-color:var(--surface2,#282828);border:1px solid;border-radius:4px;color:#e8e9e9;color:var(--text1,#e8e9e9);font-family:Lato,-apple-system,blinkmacsystemfont,Segoe UI,roboto,oxygen,ubuntu,cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1rem;margin:.25rem 0;padding:.25rem;transition:all .2s;width:100%}.sm-form__input:focus,.sm-form textarea:focus{background-color:#303030;background-color:var(--surface3,#303030);border:1px solid #80deea;border:1px solid var(--primary);color:#f5f5f5;color:var(--text,#f5f5f5);outline:none;transition:all .2s}.sm-form textarea{flex-basis:auto;height:8rem}.sm-form .sm-button--color{margin:1rem 0 0}.sm-grid,.sm-grid-container,.sm-grid-container--footer,.sm-grid-container--tags{display:flex;flex-wrap:wrap}.sm-grid-container--footer .sm-card,.sm-grid-container--tags .sm-card,.sm-grid-container .sm-card,.sm-grid .sm-card{margin-bottom:1rem;min-width:14.375rem;width:50%}.sm-grid-container--footer .sm-card:first-child,.sm-grid-container--tags .sm-card:first-child,.sm-grid-container .sm-card:first-child,.sm-grid .sm-card:first-child{width:100%}@supports(gap:1.5rem){.sm-grid,.sm-grid-container,.sm-grid-container--footer,.sm-grid-container--tags{grid-gap:1.5rem;display:grid;gap:1.5rem}.sm-grid-container--footer .sm-card,.sm-grid-container--tags .sm-card,.sm-grid-container .sm-card,.sm-grid .sm-card{margin-bottom:0;min-width:0;min-width:auto;width:auto}.sm-grid-container--footer .sm-card:first-child,.sm-grid-container--tags .sm-card:first-child,.sm-grid-container .sm-card:first-child,.sm-grid .sm-card:first-child{width:auto}}@media(min-width:600px){.sm-card-1{grid-area:one}.sm-card-2{grid-area:two}.sm-card-3{grid-area:three}.sm-card-4{grid-area:four}.sm-card-5{grid-area:five}.sm-card-6{grid-area:six}.sm-card-7{grid-area:seven}.sm-card-8{grid-area:eight}.sm-card-9{grid-area:nine}.sm-card-10{grid-area:ten}}.sm-grid-container,.sm-grid-container--footer,.sm-grid-container--tags{align-content:stretch;grid-template-columns:repeat(auto-fit,minmax(292px,1fr));margin:1rem 0;max-width:100%}.sm-grid-container--footer{grid-gap:2rem;grid-template-columns:repeat(2,1fr)}@media(min-width:1024px){.sm-grid-container--footer{grid-gap:2rem;grid-template-columns:repeat(4,1fr)}}@media(min-width:600px){.sm-grid-container-1{grid-template-areas:"one";grid-template-columns:minmax(292px,1fr)}.sm-grid-container-1 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-1 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-1 .sm-card-1 .sm-card__img-container,.sm-grid-container-1 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-1 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-1 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-2{grid-template-areas:"one two";grid-template-columns:1fr 1fr}.sm-grid-container-3{grid-template-areas:"one one" "two three";grid-template-columns:1fr 1fr}.sm-grid-container-3 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-3 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-3 .sm-card-1 .sm-card__img-container,.sm-grid-container-3 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-3 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-3 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-4{grid-template-areas:"one two" "three four";grid-template-columns:1fr 1fr}.sm-grid-container-5{grid-template-areas:"one one" "two three" "four five";grid-template-columns:1fr 1fr}.sm-grid-container-6{grid-template-areas:"one one one two two two" "three three three four four four" "five five five six six six"}.sm-grid-container-6,.sm-grid-container-7{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-7{grid-template-areas:"one one one one one one" "two two two three three three" "four four four five five five" "six six six seven seven seven"}.sm-grid-container-7 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-7 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-7 .sm-card-1 .sm-card__img-container,.sm-grid-container-7 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-7 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-7 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-8{grid-template-areas:"one one one two two two" "three three three four four four" "five five five six six six" "seven seven seven eight eight eight"}.sm-grid-container-8,.sm-grid-container-9{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-9{grid-template-areas:"one one one one one one" "two two two three three three" "four four four five five five" "six six six seven seven seven" "eight eight eight nine nine nine"}.sm-grid-container-9 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-9 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-9 .sm-card-1 .sm-card__img-container,.sm-grid-container-9 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-9 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-9 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-10{grid-template-areas:"one one one two two two" "three three three four four four" "five five five six six six" "seven seven seven eight eight eight" "nine nine nine ten ten ten";grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}}@media(min-width:1024px){.sm-grid-container-5{grid-template-areas:"one one one two two two" "three three four four five five"}.sm-grid-container-5,.sm-grid-container-6{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-6{grid-template-areas:"one one one one one one" "two two two three three three" "four four five five six six"}.sm-grid-container-6 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-6 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-6 .sm-card-1 .sm-card__img-container,.sm-grid-container-6 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-6 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-6 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-7{grid-template-areas:"one one one one one one" "two two three three four four" "five five six six seven seven";grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-7 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-7 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-7 .sm-card-1 .sm-card__img-container,.sm-grid-container-7 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-7 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-7 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-8{grid-template-areas:"one one one two two two" "three three four four five five" "six six seven seven eight eight"}.sm-grid-container-8,.sm-grid-container-9{grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-9{grid-template-areas:"one one one one one one" "two two two three three three" "four four five five six six" "seven seven eight eight nine nine"}.sm-grid-container-9 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-9 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-9 .sm-card-1 .sm-card__img-container,.sm-grid-container-9 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-9 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-9 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}.sm-grid-container-10{grid-template-areas:"one one one one one one" "two two three three four four" "five five six six seven seven" "eight eight nine nine ten ten";grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr}.sm-grid-container-10 .sm-card-1 .sm-card__link{flex-direction:row}.sm-grid-container-10 .sm-card-1 .sm-card__img-container{height:100%;min-height:15rem;padding:0;width:50%}.sm-grid-container-10 .sm-card-1 .sm-card__img-container,.sm-grid-container-10 .sm-card-1 .sm-card__img-container>*{border-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.sm-grid-container-10 .sm-card-1 .sm-card__img{border-radius:inherit;overflow:hidden}.sm-grid-container-10 .sm-card-1 .sm-card__body{height:auto;width:calc(50% - 2.5rem)}}.sm-link{display:inline;position:relative;text-decoration:none}.sm-link:before{background-color:#80deea;background-color:var(--primary,#80deea);border-radius:4px;bottom:-1px;-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0);content:"";height:2px;left:0;position:absolute;width:100%;z-index:-1}.sm-link:before,.sm-link:hover:before{transition:-webkit-clip-path .2s;transition:clip-path .2s;transition:clip-path .2s,-webkit-clip-path .2s}.sm-link:hover:before{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}.sm-link.sm-nav-current:before{-webkit-clip-path:none;clip-path:none}.sm-content-wrap:before{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:linear-gradient(315deg,rgba(0,0,0,.5),rgba(0,0,0,.3));content:"";height:100%;left:0;opacity:0;top:0;transition:opacity .2s;width:100%;z-index:7}.sm-expanded-menu .sm-content-wrap:before,.sm-expanded-modal .sm-content-wrap:before{opacity:1;position:fixed}.sm-modal{background-color:#282828;background-color:var(--surface2,#282828);color:#f5f5f5;color:var(--text,#f5f5f5);height:100%;left:0;opacity:0;overflow:hidden;pointer-events:none;position:fixed;text-align:center;top:0;transition:opacity .2s ease-in;width:100%;z-index:10}@media(min-width:1024px){.sm-modal{border-radius:4px;box-shadow:-3px 0 10px rgba(0,0,0,.25);left:50%;margin-top:15vmin;max-height:75%;max-width:100vw;transform:translate(-50%);width:380px}}.sm-modal__container{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:space-between;padding:1rem}.sm-modal[aria-expanded=true]{opacity:1;overflow-y:auto;pointer-events:all}@media(min-width:1024px){.sm-modal[aria-expanded=true]{-webkit-animation:popup .25s ease-out;animation:popup .25s ease-out}}.sm-modal__header{display:flex;flex-direction:column;width:100%}.sm-modal__header .sm-navigation__ul{margin:2rem}.sm-modal__close-btn{align-self:flex-end;height:1.5rem;line-height:0;margin:0 0 1rem 1rem;width:1.5rem}.sm-modal__close-btn:hover svg{stroke:#ffab91;stroke:var(--secondary,#ffab91)}.sm-modal__close-btn svg{stroke-width:3;stroke:#e8e9e9;stroke:var(--text1,#e8e9e9);height:1.5rem;transition:all .2s;width:1.5rem}.sm-modal__title{margin:0}.sm-modal__footer{display:flex;flex-wrap:wrap;justify-content:center;width:100%}.sm-modal__footer a{height:2rem;margin:.5rem;width:2rem}.sm-modal__footer a:last-child{margin-right:0}.sm-modal__footer a svg{stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;width:100%}.sm-search__modal .sm-modal__container{justify-content:flex-start}.sm-search__modal .sm-modal__header{margin:0 auto;max-width:600px}.sm-search__modal .sm-small-header{text-align:left}.sm-search__button--loading{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;display:none}.loading .sm-search__button--loading{display:inline-block;transform:none}.loading .sm-search__button--content{display:none}.sm-search__input-container{display:flex}.sm-search__input-container button,.sm-search__input-container input{line-height:1;margin:0}.sm-search__input-container input{flex:2;margin-right:.25rem}.sm-search__input-container button{flex:1}@-webkit-keyframes rotate{to{transform:rotate(1turn)}}@keyframes rotate{to{transform:rotate(1turn)}}.sm-search-results{height:100%;margin:1rem auto 0;max-width:600px;width:100%}.sm-search-results__container{padding-bottom:1rem}.sm-search-results .sm-small-header{text-align:left}.sm-search-results__item{background-color:#303030;background-color:var(--surface3,#303030);border-radius:4px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);margin-top:1rem;text-align:left}.sm-search-results__item:first-child{margin-top:.25rem}.sm-search-results__link{border:3px solid transparent;border-radius:4px;display:block;height:100%;padding:1rem;transition:box-shadow .2s,color .2s;width:100%}.sm-search-results__link:hover{box-shadow:0 0 0 4px #80deea;box-shadow:0 0 0 4px var(--primary)}.sm-search-results__link:hover .sm-search-results__title{color:#80deea;color:var(--primary,#80deea)}.sm-search-results__date{background:none;color:#e8e9e9;color:var(--text1,#e8e9e9);font-size:.8rem}.sm-search-results__title{font-family:"DM Serif Text",georgia,serif;font-size:1.1rem;font-weight:400;line-height:1.2;margin:.25rem 0;transition:color .2s}.sm-search-results__excerpt{-webkit-box-orient:vertical;-webkit-line-clamp:3;display:-webkit-box;font-size:.9rem;text-overflow:ellipsis}.sm-post-share-bar,.sm-search-results__excerpt{color:#c7c7c8;color:var(--text2,#c7c7c8);overflow:hidden}.sm-post-share-bar{align-items:center;background-color:#303030;background-color:var(--surface3,#303030);border-bottom:3px solid var(--surface4);bottom:0;display:flex;flex-direction:row;flex-wrap:wrap;font-weight:700;justify-content:center;position:fixed;text-align:center;width:100%;z-index:5}@media(min-width:1024px){.sm-post-share-bar{display:none}}.sm-post-share-bar__link,.sm-post-share-bar__link--copy,.sm-post-share-bar__link--facebook,.sm-post-share-bar__link--linkedin,.sm-post-share-bar__link--twitter{border-radius:4px;height:2.5rem;padding:.5rem;transition:background-color .2s;width:2.5rem}.sm-post-share-bar__link--copy svg,.sm-post-share-bar__link--facebook svg,.sm-post-share-bar__link--linkedin svg,.sm-post-share-bar__link--twitter svg,.sm-post-share-bar__link svg{fill:transparent;stroke:#c7c7c8;stroke:var(--text2,#c7c7c8);height:100%;transition:stroke .2s;width:100%}@media(min-width:1024px){.sm-post-share-bar__link,.sm-post-share-bar__link--copy,.sm-post-share-bar__link--facebook,.sm-post-share-bar__link--linkedin,.sm-post-share-bar__link--twitter{height:1.8rem;padding:.36rem;width:1.8rem}}.sm-post-share-bar__link--twitter:active,.sm-post-share-bar__link--twitter:hover{background-color:#1da1f2}.sm-post-share-bar__link--twitter:active svg,.sm-post-share-bar__link--twitter:hover svg{stroke:#fff}.sm-post-share-bar__link--facebook:active,.sm-post-share-bar__link--facebook:hover{background-color:#1877f2}.sm-post-share-bar__link--facebook:active svg,.sm-post-share-bar__link--facebook:hover svg{stroke:#fff}.sm-post-share-bar__link--linkedin:active,.sm-post-share-bar__link--linkedin:hover{background-color:#0077b5}.sm-post-share-bar__link--linkedin:active svg,.sm-post-share-bar__link--linkedin:hover svg{stroke:#fff}.sm-post-share-bar__link--copy:active,.sm-post-share-bar__link--copy:hover{background-color:#80deea;background-color:var(--primary,#80deea)}.sm-post-share-bar__link--copy:active svg,.sm-post-share-bar__link--copy:hover svg{stroke:#fff}:root[color-mode=dark] .sm-post-share-bar__link--copy:active svg,:root[color-mode=dark] .sm-post-share-bar__link--copy:hover svg{stroke:#000}.sm-skip-to-content{left:50%;opacity:0;position:fixed;top:0;transform:translate3d(-50%,-125%,0);transition:background-color .2s,transform .25s ease-out,opacity .25s;z-index:15}.sm-skip-to-content:focus{opacity:1;transform:translate3d(-50%,.5rem,0);transition:transform .25s ease-in,opacity .25s}.sm-small-header,label{color:#a5a5a7;color:var(--text3,#a5a5a7);font-size:.8rem;font-weight:700;margin-top:1rem;text-transform:uppercase}.academia svg{fill:currentColor;transition:all .2s}.academia svg:focus,.academia svg:hover{fill:#80deea;fill:var(--primary,#80deea)}.facebook{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.facebook:hover{background-color:#1877f2}.facebook:hover svg{stroke:#fff}.facebook svg{fill:none;stroke:currentColor;transition:stroke .2s}.github{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.github:hover{background-color:#4078c0}.github:hover svg{stroke:#fff}.github svg{fill:none;stroke:currentColor;transition:stroke .2s}.gitlab{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.gitlab:hover{background-color:#fca326}.gitlab:hover svg{stroke:#fff}.gitlab svg{fill:none;stroke:currentColor;transition:stroke .2s}.instagram{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.instagram:hover{background-color:#c13584}.instagram:hover svg{stroke:#fff}.instagram svg{fill:none;stroke:currentColor;transition:stroke .2s}.linkedin{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.linkedin:hover{background-color:#0077b5}.linkedin:hover svg{stroke:#fff}.linkedin svg{fill:none;stroke:currentColor;transition:stroke .2s}.rss{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.rss:hover{background-color:#f26522}.rss:hover svg{stroke:#fff}.rss svg{fill:none;stroke:currentColor;transition:stroke .2s}.twitch{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.twitch:hover{background-color:#6441a5}.twitch:hover svg{stroke:#fff}.twitch svg{fill:none;stroke:currentColor;transition:stroke .2s}.twitter{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.twitter:hover{background-color:#1da1f2}.twitter:hover svg{stroke:#fff}.twitter svg{fill:none;stroke:currentColor;transition:stroke .2s}.map svg,.website svg{fill:transparent;stroke:currentColor;transition:all .2s}.map svg:focus,.map svg:hover,.website svg:focus,.website svg:hover{stroke:#80deea;stroke:var(--primary,#80deea)}.website{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.website:hover{background-color:#80deea;background-color:var(--primary,#80deea)}.website:hover svg{stroke:#0a0a0a;stroke:var(--textInverse,#0a0a0a)}.website svg{fill:none;stroke:currentColor;transition:stroke .2s}.youtube{border-radius:4px;height:1.5rem;padding:.25rem;transition:background-color .2s;width:1.5rem}.youtube:hover{background-color:red}.youtube:hover svg{stroke:#fff}.youtube svg{fill:none;stroke:currentColor;transition:stroke .2s}.sm-tag{color:#c7c7c8;color:var(--text2,#c7c7c8);display:inline-block;font-size:.8rem;letter-spacing:.2px;text-transform:uppercase;transition:color .2s}.sm-tag:before{content:"#"}.sm-tag:not(.sm-card .sm-tag):hover{color:#f5f5f5;color:var(--text,#f5f5f5)}.sm-card .sm-tag{margin-top:auto}.sm-post__tag-bar .sm-tag:not(:last-child){margin-right:.5rem}.sm-main,.sm-main--index{overflow-x:hidden;width:100%}.sm-main--index{margin-top:3.25rem}@media(min-width:1024px){.sm-main--index{margin-top:5.5rem}}.sm-main__outer-container{padding:1rem;position:relative;width:100%}@media(min-width:600px)and (max-width:1023px){.sm-main__outer-container{padding:1rem 3rem 2rem}}@media(min-width:1024px){.sm-main__outer-container{padding:1rem 4rem 2rem}}.sm-main__inner-container{margin:0 auto 1rem;max-width:1024px}.sm-main__header{display:inline;margin:0}.sm-main__read-more{color:#f5f5f5;color:var(--text,#f5f5f5);display:inline-block;transition:color .2s}.sm-main__read-more h2{margin:0}.sm-main__read-more:hover{color:#ffab91;color:var(--secondary,#ffab91)}.sm-hero{background-color:#202020;background-color:var(--surface1,#202020);background-position:50%;background-size:cover;height:27.5rem;margin-bottom:2rem;margin-top:3.25rem;overflow:hidden;position:relative;width:100%}@media(min-width:1024px){.sm-hero{margin-top:5.5rem}}@media(min-height:60rem)and (min-width:1280px){.sm-hero{height:37.5rem}}.sm-hero:before{background:radial-gradient(rgba(0,0,0,.5),rgba(0,0,0,.75));content:"";height:100%;left:0;position:absolute;top:0;width:100%}.sm-hero__text-container{position:absolute;top:50%;transform:translateY(-50%);width:100%}.sm-hero__site-title{color:#fff;line-height:1.1;margin:0 0 .5rem}.sm-hero__site-description{color:#eee;font-size:1.25rem;line-height:1.2;margin:0}.sm-author__header{margin:0 auto;max-width:1024px}.sm-author__img-container{align-items:center;border-radius:50%;display:flex;flex-shrink:0;justify-content:center;margin-bottom:2rem;position:relative}@media(min-width:600px){.sm-author__img-container{margin-bottom:0}}.sm-author__img-container:before{background:linear-gradient(45deg,#80deea,#ffab91);background:var(--gradient);border-radius:50%;content:"";height:100%;left:0;position:absolute;top:0;width:100%}.sm-author__img,.sm-author__no-img{border-radius:50%;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);height:9rem;margin:.25rem;position:relative;width:9rem;z-index:1}.sm-author__no-img{background:linear-gradient(45deg,#80deea,#ffab91);background:var(--gradient);overflow:hidden}.sm-author__no-img svg{fill:transparent;color:#0a0a0a;color:var(--textInverse,#0a0a0a);display:block;height:90%;margin:0 auto;width:90%}@media(min-width:600px){.sm-author__text{margin-left:4rem}}.sm-author__name{font-family:"DM Serif Text",georgia,serif;font-weight:400;margin:0}.sm-author__location svg:hover{stroke:currentColor}.sm-author__meta{align-items:center;display:flex}.sm-author__meta a{line-height:1;margin-right:.5rem}.sm-author__meta a:last-child{margin-right:0}.sm-author__meta svg{height:1rem;transition:all .2s;width:1rem}.sm-author__location{align-items:center;display:flex}.sm-author__location p{margin-left:.25rem}.sm-author__location svg{height:1rem;width:1rem}.sm-main--error__heading{font-family:"DM Serif Text",georgia,serif;font-size:4rem;font-weight:400;margin-bottom:0;position:relative;text-align:center}.sm-main--error__text{color:#e8e9e9;color:var(--text1,#e8e9e9);font-size:1.5rem;text-align:center} -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2Jhc2UvX3Jlc2V0LnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9zdHlsZS5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvdGhlbWVzL19zbV90aGVtZS5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvYmFzZS9fZGVmYXVsdC5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvYWJzdHJhY3RzL19taXhpbnMuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2Jhc2UvX2ZvbnRzLnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9iYXNlL190eXBvZ3JhcGh5LnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9hYnN0cmFjdHMvX3ZhcmlhYmxlcy5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvYmFzZS9fYW5pbWF0aW9ucy5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvbGF5b3V0L19jb250YWluZXIuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2xheW91dC9fZm9vdGVyLnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9sYXlvdXQvX21lbnUuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2xheW91dC9fbmF2YmFyLnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9sYXlvdXQvX25hdmlnYXRpb24uc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2xheW91dC9fcGFnaW5hdGlvbi5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fYnV0dG9ucy5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fY2FyZC5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fZGl2aWRlci5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fZm9ybS5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fZ3JpZC5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fbGluay5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fbW9kYWwuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2NvbXBvbmVudHMvX3NlYXJjaC5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fc2hhcmUuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2NvbXBvbmVudHMvX3NraXAuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL2NvbXBvbmVudHMvX3NtYWxsLWhlYWRlci5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvY29tcG9uZW50cy9fc3ZnLnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9jb21wb25lbnRzL190YWcuc2NzcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9zY3NzL3BhZ2VzL19tYWluLnNjc3MiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9wYWdlcy9faGVyby5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvcGFnZXMvX2F1dGhvci5zY3NzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL3Njc3MvcGFnZXMvX2Vycm9yLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBR0Usc0JBRUEsU0FEQSxTQ0VGLENERUEsT0FFRSxnQkFDQSxZQUZBLGNDR0YsQ0NUQSx3QkFDRSxlQUNBLHNCQUNBLGdCQUNBLGdCQUNBLGdCQUNBLGdCQUNBLGtCQUNBLG1CQUNBLG1CQUNBLG1CQUNBLGdCQUNBLGtCQUNBLG9CQUNBLGdCQUNBLGVBQ0EsZUFDQSxrQkFDQSxnQkFDQSxzQkFDQSxpRkFRQSx1RkRtQkYsQ0NSQSx1QkFDRSxlQUNBLHNCQUNBLGdCQUNBLGdCQUNBLGdCQUNBLGdCQUNBLGtCQUNBLG1CQUNBLG1CQUNBLG1CQUNBLG1CQUNBLGtCQUNBLG9CQUNBLGdCQUNBLGVBQ0EsZUFDQSxrQkFDQSxnQkFDQSxzQkFDQSxpRkFRQSx1RkRrQkYsQ0UvRUEsS0NDSSwwR0RFRixzQkZvRkYsQ0VqRkEsT0FDRSxlRm9GRixDRWpGQSxHQUNFLGlCRm9GRixDRTlFQSxNQUVFLG9CRmlGRixDRTlFQSxlQUpFLGtCRnNGRixDRTlFQSxpQkFFRSx5QkFEQSxVRmtGRixDRW5GQSxZQUVFLHlCQURBLFVGa0ZGLENFOUVBLFFDd0NJLG9CQVBGLG1CSG1ERixDR2pERSwwQkRuQ0YsUUNvQ0ksa0JBT0UsbUJBUEYsa0JIb0RGLENBQ0YsQ0VwRkEsT0NuQ0kseUREdUNGLG1CQUZBLHFCQURBLGlCRnFHRixDRS9GQSx1QkFFRSxZRmtHRixDRS9GQSxtQkFDRSxZQUNBLFlGa0dGLENJN0pBLEtBU0Usa0NBUkEsZUFDQSwwRUFLQSxnQkFDQSxlSjZKRixDS2hLQSxrQkFTRSxvQ0FGQSx5Q0NpQ00sQ0QvQk4sd0NBREEsZ0JBRUEsZ0JBSkEscUJMdUtGLENLaEtBLEdBRUUsbUJBREEsWUxvS0YsQ0toS0EsR0FDRSxrQkxtS0YsQ0toS0EsR0FDRSxrQkxtS0YsQ0toS0EsR0FDRSxpQkxtS0YsQ0toS0EsR0FDRSxnQkxtS0YsQ0toS0EsR0FDRSxnQkxtS0YsQ0toS0EscUJBRUUsaUJMbUtGLENPaE5BLHlCQUNFLEdBQ0UsVUFDQSx3Q1BtTkYsQ09qTkEsSUFDRSxTUG1ORixDT2pOQSxHQUNFLGtDUG1ORixDQUNGLENPN05BLGlCQUNFLEdBQ0UsVUFDQSx3Q1BtTkYsQ09qTkEsSUFDRSxTUG1ORixDT2pOQSxHQUNFLGtDUG1ORixDQUNGLENPaE5BLDRCQUNFLEdBRUUsVUFEQSxTUG1ORixDT2hOQSxHQUVFLFVBREEsUVBtTkYsQ0FDRixDTzFOQSxvQkFDRSxHQUVFLFVBREEsU1BtTkYsQ09oTkEsR0FFRSxVQURBLFFQbU5GLENBQ0YsQ08vTUEsNkJBQ0UsR0FFRSxVQURBLFFQa05GLENPL01BLEdBRUUsVUFEQSxTUGtORixDQUNGLENPek5BLHFCQUNFLEdBRUUsVUFEQSxRUGtORixDTy9NQSxHQUVFLFVBREEsU1BrTkYsQ0FDRixDTzlNQSx3QkFDRSxHQUNFLHFEUGdORixDTzlNQSxJQUNFLHlEUGdORixDTzlNQSxJQUNFLHlEUGdORixDTzlNQSxJQUNFLHlEUGdORixDTzlNQSxJQUNFLHlEUGdORixDTzlNQSxJQUNFLHlEUGdORixDTzlNQSxJQUNFLHlEUGdORixDQUNGLENPck9BLGdCQUNFLEdBQ0UscURQZ05GLENPOU1BLElBQ0UseURQZ05GLENPOU1BLElBQ0UseURQZ05GLENPOU1BLElBQ0UseURQZ05GLENPOU1BLElBQ0UseURQZ05GLENPOU1BLElBQ0UseURQZ05GLENPOU1BLElBQ0UseURQZ05GLENBQ0YsQ1FsUUEsZ0RBR0UsYUFGQSxrQkFDQSxVUnFRRixDUWxRRSx5QkFMRixnREFNSSxzQlJxUUYsQ0FDRixDUW5RRSwwQkFURixnREFVSSxzQlJzUUYsQ0FDRixDUXBRRSw0QkxURSxpRUtxQkEsbUJMckJBLHlDS2tCQSxnQkFQQSxpQkFDQSxtQlIyUUosQ1F6UUksMEJBTEYsNEJBTUksbUJSNFFKLENBQ0YsQ1FuUUEsc0dBRUUsbUJBREEsZ0JSdVFGLENRcFFFLDBCQUdFLFlBQ0EsZ0JBRkEsaUJSdVFKLENROVBFLDRCQUlFLG1CQUZBLGFBQ0Esc0JBRUEsdUJBRUEsZ0JBREEsbUJSZ1FKLENROVBJLHlCQVJGLDRCQVNJLGtCUmlRSixDQUNGLENTdFRFLGdEQUNFLGFBQ0EscUJUeVRKLENTdFRJLDRCTkZBLHdDSDRUSixDU3RUTSx5Q0FDRSxvQlR3VFIsQ1NyVE0sdUNBQ0UsYVR1VFIsQ1N0VFEscURBQ0UsYVR3VFYsQ1NsVEUsaUJBQ0Usb0JUb1RKLENTalRFLHdCTnZCRSx5Q013QkEsb0JUcVRKLENTalRFLGlCTjVCRSx5Q004QkEsaUJBREEscUJBRUEsd0JUcVRKLENTalRFLGtCTm5DRSx5Q01zQ0EsbUJBREEsZ0JORkYscUJNQ0UsVVR3VEosQ1NoVEksd0JONUNBLDBDSGdXSixDUy9TRSwwQkFFRSxlQURBLG1CVGtUSixDUzdTRSxtQkFFRSxjQURBLGFBRUEsNENBVUEsaUJOakNGLGtCSHdVRixDUy9TSSwyQkFMRixtQkFNSSxhQUNBLGNUa1RKLENTalRJLHFCQUNFLFlUbVROLENBQ0YsQ1M3U0kscUJBRUUsaUJIdkJHLENHc0JILFFUZ1ROLENTNVNJLHVCTjVFQSxrRk04RUUsWUFEQSxVVG1UTixDUzVTRSxxQkFFRSxtQk50RkEseUNNcUZBLFlUaVRKLENTN1NJLHVCQUNFLFNBQ0EseUJOeERKLGtCSHdXRixDUzVTSSx5Qk4vRkEsMkNNc0dFLGlCQUxBLHNCQURBLGNBR0EsZ0JBQ0EsMkJOakVKLG1CTStESSxjVG9UTixDUzFTTSwyRE41R0YsNkNNOEdJLFlUNlNSLENTM1NNLCtETmhIRiw4Q0grWkosQ1N6U0UsK0JOdEhFLHlDTXdIQSxnQkFEQSxjQUdBLGlCVDRTSixDVTNhRSxlUHdDQSxvQkh1WUYsQ1U3YUkscUJQR0EsMkNPRkUsWVZpYk4sQ1duYkEsV1JJSSxrRVFhRixpRUwyQ1csQ0t4RFgsY0FZQSxnQkFWQSxlQUxBLGVBQ0EsTVJxQ0EsbUJRbENBLFdBRkEsU1g4YkYsQ1d6YkUseUJBUkYsV0FTSSxjWDRiRixDQUNGLENXMWJFLDBCQVpGLFdBYUksY1g2YkYsQ0FDRixDV3RiRSxtQ0FHRSxjQURBLGdCWHdiSixDV3BiRSxnQlJ2QkUsNEVRd0JBLGFBQ0EsY1h5YkosQ0d4YUUsMEJRbkJBLGdCQVFJLG1CQURBLGFBR0EsZ0JBREEsNkJYeWJKLENBQ0YsQ1dqYkksNkNBRUUsbUJBREEsWVh3Yk4sQ1dyYk0sOEJBQ0UsY1h1YlIsQ1dsYkUsOENSbkRFLG1FUTBEQSxpQkxSSyxDSGxETCwrQ1FzREEsZ0JBR0Esb0JBRkEsY0FGQSxpQkFEQSxlQUlBLHdCWDBiSixDV3BiSSwwQkFHRSxnQkFEQSxrQlhzYk4sQ1dqYkUscUJSckVFLHlDUXNFQSxnQkFDQSxjUnBDRixvQkgwZEYsQ1dsYkksMkJSM0VBLHVDSGlnQkosQ1doYkUsbUJBRUUsbUJBREEsYUFFQSxjWGtiSixDV2hiSSwyQkFDRSxhQUVBLGNBREEsaUJBRUEseUJYa2JOLENHbGVFLDBCUTRDRSwyQkFPSSxhWG1iTixDQUNGLENXL2FJLGtDQUNFLGdCWGliTixDVzlhSSwwQkFDRSxhQUNBLGdCWGdiTixDRzllRSwwQlE0REUsMEJBTUksbUJBREEsWVhrYk4sQ0FDRixDVy9hTSxrQ0FFRSxjQURBLGlCWGtiUixDR3hmRSwwQlFxRUksa0NBSUksWVhtYlIsQ0FDRixDVzlhRSx5QkFFRSxtQkFEQSxhQUVBLHlDTHpGSSxDSzBGSixrQkFDQSxnQkFDQSxhWGdiSixDVzlhSSw2QkFFRSxlQUNBLG9CQUZBLGFYa2JOLENXM2FFLHNDUnpJRSx5Q1E0SUEsNkhMNUdHLENLNkdILGdCQUNBLGNBSEEsbUJSeEdGLG9CSDBoQkYsQ1cxYUUseUJSbkpFLHVDSGlrQkosQ1cxYUUsbUJSdkpFLGlFUTJKQSxpQkx6R0ssQ0swR0wsaUVMcEdTLENIeERULCtDUTBKQSxnQkFEQSxlQURBLGVSckhGLCtCSDBpQkYsQ1c3YUkseUJSaEtBLGtFSGlsQkosQ1c1YUUsMEJBRUUsY0FEQSxZWCthSixDVzVhSSw4QlJ6S0EsMkNRMktFLFlBREEsVVhpYk4sQ1c3YU0sb0NSOUtGLHlDSCtsQkosQ1cxYUUsbUJBQ0UsYUFFQSxhQUVBLGNBREEsa0JBRkEsV1grYUosQ1czYUksdUJBR0UsaUJSOUxGLDJDUTZMRSxZUjFKSixzQlF5SkksVVhrYk4sQ1c1YU0sNkJSbE1GLHlDSGtuQkosQ1cxYUUsOEJBRUUsYUFFQSxjQURBLGVBRkEsV1grYUosQ1cxYUksa0NBSUUsaUJSbE5GLDJDUWdORSxZQUNBLCtCQUZBLFVYaWJOLENXM2FNLHdDQUNFLGFSdE5KLHlDSHFvQkosQ1dqYUksZ0dBQ0UsWVh1YU4sQ1k5b0JFLGtDVEVFLHlDU0FBLGNBQ0EsbUJBRkEsWVpxcEJKLENZaHBCSSw2Q0FDRSxjWmtwQk4sQ1kvb0JJLHNDQUVFLFlBREEsVVprcEJOLENZN29CRSxtQkFDRSxvQlorb0JKLENZNW9CRSxtQkFFRSxrQkFEQSxjWitvQkosQ0d4bkJFLDBCU3hCQSxtQkFLSSxxQkFFQSxnQkFDQSxjQUZBLGlCWmlwQkosQ1k3b0JJLCtCQUNFLGFaK29CTixDWTVvQkksOEJBQ0UsY1o4b0JOLENBQ0YsQ2FyckJBLFlBRUUsbUJWR0UseUNVSkYsYUFFQSw2QmIwckJGLENhdnJCRSxjQUNFLGtCYnlyQkosQ2F4ckJJLHlCQUNFLGFiMHJCTixDYXhyQkksd0JBQ0UsY2IwckJOLENhdHJCRSxjVndCQSxvQkhpcUJGLENhdHJCSSxvQlZkQSwwQ0h3c0JKLENjaHRCQSxnREFFRSxtQkFXQSxzQlhMRSxrRVdNRixZQUNBLGlCUjJDTyxDUTFDUCxpRVJnRFcsQ1FyRFgsbUJBQ0EsZUFYQSxhQU9BLG9CQUNBLGVBTkEsdUJBT0Esb0JBSEEsaUJBREEsa0JBREEscUJYc0NBLGdDV3ZDQSxXZGt1QkYsQ2NsdEJFLGdTQUNFLGVkb3RCSixDY2p0QkUsa0VYaEJFLGtFV2lCQSxZZHF0QkosQ2NsdEJFLDJIQUNFLFlkb3RCSixDY2x0QkUscUVBQ0Usc0Nkb3RCSixDY2p0QkUsNERBS0UsaUJBQ0Esb0JBSkEsWUFDQSxvQkFDQSwyQlhJRixvQldQRSxVZHl0QkosQ2NodEJFLGtCWHJDRSxpRUFtQ0YsK0JIeXRCRixDY2p0QkksMENYM0NBLDhDSGt3QkosQ2N2dEJJLHdCWDNDQSxrRUhrd0JKLENjbHRCSSx5QkFDRSxzQ2RvdEJOLENjL3NCRSxtQkFFRSxZZGd0QkosQ2Uzd0JBLHdCWkdJLGtFWUlGLGlFVG9EVyxDU3ZEWCxlQUhBLGlCZnF4QkYsQ2U3d0JFLHVDQUhBLGlCVCtDTyxDU25EUCxhQUNBLHFCZjB4QkYsQ2VweEJFLGVBR0UsWUFFQSxtQ2Yrd0JKLENlN3dCSSwwQ0FFRSw2QkFDQSxzRmY4d0JOLENlM3dCUSxnS1puQkosMENIa3lCSixDZXh3QkUsc0RBTUUsMEJUa0JLLENTakJMLDJCVGlCSyxDU3JCTCxTQUVBLGdCQURBLGdCQUhBLGtCQUNBLFVmK3dCSixDZXZ3Qk0sOEpacENGLCtEWXNDSSxTWnRDSiw0Q1k0Q0ksa0JBSEEsZUFGQSxhQUlBLHFCQUhBLG1CQUhBLGtCQUtBLHdCZit3QlIsQ2V0d0JFLDBFQVVFLDBCVFhLLENTWUwsMkJUWkssQ1NNTCxjQUVBLFlBSEEsT0FJQSxxQ0FDQSxnQkFQQSxrQkFDQSxNQUdBLFVmNHdCSixDZXB3QkUsd0NaOUNBLGtDQUNBLHFRQU1BLCtEQURBLDRCQUVBLHdEQVRBLFdBRkEsWUFGQSxPQUdBLGdCQUxBLGtCQUNBLE1BZ0JBLG1CQURBLGtDQWJBLFVIczBCRixDZWh4QkUsb0NBR0UsdUJBRkEsYUFDQSxzQkFFQSxZQUVBLGlCQURBLGlCZm14QkosQ2Uvd0JFLG9DWjlFRSx5Q1krRUEsYUFFQSxpQkFDQSxnQkFGQSxZQUlBLHdCZmt4QkosQ2Uvd0JFLHNDWnZGRSx3Q1kwRkEsaUJBQ0EsZ0JBRkEsdUJBREEsa0JackRGLG9CSDQwQkYsQ2Uvd0JFLGtCQUNFLFlmaXhCSixDZTl3QkUsZUFFRSxlZit3QkosQ2V6d0JVLDhIQUNFLHNCZjJ3QlosQ2Vud0JNLG9DQU9FLDBCQUNBLGlCVDNFQyxDU3lFRCxXQURBLFlBRkEsT0FGQSxrQkFDQSxNWnBGTiwwQllzRk0sVWYwd0JSLENlN3ZCSSx1Qlp0SUEsb0RIdTRCSixDZTd2Qk0sNkJBQ0UsZWYrdkJSLENlM3ZCSSwyQ0FFRSxpQmY0dkJOLENlenZCSSxxQkFPRSxvQkFEQSxtQkFFQSxZQUpBLE9BRkEsa0JBQ0EsTVpwSEosMEJZc0hJLFNmOHZCTixDZXh2Qkksc0JaL0pBLHNEWXVLRSw2QlRySEcsQ1NvSEgsMEJUcEhHLENIbERMLHdDWW1LRSxlQURBLFNBREEsNkJmaXdCTixDZXp2Qk0seUJBVkYsc0JBV0ksZ0JmNHZCTixDQUNGLENlenZCSSxxQkFVRSw2Qlp4TEYsc0RZdUxFLDhCVHJJRyxDU29JSCwyQlRwSUcsQ0hsREwsNkNZbUxFLDZIVG5KQyxDU29KRCxlQUlBLGtDQUhBLGNBTEEscUJmb3dCTixDZTF2Qk0seUJBWkYscUJBYUksZ0JmNnZCTixDQUNGLENleHZCUSxrR1pqTUosa0RINjdCSixDZXJ2QlEsa0daeE1KLGlESGk4QkosQ2VsdkJRLGtHWi9NSixpREhxOEJKLENlL3VCUSxrR1p0Tkosc0RIeThCSixDZ0JqOUJBLEdBR0UscUhBUUEsWUFDQSxpQlY4Q08sQ1V6RFAsY0FDQSxhaEJ1OUJGLENpQnY5QkEsU0FDRSxhQUNBLHNCQUNBLGNqQjA5QkYsQ2lCeDlCRSxrQ2RDRSxrRWNNQSxpQkFDQSxpQlgyQ0ssQ0hsREwseUNjSUEsNkhYNEJHLENXM0JILGVBRkEsZ0JBREEsZWRpQ0YsbUJjbENFLFVqQnErQkosQ2lCMTlCSSw4Q2RaQSxrRWNlRSx5QkFDQSxnQ2RoQkYsd0NjaUJFLGFka0JKLGtCSDg4QkYsQ2lCMzlCRSxrQkFDRSxnQkFDQSxXakI2OUJKLENpQjE5QkUsMkJBQ0UsZWpCNDlCSixDa0JsK0JBLGdGQUVFLGFBQ0EsY2xCbytCRixDa0JuK0JFLG9IQUdFLG1CQURBLG9CQURBLFNsQnUrQkosQ2tCcCtCSSxvS0FDRSxVbEJzK0JOLENrQmwrQkUsdUJBYkYsZ0ZBZUksZ0JBREEsYUFDQSxVbEJxK0JGLENrQm4rQkUsb0hBR0UsZ0JBREEsMkJBREEsVWxCdStCSixDa0JwK0JJLG9LQUNFLFVsQnMrQk4sQ0FDRixDa0JqK0JBLHlCQUNFLFdBQ0UsYWxCbytCRixDa0JqK0JBLFdBQ0UsYWxCbytCRixDa0JqK0JBLFdBQ0UsZWxCbytCRixDa0JqK0JBLFdBQ0UsY2xCbytCRixDa0JqK0JBLFdBQ0UsY2xCbytCRixDa0JsK0JBLFdBQ0UsYWxCcStCRixDa0JuK0JBLFdBQ0UsZWxCcytCRixDa0JwK0JBLFdBQ0UsZWxCdStCRixDa0JyK0JBLFdBQ0UsY2xCdytCRixDa0J0K0JBLFlBQ0UsYWxCeStCRixDQUNGLENrQnIrQkEsdUVBRUUsc0JBQ0EseURBRUEsY0FEQSxjbEJ1K0JGLENrQmgrQkUsMkJBRUUsY0FDQSxtQ2xCaStCSixDa0IvOUJJLDBCQUxGLDJCQU1JLGNBQ0EsbUNsQmsrQkosQ0FDRixDa0I3OUJBLHlCQUNFLHFCQUVFLDBCQURBLHVDbEJpK0JGLENrQnRsQ0EsK0NBQ0Usa0JsQndsQ0YsQ2tCcmxDQSx3REFLRSxnQkFFQSw2QlowQ0ssQ1kzQ0wsMEJaMkNLLENZL0NMLFlBQ0EsaUJBQ0EsVUFIQSxTbEI2bENGLENrQnBsQ0EsOENBRUUsc0JBREEsZWxCdWxDRixDa0JubENBLCtDQUVFLFlBREEsd0JsQnNsQ0YsQ2tCNStCQSxxQkFFRSw4QkFEQSw2QmxCZy9CRixDa0I1K0JBLHFCQUVFLHlDQUNFLENBRkYsNkJsQmcvQkYsQ2tCcG5DQSwrQ0FDRSxrQmxCc25DRixDa0JubkNBLHdEQUtFLGdCQUVBLDZCWjBDSyxDWTNDTCwwQloyQ0ssQ1kvQ0wsWUFDQSxpQkFDQSxVQUhBLFNsQjJuQ0YsQ2tCbG5DQSw4Q0FFRSxzQkFEQSxlbEJxbkNGLENrQmpuQ0EsK0NBRUUsWUFEQSx3QmxCb25DRixDa0J6L0JBLHFCQUNFLDBDQUNFLENBRUYsNkJsQjAvQkYsQ2tCdi9CQSxxQkFDRSxxREFDRSxDQUdGLDZCbEJ1L0JGLENrQnAvQkEscUJBQ0UsNkdsQncvQkYsQ2tCai9CQSwwQ0FIRSw2Q2xCeS9CRixDa0J0L0JBLHFCQUVFLDZJbEJvL0JGLENrQjVwQ0EsK0NBQ0Usa0JsQjhwQ0YsQ2tCM3BDQSx3REFLRSxnQkFFQSw2QlowQ0ssQ1kzQ0wsMEJaMkNLLENZL0NMLFlBQ0EsaUJBQ0EsVUFIQSxTbEJtcUNGLENrQjFwQ0EsOENBRUUsc0JBREEsZWxCNnBDRixDa0J6cENBLCtDQUVFLFlBREEsd0JsQjRwQ0YsQ2tCNS9CQSxxQkFFRSxtSmxCKy9CRixDa0J4L0JBLDBDQVJFLDZDbEJxZ0NGLENrQjcvQkEscUJBQ0UsZ0xsQjQvQkYsQ2tCMXJDQSwrQ0FDRSxrQmxCNHJDRixDa0J6ckNBLHdEQUtFLGdCQUVBLDZCWjBDSyxDWTNDTCwwQloyQ0ssQ1kvQ0wsWUFDQSxpQkFDQSxVQUhBLFNsQmlzQ0YsQ2tCeHJDQSw4Q0FFRSxzQkFEQSxlbEIyckNGLENrQnZyQ0EsK0NBRUUsWUFEQSx3QmxCMHJDRixDa0JuZ0NBLHNCQUNFLGdMQUNFLENBS0YsNkNsQmlnQ0YsQ0FDRixDa0I3L0JBLDBCQUNFLHFCQUNFLCtFbEJnZ0NGLENrQjEvQkEsMENBSEUsNkNsQmtnQ0YsQ2tCLy9CQSxxQkFDRSwyR2xCOC9CRixDa0I5dENBLCtDQUNFLGtCbEJndUNGLENrQjd0Q0Esd0RBS0UsZ0JBRUEsNkJaMENLLENZM0NMLDBCWjJDSyxDWS9DTCxZQUNBLGlCQUNBLFVBSEEsU2xCcXVDRixDa0I1dENBLDhDQUVFLHNCQURBLGVsQit0Q0YsQ2tCM3RDQSwrQ0FFRSxZQURBLHdCbEI4dENGLENrQnRnQ0EscUJBRUUsNkdBQ0UsQ0FGRiw2Q2xCMGdDRixDa0J2dkNBLCtDQUNFLGtCbEJ5dkNGLENrQnR2Q0Esd0RBS0UsZ0JBRUEsNkJaMENLLENZM0NMLDBCWjJDSyxDWS9DTCxZQUNBLGlCQUNBLFVBSEEsU2xCOHZDRixDa0JydkNBLDhDQUVFLHNCQURBLGVsQnd2Q0YsQ2tCcHZDQSwrQ0FFRSxZQURBLHdCbEJ1dkNGLENrQmxoQ0EscUJBRUUsaUhsQnFoQ0YsQ2tCL2dDQSwwQ0FQRSw2Q2xCMmhDRixDa0JwaENBLHFCQUNFLCtJbEJtaENGLENrQnJ4Q0EsK0NBQ0Usa0JsQnV4Q0YsQ2tCcHhDQSx3REFLRSxnQkFFQSw2QlowQ0ssQ1kzQ0wsMEJaMkNLLENZL0NMLFlBQ0EsaUJBQ0EsVUFIQSxTbEI0eENGLENrQm54Q0EsOENBRUUsc0JBREEsZWxCc3hDRixDa0JseENBLCtDQUVFLFlBREEsd0JsQnF4Q0YsQ2tCM2hDQSxzQkFDRSw2SUFDRSxDQUlGLDZDbEIwaENGLENrQjl5Q0EsZ0RBQ0Usa0JsQmd6Q0YsQ2tCN3lDQSx5REFLRSxnQkFFQSw2QlowQ0ssQ1kzQ0wsMEJaMkNLLENZL0NMLFlBQ0EsaUJBQ0EsVUFIQSxTbEJxekNGLENrQjV5Q0EsK0NBRUUsc0JBREEsZWxCK3lDRixDa0IzeUNBLGdEQUVFLFlBREEsd0JsQjh5Q0YsQ0FDRixDbUI5eUNBLFNBdkJFLGVBREEsa0JBRUEsb0JuQnkwQ0YsQ21CdjBDRSxnQmhCRUUsaUVnQlFBLGlCYjBDSyxDYWxETCxZQUtBLGdFQUNBLFdBRkEsV0FIQSxPQUZBLGtCQUlBLFdBREEsVW5CaTFDSixDbUJ2MENFLHNDaEJ1QkEsd0dIb3pDRixDbUIzMENFLHNCQUNFLHlEbkIwMENKLENtQmwwQ0UsK0JBQ0UscUNuQm8wQ0osQ29CNzFDRSx3QkFjRSw0REFQQSxpRUFEQSxXQURBLFlBSEEsT0FVQSxVQVhBLE1BWUEsdUJBVEEsV0FEQSxTcEJ1MkNKLENvQnYxQ0kscUZBRUUsVUFEQSxjcEIwMUNOLENvQi8wQ0EsVWpCNUJJLDBHaUJrQ0YsWUFIQSxPQVFBLFVBSEEsZ0JBRUEsb0JBVEEsZUFRQSxrQkFQQSxNQVVBLCtCQVBBLFdBREEsVXBCNjFDRixDb0JqMUNFLDBCQWhCRixVQXNCSSxrQkFDQSx1Q0FOQSxTQUlBLGtCQURBLGVBREEsZ0JBS0EsMEJBTkEsV3BCMDFDRixDQUNGLENvQmwxQ0UscUJBR0UsbUJBRkEsYUFDQSxzQkFHQSxZQURBLDhCQUVBLFlwQm8xQ0osQ29CajFDRSw4QkFHRSxVQUZBLGdCQUNBLGtCcEJvMUNKLENvQmwxQ0ksMEJBSkYsOEJBS0ksbUVwQnExQ0osQ0FDRixDb0JsMUNFLGtCQUNFLGFBQ0Esc0JBQ0EsVXBCbzFDSixDb0JqMUNNLHFDQUNFLFdwQm0xQ1IsQ29COTBDRSxxQkFDRSxvQkFFQSxjQUVBLGNBREEscUJBRkEsWXBCbTFDSixDb0I5MENJLCtCakI1RkEsOENIODZDSixDb0I5MENJLHlCQUdFLGVqQm5HRiwyQ2lCa0dFLGNqQi9ESixtQmlCOERJLFlwQnExQ04sQ29CNzBDRSxpQkFDRSxRcEIrMENKLENvQjUwQ0Usa0JBQ0UsYUFDQSxlQUNBLHVCQUNBLFVwQjgwQ0osQ29CNTBDSSxvQkFFRSxZQUNBLGFBRkEsVXBCZzFDTixDb0I3MENNLCtCQUNFLGNwQiswQ1IsQ29CNzBDTSx3QmpCMUhGLDJDaUI0SEksWUFEQSxVcEJrMUNSLENxQjc4Q00sdUNBQ0UsMEJyQmc5Q1IsQ3FCOThDTSxvQ0FFRSxjQURBLGVyQmk5Q1IsQ3FCNzhDSSxtQ0FDRSxlckIrOENOLENxQjM4Q0ksNEJBRUUsZ0ZBREEsWXJCODhDTixDcUI1OENNLHFDQUNFLHFCQUNBLGNyQjg4Q1IsQ3FCMThDTSxxQ0FDRSxZckI0OENSLENxQnY4Q0UsNEJBQ0UsWXJCeThDSixDcUJ4OENJLHFFQUdFLGNBREEsUXJCMjhDTixDcUJ2OENJLGtDQUNFLE9BQ0EsbUJyQnk4Q04sQ3FCdDhDSSxtQ0FDRSxNckJ3OENOLENxQm44Q0EsMEJBQ0UsR0FDRSx1QnJCczhDRixDQUNGLENxQno4Q0Esa0JBQ0UsR0FDRSx1QnJCczhDRixDQUNGLENxQm44Q0EsbUJBR0UsWUFDQSxtQkFGQSxnQkFEQSxVckJ3OENGLENxQm44Q0UsOEJBQ0UsbUJyQnE4Q0osQ3FCbDhDRSxvQ0FDRSxlckJvOENKLENxQmo4Q0UseUJsQm5FRSxrRWtCc0VBLGlCZnBCSyxDZXFCTCxpRWZmUyxDZVlULGdCQUNBLGVyQnU4Q0osQ3FCbjhDSSxxQ0FDRSxpQnJCcThDTixDcUJqOENFLHlCQUtFLDZCQUNBLGlCZmxDSyxDZTZCTCxjQUVBLFlBQ0EsYUFHQSxvQ0FMQSxVckJ3OENKLENxQmo4Q0ksK0JBQ0UsNkJBQ0EsbUNyQm04Q04sQ3FCaDhDUSx5RGxCNUZKLDBDSGdpREosQ3FCNzdDRSx5QkFHRSxnQmxCdEdBLHlDa0JvR0EsZXJCazhDSixDcUI3N0NFLDBCQUVFLHlDZnhFSSxDZXlFSixpQkFDQSxnQkFDQSxnQkFKQSxnQmxCdkVGLG9CSDJnREYsQ3FCNTdDRSw0QkFFRSw0QkFHQSxxQkFKQSxvQkFHQSxnQkFFQSxzQnJCZzhDSixDc0I1akRBLCtDbkJJSSx5Q2tCcUhBLGVyQnU5Q0osQ3NCaGxEQSxtQkFPRSxtQm5CSEUsa0VtQldGLHdDQWJBLFNBRUEsYUFDQSxtQkFDQSxlQUtBLGdCQUhBLHVCQVBBLGVBWUEsa0JBSkEsV0FOQSxTdEI2a0RGLENzQi9qREUsMEJBakJGLG1CQWtCSSxZdEJra0RGLENBQ0YsQ3NCaGtERSxnS0FJRSxpQmhCNkJLLENnQi9CTCxjQUNBLGNuQmVGLGdDbUJqQkUsWXRCc2tESixDc0Joa0RJLG9MQUdFLGlCbkIzQkYsMkNtQjBCRSxZbkJTSixzQm1CVkksVXRCdWtETixDc0Joa0RJLDBCQWZGLGdLQWlCSSxjQUNBLGVBRkEsWXRCcWtESixDQUNGLENzQjdqREksaUZBRUUsd0J0QjhqRE4sQ3NCN2pETSx5RkFDRSxXdEIrakRSLENzQnZqREksbUZBRUUsd0J0QndqRE4sQ3NCdmpETSwyRkFDRSxXdEJ5akRSLENzQmpqREksbUZBRUUsd0J0QmtqRE4sQ3NCampETSwyRkFDRSxXdEJtakRSLENzQjVpREksMkVuQjdFQSxnRUg2bkRKLENzQjdpRE0sbUZBQ0UsV3RCK2lEUixDc0I5aURRLGlJQUNFLFd0QmdqRFYsQ3VCN29EQSxvQkFHRSxTQUVBLFVBSkEsZUFDQSxNQUtBLG9DQURBLHFFQUZBLFV2Qm1wREYsQ3VCOW9ERSwwQkFDRSxVQUVBLG9DQURBLDhDdkJpcERKLEN3QjFwREEsdUJyQlFJLHlDcUJMRixnQkFDQSxnQkFGQSxnQkFHQSx3QnhCK3BERixDeUI3b0RBLGNBQ0Usa0J0Qm1CQSxrQkg4bkRGLEN5Qi9vREUsd0N0QmxCRSx3Q0hxcURKLEN5QjdvREEsVUF4QkUsaUJuQmtETyxDbUJwRFAsY0FDQSxldEJvQ0EsZ0NzQnRDQSxZekJnckRGLEN5QjNxREUsZ0JBQ0Usd0J6QjZxREosQ3lCNXFESSxvQkFDRSxXekI4cUROLEN5QjNxREUsY0FDRSxVQUNBLG9CdEJ5QkYscUJIcXBERixDeUI1cERBLFFBNUJFLGlCbkJrRE8sQ21CcERQLGNBQ0EsZXRCb0NBLGdDc0J0Q0EsWXpCbXNERixDeUI5ckRFLGNBQ0Usd0J6QmdzREosQ3lCL3JESSxrQkFDRSxXekJpc0ROLEN5QjlyREUsWUFDRSxVQUNBLG9CdEJ5QkYscUJId3FERixDeUIzcURBLFFBaENFLGlCbkJrRE8sQ21CcERQLGNBQ0EsZXRCb0NBLGdDc0J0Q0EsWXpCc3RERixDeUJqdERFLGNBQ0Usd0J6Qm10REosQ3lCbHRESSxrQkFDRSxXekJvdEROLEN5Qmp0REUsWUFDRSxVQUNBLG9CdEJ5QkYscUJIMnJERixDeUIxckRBLFdBcENFLGlCbkJrRE8sQ21CcERQLGNBQ0EsZXRCb0NBLGdDc0J0Q0EsWXpCeXVERixDeUJwdURFLGlCQUNFLHdCekJzdURKLEN5QnJ1REkscUJBQ0UsV3pCdXVETixDeUJwdURFLGVBQ0UsVUFDQSxvQnRCeUJGLHFCSDhzREYsQ3lCenNEQSxVQXhDRSxpQm5Ca0RPLENtQnBEUCxjQUNBLGV0Qm9DQSxnQ3NCdENBLFl6QjR2REYsQ3lCdnZERSxnQkFDRSx3QnpCeXZESixDeUJ4dkRJLG9CQUNFLFd6QjB2RE4sQ3lCdnZERSxjQUNFLFVBQ0Esb0J0QnlCRixxQkhpdURGLEN5Qnh0REEsS0E1Q0UsaUJuQmtETyxDbUJwRFAsY0FDQSxldEJvQ0EsZ0NzQnRDQSxZekIrd0RGLEN5QjF3REUsV0FDRSx3QnpCNHdESixDeUIzd0RJLGVBQ0UsV3pCNndETixDeUIxd0RFLFNBQ0UsVUFDQSxvQnRCeUJGLHFCSG92REYsQ3lCdnVEQSxRQWhERSxpQm5Ca0RPLENtQnBEUCxjQUNBLGV0Qm9DQSxnQ3NCdENBLFl6Qmt5REYsQ3lCN3hERSxjQUNFLHdCekIreERKLEN5Qjl4REksa0JBQ0UsV3pCZ3lETixDeUI3eERFLFlBQ0UsVUFDQSxvQnRCeUJGLHFCSHV3REYsQ3lCdHZEQSxTQXBERSxpQm5Ca0RPLENtQnBEUCxjQUNBLGV0Qm9DQSxnQ3NCdENBLFl6QnF6REYsQ3lCaHpERSxlQUNFLHdCekJrekRKLEN5Qmp6REksbUJBQ0UsV3pCbXpETixDeUJoekRFLGFBQ0UsVUFDQSxvQnRCeUJGLHFCSDB4REYsQ3lCcndEQSxzQkFFRSxpQkFDQSxvQnRCeEJBLGtCSGl5REYsQ3lCdndERSxvRXRCN0RFLDRDSDAwREosQ3lCdndEQSxTQUlFLGlCbkJyQk8sQ21CbUJQLGNBQ0EsZXRCbkNBLGdDc0JpQ0EsWXpCOHdERixDeUJ6d0RFLGV0QnpFRSxnRUhzMURKLEN5QjN3REksbUJ0QjNFQSxnREgwMURKLEN5QjN3REUsYUFDRSxVQUNBLG9CdEI5Q0YscUJINHpERixDeUJ6d0RBLFNBdEZFLGlCbkJrRE8sQ21CcERQLGNBQ0EsZXRCb0NBLGdDc0J0Q0EsWXpCMDJERixDeUJyMkRFLGVBQ0Usb0J6QnUyREosQ3lCdDJESSxtQkFDRSxXekJ3MkROLEN5QnIyREUsYUFDRSxVQUNBLG9CdEJ5QkYscUJIKzBERixDMEJ6M0RBLFF2Qk9JLHlDdUJORixxQkFFQSxnQkFFQSxvQkFEQSx5QnZCc0NBLG9CSHkxREYsQzBCMzNERSxlQUNFLFcxQjYzREosQzBCMTNERSxvQ3ZCTEUsdUNIbTRESixDMEIxM0RFLGlCQUNFLGUxQjQzREosQzBCeDNESSwyQ0FDRSxrQjFCMDNETixDMkIvNERBLHlCQUVFLGtCQURBLFUzQm01REYsQzJCaDVERSxnQnhCaUVBLGtCSGsxREYsQ0doMURFLDBCd0JuRUEsZ0J4Qm9FRSxpQkhtMURGLENBQ0YsQzJCbjVERSwwQnhCbUZBLGFBRkEsa0JBQ0EsVUhzMERGLENHcjJERSxnRHdCbkRBLDBCeEJzRkUsc0JIczBERixDQUNGLENHdDNERSwwQndCdkNBLDBCeEIwRkUsc0JIdTBERixDQUNGLEMyQjk1REUsMEJ4QnlFQSxtQkFEQSxnQkgwMURGLEMyQjk1REUsaUJBQ0UsZUFDQSxRM0JnNkRKLEMyQjc1REUsb0J4QmhCRSx3Q3dCaUJBLHFCeEJrQkYsb0JIZzVERixDMkI5NURJLHVCQUNFLFEzQmc2RE4sQzJCNzVESSwwQnhCekJBLDRDSDA3REosQzRCajhEQSxTekJPSSxrRXlCQUYsd0JBQ0Esc0JBTEEsZUFFQSxtQnpCaUVBLG1CeUJoRUEsZ0JBTEEsa0JBQ0EsVTVCNDhERixDR3Q0REUsMEJ5QnhFRixTekJ5RUksaUJIeTRERixDQUNGLEM0Qng4REUsaURBWEYsU0FZSSxjNUIyOERGLENBQ0YsQzRCejhERSxnQkFPRSwyREFEQSxXQURBLFlBRkEsT0FGQSxrQkFDQSxNQUVBLFU1Qjg4REosQzRCeDhERSx5QkFDRSxrQkFDQSxRQUVBLDJCQURBLFU1QjI4REosQzRCdjhERSxxQkFHRSxXQURBLGdCQURBLGdCNUIyOERKLEM0QnQ4REUsMkJBSUUsV0FGQSxrQkFDQSxnQkFGQSxRNUIyOERKLEM2QmgvREUsbUJBRUUsY0FEQSxnQjdCby9ESixDNkJoL0RFLDBCQUlFLG1CQUdBLGtCQUxBLGFBQ0EsY0FFQSx1QkFDQSxtQkFMQSxpQjdCdy9ESixDRy84REUseUIwQjFDQSwwQkFVSSxlN0JtL0RKLENBQ0YsQzZCai9ESSxpQ0FPRSxrREFLQSwyQkFDQSxrQkFQQSxXQURBLFlBRkEsT0FGQSxrQkFDQSxNQUVBLFU3QncvRE4sQzZCMytERSxtQ0FNRSxrQkFDQSxpRXZCbUJTLEN1QnRCVCxXdkJlRyxDdUJkSCxjQUpBLGtCQUVBLFV2QmdCRyxDdUJqQkgsUzdCay9ESixDNkIxK0RFLG1CQUdFLGtEQUtBLDJCQU5BLGU3QjYrREosQzZCcitESSx1QkFLRSxpQjFCdkRGLCtDMEJtREUsY0FFQSxXQUNBLGNBRkEsUzdCNCtETixDR3QvREUseUIwQmtCQSxpQkFFSSxnQjdCcytESixDQUNGLEM2Qm4rREUsaUJBRUUseUN2QmpDSSxDdUJrQ0osZ0JBRkEsUTdCdStESixDNkJsK0RFLCtCQUNFLG1CN0JvK0RKLEM2QmorREUsaUJBRUUsbUJBREEsWTdCbytESixDNkJqK0RJLG1CQUVFLGNBREEsa0I3Qm8rRE4sQzZCaitETSw4QkFDRSxjN0JtK0RSLEM2Qi85REkscUJBRUUsWTFCeERKLG1CMEJ1REksVTdCbStETixDNkI1OURFLHFCQUVFLG1CQURBLFk3Qis5REosQzZCNTlESSx1QkFDRSxrQjdCODlETixDNkIzOURJLHlCQUVFLFlBREEsVTdCODlETixDOEI5a0VFLHlCQUdFLHlDeEJzQ0ksQ3dCckNKLGVBQ0EsZ0JBSEEsZ0JBREEsa0JBS0EsaUI5QmlsRUosQzhCOWtFRSxzQjNCSEUseUMyQklBLGlCQUNBLGlCOUJrbEVKLEMiLCJmaWxlIjoiYXBwLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIiosXG4qOmJlZm9yZSxcbio6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG59XG5cbmJ1dHRvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xufVxuIiwiKixcbio6YmVmb3JlLFxuKjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbn1cblxuYnV0dG9uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG59XG5cbjpyb290W2NvbG9yLW1vZGU9bGlnaHRdIHtcbiAgLS10ZXh0OiAjMGEwYTBhO1xuICAtLXRleHRJbnZlcnNlOiAjZjVmNWY1O1xuICAtLXRleHQxOiAjMTcxNzE3O1xuICAtLXRleHQyOiAjMzkzOTNhO1xuICAtLXRleHQzOiAjNWE1YTVjO1xuICAtLXRleHQ0OiAjOWVhMGEyO1xuICAtLXN1cmZhY2U6IGhzbCgwLCAwJSwgOTIlKTtcbiAgLS1zdXJmYWNlMTogaHNsKDAsIDAlLCA5NCUpO1xuICAtLXN1cmZhY2UyOiBoc2woMCwgMCUsIDk2JSk7XG4gIC0tc3VyZmFjZTM6IGhzbCgwLCAwJSwgOTglKTtcbiAgLS1zdXJmYWNlNDogI2ZmZmZmZjtcbiAgLS1wcmltYXJ5OiBoc2woMjE2LCA4NSUsIDM0JSk7XG4gIC0tc2Vjb25kYXJ5OiAjYTQwMDJlO1xuICAtLXRocmVlOiAjNjQzNzkxO1xuICAtLWZvdXI6ICM4YjFjNzY7XG4gIC0tZml2ZTogI2EwMDA1MztcbiAgLS1zdWNjZXNzOiAjNDhhMDBkO1xuICAtLWVycm9yOiAjYTQwMDAwO1xuICAtLWVycm9yLWhvdmVyOiBoc2woMCwgMTAwJSwgMTYlKTtcbiAgLS1ncmFkaWVudDogbGluZWFyLWdyYWRpZW50KFxuICAgIHRvIHJpZ2h0IHRvcCxcbiAgICAjMGQ0OGEwLFxuICAgICM2NDM3OTEsXG4gICAgIzhiMWM3NixcbiAgICAjYTAwMDUzLFxuICAgICNhNDAwMmVcbiAgKTtcbiAgLS1ncmFkaWVudC1yZXZlcnNlOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgdG8gbGVmdCB0b3AsXG4gICAgIzBkNDhhMCxcbiAgICAjNjQzNzkxLFxuICAgICM4YjFjNzYsXG4gICAgI2EwMDA1MyxcbiAgICAjYTQwMDJlXG4gICk7XG59XG5cbjpyb290W2NvbG9yLW1vZGU9ZGFya10ge1xuICAtLXRleHQ6ICNmNWY1ZjU7XG4gIC0tdGV4dEludmVyc2U6ICMwYTBhMGE7XG4gIC0tdGV4dDE6ICNlOGU5ZTk7XG4gIC0tdGV4dDI6ICNjNmM2Yzc7XG4gIC0tdGV4dDM6ICNhNWE1YTc7XG4gIC0tdGV4dDQ6ICM2MTYzNjU7XG4gIC0tc3VyZmFjZTogIzE4MTgxODtcbiAgLS1zdXJmYWNlMTogIzIwMjAyMDtcbiAgLS1zdXJmYWNlMjogIzI4MjgyODtcbiAgLS1zdXJmYWNlMzogIzMwMzAzMDtcbiAgLS1zdXJmYWNlNDogIzM4MzgzODtcbiAgLS1wcmltYXJ5OiAjODBkZWVhO1xuICAtLXNlY29uZGFyeTogI2ZmYWI5MTtcbiAgLS10aHJlZTogIzhjZGJiZjtcbiAgLS1mb3VyOiAjYjRkMTk1O1xuICAtLWZpdmU6ICNlMGMwODE7XG4gIC0tc3VjY2VzczogI2I0ZDE5NTtcbiAgLS1lcnJvcjogaHNsKDAsIDEwMCUsIDc4JSk7XG4gIC0tZXJyb3ItaG92ZXI6IGhzbCgwLCAxMDAlLCA2OCUpO1xuICAtLWdyYWRpZW50OiBsaW5lYXItZ3JhZGllbnQoXG4gICAgdG8gcmlnaHQgdG9wLFxuICAgICM4MGRlZWEsXG4gICAgIzhjZGJiZixcbiAgICAjYjRkMTk1LFxuICAgICNlMGMwODEsXG4gICAgI2ZmYWI5MVxuICApO1xuICAtLWdyYWRpZW50LXJldmVyc2U6IGxpbmVhci1ncmFkaWVudChcbiAgICB0byBsZWZ0IHRvcCxcbiAgICAjODBkZWVhLFxuICAgICM4Y2RiYmYsXG4gICAgI2I0ZDE5NSxcbiAgICAjZTBjMDgxLFxuICAgICNmZmFiOTFcbiAgKTtcbn1cblxuaHRtbCB7XG4gIGNvbG9yOiAjZjVmNWY1O1xuICBjb2xvcjogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMDIwMjA7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UxLCAjMjAyMDIwKTtcbiAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7XG59XG5cbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG59XG5cbmVtIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG46bGluayB7XG4gIGNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuOnZpc2l0ZWQge1xuICBjb2xvcjogY3VycmVudENvbG9yO1xufVxuXG46OnNlbGVjdGlvbiB7XG4gIGNvbG9yOiAjMTExO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBjMDgxO1xufVxuXG46dGFyZ2V0IHtcbiAgcGFkZGluZy10b3A6IDMuMjVyZW07XG4gIG1hcmdpbi10b3A6IDMuMjVyZW07XG4gIG1hcmdpbi10b3A6IC0zLjI1cmVtO1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICA6dGFyZ2V0IHtcbiAgICBwYWRkaW5nLXRvcDogNS41cmVtO1xuICB9XG59XG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIDp0YXJnZXQge1xuICAgIG1hcmdpbi10b3A6IDUuNXJlbTtcbiAgfVxufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICA6dGFyZ2V0IHtcbiAgICBtYXJnaW4tdG9wOiAtNS41cmVtO1xuICB9XG59XG5cbjpmb2N1cyB7XG4gIG91dGxpbmUtd2lkdGg6IDFweDtcbiAgb3V0bGluZS1zdHlsZTogZG90dGVkO1xuICBvdXRsaW5lLWNvbG9yOiAjYTVhNWE3O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS10ZXh0MywgI2E1YTVhNyk7XG4gIG91dGxpbmUtb2Zmc2V0OiAzcHg7XG59XG5cbmE6YWN0aXZlLFxuYnV0dG9uOmFjdGl2ZSB7XG4gIG91dGxpbmU6IG5vbmU7XG59XG5cbjo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuaHRtbCB7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgZm9udC1zaXplOiBjbGFtcCggMXJlbSwgMC45MDkwOTA5MDkwOTA5MDkxcmVtICsgMC40NTQ1NDU0NTQ1NDU0NTQ1M3Z3LCAxLjI1cmVtICk7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG59XG5cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gIG1hcmdpbjogM3JlbSAwIDEuMzhyZW07XG4gIGZvbnQtZmFtaWx5OiBcIkRNIFNlcmlmIFRleHRcIiwgZ2VvcmdpYSwgc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtdmFyaWFudC1saWdhdHVyZXM6IGNvbW1vbi1saWdhdHVyZXM7XG4gIGxpbmUtaGVpZ2h0OiAxLjI7XG59XG5cbmgxIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgZm9udC1zaXplOiAyLjQ4OHJlbTtcbn1cblxuaDIge1xuICBmb250LXNpemU6IDIuMDc0cmVtO1xufVxuXG5oMyB7XG4gIGZvbnQtc2l6ZTogMS43MjhyZW07XG59XG5cbmg0IHtcbiAgZm9udC1zaXplOiAxLjQ0cmVtO1xufVxuXG5oNSB7XG4gIGZvbnQtc2l6ZTogMS4ycmVtO1xufVxuXG5oNiB7XG4gIGZvbnQtc2l6ZTogMS4xcmVtO1xufVxuXG5zbWFsbCxcbi5zbS10ZXh0LXNtYWxsIHtcbiAgZm9udC1zaXplOiAwLjgzM3JlbTtcbn1cblxuQGtleWZyYW1lcyBwb3B1cCB7XG4gIDAlIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDIwcHgpIHNjYWxlKDAuOCk7XG4gIH1cbiAgNzUlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDApIHNjYWxlKDEpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIHNsaWRlLWluIHtcbiAgMCUge1xuICAgIHRvcDogLTEwMCU7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICB0b3A6IDFyZW07XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuQGtleWZyYW1lcyBzbGlkZS1vdXQge1xuICAwJSB7XG4gICAgdG9wOiAxcmVtO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgMTAwJSB7XG4gICAgdG9wOiAtMTAwJTtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG59XG5Aa2V5ZnJhbWVzIG1lc2gge1xuICAwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwLCAwIDEwMCUsIDUwJSAwLCA1MCUgMjUlLCA1MCUgMTAwJTtcbiAgfVxuICAxNSUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDElIDElLCAxJSAxMDElLCA1MSUgMSUsIDUxJSAyNiUsIDUxJSAxMDElO1xuICB9XG4gIDMwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMiUgMiUsIDIlIDEwMiUsIDUyJSAyJSwgNTIlIDI2JSwgNTIlIDEwMiU7XG4gIH1cbiAgNDUlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzJSAzJSwgMyUgMTAzJSwgNTMlIDMlLCA1MyUgMjclLCA1MyUgMTAzJTtcbiAgfVxuICA2MCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDQlIDQlLCA0JSAxMDQlLCA1NCUgNCUsIDU0JSAyOCUsIDU0JSAxMDQlO1xuICB9XG4gIDc1JSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNSUgNSUsIDUlIDEwNSUsIDU1JSA1JSwgNTUlIDI5JSwgNTUlIDEwNSU7XG4gIH1cbiAgOTAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA2JSA2JSwgNiUgMTA2JSwgNTYlIDYlLCA1NiUgMzAlLCA1NiUgMTA2JTtcbiAgfVxufVxuLnNtLW91dGVyLWNvbnRhaW5lciwgLnNtLW91dGVyLWNvbnRhaW5lci0tZm9vdGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMXJlbTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiA2MDBweCkge1xuICAuc20tb3V0ZXItY29udGFpbmVyLCAuc20tb3V0ZXItY29udGFpbmVyLS1mb290ZXIge1xuICAgIHBhZGRpbmc6IDFyZW0gM3JlbSAycmVtO1xuICB9XG59XG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIC5zbS1vdXRlci1jb250YWluZXIsIC5zbS1vdXRlci1jb250YWluZXItLWZvb3RlciB7XG4gICAgcGFkZGluZzogMXJlbSA0cmVtIDJyZW07XG4gIH1cbn1cbi5zbS1vdXRlci1jb250YWluZXItLWZvb3RlciB7XG4gIG1pbi1oZWlnaHQ6IDI1MHB4O1xuICBwYWRkaW5nLWJvdHRvbTogM3JlbTtcbiAgZm9udC1zaXplOiAwLjlyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMxODE4MTg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UsICMxODE4MTgpO1xuICBjb2xvcjogI2U4ZTllOTtcbiAgY29sb3I6IHZhcigtLXRleHQxLCAjZThlOWU5KTtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW91dGVyLWNvbnRhaW5lci0tZm9vdGVyIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbiAgfVxufVxuXG4uc20taW5uZXItY29udGFpbmVyLCAuc20taW5uZXItY29udGFpbmVyLS1hdXRob3IsIC5zbS1pbm5lci1jb250YWluZXItLWZvb3RlciwgLnNtLWlubmVyLWNvbnRhaW5lci0taGVybyB7XG4gIG1heC13aWR0aDogMTAyNHB4O1xuICBtYXJnaW46IDAgYXV0byAxcmVtO1xufVxuLnNtLWlubmVyLWNvbnRhaW5lci0taGVybyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuLnNtLWlubmVyLWNvbnRhaW5lci0tYXV0aG9yIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmctYm90dG9tOiAxcmVtO1xuICBtYXJnaW4tdG9wOiAxcmVtO1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDYwMHB4KSB7XG4gIC5zbS1pbm5lci1jb250YWluZXItLWF1dGhvciB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxufVxuXG4uc20tZm9vdGVyX19zZWN0aW9uLCAuc20tZm9vdGVyX19zZWN0aW9uLS1sYXRlc3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuLnNtLWZvb3Rlcl9fc2VjdGlvbi0tbGF0ZXN0IHtcbiAgY29sb3I6ICNlOGU5ZTk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MSwgI2U4ZTllOSk7XG59XG4uc20tZm9vdGVyX19zZWN0aW9uLS1sYXRlc3Q6bnRoLWNoaWxkKDMpIHtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbn1cbi5zbS1mb290ZXJfX3NlY3Rpb24tLWxhdGVzdDpsYXN0LWNoaWxkIHtcbiAgcGFkZGluZy10b3A6IDA7XG59XG4uc20tZm9vdGVyX19zZWN0aW9uLS1sYXRlc3Q6bGFzdC1jaGlsZCA+IHA6Zmlyc3QtY2hpbGQge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi5zbS1mb290ZXJfX2xpbmsge1xuICBtYXJnaW4tYm90dG9tOiAwLjE1cmVtO1xufVxuLnNtLWZvb3Rlcl9fZGVzY3JpcHRpb24ge1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xuICBjb2xvcjogI2M3YzdjODtcbiAgY29sb3I6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbn1cbi5zbS1mb290ZXJfX2RhdGUge1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiAjYTVhNWE3O1xuICBjb2xvcjogdmFyKC0tdGV4dDMsICNhNWE1YTcpO1xufVxuLnNtLWZvb3Rlcl9fdGl0bGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMnJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgY29sb3I6ICNjN2M3Yzg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MiwgI2M3YzdjOCk7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7XG59XG4uc20tZm9vdGVyX190aXRsZTpob3ZlciB7XG4gIGNvbG9yOiAjODBkZWVhO1xuICBjb2xvcjogdmFyKC0tcHJpbWFyeSwgIzgwZGVlYSk7XG59XG4uc20tZm9vdGVyX19oZWFkZXItLXNlcmlmIHtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xuICBmb250LXNpemU6IDExNSU7XG59XG4uc20tZm9vdGVyX19zb2NpYWwge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWdhcDogMXJlbTtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIDFyZW0pO1xuICBtYXJnaW4tdG9wOiAwLjVyZW07XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzO1xufVxuQHN1cHBvcnRzIG5vdCAoZ2FwOiAxLjVyZW0pIHtcbiAgLnNtLWZvb3Rlcl9fc29jaWFsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuICAuc20tZm9vdGVyX19zb2NpYWwgYSB7XG4gICAgbWFyZ2luOiAwLjVyZW07XG4gIH1cbn1cbi5zbS1mb290ZXJfX3NvY2lhbCBhIHtcbiAgbWFyZ2luOiAwO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4uc20tZm9vdGVyX19zb2NpYWwgc3ZnIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgc3Ryb2tlOiAjYzdjN2M4O1xuICBzdHJva2U6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbiAgZmlsbDogI2M3YzdjODtcbiAgZmlsbDogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xufVxuLnNtLWZvb3Rlcl9fY2FyZC10YWcge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBjb2xvcjogI2M3YzdjODtcbiAgY29sb3I6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbn1cbi5zbS1mb290ZXJfX2NhcmQtdGFnIHAge1xuICBtYXJnaW46IDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzO1xufVxuLnNtLWZvb3Rlcl9fY2FyZC10YWcgc3ZnIHtcbiAgZmxleC1zaHJpbms6IDA7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIHdpZHRoOiAwLjkzNzVyZW07XG4gIGhlaWdodDogMC45Mzc1cmVtO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMC4yZW0pO1xuICBzdHJva2U6ICNjN2M3Yzg7XG4gIHN0cm9rZTogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xuICBzdHJva2Utd2lkdGg6IDJweDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG59XG4uc20tZm9vdGVyX19jYXJkLXRhZzpob3ZlciBwLCAuc20tZm9vdGVyX19jYXJkLXRhZzphY3RpdmUgcCB7XG4gIGNvbG9yOiAjZmZhYjkxO1xuICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LCAjZmZhYjkxKTtcbiAgb3V0bGluZTogbm9uZTtcbn1cbi5zbS1mb290ZXJfX2NhcmQtdGFnOmhvdmVyIHN2ZywgLnNtLWZvb3Rlcl9fY2FyZC10YWc6YWN0aXZlIHN2ZyB7XG4gIHN0cm9rZTogI2ZmYWI5MTtcbiAgc3Ryb2tlOiB2YXIoLS1zZWNvbmRhcnksICNmZmFiOTEpO1xufVxuLnNtLWZvb3Rlcl9fcHVibGlzaGVkLWJ5LWdob3N0IHtcbiAgcGFkZGluZzogMC41cmVtO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgY29sb3I6ICNhNWE1YTc7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MywgI2E1YTVhNyk7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnNtLW1lbnVfX2xpbmsge1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xufVxuLnNtLW1lbnVfX2xpbms6Zm9jdXMge1xuICBvdXRsaW5lOiBub25lO1xuICBjb2xvcjogIzgwZGVlYTtcbiAgY29sb3I6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xufVxuXG4uc20tbmF2YmFyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIHotaW5kZXg6IDU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMCAxcmVtO1xuICBmb250LXNpemU6IDAuOXJlbTtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyODI4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zdXJmYWNlMiwgIzI4MjgyOCk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzO1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDYwMHB4KSB7XG4gIC5zbS1uYXZiYXIge1xuICAgIHBhZGRpbmc6IDAgM3JlbTtcbiAgfVxufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICAuc20tbmF2YmFyIHtcbiAgICBwYWRkaW5nOiAwIDRyZW07XG4gIH1cbn1cbi5zbS1uYXZiYXJfX3RvcCwgLnNtLW5hdmJhcl9fYm90dG9tIHtcbiAgbWF4LXdpZHRoOiAxMDI0cHg7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuLnNtLW5hdmJhcl9fdG9wIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgaGVpZ2h0OiAyLjI1cmVtO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICMzODM4Mzg7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLXN1cmZhY2U0LCAjMzgzODM4KTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW5hdmJhcl9fdG9wIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICB9XG59XG4uc20tbmF2YmFyX190b3AtLWxlZnQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLnNtLW5hdmJhcl9fdG9wLS1yaWdodCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4uc20tbmF2YmFyX190b3AtLXJpZ2h0IGJ1dHRvbiB7XG4gIG1hcmdpbi1yaWdodDogMDtcbn1cbi5zbS1uYXZiYXJfX25ldy10YWcsIC5zbS1uYXZiYXJfX25ldy10YWctLXRleHQge1xuICBwYWRkaW5nOiAwLjE1cmVtO1xuICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgZm9udC1zaXplOiAwLjZyZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBsZXR0ZXItc3BhY2luZzogMC4ycHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICMwYTBhMGE7XG4gIGNvbG9yOiB2YXIoLS10ZXh0SW52ZXJzZSwgIzBhMGEwYSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmFiOTE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlY29uZGFyeSwgI2ZmYWI5MSk7XG59XG4uc20tbmF2YmFyX19uZXctdGFnLS10ZXh0IHtcbiAgY29sb3I6IHZhcigtLXRleHQyKTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi5zbS1uYXZiYXJfX25ldy1saW5rIHtcbiAgZm9udC1zaXplOiAwLjk1ZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xuICBjb2xvcjogI2M3YzdjODtcbiAgY29sb3I6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbn1cbi5zbS1uYXZiYXJfX25ldy1saW5rOmhvdmVyIHtcbiAgY29sb3I6ICNmNWY1ZjU7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LCAjZjVmNWY1KTtcbn1cbi5zbS1uYXZiYXJfX2JvdHRvbSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGhlaWdodDogMy4yNXJlbTtcbn1cbi5zbS1uYXZiYXJfX2JvdHRvbS0tY2VudGVyIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgbWFyZ2luLWxlZnQ6IDJyZW07XG4gIGxpbmUtaGVpZ2h0OiAwO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW5hdmJhcl9fYm90dG9tLS1jZW50ZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG4uc20tbmF2YmFyX19ib3R0b20gZGl2Omxhc3QtY2hpbGQge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbn1cbi5zbS1uYXZiYXJfX2JvdHRvbS0tcmlnaHQge1xuICBkaXNwbGF5OiBub25lO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW5hdmJhcl9fYm90dG9tLS1yaWdodCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG4uc20tbmF2YmFyX19ib3R0b20tLXJpZ2h0LS1tb2JpbGUge1xuICBtYXJnaW46IDAgMCAwIGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAwO1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICAuc20tbmF2YmFyX19ib3R0b20tLXJpZ2h0LS1tb2JpbGUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbi5zbS1uYXZiYXJfX2JyYW5kLS1zZXJpZiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiBcIkRNIFNlcmlmIFRleHRcIiwgZ2VvcmdpYSwgc2VyaWY7XG4gIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG4uc20tbmF2YmFyX19icmFuZC0tc2VyaWYgaW1nIHtcbiAgd2lkdGg6IDEuMjVyZW07XG4gIGhlaWdodDogMS4yNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjI1cmVtO1xufVxuLnNtLW5hdmJhcl9fc2lnbmluLCAuc20tbmF2YmFyX19zaWdudXAge1xuICBtYXJnaW46IDAgMC41cmVtIDAgMDtcbiAgZm9udC1mYW1pbHk6IFwiTGF0b1wiLCAtYXBwbGUtc3lzdGVtLCBibGlua21hY3N5c3RlbWZvbnQsIFwiU2Vnb2UgVUlcIiwgcm9ib3RvLCBveHlnZW4sIHVidW50dSwgY2FudGFyZWxsLCBcIk9wZW4gU2Fuc1wiLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICNjN2M3Yzg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MiwgI2M3YzdjOCk7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7XG59XG4uc20tbmF2YmFyX19zaWduaW46aG92ZXIge1xuICBjb2xvcjogI2Y1ZjVmNTtcbiAgY29sb3I6IHZhcigtLXRleHQsICNmNWY1ZjUpO1xufVxuLnNtLW5hdmJhcl9fc2lnbnVwIHtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xuICBmb250LXdlaWdodDogNzAwO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA2KTtcbiAgY29sb3I6ICMwYTBhMGE7XG4gIGNvbG9yOiB2YXIoLS10ZXh0SW52ZXJzZSwgIzBhMGEwYSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICM4MGRlZWE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uc20tbmF2YmFyX19zaWdudXA6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhYjkxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnksICNmZmFiOTEpO1xufVxuLnNtLW5hdmJhcl9faGFtYnVyZ2VyLWJ0biB7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGhlaWdodDogMS41cmVtO1xufVxuLnNtLW5hdmJhcl9faGFtYnVyZ2VyLWJ0biBzdmcge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBzdHJva2U6ICNjN2M3Yzg7XG4gIHN0cm9rZTogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xufVxuLnNtLW5hdmJhcl9faGFtYnVyZ2VyLWJ0biBzdmc6aG92ZXIge1xuICBzdHJva2U6ICNmNWY1ZjU7XG4gIHN0cm9rZTogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG59XG4uc20tbmF2YmFyX19zZWFyY2gge1xuICBkaXNwbGF5OiBub25lO1xuICB3aWR0aDogMS41ZW07XG4gIGhlaWdodDogMS41ZW07XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuLnNtLW5hdmJhcl9fc2VhcmNoIHN2ZyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZpbGw6IHRyYW5zcGFyZW50O1xuICBzdHJva2U6ICNjN2M3Yzg7XG4gIHN0cm9rZTogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xuICB0cmFuc2l0aW9uOiBzdHJva2UgMC4ycztcbn1cbi5zbS1uYXZiYXJfX3NlYXJjaCBzdmc6aG92ZXIge1xuICBzdHJva2U6ICNmNWY1ZjU7XG4gIHN0cm9rZTogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG59XG4uc20tbmF2YmFyIC5zbS1jb2xvci1tb2RlLWJ0biB7XG4gIHdpZHRoOiAxLjVlbTtcbiAgaGVpZ2h0OiAxLjVlbTtcbiAgbWFyZ2luOiAwIDAuNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG4uc20tbmF2YmFyIC5zbS1jb2xvci1tb2RlLWJ0biBzdmcge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB0cmFuc2l0aW9uOiBzdHJva2UgMC4ycywgZmlsbCAwLjJzO1xuICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgc3Ryb2tlOiAjYzdjN2M4O1xuICBzdHJva2U6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbn1cbi5zbS1uYXZiYXIgLnNtLWNvbG9yLW1vZGUtYnRuIHN2Zzpob3ZlciB7XG4gIGZpbGw6ICNlZWU4YWE7XG4gIHN0cm9rZTogI2Y1ZjVmNTtcbiAgc3Ryb2tlOiB2YXIoLS10ZXh0LCAjZjVmNWY1KTtcbn1cblxuOnJvb3RbY29sb3ItbW9kZT1saWdodF0gLnNtLWNvbG9yLW1vZGUtYnRuLmxpZ2h0IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbjpyb290W2NvbG9yLW1vZGU9ZGFya10gLnNtLWNvbG9yLW1vZGUtYnRuLmRhcmsge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uc20tbmF2aWdhdGlvbl9fc29jaWFsLW1lZGlhLWl0ZW0ge1xuICB3aWR0aDogMS4yNWVtO1xuICBoZWlnaHQ6IDEuMjVlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG4gIGNvbG9yOiAjYzdjN2M4O1xuICBjb2xvcjogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xufVxuLnNtLW5hdmlnYXRpb25fX3NvY2lhbC1tZWRpYS1pdGVtOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tcmlnaHQ6IDA7XG59XG4uc20tbmF2aWdhdGlvbl9fc29jaWFsLW1lZGlhLWl0ZW0gc3ZnIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cbi5zbS1uYXZpZ2F0aW9uX191bCB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cbi5zbS1uYXZpZ2F0aW9uX19saSB7XG4gIG1hcmdpbjogMC41cmVtIDA7XG4gIGZvbnQtc2l6ZTogMS4yNXJlbTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW5hdmlnYXRpb25fX2xpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luOiAwIDFyZW0gMCAwO1xuICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICB9XG4gIC5zbS1uYXZpZ2F0aW9uX19saTpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gIH1cbiAgLnNtLW5hdmlnYXRpb25fX2xpOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgfVxufVxuXG4ucGFnaW5hdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgY29sb3I6ICNjN2M3Yzg7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MiwgI2M3YzdjOCk7XG59XG4ucGFnaW5hdGlvbiA+ICoge1xuICBtYXJnaW46IDJyZW0gMXJlbSAwO1xufVxuLnBhZ2luYXRpb24gPiAqOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG59XG4ucGFnaW5hdGlvbiA+ICo6bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1yaWdodDogMDtcbn1cbi5wYWdpbmF0aW9uIGEge1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xufVxuLnBhZ2luYXRpb24gYTpob3ZlciB7XG4gIGNvbG9yOiAjODBkZWVhO1xuICBjb2xvcjogdmFyKC0tcHJpbWFyeSwgIzgwZGVlYSk7XG59XG5cbi5zbS1idXR0b24sIC5zbS1idXR0b24tLXNlYXJjaCwgLnNtLWJ1dHRvbi0tY29sb3Ige1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwcmVtO1xuICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gIGNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMwMzAzMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3VyZmFjZTMsICMzMDMwMzApO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uc20tYnV0dG9uICsgLnNtLWJ1dHRvbiwgLnNtLWJ1dHRvbi0tc2VhcmNoICsgLnNtLWJ1dHRvbiwgLnNtLWJ1dHRvbiArIC5zbS1idXR0b24tLXNlYXJjaCwgLnNtLWJ1dHRvbi0tc2VhcmNoICsgLnNtLWJ1dHRvbi0tc2VhcmNoLCAuc20tYnV0dG9uLS1jb2xvciArIC5zbS1idXR0b24sIC5zbS1idXR0b24tLWNvbG9yICsgLnNtLWJ1dHRvbi0tc2VhcmNoLCAuc20tYnV0dG9uICsgLnNtLWJ1dHRvbi0tY29sb3IsIC5zbS1idXR0b24tLXNlYXJjaCArIC5zbS1idXR0b24tLWNvbG9yLCAuc20tYnV0dG9uLS1jb2xvciArIC5zbS1idXR0b24tLWNvbG9yIHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbn1cbi5zbS1idXR0b246aG92ZXIsIC5zbS1idXR0b24tLXNlYXJjaDpob3ZlciwgLnNtLWJ1dHRvbi0tY29sb3I6aG92ZXIge1xuICBvdXRsaW5lOiBub25lO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzgzODM4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zdXJmYWNlNCwgIzM4MzgzOCk7XG59XG4uc20tYnV0dG9uLmNvbG9yLW1vZGUtYnRuOmhvdmVyIHN2ZywgLmNvbG9yLW1vZGUtYnRuLnNtLWJ1dHRvbi0tc2VhcmNoOmhvdmVyIHN2ZywgLmNvbG9yLW1vZGUtYnRuLnNtLWJ1dHRvbi0tY29sb3I6aG92ZXIgc3ZnIHtcbiAgZmlsbDogI2VlZThhYTtcbn1cbi5zbS1idXR0b246YWN0aXZlLCAuc20tYnV0dG9uLS1zZWFyY2g6YWN0aXZlLCAuc20tYnV0dG9uLS1jb2xvcjphY3RpdmUge1xuICBib3gtc2hhZG93OiAxcHggMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNtLWJ1dHRvbiBzdmcsIC5zbS1idXR0b24tLXNlYXJjaCBzdmcsIC5zbS1idXR0b24tLWNvbG9yIHN2ZyB7XG4gIHdpZHRoOiAxcmVtO1xuICBoZWlnaHQ6IDFyZW07XG4gIG1hcmdpbi1yaWdodDogMC4xNXJlbTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xuICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gIHRyYW5zaXRpb246IGZpbGwgMC4ycztcbn1cbi5zbS1idXR0b24tLWNvbG9yIHtcbiAgY29sb3I6ICMwYTBhMGE7XG4gIGNvbG9yOiB2YXIoLS10ZXh0SW52ZXJzZSwgIzBhMGEwYSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICM4MGRlZWE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uc20tYnV0dG9uLS1jb2xvcjpob3ZlciB7XG4gIGNvbG9yOiAjMGEwYTBhO1xuICBjb2xvcjogdmFyKC0tdGV4dEludmVyc2UsICMwYTBhMGEpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhYjkxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnksICNmZmFiOTEpO1xufVxuLnNtLWJ1dHRvbi0tY29sb3I6YWN0aXZlIHtcbiAgYm94LXNoYWRvdzogMXB4IDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbi5zbS1idXR0b24tLXNlYXJjaCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5zbS1jYXJkLCAuc20tY2FyZC0tdGFncyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyODI4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zdXJmYWNlMiwgIzI4MjgyOCk7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IDAgcmdiYSgwLCAwLCAwLCAwLjEpLCAwIDFweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xufVxuLnNtLWNhcmRfX2xpbmsge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzLCBjb2xvciAwLjJzO1xufVxuLnNtLWNhcmRfX2xpbms6aG92ZXIsIC5zbS1jYXJkX19saW5rOmZvY3VzIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgNHB4ICM4MGRlZWE7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1wcmltYXJ5LCBjb2xvcihwcmltYXJ5KSk7XG59XG4uc20tY2FyZF9fbGluazpob3ZlciAuc20tY2FyZF9fdGl0bGUsIC5zbS1jYXJkX19saW5rOmhvdmVyIC5zbS1jYXJkLS10YWdzX190aXRsZSwgLnNtLWNhcmRfX2xpbms6Zm9jdXMgLnNtLWNhcmRfX3RpdGxlLCAuc20tY2FyZF9fbGluazpmb2N1cyAuc20tY2FyZC0tdGFnc19fdGl0bGUge1xuICBjb2xvcjogIzgwZGVlYTtcbiAgY29sb3I6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xufVxuLnNtLWNhcmRfX2ltZy1jb250YWluZXIsIC5zbS1jYXJkLS10YWdzX19pbWctY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAwO1xuICBwYWRkaW5nLXRvcDogNTAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG59XG4uc20tY2FyZF9faW1nLWNvbnRhaW5lci5wYWlkOjphZnRlciwgLnBhaWQuc20tY2FyZC0tdGFnc19faW1nLWNvbnRhaW5lcjo6YWZ0ZXIsIC5zbS1jYXJkX19pbWctY29udGFpbmVyLm1lbWJlcnM6OmFmdGVyLCAubWVtYmVycy5zbS1jYXJkLS10YWdzX19pbWctY29udGFpbmVyOjphZnRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiAwO1xuICBsZWZ0OiAxLjI1cmVtO1xuICBwYWRkaW5nOiAwLjI1ZW0gMC41ZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjJweDtcbiAgY29udGVudDogXCJNZW1iZXJzXCI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlOGU5ZTk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRleHQxLCAjZThlOWU5KTtcbiAgY29sb3I6ICMyMDIwMjA7XG4gIGNvbG9yOiB2YXIoLS1zdXJmYWNlMSwgIzIwMjAyMCk7XG59XG4uc20tY2FyZF9faW1nLCAuc20tY2FyZC0tdGFnc19faW1nLCAuc20tY2FyZF9fbm8taW1nLCAuc20tY2FyZC0tdGFnc19fbm8taW1nIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xufVxuLnNtLWNhcmRfX25vLWltZywgLnNtLWNhcmQtLXRhZ3NfX25vLWltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjb250ZW50OiBcIlwiO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQodmFyKC0tcHJpbWFyeSkgMCwgdHJhbnNwYXJlbnQgNjMlKSwgcmFkaWFsLWdyYWRpZW50KHZhcigtLXRocmVlKSAwLCB0cmFuc3BhcmVudCA0MiUpLCByYWRpYWwtZ3JhZGllbnQodmFyKC0tZm91cikgMCwgdHJhbnNwYXJlbnQgNTklKSwgcmFkaWFsLWdyYWRpZW50KHZhcigtLWZpdmUpIDAsIHRyYW5zcGFyZW50IDUwJSksIHJhZGlhbC1ncmFkaWVudCh2YXIoLS1zZWNvbmRhcnkpIDAsIHRyYW5zcGFyZW50IDU1JSk7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IC0xNiUgLTM1JSwgLTIxJSAtNDUlLCA1JSAxMCUsIDE5JSAzNSUsIDI1JSAxOSU7XG4gIGJhY2tncm91bmQtc2l6ZTogODclIDY1JSwgNjIlIDg0JSwgNjklIDY4JSwgNjIlIDk3JSwgNjUlIDYwJTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1wb3NpdGlvbiAycztcbiAgdHJhbnNmb3JtOiBzY2FsZSgzKTtcbn1cbi5zbS1jYXJkX19ib2R5LCAuc20tY2FyZC0tdGFnc19fYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBhZGRpbmc6IDAgMS4yNXJlbTtcbiAgbWFyZ2luOiAxLjI1cmVtIDA7XG59XG4uc20tY2FyZF9fZGF0ZSwgLnNtLWNhcmQtLXRhZ3NfX2RhdGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiAxcHg7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICNlOGU5ZTk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MSwgI2U4ZTllOSk7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XG4uc20tY2FyZF9fdGl0bGUsIC5zbS1jYXJkLS10YWdzX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luOiAwLjI1cmVtIDAgMS41cmVtO1xuICBmb250LXNpemU6IDEuNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMTtcbiAgY29sb3I6ICNmNWY1ZjU7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LCAjZjVmNWY1KTtcbiAgdHJhbnNpdGlvbjogY29sb3IgMC4ycztcbn1cbi5zbS1jYXJkX19leGNlcnB0IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5zbS1jYXJkLS10YWdzIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zbS1jYXJkLS10YWdzX19saW5rOmhvdmVyIC5zbS1jYXJkLS10YWdzX19pbWctY29udGFpbmVyOmFmdGVyLCAuc20tY2FyZC0tdGFnc19fbGluazpmb2N1cyAuc20tY2FyZC0tdGFnc19faW1nLWNvbnRhaW5lcjphZnRlciB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuLnNtLWNhcmQtLXRhZ3NfX2ltZy1jb250YWluZXI6YWZ0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgY29udGVudDogXCJcIjtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcbn1cbi5zbS1jYXJkLS10YWdzX19uby1pbWcge1xuICBiYWNrZ3JvdW5kOiAjODBkZWVhO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LCAjODBkZWVhKTtcbn1cbi5zbS1jYXJkLS10YWdzX19uby1pbWc6YWZ0ZXIge1xuICBiYWNrZ3JvdW5kOiBub25lO1xufVxuLnNtLWNhcmQtLXRhZ3NfX2ltZywgLnNtLWNhcmQtLXRhZ3NfX25vLWltZyB7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi5zbS1jYXJkLS10YWdzX19ib2R5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDI7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBoZWlnaHQ6IGF1dG87XG4gIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4ycztcbn1cbi5zbS1jYXJkLS10YWdzX190aXRsZSB7XG4gIHBhZGRpbmc6IDAuMjVyZW0gMCAwLjI1cmVtIDAuNXJlbTtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDJyZW07XG4gIGNvbG9yOiAjZjVmNWY1O1xuICBjb2xvcjogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG4gIGJhY2tncm91bmQ6ICMyMDIwMjA7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UxLCAjMjAyMDIwKTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7XG59XG5AbWVkaWEgKG1pbi13aWR0aDogNjAwcHgpIHtcbiAgLnNtLWNhcmQtLXRhZ3NfX3RpdGxlIHtcbiAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgfVxufVxuLnNtLWNhcmQtLXRhZ3NfX2RhdGUge1xuICBwYWRkaW5nOiAwLjM3NXJlbSAwLjVyZW07XG4gIGNvbG9yOiAjZmZhYjkxO1xuICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LCAjZmZhYjkxKTtcbiAgYmFja2dyb3VuZDogIzIwMjAyMDtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZTEsICMyMDIwMjApO1xuICBmb250LWZhbWlseTogXCJMYXRvXCIsIC1hcHBsZS1zeXN0ZW0sIGJsaW5rbWFjc3lzdGVtZm9udCwgXCJTZWdvZSBVSVwiLCByb2JvdG8sIG94eWdlbiwgdWJ1bnR1LCBjYW50YXJlbGwsIFwiT3BlbiBTYW5zXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAycmVtO1xuICBsaW5lLWhlaWdodDogMTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDtcbiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbn1cbkBtZWRpYSAobWluLXdpZHRoOiA2MDBweCkge1xuICAuc20tY2FyZC0tdGFnc19fZGF0ZSB7XG4gICAgZm9udC1zaXplOiAxLjVyZW07XG4gIH1cbn1cbi5zbS1jYXJkLS10YWdzOm50aC1jaGlsZCgybikgLnNtLWNhcmRfX25vLWltZywgLnNtLWNhcmQtLXRhZ3M6bnRoLWNoaWxkKDJuKSAuc20tY2FyZC0tdGFnc19fbm8taW1nIHtcbiAgYmFja2dyb3VuZDogIzhjZGJiZjtcbiAgYmFja2dyb3VuZDogdmFyKC0tdGhyZWUsICM4Y2RiYmYpO1xufVxuLnNtLWNhcmQtLXRhZ3M6bnRoLWNoaWxkKDNuKSAuc20tY2FyZF9fbm8taW1nLCAuc20tY2FyZC0tdGFnczpudGgtY2hpbGQoM24pIC5zbS1jYXJkLS10YWdzX19uby1pbWcge1xuICBiYWNrZ3JvdW5kOiAjYjRkMTk1O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1mb3VyLCAjYjRkMTk1KTtcbn1cbi5zbS1jYXJkLS10YWdzOm50aC1jaGlsZCg0bikgLnNtLWNhcmRfX25vLWltZywgLnNtLWNhcmQtLXRhZ3M6bnRoLWNoaWxkKDRuKSAuc20tY2FyZC0tdGFnc19fbm8taW1nIHtcbiAgYmFja2dyb3VuZDogI2UwYzA4MTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZml2ZSwgI2UwYzA4MSk7XG59XG4uc20tY2FyZC0tdGFnczpudGgtY2hpbGQoNW4pIC5zbS1jYXJkX19uby1pbWcsIC5zbS1jYXJkLS10YWdzOm50aC1jaGlsZCg1bikgLnNtLWNhcmQtLXRhZ3NfX25vLWltZyB7XG4gIGJhY2tncm91bmQ6ICNmZmFiOTE7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeSwgI2ZmYWI5MSk7XG59XG5cbmhyIHtcbiAgaGVpZ2h0OiAwLjE1cmVtO1xuICBtYXJnaW46IDJyZW0gMDtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB2YXIoLS1zdXJmYWNlMiksIHZhcigtLXN1cmZhY2UzKSwgdmFyKC0tc3VyZmFjZTQpLCB2YXIoLS1zdXJmYWNlMyksIHZhcigtLXN1cmZhY2UyKSk7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uc20tZm9ybSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMXJlbTtcbn1cbi5zbS1mb3JtX19pbnB1dCxcbi5zbS1mb3JtIHRleHRhcmVhIHtcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDAuMjVyZW07XG4gIG1hcmdpbjogMC4yNXJlbSAwO1xuICBmb250LWZhbWlseTogXCJMYXRvXCIsIC1hcHBsZS1zeXN0ZW0sIGJsaW5rbWFjc3lzdGVtZm9udCwgXCJTZWdvZSBVSVwiLCByb2JvdG8sIG94eWdlbiwgdWJ1bnR1LCBjYW50YXJlbGwsIFwiT3BlbiBTYW5zXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBib3JkZXI6IDFweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICNlOGU5ZTk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MSwgI2U4ZTllOSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyODI4Mjg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UyLCAjMjgyODI4KTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG59XG4uc20tZm9ybV9faW5wdXQ6Zm9jdXMsXG4uc20tZm9ybSB0ZXh0YXJlYTpmb2N1cyB7XG4gIGNvbG9yOiAjZjVmNWY1O1xuICBjb2xvcjogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMDMwMzA7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UzLCAjMzAzMDMwKTtcbiAgYm9yZGVyOiAxcHggc29saWQgIzgwZGVlYTtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcHJpbWFyeSk7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzO1xufVxuLnNtLWZvcm0gdGV4dGFyZWEge1xuICBmbGV4LWJhc2lzOiBhdXRvO1xuICBoZWlnaHQ6IDhyZW07XG59XG4uc20tZm9ybSAuc20tYnV0dG9uLS1jb2xvciB7XG4gIG1hcmdpbjogMXJlbSAwIDA7XG59XG5cbi5zbS1ncmlkLCAuc20tZ3JpZC1jb250YWluZXIsIC5zbS1ncmlkLWNvbnRhaW5lci0tZm9vdGVyLCAuc20tZ3JpZC1jb250YWluZXItLXRhZ3Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XG4uc20tZ3JpZCAuc20tY2FyZCwgLnNtLWdyaWQtY29udGFpbmVyIC5zbS1jYXJkLCAuc20tZ3JpZC1jb250YWluZXItLWZvb3RlciAuc20tY2FyZCwgLnNtLWdyaWQtY29udGFpbmVyLS10YWdzIC5zbS1jYXJkIHtcbiAgd2lkdGg6IDUwJTtcbiAgbWluLXdpZHRoOiAxNC4zNzVyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG59XG4uc20tZ3JpZCAuc20tY2FyZDpmaXJzdC1jaGlsZCwgLnNtLWdyaWQtY29udGFpbmVyIC5zbS1jYXJkOmZpcnN0LWNoaWxkLCAuc20tZ3JpZC1jb250YWluZXItLWZvb3RlciAuc20tY2FyZDpmaXJzdC1jaGlsZCwgLnNtLWdyaWQtY29udGFpbmVyLS10YWdzIC5zbS1jYXJkOmZpcnN0LWNoaWxkIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5Ac3VwcG9ydHMgKGdhcDogMS41cmVtKSB7XG4gIC5zbS1ncmlkLCAuc20tZ3JpZC1jb250YWluZXIsIC5zbS1ncmlkLWNvbnRhaW5lci0tZm9vdGVyLCAuc20tZ3JpZC1jb250YWluZXItLXRhZ3Mge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ2FwOiAxLjVyZW07XG4gIH1cbiAgLnNtLWdyaWQgLnNtLWNhcmQsIC5zbS1ncmlkLWNvbnRhaW5lciAuc20tY2FyZCwgLnNtLWdyaWQtY29udGFpbmVyLS1mb290ZXIgLnNtLWNhcmQsIC5zbS1ncmlkLWNvbnRhaW5lci0tdGFncyAuc20tY2FyZCB7XG4gICAgd2lkdGg6IGluaXRpYWw7XG4gICAgbWluLXdpZHRoOiBpbml0aWFsO1xuICAgIG1hcmdpbi1ib3R0b206IGluaXRpYWw7XG4gIH1cbiAgLnNtLWdyaWQgLnNtLWNhcmQ6Zmlyc3QtY2hpbGQsIC5zbS1ncmlkLWNvbnRhaW5lciAuc20tY2FyZDpmaXJzdC1jaGlsZCwgLnNtLWdyaWQtY29udGFpbmVyLS1mb290ZXIgLnNtLWNhcmQ6Zmlyc3QtY2hpbGQsIC5zbS1ncmlkLWNvbnRhaW5lci0tdGFncyAuc20tY2FyZDpmaXJzdC1jaGlsZCB7XG4gICAgd2lkdGg6IGluaXRpYWw7XG4gIH1cbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDYwMHB4KSB7XG4gIC5zbS1jYXJkLTEge1xuICAgIGdyaWQtYXJlYTogb25lO1xuICB9XG5cbiAgLnNtLWNhcmQtMiB7XG4gICAgZ3JpZC1hcmVhOiB0d287XG4gIH1cblxuICAuc20tY2FyZC0zIHtcbiAgICBncmlkLWFyZWE6IHRocmVlO1xuICB9XG5cbiAgLnNtLWNhcmQtNCB7XG4gICAgZ3JpZC1hcmVhOiBmb3VyO1xuICB9XG5cbiAgLnNtLWNhcmQtNSB7XG4gICAgZ3JpZC1hcmVhOiBmaXZlO1xuICB9XG5cbiAgLnNtLWNhcmQtNiB7XG4gICAgZ3JpZC1hcmVhOiBzaXg7XG4gIH1cblxuICAuc20tY2FyZC03IHtcbiAgICBncmlkLWFyZWE6IHNldmVuO1xuICB9XG5cbiAgLnNtLWNhcmQtOCB7XG4gICAgZ3JpZC1hcmVhOiBlaWdodDtcbiAgfVxuXG4gIC5zbS1jYXJkLTkge1xuICAgIGdyaWQtYXJlYTogbmluZTtcbiAgfVxuXG4gIC5zbS1jYXJkLTEwIHtcbiAgICBncmlkLWFyZWE6IHRlbjtcbiAgfVxufVxuLnNtLWdyaWQtY29udGFpbmVyLCAuc20tZ3JpZC1jb250YWluZXItLWZvb3RlciwgLnNtLWdyaWQtY29udGFpbmVyLS10YWdzIHtcbiAgYWxpZ24tY29udGVudDogc3RyZXRjaDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyOTJweCwgMWZyKSk7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAxcmVtIDA7XG59XG4uc20tZ3JpZC1jb250YWluZXItLWZvb3RlciB7XG4gIGdyaWQtZ2FwOiAycmVtO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICAuc20tZ3JpZC1jb250YWluZXItLWZvb3RlciB7XG4gICAgZ3JpZC1nYXA6IDJyZW07XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNjAwcHgpIHtcbiAgLnNtLWdyaWQtY29udGFpbmVyLTEge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDI5MnB4LCAxZnIpO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6IFwib25lXCI7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTEgLnNtLWNhcmQtMSAuc20tY2FyZF9fbGluayB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMSAuc20tY2FyZC0xIC5zbS1jYXJkX19pbWctY29udGFpbmVyIHtcbiAgICB3aWR0aDogNTAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtaW4taGVpZ2h0OiAxNXJlbTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMSAuc20tY2FyZC0xIC5zbS1jYXJkX19pbWcge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMSAuc20tY2FyZC0xIC5zbS1jYXJkX19ib2R5IHtcbiAgICB3aWR0aDogY2FsYyg1MCUgLSAyLjVyZW0pO1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci0yIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgdHdvXCI7XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItMyB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6IFwib25lIG9uZVwiIFwidHdvIHRocmVlXCI7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTMgLnNtLWNhcmQtMSAuc20tY2FyZF9fbGluayB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMyAuc20tY2FyZC0xIC5zbS1jYXJkX19pbWctY29udGFpbmVyIHtcbiAgICB3aWR0aDogNTAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtaW4taGVpZ2h0OiAxNXJlbTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMyAuc20tY2FyZC0xIC5zbS1jYXJkX19pbWcge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMyAuc20tY2FyZC0xIC5zbS1jYXJkX19ib2R5IHtcbiAgICB3aWR0aDogY2FsYyg1MCUgLSAyLjVyZW0pO1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci00IHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiBcIm9uZSB0d29cIiBcInRocmVlIGZvdXJcIjtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItNSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgb25lXCIgXCJ0d28gdGhyZWVcIiBcImZvdXIgZml2ZVwiO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci02IHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiBcIm9uZSBvbmUgb25lIHR3byB0d28gdHdvXCIgXCJ0aHJlZSB0aHJlZSB0aHJlZSBmb3VyIGZvdXIgZm91clwiIFwiZml2ZSBmaXZlIGZpdmUgc2l4IHNpeCBzaXhcIjtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICB9XG5cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyIDFmciAxZnI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgb25lIG9uZSBvbmUgb25lIG9uZVwiIFwidHdvIHR3byB0d28gdGhyZWUgdGhyZWUgdGhyZWVcIiBcImZvdXIgZm91ciBmb3VyIGZpdmUgZml2ZSBmaXZlXCIgXCJzaXggc2l4IHNpeCBzZXZlbiBzZXZlbiBzZXZlblwiO1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci03IC5zbS1jYXJkLTEgLnNtLWNhcmRfX2xpbmsge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWluLWhlaWdodDogMTVyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcgLnNtLWNhcmQtMSAuc20tY2FyZF9fYm9keSB7XG4gICAgd2lkdGg6IGNhbGMoNTAlIC0gMi41cmVtKTtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItOCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiBcIm9uZSBvbmUgb25lIHR3byB0d28gdHdvXCIgXCJ0aHJlZSB0aHJlZSB0aHJlZSBmb3VyIGZvdXIgZm91clwiIFwiZml2ZSBmaXZlIGZpdmUgc2l4IHNpeCBzaXhcIiBcInNldmVuIHNldmVuIHNldmVuIGVpZ2h0IGVpZ2h0IGVpZ2h0XCI7XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItOSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgb25lIG9uZSBvbmUgb25lIG9uZVwiIFwidHdvIHR3byB0d28gdGhyZWUgdGhyZWUgdGhyZWVcIiBcImZvdXIgZm91ciBmb3VyIGZpdmUgZml2ZSBmaXZlXCIgXCJzaXggc2l4IHNpeCBzZXZlbiBzZXZlbiBzZXZlblwiIFwiZWlnaHQgZWlnaHQgZWlnaHQgbmluZSBuaW5lIG5pbmVcIjtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci05IC5zbS1jYXJkLTEgLnNtLWNhcmRfX2xpbmsge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTkgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWluLWhlaWdodDogMTVyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTkgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTkgLnNtLWNhcmQtMSAuc20tY2FyZF9fYm9keSB7XG4gICAgd2lkdGg6IGNhbGMoNTAlIC0gMi41cmVtKTtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItMTAge1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6IFwib25lIG9uZSBvbmUgdHdvIHR3byB0d29cIiBcInRocmVlIHRocmVlIHRocmVlIGZvdXIgZm91ciBmb3VyXCIgXCJmaXZlIGZpdmUgZml2ZSBzaXggc2l4IHNpeFwiIFwic2V2ZW4gc2V2ZW4gc2V2ZW4gZWlnaHQgZWlnaHQgZWlnaHRcIiBcIm5pbmUgbmluZSBuaW5lIHRlbiB0ZW4gdGVuXCI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgfVxufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICAuc20tZ3JpZC1jb250YWluZXItNSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgb25lIG9uZSB0d28gdHdvIHR3b1wiIFwidGhyZWUgdGhyZWUgZm91ciBmb3VyIGZpdmUgZml2ZVwiO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyIDFmciAxZnI7XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItNiB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgb25lIG9uZSBvbmUgb25lIG9uZVwiIFwidHdvIHR3byB0d28gdGhyZWUgdGhyZWUgdGhyZWVcIiBcImZvdXIgZm91ciBmaXZlIGZpdmUgc2l4IHNpeFwiO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyIDFmciAxZnI7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTYgLnNtLWNhcmQtMSAuc20tY2FyZF9fbGluayB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItNiAuc20tY2FyZC0xIC5zbS1jYXJkX19pbWctY29udGFpbmVyIHtcbiAgICB3aWR0aDogNTAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBtaW4taGVpZ2h0OiAxNXJlbTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItNiAuc20tY2FyZC0xIC5zbS1jYXJkX19pbWcge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItNiAuc20tY2FyZC0xIC5zbS1jYXJkX19ib2R5IHtcbiAgICB3aWR0aDogY2FsYyg1MCUgLSAyLjVyZW0pO1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci03IHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6IFwib25lIG9uZSBvbmUgb25lIG9uZSBvbmVcIiBcInR3byB0d28gdGhyZWUgdGhyZWUgZm91ciBmb3VyXCIgXCJmaXZlIGZpdmUgc2l4IHNpeCBzZXZlbiBzZXZlblwiO1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci03IC5zbS1jYXJkLTEgLnNtLWNhcmRfX2xpbmsge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWluLWhlaWdodDogMTVyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcgLnNtLWNhcmQtMSAuc20tY2FyZF9fYm9keSB7XG4gICAgd2lkdGg6IGNhbGMoNTAlIC0gMi41cmVtKTtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItOCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiBcIm9uZSBvbmUgb25lIHR3byB0d28gdHdvXCIgXCJ0aHJlZSB0aHJlZSBmb3VyIGZvdXIgZml2ZSBmaXZlXCIgXCJzaXggc2l4IHNldmVuIHNldmVuIGVpZ2h0IGVpZ2h0XCI7XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItOSB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogXCJvbmUgb25lIG9uZSBvbmUgb25lIG9uZVwiIFwidHdvIHR3byB0d28gdGhyZWUgdGhyZWUgdGhyZWVcIiBcImZvdXIgZm91ciBmaXZlIGZpdmUgc2l4IHNpeFwiIFwic2V2ZW4gc2V2ZW4gZWlnaHQgZWlnaHQgbmluZSBuaW5lXCI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItOSAuc20tY2FyZC0xIC5zbS1jYXJkX19saW5rIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci05IC5zbS1jYXJkLTEgLnNtLWNhcmRfX2ltZy1jb250YWluZXIge1xuICAgIHdpZHRoOiA1MCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG1pbi1oZWlnaHQ6IDE1cmVtO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4O1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci05IC5zbS1jYXJkLTEgLnNtLWNhcmRfX2ltZyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci05IC5zbS1jYXJkLTEgLnNtLWNhcmRfX2JvZHkge1xuICAgIHdpZHRoOiBjYWxjKDUwJSAtIDIuNXJlbSk7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICB9XG5cbiAgLnNtLWdyaWQtY29udGFpbmVyLTEwIHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOiBcIm9uZSBvbmUgb25lIG9uZSBvbmUgb25lXCIgXCJ0d28gdHdvIHRocmVlIHRocmVlIGZvdXIgZm91clwiIFwiZml2ZSBmaXZlIHNpeCBzaXggc2V2ZW4gc2V2ZW5cIiBcImVpZ2h0IGVpZ2h0IG5pbmUgbmluZSB0ZW4gdGVuXCI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMTAgLnNtLWNhcmQtMSAuc20tY2FyZF9fbGluayB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMTAgLnNtLWNhcmQtMSAuc20tY2FyZF9faW1nLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWluLWhlaWdodDogMTVyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTEwIC5zbS1jYXJkLTEgLnNtLWNhcmRfX2ltZyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICB9XG4gIC5zbS1ncmlkLWNvbnRhaW5lci0xMCAuc20tY2FyZC0xIC5zbS1jYXJkX19ib2R5IHtcbiAgICB3aWR0aDogY2FsYyg1MCUgLSAyLjVyZW0pO1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxufVxuLnNtLWxpbmsge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLnNtLWxpbms6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IC0xcHg7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IC0xO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAycHg7XG4gIGNsaXAtcGF0aDogaW5zZXQoMCAxMDAlIDAgMCk7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGJhY2tncm91bmQtY29sb3I6ICM4MGRlZWE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGNsaXAtcGF0aCAwLjJzO1xufVxuLnNtLWxpbms6aG92ZXI6YmVmb3JlIHtcbiAgY2xpcC1wYXRoOiBpbnNldCgwIDAgMCAwKTtcbiAgdHJhbnNpdGlvbjogY2xpcC1wYXRoIDAuMnM7XG59XG4uc20tbGluay5zbS1uYXYtY3VycmVudDpiZWZvcmUge1xuICBjbGlwLXBhdGg6IG5vbmU7XG59XG5cbi5zbS1jb250ZW50LXdyYXA6YmVmb3JlIHtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiA3O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBjb250ZW50OiBcIlwiO1xuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMzE1ZGVnLCByZ2JhKDAsIDAsIDAsIDAuNSkgMCUsIHJnYmEoMCwgMCwgMCwgMC4zKSAxMDAlKTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTtcbn1cbi5zbS1leHBhbmRlZC1tb2RhbCAuc20tY29udGVudC13cmFwOmJlZm9yZSwgLnNtLWV4cGFuZGVkLW1lbnUgLnNtLWNvbnRlbnQtd3JhcDpiZWZvcmUge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5zbS1tb2RhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UtaW47XG4gIGNvbG9yOiAjZjVmNWY1O1xuICBjb2xvcjogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyODI4Mjg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UyLCAjMjgyODI4KTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW1vZGFsIHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgd2lkdGg6IDM4MHB4O1xuICAgIG1heC13aWR0aDogMTAwdnc7XG4gICAgbWF4LWhlaWdodDogNzUlO1xuICAgIG1hcmdpbi10b3A6IDE1dm1pbjtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm94LXNoYWRvdzogLTNweCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAwKTtcbiAgfVxufVxuLnNtLW1vZGFsX19jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZzogMXJlbTtcbn1cbi5zbS1tb2RhbFthcmlhLWV4cGFuZGVkPXRydWVdIHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgb3BhY2l0eTogMTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLW1vZGFsW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0ge1xuICAgIGFuaW1hdGlvbjogcG9wdXAgMC4yNXMgZWFzZS1vdXQ7XG4gIH1cbn1cbi5zbS1tb2RhbF9faGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG59XG4uc20tbW9kYWxfX2hlYWRlciAuc20tbmF2aWdhdGlvbl9fdWwge1xuICBtYXJnaW46IDJyZW07XG59XG4uc20tbW9kYWxfX2Nsb3NlLWJ0biB7XG4gIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgbWFyZ2luOiAwIDAgMXJlbSAxcmVtO1xuICBsaW5lLWhlaWdodDogMDtcbn1cbi5zbS1tb2RhbF9fY2xvc2UtYnRuOmhvdmVyIHN2ZyB7XG4gIHN0cm9rZTogI2ZmYWI5MTtcbiAgc3Ryb2tlOiB2YXIoLS1zZWNvbmRhcnksICNmZmFiOTEpO1xufVxuLnNtLW1vZGFsX19jbG9zZS1idG4gc3ZnIHtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHN0cm9rZS13aWR0aDogMztcbiAgc3Ryb2tlOiAjZThlOWU5O1xuICBzdHJva2U6IHZhcigtLXRleHQxLCAjZThlOWU5KTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG59XG4uc20tbW9kYWxfX3RpdGxlIHtcbiAgbWFyZ2luOiAwO1xufVxuLnNtLW1vZGFsX19mb290ZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbn1cbi5zbS1tb2RhbF9fZm9vdGVyIGEge1xuICB3aWR0aDogMnJlbTtcbiAgaGVpZ2h0OiAycmVtO1xuICBtYXJnaW46IDAuNXJlbTtcbn1cbi5zbS1tb2RhbF9fZm9vdGVyIGE6bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1yaWdodDogMDtcbn1cbi5zbS1tb2RhbF9fZm9vdGVyIGEgc3ZnIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgc3Ryb2tlOiAjYzdjN2M4O1xuICBzdHJva2U6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbn1cblxuLnNtLXNlYXJjaF9fbW9kYWwgLnNtLW1vZGFsX19jb250YWluZXIge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG59XG4uc20tc2VhcmNoX19tb2RhbCAuc20tbW9kYWxfX2hlYWRlciB7XG4gIG1heC13aWR0aDogNjAwcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuLnNtLXNlYXJjaF9fbW9kYWwgLnNtLXNtYWxsLWhlYWRlciB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4uc20tc2VhcmNoX19idXR0b24tLWxvYWRpbmcge1xuICBkaXNwbGF5OiBub25lO1xuICBhbmltYXRpb246IHJvdGF0ZSAxcyBsaW5lYXIgaW5maW5pdGU7XG59XG4ubG9hZGluZyAuc20tc2VhcmNoX19idXR0b24tLWxvYWRpbmcge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRyYW5zZm9ybTogbm9uZTtcbn1cbi5sb2FkaW5nIC5zbS1zZWFyY2hfX2J1dHRvbi0tY29udGVudCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4uc20tc2VhcmNoX19pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xufVxuLnNtLXNlYXJjaF9faW5wdXQtY29udGFpbmVyIGlucHV0LFxuLnNtLXNlYXJjaF9faW5wdXQtY29udGFpbmVyIGJ1dHRvbiB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDE7XG59XG4uc20tc2VhcmNoX19pbnB1dC1jb250YWluZXIgaW5wdXQge1xuICBmbGV4OiAyO1xuICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XG59XG4uc20tc2VhcmNoX19pbnB1dC1jb250YWluZXIgYnV0dG9uIHtcbiAgZmxleDogMTtcbn1cblxuQGtleWZyYW1lcyByb3RhdGUge1xuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxdHVybik7XG4gIH1cbn1cbi5zbS1zZWFyY2gtcmVzdWx0cyB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDYwMHB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1hcmdpbjogMXJlbSBhdXRvIDA7XG59XG4uc20tc2VhcmNoLXJlc3VsdHNfX2NvbnRhaW5lciB7XG4gIHBhZGRpbmctYm90dG9tOiAxcmVtO1xufVxuLnNtLXNlYXJjaC1yZXN1bHRzIC5zbS1zbWFsbC1oZWFkZXIge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuLnNtLXNlYXJjaC1yZXN1bHRzX19pdGVtIHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2hhZG93OiAwIDFweCAzcHggMCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMXB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMDMwMzA7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UzLCAjMzAzMDMwKTtcbn1cbi5zbS1zZWFyY2gtcmVzdWx0c19faXRlbTpmaXJzdC1jaGlsZCB7XG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XG59XG4uc20tc2VhcmNoLXJlc3VsdHNfX2xpbmsge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZzogMXJlbTtcbiAgYm9yZGVyOiAzcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzLCBjb2xvciAwLjJzO1xufVxuLnNtLXNlYXJjaC1yZXN1bHRzX19saW5rOmhvdmVyIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgNHB4ICM4MGRlZWE7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1wcmltYXJ5KTtcbn1cbi5zbS1zZWFyY2gtcmVzdWx0c19fbGluazpob3ZlciAuc20tc2VhcmNoLXJlc3VsdHNfX3RpdGxlIHtcbiAgY29sb3I6ICM4MGRlZWE7XG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LCAjODBkZWVhKTtcbn1cbi5zbS1zZWFyY2gtcmVzdWx0c19fZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBjb2xvcjogI2U4ZTllOTtcbiAgY29sb3I6IHZhcigtLXRleHQxLCAjZThlOWU5KTtcbiAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi5zbS1zZWFyY2gtcmVzdWx0c19fdGl0bGUge1xuICBtYXJnaW46IDAuMjVyZW0gMDtcbiAgZm9udC1mYW1pbHk6IFwiRE0gU2VyaWYgVGV4dFwiLCBnZW9yZ2lhLCBzZXJpZjtcbiAgZm9udC1zaXplOiAxLjFyZW07XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjI7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7XG59XG4uc20tc2VhcmNoLXJlc3VsdHNfX2V4Y2VycHQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZm9udC1zaXplOiAwLjlyZW07XG4gIC13ZWJraXQtbGluZS1jbGFtcDogMztcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIGNvbG9yOiAjYzdjN2M4O1xuICBjb2xvcjogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xufVxuXG4uc20tcG9zdC1zaGFyZS1iYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGJvdHRvbTogMDtcbiAgei1pbmRleDogNTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGNvbG9yOiAjYzdjN2M4O1xuICBjb2xvcjogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMDMwMzA7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1cmZhY2UzLCAjMzAzMDMwKTtcbiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkIHZhcigtLXN1cmZhY2U0KTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcbiAgLnNtLXBvc3Qtc2hhcmUtYmFyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG4uc20tcG9zdC1zaGFyZS1iYXJfX2xpbmssIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tY29weSwgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1saW5rZWRpbiwgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1mYWNlYm9vaywgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS10d2l0dGVyIHtcbiAgd2lkdGg6IDIuNXJlbTtcbiAgaGVpZ2h0OiAyLjVyZW07XG4gIHBhZGRpbmc6IDAuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uc20tcG9zdC1zaGFyZS1iYXJfX2xpbmsgc3ZnLCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWNvcHkgc3ZnLCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWxpbmtlZGluIHN2ZywgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1mYWNlYm9vayBzdmcsIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tdHdpdHRlciBzdmcge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgc3Ryb2tlOiAjYzdjN2M4O1xuICBzdHJva2U6IHZhcigtLXRleHQyLCAjYzdjN2M4KTtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluaywgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1jb3B5LCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWxpbmtlZGluLCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWZhY2Vib29rLCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLXR3aXR0ZXIge1xuICAgIHdpZHRoOiAxLjhyZW07XG4gICAgaGVpZ2h0OiAxLjhyZW07XG4gICAgcGFkZGluZzogMC4zNnJlbTtcbiAgfVxufVxuLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS10d2l0dGVyOmhvdmVyLCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLXR3aXR0ZXI6YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkYTFmMjtcbn1cbi5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tdHdpdHRlcjpob3ZlciBzdmcsIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tdHdpdHRlcjphY3RpdmUgc3ZnIHtcbiAgc3Ryb2tlOiAjZmZmO1xufVxuLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1mYWNlYm9vazpob3ZlciwgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1mYWNlYm9vazphY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTg3N2YyO1xufVxuLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rLS1mYWNlYm9vazpob3ZlciBzdmcsIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tZmFjZWJvb2s6YWN0aXZlIHN2ZyB7XG4gIHN0cm9rZTogI2ZmZjtcbn1cbi5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tbGlua2VkaW46aG92ZXIsIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tbGlua2VkaW46YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNzdiNTtcbn1cbi5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tbGlua2VkaW46aG92ZXIgc3ZnLCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWxpbmtlZGluOmFjdGl2ZSBzdmcge1xuICBzdHJva2U6ICNmZmY7XG59XG4uc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWNvcHk6aG92ZXIsIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tY29weTphY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODBkZWVhO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LCAjODBkZWVhKTtcbn1cbi5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tY29weTpob3ZlciBzdmcsIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tY29weTphY3RpdmUgc3ZnIHtcbiAgc3Ryb2tlOiAjZmZmO1xufVxuOnJvb3RbY29sb3ItbW9kZT1kYXJrXSAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbmstLWNvcHk6aG92ZXIgc3ZnLCA6cm9vdFtjb2xvci1tb2RlPWRhcmtdIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluay0tY29weTphY3RpdmUgc3ZnIHtcbiAgc3Ryb2tlOiAjMDAwO1xufVxuXG4uc20tc2tpcC10by1jb250ZW50IHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycywgdHJhbnNmb3JtIDAuMjVzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMjVzO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC01MCUsIC0xMjUlLCAwKTtcbn1cbi5zbS1za2lwLXRvLWNvbnRlbnQ6Zm9jdXMge1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMgZWFzZS1pbiwgb3BhY2l0eSAwLjI1cztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNTAlLCAwLjVyZW0sIDApO1xufVxuXG4uc20tc21hbGwtaGVhZGVyLFxubGFiZWwge1xuICBtYXJnaW4tdG9wOiAxcmVtO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgY29sb3I6ICNhNWE1YTc7XG4gIGNvbG9yOiB2YXIoLS10ZXh0MywgI2E1YTVhNyk7XG59XG5cbi5hY2FkZW1pYSBzdmcge1xuICBmaWxsOiBjdXJyZW50Q29sb3I7XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzO1xufVxuLmFjYWRlbWlhIHN2Zzpob3ZlciwgLmFjYWRlbWlhIHN2Zzpmb2N1cyB7XG4gIGZpbGw6ICM4MGRlZWE7XG4gIGZpbGw6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xufVxuXG4uZmFjZWJvb2sge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uZmFjZWJvb2s6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTg3N2YyO1xufVxuLmZhY2Vib29rOmhvdmVyIHN2ZyB7XG4gIHN0cm9rZTogI2ZmZjtcbn1cbi5mYWNlYm9vayBzdmcge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5cbi5naXRodWIge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uZ2l0aHViOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQwNzhjMDtcbn1cbi5naXRodWI6aG92ZXIgc3ZnIHtcbiAgc3Ryb2tlOiAjZmZmO1xufVxuLmdpdGh1YiBzdmcge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5cbi5naXRsYWIge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uZ2l0bGFiOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjYTMyNjtcbn1cbi5naXRsYWI6aG92ZXIgc3ZnIHtcbiAgc3Ryb2tlOiAjZmZmO1xufVxuLmdpdGxhYiBzdmcge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5cbi5pbnN0YWdyYW0ge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4uaW5zdGFncmFtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2MxMzU4NDtcbn1cbi5pbnN0YWdyYW06aG92ZXIgc3ZnIHtcbiAgc3Ryb2tlOiAjZmZmO1xufVxuLmluc3RhZ3JhbSBzdmcge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5cbi5saW5rZWRpbiB7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcbn1cbi5saW5rZWRpbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDc3YjU7XG59XG4ubGlua2VkaW46aG92ZXIgc3ZnIHtcbiAgc3Ryb2tlOiAjZmZmO1xufVxuLmxpbmtlZGluIHN2ZyB7XG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICB0cmFuc2l0aW9uOiBzdHJva2UgMC4ycztcbn1cblxuLnJzcyB7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcbn1cbi5yc3M6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjI2NTIyO1xufVxuLnJzczpob3ZlciBzdmcge1xuICBzdHJva2U6ICNmZmY7XG59XG4ucnNzIHN2ZyB7XG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICB0cmFuc2l0aW9uOiBzdHJva2UgMC4ycztcbn1cblxuLnR3aXRjaCB7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcbn1cbi50d2l0Y2g6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjQ0MWE1O1xufVxuLnR3aXRjaDpob3ZlciBzdmcge1xuICBzdHJva2U6ICNmZmY7XG59XG4udHdpdGNoIHN2ZyB7XG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICB0cmFuc2l0aW9uOiBzdHJva2UgMC4ycztcbn1cblxuLnR3aXR0ZXIge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4udHdpdHRlcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZGExZjI7XG59XG4udHdpdHRlcjpob3ZlciBzdmcge1xuICBzdHJva2U6ICNmZmY7XG59XG4udHdpdHRlciBzdmcge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5cbi5tYXAgc3ZnLFxuLndlYnNpdGUgc3ZnIHtcbiAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbn1cbi5tYXAgc3ZnOmhvdmVyLCAubWFwIHN2Zzpmb2N1cyxcbi53ZWJzaXRlIHN2Zzpob3Zlcixcbi53ZWJzaXRlIHN2Zzpmb2N1cyB7XG4gIHN0cm9rZTogIzgwZGVlYTtcbiAgc3Ryb2tlOiB2YXIoLS1wcmltYXJ5LCAjODBkZWVhKTtcbn1cblxuLndlYnNpdGUge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4ud2Vic2l0ZTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM4MGRlZWE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnksICM4MGRlZWEpO1xufVxuLndlYnNpdGU6aG92ZXIgc3ZnIHtcbiAgc3Ryb2tlOiAjMGEwYTBhO1xuICBzdHJva2U6IHZhcigtLXRleHRJbnZlcnNlLCAjMGEwYTBhKTtcbn1cbi53ZWJzaXRlIHN2ZyB7XG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICB0cmFuc2l0aW9uOiBzdHJva2UgMC4ycztcbn1cblxuLnlvdXR1YmUge1xuICB3aWR0aDogMS41cmVtO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG59XG4ueW91dHViZTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjAwMDA7XG59XG4ueW91dHViZTpob3ZlciBzdmcge1xuICBzdHJva2U6ICNmZmY7XG59XG4ueW91dHViZSBzdmcge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnM7XG59XG5cbi5zbS10YWcge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGNvbG9yOiAjYzdjN2M4O1xuICBjb2xvcjogdmFyKC0tdGV4dDIsICNjN2M3YzgpO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xufVxuLnNtLXRhZzo6YmVmb3JlIHtcbiAgY29udGVudDogXCIjXCI7XG59XG4uc20tdGFnOm5vdCguc20tY2FyZCAuc20tdGFnKTpob3ZlciB7XG4gIGNvbG9yOiAjZjVmNWY1O1xuICBjb2xvcjogdmFyKC0tdGV4dCwgI2Y1ZjVmNSk7XG59XG4uc20tY2FyZCAuc20tdGFnIHtcbiAgbWFyZ2luLXRvcDogYXV0bztcbn1cbi5zbS1wb3N0X190YWctYmFyIC5zbS10YWc6bm90KDpsYXN0LWNoaWxkKSB7XG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xufVxuXG4uc20tbWFpbiwgLnNtLW1haW4tLWluZGV4IHtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbn1cbi5zbS1tYWluLS1pbmRleCB7XG4gIG1hcmdpbi10b3A6IDMuMjVyZW07XG59XG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIC5zbS1tYWluLS1pbmRleCB7XG4gICAgbWFyZ2luLXRvcDogNS41cmVtO1xuICB9XG59XG4uc20tbWFpbl9fb3V0ZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMXJlbTtcbn1cbkBtZWRpYSAobWluLXdpZHRoOiA2MDBweCkgYW5kIChtYXgtd2lkdGg6IDEwMjNweCkge1xuICAuc20tbWFpbl9fb3V0ZXItY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAxcmVtIDNyZW0gMnJlbTtcbiAgfVxufVxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuICAuc20tbWFpbl9fb3V0ZXItY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAxcmVtIDRyZW0gMnJlbTtcbiAgfVxufVxuLnNtLW1haW5fX2lubmVyLWNvbnRhaW5lciB7XG4gIG1heC13aWR0aDogMTAyNHB4O1xuICBtYXJnaW46IDAgYXV0byAxcmVtO1xufVxuLnNtLW1haW5fX2hlYWRlciB7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgbWFyZ2luOiAwO1xufVxuLnNtLW1haW5fX3JlYWQtbW9yZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY29sb3I6ICNmNWY1ZjU7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LCAjZjVmNWY1KTtcbiAgdHJhbnNpdGlvbjogY29sb3IgMC4ycztcbn1cbi5zbS1tYWluX19yZWFkLW1vcmUgaDIge1xuICBtYXJnaW46IDA7XG59XG4uc20tbWFpbl9fcmVhZC1tb3JlOmhvdmVyIHtcbiAgY29sb3I6ICNmZmFiOTE7XG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnksICNmZmFiOTEpO1xufVxuXG4uc20taGVybyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMjcuNXJlbTtcbiAgbWFyZ2luLXRvcDogMy4yNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zdXJmYWNlMSwgIzIwMjAyMCk7XG59XG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIC5zbS1oZXJvIHtcbiAgICBtYXJnaW4tdG9wOiA1LjVyZW07XG4gIH1cbn1cbkBtZWRpYSAobWluLWhlaWdodDogNjByZW0pIGFuZCAobWluLXdpZHRoOiAxMjgwcHgpIHtcbiAgLnNtLWhlcm8ge1xuICAgIGhlaWdodDogMzcuNXJlbTtcbiAgfVxufVxuLnNtLWhlcm86OmJlZm9yZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBjb250ZW50OiBcIlwiO1xuICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQocmdiYSgwLCAwLCAwLCAwLjUpLCByZ2JhKDAsIDAsIDAsIDAuNzUpKTtcbn1cbi5zbS1oZXJvX190ZXh0LWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIHdpZHRoOiAxMDAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG59XG4uc20taGVyb19fc2l0ZS10aXRsZSB7XG4gIG1hcmdpbjogMCAwIDAuNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMTtcbiAgY29sb3I6ICNmZmZmZmY7XG59XG4uc20taGVyb19fc2l0ZS1kZXNjcmlwdGlvbiB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yO1xuICBjb2xvcjogI2VlZWVlZTtcbn1cblxuLnNtLWF1dGhvcl9faGVhZGVyIHtcbiAgbWF4LXdpZHRoOiAxMDI0cHg7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuLnNtLWF1dGhvcl9faW1nLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1zaHJpbms6IDA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAycmVtO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5AbWVkaWEgKG1pbi13aWR0aDogNjAwcHgpIHtcbiAgLnNtLWF1dGhvcl9faW1nLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuLnNtLWF1dGhvcl9faW1nLWNvbnRhaW5lcjpiZWZvcmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgY29udGVudDogXCJcIjtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAjODBkZWVhLCAjZmZhYjkxKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZ3JhZGllbnQpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG4uc20tYXV0aG9yX19pbWcsIC5zbS1hdXRob3JfX25vLWltZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgd2lkdGg6IDlyZW07XG4gIGhlaWdodDogOXJlbTtcbiAgbWFyZ2luOiAwLjI1cmVtO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA2KTtcbn1cbi5zbS1hdXRob3JfX25vLWltZyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgIzgwZGVlYSwgI2ZmYWI5MSk7XG4gIGJhY2tncm91bmQ6IHZhcigtLWdyYWRpZW50KTtcbn1cbi5zbS1hdXRob3JfX25vLWltZyBzdmcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDkwJTtcbiAgaGVpZ2h0OiA5MCU7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6ICMwYTBhMGE7XG4gIGNvbG9yOiB2YXIoLS10ZXh0SW52ZXJzZSwgIzBhMGEwYSk7XG59XG5AbWVkaWEgKG1pbi13aWR0aDogNjAwcHgpIHtcbiAgLnNtLWF1dGhvcl9fdGV4dCB7XG4gICAgbWFyZ2luLWxlZnQ6IDRyZW07XG4gIH1cbn1cbi5zbS1hdXRob3JfX25hbWUge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtZmFtaWx5OiBcIkRNIFNlcmlmIFRleHRcIiwgZ2VvcmdpYSwgc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG59XG4uc20tYXV0aG9yX19sb2NhdGlvbiBzdmc6aG92ZXIge1xuICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbn1cbi5zbS1hdXRob3JfX21ldGEge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLnNtLWF1dGhvcl9fbWV0YSBhIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuLnNtLWF1dGhvcl9fbWV0YSBhOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tcmlnaHQ6IDA7XG59XG4uc20tYXV0aG9yX19tZXRhIHN2ZyB7XG4gIHdpZHRoOiAxcmVtO1xuICBoZWlnaHQ6IDFyZW07XG4gIHRyYW5zaXRpb246IGFsbCAwLjJzO1xufVxuLnNtLWF1dGhvcl9fbG9jYXRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLnNtLWF1dGhvcl9fbG9jYXRpb24gcCB7XG4gIG1hcmdpbi1sZWZ0OiAwLjI1cmVtO1xufVxuLnNtLWF1dGhvcl9fbG9jYXRpb24gc3ZnIHtcbiAgd2lkdGg6IDFyZW07XG4gIGhlaWdodDogMXJlbTtcbn1cblxuLnNtLW1haW4tLWVycm9yX19oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tYm90dG9tOiAwO1xuICBmb250LWZhbWlseTogXCJETSBTZXJpZiBUZXh0XCIsIGdlb3JnaWEsIHNlcmlmO1xuICBmb250LXNpemU6IDRyZW07XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5zbS1tYWluLS1lcnJvcl9fdGV4dCB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjZThlOWU5O1xuICBjb2xvcjogdmFyKC0tdGV4dDEsICNlOGU5ZTkpO1xufSIsIkB1c2UgJ3Nhc3M6Y29sb3InO1xuXG4vLyBCcmlnaHQgTW9kZVxuOnJvb3RbY29sb3ItbW9kZT0nbGlnaHQnXSB7XG4gIC0tdGV4dDogIzBhMGEwYTtcbiAgLS10ZXh0SW52ZXJzZTogI2Y1ZjVmNTtcbiAgLS10ZXh0MTogIzE3MTcxNztcbiAgLS10ZXh0MjogIzM5MzkzYTtcbiAgLS10ZXh0MzogIzVhNWE1YztcbiAgLS10ZXh0NDogIzllYTBhMjtcbiAgLS1zdXJmYWNlOiBoc2woMCwgMCUsIDkyJSk7XG4gIC0tc3VyZmFjZTE6IGhzbCgwLCAwJSwgOTQlKTtcbiAgLS1zdXJmYWNlMjogaHNsKDAsIDAlLCA5NiUpO1xuICAtLXN1cmZhY2UzOiBoc2woMCwgMCUsIDk4JSk7XG4gIC0tc3VyZmFjZTQ6ICNmZmZmZmY7XG4gIC0tcHJpbWFyeTogaHNsKDIxNiwgODUlLCAzNCUpO1xuICAtLXNlY29uZGFyeTogI2E0MDAyZTtcbiAgLS10aHJlZTogIzY0Mzc5MTtcbiAgLS1mb3VyOiAjOGIxYzc2O1xuICAtLWZpdmU6ICNhMDAwNTM7XG4gIC0tc3VjY2VzczogIzQ4YTAwZDtcbiAgLS1lcnJvcjogI2E0MDAwMDtcbiAgLS1lcnJvci1ob3ZlcjogaHNsKDAsIDEwMCUsIDE2JSk7XG4gIC0tZ3JhZGllbnQ6IGxpbmVhci1ncmFkaWVudChcbiAgICB0byByaWdodCB0b3AsXG4gICAgIzBkNDhhMCxcbiAgICAjNjQzNzkxLFxuICAgICM4YjFjNzYsXG4gICAgI2EwMDA1MyxcbiAgICAjYTQwMDJlXG4gICk7XG4gIC0tZ3JhZGllbnQtcmV2ZXJzZTogbGluZWFyLWdyYWRpZW50KFxuICAgIHRvIGxlZnQgdG9wLFxuICAgICMwZDQ4YTAsXG4gICAgIzY0Mzc5MSxcbiAgICAjOGIxYzc2LFxuICAgICNhMDAwNTMsXG4gICAgI2E0MDAyZVxuICApO1xufVxuXG4vLyBEYXJrIE1vZGVcbjpyb290W2NvbG9yLW1vZGU9J2RhcmsnXSB7XG4gIC0tdGV4dDogI2Y1ZjVmNTtcbiAgLS10ZXh0SW52ZXJzZTogIzBhMGEwYTtcbiAgLS10ZXh0MTogI2U4ZTllOTtcbiAgLS10ZXh0MjogI2M2YzZjNztcbiAgLS10ZXh0MzogI2E1YTVhNztcbiAgLS10ZXh0NDogIzYxNjM2NTtcbiAgLS1zdXJmYWNlOiAjMTgxODE4O1xuICAtLXN1cmZhY2UxOiAjMjAyMDIwO1xuICAtLXN1cmZhY2UyOiAjMjgyODI4O1xuICAtLXN1cmZhY2UzOiAjMzAzMDMwO1xuICAtLXN1cmZhY2U0OiAjMzgzODM4O1xuICAtLXByaW1hcnk6ICM4MGRlZWE7XG4gIC0tc2Vjb25kYXJ5OiAjZmZhYjkxO1xuICAtLXRocmVlOiAjOGNkYmJmO1xuICAtLWZvdXI6ICNiNGQxOTU7XG4gIC0tZml2ZTogI2UwYzA4MTtcbiAgLS1zdWNjZXNzOiAjYjRkMTk1O1xuICAtLWVycm9yOiBoc2woMCwgMTAwJSwgNzglKTtcbiAgLS1lcnJvci1ob3ZlcjogaHNsKDAsIDEwMCUsIDY4JSk7XG4gIC0tZ3JhZGllbnQ6IGxpbmVhci1ncmFkaWVudChcbiAgICB0byByaWdodCB0b3AsXG4gICAgIzgwZGVlYSxcbiAgICAjOGNkYmJmLFxuICAgICNiNGQxOTUsXG4gICAgI2UwYzA4MSxcbiAgICAjZmZhYjkxXG4gICk7XG4gIC0tZ3JhZGllbnQtcmV2ZXJzZTogbGluZWFyLWdyYWRpZW50KFxuICAgIHRvIGxlZnQgdG9wLFxuICAgICM4MGRlZWEsXG4gICAgIzhjZGJiZixcbiAgICAjYjRkMTk1LFxuICAgICNlMGMwODEsXG4gICAgI2ZmYWI5MVxuICApO1xufVxuIiwiQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VzdG9tIFByb3BlcnRpZXNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQHVzZSAnLi4vdGhlbWVzL3NtX3RoZW1lJztcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2xvYmFsIFN0eWxlc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5odG1sIHtcbiAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dCk7XG4gIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgc3VyZmFjZTEpO1xuICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDtcbn1cblxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbn1cblxuZW0ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHN1ZWRvc2VsZWN0b3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbjpsaW5rIHtcbiAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG46dmlzaXRlZCB7XG4gIGNvbG9yOiBjdXJyZW50Q29sb3I7XG59XG5cbjo6c2VsZWN0aW9uIHtcbiAgY29sb3I6ICMxMTE7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlMGMwODE7XG59XG5cbjp0YXJnZXQge1xuICBAaW5jbHVkZSBtaXhpbnMubmF2YmFyKHBhZGRpbmctdG9wKTtcbiAgQGluY2x1ZGUgbWl4aW5zLm5hdmJhcihtYXJnaW4tdG9wLCAkbmVnYXRpdmU6IHRydWUpO1xufVxuXG46Zm9jdXMge1xuICBvdXRsaW5lLXdpZHRoOiAxcHg7XG4gIG91dGxpbmUtc3R5bGU6IGRvdHRlZDtcbiAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChvdXRsaW5lLWNvbG9yLCB0ZXh0Myk7XG4gIG91dGxpbmUtb2Zmc2V0OiAzcHg7XG59XG5cbmE6YWN0aXZlLFxuYnV0dG9uOmFjdGl2ZSB7XG4gIG91dGxpbmU6IG5vbmU7XG59XG5cbjo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbn1cbiIsIkB1c2UgJ3ZhcmlhYmxlcyc7XG5AdXNlICdmdW5jdGlvbnMnO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xvclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AbWl4aW4gY29sb3ItbWFwKCRwcm9wZXJ0eSwgJGNvbG9yKSB7XG4gIEBpZiAkY29sb3IgPT0gdHJhbnNwYXJlbnQge1xuICAgICN7JHByb3BlcnR5fTogJGNvbG9yO1xuICB9IEBlbHNlIHtcbiAgICAjeyRwcm9wZXJ0eX06IGZ1bmN0aW9ucy5jb2xvcigkY29sb3IpO1xuICAgICN7JHByb3BlcnR5fTogdmFyKC0tI3skY29sb3J9LCBmdW5jdGlvbnMuY29sb3IoJGNvbG9yKSk7XG4gIH1cbn1cblxuQG1peGluIG91dGxpbmUge1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBAaW5jbHVkZSBjb2xvci1tYXAob3V0bGluZS1jb2xvciwgcHJpbWFyeSk7XG4gIG91dGxpbmUtb2Zmc2V0OiAxcHg7XG59XG5cbkBtaXhpbiBtZXNoIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNvbnRlbnQ6ICcnO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQodmFyKC0tcHJpbWFyeSkgMCwgdHJhbnNwYXJlbnQgNjMlKSxcbiAgICByYWRpYWwtZ3JhZGllbnQodmFyKC0tdGhyZWUpIDAsIHRyYW5zcGFyZW50IDQyJSksXG4gICAgcmFkaWFsLWdyYWRpZW50KHZhcigtLWZvdXIpIDAsIHRyYW5zcGFyZW50IDU5JSksXG4gICAgcmFkaWFsLWdyYWRpZW50KHZhcigtLWZpdmUpIDAsIHRyYW5zcGFyZW50IDUwJSksXG4gICAgcmFkaWFsLWdyYWRpZW50KHZhcigtLXNlY29uZGFyeSkgMCwgdHJhbnNwYXJlbnQgNTUlKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2JSAtMzUlLCAtMjElIC00NSUsIDUlIDEwJSwgMTklIDM1JSwgMjUlIDE5JTtcbiAgYmFja2dyb3VuZC1zaXplOiA4NyUgNjUlLCA2MiUgODQlLCA2OSUgNjglLCA2MiUgOTclLCA2NSUgNjAlO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDJzO1xuICB0cmFuc2Zvcm06IHNjYWxlKDMpO1xufVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmFuc2l0aW9uXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBtaXhpbiB0cmFuc2l0aW9uKCRwcm9wZXJ0eSkge1xuICB0cmFuc2l0aW9uOiAkcHJvcGVydHkgMC4ycztcbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCcmVha3BvaW50c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AbWl4aW4gcmVzcG9uZC1hYm92ZSgkYnJlYWtwb2ludCkge1xuICBAbWVkaWEgKG1pbi13aWR0aDogJGJyZWFrcG9pbnQpIHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG5AbWl4aW4gcmVzcG9uZC1iZWxvdygkYnJlYWtwb2ludCkge1xuICBAbWVkaWEgKG1heC13aWR0aDogJGJyZWFrcG9pbnQpIHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG5AbWl4aW4gcmVzcG9uZC1iZXR3ZWVuKCRtaW4sICRtYXgpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6ICRtaW4pIGFuZCAobWF4LXdpZHRoOiAkbWF4IC0gMSkge1xuICAgIEBjb250ZW50O1xuICB9XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGF5b3V0XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBtaXhpbiBuYXZiYXIoJHByb3BlcnR5LCAkbmVnYXRpdmU6IGZhbHNlLCAkaW5jcmVhc2U6IDApIHtcbiAgI3skcHJvcGVydHl9OiAzLjI1cmVtICsgJGluY3JlYXNlO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiB2YXJpYWJsZXMuJGxhcHRvcCkge1xuICAgICN7JHByb3BlcnR5fTogNS41cmVtICsgJGluY3JlYXNlO1xuICB9XG5cbiAgQGlmICRuZWdhdGl2ZSB7XG4gICAgI3skcHJvcGVydHl9OiAtMy4yNXJlbSArIC0kaW5jcmVhc2U7XG5cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICAgICN7JHByb3BlcnR5fTogLTUuNXJlbSArIC0kaW5jcmVhc2U7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBpbm5lci1jb250YWluZXIge1xuICBtYXgtd2lkdGg6IHZhcmlhYmxlcy4kbGFwdG9wO1xuICBtYXJnaW46IDAgYXV0byAxcmVtO1xufVxuXG5AbWl4aW4gb3V0ZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMXJlbTtcblxuICBAaW5jbHVkZSByZXNwb25kLWJldHdlZW4odmFyaWFibGVzLiR0YWJsZXQsIHZhcmlhYmxlcy4kbGFwdG9wKSB7XG4gICAgcGFkZGluZzogMXJlbSAzcmVtIDJyZW07XG4gIH1cblxuICBAaW5jbHVkZSByZXNwb25kLWFib3ZlKHZhcmlhYmxlcy4kbGFwdG9wKSB7XG4gICAgcGFkZGluZzogMXJlbSA0cmVtIDJyZW07XG4gIH1cbn1cblxuQG1peGluIGdyaWQge1xuICBkaXNwbGF5OiBncmlkO1xuICBnYXA6IDEuNXJlbTtcbn1cbiIsImh0bWwge1xuICBmb250LXNpemU6IDFyZW07XG4gIGZvbnQtc2l6ZTogY2xhbXAoXG4gICAgMXJlbSxcbiAgICAwLjkwOTA5MDkwOTA5MDkwOTFyZW0gKyAwLjQ1NDU0NTQ1NDU0NTQ1NDUzdncsXG4gICAgMS4yNXJlbVxuICApO1xuICBmb250LXdlaWdodDogNDAwO1xuICBsaW5lLWhlaWdodDogMS41O1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xufVxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUeW9wZ3JhcGh5XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBtYXJnaW46IDNyZW0gMCAxLjM4cmVtO1xuICBmb250LWZhbWlseTogdmFyaWFibGVzLiRzZXJpZjtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogY29tbW9uLWxpZ2F0dXJlcztcbiAgbGluZS1oZWlnaHQ6IDEuMjtcbn1cblxuaDEge1xuICBtYXJnaW4tdG9wOiAwO1xuICBmb250LXNpemU6IDIuNDg4cmVtO1xufVxuXG5oMiB7XG4gIGZvbnQtc2l6ZTogMi4wNzRyZW07XG59XG5cbmgzIHtcbiAgZm9udC1zaXplOiAxLjcyOHJlbTtcbn1cblxuaDQge1xuICBmb250LXNpemU6IDEuNDRyZW07XG59XG5cbmg1IHtcbiAgZm9udC1zaXplOiAxLjJyZW07XG59XG5cbmg2IHtcbiAgZm9udC1zaXplOiAxLjFyZW07XG59XG5cbnNtYWxsLFxuLnNtLXRleHQtc21hbGwge1xuICBmb250LXNpemU6IDAuODMzcmVtO1xufVxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2xvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU29jaWFsIE1lZGlhXG4kY2g6ICM2NDQxYTU7IC8vVHdpdGNoXG4kZmI6ICMxODc3ZjI7XG4kZ2g6ICM0MDc4YzA7XG4kZ2w6ICNmY2EzMjY7XG4kaWc6ICNjMTM1ODQ7XG4kbGk6ICMwMDc3YjU7XG4kcnM6ICNmMjY1MjI7IC8vUlNTXG4kdHc6ICMxZGExZjI7XG4keXQ6ICNmZjAwMDA7XG5cbi8vIEZhbGxiYWNrcyAoZGVmYXVsdHMgdG8gRGFyayBNb2RlKVxuJGNvbG9yczogKFxuICAndGV4dCc6ICNmNWY1ZjUsXG4gICd0ZXh0MSc6ICNlOGU5ZTksXG4gICd0ZXh0Mic6ICNjN2M3YzgsXG4gICd0ZXh0Myc6ICNhNWE1YTcsXG4gICd0ZXh0NCc6ICM2MTYyNjQsXG4gICdzdXJmYWNlJzogIzE4MTgxOCxcbiAgJ3N1cmZhY2UxJzogIzIwMjAyMCxcbiAgJ3N1cmZhY2UxLTc1JzogcmdiYSgzMywgMzMsIDMzLCAwLjc1KSxcbiAgJ3N1cmZhY2UyJzogIzI4MjgyOCxcbiAgJ3N1cmZhY2UzJzogIzMwMzAzMCxcbiAgJ3N1cmZhY2U0JzogIzM4MzgzOCxcbiAgJ3ByaW1hcnknOiAjODBkZWVhLFxuICAnc2Vjb25kYXJ5JzogI2ZmYWI5MSxcbiAgJ3RocmVlJzogIzhjZGJiZixcbiAgJ2ZvdXInOiAjYjRkMTk1LFxuICAnZml2ZSc6ICNlMGMwODEsXG4gICdzdWNjZXNzJzogI2I0ZDE5NSxcbiAgJ2Vycm9yJzogaHNsKDAsIDEwMCUsIDc4JSksXG4gICd0ZXh0SW52ZXJzZSc6ICMwYTBhMGEsXG4gICdncmFkaWVudCc6XG4gICAgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0IHRvcCwgIzgwZGVlYSwgIzhjZGJiZiwgI2I0ZDE5NSwgI2UwYzA4MSwgI2ZmYWI5MSksXG4pO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZvbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiRzYW5zOiAnTGF0bycsIC1hcHBsZS1zeXN0ZW0sIGJsaW5rbWFjc3lzdGVtZm9udCwgJ1NlZ29lIFVJJywgcm9ib3RvLCBveHlnZW4sXG4gIHVidW50dSwgY2FudGFyZWxsLCAnT3BlbiBTYW5zJywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZjtcblxuJHNlcmlmOiAnRE0gU2VyaWYgVGV4dCcsIGdlb3JnaWEsIHNlcmlmO1xuJG1vbm86ICdKZXRCcmFpbnMgTW9ubycsICdSb2JvdG8gTW9ubycsICdJQk0gUGxleCBNb25vJywgJ0Nhc2NhZGlhIENvZGUnLFxuICAnRHJvaWQgU2FucyBNb25vJywgJ0ZpcmEgTW9ubycsICdGaXJhIENvZGUnLCBjb25zb2xhcywgbW9ub3NwYWNlO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpemVzLCBCcmVha3BvaW50cywgVmFyaWFibGVzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQnJlYWtwb2ludHNcbiR0YWJsZXQ6IDYwMHB4O1xuJGxhcHRvcDogMTAyNHB4O1xuJGRlc2t0b3A6IDEyODBweDtcblxuLy8gU2l6ZXNcbiRiYXNlOiA5cmVtO1xuJHJhZGl1czogNHB4O1xuXG4vLyBCb3ggU2hhZG93XG4kYm94LXNoYWRvdy1sYXJnZTogM3B4IDNweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKSxcbiAgLTNweCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksIDVweCAxMHB4IDE1cHggcmdiYSgwLCAwLCAwLCAwLjE0KSxcbiAgLTVweCA1cHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMTQpO1xuJGJveC1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYmEoMCwgMCwgMCwgMC4xKSwgMCAxcHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjA2KTtcblxuJHRyYW5zaXRpb246IDAuMnM7XG4iLCJAa2V5ZnJhbWVzIHBvcHVwIHtcbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMjBweCkgc2NhbGUoMC44KTtcbiAgfVxuICA3NSUge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMCkgc2NhbGUoMSk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBzbGlkZS1pbiB7XG4gIDAlIHtcbiAgICB0b3A6IC0xMDAlO1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgdG9wOiAxcmVtO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBzbGlkZS1vdXQge1xuICAwJSB7XG4gICAgdG9wOiAxcmVtO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgMTAwJSB7XG4gICAgdG9wOiAtMTAwJTtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgbWVzaCB7XG4gIDAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDAsIDAgMTAwJSwgNTAlIDAsIDUwJSAyNSUsIDUwJSAxMDAlO1xuICB9XG4gIDE1JSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMSUgMSUsIDElIDEwMSUsIDUxJSAxJSwgNTElIDI2JSwgNTElIDEwMSU7XG4gIH1cbiAgMzAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyJSAyJSwgMiUgMTAyJSwgNTIlIDIlLCA1MiUgMjYlLCA1MiUgMTAyJTtcbiAgfVxuICA0NSUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMlIDMlLCAzJSAxMDMlLCA1MyUgMyUsIDUzJSAyNyUsIDUzJSAxMDMlO1xuICB9XG4gIDYwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNCUgNCUsIDQlIDEwNCUsIDU0JSA0JSwgNTQlIDI4JSwgNTQlIDEwNCU7XG4gIH1cbiAgNzUlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1JSA1JSwgNSUgMTA1JSwgNTUlIDUlLCA1NSUgMjklLCA1NSUgMTA1JTtcbiAgfVxuICA5MCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDYlIDYlLCA2JSAxMDYlLCA1NiUgNiUsIDU2JSAzMCUsIDU2JSAxMDYlO1xuICB9XG59XG4iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnRhaW5lcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQHVzZSAnLi4vYWJzdHJhY3RzL3ZhcmlhYmxlcyc7XG5AdXNlICcuLi9hYnN0cmFjdHMvbWl4aW5zJztcblxuLnNtLW91dGVyLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDFyZW07XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IHZhcmlhYmxlcy4kdGFibGV0KSB7XG4gICAgcGFkZGluZzogMXJlbSAzcmVtIDJyZW07XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICBwYWRkaW5nOiAxcmVtIDRyZW0gMnJlbTtcbiAgfVxuXG4gICYtLWZvb3RlciB7XG4gICAgQGV4dGVuZCAuc20tb3V0ZXItY29udGFpbmVyO1xuICAgIG1pbi1oZWlnaHQ6IDI1MHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAzcmVtO1xuXG4gICAgQG1lZGlhIChtaW4td2lkdGg6IHZhcmlhYmxlcy4kbGFwdG9wKSB7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbiAgICB9XG5cbiAgICBmb250LXNpemU6IDAuOXJlbTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHN1cmZhY2UpO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQxKTtcbiAgICBib3JkZXItYm90dG9tOiBub25lO1xuICB9XG59XG5cbi5zbS1pbm5lci1jb250YWluZXIge1xuICBtYXgtd2lkdGg6IHZhcmlhYmxlcy4kbGFwdG9wO1xuICBtYXJnaW46IDAgYXV0byAxcmVtO1xuXG4gICYtLWhlcm8ge1xuICAgIEBleHRlbmQgLnNtLWlubmVyLWNvbnRhaW5lcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICAmLS1mb290ZXIge1xuICAgIEBleHRlbmQgLnNtLWlubmVyLWNvbnRhaW5lcjtcbiAgfVxuXG4gICYtLWF1dGhvciB7XG4gICAgQGV4dGVuZCAuc20taW5uZXItY29udGFpbmVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHBhZGRpbmctYm90dG9tOiAxcmVtO1xuICAgIG1hcmdpbi10b3A6IDFyZW07XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IHZhcmlhYmxlcy4kdGFibGV0KSB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIH1cbiAgfVxufVxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBHbG9iYWwgRm9vdGVyIFN0eWxlc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AdXNlICcuLi9hYnN0cmFjdHMvdmFyaWFibGVzJztcbkB1c2UgJy4uL2Fic3RyYWN0cy9taXhpbnMnO1xuXG4uc20tZm9vdGVyIHtcbiAgJl9fc2VjdGlvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIC8vIHBhZGRpbmc6IDAuNXJlbTtcblxuICAgICYtLWxhdGVzdCB7XG4gICAgICBAZXh0ZW5kIC5zbS1mb290ZXJfX3NlY3Rpb247XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0MSk7XG5cbiAgICAgICY6bnRoLWNoaWxkKDMpIHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICAgICYgPiBwOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX2xpbmsge1xuICAgIG1hcmdpbi1ib3R0b206IDAuMTVyZW07XG4gIH1cblxuICAmX19kZXNjcmlwdGlvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0Mik7XG4gIH1cblxuICAmX19kYXRlIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQzKTtcbiAgfVxuXG4gICZfX3RpdGxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6IDEycmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG5cbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0Mik7XG5cbiAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihjb2xvcik7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHByaW1hcnkpO1xuICAgIH1cbiAgfVxuXG4gICZfX2hlYWRlci0tc2VyaWYge1xuICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgICBmb250LXNpemU6IDExNSU7XG4gICAgLy8gQGV4dGVuZCAuc2VyaWY7XG4gIH1cblxuICAmX19zb2NpYWwge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC1nYXA6IDFyZW07XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIDFyZW0pO1xuXG4gICAgQHN1cHBvcnRzIG5vdCAoZ2FwOiAxLjVyZW0pIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBhIHtcbiAgICAgICAgbWFyZ2luOiAwLjVyZW07XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFyZ2luLXRvcDogMC41cmVtO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGFsbCk7XG5cbiAgICBhIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIH1cblxuICAgIHN2ZyB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCB0ZXh0Mik7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGZpbGwsIHRleHQyKTtcbiAgICB9XG4gIH1cblxuICAmX19jYXJkLXRhZyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQyKTtcblxuICAgIHAge1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGFsbCk7XG4gICAgfVxuXG4gICAgc3ZnIHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbiAgICAgIHdpZHRoOiAwLjkzNzVyZW07XG4gICAgICBoZWlnaHQ6IDAuOTM3NXJlbTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwLjJlbSk7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKHN0cm9rZSwgdGV4dDIpO1xuICAgICAgc3Ryb2tlLXdpZHRoOiAycHg7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihhbGwpO1xuICAgIH1cblxuICAgICY6aG92ZXIsXG4gICAgJjphY3RpdmUge1xuICAgICAgcCB7XG4gICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHNlY29uZGFyeSk7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB9XG4gICAgICBzdmcge1xuICAgICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKHN0cm9rZSwgc2Vjb25kYXJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmX19wdWJsaXNoZWQtYnktZ2hvc3Qge1xuICAgIHBhZGRpbmc6IDAuNXJlbTtcbiAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0Myk7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG59XG4iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vYmlsZSBOYXYgTWVudVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AdXNlICcuLi9hYnN0cmFjdHMvbWl4aW5zJztcbi5zbS1tZW51IHtcbiAgJl9fbGluayB7XG4gICAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oY29sb3IpO1xuICAgICY6Zm9jdXMge1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHByaW1hcnkpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBOYXZiYXJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQHVzZSAnLi4vYWJzdHJhY3RzL3ZhcmlhYmxlcyc7XG5AdXNlICcuLi9hYnN0cmFjdHMvbWl4aW5zJztcblxuLnNtLW5hdmJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiA1O1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDAgMXJlbTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiR0YWJsZXQpIHtcbiAgICBwYWRkaW5nOiAwIDNyZW07XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICBwYWRkaW5nOiAwIDRyZW07XG4gIH1cblxuICBmb250LXNpemU6IDAuOXJlbTtcbiAgYm94LXNoYWRvdzogdmFyaWFibGVzLiRib3gtc2hhZG93O1xuICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHN1cmZhY2UyKTtcbiAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oYWxsKTtcblxuICAmX190b3AsXG4gICZfX2JvdHRvbSB7XG4gICAgbWF4LXdpZHRoOiB2YXJpYWJsZXMuJGxhcHRvcDtcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgfVxuXG4gICZfX3RvcCB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBoZWlnaHQ6IDIuMjVyZW07XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYm9yZGVyLWJvdHRvbS1jb2xvciwgc3VyZmFjZTQpO1xuXG4gICAgQGluY2x1ZGUgbWl4aW5zLnJlc3BvbmQtYWJvdmUodmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgfVxuXG4gICAgJi0tbGVmdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAmLS1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICAgYnV0dG9uIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX25ldy10YWcge1xuICAgIHBhZGRpbmc6IDAuMTVyZW07XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gICAgZm9udC1zaXplOiAwLjZyZW07XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dEludmVyc2UpO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgc2Vjb25kYXJ5KTtcblxuICAgICYtLXRleHQge1xuICAgICAgQGV4dGVuZCAuc20tbmF2YmFyX19uZXctdGFnO1xuICAgICAgY29sb3I6IHZhcigtLXRleHQyKTtcbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgJl9fbmV3LWxpbmsge1xuICAgIGZvbnQtc2l6ZTogMC45NWVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGNvbG9yKTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0Mik7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJvdHRvbSBuYXZiYXIgLT4gQnJhbmQsIExpbmtzLCBNZW1iZXJcbiAgJl9fYm90dG9tIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAzLjI1cmVtO1xuXG4gICAgJi0tY2VudGVyIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICBtYXJnaW4tbGVmdDogMnJlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7XG5cbiAgICAgIEBpbmNsdWRlIG1peGlucy5yZXNwb25kLWFib3ZlKHZhcmlhYmxlcy4kbGFwdG9wKSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG1lbWJlciBmdW5jdGlvbmFsaXR5IGlzbid0IGVuYWJsZWQsIHRoZW4gc2hpZnQgbmF2IGxpbmtzIHRvIGZhciByaWdodFxuICAgIGRpdjpsYXN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIH1cblxuICAgICYtLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICBtYXJnaW4tbGVmdDogYXV0bztcblxuICAgICAgQGluY2x1ZGUgbWl4aW5zLnJlc3BvbmQtYWJvdmUodmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgJi0tbW9iaWxlIHtcbiAgICAgICAgbWFyZ2luOiAwIDAgMCBhdXRvO1xuICAgICAgICBsaW5lLWhlaWdodDogMDtcbiAgICAgICAgQGluY2x1ZGUgbWl4aW5zLnJlc3BvbmQtYWJvdmUodmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJl9fYnJhbmQtLXNlcmlmIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZm9udC1mYW1pbHk6IHZhcmlhYmxlcy4kc2VyaWY7XG4gICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG5cbiAgICBpbWcge1xuICAgICAgd2lkdGg6IDEuMjVyZW07XG4gICAgICBoZWlnaHQ6IDEuMjVyZW07XG4gICAgICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtYmVyIGJ1dHRvbiBzdHlsaW5nXG4gICZfX3NpZ25pbixcbiAgJl9fc2lnbnVwIHtcbiAgICBtYXJnaW46IDAgMC41cmVtIDAgMDtcbiAgICBmb250LWZhbWlseTogdmFyaWFibGVzLiRzYW5zO1xuICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQyKTtcbiAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihjb2xvcik7XG4gIH1cblxuICAmX19zaWduaW46aG92ZXIge1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQpO1xuICB9XG5cbiAgJl9fc2lnbnVwIHtcbiAgICBwYWRkaW5nOiAwLjI1cmVtO1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIGJveC1zaGFkb3c6IHZhcmlhYmxlcy4kYm94LXNoYWRvdztcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0SW52ZXJzZSk7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChiYWNrZ3JvdW5kLWNvbG9yLCBwcmltYXJ5KTtcbiAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihiYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICAmOmhvdmVyIHtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgc2Vjb25kYXJ5KTtcbiAgICB9XG4gIH1cblxuICAmX19oYW1idXJnZXItYnRuIHtcbiAgICB3aWR0aDogMS41cmVtO1xuICAgIGhlaWdodDogMS41cmVtO1xuXG4gICAgc3ZnIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChzdHJva2UsIHRleHQyKTtcblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCB0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTZWFyY2ggYnV0dG9uXG4gICZfX3NlYXJjaCB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICB3aWR0aDogMS41ZW07XG4gICAgaGVpZ2h0OiAxLjVlbTtcbiAgICBtYXJnaW4tbGVmdDogMC41cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIHN2ZyB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGZpbGw6IHRyYW5zcGFyZW50O1xuICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChzdHJva2UsIHRleHQyKTtcbiAgICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKHN0cm9rZSk7XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKHN0cm9rZSwgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLnNtLWNvbG9yLW1vZGUtYnRuIHtcbiAgICB3aWR0aDogMS41ZW07XG4gICAgaGVpZ2h0OiAxLjVlbTtcbiAgICBtYXJnaW46IDAgMC41cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuXG4gICAgc3ZnIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgdHJhbnNpdGlvbjogc3Ryb2tlIDAuMnMsIGZpbGwgMC4ycztcbiAgICAgIGZpbGw6IHRyYW5zcGFyZW50O1xuICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChzdHJva2UsIHRleHQyKTtcblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGZpbGw6ICNlZWU4YWE7XG4gICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCB0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLnNtLWNvbG9yLW1vZGUtYnRuIHtcbiAgJi5saWdodCB7XG4gICAgOnJvb3RbY29sb3ItbW9kZT0nbGlnaHQnXSAmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG4gICYuZGFyayB7XG4gICAgOnJvb3RbY29sb3ItbW9kZT0nZGFyayddICYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTmF2aWdhdGlvbiBQYXJ0aWFsXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi5zbS1uYXZpZ2F0aW9uIHtcbiAgLy8gU29jaWFsIE1lZGlhIGljb25zIGluIGZvb3RlclxuICAmX19zb2NpYWwtbWVkaWEtaXRlbSB7XG4gICAgd2lkdGg6IDEuMjVlbTtcbiAgICBoZWlnaHQ6IDEuMjVlbTtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0Mik7XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgIH1cblxuICAgIHN2ZyB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gIH1cbiAgLy8gTmF2IGxpbmtzXG4gICZfX3VsIHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIH1cblxuICAmX19saSB7XG4gICAgbWFyZ2luOiAwLjVyZW0gMDtcbiAgICBmb250LXNpemU6IDEuMjVyZW07XG5cbiAgICBAaW5jbHVkZSBtaXhpbnMucmVzcG9uZC1hYm92ZSh2YXJpYWJsZXMuJGxhcHRvcCkge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luOiAwIDFyZW0gMCAwO1xuICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgICBsaW5lLWhlaWdodDogMTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhZ2luYXRpb25cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi5wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0Mik7XG5cbiAgPiAqIHtcbiAgICBtYXJnaW46IDJyZW0gMXJlbSAwO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgfVxuICB9XG5cbiAgYSB7XG4gICAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oY29sb3IpO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCBwcmltYXJ5KTtcbiAgICB9XG4gIH1cbn1cbiIsIkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG4uc20tYnV0dG9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAxMHJlbTtcbiAgcGFkZGluZzogMC4yNXJlbSAwLjVyZW07XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICBjb2xvcjogY3VycmVudENvbG9yO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IG5vbmU7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gIGJveC1zaGFkb3c6IHZhcmlhYmxlcy4kYm94LXNoYWRvdztcbiAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChiYWNrZ3JvdW5kLWNvbG9yLCBzdXJmYWNlMyk7XG4gIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGJhY2tncm91bmQtY29sb3IpO1xuXG4gICYgKyAuc20tYnV0dG9uIHtcbiAgICBtYXJnaW4tdG9wOiAxcmVtO1xuICB9XG5cbiAgJjpob3ZlciB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHN1cmZhY2U0KTtcbiAgfVxuICAmLmNvbG9yLW1vZGUtYnRuOmhvdmVyIHN2ZyB7XG4gICAgZmlsbDogI2VlZThhYTtcbiAgfVxuICAmOmFjdGl2ZSB7XG4gICAgYm94LXNoYWRvdzogMXB4IDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjM1KTtcbiAgfVxuXG4gIHN2ZyB7XG4gICAgd2lkdGg6IDFyZW07XG4gICAgaGVpZ2h0OiAxcmVtO1xuICAgIG1hcmdpbi1yaWdodDogMC4xNXJlbTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XG4gICAgZmlsbDogdHJhbnNwYXJlbnQ7XG4gICAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gICAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oZmlsbCk7XG4gIH1cblxuICAmLS1jb2xvciB7XG4gICAgQGV4dGVuZCAuc20tYnV0dG9uO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHRJbnZlcnNlKTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHByaW1hcnkpO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGJhY2tncm91bmQtY29sb3IpO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0SW52ZXJzZSk7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHNlY29uZGFyeSk7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjM1KTtcbiAgICB9XG4gIH1cblxuICAvLyBIaWRlIHNlYXJjaCBidXR0b24gdW5sZXNzIGVuYWJsZWQgaW4gZGFzaGJvYXJkXG4gICYtLXNlYXJjaCB7XG4gICAgQGV4dGVuZCAuc20tYnV0dG9uO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbiIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2FyZCBTdHlsZXNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQHVzZSAnLi4vYWJzdHJhY3RzL192YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL19taXhpbnMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL2Z1bmN0aW9ucyc7XG5cbi5zbS1jYXJkIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgc3VyZmFjZTIpO1xuICBib3JkZXItcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgYm94LXNoYWRvdzogdmFyaWFibGVzLiRib3gtc2hhZG93O1xuXG4gICZfX2xpbmsge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjJzLCBjb2xvciAwLjJzO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDRweCBmdW5jdGlvbnMuY29sb3IocHJpbWFyeSk7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggdmFyKC0tcHJpbWFyeSwgY29sb3IocHJpbWFyeSkpO1xuXG4gICAgICAuc20tY2FyZCB7XG4gICAgICAgICZfX3RpdGxlIHtcbiAgICAgICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCBwcmltYXJ5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX2ltZy1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgcGFkZGluZy10b3A6IDUwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgICAmLnBhaWQsXG4gICAgJi5tZW1iZXJzIHtcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGxlZnQ6IDEuMjVyZW07XG4gICAgICAgIHBhZGRpbmc6IDAuMjVlbSAwLjVlbTtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMnB4O1xuICAgICAgICBjb250ZW50OiAnTWVtYmVycyc7XG4gICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgdGV4dDEpO1xuICAgICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCBzdXJmYWNlMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJl9faW1nLFxuICAmX19uby1pbWcge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb2JqZWN0LWZpdDogY292ZXI7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gIH1cblxuICAmX19uby1pbWcge1xuICAgIEBpbmNsdWRlIG1peGlucy5tZXNoKCk7XG4gIH1cblxuICAmX19ib2R5IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHBhZGRpbmc6IDAgMS4yNXJlbTtcbiAgICBtYXJnaW46IDEuMjVyZW0gMDtcbiAgfVxuXG4gICZfX2RhdGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcGFkZGluZzogMXB4O1xuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQxKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB9XG5cbiAgJl9fdGl0bGUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDAuMjVyZW0gMCAxLjVyZW07XG4gICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMTtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0KTtcbiAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihjb2xvcik7XG4gIH1cblxuICAmX19leGNlcnB0IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgJi0tdGFncyB7XG4gICAgQGV4dGVuZCAuc20tY2FyZDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICAgJl9fbGluayB7XG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIC5zbS1jYXJkLS10YWdzIHtcbiAgICAgICAgICAmX19pbWctY29udGFpbmVyOmFmdGVyIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICZfX2ltZy1jb250YWluZXIge1xuICAgICAgQGV4dGVuZCAuc20tY2FyZF9faW1nLWNvbnRhaW5lcjtcbiAgICAgICY6YWZ0ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGJhY2tncm91bmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX2ltZyB7XG4gICAgICBAZXh0ZW5kIC5zbS1jYXJkX19pbWc7XG4gICAgfVxuXG4gICAgJl9fbm8taW1nIHtcbiAgICAgIEBleHRlbmQgLnNtLWNhcmRfX25vLWltZztcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZCwgcHJpbWFyeSk7XG5cbiAgICAgICY6YWZ0ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX2ltZyxcbiAgICAmX19uby1pbWcge1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgfVxuXG4gICAgJl9fYm9keSB7XG4gICAgICBAZXh0ZW5kIC5zbS1jYXJkX19ib2R5O1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHotaW5kZXg6IDI7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihib3gtc2hhZG93KTtcbiAgICB9XG4gICAgJl9fdGl0bGUge1xuICAgICAgQGV4dGVuZCAuc20tY2FyZF9fdGl0bGU7XG4gICAgICBwYWRkaW5nOiAwLjI1cmVtIDAgMC4yNXJlbSAwLjVyZW07XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXNpemU6IDJyZW07XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0KTtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZCwgc3VyZmFjZTEpO1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcblxuICAgICAgQG1lZGlhIChtaW4td2lkdGg6IHZhcmlhYmxlcy4kdGFibGV0KSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX2RhdGUge1xuICAgICAgQGV4dGVuZCAuc20tY2FyZF9fZGF0ZTtcbiAgICAgIHBhZGRpbmc6IDAuMzc1cmVtIDAuNXJlbTtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHNlY29uZGFyeSk7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQsIHN1cmZhY2UxKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXJpYWJsZXMuJHNhbnM7XG4gICAgICBmb250LXNpemU6IDJyZW07XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG5cbiAgICAgIEBtZWRpYSAobWluLXdpZHRoOiB2YXJpYWJsZXMuJHRhYmxldCkge1xuICAgICAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmOm50aC1jaGlsZCgybikge1xuICAgICAgLnNtLWNhcmQge1xuICAgICAgICAmX19uby1pbWcge1xuICAgICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZCwgdGhyZWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICY6bnRoLWNoaWxkKDNuKSB7XG4gICAgICAuc20tY2FyZCB7XG4gICAgICAgICZfX25vLWltZyB7XG4gICAgICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChiYWNrZ3JvdW5kLCBmb3VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAmOm50aC1jaGlsZCg0bikge1xuICAgICAgLnNtLWNhcmQge1xuICAgICAgICAmX19uby1pbWcge1xuICAgICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZCwgZml2ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgJjpudGgtY2hpbGQoNW4pIHtcbiAgICAgIC5zbS1jYXJkIHtcbiAgICAgICAgJl9fbm8taW1nIHtcbiAgICAgICAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQsIHNlY29uZGFyeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuXG5ociB7XG4gIGhlaWdodDogMC4xNXJlbTtcbiAgbWFyZ2luOiAycmVtIDA7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICB0byByaWdodCxcbiAgICB2YXIoLS1zdXJmYWNlMiksXG4gICAgdmFyKC0tc3VyZmFjZTMpLFxuICAgIHZhcigtLXN1cmZhY2U0KSxcbiAgICB2YXIoLS1zdXJmYWNlMyksXG4gICAgdmFyKC0tc3VyZmFjZTIpXG4gICk7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG59XG4iLCJAdXNlICcuLi9hYnN0cmFjdHMvdmFyaWFibGVzJztcbkB1c2UgJy4uL2Fic3RyYWN0cy9mdW5jdGlvbnMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi5zbS1mb3JtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZm9udC1zaXplOiAxcmVtO1xuXG4gICZfX2lucHV0LFxuICB0ZXh0YXJlYSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZzogMC4yNXJlbTtcbiAgICBtYXJnaW46IDAuMjVyZW0gMDtcbiAgICBmb250LWZhbWlseTogdmFyaWFibGVzLiRzYW5zO1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dDEpO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgc3VyZmFjZTIpO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGFsbCk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQpO1xuICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChiYWNrZ3JvdW5kLWNvbG9yLCBzdXJmYWNlMyk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCBmdW5jdGlvbnMuY29sb3IocHJpbWFyeSk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1wcmltYXJ5KTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihhbGwpO1xuICAgIH1cbiAgfVxuXG4gIHRleHRhcmVhIHtcbiAgICBmbGV4LWJhc2lzOiBhdXRvO1xuICAgIGhlaWdodDogOHJlbTtcbiAgfVxuXG4gIC5zbS1idXR0b24tLWNvbG9yIHtcbiAgICBtYXJnaW46IDFyZW0gMCAwO1xuICB9XG59XG4iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEdyaWQgU3R5bGVzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbkBtaXhpbiBob3Jpem9udGFsLWNhcmQge1xuICAmX19saW5rIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5cbiAgJl9faW1nLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWluLWhlaWdodDogMTVyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICB9XG5cbiAgJl9faW1nIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cblxuICAmX19ib2R5IHtcbiAgICB3aWR0aDogY2FsYyg1MCUgLSAyLjVyZW0pO1xuICAgIGhlaWdodDogYXV0bztcbiAgfVxufVxuXG4uc20tZ3JpZCB7XG4gIC8vIElFIFN1cHBvcnRcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiB3cmFwO1xuICAuc20tY2FyZCB7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBtaW4td2lkdGg6IDE0LjM3NXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICB9XG5cbiAgQHN1cHBvcnRzIChnYXA6IDEuNXJlbSkge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ2FwOiAxLjVyZW07XG5cbiAgICAuc20tY2FyZCB7XG4gICAgICB3aWR0aDogaW5pdGlhbDtcbiAgICAgIG1pbi13aWR0aDogaW5pdGlhbDtcbiAgICAgIG1hcmdpbi1ib3R0b206IGluaXRpYWw7XG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgd2lkdGg6IGluaXRpYWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiB2YXJpYWJsZXMuJHRhYmxldCkge1xuICAuc20tY2FyZC0xIHtcbiAgICBncmlkLWFyZWE6IG9uZTtcbiAgfVxuXG4gIC5zbS1jYXJkLTIge1xuICAgIGdyaWQtYXJlYTogdHdvO1xuICB9XG5cbiAgLnNtLWNhcmQtMyB7XG4gICAgZ3JpZC1hcmVhOiB0aHJlZTtcbiAgfVxuXG4gIC5zbS1jYXJkLTQge1xuICAgIGdyaWQtYXJlYTogZm91cjtcbiAgfVxuXG4gIC5zbS1jYXJkLTUge1xuICAgIGdyaWQtYXJlYTogZml2ZTtcbiAgfVxuICAuc20tY2FyZC02IHtcbiAgICBncmlkLWFyZWE6IHNpeDtcbiAgfVxuICAuc20tY2FyZC03IHtcbiAgICBncmlkLWFyZWE6IHNldmVuO1xuICB9XG4gIC5zbS1jYXJkLTgge1xuICAgIGdyaWQtYXJlYTogZWlnaHQ7XG4gIH1cbiAgLnNtLWNhcmQtOSB7XG4gICAgZ3JpZC1hcmVhOiBuaW5lO1xuICB9XG4gIC5zbS1jYXJkLTEwIHtcbiAgICBncmlkLWFyZWE6IHRlbjtcbiAgfVxufVxuXG4vLyBNb2JpbGUgcGhvbmVzXG4uc20tZ3JpZC1jb250YWluZXIge1xuICBAZXh0ZW5kIC5zbS1ncmlkO1xuICBhbGlnbi1jb250ZW50OiBzdHJldGNoO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI5MnB4LCAxZnIpKTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDFyZW0gMDtcblxuICAmLS10YWdzIHtcbiAgICBAZXh0ZW5kIC5zbS1ncmlkLWNvbnRhaW5lcjtcbiAgfVxuXG4gICYtLWZvb3RlciB7XG4gICAgQGV4dGVuZCAuc20tZ3JpZC1jb250YWluZXI7XG4gICAgZ3JpZC1nYXA6IDJyZW07XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTtcblxuICAgIEBtZWRpYSAobWluLXdpZHRoOiB2YXJpYWJsZXMuJGxhcHRvcCkge1xuICAgICAgZ3JpZC1nYXA6IDJyZW07XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUYWJsZXRzXG5AbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiR0YWJsZXQpIHtcbiAgLnNtLWdyaWQtY29udGFpbmVyLTEge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDI5MnB4LCAxZnIpO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICdvbmUnO1xuICAgIC5zbS1jYXJkLTEge1xuICAgICAgLnNtLWNhcmQge1xuICAgICAgICBAaW5jbHVkZSBob3Jpem9udGFsLWNhcmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItMiB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICdvbmUgdHdvJztcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci0zIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczpcbiAgICAgICdvbmUgb25lJ1xuICAgICAgJ3R3byB0aHJlZSc7XG4gICAgLnNtLWNhcmQtMSB7XG4gICAgICAuc20tY2FyZCB7XG4gICAgICAgIEBpbmNsdWRlIGhvcml6b250YWwtY2FyZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci00IHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgJ29uZSB0d28nXG4gICAgICAndGhyZWUgZm91cic7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICB9XG5cbiAgLnNtLWdyaWQtY29udGFpbmVyLTUge1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6XG4gICAgICAnb25lIG9uZSdcbiAgICAgICd0d28gdGhyZWUnXG4gICAgICAnZm91ciBmaXZlJztcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItNiB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczpcbiAgICAgICdvbmUgb25lIG9uZSB0d28gdHdvIHR3bydcbiAgICAgICd0aHJlZSB0aHJlZSB0aHJlZSBmb3VyIGZvdXIgZm91cidcbiAgICAgICdmaXZlIGZpdmUgZml2ZSBzaXggc2l4IHNpeCc7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci03IHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6XG4gICAgICAnb25lIG9uZSBvbmUgb25lIG9uZSBvbmUnXG4gICAgICAndHdvIHR3byB0d28gdGhyZWUgdGhyZWUgdGhyZWUnXG4gICAgICAnZm91ciBmb3VyIGZvdXIgZml2ZSBmaXZlIGZpdmUnXG4gICAgICAnc2l4IHNpeCBzaXggc2V2ZW4gc2V2ZW4gc2V2ZW4nO1xuICAgIC5zbS1jYXJkLTEge1xuICAgICAgLnNtLWNhcmQge1xuICAgICAgICBAaW5jbHVkZSBob3Jpem9udGFsLWNhcmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuc20tZ3JpZC1jb250YWluZXItOCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgJ29uZSBvbmUgb25lIHR3byB0d28gdHdvJ1xuICAgICAgJ3RocmVlIHRocmVlIHRocmVlIGZvdXIgZm91ciBmb3VyJ1xuICAgICAgJ2ZpdmUgZml2ZSBmaXZlIHNpeCBzaXggc2l4J1xuICAgICAgJ3NldmVuIHNldmVuIHNldmVuIGVpZ2h0IGVpZ2h0IGVpZ2h0JztcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci05IHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgJ29uZSBvbmUgb25lIG9uZSBvbmUgb25lJ1xuICAgICAgJ3R3byB0d28gdHdvIHRocmVlIHRocmVlIHRocmVlJ1xuICAgICAgJ2ZvdXIgZm91ciBmb3VyIGZpdmUgZml2ZSBmaXZlJ1xuICAgICAgJ3NpeCBzaXggc2l4IHNldmVuIHNldmVuIHNldmVuJ1xuICAgICAgJ2VpZ2h0IGVpZ2h0IGVpZ2h0IG5pbmUgbmluZSBuaW5lJztcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICAgIC5zbS1jYXJkLTEge1xuICAgICAgLnNtLWNhcmQge1xuICAgICAgICBAaW5jbHVkZSBob3Jpem9udGFsLWNhcmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLnNtLWdyaWQtY29udGFpbmVyLTEwIHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgJ29uZSBvbmUgb25lIHR3byB0d28gdHdvJ1xuICAgICAgJ3RocmVlIHRocmVlIHRocmVlIGZvdXIgZm91ciBmb3VyJ1xuICAgICAgJ2ZpdmUgZml2ZSBmaXZlIHNpeCBzaXggc2l4J1xuICAgICAgJ3NldmVuIHNldmVuIHNldmVuIGVpZ2h0IGVpZ2h0IGVpZ2h0J1xuICAgICAgJ25pbmUgbmluZSBuaW5lIHRlbiB0ZW4gdGVuJztcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICB9XG59XG5cbi8vIExhcHRvcHMgYW5kIHVwXG5AbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgLnNtLWdyaWQtY29udGFpbmVyLTUge1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6XG4gICAgICAnb25lIG9uZSBvbmUgdHdvIHR3byB0d28nXG4gICAgICAndGhyZWUgdGhyZWUgZm91ciBmb3VyIGZpdmUgZml2ZSc7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci02IHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgJ29uZSBvbmUgb25lIG9uZSBvbmUgb25lJ1xuICAgICAgJ3R3byB0d28gdHdvIHRocmVlIHRocmVlIHRocmVlJ1xuICAgICAgJ2ZvdXIgZm91ciBmaXZlIGZpdmUgc2l4IHNpeCc7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyIDFmciAxZnIgMWZyIDFmcjtcbiAgICAuc20tY2FyZC0xIHtcbiAgICAgIC5zbS1jYXJkIHtcbiAgICAgICAgQGluY2x1ZGUgaG9yaXpvbnRhbC1jYXJkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLnNtLWdyaWQtY29udGFpbmVyLTcge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyIDFmciAxZnI7XG4gICAgZ3JpZC10ZW1wbGF0ZS1hcmVhczpcbiAgICAgICdvbmUgb25lIG9uZSBvbmUgb25lIG9uZSdcbiAgICAgICd0d28gdHdvIHRocmVlIHRocmVlIGZvdXIgZm91cidcbiAgICAgICdmaXZlIGZpdmUgc2l4IHNpeCBzZXZlbiBzZXZlbic7XG4gICAgLnNtLWNhcmQtMSB7XG4gICAgICAuc20tY2FyZCB7XG4gICAgICAgIEBpbmNsdWRlIGhvcml6b250YWwtY2FyZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci04IHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmciAxZnIgMWZyO1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6XG4gICAgICAnb25lIG9uZSBvbmUgdHdvIHR3byB0d28nXG4gICAgICAndGhyZWUgdGhyZWUgZm91ciBmb3VyIGZpdmUgZml2ZSdcbiAgICAgICdzaXggc2l4IHNldmVuIHNldmVuIGVpZ2h0IGVpZ2h0JztcbiAgfVxuXG4gIC5zbS1ncmlkLWNvbnRhaW5lci05IHtcbiAgICBncmlkLXRlbXBsYXRlLWFyZWFzOlxuICAgICAgJ29uZSBvbmUgb25lIG9uZSBvbmUgb25lJ1xuICAgICAgJ3R3byB0d28gdHdvIHRocmVlIHRocmVlIHRocmVlJ1xuICAgICAgJ2ZvdXIgZm91ciBmaXZlIGZpdmUgc2l4IHNpeCdcbiAgICAgICdzZXZlbiBzZXZlbiBlaWdodCBlaWdodCBuaW5lIG5pbmUnO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyIDFmciAxZnI7XG4gICAgLnNtLWNhcmQtMSB7XG4gICAgICAuc20tY2FyZCB7XG4gICAgICAgIEBpbmNsdWRlIGhvcml6b250YWwtY2FyZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAuc20tZ3JpZC1jb250YWluZXItMTAge1xuICAgIGdyaWQtdGVtcGxhdGUtYXJlYXM6XG4gICAgICAnb25lIG9uZSBvbmUgb25lIG9uZSBvbmUnXG4gICAgICAndHdvIHR3byB0aHJlZSB0aHJlZSBmb3VyIGZvdXInXG4gICAgICAnZml2ZSBmaXZlIHNpeCBzaXggc2V2ZW4gc2V2ZW4nXG4gICAgICAnZWlnaHQgZWlnaHQgbmluZSBuaW5lIHRlbiB0ZW4nO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyIDFmciAxZnI7XG4gICAgLnNtLWNhcmQtMSB7XG4gICAgICAuc20tY2FyZCB7XG4gICAgICAgIEBpbmNsdWRlIGhvcml6b250YWwtY2FyZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiQHVzZSAnLi4vYWJzdHJhY3RzL3ZhcmlhYmxlcyc7XG5AdXNlICcuLi9hYnN0cmFjdHMvbWl4aW5zJztcblxuQG1peGluIGxpbmsge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICY6YmVmb3JlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAtMXB4O1xuICAgIGxlZnQ6IDA7XG4gICAgei1pbmRleDogLTE7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAycHg7XG4gICAgY2xpcC1wYXRoOiBpbnNldCgwIDEwMCUgMCAwKTtcbiAgICBjb250ZW50OiAnJztcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHByaW1hcnkpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGNsaXAtcGF0aCk7XG4gIH1cblxuICAmOmhvdmVyOmJlZm9yZSB7XG4gICAgY2xpcC1wYXRoOiBpbnNldCgwIDAgMCAwKTtcbiAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihjbGlwLXBhdGgpO1xuICB9XG59XG5cbi5zbS1saW5rIHtcbiAgQGluY2x1ZGUgbGluaztcblxuICAmLnNtLW5hdi1jdXJyZW50OmJlZm9yZSB7XG4gICAgY2xpcC1wYXRoOiBub25lO1xuICB9XG59XG4iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEdlbmVyYWwgTW9kYWwgU3R5bGVzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi5zbS1jb250ZW50LXdyYXAge1xuICAmOmJlZm9yZSB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgei1pbmRleDogNztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgY29udGVudDogJyc7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgMzE1ZGVnLFxuICAgICAgcmdiYSgwLCAwLCAwLCAwLjUpIDAlLFxuICAgICAgcmdiYSgwLCAwLCAwLCAwLjMpIDEwMCVcbiAgICApO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzO1xuICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpO1xuICB9XG5cbiAgLnNtLWV4cGFuZGVkLW1vZGFsICYsXG4gIC5zbS1leHBhbmRlZC1tZW51ICYge1xuICAgICY6YmVmb3JlIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuICB9XG59XG5cbi5leHBhbmRlZC1tb2RhbCB7XG4gIC8vIHByZXZlbnQgZG91YmxlIHNjcm9sbCBiYXJzIHdoZW4gbW9kYWwgb3BlbnNcbiAgLy8gb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnNtLW1vZGFsIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICAvLyBvdmVyZmxvdy15OiBhdXRvO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbjtcbiAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dCk7XG4gIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgc3VyZmFjZTIpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiB2YXJpYWJsZXMuJGxhcHRvcCkge1xuICAgIGxlZnQ6IDUwJTtcbiAgICB3aWR0aDogMzgwcHg7XG4gICAgbWF4LXdpZHRoOiAxMDB2dztcbiAgICBtYXgtaGVpZ2h0OiA3NSU7XG4gICAgbWFyZ2luLXRvcDogMTV2bWluO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIGJveC1zaGFkb3c6IC0zcHggMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMCk7XG4gIH1cblxuICAmX19jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgfVxuXG4gICZbYXJpYS1leHBhbmRlZD0ndHJ1ZSddIHtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gICAgb3BhY2l0eTogMTtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICAgIGFuaW1hdGlvbjogcG9wdXAgMC4yNXMgZWFzZS1vdXQ7XG4gICAgfVxuICB9XG5cbiAgJl9faGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuc20tbmF2aWdhdGlvbiB7XG4gICAgICAmX191bCB7XG4gICAgICAgIG1hcmdpbjogMnJlbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmX19jbG9zZS1idG4ge1xuICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICAgIHdpZHRoOiAxLjVyZW07XG4gICAgaGVpZ2h0OiAxLjVyZW07XG4gICAgbWFyZ2luOiAwIDAgMXJlbSAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAwO1xuXG4gICAgJjpob3ZlciBzdmcge1xuICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChzdHJva2UsIHNlY29uZGFyeSk7XG4gICAgfVxuXG4gICAgc3ZnIHtcbiAgICAgIHdpZHRoOiAxLjVyZW07XG4gICAgICBoZWlnaHQ6IDEuNXJlbTtcbiAgICAgIHN0cm9rZS13aWR0aDogMztcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCB0ZXh0MSk7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihhbGwpO1xuICAgIH1cbiAgfVxuXG4gICZfX3RpdGxlIHtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICAmX19mb290ZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgYSB7XG4gICAgICB3aWR0aDogMnJlbTtcbiAgICAgIGhlaWdodDogMnJlbTtcbiAgICAgIG1hcmdpbjogMC41cmVtO1xuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChzdHJva2UsIHRleHQyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VhcmNoIFN0eWxlc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AdXNlICcuLi9hYnN0cmFjdHMvdmFyaWFibGVzJztcbkB1c2UgJy4uL2Fic3RyYWN0cy9mdW5jdGlvbnMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi5zbS1zZWFyY2gge1xuICAmX19tb2RhbCB7XG4gICAgLnNtLW1vZGFsIHtcbiAgICAgICZfX2NvbnRhaW5lciB7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICAgIH1cbiAgICAgICZfX2hlYWRlciB7XG4gICAgICAgIG1heC13aWR0aDogNjAwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgfVxuICAgIH1cbiAgICAuc20tc21hbGwtaGVhZGVyIHtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgfVxuICB9XG4gICZfX2J1dHRvbiB7XG4gICAgJi0tbG9hZGluZyB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMXMgbGluZWFyIGluZmluaXRlO1xuICAgICAgLmxvYWRpbmcgJiB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgdHJhbnNmb3JtOiBub25lO1xuICAgICAgfVxuICAgIH1cbiAgICAmLS1jb250ZW50IHtcbiAgICAgIC5sb2FkaW5nICYge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX2lucHV0LWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBpbnB1dCxcbiAgICBidXR0b24ge1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgfVxuXG4gICAgaW5wdXQge1xuICAgICAgZmxleDogMjtcbiAgICAgIG1hcmdpbi1yaWdodDogMC4yNXJlbTtcbiAgICB9XG5cbiAgICBidXR0b24ge1xuICAgICAgZmxleDogMTtcbiAgICB9XG4gIH1cbn1cblxuQGtleWZyYW1lcyByb3RhdGUge1xuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxdHVybik7XG4gIH1cbn1cblxuLnNtLXNlYXJjaC1yZXN1bHRzIHtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogNjAwcHg7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAxcmVtIGF1dG8gMDtcblxuICAmX19jb250YWluZXIge1xuICAgIHBhZGRpbmctYm90dG9tOiAxcmVtO1xuICB9XG5cbiAgLnNtLXNtYWxsLWhlYWRlciB7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgfVxuXG4gICZfX2l0ZW0ge1xuICAgIG1hcmdpbi10b3A6IDFyZW07XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBib3JkZXItcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgICBib3gtc2hhZG93OiB2YXJpYWJsZXMuJGJveC1zaGFkb3c7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChiYWNrZ3JvdW5kLWNvbG9yLCBzdXJmYWNlMyk7XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tdG9wOiAwLjI1cmVtO1xuICAgIH1cbiAgfVxuXG4gICZfX2xpbmsge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwYWRkaW5nOiAxcmVtO1xuICAgIGJvcmRlcjogM3B4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcmlhYmxlcy4kcmFkaXVzO1xuICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4ycywgY29sb3IgMC4ycztcblxuICAgICY6aG92ZXIge1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IGZ1bmN0aW9ucy5jb2xvcihwcmltYXJ5KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1wcmltYXJ5KTtcblxuICAgICAgLnNtLXNlYXJjaC1yZXN1bHRzIHtcbiAgICAgICAgJl9fdGl0bGUge1xuICAgICAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHByaW1hcnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJl9fZGF0ZSB7XG4gICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dDEpO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gIH1cblxuICAmX190aXRsZSB7XG4gICAgbWFyZ2luOiAwLjI1cmVtIDA7XG4gICAgZm9udC1mYW1pbHk6IHZhcmlhYmxlcy4kc2VyaWY7XG4gICAgZm9udC1zaXplOiAxLjFyZW07XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGNvbG9yKTtcbiAgfVxuXG4gICZfX2V4Y2VycHQge1xuICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcbiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDM7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dDIpO1xuICB9XG59XG4iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlIEJhclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AdXNlICcuLi9hYnN0cmFjdHMvdmFyaWFibGVzJztcbkB1c2UgJy4uL2Fic3RyYWN0cy9taXhpbnMnO1xuXG4uc20tcG9zdC1zaGFyZS1iYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGJvdHRvbTogMDtcbiAgei1pbmRleDogNTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQyKTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHN1cmZhY2UzKTtcbiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkIHZhcigtLXN1cmZhY2U0KTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogdmFyaWFibGVzLiRsYXB0b3ApIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgJl9fbGluayB7XG4gICAgd2lkdGg6IDIuNXJlbTtcbiAgICBoZWlnaHQ6IDIuNXJlbTtcbiAgICBwYWRkaW5nOiAwLjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogdmFyaWFibGVzLiRyYWRpdXM7XG4gICAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oYmFja2dyb3VuZC1jb2xvcik7XG5cbiAgICBzdmcge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCB0ZXh0Mik7XG4gICAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihzdHJva2UpO1xuICAgIH1cblxuICAgIEBtZWRpYSAobWluLXdpZHRoOiB2YXJpYWJsZXMuJGxhcHRvcCkge1xuICAgICAgd2lkdGg6IDEuOHJlbTtcbiAgICAgIGhlaWdodDogMS44cmVtO1xuICAgICAgcGFkZGluZzogMC4zNnJlbTtcbiAgICB9XG4gIH1cblxuICAmX19saW5rLS10d2l0dGVyIHtcbiAgICBAZXh0ZW5kIC5zbS1wb3N0LXNoYXJlLWJhcl9fbGluaztcblxuICAgICY6aG92ZXIsXG4gICAgJjphY3RpdmUge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyaWFibGVzLiR0dztcbiAgICAgIHN2ZyB7XG4gICAgICAgIHN0cm9rZTogI2ZmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmX19saW5rLS1mYWNlYm9vayB7XG4gICAgQGV4dGVuZCAuc20tcG9zdC1zaGFyZS1iYXJfX2xpbms7XG5cbiAgICAmOmhvdmVyLFxuICAgICY6YWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcmlhYmxlcy4kZmI7XG4gICAgICBzdmcge1xuICAgICAgICBzdHJva2U6ICNmZmY7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJl9fbGluay0tbGlua2VkaW4ge1xuICAgIEBleHRlbmQgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXJpYWJsZXMuJGxpO1xuICAgICAgc3ZnIHtcbiAgICAgICAgc3Ryb2tlOiAjZmZmO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX2xpbmstLWNvcHkge1xuICAgIEBleHRlbmQgLnNtLXBvc3Qtc2hhcmUtYmFyX19saW5rO1xuICAgICY6aG92ZXIsXG4gICAgJjphY3RpdmUge1xuICAgICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChiYWNrZ3JvdW5kLWNvbG9yLCBwcmltYXJ5KTtcbiAgICAgIHN2ZyB7XG4gICAgICAgIHN0cm9rZTogI2ZmZjtcbiAgICAgICAgOnJvb3RbY29sb3ItbW9kZT0nZGFyayddICYge1xuICAgICAgICAgIHN0cm9rZTogIzAwMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLnNtLXNraXAtdG8tY29udGVudCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1MCU7XG4gIHotaW5kZXg6IDE1O1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMsIHRyYW5zZm9ybSAwLjI1cyBlYXNlLW91dCwgb3BhY2l0eSAwLjI1cztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNTAlLCAtMTI1JSwgMCk7XG5cbiAgJjpmb2N1cyB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMgZWFzZS1pbiwgb3BhY2l0eSAwLjI1cztcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC01MCUsIDAuNXJlbSwgMCk7XG4gIH1cbn1cbiIsIkB1c2UgJy4uL2Fic3RyYWN0cy9taXhpbnMnIGFzICo7XG5cbi5zbS1zbWFsbC1oZWFkZXIsXG5sYWJlbCB7XG4gIG1hcmdpbi10b3A6IDFyZW07XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBAaW5jbHVkZSBjb2xvci1tYXAoY29sb3IsIHRleHQzKTtcbn1cbiIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU1ZHIEljb24gQ29sb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbkBtaXhpbiBzdmcoJHNtKSB7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oYmFja2dyb3VuZC1jb2xvcik7XG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRzbTtcbiAgICBzdmcge1xuICAgICAgc3Ryb2tlOiAjZmZmO1xuICAgIH1cbiAgfVxuICBzdmcge1xuICAgIGZpbGw6IG5vbmU7XG4gICAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gICAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oc3Ryb2tlKTtcbiAgfVxufVxuXG4uYWNhZGVtaWEgc3ZnIHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xuICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihhbGwpO1xuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGZpbGwsIHByaW1hcnkpO1xuICB9XG59XG5cbi5mYWNlYm9vayB7XG4gIEBpbmNsdWRlIHN2Zyh2YXJpYWJsZXMuJGZiKTtcbn1cblxuLmdpdGh1YiB7XG4gIEBpbmNsdWRlIHN2Zyh2YXJpYWJsZXMuJGdoKTtcbn1cblxuLmdpdGxhYiB7XG4gIEBpbmNsdWRlIHN2Zyh2YXJpYWJsZXMuJGdsKTtcbn1cblxuLmluc3RhZ3JhbSB7XG4gIEBpbmNsdWRlIHN2Zyh2YXJpYWJsZXMuJGlnKTtcbn1cblxuLmxpbmtlZGluIHtcbiAgQGluY2x1ZGUgc3ZnKHZhcmlhYmxlcy4kbGkpO1xufVxuXG4ucnNzIHtcbiAgQGluY2x1ZGUgc3ZnKHZhcmlhYmxlcy4kcnMpO1xufVxuXG4udHdpdGNoIHtcbiAgQGluY2x1ZGUgc3ZnKHZhcmlhYmxlcy4kY2gpO1xufVxuXG4udHdpdHRlciB7XG4gIEBpbmNsdWRlIHN2Zyh2YXJpYWJsZXMuJHR3KTtcbn1cblxuLm1hcCBzdmcsXG4ud2Vic2l0ZSBzdmcge1xuICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGFsbCk7XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCBwcmltYXJ5KTtcbiAgfVxufVxuXG4ud2Vic2l0ZSB7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nOiAwLjI1cmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXJpYWJsZXMuJHJhZGl1cztcbiAgQGluY2x1ZGUgbWl4aW5zLnRyYW5zaXRpb24oYmFja2dyb3VuZC1jb2xvcik7XG4gICY6aG92ZXIge1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoYmFja2dyb3VuZC1jb2xvciwgcHJpbWFyeSk7XG4gICAgc3ZnIHtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoc3Ryb2tlLCB0ZXh0SW52ZXJzZSk7XG4gICAgfVxuICB9XG4gIHN2ZyB7XG4gICAgZmlsbDogbm9uZTtcbiAgICBzdHJva2U6IGN1cnJlbnRDb2xvcjtcbiAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihzdHJva2UpO1xuICB9XG59XG5cbi55b3V0dWJlIHtcbiAgQGluY2x1ZGUgc3ZnKHZhcmlhYmxlcy4keXQpO1xufVxuIiwiQHVzZSAnLi4vYWJzdHJhY3RzL3ZhcmlhYmxlcyc7XG5AdXNlICcuLi9hYnN0cmFjdHMvbWl4aW5zJztcblxuLnNtLXRhZyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dDIpO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihjb2xvcik7XG5cbiAgJjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnIyc7XG4gIH1cblxuICAmOm5vdCguc20tY2FyZCAmKTpob3ZlciB7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmNvbG9yLW1hcChjb2xvciwgdGV4dCk7XG4gIH1cblxuICAuc20tY2FyZCAmIHtcbiAgICBtYXJnaW4tdG9wOiBhdXRvO1xuICB9XG5cbiAgJjpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICAuc20tcG9zdF9fdGFnLWJhciAmIHtcbiAgICAgIG1hcmdpbi1yaWdodDogMC41cmVtO1xuICAgIH1cbiAgfVxufVxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb3IgSG9tZSwgSW5kZXgsIGFuZCBUYWcgcGFnZXNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG4uc20tbWFpbiB7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG5cbiAgJi0taW5kZXgge1xuICAgIEBleHRlbmQgLnNtLW1haW47XG4gICAgQGluY2x1ZGUgbWl4aW5zLm5hdmJhcihtYXJnaW4tdG9wKTtcbiAgfVxuXG4gICZfX291dGVyLWNvbnRhaW5lciB7XG4gICAgQGluY2x1ZGUgbWl4aW5zLm91dGVyLWNvbnRhaW5lcjtcbiAgfVxuXG4gICZfX2lubmVyLWNvbnRhaW5lciB7XG4gICAgQGluY2x1ZGUgbWl4aW5zLmlubmVyLWNvbnRhaW5lcjtcbiAgfVxuXG4gICZfX2hlYWRlciB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIG1hcmdpbjogMDtcbiAgfVxuXG4gICZfX3JlYWQtbW9yZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHQpO1xuICAgIEBpbmNsdWRlIG1peGlucy50cmFuc2l0aW9uKGNvbG9yKTtcblxuICAgIGgyIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHNlY29uZGFyeSk7XG4gICAgfVxuICB9XG59XG4iLCJAdXNlICcuLi9hYnN0cmFjdHMvdmFyaWFibGVzJztcbkB1c2UgJy4uL2Fic3RyYWN0cy9taXhpbnMnO1xuXG4uc20taGVybyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMjcuNXJlbTtcbiAgQGluY2x1ZGUgbWl4aW5zLm5hdmJhcihtYXJnaW4tdG9wKTtcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGJhY2tncm91bmQtY29sb3IsIHN1cmZhY2UxKTtcblxuICBAbWVkaWEgKG1pbi1oZWlnaHQ6IDYwcmVtKSBhbmQgKG1pbi13aWR0aDogdmFyaWFibGVzLiRkZXNrdG9wKSB7XG4gICAgaGVpZ2h0OiAzNy41cmVtO1xuICB9XG5cbiAgJjo6YmVmb3JlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChyZ2JhKCMwMDAsIDAuNSksIHJnYmEoIzAwMCwgMC43NSkpO1xuICB9XG5cbiAgJl9fdGV4dC1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDUwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIH1cblxuICAmX19zaXRlLXRpdGxlIHtcbiAgICBtYXJnaW46IDAgMCAwLjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMTtcbiAgICBjb2xvcjogI2ZmZmZmZjtcbiAgfVxuXG4gICZfX3NpdGUtZGVzY3JpcHRpb24ge1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICBjb2xvcjogcmdiYSgyMzgsIDIzOCwgMjM4KTtcbiAgfVxufVxuIiwiQHVzZSAnLi4vYWJzdHJhY3RzL3ZhcmlhYmxlcyc7XG5AdXNlICcuLi9hYnN0cmFjdHMvbWl4aW5zJztcbkB1c2UgJy4uL2Fic3RyYWN0cy9mdW5jdGlvbnMnO1xuXG4uc20tYXV0aG9yIHtcbiAgJl9faGVhZGVyIHtcbiAgICBtYXgtd2lkdGg6IHZhcmlhYmxlcy4kbGFwdG9wO1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICB9XG5cbiAgJl9faW1nLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtYXJnaW4tYm90dG9tOiAycmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcblxuICAgIEBpbmNsdWRlIG1peGlucy5yZXNwb25kLWFib3ZlKHZhcmlhYmxlcy4kdGFibGV0KSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cblxuICAgICY6YmVmb3JlIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgICA0NWRlZyxcbiAgICAgICAgZnVuY3Rpb25zLmNvbG9yKHByaW1hcnkpLFxuICAgICAgICBmdW5jdGlvbnMuY29sb3Ioc2Vjb25kYXJ5KVxuICAgICAgKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWdyYWRpZW50KTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICB9XG4gIH1cblxuICAmX19pbWcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAxO1xuICAgIHdpZHRoOiB2YXJpYWJsZXMuJGJhc2U7XG4gICAgaGVpZ2h0OiB2YXJpYWJsZXMuJGJhc2U7XG4gICAgbWFyZ2luOiAwLjI1cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBib3gtc2hhZG93OiB2YXJpYWJsZXMuJGJveC1zaGFkb3c7XG4gIH1cblxuICAmX19uby1pbWcge1xuICAgIEBleHRlbmQgLnNtLWF1dGhvcl9faW1nO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgNDVkZWcsXG4gICAgICBmdW5jdGlvbnMuY29sb3IocHJpbWFyeSksXG4gICAgICBmdW5jdGlvbnMuY29sb3Ioc2Vjb25kYXJ5KVxuICAgICk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tZ3JhZGllbnQpO1xuXG4gICAgc3ZnIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDkwJTtcbiAgICAgIGhlaWdodDogOTAlO1xuICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICBmaWxsOiB0cmFuc3BhcmVudDtcbiAgICAgIEBpbmNsdWRlIG1peGlucy5jb2xvci1tYXAoY29sb3IsIHRleHRJbnZlcnNlKTtcbiAgICB9XG4gIH1cblxuICAmX190ZXh0IHtcbiAgICBAaW5jbHVkZSBtaXhpbnMucmVzcG9uZC1hYm92ZSh2YXJpYWJsZXMuJHRhYmxldCkge1xuICAgICAgbWFyZ2luLWxlZnQ6IDRyZW07XG4gICAgfVxuICB9XG5cbiAgJl9fbmFtZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGZvbnQtZmFtaWx5OiB2YXJpYWJsZXMuJHNlcmlmO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIH1cblxuICAmX19sb2NhdGlvbiBzdmc6aG92ZXIge1xuICAgIHN0cm9rZTogY3VycmVudENvbG9yO1xuICB9XG5cbiAgJl9fbWV0YSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgYSB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3ZnIHtcbiAgICAgIHdpZHRoOiAxcmVtO1xuICAgICAgaGVpZ2h0OiAxcmVtO1xuXG4gICAgICBAaW5jbHVkZSBtaXhpbnMudHJhbnNpdGlvbihhbGwpO1xuICAgIH1cbiAgfVxuXG4gICZfX2xvY2F0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICBwIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwLjI1cmVtO1xuICAgIH1cblxuICAgIHN2ZyB7XG4gICAgICB3aWR0aDogMXJlbTtcbiAgICAgIGhlaWdodDogMXJlbTtcbiAgICB9XG4gIH1cbn1cbiIsIkB1c2UgJy4uL2Fic3RyYWN0cy92YXJpYWJsZXMnO1xuQHVzZSAnLi4vYWJzdHJhY3RzL21peGlucyc7XG5cbi5zbS1tYWluLS1lcnJvciB7XG4gICZfX2hlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQtZmFtaWx5OiB2YXJpYWJsZXMuJHNlcmlmO1xuICAgIGZvbnQtc2l6ZTogNHJlbTtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gICZfX3RleHQge1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBAaW5jbHVkZSBtaXhpbnMuY29sb3ItbWFwKGNvbG9yLCB0ZXh0MSk7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file +/*# sourceMappingURL=app.css.map*/ \ No newline at end of file diff --git a/assets/built/app.css.map b/assets/built/app.css.map new file mode 100644 index 00000000..406c3e80 --- /dev/null +++ b/assets/built/app.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://smart/./src/scss/base/_reset.scss","webpack://smart/./src/scss/themes/_sm_theme.scss","webpack://smart/./src/scss/base/_default.scss","webpack://smart/./src/scss/abstracts/_mixins.scss","webpack://smart/./src/scss/base/_fonts.scss","webpack://smart/./src/scss/base/_typography.scss","webpack://smart/./src/scss/abstracts/_variables.scss","webpack://smart/./src/scss/base/_animations.scss","webpack://smart/./src/scss/layout/_container.scss","webpack://smart/./src/scss/layout/_footer.scss","webpack://smart/./src/scss/layout/_menu.scss","webpack://smart/./src/scss/layout/_navbar.scss","webpack://smart/./src/scss/layout/_navigation.scss","webpack://smart/./src/scss/layout/_pagination.scss","webpack://smart/./src/scss/components/_buttons.scss","webpack://smart/./src/scss/components/_card.scss","webpack://smart/./src/scss/components/_divider.scss","webpack://smart/./src/scss/components/_form.scss","webpack://smart/./src/scss/components/_grid.scss","webpack://smart/./src/scss/components/_link.scss","webpack://smart/./src/scss/components/_modal.scss","webpack://smart/./src/scss/components/_search.scss","webpack://smart/./src/scss/components/_share.scss","webpack://smart/./src/scss/components/_skip.scss","webpack://smart/./src/scss/components/_small-header.scss","webpack://smart/./src/scss/components/_svg.scss","webpack://smart/./src/scss/components/_tag.scss","webpack://smart/./src/scss/pages/_main.scss","webpack://smart/./src/scss/pages/_hero.scss","webpack://smart/./src/scss/pages/_author.scss","webpack://smart/./src/scss/pages/_error.scss"],"names":[],"mappings":"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,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,gBACE,wBnBRC,CmBSD,oBACE,YAGJ,cACE,UACA,oBtByBF,sBsBPF,QA5BE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,cACE,wBnBPC,CmBQD,kBACE,YAGJ,YACE,UACA,oBtByBF,sBsBHF,QAhCE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,cACE,wBnBNC,CmBOD,kBACE,YAGJ,YACE,UACA,oBtByBF,sBsBCF,WApCE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,iBACE,wBnBLC,CmBMD,qBACE,YAGJ,eACE,UACA,oBtByBF,sBsBKF,UAxCE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,gBACE,wBnBJC,CmBKD,oBACE,YAGJ,cACE,UACA,oBtByBF,sBsBSF,KA5CE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,WACE,wBnBHC,CmBID,eACE,YAGJ,SACE,UACA,oBtByBF,sBsBaF,QAhDE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,cACE,wBnBTC,CmBUD,kBACE,YAGJ,YACE,UACA,oBtByBF,sBsBiBF,SApDE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,eACE,wBnBFC,CmBGD,mBACE,YAGJ,aACE,UACA,oBtByBF,sBsBqBF,sBAEE,iBACA,oBtBxBA,mBsB0BA,oEtB7DE,6CsBmEJ,SAIE,iBnBrBO,CmBmBP,cACA,etBnCA,gCsBiCA,YtBjCA,CsBsCA,etBzEE,iEsB2EA,mBtB3EA,iDsB+EF,aACE,UACA,oBtB9CF,sBsBmDF,SAtFE,iBnBkDO,CmBpDP,cACA,etBoCA,gCsBtCA,YtBsCA,CsBjCA,eACE,oBnBDC,CmBED,mBACE,YAGJ,aACE,UACA,oBtByBF,sBuB1CF,QvBOI,yCuBNF,qBAEA,gBAEA,oBADA,yBvBsCA,qBuBlCA,eACE,YAGF,oCvBLE,wCuBSF,iBACE,gBAIA,2CACE,mBCrBN,yBAEE,kBADA,UACA,CAEA,gBxBiEA,mBAEA,yBwBnEA,gBxBoEE,mBwB/DF,0BxBmFA,aAFA,kBACA,UACA,CAhCA,8CwBnDA,0BxBsFE,wBA/CF,yBwBvCA,0BxB0FE,wBwBtFF,0BxByEA,mBADA,gBACA,CwBrEA,iBACE,eACA,SAGF,oBxBhBE,wCwBiBA,qBxBkBF,qBwBdE,uBACE,SAGF,0BxBzBA,6CyBPJ,SzBOI,kEyBAF,wBACA,sBALA,eAEA,mBzBiEA,mByBhEA,gBALA,kBACA,UzBKE,CAiEF,yByBxEF,SzByEI,mByB9DF,+CAXF,SAYI,gBAGF,gBAOE,2DADA,WADA,YAFA,OAFA,kBACA,MAEA,UAGA,CAGF,yBACE,kBACA,QAEA,2BADA,UACA,CAGF,qBAGE,WADA,gBADA,gBAEA,CAGF,2BAIE,WAFA,kBACA,gBAFA,QAGA,CCxCF,mBAEE,cADA,gBACA,CAGF,0BAIE,mBAGA,kBALA,aACA,cAEA,uBACA,mBALA,iBAMA,C1BmCF,wB0B1CA,0BAUI,iBAGF,iCAOE,kDAKA,2BACA,kBAPA,WADA,YAFA,OAFA,kBACA,MAEA,UASA,CAIJ,mCAME,kBACA,iEvBmBS,CuBtBT,WvBeG,CuBdH,cAJA,kBAEA,UvBgBG,CuBjBH,SvBwBS,CuBhBX,mBAGE,kDAKA,2BANA,eAMA,CAEA,uBAKE,iB1BvDF,+C0BmDE,cAEA,WACA,cAFA,S1BpDF,CA0CF,wB0BkBA,iBAEI,kBAIJ,iBAEE,yCvBjCI,CuBkCJ,gBAFA,QAEA,CAGF,+BACE,oBAGF,iBAEE,mBADA,YACA,CAEA,mBAEE,cADA,kBACA,CAEA,8BACE,eAIJ,qBAEE,Y1BxDJ,mB0BuDI,U1BvDJ,C0B8DA,qBAEE,mBADA,YACA,CAEA,uBACE,mBAGF,yBAEE,YADA,UACA,CCjHJ,yBAGE,yCxBsCI,CwBrCJ,eACA,gBAHA,gBADA,kBAKA,kBAGF,sB3BHE,yC2BIA,iBACA,iB3BLA,C","file":"app.css","sourcesContent":["*,\n*:before,\n*:after {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n}\n\nbutton {\n cursor: pointer;\n background: none;\n border: none;\n}\n","@use 'sass:color';\n\n// Bright Mode\n:root[color-mode='light'] {\n --text: #0a0a0a;\n --textInverse: #f5f5f5;\n --text1: #171717;\n --text2: #39393a;\n --text3: #5a5a5c;\n --text4: #9ea0a2;\n --surface: hsl(0, 0%, 92%);\n --surface1: hsl(0, 0%, 94%);\n --surface2: hsl(0, 0%, 96%);\n --surface3: hsl(0, 0%, 98%);\n --surface4: #ffffff;\n --primary: hsl(216, 85%, 34%);\n --secondary: #a4002e;\n --three: #643791;\n --four: #8b1c76;\n --five: #a00053;\n --success: #48a00d;\n --error: #a40000;\n --error-hover: hsl(0, 100%, 16%);\n --gradient: linear-gradient(to right top, #0d48a0, hsl(226, 85%, 18%));\n}\n\n// Dark Mode\n:root[color-mode='dark'] {\n --text: #f5f5f5;\n --textInverse: #0a0a0a;\n --text1: #e8e9e9;\n --text2: #c6c6c7;\n --text3: #a5a5a7;\n --text4: #616365;\n --surface: #181818;\n --surface1: #202020;\n --surface2: #282828;\n --surface3: #303030;\n --surface4: #383838;\n --primary: #80deea;\n --secondary: #ffab91;\n --three: #8cdbbf;\n --four: #b4d195;\n --five: #e0c081;\n --success: #b4d195;\n --error: hsl(0, 100%, 78%);\n --error-hover: hsl(0, 100%, 68%);\n --gradient: linear-gradient(\n to right top,\n hsl(187, 72%, 71%),\n hsl(187, 92%, 91%)\n );\n}\n","@use '../abstracts/mixins';\n\n//-------------------------------------------\n// Custom Properties\n//-------------------------------------------\n@use '../themes/_sm_theme';\n//-------------------------------------------\n// Global Styles\n//-------------------------------------------\nhtml {\n @include mixins.color-map(color, text);\n @include mixins.color-map(background-color, surface1);\n scroll-behavior: smooth;\n}\n\nstrong {\n font-weight: 700;\n}\n\nem {\n font-style: italic;\n}\n\n//-------------------------------------------\n// Psuedoselectors\n//-------------------------------------------\n:link {\n color: currentColor;\n text-decoration: none;\n}\n\n:visited {\n color: currentColor;\n}\n\n::selection {\n color: #111;\n background-color: #e0c081;\n}\n\n:target {\n @include mixins.navbar(padding-top);\n @include mixins.navbar(margin-top, $negative: true);\n}\n\n:focus {\n outline-width: 1px;\n outline-style: dotted;\n @include mixins.color-map(outline-color, text3);\n outline-offset: 3px;\n}\n\na:active,\nbutton:active {\n outline: none;\n}\n\n::-moz-focus-inner {\n border: none;\n outline: none;\n}\n","@use 'variables';\n@use 'functions';\n//-------------------------------------------\n// Color\n//-------------------------------------------\n@mixin color-map($property, $color) {\n @if $color == transparent {\n #{$property}: $color;\n } @else {\n #{$property}: functions.color($color);\n #{$property}: var(--#{$color}, functions.color($color));\n }\n}\n\n@mixin outline {\n outline-width: 2px;\n outline-style: solid;\n @include color-map(outline-color, primary);\n outline-offset: 1px;\n}\n\n@mixin mesh {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n content: '';\n background-color: var(--secondary);\n background-image: radial-gradient(var(--primary) 0, transparent 63%),\n radial-gradient(var(--three) 0, transparent 42%),\n radial-gradient(var(--four) 0, transparent 59%),\n radial-gradient(var(--five) 0, transparent 50%),\n radial-gradient(var(--secondary) 0, transparent 55%);\n background-repeat: no-repeat;\n background-position: -16% -35%, -21% -45%, 5% 10%, 19% 35%, 25% 19%;\n background-size: 87% 65%, 62% 84%, 69% 68%, 62% 97%, 65% 60%;\n transition: background-position 2s;\n transform: scale(3);\n}\n//-------------------------------------------\n// Transition\n//-------------------------------------------\n@mixin transition($property) {\n transition: $property 0.2s;\n}\n\n//-------------------------------------------\n// Breakpoints\n//-------------------------------------------\n@mixin respond-above($breakpoint) {\n @media (min-width: $breakpoint) {\n @content;\n }\n}\n\n@mixin respond-below($breakpoint) {\n @media (max-width: $breakpoint) {\n @content;\n }\n}\n\n@mixin respond-between($min, $max) {\n @media (min-width: $min) and (max-width: $max - 1) {\n @content;\n }\n}\n\n//-------------------------------------------\n// Layout\n//-------------------------------------------\n@mixin navbar($property, $negative: false, $increase: 0) {\n #{$property}: 3.25rem + $increase;\n\n @media (min-width: variables.$laptop) {\n #{$property}: 5.5rem + $increase;\n }\n\n @if $negative {\n #{$property}: -3.25rem + -$increase;\n\n @media (min-width: variables.$laptop) {\n #{$property}: -5.5rem + -$increase;\n }\n }\n}\n\n@mixin inner-container {\n max-width: variables.$laptop;\n margin: 0 auto 1rem;\n}\n\n@mixin outer-container {\n position: relative;\n width: 100%;\n padding: 1rem;\n\n @include respond-between(variables.$tablet, variables.$laptop) {\n padding: 1rem 3rem 2rem;\n }\n\n @include respond-above(variables.$laptop) {\n padding: 1rem 4rem 2rem;\n }\n}\n\n@mixin grid {\n display: grid;\n gap: 1.5rem;\n}\n","html {\n font-size: 1rem;\n font-size: clamp(\n 1rem,\n 0.9090909090909091rem + 0.45454545454545453vw,\n 1.25rem\n );\n font-weight: 400;\n line-height: 1.5;\n text-rendering: optimizeLegibility;\n}\n","//-------------------------------------------\n// Tyopgraphy\n//-------------------------------------------\n@use '../abstracts/variables';\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin: 3rem 0 1.38rem;\n font-family: variables.$serif;\n font-weight: 400;\n font-variant-ligatures: common-ligatures;\n line-height: 1.2;\n}\n\nh1 {\n margin-top: 0;\n font-size: 2.488rem;\n}\n\nh2 {\n font-size: 2.074rem;\n}\n\nh3 {\n font-size: 1.728rem;\n}\n\nh4 {\n font-size: 1.44rem;\n}\n\nh5 {\n font-size: 1.2rem;\n}\n\nh6 {\n font-size: 1.1rem;\n}\n\nsmall,\n.sm-text-small {\n font-size: 0.833rem;\n}\n","//-------------------------------------------\n// Colors\n//-------------------------------------------\n// Social Media\n$ch: #6441a5; //Twitch\n$fb: #1877f2;\n$gh: #4078c0;\n$gl: #fca326;\n$ig: #c13584;\n$li: #0077b5;\n$rs: #f26522; //RSS\n$tw: #1da1f2;\n$yt: #ff0000;\n\n// Fallbacks (defaults to Dark Mode)\n$colors: (\n 'text': #f5f5f5,\n 'text1': #e8e9e9,\n 'text2': #c7c7c8,\n 'text3': #a5a5a7,\n 'text4': #616264,\n 'surface': #181818,\n 'surface1': #202020,\n 'surface1-75': rgba(33, 33, 33, 0.75),\n 'surface2': #282828,\n 'surface3': #303030,\n 'surface4': #383838,\n 'primary': #80deea,\n 'secondary': #ffab91,\n 'three': #8cdbbf,\n 'four': #b4d195,\n 'five': #e0c081,\n 'success': #b4d195,\n 'error': hsl(0, 100%, 78%),\n 'textInverse': #0a0a0a,\n 'gradient':\n linear-gradient(to right top, #80deea, #8cdbbf, #b4d195, #e0c081, #ffab91),\n);\n\n//-------------------------------------------\n// Fonts\n//-------------------------------------------\n$sans: 'Lato', -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, oxygen,\n ubuntu, cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n\n$serif: 'DM Serif Text', georgia, serif;\n$mono: 'JetBrains Mono', 'Roboto Mono', 'IBM Plex Mono', 'Cascadia Code',\n 'Droid Sans Mono', 'Fira Mono', 'Fira Code', consolas, monospace;\n\n//-------------------------------------------\n// Sizes, Breakpoints, Variables\n//-------------------------------------------\n\n// Breakpoints\n$tablet: 600px;\n$laptop: 1024px;\n$desktop: 1280px;\n\n// Sizes\n$base: 9rem;\n$radius: 4px;\n\n// Box Shadow\n$box-shadow-large: 3px 3px 4px rgba(0, 0, 0, 0.12),\n -3px 2px 4px rgba(0, 0, 0, 0.12), 5px 10px 15px rgba(0, 0, 0, 0.14),\n -5px 5px 15px rgba(0, 0, 0, 0.14);\n$box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n\n$transition: 0.2s;\n","@keyframes popup {\n 0% {\n opacity: 0;\n transform: translate(-50%, 20px) scale(0.8);\n }\n 75% {\n opacity: 1;\n }\n 100% {\n transform: translate(-50%, 0) scale(1);\n }\n}\n\n@keyframes slide-in {\n 0% {\n top: -100%;\n opacity: 0;\n }\n 100% {\n top: 1rem;\n opacity: 1;\n }\n}\n\n@keyframes slide-out {\n 0% {\n top: 1rem;\n opacity: 1;\n }\n 100% {\n top: -100%;\n opacity: 0;\n }\n}\n\n@keyframes mesh {\n 0% {\n background-position: 0 0, 0 100%, 50% 0, 50% 25%, 50% 100%;\n }\n 15% {\n background-position: 1% 1%, 1% 101%, 51% 1%, 51% 26%, 51% 101%;\n }\n 30% {\n background-position: 2% 2%, 2% 102%, 52% 2%, 52% 26%, 52% 102%;\n }\n 45% {\n background-position: 3% 3%, 3% 103%, 53% 3%, 53% 27%, 53% 103%;\n }\n 60% {\n background-position: 4% 4%, 4% 104%, 54% 4%, 54% 28%, 54% 104%;\n }\n 75% {\n background-position: 5% 5%, 5% 105%, 55% 5%, 55% 29%, 55% 105%;\n }\n 90% {\n background-position: 6% 6%, 6% 106%, 56% 6%, 56% 30%, 56% 106%;\n }\n}\n","//-------------------------------------------\n// Containers\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-outer-container {\n position: relative;\n width: 100%;\n padding: 1rem;\n\n @media (min-width: variables.$tablet) {\n padding: 1rem 3rem 2rem;\n }\n\n @media (min-width: variables.$laptop) {\n padding: 1rem 4rem 2rem;\n }\n\n &--footer {\n @extend .sm-outer-container;\n min-height: 250px;\n padding-bottom: 3rem;\n\n @media (min-width: variables.$laptop) {\n padding-bottom: 1rem;\n }\n\n font-size: 0.9rem;\n @include mixins.color-map(background-color, surface);\n @include mixins.color-map(color, text1);\n border-bottom: none;\n }\n}\n\n.sm-inner-container {\n max-width: variables.$laptop;\n margin: 0 auto 1rem;\n\n &--hero {\n @extend .sm-inner-container;\n position: relative;\n height: 100%;\n margin-bottom: 0;\n }\n\n &--footer {\n @extend .sm-inner-container;\n }\n\n &--author {\n @extend .sm-inner-container;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding-bottom: 1rem;\n margin-top: 1rem;\n @media (min-width: variables.$tablet) {\n flex-direction: row;\n }\n }\n}\n","//-------------------------------------------\n// Global Footer Styles\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-footer {\n &__section {\n display: flex;\n flex-direction: column;\n // padding: 0.5rem;\n\n &--latest {\n @extend .sm-footer__section;\n @include mixins.color-map(color, text1);\n\n &:nth-child(3) {\n padding-bottom: 0.5rem;\n }\n\n &:last-child {\n padding-top: 0;\n & > p:first-child {\n display: block;\n }\n }\n }\n }\n\n &__link {\n margin-bottom: 0.15rem;\n }\n\n &__description {\n margin-bottom: 0.25rem;\n @include mixins.color-map(color, text2);\n }\n\n &__date {\n margin-bottom: 0.25rem;\n font-size: 0.75rem;\n text-transform: uppercase;\n @include mixins.color-map(color, text3);\n }\n\n &__title {\n width: 100%;\n max-width: 12rem;\n margin-bottom: 1rem;\n\n @include mixins.color-map(color, text2);\n\n @include mixins.transition(color);\n\n &:hover {\n @include mixins.color-map(color, primary);\n }\n }\n\n &__header--serif {\n margin-bottom: 0.5rem;\n font-size: 115%;\n // @extend .serif;\n }\n\n &__social {\n display: grid;\n grid-gap: 1rem;\n grid-template-columns: repeat(auto-fit, 1rem);\n\n @supports not (gap: 1.5rem) {\n display: flex;\n flex-wrap: wrap;\n a {\n margin: 0.5rem;\n }\n }\n\n margin-top: 0.5rem;\n @include mixins.transition(all);\n\n a {\n margin: 0;\n border-radius: variables.$radius;\n }\n\n svg {\n width: 100%;\n height: 100%;\n @include mixins.color-map(stroke, text2);\n @include mixins.color-map(fill, text2);\n }\n }\n\n &__card-tag {\n display: flex;\n align-items: center;\n @include mixins.color-map(color, text2);\n\n p {\n margin: 0;\n text-transform: uppercase;\n @include mixins.transition(all);\n }\n\n svg {\n flex-shrink: 0;\n align-self: flex-start;\n width: 0.9375rem;\n height: 0.9375rem;\n transform: translateY(0.2em);\n @include mixins.color-map(stroke, text2);\n stroke-width: 2px;\n @include mixins.transition(all);\n }\n\n &:hover,\n &:active {\n p {\n @include mixins.color-map(color, secondary);\n outline: none;\n }\n svg {\n @include mixins.color-map(stroke, secondary);\n }\n }\n }\n\n &__published-by-ghost {\n padding: 0.5rem;\n font-size: 0.8rem;\n @include mixins.color-map(color, text3);\n text-align: center;\n }\n}\n","//-------------------------------------------\n// Mobile Nav Menu\n//-------------------------------------------\n@use '../abstracts/mixins';\n.sm-menu {\n &__link {\n @include mixins.transition(color);\n &:focus {\n outline: none;\n @include mixins.color-map(color, primary);\n }\n }\n}\n","//-------------------------------------------\n// Navbar\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-navbar {\n position: fixed;\n top: 0;\n z-index: 5;\n display: block;\n width: 100%;\n padding: 0 1rem;\n\n @media (min-width: variables.$tablet) {\n padding: 0 3rem;\n }\n\n @media (min-width: variables.$laptop) {\n padding: 0 4rem;\n }\n\n font-size: 0.9rem;\n box-shadow: variables.$box-shadow;\n @include mixins.color-map(background-color, surface2);\n @include mixins.transition(all);\n\n &__top,\n &__bottom {\n max-width: variables.$laptop;\n margin: 0 auto;\n }\n\n &__divider {\n position: absolute;\n left: 0;\n display: none;\n width: 100vw;\n height: 1px;\n background-color: var(--text1);\n opacity: 0.1;\n transform: translateY(6px);\n\n @include mixins.respond-above(variables.$laptop) {\n display: block;\n }\n }\n\n &__top {\n display: none;\n height: 2.25rem;\n\n @include mixins.respond-above(variables.$laptop) {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.8rem;\n }\n\n &--left {\n display: flex;\n align-items: center;\n }\n\n &--right {\n display: flex;\n align-items: center;\n\n button {\n margin-right: 0;\n }\n }\n }\n\n &__new-tag {\n padding: 0.15rem;\n margin-right: 4px;\n font-size: 0.6rem;\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.2px;\n border-radius: variables.$radius;\n @include mixins.color-map(color, textInverse);\n @include mixins.color-map(background-color, secondary);\n\n &--text {\n @extend .sm-navbar__new-tag;\n color: var(--text2);\n background: none;\n }\n }\n\n &__new-link {\n font-size: 0.95em;\n line-height: 1;\n @include mixins.transition(color);\n @include mixins.color-map(color, text2);\n\n &:hover {\n @include mixins.color-map(color, text);\n }\n }\n\n // Bottom navbar -> Brand, Links, Member\n &__bottom {\n display: flex;\n align-items: center;\n height: 3.25rem;\n\n &--center {\n display: none;\n margin-left: 2rem;\n line-height: 0;\n transform: translateY(1px);\n\n @include mixins.respond-above(variables.$laptop) {\n display: block;\n }\n }\n\n // If member functionality isn't enabled, then shift nav links to far right\n div:last-child {\n margin-left: auto;\n }\n\n &--right {\n display: none;\n margin-left: auto;\n\n @include mixins.respond-above(variables.$laptop) {\n display: flex;\n align-items: center;\n }\n\n &--mobile {\n margin: 0 0 0 auto;\n line-height: 0;\n @include mixins.respond-above(variables.$laptop) {\n display: none;\n }\n }\n }\n }\n\n &__brand--serif {\n display: flex;\n align-items: center;\n font-family: variables.$serif;\n font-size: 1.25rem;\n font-weight: 400;\n line-height: 1;\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n margin-right: 0.25rem;\n }\n }\n\n // Member button styling\n &__signin,\n &__signup {\n margin: 0 0.5rem 0 0;\n font-family: variables.$sans;\n font-size: 0.8rem;\n line-height: 1;\n @include mixins.color-map(color, text2);\n @include mixins.transition(color);\n }\n\n &__signin:hover {\n @include mixins.color-map(color, text);\n }\n\n &__signup {\n padding: 0.25rem;\n margin-right: 0;\n font-weight: 700;\n border-radius: variables.$radius;\n box-shadow: variables.$box-shadow;\n @include mixins.color-map(color, textInverse);\n @include mixins.color-map(background-color, primary);\n @include mixins.transition(background-color);\n &:hover {\n @include mixins.color-map(background-color, secondary);\n }\n }\n\n &__hamburger-btn {\n width: 1.5rem;\n height: 1.5rem;\n\n svg {\n width: 100%;\n height: 100%;\n @include mixins.color-map(stroke, text2);\n\n &:hover {\n @include mixins.color-map(stroke, text);\n }\n }\n }\n\n // Search button\n &__search {\n display: none;\n width: 1.5em;\n height: 1.5em;\n margin-left: 0.5rem;\n line-height: 1;\n svg {\n width: 100%;\n height: 100%;\n fill: transparent;\n @include mixins.color-map(stroke, text2);\n @include mixins.transition(stroke);\n\n &:hover {\n @include mixins.color-map(stroke, text);\n }\n }\n }\n\n .sm-color-mode-btn {\n width: 1.5em;\n height: 1.5em;\n margin: 0 0.5rem;\n line-height: 1;\n\n svg {\n width: 100%;\n height: 100%;\n transition: stroke 0.2s, fill 0.2s;\n fill: transparent;\n @include mixins.color-map(stroke, text2);\n\n &:hover {\n fill: #eee8aa;\n @include mixins.color-map(stroke, text);\n }\n }\n }\n}\n\n.sm-color-mode-btn {\n &.light {\n :root[color-mode='light'] & {\n display: none;\n }\n }\n &.dark {\n :root[color-mode='dark'] & {\n display: none;\n }\n }\n}\n","//-------------------------------------------\n// Navigation Partial\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-navigation {\n // Social Media icons in footer\n &__social-media-item {\n width: 1.25em;\n height: 1.25em;\n margin-right: 0.5rem;\n @include mixins.color-map(color, text2);\n\n &:last-child {\n margin-right: 0;\n }\n\n svg {\n width: 100%;\n height: 100%;\n }\n }\n // Nav links\n &__ul {\n list-style-type: none;\n }\n\n &__li {\n margin: 0.5rem 0;\n font-size: 1.25rem;\n\n @include mixins.respond-above(variables.$laptop) {\n display: inline-block;\n margin: 0 1rem 0 0;\n font-size: 0.8rem;\n line-height: 1;\n\n &:first-child {\n margin-left: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n }\n }\n}\n","//-------------------------------------------\n// Pagination\n//-------------------------------------------\n@use '../abstracts/mixins';\n\n.pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n @include mixins.color-map(color, text2);\n\n > * {\n margin: 2rem 1rem 0;\n &:first-child {\n margin-left: 0;\n }\n &:last-child {\n margin-right: 0;\n }\n }\n\n a {\n @include mixins.transition(color);\n\n &:hover {\n @include mixins.color-map(color, primary);\n }\n }\n}\n","@use '../abstracts/variables';\n@use '../abstracts/mixins';\n.sm-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 10rem;\n padding: 0.25rem 0.5rem;\n margin-right: auto;\n margin-left: auto;\n font-family: inherit;\n font-size: 1rem;\n line-height: inherit;\n color: currentColor;\n cursor: pointer;\n background-color: none;\n border: none;\n border-radius: variables.$radius;\n box-shadow: variables.$box-shadow;\n @include mixins.color-map(background-color, surface3);\n @include mixins.transition(background-color);\n\n & + .sm-button {\n margin-top: 1rem;\n }\n\n &:hover {\n outline: none;\n @include mixins.color-map(background-color, surface4);\n }\n &.color-mode-btn:hover svg {\n fill: #eee8aa;\n }\n &:active {\n box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.35);\n }\n\n svg {\n width: 1rem;\n height: 1rem;\n margin-right: 0.15rem;\n transform: translateY(-1px);\n fill: transparent;\n stroke: currentColor;\n @include mixins.transition(fill);\n }\n\n &--color {\n @extend .sm-button;\n @include mixins.color-map(color, textInverse);\n @include mixins.color-map(background-color, primary);\n @include mixins.transition(background-color);\n\n &:hover {\n @include mixins.color-map(color, textInverse);\n @include mixins.color-map(background-color, secondary);\n }\n\n &:active {\n box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.35);\n }\n }\n\n // Hide search button unless enabled in dashboard\n &--search {\n @extend .sm-button;\n display: none;\n }\n}\n","//-------------------------------------------\n// Card Styles\n//-------------------------------------------\n@use '../abstracts/_variables';\n@use '../abstracts/_mixins';\n@use '../abstracts/functions';\n\n.sm-card {\n position: relative;\n display: flex;\n flex-direction: column;\n max-width: 100%;\n @include mixins.color-map(background-color, surface2);\n border-radius: variables.$radius;\n box-shadow: variables.$box-shadow;\n\n &__link {\n display: flex;\n flex-direction: column;\n height: 100%;\n border-radius: variables.$radius;\n transition: box-shadow 0.2s, color 0.2s;\n\n &:hover,\n &:focus {\n box-shadow: 0 0 0 4px functions.color(primary);\n box-shadow: 0 0 0 4px var(--primary, color(primary));\n\n .sm-card {\n &__title {\n @include mixins.color-map(color, primary);\n }\n }\n }\n }\n\n &__img-container {\n position: relative;\n width: 100%;\n height: 0;\n padding-top: 50%;\n overflow: hidden;\n border-radius: 0;\n border-top-left-radius: variables.$radius;\n border-top-right-radius: variables.$radius;\n &.paid,\n &.members {\n &::after {\n position: absolute;\n bottom: 0;\n left: 1.25rem;\n padding: 0.25em 0.5em;\n font-size: 14px;\n text-transform: uppercase;\n letter-spacing: -0.2px;\n content: 'Members';\n @include mixins.color-map(background-color, text1);\n @include mixins.color-map(color, surface1);\n }\n }\n }\n\n &__img,\n &__no-img {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n overflow: hidden;\n border-radius: 0;\n border-top-left-radius: variables.$radius;\n border-top-right-radius: variables.$radius;\n }\n\n &__no-img {\n background-image: var(--gradient);\n }\n\n &__body {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n height: 100%;\n padding: 0 1.25rem;\n margin: 1.25rem 0;\n }\n\n &__date {\n display: flex;\n padding: 1px;\n font-size: 0.75rem;\n font-weight: 400;\n @include mixins.color-map(color, text1);\n text-transform: uppercase;\n }\n\n &__title {\n position: relative;\n margin: 0.25rem 0 1.5rem;\n font-size: 1.5rem;\n line-height: 1.1;\n @include mixins.color-map(color, text);\n @include mixins.transition(color);\n }\n\n &__excerpt {\n display: none;\n }\n\n &--tags {\n @extend .sm-card;\n overflow: hidden;\n\n &__link {\n &:hover,\n &:focus {\n .sm-card--tags {\n &__img-container:after {\n background: transparent;\n }\n }\n }\n }\n\n &__img-container {\n @extend .sm-card__img-container;\n &:after {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n content: '';\n background: rgba(0, 0, 0, 0.5);\n border-radius: variables.$radius;\n @include mixins.transition(background);\n }\n }\n\n &__img {\n @extend .sm-card__img;\n }\n\n &__no-img {\n @extend .sm-card__no-img;\n @include mixins.color-map(background, primary);\n\n &:after {\n background: none;\n }\n }\n\n &__img,\n &__no-img {\n border-radius: variables.$radius;\n }\n\n &__body {\n @extend .sm-card__body;\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2;\n flex-direction: row;\n align-items: stretch;\n height: auto;\n @include mixins.transition(box-shadow);\n }\n &__title {\n @extend .sm-card__title;\n padding: 0.25rem 0 0.25rem 0.5rem;\n margin: 0;\n font-size: 2rem;\n @include mixins.color-map(color, text);\n @include mixins.color-map(background, surface1);\n border-top-left-radius: variables.$radius;\n border-bottom-left-radius: variables.$radius;\n\n @media (min-width: variables.$tablet) {\n font-size: 1.5rem;\n }\n }\n\n &__date {\n @extend .sm-card__date;\n padding: 0.375rem 0.5rem;\n @include mixins.color-map(color, secondary);\n @include mixins.color-map(background, surface1);\n font-family: variables.$sans;\n font-size: 2rem;\n line-height: 1;\n border-top-right-radius: variables.$radius;\n border-bottom-right-radius: variables.$radius;\n font-variant-numeric: tabular-nums;\n\n @media (min-width: variables.$tablet) {\n font-size: 1.5rem;\n }\n }\n\n &:nth-child(2n) {\n .sm-card {\n &__no-img {\n @include mixins.color-map(background, three);\n }\n }\n }\n &:nth-child(3n) {\n .sm-card {\n &__no-img {\n @include mixins.color-map(background, four);\n }\n }\n }\n &:nth-child(4n) {\n .sm-card {\n &__no-img {\n @include mixins.color-map(background, five);\n }\n }\n }\n &:nth-child(5n) {\n .sm-card {\n &__no-img {\n @include mixins.color-map(background, secondary);\n }\n }\n }\n }\n}\n","@use '../abstracts/variables';\n\nhr {\n height: 0.15rem;\n margin: 2rem 0;\n background: linear-gradient(\n to right,\n var(--surface2),\n var(--surface3),\n var(--surface4),\n var(--surface3),\n var(--surface2)\n );\n border: none;\n border-radius: variables.$radius;\n}\n","@use '../abstracts/variables';\n@use '../abstracts/functions';\n@use '../abstracts/mixins';\n\n.sm-form {\n display: flex;\n flex-direction: column;\n font-size: 1rem;\n\n &__input,\n textarea {\n width: 100%;\n padding: 0.25rem;\n margin: 0.25rem 0;\n font-family: variables.$sans;\n font-size: 1rem;\n border: 1px solid currentColor;\n border-radius: variables.$radius;\n @include mixins.color-map(color, text1);\n @include mixins.color-map(background-color, surface2);\n @include mixins.transition(all);\n\n &:focus {\n @include mixins.color-map(color, text);\n @include mixins.color-map(background-color, surface3);\n border: 1px solid functions.color(primary);\n border: 1px solid var(--primary);\n outline: none;\n @include mixins.transition(all);\n }\n }\n\n textarea {\n flex-basis: auto;\n height: 8rem;\n }\n\n .sm-button--color {\n margin: 1rem 0 0;\n }\n}\n","//-------------------------------------------\n// Grid Styles\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n@mixin horizontal-card {\n &__link {\n flex-direction: row;\n }\n\n &__img-container {\n width: 50%;\n height: 100%;\n min-height: 15rem;\n padding: 0;\n border-radius: 0;\n border-top-left-radius: variables.$radius;\n border-bottom-left-radius: variables.$radius;\n & > * {\n border-radius: 0;\n border-top-left-radius: variables.$radius;\n border-bottom-left-radius: variables.$radius;\n }\n }\n\n &__img {\n overflow: hidden;\n border-radius: inherit;\n }\n\n &__body {\n width: calc(50% - 2.5rem);\n height: auto;\n }\n}\n\n.sm-grid {\n // IE Support\n display: flex;\n flex-wrap: wrap;\n .sm-card {\n width: 50%;\n min-width: 14.375rem;\n margin-bottom: 1rem;\n &:first-child {\n width: 100%;\n }\n }\n\n @supports (gap: 1.5rem) {\n display: grid;\n gap: 1.5rem;\n\n .sm-card {\n width: initial;\n min-width: initial;\n margin-bottom: initial;\n &:first-child {\n width: initial;\n }\n }\n }\n}\n\n@media (min-width: variables.$tablet) {\n .sm-card-1 {\n grid-area: one;\n }\n\n .sm-card-2 {\n grid-area: two;\n }\n\n .sm-card-3 {\n grid-area: three;\n }\n\n .sm-card-4 {\n grid-area: four;\n }\n\n .sm-card-5 {\n grid-area: five;\n }\n .sm-card-6 {\n grid-area: six;\n }\n .sm-card-7 {\n grid-area: seven;\n }\n .sm-card-8 {\n grid-area: eight;\n }\n .sm-card-9 {\n grid-area: nine;\n }\n .sm-card-10 {\n grid-area: ten;\n }\n}\n\n// Mobile phones\n.sm-grid-container {\n @extend .sm-grid;\n align-content: stretch;\n grid-template-columns: repeat(auto-fit, minmax(292px, 1fr));\n max-width: 100%;\n margin: 1rem 0;\n\n &--tags {\n @extend .sm-grid-container;\n }\n\n &--footer {\n @extend .sm-grid-container;\n grid-gap: 2rem;\n grid-template-columns: repeat(2, 1fr);\n\n @media (min-width: variables.$laptop) {\n grid-gap: 2rem;\n grid-template-columns: repeat(4, 1fr);\n }\n }\n}\n\n// Tablets\n@media (min-width: variables.$tablet) {\n .sm-grid-container-1 {\n grid-template-columns: minmax(292px, 1fr);\n grid-template-areas: 'one';\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n\n .sm-grid-container-2 {\n grid-template-columns: 1fr 1fr;\n grid-template-areas: 'one two';\n }\n\n .sm-grid-container-3 {\n grid-template-columns: 1fr 1fr;\n grid-template-areas:\n 'one one'\n 'two three';\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n\n .sm-grid-container-4 {\n grid-template-areas:\n 'one two'\n 'three four';\n grid-template-columns: 1fr 1fr;\n }\n\n .sm-grid-container-5 {\n grid-template-areas:\n 'one one'\n 'two three'\n 'four five';\n grid-template-columns: 1fr 1fr;\n }\n\n .sm-grid-container-6 {\n grid-template-areas:\n 'one one one two two two'\n 'three three three four four four'\n 'five five five six six six';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n }\n\n .sm-grid-container-7 {\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n grid-template-areas:\n 'one one one one one one'\n 'two two two three three three'\n 'four four four five five five'\n 'six six six seven seven seven';\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n\n .sm-grid-container-8 {\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n grid-template-areas:\n 'one one one two two two'\n 'three three three four four four'\n 'five five five six six six'\n 'seven seven seven eight eight eight';\n }\n\n .sm-grid-container-9 {\n grid-template-areas:\n 'one one one one one one'\n 'two two two three three three'\n 'four four four five five five'\n 'six six six seven seven seven'\n 'eight eight eight nine nine nine';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n .sm-grid-container-10 {\n grid-template-areas:\n 'one one one two two two'\n 'three three three four four four'\n 'five five five six six six'\n 'seven seven seven eight eight eight'\n 'nine nine nine ten ten ten';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n }\n}\n\n// Laptops and up\n@media (min-width: variables.$laptop) {\n .sm-grid-container-5 {\n grid-template-areas:\n 'one one one two two two'\n 'three three four four five five';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n }\n\n .sm-grid-container-6 {\n grid-template-areas:\n 'one one one one one one'\n 'two two two three three three'\n 'four four five five six six';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n\n .sm-grid-container-7 {\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n grid-template-areas:\n 'one one one one one one'\n 'two two three three four four'\n 'five five six six seven seven';\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n\n .sm-grid-container-8 {\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n grid-template-areas:\n 'one one one two two two'\n 'three three four four five five'\n 'six six seven seven eight eight';\n }\n\n .sm-grid-container-9 {\n grid-template-areas:\n 'one one one one one one'\n 'two two two three three three'\n 'four four five five six six'\n 'seven seven eight eight nine nine';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n .sm-grid-container-10 {\n grid-template-areas:\n 'one one one one one one'\n 'two two three three four four'\n 'five five six six seven seven'\n 'eight eight nine nine ten ten';\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n .sm-card-1 {\n .sm-card {\n @include horizontal-card();\n }\n }\n }\n}\n","@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n@mixin link {\n position: relative;\n display: inline;\n text-decoration: none;\n\n &:before {\n position: absolute;\n bottom: -1px;\n left: 0;\n z-index: -1;\n width: 100%;\n height: 2px;\n clip-path: inset(0 100% 0 0);\n content: '';\n @include mixins.color-map(background-color, primary);\n border-radius: variables.$radius;\n @include mixins.transition(clip-path);\n }\n\n &:hover:before {\n clip-path: inset(0 0 0 0);\n @include mixins.transition(clip-path);\n }\n}\n\n.sm-link {\n @include link;\n\n &.sm-nav-current:before {\n clip-path: none;\n }\n}\n","//-------------------------------------------\n// General Modal Styles\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-content-wrap {\n &:before {\n top: 0;\n left: 0;\n z-index: 7;\n width: 100%;\n height: 100%;\n content: '';\n background: linear-gradient(\n 315deg,\n rgba(0, 0, 0, 0.5) 0%,\n rgba(0, 0, 0, 0.3) 100%\n );\n opacity: 0;\n transition: opacity 0.2s;\n backdrop-filter: blur(2px);\n }\n\n .sm-expanded-modal &,\n .sm-expanded-menu & {\n &:before {\n position: fixed;\n opacity: 1;\n }\n }\n}\n\n.expanded-modal {\n // prevent double scroll bars when modal opens\n // overflow: hidden;\n}\n\n.sm-modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 10;\n width: 100%;\n height: 100%;\n // overflow-y: auto;\n overflow: hidden;\n text-align: center;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease-in;\n @include mixins.color-map(color, text);\n @include mixins.color-map(background-color, surface2);\n\n @media (min-width: variables.$laptop) {\n left: 50%;\n width: 380px;\n max-width: 100vw;\n max-height: 75%;\n margin-top: 15vmin;\n border-radius: variables.$radius;\n box-shadow: -3px 0 10px rgba(0, 0, 0, 0.25);\n transform: translate(-50%, 0);\n }\n\n &__container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n padding: 1rem;\n }\n\n &[aria-expanded='true'] {\n overflow-y: auto;\n pointer-events: all;\n opacity: 1;\n @media (min-width: variables.$laptop) {\n animation: popup 0.25s ease-out;\n }\n }\n\n &__header {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n .sm-navigation {\n &__ul {\n margin: 2rem;\n }\n }\n }\n\n &__close-btn {\n align-self: flex-end;\n width: 1.5rem;\n height: 1.5rem;\n margin: 0 0 1rem 1rem;\n line-height: 0;\n\n &:hover svg {\n @include mixins.color-map(stroke, secondary);\n }\n\n svg {\n width: 1.5rem;\n height: 1.5rem;\n stroke-width: 3;\n @include mixins.color-map(stroke, text1);\n @include mixins.transition(all);\n }\n }\n\n &__title {\n margin: 0;\n }\n\n &__footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n width: 100%;\n\n a {\n width: 2rem;\n height: 2rem;\n margin: 0.5rem;\n &:last-child {\n margin-right: 0;\n }\n svg {\n width: 100%;\n height: 100%;\n @include mixins.color-map(stroke, text2);\n }\n }\n }\n}\n","//-------------------------------------------\n// Search Styles\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/functions';\n@use '../abstracts/mixins';\n\n.sm-search {\n &__modal {\n .sm-modal {\n &__container {\n justify-content: flex-start;\n }\n &__header {\n max-width: 600px;\n margin: 0 auto;\n }\n }\n .sm-small-header {\n text-align: left;\n }\n }\n &__button {\n &--loading {\n display: none;\n animation: rotate 1s linear infinite;\n .loading & {\n display: inline-block;\n transform: none;\n }\n }\n &--content {\n .loading & {\n display: none;\n }\n }\n }\n\n &__input-container {\n display: flex;\n input,\n button {\n margin: 0;\n line-height: 1;\n }\n\n input {\n flex: 2;\n margin-right: 0.25rem;\n }\n\n button {\n flex: 1;\n }\n }\n}\n\n@keyframes rotate {\n 100% {\n transform: rotate(1turn);\n }\n}\n\n.sm-search-results {\n width: 100%;\n max-width: 600px;\n height: 100%;\n margin: 1rem auto 0;\n\n &__container {\n padding-bottom: 1rem;\n }\n\n .sm-small-header {\n text-align: left;\n }\n\n &__item {\n margin-top: 1rem;\n text-align: left;\n border-radius: variables.$radius;\n box-shadow: variables.$box-shadow;\n @include mixins.color-map(background-color, surface3);\n &:first-child {\n margin-top: 0.25rem;\n }\n }\n\n &__link {\n display: block;\n width: 100%;\n height: 100%;\n padding: 1rem;\n border: 3px solid transparent;\n border-radius: variables.$radius;\n transition: box-shadow 0.2s, color 0.2s;\n\n &:hover {\n box-shadow: 0 0 0 4px functions.color(primary);\n box-shadow: 0 0 0 4px var(--primary);\n\n .sm-search-results {\n &__title {\n @include mixins.color-map(color, primary);\n }\n }\n }\n }\n\n &__date {\n font-size: 0.8rem;\n @include mixins.color-map(color, text1);\n background: none;\n }\n\n &__title {\n margin: 0.25rem 0;\n font-family: variables.$serif;\n font-size: 1.1rem;\n font-weight: 400;\n line-height: 1.2;\n @include mixins.transition(color);\n }\n\n &__excerpt {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n font-size: 0.9rem;\n -webkit-line-clamp: 3;\n text-overflow: ellipsis;\n @include mixins.color-map(color, text2);\n }\n}\n","//-------------------------------------------\n// Share Bar\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-post-share-bar {\n position: fixed;\n bottom: 0;\n z-index: 5;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n width: 100%;\n overflow: hidden;\n font-weight: 700;\n @include mixins.color-map(color, text2);\n text-align: center;\n @include mixins.color-map(background-color, surface3);\n border-bottom: 3px solid var(--surface4);\n\n @media (min-width: variables.$laptop) {\n display: none;\n }\n\n &__link {\n width: 2.5rem;\n height: 2.5rem;\n padding: 0.5rem;\n border-radius: variables.$radius;\n @include mixins.transition(background-color);\n\n svg {\n width: 100%;\n height: 100%;\n fill: transparent;\n @include mixins.color-map(stroke, text2);\n @include mixins.transition(stroke);\n }\n\n @media (min-width: variables.$laptop) {\n width: 1.8rem;\n height: 1.8rem;\n padding: 0.36rem;\n }\n }\n\n &__link--twitter {\n @extend .sm-post-share-bar__link;\n\n &:hover,\n &:active {\n background-color: variables.$tw;\n svg {\n stroke: #fff;\n }\n }\n }\n\n &__link--facebook {\n @extend .sm-post-share-bar__link;\n\n &:hover,\n &:active {\n background-color: variables.$fb;\n svg {\n stroke: #fff;\n }\n }\n }\n\n &__link--linkedin {\n @extend .sm-post-share-bar__link;\n\n &:hover,\n &:active {\n background-color: variables.$li;\n svg {\n stroke: #fff;\n }\n }\n }\n\n &__link--copy {\n @extend .sm-post-share-bar__link;\n &:hover,\n &:active {\n @include mixins.color-map(background-color, primary);\n svg {\n stroke: #fff;\n :root[color-mode='dark'] & {\n stroke: #000;\n }\n }\n }\n }\n}\n",".sm-skip-to-content {\n position: fixed;\n top: 0;\n left: 50%;\n z-index: 15;\n opacity: 0;\n transition: background-color 0.2s, transform 0.25s ease-out, opacity 0.25s;\n transform: translate3d(-50%, -125%, 0);\n\n &:focus {\n opacity: 1;\n transition: transform 0.25s ease-in, opacity 0.25s;\n transform: translate3d(-50%, 0.5rem, 0);\n }\n}\n","@use '../abstracts/mixins' as *;\n\n.sm-small-header,\nlabel {\n margin-top: 1rem;\n font-size: 0.8rem;\n font-weight: 700;\n text-transform: uppercase;\n @include color-map(color, text3);\n}\n","//-------------------------------------------\n// SVG Icon Colors\n//-------------------------------------------\n@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n@mixin svg($sm) {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0.25rem;\n border-radius: variables.$radius;\n @include mixins.transition(background-color);\n &:hover {\n background-color: $sm;\n svg {\n stroke: #fff;\n }\n }\n svg {\n fill: none;\n stroke: currentColor;\n @include mixins.transition(stroke);\n }\n}\n\n.academia svg {\n fill: currentColor;\n @include mixins.transition(all);\n &:hover,\n &:focus {\n @include mixins.color-map(fill, primary);\n }\n}\n\n.facebook {\n @include svg(variables.$fb);\n}\n\n.github {\n @include svg(variables.$gh);\n}\n\n.gitlab {\n @include svg(variables.$gl);\n}\n\n.instagram {\n @include svg(variables.$ig);\n}\n\n.linkedin {\n @include svg(variables.$li);\n}\n\n.rss {\n @include svg(variables.$rs);\n}\n\n.twitch {\n @include svg(variables.$ch);\n}\n\n.twitter {\n @include svg(variables.$tw);\n}\n\n.map svg,\n.website svg {\n fill: transparent;\n stroke: currentColor;\n @include mixins.transition(all);\n &:hover,\n &:focus {\n @include mixins.color-map(stroke, primary);\n }\n}\n\n.website {\n width: 1.5rem;\n height: 1.5rem;\n padding: 0.25rem;\n border-radius: variables.$radius;\n @include mixins.transition(background-color);\n &:hover {\n @include mixins.color-map(background-color, primary);\n svg {\n @include mixins.color-map(stroke, textInverse);\n }\n }\n svg {\n fill: none;\n stroke: currentColor;\n @include mixins.transition(stroke);\n }\n}\n\n.youtube {\n @include svg(variables.$yt);\n}\n","@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-tag {\n display: inline-block;\n @include mixins.color-map(color, text2);\n font-size: 0.8rem;\n text-transform: uppercase;\n letter-spacing: 0.2px;\n @include mixins.transition(color);\n\n &::before {\n content: '#';\n }\n\n &:not(.sm-card &):hover {\n @include mixins.color-map(color, text);\n }\n\n .sm-card & {\n margin-top: auto;\n }\n\n &:not(:last-child) {\n .sm-post__tag-bar & {\n margin-right: 0.5rem;\n }\n }\n}\n","//-------------------------------------------\n// For Home, Index, and Tag pages\n//-------------------------------------------\n@use '../abstracts/mixins';\n.sm-main {\n width: 100%;\n overflow-x: hidden;\n\n &--index {\n @extend .sm-main;\n @include mixins.navbar(margin-top);\n }\n\n &__outer-container {\n @include mixins.outer-container;\n }\n\n &__inner-container {\n @include mixins.inner-container;\n }\n\n &__header {\n display: inline;\n margin: 0;\n }\n\n &__read-more {\n display: inline-block;\n @include mixins.color-map(color, text);\n @include mixins.transition(color);\n\n h2 {\n margin: 0;\n }\n\n &:hover {\n @include mixins.color-map(color, secondary);\n }\n }\n}\n","@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-hero {\n position: relative;\n width: 100%;\n height: 27.5rem;\n @include mixins.navbar(margin-top);\n margin-bottom: 2rem;\n overflow: hidden;\n background-position: center;\n background-size: cover;\n @include mixins.color-map(background-color, surface1);\n\n @media (min-height: 60rem) and (min-width: variables.$desktop) {\n height: 37.5rem;\n }\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n content: '';\n background: radial-gradient(rgba(#000, 0.5), rgba(#000, 0.75));\n }\n\n &__text-container {\n position: absolute;\n top: 50%;\n width: 100%;\n transform: translateY(-50%);\n }\n\n &__site-title {\n margin: 0 0 0.5rem;\n line-height: 1.1;\n color: #ffffff;\n }\n\n &__site-description {\n margin: 0;\n font-size: 1.25rem;\n line-height: 1.2;\n color: rgba(238, 238, 238);\n }\n}\n","@use '../abstracts/variables';\n@use '../abstracts/mixins';\n@use '../abstracts/functions';\n\n.sm-author {\n &__header {\n max-width: variables.$laptop;\n margin: 0 auto;\n }\n\n &__img-container {\n position: relative;\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n margin-bottom: 2rem;\n border-radius: 50%;\n\n @include mixins.respond-above(variables.$tablet) {\n margin-bottom: 0;\n }\n\n &:before {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n content: '';\n background: linear-gradient(\n 45deg,\n functions.color(primary),\n functions.color(secondary)\n );\n background: var(--gradient);\n border-radius: 50%;\n }\n }\n\n &__img {\n position: relative;\n z-index: 1;\n width: variables.$base;\n height: variables.$base;\n margin: 0.25rem;\n border-radius: 50%;\n box-shadow: variables.$box-shadow;\n }\n\n &__no-img {\n @extend .sm-author__img;\n overflow: hidden;\n background: linear-gradient(\n 45deg,\n functions.color(primary),\n functions.color(secondary)\n );\n background: var(--gradient);\n\n svg {\n display: block;\n width: 90%;\n height: 90%;\n margin: 0 auto;\n fill: transparent;\n @include mixins.color-map(color, textInverse);\n }\n }\n\n &__text {\n @include mixins.respond-above(variables.$tablet) {\n margin-left: 4rem;\n }\n }\n\n &__name {\n margin: 0;\n font-family: variables.$serif;\n font-weight: 400;\n }\n\n &__location svg:hover {\n stroke: currentColor;\n }\n\n &__meta {\n display: flex;\n align-items: center;\n\n a {\n margin-right: 0.5rem;\n line-height: 1;\n\n &:last-child {\n margin-right: 0;\n }\n }\n\n svg {\n width: 1rem;\n height: 1rem;\n\n @include mixins.transition(all);\n }\n }\n\n &__location {\n display: flex;\n align-items: center;\n\n p {\n margin-left: 0.25rem;\n }\n\n svg {\n width: 1rem;\n height: 1rem;\n }\n }\n}\n","@use '../abstracts/variables';\n@use '../abstracts/mixins';\n\n.sm-main--error {\n &__heading {\n position: relative;\n margin-bottom: 0;\n font-family: variables.$serif;\n font-size: 4rem;\n font-weight: 400;\n text-align: center;\n }\n\n &__text {\n font-size: 1.5rem;\n text-align: center;\n @include mixins.color-map(color, text1);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/assets/built/app.js b/assets/built/app.js index c5673a62..a149eb98 100644 --- a/assets/built/app.js +++ b/assets/built/app.js @@ -1,5910 +1,2 @@ -/******/ (function() { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@tryghost/content-api/es/content-api.js": -/*!**************************************************************!*\ - !*** ./node_modules/@tryghost/content-api/es/content-api.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {}; - -function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; -} - -var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global_1 = - // eslint-disable-next-line no-undef - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - check(typeof self == 'object' && self) || - check(typeof commonjsGlobal == 'object' && commonjsGlobal) || - // eslint-disable-next-line no-new-func - (function () { return this; })() || Function('return this')(); - -var fails = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - -// Thank's IE8 for his funny defineProperty -var descriptors = !fails(function () { - return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; -}); - -var nativePropertyIsEnumerable = {}.propertyIsEnumerable; -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); - -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable -var f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : nativePropertyIsEnumerable; - -var objectPropertyIsEnumerable = { - f: f -}; - -var createPropertyDescriptor = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - -var toString = {}.toString; - -var classofRaw = function (it) { - return toString.call(it).slice(8, -1); -}; - -var split = ''.split; - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var indexedObject = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classofRaw(it) == 'String' ? split.call(it, '') : Object(it); -} : Object; - -// `RequireObjectCoercible` abstract operation -// https://tc39.github.io/ecma262/#sec-requireobjectcoercible -var requireObjectCoercible = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - -// toObject with fallback for non-array-like ES3 strings - - - -var toIndexedObject = function (it) { - return indexedObject(requireObjectCoercible(it)); -}; - -var isObject = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - -// `ToPrimitive` abstract operation -// https://tc39.github.io/ecma262/#sec-toprimitive -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -var toPrimitive = function (input, PREFERRED_STRING) { - if (!isObject(input)) return input; - var fn, val; - if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; - if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - -var hasOwnProperty = {}.hasOwnProperty; - -var has = function (it, key) { - return hasOwnProperty.call(it, key); -}; - -var document$1 = global_1.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document$1) && isObject(document$1.createElement); - -var documentCreateElement = function (it) { - return EXISTS ? document$1.createElement(it) : {}; -}; - -// Thank's IE8 for his funny defineProperty -var ie8DomDefine = !descriptors && !fails(function () { - return Object.defineProperty(documentCreateElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - -var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor -var f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPrimitive(P, true); - if (ie8DomDefine) try { - return nativeGetOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]); -}; - -var objectGetOwnPropertyDescriptor = { - f: f$1 -}; - -var anObject = function (it) { - if (!isObject(it)) { - throw TypeError(String(it) + ' is not an object'); - } return it; -}; - -var nativeDefineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.github.io/ecma262/#sec-object.defineproperty -var f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (ie8DomDefine) try { - return nativeDefineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - -var objectDefineProperty = { - f: f$2 -}; - -var createNonEnumerableProperty = descriptors ? function (object, key, value) { - return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - -var setGlobal = function (key, value) { - try { - createNonEnumerableProperty(global_1, key, value); - } catch (error) { - global_1[key] = value; - } return value; -}; - -var SHARED = '__core-js_shared__'; -var store = global_1[SHARED] || setGlobal(SHARED, {}); - -var sharedStore = store; - -var functionToString = Function.toString; - -// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper -if (typeof sharedStore.inspectSource != 'function') { - sharedStore.inspectSource = function (it) { - return functionToString.call(it); - }; -} - -var inspectSource = sharedStore.inspectSource; - -var WeakMap = global_1.WeakMap; - -var nativeWeakMap = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap)); - -var shared = createCommonjsModule(function (module) { -(module.exports = function (key, value) { - return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.7.0', - mode: 'global', - copyright: '© 2020 Denis Pushkarev (zloirock.ru)' -}); -}); - -var id = 0; -var postfix = Math.random(); - -var uid = function (key) { - return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); -}; - -var keys = shared('keys'); - -var sharedKey = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - -var hiddenKeys = {}; - -var WeakMap$1 = global_1.WeakMap; -var set, get, has$1; - -var enforce = function (it) { - return has$1(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (nativeWeakMap) { - var store$1 = sharedStore.state || (sharedStore.state = new WeakMap$1()); - var wmget = store$1.get; - var wmhas = store$1.has; - var wmset = store$1.set; - set = function (it, metadata) { - metadata.facade = it; - wmset.call(store$1, it, metadata); - return metadata; - }; - get = function (it) { - return wmget.call(store$1, it) || {}; - }; - has$1 = function (it) { - return wmhas.call(store$1, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - metadata.facade = it; - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return has(it, STATE) ? it[STATE] : {}; - }; - has$1 = function (it) { - return has(it, STATE); - }; -} - -var internalState = { - set: set, - get: get, - has: has$1, - enforce: enforce, - getterFor: getterFor -}; - -var redefine = createCommonjsModule(function (module) { -var getInternalState = internalState.get; -var enforceInternalState = internalState.enforce; -var TEMPLATE = String(String).split('String'); - -(module.exports = function (O, key, value, options) { - var unsafe = options ? !!options.unsafe : false; - var simple = options ? !!options.enumerable : false; - var noTargetGet = options ? !!options.noTargetGet : false; - var state; - if (typeof value == 'function') { - if (typeof key == 'string' && !has(value, 'name')) { - createNonEnumerableProperty(value, 'name', key); - } - state = enforceInternalState(value); - if (!state.source) { - state.source = TEMPLATE.join(typeof key == 'string' ? key : ''); - } - } - if (O === global_1) { - if (simple) O[key] = value; - else setGlobal(key, value); - return; - } else if (!unsafe) { - delete O[key]; - } else if (!noTargetGet && O[key]) { - simple = true; - } - if (simple) O[key] = value; - else createNonEnumerableProperty(O, key, value); -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, 'toString', function toString() { - return typeof this == 'function' && getInternalState(this).source || inspectSource(this); -}); -}); - -var path = global_1; - -var aFunction = function (variable) { - return typeof variable == 'function' ? variable : undefined; -}; - -var getBuiltIn = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace]) - : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method]; -}; - -var ceil = Math.ceil; -var floor = Math.floor; - -// `ToInteger` abstract operation -// https://tc39.github.io/ecma262/#sec-tointeger -var toInteger = function (argument) { - return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); -}; - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.github.io/ecma262/#sec-tolength -var toLength = function (argument) { - return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - -var max = Math.max; -var min$1 = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). -var toAbsoluteIndex = function (index, length) { - var integer = toInteger(index); - return integer < 0 ? max(integer + length, 0) : min$1(integer, length); -}; - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -var arrayIncludes = { - // `Array.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.github.io/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; - -var indexOf = arrayIncludes.indexOf; - - -var objectKeysInternal = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~indexOf(result, key) || result.push(key); - } - return result; -}; - -// IE8- don't enum bug keys -var enumBugKeys = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - -var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertynames -var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return objectKeysInternal(O, hiddenKeys$1); -}; - -var objectGetOwnPropertyNames = { - f: f$3 -}; - -var f$4 = Object.getOwnPropertySymbols; - -var objectGetOwnPropertySymbols = { - f: f$4 -}; - -// all object keys, includes non-enumerable and symbols -var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = objectGetOwnPropertyNames.f(anObject(it)); - var getOwnPropertySymbols = objectGetOwnPropertySymbols.f; - return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; -}; - -var copyConstructorProperties = function (target, source) { - var keys = ownKeys(source); - var defineProperty = objectDefineProperty.f; - var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } -}; - -var replacement = /#|\.prototype\./; - -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : typeof detection == 'function' ? fails(detection) - : !!detection; -}; - -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; - -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -var isForced_1 = isForced; - -var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f; - - - - - - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target -*/ -var _export = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global_1; - } else if (STATIC) { - target = global_1[TARGET] || setGlobal(TARGET, {}); - } else { - target = (global_1[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor$1(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty === typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(sourceProperty, 'sham', true); - } - // extend global - redefine(target, key, sourceProperty, options); - } -}; - -// `IsArray` abstract operation -// https://tc39.github.io/ecma262/#sec-isarray -var isArray = Array.isArray || function isArray(arg) { - return classofRaw(arg) == 'Array'; -}; - -// `ToObject` abstract operation -// https://tc39.github.io/ecma262/#sec-toobject -var toObject = function (argument) { - return Object(requireObjectCoercible(argument)); -}; - -var createProperty = function (object, key, value) { - var propertyKey = toPrimitive(key); - if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; -}; - -var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () { - // Chrome 38 Symbol has incorrect toString conversion - // eslint-disable-next-line no-undef - return !String(Symbol()); -}); - -var useSymbolAsUid = nativeSymbol - // eslint-disable-next-line no-undef - && !Symbol.sham - // eslint-disable-next-line no-undef - && typeof Symbol.iterator == 'symbol'; - -var WellKnownSymbolsStore = shared('wks'); -var Symbol$1 = global_1.Symbol; -var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid; - -var wellKnownSymbol = function (name) { - if (!has(WellKnownSymbolsStore, name)) { - if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name]; - else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name); - } return WellKnownSymbolsStore[name]; -}; - -var SPECIES = wellKnownSymbol('species'); - -// `ArraySpeciesCreate` abstract operation -// https://tc39.github.io/ecma262/#sec-arrayspeciescreate -var arraySpeciesCreate = function (originalArray, length) { - var C; - if (isArray(originalArray)) { - C = originalArray.constructor; - // cross-realm fallback - if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; - else if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return new (C === undefined ? Array : C)(length === 0 ? 0 : length); -}; - -var engineUserAgent = getBuiltIn('navigator', 'userAgent') || ''; - -var process$1 = global_1.process; -var versions = process$1 && process$1.versions; -var v8 = versions && versions.v8; -var match, version; - -if (v8) { - match = v8.split('.'); - version = match[0] + match[1]; -} else if (engineUserAgent) { - match = engineUserAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = engineUserAgent.match(/Chrome\/(\d+)/); - if (match) version = match[1]; - } -} - -var engineV8Version = version && +version; - -var SPECIES$1 = wellKnownSymbol('species'); - -var arrayMethodHasSpeciesSupport = function (METHOD_NAME) { - // We can't use this feature detection in V8 since it causes - // deoptimization and serious performance degradation - // https://github.com/zloirock/core-js/issues/677 - return engineV8Version >= 51 || !fails(function () { - var array = []; - var constructor = array.constructor = {}; - constructor[SPECIES$1] = function () { - return { foo: 1 }; - }; - return array[METHOD_NAME](Boolean).foo !== 1; - }); -}; - -var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); -var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; -var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; - -// We can't use this feature detection in V8 since it causes -// deoptimization and serious performance degradation -// https://github.com/zloirock/core-js/issues/679 -var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () { - var array = []; - array[IS_CONCAT_SPREADABLE] = false; - return array.concat()[0] !== array; -}); - -var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); - -var isConcatSpreadable = function (O) { - if (!isObject(O)) return false; - var spreadable = O[IS_CONCAT_SPREADABLE]; - return spreadable !== undefined ? !!spreadable : isArray(O); -}; - -var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; - -// `Array.prototype.concat` method -// https://tc39.github.io/ecma262/#sec-array.prototype.concat -// with adding support of @@isConcatSpreadable and @@species -_export({ target: 'Array', proto: true, forced: FORCED }, { - concat: function concat(arg) { // eslint-disable-line no-unused-vars - var O = toObject(this); - var A = arraySpeciesCreate(O, 0); - var n = 0; - var i, k, length, len, E; - for (i = -1, length = arguments.length; i < length; i++) { - E = i === -1 ? O : arguments[i]; - if (isConcatSpreadable(E)) { - len = toLength(E.length); - if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); - } else { - if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - createProperty(A, n++, E); - } - } - A.length = n; - return A; - } -}); - -var aFunction$1 = function (it) { - if (typeof it != 'function') { - throw TypeError(String(it) + ' is not a function'); - } return it; -}; - -// optional / simple context binding -var functionBindContext = function (fn, that, length) { - aFunction$1(fn); - if (that === undefined) return fn; - switch (length) { - case 0: return function () { - return fn.call(that); - }; - case 1: return function (a) { - return fn.call(that, a); - }; - case 2: return function (a, b) { - return fn.call(that, a, b); - }; - case 3: return function (a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - -var push = [].push; - -// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation -var createMethod$1 = function (TYPE) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - return function ($this, callbackfn, that, specificCreate) { - var O = toObject($this); - var self = indexedObject(O); - var boundFunction = functionBindContext(callbackfn, that, 3); - var length = toLength(self.length); - var index = 0; - var create = specificCreate || arraySpeciesCreate; - var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; - var value, result; - for (;length > index; index++) if (NO_HOLES || index in self) { - value = self[index]; - result = boundFunction(value, index, O); - if (TYPE) { - if (IS_MAP) target[index] = result; // map - else if (result) switch (TYPE) { - case 3: return true; // some - case 5: return value; // find - case 6: return index; // findIndex - case 2: push.call(target, value); // filter - } else if (IS_EVERY) return false; // every - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; - }; -}; - -var arrayIteration = { - // `Array.prototype.forEach` method - // https://tc39.github.io/ecma262/#sec-array.prototype.foreach - forEach: createMethod$1(0), - // `Array.prototype.map` method - // https://tc39.github.io/ecma262/#sec-array.prototype.map - map: createMethod$1(1), - // `Array.prototype.filter` method - // https://tc39.github.io/ecma262/#sec-array.prototype.filter - filter: createMethod$1(2), - // `Array.prototype.some` method - // https://tc39.github.io/ecma262/#sec-array.prototype.some - some: createMethod$1(3), - // `Array.prototype.every` method - // https://tc39.github.io/ecma262/#sec-array.prototype.every - every: createMethod$1(4), - // `Array.prototype.find` method - // https://tc39.github.io/ecma262/#sec-array.prototype.find - find: createMethod$1(5), - // `Array.prototype.findIndex` method - // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex - findIndex: createMethod$1(6) -}; - -var arrayMethodIsStrict = function (METHOD_NAME, argument) { - var method = [][METHOD_NAME]; - return !!method && fails(function () { - // eslint-disable-next-line no-useless-call,no-throw-literal - method.call(null, argument || function () { throw 1; }, 1); - }); -}; - -var defineProperty = Object.defineProperty; -var cache = {}; - -var thrower = function (it) { throw it; }; - -var arrayMethodUsesToLength = function (METHOD_NAME, options) { - if (has(cache, METHOD_NAME)) return cache[METHOD_NAME]; - if (!options) options = {}; - var method = [][METHOD_NAME]; - var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false; - var argument0 = has(options, 0) ? options[0] : thrower; - var argument1 = has(options, 1) ? options[1] : undefined; - - return cache[METHOD_NAME] = !!method && !fails(function () { - if (ACCESSORS && !descriptors) return true; - var O = { length: -1 }; - - if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower }); - else O[1] = 1; - - method.call(O, argument0, argument1); - }); -}; - -var $forEach = arrayIteration.forEach; - - - -var STRICT_METHOD = arrayMethodIsStrict('forEach'); -var USES_TO_LENGTH = arrayMethodUsesToLength('forEach'); - -// `Array.prototype.forEach` method implementation -// https://tc39.github.io/ecma262/#sec-array.prototype.foreach -var arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) { - return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); -} : [].forEach; - -// `Array.prototype.forEach` method -// https://tc39.github.io/ecma262/#sec-array.prototype.foreach -_export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, { - forEach: arrayForEach -}); - -// `Object.keys` method -// https://tc39.github.io/ecma262/#sec-object.keys -var objectKeys = Object.keys || function keys(O) { - return objectKeysInternal(O, enumBugKeys); -}; - -// `Object.defineProperties` method -// https://tc39.github.io/ecma262/#sec-object.defineproperties -var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]); - return O; -}; - -var html = getBuiltIn('document', 'documentElement'); - -var GT = '>'; -var LT = '<'; -var PROTOTYPE = 'prototype'; -var SCRIPT = 'script'; -var IE_PROTO = sharedKey('IE_PROTO'); - -var EmptyConstructor = function () { /* empty */ }; - -var scriptTag = function (content) { - return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; -}; - -// Create object with fake `null` prototype: use ActiveX Object with cleared prototype -var NullProtoObjectViaActiveX = function (activeXDocument) { - activeXDocument.write(scriptTag('')); - activeXDocument.close(); - var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak - return temp; -}; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var NullProtoObjectViaIFrame = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var JS = 'java' + SCRIPT + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - // https://github.com/zloirock/core-js/issues/475 - iframe.src = String(JS); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(scriptTag('document.F=Object')); - iframeDocument.close(); - return iframeDocument.F; -}; - -// Check for document.domain and active x support -// No need to use active x approach when document.domain is not set -// see https://github.com/es-shims/es5-shim/issues/150 -// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 -// avoid IE GC bug -var activeXDocument; -var NullProtoObject = function () { - try { - /* global ActiveXObject */ - activeXDocument = document.domain && new ActiveXObject('htmlfile'); - } catch (error) { /* ignore */ } - NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame(); - var length = enumBugKeys.length; - while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; - return NullProtoObject(); -}; - -hiddenKeys[IE_PROTO] = true; - -// `Object.create` method -// https://tc39.github.io/ecma262/#sec-object.create -var objectCreate = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - EmptyConstructor[PROTOTYPE] = anObject(O); - result = new EmptyConstructor(); - EmptyConstructor[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = NullProtoObject(); - return Properties === undefined ? result : objectDefineProperties(result, Properties); -}; - -var UNSCOPABLES = wellKnownSymbol('unscopables'); -var ArrayPrototype = Array.prototype; - -// Array.prototype[@@unscopables] -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -if (ArrayPrototype[UNSCOPABLES] == undefined) { - objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, { - configurable: true, - value: objectCreate(null) - }); -} - -// add a key to Array.prototype[@@unscopables] -var addToUnscopables = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; -}; - -var $includes = arrayIncludes.includes; - - - -var USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 }); - -// `Array.prototype.includes` method -// https://tc39.github.io/ecma262/#sec-array.prototype.includes -_export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$1 }, { - includes: function includes(el /* , fromIndex = 0 */) { - return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); - } -}); - -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('includes'); - -var nativeJoin = [].join; - -var ES3_STRINGS = indexedObject != Object; -var STRICT_METHOD$1 = arrayMethodIsStrict('join', ','); - -// `Array.prototype.join` method -// https://tc39.github.io/ecma262/#sec-array.prototype.join -_export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$1 }, { - join: function join(separator) { - return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator); - } -}); - -// `Array.prototype.{ reduce, reduceRight }` methods implementation -var createMethod$2 = function (IS_RIGHT) { - return function (that, callbackfn, argumentsLength, memo) { - aFunction$1(callbackfn); - var O = toObject(that); - var self = indexedObject(O); - var length = toLength(O.length); - var index = IS_RIGHT ? length - 1 : 0; - var i = IS_RIGHT ? -1 : 1; - if (argumentsLength < 2) while (true) { - if (index in self) { - memo = self[index]; - index += i; - break; - } - index += i; - if (IS_RIGHT ? index < 0 : length <= index) { - throw TypeError('Reduce of empty array with no initial value'); - } - } - for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { - memo = callbackfn(memo, self[index], index, O); - } - return memo; - }; -}; - -var arrayReduce = { - // `Array.prototype.reduce` method - // https://tc39.github.io/ecma262/#sec-array.prototype.reduce - left: createMethod$2(false), - // `Array.prototype.reduceRight` method - // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright - right: createMethod$2(true) -}; - -var engineIsNode = classofRaw(global_1.process) == 'process'; - -var $reduce = arrayReduce.left; - - - - - -var STRICT_METHOD$2 = arrayMethodIsStrict('reduce'); -var USES_TO_LENGTH$2 = arrayMethodUsesToLength('reduce', { 1: 0 }); -// Chrome 80-82 has a critical bug -// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982 -var CHROME_BUG = !engineIsNode && engineV8Version > 79 && engineV8Version < 83; - -// `Array.prototype.reduce` method -// https://tc39.github.io/ecma262/#sec-array.prototype.reduce -_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$2 || !USES_TO_LENGTH$2 || CHROME_BUG }, { - reduce: function reduce(callbackfn /* , initialValue */) { - return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); - } -}); - -var defineProperty$1 = objectDefineProperty.f; - -var FunctionPrototype = Function.prototype; -var FunctionPrototypeToString = FunctionPrototype.toString; -var nameRE = /^\s*function ([^ (]*)/; -var NAME = 'name'; - -// Function instances `.name` property -// https://tc39.github.io/ecma262/#sec-function-instances-name -if (descriptors && !(NAME in FunctionPrototype)) { - defineProperty$1(FunctionPrototype, NAME, { - configurable: true, - get: function () { - try { - return FunctionPrototypeToString.call(this).match(nameRE)[1]; - } catch (error) { - return ''; - } - } - }); -} - -var nativeAssign = Object.assign; -var defineProperty$2 = Object.defineProperty; - -// `Object.assign` method -// https://tc39.github.io/ecma262/#sec-object.assign -var objectAssign = !nativeAssign || fails(function () { - // should have correct order of operations (Edge bug) - if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$2({}, 'a', { - enumerable: true, - get: function () { - defineProperty$2(this, 'b', { - value: 3, - enumerable: false - }); - } - }), { b: 2 })).b !== 1) return true; - // should work with symbols and should have deterministic property order (V8 bug) - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var symbol = Symbol(); - var alphabet = 'abcdefghijklmnopqrst'; - A[symbol] = 7; - alphabet.split('').forEach(function (chr) { B[chr] = chr; }); - return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = toObject(target); - var argumentsLength = arguments.length; - var index = 1; - var getOwnPropertySymbols = objectGetOwnPropertySymbols.f; - var propertyIsEnumerable = objectPropertyIsEnumerable.f; - while (argumentsLength > index) { - var S = indexedObject(arguments[index++]); - var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) { - key = keys[j++]; - if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key]; - } - } return T; -} : nativeAssign; - -// `Object.assign` method -// https://tc39.github.io/ecma262/#sec-object.assign -_export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, { - assign: objectAssign -}); - -var FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); }); - -// `Object.keys` method -// https://tc39.github.io/ecma262/#sec-object.keys -_export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { - keys: function keys(it) { - return objectKeys(toObject(it)); - } -}); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var test = {}; - -test[TO_STRING_TAG] = 'z'; - -var toStringTagSupport = String(test) === '[object z]'; - -var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag'); -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; - -// getting tag from ES6+ `Object.prototype.toString` -var classof = toStringTagSupport ? classofRaw : function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$1)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; -}; - -// `Object.prototype.toString` method implementation -// https://tc39.github.io/ecma262/#sec-object.prototype.tostring -var objectToString = toStringTagSupport ? {}.toString : function toString() { - return '[object ' + classof(this) + ']'; -}; - -// `Object.prototype.toString` method -// https://tc39.github.io/ecma262/#sec-object.prototype.tostring -if (!toStringTagSupport) { - redefine(Object.prototype, 'toString', objectToString, { unsafe: true }); -} - -var nativePromiseConstructor = global_1.Promise; - -var redefineAll = function (target, src, options) { - for (var key in src) redefine(target, key, src[key], options); - return target; -}; - -var defineProperty$3 = objectDefineProperty.f; - - - -var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag'); - -var setToStringTag = function (it, TAG, STATIC) { - if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG$2)) { - defineProperty$3(it, TO_STRING_TAG$2, { configurable: true, value: TAG }); - } -}; - -var SPECIES$2 = wellKnownSymbol('species'); - -var setSpecies = function (CONSTRUCTOR_NAME) { - var Constructor = getBuiltIn(CONSTRUCTOR_NAME); - var defineProperty = objectDefineProperty.f; - - if (descriptors && Constructor && !Constructor[SPECIES$2]) { - defineProperty(Constructor, SPECIES$2, { - configurable: true, - get: function () { return this; } - }); - } -}; - -var anInstance = function (it, Constructor, name) { - if (!(it instanceof Constructor)) { - throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); - } return it; -}; - -var iterators = {}; - -var ITERATOR = wellKnownSymbol('iterator'); -var ArrayPrototype$1 = Array.prototype; - -// check on default Array iterator -var isArrayIteratorMethod = function (it) { - return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR] === it); -}; - -var ITERATOR$1 = wellKnownSymbol('iterator'); - -var getIteratorMethod = function (it) { - if (it != undefined) return it[ITERATOR$1] - || it['@@iterator'] - || iterators[classof(it)]; -}; - -var iteratorClose = function (iterator) { - var returnMethod = iterator['return']; - if (returnMethod !== undefined) { - return anObject(returnMethod.call(iterator)).value; - } -}; - -var Result = function (stopped, result) { - this.stopped = stopped; - this.result = result; -}; - -var iterate = function (iterable, unboundFunction, options) { - var that = options && options.that; - var AS_ENTRIES = !!(options && options.AS_ENTRIES); - var IS_ITERATOR = !!(options && options.IS_ITERATOR); - var INTERRUPTED = !!(options && options.INTERRUPTED); - var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED); - var iterator, iterFn, index, length, result, next, step; - - var stop = function (condition) { - if (iterator) iteratorClose(iterator); - return new Result(true, condition); - }; - - var callFn = function (value) { - if (AS_ENTRIES) { - anObject(value); - return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); - } return INTERRUPTED ? fn(value, stop) : fn(value); - }; - - if (IS_ITERATOR) { - iterator = iterable; - } else { - iterFn = getIteratorMethod(iterable); - if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); - // optimisation for array iterators - if (isArrayIteratorMethod(iterFn)) { - for (index = 0, length = toLength(iterable.length); length > index; index++) { - result = callFn(iterable[index]); - if (result && result instanceof Result) return result; - } return new Result(false); - } - iterator = iterFn.call(iterable); - } - - next = iterator.next; - while (!(step = next.call(iterator)).done) { - try { - result = callFn(step.value); - } catch (error) { - iteratorClose(iterator); - throw error; - } - if (typeof result == 'object' && result && result instanceof Result) return result; - } return new Result(false); -}; - -var ITERATOR$2 = wellKnownSymbol('iterator'); -var SAFE_CLOSING = false; - -try { - var called = 0; - var iteratorWithReturn = { - next: function () { - return { done: !!called++ }; - }, - 'return': function () { - SAFE_CLOSING = true; - } - }; - iteratorWithReturn[ITERATOR$2] = function () { - return this; - }; - // eslint-disable-next-line no-throw-literal - Array.from(iteratorWithReturn, function () { throw 2; }); -} catch (error) { /* empty */ } - -var checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) { - if (!SKIP_CLOSING && !SAFE_CLOSING) return false; - var ITERATION_SUPPORT = false; - try { - var object = {}; - object[ITERATOR$2] = function () { - return { - next: function () { - return { done: ITERATION_SUPPORT = true }; - } - }; - }; - exec(object); - } catch (error) { /* empty */ } - return ITERATION_SUPPORT; -}; - -var SPECIES$3 = wellKnownSymbol('species'); - -// `SpeciesConstructor` abstract operation -// https://tc39.github.io/ecma262/#sec-speciesconstructor -var speciesConstructor = function (O, defaultConstructor) { - var C = anObject(O).constructor; - var S; - return C === undefined || (S = anObject(C)[SPECIES$3]) == undefined ? defaultConstructor : aFunction$1(S); -}; - -var engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent); - -var location = global_1.location; -var set$1 = global_1.setImmediate; -var clear = global_1.clearImmediate; -var process$2 = global_1.process; -var MessageChannel = global_1.MessageChannel; -var Dispatch = global_1.Dispatch; -var counter = 0; -var queue = {}; -var ONREADYSTATECHANGE = 'onreadystatechange'; -var defer, channel, port; - -var run = function (id) { - // eslint-disable-next-line no-prototype-builtins - if (queue.hasOwnProperty(id)) { - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; - -var runner = function (id) { - return function () { - run(id); - }; -}; - -var listener = function (event) { - run(event.data); -}; - -var post = function (id) { - // old engines have not location.origin - global_1.postMessage(id + '', location.protocol + '//' + location.host); -}; - -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if (!set$1 || !clear) { - set$1 = function setImmediate(fn) { - var args = []; - var i = 1; - while (arguments.length > i) args.push(arguments[i++]); - queue[++counter] = function () { - // eslint-disable-next-line no-new-func - (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); - }; - defer(counter); - return counter; - }; - clear = function clearImmediate(id) { - delete queue[id]; - }; - // Node.js 0.8- - if (engineIsNode) { - defer = function (id) { - process$2.nextTick(runner(id)); - }; - // Sphere (JS game engine) Dispatch API - } else if (Dispatch && Dispatch.now) { - defer = function (id) { - Dispatch.now(runner(id)); - }; - // Browsers with MessageChannel, includes WebWorkers - // except iOS - https://github.com/zloirock/core-js/issues/624 - } else if (MessageChannel && !engineIsIos) { - channel = new MessageChannel(); - port = channel.port2; - channel.port1.onmessage = listener; - defer = functionBindContext(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if ( - global_1.addEventListener && - typeof postMessage == 'function' && - !global_1.importScripts && - location && location.protocol !== 'file:' && - !fails(post) - ) { - defer = post; - global_1.addEventListener('message', listener, false); - // IE8- - } else if (ONREADYSTATECHANGE in documentCreateElement('script')) { - defer = function (id) { - html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () { - html.removeChild(this); - run(id); - }; - }; - // Rest old browsers - } else { - defer = function (id) { - setTimeout(runner(id), 0); - }; - } -} - -var task = { - set: set$1, - clear: clear -}; - -var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f; -var macrotask = task.set; - - - -var MutationObserver = global_1.MutationObserver || global_1.WebKitMutationObserver; -var document$2 = global_1.document; -var process$3 = global_1.process; -var Promise$1 = global_1.Promise; -// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` -var queueMicrotaskDescriptor = getOwnPropertyDescriptor$2(global_1, 'queueMicrotask'); -var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; - -var flush, head, last, notify, toggle, node, promise, then; - -// modern engines have queueMicrotask method -if (!queueMicrotask) { - flush = function () { - var parent, fn; - if (engineIsNode && (parent = process$3.domain)) parent.exit(); - while (head) { - fn = head.fn; - head = head.next; - try { - fn(); - } catch (error) { - if (head) notify(); - else last = undefined; - throw error; - } - } last = undefined; - if (parent) parent.enter(); - }; - - // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 - if (!engineIsIos && !engineIsNode && MutationObserver && document$2) { - toggle = true; - node = document$2.createTextNode(''); - new MutationObserver(flush).observe(node, { characterData: true }); - notify = function () { - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if (Promise$1 && Promise$1.resolve) { - // Promise.resolve without an argument throws an error in LG WebOS 2 - promise = Promise$1.resolve(undefined); - then = promise.then; - notify = function () { - then.call(promise, flush); - }; - // Node.js without promises - } else if (engineIsNode) { - notify = function () { - process$3.nextTick(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function () { - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(global_1, flush); - }; - } -} - -var microtask = queueMicrotask || function (fn) { - var task = { fn: fn, next: undefined }; - if (last) last.next = task; - if (!head) { - head = task; - notify(); - } last = task; -}; - -var PromiseCapability = function (C) { - var resolve, reject; - this.promise = new C(function ($$resolve, $$reject) { - if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aFunction$1(resolve); - this.reject = aFunction$1(reject); -}; - -// 25.4.1.5 NewPromiseCapability(C) -var f$5 = function (C) { - return new PromiseCapability(C); -}; - -var newPromiseCapability = { - f: f$5 -}; - -var promiseResolve = function (C, x) { - anObject(C); - if (isObject(x) && x.constructor === C) return x; - var promiseCapability = newPromiseCapability.f(C); - var resolve = promiseCapability.resolve; - resolve(x); - return promiseCapability.promise; -}; - -var hostReportErrors = function (a, b) { - var console = global_1.console; - if (console && console.error) { - arguments.length === 1 ? console.error(a) : console.error(a, b); - } -}; - -var perform = function (exec) { - try { - return { error: false, value: exec() }; - } catch (error) { - return { error: true, value: error }; - } -}; - -var task$1 = task.set; - - - - - - - - - - - -var SPECIES$4 = wellKnownSymbol('species'); -var PROMISE = 'Promise'; -var getInternalState = internalState.get; -var setInternalState = internalState.set; -var getInternalPromiseState = internalState.getterFor(PROMISE); -var PromiseConstructor = nativePromiseConstructor; -var TypeError$1 = global_1.TypeError; -var document$3 = global_1.document; -var process$4 = global_1.process; -var $fetch = getBuiltIn('fetch'); -var newPromiseCapability$1 = newPromiseCapability.f; -var newGenericPromiseCapability = newPromiseCapability$1; -var DISPATCH_EVENT = !!(document$3 && document$3.createEvent && global_1.dispatchEvent); -var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function'; -var UNHANDLED_REJECTION = 'unhandledrejection'; -var REJECTION_HANDLED = 'rejectionhandled'; -var PENDING = 0; -var FULFILLED = 1; -var REJECTED = 2; -var HANDLED = 1; -var UNHANDLED = 2; -var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; - -var FORCED$1 = isForced_1(PROMISE, function () { - var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor); - if (!GLOBAL_CORE_JS_PROMISE) { - // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables - // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 - // We can't detect it synchronously, so just check versions - if (engineV8Version === 66) return true; - // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test - if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true; - } - // We can't use @@species feature detection in V8 since it causes - // deoptimization and performance degradation - // https://github.com/zloirock/core-js/issues/679 - if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false; - // Detect correctness of subclassing with @@species support - var promise = PromiseConstructor.resolve(1); - var FakePromise = function (exec) { - exec(function () { /* empty */ }, function () { /* empty */ }); - }; - var constructor = promise.constructor = {}; - constructor[SPECIES$4] = FakePromise; - return !(promise.then(function () { /* empty */ }) instanceof FakePromise); -}); - -var INCORRECT_ITERATION = FORCED$1 || !checkCorrectnessOfIteration(function (iterable) { - PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); -}); - -// helpers -var isThenable = function (it) { - var then; - return isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; - -var notify$1 = function (state, isReject) { - if (state.notified) return; - state.notified = true; - var chain = state.reactions; - microtask(function () { - var value = state.value; - var ok = state.state == FULFILLED; - var index = 0; - // variable length - can't use forEach - while (chain.length > index) { - var reaction = chain[index++]; - var handler = ok ? reaction.ok : reaction.fail; - var resolve = reaction.resolve; - var reject = reaction.reject; - var domain = reaction.domain; - var result, then, exited; - try { - if (handler) { - if (!ok) { - if (state.rejection === UNHANDLED) onHandleUnhandled(state); - state.rejection = HANDLED; - } - if (handler === true) result = value; - else { - if (domain) domain.enter(); - result = handler(value); // can throw - if (domain) { - domain.exit(); - exited = true; - } - } - if (result === reaction.promise) { - reject(TypeError$1('Promise-chain cycle')); - } else if (then = isThenable(result)) { - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch (error) { - if (domain && !exited) domain.exit(); - reject(error); - } - } - state.reactions = []; - state.notified = false; - if (isReject && !state.rejection) onUnhandled(state); - }); -}; - -var dispatchEvent = function (name, promise, reason) { - var event, handler; - if (DISPATCH_EVENT) { - event = document$3.createEvent('Event'); - event.promise = promise; - event.reason = reason; - event.initEvent(name, false, true); - global_1.dispatchEvent(event); - } else event = { promise: promise, reason: reason }; - if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event); - else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); -}; - -var onUnhandled = function (state) { - task$1.call(global_1, function () { - var promise = state.facade; - var value = state.value; - var IS_UNHANDLED = isUnhandled(state); - var result; - if (IS_UNHANDLED) { - result = perform(function () { - if (engineIsNode) { - process$4.emit('unhandledRejection', value, promise); - } else dispatchEvent(UNHANDLED_REJECTION, promise, value); - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED; - if (result.error) throw result.value; - } - }); -}; - -var isUnhandled = function (state) { - return state.rejection !== HANDLED && !state.parent; -}; - -var onHandleUnhandled = function (state) { - task$1.call(global_1, function () { - var promise = state.facade; - if (engineIsNode) { - process$4.emit('rejectionHandled', promise); - } else dispatchEvent(REJECTION_HANDLED, promise, state.value); - }); -}; - -var bind = function (fn, state, unwrap) { - return function (value) { - fn(state, value, unwrap); - }; -}; - -var internalReject = function (state, value, unwrap) { - if (state.done) return; - state.done = true; - if (unwrap) state = unwrap; - state.value = value; - state.state = REJECTED; - notify$1(state, true); -}; - -var internalResolve = function (state, value, unwrap) { - if (state.done) return; - state.done = true; - if (unwrap) state = unwrap; - try { - if (state.facade === value) throw TypeError$1("Promise can't be resolved itself"); - var then = isThenable(value); - if (then) { - microtask(function () { - var wrapper = { done: false }; - try { - then.call(value, - bind(internalResolve, wrapper, state), - bind(internalReject, wrapper, state) - ); - } catch (error) { - internalReject(wrapper, error, state); - } - }); - } else { - state.value = value; - state.state = FULFILLED; - notify$1(state, false); - } - } catch (error) { - internalReject({ done: false }, error, state); - } -}; - -// constructor polyfill -if (FORCED$1) { - // 25.4.3.1 Promise(executor) - PromiseConstructor = function Promise(executor) { - anInstance(this, PromiseConstructor, PROMISE); - aFunction$1(executor); - Internal.call(this); - var state = getInternalState(this); - try { - executor(bind(internalResolve, state), bind(internalReject, state)); - } catch (error) { - internalReject(state, error); - } - }; - // eslint-disable-next-line no-unused-vars - Internal = function Promise(executor) { - setInternalState(this, { - type: PROMISE, - done: false, - notified: false, - parent: false, - reactions: [], - rejection: false, - state: PENDING, - value: undefined - }); - }; - Internal.prototype = redefineAll(PromiseConstructor.prototype, { - // `Promise.prototype.then` method - // https://tc39.github.io/ecma262/#sec-promise.prototype.then - then: function then(onFulfilled, onRejected) { - var state = getInternalPromiseState(this); - var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = engineIsNode ? process$4.domain : undefined; - state.parent = true; - state.reactions.push(reaction); - if (state.state != PENDING) notify$1(state, false); - return reaction.promise; - }, - // `Promise.prototype.catch` method - // https://tc39.github.io/ecma262/#sec-promise.prototype.catch - 'catch': function (onRejected) { - return this.then(undefined, onRejected); - } - }); - OwnPromiseCapability = function () { - var promise = new Internal(); - var state = getInternalState(promise); - this.promise = promise; - this.resolve = bind(internalResolve, state); - this.reject = bind(internalReject, state); - }; - newPromiseCapability.f = newPromiseCapability$1 = function (C) { - return C === PromiseConstructor || C === PromiseWrapper - ? new OwnPromiseCapability(C) - : newGenericPromiseCapability(C); - }; - - if ( typeof nativePromiseConstructor == 'function') { - nativeThen = nativePromiseConstructor.prototype.then; - - // wrap native Promise#then for native async functions - redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) { - var that = this; - return new PromiseConstructor(function (resolve, reject) { - nativeThen.call(that, resolve, reject); - }).then(onFulfilled, onRejected); - // https://github.com/zloirock/core-js/issues/640 - }, { unsafe: true }); - - // wrap fetch result - if (typeof $fetch == 'function') _export({ global: true, enumerable: true, forced: true }, { - // eslint-disable-next-line no-unused-vars - fetch: function fetch(input /* , init */) { - return promiseResolve(PromiseConstructor, $fetch.apply(global_1, arguments)); - } - }); - } -} - -_export({ global: true, wrap: true, forced: FORCED$1 }, { - Promise: PromiseConstructor -}); - -setToStringTag(PromiseConstructor, PROMISE, false); -setSpecies(PROMISE); - -PromiseWrapper = getBuiltIn(PROMISE); - -// statics -_export({ target: PROMISE, stat: true, forced: FORCED$1 }, { - // `Promise.reject` method - // https://tc39.github.io/ecma262/#sec-promise.reject - reject: function reject(r) { - var capability = newPromiseCapability$1(this); - capability.reject.call(undefined, r); - return capability.promise; - } -}); - -_export({ target: PROMISE, stat: true, forced: FORCED$1 }, { - // `Promise.resolve` method - // https://tc39.github.io/ecma262/#sec-promise.resolve - resolve: function resolve(x) { - return promiseResolve( this, x); - } -}); - -_export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { - // `Promise.all` method - // https://tc39.github.io/ecma262/#sec-promise.all - all: function all(iterable) { - var C = this; - var capability = newPromiseCapability$1(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = perform(function () { - var $promiseResolve = aFunction$1(C.resolve); - var values = []; - var counter = 0; - var remaining = 1; - iterate(iterable, function (promise) { - var index = counter++; - var alreadyCalled = false; - values.push(undefined); - remaining++; - $promiseResolve.call(C, promise).then(function (value) { - if (alreadyCalled) return; - alreadyCalled = true; - values[index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if (result.error) reject(result.value); - return capability.promise; - }, - // `Promise.race` method - // https://tc39.github.io/ecma262/#sec-promise.race - race: function race(iterable) { - var C = this; - var capability = newPromiseCapability$1(C); - var reject = capability.reject; - var result = perform(function () { - var $promiseResolve = aFunction$1(C.resolve); - iterate(iterable, function (promise) { - $promiseResolve.call(C, promise).then(capability.resolve, reject); - }); - }); - if (result.error) reject(result.value); - return capability.promise; - } -}); - -var MATCH = wellKnownSymbol('match'); - -// `IsRegExp` abstract operation -// https://tc39.github.io/ecma262/#sec-isregexp -var isRegexp = function (it) { - var isRegExp; - return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp'); -}; - -var notARegexp = function (it) { - if (isRegexp(it)) { - throw TypeError("The method doesn't accept regular expressions"); - } return it; -}; - -var MATCH$1 = wellKnownSymbol('match'); - -var correctIsRegexpLogic = function (METHOD_NAME) { - var regexp = /./; - try { - '/./'[METHOD_NAME](regexp); - } catch (error1) { - try { - regexp[MATCH$1] = false; - return '/./'[METHOD_NAME](regexp); - } catch (error2) { /* empty */ } - } return false; -}; - -var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f; - - - - - - -var nativeEndsWith = ''.endsWith; -var min$2 = Math.min; - -var CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('endsWith'); -// https://github.com/zloirock/core-js/pull/702 -var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () { - var descriptor = getOwnPropertyDescriptor$3(String.prototype, 'endsWith'); - return descriptor && !descriptor.writable; -}(); - -// `String.prototype.endsWith` method -// https://tc39.github.io/ecma262/#sec-string.prototype.endswith -_export({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, { - endsWith: function endsWith(searchString /* , endPosition = @length */) { - var that = String(requireObjectCoercible(this)); - notARegexp(searchString); - var endPosition = arguments.length > 1 ? arguments[1] : undefined; - var len = toLength(that.length); - var end = endPosition === undefined ? len : min$2(toLength(endPosition), len); - var search = String(searchString); - return nativeEndsWith - ? nativeEndsWith.call(that, search, end) - : that.slice(end - search.length, end) === search; - } -}); - -var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f; - - - - - - -var nativeStartsWith = ''.startsWith; -var min$3 = Math.min; - -var CORRECT_IS_REGEXP_LOGIC$1 = correctIsRegexpLogic('startsWith'); -// https://github.com/zloirock/core-js/pull/702 -var MDN_POLYFILL_BUG$1 = !CORRECT_IS_REGEXP_LOGIC$1 && !!function () { - var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'startsWith'); - return descriptor && !descriptor.writable; -}(); - -// `String.prototype.startsWith` method -// https://tc39.github.io/ecma262/#sec-string.prototype.startswith -_export({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG$1 && !CORRECT_IS_REGEXP_LOGIC$1 }, { - startsWith: function startsWith(searchString /* , position = 0 */) { - var that = String(requireObjectCoercible(this)); - notARegexp(searchString); - var index = toLength(min$3(arguments.length > 1 ? arguments[1] : undefined, that.length)); - var search = String(searchString); - return nativeStartsWith - ? nativeStartsWith.call(that, search, index) - : that.slice(index, index + search.length) === search; - } -}); - -// iterable DOM collections -// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods -var domIterables = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 -}; - -for (var COLLECTION_NAME in domIterables) { - var Collection = global_1[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try { - createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach); - } catch (error) { - CollectionPrototype.forEach = arrayForEach; - } -} - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -} - -var bind$1 = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; - -/*global toString:true*/ - -// utils is a library of generic helper functions non-specific to axios - -var toString$1 = Object.prototype.toString; - -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray$1(val) { - return toString$1.call(val) === '[object Array]'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is a Buffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Buffer, otherwise false - */ -function isBuffer(val) { - return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) - && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString$1.call(val) === '[object ArrayBuffer]'; -} - -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} - -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} - -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} - -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} - -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject$1(val) { - return val !== null && typeof val === 'object'; -} - -/** - * Determine if a value is a plain Object - * - * @param {Object} val The value to test - * @return {boolean} True if value is a plain Object, otherwise false - */ -function isPlainObject(val) { - if (toString$1.call(val) !== '[object Object]') { - return false; - } - - var prototype = Object.getPrototypeOf(val); - return prototype === null || prototype === Object.prototype; -} - -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString$1.call(val) === '[object Date]'; -} - -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString$1.call(val) === '[object File]'; -} - -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString$1.call(val) === '[object Blob]'; -} - -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString$1.call(val) === '[object Function]'; -} - -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject$1(val) && isFunction(val.pipe); -} - -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} - -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); -} - -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - * nativescript - * navigator.product -> 'NativeScript' or 'NS' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || - navigator.product === 'NativeScript' || - navigator.product === 'NS')) { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} - -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } - - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } - - if (isArray$1(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} - -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (isPlainObject(result[key]) && isPlainObject(val)) { - result[key] = merge(result[key], val); - } else if (isPlainObject(val)) { - result[key] = merge({}, val); - } else if (isArray$1(val)) { - result[key] = val.slice(); - } else { - result[key] = val; - } - } - - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} - -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind$1(val, thisArg); - } else { - a[key] = val; - } - }); - return a; -} - -/** - * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) - * - * @param {string} content with BOM - * @return {string} content value without BOM - */ -function stripBOM(content) { - if (content.charCodeAt(0) === 0xFEFF) { - content = content.slice(1); - } - return content; -} - -var utils = { - isArray: isArray$1, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject$1, - isPlainObject: isPlainObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - extend: extend, - trim: trim, - stripBOM: stripBOM -}; - -function encode(val) { - return encodeURIComponent(val). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); -} - -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -var buildURL = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - var hashmarkIndex = url.indexOf('#'); - if (hashmarkIndex !== -1) { - url = url.slice(0, hashmarkIndex); - } - - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } - - return url; -}; - -function InterceptorManager() { - this.handlers = []; -} - -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; -}; - -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; - -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; - -var InterceptorManager_1 = InterceptorManager; - -/** - * Transform the data for a request or a response - * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data - */ -var transformData = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; -}; - -var isCancel = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; - -var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; - -/** - * Update an Error with the specified config, error code, and response. - * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. - */ -var enhanceError = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - - error.request = request; - error.response = response; - error.isAxiosError = true; - - error.toJSON = function toJSON() { - return { - // Standard - message: this.message, - name: this.name, - // Microsoft - description: this.description, - number: this.number, - // Mozilla - fileName: this.fileName, - lineNumber: this.lineNumber, - columnNumber: this.columnNumber, - stack: this.stack, - // Axios - config: this.config, - code: this.code - }; - }; - return error; -}; - -/** - * Create an Error with the specified message, config, error code, request and response. - * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. - */ -var createError = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; - -/** - * Resolve or reject a Promise based on response status. - * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. - */ -var settle = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - if (!response.status || !validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; - -var cookies = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); - - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } - - if (utils.isString(path)) { - cookie.push('path=' + path); - } - - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } - - if (secure === true) { - cookie.push('secure'); - } - - document.cookie = cookie.join('; '); - }, - - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, - - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : - - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -var isAbsoluteURL = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; - -/** - * Creates a new URL by combining the specified URLs - * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL - */ -var combineURLs = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; - -/** - * Creates a new URL by combining the baseURL with the requestedURL, - * only when the requestedURL is not already an absolute URL. - * If the requestURL is absolute, this function returns the requestedURL untouched. - * - * @param {string} baseURL The base URL - * @param {string} requestedURL Absolute or relative URL to combine - * @returns {string} The combined full path - */ -var buildFullPath = function buildFullPath(baseURL, requestedURL) { - if (baseURL && !isAbsoluteURL(requestedURL)) { - return combineURLs(baseURL, requestedURL); - } - return requestedURL; -}; - -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; - -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -var parseHeaders = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; - - if (!headers) { return parsed; } - - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); - - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); - - return parsed; -}; - -var isURLSameOrigin = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; - - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; - - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } - - originURL = resolveURL(window.location.href); - - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : - - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); - -var xhr = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - var request = new XMLHttpRequest(); - - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } - - var fullPath = buildFullPath(config.baseURL, config.url); - request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); - - // Set the request timeout in MS - request.timeout = config.timeout; - - // Listen for ready state - request.onreadystatechange = function handleLoad() { - if (!request || request.readyState !== 4) { - return; - } - - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } - - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // Clean up request - request = null; - }; - - // Handle browser request cancellation (as opposed to a manual cancellation) - request.onabort = function handleAbort() { - if (!request) { - return; - } - - reject(createError('Request aborted', config, 'ECONNABORTED', request)); - - // Clean up request - request = null; - }; - - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); - - // Clean up request - request = null; - }; - - // Handle timeout - request.ontimeout = function handleTimeout() { - var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; - if (config.timeoutErrorMessage) { - timeoutErrorMessage = config.timeoutErrorMessage; - } - reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', - request)); - - // Clean up request - request = null; - }; - - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; - - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; - } - } - - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); - } - - // Add withCredentials to request if needed - if (!utils.isUndefined(config.withCredentials)) { - request.withCredentials = !!config.withCredentials; - } - - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } - - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } - - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } - - if (!requestData) { - requestData = null; - } - - // Send the request - request.send(requestData); - }); -}; - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = xhr; - } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { - // For node use HTTP adapter - adapter = xhr; - } - return adapter; -} - -var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Accept'); - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); - } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); - } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } - } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - maxBodyLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; - -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; - -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); - -var defaults_1 = defaults; - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } -} - -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -var dispatchRequest = function dispatchRequest(config) { - throwIfCancellationRequested(config); - - // Ensure headers exist - config.headers = config.headers || {}; - - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); - - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers - ); - - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); - - var adapter = config.adapter || defaults_1.adapter; - - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); - - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); - - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } - - return Promise.reject(reason); - }); -}; - -/** - * Config-specific merge-function which creates a new config-object - * by merging two configuration objects together. - * - * @param {Object} config1 - * @param {Object} config2 - * @returns {Object} New object resulting from merging config2 to config1 - */ -var mergeConfig = function mergeConfig(config1, config2) { - // eslint-disable-next-line no-param-reassign - config2 = config2 || {}; - var config = {}; - - var valueFromConfig2Keys = ['url', 'method', 'data']; - var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; - var defaultToConfig2Keys = [ - 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', - 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', - 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', - 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', - 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' - ]; - var directMergeKeys = ['validateStatus']; - - function getMergedValue(target, source) { - if (utils.isPlainObject(target) && utils.isPlainObject(source)) { - return utils.merge(target, source); - } else if (utils.isPlainObject(source)) { - return utils.merge({}, source); - } else if (utils.isArray(source)) { - return source.slice(); - } - return source; - } - - function mergeDeepProperties(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(config1[prop], config2[prop]); - } else if (!utils.isUndefined(config1[prop])) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - } - - utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(undefined, config2[prop]); - } - }); - - utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); - - utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(undefined, config2[prop]); - } else if (!utils.isUndefined(config1[prop])) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - }); - - utils.forEach(directMergeKeys, function merge(prop) { - if (prop in config2) { - config[prop] = getMergedValue(config1[prop], config2[prop]); - } else if (prop in config1) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - }); - - var axiosKeys = valueFromConfig2Keys - .concat(mergeDeepPropertiesKeys) - .concat(defaultToConfig2Keys) - .concat(directMergeKeys); - - var otherKeys = Object - .keys(config1) - .concat(Object.keys(config2)) - .filter(function filterAxiosKeys(key) { - return axiosKeys.indexOf(key) === -1; - }); - - utils.forEach(otherKeys, mergeDeepProperties); - - return config; -}; - -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager_1(), - response: new InterceptorManager_1() - }; -} - -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = arguments[1] || {}; - config.url = arguments[0]; - } else { - config = config || {}; - } - - config = mergeConfig(this.defaults, config); - - // Set config.method - if (config.method) { - config.method = config.method.toLowerCase(); - } else if (this.defaults.method) { - config.method = this.defaults.method.toLowerCase(); - } else { - config.method = 'get'; - } - - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); - - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); - - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); - - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } - - return promise; -}; - -Axios.prototype.getUri = function getUri(config) { - config = mergeConfig(this.defaults, config); - return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); -}; - -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(mergeConfig(config || {}, { - method: method, - url: url, - data: (config || {}).data - })); - }; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(mergeConfig(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); - -var Axios_1 = Axios; - -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} - -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; - -Cancel.prototype.__CANCEL__ = true; - -var Cancel_1 = Cancel; - -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } - - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); - - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; - } - - token.reason = new Cancel_1(message); - resolvePromise(token.reason); - }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } -}; - -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; - -var CancelToken_1 = CancelToken; - -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -var spread = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); - }; -}; - -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios_1(defaultConfig); - var instance = bind$1(Axios_1.prototype.request, context); - - // Copy axios.prototype to instance - utils.extend(instance, Axios_1.prototype, context); - - // Copy context to instance - utils.extend(instance, context); - - return instance; -} - -// Create the default instance to be exported -var axios = createInstance(defaults_1); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios_1; - -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(mergeConfig(axios.defaults, instanceConfig)); -}; - -// Expose Cancel & CancelToken -axios.Cancel = Cancel_1; -axios.CancelToken = CancelToken_1; -axios.isCancel = isCancel; - -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = spread; - -var axios_1 = axios; - -// Allow use of default import syntax in TypeScript -var default_1 = axios; -axios_1.default = default_1; - -var axios$1 = axios_1; - -var supportedVersions = ['v2', 'v3', 'v4', 'canary']; -var name = '@tryghost/content-api'; -function GhostContentAPI(_ref) { - var url = _ref.url, - host = _ref.host, - _ref$ghostPath = _ref.ghostPath, - ghostPath = _ref$ghostPath === void 0 ? 'ghost' : _ref$ghostPath, - version = _ref.version, - key = _ref.key; - - // host parameter is deprecated - if (host) { - // eslint-disable-next-line - console.warn("".concat(name, ": The 'host' parameter is deprecated, please use 'url' instead")); - - if (!url) { - url = host; - } - } - - if (this instanceof GhostContentAPI) { - return GhostContentAPI({ - url: url, - version: version, - key: key - }); - } - - if (!version) { - throw new Error("".concat(name, " Config Missing: 'version' is required. E.g. ").concat(supportedVersions.join(','))); - } - - if (!supportedVersions.includes(version)) { - throw new Error("".concat(name, " Config Invalid: 'version' ").concat(version, " is not supported")); - } - - if (!url) { - throw new Error("".concat(name, " Config Missing: 'url' is required. E.g. 'https://site.com'")); - } - - if (!/https?:\/\//.test(url)) { - throw new Error("".concat(name, " Config Invalid: 'url' ").concat(url, " requires a protocol. E.g. 'https://site.com'")); - } - - if (url.endsWith('/')) { - throw new Error("".concat(name, " Config Invalid: 'url' ").concat(url, " must not have a trailing slash. E.g. 'https://site.com'")); - } - - if (ghostPath.endsWith('/') || ghostPath.startsWith('/')) { - throw new Error("".concat(name, " Config Invalid: 'ghostPath' ").concat(ghostPath, " must not have a leading or trailing slash. E.g. 'ghost'")); - } - - if (key && !/[0-9a-f]{26}/.test(key)) { - throw new Error("".concat(name, " Config Invalid: 'key' ").concat(key, " must have 26 hex characters")); - } - - var api = ['posts', 'authors', 'tags', 'pages', 'settings'].reduce(function (apiObject, resourceType) { - function browse() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var memberToken = arguments.length > 1 ? arguments[1] : undefined; - return makeRequest(resourceType, options, null, memberToken); - } - - function read(data) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var memberToken = arguments.length > 2 ? arguments[2] : undefined; - - if (!data || !data.id && !data.slug) { - return Promise.reject(new Error("".concat(name, " read requires an id or slug."))); - } - - var params = Object.assign({}, data, options); - return makeRequest(resourceType, params, data.id || "slug/".concat(data.slug), memberToken); - } - - return Object.assign(apiObject, _defineProperty({}, resourceType, { - read: read, - browse: browse - })); - }, {}); - delete api.settings.read; - return api; - - function makeRequest(resourceType, params, id) { - var membersToken = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; - - if (!membersToken && !key) { - return Promise.reject(new Error("".concat(name, " Config Missing: 'key' is required."))); - } - - delete params.id; - var headers = membersToken ? { - Authorization: "GhostMembers ".concat(membersToken) - } : undefined; - return axios$1.get("".concat(url, "/").concat(ghostPath, "/api/").concat(version, "/content/").concat(resourceType, "/").concat(id ? id + '/' : ''), { - params: Object.assign({ - key: key - }, params), - paramsSerializer: function paramsSerializer(parameters) { - return Object.keys(parameters).reduce(function (parts, k) { - var val = encodeURIComponent([].concat(parameters[k]).join(',')); - return parts.concat("".concat(k, "=").concat(val)); - }, []).join('&'); - }, - headers: headers - }).then(function (res) { - if (!Array.isArray(res.data[resourceType])) { - return res.data[resourceType]; - } - - if (res.data[resourceType].length === 1 && !res.data.meta) { - return res.data[resourceType][0]; - } - - return Object.assign(res.data[resourceType], { - meta: res.data.meta - }); - }).catch(function (err) { - if (err.response && err.response.data && err.response.data.errors) { - var props = err.response.data.errors[0]; - var toThrow = new Error(props.message); - var keys = Object.keys(props); - toThrow.name = props.type; - keys.forEach(function (k) { - toThrow[k] = props[k]; - }); - toThrow.response = err.response; // @TODO: remove in 2.0. We have enhanced the error handling, but we don't want to break existing implementations. - - toThrow.request = err.request; - toThrow.config = err.config; - throw toThrow; - } else { - throw err; - } - }); - } -} - -/* harmony default export */ __webpack_exports__["default"] = (GhostContentAPI); -//# sourceMappingURL=content-api.js.map - - -/***/ }), - -/***/ "./src/js/app/colorModeToggle.js": -/*!***************************************!*\ - !*** ./src/js/app/colorModeToggle.js ***! - \***************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ setColorMode; } -/* harmony export */ }); -/* - * Color mode toggle - */ -var toggleColorBtns = document.querySelectorAll('.sm-color-mode-btn'); -function setColorMode() { - if (window.CSS && CSS.supports('color', 'var(--primary)')) { - var toggleColorMode = function toggleColorMode(e) { - if (e.currentTarget.classList.contains('light')) { - document.documentElement.setAttribute('color-mode', 'light'); - localStorage.setItem('pref', 'light'); - return; - } - - document.documentElement.setAttribute('color-mode', 'dark'); - localStorage.setItem('pref', 'dark'); - }; - - toggleColorBtns.forEach(function (btn) { - btn.addEventListener('click', toggleColorMode); - }); - } else { - toggleColorBtns.forEach(function (e) { - e.style.display = 'none'; - }); - } -} - -/***/ }), - -/***/ "./src/js/app/focusTrap.js": -/*!*********************************!*\ - !*** ./src/js/app/focusTrap.js ***! - \*********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "trapFocus": function() { return /* binding */ trapFocus; }, -/* harmony export */ "tabKeyHandler": function() { return /* binding */ tabKeyHandler; }, -/* harmony export */ "releaseFocus": function() { return /* binding */ releaseFocus; } -/* harmony export */ }); -var FOCUSABLE_EL = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]'; -var currentFocus; - -var checkDisplayStatus = function checkDisplayStatus(el) { - return window.getComputedStyle(el).display !== 'none'; -}; - -var getNonHiddenLastEl = function getNonHiddenLastEl(el) { - var lastEl = el[el.length - 1]; - var penultimateEl = el[el.length - 2]; - - if (checkDisplayStatus(lastEl)) { - return lastEl; - } - - return penultimateEl; -}; - -var configureFocusableElements = function configureFocusableElements(containerEl) { - var focusableEl = containerEl.querySelectorAll(FOCUSABLE_EL); - focusableEl.forEach(function (el) { - return el.setAttribute('tabindex', '0'); - }); - var firstElToFocus = focusableEl[1]; - var firstTabStop = focusableEl[0]; - var lastTabStop = getNonHiddenLastEl(focusableEl); - return [firstTabStop, lastTabStop, firstElToFocus]; -}; - -var trapFocus = function trapFocus(sideMenuEl) { - currentFocus = document.activeElement; - var firstElToFocus = configureFocusableElements(sideMenuEl); - firstElToFocus[2].focus(); -}; -function tabKeyHandler(e) { - var tabs = configureFocusableElements(this); - var firstTabStop = tabs[0]; - var lastTabStop = tabs[1]; - - if (e.keyCode === 9) { - // SHIFT + TAB - if (e.shiftKey) { - if (document.activeElement === firstTabStop) { - e.preventDefault(); - lastTabStop.focus(); - } // TAB - - } else if (document.activeElement === lastTabStop) { - e.preventDefault(); - firstTabStop.focus(); - } - } -} -var releaseFocus = function releaseFocus(sideMenuEl) { - var focusableEl = sideMenuEl.querySelectorAll(FOCUSABLE_EL); - focusableEl.forEach(function (el) { - return el.setAttribute('tabindex', '-1'); - }); - sideMenuEl.removeEventListener('keydown', tabKeyHandler); - currentFocus.focus(); -}; - -/***/ }), - -/***/ "./src/js/app/grid.js": -/*!****************************!*\ - !*** ./src/js/app/grid.js ***! - \****************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -var gridContainers = document.querySelectorAll('.sm-grid-container'); - -function updateNumber(el, num, type) { - if (type === 'container') { - el.classList.add("sm-grid-container-".concat(num)); - return; - } - - el.classList.add("sm-card-".concat(num)); -} - -function countChildren(gridContainer) { - var children = gridContainer.children; - children.forEach(function (el, i) { - return updateNumber(el, i + 1); - }); - var numOfChildren = children.length; - updateNumber(gridContainer, numOfChildren, 'container'); - return { - children: children, - numOfChildren: numOfChildren - }; -} - -function gridInit() { - if (!gridContainers) { - return; - } - - gridContainers.forEach(function (gridContainer) { - return countChildren(gridContainer); - }); -} - -/* harmony default export */ __webpack_exports__["default"] = (gridInit); - -/***/ }), - -/***/ "./src/js/app/modal.js": -/*!*****************************!*\ - !*** ./src/js/app/modal.js ***! - \*****************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -var _require = __webpack_require__(/*! ./focusTrap */ "./src/js/app/focusTrap.js"), - trapFocus = _require.trapFocus, - releaseFocus = _require.releaseFocus, - tabKeyHandler = _require.tabKeyHandler; - -var searchBtn = document.getElementById('sm-search-btn'); -var mSearchBtn = document.getElementById('sm-m-search-btn'); -var menuBtn = document.getElementById('sm-menu-btn'); -var closeBtns = document.querySelectorAll('.sm-modal__close-btn'); - -if (typeof SEARCH_API !== 'undefined') { - searchBtn.style.display = 'flex'; - mSearchBtn.style.display = 'flex'; -} - -var btns = [searchBtn, mSearchBtn, menuBtn]; - -var modalFn = function modalFn() { - // eslint-disable-next-line no-undef - var close = function close(modal) { - document.body.classList.remove('sm-expanded-modal'); - modal.setAttribute('aria-expanded', 'false'); - var input = modal.querySelector('input'); - - if (input) { - input.value = ''; - } - - releaseFocus(modal); - }; - - var closeHandler = function closeHandler(e) { - var modal = e.currentTarget.closest('.sm-modal'); - close(modal); - }; - - var openHandler = function openHandler(e) { - // if (e.currentTarget.closest('.modal')) { - // close(e.currentTarget.closest('.modal')); - // } - var modal = document.getElementById(e.currentTarget.dataset.target); - document.body.classList.add('sm-expanded-modal'); - modal.setAttribute('aria-expanded', 'true'); - trapFocus(modal); - modal.addEventListener('keydown', tabKeyHandler); - - var nonTargetCloseHandler = function nonTargetCloseHandler(ev) { - if (ev.target.classList.contains('sm-content-wrap')) { - close(modal); - document.body.removeEventListener('click', nonTargetCloseHandler); // eslint-disable-next-line no-use-before-define - - document.body.removeEventListener('keyup', closeByEscHandler); - } - }; - - document.body.addEventListener('click', nonTargetCloseHandler); - - var closeByEscHandler = function closeByEscHandler(key) { - if (key.key === 'Escape' || key.keyCode === 27) { - close(modal); - document.body.removeEventListener('keyup', closeByEscHandler); - document.body.removeEventListener('click', nonTargetCloseHandler); - } - }; - - document.body.addEventListener('keyup', closeByEscHandler); - }; - - btns.forEach(function (btn) { - if (btn) { - btn.addEventListener('click', openHandler); - } - }); - closeBtns.forEach(function (btn) { - if (btn) { - btn.addEventListener('click', closeHandler); - } - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (modalFn); - -/***/ }), - -/***/ "./src/js/app/search.js": -/*!******************************!*\ - !*** ./src/js/app/search.js ***! - \******************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var js_search__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! js-search */ "./node_modules/js-search/dist/esm/js-search.js"); -/* harmony import */ var _tryghost_content_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tryghost/content-api */ "./node_modules/@tryghost/content-api/es/content-api.js"); - - -var searchModal = document.getElementById('sm-search-modal'); - -var htmlReplace = function htmlReplace(str) { - return str.replace(//g, '>'); -}; - -var createTimestamp = function createTimestamp() { - var minutes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 60; - var timestamp = Date.now() + minutes * 60000; - return timestamp; -}; - -var stateLoader = function stateLoader(state, status) { - if (status) { - searchModal.classList.add(state); - } else { - searchModal.classList.remove(state); - } -}; - -var search = function search() { - var freshApi = new _tryghost_content_api__WEBPACK_IMPORTED_MODULE_1__.default({ - url: "".concat(window.location.protocol, "//").concat(window.location.host), - // eslint-disable-next-line no-undef - key: SEARCH_API, - version: 'v4' - }); - var api = new Promise(function (resolve, reject) { - var timestamp = parseInt(localStorage.getItem('timestamp'), 10); - var now = Date.now(); - - if (!timestamp || now > timestamp) { - freshApi.posts.browse({ - include: 'tags', - formats: 'plaintext', - limit: 'all' - }).then(function (data) { - localStorage.setItem('posts', JSON.stringify(data)); - localStorage.setItem('timestamp', createTimestamp()); - resolve(data); - }); - } else { - var posts = JSON.parse(localStorage.getItem('posts')); - resolve(posts); - reject(new Error("Couldn't fetch posts")); - } - }).catch(function (err) { - // eslint-disable-next-line no-alert - alert("Something went wrong. Please try again.\nError Details: ".concat(err)); - }); // Page Elements - - var searchInput = document.getElementById('sm-search-input'); - var runSearchBtn = document.getElementById('sm-run-search-btn'); - var searchResultHeader = document.querySelector('.sm-search-results__header'); - var searchResult = document.querySelector('.sm-search-results__container'); - - var dateFormatter = function dateFormatter(isoDate) { - var options = { - year: 'numeric', - month: 'short', - day: '2-digit' - }; - var date = new Date(isoDate); - return date.toLocaleDateString(undefined, options); - }; - - var searchPosts = function searchPosts(term) { - stateLoader('loading', true); - searchResult.innerHTML = ''; - api.then(function (posts) { - var newSearch = new js_search__WEBPACK_IMPORTED_MODULE_0__.Search('id'); - newSearch.addIndex('title'); - newSearch.addIndex('plaintext'); - newSearch.addDocuments(posts); - var result = newSearch.search(term); - - if (result.length > 1) { - searchResultHeader.textContent = "".concat(result.length, " Results for \u201C").concat(term, "\u201D"); - } else if (result.length !== 0) { - searchResultHeader.textContent = "".concat(result.length, " Result for \u201C").concat(term, "\u201D"); - } else { - searchResultHeader.textContent = "No results for \u201C".concat(term, "\u201D"); - } - - result.forEach(function (post) { - searchResult.innerHTML += "
\n \n

").concat(dateFormatter(post.published_at), "

\n

").concat(post.title, "

\n

\n ").concat(htmlReplace(post.excerpt), "

\n
\n
"); - }); - stateLoader('loading', false); - }); - }; - - var enterSearchTermCheck = function enterSearchTermCheck() { - if (!searchResult.innerHTML) { - searchResultHeader.textContent = 'Enter a search term'; - } - }; - - runSearchBtn.addEventListener('click', function () { - if (searchInput.value === '') { - enterSearchTermCheck(); - } else { - searchPosts(searchInput.value); - } - }); - searchInput.addEventListener('keyup', function (e) { - if (searchInput.value === '') { - enterSearchTermCheck(); - } else if (e.key === 'Enter') { - searchPosts(searchInput.value); - } - }); - searchInput.addEventListener('focus', function (e) { - stateLoader('loading', false); - e.target.value = ''; - }); - searchInput.addEventListener('input', function () { - stateLoader('loading', false); - }); -}; - -/* harmony default export */ __webpack_exports__["default"] = (search); - -/***/ }), - -/***/ "./src/js/app/setTabIndex.js": -/*!***********************************!*\ - !*** ./src/js/app/setTabIndex.js ***! - \***********************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ removeNavLinks; } -/* harmony export */ }); -function removeNavLinks() { - var menuNavLinks = document.querySelectorAll('#sm-menu a'); - menuNavLinks.forEach(function (el) { - return el.setAttribute('tabindex', '-1'); - }); -} - -/***/ }), - -/***/ "./node_modules/js-search/dist/esm/js-search.js": -/*!******************************************************!*\ - !*** ./node_modules/js-search/dist/esm/js-search.js ***! - \******************************************************/ -/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AllSubstringsIndexStrategy": function() { return /* binding */ AllSubstringsIndexStrategy; }, -/* harmony export */ "CaseSensitiveSanitizer": function() { return /* binding */ CaseSensitiveSanitizer; }, -/* harmony export */ "ExactWordIndexStrategy": function() { return /* binding */ ExactWordIndexStrategy; }, -/* harmony export */ "LowerCaseSanitizer": function() { return /* binding */ LowerCaseSanitizer; }, -/* harmony export */ "PrefixIndexStrategy": function() { return /* binding */ PrefixIndexStrategy; }, -/* harmony export */ "Search": function() { return /* binding */ Search; }, -/* harmony export */ "SimpleTokenizer": function() { return /* binding */ SimpleTokenizer; }, -/* harmony export */ "StemmingTokenizer": function() { return /* binding */ StemmingTokenizer; }, -/* harmony export */ "StopWordsMap": function() { return /* binding */ StopWordsMap; }, -/* harmony export */ "StopWordsTokenizer": function() { return /* binding */ StopWordsTokenizer; }, -/* harmony export */ "TfIdfSearchIndex": function() { return /* binding */ TfIdfSearchIndex; }, -/* harmony export */ "TokenHighlighter": function() { return /* binding */ TokenHighlighter; }, -/* harmony export */ "UnorderedSearchIndex": function() { return /* binding */ UnorderedSearchIndex; } -/* harmony export */ }); -/** - * Indexes for all substring searches (e.g. the term "cat" is indexed as "c", "ca", "cat", "a", "at", and "t"). - */ -var AllSubstringsIndexStrategy = /*#__PURE__*/function () { - function AllSubstringsIndexStrategy() {} - - var _proto = AllSubstringsIndexStrategy.prototype; - - /** - * @inheritDocs - */ - _proto.expandToken = function expandToken(token) { - var expandedTokens = []; - var string; - - for (var i = 0, length = token.length; i < length; ++i) { - string = ''; - - for (var j = i; j < length; ++j) { - string += token.charAt(j); - expandedTokens.push(string); - } - } - - return expandedTokens; - }; - - return AllSubstringsIndexStrategy; -}(); - -/** - * Indexes for exact word matches. - */ -var ExactWordIndexStrategy = /*#__PURE__*/function () { - function ExactWordIndexStrategy() {} - - var _proto = ExactWordIndexStrategy.prototype; - - /** - * @inheritDocs - */ - _proto.expandToken = function expandToken(token) { - return token ? [token] : []; - }; - - return ExactWordIndexStrategy; -}(); - -/** - * Indexes for prefix searches (e.g. the term "cat" is indexed as "c", "ca", and "cat" allowing prefix search lookups). - */ -var PrefixIndexStrategy = /*#__PURE__*/function () { - function PrefixIndexStrategy() {} - - var _proto = PrefixIndexStrategy.prototype; - - /** - * @inheritDocs - */ - _proto.expandToken = function expandToken(token) { - var expandedTokens = []; - var string = ''; - - for (var i = 0, length = token.length; i < length; ++i) { - string += token.charAt(i); - expandedTokens.push(string); - } - - return expandedTokens; - }; - - return PrefixIndexStrategy; -}(); - -/** - * Enforces case-sensitive text matches. - */ -var CaseSensitiveSanitizer = /*#__PURE__*/function () { - function CaseSensitiveSanitizer() {} - - var _proto = CaseSensitiveSanitizer.prototype; - - /** - * @inheritDocs - */ - _proto.sanitize = function sanitize(text) { - return text ? text.trim() : ''; - }; - - return CaseSensitiveSanitizer; -}(); - -/** - * Sanitizes text by converting to a locale-friendly lower-case version and triming leading and trailing whitespace. - */ -var LowerCaseSanitizer = /*#__PURE__*/function () { - function LowerCaseSanitizer() {} - - var _proto = LowerCaseSanitizer.prototype; - - /** - * @inheritDocs - */ - _proto.sanitize = function sanitize(text) { - return text ? text.toLocaleLowerCase().trim() : ''; - }; - - return LowerCaseSanitizer; -}(); - -/** - * Find and return a nested object value. - * - * @param object to crawl - * @param path Property path - * @returns {any} - */ -function getNestedFieldValue(object, path) { - path = path || []; - object = object || {}; - var value = object; // walk down the property path - - for (var i = 0; i < path.length; i++) { - value = value[path[i]]; - - if (value == null) { - return null; - } - } - - return value; -} - -/** - * Search index capable of returning results matching a set of tokens and ranked according to TF-IDF. - */ -var TfIdfSearchIndex = /*#__PURE__*/function () { - function TfIdfSearchIndex(uidFieldName) { - this._uidFieldName = uidFieldName; - this._tokenToIdfCache = {}; - this._tokenMap = {}; - } - /** - * @inheritDocs - */ - - - var _proto = TfIdfSearchIndex.prototype; - - _proto.indexDocument = function indexDocument(token, uid, doc) { - this._tokenToIdfCache = {}; // New index invalidates previous IDF caches - - var tokenMap = this._tokenMap; - var tokenDatum; - - if (typeof tokenMap[token] !== 'object') { - tokenMap[token] = tokenDatum = { - $numDocumentOccurrences: 0, - $totalNumOccurrences: 1, - $uidMap: {} - }; - } else { - tokenDatum = tokenMap[token]; - tokenDatum.$totalNumOccurrences++; - } - - var uidMap = tokenDatum.$uidMap; - - if (typeof uidMap[uid] !== 'object') { - tokenDatum.$numDocumentOccurrences++; - uidMap[uid] = { - $document: doc, - $numTokenOccurrences: 1 - }; - } else { - uidMap[uid].$numTokenOccurrences++; - } - } - /** - * @inheritDocs - */ - ; - - _proto.search = function search(tokens, corpus) { - var uidToDocumentMap = {}; - - for (var i = 0, numTokens = tokens.length; i < numTokens; i++) { - var token = tokens[i]; - var tokenMetadata = this._tokenMap[token]; // Short circuit if no matches were found for any given token. - - if (!tokenMetadata) { - return []; - } - - if (i === 0) { - var keys = Object.keys(tokenMetadata.$uidMap); - - for (var j = 0, numKeys = keys.length; j < numKeys; j++) { - var uid = keys[j]; - uidToDocumentMap[uid] = tokenMetadata.$uidMap[uid].$document; - } - } else { - var keys = Object.keys(uidToDocumentMap); - - for (var j = 0, numKeys = keys.length; j < numKeys; j++) { - var uid = keys[j]; - - if (typeof tokenMetadata.$uidMap[uid] !== 'object') { - delete uidToDocumentMap[uid]; - } - } - } - } - - var documents = []; - - for (var uid in uidToDocumentMap) { - documents.push(uidToDocumentMap[uid]); - } - - var calculateTfIdf = this._createCalculateTfIdf(); // Return documents sorted by TF-IDF - - - return documents.sort(function (documentA, documentB) { - return calculateTfIdf(tokens, documentB, corpus) - calculateTfIdf(tokens, documentA, corpus); - }); - }; - - _proto._createCalculateIdf = function _createCalculateIdf() { - var tokenMap = this._tokenMap; - var tokenToIdfCache = this._tokenToIdfCache; - return function calculateIdf(token, documents) { - if (!tokenToIdfCache[token]) { - var numDocumentsWithToken = typeof tokenMap[token] !== 'undefined' ? tokenMap[token].$numDocumentOccurrences : 0; - tokenToIdfCache[token] = 1 + Math.log(documents.length / (1 + numDocumentsWithToken)); - } - - return tokenToIdfCache[token]; - }; - }; - - _proto._createCalculateTfIdf = function _createCalculateTfIdf() { - var tokenMap = this._tokenMap; - var uidFieldName = this._uidFieldName; - - var calculateIdf = this._createCalculateIdf(); - - return function calculateTfIdf(tokens, document, documents) { - var score = 0; - - for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) { - var token = tokens[i]; - var inverseDocumentFrequency = calculateIdf(token, documents); - - if (inverseDocumentFrequency === Infinity) { - inverseDocumentFrequency = 0; - } - - var uid; - - if (uidFieldName instanceof Array) { - uid = document && getNestedFieldValue(document, uidFieldName); - } else { - uid = document && document[uidFieldName]; - } - - var termFrequency = typeof tokenMap[token] !== 'undefined' && typeof tokenMap[token].$uidMap[uid] !== 'undefined' ? tokenMap[token].$uidMap[uid].$numTokenOccurrences : 0; - score += termFrequency * inverseDocumentFrequency; - } - - return score; - }; - }; - - return TfIdfSearchIndex; -}(); - -/** - * Search index capable of returning results matching a set of tokens but without any meaningful rank or order. - */ -var UnorderedSearchIndex = /*#__PURE__*/function () { - function UnorderedSearchIndex() { - this._tokenToUidToDocumentMap = {}; - } - /** - * @inheritDocs - */ - - - var _proto = UnorderedSearchIndex.prototype; - - _proto.indexDocument = function indexDocument(token, uid, doc) { - if (typeof this._tokenToUidToDocumentMap[token] !== 'object') { - this._tokenToUidToDocumentMap[token] = {}; - } - - this._tokenToUidToDocumentMap[token][uid] = doc; - } - /** - * @inheritDocs - */ - ; - - _proto.search = function search(tokens, corpus) { - var intersectingDocumentMap = {}; - var tokenToUidToDocumentMap = this._tokenToUidToDocumentMap; - - for (var i = 0, numTokens = tokens.length; i < numTokens; i++) { - var token = tokens[i]; - var documentMap = tokenToUidToDocumentMap[token]; // Short circuit if no matches were found for any given token. - - if (!documentMap) { - return []; - } - - if (i === 0) { - var keys = Object.keys(documentMap); - - for (var j = 0, numKeys = keys.length; j < numKeys; j++) { - var uid = keys[j]; - intersectingDocumentMap[uid] = documentMap[uid]; - } - } else { - var keys = Object.keys(intersectingDocumentMap); - - for (var j = 0, numKeys = keys.length; j < numKeys; j++) { - var uid = keys[j]; - - if (typeof documentMap[uid] !== 'object') { - delete intersectingDocumentMap[uid]; - } - } - } - } - - var keys = Object.keys(intersectingDocumentMap); - var documents = []; - - for (var i = 0, numKeys = keys.length; i < numKeys; i++) { - var uid = keys[i]; - documents.push(intersectingDocumentMap[uid]); - } - - return documents; - }; - - return UnorderedSearchIndex; -}(); - -var REGEX = /[^a-zа-яё0-9\-']+/i; -/** - * Simple tokenizer that splits strings on whitespace characters and returns an array of all non-empty substrings. - */ - -var SimpleTokenizer = /*#__PURE__*/function () { - function SimpleTokenizer() {} - - var _proto = SimpleTokenizer.prototype; - - /** - * @inheritDocs - */ - _proto.tokenize = function tokenize(text) { - return text.split(REGEX).filter(function (text) { - return text; - } // Filter empty tokens - ); - }; - - return SimpleTokenizer; -}(); - -/** - * Stemming is the process of reducing search tokens to their root (or stem) so that searches for different forms of a - * word will match. For example "search", "searching" and "searched" are all reduced to the stem "search". - * - *

This stemming tokenizer converts tokens (words) to their stem forms before returning them. It requires an - * external stemming function to be provided; for this purpose I recommend the NPM 'porter-stemmer' library. - * - *

For more information see http : //tartarus.org/~martin/PorterStemmer/ - */ -var StemmingTokenizer = /*#__PURE__*/function () { - /** - * Constructor. - * - * @param stemmingFunction Function capable of accepting a word and returning its stem. - * @param decoratedIndexStrategy Index strategy to be run after all stop words have been removed. - */ - function StemmingTokenizer(stemmingFunction, decoratedTokenizer) { - this._stemmingFunction = stemmingFunction; - this._tokenizer = decoratedTokenizer; - } - /** - * @inheritDocs - */ - - - var _proto = StemmingTokenizer.prototype; - - _proto.tokenize = function tokenize(text) { - return this._tokenizer.tokenize(text).map(this._stemmingFunction); - }; - - return StemmingTokenizer; -}(); - -/** - * Stop words list copied from Lunr JS. - */ -var StopWordsMap = { - a: true, - able: true, - about: true, - across: true, - after: true, - all: true, - almost: true, - also: true, - am: true, - among: true, - an: true, - and: true, - any: true, - are: true, - as: true, - at: true, - be: true, - because: true, - been: true, - but: true, - by: true, - can: true, - cannot: true, - could: true, - dear: true, - did: true, - 'do': true, - does: true, - either: true, - 'else': true, - ever: true, - every: true, - 'for': true, - from: true, - 'get': true, - got: true, - had: true, - has: true, - have: true, - he: true, - her: true, - hers: true, - him: true, - his: true, - how: true, - however: true, - i: true, - 'if': true, - 'in': true, - into: true, - is: true, - it: true, - its: true, - just: true, - least: true, - "let": true, - like: true, - likely: true, - may: true, - me: true, - might: true, - most: true, - must: true, - my: true, - neither: true, - no: true, - nor: true, - not: true, - of: true, - off: true, - often: true, - on: true, - only: true, - or: true, - other: true, - our: true, - own: true, - rather: true, - said: true, - say: true, - says: true, - she: true, - should: true, - since: true, - so: true, - some: true, - than: true, - that: true, - the: true, - their: true, - them: true, - then: true, - there: true, - these: true, - they: true, - 'this': true, - tis: true, - to: true, - too: true, - twas: true, - us: true, - wants: true, - was: true, - we: true, - were: true, - what: true, - when: true, - where: true, - which: true, - 'while': true, - who: true, - whom: true, - why: true, - will: true, - 'with': true, - would: true, - yet: true, - you: true, - your: true -}; // Prevent false positives for inherited properties - -StopWordsMap.constructor = false; -StopWordsMap.hasOwnProperty = false; -StopWordsMap.isPrototypeOf = false; -StopWordsMap.propertyIsEnumerable = false; -StopWordsMap.toLocaleString = false; -StopWordsMap.toString = false; -StopWordsMap.valueOf = false; - -/** - * Stop words are very common (e.g. "a", "and", "the") and are often not semantically meaningful in the context of a - * search. This tokenizer removes stop words from a set of tokens before passing the remaining tokens along for - * indexing or searching purposes. - */ - -var StopWordsTokenizer = /*#__PURE__*/function () { - /** - * Constructor. - * - * @param decoratedIndexStrategy Index strategy to be run after all stop words have been removed. - */ - function StopWordsTokenizer(decoratedTokenizer) { - this._tokenizer = decoratedTokenizer; - } - /** - * @inheritDocs - */ - - - var _proto = StopWordsTokenizer.prototype; - - _proto.tokenize = function tokenize(text) { - return this._tokenizer.tokenize(text).filter(function (token) { - return !StopWordsMap[token]; - }); - }; - - return StopWordsTokenizer; -}(); - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -/** - * Simple client-side searching within a set of documents. - * - *

Documents can be searched by any number of fields. Indexing and search strategies are highly customizable. - */ -var Search = /*#__PURE__*/function () { - /** - * Array containing either a property name or a path (list of property names) to a nested value - */ - - /** - * Constructor. - * @param uidFieldName Field containing values that uniquely identify search documents; this field's values are used - * to ensure that a search result set does not contain duplicate objects. - */ - function Search(uidFieldName) { - if (!uidFieldName) { - throw Error('js-search requires a uid field name constructor parameter'); - } - - this._uidFieldName = uidFieldName; // Set default/recommended strategies - - this._indexStrategy = new PrefixIndexStrategy(); - this._searchIndex = new TfIdfSearchIndex(uidFieldName); - this._sanitizer = new LowerCaseSanitizer(); - this._tokenizer = new SimpleTokenizer(); - this._documents = []; - this._searchableFields = []; - } - /** - * Override the default index strategy. - * @param value Custom index strategy - * @throws Error if documents have already been indexed by this search instance - */ - - - var _proto = Search.prototype; - - /** - * Add a searchable document to the index. Document will automatically be indexed for search. - * @param document - */ - _proto.addDocument = function addDocument(document) { - this.addDocuments([document]); - } - /** - * Adds searchable documents to the index. Documents will automatically be indexed for search. - * @param document - */ - ; - - _proto.addDocuments = function addDocuments(documents) { - this._documents = this._documents.concat(documents); - this.indexDocuments_(documents, this._searchableFields); - } - /** - * Add a new searchable field to the index. Existing documents will automatically be indexed using this new field. - * - * @param field Searchable field or field path. Pass a string to index a top-level field and an array of strings for nested fields. - */ - ; - - _proto.addIndex = function addIndex(field) { - this._searchableFields.push(field); - - this.indexDocuments_(this._documents, [field]); - } - /** - * Search all documents for ones matching the specified query text. - * @param query - * @returns {Array} - */ - ; - - _proto.search = function search(query) { - var tokens = this._tokenizer.tokenize(this._sanitizer.sanitize(query)); - - return this._searchIndex.search(tokens, this._documents); - } - /** - * @param documents - * @param _searchableFields Array containing property names and paths (lists of property names) to nested values - * @private - */ - ; - - _proto.indexDocuments_ = function indexDocuments_(documents, _searchableFields) { - this._initialized = true; - var indexStrategy = this._indexStrategy; - var sanitizer = this._sanitizer; - var searchIndex = this._searchIndex; - var tokenizer = this._tokenizer; - var uidFieldName = this._uidFieldName; - - for (var di = 0, numDocuments = documents.length; di < numDocuments; di++) { - var doc = documents[di]; - var uid; - - if (uidFieldName instanceof Array) { - uid = getNestedFieldValue(doc, uidFieldName); - } else { - uid = doc[uidFieldName]; - } - - for (var sfi = 0, numSearchableFields = _searchableFields.length; sfi < numSearchableFields; sfi++) { - var fieldValue; - var searchableField = _searchableFields[sfi]; - - if (searchableField instanceof Array) { - fieldValue = getNestedFieldValue(doc, searchableField); - } else { - fieldValue = doc[searchableField]; - } - - if (fieldValue != null && typeof fieldValue !== 'string' && fieldValue.toString) { - fieldValue = fieldValue.toString(); - } - - if (typeof fieldValue === 'string') { - var fieldTokens = tokenizer.tokenize(sanitizer.sanitize(fieldValue)); - - for (var fti = 0, numFieldValues = fieldTokens.length; fti < numFieldValues; fti++) { - var fieldToken = fieldTokens[fti]; - var expandedTokens = indexStrategy.expandToken(fieldToken); - - for (var eti = 0, nummExpandedTokens = expandedTokens.length; eti < nummExpandedTokens; eti++) { - var expandedToken = expandedTokens[eti]; - searchIndex.indexDocument(expandedToken, uid, doc); - } - } - } - } - } - }; - - _createClass(Search, [{ - key: "indexStrategy", - set: function set(value) { - if (this._initialized) { - throw Error('IIndexStrategy cannot be set after initialization'); - } - - this._indexStrategy = value; - }, - get: function get() { - return this._indexStrategy; - } - /** - * Override the default text sanitizing strategy. - * @param value Custom text sanitizing strategy - * @throws Error if documents have already been indexed by this search instance - */ - - }, { - key: "sanitizer", - set: function set(value) { - if (this._initialized) { - throw Error('ISanitizer cannot be set after initialization'); - } - - this._sanitizer = value; - }, - get: function get() { - return this._sanitizer; - } - /** - * Override the default search index strategy. - * @param value Custom search index strategy - * @throws Error if documents have already been indexed - */ - - }, { - key: "searchIndex", - set: function set(value) { - if (this._initialized) { - throw Error('ISearchIndex cannot be set after initialization'); - } - - this._searchIndex = value; - }, - get: function get() { - return this._searchIndex; - } - /** - * Override the default text tokenizing strategy. - * @param value Custom text tokenizing strategy - * @throws Error if documents have already been indexed by this search instance - */ - - }, { - key: "tokenizer", - set: function set(value) { - if (this._initialized) { - throw Error('ITokenizer cannot be set after initialization'); - } - - this._tokenizer = value; - }, - get: function get() { - return this._tokenizer; - } - }]); - - return Search; -}(); - -/** - * This utility highlights the occurrences of tokens within a string of text. It can be used to give visual indicators - * of match criteria within searchable fields. - * - *

For performance purposes this highlighter only works with full-word or prefix token indexes. - */ -var TokenHighlighter = /*#__PURE__*/function () { - /** - * Constructor. - * - * @param opt_indexStrategy Index strategy used by Search - * @param opt_sanitizer Sanitizer used by Search - * @param opt_wrapperTagName Optional wrapper tag name; defaults to 'mark' (e.g. ) - */ - function TokenHighlighter(opt_indexStrategy, opt_sanitizer, opt_wrapperTagName) { - this._indexStrategy = opt_indexStrategy || new PrefixIndexStrategy(); - this._sanitizer = opt_sanitizer || new LowerCaseSanitizer(); - this._wrapperTagName = opt_wrapperTagName || 'mark'; - } - /** - * Highlights token occurrences within a string by wrapping them with a DOM element. - * - * @param text e.g. "john wayne" - * @param tokens e.g. ["wa"] - * @returns {string} e.g. "john wayne" - */ - - - var _proto = TokenHighlighter.prototype; - - _proto.highlight = function highlight(text, tokens) { - var tagsLength = this._wrapText('').length; - - var tokenDictionary = Object.create(null); // Create a token map for easier lookup below. - - for (var i = 0, numTokens = tokens.length; i < numTokens; i++) { - var token = this._sanitizer.sanitize(tokens[i]); - - var expandedTokens = this._indexStrategy.expandToken(token); - - for (var j = 0, numExpandedTokens = expandedTokens.length; j < numExpandedTokens; j++) { - var expandedToken = expandedTokens[j]; - - if (!tokenDictionary[expandedToken]) { - tokenDictionary[expandedToken] = [token]; - } else { - tokenDictionary[expandedToken].push(token); - } - } - } // Track actualCurrentWord and sanitizedCurrentWord separately in case we encounter nested tags. - - - var actualCurrentWord = ''; - var sanitizedCurrentWord = ''; - var currentWordStartIndex = 0; // Note this assumes either prefix or full word matching. - - for (var i = 0, textLength = text.length; i < textLength; i++) { - var character = text.charAt(i); - - if (character === ' ') { - actualCurrentWord = ''; - sanitizedCurrentWord = ''; - currentWordStartIndex = i + 1; - } else { - actualCurrentWord += character; - sanitizedCurrentWord += this._sanitizer.sanitize(character); - } - - if (tokenDictionary[sanitizedCurrentWord] && tokenDictionary[sanitizedCurrentWord].indexOf(sanitizedCurrentWord) >= 0) { - actualCurrentWord = this._wrapText(actualCurrentWord); - text = text.substring(0, currentWordStartIndex) + actualCurrentWord + text.substring(i + 1); - i += tagsLength; - textLength += tagsLength; - } - } - - return text; - } - /** - * @param text to wrap - * @returns Text wrapped by wrapper tag (e.g. "foo" becomes "foo") - * @private - */ - ; - - _proto._wrapText = function _wrapText(text) { - var tagName = this._wrapperTagName; - return "<" + tagName + ">" + text + ""; - }; - - return TokenHighlighter; -}(); - - - - -/***/ }), - -/***/ "./node_modules/lazysizes/lazysizes.js": -/*!*********************************************!*\ - !*** ./node_modules/lazysizes/lazysizes.js ***! - \*********************************************/ -/***/ (function(module) { - -(function(window, factory) { - var lazySizes = factory(window, window.document, Date); - window.lazySizes = lazySizes; - if( true && module.exports){ - module.exports = lazySizes; - } -}(typeof window != 'undefined' ? - window : {}, -/** - * import("./types/global") - * @typedef { import("./types/lazysizes-config").LazySizesConfigPartial } LazySizesConfigPartial - */ -function l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost - 'use strict'; - /*jshint eqnull:true */ - - var lazysizes, - /** - * @type { LazySizesConfigPartial } - */ - lazySizesCfg; - - (function(){ - var prop; - - var lazySizesDefaults = { - lazyClass: 'lazyload', - loadedClass: 'lazyloaded', - loadingClass: 'lazyloading', - preloadClass: 'lazypreload', - errorClass: 'lazyerror', - //strictClass: 'lazystrict', - autosizesClass: 'lazyautosizes', - fastLoadedClass: 'ls-is-cached', - iframeLoadMode: 0, - srcAttr: 'data-src', - srcsetAttr: 'data-srcset', - sizesAttr: 'data-sizes', - //preloadAfterLoad: false, - minSize: 40, - customMedia: {}, - init: true, - expFactor: 1.5, - hFac: 0.8, - loadMode: 2, - loadHidden: true, - ricTimeout: 0, - throttleDelay: 125, - }; - - lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {}; - - for(prop in lazySizesDefaults){ - if(!(prop in lazySizesCfg)){ - lazySizesCfg[prop] = lazySizesDefaults[prop]; - } - } - })(); - - if (!document || !document.getElementsByClassName) { - return { - init: function () {}, - /** - * @type { LazySizesConfigPartial } - */ - cfg: lazySizesCfg, - /** - * @type { true } - */ - noSupport: true, - }; - } - - var docElem = document.documentElement; - - var supportPicture = window.HTMLPictureElement; - - var _addEventListener = 'addEventListener'; - - var _getAttribute = 'getAttribute'; - - /** - * Update to bind to window because 'this' becomes null during SSR - * builds. - */ - var addEventListener = window[_addEventListener].bind(window); - - var setTimeout = window.setTimeout; - - var requestAnimationFrame = window.requestAnimationFrame || setTimeout; - - var requestIdleCallback = window.requestIdleCallback; - - var regPicture = /^picture$/i; - - var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded']; - - var regClassCache = {}; - - var forEach = Array.prototype.forEach; - - /** - * @param ele {Element} - * @param cls {string} - */ - var hasClass = function(ele, cls) { - if(!regClassCache[cls]){ - regClassCache[cls] = new RegExp('(\\s|^)'+cls+'(\\s|$)'); - } - return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls]; - }; - - /** - * @param ele {Element} - * @param cls {string} - */ - var addClass = function(ele, cls) { - if (!hasClass(ele, cls)){ - ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls); - } - }; - - /** - * @param ele {Element} - * @param cls {string} - */ - var removeClass = function(ele, cls) { - var reg; - if ((reg = hasClass(ele,cls))) { - ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' ')); - } - }; - - var addRemoveLoadEvents = function(dom, fn, add){ - var action = add ? _addEventListener : 'removeEventListener'; - if(add){ - addRemoveLoadEvents(dom, fn); - } - loadEvents.forEach(function(evt){ - dom[action](evt, fn); - }); - }; - - /** - * @param elem { Element } - * @param name { string } - * @param detail { any } - * @param noBubbles { boolean } - * @param noCancelable { boolean } - * @returns { CustomEvent } - */ - var triggerEvent = function(elem, name, detail, noBubbles, noCancelable){ - var event = document.createEvent('Event'); - - if(!detail){ - detail = {}; - } - - detail.instance = lazysizes; - - event.initEvent(name, !noBubbles, !noCancelable); - - event.detail = detail; - - elem.dispatchEvent(event); - return event; - }; - - var updatePolyfill = function (el, full){ - var polyfill; - if( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){ - if(full && full.src && !el[_getAttribute]('srcset')){ - el.setAttribute('srcset', full.src); - } - polyfill({reevaluate: true, elements: [el]}); - } else if(full && full.src){ - el.src = full.src; - } - }; - - var getCSS = function (elem, style){ - return (getComputedStyle(elem, null) || {})[style]; - }; - - /** - * - * @param elem { Element } - * @param parent { Element } - * @param [width] {number} - * @returns {number} - */ - var getWidth = function(elem, parent, width){ - width = width || elem.offsetWidth; - - while(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){ - width = parent.offsetWidth; - parent = parent.parentNode; - } - - return width; - }; - - var rAF = (function(){ - var running, waiting; - var firstFns = []; - var secondFns = []; - var fns = firstFns; - - var run = function(){ - var runFns = fns; - - fns = firstFns.length ? secondFns : firstFns; - - running = true; - waiting = false; - - while(runFns.length){ - runFns.shift()(); - } - - running = false; - }; - - var rafBatch = function(fn, queue){ - if(running && !queue){ - fn.apply(this, arguments); - } else { - fns.push(fn); - - if(!waiting){ - waiting = true; - (document.hidden ? setTimeout : requestAnimationFrame)(run); - } - } - }; - - rafBatch._lsFlush = run; - - return rafBatch; - })(); - - var rAFIt = function(fn, simple){ - return simple ? - function() { - rAF(fn); - } : - function(){ - var that = this; - var args = arguments; - rAF(function(){ - fn.apply(that, args); - }); - } - ; - }; - - var throttle = function(fn){ - var running; - var lastTime = 0; - var gDelay = lazySizesCfg.throttleDelay; - var rICTimeout = lazySizesCfg.ricTimeout; - var run = function(){ - running = false; - lastTime = Date.now(); - fn(); - }; - var idleCallback = requestIdleCallback && rICTimeout > 49 ? - function(){ - requestIdleCallback(run, {timeout: rICTimeout}); - - if(rICTimeout !== lazySizesCfg.ricTimeout){ - rICTimeout = lazySizesCfg.ricTimeout; - } - } : - rAFIt(function(){ - setTimeout(run); - }, true) - ; - - return function(isPriority){ - var delay; - - if((isPriority = isPriority === true)){ - rICTimeout = 33; - } - - if(running){ - return; - } - - running = true; - - delay = gDelay - (Date.now() - lastTime); - - if(delay < 0){ - delay = 0; - } - - if(isPriority || delay < 9){ - idleCallback(); - } else { - setTimeout(idleCallback, delay); - } - }; - }; - - //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html - var debounce = function(func) { - var timeout, timestamp; - var wait = 99; - var run = function(){ - timeout = null; - func(); - }; - var later = function() { - var last = Date.now() - timestamp; - - if (last < wait) { - setTimeout(later, wait - last); - } else { - (requestIdleCallback || run)(run); - } - }; - - return function() { - timestamp = Date.now(); - - if (!timeout) { - timeout = setTimeout(later, wait); - } - }; - }; - - var loader = (function(){ - var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started; - - var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden; - - var regImg = /^img$/i; - var regIframe = /^iframe$/i; - - var supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent)); - - var shrinkExpand = 0; - var currentExpand = 0; - - var isLoading = 0; - var lowRuns = -1; - - var resetPreloading = function(e){ - isLoading--; - if(!e || isLoading < 0 || !e.target){ - isLoading = 0; - } - }; - - var isVisible = function (elem) { - if (isBodyHidden == null) { - isBodyHidden = getCSS(document.body, 'visibility') == 'hidden'; - } - - return isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden'); - }; - - var isNestedVisible = function(elem, elemExpand){ - var outerRect; - var parent = elem; - var visible = isVisible(elem); - - eLtop -= elemExpand; - eLbottom += elemExpand; - eLleft -= elemExpand; - eLright += elemExpand; - - while(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){ - visible = ((getCSS(parent, 'opacity') || 1) > 0); - - if(visible && getCSS(parent, 'overflow') != 'visible'){ - outerRect = parent.getBoundingClientRect(); - visible = eLright > outerRect.left && - eLleft < outerRect.right && - eLbottom > outerRect.top - 1 && - eLtop < outerRect.bottom + 1 - ; - } - } - - return visible; - }; - - var checkElements = function() { - var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, - beforeExpandVal, defaultExpand, preloadExpand, hFac; - var lazyloadElems = lazysizes.elements; - - if((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){ - - i = 0; - - lowRuns++; - - for(; i < eLlen; i++){ - - if(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;} - - if(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;} - - if(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){ - elemExpand = currentExpand; - } - - if (!defaultExpand) { - defaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ? - docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 : - lazySizesCfg.expand; - - lazysizes._defEx = defaultExpand; - - preloadExpand = defaultExpand * lazySizesCfg.expFactor; - hFac = lazySizesCfg.hFac; - isBodyHidden = null; - - if(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){ - currentExpand = preloadExpand; - lowRuns = 0; - } else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){ - currentExpand = defaultExpand; - } else { - currentExpand = shrinkExpand; - } - } - - if(beforeExpandVal !== elemExpand){ - eLvW = innerWidth + (elemExpand * hFac); - elvH = innerHeight + elemExpand; - elemNegativeExpand = elemExpand * -1; - beforeExpandVal = elemExpand; - } - - rect = lazyloadElems[i].getBoundingClientRect(); - - if ((eLbottom = rect.bottom) >= elemNegativeExpand && - (eLtop = rect.top) <= elvH && - (eLright = rect.right) >= elemNegativeExpand * hFac && - (eLleft = rect.left) <= eLvW && - (eLbottom || eLright || eLleft || eLtop) && - (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) && - ((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){ - unveilElement(lazyloadElems[i]); - loadedSomething = true; - if(isLoading > 9){break;} - } else if(!loadedSomething && isCompleted && !autoLoadElem && - isLoading < 4 && lowRuns < 4 && loadMode > 2 && - (preloadElems[0] || lazySizesCfg.preloadAfterLoad) && - (preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){ - autoLoadElem = preloadElems[0] || lazyloadElems[i]; - } - } - - if(autoLoadElem && !loadedSomething){ - unveilElement(autoLoadElem); - } - } - }; - - var throttledCheckElements = throttle(checkElements); - - var switchLoadingClass = function(e){ - var elem = e.target; - - if (elem._lazyCache) { - delete elem._lazyCache; - return; - } - - resetPreloading(e); - addClass(elem, lazySizesCfg.loadedClass); - removeClass(elem, lazySizesCfg.loadingClass); - addRemoveLoadEvents(elem, rafSwitchLoadingClass); - triggerEvent(elem, 'lazyloaded'); - }; - var rafedSwitchLoadingClass = rAFIt(switchLoadingClass); - var rafSwitchLoadingClass = function(e){ - rafedSwitchLoadingClass({target: e.target}); - }; - - var changeIframeSrc = function(elem, src){ - var loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode; - - // loadMode can be also a string! - if (loadMode == 0) { - elem.contentWindow.location.replace(src); - } else if (loadMode == 1) { - elem.src = src; - } - }; - - var handleSources = function(source){ - var customMedia; - - var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr); - - if( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){ - source.setAttribute('media', customMedia); - } - - if(sourceSrcset){ - source.setAttribute('srcset', sourceSrcset); - } - }; - - var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){ - var src, srcset, parent, isPicture, event, firesLoad; - - if(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){ - - if(sizes){ - if(isAuto){ - addClass(elem, lazySizesCfg.autosizesClass); - } else { - elem.setAttribute('sizes', sizes); - } - } - - srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr); - src = elem[_getAttribute](lazySizesCfg.srcAttr); - - if(isImg) { - parent = elem.parentNode; - isPicture = parent && regPicture.test(parent.nodeName || ''); - } - - firesLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture)); - - event = {target: elem}; - - addClass(elem, lazySizesCfg.loadingClass); - - if(firesLoad){ - clearTimeout(resetPreloadingTimer); - resetPreloadingTimer = setTimeout(resetPreloading, 2500); - addRemoveLoadEvents(elem, rafSwitchLoadingClass, true); - } - - if(isPicture){ - forEach.call(parent.getElementsByTagName('source'), handleSources); - } - - if(srcset){ - elem.setAttribute('srcset', srcset); - } else if(src && !isPicture){ - if(regIframe.test(elem.nodeName)){ - changeIframeSrc(elem, src); - } else { - elem.src = src; - } - } - - if(isImg && (srcset || isPicture)){ - updatePolyfill(elem, {src: src}); - } - } - - if(elem._lazyRace){ - delete elem._lazyRace; - } - removeClass(elem, lazySizesCfg.lazyClass); - - rAF(function(){ - // Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015) - var isLoaded = elem.complete && elem.naturalWidth > 1; - - if( !firesLoad || isLoaded){ - if (isLoaded) { - addClass(elem, lazySizesCfg.fastLoadedClass); - } - switchLoadingClass(event); - elem._lazyCache = true; - setTimeout(function(){ - if ('_lazyCache' in elem) { - delete elem._lazyCache; - } - }, 9); - } - if (elem.loading == 'lazy') { - isLoading--; - } - }, true); - }); - - /** - * - * @param elem { Element } - */ - var unveilElement = function (elem){ - if (elem._lazyRace) {return;} - var detail; - - var isImg = regImg.test(elem.nodeName); - - //allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw") - var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes')); - var isAuto = sizes == 'auto'; - - if( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;} - - detail = triggerEvent(elem, 'lazyunveilread').detail; - - if(isAuto){ - autoSizer.updateElem(elem, true, elem.offsetWidth); - } - - elem._lazyRace = true; - isLoading++; - - lazyUnveil(elem, detail, isAuto, sizes, isImg); - }; - - var afterScroll = debounce(function(){ - lazySizesCfg.loadMode = 3; - throttledCheckElements(); - }); - - var altLoadmodeScrollListner = function(){ - if(lazySizesCfg.loadMode == 3){ - lazySizesCfg.loadMode = 2; - } - afterScroll(); - }; - - var onload = function(){ - if(isCompleted){return;} - if(Date.now() - started < 999){ - setTimeout(onload, 999); - return; - } - - - isCompleted = true; - - lazySizesCfg.loadMode = 3; - - throttledCheckElements(); - - addEventListener('scroll', altLoadmodeScrollListner, true); - }; - - return { - _: function(){ - started = Date.now(); - - lazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass); - preloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass); - - addEventListener('scroll', throttledCheckElements, true); - - addEventListener('resize', throttledCheckElements, true); - - addEventListener('pageshow', function (e) { - if (e.persisted) { - var loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass); - - if (loadingElements.length && loadingElements.forEach) { - requestAnimationFrame(function () { - loadingElements.forEach( function (img) { - if (img.complete) { - unveilElement(img); - } - }); - }); - } - } - }); - - if(window.MutationObserver){ - new MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} ); - } else { - docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true); - docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true); - setInterval(throttledCheckElements, 999); - } - - addEventListener('hashchange', throttledCheckElements, true); - - //, 'fullscreenchange' - ['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){ - document[_addEventListener](name, throttledCheckElements, true); - }); - - if((/d$|^c/.test(document.readyState))){ - onload(); - } else { - addEventListener('load', onload); - document[_addEventListener]('DOMContentLoaded', throttledCheckElements); - setTimeout(onload, 20000); - } - - if(lazysizes.elements.length){ - checkElements(); - rAF._lsFlush(); - } else { - throttledCheckElements(); - } - }, - checkElems: throttledCheckElements, - unveil: unveilElement, - _aLSL: altLoadmodeScrollListner, - }; - })(); - - - var autoSizer = (function(){ - var autosizesElems; - - var sizeElement = rAFIt(function(elem, parent, event, width){ - var sources, i, len; - elem._lazysizesWidth = width; - width += 'px'; - - elem.setAttribute('sizes', width); - - if(regPicture.test(parent.nodeName || '')){ - sources = parent.getElementsByTagName('source'); - for(i = 0, len = sources.length; i < len; i++){ - sources[i].setAttribute('sizes', width); - } - } - - if(!event.detail.dataAttr){ - updatePolyfill(elem, event.detail); - } - }); - /** - * - * @param elem {Element} - * @param dataAttr - * @param [width] { number } - */ - var getSizeElement = function (elem, dataAttr, width){ - var event; - var parent = elem.parentNode; - - if(parent){ - width = getWidth(elem, parent, width); - event = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr}); - - if(!event.defaultPrevented){ - width = event.detail.width; - - if(width && width !== elem._lazysizesWidth){ - sizeElement(elem, parent, event, width); - } - } - } - }; - - var updateElementsSizes = function(){ - var i; - var len = autosizesElems.length; - if(len){ - i = 0; - - for(; i < len; i++){ - getSizeElement(autosizesElems[i]); - } - } - }; - - var debouncedUpdateElementsSizes = debounce(updateElementsSizes); - - return { - _: function(){ - autosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass); - addEventListener('resize', debouncedUpdateElementsSizes); - }, - checkElems: debouncedUpdateElementsSizes, - updateElem: getSizeElement - }; - })(); - - var init = function(){ - if(!init.i && document.getElementsByClassName){ - init.i = true; - autoSizer._(); - loader._(); - } - }; - - setTimeout(function(){ - if(lazySizesCfg.init){ - init(); - } - }); - - lazysizes = { - /** - * @type { LazySizesConfigPartial } - */ - cfg: lazySizesCfg, - autoSizer: autoSizer, - loader: loader, - init: init, - uP: updatePolyfill, - aC: addClass, - rC: removeClass, - hC: hasClass, - fire: triggerEvent, - gW: getWidth, - rAF: rAF, - }; - - return lazysizes; -} -)); - - -/***/ }), - -/***/ "./src/scss/style.scss": -/*!*****************************!*\ - !*** ./src/scss/style.scss ***! - \*****************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -// extracted by mini-css-extract-plugin - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ !function() { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function() { return module['default']; } : -/******/ function() { return module; }; -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ !function() { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -!function() { -"use strict"; -/*!*****************************!*\ - !*** ./src/js/app/index.js ***! - \*****************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _scss_style_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../scss/style.scss */ "./src/scss/style.scss"); -/* harmony import */ var _setTabIndex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./setTabIndex */ "./src/js/app/setTabIndex.js"); -/* harmony import */ var _colorModeToggle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colorModeToggle */ "./src/js/app/colorModeToggle.js"); -/* harmony import */ var _grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./grid */ "./src/js/app/grid.js"); -/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modal */ "./src/js/app/modal.js"); -/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./search */ "./src/js/app/search.js"); -/* harmony import */ var lazysizes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js"); -/* harmony import */ var lazysizes__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lazysizes__WEBPACK_IMPORTED_MODULE_6__); - - - - - - - -(0,_setTabIndex__WEBPACK_IMPORTED_MODULE_1__.default)(); -(0,_grid__WEBPACK_IMPORTED_MODULE_3__.default)(); -(0,_colorModeToggle__WEBPACK_IMPORTED_MODULE_2__.default)(); -(0,_modal__WEBPACK_IMPORTED_MODULE_4__.default)(); // eslint-disable-next-line no-undef - -if (typeof SEARCH_API !== 'undefined') { - (0,_search__WEBPACK_IMPORTED_MODULE_5__.default)(); -} -}(); -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbWFydC8uL25vZGVfbW9kdWxlcy9AdHJ5Z2hvc3QvY29udGVudC1hcGkvZXMvY29udGVudC1hcGkuanMiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvanMvYXBwL2NvbG9yTW9kZVRvZ2dsZS5qcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9qcy9hcHAvZm9jdXNUcmFwLmpzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL2pzL2FwcC9ncmlkLmpzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL2pzL2FwcC9tb2RhbC5qcyIsIndlYnBhY2s6Ly9zbWFydC8uL3NyYy9qcy9hcHAvc2VhcmNoLmpzIiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL2pzL2FwcC9zZXRUYWJJbmRleC5qcyIsIndlYnBhY2s6Ly9zbWFydC8uL25vZGVfbW9kdWxlcy9qcy1zZWFyY2gvZGlzdC9lc20vanMtc2VhcmNoLmpzIiwid2VicGFjazovL3NtYXJ0Ly4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9sYXp5c2l6ZXMuanMiLCJ3ZWJwYWNrOi8vc21hcnQvLi9zcmMvc2Nzcy9zdHlsZS5zY3NzPzZlZWUiLCJ3ZWJwYWNrOi8vc21hcnQvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc21hcnQvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc21hcnQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NtYXJ0L3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vc21hcnQvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zbWFydC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3NtYXJ0Ly4vc3JjL2pzL2FwcC9pbmRleC5qcyJdLCJuYW1lcyI6WyJ0b2dnbGVDb2xvckJ0bnMiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJzZXRDb2xvck1vZGUiLCJ3aW5kb3ciLCJDU1MiLCJzdXBwb3J0cyIsInRvZ2dsZUNvbG9yTW9kZSIsImUiLCJjdXJyZW50VGFyZ2V0IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJkb2N1bWVudEVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiZm9yRWFjaCIsImJ0biIsImFkZEV2ZW50TGlzdGVuZXIiLCJzdHlsZSIsImRpc3BsYXkiLCJGT0NVU0FCTEVfRUwiLCJjdXJyZW50Rm9jdXMiLCJjaGVja0Rpc3BsYXlTdGF0dXMiLCJlbCIsImdldENvbXB1dGVkU3R5bGUiLCJnZXROb25IaWRkZW5MYXN0RWwiLCJsYXN0RWwiLCJsZW5ndGgiLCJwZW51bHRpbWF0ZUVsIiwiY29uZmlndXJlRm9jdXNhYmxlRWxlbWVudHMiLCJjb250YWluZXJFbCIsImZvY3VzYWJsZUVsIiwiZmlyc3RFbFRvRm9jdXMiLCJmaXJzdFRhYlN0b3AiLCJsYXN0VGFiU3RvcCIsInRyYXBGb2N1cyIsInNpZGVNZW51RWwiLCJhY3RpdmVFbGVtZW50IiwiZm9jdXMiLCJ0YWJLZXlIYW5kbGVyIiwidGFicyIsImtleUNvZGUiLCJzaGlmdEtleSIsInByZXZlbnREZWZhdWx0IiwicmVsZWFzZUZvY3VzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImdyaWRDb250YWluZXJzIiwidXBkYXRlTnVtYmVyIiwibnVtIiwidHlwZSIsImFkZCIsImNvdW50Q2hpbGRyZW4iLCJncmlkQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJpIiwibnVtT2ZDaGlsZHJlbiIsImdyaWRJbml0IiwicmVxdWlyZSIsInNlYXJjaEJ0biIsImdldEVsZW1lbnRCeUlkIiwibVNlYXJjaEJ0biIsIm1lbnVCdG4iLCJjbG9zZUJ0bnMiLCJTRUFSQ0hfQVBJIiwiYnRucyIsIm1vZGFsRm4iLCJjbG9zZSIsIm1vZGFsIiwiYm9keSIsInJlbW92ZSIsImlucHV0IiwicXVlcnlTZWxlY3RvciIsInZhbHVlIiwiY2xvc2VIYW5kbGVyIiwiY2xvc2VzdCIsIm9wZW5IYW5kbGVyIiwiZGF0YXNldCIsInRhcmdldCIsIm5vblRhcmdldENsb3NlSGFuZGxlciIsImV2IiwiY2xvc2VCeUVzY0hhbmRsZXIiLCJrZXkiLCJzZWFyY2hNb2RhbCIsImh0bWxSZXBsYWNlIiwic3RyIiwicmVwbGFjZSIsImNyZWF0ZVRpbWVzdGFtcCIsIm1pbnV0ZXMiLCJ0aW1lc3RhbXAiLCJEYXRlIiwibm93Iiwic3RhdGVMb2FkZXIiLCJzdGF0ZSIsInN0YXR1cyIsInNlYXJjaCIsImZyZXNoQXBpIiwiR2hvc3RDb250ZW50QVBJIiwidXJsIiwibG9jYXRpb24iLCJwcm90b2NvbCIsImhvc3QiLCJ2ZXJzaW9uIiwiYXBpIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJwYXJzZUludCIsImdldEl0ZW0iLCJwb3N0cyIsImJyb3dzZSIsImluY2x1ZGUiLCJmb3JtYXRzIiwibGltaXQiLCJ0aGVuIiwiZGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIkVycm9yIiwiY2F0Y2giLCJlcnIiLCJhbGVydCIsInNlYXJjaElucHV0IiwicnVuU2VhcmNoQnRuIiwic2VhcmNoUmVzdWx0SGVhZGVyIiwic2VhcmNoUmVzdWx0IiwiZGF0ZUZvcm1hdHRlciIsImlzb0RhdGUiLCJvcHRpb25zIiwieWVhciIsIm1vbnRoIiwiZGF5IiwiZGF0ZSIsInRvTG9jYWxlRGF0ZVN0cmluZyIsInVuZGVmaW5lZCIsInNlYXJjaFBvc3RzIiwidGVybSIsImlubmVySFRNTCIsIm5ld1NlYXJjaCIsIkpzU2VhcmNoIiwiYWRkSW5kZXgiLCJhZGREb2N1bWVudHMiLCJyZXN1bHQiLCJ0ZXh0Q29udGVudCIsInBvc3QiLCJwdWJsaXNoZWRfYXQiLCJ0aXRsZSIsImV4Y2VycHQiLCJlbnRlclNlYXJjaFRlcm1DaGVjayIsInJlbW92ZU5hdkxpbmtzIiwibWVudU5hdkxpbmtzIiwic2V0VGFiSW5kZXgiLCJncmlkIiwiY29sb3JNb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLHNIQUFzSCxxQkFBTSxtQkFBbUIscUJBQU07O0FBRXJKO0FBQ0Esa0JBQWtCLFlBQVksRUFBRTtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixhQUFhLEVBQUU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQyxNQUFNLG1CQUFtQixVQUFVLEVBQUUsRUFBRTtBQUN4RSxDQUFDOztBQUVELG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBLGdGQUFnRixPQUFPOztBQUV2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixVQUFVO0FBQ2hDLEdBQUc7QUFDSCxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxnQkFBZ0I7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGdCQUFnQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0Esb0RBQW9EOztBQUVwRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLHNCQUFzQjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osR0FBRztBQUNILFlBQVk7QUFDWjtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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OztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sWUFBWTtBQUNuQjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtCQUErQjtBQUMvQix1Q0FBdUM7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCwyQkFBMkI7QUFDM0IsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksTUFBTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLEdBQUc7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHLElBQUk7QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLCtEQUFlLGVBQWUsRUFBQztBQUMvQjs7Ozs7Ozs7Ozs7Ozs7OztBQ2xpSEE7QUFDQTtBQUNBO0FBRUEsSUFBTUEsZUFBZSxHQUFHQyxRQUFRLENBQUNDLGdCQUFULENBQTBCLG9CQUExQixDQUF4QjtBQUVlLFNBQVNDLFlBQVQsR0FBd0I7QUFDckMsTUFBSUMsTUFBTSxDQUFDQyxHQUFQLElBQWNBLEdBQUcsQ0FBQ0MsUUFBSixDQUFhLE9BQWIsRUFBc0IsZ0JBQXRCLENBQWxCLEVBQTJEO0FBQ3pELFFBQU1DLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQ0MsQ0FBRCxFQUFPO0FBQzdCLFVBQUlBLENBQUMsQ0FBQ0MsYUFBRixDQUFnQkMsU0FBaEIsQ0FBMEJDLFFBQTFCLENBQW1DLE9BQW5DLENBQUosRUFBaUQ7QUFDL0NWLGdCQUFRLENBQUNXLGVBQVQsQ0FBeUJDLFlBQXpCLENBQXNDLFlBQXRDLEVBQW9ELE9BQXBEO0FBQ0FDLG9CQUFZLENBQUNDLE9BQWIsQ0FBcUIsTUFBckIsRUFBNkIsT0FBN0I7QUFDQTtBQUNEOztBQUNEZCxjQUFRLENBQUNXLGVBQVQsQ0FBeUJDLFlBQXpCLENBQXNDLFlBQXRDLEVBQW9ELE1BQXBEO0FBQ0FDLGtCQUFZLENBQUNDLE9BQWIsQ0FBcUIsTUFBckIsRUFBNkIsTUFBN0I7QUFDRCxLQVJEOztBQVNBZixtQkFBZSxDQUFDZ0IsT0FBaEIsQ0FBd0IsVUFBQ0MsR0FBRCxFQUFTO0FBQy9CQSxTQUFHLENBQUNDLGdCQUFKLENBQXFCLE9BQXJCLEVBQThCWCxlQUE5QjtBQUNELEtBRkQ7QUFHRCxHQWJELE1BYU87QUFDTFAsbUJBQWUsQ0FBQ2dCLE9BQWhCLENBQXdCLFVBQUNSLENBQUQsRUFBTztBQUM3QkEsT0FBQyxDQUFDVyxLQUFGLENBQVFDLE9BQVIsR0FBa0IsTUFBbEI7QUFDRCxLQUZEO0FBR0Q7QUFDRixDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCRCxJQUFNQyxZQUFZLEdBQ2hCLGdMQURGO0FBR0EsSUFBSUMsWUFBSjs7QUFFQSxJQUFNQyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQXFCLENBQUNDLEVBQUQ7QUFBQSxTQUN6QnBCLE1BQU0sQ0FBQ3FCLGdCQUFQLENBQXdCRCxFQUF4QixFQUE0QkosT0FBNUIsS0FBd0MsTUFEZjtBQUFBLENBQTNCOztBQUdBLElBQU1NLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBcUIsQ0FBQ0YsRUFBRCxFQUFRO0FBQ2pDLE1BQU1HLE1BQU0sR0FBR0gsRUFBRSxDQUFDQSxFQUFFLENBQUNJLE1BQUgsR0FBWSxDQUFiLENBQWpCO0FBQ0EsTUFBTUMsYUFBYSxHQUFHTCxFQUFFLENBQUNBLEVBQUUsQ0FBQ0ksTUFBSCxHQUFZLENBQWIsQ0FBeEI7O0FBRUEsTUFBSUwsa0JBQWtCLENBQUNJLE1BQUQsQ0FBdEIsRUFBZ0M7QUFDOUIsV0FBT0EsTUFBUDtBQUNEOztBQUVELFNBQU9FLGFBQVA7QUFDRCxDQVREOztBQVdBLElBQU1DLDBCQUEwQixHQUFHLFNBQTdCQSwwQkFBNkIsQ0FBQ0MsV0FBRCxFQUFpQjtBQUNsRCxNQUFNQyxXQUFXLEdBQUdELFdBQVcsQ0FBQzdCLGdCQUFaLENBQTZCbUIsWUFBN0IsQ0FBcEI7QUFDQVcsYUFBVyxDQUFDaEIsT0FBWixDQUFvQixVQUFDUSxFQUFEO0FBQUEsV0FBUUEsRUFBRSxDQUFDWCxZQUFILENBQWdCLFVBQWhCLEVBQTRCLEdBQTVCLENBQVI7QUFBQSxHQUFwQjtBQUNBLE1BQU1vQixjQUFjLEdBQUdELFdBQVcsQ0FBQyxDQUFELENBQWxDO0FBQ0EsTUFBTUUsWUFBWSxHQUFHRixXQUFXLENBQUMsQ0FBRCxDQUFoQztBQUNBLE1BQU1HLFdBQVcsR0FBR1Qsa0JBQWtCLENBQUNNLFdBQUQsQ0FBdEM7QUFDQSxTQUFPLENBQUNFLFlBQUQsRUFBZUMsV0FBZixFQUE0QkYsY0FBNUIsQ0FBUDtBQUNELENBUEQ7O0FBU08sSUFBTUcsU0FBUyxHQUFHLFNBQVpBLFNBQVksQ0FBQ0MsVUFBRCxFQUFnQjtBQUN2Q2YsY0FBWSxHQUFHckIsUUFBUSxDQUFDcUMsYUFBeEI7QUFDQSxNQUFNTCxjQUFjLEdBQUdILDBCQUEwQixDQUFDTyxVQUFELENBQWpEO0FBQ0FKLGdCQUFjLENBQUMsQ0FBRCxDQUFkLENBQWtCTSxLQUFsQjtBQUNELENBSk07QUFNQSxTQUFTQyxhQUFULENBQXVCaEMsQ0FBdkIsRUFBMEI7QUFDL0IsTUFBTWlDLElBQUksR0FBR1gsMEJBQTBCLENBQUMsSUFBRCxDQUF2QztBQUNBLE1BQU1JLFlBQVksR0FBR08sSUFBSSxDQUFDLENBQUQsQ0FBekI7QUFDQSxNQUFNTixXQUFXLEdBQUdNLElBQUksQ0FBQyxDQUFELENBQXhCOztBQUNBLE1BQUlqQyxDQUFDLENBQUNrQyxPQUFGLEtBQWMsQ0FBbEIsRUFBcUI7QUFDbkI7QUFDQSxRQUFJbEMsQ0FBQyxDQUFDbUMsUUFBTixFQUFnQjtBQUNkLFVBQUkxQyxRQUFRLENBQUNxQyxhQUFULEtBQTJCSixZQUEvQixFQUE2QztBQUMzQzFCLFNBQUMsQ0FBQ29DLGNBQUY7QUFDQVQsbUJBQVcsQ0FBQ0ksS0FBWjtBQUNELE9BSmEsQ0FLZDs7QUFDRCxLQU5ELE1BTU8sSUFBSXRDLFFBQVEsQ0FBQ3FDLGFBQVQsS0FBMkJILFdBQS9CLEVBQTRDO0FBQ2pEM0IsT0FBQyxDQUFDb0MsY0FBRjtBQUNBVixrQkFBWSxDQUFDSyxLQUFiO0FBQ0Q7QUFDRjtBQUNGO0FBRU0sSUFBTU0sWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ1IsVUFBRCxFQUFnQjtBQUMxQyxNQUFNTCxXQUFXLEdBQUdLLFVBQVUsQ0FBQ25DLGdCQUFYLENBQTRCbUIsWUFBNUIsQ0FBcEI7QUFDQVcsYUFBVyxDQUFDaEIsT0FBWixDQUFvQixVQUFDUSxFQUFEO0FBQUEsV0FBUUEsRUFBRSxDQUFDWCxZQUFILENBQWdCLFVBQWhCLEVBQTRCLElBQTVCLENBQVI7QUFBQSxHQUFwQjtBQUNBd0IsWUFBVSxDQUFDUyxtQkFBWCxDQUErQixTQUEvQixFQUEwQ04sYUFBMUM7QUFDQWxCLGNBQVksQ0FBQ2lCLEtBQWI7QUFDRCxDQUxNLEM7Ozs7Ozs7Ozs7OztBQ3JEUCxJQUFNUSxjQUFjLEdBQUc5QyxRQUFRLENBQUNDLGdCQUFULENBQTBCLG9CQUExQixDQUF2Qjs7QUFFQSxTQUFTOEMsWUFBVCxDQUFzQnhCLEVBQXRCLEVBQTBCeUIsR0FBMUIsRUFBK0JDLElBQS9CLEVBQXFDO0FBQ25DLE1BQUlBLElBQUksS0FBSyxXQUFiLEVBQTBCO0FBQ3hCMUIsTUFBRSxDQUFDZCxTQUFILENBQWF5QyxHQUFiLDZCQUFzQ0YsR0FBdEM7QUFDQTtBQUNEOztBQUNEekIsSUFBRSxDQUFDZCxTQUFILENBQWF5QyxHQUFiLG1CQUE0QkYsR0FBNUI7QUFDRDs7QUFFRCxTQUFTRyxhQUFULENBQXVCQyxhQUF2QixFQUFzQztBQUFBLE1BQzVCQyxRQUQ0QixHQUNmRCxhQURlLENBQzVCQyxRQUQ0QjtBQUVwQ0EsVUFBUSxDQUFDdEMsT0FBVCxDQUFpQixVQUFDUSxFQUFELEVBQUsrQixDQUFMO0FBQUEsV0FBV1AsWUFBWSxDQUFDeEIsRUFBRCxFQUFLK0IsQ0FBQyxHQUFHLENBQVQsQ0FBdkI7QUFBQSxHQUFqQjtBQUNBLE1BQU1DLGFBQWEsR0FBR0YsUUFBUSxDQUFDMUIsTUFBL0I7QUFDQW9CLGNBQVksQ0FBQ0ssYUFBRCxFQUFnQkcsYUFBaEIsRUFBK0IsV0FBL0IsQ0FBWjtBQUNBLFNBQU87QUFBRUYsWUFBUSxFQUFSQSxRQUFGO0FBQVlFLGlCQUFhLEVBQWJBO0FBQVosR0FBUDtBQUNEOztBQUVELFNBQVNDLFFBQVQsR0FBb0I7QUFDbEIsTUFBSSxDQUFDVixjQUFMLEVBQXFCO0FBQ25CO0FBQ0Q7O0FBQ0RBLGdCQUFjLENBQUMvQixPQUFmLENBQXVCLFVBQUNxQyxhQUFEO0FBQUEsV0FBbUJELGFBQWEsQ0FBQ0MsYUFBRCxDQUFoQztBQUFBLEdBQXZCO0FBQ0Q7O0FBRUQsK0RBQWVJLFFBQWYsRTs7Ozs7Ozs7Ozs7O2VDekJtREMsbUJBQU8sQ0FBQyw4Q0FBRCxDO0lBQWxEdEIsUyxZQUFBQSxTO0lBQVdTLFksWUFBQUEsWTtJQUFjTCxhLFlBQUFBLGE7O0FBRWpDLElBQU1tQixTQUFTLEdBQUcxRCxRQUFRLENBQUMyRCxjQUFULENBQXdCLGVBQXhCLENBQWxCO0FBQ0EsSUFBTUMsVUFBVSxHQUFHNUQsUUFBUSxDQUFDMkQsY0FBVCxDQUF3QixpQkFBeEIsQ0FBbkI7QUFDQSxJQUFNRSxPQUFPLEdBQUc3RCxRQUFRLENBQUMyRCxjQUFULENBQXdCLGFBQXhCLENBQWhCO0FBQ0EsSUFBTUcsU0FBUyxHQUFHOUQsUUFBUSxDQUFDQyxnQkFBVCxDQUEwQixzQkFBMUIsQ0FBbEI7O0FBRUEsSUFBSSxPQUFPOEQsVUFBUCxLQUFzQixXQUExQixFQUF1QztBQUNyQ0wsV0FBUyxDQUFDeEMsS0FBVixDQUFnQkMsT0FBaEIsR0FBMEIsTUFBMUI7QUFDQXlDLFlBQVUsQ0FBQzFDLEtBQVgsQ0FBaUJDLE9BQWpCLEdBQTJCLE1BQTNCO0FBQ0Q7O0FBRUQsSUFBTTZDLElBQUksR0FBRyxDQUFDTixTQUFELEVBQVlFLFVBQVosRUFBd0JDLE9BQXhCLENBQWI7O0FBRUEsSUFBTUksT0FBTyxHQUFHLFNBQVZBLE9BQVUsR0FBTTtBQUNwQjtBQUVBLE1BQU1DLEtBQUssR0FBRyxTQUFSQSxLQUFRLENBQUNDLEtBQUQsRUFBVztBQUN2Qm5FLFlBQVEsQ0FBQ29FLElBQVQsQ0FBYzNELFNBQWQsQ0FBd0I0RCxNQUF4QixDQUErQixtQkFBL0I7QUFDQUYsU0FBSyxDQUFDdkQsWUFBTixDQUFtQixlQUFuQixFQUFvQyxPQUFwQztBQUNBLFFBQU0wRCxLQUFLLEdBQUdILEtBQUssQ0FBQ0ksYUFBTixDQUFvQixPQUFwQixDQUFkOztBQUNBLFFBQUlELEtBQUosRUFBVztBQUNUQSxXQUFLLENBQUNFLEtBQU4sR0FBYyxFQUFkO0FBQ0Q7O0FBQ0Q1QixnQkFBWSxDQUFDdUIsS0FBRCxDQUFaO0FBQ0QsR0FSRDs7QUFVQSxNQUFNTSxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDbEUsQ0FBRCxFQUFPO0FBQzFCLFFBQU00RCxLQUFLLEdBQUc1RCxDQUFDLENBQUNDLGFBQUYsQ0FBZ0JrRSxPQUFoQixDQUF3QixXQUF4QixDQUFkO0FBQ0FSLFNBQUssQ0FBQ0MsS0FBRCxDQUFMO0FBQ0QsR0FIRDs7QUFLQSxNQUFNUSxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDcEUsQ0FBRCxFQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLFFBQU00RCxLQUFLLEdBQUduRSxRQUFRLENBQUMyRCxjQUFULENBQXdCcEQsQ0FBQyxDQUFDQyxhQUFGLENBQWdCb0UsT0FBaEIsQ0FBd0JDLE1BQWhELENBQWQ7QUFDQTdFLFlBQVEsQ0FBQ29FLElBQVQsQ0FBYzNELFNBQWQsQ0FBd0J5QyxHQUF4QixDQUE0QixtQkFBNUI7QUFDQWlCLFNBQUssQ0FBQ3ZELFlBQU4sQ0FBbUIsZUFBbkIsRUFBb0MsTUFBcEM7QUFDQXVCLGFBQVMsQ0FBQ2dDLEtBQUQsQ0FBVDtBQUNBQSxTQUFLLENBQUNsRCxnQkFBTixDQUF1QixTQUF2QixFQUFrQ3NCLGFBQWxDOztBQUNBLFFBQU11QyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQUNDLEVBQUQsRUFBUTtBQUNwQyxVQUFJQSxFQUFFLENBQUNGLE1BQUgsQ0FBVXBFLFNBQVYsQ0FBb0JDLFFBQXBCLENBQTZCLGlCQUE3QixDQUFKLEVBQXFEO0FBQ25Ed0QsYUFBSyxDQUFDQyxLQUFELENBQUw7QUFDQW5FLGdCQUFRLENBQUNvRSxJQUFULENBQWN2QixtQkFBZCxDQUFrQyxPQUFsQyxFQUEyQ2lDLHFCQUEzQyxFQUZtRCxDQUduRDs7QUFDQTlFLGdCQUFRLENBQUNvRSxJQUFULENBQWN2QixtQkFBZCxDQUFrQyxPQUFsQyxFQUEyQ21DLGlCQUEzQztBQUNEO0FBQ0YsS0FQRDs7QUFRQWhGLFlBQVEsQ0FBQ29FLElBQVQsQ0FBY25ELGdCQUFkLENBQStCLE9BQS9CLEVBQXdDNkQscUJBQXhDOztBQUNBLFFBQU1FLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ0MsR0FBRCxFQUFTO0FBQ2pDLFVBQUlBLEdBQUcsQ0FBQ0EsR0FBSixLQUFZLFFBQVosSUFBd0JBLEdBQUcsQ0FBQ3hDLE9BQUosS0FBZ0IsRUFBNUMsRUFBZ0Q7QUFDOUN5QixhQUFLLENBQUNDLEtBQUQsQ0FBTDtBQUNBbkUsZ0JBQVEsQ0FBQ29FLElBQVQsQ0FBY3ZCLG1CQUFkLENBQWtDLE9BQWxDLEVBQTJDbUMsaUJBQTNDO0FBQ0FoRixnQkFBUSxDQUFDb0UsSUFBVCxDQUFjdkIsbUJBQWQsQ0FBa0MsT0FBbEMsRUFBMkNpQyxxQkFBM0M7QUFDRDtBQUNGLEtBTkQ7O0FBT0E5RSxZQUFRLENBQUNvRSxJQUFULENBQWNuRCxnQkFBZCxDQUErQixPQUEvQixFQUF3QytELGlCQUF4QztBQUNELEdBMUJEOztBQTRCQWhCLE1BQUksQ0FBQ2pELE9BQUwsQ0FBYSxVQUFDQyxHQUFELEVBQVM7QUFDcEIsUUFBSUEsR0FBSixFQUFTO0FBQ1BBLFNBQUcsQ0FBQ0MsZ0JBQUosQ0FBcUIsT0FBckIsRUFBOEIwRCxXQUE5QjtBQUNEO0FBQ0YsR0FKRDtBQU1BYixXQUFTLENBQUMvQyxPQUFWLENBQWtCLFVBQUNDLEdBQUQsRUFBUztBQUN6QixRQUFJQSxHQUFKLEVBQVM7QUFDUEEsU0FBRyxDQUFDQyxnQkFBSixDQUFxQixPQUFyQixFQUE4QndELFlBQTlCO0FBQ0Q7QUFDRixHQUpEO0FBS0QsQ0F6REQ7O0FBMkRBLCtEQUFlUixPQUFmLEU7Ozs7Ozs7Ozs7Ozs7O0FDekVBO0FBQ0E7QUFFQSxJQUFNaUIsV0FBVyxHQUFHbEYsUUFBUSxDQUFDMkQsY0FBVCxDQUF3QixpQkFBeEIsQ0FBcEI7O0FBRUEsSUFBTXdCLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUNDLEdBQUQ7QUFBQSxTQUFTQSxHQUFHLENBQUNDLE9BQUosQ0FBWSxJQUFaLEVBQWtCLE1BQWxCLEVBQTBCQSxPQUExQixDQUFrQyxJQUFsQyxFQUF3QyxNQUF4QyxDQUFUO0FBQUEsQ0FBcEI7O0FBQ0EsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixHQUFrQjtBQUFBLE1BQWpCQyxPQUFpQix1RUFBUCxFQUFPO0FBQ3hDLE1BQU1DLFNBQVMsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLEtBQWFILE9BQU8sR0FBRyxLQUF6QztBQUNBLFNBQU9DLFNBQVA7QUFDRCxDQUhEOztBQUtBLElBQU1HLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUNDLEtBQUQsRUFBUUMsTUFBUixFQUFtQjtBQUNyQyxNQUFJQSxNQUFKLEVBQVk7QUFDVlgsZUFBVyxDQUFDekUsU0FBWixDQUFzQnlDLEdBQXRCLENBQTBCMEMsS0FBMUI7QUFDRCxHQUZELE1BRU87QUFDTFYsZUFBVyxDQUFDekUsU0FBWixDQUFzQjRELE1BQXRCLENBQTZCdUIsS0FBN0I7QUFDRDtBQUNGLENBTkQ7O0FBUUEsSUFBTUUsTUFBTSxHQUFHLFNBQVRBLE1BQVMsR0FBTTtBQUNuQixNQUFNQyxRQUFRLEdBQUcsSUFBSUMsMERBQUosQ0FBb0I7QUFDbkNDLE9BQUcsWUFBSzlGLE1BQU0sQ0FBQytGLFFBQVAsQ0FBZ0JDLFFBQXJCLGVBQWtDaEcsTUFBTSxDQUFDK0YsUUFBUCxDQUFnQkUsSUFBbEQsQ0FEZ0M7QUFFbkM7QUFDQW5CLE9BQUcsRUFBRWxCLFVBSDhCO0FBSW5Dc0MsV0FBTyxFQUFFO0FBSjBCLEdBQXBCLENBQWpCO0FBT0EsTUFBTUMsR0FBRyxHQUFHLElBQUlDLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDM0MsUUFBTWpCLFNBQVMsR0FBR2tCLFFBQVEsQ0FBQzdGLFlBQVksQ0FBQzhGLE9BQWIsQ0FBcUIsV0FBckIsQ0FBRCxFQUFvQyxFQUFwQyxDQUExQjtBQUNBLFFBQU1qQixHQUFHLEdBQUdELElBQUksQ0FBQ0MsR0FBTCxFQUFaOztBQUVBLFFBQUksQ0FBQ0YsU0FBRCxJQUFjRSxHQUFHLEdBQUdGLFNBQXhCLEVBQW1DO0FBQ2pDTyxjQUFRLENBQUNhLEtBQVQsQ0FDR0MsTUFESCxDQUNVO0FBQ05DLGVBQU8sRUFBRSxNQURIO0FBRU5DLGVBQU8sRUFBRSxXQUZIO0FBR05DLGFBQUssRUFBRTtBQUhELE9BRFYsRUFNR0MsSUFOSCxDQU1RLFVBQUNDLElBQUQsRUFBVTtBQUNkckcsb0JBQVksQ0FBQ0MsT0FBYixDQUFxQixPQUFyQixFQUE4QnFHLElBQUksQ0FBQ0MsU0FBTCxDQUFlRixJQUFmLENBQTlCO0FBQ0FyRyxvQkFBWSxDQUFDQyxPQUFiLENBQXFCLFdBQXJCLEVBQWtDd0UsZUFBZSxFQUFqRDtBQUNBa0IsZUFBTyxDQUFDVSxJQUFELENBQVA7QUFDRCxPQVZIO0FBV0QsS0FaRCxNQVlPO0FBQ0wsVUFBTU4sS0FBSyxHQUFHTyxJQUFJLENBQUNFLEtBQUwsQ0FBV3hHLFlBQVksQ0FBQzhGLE9BQWIsQ0FBcUIsT0FBckIsQ0FBWCxDQUFkO0FBQ0FILGFBQU8sQ0FBQ0ksS0FBRCxDQUFQO0FBQ0FILFlBQU0sQ0FBQyxJQUFJYSxLQUFKLENBQVUsc0JBQVYsQ0FBRCxDQUFOO0FBQ0Q7QUFDRixHQXJCVyxFQXFCVEMsS0FyQlMsQ0FxQkgsVUFBQ0MsR0FBRCxFQUFTO0FBQ2hCO0FBQ0FDLFNBQUssbUVBQTRERCxHQUE1RCxFQUFMO0FBQ0QsR0F4QlcsQ0FBWixDQVJtQixDQWtDbkI7O0FBQ0EsTUFBTUUsV0FBVyxHQUFHMUgsUUFBUSxDQUFDMkQsY0FBVCxDQUF3QixpQkFBeEIsQ0FBcEI7QUFDQSxNQUFNZ0UsWUFBWSxHQUFHM0gsUUFBUSxDQUFDMkQsY0FBVCxDQUF3QixtQkFBeEIsQ0FBckI7QUFDQSxNQUFNaUUsa0JBQWtCLEdBQUc1SCxRQUFRLENBQUN1RSxhQUFULENBQ3pCLDRCQUR5QixDQUEzQjtBQUdBLE1BQU1zRCxZQUFZLEdBQUc3SCxRQUFRLENBQUN1RSxhQUFULENBQXVCLCtCQUF2QixDQUFyQjs7QUFFQSxNQUFNdUQsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixDQUFDQyxPQUFELEVBQWE7QUFDakMsUUFBTUMsT0FBTyxHQUFHO0FBQ2RDLFVBQUksRUFBRSxTQURRO0FBRWRDLFdBQUssRUFBRSxPQUZPO0FBR2RDLFNBQUcsRUFBRTtBQUhTLEtBQWhCO0FBS0EsUUFBTUMsSUFBSSxHQUFHLElBQUkzQyxJQUFKLENBQVNzQyxPQUFULENBQWI7QUFFQSxXQUFPSyxJQUFJLENBQUNDLGtCQUFMLENBQXdCQyxTQUF4QixFQUFtQ04sT0FBbkMsQ0FBUDtBQUNELEdBVEQ7O0FBV0EsTUFBTU8sV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ0MsSUFBRCxFQUFVO0FBQzVCN0MsZUFBVyxDQUFDLFNBQUQsRUFBWSxJQUFaLENBQVg7QUFDQWtDLGdCQUFZLENBQUNZLFNBQWIsR0FBeUIsRUFBekI7QUFDQW5DLE9BQUcsQ0FBQ1csSUFBSixDQUFTLFVBQUNMLEtBQUQsRUFBVztBQUNsQixVQUFNOEIsU0FBUyxHQUFHLElBQUlDLDZDQUFKLENBQW9CLElBQXBCLENBQWxCO0FBQ0FELGVBQVMsQ0FBQ0UsUUFBVixDQUFtQixPQUFuQjtBQUNBRixlQUFTLENBQUNFLFFBQVYsQ0FBbUIsV0FBbkI7QUFFQUYsZUFBUyxDQUFDRyxZQUFWLENBQXVCakMsS0FBdkI7QUFDQSxVQUFNa0MsTUFBTSxHQUFHSixTQUFTLENBQUM1QyxNQUFWLENBQWlCMEMsSUFBakIsQ0FBZjs7QUFFQSxVQUFJTSxNQUFNLENBQUNuSCxNQUFQLEdBQWdCLENBQXBCLEVBQXVCO0FBQ3JCaUcsMEJBQWtCLENBQUNtQixXQUFuQixhQUFvQ0QsTUFBTSxDQUFDbkgsTUFBM0MsZ0NBQWtFNkcsSUFBbEU7QUFDRCxPQUZELE1BRU8sSUFBSU0sTUFBTSxDQUFDbkgsTUFBUCxLQUFrQixDQUF0QixFQUF5QjtBQUM5QmlHLDBCQUFrQixDQUFDbUIsV0FBbkIsYUFBb0NELE1BQU0sQ0FBQ25ILE1BQTNDLCtCQUFpRTZHLElBQWpFO0FBQ0QsT0FGTSxNQUVBO0FBQ0xaLDBCQUFrQixDQUFDbUIsV0FBbkIsa0NBQW9EUCxJQUFwRDtBQUNEOztBQUVETSxZQUFNLENBQUMvSCxPQUFQLENBQWUsVUFBQ2lJLElBQUQsRUFBVTtBQUN2Qm5CLG9CQUFZLENBQUNZLFNBQWIsbUhBQytDTyxJQUFJLENBQUMvQyxHQURwRCxxRUFFMkM2QixhQUFhLENBQ2hEa0IsSUFBSSxDQUFDQyxZQUQyQyxDQUZ4RCx1RUFLNENELElBQUksQ0FBQ0UsS0FMakQsMkZBT1UvRCxXQUFXLENBQUM2RCxJQUFJLENBQUNHLE9BQU4sQ0FQckI7QUFVRCxPQVhEO0FBYUF4RCxpQkFBVyxDQUFDLFNBQUQsRUFBWSxLQUFaLENBQVg7QUFDRCxLQTlCRDtBQStCRCxHQWxDRDs7QUFvQ0EsTUFBTXlELG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBdUIsR0FBTTtBQUNqQyxRQUFJLENBQUN2QixZQUFZLENBQUNZLFNBQWxCLEVBQTZCO0FBQzNCYix3QkFBa0IsQ0FBQ21CLFdBQW5CLEdBQWlDLHFCQUFqQztBQUNEO0FBQ0YsR0FKRDs7QUFNQXBCLGNBQVksQ0FBQzFHLGdCQUFiLENBQThCLE9BQTlCLEVBQXVDLFlBQU07QUFDM0MsUUFBSXlHLFdBQVcsQ0FBQ2xELEtBQVosS0FBc0IsRUFBMUIsRUFBOEI7QUFDNUI0RSwwQkFBb0I7QUFDckIsS0FGRCxNQUVPO0FBQ0xiLGlCQUFXLENBQUNiLFdBQVcsQ0FBQ2xELEtBQWIsQ0FBWDtBQUNEO0FBQ0YsR0FORDtBQVFBa0QsYUFBVyxDQUFDekcsZ0JBQVosQ0FBNkIsT0FBN0IsRUFBc0MsVUFBQ1YsQ0FBRCxFQUFPO0FBQzNDLFFBQUltSCxXQUFXLENBQUNsRCxLQUFaLEtBQXNCLEVBQTFCLEVBQThCO0FBQzVCNEUsMEJBQW9CO0FBQ3JCLEtBRkQsTUFFTyxJQUFJN0ksQ0FBQyxDQUFDMEUsR0FBRixLQUFVLE9BQWQsRUFBdUI7QUFDNUJzRCxpQkFBVyxDQUFDYixXQUFXLENBQUNsRCxLQUFiLENBQVg7QUFDRDtBQUNGLEdBTkQ7QUFRQWtELGFBQVcsQ0FBQ3pHLGdCQUFaLENBQTZCLE9BQTdCLEVBQXNDLFVBQUNWLENBQUQsRUFBTztBQUMzQ29GLGVBQVcsQ0FBQyxTQUFELEVBQVksS0FBWixDQUFYO0FBQ0FwRixLQUFDLENBQUNzRSxNQUFGLENBQVNMLEtBQVQsR0FBaUIsRUFBakI7QUFDRCxHQUhEO0FBS0FrRCxhQUFXLENBQUN6RyxnQkFBWixDQUE2QixPQUE3QixFQUFzQyxZQUFNO0FBQzFDMEUsZUFBVyxDQUFDLFNBQUQsRUFBWSxLQUFaLENBQVg7QUFDRCxHQUZEO0FBR0QsQ0F2SEQ7O0FBeUhBLCtEQUFlRyxNQUFmLEU7Ozs7Ozs7Ozs7Ozs7OztBQzVJZSxTQUFTdUQsY0FBVCxHQUEwQjtBQUN2QyxNQUFNQyxZQUFZLEdBQUd0SixRQUFRLENBQUNDLGdCQUFULENBQTBCLFlBQTFCLENBQXJCO0FBQ0FxSixjQUFZLENBQUN2SSxPQUFiLENBQXFCLFVBQUNRLEVBQUQ7QUFBQSxXQUFRQSxFQUFFLENBQUNYLFlBQUgsQ0FBZ0IsVUFBaEIsRUFBNEIsSUFBNUIsQ0FBUjtBQUFBLEdBQXJCO0FBQ0QsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDLFlBQVk7QUFDdEQ7O0FBRUEscUJBQXFCLFlBQVk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCLGlCQUFpQixpQkFBaUI7QUFDbEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLGVBQWU7QUFDN0Q7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhDQUE4QyxhQUFhO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSw4Q0FBOEMsYUFBYTtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNEQUFzRDs7O0FBR3REO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsZ0RBQWdELGVBQWU7QUFDL0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhDQUE4QyxlQUFlO0FBQzdEO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsYUFBYTtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsOENBQThDLGFBQWE7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFPLEcsQ0FFUDs7QUFDQSxJQUFJLE9BQU9GLFVBQVAsS0FBc0IsV0FBMUIsRUFBdUM7QUFDckMrQixrREFBTTtBQUNQLEMiLCJmaWxlIjoiYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge307XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsXzEgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgY2hlY2sodHlwZW9mIGdsb2JhbFRoaXMgPT0gJ29iamVjdCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8XG4gIGNoZWNrKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYpIHx8XG4gIGNoZWNrKHR5cGVvZiBjb21tb25qc0dsb2JhbCA9PSAnb2JqZWN0JyAmJiBjb21tb25qc0dsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbnZhciBmYWlscyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG52YXIgZGVzY3JpcHRvcnMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG5cbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxudmFyIGYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6IG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG52YXIgb2JqZWN0UHJvcGVydHlJc0VudW1lcmFibGUgPSB7XG5cdGY6IGZcbn07XG5cbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcblxudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciBjbGFzc29mUmF3ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBpbmRleGVkT2JqZWN0ID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mUmF3KGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuXG4vLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxuLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcblxuXG5cbnZhciB0b0luZGV4ZWRPYmplY3QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcblxudmFyIGlzT2JqZWN0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xudmFyIHRvUHJpbWl0aXZlID0gZnVuY3Rpb24gKGlucHV0LCBQUkVGRVJSRURfU1RSSU5HKSB7XG4gIGlmICghaXNPYmplY3QoaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpbnB1dC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcblxudmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cbnZhciBoYXMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG5cbnZhciBkb2N1bWVudCQxID0gZ2xvYmFsXzEuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCQxKSAmJiBpc09iamVjdChkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQpO1xuXG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG52YXIgaWU4RG9tRGVmaW5lID0gIWRlc2NyaXB0b3JzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxudmFyIGYkMSA9IGRlc2NyaXB0b3JzID8gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoaWU4RG9tRGVmaW5lKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighb2JqZWN0UHJvcGVydHlJc0VudW1lcmFibGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG5cbnZhciBvYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSB7XG5cdGY6IGYkMVxufTtcblxudmFyIGFuT2JqZWN0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG52YXIgZiQyID0gZGVzY3JpcHRvcnMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChpZThEb21EZWZpbmUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxudmFyIG9iamVjdERlZmluZVByb3BlcnR5ID0ge1xuXHRmOiBmJDJcbn07XG5cbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBkZXNjcmlwdG9ycyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIG9iamVjdERlZmluZVByb3BlcnR5LmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cbnZhciBzZXRHbG9iYWwgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxfMSwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsXzFba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbF8xW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG52YXIgc2hhcmVkU3RvcmUgPSBzdG9yZTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZztcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGAzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc2hhcmVkU3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHNoYXJlZFN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxudmFyIGluc3BlY3RTb3VyY2UgPSBzaGFyZWRTdG9yZS5pbnNwZWN0U291cmNlO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbF8xLldlYWtNYXA7XG5cbnZhciBuYXRpdmVXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpO1xuXG52YXIgc2hhcmVkID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHNoYXJlZFN0b3JlW2tleV0gfHwgKHNoYXJlZFN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjcuMCcsXG4gIG1vZGU6ICAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xufSk7XG5cbnZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbnZhciB1aWQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7XG59O1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG52YXIgc2hhcmVkS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuXG52YXIgaGlkZGVuS2V5cyA9IHt9O1xuXG52YXIgV2Vha01hcCQxID0gZ2xvYmFsXzEuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzJDE7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMkMShpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAobmF0aXZlV2Vha01hcCkge1xuICB2YXIgc3RvcmUkMSA9IHNoYXJlZFN0b3JlLnN0YXRlIHx8IChzaGFyZWRTdG9yZS5zdGF0ZSA9IG5ldyBXZWFrTWFwJDEoKSk7XG4gIHZhciB3bWdldCA9IHN0b3JlJDEuZ2V0O1xuICB2YXIgd21oYXMgPSBzdG9yZSQxLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUkMS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICB3bXNldC5jYWxsKHN0b3JlJDEsIGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gd21nZXQuY2FsbChzdG9yZSQxLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyQxID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUkMSwgaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzJDEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbnZhciBpbnRlcm5hbFN0YXRlID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzJDEsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuXG52YXIgcmVkZWZpbmUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIHZhciBzdGF0ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7XG4gICAgfVxuICAgIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodmFsdWUpO1xuICAgIGlmICghc3RhdGUuc291cmNlKSB7XG4gICAgICBzdGF0ZS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gICAgfVxuICB9XG4gIGlmIChPID09PSBnbG9iYWxfMSkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59KTtcbn0pO1xuXG52YXIgcGF0aCA9IGdsb2JhbF8xO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxudmFyIGdldEJ1aWx0SW4gPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbF8xW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsXzFbbmFtZXNwYWNlXSAmJiBnbG9iYWxfMVtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG52YXIgdG9JbnRlZ2VyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc05hTihhcmd1bWVudCA9ICthcmd1bWVudCkgPyAwIDogKGFyZ3VtZW50ID4gMCA/IGZsb29yIDogY2VpbCkoYXJndW1lbnQpO1xufTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbnZhciB0b0xlbmd0aCA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiQxID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbnZhciB0b0Fic29sdXRlSW5kZXggPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbiQxKGludGVnZXIsIGxlbmd0aCk7XG59O1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxudmFyIGFycmF5SW5jbHVkZXMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcblxudmFyIGluZGV4T2YgPSBhcnJheUluY2x1ZGVzLmluZGV4T2Y7XG5cblxudmFyIG9iamVjdEtleXNJbnRlcm5hbCA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbnZhciBlbnVtQnVnS2V5cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG5cbnZhciBoaWRkZW5LZXlzJDEgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG52YXIgZiQzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBvYmplY3RLZXlzSW50ZXJuYWwoTywgaGlkZGVuS2V5cyQxKTtcbn07XG5cbnZhciBvYmplY3RHZXRPd25Qcm9wZXJ0eU5hbWVzID0ge1xuXHRmOiBmJDNcbn07XG5cbnZhciBmJDQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG52YXIgb2JqZWN0R2V0T3duUHJvcGVydHlTeW1ib2xzID0ge1xuXHRmOiBmJDRcbn07XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbnZhciBvd25LZXlzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IG9iamVjdEdldE93blByb3BlcnR5TmFtZXMuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gb2JqZWN0R2V0T3duUHJvcGVydHlTeW1ib2xzLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuXG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gb2JqZWN0RGVmaW5lUHJvcGVydHkuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IG9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvci5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcblxudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcblxudmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikge1xuICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gIHJldHVybiB2YWx1ZSA9PSBQT0xZRklMTCA/IHRydWVcbiAgICA6IHZhbHVlID09IE5BVElWRSA/IGZhbHNlXG4gICAgOiB0eXBlb2YgZGV0ZWN0aW9uID09ICdmdW5jdGlvbicgPyBmYWlscyhkZXRlY3Rpb24pXG4gICAgOiAhIWRldGVjdGlvbjtcbn07XG5cbnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlcGxhY2VtZW50LCAnLicpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTtcbnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7XG52YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJztcblxudmFyIGlzRm9yY2VkXzEgPSBpc0ZvcmNlZDtcblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxID0gb2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmY7XG5cblxuXG5cblxuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbnZhciBfZXhwb3J0ID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbF8xO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbF8xW1RBUkdFVF0gfHwgc2V0R2xvYmFsKFRBUkdFVCwge30pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldCA9IChnbG9iYWxfMVtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkXzEoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0XG4gICAgaWYgKCFGT1JDRUQgJiYgdGFyZ2V0UHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNsYXNzb2ZSYXcoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG52YXIgdG9PYmplY3QgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuXG52YXIgY3JlYXRlUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIG9iamVjdERlZmluZVByb3BlcnR5LmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcblxudmFyIG5hdGl2ZVN5bWJvbCA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpO1xufSk7XG5cbnZhciB1c2VTeW1ib2xBc1VpZCA9IG5hdGl2ZVN5bWJvbFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgJiYgIVN5bWJvbC5zaGFtXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuXG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBTeW1ib2wkMSA9IGdsb2JhbF8xLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSB1c2VTeW1ib2xBc1VpZCA/IFN5bWJvbCQxIDogU3ltYm9sJDEgJiYgU3ltYm9sJDEud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbnZhciB3ZWxsS25vd25TeW1ib2wgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7XG4gICAgaWYgKG5hdGl2ZVN5bWJvbCAmJiBoYXMoU3ltYm9sJDEsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2wkMVtuYW1lXTtcbiAgICBlbHNlIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTtcbiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdO1xufTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG5cbnZhciBlbmdpbmVVc2VyQWdlbnQgPSBnZXRCdWlsdEluKCduYXZpZ2F0b3InLCAndXNlckFnZW50JykgfHwgJyc7XG5cbnZhciBwcm9jZXNzJDEgPSBnbG9iYWxfMS5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyQxICYmIHByb2Nlc3MkMS52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTtcbn0gZWxzZSBpZiAoZW5naW5lVXNlckFnZW50KSB7XG4gIG1hdGNoID0gZW5naW5lVXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IGVuZ2luZVVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gIH1cbn1cblxudmFyIGVuZ2luZVY4VmVyc2lvbiA9IHZlcnNpb24gJiYgK3ZlcnNpb247XG5cbnZhciBTUEVDSUVTJDEgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzdcbiAgcmV0dXJuIGVuZ2luZVY4VmVyc2lvbiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IGFycmF5LmNvbnN0cnVjdG9yID0ge307XG4gICAgY29uc3RydWN0b3JbU1BFQ0lFUyQxXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcblxudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gd2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjtcbnZhciBNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQgPSAnTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJztcblxuLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4vLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBlbmdpbmVWOFZlcnNpb24gPj0gNTEgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gW107XG4gIGFycmF5W0lTX0NPTkNBVF9TUFJFQURBQkxFXSA9IGZhbHNlO1xuICByZXR1cm4gYXJyYXkuY29uY2F0KClbMF0gIT09IGFycmF5O1xufSk7XG5cbnZhciBTUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdjb25jYXQnKTtcblxudmFyIGlzQ29uY2F0U3ByZWFkYWJsZSA9IGZ1bmN0aW9uIChPKSB7XG4gIGlmICghaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNwcmVhZGFibGUgPSBPW0lTX0NPTkNBVF9TUFJFQURBQkxFXTtcbiAgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoTyk7XG59O1xuXG52YXIgRk9SQ0VEID0gIUlTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgfHwgIVNQRUNJRVNfU1VQUE9SVDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvbmNhdFxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQGlzQ29uY2F0U3ByZWFkYWJsZSBhbmQgQEBzcGVjaWVzXG5fZXhwb3J0KHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBjb25jYXQ6IGZ1bmN0aW9uIGNvbmNhdChhcmcpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgdmFyIG4gPSAwO1xuICAgIHZhciBpLCBrLCBsZW5ndGgsIGxlbiwgRTtcbiAgICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBFID0gaSA9PT0gLTEgPyBPIDogYXJndW1lbnRzW2ldO1xuICAgICAgaWYgKGlzQ29uY2F0U3ByZWFkYWJsZShFKSkge1xuICAgICAgICBsZW4gPSB0b0xlbmd0aChFLmxlbmd0aCk7XG4gICAgICAgIGlmIChuICsgbGVuID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsrKywgbisrKSBpZiAoayBpbiBFKSBjcmVhdGVQcm9wZXJ0eShBLCBuLCBFW2tdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuID49IE1BWF9TQUZFX0lOVEVHRVIpIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpO1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShBLCBuKyssIEUpO1xuICAgICAgfVxuICAgIH1cbiAgICBBLmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG52YXIgYUZ1bmN0aW9uJDEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgZnVuY3Rpb25CaW5kQ29udGV4dCA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbiQxKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuXG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kJDEgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBpbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gZnVuY3Rpb25CaW5kQ29udGV4dChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaC5jYWxsKHRhcmdldCwgdmFsdWUpOyAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbnZhciBhcnJheUl0ZXJhdGlvbiA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kJDEoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCQxKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgZmlsdGVyOiBjcmVhdGVNZXRob2QkMSgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kJDEoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCQxKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuICBmaW5kOiBjcmVhdGVNZXRob2QkMSg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kJDEoNilcbn07XG5cbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FLCBhcmd1bWVudCkge1xuICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdO1xuICByZXR1cm4gISFtZXRob2QgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhbGwsbm8tdGhyb3ctbGl0ZXJhbFxuICAgIG1ldGhvZC5jYWxsKG51bGwsIGFyZ3VtZW50IHx8IGZ1bmN0aW9uICgpIHsgdGhyb3cgMTsgfSwgMSk7XG4gIH0pO1xufTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNhY2hlID0ge307XG5cbnZhciB0aHJvd2VyID0gZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9O1xuXG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUsIG9wdGlvbnMpIHtcbiAgaWYgKGhhcyhjYWNoZSwgTUVUSE9EX05BTUUpKSByZXR1cm4gY2FjaGVbTUVUSE9EX05BTUVdO1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgdmFyIEFDQ0VTU09SUyA9IGhhcyhvcHRpb25zLCAnQUNDRVNTT1JTJykgPyBvcHRpb25zLkFDQ0VTU09SUyA6IGZhbHNlO1xuICB2YXIgYXJndW1lbnQwID0gaGFzKG9wdGlvbnMsIDApID8gb3B0aW9uc1swXSA6IHRocm93ZXI7XG4gIHZhciBhcmd1bWVudDEgPSBoYXMob3B0aW9ucywgMSkgPyBvcHRpb25zWzFdIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiBjYWNoZVtNRVRIT0RfTkFNRV0gPSAhIW1ldGhvZCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIGlmIChBQ0NFU1NPUlMgJiYgIWRlc2NyaXB0b3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgTyA9IHsgbGVuZ3RoOiAtMSB9O1xuXG4gICAgaWYgKEFDQ0VTU09SUykgZGVmaW5lUHJvcGVydHkoTywgMSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IHRocm93ZXIgfSk7XG4gICAgZWxzZSBPWzFdID0gMTtcblxuICAgIG1ldGhvZC5jYWxsKE8sIGFyZ3VtZW50MCwgYXJndW1lbnQxKTtcbiAgfSk7XG59O1xuXG52YXIgJGZvckVhY2ggPSBhcnJheUl0ZXJhdGlvbi5mb3JFYWNoO1xuXG5cblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnZm9yRWFjaCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbnZhciBhcnJheUZvckVhY2ggPSAoIVNUUklDVF9NRVRIT0QgfHwgIVVTRVNfVE9fTEVOR1RIKSA/IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbn0gOiBbXS5mb3JFYWNoO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbl9leHBvcnQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFtdLmZvckVhY2ggIT0gYXJyYXlGb3JFYWNoIH0sIHtcbiAgZm9yRWFjaDogYXJyYXlGb3JFYWNoXG59KTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5rZXlzXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gb2JqZWN0S2V5c0ludGVybmFsKE8sIGVudW1CdWdLZXlzKTtcbn07XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xudmFyIG9iamVjdERlZmluZVByb3BlcnRpZXMgPSBkZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBvYmplY3REZWZpbmVQcm9wZXJ0eS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcblxudmFyIGh0bWwgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAqL1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IGRvY3VtZW50LmRvbWFpbiAmJiBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gYWN0aXZlWERvY3VtZW50ID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKCk7XG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogb2JqZWN0RGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxudmFyIFVOU0NPUEFCTEVTID0gd2VsbEtub3duU3ltYm9sKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBvYmplY3REZWZpbmVQcm9wZXJ0eS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogb2JqZWN0Q3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcblxudmFyICRpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMuaW5jbHVkZXM7XG5cblxuXG52YXIgVVNFU19UT19MRU5HVEgkMSA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKCdpbmRleE9mJywgeyBBQ0NFU1NPUlM6IHRydWUsIDE6IDAgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5fZXhwb3J0KHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhVVNFU19UT19MRU5HVEgkMSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTtcblxudmFyIG5hdGl2ZUpvaW4gPSBbXS5qb2luO1xuXG52YXIgRVMzX1NUUklOR1MgPSBpbmRleGVkT2JqZWN0ICE9IE9iamVjdDtcbnZhciBTVFJJQ1RfTUVUSE9EJDEgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdqb2luJywgJywnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5qb2luYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5qb2luXG5fZXhwb3J0KHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBFUzNfU1RSSU5HUyB8fCAhU1RSSUNUX01FVEhPRCQxIH0sIHtcbiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gbmF0aXZlSm9pbi5jYWxsKHRvSW5kZXhlZE9iamVjdCh0aGlzKSwgc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCcgOiBzZXBhcmF0b3IpO1xuICB9XG59KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IHJlZHVjZSwgcmVkdWNlUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCQyID0gZnVuY3Rpb24gKElTX1JJR0hUKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYXJndW1lbnRzTGVuZ3RoLCBtZW1vKSB7XG4gICAgYUZ1bmN0aW9uJDEoY2FsbGJhY2tmbik7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGF0KTtcbiAgICB2YXIgc2VsZiA9IGluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBJU19SSUdIVCA/IGxlbmd0aCAtIDEgOiAwO1xuICAgIHZhciBpID0gSVNfUklHSFQgPyAtMSA6IDE7XG4gICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA8IDIpIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgICBtZW1vID0gc2VsZltpbmRleF07XG4gICAgICAgIGluZGV4ICs9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGlmIChJU19SSUdIVCA/IGluZGV4IDwgMCA6IGxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7SVNfUklHSFQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcbn07XG5cbnZhciBhcnJheVJlZHVjZSA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlXG4gIGxlZnQ6IGNyZWF0ZU1ldGhvZCQyKGZhbHNlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VyaWdodFxuICByaWdodDogY3JlYXRlTWV0aG9kJDIodHJ1ZSlcbn07XG5cbnZhciBlbmdpbmVJc05vZGUgPSBjbGFzc29mUmF3KGdsb2JhbF8xLnByb2Nlc3MpID09ICdwcm9jZXNzJztcblxudmFyICRyZWR1Y2UgPSBhcnJheVJlZHVjZS5sZWZ0O1xuXG5cblxuXG5cbnZhciBTVFJJQ1RfTUVUSE9EJDIgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdyZWR1Y2UnKTtcbnZhciBVU0VTX1RPX0xFTkdUSCQyID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3JlZHVjZScsIHsgMTogMCB9KTtcbi8vIENocm9tZSA4MC04MiBoYXMgYSBjcml0aWNhbCBidWdcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNDk5ODJcbnZhciBDSFJPTUVfQlVHID0gIWVuZ2luZUlzTm9kZSAmJiBlbmdpbmVWOFZlcnNpb24gPiA3OSAmJiBlbmdpbmVWOFZlcnNpb24gPCA4MztcblxuLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxuX2V4cG9ydCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNUUklDVF9NRVRIT0QkMiB8fCAhVVNFU19UT19MRU5HVEgkMiB8fCBDSFJPTUVfQlVHIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSQxID0gb2JqZWN0RGVmaW5lUHJvcGVydHkuZjtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIEZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmcgPSBGdW5jdGlvblByb3RvdHlwZS50b1N0cmluZztcbnZhciBuYW1lUkUgPSAvXlxccypmdW5jdGlvbiAoW14gKF0qKS87XG52YXIgTkFNRSA9ICduYW1lJztcblxuLy8gRnVuY3Rpb24gaW5zdGFuY2VzIGAubmFtZWAgcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLWluc3RhbmNlcy1uYW1lXG5pZiAoZGVzY3JpcHRvcnMgJiYgIShOQU1FIGluIEZ1bmN0aW9uUHJvdG90eXBlKSkge1xuICBkZWZpbmVQcm9wZXJ0eSQxKEZ1bmN0aW9uUHJvdG90eXBlLCBOQU1FLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmcuY2FsbCh0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbnZhciBuYXRpdmVBc3NpZ24gPSBPYmplY3QuYXNzaWduO1xudmFyIGRlZmluZVByb3BlcnR5JDIgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbnZhciBvYmplY3RBc3NpZ24gPSAhbmF0aXZlQXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZylcbiAgaWYgKGRlc2NyaXB0b3JzICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5JDIoe30sICdhJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSQyKHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiBuYXRpdmVBc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKG5hdGl2ZUFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IGFscGhhYmV0O1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gb2JqZWN0R2V0T3duUHJvcGVydHlTeW1ib2xzLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3BlcnR5SXNFbnVtZXJhYmxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gaW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gb2JqZWN0S2V5cyhTKS5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIWRlc2NyaXB0b3JzIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiBuYXRpdmVBc3NpZ247XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbl9leHBvcnQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IG9iamVjdEFzc2lnbiB9LCB7XG4gIGFzc2lnbjogb2JqZWN0QXNzaWduXG59KTtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG9iamVjdEtleXMoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbl9leHBvcnQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwge1xuICBrZXlzOiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEtleXModG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxudmFyIHRvU3RyaW5nVGFnU3VwcG9ydCA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuXG52YXIgVE9fU1RSSU5HX1RBRyQxID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2BcbnZhciBjbGFzc29mID0gdG9TdHJpbmdUYWdTdXBwb3J0ID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUckMSkpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbnZhciBvYmplY3RUb1N0cmluZyA9IHRvU3RyaW5nVGFnU3VwcG9ydCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghdG9TdHJpbmdUYWdTdXBwb3J0KSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIG9iamVjdFRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxudmFyIG5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IGdsb2JhbF8xLlByb21pc2U7XG5cbnZhciByZWRlZmluZUFsbCA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIGRlZmluZVByb3BlcnR5JDMgPSBvYmplY3REZWZpbmVQcm9wZXJ0eS5mO1xuXG5cblxudmFyIFRPX1NUUklOR19UQUckMiA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxudmFyIHNldFRvU3RyaW5nVGFnID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHJDIpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkkMyhpdCwgVE9fU1RSSU5HX1RBRyQyLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcblxudmFyIFNQRUNJRVMkMiA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG52YXIgc2V0U3BlY2llcyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IG9iamVjdERlZmluZVByb3BlcnR5LmY7XG5cbiAgaWYgKGRlc2NyaXB0b3JzICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTJDJdKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMkMiwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBhbkluc3RhbmNlID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG5cbnZhciBpdGVyYXRvcnMgPSB7fTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlJDEgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKGl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGUkMVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG5cbnZhciBJVEVSQVRPUiQxID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SJDFdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IGl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuXG52YXIgaXRlcmF0b3JDbG9zZSA9IGZ1bmN0aW9uIChpdGVyYXRvcikge1xuICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKS52YWx1ZTtcbiAgfVxufTtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgaXRlcmF0ZSA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBmdW5jdGlvbkJpbmRDb250ZXh0KHVuYm91bmRGdW5jdGlvbiwgdGhhdCwgMSArIEFTX0VOVFJJRVMgKyBJTlRFUlJVUFRFRCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG5cbnZhciBJVEVSQVRPUiQyID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUiQyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUiQyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuXG52YXIgU1BFQ0lFUyQzID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVMkM10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbiQxKFMpO1xufTtcblxudmFyIGVuZ2luZUlzSW9zID0gLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KGVuZ2luZVVzZXJBZ2VudCk7XG5cbnZhciBsb2NhdGlvbiA9IGdsb2JhbF8xLmxvY2F0aW9uO1xudmFyIHNldCQxID0gZ2xvYmFsXzEuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyID0gZ2xvYmFsXzEuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyQyID0gZ2xvYmFsXzEucHJvY2VzcztcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbF8xLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsXzEuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsXzEucG9zdE1lc3NhZ2UoaWQgKyAnJywgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCQxIHx8ICFjbGVhcikge1xuICBzZXQkMSA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChlbmdpbmVJc05vZGUpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2VzcyQyLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFlbmdpbmVJc0lvcykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gZnVuY3Rpb25CaW5kQ29udGV4dChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsXzEuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmXG4gICAgIWdsb2JhbF8xLmltcG9ydFNjcmlwdHMgJiZcbiAgICBsb2NhdGlvbiAmJiBsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6JyAmJlxuICAgICFmYWlscyhwb3N0KVxuICApIHtcbiAgICBkZWZlciA9IHBvc3Q7XG4gICAgZ2xvYmFsXzEuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bihpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7XG4gICAgfTtcbiAgfVxufVxuXG52YXIgdGFzayA9IHtcbiAgc2V0OiBzZXQkMSxcbiAgY2xlYXI6IGNsZWFyXG59O1xuXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDIgPSBvYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZjtcbnZhciBtYWNyb3Rhc2sgPSB0YXNrLnNldDtcblxuXG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsXzEuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWxfMS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50JDIgPSBnbG9iYWxfMS5kb2N1bWVudDtcbnZhciBwcm9jZXNzJDMgPSBnbG9iYWxfMS5wcm9jZXNzO1xudmFyIFByb21pc2UkMSA9IGdsb2JhbF8xLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDIoZ2xvYmFsXzEsICdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcblxudmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghcXVldWVNaWNyb3Rhc2spIHtcbiAgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGVuZ2luZUlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2VzcyQzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIGlmICghZW5naW5lSXNJb3MgJiYgIWVuZ2luZUlzTm9kZSAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50JDIpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudCQyLmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UkMSAmJiBQcm9taXNlJDEucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UkMS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgdGhlbiA9IHByb21pc2UudGhlbjtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGVuLmNhbGwocHJvbWlzZSwgZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKGVuZ2luZUlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MkMy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbF8xLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG52YXIgbWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7XG4gIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgaWYgKCFoZWFkKSB7XG4gICAgaGVhZCA9IHRhc2s7XG4gICAgbm90aWZ5KCk7XG4gIH0gbGFzdCA9IHRhc2s7XG59O1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uJDEocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uJDEocmVqZWN0KTtcbn07XG5cbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgZiQ1ID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG5cbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHtcblx0ZjogZiQ1XG59O1xuXG52YXIgcHJvbWlzZVJlc29sdmUgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcblxudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbF8xLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG5cbnZhciBwZXJmb3JtID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG5cbnZhciB0YXNrJDEgPSB0YXNrLnNldDtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgU1BFQ0lFUyQ0ID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZS5nZXQ7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGUuc2V0O1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gaW50ZXJuYWxTdGF0ZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gbmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yO1xudmFyIFR5cGVFcnJvciQxID0gZ2xvYmFsXzEuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50JDMgPSBnbG9iYWxfMS5kb2N1bWVudDtcbnZhciBwcm9jZXNzJDQgPSBnbG9iYWxfMS5wcm9jZXNzO1xudmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkkMSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkkMTtcbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50JDMgJiYgZG9jdW1lbnQkMy5jcmVhdGVFdmVudCAmJiBnbG9iYWxfMS5kaXNwYXRjaEV2ZW50KTtcbnZhciBOQVRJVkVfUkVKRUNUSU9OX0VWRU5UID0gdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbnZhciBGT1JDRUQkMSA9IGlzRm9yY2VkXzEoUFJPTUlTRSwgZnVuY3Rpb24gKCkge1xuICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IGluc3BlY3RTb3VyY2UoUHJvbWlzZUNvbnN0cnVjdG9yKSAhPT0gU3RyaW5nKFByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSkge1xuICAgIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICAgIGlmIChlbmdpbmVWOFZlcnNpb24gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgaWYgKCFlbmdpbmVJc05vZGUgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQpIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG4gIGlmIChlbmdpbmVWOFZlcnNpb24gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlQ29uc3RydWN0b3IucmVzb2x2ZSgxKTtcbiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgfTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICBjb25zdHJ1Y3RvcltTUEVDSUVTJDRdID0gRmFrZVByb21pc2U7XG4gIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEJDEgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIG5vdGlmeSQxID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yJDEoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudCQzLmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LnByb21pc2UgPSBwcm9taXNlO1xuICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpO1xuICAgIGdsb2JhbF8xLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbF8xWydvbicgKyBuYW1lXSkpIGhhbmRsZXIoZXZlbnQpO1xuICBlbHNlIGlmIChuYW1lID09PSBVTkhBTkRMRURfUkVKRUNUSU9OKSBob3N0UmVwb3J0RXJyb3JzKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCByZWFzb24pO1xufTtcblxudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHRhc2skMS5jYWxsKGdsb2JhbF8xLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZW5naW5lSXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2VzcyQ0LmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gZW5naW5lSXNOb2RlIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgdGFzayQxLmNhbGwoZ2xvYmFsXzEsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICBpZiAoZW5naW5lSXNOb2RlKSB7XG4gICAgICBwcm9jZXNzJDQuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeSQxKHN0YXRlLCB0cnVlKTtcbn07XG5cbnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICB0cnkge1xuICAgIGlmIChzdGF0ZS5mYWNhZGUgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IkMShcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkkMShzdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnRlcm5hbFJlamVjdCh7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoRk9SQ0VEJDEpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24kMShleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkkMShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGVuZ2luZUlzTm9kZSA/IHByb2Nlc3MkNC5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHN0YXRlLnN0YXRlICE9IFBFTkRJTkcpIG5vdGlmeSQxKHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5LmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSQxID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCB0eXBlb2YgbmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicpIHtcbiAgICBuYXRpdmVUaGVuID0gbmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZS50aGVuO1xuXG4gICAgLy8gd3JhcCBuYXRpdmUgUHJvbWlzZSN0aGVuIGZvciBuYXRpdmUgYXN5bmMgZnVuY3Rpb25zXG4gICAgcmVkZWZpbmUobmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIG5hdGl2ZVRoZW4uY2FsbCh0aGF0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xuXG4gICAgLy8gd3JhcCBmZXRjaCByZXN1bHRcbiAgICBpZiAodHlwZW9mICRmZXRjaCA9PSAnZnVuY3Rpb24nKSBfZXhwb3J0KHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBmZXRjaDogZnVuY3Rpb24gZmV0Y2goaW5wdXQgLyogLCBpbml0ICovKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShQcm9taXNlQ29uc3RydWN0b3IsICRmZXRjaC5hcHBseShnbG9iYWxfMSwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuX2V4cG9ydCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQkMSB9LCB7XG4gIFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvclxufSk7XG5cbnNldFRvU3RyaW5nVGFnKFByb21pc2VDb25zdHJ1Y3RvciwgUFJPTUlTRSwgZmFsc2UpO1xuc2V0U3BlY2llcyhQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSBnZXRCdWlsdEluKFBST01JU0UpO1xuXG4vLyBzdGF0aWNzXG5fZXhwb3J0KHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCQxIH0sIHtcbiAgLy8gYFByb21pc2UucmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkkMSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbl9leHBvcnQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogIEZPUkNFRCQxIH0sIHtcbiAgLy8gYFByb21pc2UucmVzb2x2ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoIHRoaXMsIHgpO1xuICB9XG59KTtcblxuX2V4cG9ydCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSQxKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uJDEoQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyBgUHJvbWlzZS5yYWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSQxKEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uJDEoQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxuLy8gYElzUmVnRXhwYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG52YXIgaXNSZWdleHAgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZlJhdyhpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcblxudmFyIG5vdEFSZWdleHAgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzUmVnZXhwKGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG52YXIgTUFUQ0gkMSA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxudmFyIGNvcnJlY3RJc1JlZ2V4cExvZ2ljID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIHRyeSB7XG4gICAgICByZWdleHBbTUFUQ0gkMV0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG5cbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMyA9IG9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvci5mO1xuXG5cblxuXG5cblxudmFyIG5hdGl2ZUVuZHNXaXRoID0gJycuZW5kc1dpdGg7XG52YXIgbWluJDIgPSBNYXRoLm1pbjtcblxudmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDID0gY29ycmVjdElzUmVnZXhwTG9naWMoJ2VuZHNXaXRoJyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMlxudmFyIE1ETl9QT0xZRklMTF9CVUcgPSAgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciQzKFN0cmluZy5wcm90b3R5cGUsICdlbmRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aFxuX2V4cG9ydCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnZXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IG1pbiQyKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuIG5hdGl2ZUVuZHNXaXRoXG4gICAgICA/IG5hdGl2ZUVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciQ0ID0gb2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmY7XG5cblxuXG5cblxuXG52YXIgbmF0aXZlU3RhcnRzV2l0aCA9ICcnLnN0YXJ0c1dpdGg7XG52YXIgbWluJDMgPSBNYXRoLm1pbjtcblxudmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDJDEgPSBjb3JyZWN0SXNSZWdleHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHJDEgPSAgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDJDEgJiYgISFmdW5jdGlvbiAoKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDQoU3RyaW5nLnByb3RvdHlwZSwgJ3N0YXJ0c1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoXG5fZXhwb3J0KHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUckMSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMkMSB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgbm90QVJlZ2V4cChzZWFyY2hTdHJpbmcpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKG1pbiQzKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gbmF0aXZlU3RhcnRzV2l0aFxuICAgICAgPyBuYXRpdmVTdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG52YXIgZG9tSXRlcmFibGVzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIGRvbUl0ZXJhYmxlcykge1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbF8xW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlICYmIENvbGxlY3Rpb25Qcm90b3R5cGUuZm9yRWFjaCAhPT0gYXJyYXlGb3JFYWNoKSB0cnkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCAnZm9yRWFjaCcsIGFycmF5Rm9yRWFjaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgQ29sbGVjdGlvblByb3RvdHlwZS5mb3JFYWNoID0gYXJyYXlGb3JFYWNoO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG52YXIgYmluZCQxID0gZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfTtcbn07XG5cbi8qZ2xvYmFsIHRvU3RyaW5nOnRydWUqL1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG52YXIgdG9TdHJpbmckMSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkkMSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nJDEuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmckMS5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcbiAgcmV0dXJuICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnKSAmJiAodmFsIGluc3RhbmNlb2YgRm9ybURhdGEpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmICh2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QkMSh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbCkge1xuICBpZiAodG9TdHJpbmckMS5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gcHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZyQxLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nJDEuY2FsbCh2YWwpID09PSAnW29iamVjdCBGaWxlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmckMS5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB0b1N0cmluZyQxLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCQxKHZhbCkgJiYgaXNGdW5jdGlvbih2YWwucGlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVUkxTZWFyY2hQYXJhbXModmFsKSB7XG4gIHJldHVybiB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG59XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKi8sICcnKS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKi9cbmZ1bmN0aW9uIGlzU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgKG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOYXRpdmVTY3JpcHQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOUycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG4gICk7XG59XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuKSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkkMShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSQxKHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XG4gIGZvckVhY2goYiwgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodGhpc0FyZyAmJiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhW2tleV0gPSBiaW5kJDEodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuZnVuY3Rpb24gc3RyaXBCT00oY29udGVudCkge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxudmFyIHV0aWxzID0ge1xuICBpc0FycmF5OiBpc0FycmF5JDEsXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0JDEsXG4gIGlzUGxhaW5PYmplY3Q6IGlzUGxhaW5PYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNTdHJlYW06IGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtczogaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdHJpbTogdHJpbSxcbiAgc3RyaXBCT006IHN0cmlwQk9NXG59O1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xudmFyIGJ1aWxkVVJMID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdmFyIGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cblxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XG4gIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIEludGVyY2VwdG9yTWFuYWdlcl8xID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGhlYWRlcnMgVGhlIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbnZhciB0cmFuc2Zvcm1EYXRhID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycyk7XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcblxudmFyIGlzQ2FuY2VsID0gZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufTtcblxudmFyIG5vcm1hbGl6ZUhlYWRlck5hbWUgPSBmdW5jdGlvbiBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsIG5vcm1hbGl6ZWROYW1lKSB7XG4gIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0hlYWRlcih2YWx1ZSwgbmFtZSkge1xuICAgIGlmIChuYW1lICE9PSBub3JtYWxpemVkTmFtZSAmJiBuYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWROYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZE5hbWVdID0gdmFsdWU7XG4gICAgICBkZWxldGUgaGVhZGVyc1tuYW1lXTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG52YXIgZW5oYW5jZUVycm9yID0gZnVuY3Rpb24gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIGVycm9yLmNvbmZpZyA9IGNvbmZpZztcbiAgaWYgKGNvZGUpIHtcbiAgICBlcnJvci5jb2RlID0gY29kZTtcbiAgfVxuXG4gIGVycm9yLnJlcXVlc3QgPSByZXF1ZXN0O1xuICBlcnJvci5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICBlcnJvci5pc0F4aW9zRXJyb3IgPSB0cnVlO1xuXG4gIGVycm9yLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGNvZGU6IHRoaXMuY29kZVxuICAgIH07XG4gIH07XG4gIHJldHVybiBlcnJvcjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG52YXIgY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiBjcmVhdGVFcnJvcihtZXNzYWdlLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSk7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG52YXIgc2V0dGxlID0gZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgdmFyIHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG5cbnZhciBjb29raWVzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICAgIHZhciBjb29raWUgPSBbXTtcbiAgICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgICB9O1xuICAgIH0pKClcbik7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xudmFyIGlzQWJzb2x1dGVVUkwgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG52YXIgY29tYmluZVVSTHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbnZhciBidWlsZEZ1bGxQYXRoID0gZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59O1xuXG4vLyBIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xudmFyIGlnbm9yZUR1cGxpY2F0ZU9mID0gW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl07XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbnZhciBwYXJzZUhlYWRlcnMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge307XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG4gIHZhciBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2YuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gKHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gOiBbXSkuY29uY2F0KFt2YWxdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxudmFyIGlzVVJMU2FtZU9yaWdpbiA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICB2YXIgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICB2YXIgb3JpZ2luVVJMO1xuXG4gICAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0J3MgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICAgIHZhciBocmVmID0gdXJsO1xuXG4gICAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgICAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pKClcbik7XG5cbnZhciB4aHIgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29uZmlnLmF1dGgucGFzc3dvcmQpKSA6ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9ICFjb25maWcucmVzcG9uc2VUeXBlIHx8IGNvbmZpZy5yZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICB2YXIgdGltZW91dEVycm9yTWVzc2FnZSA9ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCc7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG4gICAgaWYgKHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgdmFyIHhzcmZWYWx1ZSA9IChjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihmdWxsUGF0aCkpICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSA/XG4gICAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW2NvbmZpZy54c3JmSGVhZGVyTmFtZV0gPSB4c3JmVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMsIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0RGF0YSA9PT0gJ3VuZGVmaW5lZCcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1trZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaGVhZGVyIHRvIHRoZSByZXF1ZXN0XG4gICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFjb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeHBlY3RlZCBET01FeGNlcHRpb24gdGhyb3duIGJ5IGJyb3dzZXJzIG5vdCBjb21wYXRpYmxlIFhNTEh0dHBSZXF1ZXN0IExldmVsIDIuXG4gICAgICAgIC8vIEJ1dCwgdGhpcyBjYW4gYmUgc3VwcHJlc3NlZCBmb3IgJ2pzb24nIHR5cGUgYXMgaXQgY2FuIGJlIHBhcnNlZCBieSBkZWZhdWx0ICd0cmFuc2Zvcm1SZXNwb25zZScgZnVuY3Rpb24uXG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiBvbkNhbmNlbGVkKGNhbmNlbCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlamVjdChjYW5jZWwpO1xuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0RGF0YSkge1xuICAgICAgcmVxdWVzdERhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEpO1xuICB9KTtcbn07XG5cbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG59O1xuXG5mdW5jdGlvbiBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgdmFsdWUpIHtcbiAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzKSAmJiB1dGlscy5pc1VuZGVmaW5lZChoZWFkZXJzWydDb250ZW50LVR5cGUnXSkpIHtcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBZGFwdGVyKCkge1xuICB2YXIgYWRhcHRlcjtcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHhocjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHhocjtcbiAgfVxuICByZXR1cm4gYWRhcHRlcjtcbn1cblxudmFyIGRlZmF1bHRzID0ge1xuICBhZGFwdGVyOiBnZXREZWZhdWx0QWRhcHRlcigpLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdBY2NlcHQnKTtcbiAgICBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBJZ25vcmUgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH1cbn07XG5cbmRlZmF1bHRzLmhlYWRlcnMgPSB7XG4gIGNvbW1vbjoge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG52YXIgZGVmYXVsdHNfMSA9IGRlZmF1bHRzO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcbiAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICBjb25maWcuZGF0YSxcbiAgICBjb25maWcuaGVhZGVycyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGNvbmZpZy5oZWFkZXJzLmNvbW1vbiB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1xuICApO1xuXG4gIHV0aWxzLmZvckVhY2goXG4gICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcbiAgICB9XG4gICk7XG5cbiAgdmFyIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0c18xLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbnZhciBtZXJnZUNvbmZpZyA9IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICB2YXIgY29uZmlnID0ge307XG5cbiAgdmFyIHZhbHVlRnJvbUNvbmZpZzJLZXlzID0gWyd1cmwnLCAnbWV0aG9kJywgJ2RhdGEnXTtcbiAgdmFyIG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzID0gWydoZWFkZXJzJywgJ2F1dGgnLCAncHJveHknLCAncGFyYW1zJ107XG4gIHZhciBkZWZhdWx0VG9Db25maWcyS2V5cyA9IFtcbiAgICAnYmFzZVVSTCcsICd0cmFuc2Zvcm1SZXF1ZXN0JywgJ3RyYW5zZm9ybVJlc3BvbnNlJywgJ3BhcmFtc1NlcmlhbGl6ZXInLFxuICAgICd0aW1lb3V0JywgJ3RpbWVvdXRNZXNzYWdlJywgJ3dpdGhDcmVkZW50aWFscycsICdhZGFwdGVyJywgJ3Jlc3BvbnNlVHlwZScsICd4c3JmQ29va2llTmFtZScsXG4gICAgJ3hzcmZIZWFkZXJOYW1lJywgJ29uVXBsb2FkUHJvZ3Jlc3MnLCAnb25Eb3dubG9hZFByb2dyZXNzJywgJ2RlY29tcHJlc3MnLFxuICAgICdtYXhDb250ZW50TGVuZ3RoJywgJ21heEJvZHlMZW5ndGgnLCAnbWF4UmVkaXJlY3RzJywgJ3RyYW5zcG9ydCcsICdodHRwQWdlbnQnLFxuICAgICdodHRwc0FnZW50JywgJ2NhbmNlbFRva2VuJywgJ3NvY2tldFBhdGgnLCAncmVzcG9uc2VFbmNvZGluZydcbiAgXTtcbiAgdmFyIGRpcmVjdE1lcmdlS2V5cyA9IFsndmFsaWRhdGVTdGF0dXMnXTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2UodGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzFbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfVxuXG4gIHV0aWxzLmZvckVhY2godmFsdWVGcm9tQ29uZmlnMktleXMsIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIocHJvcCkge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMltwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMltwcm9wXSk7XG4gICAgfVxuICB9KTtcblxuICB1dGlscy5mb3JFYWNoKG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzLCBtZXJnZURlZXBQcm9wZXJ0aWVzKTtcblxuICB1dGlscy5mb3JFYWNoKGRlZmF1bHRUb0NvbmZpZzJLZXlzLCBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKHByb3ApIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzFbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChkaXJlY3RNZXJnZUtleXMsIGZ1bmN0aW9uIG1lcmdlKHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBnZXRNZXJnZWRWYWx1ZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxW3Byb3BdKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBheGlvc0tleXMgPSB2YWx1ZUZyb21Db25maWcyS2V5c1xuICAgIC5jb25jYXQobWVyZ2VEZWVwUHJvcGVydGllc0tleXMpXG4gICAgLmNvbmNhdChkZWZhdWx0VG9Db25maWcyS2V5cylcbiAgICAuY29uY2F0KGRpcmVjdE1lcmdlS2V5cyk7XG5cbiAgdmFyIG90aGVyS2V5cyA9IE9iamVjdFxuICAgIC5rZXlzKGNvbmZpZzEpXG4gICAgLmNvbmNhdChPYmplY3Qua2V5cyhjb25maWcyKSlcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIGZpbHRlckF4aW9zS2V5cyhrZXkpIHtcbiAgICAgIHJldHVybiBheGlvc0tleXMuaW5kZXhPZihrZXkpID09PSAtMTtcbiAgICB9KTtcblxuICB1dGlscy5mb3JFYWNoKG90aGVyS2V5cywgbWVyZ2VEZWVwUHJvcGVydGllcyk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIEF4aW9zKGluc3RhbmNlQ29uZmlnKSB7XG4gIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcl8xKCksXG4gICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXJfMSgpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuICAgIGNvbmZpZy51cmwgPSBhcmd1bWVudHNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gdGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcubWV0aG9kID0gJ2dldCc7XG4gIH1cblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YTogKGNvbmZpZyB8fCB7fSkuZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnZhciBBeGlvc18xID0gQXhpb3M7XG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG52YXIgQ2FuY2VsXzEgPSBDYW5jZWw7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbF8xKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAqL1xuQ2FuY2VsVG9rZW4uc291cmNlID0gZnVuY3Rpb24gc291cmNlKCkge1xuICB2YXIgY2FuY2VsO1xuICB2YXIgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgIGNhbmNlbCA9IGM7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufTtcblxudmFyIENhbmNlbFRva2VuXzEgPSBDYW5jZWxUb2tlbjtcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbnZhciBzcHJlYWQgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICB2YXIgY29udGV4dCA9IG5ldyBBeGlvc18xKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kJDEoQXhpb3NfMS5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBBeGlvc18xLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzXzEpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3NfMTtcblxuLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuYXhpb3MuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhheGlvcy5kZWZhdWx0cywgaW5zdGFuY2VDb25maWcpKTtcbn07XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsID0gQ2FuY2VsXzE7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuXzE7XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG52YXIgYXhpb3NfMSA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbnZhciBkZWZhdWx0XzEgPSBheGlvcztcbmF4aW9zXzEuZGVmYXVsdCA9IGRlZmF1bHRfMTtcblxudmFyIGF4aW9zJDEgPSBheGlvc18xO1xuXG52YXIgc3VwcG9ydGVkVmVyc2lvbnMgPSBbJ3YyJywgJ3YzJywgJ3Y0JywgJ2NhbmFyeSddO1xudmFyIG5hbWUgPSAnQHRyeWdob3N0L2NvbnRlbnQtYXBpJztcbmZ1bmN0aW9uIEdob3N0Q29udGVudEFQSShfcmVmKSB7XG4gIHZhciB1cmwgPSBfcmVmLnVybCxcbiAgICAgIGhvc3QgPSBfcmVmLmhvc3QsXG4gICAgICBfcmVmJGdob3N0UGF0aCA9IF9yZWYuZ2hvc3RQYXRoLFxuICAgICAgZ2hvc3RQYXRoID0gX3JlZiRnaG9zdFBhdGggPT09IHZvaWQgMCA/ICdnaG9zdCcgOiBfcmVmJGdob3N0UGF0aCxcbiAgICAgIHZlcnNpb24gPSBfcmVmLnZlcnNpb24sXG4gICAgICBrZXkgPSBfcmVmLmtleTtcblxuICAvLyBob3N0IHBhcmFtZXRlciBpcyBkZXByZWNhdGVkXG4gIGlmIChob3N0KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc29sZS53YXJuKFwiXCIuY29uY2F0KG5hbWUsIFwiOiBUaGUgJ2hvc3QnIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlICd1cmwnIGluc3RlYWRcIikpO1xuXG4gICAgaWYgKCF1cmwpIHtcbiAgICAgIHVybCA9IGhvc3Q7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBHaG9zdENvbnRlbnRBUEkpIHtcbiAgICByZXR1cm4gR2hvc3RDb250ZW50QVBJKHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICAgIGtleToga2V5XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIi5jb25jYXQobmFtZSwgXCIgQ29uZmlnIE1pc3Npbmc6ICd2ZXJzaW9uJyBpcyByZXF1aXJlZC4gRS5nLiBcIikuY29uY2F0KHN1cHBvcnRlZFZlcnNpb25zLmpvaW4oJywnKSkpO1xuICB9XG5cbiAgaWYgKCFzdXBwb3J0ZWRWZXJzaW9ucy5pbmNsdWRlcyh2ZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChuYW1lLCBcIiBDb25maWcgSW52YWxpZDogJ3ZlcnNpb24nIFwiKS5jb25jYXQodmVyc2lvbiwgXCIgaXMgbm90IHN1cHBvcnRlZFwiKSk7XG4gIH1cblxuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChuYW1lLCBcIiBDb25maWcgTWlzc2luZzogJ3VybCcgaXMgcmVxdWlyZWQuIEUuZy4gJ2h0dHBzOi8vc2l0ZS5jb20nXCIpKTtcbiAgfVxuXG4gIGlmICghL2h0dHBzPzpcXC9cXC8vLnRlc3QodXJsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChuYW1lLCBcIiBDb25maWcgSW52YWxpZDogJ3VybCcgXCIpLmNvbmNhdCh1cmwsIFwiIHJlcXVpcmVzIGEgcHJvdG9jb2wuIEUuZy4gJ2h0dHBzOi8vc2l0ZS5jb20nXCIpKTtcbiAgfVxuXG4gIGlmICh1cmwuZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChuYW1lLCBcIiBDb25maWcgSW52YWxpZDogJ3VybCcgXCIpLmNvbmNhdCh1cmwsIFwiIG11c3Qgbm90IGhhdmUgYSB0cmFpbGluZyBzbGFzaC4gRS5nLiAnaHR0cHM6Ly9zaXRlLmNvbSdcIikpO1xuICB9XG5cbiAgaWYgKGdob3N0UGF0aC5lbmRzV2l0aCgnLycpIHx8IGdob3N0UGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIi5jb25jYXQobmFtZSwgXCIgQ29uZmlnIEludmFsaWQ6ICdnaG9zdFBhdGgnIFwiKS5jb25jYXQoZ2hvc3RQYXRoLCBcIiBtdXN0IG5vdCBoYXZlIGEgbGVhZGluZyBvciB0cmFpbGluZyBzbGFzaC4gRS5nLiAnZ2hvc3QnXCIpKTtcbiAgfVxuXG4gIGlmIChrZXkgJiYgIS9bMC05YS1mXXsyNn0vLnRlc3Qoa2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChuYW1lLCBcIiBDb25maWcgSW52YWxpZDogJ2tleScgXCIpLmNvbmNhdChrZXksIFwiIG11c3QgaGF2ZSAyNiBoZXggY2hhcmFjdGVyc1wiKSk7XG4gIH1cblxuICB2YXIgYXBpID0gWydwb3N0cycsICdhdXRob3JzJywgJ3RhZ3MnLCAncGFnZXMnLCAnc2V0dGluZ3MnXS5yZWR1Y2UoZnVuY3Rpb24gKGFwaU9iamVjdCwgcmVzb3VyY2VUeXBlKSB7XG4gICAgZnVuY3Rpb24gYnJvd3NlKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIG1lbWJlclRva2VuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gbWFrZVJlcXVlc3QocmVzb3VyY2VUeXBlLCBvcHRpb25zLCBudWxsLCBtZW1iZXJUb2tlbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZChkYXRhKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgbWVtYmVyVG9rZW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmlkICYmICFkYXRhLnNsdWcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlwiLmNvbmNhdChuYW1lLCBcIiByZWFkIHJlcXVpcmVzIGFuIGlkIG9yIHNsdWcuXCIpKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBtYWtlUmVxdWVzdChyZXNvdXJjZVR5cGUsIHBhcmFtcywgZGF0YS5pZCB8fCBcInNsdWcvXCIuY29uY2F0KGRhdGEuc2x1ZyksIG1lbWJlclRva2VuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhcGlPYmplY3QsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgcmVzb3VyY2VUeXBlLCB7XG4gICAgICByZWFkOiByZWFkLFxuICAgICAgYnJvd3NlOiBicm93c2VcbiAgICB9KSk7XG4gIH0sIHt9KTtcbiAgZGVsZXRlIGFwaS5zZXR0aW5ncy5yZWFkO1xuICByZXR1cm4gYXBpO1xuXG4gIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KHJlc291cmNlVHlwZSwgcGFyYW1zLCBpZCkge1xuICAgIHZhciBtZW1iZXJzVG9rZW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAgICBpZiAoIW1lbWJlcnNUb2tlbiAmJiAha2V5KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiXCIuY29uY2F0KG5hbWUsIFwiIENvbmZpZyBNaXNzaW5nOiAna2V5JyBpcyByZXF1aXJlZC5cIikpKTtcbiAgICB9XG5cbiAgICBkZWxldGUgcGFyYW1zLmlkO1xuICAgIHZhciBoZWFkZXJzID0gbWVtYmVyc1Rva2VuID8ge1xuICAgICAgQXV0aG9yaXphdGlvbjogXCJHaG9zdE1lbWJlcnMgXCIuY29uY2F0KG1lbWJlcnNUb2tlbilcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBheGlvcyQxLmdldChcIlwiLmNvbmNhdCh1cmwsIFwiL1wiKS5jb25jYXQoZ2hvc3RQYXRoLCBcIi9hcGkvXCIpLmNvbmNhdCh2ZXJzaW9uLCBcIi9jb250ZW50L1wiKS5jb25jYXQocmVzb3VyY2VUeXBlLCBcIi9cIikuY29uY2F0KGlkID8gaWQgKyAnLycgOiAnJyksIHtcbiAgICAgIHBhcmFtczogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGtleToga2V5XG4gICAgICB9LCBwYXJhbXMpLFxuICAgICAgcGFyYW1zU2VyaWFsaXplcjogZnVuY3Rpb24gcGFyYW1zU2VyaWFsaXplcihwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5yZWR1Y2UoZnVuY3Rpb24gKHBhcnRzLCBrKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IGVuY29kZVVSSUNvbXBvbmVudChbXS5jb25jYXQocGFyYW1ldGVyc1trXSkuam9pbignLCcpKTtcbiAgICAgICAgICByZXR1cm4gcGFydHMuY29uY2F0KFwiXCIuY29uY2F0KGssIFwiPVwiKS5jb25jYXQodmFsKSk7XG4gICAgICAgIH0sIFtdKS5qb2luKCcmJyk7XG4gICAgICB9LFxuICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcy5kYXRhW3Jlc291cmNlVHlwZV0pKSB7XG4gICAgICAgIHJldHVybiByZXMuZGF0YVtyZXNvdXJjZVR5cGVdO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLmRhdGFbcmVzb3VyY2VUeXBlXS5sZW5ndGggPT09IDEgJiYgIXJlcy5kYXRhLm1ldGEpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5kYXRhW3Jlc291cmNlVHlwZV1bMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHJlcy5kYXRhW3Jlc291cmNlVHlwZV0sIHtcbiAgICAgICAgbWV0YTogcmVzLmRhdGEubWV0YVxuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5yZXNwb25zZSAmJiBlcnIucmVzcG9uc2UuZGF0YSAmJiBlcnIucmVzcG9uc2UuZGF0YS5lcnJvcnMpIHtcbiAgICAgICAgdmFyIHByb3BzID0gZXJyLnJlc3BvbnNlLmRhdGEuZXJyb3JzWzBdO1xuICAgICAgICB2YXIgdG9UaHJvdyA9IG5ldyBFcnJvcihwcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgICAgIHRvVGhyb3cubmFtZSA9IHByb3BzLnR5cGU7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHRvVGhyb3dba10gPSBwcm9wc1trXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRvVGhyb3cucmVzcG9uc2UgPSBlcnIucmVzcG9uc2U7IC8vIEBUT0RPOiByZW1vdmUgaW4gMi4wLiBXZSBoYXZlIGVuaGFuY2VkIHRoZSBlcnJvciBoYW5kbGluZywgYnV0IHdlIGRvbid0IHdhbnQgdG8gYnJlYWsgZXhpc3RpbmcgaW1wbGVtZW50YXRpb25zLlxuXG4gICAgICAgIHRvVGhyb3cucmVxdWVzdCA9IGVyci5yZXF1ZXN0O1xuICAgICAgICB0b1Rocm93LmNvbmZpZyA9IGVyci5jb25maWc7XG4gICAgICAgIHRocm93IHRvVGhyb3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR2hvc3RDb250ZW50QVBJO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGVudC1hcGkuanMubWFwXG4iLCIvKlxuICogQ29sb3IgbW9kZSB0b2dnbGVcbiAqL1xuXG5jb25zdCB0b2dnbGVDb2xvckJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc20tY29sb3ItbW9kZS1idG4nKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0Q29sb3JNb2RlKCkge1xuICBpZiAod2luZG93LkNTUyAmJiBDU1Muc3VwcG9ydHMoJ2NvbG9yJywgJ3ZhcigtLXByaW1hcnkpJykpIHtcbiAgICBjb25zdCB0b2dnbGVDb2xvck1vZGUgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpZ2h0JykpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnY29sb3ItbW9kZScsICdsaWdodCcpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncHJlZicsICdsaWdodCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb2xvci1tb2RlJywgJ2RhcmsnKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwcmVmJywgJ2RhcmsnKTtcbiAgICB9O1xuICAgIHRvZ2dsZUNvbG9yQnRucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUNvbG9yTW9kZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdG9nZ2xlQ29sb3JCdG5zLmZvckVhY2goKGUpID0+IHtcbiAgICAgIGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9KTtcbiAgfVxufVxuIiwiY29uc3QgRk9DVVNBQkxFX0VMID1cbiAgJ2FbaHJlZl0sIGFyZWFbaHJlZl0sIGlucHV0Om5vdChbZGlzYWJsZWRdKSwgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpZnJhbWUsIG9iamVjdCwgZW1iZWQsIFt0YWJpbmRleD1cIjBcIl0sIFtjb250ZW50ZWRpdGFibGVdJztcblxubGV0IGN1cnJlbnRGb2N1cztcblxuY29uc3QgY2hlY2tEaXNwbGF5U3RhdHVzID0gKGVsKSA9PlxuICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZGlzcGxheSAhPT0gJ25vbmUnO1xuXG5jb25zdCBnZXROb25IaWRkZW5MYXN0RWwgPSAoZWwpID0+IHtcbiAgY29uc3QgbGFzdEVsID0gZWxbZWwubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHBlbnVsdGltYXRlRWwgPSBlbFtlbC5sZW5ndGggLSAyXTtcblxuICBpZiAoY2hlY2tEaXNwbGF5U3RhdHVzKGxhc3RFbCkpIHtcbiAgICByZXR1cm4gbGFzdEVsO1xuICB9XG5cbiAgcmV0dXJuIHBlbnVsdGltYXRlRWw7XG59O1xuXG5jb25zdCBjb25maWd1cmVGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXJFbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoRk9DVVNBQkxFX0VMKTtcbiAgZm9jdXNhYmxlRWwuZm9yRWFjaCgoZWwpID0+IGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpKTtcbiAgY29uc3QgZmlyc3RFbFRvRm9jdXMgPSBmb2N1c2FibGVFbFsxXTtcbiAgY29uc3QgZmlyc3RUYWJTdG9wID0gZm9jdXNhYmxlRWxbMF07XG4gIGNvbnN0IGxhc3RUYWJTdG9wID0gZ2V0Tm9uSGlkZGVuTGFzdEVsKGZvY3VzYWJsZUVsKTtcbiAgcmV0dXJuIFtmaXJzdFRhYlN0b3AsIGxhc3RUYWJTdG9wLCBmaXJzdEVsVG9Gb2N1c107XG59O1xuXG5leHBvcnQgY29uc3QgdHJhcEZvY3VzID0gKHNpZGVNZW51RWwpID0+IHtcbiAgY3VycmVudEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgY29uc3QgZmlyc3RFbFRvRm9jdXMgPSBjb25maWd1cmVGb2N1c2FibGVFbGVtZW50cyhzaWRlTWVudUVsKTtcbiAgZmlyc3RFbFRvRm9jdXNbMl0uZm9jdXMoKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWJLZXlIYW5kbGVyKGUpIHtcbiAgY29uc3QgdGFicyA9IGNvbmZpZ3VyZUZvY3VzYWJsZUVsZW1lbnRzKHRoaXMpO1xuICBjb25zdCBmaXJzdFRhYlN0b3AgPSB0YWJzWzBdO1xuICBjb25zdCBsYXN0VGFiU3RvcCA9IHRhYnNbMV07XG4gIGlmIChlLmtleUNvZGUgPT09IDkpIHtcbiAgICAvLyBTSElGVCArIFRBQlxuICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZmlyc3RUYWJTdG9wKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgbGFzdFRhYlN0b3AuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIFRBQlxuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGFzdFRhYlN0b3ApIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGZpcnN0VGFiU3RvcC5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVsZWFzZUZvY3VzID0gKHNpZGVNZW51RWwpID0+IHtcbiAgY29uc3QgZm9jdXNhYmxlRWwgPSBzaWRlTWVudUVsLnF1ZXJ5U2VsZWN0b3JBbGwoRk9DVVNBQkxFX0VMKTtcbiAgZm9jdXNhYmxlRWwuZm9yRWFjaCgoZWwpID0+IGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKSk7XG4gIHNpZGVNZW51RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRhYktleUhhbmRsZXIpO1xuICBjdXJyZW50Rm9jdXMuZm9jdXMoKTtcbn07XG4iLCJjb25zdCBncmlkQ29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbS1ncmlkLWNvbnRhaW5lcicpO1xuXG5mdW5jdGlvbiB1cGRhdGVOdW1iZXIoZWwsIG51bSwgdHlwZSkge1xuICBpZiAodHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKGBzbS1ncmlkLWNvbnRhaW5lci0ke251bX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZWwuY2xhc3NMaXN0LmFkZChgc20tY2FyZC0ke251bX1gKTtcbn1cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihncmlkQ29udGFpbmVyKSB7XG4gIGNvbnN0IHsgY2hpbGRyZW4gfSA9IGdyaWRDb250YWluZXI7XG4gIGNoaWxkcmVuLmZvckVhY2goKGVsLCBpKSA9PiB1cGRhdGVOdW1iZXIoZWwsIGkgKyAxKSk7XG4gIGNvbnN0IG51bU9mQ2hpbGRyZW4gPSBjaGlsZHJlbi5sZW5ndGg7XG4gIHVwZGF0ZU51bWJlcihncmlkQ29udGFpbmVyLCBudW1PZkNoaWxkcmVuLCAnY29udGFpbmVyJyk7XG4gIHJldHVybiB7IGNoaWxkcmVuLCBudW1PZkNoaWxkcmVuIH07XG59XG5cbmZ1bmN0aW9uIGdyaWRJbml0KCkge1xuICBpZiAoIWdyaWRDb250YWluZXJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGdyaWRDb250YWluZXJzLmZvckVhY2goKGdyaWRDb250YWluZXIpID0+IGNvdW50Q2hpbGRyZW4oZ3JpZENvbnRhaW5lcikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBncmlkSW5pdDtcbiIsImNvbnN0IHsgdHJhcEZvY3VzLCByZWxlYXNlRm9jdXMsIHRhYktleUhhbmRsZXIgfSA9IHJlcXVpcmUoJy4vZm9jdXNUcmFwJyk7XG5cbmNvbnN0IHNlYXJjaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbS1zZWFyY2gtYnRuJyk7XG5jb25zdCBtU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtLW0tc2VhcmNoLWJ0bicpO1xuY29uc3QgbWVudUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbS1tZW51LWJ0bicpO1xuY29uc3QgY2xvc2VCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNtLW1vZGFsX19jbG9zZS1idG4nKTtcblxuaWYgKHR5cGVvZiBTRUFSQ0hfQVBJICE9PSAndW5kZWZpbmVkJykge1xuICBzZWFyY2hCdG4uc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgbVNlYXJjaEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xufVxuXG5jb25zdCBidG5zID0gW3NlYXJjaEJ0biwgbVNlYXJjaEJ0biwgbWVudUJ0bl07XG5cbmNvbnN0IG1vZGFsRm4gPSAoKSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXG4gIGNvbnN0IGNsb3NlID0gKG1vZGFsKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzbS1leHBhbmRlZC1tb2RhbCcpO1xuICAgIG1vZGFsLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgIGNvbnN0IGlucHV0ID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICAgIHJlbGVhc2VGb2N1cyhtb2RhbCk7XG4gIH07XG5cbiAgY29uc3QgY2xvc2VIYW5kbGVyID0gKGUpID0+IHtcbiAgICBjb25zdCBtb2RhbCA9IGUuY3VycmVudFRhcmdldC5jbG9zZXN0KCcuc20tbW9kYWwnKTtcbiAgICBjbG9zZShtb2RhbCk7XG4gIH07XG5cbiAgY29uc3Qgb3BlbkhhbmRsZXIgPSAoZSkgPT4ge1xuICAgIC8vIGlmIChlLmN1cnJlbnRUYXJnZXQuY2xvc2VzdCgnLm1vZGFsJykpIHtcbiAgICAvLyAgIGNsb3NlKGUuY3VycmVudFRhcmdldC5jbG9zZXN0KCcubW9kYWwnKSk7XG4gICAgLy8gfVxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudGFyZ2V0KTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3NtLWV4cGFuZGVkLW1vZGFsJyk7XG4gICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB0cmFwRm9jdXMobW9kYWwpO1xuICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0YWJLZXlIYW5kbGVyKTtcbiAgICBjb25zdCBub25UYXJnZXRDbG9zZUhhbmRsZXIgPSAoZXYpID0+IHtcbiAgICAgIGlmIChldi50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbS1jb250ZW50LXdyYXAnKSkge1xuICAgICAgICBjbG9zZShtb2RhbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBub25UYXJnZXRDbG9zZUhhbmRsZXIpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIGNsb3NlQnlFc2NIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBub25UYXJnZXRDbG9zZUhhbmRsZXIpO1xuICAgIGNvbnN0IGNsb3NlQnlFc2NIYW5kbGVyID0gKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5rZXkgPT09ICdFc2NhcGUnIHx8IGtleS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICBjbG9zZShtb2RhbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBjbG9zZUJ5RXNjSGFuZGxlcik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBub25UYXJnZXRDbG9zZUhhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGNsb3NlQnlFc2NIYW5kbGVyKTtcbiAgfTtcblxuICBidG5zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5IYW5kbGVyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNsb3NlQnRucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICBpZiAoYnRuKSB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUhhbmRsZXIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtb2RhbEZuO1xuIiwiaW1wb3J0ICogYXMgSnNTZWFyY2ggZnJvbSAnanMtc2VhcmNoJztcbmltcG9ydCBHaG9zdENvbnRlbnRBUEkgZnJvbSAnQHRyeWdob3N0L2NvbnRlbnQtYXBpJztcblxuY29uc3Qgc2VhcmNoTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc20tc2VhcmNoLW1vZGFsJyk7XG5cbmNvbnN0IGh0bWxSZXBsYWNlID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG5jb25zdCBjcmVhdGVUaW1lc3RhbXAgPSAobWludXRlcyA9IDYwKSA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCkgKyBtaW51dGVzICogNjAwMDA7XG4gIHJldHVybiB0aW1lc3RhbXA7XG59O1xuXG5jb25zdCBzdGF0ZUxvYWRlciA9IChzdGF0ZSwgc3RhdHVzKSA9PiB7XG4gIGlmIChzdGF0dXMpIHtcbiAgICBzZWFyY2hNb2RhbC5jbGFzc0xpc3QuYWRkKHN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICBzZWFyY2hNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKHN0YXRlKTtcbiAgfVxufTtcblxuY29uc3Qgc2VhcmNoID0gKCkgPT4ge1xuICBjb25zdCBmcmVzaEFwaSA9IG5ldyBHaG9zdENvbnRlbnRBUEkoe1xuICAgIHVybDogYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH1gLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIGtleTogU0VBUkNIX0FQSSxcbiAgICB2ZXJzaW9uOiAndjQnLFxuICB9KTtcblxuICBjb25zdCBhcGkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RpbWVzdGFtcCcpLCAxMCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGlmICghdGltZXN0YW1wIHx8IG5vdyA+IHRpbWVzdGFtcCkge1xuICAgICAgZnJlc2hBcGkucG9zdHNcbiAgICAgICAgLmJyb3dzZSh7XG4gICAgICAgICAgaW5jbHVkZTogJ3RhZ3MnLFxuICAgICAgICAgIGZvcm1hdHM6ICdwbGFpbnRleHQnLFxuICAgICAgICAgIGxpbWl0OiAnYWxsJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncG9zdHMnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RpbWVzdGFtcCcsIGNyZWF0ZVRpbWVzdGFtcCgpKTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcG9zdHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwb3N0cycpKTtcbiAgICAgIHJlc29sdmUocG9zdHMpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNvdWxkbid0IGZldGNoIHBvc3RzXCIpKTtcbiAgICB9XG4gIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYWxlcnRcbiAgICBhbGVydChgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4uXFxuRXJyb3IgRGV0YWlsczogJHtlcnJ9YCk7XG4gIH0pO1xuXG4gIC8vIFBhZ2UgRWxlbWVudHNcbiAgY29uc3Qgc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc20tc2VhcmNoLWlucHV0Jyk7XG4gIGNvbnN0IHJ1blNlYXJjaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbS1ydW4tc2VhcmNoLWJ0bicpO1xuICBjb25zdCBzZWFyY2hSZXN1bHRIZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICcuc20tc2VhcmNoLXJlc3VsdHNfX2hlYWRlcicsXG4gICk7XG4gIGNvbnN0IHNlYXJjaFJlc3VsdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbS1zZWFyY2gtcmVzdWx0c19fY29udGFpbmVyJyk7XG5cbiAgY29uc3QgZGF0ZUZvcm1hdHRlciA9IChpc29EYXRlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgfTtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXNvRGF0ZSk7XG5cbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBzZWFyY2hQb3N0cyA9ICh0ZXJtKSA9PiB7XG4gICAgc3RhdGVMb2FkZXIoJ2xvYWRpbmcnLCB0cnVlKTtcbiAgICBzZWFyY2hSZXN1bHQuaW5uZXJIVE1MID0gJyc7XG4gICAgYXBpLnRoZW4oKHBvc3RzKSA9PiB7XG4gICAgICBjb25zdCBuZXdTZWFyY2ggPSBuZXcgSnNTZWFyY2guU2VhcmNoKCdpZCcpO1xuICAgICAgbmV3U2VhcmNoLmFkZEluZGV4KCd0aXRsZScpO1xuICAgICAgbmV3U2VhcmNoLmFkZEluZGV4KCdwbGFpbnRleHQnKTtcblxuICAgICAgbmV3U2VhcmNoLmFkZERvY3VtZW50cyhwb3N0cyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXdTZWFyY2guc2VhcmNoKHRlcm0pO1xuXG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc2VhcmNoUmVzdWx0SGVhZGVyLnRleHRDb250ZW50ID0gYCR7cmVzdWx0Lmxlbmd0aH0gUmVzdWx0cyBmb3Ig4oCcJHt0ZXJtfeKAnWA7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgc2VhcmNoUmVzdWx0SGVhZGVyLnRleHRDb250ZW50ID0gYCR7cmVzdWx0Lmxlbmd0aH0gUmVzdWx0IGZvciDigJwke3Rlcm194oCdYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlYXJjaFJlc3VsdEhlYWRlci50ZXh0Q29udGVudCA9IGBObyByZXN1bHRzIGZvciDigJwke3Rlcm194oCdYDtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LmZvckVhY2goKHBvc3QpID0+IHtcbiAgICAgICAgc2VhcmNoUmVzdWx0LmlubmVySFRNTCArPSBgPGFydGljbGUgY2xhc3M9XCJzbS1zZWFyY2gtcmVzdWx0c19faXRlbVwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJzbS1zZWFyY2gtcmVzdWx0c19fbGlua1wiIGhyZWY9XCIke3Bvc3QudXJsfVwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInNtLXNlYXJjaC1yZXN1bHRzX19kYXRlXCI+JHtkYXRlRm9ybWF0dGVyKFxuICAgICAgICAgICAgICAgIHBvc3QucHVibGlzaGVkX2F0LFxuICAgICAgICAgICAgICApfTwvcD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzbS1zZWFyY2gtcmVzdWx0c19fdGl0bGVcIj4ke3Bvc3QudGl0bGV9PC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInNtLXNlYXJjaC1yZXN1bHRzX19leGNlcnB0XCI+XG4gICAgICAgICAgICAgICAgJHtodG1sUmVwbGFjZShwb3N0LmV4Y2VycHQpfTwvcD5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2FydGljbGU+YDtcbiAgICAgIH0pO1xuXG4gICAgICBzdGF0ZUxvYWRlcignbG9hZGluZycsIGZhbHNlKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBlbnRlclNlYXJjaFRlcm1DaGVjayA9ICgpID0+IHtcbiAgICBpZiAoIXNlYXJjaFJlc3VsdC5pbm5lckhUTUwpIHtcbiAgICAgIHNlYXJjaFJlc3VsdEhlYWRlci50ZXh0Q29udGVudCA9ICdFbnRlciBhIHNlYXJjaCB0ZXJtJztcbiAgICB9XG4gIH07XG5cbiAgcnVuU2VhcmNoQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChzZWFyY2hJbnB1dC52YWx1ZSA9PT0gJycpIHtcbiAgICAgIGVudGVyU2VhcmNoVGVybUNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlYXJjaFBvc3RzKHNlYXJjaElucHV0LnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0+IHtcbiAgICBpZiAoc2VhcmNoSW5wdXQudmFsdWUgPT09ICcnKSB7XG4gICAgICBlbnRlclNlYXJjaFRlcm1DaGVjaygpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIHNlYXJjaFBvc3RzKHNlYXJjaElucHV0LnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKGUpID0+IHtcbiAgICBzdGF0ZUxvYWRlcignbG9hZGluZycsIGZhbHNlKTtcbiAgICBlLnRhcmdldC52YWx1ZSA9ICcnO1xuICB9KTtcblxuICBzZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICBzdGF0ZUxvYWRlcignbG9hZGluZycsIGZhbHNlKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZWFyY2g7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZW1vdmVOYXZMaW5rcygpIHtcbiAgY29uc3QgbWVudU5hdkxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3NtLW1lbnUgYScpO1xuICBtZW51TmF2TGlua3MuZm9yRWFjaCgoZWwpID0+IGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKSk7XG59XG4iLCIvKipcbiAqIEluZGV4ZXMgZm9yIGFsbCBzdWJzdHJpbmcgc2VhcmNoZXMgKGUuZy4gdGhlIHRlcm0gXCJjYXRcIiBpcyBpbmRleGVkIGFzIFwiY1wiLCBcImNhXCIsIFwiY2F0XCIsIFwiYVwiLCBcImF0XCIsIGFuZCBcInRcIikuXG4gKi9cbnZhciBBbGxTdWJzdHJpbmdzSW5kZXhTdHJhdGVneSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFsbFN1YnN0cmluZ3NJbmRleFN0cmF0ZWd5KCkge31cblxuICB2YXIgX3Byb3RvID0gQWxsU3Vic3RyaW5nc0luZGV4U3RyYXRlZ3kucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY3NcbiAgICovXG4gIF9wcm90by5leHBhbmRUb2tlbiA9IGZ1bmN0aW9uIGV4cGFuZFRva2VuKHRva2VuKSB7XG4gICAgdmFyIGV4cGFuZGVkVG9rZW5zID0gW107XG4gICAgdmFyIHN0cmluZztcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0b2tlbi5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgc3RyaW5nID0gJyc7XG5cbiAgICAgIGZvciAodmFyIGogPSBpOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgc3RyaW5nICs9IHRva2VuLmNoYXJBdChqKTtcbiAgICAgICAgZXhwYW5kZWRUb2tlbnMucHVzaChzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHBhbmRlZFRva2VucztcbiAgfTtcblxuICByZXR1cm4gQWxsU3Vic3RyaW5nc0luZGV4U3RyYXRlZ3k7XG59KCk7XG5cbi8qKlxuICogSW5kZXhlcyBmb3IgZXhhY3Qgd29yZCBtYXRjaGVzLlxuICovXG52YXIgRXhhY3RXb3JkSW5kZXhTdHJhdGVneSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV4YWN0V29yZEluZGV4U3RyYXRlZ3koKSB7fVxuXG4gIHZhciBfcHJvdG8gPSBFeGFjdFdvcmRJbmRleFN0cmF0ZWd5LnByb3RvdHlwZTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NzXG4gICAqL1xuICBfcHJvdG8uZXhwYW5kVG9rZW4gPSBmdW5jdGlvbiBleHBhbmRUb2tlbih0b2tlbikge1xuICAgIHJldHVybiB0b2tlbiA/IFt0b2tlbl0gOiBbXTtcbiAgfTtcblxuICByZXR1cm4gRXhhY3RXb3JkSW5kZXhTdHJhdGVneTtcbn0oKTtcblxuLyoqXG4gKiBJbmRleGVzIGZvciBwcmVmaXggc2VhcmNoZXMgKGUuZy4gdGhlIHRlcm0gXCJjYXRcIiBpcyBpbmRleGVkIGFzIFwiY1wiLCBcImNhXCIsIGFuZCBcImNhdFwiIGFsbG93aW5nIHByZWZpeCBzZWFyY2ggbG9va3VwcykuXG4gKi9cbnZhciBQcmVmaXhJbmRleFN0cmF0ZWd5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUHJlZml4SW5kZXhTdHJhdGVneSgpIHt9XG5cbiAgdmFyIF9wcm90byA9IFByZWZpeEluZGV4U3RyYXRlZ3kucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY3NcbiAgICovXG4gIF9wcm90by5leHBhbmRUb2tlbiA9IGZ1bmN0aW9uIGV4cGFuZFRva2VuKHRva2VuKSB7XG4gICAgdmFyIGV4cGFuZGVkVG9rZW5zID0gW107XG4gICAgdmFyIHN0cmluZyA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRva2VuLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBzdHJpbmcgKz0gdG9rZW4uY2hhckF0KGkpO1xuICAgICAgZXhwYW5kZWRUb2tlbnMucHVzaChzdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBhbmRlZFRva2VucztcbiAgfTtcblxuICByZXR1cm4gUHJlZml4SW5kZXhTdHJhdGVneTtcbn0oKTtcblxuLyoqXG4gKiBFbmZvcmNlcyBjYXNlLXNlbnNpdGl2ZSB0ZXh0IG1hdGNoZXMuXG4gKi9cbnZhciBDYXNlU2Vuc2l0aXZlU2FuaXRpemVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FzZVNlbnNpdGl2ZVNhbml0aXplcigpIHt9XG5cbiAgdmFyIF9wcm90byA9IENhc2VTZW5zaXRpdmVTYW5pdGl6ZXIucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY3NcbiAgICovXG4gIF9wcm90by5zYW5pdGl6ZSA9IGZ1bmN0aW9uIHNhbml0aXplKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dCA/IHRleHQudHJpbSgpIDogJyc7XG4gIH07XG5cbiAgcmV0dXJuIENhc2VTZW5zaXRpdmVTYW5pdGl6ZXI7XG59KCk7XG5cbi8qKlxuICogU2FuaXRpemVzIHRleHQgYnkgY29udmVydGluZyB0byBhIGxvY2FsZS1mcmllbmRseSBsb3dlci1jYXNlIHZlcnNpb24gYW5kIHRyaW1pbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqL1xudmFyIExvd2VyQ2FzZVNhbml0aXplciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExvd2VyQ2FzZVNhbml0aXplcigpIHt9XG5cbiAgdmFyIF9wcm90byA9IExvd2VyQ2FzZVNhbml0aXplci5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jc1xuICAgKi9cbiAgX3Byb3RvLnNhbml0aXplID0gZnVuY3Rpb24gc2FuaXRpemUodGV4dCkge1xuICAgIHJldHVybiB0ZXh0ID8gdGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKSA6ICcnO1xuICB9O1xuXG4gIHJldHVybiBMb3dlckNhc2VTYW5pdGl6ZXI7XG59KCk7XG5cbi8qKlxuICogRmluZCBhbmQgcmV0dXJuIGEgbmVzdGVkIG9iamVjdCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0IHRvIGNyYXdsXG4gKiBAcGFyYW0gcGF0aCBQcm9wZXJ0eSBwYXRoXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5mdW5jdGlvbiBnZXROZXN0ZWRGaWVsZFZhbHVlKG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gcGF0aCB8fCBbXTtcbiAgb2JqZWN0ID0gb2JqZWN0IHx8IHt9O1xuICB2YXIgdmFsdWUgPSBvYmplY3Q7IC8vIHdhbGsgZG93biB0aGUgcHJvcGVydHkgcGF0aFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHZhbHVlID0gdmFsdWVbcGF0aFtpXV07XG5cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFNlYXJjaCBpbmRleCBjYXBhYmxlIG9mIHJldHVybmluZyByZXN1bHRzIG1hdGNoaW5nIGEgc2V0IG9mIHRva2VucyBhbmQgcmFua2VkIGFjY29yZGluZyB0byBURi1JREYuXG4gKi9cbnZhciBUZklkZlNlYXJjaEluZGV4ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGZJZGZTZWFyY2hJbmRleCh1aWRGaWVsZE5hbWUpIHtcbiAgICB0aGlzLl91aWRGaWVsZE5hbWUgPSB1aWRGaWVsZE5hbWU7XG4gICAgdGhpcy5fdG9rZW5Ub0lkZkNhY2hlID0ge307XG4gICAgdGhpcy5fdG9rZW5NYXAgPSB7fTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NzXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFRmSWRmU2VhcmNoSW5kZXgucHJvdG90eXBlO1xuXG4gIF9wcm90by5pbmRleERvY3VtZW50ID0gZnVuY3Rpb24gaW5kZXhEb2N1bWVudCh0b2tlbiwgdWlkLCBkb2MpIHtcbiAgICB0aGlzLl90b2tlblRvSWRmQ2FjaGUgPSB7fTsgLy8gTmV3IGluZGV4IGludmFsaWRhdGVzIHByZXZpb3VzIElERiBjYWNoZXNcblxuICAgIHZhciB0b2tlbk1hcCA9IHRoaXMuX3Rva2VuTWFwO1xuICAgIHZhciB0b2tlbkRhdHVtO1xuXG4gICAgaWYgKHR5cGVvZiB0b2tlbk1hcFt0b2tlbl0gIT09ICdvYmplY3QnKSB7XG4gICAgICB0b2tlbk1hcFt0b2tlbl0gPSB0b2tlbkRhdHVtID0ge1xuICAgICAgICAkbnVtRG9jdW1lbnRPY2N1cnJlbmNlczogMCxcbiAgICAgICAgJHRvdGFsTnVtT2NjdXJyZW5jZXM6IDEsXG4gICAgICAgICR1aWRNYXA6IHt9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbkRhdHVtID0gdG9rZW5NYXBbdG9rZW5dO1xuICAgICAgdG9rZW5EYXR1bS4kdG90YWxOdW1PY2N1cnJlbmNlcysrO1xuICAgIH1cblxuICAgIHZhciB1aWRNYXAgPSB0b2tlbkRhdHVtLiR1aWRNYXA7XG5cbiAgICBpZiAodHlwZW9mIHVpZE1hcFt1aWRdICE9PSAnb2JqZWN0Jykge1xuICAgICAgdG9rZW5EYXR1bS4kbnVtRG9jdW1lbnRPY2N1cnJlbmNlcysrO1xuICAgICAgdWlkTWFwW3VpZF0gPSB7XG4gICAgICAgICRkb2N1bWVudDogZG9jLFxuICAgICAgICAkbnVtVG9rZW5PY2N1cnJlbmNlczogMVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdWlkTWFwW3VpZF0uJG51bVRva2VuT2NjdXJyZW5jZXMrKztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jc1xuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2godG9rZW5zLCBjb3JwdXMpIHtcbiAgICB2YXIgdWlkVG9Eb2N1bWVudE1hcCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG51bVRva2VucyA9IHRva2Vucy5sZW5ndGg7IGkgPCBudW1Ub2tlbnM7IGkrKykge1xuICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgdmFyIHRva2VuTWV0YWRhdGEgPSB0aGlzLl90b2tlbk1hcFt0b2tlbl07IC8vIFNob3J0IGNpcmN1aXQgaWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kIGZvciBhbnkgZ2l2ZW4gdG9rZW4uXG5cbiAgICAgIGlmICghdG9rZW5NZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModG9rZW5NZXRhZGF0YS4kdWlkTWFwKTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMCwgbnVtS2V5cyA9IGtleXMubGVuZ3RoOyBqIDwgbnVtS2V5czsgaisrKSB7XG4gICAgICAgICAgdmFyIHVpZCA9IGtleXNbal07XG4gICAgICAgICAgdWlkVG9Eb2N1bWVudE1hcFt1aWRdID0gdG9rZW5NZXRhZGF0YS4kdWlkTWFwW3VpZF0uJGRvY3VtZW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHVpZFRvRG9jdW1lbnRNYXApO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwLCBudW1LZXlzID0ga2V5cy5sZW5ndGg7IGogPCBudW1LZXlzOyBqKyspIHtcbiAgICAgICAgICB2YXIgdWlkID0ga2V5c1tqXTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW5NZXRhZGF0YS4kdWlkTWFwW3VpZF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBkZWxldGUgdWlkVG9Eb2N1bWVudE1hcFt1aWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkb2N1bWVudHMgPSBbXTtcblxuICAgIGZvciAodmFyIHVpZCBpbiB1aWRUb0RvY3VtZW50TWFwKSB7XG4gICAgICBkb2N1bWVudHMucHVzaCh1aWRUb0RvY3VtZW50TWFwW3VpZF0pO1xuICAgIH1cblxuICAgIHZhciBjYWxjdWxhdGVUZklkZiA9IHRoaXMuX2NyZWF0ZUNhbGN1bGF0ZVRmSWRmKCk7IC8vIFJldHVybiBkb2N1bWVudHMgc29ydGVkIGJ5IFRGLUlERlxuXG5cbiAgICByZXR1cm4gZG9jdW1lbnRzLnNvcnQoZnVuY3Rpb24gKGRvY3VtZW50QSwgZG9jdW1lbnRCKSB7XG4gICAgICByZXR1cm4gY2FsY3VsYXRlVGZJZGYodG9rZW5zLCBkb2N1bWVudEIsIGNvcnB1cykgLSBjYWxjdWxhdGVUZklkZih0b2tlbnMsIGRvY3VtZW50QSwgY29ycHVzKTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uX2NyZWF0ZUNhbGN1bGF0ZUlkZiA9IGZ1bmN0aW9uIF9jcmVhdGVDYWxjdWxhdGVJZGYoKSB7XG4gICAgdmFyIHRva2VuTWFwID0gdGhpcy5fdG9rZW5NYXA7XG4gICAgdmFyIHRva2VuVG9JZGZDYWNoZSA9IHRoaXMuX3Rva2VuVG9JZGZDYWNoZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2FsY3VsYXRlSWRmKHRva2VuLCBkb2N1bWVudHMpIHtcbiAgICAgIGlmICghdG9rZW5Ub0lkZkNhY2hlW3Rva2VuXSkge1xuICAgICAgICB2YXIgbnVtRG9jdW1lbnRzV2l0aFRva2VuID0gdHlwZW9mIHRva2VuTWFwW3Rva2VuXSAhPT0gJ3VuZGVmaW5lZCcgPyB0b2tlbk1hcFt0b2tlbl0uJG51bURvY3VtZW50T2NjdXJyZW5jZXMgOiAwO1xuICAgICAgICB0b2tlblRvSWRmQ2FjaGVbdG9rZW5dID0gMSArIE1hdGgubG9nKGRvY3VtZW50cy5sZW5ndGggLyAoMSArIG51bURvY3VtZW50c1dpdGhUb2tlbikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9rZW5Ub0lkZkNhY2hlW3Rva2VuXTtcbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by5fY3JlYXRlQ2FsY3VsYXRlVGZJZGYgPSBmdW5jdGlvbiBfY3JlYXRlQ2FsY3VsYXRlVGZJZGYoKSB7XG4gICAgdmFyIHRva2VuTWFwID0gdGhpcy5fdG9rZW5NYXA7XG4gICAgdmFyIHVpZEZpZWxkTmFtZSA9IHRoaXMuX3VpZEZpZWxkTmFtZTtcblxuICAgIHZhciBjYWxjdWxhdGVJZGYgPSB0aGlzLl9jcmVhdGVDYWxjdWxhdGVJZGYoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBjYWxjdWxhdGVUZklkZih0b2tlbnMsIGRvY3VtZW50LCBkb2N1bWVudHMpIHtcbiAgICAgIHZhciBzY29yZSA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBudW1Ub2tlbnMgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbnVtVG9rZW5zOyArK2kpIHtcbiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICB2YXIgaW52ZXJzZURvY3VtZW50RnJlcXVlbmN5ID0gY2FsY3VsYXRlSWRmKHRva2VuLCBkb2N1bWVudHMpO1xuXG4gICAgICAgIGlmIChpbnZlcnNlRG9jdW1lbnRGcmVxdWVuY3kgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgaW52ZXJzZURvY3VtZW50RnJlcXVlbmN5ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1aWQ7XG5cbiAgICAgICAgaWYgKHVpZEZpZWxkTmFtZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgdWlkID0gZG9jdW1lbnQgJiYgZ2V0TmVzdGVkRmllbGRWYWx1ZShkb2N1bWVudCwgdWlkRmllbGROYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1aWQgPSBkb2N1bWVudCAmJiBkb2N1bWVudFt1aWRGaWVsZE5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRlcm1GcmVxdWVuY3kgPSB0eXBlb2YgdG9rZW5NYXBbdG9rZW5dICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdG9rZW5NYXBbdG9rZW5dLiR1aWRNYXBbdWlkXSAhPT0gJ3VuZGVmaW5lZCcgPyB0b2tlbk1hcFt0b2tlbl0uJHVpZE1hcFt1aWRdLiRudW1Ub2tlbk9jY3VycmVuY2VzIDogMDtcbiAgICAgICAgc2NvcmUgKz0gdGVybUZyZXF1ZW5jeSAqIGludmVyc2VEb2N1bWVudEZyZXF1ZW5jeTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjb3JlO1xuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIFRmSWRmU2VhcmNoSW5kZXg7XG59KCk7XG5cbi8qKlxuICogU2VhcmNoIGluZGV4IGNhcGFibGUgb2YgcmV0dXJuaW5nIHJlc3VsdHMgbWF0Y2hpbmcgYSBzZXQgb2YgdG9rZW5zIGJ1dCB3aXRob3V0IGFueSBtZWFuaW5nZnVsIHJhbmsgb3Igb3JkZXIuXG4gKi9cbnZhciBVbm9yZGVyZWRTZWFyY2hJbmRleCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVub3JkZXJlZFNlYXJjaEluZGV4KCkge1xuICAgIHRoaXMuX3Rva2VuVG9VaWRUb0RvY3VtZW50TWFwID0ge307XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jc1xuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBVbm9yZGVyZWRTZWFyY2hJbmRleC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmluZGV4RG9jdW1lbnQgPSBmdW5jdGlvbiBpbmRleERvY3VtZW50KHRva2VuLCB1aWQsIGRvYykge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdG9rZW5Ub1VpZFRvRG9jdW1lbnRNYXBbdG9rZW5dICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5fdG9rZW5Ub1VpZFRvRG9jdW1lbnRNYXBbdG9rZW5dID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5fdG9rZW5Ub1VpZFRvRG9jdW1lbnRNYXBbdG9rZW5dW3VpZF0gPSBkb2M7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jc1xuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2godG9rZW5zLCBjb3JwdXMpIHtcbiAgICB2YXIgaW50ZXJzZWN0aW5nRG9jdW1lbnRNYXAgPSB7fTtcbiAgICB2YXIgdG9rZW5Ub1VpZFRvRG9jdW1lbnRNYXAgPSB0aGlzLl90b2tlblRvVWlkVG9Eb2N1bWVudE1hcDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBudW1Ub2tlbnMgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbnVtVG9rZW5zOyBpKyspIHtcbiAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgIHZhciBkb2N1bWVudE1hcCA9IHRva2VuVG9VaWRUb0RvY3VtZW50TWFwW3Rva2VuXTsgLy8gU2hvcnQgY2lyY3VpdCBpZiBubyBtYXRjaGVzIHdlcmUgZm91bmQgZm9yIGFueSBnaXZlbiB0b2tlbi5cblxuICAgICAgaWYgKCFkb2N1bWVudE1hcCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZG9jdW1lbnRNYXApO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwLCBudW1LZXlzID0ga2V5cy5sZW5ndGg7IGogPCBudW1LZXlzOyBqKyspIHtcbiAgICAgICAgICB2YXIgdWlkID0ga2V5c1tqXTtcbiAgICAgICAgICBpbnRlcnNlY3RpbmdEb2N1bWVudE1hcFt1aWRdID0gZG9jdW1lbnRNYXBbdWlkXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhpbnRlcnNlY3RpbmdEb2N1bWVudE1hcCk7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIG51bUtleXMgPSBrZXlzLmxlbmd0aDsgaiA8IG51bUtleXM7IGorKykge1xuICAgICAgICAgIHZhciB1aWQgPSBrZXlzW2pdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudE1hcFt1aWRdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZGVsZXRlIGludGVyc2VjdGluZ0RvY3VtZW50TWFwW3VpZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhpbnRlcnNlY3RpbmdEb2N1bWVudE1hcCk7XG4gICAgdmFyIGRvY3VtZW50cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG51bUtleXMgPSBrZXlzLmxlbmd0aDsgaSA8IG51bUtleXM7IGkrKykge1xuICAgICAgdmFyIHVpZCA9IGtleXNbaV07XG4gICAgICBkb2N1bWVudHMucHVzaChpbnRlcnNlY3RpbmdEb2N1bWVudE1hcFt1aWRdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnRzO1xuICB9O1xuXG4gIHJldHVybiBVbm9yZGVyZWRTZWFyY2hJbmRleDtcbn0oKTtcblxudmFyIFJFR0VYID0gL1teYS160LAt0Y/RkTAtOVxcLSddKy9pO1xuLyoqXG4gKiBTaW1wbGUgdG9rZW5pemVyIHRoYXQgc3BsaXRzIHN0cmluZ3Mgb24gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBub24tZW1wdHkgc3Vic3RyaW5ncy5cbiAqL1xuXG52YXIgU2ltcGxlVG9rZW5pemVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2ltcGxlVG9rZW5pemVyKCkge31cblxuICB2YXIgX3Byb3RvID0gU2ltcGxlVG9rZW5pemVyLnByb3RvdHlwZTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NzXG4gICAqL1xuICBfcHJvdG8udG9rZW5pemUgPSBmdW5jdGlvbiB0b2tlbml6ZSh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQuc3BsaXQoUkVHRVgpLmZpbHRlcihmdW5jdGlvbiAodGV4dCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSAvLyBGaWx0ZXIgZW1wdHkgdG9rZW5zXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlVG9rZW5pemVyO1xufSgpO1xuXG4vKipcbiAqIFN0ZW1taW5nIGlzIHRoZSBwcm9jZXNzIG9mIHJlZHVjaW5nIHNlYXJjaCB0b2tlbnMgdG8gdGhlaXIgcm9vdCAob3Igc3RlbSkgc28gdGhhdCBzZWFyY2hlcyBmb3IgZGlmZmVyZW50IGZvcm1zIG9mIGFcbiAqIHdvcmQgd2lsbCBtYXRjaC4gRm9yIGV4YW1wbGUgXCJzZWFyY2hcIiwgXCJzZWFyY2hpbmdcIiBhbmQgXCJzZWFyY2hlZFwiIGFyZSBhbGwgcmVkdWNlZCB0byB0aGUgc3RlbSBcInNlYXJjaFwiLlxuICpcbiAqIDxwPlRoaXMgc3RlbW1pbmcgdG9rZW5pemVyIGNvbnZlcnRzIHRva2VucyAod29yZHMpIHRvIHRoZWlyIHN0ZW0gZm9ybXMgYmVmb3JlIHJldHVybmluZyB0aGVtLiBJdCByZXF1aXJlcyBhblxuICogZXh0ZXJuYWwgc3RlbW1pbmcgZnVuY3Rpb24gdG8gYmUgcHJvdmlkZWQ7IGZvciB0aGlzIHB1cnBvc2UgSSByZWNvbW1lbmQgdGhlIE5QTSAncG9ydGVyLXN0ZW1tZXInIGxpYnJhcnkuXG4gKlxuICogPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIGh0dHAgOiAvL3RhcnRhcnVzLm9yZy9+bWFydGluL1BvcnRlclN0ZW1tZXIvXG4gKi9cbnZhciBTdGVtbWluZ1Rva2VuaXplciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHN0ZW1taW5nRnVuY3Rpb24gRnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgYSB3b3JkIGFuZCByZXR1cm5pbmcgaXRzIHN0ZW0uXG4gICAqIEBwYXJhbSBkZWNvcmF0ZWRJbmRleFN0cmF0ZWd5IEluZGV4IHN0cmF0ZWd5IHRvIGJlIHJ1biBhZnRlciBhbGwgc3RvcCB3b3JkcyBoYXZlIGJlZW4gcmVtb3ZlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFN0ZW1taW5nVG9rZW5pemVyKHN0ZW1taW5nRnVuY3Rpb24sIGRlY29yYXRlZFRva2VuaXplcikge1xuICAgIHRoaXMuX3N0ZW1taW5nRnVuY3Rpb24gPSBzdGVtbWluZ0Z1bmN0aW9uO1xuICAgIHRoaXMuX3Rva2VuaXplciA9IGRlY29yYXRlZFRva2VuaXplcjtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NzXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFN0ZW1taW5nVG9rZW5pemVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9rZW5pemUgPSBmdW5jdGlvbiB0b2tlbml6ZSh0ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuaXplci50b2tlbml6ZSh0ZXh0KS5tYXAodGhpcy5fc3RlbW1pbmdGdW5jdGlvbik7XG4gIH07XG5cbiAgcmV0dXJuIFN0ZW1taW5nVG9rZW5pemVyO1xufSgpO1xuXG4vKipcbiAqIFN0b3Agd29yZHMgbGlzdCBjb3BpZWQgZnJvbSBMdW5yIEpTLlxuICovXG52YXIgU3RvcFdvcmRzTWFwID0ge1xuICBhOiB0cnVlLFxuICBhYmxlOiB0cnVlLFxuICBhYm91dDogdHJ1ZSxcbiAgYWNyb3NzOiB0cnVlLFxuICBhZnRlcjogdHJ1ZSxcbiAgYWxsOiB0cnVlLFxuICBhbG1vc3Q6IHRydWUsXG4gIGFsc286IHRydWUsXG4gIGFtOiB0cnVlLFxuICBhbW9uZzogdHJ1ZSxcbiAgYW46IHRydWUsXG4gIGFuZDogdHJ1ZSxcbiAgYW55OiB0cnVlLFxuICBhcmU6IHRydWUsXG4gIGFzOiB0cnVlLFxuICBhdDogdHJ1ZSxcbiAgYmU6IHRydWUsXG4gIGJlY2F1c2U6IHRydWUsXG4gIGJlZW46IHRydWUsXG4gIGJ1dDogdHJ1ZSxcbiAgYnk6IHRydWUsXG4gIGNhbjogdHJ1ZSxcbiAgY2Fubm90OiB0cnVlLFxuICBjb3VsZDogdHJ1ZSxcbiAgZGVhcjogdHJ1ZSxcbiAgZGlkOiB0cnVlLFxuICAnZG8nOiB0cnVlLFxuICBkb2VzOiB0cnVlLFxuICBlaXRoZXI6IHRydWUsXG4gICdlbHNlJzogdHJ1ZSxcbiAgZXZlcjogdHJ1ZSxcbiAgZXZlcnk6IHRydWUsXG4gICdmb3InOiB0cnVlLFxuICBmcm9tOiB0cnVlLFxuICAnZ2V0JzogdHJ1ZSxcbiAgZ290OiB0cnVlLFxuICBoYWQ6IHRydWUsXG4gIGhhczogdHJ1ZSxcbiAgaGF2ZTogdHJ1ZSxcbiAgaGU6IHRydWUsXG4gIGhlcjogdHJ1ZSxcbiAgaGVyczogdHJ1ZSxcbiAgaGltOiB0cnVlLFxuICBoaXM6IHRydWUsXG4gIGhvdzogdHJ1ZSxcbiAgaG93ZXZlcjogdHJ1ZSxcbiAgaTogdHJ1ZSxcbiAgJ2lmJzogdHJ1ZSxcbiAgJ2luJzogdHJ1ZSxcbiAgaW50bzogdHJ1ZSxcbiAgaXM6IHRydWUsXG4gIGl0OiB0cnVlLFxuICBpdHM6IHRydWUsXG4gIGp1c3Q6IHRydWUsXG4gIGxlYXN0OiB0cnVlLFxuICBcImxldFwiOiB0cnVlLFxuICBsaWtlOiB0cnVlLFxuICBsaWtlbHk6IHRydWUsXG4gIG1heTogdHJ1ZSxcbiAgbWU6IHRydWUsXG4gIG1pZ2h0OiB0cnVlLFxuICBtb3N0OiB0cnVlLFxuICBtdXN0OiB0cnVlLFxuICBteTogdHJ1ZSxcbiAgbmVpdGhlcjogdHJ1ZSxcbiAgbm86IHRydWUsXG4gIG5vcjogdHJ1ZSxcbiAgbm90OiB0cnVlLFxuICBvZjogdHJ1ZSxcbiAgb2ZmOiB0cnVlLFxuICBvZnRlbjogdHJ1ZSxcbiAgb246IHRydWUsXG4gIG9ubHk6IHRydWUsXG4gIG9yOiB0cnVlLFxuICBvdGhlcjogdHJ1ZSxcbiAgb3VyOiB0cnVlLFxuICBvd246IHRydWUsXG4gIHJhdGhlcjogdHJ1ZSxcbiAgc2FpZDogdHJ1ZSxcbiAgc2F5OiB0cnVlLFxuICBzYXlzOiB0cnVlLFxuICBzaGU6IHRydWUsXG4gIHNob3VsZDogdHJ1ZSxcbiAgc2luY2U6IHRydWUsXG4gIHNvOiB0cnVlLFxuICBzb21lOiB0cnVlLFxuICB0aGFuOiB0cnVlLFxuICB0aGF0OiB0cnVlLFxuICB0aGU6IHRydWUsXG4gIHRoZWlyOiB0cnVlLFxuICB0aGVtOiB0cnVlLFxuICB0aGVuOiB0cnVlLFxuICB0aGVyZTogdHJ1ZSxcbiAgdGhlc2U6IHRydWUsXG4gIHRoZXk6IHRydWUsXG4gICd0aGlzJzogdHJ1ZSxcbiAgdGlzOiB0cnVlLFxuICB0bzogdHJ1ZSxcbiAgdG9vOiB0cnVlLFxuICB0d2FzOiB0cnVlLFxuICB1czogdHJ1ZSxcbiAgd2FudHM6IHRydWUsXG4gIHdhczogdHJ1ZSxcbiAgd2U6IHRydWUsXG4gIHdlcmU6IHRydWUsXG4gIHdoYXQ6IHRydWUsXG4gIHdoZW46IHRydWUsXG4gIHdoZXJlOiB0cnVlLFxuICB3aGljaDogdHJ1ZSxcbiAgJ3doaWxlJzogdHJ1ZSxcbiAgd2hvOiB0cnVlLFxuICB3aG9tOiB0cnVlLFxuICB3aHk6IHRydWUsXG4gIHdpbGw6IHRydWUsXG4gICd3aXRoJzogdHJ1ZSxcbiAgd291bGQ6IHRydWUsXG4gIHlldDogdHJ1ZSxcbiAgeW91OiB0cnVlLFxuICB5b3VyOiB0cnVlXG59OyAvLyBQcmV2ZW50IGZhbHNlIHBvc2l0aXZlcyBmb3IgaW5oZXJpdGVkIHByb3BlcnRpZXNcblxuU3RvcFdvcmRzTWFwLmNvbnN0cnVjdG9yID0gZmFsc2U7XG5TdG9wV29yZHNNYXAuaGFzT3duUHJvcGVydHkgPSBmYWxzZTtcblN0b3BXb3Jkc01hcC5pc1Byb3RvdHlwZU9mID0gZmFsc2U7XG5TdG9wV29yZHNNYXAucHJvcGVydHlJc0VudW1lcmFibGUgPSBmYWxzZTtcblN0b3BXb3Jkc01hcC50b0xvY2FsZVN0cmluZyA9IGZhbHNlO1xuU3RvcFdvcmRzTWFwLnRvU3RyaW5nID0gZmFsc2U7XG5TdG9wV29yZHNNYXAudmFsdWVPZiA9IGZhbHNlO1xuXG4vKipcbiAqIFN0b3Agd29yZHMgYXJlIHZlcnkgY29tbW9uIChlLmcuIFwiYVwiLCBcImFuZFwiLCBcInRoZVwiKSBhbmQgYXJlIG9mdGVuIG5vdCBzZW1hbnRpY2FsbHkgbWVhbmluZ2Z1bCBpbiB0aGUgY29udGV4dCBvZiBhXG4gKiBzZWFyY2guIFRoaXMgdG9rZW5pemVyIHJlbW92ZXMgc3RvcCB3b3JkcyBmcm9tIGEgc2V0IG9mIHRva2VucyBiZWZvcmUgcGFzc2luZyB0aGUgcmVtYWluaW5nIHRva2VucyBhbG9uZyBmb3JcbiAqIGluZGV4aW5nIG9yIHNlYXJjaGluZyBwdXJwb3Nlcy5cbiAqL1xuXG52YXIgU3RvcFdvcmRzVG9rZW5pemVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gZGVjb3JhdGVkSW5kZXhTdHJhdGVneSBJbmRleCBzdHJhdGVneSB0byBiZSBydW4gYWZ0ZXIgYWxsIHN0b3Agd29yZHMgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAqL1xuICBmdW5jdGlvbiBTdG9wV29yZHNUb2tlbml6ZXIoZGVjb3JhdGVkVG9rZW5pemVyKSB7XG4gICAgdGhpcy5fdG9rZW5pemVyID0gZGVjb3JhdGVkVG9rZW5pemVyO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY3NcbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gU3RvcFdvcmRzVG9rZW5pemVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9rZW5pemUgPSBmdW5jdGlvbiB0b2tlbml6ZSh0ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuaXplci50b2tlbml6ZSh0ZXh0KS5maWx0ZXIoZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICByZXR1cm4gIVN0b3BXb3Jkc01hcFt0b2tlbl07XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFN0b3BXb3Jkc1Rva2VuaXplcjtcbn0oKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIFNpbXBsZSBjbGllbnQtc2lkZSBzZWFyY2hpbmcgd2l0aGluIGEgc2V0IG9mIGRvY3VtZW50cy5cbiAqXG4gKiA8cD5Eb2N1bWVudHMgY2FuIGJlIHNlYXJjaGVkIGJ5IGFueSBudW1iZXIgb2YgZmllbGRzLiBJbmRleGluZyBhbmQgc2VhcmNoIHN0cmF0ZWdpZXMgYXJlIGhpZ2hseSBjdXN0b21pemFibGUuXG4gKi9cbnZhciBTZWFyY2ggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQXJyYXkgY29udGFpbmluZyBlaXRoZXIgYSBwcm9wZXJ0eSBuYW1lIG9yIGEgcGF0aCAobGlzdCBvZiBwcm9wZXJ0eSBuYW1lcykgdG8gYSBuZXN0ZWQgdmFsdWVcbiAgICovXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0gdWlkRmllbGROYW1lIEZpZWxkIGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgdW5pcXVlbHkgaWRlbnRpZnkgc2VhcmNoIGRvY3VtZW50czsgdGhpcyBmaWVsZCdzIHZhbHVlcyBhcmUgdXNlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHRvIGVuc3VyZSB0aGF0IGEgc2VhcmNoIHJlc3VsdCBzZXQgZG9lcyBub3QgY29udGFpbiBkdXBsaWNhdGUgb2JqZWN0cy5cbiAgICovXG4gIGZ1bmN0aW9uIFNlYXJjaCh1aWRGaWVsZE5hbWUpIHtcbiAgICBpZiAoIXVpZEZpZWxkTmFtZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2pzLXNlYXJjaCByZXF1aXJlcyBhIHVpZCBmaWVsZCBuYW1lIGNvbnN0cnVjdG9yIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHRoaXMuX3VpZEZpZWxkTmFtZSA9IHVpZEZpZWxkTmFtZTsgLy8gU2V0IGRlZmF1bHQvcmVjb21tZW5kZWQgc3RyYXRlZ2llc1xuXG4gICAgdGhpcy5faW5kZXhTdHJhdGVneSA9IG5ldyBQcmVmaXhJbmRleFN0cmF0ZWd5KCk7XG4gICAgdGhpcy5fc2VhcmNoSW5kZXggPSBuZXcgVGZJZGZTZWFyY2hJbmRleCh1aWRGaWVsZE5hbWUpO1xuICAgIHRoaXMuX3Nhbml0aXplciA9IG5ldyBMb3dlckNhc2VTYW5pdGl6ZXIoKTtcbiAgICB0aGlzLl90b2tlbml6ZXIgPSBuZXcgU2ltcGxlVG9rZW5pemVyKCk7XG4gICAgdGhpcy5fZG9jdW1lbnRzID0gW107XG4gICAgdGhpcy5fc2VhcmNoYWJsZUZpZWxkcyA9IFtdO1xuICB9XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBpbmRleCBzdHJhdGVneS5cbiAgICogQHBhcmFtIHZhbHVlIEN1c3RvbSBpbmRleCBzdHJhdGVneVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGRvY3VtZW50cyBoYXZlIGFscmVhZHkgYmVlbiBpbmRleGVkIGJ5IHRoaXMgc2VhcmNoIGluc3RhbmNlXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFNlYXJjaC5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNlYXJjaGFibGUgZG9jdW1lbnQgdG8gdGhlIGluZGV4LiBEb2N1bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5kZXhlZCBmb3Igc2VhcmNoLlxuICAgKiBAcGFyYW0gZG9jdW1lbnRcbiAgICovXG4gIF9wcm90by5hZGREb2N1bWVudCA9IGZ1bmN0aW9uIGFkZERvY3VtZW50KGRvY3VtZW50KSB7XG4gICAgdGhpcy5hZGREb2N1bWVudHMoW2RvY3VtZW50XSk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgc2VhcmNoYWJsZSBkb2N1bWVudHMgdG8gdGhlIGluZGV4LiBEb2N1bWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluZGV4ZWQgZm9yIHNlYXJjaC5cbiAgICogQHBhcmFtIGRvY3VtZW50XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZERvY3VtZW50cyA9IGZ1bmN0aW9uIGFkZERvY3VtZW50cyhkb2N1bWVudHMpIHtcbiAgICB0aGlzLl9kb2N1bWVudHMgPSB0aGlzLl9kb2N1bWVudHMuY29uY2F0KGRvY3VtZW50cyk7XG4gICAgdGhpcy5pbmRleERvY3VtZW50c18oZG9jdW1lbnRzLCB0aGlzLl9zZWFyY2hhYmxlRmllbGRzKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IHNlYXJjaGFibGUgZmllbGQgdG8gdGhlIGluZGV4LiBFeGlzdGluZyBkb2N1bWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluZGV4ZWQgdXNpbmcgdGhpcyBuZXcgZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZCBTZWFyY2hhYmxlIGZpZWxkIG9yIGZpZWxkIHBhdGguIFBhc3MgYSBzdHJpbmcgdG8gaW5kZXggYSB0b3AtbGV2ZWwgZmllbGQgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MgZm9yIG5lc3RlZCBmaWVsZHMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZEluZGV4ID0gZnVuY3Rpb24gYWRkSW5kZXgoZmllbGQpIHtcbiAgICB0aGlzLl9zZWFyY2hhYmxlRmllbGRzLnB1c2goZmllbGQpO1xuXG4gICAgdGhpcy5pbmRleERvY3VtZW50c18odGhpcy5fZG9jdW1lbnRzLCBbZmllbGRdKTtcbiAgfVxuICAvKipcbiAgICogU2VhcmNoIGFsbCBkb2N1bWVudHMgZm9yIG9uZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBxdWVyeSB0ZXh0LlxuICAgKiBAcGFyYW0gcXVlcnlcbiAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnNlYXJjaCA9IGZ1bmN0aW9uIHNlYXJjaChxdWVyeSkge1xuICAgIHZhciB0b2tlbnMgPSB0aGlzLl90b2tlbml6ZXIudG9rZW5pemUodGhpcy5fc2FuaXRpemVyLnNhbml0aXplKHF1ZXJ5KSk7XG5cbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoSW5kZXguc2VhcmNoKHRva2VucywgdGhpcy5fZG9jdW1lbnRzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIGRvY3VtZW50c1xuICAgKiBAcGFyYW0gX3NlYXJjaGFibGVGaWVsZHMgQXJyYXkgY29udGFpbmluZyBwcm9wZXJ0eSBuYW1lcyBhbmQgcGF0aHMgKGxpc3RzIG9mIHByb3BlcnR5IG5hbWVzKSB0byBuZXN0ZWQgdmFsdWVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluZGV4RG9jdW1lbnRzXyA9IGZ1bmN0aW9uIGluZGV4RG9jdW1lbnRzXyhkb2N1bWVudHMsIF9zZWFyY2hhYmxlRmllbGRzKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHZhciBpbmRleFN0cmF0ZWd5ID0gdGhpcy5faW5kZXhTdHJhdGVneTtcbiAgICB2YXIgc2FuaXRpemVyID0gdGhpcy5fc2FuaXRpemVyO1xuICAgIHZhciBzZWFyY2hJbmRleCA9IHRoaXMuX3NlYXJjaEluZGV4O1xuICAgIHZhciB0b2tlbml6ZXIgPSB0aGlzLl90b2tlbml6ZXI7XG4gICAgdmFyIHVpZEZpZWxkTmFtZSA9IHRoaXMuX3VpZEZpZWxkTmFtZTtcblxuICAgIGZvciAodmFyIGRpID0gMCwgbnVtRG9jdW1lbnRzID0gZG9jdW1lbnRzLmxlbmd0aDsgZGkgPCBudW1Eb2N1bWVudHM7IGRpKyspIHtcbiAgICAgIHZhciBkb2MgPSBkb2N1bWVudHNbZGldO1xuICAgICAgdmFyIHVpZDtcblxuICAgICAgaWYgKHVpZEZpZWxkTmFtZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHVpZCA9IGdldE5lc3RlZEZpZWxkVmFsdWUoZG9jLCB1aWRGaWVsZE5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWlkID0gZG9jW3VpZEZpZWxkTmFtZV07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHNmaSA9IDAsIG51bVNlYXJjaGFibGVGaWVsZHMgPSBfc2VhcmNoYWJsZUZpZWxkcy5sZW5ndGg7IHNmaSA8IG51bVNlYXJjaGFibGVGaWVsZHM7IHNmaSsrKSB7XG4gICAgICAgIHZhciBmaWVsZFZhbHVlO1xuICAgICAgICB2YXIgc2VhcmNoYWJsZUZpZWxkID0gX3NlYXJjaGFibGVGaWVsZHNbc2ZpXTtcblxuICAgICAgICBpZiAoc2VhcmNoYWJsZUZpZWxkIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlID0gZ2V0TmVzdGVkRmllbGRWYWx1ZShkb2MsIHNlYXJjaGFibGVGaWVsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRWYWx1ZSA9IGRvY1tzZWFyY2hhYmxlRmllbGRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgZmllbGRWYWx1ZSAhPT0gJ3N0cmluZycgJiYgZmllbGRWYWx1ZS50b1N0cmluZykge1xuICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFyIGZpZWxkVG9rZW5zID0gdG9rZW5pemVyLnRva2VuaXplKHNhbml0aXplci5zYW5pdGl6ZShmaWVsZFZhbHVlKSk7XG5cbiAgICAgICAgICBmb3IgKHZhciBmdGkgPSAwLCBudW1GaWVsZFZhbHVlcyA9IGZpZWxkVG9rZW5zLmxlbmd0aDsgZnRpIDwgbnVtRmllbGRWYWx1ZXM7IGZ0aSsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGRUb2tlbiA9IGZpZWxkVG9rZW5zW2Z0aV07XG4gICAgICAgICAgICB2YXIgZXhwYW5kZWRUb2tlbnMgPSBpbmRleFN0cmF0ZWd5LmV4cGFuZFRva2VuKGZpZWxkVG9rZW4pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBldGkgPSAwLCBudW1tRXhwYW5kZWRUb2tlbnMgPSBleHBhbmRlZFRva2Vucy5sZW5ndGg7IGV0aSA8IG51bW1FeHBhbmRlZFRva2VuczsgZXRpKyspIHtcbiAgICAgICAgICAgICAgdmFyIGV4cGFuZGVkVG9rZW4gPSBleHBhbmRlZFRva2Vuc1tldGldO1xuICAgICAgICAgICAgICBzZWFyY2hJbmRleC5pbmRleERvY3VtZW50KGV4cGFuZGVkVG9rZW4sIHVpZCwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNlYXJjaCwgW3tcbiAgICBrZXk6IFwiaW5kZXhTdHJhdGVneVwiLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0lJbmRleFN0cmF0ZWd5IGNhbm5vdCBiZSBzZXQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5kZXhTdHJhdGVneSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5kZXhTdHJhdGVneTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGV4dCBzYW5pdGl6aW5nIHN0cmF0ZWd5LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBDdXN0b20gdGV4dCBzYW5pdGl6aW5nIHN0cmF0ZWd5XG4gICAgICogQHRocm93cyBFcnJvciBpZiBkb2N1bWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5kZXhlZCBieSB0aGlzIHNlYXJjaCBpbnN0YW5jZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2FuaXRpemVyXCIsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBFcnJvcignSVNhbml0aXplciBjYW5ub3QgYmUgc2V0IGFmdGVyIGluaXRpYWxpemF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nhbml0aXplciA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2FuaXRpemVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggaW5kZXggc3RyYXRlZ3kuXG4gICAgICogQHBhcmFtIHZhbHVlIEN1c3RvbSBzZWFyY2ggaW5kZXggc3RyYXRlZ3lcbiAgICAgKiBAdGhyb3dzIEVycm9yIGlmIGRvY3VtZW50cyBoYXZlIGFscmVhZHkgYmVlbiBpbmRleGVkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZWFyY2hJbmRleFwiLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0lTZWFyY2hJbmRleCBjYW5ub3QgYmUgc2V0IGFmdGVyIGluaXRpYWxpemF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NlYXJjaEluZGV4ID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hJbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGV4dCB0b2tlbml6aW5nIHN0cmF0ZWd5LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBDdXN0b20gdGV4dCB0b2tlbml6aW5nIHN0cmF0ZWd5XG4gICAgICogQHRocm93cyBFcnJvciBpZiBkb2N1bWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5kZXhlZCBieSB0aGlzIHNlYXJjaCBpbnN0YW5jZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9rZW5pemVyXCIsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBFcnJvcignSVRva2VuaXplciBjYW5ub3QgYmUgc2V0IGFmdGVyIGluaXRpYWxpemF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Rva2VuaXplciA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdG9rZW5pemVyO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTZWFyY2g7XG59KCk7XG5cbi8qKlxuICogVGhpcyB1dGlsaXR5IGhpZ2hsaWdodHMgdGhlIG9jY3VycmVuY2VzIG9mIHRva2VucyB3aXRoaW4gYSBzdHJpbmcgb2YgdGV4dC4gSXQgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB2aXN1YWwgaW5kaWNhdG9yc1xuICogb2YgbWF0Y2ggY3JpdGVyaWEgd2l0aGluIHNlYXJjaGFibGUgZmllbGRzLlxuICpcbiAqIDxwPkZvciBwZXJmb3JtYW5jZSBwdXJwb3NlcyB0aGlzIGhpZ2hsaWdodGVyIG9ubHkgd29ya3Mgd2l0aCBmdWxsLXdvcmQgb3IgcHJlZml4IHRva2VuIGluZGV4ZXMuXG4gKi9cbnZhciBUb2tlbkhpZ2hsaWdodGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0X2luZGV4U3RyYXRlZ3kgSW5kZXggc3RyYXRlZ3kgdXNlZCBieSBTZWFyY2hcbiAgICogQHBhcmFtIG9wdF9zYW5pdGl6ZXIgU2FuaXRpemVyIHVzZWQgYnkgU2VhcmNoXG4gICAqIEBwYXJhbSBvcHRfd3JhcHBlclRhZ05hbWUgT3B0aW9uYWwgd3JhcHBlciB0YWcgbmFtZTsgZGVmYXVsdHMgdG8gJ21hcmsnIChlLmcuIDxtYXJrPilcbiAgICovXG4gIGZ1bmN0aW9uIFRva2VuSGlnaGxpZ2h0ZXIob3B0X2luZGV4U3RyYXRlZ3ksIG9wdF9zYW5pdGl6ZXIsIG9wdF93cmFwcGVyVGFnTmFtZSkge1xuICAgIHRoaXMuX2luZGV4U3RyYXRlZ3kgPSBvcHRfaW5kZXhTdHJhdGVneSB8fCBuZXcgUHJlZml4SW5kZXhTdHJhdGVneSgpO1xuICAgIHRoaXMuX3Nhbml0aXplciA9IG9wdF9zYW5pdGl6ZXIgfHwgbmV3IExvd2VyQ2FzZVNhbml0aXplcigpO1xuICAgIHRoaXMuX3dyYXBwZXJUYWdOYW1lID0gb3B0X3dyYXBwZXJUYWdOYW1lIHx8ICdtYXJrJztcbiAgfVxuICAvKipcbiAgICogSGlnaGxpZ2h0cyB0b2tlbiBvY2N1cnJlbmNlcyB3aXRoaW4gYSBzdHJpbmcgYnkgd3JhcHBpbmcgdGhlbSB3aXRoIGEgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0ZXh0IGUuZy4gXCJqb2huIHdheW5lXCJcbiAgICogQHBhcmFtIHRva2VucyBlLmcuIFtcIndhXCJdXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGUuZy4gXCJqb2huIDxtYXJrPndhPC9tYXJrPnluZVwiXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFRva2VuSGlnaGxpZ2h0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5oaWdobGlnaHQgPSBmdW5jdGlvbiBoaWdobGlnaHQodGV4dCwgdG9rZW5zKSB7XG4gICAgdmFyIHRhZ3NMZW5ndGggPSB0aGlzLl93cmFwVGV4dCgnJykubGVuZ3RoO1xuXG4gICAgdmFyIHRva2VuRGljdGlvbmFyeSA9IE9iamVjdC5jcmVhdGUobnVsbCk7IC8vIENyZWF0ZSBhIHRva2VuIG1hcCBmb3IgZWFzaWVyIGxvb2t1cCBiZWxvdy5cblxuICAgIGZvciAodmFyIGkgPSAwLCBudW1Ub2tlbnMgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbnVtVG9rZW5zOyBpKyspIHtcbiAgICAgIHZhciB0b2tlbiA9IHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZSh0b2tlbnNbaV0pO1xuXG4gICAgICB2YXIgZXhwYW5kZWRUb2tlbnMgPSB0aGlzLl9pbmRleFN0cmF0ZWd5LmV4cGFuZFRva2VuKHRva2VuKTtcblxuICAgICAgZm9yICh2YXIgaiA9IDAsIG51bUV4cGFuZGVkVG9rZW5zID0gZXhwYW5kZWRUb2tlbnMubGVuZ3RoOyBqIDwgbnVtRXhwYW5kZWRUb2tlbnM7IGorKykge1xuICAgICAgICB2YXIgZXhwYW5kZWRUb2tlbiA9IGV4cGFuZGVkVG9rZW5zW2pdO1xuXG4gICAgICAgIGlmICghdG9rZW5EaWN0aW9uYXJ5W2V4cGFuZGVkVG9rZW5dKSB7XG4gICAgICAgICAgdG9rZW5EaWN0aW9uYXJ5W2V4cGFuZGVkVG9rZW5dID0gW3Rva2VuXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbkRpY3Rpb25hcnlbZXhwYW5kZWRUb2tlbl0ucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFRyYWNrIGFjdHVhbEN1cnJlbnRXb3JkIGFuZCBzYW5pdGl6ZWRDdXJyZW50V29yZCBzZXBhcmF0ZWx5IGluIGNhc2Ugd2UgZW5jb3VudGVyIG5lc3RlZCB0YWdzLlxuXG5cbiAgICB2YXIgYWN0dWFsQ3VycmVudFdvcmQgPSAnJztcbiAgICB2YXIgc2FuaXRpemVkQ3VycmVudFdvcmQgPSAnJztcbiAgICB2YXIgY3VycmVudFdvcmRTdGFydEluZGV4ID0gMDsgLy8gTm90ZSB0aGlzIGFzc3VtZXMgZWl0aGVyIHByZWZpeCBvciBmdWxsIHdvcmQgbWF0Y2hpbmcuXG5cbiAgICBmb3IgKHZhciBpID0gMCwgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoOyBpIDwgdGV4dExlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hhcmFjdGVyID0gdGV4dC5jaGFyQXQoaSk7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICcgJykge1xuICAgICAgICBhY3R1YWxDdXJyZW50V29yZCA9ICcnO1xuICAgICAgICBzYW5pdGl6ZWRDdXJyZW50V29yZCA9ICcnO1xuICAgICAgICBjdXJyZW50V29yZFN0YXJ0SW5kZXggPSBpICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbEN1cnJlbnRXb3JkICs9IGNoYXJhY3RlcjtcbiAgICAgICAgc2FuaXRpemVkQ3VycmVudFdvcmQgKz0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKGNoYXJhY3Rlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbkRpY3Rpb25hcnlbc2FuaXRpemVkQ3VycmVudFdvcmRdICYmIHRva2VuRGljdGlvbmFyeVtzYW5pdGl6ZWRDdXJyZW50V29yZF0uaW5kZXhPZihzYW5pdGl6ZWRDdXJyZW50V29yZCkgPj0gMCkge1xuICAgICAgICBhY3R1YWxDdXJyZW50V29yZCA9IHRoaXMuX3dyYXBUZXh0KGFjdHVhbEN1cnJlbnRXb3JkKTtcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGN1cnJlbnRXb3JkU3RhcnRJbmRleCkgKyBhY3R1YWxDdXJyZW50V29yZCArIHRleHQuc3Vic3RyaW5nKGkgKyAxKTtcbiAgICAgICAgaSArPSB0YWdzTGVuZ3RoO1xuICAgICAgICB0ZXh0TGVuZ3RoICs9IHRhZ3NMZW5ndGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB0ZXh0IHRvIHdyYXBcbiAgICogQHJldHVybnMgVGV4dCB3cmFwcGVkIGJ5IHdyYXBwZXIgdGFnIChlLmcuIFwiZm9vXCIgYmVjb21lcyBcIjxtYXJrPmZvbzwvbWFyaz5cIilcbiAgICogQHByaXZhdGVcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX3dyYXBUZXh0ID0gZnVuY3Rpb24gX3dyYXBUZXh0KHRleHQpIHtcbiAgICB2YXIgdGFnTmFtZSA9IHRoaXMuX3dyYXBwZXJUYWdOYW1lO1xuICAgIHJldHVybiBcIjxcIiArIHRhZ05hbWUgKyBcIj5cIiArIHRleHQgKyBcIjwvXCIgKyB0YWdOYW1lICsgXCI+XCI7XG4gIH07XG5cbiAgcmV0dXJuIFRva2VuSGlnaGxpZ2h0ZXI7XG59KCk7XG5cbmV4cG9ydCB7IEFsbFN1YnN0cmluZ3NJbmRleFN0cmF0ZWd5LCBDYXNlU2Vuc2l0aXZlU2FuaXRpemVyLCBFeGFjdFdvcmRJbmRleFN0cmF0ZWd5LCBMb3dlckNhc2VTYW5pdGl6ZXIsIFByZWZpeEluZGV4U3RyYXRlZ3ksIFNlYXJjaCwgU2ltcGxlVG9rZW5pemVyLCBTdGVtbWluZ1Rva2VuaXplciwgU3RvcFdvcmRzTWFwLCBTdG9wV29yZHNUb2tlbml6ZXIsIFRmSWRmU2VhcmNoSW5kZXgsIFRva2VuSGlnaGxpZ2h0ZXIsIFVub3JkZXJlZFNlYXJjaEluZGV4IH07XG4iLCIoZnVuY3Rpb24od2luZG93LCBmYWN0b3J5KSB7XG5cdHZhciBsYXp5U2l6ZXMgPSBmYWN0b3J5KHdpbmRvdywgd2luZG93LmRvY3VtZW50LCBEYXRlKTtcblx0d2luZG93LmxhenlTaXplcyA9IGxhenlTaXplcztcblx0aWYodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyl7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBsYXp5U2l6ZXM7XG5cdH1cbn0odHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyA/XG4gICAgICB3aW5kb3cgOiB7fSwgXG4vKipcbiAqIGltcG9ydChcIi4vdHlwZXMvZ2xvYmFsXCIpXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vdHlwZXMvbGF6eXNpemVzLWNvbmZpZ1wiKS5MYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH0gTGF6eVNpemVzQ29uZmlnUGFydGlhbFxuICovXG5mdW5jdGlvbiBsKHdpbmRvdywgZG9jdW1lbnQsIERhdGUpIHsgLy8gUGFzcyBpbiB0aGUgd2luZG93IERhdGUgZnVuY3Rpb24gYWxzbyBmb3IgU1NSIGJlY2F1c2UgdGhlIERhdGUgY2xhc3MgY2FuIGJlIGxvc3Rcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmpzaGludCBlcW51bGw6dHJ1ZSAqL1xuXG5cdHZhciBsYXp5c2l6ZXMsXG5cdFx0LyoqXG5cdFx0ICogQHR5cGUgeyBMYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH1cblx0XHQgKi9cblx0XHRsYXp5U2l6ZXNDZmc7XG5cblx0KGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHByb3A7XG5cblx0XHR2YXIgbGF6eVNpemVzRGVmYXVsdHMgPSB7XG5cdFx0XHRsYXp5Q2xhc3M6ICdsYXp5bG9hZCcsXG5cdFx0XHRsb2FkZWRDbGFzczogJ2xhenlsb2FkZWQnLFxuXHRcdFx0bG9hZGluZ0NsYXNzOiAnbGF6eWxvYWRpbmcnLFxuXHRcdFx0cHJlbG9hZENsYXNzOiAnbGF6eXByZWxvYWQnLFxuXHRcdFx0ZXJyb3JDbGFzczogJ2xhenllcnJvcicsXG5cdFx0XHQvL3N0cmljdENsYXNzOiAnbGF6eXN0cmljdCcsXG5cdFx0XHRhdXRvc2l6ZXNDbGFzczogJ2xhenlhdXRvc2l6ZXMnLFxuXHRcdFx0ZmFzdExvYWRlZENsYXNzOiAnbHMtaXMtY2FjaGVkJyxcblx0XHRcdGlmcmFtZUxvYWRNb2RlOiAwLFxuXHRcdFx0c3JjQXR0cjogJ2RhdGEtc3JjJyxcblx0XHRcdHNyY3NldEF0dHI6ICdkYXRhLXNyY3NldCcsXG5cdFx0XHRzaXplc0F0dHI6ICdkYXRhLXNpemVzJyxcblx0XHRcdC8vcHJlbG9hZEFmdGVyTG9hZDogZmFsc2UsXG5cdFx0XHRtaW5TaXplOiA0MCxcblx0XHRcdGN1c3RvbU1lZGlhOiB7fSxcblx0XHRcdGluaXQ6IHRydWUsXG5cdFx0XHRleHBGYWN0b3I6IDEuNSxcblx0XHRcdGhGYWM6IDAuOCxcblx0XHRcdGxvYWRNb2RlOiAyLFxuXHRcdFx0bG9hZEhpZGRlbjogdHJ1ZSxcblx0XHRcdHJpY1RpbWVvdXQ6IDAsXG5cdFx0XHR0aHJvdHRsZURlbGF5OiAxMjUsXG5cdFx0fTtcblxuXHRcdGxhenlTaXplc0NmZyA9IHdpbmRvdy5sYXp5U2l6ZXNDb25maWcgfHwgd2luZG93LmxhenlzaXplc0NvbmZpZyB8fCB7fTtcblxuXHRcdGZvcihwcm9wIGluIGxhenlTaXplc0RlZmF1bHRzKXtcblx0XHRcdGlmKCEocHJvcCBpbiBsYXp5U2l6ZXNDZmcpKXtcblx0XHRcdFx0bGF6eVNpemVzQ2ZnW3Byb3BdID0gbGF6eVNpemVzRGVmYXVsdHNbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KSgpO1xuXG5cdGlmICghZG9jdW1lbnQgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aW5pdDogZnVuY3Rpb24gKCkge30sXG5cdFx0XHQvKipcblx0XHRcdCAqIEB0eXBlIHsgTGF6eVNpemVzQ29uZmlnUGFydGlhbCB9XG5cdFx0XHQgKi9cblx0XHRcdGNmZzogbGF6eVNpemVzQ2ZnLFxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAdHlwZSB7IHRydWUgfVxuXHRcdFx0ICovXG5cdFx0XHRub1N1cHBvcnQ6IHRydWUsXG5cdFx0fTtcblx0fVxuXG5cdHZhciBkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdHZhciBzdXBwb3J0UGljdHVyZSA9IHdpbmRvdy5IVE1MUGljdHVyZUVsZW1lbnQ7XG5cblx0dmFyIF9hZGRFdmVudExpc3RlbmVyID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xuXG5cdHZhciBfZ2V0QXR0cmlidXRlID0gJ2dldEF0dHJpYnV0ZSc7XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0byBiaW5kIHRvIHdpbmRvdyBiZWNhdXNlICd0aGlzJyBiZWNvbWVzIG51bGwgZHVyaW5nIFNTUlxuXHQgKiBidWlsZHMuXG5cdCAqL1xuXHR2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IHdpbmRvd1tfYWRkRXZlbnRMaXN0ZW5lcl0uYmluZCh3aW5kb3cpO1xuXG5cdHZhciBzZXRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQ7XG5cblx0dmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2V0VGltZW91dDtcblxuXHR2YXIgcmVxdWVzdElkbGVDYWxsYmFjayA9IHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrO1xuXG5cdHZhciByZWdQaWN0dXJlID0gL15waWN0dXJlJC9pO1xuXG5cdHZhciBsb2FkRXZlbnRzID0gWydsb2FkJywgJ2Vycm9yJywgJ2xhenlpbmNsdWRlZCcsICdfbGF6eWxvYWRlZCddO1xuXG5cdHZhciByZWdDbGFzc0NhY2hlID0ge307XG5cblx0dmFyIGZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDtcblxuXHQvKipcblx0ICogQHBhcmFtIGVsZSB7RWxlbWVudH1cblx0ICogQHBhcmFtIGNscyB7c3RyaW5nfVxuXHQgKi9cblx0dmFyIGhhc0NsYXNzID0gZnVuY3Rpb24oZWxlLCBjbHMpIHtcblx0XHRpZighcmVnQ2xhc3NDYWNoZVtjbHNdKXtcblx0XHRcdHJlZ0NsYXNzQ2FjaGVbY2xzXSA9IG5ldyBSZWdFeHAoJyhcXFxcc3xeKScrY2xzKycoXFxcXHN8JCknKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlZ0NsYXNzQ2FjaGVbY2xzXS50ZXN0KGVsZVtfZ2V0QXR0cmlidXRlXSgnY2xhc3MnKSB8fCAnJykgJiYgcmVnQ2xhc3NDYWNoZVtjbHNdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0gZWxlIHtFbGVtZW50fVxuXHQgKiBAcGFyYW0gY2xzIHtzdHJpbmd9XG5cdCAqL1xuXHR2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbihlbGUsIGNscykge1xuXHRcdGlmICghaGFzQ2xhc3MoZWxlLCBjbHMpKXtcblx0XHRcdGVsZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGVsZVtfZ2V0QXR0cmlidXRlXSgnY2xhc3MnKSB8fCAnJykudHJpbSgpICsgJyAnICsgY2xzKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGUge0VsZW1lbnR9XG5cdCAqIEBwYXJhbSBjbHMge3N0cmluZ31cblx0ICovXG5cdHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGVsZSwgY2xzKSB7XG5cdFx0dmFyIHJlZztcblx0XHRpZiAoKHJlZyA9IGhhc0NsYXNzKGVsZSxjbHMpKSkge1xuXHRcdFx0ZWxlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAoZWxlW19nZXRBdHRyaWJ1dGVdKCdjbGFzcycpIHx8ICcnKS5yZXBsYWNlKHJlZywgJyAnKSk7XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhZGRSZW1vdmVMb2FkRXZlbnRzID0gZnVuY3Rpb24oZG9tLCBmbiwgYWRkKXtcblx0XHR2YXIgYWN0aW9uID0gYWRkID8gX2FkZEV2ZW50TGlzdGVuZXIgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cdFx0aWYoYWRkKXtcblx0XHRcdGFkZFJlbW92ZUxvYWRFdmVudHMoZG9tLCBmbik7XG5cdFx0fVxuXHRcdGxvYWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldnQpe1xuXHRcdFx0ZG9tW2FjdGlvbl0oZXZ0LCBmbik7XG5cdFx0fSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGVtIHsgRWxlbWVudCB9XG5cdCAqIEBwYXJhbSBuYW1lIHsgc3RyaW5nIH1cblx0ICogQHBhcmFtIGRldGFpbCB7IGFueSB9XG5cdCAqIEBwYXJhbSBub0J1YmJsZXMgeyBib29sZWFuIH1cblx0ICogQHBhcmFtIG5vQ2FuY2VsYWJsZSB7IGJvb2xlYW4gfVxuXHQgKiBAcmV0dXJucyB7IEN1c3RvbUV2ZW50IH1cblx0ICovXG5cdHZhciB0cmlnZ2VyRXZlbnQgPSBmdW5jdGlvbihlbGVtLCBuYW1lLCBkZXRhaWwsIG5vQnViYmxlcywgbm9DYW5jZWxhYmxlKXtcblx0XHR2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblxuXHRcdGlmKCFkZXRhaWwpe1xuXHRcdFx0ZGV0YWlsID0ge307XG5cdFx0fVxuXG5cdFx0ZGV0YWlsLmluc3RhbmNlID0gbGF6eXNpemVzO1xuXG5cdFx0ZXZlbnQuaW5pdEV2ZW50KG5hbWUsICFub0J1YmJsZXMsICFub0NhbmNlbGFibGUpO1xuXG5cdFx0ZXZlbnQuZGV0YWlsID0gZGV0YWlsO1xuXG5cdFx0ZWxlbS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH07XG5cblx0dmFyIHVwZGF0ZVBvbHlmaWxsID0gZnVuY3Rpb24gKGVsLCBmdWxsKXtcblx0XHR2YXIgcG9seWZpbGw7XG5cdFx0aWYoICFzdXBwb3J0UGljdHVyZSAmJiAoIHBvbHlmaWxsID0gKHdpbmRvdy5waWN0dXJlZmlsbCB8fCBsYXp5U2l6ZXNDZmcucGYpICkgKXtcblx0XHRcdGlmKGZ1bGwgJiYgZnVsbC5zcmMgJiYgIWVsW19nZXRBdHRyaWJ1dGVdKCdzcmNzZXQnKSl7XG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSgnc3Jjc2V0JywgZnVsbC5zcmMpO1xuXHRcdFx0fVxuXHRcdFx0cG9seWZpbGwoe3JlZXZhbHVhdGU6IHRydWUsIGVsZW1lbnRzOiBbZWxdfSk7XG5cdFx0fSBlbHNlIGlmKGZ1bGwgJiYgZnVsbC5zcmMpe1xuXHRcdFx0ZWwuc3JjID0gZnVsbC5zcmM7XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBnZXRDU1MgPSBmdW5jdGlvbiAoZWxlbSwgc3R5bGUpe1xuXHRcdHJldHVybiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSB8fCB7fSlbc3R5bGVdO1xuXHR9O1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZWxlbSB7IEVsZW1lbnQgfVxuXHQgKiBAcGFyYW0gcGFyZW50IHsgRWxlbWVudCB9XG5cdCAqIEBwYXJhbSBbd2lkdGhdIHtudW1iZXJ9XG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHR2YXIgZ2V0V2lkdGggPSBmdW5jdGlvbihlbGVtLCBwYXJlbnQsIHdpZHRoKXtcblx0XHR3aWR0aCA9IHdpZHRoIHx8IGVsZW0ub2Zmc2V0V2lkdGg7XG5cblx0XHR3aGlsZSh3aWR0aCA8IGxhenlTaXplc0NmZy5taW5TaXplICYmIHBhcmVudCAmJiAhZWxlbS5fbGF6eXNpemVzV2lkdGgpe1xuXHRcdFx0d2lkdGggPSAgcGFyZW50Lm9mZnNldFdpZHRoO1xuXHRcdFx0cGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpZHRoO1xuXHR9O1xuXG5cdHZhciByQUYgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgcnVubmluZywgd2FpdGluZztcblx0XHR2YXIgZmlyc3RGbnMgPSBbXTtcblx0XHR2YXIgc2Vjb25kRm5zID0gW107XG5cdFx0dmFyIGZucyA9IGZpcnN0Rm5zO1xuXG5cdFx0dmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgcnVuRm5zID0gZm5zO1xuXG5cdFx0XHRmbnMgPSBmaXJzdEZucy5sZW5ndGggPyBzZWNvbmRGbnMgOiBmaXJzdEZucztcblxuXHRcdFx0cnVubmluZyA9IHRydWU7XG5cdFx0XHR3YWl0aW5nID0gZmFsc2U7XG5cblx0XHRcdHdoaWxlKHJ1bkZucy5sZW5ndGgpe1xuXHRcdFx0XHRydW5GbnMuc2hpZnQoKSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHZhciByYWZCYXRjaCA9IGZ1bmN0aW9uKGZuLCBxdWV1ZSl7XG5cdFx0XHRpZihydW5uaW5nICYmICFxdWV1ZSl7XG5cdFx0XHRcdGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmbnMucHVzaChmbik7XG5cblx0XHRcdFx0aWYoIXdhaXRpbmcpe1xuXHRcdFx0XHRcdHdhaXRpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdChkb2N1bWVudC5oaWRkZW4gPyBzZXRUaW1lb3V0IDogcmVxdWVzdEFuaW1hdGlvbkZyYW1lKShydW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHJhZkJhdGNoLl9sc0ZsdXNoID0gcnVuO1xuXG5cdFx0cmV0dXJuIHJhZkJhdGNoO1xuXHR9KSgpO1xuXG5cdHZhciByQUZJdCA9IGZ1bmN0aW9uKGZuLCBzaW1wbGUpe1xuXHRcdHJldHVybiBzaW1wbGUgP1xuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJBRihmbik7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHZhciB0aGF0ID0gdGhpcztcblx0XHRcdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0XHRcdHJBRihmdW5jdGlvbigpe1xuXHRcdFx0XHRcdGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHQ7XG5cdH07XG5cblx0dmFyIHRocm90dGxlID0gZnVuY3Rpb24oZm4pe1xuXHRcdHZhciBydW5uaW5nO1xuXHRcdHZhciBsYXN0VGltZSA9IDA7XG5cdFx0dmFyIGdEZWxheSA9IGxhenlTaXplc0NmZy50aHJvdHRsZURlbGF5O1xuXHRcdHZhciBySUNUaW1lb3V0ID0gbGF6eVNpemVzQ2ZnLnJpY1RpbWVvdXQ7XG5cdFx0dmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRydW5uaW5nID0gZmFsc2U7XG5cdFx0XHRsYXN0VGltZSA9IERhdGUubm93KCk7XG5cdFx0XHRmbigpO1xuXHRcdH07XG5cdFx0dmFyIGlkbGVDYWxsYmFjayA9IHJlcXVlc3RJZGxlQ2FsbGJhY2sgJiYgcklDVGltZW91dCA+IDQ5ID9cblx0XHRcdGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHJlcXVlc3RJZGxlQ2FsbGJhY2socnVuLCB7dGltZW91dDogcklDVGltZW91dH0pO1xuXG5cdFx0XHRcdGlmKHJJQ1RpbWVvdXQgIT09IGxhenlTaXplc0NmZy5yaWNUaW1lb3V0KXtcblx0XHRcdFx0XHRySUNUaW1lb3V0ID0gbGF6eVNpemVzQ2ZnLnJpY1RpbWVvdXQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gOlxuXHRcdFx0ckFGSXQoZnVuY3Rpb24oKXtcblx0XHRcdFx0c2V0VGltZW91dChydW4pO1xuXHRcdFx0fSwgdHJ1ZSlcblx0XHQ7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24oaXNQcmlvcml0eSl7XG5cdFx0XHR2YXIgZGVsYXk7XG5cblx0XHRcdGlmKChpc1ByaW9yaXR5ID0gaXNQcmlvcml0eSA9PT0gdHJ1ZSkpe1xuXHRcdFx0XHRySUNUaW1lb3V0ID0gMzM7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHJ1bm5pbmcpe1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHJ1bm5pbmcgPSAgdHJ1ZTtcblxuXHRcdFx0ZGVsYXkgPSBnRGVsYXkgLSAoRGF0ZS5ub3coKSAtIGxhc3RUaW1lKTtcblxuXHRcdFx0aWYoZGVsYXkgPCAwKXtcblx0XHRcdFx0ZGVsYXkgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZihpc1ByaW9yaXR5IHx8IGRlbGF5IDwgOSl7XG5cdFx0XHRcdGlkbGVDYWxsYmFjaygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0VGltZW91dChpZGxlQ2FsbGJhY2ssIGRlbGF5KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdC8vYmFzZWQgb24gaHR0cDovL21vZGVybmphdmFzY3JpcHQuYmxvZ3Nwb3QuZGUvMjAxMy8wOC9idWlsZGluZy1iZXR0ZXItZGVib3VuY2UuaHRtbFxuXHR2YXIgZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jKSB7XG5cdFx0dmFyIHRpbWVvdXQsIHRpbWVzdGFtcDtcblx0XHR2YXIgd2FpdCA9IDk5O1xuXHRcdHZhciBydW4gPSBmdW5jdGlvbigpe1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRmdW5jKCk7XG5cdFx0fTtcblx0XHR2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBsYXN0ID0gRGF0ZS5ub3coKSAtIHRpbWVzdGFtcDtcblxuXHRcdFx0aWYgKGxhc3QgPCB3YWl0KSB7XG5cdFx0XHRcdHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdChyZXF1ZXN0SWRsZUNhbGxiYWNrIHx8IHJ1bikocnVuKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0dGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuXHRcdFx0aWYgKCF0aW1lb3V0KSB7XG5cdFx0XHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdHZhciBsb2FkZXIgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgcHJlbG9hZEVsZW1zLCBpc0NvbXBsZXRlZCwgcmVzZXRQcmVsb2FkaW5nVGltZXIsIGxvYWRNb2RlLCBzdGFydGVkO1xuXG5cdFx0dmFyIGVMdlcsIGVsdkgsIGVMdG9wLCBlTGxlZnQsIGVMcmlnaHQsIGVMYm90dG9tLCBpc0JvZHlIaWRkZW47XG5cblx0XHR2YXIgcmVnSW1nID0gL15pbWckL2k7XG5cdFx0dmFyIHJlZ0lmcmFtZSA9IC9eaWZyYW1lJC9pO1xuXG5cdFx0dmFyIHN1cHBvcnRTY3JvbGwgPSAoJ29uc2Nyb2xsJyBpbiB3aW5kb3cpICYmICEoLyhnbGV8aW5nKWJvdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSk7XG5cblx0XHR2YXIgc2hyaW5rRXhwYW5kID0gMDtcblx0XHR2YXIgY3VycmVudEV4cGFuZCA9IDA7XG5cblx0XHR2YXIgaXNMb2FkaW5nID0gMDtcblx0XHR2YXIgbG93UnVucyA9IC0xO1xuXG5cdFx0dmFyIHJlc2V0UHJlbG9hZGluZyA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0aXNMb2FkaW5nLS07XG5cdFx0XHRpZighZSB8fCBpc0xvYWRpbmcgPCAwIHx8ICFlLnRhcmdldCl7XG5cdFx0XHRcdGlzTG9hZGluZyA9IDA7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBpc1Zpc2libGUgPSBmdW5jdGlvbiAoZWxlbSkge1xuXHRcdFx0aWYgKGlzQm9keUhpZGRlbiA9PSBudWxsKSB7XG5cdFx0XHRcdGlzQm9keUhpZGRlbiA9IGdldENTUyhkb2N1bWVudC5ib2R5LCAndmlzaWJpbGl0eScpID09ICdoaWRkZW4nO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaXNCb2R5SGlkZGVuIHx8ICEoZ2V0Q1NTKGVsZW0ucGFyZW50Tm9kZSwgJ3Zpc2liaWxpdHknKSA9PSAnaGlkZGVuJyAmJiBnZXRDU1MoZWxlbSwgJ3Zpc2liaWxpdHknKSA9PSAnaGlkZGVuJyk7XG5cdFx0fTtcblxuXHRcdHZhciBpc05lc3RlZFZpc2libGUgPSBmdW5jdGlvbihlbGVtLCBlbGVtRXhwYW5kKXtcblx0XHRcdHZhciBvdXRlclJlY3Q7XG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbTtcblx0XHRcdHZhciB2aXNpYmxlID0gaXNWaXNpYmxlKGVsZW0pO1xuXG5cdFx0XHRlTHRvcCAtPSBlbGVtRXhwYW5kO1xuXHRcdFx0ZUxib3R0b20gKz0gZWxlbUV4cGFuZDtcblx0XHRcdGVMbGVmdCAtPSBlbGVtRXhwYW5kO1xuXHRcdFx0ZUxyaWdodCArPSBlbGVtRXhwYW5kO1xuXG5cdFx0XHR3aGlsZSh2aXNpYmxlICYmIChwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50KSAmJiBwYXJlbnQgIT0gZG9jdW1lbnQuYm9keSAmJiBwYXJlbnQgIT0gZG9jRWxlbSl7XG5cdFx0XHRcdHZpc2libGUgPSAoKGdldENTUyhwYXJlbnQsICdvcGFjaXR5JykgfHwgMSkgPiAwKTtcblxuXHRcdFx0XHRpZih2aXNpYmxlICYmIGdldENTUyhwYXJlbnQsICdvdmVyZmxvdycpICE9ICd2aXNpYmxlJyl7XG5cdFx0XHRcdFx0b3V0ZXJSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdHZpc2libGUgPSBlTHJpZ2h0ID4gb3V0ZXJSZWN0LmxlZnQgJiZcblx0XHRcdFx0XHRcdGVMbGVmdCA8IG91dGVyUmVjdC5yaWdodCAmJlxuXHRcdFx0XHRcdFx0ZUxib3R0b20gPiBvdXRlclJlY3QudG9wIC0gMSAmJlxuXHRcdFx0XHRcdFx0ZUx0b3AgPCBvdXRlclJlY3QuYm90dG9tICsgMVxuXHRcdFx0XHRcdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmlzaWJsZTtcblx0XHR9O1xuXG5cdFx0dmFyIGNoZWNrRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBlTGxlbiwgaSwgcmVjdCwgYXV0b0xvYWRFbGVtLCBsb2FkZWRTb21ldGhpbmcsIGVsZW1FeHBhbmQsIGVsZW1OZWdhdGl2ZUV4cGFuZCwgZWxlbUV4cGFuZFZhbCxcblx0XHRcdFx0YmVmb3JlRXhwYW5kVmFsLCBkZWZhdWx0RXhwYW5kLCBwcmVsb2FkRXhwYW5kLCBoRmFjO1xuXHRcdFx0dmFyIGxhenlsb2FkRWxlbXMgPSBsYXp5c2l6ZXMuZWxlbWVudHM7XG5cblx0XHRcdGlmKChsb2FkTW9kZSA9IGxhenlTaXplc0NmZy5sb2FkTW9kZSkgJiYgaXNMb2FkaW5nIDwgOCAmJiAoZUxsZW4gPSBsYXp5bG9hZEVsZW1zLmxlbmd0aCkpe1xuXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRcdGxvd1J1bnMrKztcblxuXHRcdFx0XHRmb3IoOyBpIDwgZUxsZW47IGkrKyl7XG5cblx0XHRcdFx0XHRpZighbGF6eWxvYWRFbGVtc1tpXSB8fCBsYXp5bG9hZEVsZW1zW2ldLl9sYXp5UmFjZSl7Y29udGludWU7fVxuXG5cdFx0XHRcdFx0aWYoIXN1cHBvcnRTY3JvbGwgfHwgKGxhenlzaXplcy5wcmVtYXR1cmVVbnZlaWwgJiYgbGF6eXNpemVzLnByZW1hdHVyZVVudmVpbChsYXp5bG9hZEVsZW1zW2ldKSkpe3VudmVpbEVsZW1lbnQobGF6eWxvYWRFbGVtc1tpXSk7Y29udGludWU7fVxuXG5cdFx0XHRcdFx0aWYoIShlbGVtRXhwYW5kVmFsID0gbGF6eWxvYWRFbGVtc1tpXVtfZ2V0QXR0cmlidXRlXSgnZGF0YS1leHBhbmQnKSkgfHwgIShlbGVtRXhwYW5kID0gZWxlbUV4cGFuZFZhbCAqIDEpKXtcblx0XHRcdFx0XHRcdGVsZW1FeHBhbmQgPSBjdXJyZW50RXhwYW5kO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghZGVmYXVsdEV4cGFuZCkge1xuXHRcdFx0XHRcdFx0ZGVmYXVsdEV4cGFuZCA9ICghbGF6eVNpemVzQ2ZnLmV4cGFuZCB8fCBsYXp5U2l6ZXNDZmcuZXhwYW5kIDwgMSkgP1xuXHRcdFx0XHRcdFx0XHRkb2NFbGVtLmNsaWVudEhlaWdodCA+IDUwMCAmJiBkb2NFbGVtLmNsaWVudFdpZHRoID4gNTAwID8gNTAwIDogMzcwIDpcblx0XHRcdFx0XHRcdFx0bGF6eVNpemVzQ2ZnLmV4cGFuZDtcblxuXHRcdFx0XHRcdFx0bGF6eXNpemVzLl9kZWZFeCA9IGRlZmF1bHRFeHBhbmQ7XG5cblx0XHRcdFx0XHRcdHByZWxvYWRFeHBhbmQgPSBkZWZhdWx0RXhwYW5kICogbGF6eVNpemVzQ2ZnLmV4cEZhY3Rvcjtcblx0XHRcdFx0XHRcdGhGYWMgPSBsYXp5U2l6ZXNDZmcuaEZhYztcblx0XHRcdFx0XHRcdGlzQm9keUhpZGRlbiA9IG51bGw7XG5cblx0XHRcdFx0XHRcdGlmKGN1cnJlbnRFeHBhbmQgPCBwcmVsb2FkRXhwYW5kICYmIGlzTG9hZGluZyA8IDEgJiYgbG93UnVucyA+IDIgJiYgbG9hZE1vZGUgPiAyICYmICFkb2N1bWVudC5oaWRkZW4pe1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50RXhwYW5kID0gcHJlbG9hZEV4cGFuZDtcblx0XHRcdFx0XHRcdFx0bG93UnVucyA9IDA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYobG9hZE1vZGUgPiAxICYmIGxvd1J1bnMgPiAxICYmIGlzTG9hZGluZyA8IDYpe1xuXHRcdFx0XHRcdFx0XHRjdXJyZW50RXhwYW5kID0gZGVmYXVsdEV4cGFuZDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRFeHBhbmQgPSBzaHJpbmtFeHBhbmQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoYmVmb3JlRXhwYW5kVmFsICE9PSBlbGVtRXhwYW5kKXtcblx0XHRcdFx0XHRcdGVMdlcgPSBpbm5lcldpZHRoICsgKGVsZW1FeHBhbmQgKiBoRmFjKTtcblx0XHRcdFx0XHRcdGVsdkggPSBpbm5lckhlaWdodCArIGVsZW1FeHBhbmQ7XG5cdFx0XHRcdFx0XHRlbGVtTmVnYXRpdmVFeHBhbmQgPSBlbGVtRXhwYW5kICogLTE7XG5cdFx0XHRcdFx0XHRiZWZvcmVFeHBhbmRWYWwgPSBlbGVtRXhwYW5kO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJlY3QgPSBsYXp5bG9hZEVsZW1zW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0XHRcdFx0aWYgKChlTGJvdHRvbSA9IHJlY3QuYm90dG9tKSA+PSBlbGVtTmVnYXRpdmVFeHBhbmQgJiZcblx0XHRcdFx0XHRcdChlTHRvcCA9IHJlY3QudG9wKSA8PSBlbHZIICYmXG5cdFx0XHRcdFx0XHQoZUxyaWdodCA9IHJlY3QucmlnaHQpID49IGVsZW1OZWdhdGl2ZUV4cGFuZCAqIGhGYWMgJiZcblx0XHRcdFx0XHRcdChlTGxlZnQgPSByZWN0LmxlZnQpIDw9IGVMdlcgJiZcblx0XHRcdFx0XHRcdChlTGJvdHRvbSB8fCBlTHJpZ2h0IHx8IGVMbGVmdCB8fCBlTHRvcCkgJiZcblx0XHRcdFx0XHRcdChsYXp5U2l6ZXNDZmcubG9hZEhpZGRlbiB8fCBpc1Zpc2libGUobGF6eWxvYWRFbGVtc1tpXSkpICYmXG5cdFx0XHRcdFx0XHQoKGlzQ29tcGxldGVkICYmIGlzTG9hZGluZyA8IDMgJiYgIWVsZW1FeHBhbmRWYWwgJiYgKGxvYWRNb2RlIDwgMyB8fCBsb3dSdW5zIDwgNCkpIHx8IGlzTmVzdGVkVmlzaWJsZShsYXp5bG9hZEVsZW1zW2ldLCBlbGVtRXhwYW5kKSkpe1xuXHRcdFx0XHRcdFx0dW52ZWlsRWxlbWVudChsYXp5bG9hZEVsZW1zW2ldKTtcblx0XHRcdFx0XHRcdGxvYWRlZFNvbWV0aGluZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRpZihpc0xvYWRpbmcgPiA5KXticmVhazt9XG5cdFx0XHRcdFx0fSBlbHNlIGlmKCFsb2FkZWRTb21ldGhpbmcgJiYgaXNDb21wbGV0ZWQgJiYgIWF1dG9Mb2FkRWxlbSAmJlxuXHRcdFx0XHRcdFx0aXNMb2FkaW5nIDwgNCAmJiBsb3dSdW5zIDwgNCAmJiBsb2FkTW9kZSA+IDIgJiZcblx0XHRcdFx0XHRcdChwcmVsb2FkRWxlbXNbMF0gfHwgbGF6eVNpemVzQ2ZnLnByZWxvYWRBZnRlckxvYWQpICYmXG5cdFx0XHRcdFx0XHQocHJlbG9hZEVsZW1zWzBdIHx8ICghZWxlbUV4cGFuZFZhbCAmJiAoKGVMYm90dG9tIHx8IGVMcmlnaHQgfHwgZUxsZWZ0IHx8IGVMdG9wKSB8fCBsYXp5bG9hZEVsZW1zW2ldW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zaXplc0F0dHIpICE9ICdhdXRvJykpKSl7XG5cdFx0XHRcdFx0XHRhdXRvTG9hZEVsZW0gPSBwcmVsb2FkRWxlbXNbMF0gfHwgbGF6eWxvYWRFbGVtc1tpXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihhdXRvTG9hZEVsZW0gJiYgIWxvYWRlZFNvbWV0aGluZyl7XG5cdFx0XHRcdFx0dW52ZWlsRWxlbWVudChhdXRvTG9hZEVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0aHJvdHRsZWRDaGVja0VsZW1lbnRzID0gdGhyb3R0bGUoY2hlY2tFbGVtZW50cyk7XG5cblx0XHR2YXIgc3dpdGNoTG9hZGluZ0NsYXNzID0gZnVuY3Rpb24oZSl7XG5cdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0O1xuXG5cdFx0XHRpZiAoZWxlbS5fbGF6eUNhY2hlKSB7XG5cdFx0XHRcdGRlbGV0ZSBlbGVtLl9sYXp5Q2FjaGU7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzZXRQcmVsb2FkaW5nKGUpO1xuXHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxvYWRlZENsYXNzKTtcblx0XHRcdHJlbW92ZUNsYXNzKGVsZW0sIGxhenlTaXplc0NmZy5sb2FkaW5nQ2xhc3MpO1xuXHRcdFx0YWRkUmVtb3ZlTG9hZEV2ZW50cyhlbGVtLCByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MpO1xuXHRcdFx0dHJpZ2dlckV2ZW50KGVsZW0sICdsYXp5bG9hZGVkJyk7XG5cdFx0fTtcblx0XHR2YXIgcmFmZWRTd2l0Y2hMb2FkaW5nQ2xhc3MgPSByQUZJdChzd2l0Y2hMb2FkaW5nQ2xhc3MpO1xuXHRcdHZhciByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MgPSBmdW5jdGlvbihlKXtcblx0XHRcdHJhZmVkU3dpdGNoTG9hZGluZ0NsYXNzKHt0YXJnZXQ6IGUudGFyZ2V0fSk7XG5cdFx0fTtcblxuXHRcdHZhciBjaGFuZ2VJZnJhbWVTcmMgPSBmdW5jdGlvbihlbGVtLCBzcmMpe1xuXHRcdFx0dmFyIGxvYWRNb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9hZC1tb2RlJykgfHwgbGF6eVNpemVzQ2ZnLmlmcmFtZUxvYWRNb2RlO1xuXG5cdFx0XHQvLyBsb2FkTW9kZSBjYW4gYmUgYWxzbyBhIHN0cmluZyFcblx0XHRcdGlmIChsb2FkTW9kZSA9PSAwKSB7XG5cdFx0XHRcdGVsZW0uY29udGVudFdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHNyYyk7XG5cdFx0XHR9IGVsc2UgaWYgKGxvYWRNb2RlID09IDEpIHtcblx0XHRcdFx0ZWxlbS5zcmMgPSBzcmM7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBoYW5kbGVTb3VyY2VzID0gZnVuY3Rpb24oc291cmNlKXtcblx0XHRcdHZhciBjdXN0b21NZWRpYTtcblxuXHRcdFx0dmFyIHNvdXJjZVNyY3NldCA9IHNvdXJjZVtfZ2V0QXR0cmlidXRlXShsYXp5U2l6ZXNDZmcuc3Jjc2V0QXR0cik7XG5cblx0XHRcdGlmKCAoY3VzdG9tTWVkaWEgPSBsYXp5U2l6ZXNDZmcuY3VzdG9tTWVkaWFbc291cmNlW19nZXRBdHRyaWJ1dGVdKCdkYXRhLW1lZGlhJykgfHwgc291cmNlW19nZXRBdHRyaWJ1dGVdKCdtZWRpYScpXSkgKXtcblx0XHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZSgnbWVkaWEnLCBjdXN0b21NZWRpYSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmKHNvdXJjZVNyY3NldCl7XG5cdFx0XHRcdHNvdXJjZS5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsIHNvdXJjZVNyY3NldCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBsYXp5VW52ZWlsID0gckFGSXQoZnVuY3Rpb24gKGVsZW0sIGRldGFpbCwgaXNBdXRvLCBzaXplcywgaXNJbWcpe1xuXHRcdFx0dmFyIHNyYywgc3Jjc2V0LCBwYXJlbnQsIGlzUGljdHVyZSwgZXZlbnQsIGZpcmVzTG9hZDtcblxuXHRcdFx0aWYoIShldmVudCA9IHRyaWdnZXJFdmVudChlbGVtLCAnbGF6eWJlZm9yZXVudmVpbCcsIGRldGFpbCkpLmRlZmF1bHRQcmV2ZW50ZWQpe1xuXG5cdFx0XHRcdGlmKHNpemVzKXtcblx0XHRcdFx0XHRpZihpc0F1dG8pe1xuXHRcdFx0XHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmF1dG9zaXplc0NsYXNzKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ3NpemVzJywgc2l6ZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNyY3NldCA9IGVsZW1bX2dldEF0dHJpYnV0ZV0obGF6eVNpemVzQ2ZnLnNyY3NldEF0dHIpO1xuXHRcdFx0XHRzcmMgPSBlbGVtW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zcmNBdHRyKTtcblxuXHRcdFx0XHRpZihpc0ltZykge1xuXHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0XHRpc1BpY3R1cmUgPSBwYXJlbnQgJiYgcmVnUGljdHVyZS50ZXN0KHBhcmVudC5ub2RlTmFtZSB8fCAnJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmaXJlc0xvYWQgPSBkZXRhaWwuZmlyZXNMb2FkIHx8ICgoJ3NyYycgaW4gZWxlbSkgJiYgKHNyY3NldCB8fCBzcmMgfHwgaXNQaWN0dXJlKSk7XG5cblx0XHRcdFx0ZXZlbnQgPSB7dGFyZ2V0OiBlbGVtfTtcblxuXHRcdFx0XHRhZGRDbGFzcyhlbGVtLCBsYXp5U2l6ZXNDZmcubG9hZGluZ0NsYXNzKTtcblxuXHRcdFx0XHRpZihmaXJlc0xvYWQpe1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dChyZXNldFByZWxvYWRpbmdUaW1lcik7XG5cdFx0XHRcdFx0cmVzZXRQcmVsb2FkaW5nVGltZXIgPSBzZXRUaW1lb3V0KHJlc2V0UHJlbG9hZGluZywgMjUwMCk7XG5cdFx0XHRcdFx0YWRkUmVtb3ZlTG9hZEV2ZW50cyhlbGVtLCByYWZTd2l0Y2hMb2FkaW5nQ2xhc3MsIHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYoaXNQaWN0dXJlKXtcblx0XHRcdFx0XHRmb3JFYWNoLmNhbGwocGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzb3VyY2UnKSwgaGFuZGxlU291cmNlcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihzcmNzZXQpe1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBzcmNzZXQpO1xuXHRcdFx0XHR9IGVsc2UgaWYoc3JjICYmICFpc1BpY3R1cmUpe1xuXHRcdFx0XHRcdGlmKHJlZ0lmcmFtZS50ZXN0KGVsZW0ubm9kZU5hbWUpKXtcblx0XHRcdFx0XHRcdGNoYW5nZUlmcmFtZVNyYyhlbGVtLCBzcmMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNyYyA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZihpc0ltZyAmJiAoc3Jjc2V0IHx8IGlzUGljdHVyZSkpe1xuXHRcdFx0XHRcdHVwZGF0ZVBvbHlmaWxsKGVsZW0sIHtzcmM6IHNyY30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmKGVsZW0uX2xhenlSYWNlKXtcblx0XHRcdFx0ZGVsZXRlIGVsZW0uX2xhenlSYWNlO1xuXHRcdFx0fVxuXHRcdFx0cmVtb3ZlQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxhenlDbGFzcyk7XG5cblx0XHRcdHJBRihmdW5jdGlvbigpe1xuXHRcdFx0XHQvLyBQYXJ0IG9mIHRoaXMgY2FuIGJlIHJlbW92ZWQgYXMgc29vbiBhcyB0aGlzIGZpeCBpcyBvbGRlcjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzczMSAoMjAxNSlcblx0XHRcdFx0dmFyIGlzTG9hZGVkID0gZWxlbS5jb21wbGV0ZSAmJiBlbGVtLm5hdHVyYWxXaWR0aCA+IDE7XG5cblx0XHRcdFx0aWYoICFmaXJlc0xvYWQgfHwgaXNMb2FkZWQpe1xuXHRcdFx0XHRcdGlmIChpc0xvYWRlZCkge1xuXHRcdFx0XHRcdFx0YWRkQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmZhc3RMb2FkZWRDbGFzcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN3aXRjaExvYWRpbmdDbGFzcyhldmVudCk7XG5cdFx0XHRcdFx0ZWxlbS5fbGF6eUNhY2hlID0gdHJ1ZTtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHRpZiAoJ19sYXp5Q2FjaGUnIGluIGVsZW0pIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGVsZW0uX2xhenlDYWNoZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LCA5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZWxlbS5sb2FkaW5nID09ICdsYXp5Jykge1xuXHRcdFx0XHRcdGlzTG9hZGluZy0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIGVsZW0geyBFbGVtZW50IH1cblx0XHQgKi9cblx0XHR2YXIgdW52ZWlsRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtKXtcblx0XHRcdGlmIChlbGVtLl9sYXp5UmFjZSkge3JldHVybjt9XG5cdFx0XHR2YXIgZGV0YWlsO1xuXG5cdFx0XHR2YXIgaXNJbWcgPSByZWdJbWcudGVzdChlbGVtLm5vZGVOYW1lKTtcblxuXHRcdFx0Ly9hbGxvdyB1c2luZyBzaXplcz1cImF1dG9cIiwgYnV0IGRvbid0IHVzZS4gaXQncyBpbnZhbGlkLiBVc2UgZGF0YS1zaXplcz1cImF1dG9cIiBvciBhIHZhbGlkIHZhbHVlIGZvciBzaXplcyBpbnN0ZWFkIChpLmUuOiBzaXplcz1cIjgwdndcIilcblx0XHRcdHZhciBzaXplcyA9IGlzSW1nICYmIChlbGVtW19nZXRBdHRyaWJ1dGVdKGxhenlTaXplc0NmZy5zaXplc0F0dHIpIHx8IGVsZW1bX2dldEF0dHJpYnV0ZV0oJ3NpemVzJykpO1xuXHRcdFx0dmFyIGlzQXV0byA9IHNpemVzID09ICdhdXRvJztcblxuXHRcdFx0aWYoIChpc0F1dG8gfHwgIWlzQ29tcGxldGVkKSAmJiBpc0ltZyAmJiAoZWxlbVtfZ2V0QXR0cmlidXRlXSgnc3JjJykgfHwgZWxlbS5zcmNzZXQpICYmICFlbGVtLmNvbXBsZXRlICYmICFoYXNDbGFzcyhlbGVtLCBsYXp5U2l6ZXNDZmcuZXJyb3JDbGFzcykgJiYgaGFzQ2xhc3MoZWxlbSwgbGF6eVNpemVzQ2ZnLmxhenlDbGFzcykpe3JldHVybjt9XG5cblx0XHRcdGRldGFpbCA9IHRyaWdnZXJFdmVudChlbGVtLCAnbGF6eXVudmVpbHJlYWQnKS5kZXRhaWw7XG5cblx0XHRcdGlmKGlzQXV0byl7XG5cdFx0XHRcdCBhdXRvU2l6ZXIudXBkYXRlRWxlbShlbGVtLCB0cnVlLCBlbGVtLm9mZnNldFdpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5fbGF6eVJhY2UgPSB0cnVlO1xuXHRcdFx0aXNMb2FkaW5nKys7XG5cblx0XHRcdGxhenlVbnZlaWwoZWxlbSwgZGV0YWlsLCBpc0F1dG8sIHNpemVzLCBpc0ltZyk7XG5cdFx0fTtcblxuXHRcdHZhciBhZnRlclNjcm9sbCA9IGRlYm91bmNlKGZ1bmN0aW9uKCl7XG5cdFx0XHRsYXp5U2l6ZXNDZmcubG9hZE1vZGUgPSAzO1xuXHRcdFx0dGhyb3R0bGVkQ2hlY2tFbGVtZW50cygpO1xuXHRcdH0pO1xuXG5cdFx0dmFyIGFsdExvYWRtb2RlU2Nyb2xsTGlzdG5lciA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRpZihsYXp5U2l6ZXNDZmcubG9hZE1vZGUgPT0gMyl7XG5cdFx0XHRcdGxhenlTaXplc0NmZy5sb2FkTW9kZSA9IDI7XG5cdFx0XHR9XG5cdFx0XHRhZnRlclNjcm9sbCgpO1xuXHRcdH07XG5cblx0XHR2YXIgb25sb2FkID0gZnVuY3Rpb24oKXtcblx0XHRcdGlmKGlzQ29tcGxldGVkKXtyZXR1cm47fVxuXHRcdFx0aWYoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPCA5OTkpe1xuXHRcdFx0XHRzZXRUaW1lb3V0KG9ubG9hZCwgOTk5KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cblx0XHRcdGlzQ29tcGxldGVkID0gdHJ1ZTtcblxuXHRcdFx0bGF6eVNpemVzQ2ZnLmxvYWRNb2RlID0gMztcblxuXHRcdFx0dGhyb3R0bGVkQ2hlY2tFbGVtZW50cygpO1xuXG5cdFx0XHRhZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBhbHRMb2FkbW9kZVNjcm9sbExpc3RuZXIsIHRydWUpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XzogZnVuY3Rpb24oKXtcblx0XHRcdFx0c3RhcnRlZCA9IERhdGUubm93KCk7XG5cblx0XHRcdFx0bGF6eXNpemVzLmVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsYXp5U2l6ZXNDZmcubGF6eUNsYXNzKTtcblx0XHRcdFx0cHJlbG9hZEVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsYXp5U2l6ZXNDZmcubGF6eUNsYXNzICsgJyAnICsgbGF6eVNpemVzQ2ZnLnByZWxvYWRDbGFzcyk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cywgdHJ1ZSk7XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcigncGFnZXNob3cnLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdGlmIChlLnBlcnNpc3RlZCkge1xuXHRcdFx0XHRcdFx0dmFyIGxvYWRpbmdFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgbGF6eVNpemVzQ2ZnLmxvYWRpbmdDbGFzcyk7XG5cblx0XHRcdFx0XHRcdGlmIChsb2FkaW5nRWxlbWVudHMubGVuZ3RoICYmIGxvYWRpbmdFbGVtZW50cy5mb3JFYWNoKSB7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0bG9hZGluZ0VsZW1lbnRzLmZvckVhY2goIGZ1bmN0aW9uIChpbWcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChpbWcuY29tcGxldGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW52ZWlsRWxlbWVudChpbWcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKXtcblx0XHRcdFx0XHRuZXcgTXV0YXRpb25PYnNlcnZlciggdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyApLm9ic2VydmUoIGRvY0VsZW0sIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWV9ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZG9jRWxlbVtfYWRkRXZlbnRMaXN0ZW5lcl0oJ0RPTU5vZGVJbnNlcnRlZCcsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdFx0XHRcdGRvY0VsZW1bX2FkZEV2ZW50TGlzdGVuZXJdKCdET01BdHRyTW9kaWZpZWQnLCB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCB0cnVlKTtcblx0XHRcdFx0XHRzZXRJbnRlcnZhbCh0aHJvdHRsZWRDaGVja0VsZW1lbnRzLCA5OTkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXG5cdFx0XHRcdC8vLCAnZnVsbHNjcmVlbmNoYW5nZSdcblx0XHRcdFx0Wydmb2N1cycsICdtb3VzZW92ZXInLCAnY2xpY2snLCAnbG9hZCcsICd0cmFuc2l0aW9uZW5kJywgJ2FuaW1hdGlvbmVuZCddLmZvckVhY2goZnVuY3Rpb24obmFtZSl7XG5cdFx0XHRcdFx0ZG9jdW1lbnRbX2FkZEV2ZW50TGlzdGVuZXJdKG5hbWUsIHRocm90dGxlZENoZWNrRWxlbWVudHMsIHRydWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZigoL2QkfF5jLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGUpKSl7XG5cdFx0XHRcdFx0b25sb2FkKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9ubG9hZCk7XG5cdFx0XHRcdFx0ZG9jdW1lbnRbX2FkZEV2ZW50TGlzdGVuZXJdKCdET01Db250ZW50TG9hZGVkJywgdGhyb3R0bGVkQ2hlY2tFbGVtZW50cyk7XG5cdFx0XHRcdFx0c2V0VGltZW91dChvbmxvYWQsIDIwMDAwKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmKGxhenlzaXplcy5lbGVtZW50cy5sZW5ndGgpe1xuXHRcdFx0XHRcdGNoZWNrRWxlbWVudHMoKTtcblx0XHRcdFx0XHRyQUYuX2xzRmx1c2goKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdHRsZWRDaGVja0VsZW1lbnRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRjaGVja0VsZW1zOiB0aHJvdHRsZWRDaGVja0VsZW1lbnRzLFxuXHRcdFx0dW52ZWlsOiB1bnZlaWxFbGVtZW50LFxuXHRcdFx0X2FMU0w6IGFsdExvYWRtb2RlU2Nyb2xsTGlzdG5lcixcblx0XHR9O1xuXHR9KSgpO1xuXG5cblx0dmFyIGF1dG9TaXplciA9IChmdW5jdGlvbigpe1xuXHRcdHZhciBhdXRvc2l6ZXNFbGVtcztcblxuXHRcdHZhciBzaXplRWxlbWVudCA9IHJBRkl0KGZ1bmN0aW9uKGVsZW0sIHBhcmVudCwgZXZlbnQsIHdpZHRoKXtcblx0XHRcdHZhciBzb3VyY2VzLCBpLCBsZW47XG5cdFx0XHRlbGVtLl9sYXp5c2l6ZXNXaWR0aCA9IHdpZHRoO1xuXHRcdFx0d2lkdGggKz0gJ3B4JztcblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoJ3NpemVzJywgd2lkdGgpO1xuXG5cdFx0XHRpZihyZWdQaWN0dXJlLnRlc3QocGFyZW50Lm5vZGVOYW1lIHx8ICcnKSl7XG5cdFx0XHRcdHNvdXJjZXMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NvdXJjZScpO1xuXHRcdFx0XHRmb3IoaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspe1xuXHRcdFx0XHRcdHNvdXJjZXNbaV0uc2V0QXR0cmlidXRlKCdzaXplcycsIHdpZHRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZighZXZlbnQuZGV0YWlsLmRhdGFBdHRyKXtcblx0XHRcdFx0dXBkYXRlUG9seWZpbGwoZWxlbSwgZXZlbnQuZGV0YWlsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvKipcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBlbGVtIHtFbGVtZW50fVxuXHRcdCAqIEBwYXJhbSBkYXRhQXR0clxuXHRcdCAqIEBwYXJhbSBbd2lkdGhdIHsgbnVtYmVyIH1cblx0XHQgKi9cblx0XHR2YXIgZ2V0U2l6ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbSwgZGF0YUF0dHIsIHdpZHRoKXtcblx0XHRcdHZhciBldmVudDtcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmKHBhcmVudCl7XG5cdFx0XHRcdHdpZHRoID0gZ2V0V2lkdGgoZWxlbSwgcGFyZW50LCB3aWR0aCk7XG5cdFx0XHRcdGV2ZW50ID0gdHJpZ2dlckV2ZW50KGVsZW0sICdsYXp5YmVmb3Jlc2l6ZXMnLCB7d2lkdGg6IHdpZHRoLCBkYXRhQXR0cjogISFkYXRhQXR0cn0pO1xuXG5cdFx0XHRcdGlmKCFldmVudC5kZWZhdWx0UHJldmVudGVkKXtcblx0XHRcdFx0XHR3aWR0aCA9IGV2ZW50LmRldGFpbC53aWR0aDtcblxuXHRcdFx0XHRcdGlmKHdpZHRoICYmIHdpZHRoICE9PSBlbGVtLl9sYXp5c2l6ZXNXaWR0aCl7XG5cdFx0XHRcdFx0XHRzaXplRWxlbWVudChlbGVtLCBwYXJlbnQsIGV2ZW50LCB3aWR0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB1cGRhdGVFbGVtZW50c1NpemVzID0gZnVuY3Rpb24oKXtcblx0XHRcdHZhciBpO1xuXHRcdFx0dmFyIGxlbiA9IGF1dG9zaXplc0VsZW1zLmxlbmd0aDtcblx0XHRcdGlmKGxlbil7XG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRcdGZvcig7IGkgPCBsZW47IGkrKyl7XG5cdFx0XHRcdFx0Z2V0U2l6ZUVsZW1lbnQoYXV0b3NpemVzRWxlbXNbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBkZWJvdW5jZWRVcGRhdGVFbGVtZW50c1NpemVzID0gZGVib3VuY2UodXBkYXRlRWxlbWVudHNTaXplcyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0XzogZnVuY3Rpb24oKXtcblx0XHRcdFx0YXV0b3NpemVzRWxlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGxhenlTaXplc0NmZy5hdXRvc2l6ZXNDbGFzcyk7XG5cdFx0XHRcdGFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlZFVwZGF0ZUVsZW1lbnRzU2l6ZXMpO1xuXHRcdFx0fSxcblx0XHRcdGNoZWNrRWxlbXM6IGRlYm91bmNlZFVwZGF0ZUVsZW1lbnRzU2l6ZXMsXG5cdFx0XHR1cGRhdGVFbGVtOiBnZXRTaXplRWxlbWVudFxuXHRcdH07XG5cdH0pKCk7XG5cblx0dmFyIGluaXQgPSBmdW5jdGlvbigpe1xuXHRcdGlmKCFpbml0LmkgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSl7XG5cdFx0XHRpbml0LmkgPSB0cnVlO1xuXHRcdFx0YXV0b1NpemVyLl8oKTtcblx0XHRcdGxvYWRlci5fKCk7XG5cdFx0fVxuXHR9O1xuXG5cdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblx0XHRpZihsYXp5U2l6ZXNDZmcuaW5pdCl7XG5cdFx0XHRpbml0KCk7XG5cdFx0fVxuXHR9KTtcblxuXHRsYXp5c2l6ZXMgPSB7XG5cdFx0LyoqXG5cdFx0ICogQHR5cGUgeyBMYXp5U2l6ZXNDb25maWdQYXJ0aWFsIH1cblx0XHQgKi9cblx0XHRjZmc6IGxhenlTaXplc0NmZyxcblx0XHRhdXRvU2l6ZXI6IGF1dG9TaXplcixcblx0XHRsb2FkZXI6IGxvYWRlcixcblx0XHRpbml0OiBpbml0LFxuXHRcdHVQOiB1cGRhdGVQb2x5ZmlsbCxcblx0XHRhQzogYWRkQ2xhc3MsXG5cdFx0ckM6IHJlbW92ZUNsYXNzLFxuXHRcdGhDOiBoYXNDbGFzcyxcblx0XHRmaXJlOiB0cmlnZ2VyRXZlbnQsXG5cdFx0Z1c6IGdldFdpZHRoLFxuXHRcdHJBRjogckFGLFxuXHR9O1xuXG5cdHJldHVybiBsYXp5c2l6ZXM7XG59XG4pKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH0iLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAnLi4vLi4vc2Nzcy9zdHlsZS5zY3NzJztcbmltcG9ydCBzZXRUYWJJbmRleCBmcm9tICcuL3NldFRhYkluZGV4JztcbmltcG9ydCBjb2xvck1vZGUgZnJvbSAnLi9jb2xvck1vZGVUb2dnbGUnO1xuaW1wb3J0IGdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBtb2RhbEZuIGZyb20gJy4vbW9kYWwnO1xuaW1wb3J0IHNlYXJjaCBmcm9tICcuL3NlYXJjaCc7XG5pbXBvcnQgJ2xhenlzaXplcyc7XG5cbnNldFRhYkluZGV4KCk7XG5ncmlkKCk7XG5jb2xvck1vZGUoKTtcbm1vZGFsRm4oKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5pZiAodHlwZW9mIFNFQVJDSF9BUEkgIT09ICd1bmRlZmluZWQnKSB7XG4gIHNlYXJjaCgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +!function(){var t={545:function(t,e,n){"use strict";n.r(e),n.d(e,{trapFocus:function(){return a},tabKeyHandler:function(){return c},releaseFocus:function(){return s}});var r,o='a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]',i=function(t){var e=t.querySelectorAll(o);e.forEach((function(t){return t.setAttribute("tabindex","0")}));var n,r,i,a=e[1];return[e[0],(n=e,r=n[n.length-1],i=n[n.length-2],function(t){return"none"!==window.getComputedStyle(t).display}(r)?r:i),a]},a=function(t){r=document.activeElement,i(t)[2].focus()};function c(t){var e=i(this),n=e[0],r=e[1];9===t.keyCode&&(t.shiftKey?document.activeElement===n&&(t.preventDefault(),r.focus()):document.activeElement===r&&(t.preventDefault(),n.focus()))}var s=function(t){t.querySelectorAll(o).forEach((function(t){return t.setAttribute("tabindex","-1")})),t.removeEventListener("keydown",c),r.focus()}},90:function(t){!function(e,n){var r=function(t,e,n){"use strict";var r,o;if(function(){var e,n={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",fastLoadedClass:"ls-is-cached",iframeLoadMode:0,srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:!0,ricTimeout:0,throttleDelay:125};for(e in o=t.lazySizesConfig||t.lazysizesConfig||{},n)e in o||(o[e]=n[e])}(),!e||!e.getElementsByClassName)return{init:function(){},cfg:o,noSupport:!0};var i,a,c,s,u,f,l,d,h,p,m,v,g,y,b,w,E,S,C,A,j,x,O,_,T,L,z,k,P,M,I,N,R,D,B,q,F,U,H,W,$,V,G,K,J=e.documentElement,X=t.HTMLPictureElement,Y="addEventListener",Q=t.addEventListener.bind(t),Z=t.setTimeout,tt=t.requestAnimationFrame||Z,et=t.requestIdleCallback,nt=/^picture$/i,rt=["load","error","lazyincluded","_lazyloaded"],ot={},it=Array.prototype.forEach,at=function(t,e){return ot[e]||(ot[e]=new RegExp("(\\s|^)"+e+"(\\s|$)")),ot[e].test(t.getAttribute("class")||"")&&ot[e]},ct=function(t,e){at(t,e)||t.setAttribute("class",(t.getAttribute("class")||"").trim()+" "+e)},st=function(t,e){var n;(n=at(t,e))&&t.setAttribute("class",(t.getAttribute("class")||"").replace(n," "))},ut=function(t,e,n){var r=n?Y:"removeEventListener";n&&ut(t,e),rt.forEach((function(n){t[r](n,e)}))},ft=function(t,n,o,i,a){var c=e.createEvent("Event");return o||(o={}),o.instance=r,c.initEvent(n,!i,!a),c.detail=o,t.dispatchEvent(c),c},lt=function(e,n){var r;!X&&(r=t.picturefill||o.pf)?(n&&n.src&&!e.getAttribute("srcset")&&e.setAttribute("srcset",n.src),r({reevaluate:!0,elements:[e]})):n&&n.src&&(e.src=n.src)},dt=function(t,e){return(getComputedStyle(t,null)||{})[e]},ht=function(t,e,n){for(n=n||t.offsetWidth;n0)&&"visible"!=dt(o,"overflow")&&(r=o.getBoundingClientRect(),i=y>r.left&&gr.top-1&&v49?function(){et(c,{timeout:a}),a!==o.ricTimeout&&(a=o.ricTimeout)}:mt((function(){Z(c)}),!0);return function(t){var o;(t=!0===t)&&(a=33),e||(e=!0,(o=i-(n.now()-r))<0&&(o=0),t||o<9?s():Z(s,o))}}(L=function(){var t,n,i,a,c,s,l,h,E,S,O,L,z=r.elements;if((d=o.loadMode)&&j<8&&(t=z.length)){for(n=0,x++;n500&&J.clientWidth>500?500:370:o.expand,r._defEx=S,O=S*o.expFactor,L=o.hFac,w=null,A2&&d>2&&!e.hidden?(A=O,x=0):A=d>1&&x>1&&j<6?S:0),E!==s&&(p=innerWidth+s*L,m=innerHeight+s,l=-1*s,E=s),i=z[n].getBoundingClientRect(),(b=i.bottom)>=l&&(v=i.top)<=m&&(y=i.right)>=l*L&&(g=i.left)<=p&&(b||y||g||v)&&(o.loadHidden||_(z[n]))&&(f&&j<3&&!h&&(d<3||x<4)||T(z[n],s))){if(D(z[n]),c=!0,j>9)break}else!c&&f&&!a&&j<4&&x<4&&d>2&&(u[0]||o.preloadAfterLoad)&&(u[0]||!h&&(b||y||g||v||"auto"!=z[n].getAttribute(o.sizesAttr)))&&(a=u[0]||z[n]);a&&!c&&D(a)}}),P=mt(k=function(t){var e=t.target;e._lazyCache?delete e._lazyCache:(O(t),ct(e,o.loadedClass),st(e,o.loadingClass),ut(e,M),ft(e,"lazyloaded"))}),M=function(t){P({target:t.target})},I=function(t,e){var n=t.getAttribute("data-load-mode")||o.iframeLoadMode;0==n?t.contentWindow.location.replace(e):1==n&&(t.src=e)},N=function(t){var e,n=t.getAttribute(o.srcsetAttr);(e=o.customMedia[t.getAttribute("data-media")||t.getAttribute("media")])&&t.setAttribute("media",e),n&&t.setAttribute("srcset",n)},R=mt((function(t,e,n,r,i){var a,c,s,u,f,d;(f=ft(t,"lazybeforeunveil",e)).defaultPrevented||(r&&(n?ct(t,o.autosizesClass):t.setAttribute("sizes",r)),c=t.getAttribute(o.srcsetAttr),a=t.getAttribute(o.srcAttr),i&&(u=(s=t.parentNode)&&nt.test(s.nodeName||"")),d=e.firesLoad||"src"in t&&(c||a||u),f={target:t},ct(t,o.loadingClass),d&&(clearTimeout(l),l=Z(O,2500),ut(t,M,!0)),u&&it.call(s.getElementsByTagName("source"),N),c?t.setAttribute("srcset",c):a&&!u&&(S.test(t.nodeName)?I(t,a):t.src=a),i&&(c||u)&<(t,{src:a})),t._lazyRace&&delete t._lazyRace,st(t,o.lazyClass),pt((function(){var e=t.complete&&t.naturalWidth>1;d&&!e||(e&&ct(t,o.fastLoadedClass),k(f),t._lazyCache=!0,Z((function(){"_lazyCache"in t&&delete t._lazyCache}),9)),"lazy"==t.loading&&j--}),!0)})),D=function(t){if(!t._lazyRace){var e,n=E.test(t.nodeName),r=n&&(t.getAttribute(o.sizesAttr)||t.getAttribute("sizes")),i="auto"==r;(!i&&f||!n||!t.getAttribute("src")&&!t.srcset||t.complete||at(t,o.errorClass)||!at(t,o.lazyClass))&&(e=ft(t,"lazyunveilread").detail,i&&yt.updateElem(t,!0,t.offsetWidth),t._lazyRace=!0,j++,R(t,e,i,r,n))}},B=vt((function(){o.loadMode=3,z()})),F=function(){f||(n.now()-h<999?Z(F,999):(f=!0,o.loadMode=3,z(),Q("scroll",q,!0)))},{_:function(){h=n.now(),r.elements=e.getElementsByClassName(o.lazyClass),u=e.getElementsByClassName(o.lazyClass+" "+o.preloadClass),Q("scroll",z,!0),Q("resize",z,!0),Q("pageshow",(function(t){if(t.persisted){var n=e.querySelectorAll("."+o.loadingClass);n.length&&n.forEach&&tt((function(){n.forEach((function(t){t.complete&&D(t)}))}))}})),t.MutationObserver?new MutationObserver(z).observe(J,{childList:!0,subtree:!0,attributes:!0}):(J.addEventListener("DOMNodeInserted",z,!0),J.addEventListener("DOMAttrModified",z,!0),setInterval(z,999)),Q("hashchange",z,!0),["focus","mouseover","click","load","transitionend","animationend"].forEach((function(t){e.addEventListener(t,z,!0)})),/d$|^c/.test(e.readyState)?F():(Q("load",F),e.addEventListener("DOMContentLoaded",z),Z(F,2e4)),r.elements.length?(L(),pt._lsFlush()):z()},checkElems:z,unveil:D,_aLSL:q=function(){3==o.loadMode&&(o.loadMode=2),B()}}),yt=(a=mt((function(t,e,n,r){var o,i,a;if(t._lazysizesWidth=r,r+="px",t.setAttribute("sizes",r),nt.test(e.nodeName||""))for(i=0,a=(o=e.getElementsByTagName("source")).length;i0?_t:Ot)(t)},Lt=Math.min,zt=function(t){return t>0?Lt(Tt(t),9007199254740991):0},kt=Math.max,Pt=Math.min,Mt=function(t){return function(e,n,r){var o,i=N(e),a=zt(i.length),c=function(t,e){var n=Tt(t);return n<0?kt(n+e,0):Pt(n,e)}(r,a);if(t&&n!=n){for(;a>c;)if((o=i[c++])!=o)return!0}else for(;a>c;c++)if((t||c in i)&&i[c]===n)return t||c||0;return!t&&-1}},It={includes:Mt(!0),indexOf:Mt(!1)},Nt=It.indexOf,Rt=function(t,e){var n,r=N(t),o=0,i=[];for(n in r)!q(ht,n)&&q(r,n)&&i.push(n);for(;e.length>o;)q(r,n=e[o++])&&(~Nt(i,n)||i.push(n));return i},Dt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Bt=Dt.concat("length","prototype"),qt={f:Object.getOwnPropertyNames||function(t){return Rt(t,Bt)}},Ft={f:Object.getOwnPropertySymbols},Ut=xt("Reflect","ownKeys")||function(t){var e=qt.f(G(t)),n=Ft.f;return n?e.concat(n(t)):e},Ht=function(t,e){for(var n=Ut(e),r=J.f,o=V.f,i=0;i=74)&&(wt=fe.match(/Chrome\/(\d+)/))&&(Et=wt[1]);var pe=Et&&+Et,me=ce("species"),ve=ce("isConcatSpreadable"),ge=9007199254740991,ye="Maximum allowed index exceeded",be=pe>=51||!j((function(){var t=[];return t[ve]=!1,t.concat()[0]!==t})),we=("concat",pe>=51||!j((function(){var t=[];return(t.constructor={})[me]=function(){return{foo:1}},1!==t.concat(Boolean).foo}))),Ee=function(t){if(!R(t))return!1;var e=t[ve];return void 0!==e?!!e:Zt(t)};Qt({target:"Array",proto:!0,forced:!be||!we},{concat:function(t){var e,n,r,o,i,a=te(this),c=ue(a,0),s=0;for(e=-1,r=arguments.length;ege)throw TypeError(ye);for(n=0;n=ge)throw TypeError(ye);ee(c,s++,i)}return c.length=s,c}});var Se=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},Ce=function(t,e,n){if(Se(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}},Ae=[].push,je=function(t){var e=1==t,n=2==t,r=3==t,o=4==t,i=6==t,a=5==t||i;return function(c,s,u,f){for(var l,d,h=te(c),p=M(h),m=Ce(s,u,3),v=zt(p.length),g=0,y=f||ue,b=e?y(c,v):n?y(c,0):void 0;v>g;g++)if((a||g in p)&&(d=m(l=p[g],g,h),t))if(e)b[g]=d;else if(d)switch(t){case 3:return!0;case 5:return l;case 6:return g;case 2:Ae.call(b,l)}else if(o)return!1;return i?-1:r||o?o:b}},xe={forEach:je(0),map:je(1),filter:je(2),some:je(3),every:je(4),find:je(5),findIndex:je(6)},Oe=function(t,e){var n=[][t];return!!n&&j((function(){n.call(null,e||function(){throw 1},1)}))},_e=Object.defineProperty,Te={},Le=function(t){throw t},ze=function(t,e){if(q(Te,t))return Te[t];e||(e={});var n=[][t],r=!!q(e,"ACCESSORS")&&e.ACCESSORS,o=q(e,0)?e[0]:Le,i=q(e,1)?e[1]:void 0;return Te[t]=!!n&&!j((function(){if(r&&!x)return!0;var t={length:-1};r?_e(t,1,{enumerable:!0,get:Le}):t[1]=1,n.call(t,o,i)}))},ke=xe.forEach,Pe=Oe("forEach"),Me=ze("forEach"),Ie=Pe&&Me?[].forEach:function(t){return ke(this,t,arguments.length>1?arguments[1]:void 0)};Qt({target:"Array",proto:!0,forced:[].forEach!=Ie},{forEach:Ie});var Ne,Re=Object.keys||function(t){return Rt(t,Dt)},De=x?Object.defineProperties:function(t,e){G(t);for(var n,r=Re(e),o=r.length,i=0;o>i;)J.f(t,n=r[i++],e[n]);return t},Be=xt("document","documentElement"),qe=dt("IE_PROTO"),Fe=function(){},Ue=function(t){return"