├── .gitignore ├── LICENSE ├── README.md ├── assets └── styles │ ├── angled-edges.css │ ├── angled-edges.scss │ ├── site.css │ ├── site.scss │ └── site │ ├── _normalize.scss │ └── _site.scss ├── gulpfile.js ├── index.html └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Nigel O Toole 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Angled Edges (SASS mixin) 2 | 3 | [Live demo](http://nigelotoole.github.io/angled-edges/) 4 | 5 | Add a consistent angled edge to a full width element. 6 | This technique uses CSS clip-path to clip the image but has a fallback using pseudo elements for older browsers. 7 | It is only intended for use on full width elements as it uses the vw unit to calulate the angle. 8 | 9 | 10 | ## Usage 11 | 12 | Once you have downloaded the code, run the commands below to view the demo. 13 | 14 | ```javascript 15 | $ npm install 16 | $ gulp serve 17 | ``` 18 | 19 | You can also import **angled-edges.scss** into your own project directly and use the classes already setup or use the mixin in your own classes. 20 | 21 | 22 | Follow the code example below for basic usage with an angle on the top left. 23 | 24 | ```html 25 |
26 | Nebula 27 |
28 | ``` 29 | 30 | 31 | ### License 32 | MIT © Nigel O Toole 33 | -------------------------------------------------------------------------------- /assets/styles/angled-edges.css: -------------------------------------------------------------------------------- 1 | .angle--top-left { 2 | position: relative; 3 | overflow: hidden; 4 | -webkit-clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 100%); 5 | clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 100%); 6 | } 7 | 8 | @supports not ((-webkit-clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 100%)) or (clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 100%))) { 9 | .angle--top-left::before, .angle--top-left::after { 10 | content: ""; 11 | position: absolute; 12 | left: 0; 13 | z-index: 10; 14 | display: block; 15 | border-style: solid; 16 | } 17 | .angle--top-left::before { 18 | top: 0; 19 | border-width: 8vw 100vw 0 0; 20 | border-color: #fff transparent transparent transparent; 21 | } 22 | } 23 | 24 | .angle--top-right { 25 | position: relative; 26 | overflow: hidden; 27 | -webkit-clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 100%); 28 | clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 100%); 29 | } 30 | 31 | @supports not ((-webkit-clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 100%)) or (clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 100%))) { 32 | .angle--top-right::before, .angle--top-right::after { 33 | content: ""; 34 | position: absolute; 35 | left: 0; 36 | z-index: 10; 37 | display: block; 38 | border-style: solid; 39 | } 40 | .angle--top-right::before { 41 | top: 0; 42 | border-width: 8vw 0 0 100vw; 43 | border-color: #fff transparent transparent transparent; 44 | } 45 | } 46 | 47 | .angle--bottom-left { 48 | position: relative; 49 | overflow: hidden; 50 | -webkit-clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 7vw)); 51 | clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 7vw)); 52 | } 53 | 54 | @supports not ((-webkit-clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 7vw))) or (clip-path: polygon(0 0, 100% 0, 100% 100%, 0 calc(100% - 7vw)))) { 55 | .angle--bottom-left::before, .angle--bottom-left::after { 56 | content: ""; 57 | position: absolute; 58 | left: 0; 59 | z-index: 10; 60 | display: block; 61 | border-style: solid; 62 | } 63 | .angle--bottom-left::after { 64 | bottom: 0; 65 | border-width: 0 100vw 8vw 0; 66 | border-color: transparent transparent #fff transparent; 67 | } 68 | } 69 | 70 | .angle--bottom-right { 71 | position: relative; 72 | overflow: hidden; 73 | -webkit-clip-path: polygon(0 0, 100% 0, 100% calc(100% - 7vw), 0 100%); 74 | clip-path: polygon(0 0, 100% 0, 100% calc(100% - 7vw), 0 100%); 75 | } 76 | 77 | @supports not ((-webkit-clip-path: polygon(0 0, 100% 0, 100% calc(100% - 7vw), 0 100%)) or (clip-path: polygon(0 0, 100% 0, 100% calc(100% - 7vw), 0 100%))) { 78 | .angle--bottom-right::before, .angle--bottom-right::after { 79 | content: ""; 80 | position: absolute; 81 | left: 0; 82 | z-index: 10; 83 | display: block; 84 | border-style: solid; 85 | } 86 | .angle--bottom-right::after { 87 | bottom: 0; 88 | border-width: 0 0 8vw 100vw; 89 | border-color: transparent transparent #fff transparent; 90 | } 91 | } 92 | 93 | .angle--both-left-left { 94 | position: relative; 95 | overflow: hidden; 96 | -webkit-clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 calc(100% - 7vw)); 97 | clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 calc(100% - 7vw)); 98 | } 99 | 100 | @supports not ((-webkit-clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 calc(100% - 7vw))) or (clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% 100%, 0 calc(100% - 7vw)))) { 101 | .angle--both-left-left::before, .angle--both-left-left::after { 102 | content: ""; 103 | position: absolute; 104 | left: 0; 105 | z-index: 10; 106 | display: block; 107 | border-style: solid; 108 | } 109 | .angle--both-left-left::before { 110 | top: 0; 111 | border-width: 8vw 100vw 0 0; 112 | border-color: #fff transparent transparent transparent; 113 | } 114 | .angle--both-left-left::after { 115 | bottom: 0; 116 | border-width: 0 100vw 8vw 0; 117 | border-color: transparent transparent #fff transparent; 118 | } 119 | } 120 | 121 | .angle--both-right-right { 122 | position: relative; 123 | overflow: hidden; 124 | -webkit-clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% calc(100% - 7vw), 0 100%); 125 | clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% calc(100% - 7vw), 0 100%); 126 | } 127 | 128 | @supports not ((-webkit-clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% calc(100% - 7vw), 0 100%)) or (clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% calc(100% - 7vw), 0 100%))) { 129 | .angle--both-right-right::before, .angle--both-right-right::after { 130 | content: ""; 131 | position: absolute; 132 | left: 0; 133 | z-index: 10; 134 | display: block; 135 | border-style: solid; 136 | } 137 | .angle--both-right-right::before { 138 | top: 0; 139 | border-width: 8vw 0 0 100vw; 140 | border-color: #fff transparent transparent transparent; 141 | } 142 | .angle--both-right-right::after { 143 | bottom: 0; 144 | border-width: 0 0 8vw 100vw; 145 | border-color: transparent transparent #fff transparent; 146 | } 147 | } 148 | 149 | .angle--both-left-right { 150 | position: relative; 151 | overflow: hidden; 152 | -webkit-clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% calc(100% - 7vw), 0 100%); 153 | clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% calc(100% - 7vw), 0 100%); 154 | } 155 | 156 | @supports not ((-webkit-clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% calc(100% - 7vw), 0 100%)) or (clip-path: polygon(0 calc(0% + 7vw), 100% 0, 100% calc(100% - 7vw), 0 100%))) { 157 | .angle--both-left-right::before, .angle--both-left-right::after { 158 | content: ""; 159 | position: absolute; 160 | left: 0; 161 | z-index: 10; 162 | display: block; 163 | border-style: solid; 164 | } 165 | .angle--both-left-right::before { 166 | top: 0; 167 | border-width: 8vw 100vw 0 0; 168 | border-color: #fff transparent transparent transparent; 169 | } 170 | .angle--both-left-right::after { 171 | bottom: 0; 172 | border-width: 0 0 8vw 100vw; 173 | border-color: transparent transparent #fff transparent; 174 | } 175 | } 176 | 177 | .angle--both-right-left { 178 | position: relative; 179 | overflow: hidden; 180 | -webkit-clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 calc(100% - 7vw)); 181 | clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 calc(100% - 7vw)); 182 | } 183 | 184 | @supports not ((-webkit-clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 calc(100% - 7vw))) or (clip-path: polygon(0 0, 100% calc(0% + 7vw), 100% 100%, 0 calc(100% - 7vw)))) { 185 | .angle--both-right-left::before, .angle--both-right-left::after { 186 | content: ""; 187 | position: absolute; 188 | left: 0; 189 | z-index: 10; 190 | display: block; 191 | border-style: solid; 192 | } 193 | .angle--both-right-left::before { 194 | top: 0; 195 | border-width: 8vw 0 0 100vw; 196 | border-color: #fff transparent transparent transparent; 197 | } 198 | .angle--both-right-left::after { 199 | bottom: 0; 200 | border-width: 0 100vw 8vw 0; 201 | border-color: transparent transparent #fff transparent; 202 | } 203 | } 204 | 205 | .angle__content { 206 | display: block; 207 | width: 100%; 208 | height: auto; 209 | } 210 | 211 | .angle--colour { 212 | color: #fff; 213 | background-color: #2196F3; 214 | text-align: center; 215 | padding: 10% 0; 216 | } 217 | 218 | /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFuZ2xlZC1lZGdlcy5zY3NzIiwiYW5nbGVkLWVkZ2VzLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE0SEE7RUFsSEUsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQW1FakIsd0VBRG1CO1VBQ25CLGdFQURtQjtDQWlEcEI7O0FBMUN3QztFQXdDekM7SUFyQ1EsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsWUFBWTtJQUNaLGVBQWU7SUFDZixvQkFBb0I7R0FDckI7RUErQlA7SUEzQlUsT0FBTztJQUNQLDRCQXZEMEM7SUF3RDFDLHVEQS9DZ0U7R0FnRGpFO0NDaEZSOztBRDRHRDtFQXRIRSxtQkFBbUI7RUFDbkIsaUJBQWlCO0VBbUVqQix3RUFEbUI7VUFDbkIsZ0VBRG1CO0NBcURwQjs7QUE5Q3dDO0VBNEN6QztJQXpDUSxZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixZQUFZO0lBQ1osZUFBZTtJQUNmLG9CQUFvQjtHQUNyQjtFQW1DUDtJQS9CVSxPQUFPO0lBQ1AsNEJBakQwQztJQWtEMUMsdURBL0NnRTtHQWdEakU7Q0MxRFI7O0FEMEZEO0VBMUhFLG1CQUFtQjtFQUNuQixpQkFBaUI7RUFtRWpCLHVFQURtQjtVQUNuQiwrREFEbUI7Q0F5RHBCOztBQWxEd0M7RUFnRHpDO0lBN0NRLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsUUFBUTtJQUNSLFlBQVk7SUFDWixlQUFlO0lBQ2Ysb0JBQW9CO0dBQ3JCO0VBdUNQO0lBM0JVLFVBQVU7SUFDViw0QkF6QzZDO0lBMEM3Qyx1REFqQ21FO0dBa0NwRTtDQzVDUjs7QUR3RUQ7RUE5SEUsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQW1FakIsdUVBRG1CO1VBQ25CLCtEQURtQjtDQTZEcEI7O0FBdER3QztFQW9EekM7SUFqRFEsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsWUFBWTtJQUNaLGVBQWU7SUFDZixvQkFBb0I7R0FDckI7RUEyQ1A7SUEvQlUsVUFBVTtJQUNWLDRCQW5DNkM7SUFvQzdDLHVEQWpDbUU7R0FrQ3BFO0NDdEJSOztBRHNERDtFQWxJRSxtQkFBbUI7RUFDbkIsaUJBQWlCO0VBbUVqQixvRkFEbUI7VUFDbkIsNEVBRG1CO0NBaUVwQjs7QUExRHdDO0VBd0R6QztJQXJEUSxZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixZQUFZO0lBQ1osZUFBZTtJQUNmLG9CQUFvQjtHQUNyQjtFQStDUDtJQTNDVSxPQUFPO0lBQ1AsNEJBdkQwQztJQXdEMUMsdURBL0NnRTtHQWdEakU7RUF3Q1Q7SUFuQ1UsVUFBVTtJQUNWLDRCQXpDNkM7SUEwQzdDLHVEQWpDbUU7R0FrQ3BFO0NDS1I7O0FEK0JEO0VBdElFLG1CQUFtQjtFQUNuQixpQkFBaUI7RUFtRWpCLG9GQURtQjtVQUNuQiw0RUFEbUI7Q0FxRXBCOztBQTlEd0M7RUE0RHpDO0lBekRRLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsUUFBUTtJQUNSLFlBQVk7SUFDWixlQUFlO0lBQ2Ysb0JBQW9CO0dBQ3JCO0VBbURQO0lBL0NVLE9BQU87SUFDUCw0QkFqRDBDO0lBa0QxQyx1REEvQ2dFO0dBZ0RqRTtFQTRDVDtJQXZDVSxVQUFVO0lBQ1YsNEJBbkM2QztJQW9DN0MsdURBakNtRTtHQWtDcEU7Q0NnQ1I7O0FEUUQ7RUExSUUsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQW1FakIsb0ZBRG1CO1VBQ25CLDRFQURtQjtDQXlFcEI7O0FBbEV3QztFQWdFekM7SUE3RFEsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsWUFBWTtJQUNaLGVBQWU7SUFDZixvQkFBb0I7R0FDckI7RUF1RFA7SUFuRFUsT0FBTztJQUNQLDRCQXZEMEM7SUF3RDFDLHVEQS9DZ0U7R0FnRGpFO0VBZ0RUO0lBM0NVLFVBQVU7SUFDViw0QkFuQzZDO0lBb0M3Qyx1REFqQ21FO0dBa0NwRTtDQzJEUjs7QURmRDtFQTlJRSxtQkFBbUI7RUFDbkIsaUJBQWlCO0VBbUVqQixvRkFEbUI7VUFDbkIsNEVBRG1CO0NBNkVwQjs7QUF0RXdDO0VBb0V6QztJQWpFUSxZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixZQUFZO0lBQ1osZUFBZTtJQUNmLG9CQUFvQjtHQUNyQjtFQTJEUDtJQXZEVSxPQUFPO0lBQ1AsNEJBakQwQztJQWtEMUMsdURBL0NnRTtHQWdEakU7RUFvRFQ7SUEvQ1UsVUFBVTtJQUNWLDRCQXpDNkM7SUEwQzdDLHVEQWpDbUU7R0FrQ3BFO0NDc0ZSOztBRHJDQztFQUNFLGVBQWU7RUFDZixZQUFZO0VBQ1osYUFBYTtDQUNkOztBQUVIO0VBQ0UsWUFBWTtFQUNaLDBCQUEwQjtFQUMxQixtQkFBbUI7RUFDbkIsZUFBZTtDQUNoQiIsImZpbGUiOiJhbmdsZWQtZWRnZXMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyAkYW5nbGU6IFRoZSBhbmdsZSBpbiBkZWdyZWVzOiAxIC0gNDVcbi8vICRhbmdsZS1wb3NpdGlvbi15OiBUaGUgWSBwb3NpdGlvbiBvZiB0aGUgYW5nbGU6IHRvcCB8IGJvdHRvbSB8IGJvdGhcbi8vICRhbmdsZS1wb3NpdGlvbi14OiBUaGUgWCBwb3NpdGlvbiBvZiB0aGUgYW5nbGU6IGxlZnQgfCByaWdodFxuLy8gJGFuZ2xlLXBvc2l0aW9uLWJvdHRvbS14OiBUaGUgWCBwb3NpdGlvbiBvZiB0aGUgYm90dG9tIGFuZ2xlIGlmIHVzaW5nICdib3RoJyBmb3IgJGFuZ2xlLXBvc2l0aW9uLXk6IGxlZnQgfCByaWdodFxuLy8gJGZhbGxiYWNrOiBDcmVhdGUgYSBmYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnM6IHRydWUgfCBmYWxzZVxuLy8gJGZhbGxiYWNrLWNvbG9yOiBGYWxsYmFjayBjb2xvdXIgZm9yIG9sZGVyIGJyb3dzZXJzOiBIZXggY29sb3JcblxuQG1peGluIGFuZ2xlLWVkZ2UoJGFuZ2xlLCAkYW5nbGUtcG9zaXRpb24teSwgJGFuZ2xlLXBvc2l0aW9uLXgsICRhbmdsZS1wb3NpdGlvbi1ib3R0b20teDogJycsICRmYWxsYmFjazogdHJ1ZSwgJGZhbGxiYWNrLWNvbG9yOiAjZmZmKSB7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gIC8vIENvbnZlcnRzIGRlZ3JlZXMgdG8gVlcsIDEwMHZ3ID0gNDVkZWcgdXNpbmcgdGhpcyB0ZWNobmlxdWVcbiAgQGlmICRhbmdsZSA+IDQ1IHtcbiAgICAkYW5nbGU6IDA7XG4gICAgQGVycm9yICdJbnZhbGlkIGFuZ2xlLCBpdCBtdXN0IGJlIGJldHdlZW4gMS00NSc7XG4gIH1cbiAgQGlmICRhbmdsZSA8IDQ2IHtcbiAgICAkYW5nbGU6IGNvbnZlcnREZWdUb1ZXKCRhbmdsZSk7XG4gIH1cblxuICBAaWYgJGFuZ2xlLXBvc2l0aW9uLWJvdHRvbS14ID09ICcnIHtcbiAgICAkYW5nbGUtcG9zaXRpb24tYm90dG9tLXg6ICRhbmdsZS1wb3NpdGlvbi14O1xuICB9XG5cbiAgJGFuZ2xlLWNhbGMtdG9wOiBjYWxjKDAlICsgI3skYW5nbGV9dncpO1xuICAkYW5nbGUtY2FsYy1ib3R0b206IGNhbGMoMTAwJSAtICN7JGFuZ2xlfXZ3KTtcblxuICAkY2xpcC1wYXRoLXRvcDogMCAwLCAxMDAlIDA7XG4gICRjbGlwLXBhdGgtYm90dG9tOiAxMDAlIDEwMCUsIDAgMTAwJTtcblxuICAkYm9yZGVyLXdpZHRoLXRvcDogJyc7XG4gICRib3JkZXItd2lkdGgtYm90dG9tOiAnJztcbiAgJGJvcmRlci1jb2xvci10b3A6ICcnO1xuICAkYm9yZGVyLWNvbG9yLWJvdHRvbTogJyc7XG5cblxuICBAaWYgJGFuZ2xlLXBvc2l0aW9uLXkgPT0gJ3RvcCcgb3IgJGFuZ2xlLXBvc2l0aW9uLXkgPT0gJ2JvdGgnIHtcblxuICAgIEBpZiAkYW5nbGUtcG9zaXRpb24teCA9PSAnbGVmdCcge1xuICAgICAgJGNsaXAtcGF0aC10b3A6IDAgJGFuZ2xlLWNhbGMtdG9wLCAxMDAlIDA7XG5cbiAgICAgICRib3JkZXItd2lkdGgtdG9wOiAjeyRhbmdsZSArIDF9dncgMTAwdncgMCAwO1xuICAgIH1cblxuICAgIEBpZiAkYW5nbGUtcG9zaXRpb24teCA9PSAncmlnaHQnIHtcbiAgICAgICRjbGlwLXBhdGgtdG9wOiAwIDAsIDEwMCUgJGFuZ2xlLWNhbGMtdG9wO1xuXG4gICAgICAkYm9yZGVyLXdpZHRoLXRvcDogI3skYW5nbGUgKyAxfXZ3IDAgMCAxMDB2dztcbiAgICB9XG5cbiAgICAkYm9yZGVyLWNvbG9yLXRvcDogJGZhbGxiYWNrLWNvbG9yIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICB9XG5cblxuICBAaWYgJGFuZ2xlLXBvc2l0aW9uLXkgPT0gJ2JvdHRvbScgb3IgJGFuZ2xlLXBvc2l0aW9uLXkgPT0gJ2JvdGgnIHtcblxuICAgIEBpZiAkYW5nbGUtcG9zaXRpb24teSA9PSAnYm90aCcgYW5kICRhbmdsZS1wb3NpdGlvbi14ICE9ICRhbmdsZS1wb3NpdGlvbi1ib3R0b20teCB7XG4gICAgICAkYW5nbGUtcG9zaXRpb24teDogJGFuZ2xlLXBvc2l0aW9uLWJvdHRvbS14O1xuICAgIH1cblxuICAgIEBpZiAkYW5nbGUtcG9zaXRpb24teCA9PSAnbGVmdCcge1xuICAgICAgJGNsaXAtcGF0aC1ib3R0b206IDEwMCUgMTAwJSwgMCAkYW5nbGUtY2FsYy1ib3R0b207XG5cbiAgICAgICRib3JkZXItd2lkdGgtYm90dG9tOiAwIDEwMHZ3ICN7JGFuZ2xlICsgMX12dyAwO1xuICAgIH1cblxuICAgIEBpZiAkYW5nbGUtcG9zaXRpb24teCA9PSAncmlnaHQnIHtcbiAgICAgICRjbGlwLXBhdGgtYm90dG9tOiAxMDAlICRhbmdsZS1jYWxjLWJvdHRvbSwgMCAxMDAlO1xuXG4gICAgICAkYm9yZGVyLXdpZHRoLWJvdHRvbTogMCAwICN7JGFuZ2xlICsgMX12dyAxMDB2dztcbiAgICB9XG5cbiAgICAkYm9yZGVyLWNvbG9yLWJvdHRvbTogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJGZhbGxiYWNrLWNvbG9yIHRyYW5zcGFyZW50O1xuICB9XG5cbiAgJGNsaXAtcGF0aDogcG9seWdvbigkY2xpcC1wYXRoLXRvcCwgJGNsaXAtcGF0aC1ib3R0b20pO1xuICBjbGlwLXBhdGg6ICRjbGlwLXBhdGg7XG5cblxuICAvLyBGYWxsYmFjayBmb3IgY2xpcC1wYXRoIHdpdGggc29saWQgY29sb3Vyc1xuICBAaWYgJGZhbGxiYWNrIHtcblxuICAgIEBzdXBwb3J0cyBub3QgKGNsaXAtcGF0aDogJGNsaXAtcGF0aCkge1xuXG4gICAgICAmOjpiZWZvcmUsICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCJcIjtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgICB9XG5cbiAgICAgIEBpZiAkYW5nbGUtcG9zaXRpb24teSA9PSAndG9wJyBvciAkYW5nbGUtcG9zaXRpb24teSA9PSAnYm90aCcge1xuICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBib3JkZXItd2lkdGg6ICRib3JkZXItd2lkdGgtdG9wO1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvci10b3A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgQGlmICRhbmdsZS1wb3NpdGlvbi15ID09ICdib3R0b20nIG9yICRhbmdsZS1wb3NpdGlvbi15ID09ICdib3RoJyB7XG4gICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICBib3R0b206IDA7XG4gICAgICAgICAgYm9yZGVyLXdpZHRoOiAkYm9yZGVyLXdpZHRoLWJvdHRvbTtcbiAgICAgICAgICBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3ItYm90dG9tO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG5cbiAgfVxuXG59XG5cbi8vIENvbnZlcnRzIGRlZ3JlZXMgdG8gVlcsIDEwMHZ3ID0gNDVkZWcgdXNpbmcgdGhpcyB0ZWNobmlxdWVcbkBmdW5jdGlvbiBjb252ZXJ0RGVnVG9WVygkYW5nbGUpe1xuICBAcmV0dXJuIHJvdW5kKCRhbmdsZSoyLjIyKTtcbn1cblxuXG4vLyBDbGFzc2VzXG4uYW5nbGUtLXRvcC1sZWZ0IHtcbiAgQGluY2x1ZGUgYW5nbGUtZWRnZSgkYW5nbGU6IDMsICRhbmdsZS1wb3NpdGlvbi15OiAndG9wJywgJGFuZ2xlLXBvc2l0aW9uLXg6ICdsZWZ0Jyk7XG59XG5cbi5hbmdsZS0tdG9wLXJpZ2h0IHtcbiAgQGluY2x1ZGUgYW5nbGUtZWRnZSgkYW5nbGU6IDMsICRhbmdsZS1wb3NpdGlvbi15OiAndG9wJywgJGFuZ2xlLXBvc2l0aW9uLXg6ICdyaWdodCcpO1xufVxuXG4uYW5nbGUtLWJvdHRvbS1sZWZ0IHtcbiAgQGluY2x1ZGUgYW5nbGUtZWRnZSgkYW5nbGU6IDMsICRhbmdsZS1wb3NpdGlvbi15OiAnYm90dG9tJywgJGFuZ2xlLXBvc2l0aW9uLXg6ICdsZWZ0Jyk7XG59XG5cbi5hbmdsZS0tYm90dG9tLXJpZ2h0IHtcbiAgQGluY2x1ZGUgYW5nbGUtZWRnZSgkYW5nbGU6IDMsICRhbmdsZS1wb3NpdGlvbi15OiAnYm90dG9tJywgJGFuZ2xlLXBvc2l0aW9uLXg6ICdyaWdodCcpO1xufVxuXG4uYW5nbGUtLWJvdGgtbGVmdC1sZWZ0IHtcbiAgQGluY2x1ZGUgYW5nbGUtZWRnZSgkYW5nbGU6IDMsICRhbmdsZS1wb3NpdGlvbi15OiAnYm90aCcsICRhbmdsZS1wb3NpdGlvbi14OiAnbGVmdCcpO1xufVxuXG4uYW5nbGUtLWJvdGgtcmlnaHQtcmlnaHQge1xuICBAaW5jbHVkZSBhbmdsZS1lZGdlKCRhbmdsZTogMywgJGFuZ2xlLXBvc2l0aW9uLXk6ICdib3RoJywgJGFuZ2xlLXBvc2l0aW9uLXg6ICdyaWdodCcpO1xufVxuXG4uYW5nbGUtLWJvdGgtbGVmdC1yaWdodCB7XG4gIEBpbmNsdWRlIGFuZ2xlLWVkZ2UoJGFuZ2xlOiAzLCAkYW5nbGUtcG9zaXRpb24teTogJ2JvdGgnLCAkYW5nbGUtcG9zaXRpb24teDogJ2xlZnQnLCAkYW5nbGUtcG9zaXRpb24tYm90dG9tLXg6ICdyaWdodCcpO1xufVxuXG4uYW5nbGUtLWJvdGgtcmlnaHQtbGVmdCB7XG4gIEBpbmNsdWRlIGFuZ2xlLWVkZ2UoJGFuZ2xlOiAzLCAkYW5nbGUtcG9zaXRpb24teTogJ2JvdGgnLCAkYW5nbGUtcG9zaXRpb24teDogJ3JpZ2h0JywgJGFuZ2xlLXBvc2l0aW9uLWJvdHRvbS14OiAnbGVmdCcpO1xufVxuXG5cbiAgLmFuZ2xlX19jb250ZW50IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cblxuLmFuZ2xlLS1jb2xvdXIge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxOTZGMztcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwYWRkaW5nOiAxMCUgMDtcbn1cbiIsIi5hbmdsZS0tdG9wLWxlZnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXAtcGF0aDogcG9seWdvbigwIGNhbGMoMCUgKyA3dncpLCAxMDAlIDAsIDEwMCUgMTAwJSwgMCAxMDAlKTtcbn1cblxuQHN1cHBvcnRzIG5vdCAoY2xpcC1wYXRoOiBwb2x5Z29uKDAgY2FsYygwJSArIDd2dyksIDEwMCUgMCwgMTAwJSAxMDAlLCAwIDEwMCUpKSB7XG4gIC5hbmdsZS0tdG9wLWxlZnQ6OmJlZm9yZSwgLmFuZ2xlLS10b3AtbGVmdDo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgei1pbmRleDogMTA7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgfVxuICAuYW5nbGUtLXRvcC1sZWZ0OjpiZWZvcmUge1xuICAgIHRvcDogMDtcbiAgICBib3JkZXItd2lkdGg6IDh2dyAxMDB2dyAwIDA7XG4gICAgYm9yZGVyLWNvbG9yOiAjZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbi5hbmdsZS0tdG9wLXJpZ2h0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwLXBhdGg6IHBvbHlnb24oMCAwLCAxMDAlIGNhbGMoMCUgKyA3dncpLCAxMDAlIDEwMCUsIDAgMTAwJSk7XG59XG5cbkBzdXBwb3J0cyBub3QgKGNsaXAtcGF0aDogcG9seWdvbigwIDAsIDEwMCUgY2FsYygwJSArIDd2dyksIDEwMCUgMTAwJSwgMCAxMDAlKSkge1xuICAuYW5nbGUtLXRvcC1yaWdodDo6YmVmb3JlLCAuYW5nbGUtLXRvcC1yaWdodDo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgei1pbmRleDogMTA7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgfVxuICAuYW5nbGUtLXRvcC1yaWdodDo6YmVmb3JlIHtcbiAgICB0b3A6IDA7XG4gICAgYm9yZGVyLXdpZHRoOiA4dncgMCAwIDEwMHZ3O1xuICAgIGJvcmRlci1jb2xvcjogI2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgfVxufVxuXG4uYW5nbGUtLWJvdHRvbS1sZWZ0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwLXBhdGg6IHBvbHlnb24oMCAwLCAxMDAlIDAsIDEwMCUgMTAwJSwgMCBjYWxjKDEwMCUgLSA3dncpKTtcbn1cblxuQHN1cHBvcnRzIG5vdCAoY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCwgMTAwJSAwLCAxMDAlIDEwMCUsIDAgY2FsYygxMDAlIC0gN3Z3KSkpIHtcbiAgLmFuZ2xlLS1ib3R0b20tbGVmdDo6YmVmb3JlLCAuYW5nbGUtLWJvdHRvbS1sZWZ0OjphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG4gIC5hbmdsZS0tYm90dG9tLWxlZnQ6OmFmdGVyIHtcbiAgICBib3R0b206IDA7XG4gICAgYm9yZGVyLXdpZHRoOiAwIDEwMHZ3IDh2dyAwO1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgI2ZmZiB0cmFuc3BhcmVudDtcbiAgfVxufVxuXG4uYW5nbGUtLWJvdHRvbS1yaWdodCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCwgMTAwJSAwLCAxMDAlIGNhbGMoMTAwJSAtIDd2dyksIDAgMTAwJSk7XG59XG5cbkBzdXBwb3J0cyBub3QgKGNsaXAtcGF0aDogcG9seWdvbigwIDAsIDEwMCUgMCwgMTAwJSBjYWxjKDEwMCUgLSA3dncpLCAwIDEwMCUpKSB7XG4gIC5hbmdsZS0tYm90dG9tLXJpZ2h0OjpiZWZvcmUsIC5hbmdsZS0tYm90dG9tLXJpZ2h0OjphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG4gIC5hbmdsZS0tYm90dG9tLXJpZ2h0OjphZnRlciB7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci13aWR0aDogMCAwIDh2dyAxMDB2dztcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLmFuZ2xlLS1ib3RoLWxlZnQtbGVmdCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcC1wYXRoOiBwb2x5Z29uKDAgY2FsYygwJSArIDd2dyksIDEwMCUgMCwgMTAwJSAxMDAlLCAwIGNhbGMoMTAwJSAtIDd2dykpO1xufVxuXG5Ac3VwcG9ydHMgbm90IChjbGlwLXBhdGg6IHBvbHlnb24oMCBjYWxjKDAlICsgN3Z3KSwgMTAwJSAwLCAxMDAlIDEwMCUsIDAgY2FsYygxMDAlIC0gN3Z3KSkpIHtcbiAgLmFuZ2xlLS1ib3RoLWxlZnQtbGVmdDo6YmVmb3JlLCAuYW5nbGUtLWJvdGgtbGVmdC1sZWZ0OjphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG4gIC5hbmdsZS0tYm90aC1sZWZ0LWxlZnQ6OmJlZm9yZSB7XG4gICAgdG9wOiAwO1xuICAgIGJvcmRlci13aWR0aDogOHZ3IDEwMHZ3IDAgMDtcbiAgICBib3JkZXItY29sb3I6ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gIH1cbiAgLmFuZ2xlLS1ib3RoLWxlZnQtbGVmdDo6YWZ0ZXIge1xuICAgIGJvdHRvbTogMDtcbiAgICBib3JkZXItd2lkdGg6IDAgMTAwdncgOHZ3IDA7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjZmZmIHRyYW5zcGFyZW50O1xuICB9XG59XG5cbi5hbmdsZS0tYm90aC1yaWdodC1yaWdodCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCwgMTAwJSBjYWxjKDAlICsgN3Z3KSwgMTAwJSBjYWxjKDEwMCUgLSA3dncpLCAwIDEwMCUpO1xufVxuXG5Ac3VwcG9ydHMgbm90IChjbGlwLXBhdGg6IHBvbHlnb24oMCAwLCAxMDAlIGNhbGMoMCUgKyA3dncpLCAxMDAlIGNhbGMoMTAwJSAtIDd2dyksIDAgMTAwJSkpIHtcbiAgLmFuZ2xlLS1ib3RoLXJpZ2h0LXJpZ2h0OjpiZWZvcmUsIC5hbmdsZS0tYm90aC1yaWdodC1yaWdodDo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgei1pbmRleDogMTA7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgfVxuICAuYW5nbGUtLWJvdGgtcmlnaHQtcmlnaHQ6OmJlZm9yZSB7XG4gICAgdG9wOiAwO1xuICAgIGJvcmRlci13aWR0aDogOHZ3IDAgMCAxMDB2dztcbiAgICBib3JkZXItY29sb3I6ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gIH1cbiAgLmFuZ2xlLS1ib3RoLXJpZ2h0LXJpZ2h0OjphZnRlciB7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci13aWR0aDogMCAwIDh2dyAxMDB2dztcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLmFuZ2xlLS1ib3RoLWxlZnQtcmlnaHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXAtcGF0aDogcG9seWdvbigwIGNhbGMoMCUgKyA3dncpLCAxMDAlIDAsIDEwMCUgY2FsYygxMDAlIC0gN3Z3KSwgMCAxMDAlKTtcbn1cblxuQHN1cHBvcnRzIG5vdCAoY2xpcC1wYXRoOiBwb2x5Z29uKDAgY2FsYygwJSArIDd2dyksIDEwMCUgMCwgMTAwJSBjYWxjKDEwMCUgLSA3dncpLCAwIDEwMCUpKSB7XG4gIC5hbmdsZS0tYm90aC1sZWZ0LXJpZ2h0OjpiZWZvcmUsIC5hbmdsZS0tYm90aC1sZWZ0LXJpZ2h0OjphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG4gIC5hbmdsZS0tYm90aC1sZWZ0LXJpZ2h0OjpiZWZvcmUge1xuICAgIHRvcDogMDtcbiAgICBib3JkZXItd2lkdGg6IDh2dyAxMDB2dyAwIDA7XG4gICAgYm9yZGVyLWNvbG9yOiAjZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICB9XG4gIC5hbmdsZS0tYm90aC1sZWZ0LXJpZ2h0OjphZnRlciB7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci13aWR0aDogMCAwIDh2dyAxMDB2dztcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLmFuZ2xlLS1ib3RoLXJpZ2h0LWxlZnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXAtcGF0aDogcG9seWdvbigwIDAsIDEwMCUgY2FsYygwJSArIDd2dyksIDEwMCUgMTAwJSwgMCBjYWxjKDEwMCUgLSA3dncpKTtcbn1cblxuQHN1cHBvcnRzIG5vdCAoY2xpcC1wYXRoOiBwb2x5Z29uKDAgMCwgMTAwJSBjYWxjKDAlICsgN3Z3KSwgMTAwJSAxMDAlLCAwIGNhbGMoMTAwJSAtIDd2dykpKSB7XG4gIC5hbmdsZS0tYm90aC1yaWdodC1sZWZ0OjpiZWZvcmUsIC5hbmdsZS0tYm90aC1yaWdodC1sZWZ0OjphZnRlciB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG4gIC5hbmdsZS0tYm90aC1yaWdodC1sZWZ0OjpiZWZvcmUge1xuICAgIHRvcDogMDtcbiAgICBib3JkZXItd2lkdGg6IDh2dyAwIDAgMTAwdnc7XG4gICAgYm9yZGVyLWNvbG9yOiAjZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICB9XG4gIC5hbmdsZS0tYm90aC1yaWdodC1sZWZ0OjphZnRlciB7XG4gICAgYm90dG9tOiAwO1xuICAgIGJvcmRlci13aWR0aDogMCAxMDB2dyA4dncgMDtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQ7XG4gIH1cbn1cblxuLmFuZ2xlX19jb250ZW50IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi5hbmdsZS0tY29sb3VyIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTk2RjM7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcGFkZGluZzogMTAlIDA7XG59XG4iXX0= */ 219 | -------------------------------------------------------------------------------- /assets/styles/angled-edges.scss: -------------------------------------------------------------------------------- 1 | 2 | // $angle: The angle in degrees: 1 - 45 3 | // $angle-position-y: The Y position of the angle: top | bottom | both 4 | // $angle-position-x: The X position of the angle: left | right 5 | // $angle-position-bottom-x: The X position of the bottom angle if using 'both' for $angle-position-y: left | right 6 | // $fallback: Create a fallback for older browsers: true | false 7 | // $fallback-color: Fallback colour for older browsers: Hex color 8 | 9 | @mixin angle-edge($angle, $angle-position-y, $angle-position-x, $angle-position-bottom-x: '', $fallback: true, $fallback-color: #fff) { 10 | 11 | position: relative; 12 | overflow: hidden; 13 | 14 | // Converts degrees to VW, 100vw = 45deg using this technique 15 | @if $angle > 45 { 16 | $angle: 0; 17 | @error 'Invalid angle, it must be between 1-45'; 18 | } 19 | @if $angle < 46 { 20 | $angle: convertDegToVW($angle); 21 | } 22 | 23 | @if $angle-position-bottom-x == '' { 24 | $angle-position-bottom-x: $angle-position-x; 25 | } 26 | 27 | $angle-calc-top: calc(0% + #{$angle}vw); 28 | $angle-calc-bottom: calc(100% - #{$angle}vw); 29 | 30 | $clip-path-top: 0 0, 100% 0; 31 | $clip-path-bottom: 100% 100%, 0 100%; 32 | 33 | $border-width-top: ''; 34 | $border-width-bottom: ''; 35 | $border-color-top: ''; 36 | $border-color-bottom: ''; 37 | 38 | 39 | @if $angle-position-y == 'top' or $angle-position-y == 'both' { 40 | 41 | @if $angle-position-x == 'left' { 42 | $clip-path-top: 0 $angle-calc-top, 100% 0; 43 | 44 | $border-width-top: #{$angle + 1}vw 100vw 0 0; 45 | } 46 | 47 | @if $angle-position-x == 'right' { 48 | $clip-path-top: 0 0, 100% $angle-calc-top; 49 | 50 | $border-width-top: #{$angle + 1}vw 0 0 100vw; 51 | } 52 | 53 | $border-color-top: $fallback-color transparent transparent transparent; 54 | } 55 | 56 | 57 | @if $angle-position-y == 'bottom' or $angle-position-y == 'both' { 58 | 59 | @if $angle-position-y == 'both' and $angle-position-x != $angle-position-bottom-x { 60 | $angle-position-x: $angle-position-bottom-x; 61 | } 62 | 63 | @if $angle-position-x == 'left' { 64 | $clip-path-bottom: 100% 100%, 0 $angle-calc-bottom; 65 | 66 | $border-width-bottom: 0 100vw #{$angle + 1}vw 0; 67 | } 68 | 69 | @if $angle-position-x == 'right' { 70 | $clip-path-bottom: 100% $angle-calc-bottom, 0 100%; 71 | 72 | $border-width-bottom: 0 0 #{$angle + 1}vw 100vw; 73 | } 74 | 75 | $border-color-bottom: transparent transparent $fallback-color transparent; 76 | } 77 | 78 | $clip-path: polygon($clip-path-top, $clip-path-bottom); 79 | clip-path: $clip-path; 80 | 81 | 82 | // Fallback for clip-path with solid colours 83 | @if $fallback { 84 | 85 | @supports not (clip-path: $clip-path) { 86 | 87 | &::before, &::after { 88 | content: ""; 89 | position: absolute; 90 | left: 0; 91 | z-index: 10; 92 | display: block; 93 | border-style: solid; 94 | } 95 | 96 | @if $angle-position-y == 'top' or $angle-position-y == 'both' { 97 | &::before { 98 | top: 0; 99 | border-width: $border-width-top; 100 | border-color: $border-color-top; 101 | } 102 | } 103 | 104 | @if $angle-position-y == 'bottom' or $angle-position-y == 'both' { 105 | &::after { 106 | bottom: 0; 107 | border-width: $border-width-bottom; 108 | border-color: $border-color-bottom; 109 | } 110 | } 111 | 112 | } 113 | 114 | } 115 | 116 | } 117 | 118 | // Converts degrees to VW, 100vw = 45deg using this technique 119 | @function convertDegToVW($angle){ 120 | @return round($angle*2.22); 121 | } 122 | 123 | 124 | // Classes 125 | .angle--top-left { 126 | @include angle-edge($angle: 3, $angle-position-y: 'top', $angle-position-x: 'left'); 127 | } 128 | 129 | .angle--top-right { 130 | @include angle-edge($angle: 3, $angle-position-y: 'top', $angle-position-x: 'right'); 131 | } 132 | 133 | .angle--bottom-left { 134 | @include angle-edge($angle: 3, $angle-position-y: 'bottom', $angle-position-x: 'left'); 135 | } 136 | 137 | .angle--bottom-right { 138 | @include angle-edge($angle: 3, $angle-position-y: 'bottom', $angle-position-x: 'right'); 139 | } 140 | 141 | .angle--both-left-left { 142 | @include angle-edge($angle: 3, $angle-position-y: 'both', $angle-position-x: 'left'); 143 | } 144 | 145 | .angle--both-right-right { 146 | @include angle-edge($angle: 3, $angle-position-y: 'both', $angle-position-x: 'right'); 147 | } 148 | 149 | .angle--both-left-right { 150 | @include angle-edge($angle: 3, $angle-position-y: 'both', $angle-position-x: 'left', $angle-position-bottom-x: 'right'); 151 | } 152 | 153 | .angle--both-right-left { 154 | @include angle-edge($angle: 3, $angle-position-y: 'both', $angle-position-x: 'right', $angle-position-bottom-x: 'left'); 155 | } 156 | 157 | 158 | .angle__content { 159 | display: block; 160 | width: 100%; 161 | height: auto; 162 | } 163 | 164 | .angle--colour { 165 | color: #fff; 166 | background-color: #2196F3; 167 | text-align: center; 168 | padding: 10% 0; 169 | } 170 | -------------------------------------------------------------------------------- /assets/styles/site.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ 2 | /** 3 | * 1. Change the default font family in all browsers (opinionated). 4 | * 2. Prevent adjustments of font size after orientation changes in IE and iOS. 5 | */ 6 | html { 7 | font-family: sans-serif; 8 | /* 1 */ 9 | -ms-text-size-adjust: 100%; 10 | /* 2 */ 11 | -webkit-text-size-adjust: 100%; 12 | /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove the margin in all browsers (opinionated). 17 | */ 18 | body { 19 | margin: 0; 20 | } 21 | 22 | /* HTML5 display definitions 23 | ========================================================================== */ 24 | /** 25 | * Add the correct display in IE 9-. 26 | * 1. Add the correct display in Edge, IE, and Firefox. 27 | * 2. Add the correct display in IE. 28 | */ 29 | article, 30 | aside, 31 | details, 32 | figcaption, 33 | figure, 34 | footer, 35 | header, 36 | main, 37 | menu, 38 | nav, 39 | section, 40 | summary { 41 | /* 1 */ 42 | display: block; 43 | } 44 | 45 | /** 46 | * Add the correct display in IE 9-. 47 | */ 48 | audio, 49 | canvas, 50 | progress, 51 | video { 52 | display: inline-block; 53 | } 54 | 55 | /** 56 | * Add the correct display in iOS 4-7. 57 | */ 58 | audio:not([controls]) { 59 | display: none; 60 | height: 0; 61 | } 62 | 63 | /** 64 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 65 | */ 66 | progress { 67 | vertical-align: baseline; 68 | } 69 | 70 | /** 71 | * Add the correct display in IE 10-. 72 | * 1. Add the correct display in IE. 73 | */ 74 | template, 75 | [hidden] { 76 | display: none; 77 | } 78 | 79 | /* Links 80 | ========================================================================== */ 81 | /** 82 | * 1. Remove the gray background on active links in IE 10. 83 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. 84 | */ 85 | a { 86 | background-color: transparent; 87 | /* 1 */ 88 | -webkit-text-decoration-skip: objects; 89 | /* 2 */ 90 | } 91 | 92 | /** 93 | * Remove the outline on focused links when they are also active or hovered 94 | * in all browsers (opinionated). 95 | */ 96 | a:active, 97 | a:hover { 98 | outline-width: 0; 99 | } 100 | 101 | /* Text-level semantics 102 | ========================================================================== */ 103 | /** 104 | * 1. Remove the bottom border in Firefox 39-. 105 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 106 | */ 107 | abbr[title] { 108 | border-bottom: none; 109 | /* 1 */ 110 | text-decoration: underline; 111 | /* 2 */ 112 | text-decoration: underline dotted; 113 | /* 2 */ 114 | } 115 | 116 | /** 117 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6. 118 | */ 119 | b, 120 | strong { 121 | font-weight: inherit; 122 | } 123 | 124 | /** 125 | * Add the correct font weight in Chrome, Edge, and Safari. 126 | */ 127 | b, 128 | strong { 129 | font-weight: bolder; 130 | } 131 | 132 | /** 133 | * Add the correct font style in Android 4.3-. 134 | */ 135 | dfn { 136 | font-style: italic; 137 | } 138 | 139 | /** 140 | * Correct the font size and margin on `h1` elements within `section` and 141 | * `article` contexts in Chrome, Firefox, and Safari. 142 | */ 143 | h1 { 144 | font-size: 2em; 145 | margin: 0.67em 0; 146 | } 147 | 148 | /** 149 | * Add the correct background and color in IE 9-. 150 | */ 151 | mark { 152 | background-color: #ff0; 153 | color: #000; 154 | } 155 | 156 | /** 157 | * Add the correct font size in all browsers. 158 | */ 159 | small { 160 | font-size: 80%; 161 | } 162 | 163 | /** 164 | * Prevent `sub` and `sup` elements from affecting the line height in 165 | * all browsers. 166 | */ 167 | sub, 168 | sup { 169 | font-size: 75%; 170 | line-height: 0; 171 | position: relative; 172 | vertical-align: baseline; 173 | } 174 | 175 | sub { 176 | bottom: -0.25em; 177 | } 178 | 179 | sup { 180 | top: -0.5em; 181 | } 182 | 183 | /* Embedded content 184 | ========================================================================== */ 185 | /** 186 | * Remove the border on images inside links in IE 10-. 187 | */ 188 | img { 189 | border-style: none; 190 | } 191 | 192 | /** 193 | * Hide the overflow in IE. 194 | */ 195 | svg:not(:root) { 196 | overflow: hidden; 197 | } 198 | 199 | /* Grouping content 200 | ========================================================================== */ 201 | /** 202 | * 1. Correct the inheritance and scaling of font size in all browsers. 203 | * 2. Correct the odd `em` font sizing in all browsers. 204 | */ 205 | code, 206 | kbd, 207 | pre, 208 | samp { 209 | font-family: monospace, monospace; 210 | /* 1 */ 211 | font-size: 1em; 212 | /* 2 */ 213 | } 214 | 215 | /** 216 | * Add the correct margin in IE 8. 217 | */ 218 | figure { 219 | margin: 1em 40px; 220 | } 221 | 222 | /** 223 | * 1. Add the correct box sizing in Firefox. 224 | * 2. Show the overflow in Edge and IE. 225 | */ 226 | hr { 227 | box-sizing: content-box; 228 | /* 1 */ 229 | height: 0; 230 | /* 1 */ 231 | overflow: visible; 232 | /* 2 */ 233 | } 234 | 235 | /* Forms 236 | ========================================================================== */ 237 | /** 238 | * 1. Change font properties to `inherit` in all browsers (opinionated). 239 | * 2. Remove the margin in Firefox and Safari. 240 | */ 241 | button, 242 | input, 243 | select, 244 | textarea { 245 | font: inherit; 246 | /* 1 */ 247 | margin: 0; 248 | /* 2 */ 249 | } 250 | 251 | /** 252 | * Restore the font weight unset by the previous rule. 253 | */ 254 | optgroup { 255 | font-weight: bold; 256 | } 257 | 258 | /** 259 | * Show the overflow in IE. 260 | * 1. Show the overflow in Edge. 261 | */ 262 | button, 263 | input { 264 | /* 1 */ 265 | overflow: visible; 266 | } 267 | 268 | /** 269 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 270 | * 1. Remove the inheritance of text transform in Firefox. 271 | */ 272 | button, 273 | select { 274 | /* 1 */ 275 | text-transform: none; 276 | } 277 | 278 | /** 279 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` 280 | * controls in Android 4. 281 | * 2. Correct the inability to style clickable types in iOS and Safari. 282 | */ 283 | button, 284 | html [type="button"], 285 | [type="reset"], 286 | [type="submit"] { 287 | -webkit-appearance: button; 288 | /* 2 */ 289 | } 290 | 291 | /** 292 | * Remove the inner border and padding in Firefox. 293 | */ 294 | button::-moz-focus-inner, 295 | [type="button"]::-moz-focus-inner, 296 | [type="reset"]::-moz-focus-inner, 297 | [type="submit"]::-moz-focus-inner { 298 | border-style: none; 299 | padding: 0; 300 | } 301 | 302 | /** 303 | * Restore the focus styles unset by the previous rule. 304 | */ 305 | button:-moz-focusring, 306 | [type="button"]:-moz-focusring, 307 | [type="reset"]:-moz-focusring, 308 | [type="submit"]:-moz-focusring { 309 | outline: 1px dotted ButtonText; 310 | } 311 | 312 | /** 313 | * Change the border, margin, and padding in all browsers (opinionated). 314 | */ 315 | fieldset { 316 | border: 1px solid #c0c0c0; 317 | margin: 0 2px; 318 | padding: 0.35em 0.625em 0.75em; 319 | } 320 | 321 | /** 322 | * 1. Correct the text wrapping in Edge and IE. 323 | * 2. Correct the color inheritance from `fieldset` elements in IE. 324 | * 3. Remove the padding so developers are not caught out when they zero out 325 | * `fieldset` elements in all browsers. 326 | */ 327 | legend { 328 | box-sizing: border-box; 329 | /* 1 */ 330 | color: inherit; 331 | /* 2 */ 332 | display: table; 333 | /* 1 */ 334 | max-width: 100%; 335 | /* 1 */ 336 | padding: 0; 337 | /* 3 */ 338 | white-space: normal; 339 | /* 1 */ 340 | } 341 | 342 | /** 343 | * Remove the default vertical scrollbar in IE. 344 | */ 345 | textarea { 346 | overflow: auto; 347 | } 348 | 349 | /** 350 | * 1. Add the correct box sizing in IE 10-. 351 | * 2. Remove the padding in IE 10-. 352 | */ 353 | [type="checkbox"], 354 | [type="radio"] { 355 | box-sizing: border-box; 356 | /* 1 */ 357 | padding: 0; 358 | /* 2 */ 359 | } 360 | 361 | /** 362 | * Correct the cursor style of increment and decrement buttons in Chrome. 363 | */ 364 | [type="number"]::-webkit-inner-spin-button, 365 | [type="number"]::-webkit-outer-spin-button { 366 | height: auto; 367 | } 368 | 369 | /** 370 | * 1. Correct the odd appearance in Chrome and Safari. 371 | * 2. Correct the outline style in Safari. 372 | */ 373 | [type="search"] { 374 | -webkit-appearance: textfield; 375 | /* 1 */ 376 | outline-offset: -2px; 377 | /* 2 */ 378 | } 379 | 380 | /** 381 | * Remove the inner padding and cancel buttons in Chrome and Safari on OS X. 382 | */ 383 | [type="search"]::-webkit-search-cancel-button, 384 | [type="search"]::-webkit-search-decoration { 385 | -webkit-appearance: none; 386 | } 387 | 388 | /** 389 | * Correct the text style of placeholders in Chrome, Edge, and Safari. 390 | */ 391 | ::-webkit-input-placeholder { 392 | color: inherit; 393 | opacity: 0.54; 394 | } 395 | 396 | /** 397 | * 1. Correct the inability to style clickable types in iOS and Safari. 398 | * 2. Change font properties to `inherit` in Safari. 399 | */ 400 | ::-webkit-file-upload-button { 401 | -webkit-appearance: button; 402 | /* 1 */ 403 | font: inherit; 404 | /* 2 */ 405 | } 406 | 407 | *, 408 | *:before, 409 | *:after { 410 | box-sizing: border-box; 411 | } 412 | 413 | html { 414 | font-size: 10px; 415 | } 416 | 417 | body { 418 | padding-top: 90px; 419 | font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; 420 | font-size: 18px; 421 | font-weight: 300; 422 | line-height: 1.4; 423 | color: #333; 424 | background-color: #fff; 425 | } 426 | 427 | a { 428 | color: #1976D2; 429 | text-decoration: none; 430 | transition: color 0.3s; 431 | } 432 | 433 | a:hover, a:focus { 434 | color: #2196F3; 435 | } 436 | 437 | h1, h2, h3, h4, h5, h6 { 438 | font-weight: 300; 439 | } 440 | 441 | h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { 442 | font-size: 60%; 443 | } 444 | 445 | h1, h2, h3 { 446 | margin: 20px 0; 447 | } 448 | 449 | h4, h5, h6 { 450 | margin: 10px 0; 451 | } 452 | 453 | h1 { 454 | font-size: 38px; 455 | } 456 | 457 | h2 { 458 | font-size: 34px; 459 | } 460 | 461 | h3 { 462 | font-size: 26px; 463 | } 464 | 465 | h4 { 466 | font-size: 20px; 467 | } 468 | 469 | h5 { 470 | font-size: 16px; 471 | } 472 | 473 | h6 { 474 | font-size: 14px; 475 | } 476 | 477 | p { 478 | margin: 0 0 15px 0; 479 | } 480 | 481 | strong { 482 | font-weight: 400; 483 | } 484 | 485 | .container { 486 | max-width: 1170px; 487 | margin-right: auto; 488 | margin-left: auto; 489 | padding-left: 15px; 490 | padding-right: 15px; 491 | } 492 | 493 | .container:before, .container:after { 494 | content: " "; 495 | display: table; 496 | } 497 | 498 | .container:after { 499 | clear: both; 500 | } 501 | 502 | .header { 503 | position: fixed; 504 | top: 0; 505 | z-index: 100; 506 | width: 100%; 507 | padding: 15px 0; 508 | color: #fff; 509 | background-color: #1976D2; 510 | box-shadow: 0 0 6px 6px rgba(0, 0, 0, 0.1); 511 | } 512 | 513 | .logo-text { 514 | margin: 0; 515 | } 516 | 517 | @media (max-width: 767px) { 518 | .logo-text { 519 | font-size: 25px; 520 | } 521 | } 522 | 523 | @media (min-width: 768px) { 524 | .logo-text { 525 | display: inline-block; 526 | } 527 | } 528 | 529 | .header--links .btn { 530 | margin: 0; 531 | margin-top: 7px; 532 | } 533 | 534 | .header--links .btn:last-child { 535 | margin-left: 7px; 536 | } 537 | 538 | @media (min-width: 768px) { 539 | .header--links { 540 | float: right; 541 | } 542 | } 543 | 544 | .footer { 545 | padding-top: 15px; 546 | padding-bottom: 15px; 547 | font-size: 12px; 548 | text-align: center; 549 | } 550 | 551 | .demo { 552 | margin-top: 20px; 553 | margin-bottom: 40px; 554 | } 555 | 556 | .demo--intro { 557 | border-bottom: 1px solid #ddd; 558 | } 559 | 560 | .btn { 561 | display: inline-block; 562 | text-align: center; 563 | vertical-align: middle; 564 | cursor: pointer; 565 | border: 1px solid #bbb; 566 | padding: 4px 12px 6px 12px; 567 | font-size: 18px; 568 | background-color: #fff; 569 | border-radius: 4px; 570 | transition: background-color .3s, color .3s; 571 | } 572 | 573 | .btn:hover, .btn:active { 574 | background-color: #f3f3f3; 575 | } 576 | 577 | .btn-white { 578 | color: #fff; 579 | border-color: #fff; 580 | background-color: transparent; 581 | } 582 | 583 | .install .btn { 584 | margin-right: 15px; 585 | margin-bottom: 15px; 586 | } 587 | 588 | pre { 589 | display: block; 590 | padding: 10px 15px; 591 | margin: 0 0 20px 0; 592 | overflow: auto; 593 | font-family: 'Cutive Mono', monospace; 594 | font-size: 14px; 595 | word-break: break-all; 596 | word-wrap: break-word; 597 | background-color: #f3f3f3; 598 | border: 1px solid #bbb; 599 | border-radius: 4px; 600 | } 601 | 602 | /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNpdGUvX25vcm1hbGl6ZS5zY3NzIiwic2l0ZS5jc3MiLCJzaXRlL19zaXRlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEVBQTRFO0FBRTVFOzs7R0FHRztBQUVIO0VBQ0Usd0JBQXdCO0VBQUUsT0FBTztFQUNqQywyQkFBMkI7RUFBRSxPQUFPO0VBQ3BDLCtCQUErQjtFQUFFLE9BQU87Q0FDekM7O0FBRUQ7O0dBRUc7QUFFSDtFQUNFLFVBQVU7Q0FDWDs7QUFFRDtnRkFDZ0Y7QUFFaEY7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7RUFXVSxPQUFPO0VBQ2YsZUFBZTtDQUNoQjs7QUFFRDs7R0FFRztBQUVIOzs7O0VBSUUsc0JBQXNCO0NBQ3ZCOztBQUVEOztHQUVHO0FBRUg7RUFDRSxjQUFjO0VBQ2QsVUFBVTtDQUNYOztBQUVEOztHQUVHO0FBRUg7RUFDRSx5QkFBeUI7Q0FDMUI7O0FBRUQ7OztHQUdHO0FBRUg7O0VBRUUsY0FBYztDQUNmOztBQUVEO2dGQUNnRjtBQUVoRjs7O0dBR0c7QUFFSDtFQUNFLDhCQUE4QjtFQUFFLE9BQU87RUFDdkMsc0NBQXNDO0VBQUUsT0FBTztDQUNoRDs7QUFFRDs7O0dBR0c7QUFFSDs7RUFFRSxpQkFBaUI7Q0FDbEI7O0FBRUQ7Z0ZBQ2dGO0FBRWhGOzs7R0FHRztBQUVIO0VBQ0Usb0JBQW9CO0VBQUUsT0FBTztFQUM3QiwyQkFBMkI7RUFBRSxPQUFPO0VBQ3BDLGtDQUFrQztFQUFFLE9BQU87Q0FDNUM7O0FBRUQ7O0dBRUc7QUFFSDs7RUFFRSxxQkFBcUI7Q0FDdEI7O0FBRUQ7O0dBRUc7QUFFSDs7RUFFRSxvQkFBb0I7Q0FDckI7O0FBRUQ7O0dBRUc7QUFFSDtFQUNFLG1CQUFtQjtDQUNwQjs7QUFFRDs7O0dBR0c7QUFFSDtFQUNFLGVBQWU7RUFDZixpQkFBaUI7Q0FDbEI7O0FBRUQ7O0dBRUc7QUFFSDtFQUNFLHVCQUF1QjtFQUN2QixZQUFZO0NBQ2I7O0FBRUQ7O0dBRUc7QUFFSDtFQUNFLGVBQWU7Q0FDaEI7O0FBRUQ7OztHQUdHO0FBRUg7O0VBRUUsZUFBZTtFQUNmLGVBQWU7RUFDZixtQkFBbUI7RUFDbkIseUJBQXlCO0NBQzFCOztBQUVEO0VBQ0UsZ0JBQWdCO0NBQ2pCOztBQUVEO0VBQ0UsWUFBWTtDQUNiOztBQUVEO2dGQUNnRjtBQUVoRjs7R0FFRztBQUVIO0VBQ0UsbUJBQW1CO0NBQ3BCOztBQUVEOztHQUVHO0FBRUg7RUFDRSxpQkFBaUI7Q0FDbEI7O0FBRUQ7Z0ZBQ2dGO0FBRWhGOzs7R0FHRztBQUVIOzs7O0VBSUUsa0NBQWtDO0VBQUUsT0FBTztFQUMzQyxlQUFlO0VBQUUsT0FBTztDQUN6Qjs7QUFFRDs7R0FFRztBQUVIO0VBQ0UsaUJBQWlCO0NBQ2xCOztBQUVEOzs7R0FHRztBQUVIO0VBQ0Usd0JBQXdCO0VBQUUsT0FBTztFQUNqQyxVQUFVO0VBQUUsT0FBTztFQUNuQixrQkFBa0I7RUFBRSxPQUFPO0NBQzVCOztBQUVEO2dGQUNnRjtBQUVoRjs7O0dBR0c7QUFFSDs7OztFQUlFLGNBQWM7RUFBRSxPQUFPO0VBQ3ZCLFVBQVU7RUFBRSxPQUFPO0NBQ3BCOztBQUVEOztHQUVHO0FBRUg7RUFDRSxrQkFBa0I7Q0FDbkI7O0FBRUQ7OztHQUdHO0FBRUg7O0VBQ1EsT0FBTztFQUNiLGtCQUFrQjtDQUNuQjs7QUFFRDs7O0dBR0c7QUFFSDs7RUFDUyxPQUFPO0VBQ2QscUJBQXFCO0NBQ3RCOztBQUVEOzs7O0dBSUc7QUFFSDs7OztFQUlFLDJCQUEyQjtFQUFFLE9BQU87Q0FDckM7O0FBRUQ7O0dBRUc7QUFFSDs7OztFQUlFLG1CQUFtQjtFQUNuQixXQUFXO0NBQ1o7O0FBRUQ7O0dBRUc7QUFFSDs7OztFQUlFLCtCQUErQjtDQUNoQzs7QUFFRDs7R0FFRztBQUVIO0VBQ0UsMEJBQTBCO0VBQzFCLGNBQWM7RUFDZCwrQkFBK0I7Q0FDaEM7O0FBRUQ7Ozs7O0dBS0c7QUFFSDtFQUNFLHVCQUF1QjtFQUFFLE9BQU87RUFDaEMsZUFBZTtFQUFFLE9BQU87RUFDeEIsZUFBZTtFQUFFLE9BQU87RUFDeEIsZ0JBQWdCO0VBQUUsT0FBTztFQUN6QixXQUFXO0VBQUUsT0FBTztFQUNwQixvQkFBb0I7RUFBRSxPQUFPO0NBQzlCOztBQUVEOztHQUVHO0FBRUg7RUFDRSxlQUFlO0NBQ2hCOztBQUVEOzs7R0FHRztBQ2JIOztFRGlCRSx1QkFBdUI7RUFBRSxPQUFPO0VBQ2hDLFdBQVc7RUFBRSxPQUFPO0NBQ3JCOztBQUVEOztHQUVHO0FDWkg7O0VEZ0JFLGFBQWE7Q0FDZDs7QUFFRDs7O0dBR0c7QUNiSDtFRGdCRSw4QkFBOEI7RUFBRSxPQUFPO0VBQ3ZDLHFCQUFxQjtFQUFFLE9BQU87Q0FDL0I7O0FBRUQ7O0dBRUc7QUNaSDs7RURnQkUseUJBQXlCO0NBQzFCOztBQUVEOztHQUVHO0FBRUg7RUFDRSxlQUFlO0VBQ2YsY0FBYztDQUNmOztBQUVEOzs7R0FHRztBQUVIO0VBQ0UsMkJBQTJCO0VBQUUsT0FBTztFQUNwQyxjQUFjO0VBQUUsT0FBTztDQUN4Qjs7QUVuWkQ7OztFQUdFLHVCQUF1QjtDQUN4Qjs7QUFFRDtFQUNFLGdCQUFnQjtDQUNqQjs7QUFFRDtFQUNFLGtCQUFrQjtFQUNsQixvRUFBb0U7RUFDcEUsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQixpQkFBaUI7RUFDakIsWUFBWTtFQUNaLHVCQUF1QjtDQUN4Qjs7QUFFRDtFQUNFLGVBQWU7RUFDZixzQkFBc0I7RUFDdEIsdUJBQXVCO0NBS3hCOztBQVJEO0VBTUksZUFBZTtDQUNoQjs7QUFJSDtFQUNFLGlCQUFpQjtDQUtsQjs7QUFORDtFQUlJLGVBQWU7Q0FDaEI7O0FBRUg7RUFDRSxlQUFlO0NBQ2hCOztBQUNEO0VBQ0UsZUFBZTtDQUNoQjs7QUFFRDtFQUFLLGdCQUFnQjtDQUFJOztBQUN6QjtFQUFLLGdCQUFnQjtDQUFJOztBQUN6QjtFQUFLLGdCQUFnQjtDQUFJOztBQUN6QjtFQUFLLGdCQUFnQjtDQUFJOztBQUN6QjtFQUFLLGdCQUFnQjtDQUFJOztBQUN6QjtFQUFLLGdCQUFnQjtDQUFJOztBQUV6QjtFQUNFLG1CQUFtQjtDQUNwQjs7QUFFRDtFQUNFLGlCQUFpQjtDQUNsQjs7QUFLRDtFQUNFLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixvQkFBb0I7Q0FFckI7O0FBUEQ7RUExRUksYUFBYTtFQUNiLGVBQWU7Q0FDaEI7O0FBd0VIO0VBdEVJLFlBQVk7Q0FDYjs7QUFnRkg7RUFDRSxnQkFBZ0I7RUFDaEIsT0FBTztFQUNQLGFBQWE7RUFDYixZQUFZO0VBQ1osZ0JBQWdCO0VBQ2hCLFlBQVk7RUFDWiwwQkFBMEI7RUFDMUIsMkNBQTRCO0NBQzdCOztBQUVDO0VBQ0UsVUFBVTtDQVFYOztBQU5DO0VBSEY7SUFJSSxnQkFBZ0I7R0FLbkI7Q0QyWkY7O0FDOVpHO0VBTkY7SUFPSSxzQkFBc0I7R0FFekI7Q0RpYUY7O0FDL1pDO0VBR0ksVUFBVTtFQUNWLGdCQUFnQjtDQUtqQjs7QUFUSDtFQU9NLGlCQUFpQjtDQUNsQjs7QUFHSDtFQVhGO0lBWUksYUFBYTtHQUVoQjtDRGdhRjs7QUM5WkQ7RUFDRSxrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLGdCQUFnQjtFQUNoQixtQkFBbUI7Q0FDcEI7O0FBSUQ7RUFDRSxpQkFBaUI7RUFDakIsb0JBQW9CO0NBQ3JCOztBQUVEO0VBQ0UsOEJBQThCO0NBQy9COztBQUVEO0VBQ0Usc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQix1QkFBdUI7RUFDdkIsZ0JBQWdCO0VBQ2hCLHVCQUF1QjtFQUN2QiwyQkFBMkI7RUFDM0IsZ0JBQWdCO0VBQ2hCLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsNENBQTRDO0NBSzdDOztBQWZEO0VBYUksMEJBQTBCO0NBQzNCOztBQUdIO0VBQ0UsWUFBWTtFQUNaLG1CQUFtQjtFQUNuQiw4QkFBOEI7Q0FDL0I7O0FBRUQ7RUFDRSxtQkFBbUI7RUFDbkIsb0JBQW9CO0NBQ3JCOztBQUVEO0VBQ0UsZUFBZTtFQUNmLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLHNDQUFzQztFQUN0QyxnQkFBZ0I7RUFDaEIsc0JBQXNCO0VBQ3RCLHNCQUFzQjtFQUN0QiwwQkFBMEI7RUFDMUIsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtDQUNwQiIsImZpbGUiOiJzaXRlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBub3JtYWxpemUuY3NzIHY0LjEuMSB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cblxuLyoqXG4gKiAxLiBDaGFuZ2UgdGhlIGRlZmF1bHQgZm9udCBmYW1pbHkgaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKiAyLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIElFIGFuZCBpT1MuXG4gKi9cblxuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyAvKiAxICovXG4gIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLyogMiAqL1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICovXG5cbmJvZHkge1xuICBtYXJnaW46IDA7XG59XG5cbi8qIEhUTUw1IGRpc3BsYXkgZGVmaW5pdGlvbnNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgOS0uXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSwgYW5kIEZpcmVmb3guXG4gKiAyLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRS5cbiAqL1xuXG5hcnRpY2xlLFxuYXNpZGUsXG5kZXRhaWxzLCAvKiAxICovXG5maWdjYXB0aW9uLFxuZmlndXJlLFxuZm9vdGVyLFxuaGVhZGVyLFxubWFpbiwgLyogMiAqL1xubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHsgLyogMSAqL1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSA5LS5cbiAqL1xuXG5hdWRpbyxcbmNhbnZhcyxcbnByb2dyZXNzLFxudmlkZW8ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gaU9TIDQtNy5cbiAqL1xuXG5hdWRpbzpub3QoW2NvbnRyb2xzXSkge1xuICBkaXNwbGF5OiBub25lO1xuICBoZWlnaHQ6IDA7XG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbiAqL1xuXG5wcm9ncmVzcyB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMC0uXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRS5cbiAqL1xuXG50ZW1wbGF0ZSwgLyogMSAqL1xuW2hpZGRlbl0ge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiBMaW5rc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBvbiBhY3RpdmUgbGlua3MgaW4gSUUgMTAuXG4gKiAyLiBSZW1vdmUgZ2FwcyBpbiBsaW5rcyB1bmRlcmxpbmUgaW4gaU9TIDgrIGFuZCBTYWZhcmkgOCsuXG4gKi9cblxuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiAxICovXG4gIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6IG9iamVjdHM7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG91dGxpbmUgb24gZm9jdXNlZCBsaW5rcyB3aGVuIHRoZXkgYXJlIGFsc28gYWN0aXZlIG9yIGhvdmVyZWRcbiAqIGluIGFsbCBicm93c2VycyAob3BpbmlvbmF0ZWQpLlxuICovXG5cbmE6YWN0aXZlLFxuYTpob3ZlciB7XG4gIG91dGxpbmUtd2lkdGg6IDA7XG59XG5cbi8qIFRleHQtbGV2ZWwgc2VtYW50aWNzXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIDEuIFJlbW92ZSB0aGUgYm90dG9tIGJvcmRlciBpbiBGaXJlZm94IDM5LS5cbiAqIDIuIEFkZCB0aGUgY29ycmVjdCB0ZXh0IGRlY29yYXRpb24gaW4gQ2hyb21lLCBFZGdlLCBJRSwgT3BlcmEsIGFuZCBTYWZhcmkuXG4gKi9cblxuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lOyAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKiAyICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDsgLyogMiAqL1xufVxuXG4vKipcbiAqIFByZXZlbnQgdGhlIGR1cGxpY2F0ZSBhcHBsaWNhdGlvbiBvZiBgYm9sZGVyYCBieSB0aGUgbmV4dCBydWxlIGluIFNhZmFyaSA2LlxuICovXG5cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogaW5oZXJpdDtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZGVyO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBmb250IHN0eWxlIGluIEFuZHJvaWQgNC4zLS5cbiAqL1xuXG5kZm4ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi8qKlxuICogQ29ycmVjdCB0aGUgZm9udCBzaXplIGFuZCBtYXJnaW4gb24gYGgxYCBlbGVtZW50cyB3aXRoaW4gYHNlY3Rpb25gIGFuZFxuICogYGFydGljbGVgIGNvbnRleHRzIGluIENocm9tZSwgRmlyZWZveCwgYW5kIFNhZmFyaS5cbiAqL1xuXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBiYWNrZ3JvdW5kIGFuZCBjb2xvciBpbiBJRSA5LS5cbiAqL1xuXG5tYXJrIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmMDtcbiAgY29sb3I6ICMwMDA7XG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLyoqXG4gKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW5cbiAqIGFsbCBicm93c2Vycy5cbiAqL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAtLlxuICovXG5cbmltZyB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbn1cblxuLyoqXG4gKiBIaWRlIHRoZSBvdmVyZmxvdyBpbiBJRS5cbiAqL1xuXG5zdmc6bm90KDpyb290KSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTsgLyogMiAqL1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBtYXJnaW4gaW4gSUUgOC5cbiAqL1xuXG5maWd1cmUge1xuICBtYXJnaW46IDFlbSA0MHB4O1xufVxuXG4vKipcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIEZpcmVmb3guXG4gKiAyLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlIGFuZCBJRS5cbiAqL1xuXG5ociB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiAxICovXG4gIGhlaWdodDogMDsgLyogMSAqL1xuICBvdmVyZmxvdzogdmlzaWJsZTsgLyogMiAqL1xufVxuXG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiAxLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIGBpbmhlcml0YCBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cbiAqL1xuXG5idXR0b24sXG5pbnB1dCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udDogaW5oZXJpdDsgLyogMSAqL1xuICBtYXJnaW46IDA7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZXN0b3JlIHRoZSBmb250IHdlaWdodCB1bnNldCBieSB0aGUgcHJldmlvdXMgcnVsZS5cbiAqL1xuXG5vcHRncm91cCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vKipcbiAqIFNob3cgdGhlIG92ZXJmbG93IGluIElFLlxuICogMS4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZS5cbiAqL1xuXG5idXR0b24sXG5pbnB1dCB7IC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBFZGdlLCBGaXJlZm94LCBhbmQgSUUuXG4gKiAxLiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEZpcmVmb3guXG4gKi9cblxuYnV0dG9uLFxuc2VsZWN0IHsgLyogMSAqL1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbn1cblxuLyoqXG4gKiAxLiBQcmV2ZW50IGEgV2ViS2l0IGJ1ZyB3aGVyZSAoMikgZGVzdHJveXMgbmF0aXZlIGBhdWRpb2AgYW5kIGB2aWRlb2BcbiAqICAgIGNvbnRyb2xzIGluIEFuZHJvaWQgNC5cbiAqIDIuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKi9cblxuYnV0dG9uLFxuaHRtbCBbdHlwZT1cImJ1dHRvblwiXSwgLyogMSAqL1xuW3R5cGU9XCJyZXNldFwiXSxcblt0eXBlPVwic3VibWl0XCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwiYnV0dG9uXCJdOjotbW96LWZvY3VzLWlubmVyLFxuW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgdGhlIGZvY3VzIHN0eWxlcyB1bnNldCBieSB0aGUgcHJldmlvdXMgcnVsZS5cbiAqL1xuXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZyBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuXG5maWVsZHNldCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIG1hcmdpbjogMCAycHg7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjYyNWVtIDAuNzVlbTtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSB0ZXh0IHdyYXBwaW5nIGluIEVkZ2UgYW5kIElFLlxuICogMi4gQ29ycmVjdCB0aGUgY29sb3IgaW5oZXJpdGFuY2UgZnJvbSBgZmllbGRzZXRgIGVsZW1lbnRzIGluIElFLlxuICogMy4gUmVtb3ZlIHRoZSBwYWRkaW5nIHNvIGRldmVsb3BlcnMgYXJlIG5vdCBjYXVnaHQgb3V0IHdoZW4gdGhleSB6ZXJvIG91dFxuICogICAgYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cblxubGVnZW5kIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDsgLyogMiAqL1xuICBkaXNwbGF5OiB0YWJsZTsgLyogMSAqL1xuICBtYXgtd2lkdGg6IDEwMCU7IC8qIDEgKi9cbiAgcGFkZGluZzogMDsgLyogMyAqL1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsOyAvKiAxICovXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRS5cbiAqL1xuXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vKipcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIElFIDEwLS5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC0uXG4gKi9cblxuW3R5cGU9XCJjaGVja2JveFwiXSxcblt0eXBlPVwicmFkaW9cIl0ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiAxICovXG4gIHBhZGRpbmc6IDA7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXG4gKi9cblxuW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbiAqIDIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuICovXG5cblt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIHBhZGRpbmcgYW5kIGNhbmNlbCBidXR0b25zIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4gKi9cblxuW3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sXG5bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSB0ZXh0IHN0eWxlIG9mIHBsYWNlaG9sZGVycyBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKi9cblxuOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIG9wYWNpdHk6IDAuNTQ7XG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuXG46Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cbiAgZm9udDogaW5oZXJpdDsgLyogMiAqL1xufVxuIiwiLyohIG5vcm1hbGl6ZS5jc3MgdjQuMS4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuLyoqXG4gKiAxLiBDaGFuZ2UgdGhlIGRlZmF1bHQgZm9udCBmYW1pbHkgaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKiAyLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIElFIGFuZCBpT1MuXG4gKi9cbmh0bWwge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcbiAgLyogMSAqL1xuICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLyogMiAqL1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cblxuLyogSFRNTDUgZGlzcGxheSBkZWZpbml0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgOS0uXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSwgYW5kIEZpcmVmb3guXG4gKiAyLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRS5cbiAqL1xuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5tYWluLFxubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHtcbiAgLyogMSAqL1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSA5LS5cbiAqL1xuYXVkaW8sXG5jYW52YXMsXG5wcm9ncmVzcyxcbnZpZGVvIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIGlPUyA0LTcuXG4gKi9cbmF1ZGlvOm5vdChbY29udHJvbHNdKSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGhlaWdodDogMDtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgdmVydGljYWwgYWxpZ25tZW50IGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLlxuICovXG5wcm9ncmVzcyB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMC0uXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRS5cbiAqL1xudGVtcGxhdGUsXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIExpbmtzXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBvbiBhY3RpdmUgbGlua3MgaW4gSUUgMTAuXG4gKiAyLiBSZW1vdmUgZ2FwcyBpbiBsaW5rcyB1bmRlcmxpbmUgaW4gaU9TIDgrIGFuZCBTYWZhcmkgOCsuXG4gKi9cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLyogMSAqL1xuICAtd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOiBvYmplY3RzO1xuICAvKiAyICovXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBvdXRsaW5lIG9uIGZvY3VzZWQgbGlua3Mgd2hlbiB0aGV5IGFyZSBhbHNvIGFjdGl2ZSBvciBob3ZlcmVkXG4gKiBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZS13aWR0aDogMDtcbn1cblxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIDEuIFJlbW92ZSB0aGUgYm90dG9tIGJvcmRlciBpbiBGaXJlZm94IDM5LS5cbiAqIDIuIEFkZCB0aGUgY29ycmVjdCB0ZXh0IGRlY29yYXRpb24gaW4gQ2hyb21lLCBFZGdlLCBJRSwgT3BlcmEsIGFuZCBTYWZhcmkuXG4gKi9cbmFiYnJbdGl0bGVdIHtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgLyogMSAqL1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgLyogMiAqL1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XG4gIC8qIDIgKi9cbn1cblxuLyoqXG4gKiBQcmV2ZW50IHRoZSBkdXBsaWNhdGUgYXBwbGljYXRpb24gb2YgYGJvbGRlcmAgYnkgdGhlIG5leHQgcnVsZSBpbiBTYWZhcmkgNi5cbiAqL1xuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBpbmhlcml0O1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBmb250IHdlaWdodCBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKi9cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZGVyO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBmb250IHN0eWxlIGluIEFuZHJvaWQgNC4zLS5cbiAqL1xuZGZuIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGZvbnQgc2l6ZSBhbmQgbWFyZ2luIG9uIGBoMWAgZWxlbWVudHMgd2l0aGluIGBzZWN0aW9uYCBhbmRcbiAqIGBhcnRpY2xlYCBjb250ZXh0cyBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBTYWZhcmkuXG4gKi9cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGJhY2tncm91bmQgYW5kIGNvbG9yIGluIElFIDktLlxuICovXG5tYXJrIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmMDtcbiAgY29sb3I6ICMwMDA7XG59XG5cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbi8qKlxuICogUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgZWxlbWVudHMgZnJvbSBhZmZlY3RpbmcgdGhlIGxpbmUgaGVpZ2h0IGluXG4gKiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbnN1YiB7XG4gIGJvdHRvbTogLTAuMjVlbTtcbn1cblxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG5cbi8qIEVtYmVkZGVkIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAtLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG5cbi8qKlxuICogSGlkZSB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKi9cbnN2Zzpub3QoOnJvb3QpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLyogR3JvdXBpbmcgY29udGVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnByZSxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cblxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgbWFyZ2luIGluIElFIDguXG4gKi9cbmZpZ3VyZSB7XG4gIG1hcmdpbjogMWVtIDQwcHg7XG59XG5cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5ociB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAvKiAxICovXG4gIGhlaWdodDogMDtcbiAgLyogMSAqL1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgLyogMiAqL1xufVxuXG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIGZvbnQgcHJvcGVydGllcyB0byBgaW5oZXJpdGAgaW4gYWxsIGJyb3dzZXJzIChvcGluaW9uYXRlZCkuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxuc2VsZWN0LFxudGV4dGFyZWEge1xuICBmb250OiBpbmhlcml0O1xuICAvKiAxICovXG4gIG1hcmdpbjogMDtcbiAgLyogMiAqL1xufVxuXG4vKipcbiAqIFJlc3RvcmUgdGhlIGZvbnQgd2VpZ2h0IHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5vcHRncm91cCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vKipcbiAqIFNob3cgdGhlIG92ZXJmbG93IGluIElFLlxuICogMS4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZS5cbiAqL1xuYnV0dG9uLFxuaW5wdXQge1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKipcbiAqIDEuIFByZXZlbnQgYSBXZWJLaXQgYnVnIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYCBhbmQgYHZpZGVvYFxuICogICAgY29udHJvbHMgaW4gQW5kcm9pZCA0LlxuICogMi4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqL1xuYnV0dG9uLFxuaHRtbCBbdHlwZT1cImJ1dHRvblwiXSxcblt0eXBlPVwicmVzZXRcIl0sXG5bdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAyICovXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBpbm5lciBib3JkZXIgYW5kIHBhZGRpbmcgaW4gRmlyZWZveC5cbiAqL1xuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxuW3R5cGU9XCJidXR0b25cIl06Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cInJlc2V0XCJdOjotbW96LWZvY3VzLWlubmVyLFxuW3R5cGU9XCJzdWJtaXRcIl06Oi1tb3otZm9jdXMtaW5uZXIge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZyBpbiBhbGwgYnJvd3NlcnMgKG9waW5pb25hdGVkKS5cbiAqL1xuZmllbGRzZXQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICBtYXJnaW46IDAgMnB4O1xuICBwYWRkaW5nOiAwLjM1ZW0gMC42MjVlbSAwLjc1ZW07XG59XG5cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0O1xuICAvKiAyICovXG4gIGRpc3BsYXk6IHRhYmxlO1xuICAvKiAxICovXG4gIG1heC13aWR0aDogMTAwJTtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAzICovXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIC8qIDEgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFLlxuICovXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vKipcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIElFIDEwLS5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC0uXG4gKi9cblt0eXBlPVwiY2hlY2tib3hcIl0sXG5bdHlwZT1cInJhZGlvXCJdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAyICovXG59XG5cbi8qKlxuICogQ29ycmVjdCB0aGUgY3Vyc29yIHN0eWxlIG9mIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGJ1dHRvbnMgaW4gQ2hyb21lLlxuICovXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gIC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIHBhZGRpbmcgYW5kIGNhbmNlbCBidXR0b25zIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4gKi9cblt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFxuW3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG5cbi8qKlxuICogQ29ycmVjdCB0aGUgdGV4dCBzdHlsZSBvZiBwbGFjZWhvbGRlcnMgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG46Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogaW5oZXJpdDtcbiAgb3BhY2l0eTogMC41NDtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICogMi4gQ2hhbmdlIGZvbnQgcHJvcGVydGllcyB0byBgaW5oZXJpdGAgaW4gU2FmYXJpLlxuICovXG46Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XG4gIC8qIDEgKi9cbiAgZm9udDogaW5oZXJpdDtcbiAgLyogMiAqL1xufVxuXG4qLFxuKjpiZWZvcmUsXG4qOmFmdGVyIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuaHRtbCB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cblxuYm9keSB7XG4gIHBhZGRpbmctdG9wOiA5MHB4O1xuICBmb250LWZhbWlseTogXCJMYXRvXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LXdlaWdodDogMzAwO1xuICBsaW5lLWhlaWdodDogMS40O1xuICBjb2xvcjogIzMzMztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cblxuYSB7XG4gIGNvbG9yOiAjMTk3NkQyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuM3M7XG59XG5cbmE6aG92ZXIsIGE6Zm9jdXMge1xuICBjb2xvcjogIzIxOTZGMztcbn1cblxuaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG59XG5cbmgxIHNtYWxsLCBoMiBzbWFsbCwgaDMgc21hbGwsIGg0IHNtYWxsLCBoNSBzbWFsbCwgaDYgc21hbGwge1xuICBmb250LXNpemU6IDYwJTtcbn1cblxuaDEsIGgyLCBoMyB7XG4gIG1hcmdpbjogMjBweCAwO1xufVxuXG5oNCwgaDUsIGg2IHtcbiAgbWFyZ2luOiAxMHB4IDA7XG59XG5cbmgxIHtcbiAgZm9udC1zaXplOiAzOHB4O1xufVxuXG5oMiB7XG4gIGZvbnQtc2l6ZTogMzRweDtcbn1cblxuaDMge1xuICBmb250LXNpemU6IDI2cHg7XG59XG5cbmg0IHtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG5oNSB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cblxuaDYge1xuICBmb250LXNpemU6IDE0cHg7XG59XG5cbnAge1xuICBtYXJnaW46IDAgMCAxNXB4IDA7XG59XG5cbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG59XG5cbi5jb250YWluZXIge1xuICBtYXgtd2lkdGg6IDExNzBweDtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xufVxuXG4uY29udGFpbmVyOmJlZm9yZSwgLmNvbnRhaW5lcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cblxuLmNvbnRhaW5lcjphZnRlciB7XG4gIGNsZWFyOiBib3RoO1xufVxuXG4uaGVhZGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIHotaW5kZXg6IDEwMDtcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDE1cHggMDtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxOTc2RDI7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbn1cblxuLmxvZ28tdGV4dCB7XG4gIG1hcmdpbjogMDtcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gIC5sb2dvLXRleHQge1xuICAgIGZvbnQtc2l6ZTogMjVweDtcbiAgfVxufVxuXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgLmxvZ28tdGV4dCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG59XG5cbi5oZWFkZXItLWxpbmtzIC5idG4ge1xuICBtYXJnaW46IDA7XG4gIG1hcmdpbi10b3A6IDdweDtcbn1cblxuLmhlYWRlci0tbGlua3MgLmJ0bjpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDdweDtcbn1cblxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5oZWFkZXItLWxpbmtzIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gIH1cbn1cblxuLmZvb3RlciB7XG4gIHBhZGRpbmctdG9wOiAxNXB4O1xuICBwYWRkaW5nLWJvdHRvbTogMTVweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5kZW1vIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogNDBweDtcbn1cblxuLmRlbW8tLWludHJvIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi5idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xuICBwYWRkaW5nOiA0cHggMTJweCA2cHggMTJweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgLjNzLCBjb2xvciAuM3M7XG59XG5cbi5idG46aG92ZXIsIC5idG46YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMztcbn1cblxuLmJ0bi13aGl0ZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBib3JkZXItY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4uaW5zdGFsbCAuYnRuIHtcbiAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxuXG5wcmUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICBtYXJnaW46IDAgMCAyMHB4IDA7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBmb250LWZhbWlseTogJ0N1dGl2ZSBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4iLCIvLyAtLS0tLSBNaXhpbnMgLS0tLS1cbkBtaXhpbiBjbGVhcmZpeCgpIHtcbiAgJjpiZWZvcmUsXG4gICY6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgIGRpc3BsYXk6IHRhYmxlO1xuICB9XG4gICY6YWZ0ZXIge1xuICAgIGNsZWFyOiBib3RoO1xuICB9XG59XG5cblxuLy8gLS0tLS0gQmFzZSBzdHlsZXMgLS0tLS1cblxuKixcbio6YmVmb3JlLFxuKjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbmh0bWwge1xuICBmb250LXNpemU6IDEwcHg7XG59XG5cbmJvZHkge1xuICBwYWRkaW5nLXRvcDogOTBweDtcbiAgZm9udC1mYW1pbHk6IFwiTGF0b1wiLCBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgY29sb3I6ICMzMzM7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5cbmEge1xuICBjb2xvcjogIzE5NzZEMjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjNzO1xuXG4gICY6aG92ZXIsICY6Zm9jdXMge1xuICAgIGNvbG9yOiAjMjE5NkYzO1xuICB9XG59XG5cbi8vIFR5cGVcbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYge1xuICBmb250LXdlaWdodDogMzAwO1xuXG4gIHNtYWxsIHtcbiAgICBmb250LXNpemU6IDYwJTtcbiAgfVxufVxuaDEsIGgyLCBoMyB7XG4gIG1hcmdpbjogMjBweCAwO1xufVxuaDQsIGg1LCBoNiB7XG4gIG1hcmdpbjogMTBweCAwO1xufVxuXG5oMSB7IGZvbnQtc2l6ZTogMzhweDsgfVxuaDIgeyBmb250LXNpemU6IDM0cHg7IH1cbmgzIHsgZm9udC1zaXplOiAyNnB4OyB9XG5oNCB7IGZvbnQtc2l6ZTogMjBweDsgfVxuaDUgeyBmb250LXNpemU6IDE2cHg7IH1cbmg2IHsgZm9udC1zaXplOiAxNHB4OyB9XG5cbnAge1xuICBtYXJnaW46IDAgMCAxNXB4IDA7XG59XG5cbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG59XG5cblxuXG4vLyAtLS0tLSBMYXlvdXQgLS0tLS1cbi5jb250YWluZXIge1xuICBtYXgtd2lkdGg6IDExNzBweDtcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICBAaW5jbHVkZSBjbGVhcmZpeCgpOyAgXG59XG5cblxuLy8gLS0tLS0gSGVhZGVyIGFuZCBmb290ZXIgLS0tLS1cbi5oZWFkZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgei1pbmRleDogMTAwO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMTVweCAwO1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzE5NzZEMjtcbiAgYm94LXNoYWRvdzogMCAwIDZweCA2cHggcmdiYSgwLDAsMCwwLjEpO1xufVxuXG4gIC5sb2dvLXRleHQge1xuICAgIG1hcmdpbjogMDtcblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAgICAgZm9udC1zaXplOiAyNXB4O1xuICAgIH1cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIH1cblxuICAuaGVhZGVyLS1saW5rcyB7XG5cbiAgICAuYnRuIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIG1hcmdpbi10b3A6IDdweDtcblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDdweDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgICBmbG9hdDogcmlnaHQ7XG4gICAgfVxuICB9XG5cbi5mb290ZXIge1xuICBwYWRkaW5nLXRvcDogMTVweDtcbiAgcGFkZGluZy1ib3R0b206IDE1cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG5cbi8vIC0tLS0tIERlbW8gLS0tLS1cbi5kZW1vIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogNDBweDtcbn1cblxuLmRlbW8tLWludHJvIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi5idG4ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xuICBwYWRkaW5nOiA0cHggMTJweCA2cHggMTJweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgLjNzLCBjb2xvciAuM3M7XG5cbiAgJjpob3ZlciwgJjphY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjM7XG4gIH1cbn1cblxuLmJ0bi13aGl0ZSB7XG4gIGNvbG9yOiAjZmZmO1xuICBib3JkZXItY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4uaW5zdGFsbCAuYnRuIHtcbiAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxuXG5wcmUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICBtYXJnaW46IDAgMCAyMHB4IDA7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBmb250LWZhbWlseTogJ0N1dGl2ZSBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4iXX0= */ 603 | -------------------------------------------------------------------------------- /assets/styles/site.scss: -------------------------------------------------------------------------------- 1 | // Demo site styles 2 | @import "site/normalize.scss"; 3 | @import "site/site.scss"; 4 | -------------------------------------------------------------------------------- /assets/styles/site/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /** 4 | * 1. Change the default font family in all browsers (opinionated). 5 | * 2. Prevent adjustments of font size after orientation changes in IE and iOS. 6 | */ 7 | 8 | html { 9 | font-family: sans-serif; /* 1 */ 10 | -ms-text-size-adjust: 100%; /* 2 */ 11 | -webkit-text-size-adjust: 100%; /* 2 */ 12 | } 13 | 14 | /** 15 | * Remove the margin in all browsers (opinionated). 16 | */ 17 | 18 | body { 19 | margin: 0; 20 | } 21 | 22 | /* HTML5 display definitions 23 | ========================================================================== */ 24 | 25 | /** 26 | * Add the correct display in IE 9-. 27 | * 1. Add the correct display in Edge, IE, and Firefox. 28 | * 2. Add the correct display in IE. 29 | */ 30 | 31 | article, 32 | aside, 33 | details, /* 1 */ 34 | figcaption, 35 | figure, 36 | footer, 37 | header, 38 | main, /* 2 */ 39 | menu, 40 | nav, 41 | section, 42 | summary { /* 1 */ 43 | display: block; 44 | } 45 | 46 | /** 47 | * Add the correct display in IE 9-. 48 | */ 49 | 50 | audio, 51 | canvas, 52 | progress, 53 | video { 54 | display: inline-block; 55 | } 56 | 57 | /** 58 | * Add the correct display in iOS 4-7. 59 | */ 60 | 61 | audio:not([controls]) { 62 | display: none; 63 | height: 0; 64 | } 65 | 66 | /** 67 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 68 | */ 69 | 70 | progress { 71 | vertical-align: baseline; 72 | } 73 | 74 | /** 75 | * Add the correct display in IE 10-. 76 | * 1. Add the correct display in IE. 77 | */ 78 | 79 | template, /* 1 */ 80 | [hidden] { 81 | display: none; 82 | } 83 | 84 | /* Links 85 | ========================================================================== */ 86 | 87 | /** 88 | * 1. Remove the gray background on active links in IE 10. 89 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. 90 | */ 91 | 92 | a { 93 | background-color: transparent; /* 1 */ 94 | -webkit-text-decoration-skip: objects; /* 2 */ 95 | } 96 | 97 | /** 98 | * Remove the outline on focused links when they are also active or hovered 99 | * in all browsers (opinionated). 100 | */ 101 | 102 | a:active, 103 | a:hover { 104 | outline-width: 0; 105 | } 106 | 107 | /* Text-level semantics 108 | ========================================================================== */ 109 | 110 | /** 111 | * 1. Remove the bottom border in Firefox 39-. 112 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 113 | */ 114 | 115 | abbr[title] { 116 | border-bottom: none; /* 1 */ 117 | text-decoration: underline; /* 2 */ 118 | text-decoration: underline dotted; /* 2 */ 119 | } 120 | 121 | /** 122 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6. 123 | */ 124 | 125 | b, 126 | strong { 127 | font-weight: inherit; 128 | } 129 | 130 | /** 131 | * Add the correct font weight in Chrome, Edge, and Safari. 132 | */ 133 | 134 | b, 135 | strong { 136 | font-weight: bolder; 137 | } 138 | 139 | /** 140 | * Add the correct font style in Android 4.3-. 141 | */ 142 | 143 | dfn { 144 | font-style: italic; 145 | } 146 | 147 | /** 148 | * Correct the font size and margin on `h1` elements within `section` and 149 | * `article` contexts in Chrome, Firefox, and Safari. 150 | */ 151 | 152 | h1 { 153 | font-size: 2em; 154 | margin: 0.67em 0; 155 | } 156 | 157 | /** 158 | * Add the correct background and color in IE 9-. 159 | */ 160 | 161 | mark { 162 | background-color: #ff0; 163 | color: #000; 164 | } 165 | 166 | /** 167 | * Add the correct font size in all browsers. 168 | */ 169 | 170 | small { 171 | font-size: 80%; 172 | } 173 | 174 | /** 175 | * Prevent `sub` and `sup` elements from affecting the line height in 176 | * all browsers. 177 | */ 178 | 179 | sub, 180 | sup { 181 | font-size: 75%; 182 | line-height: 0; 183 | position: relative; 184 | vertical-align: baseline; 185 | } 186 | 187 | sub { 188 | bottom: -0.25em; 189 | } 190 | 191 | sup { 192 | top: -0.5em; 193 | } 194 | 195 | /* Embedded content 196 | ========================================================================== */ 197 | 198 | /** 199 | * Remove the border on images inside links in IE 10-. 200 | */ 201 | 202 | img { 203 | border-style: none; 204 | } 205 | 206 | /** 207 | * Hide the overflow in IE. 208 | */ 209 | 210 | svg:not(:root) { 211 | overflow: hidden; 212 | } 213 | 214 | /* Grouping content 215 | ========================================================================== */ 216 | 217 | /** 218 | * 1. Correct the inheritance and scaling of font size in all browsers. 219 | * 2. Correct the odd `em` font sizing in all browsers. 220 | */ 221 | 222 | code, 223 | kbd, 224 | pre, 225 | samp { 226 | font-family: monospace, monospace; /* 1 */ 227 | font-size: 1em; /* 2 */ 228 | } 229 | 230 | /** 231 | * Add the correct margin in IE 8. 232 | */ 233 | 234 | figure { 235 | margin: 1em 40px; 236 | } 237 | 238 | /** 239 | * 1. Add the correct box sizing in Firefox. 240 | * 2. Show the overflow in Edge and IE. 241 | */ 242 | 243 | hr { 244 | box-sizing: content-box; /* 1 */ 245 | height: 0; /* 1 */ 246 | overflow: visible; /* 2 */ 247 | } 248 | 249 | /* Forms 250 | ========================================================================== */ 251 | 252 | /** 253 | * 1. Change font properties to `inherit` in all browsers (opinionated). 254 | * 2. Remove the margin in Firefox and Safari. 255 | */ 256 | 257 | button, 258 | input, 259 | select, 260 | textarea { 261 | font: inherit; /* 1 */ 262 | margin: 0; /* 2 */ 263 | } 264 | 265 | /** 266 | * Restore the font weight unset by the previous rule. 267 | */ 268 | 269 | optgroup { 270 | font-weight: bold; 271 | } 272 | 273 | /** 274 | * Show the overflow in IE. 275 | * 1. Show the overflow in Edge. 276 | */ 277 | 278 | button, 279 | input { /* 1 */ 280 | overflow: visible; 281 | } 282 | 283 | /** 284 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 285 | * 1. Remove the inheritance of text transform in Firefox. 286 | */ 287 | 288 | button, 289 | select { /* 1 */ 290 | text-transform: none; 291 | } 292 | 293 | /** 294 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` 295 | * controls in Android 4. 296 | * 2. Correct the inability to style clickable types in iOS and Safari. 297 | */ 298 | 299 | button, 300 | html [type="button"], /* 1 */ 301 | [type="reset"], 302 | [type="submit"] { 303 | -webkit-appearance: button; /* 2 */ 304 | } 305 | 306 | /** 307 | * Remove the inner border and padding in Firefox. 308 | */ 309 | 310 | button::-moz-focus-inner, 311 | [type="button"]::-moz-focus-inner, 312 | [type="reset"]::-moz-focus-inner, 313 | [type="submit"]::-moz-focus-inner { 314 | border-style: none; 315 | padding: 0; 316 | } 317 | 318 | /** 319 | * Restore the focus styles unset by the previous rule. 320 | */ 321 | 322 | button:-moz-focusring, 323 | [type="button"]:-moz-focusring, 324 | [type="reset"]:-moz-focusring, 325 | [type="submit"]:-moz-focusring { 326 | outline: 1px dotted ButtonText; 327 | } 328 | 329 | /** 330 | * Change the border, margin, and padding in all browsers (opinionated). 331 | */ 332 | 333 | fieldset { 334 | border: 1px solid #c0c0c0; 335 | margin: 0 2px; 336 | padding: 0.35em 0.625em 0.75em; 337 | } 338 | 339 | /** 340 | * 1. Correct the text wrapping in Edge and IE. 341 | * 2. Correct the color inheritance from `fieldset` elements in IE. 342 | * 3. Remove the padding so developers are not caught out when they zero out 343 | * `fieldset` elements in all browsers. 344 | */ 345 | 346 | legend { 347 | box-sizing: border-box; /* 1 */ 348 | color: inherit; /* 2 */ 349 | display: table; /* 1 */ 350 | max-width: 100%; /* 1 */ 351 | padding: 0; /* 3 */ 352 | white-space: normal; /* 1 */ 353 | } 354 | 355 | /** 356 | * Remove the default vertical scrollbar in IE. 357 | */ 358 | 359 | textarea { 360 | overflow: auto; 361 | } 362 | 363 | /** 364 | * 1. Add the correct box sizing in IE 10-. 365 | * 2. Remove the padding in IE 10-. 366 | */ 367 | 368 | [type="checkbox"], 369 | [type="radio"] { 370 | box-sizing: border-box; /* 1 */ 371 | padding: 0; /* 2 */ 372 | } 373 | 374 | /** 375 | * Correct the cursor style of increment and decrement buttons in Chrome. 376 | */ 377 | 378 | [type="number"]::-webkit-inner-spin-button, 379 | [type="number"]::-webkit-outer-spin-button { 380 | height: auto; 381 | } 382 | 383 | /** 384 | * 1. Correct the odd appearance in Chrome and Safari. 385 | * 2. Correct the outline style in Safari. 386 | */ 387 | 388 | [type="search"] { 389 | -webkit-appearance: textfield; /* 1 */ 390 | outline-offset: -2px; /* 2 */ 391 | } 392 | 393 | /** 394 | * Remove the inner padding and cancel buttons in Chrome and Safari on OS X. 395 | */ 396 | 397 | [type="search"]::-webkit-search-cancel-button, 398 | [type="search"]::-webkit-search-decoration { 399 | -webkit-appearance: none; 400 | } 401 | 402 | /** 403 | * Correct the text style of placeholders in Chrome, Edge, and Safari. 404 | */ 405 | 406 | ::-webkit-input-placeholder { 407 | color: inherit; 408 | opacity: 0.54; 409 | } 410 | 411 | /** 412 | * 1. Correct the inability to style clickable types in iOS and Safari. 413 | * 2. Change font properties to `inherit` in Safari. 414 | */ 415 | 416 | ::-webkit-file-upload-button { 417 | -webkit-appearance: button; /* 1 */ 418 | font: inherit; /* 2 */ 419 | } 420 | -------------------------------------------------------------------------------- /assets/styles/site/_site.scss: -------------------------------------------------------------------------------- 1 | // ----- Mixins ----- 2 | @mixin clearfix() { 3 | &:before, 4 | &:after { 5 | content: " "; 6 | display: table; 7 | } 8 | &:after { 9 | clear: both; 10 | } 11 | } 12 | 13 | 14 | // ----- Base styles ----- 15 | 16 | *, 17 | *:before, 18 | *:after { 19 | box-sizing: border-box; 20 | } 21 | 22 | html { 23 | font-size: 10px; 24 | } 25 | 26 | body { 27 | padding-top: 90px; 28 | font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; 29 | font-size: 18px; 30 | font-weight: 300; 31 | line-height: 1.4; 32 | color: #333; 33 | background-color: #fff; 34 | } 35 | 36 | a { 37 | color: #1976D2; 38 | text-decoration: none; 39 | transition: color 0.3s; 40 | 41 | &:hover, &:focus { 42 | color: #2196F3; 43 | } 44 | } 45 | 46 | // Type 47 | h1, h2, h3, h4, h5, h6 { 48 | font-weight: 300; 49 | 50 | small { 51 | font-size: 60%; 52 | } 53 | } 54 | h1, h2, h3 { 55 | margin: 20px 0; 56 | } 57 | h4, h5, h6 { 58 | margin: 10px 0; 59 | } 60 | 61 | h1 { font-size: 38px; } 62 | h2 { font-size: 34px; } 63 | h3 { font-size: 26px; } 64 | h4 { font-size: 20px; } 65 | h5 { font-size: 16px; } 66 | h6 { font-size: 14px; } 67 | 68 | p { 69 | margin: 0 0 15px 0; 70 | } 71 | 72 | strong { 73 | font-weight: 400; 74 | } 75 | 76 | 77 | 78 | // ----- Layout ----- 79 | .container { 80 | max-width: 1170px; 81 | margin-right: auto; 82 | margin-left: auto; 83 | padding-left: 15px; 84 | padding-right: 15px; 85 | @include clearfix(); 86 | } 87 | 88 | 89 | // ----- Header and footer ----- 90 | .header { 91 | position: fixed; 92 | top: 0; 93 | z-index: 100; 94 | width: 100%; 95 | padding: 15px 0; 96 | color: #fff; 97 | background-color: #1976D2; 98 | box-shadow: 0 0 6px 6px rgba(0,0,0,0.1); 99 | } 100 | 101 | .logo-text { 102 | margin: 0; 103 | 104 | @media (max-width: 767px) { 105 | font-size: 25px; 106 | } 107 | @media (min-width: 768px) { 108 | display: inline-block; 109 | } 110 | } 111 | 112 | .header--links { 113 | 114 | .btn { 115 | margin: 0; 116 | margin-top: 7px; 117 | 118 | &:last-child { 119 | margin-left: 7px; 120 | } 121 | } 122 | 123 | @media (min-width: 768px) { 124 | float: right; 125 | } 126 | } 127 | 128 | .footer { 129 | padding-top: 15px; 130 | padding-bottom: 15px; 131 | font-size: 12px; 132 | text-align: center; 133 | } 134 | 135 | 136 | // ----- Demo ----- 137 | .demo { 138 | margin-top: 20px; 139 | margin-bottom: 40px; 140 | } 141 | 142 | .demo--intro { 143 | border-bottom: 1px solid #ddd; 144 | } 145 | 146 | .btn { 147 | display: inline-block; 148 | text-align: center; 149 | vertical-align: middle; 150 | cursor: pointer; 151 | border: 1px solid #bbb; 152 | padding: 4px 12px 6px 12px; 153 | font-size: 18px; 154 | background-color: #fff; 155 | border-radius: 4px; 156 | transition: background-color .3s, color .3s; 157 | 158 | &:hover, &:active { 159 | background-color: #f3f3f3; 160 | } 161 | } 162 | 163 | .btn-white { 164 | color: #fff; 165 | border-color: #fff; 166 | background-color: transparent; 167 | } 168 | 169 | .install .btn { 170 | margin-right: 15px; 171 | margin-bottom: 15px; 172 | } 173 | 174 | pre { 175 | display: block; 176 | padding: 10px 15px; 177 | margin: 0 0 20px 0; 178 | overflow: auto; 179 | font-family: 'Cutive Mono', monospace; 180 | font-size: 14px; 181 | word-break: break-all; 182 | word-wrap: break-word; 183 | background-color: #f3f3f3; 184 | border: 1px solid #bbb; 185 | border-radius: 4px; 186 | } 187 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | const gulp = require('gulp'); 2 | const gulpLoadPlugins = require('gulp-load-plugins'); 3 | const browserSync = require('browser-sync'); 4 | 5 | const $ = gulpLoadPlugins(); 6 | const reload = browserSync.reload; 7 | 8 | gulp.task('styles', () => { 9 | return gulp.src('assets/styles/*.scss') 10 | .pipe($.plumber()) 11 | .pipe($.sourcemaps.init()) 12 | .pipe($.sass.sync({ 13 | outputStyle: 'expanded', 14 | precision: 10, 15 | includePaths: ['.'] 16 | }).on('error', $.sass.logError)) 17 | .pipe($.autoprefixer({browsers: ['> 1%', 'last 2 versions', 'Firefox ESR']})) 18 | .pipe($.sourcemaps.write()) 19 | .pipe(gulp.dest('assets/styles')) 20 | .pipe(reload({stream: true})); 21 | }); 22 | 23 | gulp.task('serve', ['styles'], () => { 24 | browserSync({ 25 | notify: false, 26 | port: 9000, 27 | server: { 28 | baseDir: [''] 29 | } 30 | }); 31 | 32 | gulp.watch([ 33 | 'assets/*.html', 34 | 'assets/styles/**/*', 35 | 'assets/scripts/**/*' 36 | ]).on('change', reload); 37 | 38 | gulp.watch('assets/styles/**/*.scss', ['styles']); 39 | }); 40 | 41 | gulp.task('default', ['serve']); 42 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Angled edges (SASS mixin) 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 19 |

Angled edges (SASS mixin)

20 | 21 | 25 |
26 |
27 | 28 |
29 |

Add a consistent angled edge to a full width element.

30 |

This technique uses CSS clip-path to clip the image but has a fallback using pseudo elements for older browsers.
31 | It is only intended for use on full width elements as it uses the vw unit to calulate the angle.

32 |
33 | 34 | 35 |
36 |

Examples

37 | 38 |

Top left

39 | 40 |
41 | Nebula 42 |
43 |
44 | 45 |
46 |

Bottom left

47 | 48 |
49 | Nebula 50 |
51 |
52 | 53 |
54 |

Top and bottom

55 | 56 |
57 | Nebula 58 |
59 |
60 | 61 |
62 |

Backgound Colour

63 | 64 |
65 |

Background colour

66 |
67 |
68 | 69 | 70 |
71 | 72 |
73 |

Installation

74 | 75 | Download 76 | Download CSS 77 | View on GitHub 78 | 79 |
80 | 81 | 82 |
83 |

Usage

84 |

Once you have downloaded the code, run the commands below to view the demo site.

85 |
 86 | $ npm install
 87 | $ gulp serve
 88 | 
89 | 90 |

You can also import angled-edges.scss into your own project directly and use the classes already setup or use the mixin in your own classes.

91 | 92 |
93 |
94 | 95 | 96 |
97 |

Inspired by Kilian Valkhof and Viget
98 | Image from Wikimedia Commons 99 |

100 |
101 | 102 | 103 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angled-edges", 3 | "description": "Add a consistent angled edge to a full width element.", 4 | "version": "1.0.0", 5 | "main": "assets/styles/angled-edges.scss", 6 | "dependencies": {}, 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/NigelOToole/angled-edges.git" 13 | }, 14 | "keywords": [ 15 | "sass", 16 | "mixin", 17 | "angled", 18 | "clip-path", 19 | "css" 20 | ], 21 | "author": "Nigel O Toole (http://www.purestructure.com)", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/NigelOToole/angled-edges/issues" 25 | }, 26 | "homepage": "https://github.com/NigelOToole/angled-edges#readme", 27 | "engines": { 28 | "node": ">=4" 29 | }, 30 | "devDependencies": { 31 | "browser-sync": "^2.2.1", 32 | "gulp": "^3.9.0", 33 | "gulp-autoprefixer": "^3.0.1", 34 | "gulp-load-plugins": "^0.10.0", 35 | "gulp-plumber": "^1.0.1", 36 | "gulp-sass": "^2.0.0", 37 | "gulp-sourcemaps": "^1.5.0" 38 | } 39 | } 40 | --------------------------------------------------------------------------------