├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ └── protocol.md ├── .gitignore ├── README.md ├── _config.yml ├── _data ├── refs.yml └── warc_fields.yml ├── _includes ├── _about.md ├── _issues.md └── _toc.md ├── _layouts ├── default.html └── plaintext.txt ├── assets ├── bootstrap │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ └── bootstrap.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── javascripts │ └── scale.fix.js └── stylesheets │ ├── pygment_trac.css │ └── styles.css ├── guidelines ├── cdx-non-get-requests │ └── index.md ├── warc-fields │ └── index.md └── warc-implementation-guidelines │ └── index.md ├── index.md ├── primers └── web-archive-formats │ ├── cdx.unsorted.out │ ├── hello-world.txt │ ├── hello-world.warc │ ├── hello-world.warc.cdx │ ├── hello-world.warc.gz │ └── index.md └── specifications ├── cdx-format ├── cdx-2006 │ └── index.md └── cdx-2015 │ └── index.md ├── warc-deduplication ├── recording-arbitrary-duplicates-1.0.md └── samples │ ├── 20130729-heritrix-original.warc.gz │ ├── 20130729-heritrix-revisit-with-http-headers.warc.gz │ ├── 20141124-heritrix-server-not-modified.warc.gz │ ├── 20141129-heritrix-original.warc.gz │ └── 20141129-heritrix-revisit-with-http-headers-and-new-warc-headers.warc.gz ├── warc-format ├── meetings │ └── 2015-05-01-IIPC-GA-WARC-Meeting-Minutes.md ├── warc-1.0 │ ├── The_WARC_Format.md │ ├── WARC_ISO_28500_version1_latestdraft.doc │ ├── WARC_ISO_28500_version1_latestdraft.pdf │ └── index.md ├── warc-1.1-annotated │ └── index.md └── warc-1.1 │ └── index.md ├── warc-rendered-targets └── warc-rendered-targets-1.0.md └── warc-zstd └── index.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.warc -text 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/protocol.md: -------------------------------------------------------------------------------- 1 | ### Protocol name 2 | 3 | > e.g. FTP, HTTP/2 over cleartext TCP 4 | 5 | ### Protocol identifier 6 | 7 | > Guidelines: When in doubt identifiers should be a lowercase ASCII string 8 | > of the form "name/version". The slash character and version should be 9 | > omitted if the protocol doesn't have multiple wire versions. 10 | > 11 | > Consider reusing identifiers from the following registry when possible: 12 | > https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids 13 | 14 | ### Specification URL (optional) 15 | 16 | > URL of a document describing the protocol such as an RFC. 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | warc-specifications 2 | =================== 3 | 4 | Centralised repository for WARC usage specifications. 5 | 6 | TODO: 7 | 8 | * Explain this repo briefly here. -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | baseurl: /warc-specifications 2 | 3 | markdown: kramdown 4 | 5 | permalink: pretty 6 | 7 | defaults: 8 | - 9 | scope: 10 | path: "" # an empty string here means all files in the project 11 | values: 12 | layout: "default" 13 | 14 | exclude: 15 | - "*/Makefile" 16 | 17 | gems: 18 | - jekyll-redirect-from 19 | 20 | -------------------------------------------------------------------------------- /_data/refs.yml: -------------------------------------------------------------------------------- 1 | WARC Implementation Guidelines: https://iipc.github.io/warc-specifications/guidelines/warc-implementation-guidelines/ 2 | issues: https://github.com/iipc/warc-specifications/issues 3 | WARC 1.0: https://iipc.github.io/warc-specifications/specifications/warc-format/warc-1.0/ 4 | WARC 1.1: https://iipc.github.io/warc-specifications/specifications/warc-format/warc-1.1/ 5 | warcit: https://github.com/webrecorder/warcit 6 | -------------------------------------------------------------------------------- /_data/warc_fields.yml: -------------------------------------------------------------------------------- 1 | - name: Content-Length 2 | since: 1.0 3 | spec: WARC 1.1 4 | - name: Content-Type 5 | since: 1.0 6 | spec: WARC 1.1 7 | - name: WARC-Block-Digest 8 | since: 1.0 9 | spec: WARC 1.1 10 | - name: WARC-Cipher-Suite 11 | spec: issues/86 12 | status: proposed 13 | - name: WARC-Concurrent-To 14 | since: 1.0 15 | spec: WARC 1.1 16 | - name: WARC-Creation-Date 17 | spec: warcit#warc-structure-and-format 18 | status: wild 19 | - name: WARC-Date 20 | since: 1.0 21 | spec: WARC 1.1 22 | - name: WARC-Filename 23 | since: 1.0 24 | spec: WARC 1.1 25 | - name: WARC-Identified-Payload-Type 26 | since: 1.0 27 | spec: WARC 1.1 28 | - name: WARC-IP-Address 29 | since: 1.0 30 | spec: WARC 1.1 31 | - name: WARC-Payload-Digest 32 | since: 1.0 33 | spec: WARC 1.1 34 | - name: WARC-Previous-Record-ID 35 | spec: WARC Implementation Guidelines#link-with-previous-record 36 | status: proposed 37 | - name: WARC-Profile 38 | since: 1.0 39 | spec: WARC 1.1 40 | - name: WARC-Protocol 41 | spec: issues/42 42 | status: proposed 43 | - name: WARC-Push-Promised-From 44 | spec: issues/43 45 | status: proposed 46 | - name: WARC-Record-ID 47 | since: 1.0 48 | spec: WARC 1.1 49 | - name: WARC-Refers-To 50 | since: 1.0 51 | spec: WARC 1.1 52 | - name: WARC-Refers-To-Date 53 | since: 1.1 54 | spec: WARC 1.1 55 | - name: WARC-Refers-To-Target-URI 56 | since: 1.1 57 | spec: WARC 1.1 58 | - name: WARC-Segment-Number 59 | since: 1.0 60 | spec: WARC 1.1 61 | - name: WARC-Segment-Origin-ID 62 | since: 1.0 63 | spec: WARC 1.1 64 | - name: WARC-Segment-Total-Length 65 | since: 1.0 66 | spec: WARC 1.1 67 | - name: WARC-Source-URI 68 | spec: warcit#warc-structure-and-format 69 | status: wild 70 | - name: WARC-Target-URI 71 | since: 1.0 72 | spec: WARC 1.1 73 | - name: WARC-Transcluded-By 74 | spec: issues/4 75 | status: proposed 76 | - name: WARC-Truncated 77 | since: 1.0 78 | spec: WARC 1.1 79 | - name: WARC-Type 80 | since: 1.0 81 | spec: WARC 1.1 82 | - name: WARC-Warcinfo-ID 83 | since: 1.0 84 | spec: WARC 1.1 85 | -------------------------------------------------------------------------------- /_includes/_about.md: -------------------------------------------------------------------------------- 1 | {% if page.status %} 2 | {% for op in site.pages %} 3 | {% if page.version-of == op.version-of %} 4 | {% if op.latest == true and op.version != page.version %} 5 | {% assign latest-version = op %} 6 | {% endif %} 7 | {% if op.version == page.previous-version %} 8 | {% assign previous-version = op %} 9 | {% endif %} 10 | {% endif %} 11 | {% endfor %} 12 |
13 |
14 |

15 | About 16 |

17 |
18 |
19 |
20 |
Title
21 |
{{ page.title }}{% if page.version %} {{ page.version }}{% endif %} {{ page.status }}
22 |
Latest version
23 | {% if latest-version %} 24 |
See version {{ latest-version.version }}
25 | {% else %} 26 |
This is the latest version
27 | {% endif %} 28 |
Previous version
29 | {% if previous-version %} 30 |
See version {{ previous-version.version }}
31 | {% else %} 32 |
None
33 | {% endif %} 34 | {% if page.version-of %} 35 |
Issues
36 |
View issues on GitHub 
37 | {% endif %} 38 |
39 |
40 |
41 | {% endif %} -------------------------------------------------------------------------------- /_includes/_issues.md: -------------------------------------------------------------------------------- 1 | {% if page.status or page.path == "index.md" %} 2 |
3 |
4 |

5 | Open Issues 6 |

7 |
8 |
9 | 10 | 11 |
12 | 22 | 23 |
24 |
25 | 26 | 60 | {% endif %} -------------------------------------------------------------------------------- /_includes/_toc.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | Contents 5 |

6 |
7 |
8 |
9 | {% if page.numbered == true %} 10 |
11 | {% endif %} 12 |
13 | * Auto generated table of contents 14 | {:toc} 15 | {% if page.numbered == true %} 16 |
17 | {% endif %} 18 |
19 |
20 |
21 |
22 | 23 | 24 | 25 | {{ page.content }} 26 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{ page.title }} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 30 | 31 | 32 | 33 | 34 | 94 | 95 |
96 | 97 | {% if page.status %} 98 |
99 | 100 | {% if page.version-of %} 101 |   102 | {% endif %} 103 | 105 | 107 | 108 | {{ page.status | capitalize }} 109 |
110 |
111 | {% endif %} 112 | 113 | 119 | 120 |
121 | 122 | {% if page.status == None %} 123 | 124 | 126 | 128 | 129 | {% endif %} 130 |

{{ page.title }}{%if page.version %} {{ page.version }}{% endif %}

