diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000000000000000000000000000000000..e3578aadfd3a97c6ef9d74f46e07314d775c9c61 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "standard" +} diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000000000000000000000000000000000000..3dce7a2d53782861c62583199d8a7c944164f069 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,8 @@ +"rules": { + "block-no-empty": true, + "color-hex-case": "lower", + "color-hex-length": "short", + "color-no-invalid-hex": true, + "declaration-colon-space-after": "always", + "max-empty-lines": 2 +} diff --git a/ML Canvas Group 7.pdf b/ML Canvas Group 7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..906516c8fb70456daecee122922e4c94abba7526 Binary files /dev/null and b/ML Canvas Group 7.pdf differ diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..cdac4b10ef58fcf7e460c5ab0f97ed0da5277510 --- /dev/null +++ b/app.py @@ -0,0 +1,28 @@ +import gradio as gr +from transformers import pipeline + +def inference(text): + classifier = pipeline("text-classification", model="karanzrk/essayl0") + output = classifier(text) + return output[0]["label"] + +# launcher = gr.Interface( +# fn=inference, +# inputs=gr.Textbox(lines=5, placeholder="Essay here...."), +# outputs="text" +# ) + +with gr.Blocks() as demo: + gr.Markdown( + """ + # Welcome to our web app demo + Please type your essay in the Input box below, make sure the essay is less than 500 characters!! + """ + ) + inputs = gr.Textbox(label="Input Box",lines = 5, placeholder="Essay here....") + button = gr.Button("Grade!") + output = gr.Textbox(label="Output Box") + button.click(fn=inference, inputs=inputs, outputs = output, api_name="Autograde") + + +demo.launch() \ No newline at end of file diff --git a/dist/css/style.css b/dist/css/style.css new file mode 100644 index 0000000000000000000000000000000000000000..6c414ba2e02c61fc2034aee48d3d0643aceffd6e --- /dev/null +++ b/dist/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:#fff;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}hr{border:0;display:block;height:1px;background:#E9EDF3;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 #E9EDF3}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:#6B7A90;font-size:1rem}body,button,input,select,textarea{font-family:"Heebo", sans-serif}a{color:#535FD7;text-decoration:none}a:hover,a:active{outline:0;text-decoration:underline}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{clear:both;color:#182538;font-family:"IBM Plex Sans", sans-serif;font-weight:600}h1,.h1{font-size:38px;line-height:48px;letter-spacing:-0.1px}@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:-0.1px}@media (min-width: 641px){h2,.h2{font-size:38px;line-height:48px;letter-spacing:-0.1px}}h3,.h3,blockquote{font-size:24px;line-height:34px;letter-spacing:-0.1px}h4,h5,h6,.h4,.h5,.h6{font-size:20px;line-height:30px;letter-spacing:-0.1px}@media (max-width: 640px){.h1-mobile{font-size:38px;line-height:48px;letter-spacing:-0.1px}.h2-mobile{font-size:32px;line-height:42px;letter-spacing:-0.1px}.h3-mobile{font-size:24px;line-height:34px;letter-spacing:-0.1px}.h4-mobile,.h5-mobile,.h6-mobile{font-size:20px;line-height:30px;letter-spacing:-0.1px}}.text-light{color:#8595AE}.text-light a{color:#8595AE}.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:#fff !important}.text-sm{font-size:18px;line-height:27px;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:#6B7A90;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:#6B7A90;border-width:1px 0;border-style:solid;border-color:#E9EDF3;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:#F8F9FB}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:27px;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-family:"IBM Plex Sans", sans-serif;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none;text-transform:uppercase;background-color:#fff;color:#535FD7 !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:#535FD7}.text-secondary{color:#61EFFD}.has-top-divider{position:relative}.has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#E9EDF3}.has-bottom-divider{position:relative}.has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#E9EDF3}.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}.input,.textarea{background-color:#182538;border-width:1px;border-style:solid;border-color:#E9EDF3;border-radius:2px;color:#6B7A90;max-width:100%;width:100%}.input::-moz-placeholder, .textarea::-moz-placeholder{color:#6B7A90}.input::placeholder,.textarea::placeholder{color:#6B7A90}.input::-ms-input-placeholder,.textarea::-ms-input-placeholder{color:#6B7A90}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#6B7A90}.input:hover,.textarea:hover{border-color:#d9e0ea}.input:active,.input:focus,.textarea:active,.textarea:focus{outline:none;border-color:#E9EDF3}.input[disabled],.textarea[disabled]{cursor:not-allowed;background-color:#F8F9FB;border-color:#F8F9FB}.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}.switch[type="checkbox"]{outline:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;position:absolute;opacity:0}.switch[type="checkbox"]+label{display:inline-flex;position:relative;line-height:36px;padding-left:78px;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}.switch[type="checkbox"]+label::before,.switch[type="checkbox"]+label::after{content:'';position:absolute;display:block}.switch[type="checkbox"]+label::before{top:0;left:0;width:64px;height:36px;border-radius:18px;background:#E9EDF3}.switch[type="checkbox"]+label::after{top:6px;left:6px;width:24px;height:24px;border-radius:12px;background:#fff;transition:all .15s ease-out}.switch[type="checkbox"]:checked+label::before{background:#535FD7}.switch[type="checkbox"]:checked+label::after{left:34px}@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-family:"IBM Plex Sans", sans-serif;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none !important;text-transform:uppercase;background-color:#E9EDF3;color:#535FD7 !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:#ecf0f5}.button:active{outline:0}.button::before{border-radius:2px}.button-shadow{position:relative}.button-shadow::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 8px 24px rgba(255,255,255,0.25);mix-blend-mode:multiply;transition:box-shadow .15s ease}.button-shadow:hover::before{box-shadow:0 8px 24px rgba(255,255,255,0.35)}.button-sm{padding:8px 24px;height:32px}.button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(255,255,255,0.25)}.button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(255,255,255,0.35)}.button-primary{color:#fff !important;background-color:#535FD7}.button-primary:hover{background:#5763d8}.button-primary.button-shadow::before{box-shadow:0 8px 16px rgba(83,95,215,0.25);mix-blend-mode:normal}.button-primary.button-shadow:hover::before{box-shadow:0 8px 16px rgba(83,95,215,0.35)}.button-primary .button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(83,95,215,0.25)}.button-primary .button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(83,95,215,0.35)}.button-block{display:flex}.site-header{position:relative;padding:24px 0;z-index:2}.site-header::before{content:'';position:absolute;top:-140px;right:-100px;width:1440px;height:324px;background-image:url("../images/header-illustration-light.svg")}.lights-off .site-header::before{background-image:url("../images/header-illustration-dark.svg")}.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:#8595AE;text-transform:uppercase;text-decoration:none;line-height:16px;padding:8px 24px}.header-links a:not(.button):hover,.header-links a:not(.button):active{color:#fff}@media (min-width: 641px){.site-header::before{display:none}}.hero{text-align:center;padding-top:48px;padding-bottom:88px}.hero-copy{position:relative}.hero-paragraph{margin-bottom:32px}.hero-cta{max-width:400px;margin-left:auto;margin-right:auto;margin-bottom:80px}.lights-toggle{color:rgba(107,122,144,0.64)}.header-illustration{display:none}.header-illustration img,.header-illustration svg{max-width:none}.header-illustration-image{display:none}.hero-media{position:relative}.hero-media-illustration{position:absolute;top:-10%;left:-15px}.hero-media-illustration img,.hero-media-illustration svg{max-width:136%}.hero-media-container{position:relative}.hero-media-image{margin:0 auto;box-shadow:48px 16px 48px rgba(24,37,56,0.12);border-radius:4px;transform:perspective(1000px) rotateY(16deg) rotateX(2deg) rotateZ(-7deg) scaleY(0.95) translatex(2%)}.lights-off .hero-media-image{box-shadow:48px 16px 48px rgba(0,0,0,0.2)}@media (max-width: 639px){.hero-cta>*{display:flex}.hero-cta>*+*{margin-top:32px}.lights-toggle{justify-content:center}}@media (min-width: 641px){.hero{text-align:left;padding-top:88px;padding-bottom:120px}.hero-inner{display:flex;justify-content:space-between}.hero-copy{padding-top:40px;padding-right:48px;min-width:448px;max-width:512px;z-index:1}.hero-title{margin-bottom:16px}.hero-paragraph{margin-bottom:32px}.hero-cta{display:flex;align-items:center;margin:0}.hero-cta .button{min-width:170px}.hero-cta .button:first-child{margin-right:32px}.header-illustration{display:block}.hero-media{z-index:0}.hero-media img,.hero-media svg{max-width:none}.header-illustration-image{display:block;position:absolute;top:-168px;left:-722px;width:1440px;height:324px}}.features-wrap{max-width:540px;margin:0 auto}.features-image{position:relative;margin-top:64px;margin-bottom:112px}.features-illustration{position:absolute;top:-2%;left:50%;transform:translateX(-50%);max-width:136%}.features-box{margin:0 auto;box-shadow:48px 16px 48px rgba(24,37,56,0.12);transform:perspective(1000px) rotateY(10deg) translateY(2%)}.lights-off .features-box{box-shadow:48px 16px 48px rgba(0,0,0,0.2)}.feature{text-align:center;margin-bottom:48px}.feature:last-of-type{margin-bottom:0}.feature-icon{display:inline-flex;margin-bottom:16px}.feature-icon img,.feature-icon svg{max-width:none}.feature-title{position:relative;margin-bottom:26px}.feature-title::after{content:'';width:32px;height:2px;position:absolute;bottom:-14px;left:calc(50% - 16px);background:#E9EDF3}.lights-off .feature-title::after{background:#304057}@media (min-width: 641px){.features{position:relative}.features .section-inner{padding-bottom:100px}.features .section-paragraph{padding-left:72px;padding-right:72px}.features::before{content:'';width:100%;height:300px;position:absolute;left:0;top:168px;background:linear-gradient(to bottom, rgba(83,95,215,0), rgba(83,95,215,0.04))}.lights-off .features::before{display:none}.feature{text-align:left}.feature-inner{display:flex}.feature-icon{display:block;margin-top:8px;margin-right:32px;margin-bottom:0}.feature-title::after{left:0}}.cta{position:relative}.cta .section-inner{padding-bottom:64px}.cta .section-paragraph{margin-bottom:32px}.cta::before{content:'';position:absolute;bottom:-32px;left:calc(50% - 720px);height:263px;width:1440px;background-image:url("../images/cta-illustration-light.svg")}.lights-off .cta::before{background-image:url("../images/cta-illustration-dark.svg")}.cta-cta{max-width:400px;margin-left:auto;margin-right:auto}@media (max-width: 639px){.cta-cta .button{display:flex}}@media (min-width: 641px){.cta .section-inner{padding-bottom:128px}.cta .section-paragraph{margin-bottom:40px;padding-left:72px;padding-right:72px}.cta::before{bottom:0}.cta-cta .button{min-width:170px}}.is-boxed{background:#E9EDF3}.body-wrap{background:#fff;overflow:hidden;display:flex;flex-direction:column;min-height:100vh}.boxed-container{max-width:1440px;margin:0 auto;box-shadow:0 16px 48px rgba(255,255,255,0.5)}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:20px;letter-spacing:0px;background:#182538;color:#6B7A90}.site-footer a{color:#6B7A90;text-decoration:none}.site-footer a:hover,.site-footer a:active{text-decoration:underline}.site-footer::before{display:none}.lights-off .site-footer::before{display:block}.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-links li+li,.footer-social-links li+li{margin-left:16px}.footer-social-links li{display:inline-flex}.footer-social-links li a{padding:8px}@media (min-width: 641px){.site-footer-inner{justify-content:space-between;padding-top:72px;padding-bottom:72px}.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}}.switch[type="checkbox"]+label::before{background:#41a5ea;background:linear-gradient(to right, #2FEAFC 0, #535FD7 100%)}.switch[type="checkbox"]+label::after{background:#fff}.switch[type="checkbox"]:checked+label::before{background:#ff9d34;background:linear-gradient(to right, #FFBC48 0, #FE7E1F 100%)}.asset-light,.asset-dark{visibility:hidden;opacity:0}.is-loaded .asset-light,.is-loaded .asset-dark{visibility:visible;opacity:1}.asset-dark{display:none}.lights-off{color:#8595AE}.lights-off .asset-light{display:none}.lights-off .asset-dark{display:block}.lights-off a{color:#8595AE}.lights-off h1,.lights-off h2,.lights-off h3,.lights-off h4,.lights-off h5,.lights-off h6,.lights-off .h1,.lights-off .h2,.lights-off .h3,.lights-off .h4,.lights-off .h5,.lights-off .h6{color:#fff !important}.lights-off.is-boxed{background:#202d3f}.lights-off .body-wrap{background:#182538}.lights-off .boxed-container{box-shadow:0 16px 48px rgba(0,0,0,0.2)}.lights-off hr{display:block;height:1px;background:#304057}.lights-off .has-top-divider{position:relative}.lights-off .has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#304057}.lights-off .has-bottom-divider{position:relative}.lights-off .has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#304057}body,a,h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{transition:color .25s ease}.is-boxed,.body-wrap,.has-top-divider,.has-bottom-divider::after,hr::after,.feature-title::after{transition:background .25s ease}.boxed-container{transition:box-shadow .15s ease}@keyframes fadeInLogo{0%{opacity:0;transform:scale(0.5)}}@keyframes fadeInLeftMedia{0%{opacity:0;transform:scale(0.8) translate3d(40px, 10px, 0)}30%{opacity:1}}@keyframes fadeInLeftIllustration{0%{opacity:0;transform:scale(0.95) translate3d(40px, 10px, 0)}}@keyframes fadeUpBox{0%{opacity:0;transform:scale(0.95) translate3d(-40px, 20px, 0)}30%{opacity:1}}@keyframes fadeIn{0%{opacity:0}}.is-loaded .header-logo-image{animation:fadeInLogo 0.35s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .hero-media-image{animation:fadeInLeftMedia 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .hero-media-illustration-image{animation:fadeInLeftIllustration 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .features-box{animation:fadeUpBox 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .header-illustration-image{animation:fadeIn 1s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .features-illustration{animation:fadeIn 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform} + +/*# sourceMappingURL=data:application/json;base64,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VSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLDJCQUEyQixVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLFlBQVksQ0FBQyxNQUFNLGNBQWMsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLE1BQU0saUJBQWlCLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxhQUFhLENBQUMs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LHFCQUFxQixrQkFBa0IsQ0FBQyx1QkFBdUIsa0JBQWtCLENBQUMsNkJBQTZCLHNDQUFzQyxDQUFDLGVBQWUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyw2QkFBNkIsaUJBQWlCLENBQUMscUNBQXFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGdDQUFnQyxpQkFBaUIsQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsaURBQWlELDBCQUEwQixDQUFDLGlHQUFpRywrQkFBK0IsQ0FBQyxpQkFBaUIsK0JBQStCLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLCtDQUErQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsa0NBQWtDLEdBQUcsU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDLGlEQUFpRCxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDLENBQUMsOEJBQThCLDREQUE0RCxDQUFDLHFCQUFxQixDQUFDLDZCQUE2QixtRUFBbUUsQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBMEMsMEVBQTBFLENBQUMscUJBQXFCLENBQUMseUJBQXlCLDZEQUE2RCxDQUFDLHFCQUFxQixDQUFDLHNDQUFzQyxxREFBcUQsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsMERBQTBELENBQUMscUJBQXFCIiwiZmlsZSI6InN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImh0bWx7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2t9aDF7Zm9udC1zaXplOjJlbTttYXJnaW46MC42N2VtIDB9ZmlnY2FwdGlvbixmaWd1cmUsbWFpbntkaXNwbGF5OmJsb2NrfWZpZ3VyZXttYXJnaW46MWVtIDQwcHh9aHJ7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MDtvdmVyZmxvdzp2aXNpYmxlfXByZXtmb250LWZhbWlseTptb25vc3BhY2UsIG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YWJiclt0aXRsZV17Ym9yZGVyLWJvdHRvbTpub25lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6aW5oZXJpdH1iLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9Y29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2UsIG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWRmbntmb250LXN0eWxlOml0YWxpY31tYXJre2JhY2tncm91bmQtY29sb3I6I2ZmMDtjb2xvcjojMDAwfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotMC4yNWVtfXN1cHt0b3A6LTAuNWVtfWF1ZGlvLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrfWF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjB9aW1ne2JvcmRlci1zdHlsZTpub25lfXN2Zzpub3QoOnJvb3Qpe292ZXJmbG93OmhpZGRlbn1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjEwMCU7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW46MH1idXR0b24saW5wdXR7b3ZlcmZsb3c6dmlzaWJsZX1idXR0b24sc2VsZWN0e3RleHQtdHJhbnNmb3JtOm5vbmV9YnV0dG9uLGh0bWwgW3R5cGU9XCJidXR0b25cIl0sW3R5cGU9XCJyZXNldFwiXSxbdHlwZT1cInN1Ym1pdFwiXXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cInJlc2V0XCJdOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH1idXR0b246LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJidXR0b25cIl06LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJyZXNldFwiXTotbW96LWZvY3VzcmluZyxbdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOjFweCBkb3R0ZWQgQnV0dG9uVGV4dH1maWVsZHNldHtwYWRkaW5nOjAuMzVlbSAwLjc1ZW0gMC42MjVlbX1sZWdlbmR7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOmluaGVyaXQ7ZGlzcGxheTp0YWJsZTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjA7d2hpdGUtc3BhY2U6bm9ybWFsfXByb2dyZXNze2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXRleHRhcmVhe292ZXJmbG93OmF1dG99W3R5cGU9XCJjaGVja2JveFwiXSxbdHlwZT1cInJhZGlvXCJde2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjB9W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99W3R5cGU9XCJzZWFyY2hcIl17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fVt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtmb250OmluaGVyaXR9ZGV0YWlscyxtZW51e2Rpc3BsYXk6YmxvY2t9c3VtbWFyeXtkaXNwbGF5Omxpc3QtaXRlbX1jYW52YXN7ZGlzcGxheTppbmxpbmUtYmxvY2t9dGVtcGxhdGV7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX1odG1se2JveC1zaXppbmc6Ym9yZGVyLWJveH0qLCo6YmVmb3JlLCo6YWZ0ZXJ7Ym94LXNpemluZzppbmhlcml0fWJvZHl7YmFja2dyb3VuZDojZmZmOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkfWhye2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiNFOUVERjM7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweH11bCxvbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyNHB4O3BhZGRpbmctbGVmdDoyNHB4fXVse2xpc3Qtc3R5bGU6ZGlzY31vbHtsaXN0LXN0eWxlOmRlY2ltYWx9bGk+dWwsbGk+b2x7bWFyZ2luLWJvdHRvbTowfWRse21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjI0cHh9ZHR7Zm9udC13ZWlnaHQ6NjAwfWRke21hcmdpbi1sZWZ0OjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4fWltZ3toZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9ZmlndXJle21hcmdpbjoyNHB4IDB9ZmlnY2FwdGlvbntmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O3BhZGRpbmc6OHB4IDB9aW1nLHN2Z3tkaXNwbGF5OmJsb2NrfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW4tYm90dG9tOjI0cHg7d2lkdGg6MTAwJX10cntib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTlFREYzfXRoe3RleHQtYWxpZ246bGVmdH10aCx0ZHtwYWRkaW5nOjEwcHggMTZweH10aDpmaXJzdC1jaGlsZCx0ZDpmaXJzdC1jaGlsZHtwYWRkaW5nLWxlZnQ6MH10aDpsYXN0LWNoaWxkLHRkOmxhc3QtY2hpbGR7cGFkZGluZy1yaWdodDowfWh0bWx7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzBweH1ib2R5e2NvbG9yOiM2QjdBOTA7Zm9udC1zaXplOjFyZW19Ym9keSxidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OlwiSGVlYm9cIiwgc2Fucy1zZXJpZn1he2NvbG9yOiM1MzVGRDc7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1oMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNntjbGVhcjpib3RoO2NvbG9yOiMxODI1Mzg7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBTYW5zXCIsIHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NjAwfWgxLC5oMXtmb250LXNpemU6MzhweDtsaW5lLWhlaWdodDo0OHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpe2gxLC5oMXtmb250LXNpemU6NDRweDtsaW5lLWhlaWdodDo1NHB4O2xldHRlci1zcGFjaW5nOjBweH19aDIsLmgye2ZvbnQtc2l6ZTozMnB4O2xpbmUtaGVpZ2h0OjQycHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7aDIsLmgye2ZvbnQtc2l6ZTozOHB4O2xpbmUtaGVpZ2h0OjQ4cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fX1oMywuaDMsYmxvY2txdW90ZXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1oNCxoNSxoNiwuaDQsLmg1LC5oNntmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5oMS1tb2JpbGV7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9LmgyLW1vYmlsZXtmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDo0MnB4O2xldHRlci1zcGFjaW5nOi0wLjFweH0uaDMtbW9iaWxle2ZvbnQtc2l6ZToyNHB4O2xpbmUtaGVpZ2h0OjM0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fS5oNC1tb2JpbGUsLmg1LW1vYmlsZSwuaDYtbW9iaWxle2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fX0udGV4dC1saWdodHtjb2xvcjojODU5NUFFfS50ZXh0LWxpZ2h0IGF7Y29sb3I6Izg1OTVBRX0udGV4dC1saWdodCBoMSwudGV4dC1saWdodCBoMiwudGV4dC1saWdodCBoMywudGV4dC1saWdodCBoNCwudGV4dC1saWdodCBoNSwudGV4dC1saWdodCBoNiwudGV4dC1saWdodCAuaDEsLnRleHQtbGlnaHQgLmgyLC50ZXh0LWxpZ2h0IC5oMywudGV4dC1saWdodCAuaDQsLnRleHQtbGlnaHQgLmg1LC50ZXh0LWxpZ2h0IC5oNntjb2xvcjojZmZmICFpbXBvcnRhbnR9LnRleHQtc217Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjdweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9LnRleHQteHN7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9aDEsaDIsLmgxLC5oMnttYXJnaW4tdG9wOjQ4cHg7bWFyZ2luLWJvdHRvbToxNnB4fWgzLC5oM3ttYXJnaW4tdG9wOjM2cHg7bWFyZ2luLWJvdHRvbToxMnB4fWg0LGg1LGg2LC5oNCwuaDUsLmg2e21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjRweH1we21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjI0cHh9ZGZuLGNpdGUsZW0saXtmb250LXN0eWxlOml0YWxpY31ibG9ja3F1b3Rle2NvbG9yOiM2QjdBOTA7Zm9udC1zdHlsZTppdGFsaWM7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweDttYXJnaW4tbGVmdDoyNHB4fWJsb2NrcXVvdGU6OmJlZm9yZXtjb250ZW50OlwiXFwyMDFDXCJ9YmxvY2txdW90ZTo6YWZ0ZXJ7Y29udGVudDpcIlxcMjAxRFwifWJsb2NrcXVvdGUgcHtkaXNwbGF5OmlubGluZX1hZGRyZXNze2NvbG9yOiM2QjdBOTA7Ym9yZGVyLXdpZHRoOjFweCAwO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6I0U5RURGMztwYWRkaW5nOjI0cHggMDttYXJnaW46MCAwIDI0cHh9cHJlLHByZSBoMSxwcmUgaDIscHJlIGgzLHByZSBoNCxwcmUgaDUscHJlIGg2LHByZSAuaDEscHJlIC5oMixwcmUgLmgzLHByZSAuaDQscHJlIC5oNSxwcmUgLmg2e2ZvbnQtZmFtaWx5OlwiQ291cmllciAxMCBQaXRjaFwiLCBDb3VyaWVyLCBtb25vc3BhY2V9cHJlLGNvZGUsa2JkLHR0LHZhcntiYWNrZ3JvdW5kOiNGOEY5RkJ9cHJle2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bWFyZ2luLWJvdHRvbToxLjZlbTttYXgtd2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvO3BhZGRpbmc6MjRweDttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4fWNvZGUsa2JkLHR0LHZhcntmb250LWZhbWlseTpNb25hY28sIENvbnNvbGFzLCBcIkFuZGFsZSBNb25vXCIsIFwiRGVqYVZ1IFNhbnMgTW9ub1wiLCBtb25vc3BhY2U7Zm9udC1zaXplOjE2cHg7cGFkZGluZzoycHggNHB4fWFiYnIsYWNyb255bXtjdXJzb3I6aGVscH1tYXJrLGluc3t0ZXh0LWRlY29yYXRpb246bm9uZX1zbWFsbHtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O2xldHRlci1zcGFjaW5nOi0wLjFweH1iLHN0cm9uZ3tmb250LXdlaWdodDo2MDB9YnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYSxsYWJlbHtmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4fS5jb250YWluZXIsLmNvbnRhaW5lci1zbXt3aWR0aDoxMDAlO21hcmdpbjowIGF1dG87cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDoxNnB4fUBtZWRpYSAobWluLXdpZHRoOiA0ODFweCl7LmNvbnRhaW5lciwuY29udGFpbmVyLXNte3BhZGRpbmctbGVmdDoyNHB4O3BhZGRpbmctcmlnaHQ6MjRweH19LmNvbnRhaW5lcnttYXgtd2lkdGg6MTEyOHB4fS5jb250YWluZXItc217bWF4LXdpZHRoOjg0OHB4fS5jb250YWluZXIgLmNvbnRhaW5lci1zbXttYXgtd2lkdGg6ODAwcHg7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS5zY3JlZW4tcmVhZGVyLXRleHR7Y2xpcDpyZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7cG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDtoZWlnaHQ6MXB4O3dpZHRoOjFweDtvdmVyZmxvdzpoaWRkZW47d29yZC13cmFwOm5vcm1hbCAhaW1wb3J0YW50fS5zY3JlZW4tcmVhZGVyLXRleHQ6Zm9jdXN7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNoYWRvdzowIDAgMnB4IDJweCByZ2JhKDAsMCwwLDAuNik7Y2xpcDphdXRvICFpbXBvcnRhbnQ7ZGlzcGxheTpibG9jaztmb250LWZhbWlseTpcIklCTSBQbGV4IFNhbnNcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtsZXR0ZXItc3BhY2luZzowcHg7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjE2cHg7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojNTM1RkQ3ICFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7aGVpZ2h0OmF1dG87bGVmdDo4cHg7cGFkZGluZzoxNnB4IDMycHg7dG9wOjhweDt3aWR0aDphdXRvO3otaW5kZXg6MTAwMDAwfS5saXN0LXJlc2V0e2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjB9LnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtcHJpbWFyeXtjb2xvcjojNTM1RkQ3fS50ZXh0LXNlY29uZGFyeXtjb2xvcjojNjFFRkZEfS5oYXMtdG9wLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy10b3AtZGl2aWRlcjo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6I0U5RURGM30uaGFzLWJvdHRvbS1kaXZpZGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5oYXMtYm90dG9tLWRpdmlkZXI6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6I0U5RURGM30ubS0we21hcmdpbjowfS5tdC0we21hcmdpbi10b3A6MH0ubXItMHttYXJnaW4tcmlnaHQ6MH0ubWItMHttYXJnaW4tYm90dG9tOjB9Lm1sLTB7bWFyZ2luLWxlZnQ6MH0ubS04e21hcmdpbjo4cHh9Lm10LTh7bWFyZ2luLXRvcDo4cHh9Lm1yLTh7bWFyZ2luLXJpZ2h0OjhweH0ubWItOHttYXJnaW4tYm90dG9tOjhweH0ubWwtOHttYXJnaW4tbGVmdDo4cHh9Lm0tMTZ7bWFyZ2luOjE2cHh9Lm10LTE2e21hcmdpbi10b3A6MTZweH0ubXItMTZ7bWFyZ2luLXJpZ2h0OjE2cHh9Lm1iLTE2e21hcmdpbi1ib3R0b206MTZweH0ubWwtMTZ7bWFyZ2luLWxlZnQ6MTZweH0ubS0yNHttYXJnaW46MjRweH0ubXQtMjR7bWFyZ2luLXRvcDoyNHB4fS5tci0yNHttYXJnaW4tcmlnaHQ6MjRweH0ubWItMjR7bWFyZ2luLWJvdHRvbToyNHB4fS5tbC0yNHttYXJnaW4tbGVmdDoyNHB4fS5tLTMye21hcmdpbjozMnB4fS5tdC0zMnttYXJnaW4tdG9wOjMycHh9Lm1yLTMye21hcmdpbi1yaWdodDozMnB4fS5tYi0zMnttYXJnaW4tYm90dG9tOjMycHh9Lm1sLTMye21hcmdpbi1sZWZ0OjMycHh9Lm0tNDB7bWFyZ2luOjQwcHh9Lm10LTQwe21hcmdpbi10b3A6NDBweH0ubXItNDB7bWFyZ2luLXJpZ2h0OjQwcHh9Lm1iLTQwe21hcmdpbi1ib3R0b206NDBweH0ubWwtNDB7bWFyZ2luLWxlZnQ6NDBweH0ubS00OHttYXJnaW46NDhweH0ubXQtNDh7bWFyZ2luLXRvcDo0OHB4fS5tci00OHttYXJnaW4tcmlnaHQ6NDhweH0ubWItNDh7bWFyZ2luLWJvdHRvbTo0OHB4fS5tbC00OHttYXJnaW4tbGVmdDo0OHB4fS5tLTU2e21hcmdpbjo1NnB4fS5tdC01NnttYXJnaW4tdG9wOjU2cHh9Lm1yLTU2e21hcmdpbi1yaWdodDo1NnB4fS5tYi01NnttYXJnaW4tYm90dG9tOjU2cHh9Lm1sLTU2e21hcmdpbi1sZWZ0OjU2cHh9Lm0tNjR7bWFyZ2luOjY0cHh9Lm10LTY0e21hcmdpbi10b3A6NjRweH0ubXItNjR7bWFyZ2luLXJpZ2h0OjY0cHh9Lm1iLTY0e21hcmdpbi1ib3R0b206NjRweH0ubWwtNjR7bWFyZ2luLWxlZnQ6NjRweH0ucC0we3BhZGRpbmc6MH0ucHQtMHtwYWRkaW5nLXRvcDowfS5wci0we3BhZGRpbmctcmlnaHQ6MH0ucGItMHtwYWRkaW5nLWJvdHRvbTowfS5wbC0we3BhZGRpbmctbGVmdDowfS5wLTh7cGFkZGluZzo4cHh9LnB0LTh7cGFkZGluZy10b3A6OHB4fS5wci04e3BhZGRpbmctcmlnaHQ6OHB4fS5wYi04e3BhZGRpbmctYm90dG9tOjhweH0ucGwtOHtwYWRkaW5nLWxlZnQ6OHB4fS5wLTE2e3BhZGRpbmc6MTZweH0ucHQtMTZ7cGFkZGluZy10b3A6MTZweH0ucHItMTZ7cGFkZGluZy1yaWdodDoxNnB4fS5wYi0xNntwYWRkaW5nLWJvdHRvbToxNnB4fS5wbC0xNntwYWRkaW5nLWxlZnQ6MTZweH0ucC0yNHtwYWRkaW5nOjI0cHh9LnB0LTI0e3BhZGRpbmctdG9wOjI0cHh9LnByLTI0e3BhZGRpbmctcmlnaHQ6MjRweH0ucGItMjR7cGFkZGluZy1ib3R0b206MjRweH0ucGwtMjR7cGFkZGluZy1sZWZ0OjI0cHh9LnAtMzJ7cGFkZGluZzozMnB4fS5wdC0zMntwYWRkaW5nLXRvcDozMnB4fS5wci0zMntwYWRkaW5nLXJpZ2h0OjMycHh9LnBiLTMye3BhZGRpbmctYm90dG9tOjMycHh9LnBsLTMye3BhZGRpbmctbGVmdDozMnB4fS5wLTQwe3BhZGRpbmc6NDBweH0ucHQtNDB7cGFkZGluZy10b3A6NDBweH0ucHItNDB7cGFkZGluZy1yaWdodDo0MHB4fS5wYi00MHtwYWRkaW5nLWJvdHRvbTo0MHB4fS5wbC00MHtwYWRkaW5nLWxlZnQ6NDBweH0ucC00OHtwYWRkaW5nOjQ4cHh9LnB0LTQ4e3BhZGRpbmctdG9wOjQ4cHh9LnByLTQ4e3BhZGRpbmctcmlnaHQ6NDhweH0ucGItNDh7cGFkZGluZy1ib3R0b206NDhweH0ucGwtNDh7cGFkZGluZy1sZWZ0OjQ4cHh9LnAtNTZ7cGFkZGluZzo1NnB4fS5wdC01NntwYWRkaW5nLXRvcDo1NnB4fS5wci01NntwYWRkaW5nLXJpZ2h0OjU2cHh9LnBiLTU2e3BhZGRpbmctYm90dG9tOjU2cHh9LnBsLTU2e3BhZGRpbmctbGVmdDo1NnB4fS5wLTY0e3BhZGRpbmc6NjRweH0ucHQtNjR7cGFkZGluZy10b3A6NjRweH0ucHItNjR7cGFkZGluZy1yaWdodDo2NHB4fS5wYi02NHtwYWRkaW5nLWJvdHRvbTo2NHB4fS5wbC02NHtwYWRkaW5nLWxlZnQ6NjRweH0uc3IgLmhhcy1hbmltYXRpb25zIC5pcy1yZXZlYWxpbmd7dmlzaWJpbGl0eTpoaWRkZW59LmlucHV0LC50ZXh0YXJlYXtiYWNrZ3JvdW5kLWNvbG9yOiMxODI1Mzg7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiNFOUVERjM7Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6IzZCN0E5MDttYXgtd2lkdGg6MTAwJTt3aWR0aDoxMDAlfS5pbnB1dDo6cGxhY2Vob2xkZXIsLnRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojNkI3QTkwfS5pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC50ZXh0YXJlYTo6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2QjdBOTB9LmlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwudGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2QjdBOTB9LmlucHV0OmhvdmVyLC50ZXh0YXJlYTpob3Zlcntib3JkZXItY29sb3I6I2Q5ZTBlYX0uaW5wdXQ6YWN0aXZlLC5pbnB1dDpmb2N1cywudGV4dGFyZWE6YWN0aXZlLC50ZXh0YXJlYTpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiNFOUVERjN9LmlucHV0W2Rpc2FibGVkXSwudGV4dGFyZWFbZGlzYWJsZWRde2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNGOEY5RkI7Ym9yZGVyLWNvbG9yOiNGOEY5RkJ9LmlucHV0ey1tb3otYXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2ZvbnQtc2l6ZToxNnB4O2xldHRlci1zcGFjaW5nOi0wLjFweDtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MTNweCAxNnB4O2hlaWdodDo0OHB4O2JveC1zaGFkb3c6bm9uZX0uaW5wdXQgLmlubGluZS1pbnB1dHtkaXNwbGF5OmlubGluZTt3aWR0aDphdXRvfS50ZXh0YXJlYXtkaXNwbGF5OmJsb2NrO21pbi13aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbH0udGV4dGFyZWEgLmlubGluZS10ZXh0YXJlYXtkaXNwbGF5OmlubGluZTt3aWR0aDphdXRvfS5maWVsZC1ncm91cGVkPi5jb250cm9sOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTo4cHh9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl17b3V0bGluZTowO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowfS5zd2l0Y2hbdHlwZT1cImNoZWNrYm94XCJdK2xhYmVse2Rpc3BsYXk6aW5saW5lLWZsZXg7cG9zaXRpb246cmVsYXRpdmU7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nLWxlZnQ6NzhweDt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyfS5zd2l0Y2hbdHlwZT1cImNoZWNrYm94XCJdK2xhYmVsOjpiZWZvcmUsLnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl0rbGFiZWw6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9ja30uc3dpdGNoW3R5cGU9XCJjaGVja2JveFwiXStsYWJlbDo6YmVmb3Jle3RvcDowO2xlZnQ6MDt3aWR0aDo2NHB4O2hlaWdodDozNnB4O2JvcmRlci1yYWRpdXM6MThweDtiYWNrZ3JvdW5kOiNFOUVERjN9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl0rbGFiZWw6OmFmdGVye3RvcDo2cHg7bGVmdDo2cHg7d2lkdGg6MjRweDtoZWlnaHQ6MjRweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDojZmZmO3RyYW5zaXRpb246YWxsIC4xNXMgZWFzZS1vdXR9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtsYWJlbDo6YmVmb3Jle2JhY2tncm91bmQ6IzUzNUZEN30uc3dpdGNoW3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkK2xhYmVsOjphZnRlcntsZWZ0OjM0cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuZmllbGQtZ3JvdXBlZHtkaXNwbGF5OmZsZXh9LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2x7ZmxleC1zaHJpbms6MH0uZmllbGQtZ3JvdXBlZD4uY29udHJvbC5jb250cm9sLWV4cGFuZGVke2ZsZXgtZ3JvdzoxO2ZsZXgtc2hyaW5rOjF9LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2w6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXJpZ2h0OjhweH19LmJ1dHRvbntkaXNwbGF5OmlubGluZS1mbGV4O2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggU2Fuc1wiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2xldHRlci1zcGFjaW5nOjBweDtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtiYWNrZ3JvdW5kLWNvbG9yOiNFOUVERjM7Y29sb3I6IzUzNUZENyAhaW1wb3J0YW50O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzoxNnB4IDMycHg7aGVpZ2h0OjQ4cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5idXR0b246aG92ZXJ7YmFja2dyb3VuZDojZWNmMGY1fS5idXR0b246YWN0aXZle291dGxpbmU6MH0uYnV0dG9uOjpiZWZvcmV7Ym9yZGVyLXJhZGl1czoycHh9LmJ1dHRvbi1zaGFkb3d7cG9zaXRpb246cmVsYXRpdmV9LmJ1dHRvbi1zaGFkb3c6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2JveC1zaGFkb3c6MCA4cHggMjRweCByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpO21peC1ibGVuZC1tb2RlOm11bHRpcGx5O3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMTVzIGVhc2V9LmJ1dHRvbi1zaGFkb3c6aG92ZXI6OmJlZm9yZXtib3gtc2hhZG93OjAgOHB4IDI0cHggcmdiYSgyNTUsMjU1LDI1NSwwLjM1KX0uYnV0dG9uLXNte3BhZGRpbmc6OHB4IDI0cHg7aGVpZ2h0OjMycHh9LmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoMjU1LDI1NSwyNTUsMC4yNSl9LmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OmhvdmVyOjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoMjU1LDI1NSwyNTUsMC4zNSl9LmJ1dHRvbi1wcmltYXJ5e2NvbG9yOiNmZmYgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOiM1MzVGRDd9LmJ1dHRvbi1wcmltYXJ5OmhvdmVye2JhY2tncm91bmQ6IzU3NjNkOH0uYnV0dG9uLXByaW1hcnkuYnV0dG9uLXNoYWRvdzo6YmVmb3Jle2JveC1zaGFkb3c6MCA4cHggMTZweCByZ2JhKDgzLDk1LDIxNSwwLjI1KTttaXgtYmxlbmQtbW9kZTpub3JtYWx9LmJ1dHRvbi1wcmltYXJ5LmJ1dHRvbi1zaGFkb3c6aG92ZXI6OmJlZm9yZXtib3gtc2hhZG93OjAgOHB4IDE2cHggcmdiYSg4Myw5NSwyMTUsMC4zNSl9LmJ1dHRvbi1wcmltYXJ5IC5idXR0b24tc20uYnV0dG9uLXNoYWRvdzo6YmVmb3Jle2JveC1zaGFkb3c6MCA0cHggMTZweCByZ2JhKDgzLDk1LDIxNSwwLjI1KX0uYnV0dG9uLXByaW1hcnkgLmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OmhvdmVyOjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoODMsOTUsMjE1LDAuMzUpfS5idXR0b24tYmxvY2t7ZGlzcGxheTpmbGV4fS5zaXRlLWhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjI0cHggMDt6LWluZGV4OjJ9LnNpdGUtaGVhZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTE0MHB4O3JpZ2h0Oi0xMDBweDt3aWR0aDoxNDQwcHg7aGVpZ2h0OjMyNHB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2hlYWRlci1pbGx1c3RyYXRpb24tbGlnaHQuc3ZnXCIpfS5saWdodHMtb2ZmIC5zaXRlLWhlYWRlcjo6YmVmb3Jle2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2hlYWRlci1pbGx1c3RyYXRpb24tZGFyay5zdmdcIil9LnNpdGUtaGVhZGVyLWlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXJ9LmhlYWRlci1saW5rc3tkaXNwbGF5OmlubGluZS1mbGV4fS5oZWFkZXItbGlua3MgbGl7ZGlzcGxheTppbmxpbmUtZmxleH0uaGVhZGVyLWxpbmtzIGE6bm90KC5idXR0b24pe2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojODU5NUFFO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LWRlY29yYXRpb246bm9uZTtsaW5lLWhlaWdodDoxNnB4O3BhZGRpbmc6OHB4IDI0cHh9LmhlYWRlci1saW5rcyBhOm5vdCguYnV0dG9uKTpob3ZlciwuaGVhZGVyLWxpbmtzIGE6bm90KC5idXR0b24pOmFjdGl2ZXtjb2xvcjojZmZmfUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpdGUtaGVhZGVyOjpiZWZvcmV7ZGlzcGxheTpub25lfX0uaGVyb3t0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9Lmhlcm8tY29weXtwb3NpdGlvbjpyZWxhdGl2ZX0uaGVyby1wYXJhZ3JhcGh7bWFyZ2luLWJvdHRvbTozMnB4fS5oZXJvLWN0YXttYXgtd2lkdGg6NDAwcHg7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tYm90dG9tOjgwcHh9LmxpZ2h0cy10b2dnbGV7Y29sb3I6cmdiYSgxMDcsMTIyLDE0NCwwLjY0KX0uaGVhZGVyLWlsbHVzdHJhdGlvbntkaXNwbGF5Om5vbmV9LmhlYWRlci1pbGx1c3RyYXRpb24gaW1nLC5oZWFkZXItaWxsdXN0cmF0aW9uIHN2Z3ttYXgtd2lkdGg6bm9uZX0uaGVhZGVyLWlsbHVzdHJhdGlvbi1pbWFnZXtkaXNwbGF5Om5vbmV9Lmhlcm8tbWVkaWF7cG9zaXRpb246cmVsYXRpdmV9Lmhlcm8tbWVkaWEtaWxsdXN0cmF0aW9ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMTAlO2xlZnQ6LTE1cHh9Lmhlcm8tbWVkaWEtaWxsdXN0cmF0aW9uIGltZywuaGVyby1tZWRpYS1pbGx1c3RyYXRpb24gc3Zne21heC13aWR0aDoxMzYlfS5oZXJvLW1lZGlhLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZX0uaGVyby1tZWRpYS1pbWFnZXttYXJnaW46MCBhdXRvO2JveC1zaGFkb3c6NDhweCAxNnB4IDQ4cHggcmdiYSgyNCwzNyw1NiwwLjEyKTtib3JkZXItcmFkaXVzOjRweDt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDE2ZGVnKSByb3RhdGVYKDJkZWcpIHJvdGF0ZVooLTdkZWcpIHNjYWxlWSgwLjk1KSB0cmFuc2xhdGV4KDIlKX0ubGlnaHRzLW9mZiAuaGVyby1tZWRpYS1pbWFnZXtib3gtc2hhZG93OjQ4cHggMTZweCA0OHB4IHJnYmEoMCwwLDAsMC4yKX1AbWVkaWEgKG1heC13aWR0aDogNjM5cHgpey5oZXJvLWN0YT4qe2Rpc3BsYXk6ZmxleH0uaGVyby1jdGE+Kisqe21hcmdpbi10b3A6MzJweH0ubGlnaHRzLXRvZ2dsZXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfX1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5oZXJve3RleHQtYWxpZ246bGVmdDtwYWRkaW5nLXRvcDo4OHB4O3BhZGRpbmctYm90dG9tOjEyMHB4fS5oZXJvLWlubmVye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uaGVyby1jb3B5e3BhZGRpbmctdG9wOjQwcHg7cGFkZGluZy1yaWdodDo0OHB4O21pbi13aWR0aDo0NDhweDttYXgtd2lkdGg6NTEycHg7ei1pbmRleDoxfS5oZXJvLXRpdGxle21hcmdpbi1ib3R0b206MTZweH0uaGVyby1wYXJhZ3JhcGh7bWFyZ2luLWJvdHRvbTozMnB4fS5oZXJvLWN0YXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbjowfS5oZXJvLWN0YSAuYnV0dG9ue21pbi13aWR0aDoxNzBweH0uaGVyby1jdGEgLmJ1dHRvbjpmaXJzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MzJweH0uaGVhZGVyLWlsbHVzdHJhdGlvbntkaXNwbGF5OmJsb2NrfS5oZXJvLW1lZGlhe3otaW5kZXg6MH0uaGVyby1tZWRpYSBpbWcsLmhlcm8tbWVkaWEgc3Zne21heC13aWR0aDpub25lfS5oZWFkZXItaWxsdXN0cmF0aW9uLWltYWdle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0xNjhweDtsZWZ0Oi03MjJweDt3aWR0aDoxNDQwcHg7aGVpZ2h0OjMyNHB4fX0uZmVhdHVyZXMtd3JhcHttYXgtd2lkdGg6NTQwcHg7bWFyZ2luOjAgYXV0b30uZmVhdHVyZXMtaW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXRvcDo2NHB4O21hcmdpbi1ib3R0b206MTEycHh9LmZlYXR1cmVzLWlsbHVzdHJhdGlvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTIlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO21heC13aWR0aDoxMzYlfS5mZWF0dXJlcy1ib3h7bWFyZ2luOjAgYXV0bztib3gtc2hhZG93OjQ4cHggMTZweCA0OHB4IHJnYmEoMjQsMzcsNTYsMC4xMik7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgxMGRlZykgdHJhbnNsYXRlWSgyJSl9LmxpZ2h0cy1vZmYgLmZlYXR1cmVzLWJveHtib3gtc2hhZG93OjQ4cHggMTZweCA0OHB4IHJnYmEoMCwwLDAsMC4yKX0uZmVhdHVyZXt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjQ4cHh9LmZlYXR1cmU6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206MH0uZmVhdHVyZS1pY29ue2Rpc3BsYXk6aW5saW5lLWZsZXg7bWFyZ2luLWJvdHRvbToxNnB4fS5mZWF0dXJlLWljb24gaW1nLC5mZWF0dXJlLWljb24gc3Zne21heC13aWR0aDpub25lfS5mZWF0dXJlLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1ib3R0b206MjZweH0uZmVhdHVyZS10aXRsZTo6YWZ0ZXJ7Y29udGVudDonJzt3aWR0aDozMnB4O2hlaWdodDoycHg7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOi0xNHB4O2xlZnQ6Y2FsYyg1MCUgLSAxNnB4KTtiYWNrZ3JvdW5kOiNFOUVERjN9LmxpZ2h0cy1vZmYgLmZlYXR1cmUtdGl0bGU6OmFmdGVye2JhY2tncm91bmQ6IzMwNDA1N31AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5mZWF0dXJlc3twb3NpdGlvbjpyZWxhdGl2ZX0uZmVhdHVyZXMgLnNlY3Rpb24taW5uZXJ7cGFkZGluZy1ib3R0b206MTAwcHh9LmZlYXR1cmVzIC5zZWN0aW9uLXBhcmFncmFwaHtwYWRkaW5nLWxlZnQ6NzJweDtwYWRkaW5nLXJpZ2h0OjcycHh9LmZlYXR1cmVzOjpiZWZvcmV7Y29udGVudDonJzt3aWR0aDoxMDAlO2hlaWdodDozMDBweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjE2OHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSg4Myw5NSwyMTUsMCksIHJnYmEoODMsOTUsMjE1LDAuMDQpKX0ubGlnaHRzLW9mZiAuZmVhdHVyZXM6OmJlZm9yZXtkaXNwbGF5Om5vbmV9LmZlYXR1cmV7dGV4dC1hbGlnbjpsZWZ0fS5mZWF0dXJlLWlubmVye2Rpc3BsYXk6ZmxleH0uZmVhdHVyZS1pY29ue2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLXJpZ2h0OjMycHg7bWFyZ2luLWJvdHRvbTowfS5mZWF0dXJlLXRpdGxlOjphZnRlcntsZWZ0OjB9fS5jdGF7cG9zaXRpb246cmVsYXRpdmV9LmN0YSAuc2VjdGlvbi1pbm5lcntwYWRkaW5nLWJvdHRvbTo2NHB4fS5jdGEgLnNlY3Rpb24tcGFyYWdyYXBoe21hcmdpbi1ib3R0b206MzJweH0uY3RhOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206LTMycHg7bGVmdDpjYWxjKDUwJSAtIDcyMHB4KTtoZWlnaHQ6MjYzcHg7d2lkdGg6MTQ0MHB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2N0YS1pbGx1c3RyYXRpb24tbGlnaHQuc3ZnXCIpfS5saWdodHMtb2ZmIC5jdGE6OmJlZm9yZXtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi4uL2ltYWdlcy9jdGEtaWxsdXN0cmF0aW9uLWRhcmsuc3ZnXCIpfS5jdGEtY3Rhe21heC13aWR0aDo0MDBweDttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfUBtZWRpYSAobWF4LXdpZHRoOiA2MzlweCl7LmN0YS1jdGEgLmJ1dHRvbntkaXNwbGF5OmZsZXh9fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LmN0YSAuc2VjdGlvbi1pbm5lcntwYWRkaW5nLWJvdHRvbToxMjhweH0uY3RhIC5zZWN0aW9uLXBhcmFncmFwaHttYXJnaW4tYm90dG9tOjQwcHg7cGFkZGluZy1sZWZ0OjcycHg7cGFkZGluZy1yaWdodDo3MnB4fS5jdGE6OmJlZm9yZXtib3R0b206MH0uY3RhLWN0YSAuYnV0dG9ue21pbi13aWR0aDoxNzBweH19LmlzLWJveGVke2JhY2tncm91bmQ6I0U5RURGM30uYm9keS13cmFwe2JhY2tncm91bmQ6I2ZmZjtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4taGVpZ2h0OjEwMHZofS5ib3hlZC1jb250YWluZXJ7bWF4LXdpZHRoOjE0NDBweDttYXJnaW46MCBhdXRvO2JveC1zaGFkb3c6MCAxNnB4IDQ4cHggcmdiYSgyNTUsMjU1LDI1NSwwLjUpfW1haW57ZmxleDoxIDAgYXV0b30uc2VjdGlvbi1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjQ4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc2VjdGlvbi1pbm5lcntwYWRkaW5nLXRvcDo4OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9fS5zaXRlLWZvb3Rlcntmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMHB4O2xldHRlci1zcGFjaW5nOjBweDtiYWNrZ3JvdW5kOiMxODI1Mzg7Y29sb3I6IzZCN0E5MH0uc2l0ZS1mb290ZXIgYXtjb2xvcjojNkI3QTkwO3RleHQtZGVjb3JhdGlvbjpub25lfS5zaXRlLWZvb3RlciBhOmhvdmVyLC5zaXRlLWZvb3RlciBhOmFjdGl2ZXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5zaXRlLWZvb3Rlcjo6YmVmb3Jle2Rpc3BsYXk6bm9uZX0ubGlnaHRzLW9mZiAuc2l0ZS1mb290ZXI6OmJlZm9yZXtkaXNwbGF5OmJsb2NrfS5zaXRlLWZvb3Rlci1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4fS5mb290ZXItYnJhbmQsLmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rcywuZm9vdGVyLWNvcHlyaWdodHtmbGV4Om5vbmU7d2lkdGg6MTAwJTtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtze21hcmdpbi1ib3R0b206MjRweH0uZm9vdGVyLWxpbmtzIGxpK2xpLC5mb290ZXItc29jaWFsLWxpbmtzIGxpK2xpe21hcmdpbi1sZWZ0OjE2cHh9LmZvb3Rlci1zb2NpYWwtbGlua3MgbGl7ZGlzcGxheTppbmxpbmUtZmxleH0uZm9vdGVyLXNvY2lhbC1saW5rcyBsaSBhe3BhZGRpbmc6OHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpdGUtZm9vdGVyLWlubmVye2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmctdG9wOjcycHg7cGFkZGluZy1ib3R0b206NzJweH0uZm9vdGVyLWJyYW5kLC5mb290ZXItbGlua3MsLmZvb3Rlci1zb2NpYWwtbGlua3MsLmZvb3Rlci1jb3B5cmlnaHR7ZmxleDo1MCV9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWNvcHlyaWdodHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uZm9vdGVyLWxpbmtze29yZGVyOjE7bWFyZ2luLWJvdHRvbTowfX0uc3dpdGNoW3R5cGU9XCJjaGVja2JveFwiXStsYWJlbDo6YmVmb3Jle2JhY2tncm91bmQ6IzQxYTVlYTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzJGRUFGQyAwLCAjNTM1RkQ3IDEwMCUpfS5zd2l0Y2hbdHlwZT1cImNoZWNrYm94XCJdK2xhYmVsOjphZnRlcntiYWNrZ3JvdW5kOiNmZmZ9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtsYWJlbDo6YmVmb3Jle2JhY2tncm91bmQ6I2ZmOWQzNDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI0ZGQkM0OCAwLCAjRkU3RTFGIDEwMCUpfS5hc3NldC1saWdodCwuYXNzZXQtZGFya3t2aXNpYmlsaXR5OmhpZGRlbjtvcGFjaXR5OjB9LmlzLWxvYWRlZCAuYXNzZXQtbGlnaHQsLmlzLWxvYWRlZCAuYXNzZXQtZGFya3t2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxfS5hc3NldC1kYXJre2Rpc3BsYXk6bm9uZX0ubGlnaHRzLW9mZntjb2xvcjojODU5NUFFfS5saWdodHMtb2ZmIC5hc3NldC1saWdodHtkaXNwbGF5Om5vbmV9LmxpZ2h0cy1vZmYgLmFzc2V0LWRhcmt7ZGlzcGxheTpibG9ja30ubGlnaHRzLW9mZiBhe2NvbG9yOiM4NTk1QUV9LmxpZ2h0cy1vZmYgaDEsLmxpZ2h0cy1vZmYgaDIsLmxpZ2h0cy1vZmYgaDMsLmxpZ2h0cy1vZmYgaDQsLmxpZ2h0cy1vZmYgaDUsLmxpZ2h0cy1vZmYgaDYsLmxpZ2h0cy1vZmYgLmgxLC5saWdodHMtb2ZmIC5oMiwubGlnaHRzLW9mZiAuaDMsLmxpZ2h0cy1vZmYgLmg0LC5saWdodHMtb2ZmIC5oNSwubGlnaHRzLW9mZiAuaDZ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50fS5saWdodHMtb2ZmLmlzLWJveGVke2JhY2tncm91bmQ6IzIwMmQzZn0ubGlnaHRzLW9mZiAuYm9keS13cmFwe2JhY2tncm91bmQ6IzE4MjUzOH0ubGlnaHRzLW9mZiAuYm94ZWQtY29udGFpbmVye2JveC1zaGFkb3c6MCAxNnB4IDQ4cHggcmdiYSgwLDAsMCwwLjIpfS5saWdodHMtb2ZmIGhye2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMzMDQwNTd9LmxpZ2h0cy1vZmYgLmhhcy10b3AtZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubGlnaHRzLW9mZiAuaGFzLXRvcC1kaXZpZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMzA0MDU3fS5saWdodHMtb2ZmIC5oYXMtYm90dG9tLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9LmxpZ2h0cy1vZmYgLmhhcy1ib3R0b20tZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMzA0MDU3fWJvZHksYSxoMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNnt0cmFuc2l0aW9uOmNvbG9yIC4yNXMgZWFzZX0uaXMtYm94ZWQsLmJvZHktd3JhcCwuaGFzLXRvcC1kaXZpZGVyLC5oYXMtYm90dG9tLWRpdmlkZXI6OmFmdGVyLGhyOjphZnRlciwuZmVhdHVyZS10aXRsZTo6YWZ0ZXJ7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4yNXMgZWFzZX0uYm94ZWQtY29udGFpbmVye3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMTVzIGVhc2V9QGtleWZyYW1lcyBmYWRlSW5Mb2dvezAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoMC41KX19QGtleWZyYW1lcyBmYWRlSW5MZWZ0TWVkaWF7MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgwLjgpIHRyYW5zbGF0ZTNkKDQwcHgsIDEwcHgsIDApfTMwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZmFkZUluTGVmdElsbHVzdHJhdGlvbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKDAuOTUpIHRyYW5zbGF0ZTNkKDQwcHgsIDEwcHgsIDApfX1Aa2V5ZnJhbWVzIGZhZGVVcEJveHswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKDAuOTUpIHRyYW5zbGF0ZTNkKC00MHB4LCAyMHB4LCAwKX0zMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9fS5pcy1sb2FkZWQgLmhlYWRlci1sb2dvLWltYWdle2FuaW1hdGlvbjpmYWRlSW5Mb2dvIDAuMzVzIGJvdGggY3ViaWMtYmV6aWVyKDAuMywgMCwgMC4yLCAxKTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm19LmlzLWxvYWRlZCAuaGVyby1tZWRpYS1pbWFnZXthbmltYXRpb246ZmFkZUluTGVmdE1lZGlhIDFzIDAuMnMgYm90aCBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjIsIDEpO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0uaXMtbG9hZGVkIC5oZXJvLW1lZGlhLWlsbHVzdHJhdGlvbi1pbWFnZXthbmltYXRpb246ZmFkZUluTGVmdElsbHVzdHJhdGlvbiAxcyAwLjJzIGJvdGggY3ViaWMtYmV6aWVyKDAuMywgMCwgMC4yLCAxKTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm19LmlzLWxvYWRlZCAuZmVhdHVyZXMtYm94e2FuaW1hdGlvbjpmYWRlVXBCb3ggMXMgMC4ycyBib3RoIGN1YmljLWJlemllcigwLjMsIDAsIDAuMiwgMSk7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5pcy1sb2FkZWQgLmhlYWRlci1pbGx1c3RyYXRpb24taW1hZ2V7YW5pbWF0aW9uOmZhZGVJbiAxcyBib3RoIGN1YmljLWJlemllcigwLjMsIDAsIDAuMiwgMSk7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5pcy1sb2FkZWQgLmZlYXR1cmVzLWlsbHVzdHJhdGlvbnthbmltYXRpb246ZmFkZUluIDFzIDAuMnMgYm90aCBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjIsIDEpO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX1cbiJdfQ== */ \ No newline at end of file diff --git a/dist/images/cta-illustration-dark.svg b/dist/images/cta-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..73cc7d0774466e6d668ce0397e0bc7997e03b32a --- /dev/null +++ b/dist/images/cta-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/cta-illustration-light.svg b/dist/images/cta-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..36f8a306151b90c3e3f121d4f5b17889df06f757 --- /dev/null +++ b/dist/images/cta-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-01-dark.svg b/dist/images/feature-01-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..d897b8f30ccac147d322418cb63920bf4cba12e2 --- /dev/null +++ b/dist/images/feature-01-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-01-light.svg b/dist/images/feature-01-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..0af47b979bfc9f8c1d9ee6ec8be5762e8e1f2b7b --- /dev/null +++ b/dist/images/feature-01-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-02-dark.svg b/dist/images/feature-02-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..239e3a907e8507a0a933dc451891dbd3de742da2 --- /dev/null +++ b/dist/images/feature-02-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-02-light.svg b/dist/images/feature-02-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..805fc5836893aae52a092bcbb0692b1f5d900baf --- /dev/null +++ b/dist/images/feature-02-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-03-dark.svg b/dist/images/feature-03-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..5ff71fc5a9dfb909c9158b3128e70c8545b14225 --- /dev/null +++ b/dist/images/feature-03-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/feature-03-light.svg b/dist/images/feature-03-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..84ce002d07fd2e3b2d0477205514d1145ed25504 --- /dev/null +++ b/dist/images/feature-03-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/features-box-dark.svg b/dist/images/features-box-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..822e948b3fee46d7fb02a297348d30a7f7c388d6 --- /dev/null +++ b/dist/images/features-box-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/features-box-light.svg b/dist/images/features-box-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ed6dfdca1c2a571ed9d609ea4252fb35be33694 --- /dev/null +++ b/dist/images/features-box-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/features-illustration-dark.svg b/dist/images/features-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..3236f35b8d818dd896a3bfa84f889c3369bdf346 --- /dev/null +++ b/dist/images/features-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/features-illustration-light.svg b/dist/images/features-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..df7c2066170015ea1d3ca3a489e6afd51ace6be0 --- /dev/null +++ b/dist/images/features-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/features-illustration-top-dark.svg b/dist/images/features-illustration-top-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..b6df51b7065b7a6cfb046801af28d4278e40d5a1 --- /dev/null +++ b/dist/images/features-illustration-top-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/features-illustration-top-light.svg b/dist/images/features-illustration-top-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..cf8d2eb198d436f87fdce25fd58ad879026985c6 --- /dev/null +++ b/dist/images/features-illustration-top-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/header-illustration-dark.svg b/dist/images/header-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..62626120c88d80e47d0492b1a717dfc557066e38 --- /dev/null +++ b/dist/images/header-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/header-illustration-light.svg b/dist/images/header-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..e0b1bb1f814c24c2ee1181321369564e38abbcf2 --- /dev/null +++ b/dist/images/header-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/hero-media-dark.svg b/dist/images/hero-media-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..7f90c9264b6b919625415e2931af1502d4d1a424 --- /dev/null +++ b/dist/images/hero-media-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/hero-media-illustration-dark.svg b/dist/images/hero-media-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..40f2f9d6f149fb782cb6bc194698b0d569425f96 --- /dev/null +++ b/dist/images/hero-media-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/hero-media-illustration-light.svg b/dist/images/hero-media-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..64fb6685ef8eb20fead1b043a80e7e6e34fe8f14 --- /dev/null +++ b/dist/images/hero-media-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/hero-media-light.svg b/dist/images/hero-media-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..68247963be4b25c902759209824f745d2cf8785a --- /dev/null +++ b/dist/images/hero-media-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/logo-dark.svg b/dist/images/logo-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..83109e4aef5c98be8316d32d9cc6c1bd6db2c5b7 --- /dev/null +++ b/dist/images/logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/logo-light.svg b/dist/images/logo-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..46c932cc79caabd8c4a1b9145f6839fba8664233 --- /dev/null +++ b/dist/images/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/js/main.min.js b/dist/js/main.min.js new file mode 100644 index 0000000000000000000000000000000000000000..217e22c8680700550d7dd6bddebb8619f05d8eaf --- /dev/null +++ b/dist/js/main.min.js @@ -0,0 +1 @@ +!function(){const e=document,t=e.documentElement,n=e.body,i=e.getElementById("lights-toggle"),s=window.sr=ScrollReveal();function a(){let e=i.parentNode.querySelector(".label-text");i.checked?(n.classList.remove("lights-off"),e&&(e.innerHTML="dark")):(n.classList.add("lights-off"),e&&(e.innerHTML="light"))}t.classList.remove("no-js"),t.classList.add("js"),window.addEventListener("load",function(){n.classList.add("is-loaded")}),n.classList.contains("has-animations")&&window.addEventListener("load",function(){s.reveal(".feature",{duration:600,distance:"20px",easing:"cubic-bezier(0.215, 0.61, 0.355, 1)",origin:"right",viewFactor:.2})}),i&&(window.addEventListener("load",a),i.addEventListener("change",a))}(); \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000000000000000000000000000000000000..4e18756945dd902963e0d904e75fec975bc349a8 --- /dev/null +++ b/index.html @@ -0,0 +1,193 @@ + + + + + + + Switch Template + + + + + +
+ + +
+
+
+
+
+

