diff --git a/API/fwapp.py b/API/fwapp.py index d4048ed..129614d 100644 --- a/API/fwapp.py +++ b/API/fwapp.py @@ -1,11 +1,21 @@ from API import app from API.utils.DBConnection import DBConnection +from API.services.DBManipulation import * from .RequestBodySchema import FormData from .ResponseBodySchema import EDAResponseData -from API.services.DBManipulation import * +from fastapi.templating import Jinja2Templates +from fastapi import Request +from fastapi.staticfiles import StaticFiles + +# template and static files setup +templates = Jinja2Templates(directory="API/templates/") +app.mount("/static", StaticFiles(directory="API/static"), name="static") -import json +@app.get("/") +@app.get("/home") +def home(request: Request): + return templates.TemplateResponse('home.html',context={'request':request}) @app.get("/api/response_check") diff --git a/API/static/css/style.css b/API/static/css/style.css new file mode 100644 index 0000000..cfabbdc --- /dev/null +++ b/API/static/css/style.css @@ -0,0 +1,3 @@ +html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{background:#1D2026;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}hr{border:0;display:block;height:1px;background:#242830;margin-top:24px;margin-bottom:24px}ul,ol{margin-top:0;margin-bottom:24px;padding-left:24px}ul{list-style:disc}ol{list-style:decimal}li>ul,li>ol{margin-bottom:0}dl{margin-top:0;margin-bottom:24px}dt{font-weight:600}dd{margin-left:24px;margin-bottom:24px}img{height:auto;max-width:100%;vertical-align:middle}figure{margin:24px 0}figcaption{font-size:16px;line-height:24px;padding:8px 0}img,svg{display:block}table{border-collapse:collapse;margin-bottom:24px;width:100%}tr{border-bottom:1px solid #242830}th{text-align:left}th,td{padding:10px 16px}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}html{font-size:20px;line-height:30px}body{color:#8A94A7;font-size:1rem}body,button,input,select,textarea{font-family:"IBM Plex Sans", sans-serif}a{color:#8A94A7;text-decoration:underline}a:hover,a:active{outline:0;text-decoration:none}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{clear:both;color:#fff;font-weight:600}h1,.h1{font-size:38px;line-height:48px;letter-spacing:0px}@media (min-width: 641px){h1,.h1{font-size:44px;line-height:54px;letter-spacing:0px}}h2,.h2{font-size:32px;line-height:42px;letter-spacing:0px}@media (min-width: 641px){h2,.h2{font-size:38px;line-height:48px;letter-spacing:0px}}h3,.h3,blockquote{font-size:24px;line-height:34px;letter-spacing:0px}@media (min-width: 641px){h3,.h3,blockquote{font-size:32px;line-height:42px;letter-spacing:0px}}h4,h5,h6,.h4,.h5,.h6{font-size:20px;line-height:30px;letter-spacing:-0.1px}@media (min-width: 641px){h4,h5,h6,.h4,.h5,.h6{font-size:24px;line-height:34px;letter-spacing:0px}}@media (max-width: 640px){.h1-mobile{font-size:38px;line-height:48px;letter-spacing:0px}.h2-mobile{font-size:32px;line-height:42px;letter-spacing:0px}.h3-mobile{font-size:24px;line-height:34px;letter-spacing:0px}.h4-mobile,.h5-mobile,.h6-mobile{font-size:20px;line-height:30px;letter-spacing:-0.1px}}.text-light h1,.text-light h2,.text-light h3,.text-light h4,.text-light h5,.text-light h6,.text-light .h1,.text-light .h2,.text-light .h3,.text-light .h4,.text-light .h5,.text-light .h6{color:!important}.text-sm{font-size:18px;line-height:28px;letter-spacing:-0.1px}.text-xs{font-size:16px;line-height:24px;letter-spacing:-0.1px}h1,h2,.h1,.h2{margin-top:48px;margin-bottom:16px}h3,.h3{margin-top:36px;margin-bottom:12px}h4,h5,h6,.h4,.h5,.h6{margin-top:24px;margin-bottom:4px}p{margin-top:0;margin-bottom:24px}dfn,cite,em,i{font-style:italic}blockquote{color:#3B404C;font-style:italic;margin-top:24px;margin-bottom:24px;margin-left:24px}blockquote::before{content:"\201C"}blockquote::after{content:"\201D"}blockquote p{display:inline}address{color:#8A94A7;border-width:1px 0;border-style:solid;border-color:#242830;padding:24px 0;margin:0 0 24px}pre,pre h1,pre h2,pre h3,pre h4,pre h5,pre h6,pre .h1,pre .h2,pre .h3,pre .h4,pre .h5,pre .h6{font-family:"Courier 10 Pitch", Courier, monospace}pre,code,kbd,tt,var{background:#1D2026}pre{font-size:16px;line-height:24px;margin-bottom:1.6em;max-width:100%;overflow:auto;padding:24px;margin-top:24px;margin-bottom:24px}code,kbd,tt,var{font-family:Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;font-size:16px;padding:2px 4px}abbr,acronym{cursor:help}mark,ins{text-decoration:none}small{font-size:18px;line-height:28px;letter-spacing:-0.1px}b,strong{font-weight:600}button,input,select,textarea,label{font-size:20px;line-height:30px}.container,.container-sm{width:100%;margin:0 auto;padding-left:16px;padding-right:16px}@media (min-width: 481px){.container,.container-sm{padding-left:24px;padding-right:24px}}.container{max-width:1128px}.container-sm{max-width:848px}.container .container-sm{max-width:800px;padding-left:0;padding-right:0}.screen-reader-text{clip:rect(1px, 1px, 1px, 1px);position:absolute !important;height:1px;width:1px;overflow:hidden;word-wrap:normal !important}.screen-reader-text:focus{border-radius:2px;box-shadow:0 0 2px 2px rgba(0,0,0,0.6);clip:auto !important;display:block;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none;text-transform:uppercase;background-color:#1D2026;color:#0270D7 !important;border:none;height:auto;left:8px;padding:16px 32px;top:8px;width:auto;z-index:100000}.list-reset{list-style:none;padding:0}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-primary{color:#0270D7}.has-top-divider{position:relative}.has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#242830}.has-bottom-divider{position:relative}.has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#242830}.m-0{margin:0}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.m-8{margin:8px}.mt-8{margin-top:8px}.mr-8{margin-right:8px}.mb-8{margin-bottom:8px}.ml-8{margin-left:8px}.m-16{margin:16px}.mt-16{margin-top:16px}.mr-16{margin-right:16px}.mb-16{margin-bottom:16px}.ml-16{margin-left:16px}.m-24{margin:24px}.mt-24{margin-top:24px}.mr-24{margin-right:24px}.mb-24{margin-bottom:24px}.ml-24{margin-left:24px}.m-32{margin:32px}.mt-32{margin-top:32px}.mr-32{margin-right:32px}.mb-32{margin-bottom:32px}.ml-32{margin-left:32px}.m-40{margin:40px}.mt-40{margin-top:40px}.mr-40{margin-right:40px}.mb-40{margin-bottom:40px}.ml-40{margin-left:40px}.m-48{margin:48px}.mt-48{margin-top:48px}.mr-48{margin-right:48px}.mb-48{margin-bottom:48px}.ml-48{margin-left:48px}.m-56{margin:56px}.mt-56{margin-top:56px}.mr-56{margin-right:56px}.mb-56{margin-bottom:56px}.ml-56{margin-left:56px}.m-64{margin:64px}.mt-64{margin-top:64px}.mr-64{margin-right:64px}.mb-64{margin-bottom:64px}.ml-64{margin-left:64px}.p-0{padding:0}.pt-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.p-8{padding:8px}.pt-8{padding-top:8px}.pr-8{padding-right:8px}.pb-8{padding-bottom:8px}.pl-8{padding-left:8px}.p-16{padding:16px}.pt-16{padding-top:16px}.pr-16{padding-right:16px}.pb-16{padding-bottom:16px}.pl-16{padding-left:16px}.p-24{padding:24px}.pt-24{padding-top:24px}.pr-24{padding-right:24px}.pb-24{padding-bottom:24px}.pl-24{padding-left:24px}.p-32{padding:32px}.pt-32{padding-top:32px}.pr-32{padding-right:32px}.pb-32{padding-bottom:32px}.pl-32{padding-left:32px}.p-40{padding:40px}.pt-40{padding-top:40px}.pr-40{padding-right:40px}.pb-40{padding-bottom:40px}.pl-40{padding-left:40px}.p-48{padding:48px}.pt-48{padding-top:48px}.pr-48{padding-right:48px}.pb-48{padding-bottom:48px}.pl-48{padding-left:48px}.p-56{padding:56px}.pt-56{padding-top:56px}.pr-56{padding-right:56px}.pb-56{padding-bottom:56px}.pl-56{padding-left:56px}.p-64{padding:64px}.pt-64{padding-top:64px}.pr-64{padding-right:64px}.pb-64{padding-bottom:64px}.pl-64{padding-left:64px}.sr .has-animations .is-revealing{visibility:hidden}.has-animations .anime-element{visibility:hidden}.anime-ready .has-animations .anime-element{visibility:visible}.input,.textarea{background-color:#fff;border-width:1px;border-style:solid;border-color:#242830;border-radius:2px;color:#8A94A7;max-width:100%;width:100%}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:#3B404C}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#3B404C}.input::-ms-input-placeholder,.textarea::-ms-input-placeholder{color:#3B404C}.input::placeholder,.textarea::placeholder{color:#3B404C}.input::-ms-input-placeholder,.textarea::-ms-input-placeholder{color:#3B404C}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#3B404C}.input:hover,.textarea:hover{border-color:#191c21}.input:active,.input:focus,.textarea:active,.textarea:focus{outline:none;border-color:#242830}.input[disabled],.textarea[disabled]{cursor:not-allowed;background-color:#1D2026;border-color:#1D2026}.input{-moz-appearance:none;-webkit-appearance:none;font-size:16px;letter-spacing:-0.1px;line-height:20px;padding:13px 16px;height:48px;box-shadow:none}.input .inline-input{display:inline;width:auto}.textarea{display:block;min-width:100%;resize:vertical}.textarea .inline-textarea{display:inline;width:auto}.field-grouped>.control:not(:last-child){margin-bottom:8px}@media (min-width: 641px){.field-grouped{display:flex}.field-grouped>.control{flex-shrink:0}.field-grouped>.control.control-expanded{flex-grow:1;flex-shrink:1}.field-grouped>.control:not(:last-child){margin-bottom:0;margin-right:8px}}.button{display:inline-flex;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none !important;text-transform:uppercase;background-color:#242830;color:#fff !important;border:none;border-radius:2px;cursor:pointer;justify-content:center;padding:16px 32px;height:48px;text-align:center;white-space:nowrap}.button:hover{background:#262a33}.button:active{outline:0}.button::before{border-radius:2px}.button-sm{padding:8px 24px;height:32px}.button-primary{background:#097dea;background:linear-gradient(65deg, #0270D7 0, #0F8AFD 100%)}.button-primary:hover{background:#0982f4;background:linear-gradient(65deg, #0275e1 0, #198ffd 100%)}.button-block{display:flex}.button-block{display:flex;width:100%}@media (max-width: 640px){.button-wide-mobile{width:100%;max-width:280px}}.site-header{padding:24px 0}.site-header-inner{position:relative;display:flex;justify-content:space-between;align-items:center}.header-links{display:inline-flex}.header-links li{display:inline-flex}.header-links a:not(.button){font-size:16px;line-height:24px;letter-spacing:-0.1px;font-weight:600;color:#8A94A7;text-transform:uppercase;text-decoration:none;line-height:16px;padding:8px 24px}@media (min-width: 641px){.site-header{position:relative}.site-header::before{content:'';position:absolute;top:0;left:0;width:100%;height:700px;background:#242830;background:linear-gradient(80deg, rgba(36,40,48,0.5) 0%, rgba(36,40,48,0) 100%);-webkit-transform-origin:0;transform-origin:0;-webkit-transform:skewY(-12deg);transform:skewY(-12deg)}}.hero{text-align:center;padding-top:48px;padding-bottom:88px}.hero-copy{position:relative;z-index:1}.hero-cta{margin-bottom:40px}.hero-figure{position:relative}.hero-figure svg{width:100%;height:auto}.hero-figure::before,.hero-figure::after{content:'';position:absolute;background-repeat:no-repeat;background-size:100%}.has-animations .hero-figure::before,.has-animations .hero-figure::after{opacity:0;transition:opacity 2s ease}.anime-ready .has-animations .hero-figure::before,.anime-ready .has-animations .hero-figure::after{opacity:1}.hero-figure::before{top:-57.8%;left:-1.3%;width:152.84%;height:178.78%;background-image:url("../images/hero-back-illustration.svg")}.hero-figure::after{top:-35.6%;left:99.6%;width:57.2%;height:87.88%;background-image:url("../images/hero-top-illustration.svg")}.hero-figure-box{position:absolute;top:0;will-change:transform}.hero-figure-box-01,.hero-figure-box-02,.hero-figure-box-03,.hero-figure-box-04,.hero-figure-box-08,.hero-figure-box-09{overflow:hidden}.hero-figure-box-01::before,.hero-figure-box-02::before,.hero-figure-box-03::before,.hero-figure-box-04::before,.hero-figure-box-08::before,.hero-figure-box-09::before{content:'';position:absolute;top:0;bottom:0;left:0;right:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.hero-figure-box-01{left:103.2%;top:41.9%;width:28.03%;height:37.37%;background:linear-gradient(to left top, #00BFFB, rgba(0,191,251,0));-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg)}.hero-figure-box-01::before{background:linear-gradient(to left, #15181D 0%, rgba(21,24,29,0) 60%);-webkit-transform:rotateZ(45deg) scale(1.5);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-02{left:61.3%;top:64.1%;width:37.87%;height:50.50%;background:linear-gradient(to left top, #0270D7, rgba(2,112,215,0));-webkit-transform:rotateZ(-45deg);transform:rotateZ(-45deg)}.hero-figure-box-02::before{background:linear-gradient(to top, #15181D 0%, rgba(21,24,29,0) 60%);-webkit-transform:rotateZ(-45deg) scale(1.5);transform:rotateZ(-45deg) scale(1.5)}.hero-figure-box-03{left:87.7%;top:-56.8%;width:56.81%;height:75.75%;background:linear-gradient(to left top, #00BFFB, rgba(0,191,251,0))}.hero-figure-box-03::before{background:linear-gradient(to left, #15181D 0%, rgba(21,24,29,0) 60%);-webkit-transform:rotateZ(45deg) scale(1.5);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-04{left:54.9%;top:-8%;width:45.45%;height:60.60%;background:linear-gradient(to left top, #0270D7, rgba(2,112,215,0));-webkit-transform:rotateZ(-135deg);transform:rotateZ(-135deg)}.hero-figure-box-04::before{background:linear-gradient(to top, rgba(255,255,255,0.24) 0%, rgba(255,255,255,0) 60%);-webkit-transform:rotateZ(-45deg) scale(1.5);transform:rotateZ(-45deg) scale(1.5)}.hero-figure-box-05,.hero-figure-box-06,.hero-figure-box-07{background-color:#242830;box-shadow:-20px 32px 64px rgba(0,0,0,0.25)}.hero-figure-box-05{left:17.4%;top:13.3%;width:64%;height:73.7%;-webkit-transform:perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg);transform:perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg)}.hero-figure-box-06{left:65.5%;top:6.3%;width:30.3%;height:40.4%;-webkit-transform:rotateZ(20deg);transform:rotateZ(20deg)}.hero-figure-box-07{left:1.9%;top:42.4%;width:12.12%;height:16.16%;-webkit-transform:rotateZ(20deg);transform:rotateZ(20deg)}.hero-figure-box-08{left:27.1%;top:81.6%;width:19.51%;height:26.01%;background:#0270D7;-webkit-transform:rotateZ(-22deg);transform:rotateZ(-22deg)}.hero-figure-box-08::before{background:linear-gradient(to left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.48) 100%);-webkit-transform:rotateZ(45deg) scale(1.5);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-09{left:42.6%;top:-17.9%;width:6.63%;height:8.83%;background:#00BFFB;-webkit-transform:rotateZ(-52deg);transform:rotateZ(-52deg)}.hero-figure-box-09::before{background:linear-gradient(to left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.64) 100%);-webkit-transform:rotateZ(45deg) scale(1.5);transform:rotateZ(45deg) scale(1.5)}.hero-figure-box-10{left:-3.8%;top:4.3%;width:3.03%;height:4.04%;background:rgba(0,191,251,0.32);-webkit-transform:rotateZ(-50deg);transform:rotateZ(-50deg)}@media (max-width: 640px){.hero-cta{max-width:280px;margin-left:auto;margin-right:auto}.hero-cta .button{display:flex}.hero-cta .button+.button{margin-top:16px}.hero-figure::after,.hero-figure-box-03,.hero-figure-box-04,.hero-figure-box-09{display:none}}@media (min-width: 641px){.hero{text-align:left;padding-top:64px;padding-bottom:88px}.hero-inner{display:flex;justify-content:space-between;align-items:center}.hero-copy{padding-right:64px;min-width:552px;width:552px}.hero-cta{margin:0}.hero-cta .button{min-width:170px}.hero-cta .button:first-child{margin-right:16px}.hero-figure svg{width:auto}}.features-wrap{display:flex;flex-wrap:wrap;justify-content:space-evenly;margin-right:-32px;margin-left:-32px}.features-wrap:first-of-type{margin-top:-16px}.features-wrap:last-of-type{margin-bottom:-16px}.feature{padding:16px 32px;width:380px;max-width:380px;flex-grow:1}.feature-inner{height:100%}.feature-icon{display:flex;justify-content:center}@media (min-width: 641px){.features-wrap:first-of-type{margin-top:-24px}.features-wrap:last-of-type{margin-bottom:-24px}.feature{padding:32px 32px}}.pricing-header{margin-bottom:48px}.pricing-tables-wrap{display:flex;flex-wrap:wrap;justify-content:center;margin-right:-12px;margin-left:-12px}.pricing-tables-wrap:first-child{margin-top:-12px}.pricing-tables-wrap:last-child{margin-bottom:-12px}.pricing-table{position:relative;padding:12px;width:368px;max-width:368px;flex-grow:1}.pricing-table::before{content:'';position:absolute;left:50%;width:200%;max-width:200%;height:435px;background-repeat:no-repeat;background-position:center;background-size:100%;bottom:18.8%;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-image:url("../images/pricing-illustration.svg")}.pricing-table-header,.pricing-table-features-title,.pricing-table-features li{border-bottom:1px solid rgba(138,148,167,0.24)}.pricing-table-inner{position:relative;display:flex;flex-wrap:wrap;background:#2C3039;padding:24px;height:100%}.pricing-table-inner>*{position:relative;width:100%}.pricing-table-inner::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 24px 48px rgba(21,24,29,0.24);mix-blend-mode:multiply}.pricing-table-price-currency{color:#8A94A7}.pricing-table-features-title{color:#fff;font-weight:700}.pricing-table-features li{display:flex;align-items:center;padding:14px 0}.pricing-table-features li::before{content:'';width:16px;height:12px;margin-right:16px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUuNiA2LjRMMS42IDQgMCA1LjYgNS42IDEyIDE2IDEuNiAxNC40IDB6IiBmaWxsPSIjMDJDQkIxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);background-repeat:no-repeat}.pricing-table-cta{align-self:flex-end}@media (min-width: 641px){.pricing .section-paragraph{padding-left:90px;padding-right:90px}.pricing-header{margin-bottom:52px}}.cta{text-align:center}.cta .section-inner{padding:48px 16px}.cta .section-title{margin-bottom:40px}.cta-inner{position:relative;background:#15181D;overflow:hidden}.cta-inner::before{content:'';position:absolute;right:98px;top:-117px;width:160px;height:187px;background-image:url("../images/cta-illustration.svg");background-repeat:no-repeat}.cta-inner>*{position:relative}@media (min-width: 641px){.cta{text-align:left}.cta .section-inner{padding:64px 32px}.cta .section-title{margin-bottom:0;padding-right:24px}.cta-inner{display:flex;align-items:center;justify-content:space-between}}.is-boxed{background:#242830}.body-wrap{background:#1D2026;overflow:hidden;display:flex;flex-direction:column;min-height:100vh}.boxed-container{max-width:1440px;margin:0 auto;box-shadow:0 24px 48px rgba(21,24,29,0.24);mix-blend-mode:multiply;mix-blend-mode:normal}main{flex:1 0 auto}.section-inner{position:relative;padding-top:48px;padding-bottom:48px}@media (min-width: 641px){.section-inner{padding-top:88px;padding-bottom:88px}}.site-footer{font-size:14px;line-height:22px;letter-spacing:0px}.site-footer a{color:#8A94A7;text-decoration:none}.site-footer a:hover,.site-footer a:active{text-decoration:underline}.site-footer-inner{position:relative;display:flex;flex-wrap:wrap;padding-top:48px;padding-bottom:48px}.footer-brand,.footer-links,.footer-social-links,.footer-copyright{flex:none;width:100%;display:inline-flex;justify-content:center}.footer-brand,.footer-links,.footer-social-links{margin-bottom:24px}.footer-social-links li{display:inline-flex}.footer-social-links li+li{margin-left:16px}.footer-social-links li a{padding:8px}.footer-links li+li{margin-left:24px}@media (min-width: 641px){.site-footer{margin-top:20px}.site-footer-inner{justify-content:space-between;padding-top:64px;padding-bottom:64px}.footer-brand,.footer-links,.footer-social-links,.footer-copyright{flex:50%}.footer-brand,.footer-copyright{justify-content:flex-start}.footer-links,.footer-social-links{justify-content:flex-end}.footer-links{order:1;margin-bottom:0}} + +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxLQUFLLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLDZCQUE2QixDQUFDLEtBQUssUUFBUSxDQUFDLHdDQUF3QyxhQUFhLENBQUMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLHVCQUF1QixhQUFhLENBQUMsT0FBTyxlQUFlLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxvQ0FBb0MsQ0FBQyxZQUFZLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLHdDQUErQixDQUEvQixnQ0FBZ0MsQ0FBQyxTQUFTLG1CQUFtQixDQUFDLFNBQVMsa0JBQWtCLENBQUMsY0FBYyxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxRQUFRLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxVQUFVLENBQUMsWUFBWSxvQkFBb0IsQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLGVBQWUsZUFBZSxDQUFDLHNDQUFzQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsZ0JBQWdCLENBQUMsY0FBYyxtQkFBbUIsQ0FBQywyREFBMkQseUJBQXlCLENBQUMsOEhBQThILGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxrSEFBa0gsNkJBQTZCLENBQUMsU0FBUyw2QkFBNkIsQ0FBQyxPQUFPLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLFNBQVMsYUFBYSxDQUFDLGlDQUFpQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsc0ZBQXNGLFdBQVcsQ0FBQyxnQkFBZ0IsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMseUZBQXlGLHVCQUF1QixDQUFDLDZCQUE2Qix5QkFBeUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxhQUFhLENBQUMsUUFBUSxpQkFBaUIsQ0FBQyxPQUFPLG9CQUFvQixDQUFDLFNBQVMsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLEtBQUsscUJBQXFCLENBQUMsbUJBQW1CLGtCQUFrQixDQUFDLEtBQUssa0JBQWtCLENBQUMsaUNBQWlDLENBQUMsa0NBQWtDLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsTUFBTSxZQUFZLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLGVBQWUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxhQUFhLENBQUMsTUFBTSx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRywrQkFBK0IsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLDhCQUE4QixjQUFjLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxjQUFjLENBQUMsa0NBQWtDLHVDQUF1QyxDQUFDLEVBQUUsYUFBYSxDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixTQUFTLENBQUMsb0JBQW9CLENBQUMsMENBQTBDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLE9BQU8sY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGtCQUFrQixjQUFjLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLGtCQUFrQixjQUFjLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxxQkFBcUIsY0FBYyxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixxQkFBcUIsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUMsMEJBQTBCLFdBQVcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFdBQVcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFdBQVcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGlDQUFpQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQywwTEFBMEwsZ0JBQWdCLENBQUMsU0FBUyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsU0FBUyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsY0FBYyxlQUFlLENBQUMsa0JBQWtCLENBQUMsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLGlCQUFpQixDQUFDLFdBQVcsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsYUFBYSxjQUFjLENBQUMsUUFBUSxhQUFhLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyw4RkFBOEYsa0RBQWtELENBQUMsb0JBQW9CLGtCQUFrQixDQUFDLElBQUksY0FBYyxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsMEVBQTBFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLFdBQVcsQ0FBQyxTQUFTLG9CQUFvQixDQUFDLE1BQU0sY0FBYyxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLFNBQVMsZUFBZSxDQUFDLG1DQUFtQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLHlCQUF5QixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsZ0JBQWdCLENBQUMsY0FBYyxlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLG9CQUFvQiw2QkFBNkIsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQywwQkFBMEIsaUJBQWlCLENBQUMsc0NBQXNDLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsZUFBZSxDQUFDLGFBQWEsaUJBQWlCLENBQUMsWUFBWSxnQkFBZ0IsQ0FBQyxjQUFjLGFBQWEsQ0FBQyxpQkFBaUIsaUJBQWlCLENBQUMseUJBQXlCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixpQkFBaUIsQ0FBQywyQkFBMkIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsS0FBSyxRQUFRLENBQUMsTUFBTSxZQUFZLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxhQUFhLENBQUMsS0FBSyxVQUFVLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sZUFBZSxDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sV0FBVyxDQUFDLE9BQU8sZUFBZSxDQUFDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssU0FBUyxDQUFDLE1BQU0sYUFBYSxDQUFDLE1BQU0sZUFBZSxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxXQUFXLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxNQUFNLGtCQUFrQixDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sWUFBWSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLG1CQUFtQixDQUFDLE9BQU8saUJBQWlCLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sWUFBWSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLG1CQUFtQixDQUFDLE9BQU8saUJBQWlCLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxrQ0FBa0MsaUJBQWlCLENBQUMsK0JBQStCLGlCQUFpQixDQUFDLDRDQUE0QyxrQkFBa0IsQ0FBQyxpQkFBaUIscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsdUVBQTJDLGFBQWEsQ0FBeEQsNkRBQTJDLGFBQWEsQ0FBeEQsK0RBQTJDLGFBQWEsQ0FBeEQsMkNBQTJDLGFBQWEsQ0FBQywrREFBK0QsYUFBYSxDQUFDLDZEQUE2RCxhQUFhLENBQUMsNkJBQTZCLG9CQUFvQixDQUFDLDREQUE0RCxZQUFZLENBQUMsb0JBQW9CLENBQUMscUNBQXFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLE9BQU8sb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMscUJBQXFCLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxhQUFhLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsY0FBYyxDQUFDLFVBQVUsQ0FBQyx5Q0FBeUMsaUJBQWlCLENBQUMsMEJBQTBCLGVBQWUsWUFBWSxDQUFDLHdCQUF3QixhQUFhLENBQUMseUNBQXlDLFdBQVcsQ0FBQyxhQUFhLENBQUMseUNBQXlDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsbUJBQW1CLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLGtCQUFrQixDQUFDLGVBQWUsU0FBUyxDQUFDLGdCQUFnQixpQkFBaUIsQ0FBQyxXQUFXLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxnQkFBZ0Isa0JBQWtCLENBQUMsMERBQTBELENBQUMsc0JBQXNCLGtCQUFrQixDQUFDLDBEQUEwRCxDQUFDLGNBQWMsWUFBWSxDQUFDLGNBQWMsWUFBWSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsb0JBQW9CLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxhQUFhLGNBQWMsQ0FBQyxtQkFBbUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLGNBQWMsbUJBQW1CLENBQUMsaUJBQWlCLG1CQUFtQixDQUFDLDZCQUE2QixjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsYUFBYSxpQkFBaUIsQ0FBQyxxQkFBcUIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQywrRUFBK0UsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsV0FBVyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxrQkFBa0IsQ0FBQyxhQUFhLGlCQUFpQixDQUFDLGlCQUFpQixVQUFVLENBQUMsV0FBVyxDQUFDLHlDQUF5QyxVQUFVLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMseUVBQXlFLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxtR0FBbUcsU0FBUyxDQUFDLHFCQUFxQixVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsNERBQTRELENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQywyREFBMkQsQ0FBQyxpQkFBaUIsaUJBQWlCLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLHdIQUF3SCxlQUFlLENBQUMsd0tBQXdLLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0NBQXlCLENBQXpCLDBCQUEwQixDQUFDLG9CQUFvQixXQUFXLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsbUVBQW1FLENBQUMsZ0NBQXVCLENBQXZCLHdCQUF3QixDQUFDLDRCQUE0QixxRUFBcUUsQ0FBQywyQ0FBa0MsQ0FBbEMsbUNBQW1DLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxtRUFBbUUsQ0FBQyxpQ0FBd0IsQ0FBeEIseUJBQXlCLENBQUMsNEJBQTRCLG9FQUFvRSxDQUFDLDRDQUFtQyxDQUFuQyxvQ0FBb0MsQ0FBQyxvQkFBb0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG1FQUFtRSxDQUFDLDRCQUE0QixxRUFBcUUsQ0FBQywyQ0FBa0MsQ0FBbEMsbUNBQW1DLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxtRUFBbUUsQ0FBQyxrQ0FBeUIsQ0FBekIsMEJBQTBCLENBQUMsNEJBQTRCLHNGQUFzRixDQUFDLDRDQUFtQyxDQUFuQyxvQ0FBb0MsQ0FBQyw0REFBNEQsd0JBQXdCLENBQUMsMkNBQTJDLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxpRkFBd0UsQ0FBeEUseUVBQXlFLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxnQ0FBdUIsQ0FBdkIsd0JBQXdCLENBQUMsb0JBQW9CLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQ0FBdUIsQ0FBdkIsd0JBQXdCLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQ0FBd0IsQ0FBeEIseUJBQXlCLENBQUMsNEJBQTRCLHdGQUF3RixDQUFDLDJDQUFrQyxDQUFsQyxtQ0FBbUMsQ0FBQyxvQkFBb0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLGlDQUF3QixDQUF4Qix5QkFBeUIsQ0FBQyw0QkFBNEIsd0ZBQXdGLENBQUMsMkNBQWtDLENBQWxDLG1DQUFtQyxDQUFDLG9CQUFvQixVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsK0JBQStCLENBQUMsaUNBQXdCLENBQXhCLHlCQUF5QixDQUFDLDBCQUEwQixVQUFVLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsWUFBWSxDQUFDLDBCQUEwQixlQUFlLENBQUMsZ0ZBQWdGLFlBQVksQ0FBQyxDQUFDLDBCQUEwQixNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsVUFBVSxRQUFRLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyw4QkFBOEIsaUJBQWlCLENBQUMsaUJBQWlCLFVBQVUsQ0FBQyxDQUFDLGVBQWUsWUFBWSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsZ0JBQWdCLENBQUMsNEJBQTRCLG1CQUFtQixDQUFDLFNBQVMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsZUFBZSxXQUFXLENBQUMsY0FBYyxZQUFZLENBQUMsc0JBQXNCLENBQUMsMEJBQTBCLDZCQUE2QixnQkFBZ0IsQ0FBQyw0QkFBNEIsbUJBQW1CLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLGdCQUFnQixrQkFBa0IsQ0FBQyxxQkFBcUIsWUFBWSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxpQ0FBaUMsZ0JBQWdCLENBQUMsZ0NBQWdDLG1CQUFtQixDQUFDLGVBQWUsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLHVCQUF1QixVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUFDLDBCQUEwQixDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQywwREFBMEQsQ0FBQywrRUFBK0UsOENBQThDLENBQUMscUJBQXFCLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLDZCQUE2QixVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLDBDQUEwQyxDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixhQUFhLENBQUMsOEJBQThCLFVBQVUsQ0FBQyxlQUFlLENBQUMsMkJBQTJCLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsbUNBQW1DLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLG9RQUFvUSxDQUFDLDJCQUEyQixDQUFDLG1CQUFtQixtQkFBbUIsQ0FBQywwQkFBMEIsNEJBQTRCLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLG9CQUFvQixrQkFBa0IsQ0FBQyxXQUFXLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxzREFBc0QsQ0FBQywyQkFBMkIsQ0FBQyxhQUFhLGlCQUFpQixDQUFDLDBCQUEwQixLQUFLLGVBQWUsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLFVBQVUsa0JBQWtCLENBQUMsV0FBVyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsMENBQTBDLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLENBQUMsS0FBSyxhQUFhLENBQUMsZUFBZSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsZUFBZSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGFBQWEsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsYUFBYSxDQUFDLG9CQUFvQixDQUFDLDJDQUEyQyx5QkFBeUIsQ0FBQyxtQkFBbUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxtRUFBbUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxpREFBaUQsa0JBQWtCLENBQUMsd0JBQXdCLG1CQUFtQixDQUFDLDJCQUEyQixnQkFBZ0IsQ0FBQywwQkFBMEIsV0FBVyxDQUFDLG9CQUFvQixnQkFBZ0IsQ0FBQywwQkFBMEIsYUFBYSxlQUFlLENBQUMsbUJBQW1CLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG1FQUFtRSxRQUFRLENBQUMsZ0NBQWdDLDBCQUEwQixDQUFDLG1DQUFtQyx3QkFBd0IsQ0FBQyxjQUFjLE9BQU8sQ0FBQyxlQUFlLENBQUMiLCJmaWxlIjoic3R5bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiaHRtbHtsaW5lLWhlaWdodDoxLjE1Oy1tcy10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCV9Ym9keXttYXJnaW46MH1hcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31oMXtmb250LXNpemU6MmVtO21hcmdpbjowLjY3ZW0gMH1maWdjYXB0aW9uLGZpZ3VyZSxtYWlue2Rpc3BsYXk6YmxvY2t9ZmlndXJle21hcmdpbjoxZW0gNDBweH1ocntib3gtc2l6aW5nOmNvbnRlbnQtYm94O2hlaWdodDowO292ZXJmbG93OnZpc2libGV9cHJle2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6b2JqZWN0c31hYmJyW3RpdGxlXXtib3JkZXItYm90dG9tOm5vbmU7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIGRvdHRlZH1iLHN0cm9uZ3tmb250LXdlaWdodDppbmhlcml0fWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGRlcn1jb2RlLGtiZCxzYW1we2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19ZGZue2ZvbnQtc3R5bGU6aXRhbGljfW1hcmt7YmFja2dyb3VuZC1jb2xvcjojZmYwO2NvbG9yOiMwMDB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdWJ7Ym90dG9tOi0wLjI1ZW19c3Vwe3RvcDotMC41ZW19YXVkaW8sdmlkZW97ZGlzcGxheTppbmxpbmUtYmxvY2t9YXVkaW86bm90KFtjb250cm9sc10pe2Rpc3BsYXk6bm9uZTtoZWlnaHQ6MH1pbWd7Ym9yZGVyLXN0eWxlOm5vbmV9c3ZnOm5vdCg6cm9vdCl7b3ZlcmZsb3c6aGlkZGVufWJ1dHRvbixpbnB1dCxvcHRncm91cCxzZWxlY3QsdGV4dGFyZWF7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTAwJTtsaW5lLWhlaWdodDoxLjE1O21hcmdpbjowfWJ1dHRvbixpbnB1dHtvdmVyZmxvdzp2aXNpYmxlfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24saHRtbCBbdHlwZT1cImJ1dHRvblwiXSxbdHlwZT1cInJlc2V0XCJdLFt0eXBlPVwic3VibWl0XCJdey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b259YnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPVwiYnV0dG9uXCJdOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPVwicmVzZXRcIl06Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9XCJzdWJtaXRcIl06Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyLXN0eWxlOm5vbmU7cGFkZGluZzowfWJ1dHRvbjotbW96LWZvY3VzcmluZyxbdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxbdHlwZT1cInJlc2V0XCJdOi1tb3otZm9jdXNyaW5nLFt0eXBlPVwic3VibWl0XCJdOi1tb3otZm9jdXNyaW5ne291dGxpbmU6MXB4IGRvdHRlZCBCdXR0b25UZXh0fWZpZWxkc2V0e3BhZGRpbmc6MC4zNWVtIDAuNzVlbSAwLjYyNWVtfWxlZ2VuZHtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6aW5oZXJpdDtkaXNwbGF5OnRhYmxlO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MDt3aGl0ZS1zcGFjZTpub3JtYWx9cHJvZ3Jlc3N7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9dGV4dGFyZWF7b3ZlcmZsb3c6YXV0b31bdHlwZT1cImNoZWNrYm94XCJdLFt0eXBlPVwicmFkaW9cIl17Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH1bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31bdHlwZT1cInNlYXJjaFwiXXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO291dGxpbmUtb2Zmc2V0Oi0ycHh9W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sW3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH1kZXRhaWxzLG1lbnV7ZGlzcGxheTpibG9ja31zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfWNhbnZhc3tkaXNwbGF5OmlubGluZS1ibG9ja310ZW1wbGF0ZXtkaXNwbGF5Om5vbmV9W2hpZGRlbl17ZGlzcGxheTpub25lfWh0bWx7Ym94LXNpemluZzpib3JkZXItYm94fSosKjpiZWZvcmUsKjphZnRlcntib3gtc2l6aW5nOmluaGVyaXR9Ym9keXtiYWNrZ3JvdW5kOiMxRDIwMjY7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWR9aHJ7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6IzI0MjgzMDttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4fXVsLG9se21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjI0cHg7cGFkZGluZy1sZWZ0OjI0cHh9dWx7bGlzdC1zdHlsZTpkaXNjfW9se2xpc3Qtc3R5bGU6ZGVjaW1hbH1saT51bCxsaT5vbHttYXJnaW4tYm90dG9tOjB9ZGx7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MjRweH1kdHtmb250LXdlaWdodDo2MDB9ZGR7bWFyZ2luLWxlZnQ6MjRweDttYXJnaW4tYm90dG9tOjI0cHh9aW1ne2hlaWdodDphdXRvO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX1maWd1cmV7bWFyZ2luOjI0cHggMH1maWdjYXB0aW9ue2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7cGFkZGluZzo4cHggMH1pbWcsc3Zne2Rpc3BsYXk6YmxvY2t9dGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbi1ib3R0b206MjRweDt3aWR0aDoxMDAlfXRye2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMyNDI4MzB9dGh7dGV4dC1hbGlnbjpsZWZ0fXRoLHRke3BhZGRpbmc6MTBweCAxNnB4fXRoOmZpcnN0LWNoaWxkLHRkOmZpcnN0LWNoaWxke3BhZGRpbmctbGVmdDowfXRoOmxhc3QtY2hpbGQsdGQ6bGFzdC1jaGlsZHtwYWRkaW5nLXJpZ2h0OjB9aHRtbHtmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4fWJvZHl7Y29sb3I6IzhBOTRBNztmb250LXNpemU6MXJlbX1ib2R5LGJ1dHRvbixpbnB1dCxzZWxlY3QsdGV4dGFyZWF7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBTYW5zXCIsIHNhbnMtc2VyaWZ9YXtjb2xvcjojOEE5NEE3O3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9YTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9aDEsaDIsaDMsaDQsaDUsaDYsLmgxLC5oMiwuaDMsLmg0LC5oNSwuaDZ7Y2xlYXI6Ym90aDtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjYwMH1oMSwuaDF7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweDtsZXR0ZXItc3BhY2luZzowcHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXtoMSwuaDF7Zm9udC1zaXplOjQ0cHg7bGluZS1oZWlnaHQ6NTRweDtsZXR0ZXItc3BhY2luZzowcHh9fWgyLC5oMntmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDo0MnB4O2xldHRlci1zcGFjaW5nOjBweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpe2gyLC5oMntmb250LXNpemU6MzhweDtsaW5lLWhlaWdodDo0OHB4O2xldHRlci1zcGFjaW5nOjBweH19aDMsLmgzLGJsb2NrcXVvdGV7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzRweDtsZXR0ZXItc3BhY2luZzowcHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXtoMywuaDMsYmxvY2txdW90ZXtmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDo0MnB4O2xldHRlci1zcGFjaW5nOjBweH19aDQsaDUsaDYsLmg0LC5oNSwuaDZ7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzBweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXtoNCxoNSxoNiwuaDQsLmg1LC5oNntmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOjBweH19QG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KXsuaDEtbW9iaWxle2ZvbnQtc2l6ZTozOHB4O2xpbmUtaGVpZ2h0OjQ4cHg7bGV0dGVyLXNwYWNpbmc6MHB4fS5oMi1tb2JpbGV7Zm9udC1zaXplOjMycHg7bGluZS1oZWlnaHQ6NDJweDtsZXR0ZXItc3BhY2luZzowcHh9LmgzLW1vYmlsZXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOjBweH0uaDQtbW9iaWxlLC5oNS1tb2JpbGUsLmg2LW1vYmlsZXtmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH19LnRleHQtbGlnaHQgaDEsLnRleHQtbGlnaHQgaDIsLnRleHQtbGlnaHQgaDMsLnRleHQtbGlnaHQgaDQsLnRleHQtbGlnaHQgaDUsLnRleHQtbGlnaHQgaDYsLnRleHQtbGlnaHQgLmgxLC50ZXh0LWxpZ2h0IC5oMiwudGV4dC1saWdodCAuaDMsLnRleHQtbGlnaHQgLmg0LC50ZXh0LWxpZ2h0IC5oNSwudGV4dC1saWdodCAuaDZ7Y29sb3I6IWltcG9ydGFudH0udGV4dC1zbXtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyOHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH0udGV4dC14c3tmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1oMSxoMiwuaDEsLmgye21hcmdpbi10b3A6NDhweDttYXJnaW4tYm90dG9tOjE2cHh9aDMsLmgze21hcmdpbi10b3A6MzZweDttYXJnaW4tYm90dG9tOjEycHh9aDQsaDUsaDYsLmg0LC5oNSwuaDZ7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206NHB4fXB7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MjRweH1kZm4sY2l0ZSxlbSxpe2ZvbnQtc3R5bGU6aXRhbGljfWJsb2NrcXVvdGV7Y29sb3I6IzNCNDA0Qztmb250LXN0eWxlOml0YWxpYzttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4O21hcmdpbi1sZWZ0OjI0cHh9YmxvY2txdW90ZTo6YmVmb3Jle2NvbnRlbnQ6XCJcXDIwMUNcIn1ibG9ja3F1b3RlOjphZnRlcntjb250ZW50OlwiXFwyMDFEXCJ9YmxvY2txdW90ZSBwe2Rpc3BsYXk6aW5saW5lfWFkZHJlc3N7Y29sb3I6IzhBOTRBNztib3JkZXItd2lkdGg6MXB4IDA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojMjQyODMwO3BhZGRpbmc6MjRweCAwO21hcmdpbjowIDAgMjRweH1wcmUscHJlIGgxLHByZSBoMixwcmUgaDMscHJlIGg0LHByZSBoNSxwcmUgaDYscHJlIC5oMSxwcmUgLmgyLHByZSAuaDMscHJlIC5oNCxwcmUgLmg1LHByZSAuaDZ7Zm9udC1mYW1pbHk6XCJDb3VyaWVyIDEwIFBpdGNoXCIsIENvdXJpZXIsIG1vbm9zcGFjZX1wcmUsY29kZSxrYmQsdHQsdmFye2JhY2tncm91bmQ6IzFEMjAyNn1wcmV7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDttYXJnaW4tYm90dG9tOjEuNmVtO21heC13aWR0aDoxMDAlO292ZXJmbG93OmF1dG87cGFkZGluZzoyNHB4O21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjI0cHh9Y29kZSxrYmQsdHQsdmFye2ZvbnQtZmFtaWx5Ok1vbmFjbywgQ29uc29sYXMsIFwiQW5kYWxlIE1vbm9cIiwgXCJEZWphVnUgU2FucyBNb25vXCIsIG1vbm9zcGFjZTtmb250LXNpemU6MTZweDtwYWRkaW5nOjJweCA0cHh9YWJicixhY3Jvbnlte2N1cnNvcjpoZWxwfW1hcmssaW5ze3RleHQtZGVjb3JhdGlvbjpub25lfXNtYWxse2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjI4cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OjYwMH1idXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhLGxhYmVse2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHh9LmNvbnRhaW5lciwuY29udGFpbmVyLXNte3dpZHRoOjEwMCU7bWFyZ2luOjAgYXV0bztwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjE2cHh9QG1lZGlhIChtaW4td2lkdGg6IDQ4MXB4KXsuY29udGFpbmVyLC5jb250YWluZXItc217cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fX0uY29udGFpbmVye21heC13aWR0aDoxMTI4cHh9LmNvbnRhaW5lci1zbXttYXgtd2lkdGg6ODQ4cHh9LmNvbnRhaW5lciAuY29udGFpbmVyLXNte21heC13aWR0aDo4MDBweDtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LnNjcmVlbi1yZWFkZXItdGV4dHtjbGlwOnJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtwb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O2hlaWdodDoxcHg7d2lkdGg6MXB4O292ZXJmbG93OmhpZGRlbjt3b3JkLXdyYXA6bm9ybWFsICFpbXBvcnRhbnR9LnNjcmVlbi1yZWFkZXItdGV4dDpmb2N1c3tib3JkZXItcmFkaXVzOjJweDtib3gtc2hhZG93OjAgMCAycHggMnB4IHJnYmEoMCwwLDAsMC42KTtjbGlwOmF1dG8gIWltcG9ydGFudDtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxNHB4O2xldHRlci1zcGFjaW5nOjBweDtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7YmFja2dyb3VuZC1jb2xvcjojMUQyMDI2O2NvbG9yOiMwMjcwRDcgIWltcG9ydGFudDtib3JkZXI6bm9uZTtoZWlnaHQ6YXV0bztsZWZ0OjhweDtwYWRkaW5nOjE2cHggMzJweDt0b3A6OHB4O3dpZHRoOmF1dG87ei1pbmRleDoxMDAwMDB9Lmxpc3QtcmVzZXR7bGlzdC1zdHlsZTpub25lO3BhZGRpbmc6MH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LnRleHQtcmlnaHR7dGV4dC1hbGlnbjpyaWdodH0udGV4dC1wcmltYXJ5e2NvbG9yOiMwMjcwRDd9Lmhhcy10b3AtZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uaGFzLXRvcC1kaXZpZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjQyODMwfS5oYXMtYm90dG9tLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy1ib3R0b20tZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMjQyODMwfS5tLTB7bWFyZ2luOjB9Lm10LTB7bWFyZ2luLXRvcDowfS5tci0we21hcmdpbi1yaWdodDowfS5tYi0we21hcmdpbi1ib3R0b206MH0ubWwtMHttYXJnaW4tbGVmdDowfS5tLTh7bWFyZ2luOjhweH0ubXQtOHttYXJnaW4tdG9wOjhweH0ubXItOHttYXJnaW4tcmlnaHQ6OHB4fS5tYi04e21hcmdpbi1ib3R0b206OHB4fS5tbC04e21hcmdpbi1sZWZ0OjhweH0ubS0xNnttYXJnaW46MTZweH0ubXQtMTZ7bWFyZ2luLXRvcDoxNnB4fS5tci0xNnttYXJnaW4tcmlnaHQ6MTZweH0ubWItMTZ7bWFyZ2luLWJvdHRvbToxNnB4fS5tbC0xNnttYXJnaW4tbGVmdDoxNnB4fS5tLTI0e21hcmdpbjoyNHB4fS5tdC0yNHttYXJnaW4tdG9wOjI0cHh9Lm1yLTI0e21hcmdpbi1yaWdodDoyNHB4fS5tYi0yNHttYXJnaW4tYm90dG9tOjI0cHh9Lm1sLTI0e21hcmdpbi1sZWZ0OjI0cHh9Lm0tMzJ7bWFyZ2luOjMycHh9Lm10LTMye21hcmdpbi10b3A6MzJweH0ubXItMzJ7bWFyZ2luLXJpZ2h0OjMycHh9Lm1iLTMye21hcmdpbi1ib3R0b206MzJweH0ubWwtMzJ7bWFyZ2luLWxlZnQ6MzJweH0ubS00MHttYXJnaW46NDBweH0ubXQtNDB7bWFyZ2luLXRvcDo0MHB4fS5tci00MHttYXJnaW4tcmlnaHQ6NDBweH0ubWItNDB7bWFyZ2luLWJvdHRvbTo0MHB4fS5tbC00MHttYXJnaW4tbGVmdDo0MHB4fS5tLTQ4e21hcmdpbjo0OHB4fS5tdC00OHttYXJnaW4tdG9wOjQ4cHh9Lm1yLTQ4e21hcmdpbi1yaWdodDo0OHB4fS5tYi00OHttYXJnaW4tYm90dG9tOjQ4cHh9Lm1sLTQ4e21hcmdpbi1sZWZ0OjQ4cHh9Lm0tNTZ7bWFyZ2luOjU2cHh9Lm10LTU2e21hcmdpbi10b3A6NTZweH0ubXItNTZ7bWFyZ2luLXJpZ2h0OjU2cHh9Lm1iLTU2e21hcmdpbi1ib3R0b206NTZweH0ubWwtNTZ7bWFyZ2luLWxlZnQ6NTZweH0ubS02NHttYXJnaW46NjRweH0ubXQtNjR7bWFyZ2luLXRvcDo2NHB4fS5tci02NHttYXJnaW4tcmlnaHQ6NjRweH0ubWItNjR7bWFyZ2luLWJvdHRvbTo2NHB4fS5tbC02NHttYXJnaW4tbGVmdDo2NHB4fS5wLTB7cGFkZGluZzowfS5wdC0we3BhZGRpbmctdG9wOjB9LnByLTB7cGFkZGluZy1yaWdodDowfS5wYi0we3BhZGRpbmctYm90dG9tOjB9LnBsLTB7cGFkZGluZy1sZWZ0OjB9LnAtOHtwYWRkaW5nOjhweH0ucHQtOHtwYWRkaW5nLXRvcDo4cHh9LnByLTh7cGFkZGluZy1yaWdodDo4cHh9LnBiLTh7cGFkZGluZy1ib3R0b206OHB4fS5wbC04e3BhZGRpbmctbGVmdDo4cHh9LnAtMTZ7cGFkZGluZzoxNnB4fS5wdC0xNntwYWRkaW5nLXRvcDoxNnB4fS5wci0xNntwYWRkaW5nLXJpZ2h0OjE2cHh9LnBiLTE2e3BhZGRpbmctYm90dG9tOjE2cHh9LnBsLTE2e3BhZGRpbmctbGVmdDoxNnB4fS5wLTI0e3BhZGRpbmc6MjRweH0ucHQtMjR7cGFkZGluZy10b3A6MjRweH0ucHItMjR7cGFkZGluZy1yaWdodDoyNHB4fS5wYi0yNHtwYWRkaW5nLWJvdHRvbToyNHB4fS5wbC0yNHtwYWRkaW5nLWxlZnQ6MjRweH0ucC0zMntwYWRkaW5nOjMycHh9LnB0LTMye3BhZGRpbmctdG9wOjMycHh9LnByLTMye3BhZGRpbmctcmlnaHQ6MzJweH0ucGItMzJ7cGFkZGluZy1ib3R0b206MzJweH0ucGwtMzJ7cGFkZGluZy1sZWZ0OjMycHh9LnAtNDB7cGFkZGluZzo0MHB4fS5wdC00MHtwYWRkaW5nLXRvcDo0MHB4fS5wci00MHtwYWRkaW5nLXJpZ2h0OjQwcHh9LnBiLTQwe3BhZGRpbmctYm90dG9tOjQwcHh9LnBsLTQwe3BhZGRpbmctbGVmdDo0MHB4fS5wLTQ4e3BhZGRpbmc6NDhweH0ucHQtNDh7cGFkZGluZy10b3A6NDhweH0ucHItNDh7cGFkZGluZy1yaWdodDo0OHB4fS5wYi00OHtwYWRkaW5nLWJvdHRvbTo0OHB4fS5wbC00OHtwYWRkaW5nLWxlZnQ6NDhweH0ucC01NntwYWRkaW5nOjU2cHh9LnB0LTU2e3BhZGRpbmctdG9wOjU2cHh9LnByLTU2e3BhZGRpbmctcmlnaHQ6NTZweH0ucGItNTZ7cGFkZGluZy1ib3R0b206NTZweH0ucGwtNTZ7cGFkZGluZy1sZWZ0OjU2cHh9LnAtNjR7cGFkZGluZzo2NHB4fS5wdC02NHtwYWRkaW5nLXRvcDo2NHB4fS5wci02NHtwYWRkaW5nLXJpZ2h0OjY0cHh9LnBiLTY0e3BhZGRpbmctYm90dG9tOjY0cHh9LnBsLTY0e3BhZGRpbmctbGVmdDo2NHB4fS5zciAuaGFzLWFuaW1hdGlvbnMgLmlzLXJldmVhbGluZ3t2aXNpYmlsaXR5OmhpZGRlbn0uaGFzLWFuaW1hdGlvbnMgLmFuaW1lLWVsZW1lbnR7dmlzaWJpbGl0eTpoaWRkZW59LmFuaW1lLXJlYWR5IC5oYXMtYW5pbWF0aW9ucyAuYW5pbWUtZWxlbWVudHt2aXNpYmlsaXR5OnZpc2libGV9LmlucHV0LC50ZXh0YXJlYXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiMyNDI4MzA7Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6IzhBOTRBNzttYXgtd2lkdGg6MTAwJTt3aWR0aDoxMDAlfS5pbnB1dDo6cGxhY2Vob2xkZXIsLnRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojM0I0MDRDfS5pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC50ZXh0YXJlYTo6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiMzQjQwNEN9LmlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwudGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiMzQjQwNEN9LmlucHV0OmhvdmVyLC50ZXh0YXJlYTpob3Zlcntib3JkZXItY29sb3I6IzE5MWMyMX0uaW5wdXQ6YWN0aXZlLC5pbnB1dDpmb2N1cywudGV4dGFyZWE6YWN0aXZlLC50ZXh0YXJlYTpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiMyNDI4MzB9LmlucHV0W2Rpc2FibGVkXSwudGV4dGFyZWFbZGlzYWJsZWRde2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiMxRDIwMjY7Ym9yZGVyLWNvbG9yOiMxRDIwMjZ9LmlucHV0ey1tb3otYXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2ZvbnQtc2l6ZToxNnB4O2xldHRlci1zcGFjaW5nOi0wLjFweDtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MTNweCAxNnB4O2hlaWdodDo0OHB4O2JveC1zaGFkb3c6bm9uZX0uaW5wdXQgLmlubGluZS1pbnB1dHtkaXNwbGF5OmlubGluZTt3aWR0aDphdXRvfS50ZXh0YXJlYXtkaXNwbGF5OmJsb2NrO21pbi13aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbH0udGV4dGFyZWEgLmlubGluZS10ZXh0YXJlYXtkaXNwbGF5OmlubGluZTt3aWR0aDphdXRvfS5maWVsZC1ncm91cGVkPi5jb250cm9sOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTo4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuZmllbGQtZ3JvdXBlZHtkaXNwbGF5OmZsZXh9LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2x7ZmxleC1zaHJpbms6MH0uZmllbGQtZ3JvdXBlZD4uY29udHJvbC5jb250cm9sLWV4cGFuZGVke2ZsZXgtZ3JvdzoxO2ZsZXgtc2hyaW5rOjF9LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2w6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXJpZ2h0OjhweH19LmJ1dHRvbntkaXNwbGF5OmlubGluZS1mbGV4O2ZvbnQtc2l6ZToxNHB4O2xldHRlci1zcGFjaW5nOjBweDtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtiYWNrZ3JvdW5kLWNvbG9yOiMyNDI4MzA7Y29sb3I6I2ZmZiAhaW1wb3J0YW50O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzoxNnB4IDMycHg7aGVpZ2h0OjQ4cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5idXR0b246aG92ZXJ7YmFja2dyb3VuZDojMjYyYTMzfS5idXR0b246YWN0aXZle291dGxpbmU6MH0uYnV0dG9uOjpiZWZvcmV7Ym9yZGVyLXJhZGl1czoycHh9LmJ1dHRvbi1zbXtwYWRkaW5nOjhweCAyNHB4O2hlaWdodDozMnB4fS5idXR0b24tcHJpbWFyeXtiYWNrZ3JvdW5kOiMwOTdkZWE7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoNjVkZWcsICMwMjcwRDcgMCwgIzBGOEFGRCAxMDAlKX0uYnV0dG9uLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZDojMDk4MmY0O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDY1ZGVnLCAjMDI3NWUxIDAsICMxOThmZmQgMTAwJSl9LmJ1dHRvbi1ibG9ja3tkaXNwbGF5OmZsZXh9LmJ1dHRvbi1ibG9ja3tkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJX1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5idXR0b24td2lkZS1tb2JpbGV7d2lkdGg6MTAwJTttYXgtd2lkdGg6MjgwcHh9fS5zaXRlLWhlYWRlcntwYWRkaW5nOjI0cHggMH0uc2l0ZS1oZWFkZXItaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcn0uaGVhZGVyLWxpbmtze2Rpc3BsYXk6aW5saW5lLWZsZXh9LmhlYWRlci1saW5rcyBsaXtkaXNwbGF5OmlubGluZS1mbGV4fS5oZWFkZXItbGlua3MgYTpub3QoLmJ1dHRvbil7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDtsZXR0ZXItc3BhY2luZzotMC4xcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOiM4QTk0QTc7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0OjE2cHg7cGFkZGluZzo4cHggMjRweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5zaXRlLWhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uc2l0ZS1oZWFkZXI6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDo3MDBweDtiYWNrZ3JvdW5kOiMyNDI4MzA7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoODBkZWcsIHJnYmEoMzYsNDAsNDgsMC41KSAwJSwgcmdiYSgzNiw0MCw0OCwwKSAxMDAlKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46MDt0cmFuc2Zvcm0tb3JpZ2luOjA7LXdlYmtpdC10cmFuc2Zvcm06c2tld1koLTEyZGVnKTt0cmFuc2Zvcm06c2tld1koLTEyZGVnKX19Lmhlcm97dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo4OHB4fS5oZXJvLWNvcHl7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxfS5oZXJvLWN0YXttYXJnaW4tYm90dG9tOjQwcHh9Lmhlcm8tZmlndXJle3Bvc2l0aW9uOnJlbGF0aXZlfS5oZXJvLWZpZ3VyZSBzdmd7d2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30uaGVyby1maWd1cmU6OmJlZm9yZSwuaGVyby1maWd1cmU6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZToxMDAlfS5oYXMtYW5pbWF0aW9ucyAuaGVyby1maWd1cmU6OmJlZm9yZSwuaGFzLWFuaW1hdGlvbnMgLmhlcm8tZmlndXJlOjphZnRlcntvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDJzIGVhc2V9LmFuaW1lLXJlYWR5IC5oYXMtYW5pbWF0aW9ucyAuaGVyby1maWd1cmU6OmJlZm9yZSwuYW5pbWUtcmVhZHkgLmhhcy1hbmltYXRpb25zIC5oZXJvLWZpZ3VyZTo6YWZ0ZXJ7b3BhY2l0eToxfS5oZXJvLWZpZ3VyZTo6YmVmb3Jle3RvcDotNTcuOCU7bGVmdDotMS4zJTt3aWR0aDoxNTIuODQlO2hlaWdodDoxNzguNzglO2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2hlcm8tYmFjay1pbGx1c3RyYXRpb24uc3ZnXCIpfS5oZXJvLWZpZ3VyZTo6YWZ0ZXJ7dG9wOi0zNS42JTtsZWZ0Ojk5LjYlO3dpZHRoOjU3LjIlO2hlaWdodDo4Ny44OCU7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIuLi9pbWFnZXMvaGVyby10b3AtaWxsdXN0cmF0aW9uLnN2Z1wiKX0uaGVyby1maWd1cmUtYm94e3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0uaGVyby1maWd1cmUtYm94LTAxLC5oZXJvLWZpZ3VyZS1ib3gtMDIsLmhlcm8tZmlndXJlLWJveC0wMywuaGVyby1maWd1cmUtYm94LTA0LC5oZXJvLWZpZ3VyZS1ib3gtMDgsLmhlcm8tZmlndXJlLWJveC0wOXtvdmVyZmxvdzpoaWRkZW59Lmhlcm8tZmlndXJlLWJveC0wMTo6YmVmb3JlLC5oZXJvLWZpZ3VyZS1ib3gtMDI6OmJlZm9yZSwuaGVyby1maWd1cmUtYm94LTAzOjpiZWZvcmUsLmhlcm8tZmlndXJlLWJveC0wNDo6YmVmb3JlLC5oZXJvLWZpZ3VyZS1ib3gtMDg6OmJlZm9yZSwuaGVyby1maWd1cmUtYm94LTA5OjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJX0uaGVyby1maWd1cmUtYm94LTAxe2xlZnQ6MTAzLjIlO3RvcDo0MS45JTt3aWR0aDoyOC4wMyU7aGVpZ2h0OjM3LjM3JTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0IHRvcCwgIzAwQkZGQiwgcmdiYSgwLDE5MSwyNTEsMCkpO3RyYW5zZm9ybTpyb3RhdGVaKDQ1ZGVnKX0uaGVyby1maWd1cmUtYm94LTAxOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgIzE1MTgxRCAwJSwgcmdiYSgyMSwyNCwyOSwwKSA2MCUpO3RyYW5zZm9ybTpyb3RhdGVaKDQ1ZGVnKSBzY2FsZSgxLjUpfS5oZXJvLWZpZ3VyZS1ib3gtMDJ7bGVmdDo2MS4zJTt0b3A6NjQuMSU7d2lkdGg6MzcuODclO2hlaWdodDo1MC41MCU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCB0b3AsICMwMjcwRDcsIHJnYmEoMiwxMTIsMjE1LDApKTt0cmFuc2Zvcm06cm90YXRlWigtNDVkZWcpfS5oZXJvLWZpZ3VyZS1ib3gtMDI6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byB0b3AsICMxNTE4MUQgMCUsIHJnYmEoMjEsMjQsMjksMCkgNjAlKTt0cmFuc2Zvcm06cm90YXRlWigtNDVkZWcpIHNjYWxlKDEuNSl9Lmhlcm8tZmlndXJlLWJveC0wM3tsZWZ0Ojg3LjclO3RvcDotNTYuOCU7d2lkdGg6NTYuODElO2hlaWdodDo3NS43NSU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCB0b3AsICMwMEJGRkIsIHJnYmEoMCwxOTEsMjUxLDApKX0uaGVyby1maWd1cmUtYm94LTAzOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgIzE1MTgxRCAwJSwgcmdiYSgyMSwyNCwyOSwwKSA2MCUpO3RyYW5zZm9ybTpyb3RhdGVaKDQ1ZGVnKSBzY2FsZSgxLjUpfS5oZXJvLWZpZ3VyZS1ib3gtMDR7bGVmdDo1NC45JTt0b3A6LTglO3dpZHRoOjQ1LjQ1JTtoZWlnaHQ6NjAuNjAlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQgdG9wLCAjMDI3MEQ3LCByZ2JhKDIsMTEyLDIxNSwwKSk7dHJhbnNmb3JtOnJvdGF0ZVooLTEzNWRlZyl9Lmhlcm8tZmlndXJlLWJveC0wNDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHRvcCwgcmdiYSgyNTUsMjU1LDI1NSwwLjI0KSAwJSwgcmdiYSgyNTUsMjU1LDI1NSwwKSA2MCUpO3RyYW5zZm9ybTpyb3RhdGVaKC00NWRlZykgc2NhbGUoMS41KX0uaGVyby1maWd1cmUtYm94LTA1LC5oZXJvLWZpZ3VyZS1ib3gtMDYsLmhlcm8tZmlndXJlLWJveC0wN3tiYWNrZ3JvdW5kLWNvbG9yOiMyNDI4MzA7Ym94LXNoYWRvdzotMjBweCAzMnB4IDY0cHggcmdiYSgwLDAsMCwwLjI1KX0uaGVyby1maWd1cmUtYm94LTA1e2xlZnQ6MTcuNCU7dG9wOjEzLjMlO3dpZHRoOjY0JTtoZWlnaHQ6NzMuNyU7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDUwMHB4KSByb3RhdGVZKC0xNWRlZykgcm90YXRlWCg4ZGVnKSByb3RhdGVaKC0xZGVnKX0uaGVyby1maWd1cmUtYm94LTA2e2xlZnQ6NjUuNSU7dG9wOjYuMyU7d2lkdGg6MzAuMyU7aGVpZ2h0OjQwLjQlO3RyYW5zZm9ybTpyb3RhdGVaKDIwZGVnKX0uaGVyby1maWd1cmUtYm94LTA3e2xlZnQ6MS45JTt0b3A6NDIuNCU7d2lkdGg6MTIuMTIlO2hlaWdodDoxNi4xNiU7dHJhbnNmb3JtOnJvdGF0ZVooMjBkZWcpfS5oZXJvLWZpZ3VyZS1ib3gtMDh7bGVmdDoyNy4xJTt0b3A6ODEuNiU7d2lkdGg6MTkuNTElO2hlaWdodDoyNi4wMSU7YmFja2dyb3VuZDojMDI3MEQ3O3RyYW5zZm9ybTpyb3RhdGVaKC0yMmRlZyl9Lmhlcm8tZmlndXJlLWJveC0wODo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjU1LDI1NSwyNTUsMCkgMCUsIHJnYmEoMjU1LDI1NSwyNTUsMC40OCkgMTAwJSk7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpIHNjYWxlKDEuNSl9Lmhlcm8tZmlndXJlLWJveC0wOXtsZWZ0OjQyLjYlO3RvcDotMTcuOSU7d2lkdGg6Ni42MyU7aGVpZ2h0OjguODMlO2JhY2tncm91bmQ6IzAwQkZGQjt0cmFuc2Zvcm06cm90YXRlWigtNTJkZWcpfS5oZXJvLWZpZ3VyZS1ib3gtMDk6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDI1NSwyNTUsMjU1LDApIDAlLCByZ2JhKDI1NSwyNTUsMjU1LDAuNjQpIDEwMCUpO3RyYW5zZm9ybTpyb3RhdGVaKDQ1ZGVnKSBzY2FsZSgxLjUpfS5oZXJvLWZpZ3VyZS1ib3gtMTB7bGVmdDotMy44JTt0b3A6NC4zJTt3aWR0aDozLjAzJTtoZWlnaHQ6NC4wNCU7YmFja2dyb3VuZDpyZ2JhKDAsMTkxLDI1MSwwLjMyKTt0cmFuc2Zvcm06cm90YXRlWigtNTBkZWcpfUBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCl7Lmhlcm8tY3Rhe21heC13aWR0aDoyODBweDttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS5oZXJvLWN0YSAuYnV0dG9ue2Rpc3BsYXk6ZmxleH0uaGVyby1jdGEgLmJ1dHRvbisuYnV0dG9ue21hcmdpbi10b3A6MTZweH0uaGVyby1maWd1cmU6OmFmdGVyLC5oZXJvLWZpZ3VyZS1ib3gtMDMsLmhlcm8tZmlndXJlLWJveC0wNCwuaGVyby1maWd1cmUtYm94LTA5e2Rpc3BsYXk6bm9uZX19QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuaGVyb3t0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZy10b3A6NjRweDtwYWRkaW5nLWJvdHRvbTo4OHB4fS5oZXJvLWlubmVye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXJ9Lmhlcm8tY29weXtwYWRkaW5nLXJpZ2h0OjY0cHg7bWluLXdpZHRoOjU1MnB4O3dpZHRoOjU1MnB4fS5oZXJvLWN0YXttYXJnaW46MH0uaGVyby1jdGEgLmJ1dHRvbnttaW4td2lkdGg6MTcwcHh9Lmhlcm8tY3RhIC5idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjE2cHh9Lmhlcm8tZmlndXJlIHN2Z3t3aWR0aDphdXRvfX0uZmVhdHVyZXMtd3JhcHtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7anVzdGlmeS1jb250ZW50OnNwYWNlLWV2ZW5seTttYXJnaW4tcmlnaHQ6LTMycHg7bWFyZ2luLWxlZnQ6LTMycHh9LmZlYXR1cmVzLXdyYXA6Zmlyc3Qtb2YtdHlwZXttYXJnaW4tdG9wOi0xNnB4fS5mZWF0dXJlcy13cmFwOmxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOi0xNnB4fS5mZWF0dXJle3BhZGRpbmc6MTZweCAzMnB4O3dpZHRoOjM4MHB4O21heC13aWR0aDozODBweDtmbGV4LWdyb3c6MX0uZmVhdHVyZS1pbm5lcntoZWlnaHQ6MTAwJX0uZmVhdHVyZS1pY29ue2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LmZlYXR1cmVzLXdyYXA6Zmlyc3Qtb2YtdHlwZXttYXJnaW4tdG9wOi0yNHB4fS5mZWF0dXJlcy13cmFwOmxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOi0yNHB4fS5mZWF0dXJle3BhZGRpbmc6MzJweCAzMnB4fX0ucHJpY2luZy1oZWFkZXJ7bWFyZ2luLWJvdHRvbTo0OHB4fS5wcmljaW5nLXRhYmxlcy13cmFwe2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1yaWdodDotMTJweDttYXJnaW4tbGVmdDotMTJweH0ucHJpY2luZy10YWJsZXMtd3JhcDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOi0xMnB4fS5wcmljaW5nLXRhYmxlcy13cmFwOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTotMTJweH0ucHJpY2luZy10YWJsZXtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjEycHg7d2lkdGg6MzY4cHg7bWF4LXdpZHRoOjM2OHB4O2ZsZXgtZ3JvdzoxfS5wcmljaW5nLXRhYmxlOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt3aWR0aDoyMDAlO21heC13aWR0aDoyMDAlO2hlaWdodDo0MzVweDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7YmFja2dyb3VuZC1zaXplOjEwMCU7Ym90dG9tOjE4LjglOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSk7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIuLi9pbWFnZXMvcHJpY2luZy1pbGx1c3RyYXRpb24uc3ZnXCIpfS5wcmljaW5nLXRhYmxlLWhlYWRlciwucHJpY2luZy10YWJsZS1mZWF0dXJlcy10aXRsZSwucHJpY2luZy10YWJsZS1mZWF0dXJlcyBsaXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDEzOCwxNDgsMTY3LDAuMjQpfS5wcmljaW5nLXRhYmxlLWlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtiYWNrZ3JvdW5kOiMyQzMwMzk7cGFkZGluZzoyNHB4O2hlaWdodDoxMDAlfS5wcmljaW5nLXRhYmxlLWlubmVyPip7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJX0ucHJpY2luZy10YWJsZS1pbm5lcjo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7Ym94LXNoYWRvdzowIDI0cHggNDhweCByZ2JhKDIxLDI0LDI5LDAuMjQpO21peC1ibGVuZC1tb2RlOm11bHRpcGx5fS5wcmljaW5nLXRhYmxlLXByaWNlLWN1cnJlbmN5e2NvbG9yOiM4QTk0QTd9LnByaWNpbmctdGFibGUtZmVhdHVyZXMtdGl0bGV7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo3MDB9LnByaWNpbmctdGFibGUtZmVhdHVyZXMgbGl7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjE0cHggMH0ucHJpY2luZy10YWJsZS1mZWF0dXJlcyBsaTo6YmVmb3Jle2NvbnRlbnQ6Jyc7d2lkdGg6MTZweDtoZWlnaHQ6MTJweDttYXJnaW4tcmlnaHQ6MTZweDtiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIzYVdSMGFEMGlNVFlpSUdobGFXZG9kRDBpTVRJaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJK1BIQmhkR2dnWkQwaVRUVXVOaUEyTGpSTU1TNDJJRFFnTUNBMUxqWWdOUzQySURFeUlERTJJREV1TmlBeE5DNDBJREI2SWlCbWFXeHNQU0lqTURKRFFrSXhJaUJtYVd4c0xYSjFiR1U5SW1WMlpXNXZaR1FpTHo0OEwzTjJaejQ9KTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LnByaWNpbmctdGFibGUtY3Rhe2FsaWduLXNlbGY6ZmxleC1lbmR9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsucHJpY2luZyAuc2VjdGlvbi1wYXJhZ3JhcGh7cGFkZGluZy1sZWZ0OjkwcHg7cGFkZGluZy1yaWdodDo5MHB4fS5wcmljaW5nLWhlYWRlcnttYXJnaW4tYm90dG9tOjUycHh9fS5jdGF7dGV4dC1hbGlnbjpjZW50ZXJ9LmN0YSAuc2VjdGlvbi1pbm5lcntwYWRkaW5nOjQ4cHggMTZweH0uY3RhIC5zZWN0aW9uLXRpdGxle21hcmdpbi1ib3R0b206NDBweH0uY3RhLWlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6IzE1MTgxRDtvdmVyZmxvdzpoaWRkZW59LmN0YS1pbm5lcjo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6OThweDt0b3A6LTExN3B4O3dpZHRoOjE2MHB4O2hlaWdodDoxODdweDtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi4uL2ltYWdlcy9jdGEtaWxsdXN0cmF0aW9uLnN2Z1wiKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LmN0YS1pbm5lcj4qe3Bvc2l0aW9uOnJlbGF0aXZlfUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LmN0YXt0ZXh0LWFsaWduOmxlZnR9LmN0YSAuc2VjdGlvbi1pbm5lcntwYWRkaW5nOjY0cHggMzJweH0uY3RhIC5zZWN0aW9uLXRpdGxle21hcmdpbi1ib3R0b206MDtwYWRkaW5nLXJpZ2h0OjI0cHh9LmN0YS1pbm5lcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufX0uaXMtYm94ZWR7YmFja2dyb3VuZDojMjQyODMwfS5ib2R5LXdyYXB7YmFja2dyb3VuZDojMUQyMDI2O292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi1oZWlnaHQ6MTAwdmh9LmJveGVkLWNvbnRhaW5lcnttYXgtd2lkdGg6MTQ0MHB4O21hcmdpbjowIGF1dG87Ym94LXNoYWRvdzowIDI0cHggNDhweCByZ2JhKDIxLDI0LDI5LDAuMjQpO21peC1ibGVuZC1tb2RlOm11bHRpcGx5O21peC1ibGVuZC1tb2RlOm5vcm1hbH1tYWlue2ZsZXg6MSAwIGF1dG99LnNlY3Rpb24taW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNlY3Rpb24taW5uZXJ7cGFkZGluZy10b3A6ODhweDtwYWRkaW5nLWJvdHRvbTo4OHB4fX0uc2l0ZS1mb290ZXJ7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjJweDtsZXR0ZXItc3BhY2luZzowcHh9LnNpdGUtZm9vdGVyIGF7Y29sb3I6IzhBOTRBNzt0ZXh0LWRlY29yYXRpb246bm9uZX0uc2l0ZS1mb290ZXIgYTpob3Zlciwuc2l0ZS1mb290ZXIgYTphY3RpdmV7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uc2l0ZS1mb290ZXItaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO3BhZGRpbmctdG9wOjQ4cHg7cGFkZGluZy1ib3R0b206NDhweH0uZm9vdGVyLWJyYW5kLC5mb290ZXItbGlua3MsLmZvb3Rlci1zb2NpYWwtbGlua3MsLmZvb3Rlci1jb3B5cmlnaHR7ZmxleDpub25lO3dpZHRoOjEwMCU7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5mb290ZXItYnJhbmQsLmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rc3ttYXJnaW4tYm90dG9tOjI0cHh9LmZvb3Rlci1zb2NpYWwtbGlua3MgbGl7ZGlzcGxheTppbmxpbmUtZmxleH0uZm9vdGVyLXNvY2lhbC1saW5rcyBsaStsaXttYXJnaW4tbGVmdDoxNnB4fS5mb290ZXItc29jaWFsLWxpbmtzIGxpIGF7cGFkZGluZzo4cHh9LmZvb3Rlci1saW5rcyBsaStsaXttYXJnaW4tbGVmdDoyNHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpdGUtZm9vdGVye21hcmdpbi10b3A6MjBweH0uc2l0ZS1mb290ZXItaW5uZXJ7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZy10b3A6NjRweDtwYWRkaW5nLWJvdHRvbTo2NHB4fS5mb290ZXItYnJhbmQsLmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rcywuZm9vdGVyLWNvcHlyaWdodHtmbGV4OjUwJX0uZm9vdGVyLWJyYW5kLC5mb290ZXItY29weXJpZ2h0e2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5mb290ZXItbGlua3MsLmZvb3Rlci1zb2NpYWwtbGlua3N7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5mb290ZXItbGlua3N7b3JkZXI6MTttYXJnaW4tYm90dG9tOjB9fVxuIl19 */ \ No newline at end of file diff --git a/API/static/images/cta-illustration.svg b/API/static/images/cta-illustration.svg new file mode 100644 index 0000000..c46d2f3 --- /dev/null +++ b/API/static/images/cta-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/feature-icon-01.svg b/API/static/images/feature-icon-01.svg new file mode 100644 index 0000000..6054299 --- /dev/null +++ b/API/static/images/feature-icon-01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/feature-icon-02.svg b/API/static/images/feature-icon-02.svg new file mode 100644 index 0000000..62b1193 --- /dev/null +++ b/API/static/images/feature-icon-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/feature-icon-03.svg b/API/static/images/feature-icon-03.svg new file mode 100644 index 0000000..ef197c0 --- /dev/null +++ b/API/static/images/feature-icon-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/feature-icon-04.svg b/API/static/images/feature-icon-04.svg new file mode 100644 index 0000000..1ca34e7 --- /dev/null +++ b/API/static/images/feature-icon-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/feature-icon-05.svg b/API/static/images/feature-icon-05.svg new file mode 100644 index 0000000..43b4904 --- /dev/null +++ b/API/static/images/feature-icon-05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/feature-icon-06.svg b/API/static/images/feature-icon-06.svg new file mode 100644 index 0000000..38165e7 --- /dev/null +++ b/API/static/images/feature-icon-06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/hero-back-illustration.svg b/API/static/images/hero-back-illustration.svg new file mode 100644 index 0000000..8f0d151 --- /dev/null +++ b/API/static/images/hero-back-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/hero-top-illustration.svg b/API/static/images/hero-top-illustration.svg new file mode 100644 index 0000000..d391cb7 --- /dev/null +++ b/API/static/images/hero-top-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/logo.svg b/API/static/images/logo.svg new file mode 100644 index 0000000..e2e655c --- /dev/null +++ b/API/static/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/images/pricing-illustration.svg b/API/static/images/pricing-illustration.svg new file mode 100644 index 0000000..982f983 --- /dev/null +++ b/API/static/images/pricing-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/API/static/js/main.js b/API/static/js/main.js new file mode 100644 index 0000000..8e57c8d --- /dev/null +++ b/API/static/js/main.js @@ -0,0 +1,71 @@ +(function () { + const win = window + const doc = document.documentElement + + doc.classList.remove('no-js') + doc.classList.add('js') + + // Reveal animations + if (document.body.classList.contains('has-animations')) { + /* global ScrollReveal */ + const sr = window.sr = ScrollReveal() + + sr.reveal('.feature, .pricing-table-inner', { + duration: 600, + distance: '20px', + easing: 'cubic-bezier(0.5, -0.01, 0, 1.005)', + origin: 'bottom', + interval: 100 + }) + + doc.classList.add('anime-ready') + /* global anime */ + anime.timeline({ + targets: '.hero-figure-box-05' + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: [0.05, 0.05], + scaleY: [0, 1], + perspective: '500px', + delay: anime.random(0, 400) + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: 1 + }).add({ + duration: 800, + rotateY: '-15deg', + rotateX: '8deg', + rotateZ: '-1deg' + }) + + anime.timeline({ + targets: '.hero-figure-box-06, .hero-figure-box-07' + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: [0.05, 0.05], + scaleY: [0, 1], + perspective: '500px', + delay: anime.random(0, 400) + }).add({ + duration: 400, + easing: 'easeInOutExpo', + scaleX: 1 + }).add({ + duration: 800, + rotateZ: '20deg' + }) + + anime({ + targets: '.hero-figure-box-01, .hero-figure-box-02, .hero-figure-box-03, .hero-figure-box-04, .hero-figure-box-08, .hero-figure-box-09, .hero-figure-box-10', + duration: anime.random(600, 800), + delay: anime.random(600, 800), + rotate: [ anime.random(-360, 360), function (el) { return el.getAttribute('data-rotation') } ], + scale: [0.7, 1], + opacity: [0, 1], + easing: 'easeInOutExpo' + }) + } +}()) diff --git a/API/static/js/main.min.js b/API/static/js/main.min.js new file mode 100644 index 0000000..71f079b --- /dev/null +++ b/API/static/js/main.min.js @@ -0,0 +1 @@ +!function(){window;const e=document.documentElement;if(e.classList.remove("no-js"),e.classList.add("js"),document.body.classList.contains("has-animations")){(window.sr=ScrollReveal()).reveal(".feature, .pricing-table-inner",{duration:600,distance:"20px",easing:"cubic-bezier(0.5, -0.01, 0, 1.005)",origin:"bottom",interval:100}),e.classList.add("anime-ready"),anime.timeline({targets:".hero-figure-box-05"}).add({duration:400,easing:"easeInOutExpo",scaleX:[.05,.05],scaleY:[0,1],perspective:"500px",delay:anime.random(0,400)}).add({duration:400,easing:"easeInOutExpo",scaleX:1}).add({duration:800,rotateY:"-15deg",rotateX:"8deg",rotateZ:"-1deg"}),anime.timeline({targets:".hero-figure-box-06, .hero-figure-box-07"}).add({duration:400,easing:"easeInOutExpo",scaleX:[.05,.05],scaleY:[0,1],perspective:"500px",delay:anime.random(0,400)}).add({duration:400,easing:"easeInOutExpo",scaleX:1}).add({duration:800,rotateZ:"20deg"}),anime({targets:".hero-figure-box-01, .hero-figure-box-02, .hero-figure-box-03, .hero-figure-box-04, .hero-figure-box-08, .hero-figure-box-09, .hero-figure-box-10",duration:anime.random(600,800),delay:anime.random(600,800),rotate:[anime.random(-360,360),function(e){return e.getAttribute("data-rotation")}],scale:[.7,1],opacity:[0,1],easing:"easeInOutExpo"})}}(); \ No newline at end of file diff --git a/API/static/scss/_normalize.scss b/API/static/scss/_normalize.scss new file mode 100644 index 0000000..8025dce --- /dev/null +++ b/API/static/scss/_normalize.scss @@ -0,0 +1,231 @@ +html { + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +figcaption, +figure, +main { + display: block; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: inherit; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +dfn { + font-style: italic; +} + +mark { + background-color: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +img { + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + display: inline-block; + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details, +menu { + display: block; +} + +summary { + display: list-item; +} + +canvas { + display: inline-block; +} + +template { + display: none; +} + +[hidden] { + display: none; +} \ No newline at end of file diff --git a/API/static/scss/abstracts/_functions.scss b/API/static/scss/abstracts/_functions.scss new file mode 100644 index 0000000..6aa6a1c --- /dev/null +++ b/API/static/scss/abstracts/_functions.scss @@ -0,0 +1,55 @@ +// -------------------------------------------------------------------- +// Retrieve Font Size ------------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-font-size($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 1); +} + +// -------------------------------------------------------------------- +// Retrieve Line Height ----------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-line-height($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 2); +} + +// -------------------------------------------------------------------- +// Retrieve Kerning --------------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-kerning($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 3); +} + +// -------------------------------------------------------------------- +// Retrieve Font Family ----------------------------------------------- +// Used in _mixins.scss [@mixin font-family] -------------------------- +// -------------------------------------------------------------------- +@function get-font-family($elem) { + @return map-get($font__family, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Font Weight ----------------------------------------------- +// Used in _mixins.scss [@mixin font-weight] -------------------------- +// -------------------------------------------------------------------- +@function get-font-weight($elem) { + @return map-get($font__weight, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Padding of Content Area Elements -------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-content-padding($elem) { + @return map-get($content__padding, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Colors ---------------------------------------------------- +// Usage: color(typography, 1) ---------------------------------------------- +// -------------------------------------------------------------------- +@function color($elem, $variant) { + @return map-get(map-get($color, $elem), $variant); +} diff --git a/API/static/scss/abstracts/_include-media.scss b/API/static/scss/abstracts/_include-media.scss new file mode 100644 index 0000000..bb5ccd5 --- /dev/null +++ b/API/static/scss/abstracts/_include-media.scss @@ -0,0 +1,567 @@ +@charset "UTF-8"; + +// _ _ _ _ _ +// (_) | | | | | (_) +// _ _ __ ___| |_ _ __| | ___ _ __ ___ ___ __| |_ __ _ +// | | '_ \ / __| | | | |/ _` |/ _ \ | '_ ` _ \ / _ \/ _` | |/ _` | +// | | | | | (__| | |_| | (_| | __/ | | | | | | __/ (_| | | (_| | +// |_|_| |_|\___|_|\__,_|\__,_|\___| |_| |_| |_|\___|\__,_|_|\__,_| +// +// Simple, elegant and maintainable media queries in Sass +// v1.4.9 +// +// http://include-media.com +// +// Authors: Eduardo Boucas (@eduardoboucas) +// Hugo Giraudel (@hugogiraudel) +// +// This project is licensed under the terms of the MIT license + + +//// +/// include-media library public configuration +/// @author Eduardo Boucas +/// @access public +//// + + +/// +/// Creates a list of global breakpoints +/// +/// @example scss - Creates a single breakpoint with the label `phone` +/// $breakpoints: ('phone': 320px); +/// +$breakpoints: ( + 'small': 480px, + 'medium': 640px, + 'large': 1024px, +) !default; + + +/// +/// Creates a list of static expressions or media types +/// +/// @example scss - Creates a single media type (screen) +/// $media-expressions: ('screen': 'screen'); +/// +/// @example scss - Creates a static expression with logical disjunction (OR operator) +/// $media-expressions: ( +/// 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)' +/// ); +/// +$media-expressions: ( + 'screen': 'screen', + 'print': 'print', + 'handheld': 'handheld', + 'landscape': '(orientation: landscape)', + 'portrait': '(orientation: portrait)', + 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx)', + 'retina3x': '(-webkit-min-device-pixel-ratio: 3), (min-resolution: 350dpi), (min-resolution: 3dppx)' +) !default; + + +/// +/// Defines a number to be added or subtracted from each unit when declaring breakpoints with exclusive intervals +/// +/// @example scss - Interval for pixels is defined as `1` by default +/// @include media('>128px') {} +/// +/// /* Generates: */ +/// @media (min-width: 129px) {} +/// +/// @example scss - Interval for ems is defined as `0.01` by default +/// @include media('>20em') {} +/// +/// /* Generates: */ +/// @media (min-width: 20.01em) {} +/// +/// @example scss - Interval for rems is defined as `0.1` by default, to be used with `font-size: 62.5%;` +/// @include media('>2.0rem') {} +/// +/// /* Generates: */ +/// @media (min-width: 2.1rem) {} +/// +$unit-intervals: ( + 'px': 1, + 'em': 0.01, + 'rem': 0.1, + '': 0 +) !default; + +/// +/// Defines whether support for media queries is available, useful for creating separate stylesheets +/// for browsers that don't support media queries. +/// +/// @example scss - Disables support for media queries +/// $im-media-support: false; +/// @include media('>=tablet') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +$im-media-support: true !default; + +/// +/// Selects which breakpoint to emulate when support for media queries is disabled. Media queries that start at or +/// intercept the breakpoint will be displayed, any others will be ignored. +/// +/// @example scss - This media query will show because it intercepts the static breakpoint +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// @include media('>=tablet') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +/// @example scss - This media query will NOT show because it does not intercept the desktop breakpoint +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'tablet'; +/// @include media('>=desktop') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* No output */ +/// +$im-no-media-breakpoint: 'desktop' !default; + +/// +/// Selects which media expressions are allowed in an expression for it to be used when media queries +/// are not supported. +/// +/// @example scss - This media query will show because it intercepts the static breakpoint and contains only accepted media expressions +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// $im-no-media-expressions: ('screen'); +/// @include media('>=tablet', 'screen') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +/// @example scss - This media query will NOT show because it intercepts the static breakpoint but contains a media expression that is not accepted +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// $im-no-media-expressions: ('screen'); +/// @include media('>=tablet', 'retina2x') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* No output */ +/// +$im-no-media-expressions: ('screen', 'portrait', 'landscape') !default; + +//// +/// Cross-engine logging engine +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Log a message either with `@error` if supported +/// else with `@warn`, using `feature-exists('at-error')` +/// to detect support. +/// +/// @param {String} $message - Message to log +/// +@function im-log($message) { + @if feature-exists('at-error') { + @error $message; + } @else { + @warn $message; + $_: noop(); + } + + @return $message; +} + + +/// +/// Wrapper mixin for the log function so it can be used with a more friendly +/// API than `@if im-log('..') {}` or `$_: im-log('..')`. Basically, use the function +/// within functions because it is not possible to include a mixin in a function +/// and use the mixin everywhere else because it's much more elegant. +/// +/// @param {String} $message - Message to log +/// +@mixin log($message) { + @if im-log($message) {} +} + + +/// +/// Function with no `@return` called next to `@warn` in Sass 3.3 +/// to trigger a compiling error and stop the process. +/// +@function noop() {} + +/// +/// Determines whether a list of conditions is intercepted by the static breakpoint. +/// +/// @param {Arglist} $conditions - Media query conditions +/// +/// @return {Boolean} - Returns true if the conditions are intercepted by the static breakpoint +/// +@function im-intercepts-static-breakpoint($conditions...) { + $no-media-breakpoint-value: map-get($breakpoints, $im-no-media-breakpoint); + + @if not $no-media-breakpoint-value { + @if im-log('`#{$im-no-media-breakpoint}` is not a valid breakpoint.') {} + } + + @each $condition in $conditions { + @if not map-has-key($media-expressions, $condition) { + $operator: get-expression-operator($condition); + $prefix: get-expression-prefix($operator); + $value: get-expression-value($condition, $operator); + + @if ($prefix == 'max' and $value <= $no-media-breakpoint-value) or + ($prefix == 'min' and $value > $no-media-breakpoint-value) { + @return false; + } + } @else if not index($im-no-media-expressions, $condition) { + @return false; + } + } + + @return true; +} + +//// +/// Parsing engine +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Get operator of an expression +/// +/// @param {String} $expression - Expression to extract operator from +/// +/// @return {String} - Any of `>=`, `>`, `<=`, `<`, `≥`, `≤` +/// +@function get-expression-operator($expression) { + @each $operator in ('>=', '>', '<=', '<', '≥', '≤') { + @if str-index($expression, $operator) { + @return $operator; + } + } + + // It is not possible to include a mixin inside a function, so we have to + // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because + // functions cannot be called anywhere in Sass, we need to hack the call in + // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with + // Sass 3.3, change this line in `@if im-log(..) {}` instead. + $_: im-log('No operator found in `#{$expression}`.'); +} + + +/// +/// Get dimension of an expression, based on a found operator +/// +/// @param {String} $expression - Expression to extract dimension from +/// @param {String} $operator - Operator from `$expression` +/// +/// @return {String} - `width` or `height` (or potentially anything else) +/// +@function get-expression-dimension($expression, $operator) { + $operator-index: str-index($expression, $operator); + $parsed-dimension: str-slice($expression, 0, $operator-index - 1); + $dimension: 'width'; + + @if str-length($parsed-dimension) > 0 { + $dimension: $parsed-dimension; + } + + @return $dimension; +} + + +/// +/// Get dimension prefix based on an operator +/// +/// @param {String} $operator - Operator +/// +/// @return {String} - `min` or `max` +/// +@function get-expression-prefix($operator) { + @return if(index(('<', '<=', '≤'), $operator), 'max', 'min'); +} + + +/// +/// Get value of an expression, based on a found operator +/// +/// @param {String} $expression - Expression to extract value from +/// @param {String} $operator - Operator from `$expression` +/// +/// @return {Number} - A numeric value +/// +@function get-expression-value($expression, $operator) { + $operator-index: str-index($expression, $operator); + $value: str-slice($expression, $operator-index + str-length($operator)); + + @if map-has-key($breakpoints, $value) { + $value: map-get($breakpoints, $value); + } @else { + $value: to-number($value); + } + + $interval: map-get($unit-intervals, unit($value)); + + @if not $interval { + // It is not possible to include a mixin inside a function, so we have to + // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because + // functions cannot be called anywhere in Sass, we need to hack the call in + // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with + // Sass 3.3, change this line in `@if im-log(..) {}` instead. + $_: im-log('Unknown unit `#{unit($value)}`.'); + } + + @if $operator == '>' { + $value: $value + $interval; + } @else if $operator == '<' { + $value: $value - $interval; + } + + @return $value; +} + + +/// +/// Parse an expression to return a valid media-query expression +/// +/// @param {String} $expression - Expression to parse +/// +/// @return {String} - Valid media query +/// +@function parse-expression($expression) { + // If it is part of $media-expressions, it has no operator + // then there is no need to go any further, just return the value + @if map-has-key($media-expressions, $expression) { + @return map-get($media-expressions, $expression); + } + + $operator: get-expression-operator($expression); + $dimension: get-expression-dimension($expression, $operator); + $prefix: get-expression-prefix($operator); + $value: get-expression-value($expression, $operator); + + @return '(#{$prefix}-#{$dimension}: #{$value})'; +} + +/// +/// Slice `$list` between `$start` and `$end` indexes +/// +/// @access private +/// +/// @param {List} $list - List to slice +/// @param {Number} $start [1] - Start index +/// @param {Number} $end [length($list)] - End index +/// +/// @return {List} Sliced list +/// +@function slice($list, $start: 1, $end: length($list)) { + @if length($list) < 1 or $start > $end { + @return (); + } + + $result: (); + + @for $i from $start through $end { + $result: append($result, nth($list, $i)); + } + + @return $result; +} + +//// +/// String to number converter +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Casts a string into a number +/// +/// @param {String | Number} $value - Value to be parsed +/// +/// @return {Number} +/// +@function to-number($value) { + @if type-of($value) == 'number' { + @return $value; + } @else if type-of($value) != 'string' { + $_: im-log('Value for `to-number` should be a number or a string.'); + } + + $first-character: str-slice($value, 1, 1); + $result: 0; + $digits: 0; + $minus: ($first-character == '-'); + $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9); + + // Remove +/- sign if present at first character + @if ($first-character == '+' or $first-character == '-') { + $value: str-slice($value, 2); + } + + @for $i from 1 through str-length($value) { + $character: str-slice($value, $i, $i); + + @if not (index(map-keys($numbers), $character) or $character == '.') { + @return to-length(if($minus, -$result, $result), str-slice($value, $i)) + } + + @if $character == '.' { + $digits: 1; + } @else if $digits == 0 { + $result: $result * 10 + map-get($numbers, $character); + } @else { + $digits: $digits * 10; + $result: $result + map-get($numbers, $character) / $digits; + } + } + + @return if($minus, -$result, $result); +} + + +/// +/// Add `$unit` to `$value` +/// +/// @param {Number} $value - Value to add unit to +/// @param {String} $unit - String representation of the unit +/// +/// @return {Number} - `$value` expressed in `$unit` +/// +@function to-length($value, $unit) { + $units: ('px': 1px, 'cm': 1cm, 'mm': 1mm, '%': 1%, 'ch': 1ch, 'pc': 1pc, 'in': 1in, 'em': 1em, 'rem': 1rem, 'pt': 1pt, 'ex': 1ex, 'vw': 1vw, 'vh': 1vh, 'vmin': 1vmin, 'vmax': 1vmax); + + @if not index(map-keys($units), $unit) { + $_: im-log('Invalid unit `#{$unit}`.'); + } + + @return $value * map-get($units, $unit); +} + +/// +/// This mixin aims at redefining the configuration just for the scope of +/// the call. It is helpful when having a component needing an extended +/// configuration such as custom breakpoints (referred to as tweakpoints) +/// for instance. +/// +/// @author Hugo Giraudel +/// +/// @param {Map} $tweakpoints [()] - Map of tweakpoints to be merged with `$breakpoints` +/// @param {Map} $tweak-media-expressions [()] - Map of tweaked media expressions to be merged with `$media-expression` +/// +/// @example scss - Extend the global breakpoints with a tweakpoint +/// @include media-context(('custom': 678px)) { +/// .foo { +/// @include media('>phone', '<=custom') { +/// // ... +/// } +/// } +/// } +/// +/// @example scss - Extend the global media expressions with a custom one +/// @include media-context($tweak-media-expressions: ('all': 'all')) { +/// .foo { +/// @include media('all', '>phone') { +/// // ... +/// } +/// } +/// } +/// +/// @example scss - Extend both configuration maps +/// @include media-context(('custom': 678px), ('all': 'all')) { +/// .foo { +/// @include media('all', '>phone', '<=custom') { +/// // ... +/// } +/// } +/// } +/// +@mixin media-context($tweakpoints: (), $tweak-media-expressions: ()) { + // Save global configuration + $global-breakpoints: $breakpoints; + $global-media-expressions: $media-expressions; + + // Update global configuration + $breakpoints: map-merge($breakpoints, $tweakpoints) !global; + $media-expressions: map-merge($media-expressions, $tweak-media-expressions) !global; + + @content; + + // Restore global configuration + $breakpoints: $global-breakpoints !global; + $media-expressions: $global-media-expressions !global; +} + +//// +/// include-media public exposed API +/// @author Eduardo Boucas +/// @access public +//// + + +/// +/// Generates a media query based on a list of conditions +/// +/// @param {Arglist} $conditions - Media query conditions +/// +/// @example scss - With a single set breakpoint +/// @include media('>phone') { } +/// +/// @example scss - With two set breakpoints +/// @include media('>phone', '<=tablet') { } +/// +/// @example scss - With custom values +/// @include media('>=358px', '<850px') { } +/// +/// @example scss - With set breakpoints with custom values +/// @include media('>desktop', '<=1350px') { } +/// +/// @example scss - With a static expression +/// @include media('retina2x') { } +/// +/// @example scss - Mixing everything +/// @include media('>=350px', ' 0) { + @media #{unquote(parse-expression(nth($conditions, 1)))} { + // Recursive call + @include media(slice($conditions, 2)...) { + @content; + } + } + } +} diff --git a/API/static/scss/abstracts/_mixins.scss b/API/static/scss/abstracts/_mixins.scss new file mode 100644 index 0000000..0e7ddeb --- /dev/null +++ b/API/static/scss/abstracts/_mixins.scss @@ -0,0 +1,101 @@ +// Font-size + Line-height + Kerning +// Usage: @include font-size(1, mobile) +// Add more true/false args to control what to output: font-size, line-height, kerning +@mixin font-size($size, $elem, $font-size: true, $line-height: false, $kerning: false, $adjust-font-size: 0) { + @if not map-has-key(map-get($font__scale, $elem), $size) { + @warn "'#{$size}' key does not exist in array!"; + } + @if ( $font-size != false ) { + font-size: get-font-size($size, $elem) + $adjust-font-size; + } + @if ( $line-height == true ) { + line-height: get-line-height($size, $elem); + } + @if ( $kerning == true ) { + letter-spacing: get-kerning($size, $elem); + } +} + +// Font Family +@mixin font-family($elem) { + font-family: unquote(get-font-family($elem)); +} + +// Font Weight +@mixin font-weight($elem) { + font-weight: get-font-weight($elem); +} + +// Anchor aspect +@mixin anchor-aspect($type: 'main') { + @if ($type == 'main') { // Base + color: color(typography, 2); + text-decoration: underline; + + &:hover, + &:active { + outline: 0; + text-decoration: none; + } + } @else if ($type == 'header') { + color: color(typography, 2); + text-transform: uppercase; + text-decoration: none; + + &:hover, + &:active { + } + } @else if ($type == 'footer') { + color: color(typography, 2); + text-decoration: none; + + &:hover, + &:active { + text-decoration: underline; + } + } +} + +@mixin shadow { + box-shadow: 0 24px 48px rgba(color(bg, 1), .24); + mix-blend-mode: multiply; +} + +@mixin shadow-sm { + box-shadow: 0 16px 24px rgba(color(bg, 1), .24); + mix-blend-mode: multiply; +} + +@mixin divider-mix { + display: block; + height: 1px; + background: color(bg, 3); +} + +@mixin divider($type: false) { + @if ( $type == 'before' ) { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + @include divider-mix; + } + } @else if ($type == 'after') { + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + @include divider-mix; + } + } @else { + @include divider-mix; + } +} diff --git a/API/static/scss/abstracts/_variables.scss b/API/static/scss/abstracts/_variables.scss new file mode 100644 index 0000000..6a9a20e --- /dev/null +++ b/API/static/scss/abstracts/_variables.scss @@ -0,0 +1,83 @@ +// -------------------------------------------- +// Colors ------------------------------------- +// Usage example: color(primary, main) +// -------------------------------------------- +$color: ( + typography: ( + 1: #FFFFFF, + 2: #8A94A7, + 3: #3B404C + ), + bg: ( + 1: #15181D, + 2: #1D2026, + 3: #242830, + 4: #2C3039 + ), + primary: ( + 1: #0270D7, + 2: #0F8AFD, + 3: #0256A4 + ) +); + +// -------------------------------------------- +// Typography --------------------------------- +// -------------------------------------------- +$font__family: ( + base: '"IBM Plex Sans", sans-serif', // font-family(base) + heading: '"IBM Plex Sans", sans-serif', // font-family(heading) + code: 'Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace', // font-family(code) + pre: '"Courier 10 Pitch", Courier, monospace' // font-family(pre) +); + +$font__sizes: ( + alpha: ( 44px, 54px, 0px ), // font-size, line-height, kerning (use '0' if don't want to output any kerning) + beta: ( 38px, 48px, 0px ), + gamma: ( 32px, 42px, 0px ), + delta: ( 24px, 34px, 0px ), + epsilon: ( 20px, 30px, -0.1px ), + zeta: ( 18px, 28px, -0.1px ), + eta: ( 16px, 24px, -0.1px ), + theta: ( 14px, 22px, 0px ) +); + +$font__scale: ( + desktop: ( // i.e. $breakpoint__m + $breakpoint__l (600 - 1024) + 1: map-get($font__sizes, alpha), // H1 + 2: map-get($font__sizes, beta), // H2 + 3: map-get($font__sizes, gamma), // H3 + 4: map-get($font__sizes, delta), // H4, H5, H6 + 5: map-get($font__sizes, epsilon), // Body + 6: map-get($font__sizes, zeta), // Text small (e.g. faq's) + 7: map-get($font__sizes, eta), // Text smaller (e.g. pricing, testimonials) + 8: map-get($font__sizes, theta) // Footer area + ), + mobile: ( // i.e. $breakpoint__xs + $breakpoint__s (up to 600) + 1: map-get($font__sizes, beta), // H1 + 2: map-get($font__sizes, gamma), // H2 + 3: map-get($font__sizes, delta), // H3 + 4: map-get($font__sizes, epsilon), // H4, H5, H6 + 5: map-get($font__sizes, epsilon), // Body + 6: map-get($font__sizes, zeta), // Text small (e.g. faq's) + 7: map-get($font__sizes, eta), // Text smaller (e.g. pricing, testimonials) + 8: map-get($font__sizes, theta) // Footer area + ) +); + +$font__weight: ( + regular: 400, // font__weight(regular) + medium: 500, // font__weight(medium) + semibold: 600, // font__weight(semi-bold) + bold: 700 // font__weight(bold) +); + +// -------------------------------------------- +// Structure ---------------------------------- +// -------------------------------------------- +$content__padding: ( + mobile: 16px, + desktop: 24px +); +$container__width: 1080px; +$container__width-sm: 800px; diff --git a/API/static/scss/base/_base.scss b/API/static/scss/base/_base.scss new file mode 100644 index 0000000..0e0bdee --- /dev/null +++ b/API/static/scss/base/_base.scss @@ -0,0 +1,103 @@ +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ + box-sizing: inherit; +} + +body { + background: color(bg, 2); /* Fallback for when there is no custom background color defined. */ + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +hr { + border: 0; + @include divider(); + margin-top: 24px; + margin-bottom: 24px; +} + +ul, ol { + margin-top: 0; + margin-bottom: 24px; + padding-left: 24px; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li > ul, +li > ol { + margin-bottom: 0; +} + +dl { + margin-top: 0; + margin-bottom: 24px; +} + +dt { + @include font-weight(semibold); +} + +dd { + margin-left: 24px; + margin-bottom: 24px; +} + +img { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ + vertical-align: middle; +} + +figure { + margin: 24px 0; /* Extra wide images within figure tags don't overflow the content area. */ +} + +figcaption { + @include font-size(7, mobile, true, true); + padding: 8px 0; +} + +img, +svg { + display: block; +} + +// tables +table { + border-collapse: collapse; + margin-bottom: 24px; + width: 100%; +} + +tr { + border-bottom: 1px solid color(bg, 3); +} + +th { + text-align: left; +} + +th, +td { + padding: 10px 16px; + + &:first-child { + padding-left: 0; + } + + &:last-child { + padding-right: 0; + } +} diff --git a/API/static/scss/base/_helpers.scss b/API/static/scss/base/_helpers.scss new file mode 100644 index 0000000..1d085dc --- /dev/null +++ b/API/static/scss/base/_helpers.scss @@ -0,0 +1,476 @@ +.container, +.container-sm { + width: 100%; + margin: 0 auto; + padding-left: get-content-padding(mobile); + padding-right: get-content-padding(mobile); + + @include media( '>small' ) { + padding-left: get-content-padding(desktop); + padding-right: get-content-padding(desktop); + } +} + +.container { + max-width: $container__width + ( get-content-padding(desktop) * 2 ); +} + +.container-sm { + max-width: $container__width-sm + ( get-content-padding(desktop) * 2 ); +} + +.container { + + .container-sm { + max-width: $container__width-sm; + padding-left: 0; + padding-right: 0; + } +} + +/* Text meant only for screen readers. */ +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + position: absolute !important; + height: 1px; + width: 1px; + overflow: hidden; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ + + &:focus { + border-radius: 2px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + display: block; + @include font-size(8, mobile, true, false, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, false, true); + } + } + @include font-weight(semibold); + line-height: 16px; + text-decoration: none; + text-transform: uppercase; + background-color: color(bg, 2); + color: color(primary, 1) !important; + border: none; + height: auto; + left: 8px; + padding: 16px 32px; + top: 8px; + width: auto; + z-index: 100000; + } +} + +.list-reset { + list-style: none; + padding: 0; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-primary { + color: color(primary, 1); +} + +.has-top-divider { + @include divider(before); +} + +.has-bottom-divider { + @include divider(after); +} + +.m-0 { + margin: 0; +} + +.mt-0 { + margin-top: 0; +} + +.mr-0 { + margin-right: 0; +} + +.mb-0 { + margin-bottom: 0; +} + +.ml-0 { + margin-left: 0; +} + +.m-8 { + margin: 8px; +} + +.mt-8 { + margin-top: 8px; +} + +.mr-8 { + margin-right: 8px; +} + +.mb-8 { + margin-bottom: 8px; +} + +.ml-8 { + margin-left: 8px; +} + +.m-16 { + margin: 16px; +} + +.mt-16 { + margin-top: 16px; +} + +.mr-16 { + margin-right: 16px; +} + +.mb-16 { + margin-bottom: 16px; +} + +.ml-16 { + margin-left: 16px; +} + +.m-24 { + margin: 24px; +} + +.mt-24 { + margin-top: 24px; +} + +.mr-24 { + margin-right: 24px; +} + +.mb-24 { + margin-bottom: 24px; +} + +.ml-24 { + margin-left: 24px; +} + +.m-32 { + margin: 32px; +} + +.mt-32 { + margin-top: 32px; +} + +.mr-32 { + margin-right: 32px; +} + +.mb-32 { + margin-bottom: 32px; +} + +.ml-32 { + margin-left: 32px; +} + +.m-40 { + margin: 40px; +} + +.mt-40 { + margin-top: 40px; +} + +.mr-40 { + margin-right: 40px; +} + +.mb-40 { + margin-bottom: 40px; +} + +.ml-40 { + margin-left: 40px; +} + +.m-48 { + margin: 48px; +} + +.mt-48 { + margin-top: 48px; +} + +.mr-48 { + margin-right: 48px; +} + +.mb-48 { + margin-bottom: 48px; +} + +.ml-48 { + margin-left: 48px; +} + +.m-56 { + margin: 56px; +} + +.mt-56 { + margin-top: 56px; +} + +.mr-56 { + margin-right: 56px; +} + +.mb-56 { + margin-bottom: 56px; +} + +.ml-56 { + margin-left: 56px; +} + +.m-64 { + margin: 64px; +} + +.mt-64 { + margin-top: 64px; +} + +.mr-64 { + margin-right: 64px; +} + +.mb-64 { + margin-bottom: 64px; +} + +.ml-64 { + margin-left: 64px; +} + +.p-0 { + padding: 0; +} + +.pt-0 { + padding-top: 0; +} + +.pr-0 { + padding-right: 0; +} + +.pb-0 { + padding-bottom: 0; +} + +.pl-0 { + padding-left: 0; +} + +.p-8 { + padding: 8px; +} + +.pt-8 { + padding-top: 8px; +} + +.pr-8 { + padding-right: 8px; +} + +.pb-8 { + padding-bottom: 8px; +} + +.pl-8 { + padding-left: 8px; +} + +.p-16 { + padding: 16px; +} + +.pt-16 { + padding-top: 16px; +} + +.pr-16 { + padding-right: 16px; +} + +.pb-16 { + padding-bottom: 16px; +} + +.pl-16 { + padding-left: 16px; +} + +.p-24 { + padding: 24px; +} + +.pt-24 { + padding-top: 24px; +} + +.pr-24 { + padding-right: 24px; +} + +.pb-24 { + padding-bottom: 24px; +} + +.pl-24 { + padding-left: 24px; +} + +.p-32 { + padding: 32px; +} + +.pt-32 { + padding-top: 32px; +} + +.pr-32 { + padding-right: 32px; +} + +.pb-32 { + padding-bottom: 32px; +} + +.pl-32 { + padding-left: 32px; +} + +.p-40 { + padding: 40px; +} + +.pt-40 { + padding-top: 40px; +} + +.pr-40 { + padding-right: 40px; +} + +.pb-40 { + padding-bottom: 40px; +} + +.pl-40 { + padding-left: 40px; +} + +.p-48 { + padding: 48px; +} + +.pt-48 { + padding-top: 48px; +} + +.pr-48 { + padding-right: 48px; +} + +.pb-48 { + padding-bottom: 48px; +} + +.pl-48 { + padding-left: 48px; +} + +.p-56 { + padding: 56px; +} + +.pt-56 { + padding-top: 56px; +} + +.pr-56 { + padding-right: 56px; +} + +.pb-56 { + padding-bottom: 56px; +} + +.pl-56 { + padding-left: 56px; +} + +.p-64 { + padding: 64px; +} + +.pt-64 { + padding-top: 64px; +} + +.pr-64 { + padding-right: 64px; +} + +.pb-64 { + padding-bottom: 64px; +} + +.pl-64 { + padding-left: 64px; +} + +/* Reveal animations */ +.sr { + + .has-animations { + + .is-revealing { + visibility: hidden; + } + } +} + +.has-animations { + + .anime-element { + visibility: hidden; + + .anime-ready & { + visibility: visible; + } + } +} diff --git a/API/static/scss/base/_typography.scss b/API/static/scss/base/_typography.scss new file mode 100644 index 0000000..4fd860b --- /dev/null +++ b/API/static/scss/base/_typography.scss @@ -0,0 +1,252 @@ +html { + @include font-size(5, mobile, true, true); + @if ( get-font-size(5, desktop) != get-font-size(5, mobile) ) { + @include media( '>medium' ) { + @include font-size(5, desktop, true, true, true); + } + } +} + +body { + color: color(typography, 2); + font-size: 1rem; +} + +body, +button, +input, +select, +textarea { + @include font-family(base); +} + +a { + @include anchor-aspect(main); +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + clear: both; + color: color(typography, 1); + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @include font-weight(semibold); +} + +h1, +.h1 { + @include font-size(1, mobile, true, true, true); + @if ( get-font-size(1, desktop) != get-font-size(1, mobile) ) { + @include media( '>medium' ) { + @include font-size(1, desktop, true, true, true); + } + } +} + +h2, +.h2 { + @include font-size(2, mobile, true, true, true); + @if ( get-font-size(2, desktop) != get-font-size(2, mobile) ) { + @include media( '>medium' ) { + @include font-size(2, desktop, true, true, true); + } + } +} + +h3, +.h3, +blockquote { + @include font-size(3, mobile, true, true, true); + @if ( get-font-size(3, desktop) != get-font-size(3, mobile) ) { + @include media( '>medium' ) { + @include font-size(3, desktop, true, true, true); + } + } +} + +h4, +h5, +h6, +.h4, +.h5, +.h6 { + @include font-size(4, mobile, true, true, true); + @if ( get-font-size(4, desktop) != get-font-size(4, mobile) ) { + @include media( '>medium' ) { + @include font-size(4, desktop, true, true, true); + } + } +} + +@include media( '<=medium' ) { + + .h1-mobile { + @include font-size(1, mobile, true, true, true); + } + + .h2-mobile { + @include font-size(2, mobile, true, true, true); + } + + .h3-mobile { + @include font-size(3, mobile, true, true, true); + } + + .h4-mobile, + .h5-mobile, + .h6-mobile { + @include font-size(4, mobile, true, true, true); + } +} + +.text-light { + color: color(typography, 2i); + + a { + color: color(typography, 2i); + } +} + +.text-light { + + h1, h2, h3, h4, h5, h6, + .h1, .h2, .h3, .h4, .h5, .h6 { + color: color(typography, 1i) !important; + } +} + +.text-sm { + @include font-size(6, mobile, true, true, true); + @if ( get-font-size(6, desktop) != get-font-size(6, mobile) ) { + @include media( '>medium' ) { + @include font-size(6, desktop, true, true, true); + } + } +} + +.text-xs { + @include font-size(7, mobile, true, true, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, true, true); + } + } +} + +h1, h2, +.h1, .h2 { + margin-top: 48px; + margin-bottom: 16px; +} + +h3, +.h3 { + margin-top: 36px; + margin-bottom: 12px; +} + +h4, h5, h6, +.h4, .h5, .h6 { + margin-top: 24px; + margin-bottom: 4px; +} + +p { + margin-top: 0; + margin-bottom: 24px; +} + +dfn, cite, em, i { + font-style: italic; +} + +blockquote { + color: color(typography, 3); + font-style: italic; + margin-top: 24px; + margin-bottom: 24px; + margin-left: 24px; + + &::before { + content: "\201C"; + } + + &::after { + content: "\201D"; + } + + p { + display: inline; + } +} + +address { + color: color(typography, 2); + border-width: 1px 0; + border-style: solid; + border-color: color(bg, 3); + padding: 24px 0; + margin: 0 0 24px; +} + +pre, +pre h1, +pre h2, +pre h3, +pre h4, +pre h5, +pre h6, +pre .h1, +pre .h2, +pre .h3, +pre .h4, +pre .h5, +pre .h6 { + @include font-family(pre); +} + +pre, code, kbd, tt, var { + background: color(bg, 2); +} + +pre { + @include font-size(7, mobile, true, true); + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 24px; + margin-top: 24px; + margin-bottom: 24px; +} + +code, kbd, tt, var { + @include font-family(code); + @include font-size(7, mobile, true); + padding: 2px 4px; +} + +abbr, acronym { + cursor: help; +} + +mark, ins { + text-decoration: none; +} + +small { + @include font-size(6, mobile, true, true, true); +} + +b, +strong { + @include font-weight(semibold); +} + +button, +input, +select, +textarea, +label { + @include font-size(5, mobile, true, true); +} diff --git a/API/static/scss/components/_buttons.scss b/API/static/scss/components/_buttons.scss new file mode 100644 index 0000000..c461be7 --- /dev/null +++ b/API/static/scss/components/_buttons.scss @@ -0,0 +1,67 @@ +.button { + display: inline-flex; + @include font-size(8, mobile, true, false, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, false, true); + } + } + @include font-weight(semibold); + line-height: 16px; + text-decoration: none !important; + text-transform: uppercase; + background-color: color(bg, 3); + color: color(typography, 1) !important; + border: none; + border-radius: 2px; + cursor: pointer; + justify-content: center; + padding: 16px 32px; + height: 48px; + text-align: center; + white-space: nowrap; + + &:hover { + background: lighten(color(bg, 3), 1%); + } + + &:active { + outline: 0; + } + + &::before { + border-radius: 2px; + } +} + +.button-sm { + padding: 8px 24px; + height: 32px; +} + +.button-primary { + background: mix(color(primary, 1), color(primary, 2)); + background: linear-gradient(65deg, color(primary, 1) 0, color(primary, 2) 100%); + + &:hover { + background: lighten(mix(color(primary, 1), color(primary, 2)), 2%); + background: linear-gradient(65deg, lighten(color(primary, 1), 2%) 0, lighten(color(primary, 2), 2%) 100%); + } +} + +.button-block { + display: flex; +} + +.button-block { + display: flex; + width: 100%; +} + +@include media( '<=medium' ) { + + .button-wide-mobile { + width: 100%; + max-width: 280px; + } +} diff --git a/API/static/scss/components/_forms.scss b/API/static/scss/components/_forms.scss new file mode 100644 index 0000000..e20ef63 --- /dev/null +++ b/API/static/scss/components/_forms.scss @@ -0,0 +1,101 @@ +.input, +.textarea { + background-color: color(typography, 1); + border-width: 1px; + border-style: solid; + border-color: color(bg, 3); + border-radius: 2px; + color: color(typography, 2); + max-width: 100%; + width: 100%; + + &::placeholder { + color: color(typography, 3); + } + + &::-ms-input-placeholder { + color: color(typography, 3); + } + + &:-ms-input-placeholder { + color: color(typography, 3); + } + + &:hover { + border-color: darken(color(bg, 3), 5%); + } + + &:active, + &:focus { + outline: none; + border-color: color(bg, 3); + } + + &[disabled] { + cursor: not-allowed; + background-color: color(bg, 2); + border-color: color(bg, 2); + } +} + +.input { + -moz-appearance: none; + -webkit-appearance: none; + @include font-size(7, mobile, true, false, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, false, true); + } + } + line-height: 20px; + padding: 13px 16px; + height: 48px; + box-shadow: none; + + .inline-input { + display: inline; + width: auto; + } +} + +.textarea { + display: block; + min-width: 100%; + resize: vertical; + + .inline-textarea { + display: inline; + width: auto; + } +} + +.field-grouped { + + > .control { + + &:not(:last-child) { + margin-bottom: 8px; + } + } +} + +@include media( '>medium' ) { + + .field-grouped { + display: flex; + + > .control { + flex-shrink: 0; + + &.control-expanded { + flex-grow: 1; + flex-shrink: 1; + } + + &:not(:last-child) { + margin-bottom: 0; + margin-right: 8px; + } + } + } +} diff --git a/API/static/scss/layout/_cta.scss b/API/static/scss/layout/_cta.scss new file mode 100644 index 0000000..6e316fc --- /dev/null +++ b/API/static/scss/layout/_cta.scss @@ -0,0 +1,54 @@ +.cta { + text-align: center; + + .section-inner { + padding: 48px 16px; + } + + .section-title { + margin-bottom: 40px; + } +} + +.cta-inner { + position: relative; + background: color(bg, 1); + overflow: hidden; + + &::before { + content: ''; + position: absolute; + right: 98px; + top: -117px; + width: 160px; + height: 187px; + background-image: url('../images/cta-illustration.svg'); + background-repeat: no-repeat; + } + + > * { + position: relative; /* To display elements above hero illustrations */ + } +} + +@include media( '>medium') { + + .cta { + text-align: left; + + .section-inner { + padding: 64px 32px; + } + + .section-title { + margin-bottom: 0; + padding-right: 24px; + } + } + + .cta-inner { + display: flex; + align-items: center; + justify-content: space-between; + } +} diff --git a/API/static/scss/layout/_features.scss b/API/static/scss/layout/_features.scss new file mode 100644 index 0000000..b969527 --- /dev/null +++ b/API/static/scss/layout/_features.scss @@ -0,0 +1,49 @@ +.features-wrap { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + margin-right: -32px; + margin-left: -32px; + + &:first-of-type { + margin-top: -16px; + } + + &:last-of-type { + margin-bottom: -16px; + } +} + +.feature { + padding: 16px 32px; + width: 380px; + max-width: 380px; + flex-grow: 1; +} + +.feature-inner { + height: 100%; +} + +.feature-icon { + display: flex; + justify-content: center; +} + +@include media( '>medium' ) { + + .features-wrap { + + &:first-of-type { + margin-top: -24px; + } + + &:last-of-type { + margin-bottom: -24px; + } + } + + .feature { + padding: 32px 32px; + } +} diff --git a/API/static/scss/layout/_footer.scss b/API/static/scss/layout/_footer.scss new file mode 100644 index 0000000..89200a6 --- /dev/null +++ b/API/static/scss/layout/_footer.scss @@ -0,0 +1,96 @@ +.site-footer { + @include font-size(8, mobile, true, true, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, true, true); + } + } + + a { + @include anchor-aspect(footer); + } +} + +.site-footer-inner { + position: relative; /* To display all elements above the background color */ + display: flex; + flex-wrap: wrap; + padding-top: 48px; + padding-bottom: 48px; +} + +.footer-brand, +.footer-links, +.footer-social-links, +.footer-copyright { + flex: none; + width: 100%; + display: inline-flex; + justify-content: center; +} + +.footer-brand, +.footer-links, +.footer-social-links { + margin-bottom: 24px; +} + +.footer-social-links { + + li { + display: inline-flex; + + + li { + margin-left: 16px; + } + + a { + padding: 8px; + } + } +} + +.footer-links { + + li { + + + li { + margin-left: 24px; + } + } +} + +@include media( '>medium' ) { + + .site-footer { + margin-top: 20px; + } + + .site-footer-inner { + justify-content: space-between; + padding-top: 64px; + padding-bottom: 64px; + } + + .footer-brand, + .footer-links, + .footer-social-links, + .footer-copyright { + flex: 50%; + } + + .footer-brand, + .footer-copyright { + justify-content: flex-start; + } + + .footer-links, + .footer-social-links { + justify-content: flex-end; + } + + .footer-links { + order: 1; + margin-bottom: 0; + } +} diff --git a/API/static/scss/layout/_header.scss b/API/static/scss/layout/_header.scss new file mode 100644 index 0000000..fb744ac --- /dev/null +++ b/API/static/scss/layout/_header.scss @@ -0,0 +1,53 @@ +.site-header { + padding: 24px 0; +} + +.site-header-inner { + position: relative; /* To display all elements above the background color */ + display: flex; + justify-content: space-between; + align-items: center; +} + +.header-links { + display: inline-flex; + + li { + display: inline-flex; + } + + a:not(.button) { + @include font-size(7, mobile, true, true, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, true, true); + } + } + @include font-weight(semibold); + @include anchor-aspect(header); + line-height: 16px; + padding: 8px 24px; + } +} + +@include media( '>medium' ) { + + .site-header { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 700px; + background: color(bg, 3); + background: linear-gradient(80deg, rgba(color(bg, 3), .5) 0%, rgba(color(bg, 3), 0) 100%); + -webkit-transform-origin: 0; + transform-origin: 0; + -webkit-transform: skewY(-12deg); + transform: skewY(-12deg); + } + } +} diff --git a/API/static/scss/layout/_hero.scss b/API/static/scss/layout/_hero.scss new file mode 100644 index 0000000..7e6cdfd --- /dev/null +++ b/API/static/scss/layout/_hero.scss @@ -0,0 +1,269 @@ +.hero { + text-align: center; + padding-top: 48px; + padding-bottom: 88px; +} + +.hero-copy { + position: relative; /* To display elements above hero illustrations */ + z-index: 1; +} + +.hero-cta { + margin-bottom: 40px; +} + +.hero-figure { + position: relative; + + svg { + width: 100%; + height: auto; + } + + &::before, + &::after { + content: ''; + position: absolute; + background-repeat: no-repeat; + background-size: 100%; + + .has-animations & { + opacity: 0; + transition: opacity 2s ease; + + .anime-ready & { + opacity: 1; + } + } + } + + &::before { + top: -57.8%; + left: -1.3%; + width: 152.84%; + height: 178.78%; + background-image: url('../images/hero-back-illustration.svg'); + } + + &::after { + top: -35.6%; + left: 99.6%; + width: 57.2%; + height: 87.88%; + background-image: url('../images/hero-top-illustration.svg'); + } +} + +.hero-figure-box { + position: absolute; + top: 0; + will-change: transform; +} + +.hero-figure-box-01, +.hero-figure-box-02, +.hero-figure-box-03, +.hero-figure-box-04, +.hero-figure-box-08, +.hero-figure-box-09 { + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + transform-origin: 100% 100%; + } +} + +.hero-figure-box-01 { + left: 103.2%; + top: 41.9%; + width: 28.03%; + height: 37.37%; + background: linear-gradient(to left top, #00BFFB, rgba(#00BFFB, 0)); + transform: rotateZ(45deg); + + &::before { + background: linear-gradient(to left, color(bg, 1) 0%, rgba(color(bg, 1), 0) 60%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-02 { + left: 61.3%; + top: 64.1%; + width: 37.87%; + height: 50.50%; + background: linear-gradient(to left top, color(primary, 1), rgba(color(primary, 1), 0)); + transform: rotateZ(-45deg); + + &::before { + background: linear-gradient(to top, color(bg, 1) 0%, rgba(color(bg, 1), 0) 60%); + transform: rotateZ(-45deg) scale(1.5); + } +} + +.hero-figure-box-03 { + left: 87.7%; + top: -56.8%; + width: 56.81%; + height: 75.75%; + background: linear-gradient(to left top, #00BFFB, rgba(#00BFFB, 0)); + + &::before { + background: linear-gradient(to left, color(bg, 1) 0%, rgba(color(bg, 1), 0) 60%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-04 { + left: 54.9%; + top: -8%; + width: 45.45%; + height: 60.60%; + background: linear-gradient(to left top, color(primary, 1), rgba(color(primary, 1), 0)); + transform: rotateZ(-135deg); + + &::before { + background: linear-gradient(to top, rgba(color(typography, 1), .24) 0%, rgba(color(typography, 1), 0) 60%); + transform: rotateZ(-45deg) scale(1.5); + } +} + +.hero-figure-box-05, +.hero-figure-box-06, +.hero-figure-box-07 { + background-color: color(bg, 3); + box-shadow: -20px 32px 64px rgba(#000, .25); +} + +.hero-figure-box-05 { + left: 17.4%; + top: 13.3%; + width: 64%; + height: 73.7%; + transform: perspective(500px) rotateY(-15deg) rotateX(8deg) rotateZ(-1deg); +} + +.hero-figure-box-06 { + left: 65.5%; + top: 6.3%; + width: 30.3%; + height: 40.4%; + transform: rotateZ(20deg); +} + +.hero-figure-box-07 { + left: 1.9%; + top: 42.4%; + width: 12.12%; + height: 16.16%; + transform: rotateZ(20deg); +} + +.hero-figure-box-08 { + left: 27.1%; + top: 81.6%; + width: 19.51%; + height: 26.01%; + background: color(primary, 1); + transform: rotateZ(-22deg); + + &::before { + background: linear-gradient(to left, rgba(color(typography, 1), 0) 0%, rgba(color(typography, 1), .48) 100%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-09 { + left: 42.6%; + top: -17.9%; + width: 6.63%; + height: 8.83%; + background: #00BFFB; + transform: rotateZ(-52deg); + + &::before { + background: linear-gradient(to left, rgba(color(typography, 1), 0) 0%, rgba(color(typography, 1), .64) 100%); + transform: rotateZ(45deg) scale(1.5); + } +} + +.hero-figure-box-10 { + left: -3.8%; + top: 4.3%; + width: 3.03%; + height: 4.04%; + background: rgba(#00BFFB, .32); + transform: rotateZ(-50deg); +} + +@include media( '<=medium' ) { + + .hero-cta { + max-width: 280px; + margin-left: auto; + margin-right: auto; + + .button { + display: flex; + + + .button { + margin-top: 16px; + } + } + } + + .hero-figure::after, + .hero-figure-box-03, + .hero-figure-box-04, + .hero-figure-box-09 { + display: none; + } +} + +@include media( '>medium' ) { + + .hero { + text-align: left; + padding-top: 64px; + padding-bottom: 88px; + } + + .hero-inner { + /* Split hero in two half */ + display: flex; + justify-content: space-between; + align-items: center; + } + + .hero-copy { + padding-right: 64px; + min-width: 552px; + width: 552px; + } + + .hero-cta { + margin: 0; + + .button { + min-width: 170px; + + &:first-child { + margin-right: 16px; + } + } + } + + .hero-figure { + + svg { + width: auto; + } + } +} diff --git a/API/static/scss/layout/_main.scss b/API/static/scss/layout/_main.scss new file mode 100644 index 0000000..7a0961a --- /dev/null +++ b/API/static/scss/layout/_main.scss @@ -0,0 +1,37 @@ +.is-boxed { + background: color(bg, 3); +} + +.body-wrap { + background: color(bg, 2); + overflow: hidden; + /* Sticky footer */ + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.boxed-container { + max-width: 1440px; + margin: 0 auto; + @include shadow; + mix-blend-mode: normal; +} + +main { + flex: 1 0 auto; +} + +.section-inner { + position: relative; /* To always display inner elements above pseudo decorative stuff */ + padding-top: 48px; + padding-bottom: 48px; +} + +@include media( '>medium' ) { + + .section-inner { + padding-top: 88px; + padding-bottom: 88px; + } +} diff --git a/API/static/scss/layout/_pricing.scss b/API/static/scss/layout/_pricing.scss new file mode 100644 index 0000000..eedb3ea --- /dev/null +++ b/API/static/scss/layout/_pricing.scss @@ -0,0 +1,125 @@ +.pricing-header { + margin-bottom: 48px; +} + +.pricing-tables-wrap { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin-right: -12px; + margin-left: -12px; + + &:first-child { + margin-top: -12px; + } + + &:last-child { + margin-bottom: -12px; + } +} + +.pricing-table { + position: relative; + padding: 12px; + width: 368px; + max-width: 368px; + flex-grow: 1; + + &::before { + content: ''; + position: absolute; + left: 50%; + width: 200%; + max-width: 200%; + height: 435px; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + bottom: 18.8%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + background-image: url('../images/pricing-illustration.svg'); + } +} + +.pricing-table-header, +.pricing-table-features-title, +.pricing-table-features li { + border-bottom: 1px solid rgba(color(typography, 2), .24); +} + +.pricing-table-inner { + position: relative; + display: flex; + flex-wrap: wrap; + background: color(bg, 4); + padding: 24px; + height: 100%; + + > * { + position: relative; /* To display all elements above the box with shadow */ + width: 100%; + } + + &::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + @include shadow; + } +} + +.pricing-table-price { + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } +} + +.pricing-table-price-currency { + color: color(typography, 2); +} + +.pricing-table-features-title { + color: color(typography, 1); + @include font-weight(bold); +} + +.pricing-table-features { + + li { + display: flex; + align-items: center; + padding: 14px 0; + + &::before { + content: ''; + width: 16px; + height: 12px; + margin-right: 16px; + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUuNiA2LjRMMS42IDQgMCA1LjYgNS42IDEyIDE2IDEuNiAxNC40IDB6IiBmaWxsPSIjMDJDQkIxIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=); + background-repeat: no-repeat; + } + } +} + +.pricing-table-cta { + align-self: flex-end; +} + +@include media( '>medium' ) { + + .pricing { + + .section-paragraph { + padding-left: 90px; + padding-right: 90px; + } + } + + .pricing-header { + margin-bottom: 52px; + } +} diff --git a/API/static/scss/style.scss b/API/static/scss/style.scss new file mode 100644 index 0000000..6060307 --- /dev/null +++ b/API/static/scss/style.scss @@ -0,0 +1,74 @@ +/*-------------------------------------------------------------- +# Variables, functions and mixins +--------------------------------------------------------------*/ +@import "abstracts/variables", + "abstracts/functions", + "abstracts/mixins", + 'abstracts/include-media'; + +/*-------------------------------------------------------------- +1.0 Normalize + * normalize.css v7.0.0 | MIT License + * github.com/necolas/normalize.css +--------------------------------------------------------------*/ +@import "normalize"; + +/*-------------------------------------------------------------- +# Base +--------------------------------------------------------------*/ +@import "base/base"; + +/*-------------------------------------------------------------- +# Typography +--------------------------------------------------------------*/ +@import "base/typography"; + +/*-------------------------------------------------------------- +# Helpers +--------------------------------------------------------------*/ +@import "base/helpers"; + +/*-------------------------------------------------------------- +# Forms +--------------------------------------------------------------*/ +@import "components/forms"; + +/*-------------------------------------------------------------- +# Buttons +--------------------------------------------------------------*/ +@import "components/buttons"; + +/*-------------------------------------------------------------- +# Header +--------------------------------------------------------------*/ +@import "layout/header"; + +/*-------------------------------------------------------------- +# Hero +--------------------------------------------------------------*/ +@import "layout/hero"; + +/*-------------------------------------------------------------- +# Features +--------------------------------------------------------------*/ +@import "layout/features"; + +/*-------------------------------------------------------------- +# Pricing +--------------------------------------------------------------*/ +@import "layout/pricing"; + +/*-------------------------------------------------------------- +# CTA +--------------------------------------------------------------*/ +@import "layout/cta"; + +/*-------------------------------------------------------------- +# Site content +--------------------------------------------------------------*/ +@import "layout/main"; + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ +@import "layout/footer"; diff --git a/API/templates/home.html b/API/templates/home.html new file mode 100644 index 0000000..6dc476c --- /dev/null +++ b/API/templates/home.html @@ -0,0 +1,181 @@ + + + + + + + + UBA FORM API + + + + + + + +
+ + +
+
+
+
+
+

UBA Form API

+

Our API is cross platform compatible and provides serverless & seamless services as FaaS (Function as a Service).

+ +
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ Logo +
+

Dump data

+

+ The API dumps the data to the database by accepting the HTTP POST request from the client at the exposed endpoint. +

+
+
+
+
+
+ Feature 02 +
+

Realtime Data Retrieval

+

+ The API retrieves the data from the database by accepting the HTTP GET request from the client at the exposed endpoint enabling realtime analysis driven insights. +

+
+
+
+
+
+ Feature 03 +
+

Visor

+

The Visor offers a user interface for you to see a live view of all the events (logs). You can use it to debug your requests, test your endpoints by sending requests, and more.

+
+
+
+
+
+ Feature 04 +
+

Serverless FaaS Service

+

+ This API is serverless and provides FaaS (Function as a Service) which means that you don't have to worry about managing servers, scaling, or paying for idle time that are managed by the cloud provider. +

+
+
+
+
+
+
+
+ + +
+ + + + + +