131 | 132 | {% if page.numbered == true %} 133 |
134 | {% endif %} 135 | 136 | {{ content }} 137 | 138 | {% if page.numbered == true %} 139 |
140 | {% endif %} 141 | 142 | 143 |
144 |
145 | 146 | 147 |
148 | 149 | {% if page.status %} 150 |
151 | {{ page.status | capitalize }} 152 |
153 | {% endif %} 154 | 155 | 167 |
168 | 169 | 170 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | -------------------------------------------------------------------------------- /_layouts/plaintext.txt: -------------------------------------------------------------------------------- 1 | {{ content }} 2 | -------------------------------------------------------------------------------- /assets/bootstrap/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.4 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .btn-default, 8 | .btn-primary, 9 | .btn-success, 10 | .btn-info, 11 | .btn-warning, 12 | .btn-danger { 13 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 14 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 16 | } 17 | .btn-default:active, 18 | .btn-primary:active, 19 | .btn-success:active, 20 | .btn-info:active, 21 | .btn-warning:active, 22 | .btn-danger:active, 23 | .btn-default.active, 24 | .btn-primary.active, 25 | .btn-success.active, 26 | .btn-info.active, 27 | .btn-warning.active, 28 | .btn-danger.active { 29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 31 | } 32 | .btn-default .badge, 33 | .btn-primary .badge, 34 | .btn-success .badge, 35 | .btn-info .badge, 36 | .btn-warning .badge, 37 | .btn-danger .badge { 38 | text-shadow: none; 39 | } 40 | .btn:active, 41 | .btn.active { 42 | background-image: none; 43 | } 44 | .btn-default { 45 | text-shadow: 0 1px 0 #fff; 46 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 47 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 48 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 49 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 50 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 51 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 52 | background-repeat: repeat-x; 53 | border-color: #dbdbdb; 54 | border-color: #ccc; 55 | } 56 | .btn-default:hover, 57 | .btn-default:focus { 58 | background-color: #e0e0e0; 59 | background-position: 0 -15px; 60 | } 61 | .btn-default:active, 62 | .btn-default.active { 63 | background-color: #e0e0e0; 64 | border-color: #dbdbdb; 65 | } 66 | .btn-default.disabled, 67 | .btn-default:disabled, 68 | .btn-default[disabled] { 69 | background-color: #e0e0e0; 70 | background-image: none; 71 | } 72 | .btn-primary { 73 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); 74 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); 75 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); 76 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); 77 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); 78 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 79 | background-repeat: repeat-x; 80 | border-color: #245580; 81 | } 82 | .btn-primary:hover, 83 | .btn-primary:focus { 84 | background-color: #265a88; 85 | background-position: 0 -15px; 86 | } 87 | .btn-primary:active, 88 | .btn-primary.active { 89 | background-color: #265a88; 90 | border-color: #245580; 91 | } 92 | .btn-primary.disabled, 93 | .btn-primary:disabled, 94 | .btn-primary[disabled] { 95 | background-color: #265a88; 96 | background-image: none; 97 | } 98 | .btn-success { 99 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 100 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 101 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 102 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 103 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 104 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 105 | background-repeat: repeat-x; 106 | border-color: #3e8f3e; 107 | } 108 | .btn-success:hover, 109 | .btn-success:focus { 110 | background-color: #419641; 111 | background-position: 0 -15px; 112 | } 113 | .btn-success:active, 114 | .btn-success.active { 115 | background-color: #419641; 116 | border-color: #3e8f3e; 117 | } 118 | .btn-success.disabled, 119 | .btn-success:disabled, 120 | .btn-success[disabled] { 121 | background-color: #419641; 122 | background-image: none; 123 | } 124 | .btn-info { 125 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 126 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 127 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 128 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 129 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 130 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 131 | background-repeat: repeat-x; 132 | border-color: #28a4c9; 133 | } 134 | .btn-info:hover, 135 | .btn-info:focus { 136 | background-color: #2aabd2; 137 | background-position: 0 -15px; 138 | } 139 | .btn-info:active, 140 | .btn-info.active { 141 | background-color: #2aabd2; 142 | border-color: #28a4c9; 143 | } 144 | .btn-info.disabled, 145 | .btn-info:disabled, 146 | .btn-info[disabled] { 147 | background-color: #2aabd2; 148 | background-image: none; 149 | } 150 | .btn-warning { 151 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 152 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 153 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 154 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 155 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 156 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 157 | background-repeat: repeat-x; 158 | border-color: #e38d13; 159 | } 160 | .btn-warning:hover, 161 | .btn-warning:focus { 162 | background-color: #eb9316; 163 | background-position: 0 -15px; 164 | } 165 | .btn-warning:active, 166 | .btn-warning.active { 167 | background-color: #eb9316; 168 | border-color: #e38d13; 169 | } 170 | .btn-warning.disabled, 171 | .btn-warning:disabled, 172 | .btn-warning[disabled] { 173 | background-color: #eb9316; 174 | background-image: none; 175 | } 176 | .btn-danger { 177 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 178 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 179 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 180 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 181 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 182 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 183 | background-repeat: repeat-x; 184 | border-color: #b92c28; 185 | } 186 | .btn-danger:hover, 187 | .btn-danger:focus { 188 | background-color: #c12e2a; 189 | background-position: 0 -15px; 190 | } 191 | .btn-danger:active, 192 | .btn-danger.active { 193 | background-color: #c12e2a; 194 | border-color: #b92c28; 195 | } 196 | .btn-danger.disabled, 197 | .btn-danger:disabled, 198 | .btn-danger[disabled] { 199 | background-color: #c12e2a; 200 | background-image: none; 201 | } 202 | .thumbnail, 203 | .img-thumbnail { 204 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 205 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 206 | } 207 | .dropdown-menu > li > a:hover, 208 | .dropdown-menu > li > a:focus { 209 | background-color: #e8e8e8; 210 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 211 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 212 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 213 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 214 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 215 | background-repeat: repeat-x; 216 | } 217 | .dropdown-menu > .active > a, 218 | .dropdown-menu > .active > a:hover, 219 | .dropdown-menu > .active > a:focus { 220 | background-color: #2e6da4; 221 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 222 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 223 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 224 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 225 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 226 | background-repeat: repeat-x; 227 | } 228 | .navbar-default { 229 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 230 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 231 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 232 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 233 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 234 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 235 | background-repeat: repeat-x; 236 | border-radius: 4px; 237 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 238 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 239 | } 240 | .navbar-default .navbar-nav > .open > a, 241 | .navbar-default .navbar-nav > .active > a { 242 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 243 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 244 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 245 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 246 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 247 | background-repeat: repeat-x; 248 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 249 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 250 | } 251 | .navbar-brand, 252 | .navbar-nav > li > a { 253 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 254 | } 255 | .navbar-inverse { 256 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 257 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 258 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 259 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 260 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 261 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 262 | background-repeat: repeat-x; 263 | } 264 | .navbar-inverse .navbar-nav > .open > a, 265 | .navbar-inverse .navbar-nav > .active > a { 266 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 267 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 268 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 269 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 270 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 271 | background-repeat: repeat-x; 272 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 273 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 274 | } 275 | .navbar-inverse .navbar-brand, 276 | .navbar-inverse .navbar-nav > li > a { 277 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 278 | } 279 | .navbar-static-top, 280 | .navbar-fixed-top, 281 | .navbar-fixed-bottom { 282 | border-radius: 0; 283 | } 284 | @media (max-width: 767px) { 285 | .navbar .navbar-nav .open .dropdown-menu > .active > a, 286 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, 287 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { 288 | color: #fff; 289 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 290 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 291 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 292 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 293 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 294 | background-repeat: repeat-x; 295 | } 296 | } 297 | .alert { 298 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 299 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 300 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 301 | } 302 | .alert-success { 303 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 304 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 305 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 306 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 307 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 308 | background-repeat: repeat-x; 309 | border-color: #b2dba1; 310 | } 311 | .alert-info { 312 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 313 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 314 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 315 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 316 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 317 | background-repeat: repeat-x; 318 | border-color: #9acfea; 319 | } 320 | .alert-warning { 321 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 322 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 323 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 324 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 325 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 326 | background-repeat: repeat-x; 327 | border-color: #f5e79e; 328 | } 329 | .alert-danger { 330 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 331 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 332 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 333 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 334 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 335 | background-repeat: repeat-x; 336 | border-color: #dca7a7; 337 | } 338 | .progress { 339 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 340 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 341 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 342 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 343 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 344 | background-repeat: repeat-x; 345 | } 346 | .progress-bar { 347 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); 348 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); 349 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); 350 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); 351 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); 352 | background-repeat: repeat-x; 353 | } 354 | .progress-bar-success { 355 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 356 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 357 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 358 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 359 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 360 | background-repeat: repeat-x; 361 | } 362 | .progress-bar-info { 363 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 364 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 365 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 366 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 367 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 368 | background-repeat: repeat-x; 369 | } 370 | .progress-bar-warning { 371 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 372 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 373 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 374 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 375 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 376 | background-repeat: repeat-x; 377 | } 378 | .progress-bar-danger { 379 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 380 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 381 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 382 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 383 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 384 | background-repeat: repeat-x; 385 | } 386 | .progress-bar-striped { 387 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 388 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 389 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); 390 | } 391 | .list-group { 392 | border-radius: 4px; 393 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 394 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 395 | } 396 | .list-group-item.active, 397 | .list-group-item.active:hover, 398 | .list-group-item.active:focus { 399 | text-shadow: 0 -1px 0 #286090; 400 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); 401 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); 402 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); 403 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); 404 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); 405 | background-repeat: repeat-x; 406 | border-color: #2b669a; 407 | } 408 | .list-group-item.active .badge, 409 | .list-group-item.active:hover .badge, 410 | .list-group-item.active:focus .badge { 411 | text-shadow: none; 412 | } 413 | .panel { 414 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 415 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 416 | } 417 | .panel-default > .panel-heading { 418 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 419 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 420 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 421 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 422 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 423 | background-repeat: repeat-x; 424 | } 425 | .panel-primary > .panel-heading { 426 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 427 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 428 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 429 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 430 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 431 | background-repeat: repeat-x; 432 | } 433 | .panel-success > .panel-heading { 434 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 435 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 436 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 437 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 438 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 439 | background-repeat: repeat-x; 440 | } 441 | .panel-info > .panel-heading { 442 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 443 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 444 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 445 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 446 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 447 | background-repeat: repeat-x; 448 | } 449 | .panel-warning > .panel-heading { 450 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 451 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 452 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 453 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 454 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 455 | background-repeat: repeat-x; 456 | } 457 | .panel-danger > .panel-heading { 458 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 459 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 460 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 461 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 462 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 463 | background-repeat: repeat-x; 464 | } 465 | .well { 466 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 467 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 468 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 469 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 470 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 471 | background-repeat: repeat-x; 472 | border-color: #dcdcdc; 473 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 474 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 475 | } 476 | /*# sourceMappingURL=bootstrap-theme.css.map */ 477 | -------------------------------------------------------------------------------- /assets/bootstrap/css/bootstrap-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAcA;;;;;;EAME,0CAAA;ECgDA,6FAAA;EACQ,qFAAA;EC5DT;AFgBC;;;;;;;;;;;;EC2CA,0DAAA;EACQ,kDAAA;EC7CT;AFVD;;;;;;EAiBI,mBAAA;EECH;AFiCC;;EAEE,wBAAA;EE/BH;AFoCD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EAgC2C,2BAAA;EAA2B,oBAAA;EEzBvE;AFLC;;EAEE,2BAAA;EACA,8BAAA;EEOH;AFJC;;EAEE,2BAAA;EACA,uBAAA;EEMH;AFHC;;;EAGE,2BAAA;EACA,wBAAA;EEKH;AFUD;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEgCD;AF9BC;;EAEE,2BAAA;EACA,8BAAA;EEgCH;AF7BC;;EAEE,2BAAA;EACA,uBAAA;EE+BH;AF5BC;;;EAGE,2BAAA;EACA,wBAAA;EE8BH;AFdD;EGrDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEyDD;AFvDC;;EAEE,2BAAA;EACA,8BAAA;EEyDH;AFtDC;;EAEE,2BAAA;EACA,uBAAA;EEwDH;AFrDC;;;EAGE,2BAAA;EACA,wBAAA;EEuDH;AFtCD;EGtDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEkFD;AFhFC;;EAEE,2BAAA;EACA,8BAAA;EEkFH;AF/EC;;EAEE,2BAAA;EACA,uBAAA;EEiFH;AF9EC;;;EAGE,2BAAA;EACA,wBAAA;EEgFH;AF9DD;EGvDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE2GD;AFzGC;;EAEE,2BAAA;EACA,8BAAA;EE2GH;AFxGC;;EAEE,2BAAA;EACA,uBAAA;EE0GH;AFvGC;;;EAGE,2BAAA;EACA,wBAAA;EEyGH;AFtFD;EGxDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEoID;AFlIC;;EAEE,2BAAA;EACA,8BAAA;EEoIH;AFjIC;;EAEE,2BAAA;EACA,uBAAA;EEmIH;AFhIC;;;EAGE,2BAAA;EACA,wBAAA;EEkIH;AFxGD;;EChBE,oDAAA;EACQ,4CAAA;EC4HT;AFnGD;;EGzEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHwEF,2BAAA;EEyGD;AFvGD;;;EG9EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8EF,2BAAA;EE6GD;AFpGD;EG3FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ6GA,oBAAA;EC/CA,6FAAA;EACQ,qFAAA;EC0JT;AF/GD;;EG3FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECoKT;AF5GD;;EAEE,gDAAA;EE8GD;AF1GD;EG9GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EF+OD;AFlHD;;EG9GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0LT;AF5HD;;EAYI,2CAAA;EEoHH;AF/GD;;;EAGE,kBAAA;EEiHD;AF5FD;EAfI;;;IAGE,aAAA;IG3IF,0EAAA;IACA,qEAAA;IACA,+FAAA;IAAA,wEAAA;IACA,6BAAA;IACA,wHAAA;ID0PD;EACF;AFxGD;EACE,+CAAA;ECzGA,4FAAA;EACQ,oFAAA;ECoNT;AFhGD;EGpKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EE4GD;AFvGD;EGrKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EEoHD;AF9GD;EGtKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EE4HD;AFrHD;EGvKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EEoID;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AFlHD;EGzLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AFxHD;EG1LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqTH;AF9HD;EG3LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4TH;AFpID;EG5LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmUH;AF1ID;EG7LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0UH;AF7ID;EGhKI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDgTH;AFzID;EACE,oBAAA;EC5JA,oDAAA;EACQ,4CAAA;ECwST;AF1ID;;;EAGE,+BAAA;EGjNE,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+MF,uBAAA;EEgJD;AFrJD;;;EAQI,mBAAA;EEkJH;AFxID;ECjLE,mDAAA;EACQ,2CAAA;EC4TT;AFlID;EG1OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED+WH;AFxID;EG3OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDsXH;AF9ID;EG5OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED6XH;AFpJD;EG7OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDoYH;AF1JD;EG9OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2YH;AFhKD;EG/OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkZH;AFhKD;EGtPI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHoPF,uBAAA;ECzMA,2FAAA;EACQ,mFAAA;ECgXT","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} -------------------------------------------------------------------------------- /assets/bootstrap/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.4 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /assets/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /assets/bootstrap/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.4 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); -------------------------------------------------------------------------------- /assets/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/assets/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/javascripts/scale.fix.js: -------------------------------------------------------------------------------- 1 | var metas = document.getElementsByTagName('meta'); 2 | var i; 3 | if (navigator.userAgent.match(/iPhone/i)) { 4 | for (i=0; i **Compatibility Note** 13 | > 14 | > This document aims to describe the behaviour of pywb 2.6.7 running on Python 3.7 or later. Older versions of pywb 15 | > or Python can produce different output. 16 | 17 | ## Overview 18 | 19 | [TODO: To be written] 20 | 21 | ## Encoding the request method 22 | 23 | If the request method is not `GET` it must be appended as the value of query parameter `__wb_method`. 24 | 25 | If the URL does not have a query string a `?` must be added: 26 | 27 | http://example.org/ => http://example.org/?__wb_method=POST 28 | 29 | If the URL already has a query string the `__wb_method` parameter must be added at the end after a `&` separator: 30 | 31 | http://example.org/?page=1 => http://example.org/?page=1&__wb_method=POST 32 | 33 | Even if the query string already ends in `&` another separator must still be added: 34 | 35 | http://example.org/?foo& => http://example.org/?foo&&__wb_method=POST 36 | 37 | ## Encoding the request body 38 | 39 | Encoding the request body depends on the content-type. 40 | 41 | | Content-Type | Primary Encoding | Fallback Encoding | 42 | |-----------------------------------|------------------|-------------------| 43 | | application/json | JSON | | 44 | | application/x-amf | AMF | | 45 | | application/x-www-form-urlencoded | urlencoded form | binary | 46 | | multipart/* | multipart form | binary | 47 | | text/plain | JSON | binary | 48 | | * | binary | | 49 | 50 | ### AMF request body encoding 51 | 52 | [TODO: To be written] 53 | 54 | ### Binary request body encoding 55 | 56 | The request body is encoded as Base64 ([RFC 4648](https://tools.ietf.org/html/rfc4648)) and appended to the query string as the `__wb_post_data` parameter. 57 | 58 | > **Example** 59 | > 60 | > Original request: 61 | > 62 | > POST /chat HTTP/1.0 63 | > Host: example.org 64 | > Content-Length: 5 65 | > 66 | > hello 67 | > 68 | > Encoded URL: 69 | > 70 | > http://example.org/chat?__wb_method=POST&__wb_post_data=aGVsbG8= 71 | 72 | ### Encoding a urlencoded form request body 73 | 74 | Decode the body to a string using UTF-8, percent decoded the string, **percent plus encode** it and then append the 75 | result to the output. 76 | If a UTF-8 decoding error occurs then the binary encoding method must be used instead. 77 | 78 | [TODO: example] 79 | 80 | ### Encoding a multipart form request body 81 | 82 | The body must be decoded as form data per [RFC 2388](https://datatracker.ietf.org/doc/html/rfc2388) and then 83 | percent plus encoded. If the body is not a valid multipart/form-data message then the binary encoding method 84 | must be used instead. 85 | 86 | [TODO: example] 87 | 88 | ### Encoding a JSON request body 89 | 90 | The request must be parsed as JSON ([RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259)) and then apply 91 | the following algorithm with an empty string as the initial value of *name*. 92 | 93 | To **encode a JSON *value***, given a *name* and an initially-empty map *nameCounts* of strings to integers: 94 | 95 | 1. If *value* is a JSON object: 96 | 1. Recursively encode each member of the object passing member's name as *name* and the member's value as *value*. 97 | 2. If *value* is a JSON array: 98 | 1. Recursively encode each element of the array passing the current value of *name* as 99 | *name* and the value of the element as *value*. 100 | 3. Otherwise: 101 | 1. Define the string *encodedValue* as: 102 | 1. If *value* is JSON true then the string "True". 103 | 2. If *value* is JSON false then the string "False". 104 | 3. If *value* is JSON null then the string "None". 105 | 4. If *value* is a JSON string then the result of **percent plus encoding** the string. 106 | 5. If *value* is a JSON number then the number encoded as a decimal string. 107 | 2. If *nameCounts* contains the integer *count* for *name*: 108 | 1. Increment *count* by 1. 109 | 2. Store *count* as the new count for *name* in *nameCounts*. 110 | 3. Append the string "&*name*.*count*_=*encodedValue*" to the output. 111 | 3. Otherwise, if *nameCounts* does not contain *name*: 112 | 1. Store the integer 1 in *nameCounts* for *name*. 113 | 2. Append the string "&*name*=*encodedValue*" to the output. 114 | 115 | > **Example** 116 | > 117 | > Original request: 118 | > 119 | > POST /events HTTP/1.0 120 | > Host: example.org 121 | > Content-Type: application/json 122 | > 123 | > { 124 | > "type": "event", 125 | > "id": 44.0, 126 | > "values": [true, false, null], 127 | > "source": { 128 | > "type": "component", 129 | > "id": "a+b&c= d", 130 | > "values": [3, 4] 131 | > } 132 | > } 133 | > 134 | > Encoded URL: 135 | > 136 | > http://example.org/events?__wb_method=POST&type=event&id=44.0&values=True 137 | > &values.2_=False&values.3_=None&type.2_=component&id.2_=a%2Bb%26c%3D+d 138 | > &values.4_=3&values.5_=4 139 | 140 | ## Appendix 141 | 142 | ### Percent plus encoding 143 | 144 | To **percent plus encode a string**, first encode it as UTF-8 and then **percent plus encode** the resulting byte sequence. 145 | 146 | To **percent plus encode a byte sequence**, for each byte in the input sequence: 147 | 148 | 1. If the byte falls within the following ASCII character ranges append it to the output as is. 149 | 150 | '0'-'9', 'a'-'z', 'A'-'Z', '-', '.', '_', '~' 151 | 152 | 2. If the byte is the ASCII space character (' ') append the ASCII plus character ('+') to the output. 153 | 154 | 3. Otherwise, append ASCII percent character ('%') to the output and followed by the value of the byte formatted as 155 | two uppercase hexadecimal digits. 156 | 157 | > **Compatibility Note** 158 | > 159 | > Prior to Python 3.7 the character "~" was percent encoded. -------------------------------------------------------------------------------- /guidelines/warc-fields/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: List of WARC Fields 3 | type: guidelines 4 | --- 5 | 6 | This page attempts to track all known WARC fields whether standard, proposed for 7 | standardisation or just used in the wild without formal specification. 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {%- assign refs = site.data.refs %} 20 | {%- for field in site.data.warc_fields %} 21 | {%- assign spec_base = field.spec | replace: "#", "/" | split: "/" | first %} 22 | {%- if refs[field.spec] %} 23 | {%- assign lower_name = field.name | downcase %} 24 | {%- assign spec_url = refs[field.spec] | append: "#" | append: lower_name %} 25 | {%- else %} 26 | {%- if refs[spec_base] %} 27 | {%- assign spec_url = field.spec | replace_first: spec_base, refs[spec_base] %} 28 | {%- endif %} 29 | {%- endif %} 30 | {%- assign status = field.status %} 31 | {%- unless status %} 32 | {%- if field.since %} 33 | {%- assign status = "standard" %} 34 | {%- endif %} 35 | {%- endunless %} 36 | 37 | 38 | 39 | 40 | 41 | 42 | {%- endfor %} 43 | 44 |
FieldStatusSinceSpecification
{{ field.name }}{{ status }}{{ field.since }}{{ field.spec | split: "#" | first }}
45 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Welcome 3 | --- 4 | 5 | Introduction 6 | ------------ 7 | 8 | This site and the corresponding [GitHub repository](https://github.com/iipc/warc-specifications) are being used by IIPC members and other interested parties to track and improve various specifications and proposals relating to web archiving. 9 | 10 | In particular, [a HTML version](./specifications/warc-format/warc-1.1/) of [the official specification of the WARC format](http://bibnum.bnf.fr/WARC/) is hosted here, and we will develop extensions and forthcoming versions of the specification on this site, using GitHub [issues](https://github.com/iipc/warc-specifications/issues) and [pull requests](https://github.com/iipc/warc-specifications/pulls). 11 | 12 | We also intend to publish and develop appropriate guidelines for web archiving, covering areas where common practice should be encouraged prior to any attempt at formal standardisation, e.g. through ISO. 13 | 14 | How to contribute 15 | ----------------- 16 | 17 | We are in the early staged of working out how best to develop these standards and guidelines. 18 | 19 | * Use GitHub to review the [open issues](https://github.com/iipc/warc-specifications/issues) or [add new issues or comments](https://github.com/iipc/warc-specifications/issues). 20 | * Use the issue tags to identify the specification the issue applies to. 21 | * Contribute modifications to site by editing the pages on GitHub and submitting pull requests. 22 | * Every page has icons at the top and bottom that let you view and edit that page on GitHub. 23 | * Get in touch! 24 | * Use the IIPC Members mailing list, or [openwayback-dev](https://groups.google.com/forum/#!forum/openwayback-dev) otherwise. 25 | * *PROPOSAL:* Set up a dedicated, public mailing list? 26 | 27 | 28 | ### Specifications ### 29 | 30 | {% assign sorted_pages = site.pages | sort:"title" %} 31 | 32 | 39 | 40 | Specification Status 41 | -------------------- 42 | 43 | The possible statuses of the specifications are as follows: 44 | 45 | Proposed 46 | : Document is for review and discussion, may change. 47 | 48 | Adopted 49 | : IIPC members have adopted the proposal and it may eventually be incorporated into an official standard. Whether *de facto* or official, it represents current best practices. 50 | 51 | Standard 52 | : Has been incorporated into an offical standard. 53 | 54 | -------------------------------------------------------------------------------- /primers/web-archive-formats/cdx.unsorted.out: -------------------------------------------------------------------------------- 1 | CDX N b a m s k r M V g 2 | iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 20150708215513 http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt text/plain; charset=utf-8 200 - - - 1260 hello-world.warc 3 | -------------------------------------------------------------------------------- /primers/web-archive-formats/hello-world.txt: -------------------------------------------------------------------------------- 1 | --- 2 | layout: plaintext 3 | --- 4 | Hello World 5 | -------------------------------------------------------------------------------- /primers/web-archive-formats/hello-world.warc: -------------------------------------------------------------------------------- 1 | WARC/1.0 2 | WARC-Type: warcinfo 3 | Content-Type: application/warc-fields 4 | WARC-Date: 2015-07-08T21:55:13Z 5 | WARC-Record-ID: 6 | WARC-Filename: hello-world.warc.gz 7 | WARC-Block-Digest: sha1:ECBYA457KB6YATF4WP7KDF6ZXXYGADEC 8 | Content-Length: 300 9 | 10 | software: Wget/1.16.2 (darwin14.1.0) 11 | format: WARC File Format 1.0 12 | conformsTo: http://bibnum.bnf.fr/WARC/WARC_ISO_28500_version1_latestdraft.pdf 13 | robots: classic 14 | wget-arguments: "--warc-file" "hello-world" "http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt" 15 | 16 | 17 | 18 | WARC/1.0 19 | WARC-Type: request 20 | WARC-Target-URI: http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 21 | Content-Type: application/http;msgtype=request 22 | WARC-Date: 2015-07-08T21:55:13Z 23 | WARC-Record-ID: 24 | WARC-IP-Address: 185.31.18.133 25 | WARC-Warcinfo-ID: 26 | WARC-Block-Digest: sha1:KPXGFZD2D2326ZWSEZP3S2MJ6GMBCD4E 27 | Content-Length: 207 28 | 29 | GET /warc-specifications/primers/web-archive-formats/hello-world.txt HTTP/1.1 30 | User-Agent: Wget/1.16.2 (darwin14.1.0) 31 | Accept: */* 32 | Accept-Encoding: identity 33 | Host: iipc.github.io 34 | Connection: Keep-Alive 35 | 36 | 37 | 38 | WARC/1.0 39 | WARC-Type: response 40 | WARC-Record-ID: 41 | WARC-Warcinfo-ID: 42 | WARC-Concurrent-To: 43 | WARC-Target-URI: http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 44 | WARC-Date: 2015-07-08T21:55:13Z 45 | WARC-IP-Address: 185.31.18.133 46 | WARC-Block-Digest: sha1:3OMBZSE4IFAWD7XYWIYPAF575DHKSV4M 47 | WARC-Payload-Digest: sha1:XMABAYFTCASBJ5QATNBILSXH6PSZEMG4 48 | Content-Type: application/http;msgtype=response 49 | Content-Length: 494 50 | 51 | HTTP/1.1 200 OK 52 | Server: GitHub.com 53 | Content-Type: text/plain; charset=utf-8 54 | Last-Modified: Wed, 08 Jul 2015 21:53:08 GMT 55 | Access-Control-Allow-Origin: * 56 | Expires: Wed, 08 Jul 2015 22:05:13 GMT 57 | Cache-Control: max-age=600 58 | Content-Length: 13 59 | Accept-Ranges: bytes 60 | Date: Wed, 08 Jul 2015 21:55:13 GMT 61 | Via: 1.1 varnish 62 | Age: 0 63 | Connection: keep-alive 64 | X-Served-By: cache-lcy1127-LCY 65 | X-Cache: MISS 66 | X-Cache-Hits: 0 67 | X-Timer: S1436392513.648949,VS0,VE165 68 | Vary: Accept-Encoding 69 | 70 | Hello World 71 | 72 | 73 | 74 | WARC/1.0 75 | WARC-Type: metadata 76 | WARC-Record-ID: 77 | WARC-Warcinfo-ID: 78 | WARC-Target-URI: metadata://gnu.org/software/wget/warc/MANIFEST.txt 79 | WARC-Date: 2015-07-08T21:55:13Z 80 | WARC-Block-Digest: sha1:B2CRHOOYITJQSOUNGVNII5B54SBG63P2 81 | Content-Type: text/plain 82 | Content-Length: 48 83 | 84 | 85 | 86 | 87 | WARC/1.0 88 | WARC-Type: resource 89 | WARC-Record-ID: 90 | WARC-Warcinfo-ID: 91 | WARC-Concurrent-To: 92 | WARC-Target-URI: metadata://gnu.org/software/wget/warc/wget_arguments.txt 93 | WARC-Date: 2015-07-08T21:55:13Z 94 | WARC-Block-Digest: sha1:KTV2WSNW5VSOLYZINAXKR3LXV7T4MMGI 95 | Content-Type: text/plain 96 | Content-Length: 117 97 | 98 | "--warc-file" "hello-world" "http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt" 99 | 100 | 101 | WARC/1.0 102 | WARC-Type: resource 103 | WARC-Record-ID: 104 | WARC-Warcinfo-ID: 105 | WARC-Concurrent-To: 106 | WARC-Target-URI: metadata://gnu.org/software/wget/warc/wget.log 107 | WARC-Date: 2015-07-08T21:55:13Z 108 | WARC-Block-Digest: sha1:3NZMVDB5DUHNA332E57M2IS5FUFIJ24E 109 | Content-Type: text/plain 110 | Content-Length: 504 111 | 112 | Opening WARC file 'hello-world.warc.gz'. 113 | 114 | --2015-07-08 22:55:13-- http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 115 | Resolving iipc.github.io... 185.31.18.133 116 | Connecting to iipc.github.io|185.31.18.133|:80... connected. 117 | HTTP request sent, awaiting response... 200 OK 118 | Length: 13 [text/plain] 119 | Saving to: 'hello-world.txt.1' 120 | 121 | 0K 100% 705K=0s 122 | 123 | 2015-07-08 22:55:13 (705 KB/s) - 'hello-world.txt.1' saved [13/13] 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /primers/web-archive-formats/hello-world.warc.cdx: -------------------------------------------------------------------------------- 1 | CDX N b a m s k r M S V g 2 | io,github,iipc)/warc-specifications/primers/web-archive-formats/hello-world.txt 20150708215513 http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt text/plain 200 XMABAYFTCASBJ5QATNBILSXH6PSZEMG4 - - 1085 1260 hello-world.warc 3 | metadata)/gnu.org/software/wget/warc/manifest.txt 20150708215513 metadata://gnu.org/software/wget/warc/MANIFEST.txt text/plain - B2CRHOOYITJQSOUNGVNII5B54SBG63P2 - - 419 2349 hello-world.warc 4 | metadata)/gnu.org/software/wget/warc/wget_arguments.txt 20150708215513 metadata://gnu.org/software/wget/warc/wget_arguments.txt text/plain - KTV2WSNW5VSOLYZINAXKR3LXV7T4MMGI - - 564 2772 hello-world.warc 5 | metadata)/gnu.org/software/wget/warc/wget.log 20150708215513 metadata://gnu.org/software/wget/warc/wget.log text/plain - 3NZMVDB5DUHNA332E57M2IS5FUFIJ24E - - 941 3340 hello-world.warc 6 | -------------------------------------------------------------------------------- /primers/web-archive-formats/hello-world.warc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/primers/web-archive-formats/hello-world.warc.gz -------------------------------------------------------------------------------- /primers/web-archive-formats/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction to web archive formats 3 | type: primer 4 | strand: warc-format 5 | --- 6 | 7 | ~~~ 8 | UNDER CONSTRUCTION 9 | ~~~ 10 | 11 | Archiving a URL 12 | --------------- 13 | 14 | [hello-world.txt](./hello-world.txt) 15 | 16 | What's in the WARC? 17 | ------------------- 18 | 19 | [hello-world.warc](./hello-world.warc) 20 | 21 | ~~~ 22 | WARC-Type: warcinfo 23 | WARC-Type: request 24 | WARC-Type: response 25 | WARC-Type: metadata 26 | WARC-Type: resource 27 | WARC-Type: resource 28 | ~~~ 29 | 30 | Finding individual records 31 | -------------------------- 32 | 33 | $ jwattools cdx hello-world.warc 34 | 35 | or 36 | 37 | $ cdx-indexer hello-world.warc > hello-world.warc.cdx 38 | 39 | which means we can pick out the response record like this: 40 | 41 | $ tail -c +1261 hello-world.warc | head -c 1085 42 | 43 | ~~~ 44 | WARC/1.0 45 | WARC-Type: response 46 | WARC-Record-ID: 47 | WARC-Warcinfo-ID: 48 | WARC-Concurrent-To: 49 | WARC-Target-URI: http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 50 | WARC-Date: 2015-07-08T21:55:13Z 51 | WARC-IP-Address: 185.31.18.133 52 | WARC-Block-Digest: sha1:3OMBZSE4IFAWD7XYWIYPAF575DHKSV4M 53 | WARC-Payload-Digest: sha1:XMABAYFTCASBJ5QATNBILSXH6PSZEMG4 54 | Content-Type: application/http;msgtype=response 55 | Content-Length: 494 56 | 57 | HTTP/1.1 200 OK 58 | Server: GitHub.com 59 | Content-Type: text/plain; charset=utf-8 60 | Last-Modified: Wed, 08 Jul 2015 21:53:08 GMT 61 | Access-Control-Allow-Origin: * 62 | Expires: Wed, 08 Jul 2015 22:05:13 GMT 63 | Cache-Control: max-age=600 64 | Content-Length: 13 65 | Accept-Ranges: bytes 66 | Date: Wed, 08 Jul 2015 21:55:13 GMT 67 | Via: 1.1 varnish 68 | Age: 0 69 | Connection: keep-alive 70 | X-Served-By: cache-lcy1127-LCY 71 | X-Cache: MISS 72 | X-Cache-Hits: 0 73 | X-Timer: S1436392513.648949,VS0,VE165 74 | Vary: Accept-Encoding 75 | 76 | Hello World 77 | 78 | ~~~ 79 | 80 | How playback works 81 | ------------------ 82 | 83 | CDX, sorted, search. Gets filename, offset. 84 | grab WARC record 85 | Modify as needed 86 | Playback 87 | 88 | Comparison with ARC files 89 | ------------------------- 90 | 91 | ... 92 | 93 | 94 | 95 | 96 | Further Reading 97 | --------------- 98 | 99 | The official WARC specification is maintained by ISO. The draft versions are hosted at , and mirrored here. 100 | 101 | For introductory information about the WARC format, see: 102 | 103 | * [Web ARChive -- Wikipedia](http://en.wikipedia.org/wiki/Web_ARChive) 104 | * [WARC -- File Formats Wiki](http://fileformats.archiveteam.org/wiki/WARC) 105 | * [WARC, Web ARChive file format -- Sustainability of Digital Formats (Library of Congress)](http://www.digitalpreservation.gov/formats/fdd/fdd000236.shtml) 106 | 107 | 108 | 109 | Appendix: Tools used 110 | -------------------- 111 | 112 | This section outlines the tools and commands that were used to generate the example files. 113 | 114 | ### Making the WARC ### 115 | 116 | To create a WARC, we used [wget](http://www.gnu.org/software/wget/): 117 | 118 | $ wget --warc-file hello-world http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 119 | 120 | ...which created the compressed [hello-world.warc.gz](./hello-world.warc.gz) file. These special block-compressed files are often used directly, but in this primer, we uncompress it so we can see what's going on: 121 | 122 | $ gunzip hello-world.warc.gz 123 | 124 | ...leaving us with [hello-world.warc](./hello-world.warc). 125 | 126 | ### Making the CDX ### 127 | 128 | To generate a content index (CDX) file, we have at least two options. There's [JWATTools](https://sbforge.org/display/JWAT/JWAT-Tools): 129 | 130 | $ jwattools cdx hello-world.warc 131 | 132 | ...(which created [cdx.unsorted.out](./cdx.unsorted.out)), or the ```cdx-indexer``` from [OpenWayback](https://github.com/iipc/openwayback): 133 | 134 | $ cdx-indexer hello-world.warc > hello-world.warc.cdx 135 | 136 | ...(which created [hello-world.warc.cdx](./hello-world.warc.cdx)). 137 | 138 | ### Extracting a WARC record ### 139 | 140 | Once we've identified the offset and length of a particular record (in this case, an offset of 1260 bytes and a length of 1085 bytes), we can snip out an individual record like this: 141 | 142 | $ tail -c +1261 hello-world.warc | head -c 1085 143 | 144 | 145 | ### Making a Memento ### 146 | 147 | To create an archived version of the page that could be played back properly, I used the Internet Archive's "Save" feature by going to this URL in my web browser: 148 | 149 | http://web.archive.org/save/http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 150 | 151 | ...which created this snapshot: 152 | 153 | http://web.archive.org/web/20150709104019/http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 154 | 155 | From here, we can use ```wget``` to look at what gets played back: 156 | 157 | $ wget --server-response http://web.archive.org/web/20150709104019/http://iipc.github.io/warc-specifications/primers/web-archive-formats/hello-world.txt 158 | 159 | ...giving: 160 | 161 | ~~~ 162 | HTTP/1.0 200 OK 163 | Server: Tengine/2.1.0 164 | Date: Thu, 09 Jul 2015 10:41:38 GMT 165 | Content-Type: text/plain;charset=utf-8 166 | Content-Length: 13 167 | Set-Cookie: wayback_server=19; Domain=archive.org; Path=/; Expires=Sat, 08-Aug-15 10:41:38 GMT; 168 | Memento-Datetime: Thu, 09 Jul 2015 10:40:19 GMT 169 | Link: ; rel="original", ; rel="timemap"; type="application/link-format", ; rel="timegate", ; rel="first last memento"; datetime="Thu, 09 Jul 2015 10:40:19 GMT" 170 | X-Archive-Orig-x-cache-hits: 0 171 | X-Archive-Orig-x-served-by: cache-sjc3122-SJC 172 | X-Archive-Orig-cache-control: max-age=600 173 | X-Archive-Orig-content-type: text/plain; charset=utf-8 174 | X-Archive-Orig-server: GitHub.com 175 | X-Archive-Orig-age: 0 176 | X-Archive-Orig-x-timer: S1436438419.302921,VS0,VE141 177 | X-Archive-Orig-access-control-allow-origin: * 178 | X-Archive-Orig-last-modified: Wed, 08 Jul 2015 22:33:03 GMT 179 | X-Archive-Orig-expires: Thu, 09 Jul 2015 10:50:19 GMT 180 | X-Archive-Orig-accept-ranges: bytes 181 | X-Archive-Orig-vary: Accept-Encoding 182 | X-Archive-Orig-connection: close 183 | X-Archive-Orig-date: Thu, 09 Jul 2015 10:40:19 GMT 184 | X-Archive-Orig-via: 1.1 varnish 185 | X-Archive-Orig-content-length: 13 186 | X-Archive-Orig-x-cache: MISS 187 | X-Archive-Wayback-Perf: {"IndexLoad":359,"IndexQueryTotal":359,"RobotsFetchTotal":1,"RobotsRedis":1,"RobotsTotal":1,"Total":371,"WArcResource":10} 188 | X-Archive-Playback: 1 189 | X-Page-Cache: MISS 190 | ~~~ 191 | -------------------------------------------------------------------------------- /specifications/cdx-format/cdx-2006/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The CDX File Format 3 | type: specification 4 | status: adopted 5 | version: (c.2006) 6 | numbered: false 7 | latest: false 8 | version-of: cdx-format 9 | --- 10 | 11 | A CDX file consists of individual lines of text, each of which summarizes a single web document. 12 | The first line in the file is a legend for interpreting the data, and the following lines contain the data for referencing the corresponding pages within the host. The first character of the file is the field delimiter used in the rest of the file. This is followed by the literal "CDX" and then individual field markers as defined below. 13 | 14 | The following is a sample from a CDX file: 15 | 16 | ~~~ 17 | CDX A b e a m s c k r V v D d g M n 18 | 0-0-0checkmate.com/Bugs/Bug_Investigators.html 20010424210551 209.52.183.152 0-0-0checkmate.com:80/Bugs/Bug_Investigators.html text/html 200 58670fbe7432c5bed6f3dcd7ea32b221 a725a64ad6bb7112c55ed26c9e4cef63 - 17130110 59129865 1927657 6501523 DE_crawl6.20010424210458 - 5750 19 | 0-0-0checkmate.com/Bugs/Insect_Habitats.html 20010424210312 209.52.183.152 0-0-0checkmate.com:80/Bugs/Insect_Habitats.html text/html 200 d520038e97d7538855715ddcba613d41 30025030eeb72e9345cc2ddf8b5ff218 - 47392928 145482381 4426829 15345336 DE_crawl3.20010424210104 - 6356 20 | 0-0-0checkmate.com/Hot/index.html 20010424212403 209.52.183.152 0-0-0checkmate.com:80/Hot/index.html text/html 200 52242643710547ff4ce2605ed03ed9e2 b06d037c06e7ffd7afc6db270aca7645 - 21301376 62305547 1855363 6627262 DE_crawl6.20010424212307 - 6317 21 | ~~~ 22 | 23 | Field Specifications 24 | -------------------- 25 | 26 | The default first line of a CDX file is: 27 | 28 | ~~~ 29 | CDX A b e a m s c k r V v D d g M n 30 | ~~~ 31 | 32 | The letters use in dat files and cdx files are as follows: 33 | 34 | ~~~ 35 | A canonized url 36 | B news group 37 | C rulespace category *** 38 | D compressed dat file offset 39 | F canonized frame 40 | G multi-columm language description (* soon) 41 | H canonized host 42 | I canonized image 43 | J canonized jump point 44 | K Some weird FBIS what's changed kinda thing 45 | L canonized link 46 | M meta tags (AIF) * 47 | N massaged url 48 | P canonized path 49 | Q language string 50 | R canonized redirect 51 | U uniqness *** 52 | V compressed arc file offset * 53 | X canonized url in other href tages 54 | Y canonized url in other src tags 55 | Z canonized url found in script 56 | a original url ** 57 | b date ** 58 | c old style checksum * 59 | d uncompressed dat file offset 60 | e IP ** 61 | f frame * 62 | g file name 63 | h original host 64 | i image * 65 | j original jump point 66 | k new style checksum * 67 | l link * 68 | m mime type of original document * 69 | n arc document length * 70 | o port 71 | p original path 72 | r redirect * 73 | s response code * 74 | t title * 75 | v uncompressed arc file offset * 76 | x url in other href tages * 77 | y url in other src tags * 78 | z url found in script * 79 | # comment 80 | ~~~ 81 | 82 | \* in alexa-made dat file 83 | \** in alexa-made dat file meta-data line 84 | \*** future data 85 | 86 | Document History 87 | ---------------- 88 | 89 | *2015-07-09* -- Imported from the Internet Archive [CDX File Format](http://web.archive.org/web/20031226073353/http://www.archive.org/web/researcher/cdx_file_format.php) and [CDX Legend](http://web.archive.org/web/20031226073353/http://www.archive.org/web/researcher/cdx_legend.php) documents. 90 | -------------------------------------------------------------------------------- /specifications/cdx-format/cdx-2015/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: The CDX File Format 3 | type: specification 4 | status: proposed 5 | version: (2015) 6 | numbered: false 7 | latest: true 8 | version-of: cdx-format 9 | previous-version: (c.2006) 10 | --- 11 | 12 | > FWIW, IA has been using this 11-field format as pretty much standard for new > CDX files: 13 | > 14 | > CDX N b a m s k r M S V g 15 | > 16 | > (You can see it as the default in their [CDX-Writer](https://github.com/internetarchive/CDX-Writer/blame/2e044a5719d45e46fdb5dbc21be3a1025e908143/cdx_writer.py#L862)) 17 | > 18 | > An older 9-field format that was in use a few years back: 19 | > 20 | > CDX N b a m s k r V g 21 | > 22 | > I think most of the other fields are obsolete, and date back to an even older Alexa .dat format. 23 | 24 |
 25 | CDX N b a m s k r M S V g
 26 | au,gov,financeminister)/ 20150914222034 http://www.financeminister.gov.au/ text/html 200 ZMSA5TNJUKKRYAIM5PRUJLL24DV7QYOO - - 83848 117273 WEB-20150914222031256-00000-43190~heritrix.nla.gov.au~8443.warc.gz
 27 | 
28 | 29 | ---- 30 | 31 | A CDX file consists of individual lines of text, each of which summarizes a single web document. 32 | The first line in the file is a legend for interpreting the data, and the following lines contain the data for referencing the corresponding pages within the host. The first character of the file is the field delimiter used in the rest of the file. This is followed by the literal "CDX" and then individual field markers as defined below. 33 | 34 | The following is a sample from a CDX file: 35 | 36 | ~~~ 37 | CDX A b e a m s c k r V v D d g M n 38 | 0-0-0checkmate.com/Bugs/Bug_Investigators.html 20010424210551 209.52.183.152 0-0-0checkmate.com:80/Bugs/Bug_Investigators.html text/html 200 58670fbe7432c5bed6f3dcd7ea32b221 a725a64ad6bb7112c55ed26c9e4cef63 - 17130110 59129865 1927657 6501523 DE_crawl6.20010424210458 - 5750 39 | 0-0-0checkmate.com/Bugs/Insect_Habitats.html 20010424210312 209.52.183.152 0-0-0checkmate.com:80/Bugs/Insect_Habitats.html text/html 200 d520038e97d7538855715ddcba613d41 30025030eeb72e9345cc2ddf8b5ff218 - 47392928 145482381 4426829 15345336 DE_crawl3.20010424210104 - 6356 40 | 0-0-0checkmate.com/Hot/index.html 20010424212403 209.52.183.152 0-0-0checkmate.com:80/Hot/index.html text/html 200 52242643710547ff4ce2605ed03ed9e2 b06d037c06e7ffd7afc6db270aca7645 - 21301376 62305547 1855363 6627262 DE_crawl6.20010424212307 - 6317 41 | ~~~ 42 | 43 | Field Specifications 44 | -------------------- 45 | 46 | The default first line of a CDX file is: 47 | 48 | ~~~ 49 | CDX A b e a m s c k r V v D d g M n 50 | ~~~ 51 | 52 | The letters use in dat files and cdx files are as follows: 53 | 54 | ~~~ 55 | A canonized url 56 | B news group 57 | C rulespace category *** 58 | D compressed dat file offset 59 | F canonized frame 60 | G multi-column language description (* soon) 61 | H canonized host 62 | I canonized image 63 | J canonized jump point 64 | K Some weird FBIS what's changed kinda thing 65 | L canonized link 66 | M meta tags (AIF) * 67 | N massaged url 68 | P canonized path 69 | Q language string 70 | R canonized redirect 71 | S compressed record size 72 | U uniqueness *** 73 | V compressed arc file offset * 74 | X canonized url in other href tags 75 | Y canonized url in other src tags 76 | Z canonized url found in script 77 | a original url ** 78 | b date ** 79 | c old style checksum * 80 | d uncompressed dat file offset 81 | e IP ** 82 | f frame * 83 | g file name 84 | h original host 85 | i image * 86 | j original jump point 87 | k new style checksum * 88 | l link * 89 | m mime type of original document * 90 | n arc document length * 91 | o port 92 | p original path 93 | r redirect * 94 | s response code * 95 | t title * 96 | v uncompressed arc file offset * 97 | x url in other href tages * 98 | y url in other src tags * 99 | z url found in script * 100 | # comment 101 | 102 | * in alexa-made dat file 103 | ** in alexa-made dat file meta-data line 104 | *** future data 105 | ~~~ 106 | 107 | Document History 108 | ---------------- 109 | 110 | *2020-09-26* -- Minor, fixed some typos. 111 | 112 | *2015-11-30* -- Added example CDX-11 record with tooltips and added 'S compressed record size' to the list. 113 | 114 | *2015-07-10* -- Copied from v.2006 and added notes from [Ilya Kreymer](https://github.com/ikreymer). 115 | 116 | *2015-07-09* -- Imported from the Internet Archive [CDX File Format](http://web.archive.org/web/20031226073353/http://www.archive.org/web/researcher/cdx_file_format.php) and [CDX Legend](http://web.archive.org/web/20031226073353/http://www.archive.org/web/researcher/cdx_legend.php) documents. 117 | -------------------------------------------------------------------------------- /specifications/warc-deduplication/recording-arbitrary-duplicates-1.0.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Proposal for Standardizing the Recording of Arbitrary Duplicates in WARC Files 3 | status: adopted 4 | type: specification 5 | latest: true 6 | version-of: warc-deduplication 7 | version: 1.0 8 | --- 9 | International Internet Preservation Consortium
10 | Harvesting Working Group 11 | 12 | Introduction 13 | ============ 14 | 15 | Periodic harvesting of material on the web is quite likely to produce datasets with some level of duplication. Across time, a given resource is not necessarily modified during the interval between one visit and the next. A company logo is one such example of a resource to remain unmodified several visits to come. Across space, resources at different locations possibly hold identical payloads. A photo that gains popularity on the web is one such example of payload to be duplicated at different locations, such as in media outlets, blogs, and social networks. 16 | 17 | It is important that web archives be able to record varied use of the same content without necessarily storing it repeatedly. 18 | 19 | Background 20 | ========== 21 | 22 | The issue of time-based duplicates[^1], i.e. where the same URI contains the same data at different points in time, has been addressed for some time now. This was reflected when the WARC File Format specification was written, namely in the ‘revisit’ record (see further in Appendix A). 23 | 24 | Such duplicates are easier to handle than spatial duplicates[^2], as it is implicit that the URI of original and duplicate is the same. There is a need to resolve the time of the original’s capture, but that can typically be done by seeking out the latest, non-revisit, record of the URL with a date prior to the revisit record in question. This makes it fairly easy for playback tools (e.g. the Wayback Machine) to deal with collections with time-based deduplication. 25 | 26 | During the 2012 IIPC General Assembly, in the Harvesting Working Group meeting, a report on the amount of duplication in Bibliotheca Alexandrina's web archive suggested the 1-PB collection could be reduced by about 14 percent given full deduplication. The Internet Archive and the French Institut National de l'Audiovisuel (INA) both suggested possibly even higher rates of reduction through deduplication. It is clear that the current, limited ability to handle spatial duplicates is a serious issue. 27 | 28 | While the WARC File Format does recognize the need for deduplication by providing for the 'revisit' record type, which "describes the revisitation of content already archived...for when benefits of reduced storage size or improved cross-referencing of material are desired,"[^3] it does not adequately address “spatial” duplicates. 29 | 30 | Where content is identical, the specification provides for the 'identical-payload-digest'[^4] profile for 'revisit' records. Using this profile, WARC-Payload-Digest is the "value of the digest that was calculated on the payload," and WARC-Refers-To is optionally the record ID of the original record. 31 | 32 | Keeping in mind that most playback tools use an index whereby a URI+timestamp are used to look up specific records, it is clear that the current specification does not make it easy to do “spatial” deduplication, especially as the dataset increases in size. It would be necessary to have, in addition to the usual index, either an index of digests or of WARC record IDs. Neither is typically the case. 33 | 34 | The Proposal 35 | ============ 36 | 37 | Based on discussion at the HWG meeting at the 2013 GA, the HWG recommends that the IIPC adopt the following recommendation for extending the WARC File Format. 38 | 39 | For WARC ‘revisit’ records with WARC-Profile set to ‘identical-payload-digest’[^5], the following fields should be viewed as strongly recommended: 40 | 41 | **WARC-Refers-To-Target-URI** 42 | This value should be equal to the WARC-Target-URI in the WARC record that the current record is considered a duplicate of. 43 | 44 | **WARC-Refers-To-Date** 45 | This value should be equal to the WARC-Date in the WARC record that the current record is considered a duplicate of. 46 | 47 | Additionally, the use of fields specifying the actual WARC file name and offsets where the record can be found should be discouraged as it is potentially very brittle. 48 | 49 | Along with adopting this as a formal recommendation, the IIPC should plan to have this incorporated into the WARC File Format specification when it is next reviewed. 50 | 51 | The IIPC should also encourage members who are engaged in developing tools that interact with WARC files to implement this recommendation. 52 | 53 | Possible Issue 54 | ============== 55 | 56 | Does the standard allow adding new fields not covered by the standard? It is specified in clause 5.5 of the standard that it is possible to add "future-types”. The standard is however entirely silent on adding new header fields. 57 | 58 | * * * * * 59 | 60 | Appendix A 61 | ========== 62 | 63 | What follows is an excerpt from the ISO 28500 WARC File Format specification, namely section 6.7.2. 64 | 65 | 6.7.2 Profile: Identical Payload Digest 66 | --------------------------------------- 67 | 68 | This 'revisit' profile may be used whenever a subsequent consideration of a URI provides payload content which a strong digest function, such as SHA-1, indicates is identical to a previously recorded version. 69 | 70 | To indicate this profile, use the URI: 71 | 72 |         http://netpreserve.org/warc/0.18/revisit/identical-payload-digest 73 | 74 | To report the payload digest used for comparison, a 'revisit' record using this profile shall include a WARC-Payload-Digest field, with a value of the digest that was calculated on the payload. 75 | 76 | A 'revisit' record using this profile may have no record block, in which case a Content-Length of zero must be written. If a record block is present, it shall be interpreted the same as a 'response' record type for the same URI, but truncated to avoid storing the duplicate content. A WARC-Truncated header with reason 'length' shall be used for any identical-digest truncation. 77 | 78 | For records using this profile, the payload is defined as the original payload content whose digest value was unchanged. 79 | 80 | Using a WARC-Refers-To header to identify a specific prior record from which the matching content can be retrieved is recommended, to minimize the risk of misinterpreting the 'revisit' record. 81 | 82 | * * * * * 83 | 84 | [^1]: Also often reffered to as “URL based” duplicates 85 | 86 | [^2]: Also often referred to as “URL agnostic” duplicates 87 | 88 | [^3]: WARC File Format specification, section 6.7 89 | 90 | [^4]: See Appendix A 91 | 92 | [^5]: Formally: http://netpreserve.org/warc/1.0/revisit/identical-payload-digest. See further in Appendix A. 93 | -------------------------------------------------------------------------------- /specifications/warc-deduplication/samples/20130729-heritrix-original.warc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-deduplication/samples/20130729-heritrix-original.warc.gz -------------------------------------------------------------------------------- /specifications/warc-deduplication/samples/20130729-heritrix-revisit-with-http-headers.warc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-deduplication/samples/20130729-heritrix-revisit-with-http-headers.warc.gz -------------------------------------------------------------------------------- /specifications/warc-deduplication/samples/20141124-heritrix-server-not-modified.warc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-deduplication/samples/20141124-heritrix-server-not-modified.warc.gz -------------------------------------------------------------------------------- /specifications/warc-deduplication/samples/20141129-heritrix-original.warc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-deduplication/samples/20141129-heritrix-original.warc.gz -------------------------------------------------------------------------------- /specifications/warc-deduplication/samples/20141129-heritrix-revisit-with-http-headers-and-new-warc-headers.warc.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-deduplication/samples/20141129-heritrix-revisit-with-http-headers-and-new-warc-headers.warc.gz -------------------------------------------------------------------------------- /specifications/warc-format/meetings/2015-05-01-IIPC-GA-WARC-Meeting-Minutes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Minutes of the WARC revision workshop 3 | redirect_from: "specifications/warc-format/meetings/2015-05-01-IIPC-GA-WARC-Meeting-Minutes.html" 4 | --- 5 | 6 | During the General Assembly of the IIPC in Stanford, a workshop has been 7 | held on the revision process. 8 | 9 | The goals of this workshop were to: 10 | 11 | -          present the current status of the WARC standard; 12 | -          present the revision process; 13 | -          identify, discuss and prioritize revision needs; 14 | -          set up an organization and agenda for further work. 15 | 16 | Please look powerpoint presented during the workshop for information on 17 | the WARC standard and its revision process; on the IIPC 18 | website: . 19 | 20 | # Discussions & Decisions # 21 | 22 | We propose here a short summary of the discussion and decisions that 23 | have been taken during the workshop: 24 | 25 | --- 26 | 27 | **1) Modification: the next version of the WARC standard should 28 | be minor, thus named WARC 1.1** 29 | 30 | --- 31 | 32 | **2) [Clarification: scope of the standard ](https://github.com/iipc/warc-specifications/issues/8)** 33 | 34 | **Issue:** the introduction and the scope of the standard mostly 35 | acknowledges use cases related to web archiving. However, some 36 | institutions are using WARC format to store other kinds of digital 37 | content. 38 | 39 | **Decision:** the introduction and the scope should state more precisely 40 | that WARC originated from web archiving community but should also 41 | acknowledge its use in other communities. 42 | 43 | **Action: **Clément Oury to propose a formulation. 44 | 45 | --- 46 | 47 | **3) [Clarification: validity of a WARC file / a WARC record with unknown field (s).](https://github.com/iipc/warc-specifications/issues/9)** 48 | 49 | **Issue:** In 6.1 “WARC record types/General”, it is written “Because 50 | new record types that extend the WARC format may be defined in future 51 | standards, WARC processing software shall skip records of unknown 52 | type”. 53 | 54 | However, it is not explained if a known record type with new named 55 | fields should be valid; and should be processed by WARC reading or 56 | validating tools. 57 | 58 | **Decision:** it should be stated that it is allowed to add new named 59 | fields, as well as new records types. However, it is strongly 60 | recommended to discuss the utility and the relevance of these new named 61 | fields within the right forum (e.g. the IIPC for web archiving) and to 62 | inform the maintenance body of the standard (currently the ISSN 63 | International Centre).  64 | 65 | New named field that are considered relevant and mature by a large 66 | community of WARC users should be added in the next revision of the WARC 67 | standard. 68 | 69 | Besides, the sentence “Because new record types that extend the WARC 70 | format may be defined in future standards…” should be replaced by 71 | “Because new record types that extend the WARC format may be defined 72 | in **future versions of the standard**…”. 73 | 74 | **Action:** Clément Oury to propose a formulation. 75 | 76 | --- 77 | 78 | **4) [Augmentation: add new named fields for deduplication](https://github.com/iipc/warc-specifications/issues/10)** 79 | 80 | **Issue:** the issue has been identified and describe by the IIPC 81 | harvesting working, which has proposed a 82 | solution: ** 83 | 84 | **Decision:** the preconisation from the HWG should be written in the 85 | standard. 86 | 87 | **Action:** Kristinn Sigurðsson (??) to include the preconisation in the 88 | standard. 89 | 90 | --- 91 | 92 | **5) [Augmentation: propose a specific profile for the management of 93 | diffs in the revisit records.](https://github.com/iipc/warc-specifications/issues/11)** 94 | 95 | **Issue:** revisit records may be used to store the diffs of a 96 | deduplication process. A new profile should be proposed that takes this 97 | case into account. 98 | 99 | **Decision:** a paragraph should be written that describes this new 100 | profile, as chapter 6.7.4. of the standard. 101 | 102 | Besides, in the sentence (p. 4): “All 'warcinfo', 'metadata' and 103 | 'revisit' records shall not have a payload”, the revisit records should 104 | not be listed (NB from Clément: not sure about that: is the diff a 105 | “payload” or a “block” of the record? If the HTTP protocole response is 106 | included, the diff should be considered a payload). 107 | 108 | **Action:** Andy Jackson from BL, Eld Zierau from KB and Kristinn 109 | Sigurðsson from NL of Iceland to propose a formulation. 110 | 111 | --- 112 | 113 | **6) [Modification: allow for more precise timestamps for WARC-date 114 | field](https://github.com/iipc/warc-specifications/issues/11)** 115 | 116 | **Issue:** The current standard (5.4) states that “The WARC-Date is a 117 | 14-digit UTC time-stamp formatted as YYYY-MM-DDThh:mm:ssZ, and shall 118 | conform to the W3C profile of ISO 8601, i.e. 119 | [W3CDTF 120 | ]”. 121 | 122 | It may happen that similar URLs are crawled at the same second, hence 123 | generating a problem of duplicates.  124 | 125 | **Decision:** It looks necessary to allow for more precise timestamp, 126 | below the level of the second. 127 | 128 | **Action:** **Noah Lewitt** from Internet Archive to propose a 129 | formulation. 130 | 131 | --- 132 | 133 | **7) [Clarification: security issues](https://github.com/iipc/warc-specifications/issues/12)** 134 | 135 | **Issue:** It is written in the WARC standards (8.3): “Security 136 | considerations: The WARC record syntax poses no direct risk to computers 137 | and networks. Implementers need to be aware of source authority and 138 | trustworthiness of information structured in WARC. Readers and writers 139 | subject themselves to all the risks that accompany normal operation of 140 | data processing services (e.g. message length errors, buffer overflow 141 | attacks)”. 142 | 143 | This sentence looks misleading: it should not mean that it is impossible 144 | to address security issues in WARC, but that it has been decided that it 145 | should not be part of the standard. 146 | 147 | **Decision:** This should be more clearly explained. 148 | 149 | **Action: Jack Cushman from *Perma.cc* ** to propose a formulation. 150 | 151 | --- 152 | 153 | **8)      [Augmentation: storing the “rendered target” in WARC record](https://github.com/iipc/warc-specifications/issues/13)** 154 | 155 | **Issue:** some robots store “rendered target” along with files archived 156 | on the web, i.e. screenshots of these files. A precise way to record 157 | them should be proposed in the standard, as there is a consensus in the 158 | community. 159 | 160 | **Decision:** Propose a way to record rendered target either in the 161 | standard or as an appendix (NB from Clément: I would probably favour the 162 | second solution). 163 | 164 | **Action:** **Andy Jackson from BL ** to propose something. 165 | 166 | --- 167 | 168 | **9) [Augmentation: how to render AJAX interactions in WARC](https://github.com/iipc/warc-specifications/issues/14)** 169 | 170 | **Issue:** it is necessary to have a common way of rendering AJAX 171 | interactions in WARC.  172 | 173 | **Decision:** Propose a way to record rendering files either in the 174 | standard or as an appendix (NB from Clément: I would probably vote for 175 | the second solution). 176 | 177 | **Action:** someone from LOCKSS (who??) to propose something. 178 | 179 | --- 180 | 181 | **10) [Modification: support of HTTP 2.X protocol in WARC format.](https://github.com/iipc/warc-specifications/issues/15)** 182 | 183 | **Issue:** nothing is said on the HTTP 2 protocol, which could give the 184 | impression that WARC files cannot harvest documents in HTTP2. 185 | 186 | **Decision:** few sentences on the handling of HTTP 2.X protocol should 187 | be written. 188 | 189 | **Action:** Kristinn Sigurðsson  to propose a formulation **and give an 190 | example.** 191 | 192 | --- 193 | 194 | **11) [Augmentation: specification of the WAT format.](https://github.com/iipc/warc-specifications/issues/16)** 195 | 196 | **Issue:** WAT (Web Archive Transformation) is a “profile” of WARC 197 | format intended to store web archive metadata, notably for data mining 198 | processes 199 | (see*https://webarchive.jira.com/wiki/display/Iresearch/Web+Archive+Transformation+%28WAT%29+Specification,+Utilities,+and+Usage+Overview*). 200 |  Proposing the WAT format as an official (even though not prescriptive) 201 | specification of the WARC format would give it more authority and would 202 | allow more confidence in its maintenance. 203 | 204 | **Decision:** Propose a specification of the WAT format as an 205 | (informative) appendix of the standard. Ensure that the specification 206 | may be freely available online.  207 | 208 | **Action: Vinay Goel from** Internet Archive to propose a specification, 209 | with comments from WAT users such as **Andy Jackson from BL or Sara 210 | Aubry from BnF**. Find a place to host the WAT specification (e.g. on 211 | BnF website, as traditional host of the WARC standard draft?).  212 | 213 |   214 | -------------------------------------------------------------------------------- /specifications/warc-format/warc-1.0/WARC_ISO_28500_version1_latestdraft.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-format/warc-1.0/WARC_ISO_28500_version1_latestdraft.doc -------------------------------------------------------------------------------- /specifications/warc-format/warc-1.0/WARC_ISO_28500_version1_latestdraft.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iipc/warc-specifications/be2ac9e0af22eb0ac50fef691ece7417932fcdb3/specifications/warc-format/warc-1.0/WARC_ISO_28500_version1_latestdraft.pdf -------------------------------------------------------------------------------- /specifications/warc-rendered-targets/warc-rendered-targets-1.0.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Proposal for Standardizing the Recording Rendered Targets 3 | status: proposed 4 | latest: true 5 | version-of: warc-rendered-targets 6 | version: 1.0 7 | --- 8 | International Internet Preservation Consortium
9 | Harvesting Working Group 10 | 11 | The modifications described below are based on [HTTP Archive 1.2](http://www.google.com/url?q=http%3A%2F%2Fwww.softwareishard.com%2Fblog%2Fhar-12-spec%2F&sa=D&sntz=1&usg=AFQjCNESSsDv3ZkYTVkyfGPjRKpwSlr6AQ) 12 | 13 | ### \ 14 | 15 | This object represents list of exported pages. 16 | 17 | "pages": [ 18 |     { 19 |         "startedDateTime": "2009-04-16T12:07:25.123+01:00", 20 |         "id": "page\_0", 21 |         "title": "Test Page", 22 |         "pageTimings": {...}, 23 |         "comment": "", 24 |         "renderedContent": {...}, 25 |         "renderedElements": [], 26 |         "map": [] 27 |     } 28 | ] 29 | 30 | startedDateTime [string] 31 | : Date and time stamp for the beginning of the page load (ISO 8601 - YYYY-MM-DDThh:mm:ss.sTZD, e.g. 2009-07-24T19:20:30.45+01:00). 32 | 33 | id [string] 34 | : Unique identifier of a page within the \. Entries use it to refer the parent page. 35 | 36 | title [string] 37 | : Page title. 38 | 39 | pageTimings[object] 40 | : Detailed timing info about page load. 41 | 42 | comment [string, optional] (new in 1.2) 43 | : A comment provided by the user or the application. 44 | 45 | renderedContent [object] 46 | : Representation of the page's DOM. 47 | 48 | renderedElements [array, optional] 49 | : List of images rendered from the final page. 50 | 51 | map [array, optional] 52 | : List of clickable areas in the final page. 53 | 54 | 55 | ### \ 56 | 57 | This object represents the DOM of the final page. 58 | 59 | "renderedContent": { 60 |     "text": "PCFET0NUWVBFIGh0bWw+P...", 61 |     "encoding": "base64" 62 | } 63 | 64 | text [string] 65 | : HTML of the final page, following any DOM changes during page-load. 66 | 67 | encoding [string, optional] 68 | : Encoding used for response text field e.g "base64". 69 | 70 | 71 | ### \ 72 | 73 | This object represents a list of images rendered from the page or some subsection thereof. 74 | 75 | "renderedElements": [ 76 | { 77 |     "selector": ":root", 78 |     "format": "PNG", 79 |     "content": "iVBORw0KGgoAAAANSU...", 80 |     "encoding": "base64" 81 | } 82 | ] 83 | 84 | selector [string] 85 | : The CSS3 selector of an element within the page forming the basis of the image. 86 | 87 | format [string] 88 | : The format of the image (e.g. "PNG", "JPEG"). 89 | 90 | content [string] 91 | : Textual representation of the image content. 92 | 93 | encoding [string] 94 | : Encoding used for the content string (e.g. "base64"). 95 | 96 | 97 | ### \ 98 | 99 | The object represents a list of clickable areas within the page. 100 | 101 | "map": [ 102 | { 103 |     "href": "/", 104 |     "location": {...} 105 | } 106 | ] 107 | 108 | href [string, optional] 109 | : URL (absolute or relative) of the page to which a click would direct the session. 110 | 111 | onClick [string, optional] 112 | : Action from which an onClick event would result. Either a URL (absolute or relative) or a Javascript fragment. 113 | 114 | location [object] 115 | : Representation of the area's position and dimensions. 116 | 117 | 118 | ### \ 119 | 120 | This object represents a specific area within a page. 121 | 122 | "location": { 123 |     "bottom": 46, 124 |     "height": 46, 125 |     "left": 37, 126 |     "right": 110, 127 |     "top": 0, 128 |     "width": 73 129 | } 130 | 131 | bottom [number] 132 | : Y-coordinate, relative to the viewport origin, of the bottom of the rectangle box. 133 | 134 | height [number] 135 | : Height of the rectangle box (This is identical to bottom minus top). 136 | 137 | left [number] 138 | : X-coordinate, relative to the viewport origin, of the left of the rectangle box. 139 | 140 | right [number] 141 | : X-coordinate, relative to the viewport origin, of the right of the rectangle box. 142 | 143 | top [number] 144 | : Y-coordinate, relative to the viewport origin, of the top of the rectangle box. 145 | 146 | width [number] 147 | : Width of the rectangle box (This is identical to right minus left). 148 | 149 | 150 | -------------------------------------------------------------------------------- /specifications/warc-zstd/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Zstandard Compression for WARC Files 3 | status: proposed 4 | version: 1.0 5 | numbered: true 6 | latest: true 7 | version-of: warc-zstd 8 | --- 9 | 10 | # Introduction *(informative)* 11 | 12 | This specification defines a Zstandard-based format for compressed WARC files, 13 | as an alternative to the GZIP-based format defined in [WARC/1.1 Annex D]. 14 | 15 | In general, Zstandard can produce significantly smaller files than GZIP while 16 | also achieving faster compression and decompression. Zstandard also offers a 17 | much wider range of compression levels, ranging from extremely fast compression 18 | with a modest size reduction to extremely slow compression with a much better 19 | reduction. For files containing many small records, Zstandard dictionaries can 20 | be used to reduce file size even further, while still permitting random access to 21 | individual records. 22 | 23 | ## Words of caution 24 | 25 | This specification is __experimental__ and __subject to change__. 26 | Furthermore, the Zstandard format itself is __much less mature__ than GZIP. The 27 | GZIP RFC was published in 1996; the Zstandard RFC was published in 2018\. 28 | Before using Zstandard compression for archival, organizations should carefully 29 | consider the risks of relying on such a young format. 30 | 31 | # Normative references 32 | 33 | \[RFC 8478\] Collet, Y. and Kucherawy, M. Zstandard Compression and the 34 | application/zstd Media Type. October 2018. (Obsoleted by RFC 8878) Available at: 35 | 36 | 37 | \[RFC 8878\] Collet, Y. and Kucherawy, M. Zstandard Compression and the 38 | 'application/zstd' Media Type. February 2021. 39 | Available at: 40 | 41 | 42 | [RFC 8878]: https://datatracker.ietf.org/doc/html/rfc8878 43 | [RFC 8878 section 3.1.1]: https://datatracker.ietf.org/doc/html/rfc8878#section-3.1.1 44 | [RFC 8878 section 3.1.1.1.2]: https://datatracker.ietf.org/doc/html/rfc8878#section-3.1.1.1.2 45 | [RFC 8878 section 3.1.2]: https://datatracker.ietf.org/doc/html/rfc8878#section-3.1.2 46 | [RFC 8878 section 5]: https://datatracker.ietf.org/doc/html/rfc8878#section-5 47 | [RFC 8878 section 8]: https://datatracker.ietf.org/doc/html/rfc8878#section-8 48 | 49 | \[WARC/1.0\] 50 | 51 | \[WARC/1.1\] 52 | 53 | [WARC/1.1 Annex D]: https://iipc.github.io/warc-specifications/specifications/warc-format/warc-1.1/#annex-d-informative-compression-recommendations 54 | 55 | # File identification 56 | 57 | A Zstandard-compressed WARC file should have the customary ".zst" appended to 58 | its name, making the complete suffix ".warc.zst". 59 | 60 | Because a Zstandard-compressed WARC file must begin with either a Zstandard 61 | frame or a dictionary frame, the first four bytes of the file will be either 62 | `0x28 0xB5 0x2F 0xFD` or `0x5D 0x2A 0x4D 0x18`, respectively. 63 | 64 | # File format 65 | 66 | warc-zst-file = zstandard-frame *( zstandard-frame | extension-frame ) 67 | | dict-frame 1*( zstandard-frame | extension-frame ) 68 | dict-frame = 69 | zstandard-frame = 70 | extension-frame = 71 | 72 | A Zstandard-compressed WARC file consists of an optional dictionary frame 73 | followed by one or more Zstandard frames, possibly with extension frames in 74 | between. The file must begin with either a Zstandard frame or a dictionary 75 | frame. If each Zstandard frame is decompressed and the results are concatenated 76 | in order, the result will be a valid, uncompressed WARC file. 77 | 78 | Each WARC record must correspond to one or more Zstandard frames in the 79 | compressed file. If those frames are decompressed and the results are 80 | concatenated in order, the result will be the original, uncompressed WARC 81 | record. A single Zstandard frame __must not__ contain data from multiple WARC 82 | records. 83 | 84 | Like uncompressed WARC files, Zstandard-compressed WARC files must contain at 85 | least one record. 86 | 87 | ## Zstandard frames 88 | 89 | Each Zstandard frame in a compressed WARC file must include the 90 | Frame\_Content\_Size and Content\_Checksum fields, which are described in [RFC 91 | 8478 section 3.1.1]. 92 | If the file includes a dictionary, each Zstandard frame must also include the 93 | Dictionary\_ID field, and its contents must match the Dictionary\_ID field in 94 | the dictionary itself. 95 | 96 | Whenever a decoder decompresses a frame in its entirety, it should check the 97 | checksum of the decompressed data against the Content\_Checksum field to 98 | determine whether data corruption has occurred. 99 | 100 | Empty Zstandard frames are permissible, and will have a Frame\_Content\_Size of 101 | zero. 102 | 103 | Zstandard frames must use the standard format defined in [RFC 8878]; they 104 | must not use any of the legacy Zstandard formats not described there. 105 | 106 | ## Dictionaries 107 | 108 | If a Zstandard-compressed WARC file does not contain a dictionary frame, each 109 | Zstandard frame in the file must be decompressed without a dictionary. 110 | 111 | If a Zstandard-compressed WARC file does contain a dictionary frame, it must 112 | follow the dictionary frame format described below. Each Zstandard frame in the 113 | file must be decompressed using the decoded dictionary. 114 | 115 | Encoders may use an arbitrary dictionary that follows the Zstandard dictionary 116 | format. They should attempt to give a unique ID to each dictionary. For 117 | example, they may use a random dictionary ID between 32,768 and 2,147,483,647. 118 | 119 | ### Dictionary frame format 120 | 121 | A dictionary frame is a skippable frame, as defined in [RFC 8878 section 122 | 3.1.2], with a Magic\_Number of `0x184D2A5D`. The User\_Data field contains a 123 | single dictionary which may optionally be compressed. 124 | 125 | If the dictionary is not compressed, the User\_Data field will consist of a 126 | single dictionary in the format given by [RFC 8878 section 5]. It will start 127 | with the bytes `0x37 0xA4 0x30 0xEC`. 128 | 129 | If the dictionary is compressed, the User\_Data field must consist of a single 130 | Zstandard frame, starting with the bytes `0x28 0xB5 0x2F 0xFD`; skippable 131 | frames are not allowed. The Zstandard frame must be compressed without a 132 | dictionary, and the Frame\_Content\_Size and Content\_Checksum fields must be 133 | present. When the frame is decompressed, the result must be a single dictionary 134 | in the format given by [RFC 8878 section 5]. 135 | 136 | ## Extension frames 137 | 138 | An extension frame is a skippable frame, as defined in [RFC 8478 section 139 | 3.1.2], with a Magic\_Number other than `0x184D2A5D`. An arbitrary sequence of 140 | extension frames may appear before or after any Zstandard frame, except that 141 | the file may not begin with an extension frame. 142 | 143 | This specification does not define the format or meaning of any extension 144 | frame. This specification also does not define which WARC record an extension 145 | frame should be associated with, if any. Decoders must ignore any extension 146 | frames they do not recognize. 147 | 148 | # Window and dictionary limits 149 | 150 | Each Zstandard frame has a value called Window\_Size, described in [RFC 8878 151 | section 3.1.1.1.2], which determines how much memory is needed to decode the 152 | frame. Although the Zstandard format supports window sizes up to 16 exabytes, 153 | sizes this large may be impractical for certain decoders. Memory requirements 154 | are also affected by the size of the dictionary, if any. This specification 155 | only requires decoders to support the following sizes: 156 | 157 | - Window sizes up to 8,388,608 bytes (223 bytes) in all Zstandard 158 | frames, including Zstandard frames within dictionary frames. 159 | - Compressed dictionary sizes up to 8,388,608 bytes (223 bytes). 160 | This refers to the size of the User\_Data field in the dictionary frame. 161 | - Decompressed dictionary sizes up to 8,388,608 bytes (223 bytes). 162 | This refers to the size of the User\_Data field in the dictionary frame (when 163 | the dictionary is not compressed) or the result of decompressing the 164 | User\_Data field (when the dictionary is compressed). 165 | 166 | Encoders are permitted to generate files that exceed these limits, but decoders 167 | may choose to reject such files with a suitable error message. 168 | 169 | # Security considerations 170 | 171 | The security considerations for this format are a combination of those for WARC 172 | and those for Zstandard. Users should consult [RFC 8878 section 8] for a 173 | discussion of the latter. 174 | 175 | When implementations support seeking to a record at an arbitrary position in 176 | the file, they should also beware of positions provided by malicious sources, 177 | which may point to falsified or invalid data. 178 | 179 | # Implementation notes *(informative)* 180 | 181 | The initial discussion of this format can be found at [warc-specifications #53]. 182 | The dictionary frame format has been submitted to upstream zstd, along with 183 | example code, at [zstd #2349], but that specification is not authoritative for 184 | WARC files; the specification above must be used instead. 185 | 186 | [warc-specifications #53]: https://github.com/iipc/warc-specifications/issues/53 187 | [zstd #2349]: https://github.com/facebook/zstd/pull/2349 188 | 189 | ## Compression trade-offs 190 | 191 | In general, the best compression results are achieved by using a single frame 192 | for each record. However, there are other advantages to using multiple frames. 193 | If a record uses multiple frames, they can potentially be compressed and 194 | decompressed in parallel. Multiple frames may also be helpful when dealing with 195 | huge records, too large to fit in memory. 196 | 197 | Dictionaries are extremely helpful for tiny frames, but not very helpful for 198 | huge frames. With a typical window size of 8MB, a dictionary will only help 199 | with the first 8MB of uncompressed data in a frame. 200 | 201 | Dictionaries will be most effective when they are tailored for the content of a 202 | particular WARC file. For example, when crawling a specific website, a 203 | dictionary can be generated from the first crawled set of records. The 204 | dictionary can then be used for the rest of the WARC files produced by the 205 | crawl. 206 | 207 | Especially large window sizes may improve compression of especially large 208 | frames, but they carry the risk that a decoder will reject the frame if the 209 | window size is too large. 210 | 211 | ## Random access 212 | 213 | As with GZIP, external indexes of Zstandard-compressed WARC file content may be 214 | used to save each record's starting position in the file. An arbitrary record 215 | can then be decoded by loading the dictionary (if any) from the start of the 216 | file, then seeking to the known starting position and decoding Zstandard frames 217 | until the record is complete. 218 | 219 | ## Encoding with libzstd 220 | 221 | The simplest way to create a Zstandard-compressed WARC file is to call 222 | `ZSTD_compress` separately on each record and concatenate the results. If 223 | encoders use other functions from libzstd, they must take care to include the 224 | Frame\_Content\_Size field in every frame, and to start a new frame for each 225 | new record. 226 | 227 | ## Decoding with libzstd 228 | 229 | Most of the functions in libzstd already ignore skippable frames and 230 | concatenate decompressed Zstandard frames, so the only extra effort needed is 231 | to load the dictionary. 232 | 233 | The following code decompresses an entire WARC file. For simplicity, this code 234 | assumes the entire compressed file has been loaded into memory, and some 235 | error-handling code has been omitted. 236 | 237 | ```c 238 | uint32_t readLE32(const uint8_t* src) { 239 | return (uint32_t)src[0] 240 | | (uint32_t)src[1] << 8 241 | | (uint32_t)src[2] << 16 242 | | (uint32_t)src[3] << 24; 243 | } 244 | 245 | size_t warc_zstd_decompress_file(uint8_t* dst, size_t dstCapacity, 246 | const uint8_t* src, size_t srcSize) { 247 | ZSTD_DCtx* dctx = ZSTD_createDCtx(); 248 | if (srcSize >= 8 && readLE32(src) == 0x184D2A5D) { 249 | // Dictionary frame. 250 | uint32_t dictSize = readLE32(src + 4); 251 | const uint8_t *dictData = src + 8; 252 | if (dictSize < 4 || dictSize + 8 > srcSize) { 253 | abort(); 254 | } 255 | if (readLE32(dictData) == ZSTD_MAGIC_DICTIONARY) { 256 | // Uncompressed dictionary. 257 | ZSTD_DCtx_loadDictionary(dctx, dictData, dictSize); 258 | } else if (readLE32(dictData) == ZSTD_MAGICNUMBER) { 259 | // Compressed dictionary. 260 | unsigned long long bufferSize; 261 | bufferSize = ZSTD_getFrameContentSize(dictData, dictSize); 262 | uint8_t* buffer = malloc(bufferSize); 263 | size_t result = ZSTD_decompress(buffer, bufferSize, dictData, dictSize); 264 | ZSTD_DCtx_loadDictionary(dctx, buffer, result); 265 | free(buffer); 266 | } else { 267 | abort(); 268 | } 269 | } 270 | size_t result = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize); 271 | ZSTD_freeDCtx(dctx); 272 | return result; 273 | } 274 | ``` 275 | 276 | ## Combining files 277 | 278 | Two Zstandard-compressed WARC files without dictionaries can be concatenated to 279 | form a valid file. However, if either file contains a dictionary, the files 280 | __cannot__ be concatenated in this way. 281 | 282 | Two files that use identical dictionaries can be combined by removing the 283 | dictionary frame from the second file, then concatenating them. 284 | 285 | In other cases, files can only be combined by decompressing and recompressing 286 | them to use the same dictionary. 287 | 288 | ## Multiple dictionaries 289 | 290 | It may be desirable to use different dictionaries for different types of 291 | content. For example, one dictionary for records containing HTML, and another 292 | for records containing PNG images. This can be accomplished by creating 293 | separate WARC files for each dictionary. 294 | 295 | ## Extension frames 296 | 297 | Extension frames could be used to add padding, or to prefix each record with 298 | its compressed size so records can easily be skipped. They could also be used 299 | to add a seek table for random access within a single record, perhaps using a 300 | variant of the [Zstandard Seekable Format]. 301 | 302 | Extension frames are prohibited at the beginning of the file in order to 303 | simplify the process of checking whether a file is Zstandard-compressed. If 304 | necessary, a zero-length Zstandard frame can be used at the beginning of the 305 | file, followed by an extension frame. 306 | 307 | [Zstandard Seekable Format]: https://github.com/facebook/zstd/blob/dev/contrib/seekable_format/zstd_seekable_compression_format.md 308 | --------------------------------------------------------------------------------