Welcome to IELTS Autograder

+

Our mission is to lead the way in language assessment by developing cutting-edge solutions that leverage technology to provide fair, efficient, and effective evaluation methods.

+
+ Test it now! +
+ + +
+
+
+
+
+ Header illustration + Header illustration +
+
+ Hero media illustration + Hero media illustration +
+
+ Hero media + Hero media +
+
+
+
+
+ +
+
+
+
+
+

The Product

+

Our state of the art ML and AI powered IELTS Autograding tool will grade your IELTS Essays for you automatically

+
+ Feature illustration + Feature box + Feature illustration top + Feature illustration + Feature box + Feature illustration top +
+
+
+ +
+
+
+ + +
+ + +
+ + + + diff --git a/package-sample.json b/package-sample.json new file mode 100644 index 0000000000000000000000000000000000000000..0a916d07954d0575f654cf757666efd89946b8ed --- /dev/null +++ b/package-sample.json @@ -0,0 +1,54 @@ +{ + "name": "switch", + "version": "1.0.0", + "description": "Switch Template", + "author": "Pasquale Vitiello ", + "license": "GPLv3", + "repository": { + "type": "git", + "url": "https://bitbucket.org/pasqualevitiello/switch.git" + }, + "bugs": { + "url": "https://bitbucket.org/pasqualevitiello/switch/issues" + }, + "scripts": { + "clean": "rimraf dist/{css/*,js/*,images/*}", + "autoprefixer": "postcss -u autoprefixer -r dist/css/*", + "scss": "node-sass --output-style compressed -o dist/css src/scss", + "lint": "eslint src/js || true", + "lint-scss": "stylelint src/scss/*.scss --syntax scss || true", + "uglify": "mkdirp dist/js -p && uglifyjs src/js/*.js -m -c -o dist/js/main.min.js", + "imagemin": "imagemin src/images/* -o dist/images", + "serve": "browser-sync start --server --files \"dist/css/*.css, dist/js/*.js, **/*.html, !node_modules/**/*.html\"", + "build:css": "run-s lint-scss scss autoprefixer", + "build:js": "run-s lint uglify", + "build:images": "run-s imagemin", + "build": "run-s build:*", + "watch:css": "onchange \"src/scss\" -- run-s build:css", + "watch:js": "onchange \"src/js\" -- run-s build:js", + "watch:images": "onchange \"src/images\" -- run-s build:images", + "watch": "run-p serve watch:*", + "postinstall": "run-s build watch" + }, + "devDependencies": { + "autoprefixer": "^9.0.1", + "browser-sync": "^2.12.8", + "eslint": "^5.2.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-node": "^7.0.1", + "eslint-plugin-promise": "^3.8.0", + "eslint-plugin-standard": "^3.1.0", + "imagemin-cli": "^3.0.0", + "mkdirp": "^0.5.1", + "node-sass": "^4.9.2", + "npm-run-all": "^4.1.3", + "onchange": "^4.1.0", + "postcss-cli": "^6.0.0", + "rimraf": "^2.5.4", + "stylelint": "^9.4.0", + "uglify-es": "^3.3.10" + }, + "homepage": "https://bitbucket.org/pasqualevitiello/switch#readme", + "main": ".eslintrc.js" +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..4803a9a0e9ae8187b540e01e595e7d10bb49968d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +transformers +torch \ No newline at end of file diff --git a/run.bat b/run.bat new file mode 100644 index 0000000000000000000000000000000000000000..91d2eba9980ff4222ad4a886572171bfcd04a14b --- /dev/null +++ b/run.bat @@ -0,0 +1,7 @@ +@echo off + + +call c:/Users/Karan/Documents/AI_COURSE/aasd4011-2023-spring/venv/pytorch/Scripts/Activate.bat +start c:/Users/Karan/Documents/AI_COURSE/aasd4011-2023-spring/venv/pytorch/Scripts/python.exe c:/Users/Karan/Documents/AI_COURSE/IELTSAuto/app.py +start c:/Users/Karan/Documents/AI_COURSE/aasd4011-2023-spring/venv/pytorch/Scripts/python.exe -m http.server 8000 +start ngrok http 8000 \ No newline at end of file diff --git a/src/images/cta-illustration-dark.svg b/src/images/cta-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..60a2d0f96df38dea74501c9e03d216206423da5f --- /dev/null +++ b/src/images/cta-illustration-dark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/images/cta-illustration-light.svg b/src/images/cta-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..54f81e7fa1c576efd35ac11512cb80af5dfa18e8 --- /dev/null +++ b/src/images/cta-illustration-light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/feature-01-dark.svg b/src/images/feature-01-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..44b22f9a9efc2f485a4336cf96256108905c9b40 --- /dev/null +++ b/src/images/feature-01-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/feature-01-light.svg b/src/images/feature-01-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..e97684ea0a58fe6574db9a7e4101f8adbb9f006a --- /dev/null +++ b/src/images/feature-01-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/feature-02-dark.svg b/src/images/feature-02-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..309a3c31b113fe9e0e08acf51b71e38ee9960c23 --- /dev/null +++ b/src/images/feature-02-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/images/feature-02-light.svg b/src/images/feature-02-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..84670300b33a7d4f400abaab60d505d697fa8961 --- /dev/null +++ b/src/images/feature-02-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/images/feature-03-dark.svg b/src/images/feature-03-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..de91428657fe3c8567b5b27c546957feca1bb29f --- /dev/null +++ b/src/images/feature-03-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/feature-03-light.svg b/src/images/feature-03-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..0e29c1207a65ccbdeb08c46c0cfa78d2d21b9031 --- /dev/null +++ b/src/images/feature-03-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/features-box-dark.svg b/src/images/features-box-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..54bc00f69b454b74aa6d88fc466ce941afa78f25 --- /dev/null +++ b/src/images/features-box-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/images/features-box-light.svg b/src/images/features-box-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..8b6087998eef57ef4c10afb18c3c91d9edf35e65 --- /dev/null +++ b/src/images/features-box-light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/images/features-illustration-dark.svg b/src/images/features-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..8763e36760d4ee678963d2f9c283e215271e5ee3 --- /dev/null +++ b/src/images/features-illustration-dark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/features-illustration-light.svg b/src/images/features-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..476225f9fe7d563a67c2a1fb0734041777a4f738 --- /dev/null +++ b/src/images/features-illustration-light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/features-illustration-top-dark.svg b/src/images/features-illustration-top-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..3775c1bacb7a3614b669a30801fbeeae59fec856 --- /dev/null +++ b/src/images/features-illustration-top-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/images/features-illustration-top-light.svg b/src/images/features-illustration-top-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..8e2793bcd614186daeef939cc4806628e76ccdf7 --- /dev/null +++ b/src/images/features-illustration-top-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/images/header-illustration-dark.svg b/src/images/header-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..23e6a86179fb5f6a4e4cef5ddb67c24a739601eb --- /dev/null +++ b/src/images/header-illustration-dark.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/header-illustration-light.svg b/src/images/header-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..7a7904fe87c712e537bda78a38a2660eb92ecd3a --- /dev/null +++ b/src/images/header-illustration-light.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/hero-media-dark.svg b/src/images/hero-media-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..8d351fc6bde69271d4ff3fa96162c449cfa4fdfe --- /dev/null +++ b/src/images/hero-media-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/hero-media-illustration-dark.svg b/src/images/hero-media-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..fef38746e578f732b02fc3b064aa75993becc0a0 --- /dev/null +++ b/src/images/hero-media-illustration-dark.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/hero-media-illustration-light.svg b/src/images/hero-media-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..44282cd28e6af2f9c94fa601e118841ae43c5c4a --- /dev/null +++ b/src/images/hero-media-illustration-light.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/images/hero-media-light.svg b/src/images/hero-media-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..d47d5f45f0e5d3fd3821d0dfe12a0b7b987d9705 --- /dev/null +++ b/src/images/hero-media-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/images/logo-dark.svg b/src/images/logo-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..496de15d5cc9857b01936c73d717c03d71e33ce7 --- /dev/null +++ b/src/images/logo-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/images/logo-light.svg b/src/images/logo-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..02d2581d291fbf67dd287e05f7425122792fe63d --- /dev/null +++ b/src/images/logo-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/js/main.js b/src/js/main.js new file mode 100644 index 0000000000000000000000000000000000000000..01720c17f8de6e991161e4eb0c7fb8f078b246ca --- /dev/null +++ b/src/js/main.js @@ -0,0 +1,51 @@ +(function () { + const doc = document + const rootEl = doc.documentElement + const body = doc.body + const lightSwitch = doc.getElementById('lights-toggle') + /* global ScrollReveal */ + const sr = window.sr = ScrollReveal() + + rootEl.classList.remove('no-js') + rootEl.classList.add('js') + + window.addEventListener('load', function () { + body.classList.add('is-loaded') + }) + + // Reveal animations + function revealAnimations () { + sr.reveal('.feature', { + duration: 600, + distance: '20px', + easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)', + origin: 'right', + viewFactor: 0.2 + }) + } + + if (body.classList.contains('has-animations')) { + window.addEventListener('load', revealAnimations) + } + + // Light switcher + if (lightSwitch) { + window.addEventListener('load', checkLights) + lightSwitch.addEventListener('change', checkLights) + } + + function checkLights () { + let labelText = lightSwitch.parentNode.querySelector('.label-text') + if (lightSwitch.checked) { + body.classList.remove('lights-off') + if (labelText) { + labelText.innerHTML = 'dark' + } + } else { + body.classList.add('lights-off') + if (labelText) { + labelText.innerHTML = 'light' + } + } + } +}()) diff --git a/src/scss/_normalize.scss b/src/scss/_normalize.scss new file mode 100644 index 0000000000000000000000000000000000000000..8025dce8e4874ad25f8e91f2ac504f6e8ceab97e --- /dev/null +++ b/src/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/src/scss/abstracts/_functions.scss b/src/scss/abstracts/_functions.scss new file mode 100644 index 0000000000000000000000000000000000000000..6aa6a1c7581301b0556a85bdfb69d24e88df6999 --- /dev/null +++ b/src/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/src/scss/abstracts/_include-media.scss b/src/scss/abstracts/_include-media.scss new file mode 100644 index 0000000000000000000000000000000000000000..bb5ccd583e723708912ff35c3f3695de777db646 --- /dev/null +++ b/src/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/src/scss/abstracts/_mixins.scss b/src/scss/abstracts/_mixins.scss new file mode 100644 index 0000000000000000000000000000000000000000..e7dddc35ccf0173c698fbe1b2c5f2c72ad1d1c53 --- /dev/null +++ b/src/scss/abstracts/_mixins.scss @@ -0,0 +1,112 @@ +// 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(primary, 1); + text-decoration: none; + + &:hover, + &:active { + outline: 0; + text-decoration: underline; + } + } @else if ($type == 'header') { + color: color(typography, 2i); + text-transform: uppercase; + text-decoration: none; + + &:hover, + &:active { + color: color(typography, 1i); + } + } @else if ($type == 'footer') { + color: color(typography, 2); + text-decoration: none; + + &:hover, + &:active { + text-decoration: underline; + } + } +} + +@mixin shadow($layout: false) { + @if ( $layout == 'dark' ) { + box-shadow: 0 16px 48px rgba(darken(color(bg, 1i), 35%), .2); + } @else { + box-shadow: 0 16px 48px rgba(color(bg, 1), .5); + } +} + +@mixin shadow-sm($layout: false) { + @if ( $layout == 'dark' ) { + box-shadow: 0 16px 24px rgba(darken(color(bg, 1i), 35%), .2); + } @else { + box-shadow: 0 16px 24px rgba(color(bg, 1), .5); + } +} + +@mixin divider-mix($layout: false) { + display: block; + height: 1px; + @if ( $layout == 'dark' ) { + background: color(bg, 3i); + } @else { + background: color(bg, 3); + } +} + +@mixin divider($type: false, $layout: false) { + @if ( $type == 'before' ) { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + @include divider-mix($layout); + } + } @else if ($type == 'after') { + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + @include divider-mix($layout); + } + } @else { + @include divider-mix($layout); + } +} diff --git a/src/scss/abstracts/_variables.scss b/src/scss/abstracts/_variables.scss new file mode 100644 index 0000000000000000000000000000000000000000..8f7bab179f40ea18c49309d70025f656885b6b92 --- /dev/null +++ b/src/scss/abstracts/_variables.scss @@ -0,0 +1,96 @@ +// -------------------------------------------- +// Colors ------------------------------------- +// Usage example: color(primary, main) +// -------------------------------------------- +$color: ( + typography: ( + 1: #182538, + 2: #6B7A90, + 1i: #FFFFFF, + 2i: #8595AE + ), + bg: ( + 1: #FFFFFF, + 2: #F8F9FB, + 3: #E9EDF3, + 1i: #182538, + 2i: #223146, + 3i: #304057 + ), + primary: ( + 1: #535FD7, + 2: #7C85E1, + 3: #212880 + ), + secondary: ( + 1: #61EFFD, + 2: #93F4FE, + 3: #2FEAFC + ), + tertiary: ( + 1: #FFBC48, + 2: #FFCF7B, + 3: #FE7E1F + ) +); + +// -------------------------------------------- +// Typography --------------------------------- +// -------------------------------------------- +$font__family: ( + base: '"Heebo", 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, -0.1px ), + gamma: ( 32px, 42px, -0.1px ), + delta: ( 24px, 34px, -0.1px ), + epsilon: ( 20px, 30px, -0.1px ), + zeta: ( 18px, 27px, -0.1px ), + eta: ( 16px, 24px, -0.1px ), + theta: ( 14px, 20px, 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, 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 + 7: map-get($font__sizes, eta), // Text smaller + 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 + 7: map-get($font__sizes, eta), // Text smaller + 8: map-get($font__sizes, theta) // Footer area + ) +); + +$font__weight: ( + regular: 400, // font__weight(regular) + medium: 500, // font__weight(medium) + semibold: 600, // font__weight(semibold) + bold: 700 // font__weight(bold) +); + +// -------------------------------------------- +// Structure ---------------------------------- +// -------------------------------------------- +$content__padding: ( + mobile: 16px, + desktop: 24px +); +$container__width: 1080px; +$container__width-sm: 800px; diff --git a/src/scss/base/_base.scss b/src/scss/base/_base.scss new file mode 100644 index 0000000000000000000000000000000000000000..9a4da5c4a8d4f2bd0a93e26d676cb564465e0fd9 --- /dev/null +++ b/src/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, 1); /* 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/src/scss/base/_helpers.scss b/src/scss/base/_helpers.scss new file mode 100644 index 0000000000000000000000000000000000000000..3be23a125b829d19e3ddaf2ee996dccc55328674 --- /dev/null +++ b/src/scss/base/_helpers.scss @@ -0,0 +1,472 @@ +.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; + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @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, 1); + 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); +} + +.text-secondary { + color: color(secondary, 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; + } + } +} diff --git a/src/scss/base/_typography.scss b/src/scss/base/_typography.scss new file mode 100644 index 0000000000000000000000000000000000000000..7e764cdbccda150dfacd3bdfda673be000bc2478 --- /dev/null +++ b/src/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, 2); + 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/src/scss/components/_buttons.scss b/src/scss/components/_buttons.scss new file mode 100644 index 0000000000000000000000000000000000000000..ff7a037d97cfa904907a93b5ed93170666f0891a --- /dev/null +++ b/src/scss/components/_buttons.scss @@ -0,0 +1,125 @@ +.button { + display: inline-flex; + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @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(primary, 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-shadow { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + box-shadow: 0 8px 24px rgba(color(bg, 1), .25); + mix-blend-mode: multiply; + transition: box-shadow .15s ease; + } + + &:hover { + + &::before { + box-shadow: 0 8px 24px rgba(color(bg, 1), .35); + } + } +} + +.button-sm { + padding: 8px 24px; + height: 32px; + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(bg, 1), .25); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(bg, 1), .35); + } + } + } +} + +.button-primary { + color: color(typography, 1i) !important; + background-color: color(primary, 1); + + &:hover { + background: lighten(color(primary, 1), 1%); + } + + &.button-shadow { + + &::before { + box-shadow: 0 8px 16px rgba(color(primary, 1), .25); + mix-blend-mode: normal; + } + + &:hover { + + &::before { + box-shadow: 0 8px 16px rgba(color(primary, 1), .35); + } + } + } + + .button-sm { + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(primary, 1), .25); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(primary, 1), .35); + } + } + } + } +} + +.button-block { + display: flex; +} diff --git a/src/scss/components/_forms.scss b/src/scss/components/_forms.scss new file mode 100644 index 0000000000000000000000000000000000000000..49b7609aeba99286bba72fe9f13928d18902fda4 --- /dev/null +++ b/src/scss/components/_forms.scss @@ -0,0 +1,157 @@ +.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, 2); + } + + &::-ms-input-placeholder { + color: color(typography, 2); + } + + &:-ms-input-placeholder { + color: color(typography, 2); + } + + &: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; + } + } +} + +.switch[type="checkbox"] { + outline: 0; + user-select: none; + position: absolute; + opacity: 0; + + + label { + display: inline-flex; + position: relative; + line-height: 36px; + padding-left: 78px; + user-select: none; + cursor: pointer; + + &::before, + &::after { + content: ''; + position: absolute; + display: block; + } + + &::before { + top: 0; + left: 0; + width: 64px; + height: 36px; + border-radius: 18px; + background: color(bg, 3); + } + + &::after { + top: 6px; + left: 6px; + width: 24px; + height: 24px; + border-radius: 12px; + background: color(bg, 1); + transition: all .15s ease-out; + } + } + + &:checked { + + + label { + + &::before { + background: color(primary, 1); + } + + &::after { + left: 34px; + } + } + } +} + +@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/src/scss/layout/_cta.scss b/src/scss/layout/_cta.scss new file mode 100644 index 0000000000000000000000000000000000000000..99ee10eca0eb4ca0c77e685e8631dae3b0adb67d --- /dev/null +++ b/src/scss/layout/_cta.scss @@ -0,0 +1,68 @@ +.cta { + position: relative; + + .section-inner { + padding-bottom: 64px; + } + + .section-paragraph { + margin-bottom: 32px; + } + + &::before { + content: ''; + position: absolute; + bottom: -32px; + left: calc(50% - 720px); + height: 263px; + width: 1440px; + background-image: url('../images/cta-illustration-light.svg'); + + .lights-off & { + background-image: url('../images/cta-illustration-dark.svg'); + } + } +} + +.cta-cta { + max-width: 400px; + margin-left: auto; + margin-right: auto; +} + +@include media( 'medium' ) { + + .cta { + + .section-inner { + padding-bottom: 128px; + } + + .section-paragraph { + margin-bottom: 40px; + padding-left: 72px; + padding-right: 72px; + } + + &::before { + bottom: 0; + } + } + + .cta-cta { + + .button { + min-width: 170px; + } + } +} diff --git a/src/scss/layout/_faqs.scss b/src/scss/layout/_faqs.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/scss/layout/_features.scss b/src/scss/layout/_features.scss new file mode 100644 index 0000000000000000000000000000000000000000..ba94c0b01ae3d56dc4cf864962cda29d153bfdc0 --- /dev/null +++ b/src/scss/layout/_features.scss @@ -0,0 +1,118 @@ +.features-wrap { + max-width: 540px; + margin: 0 auto; +} + +.features-image { + position: relative; + margin-top: 64px; + margin-bottom: 112px; +} + +.features-illustration { + position: absolute; + top: -2%; + left: 50%; + transform: translateX(-50%); + max-width: 136%; +} + +.features-box { + margin: 0 auto; + box-shadow: 48px 16px 48px rgba(color(typography, 1), .12); + transform: perspective(1000px) rotateY(10deg) translateY(2%); + + .lights-off & { + box-shadow: 48px 16px 48px rgba(darken(color(bg, 1i), 35%), .2); + } +} + +.feature { + text-align: center; + margin-bottom: 48px; + + &:last-of-type { + margin-bottom: 0; + } +} + +.feature-icon { + display: inline-flex; + margin-bottom: 16px; + + img, + svg { + max-width: none; + } +} + +.feature-title { + position: relative; + margin-bottom: 26px; + + &::after { + content: ''; + width: 32px; + height: 2px; + position: absolute; + bottom: -14px; + left: calc(50% - 16px); + background: color(bg, 3); + + .lights-off & { + background: color(bg, 3i); + } + } +} + +@include media( '>medium' ) { + + .features { + position: relative; + + .section-inner { + padding-bottom: 100px; + } + + .section-paragraph { + padding-left: 72px; + padding-right: 72px; + } + + &::before { + content: ''; + width: 100%; + height: 300px; + position: absolute; + left: 0; + top: 168px; + background: linear-gradient(to bottom, rgba(color(primary, 1), 0), rgba(color(primary, 1), .04)); + + .lights-off & { + display: none; + } + } + } + + .feature { + text-align: left; + } + + .feature-inner { + display: flex; + } + + .feature-icon { + display: block; + margin-top: 8px; + margin-right: 32px; + margin-bottom: 0; + } + + .feature-title { + + &::after { + left: 0; + } + } +} diff --git a/src/scss/layout/_footer.scss b/src/scss/layout/_footer.scss new file mode 100644 index 0000000000000000000000000000000000000000..5c645a773a20756085ee2ebf40556944c0f8b9ec --- /dev/null +++ b/src/scss/layout/_footer.scss @@ -0,0 +1,99 @@ +.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); + } + } + background: color(bg, 1i); + color: color(typography, 2); + + a { + @include anchor-aspect(footer); + } + + &::before { + display: none; + + .lights-off & { + display: block; + } + } +} + +.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-links, +.footer-social-links { + + li { + + + li { + margin-left: 16px; + } + } +} + +.footer-social-links { + + li { + display: inline-flex; + + a { + padding: 8px; + } + } +} + +@include media( '>medium' ) { + + .site-footer-inner { + justify-content: space-between; + padding-top: 72px; + padding-bottom: 72px; + } + + .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/src/scss/layout/_header.scss b/src/scss/layout/_header.scss new file mode 100644 index 0000000000000000000000000000000000000000..27dc4afeee8e883200807b0e193796d5e9695389 --- /dev/null +++ b/src/scss/layout/_header.scss @@ -0,0 +1,57 @@ +.site-header { + position: relative; + padding: 24px 0; + z-index: 2; + + &::before { + content: ''; + position: absolute; + top: -140px; + right: -100px; + width: 1440px; + height: 324px; + background-image: url('../images/header-illustration-light.svg'); + + .lights-off & { + background-image: url('../images/header-illustration-dark.svg'); + } + } +} + +.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 { + + &::before { + display: none; + } + } +} diff --git a/src/scss/layout/_hero.scss b/src/scss/layout/_hero.scss new file mode 100644 index 0000000000000000000000000000000000000000..69b5c4a92e9afd031b3b0cb5d8522ff24729b980 --- /dev/null +++ b/src/scss/layout/_hero.scss @@ -0,0 +1,152 @@ +.hero { + text-align: center; + padding-top: 48px; + padding-bottom: 88px; +} + +.hero-copy { + position: relative; /* To display elements above hero illustrations */ +} + +.hero-paragraph { + margin-bottom: 32px; +} + +.hero-cta { + max-width: 400px; + margin-left: auto; + margin-right: auto; + margin-bottom: 80px; +} + +.lights-toggle { + color: rgba(color(typography, 2), .64); +} + +.header-illustration { + display: none; + + img, + svg { + max-width: none; + } +} + +.header-illustration-image { + display: none; +} + +.hero-media { + position: relative; +} + +.hero-media-illustration { + position: absolute; + top: -10%; + left: -15px; + + img, + svg { + max-width: 136%; + } +} + +.hero-media-container { + position: relative; +} + +.hero-media-image { + margin: 0 auto; + box-shadow: 48px 16px 48px rgba(color(bg, 1i), .12); + border-radius: 4px; + transform: perspective(1000px) rotateY(16deg) rotateX(2deg) rotateZ(-7deg) scaleY(.95) translatex(2%); + + .lights-off & { + box-shadow: 48px 16px 48px rgba(darken(color(bg, 1i), 35%), .2); + } +} + +@include media( ' * { + display: flex; + + + * { + margin-top: 32px; + } + } + } + + .lights-toggle { + justify-content: center; + } +} + +@include media( '>medium' ) { + + .hero { + text-align: left; + padding-top: 88px; + padding-bottom: 120px; + } + + .hero-inner { + /* Split hero in two half */ + display: flex; + justify-content: space-between; + } + + .hero-copy { + padding-top: 40px; + padding-right: 48px; + min-width: 448px; + max-width: 512px; + z-index: 1; + } + + .hero-title { + margin-bottom: 16px; + } + + .hero-paragraph { + margin-bottom: 32px; + } + + .hero-cta { + display: flex; + align-items: center; + margin: 0; + + .button { + min-width: 170px; + + &:first-child { + margin-right: 32px; + } + } + } + + .header-illustration { + display: block; + } + + .hero-media { + z-index: 0; + + img, + svg { + max-width: none; + } + } + + .header-illustration-image { + display: block; + position: absolute; + top: -168px; + left: -722px; + width: 1440px; + height: 324px; + } +} diff --git a/src/scss/layout/_lights.scss b/src/scss/layout/_lights.scss new file mode 100644 index 0000000000000000000000000000000000000000..bd12f00373d4a20512da2314dbb20962afec860a --- /dev/null +++ b/src/scss/layout/_lights.scss @@ -0,0 +1,185 @@ +.switch[type="checkbox"] { + + + label { + + &::before { + background: mix(color(secondary, 3), color(primary, 1)); + background: linear-gradient(to right, color(secondary, 3) 0, color(primary, 1) 100%); + } + + &::after { + background: color(bg, 1); + } + } + + &:checked { + + + label { + + &::before { + background: mix(color(tertiary, 1), color(tertiary, 3)); + background: linear-gradient(to right, color(tertiary, 1) 0, color(tertiary, 3) 100%); + } + } + } +} + +.asset-light, +.asset-dark { + visibility: hidden; + opacity: 0; +} + +.is-loaded { + + .asset-light, + .asset-dark { + visibility: visible; + opacity: 1; + } +} + +.asset-dark { + display: none; +} + +.lights-off { + + .asset-light { + display: none; + } + + .asset-dark { + display: block; + } + + color: color(typography, 2i); + + a { + color: color(typography, 2i); + } + + h1, h2, h3, h4, h5, h6, + .h1, .h2, .h3, .h4, .h5, .h6 { + color: color(typography, 1i) !important; + } + + &.is-boxed { + background: lighten(desaturate(color(bg, 1i), 8%), 3%); + } + + .body-wrap { + background: color(bg, 1i); + } + + .boxed-container { + @include shadow(dark); + } + + hr { + @include divider(false, dark); + } + + .has-top-divider { + @include divider(before, dark); + } + + .has-bottom-divider { + @include divider(after, dark); + } +} + +// Transitions +body, +a, +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + transition: color .25s ease; +} + +.is-boxed, +.body-wrap, +.has-top-divider, +.has-bottom-divider::after, +hr::after, +.feature-title::after { + transition: background .25s ease; +} + +.boxed-container { + transition: box-shadow .15s ease; +} + +// Animations +@keyframes fadeInLogo { + 0% { + opacity: 0; + transform: scale(0.5); + } +} + +@keyframes fadeInLeftMedia { + 0% { + opacity: 0; + transform: scale(0.8) translate3d(40px, 10px, 0); + } + 30% { + opacity: 1; + } +} + +@keyframes fadeInLeftIllustration { + 0% { + opacity: 0; + transform: scale(0.95) translate3d(40px, 10px, 0); + } +} + +@keyframes fadeUpBox { + 0% { + opacity: 0; + transform: scale(0.95) translate3d(-40px, 20px, 0); + } + 30% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } +} + +.is-loaded { + + .header-logo-image { + animation: fadeInLogo .35s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .hero-media-image { + animation: fadeInLeftMedia 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .hero-media-illustration-image { + animation: fadeInLeftIllustration 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .features-box { + animation: fadeUpBox 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .header-illustration-image { + animation: fadeIn 1s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .features-illustration { + animation: fadeIn 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } +} diff --git a/src/scss/layout/_main.scss b/src/scss/layout/_main.scss new file mode 100644 index 0000000000000000000000000000000000000000..6f0e8e08d39a6c44c09d1851267ccf101e2a9604 --- /dev/null +++ b/src/scss/layout/_main.scss @@ -0,0 +1,36 @@ +.is-boxed { + background: color(bg, 3); +} + +.body-wrap { + background: color(bg, 1); + overflow: hidden; + /* Sticky footer */ + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.boxed-container { + max-width: 1440px; + margin: 0 auto; + @include shadow; +} + +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/src/scss/style.scss b/src/scss/style.scss new file mode 100644 index 0000000000000000000000000000000000000000..e00ac74a1417959ad80f8607761114cd6e751038 --- /dev/null +++ b/src/scss/style.scss @@ -0,0 +1,79 @@ +/*-------------------------------------------------------------- +# 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"; + +/*-------------------------------------------------------------- +# Faqs +--------------------------------------------------------------*/ +@import "layout/faqs"; + +/*-------------------------------------------------------------- +# CTA +--------------------------------------------------------------*/ +@import "layout/cta"; + +/*-------------------------------------------------------------- +# Site content +--------------------------------------------------------------*/ +@import "layout/main"; + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ +@import "layout/footer"; + +/*-------------------------------------------------------------- +# Lights +--------------------------------------------------------------*/ +@import "layout/lights"; diff --git a/switch/.editorconfig b/switch/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..70f5ed30e638a838f22b3b9f2672deb74bdbcd8e --- /dev/null +++ b/switch/.editorconfig @@ -0,0 +1,20 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab +indent_size = 4 +tab_width = 4 + +[*.{json,txt,js}] +indent_style = space +indent_size = 2 + +[*.txt] +end_of_line = crlf diff --git a/switch/.eslintrc b/switch/.eslintrc new file mode 100644 index 0000000000000000000000000000000000000000..e3578aadfd3a97c6ef9d74f46e07314d775c9c61 --- /dev/null +++ b/switch/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "standard" +} diff --git a/switch/.gitignore b/switch/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c016021b65bec1df02d67bf5b9265a4c8bce17aa --- /dev/null +++ b/switch/.gitignore @@ -0,0 +1,170 @@ +# Created by https://www.gitignore.io/api/node,sublimetext,windows,macos,sass + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +### Sass ### +.sass-cache/ +*.css.map +*.sass.map +*.scss.map + +### SublimeText ### +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# End of https://www.gitignore.io/api/node,sublimetext,windows,macos,sass diff --git a/switch/.stylelintrc b/switch/.stylelintrc new file mode 100644 index 0000000000000000000000000000000000000000..3dce7a2d53782861c62583199d8a7c944164f069 --- /dev/null +++ b/switch/.stylelintrc @@ -0,0 +1,8 @@ +"rules": { + "block-no-empty": true, + "color-hex-case": "lower", + "color-hex-length": "short", + "color-no-invalid-hex": true, + "declaration-colon-space-after": "always", + "max-empty-lines": 2 +} diff --git a/switch/CHANGELOG.md b/switch/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..563eae759a9bf15a5500dfb2c65b30151539d3bb --- /dev/null +++ b/switch/CHANGELOG.md @@ -0,0 +1,5 @@ +# CHANGELOG.md + +## 1.0.0 (Dec 18, 2018) + +First release diff --git a/switch/LICENSE b/switch/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..5f37774a07fcf973369983fec00a823528a8538f --- /dev/null +++ b/switch/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/switch/README.md b/switch/README.md new file mode 100644 index 0000000000000000000000000000000000000000..315a649380e1a6c06cd2278e5f013ce6fab9afd7 --- /dev/null +++ b/switch/README.md @@ -0,0 +1,13 @@ +# Switch + +A landing page template. + +* [Getting started](#getting-started) + +## Getting started +* First, ensure that node.js & npm are both installed. If not, choose your OS and installation method from [this page](https://nodejs.org/en/download/package-manager/) and follow the instructions. +* This template requires Node 14 to work. You can handle multiple node versions with [NVM](https://github.com/nvm-sh/nvm) +* Next, use your command line to enter your project directory. +* This template comes with a ready-to-use package file called `package-sample.json`. You just need to rename it to `package.json`, then run `npm install` to install all of the dependencies into your project. + +You're ready to go! Run any task by typing `npm run task` (where "task" is the name of the task in the `"scripts"` object). The most useful task for rapid development is `watch`. It will start a new server, open up a browser and watch for any SCSS or JS changes in the `src` directory; once it compiles those changes, the browser will automatically inject the changed file(s)! diff --git a/switch/dist/css/style.css b/switch/dist/css/style.css new file mode 100644 index 0000000000000000000000000000000000000000..6c414ba2e02c61fc2034aee48d3d0643aceffd6e --- /dev/null +++ b/switch/dist/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:#fff;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}hr{border:0;display:block;height:1px;background:#E9EDF3;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 #E9EDF3}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:#6B7A90;font-size:1rem}body,button,input,select,textarea{font-family:"Heebo", sans-serif}a{color:#535FD7;text-decoration:none}a:hover,a:active{outline:0;text-decoration:underline}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{clear:both;color:#182538;font-family:"IBM Plex Sans", sans-serif;font-weight:600}h1,.h1{font-size:38px;line-height:48px;letter-spacing:-0.1px}@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:-0.1px}@media (min-width: 641px){h2,.h2{font-size:38px;line-height:48px;letter-spacing:-0.1px}}h3,.h3,blockquote{font-size:24px;line-height:34px;letter-spacing:-0.1px}h4,h5,h6,.h4,.h5,.h6{font-size:20px;line-height:30px;letter-spacing:-0.1px}@media (max-width: 640px){.h1-mobile{font-size:38px;line-height:48px;letter-spacing:-0.1px}.h2-mobile{font-size:32px;line-height:42px;letter-spacing:-0.1px}.h3-mobile{font-size:24px;line-height:34px;letter-spacing:-0.1px}.h4-mobile,.h5-mobile,.h6-mobile{font-size:20px;line-height:30px;letter-spacing:-0.1px}}.text-light{color:#8595AE}.text-light a{color:#8595AE}.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:#fff !important}.text-sm{font-size:18px;line-height:27px;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:#6B7A90;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:#6B7A90;border-width:1px 0;border-style:solid;border-color:#E9EDF3;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:#F8F9FB}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:27px;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-family:"IBM Plex Sans", sans-serif;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none;text-transform:uppercase;background-color:#fff;color:#535FD7 !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:#535FD7}.text-secondary{color:#61EFFD}.has-top-divider{position:relative}.has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#E9EDF3}.has-bottom-divider{position:relative}.has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#E9EDF3}.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}.input,.textarea{background-color:#182538;border-width:1px;border-style:solid;border-color:#E9EDF3;border-radius:2px;color:#6B7A90;max-width:100%;width:100%}.input::-moz-placeholder, .textarea::-moz-placeholder{color:#6B7A90}.input::placeholder,.textarea::placeholder{color:#6B7A90}.input::-ms-input-placeholder,.textarea::-ms-input-placeholder{color:#6B7A90}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:#6B7A90}.input:hover,.textarea:hover{border-color:#d9e0ea}.input:active,.input:focus,.textarea:active,.textarea:focus{outline:none;border-color:#E9EDF3}.input[disabled],.textarea[disabled]{cursor:not-allowed;background-color:#F8F9FB;border-color:#F8F9FB}.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}.switch[type="checkbox"]{outline:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;position:absolute;opacity:0}.switch[type="checkbox"]+label{display:inline-flex;position:relative;line-height:36px;padding-left:78px;-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}.switch[type="checkbox"]+label::before,.switch[type="checkbox"]+label::after{content:'';position:absolute;display:block}.switch[type="checkbox"]+label::before{top:0;left:0;width:64px;height:36px;border-radius:18px;background:#E9EDF3}.switch[type="checkbox"]+label::after{top:6px;left:6px;width:24px;height:24px;border-radius:12px;background:#fff;transition:all .15s ease-out}.switch[type="checkbox"]:checked+label::before{background:#535FD7}.switch[type="checkbox"]:checked+label::after{left:34px}@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-family:"IBM Plex Sans", sans-serif;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none !important;text-transform:uppercase;background-color:#E9EDF3;color:#535FD7 !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:#ecf0f5}.button:active{outline:0}.button::before{border-radius:2px}.button-shadow{position:relative}.button-shadow::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 8px 24px rgba(255,255,255,0.25);mix-blend-mode:multiply;transition:box-shadow .15s ease}.button-shadow:hover::before{box-shadow:0 8px 24px rgba(255,255,255,0.35)}.button-sm{padding:8px 24px;height:32px}.button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(255,255,255,0.25)}.button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(255,255,255,0.35)}.button-primary{color:#fff !important;background-color:#535FD7}.button-primary:hover{background:#5763d8}.button-primary.button-shadow::before{box-shadow:0 8px 16px rgba(83,95,215,0.25);mix-blend-mode:normal}.button-primary.button-shadow:hover::before{box-shadow:0 8px 16px rgba(83,95,215,0.35)}.button-primary .button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(83,95,215,0.25)}.button-primary .button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(83,95,215,0.35)}.button-block{display:flex}.site-header{position:relative;padding:24px 0;z-index:2}.site-header::before{content:'';position:absolute;top:-140px;right:-100px;width:1440px;height:324px;background-image:url("../images/header-illustration-light.svg")}.lights-off .site-header::before{background-image:url("../images/header-illustration-dark.svg")}.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:#8595AE;text-transform:uppercase;text-decoration:none;line-height:16px;padding:8px 24px}.header-links a:not(.button):hover,.header-links a:not(.button):active{color:#fff}@media (min-width: 641px){.site-header::before{display:none}}.hero{text-align:center;padding-top:48px;padding-bottom:88px}.hero-copy{position:relative}.hero-paragraph{margin-bottom:32px}.hero-cta{max-width:400px;margin-left:auto;margin-right:auto;margin-bottom:80px}.lights-toggle{color:rgba(107,122,144,0.64)}.header-illustration{display:none}.header-illustration img,.header-illustration svg{max-width:none}.header-illustration-image{display:none}.hero-media{position:relative}.hero-media-illustration{position:absolute;top:-10%;left:-15px}.hero-media-illustration img,.hero-media-illustration svg{max-width:136%}.hero-media-container{position:relative}.hero-media-image{margin:0 auto;box-shadow:48px 16px 48px rgba(24,37,56,0.12);border-radius:4px;transform:perspective(1000px) rotateY(16deg) rotateX(2deg) rotateZ(-7deg) scaleY(0.95) translatex(2%)}.lights-off .hero-media-image{box-shadow:48px 16px 48px rgba(0,0,0,0.2)}@media (max-width: 639px){.hero-cta>*{display:flex}.hero-cta>*+*{margin-top:32px}.lights-toggle{justify-content:center}}@media (min-width: 641px){.hero{text-align:left;padding-top:88px;padding-bottom:120px}.hero-inner{display:flex;justify-content:space-between}.hero-copy{padding-top:40px;padding-right:48px;min-width:448px;max-width:512px;z-index:1}.hero-title{margin-bottom:16px}.hero-paragraph{margin-bottom:32px}.hero-cta{display:flex;align-items:center;margin:0}.hero-cta .button{min-width:170px}.hero-cta .button:first-child{margin-right:32px}.header-illustration{display:block}.hero-media{z-index:0}.hero-media img,.hero-media svg{max-width:none}.header-illustration-image{display:block;position:absolute;top:-168px;left:-722px;width:1440px;height:324px}}.features-wrap{max-width:540px;margin:0 auto}.features-image{position:relative;margin-top:64px;margin-bottom:112px}.features-illustration{position:absolute;top:-2%;left:50%;transform:translateX(-50%);max-width:136%}.features-box{margin:0 auto;box-shadow:48px 16px 48px rgba(24,37,56,0.12);transform:perspective(1000px) rotateY(10deg) translateY(2%)}.lights-off .features-box{box-shadow:48px 16px 48px rgba(0,0,0,0.2)}.feature{text-align:center;margin-bottom:48px}.feature:last-of-type{margin-bottom:0}.feature-icon{display:inline-flex;margin-bottom:16px}.feature-icon img,.feature-icon svg{max-width:none}.feature-title{position:relative;margin-bottom:26px}.feature-title::after{content:'';width:32px;height:2px;position:absolute;bottom:-14px;left:calc(50% - 16px);background:#E9EDF3}.lights-off .feature-title::after{background:#304057}@media (min-width: 641px){.features{position:relative}.features .section-inner{padding-bottom:100px}.features .section-paragraph{padding-left:72px;padding-right:72px}.features::before{content:'';width:100%;height:300px;position:absolute;left:0;top:168px;background:linear-gradient(to bottom, rgba(83,95,215,0), rgba(83,95,215,0.04))}.lights-off .features::before{display:none}.feature{text-align:left}.feature-inner{display:flex}.feature-icon{display:block;margin-top:8px;margin-right:32px;margin-bottom:0}.feature-title::after{left:0}}.cta{position:relative}.cta .section-inner{padding-bottom:64px}.cta .section-paragraph{margin-bottom:32px}.cta::before{content:'';position:absolute;bottom:-32px;left:calc(50% - 720px);height:263px;width:1440px;background-image:url("../images/cta-illustration-light.svg")}.lights-off .cta::before{background-image:url("../images/cta-illustration-dark.svg")}.cta-cta{max-width:400px;margin-left:auto;margin-right:auto}@media (max-width: 639px){.cta-cta .button{display:flex}}@media (min-width: 641px){.cta .section-inner{padding-bottom:128px}.cta .section-paragraph{margin-bottom:40px;padding-left:72px;padding-right:72px}.cta::before{bottom:0}.cta-cta .button{min-width:170px}}.is-boxed{background:#E9EDF3}.body-wrap{background:#fff;overflow:hidden;display:flex;flex-direction:column;min-height:100vh}.boxed-container{max-width:1440px;margin:0 auto;box-shadow:0 16px 48px rgba(255,255,255,0.5)}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:20px;letter-spacing:0px;background:#182538;color:#6B7A90}.site-footer a{color:#6B7A90;text-decoration:none}.site-footer a:hover,.site-footer a:active{text-decoration:underline}.site-footer::before{display:none}.lights-off .site-footer::before{display:block}.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-links li+li,.footer-social-links li+li{margin-left:16px}.footer-social-links li{display:inline-flex}.footer-social-links li a{padding:8px}@media (min-width: 641px){.site-footer-inner{justify-content:space-between;padding-top:72px;padding-bottom:72px}.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}}.switch[type="checkbox"]+label::before{background:#41a5ea;background:linear-gradient(to right, #2FEAFC 0, #535FD7 100%)}.switch[type="checkbox"]+label::after{background:#fff}.switch[type="checkbox"]:checked+label::before{background:#ff9d34;background:linear-gradient(to right, #FFBC48 0, #FE7E1F 100%)}.asset-light,.asset-dark{visibility:hidden;opacity:0}.is-loaded .asset-light,.is-loaded .asset-dark{visibility:visible;opacity:1}.asset-dark{display:none}.lights-off{color:#8595AE}.lights-off .asset-light{display:none}.lights-off .asset-dark{display:block}.lights-off a{color:#8595AE}.lights-off h1,.lights-off h2,.lights-off h3,.lights-off h4,.lights-off h5,.lights-off h6,.lights-off .h1,.lights-off .h2,.lights-off .h3,.lights-off .h4,.lights-off .h5,.lights-off .h6{color:#fff !important}.lights-off.is-boxed{background:#202d3f}.lights-off .body-wrap{background:#182538}.lights-off .boxed-container{box-shadow:0 16px 48px rgba(0,0,0,0.2)}.lights-off hr{display:block;height:1px;background:#304057}.lights-off .has-top-divider{position:relative}.lights-off .has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#304057}.lights-off .has-bottom-divider{position:relative}.lights-off .has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#304057}body,a,h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{transition:color .25s ease}.is-boxed,.body-wrap,.has-top-divider,.has-bottom-divider::after,hr::after,.feature-title::after{transition:background .25s ease}.boxed-container{transition:box-shadow .15s ease}@keyframes fadeInLogo{0%{opacity:0;transform:scale(0.5)}}@keyframes fadeInLeftMedia{0%{opacity:0;transform:scale(0.8) translate3d(40px, 10px, 0)}30%{opacity:1}}@keyframes fadeInLeftIllustration{0%{opacity:0;transform:scale(0.95) translate3d(40px, 10px, 0)}}@keyframes fadeUpBox{0%{opacity:0;transform:scale(0.95) translate3d(-40px, 20px, 0)}30%{opacity:1}}@keyframes fadeIn{0%{opacity:0}}.is-loaded .header-logo-image{animation:fadeInLogo 0.35s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .hero-media-image{animation:fadeInLeftMedia 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .hero-media-illustration-image{animation:fadeInLeftIllustration 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .features-box{animation:fadeUpBox 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .header-illustration-image{animation:fadeIn 1s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform}.is-loaded .features-illustration{animation:fadeIn 1s 0.2s both cubic-bezier(0.3, 0, 0.2, 1);will-change:transform} + +/*# sourceMappingURL=data:application/json;base64,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VSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLDJCQUEyQixVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLFlBQVksQ0FBQyxNQUFNLGNBQWMsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLE1BQU0saUJBQWlCLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sWUFBWSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLG1CQUFtQixDQUFDLE9BQU8saUJBQWlCLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sWUFBWSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLG1CQUFtQixDQUFDLE9BQU8saUJBQWlCLENBQUMsTUFBTSxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLFlBQVksQ0FBQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLGlCQUFpQixDQUFDLGtDQUFrQyxpQkFBaUIsQ0FBQyxpQkFBaUIsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsc0RBQTJDLGFBQWEsQ0FBeEQsMkNBQTJDLGFBQWEsQ0FBQywrREFBK0QsYUFBYSxDQUFDLDZEQUE2RCxhQUFhLENBQUMsNkJBQTZCLG9CQUFvQixDQUFDLDREQUE0RCxZQUFZLENBQUMsb0JBQW9CLENBQUMscUNBQXFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLE9BQU8sb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMscUJBQXFCLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxhQUFhLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsY0FBYyxDQUFDLFVBQVUsQ0FBQyx5Q0FBeUMsaUJBQWlCLENBQUMseUJBQXlCLFNBQVMsQ0FBQyx3QkFBZ0IsQ0FBaEIscUJBQWdCLENBQWhCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQywrQkFBK0IsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsd0JBQWdCLENBQWhCLHFCQUFnQixDQUFoQixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsNkVBQTZFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsdUNBQXVDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxzQ0FBc0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQywrQ0FBK0Msa0JBQWtCLENBQUMsOENBQThDLFNBQVMsQ0FBQywwQkFBMEIsZUFBZSxZQUFZLENBQUMsd0JBQXdCLGFBQWEsQ0FBQyx5Q0FBeUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyx5Q0FBeUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxtQkFBbUIsQ0FBQyx1Q0FBdUMsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLCtCQUErQixDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsa0JBQWtCLENBQUMsZUFBZSxTQUFTLENBQUMsZ0JBQWdCLGlCQUFpQixDQUFDLGVBQWUsaUJBQWlCLENBQUMsdUJBQXVCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsK0JBQStCLENBQUMsNkJBQTZCLDRDQUE0QyxDQUFDLFdBQVcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGlDQUFpQyw0Q0FBNEMsQ0FBQyx1Q0FBdUMsNENBQTRDLENBQUMsZ0JBQWdCLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixrQkFBa0IsQ0FBQyxzQ0FBc0MsMENBQTBDLENBQUMscUJBQXFCLENBQUMsNENBQTRDLDBDQUEwQyxDQUFDLGlEQUFpRCwwQ0FBMEMsQ0FBQyx1REFBdUQsMENBQTBDLENBQUMsY0FBYyxZQUFZLENBQUMsYUFBYSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixVQUFVLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLCtEQUErRCxDQUFDLGlDQUFpQyw4REFBOEQsQ0FBQyxtQkFBbUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLGNBQWMsbUJBQW1CLENBQUMsaUJBQWlCLG1CQUFtQixDQUFDLDZCQUE2QixjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyx1RUFBdUUsVUFBVSxDQUFDLDBCQUEwQixxQkFBcUIsWUFBWSxDQUFDLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLGlCQUFpQixDQUFDLGdCQUFnQixrQkFBa0IsQ0FBQyxVQUFVLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLDRCQUE0QixDQUFDLHFCQUFxQixZQUFZLENBQUMsa0RBQWtELGNBQWMsQ0FBQywyQkFBMkIsWUFBWSxDQUFDLFlBQVksaUJBQWlCLENBQUMseUJBQXlCLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsMERBQTBELGNBQWMsQ0FBQyxzQkFBc0IsaUJBQWlCLENBQUMsa0JBQWtCLGFBQWEsQ0FBQyw2Q0FBNkMsQ0FBQyxpQkFBaUIsQ0FBQyxxR0FBcUcsQ0FBQyw4QkFBOEIseUNBQXlDLENBQUMsMEJBQTBCLFlBQVksWUFBWSxDQUFDLGNBQWMsZUFBZSxDQUFDLGVBQWUsc0JBQXNCLENBQUMsQ0FBQywwQkFBMEIsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsWUFBWSxZQUFZLENBQUMsNkJBQTZCLENBQUMsV0FBVyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLGtCQUFrQixDQUFDLGdCQUFnQixrQkFBa0IsQ0FBQyxVQUFVLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyw4QkFBOEIsaUJBQWlCLENBQUMscUJBQXFCLGFBQWEsQ0FBQyxZQUFZLFNBQVMsQ0FBQyxnQ0FBZ0MsY0FBYyxDQUFDLDJCQUEyQixhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxlQUFlLENBQUMsYUFBYSxDQUFDLGdCQUFnQixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGNBQWMsYUFBYSxDQUFDLDZDQUE2QyxDQUFDLDJEQUEyRCxDQUFDLDBCQUEwQix5Q0FBeUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixlQUFlLENBQUMsY0FBYyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxvQ0FBb0MsY0FBYyxDQUFDLGVBQWUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0Msa0JBQWtCLENBQUMsMEJBQTBCLFVBQVUsaUJBQWlCLENBQUMseUJBQXlCLG9CQUFvQixDQUFDLDZCQUE2QixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyw4RUFBOEUsQ0FBQyw4QkFBOEIsWUFBWSxDQUFDLFNBQVMsZUFBZSxDQUFDLGVBQWUsWUFBWSxDQUFDLGNBQWMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQUMsb0JBQW9CLG1CQUFtQixDQUFDLHdCQUF3QixrQkFBa0IsQ0FBQyxhQUFhLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyw0REFBNEQsQ0FBQyx5QkFBeUIsMkRBQTJELENBQUMsU0FBUyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLGlCQUFpQixZQUFZLENBQUMsQ0FBQywwQkFBMEIsb0JBQW9CLG9CQUFvQixDQUFDLHdCQUF3QixrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLFFBQVEsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLENBQUMsVUFBVSxrQkFBa0IsQ0FBQyxXQUFXLGVBQWUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsNENBQTRDLENBQUMsS0FBSyxhQUFhLENBQUMsZUFBZSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsZUFBZSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGFBQWEsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxlQUFlLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQywyQ0FBMkMseUJBQXlCLENBQUMscUJBQXFCLFlBQVksQ0FBQyxpQ0FBaUMsYUFBYSxDQUFDLG1CQUFtQixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG1FQUFtRSxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixDQUFDLGlEQUFpRCxrQkFBa0IsQ0FBQywrQ0FBK0MsZ0JBQWdCLENBQUMsd0JBQXdCLG1CQUFtQixDQUFDLDBCQUEwQixXQUFXLENBQUMsMEJBQTBCLG1CQUFtQiw2QkFBNkIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxtRUFBbUUsUUFBUSxDQUFDLGdDQUFnQywwQkFBMEIsQ0FBQyxtQ0FBbUMsd0JBQXdCLENBQUMsY0FBYyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsdUNBQXVDLGtCQUFrQixDQUFDLDZEQUE2RCxDQUFDLHNDQUFzQyxlQUFlLENBQUMsK0NBQStDLGtCQUFrQixDQUFDLDZEQUE2RCxDQUFDLHlCQUF5QixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsK0NBQStDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxZQUFZLGFBQWEsQ0FBQyx5QkFBeUIsWUFBWSxDQUFDLHdCQUF3QixhQUFhLENBQUMsY0FBYyxhQUFhLENBQUMsMExBQTBMLHFCQUFxQixDQUFDLHFCQUFxQixrQkFBa0IsQ0FBQyx1QkFBdUIsa0JBQWtCLENBQUMsNkJBQTZCLHNDQUFzQyxDQUFDLGVBQWUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyw2QkFBNkIsaUJBQWlCLENBQUMscUNBQXFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGdDQUFnQyxpQkFBaUIsQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsaURBQWlELDBCQUEwQixDQUFDLGlHQUFpRywrQkFBK0IsQ0FBQyxpQkFBaUIsK0JBQStCLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLCtDQUErQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsa0NBQWtDLEdBQUcsU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDLGlEQUFpRCxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDLENBQUMsOEJBQThCLDREQUE0RCxDQUFDLHFCQUFxQixDQUFDLDZCQUE2QixtRUFBbUUsQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBMEMsMEVBQTBFLENBQUMscUJBQXFCLENBQUMseUJBQXlCLDZEQUE2RCxDQUFDLHFCQUFxQixDQUFDLHNDQUFzQyxxREFBcUQsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsMERBQTBELENBQUMscUJBQXFCIiwiZmlsZSI6InN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImh0bWx7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2t9aDF7Zm9udC1zaXplOjJlbTttYXJnaW46MC42N2VtIDB9ZmlnY2FwdGlvbixmaWd1cmUsbWFpbntkaXNwbGF5OmJsb2NrfWZpZ3VyZXttYXJnaW46MWVtIDQwcHh9aHJ7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MDtvdmVyZmxvdzp2aXNpYmxlfXByZXtmb250LWZhbWlseTptb25vc3BhY2UsIG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YWJiclt0aXRsZV17Ym9yZGVyLWJvdHRvbTpub25lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6aW5oZXJpdH1iLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9Y29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2UsIG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWRmbntmb250LXN0eWxlOml0YWxpY31tYXJre2JhY2tncm91bmQtY29sb3I6I2ZmMDtjb2xvcjojMDAwfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotMC4yNWVtfXN1cHt0b3A6LTAuNWVtfWF1ZGlvLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrfWF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjB9aW1ne2JvcmRlci1zdHlsZTpub25lfXN2Zzpub3QoOnJvb3Qpe292ZXJmbG93OmhpZGRlbn1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjEwMCU7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW46MH1idXR0b24saW5wdXR7b3ZlcmZsb3c6dmlzaWJsZX1idXR0b24sc2VsZWN0e3RleHQtdHJhbnNmb3JtOm5vbmV9YnV0dG9uLGh0bWwgW3R5cGU9XCJidXR0b25cIl0sW3R5cGU9XCJyZXNldFwiXSxbdHlwZT1cInN1Ym1pdFwiXXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cInJlc2V0XCJdOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH1idXR0b246LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJidXR0b25cIl06LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJyZXNldFwiXTotbW96LWZvY3VzcmluZyxbdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOjFweCBkb3R0ZWQgQnV0dG9uVGV4dH1maWVsZHNldHtwYWRkaW5nOjAuMzVlbSAwLjc1ZW0gMC42MjVlbX1sZWdlbmR7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOmluaGVyaXQ7ZGlzcGxheTp0YWJsZTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjA7d2hpdGUtc3BhY2U6bm9ybWFsfXByb2dyZXNze2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXRleHRhcmVhe292ZXJmbG93OmF1dG99W3R5cGU9XCJjaGVja2JveFwiXSxbdHlwZT1cInJhZGlvXCJde2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjB9W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99W3R5cGU9XCJzZWFyY2hcIl17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fVt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtmb250OmluaGVyaXR9ZGV0YWlscyxtZW51e2Rpc3BsYXk6YmxvY2t9c3VtbWFyeXtkaXNwbGF5Omxpc3QtaXRlbX1jYW52YXN7ZGlzcGxheTppbmxpbmUtYmxvY2t9dGVtcGxhdGV7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX1odG1se2JveC1zaXppbmc6Ym9yZGVyLWJveH0qLCo6YmVmb3JlLCo6YWZ0ZXJ7Ym94LXNpemluZzppbmhlcml0fWJvZHl7YmFja2dyb3VuZDojZmZmOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkfWhye2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiNFOUVERjM7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweH11bCxvbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyNHB4O3BhZGRpbmctbGVmdDoyNHB4fXVse2xpc3Qtc3R5bGU6ZGlzY31vbHtsaXN0LXN0eWxlOmRlY2ltYWx9bGk+dWwsbGk+b2x7bWFyZ2luLWJvdHRvbTowfWRse21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjI0cHh9ZHR7Zm9udC13ZWlnaHQ6NjAwfWRke21hcmdpbi1sZWZ0OjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4fWltZ3toZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9ZmlndXJle21hcmdpbjoyNHB4IDB9ZmlnY2FwdGlvbntmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O3BhZGRpbmc6OHB4IDB9aW1nLHN2Z3tkaXNwbGF5OmJsb2NrfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW4tYm90dG9tOjI0cHg7d2lkdGg6MTAwJX10cntib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTlFREYzfXRoe3RleHQtYWxpZ246bGVmdH10aCx0ZHtwYWRkaW5nOjEwcHggMTZweH10aDpmaXJzdC1jaGlsZCx0ZDpmaXJzdC1jaGlsZHtwYWRkaW5nLWxlZnQ6MH10aDpsYXN0LWNoaWxkLHRkOmxhc3QtY2hpbGR7cGFkZGluZy1yaWdodDowfWh0bWx7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzBweH1ib2R5e2NvbG9yOiM2QjdBOTA7Zm9udC1zaXplOjFyZW19Ym9keSxidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OlwiSGVlYm9cIiwgc2Fucy1zZXJpZn1he2NvbG9yOiM1MzVGRDc7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1oMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNntjbGVhcjpib3RoO2NvbG9yOiMxODI1Mzg7Zm9udC1mYW1pbHk6XCJJQk0gUGxleCBTYW5zXCIsIHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NjAwfWgxLC5oMXtmb250LXNpemU6MzhweDtsaW5lLWhlaWdodDo0OHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpe2gxLC5oMXtmb250LXNpemU6NDRweDtsaW5lLWhlaWdodDo1NHB4O2xldHRlci1zcGFjaW5nOjBweH19aDIsLmgye2ZvbnQtc2l6ZTozMnB4O2xpbmUtaGVpZ2h0OjQycHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7aDIsLmgye2ZvbnQtc2l6ZTozOHB4O2xpbmUtaGVpZ2h0OjQ4cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fX1oMywuaDMsYmxvY2txdW90ZXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1oNCxoNSxoNiwuaDQsLmg1LC5oNntmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5oMS1tb2JpbGV7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9LmgyLW1vYmlsZXtmb250LXNpemU6MzJweDtsaW5lLWhlaWdodDo0MnB4O2xldHRlci1zcGFjaW5nOi0wLjFweH0uaDMtbW9iaWxle2ZvbnQtc2l6ZToyNHB4O2xpbmUtaGVpZ2h0OjM0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fS5oNC1tb2JpbGUsLmg1LW1vYmlsZSwuaDYtbW9iaWxle2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fX0udGV4dC1saWdodHtjb2xvcjojODU5NUFFfS50ZXh0LWxpZ2h0IGF7Y29sb3I6Izg1OTVBRX0udGV4dC1saWdodCBoMSwudGV4dC1saWdodCBoMiwudGV4dC1saWdodCBoMywudGV4dC1saWdodCBoNCwudGV4dC1saWdodCBoNSwudGV4dC1saWdodCBoNiwudGV4dC1saWdodCAuaDEsLnRleHQtbGlnaHQgLmgyLC50ZXh0LWxpZ2h0IC5oMywudGV4dC1saWdodCAuaDQsLnRleHQtbGlnaHQgLmg1LC50ZXh0LWxpZ2h0IC5oNntjb2xvcjojZmZmICFpbXBvcnRhbnR9LnRleHQtc217Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjdweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9LnRleHQteHN7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9aDEsaDIsLmgxLC5oMnttYXJnaW4tdG9wOjQ4cHg7bWFyZ2luLWJvdHRvbToxNnB4fWgzLC5oM3ttYXJnaW4tdG9wOjM2cHg7bWFyZ2luLWJvdHRvbToxMnB4fWg0LGg1LGg2LC5oNCwuaDUsLmg2e21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjRweH1we21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjI0cHh9ZGZuLGNpdGUsZW0saXtmb250LXN0eWxlOml0YWxpY31ibG9ja3F1b3Rle2NvbG9yOiM2QjdBOTA7Zm9udC1zdHlsZTppdGFsaWM7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweDttYXJnaW4tbGVmdDoyNHB4fWJsb2NrcXVvdGU6OmJlZm9yZXtjb250ZW50OlwiXFwyMDFDXCJ9YmxvY2txdW90ZTo6YWZ0ZXJ7Y29udGVudDpcIlxcMjAxRFwifWJsb2NrcXVvdGUgcHtkaXNwbGF5OmlubGluZX1hZGRyZXNze2NvbG9yOiM2QjdBOTA7Ym9yZGVyLXdpZHRoOjFweCAwO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6I0U5RURGMztwYWRkaW5nOjI0cHggMDttYXJnaW46MCAwIDI0cHh9cHJlLHByZSBoMSxwcmUgaDIscHJlIGgzLHByZSBoNCxwcmUgaDUscHJlIGg2LHByZSAuaDEscHJlIC5oMixwcmUgLmgzLHByZSAuaDQscHJlIC5oNSxwcmUgLmg2e2ZvbnQtZmFtaWx5OlwiQ291cmllciAxMCBQaXRjaFwiLCBDb3VyaWVyLCBtb25vc3BhY2V9cHJlLGNvZGUsa2JkLHR0LHZhcntiYWNrZ3JvdW5kOiNGOEY5RkJ9cHJle2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bWFyZ2luLWJvdHRvbToxLjZlbTttYXgtd2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvO3BhZGRpbmc6MjRweDttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4fWNvZGUsa2JkLHR0LHZhcntmb250LWZhbWlseTpNb25hY28sIENvbnNvbGFzLCBcIkFuZGFsZSBNb25vXCIsIFwiRGVqYVZ1IFNhbnMgTW9ub1wiLCBtb25vc3BhY2U7Zm9udC1zaXplOjE2cHg7cGFkZGluZzoycHggNHB4fWFiYnIsYWNyb255bXtjdXJzb3I6aGVscH1tYXJrLGluc3t0ZXh0LWRlY29yYXRpb246bm9uZX1zbWFsbHtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O2xldHRlci1zcGFjaW5nOi0wLjFweH1iLHN0cm9uZ3tmb250LXdlaWdodDo2MDB9YnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYSxsYWJlbHtmb250LXNpemU6MjBweDtsaW5lLWhlaWdodDozMHB4fS5jb250YWluZXIsLmNvbnRhaW5lci1zbXt3aWR0aDoxMDAlO21hcmdpbjowIGF1dG87cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDoxNnB4fUBtZWRpYSAobWluLXdpZHRoOiA0ODFweCl7LmNvbnRhaW5lciwuY29udGFpbmVyLXNte3BhZGRpbmctbGVmdDoyNHB4O3BhZGRpbmctcmlnaHQ6MjRweH19LmNvbnRhaW5lcnttYXgtd2lkdGg6MTEyOHB4fS5jb250YWluZXItc217bWF4LXdpZHRoOjg0OHB4fS5jb250YWluZXIgLmNvbnRhaW5lci1zbXttYXgtd2lkdGg6ODAwcHg7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS5zY3JlZW4tcmVhZGVyLXRleHR7Y2xpcDpyZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7cG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDtoZWlnaHQ6MXB4O3dpZHRoOjFweDtvdmVyZmxvdzpoaWRkZW47d29yZC13cmFwOm5vcm1hbCAhaW1wb3J0YW50fS5zY3JlZW4tcmVhZGVyLXRleHQ6Zm9jdXN7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNoYWRvdzowIDAgMnB4IDJweCByZ2JhKDAsMCwwLDAuNik7Y2xpcDphdXRvICFpbXBvcnRhbnQ7ZGlzcGxheTpibG9jaztmb250LWZhbWlseTpcIklCTSBQbGV4IFNhbnNcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtsZXR0ZXItc3BhY2luZzowcHg7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjE2cHg7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojNTM1RkQ3ICFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7aGVpZ2h0OmF1dG87bGVmdDo4cHg7cGFkZGluZzoxNnB4IDMycHg7dG9wOjhweDt3aWR0aDphdXRvO3otaW5kZXg6MTAwMDAwfS5saXN0LXJlc2V0e2xpc3Qtc3R5bGU6bm9uZTtwYWRkaW5nOjB9LnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtcHJpbWFyeXtjb2xvcjojNTM1RkQ3fS50ZXh0LXNlY29uZGFyeXtjb2xvcjojNjFFRkZEfS5oYXMtdG9wLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy10b3AtZGl2aWRlcjo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6I0U5RURGM30uaGFzLWJvdHRvbS1kaXZpZGVye3Bvc2l0aW9uOnJlbGF0aXZlfS5oYXMtYm90dG9tLWRpdmlkZXI6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jaztoZWlnaHQ6MXB4O2JhY2tncm91bmQ6I0U5RURGM30ubS0we21hcmdpbjowfS5tdC0we21hcmdpbi10b3A6MH0ubXItMHttYXJnaW4tcmlnaHQ6MH0ubWItMHttYXJnaW4tYm90dG9tOjB9Lm1sLTB7bWFyZ2luLWxlZnQ6MH0ubS04e21hcmdpbjo4cHh9Lm10LTh7bWFyZ2luLXRvcDo4cHh9Lm1yLTh7bWFyZ2luLXJpZ2h0OjhweH0ubWItOHttYXJnaW4tYm90dG9tOjhweH0ubWwtOHttYXJnaW4tbGVmdDo4cHh9Lm0tMTZ7bWFyZ2luOjE2cHh9Lm10LTE2e21hcmdpbi10b3A6MTZweH0ubXItMTZ7bWFyZ2luLXJpZ2h0OjE2cHh9Lm1iLTE2e21hcmdpbi1ib3R0b206MTZweH0ubWwtMTZ7bWFyZ2luLWxlZnQ6MTZweH0ubS0yNHttYXJnaW46MjRweH0ubXQtMjR7bWFyZ2luLXRvcDoyNHB4fS5tci0yNHttYXJnaW4tcmlnaHQ6MjRweH0ubWItMjR7bWFyZ2luLWJvdHRvbToyNHB4fS5tbC0yNHttYXJnaW4tbGVmdDoyNHB4fS5tLTMye21hcmdpbjozMnB4fS5tdC0zMnttYXJnaW4tdG9wOjMycHh9Lm1yLTMye21hcmdpbi1yaWdodDozMnB4fS5tYi0zMnttYXJnaW4tYm90dG9tOjMycHh9Lm1sLTMye21hcmdpbi1sZWZ0OjMycHh9Lm0tNDB7bWFyZ2luOjQwcHh9Lm10LTQwe21hcmdpbi10b3A6NDBweH0ubXItNDB7bWFyZ2luLXJpZ2h0OjQwcHh9Lm1iLTQwe21hcmdpbi1ib3R0b206NDBweH0ubWwtNDB7bWFyZ2luLWxlZnQ6NDBweH0ubS00OHttYXJnaW46NDhweH0ubXQtNDh7bWFyZ2luLXRvcDo0OHB4fS5tci00OHttYXJnaW4tcmlnaHQ6NDhweH0ubWItNDh7bWFyZ2luLWJvdHRvbTo0OHB4fS5tbC00OHttYXJnaW4tbGVmdDo0OHB4fS5tLTU2e21hcmdpbjo1NnB4fS5tdC01NnttYXJnaW4tdG9wOjU2cHh9Lm1yLTU2e21hcmdpbi1yaWdodDo1NnB4fS5tYi01NnttYXJnaW4tYm90dG9tOjU2cHh9Lm1sLTU2e21hcmdpbi1sZWZ0OjU2cHh9Lm0tNjR7bWFyZ2luOjY0cHh9Lm10LTY0e21hcmdpbi10b3A6NjRweH0ubXItNjR7bWFyZ2luLXJpZ2h0OjY0cHh9Lm1iLTY0e21hcmdpbi1ib3R0b206NjRweH0ubWwtNjR7bWFyZ2luLWxlZnQ6NjRweH0ucC0we3BhZGRpbmc6MH0ucHQtMHtwYWRkaW5nLXRvcDowfS5wci0we3BhZGRpbmctcmlnaHQ6MH0ucGItMHtwYWRkaW5nLWJvdHRvbTowfS5wbC0we3BhZGRpbmctbGVmdDowfS5wLTh7cGFkZGluZzo4cHh9LnB0LTh7cGFkZGluZy10b3A6OHB4fS5wci04e3BhZGRpbmctcmlnaHQ6OHB4fS5wYi04e3BhZGRpbmctYm90dG9tOjhweH0ucGwtOHtwYWRkaW5nLWxlZnQ6OHB4fS5wLTE2e3BhZGRpbmc6MTZweH0ucHQtMTZ7cGFkZGluZy10b3A6MTZweH0ucHItMTZ7cGFkZGluZy1yaWdodDoxNnB4fS5wYi0xNntwYWRkaW5nLWJvdHRvbToxNnB4fS5wbC0xNntwYWRkaW5nLWxlZnQ6MTZweH0ucC0yNHtwYWRkaW5nOjI0cHh9LnB0LTI0e3BhZGRpbmctdG9wOjI0cHh9LnByLTI0e3BhZGRpbmctcmlnaHQ6MjRweH0ucGItMjR7cGFkZGluZy1ib3R0b206MjRweH0ucGwtMjR7cGFkZGluZy1sZWZ0OjI0cHh9LnAtMzJ7cGFkZGluZzozMnB4fS5wdC0zMntwYWRkaW5nLXRvcDozMnB4fS5wci0zMntwYWRkaW5nLXJpZ2h0OjMycHh9LnBiLTMye3BhZGRpbmctYm90dG9tOjMycHh9LnBsLTMye3BhZGRpbmctbGVmdDozMnB4fS5wLTQwe3BhZGRpbmc6NDBweH0ucHQtNDB7cGFkZGluZy10b3A6NDBweH0ucHItNDB7cGFkZGluZy1yaWdodDo0MHB4fS5wYi00MHtwYWRkaW5nLWJvdHRvbTo0MHB4fS5wbC00MHtwYWRkaW5nLWxlZnQ6NDBweH0ucC00OHtwYWRkaW5nOjQ4cHh9LnB0LTQ4e3BhZGRpbmctdG9wOjQ4cHh9LnByLTQ4e3BhZGRpbmctcmlnaHQ6NDhweH0ucGItNDh7cGFkZGluZy1ib3R0b206NDhweH0ucGwtNDh7cGFkZGluZy1sZWZ0OjQ4cHh9LnAtNTZ7cGFkZGluZzo1NnB4fS5wdC01NntwYWRkaW5nLXRvcDo1NnB4fS5wci01NntwYWRkaW5nLXJpZ2h0OjU2cHh9LnBiLTU2e3BhZGRpbmctYm90dG9tOjU2cHh9LnBsLTU2e3BhZGRpbmctbGVmdDo1NnB4fS5wLTY0e3BhZGRpbmc6NjRweH0ucHQtNjR7cGFkZGluZy10b3A6NjRweH0ucHItNjR7cGFkZGluZy1yaWdodDo2NHB4fS5wYi02NHtwYWRkaW5nLWJvdHRvbTo2NHB4fS5wbC02NHtwYWRkaW5nLWxlZnQ6NjRweH0uc3IgLmhhcy1hbmltYXRpb25zIC5pcy1yZXZlYWxpbmd7dmlzaWJpbGl0eTpoaWRkZW59LmlucHV0LC50ZXh0YXJlYXtiYWNrZ3JvdW5kLWNvbG9yOiMxODI1Mzg7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiNFOUVERjM7Ym9yZGVyLXJhZGl1czoycHg7Y29sb3I6IzZCN0E5MDttYXgtd2lkdGg6MTAwJTt3aWR0aDoxMDAlfS5pbnB1dDo6cGxhY2Vob2xkZXIsLnRleHRhcmVhOjpwbGFjZWhvbGRlcntjb2xvcjojNkI3QTkwfS5pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC50ZXh0YXJlYTo6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2QjdBOTB9LmlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwudGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiM2QjdBOTB9LmlucHV0OmhvdmVyLC50ZXh0YXJlYTpob3Zlcntib3JkZXItY29sb3I6I2Q5ZTBlYX0uaW5wdXQ6YWN0aXZlLC5pbnB1dDpmb2N1cywudGV4dGFyZWE6YWN0aXZlLC50ZXh0YXJlYTpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOiNFOUVERjN9LmlucHV0W2Rpc2FibGVkXSwudGV4dGFyZWFbZGlzYWJsZWRde2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOiNGOEY5RkI7Ym9yZGVyLWNvbG9yOiNGOEY5RkJ9LmlucHV0ey1tb3otYXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2ZvbnQtc2l6ZToxNnB4O2xldHRlci1zcGFjaW5nOi0wLjFweDtsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MTNweCAxNnB4O2hlaWdodDo0OHB4O2JveC1zaGFkb3c6bm9uZX0uaW5wdXQgLmlubGluZS1pbnB1dHtkaXNwbGF5OmlubGluZTt3aWR0aDphdXRvfS50ZXh0YXJlYXtkaXNwbGF5OmJsb2NrO21pbi13aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbH0udGV4dGFyZWEgLmlubGluZS10ZXh0YXJlYXtkaXNwbGF5OmlubGluZTt3aWR0aDphdXRvfS5maWVsZC1ncm91cGVkPi5jb250cm9sOm5vdCg6bGFzdC1jaGlsZCl7bWFyZ2luLWJvdHRvbTo4cHh9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl17b3V0bGluZTowO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowfS5zd2l0Y2hbdHlwZT1cImNoZWNrYm94XCJdK2xhYmVse2Rpc3BsYXk6aW5saW5lLWZsZXg7cG9zaXRpb246cmVsYXRpdmU7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nLWxlZnQ6NzhweDt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyfS5zd2l0Y2hbdHlwZT1cImNoZWNrYm94XCJdK2xhYmVsOjpiZWZvcmUsLnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl0rbGFiZWw6OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9ja30uc3dpdGNoW3R5cGU9XCJjaGVja2JveFwiXStsYWJlbDo6YmVmb3Jle3RvcDowO2xlZnQ6MDt3aWR0aDo2NHB4O2hlaWdodDozNnB4O2JvcmRlci1yYWRpdXM6MThweDtiYWNrZ3JvdW5kOiNFOUVERjN9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl0rbGFiZWw6OmFmdGVye3RvcDo2cHg7bGVmdDo2cHg7d2lkdGg6MjRweDtoZWlnaHQ6MjRweDtib3JkZXItcmFkaXVzOjEycHg7YmFja2dyb3VuZDojZmZmO3RyYW5zaXRpb246YWxsIC4xNXMgZWFzZS1vdXR9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtsYWJlbDo6YmVmb3Jle2JhY2tncm91bmQ6IzUzNUZEN30uc3dpdGNoW3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkK2xhYmVsOjphZnRlcntsZWZ0OjM0cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuZmllbGQtZ3JvdXBlZHtkaXNwbGF5OmZsZXh9LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2x7ZmxleC1zaHJpbms6MH0uZmllbGQtZ3JvdXBlZD4uY29udHJvbC5jb250cm9sLWV4cGFuZGVke2ZsZXgtZ3JvdzoxO2ZsZXgtc2hyaW5rOjF9LmZpZWxkLWdyb3VwZWQ+LmNvbnRyb2w6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXJpZ2h0OjhweH19LmJ1dHRvbntkaXNwbGF5OmlubGluZS1mbGV4O2ZvbnQtZmFtaWx5OlwiSUJNIFBsZXggU2Fuc1wiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2xldHRlci1zcGFjaW5nOjBweDtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtiYWNrZ3JvdW5kLWNvbG9yOiNFOUVERjM7Y29sb3I6IzUzNUZENyAhaW1wb3J0YW50O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzoxNnB4IDMycHg7aGVpZ2h0OjQ4cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5idXR0b246aG92ZXJ7YmFja2dyb3VuZDojZWNmMGY1fS5idXR0b246YWN0aXZle291dGxpbmU6MH0uYnV0dG9uOjpiZWZvcmV7Ym9yZGVyLXJhZGl1czoycHh9LmJ1dHRvbi1zaGFkb3d7cG9zaXRpb246cmVsYXRpdmV9LmJ1dHRvbi1zaGFkb3c6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2JveC1zaGFkb3c6MCA4cHggMjRweCByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpO21peC1ibGVuZC1tb2RlOm11bHRpcGx5O3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMTVzIGVhc2V9LmJ1dHRvbi1zaGFkb3c6aG92ZXI6OmJlZm9yZXtib3gtc2hhZG93OjAgOHB4IDI0cHggcmdiYSgyNTUsMjU1LDI1NSwwLjM1KX0uYnV0dG9uLXNte3BhZGRpbmc6OHB4IDI0cHg7aGVpZ2h0OjMycHh9LmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoMjU1LDI1NSwyNTUsMC4yNSl9LmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OmhvdmVyOjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoMjU1LDI1NSwyNTUsMC4zNSl9LmJ1dHRvbi1wcmltYXJ5e2NvbG9yOiNmZmYgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOiM1MzVGRDd9LmJ1dHRvbi1wcmltYXJ5OmhvdmVye2JhY2tncm91bmQ6IzU3NjNkOH0uYnV0dG9uLXByaW1hcnkuYnV0dG9uLXNoYWRvdzo6YmVmb3Jle2JveC1zaGFkb3c6MCA4cHggMTZweCByZ2JhKDgzLDk1LDIxNSwwLjI1KTttaXgtYmxlbmQtbW9kZTpub3JtYWx9LmJ1dHRvbi1wcmltYXJ5LmJ1dHRvbi1zaGFkb3c6aG92ZXI6OmJlZm9yZXtib3gtc2hhZG93OjAgOHB4IDE2cHggcmdiYSg4Myw5NSwyMTUsMC4zNSl9LmJ1dHRvbi1wcmltYXJ5IC5idXR0b24tc20uYnV0dG9uLXNoYWRvdzo6YmVmb3Jle2JveC1zaGFkb3c6MCA0cHggMTZweCByZ2JhKDgzLDk1LDIxNSwwLjI1KX0uYnV0dG9uLXByaW1hcnkgLmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OmhvdmVyOjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoODMsOTUsMjE1LDAuMzUpfS5idXR0b24tYmxvY2t7ZGlzcGxheTpmbGV4fS5zaXRlLWhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjI0cHggMDt6LWluZGV4OjJ9LnNpdGUtaGVhZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTE0MHB4O3JpZ2h0Oi0xMDBweDt3aWR0aDoxNDQwcHg7aGVpZ2h0OjMyNHB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2hlYWRlci1pbGx1c3RyYXRpb24tbGlnaHQuc3ZnXCIpfS5saWdodHMtb2ZmIC5zaXRlLWhlYWRlcjo6YmVmb3Jle2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2hlYWRlci1pbGx1c3RyYXRpb24tZGFyay5zdmdcIil9LnNpdGUtaGVhZGVyLWlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXJ9LmhlYWRlci1saW5rc3tkaXNwbGF5OmlubGluZS1mbGV4fS5oZWFkZXItbGlua3MgbGl7ZGlzcGxheTppbmxpbmUtZmxleH0uaGVhZGVyLWxpbmtzIGE6bm90KC5idXR0b24pe2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojODU5NUFFO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LWRlY29yYXRpb246bm9uZTtsaW5lLWhlaWdodDoxNnB4O3BhZGRpbmc6OHB4IDI0cHh9LmhlYWRlci1saW5rcyBhOm5vdCguYnV0dG9uKTpob3ZlciwuaGVhZGVyLWxpbmtzIGE6bm90KC5idXR0b24pOmFjdGl2ZXtjb2xvcjojZmZmfUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpdGUtaGVhZGVyOjpiZWZvcmV7ZGlzcGxheTpub25lfX0uaGVyb3t0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9Lmhlcm8tY29weXtwb3NpdGlvbjpyZWxhdGl2ZX0uaGVyby1wYXJhZ3JhcGh7bWFyZ2luLWJvdHRvbTozMnB4fS5oZXJvLWN0YXttYXgtd2lkdGg6NDAwcHg7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tYm90dG9tOjgwcHh9LmxpZ2h0cy10b2dnbGV7Y29sb3I6cmdiYSgxMDcsMTIyLDE0NCwwLjY0KX0uaGVhZGVyLWlsbHVzdHJhdGlvbntkaXNwbGF5Om5vbmV9LmhlYWRlci1pbGx1c3RyYXRpb24gaW1nLC5oZWFkZXItaWxsdXN0cmF0aW9uIHN2Z3ttYXgtd2lkdGg6bm9uZX0uaGVhZGVyLWlsbHVzdHJhdGlvbi1pbWFnZXtkaXNwbGF5Om5vbmV9Lmhlcm8tbWVkaWF7cG9zaXRpb246cmVsYXRpdmV9Lmhlcm8tbWVkaWEtaWxsdXN0cmF0aW9ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMTAlO2xlZnQ6LTE1cHh9Lmhlcm8tbWVkaWEtaWxsdXN0cmF0aW9uIGltZywuaGVyby1tZWRpYS1pbGx1c3RyYXRpb24gc3Zne21heC13aWR0aDoxMzYlfS5oZXJvLW1lZGlhLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZX0uaGVyby1tZWRpYS1pbWFnZXttYXJnaW46MCBhdXRvO2JveC1zaGFkb3c6NDhweCAxNnB4IDQ4cHggcmdiYSgyNCwzNyw1NiwwLjEyKTtib3JkZXItcmFkaXVzOjRweDt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDE2ZGVnKSByb3RhdGVYKDJkZWcpIHJvdGF0ZVooLTdkZWcpIHNjYWxlWSgwLjk1KSB0cmFuc2xhdGV4KDIlKX0ubGlnaHRzLW9mZiAuaGVyby1tZWRpYS1pbWFnZXtib3gtc2hhZG93OjQ4cHggMTZweCA0OHB4IHJnYmEoMCwwLDAsMC4yKX1AbWVkaWEgKG1heC13aWR0aDogNjM5cHgpey5oZXJvLWN0YT4qe2Rpc3BsYXk6ZmxleH0uaGVyby1jdGE+Kisqe21hcmdpbi10b3A6MzJweH0ubGlnaHRzLXRvZ2dsZXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfX1AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5oZXJve3RleHQtYWxpZ246bGVmdDtwYWRkaW5nLXRvcDo4OHB4O3BhZGRpbmctYm90dG9tOjEyMHB4fS5oZXJvLWlubmVye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uaGVyby1jb3B5e3BhZGRpbmctdG9wOjQwcHg7cGFkZGluZy1yaWdodDo0OHB4O21pbi13aWR0aDo0NDhweDttYXgtd2lkdGg6NTEycHg7ei1pbmRleDoxfS5oZXJvLXRpdGxle21hcmdpbi1ib3R0b206MTZweH0uaGVyby1wYXJhZ3JhcGh7bWFyZ2luLWJvdHRvbTozMnB4fS5oZXJvLWN0YXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbjowfS5oZXJvLWN0YSAuYnV0dG9ue21pbi13aWR0aDoxNzBweH0uaGVyby1jdGEgLmJ1dHRvbjpmaXJzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MzJweH0uaGVhZGVyLWlsbHVzdHJhdGlvbntkaXNwbGF5OmJsb2NrfS5oZXJvLW1lZGlhe3otaW5kZXg6MH0uaGVyby1tZWRpYSBpbWcsLmhlcm8tbWVkaWEgc3Zne21heC13aWR0aDpub25lfS5oZWFkZXItaWxsdXN0cmF0aW9uLWltYWdle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0xNjhweDtsZWZ0Oi03MjJweDt3aWR0aDoxNDQwcHg7aGVpZ2h0OjMyNHB4fX0uZmVhdHVyZXMtd3JhcHttYXgtd2lkdGg6NTQwcHg7bWFyZ2luOjAgYXV0b30uZmVhdHVyZXMtaW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXRvcDo2NHB4O21hcmdpbi1ib3R0b206MTEycHh9LmZlYXR1cmVzLWlsbHVzdHJhdGlvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTIlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO21heC13aWR0aDoxMzYlfS5mZWF0dXJlcy1ib3h7bWFyZ2luOjAgYXV0bztib3gtc2hhZG93OjQ4cHggMTZweCA0OHB4IHJnYmEoMjQsMzcsNTYsMC4xMik7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgxMGRlZykgdHJhbnNsYXRlWSgyJSl9LmxpZ2h0cy1vZmYgLmZlYXR1cmVzLWJveHtib3gtc2hhZG93OjQ4cHggMTZweCA0OHB4IHJnYmEoMCwwLDAsMC4yKX0uZmVhdHVyZXt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjQ4cHh9LmZlYXR1cmU6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206MH0uZmVhdHVyZS1pY29ue2Rpc3BsYXk6aW5saW5lLWZsZXg7bWFyZ2luLWJvdHRvbToxNnB4fS5mZWF0dXJlLWljb24gaW1nLC5mZWF0dXJlLWljb24gc3Zne21heC13aWR0aDpub25lfS5mZWF0dXJlLXRpdGxle3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1ib3R0b206MjZweH0uZmVhdHVyZS10aXRsZTo6YWZ0ZXJ7Y29udGVudDonJzt3aWR0aDozMnB4O2hlaWdodDoycHg7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOi0xNHB4O2xlZnQ6Y2FsYyg1MCUgLSAxNnB4KTtiYWNrZ3JvdW5kOiNFOUVERjN9LmxpZ2h0cy1vZmYgLmZlYXR1cmUtdGl0bGU6OmFmdGVye2JhY2tncm91bmQ6IzMwNDA1N31AbWVkaWEgKG1pbi13aWR0aDogNjQxcHgpey5mZWF0dXJlc3twb3NpdGlvbjpyZWxhdGl2ZX0uZmVhdHVyZXMgLnNlY3Rpb24taW5uZXJ7cGFkZGluZy1ib3R0b206MTAwcHh9LmZlYXR1cmVzIC5zZWN0aW9uLXBhcmFncmFwaHtwYWRkaW5nLWxlZnQ6NzJweDtwYWRkaW5nLXJpZ2h0OjcycHh9LmZlYXR1cmVzOjpiZWZvcmV7Y29udGVudDonJzt3aWR0aDoxMDAlO2hlaWdodDozMDBweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjE2OHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSg4Myw5NSwyMTUsMCksIHJnYmEoODMsOTUsMjE1LDAuMDQpKX0ubGlnaHRzLW9mZiAuZmVhdHVyZXM6OmJlZm9yZXtkaXNwbGF5Om5vbmV9LmZlYXR1cmV7dGV4dC1hbGlnbjpsZWZ0fS5mZWF0dXJlLWlubmVye2Rpc3BsYXk6ZmxleH0uZmVhdHVyZS1pY29ue2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLXJpZ2h0OjMycHg7bWFyZ2luLWJvdHRvbTowfS5mZWF0dXJlLXRpdGxlOjphZnRlcntsZWZ0OjB9fS5jdGF7cG9zaXRpb246cmVsYXRpdmV9LmN0YSAuc2VjdGlvbi1pbm5lcntwYWRkaW5nLWJvdHRvbTo2NHB4fS5jdGEgLnNlY3Rpb24tcGFyYWdyYXBoe21hcmdpbi1ib3R0b206MzJweH0uY3RhOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206LTMycHg7bGVmdDpjYWxjKDUwJSAtIDcyMHB4KTtoZWlnaHQ6MjYzcHg7d2lkdGg6MTQ0MHB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKFwiLi4vaW1hZ2VzL2N0YS1pbGx1c3RyYXRpb24tbGlnaHQuc3ZnXCIpfS5saWdodHMtb2ZmIC5jdGE6OmJlZm9yZXtiYWNrZ3JvdW5kLWltYWdlOnVybChcIi4uL2ltYWdlcy9jdGEtaWxsdXN0cmF0aW9uLWRhcmsuc3ZnXCIpfS5jdGEtY3Rhe21heC13aWR0aDo0MDBweDttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfUBtZWRpYSAobWF4LXdpZHRoOiA2MzlweCl7LmN0YS1jdGEgLmJ1dHRvbntkaXNwbGF5OmZsZXh9fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LmN0YSAuc2VjdGlvbi1pbm5lcntwYWRkaW5nLWJvdHRvbToxMjhweH0uY3RhIC5zZWN0aW9uLXBhcmFncmFwaHttYXJnaW4tYm90dG9tOjQwcHg7cGFkZGluZy1sZWZ0OjcycHg7cGFkZGluZy1yaWdodDo3MnB4fS5jdGE6OmJlZm9yZXtib3R0b206MH0uY3RhLWN0YSAuYnV0dG9ue21pbi13aWR0aDoxNzBweH19LmlzLWJveGVke2JhY2tncm91bmQ6I0U5RURGM30uYm9keS13cmFwe2JhY2tncm91bmQ6I2ZmZjtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4taGVpZ2h0OjEwMHZofS5ib3hlZC1jb250YWluZXJ7bWF4LXdpZHRoOjE0NDBweDttYXJnaW46MCBhdXRvO2JveC1zaGFkb3c6MCAxNnB4IDQ4cHggcmdiYSgyNTUsMjU1LDI1NSwwLjUpfW1haW57ZmxleDoxIDAgYXV0b30uc2VjdGlvbi1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjQ4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc2VjdGlvbi1pbm5lcntwYWRkaW5nLXRvcDo4OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9fS5zaXRlLWZvb3Rlcntmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMHB4O2xldHRlci1zcGFjaW5nOjBweDtiYWNrZ3JvdW5kOiMxODI1Mzg7Y29sb3I6IzZCN0E5MH0uc2l0ZS1mb290ZXIgYXtjb2xvcjojNkI3QTkwO3RleHQtZGVjb3JhdGlvbjpub25lfS5zaXRlLWZvb3RlciBhOmhvdmVyLC5zaXRlLWZvb3RlciBhOmFjdGl2ZXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5zaXRlLWZvb3Rlcjo6YmVmb3Jle2Rpc3BsYXk6bm9uZX0ubGlnaHRzLW9mZiAuc2l0ZS1mb290ZXI6OmJlZm9yZXtkaXNwbGF5OmJsb2NrfS5zaXRlLWZvb3Rlci1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7cGFkZGluZy10b3A6NDhweDtwYWRkaW5nLWJvdHRvbTo0OHB4fS5mb290ZXItYnJhbmQsLmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rcywuZm9vdGVyLWNvcHlyaWdodHtmbGV4Om5vbmU7d2lkdGg6MTAwJTtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtze21hcmdpbi1ib3R0b206MjRweH0uZm9vdGVyLWxpbmtzIGxpK2xpLC5mb290ZXItc29jaWFsLWxpbmtzIGxpK2xpe21hcmdpbi1sZWZ0OjE2cHh9LmZvb3Rlci1zb2NpYWwtbGlua3MgbGl7ZGlzcGxheTppbmxpbmUtZmxleH0uZm9vdGVyLXNvY2lhbC1saW5rcyBsaSBhe3BhZGRpbmc6OHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7LnNpdGUtZm9vdGVyLWlubmVye2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmctdG9wOjcycHg7cGFkZGluZy1ib3R0b206NzJweH0uZm9vdGVyLWJyYW5kLC5mb290ZXItbGlua3MsLmZvb3Rlci1zb2NpYWwtbGlua3MsLmZvb3Rlci1jb3B5cmlnaHR7ZmxleDo1MCV9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWNvcHlyaWdodHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uZm9vdGVyLWxpbmtze29yZGVyOjE7bWFyZ2luLWJvdHRvbTowfX0uc3dpdGNoW3R5cGU9XCJjaGVja2JveFwiXStsYWJlbDo6YmVmb3Jle2JhY2tncm91bmQ6IzQxYTVlYTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzJGRUFGQyAwLCAjNTM1RkQ3IDEwMCUpfS5zd2l0Y2hbdHlwZT1cImNoZWNrYm94XCJdK2xhYmVsOjphZnRlcntiYWNrZ3JvdW5kOiNmZmZ9LnN3aXRjaFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtsYWJlbDo6YmVmb3Jle2JhY2tncm91bmQ6I2ZmOWQzNDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI0ZGQkM0OCAwLCAjRkU3RTFGIDEwMCUpfS5hc3NldC1saWdodCwuYXNzZXQtZGFya3t2aXNpYmlsaXR5OmhpZGRlbjtvcGFjaXR5OjB9LmlzLWxvYWRlZCAuYXNzZXQtbGlnaHQsLmlzLWxvYWRlZCAuYXNzZXQtZGFya3t2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxfS5hc3NldC1kYXJre2Rpc3BsYXk6bm9uZX0ubGlnaHRzLW9mZntjb2xvcjojODU5NUFFfS5saWdodHMtb2ZmIC5hc3NldC1saWdodHtkaXNwbGF5Om5vbmV9LmxpZ2h0cy1vZmYgLmFzc2V0LWRhcmt7ZGlzcGxheTpibG9ja30ubGlnaHRzLW9mZiBhe2NvbG9yOiM4NTk1QUV9LmxpZ2h0cy1vZmYgaDEsLmxpZ2h0cy1vZmYgaDIsLmxpZ2h0cy1vZmYgaDMsLmxpZ2h0cy1vZmYgaDQsLmxpZ2h0cy1vZmYgaDUsLmxpZ2h0cy1vZmYgaDYsLmxpZ2h0cy1vZmYgLmgxLC5saWdodHMtb2ZmIC5oMiwubGlnaHRzLW9mZiAuaDMsLmxpZ2h0cy1vZmYgLmg0LC5saWdodHMtb2ZmIC5oNSwubGlnaHRzLW9mZiAuaDZ7Y29sb3I6I2ZmZiAhaW1wb3J0YW50fS5saWdodHMtb2ZmLmlzLWJveGVke2JhY2tncm91bmQ6IzIwMmQzZn0ubGlnaHRzLW9mZiAuYm9keS13cmFwe2JhY2tncm91bmQ6IzE4MjUzOH0ubGlnaHRzLW9mZiAuYm94ZWQtY29udGFpbmVye2JveC1zaGFkb3c6MCAxNnB4IDQ4cHggcmdiYSgwLDAsMCwwLjIpfS5saWdodHMtb2ZmIGhye2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMzMDQwNTd9LmxpZ2h0cy1vZmYgLmhhcy10b3AtZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubGlnaHRzLW9mZiAuaGFzLXRvcC1kaXZpZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMzA0MDU3fS5saWdodHMtb2ZmIC5oYXMtYm90dG9tLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9LmxpZ2h0cy1vZmYgLmhhcy1ib3R0b20tZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojMzA0MDU3fWJvZHksYSxoMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNnt0cmFuc2l0aW9uOmNvbG9yIC4yNXMgZWFzZX0uaXMtYm94ZWQsLmJvZHktd3JhcCwuaGFzLXRvcC1kaXZpZGVyLC5oYXMtYm90dG9tLWRpdmlkZXI6OmFmdGVyLGhyOjphZnRlciwuZmVhdHVyZS10aXRsZTo6YWZ0ZXJ7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4yNXMgZWFzZX0uYm94ZWQtY29udGFpbmVye3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMTVzIGVhc2V9QGtleWZyYW1lcyBmYWRlSW5Mb2dvezAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoMC41KX19QGtleWZyYW1lcyBmYWRlSW5MZWZ0TWVkaWF7MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgwLjgpIHRyYW5zbGF0ZTNkKDQwcHgsIDEwcHgsIDApfTMwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZmFkZUluTGVmdElsbHVzdHJhdGlvbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKDAuOTUpIHRyYW5zbGF0ZTNkKDQwcHgsIDEwcHgsIDApfX1Aa2V5ZnJhbWVzIGZhZGVVcEJveHswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKDAuOTUpIHRyYW5zbGF0ZTNkKC00MHB4LCAyMHB4LCAwKX0zMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9fS5pcy1sb2FkZWQgLmhlYWRlci1sb2dvLWltYWdle2FuaW1hdGlvbjpmYWRlSW5Mb2dvIDAuMzVzIGJvdGggY3ViaWMtYmV6aWVyKDAuMywgMCwgMC4yLCAxKTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm19LmlzLWxvYWRlZCAuaGVyby1tZWRpYS1pbWFnZXthbmltYXRpb246ZmFkZUluTGVmdE1lZGlhIDFzIDAuMnMgYm90aCBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjIsIDEpO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0uaXMtbG9hZGVkIC5oZXJvLW1lZGlhLWlsbHVzdHJhdGlvbi1pbWFnZXthbmltYXRpb246ZmFkZUluTGVmdElsbHVzdHJhdGlvbiAxcyAwLjJzIGJvdGggY3ViaWMtYmV6aWVyKDAuMywgMCwgMC4yLCAxKTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm19LmlzLWxvYWRlZCAuZmVhdHVyZXMtYm94e2FuaW1hdGlvbjpmYWRlVXBCb3ggMXMgMC4ycyBib3RoIGN1YmljLWJlemllcigwLjMsIDAsIDAuMiwgMSk7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5pcy1sb2FkZWQgLmhlYWRlci1pbGx1c3RyYXRpb24taW1hZ2V7YW5pbWF0aW9uOmZhZGVJbiAxcyBib3RoIGN1YmljLWJlemllcigwLjMsIDAsIDAuMiwgMSk7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5pcy1sb2FkZWQgLmZlYXR1cmVzLWlsbHVzdHJhdGlvbnthbmltYXRpb246ZmFkZUluIDFzIDAuMnMgYm90aCBjdWJpYy1iZXppZXIoMC4zLCAwLCAwLjIsIDEpO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX1cbiJdfQ== */ \ No newline at end of file diff --git a/switch/dist/images/cta-illustration-dark.svg b/switch/dist/images/cta-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..73cc7d0774466e6d668ce0397e0bc7997e03b32a --- /dev/null +++ b/switch/dist/images/cta-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/cta-illustration-light.svg b/switch/dist/images/cta-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..36f8a306151b90c3e3f121d4f5b17889df06f757 --- /dev/null +++ b/switch/dist/images/cta-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/feature-01-dark.svg b/switch/dist/images/feature-01-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..d897b8f30ccac147d322418cb63920bf4cba12e2 --- /dev/null +++ b/switch/dist/images/feature-01-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/feature-01-light.svg b/switch/dist/images/feature-01-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..0af47b979bfc9f8c1d9ee6ec8be5762e8e1f2b7b --- /dev/null +++ b/switch/dist/images/feature-01-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/feature-02-dark.svg b/switch/dist/images/feature-02-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..239e3a907e8507a0a933dc451891dbd3de742da2 --- /dev/null +++ b/switch/dist/images/feature-02-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/feature-02-light.svg b/switch/dist/images/feature-02-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..805fc5836893aae52a092bcbb0692b1f5d900baf --- /dev/null +++ b/switch/dist/images/feature-02-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/feature-03-dark.svg b/switch/dist/images/feature-03-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..5ff71fc5a9dfb909c9158b3128e70c8545b14225 --- /dev/null +++ b/switch/dist/images/feature-03-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/feature-03-light.svg b/switch/dist/images/feature-03-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..84ce002d07fd2e3b2d0477205514d1145ed25504 --- /dev/null +++ b/switch/dist/images/feature-03-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/features-box-dark.svg b/switch/dist/images/features-box-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..822e948b3fee46d7fb02a297348d30a7f7c388d6 --- /dev/null +++ b/switch/dist/images/features-box-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/features-box-light.svg b/switch/dist/images/features-box-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ed6dfdca1c2a571ed9d609ea4252fb35be33694 --- /dev/null +++ b/switch/dist/images/features-box-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/features-illustration-dark.svg b/switch/dist/images/features-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..3236f35b8d818dd896a3bfa84f889c3369bdf346 --- /dev/null +++ b/switch/dist/images/features-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/features-illustration-light.svg b/switch/dist/images/features-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..df7c2066170015ea1d3ca3a489e6afd51ace6be0 --- /dev/null +++ b/switch/dist/images/features-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/features-illustration-top-dark.svg b/switch/dist/images/features-illustration-top-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..b6df51b7065b7a6cfb046801af28d4278e40d5a1 --- /dev/null +++ b/switch/dist/images/features-illustration-top-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/features-illustration-top-light.svg b/switch/dist/images/features-illustration-top-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..cf8d2eb198d436f87fdce25fd58ad879026985c6 --- /dev/null +++ b/switch/dist/images/features-illustration-top-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/header-illustration-dark.svg b/switch/dist/images/header-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..62626120c88d80e47d0492b1a717dfc557066e38 --- /dev/null +++ b/switch/dist/images/header-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/header-illustration-light.svg b/switch/dist/images/header-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..e0b1bb1f814c24c2ee1181321369564e38abbcf2 --- /dev/null +++ b/switch/dist/images/header-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/hero-media-dark.svg b/switch/dist/images/hero-media-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..7f90c9264b6b919625415e2931af1502d4d1a424 --- /dev/null +++ b/switch/dist/images/hero-media-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/hero-media-illustration-dark.svg b/switch/dist/images/hero-media-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..40f2f9d6f149fb782cb6bc194698b0d569425f96 --- /dev/null +++ b/switch/dist/images/hero-media-illustration-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/hero-media-illustration-light.svg b/switch/dist/images/hero-media-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..64fb6685ef8eb20fead1b043a80e7e6e34fe8f14 --- /dev/null +++ b/switch/dist/images/hero-media-illustration-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/hero-media-light.svg b/switch/dist/images/hero-media-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..68247963be4b25c902759209824f745d2cf8785a --- /dev/null +++ b/switch/dist/images/hero-media-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/logo-dark.svg b/switch/dist/images/logo-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..83109e4aef5c98be8316d32d9cc6c1bd6db2c5b7 --- /dev/null +++ b/switch/dist/images/logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/images/logo-light.svg b/switch/dist/images/logo-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..46c932cc79caabd8c4a1b9145f6839fba8664233 --- /dev/null +++ b/switch/dist/images/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/switch/dist/js/main.min.js b/switch/dist/js/main.min.js new file mode 100644 index 0000000000000000000000000000000000000000..217e22c8680700550d7dd6bddebb8619f05d8eaf --- /dev/null +++ b/switch/dist/js/main.min.js @@ -0,0 +1 @@ +!function(){const e=document,t=e.documentElement,n=e.body,i=e.getElementById("lights-toggle"),s=window.sr=ScrollReveal();function a(){let e=i.parentNode.querySelector(".label-text");i.checked?(n.classList.remove("lights-off"),e&&(e.innerHTML="dark")):(n.classList.add("lights-off"),e&&(e.innerHTML="light"))}t.classList.remove("no-js"),t.classList.add("js"),window.addEventListener("load",function(){n.classList.add("is-loaded")}),n.classList.contains("has-animations")&&window.addEventListener("load",function(){s.reveal(".feature",{duration:600,distance:"20px",easing:"cubic-bezier(0.215, 0.61, 0.355, 1)",origin:"right",viewFactor:.2})}),i&&(window.addEventListener("load",a),i.addEventListener("change",a))}(); \ No newline at end of file diff --git a/switch/index.html b/switch/index.html new file mode 100644 index 0000000000000000000000000000000000000000..7e57fc7bcb8f06879a0e13b0f6695d27e82e2b26 --- /dev/null +++ b/switch/index.html @@ -0,0 +1,193 @@ + + + + + + + Switch Template + + + + + +
+ + +
+
+
+
+
+

Landing template for startups

+

Our landing page template works on all devices, so you only have to set it up once, and get beautiful results forever.

+
+ Buy it now +
+ + +
+
+
+
+
+ Header illustration + Header illustration +
+
+ Hero media illustration + Hero media illustration +
+
+ Hero media + Hero media +
+
+
+
+
+ +
+
+
+
+
+

The Product

+

Lorem ipsum is common placeholder text used to demonstrate the graphic elements of a document or visual presentation.

+
+ Feature illustration + Feature box + Feature illustration top + Feature illustration + Feature box + Feature illustration top +
+
+
+
+
+
+
+ Feature 01 + Feature 01 +
+
+

Discover

+

Lorem ipsum dolor sit amet, consecte adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua dui.

+
+
+
+
+
+
+ Feature 02 + Feature 02 +
+
+

Discover

+

Lorem ipsum dolor sit amet, consecte adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua dui.

+
+
+
+
+
+
+ Feature 03 + Feature 03 +
+
+

Discover

+

Lorem ipsum dolor sit amet, consecte adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua dui.

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

Get it and Switch

+

Lorem ipsum is common placeholder text used to demonstrate the graphic elements of a document or visual presentation.

+ +
+
+
+
+
+ + +
+ + + + diff --git a/switch/package-sample.json b/switch/package-sample.json new file mode 100644 index 0000000000000000000000000000000000000000..0a916d07954d0575f654cf757666efd89946b8ed --- /dev/null +++ b/switch/package-sample.json @@ -0,0 +1,54 @@ +{ + "name": "switch", + "version": "1.0.0", + "description": "Switch Template", + "author": "Pasquale Vitiello ", + "license": "GPLv3", + "repository": { + "type": "git", + "url": "https://bitbucket.org/pasqualevitiello/switch.git" + }, + "bugs": { + "url": "https://bitbucket.org/pasqualevitiello/switch/issues" + }, + "scripts": { + "clean": "rimraf dist/{css/*,js/*,images/*}", + "autoprefixer": "postcss -u autoprefixer -r dist/css/*", + "scss": "node-sass --output-style compressed -o dist/css src/scss", + "lint": "eslint src/js || true", + "lint-scss": "stylelint src/scss/*.scss --syntax scss || true", + "uglify": "mkdirp dist/js -p && uglifyjs src/js/*.js -m -c -o dist/js/main.min.js", + "imagemin": "imagemin src/images/* -o dist/images", + "serve": "browser-sync start --server --files \"dist/css/*.css, dist/js/*.js, **/*.html, !node_modules/**/*.html\"", + "build:css": "run-s lint-scss scss autoprefixer", + "build:js": "run-s lint uglify", + "build:images": "run-s imagemin", + "build": "run-s build:*", + "watch:css": "onchange \"src/scss\" -- run-s build:css", + "watch:js": "onchange \"src/js\" -- run-s build:js", + "watch:images": "onchange \"src/images\" -- run-s build:images", + "watch": "run-p serve watch:*", + "postinstall": "run-s build watch" + }, + "devDependencies": { + "autoprefixer": "^9.0.1", + "browser-sync": "^2.12.8", + "eslint": "^5.2.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-node": "^7.0.1", + "eslint-plugin-promise": "^3.8.0", + "eslint-plugin-standard": "^3.1.0", + "imagemin-cli": "^3.0.0", + "mkdirp": "^0.5.1", + "node-sass": "^4.9.2", + "npm-run-all": "^4.1.3", + "onchange": "^4.1.0", + "postcss-cli": "^6.0.0", + "rimraf": "^2.5.4", + "stylelint": "^9.4.0", + "uglify-es": "^3.3.10" + }, + "homepage": "https://bitbucket.org/pasqualevitiello/switch#readme", + "main": ".eslintrc.js" +} diff --git a/switch/src/images/cta-illustration-dark.svg b/switch/src/images/cta-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..60a2d0f96df38dea74501c9e03d216206423da5f --- /dev/null +++ b/switch/src/images/cta-illustration-dark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/cta-illustration-light.svg b/switch/src/images/cta-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..54f81e7fa1c576efd35ac11512cb80af5dfa18e8 --- /dev/null +++ b/switch/src/images/cta-illustration-light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/feature-01-dark.svg b/switch/src/images/feature-01-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..44b22f9a9efc2f485a4336cf96256108905c9b40 --- /dev/null +++ b/switch/src/images/feature-01-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/switch/src/images/feature-01-light.svg b/switch/src/images/feature-01-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..e97684ea0a58fe6574db9a7e4101f8adbb9f006a --- /dev/null +++ b/switch/src/images/feature-01-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/switch/src/images/feature-02-dark.svg b/switch/src/images/feature-02-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..309a3c31b113fe9e0e08acf51b71e38ee9960c23 --- /dev/null +++ b/switch/src/images/feature-02-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/switch/src/images/feature-02-light.svg b/switch/src/images/feature-02-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..84670300b33a7d4f400abaab60d505d697fa8961 --- /dev/null +++ b/switch/src/images/feature-02-light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/switch/src/images/feature-03-dark.svg b/switch/src/images/feature-03-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..de91428657fe3c8567b5b27c546957feca1bb29f --- /dev/null +++ b/switch/src/images/feature-03-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/switch/src/images/feature-03-light.svg b/switch/src/images/feature-03-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..0e29c1207a65ccbdeb08c46c0cfa78d2d21b9031 --- /dev/null +++ b/switch/src/images/feature-03-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/switch/src/images/features-box-dark.svg b/switch/src/images/features-box-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..54bc00f69b454b74aa6d88fc466ce941afa78f25 --- /dev/null +++ b/switch/src/images/features-box-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/switch/src/images/features-box-light.svg b/switch/src/images/features-box-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..8b6087998eef57ef4c10afb18c3c91d9edf35e65 --- /dev/null +++ b/switch/src/images/features-box-light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/switch/src/images/features-illustration-dark.svg b/switch/src/images/features-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..8763e36760d4ee678963d2f9c283e215271e5ee3 --- /dev/null +++ b/switch/src/images/features-illustration-dark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/features-illustration-light.svg b/switch/src/images/features-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..476225f9fe7d563a67c2a1fb0734041777a4f738 --- /dev/null +++ b/switch/src/images/features-illustration-light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/features-illustration-top-dark.svg b/switch/src/images/features-illustration-top-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..3775c1bacb7a3614b669a30801fbeeae59fec856 --- /dev/null +++ b/switch/src/images/features-illustration-top-dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/switch/src/images/features-illustration-top-light.svg b/switch/src/images/features-illustration-top-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..8e2793bcd614186daeef939cc4806628e76ccdf7 --- /dev/null +++ b/switch/src/images/features-illustration-top-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/switch/src/images/header-illustration-dark.svg b/switch/src/images/header-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..23e6a86179fb5f6a4e4cef5ddb67c24a739601eb --- /dev/null +++ b/switch/src/images/header-illustration-dark.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/header-illustration-light.svg b/switch/src/images/header-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..7a7904fe87c712e537bda78a38a2660eb92ecd3a --- /dev/null +++ b/switch/src/images/header-illustration-light.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/hero-media-dark.svg b/switch/src/images/hero-media-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..8d351fc6bde69271d4ff3fa96162c449cfa4fdfe --- /dev/null +++ b/switch/src/images/hero-media-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/switch/src/images/hero-media-illustration-dark.svg b/switch/src/images/hero-media-illustration-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..fef38746e578f732b02fc3b064aa75993becc0a0 --- /dev/null +++ b/switch/src/images/hero-media-illustration-dark.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/hero-media-illustration-light.svg b/switch/src/images/hero-media-illustration-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..44282cd28e6af2f9c94fa601e118841ae43c5c4a --- /dev/null +++ b/switch/src/images/hero-media-illustration-light.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/switch/src/images/hero-media-light.svg b/switch/src/images/hero-media-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..d47d5f45f0e5d3fd3821d0dfe12a0b7b987d9705 --- /dev/null +++ b/switch/src/images/hero-media-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/switch/src/images/logo-dark.svg b/switch/src/images/logo-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..496de15d5cc9857b01936c73d717c03d71e33ce7 --- /dev/null +++ b/switch/src/images/logo-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/switch/src/images/logo-light.svg b/switch/src/images/logo-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..02d2581d291fbf67dd287e05f7425122792fe63d --- /dev/null +++ b/switch/src/images/logo-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/switch/src/js/main.js b/switch/src/js/main.js new file mode 100644 index 0000000000000000000000000000000000000000..01720c17f8de6e991161e4eb0c7fb8f078b246ca --- /dev/null +++ b/switch/src/js/main.js @@ -0,0 +1,51 @@ +(function () { + const doc = document + const rootEl = doc.documentElement + const body = doc.body + const lightSwitch = doc.getElementById('lights-toggle') + /* global ScrollReveal */ + const sr = window.sr = ScrollReveal() + + rootEl.classList.remove('no-js') + rootEl.classList.add('js') + + window.addEventListener('load', function () { + body.classList.add('is-loaded') + }) + + // Reveal animations + function revealAnimations () { + sr.reveal('.feature', { + duration: 600, + distance: '20px', + easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)', + origin: 'right', + viewFactor: 0.2 + }) + } + + if (body.classList.contains('has-animations')) { + window.addEventListener('load', revealAnimations) + } + + // Light switcher + if (lightSwitch) { + window.addEventListener('load', checkLights) + lightSwitch.addEventListener('change', checkLights) + } + + function checkLights () { + let labelText = lightSwitch.parentNode.querySelector('.label-text') + if (lightSwitch.checked) { + body.classList.remove('lights-off') + if (labelText) { + labelText.innerHTML = 'dark' + } + } else { + body.classList.add('lights-off') + if (labelText) { + labelText.innerHTML = 'light' + } + } + } +}()) diff --git a/switch/src/scss/_normalize.scss b/switch/src/scss/_normalize.scss new file mode 100644 index 0000000000000000000000000000000000000000..8025dce8e4874ad25f8e91f2ac504f6e8ceab97e --- /dev/null +++ b/switch/src/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/switch/src/scss/abstracts/_functions.scss b/switch/src/scss/abstracts/_functions.scss new file mode 100644 index 0000000000000000000000000000000000000000..6aa6a1c7581301b0556a85bdfb69d24e88df6999 --- /dev/null +++ b/switch/src/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/switch/src/scss/abstracts/_include-media.scss b/switch/src/scss/abstracts/_include-media.scss new file mode 100644 index 0000000000000000000000000000000000000000..bb5ccd583e723708912ff35c3f3695de777db646 --- /dev/null +++ b/switch/src/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/switch/src/scss/abstracts/_mixins.scss b/switch/src/scss/abstracts/_mixins.scss new file mode 100644 index 0000000000000000000000000000000000000000..e7dddc35ccf0173c698fbe1b2c5f2c72ad1d1c53 --- /dev/null +++ b/switch/src/scss/abstracts/_mixins.scss @@ -0,0 +1,112 @@ +// 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(primary, 1); + text-decoration: none; + + &:hover, + &:active { + outline: 0; + text-decoration: underline; + } + } @else if ($type == 'header') { + color: color(typography, 2i); + text-transform: uppercase; + text-decoration: none; + + &:hover, + &:active { + color: color(typography, 1i); + } + } @else if ($type == 'footer') { + color: color(typography, 2); + text-decoration: none; + + &:hover, + &:active { + text-decoration: underline; + } + } +} + +@mixin shadow($layout: false) { + @if ( $layout == 'dark' ) { + box-shadow: 0 16px 48px rgba(darken(color(bg, 1i), 35%), .2); + } @else { + box-shadow: 0 16px 48px rgba(color(bg, 1), .5); + } +} + +@mixin shadow-sm($layout: false) { + @if ( $layout == 'dark' ) { + box-shadow: 0 16px 24px rgba(darken(color(bg, 1i), 35%), .2); + } @else { + box-shadow: 0 16px 24px rgba(color(bg, 1), .5); + } +} + +@mixin divider-mix($layout: false) { + display: block; + height: 1px; + @if ( $layout == 'dark' ) { + background: color(bg, 3i); + } @else { + background: color(bg, 3); + } +} + +@mixin divider($type: false, $layout: false) { + @if ( $type == 'before' ) { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + @include divider-mix($layout); + } + } @else if ($type == 'after') { + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + @include divider-mix($layout); + } + } @else { + @include divider-mix($layout); + } +} diff --git a/switch/src/scss/abstracts/_variables.scss b/switch/src/scss/abstracts/_variables.scss new file mode 100644 index 0000000000000000000000000000000000000000..8f7bab179f40ea18c49309d70025f656885b6b92 --- /dev/null +++ b/switch/src/scss/abstracts/_variables.scss @@ -0,0 +1,96 @@ +// -------------------------------------------- +// Colors ------------------------------------- +// Usage example: color(primary, main) +// -------------------------------------------- +$color: ( + typography: ( + 1: #182538, + 2: #6B7A90, + 1i: #FFFFFF, + 2i: #8595AE + ), + bg: ( + 1: #FFFFFF, + 2: #F8F9FB, + 3: #E9EDF3, + 1i: #182538, + 2i: #223146, + 3i: #304057 + ), + primary: ( + 1: #535FD7, + 2: #7C85E1, + 3: #212880 + ), + secondary: ( + 1: #61EFFD, + 2: #93F4FE, + 3: #2FEAFC + ), + tertiary: ( + 1: #FFBC48, + 2: #FFCF7B, + 3: #FE7E1F + ) +); + +// -------------------------------------------- +// Typography --------------------------------- +// -------------------------------------------- +$font__family: ( + base: '"Heebo", 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, -0.1px ), + gamma: ( 32px, 42px, -0.1px ), + delta: ( 24px, 34px, -0.1px ), + epsilon: ( 20px, 30px, -0.1px ), + zeta: ( 18px, 27px, -0.1px ), + eta: ( 16px, 24px, -0.1px ), + theta: ( 14px, 20px, 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, 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 + 7: map-get($font__sizes, eta), // Text smaller + 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 + 7: map-get($font__sizes, eta), // Text smaller + 8: map-get($font__sizes, theta) // Footer area + ) +); + +$font__weight: ( + regular: 400, // font__weight(regular) + medium: 500, // font__weight(medium) + semibold: 600, // font__weight(semibold) + bold: 700 // font__weight(bold) +); + +// -------------------------------------------- +// Structure ---------------------------------- +// -------------------------------------------- +$content__padding: ( + mobile: 16px, + desktop: 24px +); +$container__width: 1080px; +$container__width-sm: 800px; diff --git a/switch/src/scss/base/_base.scss b/switch/src/scss/base/_base.scss new file mode 100644 index 0000000000000000000000000000000000000000..9a4da5c4a8d4f2bd0a93e26d676cb564465e0fd9 --- /dev/null +++ b/switch/src/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, 1); /* 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/switch/src/scss/base/_helpers.scss b/switch/src/scss/base/_helpers.scss new file mode 100644 index 0000000000000000000000000000000000000000..3be23a125b829d19e3ddaf2ee996dccc55328674 --- /dev/null +++ b/switch/src/scss/base/_helpers.scss @@ -0,0 +1,472 @@ +.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; + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @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, 1); + 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); +} + +.text-secondary { + color: color(secondary, 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; + } + } +} diff --git a/switch/src/scss/base/_typography.scss b/switch/src/scss/base/_typography.scss new file mode 100644 index 0000000000000000000000000000000000000000..7e764cdbccda150dfacd3bdfda673be000bc2478 --- /dev/null +++ b/switch/src/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, 2); + 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/switch/src/scss/components/_buttons.scss b/switch/src/scss/components/_buttons.scss new file mode 100644 index 0000000000000000000000000000000000000000..ff7a037d97cfa904907a93b5ed93170666f0891a --- /dev/null +++ b/switch/src/scss/components/_buttons.scss @@ -0,0 +1,125 @@ +.button { + display: inline-flex; + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @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(primary, 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-shadow { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + box-shadow: 0 8px 24px rgba(color(bg, 1), .25); + mix-blend-mode: multiply; + transition: box-shadow .15s ease; + } + + &:hover { + + &::before { + box-shadow: 0 8px 24px rgba(color(bg, 1), .35); + } + } +} + +.button-sm { + padding: 8px 24px; + height: 32px; + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(bg, 1), .25); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(bg, 1), .35); + } + } + } +} + +.button-primary { + color: color(typography, 1i) !important; + background-color: color(primary, 1); + + &:hover { + background: lighten(color(primary, 1), 1%); + } + + &.button-shadow { + + &::before { + box-shadow: 0 8px 16px rgba(color(primary, 1), .25); + mix-blend-mode: normal; + } + + &:hover { + + &::before { + box-shadow: 0 8px 16px rgba(color(primary, 1), .35); + } + } + } + + .button-sm { + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(primary, 1), .25); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(primary, 1), .35); + } + } + } + } +} + +.button-block { + display: flex; +} diff --git a/switch/src/scss/components/_forms.scss b/switch/src/scss/components/_forms.scss new file mode 100644 index 0000000000000000000000000000000000000000..49b7609aeba99286bba72fe9f13928d18902fda4 --- /dev/null +++ b/switch/src/scss/components/_forms.scss @@ -0,0 +1,157 @@ +.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, 2); + } + + &::-ms-input-placeholder { + color: color(typography, 2); + } + + &:-ms-input-placeholder { + color: color(typography, 2); + } + + &: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; + } + } +} + +.switch[type="checkbox"] { + outline: 0; + user-select: none; + position: absolute; + opacity: 0; + + + label { + display: inline-flex; + position: relative; + line-height: 36px; + padding-left: 78px; + user-select: none; + cursor: pointer; + + &::before, + &::after { + content: ''; + position: absolute; + display: block; + } + + &::before { + top: 0; + left: 0; + width: 64px; + height: 36px; + border-radius: 18px; + background: color(bg, 3); + } + + &::after { + top: 6px; + left: 6px; + width: 24px; + height: 24px; + border-radius: 12px; + background: color(bg, 1); + transition: all .15s ease-out; + } + } + + &:checked { + + + label { + + &::before { + background: color(primary, 1); + } + + &::after { + left: 34px; + } + } + } +} + +@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/switch/src/scss/layout/_cta.scss b/switch/src/scss/layout/_cta.scss new file mode 100644 index 0000000000000000000000000000000000000000..99ee10eca0eb4ca0c77e685e8631dae3b0adb67d --- /dev/null +++ b/switch/src/scss/layout/_cta.scss @@ -0,0 +1,68 @@ +.cta { + position: relative; + + .section-inner { + padding-bottom: 64px; + } + + .section-paragraph { + margin-bottom: 32px; + } + + &::before { + content: ''; + position: absolute; + bottom: -32px; + left: calc(50% - 720px); + height: 263px; + width: 1440px; + background-image: url('../images/cta-illustration-light.svg'); + + .lights-off & { + background-image: url('../images/cta-illustration-dark.svg'); + } + } +} + +.cta-cta { + max-width: 400px; + margin-left: auto; + margin-right: auto; +} + +@include media( 'medium' ) { + + .cta { + + .section-inner { + padding-bottom: 128px; + } + + .section-paragraph { + margin-bottom: 40px; + padding-left: 72px; + padding-right: 72px; + } + + &::before { + bottom: 0; + } + } + + .cta-cta { + + .button { + min-width: 170px; + } + } +} diff --git a/switch/src/scss/layout/_faqs.scss b/switch/src/scss/layout/_faqs.scss new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/switch/src/scss/layout/_features.scss b/switch/src/scss/layout/_features.scss new file mode 100644 index 0000000000000000000000000000000000000000..ba94c0b01ae3d56dc4cf864962cda29d153bfdc0 --- /dev/null +++ b/switch/src/scss/layout/_features.scss @@ -0,0 +1,118 @@ +.features-wrap { + max-width: 540px; + margin: 0 auto; +} + +.features-image { + position: relative; + margin-top: 64px; + margin-bottom: 112px; +} + +.features-illustration { + position: absolute; + top: -2%; + left: 50%; + transform: translateX(-50%); + max-width: 136%; +} + +.features-box { + margin: 0 auto; + box-shadow: 48px 16px 48px rgba(color(typography, 1), .12); + transform: perspective(1000px) rotateY(10deg) translateY(2%); + + .lights-off & { + box-shadow: 48px 16px 48px rgba(darken(color(bg, 1i), 35%), .2); + } +} + +.feature { + text-align: center; + margin-bottom: 48px; + + &:last-of-type { + margin-bottom: 0; + } +} + +.feature-icon { + display: inline-flex; + margin-bottom: 16px; + + img, + svg { + max-width: none; + } +} + +.feature-title { + position: relative; + margin-bottom: 26px; + + &::after { + content: ''; + width: 32px; + height: 2px; + position: absolute; + bottom: -14px; + left: calc(50% - 16px); + background: color(bg, 3); + + .lights-off & { + background: color(bg, 3i); + } + } +} + +@include media( '>medium' ) { + + .features { + position: relative; + + .section-inner { + padding-bottom: 100px; + } + + .section-paragraph { + padding-left: 72px; + padding-right: 72px; + } + + &::before { + content: ''; + width: 100%; + height: 300px; + position: absolute; + left: 0; + top: 168px; + background: linear-gradient(to bottom, rgba(color(primary, 1), 0), rgba(color(primary, 1), .04)); + + .lights-off & { + display: none; + } + } + } + + .feature { + text-align: left; + } + + .feature-inner { + display: flex; + } + + .feature-icon { + display: block; + margin-top: 8px; + margin-right: 32px; + margin-bottom: 0; + } + + .feature-title { + + &::after { + left: 0; + } + } +} diff --git a/switch/src/scss/layout/_footer.scss b/switch/src/scss/layout/_footer.scss new file mode 100644 index 0000000000000000000000000000000000000000..5c645a773a20756085ee2ebf40556944c0f8b9ec --- /dev/null +++ b/switch/src/scss/layout/_footer.scss @@ -0,0 +1,99 @@ +.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); + } + } + background: color(bg, 1i); + color: color(typography, 2); + + a { + @include anchor-aspect(footer); + } + + &::before { + display: none; + + .lights-off & { + display: block; + } + } +} + +.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-links, +.footer-social-links { + + li { + + + li { + margin-left: 16px; + } + } +} + +.footer-social-links { + + li { + display: inline-flex; + + a { + padding: 8px; + } + } +} + +@include media( '>medium' ) { + + .site-footer-inner { + justify-content: space-between; + padding-top: 72px; + padding-bottom: 72px; + } + + .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/switch/src/scss/layout/_header.scss b/switch/src/scss/layout/_header.scss new file mode 100644 index 0000000000000000000000000000000000000000..27dc4afeee8e883200807b0e193796d5e9695389 --- /dev/null +++ b/switch/src/scss/layout/_header.scss @@ -0,0 +1,57 @@ +.site-header { + position: relative; + padding: 24px 0; + z-index: 2; + + &::before { + content: ''; + position: absolute; + top: -140px; + right: -100px; + width: 1440px; + height: 324px; + background-image: url('../images/header-illustration-light.svg'); + + .lights-off & { + background-image: url('../images/header-illustration-dark.svg'); + } + } +} + +.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 { + + &::before { + display: none; + } + } +} diff --git a/switch/src/scss/layout/_hero.scss b/switch/src/scss/layout/_hero.scss new file mode 100644 index 0000000000000000000000000000000000000000..69b5c4a92e9afd031b3b0cb5d8522ff24729b980 --- /dev/null +++ b/switch/src/scss/layout/_hero.scss @@ -0,0 +1,152 @@ +.hero { + text-align: center; + padding-top: 48px; + padding-bottom: 88px; +} + +.hero-copy { + position: relative; /* To display elements above hero illustrations */ +} + +.hero-paragraph { + margin-bottom: 32px; +} + +.hero-cta { + max-width: 400px; + margin-left: auto; + margin-right: auto; + margin-bottom: 80px; +} + +.lights-toggle { + color: rgba(color(typography, 2), .64); +} + +.header-illustration { + display: none; + + img, + svg { + max-width: none; + } +} + +.header-illustration-image { + display: none; +} + +.hero-media { + position: relative; +} + +.hero-media-illustration { + position: absolute; + top: -10%; + left: -15px; + + img, + svg { + max-width: 136%; + } +} + +.hero-media-container { + position: relative; +} + +.hero-media-image { + margin: 0 auto; + box-shadow: 48px 16px 48px rgba(color(bg, 1i), .12); + border-radius: 4px; + transform: perspective(1000px) rotateY(16deg) rotateX(2deg) rotateZ(-7deg) scaleY(.95) translatex(2%); + + .lights-off & { + box-shadow: 48px 16px 48px rgba(darken(color(bg, 1i), 35%), .2); + } +} + +@include media( ' * { + display: flex; + + + * { + margin-top: 32px; + } + } + } + + .lights-toggle { + justify-content: center; + } +} + +@include media( '>medium' ) { + + .hero { + text-align: left; + padding-top: 88px; + padding-bottom: 120px; + } + + .hero-inner { + /* Split hero in two half */ + display: flex; + justify-content: space-between; + } + + .hero-copy { + padding-top: 40px; + padding-right: 48px; + min-width: 448px; + max-width: 512px; + z-index: 1; + } + + .hero-title { + margin-bottom: 16px; + } + + .hero-paragraph { + margin-bottom: 32px; + } + + .hero-cta { + display: flex; + align-items: center; + margin: 0; + + .button { + min-width: 170px; + + &:first-child { + margin-right: 32px; + } + } + } + + .header-illustration { + display: block; + } + + .hero-media { + z-index: 0; + + img, + svg { + max-width: none; + } + } + + .header-illustration-image { + display: block; + position: absolute; + top: -168px; + left: -722px; + width: 1440px; + height: 324px; + } +} diff --git a/switch/src/scss/layout/_lights.scss b/switch/src/scss/layout/_lights.scss new file mode 100644 index 0000000000000000000000000000000000000000..bd12f00373d4a20512da2314dbb20962afec860a --- /dev/null +++ b/switch/src/scss/layout/_lights.scss @@ -0,0 +1,185 @@ +.switch[type="checkbox"] { + + + label { + + &::before { + background: mix(color(secondary, 3), color(primary, 1)); + background: linear-gradient(to right, color(secondary, 3) 0, color(primary, 1) 100%); + } + + &::after { + background: color(bg, 1); + } + } + + &:checked { + + + label { + + &::before { + background: mix(color(tertiary, 1), color(tertiary, 3)); + background: linear-gradient(to right, color(tertiary, 1) 0, color(tertiary, 3) 100%); + } + } + } +} + +.asset-light, +.asset-dark { + visibility: hidden; + opacity: 0; +} + +.is-loaded { + + .asset-light, + .asset-dark { + visibility: visible; + opacity: 1; + } +} + +.asset-dark { + display: none; +} + +.lights-off { + + .asset-light { + display: none; + } + + .asset-dark { + display: block; + } + + color: color(typography, 2i); + + a { + color: color(typography, 2i); + } + + h1, h2, h3, h4, h5, h6, + .h1, .h2, .h3, .h4, .h5, .h6 { + color: color(typography, 1i) !important; + } + + &.is-boxed { + background: lighten(desaturate(color(bg, 1i), 8%), 3%); + } + + .body-wrap { + background: color(bg, 1i); + } + + .boxed-container { + @include shadow(dark); + } + + hr { + @include divider(false, dark); + } + + .has-top-divider { + @include divider(before, dark); + } + + .has-bottom-divider { + @include divider(after, dark); + } +} + +// Transitions +body, +a, +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + transition: color .25s ease; +} + +.is-boxed, +.body-wrap, +.has-top-divider, +.has-bottom-divider::after, +hr::after, +.feature-title::after { + transition: background .25s ease; +} + +.boxed-container { + transition: box-shadow .15s ease; +} + +// Animations +@keyframes fadeInLogo { + 0% { + opacity: 0; + transform: scale(0.5); + } +} + +@keyframes fadeInLeftMedia { + 0% { + opacity: 0; + transform: scale(0.8) translate3d(40px, 10px, 0); + } + 30% { + opacity: 1; + } +} + +@keyframes fadeInLeftIllustration { + 0% { + opacity: 0; + transform: scale(0.95) translate3d(40px, 10px, 0); + } +} + +@keyframes fadeUpBox { + 0% { + opacity: 0; + transform: scale(0.95) translate3d(-40px, 20px, 0); + } + 30% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } +} + +.is-loaded { + + .header-logo-image { + animation: fadeInLogo .35s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .hero-media-image { + animation: fadeInLeftMedia 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .hero-media-illustration-image { + animation: fadeInLeftIllustration 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .features-box { + animation: fadeUpBox 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .header-illustration-image { + animation: fadeIn 1s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } + + .features-illustration { + animation: fadeIn 1s .2s both cubic-bezier(0.3, 0, 0.2, 1); + will-change: transform; + } +} diff --git a/switch/src/scss/layout/_main.scss b/switch/src/scss/layout/_main.scss new file mode 100644 index 0000000000000000000000000000000000000000..6f0e8e08d39a6c44c09d1851267ccf101e2a9604 --- /dev/null +++ b/switch/src/scss/layout/_main.scss @@ -0,0 +1,36 @@ +.is-boxed { + background: color(bg, 3); +} + +.body-wrap { + background: color(bg, 1); + overflow: hidden; + /* Sticky footer */ + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.boxed-container { + max-width: 1440px; + margin: 0 auto; + @include shadow; +} + +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/switch/src/scss/style.scss b/switch/src/scss/style.scss new file mode 100644 index 0000000000000000000000000000000000000000..e00ac74a1417959ad80f8607761114cd6e751038 --- /dev/null +++ b/switch/src/scss/style.scss @@ -0,0 +1,79 @@ +/*-------------------------------------------------------------- +# 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"; + +/*-------------------------------------------------------------- +# Faqs +--------------------------------------------------------------*/ +@import "layout/faqs"; + +/*-------------------------------------------------------------- +# CTA +--------------------------------------------------------------*/ +@import "layout/cta"; + +/*-------------------------------------------------------------- +# Site content +--------------------------------------------------------------*/ +@import "layout/main"; + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ +@import "layout/footer"; + +/*-------------------------------------------------------------- +# Lights +--------------------------------------------------------------*/ +@import "layout/lights";