Woocommerce Products Slider - Version 1.12.22

Version Description

  • 21/10/2019 update - update slider settings.
    • 21/10/2019 add - product query by categories added
    • 21/10/2019 add - Product display by Product IDs
    • 21/10/2019 add - Product Thumbnail link target added
    • 21/10/2019 add - Items Category separator
Download this release

Release Info

Developer pickplugins
Plugin Icon 128x128 Woocommerce Products Slider
Version 1.12.22
Comparing to
See all releases

Code changes from version 1.12.21 to 1.12.22

Files changed (36) hide show
  1. assets/admin/ParaAdmin/css/ParaAdmin.css +0 -177
  2. assets/admin/ParaAdmin/js/ParaAdmin.js +0 -33
  3. assets/admin/css/codemirror.css +334 -0
  4. assets/admin/css/move.png +0 -0
  5. assets/admin/css/settings-tabs.css +357 -0
  6. assets/admin/css/style.css +14 -72
  7. assets/admin/images/five-star.png +0 -0
  8. assets/admin/js/codemirror.js +8871 -0
  9. assets/admin/js/color-picker.min.js +1 -0
  10. assets/admin/js/scripts.js +26 -18
  11. assets/admin/js/scripts.min.js +1 -0
  12. assets/admin/js/settings-tabs.js +26 -0
  13. assets/front/css/animate.css +3340 -0
  14. assets/front/css/animate.min.css +7 -0
  15. assets/front/css/owl.carousel.min.css +1 -0
  16. assets/front/css/owl.theme.default.min.min.css +0 -0
  17. assets/front/css/style.css +78 -46
  18. assets/front/css/style.min.css +1 -0
  19. assets/front/css/wcps-builder.css +19 -0
  20. assets/front/js/owl.carousel.js +3275 -0
  21. assets/front/js/owl.carousel.min.js +1 -3266
  22. assets/front/js/owl.rows.js +139 -0
  23. assets/front/js/owl.rows.min.js +1 -0
  24. assets/front/js/scripts.js +22 -0
  25. assets/front/js/scripts.min.js +1 -0
  26. assets/front/js/wcps-builder.js +11 -0
  27. assets/global/css/font-awesome.min.css +4 -0
  28. assets/global/css/fontawesome-5.min.css +1 -0
  29. assets/global/css/style.themes.css +43 -18
  30. assets/global/css/style.themes.min.css +1 -0
  31. assets/global/images/bg/dark_embroidery.png +0 -0
  32. assets/global/images/bg/dimension.png +0 -0
  33. assets/global/images/bg/eight_horns.png +0 -0
  34. assets/global/images/bg/small_steps.png +0 -0
  35. assets/global/webfonts/fa-brands-400.eot +0 -0
  36. assets/global/webfonts/fa-brands-400.svg +962 -0
assets/admin/ParaAdmin/css/ParaAdmin.css DELETED
@@ -1,177 +0,0 @@
1
- @charset "utf-8";
2
- /* CSS Document */
3
-
4
-
5
- /*Admin CSS*/
6
-
7
- .para-settings {
8
- margin: 20px 0;
9
- }
10
-
11
- .para-settings .option-box {
12
- margin: 10px 0;
13
- padding: 10px;
14
- }
15
-
16
-
17
- .para-settings .option-box:hover {
18
-
19
- }
20
-
21
-
22
- .para-settings .option-box .option-title {
23
- font-size: 16px;
24
- font-weight: bold;
25
- }
26
-
27
- .para-settings .option-box .option-info {
28
- color: rgb(153, 153, 153);
29
- font-size: 13px;
30
- font-weight: normal;
31
- margin: 10px 0;
32
- }
33
-
34
- .para-settings ul.tab-nav {
35
- clear: both;
36
- margin: 0;
37
- padding: 0;
38
- }
39
-
40
- .para-settings ul.tab-nav li {
41
- background: none repeat scroll 0 0 rgb(230, 230, 230);
42
- cursor: pointer;
43
- display: inline-block;
44
- float: left;
45
- margin: 0;
46
- padding: 15px 20px;
47
- }
48
-
49
- .para-settings ul.tab-nav li.active{
50
- background:#ffffff;
51
- font-weight: bold;
52
- }
53
-
54
-
55
-
56
- .para-settings ul.box {
57
- clear: both;
58
- margin: 0;
59
- padding: 0;
60
- }
61
-
62
- .para-settings ul.box li.tab-box {
63
- background: rgb(255, 255, 255) none repeat scroll 0 0;
64
- display: none;
65
- margin: 0;
66
- width: 100%;
67
- }
68
-
69
-
70
-
71
- .para-settings .new_user_profile_social {
72
- margin: 15px 5px;
73
- }
74
-
75
-
76
-
77
- .para-settings ul.voting-bg-img-list{}
78
-
79
- .para-settings ul.voting-bg-img-list li {
80
- display: inline-block;
81
- margin: 5px;
82
- }
83
- .para-settings ul.voting-bg-img-list li.bg-selected {}
84
-
85
- .para-settings ul.voting-bg-img-list li img{border: 2px solid #ffffff;}
86
-
87
- .para-settings ul.voting-bg-img-list li.bg-selected img{
88
- border: 2px solid #ff5a11;
89
- }
90
-
91
-
92
- .para-settings h2 {
93
- font-size: 20px;
94
- font-weight: bold;
95
- margin: 25px 0;
96
- }
97
-
98
-
99
- .para-settings .expandable {
100
-
101
- }
102
-
103
- .para-settings .expandable .items {
104
- background: none repeat scroll 0 0 rgb(255, 255, 255);
105
- border-bottom: 1px solid rgb(153, 153, 153);
106
- margin: 2px 0;
107
- }
108
-
109
- .para-settings .expandable .items.ui-sortable-helper {
110
- border: 1px dashed rgb(153, 153, 153);
111
- }
112
-
113
-
114
-
115
- .para-settings .expandable .header {
116
- background: none repeat scroll 0 0 rgb(255, 255, 255);
117
- padding: 5px;
118
- }
119
-
120
- .para-settings .expandable .active .options {
121
-
122
- display: block;
123
-
124
- }
125
- .para-settings .expandable .options {
126
- background: none repeat scroll 0 0 rgb(240, 240, 240);
127
- display: none;
128
- padding: 10px;
129
- }
130
-
131
-
132
- @media all and (max-width: 799px) {
133
-
134
-
135
- .para-settings ul.tab-nav li {
136
- display: block;
137
- float: none;
138
-
139
- }
140
-
141
- .para-settings ul.tab-nav li.active{
142
- font-weight: bold;
143
- }
144
-
145
-
146
-
147
-
148
-
149
- .para-settings .pricing-table .column {
150
- display:block;
151
- float:none;
152
- width:100%;
153
- border-right: 1px solid #ff9601;
154
- margin: 50px 0;
155
-
156
- }
157
-
158
-
159
-
160
-
161
-
162
-
163
- }
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/admin/ParaAdmin/js/ParaAdmin.js DELETED
@@ -1,33 +0,0 @@
1
-
2
- jQuery(document).ready(function($)
3
- {
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
- $(document).on('click', '.tab-nav li', function()
13
- {
14
- $(".active").removeClass("active");
15
- $(this).addClass("active");
16
-
17
- var nav = $(this).attr("nav");
18
-
19
- $(".box li.tab-box").css("display","none");
20
- $(".box"+nav).css("display","block");
21
-
22
- })
23
-
24
-
25
-
26
- });
27
-
28
-
29
-
30
-
31
-
32
-
33
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/admin/css/codemirror.css ADDED
@@ -0,0 +1,334 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* BASICS */
2
+
3
+ .CodeMirror {
4
+ /* Set height, width, borders, and global font properties here */
5
+ font-family: monospace;
6
+ height: 300px;
7
+ color: black;
8
+ }
9
+
10
+ /* PADDING */
11
+
12
+ .CodeMirror-lines {
13
+ padding: 4px 0; /* Vertical padding around content */
14
+ }
15
+ .CodeMirror pre {
16
+ padding: 0 4px; /* Horizontal padding of content */
17
+ }
18
+
19
+ .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
20
+ background-color: white; /* The little square between H and V scrollbars */
21
+ }
22
+
23
+ /* GUTTER */
24
+
25
+ .CodeMirror-gutters {
26
+ border-right: 1px solid #ddd;
27
+ background-color: #f7f7f7;
28
+ white-space: nowrap;
29
+ }
30
+ .CodeMirror-linenumbers {}
31
+ .CodeMirror-linenumber {
32
+ padding: 0 3px 0 5px;
33
+ min-width: 20px;
34
+ text-align: right;
35
+ color: #999;
36
+ white-space: nowrap;
37
+ }
38
+
39
+ .CodeMirror-guttermarker { color: black; }
40
+ .CodeMirror-guttermarker-subtle { color: #999; }
41
+
42
+ /* CURSOR */
43
+
44
+ .CodeMirror-cursor {
45
+ border-left: 1px solid black;
46
+ border-right: none;
47
+ width: 0;
48
+ }
49
+ /* Shown when moving in bi-directional text */
50
+ .CodeMirror div.CodeMirror-secondarycursor {
51
+ border-left: 1px solid silver;
52
+ }
53
+ .cm-fat-cursor .CodeMirror-cursor {
54
+ width: auto;
55
+ border: 0;
56
+ background: #7e7;
57
+ }
58
+ .cm-fat-cursor div.CodeMirror-cursors {
59
+ z-index: 1;
60
+ }
61
+
62
+ .cm-animate-fat-cursor {
63
+ width: auto;
64
+ border: 0;
65
+ -webkit-animation: blink 1.06s steps(1) infinite;
66
+ -moz-animation: blink 1.06s steps(1) infinite;
67
+ animation: blink 1.06s steps(1) infinite;
68
+ background-color: #7e7;
69
+ }
70
+ @-moz-keyframes blink {
71
+ 0% {}
72
+ 50% { background-color: transparent; }
73
+ 100% {}
74
+ }
75
+ @-webkit-keyframes blink {
76
+ 0% {}
77
+ 50% { background-color: transparent; }
78
+ 100% {}
79
+ }
80
+ @keyframes blink {
81
+ 0% {}
82
+ 50% { background-color: transparent; }
83
+ 100% {}
84
+ }
85
+
86
+ /* Can style cursor different in overwrite (non-insert) mode */
87
+ .CodeMirror-overwrite .CodeMirror-cursor {}
88
+
89
+ .cm-tab { display: inline-block; text-decoration: inherit; }
90
+
91
+ .CodeMirror-ruler {
92
+ border-left: 1px solid #ccc;
93
+ position: absolute;
94
+ }
95
+
96
+ /* DEFAULT THEME */
97
+
98
+ .cm-s-default .cm-header {color: blue;}
99
+ .cm-s-default .cm-quote {color: #090;}
100
+ .cm-negative {color: #d44;}
101
+ .cm-positive {color: #292;}
102
+ .cm-header, .cm-strong {font-weight: bold;}
103
+ .cm-em {font-style: italic;}
104
+ .cm-link {text-decoration: underline;}
105
+ .cm-strikethrough {text-decoration: line-through;}
106
+
107
+ .cm-s-default .cm-keyword {color: #708;}
108
+ .cm-s-default .cm-atom {color: #219;}
109
+ .cm-s-default .cm-number {color: #164;}
110
+ .cm-s-default .cm-def {color: #00f;}
111
+ .cm-s-default .cm-variable,
112
+ .cm-s-default .cm-punctuation,
113
+ .cm-s-default .cm-property,
114
+ .cm-s-default .cm-operator {}
115
+ .cm-s-default .cm-variable-2 {color: #05a;}
116
+ .cm-s-default .cm-variable-3 {color: #085;}
117
+ .cm-s-default .cm-comment {color: #a50;}
118
+ .cm-s-default .cm-string {color: #a11;}
119
+ .cm-s-default .cm-string-2 {color: #f50;}
120
+ .cm-s-default .cm-meta {color: #555;}
121
+ .cm-s-default .cm-qualifier {color: #555;}
122
+ .cm-s-default .cm-builtin {color: #30a;}
123
+ .cm-s-default .cm-bracket {color: #997;}
124
+ .cm-s-default .cm-tag {color: #170;}
125
+ .cm-s-default .cm-attribute {color: #00c;}
126
+ .cm-s-default .cm-hr {color: #999;}
127
+ .cm-s-default .cm-link {color: #00c;}
128
+
129
+ .cm-s-default .cm-error {color: #f00;}
130
+ .cm-invalidchar {color: #f00;}
131
+
132
+ .CodeMirror-composing { border-bottom: 2px solid; }
133
+
134
+ /* Default styles for common addons */
135
+
136
+ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
137
+ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
138
+ .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
139
+ .CodeMirror-activeline-background {background: #e8f2ff;}
140
+
141
+ /* STOP */
142
+
143
+ /* The rest of this file contains styles related to the mechanics of
144
+ the editor. You probably shouldn't touch them. */
145
+
146
+ .CodeMirror {
147
+ position: relative;
148
+ overflow: hidden;
149
+ background: white;
150
+ }
151
+
152
+ .CodeMirror-scroll {
153
+ overflow: scroll !important; /* Things will break if this is overridden */
154
+ /* 30px is the magic margin used to hide the element's real scrollbars */
155
+ /* See overflow: hidden in .CodeMirror */
156
+ margin-bottom: -30px; margin-right: -30px;
157
+ padding-bottom: 30px;
158
+ height: 100%;
159
+ outline: none; /* Prevent dragging from highlighting the element */
160
+ position: relative;
161
+ }
162
+ .CodeMirror-sizer {
163
+ position: relative;
164
+ border-right: 30px solid transparent;
165
+ }
166
+
167
+ /* The fake, visible scrollbars. Used to force redraw during scrolling
168
+ before actuall scrolling happens, thus preventing shaking and
169
+ flickering artifacts. */
170
+ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
171
+ position: absolute;
172
+ z-index: 6;
173
+ display: none;
174
+ }
175
+ .CodeMirror-vscrollbar {
176
+ right: 0; top: 0;
177
+ overflow-x: hidden;
178
+ overflow-y: scroll;
179
+ }
180
+ .CodeMirror-hscrollbar {
181
+ bottom: 0; left: 0;
182
+ overflow-y: hidden;
183
+ overflow-x: scroll;
184
+ }
185
+ .CodeMirror-scrollbar-filler {
186
+ right: 0; bottom: 0;
187
+ }
188
+ .CodeMirror-gutter-filler {
189
+ left: 0; bottom: 0;
190
+ }
191
+
192
+ .CodeMirror-gutters {
193
+ position: absolute; left: 0; top: 0;
194
+ z-index: 3;
195
+ }
196
+ .CodeMirror-gutter {
197
+ white-space: normal;
198
+ height: 100%;
199
+ display: inline-block;
200
+ margin-bottom: -30px;
201
+ /* Hack to make IE7 behave */
202
+ *zoom:1;
203
+ *display:inline;
204
+ }
205
+ .CodeMirror-gutter-wrapper {
206
+ position: absolute;
207
+ z-index: 4;
208
+ background: none !important;
209
+ border: none !important;
210
+ }
211
+ .CodeMirror-gutter-background {
212
+ position: absolute;
213
+ top: 0; bottom: 0;
214
+ z-index: 4;
215
+ }
216
+ .CodeMirror-gutter-elt {
217
+ position: absolute;
218
+ cursor: default;
219
+ z-index: 4;
220
+ }
221
+ .CodeMirror-gutter-wrapper {
222
+ -webkit-user-select: none;
223
+ -moz-user-select: none;
224
+ user-select: none;
225
+ }
226
+
227
+ .CodeMirror-lines {
228
+ cursor: text;
229
+ min-height: 1px; /* prevents collapsing before first draw */
230
+ }
231
+ .CodeMirror pre {
232
+ /* Reset some styles that the rest of the page might have set */
233
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
234
+ border-width: 0;
235
+ background: transparent;
236
+ font-family: inherit;
237
+ font-size: inherit;
238
+ margin: 0;
239
+ white-space: pre;
240
+ word-wrap: normal;
241
+ line-height: inherit;
242
+ color: inherit;
243
+ z-index: 2;
244
+ position: relative;
245
+ overflow: visible;
246
+ -webkit-tap-highlight-color: transparent;
247
+ }
248
+ .CodeMirror-wrap pre {
249
+ word-wrap: break-word;
250
+ white-space: pre-wrap;
251
+ word-break: normal;
252
+ }
253
+
254
+ .CodeMirror-linebackground {
255
+ position: absolute;
256
+ left: 0; right: 0; top: 0; bottom: 0;
257
+ z-index: 0;
258
+ }
259
+
260
+ .CodeMirror-linewidget {
261
+ position: relative;
262
+ z-index: 2;
263
+ overflow: auto;
264
+ }
265
+
266
+ .CodeMirror-widget {}
267
+
268
+ .CodeMirror-code {
269
+ outline: none;
270
+ }
271
+
272
+ /* Force content-box sizing for the elements where we expect it */
273
+ .CodeMirror-scroll,
274
+ .CodeMirror-sizer,
275
+ .CodeMirror-gutter,
276
+ .CodeMirror-gutters,
277
+ .CodeMirror-linenumber {
278
+ -moz-box-sizing: content-box;
279
+ box-sizing: content-box;
280
+ }
281
+
282
+ .CodeMirror-measure {
283
+ position: absolute;
284
+ width: 100%;
285
+ height: 0;
286
+ overflow: hidden;
287
+ visibility: hidden;
288
+ }
289
+
290
+ .CodeMirror-cursor { position: absolute; }
291
+ .CodeMirror-measure pre { position: static; }
292
+
293
+ div.CodeMirror-cursors {
294
+ visibility: hidden;
295
+ position: relative;
296
+ z-index: 3;
297
+ }
298
+ div.CodeMirror-dragcursors {
299
+ visibility: visible;
300
+ }
301
+
302
+ .CodeMirror-focused div.CodeMirror-cursors {
303
+ visibility: visible;
304
+ }
305
+
306
+ .CodeMirror-selected { background: #d9d9d9; }
307
+ .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
308
+ .CodeMirror-crosshair { cursor: crosshair; }
309
+ .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
310
+ .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
311
+
312
+ .cm-searching {
313
+ background: #ffa;
314
+ background: rgba(255, 255, 0, .4);
315
+ }
316
+
317
+ /* IE7 hack to prevent it from returning funny offsetTops on the spans */
318
+ .CodeMirror span { *vertical-align: text-bottom; }
319
+
320
+ /* Used to force a border model for a node */
321
+ .cm-force-border { padding-right: .1px; }
322
+
323
+ @media print {
324
+ /* Hide the cursor when printing */
325
+ .CodeMirror div.CodeMirror-cursors {
326
+ visibility: hidden;
327
+ }
328
+ }
329
+
330
+ /* See issue #2901 */
331
+ .cm-tab-wrap-hack:after { content: ''; }
332
+
333
+ /* Help users use markselection to safely style text background */
334
+ span.CodeMirror-selectedtext { background: none; }
assets/admin/css/move.png DELETED
Binary file
assets/admin/css/settings-tabs.css ADDED
@@ -0,0 +1,357 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "utf-8";
2
+ /* CSS Document */
3
+
4
+
5
+ /*General CSS*/
6
+
7
+ .settings-tabs .float-right{
8
+ float: right;
9
+ }
10
+
11
+ .settings-tabs .float-left{
12
+ float: right;
13
+ }
14
+
15
+ .settings-tabs .float-none{
16
+ float: right;
17
+ }
18
+
19
+
20
+
21
+ /* Collapsible */
22
+
23
+ .settings-tabs .collapsible{
24
+ margin-bottom: 2px;
25
+ }
26
+ .settings-tabs .collapsible .header{
27
+ background: #eee;
28
+ padding: 8px 10px;
29
+ }
30
+
31
+ .settings-tabs .collapsible .header span{
32
+ display: inline-block;
33
+ vertical-align: middle;
34
+ }
35
+
36
+ .settings-tabs .collapsible .content{
37
+ display: none;
38
+ padding: 10px;
39
+ background: #f1f1f1;
40
+ }
41
+
42
+
43
+ .settings-tabs .collapsible.active .content{
44
+ display: block;
45
+ }
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+ .settings-tabs{
54
+ background: #fff;
55
+ }
56
+
57
+ .settings-tabs.vertical{
58
+ position: relative;
59
+ }
60
+ .settings-tabs .tab-navs{
61
+ float: left;
62
+ margin: 0;
63
+ padding: 0;
64
+ position: sticky;
65
+ top: 32px;
66
+ }
67
+ .settings-tabs .tab-nav{
68
+ width: 200px;
69
+ padding: 12px 10px;
70
+ background: #f1f1f1;
71
+ margin: 0;
72
+ border-bottom: 1px solid #eee;
73
+ cursor: pointer;
74
+ font-size: 13px;
75
+ }
76
+
77
+ .settings-tabs .tab-nav.active{
78
+ background:#f1f1f159;
79
+ }
80
+
81
+ .settings-tabs .tab-content{
82
+ margin-left: 220px;
83
+ padding: 20px 0;
84
+ background: #f1f1f159;
85
+ display: none;
86
+ }
87
+
88
+ .settings-tabs .tab-content.active{
89
+ display: block;
90
+ }
91
+
92
+
93
+
94
+ /*horizontal*/
95
+
96
+ .settings-tabs.horizontal{
97
+
98
+ }
99
+
100
+ .settings-tabs.horizontal .tab-navs{
101
+ float: none;
102
+ position: relative;
103
+ top: 0;
104
+ }
105
+
106
+ .settings-tabs.horizontal .tab-navs .tab-nav{
107
+ display: inline-block;
108
+ float: left;
109
+ width: auto;
110
+ border-right: 1px solid #ddd;
111
+ }
112
+
113
+ .settings-tabs.horizontal .tab-navs .tab-nav:last-child{
114
+ border-right: 1px solid rgba(0,0,0,0);
115
+ }
116
+
117
+
118
+ .settings-tabs.horizontal .tab-content{
119
+ margin-left: 0;
120
+ clear: both;
121
+ }
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+ .settings-tabs .section{
139
+ margin: 0;
140
+ padding: 15px 0;
141
+ }
142
+ .settings-tabs .section-title{
143
+ padding: 0 15px;
144
+ font-size: 16px;
145
+ font-weight: 600;
146
+ }
147
+
148
+ .settings-tabs .section-description{
149
+ padding: 0 15px;
150
+ margin-bottom: 25px;
151
+ }
152
+
153
+
154
+
155
+ .settings-tabs .setting-field{
156
+ margin-bottom: 15px;
157
+ border-bottom: 1px solid #eee;
158
+ padding: 0 15px 15px 15px;
159
+ }
160
+ .settings-tabs .setting-field:last-child{
161
+ border-bottom: 1px solid #eee0;
162
+ }
163
+
164
+
165
+
166
+ .settings-tabs .setting-field .field-lable{
167
+ width: 270px;
168
+ float: left;
169
+ font-size: 14px;
170
+ word-break: break-word;
171
+ }
172
+ .settings-tabs .setting-field .field-input{
173
+ margin-left: 270px;
174
+ }
175
+ .settings-tabs .setting-field .description{
176
+ word-break: break-word;
177
+ }
178
+
179
+
180
+
181
+
182
+ /*field-repeatable-wrapper*/
183
+
184
+
185
+ .ppof-settings .repeatable .item-wrap{
186
+ margin-bottom: 5px;
187
+ padding-bottom: 0px;
188
+ }
189
+
190
+
191
+ .field-repeatable-wrapper .field-list{
192
+ margin-top: 18px;
193
+ }
194
+ .field-repeatable-wrapper .button{
195
+
196
+ }
197
+
198
+
199
+
200
+
201
+
202
+ /*input*/
203
+
204
+ .settings-tabs input[type="text"], .settings-tabs textarea, .settings-tabs select, .settings-tabs input[type="range"]{
205
+ width: 360px;
206
+ background: #f1f1f1;
207
+ }
208
+
209
+
210
+ @media (max-width: 1170px){
211
+ .settings-tabs input[type="text"], .settings-tabs textarea, .settings-tabs select, .settings-tabs input[type="range"], .settings-tabs .select2{
212
+ width: 100% !important;
213
+
214
+ }
215
+ }
216
+
217
+
218
+ @media (max-width: 1440px){
219
+
220
+ .settings-tabs .setting-field .field-lable{
221
+ width: auto;
222
+ float: none;
223
+ font-size: 14px;
224
+ }
225
+ .settings-tabs .setting-field .field-input{
226
+ margin-left: 0px;
227
+ }
228
+ .settings-tabs .setting-field .description{}
229
+
230
+ }
231
+
232
+ @media (max-width: 1700px){
233
+
234
+ .settings-tabs .setting-field .setting-field .field-lable{
235
+ width: auto;
236
+ float: none;
237
+ font-size: 14px;
238
+ }
239
+ .settings-tabs .setting-field .setting-field .field-input{
240
+ margin-left: 0px;
241
+ }
242
+
243
+
244
+ }
245
+
246
+
247
+
248
+
249
+ /*expandable*/
250
+
251
+
252
+ .settings-tabs .expandable{}
253
+ .settings-tabs .expandable .item {
254
+
255
+ margin: 1px 0;
256
+
257
+ }
258
+
259
+
260
+ .settings-tabs .expandable .header label{
261
+
262
+ }
263
+
264
+
265
+
266
+ .settings-tabs .expandable .header {
267
+ background: #eee none repeat scroll 0 0;
268
+
269
+ }
270
+
271
+
272
+ .settings-tabs .expandable {
273
+
274
+ }
275
+
276
+ .settings-tabs .expandable .options {
277
+ background: #bde6fc;
278
+ display: none;
279
+ padding: 10px;
280
+ }
281
+
282
+
283
+
284
+ .settings-tabs .expandable .options {
285
+ background:#f1f1f1;
286
+ display: none;
287
+ padding: 10px;
288
+ }
289
+
290
+
291
+ .settings-tabs .expandable .item.ui-sortable-helper {
292
+ border: 1px dashed rgb(153, 153, 153);
293
+ }
294
+
295
+
296
+
297
+ .settings-tabs .expandable .header {
298
+ padding: 5px;
299
+
300
+ }
301
+
302
+ .settings-tabs .expandable .active .options {
303
+
304
+ display: block;
305
+
306
+ }
307
+
308
+ .settings-tabs .item .expand .fa-expand {
309
+ display: inline-block;
310
+ }
311
+
312
+ .settings-tabs .item .expand .fa-compress {
313
+ display: none;
314
+ }
315
+ .settings-tabs .item.active .expand .fa-compress {
316
+ display: inline-block;
317
+ }
318
+ .settings-tabs .item.active .expand .fa-expand {
319
+ display: none;
320
+ }
321
+
322
+
323
+
324
+ .settings-tabs .expandable .item .move {
325
+ display: inline-block;
326
+ padding: 5px;
327
+ cursor: move;
328
+ }
329
+
330
+ .settings-tabs .expandable .item .expand {
331
+ display: inline-block;
332
+ padding: 5px;
333
+ cursor: pointer;
334
+ }
335
+
336
+ .settings-tabs .expandable .remove {
337
+ background: rgb(228, 65, 8) none repeat scroll 0 0;
338
+ color: rgb(255, 255, 255);
339
+ cursor: pointer;
340
+ margin-right: 10px;
341
+ padding: 2px 7px;
342
+ border-radius: 3px;
343
+ }
344
+
345
+
346
+ .settings-tabs .pro-feature{
347
+ background: #ffd87f;
348
+ padding: 0 5px;
349
+ }
350
+
351
+
352
+
353
+ /*3rd Party*/
354
+
355
+ .settings-tabs .field-input .CodeMirror{
356
+ background: #f1f1f1;
357
+ }
assets/admin/css/style.css CHANGED
@@ -4,7 +4,9 @@
4
 
5
  /*Admin CSS*/
6
 
7
-
 
 
8
 
9
 
10
 
@@ -52,7 +54,7 @@
52
  }
53
 
54
 
55
- #wcps_metabox div..wcps_taxonomy_category{}
56
 
57
 
58
  #wcps_metabox ul.content_source_area {
@@ -96,89 +98,29 @@
96
  .form-table .wcps_ribbons {
97
  }
98
 
99
- #wcps_metabox #wcps_ribbon_custom {
100
- display: none;
101
- }
102
 
103
 
104
 
105
- #wcps_metabox .expandable .header label{
106
- float: right;
107
- }
108
 
109
 
110
- #wcps_metabox .bg_image_src {
 
 
111
  cursor: pointer;
112
- height: 50px;
113
- width: 50px;
114
- }
115
-
116
-
117
- #wcps_metabox .expandable .header {
118
- background: #a7e1ff none repeat scroll 0 0;
119
-
120
- }
121
-
122
- #wcps_metabox .expandable .item {
123
- background: #a7e1ff none repeat scroll 0 0;
124
- /* border-bottom: 1px solid rgb(153, 153, 153); */
125
- margin: 2px 0;
126
- padding: 5px;
127
- }
128
-
129
- #wcps_metabox .expandable .item .move {
130
- display: inline-block;
131
- padding: 5px;
132
- cursor: move;
133
- }
134
-
135
- #wcps_metabox .expandable .item .expand {
136
- display: inline-block;
137
- padding: 5px;
138
- cursor: pointer;
139
- }
140
-
141
- #wcps_metabox .expandable .options {
142
- background: #bde6fc;
143
  }
144
 
145
- #wcps_metabox .item .expand .fa-expand {
146
- display: inline-block;
147
- }
148
 
149
- #wcps_metabox .item .expand .fa-compress {
150
- display: none;
151
- }
152
- #wcps_metabox .item.active .expand .fa-compress {
153
- display: inline-block;
154
- }
155
- #wcps_metabox .item.active .expand .fa-expand {
156
- display: none;
157
  }
158
 
159
- .wcps-notice{}
160
- .wcps-notice span {
161
- padding: 8px 13px;
162
- display: block;
163
- background: #ffc245;
164
- color: #605d5d;
165
  }
166
 
167
 
168
 
169
 
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
4
 
5
  /*Admin CSS*/
6
 
7
+ .wcps-meta-box{
8
+ background: #fff none repeat scroll 0 0;
9
+ }
10
 
11
 
12
 
54
  }
55
 
56
 
57
+ #wcps_metabox div.wcps_taxonomy_category{}
58
 
59
 
60
  #wcps_metabox ul.content_source_area {
98
  .form-table .wcps_ribbons {
99
  }
100
 
 
 
 
101
 
102
 
103
 
 
 
 
104
 
105
 
106
+ #wcps_metabox .meta-query-list .remove {
107
+ background: rgb(255, 73, 10) none repeat scroll 0 0;
108
+ color: rgb(255, 255, 255);
109
  cursor: pointer;
110
+ margin-right: 10px;
111
+ padding: 1px 6px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  }
113
 
 
 
 
114
 
115
+ .wcps-settings{
116
+ background: #fff;
 
 
 
 
 
 
117
  }
118
 
119
+ #wcps_metabox_side .video-tutorials{}
120
+ #wcps_metabox_side .video-tutorials a{
121
+ text-decoration: none;
 
 
 
122
  }
123
 
124
 
125
 
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/admin/images/five-star.png DELETED
Binary file
assets/admin/js/codemirror.js ADDED
@@ -0,0 +1,8871 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ // This is CodeMirror (http://codemirror.net), a code editor
5
+ // implemented in JavaScript on top of the browser's DOM.
6
+ //
7
+ // You can find some technical background for some of the code below
8
+ // at http://marijnhaverbeke.nl/blog/#cm-internals .
9
+
10
+ (function(mod) {
11
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
12
+ module.exports = mod();
13
+ else if (typeof define == "function" && define.amd) // AMD
14
+ return define([], mod);
15
+ else // Plain browser env
16
+ this.CodeMirror = mod();
17
+ })(function() {
18
+ "use strict";
19
+
20
+ // BROWSER SNIFFING
21
+
22
+ // Kludges for bugs and behavior differences that can't be feature
23
+ // detected are enabled based on userAgent etc sniffing.
24
+ var userAgent = navigator.userAgent;
25
+ var platform = navigator.platform;
26
+
27
+ var gecko = /gecko\/\d/i.test(userAgent);
28
+ var ie_upto10 = /MSIE \d/.test(userAgent);
29
+ var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
30
+ var ie = ie_upto10 || ie_11up;
31
+ var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);
32
+ var webkit = /WebKit\//.test(userAgent);
33
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
34
+ var chrome = /Chrome\//.test(userAgent);
35
+ var presto = /Opera\//.test(userAgent);
36
+ var safari = /Apple Computer/.test(navigator.vendor);
37
+ var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
38
+ var phantom = /PhantomJS/.test(userAgent);
39
+
40
+ var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
41
+ // This is woefully incomplete. Suggestions for alternative methods welcome.
42
+ var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
43
+ var mac = ios || /Mac/.test(platform);
44
+ var windows = /win/i.test(platform);
45
+
46
+ var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
47
+ if (presto_version) presto_version = Number(presto_version[1]);
48
+ if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
49
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
50
+ var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
51
+ var captureRightClick = gecko || (ie && ie_version >= 9);
52
+
53
+ // Optimize some code when these features are not used.
54
+ var sawReadOnlySpans = false, sawCollapsedSpans = false;
55
+
56
+ // EDITOR CONSTRUCTOR
57
+
58
+ // A CodeMirror instance represents an editor. This is the object
59
+ // that user code is usually dealing with.
60
+
61
+ function CodeMirror(place, options) {
62
+ if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
63
+
64
+ this.options = options = options ? copyObj(options) : {};
65
+ // Determine effective options based on given values and defaults.
66
+ copyObj(defaults, options, false);
67
+ setGuttersForLineNumbers(options);
68
+
69
+ var doc = options.value;
70
+ if (typeof doc == "string") doc = new Doc(doc, options.mode, null, options.lineSeparator);
71
+ this.doc = doc;
72
+
73
+ var input = new CodeMirror.inputStyles[options.inputStyle](this);
74
+ var display = this.display = new Display(place, doc, input);
75
+ display.wrapper.CodeMirror = this;
76
+ updateGutters(this);
77
+ themeChanged(this);
78
+ if (options.lineWrapping)
79
+ this.display.wrapper.className += " CodeMirror-wrap";
80
+ if (options.autofocus && !mobile) display.input.focus();
81
+ initScrollbars(this);
82
+
83
+ this.state = {
84
+ keyMaps: [], // stores maps added by addKeyMap
85
+ overlays: [], // highlighting overlays, as added by addOverlay
86
+ modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info
87
+ overwrite: false,
88
+ delayingBlurEvent: false,
89
+ focused: false,
90
+ suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
91
+ pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll
92
+ selectingText: false,
93
+ draggingText: false,
94
+ highlight: new Delayed(), // stores highlight worker timeout
95
+ keySeq: null, // Unfinished key sequence
96
+ specialChars: null
97
+ };
98
+
99
+ var cm = this;
100
+
101
+ // Override magic textarea content restore that IE sometimes does
102
+ // on our hidden textarea on reload
103
+ if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20);
104
+
105
+ registerEventHandlers(this);
106
+ ensureGlobalHandlers();
107
+
108
+ startOperation(this);
109
+ this.curOp.forceUpdate = true;
110
+ attachDoc(this, doc);
111
+
112
+ if ((options.autofocus && !mobile) || cm.hasFocus())
113
+ setTimeout(bind(onFocus, this), 20);
114
+ else
115
+ onBlur(this);
116
+
117
+ for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
118
+ optionHandlers[opt](this, options[opt], Init);
119
+ maybeUpdateLineNumberWidth(this);
120
+ if (options.finishInit) options.finishInit(this);
121
+ for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
122
+ endOperation(this);
123
+ // Suppress optimizelegibility in Webkit, since it breaks text
124
+ // measuring on line wrapping boundaries.
125
+ if (webkit && options.lineWrapping &&
126
+ getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
127
+ display.lineDiv.style.textRendering = "auto";
128
+ }
129
+
130
+ // DISPLAY CONSTRUCTOR
131
+
132
+ // The display handles the DOM integration, both for input reading
133
+ // and content drawing. It holds references to DOM nodes and
134
+ // display-related state.
135
+
136
+ function Display(place, doc, input) {
137
+ var d = this;
138
+ this.input = input;
139
+
140
+ // Covers bottom-right square when both scrollbars are present.
141
+ d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
142
+ d.scrollbarFiller.setAttribute("cm-not-content", "true");
143
+ // Covers bottom of gutter when coverGutterNextToScrollbar is on
144
+ // and h scrollbar is present.
145
+ d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
146
+ d.gutterFiller.setAttribute("cm-not-content", "true");
147
+ // Will contain the actual code, positioned to cover the viewport.
148
+ d.lineDiv = elt("div", null, "CodeMirror-code");
149
+ // Elements are added to these to represent selection and cursors.
150
+ d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
151
+ d.cursorDiv = elt("div", null, "CodeMirror-cursors");
152
+ // A visibility: hidden element used to find the size of things.
153
+ d.measure = elt("div", null, "CodeMirror-measure");
154
+ // When lines outside of the viewport are measured, they are drawn in this.
155
+ d.lineMeasure = elt("div", null, "CodeMirror-measure");
156
+ // Wraps everything that needs to exist inside the vertically-padded coordinate system
157
+ d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
158
+ null, "position: relative; outline: none");
159
+ // Moved around its parent to cover visible view.
160
+ d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
161
+ // Set to the height of the document, allowing scrolling.
162
+ d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
163
+ d.sizerWidth = null;
164
+ // Behavior of elts with overflow: auto and padding is
165
+ // inconsistent across browsers. This is used to ensure the
166
+ // scrollable area is big enough.
167
+ d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
168
+ // Will contain the gutters, if any.
169
+ d.gutters = elt("div", null, "CodeMirror-gutters");
170
+ d.lineGutter = null;
171
+ // Actual scrollable element.
172
+ d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
173
+ d.scroller.setAttribute("tabIndex", "-1");
174
+ // The element in which the editor lives.
175
+ d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
176
+
177
+ // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
178
+ if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
179
+ if (!webkit && !(gecko && mobile)) d.scroller.draggable = true;
180
+
181
+ if (place) {
182
+ if (place.appendChild) place.appendChild(d.wrapper);
183
+ else place(d.wrapper);
184
+ }
185
+
186
+ // Current rendered range (may be bigger than the view window).
187
+ d.viewFrom = d.viewTo = doc.first;
188
+ d.reportedViewFrom = d.reportedViewTo = doc.first;
189
+ // Information about the rendered lines.
190
+ d.view = [];
191
+ d.renderedView = null;
192
+ // Holds info about a single rendered line when it was rendered
193
+ // for measurement, while not in view.
194
+ d.externalMeasured = null;
195
+ // Empty space (in pixels) above the view
196
+ d.viewOffset = 0;
197
+ d.lastWrapHeight = d.lastWrapWidth = 0;
198
+ d.updateLineNumbers = null;
199
+
200
+ d.nativeBarWidth = d.barHeight = d.barWidth = 0;
201
+ d.scrollbarsClipped = false;
202
+
203
+ // Used to only resize the line number gutter when necessary (when
204
+ // the amount of lines crosses a boundary that makes its width change)
205
+ d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
206
+ // Set to true when a non-horizontal-scrolling line widget is
207
+ // added. As an optimization, line widget aligning is skipped when
208
+ // this is false.
209
+ d.alignWidgets = false;
210
+
211
+ d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
212
+
213
+ // Tracks the maximum line length so that the horizontal scrollbar
214
+ // can be kept static when scrolling.
215
+ d.maxLine = null;
216
+ d.maxLineLength = 0;
217
+ d.maxLineChanged = false;
218
+
219
+ // Used for measuring wheel scrolling granularity
220
+ d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
221
+
222
+ // True when shift is held down.
223
+ d.shift = false;
224
+
225
+ // Used to track whether anything happened since the context menu
226
+ // was opened.
227
+ d.selForContextMenu = null;
228
+
229
+ d.activeTouch = null;
230
+
231
+ input.init(d);
232
+ }
233
+
234
+ // STATE UPDATES
235
+
236
+ // Used to get the editor into a consistent state again when options change.
237
+
238
+ function loadMode(cm) {
239
+ cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
240
+ resetModeState(cm);
241
+ }
242
+
243
+ function resetModeState(cm) {
244
+ cm.doc.iter(function(line) {
245
+ if (line.stateAfter) line.stateAfter = null;
246
+ if (line.styles) line.styles = null;
247
+ });
248
+ cm.doc.frontier = cm.doc.first;
249
+ startWorker(cm, 100);
250
+ cm.state.modeGen++;
251
+ if (cm.curOp) regChange(cm);
252
+ }
253
+
254
+ function wrappingChanged(cm) {
255
+ if (cm.options.lineWrapping) {
256
+ addClass(cm.display.wrapper, "CodeMirror-wrap");
257
+ cm.display.sizer.style.minWidth = "";
258
+ cm.display.sizerWidth = null;
259
+ } else {
260
+ rmClass(cm.display.wrapper, "CodeMirror-wrap");
261
+ findMaxLine(cm);
262
+ }
263
+ estimateLineHeights(cm);
264
+ regChange(cm);
265
+ clearCaches(cm);
266
+ setTimeout(function(){updateScrollbars(cm);}, 100);
267
+ }
268
+
269
+ // Returns a function that estimates the height of a line, to use as
270
+ // first approximation until the line becomes visible (and is thus
271
+ // properly measurable).
272
+ function estimateHeight(cm) {
273
+ var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
274
+ var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
275
+ return function(line) {
276
+ if (lineIsHidden(cm.doc, line)) return 0;
277
+
278
+ var widgetsHeight = 0;
279
+ if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {
280
+ if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;
281
+ }
282
+
283
+ if (wrapping)
284
+ return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;
285
+ else
286
+ return widgetsHeight + th;
287
+ };
288
+ }
289
+
290
+ function estimateLineHeights(cm) {
291
+ var doc = cm.doc, est = estimateHeight(cm);
292
+ doc.iter(function(line) {
293
+ var estHeight = est(line);
294
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
295
+ });
296
+ }
297
+
298
+ function themeChanged(cm) {
299
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
300
+ cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
301
+ clearCaches(cm);
302
+ }
303
+
304
+ function guttersChanged(cm) {
305
+ updateGutters(cm);
306
+ regChange(cm);
307
+ setTimeout(function(){alignHorizontally(cm);}, 20);
308
+ }
309
+
310
+ // Rebuild the gutter elements, ensure the margin to the left of the
311
+ // code matches their width.
312
+ function updateGutters(cm) {
313
+ var gutters = cm.display.gutters, specs = cm.options.gutters;
314
+ removeChildren(gutters);
315
+ for (var i = 0; i < specs.length; ++i) {
316
+ var gutterClass = specs[i];
317
+ var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
318
+ if (gutterClass == "CodeMirror-linenumbers") {
319
+ cm.display.lineGutter = gElt;
320
+ gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
321
+ }
322
+ }
323
+ gutters.style.display = i ? "" : "none";
324
+ updateGutterSpace(cm);
325
+ }
326
+
327
+ function updateGutterSpace(cm) {
328
+ var width = cm.display.gutters.offsetWidth;
329
+ cm.display.sizer.style.marginLeft = width + "px";
330
+ }
331
+
332
+ // Compute the character length of a line, taking into account
333
+ // collapsed ranges (see markText) that might hide parts, and join
334
+ // other lines onto it.
335
+ function lineLength(line) {
336
+ if (line.height == 0) return 0;
337
+ var len = line.text.length, merged, cur = line;
338
+ while (merged = collapsedSpanAtStart(cur)) {
339
+ var found = merged.find(0, true);
340
+ cur = found.from.line;
341
+ len += found.from.ch - found.to.ch;
342
+ }
343
+ cur = line;
344
+ while (merged = collapsedSpanAtEnd(cur)) {
345
+ var found = merged.find(0, true);
346
+ len -= cur.text.length - found.from.ch;
347
+ cur = found.to.line;
348
+ len += cur.text.length - found.to.ch;
349
+ }
350
+ return len;
351
+ }
352
+
353
+ // Find the longest line in the document.
354
+ function findMaxLine(cm) {
355
+ var d = cm.display, doc = cm.doc;
356
+ d.maxLine = getLine(doc, doc.first);
357
+ d.maxLineLength = lineLength(d.maxLine);
358
+ d.maxLineChanged = true;
359
+ doc.iter(function(line) {
360
+ var len = lineLength(line);
361
+ if (len > d.maxLineLength) {
362
+ d.maxLineLength = len;
363
+ d.maxLine = line;
364
+ }
365
+ });
366
+ }
367
+
368
+ // Make sure the gutters options contains the element
369
+ // "CodeMirror-linenumbers" when the lineNumbers option is true.
370
+ function setGuttersForLineNumbers(options) {
371
+ var found = indexOf(options.gutters, "CodeMirror-linenumbers");
372
+ if (found == -1 && options.lineNumbers) {
373
+ options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
374
+ } else if (found > -1 && !options.lineNumbers) {
375
+ options.gutters = options.gutters.slice(0);
376
+ options.gutters.splice(found, 1);
377
+ }
378
+ }
379
+
380
+ // SCROLLBARS
381
+
382
+ // Prepare DOM reads needed to update the scrollbars. Done in one
383
+ // shot to minimize update/measure roundtrips.
384
+ function measureForScrollbars(cm) {
385
+ var d = cm.display, gutterW = d.gutters.offsetWidth;
386
+ var docH = Math.round(cm.doc.height + paddingVert(cm.display));
387
+ return {
388
+ clientHeight: d.scroller.clientHeight,
389
+ viewHeight: d.wrapper.clientHeight,
390
+ scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
391
+ viewWidth: d.wrapper.clientWidth,
392
+ barLeft: cm.options.fixedGutter ? gutterW : 0,
393
+ docHeight: docH,
394
+ scrollHeight: docH + scrollGap(cm) + d.barHeight,
395
+ nativeBarWidth: d.nativeBarWidth,
396
+ gutterWidth: gutterW
397
+ };
398
+ }
399
+
400
+ function NativeScrollbars(place, scroll, cm) {
401
+ this.cm = cm;
402
+ var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
403
+ var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
404
+ place(vert); place(horiz);
405
+
406
+ on(vert, "scroll", function() {
407
+ if (vert.clientHeight) scroll(vert.scrollTop, "vertical");
408
+ });
409
+ on(horiz, "scroll", function() {
410
+ if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal");
411
+ });
412
+
413
+ this.checkedZeroWidth = false;
414
+ // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
415
+ if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px";
416
+ }
417
+
418
+ NativeScrollbars.prototype = copyObj({
419
+ update: function(measure) {
420
+ var needsH = measure.scrollWidth > measure.clientWidth + 1;
421
+ var needsV = measure.scrollHeight > measure.clientHeight + 1;
422
+ var sWidth = measure.nativeBarWidth;
423
+
424
+ if (needsV) {
425
+ this.vert.style.display = "block";
426
+ this.vert.style.bottom = needsH ? sWidth + "px" : "0";
427
+ var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
428
+ // A bug in IE8 can cause this value to be negative, so guard it.
429
+ this.vert.firstChild.style.height =
430
+ Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
431
+ } else {
432
+ this.vert.style.display = "";
433
+ this.vert.firstChild.style.height = "0";
434
+ }
435
+
436
+ if (needsH) {
437
+ this.horiz.style.display = "block";
438
+ this.horiz.style.right = needsV ? sWidth + "px" : "0";
439
+ this.horiz.style.left = measure.barLeft + "px";
440
+ var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
441
+ this.horiz.firstChild.style.width =
442
+ (measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
443
+ } else {
444
+ this.horiz.style.display = "";
445
+ this.horiz.firstChild.style.width = "0";
446
+ }
447
+
448
+ if (!this.checkedZeroWidth && measure.clientHeight > 0) {
449
+ if (sWidth == 0) this.zeroWidthHack();
450
+ this.checkedZeroWidth = true;
451
+ }
452
+
453
+ return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};
454
+ },
455
+ setScrollLeft: function(pos) {
456
+ if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;
457
+ if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz);
458
+ },
459
+ setScrollTop: function(pos) {
460
+ if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;
461
+ if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert);
462
+ },
463
+ zeroWidthHack: function() {
464
+ var w = mac && !mac_geMountainLion ? "12px" : "18px";
465
+ this.horiz.style.height = this.vert.style.width = w;
466
+ this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
467
+ this.disableHoriz = new Delayed;
468
+ this.disableVert = new Delayed;
469
+ },
470
+ enableZeroWidthBar: function(bar, delay) {
471
+ bar.style.pointerEvents = "auto";
472
+ function maybeDisable() {
473
+ // To find out whether the scrollbar is still visible, we
474
+ // check whether the element under the pixel in the bottom
475
+ // left corner of the scrollbar box is the scrollbar box
476
+ // itself (when the bar is still visible) or its filler child
477
+ // (when the bar is hidden). If it is still visible, we keep
478
+ // it enabled, if it's hidden, we disable pointer events.
479
+ var box = bar.getBoundingClientRect();
480
+ var elt = document.elementFromPoint(box.left + 1, box.bottom - 1);
481
+ if (elt != bar) bar.style.pointerEvents = "none";
482
+ else delay.set(1000, maybeDisable);
483
+ }
484
+ delay.set(1000, maybeDisable);
485
+ },
486
+ clear: function() {
487
+ var parent = this.horiz.parentNode;
488
+ parent.removeChild(this.horiz);
489
+ parent.removeChild(this.vert);
490
+ }
491
+ }, NativeScrollbars.prototype);
492
+
493
+ function NullScrollbars() {}
494
+
495
+ NullScrollbars.prototype = copyObj({
496
+ update: function() { return {bottom: 0, right: 0}; },
497
+ setScrollLeft: function() {},
498
+ setScrollTop: function() {},
499
+ clear: function() {}
500
+ }, NullScrollbars.prototype);
501
+
502
+ CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};
503
+
504
+ function initScrollbars(cm) {
505
+ if (cm.display.scrollbars) {
506
+ cm.display.scrollbars.clear();
507
+ if (cm.display.scrollbars.addClass)
508
+ rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);
509
+ }
510
+
511
+ cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {
512
+ cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
513
+ // Prevent clicks in the scrollbars from killing focus
514
+ on(node, "mousedown", function() {
515
+ if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0);
516
+ });
517
+ node.setAttribute("cm-not-content", "true");
518
+ }, function(pos, axis) {
519
+ if (axis == "horizontal") setScrollLeft(cm, pos);
520
+ else setScrollTop(cm, pos);
521
+ }, cm);
522
+ if (cm.display.scrollbars.addClass)
523
+ addClass(cm.display.wrapper, cm.display.scrollbars.addClass);
524
+ }
525
+
526
+ function updateScrollbars(cm, measure) {
527
+ if (!measure) measure = measureForScrollbars(cm);
528
+ var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
529
+ updateScrollbarsInner(cm, measure);
530
+ for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
531
+ if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
532
+ updateHeightsInViewport(cm);
533
+ updateScrollbarsInner(cm, measureForScrollbars(cm));
534
+ startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
535
+ }
536
+ }
537
+
538
+ // Re-synchronize the fake scrollbars with the actual size of the
539
+ // content.
540
+ function updateScrollbarsInner(cm, measure) {
541
+ var d = cm.display;
542
+ var sizes = d.scrollbars.update(measure);
543
+
544
+ d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
545
+ d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
546
+
547
+ if (sizes.right && sizes.bottom) {
548
+ d.scrollbarFiller.style.display = "block";
549
+ d.scrollbarFiller.style.height = sizes.bottom + "px";
550
+ d.scrollbarFiller.style.width = sizes.right + "px";
551
+ } else d.scrollbarFiller.style.display = "";
552
+ if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
553
+ d.gutterFiller.style.display = "block";
554
+ d.gutterFiller.style.height = sizes.bottom + "px";
555
+ d.gutterFiller.style.width = measure.gutterWidth + "px";
556
+ } else d.gutterFiller.style.display = "";
557
+ }
558
+
559
+ // Compute the lines that are visible in a given viewport (defaults
560
+ // the the current scroll position). viewport may contain top,
561
+ // height, and ensure (see op.scrollToPos) properties.
562
+ function visibleLines(display, doc, viewport) {
563
+ var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
564
+ top = Math.floor(top - paddingTop(display));
565
+ var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
566
+
567
+ var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
568
+ // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
569
+ // forces those lines into the viewport (if possible).
570
+ if (viewport && viewport.ensure) {
571
+ var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
572
+ if (ensureFrom < from) {
573
+ from = ensureFrom;
574
+ to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
575
+ } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
576
+ from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
577
+ to = ensureTo;
578
+ }
579
+ }
580
+ return {from: from, to: Math.max(to, from + 1)};
581
+ }
582
+
583
+ // LINE NUMBERS
584
+
585
+ // Re-align line numbers and gutter marks to compensate for
586
+ // horizontal scrolling.
587
+ function alignHorizontally(cm) {
588
+ var display = cm.display, view = display.view;
589
+ if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
590
+ var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
591
+ var gutterW = display.gutters.offsetWidth, left = comp + "px";
592
+ for (var i = 0; i < view.length; i++) if (!view[i].hidden) {
593
+ if (cm.options.fixedGutter && view[i].gutter)
594
+ view[i].gutter.style.left = left;
595
+ var align = view[i].alignable;
596
+ if (align) for (var j = 0; j < align.length; j++)
597
+ align[j].style.left = left;
598
+ }
599
+ if (cm.options.fixedGutter)
600
+ display.gutters.style.left = (comp + gutterW) + "px";
601
+ }
602
+
603
+ // Used to ensure that the line number gutter is still the right
604
+ // size for the current document size. Returns true when an update
605
+ // is needed.
606
+ function maybeUpdateLineNumberWidth(cm) {
607
+ if (!cm.options.lineNumbers) return false;
608
+ var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
609
+ if (last.length != display.lineNumChars) {
610
+ var test = display.measure.appendChild(elt("div", [elt("div", last)],
611
+ "CodeMirror-linenumber CodeMirror-gutter-elt"));
612
+ var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
613
+ display.lineGutter.style.width = "";
614
+ display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
615
+ display.lineNumWidth = display.lineNumInnerWidth + padding;
616
+ display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
617
+ display.lineGutter.style.width = display.lineNumWidth + "px";
618
+ updateGutterSpace(cm);
619
+ return true;
620
+ }
621
+ return false;
622
+ }
623
+
624
+ function lineNumberFor(options, i) {
625
+ return String(options.lineNumberFormatter(i + options.firstLineNumber));
626
+ }
627
+
628
+ // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
629
+ // but using getBoundingClientRect to get a sub-pixel-accurate
630
+ // result.
631
+ function compensateForHScroll(display) {
632
+ return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;
633
+ }
634
+
635
+ // DISPLAY DRAWING
636
+
637
+ function DisplayUpdate(cm, viewport, force) {
638
+ var display = cm.display;
639
+
640
+ this.viewport = viewport;
641
+ // Store some values that we'll need later (but don't want to force a relayout for)
642
+ this.visible = visibleLines(display, cm.doc, viewport);
643
+ this.editorIsHidden = !display.wrapper.offsetWidth;
644
+ this.wrapperHeight = display.wrapper.clientHeight;
645
+ this.wrapperWidth = display.wrapper.clientWidth;
646
+ this.oldDisplayWidth = displayWidth(cm);
647
+ this.force = force;
648
+ this.dims = getDimensions(cm);
649
+ this.events = [];
650
+ }
651
+
652
+ DisplayUpdate.prototype.signal = function(emitter, type) {
653
+ if (hasHandler(emitter, type))
654
+ this.events.push(arguments);
655
+ };
656
+ DisplayUpdate.prototype.finish = function() {
657
+ for (var i = 0; i < this.events.length; i++)
658
+ signal.apply(null, this.events[i]);
659
+ };
660
+
661
+ function maybeClipScrollbars(cm) {
662
+ var display = cm.display;
663
+ if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
664
+ display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
665
+ display.heightForcer.style.height = scrollGap(cm) + "px";
666
+ display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
667
+ display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
668
+ display.scrollbarsClipped = true;
669
+ }
670
+ }
671
+
672
+ // Does the actual updating of the line display. Bails out
673
+ // (returning false) when there is nothing to be done and forced is
674
+ // false.
675
+ function updateDisplayIfNeeded(cm, update) {
676
+ var display = cm.display, doc = cm.doc;
677
+
678
+ if (update.editorIsHidden) {
679
+ resetView(cm);
680
+ return false;
681
+ }
682
+
683
+ // Bail out if the visible area is already rendered and nothing changed.
684
+ if (!update.force &&
685
+ update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
686
+ (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
687
+ display.renderedView == display.view && countDirtyView(cm) == 0)
688
+ return false;
689
+
690
+ if (maybeUpdateLineNumberWidth(cm)) {
691
+ resetView(cm);
692
+ update.dims = getDimensions(cm);
693
+ }
694
+
695
+ // Compute a suitable new viewport (from & to)
696
+ var end = doc.first + doc.size;
697
+ var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
698
+ var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
699
+ if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
700
+ if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
701
+ if (sawCollapsedSpans) {
702
+ from = visualLineNo(cm.doc, from);
703
+ to = visualLineEndNo(cm.doc, to);
704
+ }
705
+
706
+ var different = from != display.viewFrom || to != display.viewTo ||
707
+ display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
708
+ adjustView(cm, from, to);
709
+
710
+ display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
711
+ // Position the mover div to align with the current scroll position
712
+ cm.display.mover.style.top = display.viewOffset + "px";
713
+
714
+ var toUpdate = countDirtyView(cm);
715
+ if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
716
+ (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
717
+ return false;
718
+
719
+ // For big changes, we hide the enclosing element during the
720
+ // update, since that speeds up the operations on most browsers.
721
+ var focused = activeElt();
722
+ if (toUpdate > 4) display.lineDiv.style.display = "none";
723
+ patchDisplay(cm, display.updateLineNumbers, update.dims);
724
+ if (toUpdate > 4) display.lineDiv.style.display = "";
725
+ display.renderedView = display.view;
726
+ // There might have been a widget with a focused element that got
727
+ // hidden or updated, if so re-focus it.
728
+ if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();
729
+
730
+ // Prevent selection and cursors from interfering with the scroll
731
+ // width and height.
732
+ removeChildren(display.cursorDiv);
733
+ removeChildren(display.selectionDiv);
734
+ display.gutters.style.height = display.sizer.style.minHeight = 0;
735
+
736
+ if (different) {
737
+ display.lastWrapHeight = update.wrapperHeight;
738
+ display.lastWrapWidth = update.wrapperWidth;
739
+ startWorker(cm, 400);
740
+ }
741
+
742
+ display.updateLineNumbers = null;
743
+
744
+ return true;
745
+ }
746
+
747
+ function postUpdateDisplay(cm, update) {
748
+ var viewport = update.viewport;
749
+ for (var first = true;; first = false) {
750
+ if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
751
+ // Clip forced viewport to actual scrollable area.
752
+ if (viewport && viewport.top != null)
753
+ viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};
754
+ // Updated line heights might result in the drawn area not
755
+ // actually covering the viewport. Keep looping until it does.
756
+ update.visible = visibleLines(cm.display, cm.doc, viewport);
757
+ if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
758
+ break;
759
+ }
760
+ if (!updateDisplayIfNeeded(cm, update)) break;
761
+ updateHeightsInViewport(cm);
762
+ var barMeasure = measureForScrollbars(cm);
763
+ updateSelection(cm);
764
+ setDocumentHeight(cm, barMeasure);
765
+ updateScrollbars(cm, barMeasure);
766
+ }
767
+
768
+ update.signal(cm, "update", cm);
769
+ if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
770
+ update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
771
+ cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
772
+ }
773
+ }
774
+
775
+ function updateDisplaySimple(cm, viewport) {
776
+ var update = new DisplayUpdate(cm, viewport);
777
+ if (updateDisplayIfNeeded(cm, update)) {
778
+ updateHeightsInViewport(cm);
779
+ postUpdateDisplay(cm, update);
780
+ var barMeasure = measureForScrollbars(cm);
781
+ updateSelection(cm);
782
+ setDocumentHeight(cm, barMeasure);
783
+ updateScrollbars(cm, barMeasure);
784
+ update.finish();
785
+ }
786
+ }
787
+
788
+ function setDocumentHeight(cm, measure) {
789
+ cm.display.sizer.style.minHeight = measure.docHeight + "px";
790
+ var total = measure.docHeight + cm.display.barHeight;
791
+ cm.display.heightForcer.style.top = total + "px";
792
+ cm.display.gutters.style.height = Math.max(total + scrollGap(cm), measure.clientHeight) + "px";
793
+ }
794
+
795
+ // Read the actual heights of the rendered lines, and update their
796
+ // stored heights to match.
797
+ function updateHeightsInViewport(cm) {
798
+ var display = cm.display;
799
+ var prevBottom = display.lineDiv.offsetTop;
800
+ for (var i = 0; i < display.view.length; i++) {
801
+ var cur = display.view[i], height;
802
+ if (cur.hidden) continue;
803
+ if (ie && ie_version < 8) {
804
+ var bot = cur.node.offsetTop + cur.node.offsetHeight;
805
+ height = bot - prevBottom;
806
+ prevBottom = bot;
807
+ } else {
808
+ var box = cur.node.getBoundingClientRect();
809
+ height = box.bottom - box.top;
810
+ }
811
+ var diff = cur.line.height - height;
812
+ if (height < 2) height = textHeight(display);
813
+ if (diff > .001 || diff < -.001) {
814
+ updateLineHeight(cur.line, height);
815
+ updateWidgetHeight(cur.line);
816
+ if (cur.rest) for (var j = 0; j < cur.rest.length; j++)
817
+ updateWidgetHeight(cur.rest[j]);
818
+ }
819
+ }
820
+ }
821
+
822
+ // Read and store the height of line widgets associated with the
823
+ // given line.
824
+ function updateWidgetHeight(line) {
825
+ if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)
826
+ line.widgets[i].height = line.widgets[i].node.offsetHeight;
827
+ }
828
+
829
+ // Do a bulk-read of the DOM positions and sizes needed to draw the
830
+ // view, so that we don't interleave reading and writing to the DOM.
831
+ function getDimensions(cm) {
832
+ var d = cm.display, left = {}, width = {};
833
+ var gutterLeft = d.gutters.clientLeft;
834
+ for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
835
+ left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
836
+ width[cm.options.gutters[i]] = n.clientWidth;
837
+ }
838
+ return {fixedPos: compensateForHScroll(d),
839
+ gutterTotalWidth: d.gutters.offsetWidth,
840
+ gutterLeft: left,
841
+ gutterWidth: width,
842
+ wrapperWidth: d.wrapper.clientWidth};
843
+ }
844
+
845
+ // Sync the actual display DOM structure with display.view, removing
846
+ // nodes for lines that are no longer in view, and creating the ones
847
+ // that are not there yet, and updating the ones that are out of
848
+ // date.
849
+ function patchDisplay(cm, updateNumbersFrom, dims) {
850
+ var display = cm.display, lineNumbers = cm.options.lineNumbers;
851
+ var container = display.lineDiv, cur = container.firstChild;
852
+
853
+ function rm(node) {
854
+ var next = node.nextSibling;
855
+ // Works around a throw-scroll bug in OS X Webkit
856
+ if (webkit && mac && cm.display.currentWheelTarget == node)
857
+ node.style.display = "none";
858
+ else
859
+ node.parentNode.removeChild(node);
860
+ return next;
861
+ }
862
+
863
+ var view = display.view, lineN = display.viewFrom;
864
+ // Loop over the elements in the view, syncing cur (the DOM nodes
865
+ // in display.lineDiv) with the view as we go.
866
+ for (var i = 0; i < view.length; i++) {
867
+ var lineView = view[i];
868
+ if (lineView.hidden) {
869
+ } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
870
+ var node = buildLineElement(cm, lineView, lineN, dims);
871
+ container.insertBefore(node, cur);
872
+ } else { // Already drawn
873
+ while (cur != lineView.node) cur = rm(cur);
874
+ var updateNumber = lineNumbers && updateNumbersFrom != null &&
875
+ updateNumbersFrom <= lineN && lineView.lineNumber;
876
+ if (lineView.changes) {
877
+ if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;
878
+ updateLineForChanges(cm, lineView, lineN, dims);
879
+ }
880
+ if (updateNumber) {
881
+ removeChildren(lineView.lineNumber);
882
+ lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
883
+ }
884
+ cur = lineView.node.nextSibling;
885
+ }
886
+ lineN += lineView.size;
887
+ }
888
+ while (cur) cur = rm(cur);
889
+ }
890
+
891
+ // When an aspect of a line changes, a string is added to
892
+ // lineView.changes. This updates the relevant part of the line's
893
+ // DOM structure.
894
+ function updateLineForChanges(cm, lineView, lineN, dims) {
895
+ for (var j = 0; j < lineView.changes.length; j++) {
896
+ var type = lineView.changes[j];
897
+ if (type == "text") updateLineText(cm, lineView);
898
+ else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);
899
+ else if (type == "class") updateLineClasses(lineView);
900
+ else if (type == "widget") updateLineWidgets(cm, lineView, dims);
901
+ }
902
+ lineView.changes = null;
903
+ }
904
+
905
+ // Lines with gutter elements, widgets or a background class need to
906
+ // be wrapped, and have the extra elements added to the wrapper div
907
+ function ensureLineWrapped(lineView) {
908
+ if (lineView.node == lineView.text) {
909
+ lineView.node = elt("div", null, null, "position: relative");
910
+ if (lineView.text.parentNode)
911
+ lineView.text.parentNode.replaceChild(lineView.node, lineView.text);
912
+ lineView.node.appendChild(lineView.text);
913
+ if (ie && ie_version < 8) lineView.node.style.zIndex = 2;
914
+ }
915
+ return lineView.node;
916
+ }
917
+
918
+ function updateLineBackground(lineView) {
919
+ var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
920
+ if (cls) cls += " CodeMirror-linebackground";
921
+ if (lineView.background) {
922
+ if (cls) lineView.background.className = cls;
923
+ else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
924
+ } else if (cls) {
925
+ var wrap = ensureLineWrapped(lineView);
926
+ lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
927
+ }
928
+ }
929
+
930
+ // Wrapper around buildLineContent which will reuse the structure
931
+ // in display.externalMeasured when possible.
932
+ function getLineContent(cm, lineView) {
933
+ var ext = cm.display.externalMeasured;
934
+ if (ext && ext.line == lineView.line) {
935
+ cm.display.externalMeasured = null;
936
+ lineView.measure = ext.measure;
937
+ return ext.built;
938
+ }
939
+ return buildLineContent(cm, lineView);
940
+ }
941
+
942
+ // Redraw the line's text. Interacts with the background and text
943
+ // classes because the mode may output tokens that influence these
944
+ // classes.
945
+ function updateLineText(cm, lineView) {
946
+ var cls = lineView.text.className;
947
+ var built = getLineContent(cm, lineView);
948
+ if (lineView.text == lineView.node) lineView.node = built.pre;
949
+ lineView.text.parentNode.replaceChild(built.pre, lineView.text);
950
+ lineView.text = built.pre;
951
+ if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
952
+ lineView.bgClass = built.bgClass;
953
+ lineView.textClass = built.textClass;
954
+ updateLineClasses(lineView);
955
+ } else if (cls) {
956
+ lineView.text.className = cls;
957
+ }
958
+ }
959
+
960
+ function updateLineClasses(lineView) {
961
+ updateLineBackground(lineView);
962
+ if (lineView.line.wrapClass)
963
+ ensureLineWrapped(lineView).className = lineView.line.wrapClass;
964
+ else if (lineView.node != lineView.text)
965
+ lineView.node.className = "";
966
+ var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
967
+ lineView.text.className = textClass || "";
968
+ }
969
+
970
+ function updateLineGutter(cm, lineView, lineN, dims) {
971
+ if (lineView.gutter) {
972
+ lineView.node.removeChild(lineView.gutter);
973
+ lineView.gutter = null;
974
+ }
975
+ if (lineView.gutterBackground) {
976
+ lineView.node.removeChild(lineView.gutterBackground);
977
+ lineView.gutterBackground = null;
978
+ }
979
+ if (lineView.line.gutterClass) {
980
+ var wrap = ensureLineWrapped(lineView);
981
+ lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
982
+ "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +
983
+ "px; width: " + dims.gutterTotalWidth + "px");
984
+ wrap.insertBefore(lineView.gutterBackground, lineView.text);
985
+ }
986
+ var markers = lineView.line.gutterMarkers;
987
+ if (cm.options.lineNumbers || markers) {
988
+ var wrap = ensureLineWrapped(lineView);
989
+ var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " +
990
+ (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px");
991
+ cm.display.input.setUneditable(gutterWrap);
992
+ wrap.insertBefore(gutterWrap, lineView.text);
993
+ if (lineView.line.gutterClass)
994
+ gutterWrap.className += " " + lineView.line.gutterClass;
995
+ if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
996
+ lineView.lineNumber = gutterWrap.appendChild(
997
+ elt("div", lineNumberFor(cm.options, lineN),
998
+ "CodeMirror-linenumber CodeMirror-gutter-elt",
999
+ "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
1000
+ + cm.display.lineNumInnerWidth + "px"));
1001
+ if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {
1002
+ var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
1003
+ if (found)
1004
+ gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
1005
+ dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
1006
+ }
1007
+ }
1008
+ }
1009
+
1010
+ function updateLineWidgets(cm, lineView, dims) {
1011
+ if (lineView.alignable) lineView.alignable = null;
1012
+ for (var node = lineView.node.firstChild, next; node; node = next) {
1013
+ var next = node.nextSibling;
1014
+ if (node.className == "CodeMirror-linewidget")
1015
+ lineView.node.removeChild(node);
1016
+ }
1017
+ insertLineWidgets(cm, lineView, dims);
1018
+ }
1019
+
1020
+ // Build a line's DOM representation from scratch
1021
+ function buildLineElement(cm, lineView, lineN, dims) {
1022
+ var built = getLineContent(cm, lineView);
1023
+ lineView.text = lineView.node = built.pre;
1024
+ if (built.bgClass) lineView.bgClass = built.bgClass;
1025
+ if (built.textClass) lineView.textClass = built.textClass;
1026
+
1027
+ updateLineClasses(lineView);
1028
+ updateLineGutter(cm, lineView, lineN, dims);
1029
+ insertLineWidgets(cm, lineView, dims);
1030
+ return lineView.node;
1031
+ }
1032
+
1033
+ // A lineView may contain multiple logical lines (when merged by
1034
+ // collapsed spans). The widgets for all of them need to be drawn.
1035
+ function insertLineWidgets(cm, lineView, dims) {
1036
+ insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
1037
+ if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
1038
+ insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false);
1039
+ }
1040
+
1041
+ function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
1042
+ if (!line.widgets) return;
1043
+ var wrap = ensureLineWrapped(lineView);
1044
+ for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
1045
+ var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
1046
+ if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true");
1047
+ positionLineWidget(widget, node, lineView, dims);
1048
+ cm.display.input.setUneditable(node);
1049
+ if (allowAbove && widget.above)
1050
+ wrap.insertBefore(node, lineView.gutter || lineView.text);
1051
+ else
1052
+ wrap.appendChild(node);
1053
+ signalLater(widget, "redraw");
1054
+ }
1055
+ }
1056
+
1057
+ function positionLineWidget(widget, node, lineView, dims) {
1058
+ if (widget.noHScroll) {
1059
+ (lineView.alignable || (lineView.alignable = [])).push(node);
1060
+ var width = dims.wrapperWidth;
1061
+ node.style.left = dims.fixedPos + "px";
1062
+ if (!widget.coverGutter) {
1063
+ width -= dims.gutterTotalWidth;
1064
+ node.style.paddingLeft = dims.gutterTotalWidth + "px";
1065
+ }
1066
+ node.style.width = width + "px";
1067
+ }
1068
+ if (widget.coverGutter) {
1069
+ node.style.zIndex = 5;
1070
+ node.style.position = "relative";
1071
+ if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
1072
+ }
1073
+ }
1074
+
1075
+ // POSITION OBJECT
1076
+
1077
+ // A Pos instance represents a position within the text.
1078
+ var Pos = CodeMirror.Pos = function(line, ch) {
1079
+ if (!(this instanceof Pos)) return new Pos(line, ch);
1080
+ this.line = line; this.ch = ch;
1081
+ };
1082
+
1083
+ // Compare two positions, return 0 if they are the same, a negative
1084
+ // number when a is less, and a positive number otherwise.
1085
+ var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };
1086
+
1087
+ function copyPos(x) {return Pos(x.line, x.ch);}
1088
+ function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }
1089
+ function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }
1090
+
1091
+ // INPUT HANDLING
1092
+
1093
+ function ensureFocus(cm) {
1094
+ if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
1095
+ }
1096
+
1097
+ function isReadOnly(cm) {
1098
+ return cm.options.readOnly || cm.doc.cantEdit;
1099
+ }
1100
+
1101
+ // This will be set to an array of strings when copying, so that,
1102
+ // when pasting, we know what kind of selections the copied text
1103
+ // was made out of.
1104
+ var lastCopied = null;
1105
+
1106
+ function applyTextInput(cm, inserted, deleted, sel, origin) {
1107
+ var doc = cm.doc;
1108
+ cm.display.shift = false;
1109
+ if (!sel) sel = doc.sel;
1110
+
1111
+ var paste = cm.state.pasteIncoming || origin == "paste";
1112
+ var textLines = doc.splitLines(inserted), multiPaste = null;
1113
+ // When pasing N lines into N selections, insert one line per selection
1114
+ if (paste && sel.ranges.length > 1) {
1115
+ if (lastCopied && lastCopied.join("\n") == inserted) {
1116
+ if (sel.ranges.length % lastCopied.length == 0) {
1117
+ multiPaste = [];
1118
+ for (var i = 0; i < lastCopied.length; i++)
1119
+ multiPaste.push(doc.splitLines(lastCopied[i]));
1120
+ }
1121
+ } else if (textLines.length == sel.ranges.length) {
1122
+ multiPaste = map(textLines, function(l) { return [l]; });
1123
+ }
1124
+ }
1125
+
1126
+ // Normal behavior is to insert the new text into every selection
1127
+ for (var i = sel.ranges.length - 1; i >= 0; i--) {
1128
+ var range = sel.ranges[i];
1129
+ var from = range.from(), to = range.to();
1130
+ if (range.empty()) {
1131
+ if (deleted && deleted > 0) // Handle deletion
1132
+ from = Pos(from.line, from.ch - deleted);
1133
+ else if (cm.state.overwrite && !paste) // Handle overwrite
1134
+ to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
1135
+ }
1136
+ var updateInput = cm.curOp.updateInput;
1137
+ var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
1138
+ origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")};
1139
+ makeChange(cm.doc, changeEvent);
1140
+ signalLater(cm, "inputRead", cm, changeEvent);
1141
+ }
1142
+ if (inserted && !paste)
1143
+ triggerElectric(cm, inserted);
1144
+
1145
+ ensureCursorVisible(cm);
1146
+ cm.curOp.updateInput = updateInput;
1147
+ cm.curOp.typing = true;
1148
+ cm.state.pasteIncoming = cm.state.cutIncoming = false;
1149
+ }
1150
+
1151
+ function handlePaste(e, cm) {
1152
+ var pasted = e.clipboardData && e.clipboardData.getData("text/plain");
1153
+ if (pasted) {
1154
+ e.preventDefault();
1155
+ if (!isReadOnly(cm) && !cm.options.disableInput)
1156
+ runInOp(cm, function() { applyTextInput(cm, pasted, 0, null, "paste"); });
1157
+ return true;
1158
+ }
1159
+ }
1160
+
1161
+ function triggerElectric(cm, inserted) {
1162
+ // When an 'electric' character is inserted, immediately trigger a reindent
1163
+ if (!cm.options.electricChars || !cm.options.smartIndent) return;
1164
+ var sel = cm.doc.sel;
1165
+
1166
+ for (var i = sel.ranges.length - 1; i >= 0; i--) {
1167
+ var range = sel.ranges[i];
1168
+ if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue;
1169
+ var mode = cm.getModeAt(range.head);
1170
+ var indented = false;
1171
+ if (mode.electricChars) {
1172
+ for (var j = 0; j < mode.electricChars.length; j++)
1173
+ if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
1174
+ indented = indentLine(cm, range.head.line, "smart");
1175
+ break;
1176
+ }
1177
+ } else if (mode.electricInput) {
1178
+ if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
1179
+ indented = indentLine(cm, range.head.line, "smart");
1180
+ }
1181
+ if (indented) signalLater(cm, "electricInput", cm, range.head.line);
1182
+ }
1183
+ }
1184
+
1185
+ function copyableRanges(cm) {
1186
+ var text = [], ranges = [];
1187
+ for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
1188
+ var line = cm.doc.sel.ranges[i].head.line;
1189
+ var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
1190
+ ranges.push(lineRange);
1191
+ text.push(cm.getRange(lineRange.anchor, lineRange.head));
1192
+ }
1193
+ return {text: text, ranges: ranges};
1194
+ }
1195
+
1196
+ function disableBrowserMagic(field) {
1197
+ field.setAttribute("autocorrect", "off");
1198
+ field.setAttribute("autocapitalize", "off");
1199
+ field.setAttribute("spellcheck", "false");
1200
+ }
1201
+
1202
+ // TEXTAREA INPUT STYLE
1203
+
1204
+ function TextareaInput(cm) {
1205
+ this.cm = cm;
1206
+ // See input.poll and input.reset
1207
+ this.prevInput = "";
1208
+
1209
+ // Flag that indicates whether we expect input to appear real soon
1210
+ // now (after some event like 'keypress' or 'input') and are
1211
+ // polling intensively.
1212
+ this.pollingFast = false;
1213
+ // Self-resetting timeout for the poller
1214
+ this.polling = new Delayed();
1215
+ // Tracks when input.reset has punted to just putting a short
1216
+ // string into the textarea instead of the full selection.
1217
+ this.inaccurateSelection = false;
1218
+ // Used to work around IE issue with selection being forgotten when focus moves away from textarea
1219
+ this.hasSelection = false;
1220
+ this.composing = null;
1221
+ };
1222
+
1223
+ function hiddenTextarea() {
1224
+ var te = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
1225
+ var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
1226
+ // The textarea is kept positioned near the cursor to prevent the
1227
+ // fact that it'll be scrolled into view on input from scrolling
1228
+ // our fake cursor out of view. On webkit, when wrap=off, paste is
1229
+ // very slow. So make the area wide instead.
1230
+ if (webkit) te.style.width = "1000px";
1231
+ else te.setAttribute("wrap", "off");
1232
+ // If border: 0; -- iOS fails to open keyboard (issue #1287)
1233
+ if (ios) te.style.border = "1px solid black";
1234
+ disableBrowserMagic(te);
1235
+ return div;
1236
+ }
1237
+
1238
+ TextareaInput.prototype = copyObj({
1239
+ init: function(display) {
1240
+ var input = this, cm = this.cm;
1241
+
1242
+ // Wraps and hides input textarea
1243
+ var div = this.wrapper = hiddenTextarea();
1244
+ // The semihidden textarea that is focused when the editor is
1245
+ // focused, and receives input.
1246
+ var te = this.textarea = div.firstChild;
1247
+ display.wrapper.insertBefore(div, display.wrapper.firstChild);
1248
+
1249
+ // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
1250
+ if (ios) te.style.width = "0px";
1251
+
1252
+ on(te, "input", function() {
1253
+ if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null;
1254
+ input.poll();
1255
+ });
1256
+
1257
+ on(te, "paste", function(e) {
1258
+ if (handlePaste(e, cm)) return true;
1259
+
1260
+ cm.state.pasteIncoming = true;
1261
+ input.fastPoll();
1262
+ });
1263
+
1264
+ function prepareCopyCut(e) {
1265
+ if (cm.somethingSelected()) {
1266
+ lastCopied = cm.getSelections();
1267
+ if (input.inaccurateSelection) {
1268
+ input.prevInput = "";
1269
+ input.inaccurateSelection = false;
1270
+ te.value = lastCopied.join("\n");
1271
+ selectInput(te);
1272
+ }
1273
+ } else if (!cm.options.lineWiseCopyCut) {
1274
+ return;
1275
+ } else {
1276
+ var ranges = copyableRanges(cm);
1277
+ lastCopied = ranges.text;
1278
+ if (e.type == "cut") {
1279
+ cm.setSelections(ranges.ranges, null, sel_dontScroll);
1280
+ } else {
1281
+ input.prevInput = "";
1282
+ te.value = ranges.text.join("\n");
1283
+ selectInput(te);
1284
+ }
1285
+ }
1286
+ if (e.type == "cut") cm.state.cutIncoming = true;
1287
+ }
1288
+ on(te, "cut", prepareCopyCut);
1289
+ on(te, "copy", prepareCopyCut);
1290
+
1291
+ on(display.scroller, "paste", function(e) {
1292
+ if (eventInWidget(display, e)) return;
1293
+ cm.state.pasteIncoming = true;
1294
+ input.focus();
1295
+ });
1296
+
1297
+ // Prevent normal selection in the editor (we handle our own)
1298
+ on(display.lineSpace, "selectstart", function(e) {
1299
+ if (!eventInWidget(display, e)) e_preventDefault(e);
1300
+ });
1301
+
1302
+ on(te, "compositionstart", function() {
1303
+ var start = cm.getCursor("from");
1304
+ if (input.composing) input.composing.range.clear()
1305
+ input.composing = {
1306
+ start: start,
1307
+ range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
1308
+ };
1309
+ });
1310
+ on(te, "compositionend", function() {
1311
+ if (input.composing) {
1312
+ input.poll();
1313
+ input.composing.range.clear();
1314
+ input.composing = null;
1315
+ }
1316
+ });
1317
+ },
1318
+
1319
+ prepareSelection: function() {
1320
+ // Redraw the selection and/or cursor
1321
+ var cm = this.cm, display = cm.display, doc = cm.doc;
1322
+ var result = prepareSelection(cm);
1323
+
1324
+ // Move the hidden textarea near the cursor to prevent scrolling artifacts
1325
+ if (cm.options.moveInputWithCursor) {
1326
+ var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
1327
+ var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
1328
+ result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
1329
+ headPos.top + lineOff.top - wrapOff.top));
1330
+ result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
1331
+ headPos.left + lineOff.left - wrapOff.left));
1332
+ }
1333
+
1334
+ return result;
1335
+ },
1336
+
1337
+ showSelection: function(drawn) {
1338
+ var cm = this.cm, display = cm.display;
1339
+ removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
1340
+ removeChildrenAndAdd(display.selectionDiv, drawn.selection);
1341
+ if (drawn.teTop != null) {
1342
+ this.wrapper.style.top = drawn.teTop + "px";
1343
+ this.wrapper.style.left = drawn.teLeft + "px";
1344
+ }
1345
+ },
1346
+
1347
+ // Reset the input to correspond to the selection (or to be empty,
1348
+ // when not typing and nothing is selected)
1349
+ reset: function(typing) {
1350
+ if (this.contextMenuPending) return;
1351
+ var minimal, selected, cm = this.cm, doc = cm.doc;
1352
+ if (cm.somethingSelected()) {
1353
+ this.prevInput = "";
1354
+ var range = doc.sel.primary();
1355
+ minimal = hasCopyEvent &&
1356
+ (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);
1357
+ var content = minimal ? "-" : selected || cm.getSelection();
1358
+ this.textarea.value = content;
1359
+ if (cm.state.focused) selectInput(this.textarea);
1360
+ if (ie && ie_version >= 9) this.hasSelection = content;
1361
+ } else if (!typing) {
1362
+ this.prevInput = this.textarea.value = "";
1363
+ if (ie && ie_version >= 9) this.hasSelection = null;
1364
+ }
1365
+ this.inaccurateSelection = minimal;
1366
+ },
1367
+
1368
+ getField: function() { return this.textarea; },
1369
+
1370
+ supportsTouch: function() { return false; },
1371
+
1372
+ focus: function() {
1373
+ if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
1374
+ try { this.textarea.focus(); }
1375
+ catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
1376
+ }
1377
+ },
1378
+
1379
+ blur: function() { this.textarea.blur(); },
1380
+
1381
+ resetPosition: function() {
1382
+ this.wrapper.style.top = this.wrapper.style.left = 0;
1383
+ },
1384
+
1385
+ receivedFocus: function() { this.slowPoll(); },
1386
+
1387
+ // Poll for input changes, using the normal rate of polling. This
1388
+ // runs as long as the editor is focused.
1389
+ slowPoll: function() {
1390
+ var input = this;
1391
+ if (input.pollingFast) return;
1392
+ input.polling.set(this.cm.options.pollInterval, function() {
1393
+ input.poll();
1394
+ if (input.cm.state.focused) input.slowPoll();
1395
+ });
1396
+ },
1397
+
1398
+ // When an event has just come in that is likely to add or change
1399
+ // something in the input textarea, we poll faster, to ensure that
1400
+ // the change appears on the screen quickly.
1401
+ fastPoll: function() {
1402
+ var missed = false, input = this;
1403
+ input.pollingFast = true;
1404
+ function p() {
1405
+ var changed = input.poll();
1406
+ if (!changed && !missed) {missed = true; input.polling.set(60, p);}
1407
+ else {input.pollingFast = false; input.slowPoll();}
1408
+ }
1409
+ input.polling.set(20, p);
1410
+ },
1411
+
1412
+ // Read input from the textarea, and update the document to match.
1413
+ // When something is selected, it is present in the textarea, and
1414
+ // selected (unless it is huge, in which case a placeholder is
1415
+ // used). When nothing is selected, the cursor sits after previously
1416
+ // seen text (can be empty), which is stored in prevInput (we must
1417
+ // not reset the textarea when typing, because that breaks IME).
1418
+ poll: function() {
1419
+ var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
1420
+ // Since this is called a *lot*, try to bail out as cheaply as
1421
+ // possible when it is clear that nothing happened. hasSelection
1422
+ // will be the case when there is a lot of text in the textarea,
1423
+ // in which case reading its value would be expensive.
1424
+ if (this.contextMenuPending || !cm.state.focused ||
1425
+ (hasSelection(input) && !prevInput && !this.composing) ||
1426
+ isReadOnly(cm) || cm.options.disableInput || cm.state.keySeq)
1427
+ return false;
1428
+
1429
+ var text = input.value;
1430
+ // If nothing changed, bail.
1431
+ if (text == prevInput && !cm.somethingSelected()) return false;
1432
+ // Work around nonsensical selection resetting in IE9/10, and
1433
+ // inexplicable appearance of private area unicode characters on
1434
+ // some key combos in Mac (#2689).
1435
+ if (ie && ie_version >= 9 && this.hasSelection === text ||
1436
+ mac && /[\uf700-\uf7ff]/.test(text)) {
1437
+ cm.display.input.reset();
1438
+ return false;
1439
+ }
1440
+
1441
+ if (cm.doc.sel == cm.display.selForContextMenu) {
1442
+ var first = text.charCodeAt(0);
1443
+ if (first == 0x200b && !prevInput) prevInput = "\u200b";
1444
+ if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo"); }
1445
+ }
1446
+ // Find the part of the input that is actually new
1447
+ var same = 0, l = Math.min(prevInput.length, text.length);
1448
+ while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
1449
+
1450
+ var self = this;
1451
+ runInOp(cm, function() {
1452
+ applyTextInput(cm, text.slice(same), prevInput.length - same,
1453
+ null, self.composing ? "*compose" : null);
1454
+
1455
+ // Don't leave long text in the textarea, since it makes further polling slow
1456
+ if (text.length > 1000 || text.indexOf("\n") > -1) input.value = self.prevInput = "";
1457
+ else self.prevInput = text;
1458
+
1459
+ if (self.composing) {
1460
+ self.composing.range.clear();
1461
+ self.composing.range = cm.markText(self.composing.start, cm.getCursor("to"),
1462
+ {className: "CodeMirror-composing"});
1463
+ }
1464
+ });
1465
+ return true;
1466
+ },
1467
+
1468
+ ensurePolled: function() {
1469
+ if (this.pollingFast && this.poll()) this.pollingFast = false;
1470
+ },
1471
+
1472
+ onKeyPress: function() {
1473
+ if (ie && ie_version >= 9) this.hasSelection = null;
1474
+ this.fastPoll();
1475
+ },
1476
+
1477
+ onContextMenu: function(e) {
1478
+ var input = this, cm = input.cm, display = cm.display, te = input.textarea;
1479
+ var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
1480
+ if (!pos || presto) return; // Opera is difficult.
1481
+
1482
+ // Reset the current text selection only if the click is done outside of the selection
1483
+ // and 'resetSelectionOnContextMenu' option is true.
1484
+ var reset = cm.options.resetSelectionOnContextMenu;
1485
+ if (reset && cm.doc.sel.contains(pos) == -1)
1486
+ operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);
1487
+
1488
+ var oldCSS = te.style.cssText;
1489
+ input.wrapper.style.position = "absolute";
1490
+ te.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
1491
+ "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: " +
1492
+ (ie ? "rgba(255, 255, 255, .05)" : "transparent") +
1493
+ "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
1494
+ if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)
1495
+ display.input.focus();
1496
+ if (webkit) window.scrollTo(null, oldScrollY);
1497
+ display.input.reset();
1498
+ // Adds "Select all" to context menu in FF
1499
+ if (!cm.somethingSelected()) te.value = input.prevInput = " ";
1500
+ input.contextMenuPending = true;
1501
+ display.selForContextMenu = cm.doc.sel;
1502
+ clearTimeout(display.detectingSelectAll);
1503
+
1504
+ // Select-all will be greyed out if there's nothing to select, so
1505
+ // this adds a zero-width space so that we can later check whether
1506
+ // it got selected.
1507
+ function prepareSelectAllHack() {
1508
+ if (te.selectionStart != null) {
1509
+ var selected = cm.somethingSelected();
1510
+ var extval = "\u200b" + (selected ? te.value : "");
1511
+ te.value = "\u21da"; // Used to catch context-menu undo
1512
+ te.value = extval;
1513
+ input.prevInput = selected ? "" : "\u200b";
1514
+ te.selectionStart = 1; te.selectionEnd = extval.length;
1515
+ // Re-set this, in case some other handler touched the
1516
+ // selection in the meantime.
1517
+ display.selForContextMenu = cm.doc.sel;
1518
+ }
1519
+ }
1520
+ function rehide() {
1521
+ input.contextMenuPending = false;
1522
+ input.wrapper.style.position = "relative";
1523
+ te.style.cssText = oldCSS;
1524
+ if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);
1525
+
1526
+ // Try to detect the user choosing select-all
1527
+ if (te.selectionStart != null) {
1528
+ if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();
1529
+ var i = 0, poll = function() {
1530
+ if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
1531
+ te.selectionEnd > 0 && input.prevInput == "\u200b")
1532
+ operation(cm, commands.selectAll)(cm);
1533
+ else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);
1534
+ else display.input.reset();
1535
+ };
1536
+ display.detectingSelectAll = setTimeout(poll, 200);
1537
+ }
1538
+ }
1539
+
1540
+ if (ie && ie_version >= 9) prepareSelectAllHack();
1541
+ if (captureRightClick) {
1542
+ e_stop(e);
1543
+ var mouseup = function() {
1544
+ off(window, "mouseup", mouseup);
1545
+ setTimeout(rehide, 20);
1546
+ };
1547
+ on(window, "mouseup", mouseup);
1548
+ } else {
1549
+ setTimeout(rehide, 50);
1550
+ }
1551
+ },
1552
+
1553
+ readOnlyChanged: function(val) {
1554
+ if (!val) this.reset();
1555
+ },
1556
+
1557
+ setUneditable: nothing,
1558
+
1559
+ needsContentAttribute: false
1560
+ }, TextareaInput.prototype);
1561
+
1562
+ // CONTENTEDITABLE INPUT STYLE
1563
+
1564
+ function ContentEditableInput(cm) {
1565
+ this.cm = cm;
1566
+ this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
1567
+ this.polling = new Delayed();
1568
+ this.gracePeriod = false;
1569
+ }
1570
+
1571
+ ContentEditableInput.prototype = copyObj({
1572
+ init: function(display) {
1573
+ var input = this, cm = input.cm;
1574
+ var div = input.div = display.lineDiv;
1575
+ disableBrowserMagic(div);
1576
+
1577
+ on(div, "paste", function(e) { handlePaste(e, cm); })
1578
+
1579
+ on(div, "compositionstart", function(e) {
1580
+ var data = e.data;
1581
+ input.composing = {sel: cm.doc.sel, data: data, startData: data};
1582
+ if (!data) return;
1583
+ var prim = cm.doc.sel.primary();
1584
+ var line = cm.getLine(prim.head.line);
1585
+ var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length));
1586
+ if (found > -1 && found <= prim.head.ch)
1587
+ input.composing.sel = simpleSelection(Pos(prim.head.line, found),
1588
+ Pos(prim.head.line, found + data.length));
1589
+ });
1590
+ on(div, "compositionupdate", function(e) {
1591
+ input.composing.data = e.data;
1592
+ });
1593
+ on(div, "compositionend", function(e) {
1594
+ var ours = input.composing;
1595
+ if (!ours) return;
1596
+ if (e.data != ours.startData && !/\u200b/.test(e.data))
1597
+ ours.data = e.data;
1598
+ // Need a small delay to prevent other code (input event,
1599
+ // selection polling) from doing damage when fired right after
1600
+ // compositionend.
1601
+ setTimeout(function() {
1602
+ if (!ours.handled)
1603
+ input.applyComposition(ours);
1604
+ if (input.composing == ours)
1605
+ input.composing = null;
1606
+ }, 50);
1607
+ });
1608
+
1609
+ on(div, "touchstart", function() {
1610
+ input.forceCompositionEnd();
1611
+ });
1612
+
1613
+ on(div, "input", function() {
1614
+ if (input.composing) return;
1615
+ if (isReadOnly(cm) || !input.pollContent())
1616
+ runInOp(input.cm, function() {regChange(cm);});
1617
+ });
1618
+
1619
+ function onCopyCut(e) {
1620
+ if (cm.somethingSelected()) {
1621
+ lastCopied = cm.getSelections();
1622
+ if (e.type == "cut") cm.replaceSelection("", null, "cut");
1623
+ } else if (!cm.options.lineWiseCopyCut) {
1624
+ return;
1625
+ } else {
1626
+ var ranges = copyableRanges(cm);
1627
+ lastCopied = ranges.text;
1628
+ if (e.type == "cut") {
1629
+ cm.operation(function() {
1630
+ cm.setSelections(ranges.ranges, 0, sel_dontScroll);
1631
+ cm.replaceSelection("", null, "cut");
1632
+ });
1633
+ }
1634
+ }
1635
+ // iOS exposes the clipboard API, but seems to discard content inserted into it
1636
+ if (e.clipboardData && !ios) {
1637
+ e.preventDefault();
1638
+ e.clipboardData.clearData();
1639
+ e.clipboardData.setData("text/plain", lastCopied.join("\n"));
1640
+ } else {
1641
+ // Old-fashioned briefly-focus-a-textarea hack
1642
+ var kludge = hiddenTextarea(), te = kludge.firstChild;
1643
+ cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
1644
+ te.value = lastCopied.join("\n");
1645
+ var hadFocus = document.activeElement;
1646
+ selectInput(te);
1647
+ setTimeout(function() {
1648
+ cm.display.lineSpace.removeChild(kludge);
1649
+ hadFocus.focus();
1650
+ }, 50);
1651
+ }
1652
+ }
1653
+ on(div, "copy", onCopyCut);
1654
+ on(div, "cut", onCopyCut);
1655
+ },
1656
+
1657
+ prepareSelection: function() {
1658
+ var result = prepareSelection(this.cm, false);
1659
+ result.focus = this.cm.state.focused;
1660
+ return result;
1661
+ },
1662
+
1663
+ showSelection: function(info) {
1664
+ if (!info || !this.cm.display.view.length) return;
1665
+ if (info.focus) this.showPrimarySelection();
1666
+ this.showMultipleSelections(info);
1667
+ },
1668
+
1669
+ showPrimarySelection: function() {
1670
+ var sel = window.getSelection(), prim = this.cm.doc.sel.primary();
1671
+ var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset);
1672
+ var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset);
1673
+ if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
1674
+ cmp(minPos(curAnchor, curFocus), prim.from()) == 0 &&
1675
+ cmp(maxPos(curAnchor, curFocus), prim.to()) == 0)
1676
+ return;
1677
+
1678
+ var start = posToDOM(this.cm, prim.from());
1679
+ var end = posToDOM(this.cm, prim.to());
1680
+ if (!start && !end) return;
1681
+
1682
+ var view = this.cm.display.view;
1683
+ var old = sel.rangeCount && sel.getRangeAt(0);
1684
+ if (!start) {
1685
+ start = {node: view[0].measure.map[2], offset: 0};
1686
+ } else if (!end) { // FIXME dangerously hacky
1687
+ var measure = view[view.length - 1].measure;
1688
+ var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
1689
+ end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
1690
+ }
1691
+
1692
+ try { var rng = range(start.node, start.offset, end.offset, end.node); }
1693
+ catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
1694
+ if (rng) {
1695
+ sel.removeAllRanges();
1696
+ sel.addRange(rng);
1697
+ if (old && sel.anchorNode == null) sel.addRange(old);
1698
+ else if (gecko) this.startGracePeriod();
1699
+ }
1700
+ this.rememberSelection();
1701
+ },
1702
+
1703
+ startGracePeriod: function() {
1704
+ var input = this;
1705
+ clearTimeout(this.gracePeriod);
1706
+ this.gracePeriod = setTimeout(function() {
1707
+ input.gracePeriod = false;
1708
+ if (input.selectionChanged())
1709
+ input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });
1710
+ }, 20);
1711
+ },
1712
+
1713
+ showMultipleSelections: function(info) {
1714
+ removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
1715
+ removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
1716
+ },
1717
+
1718
+ rememberSelection: function() {
1719
+ var sel = window.getSelection();
1720
+ this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
1721
+ this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
1722
+ },
1723
+
1724
+ selectionInEditor: function() {
1725
+ var sel = window.getSelection();
1726
+ if (!sel.rangeCount) return false;
1727
+ var node = sel.getRangeAt(0).commonAncestorContainer;
1728
+ return contains(this.div, node);
1729
+ },
1730
+
1731
+ focus: function() {
1732
+ if (this.cm.options.readOnly != "nocursor") this.div.focus();
1733
+ },
1734
+ blur: function() { this.div.blur(); },
1735
+ getField: function() { return this.div; },
1736
+
1737
+ supportsTouch: function() { return true; },
1738
+
1739
+ receivedFocus: function() {
1740
+ var input = this;
1741
+ if (this.selectionInEditor())
1742
+ this.pollSelection();
1743
+ else
1744
+ runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; });
1745
+
1746
+ function poll() {
1747
+ if (input.cm.state.focused) {
1748
+ input.pollSelection();
1749
+ input.polling.set(input.cm.options.pollInterval, poll);
1750
+ }
1751
+ }
1752
+ this.polling.set(this.cm.options.pollInterval, poll);
1753
+ },
1754
+
1755
+ selectionChanged: function() {
1756
+ var sel = window.getSelection();
1757
+ return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
1758
+ sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset;
1759
+ },
1760
+
1761
+ pollSelection: function() {
1762
+ if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
1763
+ var sel = window.getSelection(), cm = this.cm;
1764
+ this.rememberSelection();
1765
+ var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
1766
+ var head = domToPos(cm, sel.focusNode, sel.focusOffset);
1767
+ if (anchor && head) runInOp(cm, function() {
1768
+ setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
1769
+ if (anchor.bad || head.bad) cm.curOp.selectionChanged = true;
1770
+ });
1771
+ }
1772
+ },
1773
+
1774
+ pollContent: function() {
1775
+ var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
1776
+ var from = sel.from(), to = sel.to();
1777
+ if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false;
1778
+
1779
+ var fromIndex;
1780
+ if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
1781
+ var fromLine = lineNo(display.view[0].line);
1782
+ var fromNode = display.view[0].node;
1783
+ } else {
1784
+ var fromLine = lineNo(display.view[fromIndex].line);
1785
+ var fromNode = display.view[fromIndex - 1].node.nextSibling;
1786
+ }
1787
+ var toIndex = findViewIndex(cm, to.line);
1788
+ if (toIndex == display.view.length - 1) {
1789
+ var toLine = display.viewTo - 1;
1790
+ var toNode = display.lineDiv.lastChild;
1791
+ } else {
1792
+ var toLine = lineNo(display.view[toIndex + 1].line) - 1;
1793
+ var toNode = display.view[toIndex + 1].node.previousSibling;
1794
+ }
1795
+
1796
+ var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
1797
+ var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
1798
+ while (newText.length > 1 && oldText.length > 1) {
1799
+ if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
1800
+ else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
1801
+ else break;
1802
+ }
1803
+
1804
+ var cutFront = 0, cutEnd = 0;
1805
+ var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
1806
+ while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
1807
+ ++cutFront;
1808
+ var newBot = lst(newText), oldBot = lst(oldText);
1809
+ var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
1810
+ oldBot.length - (oldText.length == 1 ? cutFront : 0));
1811
+ while (cutEnd < maxCutEnd &&
1812
+ newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
1813
+ ++cutEnd;
1814
+
1815
+ newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd);
1816
+ newText[0] = newText[0].slice(cutFront);
1817
+
1818
+ var chFrom = Pos(fromLine, cutFront);
1819
+ var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
1820
+ if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
1821
+ replaceRange(cm.doc, newText, chFrom, chTo, "+input");
1822
+ return true;
1823
+ }
1824
+ },
1825
+
1826
+ ensurePolled: function() {
1827
+ this.forceCompositionEnd();
1828
+ },
1829
+ reset: function() {
1830
+ this.forceCompositionEnd();
1831
+ },
1832
+ forceCompositionEnd: function() {
1833
+ if (!this.composing || this.composing.handled) return;
1834
+ this.applyComposition(this.composing);
1835
+ this.composing.handled = true;
1836
+ this.div.blur();
1837
+ this.div.focus();
1838
+ },
1839
+ applyComposition: function(composing) {
1840
+ if (isReadOnly(this.cm))
1841
+ operation(this.cm, regChange)(this.cm)
1842
+ else if (composing.data && composing.data != composing.startData)
1843
+ operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);
1844
+ },
1845
+
1846
+ setUneditable: function(node) {
1847
+ node.contentEditable = "false"
1848
+ },
1849
+
1850
+ onKeyPress: function(e) {
1851
+ e.preventDefault();
1852
+ if (!isReadOnly(this.cm))
1853
+ operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);
1854
+ },
1855
+
1856
+ readOnlyChanged: function(val) {
1857
+ this.div.contentEditable = String(val != "nocursor")
1858
+ },
1859
+
1860
+ onContextMenu: nothing,
1861
+ resetPosition: nothing,
1862
+
1863
+ needsContentAttribute: true
1864
+ }, ContentEditableInput.prototype);
1865
+
1866
+ function posToDOM(cm, pos) {
1867
+ var view = findViewForLine(cm, pos.line);
1868
+ if (!view || view.hidden) return null;
1869
+ var line = getLine(cm.doc, pos.line);
1870
+ var info = mapFromLineView(view, line, pos.line);
1871
+
1872
+ var order = getOrder(line), side = "left";
1873
+ if (order) {
1874
+ var partPos = getBidiPartAt(order, pos.ch);
1875
+ side = partPos % 2 ? "right" : "left";
1876
+ }
1877
+ var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
1878
+ result.offset = result.collapse == "right" ? result.end : result.start;
1879
+ return result;
1880
+ }
1881
+
1882
+ function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }
1883
+
1884
+ function domToPos(cm, node, offset) {
1885
+ var lineNode;
1886
+ if (node == cm.display.lineDiv) {
1887
+ lineNode = cm.display.lineDiv.childNodes[offset];
1888
+ if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true);
1889
+ node = null; offset = 0;
1890
+ } else {
1891
+ for (lineNode = node;; lineNode = lineNode.parentNode) {
1892
+ if (!lineNode || lineNode == cm.display.lineDiv) return null;
1893
+ if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break;
1894
+ }
1895
+ }
1896
+ for (var i = 0; i < cm.display.view.length; i++) {
1897
+ var lineView = cm.display.view[i];
1898
+ if (lineView.node == lineNode)
1899
+ return locateNodeInLineView(lineView, node, offset);
1900
+ }
1901
+ }
1902
+
1903
+ function locateNodeInLineView(lineView, node, offset) {
1904
+ var wrapper = lineView.text.firstChild, bad = false;
1905
+ if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true);
1906
+ if (node == wrapper) {
1907
+ bad = true;
1908
+ node = wrapper.childNodes[offset];
1909
+ offset = 0;
1910
+ if (!node) {
1911
+ var line = lineView.rest ? lst(lineView.rest) : lineView.line;
1912
+ return badPos(Pos(lineNo(line), line.text.length), bad);
1913
+ }
1914
+ }
1915
+
1916
+ var textNode = node.nodeType == 3 ? node : null, topNode = node;
1917
+ if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
1918
+ textNode = node.firstChild;
1919
+ if (offset) offset = textNode.nodeValue.length;
1920
+ }
1921
+ while (topNode.parentNode != wrapper) topNode = topNode.parentNode;
1922
+ var measure = lineView.measure, maps = measure.maps;
1923
+
1924
+ function find(textNode, topNode, offset) {
1925
+ for (var i = -1; i < (maps ? maps.length : 0); i++) {
1926
+ var map = i < 0 ? measure.map : maps[i];
1927
+ for (var j = 0; j < map.length; j += 3) {
1928
+ var curNode = map[j + 2];
1929
+ if (curNode == textNode || curNode == topNode) {
1930
+ var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
1931
+ var ch = map[j] + offset;
1932
+ if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)];
1933
+ return Pos(line, ch);
1934
+ }
1935
+ }
1936
+ }
1937
+ }
1938
+ var found = find(textNode, topNode, offset);
1939
+ if (found) return badPos(found, bad);
1940
+
1941
+ // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
1942
+ for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
1943
+ found = find(after, after.firstChild, 0);
1944
+ if (found)
1945
+ return badPos(Pos(found.line, found.ch - dist), bad);
1946
+ else
1947
+ dist += after.textContent.length;
1948
+ }
1949
+ for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {
1950
+ found = find(before, before.firstChild, -1);
1951
+ if (found)
1952
+ return badPos(Pos(found.line, found.ch + dist), bad);
1953
+ else
1954
+ dist += after.textContent.length;
1955
+ }
1956
+ }
1957
+
1958
+ function domTextBetween(cm, from, to, fromLine, toLine) {
1959
+ var text = "", closing = false, lineSep = cm.doc.lineSeparator();
1960
+ function recognizeMarker(id) { return function(marker) { return marker.id == id; }; }
1961
+ function walk(node) {
1962
+ if (node.nodeType == 1) {
1963
+ var cmText = node.getAttribute("cm-text");
1964
+ if (cmText != null) {
1965
+ if (cmText == "") cmText = node.textContent.replace(/\u200b/g, "");
1966
+ text += cmText;
1967
+ return;
1968
+ }
1969
+ var markerID = node.getAttribute("cm-marker"), range;
1970
+ if (markerID) {
1971
+ var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
1972
+ if (found.length && (range = found[0].find()))
1973
+ text += getBetween(cm.doc, range.from, range.to).join(lineSep);
1974
+ return;
1975
+ }
1976
+ if (node.getAttribute("contenteditable") == "false") return;
1977
+ for (var i = 0; i < node.childNodes.length; i++)
1978
+ walk(node.childNodes[i]);
1979
+ if (/^(pre|div|p)$/i.test(node.nodeName))
1980
+ closing = true;
1981
+ } else if (node.nodeType == 3) {
1982
+ var val = node.nodeValue;
1983
+ if (!val) return;
1984
+ if (closing) {
1985
+ text += lineSep;
1986
+ closing = false;
1987
+ }
1988
+ text += val;
1989
+ }
1990
+ }
1991
+ for (;;) {
1992
+ walk(from);
1993
+ if (from == to) break;
1994
+ from = from.nextSibling;
1995
+ }
1996
+ return text;
1997
+ }
1998
+
1999
+ CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};
2000
+
2001
+ // SELECTION / CURSOR
2002
+
2003
+ // Selection objects are immutable. A new one is created every time
2004
+ // the selection changes. A selection is one or more non-overlapping
2005
+ // (and non-touching) ranges, sorted, and an integer that indicates
2006
+ // which one is the primary selection (the one that's scrolled into
2007
+ // view, that getCursor returns, etc).
2008
+ function Selection(ranges, primIndex) {
2009
+ this.ranges = ranges;
2010
+ this.primIndex = primIndex;
2011
+ }
2012
+
2013
+ Selection.prototype = {
2014
+ primary: function() { return this.ranges[this.primIndex]; },
2015
+ equals: function(other) {
2016
+ if (other == this) return true;
2017
+ if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;
2018
+ for (var i = 0; i < this.ranges.length; i++) {
2019
+ var here = this.ranges[i], there = other.ranges[i];
2020
+ if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;
2021
+ }
2022
+ return true;
2023
+ },
2024
+ deepCopy: function() {
2025
+ for (var out = [], i = 0; i < this.ranges.length; i++)
2026
+ out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));
2027
+ return new Selection(out, this.primIndex);
2028
+ },
2029
+ somethingSelected: function() {
2030
+ for (var i = 0; i < this.ranges.length; i++)
2031
+ if (!this.ranges[i].empty()) return true;
2032
+ return false;
2033
+ },
2034
+ contains: function(pos, end) {
2035
+ if (!end) end = pos;
2036
+ for (var i = 0; i < this.ranges.length; i++) {
2037
+ var range = this.ranges[i];
2038
+ if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
2039
+ return i;
2040
+ }
2041
+ return -1;
2042
+ }
2043
+ };
2044
+
2045
+ function Range(anchor, head) {
2046
+ this.anchor = anchor; this.head = head;
2047
+ }
2048
+
2049
+ Range.prototype = {
2050
+ from: function() { return minPos(this.anchor, this.head); },
2051
+ to: function() { return maxPos(this.anchor, this.head); },
2052
+ empty: function() {
2053
+ return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;
2054
+ }
2055
+ };
2056
+
2057
+ // Take an unsorted, potentially overlapping set of ranges, and
2058
+ // build a selection out of it. 'Consumes' ranges array (modifying
2059
+ // it).
2060
+ function normalizeSelection(ranges, primIndex) {
2061
+ var prim = ranges[primIndex];
2062
+ ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });
2063
+ primIndex = indexOf(ranges, prim);
2064
+ for (var i = 1; i < ranges.length; i++) {
2065
+ var cur = ranges[i], prev = ranges[i - 1];
2066
+ if (cmp(prev.to(), cur.from()) >= 0) {
2067
+ var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
2068
+ var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
2069
+ if (i <= primIndex) --primIndex;
2070
+ ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
2071
+ }
2072
+ }
2073
+ return new Selection(ranges, primIndex);
2074
+ }
2075
+
2076
+ function simpleSelection(anchor, head) {
2077
+ return new Selection([new Range(anchor, head || anchor)], 0);
2078
+ }
2079
+
2080
+ // Most of the external API clips given positions to make sure they
2081
+ // actually exist within the document.
2082
+ function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
2083
+ function clipPos(doc, pos) {
2084
+ if (pos.line < doc.first) return Pos(doc.first, 0);
2085
+ var last = doc.first + doc.size - 1;
2086
+ if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
2087
+ return clipToLen(pos, getLine(doc, pos.line).text.length);
2088
+ }
2089
+ function clipToLen(pos, linelen) {
2090
+ var ch = pos.ch;
2091
+ if (ch == null || ch > linelen) return Pos(pos.line, linelen);
2092
+ else if (ch < 0) return Pos(pos.line, 0);
2093
+ else return pos;
2094
+ }
2095
+ function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
2096
+ function clipPosArray(doc, array) {
2097
+ for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);
2098
+ return out;
2099
+ }
2100
+
2101
+ // SELECTION UPDATES
2102
+
2103
+ // The 'scroll' parameter given to many of these indicated whether
2104
+ // the new cursor position should be scrolled into view after
2105
+ // modifying the selection.
2106
+
2107
+ // If shift is held or the extend flag is set, extends a range to
2108
+ // include a given position (and optionally a second position).
2109
+ // Otherwise, simply returns the range between the given positions.
2110
+ // Used for cursor motion and such.
2111
+ function extendRange(doc, range, head, other) {
2112
+ if (doc.cm && doc.cm.display.shift || doc.extend) {
2113
+ var anchor = range.anchor;
2114
+ if (other) {
2115
+ var posBefore = cmp(head, anchor) < 0;
2116
+ if (posBefore != (cmp(other, anchor) < 0)) {
2117
+ anchor = head;
2118
+ head = other;
2119
+ } else if (posBefore != (cmp(head, other) < 0)) {
2120
+ head = other;
2121
+ }
2122
+ }
2123
+ return new Range(anchor, head);
2124
+ } else {
2125
+ return new Range(other || head, head);
2126
+ }
2127
+ }
2128
+
2129
+ // Extend the primary selection range, discard the rest.
2130
+ function extendSelection(doc, head, other, options) {
2131
+ setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);
2132
+ }
2133
+
2134
+ // Extend all selections (pos is an array of selections with length
2135
+ // equal the number of selections)
2136
+ function extendSelections(doc, heads, options) {
2137
+ for (var out = [], i = 0; i < doc.sel.ranges.length; i++)
2138
+ out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);
2139
+ var newSel = normalizeSelection(out, doc.sel.primIndex);
2140
+ setSelection(doc, newSel, options);
2141
+ }
2142
+
2143
+ // Updates a single range in the selection.
2144
+ function replaceOneSelection(doc, i, range, options) {
2145
+ var ranges = doc.sel.ranges.slice(0);
2146
+ ranges[i] = range;
2147
+ setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);
2148
+ }
2149
+
2150
+ // Reset the selection to a single range.
2151
+ function setSimpleSelection(doc, anchor, head, options) {
2152
+ setSelection(doc, simpleSelection(anchor, head), options);
2153
+ }
2154
+
2155
+ // Give beforeSelectionChange handlers a change to influence a
2156
+ // selection update.
2157
+ function filterSelectionChange(doc, sel) {
2158
+ var obj = {
2159
+ ranges: sel.ranges,
2160
+ update: function(ranges) {
2161
+ this.ranges = [];
2162
+ for (var i = 0; i < ranges.length; i++)
2163
+ this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
2164
+ clipPos(doc, ranges[i].head));
2165
+ }
2166
+ };
2167
+ signal(doc, "beforeSelectionChange", doc, obj);
2168
+ if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
2169
+ if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);
2170
+ else return sel;
2171
+ }
2172
+
2173
+ function setSelectionReplaceHistory(doc, sel, options) {
2174
+ var done = doc.history.done, last = lst(done);
2175
+ if (last && last.ranges) {
2176
+ done[done.length - 1] = sel;
2177
+ setSelectionNoUndo(doc, sel, options);
2178
+ } else {
2179
+ setSelection(doc, sel, options);
2180
+ }
2181
+ }
2182
+
2183
+ // Set a new selection.
2184
+ function setSelection(doc, sel, options) {
2185
+ setSelectionNoUndo(doc, sel, options);
2186
+ addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
2187
+ }
2188
+
2189
+ function setSelectionNoUndo(doc, sel, options) {
2190
+ if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
2191
+ sel = filterSelectionChange(doc, sel);
2192
+
2193
+ var bias = options && options.bias ||
2194
+ (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
2195
+ setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
2196
+
2197
+ if (!(options && options.scroll === false) && doc.cm)
2198
+ ensureCursorVisible(doc.cm);
2199
+ }
2200
+
2201
+ function setSelectionInner(doc, sel) {
2202
+ if (sel.equals(doc.sel)) return;
2203
+
2204
+ doc.sel = sel;
2205
+
2206
+ if (doc.cm) {
2207
+ doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
2208
+ signalCursorActivity(doc.cm);
2209
+ }
2210
+ signalLater(doc, "cursorActivity", doc);
2211
+ }
2212
+
2213
+ // Verify that the selection does not partially select any atomic
2214
+ // marked ranges.
2215
+ function reCheckSelection(doc) {
2216
+ setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);
2217
+ }
2218
+
2219
+ // Return a selection that does not partially select any atomic
2220
+ // ranges.
2221
+ function skipAtomicInSelection(doc, sel, bias, mayClear) {
2222
+ var out;
2223
+ for (var i = 0; i < sel.ranges.length; i++) {
2224
+ var range = sel.ranges[i];
2225
+ var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);
2226
+ var newHead = skipAtomic(doc, range.head, bias, mayClear);
2227
+ if (out || newAnchor != range.anchor || newHead != range.head) {
2228
+ if (!out) out = sel.ranges.slice(0, i);
2229
+ out[i] = new Range(newAnchor, newHead);
2230
+ }
2231
+ }
2232
+ return out ? normalizeSelection(out, sel.primIndex) : sel;
2233
+ }
2234
+
2235
+ // Ensure a given position is not inside an atomic range.
2236
+ function skipAtomic(doc, pos, bias, mayClear) {
2237
+ var flipped = false, curPos = pos;
2238
+ var dir = bias || 1;
2239
+ doc.cantEdit = false;
2240
+ search: for (;;) {
2241
+ var line = getLine(doc, curPos.line);
2242
+ if (line.markedSpans) {
2243
+ for (var i = 0; i < line.markedSpans.length; ++i) {
2244
+ var sp = line.markedSpans[i], m = sp.marker;
2245
+ if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&
2246
+ (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {
2247
+ if (mayClear) {
2248
+ signal(m, "beforeCursorEnter");
2249
+ if (m.explicitlyCleared) {
2250
+ if (!line.markedSpans) break;
2251
+ else {--i; continue;}
2252
+ }
2253
+ }
2254
+ if (!m.atomic) continue;
2255
+ var newPos = m.find(dir < 0 ? -1 : 1);
2256
+ if (cmp(newPos, curPos) == 0) {
2257
+ newPos.ch += dir;
2258
+ if (newPos.ch < 0) {
2259
+ if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));
2260
+ else newPos = null;
2261
+ } else if (newPos.ch > line.text.length) {
2262
+ if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);
2263
+ else newPos = null;
2264
+ }
2265
+ if (!newPos) {
2266
+ if (flipped) {
2267
+ // Driven in a corner -- no valid cursor position found at all
2268
+ // -- try again *with* clearing, if we didn't already
2269
+ if (!mayClear) return skipAtomic(doc, pos, bias, true);
2270
+ // Otherwise, turn off editing until further notice, and return the start of the doc
2271
+ doc.cantEdit = true;
2272
+ return Pos(doc.first, 0);
2273
+ }
2274
+ flipped = true; newPos = pos; dir = -dir;
2275
+ }
2276
+ }
2277
+ curPos = newPos;
2278
+ continue search;
2279
+ }
2280
+ }
2281
+ }
2282
+ return curPos;
2283
+ }
2284
+ }
2285
+
2286
+ // SELECTION DRAWING
2287
+
2288
+ function updateSelection(cm) {
2289
+ cm.display.input.showSelection(cm.display.input.prepareSelection());
2290
+ }
2291
+
2292
+ function prepareSelection(cm, primary) {
2293
+ var doc = cm.doc, result = {};
2294
+ var curFragment = result.cursors = document.createDocumentFragment();
2295
+ var selFragment = result.selection = document.createDocumentFragment();
2296
+
2297
+ for (var i = 0; i < doc.sel.ranges.length; i++) {
2298
+ if (primary === false && i == doc.sel.primIndex) continue;
2299
+ var range = doc.sel.ranges[i];
2300
+ var collapsed = range.empty();
2301
+ if (collapsed || cm.options.showCursorWhenSelecting)
2302
+ drawSelectionCursor(cm, range.head, curFragment);
2303
+ if (!collapsed)
2304
+ drawSelectionRange(cm, range, selFragment);
2305
+ }
2306
+ return result;
2307
+ }
2308
+
2309
+ // Draws a cursor for the given range
2310
+ function drawSelectionCursor(cm, head, output) {
2311
+ var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
2312
+
2313
+ var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
2314
+ cursor.style.left = pos.left + "px";
2315
+ cursor.style.top = pos.top + "px";
2316
+ cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
2317
+
2318
+ if (pos.other) {
2319
+ // Secondary cursor, shown when on a 'jump' in bi-directional text
2320
+ var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
2321
+ otherCursor.style.display = "";
2322
+ otherCursor.style.left = pos.other.left + "px";
2323
+ otherCursor.style.top = pos.other.top + "px";
2324
+ otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
2325
+ }
2326
+ }
2327
+
2328
+ // Draws the given range as a highlighted selection
2329
+ function drawSelectionRange(cm, range, output) {
2330
+ var display = cm.display, doc = cm.doc;
2331
+ var fragment = document.createDocumentFragment();
2332
+ var padding = paddingH(cm.display), leftSide = padding.left;
2333
+ var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
2334
+
2335
+ function add(left, top, width, bottom) {
2336
+ if (top < 0) top = 0;
2337
+ top = Math.round(top);
2338
+ bottom = Math.round(bottom);
2339
+ fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
2340
+ "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
2341
+ "px; height: " + (bottom - top) + "px"));
2342
+ }
2343
+
2344
+ function drawForLine(line, fromArg, toArg) {
2345
+ var lineObj = getLine(doc, line);
2346
+ var lineLen = lineObj.text.length;
2347
+ var start, end;
2348
+ function coords(ch, bias) {
2349
+ return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
2350
+ }
2351
+
2352
+ iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
2353
+ var leftPos = coords(from, "left"), rightPos, left, right;
2354
+ if (from == to) {
2355
+ rightPos = leftPos;
2356
+ left = right = leftPos.left;
2357
+ } else {
2358
+ rightPos = coords(to - 1, "right");
2359
+ if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
2360
+ left = leftPos.left;
2361
+ right = rightPos.right;
2362
+ }
2363
+ if (fromArg == null && from == 0) left = leftSide;
2364
+ if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
2365
+ add(left, leftPos.top, null, leftPos.bottom);
2366
+ left = leftSide;
2367
+ if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
2368
+ }
2369
+ if (toArg == null && to == lineLen) right = rightSide;
2370
+ if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
2371
+ start = leftPos;
2372
+ if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
2373
+ end = rightPos;
2374
+ if (left < leftSide + 1) left = leftSide;
2375
+ add(left, rightPos.top, right - left, rightPos.bottom);
2376
+ });
2377
+ return {start: start, end: end};
2378
+ }
2379
+
2380
+ var sFrom = range.from(), sTo = range.to();
2381
+ if (sFrom.line == sTo.line) {
2382
+ drawForLine(sFrom.line, sFrom.ch, sTo.ch);
2383
+ } else {
2384
+ var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
2385
+ var singleVLine = visualLine(fromLine) == visualLine(toLine);
2386
+ var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
2387
+ var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
2388
+ if (singleVLine) {
2389
+ if (leftEnd.top < rightStart.top - 2) {
2390
+ add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
2391
+ add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
2392
+ } else {
2393
+ add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
2394
+ }
2395
+ }
2396
+ if (leftEnd.bottom < rightStart.top)
2397
+ add(leftSide, leftEnd.bottom, null, rightStart.top);
2398
+ }
2399
+
2400
+ output.appendChild(fragment);
2401
+ }
2402
+
2403
+ // Cursor-blinking
2404
+ function restartBlink(cm) {
2405
+ if (!cm.state.focused) return;
2406
+ var display = cm.display;
2407
+ clearInterval(display.blinker);
2408
+ var on = true;
2409
+ display.cursorDiv.style.visibility = "";
2410
+ if (cm.options.cursorBlinkRate > 0)
2411
+ display.blinker = setInterval(function() {
2412
+ display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
2413
+ }, cm.options.cursorBlinkRate);
2414
+ else if (cm.options.cursorBlinkRate < 0)
2415
+ display.cursorDiv.style.visibility = "hidden";
2416
+ }
2417
+
2418
+ // HIGHLIGHT WORKER
2419
+
2420
+ function startWorker(cm, time) {
2421
+ if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)
2422
+ cm.state.highlight.set(time, bind(highlightWorker, cm));
2423
+ }
2424
+
2425
+ function highlightWorker(cm) {
2426
+ var doc = cm.doc;
2427
+ if (doc.frontier < doc.first) doc.frontier = doc.first;
2428
+ if (doc.frontier >= cm.display.viewTo) return;
2429
+ var end = +new Date + cm.options.workTime;
2430
+ var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
2431
+ var changedLines = [];
2432
+
2433
+ doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {
2434
+ if (doc.frontier >= cm.display.viewFrom) { // Visible
2435
+ var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength;
2436
+ var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true);
2437
+ line.styles = highlighted.styles;
2438
+ var oldCls = line.styleClasses, newCls = highlighted.classes;
2439
+ if (newCls) line.styleClasses = newCls;
2440
+ else if (oldCls) line.styleClasses = null;
2441
+ var ischange = !oldStyles || oldStyles.length != line.styles.length ||
2442
+ oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
2443
+ for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
2444
+ if (ischange) changedLines.push(doc.frontier);
2445
+ line.stateAfter = tooLong ? state : copyState(doc.mode, state);
2446
+ } else {
2447
+ if (line.text.length <= cm.options.maxHighlightLength)
2448
+ processLine(cm, line.text, state);
2449
+ line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
2450
+ }
2451
+ ++doc.frontier;
2452
+ if (+new Date > end) {
2453
+ startWorker(cm, cm.options.workDelay);
2454
+ return true;
2455
+ }
2456
+ });
2457
+ if (changedLines.length) runInOp(cm, function() {
2458
+ for (var i = 0; i < changedLines.length; i++)
2459
+ regLineChange(cm, changedLines[i], "text");
2460
+ });
2461
+ }
2462
+
2463
+ // Finds the line to start with when starting a parse. Tries to
2464
+ // find a line with a stateAfter, so that it can start with a
2465
+ // valid state. If that fails, it returns the line with the
2466
+ // smallest indentation, which tends to need the least context to
2467
+ // parse correctly.
2468
+ function findStartLine(cm, n, precise) {
2469
+ var minindent, minline, doc = cm.doc;
2470
+ var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
2471
+ for (var search = n; search > lim; --search) {
2472
+ if (search <= doc.first) return doc.first;
2473
+ var line = getLine(doc, search - 1);
2474
+ if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
2475
+ var indented = countColumn(line.text, null, cm.options.tabSize);
2476
+ if (minline == null || minindent > indented) {
2477
+ minline = search - 1;
2478
+ minindent = indented;
2479
+ }
2480
+ }
2481
+ return minline;
2482
+ }
2483
+
2484
+ function getStateBefore(cm, n, precise) {
2485
+ var doc = cm.doc, display = cm.display;
2486
+ if (!doc.mode.startState) return true;
2487
+ var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
2488
+ if (!state) state = startState(doc.mode);
2489
+ else state = copyState(doc.mode, state);
2490
+ doc.iter(pos, n, function(line) {
2491
+ processLine(cm, line.text, state);
2492
+ var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;
2493
+ line.stateAfter = save ? copyState(doc.mode, state) : null;
2494
+ ++pos;
2495
+ });
2496
+ if (precise) doc.frontier = pos;
2497
+ return state;
2498
+ }
2499
+
2500
+ // POSITION MEASUREMENT
2501
+
2502
+ function paddingTop(display) {return display.lineSpace.offsetTop;}
2503
+ function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
2504
+ function paddingH(display) {
2505
+ if (display.cachedPaddingH) return display.cachedPaddingH;
2506
+ var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
2507
+ var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
2508
+ var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
2509
+ if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;
2510
+ return data;
2511
+ }
2512
+
2513
+ function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }
2514
+ function displayWidth(cm) {
2515
+ return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;
2516
+ }
2517
+ function displayHeight(cm) {
2518
+ return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;
2519
+ }
2520
+
2521
+ // Ensure the lineView.wrapping.heights array is populated. This is
2522
+ // an array of bottom offsets for the lines that make up a drawn
2523
+ // line. When lineWrapping is on, there might be more than one
2524
+ // height.
2525
+ function ensureLineHeights(cm, lineView, rect) {
2526
+ var wrapping = cm.options.lineWrapping;
2527
+ var curWidth = wrapping && displayWidth(cm);
2528
+ if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
2529
+ var heights = lineView.measure.heights = [];
2530
+ if (wrapping) {
2531
+ lineView.measure.width = curWidth;
2532
+ var rects = lineView.text.firstChild.getClientRects();
2533
+ for (var i = 0; i < rects.length - 1; i++) {
2534
+ var cur = rects[i], next = rects[i + 1];
2535
+ if (Math.abs(cur.bottom - next.bottom) > 2)
2536
+ heights.push((cur.bottom + next.top) / 2 - rect.top);
2537
+ }
2538
+ }
2539
+ heights.push(rect.bottom - rect.top);
2540
+ }
2541
+ }
2542
+
2543
+ // Find a line map (mapping character offsets to text nodes) and a
2544
+ // measurement cache for the given line number. (A line view might
2545
+ // contain multiple lines when collapsed ranges are present.)
2546
+ function mapFromLineView(lineView, line, lineN) {
2547
+ if (lineView.line == line)
2548
+ return {map: lineView.measure.map, cache: lineView.measure.cache};
2549
+ for (var i = 0; i < lineView.rest.length; i++)
2550
+ if (lineView.rest[i] == line)
2551
+ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};
2552
+ for (var i = 0; i < lineView.rest.length; i++)
2553
+ if (lineNo(lineView.rest[i]) > lineN)
2554
+ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};
2555
+ }
2556
+
2557
+ // Render a line into the hidden node display.externalMeasured. Used
2558
+ // when measurement is needed for a line that's not in the viewport.
2559
+ function updateExternalMeasurement(cm, line) {
2560
+ line = visualLine(line);
2561
+ var lineN = lineNo(line);
2562
+ var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
2563
+ view.lineN = lineN;
2564
+ var built = view.built = buildLineContent(cm, view);
2565
+ view.text = built.pre;
2566
+ removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
2567
+ return view;
2568
+ }
2569
+
2570
+ // Get a {top, bottom, left, right} box (in line-local coordinates)
2571
+ // for a given character.
2572
+ function measureChar(cm, line, ch, bias) {
2573
+ return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);
2574
+ }
2575
+
2576
+ // Find a line view that corresponds to the given line number.
2577
+ function findViewForLine(cm, lineN) {
2578
+ if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
2579
+ return cm.display.view[findViewIndex(cm, lineN)];
2580
+ var ext = cm.display.externalMeasured;
2581
+ if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
2582
+ return ext;
2583
+ }
2584
+
2585
+ // Measurement can be split in two steps, the set-up work that
2586
+ // applies to the whole line, and the measurement of the actual
2587
+ // character. Functions like coordsChar, that need to do a lot of
2588
+ // measurements in a row, can thus ensure that the set-up work is
2589
+ // only done once.
2590
+ function prepareMeasureForLine(cm, line) {
2591
+ var lineN = lineNo(line);
2592
+ var view = findViewForLine(cm, lineN);
2593
+ if (view && !view.text) {
2594
+ view = null;
2595
+ } else if (view && view.changes) {
2596
+ updateLineForChanges(cm, view, lineN, getDimensions(cm));
2597
+ cm.curOp.forceUpdate = true;
2598
+ }
2599
+ if (!view)
2600
+ view = updateExternalMeasurement(cm, line);
2601
+
2602
+ var info = mapFromLineView(view, line, lineN);
2603
+ return {
2604
+ line: line, view: view, rect: null,
2605
+ map: info.map, cache: info.cache, before: info.before,
2606
+ hasHeights: false
2607
+ };
2608
+ }
2609
+
2610
+ // Given a prepared measurement object, measures the position of an
2611
+ // actual character (or fetches it from the cache).
2612
+ function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
2613
+ if (prepared.before) ch = -1;
2614
+ var key = ch + (bias || ""), found;
2615
+ if (prepared.cache.hasOwnProperty(key)) {
2616
+ found = prepared.cache[key];
2617
+ } else {
2618
+ if (!prepared.rect)
2619
+ prepared.rect = prepared.view.text.getBoundingClientRect();
2620
+ if (!prepared.hasHeights) {
2621
+ ensureLineHeights(cm, prepared.view, prepared.rect);
2622
+ prepared.hasHeights = true;
2623
+ }
2624
+ found = measureCharInner(cm, prepared, ch, bias);
2625
+ if (!found.bogus) prepared.cache[key] = found;
2626
+ }
2627
+ return {left: found.left, right: found.right,
2628
+ top: varHeight ? found.rtop : found.top,
2629
+ bottom: varHeight ? found.rbottom : found.bottom};
2630
+ }
2631
+
2632
+ var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
2633
+
2634
+ function nodeAndOffsetInLineMap(map, ch, bias) {
2635
+ var node, start, end, collapse;
2636
+ // First, search the line map for the text node corresponding to,
2637
+ // or closest to, the target character.
2638
+ for (var i = 0; i < map.length; i += 3) {
2639
+ var mStart = map[i], mEnd = map[i + 1];
2640
+ if (ch < mStart) {
2641
+ start = 0; end = 1;
2642
+ collapse = "left";
2643
+ } else if (ch < mEnd) {
2644
+ start = ch - mStart;
2645
+ end = start + 1;
2646
+ } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
2647
+ end = mEnd - mStart;
2648
+ start = end - 1;
2649
+ if (ch >= mEnd) collapse = "right";
2650
+ }
2651
+ if (start != null) {
2652
+ node = map[i + 2];
2653
+ if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
2654
+ collapse = bias;
2655
+ if (bias == "left" && start == 0)
2656
+ while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
2657
+ node = map[(i -= 3) + 2];
2658
+ collapse = "left";
2659
+ }
2660
+ if (bias == "right" && start == mEnd - mStart)
2661
+ while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
2662
+ node = map[(i += 3) + 2];
2663
+ collapse = "right";
2664
+ }
2665
+ break;
2666
+ }
2667
+ }
2668
+ return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};
2669
+ }
2670
+
2671
+ function measureCharInner(cm, prepared, ch, bias) {
2672
+ var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
2673
+ var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
2674
+
2675
+ var rect;
2676
+ if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
2677
+ for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
2678
+ while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;
2679
+ while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;
2680
+ if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) {
2681
+ rect = node.parentNode.getBoundingClientRect();
2682
+ } else if (ie && cm.options.lineWrapping) {
2683
+ var rects = range(node, start, end).getClientRects();
2684
+ if (rects.length)
2685
+ rect = rects[bias == "right" ? rects.length - 1 : 0];
2686
+ else
2687
+ rect = nullRect;
2688
+ } else {
2689
+ rect = range(node, start, end).getBoundingClientRect() || nullRect;
2690
+ }
2691
+ if (rect.left || rect.right || start == 0) break;
2692
+ end = start;
2693
+ start = start - 1;
2694
+ collapse = "right";
2695
+ }
2696
+ if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
2697
+ } else { // If it is a widget, simply get the box for the whole widget.
2698
+ if (start > 0) collapse = bias = "right";
2699
+ var rects;
2700
+ if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
2701
+ rect = rects[bias == "right" ? rects.length - 1 : 0];
2702
+ else
2703
+ rect = node.getBoundingClientRect();
2704
+ }
2705
+ if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
2706
+ var rSpan = node.parentNode.getClientRects()[0];
2707
+ if (rSpan)
2708
+ rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};
2709
+ else
2710
+ rect = nullRect;
2711
+ }
2712
+
2713
+ var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
2714
+ var mid = (rtop + rbot) / 2;
2715
+ var heights = prepared.view.measure.heights;
2716
+ for (var i = 0; i < heights.length - 1; i++)
2717
+ if (mid < heights[i]) break;
2718
+ var top = i ? heights[i - 1] : 0, bot = heights[i];
2719
+ var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
2720
+ right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
2721
+ top: top, bottom: bot};
2722
+ if (!rect.left && !rect.right) result.bogus = true;
2723
+ if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
2724
+
2725
+ return result;
2726
+ }
2727
+
2728
+ // Work around problem with bounding client rects on ranges being
2729
+ // returned incorrectly when zoomed on IE10 and below.
2730
+ function maybeUpdateRectForZooming(measure, rect) {
2731
+ if (!window.screen || screen.logicalXDPI == null ||
2732
+ screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
2733
+ return rect;
2734
+ var scaleX = screen.logicalXDPI / screen.deviceXDPI;
2735
+ var scaleY = screen.logicalYDPI / screen.deviceYDPI;
2736
+ return {left: rect.left * scaleX, right: rect.right * scaleX,
2737
+ top: rect.top * scaleY, bottom: rect.bottom * scaleY};
2738
+ }
2739
+
2740
+ function clearLineMeasurementCacheFor(lineView) {
2741
+ if (lineView.measure) {
2742
+ lineView.measure.cache = {};
2743
+ lineView.measure.heights = null;
2744
+ if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
2745
+ lineView.measure.caches[i] = {};
2746
+ }
2747
+ }
2748
+
2749
+ function clearLineMeasurementCache(cm) {
2750
+ cm.display.externalMeasure = null;
2751
+ removeChildren(cm.display.lineMeasure);
2752
+ for (var i = 0; i < cm.display.view.length; i++)
2753
+ clearLineMeasurementCacheFor(cm.display.view[i]);
2754
+ }
2755
+
2756
+ function clearCaches(cm) {
2757
+ clearLineMeasurementCache(cm);
2758
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
2759
+ if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
2760
+ cm.display.lineNumChars = null;
2761
+ }
2762
+
2763
+ function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
2764
+ function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
2765
+
2766
+ // Converts a {top, bottom, left, right} box from line-local
2767
+ // coordinates into another coordinate system. Context may be one of
2768
+ // "line", "div" (display.lineDiv), "local"/null (editor), "window",
2769
+ // or "page".
2770
+ function intoCoordSystem(cm, lineObj, rect, context) {
2771
+ if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
2772
+ var size = widgetHeight(lineObj.widgets[i]);
2773
+ rect.top += size; rect.bottom += size;
2774
+ }
2775
+ if (context == "line") return rect;
2776
+ if (!context) context = "local";
2777
+ var yOff = heightAtLine(lineObj);
2778
+ if (context == "local") yOff += paddingTop(cm.display);
2779
+ else yOff -= cm.display.viewOffset;
2780
+ if (context == "page" || context == "window") {
2781
+ var lOff = cm.display.lineSpace.getBoundingClientRect();
2782
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
2783
+ var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
2784
+ rect.left += xOff; rect.right += xOff;
2785
+ }
2786
+ rect.top += yOff; rect.bottom += yOff;
2787
+ return rect;
2788
+ }
2789
+
2790
+ // Coverts a box from "div" coords to another coordinate system.
2791
+ // Context may be "window", "page", "div", or "local"/null.
2792
+ function fromCoordSystem(cm, coords, context) {
2793
+ if (context == "div") return coords;
2794
+ var left = coords.left, top = coords.top;
2795
+ // First move into "page" coordinate system
2796
+ if (context == "page") {
2797
+ left -= pageScrollX();
2798
+ top -= pageScrollY();
2799
+ } else if (context == "local" || !context) {
2800
+ var localBox = cm.display.sizer.getBoundingClientRect();
2801
+ left += localBox.left;
2802
+ top += localBox.top;
2803
+ }
2804
+
2805
+ var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
2806
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
2807
+ }
2808
+
2809
+ function charCoords(cm, pos, context, lineObj, bias) {
2810
+ if (!lineObj) lineObj = getLine(cm.doc, pos.line);
2811
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);
2812
+ }
2813
+
2814
+ // Returns a box for a given cursor position, which may have an
2815
+ // 'other' property containing the position of the secondary cursor
2816
+ // on a bidi boundary.
2817
+ function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
2818
+ lineObj = lineObj || getLine(cm.doc, pos.line);
2819
+ if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);
2820
+ function get(ch, right) {
2821
+ var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
2822
+ if (right) m.left = m.right; else m.right = m.left;
2823
+ return intoCoordSystem(cm, lineObj, m, context);
2824
+ }
2825
+ function getBidi(ch, partPos) {
2826
+ var part = order[partPos], right = part.level % 2;
2827
+ if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
2828
+ part = order[--partPos];
2829
+ ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
2830
+ right = true;
2831
+ } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
2832
+ part = order[++partPos];
2833
+ ch = bidiLeft(part) - part.level % 2;
2834
+ right = false;
2835
+ }
2836
+ if (right && ch == part.to && ch > part.from) return get(ch - 1);
2837
+ return get(ch, right);
2838
+ }
2839
+ var order = getOrder(lineObj), ch = pos.ch;
2840
+ if (!order) return get(ch);
2841
+ var partPos = getBidiPartAt(order, ch);
2842
+ var val = getBidi(ch, partPos);
2843
+ if (bidiOther != null) val.other = getBidi(ch, bidiOther);
2844
+ return val;
2845
+ }
2846
+
2847
+ // Used to cheaply estimate the coordinates for a position. Used for
2848
+ // intermediate scroll updates.
2849
+ function estimateCoords(cm, pos) {
2850
+ var left = 0, pos = clipPos(cm.doc, pos);
2851
+ if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;
2852
+ var lineObj = getLine(cm.doc, pos.line);
2853
+ var top = heightAtLine(lineObj) + paddingTop(cm.display);
2854
+ return {left: left, right: left, top: top, bottom: top + lineObj.height};
2855
+ }
2856
+
2857
+ // Positions returned by coordsChar contain some extra information.
2858
+ // xRel is the relative x position of the input coordinates compared
2859
+ // to the found position (so xRel > 0 means the coordinates are to
2860
+ // the right of the character position, for example). When outside
2861
+ // is true, that means the coordinates lie outside the line's
2862
+ // vertical range.
2863
+ function PosWithInfo(line, ch, outside, xRel) {
2864
+ var pos = Pos(line, ch);
2865
+ pos.xRel = xRel;
2866
+ if (outside) pos.outside = true;
2867
+ return pos;
2868
+ }
2869
+
2870
+ // Compute the character position closest to the given coordinates.
2871
+ // Input must be lineSpace-local ("div" coordinate system).
2872
+ function coordsChar(cm, x, y) {
2873
+ var doc = cm.doc;
2874
+ y += cm.display.viewOffset;
2875
+ if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
2876
+ var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
2877
+ if (lineN > last)
2878
+ return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
2879
+ if (x < 0) x = 0;
2880
+
2881
+ var lineObj = getLine(doc, lineN);
2882
+ for (;;) {
2883
+ var found = coordsCharInner(cm, lineObj, lineN, x, y);
2884
+ var merged = collapsedSpanAtEnd(lineObj);
2885
+ var mergedPos = merged && merged.find(0, true);
2886
+ if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
2887
+ lineN = lineNo(lineObj = mergedPos.to.line);
2888
+ else
2889
+ return found;
2890
+ }
2891
+ }
2892
+
2893
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
2894
+ var innerOff = y - heightAtLine(lineObj);
2895
+ var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
2896
+ var preparedMeasure = prepareMeasureForLine(cm, lineObj);
2897
+
2898
+ function getX(ch) {
2899
+ var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);
2900
+ wrongLine = true;
2901
+ if (innerOff > sp.bottom) return sp.left - adjust;
2902
+ else if (innerOff < sp.top) return sp.left + adjust;
2903
+ else wrongLine = false;
2904
+ return sp.left;
2905
+ }
2906
+
2907
+ var bidi = getOrder(lineObj), dist = lineObj.text.length;
2908
+ var from = lineLeft(lineObj), to = lineRight(lineObj);
2909
+ var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
2910
+
2911
+ if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
2912
+ // Do a binary search between these bounds.
2913
+ for (;;) {
2914
+ if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
2915
+ var ch = x < fromX || x - fromX <= toX - x ? from : to;
2916
+ var xDiff = x - (ch == from ? fromX : toX);
2917
+ while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
2918
+ var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
2919
+ xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
2920
+ return pos;
2921
+ }
2922
+ var step = Math.ceil(dist / 2), middle = from + step;
2923
+ if (bidi) {
2924
+ middle = from;
2925
+ for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
2926
+ }
2927
+ var middleX = getX(middle);
2928
+ if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
2929
+ else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
2930
+ }
2931
+ }
2932
+
2933
+ var measureText;
2934
+ // Compute the default text height.
2935
+ function textHeight(display) {
2936
+ if (display.cachedTextHeight != null) return display.cachedTextHeight;
2937
+ if (measureText == null) {
2938
+ measureText = elt("pre");
2939
+ // Measure a bunch of lines, for browsers that compute
2940
+ // fractional heights.
2941
+ for (var i = 0; i < 49; ++i) {
2942
+ measureText.appendChild(document.createTextNode("x"));
2943
+ measureText.appendChild(elt("br"));
2944
+ }
2945
+ measureText.appendChild(document.createTextNode("x"));
2946
+ }
2947
+ removeChildrenAndAdd(display.measure, measureText);
2948
+ var height = measureText.offsetHeight / 50;
2949
+ if (height > 3) display.cachedTextHeight = height;
2950
+ removeChildren(display.measure);
2951
+ return height || 1;
2952
+ }
2953
+
2954
+ // Compute the default character width.
2955
+ function charWidth(display) {
2956
+ if (display.cachedCharWidth != null) return display.cachedCharWidth;
2957
+ var anchor = elt("span", "xxxxxxxxxx");
2958
+ var pre = elt("pre", [anchor]);
2959
+ removeChildrenAndAdd(display.measure, pre);
2960
+ var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
2961
+ if (width > 2) display.cachedCharWidth = width;
2962
+ return width || 10;
2963
+ }
2964
+
2965
+ // OPERATIONS
2966
+
2967
+ // Operations are used to wrap a series of changes to the editor
2968
+ // state in such a way that each change won't have to update the
2969
+ // cursor and display (which would be awkward, slow, and
2970
+ // error-prone). Instead, display updates are batched and then all
2971
+ // combined and executed at once.
2972
+
2973
+ var operationGroup = null;
2974
+
2975
+ var nextOpId = 0;
2976
+ // Start a new operation.
2977
+ function startOperation(cm) {
2978
+ cm.curOp = {
2979
+ cm: cm,
2980
+ viewChanged: false, // Flag that indicates that lines might need to be redrawn
2981
+ startHeight: cm.doc.height, // Used to detect need to update scrollbar
2982
+ forceUpdate: false, // Used to force a redraw
2983
+ updateInput: null, // Whether to reset the input textarea
2984
+ typing: false, // Whether this reset should be careful to leave existing text (for compositing)
2985
+ changeObjs: null, // Accumulated changes, for firing change events
2986
+ cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
2987
+ cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
2988
+ selectionChanged: false, // Whether the selection needs to be redrawn
2989
+ updateMaxLine: false, // Set when the widest line needs to be determined anew
2990
+ scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
2991
+ scrollToPos: null, // Used to scroll to a specific position
2992
+ focus: false,
2993
+ id: ++nextOpId // Unique ID
2994
+ };
2995
+ if (operationGroup) {
2996
+ operationGroup.ops.push(cm.curOp);
2997
+ } else {
2998
+ cm.curOp.ownsGroup = operationGroup = {
2999
+ ops: [cm.curOp],
3000
+ delayedCallbacks: []
3001
+ };
3002
+ }
3003
+ }
3004
+
3005
+ function fireCallbacksForOps(group) {
3006
+ // Calls delayed callbacks and cursorActivity handlers until no
3007
+ // new ones appear
3008
+ var callbacks = group.delayedCallbacks, i = 0;
3009
+ do {
3010
+ for (; i < callbacks.length; i++)
3011
+ callbacks[i].call(null);
3012
+ for (var j = 0; j < group.ops.length; j++) {
3013
+ var op = group.ops[j];
3014
+ if (op.cursorActivityHandlers)
3015
+ while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
3016
+ op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm);
3017
+ }
3018
+ } while (i < callbacks.length);
3019
+ }
3020
+
3021
+ // Finish an operation, updating the display and signalling delayed events
3022
+ function endOperation(cm) {
3023
+ var op = cm.curOp, group = op.ownsGroup;
3024
+ if (!group) return;
3025
+
3026
+ try { fireCallbacksForOps(group); }
3027
+ finally {
3028
+ operationGroup = null;
3029
+ for (var i = 0; i < group.ops.length; i++)
3030
+ group.ops[i].cm.curOp = null;
3031
+ endOperations(group);
3032
+ }
3033
+ }
3034
+
3035
+ // The DOM updates done when an operation finishes are batched so
3036
+ // that the minimum number of relayouts are required.
3037
+ function endOperations(group) {
3038
+ var ops = group.ops;
3039
+ for (var i = 0; i < ops.length; i++) // Read DOM
3040
+ endOperation_R1(ops[i]);
3041
+ for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
3042
+ endOperation_W1(ops[i]);
3043
+ for (var i = 0; i < ops.length; i++) // Read DOM
3044
+ endOperation_R2(ops[i]);
3045
+ for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
3046
+ endOperation_W2(ops[i]);
3047
+ for (var i = 0; i < ops.length; i++) // Read DOM
3048
+ endOperation_finish(ops[i]);
3049
+ }
3050
+
3051
+ function endOperation_R1(op) {
3052
+ var cm = op.cm, display = cm.display;
3053
+ maybeClipScrollbars(cm);
3054
+ if (op.updateMaxLine) findMaxLine(cm);
3055
+
3056
+ op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
3057
+ op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
3058
+ op.scrollToPos.to.line >= display.viewTo) ||
3059
+ display.maxLineChanged && cm.options.lineWrapping;
3060
+ op.update = op.mustUpdate &&
3061
+ new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
3062
+ }
3063
+
3064
+ function endOperation_W1(op) {
3065
+ op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
3066
+ }
3067
+
3068
+ function endOperation_R2(op) {
3069
+ var cm = op.cm, display = cm.display;
3070
+ if (op.updatedDisplay) updateHeightsInViewport(cm);
3071
+
3072
+ op.barMeasure = measureForScrollbars(cm);
3073
+
3074
+ // If the max line changed since it was last measured, measure it,
3075
+ // and ensure the document's width matches it.
3076
+ // updateDisplay_W2 will use these properties to do the actual resizing
3077
+ if (display.maxLineChanged && !cm.options.lineWrapping) {
3078
+ op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
3079
+ cm.display.sizerWidth = op.adjustWidthTo;
3080
+ op.barMeasure.scrollWidth =
3081
+ Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
3082
+ op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
3083
+ }
3084
+
3085
+ if (op.updatedDisplay || op.selectionChanged)
3086
+ op.preparedSelection = display.input.prepareSelection();
3087
+ }
3088
+
3089
+ function endOperation_W2(op) {
3090
+ var cm = op.cm;
3091
+
3092
+ if (op.adjustWidthTo != null) {
3093
+ cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
3094
+ if (op.maxScrollLeft < cm.doc.scrollLeft)
3095
+ setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);
3096
+ cm.display.maxLineChanged = false;
3097
+ }
3098
+
3099
+ if (op.preparedSelection)
3100
+ cm.display.input.showSelection(op.preparedSelection);
3101
+ if (op.updatedDisplay)
3102
+ setDocumentHeight(cm, op.barMeasure);
3103
+ if (op.updatedDisplay || op.startHeight != cm.doc.height)
3104
+ updateScrollbars(cm, op.barMeasure);
3105
+
3106
+ if (op.selectionChanged) restartBlink(cm);
3107
+
3108
+ if (cm.state.focused && op.updateInput)
3109
+ cm.display.input.reset(op.typing);
3110
+ if (op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()))
3111
+ ensureFocus(op.cm);
3112
+ }
3113
+
3114
+ function endOperation_finish(op) {
3115
+ var cm = op.cm, display = cm.display, doc = cm.doc;
3116
+
3117
+ if (op.updatedDisplay) postUpdateDisplay(cm, op.update);
3118
+
3119
+ // Abort mouse wheel delta measurement, when scrolling explicitly
3120
+ if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
3121
+ display.wheelStartX = display.wheelStartY = null;
3122
+
3123
+ // Propagate the scroll position to the actual DOM scroller
3124
+ if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {
3125
+ doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));
3126
+ display.scrollbars.setScrollTop(doc.scrollTop);
3127
+ display.scroller.scrollTop = doc.scrollTop;
3128
+ }
3129
+ if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {
3130
+ doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - displayWidth(cm), op.scrollLeft));
3131
+ display.scrollbars.setScrollLeft(doc.scrollLeft);
3132
+ display.scroller.scrollLeft = doc.scrollLeft;
3133
+ alignHorizontally(cm);
3134
+ }
3135
+ // If we need to scroll a specific position into view, do so.
3136
+ if (op.scrollToPos) {
3137
+ var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
3138
+ clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
3139
+ if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);
3140
+ }
3141
+
3142
+ // Fire events for markers that are hidden/unidden by editing or
3143
+ // undoing
3144
+ var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
3145
+ if (hidden) for (var i = 0; i < hidden.length; ++i)
3146
+ if (!hidden[i].lines.length) signal(hidden[i], "hide");
3147
+ if (unhidden) for (var i = 0; i < unhidden.length; ++i)
3148
+ if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
3149
+
3150
+ if (display.wrapper.offsetHeight)
3151
+ doc.scrollTop = cm.display.scroller.scrollTop;
3152
+
3153
+ // Fire change events, and delayed event handlers
3154
+ if (op.changeObjs)
3155
+ signal(cm, "changes", cm, op.changeObjs);
3156
+ if (op.update)
3157
+ op.update.finish();
3158
+ }
3159
+
3160
+ // Run the given function in an operation
3161
+ function runInOp(cm, f) {
3162
+ if (cm.curOp) return f();
3163
+ startOperation(cm);
3164
+ try { return f(); }
3165
+ finally { endOperation(cm); }
3166
+ }
3167
+ // Wraps a function in an operation. Returns the wrapped function.
3168
+ function operation(cm, f) {
3169
+ return function() {
3170
+ if (cm.curOp) return f.apply(cm, arguments);
3171
+ startOperation(cm);
3172
+ try { return f.apply(cm, arguments); }
3173
+ finally { endOperation(cm); }
3174
+ };
3175
+ }
3176
+ // Used to add methods to editor and doc instances, wrapping them in
3177
+ // operations.
3178
+ function methodOp(f) {
3179
+ return function() {
3180
+ if (this.curOp) return f.apply(this, arguments);
3181
+ startOperation(this);
3182
+ try { return f.apply(this, arguments); }
3183
+ finally { endOperation(this); }
3184
+ };
3185
+ }
3186
+ function docMethodOp(f) {
3187
+ return function() {
3188
+ var cm = this.cm;
3189
+ if (!cm || cm.curOp) return f.apply(this, arguments);
3190
+ startOperation(cm);
3191
+ try { return f.apply(this, arguments); }
3192
+ finally { endOperation(cm); }
3193
+ };
3194
+ }
3195
+
3196
+ // VIEW TRACKING
3197
+
3198
+ // These objects are used to represent the visible (currently drawn)
3199
+ // part of the document. A LineView may correspond to multiple
3200
+ // logical lines, if those are connected by collapsed ranges.
3201
+ function LineView(doc, line, lineN) {
3202
+ // The starting line
3203
+ this.line = line;
3204
+ // Continuing lines, if any
3205
+ this.rest = visualLineContinued(line);
3206
+ // Number of logical lines in this visual line
3207
+ this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
3208
+ this.node = this.text = null;
3209
+ this.hidden = lineIsHidden(doc, line);
3210
+ }
3211
+
3212
+ // Create a range of LineView objects for the given lines.
3213
+ function buildViewArray(cm, from, to) {
3214
+ var array = [], nextPos;
3215
+ for (var pos = from; pos < to; pos = nextPos) {
3216
+ var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
3217
+ nextPos = pos + view.size;
3218
+ array.push(view);
3219
+ }
3220
+ return array;
3221
+ }
3222
+
3223
+ // Updates the display.view data structure for a given change to the
3224
+ // document. From and to are in pre-change coordinates. Lendiff is
3225
+ // the amount of lines added or subtracted by the change. This is
3226
+ // used for changes that span multiple lines, or change the way
3227
+ // lines are divided into visual lines. regLineChange (below)
3228
+ // registers single-line changes.
3229
+ function regChange(cm, from, to, lendiff) {
3230
+ if (from == null) from = cm.doc.first;
3231
+ if (to == null) to = cm.doc.first + cm.doc.size;
3232
+ if (!lendiff) lendiff = 0;
3233
+
3234
+ var display = cm.display;
3235
+ if (lendiff && to < display.viewTo &&
3236
+ (display.updateLineNumbers == null || display.updateLineNumbers > from))
3237
+ display.updateLineNumbers = from;
3238
+
3239
+ cm.curOp.viewChanged = true;
3240
+
3241
+ if (from >= display.viewTo) { // Change after
3242
+ if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
3243
+ resetView(cm);
3244
+ } else if (to <= display.viewFrom) { // Change before
3245
+ if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
3246
+ resetView(cm);
3247
+ } else {
3248
+ display.viewFrom += lendiff;
3249
+ display.viewTo += lendiff;
3250
+ }
3251
+ } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
3252
+ resetView(cm);
3253
+ } else if (from <= display.viewFrom) { // Top overlap
3254
+ var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
3255
+ if (cut) {
3256
+ display.view = display.view.slice(cut.index);
3257
+ display.viewFrom = cut.lineN;
3258
+ display.viewTo += lendiff;
3259
+ } else {
3260
+ resetView(cm);
3261
+ }
3262
+ } else if (to >= display.viewTo) { // Bottom overlap
3263
+ var cut = viewCuttingPoint(cm, from, from, -1);
3264
+ if (cut) {
3265
+ display.view = display.view.slice(0, cut.index);
3266
+ display.viewTo = cut.lineN;
3267
+ } else {
3268
+ resetView(cm);
3269
+ }
3270
+ } else { // Gap in the middle
3271
+ var cutTop = viewCuttingPoint(cm, from, from, -1);
3272
+ var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
3273
+ if (cutTop && cutBot) {
3274
+ display.view = display.view.slice(0, cutTop.index)
3275
+ .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
3276
+ .concat(display.view.slice(cutBot.index));
3277
+ display.viewTo += lendiff;
3278
+ } else {
3279
+ resetView(cm);
3280
+ }
3281
+ }
3282
+
3283
+ var ext = display.externalMeasured;
3284
+ if (ext) {
3285
+ if (to < ext.lineN)
3286
+ ext.lineN += lendiff;
3287
+ else if (from < ext.lineN + ext.size)
3288
+ display.externalMeasured = null;
3289
+ }
3290
+ }
3291
+
3292
+ // Register a change to a single line. Type must be one of "text",
3293
+ // "gutter", "class", "widget"
3294
+ function regLineChange(cm, line, type) {
3295
+ cm.curOp.viewChanged = true;
3296
+ var display = cm.display, ext = cm.display.externalMeasured;
3297
+ if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
3298
+ display.externalMeasured = null;
3299
+
3300
+ if (line < display.viewFrom || line >= display.viewTo) return;
3301
+ var lineView = display.view[findViewIndex(cm, line)];
3302
+ if (lineView.node == null) return;
3303
+ var arr = lineView.changes || (lineView.changes = []);
3304
+ if (indexOf(arr, type) == -1) arr.push(type);
3305
+ }
3306
+
3307
+ // Clear the view.
3308
+ function resetView(cm) {
3309
+ cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
3310
+ cm.display.view = [];
3311
+ cm.display.viewOffset = 0;
3312
+ }
3313
+
3314
+ // Find the view element corresponding to a given line. Return null
3315
+ // when the line isn't visible.
3316
+ function findViewIndex(cm, n) {
3317
+ if (n >= cm.display.viewTo) return null;
3318
+ n -= cm.display.viewFrom;
3319
+ if (n < 0) return null;
3320
+ var view = cm.display.view;
3321
+ for (var i = 0; i < view.length; i++) {
3322
+ n -= view[i].size;
3323
+ if (n < 0) return i;
3324
+ }
3325
+ }
3326
+
3327
+ function viewCuttingPoint(cm, oldN, newN, dir) {
3328
+ var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
3329
+ if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
3330
+ return {index: index, lineN: newN};
3331
+ for (var i = 0, n = cm.display.viewFrom; i < index; i++)
3332
+ n += view[i].size;
3333
+ if (n != oldN) {
3334
+ if (dir > 0) {
3335
+ if (index == view.length - 1) return null;
3336
+ diff = (n + view[index].size) - oldN;
3337
+ index++;
3338
+ } else {
3339
+ diff = n - oldN;
3340
+ }
3341
+ oldN += diff; newN += diff;
3342
+ }
3343
+ while (visualLineNo(cm.doc, newN) != newN) {
3344
+ if (index == (dir < 0 ? 0 : view.length - 1)) return null;
3345
+ newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
3346
+ index += dir;
3347
+ }
3348
+ return {index: index, lineN: newN};
3349
+ }
3350
+
3351
+ // Force the view to cover a given range, adding empty view element
3352
+ // or clipping off existing ones as needed.
3353
+ function adjustView(cm, from, to) {
3354
+ var display = cm.display, view = display.view;
3355
+ if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
3356
+ display.view = buildViewArray(cm, from, to);
3357
+ display.viewFrom = from;
3358
+ } else {
3359
+ if (display.viewFrom > from)
3360
+ display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);
3361
+ else if (display.viewFrom < from)
3362
+ display.view = display.view.slice(findViewIndex(cm, from));
3363
+ display.viewFrom = from;
3364
+ if (display.viewTo < to)
3365
+ display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));
3366
+ else if (display.viewTo > to)
3367
+ display.view = display.view.slice(0, findViewIndex(cm, to));
3368
+ }
3369
+ display.viewTo = to;
3370
+ }
3371
+
3372
+ // Count the number of lines in the view whose DOM representation is
3373
+ // out of date (or nonexistent).
3374
+ function countDirtyView(cm) {
3375
+ var view = cm.display.view, dirty = 0;
3376
+ for (var i = 0; i < view.length; i++) {
3377
+ var lineView = view[i];
3378
+ if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;
3379
+ }
3380
+ return dirty;
3381
+ }
3382
+
3383
+ // EVENT HANDLERS
3384
+
3385
+ // Attach the necessary event handlers when initializing the editor
3386
+ function registerEventHandlers(cm) {
3387
+ var d = cm.display;
3388
+ on(d.scroller, "mousedown", operation(cm, onMouseDown));
3389
+ // Older IE's will not fire a second mousedown for a double click
3390
+ if (ie && ie_version < 11)
3391
+ on(d.scroller, "dblclick", operation(cm, function(e) {
3392
+ if (signalDOMEvent(cm, e)) return;
3393
+ var pos = posFromMouse(cm, e);
3394
+ if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
3395
+ e_preventDefault(e);
3396
+ var word = cm.findWordAt(pos);
3397
+ extendSelection(cm.doc, word.anchor, word.head);
3398
+ }));
3399
+ else
3400
+ on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
3401
+ // Some browsers fire contextmenu *after* opening the menu, at
3402
+ // which point we can't mess with it anymore. Context menu is
3403
+ // handled in onMouseDown for these browsers.
3404
+ if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
3405
+
3406
+ // Used to suppress mouse event handling when a touch happens
3407
+ var touchFinished, prevTouch = {end: 0};
3408
+ function finishTouch() {
3409
+ if (d.activeTouch) {
3410
+ touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000);
3411
+ prevTouch = d.activeTouch;
3412
+ prevTouch.end = +new Date;
3413
+ }
3414
+ };
3415
+ function isMouseLikeTouchEvent(e) {
3416
+ if (e.touches.length != 1) return false;
3417
+ var touch = e.touches[0];
3418
+ return touch.radiusX <= 1 && touch.radiusY <= 1;
3419
+ }
3420
+ function farAway(touch, other) {
3421
+ if (other.left == null) return true;
3422
+ var dx = other.left - touch.left, dy = other.top - touch.top;
3423
+ return dx * dx + dy * dy > 20 * 20;
3424
+ }
3425
+ on(d.scroller, "touchstart", function(e) {
3426
+ if (!isMouseLikeTouchEvent(e)) {
3427
+ clearTimeout(touchFinished);
3428
+ var now = +new Date;
3429
+ d.activeTouch = {start: now, moved: false,
3430
+ prev: now - prevTouch.end <= 300 ? prevTouch : null};
3431
+ if (e.touches.length == 1) {
3432
+ d.activeTouch.left = e.touches[0].pageX;
3433
+ d.activeTouch.top = e.touches[0].pageY;
3434
+ }
3435
+ }
3436
+ });
3437
+ on(d.scroller, "touchmove", function() {
3438
+ if (d.activeTouch) d.activeTouch.moved = true;
3439
+ });
3440
+ on(d.scroller, "touchend", function(e) {
3441
+ var touch = d.activeTouch;
3442
+ if (touch && !eventInWidget(d, e) && touch.left != null &&
3443
+ !touch.moved && new Date - touch.start < 300) {
3444
+ var pos = cm.coordsChar(d.activeTouch, "page"), range;
3445
+ if (!touch.prev || farAway(touch, touch.prev)) // Single tap
3446
+ range = new Range(pos, pos);
3447
+ else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
3448
+ range = cm.findWordAt(pos);
3449
+ else // Triple tap
3450
+ range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)));
3451
+ cm.setSelection(range.anchor, range.head);
3452
+ cm.focus();
3453
+ e_preventDefault(e);
3454
+ }
3455
+ finishTouch();
3456
+ });
3457
+ on(d.scroller, "touchcancel", finishTouch);
3458
+
3459
+ // Sync scrolling between fake scrollbars and real scrollable
3460
+ // area, ensure viewport is updated when scrolling.
3461
+ on(d.scroller, "scroll", function() {
3462
+ if (d.scroller.clientHeight) {
3463
+ setScrollTop(cm, d.scroller.scrollTop);
3464
+ setScrollLeft(cm, d.scroller.scrollLeft, true);
3465
+ signal(cm, "scroll", cm);
3466
+ }
3467
+ });
3468
+
3469
+ // Listen to wheel events in order to try and update the viewport on time.
3470
+ on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
3471
+ on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
3472
+
3473
+ // Prevent wrapper from ever scrolling
3474
+ on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
3475
+
3476
+ d.dragFunctions = {
3477
+ enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},
3478
+ over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
3479
+ start: function(e){onDragStart(cm, e);},
3480
+ drop: operation(cm, onDrop),
3481
+ leave: function() {clearDragCursor(cm);}
3482
+ };
3483
+
3484
+ var inp = d.input.getField();
3485
+ on(inp, "keyup", function(e) { onKeyUp.call(cm, e); });
3486
+ on(inp, "keydown", operation(cm, onKeyDown));
3487
+ on(inp, "keypress", operation(cm, onKeyPress));
3488
+ on(inp, "focus", bind(onFocus, cm));
3489
+ on(inp, "blur", bind(onBlur, cm));
3490
+ }
3491
+
3492
+ function dragDropChanged(cm, value, old) {
3493
+ var wasOn = old && old != CodeMirror.Init;
3494
+ if (!value != !wasOn) {
3495
+ var funcs = cm.display.dragFunctions;
3496
+ var toggle = value ? on : off;
3497
+ toggle(cm.display.scroller, "dragstart", funcs.start);
3498
+ toggle(cm.display.scroller, "dragenter", funcs.enter);
3499
+ toggle(cm.display.scroller, "dragover", funcs.over);
3500
+ toggle(cm.display.scroller, "dragleave", funcs.leave);
3501
+ toggle(cm.display.scroller, "drop", funcs.drop);
3502
+ }
3503
+ }
3504
+
3505
+ // Called when the window resizes
3506
+ function onResize(cm) {
3507
+ var d = cm.display;
3508
+ if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)
3509
+ return;
3510
+ // Might be a text scaling operation, clear size caches.
3511
+ d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
3512
+ d.scrollbarsClipped = false;
3513
+ cm.setSize();
3514
+ }
3515
+
3516
+ // MOUSE EVENTS
3517
+
3518
+ // Return true when the given mouse event happened in a widget
3519
+ function eventInWidget(display, e) {
3520
+ for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
3521
+ if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
3522
+ (n.parentNode == display.sizer && n != display.mover))
3523
+ return true;
3524
+ }
3525
+ }
3526
+
3527
+ // Given a mouse event, find the corresponding position. If liberal
3528
+ // is false, it checks whether a gutter or scrollbar was clicked,
3529
+ // and returns null if it was. forRect is used by rectangular
3530
+ // selections, and tries to estimate a character position even for
3531
+ // coordinates beyond the right of the text.
3532
+ function posFromMouse(cm, e, liberal, forRect) {
3533
+ var display = cm.display;
3534
+ if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null;
3535
+
3536
+ var x, y, space = display.lineSpace.getBoundingClientRect();
3537
+ // Fails unpredictably on IE[67] when mouse is dragged around quickly.
3538
+ try { x = e.clientX - space.left; y = e.clientY - space.top; }
3539
+ catch (e) { return null; }
3540
+ var coords = coordsChar(cm, x, y), line;
3541
+ if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
3542
+ var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
3543
+ coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
3544
+ }
3545
+ return coords;
3546
+ }
3547
+
3548
+ // A mouse down can be a single click, double click, triple click,
3549
+ // start of selection drag, start of text drag, new cursor
3550
+ // (ctrl-click), rectangle drag (alt-drag), or xwin
3551
+ // middle-click-paste. Or it might be a click on something we should
3552
+ // not interfere with, such as a scrollbar or widget.
3553
+ function onMouseDown(e) {
3554
+ var cm = this, display = cm.display;
3555
+ if (display.activeTouch && display.input.supportsTouch() || signalDOMEvent(cm, e)) return;
3556
+ display.shift = e.shiftKey;
3557
+
3558
+ if (eventInWidget(display, e)) {
3559
+ if (!webkit) {
3560
+ // Briefly turn off draggability, to allow widgets to do
3561
+ // normal dragging things.
3562
+ display.scroller.draggable = false;
3563
+ setTimeout(function(){display.scroller.draggable = true;}, 100);
3564
+ }
3565
+ return;
3566
+ }
3567
+ if (clickInGutter(cm, e)) return;
3568
+ var start = posFromMouse(cm, e);
3569
+ window.focus();
3570
+
3571
+ switch (e_button(e)) {
3572
+ case 1:
3573
+ // #3261: make sure, that we're not starting a second selection
3574
+ if (cm.state.selectingText)
3575
+ cm.state.selectingText(e);
3576
+ else if (start)
3577
+ leftButtonDown(cm, e, start);
3578
+ else if (e_target(e) == display.scroller)
3579
+ e_preventDefault(e);
3580
+ break;
3581
+ case 2:
3582
+ if (webkit) cm.state.lastMiddleDown = +new Date;
3583
+ if (start) extendSelection(cm.doc, start);
3584
+ setTimeout(function() {display.input.focus();}, 20);
3585
+ e_preventDefault(e);
3586
+ break;
3587
+ case 3:
3588
+ if (captureRightClick) onContextMenu(cm, e);
3589
+ else delayBlurEvent(cm);
3590
+ break;
3591
+ }
3592
+ }
3593
+
3594
+ var lastClick, lastDoubleClick;
3595
+ function leftButtonDown(cm, e, start) {
3596
+ if (ie) setTimeout(bind(ensureFocus, cm), 0);
3597
+ else cm.curOp.focus = activeElt();
3598
+
3599
+ var now = +new Date, type;
3600
+ if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {
3601
+ type = "triple";
3602
+ } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {
3603
+ type = "double";
3604
+ lastDoubleClick = {time: now, pos: start};
3605
+ } else {
3606
+ type = "single";
3607
+ lastClick = {time: now, pos: start};
3608
+ }
3609
+
3610
+ var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;
3611
+ if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) &&
3612
+ type == "single" && (contained = sel.contains(start)) > -1 &&
3613
+ (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&
3614
+ (cmp(contained.to(), start) > 0 || start.xRel < 0))
3615
+ leftButtonStartDrag(cm, e, start, modifier);
3616
+ else
3617
+ leftButtonSelect(cm, e, start, type, modifier);
3618
+ }
3619
+
3620
+ // Start a text drag. When it ends, see if any dragging actually
3621
+ // happen, and treat as a click if it didn't.
3622
+ function leftButtonStartDrag(cm, e, start, modifier) {
3623
+ var display = cm.display, startTime = +new Date;
3624
+ var dragEnd = operation(cm, function(e2) {
3625
+ if (webkit) display.scroller.draggable = false;
3626
+ cm.state.draggingText = false;
3627
+ off(document, "mouseup", dragEnd);
3628
+ off(display.scroller, "drop", dragEnd);
3629
+ if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
3630
+ e_preventDefault(e2);
3631
+ if (!modifier && +new Date - 200 < startTime)
3632
+ extendSelection(cm.doc, start);
3633
+ // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
3634
+ if (webkit || ie && ie_version == 9)
3635
+ setTimeout(function() {document.body.focus(); display.input.focus();}, 20);
3636
+ else
3637
+ display.input.focus();
3638
+ }
3639
+ });
3640
+ // Let the drag handler handle this.
3641
+ if (webkit) display.scroller.draggable = true;
3642
+ cm.state.draggingText = dragEnd;
3643
+ // IE's approach to draggable
3644
+ if (display.scroller.dragDrop) display.scroller.dragDrop();
3645
+ on(document, "mouseup", dragEnd);
3646
+ on(display.scroller, "drop", dragEnd);
3647
+ }
3648
+
3649
+ // Normal selection, as opposed to text dragging.
3650
+ function leftButtonSelect(cm, e, start, type, addNew) {
3651
+ var display = cm.display, doc = cm.doc;
3652
+ e_preventDefault(e);
3653
+
3654
+ var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
3655
+ if (addNew && !e.shiftKey) {
3656
+ ourIndex = doc.sel.contains(start);
3657
+ if (ourIndex > -1)
3658
+ ourRange = ranges[ourIndex];
3659
+ else
3660
+ ourRange = new Range(start, start);
3661
+ } else {
3662
+ ourRange = doc.sel.primary();
3663
+ ourIndex = doc.sel.primIndex;
3664
+ }
3665
+
3666
+ if (e.altKey) {
3667
+ type = "rect";
3668
+ if (!addNew) ourRange = new Range(start, start);
3669
+ start = posFromMouse(cm, e, true, true);
3670
+ ourIndex = -1;
3671
+ } else if (type == "double") {
3672
+ var word = cm.findWordAt(start);
3673
+ if (cm.display.shift || doc.extend)
3674
+ ourRange = extendRange(doc, ourRange, word.anchor, word.head);
3675
+ else
3676
+ ourRange = word;
3677
+ } else if (type == "triple") {
3678
+ var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));
3679
+ if (cm.display.shift || doc.extend)
3680
+ ourRange = extendRange(doc, ourRange, line.anchor, line.head);
3681
+ else
3682
+ ourRange = line;
3683
+ } else {
3684
+ ourRange = extendRange(doc, ourRange, start);
3685
+ }
3686
+
3687
+ if (!addNew) {
3688
+ ourIndex = 0;
3689
+ setSelection(doc, new Selection([ourRange], 0), sel_mouse);
3690
+ startSel = doc.sel;
3691
+ } else if (ourIndex == -1) {
3692
+ ourIndex = ranges.length;
3693
+ setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),
3694
+ {scroll: false, origin: "*mouse"});
3695
+ } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) {
3696
+ setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
3697
+ {scroll: false, origin: "*mouse"});
3698
+ startSel = doc.sel;
3699
+ } else {
3700
+ replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
3701
+ }
3702
+
3703
+ var lastPos = start;
3704
+ function extendTo(pos) {
3705
+ if (cmp(lastPos, pos) == 0) return;
3706
+ lastPos = pos;
3707
+
3708
+ if (type == "rect") {
3709
+ var ranges = [], tabSize = cm.options.tabSize;
3710
+ var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
3711
+ var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
3712
+ var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
3713
+ for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
3714
+ line <= end; line++) {
3715
+ var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
3716
+ if (left == right)
3717
+ ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));
3718
+ else if (text.length > leftPos)
3719
+ ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));
3720
+ }
3721
+ if (!ranges.length) ranges.push(new Range(start, start));
3722
+ setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
3723
+ {origin: "*mouse", scroll: false});
3724
+ cm.scrollIntoView(pos);
3725
+ } else {
3726
+ var oldRange = ourRange;
3727
+ var anchor = oldRange.anchor, head = pos;
3728
+ if (type != "single") {
3729
+ if (type == "double")
3730
+ var range = cm.findWordAt(pos);
3731
+ else
3732
+ var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));
3733
+ if (cmp(range.anchor, anchor) > 0) {
3734
+ head = range.head;
3735
+ anchor = minPos(oldRange.from(), range.anchor);
3736
+ } else {
3737
+ head = range.anchor;
3738
+ anchor = maxPos(oldRange.to(), range.head);
3739
+ }
3740
+ }
3741
+ var ranges = startSel.ranges.slice(0);
3742
+ ranges[ourIndex] = new Range(clipPos(doc, anchor), head);
3743
+ setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);
3744
+ }
3745
+ }
3746
+
3747
+ var editorSize = display.wrapper.getBoundingClientRect();
3748
+ // Used to ensure timeout re-tries don't fire when another extend
3749
+ // happened in the meantime (clearTimeout isn't reliable -- at
3750
+ // least on Chrome, the timeouts still happen even when cleared,
3751
+ // if the clear happens after their scheduled firing time).
3752
+ var counter = 0;
3753
+
3754
+ function extend(e) {
3755
+ var curCount = ++counter;
3756
+ var cur = posFromMouse(cm, e, true, type == "rect");
3757
+ if (!cur) return;
3758
+ if (cmp(cur, lastPos) != 0) {
3759
+ cm.curOp.focus = activeElt();
3760
+ extendTo(cur);
3761
+ var visible = visibleLines(display, doc);
3762
+ if (cur.line >= visible.to || cur.line < visible.from)
3763
+ setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
3764
+ } else {
3765
+ var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
3766
+ if (outside) setTimeout(operation(cm, function() {
3767
+ if (counter != curCount) return;
3768
+ display.scroller.scrollTop += outside;
3769
+ extend(e);
3770
+ }), 50);
3771
+ }
3772
+ }
3773
+
3774
+ function done(e) {
3775
+ cm.state.selectingText = false;
3776
+ counter = Infinity;
3777
+ e_preventDefault(e);
3778
+ display.input.focus();
3779
+ off(document, "mousemove", move);
3780
+ off(document, "mouseup", up);
3781
+ doc.history.lastSelOrigin = null;
3782
+ }
3783
+
3784
+ var move = operation(cm, function(e) {
3785
+ if (!e_button(e)) done(e);
3786
+ else extend(e);
3787
+ });
3788
+ var up = operation(cm, done);
3789
+ cm.state.selectingText = up;
3790
+ on(document, "mousemove", move);
3791
+ on(document, "mouseup", up);
3792
+ }
3793
+
3794
+ // Determines whether an event happened in the gutter, and fires the
3795
+ // handlers for the corresponding event.
3796
+ function gutterEvent(cm, e, type, prevent) {
3797
+ try { var mX = e.clientX, mY = e.clientY; }
3798
+ catch(e) { return false; }
3799
+ if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;
3800
+ if (prevent) e_preventDefault(e);
3801
+
3802
+ var display = cm.display;
3803
+ var lineBox = display.lineDiv.getBoundingClientRect();
3804
+
3805
+ if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
3806
+ mY -= lineBox.top - display.viewOffset;
3807
+
3808
+ for (var i = 0; i < cm.options.gutters.length; ++i) {
3809
+ var g = display.gutters.childNodes[i];
3810
+ if (g && g.getBoundingClientRect().right >= mX) {
3811
+ var line = lineAtHeight(cm.doc, mY);
3812
+ var gutter = cm.options.gutters[i];
3813
+ signal(cm, type, cm, line, gutter, e);
3814
+ return e_defaultPrevented(e);
3815
+ }
3816
+ }
3817
+ }
3818
+
3819
+ function clickInGutter(cm, e) {
3820
+ return gutterEvent(cm, e, "gutterClick", true);
3821
+ }
3822
+
3823
+ // Kludge to work around strange IE behavior where it'll sometimes
3824
+ // re-fire a series of drag-related events right after the drop (#1551)
3825
+ var lastDrop = 0;
3826
+
3827
+ function onDrop(e) {
3828
+ var cm = this;
3829
+ clearDragCursor(cm);
3830
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
3831
+ return;
3832
+ e_preventDefault(e);
3833
+ if (ie) lastDrop = +new Date;
3834
+ var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
3835
+ if (!pos || isReadOnly(cm)) return;
3836
+ // Might be a file drop, in which case we simply extract the text
3837
+ // and insert it.
3838
+ if (files && files.length && window.FileReader && window.File) {
3839
+ var n = files.length, text = Array(n), read = 0;
3840
+ var loadFile = function(file, i) {
3841
+ if (cm.options.allowDropFileTypes &&
3842
+ indexOf(cm.options.allowDropFileTypes, file.type) == -1)
3843
+ return;
3844
+
3845
+ var reader = new FileReader;
3846
+ reader.onload = operation(cm, function() {
3847
+ var content = reader.result;
3848
+ if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) content = "";
3849
+ text[i] = content;
3850
+ if (++read == n) {
3851
+ pos = clipPos(cm.doc, pos);
3852
+ var change = {from: pos, to: pos,
3853
+ text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),
3854
+ origin: "paste"};
3855
+ makeChange(cm.doc, change);
3856
+ setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
3857
+ }
3858
+ });
3859
+ reader.readAsText(file);
3860
+ };
3861
+ for (var i = 0; i < n; ++i) loadFile(files[i], i);
3862
+ } else { // Normal drop
3863
+ // Don't do a replace if the drop happened inside of the selected text.
3864
+ if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
3865
+ cm.state.draggingText(e);
3866
+ // Ensure the editor is re-focused
3867
+ setTimeout(function() {cm.display.input.focus();}, 20);
3868
+ return;
3869
+ }
3870
+ try {
3871
+ var text = e.dataTransfer.getData("Text");
3872
+ if (text) {
3873
+ if (cm.state.draggingText && !(mac ? e.altKey : e.ctrlKey))
3874
+ var selected = cm.listSelections();
3875
+ setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
3876
+ if (selected) for (var i = 0; i < selected.length; ++i)
3877
+ replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");
3878
+ cm.replaceSelection(text, "around", "paste");
3879
+ cm.display.input.focus();
3880
+ }
3881
+ }
3882
+ catch(e){}
3883
+ }
3884
+ }
3885
+
3886
+ function onDragStart(cm, e) {
3887
+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
3888
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
3889
+
3890
+ e.dataTransfer.setData("Text", cm.getSelection());
3891
+
3892
+ // Use dummy image instead of default browsers image.
3893
+ // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
3894
+ if (e.dataTransfer.setDragImage && !safari) {
3895
+ var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
3896
+ img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
3897
+ if (presto) {
3898
+ img.width = img.height = 1;
3899
+ cm.display.wrapper.appendChild(img);
3900
+ // Force a relayout, or Opera won't use our image for some obscure reason
3901
+ img._top = img.offsetTop;
3902
+ }
3903
+ e.dataTransfer.setDragImage(img, 0, 0);
3904
+ if (presto) img.parentNode.removeChild(img);
3905
+ }
3906
+ }
3907
+
3908
+ function onDragOver(cm, e) {
3909
+ var pos = posFromMouse(cm, e);
3910
+ if (!pos) return;
3911
+ var frag = document.createDocumentFragment();
3912
+ drawSelectionCursor(cm, pos, frag);
3913
+ if (!cm.display.dragCursor) {
3914
+ cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
3915
+ cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
3916
+ }
3917
+ removeChildrenAndAdd(cm.display.dragCursor, frag);
3918
+ }
3919
+
3920
+ function clearDragCursor(cm) {
3921
+ if (cm.display.dragCursor) {
3922
+ cm.display.lineSpace.removeChild(cm.display.dragCursor);
3923
+ cm.display.dragCursor = null;
3924
+ }
3925
+ }
3926
+
3927
+ // SCROLL EVENTS
3928
+
3929
+ // Sync the scrollable area and scrollbars, ensure the viewport
3930
+ // covers the visible area.
3931
+ function setScrollTop(cm, val) {
3932
+ if (Math.abs(cm.doc.scrollTop - val) < 2) return;
3933
+ cm.doc.scrollTop = val;
3934
+ if (!gecko) updateDisplaySimple(cm, {top: val});
3935
+ if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
3936
+ cm.display.scrollbars.setScrollTop(val);
3937
+ if (gecko) updateDisplaySimple(cm);
3938
+ startWorker(cm, 100);
3939
+ }
3940
+ // Sync scroller and scrollbar, ensure the gutter elements are
3941
+ // aligned.
3942
+ function setScrollLeft(cm, val, isScroller) {
3943
+ if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
3944
+ val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
3945
+ cm.doc.scrollLeft = val;
3946
+ alignHorizontally(cm);
3947
+ if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
3948
+ cm.display.scrollbars.setScrollLeft(val);
3949
+ }
3950
+
3951
+ // Since the delta values reported on mouse wheel events are
3952
+ // unstandardized between browsers and even browser versions, and
3953
+ // generally horribly unpredictable, this code starts by measuring
3954
+ // the scroll effect that the first few mouse wheel events have,
3955
+ // and, from that, detects the way it can convert deltas to pixel
3956
+ // offsets afterwards.
3957
+ //
3958
+ // The reason we want to know the amount a wheel event will scroll
3959
+ // is that it gives us a chance to update the display before the
3960
+ // actual scrolling happens, reducing flickering.
3961
+
3962
+ var wheelSamples = 0, wheelPixelsPerUnit = null;
3963
+ // Fill in a browser-detected starting value on browsers where we
3964
+ // know one. These don't have to be accurate -- the result of them
3965
+ // being wrong would just be a slight flicker on the first wheel
3966
+ // scroll (if it is large enough).
3967
+ if (ie) wheelPixelsPerUnit = -.53;
3968
+ else if (gecko) wheelPixelsPerUnit = 15;
3969
+ else if (chrome) wheelPixelsPerUnit = -.7;
3970
+ else if (safari) wheelPixelsPerUnit = -1/3;
3971
+
3972
+ var wheelEventDelta = function(e) {
3973
+ var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
3974
+ if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
3975
+ if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
3976
+ else if (dy == null) dy = e.wheelDelta;
3977
+ return {x: dx, y: dy};
3978
+ };
3979
+ CodeMirror.wheelEventPixels = function(e) {
3980
+ var delta = wheelEventDelta(e);
3981
+ delta.x *= wheelPixelsPerUnit;
3982
+ delta.y *= wheelPixelsPerUnit;
3983
+ return delta;
3984
+ };
3985
+
3986
+ function onScrollWheel(cm, e) {
3987
+ var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
3988
+
3989
+ var display = cm.display, scroll = display.scroller;
3990
+ // Quit if there's nothing to scroll here
3991
+ var canScrollX = scroll.scrollWidth > scroll.clientWidth;
3992
+ var canScrollY = scroll.scrollHeight > scroll.clientHeight;
3993
+ if (!(dx && canScrollX || dy && canScrollY)) return;
3994
+
3995
+ // Webkit browsers on OS X abort momentum scrolls when the target
3996
+ // of the scroll event is removed from the scrollable element.
3997
+ // This hack (see related code in patchDisplay) makes sure the
3998
+ // element is kept around.
3999
+ if (dy && mac && webkit) {
4000
+ outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
4001
+ for (var i = 0; i < view.length; i++) {
4002
+ if (view[i].node == cur) {
4003
+ cm.display.currentWheelTarget = cur;
4004
+ break outer;
4005
+ }
4006
+ }
4007
+ }
4008
+ }
4009
+
4010
+ // On some browsers, horizontal scrolling will cause redraws to
4011
+ // happen before the gutter has been realigned, causing it to
4012
+ // wriggle around in a most unseemly way. When we have an
4013
+ // estimated pixels/delta value, we just handle horizontal
4014
+ // scrolling entirely here. It'll be slightly off from native, but
4015
+ // better than glitching out.
4016
+ if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
4017
+ if (dy && canScrollY)
4018
+ setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
4019
+ setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
4020
+ // Only prevent default scrolling if vertical scrolling is
4021
+ // actually possible. Otherwise, it causes vertical scroll
4022
+ // jitter on OSX trackpads when deltaX is small and deltaY
4023
+ // is large (issue #3579)
4024
+ if (!dy || (dy && canScrollY))
4025
+ e_preventDefault(e);
4026
+ display.wheelStartX = null; // Abort measurement, if in progress
4027
+ return;
4028
+ }
4029
+
4030
+ // 'Project' the visible viewport to cover the area that is being
4031
+ // scrolled into view (if we know enough to estimate it).
4032
+ if (dy && wheelPixelsPerUnit != null) {
4033
+ var pixels = dy * wheelPixelsPerUnit;
4034
+ var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
4035
+ if (pixels < 0) top = Math.max(0, top + pixels - 50);
4036
+ else bot = Math.min(cm.doc.height, bot + pixels + 50);
4037
+ updateDisplaySimple(cm, {top: top, bottom: bot});
4038
+ }
4039
+
4040
+ if (wheelSamples < 20) {
4041
+ if (display.wheelStartX == null) {
4042
+ display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
4043
+ display.wheelDX = dx; display.wheelDY = dy;
4044
+ setTimeout(function() {
4045
+ if (display.wheelStartX == null) return;
4046
+ var movedX = scroll.scrollLeft - display.wheelStartX;
4047
+ var movedY = scroll.scrollTop - display.wheelStartY;
4048
+ var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
4049
+ (movedX && display.wheelDX && movedX / display.wheelDX);
4050
+ display.wheelStartX = display.wheelStartY = null;
4051
+ if (!sample) return;
4052
+ wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
4053
+ ++wheelSamples;
4054
+ }, 200);
4055
+ } else {
4056
+ display.wheelDX += dx; display.wheelDY += dy;
4057
+ }
4058
+ }
4059
+ }
4060
+
4061
+ // KEY EVENTS
4062
+
4063
+ // Run a handler that was bound to a key.
4064
+ function doHandleBinding(cm, bound, dropShift) {
4065
+ if (typeof bound == "string") {
4066
+ bound = commands[bound];
4067
+ if (!bound) return false;
4068
+ }
4069
+ // Ensure previous input has been read, so that the handler sees a
4070
+ // consistent view of the document
4071
+ cm.display.input.ensurePolled();
4072
+ var prevShift = cm.display.shift, done = false;
4073
+ try {
4074
+ if (isReadOnly(cm)) cm.state.suppressEdits = true;
4075
+ if (dropShift) cm.display.shift = false;
4076
+ done = bound(cm) != Pass;
4077
+ } finally {
4078
+ cm.display.shift = prevShift;
4079
+ cm.state.suppressEdits = false;
4080
+ }
4081
+ return done;
4082
+ }
4083
+
4084
+ function lookupKeyForEditor(cm, name, handle) {
4085
+ for (var i = 0; i < cm.state.keyMaps.length; i++) {
4086
+ var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
4087
+ if (result) return result;
4088
+ }
4089
+ return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
4090
+ || lookupKey(name, cm.options.keyMap, handle, cm);
4091
+ }
4092
+
4093
+ var stopSeq = new Delayed;
4094
+ function dispatchKey(cm, name, e, handle) {
4095
+ var seq = cm.state.keySeq;
4096
+ if (seq) {
4097
+ if (isModifierKey(name)) return "handled";
4098
+ stopSeq.set(50, function() {
4099
+ if (cm.state.keySeq == seq) {
4100
+ cm.state.keySeq = null;
4101
+ cm.display.input.reset();
4102
+ }
4103
+ });
4104
+ name = seq + " " + name;
4105
+ }
4106
+ var result = lookupKeyForEditor(cm, name, handle);
4107
+
4108
+ if (result == "multi")
4109
+ cm.state.keySeq = name;
4110
+ if (result == "handled")
4111
+ signalLater(cm, "keyHandled", cm, name, e);
4112
+
4113
+ if (result == "handled" || result == "multi") {
4114
+ e_preventDefault(e);
4115
+ restartBlink(cm);
4116
+ }
4117
+
4118
+ if (seq && !result && /\'$/.test(name)) {
4119
+ e_preventDefault(e);
4120
+ return true;
4121
+ }
4122
+ return !!result;
4123
+ }
4124
+
4125
+ // Handle a key from the keydown event.
4126
+ function handleKeyBinding(cm, e) {
4127
+ var name = keyName(e, true);
4128
+ if (!name) return false;
4129
+
4130
+ if (e.shiftKey && !cm.state.keySeq) {
4131
+ // First try to resolve full name (including 'Shift-'). Failing
4132
+ // that, see if there is a cursor-motion command (starting with
4133
+ // 'go') bound to the keyname without 'Shift-'.
4134
+ return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);})
4135
+ || dispatchKey(cm, name, e, function(b) {
4136
+ if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
4137
+ return doHandleBinding(cm, b);
4138
+ });
4139
+ } else {
4140
+ return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });
4141
+ }
4142
+ }
4143
+
4144
+ // Handle a key from the keypress event
4145
+ function handleCharBinding(cm, e, ch) {
4146
+ return dispatchKey(cm, "'" + ch + "'", e,
4147
+ function(b) { return doHandleBinding(cm, b, true); });
4148
+ }
4149
+
4150
+ var lastStoppedKey = null;
4151
+ function onKeyDown(e) {
4152
+ var cm = this;
4153
+ cm.curOp.focus = activeElt();
4154
+ if (signalDOMEvent(cm, e)) return;
4155
+ // IE does strange things with escape.
4156
+ if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;
4157
+ var code = e.keyCode;
4158
+ cm.display.shift = code == 16 || e.shiftKey;
4159
+ var handled = handleKeyBinding(cm, e);
4160
+ if (presto) {
4161
+ lastStoppedKey = handled ? code : null;
4162
+ // Opera has no cut event... we try to at least catch the key combo
4163
+ if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
4164
+ cm.replaceSelection("", null, "cut");
4165
+ }
4166
+
4167
+ // Turn mouse into crosshair when Alt is held on Mac.
4168
+ if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
4169
+ showCrossHair(cm);
4170
+ }
4171
+
4172
+ function showCrossHair(cm) {
4173
+ var lineDiv = cm.display.lineDiv;
4174
+ addClass(lineDiv, "CodeMirror-crosshair");
4175
+
4176
+ function up(e) {
4177
+ if (e.keyCode == 18 || !e.altKey) {
4178
+ rmClass(lineDiv, "CodeMirror-crosshair");
4179
+ off(document, "keyup", up);
4180
+ off(document, "mouseover", up);
4181
+ }
4182
+ }
4183
+ on(document, "keyup", up);
4184
+ on(document, "mouseover", up);
4185
+ }
4186
+
4187
+ function onKeyUp(e) {
4188
+ if (e.keyCode == 16) this.doc.sel.shift = false;
4189
+ signalDOMEvent(this, e);
4190
+ }
4191
+
4192
+ function onKeyPress(e) {
4193
+ var cm = this;
4194
+ if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;
4195
+ var keyCode = e.keyCode, charCode = e.charCode;
4196
+ if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
4197
+ if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return;
4198
+ var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
4199
+ if (handleCharBinding(cm, e, ch)) return;
4200
+ cm.display.input.onKeyPress(e);
4201
+ }
4202
+
4203
+ // FOCUS/BLUR EVENTS
4204
+
4205
+ function delayBlurEvent(cm) {
4206
+ cm.state.delayingBlurEvent = true;
4207
+ setTimeout(function() {
4208
+ if (cm.state.delayingBlurEvent) {
4209
+ cm.state.delayingBlurEvent = false;
4210
+ onBlur(cm);
4211
+ }
4212
+ }, 100);
4213
+ }
4214
+
4215
+ function onFocus(cm) {
4216
+ if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false;
4217
+
4218
+ if (cm.options.readOnly == "nocursor") return;
4219
+ if (!cm.state.focused) {
4220
+ signal(cm, "focus", cm);
4221
+ cm.state.focused = true;
4222
+ addClass(cm.display.wrapper, "CodeMirror-focused");
4223
+ // This test prevents this from firing when a context
4224
+ // menu is closed (since the input reset would kill the
4225
+ // select-all detection hack)
4226
+ if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
4227
+ cm.display.input.reset();
4228
+ if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730
4229
+ }
4230
+ cm.display.input.receivedFocus();
4231
+ }
4232
+ restartBlink(cm);
4233
+ }
4234
+ function onBlur(cm) {
4235
+ if (cm.state.delayingBlurEvent) return;
4236
+
4237
+ if (cm.state.focused) {
4238
+ signal(cm, "blur", cm);
4239
+ cm.state.focused = false;
4240
+ rmClass(cm.display.wrapper, "CodeMirror-focused");
4241
+ }
4242
+ clearInterval(cm.display.blinker);
4243
+ setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);
4244
+ }
4245
+
4246
+ // CONTEXT MENU HANDLING
4247
+
4248
+ // To make the context menu work, we need to briefly unhide the
4249
+ // textarea (making it as unobtrusive as possible) to let the
4250
+ // right-click take effect on it.
4251
+ function onContextMenu(cm, e) {
4252
+ if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return;
4253
+ if (signalDOMEvent(cm, e, "contextmenu")) return;
4254
+ cm.display.input.onContextMenu(e);
4255
+ }
4256
+
4257
+ function contextMenuInGutter(cm, e) {
4258
+ if (!hasHandler(cm, "gutterContextMenu")) return false;
4259
+ return gutterEvent(cm, e, "gutterContextMenu", false);
4260
+ }
4261
+
4262
+ // UPDATING
4263
+
4264
+ // Compute the position of the end of a change (its 'to' property
4265
+ // refers to the pre-change end).
4266
+ var changeEnd = CodeMirror.changeEnd = function(change) {
4267
+ if (!change.text) return change.to;
4268
+ return Pos(change.from.line + change.text.length - 1,
4269
+ lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
4270
+ };
4271
+
4272
+ // Adjust a position to refer to the post-change position of the
4273
+ // same text, or the end of the change if the change covers it.
4274
+ function adjustForChange(pos, change) {
4275
+ if (cmp(pos, change.from) < 0) return pos;
4276
+ if (cmp(pos, change.to) <= 0) return changeEnd(change);
4277
+
4278
+ var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
4279
+ if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;
4280
+ return Pos(line, ch);
4281
+ }
4282
+
4283
+ function computeSelAfterChange(doc, change) {
4284
+ var out = [];
4285
+ for (var i = 0; i < doc.sel.ranges.length; i++) {
4286
+ var range = doc.sel.ranges[i];
4287
+ out.push(new Range(adjustForChange(range.anchor, change),
4288
+ adjustForChange(range.head, change)));
4289
+ }
4290
+ return normalizeSelection(out, doc.sel.primIndex);
4291
+ }
4292
+
4293
+ function offsetPos(pos, old, nw) {
4294
+ if (pos.line == old.line)
4295
+ return Pos(nw.line, pos.ch - old.ch + nw.ch);
4296
+ else
4297
+ return Pos(nw.line + (pos.line - old.line), pos.ch);
4298
+ }
4299
+
4300
+ // Used by replaceSelections to allow moving the selection to the
4301
+ // start or around the replaced test. Hint may be "start" or "around".
4302
+ function computeReplacedSel(doc, changes, hint) {
4303
+ var out = [];
4304
+ var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
4305
+ for (var i = 0; i < changes.length; i++) {
4306
+ var change = changes[i];
4307
+ var from = offsetPos(change.from, oldPrev, newPrev);
4308
+ var to = offsetPos(changeEnd(change), oldPrev, newPrev);
4309
+ oldPrev = change.to;
4310
+ newPrev = to;
4311
+ if (hint == "around") {
4312
+ var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
4313
+ out[i] = new Range(inv ? to : from, inv ? from : to);
4314
+ } else {
4315
+ out[i] = new Range(from, from);
4316
+ }
4317
+ }
4318
+ return new Selection(out, doc.sel.primIndex);
4319
+ }
4320
+
4321
+ // Allow "beforeChange" event handlers to influence a change
4322
+ function filterChange(doc, change, update) {
4323
+ var obj = {
4324
+ canceled: false,
4325
+ from: change.from,
4326
+ to: change.to,
4327
+ text: change.text,
4328
+ origin: change.origin,
4329
+ cancel: function() { this.canceled = true; }
4330
+ };
4331
+ if (update) obj.update = function(from, to, text, origin) {
4332
+ if (from) this.from = clipPos(doc, from);
4333
+ if (to) this.to = clipPos(doc, to);
4334
+ if (text) this.text = text;
4335
+ if (origin !== undefined) this.origin = origin;
4336
+ };
4337
+ signal(doc, "beforeChange", doc, obj);
4338
+ if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
4339
+
4340
+ if (obj.canceled) return null;
4341
+ return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
4342
+ }
4343
+
4344
+ // Apply a change to a document, and add it to the document's
4345
+ // history, and propagating it to all linked documents.
4346
+ function makeChange(doc, change, ignoreReadOnly) {
4347
+ if (doc.cm) {
4348
+ if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);
4349
+ if (doc.cm.state.suppressEdits) return;
4350
+ }
4351
+
4352
+ if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
4353
+ change = filterChange(doc, change, true);
4354
+ if (!change) return;
4355
+ }
4356
+
4357
+ // Possibly split or suppress the update based on the presence
4358
+ // of read-only spans in its range.
4359
+ var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
4360
+ if (split) {
4361
+ for (var i = split.length - 1; i >= 0; --i)
4362
+ makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});
4363
+ } else {
4364
+ makeChangeInner(doc, change);
4365
+ }
4366
+ }
4367
+
4368
+ function makeChangeInner(doc, change) {
4369
+ if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;
4370
+ var selAfter = computeSelAfterChange(doc, change);
4371
+ addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
4372
+
4373
+ makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
4374
+ var rebased = [];
4375
+
4376
+ linkedDocs(doc, function(doc, sharedHist) {
4377
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
4378
+ rebaseHist(doc.history, change);
4379
+ rebased.push(doc.history);
4380
+ }
4381
+ makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
4382
+ });
4383
+ }
4384
+
4385
+ // Revert a change stored in a document's history.
4386
+ function makeChangeFromHistory(doc, type, allowSelectionOnly) {
4387
+ if (doc.cm && doc.cm.state.suppressEdits) return;
4388
+
4389
+ var hist = doc.history, event, selAfter = doc.sel;
4390
+ var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
4391
+
4392
+ // Verify that there is a useable event (so that ctrl-z won't
4393
+ // needlessly clear selection events)
4394
+ for (var i = 0; i < source.length; i++) {
4395
+ event = source[i];
4396
+ if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
4397
+ break;
4398
+ }
4399
+ if (i == source.length) return;
4400
+ hist.lastOrigin = hist.lastSelOrigin = null;
4401
+
4402
+ for (;;) {
4403
+ event = source.pop();
4404
+ if (event.ranges) {
4405
+ pushSelectionToHistory(event, dest);
4406
+ if (allowSelectionOnly && !event.equals(doc.sel)) {
4407
+ setSelection(doc, event, {clearRedo: false});
4408
+ return;
4409
+ }
4410
+ selAfter = event;
4411
+ }
4412
+ else break;
4413
+ }
4414
+
4415
+ // Build up a reverse change object to add to the opposite history
4416
+ // stack (redo when undoing, and vice versa).
4417
+ var antiChanges = [];
4418
+ pushSelectionToHistory(selAfter, dest);
4419
+ dest.push({changes: antiChanges, generation: hist.generation});
4420
+ hist.generation = event.generation || ++hist.maxGeneration;
4421
+
4422
+ var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
4423
+
4424
+ for (var i = event.changes.length - 1; i >= 0; --i) {
4425
+ var change = event.changes[i];
4426
+ change.origin = type;
4427
+ if (filter && !filterChange(doc, change, false)) {
4428
+ source.length = 0;
4429
+ return;
4430
+ }
4431
+
4432
+ antiChanges.push(historyChangeFromChange(doc, change));
4433
+
4434
+ var after = i ? computeSelAfterChange(doc, change) : lst(source);
4435
+ makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
4436
+ if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});
4437
+ var rebased = [];
4438
+
4439
+ // Propagate to the linked documents
4440
+ linkedDocs(doc, function(doc, sharedHist) {
4441
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
4442
+ rebaseHist(doc.history, change);
4443
+ rebased.push(doc.history);
4444
+ }
4445
+ makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
4446
+ });
4447
+ }
4448
+ }
4449
+
4450
+ // Sub-views need their line numbers shifted when text is added
4451
+ // above or below them in the parent document.
4452
+ function shiftDoc(doc, distance) {
4453
+ if (distance == 0) return;
4454
+ doc.first += distance;
4455
+ doc.sel = new Selection(map(doc.sel.ranges, function(range) {
4456
+ return new Range(Pos(range.anchor.line + distance, range.anchor.ch),
4457
+ Pos(range.head.line + distance, range.head.ch));
4458
+ }), doc.sel.primIndex);
4459
+ if (doc.cm) {
4460
+ regChange(doc.cm, doc.first, doc.first - distance, distance);
4461
+ for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
4462
+ regLineChange(doc.cm, l, "gutter");
4463
+ }
4464
+ }
4465
+
4466
+ // More lower-level change function, handling only a single document
4467
+ // (not linked ones).
4468
+ function makeChangeSingleDoc(doc, change, selAfter, spans) {
4469
+ if (doc.cm && !doc.cm.curOp)
4470
+ return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
4471
+
4472
+ if (change.to.line < doc.first) {
4473
+ shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
4474
+ return;
4475
+ }
4476
+ if (change.from.line > doc.lastLine()) return;
4477
+
4478
+ // Clip the change to the size of this doc
4479
+ if (change.from.line < doc.first) {
4480
+ var shift = change.text.length - 1 - (doc.first - change.from.line);
4481
+ shiftDoc(doc, shift);
4482
+ change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
4483
+ text: [lst(change.text)], origin: change.origin};
4484
+ }
4485
+ var last = doc.lastLine();
4486
+ if (change.to.line > last) {
4487
+ change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
4488
+ text: [change.text[0]], origin: change.origin};
4489
+ }
4490
+
4491
+ change.removed = getBetween(doc, change.from, change.to);
4492
+
4493
+ if (!selAfter) selAfter = computeSelAfterChange(doc, change);
4494
+ if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);
4495
+ else updateDoc(doc, change, spans);
4496
+ setSelectionNoUndo(doc, selAfter, sel_dontScroll);
4497
+ }
4498
+
4499
+ // Handle the interaction of a change to a document with the editor
4500
+ // that this document is part of.
4501
+ function makeChangeSingleDocInEditor(cm, change, spans) {
4502
+ var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
4503
+
4504
+ var recomputeMaxLength = false, checkWidthStart = from.line;
4505
+ if (!cm.options.lineWrapping) {
4506
+ checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
4507
+ doc.iter(checkWidthStart, to.line + 1, function(line) {
4508
+ if (line == display.maxLine) {
4509
+ recomputeMaxLength = true;
4510
+ return true;
4511
+ }
4512
+ });
4513
+ }
4514
+
4515
+ if (doc.sel.contains(change.from, change.to) > -1)
4516
+ signalCursorActivity(cm);
4517
+
4518
+ updateDoc(doc, change, spans, estimateHeight(cm));
4519
+
4520
+ if (!cm.options.lineWrapping) {
4521
+ doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
4522
+ var len = lineLength(line);
4523
+ if (len > display.maxLineLength) {
4524
+ display.maxLine = line;
4525
+ display.maxLineLength = len;
4526
+ display.maxLineChanged = true;
4527
+ recomputeMaxLength = false;
4528
+ }
4529
+ });
4530
+ if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
4531
+ }
4532
+
4533
+ // Adjust frontier, schedule worker
4534
+ doc.frontier = Math.min(doc.frontier, from.line);
4535
+ startWorker(cm, 400);
4536
+
4537
+ var lendiff = change.text.length - (to.line - from.line) - 1;
4538
+ // Remember that these lines changed, for updating the display
4539
+ if (change.full)
4540
+ regChange(cm);
4541
+ else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
4542
+ regLineChange(cm, from.line, "text");
4543
+ else
4544
+ regChange(cm, from.line, to.line + 1, lendiff);
4545
+
4546
+ var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
4547
+ if (changeHandler || changesHandler) {
4548
+ var obj = {
4549
+ from: from, to: to,
4550
+ text: change.text,
4551
+ removed: change.removed,
4552
+ origin: change.origin
4553
+ };
4554
+ if (changeHandler) signalLater(cm, "change", cm, obj);
4555
+ if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
4556
+ }
4557
+ cm.display.selForContextMenu = null;
4558
+ }
4559
+
4560
+ function replaceRange(doc, code, from, to, origin) {
4561
+ if (!to) to = from;
4562
+ if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }
4563
+ if (typeof code == "string") code = doc.splitLines(code);
4564
+ makeChange(doc, {from: from, to: to, text: code, origin: origin});
4565
+ }
4566
+
4567
+ // SCROLLING THINGS INTO VIEW
4568
+
4569
+ // If an editor sits on the top or bottom of the window, partially
4570
+ // scrolled out of view, this ensures that the cursor is visible.
4571
+ function maybeScrollWindow(cm, coords) {
4572
+ if (signalDOMEvent(cm, "scrollCursorIntoView")) return;
4573
+
4574
+ var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
4575
+ if (coords.top + box.top < 0) doScroll = true;
4576
+ else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
4577
+ if (doScroll != null && !phantom) {
4578
+ var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +
4579
+ (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +
4580
+ (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " +
4581
+ coords.left + "px; width: 2px;");
4582
+ cm.display.lineSpace.appendChild(scrollNode);
4583
+ scrollNode.scrollIntoView(doScroll);
4584
+ cm.display.lineSpace.removeChild(scrollNode);
4585
+ }
4586
+ }
4587
+
4588
+ // Scroll a given position into view (immediately), verifying that
4589
+ // it actually became visible (as line heights are accurately
4590
+ // measured, the position of something may 'drift' during drawing).
4591
+ function scrollPosIntoView(cm, pos, end, margin) {
4592
+ if (margin == null) margin = 0;
4593
+ for (var limit = 0; limit < 5; limit++) {
4594
+ var changed = false, coords = cursorCoords(cm, pos);
4595
+ var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
4596
+ var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
4597
+ Math.min(coords.top, endCoords.top) - margin,
4598
+ Math.max(coords.left, endCoords.left),
4599
+ Math.max(coords.bottom, endCoords.bottom) + margin);
4600
+ var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
4601
+ if (scrollPos.scrollTop != null) {
4602
+ setScrollTop(cm, scrollPos.scrollTop);
4603
+ if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
4604
+ }
4605
+ if (scrollPos.scrollLeft != null) {
4606
+ setScrollLeft(cm, scrollPos.scrollLeft);
4607
+ if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
4608
+ }
4609
+ if (!changed) break;
4610
+ }
4611
+ return coords;
4612
+ }
4613
+
4614
+ // Scroll a given set of coordinates into view (immediately).
4615
+ function scrollIntoView(cm, x1, y1, x2, y2) {
4616
+ var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
4617
+ if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
4618
+ if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
4619
+ }
4620
+
4621
+ // Calculate a new scroll position needed to scroll the given
4622
+ // rectangle into view. Returns an object with scrollTop and
4623
+ // scrollLeft properties. When these are undefined, the
4624
+ // vertical/horizontal position does not need to be adjusted.
4625
+ function calculateScrollPos(cm, x1, y1, x2, y2) {
4626
+ var display = cm.display, snapMargin = textHeight(cm.display);
4627
+ if (y1 < 0) y1 = 0;
4628
+ var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
4629
+ var screen = displayHeight(cm), result = {};
4630
+ if (y2 - y1 > screen) y2 = y1 + screen;
4631
+ var docBottom = cm.doc.height + paddingVert(display);
4632
+ var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
4633
+ if (y1 < screentop) {
4634
+ result.scrollTop = atTop ? 0 : y1;
4635
+ } else if (y2 > screentop + screen) {
4636
+ var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
4637
+ if (newTop != screentop) result.scrollTop = newTop;
4638
+ }
4639
+
4640
+ var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
4641
+ var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);
4642
+ var tooWide = x2 - x1 > screenw;
4643
+ if (tooWide) x2 = x1 + screenw;
4644
+ if (x1 < 10)
4645
+ result.scrollLeft = 0;
4646
+ else if (x1 < screenleft)
4647
+ result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));
4648
+ else if (x2 > screenw + screenleft - 3)
4649
+ result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;
4650
+ return result;
4651
+ }
4652
+
4653
+ // Store a relative adjustment to the scroll position in the current
4654
+ // operation (to be applied when the operation finishes).
4655
+ function addToScrollPos(cm, left, top) {
4656
+ if (left != null || top != null) resolveScrollToPos(cm);
4657
+ if (left != null)
4658
+ cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;
4659
+ if (top != null)
4660
+ cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
4661
+ }
4662
+
4663
+ // Make sure that at the end of the operation the current cursor is
4664
+ // shown.
4665
+ function ensureCursorVisible(cm) {
4666
+ resolveScrollToPos(cm);
4667
+ var cur = cm.getCursor(), from = cur, to = cur;
4668
+ if (!cm.options.lineWrapping) {
4669
+ from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;
4670
+ to = Pos(cur.line, cur.ch + 1);
4671
+ }
4672
+ cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};
4673
+ }
4674
+
4675
+ // When an operation has its scrollToPos property set, and another
4676
+ // scroll action is applied before the end of the operation, this
4677
+ // 'simulates' scrolling that position into view in a cheap way, so
4678
+ // that the effect of intermediate scroll commands is not ignored.
4679
+ function resolveScrollToPos(cm) {
4680
+ var range = cm.curOp.scrollToPos;
4681
+ if (range) {
4682
+ cm.curOp.scrollToPos = null;
4683
+ var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
4684
+ var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),
4685
+ Math.min(from.top, to.top) - range.margin,
4686
+ Math.max(from.right, to.right),
4687
+ Math.max(from.bottom, to.bottom) + range.margin);
4688
+ cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);
4689
+ }
4690
+ }
4691
+
4692
+ // API UTILITIES
4693
+
4694
+ // Indent the given line. The how parameter can be "smart",
4695
+ // "add"/null, "subtract", or "prev". When aggressive is false
4696
+ // (typically set to true for forced single-line indents), empty
4697
+ // lines are not indented, and places where the mode returns Pass
4698
+ // are left alone.
4699
+ function indentLine(cm, n, how, aggressive) {
4700
+ var doc = cm.doc, state;
4701
+ if (how == null) how = "add";
4702
+ if (how == "smart") {
4703
+ // Fall back to "prev" when the mode doesn't have an indentation
4704
+ // method.
4705
+ if (!doc.mode.indent) how = "prev";
4706
+ else state = getStateBefore(cm, n);
4707
+ }
4708
+
4709
+ var tabSize = cm.options.tabSize;
4710
+ var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
4711
+ if (line.stateAfter) line.stateAfter = null;
4712
+ var curSpaceString = line.text.match(/^\s*/)[0], indentation;
4713
+ if (!aggressive && !/\S/.test(line.text)) {
4714
+ indentation = 0;
4715
+ how = "not";
4716
+ } else if (how == "smart") {
4717
+ indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
4718
+ if (indentation == Pass || indentation > 150) {
4719
+ if (!aggressive) return;
4720
+ how = "prev";
4721
+ }
4722
+ }
4723
+ if (how == "prev") {
4724
+ if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
4725
+ else indentation = 0;
4726
+ } else if (how == "add") {
4727
+ indentation = curSpace + cm.options.indentUnit;
4728
+ } else if (how == "subtract") {
4729
+ indentation = curSpace - cm.options.indentUnit;
4730
+ } else if (typeof how == "number") {
4731
+ indentation = curSpace + how;
4732
+ }
4733
+ indentation = Math.max(0, indentation);
4734
+
4735
+ var indentString = "", pos = 0;
4736
+ if (cm.options.indentWithTabs)
4737
+ for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
4738
+ if (pos < indentation) indentString += spaceStr(indentation - pos);
4739
+
4740
+ if (indentString != curSpaceString) {
4741
+ replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
4742
+ line.stateAfter = null;
4743
+ return true;
4744
+ } else {
4745
+ // Ensure that, if the cursor was in the whitespace at the start
4746
+ // of the line, it is moved to the end of that space.
4747
+ for (var i = 0; i < doc.sel.ranges.length; i++) {
4748
+ var range = doc.sel.ranges[i];
4749
+ if (range.head.line == n && range.head.ch < curSpaceString.length) {
4750
+ var pos = Pos(n, curSpaceString.length);
4751
+ replaceOneSelection(doc, i, new Range(pos, pos));
4752
+ break;
4753
+ }
4754
+ }
4755
+ }
4756
+ }
4757
+
4758
+ // Utility for applying a change to a line by handle or number,
4759
+ // returning the number and optionally registering the line as
4760
+ // changed.
4761
+ function changeLine(doc, handle, changeType, op) {
4762
+ var no = handle, line = handle;
4763
+ if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
4764
+ else no = lineNo(handle);
4765
+ if (no == null) return null;
4766
+ if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);
4767
+ return line;
4768
+ }
4769
+
4770
+ // Helper for deleting text near the selection(s), used to implement
4771
+ // backspace, delete, and similar functionality.
4772
+ function deleteNearSelection(cm, compute) {
4773
+ var ranges = cm.doc.sel.ranges, kill = [];
4774
+ // Build up a set of ranges to kill first, merging overlapping
4775
+ // ranges.
4776
+ for (var i = 0; i < ranges.length; i++) {
4777
+ var toKill = compute(ranges[i]);
4778
+ while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
4779
+ var replaced = kill.pop();
4780
+ if (cmp(replaced.from, toKill.from) < 0) {
4781
+ toKill.from = replaced.from;
4782
+ break;
4783
+ }
4784
+ }
4785
+ kill.push(toKill);
4786
+ }
4787
+ // Next, remove those actual ranges.
4788
+ runInOp(cm, function() {
4789
+ for (var i = kill.length - 1; i >= 0; i--)
4790
+ replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");
4791
+ ensureCursorVisible(cm);
4792
+ });
4793
+ }
4794
+
4795
+ // Used for horizontal relative motion. Dir is -1 or 1 (left or
4796
+ // right), unit can be "char", "column" (like char, but doesn't
4797
+ // cross line boundaries), "word" (across next word), or "group" (to
4798
+ // the start of next group of word or non-word-non-whitespace
4799
+ // chars). The visually param controls whether, in right-to-left
4800
+ // text, direction 1 means to move towards the next index in the
4801
+ // string, or towards the character to the right of the current
4802
+ // position. The resulting position will have a hitSide=true
4803
+ // property if it reached the end of the document.
4804
+ function findPosH(doc, pos, dir, unit, visually) {
4805
+ var line = pos.line, ch = pos.ch, origDir = dir;
4806
+ var lineObj = getLine(doc, line);
4807
+ var possible = true;
4808
+ function findNextLine() {
4809
+ var l = line + dir;
4810
+ if (l < doc.first || l >= doc.first + doc.size) return (possible = false);
4811
+ line = l;
4812
+ return lineObj = getLine(doc, l);
4813
+ }
4814
+ function moveOnce(boundToLine) {
4815
+ var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
4816
+ if (next == null) {
4817
+ if (!boundToLine && findNextLine()) {
4818
+ if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
4819
+ else ch = dir < 0 ? lineObj.text.length : 0;
4820
+ } else return (possible = false);
4821
+ } else ch = next;
4822
+ return true;
4823
+ }
4824
+
4825
+ if (unit == "char") moveOnce();
4826
+ else if (unit == "column") moveOnce(true);
4827
+ else if (unit == "word" || unit == "group") {
4828
+ var sawType = null, group = unit == "group";
4829
+ var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
4830
+ for (var first = true;; first = false) {
4831
+ if (dir < 0 && !moveOnce(!first)) break;
4832
+ var cur = lineObj.text.charAt(ch) || "\n";
4833
+ var type = isWordChar(cur, helper) ? "w"
4834
+ : group && cur == "\n" ? "n"
4835
+ : !group || /\s/.test(cur) ? null
4836
+ : "p";
4837
+ if (group && !first && !type) type = "s";
4838
+ if (sawType && sawType != type) {
4839
+ if (dir < 0) {dir = 1; moveOnce();}
4840
+ break;
4841
+ }
4842
+
4843
+ if (type) sawType = type;
4844
+ if (dir > 0 && !moveOnce(!first)) break;
4845
+ }
4846
+ }
4847
+ var result = skipAtomic(doc, Pos(line, ch), origDir, true);
4848
+ if (!possible) result.hitSide = true;
4849
+ return result;
4850
+ }
4851
+
4852
+ // For relative vertical movement. Dir may be -1 or 1. Unit can be
4853
+ // "page" or "line". The resulting position will have a hitSide=true
4854
+ // property if it reached the end of the document.
4855
+ function findPosV(cm, pos, dir, unit) {
4856
+ var doc = cm.doc, x = pos.left, y;
4857
+ if (unit == "page") {
4858
+ var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
4859
+ y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
4860
+ } else if (unit == "line") {
4861
+ y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
4862
+ }
4863
+ for (;;) {
4864
+ var target = coordsChar(cm, x, y);
4865
+ if (!target.outside) break;
4866
+ if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
4867
+ y += dir * 5;
4868
+ }
4869
+ return target;
4870
+ }
4871
+
4872
+ // EDITOR METHODS
4873
+
4874
+ // The publicly visible API. Note that methodOp(f) means
4875
+ // 'wrap f in an operation, performed on its `this` parameter'.
4876
+
4877
+ // This is not the complete set of editor methods. Most of the
4878
+ // methods defined on the Doc type are also injected into
4879
+ // CodeMirror.prototype, for backwards compatibility and
4880
+ // convenience.
4881
+
4882
+ CodeMirror.prototype = {
4883
+ constructor: CodeMirror,
4884
+ focus: function(){window.focus(); this.display.input.focus();},
4885
+
4886
+ setOption: function(option, value) {
4887
+ var options = this.options, old = options[option];
4888
+ if (options[option] == value && option != "mode") return;
4889
+ options[option] = value;
4890
+ if (optionHandlers.hasOwnProperty(option))
4891
+ operation(this, optionHandlers[option])(this, value, old);
4892
+ },
4893
+
4894
+ getOption: function(option) {return this.options[option];},
4895
+ getDoc: function() {return this.doc;},
4896
+
4897
+ addKeyMap: function(map, bottom) {
4898
+ this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
4899
+ },
4900
+ removeKeyMap: function(map) {
4901
+ var maps = this.state.keyMaps;
4902
+ for (var i = 0; i < maps.length; ++i)
4903
+ if (maps[i] == map || maps[i].name == map) {
4904
+ maps.splice(i, 1);
4905
+ return true;
4906
+ }
4907
+ },
4908
+
4909
+ addOverlay: methodOp(function(spec, options) {
4910
+ var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
4911
+ if (mode.startState) throw new Error("Overlays may not be stateful.");
4912
+ this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
4913
+ this.state.modeGen++;
4914
+ regChange(this);
4915
+ }),
4916
+ removeOverlay: methodOp(function(spec) {
4917
+ var overlays = this.state.overlays;
4918
+ for (var i = 0; i < overlays.length; ++i) {
4919
+ var cur = overlays[i].modeSpec;
4920
+ if (cur == spec || typeof spec == "string" && cur.name == spec) {
4921
+ overlays.splice(i, 1);
4922
+ this.state.modeGen++;
4923
+ regChange(this);
4924
+ return;
4925
+ }
4926
+ }
4927
+ }),
4928
+
4929
+ indentLine: methodOp(function(n, dir, aggressive) {
4930
+ if (typeof dir != "string" && typeof dir != "number") {
4931
+ if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
4932
+ else dir = dir ? "add" : "subtract";
4933
+ }
4934
+ if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
4935
+ }),
4936
+ indentSelection: methodOp(function(how) {
4937
+ var ranges = this.doc.sel.ranges, end = -1;
4938
+ for (var i = 0; i < ranges.length; i++) {
4939
+ var range = ranges[i];
4940
+ if (!range.empty()) {
4941
+ var from = range.from(), to = range.to();
4942
+ var start = Math.max(end, from.line);
4943
+ end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
4944
+ for (var j = start; j < end; ++j)
4945
+ indentLine(this, j, how);
4946
+ var newRanges = this.doc.sel.ranges;
4947
+ if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
4948
+ replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);
4949
+ } else if (range.head.line > end) {
4950
+ indentLine(this, range.head.line, how, true);
4951
+ end = range.head.line;
4952
+ if (i == this.doc.sel.primIndex) ensureCursorVisible(this);
4953
+ }
4954
+ }
4955
+ }),
4956
+
4957
+ // Fetch the parser token for a given character. Useful for hacks
4958
+ // that want to inspect the mode state (say, for completion).
4959
+ getTokenAt: function(pos, precise) {
4960
+ return takeToken(this, pos, precise);
4961
+ },
4962
+
4963
+ getLineTokens: function(line, precise) {
4964
+ return takeToken(this, Pos(line), precise, true);
4965
+ },
4966
+
4967
+ getTokenTypeAt: function(pos) {
4968
+ pos = clipPos(this.doc, pos);
4969
+ var styles = getLineStyles(this, getLine(this.doc, pos.line));
4970
+ var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
4971
+ var type;
4972
+ if (ch == 0) type = styles[2];
4973
+ else for (;;) {
4974
+ var mid = (before + after) >> 1;
4975
+ if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
4976
+ else if (styles[mid * 2 + 1] < ch) before = mid + 1;
4977
+ else { type = styles[mid * 2 + 2]; break; }
4978
+ }
4979
+ var cut = type ? type.indexOf("cm-overlay ") : -1;
4980
+ return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
4981
+ },
4982
+
4983
+ getModeAt: function(pos) {
4984
+ var mode = this.doc.mode;
4985
+ if (!mode.innerMode) return mode;
4986
+ return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
4987
+ },
4988
+
4989
+ getHelper: function(pos, type) {
4990
+ return this.getHelpers(pos, type)[0];
4991
+ },
4992
+
4993
+ getHelpers: function(pos, type) {
4994
+ var found = [];
4995
+ if (!helpers.hasOwnProperty(type)) return found;
4996
+ var help = helpers[type], mode = this.getModeAt(pos);
4997
+ if (typeof mode[type] == "string") {
4998
+ if (help[mode[type]]) found.push(help[mode[type]]);
4999
+ } else if (mode[type]) {
5000
+ for (var i = 0; i < mode[type].length; i++) {
5001
+ var val = help[mode[type][i]];
5002
+ if (val) found.push(val);
5003
+ }
5004
+ } else if (mode.helperType && help[mode.helperType]) {
5005
+ found.push(help[mode.helperType]);
5006
+ } else if (help[mode.name]) {
5007
+ found.push(help[mode.name]);
5008
+ }
5009
+ for (var i = 0; i < help._global.length; i++) {
5010
+ var cur = help._global[i];
5011
+ if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
5012
+ found.push(cur.val);
5013
+ }
5014
+ return found;
5015
+ },
5016
+
5017
+ getStateAfter: function(line, precise) {
5018
+ var doc = this.doc;
5019
+ line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
5020
+ return getStateBefore(this, line + 1, precise);
5021
+ },
5022
+
5023
+ cursorCoords: function(start, mode) {
5024
+ var pos, range = this.doc.sel.primary();
5025
+ if (start == null) pos = range.head;
5026
+ else if (typeof start == "object") pos = clipPos(this.doc, start);
5027
+ else pos = start ? range.from() : range.to();
5028
+ return cursorCoords(this, pos, mode || "page");
5029
+ },
5030
+
5031
+ charCoords: function(pos, mode) {
5032
+ return charCoords(this, clipPos(this.doc, pos), mode || "page");
5033
+ },
5034
+
5035
+ coordsChar: function(coords, mode) {
5036
+ coords = fromCoordSystem(this, coords, mode || "page");
5037
+ return coordsChar(this, coords.left, coords.top);
5038
+ },
5039
+
5040
+ lineAtHeight: function(height, mode) {
5041
+ height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
5042
+ return lineAtHeight(this.doc, height + this.display.viewOffset);
5043
+ },
5044
+ heightAtLine: function(line, mode) {
5045
+ var end = false, lineObj;
5046
+ if (typeof line == "number") {
5047
+ var last = this.doc.first + this.doc.size - 1;
5048
+ if (line < this.doc.first) line = this.doc.first;
5049
+ else if (line > last) { line = last; end = true; }
5050
+ lineObj = getLine(this.doc, line);
5051
+ } else {
5052
+ lineObj = line;
5053
+ }
5054
+ return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +
5055
+ (end ? this.doc.height - heightAtLine(lineObj) : 0);
5056
+ },
5057
+
5058
+ defaultTextHeight: function() { return textHeight(this.display); },
5059
+ defaultCharWidth: function() { return charWidth(this.display); },
5060
+
5061
+ setGutterMarker: methodOp(function(line, gutterID, value) {
5062
+ return changeLine(this.doc, line, "gutter", function(line) {
5063
+ var markers = line.gutterMarkers || (line.gutterMarkers = {});
5064
+ markers[gutterID] = value;
5065
+ if (!value && isEmpty(markers)) line.gutterMarkers = null;
5066
+ return true;
5067
+ });
5068
+ }),
5069
+
5070
+ clearGutter: methodOp(function(gutterID) {
5071
+ var cm = this, doc = cm.doc, i = doc.first;
5072
+ doc.iter(function(line) {
5073
+ if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
5074
+ line.gutterMarkers[gutterID] = null;
5075
+ regLineChange(cm, i, "gutter");
5076
+ if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
5077
+ }
5078
+ ++i;
5079
+ });
5080
+ }),
5081
+
5082
+ lineInfo: function(line) {
5083
+ if (typeof line == "number") {
5084
+ if (!isLine(this.doc, line)) return null;
5085
+ var n = line;
5086
+ line = getLine(this.doc, line);
5087
+ if (!line) return null;
5088
+ } else {
5089
+ var n = lineNo(line);
5090
+ if (n == null) return null;
5091
+ }
5092
+ return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
5093
+ textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
5094
+ widgets: line.widgets};
5095
+ },
5096
+
5097
+ getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},
5098
+
5099
+ addWidget: function(pos, node, scroll, vert, horiz) {
5100
+ var display = this.display;
5101
+ pos = cursorCoords(this, clipPos(this.doc, pos));
5102
+ var top = pos.bottom, left = pos.left;
5103
+ node.style.position = "absolute";
5104
+ node.setAttribute("cm-ignore-events", "true");
5105
+ this.display.input.setUneditable(node);
5106
+ display.sizer.appendChild(node);
5107
+ if (vert == "over") {
5108
+ top = pos.top;
5109
+ } else if (vert == "above" || vert == "near") {
5110
+ var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
5111
+ hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
5112
+ // Default to positioning above (if specified and possible); otherwise default to positioning below
5113
+ if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
5114
+ top = pos.top - node.offsetHeight;
5115
+ else if (pos.bottom + node.offsetHeight <= vspace)
5116
+ top = pos.bottom;
5117
+ if (left + node.offsetWidth > hspace)
5118
+ left = hspace - node.offsetWidth;
5119
+ }
5120
+ node.style.top = top + "px";
5121
+ node.style.left = node.style.right = "";
5122
+ if (horiz == "right") {
5123
+ left = display.sizer.clientWidth - node.offsetWidth;
5124
+ node.style.right = "0px";
5125
+ } else {
5126
+ if (horiz == "left") left = 0;
5127
+ else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
5128
+ node.style.left = left + "px";
5129
+ }
5130
+ if (scroll)
5131
+ scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
5132
+ },
5133
+
5134
+ triggerOnKeyDown: methodOp(onKeyDown),
5135
+ triggerOnKeyPress: methodOp(onKeyPress),
5136
+ triggerOnKeyUp: onKeyUp,
5137
+
5138
+ execCommand: function(cmd) {
5139
+ if (commands.hasOwnProperty(cmd))
5140
+ return commands[cmd].call(null, this);
5141
+ },
5142
+
5143
+ triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),
5144
+
5145
+ findPosH: function(from, amount, unit, visually) {
5146
+ var dir = 1;
5147
+ if (amount < 0) { dir = -1; amount = -amount; }
5148
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
5149
+ cur = findPosH(this.doc, cur, dir, unit, visually);
5150
+ if (cur.hitSide) break;
5151
+ }
5152
+ return cur;
5153
+ },
5154
+
5155
+ moveH: methodOp(function(dir, unit) {
5156
+ var cm = this;
5157
+ cm.extendSelectionsBy(function(range) {
5158
+ if (cm.display.shift || cm.doc.extend || range.empty())
5159
+ return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);
5160
+ else
5161
+ return dir < 0 ? range.from() : range.to();
5162
+ }, sel_move);
5163
+ }),
5164
+
5165
+ deleteH: methodOp(function(dir, unit) {
5166
+ var sel = this.doc.sel, doc = this.doc;
5167
+ if (sel.somethingSelected())
5168
+ doc.replaceSelection("", null, "+delete");
5169
+ else
5170
+ deleteNearSelection(this, function(range) {
5171
+ var other = findPosH(doc, range.head, dir, unit, false);
5172
+ return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};
5173
+ });
5174
+ }),
5175
+
5176
+ findPosV: function(from, amount, unit, goalColumn) {
5177
+ var dir = 1, x = goalColumn;
5178
+ if (amount < 0) { dir = -1; amount = -amount; }
5179
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
5180
+ var coords = cursorCoords(this, cur, "div");
5181
+ if (x == null) x = coords.left;
5182
+ else coords.left = x;
5183
+ cur = findPosV(this, coords, dir, unit);
5184
+ if (cur.hitSide) break;
5185
+ }
5186
+ return cur;
5187
+ },
5188
+
5189
+ moveV: methodOp(function(dir, unit) {
5190
+ var cm = this, doc = this.doc, goals = [];
5191
+ var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();
5192
+ doc.extendSelectionsBy(function(range) {
5193
+ if (collapse)
5194
+ return dir < 0 ? range.from() : range.to();
5195
+ var headPos = cursorCoords(cm, range.head, "div");
5196
+ if (range.goalColumn != null) headPos.left = range.goalColumn;
5197
+ goals.push(headPos.left);
5198
+ var pos = findPosV(cm, headPos, dir, unit);
5199
+ if (unit == "page" && range == doc.sel.primary())
5200
+ addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);
5201
+ return pos;
5202
+ }, sel_move);
5203
+ if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)
5204
+ doc.sel.ranges[i].goalColumn = goals[i];
5205
+ }),
5206
+
5207
+ // Find the word at the given position (as returned by coordsChar).
5208
+ findWordAt: function(pos) {
5209
+ var doc = this.doc, line = getLine(doc, pos.line).text;
5210
+ var start = pos.ch, end = pos.ch;
5211
+ if (line) {
5212
+ var helper = this.getHelper(pos, "wordChars");
5213
+ if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
5214
+ var startChar = line.charAt(start);
5215
+ var check = isWordChar(startChar, helper)
5216
+ ? function(ch) { return isWordChar(ch, helper); }
5217
+ : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
5218
+ : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
5219
+ while (start > 0 && check(line.charAt(start - 1))) --start;
5220
+ while (end < line.length && check(line.charAt(end))) ++end;
5221
+ }
5222
+ return new Range(Pos(pos.line, start), Pos(pos.line, end));
5223
+ },
5224
+
5225
+ toggleOverwrite: function(value) {
5226
+ if (value != null && value == this.state.overwrite) return;
5227
+ if (this.state.overwrite = !this.state.overwrite)
5228
+ addClass(this.display.cursorDiv, "CodeMirror-overwrite");
5229
+ else
5230
+ rmClass(this.display.cursorDiv, "CodeMirror-overwrite");
5231
+
5232
+ signal(this, "overwriteToggle", this, this.state.overwrite);
5233
+ },
5234
+ hasFocus: function() { return this.display.input.getField() == activeElt(); },
5235
+
5236
+ scrollTo: methodOp(function(x, y) {
5237
+ if (x != null || y != null) resolveScrollToPos(this);
5238
+ if (x != null) this.curOp.scrollLeft = x;
5239
+ if (y != null) this.curOp.scrollTop = y;
5240
+ }),
5241
+ getScrollInfo: function() {
5242
+ var scroller = this.display.scroller;
5243
+ return {left: scroller.scrollLeft, top: scroller.scrollTop,
5244
+ height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
5245
+ width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
5246
+ clientHeight: displayHeight(this), clientWidth: displayWidth(this)};
5247
+ },
5248
+
5249
+ scrollIntoView: methodOp(function(range, margin) {
5250
+ if (range == null) {
5251
+ range = {from: this.doc.sel.primary().head, to: null};
5252
+ if (margin == null) margin = this.options.cursorScrollMargin;
5253
+ } else if (typeof range == "number") {
5254
+ range = {from: Pos(range, 0), to: null};
5255
+ } else if (range.from == null) {
5256
+ range = {from: range, to: null};
5257
+ }
5258
+ if (!range.to) range.to = range.from;
5259
+ range.margin = margin || 0;
5260
+
5261
+ if (range.from.line != null) {
5262
+ resolveScrollToPos(this);
5263
+ this.curOp.scrollToPos = range;
5264
+ } else {
5265
+ var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),
5266
+ Math.min(range.from.top, range.to.top) - range.margin,
5267
+ Math.max(range.from.right, range.to.right),
5268
+ Math.max(range.from.bottom, range.to.bottom) + range.margin);
5269
+ this.scrollTo(sPos.scrollLeft, sPos.scrollTop);
5270
+ }
5271
+ }),
5272
+
5273
+ setSize: methodOp(function(width, height) {
5274
+ var cm = this;
5275
+ function interpret(val) {
5276
+ return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
5277
+ }
5278
+ if (width != null) cm.display.wrapper.style.width = interpret(width);
5279
+ if (height != null) cm.display.wrapper.style.height = interpret(height);
5280
+ if (cm.options.lineWrapping) clearLineMeasurementCache(this);
5281
+ var lineNo = cm.display.viewFrom;
5282
+ cm.doc.iter(lineNo, cm.display.viewTo, function(line) {
5283
+ if (line.widgets) for (var i = 0; i < line.widgets.length; i++)
5284
+ if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }
5285
+ ++lineNo;
5286
+ });
5287
+ cm.curOp.forceUpdate = true;
5288
+ signal(cm, "refresh", this);
5289
+ }),
5290
+
5291
+ operation: function(f){return runInOp(this, f);},
5292
+
5293
+ refresh: methodOp(function() {
5294
+ var oldHeight = this.display.cachedTextHeight;
5295
+ regChange(this);
5296
+ this.curOp.forceUpdate = true;
5297
+ clearCaches(this);
5298
+ this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
5299
+ updateGutterSpace(this);
5300
+ if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
5301
+ estimateLineHeights(this);
5302
+ signal(this, "refresh", this);
5303
+ }),
5304
+
5305
+ swapDoc: methodOp(function(doc) {
5306
+ var old = this.doc;
5307
+ old.cm = null;
5308
+ attachDoc(this, doc);
5309
+ clearCaches(this);
5310
+ this.display.input.reset();
5311
+ this.scrollTo(doc.scrollLeft, doc.scrollTop);
5312
+ this.curOp.forceScroll = true;
5313
+ signalLater(this, "swapDoc", this, old);
5314
+ return old;
5315
+ }),
5316
+
5317
+ getInputField: function(){return this.display.input.getField();},
5318
+ getWrapperElement: function(){return this.display.wrapper;},
5319
+ getScrollerElement: function(){return this.display.scroller;},
5320
+ getGutterElement: function(){return this.display.gutters;}
5321
+ };
5322
+ eventMixin(CodeMirror);
5323
+
5324
+ // OPTION DEFAULTS
5325
+
5326
+ // The default configuration options.
5327
+ var defaults = CodeMirror.defaults = {};
5328
+ // Functions to run when options are changed.
5329
+ var optionHandlers = CodeMirror.optionHandlers = {};
5330
+
5331
+ function option(name, deflt, handle, notOnInit) {
5332
+ CodeMirror.defaults[name] = deflt;
5333
+ if (handle) optionHandlers[name] =
5334
+ notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
5335
+ }
5336
+
5337
+ // Passed to option handlers when there is no old value.
5338
+ var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
5339
+
5340
+ // These two are, on init, called from the constructor because they
5341
+ // have to be initialized before the editor can start at all.
5342
+ option("value", "", function(cm, val) {
5343
+ cm.setValue(val);
5344
+ }, true);
5345
+ option("mode", null, function(cm, val) {
5346
+ cm.doc.modeOption = val;
5347
+ loadMode(cm);
5348
+ }, true);
5349
+
5350
+ option("indentUnit", 2, loadMode, true);
5351
+ option("indentWithTabs", false);
5352
+ option("smartIndent", true);
5353
+ option("tabSize", 4, function(cm) {
5354
+ resetModeState(cm);
5355
+ clearCaches(cm);
5356
+ regChange(cm);
5357
+ }, true);
5358
+ option("lineSeparator", null, function(cm, val) {
5359
+ cm.doc.lineSep = val;
5360
+ if (!val) return;
5361
+ var newBreaks = [], lineNo = cm.doc.first;
5362
+ cm.doc.iter(function(line) {
5363
+ for (var pos = 0;;) {
5364
+ var found = line.text.indexOf(val, pos);
5365
+ if (found == -1) break;
5366
+ pos = found + val.length;
5367
+ newBreaks.push(Pos(lineNo, found));
5368
+ }
5369
+ lineNo++;
5370
+ });
5371
+ for (var i = newBreaks.length - 1; i >= 0; i--)
5372
+ replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
5373
+ });
5374
+ option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
5375
+ cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
5376
+ if (old != CodeMirror.Init) cm.refresh();
5377
+ });
5378
+ option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);
5379
+ option("electricChars", true);
5380
+ option("inputStyle", mobile ? "contenteditable" : "textarea", function() {
5381
+ throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME
5382
+ }, true);
5383
+ option("rtlMoveVisually", !windows);
5384
+ option("wholeLineUpdateBefore", true);
5385
+
5386
+ option("theme", "default", function(cm) {
5387
+ themeChanged(cm);
5388
+ guttersChanged(cm);
5389
+ }, true);
5390
+ option("keyMap", "default", function(cm, val, old) {
5391
+ var next = getKeyMap(val);
5392
+ var prev = old != CodeMirror.Init && getKeyMap(old);
5393
+ if (prev && prev.detach) prev.detach(cm, next);
5394
+ if (next.attach) next.attach(cm, prev || null);
5395
+ });
5396
+ option("extraKeys", null);
5397
+
5398
+ option("lineWrapping", false, wrappingChanged, true);
5399
+ option("gutters", [], function(cm) {
5400
+ setGuttersForLineNumbers(cm.options);
5401
+ guttersChanged(cm);
5402
+ }, true);
5403
+ option("fixedGutter", true, function(cm, val) {
5404
+ cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
5405
+ cm.refresh();
5406
+ }, true);
5407
+ option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true);
5408
+ option("scrollbarStyle", "native", function(cm) {
5409
+ initScrollbars(cm);
5410
+ updateScrollbars(cm);
5411
+ cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
5412
+ cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
5413
+ }, true);
5414
+ option("lineNumbers", false, function(cm) {
5415
+ setGuttersForLineNumbers(cm.options);
5416
+ guttersChanged(cm);
5417
+ }, true);
5418
+ option("firstLineNumber", 1, guttersChanged, true);
5419
+ option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
5420
+ option("showCursorWhenSelecting", false, updateSelection, true);
5421
+
5422
+ option("resetSelectionOnContextMenu", true);
5423
+ option("lineWiseCopyCut", true);
5424
+
5425
+ option("readOnly", false, function(cm, val) {
5426
+ if (val == "nocursor") {
5427
+ onBlur(cm);
5428
+ cm.display.input.blur();
5429
+ cm.display.disabled = true;
5430
+ } else {
5431
+ cm.display.disabled = false;
5432
+ }
5433
+ cm.display.input.readOnlyChanged(val)
5434
+ });
5435
+ option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true);
5436
+ option("dragDrop", true, dragDropChanged);
5437
+ option("allowDropFileTypes", null);
5438
+
5439
+ option("cursorBlinkRate", 530);
5440
+ option("cursorScrollMargin", 0);
5441
+ option("cursorHeight", 1, updateSelection, true);
5442
+ option("singleCursorHeightPerLine", true, updateSelection, true);
5443
+ option("workTime", 100);
5444
+ option("workDelay", 100);
5445
+ option("flattenSpans", true, resetModeState, true);
5446
+ option("addModeClass", false, resetModeState, true);
5447
+ option("pollInterval", 100);
5448
+ option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});
5449
+ option("historyEventDelay", 1250);
5450
+ option("viewportMargin", 10, function(cm){cm.refresh();}, true);
5451
+ option("maxHighlightLength", 10000, resetModeState, true);
5452
+ option("moveInputWithCursor", true, function(cm, val) {
5453
+ if (!val) cm.display.input.resetPosition();
5454
+ });
5455
+
5456
+ option("tabindex", null, function(cm, val) {
5457
+ cm.display.input.getField().tabIndex = val || "";
5458
+ });
5459
+ option("autofocus", null);
5460
+
5461
+ // MODE DEFINITION AND QUERYING
5462
+
5463
+ // Known modes, by name and by MIME
5464
+ var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
5465
+
5466
+ // Extra arguments are stored as the mode's dependencies, which is
5467
+ // used by (legacy) mechanisms like loadmode.js to automatically
5468
+ // load a mode. (Preferred mechanism is the require/define calls.)
5469
+ CodeMirror.defineMode = function(name, mode) {
5470
+ if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
5471
+ if (arguments.length > 2)
5472
+ mode.dependencies = Array.prototype.slice.call(arguments, 2);
5473
+ modes[name] = mode;
5474
+ };
5475
+
5476
+ CodeMirror.defineMIME = function(mime, spec) {
5477
+ mimeModes[mime] = spec;
5478
+ };
5479
+
5480
+ // Given a MIME type, a {name, ...options} config object, or a name
5481
+ // string, return a mode config object.
5482
+ CodeMirror.resolveMode = function(spec) {
5483
+ if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
5484
+ spec = mimeModes[spec];
5485
+ } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
5486
+ var found = mimeModes[spec.name];
5487
+ if (typeof found == "string") found = {name: found};
5488
+ spec = createObj(found, spec);
5489
+ spec.name = found.name;
5490
+ } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
5491
+ return CodeMirror.resolveMode("application/xml");
5492
+ }
5493
+ if (typeof spec == "string") return {name: spec};
5494
+ else return spec || {name: "null"};
5495
+ };
5496
+
5497
+ // Given a mode spec (anything that resolveMode accepts), find and
5498
+ // initialize an actual mode object.
5499
+ CodeMirror.getMode = function(options, spec) {
5500
+ var spec = CodeMirror.resolveMode(spec);
5501
+ var mfactory = modes[spec.name];
5502
+ if (!mfactory) return CodeMirror.getMode(options, "text/plain");
5503
+ var modeObj = mfactory(options, spec);
5504
+ if (modeExtensions.hasOwnProperty(spec.name)) {
5505
+ var exts = modeExtensions[spec.name];
5506
+ for (var prop in exts) {
5507
+ if (!exts.hasOwnProperty(prop)) continue;
5508
+ if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
5509
+ modeObj[prop] = exts[prop];
5510
+ }
5511
+ }
5512
+ modeObj.name = spec.name;
5513
+ if (spec.helperType) modeObj.helperType = spec.helperType;
5514
+ if (spec.modeProps) for (var prop in spec.modeProps)
5515
+ modeObj[prop] = spec.modeProps[prop];
5516
+
5517
+ return modeObj;
5518
+ };
5519
+
5520
+ // Minimal default mode.
5521
+ CodeMirror.defineMode("null", function() {
5522
+ return {token: function(stream) {stream.skipToEnd();}};
5523
+ });
5524
+ CodeMirror.defineMIME("text/plain", "null");
5525
+
5526
+ // This can be used to attach properties to mode objects from
5527
+ // outside the actual mode definition.
5528
+ var modeExtensions = CodeMirror.modeExtensions = {};
5529
+ CodeMirror.extendMode = function(mode, properties) {
5530
+ var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
5531
+ copyObj(properties, exts);
5532
+ };
5533
+
5534
+ // EXTENSIONS
5535
+
5536
+ CodeMirror.defineExtension = function(name, func) {
5537
+ CodeMirror.prototype[name] = func;
5538
+ };
5539
+ CodeMirror.defineDocExtension = function(name, func) {
5540
+ Doc.prototype[name] = func;
5541
+ };
5542
+ CodeMirror.defineOption = option;
5543
+
5544
+ var initHooks = [];
5545
+ CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
5546
+
5547
+ var helpers = CodeMirror.helpers = {};
5548
+ CodeMirror.registerHelper = function(type, name, value) {
5549
+ if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};
5550
+ helpers[type][name] = value;
5551
+ };
5552
+ CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
5553
+ CodeMirror.registerHelper(type, name, value);
5554
+ helpers[type]._global.push({pred: predicate, val: value});
5555
+ };
5556
+
5557
+ // MODE STATE HANDLING
5558
+
5559
+ // Utility functions for working with state. Exported because nested
5560
+ // modes need to do this for their inner modes.
5561
+
5562
+ var copyState = CodeMirror.copyState = function(mode, state) {
5563
+ if (state === true) return state;
5564
+ if (mode.copyState) return mode.copyState(state);
5565
+ var nstate = {};
5566
+ for (var n in state) {
5567
+ var val = state[n];
5568
+ if (val instanceof Array) val = val.concat([]);
5569
+ nstate[n] = val;
5570
+ }
5571
+ return nstate;
5572
+ };
5573
+
5574
+ var startState = CodeMirror.startState = function(mode, a1, a2) {
5575
+ return mode.startState ? mode.startState(a1, a2) : true;
5576
+ };
5577
+
5578
+ // Given a mode and a state (for that mode), find the inner mode and
5579
+ // state at the position that the state refers to.
5580
+ CodeMirror.innerMode = function(mode, state) {
5581
+ while (mode.innerMode) {
5582
+ var info = mode.innerMode(state);
5583
+ if (!info || info.mode == mode) break;
5584
+ state = info.state;
5585
+ mode = info.mode;
5586
+ }
5587
+ return info || {mode: mode, state: state};
5588
+ };
5589
+
5590
+ // STANDARD COMMANDS
5591
+
5592
+ // Commands are parameter-less actions that can be performed on an
5593
+ // editor, mostly used for keybindings.
5594
+ var commands = CodeMirror.commands = {
5595
+ selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},
5596
+ singleSelection: function(cm) {
5597
+ cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);
5598
+ },
5599
+ killLine: function(cm) {
5600
+ deleteNearSelection(cm, function(range) {
5601
+ if (range.empty()) {
5602
+ var len = getLine(cm.doc, range.head.line).text.length;
5603
+ if (range.head.ch == len && range.head.line < cm.lastLine())
5604
+ return {from: range.head, to: Pos(range.head.line + 1, 0)};
5605
+ else
5606
+ return {from: range.head, to: Pos(range.head.line, len)};
5607
+ } else {
5608
+ return {from: range.from(), to: range.to()};
5609
+ }
5610
+ });
5611
+ },
5612
+ deleteLine: function(cm) {
5613
+ deleteNearSelection(cm, function(range) {
5614
+ return {from: Pos(range.from().line, 0),
5615
+ to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};
5616
+ });
5617
+ },
5618
+ delLineLeft: function(cm) {
5619
+ deleteNearSelection(cm, function(range) {
5620
+ return {from: Pos(range.from().line, 0), to: range.from()};
5621
+ });
5622
+ },
5623
+ delWrappedLineLeft: function(cm) {
5624
+ deleteNearSelection(cm, function(range) {
5625
+ var top = cm.charCoords(range.head, "div").top + 5;
5626
+ var leftPos = cm.coordsChar({left: 0, top: top}, "div");
5627
+ return {from: leftPos, to: range.from()};
5628
+ });
5629
+ },
5630
+ delWrappedLineRight: function(cm) {
5631
+ deleteNearSelection(cm, function(range) {
5632
+ var top = cm.charCoords(range.head, "div").top + 5;
5633
+ var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
5634
+ return {from: range.from(), to: rightPos };
5635
+ });
5636
+ },
5637
+ undo: function(cm) {cm.undo();},
5638
+ redo: function(cm) {cm.redo();},
5639
+ undoSelection: function(cm) {cm.undoSelection();},
5640
+ redoSelection: function(cm) {cm.redoSelection();},
5641
+ goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
5642
+ goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
5643
+ goLineStart: function(cm) {
5644
+ cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },
5645
+ {origin: "+move", bias: 1});
5646
+ },
5647
+ goLineStartSmart: function(cm) {
5648
+ cm.extendSelectionsBy(function(range) {
5649
+ return lineStartSmart(cm, range.head);
5650
+ }, {origin: "+move", bias: 1});
5651
+ },
5652
+ goLineEnd: function(cm) {
5653
+ cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },
5654
+ {origin: "+move", bias: -1});
5655
+ },
5656
+ goLineRight: function(cm) {
5657
+ cm.extendSelectionsBy(function(range) {
5658
+ var top = cm.charCoords(range.head, "div").top + 5;
5659
+ return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
5660
+ }, sel_move);
5661
+ },
5662
+ goLineLeft: function(cm) {
5663
+ cm.extendSelectionsBy(function(range) {
5664
+ var top = cm.charCoords(range.head, "div").top + 5;
5665
+ return cm.coordsChar({left: 0, top: top}, "div");
5666
+ }, sel_move);
5667
+ },
5668
+ goLineLeftSmart: function(cm) {
5669
+ cm.extendSelectionsBy(function(range) {
5670
+ var top = cm.charCoords(range.head, "div").top + 5;
5671
+ var pos = cm.coordsChar({left: 0, top: top}, "div");
5672
+ if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);
5673
+ return pos;
5674
+ }, sel_move);
5675
+ },
5676
+ goLineUp: function(cm) {cm.moveV(-1, "line");},
5677
+ goLineDown: function(cm) {cm.moveV(1, "line");},
5678
+ goPageUp: function(cm) {cm.moveV(-1, "page");},
5679
+ goPageDown: function(cm) {cm.moveV(1, "page");},
5680
+ goCharLeft: function(cm) {cm.moveH(-1, "char");},
5681
+ goCharRight: function(cm) {cm.moveH(1, "char");},
5682
+ goColumnLeft: function(cm) {cm.moveH(-1, "column");},
5683
+ goColumnRight: function(cm) {cm.moveH(1, "column");},
5684
+ goWordLeft: function(cm) {cm.moveH(-1, "word");},
5685
+ goGroupRight: function(cm) {cm.moveH(1, "group");},
5686
+ goGroupLeft: function(cm) {cm.moveH(-1, "group");},
5687
+ goWordRight: function(cm) {cm.moveH(1, "word");},
5688
+ delCharBefore: function(cm) {cm.deleteH(-1, "char");},
5689
+ delCharAfter: function(cm) {cm.deleteH(1, "char");},
5690
+ delWordBefore: function(cm) {cm.deleteH(-1, "word");},
5691
+ delWordAfter: function(cm) {cm.deleteH(1, "word");},
5692
+ delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
5693
+ delGroupAfter: function(cm) {cm.deleteH(1, "group");},
5694
+ indentAuto: function(cm) {cm.indentSelection("smart");},
5695
+ indentMore: function(cm) {cm.indentSelection("add");},
5696
+ indentLess: function(cm) {cm.indentSelection("subtract");},
5697
+ insertTab: function(cm) {cm.replaceSelection("\t");},
5698
+ insertSoftTab: function(cm) {
5699
+ var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
5700
+ for (var i = 0; i < ranges.length; i++) {
5701
+ var pos = ranges[i].from();
5702
+ var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
5703
+ spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));
5704
+ }
5705
+ cm.replaceSelections(spaces);
5706
+ },
5707
+ defaultTab: function(cm) {
5708
+ if (cm.somethingSelected()) cm.indentSelection("add");
5709
+ else cm.execCommand("insertTab");
5710
+ },
5711
+ transposeChars: function(cm) {
5712
+ runInOp(cm, function() {
5713
+ var ranges = cm.listSelections(), newSel = [];
5714
+ for (var i = 0; i < ranges.length; i++) {
5715
+ var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
5716
+ if (line) {
5717
+ if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);
5718
+ if (cur.ch > 0) {
5719
+ cur = new Pos(cur.line, cur.ch + 1);
5720
+ cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
5721
+ Pos(cur.line, cur.ch - 2), cur, "+transpose");
5722
+ } else if (cur.line > cm.doc.first) {
5723
+ var prev = getLine(cm.doc, cur.line - 1).text;
5724
+ if (prev)
5725
+ cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
5726
+ prev.charAt(prev.length - 1),
5727
+ Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");
5728
+ }
5729
+ }
5730
+ newSel.push(new Range(cur, cur));
5731
+ }
5732
+ cm.setSelections(newSel);
5733
+ });
5734
+ },
5735
+ newlineAndIndent: function(cm) {
5736
+ runInOp(cm, function() {
5737
+ var len = cm.listSelections().length;
5738
+ for (var i = 0; i < len; i++) {
5739
+ var range = cm.listSelections()[i];
5740
+ cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, "+input");
5741
+ cm.indentLine(range.from().line + 1, null, true);
5742
+ }
5743
+ ensureCursorVisible(cm);
5744
+ });
5745
+ },
5746
+ toggleOverwrite: function(cm) {cm.toggleOverwrite();}
5747
+ };
5748
+
5749
+
5750
+ // STANDARD KEYMAPS
5751
+
5752
+ var keyMap = CodeMirror.keyMap = {};
5753
+
5754
+ keyMap.basic = {
5755
+ "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
5756
+ "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
5757
+ "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
5758
+ "Tab": "defaultTab", "Shift-Tab": "indentAuto",
5759
+ "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
5760
+ "Esc": "singleSelection"
5761
+ };
5762
+ // Note that the save and find-related commands aren't defined by
5763
+ // default. User code or addons can define them. Unknown commands
5764
+ // are simply ignored.
5765
+ keyMap.pcDefault = {
5766
+ "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
5767
+ "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
5768
+ "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
5769
+ "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
5770
+ "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
5771
+ "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
5772
+ "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
5773
+ fallthrough: "basic"
5774
+ };
5775
+ // Very basic readline/emacs-style bindings, which are standard on Mac.
5776
+ keyMap.emacsy = {
5777
+ "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
5778
+ "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
5779
+ "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
5780
+ "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
5781
+ };
5782
+ keyMap.macDefault = {
5783
+ "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
5784
+ "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
5785
+ "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
5786
+ "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
5787
+ "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
5788
+ "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
5789
+ "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
5790
+ fallthrough: ["basic", "emacsy"]
5791
+ };
5792
+ keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
5793
+
5794
+ // KEYMAP DISPATCH
5795
+
5796
+ function normalizeKeyName(name) {
5797
+ var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];
5798
+ var alt, ctrl, shift, cmd;
5799
+ for (var i = 0; i < parts.length - 1; i++) {
5800
+ var mod = parts[i];
5801
+ if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;
5802
+ else if (/^a(lt)?$/i.test(mod)) alt = true;
5803
+ else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;
5804
+ else if (/^s(hift)$/i.test(mod)) shift = true;
5805
+ else throw new Error("Unrecognized modifier name: " + mod);
5806
+ }
5807
+ if (alt) name = "Alt-" + name;
5808
+ if (ctrl) name = "Ctrl-" + name;
5809
+ if (cmd) name = "Cmd-" + name;
5810
+ if (shift) name = "Shift-" + name;
5811
+ return name;
5812
+ }
5813
+
5814
+ // This is a kludge to keep keymaps mostly working as raw objects
5815
+ // (backwards compatibility) while at the same time support features
5816
+ // like normalization and multi-stroke key bindings. It compiles a
5817
+ // new normalized keymap, and then updates the old object to reflect
5818
+ // this.
5819
+ CodeMirror.normalizeKeyMap = function(keymap) {
5820
+ var copy = {};
5821
+ for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {
5822
+ var value = keymap[keyname];
5823
+ if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;
5824
+ if (value == "...") { delete keymap[keyname]; continue; }
5825
+
5826
+ var keys = map(keyname.split(" "), normalizeKeyName);
5827
+ for (var i = 0; i < keys.length; i++) {
5828
+ var val, name;
5829
+ if (i == keys.length - 1) {
5830
+ name = keys.join(" ");
5831
+ val = value;
5832
+ } else {
5833
+ name = keys.slice(0, i + 1).join(" ");
5834
+ val = "...";
5835
+ }
5836
+ var prev = copy[name];
5837
+ if (!prev) copy[name] = val;
5838
+ else if (prev != val) throw new Error("Inconsistent bindings for " + name);
5839
+ }
5840
+ delete keymap[keyname];
5841
+ }
5842
+ for (var prop in copy) keymap[prop] = copy[prop];
5843
+ return keymap;
5844
+ };
5845
+
5846
+ var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {
5847
+ map = getKeyMap(map);
5848
+ var found = map.call ? map.call(key, context) : map[key];
5849
+ if (found === false) return "nothing";
5850
+ if (found === "...") return "multi";
5851
+ if (found != null && handle(found)) return "handled";
5852
+
5853
+ if (map.fallthrough) {
5854
+ if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
5855
+ return lookupKey(key, map.fallthrough, handle, context);
5856
+ for (var i = 0; i < map.fallthrough.length; i++) {
5857
+ var result = lookupKey(key, map.fallthrough[i], handle, context);
5858
+ if (result) return result;
5859
+ }
5860
+ }
5861
+ };
5862
+
5863
+ // Modifier key presses don't count as 'real' key presses for the
5864
+ // purpose of keymap fallthrough.
5865
+ var isModifierKey = CodeMirror.isModifierKey = function(value) {
5866
+ var name = typeof value == "string" ? value : keyNames[value.keyCode];
5867
+ return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
5868
+ };
5869
+
5870
+ // Look up the name of a key as indicated by an event object.
5871
+ var keyName = CodeMirror.keyName = function(event, noShift) {
5872
+ if (presto && event.keyCode == 34 && event["char"]) return false;
5873
+ var base = keyNames[event.keyCode], name = base;
5874
+ if (name == null || event.altGraphKey) return false;
5875
+ if (event.altKey && base != "Alt") name = "Alt-" + name;
5876
+ if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name;
5877
+ if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name;
5878
+ if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name;
5879
+ return name;
5880
+ };
5881
+
5882
+ function getKeyMap(val) {
5883
+ return typeof val == "string" ? keyMap[val] : val;
5884
+ }
5885
+
5886
+ // FROMTEXTAREA
5887
+
5888
+ CodeMirror.fromTextArea = function(textarea, options) {
5889
+ options = options ? copyObj(options) : {};
5890
+ options.value = textarea.value;
5891
+ if (!options.tabindex && textarea.tabIndex)
5892
+ options.tabindex = textarea.tabIndex;
5893
+ if (!options.placeholder && textarea.placeholder)
5894
+ options.placeholder = textarea.placeholder;
5895
+ // Set autofocus to true if this textarea is focused, or if it has
5896
+ // autofocus and no other element is focused.
5897
+ if (options.autofocus == null) {
5898
+ var hasFocus = activeElt();
5899
+ options.autofocus = hasFocus == textarea ||
5900
+ textarea.getAttribute("autofocus") != null && hasFocus == document.body;
5901
+ }
5902
+
5903
+ function save() {textarea.value = cm.getValue();}
5904
+ if (textarea.form) {
5905
+ on(textarea.form, "submit", save);
5906
+ // Deplorable hack to make the submit method do the right thing.
5907
+ if (!options.leaveSubmitMethodAlone) {
5908
+ var form = textarea.form, realSubmit = form.submit;
5909
+ try {
5910
+ var wrappedSubmit = form.submit = function() {
5911
+ save();
5912
+ form.submit = realSubmit;
5913
+ form.submit();
5914
+ form.submit = wrappedSubmit;
5915
+ };
5916
+ } catch(e) {}
5917
+ }
5918
+ }
5919
+
5920
+ options.finishInit = function(cm) {
5921
+ cm.save = save;
5922
+ cm.getTextArea = function() { return textarea; };
5923
+ cm.toTextArea = function() {
5924
+ cm.toTextArea = isNaN; // Prevent this from being ran twice
5925
+ save();
5926
+ textarea.parentNode.removeChild(cm.getWrapperElement());
5927
+ textarea.style.display = "";
5928
+ if (textarea.form) {
5929
+ off(textarea.form, "submit", save);
5930
+ if (typeof textarea.form.submit == "function")
5931
+ textarea.form.submit = realSubmit;
5932
+ }
5933
+ };
5934
+ };
5935
+
5936
+ textarea.style.display = "none";
5937
+ var cm = CodeMirror(function(node) {
5938
+ textarea.parentNode.insertBefore(node, textarea.nextSibling);
5939
+ }, options);
5940
+ return cm;
5941
+ };
5942
+
5943
+ // STRING STREAM
5944
+
5945
+ // Fed to the mode parsers, provides helper functions to make
5946
+ // parsers more succinct.
5947
+
5948
+ var StringStream = CodeMirror.StringStream = function(string, tabSize) {
5949
+ this.pos = this.start = 0;
5950
+ this.string = string;
5951
+ this.tabSize = tabSize || 8;
5952
+ this.lastColumnPos = this.lastColumnValue = 0;
5953
+ this.lineStart = 0;
5954
+ };
5955
+
5956
+ StringStream.prototype = {
5957
+ eol: function() {return this.pos >= this.string.length;},
5958
+ sol: function() {return this.pos == this.lineStart;},
5959
+ peek: function() {return this.string.charAt(this.pos) || undefined;},
5960
+ next: function() {
5961
+ if (this.pos < this.string.length)
5962
+ return this.string.charAt(this.pos++);
5963
+ },
5964
+ eat: function(match) {
5965
+ var ch = this.string.charAt(this.pos);
5966
+ if (typeof match == "string") var ok = ch == match;
5967
+ else var ok = ch && (match.test ? match.test(ch) : match(ch));
5968
+ if (ok) {++this.pos; return ch;}
5969
+ },
5970
+ eatWhile: function(match) {
5971
+ var start = this.pos;
5972
+ while (this.eat(match)){}
5973
+ return this.pos > start;
5974
+ },
5975
+ eatSpace: function() {
5976
+ var start = this.pos;
5977
+ while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
5978
+ return this.pos > start;
5979
+ },
5980
+ skipToEnd: function() {this.pos = this.string.length;},
5981
+ skipTo: function(ch) {
5982
+ var found = this.string.indexOf(ch, this.pos);
5983
+ if (found > -1) {this.pos = found; return true;}
5984
+ },
5985
+ backUp: function(n) {this.pos -= n;},
5986
+ column: function() {
5987
+ if (this.lastColumnPos < this.start) {
5988
+ this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
5989
+ this.lastColumnPos = this.start;
5990
+ }
5991
+ return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
5992
+ },
5993
+ indentation: function() {
5994
+ return countColumn(this.string, null, this.tabSize) -
5995
+ (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
5996
+ },
5997
+ match: function(pattern, consume, caseInsensitive) {
5998
+ if (typeof pattern == "string") {
5999
+ var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
6000
+ var substr = this.string.substr(this.pos, pattern.length);
6001
+ if (cased(substr) == cased(pattern)) {
6002
+ if (consume !== false) this.pos += pattern.length;
6003
+ return true;
6004
+ }
6005
+ } else {
6006
+ var match = this.string.slice(this.pos).match(pattern);
6007
+ if (match && match.index > 0) return null;
6008
+ if (match && consume !== false) this.pos += match[0].length;
6009
+ return match;
6010
+ }
6011
+ },
6012
+ current: function(){return this.string.slice(this.start, this.pos);},
6013
+ hideFirstChars: function(n, inner) {
6014
+ this.lineStart += n;
6015
+ try { return inner(); }
6016
+ finally { this.lineStart -= n; }
6017
+ }
6018
+ };
6019
+
6020
+ // TEXTMARKERS
6021
+
6022
+ // Created with markText and setBookmark methods. A TextMarker is a
6023
+ // handle that can be used to clear or find a marked position in the
6024
+ // document. Line objects hold arrays (markedSpans) containing
6025
+ // {from, to, marker} object pointing to such marker objects, and
6026
+ // indicating that such a marker is present on that line. Multiple
6027
+ // lines may point to the same marker when it spans across lines.
6028
+ // The spans will have null for their from/to properties when the
6029
+ // marker continues beyond the start/end of the line. Markers have
6030
+ // links back to the lines they currently touch.
6031
+
6032
+ var nextMarkerId = 0;
6033
+
6034
+ var TextMarker = CodeMirror.TextMarker = function(doc, type) {
6035
+ this.lines = [];
6036
+ this.type = type;
6037
+ this.doc = doc;
6038
+ this.id = ++nextMarkerId;
6039
+ };
6040
+ eventMixin(TextMarker);
6041
+
6042
+ // Clear the marker.
6043
+ TextMarker.prototype.clear = function() {
6044
+ if (this.explicitlyCleared) return;
6045
+ var cm = this.doc.cm, withOp = cm && !cm.curOp;
6046
+ if (withOp) startOperation(cm);
6047
+ if (hasHandler(this, "clear")) {
6048
+ var found = this.find();
6049
+ if (found) signalLater(this, "clear", found.from, found.to);
6050
+ }
6051
+ var min = null, max = null;
6052
+ for (var i = 0; i < this.lines.length; ++i) {
6053
+ var line = this.lines[i];
6054
+ var span = getMarkedSpanFor(line.markedSpans, this);
6055
+ if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");
6056
+ else if (cm) {
6057
+ if (span.to != null) max = lineNo(line);
6058
+ if (span.from != null) min = lineNo(line);
6059
+ }
6060
+ line.markedSpans = removeMarkedSpan(line.markedSpans, span);
6061
+ if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
6062
+ updateLineHeight(line, textHeight(cm.display));
6063
+ }
6064
+ if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
6065
+ var visual = visualLine(this.lines[i]), len = lineLength(visual);
6066
+ if (len > cm.display.maxLineLength) {
6067
+ cm.display.maxLine = visual;
6068
+ cm.display.maxLineLength = len;
6069
+ cm.display.maxLineChanged = true;
6070
+ }
6071
+ }
6072
+
6073
+ if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);
6074
+ this.lines.length = 0;
6075
+ this.explicitlyCleared = true;
6076
+ if (this.atomic && this.doc.cantEdit) {
6077
+ this.doc.cantEdit = false;
6078
+ if (cm) reCheckSelection(cm.doc);
6079
+ }
6080
+ if (cm) signalLater(cm, "markerCleared", cm, this);
6081
+ if (withOp) endOperation(cm);
6082
+ if (this.parent) this.parent.clear();
6083
+ };
6084
+
6085
+ // Find the position of the marker in the document. Returns a {from,
6086
+ // to} object by default. Side can be passed to get a specific side
6087
+ // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
6088
+ // Pos objects returned contain a line object, rather than a line
6089
+ // number (used to prevent looking up the same line twice).
6090
+ TextMarker.prototype.find = function(side, lineObj) {
6091
+ if (side == null && this.type == "bookmark") side = 1;
6092
+ var from, to;
6093
+ for (var i = 0; i < this.lines.length; ++i) {
6094
+ var line = this.lines[i];
6095
+ var span = getMarkedSpanFor(line.markedSpans, this);
6096
+ if (span.from != null) {
6097
+ from = Pos(lineObj ? line : lineNo(line), span.from);
6098
+ if (side == -1) return from;
6099
+ }
6100
+ if (span.to != null) {
6101
+ to = Pos(lineObj ? line : lineNo(line), span.to);
6102
+ if (side == 1) return to;
6103
+ }
6104
+ }
6105
+ return from && {from: from, to: to};
6106
+ };
6107
+
6108
+ // Signals that the marker's widget changed, and surrounding layout
6109
+ // should be recomputed.
6110
+ TextMarker.prototype.changed = function() {
6111
+ var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
6112
+ if (!pos || !cm) return;
6113
+ runInOp(cm, function() {
6114
+ var line = pos.line, lineN = lineNo(pos.line);
6115
+ var view = findViewForLine(cm, lineN);
6116
+ if (view) {
6117
+ clearLineMeasurementCacheFor(view);
6118
+ cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
6119
+ }
6120
+ cm.curOp.updateMaxLine = true;
6121
+ if (!lineIsHidden(widget.doc, line) && widget.height != null) {
6122
+ var oldHeight = widget.height;
6123
+ widget.height = null;
6124
+ var dHeight = widgetHeight(widget) - oldHeight;
6125
+ if (dHeight)
6126
+ updateLineHeight(line, line.height + dHeight);
6127
+ }
6128
+ });
6129
+ };
6130
+
6131
+ TextMarker.prototype.attachLine = function(line) {
6132
+ if (!this.lines.length && this.doc.cm) {
6133
+ var op = this.doc.cm.curOp;
6134
+ if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
6135
+ (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
6136
+ }
6137
+ this.lines.push(line);
6138
+ };
6139
+ TextMarker.prototype.detachLine = function(line) {
6140
+ this.lines.splice(indexOf(this.lines, line), 1);
6141
+ if (!this.lines.length && this.doc.cm) {
6142
+ var op = this.doc.cm.curOp;
6143
+ (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
6144
+ }
6145
+ };
6146
+
6147
+ // Collapsed markers have unique ids, in order to be able to order
6148
+ // them, which is needed for uniquely determining an outer marker
6149
+ // when they overlap (they may nest, but not partially overlap).
6150
+ var nextMarkerId = 0;
6151
+
6152
+ // Create a marker, wire it up to the right lines, and
6153
+ function markText(doc, from, to, options, type) {
6154
+ // Shared markers (across linked documents) are handled separately
6155
+ // (markTextShared will call out to this again, once per
6156
+ // document).
6157
+ if (options && options.shared) return markTextShared(doc, from, to, options, type);
6158
+ // Ensure we are in an operation.
6159
+ if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
6160
+
6161
+ var marker = new TextMarker(doc, type), diff = cmp(from, to);
6162
+ if (options) copyObj(options, marker, false);
6163
+ // Don't connect empty markers unless clearWhenEmpty is false
6164
+ if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
6165
+ return marker;
6166
+ if (marker.replacedWith) {
6167
+ // Showing up as a widget implies collapsed (widget replaces text)
6168
+ marker.collapsed = true;
6169
+ marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");
6170
+ if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true");
6171
+ if (options.insertLeft) marker.widgetNode.insertLeft = true;
6172
+ }
6173
+ if (marker.collapsed) {
6174
+ if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
6175
+ from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
6176
+ throw new Error("Inserting collapsed marker partially overlapping an existing one");
6177
+ sawCollapsedSpans = true;
6178
+ }
6179
+
6180
+ if (marker.addToHistory)
6181
+ addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);
6182
+
6183
+ var curLine = from.line, cm = doc.cm, updateMaxLine;
6184
+ doc.iter(curLine, to.line + 1, function(line) {
6185
+ if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
6186
+ updateMaxLine = true;
6187
+ if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);
6188
+ addMarkedSpan(line, new MarkedSpan(marker,
6189
+ curLine == from.line ? from.ch : null,
6190
+ curLine == to.line ? to.ch : null));
6191
+ ++curLine;
6192
+ });
6193
+ // lineIsHidden depends on the presence of the spans, so needs a second pass
6194
+ if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
6195
+ if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
6196
+ });
6197
+
6198
+ if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
6199
+
6200
+ if (marker.readOnly) {
6201
+ sawReadOnlySpans = true;
6202
+ if (doc.history.done.length || doc.history.undone.length)
6203
+ doc.clearHistory();
6204
+ }
6205
+ if (marker.collapsed) {
6206
+ marker.id = ++nextMarkerId;
6207
+ marker.atomic = true;
6208
+ }
6209
+ if (cm) {
6210
+ // Sync editor state
6211
+ if (updateMaxLine) cm.curOp.updateMaxLine = true;
6212
+ if (marker.collapsed)
6213
+ regChange(cm, from.line, to.line + 1);
6214
+ else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
6215
+ for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");
6216
+ if (marker.atomic) reCheckSelection(cm.doc);
6217
+ signalLater(cm, "markerAdded", cm, marker);
6218
+ }
6219
+ return marker;
6220
+ }
6221
+
6222
+ // SHARED TEXTMARKERS
6223
+
6224
+ // A shared marker spans multiple linked documents. It is
6225
+ // implemented as a meta-marker-object controlling multiple normal
6226
+ // markers.
6227
+ var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {
6228
+ this.markers = markers;
6229
+ this.primary = primary;
6230
+ for (var i = 0; i < markers.length; ++i)
6231
+ markers[i].parent = this;
6232
+ };
6233
+ eventMixin(SharedTextMarker);
6234
+
6235
+ SharedTextMarker.prototype.clear = function() {
6236
+ if (this.explicitlyCleared) return;
6237
+ this.explicitlyCleared = true;
6238
+ for (var i = 0; i < this.markers.length; ++i)
6239
+ this.markers[i].clear();
6240
+ signalLater(this, "clear");
6241
+ };
6242
+ SharedTextMarker.prototype.find = function(side, lineObj) {
6243
+ return this.primary.find(side, lineObj);
6244
+ };
6245
+
6246
+ function markTextShared(doc, from, to, options, type) {
6247
+ options = copyObj(options);
6248
+ options.shared = false;
6249
+ var markers = [markText(doc, from, to, options, type)], primary = markers[0];
6250
+ var widget = options.widgetNode;
6251
+ linkedDocs(doc, function(doc) {
6252
+ if (widget) options.widgetNode = widget.cloneNode(true);
6253
+ markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
6254
+ for (var i = 0; i < doc.linked.length; ++i)
6255
+ if (doc.linked[i].isParent) return;
6256
+ primary = lst(markers);
6257
+ });
6258
+ return new SharedTextMarker(markers, primary);
6259
+ }
6260
+
6261
+ function findSharedMarkers(doc) {
6262
+ return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),
6263
+ function(m) { return m.parent; });
6264
+ }
6265
+
6266
+ function copySharedMarkers(doc, markers) {
6267
+ for (var i = 0; i < markers.length; i++) {
6268
+ var marker = markers[i], pos = marker.find();
6269
+ var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
6270
+ if (cmp(mFrom, mTo)) {
6271
+ var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
6272
+ marker.markers.push(subMark);
6273
+ subMark.parent = marker;
6274
+ }
6275
+ }
6276
+ }
6277
+
6278
+ function detachSharedMarkers(markers) {
6279
+ for (var i = 0; i < markers.length; i++) {
6280
+ var marker = markers[i], linked = [marker.primary.doc];;
6281
+ linkedDocs(marker.primary.doc, function(d) { linked.push(d); });
6282
+ for (var j = 0; j < marker.markers.length; j++) {
6283
+ var subMarker = marker.markers[j];
6284
+ if (indexOf(linked, subMarker.doc) == -1) {
6285
+ subMarker.parent = null;
6286
+ marker.markers.splice(j--, 1);
6287
+ }
6288
+ }
6289
+ }
6290
+ }
6291
+
6292
+ // TEXTMARKER SPANS
6293
+
6294
+ function MarkedSpan(marker, from, to) {
6295
+ this.marker = marker;
6296
+ this.from = from; this.to = to;
6297
+ }
6298
+
6299
+ // Search an array of spans for a span matching the given marker.
6300
+ function getMarkedSpanFor(spans, marker) {
6301
+ if (spans) for (var i = 0; i < spans.length; ++i) {
6302
+ var span = spans[i];
6303
+ if (span.marker == marker) return span;
6304
+ }
6305
+ }
6306
+ // Remove a span from an array, returning undefined if no spans are
6307
+ // left (we don't store arrays for lines without spans).
6308
+ function removeMarkedSpan(spans, span) {
6309
+ for (var r, i = 0; i < spans.length; ++i)
6310
+ if (spans[i] != span) (r || (r = [])).push(spans[i]);
6311
+ return r;
6312
+ }
6313
+ // Add a span to a line.
6314
+ function addMarkedSpan(line, span) {
6315
+ line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
6316
+ span.marker.attachLine(line);
6317
+ }
6318
+
6319
+ // Used for the algorithm that adjusts markers for a change in the
6320
+ // document. These functions cut an array of spans at a given
6321
+ // character position, returning an array of remaining chunks (or
6322
+ // undefined if nothing remains).
6323
+ function markedSpansBefore(old, startCh, isInsert) {
6324
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
6325
+ var span = old[i], marker = span.marker;
6326
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
6327
+ if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
6328
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
6329
+ (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
6330
+ }
6331
+ }
6332
+ return nw;
6333
+ }
6334
+ function markedSpansAfter(old, endCh, isInsert) {
6335
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
6336
+ var span = old[i], marker = span.marker;
6337
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
6338
+ if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
6339
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
6340
+ (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
6341
+ span.to == null ? null : span.to - endCh));
6342
+ }
6343
+ }
6344
+ return nw;
6345
+ }
6346
+
6347
+ // Given a change object, compute the new set of marker spans that
6348
+ // cover the line in which the change took place. Removes spans
6349
+ // entirely within the change, reconnects spans belonging to the
6350
+ // same marker that appear on both sides of the change, and cuts off
6351
+ // spans partially within the change. Returns an array of span
6352
+ // arrays with one element for each line in (after) the change.
6353
+ function stretchSpansOverChange(doc, change) {
6354
+ if (change.full) return null;
6355
+ var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
6356
+ var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
6357
+ if (!oldFirst && !oldLast) return null;
6358
+
6359
+ var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
6360
+ // Get the spans that 'stick out' on both sides
6361
+ var first = markedSpansBefore(oldFirst, startCh, isInsert);
6362
+ var last = markedSpansAfter(oldLast, endCh, isInsert);
6363
+
6364
+ // Next, merge those two ends
6365
+ var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
6366
+ if (first) {
6367
+ // Fix up .to properties of first
6368
+ for (var i = 0; i < first.length; ++i) {
6369
+ var span = first[i];
6370
+ if (span.to == null) {
6371
+ var found = getMarkedSpanFor(last, span.marker);
6372
+ if (!found) span.to = startCh;
6373
+ else if (sameLine) span.to = found.to == null ? null : found.to + offset;
6374
+ }
6375
+ }
6376
+ }
6377
+ if (last) {
6378
+ // Fix up .from in last (or move them into first in case of sameLine)
6379
+ for (var i = 0; i < last.length; ++i) {
6380
+ var span = last[i];
6381
+ if (span.to != null) span.to += offset;
6382
+ if (span.from == null) {
6383
+ var found = getMarkedSpanFor(first, span.marker);
6384
+ if (!found) {
6385
+ span.from = offset;
6386
+ if (sameLine) (first || (first = [])).push(span);
6387
+ }
6388
+ } else {
6389
+ span.from += offset;
6390
+ if (sameLine) (first || (first = [])).push(span);
6391
+ }
6392
+ }
6393
+ }
6394
+ // Make sure we didn't create any zero-length spans
6395
+ if (first) first = clearEmptySpans(first);
6396
+ if (last && last != first) last = clearEmptySpans(last);
6397
+
6398
+ var newMarkers = [first];
6399
+ if (!sameLine) {
6400
+ // Fill gap with whole-line-spans
6401
+ var gap = change.text.length - 2, gapMarkers;
6402
+ if (gap > 0 && first)
6403
+ for (var i = 0; i < first.length; ++i)
6404
+ if (first[i].to == null)
6405
+ (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));
6406
+ for (var i = 0; i < gap; ++i)
6407
+ newMarkers.push(gapMarkers);
6408
+ newMarkers.push(last);
6409
+ }
6410
+ return newMarkers;
6411
+ }
6412
+
6413
+ // Remove spans that are empty and don't have a clearWhenEmpty
6414
+ // option of false.
6415
+ function clearEmptySpans(spans) {
6416
+ for (var i = 0; i < spans.length; ++i) {
6417
+ var span = spans[i];
6418
+ if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
6419
+ spans.splice(i--, 1);
6420
+ }
6421
+ if (!spans.length) return null;
6422
+ return spans;
6423
+ }
6424
+
6425
+ // Used for un/re-doing changes from the history. Combines the
6426
+ // result of computing the existing spans with the set of spans that
6427
+ // existed in the history (so that deleting around a span and then
6428
+ // undoing brings back the span).
6429
+ function mergeOldSpans(doc, change) {
6430
+ var old = getOldSpans(doc, change);
6431
+ var stretched = stretchSpansOverChange(doc, change);
6432
+ if (!old) return stretched;
6433
+ if (!stretched) return old;
6434
+
6435
+ for (var i = 0; i < old.length; ++i) {
6436
+ var oldCur = old[i], stretchCur = stretched[i];
6437
+ if (oldCur && stretchCur) {
6438
+ spans: for (var j = 0; j < stretchCur.length; ++j) {
6439
+ var span = stretchCur[j];
6440
+ for (var k = 0; k < oldCur.length; ++k)
6441
+ if (oldCur[k].marker == span.marker) continue spans;
6442
+ oldCur.push(span);
6443
+ }
6444
+ } else if (stretchCur) {
6445
+ old[i] = stretchCur;
6446
+ }
6447
+ }
6448
+ return old;
6449
+ }
6450
+
6451
+ // Used to 'clip' out readOnly ranges when making a change.
6452
+ function removeReadOnlyRanges(doc, from, to) {
6453
+ var markers = null;
6454
+ doc.iter(from.line, to.line + 1, function(line) {
6455
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
6456
+ var mark = line.markedSpans[i].marker;
6457
+ if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
6458
+ (markers || (markers = [])).push(mark);
6459
+ }
6460
+ });
6461
+ if (!markers) return null;
6462
+ var parts = [{from: from, to: to}];
6463
+ for (var i = 0; i < markers.length; ++i) {
6464
+ var mk = markers[i], m = mk.find(0);
6465
+ for (var j = 0; j < parts.length; ++j) {
6466
+ var p = parts[j];
6467
+ if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;
6468
+ var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
6469
+ if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
6470
+ newParts.push({from: p.from, to: m.from});
6471
+ if (dto > 0 || !mk.inclusiveRight && !dto)
6472
+ newParts.push({from: m.to, to: p.to});
6473
+ parts.splice.apply(parts, newParts);
6474
+ j += newParts.length - 1;
6475
+ }
6476
+ }
6477
+ return parts;
6478
+ }
6479
+
6480
+ // Connect or disconnect spans from a line.
6481
+ function detachMarkedSpans(line) {
6482
+ var spans = line.markedSpans;
6483
+ if (!spans) return;
6484
+ for (var i = 0; i < spans.length; ++i)
6485
+ spans[i].marker.detachLine(line);
6486
+ line.markedSpans = null;
6487
+ }
6488
+ function attachMarkedSpans(line, spans) {
6489
+ if (!spans) return;
6490
+ for (var i = 0; i < spans.length; ++i)
6491
+ spans[i].marker.attachLine(line);
6492
+ line.markedSpans = spans;
6493
+ }
6494
+
6495
+ // Helpers used when computing which overlapping collapsed span
6496
+ // counts as the larger one.
6497
+ function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
6498
+ function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }
6499
+
6500
+ // Returns a number indicating which of two overlapping collapsed
6501
+ // spans is larger (and thus includes the other). Falls back to
6502
+ // comparing ids when the spans cover exactly the same range.
6503
+ function compareCollapsedMarkers(a, b) {
6504
+ var lenDiff = a.lines.length - b.lines.length;
6505
+ if (lenDiff != 0) return lenDiff;
6506
+ var aPos = a.find(), bPos = b.find();
6507
+ var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
6508
+ if (fromCmp) return -fromCmp;
6509
+ var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
6510
+ if (toCmp) return toCmp;
6511
+ return b.id - a.id;
6512
+ }
6513
+
6514
+ // Find out whether a line ends or starts in a collapsed span. If
6515
+ // so, return the marker for that span.
6516
+ function collapsedSpanAtSide(line, start) {
6517
+ var sps = sawCollapsedSpans && line.markedSpans, found;
6518
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
6519
+ sp = sps[i];
6520
+ if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
6521
+ (!found || compareCollapsedMarkers(found, sp.marker) < 0))
6522
+ found = sp.marker;
6523
+ }
6524
+ return found;
6525
+ }
6526
+ function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }
6527
+ function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }
6528
+
6529
+ // Test whether there exists a collapsed span that partially
6530
+ // overlaps (covers the start or end, but not both) of a new span.
6531
+ // Such overlap is not allowed.
6532
+ function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
6533
+ var line = getLine(doc, lineNo);
6534
+ var sps = sawCollapsedSpans && line.markedSpans;
6535
+ if (sps) for (var i = 0; i < sps.length; ++i) {
6536
+ var sp = sps[i];
6537
+ if (!sp.marker.collapsed) continue;
6538
+ var found = sp.marker.find(0);
6539
+ var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
6540
+ var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
6541
+ if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
6542
+ if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||
6543
+ fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))
6544
+ return true;
6545
+ }
6546
+ }
6547
+
6548
+ // A visual line is a line as drawn on the screen. Folding, for
6549
+ // example, can cause multiple logical lines to appear on the same
6550
+ // visual line. This finds the start of the visual line that the
6551
+ // given line is part of (usually that is the line itself).
6552
+ function visualLine(line) {
6553
+ var merged;
6554
+ while (merged = collapsedSpanAtStart(line))
6555
+ line = merged.find(-1, true).line;
6556
+ return line;
6557
+ }
6558
+
6559
+ // Returns an array of logical lines that continue the visual line
6560
+ // started by the argument, or undefined if there are no such lines.
6561
+ function visualLineContinued(line) {
6562
+ var merged, lines;
6563
+ while (merged = collapsedSpanAtEnd(line)) {
6564
+ line = merged.find(1, true).line;
6565
+ (lines || (lines = [])).push(line);
6566
+ }
6567
+ return lines;
6568
+ }
6569
+
6570
+ // Get the line number of the start of the visual line that the
6571
+ // given line number is part of.
6572
+ function visualLineNo(doc, lineN) {
6573
+ var line = getLine(doc, lineN), vis = visualLine(line);
6574
+ if (line == vis) return lineN;
6575
+ return lineNo(vis);
6576
+ }
6577
+ // Get the line number of the start of the next visual line after
6578
+ // the given line.
6579
+ function visualLineEndNo(doc, lineN) {
6580
+ if (lineN > doc.lastLine()) return lineN;
6581
+ var line = getLine(doc, lineN), merged;
6582
+ if (!lineIsHidden(doc, line)) return lineN;
6583
+ while (merged = collapsedSpanAtEnd(line))
6584
+ line = merged.find(1, true).line;
6585
+ return lineNo(line) + 1;
6586
+ }
6587
+
6588
+ // Compute whether a line is hidden. Lines count as hidden when they
6589
+ // are part of a visual line that starts with another line, or when
6590
+ // they are entirely covered by collapsed, non-widget span.
6591
+ function lineIsHidden(doc, line) {
6592
+ var sps = sawCollapsedSpans && line.markedSpans;
6593
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
6594
+ sp = sps[i];
6595
+ if (!sp.marker.collapsed) continue;
6596
+ if (sp.from == null) return true;
6597
+ if (sp.marker.widgetNode) continue;
6598
+ if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
6599
+ return true;
6600
+ }
6601
+ }
6602
+ function lineIsHiddenInner(doc, line, span) {
6603
+ if (span.to == null) {
6604
+ var end = span.marker.find(1, true);
6605
+ return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));
6606
+ }
6607
+ if (span.marker.inclusiveRight && span.to == line.text.length)
6608
+ return true;
6609
+ for (var sp, i = 0; i < line.markedSpans.length; ++i) {
6610
+ sp = line.markedSpans[i];
6611
+ if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
6612
+ (sp.to == null || sp.to != span.from) &&
6613
+ (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
6614
+ lineIsHiddenInner(doc, line, sp)) return true;
6615
+ }
6616
+ }
6617
+
6618
+ // LINE WIDGETS
6619
+
6620
+ // Line widgets are block elements displayed above or below a line.
6621
+
6622
+ var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {
6623
+ if (options) for (var opt in options) if (options.hasOwnProperty(opt))
6624
+ this[opt] = options[opt];
6625
+ this.doc = doc;
6626
+ this.node = node;
6627
+ };
6628
+ eventMixin(LineWidget);
6629
+
6630
+ function adjustScrollWhenAboveVisible(cm, line, diff) {
6631
+ if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
6632
+ addToScrollPos(cm, null, diff);
6633
+ }
6634
+
6635
+ LineWidget.prototype.clear = function() {
6636
+ var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
6637
+ if (no == null || !ws) return;
6638
+ for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
6639
+ if (!ws.length) line.widgets = null;
6640
+ var height = widgetHeight(this);
6641
+ updateLineHeight(line, Math.max(0, line.height - height));
6642
+ if (cm) runInOp(cm, function() {
6643
+ adjustScrollWhenAboveVisible(cm, line, -height);
6644
+ regLineChange(cm, no, "widget");
6645
+ });
6646
+ };
6647
+ LineWidget.prototype.changed = function() {
6648
+ var oldH = this.height, cm = this.doc.cm, line = this.line;
6649
+ this.height = null;
6650
+ var diff = widgetHeight(this) - oldH;
6651
+ if (!diff) return;
6652
+ updateLineHeight(line, line.height + diff);
6653
+ if (cm) runInOp(cm, function() {
6654
+ cm.curOp.forceUpdate = true;
6655
+ adjustScrollWhenAboveVisible(cm, line, diff);
6656
+ });
6657
+ };
6658
+
6659
+ function widgetHeight(widget) {
6660
+ if (widget.height != null) return widget.height;
6661
+ var cm = widget.doc.cm;
6662
+ if (!cm) return 0;
6663
+ if (!contains(document.body, widget.node)) {
6664
+ var parentStyle = "position: relative;";
6665
+ if (widget.coverGutter)
6666
+ parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;";
6667
+ if (widget.noHScroll)
6668
+ parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;";
6669
+ removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
6670
+ }
6671
+ return widget.height = widget.node.offsetHeight;
6672
+ }
6673
+
6674
+ function addLineWidget(doc, handle, node, options) {
6675
+ var widget = new LineWidget(doc, node, options);
6676
+ var cm = doc.cm;
6677
+ if (cm && widget.noHScroll) cm.display.alignWidgets = true;
6678
+ changeLine(doc, handle, "widget", function(line) {
6679
+ var widgets = line.widgets || (line.widgets = []);
6680
+ if (widget.insertAt == null) widgets.push(widget);
6681
+ else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
6682
+ widget.line = line;
6683
+ if (cm && !lineIsHidden(doc, line)) {
6684
+ var aboveVisible = heightAtLine(line) < doc.scrollTop;
6685
+ updateLineHeight(line, line.height + widgetHeight(widget));
6686
+ if (aboveVisible) addToScrollPos(cm, null, widget.height);
6687
+ cm.curOp.forceUpdate = true;
6688
+ }
6689
+ return true;
6690
+ });
6691
+ return widget;
6692
+ }
6693
+
6694
+ // LINE DATA STRUCTURE
6695
+
6696
+ // Line objects. These hold state related to a line, including
6697
+ // highlighting info (the styles array).
6698
+ var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
6699
+ this.text = text;
6700
+ attachMarkedSpans(this, markedSpans);
6701
+ this.height = estimateHeight ? estimateHeight(this) : 1;
6702
+ };
6703
+ eventMixin(Line);
6704
+ Line.prototype.lineNo = function() { return lineNo(this); };
6705
+
6706
+ // Change the content (text, markers) of a line. Automatically
6707
+ // invalidates cached information and tries to re-estimate the
6708
+ // line's height.
6709
+ function updateLine(line, text, markedSpans, estimateHeight) {
6710
+ line.text = text;
6711
+ if (line.stateAfter) line.stateAfter = null;
6712
+ if (line.styles) line.styles = null;
6713
+ if (line.order != null) line.order = null;
6714
+ detachMarkedSpans(line);
6715
+ attachMarkedSpans(line, markedSpans);
6716
+ var estHeight = estimateHeight ? estimateHeight(line) : 1;
6717
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
6718
+ }
6719
+
6720
+ // Detach a line from the document tree and its markers.
6721
+ function cleanUpLine(line) {
6722
+ line.parent = null;
6723
+ detachMarkedSpans(line);
6724
+ }
6725
+
6726
+ function extractLineClasses(type, output) {
6727
+ if (type) for (;;) {
6728
+ var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
6729
+ if (!lineClass) break;
6730
+ type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
6731
+ var prop = lineClass[1] ? "bgClass" : "textClass";
6732
+ if (output[prop] == null)
6733
+ output[prop] = lineClass[2];
6734
+ else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
6735
+ output[prop] += " " + lineClass[2];
6736
+ }
6737
+ return type;
6738
+ }
6739
+
6740
+ function callBlankLine(mode, state) {
6741
+ if (mode.blankLine) return mode.blankLine(state);
6742
+ if (!mode.innerMode) return;
6743
+ var inner = CodeMirror.innerMode(mode, state);
6744
+ if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);
6745
+ }
6746
+
6747
+ function readToken(mode, stream, state, inner) {
6748
+ for (var i = 0; i < 10; i++) {
6749
+ if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;
6750
+ var style = mode.token(stream, state);
6751
+ if (stream.pos > stream.start) return style;
6752
+ }
6753
+ throw new Error("Mode " + mode.name + " failed to advance stream.");
6754
+ }
6755
+
6756
+ // Utility for getTokenAt and getLineTokens
6757
+ function takeToken(cm, pos, precise, asArray) {
6758
+ function getObj(copy) {
6759
+ return {start: stream.start, end: stream.pos,
6760
+ string: stream.current(),
6761
+ type: style || null,
6762
+ state: copy ? copyState(doc.mode, state) : state};
6763
+ }
6764
+
6765
+ var doc = cm.doc, mode = doc.mode, style;
6766
+ pos = clipPos(doc, pos);
6767
+ var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);
6768
+ var stream = new StringStream(line.text, cm.options.tabSize), tokens;
6769
+ if (asArray) tokens = [];
6770
+ while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
6771
+ stream.start = stream.pos;
6772
+ style = readToken(mode, stream, state);
6773
+ if (asArray) tokens.push(getObj(true));
6774
+ }
6775
+ return asArray ? tokens : getObj();
6776
+ }
6777
+
6778
+ // Run the given mode's parser over a line, calling f for each token.
6779
+ function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
6780
+ var flattenSpans = mode.flattenSpans;
6781
+ if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
6782
+ var curStart = 0, curStyle = null;
6783
+ var stream = new StringStream(text, cm.options.tabSize), style;
6784
+ var inner = cm.options.addModeClass && [null];
6785
+ if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);
6786
+ while (!stream.eol()) {
6787
+ if (stream.pos > cm.options.maxHighlightLength) {
6788
+ flattenSpans = false;
6789
+ if (forceToEnd) processLine(cm, text, state, stream.pos);
6790
+ stream.pos = text.length;
6791
+ style = null;
6792
+ } else {
6793
+ style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);
6794
+ }
6795
+ if (inner) {
6796
+ var mName = inner[0].name;
6797
+ if (mName) style = "m-" + (style ? mName + " " + style : mName);
6798
+ }
6799
+ if (!flattenSpans || curStyle != style) {
6800
+ while (curStart < stream.start) {
6801
+ curStart = Math.min(stream.start, curStart + 50000);
6802
+ f(curStart, curStyle);
6803
+ }
6804
+ curStyle = style;
6805
+ }
6806
+ stream.start = stream.pos;
6807
+ }
6808
+ while (curStart < stream.pos) {
6809
+ // Webkit seems to refuse to render text nodes longer than 57444 characters
6810
+ var pos = Math.min(stream.pos, curStart + 50000);
6811
+ f(pos, curStyle);
6812
+ curStart = pos;
6813
+ }
6814
+ }
6815
+
6816
+ // Compute a style array (an array starting with a mode generation
6817
+ // -- for invalidation -- followed by pairs of end positions and
6818
+ // style strings), which is used to highlight the tokens on the
6819
+ // line.
6820
+ function highlightLine(cm, line, state, forceToEnd) {
6821
+ // A styles array always starts with a number identifying the
6822
+ // mode/overlays that it is based on (for easy invalidation).
6823
+ var st = [cm.state.modeGen], lineClasses = {};
6824
+ // Compute the base array of styles
6825
+ runMode(cm, line.text, cm.doc.mode, state, function(end, style) {
6826
+ st.push(end, style);
6827
+ }, lineClasses, forceToEnd);
6828
+
6829
+ // Run overlays, adjust style array.
6830
+ for (var o = 0; o < cm.state.overlays.length; ++o) {
6831
+ var overlay = cm.state.overlays[o], i = 1, at = 0;
6832
+ runMode(cm, line.text, overlay.mode, true, function(end, style) {
6833
+ var start = i;
6834
+ // Ensure there's a token end at the current position, and that i points at it
6835
+ while (at < end) {
6836
+ var i_end = st[i];
6837
+ if (i_end > end)
6838
+ st.splice(i, 1, end, st[i+1], i_end);
6839
+ i += 2;
6840
+ at = Math.min(end, i_end);
6841
+ }
6842
+ if (!style) return;
6843
+ if (overlay.opaque) {
6844
+ st.splice(start, i - start, end, "cm-overlay " + style);
6845
+ i = start + 2;
6846
+ } else {
6847
+ for (; start < i; start += 2) {
6848
+ var cur = st[start+1];
6849
+ st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;
6850
+ }
6851
+ }
6852
+ }, lineClasses);
6853
+ }
6854
+
6855
+ return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};
6856
+ }
6857
+
6858
+ function getLineStyles(cm, line, updateFrontier) {
6859
+ if (!line.styles || line.styles[0] != cm.state.modeGen) {
6860
+ var state = getStateBefore(cm, lineNo(line));
6861
+ var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state);
6862
+ line.stateAfter = state;
6863
+ line.styles = result.styles;
6864
+ if (result.classes) line.styleClasses = result.classes;
6865
+ else if (line.styleClasses) line.styleClasses = null;
6866
+ if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;
6867
+ }
6868
+ return line.styles;
6869
+ }
6870
+
6871
+ // Lightweight form of highlight -- proceed over this line and
6872
+ // update state, but don't save a style array. Used for lines that
6873
+ // aren't currently visible.
6874
+ function processLine(cm, text, state, startAt) {
6875
+ var mode = cm.doc.mode;
6876
+ var stream = new StringStream(text, cm.options.tabSize);
6877
+ stream.start = stream.pos = startAt || 0;
6878
+ if (text == "") callBlankLine(mode, state);
6879
+ while (!stream.eol()) {
6880
+ readToken(mode, stream, state);
6881
+ stream.start = stream.pos;
6882
+ }
6883
+ }
6884
+
6885
+ // Convert a style as returned by a mode (either null, or a string
6886
+ // containing one or more styles) to a CSS style. This is cached,
6887
+ // and also looks for line-wide styles.
6888
+ var styleToClassCache = {}, styleToClassCacheWithMode = {};
6889
+ function interpretTokenStyle(style, options) {
6890
+ if (!style || /^\s*$/.test(style)) return null;
6891
+ var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
6892
+ return cache[style] ||
6893
+ (cache[style] = style.replace(/\S+/g, "cm-$&"));
6894
+ }
6895
+
6896
+ // Render the DOM representation of the text of a line. Also builds
6897
+ // up a 'line map', which points at the DOM nodes that represent
6898
+ // specific stretches of text, and is used by the measuring code.
6899
+ // The returned object contains the DOM node, this map, and
6900
+ // information about line-wide styles that were set by the mode.
6901
+ function buildLineContent(cm, lineView) {
6902
+ // The padding-right forces the element to have a 'border', which
6903
+ // is needed on Webkit to be able to get line-level bounding
6904
+ // rectangles for it (in measureChar).
6905
+ var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
6906
+ var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content,
6907
+ col: 0, pos: 0, cm: cm,
6908
+ splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
6909
+ lineView.measure = {};
6910
+
6911
+ // Iterate over the logical lines that make up this visual line.
6912
+ for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
6913
+ var line = i ? lineView.rest[i - 1] : lineView.line, order;
6914
+ builder.pos = 0;
6915
+ builder.addToken = buildToken;
6916
+ // Optionally wire in some hacks into the token-rendering
6917
+ // algorithm, to deal with browser quirks.
6918
+ if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))
6919
+ builder.addToken = buildTokenBadBidi(builder.addToken, order);
6920
+ builder.map = [];
6921
+ var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
6922
+ insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
6923
+ if (line.styleClasses) {
6924
+ if (line.styleClasses.bgClass)
6925
+ builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");
6926
+ if (line.styleClasses.textClass)
6927
+ builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");
6928
+ }
6929
+
6930
+ // Ensure at least a single node is present, for measuring.
6931
+ if (builder.map.length == 0)
6932
+ builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));
6933
+
6934
+ // Store the map and a cache object for the current logical line
6935
+ if (i == 0) {
6936
+ lineView.measure.map = builder.map;
6937
+ lineView.measure.cache = {};
6938
+ } else {
6939
+ (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);
6940
+ (lineView.measure.caches || (lineView.measure.caches = [])).push({});
6941
+ }
6942
+ }
6943
+
6944
+ // See issue #2901
6945
+ if (webkit && /\bcm-tab\b/.test(builder.content.lastChild.className))
6946
+ builder.content.className = "cm-tab-wrap-hack";
6947
+
6948
+ signal(cm, "renderLine", cm, lineView.line, builder.pre);
6949
+ if (builder.pre.className)
6950
+ builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");
6951
+
6952
+ return builder;
6953
+ }
6954
+
6955
+ function defaultSpecialCharPlaceholder(ch) {
6956
+ var token = elt("span", "\u2022", "cm-invalidchar");
6957
+ token.title = "\\u" + ch.charCodeAt(0).toString(16);
6958
+ token.setAttribute("aria-label", token.title);
6959
+ return token;
6960
+ }
6961
+
6962
+ // Build up the DOM representation for a single token, and add it to
6963
+ // the line map. Takes care to render special characters separately.
6964
+ function buildToken(builder, text, style, startStyle, endStyle, title, css) {
6965
+ if (!text) return;
6966
+ var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text;
6967
+ var special = builder.cm.state.specialChars, mustWrap = false;
6968
+ if (!special.test(text)) {
6969
+ builder.col += text.length;
6970
+ var content = document.createTextNode(displayText);
6971
+ builder.map.push(builder.pos, builder.pos + text.length, content);
6972
+ if (ie && ie_version < 9) mustWrap = true;
6973
+ builder.pos += text.length;
6974
+ } else {
6975
+ var content = document.createDocumentFragment(), pos = 0;
6976
+ while (true) {
6977
+ special.lastIndex = pos;
6978
+ var m = special.exec(text);
6979
+ var skipped = m ? m.index - pos : text.length - pos;
6980
+ if (skipped) {
6981
+ var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
6982
+ if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
6983
+ else content.appendChild(txt);
6984
+ builder.map.push(builder.pos, builder.pos + skipped, txt);
6985
+ builder.col += skipped;
6986
+ builder.pos += skipped;
6987
+ }
6988
+ if (!m) break;
6989
+ pos += skipped + 1;
6990
+ if (m[0] == "\t") {
6991
+ var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
6992
+ var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
6993
+ txt.setAttribute("role", "presentation");
6994
+ txt.setAttribute("cm-text", "\t");
6995
+ builder.col += tabWidth;
6996
+ } else if (m[0] == "\r" || m[0] == "\n") {
6997
+ var txt = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
6998
+ txt.setAttribute("cm-text", m[0]);
6999
+ builder.col += 1;
7000
+ } else {
7001
+ var txt = builder.cm.options.specialCharPlaceholder(m[0]);
7002
+ txt.setAttribute("cm-text", m[0]);
7003
+ if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
7004
+ else content.appendChild(txt);
7005
+ builder.col += 1;
7006
+ }
7007
+ builder.map.push(builder.pos, builder.pos + 1, txt);
7008
+ builder.pos++;
7009
+ }
7010
+ }
7011
+ if (style || startStyle || endStyle || mustWrap || css) {
7012
+ var fullStyle = style || "";
7013
+ if (startStyle) fullStyle += startStyle;
7014
+ if (endStyle) fullStyle += endStyle;
7015
+ var token = elt("span", [content], fullStyle, css);
7016
+ if (title) token.title = title;
7017
+ return builder.content.appendChild(token);
7018
+ }
7019
+ builder.content.appendChild(content);
7020
+ }
7021
+
7022
+ function splitSpaces(old) {
7023
+ var out = " ";
7024
+ for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
7025
+ out += " ";
7026
+ return out;
7027
+ }
7028
+
7029
+ // Work around nonsense dimensions being reported for stretches of
7030
+ // right-to-left text.
7031
+ function buildTokenBadBidi(inner, order) {
7032
+ return function(builder, text, style, startStyle, endStyle, title, css) {
7033
+ style = style ? style + " cm-force-border" : "cm-force-border";
7034
+ var start = builder.pos, end = start + text.length;
7035
+ for (;;) {
7036
+ // Find the part that overlaps with the start of this text
7037
+ for (var i = 0; i < order.length; i++) {
7038
+ var part = order[i];
7039
+ if (part.to > start && part.from <= start) break;
7040
+ }
7041
+ if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css);
7042
+ inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);
7043
+ startStyle = null;
7044
+ text = text.slice(part.to - start);
7045
+ start = part.to;
7046
+ }
7047
+ };
7048
+ }
7049
+
7050
+ function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
7051
+ var widget = !ignoreWidget && marker.widgetNode;
7052
+ if (widget) builder.map.push(builder.pos, builder.pos + size, widget);
7053
+ if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
7054
+ if (!widget)
7055
+ widget = builder.content.appendChild(document.createElement("span"));
7056
+ widget.setAttribute("cm-marker", marker.id);
7057
+ }
7058
+ if (widget) {
7059
+ builder.cm.display.input.setUneditable(widget);
7060
+ builder.content.appendChild(widget);
7061
+ }
7062
+ builder.pos += size;
7063
+ }
7064
+
7065
+ // Outputs a number of spans to make up a line, taking highlighting
7066
+ // and marked text into account.
7067
+ function insertLineContent(line, builder, styles) {
7068
+ var spans = line.markedSpans, allText = line.text, at = 0;
7069
+ if (!spans) {
7070
+ for (var i = 1; i < styles.length; i+=2)
7071
+ builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));
7072
+ return;
7073
+ }
7074
+
7075
+ var len = allText.length, pos = 0, i = 1, text = "", style, css;
7076
+ var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
7077
+ for (;;) {
7078
+ if (nextChange == pos) { // Update current marker set
7079
+ spanStyle = spanEndStyle = spanStartStyle = title = css = "";
7080
+ collapsed = null; nextChange = Infinity;
7081
+ var foundBookmarks = [];
7082
+ for (var j = 0; j < spans.length; ++j) {
7083
+ var sp = spans[j], m = sp.marker;
7084
+ if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
7085
+ foundBookmarks.push(m);
7086
+ } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
7087
+ if (sp.to != null && sp.to != pos && nextChange > sp.to) {
7088
+ nextChange = sp.to;
7089
+ spanEndStyle = "";
7090
+ }
7091
+ if (m.className) spanStyle += " " + m.className;
7092
+ if (m.css) css = m.css;
7093
+ if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
7094
+ if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
7095
+ if (m.title && !title) title = m.title;
7096
+ if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
7097
+ collapsed = sp;
7098
+ } else if (sp.from > pos && nextChange > sp.from) {
7099
+ nextChange = sp.from;
7100
+ }
7101
+ }
7102
+ if (collapsed && (collapsed.from || 0) == pos) {
7103
+ buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
7104
+ collapsed.marker, collapsed.from == null);
7105
+ if (collapsed.to == null) return;
7106
+ if (collapsed.to == pos) collapsed = false;
7107
+ }
7108
+ if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)
7109
+ buildCollapsedSpan(builder, 0, foundBookmarks[j]);
7110
+ }
7111
+ if (pos >= len) break;
7112
+
7113
+ var upto = Math.min(len, nextChange);
7114
+ while (true) {
7115
+ if (text) {
7116
+ var end = pos + text.length;
7117
+ if (!collapsed) {
7118
+ var tokenText = end > upto ? text.slice(0, upto - pos) : text;
7119
+ builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
7120
+ spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);
7121
+ }
7122
+ if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
7123
+ pos = end;
7124
+ spanStartStyle = "";
7125
+ }
7126
+ text = allText.slice(at, at = styles[i++]);
7127
+ style = interpretTokenStyle(styles[i++], builder.cm.options);
7128
+ }
7129
+ }
7130
+ }
7131
+
7132
+ // DOCUMENT DATA STRUCTURE
7133
+
7134
+ // By default, updates that start and end at the beginning of a line
7135
+ // are treated specially, in order to make the association of line
7136
+ // widgets and marker elements with the text behave more intuitive.
7137
+ function isWholeLineUpdate(doc, change) {
7138
+ return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
7139
+ (!doc.cm || doc.cm.options.wholeLineUpdateBefore);
7140
+ }
7141
+
7142
+ // Perform a change on the document data structure.
7143
+ function updateDoc(doc, change, markedSpans, estimateHeight) {
7144
+ function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
7145
+ function update(line, text, spans) {
7146
+ updateLine(line, text, spans, estimateHeight);
7147
+ signalLater(line, "change", line, change);
7148
+ }
7149
+ function linesFor(start, end) {
7150
+ for (var i = start, result = []; i < end; ++i)
7151
+ result.push(new Line(text[i], spansFor(i), estimateHeight));
7152
+ return result;
7153
+ }
7154
+
7155
+ var from = change.from, to = change.to, text = change.text;
7156
+ var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
7157
+ var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
7158
+
7159
+ // Adjust the line structure
7160
+ if (change.full) {
7161
+ doc.insert(0, linesFor(0, text.length));
7162
+ doc.remove(text.length, doc.size - text.length);
7163
+ } else if (isWholeLineUpdate(doc, change)) {
7164
+ // This is a whole-line replace. Treated specially to make
7165
+ // sure line objects move the way they are supposed to.
7166
+ var added = linesFor(0, text.length - 1);
7167
+ update(lastLine, lastLine.text, lastSpans);
7168
+ if (nlines) doc.remove(from.line, nlines);
7169
+ if (added.length) doc.insert(from.line, added);
7170
+ } else if (firstLine == lastLine) {
7171
+ if (text.length == 1) {
7172
+ update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
7173
+ } else {
7174
+ var added = linesFor(1, text.length - 1);
7175
+ added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
7176
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
7177
+ doc.insert(from.line + 1, added);
7178
+ }
7179
+ } else if (text.length == 1) {
7180
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
7181
+ doc.remove(from.line + 1, nlines);
7182
+ } else {
7183
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
7184
+ update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
7185
+ var added = linesFor(1, text.length - 1);
7186
+ if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
7187
+ doc.insert(from.line + 1, added);
7188
+ }
7189
+
7190
+ signalLater(doc, "change", doc, change);
7191
+ }
7192
+
7193
+ // The document is represented as a BTree consisting of leaves, with
7194
+ // chunk of lines in them, and branches, with up to ten leaves or
7195
+ // other branch nodes below them. The top node is always a branch
7196
+ // node, and is the document object itself (meaning it has
7197
+ // additional methods and properties).
7198
+ //
7199
+ // All nodes have parent links. The tree is used both to go from
7200
+ // line numbers to line objects, and to go from objects to numbers.
7201
+ // It also indexes by height, and is used to convert between height
7202
+ // and line object, and to find the total height of the document.
7203
+ //
7204
+ // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
7205
+
7206
+ function LeafChunk(lines) {
7207
+ this.lines = lines;
7208
+ this.parent = null;
7209
+ for (var i = 0, height = 0; i < lines.length; ++i) {
7210
+ lines[i].parent = this;
7211
+ height += lines[i].height;
7212
+ }
7213
+ this.height = height;
7214
+ }
7215
+
7216
+ LeafChunk.prototype = {
7217
+ chunkSize: function() { return this.lines.length; },
7218
+ // Remove the n lines at offset 'at'.
7219
+ removeInner: function(at, n) {
7220
+ for (var i = at, e = at + n; i < e; ++i) {
7221
+ var line = this.lines[i];
7222
+ this.height -= line.height;
7223
+ cleanUpLine(line);
7224
+ signalLater(line, "delete");
7225
+ }
7226
+ this.lines.splice(at, n);
7227
+ },
7228
+ // Helper used to collapse a small branch into a single leaf.
7229
+ collapse: function(lines) {
7230
+ lines.push.apply(lines, this.lines);
7231
+ },
7232
+ // Insert the given array of lines at offset 'at', count them as
7233
+ // having the given height.
7234
+ insertInner: function(at, lines, height) {
7235
+ this.height += height;
7236
+ this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
7237
+ for (var i = 0; i < lines.length; ++i) lines[i].parent = this;
7238
+ },
7239
+ // Used to iterate over a part of the tree.
7240
+ iterN: function(at, n, op) {
7241
+ for (var e = at + n; at < e; ++at)
7242
+ if (op(this.lines[at])) return true;
7243
+ }
7244
+ };
7245
+
7246
+ function BranchChunk(children) {
7247
+ this.children = children;
7248
+ var size = 0, height = 0;
7249
+ for (var i = 0; i < children.length; ++i) {
7250
+ var ch = children[i];
7251
+ size += ch.chunkSize(); height += ch.height;
7252
+ ch.parent = this;
7253
+ }
7254
+ this.size = size;
7255
+ this.height = height;
7256
+ this.parent = null;
7257
+ }
7258
+
7259
+ BranchChunk.prototype = {
7260
+ chunkSize: function() { return this.size; },
7261
+ removeInner: function(at, n) {
7262
+ this.size -= n;
7263
+ for (var i = 0; i < this.children.length; ++i) {
7264
+ var child = this.children[i], sz = child.chunkSize();
7265
+ if (at < sz) {
7266
+ var rm = Math.min(n, sz - at), oldHeight = child.height;
7267
+ child.removeInner(at, rm);
7268
+ this.height -= oldHeight - child.height;
7269
+ if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
7270
+ if ((n -= rm) == 0) break;
7271
+ at = 0;
7272
+ } else at -= sz;
7273
+ }
7274
+ // If the result is smaller than 25 lines, ensure that it is a
7275
+ // single leaf node.
7276
+ if (this.size - n < 25 &&
7277
+ (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
7278
+ var lines = [];
7279
+ this.collapse(lines);
7280
+ this.children = [new LeafChunk(lines)];
7281
+ this.children[0].parent = this;
7282
+ }
7283
+ },
7284
+ collapse: function(lines) {
7285
+ for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);
7286
+ },
7287
+ insertInner: function(at, lines, height) {
7288
+ this.size += lines.length;
7289
+ this.height += height;
7290
+ for (var i = 0; i < this.children.length; ++i) {
7291
+ var child = this.children[i], sz = child.chunkSize();
7292
+ if (at <= sz) {
7293
+ child.insertInner(at, lines, height);
7294
+ if (child.lines && child.lines.length > 50) {
7295
+ while (child.lines.length > 50) {
7296
+ var spilled = child.lines.splice(child.lines.length - 25, 25);
7297
+ var newleaf = new LeafChunk(spilled);
7298
+ child.height -= newleaf.height;
7299
+ this.children.splice(i + 1, 0, newleaf);
7300
+ newleaf.parent = this;
7301
+ }
7302
+ this.maybeSpill();
7303
+ }
7304
+ break;
7305
+ }
7306
+ at -= sz;
7307
+ }
7308
+ },
7309
+ // When a node has grown, check whether it should be split.
7310
+ maybeSpill: function() {
7311
+ if (this.children.length <= 10) return;
7312
+ var me = this;
7313
+ do {
7314
+ var spilled = me.children.splice(me.children.length - 5, 5);
7315
+ var sibling = new BranchChunk(spilled);
7316
+ if (!me.parent) { // Become the parent node
7317
+ var copy = new BranchChunk(me.children);
7318
+ copy.parent = me;
7319
+ me.children = [copy, sibling];
7320
+ me = copy;
7321
+ } else {
7322
+ me.size -= sibling.size;
7323
+ me.height -= sibling.height;
7324
+ var myIndex = indexOf(me.parent.children, me);
7325
+ me.parent.children.splice(myIndex + 1, 0, sibling);
7326
+ }
7327
+ sibling.parent = me.parent;
7328
+ } while (me.children.length > 10);
7329
+ me.parent.maybeSpill();
7330
+ },
7331
+ iterN: function(at, n, op) {
7332
+ for (var i = 0; i < this.children.length; ++i) {
7333
+ var child = this.children[i], sz = child.chunkSize();
7334
+ if (at < sz) {
7335
+ var used = Math.min(n, sz - at);
7336
+ if (child.iterN(at, used, op)) return true;
7337
+ if ((n -= used) == 0) break;
7338
+ at = 0;
7339
+ } else at -= sz;
7340
+ }
7341
+ }
7342
+ };
7343
+
7344
+ var nextDocId = 0;
7345
+ var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) {
7346
+ if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep);
7347
+ if (firstLine == null) firstLine = 0;
7348
+
7349
+ BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
7350
+ this.first = firstLine;
7351
+ this.scrollTop = this.scrollLeft = 0;
7352
+ this.cantEdit = false;
7353
+ this.cleanGeneration = 1;
7354
+ this.frontier = firstLine;
7355
+ var start = Pos(firstLine, 0);
7356
+ this.sel = simpleSelection(start);
7357
+ this.history = new History(null);
7358
+ this.id = ++nextDocId;
7359
+ this.modeOption = mode;
7360
+ this.lineSep = lineSep;
7361
+
7362
+ if (typeof text == "string") text = this.splitLines(text);
7363
+ updateDoc(this, {from: start, to: start, text: text});
7364
+ setSelection(this, simpleSelection(start), sel_dontScroll);
7365
+ };
7366
+
7367
+ Doc.prototype = createObj(BranchChunk.prototype, {
7368
+ constructor: Doc,
7369
+ // Iterate over the document. Supports two forms -- with only one
7370
+ // argument, it calls that for each line in the document. With
7371
+ // three, it iterates over the range given by the first two (with
7372
+ // the second being non-inclusive).
7373
+ iter: function(from, to, op) {
7374
+ if (op) this.iterN(from - this.first, to - from, op);
7375
+ else this.iterN(this.first, this.first + this.size, from);
7376
+ },
7377
+
7378
+ // Non-public interface for adding and removing lines.
7379
+ insert: function(at, lines) {
7380
+ var height = 0;
7381
+ for (var i = 0; i < lines.length; ++i) height += lines[i].height;
7382
+ this.insertInner(at - this.first, lines, height);
7383
+ },
7384
+ remove: function(at, n) { this.removeInner(at - this.first, n); },
7385
+
7386
+ // From here, the methods are part of the public interface. Most
7387
+ // are also available from CodeMirror (editor) instances.
7388
+
7389
+ getValue: function(lineSep) {
7390
+ var lines = getLines(this, this.first, this.first + this.size);
7391
+ if (lineSep === false) return lines;
7392
+ return lines.join(lineSep || this.lineSeparator());
7393
+ },
7394
+ setValue: docMethodOp(function(code) {
7395
+ var top = Pos(this.first, 0), last = this.first + this.size - 1;
7396
+ makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
7397
+ text: this.splitLines(code), origin: "setValue", full: true}, true);
7398
+ setSelection(this, simpleSelection(top));
7399
+ }),
7400
+ replaceRange: function(code, from, to, origin) {
7401
+ from = clipPos(this, from);
7402
+ to = to ? clipPos(this, to) : from;
7403
+ replaceRange(this, code, from, to, origin);
7404
+ },
7405
+ getRange: function(from, to, lineSep) {
7406
+ var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
7407
+ if (lineSep === false) return lines;
7408
+ return lines.join(lineSep || this.lineSeparator());
7409
+ },
7410
+
7411
+ getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
7412
+
7413
+ getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
7414
+ getLineNumber: function(line) {return lineNo(line);},
7415
+
7416
+ getLineHandleVisualStart: function(line) {
7417
+ if (typeof line == "number") line = getLine(this, line);
7418
+ return visualLine(line);
7419
+ },
7420
+
7421
+ lineCount: function() {return this.size;},
7422
+ firstLine: function() {return this.first;},
7423
+ lastLine: function() {return this.first + this.size - 1;},
7424
+
7425
+ clipPos: function(pos) {return clipPos(this, pos);},
7426
+
7427
+ getCursor: function(start) {
7428
+ var range = this.sel.primary(), pos;
7429
+ if (start == null || start == "head") pos = range.head;
7430
+ else if (start == "anchor") pos = range.anchor;
7431
+ else if (start == "end" || start == "to" || start === false) pos = range.to();
7432
+ else pos = range.from();
7433
+ return pos;
7434
+ },
7435
+ listSelections: function() { return this.sel.ranges; },
7436
+ somethingSelected: function() {return this.sel.somethingSelected();},
7437
+
7438
+ setCursor: docMethodOp(function(line, ch, options) {
7439
+ setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
7440
+ }),
7441
+ setSelection: docMethodOp(function(anchor, head, options) {
7442
+ setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
7443
+ }),
7444
+ extendSelection: docMethodOp(function(head, other, options) {
7445
+ extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
7446
+ }),
7447
+ extendSelections: docMethodOp(function(heads, options) {
7448
+ extendSelections(this, clipPosArray(this, heads, options));
7449
+ }),
7450
+ extendSelectionsBy: docMethodOp(function(f, options) {
7451
+ extendSelections(this, map(this.sel.ranges, f), options);
7452
+ }),
7453
+ setSelections: docMethodOp(function(ranges, primary, options) {
7454
+ if (!ranges.length) return;
7455
+ for (var i = 0, out = []; i < ranges.length; i++)
7456
+ out[i] = new Range(clipPos(this, ranges[i].anchor),
7457
+ clipPos(this, ranges[i].head));
7458
+ if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);
7459
+ setSelection(this, normalizeSelection(out, primary), options);
7460
+ }),
7461
+ addSelection: docMethodOp(function(anchor, head, options) {
7462
+ var ranges = this.sel.ranges.slice(0);
7463
+ ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
7464
+ setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);
7465
+ }),
7466
+
7467
+ getSelection: function(lineSep) {
7468
+ var ranges = this.sel.ranges, lines;
7469
+ for (var i = 0; i < ranges.length; i++) {
7470
+ var sel = getBetween(this, ranges[i].from(), ranges[i].to());
7471
+ lines = lines ? lines.concat(sel) : sel;
7472
+ }
7473
+ if (lineSep === false) return lines;
7474
+ else return lines.join(lineSep || this.lineSeparator());
7475
+ },
7476
+ getSelections: function(lineSep) {
7477
+ var parts = [], ranges = this.sel.ranges;
7478
+ for (var i = 0; i < ranges.length; i++) {
7479
+ var sel = getBetween(this, ranges[i].from(), ranges[i].to());
7480
+ if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator());
7481
+ parts[i] = sel;
7482
+ }
7483
+ return parts;
7484
+ },
7485
+ replaceSelection: function(code, collapse, origin) {
7486
+ var dup = [];
7487
+ for (var i = 0; i < this.sel.ranges.length; i++)
7488
+ dup[i] = code;
7489
+ this.replaceSelections(dup, collapse, origin || "+input");
7490
+ },
7491
+ replaceSelections: docMethodOp(function(code, collapse, origin) {
7492
+ var changes = [], sel = this.sel;
7493
+ for (var i = 0; i < sel.ranges.length; i++) {
7494
+ var range = sel.ranges[i];
7495
+ changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
7496
+ }
7497
+ var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
7498
+ for (var i = changes.length - 1; i >= 0; i--)
7499
+ makeChange(this, changes[i]);
7500
+ if (newSel) setSelectionReplaceHistory(this, newSel);
7501
+ else if (this.cm) ensureCursorVisible(this.cm);
7502
+ }),
7503
+ undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
7504
+ redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
7505
+ undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
7506
+ redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
7507
+
7508
+ setExtending: function(val) {this.extend = val;},
7509
+ getExtending: function() {return this.extend;},
7510
+
7511
+ historySize: function() {
7512
+ var hist = this.history, done = 0, undone = 0;
7513
+ for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;
7514
+ for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;
7515
+ return {undo: done, redo: undone};
7516
+ },
7517
+ clearHistory: function() {this.history = new History(this.history.maxGeneration);},
7518
+
7519
+ markClean: function() {
7520
+ this.cleanGeneration = this.changeGeneration(true);
7521
+ },
7522
+ changeGeneration: function(forceSplit) {
7523
+ if (forceSplit)
7524
+ this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;
7525
+ return this.history.generation;
7526
+ },
7527
+ isClean: function (gen) {
7528
+ return this.history.generation == (gen || this.cleanGeneration);
7529
+ },
7530
+
7531
+ getHistory: function() {
7532
+ return {done: copyHistoryArray(this.history.done),
7533
+ undone: copyHistoryArray(this.history.undone)};
7534
+ },
7535
+ setHistory: function(histData) {
7536
+ var hist = this.history = new History(this.history.maxGeneration);
7537
+ hist.done = copyHistoryArray(histData.done.slice(0), null, true);
7538
+ hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
7539
+ },
7540
+
7541
+ addLineClass: docMethodOp(function(handle, where, cls) {
7542
+ return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
7543
+ var prop = where == "text" ? "textClass"
7544
+ : where == "background" ? "bgClass"
7545
+ : where == "gutter" ? "gutterClass" : "wrapClass";
7546
+ if (!line[prop]) line[prop] = cls;
7547
+ else if (classTest(cls).test(line[prop])) return false;
7548
+ else line[prop] += " " + cls;
7549
+ return true;
7550
+ });
7551
+ }),
7552
+ removeLineClass: docMethodOp(function(handle, where, cls) {
7553
+ return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
7554
+ var prop = where == "text" ? "textClass"
7555
+ : where == "background" ? "bgClass"
7556
+ : where == "gutter" ? "gutterClass" : "wrapClass";
7557
+ var cur = line[prop];
7558
+ if (!cur) return false;
7559
+ else if (cls == null) line[prop] = null;
7560
+ else {
7561
+ var found = cur.match(classTest(cls));
7562
+ if (!found) return false;
7563
+ var end = found.index + found[0].length;
7564
+ line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
7565
+ }
7566
+ return true;
7567
+ });
7568
+ }),
7569
+
7570
+ addLineWidget: docMethodOp(function(handle, node, options) {
7571
+ return addLineWidget(this, handle, node, options);
7572
+ }),
7573
+ removeLineWidget: function(widget) { widget.clear(); },
7574
+
7575
+ markText: function(from, to, options) {
7576
+ return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range");
7577
+ },
7578
+ setBookmark: function(pos, options) {
7579
+ var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
7580
+ insertLeft: options && options.insertLeft,
7581
+ clearWhenEmpty: false, shared: options && options.shared,
7582
+ handleMouseEvents: options && options.handleMouseEvents};
7583
+ pos = clipPos(this, pos);
7584
+ return markText(this, pos, pos, realOpts, "bookmark");
7585
+ },
7586
+ findMarksAt: function(pos) {
7587
+ pos = clipPos(this, pos);
7588
+ var markers = [], spans = getLine(this, pos.line).markedSpans;
7589
+ if (spans) for (var i = 0; i < spans.length; ++i) {
7590
+ var span = spans[i];
7591
+ if ((span.from == null || span.from <= pos.ch) &&
7592
+ (span.to == null || span.to >= pos.ch))
7593
+ markers.push(span.marker.parent || span.marker);
7594
+ }
7595
+ return markers;
7596
+ },
7597
+ findMarks: function(from, to, filter) {
7598
+ from = clipPos(this, from); to = clipPos(this, to);
7599
+ var found = [], lineNo = from.line;
7600
+ this.iter(from.line, to.line + 1, function(line) {
7601
+ var spans = line.markedSpans;
7602
+ if (spans) for (var i = 0; i < spans.length; i++) {
7603
+ var span = spans[i];
7604
+ if (!(lineNo == from.line && from.ch > span.to ||
7605
+ span.from == null && lineNo != from.line||
7606
+ lineNo == to.line && span.from > to.ch) &&
7607
+ (!filter || filter(span.marker)))
7608
+ found.push(span.marker.parent || span.marker);
7609
+ }
7610
+ ++lineNo;
7611
+ });
7612
+ return found;
7613
+ },
7614
+ getAllMarks: function() {
7615
+ var markers = [];
7616
+ this.iter(function(line) {
7617
+ var sps = line.markedSpans;
7618
+ if (sps) for (var i = 0; i < sps.length; ++i)
7619
+ if (sps[i].from != null) markers.push(sps[i].marker);
7620
+ });
7621
+ return markers;
7622
+ },
7623
+
7624
+ posFromIndex: function(off) {
7625
+ var ch, lineNo = this.first;
7626
+ this.iter(function(line) {
7627
+ var sz = line.text.length + 1;
7628
+ if (sz > off) { ch = off; return true; }
7629
+ off -= sz;
7630
+ ++lineNo;
7631
+ });
7632
+ return clipPos(this, Pos(lineNo, ch));
7633
+ },
7634
+ indexFromPos: function (coords) {
7635
+ coords = clipPos(this, coords);
7636
+ var index = coords.ch;
7637
+ if (coords.line < this.first || coords.ch < 0) return 0;
7638
+ this.iter(this.first, coords.line, function (line) {
7639
+ index += line.text.length + 1;
7640
+ });
7641
+ return index;
7642
+ },
7643
+
7644
+ copy: function(copyHistory) {
7645
+ var doc = new Doc(getLines(this, this.first, this.first + this.size),
7646
+ this.modeOption, this.first, this.lineSep);
7647
+ doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
7648
+ doc.sel = this.sel;
7649
+ doc.extend = false;
7650
+ if (copyHistory) {
7651
+ doc.history.undoDepth = this.history.undoDepth;
7652
+ doc.setHistory(this.getHistory());
7653
+ }
7654
+ return doc;
7655
+ },
7656
+
7657
+ linkedDoc: function(options) {
7658
+ if (!options) options = {};
7659
+ var from = this.first, to = this.first + this.size;
7660
+ if (options.from != null && options.from > from) from = options.from;
7661
+ if (options.to != null && options.to < to) to = options.to;
7662
+ var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep);
7663
+ if (options.sharedHist) copy.history = this.history;
7664
+ (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
7665
+ copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
7666
+ copySharedMarkers(copy, findSharedMarkers(this));
7667
+ return copy;
7668
+ },
7669
+ unlinkDoc: function(other) {
7670
+ if (other instanceof CodeMirror) other = other.doc;
7671
+ if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
7672
+ var link = this.linked[i];
7673
+ if (link.doc != other) continue;
7674
+ this.linked.splice(i, 1);
7675
+ other.unlinkDoc(this);
7676
+ detachSharedMarkers(findSharedMarkers(this));
7677
+ break;
7678
+ }
7679
+ // If the histories were shared, split them again
7680
+ if (other.history == this.history) {
7681
+ var splitIds = [other.id];
7682
+ linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
7683
+ other.history = new History(null);
7684
+ other.history.done = copyHistoryArray(this.history.done, splitIds);
7685
+ other.history.undone = copyHistoryArray(this.history.undone, splitIds);
7686
+ }
7687
+ },
7688
+ iterLinkedDocs: function(f) {linkedDocs(this, f);},
7689
+
7690
+ getMode: function() {return this.mode;},
7691
+ getEditor: function() {return this.cm;},
7692
+
7693
+ splitLines: function(str) {
7694
+ if (this.lineSep) return str.split(this.lineSep);
7695
+ return splitLinesAuto(str);
7696
+ },
7697
+ lineSeparator: function() { return this.lineSep || "\n"; }
7698
+ });
7699
+
7700
+ // Public alias.
7701
+ Doc.prototype.eachLine = Doc.prototype.iter;
7702
+
7703
+ // Set up methods on CodeMirror's prototype to redirect to the editor's document.
7704
+ var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
7705
+ for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
7706
+ CodeMirror.prototype[prop] = (function(method) {
7707
+ return function() {return method.apply(this.doc, arguments);};
7708
+ })(Doc.prototype[prop]);
7709
+
7710
+ eventMixin(Doc);
7711
+
7712
+ // Call f for all linked documents.
7713
+ function linkedDocs(doc, f, sharedHistOnly) {
7714
+ function propagate(doc, skip, sharedHist) {
7715
+ if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
7716
+ var rel = doc.linked[i];
7717
+ if (rel.doc == skip) continue;
7718
+ var shared = sharedHist && rel.sharedHist;
7719
+ if (sharedHistOnly && !shared) continue;
7720
+ f(rel.doc, shared);
7721
+ propagate(rel.doc, doc, shared);
7722
+ }
7723
+ }
7724
+ propagate(doc, null, true);
7725
+ }
7726
+
7727
+ // Attach a document to an editor.
7728
+ function attachDoc(cm, doc) {
7729
+ if (doc.cm) throw new Error("This document is already in use.");
7730
+ cm.doc = doc;
7731
+ doc.cm = cm;
7732
+ estimateLineHeights(cm);
7733
+ loadMode(cm);
7734
+ if (!cm.options.lineWrapping) findMaxLine(cm);
7735
+ cm.options.mode = doc.modeOption;
7736
+ regChange(cm);
7737
+ }
7738
+
7739
+ // LINE UTILITIES
7740
+
7741
+ // Find the line object corresponding to the given line number.
7742
+ function getLine(doc, n) {
7743
+ n -= doc.first;
7744
+ if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");
7745
+ for (var chunk = doc; !chunk.lines;) {
7746
+ for (var i = 0;; ++i) {
7747
+ var child = chunk.children[i], sz = child.chunkSize();
7748
+ if (n < sz) { chunk = child; break; }
7749
+ n -= sz;
7750
+ }
7751
+ }
7752
+ return chunk.lines[n];
7753
+ }
7754
+
7755
+ // Get the part of a document between two positions, as an array of
7756
+ // strings.
7757
+ function getBetween(doc, start, end) {
7758
+ var out = [], n = start.line;
7759
+ doc.iter(start.line, end.line + 1, function(line) {
7760
+ var text = line.text;
7761
+ if (n == end.line) text = text.slice(0, end.ch);
7762
+ if (n == start.line) text = text.slice(start.ch);
7763
+ out.push(text);
7764
+ ++n;
7765
+ });
7766
+ return out;
7767
+ }
7768
+ // Get the lines between from and to, as array of strings.
7769
+ function getLines(doc, from, to) {
7770
+ var out = [];
7771
+ doc.iter(from, to, function(line) { out.push(line.text); });
7772
+ return out;
7773
+ }
7774
+
7775
+ // Update the height of a line, propagating the height change
7776
+ // upwards to parent nodes.
7777
+ function updateLineHeight(line, height) {
7778
+ var diff = height - line.height;
7779
+ if (diff) for (var n = line; n; n = n.parent) n.height += diff;
7780
+ }
7781
+
7782
+ // Given a line object, find its line number by walking up through
7783
+ // its parent links.
7784
+ function lineNo(line) {
7785
+ if (line.parent == null) return null;
7786
+ var cur = line.parent, no = indexOf(cur.lines, line);
7787
+ for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
7788
+ for (var i = 0;; ++i) {
7789
+ if (chunk.children[i] == cur) break;
7790
+ no += chunk.children[i].chunkSize();
7791
+ }
7792
+ }
7793
+ return no + cur.first;
7794
+ }
7795
+
7796
+ // Find the line at the given vertical position, using the height
7797
+ // information in the document tree.
7798
+ function lineAtHeight(chunk, h) {
7799
+ var n = chunk.first;
7800
+ outer: do {
7801
+ for (var i = 0; i < chunk.children.length; ++i) {
7802
+ var child = chunk.children[i], ch = child.height;
7803
+ if (h < ch) { chunk = child; continue outer; }
7804
+ h -= ch;
7805
+ n += child.chunkSize();
7806
+ }
7807
+ return n;
7808
+ } while (!chunk.lines);
7809
+ for (var i = 0; i < chunk.lines.length; ++i) {
7810
+ var line = chunk.lines[i], lh = line.height;
7811
+ if (h < lh) break;
7812
+ h -= lh;
7813
+ }
7814
+ return n + i;
7815
+ }
7816
+
7817
+
7818
+ // Find the height above the given line.
7819
+ function heightAtLine(lineObj) {
7820
+ lineObj = visualLine(lineObj);
7821
+
7822
+ var h = 0, chunk = lineObj.parent;
7823
+ for (var i = 0; i < chunk.lines.length; ++i) {
7824
+ var line = chunk.lines[i];
7825
+ if (line == lineObj) break;
7826
+ else h += line.height;
7827
+ }
7828
+ for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
7829
+ for (var i = 0; i < p.children.length; ++i) {
7830
+ var cur = p.children[i];
7831
+ if (cur == chunk) break;
7832
+ else h += cur.height;
7833
+ }
7834
+ }
7835
+ return h;
7836
+ }
7837
+
7838
+ // Get the bidi ordering for the given line (and cache it). Returns
7839
+ // false for lines that are fully left-to-right, and an array of
7840
+ // BidiSpan objects otherwise.
7841
+ function getOrder(line) {
7842
+ var order = line.order;
7843
+ if (order == null) order = line.order = bidiOrdering(line.text);
7844
+ return order;
7845
+ }
7846
+
7847
+ // HISTORY
7848
+
7849
+ function History(startGen) {
7850
+ // Arrays of change events and selections. Doing something adds an
7851
+ // event to done and clears undo. Undoing moves events from done
7852
+ // to undone, redoing moves them in the other direction.
7853
+ this.done = []; this.undone = [];
7854
+ this.undoDepth = Infinity;
7855
+ // Used to track when changes can be merged into a single undo
7856
+ // event
7857
+ this.lastModTime = this.lastSelTime = 0;
7858
+ this.lastOp = this.lastSelOp = null;
7859
+ this.lastOrigin = this.lastSelOrigin = null;
7860
+ // Used by the isClean() method
7861
+ this.generation = this.maxGeneration = startGen || 1;
7862
+ }
7863
+
7864
+ // Create a history change event from an updateDoc-style change
7865
+ // object.
7866
+ function historyChangeFromChange(doc, change) {
7867
+ var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
7868
+ attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
7869
+ linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
7870
+ return histChange;
7871
+ }
7872
+
7873
+ // Pop all selection events off the end of a history array. Stop at
7874
+ // a change event.
7875
+ function clearSelectionEvents(array) {
7876
+ while (array.length) {
7877
+ var last = lst(array);
7878
+ if (last.ranges) array.pop();
7879
+ else break;
7880
+ }
7881
+ }
7882
+
7883
+ // Find the top change event in the history. Pop off selection
7884
+ // events that are in the way.
7885
+ function lastChangeEvent(hist, force) {
7886
+ if (force) {
7887
+ clearSelectionEvents(hist.done);
7888
+ return lst(hist.done);
7889
+ } else if (hist.done.length && !lst(hist.done).ranges) {
7890
+ return lst(hist.done);
7891
+ } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
7892
+ hist.done.pop();
7893
+ return lst(hist.done);
7894
+ }
7895
+ }
7896
+
7897
+ // Register a change in the history. Merges changes that are within
7898
+ // a single operation, ore are close together with an origin that
7899
+ // allows merging (starting with "+") into a single event.
7900
+ function addChangeToHistory(doc, change, selAfter, opId) {
7901
+ var hist = doc.history;
7902
+ hist.undone.length = 0;
7903
+ var time = +new Date, cur;
7904
+
7905
+ if ((hist.lastOp == opId ||
7906
+ hist.lastOrigin == change.origin && change.origin &&
7907
+ ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||
7908
+ change.origin.charAt(0) == "*")) &&
7909
+ (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
7910
+ // Merge this change into the last event
7911
+ var last = lst(cur.changes);
7912
+ if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
7913
+ // Optimized case for simple insertion -- don't want to add
7914
+ // new changesets for every character typed
7915
+ last.to = changeEnd(change);
7916
+ } else {
7917
+ // Add new sub-event
7918
+ cur.changes.push(historyChangeFromChange(doc, change));
7919
+ }
7920
+ } else {
7921
+ // Can not be merged, start a new event.
7922
+ var before = lst(hist.done);
7923
+ if (!before || !before.ranges)
7924
+ pushSelectionToHistory(doc.sel, hist.done);
7925
+ cur = {changes: [historyChangeFromChange(doc, change)],
7926
+ generation: hist.generation};
7927
+ hist.done.push(cur);
7928
+ while (hist.done.length > hist.undoDepth) {
7929
+ hist.done.shift();
7930
+ if (!hist.done[0].ranges) hist.done.shift();
7931
+ }
7932
+ }
7933
+ hist.done.push(selAfter);
7934
+ hist.generation = ++hist.maxGeneration;
7935
+ hist.lastModTime = hist.lastSelTime = time;
7936
+ hist.lastOp = hist.lastSelOp = opId;
7937
+ hist.lastOrigin = hist.lastSelOrigin = change.origin;
7938
+
7939
+ if (!last) signal(doc, "historyAdded");
7940
+ }
7941
+
7942
+ function selectionEventCanBeMerged(doc, origin, prev, sel) {
7943
+ var ch = origin.charAt(0);
7944
+ return ch == "*" ||
7945
+ ch == "+" &&
7946
+ prev.ranges.length == sel.ranges.length &&
7947
+ prev.somethingSelected() == sel.somethingSelected() &&
7948
+ new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);
7949
+ }
7950
+
7951
+ // Called whenever the selection changes, sets the new selection as
7952
+ // the pending selection in the history, and pushes the old pending
7953
+ // selection into the 'done' array when it was significantly
7954
+ // different (in number of selected ranges, emptiness, or time).
7955
+ function addSelectionToHistory(doc, sel, opId, options) {
7956
+ var hist = doc.history, origin = options && options.origin;
7957
+
7958
+ // A new event is started when the previous origin does not match
7959
+ // the current, or the origins don't allow matching. Origins
7960
+ // starting with * are always merged, those starting with + are
7961
+ // merged when similar and close together in time.
7962
+ if (opId == hist.lastSelOp ||
7963
+ (origin && hist.lastSelOrigin == origin &&
7964
+ (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
7965
+ selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
7966
+ hist.done[hist.done.length - 1] = sel;
7967
+ else
7968
+ pushSelectionToHistory(sel, hist.done);
7969
+
7970
+ hist.lastSelTime = +new Date;
7971
+ hist.lastSelOrigin = origin;
7972
+ hist.lastSelOp = opId;
7973
+ if (options && options.clearRedo !== false)
7974
+ clearSelectionEvents(hist.undone);
7975
+ }
7976
+
7977
+ function pushSelectionToHistory(sel, dest) {
7978
+ var top = lst(dest);
7979
+ if (!(top && top.ranges && top.equals(sel)))
7980
+ dest.push(sel);
7981
+ }
7982
+
7983
+ // Used to store marked span information in the history.
7984
+ function attachLocalSpans(doc, change, from, to) {
7985
+ var existing = change["spans_" + doc.id], n = 0;
7986
+ doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
7987
+ if (line.markedSpans)
7988
+ (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
7989
+ ++n;
7990
+ });
7991
+ }
7992
+
7993
+ // When un/re-doing restores text containing marked spans, those
7994
+ // that have been explicitly cleared should not be restored.
7995
+ function removeClearedSpans(spans) {
7996
+ if (!spans) return null;
7997
+ for (var i = 0, out; i < spans.length; ++i) {
7998
+ if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
7999
+ else if (out) out.push(spans[i]);
8000
+ }
8001
+ return !out ? spans : out.length ? out : null;
8002
+ }
8003
+
8004
+ // Retrieve and filter the old marked spans stored in a change event.
8005
+ function getOldSpans(doc, change) {
8006
+ var found = change["spans_" + doc.id];
8007
+ if (!found) return null;
8008
+ for (var i = 0, nw = []; i < change.text.length; ++i)
8009
+ nw.push(removeClearedSpans(found[i]));
8010
+ return nw;
8011
+ }
8012
+
8013
+ // Used both to provide a JSON-safe object in .getHistory, and, when
8014
+ // detaching a document, to split the history in two
8015
+ function copyHistoryArray(events, newGroup, instantiateSel) {
8016
+ for (var i = 0, copy = []; i < events.length; ++i) {
8017
+ var event = events[i];
8018
+ if (event.ranges) {
8019
+ copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
8020
+ continue;
8021
+ }
8022
+ var changes = event.changes, newChanges = [];
8023
+ copy.push({changes: newChanges});
8024
+ for (var j = 0; j < changes.length; ++j) {
8025
+ var change = changes[j], m;
8026
+ newChanges.push({from: change.from, to: change.to, text: change.text});
8027
+ if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
8028
+ if (indexOf(newGroup, Number(m[1])) > -1) {
8029
+ lst(newChanges)[prop] = change[prop];
8030
+ delete change[prop];
8031
+ }
8032
+ }
8033
+ }
8034
+ }
8035
+ return copy;
8036
+ }
8037
+
8038
+ // Rebasing/resetting history to deal with externally-sourced changes
8039
+
8040
+ function rebaseHistSelSingle(pos, from, to, diff) {
8041
+ if (to < pos.line) {
8042
+ pos.line += diff;
8043
+ } else if (from < pos.line) {
8044
+ pos.line = from;
8045
+ pos.ch = 0;
8046
+ }
8047
+ }
8048
+
8049
+ // Tries to rebase an array of history events given a change in the
8050
+ // document. If the change touches the same lines as the event, the
8051
+ // event, and everything 'behind' it, is discarded. If the change is
8052
+ // before the event, the event's positions are updated. Uses a
8053
+ // copy-on-write scheme for the positions, to avoid having to
8054
+ // reallocate them all on every rebase, but also avoid problems with
8055
+ // shared position objects being unsafely updated.
8056
+ function rebaseHistArray(array, from, to, diff) {
8057
+ for (var i = 0; i < array.length; ++i) {
8058
+ var sub = array[i], ok = true;
8059
+ if (sub.ranges) {
8060
+ if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
8061
+ for (var j = 0; j < sub.ranges.length; j++) {
8062
+ rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
8063
+ rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
8064
+ }
8065
+ continue;
8066
+ }
8067
+ for (var j = 0; j < sub.changes.length; ++j) {
8068
+ var cur = sub.changes[j];
8069
+ if (to < cur.from.line) {
8070
+ cur.from = Pos(cur.from.line + diff, cur.from.ch);
8071
+ cur.to = Pos(cur.to.line + diff, cur.to.ch);
8072
+ } else if (from <= cur.to.line) {
8073
+ ok = false;
8074
+ break;
8075
+ }
8076
+ }
8077
+ if (!ok) {
8078
+ array.splice(0, i + 1);
8079
+ i = 0;
8080
+ }
8081
+ }
8082
+ }
8083
+
8084
+ function rebaseHist(hist, change) {
8085
+ var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
8086
+ rebaseHistArray(hist.done, from, to, diff);
8087
+ rebaseHistArray(hist.undone, from, to, diff);
8088
+ }
8089
+
8090
+ // EVENT UTILITIES
8091
+
8092
+ // Due to the fact that we still support jurassic IE versions, some
8093
+ // compatibility wrappers are needed.
8094
+
8095
+ var e_preventDefault = CodeMirror.e_preventDefault = function(e) {
8096
+ if (e.preventDefault) e.preventDefault();
8097
+ else e.returnValue = false;
8098
+ };
8099
+ var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {
8100
+ if (e.stopPropagation) e.stopPropagation();
8101
+ else e.cancelBubble = true;
8102
+ };
8103
+ function e_defaultPrevented(e) {
8104
+ return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
8105
+ }
8106
+ var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};
8107
+
8108
+ function e_target(e) {return e.target || e.srcElement;}
8109
+ function e_button(e) {
8110
+ var b = e.which;
8111
+ if (b == null) {
8112
+ if (e.button & 1) b = 1;
8113
+ else if (e.button & 2) b = 3;
8114
+ else if (e.button & 4) b = 2;
8115
+ }
8116
+ if (mac && e.ctrlKey && b == 1) b = 3;
8117
+ return b;
8118
+ }
8119
+
8120
+ // EVENT HANDLING
8121
+
8122
+ // Lightweight event framework. on/off also work on DOM nodes,
8123
+ // registering native DOM handlers.
8124
+
8125
+ var on = CodeMirror.on = function(emitter, type, f) {
8126
+ if (emitter.addEventListener)
8127
+ emitter.addEventListener(type, f, false);
8128
+ else if (emitter.attachEvent)
8129
+ emitter.attachEvent("on" + type, f);
8130
+ else {
8131
+ var map = emitter._handlers || (emitter._handlers = {});
8132
+ var arr = map[type] || (map[type] = []);
8133
+ arr.push(f);
8134
+ }
8135
+ };
8136
+
8137
+ var noHandlers = []
8138
+ function getHandlers(emitter, type, copy) {
8139
+ var arr = emitter._handlers && emitter._handlers[type]
8140
+ if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers
8141
+ else return arr || noHandlers
8142
+ }
8143
+
8144
+ var off = CodeMirror.off = function(emitter, type, f) {
8145
+ if (emitter.removeEventListener)
8146
+ emitter.removeEventListener(type, f, false);
8147
+ else if (emitter.detachEvent)
8148
+ emitter.detachEvent("on" + type, f);
8149
+ else {
8150
+ var handlers = getHandlers(emitter, type, false)
8151
+ for (var i = 0; i < handlers.length; ++i)
8152
+ if (handlers[i] == f) { handlers.splice(i, 1); break; }
8153
+ }
8154
+ };
8155
+
8156
+ var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {
8157
+ var handlers = getHandlers(emitter, type, true)
8158
+ if (!handlers.length) return;
8159
+ var args = Array.prototype.slice.call(arguments, 2);
8160
+ for (var i = 0; i < handlers.length; ++i) handlers[i].apply(null, args);
8161
+ };
8162
+
8163
+ var orphanDelayedCallbacks = null;
8164
+
8165
+ // Often, we want to signal events at a point where we are in the
8166
+ // middle of some work, but don't want the handler to start calling
8167
+ // other methods on the editor, which might be in an inconsistent
8168
+ // state or simply not expect any other events to happen.
8169
+ // signalLater looks whether there are any handlers, and schedules
8170
+ // them to be executed when the last operation ends, or, if no
8171
+ // operation is active, when a timeout fires.
8172
+ function signalLater(emitter, type /*, values...*/) {
8173
+ var arr = getHandlers(emitter, type, false)
8174
+ if (!arr.length) return;
8175
+ var args = Array.prototype.slice.call(arguments, 2), list;
8176
+ if (operationGroup) {
8177
+ list = operationGroup.delayedCallbacks;
8178
+ } else if (orphanDelayedCallbacks) {
8179
+ list = orphanDelayedCallbacks;
8180
+ } else {
8181
+ list = orphanDelayedCallbacks = [];
8182
+ setTimeout(fireOrphanDelayed, 0);
8183
+ }
8184
+ function bnd(f) {return function(){f.apply(null, args);};};
8185
+ for (var i = 0; i < arr.length; ++i)
8186
+ list.push(bnd(arr[i]));
8187
+ }
8188
+
8189
+ function fireOrphanDelayed() {
8190
+ var delayed = orphanDelayedCallbacks;
8191
+ orphanDelayedCallbacks = null;
8192
+ for (var i = 0; i < delayed.length; ++i) delayed[i]();
8193
+ }
8194
+
8195
+ // The DOM events that CodeMirror handles can be overridden by
8196
+ // registering a (non-DOM) handler on the editor for the event name,
8197
+ // and preventDefault-ing the event in that handler.
8198
+ function signalDOMEvent(cm, e, override) {
8199
+ if (typeof e == "string")
8200
+ e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};
8201
+ signal(cm, override || e.type, cm, e);
8202
+ return e_defaultPrevented(e) || e.codemirrorIgnore;
8203
+ }
8204
+
8205
+ function signalCursorActivity(cm) {
8206
+ var arr = cm._handlers && cm._handlers.cursorActivity;
8207
+ if (!arr) return;
8208
+ var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
8209
+ for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
8210
+ set.push(arr[i]);
8211
+ }
8212
+
8213
+ function hasHandler(emitter, type) {
8214
+ return getHandlers(emitter, type).length > 0
8215
+ }
8216
+
8217
+ // Add on and off methods to a constructor's prototype, to make
8218
+ // registering events on such objects more convenient.
8219
+ function eventMixin(ctor) {
8220
+ ctor.prototype.on = function(type, f) {on(this, type, f);};
8221
+ ctor.prototype.off = function(type, f) {off(this, type, f);};
8222
+ }
8223
+
8224
+ // MISC UTILITIES
8225
+
8226
+ // Number of pixels added to scroller and sizer to hide scrollbar
8227
+ var scrollerGap = 30;
8228
+
8229
+ // Returned or thrown by various protocols to signal 'I'm not
8230
+ // handling this'.
8231
+ var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
8232
+
8233
+ // Reused option objects for setSelection & friends
8234
+ var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
8235
+
8236
+ function Delayed() {this.id = null;}
8237
+ Delayed.prototype.set = function(ms, f) {
8238
+ clearTimeout(this.id);
8239
+ this.id = setTimeout(f, ms);
8240
+ };
8241
+
8242
+ // Counts the column offset in a string, taking tabs into account.
8243
+ // Used mostly to find indentation.
8244
+ var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {
8245
+ if (end == null) {
8246
+ end = string.search(/[^\s\u00a0]/);
8247
+ if (end == -1) end = string.length;
8248
+ }
8249
+ for (var i = startIndex || 0, n = startValue || 0;;) {
8250
+ var nextTab = string.indexOf("\t", i);
8251
+ if (nextTab < 0 || nextTab >= end)
8252
+ return n + (end - i);
8253
+ n += nextTab - i;
8254
+ n += tabSize - (n % tabSize);
8255
+ i = nextTab + 1;
8256
+ }
8257
+ };
8258
+
8259
+ // The inverse of countColumn -- find the offset that corresponds to
8260
+ // a particular column.
8261
+ var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) {
8262
+ for (var pos = 0, col = 0;;) {
8263
+ var nextTab = string.indexOf("\t", pos);
8264
+ if (nextTab == -1) nextTab = string.length;
8265
+ var skipped = nextTab - pos;
8266
+ if (nextTab == string.length || col + skipped >= goal)
8267
+ return pos + Math.min(skipped, goal - col);
8268
+ col += nextTab - pos;
8269
+ col += tabSize - (col % tabSize);
8270
+ pos = nextTab + 1;
8271
+ if (col >= goal) return pos;
8272
+ }
8273
+ }
8274
+
8275
+ var spaceStrs = [""];
8276
+ function spaceStr(n) {
8277
+ while (spaceStrs.length <= n)
8278
+ spaceStrs.push(lst(spaceStrs) + " ");
8279
+ return spaceStrs[n];
8280
+ }
8281
+
8282
+ function lst(arr) { return arr[arr.length-1]; }
8283
+
8284
+ var selectInput = function(node) { node.select(); };
8285
+ if (ios) // Mobile Safari apparently has a bug where select() is broken.
8286
+ selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };
8287
+ else if (ie) // Suppress mysterious IE10 errors
8288
+ selectInput = function(node) { try { node.select(); } catch(_e) {} };
8289
+
8290
+ function indexOf(array, elt) {
8291
+ for (var i = 0; i < array.length; ++i)
8292
+ if (array[i] == elt) return i;
8293
+ return -1;
8294
+ }
8295
+ function map(array, f) {
8296
+ var out = [];
8297
+ for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);
8298
+ return out;
8299
+ }
8300
+
8301
+ function nothing() {}
8302
+
8303
+ function createObj(base, props) {
8304
+ var inst;
8305
+ if (Object.create) {
8306
+ inst = Object.create(base);
8307
+ } else {
8308
+ nothing.prototype = base;
8309
+ inst = new nothing();
8310
+ }
8311
+ if (props) copyObj(props, inst);
8312
+ return inst;
8313
+ };
8314
+
8315
+ function copyObj(obj, target, overwrite) {
8316
+ if (!target) target = {};
8317
+ for (var prop in obj)
8318
+ if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
8319
+ target[prop] = obj[prop];
8320
+ return target;
8321
+ }
8322
+
8323
+ function bind(f) {
8324
+ var args = Array.prototype.slice.call(arguments, 1);
8325
+ return function(){return f.apply(null, args);};
8326
+ }
8327
+
8328
+ var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
8329
+ var isWordCharBasic = CodeMirror.isWordChar = function(ch) {
8330
+ return /\w/.test(ch) || ch > "\x80" &&
8331
+ (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
8332
+ };
8333
+ function isWordChar(ch, helper) {
8334
+ if (!helper) return isWordCharBasic(ch);
8335
+ if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;
8336
+ return helper.test(ch);
8337
+ }
8338
+
8339
+ function isEmpty(obj) {
8340
+ for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
8341
+ return true;
8342
+ }
8343
+
8344
+ // Extending unicode characters. A series of a non-extending char +
8345
+ // any number of extending chars is treated as a single unit as far
8346
+ // as editing and measuring is concerned. This is not fully correct,
8347
+ // since some scripts/fonts/browsers also treat other configurations
8348
+ // of code points as a group.
8349
+ var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
8350
+ function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }
8351
+
8352
+ // DOM UTILITIES
8353
+
8354
+ function elt(tag, content, className, style) {
8355
+ var e = document.createElement(tag);
8356
+ if (className) e.className = className;
8357
+ if (style) e.style.cssText = style;
8358
+ if (typeof content == "string") e.appendChild(document.createTextNode(content));
8359
+ else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
8360
+ return e;
8361
+ }
8362
+
8363
+ var range;
8364
+ if (document.createRange) range = function(node, start, end, endNode) {
8365
+ var r = document.createRange();
8366
+ r.setEnd(endNode || node, end);
8367
+ r.setStart(node, start);
8368
+ return r;
8369
+ };
8370
+ else range = function(node, start, end) {
8371
+ var r = document.body.createTextRange();
8372
+ try { r.moveToElementText(node.parentNode); }
8373
+ catch(e) { return r; }
8374
+ r.collapse(true);
8375
+ r.moveEnd("character", end);
8376
+ r.moveStart("character", start);
8377
+ return r;
8378
+ };
8379
+
8380
+ function removeChildren(e) {
8381
+ for (var count = e.childNodes.length; count > 0; --count)
8382
+ e.removeChild(e.firstChild);
8383
+ return e;
8384
+ }
8385
+
8386
+ function removeChildrenAndAdd(parent, e) {
8387
+ return removeChildren(parent).appendChild(e);
8388
+ }
8389
+
8390
+ var contains = CodeMirror.contains = function(parent, child) {
8391
+ if (child.nodeType == 3) // Android browser always returns false when child is a textnode
8392
+ child = child.parentNode;
8393
+ if (parent.contains)
8394
+ return parent.contains(child);
8395
+ do {
8396
+ if (child.nodeType == 11) child = child.host;
8397
+ if (child == parent) return true;
8398
+ } while (child = child.parentNode);
8399
+ };
8400
+
8401
+ function activeElt() {
8402
+ var activeElement = document.activeElement;
8403
+ while (activeElement && activeElement.root && activeElement.root.activeElement)
8404
+ activeElement = activeElement.root.activeElement;
8405
+ return activeElement;
8406
+ }
8407
+ // Older versions of IE throws unspecified error when touching
8408
+ // document.activeElement in some cases (during loading, in iframe)
8409
+ if (ie && ie_version < 11) activeElt = function() {
8410
+ try { return document.activeElement; }
8411
+ catch(e) { return document.body; }
8412
+ };
8413
+
8414
+ function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }
8415
+ var rmClass = CodeMirror.rmClass = function(node, cls) {
8416
+ var current = node.className;
8417
+ var match = classTest(cls).exec(current);
8418
+ if (match) {
8419
+ var after = current.slice(match.index + match[0].length);
8420
+ node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
8421
+ }
8422
+ };
8423
+ var addClass = CodeMirror.addClass = function(node, cls) {
8424
+ var current = node.className;
8425
+ if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls;
8426
+ };
8427
+ function joinClasses(a, b) {
8428
+ var as = a.split(" ");
8429
+ for (var i = 0; i < as.length; i++)
8430
+ if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];
8431
+ return b;
8432
+ }
8433
+
8434
+ // WINDOW-WIDE EVENTS
8435
+
8436
+ // These must be handled carefully, because naively registering a
8437
+ // handler for each editor will cause the editors to never be
8438
+ // garbage collected.
8439
+
8440
+ function forEachCodeMirror(f) {
8441
+ if (!document.body.getElementsByClassName) return;
8442
+ var byClass = document.body.getElementsByClassName("CodeMirror");
8443
+ for (var i = 0; i < byClass.length; i++) {
8444
+ var cm = byClass[i].CodeMirror;
8445
+ if (cm) f(cm);
8446
+ }
8447
+ }
8448
+
8449
+ var globalsRegistered = false;
8450
+ function ensureGlobalHandlers() {
8451
+ if (globalsRegistered) return;
8452
+ registerGlobalHandlers();
8453
+ globalsRegistered = true;
8454
+ }
8455
+ function registerGlobalHandlers() {
8456
+ // When the window resizes, we need to refresh active editors.
8457
+ var resizeTimer;
8458
+ on(window, "resize", function() {
8459
+ if (resizeTimer == null) resizeTimer = setTimeout(function() {
8460
+ resizeTimer = null;
8461
+ forEachCodeMirror(onResize);
8462
+ }, 100);
8463
+ });
8464
+ // When the window loses focus, we want to show the editor as blurred
8465
+ on(window, "blur", function() {
8466
+ forEachCodeMirror(onBlur);
8467
+ });
8468
+ }
8469
+
8470
+ // FEATURE DETECTION
8471
+
8472
+ // Detect drag-and-drop
8473
+ var dragAndDrop = function() {
8474
+ // There is *some* kind of drag-and-drop support in IE6-8, but I
8475
+ // couldn't get it to work yet.
8476
+ if (ie && ie_version < 9) return false;
8477
+ var div = elt('div');
8478
+ return "draggable" in div || "dragDrop" in div;
8479
+ }();
8480
+
8481
+ var zwspSupported;
8482
+ function zeroWidthElement(measure) {
8483
+ if (zwspSupported == null) {
8484
+ var test = elt("span", "\u200b");
8485
+ removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
8486
+ if (measure.firstChild.offsetHeight != 0)
8487
+ zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);
8488
+ }
8489
+ var node = zwspSupported ? elt("span", "\u200b") :
8490
+ elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
8491
+ node.setAttribute("cm-text", "");
8492
+ return node;
8493
+ }
8494
+
8495
+ // Feature-detect IE's crummy client rect reporting for bidi text
8496
+ var badBidiRects;
8497
+ function hasBadBidiRects(measure) {
8498
+ if (badBidiRects != null) return badBidiRects;
8499
+ var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
8500
+ var r0 = range(txt, 0, 1).getBoundingClientRect();
8501
+ if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
8502
+ var r1 = range(txt, 1, 2).getBoundingClientRect();
8503
+ return badBidiRects = (r1.right - r0.right < 3);
8504
+ }
8505
+
8506
+ // See if "".split is the broken IE version, if so, provide an
8507
+ // alternative way to split lines.
8508
+ var splitLinesAuto = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
8509
+ var pos = 0, result = [], l = string.length;
8510
+ while (pos <= l) {
8511
+ var nl = string.indexOf("\n", pos);
8512
+ if (nl == -1) nl = string.length;
8513
+ var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
8514
+ var rt = line.indexOf("\r");
8515
+ if (rt != -1) {
8516
+ result.push(line.slice(0, rt));
8517
+ pos += rt + 1;
8518
+ } else {
8519
+ result.push(line);
8520
+ pos = nl + 1;
8521
+ }
8522
+ }
8523
+ return result;
8524
+ } : function(string){return string.split(/\r\n?|\n/);};
8525
+
8526
+ var hasSelection = window.getSelection ? function(te) {
8527
+ try { return te.selectionStart != te.selectionEnd; }
8528
+ catch(e) { return false; }
8529
+ } : function(te) {
8530
+ try {var range = te.ownerDocument.selection.createRange();}
8531
+ catch(e) {}
8532
+ if (!range || range.parentElement() != te) return false;
8533
+ return range.compareEndPoints("StartToEnd", range) != 0;
8534
+ };
8535
+
8536
+ var hasCopyEvent = (function() {
8537
+ var e = elt("div");
8538
+ if ("oncopy" in e) return true;
8539
+ e.setAttribute("oncopy", "return;");
8540
+ return typeof e.oncopy == "function";
8541
+ })();
8542
+
8543
+ var badZoomedRects = null;
8544
+ function hasBadZoomedRects(measure) {
8545
+ if (badZoomedRects != null) return badZoomedRects;
8546
+ var node = removeChildrenAndAdd(measure, elt("span", "x"));
8547
+ var normal = node.getBoundingClientRect();
8548
+ var fromRange = range(node, 0, 1).getBoundingClientRect();
8549
+ return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;
8550
+ }
8551
+
8552
+ // KEY NAMES
8553
+
8554
+ var keyNames = CodeMirror.keyNames = {
8555
+ 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
8556
+ 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
8557
+ 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
8558
+ 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
8559
+ 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete",
8560
+ 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
8561
+ 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
8562
+ 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
8563
+ };
8564
+ (function() {
8565
+ // Number keys
8566
+ for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
8567
+ // Alphabetic keys
8568
+ for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
8569
+ // Function keys
8570
+ for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
8571
+ })();
8572
+
8573
+ // BIDI HELPERS
8574
+
8575
+ function iterateBidiSections(order, from, to, f) {
8576
+ if (!order) return f(from, to, "ltr");
8577
+ var found = false;
8578
+ for (var i = 0; i < order.length; ++i) {
8579
+ var part = order[i];
8580
+ if (part.from < to && part.to > from || from == to && part.to == from) {
8581
+ f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
8582
+ found = true;
8583
+ }
8584
+ }
8585
+ if (!found) f(from, to, "ltr");
8586
+ }
8587
+
8588
+ function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
8589
+ function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
8590
+
8591
+ function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
8592
+ function lineRight(line) {
8593
+ var order = getOrder(line);
8594
+ if (!order) return line.text.length;
8595
+ return bidiRight(lst(order));
8596
+ }
8597
+
8598
+ function lineStart(cm, lineN) {
8599
+ var line = getLine(cm.doc, lineN);
8600
+ var visual = visualLine(line);
8601
+ if (visual != line) lineN = lineNo(visual);
8602
+ var order = getOrder(visual);
8603
+ var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
8604
+ return Pos(lineN, ch);
8605
+ }
8606
+ function lineEnd(cm, lineN) {
8607
+ var merged, line = getLine(cm.doc, lineN);
8608
+ while (merged = collapsedSpanAtEnd(line)) {
8609
+ line = merged.find(1, true).line;
8610
+ lineN = null;
8611
+ }
8612
+ var order = getOrder(line);
8613
+ var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
8614
+ return Pos(lineN == null ? lineNo(line) : lineN, ch);
8615
+ }
8616
+ function lineStartSmart(cm, pos) {
8617
+ var start = lineStart(cm, pos.line);
8618
+ var line = getLine(cm.doc, start.line);
8619
+ var order = getOrder(line);
8620
+ if (!order || order[0].level == 0) {
8621
+ var firstNonWS = Math.max(0, line.text.search(/\S/));
8622
+ var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
8623
+ return Pos(start.line, inWS ? 0 : firstNonWS);
8624
+ }
8625
+ return start;
8626
+ }
8627
+
8628
+ function compareBidiLevel(order, a, b) {
8629
+ var linedir = order[0].level;
8630
+ if (a == linedir) return true;
8631
+ if (b == linedir) return false;
8632
+ return a < b;
8633
+ }
8634
+ var bidiOther;
8635
+ function getBidiPartAt(order, pos) {
8636
+ bidiOther = null;
8637
+ for (var i = 0, found; i < order.length; ++i) {
8638
+ var cur = order[i];
8639
+ if (cur.from < pos && cur.to > pos) return i;
8640
+ if ((cur.from == pos || cur.to == pos)) {
8641
+ if (found == null) {
8642
+ found = i;
8643
+ } else if (compareBidiLevel(order, cur.level, order[found].level)) {
8644
+ if (cur.from != cur.to) bidiOther = found;
8645
+ return i;
8646
+ } else {
8647
+ if (cur.from != cur.to) bidiOther = i;
8648
+ return found;
8649
+ }
8650
+ }
8651
+ }
8652
+ return found;
8653
+ }
8654
+
8655
+ function moveInLine(line, pos, dir, byUnit) {
8656
+ if (!byUnit) return pos + dir;
8657
+ do pos += dir;
8658
+ while (pos > 0 && isExtendingChar(line.text.charAt(pos)));
8659
+ return pos;
8660
+ }
8661
+
8662
+ // This is needed in order to move 'visually' through bi-directional
8663
+ // text -- i.e., pressing left should make the cursor go left, even
8664
+ // when in RTL text. The tricky part is the 'jumps', where RTL and
8665
+ // LTR text touch each other. This often requires the cursor offset
8666
+ // to move more than one unit, in order to visually move one unit.
8667
+ function moveVisually(line, start, dir, byUnit) {
8668
+ var bidi = getOrder(line);
8669
+ if (!bidi) return moveLogically(line, start, dir, byUnit);
8670
+ var pos = getBidiPartAt(bidi, start), part = bidi[pos];
8671
+ var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
8672
+
8673
+ for (;;) {
8674
+ if (target > part.from && target < part.to) return target;
8675
+ if (target == part.from || target == part.to) {
8676
+ if (getBidiPartAt(bidi, target) == pos) return target;
8677
+ part = bidi[pos += dir];
8678
+ return (dir > 0) == part.level % 2 ? part.to : part.from;
8679
+ } else {
8680
+ part = bidi[pos += dir];
8681
+ if (!part) return null;
8682
+ if ((dir > 0) == part.level % 2)
8683
+ target = moveInLine(line, part.to, -1, byUnit);
8684
+ else
8685
+ target = moveInLine(line, part.from, 1, byUnit);
8686
+ }
8687
+ }
8688
+ }
8689
+
8690
+ function moveLogically(line, start, dir, byUnit) {
8691
+ var target = start + dir;
8692
+ if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;
8693
+ return target < 0 || target > line.text.length ? null : target;
8694
+ }
8695
+
8696
+ // Bidirectional ordering algorithm
8697
+ // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
8698
+ // that this (partially) implements.
8699
+
8700
+ // One-char codes used for character types:
8701
+ // L (L): Left-to-Right
8702
+ // R (R): Right-to-Left
8703
+ // r (AL): Right-to-Left Arabic
8704
+ // 1 (EN): European Number
8705
+ // + (ES): European Number Separator
8706
+ // % (ET): European Number Terminator
8707
+ // n (AN): Arabic Number
8708
+ // , (CS): Common Number Separator
8709
+ // m (NSM): Non-Spacing Mark
8710
+ // b (BN): Boundary Neutral
8711
+ // s (B): Paragraph Separator
8712
+ // t (S): Segment Separator
8713
+ // w (WS): Whitespace
8714
+ // N (ON): Other Neutrals
8715
+
8716
+ // Returns null if characters are ordered as they appear
8717
+ // (left-to-right), or an array of sections ({from, to, level}
8718
+ // objects) in the order in which they occur visually.
8719
+ var bidiOrdering = (function() {
8720
+ // Character types for codepoints 0 to 0xff
8721
+ var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
8722
+ // Character types for codepoints 0x600 to 0x6ff
8723
+ var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";
8724
+ function charType(code) {
8725
+ if (code <= 0xf7) return lowTypes.charAt(code);
8726
+ else if (0x590 <= code && code <= 0x5f4) return "R";
8727
+ else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);
8728
+ else if (0x6ee <= code && code <= 0x8ac) return "r";
8729
+ else if (0x2000 <= code && code <= 0x200b) return "w";
8730
+ else if (code == 0x200c) return "b";
8731
+ else return "L";
8732
+ }
8733
+
8734
+ var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
8735
+ var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
8736
+ // Browsers seem to always treat the boundaries of block elements as being L.
8737
+ var outerType = "L";
8738
+
8739
+ function BidiSpan(level, from, to) {
8740
+ this.level = level;
8741
+ this.from = from; this.to = to;
8742
+ }
8743
+
8744
+ return function(str) {
8745
+ if (!bidiRE.test(str)) return false;
8746
+ var len = str.length, types = [];
8747
+ for (var i = 0, type; i < len; ++i)
8748
+ types.push(type = charType(str.charCodeAt(i)));
8749
+
8750
+ // W1. Examine each non-spacing mark (NSM) in the level run, and
8751
+ // change the type of the NSM to the type of the previous
8752
+ // character. If the NSM is at the start of the level run, it will
8753
+ // get the type of sor.
8754
+ for (var i = 0, prev = outerType; i < len; ++i) {
8755
+ var type = types[i];
8756
+ if (type == "m") types[i] = prev;
8757
+ else prev = type;
8758
+ }
8759
+
8760
+ // W2. Search backwards from each instance of a European number
8761
+ // until the first strong type (R, L, AL, or sor) is found. If an
8762
+ // AL is found, change the type of the European number to Arabic
8763
+ // number.
8764
+ // W3. Change all ALs to R.
8765
+ for (var i = 0, cur = outerType; i < len; ++i) {
8766
+ var type = types[i];
8767
+ if (type == "1" && cur == "r") types[i] = "n";
8768
+ else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
8769
+ }
8770
+
8771
+ // W4. A single European separator between two European numbers
8772
+ // changes to a European number. A single common separator between
8773
+ // two numbers of the same type changes to that type.
8774
+ for (var i = 1, prev = types[0]; i < len - 1; ++i) {
8775
+ var type = types[i];
8776
+ if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
8777
+ else if (type == "," && prev == types[i+1] &&
8778
+ (prev == "1" || prev == "n")) types[i] = prev;
8779
+ prev = type;
8780
+ }
8781
+
8782
+ // W5. A sequence of European terminators adjacent to European
8783
+ // numbers changes to all European numbers.
8784
+ // W6. Otherwise, separators and terminators change to Other
8785
+ // Neutral.
8786
+ for (var i = 0; i < len; ++i) {
8787
+ var type = types[i];
8788
+ if (type == ",") types[i] = "N";
8789
+ else if (type == "%") {
8790
+ for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
8791
+ var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
8792
+ for (var j = i; j < end; ++j) types[j] = replace;
8793
+ i = end - 1;
8794
+ }
8795
+ }
8796
+
8797
+ // W7. Search backwards from each instance of a European number
8798
+ // until the first strong type (R, L, or sor) is found. If an L is
8799
+ // found, then change the type of the European number to L.
8800
+ for (var i = 0, cur = outerType; i < len; ++i) {
8801
+ var type = types[i];
8802
+ if (cur == "L" && type == "1") types[i] = "L";
8803
+ else if (isStrong.test(type)) cur = type;
8804
+ }
8805
+
8806
+ // N1. A sequence of neutrals takes the direction of the
8807
+ // surrounding strong text if the text on both sides has the same
8808
+ // direction. European and Arabic numbers act as if they were R in
8809
+ // terms of their influence on neutrals. Start-of-level-run (sor)
8810
+ // and end-of-level-run (eor) are used at level run boundaries.
8811
+ // N2. Any remaining neutrals take the embedding direction.
8812
+ for (var i = 0; i < len; ++i) {
8813
+ if (isNeutral.test(types[i])) {
8814
+ for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
8815
+ var before = (i ? types[i-1] : outerType) == "L";
8816
+ var after = (end < len ? types[end] : outerType) == "L";
8817
+ var replace = before || after ? "L" : "R";
8818
+ for (var j = i; j < end; ++j) types[j] = replace;
8819
+ i = end - 1;
8820
+ }
8821
+ }
8822
+
8823
+ // Here we depart from the documented algorithm, in order to avoid
8824
+ // building up an actual levels array. Since there are only three
8825
+ // levels (0, 1, 2) in an implementation that doesn't take
8826
+ // explicit embedding into account, we can build up the order on
8827
+ // the fly, without following the level-based algorithm.
8828
+ var order = [], m;
8829
+ for (var i = 0; i < len;) {
8830
+ if (countsAsLeft.test(types[i])) {
8831
+ var start = i;
8832
+ for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
8833
+ order.push(new BidiSpan(0, start, i));
8834
+ } else {
8835
+ var pos = i, at = order.length;
8836
+ for (++i; i < len && types[i] != "L"; ++i) {}
8837
+ for (var j = pos; j < i;) {
8838
+ if (countsAsNum.test(types[j])) {
8839
+ if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));
8840
+ var nstart = j;
8841
+ for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
8842
+ order.splice(at, 0, new BidiSpan(2, nstart, j));
8843
+ pos = j;
8844
+ } else ++j;
8845
+ }
8846
+ if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));
8847
+ }
8848
+ }
8849
+ if (order[0].level == 1 && (m = str.match(/^\s+/))) {
8850
+ order[0].from = m[0].length;
8851
+ order.unshift(new BidiSpan(0, 0, m[0].length));
8852
+ }
8853
+ if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
8854
+ lst(order).to -= m[0].length;
8855
+ order.push(new BidiSpan(0, len - m[0].length, len));
8856
+ }
8857
+ if (order[0].level == 2)
8858
+ order.unshift(new BidiSpan(1, order[0].to, order[0].to));
8859
+ if (order[0].level != lst(order).level)
8860
+ order.push(new BidiSpan(order[0].level, len, len));
8861
+
8862
+ return order;
8863
+ };
8864
+ })();
8865
+
8866
+ // THE END
8867
+
8868
+ CodeMirror.version = "5.8.1";
8869
+
8870
+ return CodeMirror;
8871
+ });
assets/admin/js/color-picker.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){a(".wcps_color").wpColorPicker()});
assets/admin/js/scripts.js CHANGED
@@ -4,6 +4,7 @@ jQuery(document).ready(function($)
4
 
5
 
6
 
 
7
  $(document).on('click', '#wcps_metabox .expandable .expand', function()
8
  {
9
  if($(this).parent().parent().hasClass('active'))
@@ -21,6 +22,13 @@ jQuery(document).ready(function($)
21
 
22
 
23
 
 
 
 
 
 
 
 
24
  $(document).on('click','.wcps_grid_items_reset',function(){
25
 
26
  if(confirm('Do you really want to reset ?')){
@@ -46,26 +54,26 @@ jQuery(document).ready(function($)
46
 
47
 
48
  })
49
-
50
-
51
-
52
 
53
- $(document).on('change', '.wcps_ribbon_name', function()
54
- {
55
- value = $(this).val();
56
 
57
- if(value=='custom'){
58
-
59
- $('#wcps_ribbon_custom').css('display','block');
60
- }
61
- else{
62
- $('#wcps_ribbon_custom').css('display','none');
63
-
64
- }
65
-
66
-
67
-
68
- })
 
 
 
 
 
 
69
 
70
 
71
 
4
 
5
 
6
 
7
+
8
  $(document).on('click', '#wcps_metabox .expandable .expand', function()
9
  {
10
  if($(this).parent().parent().hasClass('active'))
22
 
23
 
24
 
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
  $(document).on('click','.wcps_grid_items_reset',function(){
33
 
34
  if(confirm('Do you really want to reset ?')){
54
 
55
 
56
  })
 
 
 
57
 
 
 
 
58
 
59
+
60
+
61
+ $(document).on('change', '.wcps_ribbon_name', function()
62
+ {
63
+ value = $(this).val();
64
+
65
+ if(value=='custom'){
66
+
67
+ $('#wcps_ribbon_custom').css('display','block');
68
+ }
69
+ else{
70
+ $('#wcps_ribbon_custom').css('display','none');
71
+
72
+ }
73
+
74
+
75
+
76
+ })
77
 
78
 
79
 
assets/admin/js/scripts.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){a(document).on("click","#wcps_metabox .expandable .expand",function(){if(a(this).parent().parent().hasClass("active")){a(this).parent().parent().removeClass("active")}else{a(this).parent().parent().addClass("active")}});a(document).on("click","#wcps_metabox .add-meta-query",function(){var b=a.now();jQuery.ajax({type:"POST",url:wcps_ajax.wcps_ajaxurl,data:{action:"wcps_meta_query_add",key:b},success:function(c){jQuery("#wcps_metabox .meta-query-list").append(c)}})});a(document).on("click","#wcps_metabox .meta-query-list .remove",function(){if(confirm("Do you really want remove ?")){a(this).parent().parent().remove()}});a(document).on("click",".wcps_grid_items_reset",function(){if(confirm("Do you really want to reset ?")){wcps_id=jQuery(this).attr("wcps_id");jQuery.ajax({type:"POST",context:this,url:wcps_ajax.wcps_ajaxurl,data:{action:"wcps_grid_items_reset",wcps_id:wcps_id},success:function(b){jQuery(this).html(b);window.location.reload()}})}});a(document).on("change",".wcps_ribbon_name",function(){value=a(this).val();if(value=="custom"){a("#wcps_ribbon_custom").css("display","block")}else{a("#wcps_ribbon_custom").css("display","none")}});a(document).on("click",".wcps_content_source",function(){var b=a(this).val();var c=a(this).attr("id");a(".content-source-box.active").removeClass("active");a(".content-source-box."+c).addClass("active")});a(".wcps_taxonomy").click(function(){var b=jQuery(this).val();a(".wcps_loading_taxonomy_category").css("display","block");jQuery.ajax({type:"POST",url:wcps_ajax.wcps_ajaxurl,data:{action:"wcps_get_taxonomy_category",taxonomy:b},success:function(c){a(".wcps_taxonomy_category").html(c);a(".wcps_loading_taxonomy_category").fadeOut("slow")}})})});
assets/admin/js/settings-tabs.js ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function($){
2
+
3
+
4
+
5
+ $(document).on('click','.settings-tabs .tab-nav',function(){
6
+
7
+ $(this).parent().parent().children('.tab-navs').children('.tab-nav').removeClass('active');
8
+
9
+ $(this).addClass('active');
10
+
11
+ id = $(this).attr('data-id');
12
+
13
+ //console.log('Hello click');
14
+ console.log(id);
15
+
16
+ $(this).parent().parent().children('.tab-content').removeClass('active');
17
+
18
+ $(this).parent().parent().children('.tab-content#'+id).addClass('active');
19
+
20
+
21
+ })
22
+
23
+
24
+
25
+
26
+ });
assets/front/css/animate.css ADDED
@@ -0,0 +1,3340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+
3
+ /*!
4
+ * animate.css -http://daneden.me/animate
5
+ * Version - 3.5.1
6
+ * Licensed under the MIT license - http://opensource.org/licenses/MIT
7
+ *
8
+ * Copyright (c) 2016 Daniel Eden
9
+ */
10
+
11
+ .animated {
12
+ -webkit-animation-duration: 1s;
13
+ animation-duration: 1s;
14
+ -webkit-animation-fill-mode: both;
15
+ animation-fill-mode: both;
16
+ }
17
+
18
+ .animated.infinite {
19
+ -webkit-animation-iteration-count: infinite;
20
+ animation-iteration-count: infinite;
21
+ }
22
+
23
+ .animated.hinge {
24
+ -webkit-animation-duration: 2s;
25
+ animation-duration: 2s;
26
+ }
27
+
28
+ .animated.flipOutX,
29
+ .animated.flipOutY,
30
+ .animated.bounceIn,
31
+ .animated.bounceOut {
32
+ -webkit-animation-duration: .75s;
33
+ animation-duration: .75s;
34
+ }
35
+
36
+ @-webkit-keyframes bounce {
37
+ from, 20%, 53%, 80%, to {
38
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
39
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
40
+ -webkit-transform: translate3d(0,0,0);
41
+ transform: translate3d(0,0,0);
42
+ }
43
+
44
+ 40%, 43% {
45
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
46
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
47
+ -webkit-transform: translate3d(0, -30px, 0);
48
+ transform: translate3d(0, -30px, 0);
49
+ }
50
+
51
+ 70% {
52
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
53
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
54
+ -webkit-transform: translate3d(0, -15px, 0);
55
+ transform: translate3d(0, -15px, 0);
56
+ }
57
+
58
+ 90% {
59
+ -webkit-transform: translate3d(0,-4px,0);
60
+ transform: translate3d(0,-4px,0);
61
+ }
62
+ }
63
+
64
+ @keyframes bounce {
65
+ from, 20%, 53%, 80%, to {
66
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
67
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
68
+ -webkit-transform: translate3d(0,0,0);
69
+ transform: translate3d(0,0,0);
70
+ }
71
+
72
+ 40%, 43% {
73
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
74
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
75
+ -webkit-transform: translate3d(0, -30px, 0);
76
+ transform: translate3d(0, -30px, 0);
77
+ }
78
+
79
+ 70% {
80
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
81
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
82
+ -webkit-transform: translate3d(0, -15px, 0);
83
+ transform: translate3d(0, -15px, 0);
84
+ }
85
+
86
+ 90% {
87
+ -webkit-transform: translate3d(0,-4px,0);
88
+ transform: translate3d(0,-4px,0);
89
+ }
90
+ }
91
+
92
+ .bounce {
93
+ -webkit-animation-name: bounce;
94
+ animation-name: bounce;
95
+ -webkit-transform-origin: center bottom;
96
+ transform-origin: center bottom;
97
+ }
98
+
99
+ @-webkit-keyframes flash {
100
+ from, 50%, to {
101
+ opacity: 1;
102
+ }
103
+
104
+ 25%, 75% {
105
+ opacity: 0;
106
+ }
107
+ }
108
+
109
+ @keyframes flash {
110
+ from, 50%, to {
111
+ opacity: 1;
112
+ }
113
+
114
+ 25%, 75% {
115
+ opacity: 0;
116
+ }
117
+ }
118
+
119
+ .flash {
120
+ -webkit-animation-name: flash;
121
+ animation-name: flash;
122
+ }
123
+
124
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
125
+
126
+ @-webkit-keyframes pulse {
127
+ from {
128
+ -webkit-transform: scale3d(1, 1, 1);
129
+ transform: scale3d(1, 1, 1);
130
+ }
131
+
132
+ 50% {
133
+ -webkit-transform: scale3d(1.05, 1.05, 1.05);
134
+ transform: scale3d(1.05, 1.05, 1.05);
135
+ }
136
+
137
+ to {
138
+ -webkit-transform: scale3d(1, 1, 1);
139
+ transform: scale3d(1, 1, 1);
140
+ }
141
+ }
142
+
143
+ @keyframes pulse {
144
+ from {
145
+ -webkit-transform: scale3d(1, 1, 1);
146
+ transform: scale3d(1, 1, 1);
147
+ }
148
+
149
+ 50% {
150
+ -webkit-transform: scale3d(1.05, 1.05, 1.05);
151
+ transform: scale3d(1.05, 1.05, 1.05);
152
+ }
153
+
154
+ to {
155
+ -webkit-transform: scale3d(1, 1, 1);
156
+ transform: scale3d(1, 1, 1);
157
+ }
158
+ }
159
+
160
+ .pulse {
161
+ -webkit-animation-name: pulse;
162
+ animation-name: pulse;
163
+ }
164
+
165
+ @-webkit-keyframes rubberBand {
166
+ from {
167
+ -webkit-transform: scale3d(1, 1, 1);
168
+ transform: scale3d(1, 1, 1);
169
+ }
170
+
171
+ 30% {
172
+ -webkit-transform: scale3d(1.25, 0.75, 1);
173
+ transform: scale3d(1.25, 0.75, 1);
174
+ }
175
+
176
+ 40% {
177
+ -webkit-transform: scale3d(0.75, 1.25, 1);
178
+ transform: scale3d(0.75, 1.25, 1);
179
+ }
180
+
181
+ 50% {
182
+ -webkit-transform: scale3d(1.15, 0.85, 1);
183
+ transform: scale3d(1.15, 0.85, 1);
184
+ }
185
+
186
+ 65% {
187
+ -webkit-transform: scale3d(.95, 1.05, 1);
188
+ transform: scale3d(.95, 1.05, 1);
189
+ }
190
+
191
+ 75% {
192
+ -webkit-transform: scale3d(1.05, .95, 1);
193
+ transform: scale3d(1.05, .95, 1);
194
+ }
195
+
196
+ to {
197
+ -webkit-transform: scale3d(1, 1, 1);
198
+ transform: scale3d(1, 1, 1);
199
+ }
200
+ }
201
+
202
+ @keyframes rubberBand {
203
+ from {
204
+ -webkit-transform: scale3d(1, 1, 1);
205
+ transform: scale3d(1, 1, 1);
206
+ }
207
+
208
+ 30% {
209
+ -webkit-transform: scale3d(1.25, 0.75, 1);
210
+ transform: scale3d(1.25, 0.75, 1);
211
+ }
212
+
213
+ 40% {
214
+ -webkit-transform: scale3d(0.75, 1.25, 1);
215
+ transform: scale3d(0.75, 1.25, 1);
216
+ }
217
+
218
+ 50% {
219
+ -webkit-transform: scale3d(1.15, 0.85, 1);
220
+ transform: scale3d(1.15, 0.85, 1);
221
+ }
222
+
223
+ 65% {
224
+ -webkit-transform: scale3d(.95, 1.05, 1);
225
+ transform: scale3d(.95, 1.05, 1);
226
+ }
227
+
228
+ 75% {
229
+ -webkit-transform: scale3d(1.05, .95, 1);
230
+ transform: scale3d(1.05, .95, 1);
231
+ }
232
+
233
+ to {
234
+ -webkit-transform: scale3d(1, 1, 1);
235
+ transform: scale3d(1, 1, 1);
236
+ }
237
+ }
238
+
239
+ .rubberBand {
240
+ -webkit-animation-name: rubberBand;
241
+ animation-name: rubberBand;
242
+ }
243
+
244
+ @-webkit-keyframes shake {
245
+ from, to {
246
+ -webkit-transform: translate3d(0, 0, 0);
247
+ transform: translate3d(0, 0, 0);
248
+ }
249
+
250
+ 10%, 30%, 50%, 70%, 90% {
251
+ -webkit-transform: translate3d(-10px, 0, 0);
252
+ transform: translate3d(-10px, 0, 0);
253
+ }
254
+
255
+ 20%, 40%, 60%, 80% {
256
+ -webkit-transform: translate3d(10px, 0, 0);
257
+ transform: translate3d(10px, 0, 0);
258
+ }
259
+ }
260
+
261
+ @keyframes shake {
262
+ from, to {
263
+ -webkit-transform: translate3d(0, 0, 0);
264
+ transform: translate3d(0, 0, 0);
265
+ }
266
+
267
+ 10%, 30%, 50%, 70%, 90% {
268
+ -webkit-transform: translate3d(-10px, 0, 0);
269
+ transform: translate3d(-10px, 0, 0);
270
+ }
271
+
272
+ 20%, 40%, 60%, 80% {
273
+ -webkit-transform: translate3d(10px, 0, 0);
274
+ transform: translate3d(10px, 0, 0);
275
+ }
276
+ }
277
+
278
+ .shake {
279
+ -webkit-animation-name: shake;
280
+ animation-name: shake;
281
+ }
282
+
283
+ @-webkit-keyframes headShake {
284
+ 0% {
285
+ -webkit-transform: translateX(0);
286
+ transform: translateX(0);
287
+ }
288
+
289
+ 6.5% {
290
+ -webkit-transform: translateX(-6px) rotateY(-9deg);
291
+ transform: translateX(-6px) rotateY(-9deg);
292
+ }
293
+
294
+ 18.5% {
295
+ -webkit-transform: translateX(5px) rotateY(7deg);
296
+ transform: translateX(5px) rotateY(7deg);
297
+ }
298
+
299
+ 31.5% {
300
+ -webkit-transform: translateX(-3px) rotateY(-5deg);
301
+ transform: translateX(-3px) rotateY(-5deg);
302
+ }
303
+
304
+ 43.5% {
305
+ -webkit-transform: translateX(2px) rotateY(3deg);
306
+ transform: translateX(2px) rotateY(3deg);
307
+ }
308
+
309
+ 50% {
310
+ -webkit-transform: translateX(0);
311
+ transform: translateX(0);
312
+ }
313
+ }
314
+
315
+ @keyframes headShake {
316
+ 0% {
317
+ -webkit-transform: translateX(0);
318
+ transform: translateX(0);
319
+ }
320
+
321
+ 6.5% {
322
+ -webkit-transform: translateX(-6px) rotateY(-9deg);
323
+ transform: translateX(-6px) rotateY(-9deg);
324
+ }
325
+
326
+ 18.5% {
327
+ -webkit-transform: translateX(5px) rotateY(7deg);
328
+ transform: translateX(5px) rotateY(7deg);
329
+ }
330
+
331
+ 31.5% {
332
+ -webkit-transform: translateX(-3px) rotateY(-5deg);
333
+ transform: translateX(-3px) rotateY(-5deg);
334
+ }
335
+
336
+ 43.5% {
337
+ -webkit-transform: translateX(2px) rotateY(3deg);
338
+ transform: translateX(2px) rotateY(3deg);
339
+ }
340
+
341
+ 50% {
342
+ -webkit-transform: translateX(0);
343
+ transform: translateX(0);
344
+ }
345
+ }
346
+
347
+ .headShake {
348
+ -webkit-animation-timing-function: ease-in-out;
349
+ animation-timing-function: ease-in-out;
350
+ -webkit-animation-name: headShake;
351
+ animation-name: headShake;
352
+ }
353
+
354
+ @-webkit-keyframes swing {
355
+ 20% {
356
+ -webkit-transform: rotate3d(0, 0, 1, 15deg);
357
+ transform: rotate3d(0, 0, 1, 15deg);
358
+ }
359
+
360
+ 40% {
361
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
362
+ transform: rotate3d(0, 0, 1, -10deg);
363
+ }
364
+
365
+ 60% {
366
+ -webkit-transform: rotate3d(0, 0, 1, 5deg);
367
+ transform: rotate3d(0, 0, 1, 5deg);
368
+ }
369
+
370
+ 80% {
371
+ -webkit-transform: rotate3d(0, 0, 1, -5deg);
372
+ transform: rotate3d(0, 0, 1, -5deg);
373
+ }
374
+
375
+ to {
376
+ -webkit-transform: rotate3d(0, 0, 1, 0deg);
377
+ transform: rotate3d(0, 0, 1, 0deg);
378
+ }
379
+ }
380
+
381
+ @keyframes swing {
382
+ 20% {
383
+ -webkit-transform: rotate3d(0, 0, 1, 15deg);
384
+ transform: rotate3d(0, 0, 1, 15deg);
385
+ }
386
+
387
+ 40% {
388
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
389
+ transform: rotate3d(0, 0, 1, -10deg);
390
+ }
391
+
392
+ 60% {
393
+ -webkit-transform: rotate3d(0, 0, 1, 5deg);
394
+ transform: rotate3d(0, 0, 1, 5deg);
395
+ }
396
+
397
+ 80% {
398
+ -webkit-transform: rotate3d(0, 0, 1, -5deg);
399
+ transform: rotate3d(0, 0, 1, -5deg);
400
+ }
401
+
402
+ to {
403
+ -webkit-transform: rotate3d(0, 0, 1, 0deg);
404
+ transform: rotate3d(0, 0, 1, 0deg);
405
+ }
406
+ }
407
+
408
+ .swing {
409
+ -webkit-transform-origin: top center;
410
+ transform-origin: top center;
411
+ -webkit-animation-name: swing;
412
+ animation-name: swing;
413
+ }
414
+
415
+ @-webkit-keyframes tada {
416
+ from {
417
+ -webkit-transform: scale3d(1, 1, 1);
418
+ transform: scale3d(1, 1, 1);
419
+ }
420
+
421
+ 10%, 20% {
422
+ -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
423
+ transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
424
+ }
425
+
426
+ 30%, 50%, 70%, 90% {
427
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
428
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
429
+ }
430
+
431
+ 40%, 60%, 80% {
432
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
433
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
434
+ }
435
+
436
+ to {
437
+ -webkit-transform: scale3d(1, 1, 1);
438
+ transform: scale3d(1, 1, 1);
439
+ }
440
+ }
441
+
442
+ @keyframes tada {
443
+ from {
444
+ -webkit-transform: scale3d(1, 1, 1);
445
+ transform: scale3d(1, 1, 1);
446
+ }
447
+
448
+ 10%, 20% {
449
+ -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
450
+ transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
451
+ }
452
+
453
+ 30%, 50%, 70%, 90% {
454
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
455
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
456
+ }
457
+
458
+ 40%, 60%, 80% {
459
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
460
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
461
+ }
462
+
463
+ to {
464
+ -webkit-transform: scale3d(1, 1, 1);
465
+ transform: scale3d(1, 1, 1);
466
+ }
467
+ }
468
+
469
+ .tada {
470
+ -webkit-animation-name: tada;
471
+ animation-name: tada;
472
+ }
473
+
474
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
475
+
476
+ @-webkit-keyframes wobble {
477
+ from {
478
+ -webkit-transform: none;
479
+ transform: none;
480
+ }
481
+
482
+ 15% {
483
+ -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
484
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
485
+ }
486
+
487
+ 30% {
488
+ -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
489
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
490
+ }
491
+
492
+ 45% {
493
+ -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
494
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
495
+ }
496
+
497
+ 60% {
498
+ -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
499
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
500
+ }
501
+
502
+ 75% {
503
+ -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
504
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
505
+ }
506
+
507
+ to {
508
+ -webkit-transform: none;
509
+ transform: none;
510
+ }
511
+ }
512
+
513
+ @keyframes wobble {
514
+ from {
515
+ -webkit-transform: none;
516
+ transform: none;
517
+ }
518
+
519
+ 15% {
520
+ -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
521
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
522
+ }
523
+
524
+ 30% {
525
+ -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
526
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
527
+ }
528
+
529
+ 45% {
530
+ -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
531
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
532
+ }
533
+
534
+ 60% {
535
+ -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
536
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
537
+ }
538
+
539
+ 75% {
540
+ -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
541
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
542
+ }
543
+
544
+ to {
545
+ -webkit-transform: none;
546
+ transform: none;
547
+ }
548
+ }
549
+
550
+ .wobble {
551
+ -webkit-animation-name: wobble;
552
+ animation-name: wobble;
553
+ }
554
+
555
+ @-webkit-keyframes jello {
556
+ from, 11.1%, to {
557
+ -webkit-transform: none;
558
+ transform: none;
559
+ }
560
+
561
+ 22.2% {
562
+ -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
563
+ transform: skewX(-12.5deg) skewY(-12.5deg);
564
+ }
565
+
566
+ 33.3% {
567
+ -webkit-transform: skewX(6.25deg) skewY(6.25deg);
568
+ transform: skewX(6.25deg) skewY(6.25deg);
569
+ }
570
+
571
+ 44.4% {
572
+ -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
573
+ transform: skewX(-3.125deg) skewY(-3.125deg);
574
+ }
575
+
576
+ 55.5% {
577
+ -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
578
+ transform: skewX(1.5625deg) skewY(1.5625deg);
579
+ }
580
+
581
+ 66.6% {
582
+ -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);
583
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
584
+ }
585
+
586
+ 77.7% {
587
+ -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
588
+ transform: skewX(0.390625deg) skewY(0.390625deg);
589
+ }
590
+
591
+ 88.8% {
592
+ -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
593
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
594
+ }
595
+ }
596
+
597
+ @keyframes jello {
598
+ from, 11.1%, to {
599
+ -webkit-transform: none;
600
+ transform: none;
601
+ }
602
+
603
+ 22.2% {
604
+ -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
605
+ transform: skewX(-12.5deg) skewY(-12.5deg);
606
+ }
607
+
608
+ 33.3% {
609
+ -webkit-transform: skewX(6.25deg) skewY(6.25deg);
610
+ transform: skewX(6.25deg) skewY(6.25deg);
611
+ }
612
+
613
+ 44.4% {
614
+ -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
615
+ transform: skewX(-3.125deg) skewY(-3.125deg);
616
+ }
617
+
618
+ 55.5% {
619
+ -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
620
+ transform: skewX(1.5625deg) skewY(1.5625deg);
621
+ }
622
+
623
+ 66.6% {
624
+ -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);
625
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
626
+ }
627
+
628
+ 77.7% {
629
+ -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
630
+ transform: skewX(0.390625deg) skewY(0.390625deg);
631
+ }
632
+
633
+ 88.8% {
634
+ -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
635
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
636
+ }
637
+ }
638
+
639
+ .jello {
640
+ -webkit-animation-name: jello;
641
+ animation-name: jello;
642
+ -webkit-transform-origin: center;
643
+ transform-origin: center;
644
+ }
645
+
646
+ @-webkit-keyframes bounceIn {
647
+ from, 20%, 40%, 60%, 80%, to {
648
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
649
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
650
+ }
651
+
652
+ 0% {
653
+ opacity: 0;
654
+ -webkit-transform: scale3d(.3, .3, .3);
655
+ transform: scale3d(.3, .3, .3);
656
+ }
657
+
658
+ 20% {
659
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
660
+ transform: scale3d(1.1, 1.1, 1.1);
661
+ }
662
+
663
+ 40% {
664
+ -webkit-transform: scale3d(.9, .9, .9);
665
+ transform: scale3d(.9, .9, .9);
666
+ }
667
+
668
+ 60% {
669
+ opacity: 1;
670
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
671
+ transform: scale3d(1.03, 1.03, 1.03);
672
+ }
673
+
674
+ 80% {
675
+ -webkit-transform: scale3d(.97, .97, .97);
676
+ transform: scale3d(.97, .97, .97);
677
+ }
678
+
679
+ to {
680
+ opacity: 1;
681
+ -webkit-transform: scale3d(1, 1, 1);
682
+ transform: scale3d(1, 1, 1);
683
+ }
684
+ }
685
+
686
+ @keyframes bounceIn {
687
+ from, 20%, 40%, 60%, 80%, to {
688
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
689
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
690
+ }
691
+
692
+ 0% {
693
+ opacity: 0;
694
+ -webkit-transform: scale3d(.3, .3, .3);
695
+ transform: scale3d(.3, .3, .3);
696
+ }
697
+
698
+ 20% {
699
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
700
+ transform: scale3d(1.1, 1.1, 1.1);
701
+ }
702
+
703
+ 40% {
704
+ -webkit-transform: scale3d(.9, .9, .9);
705
+ transform: scale3d(.9, .9, .9);
706
+ }
707
+
708
+ 60% {
709
+ opacity: 1;
710
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
711
+ transform: scale3d(1.03, 1.03, 1.03);
712
+ }
713
+
714
+ 80% {
715
+ -webkit-transform: scale3d(.97, .97, .97);
716
+ transform: scale3d(.97, .97, .97);
717
+ }
718
+
719
+ to {
720
+ opacity: 1;
721
+ -webkit-transform: scale3d(1, 1, 1);
722
+ transform: scale3d(1, 1, 1);
723
+ }
724
+ }
725
+
726
+ .bounceIn {
727
+ -webkit-animation-name: bounceIn;
728
+ animation-name: bounceIn;
729
+ }
730
+
731
+ @-webkit-keyframes bounceInDown {
732
+ from, 60%, 75%, 90%, to {
733
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
734
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
735
+ }
736
+
737
+ 0% {
738
+ opacity: 0;
739
+ -webkit-transform: translate3d(0, -3000px, 0);
740
+ transform: translate3d(0, -3000px, 0);
741
+ }
742
+
743
+ 60% {
744
+ opacity: 1;
745
+ -webkit-transform: translate3d(0, 25px, 0);
746
+ transform: translate3d(0, 25px, 0);
747
+ }
748
+
749
+ 75% {
750
+ -webkit-transform: translate3d(0, -10px, 0);
751
+ transform: translate3d(0, -10px, 0);
752
+ }
753
+
754
+ 90% {
755
+ -webkit-transform: translate3d(0, 5px, 0);
756
+ transform: translate3d(0, 5px, 0);
757
+ }
758
+
759
+ to {
760
+ -webkit-transform: none;
761
+ transform: none;
762
+ }
763
+ }
764
+
765
+ @keyframes bounceInDown {
766
+ from, 60%, 75%, 90%, to {
767
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
768
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
769
+ }
770
+
771
+ 0% {
772
+ opacity: 0;
773
+ -webkit-transform: translate3d(0, -3000px, 0);
774
+ transform: translate3d(0, -3000px, 0);
775
+ }
776
+
777
+ 60% {
778
+ opacity: 1;
779
+ -webkit-transform: translate3d(0, 25px, 0);
780
+ transform: translate3d(0, 25px, 0);
781
+ }
782
+
783
+ 75% {
784
+ -webkit-transform: translate3d(0, -10px, 0);
785
+ transform: translate3d(0, -10px, 0);
786
+ }
787
+
788
+ 90% {
789
+ -webkit-transform: translate3d(0, 5px, 0);
790
+ transform: translate3d(0, 5px, 0);
791
+ }
792
+
793
+ to {
794
+ -webkit-transform: none;
795
+ transform: none;
796
+ }
797
+ }
798
+
799
+ .bounceInDown {
800
+ -webkit-animation-name: bounceInDown;
801
+ animation-name: bounceInDown;
802
+ }
803
+
804
+ @-webkit-keyframes bounceInLeft {
805
+ from, 60%, 75%, 90%, to {
806
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
807
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
808
+ }
809
+
810
+ 0% {
811
+ opacity: 0;
812
+ -webkit-transform: translate3d(-3000px, 0, 0);
813
+ transform: translate3d(-3000px, 0, 0);
814
+ }
815
+
816
+ 60% {
817
+ opacity: 1;
818
+ -webkit-transform: translate3d(25px, 0, 0);
819
+ transform: translate3d(25px, 0, 0);
820
+ }
821
+
822
+ 75% {
823
+ -webkit-transform: translate3d(-10px, 0, 0);
824
+ transform: translate3d(-10px, 0, 0);
825
+ }
826
+
827
+ 90% {
828
+ -webkit-transform: translate3d(5px, 0, 0);
829
+ transform: translate3d(5px, 0, 0);
830
+ }
831
+
832
+ to {
833
+ -webkit-transform: none;
834
+ transform: none;
835
+ }
836
+ }
837
+
838
+ @keyframes bounceInLeft {
839
+ from, 60%, 75%, 90%, to {
840
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
841
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
842
+ }
843
+
844
+ 0% {
845
+ opacity: 0;
846
+ -webkit-transform: translate3d(-3000px, 0, 0);
847
+ transform: translate3d(-3000px, 0, 0);
848
+ }
849
+
850
+ 60% {
851
+ opacity: 1;
852
+ -webkit-transform: translate3d(25px, 0, 0);
853
+ transform: translate3d(25px, 0, 0);
854
+ }
855
+
856
+ 75% {
857
+ -webkit-transform: translate3d(-10px, 0, 0);
858
+ transform: translate3d(-10px, 0, 0);
859
+ }
860
+
861
+ 90% {
862
+ -webkit-transform: translate3d(5px, 0, 0);
863
+ transform: translate3d(5px, 0, 0);
864
+ }
865
+
866
+ to {
867
+ -webkit-transform: none;
868
+ transform: none;
869
+ }
870
+ }
871
+
872
+ .bounceInLeft {
873
+ -webkit-animation-name: bounceInLeft;
874
+ animation-name: bounceInLeft;
875
+ }
876
+
877
+ @-webkit-keyframes bounceInRight {
878
+ from, 60%, 75%, 90%, to {
879
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
880
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
881
+ }
882
+
883
+ from {
884
+ opacity: 0;
885
+ -webkit-transform: translate3d(3000px, 0, 0);
886
+ transform: translate3d(3000px, 0, 0);
887
+ }
888
+
889
+ 60% {
890
+ opacity: 1;
891
+ -webkit-transform: translate3d(-25px, 0, 0);
892
+ transform: translate3d(-25px, 0, 0);
893
+ }
894
+
895
+ 75% {
896
+ -webkit-transform: translate3d(10px, 0, 0);
897
+ transform: translate3d(10px, 0, 0);
898
+ }
899
+
900
+ 90% {
901
+ -webkit-transform: translate3d(-5px, 0, 0);
902
+ transform: translate3d(-5px, 0, 0);
903
+ }
904
+
905
+ to {
906
+ -webkit-transform: none;
907
+ transform: none;
908
+ }
909
+ }
910
+
911
+ @keyframes bounceInRight {
912
+ from, 60%, 75%, 90%, to {
913
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
914
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
915
+ }
916
+
917
+ from {
918
+ opacity: 0;
919
+ -webkit-transform: translate3d(3000px, 0, 0);
920
+ transform: translate3d(3000px, 0, 0);
921
+ }
922
+
923
+ 60% {
924
+ opacity: 1;
925
+ -webkit-transform: translate3d(-25px, 0, 0);
926
+ transform: translate3d(-25px, 0, 0);
927
+ }
928
+
929
+ 75% {
930
+ -webkit-transform: translate3d(10px, 0, 0);
931
+ transform: translate3d(10px, 0, 0);
932
+ }
933
+
934
+ 90% {
935
+ -webkit-transform: translate3d(-5px, 0, 0);
936
+ transform: translate3d(-5px, 0, 0);
937
+ }
938
+
939
+ to {
940
+ -webkit-transform: none;
941
+ transform: none;
942
+ }
943
+ }
944
+
945
+ .bounceInRight {
946
+ -webkit-animation-name: bounceInRight;
947
+ animation-name: bounceInRight;
948
+ }
949
+
950
+ @-webkit-keyframes bounceInUp {
951
+ from, 60%, 75%, 90%, to {
952
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
953
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
954
+ }
955
+
956
+ from {
957
+ opacity: 0;
958
+ -webkit-transform: translate3d(0, 3000px, 0);
959
+ transform: translate3d(0, 3000px, 0);
960
+ }
961
+
962
+ 60% {
963
+ opacity: 1;
964
+ -webkit-transform: translate3d(0, -20px, 0);
965
+ transform: translate3d(0, -20px, 0);
966
+ }
967
+
968
+ 75% {
969
+ -webkit-transform: translate3d(0, 10px, 0);
970
+ transform: translate3d(0, 10px, 0);
971
+ }
972
+
973
+ 90% {
974
+ -webkit-transform: translate3d(0, -5px, 0);
975
+ transform: translate3d(0, -5px, 0);
976
+ }
977
+
978
+ to {
979
+ -webkit-transform: translate3d(0, 0, 0);
980
+ transform: translate3d(0, 0, 0);
981
+ }
982
+ }
983
+
984
+ @keyframes bounceInUp {
985
+ from, 60%, 75%, 90%, to {
986
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
987
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
988
+ }
989
+
990
+ from {
991
+ opacity: 0;
992
+ -webkit-transform: translate3d(0, 3000px, 0);
993
+ transform: translate3d(0, 3000px, 0);
994
+ }
995
+
996
+ 60% {
997
+ opacity: 1;
998
+ -webkit-transform: translate3d(0, -20px, 0);
999
+ transform: translate3d(0, -20px, 0);
1000
+ }
1001
+
1002
+ 75% {
1003
+ -webkit-transform: translate3d(0, 10px, 0);
1004
+ transform: translate3d(0, 10px, 0);
1005
+ }
1006
+
1007
+ 90% {
1008
+ -webkit-transform: translate3d(0, -5px, 0);
1009
+ transform: translate3d(0, -5px, 0);
1010
+ }
1011
+
1012
+ to {
1013
+ -webkit-transform: translate3d(0, 0, 0);
1014
+ transform: translate3d(0, 0, 0);
1015
+ }
1016
+ }
1017
+
1018
+ .bounceInUp {
1019
+ -webkit-animation-name: bounceInUp;
1020
+ animation-name: bounceInUp;
1021
+ }
1022
+
1023
+ @-webkit-keyframes bounceOut {
1024
+ 20% {
1025
+ -webkit-transform: scale3d(.9, .9, .9);
1026
+ transform: scale3d(.9, .9, .9);
1027
+ }
1028
+
1029
+ 50%, 55% {
1030
+ opacity: 1;
1031
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
1032
+ transform: scale3d(1.1, 1.1, 1.1);
1033
+ }
1034
+
1035
+ to {
1036
+ opacity: 0;
1037
+ -webkit-transform: scale3d(.3, .3, .3);
1038
+ transform: scale3d(.3, .3, .3);
1039
+ }
1040
+ }
1041
+
1042
+ @keyframes bounceOut {
1043
+ 20% {
1044
+ -webkit-transform: scale3d(.9, .9, .9);
1045
+ transform: scale3d(.9, .9, .9);
1046
+ }
1047
+
1048
+ 50%, 55% {
1049
+ opacity: 1;
1050
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
1051
+ transform: scale3d(1.1, 1.1, 1.1);
1052
+ }
1053
+
1054
+ to {
1055
+ opacity: 0;
1056
+ -webkit-transform: scale3d(.3, .3, .3);
1057
+ transform: scale3d(.3, .3, .3);
1058
+ }
1059
+ }
1060
+
1061
+ .bounceOut {
1062
+ -webkit-animation-name: bounceOut;
1063
+ animation-name: bounceOut;
1064
+ }
1065
+
1066
+ @-webkit-keyframes bounceOutDown {
1067
+ 20% {
1068
+ -webkit-transform: translate3d(0, 10px, 0);
1069
+ transform: translate3d(0, 10px, 0);
1070
+ }
1071
+
1072
+ 40%, 45% {
1073
+ opacity: 1;
1074
+ -webkit-transform: translate3d(0, -20px, 0);
1075
+ transform: translate3d(0, -20px, 0);
1076
+ }
1077
+
1078
+ to {
1079
+ opacity: 0;
1080
+ -webkit-transform: translate3d(0, 2000px, 0);
1081
+ transform: translate3d(0, 2000px, 0);
1082
+ }
1083
+ }
1084
+
1085
+ @keyframes bounceOutDown {
1086
+ 20% {
1087
+ -webkit-transform: translate3d(0, 10px, 0);
1088
+ transform: translate3d(0, 10px, 0);
1089
+ }
1090
+
1091
+ 40%, 45% {
1092
+ opacity: 1;
1093
+ -webkit-transform: translate3d(0, -20px, 0);
1094
+ transform: translate3d(0, -20px, 0);
1095
+ }
1096
+
1097
+ to {
1098
+ opacity: 0;
1099
+ -webkit-transform: translate3d(0, 2000px, 0);
1100
+ transform: translate3d(0, 2000px, 0);
1101
+ }
1102
+ }
1103
+
1104
+ .bounceOutDown {
1105
+ -webkit-animation-name: bounceOutDown;
1106
+ animation-name: bounceOutDown;
1107
+ }
1108
+
1109
+ @-webkit-keyframes bounceOutLeft {
1110
+ 20% {
1111
+ opacity: 1;
1112
+ -webkit-transform: translate3d(20px, 0, 0);
1113
+ transform: translate3d(20px, 0, 0);
1114
+ }
1115
+
1116
+ to {
1117
+ opacity: 0;
1118
+ -webkit-transform: translate3d(-2000px, 0, 0);
1119
+ transform: translate3d(-2000px, 0, 0);
1120
+ }
1121
+ }
1122
+
1123
+ @keyframes bounceOutLeft {
1124
+ 20% {
1125
+ opacity: 1;
1126
+ -webkit-transform: translate3d(20px, 0, 0);
1127
+ transform: translate3d(20px, 0, 0);
1128
+ }
1129
+
1130
+ to {
1131
+ opacity: 0;
1132
+ -webkit-transform: translate3d(-2000px, 0, 0);
1133
+ transform: translate3d(-2000px, 0, 0);
1134
+ }
1135
+ }
1136
+
1137
+ .bounceOutLeft {
1138
+ -webkit-animation-name: bounceOutLeft;
1139
+ animation-name: bounceOutLeft;
1140
+ }
1141
+
1142
+ @-webkit-keyframes bounceOutRight {
1143
+ 20% {
1144
+ opacity: 1;
1145
+ -webkit-transform: translate3d(-20px, 0, 0);
1146
+ transform: translate3d(-20px, 0, 0);
1147
+ }
1148
+
1149
+ to {
1150
+ opacity: 0;
1151
+ -webkit-transform: translate3d(2000px, 0, 0);
1152
+ transform: translate3d(2000px, 0, 0);
1153
+ }
1154
+ }
1155
+
1156
+ @keyframes bounceOutRight {
1157
+ 20% {
1158
+ opacity: 1;
1159
+ -webkit-transform: translate3d(-20px, 0, 0);
1160
+ transform: translate3d(-20px, 0, 0);
1161
+ }
1162
+
1163
+ to {
1164
+ opacity: 0;
1165
+ -webkit-transform: translate3d(2000px, 0, 0);
1166
+ transform: translate3d(2000px, 0, 0);
1167
+ }
1168
+ }
1169
+
1170
+ .bounceOutRight {
1171
+ -webkit-animation-name: bounceOutRight;
1172
+ animation-name: bounceOutRight;
1173
+ }
1174
+
1175
+ @-webkit-keyframes bounceOutUp {
1176
+ 20% {
1177
+ -webkit-transform: translate3d(0, -10px, 0);
1178
+ transform: translate3d(0, -10px, 0);
1179
+ }
1180
+
1181
+ 40%, 45% {
1182
+ opacity: 1;
1183
+ -webkit-transform: translate3d(0, 20px, 0);
1184
+ transform: translate3d(0, 20px, 0);
1185
+ }
1186
+
1187
+ to {
1188
+ opacity: 0;
1189
+ -webkit-transform: translate3d(0, -2000px, 0);
1190
+ transform: translate3d(0, -2000px, 0);
1191
+ }
1192
+ }
1193
+
1194
+ @keyframes bounceOutUp {
1195
+ 20% {
1196
+ -webkit-transform: translate3d(0, -10px, 0);
1197
+ transform: translate3d(0, -10px, 0);
1198
+ }
1199
+
1200
+ 40%, 45% {
1201
+ opacity: 1;
1202
+ -webkit-transform: translate3d(0, 20px, 0);
1203
+ transform: translate3d(0, 20px, 0);
1204
+ }
1205
+
1206
+ to {
1207
+ opacity: 0;
1208
+ -webkit-transform: translate3d(0, -2000px, 0);
1209
+ transform: translate3d(0, -2000px, 0);
1210
+ }
1211
+ }
1212
+
1213
+ .bounceOutUp {
1214
+ -webkit-animation-name: bounceOutUp;
1215
+ animation-name: bounceOutUp;
1216
+ }
1217
+
1218
+ @-webkit-keyframes fadeIn {
1219
+ from {
1220
+ opacity: 0;
1221
+ }
1222
+
1223
+ to {
1224
+ opacity: 1;
1225
+ }
1226
+ }
1227
+
1228
+ @keyframes fadeIn {
1229
+ from {
1230
+ opacity: 0;
1231
+ }
1232
+
1233
+ to {
1234
+ opacity: 1;
1235
+ }
1236
+ }
1237
+
1238
+ .fadeIn {
1239
+ -webkit-animation-name: fadeIn;
1240
+ animation-name: fadeIn;
1241
+ }
1242
+
1243
+ @-webkit-keyframes fadeInDown {
1244
+ from {
1245
+ opacity: 0;
1246
+ -webkit-transform: translate3d(0, -100%, 0);
1247
+ transform: translate3d(0, -100%, 0);
1248
+ }
1249
+
1250
+ to {
1251
+ opacity: 1;
1252
+ -webkit-transform: none;
1253
+ transform: none;
1254
+ }
1255
+ }
1256
+
1257
+ @keyframes fadeInDown {
1258
+ from {
1259
+ opacity: 0;
1260
+ -webkit-transform: translate3d(0, -100%, 0);
1261
+ transform: translate3d(0, -100%, 0);
1262
+ }
1263
+
1264
+ to {
1265
+ opacity: 1;
1266
+ -webkit-transform: none;
1267
+ transform: none;
1268
+ }
1269
+ }
1270
+
1271
+ .fadeInDown {
1272
+ -webkit-animation-name: fadeInDown;
1273
+ animation-name: fadeInDown;
1274
+ }
1275
+
1276
+ @-webkit-keyframes fadeInDownBig {
1277
+ from {
1278
+ opacity: 0;
1279
+ -webkit-transform: translate3d(0, -2000px, 0);
1280
+ transform: translate3d(0, -2000px, 0);
1281
+ }
1282
+
1283
+ to {
1284
+ opacity: 1;
1285
+ -webkit-transform: none;
1286
+ transform: none;
1287
+ }
1288
+ }
1289
+
1290
+ @keyframes fadeInDownBig {
1291
+ from {
1292
+ opacity: 0;
1293
+ -webkit-transform: translate3d(0, -2000px, 0);
1294
+ transform: translate3d(0, -2000px, 0);
1295
+ }
1296
+
1297
+ to {
1298
+ opacity: 1;
1299
+ -webkit-transform: none;
1300
+ transform: none;
1301
+ }
1302
+ }
1303
+
1304
+ .fadeInDownBig {
1305
+ -webkit-animation-name: fadeInDownBig;
1306
+ animation-name: fadeInDownBig;
1307
+ }
1308
+
1309
+ @-webkit-keyframes fadeInLeft {
1310
+ from {
1311
+ opacity: 0;
1312
+ -webkit-transform: translate3d(-100%, 0, 0);
1313
+ transform: translate3d(-100%, 0, 0);
1314
+ }
1315
+
1316
+ to {
1317
+ opacity: 1;
1318
+ -webkit-transform: none;
1319
+ transform: none;
1320
+ }
1321
+ }
1322
+
1323
+ @keyframes fadeInLeft {
1324
+ from {
1325
+ opacity: 0;
1326
+ -webkit-transform: translate3d(-100%, 0, 0);
1327
+ transform: translate3d(-100%, 0, 0);
1328
+ }
1329
+
1330
+ to {
1331
+ opacity: 1;
1332
+ -webkit-transform: none;
1333
+ transform: none;
1334
+ }
1335
+ }
1336
+
1337
+ .fadeInLeft {
1338
+ -webkit-animation-name: fadeInLeft;
1339
+ animation-name: fadeInLeft;
1340
+ }
1341
+
1342
+ @-webkit-keyframes fadeInLeftBig {
1343
+ from {
1344
+ opacity: 0;
1345
+ -webkit-transform: translate3d(-2000px, 0, 0);
1346
+ transform: translate3d(-2000px, 0, 0);
1347
+ }
1348
+
1349
+ to {
1350
+ opacity: 1;
1351
+ -webkit-transform: none;
1352
+ transform: none;
1353
+ }
1354
+ }
1355
+
1356
+ @keyframes fadeInLeftBig {
1357
+ from {
1358
+ opacity: 0;
1359
+ -webkit-transform: translate3d(-2000px, 0, 0);
1360
+ transform: translate3d(-2000px, 0, 0);
1361
+ }
1362
+
1363
+ to {
1364
+ opacity: 1;
1365
+ -webkit-transform: none;
1366
+ transform: none;
1367
+ }
1368
+ }
1369
+
1370
+ .fadeInLeftBig {
1371
+ -webkit-animation-name: fadeInLeftBig;
1372
+ animation-name: fadeInLeftBig;
1373
+ }
1374
+
1375
+ @-webkit-keyframes fadeInRight {
1376
+ from {
1377
+ opacity: 0;
1378
+ -webkit-transform: translate3d(100%, 0, 0);
1379
+ transform: translate3d(100%, 0, 0);
1380
+ }
1381
+
1382
+ to {
1383
+ opacity: 1;
1384
+ -webkit-transform: none;
1385
+ transform: none;
1386
+ }
1387
+ }
1388
+
1389
+ @keyframes fadeInRight {
1390
+ from {
1391
+ opacity: 0;
1392
+ -webkit-transform: translate3d(100%, 0, 0);
1393
+ transform: translate3d(100%, 0, 0);
1394
+ }
1395
+
1396
+ to {
1397
+ opacity: 1;
1398
+ -webkit-transform: none;
1399
+ transform: none;
1400
+ }
1401
+ }
1402
+
1403
+ .fadeInRight {
1404
+ -webkit-animation-name: fadeInRight;
1405
+ animation-name: fadeInRight;
1406
+ }
1407
+
1408
+ @-webkit-keyframes fadeInRightBig {
1409
+ from {
1410
+ opacity: 0;
1411
+ -webkit-transform: translate3d(2000px, 0, 0);
1412
+ transform: translate3d(2000px, 0, 0);
1413
+ }
1414
+
1415
+ to {
1416
+ opacity: 1;
1417
+ -webkit-transform: none;
1418
+ transform: none;
1419
+ }
1420
+ }
1421
+
1422
+ @keyframes fadeInRightBig {
1423
+ from {
1424
+ opacity: 0;
1425
+ -webkit-transform: translate3d(2000px, 0, 0);
1426
+ transform: translate3d(2000px, 0, 0);
1427
+ }
1428
+
1429
+ to {
1430
+ opacity: 1;
1431
+ -webkit-transform: none;
1432
+ transform: none;
1433
+ }
1434
+ }
1435
+
1436
+ .fadeInRightBig {
1437
+ -webkit-animation-name: fadeInRightBig;
1438
+ animation-name: fadeInRightBig;
1439
+ }
1440
+
1441
+ @-webkit-keyframes fadeInUp {
1442
+ from {
1443
+ opacity: 0;
1444
+ -webkit-transform: translate3d(0, 100%, 0);
1445
+ transform: translate3d(0, 100%, 0);
1446
+ }
1447
+
1448
+ to {
1449
+ opacity: 1;
1450
+ -webkit-transform: none;
1451
+ transform: none;
1452
+ }
1453
+ }
1454
+
1455
+ @keyframes fadeInUp {
1456
+ from {
1457
+ opacity: 0;
1458
+ -webkit-transform: translate3d(0, 100%, 0);
1459
+ transform: translate3d(0, 100%, 0);
1460
+ }
1461
+
1462
+ to {
1463
+ opacity: 1;
1464
+ -webkit-transform: none;
1465
+ transform: none;
1466
+ }
1467
+ }
1468
+
1469
+ .fadeInUp {
1470
+ -webkit-animation-name: fadeInUp;
1471
+ animation-name: fadeInUp;
1472
+ }
1473
+
1474
+ @-webkit-keyframes fadeInUpBig {
1475
+ from {
1476
+ opacity: 0;
1477
+ -webkit-transform: translate3d(0, 2000px, 0);
1478
+ transform: translate3d(0, 2000px, 0);
1479
+ }
1480
+
1481
+ to {
1482
+ opacity: 1;
1483
+ -webkit-transform: none;
1484
+ transform: none;
1485
+ }
1486
+ }
1487
+
1488
+ @keyframes fadeInUpBig {
1489
+ from {
1490
+ opacity: 0;
1491
+ -webkit-transform: translate3d(0, 2000px, 0);
1492
+ transform: translate3d(0, 2000px, 0);
1493
+ }
1494
+
1495
+ to {
1496
+ opacity: 1;
1497
+ -webkit-transform: none;
1498
+ transform: none;
1499
+ }
1500
+ }
1501
+
1502
+ .fadeInUpBig {
1503
+ -webkit-animation-name: fadeInUpBig;
1504
+ animation-name: fadeInUpBig;
1505
+ }
1506
+
1507
+ @-webkit-keyframes fadeOut {
1508
+ from {
1509
+ opacity: 1;
1510
+ }
1511
+
1512
+ to {
1513
+ opacity: 0;
1514
+ }
1515
+ }
1516
+
1517
+ @keyframes fadeOut {
1518
+ from {
1519
+ opacity: 1;
1520
+ }
1521
+
1522
+ to {
1523
+ opacity: 0;
1524
+ }
1525
+ }
1526
+
1527
+ .fadeOut {
1528
+ -webkit-animation-name: fadeOut;
1529
+ animation-name: fadeOut;
1530
+ }
1531
+
1532
+ @-webkit-keyframes fadeOutDown {
1533
+ from {
1534
+ opacity: 1;
1535
+ }
1536
+
1537
+ to {
1538
+ opacity: 0;
1539
+ -webkit-transform: translate3d(0, 100%, 0);
1540
+ transform: translate3d(0, 100%, 0);
1541
+ }
1542
+ }
1543
+
1544
+ @keyframes fadeOutDown {
1545
+ from {
1546
+ opacity: 1;
1547
+ }
1548
+
1549
+ to {
1550
+ opacity: 0;
1551
+ -webkit-transform: translate3d(0, 100%, 0);
1552
+ transform: translate3d(0, 100%, 0);
1553
+ }
1554
+ }
1555
+
1556
+ .fadeOutDown {
1557
+ -webkit-animation-name: fadeOutDown;
1558
+ animation-name: fadeOutDown;
1559
+ }
1560
+
1561
+ @-webkit-keyframes fadeOutDownBig {
1562
+ from {
1563
+ opacity: 1;
1564
+ }
1565
+
1566
+ to {
1567
+ opacity: 0;
1568
+ -webkit-transform: translate3d(0, 2000px, 0);
1569
+ transform: translate3d(0, 2000px, 0);
1570
+ }
1571
+ }
1572
+
1573
+ @keyframes fadeOutDownBig {
1574
+ from {
1575
+ opacity: 1;
1576
+ }
1577
+
1578
+ to {
1579
+ opacity: 0;
1580
+ -webkit-transform: translate3d(0, 2000px, 0);
1581
+ transform: translate3d(0, 2000px, 0);
1582
+ }
1583
+ }
1584
+
1585
+ .fadeOutDownBig {
1586
+ -webkit-animation-name: fadeOutDownBig;
1587
+ animation-name: fadeOutDownBig;
1588
+ }
1589
+
1590
+ @-webkit-keyframes fadeOutLeft {
1591
+ from {
1592
+ opacity: 1;
1593
+ }
1594
+
1595
+ to {
1596
+ opacity: 0;
1597
+ -webkit-transform: translate3d(-100%, 0, 0);
1598
+ transform: translate3d(-100%, 0, 0);
1599
+ }
1600
+ }
1601
+
1602
+ @keyframes fadeOutLeft {
1603
+ from {
1604
+ opacity: 1;
1605
+ }
1606
+
1607
+ to {
1608
+ opacity: 0;
1609
+ -webkit-transform: translate3d(-100%, 0, 0);
1610
+ transform: translate3d(-100%, 0, 0);
1611
+ }
1612
+ }
1613
+
1614
+ .fadeOutLeft {
1615
+ -webkit-animation-name: fadeOutLeft;
1616
+ animation-name: fadeOutLeft;
1617
+ }
1618
+
1619
+ @-webkit-keyframes fadeOutLeftBig {
1620
+ from {
1621
+ opacity: 1;
1622
+ }
1623
+
1624
+ to {
1625
+ opacity: 0;
1626
+ -webkit-transform: translate3d(-2000px, 0, 0);
1627
+ transform: translate3d(-2000px, 0, 0);
1628
+ }
1629
+ }
1630
+
1631
+ @keyframes fadeOutLeftBig {
1632
+ from {
1633
+ opacity: 1;
1634
+ }
1635
+
1636
+ to {
1637
+ opacity: 0;
1638
+ -webkit-transform: translate3d(-2000px, 0, 0);
1639
+ transform: translate3d(-2000px, 0, 0);
1640
+ }
1641
+ }
1642
+
1643
+ .fadeOutLeftBig {
1644
+ -webkit-animation-name: fadeOutLeftBig;
1645
+ animation-name: fadeOutLeftBig;
1646
+ }
1647
+
1648
+ @-webkit-keyframes fadeOutRight {
1649
+ from {
1650
+ opacity: 1;
1651
+ }
1652
+
1653
+ to {
1654
+ opacity: 0;
1655
+ -webkit-transform: translate3d(100%, 0, 0);
1656
+ transform: translate3d(100%, 0, 0);
1657
+ }
1658
+ }
1659
+
1660
+ @keyframes fadeOutRight {
1661
+ from {
1662
+ opacity: 1;
1663
+ }
1664
+
1665
+ to {
1666
+ opacity: 0;
1667
+ -webkit-transform: translate3d(100%, 0, 0);
1668
+ transform: translate3d(100%, 0, 0);
1669
+ }
1670
+ }
1671
+
1672
+ .fadeOutRight {
1673
+ -webkit-animation-name: fadeOutRight;
1674
+ animation-name: fadeOutRight;
1675
+ }
1676
+
1677
+ @-webkit-keyframes fadeOutRightBig {
1678
+ from {
1679
+ opacity: 1;
1680
+ }
1681
+
1682
+ to {
1683
+ opacity: 0;
1684
+ -webkit-transform: translate3d(2000px, 0, 0);
1685
+ transform: translate3d(2000px, 0, 0);
1686
+ }
1687
+ }
1688
+
1689
+ @keyframes fadeOutRightBig {
1690
+ from {
1691
+ opacity: 1;
1692
+ }
1693
+
1694
+ to {
1695
+ opacity: 0;
1696
+ -webkit-transform: translate3d(2000px, 0, 0);
1697
+ transform: translate3d(2000px, 0, 0);
1698
+ }
1699
+ }
1700
+
1701
+ .fadeOutRightBig {
1702
+ -webkit-animation-name: fadeOutRightBig;
1703
+ animation-name: fadeOutRightBig;
1704
+ }
1705
+
1706
+ @-webkit-keyframes fadeOutUp {
1707
+ from {
1708
+ opacity: 1;
1709
+ }
1710
+
1711
+ to {
1712
+ opacity: 0;
1713
+ -webkit-transform: translate3d(0, -100%, 0);
1714
+ transform: translate3d(0, -100%, 0);
1715
+ }
1716
+ }
1717
+
1718
+ @keyframes fadeOutUp {
1719
+ from {
1720
+ opacity: 1;
1721
+ }
1722
+
1723
+ to {
1724
+ opacity: 0;
1725
+ -webkit-transform: translate3d(0, -100%, 0);
1726
+ transform: translate3d(0, -100%, 0);
1727
+ }
1728
+ }
1729
+
1730
+ .fadeOutUp {
1731
+ -webkit-animation-name: fadeOutUp;
1732
+ animation-name: fadeOutUp;
1733
+ }
1734
+
1735
+ @-webkit-keyframes fadeOutUpBig {
1736
+ from {
1737
+ opacity: 1;
1738
+ }
1739
+
1740
+ to {
1741
+ opacity: 0;
1742
+ -webkit-transform: translate3d(0, -2000px, 0);
1743
+ transform: translate3d(0, -2000px, 0);
1744
+ }
1745
+ }
1746
+
1747
+ @keyframes fadeOutUpBig {
1748
+ from {
1749
+ opacity: 1;
1750
+ }
1751
+
1752
+ to {
1753
+ opacity: 0;
1754
+ -webkit-transform: translate3d(0, -2000px, 0);
1755
+ transform: translate3d(0, -2000px, 0);
1756
+ }
1757
+ }
1758
+
1759
+ .fadeOutUpBig {
1760
+ -webkit-animation-name: fadeOutUpBig;
1761
+ animation-name: fadeOutUpBig;
1762
+ }
1763
+
1764
+ @-webkit-keyframes flip {
1765
+ from {
1766
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1767
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1768
+ -webkit-animation-timing-function: ease-out;
1769
+ animation-timing-function: ease-out;
1770
+ }
1771
+
1772
+ 40% {
1773
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1774
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1775
+ -webkit-animation-timing-function: ease-out;
1776
+ animation-timing-function: ease-out;
1777
+ }
1778
+
1779
+ 50% {
1780
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1781
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1782
+ -webkit-animation-timing-function: ease-in;
1783
+ animation-timing-function: ease-in;
1784
+ }
1785
+
1786
+ 80% {
1787
+ -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
1788
+ transform: perspective(400px) scale3d(.95, .95, .95);
1789
+ -webkit-animation-timing-function: ease-in;
1790
+ animation-timing-function: ease-in;
1791
+ }
1792
+
1793
+ to {
1794
+ -webkit-transform: perspective(400px);
1795
+ transform: perspective(400px);
1796
+ -webkit-animation-timing-function: ease-in;
1797
+ animation-timing-function: ease-in;
1798
+ }
1799
+ }
1800
+
1801
+ @keyframes flip {
1802
+ from {
1803
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1804
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
1805
+ -webkit-animation-timing-function: ease-out;
1806
+ animation-timing-function: ease-out;
1807
+ }
1808
+
1809
+ 40% {
1810
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1811
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
1812
+ -webkit-animation-timing-function: ease-out;
1813
+ animation-timing-function: ease-out;
1814
+ }
1815
+
1816
+ 50% {
1817
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1818
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
1819
+ -webkit-animation-timing-function: ease-in;
1820
+ animation-timing-function: ease-in;
1821
+ }
1822
+
1823
+ 80% {
1824
+ -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
1825
+ transform: perspective(400px) scale3d(.95, .95, .95);
1826
+ -webkit-animation-timing-function: ease-in;
1827
+ animation-timing-function: ease-in;
1828
+ }
1829
+
1830
+ to {
1831
+ -webkit-transform: perspective(400px);
1832
+ transform: perspective(400px);
1833
+ -webkit-animation-timing-function: ease-in;
1834
+ animation-timing-function: ease-in;
1835
+ }
1836
+ }
1837
+
1838
+ .animated.flip {
1839
+ -webkit-backface-visibility: visible;
1840
+ backface-visibility: visible;
1841
+ -webkit-animation-name: flip;
1842
+ animation-name: flip;
1843
+ }
1844
+
1845
+ @-webkit-keyframes flipInX {
1846
+ from {
1847
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1848
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1849
+ -webkit-animation-timing-function: ease-in;
1850
+ animation-timing-function: ease-in;
1851
+ opacity: 0;
1852
+ }
1853
+
1854
+ 40% {
1855
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1856
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1857
+ -webkit-animation-timing-function: ease-in;
1858
+ animation-timing-function: ease-in;
1859
+ }
1860
+
1861
+ 60% {
1862
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1863
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1864
+ opacity: 1;
1865
+ }
1866
+
1867
+ 80% {
1868
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1869
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1870
+ }
1871
+
1872
+ to {
1873
+ -webkit-transform: perspective(400px);
1874
+ transform: perspective(400px);
1875
+ }
1876
+ }
1877
+
1878
+ @keyframes flipInX {
1879
+ from {
1880
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1881
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
1882
+ -webkit-animation-timing-function: ease-in;
1883
+ animation-timing-function: ease-in;
1884
+ opacity: 0;
1885
+ }
1886
+
1887
+ 40% {
1888
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1889
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1890
+ -webkit-animation-timing-function: ease-in;
1891
+ animation-timing-function: ease-in;
1892
+ }
1893
+
1894
+ 60% {
1895
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1896
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
1897
+ opacity: 1;
1898
+ }
1899
+
1900
+ 80% {
1901
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1902
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
1903
+ }
1904
+
1905
+ to {
1906
+ -webkit-transform: perspective(400px);
1907
+ transform: perspective(400px);
1908
+ }
1909
+ }
1910
+
1911
+ .flipInX {
1912
+ -webkit-backface-visibility: visible !important;
1913
+ backface-visibility: visible !important;
1914
+ -webkit-animation-name: flipInX;
1915
+ animation-name: flipInX;
1916
+ }
1917
+
1918
+ @-webkit-keyframes flipInY {
1919
+ from {
1920
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1921
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1922
+ -webkit-animation-timing-function: ease-in;
1923
+ animation-timing-function: ease-in;
1924
+ opacity: 0;
1925
+ }
1926
+
1927
+ 40% {
1928
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1929
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1930
+ -webkit-animation-timing-function: ease-in;
1931
+ animation-timing-function: ease-in;
1932
+ }
1933
+
1934
+ 60% {
1935
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1936
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1937
+ opacity: 1;
1938
+ }
1939
+
1940
+ 80% {
1941
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1942
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1943
+ }
1944
+
1945
+ to {
1946
+ -webkit-transform: perspective(400px);
1947
+ transform: perspective(400px);
1948
+ }
1949
+ }
1950
+
1951
+ @keyframes flipInY {
1952
+ from {
1953
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1954
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
1955
+ -webkit-animation-timing-function: ease-in;
1956
+ animation-timing-function: ease-in;
1957
+ opacity: 0;
1958
+ }
1959
+
1960
+ 40% {
1961
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1962
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
1963
+ -webkit-animation-timing-function: ease-in;
1964
+ animation-timing-function: ease-in;
1965
+ }
1966
+
1967
+ 60% {
1968
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1969
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
1970
+ opacity: 1;
1971
+ }
1972
+
1973
+ 80% {
1974
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1975
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
1976
+ }
1977
+
1978
+ to {
1979
+ -webkit-transform: perspective(400px);
1980
+ transform: perspective(400px);
1981
+ }
1982
+ }
1983
+
1984
+ .flipInY {
1985
+ -webkit-backface-visibility: visible !important;
1986
+ backface-visibility: visible !important;
1987
+ -webkit-animation-name: flipInY;
1988
+ animation-name: flipInY;
1989
+ }
1990
+
1991
+ @-webkit-keyframes flipOutX {
1992
+ from {
1993
+ -webkit-transform: perspective(400px);
1994
+ transform: perspective(400px);
1995
+ }
1996
+
1997
+ 30% {
1998
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
1999
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
2000
+ opacity: 1;
2001
+ }
2002
+
2003
+ to {
2004
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
2005
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
2006
+ opacity: 0;
2007
+ }
2008
+ }
2009
+
2010
+ @keyframes flipOutX {
2011
+ from {
2012
+ -webkit-transform: perspective(400px);
2013
+ transform: perspective(400px);
2014
+ }
2015
+
2016
+ 30% {
2017
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
2018
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
2019
+ opacity: 1;
2020
+ }
2021
+
2022
+ to {
2023
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
2024
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
2025
+ opacity: 0;
2026
+ }
2027
+ }
2028
+
2029
+ .flipOutX {
2030
+ -webkit-animation-name: flipOutX;
2031
+ animation-name: flipOutX;
2032
+ -webkit-backface-visibility: visible !important;
2033
+ backface-visibility: visible !important;
2034
+ }
2035
+
2036
+ @-webkit-keyframes flipOutY {
2037
+ from {
2038
+ -webkit-transform: perspective(400px);
2039
+ transform: perspective(400px);
2040
+ }
2041
+
2042
+ 30% {
2043
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
2044
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
2045
+ opacity: 1;
2046
+ }
2047
+
2048
+ to {
2049
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
2050
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
2051
+ opacity: 0;
2052
+ }
2053
+ }
2054
+
2055
+ @keyframes flipOutY {
2056
+ from {
2057
+ -webkit-transform: perspective(400px);
2058
+ transform: perspective(400px);
2059
+ }
2060
+
2061
+ 30% {
2062
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
2063
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
2064
+ opacity: 1;
2065
+ }
2066
+
2067
+ to {
2068
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
2069
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
2070
+ opacity: 0;
2071
+ }
2072
+ }
2073
+
2074
+ .flipOutY {
2075
+ -webkit-backface-visibility: visible !important;
2076
+ backface-visibility: visible !important;
2077
+ -webkit-animation-name: flipOutY;
2078
+ animation-name: flipOutY;
2079
+ }
2080
+
2081
+ @-webkit-keyframes lightSpeedIn {
2082
+ from {
2083
+ -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
2084
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
2085
+ opacity: 0;
2086
+ }
2087
+
2088
+ 60% {
2089
+ -webkit-transform: skewX(20deg);
2090
+ transform: skewX(20deg);
2091
+ opacity: 1;
2092
+ }
2093
+
2094
+ 80% {
2095
+ -webkit-transform: skewX(-5deg);
2096
+ transform: skewX(-5deg);
2097
+ opacity: 1;
2098
+ }
2099
+
2100
+ to {
2101
+ -webkit-transform: none;
2102
+ transform: none;
2103
+ opacity: 1;
2104
+ }
2105
+ }
2106
+
2107
+ @keyframes lightSpeedIn {
2108
+ from {
2109
+ -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
2110
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
2111
+ opacity: 0;
2112
+ }
2113
+
2114
+ 60% {
2115
+ -webkit-transform: skewX(20deg);
2116
+ transform: skewX(20deg);
2117
+ opacity: 1;
2118
+ }
2119
+
2120
+ 80% {
2121
+ -webkit-transform: skewX(-5deg);
2122
+ transform: skewX(-5deg);
2123
+ opacity: 1;
2124
+ }
2125
+
2126
+ to {
2127
+ -webkit-transform: none;
2128
+ transform: none;
2129
+ opacity: 1;
2130
+ }
2131
+ }
2132
+
2133
+ .lightSpeedIn {
2134
+ -webkit-animation-name: lightSpeedIn;
2135
+ animation-name: lightSpeedIn;
2136
+ -webkit-animation-timing-function: ease-out;
2137
+ animation-timing-function: ease-out;
2138
+ }
2139
+
2140
+ @-webkit-keyframes lightSpeedOut {
2141
+ from {
2142
+ opacity: 1;
2143
+ }
2144
+
2145
+ to {
2146
+ -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
2147
+ transform: translate3d(100%, 0, 0) skewX(30deg);
2148
+ opacity: 0;
2149
+ }
2150
+ }
2151
+
2152
+ @keyframes lightSpeedOut {
2153
+ from {
2154
+ opacity: 1;
2155
+ }
2156
+
2157
+ to {
2158
+ -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
2159
+ transform: translate3d(100%, 0, 0) skewX(30deg);
2160
+ opacity: 0;
2161
+ }
2162
+ }
2163
+
2164
+ .lightSpeedOut {
2165
+ -webkit-animation-name: lightSpeedOut;
2166
+ animation-name: lightSpeedOut;
2167
+ -webkit-animation-timing-function: ease-in;
2168
+ animation-timing-function: ease-in;
2169
+ }
2170
+
2171
+ @-webkit-keyframes rotateIn {
2172
+ from {
2173
+ -webkit-transform-origin: center;
2174
+ transform-origin: center;
2175
+ -webkit-transform: rotate3d(0, 0, 1, -200deg);
2176
+ transform: rotate3d(0, 0, 1, -200deg);
2177
+ opacity: 0;
2178
+ }
2179
+
2180
+ to {
2181
+ -webkit-transform-origin: center;
2182
+ transform-origin: center;
2183
+ -webkit-transform: none;
2184
+ transform: none;
2185
+ opacity: 1;
2186
+ }
2187
+ }
2188
+
2189
+ @keyframes rotateIn {
2190
+ from {
2191
+ -webkit-transform-origin: center;
2192
+ transform-origin: center;
2193
+ -webkit-transform: rotate3d(0, 0, 1, -200deg);
2194
+ transform: rotate3d(0, 0, 1, -200deg);
2195
+ opacity: 0;
2196
+ }
2197
+
2198
+ to {
2199
+ -webkit-transform-origin: center;
2200
+ transform-origin: center;
2201
+ -webkit-transform: none;
2202
+ transform: none;
2203
+ opacity: 1;
2204
+ }
2205
+ }
2206
+
2207
+ .rotateIn {
2208
+ -webkit-animation-name: rotateIn;
2209
+ animation-name: rotateIn;
2210
+ }
2211
+
2212
+ @-webkit-keyframes rotateInDownLeft {
2213
+ from {
2214
+ -webkit-transform-origin: left bottom;
2215
+ transform-origin: left bottom;
2216
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
2217
+ transform: rotate3d(0, 0, 1, -45deg);
2218
+ opacity: 0;
2219
+ }
2220
+
2221
+ to {
2222
+ -webkit-transform-origin: left bottom;
2223
+ transform-origin: left bottom;
2224
+ -webkit-transform: none;
2225
+ transform: none;
2226
+ opacity: 1;
2227
+ }
2228
+ }
2229
+
2230
+ @keyframes rotateInDownLeft {
2231
+ from {
2232
+ -webkit-transform-origin: left bottom;
2233
+ transform-origin: left bottom;
2234
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
2235
+ transform: rotate3d(0, 0, 1, -45deg);
2236
+ opacity: 0;
2237
+ }
2238
+
2239
+ to {
2240
+ -webkit-transform-origin: left bottom;
2241
+ transform-origin: left bottom;
2242
+ -webkit-transform: none;
2243
+ transform: none;
2244
+ opacity: 1;
2245
+ }
2246
+ }
2247
+
2248
+ .rotateInDownLeft {
2249
+ -webkit-animation-name: rotateInDownLeft;
2250
+ animation-name: rotateInDownLeft;
2251
+ }
2252
+
2253
+ @-webkit-keyframes rotateInDownRight {
2254
+ from {
2255
+ -webkit-transform-origin: right bottom;
2256
+ transform-origin: right bottom;
2257
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
2258
+ transform: rotate3d(0, 0, 1, 45deg);
2259
+ opacity: 0;
2260
+ }
2261
+
2262
+ to {
2263
+ -webkit-transform-origin: right bottom;
2264
+ transform-origin: right bottom;
2265
+ -webkit-transform: none;
2266
+ transform: none;
2267
+ opacity: 1;
2268
+ }
2269
+ }
2270
+
2271
+ @keyframes rotateInDownRight {
2272
+ from {
2273
+ -webkit-transform-origin: right bottom;
2274
+ transform-origin: right bottom;
2275
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
2276
+ transform: rotate3d(0, 0, 1, 45deg);
2277
+ opacity: 0;
2278
+ }
2279
+
2280
+ to {
2281
+ -webkit-transform-origin: right bottom;
2282
+ transform-origin: right bottom;
2283
+ -webkit-transform: none;
2284
+ transform: none;
2285
+ opacity: 1;
2286
+ }
2287
+ }
2288
+
2289
+ .rotateInDownRight {
2290
+ -webkit-animation-name: rotateInDownRight;
2291
+ animation-name: rotateInDownRight;
2292
+ }
2293
+
2294
+ @-webkit-keyframes rotateInUpLeft {
2295
+ from {
2296
+ -webkit-transform-origin: left bottom;
2297
+ transform-origin: left bottom;
2298
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
2299
+ transform: rotate3d(0, 0, 1, 45deg);
2300
+ opacity: 0;
2301
+ }
2302
+
2303
+ to {
2304
+ -webkit-transform-origin: left bottom;
2305
+ transform-origin: left bottom;
2306
+ -webkit-transform: none;
2307
+ transform: none;
2308
+ opacity: 1;
2309
+ }
2310
+ }
2311
+
2312
+ @keyframes rotateInUpLeft {
2313
+ from {
2314
+ -webkit-transform-origin: left bottom;
2315
+ transform-origin: left bottom;
2316
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
2317
+ transform: rotate3d(0, 0, 1, 45deg);
2318
+ opacity: 0;
2319
+ }
2320
+
2321
+ to {
2322
+ -webkit-transform-origin: left bottom;
2323
+ transform-origin: left bottom;
2324
+ -webkit-transform: none;
2325
+ transform: none;
2326
+ opacity: 1;
2327
+ }
2328
+ }
2329
+
2330
+ .rotateInUpLeft {
2331
+ -webkit-animation-name: rotateInUpLeft;
2332
+ animation-name: rotateInUpLeft;
2333
+ }
2334
+
2335
+ @-webkit-keyframes rotateInUpRight {
2336
+ from {
2337
+ -webkit-transform-origin: right bottom;
2338
+ transform-origin: right bottom;
2339
+ -webkit-transform: rotate3d(0, 0, 1, -90deg);
2340
+ transform: rotate3d(0, 0, 1, -90deg);
2341
+ opacity: 0;
2342
+ }
2343
+
2344
+ to {
2345
+ -webkit-transform-origin: right bottom;
2346
+ transform-origin: right bottom;
2347
+ -webkit-transform: none;
2348
+ transform: none;
2349
+ opacity: 1;
2350
+ }
2351
+ }
2352
+
2353
+ @keyframes rotateInUpRight {
2354
+ from {
2355
+ -webkit-transform-origin: right bottom;
2356
+ transform-origin: right bottom;
2357
+ -webkit-transform: rotate3d(0, 0, 1, -90deg);
2358
+ transform: rotate3d(0, 0, 1, -90deg);
2359
+ opacity: 0;
2360
+ }
2361
+
2362
+ to {
2363
+ -webkit-transform-origin: right bottom;
2364
+ transform-origin: right bottom;
2365
+ -webkit-transform: none;
2366
+ transform: none;
2367
+ opacity: 1;
2368
+ }
2369
+ }
2370
+
2371
+ .rotateInUpRight {
2372
+ -webkit-animation-name: rotateInUpRight;
2373
+ animation-name: rotateInUpRight;
2374
+ }
2375
+
2376
+ @-webkit-keyframes rotateOut {
2377
+ from {
2378
+ -webkit-transform-origin: center;
2379
+ transform-origin: center;
2380
+ opacity: 1;
2381
+ }
2382
+
2383
+ to {
2384
+ -webkit-transform-origin: center;
2385
+ transform-origin: center;
2386
+ -webkit-transform: rotate3d(0, 0, 1, 200deg);
2387
+ transform: rotate3d(0, 0, 1, 200deg);
2388
+ opacity: 0;
2389
+ }
2390
+ }
2391
+
2392
+ @keyframes rotateOut {
2393
+ from {
2394
+ -webkit-transform-origin: center;
2395
+ transform-origin: center;
2396
+ opacity: 1;
2397
+ }
2398
+
2399
+ to {
2400
+ -webkit-transform-origin: center;
2401
+ transform-origin: center;
2402
+ -webkit-transform: rotate3d(0, 0, 1, 200deg);
2403
+ transform: rotate3d(0, 0, 1, 200deg);
2404
+ opacity: 0;
2405
+ }
2406
+ }
2407
+
2408
+ .rotateOut {
2409
+ -webkit-animation-name: rotateOut;
2410
+ animation-name: rotateOut;
2411
+ }
2412
+
2413
+ @-webkit-keyframes rotateOutDownLeft {
2414
+ from {
2415
+ -webkit-transform-origin: left bottom;
2416
+ transform-origin: left bottom;
2417
+ opacity: 1;
2418
+ }
2419
+
2420
+ to {
2421
+ -webkit-transform-origin: left bottom;
2422
+ transform-origin: left bottom;
2423
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
2424
+ transform: rotate3d(0, 0, 1, 45deg);
2425
+ opacity: 0;
2426
+ }
2427
+ }
2428
+
2429
+ @keyframes rotateOutDownLeft {
2430
+ from {
2431
+ -webkit-transform-origin: left bottom;
2432
+ transform-origin: left bottom;
2433
+ opacity: 1;
2434
+ }
2435
+
2436
+ to {
2437
+ -webkit-transform-origin: left bottom;
2438
+ transform-origin: left bottom;
2439
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
2440
+ transform: rotate3d(0, 0, 1, 45deg);
2441
+ opacity: 0;
2442
+ }
2443
+ }
2444
+
2445
+ .rotateOutDownLeft {
2446
+ -webkit-animation-name: rotateOutDownLeft;
2447
+ animation-name: rotateOutDownLeft;
2448
+ }
2449
+
2450
+ @-webkit-keyframes rotateOutDownRight {
2451
+ from {
2452
+ -webkit-transform-origin: right bottom;
2453
+ transform-origin: right bottom;
2454
+ opacity: 1;
2455
+ }
2456
+
2457
+ to {
2458
+ -webkit-transform-origin: right bottom;
2459
+ transform-origin: right bottom;
2460
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
2461
+ transform: rotate3d(0, 0, 1, -45deg);
2462
+ opacity: 0;
2463
+ }
2464
+ }
2465
+
2466
+ @keyframes rotateOutDownRight {
2467
+ from {
2468
+ -webkit-transform-origin: right bottom;
2469
+ transform-origin: right bottom;
2470
+ opacity: 1;
2471
+ }
2472
+
2473
+ to {
2474
+ -webkit-transform-origin: right bottom;
2475
+ transform-origin: right bottom;
2476
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
2477
+ transform: rotate3d(0, 0, 1, -45deg);
2478
+ opacity: 0;
2479
+ }
2480
+ }
2481
+
2482
+ .rotateOutDownRight {
2483
+ -webkit-animation-name: rotateOutDownRight;
2484
+ animation-name: rotateOutDownRight;
2485
+ }
2486
+
2487
+ @-webkit-keyframes rotateOutUpLeft {
2488
+ from {
2489
+ -webkit-transform-origin: left bottom;
2490
+ transform-origin: left bottom;
2491
+ opacity: 1;
2492
+ }
2493
+
2494
+ to {
2495
+ -webkit-transform-origin: left bottom;
2496
+ transform-origin: left bottom;
2497
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
2498
+ transform: rotate3d(0, 0, 1, -45deg);
2499
+ opacity: 0;
2500
+ }
2501
+ }
2502
+
2503
+ @keyframes rotateOutUpLeft {
2504
+ from {
2505
+ -webkit-transform-origin: left bottom;
2506
+ transform-origin: left bottom;
2507
+ opacity: 1;
2508
+ }
2509
+
2510
+ to {
2511
+ -webkit-transform-origin: left bottom;
2512
+ transform-origin: left bottom;
2513
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
2514
+ transform: rotate3d(0, 0, 1, -45deg);
2515
+ opacity: 0;
2516
+ }
2517
+ }
2518
+
2519
+ .rotateOutUpLeft {
2520
+ -webkit-animation-name: rotateOutUpLeft;
2521
+ animation-name: rotateOutUpLeft;
2522
+ }
2523
+
2524
+ @-webkit-keyframes rotateOutUpRight {
2525
+ from {
2526
+ -webkit-transform-origin: right bottom;
2527
+ transform-origin: right bottom;
2528
+ opacity: 1;
2529
+ }
2530
+
2531
+ to {
2532
+ -webkit-transform-origin: right bottom;
2533
+ transform-origin: right bottom;
2534
+ -webkit-transform: rotate3d(0, 0, 1, 90deg);
2535
+ transform: rotate3d(0, 0, 1, 90deg);
2536
+ opacity: 0;
2537
+ }
2538
+ }
2539
+
2540
+ @keyframes rotateOutUpRight {
2541
+ from {
2542
+ -webkit-transform-origin: right bottom;
2543
+ transform-origin: right bottom;
2544
+ opacity: 1;
2545
+ }
2546
+
2547
+ to {
2548
+ -webkit-transform-origin: right bottom;
2549
+ transform-origin: right bottom;
2550
+ -webkit-transform: rotate3d(0, 0, 1, 90deg);
2551
+ transform: rotate3d(0, 0, 1, 90deg);
2552
+ opacity: 0;
2553
+ }
2554
+ }
2555
+
2556
+ .rotateOutUpRight {
2557
+ -webkit-animation-name: rotateOutUpRight;
2558
+ animation-name: rotateOutUpRight;
2559
+ }
2560
+
2561
+ @-webkit-keyframes hinge {
2562
+ 0% {
2563
+ -webkit-transform-origin: top left;
2564
+ transform-origin: top left;
2565
+ -webkit-animation-timing-function: ease-in-out;
2566
+ animation-timing-function: ease-in-out;
2567
+ }
2568
+
2569
+ 20%, 60% {
2570
+ -webkit-transform: rotate3d(0, 0, 1, 80deg);
2571
+ transform: rotate3d(0, 0, 1, 80deg);
2572
+ -webkit-transform-origin: top left;
2573
+ transform-origin: top left;
2574
+ -webkit-animation-timing-function: ease-in-out;
2575
+ animation-timing-function: ease-in-out;
2576
+ }
2577
+
2578
+ 40%, 80% {
2579
+ -webkit-transform: rotate3d(0, 0, 1, 60deg);
2580
+ transform: rotate3d(0, 0, 1, 60deg);
2581
+ -webkit-transform-origin: top left;
2582
+ transform-origin: top left;
2583
+ -webkit-animation-timing-function: ease-in-out;
2584
+ animation-timing-function: ease-in-out;
2585
+ opacity: 1;
2586
+ }
2587
+
2588
+ to {
2589
+ -webkit-transform: translate3d(0, 700px, 0);
2590
+ transform: translate3d(0, 700px, 0);
2591
+ opacity: 0;
2592
+ }
2593
+ }
2594
+
2595
+ @keyframes hinge {
2596
+ 0% {
2597
+ -webkit-transform-origin: top left;
2598
+ transform-origin: top left;
2599
+ -webkit-animation-timing-function: ease-in-out;
2600
+ animation-timing-function: ease-in-out;
2601
+ }
2602
+
2603
+ 20%, 60% {
2604
+ -webkit-transform: rotate3d(0, 0, 1, 80deg);
2605
+ transform: rotate3d(0, 0, 1, 80deg);
2606
+ -webkit-transform-origin: top left;
2607
+ transform-origin: top left;
2608
+ -webkit-animation-timing-function: ease-in-out;
2609
+ animation-timing-function: ease-in-out;
2610
+ }
2611
+
2612
+ 40%, 80% {
2613
+ -webkit-transform: rotate3d(0, 0, 1, 60deg);
2614
+ transform: rotate3d(0, 0, 1, 60deg);
2615
+ -webkit-transform-origin: top left;
2616
+ transform-origin: top left;
2617
+ -webkit-animation-timing-function: ease-in-out;
2618
+ animation-timing-function: ease-in-out;
2619
+ opacity: 1;
2620
+ }
2621
+
2622
+ to {
2623
+ -webkit-transform: translate3d(0, 700px, 0);
2624
+ transform: translate3d(0, 700px, 0);
2625
+ opacity: 0;
2626
+ }
2627
+ }
2628
+
2629
+ .hinge {
2630
+ -webkit-animation-name: hinge;
2631
+ animation-name: hinge;
2632
+ }
2633
+
2634
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
2635
+
2636
+ @-webkit-keyframes rollIn {
2637
+ from {
2638
+ opacity: 0;
2639
+ -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2640
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2641
+ }
2642
+
2643
+ to {
2644
+ opacity: 1;
2645
+ -webkit-transform: none;
2646
+ transform: none;
2647
+ }
2648
+ }
2649
+
2650
+ @keyframes rollIn {
2651
+ from {
2652
+ opacity: 0;
2653
+ -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2654
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
2655
+ }
2656
+
2657
+ to {
2658
+ opacity: 1;
2659
+ -webkit-transform: none;
2660
+ transform: none;
2661
+ }
2662
+ }
2663
+
2664
+ .rollIn {
2665
+ -webkit-animation-name: rollIn;
2666
+ animation-name: rollIn;
2667
+ }
2668
+
2669
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
2670
+
2671
+ @-webkit-keyframes rollOut {
2672
+ from {
2673
+ opacity: 1;
2674
+ }
2675
+
2676
+ to {
2677
+ opacity: 0;
2678
+ -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2679
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2680
+ }
2681
+ }
2682
+
2683
+ @keyframes rollOut {
2684
+ from {
2685
+ opacity: 1;
2686
+ }
2687
+
2688
+ to {
2689
+ opacity: 0;
2690
+ -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2691
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
2692
+ }
2693
+ }
2694
+
2695
+ .rollOut {
2696
+ -webkit-animation-name: rollOut;
2697
+ animation-name: rollOut;
2698
+ }
2699
+
2700
+ @-webkit-keyframes zoomIn {
2701
+ from {
2702
+ opacity: 0;
2703
+ -webkit-transform: scale3d(.3, .3, .3);
2704
+ transform: scale3d(.3, .3, .3);
2705
+ }
2706
+
2707
+ 50% {
2708
+ opacity: 1;
2709
+ }
2710
+ }
2711
+
2712
+ @keyframes zoomIn {
2713
+ from {
2714
+ opacity: 0;
2715
+ -webkit-transform: scale3d(.3, .3, .3);
2716
+ transform: scale3d(.3, .3, .3);
2717
+ }
2718
+
2719
+ 50% {
2720
+ opacity: 1;
2721
+ }
2722
+ }
2723
+
2724
+ .zoomIn {
2725
+ -webkit-animation-name: zoomIn;
2726
+ animation-name: zoomIn;
2727
+ }
2728
+
2729
+ @-webkit-keyframes zoomInDown {
2730
+ from {
2731
+ opacity: 0;
2732
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2733
+ transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2734
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2735
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2736
+ }
2737
+
2738
+ 60% {
2739
+ opacity: 1;
2740
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2741
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2742
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2743
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2744
+ }
2745
+ }
2746
+
2747
+ @keyframes zoomInDown {
2748
+ from {
2749
+ opacity: 0;
2750
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2751
+ transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
2752
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2753
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2754
+ }
2755
+
2756
+ 60% {
2757
+ opacity: 1;
2758
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2759
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
2760
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2761
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2762
+ }
2763
+ }
2764
+
2765
+ .zoomInDown {
2766
+ -webkit-animation-name: zoomInDown;
2767
+ animation-name: zoomInDown;
2768
+ }
2769
+
2770
+ @-webkit-keyframes zoomInLeft {
2771
+ from {
2772
+ opacity: 0;
2773
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2774
+ transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2775
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2776
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2777
+ }
2778
+
2779
+ 60% {
2780
+ opacity: 1;
2781
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2782
+ transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2783
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2784
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2785
+ }
2786
+ }
2787
+
2788
+ @keyframes zoomInLeft {
2789
+ from {
2790
+ opacity: 0;
2791
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2792
+ transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
2793
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2794
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2795
+ }
2796
+
2797
+ 60% {
2798
+ opacity: 1;
2799
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2800
+ transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
2801
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2802
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2803
+ }
2804
+ }
2805
+
2806
+ .zoomInLeft {
2807
+ -webkit-animation-name: zoomInLeft;
2808
+ animation-name: zoomInLeft;
2809
+ }
2810
+
2811
+ @-webkit-keyframes zoomInRight {
2812
+ from {
2813
+ opacity: 0;
2814
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2815
+ transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2816
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2817
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2818
+ }
2819
+
2820
+ 60% {
2821
+ opacity: 1;
2822
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2823
+ transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2824
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2825
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2826
+ }
2827
+ }
2828
+
2829
+ @keyframes zoomInRight {
2830
+ from {
2831
+ opacity: 0;
2832
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2833
+ transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
2834
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2835
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2836
+ }
2837
+
2838
+ 60% {
2839
+ opacity: 1;
2840
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2841
+ transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
2842
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2843
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2844
+ }
2845
+ }
2846
+
2847
+ .zoomInRight {
2848
+ -webkit-animation-name: zoomInRight;
2849
+ animation-name: zoomInRight;
2850
+ }
2851
+
2852
+ @-webkit-keyframes zoomInUp {
2853
+ from {
2854
+ opacity: 0;
2855
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2856
+ transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2857
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2858
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2859
+ }
2860
+
2861
+ 60% {
2862
+ opacity: 1;
2863
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2864
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2865
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2866
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2867
+ }
2868
+ }
2869
+
2870
+ @keyframes zoomInUp {
2871
+ from {
2872
+ opacity: 0;
2873
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2874
+ transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
2875
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2876
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2877
+ }
2878
+
2879
+ 60% {
2880
+ opacity: 1;
2881
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2882
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2883
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2884
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2885
+ }
2886
+ }
2887
+
2888
+ .zoomInUp {
2889
+ -webkit-animation-name: zoomInUp;
2890
+ animation-name: zoomInUp;
2891
+ }
2892
+
2893
+ @-webkit-keyframes zoomOut {
2894
+ from {
2895
+ opacity: 1;
2896
+ }
2897
+
2898
+ 50% {
2899
+ opacity: 0;
2900
+ -webkit-transform: scale3d(.3, .3, .3);
2901
+ transform: scale3d(.3, .3, .3);
2902
+ }
2903
+
2904
+ to {
2905
+ opacity: 0;
2906
+ }
2907
+ }
2908
+
2909
+ @keyframes zoomOut {
2910
+ from {
2911
+ opacity: 1;
2912
+ }
2913
+
2914
+ 50% {
2915
+ opacity: 0;
2916
+ -webkit-transform: scale3d(.3, .3, .3);
2917
+ transform: scale3d(.3, .3, .3);
2918
+ }
2919
+
2920
+ to {
2921
+ opacity: 0;
2922
+ }
2923
+ }
2924
+
2925
+ .zoomOut {
2926
+ -webkit-animation-name: zoomOut;
2927
+ animation-name: zoomOut;
2928
+ }
2929
+
2930
+ @-webkit-keyframes zoomOutDown {
2931
+ 40% {
2932
+ opacity: 1;
2933
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2934
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2935
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2936
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2937
+ }
2938
+
2939
+ to {
2940
+ opacity: 0;
2941
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2942
+ transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2943
+ -webkit-transform-origin: center bottom;
2944
+ transform-origin: center bottom;
2945
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2946
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2947
+ }
2948
+ }
2949
+
2950
+ @keyframes zoomOutDown {
2951
+ 40% {
2952
+ opacity: 1;
2953
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2954
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
2955
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2956
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
2957
+ }
2958
+
2959
+ to {
2960
+ opacity: 0;
2961
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2962
+ transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
2963
+ -webkit-transform-origin: center bottom;
2964
+ transform-origin: center bottom;
2965
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2966
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
2967
+ }
2968
+ }
2969
+
2970
+ .zoomOutDown {
2971
+ -webkit-animation-name: zoomOutDown;
2972
+ animation-name: zoomOutDown;
2973
+ }
2974
+
2975
+ @-webkit-keyframes zoomOutLeft {
2976
+ 40% {
2977
+ opacity: 1;
2978
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2979
+ transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2980
+ }
2981
+
2982
+ to {
2983
+ opacity: 0;
2984
+ -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
2985
+ transform: scale(.1) translate3d(-2000px, 0, 0);
2986
+ -webkit-transform-origin: left center;
2987
+ transform-origin: left center;
2988
+ }
2989
+ }
2990
+
2991
+ @keyframes zoomOutLeft {
2992
+ 40% {
2993
+ opacity: 1;
2994
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2995
+ transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
2996
+ }
2997
+
2998
+ to {
2999
+ opacity: 0;
3000
+ -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
3001
+ transform: scale(.1) translate3d(-2000px, 0, 0);
3002
+ -webkit-transform-origin: left center;
3003
+ transform-origin: left center;
3004
+ }
3005
+ }
3006
+
3007
+ .zoomOutLeft {
3008
+ -webkit-animation-name: zoomOutLeft;
3009
+ animation-name: zoomOutLeft;
3010
+ }
3011
+
3012
+ @-webkit-keyframes zoomOutRight {
3013
+ 40% {
3014
+ opacity: 1;
3015
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
3016
+ transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
3017
+ }
3018
+
3019
+ to {
3020
+ opacity: 0;
3021
+ -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
3022
+ transform: scale(.1) translate3d(2000px, 0, 0);
3023
+ -webkit-transform-origin: right center;
3024
+ transform-origin: right center;
3025
+ }
3026
+ }
3027
+
3028
+ @keyframes zoomOutRight {
3029
+ 40% {
3030
+ opacity: 1;
3031
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
3032
+ transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
3033
+ }
3034
+
3035
+ to {
3036
+ opacity: 0;
3037
+ -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
3038
+ transform: scale(.1) translate3d(2000px, 0, 0);
3039
+ -webkit-transform-origin: right center;
3040
+ transform-origin: right center;
3041
+ }
3042
+ }
3043
+
3044
+ .zoomOutRight {
3045
+ -webkit-animation-name: zoomOutRight;
3046
+ animation-name: zoomOutRight;
3047
+ }
3048
+
3049
+ @-webkit-keyframes zoomOutUp {
3050
+ 40% {
3051
+ opacity: 1;
3052
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
3053
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
3054
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
3055
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
3056
+ }
3057
+
3058
+ to {
3059
+ opacity: 0;
3060
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
3061
+ transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
3062
+ -webkit-transform-origin: center bottom;
3063
+ transform-origin: center bottom;
3064
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
3065
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
3066
+ }
3067
+ }
3068
+
3069
+ @keyframes zoomOutUp {
3070
+ 40% {
3071
+ opacity: 1;
3072
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
3073
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
3074
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
3075
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
3076
+ }
3077
+
3078
+ to {
3079
+ opacity: 0;
3080
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
3081
+ transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
3082
+ -webkit-transform-origin: center bottom;
3083
+ transform-origin: center bottom;
3084
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
3085
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
3086
+ }
3087
+ }
3088
+
3089
+ .zoomOutUp {
3090
+ -webkit-animation-name: zoomOutUp;
3091
+ animation-name: zoomOutUp;
3092
+ }
3093
+
3094
+ @-webkit-keyframes slideInDown {
3095
+ from {
3096
+ -webkit-transform: translate3d(0, -100%, 0);
3097
+ transform: translate3d(0, -100%, 0);
3098
+ visibility: visible;
3099
+ }
3100
+
3101
+ to {
3102
+ -webkit-transform: translate3d(0, 0, 0);
3103
+ transform: translate3d(0, 0, 0);
3104
+ }
3105
+ }
3106
+
3107
+ @keyframes slideInDown {
3108
+ from {
3109
+ -webkit-transform: translate3d(0, -100%, 0);
3110
+ transform: translate3d(0, -100%, 0);
3111
+ visibility: visible;
3112
+ }
3113
+
3114
+ to {
3115
+ -webkit-transform: translate3d(0, 0, 0);
3116
+ transform: translate3d(0, 0, 0);
3117
+ }
3118
+ }
3119
+
3120
+ .slideInDown {
3121
+ -webkit-animation-name: slideInDown;
3122
+ animation-name: slideInDown;
3123
+ }
3124
+
3125
+ @-webkit-keyframes slideInLeft {
3126
+ from {
3127
+ -webkit-transform: translate3d(-100%, 0, 0);
3128
+ transform: translate3d(-100%, 0, 0);
3129
+ visibility: visible;
3130
+ }
3131
+
3132
+ to {
3133
+ -webkit-transform: translate3d(0, 0, 0);
3134
+ transform: translate3d(0, 0, 0);
3135
+ }
3136
+ }
3137
+
3138
+ @keyframes slideInLeft {
3139
+ from {
3140
+ -webkit-transform: translate3d(-100%, 0, 0);
3141
+ transform: translate3d(-100%, 0, 0);
3142
+ visibility: visible;
3143
+ }
3144
+
3145
+ to {
3146
+ -webkit-transform: translate3d(0, 0, 0);
3147
+ transform: translate3d(0, 0, 0);
3148
+ }
3149
+ }
3150
+
3151
+ .slideInLeft {
3152
+ -webkit-animation-name: slideInLeft;
3153
+ animation-name: slideInLeft;
3154
+ }
3155
+
3156
+ @-webkit-keyframes slideInRight {
3157
+ from {
3158
+ -webkit-transform: translate3d(100%, 0, 0);
3159
+ transform: translate3d(100%, 0, 0);
3160
+ visibility: visible;
3161
+ }
3162
+
3163
+ to {
3164
+ -webkit-transform: translate3d(0, 0, 0);
3165
+ transform: translate3d(0, 0, 0);
3166
+ }
3167
+ }
3168
+
3169
+ @keyframes slideInRight {
3170
+ from {
3171
+ -webkit-transform: translate3d(100%, 0, 0);
3172
+ transform: translate3d(100%, 0, 0);
3173
+ visibility: visible;
3174
+ }
3175
+
3176
+ to {
3177
+ -webkit-transform: translate3d(0, 0, 0);
3178
+ transform: translate3d(0, 0, 0);
3179
+ }
3180
+ }
3181
+
3182
+ .slideInRight {
3183
+ -webkit-animation-name: slideInRight;
3184
+ animation-name: slideInRight;
3185
+ }
3186
+
3187
+ @-webkit-keyframes slideInUp {
3188
+ from {
3189
+ -webkit-transform: translate3d(0, 100%, 0);
3190
+ transform: translate3d(0, 100%, 0);
3191
+ visibility: visible;
3192
+ }
3193
+
3194
+ to {
3195
+ -webkit-transform: translate3d(0, 0, 0);
3196
+ transform: translate3d(0, 0, 0);
3197
+ }
3198
+ }
3199
+
3200
+ @keyframes slideInUp {
3201
+ from {
3202
+ -webkit-transform: translate3d(0, 100%, 0);
3203
+ transform: translate3d(0, 100%, 0);
3204
+ visibility: visible;
3205
+ }
3206
+
3207
+ to {
3208
+ -webkit-transform: translate3d(0, 0, 0);
3209
+ transform: translate3d(0, 0, 0);
3210
+ }
3211
+ }
3212
+
3213
+ .slideInUp {
3214
+ -webkit-animation-name: slideInUp;
3215
+ animation-name: slideInUp;
3216
+ }
3217
+
3218
+ @-webkit-keyframes slideOutDown {
3219
+ from {
3220
+ -webkit-transform: translate3d(0, 0, 0);
3221
+ transform: translate3d(0, 0, 0);
3222
+ }
3223
+
3224
+ to {
3225
+ visibility: hidden;
3226
+ -webkit-transform: translate3d(0, 100%, 0);
3227
+ transform: translate3d(0, 100%, 0);
3228
+ }
3229
+ }
3230
+
3231
+ @keyframes slideOutDown {
3232
+ from {
3233
+ -webkit-transform: translate3d(0, 0, 0);
3234
+ transform: translate3d(0, 0, 0);
3235
+ }
3236
+
3237
+ to {
3238
+ visibility: hidden;
3239
+ -webkit-transform: translate3d(0, 100%, 0);
3240
+ transform: translate3d(0, 100%, 0);
3241
+ }
3242
+ }
3243
+
3244
+ .slideOutDown {
3245
+ -webkit-animation-name: slideOutDown;
3246
+ animation-name: slideOutDown;
3247
+ }
3248
+
3249
+ @-webkit-keyframes slideOutLeft {
3250
+ from {
3251
+ -webkit-transform: translate3d(0, 0, 0);
3252
+ transform: translate3d(0, 0, 0);
3253
+ }
3254
+
3255
+ to {
3256
+ visibility: hidden;
3257
+ -webkit-transform: translate3d(-100%, 0, 0);
3258
+ transform: translate3d(-100%, 0, 0);
3259
+ }
3260
+ }
3261
+
3262
+ @keyframes slideOutLeft {
3263
+ from {
3264
+ -webkit-transform: translate3d(0, 0, 0);
3265
+ transform: translate3d(0, 0, 0);
3266
+ }
3267
+
3268
+ to {
3269
+ visibility: hidden;
3270
+ -webkit-transform: translate3d(-100%, 0, 0);
3271
+ transform: translate3d(-100%, 0, 0);
3272
+ }
3273
+ }
3274
+
3275
+ .slideOutLeft {
3276
+ -webkit-animation-name: slideOutLeft;
3277
+ animation-name: slideOutLeft;
3278
+ }
3279
+
3280
+ @-webkit-keyframes slideOutRight {
3281
+ from {
3282
+ -webkit-transform: translate3d(0, 0, 0);
3283
+ transform: translate3d(0, 0, 0);
3284
+ }
3285
+
3286
+ to {
3287
+ visibility: hidden;
3288
+ -webkit-transform: translate3d(100%, 0, 0);
3289
+ transform: translate3d(100%, 0, 0);
3290
+ }
3291
+ }
3292
+
3293
+ @keyframes slideOutRight {
3294
+ from {
3295
+ -webkit-transform: translate3d(0, 0, 0);
3296
+ transform: translate3d(0, 0, 0);
3297
+ }
3298
+
3299
+ to {
3300
+ visibility: hidden;
3301
+ -webkit-transform: translate3d(100%, 0, 0);
3302
+ transform: translate3d(100%, 0, 0);
3303
+ }
3304
+ }
3305
+
3306
+ .slideOutRight {
3307
+ -webkit-animation-name: slideOutRight;
3308
+ animation-name: slideOutRight;
3309
+ }
3310
+
3311
+ @-webkit-keyframes slideOutUp {
3312
+ from {
3313
+ -webkit-transform: translate3d(0, 0, 0);
3314
+ transform: translate3d(0, 0, 0);
3315
+ }
3316
+
3317
+ to {
3318
+ visibility: hidden;
3319
+ -webkit-transform: translate3d(0, -100%, 0);
3320
+ transform: translate3d(0, -100%, 0);
3321
+ }
3322
+ }
3323
+
3324
+ @keyframes slideOutUp {
3325
+ from {
3326
+ -webkit-transform: translate3d(0, 0, 0);
3327
+ transform: translate3d(0, 0, 0);
3328
+ }
3329
+
3330
+ to {
3331
+ visibility: hidden;
3332
+ -webkit-transform: translate3d(0, -100%, 0);
3333
+ transform: translate3d(0, -100%, 0);
3334
+ }
3335
+ }
3336
+
3337
+ .slideOutUp {
3338
+ -webkit-animation-name: slideOutUp;
3339
+ animation-name: slideOutUp;
3340
+ }
assets/front/css/animate.min.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ @charset "UTF-8";/*!
2
+ * animate.css -http://daneden.me/animate
3
+ * Version - 3.5.1
4
+ * Licensed under the MIT license - http://opensource.org/licenses/MIT
5
+ *
6
+ * Copyright (c) 2016 Daniel Eden
7
+ */.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}.animated.flipOutX,.animated.flipOutY,.animated.bounceIn,.animated.bounceOut{-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounce{from,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{from,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);animation-timing-function:cubic-bezier(0.755,0.050,0.855,0.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{from,50%,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{from,50%,to{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,0.75,1);transform:scale3d(1.25,0.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,0.85,1);transform:scale3d(1.15,0.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,0.75,1);transform:scale3d(1.25,0.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,0.85,1);transform:scale3d(1.15,0.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{from,to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes headShake{0{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.headShake{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-name:headShake;animation-name:headShake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}to{-webkit-transform:rotate3d(0,0,1,0);transform:rotate3d(0,0,1,0)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}to{-webkit-transform:rotate3d(0,0,1,0);transform:rotate3d(0,0,1,0)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{from{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}to{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{from{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}to{-webkit-transform:none;transform:none}}@keyframes wobble{from{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}to{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{from,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-0.78125deg) skewY(-0.78125deg);transform:skewX(-0.78125deg) skewY(-0.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-0.1953125deg) skewY(-0.1953125deg);transform:skewX(-0.1953125deg) skewY(-0.1953125deg)}}@keyframes jello{from,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-0.78125deg) skewY(-0.78125deg);transform:skewX(-0.78125deg) skewY(-0.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-0.1953125deg) skewY(-0.1953125deg);transform:skewX(-0.1953125deg) skewY(-0.1953125deg)}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes bounceIn{from,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{from,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInDown{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInRight{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}from{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000);animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}from{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{from{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{from{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{from{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{from{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{from{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{from{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{from{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}@-webkit-keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{from{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}to{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}to{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{from{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{from{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{from{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{from{-webkit-transform-origin:center;transform-origin:center;opacity:1}to{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{from{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}to{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{from{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}to{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{from{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}to{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{from{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}@keyframes zoomInDown{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}@keyframes zoomInLeft{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}@keyframes zoomInRight{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}@keyframes zoomInUp{from{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes zoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190);animation-timing-function:cubic-bezier(0.550,0.055,0.675,0.190)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,0.885,0.320,1);animation-timing-function:cubic-bezier(0.175,0.885,0.320,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInDown{from{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInLeft{from{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInRight{from{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideInUp{from{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{from{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}
assets/front/css/owl.carousel.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .owl-carousel{display:none;width:100%;-webkit-tap-highlight-color:transparent;position:relative;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item{position:relative;min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%;-webkit-transform-style:preserve-3d}.owl-carousel .owl-nav.disabled,.owl-carousel .owl-dots.disabled{display:none}.owl-carousel .owl-nav .owl-prev,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-dot{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loaded{display:block}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{display:none}.owl-carousel.owl-drag .owl-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.no-js .owl-carousel{display:block}.owl-carousel .animated{-webkit-animation-duration:1000ms;animation-duration:1000ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOut{0{opacity:1}100%{opacity:0}}@keyframes fadeOut{0{opacity:1}100%{opacity:0}}.owl-height{transition:height 500ms ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity 400ms ease}.owl-carousel .owl-item img.owl-lazy{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url("owl.video.play.png") no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:-webkit-transform 100ms ease;transition:transform 100ms ease}.owl-carousel .owl-video-play-icon:hover{-webkit-transform:scale(1.3,1.3);-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-tn,.owl-carousel .owl-video-playing .owl-video-play-icon{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity 400ms ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
assets/front/css/owl.theme.default.min.min.css ADDED
File without changes
assets/front/css/style.css CHANGED
@@ -5,8 +5,9 @@
5
  /*CSS front page*/
6
 
7
  .wcps-container {
8
- background:none repeat scroll 0 0 rgb(241, 241, 241);
9
  overflow: hidden;
 
10
  position: relative;
11
  }
12
 
@@ -93,6 +94,11 @@ background:url("ribbons/dis-100.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0);
93
 
94
 
95
 
 
 
 
 
 
96
 
97
  .wcps-container .owl-nav.middle {
98
  left: 0;
@@ -135,7 +141,7 @@ background:url("ribbons/dis-100.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0);
135
 
136
  .wcps-container:hover .owl-nav.middle .owl-prev,
137
  .wcps-container:hover .owl-nav.middle .owl-next {
138
- box-shadow: 0 0 12px 3px rgba(183, 183, 183, 0.54);
139
  }
140
 
141
 
@@ -168,7 +174,7 @@ right: 30px;
168
  border-radius: 50%;
169
  color: rgb(0, 0, 0);
170
  height: 50px;
171
- left: -30px;
172
  padding: 0;
173
  position: absolute;
174
  top: 0;
@@ -185,7 +191,7 @@ right: 30px;
185
  height: 50px;
186
  padding: 0;
187
  position: absolute;
188
- right: -30px;
189
  top: 0;
190
 
191
  width: 50px;
@@ -195,16 +201,16 @@ right: 30px;
195
 
196
  .wcps-container:hover .owl-nav.middle-fixed .owl-prev,
197
  .wcps-container:hover .owl-nav.middle-fixed .owl-next {
198
- box-shadow: 0 0 12px 3px rgba(183, 183, 183, 0.54);
199
  }
200
 
201
 
202
  .wcps-container:hover .owl-nav.middle-fixed .owl-prev {
203
- left: -30px;
204
  }
205
 
206
  .wcps-container:hover .owl-nav.middle-fixed .owl-next {
207
- right: -30px;
208
  }
209
 
210
 
@@ -222,6 +228,10 @@ right: -30px;
222
 
223
 
224
 
 
 
 
 
225
  /* Navigation CSS topright*/
226
  .wcps-container .owl-nav.topright {
227
  position: absolute;
@@ -229,6 +239,20 @@ right: -30px;
229
  top: 15px;
230
  }
231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  .wcps-container .owl-nav.topright .owl-prev {
233
  background: url("images/arrow-prev.png") no-repeat scroll 0 0 rgb(255, 255, 255);
234
  border: 1px solid rgba(221, 221, 221, 0.0);
@@ -241,35 +265,48 @@ right: -30px;
241
  display: inline-block;
242
  background-position: 10px 5px;
243
  margin: 0 5px;
 
244
  }
245
 
246
 
 
247
  .wcps-container .owl-nav.topright .owl-next {
248
- background: url("images/arrow-next.png") no-repeat scroll 0 0 rgb(255, 255, 255);
249
- border: 1px solid rgba(221, 221, 221, 0.0);
250
- border-radius: 3px;
251
  color: rgb(0, 0, 0);
252
  padding: 0;
253
- width: 50px;
254
  opacity: 1;
255
- height: 30px;
256
  display: inline-block;
257
- background-position: 10px 5px;
258
  }
 
259
 
 
 
 
 
 
 
 
 
 
 
 
260
 
261
-
 
 
 
262
  .wcps-container .owl-nav.topright div.owl-prev:hover{
263
  background-image: url("images/arrow-prev.png") ;
264
- background-color:rgba(185, 185, 185, 0.3);
265
- border: 1px solid rgb(221, 221, 221);
266
- }
267
 
268
 
269
  .wcps-container .owl-nav.topright div.owl-next:hover{
270
  background-image: url("images/arrow-next.png");
271
- background-color:rgba(185, 185, 185, 0.3);
272
- border: 1px solid rgb(221, 221, 221);}
273
 
274
 
275
 
@@ -287,6 +324,7 @@ right: -30px;
287
  margin: 5px 7px;
288
  opacity: 0.5;
289
  width: 15px;
 
290
  }
291
 
292
  .wcps-container .owl-dots .owl-dot:hover,
@@ -382,15 +420,15 @@ right: -30px;
382
  }
383
 
384
  .wcps-container .wcps-zoom {
385
- /* background: rgba(0, 0, 0, 0.2) none repeat scroll 0 0; */
386
- /* height: 100%; */
387
- left: 0;
388
- opacity: 0;
389
- position: absolute;
390
- text-align: center;
391
- top: 0;
392
- transition: all 0.3s ease 0s;
393
- width: 100%;
394
  }
395
 
396
  .wcps-container .wcps-items:hover .wcps-zoom {
@@ -401,15 +439,16 @@ right: -30px;
401
  .wcps-container .wcps-zoom .fa {
402
  background: #fff none repeat scroll 0 0;
403
  border-radius: 50%;
404
- box-shadow: 0 0 4px 0 #333;
405
- color: #99999980;
406
  cursor: pointer;
407
- font-size: 25px;
408
- margin-top: 30%;
409
- /* padding: 10px; */
410
- width: 50px;
411
- height: 50px;
412
- line-height: 46px;
 
413
  }
414
 
415
  .wcps-container .wcps-zoom-thumb {
@@ -513,15 +552,6 @@ right: -30px;
513
  text-decoration: none;
514
  }
515
 
516
- .wcps-container .wcps-items-tag {
517
- padding: 5px 12px;
518
- }
519
-
520
- .wcps-container .wcps-items-tag a {
521
- text-decoration: none;
522
- }
523
-
524
-
525
  .wcps-container .wcps-items-rating {
526
  padding: 5px 12px;
527
  }
@@ -544,7 +574,9 @@ right: -30px;
544
  text-align: left;
545
  }
546
 
547
-
 
 
548
 
549
 
550
  .wcps-container .wcps-items div.wcps-items-cart p {
5
  /*CSS front page*/
6
 
7
  .wcps-container {
8
+ background: rgb(241, 241, 241) none repeat scroll 0 0;
9
  overflow: hidden;
10
+ padding: 20px;
11
  position: relative;
12
  }
13
 
94
 
95
 
96
 
97
+ /* Navigation CSS middle */
98
+
99
+
100
+
101
+
102
 
103
  .wcps-container .owl-nav.middle {
104
  left: 0;
141
 
142
  .wcps-container:hover .owl-nav.middle .owl-prev,
143
  .wcps-container:hover .owl-nav.middle .owl-next {
144
+ box-shadow: 0 0 8px 0 rgb(102, 102, 102);
145
  }
146
 
147
 
174
  border-radius: 50%;
175
  color: rgb(0, 0, 0);
176
  height: 50px;
177
+ left: -40px;
178
  padding: 0;
179
  position: absolute;
180
  top: 0;
191
  height: 50px;
192
  padding: 0;
193
  position: absolute;
194
+ right: -40px;
195
  top: 0;
196
 
197
  width: 50px;
201
 
202
  .wcps-container:hover .owl-nav.middle-fixed .owl-prev,
203
  .wcps-container:hover .owl-nav.middle-fixed .owl-next {
204
+ box-shadow: 0 0 8px 0 rgb(102, 102, 102);
205
  }
206
 
207
 
208
  .wcps-container:hover .owl-nav.middle-fixed .owl-prev {
209
+ left: -40px;
210
  }
211
 
212
  .wcps-container:hover .owl-nav.middle-fixed .owl-next {
213
+ right: -40px;
214
  }
215
 
216
 
228
 
229
 
230
 
231
+
232
+
233
+
234
+
235
  /* Navigation CSS topright*/
236
  .wcps-container .owl-nav.topright {
237
  position: absolute;
239
  top: 15px;
240
  }
241
 
242
+ /*
243
+ .wcps-container .owl-nav.topright .owl-prev {
244
+ background: url("images/arrow-prev.png") repeat scroll 0 0 rgb(255, 255, 255);
245
+ border: 1px solid rgb(221, 221, 221);
246
+ border-radius: 0;
247
+ color: rgb(0, 0, 0);
248
+ height: 20px;
249
+ padding: 0;
250
+ opacity: 1;
251
+ width: 30px;
252
+ display: inline-block;
253
+ }
254
+ */
255
+
256
  .wcps-container .owl-nav.topright .owl-prev {
257
  background: url("images/arrow-prev.png") no-repeat scroll 0 0 rgb(255, 255, 255);
258
  border: 1px solid rgba(221, 221, 221, 0.0);
265
  display: inline-block;
266
  background-position: 10px 5px;
267
  margin: 0 5px;
268
+
269
  }
270
 
271
 
272
+ /*
273
  .wcps-container .owl-nav.topright .owl-next {
274
+ background: url("images/arrow-next.png") repeat scroll 0 0 rgb(255, 255, 255);
275
+ border: 1px solid rgb(221, 221, 221);
276
+ border-radius: 0;
277
  color: rgb(0, 0, 0);
278
  padding: 0;
279
+ width: 30px;
280
  opacity: 1;
281
+ height: 20px;
282
  display: inline-block;
 
283
  }
284
+ */
285
 
286
+ .wcps-container .owl-nav.topright .owl-next {
287
+ background: url("images/arrow-next.png") no-repeat scroll 0 0 rgb(255, 255, 255);
288
+ border: 1px solid rgba(221, 221, 221, 0.0);
289
+ border-radius: 3px;
290
+ color: rgb(0, 0, 0);
291
+ padding: 0;
292
+ width: 50px;
293
+ opacity: 1;
294
+ height: 30px;
295
+ display: inline-block;
296
+ background-position: 10px 5px;
297
 
298
+ }
299
+ .wcps-container .owl-nav.topright .owl-next,.wcps-container .owl-nav.topright .owl-prev{
300
+ border: 1px solid rgba(0, 0, 0, 0.16);
301
+ }
302
  .wcps-container .owl-nav.topright div.owl-prev:hover{
303
  background-image: url("images/arrow-prev.png") ;
304
+ background-color:#d5d5d5 !important; }
 
 
305
 
306
 
307
  .wcps-container .owl-nav.topright div.owl-next:hover{
308
  background-image: url("images/arrow-next.png");
309
+ background-color:#d5d5d5 !important; }
 
310
 
311
 
312
 
324
  margin: 5px 7px;
325
  opacity: 0.5;
326
  width: 15px;
327
+ vertical-align: top;
328
  }
329
 
330
  .wcps-container .owl-dots .owl-dot:hover,
420
  }
421
 
422
  .wcps-container .wcps-zoom {
423
+ background: rgba(0, 0, 0, 0.2) none repeat scroll 0 0;
424
+ height: 100%;
425
+ left: 0;
426
+ opacity: 0;
427
+ position: absolute;
428
+ text-align: center;
429
+ top: 0;
430
+ transition: all 0.3s ease 0s;
431
+ width: 100%;
432
  }
433
 
434
  .wcps-container .wcps-items:hover .wcps-zoom {
439
  .wcps-container .wcps-zoom .fa {
440
  background: #fff none repeat scroll 0 0;
441
  border-radius: 50%;
442
+ /* box-shadow: 0 0 4px 0 #333; */
443
+ color: #999;
444
  cursor: pointer;
445
+ font-size: 22px;
446
+ /* margin-top: 30%; */
447
+ padding: 13px;
448
+ position: absolute;
449
+ top: 50%;
450
+ left: 50%;
451
+ transform: translate(-50%, -50%);
452
  }
453
 
454
  .wcps-container .wcps-zoom-thumb {
552
  text-decoration: none;
553
  }
554
 
 
 
 
 
 
 
 
 
 
555
  .wcps-container .wcps-items-rating {
556
  padding: 5px 12px;
557
  }
574
  text-align: left;
575
  }
576
 
577
+ .wcps-container .wcps-items-cart .quantity {
578
+ width: 45px;
579
+ }
580
 
581
 
582
  .wcps-container .wcps-items div.wcps-items-cart p {
assets/front/css/style.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @charset "utf-8";.wcps-container{background:#f1f1f1 none repeat scroll 0 0;overflow:hidden;padding:20px;position:relative}.wcps-container div.wcps-ribbon{box-shadow:0 2px 4px -1px #333;height:24px;left:-27px;position:absolute;top:14px;transform:rotate(-50deg);width:90px;z-index:10}.wcps-container div.wcps-ribbon.wcps-ribbon-none{background:url("ribbons/none.png") no-repeat scroll 0 0 rgba(0,0,0,0);display:none !important}.wcps-container div.wcps-ribbon.wcps-ribbon-free{background:url("ribbons/free.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-save{background:url("ribbons/save.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-hot{background:url("ribbons/hot.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-pro{background:url("ribbons/pro.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-best{background:url("ribbons/best.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-gift{background:url("ribbons/gift.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-sale{background:url("ribbons/sale.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-new{background:url("ribbons/new.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-top{background:url("ribbons/top.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-fresh{background:url("ribbons/fresh.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-10{background:url("ribbons/dis-10.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-20{background:url("ribbons/dis-20.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-30{background:url("ribbons/dis-30.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-40{background:url("ribbons/dis-40.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-50{background:url("ribbons/dis-50.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-60{background:url("ribbons/dis-60.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-70{background:url("ribbons/dis-70.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-80{background:url("ribbons/dis-80.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-90{background:url("ribbons/dis-90.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container div.wcps-ribbon.wcps-ribbon-dis-100{background:url("ribbons/dis-100.png") no-repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container .owl-nav.middle{left:0;position:absolute;top:40%;width:100%}.wcps-container .owl-nav.middle .owl-prev{background:url("images/arrow-prev.png") no-repeat scroll 10px 14px rgba(0,0,0,0);border:1px solid #ddd;border-radius:50%;color:#000;height:50px;left:-100px;padding:0;position:absolute;top:0;width:50px;transition:all .6s ease 0}.wcps-container .owl-nav.middle .owl-next{background:url("images/arrow-next.png") no-repeat scroll 10px 14px rgba(0,0,0,0);border:1px solid #ddd;border-radius:50%;color:#000;height:50px;padding:0;position:absolute;right:-100px;top:0;width:50px;transition:all .6s ease 0}.wcps-container:hover .owl-nav.middle .owl-prev,.wcps-container:hover .owl-nav.middle .owl-next{box-shadow:0 0 8px 0 #666}.wcps-container:hover .owl-nav.middle .owl-prev{left:30px}.wcps-container:hover .owl-nav.middle .owl-next{right:30px}.wcps-container .owl-nav.middle-fixed{left:0;position:absolute;top:40%;width:100%}.wcps-container .owl-nav.middle-fixed .owl-prev{background:url("images/arrow-prev.png") no-repeat scroll 10px 14px rgba(0,0,0,0);border:1px solid #ddd;border-radius:50%;color:#000;height:50px;left:-40px;padding:0;position:absolute;top:0;width:50px;transition:all .6s ease 0}.wcps-container .owl-nav.middle-fixed .owl-next{background:url("images/arrow-next.png") no-repeat scroll 10px 14px rgba(0,0,0,0);border:1px solid #ddd;border-radius:50%;color:#000;height:50px;padding:0;position:absolute;right:-40px;top:0;width:50px;transition:all .6s ease 0}.wcps-container:hover .owl-nav.middle-fixed .owl-prev,.wcps-container:hover .owl-nav.middle-fixed .owl-next{box-shadow:0 0 8px 0 #666}.wcps-container:hover .owl-nav.middle-fixed .owl-prev{left:-40px}.wcps-container:hover .owl-nav.middle-fixed .owl-next{right:-40px}.wcps-container .owl-nav.topright{position:absolute;right:15px;top:15px}.wcps-container .owl-nav.topright .owl-prev{background:url("images/arrow-prev.png") no-repeat scroll 0 0 #fff;border:1px solid rgba(221,221,221,0.0);border-radius:3px;color:#000;height:30px;padding:0;opacity:1;width:50px;display:inline-block;background-position:10px 5px;margin:0 5px;box-shadow:0 0 6px 2px rgba(153,151,151,0.3)}.wcps-container .owl-nav.topright .owl-next{background:url("images/arrow-next.png") no-repeat scroll 0 0 #fff;border:1px solid rgba(221,221,221,0.0);border-radius:3px;color:#000;padding:0;width:50px;opacity:1;height:30px;display:inline-block;background-position:10px 5px;box-shadow:0 0 6px 2px rgba(153,151,151,0.3)}.wcps-container .owl-nav.topright div.owl-prev:hover{background-image:url("images/arrow-prev.png");background-color:#d5d5d5 !important}.wcps-container .owl-nav.topright div.owl-next:hover{background-image:url("images/arrow-next.png");background-color:#d5d5d5 !important}.wcps-container .owl-dots{margin:30px 0 0;text-align:center}.wcps-container .owl-dots .owl-dot{background:rgba(107,107,107,0.37);border-radius:20px;display:inline-block;height:15px;margin:5px 7px;opacity:.5;width:15px;vertical-align:top}.wcps-container .owl-dots .owl-dot:hover,.wcps-container .owl-dots .owl-dot.active{opacity:1}.wcps-container div.wcps-items-sale{background:#fff url("images/sale.png") no-repeat scroll 8px 8px;border-radius:50%;box-shadow:0 0 4px -2px #000;height:50px;position:absolute;right:10px;top:10px;width:50px}.wcps-container div.wcps-featured{background:#fff url("images/featured.png") no-repeat scroll 4px 4px;border-radius:50%;box-shadow:0 0 2px 0 #999;color:#fff;font-size:12px;height:40px;left:10px;padding:0;position:absolute;top:10px;width:40px}.wcps-container div.wcps-sale{background:url("images/sale.png") no-repeat scroll 0 center #f1f1f1;box-shadow:0 1px 6px -3px #999;color:#fff;font-size:12px;height:30px;padding:0;position:absolute;right:-30px;top:0;transform:rotate(45deg);width:90px}.wcps-container .stars-list{display:inline;position:relative;text-align:left}.wcps-container .stars-list .stars{left:0;overflow:hidden}.wcps-container .stars-list .stars i{display:inline-block;margin-top:3px;vertical-align:top}.wcps-container .stars-list .star-length{float:left;height:33px;left:0;overflow:hidden;position:absolute;top:0}.wcps-container .stars-list .star-length i{display:inline-block;top:0;vertical-align:top}.wcps-container .wcps-items-rating{color:#ffe400}.wcps-container .wcps-zoom{background:rgba(0,0,0,0.2) none repeat scroll 0 0;height:100%;left:0;opacity:0;position:absolute;text-align:center;top:0;transition:all .3s ease 0;width:100%}.wcps-container .wcps-items:hover .wcps-zoom{opacity:1}.wcps-container .wcps-zoom .fa{background:#fff none repeat scroll 0 0;border-radius:50%;box-shadow:0 0 4px 0 #333;color:#999;cursor:pointer;font-size:35px;margin-top:30%;padding:10px}.wcps-container .wcps-zoom-thumb{background:rgba(0,0,0,0.3) none repeat scroll 0 0;display:none;height:100%;left:0;overflow-y:scroll;position:fixed;text-align:center;top:0;width:100%;z-index:2147483647}.wcps-container .wcps-zoom-thumb img{margin:50px 0}.wcps-container .wcps-zoom-thumb .wcps-zoom-colse{background:#ff5028 none repeat scroll 0 0;color:#fff;cursor:pointer;display:inline-block;font-size:16px;height:26px;margin-top:50px;position:relative;text-align:center;vertical-align:top;width:28px}.wcps-container .wcps-items{background:#fff none repeat scroll 0 0;margin:0 10px;overflow:hidden;padding:0;position:relative}.wcps-container div.wcps-items div.wcps-items-thumb{line-height:0;overflow:hidden;position:relative;text-align:center}.wcps-container div.wcps-items div.wcps-items-thumb a{color:#fff;margin:0;padding:0;text-decoration:none;width:100%}.wcps-container div.wcps-items div.wcps-items-thumb img{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0;padding:0;width:100%}.wcps-container .wcps-terms{display:none;padding:2px 10px 2px 25px;text-align:center}.wcps-container .wcps-items-title{padding:10px 12px;text-align:left}.wcps-container .wcps-items-title a{font-size:16px;font-weight:bold;line-height:normal;text-decoration:none}.wcps-container .wcps-items-excerpt{font-size:14px;padding:10px 12px;text-align:left}.wcps-container .wcps-items-category{padding:5px 12px}.wcps-container .wcps-items-category a{text-decoration:none}.wcps-container .wcps-items-rating{padding:5px 12px}.wcps-container .wcps-items-rating .star-rating{font-size:1.5em}.wcps-container .wcps-items div.wcps-items-price{padding:5px 12px;text-align:left}.wcps-container .wcps-items-price ins{background:none repeat scroll 0 0 rgba(0,0,0,0)}.wcps-container .wcps-items-cart{padding:10px 12px;text-align:left}.wcps-container .wcps-items-cart .quantity{width:45px}.wcps-container .wcps-items div.wcps-items-cart p{border:medium none !important;margin:0 !important;padding:0 !important}.wcps-container .wcps-items div.wcps-items-cart.custom span.amount{font-size:15px;line-height:15px}.wcps-container .wcps-items div.wcps-items-cart .amount,.wcps-container div.wcps-items div.wcps-items-cart del,.wcps-container div.wcps-items .wcps-items-cart ins,.wcps-container div.wcps-items div.wcps-items-cart .woocommerce-price-suffix{display:none}.wcps-container .wcps-items div.wcps-items-cart.custom a.add_to_cart_button{background:none repeat scroll 0 0 #0de185;border:medium none;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;font-size:12px;line-height:12px;margin:0;padding:10px 15px;text-shadow:none}.wcps-container .wcps-items div.wcps-items-cart.custom a.added_to_cart{background:none repeat scroll 0 0 #0de185;border:medium none;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#444;font-size:12px;line-height:12px;margin-top:15px;padding:10px 15px;text-decoration:none;text-shadow:none}.wcps-container .wcps-items div.wcps-items-cart a.added{display:none}
assets/front/css/wcps-builder.css ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "utf-8";
2
+ /* CSS Document */
3
+
4
+ #wcps-builder-tools{
5
+ width: 300px;
6
+ padding: 10px;
7
+ height: 100%;
8
+ position: fixed;
9
+ left: 0;
10
+ top: 32px;
11
+ background: #fff;
12
+ }
13
+
14
+
15
+
16
+
17
+ #wcps-builder{}
18
+
19
+
assets/front/js/owl.carousel.js ADDED
@@ -0,0 +1,3275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ /**
7
+ * Owl carousel
8
+ * @version 2.1.6
9
+ * @author Bartosz Wojciechowski
10
+ * @author David Deutsch
11
+ * @license The MIT License (MIT)
12
+ * @todo Lazy Load Icon
13
+ * @todo prevent animationend bubling
14
+ * @todo itemsScaleUp
15
+ * @todo Test Zepto
16
+ * @todo stagePadding calculate wrong active classes
17
+ */
18
+ ;(function($, window, document, undefined) {
19
+
20
+ /**
21
+ * Creates a carousel.
22
+ * @class The Owl Carousel.
23
+ * @public
24
+ * @param {HTMLElement|jQuery} element - The element to create the carousel for.
25
+ * @param {Object} [options] - The options
26
+ */
27
+ function Owl(element, options) {
28
+
29
+ /**
30
+ * Current settings for the carousel.
31
+ * @public
32
+ */
33
+ this.settings = null;
34
+
35
+ /**
36
+ * Current options set by the caller including defaults.
37
+ * @public
38
+ */
39
+ this.options = $.extend({}, Owl.Defaults, options);
40
+
41
+ /**
42
+ * Plugin element.
43
+ * @public
44
+ */
45
+ this.$element = $(element);
46
+
47
+ /**
48
+ * Proxied event handlers.
49
+ * @protected
50
+ */
51
+ this._handlers = {};
52
+
53
+ /**
54
+ * References to the running plugins of this carousel.
55
+ * @protected
56
+ */
57
+ this._plugins = {};
58
+
59
+ /**
60
+ * Currently suppressed events to prevent them from beeing retriggered.
61
+ * @protected
62
+ */
63
+ this._supress = {};
64
+
65
+ /**
66
+ * Absolute current position.
67
+ * @protected
68
+ */
69
+ this._current = null;
70
+
71
+ /**
72
+ * Animation speed in milliseconds.
73
+ * @protected
74
+ */
75
+ this._speed = null;
76
+
77
+ /**
78
+ * Coordinates of all items in pixel.
79
+ * @todo The name of this member is missleading.
80
+ * @protected
81
+ */
82
+ this._coordinates = [];
83
+
84
+ /**
85
+ * Current breakpoint.
86
+ * @todo Real media queries would be nice.
87
+ * @protected
88
+ */
89
+ this._breakpoint = null;
90
+
91
+ /**
92
+ * Current width of the plugin element.
93
+ */
94
+ this._width = null;
95
+
96
+ /**
97
+ * All real items.
98
+ * @protected
99
+ */
100
+ this._items = [];
101
+
102
+ /**
103
+ * All cloned items.
104
+ * @protected
105
+ */
106
+ this._clones = [];
107
+
108
+ /**
109
+ * Merge values of all items.
110
+ * @todo Maybe this could be part of a plugin.
111
+ * @protected
112
+ */
113
+ this._mergers = [];
114
+
115
+ /**
116
+ * Widths of all items.
117
+ */
118
+ this._widths = [];
119
+
120
+ /**
121
+ * Invalidated parts within the update process.
122
+ * @protected
123
+ */
124
+ this._invalidated = {};
125
+
126
+ /**
127
+ * Ordered list of workers for the update process.
128
+ * @protected
129
+ */
130
+ this._pipe = [];
131
+
132
+ /**
133
+ * Current state information for the drag operation.
134
+ * @todo #261
135
+ * @protected
136
+ */
137
+ this._drag = {
138
+ time: null,
139
+ target: null,
140
+ pointer: null,
141
+ stage: {
142
+ start: null,
143
+ current: null
144
+ },
145
+ direction: null
146
+ };
147
+
148
+ /**
149
+ * Current state information and their tags.
150
+ * @type {Object}
151
+ * @protected
152
+ */
153
+ this._states = {
154
+ current: {},
155
+ tags: {
156
+ 'initializing': [ 'busy' ],
157
+ 'animating': [ 'busy' ],
158
+ 'dragging': [ 'interacting' ]
159
+ }
160
+ };
161
+
162
+ $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {
163
+ this._handlers[handler] = $.proxy(this[handler], this);
164
+ }, this));
165
+
166
+ $.each(Owl.Plugins, $.proxy(function(key, plugin) {
167
+ this._plugins[key.charAt(0).toLowerCase() + key.slice(1)]
168
+ = new plugin(this);
169
+ }, this));
170
+
171
+ $.each(Owl.Workers, $.proxy(function(priority, worker) {
172
+ this._pipe.push({
173
+ 'filter': worker.filter,
174
+ 'run': $.proxy(worker.run, this)
175
+ });
176
+ }, this));
177
+
178
+ this.setup();
179
+ this.initialize();
180
+ }
181
+
182
+ /**
183
+ * Default options for the carousel.
184
+ * @public
185
+ */
186
+ Owl.Defaults = {
187
+ items: 3,
188
+ loop: false,
189
+ center: false,
190
+ rewind: false,
191
+
192
+ mouseDrag: true,
193
+ touchDrag: true,
194
+ pullDrag: true,
195
+ freeDrag: false,
196
+
197
+ margin: 0,
198
+ stagePadding: 0,
199
+
200
+ merge: false,
201
+ mergeFit: true,
202
+ autoWidth: false,
203
+
204
+ startPosition: 0,
205
+ rtl: false,
206
+
207
+ smartSpeed: 250,
208
+ fluidSpeed: false,
209
+ dragEndSpeed: false,
210
+
211
+ responsive: {},
212
+ responsiveRefreshRate: 200,
213
+ responsiveBaseElement: window,
214
+
215
+ fallbackEasing: 'swing',
216
+
217
+ info: false,
218
+
219
+ nestedItemSelector: false,
220
+ itemElement: 'div',
221
+ stageElement: 'div',
222
+
223
+ refreshClass: 'owl-refresh',
224
+ loadedClass: 'owl-loaded',
225
+ loadingClass: 'owl-loading',
226
+ rtlClass: 'owl-rtl',
227
+ responsiveClass: 'owl-responsive',
228
+ dragClass: 'owl-drag',
229
+ itemClass: 'owl-item',
230
+ stageClass: 'owl-stage',
231
+ stageOuterClass: 'owl-stage-outer',
232
+ grabClass: 'owl-grab'
233
+ };
234
+
235
+ /**
236
+ * Enumeration for width.
237
+ * @public
238
+ * @readonly
239
+ * @enum {String}
240
+ */
241
+ Owl.Width = {
242
+ Default: 'default',
243
+ Inner: 'inner',
244
+ Outer: 'outer'
245
+ };
246
+
247
+ /**
248
+ * Enumeration for types.
249
+ * @public
250
+ * @readonly
251
+ * @enum {String}
252
+ */
253
+ Owl.Type = {
254
+ Event: 'event',
255
+ State: 'state'
256
+ };
257
+
258
+ /**
259
+ * Contains all registered plugins.
260
+ * @public
261
+ */
262
+ Owl.Plugins = {};
263
+
264
+ /**
265
+ * List of workers involved in the update process.
266
+ */
267
+ Owl.Workers = [ {
268
+ filter: [ 'width', 'settings' ],
269
+ run: function() {
270
+ this._width = this.$element.width();
271
+ }
272
+ }, {
273
+ filter: [ 'width', 'items', 'settings' ],
274
+ run: function(cache) {
275
+ cache.current = this._items && this._items[this.relative(this._current)];
276
+ }
277
+ }, {
278
+ filter: [ 'items', 'settings' ],
279
+ run: function() {
280
+ this.$stage.children('.cloned').remove();
281
+ }
282
+ }, {
283
+ filter: [ 'width', 'items', 'settings' ],
284
+ run: function(cache) {
285
+ var margin = this.settings.margin || '',
286
+ grid = !this.settings.autoWidth,
287
+ rtl = this.settings.rtl,
288
+ css = {
289
+ 'width': 'auto',
290
+ 'margin-left': rtl ? margin : '',
291
+ 'margin-right': rtl ? '' : margin
292
+ };
293
+
294
+ !grid && this.$stage.children().css(css);
295
+
296
+ cache.css = css;
297
+ }
298
+ }, {
299
+ filter: [ 'width', 'items', 'settings' ],
300
+ run: function(cache) {
301
+ var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
302
+ merge = null,
303
+ iterator = this._items.length,
304
+ grid = !this.settings.autoWidth,
305
+ widths = [];
306
+
307
+ cache.items = {
308
+ merge: false,
309
+ width: width
310
+ };
311
+
312
+ while (iterator--) {
313
+ merge = this._mergers[iterator];
314
+ merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;
315
+
316
+ cache.items.merge = merge > 1 || cache.items.merge;
317
+
318
+ widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
319
+ }
320
+
321
+ this._widths = widths;
322
+ }
323
+ }, {
324
+ filter: [ 'items', 'settings' ],
325
+ run: function() {
326
+ var clones = [],
327
+ items = this._items,
328
+ settings = this.settings,
329
+ // TODO: Should be computed from number of min width items in stage
330
+ view = Math.max(settings.items * 2, 4),
331
+ size = Math.ceil(items.length / 2) * 2,
332
+ repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
333
+ append = '',
334
+ prepend = '';
335
+
336
+ repeat /= 2;
337
+
338
+ while (repeat--) {
339
+ // Switch to only using appended clones
340
+ clones.push(this.normalize(clones.length / 2, true));
341
+ append = append + items[clones[clones.length - 1]][0].outerHTML;
342
+ clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
343
+ prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
344
+ }
345
+
346
+ this._clones = clones;
347
+
348
+ $(append).addClass('cloned').appendTo(this.$stage);
349
+ $(prepend).addClass('cloned').prependTo(this.$stage);
350
+ }
351
+ }, {
352
+ filter: [ 'width', 'items', 'settings' ],
353
+ run: function() {
354
+ var rtl = this.settings.rtl ? 1 : -1,
355
+ size = this._clones.length + this._items.length,
356
+ iterator = -1,
357
+ previous = 0,
358
+ current = 0,
359
+ coordinates = [];
360
+
361
+ while (++iterator < size) {
362
+ previous = coordinates[iterator - 1] || 0;
363
+ current = this._widths[this.relative(iterator)] + this.settings.margin;
364
+ coordinates.push(previous + current * rtl);
365
+ }
366
+
367
+ this._coordinates = coordinates;
368
+ }
369
+ }, {
370
+ filter: [ 'width', 'items', 'settings' ],
371
+ run: function() {
372
+ var padding = this.settings.stagePadding,
373
+ coordinates = this._coordinates,
374
+ css = {
375
+ 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
376
+ 'padding-left': padding || '',
377
+ 'padding-right': padding || ''
378
+ };
379
+
380
+ this.$stage.css(css);
381
+ }
382
+ }, {
383
+ filter: [ 'width', 'items', 'settings' ],
384
+ run: function(cache) {
385
+ var iterator = this._coordinates.length,
386
+ grid = !this.settings.autoWidth,
387
+ items = this.$stage.children();
388
+
389
+ if (grid && cache.items.merge) {
390
+ while (iterator--) {
391
+ cache.css.width = this._widths[this.relative(iterator)];
392
+ items.eq(iterator).css(cache.css);
393
+ }
394
+ } else if (grid) {
395
+ cache.css.width = cache.items.width;
396
+ items.css(cache.css);
397
+ }
398
+ }
399
+ }, {
400
+ filter: [ 'items' ],
401
+ run: function() {
402
+ this._coordinates.length < 1 && this.$stage.removeAttr('style');
403
+ }
404
+ }, {
405
+ filter: [ 'width', 'items', 'settings' ],
406
+ run: function(cache) {
407
+ cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
408
+ cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
409
+ this.reset(cache.current);
410
+ }
411
+ }, {
412
+ filter: [ 'position' ],
413
+ run: function() {
414
+ this.animate(this.coordinates(this._current));
415
+ }
416
+ }, {
417
+ filter: [ 'width', 'position', 'items', 'settings' ],
418
+ run: function() {
419
+ var rtl = this.settings.rtl ? 1 : -1,
420
+ padding = this.settings.stagePadding * 2,
421
+ begin = this.coordinates(this.current()) + padding,
422
+ end = begin + this.width() * rtl,
423
+ inner, outer, matches = [], i, n;
424
+
425
+ for (i = 0, n = this._coordinates.length; i < n; i++) {
426
+ inner = this._coordinates[i - 1] || 0;
427
+ outer = Math.abs(this._coordinates[i]) + padding * rtl;
428
+
429
+ if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
430
+ || (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
431
+ matches.push(i);
432
+ }
433
+ }
434
+
435
+ this.$stage.children('.active').removeClass('active');
436
+ this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
437
+
438
+ if (this.settings.center) {
439
+ this.$stage.children('.center').removeClass('center');
440
+ this.$stage.children().eq(this.current()).addClass('center');
441
+ }
442
+ }
443
+ } ];
444
+
445
+ /**
446
+ * Initializes the carousel.
447
+ * @protected
448
+ */
449
+ Owl.prototype.initialize = function() {
450
+ this.enter('initializing');
451
+ this.trigger('initialize');
452
+
453
+ this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
454
+
455
+ if (this.settings.autoWidth && !this.is('pre-loading')) {
456
+ var imgs, nestedSelector, width;
457
+ imgs = this.$element.find('img');
458
+ nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
459
+ width = this.$element.children(nestedSelector).width();
460
+
461
+ if (imgs.length && width <= 0) {
462
+ this.preloadAutoWidthImages(imgs);
463
+ }
464
+ }
465
+
466
+ this.$element.addClass(this.options.loadingClass);
467
+
468
+ // create stage
469
+ this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>')
470
+ .wrap('<div class="' + this.settings.stageOuterClass + '"/>');
471
+
472
+ // append stage
473
+ this.$element.append(this.$stage.parent());
474
+
475
+ // append content
476
+ this.replace(this.$element.children().not(this.$stage.parent()));
477
+
478
+ // check visibility
479
+ if (this.$element.is(':visible')) {
480
+ // update view
481
+ this.refresh();
482
+ } else {
483
+ // invalidate width
484
+ this.invalidate('width');
485
+ }
486
+
487
+ this.$element
488
+ .removeClass(this.options.loadingClass)
489
+ .addClass(this.options.loadedClass);
490
+
491
+ // register event handlers
492
+ this.registerEventHandlers();
493
+
494
+ this.leave('initializing');
495
+ this.trigger('initialized');
496
+ };
497
+
498
+ /**
499
+ * Setups the current settings.
500
+ * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
501
+ * @todo Support for media queries by using `matchMedia` would be nice.
502
+ * @public
503
+ */
504
+ Owl.prototype.setup = function() {
505
+ var viewport = this.viewport(),
506
+ overwrites = this.options.responsive,
507
+ match = -1,
508
+ settings = null;
509
+
510
+ if (!overwrites) {
511
+ settings = $.extend({}, this.options);
512
+ } else {
513
+ $.each(overwrites, function(breakpoint) {
514
+ if (breakpoint <= viewport && breakpoint > match) {
515
+ match = Number(breakpoint);
516
+ }
517
+ });
518
+
519
+ settings = $.extend({}, this.options, overwrites[match]);
520
+ if (typeof settings.stagePadding === 'function') {
521
+ settings.stagePadding = settings.stagePadding();
522
+ }
523
+ delete settings.responsive;
524
+
525
+ // responsive class
526
+ if (settings.responsiveClass) {
527
+ this.$element.attr('class',
528
+ this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match)
529
+ );
530
+ }
531
+ }
532
+
533
+ this.trigger('change', { property: { name: 'settings', value: settings } });
534
+ this._breakpoint = match;
535
+ this.settings = settings;
536
+ this.invalidate('settings');
537
+ this.trigger('changed', { property: { name: 'settings', value: this.settings } });
538
+ };
539
+
540
+ /**
541
+ * Updates option logic if necessery.
542
+ * @protected
543
+ */
544
+ Owl.prototype.optionsLogic = function() {
545
+ if (this.settings.autoWidth) {
546
+ this.settings.stagePadding = false;
547
+ this.settings.merge = false;
548
+ }
549
+ };
550
+
551
+ /**
552
+ * Prepares an item before add.
553
+ * @todo Rename event parameter `content` to `item`.
554
+ * @protected
555
+ * @returns {jQuery|HTMLElement} - The item container.
556
+ */
557
+ Owl.prototype.prepare = function(item) {
558
+ var event = this.trigger('prepare', { content: item });
559
+
560
+ if (!event.data) {
561
+ event.data = $('<' + this.settings.itemElement + '/>')
562
+ .addClass(this.options.itemClass).append(item)
563
+ }
564
+
565
+ this.trigger('prepared', { content: event.data });
566
+
567
+ return event.data;
568
+ };
569
+
570
+ /**
571
+ * Updates the view.
572
+ * @public
573
+ */
574
+ Owl.prototype.update = function() {
575
+ var i = 0,
576
+ n = this._pipe.length,
577
+ filter = $.proxy(function(p) { return this[p] }, this._invalidated),
578
+ cache = {};
579
+
580
+ while (i < n) {
581
+ if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
582
+ this._pipe[i].run(cache);
583
+ }
584
+ i++;
585
+ }
586
+
587
+ this._invalidated = {};
588
+
589
+ !this.is('valid') && this.enter('valid');
590
+ };
591
+
592
+ /**
593
+ * Gets the width of the view.
594
+ * @public
595
+ * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
596
+ * @returns {Number} - The width of the view in pixel.
597
+ */
598
+ Owl.prototype.width = function(dimension) {
599
+ dimension = dimension || Owl.Width.Default;
600
+ switch (dimension) {
601
+ case Owl.Width.Inner:
602
+ case Owl.Width.Outer:
603
+ return this._width;
604
+ default:
605
+ return this._width - this.settings.stagePadding * 2 + this.settings.margin;
606
+ }
607
+ };
608
+
609
+ /**
610
+ * Refreshes the carousel primarily for adaptive purposes.
611
+ * @public
612
+ */
613
+ Owl.prototype.refresh = function() {
614
+ this.enter('refreshing');
615
+ this.trigger('refresh');
616
+
617
+ this.setup();
618
+
619
+ this.optionsLogic();
620
+
621
+ this.$element.addClass(this.options.refreshClass);
622
+
623
+ this.update();
624
+
625
+ this.$element.removeClass(this.options.refreshClass);
626
+
627
+ this.leave('refreshing');
628
+ this.trigger('refreshed');
629
+ };
630
+
631
+ /**
632
+ * Checks window `resize` event.
633
+ * @protected
634
+ */
635
+ Owl.prototype.onThrottledResize = function() {
636
+ window.clearTimeout(this.resizeTimer);
637
+ this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
638
+ };
639
+
640
+ /**
641
+ * Checks window `resize` event.
642
+ * @protected
643
+ */
644
+ Owl.prototype.onResize = function() {
645
+ if (!this._items.length) {
646
+ return false;
647
+ }
648
+
649
+ if (this._width === this.$element.width()) {
650
+ return false;
651
+ }
652
+
653
+ if (!this.$element.is(':visible')) {
654
+ return false;
655
+ }
656
+
657
+ this.enter('resizing');
658
+
659
+ if (this.trigger('resize').isDefaultPrevented()) {
660
+ this.leave('resizing');
661
+ return false;
662
+ }
663
+
664
+ this.invalidate('width');
665
+
666
+ this.refresh();
667
+
668
+ this.leave('resizing');
669
+ this.trigger('resized');
670
+ };
671
+
672
+ /**
673
+ * Registers event handlers.
674
+ * @todo Check `msPointerEnabled`
675
+ * @todo #261
676
+ * @protected
677
+ */
678
+ Owl.prototype.registerEventHandlers = function() {
679
+ if ($.support.transition) {
680
+ this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
681
+ }
682
+
683
+ if (this.settings.responsive !== false) {
684
+ this.on(window, 'resize', this._handlers.onThrottledResize);
685
+ }
686
+
687
+ if (this.settings.mouseDrag) {
688
+ this.$element.addClass(this.options.dragClass);
689
+ this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
690
+ this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });
691
+ }
692
+
693
+ if (this.settings.touchDrag){
694
+ this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
695
+ this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
696
+ }
697
+ };
698
+
699
+ /**
700
+ * Handles `touchstart` and `mousedown` events.
701
+ * @todo Horizontal swipe threshold as option
702
+ * @todo #261
703
+ * @protected
704
+ * @param {Event} event - The event arguments.
705
+ */
706
+ Owl.prototype.onDragStart = function(event) {
707
+ var stage = null;
708
+
709
+ if (event.which === 3) {
710
+ return;
711
+ }
712
+
713
+ if ($.support.transform) {
714
+ stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
715
+ stage = {
716
+ x: stage[stage.length === 16 ? 12 : 4],
717
+ y: stage[stage.length === 16 ? 13 : 5]
718
+ };
719
+ } else {
720
+ stage = this.$stage.position();
721
+ stage = {
722
+ x: this.settings.rtl ?
723
+ stage.left + this.$stage.width() - this.width() + this.settings.margin :
724
+ stage.left,
725
+ y: stage.top
726
+ };
727
+ }
728
+
729
+ if (this.is('animating')) {
730
+ $.support.transform ? this.animate(stage.x) : this.$stage.stop()
731
+ this.invalidate('position');
732
+ }
733
+
734
+ this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');
735
+
736
+ this.speed(0);
737
+
738
+ this._drag.time = new Date().getTime();
739
+ this._drag.target = $(event.target);
740
+ this._drag.stage.start = stage;
741
+ this._drag.stage.current = stage;
742
+ this._drag.pointer = this.pointer(event);
743
+
744
+ $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
745
+
746
+ $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {
747
+ var delta = this.difference(this._drag.pointer, this.pointer(event));
748
+
749
+ $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
750
+
751
+ if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
752
+ return;
753
+ }
754
+
755
+ event.preventDefault();
756
+
757
+ this.enter('dragging');
758
+ this.trigger('drag');
759
+ }, this));
760
+ };
761
+
762
+ /**
763
+ * Handles the `touchmove` and `mousemove` events.
764
+ * @todo #261
765
+ * @protected
766
+ * @param {Event} event - The event arguments.
767
+ */
768
+ Owl.prototype.onDragMove = function(event) {
769
+ var minimum = null,
770
+ maximum = null,
771
+ pull = null,
772
+ delta = this.difference(this._drag.pointer, this.pointer(event)),
773
+ stage = this.difference(this._drag.stage.start, delta);
774
+
775
+ if (!this.is('dragging')) {
776
+ return;
777
+ }
778
+
779
+ event.preventDefault();
780
+
781
+ if (this.settings.loop) {
782
+ minimum = this.coordinates(this.minimum());
783
+ maximum = this.coordinates(this.maximum() + 1) - minimum;
784
+ stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;
785
+ } else {
786
+ minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
787
+ maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
788
+ pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
789
+ stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
790
+ }
791
+
792
+ this._drag.stage.current = stage;
793
+
794
+ this.animate(stage.x);
795
+ };
796
+
797
+ /**
798
+ * Handles the `touchend` and `mouseup` events.
799
+ * @todo #261
800
+ * @todo Threshold for click event
801
+ * @protected
802
+ * @param {Event} event - The event arguments.
803
+ */
804
+ Owl.prototype.onDragEnd = function(event) {
805
+ var delta = this.difference(this._drag.pointer, this.pointer(event)),
806
+ stage = this._drag.stage.current,
807
+ direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';
808
+
809
+ $(document).off('.owl.core');
810
+
811
+ this.$element.removeClass(this.options.grabClass);
812
+
813
+ if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
814
+ this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
815
+ this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
816
+ this.invalidate('position');
817
+ this.update();
818
+
819
+ this._drag.direction = direction;
820
+
821
+ if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
822
+ this._drag.target.one('click.owl.core', function() { return false; });
823
+ }
824
+ }
825
+
826
+ if (!this.is('dragging')) {
827
+ return;
828
+ }
829
+
830
+ this.leave('dragging');
831
+ this.trigger('dragged');
832
+ };
833
+
834
+ /**
835
+ * Gets absolute position of the closest item for a coordinate.
836
+ * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
837
+ * @protected
838
+ * @param {Number} coordinate - The coordinate in pixel.
839
+ * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
840
+ * @return {Number} - The absolute position of the closest item.
841
+ */
842
+ Owl.prototype.closest = function(coordinate, direction) {
843
+ var position = -1,
844
+ pull = 30,
845
+ width = this.width(),
846
+ coordinates = this.coordinates();
847
+
848
+ if (!this.settings.freeDrag) {
849
+ // check closest item
850
+ $.each(coordinates, $.proxy(function(index, value) {
851
+ // on a left pull, check on current index
852
+ if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
853
+ position = index;
854
+ // on a right pull, check on previous index
855
+ // to do so, subtract width from value and set position = index + 1
856
+ } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
857
+ position = index + 1;
858
+ } else if (this.op(coordinate, '<', value)
859
+ && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
860
+ position = direction === 'left' ? index + 1 : index;
861
+ }
862
+ return position === -1;
863
+ }, this));
864
+ }
865
+
866
+ if (!this.settings.loop) {
867
+ // non loop boundries
868
+ if (this.op(coordinate, '>', coordinates[this.minimum()])) {
869
+ position = coordinate = this.minimum();
870
+ } else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
871
+ position = coordinate = this.maximum();
872
+ }
873
+ }
874
+
875
+ return position;
876
+ };
877
+
878
+ /**
879
+ * Animates the stage.
880
+ * @todo #270
881
+ * @public
882
+ * @param {Number} coordinate - The coordinate in pixels.
883
+ */
884
+ Owl.prototype.animate = function(coordinate) {
885
+ var animate = this.speed() > 0;
886
+
887
+ this.is('animating') && this.onTransitionEnd();
888
+
889
+ if (animate) {
890
+ this.enter('animating');
891
+ this.trigger('translate');
892
+ }
893
+
894
+ if ($.support.transform3d && $.support.transition) {
895
+ this.$stage.css({
896
+ transform: 'translate3d(' + coordinate + 'px,0px,0px)',
897
+ transition: (this.speed() / 1000) + 's'
898
+ });
899
+ } else if (animate) {
900
+ this.$stage.animate({
901
+ left: coordinate + 'px'
902
+ }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
903
+ } else {
904
+ this.$stage.css({
905
+ left: coordinate + 'px'
906
+ });
907
+ }
908
+ };
909
+
910
+ /**
911
+ * Checks whether the carousel is in a specific state or not.
912
+ * @param {String} state - The state to check.
913
+ * @returns {Boolean} - The flag which indicates if the carousel is busy.
914
+ */
915
+ Owl.prototype.is = function(state) {
916
+ return this._states.current[state] && this._states.current[state] > 0;
917
+ };
918
+
919
+ /**
920
+ * Sets the absolute position of the current item.
921
+ * @public
922
+ * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
923
+ * @returns {Number} - The absolute position of the current item.
924
+ */
925
+ Owl.prototype.current = function(position) {
926
+ if (position === undefined) {
927
+ return this._current;
928
+ }
929
+
930
+ if (this._items.length === 0) {
931
+ return undefined;
932
+ }
933
+
934
+ position = this.normalize(position);
935
+
936
+ if (this._current !== position) {
937
+ var event = this.trigger('change', { property: { name: 'position', value: position } });
938
+
939
+ if (event.data !== undefined) {
940
+ position = this.normalize(event.data);
941
+ }
942
+
943
+ this._current = position;
944
+
945
+ this.invalidate('position');
946
+
947
+ this.trigger('changed', { property: { name: 'position', value: this._current } });
948
+ }
949
+
950
+ return this._current;
951
+ };
952
+
953
+ /**
954
+ * Invalidates the given part of the update routine.
955
+ * @param {String} [part] - The part to invalidate.
956
+ * @returns {Array.<String>} - The invalidated parts.
957
+ */
958
+ Owl.prototype.invalidate = function(part) {
959
+ if ($.type(part) === 'string') {
960
+ this._invalidated[part] = true;
961
+ this.is('valid') && this.leave('valid');
962
+ }
963
+ return $.map(this._invalidated, function(v, i) { return i });
964
+ };
965
+
966
+ /**
967
+ * Resets the absolute position of the current item.
968
+ * @public
969
+ * @param {Number} position - The absolute position of the new item.
970
+ */
971
+ Owl.prototype.reset = function(position) {
972
+ position = this.normalize(position);
973
+
974
+ if (position === undefined) {
975
+ return;
976
+ }
977
+
978
+ this._speed = 0;
979
+ this._current = position;
980
+
981
+ this.suppress([ 'translate', 'translated' ]);
982
+
983
+ this.animate(this.coordinates(position));
984
+
985
+ this.release([ 'translate', 'translated' ]);
986
+ };
987
+
988
+ /**
989
+ * Normalizes an absolute or a relative position of an item.
990
+ * @public
991
+ * @param {Number} position - The absolute or relative position to normalize.
992
+ * @param {Boolean} [relative=false] - Whether the given position is relative or not.
993
+ * @returns {Number} - The normalized position.
994
+ */
995
+ Owl.prototype.normalize = function(position, relative) {
996
+ var n = this._items.length,
997
+ m = relative ? 0 : this._clones.length;
998
+
999
+ if (!this.isNumeric(position) || n < 1) {
1000
+ position = undefined;
1001
+ } else if (position < 0 || position >= n + m) {
1002
+ position = ((position - m / 2) % n + n) % n + m / 2;
1003
+ }
1004
+
1005
+ return position;
1006
+ };
1007
+
1008
+ /**
1009
+ * Converts an absolute position of an item into a relative one.
1010
+ * @public
1011
+ * @param {Number} position - The absolute position to convert.
1012
+ * @returns {Number} - The converted position.
1013
+ */
1014
+ Owl.prototype.relative = function(position) {
1015
+ position -= this._clones.length / 2;
1016
+ return this.normalize(position, true);
1017
+ };
1018
+
1019
+ /**
1020
+ * Gets the maximum position for the current item.
1021
+ * @public
1022
+ * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
1023
+ * @returns {Number}
1024
+ */
1025
+ Owl.prototype.maximum = function(relative) {
1026
+ var settings = this.settings,
1027
+ maximum = this._coordinates.length,
1028
+ iterator,
1029
+ reciprocalItemsWidth,
1030
+ elementWidth;
1031
+
1032
+ if (settings.loop) {
1033
+ maximum = this._clones.length / 2 + this._items.length - 1;
1034
+ } else if (settings.autoWidth || settings.merge) {
1035
+ iterator = this._items.length;
1036
+ reciprocalItemsWidth = this._items[--iterator].width();
1037
+ elementWidth = this.$element.width();
1038
+ while (iterator--) {
1039
+ reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;
1040
+ if (reciprocalItemsWidth > elementWidth) {
1041
+ break;
1042
+ }
1043
+ }
1044
+ maximum = iterator + 1;
1045
+ } else if (settings.center) {
1046
+ maximum = this._items.length - 1;
1047
+ } else {
1048
+ maximum = this._items.length - settings.items;
1049
+ }
1050
+
1051
+ if (relative) {
1052
+ maximum -= this._clones.length / 2;
1053
+ }
1054
+
1055
+ return Math.max(maximum, 0);
1056
+ };
1057
+
1058
+ /**
1059
+ * Gets the minimum position for the current item.
1060
+ * @public
1061
+ * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
1062
+ * @returns {Number}
1063
+ */
1064
+ Owl.prototype.minimum = function(relative) {
1065
+ return relative ? 0 : this._clones.length / 2;
1066
+ };
1067
+
1068
+ /**
1069
+ * Gets an item at the specified relative position.
1070
+ * @public
1071
+ * @param {Number} [position] - The relative position of the item.
1072
+ * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
1073
+ */
1074
+ Owl.prototype.items = function(position) {
1075
+ if (position === undefined) {
1076
+ return this._items.slice();
1077
+ }
1078
+
1079
+ position = this.normalize(position, true);
1080
+ return this._items[position];
1081
+ };
1082
+
1083
+ /**
1084
+ * Gets an item at the specified relative position.
1085
+ * @public
1086
+ * @param {Number} [position] - The relative position of the item.
1087
+ * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
1088
+ */
1089
+ Owl.prototype.mergers = function(position) {
1090
+ if (position === undefined) {
1091
+ return this._mergers.slice();
1092
+ }
1093
+
1094
+ position = this.normalize(position, true);
1095
+ return this._mergers[position];
1096
+ };
1097
+
1098
+ /**
1099
+ * Gets the absolute positions of clones for an item.
1100
+ * @public
1101
+ * @param {Number} [position] - The relative position of the item.
1102
+ * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
1103
+ */
1104
+ Owl.prototype.clones = function(position) {
1105
+ var odd = this._clones.length / 2,
1106
+ even = odd + this._items.length,
1107
+ map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 };
1108
+
1109
+ if (position === undefined) {
1110
+ return $.map(this._clones, function(v, i) { return map(i) });
1111
+ }
1112
+
1113
+ return $.map(this._clones, function(v, i) { return v === position ? map(i) : null });
1114
+ };
1115
+
1116
+ /**
1117
+ * Sets the current animation speed.
1118
+ * @public
1119
+ * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
1120
+ * @returns {Number} - The current animation speed in milliseconds.
1121
+ */
1122
+ Owl.prototype.speed = function(speed) {
1123
+ if (speed !== undefined) {
1124
+ this._speed = speed;
1125
+ }
1126
+
1127
+ return this._speed;
1128
+ };
1129
+
1130
+ /**
1131
+ * Gets the coordinate of an item.
1132
+ * @todo The name of this method is missleanding.
1133
+ * @public
1134
+ * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
1135
+ * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
1136
+ */
1137
+ Owl.prototype.coordinates = function(position) {
1138
+ var multiplier = 1,
1139
+ newPosition = position - 1,
1140
+ coordinate;
1141
+
1142
+ if (position === undefined) {
1143
+ return $.map(this._coordinates, $.proxy(function(coordinate, index) {
1144
+ return this.coordinates(index);
1145
+ }, this));
1146
+ }
1147
+
1148
+ if (this.settings.center) {
1149
+ if (this.settings.rtl) {
1150
+ multiplier = -1;
1151
+ newPosition = position + 1;
1152
+ }
1153
+
1154
+ coordinate = this._coordinates[position];
1155
+ coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
1156
+ } else {
1157
+ coordinate = this._coordinates[newPosition] || 0;
1158
+ }
1159
+
1160
+ coordinate = Math.ceil(coordinate);
1161
+
1162
+ return coordinate;
1163
+ };
1164
+
1165
+ /**
1166
+ * Calculates the speed for a translation.
1167
+ * @protected
1168
+ * @param {Number} from - The absolute position of the start item.
1169
+ * @param {Number} to - The absolute position of the target item.
1170
+ * @param {Number} [factor=undefined] - The time factor in milliseconds.
1171
+ * @returns {Number} - The time in milliseconds for the translation.
1172
+ */
1173
+ Owl.prototype.duration = function(from, to, factor) {
1174
+ if (factor === 0) {
1175
+ return 0;
1176
+ }
1177
+
1178
+ return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));
1179
+ };
1180
+
1181
+ /**
1182
+ * Slides to the specified item.
1183
+ * @public
1184
+ * @param {Number} position - The position of the item.
1185
+ * @param {Number} [speed] - The time in milliseconds for the transition.
1186
+ */
1187
+ Owl.prototype.to = function(position, speed) {
1188
+ var current = this.current(),
1189
+ revert = null,
1190
+ distance = position - this.relative(current),
1191
+ direction = (distance > 0) - (distance < 0),
1192
+ items = this._items.length,
1193
+ minimum = this.minimum(),
1194
+ maximum = this.maximum();
1195
+
1196
+ if (this.settings.loop) {
1197
+ if (!this.settings.rewind && Math.abs(distance) > items / 2) {
1198
+ distance += direction * -1 * items;
1199
+ }
1200
+
1201
+ position = current + distance;
1202
+ revert = ((position - minimum) % items + items) % items + minimum;
1203
+
1204
+ if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
1205
+ current = revert - distance;
1206
+ position = revert;
1207
+ this.reset(current);
1208
+ }
1209
+ } else if (this.settings.rewind) {
1210
+ maximum += 1;
1211
+ position = (position % maximum + maximum) % maximum;
1212
+ } else {
1213
+ position = Math.max(minimum, Math.min(maximum, position));
1214
+ }
1215
+
1216
+ this.speed(this.duration(current, position, speed));
1217
+ this.current(position);
1218
+
1219
+ if (this.$element.is(':visible')) {
1220
+ this.update();
1221
+ }
1222
+ };
1223
+
1224
+ /**
1225
+ * Slides to the next item.
1226
+ * @public
1227
+ * @param {Number} [speed] - The time in milliseconds for the transition.
1228
+ */
1229
+ Owl.prototype.next = function(speed) {
1230
+ speed = speed || false;
1231
+ this.to(this.relative(this.current()) + 1, speed);
1232
+ };
1233
+
1234
+ /**
1235
+ * Slides to the previous item.
1236
+ * @public
1237
+ * @param {Number} [speed] - The time in milliseconds for the transition.
1238
+ */
1239
+ Owl.prototype.prev = function(speed) {
1240
+ speed = speed || false;
1241
+ this.to(this.relative(this.current()) - 1, speed);
1242
+ };
1243
+
1244
+ /**
1245
+ * Handles the end of an animation.
1246
+ * @protected
1247
+ * @param {Event} event - The event arguments.
1248
+ */
1249
+ Owl.prototype.onTransitionEnd = function(event) {
1250
+
1251
+ // if css2 animation then event object is undefined
1252
+ if (event !== undefined) {
1253
+ event.stopPropagation();
1254
+
1255
+ // Catch only owl-stage transitionEnd event
1256
+ if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
1257
+ return false;
1258
+ }
1259
+ }
1260
+
1261
+ this.leave('animating');
1262
+ this.trigger('translated');
1263
+ };
1264
+
1265
+ /**
1266
+ * Gets viewport width.
1267
+ * @protected
1268
+ * @return {Number} - The width in pixel.
1269
+ */
1270
+ Owl.prototype.viewport = function() {
1271
+ var width;
1272
+ if (this.options.responsiveBaseElement !== window) {
1273
+ width = $(this.options.responsiveBaseElement).width();
1274
+ } else if (window.innerWidth) {
1275
+ width = window.innerWidth;
1276
+ } else if (document.documentElement && document.documentElement.clientWidth) {
1277
+ width = document.documentElement.clientWidth;
1278
+ } else {
1279
+ console.warn('Can not detect viewport width.');
1280
+ }
1281
+ return width;
1282
+ };
1283
+
1284
+ /**
1285
+ * Replaces the current content.
1286
+ * @public
1287
+ * @param {HTMLElement|jQuery|String} content - The new content.
1288
+ */
1289
+ Owl.prototype.replace = function(content) {
1290
+ this.$stage.empty();
1291
+ this._items = [];
1292
+
1293
+ if (content) {
1294
+ content = (content instanceof jQuery) ? content : $(content);
1295
+ }
1296
+
1297
+ if (this.settings.nestedItemSelector) {
1298
+ content = content.find('.' + this.settings.nestedItemSelector);
1299
+ }
1300
+
1301
+ content.filter(function() {
1302
+ return this.nodeType === 1;
1303
+ }).each($.proxy(function(index, item) {
1304
+ item = this.prepare(item);
1305
+ this.$stage.append(item);
1306
+ this._items.push(item);
1307
+ this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
1308
+ }, this));
1309
+
1310
+ this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);
1311
+
1312
+ this.invalidate('items');
1313
+ };
1314
+
1315
+ /**
1316
+ * Adds an item.
1317
+ * @todo Use `item` instead of `content` for the event arguments.
1318
+ * @public
1319
+ * @param {HTMLElement|jQuery|String} content - The item content to add.
1320
+ * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
1321
+ */
1322
+ Owl.prototype.add = function(content, position) {
1323
+ var current = this.relative(this._current);
1324
+
1325
+ position = position === undefined ? this._items.length : this.normalize(position, true);
1326
+ content = content instanceof jQuery ? content : $(content);
1327
+
1328
+ this.trigger('add', { content: content, position: position });
1329
+
1330
+ content = this.prepare(content);
1331
+
1332
+ if (this._items.length === 0 || position === this._items.length) {
1333
+ this._items.length === 0 && this.$stage.append(content);
1334
+ this._items.length !== 0 && this._items[position - 1].after(content);
1335
+ this._items.push(content);
1336
+ this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
1337
+ } else {
1338
+ this._items[position].before(content);
1339
+ this._items.splice(position, 0, content);
1340
+ this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
1341
+ }
1342
+
1343
+ this._items[current] && this.reset(this._items[current].index());
1344
+
1345
+ this.invalidate('items');
1346
+
1347
+ this.trigger('added', { content: content, position: position });
1348
+ };
1349
+
1350
+ /**
1351
+ * Removes an item by its position.
1352
+ * @todo Use `item` instead of `content` for the event arguments.
1353
+ * @public
1354
+ * @param {Number} position - The relative position of the item to remove.
1355
+ */
1356
+ Owl.prototype.remove = function(position) {
1357
+ position = this.normalize(position, true);
1358
+
1359
+ if (position === undefined) {
1360
+ return;
1361
+ }
1362
+
1363
+ this.trigger('remove', { content: this._items[position], position: position });
1364
+
1365
+ this._items[position].remove();
1366
+ this._items.splice(position, 1);
1367
+ this._mergers.splice(position, 1);
1368
+
1369
+ this.invalidate('items');
1370
+
1371
+ this.trigger('removed', { content: null, position: position });
1372
+ };
1373
+
1374
+ /**
1375
+ * Preloads images with auto width.
1376
+ * @todo Replace by a more generic approach
1377
+ * @protected
1378
+ */
1379
+ Owl.prototype.preloadAutoWidthImages = function(images) {
1380
+ images.each($.proxy(function(i, element) {
1381
+ this.enter('pre-loading');
1382
+ element = $(element);
1383
+ $(new Image()).one('load', $.proxy(function(e) {
1384
+ element.attr('src', e.target.src);
1385
+ element.css('opacity', 1);
1386
+ this.leave('pre-loading');
1387
+ !this.is('pre-loading') && !this.is('initializing') && this.refresh();
1388
+ }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
1389
+ }, this));
1390
+ };
1391
+
1392
+ /**
1393
+ * Destroys the carousel.
1394
+ * @public
1395
+ */
1396
+ Owl.prototype.destroy = function() {
1397
+
1398
+ this.$element.off('.owl.core');
1399
+ this.$stage.off('.owl.core');
1400
+ $(document).off('.owl.core');
1401
+
1402
+ if (this.settings.responsive !== false) {
1403
+ window.clearTimeout(this.resizeTimer);
1404
+ this.off(window, 'resize', this._handlers.onThrottledResize);
1405
+ }
1406
+
1407
+ for (var i in this._plugins) {
1408
+ this._plugins[i].destroy();
1409
+ }
1410
+
1411
+ this.$stage.children('.cloned').remove();
1412
+
1413
+ this.$stage.unwrap();
1414
+ this.$stage.children().contents().unwrap();
1415
+ this.$stage.children().unwrap();
1416
+
1417
+ this.$element
1418
+ .removeClass(this.options.refreshClass)
1419
+ .removeClass(this.options.loadingClass)
1420
+ .removeClass(this.options.loadedClass)
1421
+ .removeClass(this.options.rtlClass)
1422
+ .removeClass(this.options.dragClass)
1423
+ .removeClass(this.options.grabClass)
1424
+ .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), ''))
1425
+ .removeData('owl.carousel');
1426
+ };
1427
+
1428
+ /**
1429
+ * Operators to calculate right-to-left and left-to-right.
1430
+ * @protected
1431
+ * @param {Number} [a] - The left side operand.
1432
+ * @param {String} [o] - The operator.
1433
+ * @param {Number} [b] - The right side operand.
1434
+ */
1435
+ Owl.prototype.op = function(a, o, b) {
1436
+ var rtl = this.settings.rtl;
1437
+ switch (o) {
1438
+ case '<':
1439
+ return rtl ? a > b : a < b;
1440
+ case '>':
1441
+ return rtl ? a < b : a > b;
1442
+ case '>=':
1443
+ return rtl ? a <= b : a >= b;
1444
+ case '<=':
1445
+ return rtl ? a >= b : a <= b;
1446
+ default:
1447
+ break;
1448
+ }
1449
+ };
1450
+
1451
+ /**
1452
+ * Attaches to an internal event.
1453
+ * @protected
1454
+ * @param {HTMLElement} element - The event source.
1455
+ * @param {String} event - The event name.
1456
+ * @param {Function} listener - The event handler to attach.
1457
+ * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
1458
+ */
1459
+ Owl.prototype.on = function(element, event, listener, capture) {
1460
+ if (element.addEventListener) {
1461
+ element.addEventListener(event, listener, capture);
1462
+ } else if (element.attachEvent) {
1463
+ element.attachEvent('on' + event, listener);
1464
+ }
1465
+ };
1466
+
1467
+ /**
1468
+ * Detaches from an internal event.
1469
+ * @protected
1470
+ * @param {HTMLElement} element - The event source.
1471
+ * @param {String} event - The event name.
1472
+ * @param {Function} listener - The attached event handler to detach.
1473
+ * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
1474
+ */
1475
+ Owl.prototype.off = function(element, event, listener, capture) {
1476
+ if (element.removeEventListener) {
1477
+ element.removeEventListener(event, listener, capture);
1478
+ } else if (element.detachEvent) {
1479
+ element.detachEvent('on' + event, listener);
1480
+ }
1481
+ };
1482
+
1483
+ /**
1484
+ * Triggers a public event.
1485
+ * @todo Remove `status`, `relatedTarget` should be used instead.
1486
+ * @protected
1487
+ * @param {String} name - The event name.
1488
+ * @param {*} [data=null] - The event data.
1489
+ * @param {String} [namespace=carousel] - The event namespace.
1490
+ * @param {String} [state] - The state which is associated with the event.
1491
+ * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
1492
+ * @returns {Event} - The event arguments.
1493
+ */
1494
+ Owl.prototype.trigger = function(name, data, namespace, state, enter) {
1495
+ var status = {
1496
+ item: { count: this._items.length, index: this.current() }
1497
+ }, handler = $.camelCase(
1498
+ $.grep([ 'on', name, namespace ], function(v) { return v })
1499
+ .join('-').toLowerCase()
1500
+ ), event = $.Event(
1501
+ [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),
1502
+ $.extend({ relatedTarget: this }, status, data)
1503
+ );
1504
+
1505
+ if (!this._supress[name]) {
1506
+ $.each(this._plugins, function(name, plugin) {
1507
+ if (plugin.onTrigger) {
1508
+ plugin.onTrigger(event);
1509
+ }
1510
+ });
1511
+
1512
+ this.register({ type: Owl.Type.Event, name: name });
1513
+ this.$element.trigger(event);
1514
+
1515
+ if (this.settings && typeof this.settings[handler] === 'function') {
1516
+ this.settings[handler].call(this, event);
1517
+ }
1518
+ }
1519
+
1520
+ return event;
1521
+ };
1522
+
1523
+ /**
1524
+ * Enters a state.
1525
+ * @param name - The state name.
1526
+ */
1527
+ Owl.prototype.enter = function(name) {
1528
+ $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
1529
+ if (this._states.current[name] === undefined) {
1530
+ this._states.current[name] = 0;
1531
+ }
1532
+
1533
+ this._states.current[name]++;
1534
+ }, this));
1535
+ };
1536
+
1537
+ /**
1538
+ * Leaves a state.
1539
+ * @param name - The state name.
1540
+ */
1541
+ Owl.prototype.leave = function(name) {
1542
+ $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
1543
+ this._states.current[name]--;
1544
+ }, this));
1545
+ };
1546
+
1547
+ /**
1548
+ * Registers an event or state.
1549
+ * @public
1550
+ * @param {Object} object - The event or state to register.
1551
+ */
1552
+ Owl.prototype.register = function(object) {
1553
+ if (object.type === Owl.Type.Event) {
1554
+ if (!$.event.special[object.name]) {
1555
+ $.event.special[object.name] = {};
1556
+ }
1557
+
1558
+ if (!$.event.special[object.name].owl) {
1559
+ var _default = $.event.special[object.name]._default;
1560
+ $.event.special[object.name]._default = function(e) {
1561
+ if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
1562
+ return _default.apply(this, arguments);
1563
+ }
1564
+ return e.namespace && e.namespace.indexOf('owl') > -1;
1565
+ };
1566
+ $.event.special[object.name].owl = true;
1567
+ }
1568
+ } else if (object.type === Owl.Type.State) {
1569
+ if (!this._states.tags[object.name]) {
1570
+ this._states.tags[object.name] = object.tags;
1571
+ } else {
1572
+ this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
1573
+ }
1574
+
1575
+ this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {
1576
+ return $.inArray(tag, this._states.tags[object.name]) === i;
1577
+ }, this));
1578
+ }
1579
+ };
1580
+
1581
+ /**
1582
+ * Suppresses events.
1583
+ * @protected
1584
+ * @param {Array.<String>} events - The events to suppress.
1585
+ */
1586
+ Owl.prototype.suppress = function(events) {
1587
+ $.each(events, $.proxy(function(index, event) {
1588
+ this._supress[event] = true;
1589
+ }, this));
1590
+ };
1591
+
1592
+ /**
1593
+ * Releases suppressed events.
1594
+ * @protected
1595
+ * @param {Array.<String>} events - The events to release.
1596
+ */
1597
+ Owl.prototype.release = function(events) {
1598
+ $.each(events, $.proxy(function(index, event) {
1599
+ delete this._supress[event];
1600
+ }, this));
1601
+ };
1602
+
1603
+ /**
1604
+ * Gets unified pointer coordinates from event.
1605
+ * @todo #261
1606
+ * @protected
1607
+ * @param {Event} - The `mousedown` or `touchstart` event.
1608
+ * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
1609
+ */
1610
+ Owl.prototype.pointer = function(event) {
1611
+ var result = { x: null, y: null };
1612
+
1613
+ event = event.originalEvent || event || window.event;
1614
+
1615
+ event = event.touches && event.touches.length ?
1616
+ event.touches[0] : event.changedTouches && event.changedTouches.length ?
1617
+ event.changedTouches[0] : event;
1618
+
1619
+ if (event.pageX) {
1620
+ result.x = event.pageX;
1621
+ result.y = event.pageY;
1622
+ } else {
1623
+ result.x = event.clientX;
1624
+ result.y = event.clientY;
1625
+ }
1626
+
1627
+ return result;
1628
+ };
1629
+
1630
+ /**
1631
+ * Determines if the input is a Number or something that can be coerced to a Number
1632
+ * @protected
1633
+ * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
1634
+ * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
1635
+ */
1636
+ Owl.prototype.isNumeric = function(number) {
1637
+ return !isNaN(parseFloat(number));
1638
+ };
1639
+
1640
+ /**
1641
+ * Gets the difference of two vectors.
1642
+ * @todo #261
1643
+ * @protected
1644
+ * @param {Object} - The first vector.
1645
+ * @param {Object} - The second vector.
1646
+ * @returns {Object} - The difference.
1647
+ */
1648
+ Owl.prototype.difference = function(first, second) {
1649
+ return {
1650
+ x: first.x - second.x,
1651
+ y: first.y - second.y
1652
+ };
1653
+ };
1654
+
1655
+ /**
1656
+ * The jQuery Plugin for the Owl Carousel
1657
+ * @todo Navigation plugin `next` and `prev`
1658
+ * @public
1659
+ */
1660
+ $.fn.owlCarousel = function(option) {
1661
+ var args = Array.prototype.slice.call(arguments, 1);
1662
+
1663
+ return this.each(function() {
1664
+ var $this = $(this),
1665
+ data = $this.data('owl.carousel');
1666
+
1667
+ if (!data) {
1668
+ data = new Owl(this, typeof option == 'object' && option);
1669
+ $this.data('owl.carousel', data);
1670
+
1671
+ $.each([
1672
+ 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'
1673
+ ], function(i, event) {
1674
+ data.register({ type: Owl.Type.Event, name: event });
1675
+ data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {
1676
+ if (e.namespace && e.relatedTarget !== this) {
1677
+ this.suppress([ event ]);
1678
+ data[event].apply(this, [].slice.call(arguments, 1));
1679
+ this.release([ event ]);
1680
+ }
1681
+ }, data));
1682
+ });
1683
+ }
1684
+
1685
+ if (typeof option == 'string' && option.charAt(0) !== '_') {
1686
+ data[option].apply(data, args);
1687
+ }
1688
+ });
1689
+ };
1690
+
1691
+ /**
1692
+ * The constructor for the jQuery Plugin
1693
+ * @public
1694
+ */
1695
+ $.fn.owlCarousel.Constructor = Owl;
1696
+
1697
+ })(window.Zepto || window.jQuery, window, document);
1698
+
1699
+ /**
1700
+ * AutoRefresh Plugin
1701
+ * @version 2.1.0
1702
+ * @author Artus Kolanowski
1703
+ * @author David Deutsch
1704
+ * @license The MIT License (MIT)
1705
+ */
1706
+ ;(function($, window, document, undefined) {
1707
+
1708
+ /**
1709
+ * Creates the auto refresh plugin.
1710
+ * @class The Auto Refresh Plugin
1711
+ * @param {Owl} carousel - The Owl Carousel
1712
+ */
1713
+ var AutoRefresh = function(carousel) {
1714
+ /**
1715
+ * Reference to the core.
1716
+ * @protected
1717
+ * @type {Owl}
1718
+ */
1719
+ this._core = carousel;
1720
+
1721
+ /**
1722
+ * Refresh interval.
1723
+ * @protected
1724
+ * @type {number}
1725
+ */
1726
+ this._interval = null;
1727
+
1728
+ /**
1729
+ * Whether the element is currently visible or not.
1730
+ * @protected
1731
+ * @type {Boolean}
1732
+ */
1733
+ this._visible = null;
1734
+
1735
+ /**
1736
+ * All event handlers.
1737
+ * @protected
1738
+ * @type {Object}
1739
+ */
1740
+ this._handlers = {
1741
+ 'initialized.owl.carousel': $.proxy(function(e) {
1742
+ if (e.namespace && this._core.settings.autoRefresh) {
1743
+ this.watch();
1744
+ }
1745
+ }, this)
1746
+ };
1747
+
1748
+ // set default options
1749
+ this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);
1750
+
1751
+ // register event handlers
1752
+ this._core.$element.on(this._handlers);
1753
+ };
1754
+
1755
+ /**
1756
+ * Default options.
1757
+ * @public
1758
+ */
1759
+ AutoRefresh.Defaults = {
1760
+ autoRefresh: true,
1761
+ autoRefreshInterval: 500
1762
+ };
1763
+
1764
+ /**
1765
+ * Watches the element.
1766
+ */
1767
+ AutoRefresh.prototype.watch = function() {
1768
+ if (this._interval) {
1769
+ return;
1770
+ }
1771
+
1772
+ this._visible = this._core.$element.is(':visible');
1773
+ this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
1774
+ };
1775
+
1776
+ /**
1777
+ * Refreshes the element.
1778
+ */
1779
+ AutoRefresh.prototype.refresh = function() {
1780
+ if (this._core.$element.is(':visible') === this._visible) {
1781
+ return;
1782
+ }
1783
+
1784
+ this._visible = !this._visible;
1785
+
1786
+ this._core.$element.toggleClass('owl-hidden', !this._visible);
1787
+
1788
+ this._visible && (this._core.invalidate('width') && this._core.refresh());
1789
+ };
1790
+
1791
+ /**
1792
+ * Destroys the plugin.
1793
+ */
1794
+ AutoRefresh.prototype.destroy = function() {
1795
+ var handler, property;
1796
+
1797
+ window.clearInterval(this._interval);
1798
+
1799
+ for (handler in this._handlers) {
1800
+ this._core.$element.off(handler, this._handlers[handler]);
1801
+ }
1802
+ for (property in Object.getOwnPropertyNames(this)) {
1803
+ typeof this[property] != 'function' && (this[property] = null);
1804
+ }
1805
+ };
1806
+
1807
+ $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
1808
+
1809
+ })(window.Zepto || window.jQuery, window, document);
1810
+
1811
+ /**
1812
+ * Lazy Plugin
1813
+ * @version 2.1.0
1814
+ * @author Bartosz Wojciechowski
1815
+ * @author David Deutsch
1816
+ * @license The MIT License (MIT)
1817
+ */
1818
+ ;(function($, window, document, undefined) {
1819
+
1820
+ /**
1821
+ * Creates the lazy plugin.
1822
+ * @class The Lazy Plugin
1823
+ * @param {Owl} carousel - The Owl Carousel
1824
+ */
1825
+ var Lazy = function(carousel) {
1826
+
1827
+ /**
1828
+ * Reference to the core.
1829
+ * @protected
1830
+ * @type {Owl}
1831
+ */
1832
+ this._core = carousel;
1833
+
1834
+ /**
1835
+ * Already loaded items.
1836
+ * @protected
1837
+ * @type {Array.<jQuery>}
1838
+ */
1839
+ this._loaded = [];
1840
+
1841
+ /**
1842
+ * Event handlers.
1843
+ * @protected
1844
+ * @type {Object}
1845
+ */
1846
+ this._handlers = {
1847
+ 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {
1848
+ if (!e.namespace) {
1849
+ return;
1850
+ }
1851
+
1852
+ if (!this._core.settings || !this._core.settings.lazyLoad) {
1853
+ return;
1854
+ }
1855
+
1856
+ if ((e.property && e.property.name == 'position') || e.type == 'initialized') {
1857
+ var settings = this._core.settings,
1858
+ n = (settings.center && Math.ceil(settings.items / 2) || settings.items),
1859
+ i = ((settings.center && n * -1) || 0),
1860
+ position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
1861
+ clones = this._core.clones().length,
1862
+ load = $.proxy(function(i, v) { this.load(v) }, this);
1863
+
1864
+ while (i++ < n) {
1865
+ this.load(clones / 2 + this._core.relative(position));
1866
+ clones && $.each(this._core.clones(this._core.relative(position)), load);
1867
+ position++;
1868
+ }
1869
+ }
1870
+ }, this)
1871
+ };
1872
+
1873
+ // set the default options
1874
+ this._core.options = $.extend({}, Lazy.Defaults, this._core.options);
1875
+
1876
+ // register event handler
1877
+ this._core.$element.on(this._handlers);
1878
+ };
1879
+
1880
+ /**
1881
+ * Default options.
1882
+ * @public
1883
+ */
1884
+ Lazy.Defaults = {
1885
+ lazyLoad: false
1886
+ };
1887
+
1888
+ /**
1889
+ * Loads all resources of an item at the specified position.
1890
+ * @param {Number} position - The absolute position of the item.
1891
+ * @protected
1892
+ */
1893
+ Lazy.prototype.load = function(position) {
1894
+ var $item = this._core.$stage.children().eq(position),
1895
+ $elements = $item && $item.find('.owl-lazy');
1896
+
1897
+ if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
1898
+ return;
1899
+ }
1900
+
1901
+ $elements.each($.proxy(function(index, element) {
1902
+ var $element = $(element), image,
1903
+ url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src');
1904
+
1905
+ this._core.trigger('load', { element: $element, url: url }, 'lazy');
1906
+
1907
+ if ($element.is('img')) {
1908
+ $element.one('load.owl.lazy', $.proxy(function() {
1909
+ $element.css('opacity', 1);
1910
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
1911
+ }, this)).attr('src', url);
1912
+ } else {
1913
+ image = new Image();
1914
+ image.onload = $.proxy(function() {
1915
+ $element.css({
1916
+ 'background-image': 'url("' + url + '")',
1917
+ 'opacity': '1'
1918
+ });
1919
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
1920
+ }, this);
1921
+ image.src = url;
1922
+ }
1923
+ }, this));
1924
+
1925
+ this._loaded.push($item.get(0));
1926
+ };
1927
+
1928
+ /**
1929
+ * Destroys the plugin.
1930
+ * @public
1931
+ */
1932
+ Lazy.prototype.destroy = function() {
1933
+ var handler, property;
1934
+
1935
+ for (handler in this.handlers) {
1936
+ this._core.$element.off(handler, this.handlers[handler]);
1937
+ }
1938
+ for (property in Object.getOwnPropertyNames(this)) {
1939
+ typeof this[property] != 'function' && (this[property] = null);
1940
+ }
1941
+ };
1942
+
1943
+ $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
1944
+
1945
+ })(window.Zepto || window.jQuery, window, document);
1946
+
1947
+ /**
1948
+ * AutoHeight Plugin
1949
+ * @version 2.1.0
1950
+ * @author Bartosz Wojciechowski
1951
+ * @author David Deutsch
1952
+ * @license The MIT License (MIT)
1953
+ */
1954
+ ;(function($, window, document, undefined) {
1955
+
1956
+ /**
1957
+ * Creates the auto height plugin.
1958
+ * @class The Auto Height Plugin
1959
+ * @param {Owl} carousel - The Owl Carousel
1960
+ */
1961
+ var AutoHeight = function(carousel) {
1962
+ /**
1963
+ * Reference to the core.
1964
+ * @protected
1965
+ * @type {Owl}
1966
+ */
1967
+ this._core = carousel;
1968
+
1969
+ /**
1970
+ * All event handlers.
1971
+ * @protected
1972
+ * @type {Object}
1973
+ */
1974
+ this._handlers = {
1975
+ 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {
1976
+ if (e.namespace && this._core.settings.autoHeight) {
1977
+ this.update();
1978
+ }
1979
+ }, this),
1980
+ 'changed.owl.carousel': $.proxy(function(e) {
1981
+ if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position'){
1982
+ this.update();
1983
+ }
1984
+ }, this),
1985
+ 'loaded.owl.lazy': $.proxy(function(e) {
1986
+ if (e.namespace && this._core.settings.autoHeight
1987
+ && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
1988
+ this.update();
1989
+ }
1990
+ }, this)
1991
+ };
1992
+
1993
+ // set default options
1994
+ this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);
1995
+
1996
+ // register event handlers
1997
+ this._core.$element.on(this._handlers);
1998
+ };
1999
+
2000
+ /**
2001
+ * Default options.
2002
+ * @public
2003
+ */
2004
+ AutoHeight.Defaults = {
2005
+ autoHeight: false,
2006
+ autoHeightClass: 'owl-height'
2007
+ };
2008
+
2009
+ /**
2010
+ * Updates the view.
2011
+ */
2012
+ AutoHeight.prototype.update = function() {
2013
+ var start = this._core._current,
2014
+ end = start + this._core.settings.items,
2015
+ visible = this._core.$stage.children().toArray().slice(start, end),
2016
+ heights = [],
2017
+ maxheight = 0;
2018
+
2019
+ $.each(visible, function(index, item) {
2020
+ heights.push($(item).height());
2021
+ });
2022
+
2023
+ maxheight = Math.max.apply(null, heights);
2024
+
2025
+ this._core.$stage.parent()
2026
+ .height(maxheight)
2027
+ .addClass(this._core.settings.autoHeightClass);
2028
+ };
2029
+
2030
+ AutoHeight.prototype.destroy = function() {
2031
+ var handler, property;
2032
+
2033
+ for (handler in this._handlers) {
2034
+ this._core.$element.off(handler, this._handlers[handler]);
2035
+ }
2036
+ for (property in Object.getOwnPropertyNames(this)) {
2037
+ typeof this[property] != 'function' && (this[property] = null);
2038
+ }
2039
+ };
2040
+
2041
+ $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
2042
+
2043
+ })(window.Zepto || window.jQuery, window, document);
2044
+
2045
+ /**
2046
+ * Video Plugin
2047
+ * @version 2.1.0
2048
+ * @author Bartosz Wojciechowski
2049
+ * @author David Deutsch
2050
+ * @license The MIT License (MIT)
2051
+ */
2052
+ ;(function($, window, document, undefined) {
2053
+
2054
+ /**
2055
+ * Creates the video plugin.
2056
+ * @class The Video Plugin
2057
+ * @param {Owl} carousel - The Owl Carousel
2058
+ */
2059
+ var Video = function(carousel) {
2060
+ /**
2061
+ * Reference to the core.
2062
+ * @protected
2063
+ * @type {Owl}
2064
+ */
2065
+ this._core = carousel;
2066
+
2067
+ /**
2068
+ * Cache all video URLs.
2069
+ * @protected
2070
+ * @type {Object}
2071
+ */
2072
+ this._videos = {};
2073
+
2074
+ /**
2075
+ * Current playing item.
2076
+ * @protected
2077
+ * @type {jQuery}
2078
+ */
2079
+ this._playing = null;
2080
+
2081
+ /**
2082
+ * All event handlers.
2083
+ * @todo The cloned content removale is too late
2084
+ * @protected
2085
+ * @type {Object}
2086
+ */
2087
+ this._handlers = {
2088
+ 'initialized.owl.carousel': $.proxy(function(e) {
2089
+ if (e.namespace) {
2090
+ this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });
2091
+ }
2092
+ }, this),
2093
+ 'resize.owl.carousel': $.proxy(function(e) {
2094
+ if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
2095
+ e.preventDefault();
2096
+ }
2097
+ }, this),
2098
+ 'refreshed.owl.carousel': $.proxy(function(e) {
2099
+ if (e.namespace && this._core.is('resizing')) {
2100
+ this._core.$stage.find('.cloned .owl-video-frame').remove();
2101
+ }
2102
+ }, this),
2103
+ 'changed.owl.carousel': $.proxy(function(e) {
2104
+ if (e.namespace && e.property.name === 'position' && this._playing) {
2105
+ this.stop();
2106
+ }
2107
+ }, this),
2108
+ 'prepared.owl.carousel': $.proxy(function(e) {
2109
+ if (!e.namespace) {
2110
+ return;
2111
+ }
2112
+
2113
+ var $element = $(e.content).find('.owl-video');
2114
+
2115
+ if ($element.length) {
2116
+ $element.css('display', 'none');
2117
+ this.fetch($element, $(e.content));
2118
+ }
2119
+ }, this)
2120
+ };
2121
+
2122
+ // set default options
2123
+ this._core.options = $.extend({}, Video.Defaults, this._core.options);
2124
+
2125
+ // register event handlers
2126
+ this._core.$element.on(this._handlers);
2127
+
2128
+ this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {
2129
+ this.play(e);
2130
+ }, this));
2131
+ };
2132
+
2133
+ /**
2134
+ * Default options.
2135
+ * @public
2136
+ */
2137
+ Video.Defaults = {
2138
+ video: false,
2139
+ videoHeight: false,
2140
+ videoWidth: false
2141
+ };
2142
+
2143
+ /**
2144
+ * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
2145
+ * @protected
2146
+ * @param {jQuery} target - The target containing the video data.
2147
+ * @param {jQuery} item - The item containing the video.
2148
+ */
2149
+ Video.prototype.fetch = function(target, item) {
2150
+ var type = (function() {
2151
+ if (target.attr('data-vimeo-id')) {
2152
+ return 'vimeo';
2153
+ } else if (target.attr('data-vzaar-id')) {
2154
+ return 'vzaar'
2155
+ } else {
2156
+ return 'youtube';
2157
+ }
2158
+ })(),
2159
+ id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
2160
+ width = target.attr('data-width') || this._core.settings.videoWidth,
2161
+ height = target.attr('data-height') || this._core.settings.videoHeight,
2162
+ url = target.attr('href');
2163
+
2164
+ if (url) {
2165
+
2166
+ /*
2167
+ Parses the id's out of the following urls (and probably more):
2168
+ https://www.youtube.com/watch?v=:id
2169
+ https://youtu.be/:id
2170
+ https://vimeo.com/:id
2171
+ https://vimeo.com/channels/:channel/:id
2172
+ https://vimeo.com/groups/:group/videos/:id
2173
+ https://app.vzaar.com/videos/:id
2174
+
2175
+ Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
2176
+ */
2177
+
2178
+ id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
2179
+
2180
+ if (id[3].indexOf('youtu') > -1) {
2181
+ type = 'youtube';
2182
+ } else if (id[3].indexOf('vimeo') > -1) {
2183
+ type = 'vimeo';
2184
+ } else if (id[3].indexOf('vzaar') > -1) {
2185
+ type = 'vzaar';
2186
+ } else {
2187
+ throw new Error('Video URL not supported.');
2188
+ }
2189
+ id = id[6];
2190
+ } else {
2191
+ throw new Error('Missing video URL.');
2192
+ }
2193
+
2194
+ this._videos[url] = {
2195
+ type: type,
2196
+ id: id,
2197
+ width: width,
2198
+ height: height
2199
+ };
2200
+
2201
+ item.attr('data-video', url);
2202
+
2203
+ this.thumbnail(target, this._videos[url]);
2204
+ };
2205
+
2206
+ /**
2207
+ * Creates video thumbnail.
2208
+ * @protected
2209
+ * @param {jQuery} target - The target containing the video data.
2210
+ * @param {Object} info - The video info object.
2211
+ * @see `fetch`
2212
+ */
2213
+ Video.prototype.thumbnail = function(target, video) {
2214
+ var tnLink,
2215
+ icon,
2216
+ path,
2217
+ dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
2218
+ customTn = target.find('img'),
2219
+ srcType = 'src',
2220
+ lazyClass = '',
2221
+ settings = this._core.settings,
2222
+ create = function(path) {
2223
+ icon = '<div class="owl-video-play-icon"></div>';
2224
+
2225
+ if (settings.lazyLoad) {
2226
+ tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
2227
+ } else {
2228
+ tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
2229
+ }
2230
+ target.after(tnLink);
2231
+ target.after(icon);
2232
+ };
2233
+
2234
+ // wrap video content into owl-video-wrapper div
2235
+ target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');
2236
+
2237
+ if (this._core.settings.lazyLoad) {
2238
+ srcType = 'data-src';
2239
+ lazyClass = 'owl-lazy';
2240
+ }
2241
+
2242
+ // custom thumbnail
2243
+ if (customTn.length) {
2244
+ create(customTn.attr(srcType));
2245
+ customTn.remove();
2246
+ return false;
2247
+ }
2248
+
2249
+ if (video.type === 'youtube') {
2250
+ path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
2251
+ create(path);
2252
+ } else if (video.type === 'vimeo') {
2253
+ $.ajax({
2254
+ type: 'GET',
2255
+ url: '//vimeo.com/api/v2/video/' + video.id + '.json',
2256
+ jsonp: 'callback',
2257
+ dataType: 'jsonp',
2258
+ success: function(data) {
2259
+ path = data[0].thumbnail_large;
2260
+ create(path);
2261
+ }
2262
+ });
2263
+ } else if (video.type === 'vzaar') {
2264
+ $.ajax({
2265
+ type: 'GET',
2266
+ url: '//vzaar.com/api/videos/' + video.id + '.json',
2267
+ jsonp: 'callback',
2268
+ dataType: 'jsonp',
2269
+ success: function(data) {
2270
+ path = data.framegrab_url;
2271
+ create(path);
2272
+ }
2273
+ });
2274
+ }
2275
+ };
2276
+
2277
+ /**
2278
+ * Stops the current video.
2279
+ * @public
2280
+ */
2281
+ Video.prototype.stop = function() {
2282
+ this._core.trigger('stop', null, 'video');
2283
+ this._playing.find('.owl-video-frame').remove();
2284
+ this._playing.removeClass('owl-video-playing');
2285
+ this._playing = null;
2286
+ this._core.leave('playing');
2287
+ this._core.trigger('stopped', null, 'video');
2288
+ };
2289
+
2290
+ /**
2291
+ * Starts the current video.
2292
+ * @public
2293
+ * @param {Event} event - The event arguments.
2294
+ */
2295
+ Video.prototype.play = function(event) {
2296
+ var target = $(event.target),
2297
+ item = target.closest('.' + this._core.settings.itemClass),
2298
+ video = this._videos[item.attr('data-video')],
2299
+ width = video.width || '100%',
2300
+ height = video.height || this._core.$stage.height(),
2301
+ html;
2302
+
2303
+ if (this._playing) {
2304
+ return;
2305
+ }
2306
+
2307
+ this._core.enter('playing');
2308
+ this._core.trigger('play', null, 'video');
2309
+
2310
+ item = this._core.items(this._core.relative(item.index()));
2311
+
2312
+ this._core.reset(item.index());
2313
+
2314
+ if (video.type === 'youtube') {
2315
+ html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' +
2316
+ video.id + '?autoplay=1&rel=0&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
2317
+ } else if (video.type === 'vimeo') {
2318
+ html = '<iframe src="//player.vimeo.com/video/' + video.id +
2319
+ '?autoplay=1" width="' + width + '" height="' + height +
2320
+ '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
2321
+ } else if (video.type === 'vzaar') {
2322
+ html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width +
2323
+ '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' +
2324
+ 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
2325
+ }
2326
+
2327
+ $('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));
2328
+
2329
+ this._playing = item.addClass('owl-video-playing');
2330
+ };
2331
+
2332
+ /**
2333
+ * Checks whether an video is currently in full screen mode or not.
2334
+ * @todo Bad style because looks like a readonly method but changes members.
2335
+ * @protected
2336
+ * @returns {Boolean}
2337
+ */
2338
+ Video.prototype.isInFullScreen = function() {
2339
+ var element = document.fullscreenElement || document.mozFullScreenElement ||
2340
+ document.webkitFullscreenElement;
2341
+
2342
+ return element && $(element).parent().hasClass('owl-video-frame');
2343
+ };
2344
+
2345
+ /**
2346
+ * Destroys the plugin.
2347
+ */
2348
+ Video.prototype.destroy = function() {
2349
+ var handler, property;
2350
+
2351
+ this._core.$element.off('click.owl.video');
2352
+
2353
+ for (handler in this._handlers) {
2354
+ this._core.$element.off(handler, this._handlers[handler]);
2355
+ }
2356
+ for (property in Object.getOwnPropertyNames(this)) {
2357
+ typeof this[property] != 'function' && (this[property] = null);
2358
+ }
2359
+ };
2360
+
2361
+ $.fn.owlCarousel.Constructor.Plugins.Video = Video;
2362
+
2363
+ })(window.Zepto || window.jQuery, window, document);
2364
+
2365
+ /**
2366
+ * Animate Plugin
2367
+ * @version 2.1.0
2368
+ * @author Bartosz Wojciechowski
2369
+ * @author David Deutsch
2370
+ * @license The MIT License (MIT)
2371
+ */
2372
+ ;(function($, window, document, undefined) {
2373
+
2374
+ /**
2375
+ * Creates the animate plugin.
2376
+ * @class The Navigation Plugin
2377
+ * @param {Owl} scope - The Owl Carousel
2378
+ */
2379
+ var Animate = function(scope) {
2380
+ this.core = scope;
2381
+ this.core.options = $.extend({}, Animate.Defaults, this.core.options);
2382
+ this.swapping = true;
2383
+ this.previous = undefined;
2384
+ this.next = undefined;
2385
+
2386
+ this.handlers = {
2387
+ 'change.owl.carousel': $.proxy(function(e) {
2388
+ if (e.namespace && e.property.name == 'position') {
2389
+ this.previous = this.core.current();
2390
+ this.next = e.property.value;
2391
+ }
2392
+ }, this),
2393
+ 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {
2394
+ if (e.namespace) {
2395
+ this.swapping = e.type == 'translated';
2396
+ }
2397
+ }, this),
2398
+ 'translate.owl.carousel': $.proxy(function(e) {
2399
+ if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
2400
+ this.swap();
2401
+ }
2402
+ }, this)
2403
+ };
2404
+
2405
+ this.core.$element.on(this.handlers);
2406
+ };
2407
+
2408
+ /**
2409
+ * Default options.
2410
+ * @public
2411
+ */
2412
+ Animate.Defaults = {
2413
+ animateOut: false,
2414
+ animateIn: false
2415
+ };
2416
+
2417
+ /**
2418
+ * Toggles the animation classes whenever an translations starts.
2419
+ * @protected
2420
+ * @returns {Boolean|undefined}
2421
+ */
2422
+ Animate.prototype.swap = function() {
2423
+
2424
+ if (this.core.settings.items !== 1) {
2425
+ return;
2426
+ }
2427
+
2428
+ if (!$.support.animation || !$.support.transition) {
2429
+ return;
2430
+ }
2431
+
2432
+ this.core.speed(0);
2433
+
2434
+ var left,
2435
+ clear = $.proxy(this.clear, this),
2436
+ previous = this.core.$stage.children().eq(this.previous),
2437
+ next = this.core.$stage.children().eq(this.next),
2438
+ incoming = this.core.settings.animateIn,
2439
+ outgoing = this.core.settings.animateOut;
2440
+
2441
+ if (this.core.current() === this.previous) {
2442
+ return;
2443
+ }
2444
+
2445
+ if (outgoing) {
2446
+ left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
2447
+ previous.one($.support.animation.end, clear)
2448
+ .css( { 'left': left + 'px' } )
2449
+ .addClass('animated owl-animated-out')
2450
+ .addClass(outgoing);
2451
+ }
2452
+
2453
+ if (incoming) {
2454
+ next.one($.support.animation.end, clear)
2455
+ .addClass('animated owl-animated-in')
2456
+ .addClass(incoming);
2457
+ }
2458
+ };
2459
+
2460
+ Animate.prototype.clear = function(e) {
2461
+ $(e.target).css( { 'left': '' } )
2462
+ .removeClass('animated owl-animated-out owl-animated-in')
2463
+ .removeClass(this.core.settings.animateIn)
2464
+ .removeClass(this.core.settings.animateOut);
2465
+ this.core.onTransitionEnd();
2466
+ };
2467
+
2468
+ /**
2469
+ * Destroys the plugin.
2470
+ * @public
2471
+ */
2472
+ Animate.prototype.destroy = function() {
2473
+ var handler, property;
2474
+
2475
+ for (handler in this.handlers) {
2476
+ this.core.$element.off(handler, this.handlers[handler]);
2477
+ }
2478
+ for (property in Object.getOwnPropertyNames(this)) {
2479
+ typeof this[property] != 'function' && (this[property] = null);
2480
+ }
2481
+ };
2482
+
2483
+ $.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
2484
+
2485
+ })(window.Zepto || window.jQuery, window, document);
2486
+
2487
+ /**
2488
+ * Autoplay Plugin
2489
+ * @version 2.1.0
2490
+ * @author Bartosz Wojciechowski
2491
+ * @author Artus Kolanowski
2492
+ * @author David Deutsch
2493
+ * @license The MIT License (MIT)
2494
+ */
2495
+ ;(function($, window, document, undefined) {
2496
+
2497
+ /**
2498
+ * Creates the autoplay plugin.
2499
+ * @class The Autoplay Plugin
2500
+ * @param {Owl} scope - The Owl Carousel
2501
+ */
2502
+ var Autoplay = function(carousel) {
2503
+ /**
2504
+ * Reference to the core.
2505
+ * @protected
2506
+ * @type {Owl}
2507
+ */
2508
+ this._core = carousel;
2509
+
2510
+ /**
2511
+ * The autoplay timeout.
2512
+ * @type {Timeout}
2513
+ */
2514
+ this._timeout = null;
2515
+
2516
+ /**
2517
+ * Indicates whenever the autoplay is paused.
2518
+ * @type {Boolean}
2519
+ */
2520
+ this._paused = false;
2521
+
2522
+ /**
2523
+ * All event handlers.
2524
+ * @protected
2525
+ * @type {Object}
2526
+ */
2527
+ this._handlers = {
2528
+ 'changed.owl.carousel': $.proxy(function(e) {
2529
+ if (e.namespace && e.property.name === 'settings') {
2530
+ if (this._core.settings.autoplay) {
2531
+ this.play();
2532
+ } else {
2533
+ this.stop();
2534
+ }
2535
+ } else if (e.namespace && e.property.name === 'position') {
2536
+ //console.log('play?', e);
2537
+ if (this._core.settings.autoplay) {
2538
+ this._setAutoPlayInterval();
2539
+ }
2540
+ }
2541
+ }, this),
2542
+ 'initialized.owl.carousel': $.proxy(function(e) {
2543
+ if (e.namespace && this._core.settings.autoplay) {
2544
+ this.play();
2545
+ }
2546
+ }, this),
2547
+ 'play.owl.autoplay': $.proxy(function(e, t, s) {
2548
+ if (e.namespace) {
2549
+ this.play(t, s);
2550
+ }
2551
+ }, this),
2552
+ 'stop.owl.autoplay': $.proxy(function(e) {
2553
+ if (e.namespace) {
2554
+ this.stop();
2555
+ }
2556
+ }, this),
2557
+ 'mouseover.owl.autoplay': $.proxy(function() {
2558
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2559
+ this.pause();
2560
+ }
2561
+ }, this),
2562
+ 'mouseleave.owl.autoplay': $.proxy(function() {
2563
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2564
+ this.play();
2565
+ }
2566
+ }, this),
2567
+ 'touchstart.owl.core': $.proxy(function() {
2568
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2569
+ this.pause();
2570
+ }
2571
+ }, this),
2572
+ 'touchend.owl.core': $.proxy(function() {
2573
+ if (this._core.settings.autoplayHoverPause) {
2574
+ this.play();
2575
+ }
2576
+ }, this)
2577
+ };
2578
+
2579
+ // register event handlers
2580
+ this._core.$element.on(this._handlers);
2581
+
2582
+ // set default options
2583
+ this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
2584
+ };
2585
+
2586
+ /**
2587
+ * Default options.
2588
+ * @public
2589
+ */
2590
+ Autoplay.Defaults = {
2591
+ autoplay: false,
2592
+ autoplayTimeout: 5000,
2593
+ autoplayHoverPause: false,
2594
+ autoplaySpeed: false
2595
+ };
2596
+
2597
+ /**
2598
+ * Starts the autoplay.
2599
+ * @public
2600
+ * @param {Number} [timeout] - The interval before the next animation starts.
2601
+ * @param {Number} [speed] - The animation speed for the animations.
2602
+ */
2603
+ Autoplay.prototype.play = function(timeout, speed) {
2604
+ this._paused = false;
2605
+
2606
+ if (this._core.is('rotating')) {
2607
+ return;
2608
+ }
2609
+
2610
+ this._core.enter('rotating');
2611
+
2612
+ this._setAutoPlayInterval();
2613
+ };
2614
+
2615
+ /**
2616
+ * Gets a new timeout
2617
+ * @private
2618
+ * @param {Number} [timeout] - The interval before the next animation starts.
2619
+ * @param {Number} [speed] - The animation speed for the animations.
2620
+ * @return {Timeout}
2621
+ */
2622
+ Autoplay.prototype._getNextTimeout = function(timeout, speed) {
2623
+ if ( this._timeout ) {
2624
+ window.clearTimeout(this._timeout);
2625
+ }
2626
+ return window.setTimeout($.proxy(function() {
2627
+ if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
2628
+ return;
2629
+ }
2630
+ this._core.next(speed || this._core.settings.autoplaySpeed);
2631
+ }, this), timeout || this._core.settings.autoplayTimeout);
2632
+ };
2633
+
2634
+ /**
2635
+ * Sets autoplay in motion.
2636
+ * @private
2637
+ */
2638
+ Autoplay.prototype._setAutoPlayInterval = function() {
2639
+ this._timeout = this._getNextTimeout();
2640
+ };
2641
+
2642
+ /**
2643
+ * Stops the autoplay.
2644
+ * @public
2645
+ */
2646
+ Autoplay.prototype.stop = function() {
2647
+ if (!this._core.is('rotating')) {
2648
+ return;
2649
+ }
2650
+
2651
+ window.clearTimeout(this._timeout);
2652
+ this._core.leave('rotating');
2653
+ };
2654
+
2655
+ /**
2656
+ * Stops the autoplay.
2657
+ * @public
2658
+ */
2659
+ Autoplay.prototype.pause = function() {
2660
+ if (!this._core.is('rotating')) {
2661
+ return;
2662
+ }
2663
+
2664
+ this._paused = true;
2665
+ };
2666
+
2667
+ /**
2668
+ * Destroys the plugin.
2669
+ */
2670
+ Autoplay.prototype.destroy = function() {
2671
+ var handler, property;
2672
+
2673
+ this.stop();
2674
+
2675
+ for (handler in this._handlers) {
2676
+ this._core.$element.off(handler, this._handlers[handler]);
2677
+ }
2678
+ for (property in Object.getOwnPropertyNames(this)) {
2679
+ typeof this[property] != 'function' && (this[property] = null);
2680
+ }
2681
+ };
2682
+
2683
+ $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
2684
+
2685
+ })(window.Zepto || window.jQuery, window, document);
2686
+
2687
+ /**
2688
+ * Navigation Plugin
2689
+ * @version 2.1.0
2690
+ * @author Artus Kolanowski
2691
+ * @author David Deutsch
2692
+ * @license The MIT License (MIT)
2693
+ */
2694
+ ;(function($, window, document, undefined) {
2695
+ 'use strict';
2696
+
2697
+ /**
2698
+ * Creates the navigation plugin.
2699
+ * @class The Navigation Plugin
2700
+ * @param {Owl} carousel - The Owl Carousel.
2701
+ */
2702
+ var Navigation = function(carousel) {
2703
+ /**
2704
+ * Reference to the core.
2705
+ * @protected
2706
+ * @type {Owl}
2707
+ */
2708
+ this._core = carousel;
2709
+
2710
+ /**
2711
+ * Indicates whether the plugin is initialized or not.
2712
+ * @protected
2713
+ * @type {Boolean}
2714
+ */
2715
+ this._initialized = false;
2716
+
2717
+ /**
2718
+ * The current paging indexes.
2719
+ * @protected
2720
+ * @type {Array}
2721
+ */
2722
+ this._pages = [];
2723
+
2724
+ /**
2725
+ * All DOM elements of the user interface.
2726
+ * @protected
2727
+ * @type {Object}
2728
+ */
2729
+ this._controls = {};
2730
+
2731
+ /**
2732
+ * Markup for an indicator.
2733
+ * @protected
2734
+ * @type {Array.<String>}
2735
+ */
2736
+ this._templates = [];
2737
+
2738
+ /**
2739
+ * The carousel element.
2740
+ * @type {jQuery}
2741
+ */
2742
+ this.$element = this._core.$element;
2743
+
2744
+ /**
2745
+ * Overridden methods of the carousel.
2746
+ * @protected
2747
+ * @type {Object}
2748
+ */
2749
+ this._overrides = {
2750
+ next: this._core.next,
2751
+ prev: this._core.prev,
2752
+ to: this._core.to
2753
+ };
2754
+
2755
+ /**
2756
+ * All event handlers.
2757
+ * @protected
2758
+ * @type {Object}
2759
+ */
2760
+ this._handlers = {
2761
+ 'prepared.owl.carousel': $.proxy(function(e) {
2762
+ if (e.namespace && this._core.settings.dotsData) {
2763
+ this._templates.push('<div class="' + this._core.settings.dotClass + '">' +
2764
+ $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
2765
+ }
2766
+ }, this),
2767
+ 'added.owl.carousel': $.proxy(function(e) {
2768
+ if (e.namespace && this._core.settings.dotsData) {
2769
+ this._templates.splice(e.position, 0, this._templates.pop());
2770
+ }
2771
+ }, this),
2772
+ 'remove.owl.carousel': $.proxy(function(e) {
2773
+ if (e.namespace && this._core.settings.dotsData) {
2774
+ this._templates.splice(e.position, 1);
2775
+ }
2776
+ }, this),
2777
+ 'changed.owl.carousel': $.proxy(function(e) {
2778
+ if (e.namespace && e.property.name == 'position') {
2779
+ this.draw();
2780
+ }
2781
+ }, this),
2782
+ 'initialized.owl.carousel': $.proxy(function(e) {
2783
+ if (e.namespace && !this._initialized) {
2784
+ this._core.trigger('initialize', null, 'navigation');
2785
+ this.initialize();
2786
+ this.update();
2787
+ this.draw();
2788
+ this._initialized = true;
2789
+ this._core.trigger('initialized', null, 'navigation');
2790
+ }
2791
+ }, this),
2792
+ 'refreshed.owl.carousel': $.proxy(function(e) {
2793
+ if (e.namespace && this._initialized) {
2794
+ this._core.trigger('refresh', null, 'navigation');
2795
+ this.update();
2796
+ this.draw();
2797
+ this._core.trigger('refreshed', null, 'navigation');
2798
+ }
2799
+ }, this)
2800
+ };
2801
+
2802
+ // set default options
2803
+ this._core.options = $.extend({}, Navigation.Defaults, this._core.options);
2804
+
2805
+ // register event handlers
2806
+ this.$element.on(this._handlers);
2807
+ };
2808
+
2809
+ /**
2810
+ * Default options.
2811
+ * @public
2812
+ * @todo Rename `slideBy` to `navBy`
2813
+ */
2814
+ Navigation.Defaults = {
2815
+ nav: false,
2816
+ navText: [ 'prev', 'next' ],
2817
+ navSpeed: false,
2818
+ navElement: 'div',
2819
+ navContainer: false,
2820
+ navContainerClass: 'owl-nav',
2821
+ navClass: [ 'owl-prev', 'owl-next' ],
2822
+ slideBy: 1,
2823
+ dotClass: 'owl-dot',
2824
+ dotsClass: 'owl-dots',
2825
+ dots: true,
2826
+ dotsEach: false,
2827
+ dotsData: false,
2828
+ dotsSpeed: false,
2829
+ dotsContainer: false
2830
+ };
2831
+
2832
+ /**
2833
+ * Initializes the layout of the plugin and extends the carousel.
2834
+ * @protected
2835
+ */
2836
+ Navigation.prototype.initialize = function() {
2837
+ var override,
2838
+ settings = this._core.settings;
2839
+
2840
+ // create DOM structure for relative navigation
2841
+ this._controls.$relative = (settings.navContainer ? $(settings.navContainer)
2842
+ : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');
2843
+
2844
+ this._controls.$previous = $('<' + settings.navElement + '>')
2845
+ .addClass(settings.navClass[0])
2846
+ .html(settings.navText[0])
2847
+ .prependTo(this._controls.$relative)
2848
+ .on('click', $.proxy(function(e) {
2849
+ this.prev(settings.navSpeed);
2850
+ }, this));
2851
+ this._controls.$next = $('<' + settings.navElement + '>')
2852
+ .addClass(settings.navClass[1])
2853
+ .html(settings.navText[1])
2854
+ .appendTo(this._controls.$relative)
2855
+ .on('click', $.proxy(function(e) {
2856
+ this.next(settings.navSpeed);
2857
+ }, this));
2858
+
2859
+ // create DOM structure for absolute navigation
2860
+ if (!settings.dotsData) {
2861
+ this._templates = [ $('<div>')
2862
+ .addClass(settings.dotClass)
2863
+ .append($('<span>'))
2864
+ .prop('outerHTML') ];
2865
+ }
2866
+
2867
+ this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer)
2868
+ : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');
2869
+
2870
+ this._controls.$absolute.on('click', 'div', $.proxy(function(e) {
2871
+ var index = $(e.target).parent().is(this._controls.$absolute)
2872
+ ? $(e.target).index() : $(e.target).parent().index();
2873
+
2874
+ e.preventDefault();
2875
+
2876
+ this.to(index, settings.dotsSpeed);
2877
+ }, this));
2878
+
2879
+ // override public methods of the carousel
2880
+ for (override in this._overrides) {
2881
+ this._core[override] = $.proxy(this[override], this);
2882
+ }
2883
+ };
2884
+
2885
+ /**
2886
+ * Destroys the plugin.
2887
+ * @protected
2888
+ */
2889
+ Navigation.prototype.destroy = function() {
2890
+ var handler, control, property, override;
2891
+
2892
+ for (handler in this._handlers) {
2893
+ this.$element.off(handler, this._handlers[handler]);
2894
+ }
2895
+ for (control in this._controls) {
2896
+ this._controls[control].remove();
2897
+ }
2898
+ for (override in this.overides) {
2899
+ this._core[override] = this._overrides[override];
2900
+ }
2901
+ for (property in Object.getOwnPropertyNames(this)) {
2902
+ typeof this[property] != 'function' && (this[property] = null);
2903
+ }
2904
+ };
2905
+
2906
+ /**
2907
+ * Updates the internal state.
2908
+ * @protected
2909
+ */
2910
+ Navigation.prototype.update = function() {
2911
+ var i, j, k,
2912
+ lower = this._core.clones().length / 2,
2913
+ upper = lower + this._core.items().length,
2914
+ maximum = this._core.maximum(true),
2915
+ settings = this._core.settings,
2916
+ size = settings.center || settings.autoWidth || settings.dotsData
2917
+ ? 1 : settings.dotsEach || settings.items;
2918
+
2919
+ if (settings.slideBy !== 'page') {
2920
+ settings.slideBy = Math.min(settings.slideBy, settings.items);
2921
+ }
2922
+
2923
+ if (settings.dots || settings.slideBy == 'page') {
2924
+ this._pages = [];
2925
+
2926
+ for (i = lower, j = 0, k = 0; i < upper; i++) {
2927
+ if (j >= size || j === 0) {
2928
+ this._pages.push({
2929
+ start: Math.min(maximum, i - lower),
2930
+ end: i - lower + size - 1
2931
+ });
2932
+ if (Math.min(maximum, i - lower) === maximum) {
2933
+ break;
2934
+ }
2935
+ j = 0, ++k;
2936
+ }
2937
+ j += this._core.mergers(this._core.relative(i));
2938
+ }
2939
+ }
2940
+ };
2941
+
2942
+ /**
2943
+ * Draws the user interface.
2944
+ * @todo The option `dotsData` wont work.
2945
+ * @protected
2946
+ */
2947
+ Navigation.prototype.draw = function() {
2948
+ var difference,
2949
+ settings = this._core.settings,
2950
+ disabled = this._core.items().length <= settings.items,
2951
+ index = this._core.relative(this._core.current()),
2952
+ loop = settings.loop || settings.rewind;
2953
+
2954
+ this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);
2955
+
2956
+ if (settings.nav) {
2957
+ this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
2958
+ this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
2959
+ }
2960
+
2961
+ this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);
2962
+
2963
+ if (settings.dots) {
2964
+ difference = this._pages.length - this._controls.$absolute.children().length;
2965
+
2966
+ if (settings.dotsData && difference !== 0) {
2967
+ this._controls.$absolute.html(this._templates.join(''));
2968
+ } else if (difference > 0) {
2969
+ this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
2970
+ } else if (difference < 0) {
2971
+ this._controls.$absolute.children().slice(difference).remove();
2972
+ }
2973
+
2974
+ this._controls.$absolute.find('.active').removeClass('active');
2975
+ this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
2976
+ }
2977
+ };
2978
+
2979
+ /**
2980
+ * Extends event data.
2981
+ * @protected
2982
+ * @param {Event} event - The event object which gets thrown.
2983
+ */
2984
+ Navigation.prototype.onTrigger = function(event) {
2985
+ var settings = this._core.settings;
2986
+
2987
+ event.page = {
2988
+ index: $.inArray(this.current(), this._pages),
2989
+ count: this._pages.length,
2990
+ size: settings && (settings.center || settings.autoWidth || settings.dotsData
2991
+ ? 1 : settings.dotsEach || settings.items)
2992
+ };
2993
+ };
2994
+
2995
+ /**
2996
+ * Gets the current page position of the carousel.
2997
+ * @protected
2998
+ * @returns {Number}
2999
+ */
3000
+ Navigation.prototype.current = function() {
3001
+ var current = this._core.relative(this._core.current());
3002
+ return $.grep(this._pages, $.proxy(function(page, index) {
3003
+ return page.start <= current && page.end >= current;
3004
+ }, this)).pop();
3005
+ };
3006
+
3007
+ /**
3008
+ * Gets the current succesor/predecessor position.
3009
+ * @protected
3010
+ * @returns {Number}
3011
+ */
3012
+ Navigation.prototype.getPosition = function(successor) {
3013
+ var position, length,
3014
+ settings = this._core.settings;
3015
+
3016
+ if (settings.slideBy == 'page') {
3017
+ position = $.inArray(this.current(), this._pages);
3018
+ length = this._pages.length;
3019
+ successor ? ++position : --position;
3020
+ position = this._pages[((position % length) + length) % length].start;
3021
+ } else {
3022
+ position = this._core.relative(this._core.current());
3023
+ length = this._core.items().length;
3024
+ successor ? position += settings.slideBy : position -= settings.slideBy;
3025
+ }
3026
+
3027
+ return position;
3028
+ };
3029
+
3030
+ /**
3031
+ * Slides to the next item or page.
3032
+ * @public
3033
+ * @param {Number} [speed=false] - The time in milliseconds for the transition.
3034
+ */
3035
+ Navigation.prototype.next = function(speed) {
3036
+ $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
3037
+ };
3038
+
3039
+ /**
3040
+ * Slides to the previous item or page.
3041
+ * @public
3042
+ * @param {Number} [speed=false] - The time in milliseconds for the transition.
3043
+ */
3044
+ Navigation.prototype.prev = function(speed) {
3045
+ $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
3046
+ };
3047
+
3048
+ /**
3049
+ * Slides to the specified item or page.
3050
+ * @public
3051
+ * @param {Number} position - The position of the item or page.
3052
+ * @param {Number} [speed] - The time in milliseconds for the transition.
3053
+ * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
3054
+ */
3055
+ Navigation.prototype.to = function(position, speed, standard) {
3056
+ var length;
3057
+
3058
+ if (!standard && this._pages.length) {
3059
+ length = this._pages.length;
3060
+ $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed);
3061
+ } else {
3062
+ $.proxy(this._overrides.to, this._core)(position, speed);
3063
+ }
3064
+ };
3065
+
3066
+ $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
3067
+
3068
+ })(window.Zepto || window.jQuery, window, document);
3069
+
3070
+ /**
3071
+ * Hash Plugin
3072
+ * @version 2.1.0
3073
+ * @author Artus Kolanowski
3074
+ * @author David Deutsch
3075
+ * @license The MIT License (MIT)
3076
+ */
3077
+ ;(function($, window, document, undefined) {
3078
+ 'use strict';
3079
+
3080
+ /**
3081
+ * Creates the hash plugin.
3082
+ * @class The Hash Plugin
3083
+ * @param {Owl} carousel - The Owl Carousel
3084
+ */
3085
+ var Hash = function(carousel) {
3086
+ /**
3087
+ * Reference to the core.
3088
+ * @protected
3089
+ * @type {Owl}
3090
+ */
3091
+ this._core = carousel;
3092
+
3093
+ /**
3094
+ * Hash index for the items.
3095
+ * @protected
3096
+ * @type {Object}
3097
+ */
3098
+ this._hashes = {};
3099
+
3100
+ /**
3101
+ * The carousel element.
3102
+ * @type {jQuery}
3103
+ */
3104
+ this.$element = this._core.$element;
3105
+
3106
+ /**
3107
+ * All event handlers.
3108
+ * @protected
3109
+ * @type {Object}
3110
+ */
3111
+ this._handlers = {
3112
+ 'initialized.owl.carousel': $.proxy(function(e) {
3113
+ if (e.namespace && this._core.settings.startPosition === 'URLHash') {
3114
+ $(window).trigger('hashchange.owl.navigation');
3115
+ }
3116
+ }, this),
3117
+ 'prepared.owl.carousel': $.proxy(function(e) {
3118
+ if (e.namespace) {
3119
+ var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');
3120
+
3121
+ if (!hash) {
3122
+ return;
3123
+ }
3124
+
3125
+ this._hashes[hash] = e.content;
3126
+ }
3127
+ }, this),
3128
+ 'changed.owl.carousel': $.proxy(function(e) {
3129
+ if (e.namespace && e.property.name === 'position') {
3130
+ var current = this._core.items(this._core.relative(this._core.current())),
3131
+ hash = $.map(this._hashes, function(item, hash) {
3132
+ return item === current ? hash : null;
3133
+ }).join();
3134
+
3135
+ if (!hash || window.location.hash.slice(1) === hash) {
3136
+ return;
3137
+ }
3138
+
3139
+ window.location.hash = hash;
3140
+ }
3141
+ }, this)
3142
+ };
3143
+
3144
+ // set default options
3145
+ this._core.options = $.extend({}, Hash.Defaults, this._core.options);
3146
+
3147
+ // register the event handlers
3148
+ this.$element.on(this._handlers);
3149
+
3150
+ // register event listener for hash navigation
3151
+ $(window).on('hashchange.owl.navigation', $.proxy(function(e) {
3152
+ var hash = window.location.hash.substring(1),
3153
+ items = this._core.$stage.children(),
3154
+ position = this._hashes[hash] && items.index(this._hashes[hash]);
3155
+
3156
+ if (position === undefined || position === this._core.current()) {
3157
+ return;
3158
+ }
3159
+
3160
+ this._core.to(this._core.relative(position), false, true);
3161
+ }, this));
3162
+ };
3163
+
3164
+ /**
3165
+ * Default options.
3166
+ * @public
3167
+ */
3168
+ Hash.Defaults = {
3169
+ URLhashListener: false
3170
+ };
3171
+
3172
+ /**
3173
+ * Destroys the plugin.
3174
+ * @public
3175
+ */
3176
+ Hash.prototype.destroy = function() {
3177
+ var handler, property;
3178
+
3179
+ $(window).off('hashchange.owl.navigation');
3180
+
3181
+ for (handler in this._handlers) {
3182
+ this._core.$element.off(handler, this._handlers[handler]);
3183
+ }
3184
+ for (property in Object.getOwnPropertyNames(this)) {
3185
+ typeof this[property] != 'function' && (this[property] = null);
3186
+ }
3187
+ };
3188
+
3189
+ $.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
3190
+
3191
+ })(window.Zepto || window.jQuery, window, document);
3192
+
3193
+ /**
3194
+ * Support Plugin
3195
+ *
3196
+ * @version 2.1.0
3197
+ * @author Vivid Planet Software GmbH
3198
+ * @author Artus Kolanowski
3199
+ * @author David Deutsch
3200
+ * @license The MIT License (MIT)
3201
+ */
3202
+ ;(function($, window, document, undefined) {
3203
+
3204
+ var style = $('<support>').get(0).style,
3205
+ prefixes = 'Webkit Moz O ms'.split(' '),
3206
+ events = {
3207
+ transition: {
3208
+ end: {
3209
+ WebkitTransition: 'webkitTransitionEnd',
3210
+ MozTransition: 'transitionend',
3211
+ OTransition: 'oTransitionEnd',
3212
+ transition: 'transitionend'
3213
+ }
3214
+ },
3215
+ animation: {
3216
+ end: {
3217
+ WebkitAnimation: 'webkitAnimationEnd',
3218
+ MozAnimation: 'animationend',
3219
+ OAnimation: 'oAnimationEnd',
3220
+ animation: 'animationend'
3221
+ }
3222
+ }
3223
+ },
3224
+ tests = {
3225
+ csstransforms: function() {
3226
+ return !!test('transform');
3227
+ },
3228
+ csstransforms3d: function() {
3229
+ return !!test('perspective');
3230
+ },
3231
+ csstransitions: function() {
3232
+ return !!test('transition');
3233
+ },
3234
+ cssanimations: function() {
3235
+ return !!test('animation');
3236
+ }
3237
+ };
3238
+
3239
+ function test(property, prefixed) {
3240
+ var result = false,
3241
+ upper = property.charAt(0).toUpperCase() + property.slice(1);
3242
+
3243
+ $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) {
3244
+ if (style[property] !== undefined) {
3245
+ result = prefixed ? property : true;
3246
+ return false;
3247
+ }
3248
+ });
3249
+
3250
+ return result;
3251
+ }
3252
+
3253
+ function prefixed(property) {
3254
+ return test(property, true);
3255
+ }
3256
+
3257
+ if (tests.csstransitions()) {
3258
+ /* jshint -W053 */
3259
+ $.support.transition = new String(prefixed('transition'))
3260
+ $.support.transition.end = events.transition.end[ $.support.transition ];
3261
+ }
3262
+
3263
+ if (tests.cssanimations()) {
3264
+ /* jshint -W053 */
3265
+ $.support.animation = new String(prefixed('animation'))
3266
+ $.support.animation.end = events.animation.end[ $.support.animation ];
3267
+ }
3268
+
3269
+ if (tests.csstransforms()) {
3270
+ /* jshint -W053 */
3271
+ $.support.transform = new String(prefixed('transform'));
3272
+ $.support.transform3d = tests.csstransforms3d();
3273
+ }
3274
+
3275
+ })(window.Zepto || window.jQuery, window, document);
assets/front/js/owl.carousel.min.js CHANGED
@@ -1,3266 +1 @@
1
- /**
2
- * Owl Carousel v2.1.0
3
- * Copyright 2013-2016 David Deutsch
4
- * Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
5
- */
6
- /**
7
- * Owl carousel
8
- * @version 2.1.0
9
- * @author Bartosz Wojciechowski
10
- * @author David Deutsch
11
- * @license The MIT License (MIT)
12
- * @todo Lazy Load Icon
13
- * @todo prevent animationend bubling
14
- * @todo itemsScaleUp
15
- * @todo Test Zepto
16
- * @todo stagePadding calculate wrong active classes
17
- */
18
- ;(function($, window, document, undefined) {
19
-
20
- /**
21
- * Creates a carousel.
22
- * @class The Owl Carousel.
23
- * @public
24
- * @param {HTMLElement|jQuery} element - The element to create the carousel for.
25
- * @param {Object} [options] - The options
26
- */
27
- function Owl(element, options) {
28
-
29
- /**
30
- * Current settings for the carousel.
31
- * @public
32
- */
33
- this.settings = null;
34
-
35
- /**
36
- * Current options set by the caller including defaults.
37
- * @public
38
- */
39
- this.options = $.extend({}, Owl.Defaults, options);
40
-
41
- /**
42
- * Plugin element.
43
- * @public
44
- */
45
- this.$element = $(element);
46
-
47
- /**
48
- * Proxied event handlers.
49
- * @protected
50
- */
51
- this._handlers = {};
52
-
53
- /**
54
- * References to the running plugins of this carousel.
55
- * @protected
56
- */
57
- this._plugins = {};
58
-
59
- /**
60
- * Currently suppressed events to prevent them from beeing retriggered.
61
- * @protected
62
- */
63
- this._supress = {};
64
-
65
- /**
66
- * Absolute current position.
67
- * @protected
68
- */
69
- this._current = null;
70
-
71
- /**
72
- * Animation speed in milliseconds.
73
- * @protected
74
- */
75
- this._speed = null;
76
-
77
- /**
78
- * Coordinates of all items in pixel.
79
- * @todo The name of this member is missleading.
80
- * @protected
81
- */
82
- this._coordinates = [];
83
-
84
- /**
85
- * Current breakpoint.
86
- * @todo Real media queries would be nice.
87
- * @protected
88
- */
89
- this._breakpoint = null;
90
-
91
- /**
92
- * Current width of the plugin element.
93
- */
94
- this._width = null;
95
-
96
- /**
97
- * All real items.
98
- * @protected
99
- */
100
- this._items = [];
101
-
102
- /**
103
- * All cloned items.
104
- * @protected
105
- */
106
- this._clones = [];
107
-
108
- /**
109
- * Merge values of all items.
110
- * @todo Maybe this could be part of a plugin.
111
- * @protected
112
- */
113
- this._mergers = [];
114
-
115
- /**
116
- * Widths of all items.
117
- */
118
- this._widths = [];
119
-
120
- /**
121
- * Invalidated parts within the update process.
122
- * @protected
123
- */
124
- this._invalidated = {};
125
-
126
- /**
127
- * Ordered list of workers for the update process.
128
- * @protected
129
- */
130
- this._pipe = [];
131
-
132
- /**
133
- * Current state information for the drag operation.
134
- * @todo #261
135
- * @protected
136
- */
137
- this._drag = {
138
- time: null,
139
- target: null,
140
- pointer: null,
141
- stage: {
142
- start: null,
143
- current: null
144
- },
145
- direction: null
146
- };
147
-
148
- /**
149
- * Current state information and their tags.
150
- * @type {Object}
151
- * @protected
152
- */
153
- this._states = {
154
- current: {},
155
- tags: {
156
- 'initializing': [ 'busy' ],
157
- 'animating': [ 'busy' ],
158
- 'dragging': [ 'interacting' ]
159
- }
160
- };
161
-
162
- $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {
163
- this._handlers[handler] = $.proxy(this[handler], this);
164
- }, this));
165
-
166
- $.each(Owl.Plugins, $.proxy(function(key, plugin) {
167
- this._plugins[key.charAt(0).toLowerCase() + key.slice(1)]
168
- = new plugin(this);
169
- }, this));
170
-
171
- $.each(Owl.Workers, $.proxy(function(priority, worker) {
172
- this._pipe.push({
173
- 'filter': worker.filter,
174
- 'run': $.proxy(worker.run, this)
175
- });
176
- }, this));
177
-
178
- this.setup();
179
- this.initialize();
180
- }
181
-
182
- /**
183
- * Default options for the carousel.
184
- * @public
185
- */
186
- Owl.Defaults = {
187
- items: 3,
188
- loop: false,
189
- center: false,
190
- rewind: false,
191
-
192
- mouseDrag: true,
193
- touchDrag: true,
194
- pullDrag: true,
195
- freeDrag: false,
196
-
197
- margin: 0,
198
- stagePadding: 0,
199
-
200
- merge: false,
201
- mergeFit: true,
202
- autoWidth: false,
203
-
204
- startPosition: 0,
205
- rtl: false,
206
-
207
- smartSpeed: 250,
208
- fluidSpeed: false,
209
- dragEndSpeed: false,
210
-
211
- responsive: {},
212
- responsiveRefreshRate: 200,
213
- responsiveBaseElement: window,
214
-
215
- fallbackEasing: 'swing',
216
-
217
- info: false,
218
-
219
- nestedItemSelector: false,
220
- itemElement: 'div',
221
- stageElement: 'div',
222
-
223
- refreshClass: 'owl-refresh',
224
- loadedClass: 'owl-loaded',
225
- loadingClass: 'owl-loading',
226
- rtlClass: 'owl-rtl',
227
- responsiveClass: 'owl-responsive',
228
- dragClass: 'owl-drag',
229
- itemClass: 'owl-item',
230
- stageClass: 'owl-stage',
231
- stageOuterClass: 'owl-stage-outer',
232
- grabClass: 'owl-grab'
233
- };
234
-
235
- /**
236
- * Enumeration for width.
237
- * @public
238
- * @readonly
239
- * @enum {String}
240
- */
241
- Owl.Width = {
242
- Default: 'default',
243
- Inner: 'inner',
244
- Outer: 'outer'
245
- };
246
-
247
- /**
248
- * Enumeration for types.
249
- * @public
250
- * @readonly
251
- * @enum {String}
252
- */
253
- Owl.Type = {
254
- Event: 'event',
255
- State: 'state'
256
- };
257
-
258
- /**
259
- * Contains all registered plugins.
260
- * @public
261
- */
262
- Owl.Plugins = {};
263
-
264
- /**
265
- * List of workers involved in the update process.
266
- */
267
- Owl.Workers = [ {
268
- filter: [ 'width', 'settings' ],
269
- run: function() {
270
- this._width = this.$element.width();
271
- }
272
- }, {
273
- filter: [ 'width', 'items', 'settings' ],
274
- run: function(cache) {
275
- cache.current = this._items && this._items[this.relative(this._current)];
276
- }
277
- }, {
278
- filter: [ 'items', 'settings' ],
279
- run: function() {
280
- this.$stage.children('.cloned').remove();
281
- }
282
- }, {
283
- filter: [ 'width', 'items', 'settings' ],
284
- run: function(cache) {
285
- var margin = this.settings.margin || '',
286
- grid = !this.settings.autoWidth,
287
- rtl = this.settings.rtl,
288
- css = {
289
- 'width': 'auto',
290
- 'margin-left': rtl ? margin : '',
291
- 'margin-right': rtl ? '' : margin
292
- };
293
-
294
- !grid && this.$stage.children().css(css);
295
-
296
- cache.css = css;
297
- }
298
- }, {
299
- filter: [ 'width', 'items', 'settings' ],
300
- run: function(cache) {
301
- var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
302
- merge = null,
303
- iterator = this._items.length,
304
- grid = !this.settings.autoWidth,
305
- widths = [];
306
-
307
- cache.items = {
308
- merge: false,
309
- width: width
310
- };
311
-
312
- while (iterator--) {
313
- merge = this._mergers[iterator];
314
- merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;
315
-
316
- cache.items.merge = merge > 1 || cache.items.merge;
317
-
318
- widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
319
- }
320
-
321
- this._widths = widths;
322
- }
323
- }, {
324
- filter: [ 'items', 'settings' ],
325
- run: function() {
326
- var clones = [],
327
- items = this._items,
328
- settings = this.settings,
329
- view = Math.max(settings.items * 2, 4),
330
- size = Math.ceil(items.length / 2) * 2,
331
- repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
332
- append = '',
333
- prepend = '';
334
-
335
- repeat /= 2;
336
-
337
- while (repeat--) {
338
- clones.push(this.normalize(clones.length / 2, true));
339
- append = append + items[clones[clones.length - 1]][0].outerHTML;
340
- clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
341
- prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
342
- }
343
-
344
- this._clones = clones;
345
-
346
- $(append).addClass('cloned').appendTo(this.$stage);
347
- $(prepend).addClass('cloned').prependTo(this.$stage);
348
- }
349
- }, {
350
- filter: [ 'width', 'items', 'settings' ],
351
- run: function() {
352
- var rtl = this.settings.rtl ? 1 : -1,
353
- size = this._clones.length + this._items.length,
354
- iterator = -1,
355
- previous = 0,
356
- current = 0,
357
- coordinates = [];
358
-
359
- while (++iterator < size) {
360
- previous = coordinates[iterator - 1] || 0;
361
- current = this._widths[this.relative(iterator)] + this.settings.margin;
362
- coordinates.push(previous + current * rtl);
363
- }
364
-
365
- this._coordinates = coordinates;
366
- }
367
- }, {
368
- filter: [ 'width', 'items', 'settings' ],
369
- run: function() {
370
- var padding = this.settings.stagePadding,
371
- coordinates = this._coordinates,
372
- css = {
373
- 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
374
- 'padding-left': padding || '',
375
- 'padding-right': padding || ''
376
- };
377
-
378
- this.$stage.css(css);
379
- }
380
- }, {
381
- filter: [ 'width', 'items', 'settings' ],
382
- run: function(cache) {
383
- var iterator = this._coordinates.length,
384
- grid = !this.settings.autoWidth,
385
- items = this.$stage.children();
386
-
387
- if (grid && cache.items.merge) {
388
- while (iterator--) {
389
- cache.css.width = this._widths[this.relative(iterator)];
390
- items.eq(iterator).css(cache.css);
391
- }
392
- } else if (grid) {
393
- cache.css.width = cache.items.width;
394
- items.css(cache.css);
395
- }
396
- }
397
- }, {
398
- filter: [ 'items' ],
399
- run: function() {
400
- this._coordinates.length < 1 && this.$stage.removeAttr('style');
401
- }
402
- }, {
403
- filter: [ 'width', 'items', 'settings' ],
404
- run: function(cache) {
405
- cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
406
- cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
407
- this.reset(cache.current);
408
- }
409
- }, {
410
- filter: [ 'position' ],
411
- run: function() {
412
- this.animate(this.coordinates(this._current));
413
- }
414
- }, {
415
- filter: [ 'width', 'position', 'items', 'settings' ],
416
- run: function() {
417
- var rtl = this.settings.rtl ? 1 : -1,
418
- padding = this.settings.stagePadding * 2,
419
- begin = this.coordinates(this.current()) + padding,
420
- end = begin + this.width() * rtl,
421
- inner, outer, matches = [], i, n;
422
-
423
- for (i = 0, n = this._coordinates.length; i < n; i++) {
424
- inner = this._coordinates[i - 1] || 0;
425
- outer = Math.abs(this._coordinates[i]) + padding * rtl;
426
-
427
- if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
428
- || (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
429
- matches.push(i);
430
- }
431
- }
432
-
433
- this.$stage.children('.active').removeClass('active');
434
- this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
435
-
436
- if (this.settings.center) {
437
- this.$stage.children('.center').removeClass('center');
438
- this.$stage.children().eq(this.current()).addClass('center');
439
- }
440
- }
441
- } ];
442
-
443
- /**
444
- * Initializes the carousel.
445
- * @protected
446
- */
447
- Owl.prototype.initialize = function() {
448
- this.enter('initializing');
449
- this.trigger('initialize');
450
-
451
- this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
452
-
453
- if (this.settings.autoWidth && !this.is('pre-loading')) {
454
- var imgs, nestedSelector, width;
455
- imgs = this.$element.find('img');
456
- nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
457
- width = this.$element.children(nestedSelector).width();
458
-
459
- if (imgs.length && width <= 0) {
460
- this.preloadAutoWidthImages(imgs);
461
- }
462
- }
463
-
464
- this.$element.addClass(this.options.loadingClass);
465
-
466
- // create stage
467
- this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>')
468
- .wrap('<div class="' + this.settings.stageOuterClass + '"/>');
469
-
470
- // append stage
471
- this.$element.append(this.$stage.parent());
472
-
473
- // append content
474
- this.replace(this.$element.children().not(this.$stage.parent()));
475
-
476
- // check visibility
477
- if (this.$element.is(':visible')) {
478
- // update view
479
- this.refresh();
480
- } else {
481
- // invalidate width
482
- this.invalidate('width');
483
- }
484
-
485
- this.$element
486
- .removeClass(this.options.loadingClass)
487
- .addClass(this.options.loadedClass);
488
-
489
- // register event handlers
490
- this.registerEventHandlers();
491
-
492
- this.leave('initializing');
493
- this.trigger('initialized');
494
- };
495
-
496
- /**
497
- * Setups the current settings.
498
- * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
499
- * @todo Support for media queries by using `matchMedia` would be nice.
500
- * @public
501
- */
502
- Owl.prototype.setup = function() {
503
- var viewport = this.viewport(),
504
- overwrites = this.options.responsive,
505
- match = -1,
506
- settings = null;
507
-
508
- if (!overwrites) {
509
- settings = $.extend({}, this.options);
510
- } else {
511
- $.each(overwrites, function(breakpoint) {
512
- if (breakpoint <= viewport && breakpoint > match) {
513
- match = Number(breakpoint);
514
- }
515
- });
516
-
517
- settings = $.extend({}, this.options, overwrites[match]);
518
- delete settings.responsive;
519
-
520
- // responsive class
521
- if (settings.responsiveClass) {
522
- this.$element.attr('class',
523
- this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match)
524
- );
525
- }
526
- }
527
-
528
- if (this.settings === null || this._breakpoint !== match) {
529
- this.trigger('change', { property: { name: 'settings', value: settings } });
530
- this._breakpoint = match;
531
- this.settings = settings;
532
- this.invalidate('settings');
533
- this.trigger('changed', { property: { name: 'settings', value: this.settings } });
534
- }
535
- };
536
-
537
- /**
538
- * Updates option logic if necessery.
539
- * @protected
540
- */
541
- Owl.prototype.optionsLogic = function() {
542
- if (this.settings.autoWidth) {
543
- this.settings.stagePadding = false;
544
- this.settings.merge = false;
545
- }
546
- };
547
-
548
- /**
549
- * Prepares an item before add.
550
- * @todo Rename event parameter `content` to `item`.
551
- * @protected
552
- * @returns {jQuery|HTMLElement} - The item container.
553
- */
554
- Owl.prototype.prepare = function(item) {
555
- var event = this.trigger('prepare', { content: item });
556
-
557
- if (!event.data) {
558
- event.data = $('<' + this.settings.itemElement + '/>')
559
- .addClass(this.options.itemClass).append(item)
560
- }
561
-
562
- this.trigger('prepared', { content: event.data });
563
-
564
- return event.data;
565
- };
566
-
567
- /**
568
- * Updates the view.
569
- * @public
570
- */
571
- Owl.prototype.update = function() {
572
- var i = 0,
573
- n = this._pipe.length,
574
- filter = $.proxy(function(p) { return this[p] }, this._invalidated),
575
- cache = {};
576
-
577
- while (i < n) {
578
- if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
579
- this._pipe[i].run(cache);
580
- }
581
- i++;
582
- }
583
-
584
- this._invalidated = {};
585
-
586
- !this.is('valid') && this.enter('valid');
587
- };
588
-
589
- /**
590
- * Gets the width of the view.
591
- * @public
592
- * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
593
- * @returns {Number} - The width of the view in pixel.
594
- */
595
- Owl.prototype.width = function(dimension) {
596
- dimension = dimension || Owl.Width.Default;
597
- switch (dimension) {
598
- case Owl.Width.Inner:
599
- case Owl.Width.Outer:
600
- return this._width;
601
- default:
602
- return this._width - this.settings.stagePadding * 2 + this.settings.margin;
603
- }
604
- };
605
-
606
- /**
607
- * Refreshes the carousel primarily for adaptive purposes.
608
- * @public
609
- */
610
- Owl.prototype.refresh = function() {
611
- this.enter('refreshing');
612
- this.trigger('refresh');
613
-
614
- this.setup();
615
-
616
- this.optionsLogic();
617
-
618
- this.$element.addClass(this.options.refreshClass);
619
-
620
- this.update();
621
-
622
- this.$element.removeClass(this.options.refreshClass);
623
-
624
- this.leave('refreshing');
625
- this.trigger('refreshed');
626
- };
627
-
628
- /**
629
- * Checks window `resize` event.
630
- * @protected
631
- */
632
- Owl.prototype.onThrottledResize = function() {
633
- window.clearTimeout(this.resizeTimer);
634
- this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
635
- };
636
-
637
- /**
638
- * Checks window `resize` event.
639
- * @protected
640
- */
641
- Owl.prototype.onResize = function() {
642
- if (!this._items.length) {
643
- return false;
644
- }
645
-
646
- if (this._width === this.$element.width()) {
647
- return false;
648
- }
649
-
650
- if (!this.$element.is(':visible')) {
651
- return false;
652
- }
653
-
654
- this.enter('resizing');
655
-
656
- if (this.trigger('resize').isDefaultPrevented()) {
657
- this.leave('resizing');
658
- return false;
659
- }
660
-
661
- this.invalidate('width');
662
-
663
- this.refresh();
664
-
665
- this.leave('resizing');
666
- this.trigger('resized');
667
- };
668
-
669
- /**
670
- * Registers event handlers.
671
- * @todo Check `msPointerEnabled`
672
- * @todo #261
673
- * @protected
674
- */
675
- Owl.prototype.registerEventHandlers = function() {
676
- if ($.support.transition) {
677
- this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
678
- }
679
-
680
- if (this.settings.responsive !== false) {
681
- this.on(window, 'resize', this._handlers.onThrottledResize);
682
- }
683
-
684
- if (this.settings.mouseDrag) {
685
- this.$element.addClass(this.options.dragClass);
686
- this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
687
- this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });
688
- }
689
-
690
- if (this.settings.touchDrag){
691
- this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
692
- this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
693
- }
694
- };
695
-
696
- /**
697
- * Handles `touchstart` and `mousedown` events.
698
- * @todo Horizontal swipe threshold as option
699
- * @todo #261
700
- * @protected
701
- * @param {Event} event - The event arguments.
702
- */
703
- Owl.prototype.onDragStart = function(event) {
704
- var stage = null;
705
-
706
- if (event.which === 3) {
707
- return;
708
- }
709
-
710
- if ($.support.transform) {
711
- stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
712
- stage = {
713
- x: stage[stage.length === 16 ? 12 : 4],
714
- y: stage[stage.length === 16 ? 13 : 5]
715
- };
716
- } else {
717
- stage = this.$stage.position();
718
- stage = {
719
- x: this.settings.rtl ?
720
- stage.left + this.$stage.width() - this.width() + this.settings.margin :
721
- stage.left,
722
- y: stage.top
723
- };
724
- }
725
-
726
- if (this.is('animating')) {
727
- $.support.transform ? this.animate(stage.x) : this.$stage.stop()
728
- this.invalidate('position');
729
- }
730
-
731
- this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');
732
-
733
- this.speed(0);
734
-
735
- this._drag.time = new Date().getTime();
736
- this._drag.target = $(event.target);
737
- this._drag.stage.start = stage;
738
- this._drag.stage.current = stage;
739
- this._drag.pointer = this.pointer(event);
740
-
741
- $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
742
-
743
- $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {
744
- var delta = this.difference(this._drag.pointer, this.pointer(event));
745
-
746
- $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
747
-
748
- if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
749
- return;
750
- }
751
-
752
- event.preventDefault();
753
-
754
- this.enter('dragging');
755
- this.trigger('drag');
756
- }, this));
757
- };
758
-
759
- /**
760
- * Handles the `touchmove` and `mousemove` events.
761
- * @todo #261
762
- * @protected
763
- * @param {Event} event - The event arguments.
764
- */
765
- Owl.prototype.onDragMove = function(event) {
766
- var minimum = null,
767
- maximum = null,
768
- pull = null,
769
- delta = this.difference(this._drag.pointer, this.pointer(event)),
770
- stage = this.difference(this._drag.stage.start, delta);
771
-
772
- if (!this.is('dragging')) {
773
- return;
774
- }
775
-
776
- event.preventDefault();
777
-
778
- if (this.settings.loop) {
779
- minimum = this.coordinates(this.minimum());
780
- maximum = this.coordinates(this.maximum() + 1) - minimum;
781
- stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;
782
- } else {
783
- minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
784
- maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
785
- pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
786
- stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
787
- }
788
-
789
- this._drag.stage.current = stage;
790
-
791
- this.animate(stage.x);
792
- };
793
-
794
- /**
795
- * Handles the `touchend` and `mouseup` events.
796
- * @todo #261
797
- * @todo Threshold for click event
798
- * @protected
799
- * @param {Event} event - The event arguments.
800
- */
801
- Owl.prototype.onDragEnd = function(event) {
802
- var delta = this.difference(this._drag.pointer, this.pointer(event)),
803
- stage = this._drag.stage.current,
804
- direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';
805
-
806
- $(document).off('.owl.core');
807
-
808
- this.$element.removeClass(this.options.grabClass);
809
-
810
- if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
811
- this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
812
- this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
813
- this.invalidate('position');
814
- this.update();
815
-
816
- this._drag.direction = direction;
817
-
818
- if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
819
- this._drag.target.one('click.owl.core', function() { return false; });
820
- }
821
- }
822
-
823
- if (!this.is('dragging')) {
824
- return;
825
- }
826
-
827
- this.leave('dragging');
828
- this.trigger('dragged');
829
- };
830
-
831
- /**
832
- * Gets absolute position of the closest item for a coordinate.
833
- * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
834
- * @protected
835
- * @param {Number} coordinate - The coordinate in pixel.
836
- * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
837
- * @return {Number} - The absolute position of the closest item.
838
- */
839
- Owl.prototype.closest = function(coordinate, direction) {
840
- var position = -1,
841
- pull = 30,
842
- width = this.width(),
843
- coordinates = this.coordinates();
844
-
845
- if (!this.settings.freeDrag) {
846
- // check closest item
847
- $.each(coordinates, $.proxy(function(index, value) {
848
- // on a left pull, check on current index
849
- if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
850
- position = index;
851
- // on a right pull, check on previous index
852
- // to do so, subtract width from value and set position = index + 1
853
- } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
854
- position = index + 1;
855
- } else if (this.op(coordinate, '<', value)
856
- && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
857
- position = direction === 'left' ? index + 1 : index;
858
- }
859
- return position === -1;
860
- }, this));
861
- }
862
-
863
- if (!this.settings.loop) {
864
- // non loop boundries
865
- if (this.op(coordinate, '>', coordinates[this.minimum()])) {
866
- position = coordinate = this.minimum();
867
- } else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
868
- position = coordinate = this.maximum();
869
- }
870
- }
871
-
872
- return position;
873
- };
874
-
875
- /**
876
- * Animates the stage.
877
- * @todo #270
878
- * @public
879
- * @param {Number} coordinate - The coordinate in pixels.
880
- */
881
- Owl.prototype.animate = function(coordinate) {
882
- var animate = this.speed() > 0;
883
-
884
- this.is('animating') && this.onTransitionEnd();
885
-
886
- if (animate) {
887
- this.enter('animating');
888
- this.trigger('translate');
889
- }
890
-
891
- if ($.support.transform3d && $.support.transition) {
892
- this.$stage.css({
893
- transform: 'translate3d(' + coordinate + 'px,0px,0px)',
894
- transition: (this.speed() / 1000) + 's'
895
- });
896
- } else if (animate) {
897
- this.$stage.animate({
898
- left: coordinate + 'px'
899
- }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
900
- } else {
901
- this.$stage.css({
902
- left: coordinate + 'px'
903
- });
904
- }
905
- };
906
-
907
- /**
908
- * Checks whether the carousel is in a specific state or not.
909
- * @param {String} state - The state to check.
910
- * @returns {Boolean} - The flag which indicates if the carousel is busy.
911
- */
912
- Owl.prototype.is = function(state) {
913
- return this._states.current[state] && this._states.current[state] > 0;
914
- };
915
-
916
- /**
917
- * Sets the absolute position of the current item.
918
- * @public
919
- * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
920
- * @returns {Number} - The absolute position of the current item.
921
- */
922
- Owl.prototype.current = function(position) {
923
- if (position === undefined) {
924
- return this._current;
925
- }
926
-
927
- if (this._items.length === 0) {
928
- return undefined;
929
- }
930
-
931
- position = this.normalize(position);
932
-
933
- if (this._current !== position) {
934
- var event = this.trigger('change', { property: { name: 'position', value: position } });
935
-
936
- if (event.data !== undefined) {
937
- position = this.normalize(event.data);
938
- }
939
-
940
- this._current = position;
941
-
942
- this.invalidate('position');
943
-
944
- this.trigger('changed', { property: { name: 'position', value: this._current } });
945
- }
946
-
947
- return this._current;
948
- };
949
-
950
- /**
951
- * Invalidates the given part of the update routine.
952
- * @param {String} [part] - The part to invalidate.
953
- * @returns {Array.<String>} - The invalidated parts.
954
- */
955
- Owl.prototype.invalidate = function(part) {
956
- if ($.type(part) === 'string') {
957
- this._invalidated[part] = true;
958
- this.is('valid') && this.leave('valid');
959
- }
960
- return $.map(this._invalidated, function(v, i) { return i });
961
- };
962
-
963
- /**
964
- * Resets the absolute position of the current item.
965
- * @public
966
- * @param {Number} position - The absolute position of the new item.
967
- */
968
- Owl.prototype.reset = function(position) {
969
- position = this.normalize(position);
970
-
971
- if (position === undefined) {
972
- return;
973
- }
974
-
975
- this._speed = 0;
976
- this._current = position;
977
-
978
- this.suppress([ 'translate', 'translated' ]);
979
-
980
- this.animate(this.coordinates(position));
981
-
982
- this.release([ 'translate', 'translated' ]);
983
- };
984
-
985
- /**
986
- * Normalizes an absolute or a relative position of an item.
987
- * @public
988
- * @param {Number} position - The absolute or relative position to normalize.
989
- * @param {Boolean} [relative=false] - Whether the given position is relative or not.
990
- * @returns {Number} - The normalized position.
991
- */
992
- Owl.prototype.normalize = function(position, relative) {
993
- var n = this._items.length,
994
- m = relative ? 0 : this._clones.length;
995
-
996
- if (!this.isNumeric(position) || n < 1) {
997
- position = undefined;
998
- } else if (position < 0 || position >= n + m) {
999
- position = ((position - m / 2) % n + n) % n + m / 2;
1000
- }
1001
-
1002
- return position;
1003
- };
1004
-
1005
- /**
1006
- * Converts an absolute position of an item into a relative one.
1007
- * @public
1008
- * @param {Number} position - The absolute position to convert.
1009
- * @returns {Number} - The converted position.
1010
- */
1011
- Owl.prototype.relative = function(position) {
1012
- position -= this._clones.length / 2;
1013
- return this.normalize(position, true);
1014
- };
1015
-
1016
- /**
1017
- * Gets the maximum position for the current item.
1018
- * @public
1019
- * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
1020
- * @returns {Number}
1021
- */
1022
- Owl.prototype.maximum = function(relative) {
1023
- var settings = this.settings,
1024
- maximum = this._coordinates.length,
1025
- boundary = Math.abs(this._coordinates[maximum - 1]) - this._width,
1026
- i = -1, j;
1027
-
1028
- if (settings.loop) {
1029
- maximum = this._clones.length / 2 + this._items.length - 1;
1030
- } else if (settings.autoWidth || settings.merge) {
1031
- // binary search
1032
- while (maximum - i > 1) {
1033
- Math.abs(this._coordinates[j = maximum + i >> 1]) < boundary
1034
- ? i = j : maximum = j;
1035
- }
1036
- } else if (settings.center) {
1037
- maximum = this._items.length - 1;
1038
- } else {
1039
- maximum = this._items.length - settings.items;
1040
- }
1041
-
1042
- if (relative) {
1043
- maximum -= this._clones.length / 2;
1044
- }
1045
-
1046
- return Math.max(maximum, 0);
1047
- };
1048
-
1049
- /**
1050
- * Gets the minimum position for the current item.
1051
- * @public
1052
- * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
1053
- * @returns {Number}
1054
- */
1055
- Owl.prototype.minimum = function(relative) {
1056
- return relative ? 0 : this._clones.length / 2;
1057
- };
1058
-
1059
- /**
1060
- * Gets an item at the specified relative position.
1061
- * @public
1062
- * @param {Number} [position] - The relative position of the item.
1063
- * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
1064
- */
1065
- Owl.prototype.items = function(position) {
1066
- if (position === undefined) {
1067
- return this._items.slice();
1068
- }
1069
-
1070
- position = this.normalize(position, true);
1071
- return this._items[position];
1072
- };
1073
-
1074
- /**
1075
- * Gets an item at the specified relative position.
1076
- * @public
1077
- * @param {Number} [position] - The relative position of the item.
1078
- * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
1079
- */
1080
- Owl.prototype.mergers = function(position) {
1081
- if (position === undefined) {
1082
- return this._mergers.slice();
1083
- }
1084
-
1085
- position = this.normalize(position, true);
1086
- return this._mergers[position];
1087
- };
1088
-
1089
- /**
1090
- * Gets the absolute positions of clones for an item.
1091
- * @public
1092
- * @param {Number} [position] - The relative position of the item.
1093
- * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
1094
- */
1095
- Owl.prototype.clones = function(position) {
1096
- var odd = this._clones.length / 2,
1097
- even = odd + this._items.length,
1098
- map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 };
1099
-
1100
- if (position === undefined) {
1101
- return $.map(this._clones, function(v, i) { return map(i) });
1102
- }
1103
-
1104
- return $.map(this._clones, function(v, i) { return v === position ? map(i) : null });
1105
- };
1106
-
1107
- /**
1108
- * Sets the current animation speed.
1109
- * @public
1110
- * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
1111
- * @returns {Number} - The current animation speed in milliseconds.
1112
- */
1113
- Owl.prototype.speed = function(speed) {
1114
- if (speed !== undefined) {
1115
- this._speed = speed;
1116
- }
1117
-
1118
- return this._speed;
1119
- };
1120
-
1121
- /**
1122
- * Gets the coordinate of an item.
1123
- * @todo The name of this method is missleanding.
1124
- * @public
1125
- * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
1126
- * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
1127
- */
1128
- Owl.prototype.coordinates = function(position) {
1129
- var multiplier = 1,
1130
- newPosition = position - 1,
1131
- coordinate;
1132
-
1133
- if (position === undefined) {
1134
- return $.map(this._coordinates, $.proxy(function(coordinate, index) {
1135
- return this.coordinates(index);
1136
- }, this));
1137
- }
1138
-
1139
- if (this.settings.center) {
1140
- if (this.settings.rtl) {
1141
- multiplier = -1;
1142
- newPosition = position + 1;
1143
- }
1144
-
1145
- coordinate = this._coordinates[position];
1146
- coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
1147
- } else {
1148
- coordinate = this._coordinates[newPosition] || 0;
1149
- }
1150
-
1151
- coordinate = Math.ceil(coordinate);
1152
-
1153
- return coordinate;
1154
- };
1155
-
1156
- /**
1157
- * Calculates the speed for a translation.
1158
- * @protected
1159
- * @param {Number} from - The absolute position of the start item.
1160
- * @param {Number} to - The absolute position of the target item.
1161
- * @param {Number} [factor=undefined] - The time factor in milliseconds.
1162
- * @returns {Number} - The time in milliseconds for the translation.
1163
- */
1164
- Owl.prototype.duration = function(from, to, factor) {
1165
- if (factor === 0) {
1166
- return 0;
1167
- }
1168
-
1169
- return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));
1170
- };
1171
-
1172
- /**
1173
- * Slides to the specified item.
1174
- * @public
1175
- * @param {Number} position - The position of the item.
1176
- * @param {Number} [speed] - The time in milliseconds for the transition.
1177
- */
1178
- Owl.prototype.to = function(position, speed) {
1179
- var current = this.current(),
1180
- revert = null,
1181
- distance = position - this.relative(current),
1182
- direction = (distance > 0) - (distance < 0),
1183
- items = this._items.length,
1184
- minimum = this.minimum(),
1185
- maximum = this.maximum();
1186
-
1187
- if (this.settings.loop) {
1188
- if (!this.settings.rewind && Math.abs(distance) > items / 2) {
1189
- distance += direction * -1 * items;
1190
- }
1191
-
1192
- position = current + distance;
1193
- revert = ((position - minimum) % items + items) % items + minimum;
1194
-
1195
- if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
1196
- current = revert - distance;
1197
- position = revert;
1198
- this.reset(current);
1199
- }
1200
- } else if (this.settings.rewind) {
1201
- maximum += 1;
1202
- position = (position % maximum + maximum) % maximum;
1203
- } else {
1204
- position = Math.max(minimum, Math.min(maximum, position));
1205
- }
1206
-
1207
- this.speed(this.duration(current, position, speed));
1208
- this.current(position);
1209
-
1210
- if (this.$element.is(':visible')) {
1211
- this.update();
1212
- }
1213
- };
1214
-
1215
- /**
1216
- * Slides to the next item.
1217
- * @public
1218
- * @param {Number} [speed] - The time in milliseconds for the transition.
1219
- */
1220
- Owl.prototype.next = function(speed) {
1221
- speed = speed || false;
1222
- this.to(this.relative(this.current()) + 1, speed);
1223
- };
1224
-
1225
- /**
1226
- * Slides to the previous item.
1227
- * @public
1228
- * @param {Number} [speed] - The time in milliseconds for the transition.
1229
- */
1230
- Owl.prototype.prev = function(speed) {
1231
- speed = speed || false;
1232
- this.to(this.relative(this.current()) - 1, speed);
1233
- };
1234
-
1235
- /**
1236
- * Handles the end of an animation.
1237
- * @protected
1238
- * @param {Event} event - The event arguments.
1239
- */
1240
- Owl.prototype.onTransitionEnd = function(event) {
1241
-
1242
- // if css2 animation then event object is undefined
1243
- if (event !== undefined) {
1244
- event.stopPropagation();
1245
-
1246
- // Catch only owl-stage transitionEnd event
1247
- if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
1248
- return false;
1249
- }
1250
- }
1251
-
1252
- this.leave('animating');
1253
- this.trigger('translated');
1254
- };
1255
-
1256
- /**
1257
- * Gets viewport width.
1258
- * @protected
1259
- * @return {Number} - The width in pixel.
1260
- */
1261
- Owl.prototype.viewport = function() {
1262
- var width;
1263
- if (this.options.responsiveBaseElement !== window) {
1264
- width = $(this.options.responsiveBaseElement).width();
1265
- } else if (window.innerWidth) {
1266
- width = window.innerWidth;
1267
- } else if (document.documentElement && document.documentElement.clientWidth) {
1268
- width = document.documentElement.clientWidth;
1269
- } else {
1270
- throw 'Can not detect viewport width.';
1271
- }
1272
- return width;
1273
- };
1274
-
1275
- /**
1276
- * Replaces the current content.
1277
- * @public
1278
- * @param {HTMLElement|jQuery|String} content - The new content.
1279
- */
1280
- Owl.prototype.replace = function(content) {
1281
- this.$stage.empty();
1282
- this._items = [];
1283
-
1284
- if (content) {
1285
- content = (content instanceof jQuery) ? content : $(content);
1286
- }
1287
-
1288
- if (this.settings.nestedItemSelector) {
1289
- content = content.find('.' + this.settings.nestedItemSelector);
1290
- }
1291
-
1292
- content.filter(function() {
1293
- return this.nodeType === 1;
1294
- }).each($.proxy(function(index, item) {
1295
- item = this.prepare(item);
1296
- this.$stage.append(item);
1297
- this._items.push(item);
1298
- this._mergers.push(item.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
1299
- }, this));
1300
-
1301
- this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);
1302
-
1303
- this.invalidate('items');
1304
- };
1305
-
1306
- /**
1307
- * Adds an item.
1308
- * @todo Use `item` instead of `content` for the event arguments.
1309
- * @public
1310
- * @param {HTMLElement|jQuery|String} content - The item content to add.
1311
- * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
1312
- */
1313
- Owl.prototype.add = function(content, position) {
1314
- var current = this.relative(this._current);
1315
-
1316
- position = position === undefined ? this._items.length : this.normalize(position, true);
1317
- content = content instanceof jQuery ? content : $(content);
1318
-
1319
- this.trigger('add', { content: content, position: position });
1320
-
1321
- content = this.prepare(content);
1322
-
1323
- if (this._items.length === 0 || position === this._items.length) {
1324
- this._items.length === 0 && this.$stage.append(content);
1325
- this._items.length !== 0 && this._items[position - 1].after(content);
1326
- this._items.push(content);
1327
- this._mergers.push(content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
1328
- } else {
1329
- this._items[position].before(content);
1330
- this._items.splice(position, 0, content);
1331
- this._mergers.splice(position, 0, content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
1332
- }
1333
-
1334
- this._items[current] && this.reset(this._items[current].index());
1335
-
1336
- this.invalidate('items');
1337
-
1338
- this.trigger('added', { content: content, position: position });
1339
- };
1340
-
1341
- /**
1342
- * Removes an item by its position.
1343
- * @todo Use `item` instead of `content` for the event arguments.
1344
- * @public
1345
- * @param {Number} position - The relative position of the item to remove.
1346
- */
1347
- Owl.prototype.remove = function(position) {
1348
- position = this.normalize(position, true);
1349
-
1350
- if (position === undefined) {
1351
- return;
1352
- }
1353
-
1354
- this.trigger('remove', { content: this._items[position], position: position });
1355
-
1356
- this._items[position].remove();
1357
- this._items.splice(position, 1);
1358
- this._mergers.splice(position, 1);
1359
-
1360
- this.invalidate('items');
1361
-
1362
- this.trigger('removed', { content: null, position: position });
1363
- };
1364
-
1365
- /**
1366
- * Preloads images with auto width.
1367
- * @todo Replace by a more generic approach
1368
- * @protected
1369
- */
1370
- Owl.prototype.preloadAutoWidthImages = function(images) {
1371
- images.each($.proxy(function(i, element) {
1372
- this.enter('pre-loading');
1373
- element = $(element);
1374
- $(new Image()).one('load', $.proxy(function(e) {
1375
- element.attr('src', e.target.src);
1376
- element.css('opacity', 1);
1377
- this.leave('pre-loading');
1378
- !this.is('pre-loading') && !this.is('initializing') && this.refresh();
1379
- }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
1380
- }, this));
1381
- };
1382
-
1383
- /**
1384
- * Destroys the carousel.
1385
- * @public
1386
- */
1387
- Owl.prototype.destroy = function() {
1388
-
1389
- this.$element.off('.owl.core');
1390
- this.$stage.off('.owl.core');
1391
- $(document).off('.owl.core');
1392
-
1393
- if (this.settings.responsive !== false) {
1394
- window.clearTimeout(this.resizeTimer);
1395
- this.off(window, 'resize', this._handlers.onThrottledResize);
1396
- }
1397
-
1398
- for (var i in this._plugins) {
1399
- this._plugins[i].destroy();
1400
- }
1401
-
1402
- this.$stage.children('.cloned').remove();
1403
-
1404
- this.$stage.unwrap();
1405
- this.$stage.children().contents().unwrap();
1406
- this.$stage.children().unwrap();
1407
-
1408
- this.$element
1409
- .removeClass(this.options.refreshClass)
1410
- .removeClass(this.options.loadingClass)
1411
- .removeClass(this.options.loadedClass)
1412
- .removeClass(this.options.rtlClass)
1413
- .removeClass(this.options.dragClass)
1414
- .removeClass(this.options.grabClass)
1415
- .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), ''))
1416
- .removeData('owl.carousel');
1417
- };
1418
-
1419
- /**
1420
- * Operators to calculate right-to-left and left-to-right.
1421
- * @protected
1422
- * @param {Number} [a] - The left side operand.
1423
- * @param {String} [o] - The operator.
1424
- * @param {Number} [b] - The right side operand.
1425
- */
1426
- Owl.prototype.op = function(a, o, b) {
1427
- var rtl = this.settings.rtl;
1428
- switch (o) {
1429
- case '<':
1430
- return rtl ? a > b : a < b;
1431
- case '>':
1432
- return rtl ? a < b : a > b;
1433
- case '>=':
1434
- return rtl ? a <= b : a >= b;
1435
- case '<=':
1436
- return rtl ? a >= b : a <= b;
1437
- default:
1438
- break;
1439
- }
1440
- };
1441
-
1442
- /**
1443
- * Attaches to an internal event.
1444
- * @protected
1445
- * @param {HTMLElement} element - The event source.
1446
- * @param {String} event - The event name.
1447
- * @param {Function} listener - The event handler to attach.
1448
- * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
1449
- */
1450
- Owl.prototype.on = function(element, event, listener, capture) {
1451
- if (element.addEventListener) {
1452
- element.addEventListener(event, listener, capture);
1453
- } else if (element.attachEvent) {
1454
- element.attachEvent('on' + event, listener);
1455
- }
1456
- };
1457
-
1458
- /**
1459
- * Detaches from an internal event.
1460
- * @protected
1461
- * @param {HTMLElement} element - The event source.
1462
- * @param {String} event - The event name.
1463
- * @param {Function} listener - The attached event handler to detach.
1464
- * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
1465
- */
1466
- Owl.prototype.off = function(element, event, listener, capture) {
1467
- if (element.removeEventListener) {
1468
- element.removeEventListener(event, listener, capture);
1469
- } else if (element.detachEvent) {
1470
- element.detachEvent('on' + event, listener);
1471
- }
1472
- };
1473
-
1474
- /**
1475
- * Triggers a public event.
1476
- * @todo Remove `status`, `relatedTarget` should be used instead.
1477
- * @protected
1478
- * @param {String} name - The event name.
1479
- * @param {*} [data=null] - The event data.
1480
- * @param {String} [namespace=carousel] - The event namespace.
1481
- * @param {String} [state] - The state which is associated with the event.
1482
- * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
1483
- * @returns {Event} - The event arguments.
1484
- */
1485
- Owl.prototype.trigger = function(name, data, namespace, state, enter) {
1486
- var status = {
1487
- item: { count: this._items.length, index: this.current() }
1488
- }, handler = $.camelCase(
1489
- $.grep([ 'on', name, namespace ], function(v) { return v })
1490
- .join('-').toLowerCase()
1491
- ), event = $.Event(
1492
- [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),
1493
- $.extend({ relatedTarget: this }, status, data)
1494
- );
1495
-
1496
- if (!this._supress[name]) {
1497
- $.each(this._plugins, function(name, plugin) {
1498
- if (plugin.onTrigger) {
1499
- plugin.onTrigger(event);
1500
- }
1501
- });
1502
-
1503
- this.register({ type: Owl.Type.Event, name: name });
1504
- this.$element.trigger(event);
1505
-
1506
- if (this.settings && typeof this.settings[handler] === 'function') {
1507
- this.settings[handler].call(this, event);
1508
- }
1509
- }
1510
-
1511
- return event;
1512
- };
1513
-
1514
- /**
1515
- * Enters a state.
1516
- * @param name - The state name.
1517
- */
1518
- Owl.prototype.enter = function(name) {
1519
- $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
1520
- if (this._states.current[name] === undefined) {
1521
- this._states.current[name] = 0;
1522
- }
1523
-
1524
- this._states.current[name]++;
1525
- }, this));
1526
- };
1527
-
1528
- /**
1529
- * Leaves a state.
1530
- * @param name - The state name.
1531
- */
1532
- Owl.prototype.leave = function(name) {
1533
- $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
1534
- this._states.current[name]--;
1535
- }, this));
1536
- };
1537
-
1538
- /**
1539
- * Registers an event or state.
1540
- * @public
1541
- * @param {Object} object - The event or state to register.
1542
- */
1543
- Owl.prototype.register = function(object) {
1544
- if (object.type === Owl.Type.Event) {
1545
- if (!$.event.special[object.name]) {
1546
- $.event.special[object.name] = {};
1547
- }
1548
-
1549
- if (!$.event.special[object.name].owl) {
1550
- var _default = $.event.special[object.name]._default;
1551
- $.event.special[object.name]._default = function(e) {
1552
- if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
1553
- return _default.apply(this, arguments);
1554
- }
1555
- return e.namespace && e.namespace.indexOf('owl') > -1;
1556
- };
1557
- $.event.special[object.name].owl = true;
1558
- }
1559
- } else if (object.type === Owl.Type.State) {
1560
- if (!this._states.tags[object.name]) {
1561
- this._states.tags[object.name] = object.tags;
1562
- } else {
1563
- this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
1564
- }
1565
-
1566
- this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {
1567
- return $.inArray(tag, this._states.tags[object.name]) === i;
1568
- }, this));
1569
- }
1570
- };
1571
-
1572
- /**
1573
- * Suppresses events.
1574
- * @protected
1575
- * @param {Array.<String>} events - The events to suppress.
1576
- */
1577
- Owl.prototype.suppress = function(events) {
1578
- $.each(events, $.proxy(function(index, event) {
1579
- this._supress[event] = true;
1580
- }, this));
1581
- };
1582
-
1583
- /**
1584
- * Releases suppressed events.
1585
- * @protected
1586
- * @param {Array.<String>} events - The events to release.
1587
- */
1588
- Owl.prototype.release = function(events) {
1589
- $.each(events, $.proxy(function(index, event) {
1590
- delete this._supress[event];
1591
- }, this));
1592
- };
1593
-
1594
- /**
1595
- * Gets unified pointer coordinates from event.
1596
- * @todo #261
1597
- * @protected
1598
- * @param {Event} - The `mousedown` or `touchstart` event.
1599
- * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
1600
- */
1601
- Owl.prototype.pointer = function(event) {
1602
- var result = { x: null, y: null };
1603
-
1604
- event = event.originalEvent || event || window.event;
1605
-
1606
- event = event.touches && event.touches.length ?
1607
- event.touches[0] : event.changedTouches && event.changedTouches.length ?
1608
- event.changedTouches[0] : event;
1609
-
1610
- if (event.pageX) {
1611
- result.x = event.pageX;
1612
- result.y = event.pageY;
1613
- } else {
1614
- result.x = event.clientX;
1615
- result.y = event.clientY;
1616
- }
1617
-
1618
- return result;
1619
- };
1620
-
1621
- /**
1622
- * Determines if the input is a Number or something that can be coerced to a Number
1623
- * @protected
1624
- * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
1625
- * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
1626
- */
1627
- Owl.prototype.isNumeric = function(number) {
1628
- return !isNaN(parseFloat(number));
1629
- };
1630
-
1631
- /**
1632
- * Gets the difference of two vectors.
1633
- * @todo #261
1634
- * @protected
1635
- * @param {Object} - The first vector.
1636
- * @param {Object} - The second vector.
1637
- * @returns {Object} - The difference.
1638
- */
1639
- Owl.prototype.difference = function(first, second) {
1640
- return {
1641
- x: first.x - second.x,
1642
- y: first.y - second.y
1643
- };
1644
- };
1645
-
1646
- /**
1647
- * The jQuery Plugin for the Owl Carousel
1648
- * @todo Navigation plugin `next` and `prev`
1649
- * @public
1650
- */
1651
- $.fn.owlCarousel = function(option) {
1652
- var args = Array.prototype.slice.call(arguments, 1);
1653
-
1654
- return this.each(function() {
1655
- var $this = $(this),
1656
- data = $this.data('owl.carousel');
1657
-
1658
- if (!data) {
1659
- data = new Owl(this, typeof option == 'object' && option);
1660
- $this.data('owl.carousel', data);
1661
-
1662
- $.each([
1663
- 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'
1664
- ], function(i, event) {
1665
- data.register({ type: Owl.Type.Event, name: event });
1666
- data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {
1667
- if (e.namespace && e.relatedTarget !== this) {
1668
- this.suppress([ event ]);
1669
- data[event].apply(this, [].slice.call(arguments, 1));
1670
- this.release([ event ]);
1671
- }
1672
- }, data));
1673
- });
1674
- }
1675
-
1676
- if (typeof option == 'string' && option.charAt(0) !== '_') {
1677
- data[option].apply(data, args);
1678
- }
1679
- });
1680
- };
1681
-
1682
- /**
1683
- * The constructor for the jQuery Plugin
1684
- * @public
1685
- */
1686
- $.fn.owlCarousel.Constructor = Owl;
1687
-
1688
- })(window.Zepto || window.jQuery, window, document);
1689
-
1690
- /**
1691
- * AutoRefresh Plugin
1692
- * @version 2.1.0
1693
- * @author Artus Kolanowski
1694
- * @author David Deutsch
1695
- * @license The MIT License (MIT)
1696
- */
1697
- ;(function($, window, document, undefined) {
1698
-
1699
- /**
1700
- * Creates the auto refresh plugin.
1701
- * @class The Auto Refresh Plugin
1702
- * @param {Owl} carousel - The Owl Carousel
1703
- */
1704
- var AutoRefresh = function(carousel) {
1705
- /**
1706
- * Reference to the core.
1707
- * @protected
1708
- * @type {Owl}
1709
- */
1710
- this._core = carousel;
1711
-
1712
- /**
1713
- * Refresh interval.
1714
- * @protected
1715
- * @type {number}
1716
- */
1717
- this._interval = null;
1718
-
1719
- /**
1720
- * Whether the element is currently visible or not.
1721
- * @protected
1722
- * @type {Boolean}
1723
- */
1724
- this._visible = null;
1725
-
1726
- /**
1727
- * All event handlers.
1728
- * @protected
1729
- * @type {Object}
1730
- */
1731
- this._handlers = {
1732
- 'initialized.owl.carousel': $.proxy(function(e) {
1733
- if (e.namespace && this._core.settings.autoRefresh) {
1734
- this.watch();
1735
- }
1736
- }, this)
1737
- };
1738
-
1739
- // set default options
1740
- this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);
1741
-
1742
- // register event handlers
1743
- this._core.$element.on(this._handlers);
1744
- };
1745
-
1746
- /**
1747
- * Default options.
1748
- * @public
1749
- */
1750
- AutoRefresh.Defaults = {
1751
- autoRefresh: true,
1752
- autoRefreshInterval: 500
1753
- };
1754
-
1755
- /**
1756
- * Watches the element.
1757
- */
1758
- AutoRefresh.prototype.watch = function() {
1759
- if (this._interval) {
1760
- return;
1761
- }
1762
-
1763
- this._visible = this._core.$element.is(':visible');
1764
- this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
1765
- };
1766
-
1767
- /**
1768
- * Refreshes the element.
1769
- */
1770
- AutoRefresh.prototype.refresh = function() {
1771
- if (this._core.$element.is(':visible') === this._visible) {
1772
- return;
1773
- }
1774
-
1775
- this._visible = !this._visible;
1776
-
1777
- this._core.$element.toggleClass('owl-hidden', !this._visible);
1778
-
1779
- this._visible && (this._core.invalidate('width') && this._core.refresh());
1780
- };
1781
-
1782
- /**
1783
- * Destroys the plugin.
1784
- */
1785
- AutoRefresh.prototype.destroy = function() {
1786
- var handler, property;
1787
-
1788
- window.clearInterval(this._interval);
1789
-
1790
- for (handler in this._handlers) {
1791
- this._core.$element.off(handler, this._handlers[handler]);
1792
- }
1793
- for (property in Object.getOwnPropertyNames(this)) {
1794
- typeof this[property] != 'function' && (this[property] = null);
1795
- }
1796
- };
1797
-
1798
- $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
1799
-
1800
- })(window.Zepto || window.jQuery, window, document);
1801
-
1802
- /**
1803
- * Lazy Plugin
1804
- * @version 2.1.0
1805
- * @author Bartosz Wojciechowski
1806
- * @author David Deutsch
1807
- * @license The MIT License (MIT)
1808
- */
1809
- ;(function($, window, document, undefined) {
1810
-
1811
- /**
1812
- * Creates the lazy plugin.
1813
- * @class The Lazy Plugin
1814
- * @param {Owl} carousel - The Owl Carousel
1815
- */
1816
- var Lazy = function(carousel) {
1817
-
1818
- /**
1819
- * Reference to the core.
1820
- * @protected
1821
- * @type {Owl}
1822
- */
1823
- this._core = carousel;
1824
-
1825
- /**
1826
- * Already loaded items.
1827
- * @protected
1828
- * @type {Array.<jQuery>}
1829
- */
1830
- this._loaded = [];
1831
-
1832
- /**
1833
- * Event handlers.
1834
- * @protected
1835
- * @type {Object}
1836
- */
1837
- this._handlers = {
1838
- 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {
1839
- if (!e.namespace) {
1840
- return;
1841
- }
1842
-
1843
- if (!this._core.settings || !this._core.settings.lazyLoad) {
1844
- return;
1845
- }
1846
-
1847
- if ((e.property && e.property.name == 'position') || e.type == 'initialized') {
1848
- var settings = this._core.settings,
1849
- n = (settings.center && Math.ceil(settings.items / 2) || settings.items),
1850
- i = ((settings.center && n * -1) || 0),
1851
- position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
1852
- clones = this._core.clones().length,
1853
- load = $.proxy(function(i, v) { this.load(v) }, this);
1854
-
1855
- while (i++ < n) {
1856
- this.load(clones / 2 + this._core.relative(position));
1857
- clones && $.each(this._core.clones(this._core.relative(position)), load);
1858
- position++;
1859
- }
1860
- }
1861
- }, this)
1862
- };
1863
-
1864
- // set the default options
1865
- this._core.options = $.extend({}, Lazy.Defaults, this._core.options);
1866
-
1867
- // register event handler
1868
- this._core.$element.on(this._handlers);
1869
- };
1870
-
1871
- /**
1872
- * Default options.
1873
- * @public
1874
- */
1875
- Lazy.Defaults = {
1876
- lazyLoad: false
1877
- };
1878
-
1879
- /**
1880
- * Loads all resources of an item at the specified position.
1881
- * @param {Number} position - The absolute position of the item.
1882
- * @protected
1883
- */
1884
- Lazy.prototype.load = function(position) {
1885
- var $item = this._core.$stage.children().eq(position),
1886
- $elements = $item && $item.find('.owl-lazy');
1887
-
1888
- if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
1889
- return;
1890
- }
1891
-
1892
- $elements.each($.proxy(function(index, element) {
1893
- var $element = $(element), image,
1894
- url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src');
1895
-
1896
- this._core.trigger('load', { element: $element, url: url }, 'lazy');
1897
-
1898
- if ($element.is('img')) {
1899
- $element.one('load.owl.lazy', $.proxy(function() {
1900
- $element.css('opacity', 1);
1901
- this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
1902
- }, this)).attr('src', url);
1903
- } else {
1904
- image = new Image();
1905
- image.onload = $.proxy(function() {
1906
- $element.css({
1907
- 'background-image': 'url(' + url + ')',
1908
- 'opacity': '1'
1909
- });
1910
- this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
1911
- }, this);
1912
- image.src = url;
1913
- }
1914
- }, this));
1915
-
1916
- this._loaded.push($item.get(0));
1917
- };
1918
-
1919
- /**
1920
- * Destroys the plugin.
1921
- * @public
1922
- */
1923
- Lazy.prototype.destroy = function() {
1924
- var handler, property;
1925
-
1926
- for (handler in this.handlers) {
1927
- this._core.$element.off(handler, this.handlers[handler]);
1928
- }
1929
- for (property in Object.getOwnPropertyNames(this)) {
1930
- typeof this[property] != 'function' && (this[property] = null);
1931
- }
1932
- };
1933
-
1934
- $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
1935
-
1936
- })(window.Zepto || window.jQuery, window, document);
1937
-
1938
- /**
1939
- * AutoHeight Plugin
1940
- * @version 2.1.0
1941
- * @author Bartosz Wojciechowski
1942
- * @author David Deutsch
1943
- * @license The MIT License (MIT)
1944
- */
1945
- ;(function($, window, document, undefined) {
1946
-
1947
- /**
1948
- * Creates the auto height plugin.
1949
- * @class The Auto Height Plugin
1950
- * @param {Owl} carousel - The Owl Carousel
1951
- */
1952
- var AutoHeight = function(carousel) {
1953
- /**
1954
- * Reference to the core.
1955
- * @protected
1956
- * @type {Owl}
1957
- */
1958
- this._core = carousel;
1959
-
1960
- /**
1961
- * All event handlers.
1962
- * @protected
1963
- * @type {Object}
1964
- */
1965
- this._handlers = {
1966
- 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {
1967
- if (e.namespace && this._core.settings.autoHeight) {
1968
- this.update();
1969
- }
1970
- }, this),
1971
- 'changed.owl.carousel': $.proxy(function(e) {
1972
- if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position'){
1973
- this.update();
1974
- }
1975
- }, this),
1976
- 'loaded.owl.lazy': $.proxy(function(e) {
1977
- if (e.namespace && this._core.settings.autoHeight
1978
- && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
1979
- this.update();
1980
- }
1981
- }, this)
1982
- };
1983
-
1984
- // set default options
1985
- this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);
1986
-
1987
- // register event handlers
1988
- this._core.$element.on(this._handlers);
1989
- };
1990
-
1991
- /**
1992
- * Default options.
1993
- * @public
1994
- */
1995
- AutoHeight.Defaults = {
1996
- autoHeight: false,
1997
- autoHeightClass: 'owl-height'
1998
- };
1999
-
2000
- /**
2001
- * Updates the view.
2002
- */
2003
- AutoHeight.prototype.update = function() {
2004
- var start = this._core._current,
2005
- end = start + this._core.settings.items,
2006
- visible = this._core.$stage.children().toArray().slice(start, end),
2007
- heights = [],
2008
- maxheight = 0;
2009
-
2010
- $.each(visible, function(index, item) {
2011
- heights.push($(item).height());
2012
- });
2013
-
2014
- maxheight = Math.max.apply(null, heights);
2015
-
2016
- this._core.$stage.parent()
2017
- .height(maxheight)
2018
- .addClass(this._core.settings.autoHeightClass);
2019
- };
2020
-
2021
- AutoHeight.prototype.destroy = function() {
2022
- var handler, property;
2023
-
2024
- for (handler in this._handlers) {
2025
- this._core.$element.off(handler, this._handlers[handler]);
2026
- }
2027
- for (property in Object.getOwnPropertyNames(this)) {
2028
- typeof this[property] != 'function' && (this[property] = null);
2029
- }
2030
- };
2031
-
2032
- $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
2033
-
2034
- })(window.Zepto || window.jQuery, window, document);
2035
-
2036
- /**
2037
- * Video Plugin
2038
- * @version 2.1.0
2039
- * @author Bartosz Wojciechowski
2040
- * @author David Deutsch
2041
- * @license The MIT License (MIT)
2042
- */
2043
- ;(function($, window, document, undefined) {
2044
-
2045
- /**
2046
- * Creates the video plugin.
2047
- * @class The Video Plugin
2048
- * @param {Owl} carousel - The Owl Carousel
2049
- */
2050
- var Video = function(carousel) {
2051
- /**
2052
- * Reference to the core.
2053
- * @protected
2054
- * @type {Owl}
2055
- */
2056
- this._core = carousel;
2057
-
2058
- /**
2059
- * Cache all video URLs.
2060
- * @protected
2061
- * @type {Object}
2062
- */
2063
- this._videos = {};
2064
-
2065
- /**
2066
- * Current playing item.
2067
- * @protected
2068
- * @type {jQuery}
2069
- */
2070
- this._playing = null;
2071
-
2072
- /**
2073
- * All event handlers.
2074
- * @todo The cloned content removale is too late
2075
- * @protected
2076
- * @type {Object}
2077
- */
2078
- this._handlers = {
2079
- 'initialized.owl.carousel': $.proxy(function(e) {
2080
- if (e.namespace) {
2081
- this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });
2082
- }
2083
- }, this),
2084
- 'resize.owl.carousel': $.proxy(function(e) {
2085
- if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
2086
- e.preventDefault();
2087
- }
2088
- }, this),
2089
- 'refreshed.owl.carousel': $.proxy(function(e) {
2090
- if (e.namespace && this._core.is('resizing')) {
2091
- this._core.$stage.find('.cloned .owl-video-frame').remove();
2092
- }
2093
- }, this),
2094
- 'changed.owl.carousel': $.proxy(function(e) {
2095
- if (e.namespace && e.property.name === 'position' && this._playing) {
2096
- this.stop();
2097
- }
2098
- }, this),
2099
- 'prepared.owl.carousel': $.proxy(function(e) {
2100
- if (!e.namespace) {
2101
- return;
2102
- }
2103
-
2104
- var $element = $(e.content).find('.owl-video');
2105
-
2106
- if ($element.length) {
2107
- $element.css('display', 'none');
2108
- this.fetch($element, $(e.content));
2109
- }
2110
- }, this)
2111
- };
2112
-
2113
- // set default options
2114
- this._core.options = $.extend({}, Video.Defaults, this._core.options);
2115
-
2116
- // register event handlers
2117
- this._core.$element.on(this._handlers);
2118
-
2119
- this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {
2120
- this.play(e);
2121
- }, this));
2122
- };
2123
-
2124
- /**
2125
- * Default options.
2126
- * @public
2127
- */
2128
- Video.Defaults = {
2129
- video: false,
2130
- videoHeight: false,
2131
- videoWidth: false
2132
- };
2133
-
2134
- /**
2135
- * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
2136
- * @protected
2137
- * @param {jQuery} target - The target containing the video data.
2138
- * @param {jQuery} item - The item containing the video.
2139
- */
2140
- Video.prototype.fetch = function(target, item) {
2141
- var type = (function() {
2142
- if (target.attr('data-vimeo-id')) {
2143
- return 'vimeo';
2144
- } else if (target.attr('data-vzaar-id')) {
2145
- return 'vzaar'
2146
- } else {
2147
- return 'youtube';
2148
- }
2149
- })(),
2150
- id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
2151
- width = target.attr('data-width') || this._core.settings.videoWidth,
2152
- height = target.attr('data-height') || this._core.settings.videoHeight,
2153
- url = target.attr('href');
2154
-
2155
- if (url) {
2156
-
2157
- /*
2158
- Parses the id's out of the following urls (and probably more):
2159
- https://www.youtube.com/watch?v=:id
2160
- https://youtu.be/:id
2161
- https://vimeo.com/:id
2162
- https://vimeo.com/channels/:channel/:id
2163
- https://vimeo.com/groups/:group/videos/:id
2164
- https://app.vzaar.com/videos/:id
2165
-
2166
- Visual example: http://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
2167
- */
2168
-
2169
- id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
2170
-
2171
- if (id[3].indexOf('youtu') > -1) {
2172
- type = 'youtube';
2173
- } else if (id[3].indexOf('vimeo') > -1) {
2174
- type = 'vimeo';
2175
- } else if (id[3].indexOf('vzaar') > -1) {
2176
- type = 'vzaar';
2177
- } else {
2178
- throw new Error('Video URL not supported.');
2179
- }
2180
- id = id[6];
2181
- } else {
2182
- throw new Error('Missing video URL.');
2183
- }
2184
-
2185
- this._videos[url] = {
2186
- type: type,
2187
- id: id,
2188
- width: width,
2189
- height: height
2190
- };
2191
-
2192
- item.attr('data-video', url);
2193
-
2194
- this.thumbnail(target, this._videos[url]);
2195
- };
2196
-
2197
- /**
2198
- * Creates video thumbnail.
2199
- * @protected
2200
- * @param {jQuery} target - The target containing the video data.
2201
- * @param {Object} info - The video info object.
2202
- * @see `fetch`
2203
- */
2204
- Video.prototype.thumbnail = function(target, video) {
2205
- var tnLink,
2206
- icon,
2207
- path,
2208
- dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
2209
- customTn = target.find('img'),
2210
- srcType = 'src',
2211
- lazyClass = '',
2212
- settings = this._core.settings,
2213
- create = function(path) {
2214
- icon = '<div class="owl-video-play-icon"></div>';
2215
-
2216
- if (settings.lazyLoad) {
2217
- tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
2218
- } else {
2219
- tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
2220
- }
2221
- target.after(tnLink);
2222
- target.after(icon);
2223
- };
2224
-
2225
- // wrap video content into owl-video-wrapper div
2226
- target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');
2227
-
2228
- if (this._core.settings.lazyLoad) {
2229
- srcType = 'data-src';
2230
- lazyClass = 'owl-lazy';
2231
- }
2232
-
2233
- // custom thumbnail
2234
- if (customTn.length) {
2235
- create(customTn.attr(srcType));
2236
- customTn.remove();
2237
- return false;
2238
- }
2239
-
2240
- if (video.type === 'youtube') {
2241
- path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
2242
- create(path);
2243
- } else if (video.type === 'vimeo') {
2244
- $.ajax({
2245
- type: 'GET',
2246
- url: '//vimeo.com/api/v2/video/' + video.id + '.json',
2247
- jsonp: 'callback',
2248
- dataType: 'jsonp',
2249
- success: function(data) {
2250
- path = data[0].thumbnail_large;
2251
- create(path);
2252
- }
2253
- });
2254
- } else if (video.type === 'vzaar') {
2255
- $.ajax({
2256
- type: 'GET',
2257
- url: '//vzaar.com/api/videos/' + video.id + '.json',
2258
- jsonp: 'callback',
2259
- dataType: 'jsonp',
2260
- success: function(data) {
2261
- path = data.framegrab_url;
2262
- create(path);
2263
- }
2264
- });
2265
- }
2266
- };
2267
-
2268
- /**
2269
- * Stops the current video.
2270
- * @public
2271
- */
2272
- Video.prototype.stop = function() {
2273
- this._core.trigger('stop', null, 'video');
2274
- this._playing.find('.owl-video-frame').remove();
2275
- this._playing.removeClass('owl-video-playing');
2276
- this._playing = null;
2277
- this._core.leave('playing');
2278
- this._core.trigger('stopped', null, 'video');
2279
- };
2280
-
2281
- /**
2282
- * Starts the current video.
2283
- * @public
2284
- * @param {Event} event - The event arguments.
2285
- */
2286
- Video.prototype.play = function(event) {
2287
- var target = $(event.target),
2288
- item = target.closest('.' + this._core.settings.itemClass),
2289
- video = this._videos[item.attr('data-video')],
2290
- width = video.width || '100%',
2291
- height = video.height || this._core.$stage.height(),
2292
- html;
2293
-
2294
- if (this._playing) {
2295
- return;
2296
- }
2297
-
2298
- this._core.enter('playing');
2299
- this._core.trigger('play', null, 'video');
2300
-
2301
- item = this._core.items(this._core.relative(item.index()));
2302
-
2303
- this._core.reset(item.index());
2304
-
2305
- if (video.type === 'youtube') {
2306
- html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' +
2307
- video.id + '?autoplay=1&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
2308
- } else if (video.type === 'vimeo') {
2309
- html = '<iframe src="//player.vimeo.com/video/' + video.id +
2310
- '?autoplay=1" width="' + width + '" height="' + height +
2311
- '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
2312
- } else if (video.type === 'vzaar') {
2313
- html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width +
2314
- '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' +
2315
- 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
2316
- }
2317
-
2318
- $('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));
2319
-
2320
- this._playing = item.addClass('owl-video-playing');
2321
- };
2322
-
2323
- /**
2324
- * Checks whether an video is currently in full screen mode or not.
2325
- * @todo Bad style because looks like a readonly method but changes members.
2326
- * @protected
2327
- * @returns {Boolean}
2328
- */
2329
- Video.prototype.isInFullScreen = function() {
2330
- var element = document.fullscreenElement || document.mozFullScreenElement ||
2331
- document.webkitFullscreenElement;
2332
-
2333
- return element && $(element).parent().hasClass('owl-video-frame');
2334
- };
2335
-
2336
- /**
2337
- * Destroys the plugin.
2338
- */
2339
- Video.prototype.destroy = function() {
2340
- var handler, property;
2341
-
2342
- this._core.$element.off('click.owl.video');
2343
-
2344
- for (handler in this._handlers) {
2345
- this._core.$element.off(handler, this._handlers[handler]);
2346
- }
2347
- for (property in Object.getOwnPropertyNames(this)) {
2348
- typeof this[property] != 'function' && (this[property] = null);
2349
- }
2350
- };
2351
-
2352
- $.fn.owlCarousel.Constructor.Plugins.Video = Video;
2353
-
2354
- })(window.Zepto || window.jQuery, window, document);
2355
-
2356
- /**
2357
- * Animate Plugin
2358
- * @version 2.1.0
2359
- * @author Bartosz Wojciechowski
2360
- * @author David Deutsch
2361
- * @license The MIT License (MIT)
2362
- */
2363
- ;(function($, window, document, undefined) {
2364
-
2365
- /**
2366
- * Creates the animate plugin.
2367
- * @class The Navigation Plugin
2368
- * @param {Owl} scope - The Owl Carousel
2369
- */
2370
- var Animate = function(scope) {
2371
- this.core = scope;
2372
- this.core.options = $.extend({}, Animate.Defaults, this.core.options);
2373
- this.swapping = true;
2374
- this.previous = undefined;
2375
- this.next = undefined;
2376
-
2377
- this.handlers = {
2378
- 'change.owl.carousel': $.proxy(function(e) {
2379
- if (e.namespace && e.property.name == 'position') {
2380
- this.previous = this.core.current();
2381
- this.next = e.property.value;
2382
- }
2383
- }, this),
2384
- 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {
2385
- if (e.namespace) {
2386
- this.swapping = e.type == 'translated';
2387
- }
2388
- }, this),
2389
- 'translate.owl.carousel': $.proxy(function(e) {
2390
- if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
2391
- this.swap();
2392
- }
2393
- }, this)
2394
- };
2395
-
2396
- this.core.$element.on(this.handlers);
2397
- };
2398
-
2399
- /**
2400
- * Default options.
2401
- * @public
2402
- */
2403
- Animate.Defaults = {
2404
- animateOut: false,
2405
- animateIn: false
2406
- };
2407
-
2408
- /**
2409
- * Toggles the animation classes whenever an translations starts.
2410
- * @protected
2411
- * @returns {Boolean|undefined}
2412
- */
2413
- Animate.prototype.swap = function() {
2414
-
2415
- if (this.core.settings.items !== 1) {
2416
- return;
2417
- }
2418
-
2419
- if (!$.support.animation || !$.support.transition) {
2420
- return;
2421
- }
2422
-
2423
- this.core.speed(0);
2424
-
2425
- var left,
2426
- clear = $.proxy(this.clear, this),
2427
- previous = this.core.$stage.children().eq(this.previous),
2428
- next = this.core.$stage.children().eq(this.next),
2429
- incoming = this.core.settings.animateIn,
2430
- outgoing = this.core.settings.animateOut;
2431
-
2432
- if (this.core.current() === this.previous) {
2433
- return;
2434
- }
2435
-
2436
- if (outgoing) {
2437
- left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
2438
- previous.one($.support.animation.end, clear)
2439
- .css( { 'left': left + 'px' } )
2440
- .addClass('animated owl-animated-out')
2441
- .addClass(outgoing);
2442
- }
2443
-
2444
- if (incoming) {
2445
- next.one($.support.animation.end, clear)
2446
- .addClass('animated owl-animated-in')
2447
- .addClass(incoming);
2448
- }
2449
- };
2450
-
2451
- Animate.prototype.clear = function(e) {
2452
- $(e.target).css( { 'left': '' } )
2453
- .removeClass('animated owl-animated-out owl-animated-in')
2454
- .removeClass(this.core.settings.animateIn)
2455
- .removeClass(this.core.settings.animateOut);
2456
- this.core.onTransitionEnd();
2457
- };
2458
-
2459
- /**
2460
- * Destroys the plugin.
2461
- * @public
2462
- */
2463
- Animate.prototype.destroy = function() {
2464
- var handler, property;
2465
-
2466
- for (handler in this.handlers) {
2467
- this.core.$element.off(handler, this.handlers[handler]);
2468
- }
2469
- for (property in Object.getOwnPropertyNames(this)) {
2470
- typeof this[property] != 'function' && (this[property] = null);
2471
- }
2472
- };
2473
-
2474
- $.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
2475
-
2476
- })(window.Zepto || window.jQuery, window, document);
2477
-
2478
- /**
2479
- * Autoplay Plugin
2480
- * @version 2.1.0
2481
- * @author Bartosz Wojciechowski
2482
- * @author Artus Kolanowski
2483
- * @author David Deutsch
2484
- * @license The MIT License (MIT)
2485
- */
2486
- ;(function($, window, document, undefined) {
2487
-
2488
- /**
2489
- * Creates the autoplay plugin.
2490
- * @class The Autoplay Plugin
2491
- * @param {Owl} scope - The Owl Carousel
2492
- */
2493
- var Autoplay = function(carousel) {
2494
- /**
2495
- * Reference to the core.
2496
- * @protected
2497
- * @type {Owl}
2498
- */
2499
- this._core = carousel;
2500
-
2501
- /**
2502
- * The autoplay timeout.
2503
- * @type {Timeout}
2504
- */
2505
- this._timeout = null;
2506
-
2507
- /**
2508
- * Indicates whenever the autoplay is paused.
2509
- * @type {Boolean}
2510
- */
2511
- this._paused = false;
2512
-
2513
- /**
2514
- * All event handlers.
2515
- * @protected
2516
- * @type {Object}
2517
- */
2518
- this._handlers = {
2519
- 'changed.owl.carousel': $.proxy(function(e) {
2520
- if (e.namespace && e.property.name === 'settings') {
2521
- if (this._core.settings.autoplay) {
2522
- this.play();
2523
- } else {
2524
- this.stop();
2525
- }
2526
- } else if (e.namespace && e.property.name === 'position') {
2527
- //console.log('play?', e);
2528
- if (this._core.settings.autoplay) {
2529
- this._setAutoPlayInterval();
2530
- }
2531
- }
2532
- }, this),
2533
- 'initialized.owl.carousel': $.proxy(function(e) {
2534
- if (e.namespace && this._core.settings.autoplay) {
2535
- this.play();
2536
- }
2537
- }, this),
2538
- 'play.owl.autoplay': $.proxy(function(e, t, s) {
2539
- if (e.namespace) {
2540
- this.play(t, s);
2541
- }
2542
- }, this),
2543
- 'stop.owl.autoplay': $.proxy(function(e) {
2544
- if (e.namespace) {
2545
- this.stop();
2546
- }
2547
- }, this),
2548
- 'mouseover.owl.autoplay': $.proxy(function() {
2549
- if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2550
- this.pause();
2551
- }
2552
- }, this),
2553
- 'mouseleave.owl.autoplay': $.proxy(function() {
2554
- if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2555
- this.play();
2556
- }
2557
- }, this),
2558
- 'touchstart.owl.core': $.proxy(function() {
2559
- if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2560
- this.pause();
2561
- }
2562
- }, this),
2563
- 'touchend.owl.core': $.proxy(function() {
2564
- if (this._core.settings.autoplayHoverPause) {
2565
- this.play();
2566
- }
2567
- }, this)
2568
- };
2569
-
2570
- // register event handlers
2571
- this._core.$element.on(this._handlers);
2572
-
2573
- // set default options
2574
- this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
2575
- };
2576
-
2577
- /**
2578
- * Default options.
2579
- * @public
2580
- */
2581
- Autoplay.Defaults = {
2582
- autoplay: false,
2583
- autoplayTimeout: 5000,
2584
- autoplayHoverPause: false,
2585
- autoplaySpeed: false
2586
- };
2587
-
2588
- /**
2589
- * Starts the autoplay.
2590
- * @public
2591
- * @param {Number} [timeout] - The interval before the next animation starts.
2592
- * @param {Number} [speed] - The animation speed for the animations.
2593
- */
2594
- Autoplay.prototype.play = function(timeout, speed) {
2595
- this._paused = false;
2596
-
2597
- if (this._core.is('rotating')) {
2598
- return;
2599
- }
2600
-
2601
- this._core.enter('rotating');
2602
-
2603
- this._setAutoPlayInterval();
2604
- };
2605
-
2606
- /**
2607
- * Gets a new timeout
2608
- * @private
2609
- * @param {Number} [timeout] - The interval before the next animation starts.
2610
- * @param {Number} [speed] - The animation speed for the animations.
2611
- * @return {Timeout}
2612
- */
2613
- Autoplay.prototype._getNextTimeout = function(timeout, speed) {
2614
- if ( this._timeout ) {
2615
- window.clearTimeout(this._timeout);
2616
- }
2617
- return window.setTimeout($.proxy(function() {
2618
- if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
2619
- return;
2620
- }
2621
- this._core.next(speed || this._core.settings.autoplaySpeed);
2622
- }, this), timeout || this._core.settings.autoplayTimeout);
2623
- };
2624
-
2625
- /**
2626
- * Sets autoplay in motion.
2627
- * @private
2628
- */
2629
- Autoplay.prototype._setAutoPlayInterval = function() {
2630
- this._timeout = this._getNextTimeout();
2631
- };
2632
-
2633
- /**
2634
- * Stops the autoplay.
2635
- * @public
2636
- */
2637
- Autoplay.prototype.stop = function() {
2638
- if (!this._core.is('rotating')) {
2639
- return;
2640
- }
2641
-
2642
- window.clearTimeout(this._timeout);
2643
- this._core.leave('rotating');
2644
- };
2645
-
2646
- /**
2647
- * Stops the autoplay.
2648
- * @public
2649
- */
2650
- Autoplay.prototype.pause = function() {
2651
- if (!this._core.is('rotating')) {
2652
- return;
2653
- }
2654
-
2655
- this._paused = true;
2656
- };
2657
-
2658
- /**
2659
- * Destroys the plugin.
2660
- */
2661
- Autoplay.prototype.destroy = function() {
2662
- var handler, property;
2663
-
2664
- this.stop();
2665
-
2666
- for (handler in this._handlers) {
2667
- this._core.$element.off(handler, this._handlers[handler]);
2668
- }
2669
- for (property in Object.getOwnPropertyNames(this)) {
2670
- typeof this[property] != 'function' && (this[property] = null);
2671
- }
2672
- };
2673
-
2674
- $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
2675
-
2676
- })(window.Zepto || window.jQuery, window, document);
2677
-
2678
- /**
2679
- * Navigation Plugin
2680
- * @version 2.1.0
2681
- * @author Artus Kolanowski
2682
- * @author David Deutsch
2683
- * @license The MIT License (MIT)
2684
- */
2685
- ;(function($, window, document, undefined) {
2686
- 'use strict';
2687
-
2688
- /**
2689
- * Creates the navigation plugin.
2690
- * @class The Navigation Plugin
2691
- * @param {Owl} carousel - The Owl Carousel.
2692
- */
2693
- var Navigation = function(carousel) {
2694
- /**
2695
- * Reference to the core.
2696
- * @protected
2697
- * @type {Owl}
2698
- */
2699
- this._core = carousel;
2700
-
2701
- /**
2702
- * Indicates whether the plugin is initialized or not.
2703
- * @protected
2704
- * @type {Boolean}
2705
- */
2706
- this._initialized = false;
2707
-
2708
- /**
2709
- * The current paging indexes.
2710
- * @protected
2711
- * @type {Array}
2712
- */
2713
- this._pages = [];
2714
-
2715
- /**
2716
- * All DOM elements of the user interface.
2717
- * @protected
2718
- * @type {Object}
2719
- */
2720
- this._controls = {};
2721
-
2722
- /**
2723
- * Markup for an indicator.
2724
- * @protected
2725
- * @type {Array.<String>}
2726
- */
2727
- this._templates = [];
2728
-
2729
- /**
2730
- * The carousel element.
2731
- * @type {jQuery}
2732
- */
2733
- this.$element = this._core.$element;
2734
-
2735
- /**
2736
- * Overridden methods of the carousel.
2737
- * @protected
2738
- * @type {Object}
2739
- */
2740
- this._overrides = {
2741
- next: this._core.next,
2742
- prev: this._core.prev,
2743
- to: this._core.to
2744
- };
2745
-
2746
- /**
2747
- * All event handlers.
2748
- * @protected
2749
- * @type {Object}
2750
- */
2751
- this._handlers = {
2752
- 'prepared.owl.carousel': $.proxy(function(e) {
2753
- if (e.namespace && this._core.settings.dotsData) {
2754
- this._templates.push('<div class="' + this._core.settings.dotClass + '">' +
2755
- $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
2756
- }
2757
- }, this),
2758
- 'added.owl.carousel': $.proxy(function(e) {
2759
- if (e.namespace && this._core.settings.dotsData) {
2760
- this._templates.splice(e.position, 0, this._templates.pop());
2761
- }
2762
- }, this),
2763
- 'remove.owl.carousel': $.proxy(function(e) {
2764
- if (e.namespace && this._core.settings.dotsData) {
2765
- this._templates.splice(e.position, 1);
2766
- }
2767
- }, this),
2768
- 'changed.owl.carousel': $.proxy(function(e) {
2769
- if (e.namespace && e.property.name == 'position') {
2770
- this.draw();
2771
- }
2772
- }, this),
2773
- 'initialized.owl.carousel': $.proxy(function(e) {
2774
- if (e.namespace && !this._initialized) {
2775
- this._core.trigger('initialize', null, 'navigation');
2776
- this.initialize();
2777
- this.update();
2778
- this.draw();
2779
- this._initialized = true;
2780
- this._core.trigger('initialized', null, 'navigation');
2781
- }
2782
- }, this),
2783
- 'refreshed.owl.carousel': $.proxy(function(e) {
2784
- if (e.namespace && this._initialized) {
2785
- this._core.trigger('refresh', null, 'navigation');
2786
- this.update();
2787
- this.draw();
2788
- this._core.trigger('refreshed', null, 'navigation');
2789
- }
2790
- }, this)
2791
- };
2792
-
2793
- // set default options
2794
- this._core.options = $.extend({}, Navigation.Defaults, this._core.options);
2795
-
2796
- // register event handlers
2797
- this.$element.on(this._handlers);
2798
- };
2799
-
2800
- /**
2801
- * Default options.
2802
- * @public
2803
- * @todo Rename `slideBy` to `navBy`
2804
- */
2805
- Navigation.Defaults = {
2806
- nav: false,
2807
- navText: [ 'prev', 'next' ],
2808
- navSpeed: false,
2809
- navElement: 'div',
2810
- navContainer: false,
2811
- navContainerClass: 'owl-nav',
2812
- navClass: [ 'owl-prev', 'owl-next' ],
2813
- slideBy: 1,
2814
- dotClass: 'owl-dot',
2815
- dotsClass: 'owl-dots',
2816
- dots: true,
2817
- dotsEach: false,
2818
- dotsData: false,
2819
- dotsSpeed: false,
2820
- dotsContainer: false
2821
- };
2822
-
2823
- /**
2824
- * Initializes the layout of the plugin and extends the carousel.
2825
- * @protected
2826
- */
2827
- Navigation.prototype.initialize = function() {
2828
- var override,
2829
- settings = this._core.settings;
2830
-
2831
- // create DOM structure for relative navigation
2832
- this._controls.$relative = (settings.navContainer ? $(settings.navContainer)
2833
- : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');
2834
-
2835
- this._controls.$previous = $('<' + settings.navElement + '>')
2836
- .addClass(settings.navClass[0])
2837
- .html(settings.navText[0])
2838
- .prependTo(this._controls.$relative)
2839
- .on('click', $.proxy(function(e) {
2840
- this.prev(settings.navSpeed);
2841
- }, this));
2842
- this._controls.$next = $('<' + settings.navElement + '>')
2843
- .addClass(settings.navClass[1])
2844
- .html(settings.navText[1])
2845
- .appendTo(this._controls.$relative)
2846
- .on('click', $.proxy(function(e) {
2847
- this.next(settings.navSpeed);
2848
- }, this));
2849
-
2850
- // create DOM structure for absolute navigation
2851
- if (!settings.dotsData) {
2852
- this._templates = [ $('<div>')
2853
- .addClass(settings.dotClass)
2854
- .append($('<span>'))
2855
- .prop('outerHTML') ];
2856
- }
2857
-
2858
- this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer)
2859
- : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');
2860
-
2861
- this._controls.$absolute.on('click', 'div', $.proxy(function(e) {
2862
- var index = $(e.target).parent().is(this._controls.$absolute)
2863
- ? $(e.target).index() : $(e.target).parent().index();
2864
-
2865
- e.preventDefault();
2866
-
2867
- this.to(index, settings.dotsSpeed);
2868
- }, this));
2869
-
2870
- // override public methods of the carousel
2871
- for (override in this._overrides) {
2872
- this._core[override] = $.proxy(this[override], this);
2873
- }
2874
- };
2875
-
2876
- /**
2877
- * Destroys the plugin.
2878
- * @protected
2879
- */
2880
- Navigation.prototype.destroy = function() {
2881
- var handler, control, property, override;
2882
-
2883
- for (handler in this._handlers) {
2884
- this.$element.off(handler, this._handlers[handler]);
2885
- }
2886
- for (control in this._controls) {
2887
- this._controls[control].remove();
2888
- }
2889
- for (override in this.overides) {
2890
- this._core[override] = this._overrides[override];
2891
- }
2892
- for (property in Object.getOwnPropertyNames(this)) {
2893
- typeof this[property] != 'function' && (this[property] = null);
2894
- }
2895
- };
2896
-
2897
- /**
2898
- * Updates the internal state.
2899
- * @protected
2900
- */
2901
- Navigation.prototype.update = function() {
2902
- var i, j, k,
2903
- lower = this._core.clones().length / 2,
2904
- upper = lower + this._core.items().length,
2905
- maximum = this._core.maximum(true),
2906
- settings = this._core.settings,
2907
- size = settings.center || settings.autoWidth || settings.dotsData
2908
- ? 1 : settings.dotsEach || settings.items;
2909
-
2910
- if (settings.slideBy !== 'page') {
2911
- settings.slideBy = Math.min(settings.slideBy, settings.items);
2912
- }
2913
-
2914
- if (settings.dots || settings.slideBy == 'page') {
2915
- this._pages = [];
2916
-
2917
- for (i = lower, j = 0, k = 0; i < upper; i++) {
2918
- if (j >= size || j === 0) {
2919
- this._pages.push({
2920
- start: Math.min(maximum, i - lower),
2921
- end: i - lower + size - 1
2922
- });
2923
- if (Math.min(maximum, i - lower) === maximum) {
2924
- break;
2925
- }
2926
- j = 0, ++k;
2927
- }
2928
- j += this._core.mergers(this._core.relative(i));
2929
- }
2930
- }
2931
- };
2932
-
2933
- /**
2934
- * Draws the user interface.
2935
- * @todo The option `dotsData` wont work.
2936
- * @protected
2937
- */
2938
- Navigation.prototype.draw = function() {
2939
- var difference,
2940
- settings = this._core.settings,
2941
- disabled = this._core.items().length <= settings.items,
2942
- index = this._core.relative(this._core.current()),
2943
- loop = settings.loop || settings.rewind;
2944
-
2945
- this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);
2946
-
2947
- if (settings.nav) {
2948
- this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
2949
- this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
2950
- }
2951
-
2952
- this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);
2953
-
2954
- if (settings.dots) {
2955
- difference = this._pages.length - this._controls.$absolute.children().length;
2956
-
2957
- if (settings.dotsData && difference !== 0) {
2958
- this._controls.$absolute.html(this._templates.join(''));
2959
- } else if (difference > 0) {
2960
- this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
2961
- } else if (difference < 0) {
2962
- this._controls.$absolute.children().slice(difference).remove();
2963
- }
2964
-
2965
- this._controls.$absolute.find('.active').removeClass('active');
2966
- this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
2967
- }
2968
- };
2969
-
2970
- /**
2971
- * Extends event data.
2972
- * @protected
2973
- * @param {Event} event - The event object which gets thrown.
2974
- */
2975
- Navigation.prototype.onTrigger = function(event) {
2976
- var settings = this._core.settings;
2977
-
2978
- event.page = {
2979
- index: $.inArray(this.current(), this._pages),
2980
- count: this._pages.length,
2981
- size: settings && (settings.center || settings.autoWidth || settings.dotsData
2982
- ? 1 : settings.dotsEach || settings.items)
2983
- };
2984
- };
2985
-
2986
- /**
2987
- * Gets the current page position of the carousel.
2988
- * @protected
2989
- * @returns {Number}
2990
- */
2991
- Navigation.prototype.current = function() {
2992
- var current = this._core.relative(this._core.current());
2993
- return $.grep(this._pages, $.proxy(function(page, index) {
2994
- return page.start <= current && page.end >= current;
2995
- }, this)).pop();
2996
- };
2997
-
2998
- /**
2999
- * Gets the current succesor/predecessor position.
3000
- * @protected
3001
- * @returns {Number}
3002
- */
3003
- Navigation.prototype.getPosition = function(successor) {
3004
- var position, length,
3005
- settings = this._core.settings;
3006
-
3007
- if (settings.slideBy == 'page') {
3008
- position = $.inArray(this.current(), this._pages);
3009
- length = this._pages.length;
3010
- successor ? ++position : --position;
3011
- position = this._pages[((position % length) + length) % length].start;
3012
- } else {
3013
- position = this._core.relative(this._core.current());
3014
- length = this._core.items().length;
3015
- successor ? position += settings.slideBy : position -= settings.slideBy;
3016
- }
3017
-
3018
- return position;
3019
- };
3020
-
3021
- /**
3022
- * Slides to the next item or page.
3023
- * @public
3024
- * @param {Number} [speed=false] - The time in milliseconds for the transition.
3025
- */
3026
- Navigation.prototype.next = function(speed) {
3027
- $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
3028
- };
3029
-
3030
- /**
3031
- * Slides to the previous item or page.
3032
- * @public
3033
- * @param {Number} [speed=false] - The time in milliseconds for the transition.
3034
- */
3035
- Navigation.prototype.prev = function(speed) {
3036
- $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
3037
- };
3038
-
3039
- /**
3040
- * Slides to the specified item or page.
3041
- * @public
3042
- * @param {Number} position - The position of the item or page.
3043
- * @param {Number} [speed] - The time in milliseconds for the transition.
3044
- * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
3045
- */
3046
- Navigation.prototype.to = function(position, speed, standard) {
3047
- var length;
3048
-
3049
- if (!standard && this._pages.length) {
3050
- length = this._pages.length;
3051
- $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed);
3052
- } else {
3053
- $.proxy(this._overrides.to, this._core)(position, speed);
3054
- }
3055
- };
3056
-
3057
- $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
3058
-
3059
- })(window.Zepto || window.jQuery, window, document);
3060
-
3061
- /**
3062
- * Hash Plugin
3063
- * @version 2.1.0
3064
- * @author Artus Kolanowski
3065
- * @author David Deutsch
3066
- * @license The MIT License (MIT)
3067
- */
3068
- ;(function($, window, document, undefined) {
3069
- 'use strict';
3070
-
3071
- /**
3072
- * Creates the hash plugin.
3073
- * @class The Hash Plugin
3074
- * @param {Owl} carousel - The Owl Carousel
3075
- */
3076
- var Hash = function(carousel) {
3077
- /**
3078
- * Reference to the core.
3079
- * @protected
3080
- * @type {Owl}
3081
- */
3082
- this._core = carousel;
3083
-
3084
- /**
3085
- * Hash index for the items.
3086
- * @protected
3087
- * @type {Object}
3088
- */
3089
- this._hashes = {};
3090
-
3091
- /**
3092
- * The carousel element.
3093
- * @type {jQuery}
3094
- */
3095
- this.$element = this._core.$element;
3096
-
3097
- /**
3098
- * All event handlers.
3099
- * @protected
3100
- * @type {Object}
3101
- */
3102
- this._handlers = {
3103
- 'initialized.owl.carousel': $.proxy(function(e) {
3104
- if (e.namespace && this._core.settings.startPosition === 'URLHash') {
3105
- $(window).trigger('hashchange.owl.navigation');
3106
- }
3107
- }, this),
3108
- 'prepared.owl.carousel': $.proxy(function(e) {
3109
- if (e.namespace) {
3110
- var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');
3111
-
3112
- if (!hash) {
3113
- return;
3114
- }
3115
-
3116
- this._hashes[hash] = e.content;
3117
- }
3118
- }, this),
3119
- 'changed.owl.carousel': $.proxy(function(e) {
3120
- if (e.namespace && e.property.name === 'position') {
3121
- var current = this._core.items(this._core.relative(this._core.current())),
3122
- hash = $.map(this._hashes, function(item, hash) {
3123
- return item === current ? hash : null;
3124
- }).join();
3125
-
3126
- if (!hash || window.location.hash.slice(1) === hash) {
3127
- return;
3128
- }
3129
-
3130
- window.location.hash = hash;
3131
- }
3132
- }, this)
3133
- };
3134
-
3135
- // set default options
3136
- this._core.options = $.extend({}, Hash.Defaults, this._core.options);
3137
-
3138
- // register the event handlers
3139
- this.$element.on(this._handlers);
3140
-
3141
- // register event listener for hash navigation
3142
- $(window).on('hashchange.owl.navigation', $.proxy(function(e) {
3143
- var hash = window.location.hash.substring(1),
3144
- items = this._core.$stage.children(),
3145
- position = this._hashes[hash] && items.index(this._hashes[hash]);
3146
-
3147
- if (position === undefined || position === this._core.current()) {
3148
- return;
3149
- }
3150
-
3151
- this._core.to(this._core.relative(position), false, true);
3152
- }, this));
3153
- };
3154
-
3155
- /**
3156
- * Default options.
3157
- * @public
3158
- */
3159
- Hash.Defaults = {
3160
- URLhashListener: false
3161
- };
3162
-
3163
- /**
3164
- * Destroys the plugin.
3165
- * @public
3166
- */
3167
- Hash.prototype.destroy = function() {
3168
- var handler, property;
3169
-
3170
- $(window).off('hashchange.owl.navigation');
3171
-
3172
- for (handler in this._handlers) {
3173
- this._core.$element.off(handler, this._handlers[handler]);
3174
- }
3175
- for (property in Object.getOwnPropertyNames(this)) {
3176
- typeof this[property] != 'function' && (this[property] = null);
3177
- }
3178
- };
3179
-
3180
- $.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
3181
-
3182
- })(window.Zepto || window.jQuery, window, document);
3183
-
3184
- /**
3185
- * Support Plugin
3186
- *
3187
- * @version 2.1.0
3188
- * @author Vivid Planet Software GmbH
3189
- * @author Artus Kolanowski
3190
- * @author David Deutsch
3191
- * @license The MIT License (MIT)
3192
- */
3193
- ;(function($, window, document, undefined) {
3194
-
3195
- var style = $('<support>').get(0).style,
3196
- prefixes = 'Webkit Moz O ms'.split(' '),
3197
- events = {
3198
- transition: {
3199
- end: {
3200
- WebkitTransition: 'webkitTransitionEnd',
3201
- MozTransition: 'transitionend',
3202
- OTransition: 'oTransitionEnd',
3203
- transition: 'transitionend'
3204
- }
3205
- },
3206
- animation: {
3207
- end: {
3208
- WebkitAnimation: 'webkitAnimationEnd',
3209
- MozAnimation: 'animationend',
3210
- OAnimation: 'oAnimationEnd',
3211
- animation: 'animationend'
3212
- }
3213
- }
3214
- },
3215
- tests = {
3216
- csstransforms: function() {
3217
- return !!test('transform');
3218
- },
3219
- csstransforms3d: function() {
3220
- return !!test('perspective');
3221
- },
3222
- csstransitions: function() {
3223
- return !!test('transition');
3224
- },
3225
- cssanimations: function() {
3226
- return !!test('animation');
3227
- }
3228
- };
3229
-
3230
- function test(property, prefixed) {
3231
- var result = false,
3232
- upper = property.charAt(0).toUpperCase() + property.slice(1);
3233
-
3234
- $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) {
3235
- if (style[property] !== undefined) {
3236
- result = prefixed ? property : true;
3237
- return false;
3238
- }
3239
- });
3240
-
3241
- return result;
3242
- }
3243
-
3244
- function prefixed(property) {
3245
- return test(property, true);
3246
- }
3247
-
3248
- if (tests.csstransitions()) {
3249
- /* jshint -W053 */
3250
- $.support.transition = new String(prefixed('transition'))
3251
- $.support.transition.end = events.transition.end[ $.support.transition ];
3252
- }
3253
-
3254
- if (tests.cssanimations()) {
3255
- /* jshint -W053 */
3256
- $.support.animation = new String(prefixed('animation'))
3257
- $.support.animation.end = events.animation.end[ $.support.animation ];
3258
- }
3259
-
3260
- if (tests.csstransforms()) {
3261
- /* jshint -W053 */
3262
- $.support.transform = new String(prefixed('transform'));
3263
- $.support.transform3d = tests.csstransforms3d();
3264
- }
3265
-
3266
- })(window.Zepto || window.jQuery, window, document);
1
+ (function(d,c,b,e){function a(g,f){this.settings=null;this.options=d.extend({},a.Defaults,f);this.$element=d(g);this._handlers={};this._plugins={};this._supress={};this._current=null;this._speed=null;this._coordinates=[];this._breakpoint=null;this._width=null;this._items=[];this._clones=[];this._mergers=[];this._widths=[];this._invalidated={};this._pipe=[];this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null};this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}};d.each(["onResize","onThrottledResize"],d.proxy(function(h,j){this._handlers[j]=d.proxy(this[j],this)},this));d.each(a.Plugins,d.proxy(function(h,i){this._plugins[h.charAt(0).toLowerCase()+h.slice(1)]=new i(this)},this));d.each(a.Workers,d.proxy(function(h,i){this._pipe.push({filter:i.filter,run:d.proxy(i.run,this)})},this));this.setup();this.initialize()}a.Defaults={items:3,loop:false,center:false,rewind:false,mouseDrag:true,touchDrag:true,pullDrag:true,freeDrag:false,margin:0,stagePadding:0,merge:false,mergeFit:true,autoWidth:false,startPosition:0,rtl:false,smartSpeed:250,fluidSpeed:false,dragEndSpeed:false,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:c,fallbackEasing:"swing",info:false,nestedItemSelector:false,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"};a.Width={Default:"default",Inner:"inner",Outer:"outer"};a.Type={Event:"event",State:"state"};a.Plugins={};a.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(f){f.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(f){var i=this.settings.margin||"",h=!this.settings.autoWidth,j=this.settings.rtl,g={width:"auto","margin-left":j?i:"","margin-right":j?"":i};!h&&this.$stage.children().css(g);f.css=g}},{filter:["width","items","settings"],run:function(f){var i=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,k=null,h=this._items.length,g=!this.settings.autoWidth,j=[];f.items={merge:false,width:i};while(h--){k=this._mergers[h];k=this.settings.mergeFit&&Math.min(k,this.settings.items)||k;f.items.merge=k>1||f.items.merge;j[h]=!g?this._items[h].width():i*k}this._widths=j}},{filter:["items","settings"],run:function(){var m=[],i=this._items,k=this.settings,g=Math.max(k.items*2,4),j=Math.ceil(i.length/2)*2,l=k.loop&&i.length?k.rewind?g:Math.max(g,j):0,f="",h="";l/=2;while(l--){m.push(this.normalize(m.length/2,true));f=f+i[m[m.length-1]][0].outerHTML;m.push(this.normalize(i.length-1-(m.length-1)/2,true));h=i[m[m.length-1]][0].outerHTML+h}this._clones=m;d(f).addClass("cloned").appendTo(this.$stage);d(h).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){var j=this.settings.rtl?1:-1,f=this._clones.length+this._items.length,g=-1,h=0,i=0,k=[];while(++g<f){h=k[g-1]||0;i=this._widths[this.relative(g)]+this.settings.margin;k.push(h+i*j)}this._coordinates=k}},{filter:["width","items","settings"],run:function(){var g=this.settings.stagePadding,h=this._coordinates,f={width:Math.ceil(Math.abs(h[h.length-1]))+g*2,"padding-left":g||"","padding-right":g||""};this.$stage.css(f)}},{filter:["width","items","settings"],run:function(g){var i=this._coordinates.length,h=!this.settings.autoWidth,f=this.$stage.children();if(h&&g.items.merge){while(i--){g.css.width=this._widths[this.relative(i)];f.eq(i).css(g.css)}}else{if(h){g.css.width=g.items.width;f.css(g.css)}}}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(f){f.current=f.current?this.$stage.children().index(f.current):0;f.current=Math.max(this.minimum(),Math.min(this.maximum(),f.current));this.reset(f.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var l=this.settings.rtl?1:-1,m=this.settings.stagePadding*2,g=this.coordinates(this.current())+m,h=g+this.width()*l,p,o,k=[],j,f;for(j=0,f=this._coordinates.length;j<f;j++){p=this._coordinates[j-1]||0;o=Math.abs(this._coordinates[j])+m*l;if((this.op(p,"<=",g)&&(this.op(p,">",h)))||(this.op(o,"<",g)&&this.op(o,">",h))){k.push(j)}}this.$stage.children(".active").removeClass("active");this.$stage.children(":eq("+k.join("), :eq(")+")").addClass("active");if(this.settings.center){this.$stage.children(".center").removeClass("center");this.$stage.children().eq(this.current()).addClass("center")}}}];a.prototype.initialize=function(){this.enter("initializing");this.trigger("initialize");this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl);if(this.settings.autoWidth&&!this.is("pre-loading")){var h,g,f;h=this.$element.find("img");g=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:e;f=this.$element.children(g).width();if(h.length&&f<=0){this.preloadAutoWidthImages(h)}}this.$element.addClass(this.options.loadingClass);this.$stage=d("<"+this.settings.stageElement+' class="'+this.settings.stageClass+'"/>').wrap('<div class="'+this.settings.stageOuterClass+'"/>');this.$element.append(this.$stage.parent());this.replace(this.$element.children().not(this.$stage.parent()));if(this.$element.is(":visible")){this.refresh()}else{this.invalidate("width")}this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass);this.registerEventHandlers();this.leave("initializing");this.trigger("initialized")};a.prototype.setup=function(){var f=this.viewport(),h=this.options.responsive,g=-1,i=null;if(!h){i=d.extend({},this.options)}else{d.each(h,function(j){if(j<=f&&j>g){g=Number(j)}});i=d.extend({},this.options,h[g]);if(typeof i.stagePadding==="function"){i.stagePadding=i.stagePadding()}delete i.responsive;if(i.responsiveClass){this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+g))}}this.trigger("change",{property:{name:"settings",value:i}});this._breakpoint=g;this.settings=i;this.invalidate("settings");this.trigger("changed",{property:{name:"settings",value:this.settings}})};a.prototype.optionsLogic=function(){if(this.settings.autoWidth){this.settings.stagePadding=false;this.settings.merge=false}};a.prototype.prepare=function(g){var f=this.trigger("prepare",{content:g});if(!f.data){f.data=d("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(g)}this.trigger("prepared",{content:f.data});return f.data};a.prototype.update=function(){var g=0,j=this._pipe.length,h=d.proxy(function(i){return this[i]},this._invalidated),f={};while(g<j){if(this._invalidated.all||d.grep(this._pipe[g].filter,h).length>0){this._pipe[g].run(f)}g++}this._invalidated={};!this.is("valid")&&this.enter("valid")};a.prototype.width=function(f){f=f||a.Width.Default;switch(f){case a.Width.Inner:case a.Width.Outer:return this._width;default:return this._width-this.settings.stagePadding*2+this.settings.margin}};a.prototype.refresh=function(){this.enter("refreshing");this.trigger("refresh");this.setup();this.optionsLogic();this.$element.addClass(this.options.refreshClass);this.update();this.$element.removeClass(this.options.refreshClass);this.leave("refreshing");this.trigger("refreshed")};a.prototype.onThrottledResize=function(){c.clearTimeout(this.resizeTimer);this.resizeTimer=c.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)};a.prototype.onResize=function(){if(!this._items.length){return false}if(this._width===this.$element.width()){return false}if(!this.$element.is(":visible")){return false}this.enter("resizing");if(this.trigger("resize").isDefaultPrevented()){this.leave("resizing");return false}this.invalidate("width");this.refresh();this.leave("resizing");this.trigger("resized")};a.prototype.registerEventHandlers=function(){if(d.support.transition){this.$stage.on(d.support.transition.end+".owl.core",d.proxy(this.onTransitionEnd,this))}if(this.settings.responsive!==false){this.on(c,"resize",this._handlers.onThrottledResize)}if(this.settings.mouseDrag){this.$element.addClass(this.options.dragClass);this.$stage.on("mousedown.owl.core",d.proxy(this.onDragStart,this));this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return false})}if(this.settings.touchDrag){this.$stage.on("touchstart.owl.core",d.proxy(this.onDragStart,this));this.$stage.on("touchcancel.owl.core",d.proxy(this.onDragEnd,this))}};a.prototype.onDragStart=function(g){var f=null;if(g.which===3){return}if(d.support.transform){f=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(",");f={x:f[f.length===16?12:4],y:f[f.length===16?13:5]}}else{f=this.$stage.position();f={x:this.settings.rtl?f.left+this.$stage.width()-this.width()+this.settings.margin:f.left,y:f.top}}if(this.is("animating")){d.support.transform?this.animate(f.x):this.$stage.stop();this.invalidate("position")}this.$element.toggleClass(this.options.grabClass,g.type==="mousedown");this.speed(0);this._drag.time=new Date().getTime();this._drag.target=d(g.target);this._drag.stage.start=f;this._drag.stage.current=f;this._drag.pointer=this.pointer(g);d(b).on("mouseup.owl.core touchend.owl.core",d.proxy(this.onDragEnd,this));d(b).one("mousemove.owl.core touchmove.owl.core",d.proxy(function(h){var i=this.difference(this._drag.pointer,this.pointer(h));d(b).on("mousemove.owl.core touchmove.owl.core",d.proxy(this.onDragMove,this));if(Math.abs(i.x)<Math.abs(i.y)&&this.is("valid")){return}h.preventDefault();this.enter("dragging");this.trigger("drag")},this))};a.prototype.onDragMove=function(g){var i=null,j=null,h=null,k=this.difference(this._drag.pointer,this.pointer(g)),f=this.difference(this._drag.stage.start,k);if(!this.is("dragging")){return}g.preventDefault();if(this.settings.loop){i=this.coordinates(this.minimum());j=this.coordinates(this.maximum()+1)-i;f.x=(((f.x-i)%j+j)%j)+i}else{i=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum());j=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum());h=this.settings.pullDrag?-1*k.x/5:0;f.x=Math.max(Math.min(f.x,i+h),j+h)}this._drag.stage.current=f;this.animate(f.x)};a.prototype.onDragEnd=function(g){var i=this.difference(this._drag.pointer,this.pointer(g)),f=this._drag.stage.current,h=i.x>0^this.settings.rtl?"left":"right";d(b).off(".owl.core");this.$element.removeClass(this.options.grabClass);if(i.x!==0&&this.is("dragging")||!this.is("valid")){this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed);this.current(this.closest(f.x,i.x!==0?h:this._drag.direction));this.invalidate("position");this.update();this._drag.direction=h;if(Math.abs(i.x)>3||new Date().getTime()-this._drag.time>300){this._drag.target.one("click.owl.core",function(){return false})}}if(!this.is("dragging")){return}this.leave("dragging");this.trigger("dragged")};a.prototype.closest=function(k,i){var f=-1,h=30,g=this.width(),j=this.coordinates();if(!this.settings.freeDrag){d.each(j,d.proxy(function(l,m){if(i==="left"&&k>m-h&&k<m+h){f=l}else{if(i==="right"&&k>m-g-h&&k<m-g+h){f=l+1}else{if(this.op(k,"<",m)&&this.op(k,">",j[l+1]||m-g)){f=i==="left"?l+1:l}}}return f===-1},this))}if(!this.settings.loop){if(this.op(k,">",j[this.minimum()])){f=k=this.minimum()}else{if(this.op(k,"<",j[this.maximum()])){f=k=this.maximum()}}}return f};a.prototype.animate=function(g){var f=this.speed()>0;this.is("animating")&&this.onTransitionEnd();if(f){this.enter("animating");this.trigger("translate")}if(d.support.transform3d&&d.support.transition){this.$stage.css({transform:"translate3d("+g+"px,0px,0px)",transition:(this.speed()/1000)+"s"})}else{if(f){this.$stage.animate({left:g+"px"},this.speed(),this.settings.fallbackEasing,d.proxy(this.onTransitionEnd,this))}else{this.$stage.css({left:g+"px"})}}};a.prototype.is=function(f){return this._states.current[f]&&this._states.current[f]>0};a.prototype.current=function(f){if(f===e){return this._current}if(this._items.length===0){return e}f=this.normalize(f);if(this._current!==f){var g=this.trigger("change",{property:{name:"position",value:f}});if(g.data!==e){f=this.normalize(g.data)}this._current=f;this.invalidate("position");this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current};a.prototype.invalidate=function(f){if(d.type(f)==="string"){this._invalidated[f]=true;this.is("valid")&&this.leave("valid")}return d.map(this._invalidated,function(g,h){return h})};a.prototype.reset=function(f){f=this.normalize(f);if(f===e){return}this._speed=0;this._current=f;this.suppress(["translate","translated"]);this.animate(this.coordinates(f));this.release(["translate","translated"])};a.prototype.normalize=function(g,h){var i=this._items.length,f=h?0:this._clones.length;if(!this.isNumeric(g)||i<1){g=e}else{if(g<0||g>=i+f){g=((g-f/2)%i+i)%i+f/2}}return g};a.prototype.relative=function(f){f-=this._clones.length/2;return this.normalize(f,true)};a.prototype.maximum=function(j){var g=this.settings,k=this._coordinates.length,f,i,h;if(g.loop){k=this._clones.length/2+this._items.length-1}else{if(g.autoWidth||g.merge){f=this._items.length;i=this._items[--f].width();h=this.$element.width();while(f--){i+=this._items[f].width()+this.settings.margin;if(i>h){break}}k=f+1}else{if(g.center){k=this._items.length-1}else{k=this._items.length-g.items}}}if(j){k-=this._clones.length/2}return Math.max(k,0)};a.prototype.minimum=function(f){return f?0:this._clones.length/2};a.prototype.items=function(f){if(f===e){return this._items.slice()}f=this.normalize(f,true);return this._items[f]};a.prototype.mergers=function(f){if(f===e){return this._mergers.slice()}f=this.normalize(f,true);return this._mergers[f]};a.prototype.clones=function(f){var g=this._clones.length/2,i=g+this._items.length,h=function(j){return j%2===0?i+j/2:g-(j+1)/2};if(f===e){return d.map(this._clones,function(j,k){return h(k)})}return d.map(this._clones,function(j,k){return j===f?h(k):null})};a.prototype.speed=function(f){if(f!==e){this._speed=f}return this._speed};a.prototype.coordinates=function(f){var i=1,g=f-1,h;if(f===e){return d.map(this._coordinates,d.proxy(function(k,j){return this.coordinates(j)},this))}if(this.settings.center){if(this.settings.rtl){i=-1;g=f+1}h=this._coordinates[f];h+=(this.width()-h+(this._coordinates[g]||0))/2*i}else{h=this._coordinates[g]||0}h=Math.ceil(h);return h};a.prototype.duration=function(h,g,f){if(f===0){return 0}return Math.min(Math.max(Math.abs(g-h),1),6)*Math.abs((f||this.settings.smartSpeed))};a.prototype.to=function(i,g){var j=this.current(),m=null,f=i-this.relative(j),n=(f>0)-(f<0),l=this._items.length,k=this.minimum(),h=this.maximum();if(this.settings.loop){if(!this.settings.rewind&&Math.abs(f)>l/2){f+=n*-1*l}i=j+f;m=((i-k)%l+l)%l+k;if(m!==i&&m-f<=h&&m-f>0){j=m-f;i=m;this.reset(j)}}else{if(this.settings.rewind){h+=1;i=(i%h+h)%h}else{i=Math.max(k,Math.min(h,i))}}this.speed(this.duration(j,i,g));this.current(i);if(this.$element.is(":visible")){this.update()}};a.prototype.next=function(f){f=f||false;this.to(this.relative(this.current())+1,f)};a.prototype.prev=function(f){f=f||false;this.to(this.relative(this.current())-1,f)};a.prototype.onTransitionEnd=function(f){if(f!==e){f.stopPropagation();if((f.target||f.srcElement||f.originalTarget)!==this.$stage.get(0)){return false}}this.leave("animating");this.trigger("translated")};a.prototype.viewport=function(){var f;if(this.options.responsiveBaseElement!==c){f=d(this.options.responsiveBaseElement).width()}else{if(c.innerWidth){f=c.innerWidth}else{if(b.documentElement&&b.documentElement.clientWidth){f=b.documentElement.clientWidth}else{console.warn("Can not detect viewport width.")}}}return f};a.prototype.replace=function(f){this.$stage.empty();this._items=[];if(f){f=(f instanceof jQuery)?f:d(f)}if(this.settings.nestedItemSelector){f=f.find("."+this.settings.nestedItemSelector)}f.filter(function(){return this.nodeType===1}).each(d.proxy(function(g,h){h=this.prepare(h);this.$stage.append(h);this._items.push(h);this._mergers.push(h.find("[data-merge]").addBack("[data-merge]").attr("data-merge")*1||1)},this));this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0);this.invalidate("items")};a.prototype.add=function(g,f){var h=this.relative(this._current);f=f===e?this._items.length:this.normalize(f,true);g=g instanceof jQuery?g:d(g);this.trigger("add",{content:g,position:f});g=this.prepare(g);if(this._items.length===0||f===this._items.length){this._items.length===0&&this.$stage.append(g);this._items.length!==0&&this._items[f-1].after(g);this._items.push(g);this._mergers.push(g.find("[data-merge]").addBack("[data-merge]").attr("data-merge")*1||1)}else{this._items[f].before(g);this._items.splice(f,0,g);this._mergers.splice(f,0,g.find("[data-merge]").addBack("[data-merge]").attr("data-merge")*1||1)}this._items[h]&&this.reset(this._items[h].index());this.invalidate("items");this.trigger("added",{content:g,position:f})};a.prototype.remove=function(f){f=this.normalize(f,true);if(f===e){return}this.trigger("remove",{content:this._items[f],position:f});this._items[f].remove();this._items.splice(f,1);this._mergers.splice(f,1);this.invalidate("items");this.trigger("removed",{content:null,position:f})};a.prototype.preloadAutoWidthImages=function(f){f.each(d.proxy(function(h,g){this.enter("pre-loading");g=d(g);d(new Image()).one("load",d.proxy(function(i){g.attr("src",i.target.src);g.css("opacity",1);this.leave("pre-loading");!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",g.attr("src")||g.attr("data-src")||g.attr("data-src-retina"))},this))};a.prototype.destroy=function(){this.$element.off(".owl.core");this.$stage.off(".owl.core");d(b).off(".owl.core");if(this.settings.responsive!==false){c.clearTimeout(this.resizeTimer);this.off(c,"resize",this._handlers.onThrottledResize)}for(var f in this._plugins){this._plugins[f].destroy()}this.$stage.children(".cloned").remove();this.$stage.unwrap();this.$stage.children().contents().unwrap();this.$stage.children().unwrap();this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")};a.prototype.op=function(g,i,f){var h=this.settings.rtl;switch(i){case"<":return h?g>f:g<f;case">":return h?g<f:g>f;case">=":return h?g<=f:g>=f;case"<=":return h?g>=f:g<=f;default:break}};a.prototype.on=function(g,h,i,f){if(g.addEventListener){g.addEventListener(h,i,f)}else{if(g.attachEvent){g.attachEvent("on"+h,i)}}};a.prototype.off=function(g,h,i,f){if(g.removeEventListener){g.removeEventListener(h,i,f)}else{if(g.detachEvent){g.detachEvent("on"+h,i)}}};a.prototype.trigger=function(g,l,i,k,m){var f={item:{count:this._items.length,index:this.current()}},h=d.camelCase(d.grep(["on",g,i],function(n){return n}).join("-").toLowerCase()),j=d.Event([g,"owl",i||"carousel"].join(".").toLowerCase(),d.extend({relatedTarget:this},f,l));if(!this._supress[g]){d.each(this._plugins,function(n,o){if(o.onTrigger){o.onTrigger(j)}});this.register({type:a.Type.Event,name:g});this.$element.trigger(j);if(this.settings&&typeof this.settings[h]==="function"){this.settings[h].call(this,j)}}return j};a.prototype.enter=function(f){d.each([f].concat(this._states.tags[f]||[]),d.proxy(function(h,g){if(this._states.current[g]===e){this._states.current[g]=0}this._states.current[g]++},this))};a.prototype.leave=function(f){d.each([f].concat(this._states.tags[f]||[]),d.proxy(function(h,g){this._states.current[g]--},this))};a.prototype.register=function(g){if(g.type===a.Type.Event){if(!d.event.special[g.name]){d.event.special[g.name]={}}if(!d.event.special[g.name].owl){var f=d.event.special[g.name]._default;d.event.special[g.name]._default=function(h){if(f&&f.apply&&(!h.namespace||h.namespace.indexOf("owl")===-1)){return f.apply(this,arguments)}return h.namespace&&h.namespace.indexOf("owl")>-1};d.event.special[g.name].owl=true}}else{if(g.type===a.Type.State){if(!this._states.tags[g.name]){this._states.tags[g.name]=g.tags}else{this._states.tags[g.name]=this._states.tags[g.name].concat(g.tags)}this._states.tags[g.name]=d.grep(this._states.tags[g.name],d.proxy(function(h,j){return d.inArray(h,this._states.tags[g.name])===j},this))}}};a.prototype.suppress=function(f){d.each(f,d.proxy(function(g,h){this._supress[h]=true},this))};a.prototype.release=function(f){d.each(f,d.proxy(function(g,h){delete this._supress[h]},this))};a.prototype.pointer=function(g){var f={x:null,y:null};g=g.originalEvent||g||c.event;g=g.touches&&g.touches.length?g.touches[0]:g.changedTouches&&g.changedTouches.length?g.changedTouches[0]:g;if(g.pageX){f.x=g.pageX;f.y=g.pageY}else{f.x=g.clientX;f.y=g.clientY}return f};a.prototype.isNumeric=function(f){return !isNaN(parseFloat(f))};a.prototype.difference=function(g,f){return{x:g.x-f.x,y:g.y-f.y}};d.fn.owlCarousel=function(g){var f=Array.prototype.slice.call(arguments,1);return this.each(function(){var i=d(this),h=i.data("owl.carousel");if(!h){h=new a(this,typeof g=="object"&&g);i.data("owl.carousel",h);d.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(j,k){h.register({type:a.Type.Event,name:k});h.$element.on(k+".owl.carousel.core",d.proxy(function(l){if(l.namespace&&l.relatedTarget!==this){this.suppress([k]);h[k].apply(this,[].slice.call(arguments,1));this.release([k])}},h))})}if(typeof g=="string"&&g.charAt(0)!=="_"){h[g].apply(h,f)}})};d.fn.owlCarousel.Constructor=a})(window.Zepto||window.jQuery,window,document);(function(d,c,a,e){var b=function(f){this._core=f;this._interval=null;this._visible=null;this._handlers={"initialized.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.settings.autoRefresh){this.watch()}},this)};this._core.options=d.extend({},b.Defaults,this._core.options);this._core.$element.on(this._handlers)};b.Defaults={autoRefresh:true,autoRefreshInterval:500};b.prototype.watch=function(){if(this._interval){return}this._visible=this._core.$element.is(":visible");this._interval=c.setInterval(d.proxy(this.refresh,this),this._core.settings.autoRefreshInterval)};b.prototype.refresh=function(){if(this._core.$element.is(":visible")===this._visible){return}this._visible=!this._visible;this._core.$element.toggleClass("owl-hidden",!this._visible);this._visible&&(this._core.invalidate("width")&&this._core.refresh())};b.prototype.destroy=function(){var f,g;c.clearInterval(this._interval);for(f in this._handlers){this._core.$element.off(f,this._handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};d.fn.owlCarousel.Constructor.Plugins.AutoRefresh=b})(window.Zepto||window.jQuery,window,document);(function(d,c,a,e){var b=function(f){this._core=f;this._loaded=[];this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":d.proxy(function(m){if(!m.namespace){return}if(!this._core.settings||!this._core.settings.lazyLoad){return}if((m.property&&m.property.name=="position")||m.type=="initialized"){var j=this._core.settings,o=(j.center&&Math.ceil(j.items/2)||j.items),h=((j.center&&o*-1)||0),g=(m.property&&m.property.value!==e?m.property.value:this._core.current())+h,l=this._core.clones().length,k=d.proxy(function(p,n){this.load(n)},this);while(h++<o){this.load(l/2+this._core.relative(g));l&&d.each(this._core.clones(this._core.relative(g)),k);g++}}},this)};this._core.options=d.extend({},b.Defaults,this._core.options);this._core.$element.on(this._handlers)};b.Defaults={lazyLoad:false};b.prototype.load=function(f){var g=this._core.$stage.children().eq(f),h=g&&g.find(".owl-lazy");if(!h||d.inArray(g.get(0),this._loaded)>-1){return}h.each(d.proxy(function(k,l){var i=d(l),m,j=(c.devicePixelRatio>1&&i.attr("data-src-retina"))||i.attr("data-src");this._core.trigger("load",{element:i,url:j},"lazy");if(i.is("img")){i.one("load.owl.lazy",d.proxy(function(){i.css("opacity",1);this._core.trigger("loaded",{element:i,url:j},"lazy")},this)).attr("src",j)}else{m=new Image();m.onload=d.proxy(function(){i.css({"background-image":'url("'+j+'")',opacity:"1"});this._core.trigger("loaded",{element:i,url:j},"lazy")},this);m.src=j}},this));this._loaded.push(g.get(0))};b.prototype.destroy=function(){var f,g;for(f in this.handlers){this._core.$element.off(f,this.handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};d.fn.owlCarousel.Constructor.Plugins.Lazy=b})(window.Zepto||window.jQuery,window,document);(function(c,b,a,d){var e=function(f){this._core=f;this._handlers={"initialized.owl.carousel refreshed.owl.carousel":c.proxy(function(g){if(g.namespace&&this._core.settings.autoHeight){this.update()}},this),"changed.owl.carousel":c.proxy(function(g){if(g.namespace&&this._core.settings.autoHeight&&g.property.name=="position"){this.update()}},this),"loaded.owl.lazy":c.proxy(function(g){if(g.namespace&&this._core.settings.autoHeight&&g.element.closest("."+this._core.settings.itemClass).index()===this._core.current()){this.update()}},this)};this._core.options=c.extend({},e.Defaults,this._core.options);this._core.$element.on(this._handlers)};e.Defaults={autoHeight:false,autoHeightClass:"owl-height"};e.prototype.update=function(){var j=this._core._current,f=j+this._core.settings.items,i=this._core.$stage.children().toArray().slice(j,f),g=[],h=0;c.each(i,function(k,l){g.push(c(l).height())});h=Math.max.apply(null,g);this._core.$stage.parent().height(h).addClass(this._core.settings.autoHeightClass)};e.prototype.destroy=function(){var f,g;for(f in this._handlers){this._core.$element.off(f,this._handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};c.fn.owlCarousel.Constructor.Plugins.AutoHeight=e})(window.Zepto||window.jQuery,window,document);(function(d,c,a,e){var b=function(f){this._core=f;this._videos={};this._playing=null;this._handlers={"initialized.owl.carousel":d.proxy(function(g){if(g.namespace){this._core.register({type:"state",name:"playing",tags:["interacting"]})}},this),"resize.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.settings.video&&this.isInFullScreen()){g.preventDefault()}},this),"refreshed.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.is("resizing")){this._core.$stage.find(".cloned .owl-video-frame").remove()}},this),"changed.owl.carousel":d.proxy(function(g){if(g.namespace&&g.property.name==="position"&&this._playing){this.stop()}},this),"prepared.owl.carousel":d.proxy(function(h){if(!h.namespace){return}var g=d(h.content).find(".owl-video");if(g.length){g.css("display","none");this.fetch(g,d(h.content))}},this)};this._core.options=d.extend({},b.Defaults,this._core.options);this._core.$element.on(this._handlers);this._core.$element.on("click.owl.video",".owl-video-play-icon",d.proxy(function(g){this.play(g)},this))};b.Defaults={video:false,videoHeight:false,videoWidth:false};b.prototype.fetch=function(k,j){var i=(function(){if(k.attr("data-vimeo-id")){return"vimeo"}else{if(k.attr("data-vzaar-id")){return"vzaar"}else{return"youtube"}}})(),l=k.attr("data-vimeo-id")||k.attr("data-youtube-id")||k.attr("data-vzaar-id"),h=k.attr("data-width")||this._core.settings.videoWidth,f=k.attr("data-height")||this._core.settings.videoHeight,g=k.attr("href");if(g){l=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);if(l[3].indexOf("youtu")>-1){i="youtube"}else{if(l[3].indexOf("vimeo")>-1){i="vimeo"}else{if(l[3].indexOf("vzaar")>-1){i="vzaar"}else{throw new Error("Video URL not supported.")}}}l=l[6]}else{throw new Error("Missing video URL.")}this._videos[g]={type:i,id:l,width:h,height:f};j.attr("data-video",g);this.thumbnail(k,this._videos[g])};b.prototype.thumbnail=function(l,h){var g,n,p,f=h.width&&h.height?'style="width:'+h.width+"px;height:"+h.height+'px;"':"",m=l.find("img"),o="src",k="",i=this._core.settings,j=function(q){n='<div class="owl-video-play-icon"></div>';if(i.lazyLoad){g='<div class="owl-video-tn '+k+'" '+o+'="'+q+'"></div>'}else{g='<div class="owl-video-tn" style="opacity:1;background-image:url('+q+')"></div>'}l.after(g);l.after(n)};l.wrap('<div class="owl-video-wrapper"'+f+"></div>");if(this._core.settings.lazyLoad){o="data-src";k="owl-lazy"}if(m.length){j(m.attr(o));m.remove();return false}if(h.type==="youtube"){p="//img.youtube.com/vi/"+h.id+"/hqdefault.jpg";j(p)}else{if(h.type==="vimeo"){d.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+h.id+".json",jsonp:"callback",dataType:"jsonp",success:function(q){p=q[0].thumbnail_large;j(p)}})}else{if(h.type==="vzaar"){d.ajax({type:"GET",url:"//vzaar.com/api/videos/"+h.id+".json",jsonp:"callback",dataType:"jsonp",success:function(q){p=q.framegrab_url;j(p)}})}}}};b.prototype.stop=function(){this._core.trigger("stop",null,"video");this._playing.find(".owl-video-frame").remove();this._playing.removeClass("owl-video-playing");this._playing=null;this._core.leave("playing");this._core.trigger("stopped",null,"video")};b.prototype.play=function(k){var l=d(k.target),j=l.closest("."+this._core.settings.itemClass),i=this._videos[j.attr("data-video")],h=i.width||"100%",f=i.height||this._core.$stage.height(),g;if(this._playing){return}this._core.enter("playing");this._core.trigger("play",null,"video");j=this._core.items(this._core.relative(j.index()));this._core.reset(j.index());if(i.type==="youtube"){g='<iframe width="'+h+'" height="'+f+'" src="//www.youtube.com/embed/'+i.id+"?autoplay=1&rel=0&v="+i.id+'" frameborder="0" allowfullscreen></iframe>'}else{if(i.type==="vimeo"){g='<iframe src="//player.vimeo.com/video/'+i.id+'?autoplay=1" width="'+h+'" height="'+f+'" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'}else{if(i.type==="vzaar"){g='<iframe frameborder="0"height="'+f+'"width="'+h+'" allowfullscreen mozallowfullscreen webkitAllowFullScreen src="//view.vzaar.com/'+i.id+'/player?autoplay=true"></iframe>'}}}d('<div class="owl-video-frame">'+g+"</div>").insertAfter(j.find(".owl-video"));this._playing=j.addClass("owl-video-playing")};b.prototype.isInFullScreen=function(){var f=a.fullscreenElement||a.mozFullScreenElement||a.webkitFullscreenElement;return f&&d(f).parent().hasClass("owl-video-frame")};b.prototype.destroy=function(){var f,g;this._core.$element.off("click.owl.video");for(f in this._handlers){this._core.$element.off(f,this._handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};d.fn.owlCarousel.Constructor.Plugins.Video=b})(window.Zepto||window.jQuery,window,document);(function(d,c,b,e){var a=function(f){this.core=f;this.core.options=d.extend({},a.Defaults,this.core.options);this.swapping=true;this.previous=e;this.next=e;this.handlers={"change.owl.carousel":d.proxy(function(g){if(g.namespace&&g.property.name=="position"){this.previous=this.core.current();this.next=g.property.value}},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":d.proxy(function(g){if(g.namespace){this.swapping=g.type=="translated"}},this),"translate.owl.carousel":d.proxy(function(g){if(g.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)){this.swap()}},this)};this.core.$element.on(this.handlers)};a.Defaults={animateOut:false,animateIn:false};a.prototype.swap=function(){if(this.core.settings.items!==1){return}if(!d.support.animation||!d.support.transition){return}this.core.speed(0);var k,f=d.proxy(this.clear,this),j=this.core.$stage.children().eq(this.previous),i=this.core.$stage.children().eq(this.next),g=this.core.settings.animateIn,h=this.core.settings.animateOut;if(this.core.current()===this.previous){return}if(h){k=this.core.coordinates(this.previous)-this.core.coordinates(this.next);j.one(d.support.animation.end,f).css({left:k+"px"}).addClass("animated owl-animated-out").addClass(h)}if(g){i.one(d.support.animation.end,f).addClass("animated owl-animated-in").addClass(g)}};a.prototype.clear=function(f){d(f.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut);this.core.onTransitionEnd()};a.prototype.destroy=function(){var f,g;for(f in this.handlers){this.core.$element.off(f,this.handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};d.fn.owlCarousel.Constructor.Plugins.Animate=a})(window.Zepto||window.jQuery,window,document);(function(c,b,a,e){var d=function(f){this._core=f;this._timeout=null;this._paused=false;this._handlers={"changed.owl.carousel":c.proxy(function(g){if(g.namespace&&g.property.name==="settings"){if(this._core.settings.autoplay){this.play()}else{this.stop()}}else{if(g.namespace&&g.property.name==="position"){if(this._core.settings.autoplay){this._setAutoPlayInterval()}}}},this),"initialized.owl.carousel":c.proxy(function(g){if(g.namespace&&this._core.settings.autoplay){this.play()}},this),"play.owl.autoplay":c.proxy(function(i,g,h){if(i.namespace){this.play(g,h)}},this),"stop.owl.autoplay":c.proxy(function(g){if(g.namespace){this.stop()}},this),"mouseover.owl.autoplay":c.proxy(function(){if(this._core.settings.autoplayHoverPause&&this._core.is("rotating")){this.pause()}},this),"mouseleave.owl.autoplay":c.proxy(function(){if(this._core.settings.autoplayHoverPause&&this._core.is("rotating")){this.play()}},this),"touchstart.owl.core":c.proxy(function(){if(this._core.settings.autoplayHoverPause&&this._core.is("rotating")){this.pause()}},this),"touchend.owl.core":c.proxy(function(){if(this._core.settings.autoplayHoverPause){this.play()}},this)};this._core.$element.on(this._handlers);this._core.options=c.extend({},d.Defaults,this._core.options)};d.Defaults={autoplay:false,autoplayTimeout:5000,autoplayHoverPause:false,autoplaySpeed:false};d.prototype.play=function(g,f){this._paused=false;if(this._core.is("rotating")){return}this._core.enter("rotating");this._setAutoPlayInterval()};d.prototype._getNextTimeout=function(g,f){if(this._timeout){b.clearTimeout(this._timeout)}return b.setTimeout(c.proxy(function(){if(this._paused||this._core.is("busy")||this._core.is("interacting")||a.hidden){return}this._core.next(f||this._core.settings.autoplaySpeed)},this),g||this._core.settings.autoplayTimeout)};d.prototype._setAutoPlayInterval=function(){this._timeout=this._getNextTimeout()};d.prototype.stop=function(){if(!this._core.is("rotating")){return}b.clearTimeout(this._timeout);this._core.leave("rotating")};d.prototype.pause=function(){if(!this._core.is("rotating")){return}this._paused=true};d.prototype.destroy=function(){var f,g;this.stop();for(f in this._handlers){this._core.$element.off(f,this._handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};c.fn.owlCarousel.Constructor.Plugins.autoplay=d})(window.Zepto||window.jQuery,window,document);(function(d,b,a,e){var c=function(f){this._core=f;this._initialized=false;this._pages=[];this._controls={};this._templates=[];this.$element=this._core.$element;this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to};this._handlers={"prepared.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.settings.dotsData){this._templates.push('<div class="'+this._core.settings.dotClass+'">'+d(g.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")}},this),"added.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.settings.dotsData){this._templates.splice(g.position,0,this._templates.pop())}},this),"remove.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.settings.dotsData){this._templates.splice(g.position,1)}},this),"changed.owl.carousel":d.proxy(function(g){if(g.namespace&&g.property.name=="position"){this.draw()}},this),"initialized.owl.carousel":d.proxy(function(g){if(g.namespace&&!this._initialized){this._core.trigger("initialize",null,"navigation");this.initialize();this.update();this.draw();this._initialized=true;this._core.trigger("initialized",null,"navigation")}},this),"refreshed.owl.carousel":d.proxy(function(g){if(g.namespace&&this._initialized){this._core.trigger("refresh",null,"navigation");this.update();this.draw();this._core.trigger("refreshed",null,"navigation")}},this)};this._core.options=d.extend({},c.Defaults,this._core.options);this.$element.on(this._handlers)};c.Defaults={nav:false,navText:["prev","next"],navSpeed:false,navElement:"div",navContainer:false,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:true,dotsEach:false,dotsData:false,dotsSpeed:false,dotsContainer:false};c.prototype.initialize=function(){var f,g=this._core.settings;this._controls.$relative=(g.navContainer?d(g.navContainer):d("<div>").addClass(g.navContainerClass).appendTo(this.$element)).addClass("disabled");this._controls.$previous=d("<"+g.navElement+">").addClass(g.navClass[0]).html(g.navText[0]).prependTo(this._controls.$relative).on("click",d.proxy(function(h){this.prev(g.navSpeed)},this));this._controls.$next=d("<"+g.navElement+">").addClass(g.navClass[1]).html(g.navText[1]).appendTo(this._controls.$relative).on("click",d.proxy(function(h){this.next(g.navSpeed)},this));if(!g.dotsData){this._templates=[d("<div>").addClass(g.dotClass).append(d("<span>")).prop("outerHTML")]}this._controls.$absolute=(g.dotsContainer?d(g.dotsContainer):d("<div>").addClass(g.dotsClass).appendTo(this.$element)).addClass("disabled");this._controls.$absolute.on("click","div",d.proxy(function(i){var h=d(i.target).parent().is(this._controls.$absolute)?d(i.target).index():d(i.target).parent().index();i.preventDefault();this.to(h,g.dotsSpeed)},this));for(f in this._overrides){this._core[f]=d.proxy(this[f],this)}};c.prototype.destroy=function(){var g,i,h,f;for(g in this._handlers){this.$element.off(g,this._handlers[g])}for(i in this._controls){this._controls[i].remove()}for(f in this.overides){this._core[f]=this._overrides[f]}for(h in Object.getOwnPropertyNames(this)){typeof this[h]!="function"&&(this[h]=null)}};c.prototype.update=function(){var m,h,f,g=this._core.clones().length/2,o=g+this._core.items().length,p=this._core.maximum(true),n=this._core.settings,l=n.center||n.autoWidth||n.dotsData?1:n.dotsEach||n.items;if(n.slideBy!=="page"){n.slideBy=Math.min(n.slideBy,n.items)}if(n.dots||n.slideBy=="page"){this._pages=[];for(m=g,h=0,f=0;m<o;m++){if(h>=l||h===0){this._pages.push({start:Math.min(p,m-g),end:m-g+l-1});if(Math.min(p,m-g)===p){break}h=0,++f}h+=this._core.mergers(this._core.relative(m))}}};c.prototype.draw=function(){var j,i=this._core.settings,h=this._core.items().length<=i.items,g=this._core.relative(this._core.current()),f=i.loop||i.rewind;this._controls.$relative.toggleClass("disabled",!i.nav||h);if(i.nav){this._controls.$previous.toggleClass("disabled",!f&&g<=this._core.minimum(true));this._controls.$next.toggleClass("disabled",!f&&g>=this._core.maximum(true))}this._controls.$absolute.toggleClass("disabled",!i.dots||h);if(i.dots){j=this._pages.length-this._controls.$absolute.children().length;if(i.dotsData&&j!==0){this._controls.$absolute.html(this._templates.join(""))}else{if(j>0){this._controls.$absolute.append(new Array(j+1).join(this._templates[0]))}else{if(j<0){this._controls.$absolute.children().slice(j).remove()}}}this._controls.$absolute.find(".active").removeClass("active");this._controls.$absolute.children().eq(d.inArray(this.current(),this._pages)).addClass("active")}};c.prototype.onTrigger=function(g){var f=this._core.settings;g.page={index:d.inArray(this.current(),this._pages),count:this._pages.length,size:f&&(f.center||f.autoWidth||f.dotsData?1:f.dotsEach||f.items)}};c.prototype.current=function(){var f=this._core.relative(this._core.current());return d.grep(this._pages,d.proxy(function(h,g){return h.start<=f&&h.end>=f},this)).pop()};c.prototype.getPosition=function(g){var f,i,h=this._core.settings;if(h.slideBy=="page"){f=d.inArray(this.current(),this._pages);i=this._pages.length;g?++f:--f;f=this._pages[((f%i)+i)%i].start}else{f=this._core.relative(this._core.current());i=this._core.items().length;g?f+=h.slideBy:f-=h.slideBy}return f};c.prototype.next=function(f){d.proxy(this._overrides.to,this._core)(this.getPosition(true),f)};c.prototype.prev=function(f){d.proxy(this._overrides.to,this._core)(this.getPosition(false),f)};c.prototype.to=function(f,i,g){var h;if(!g&&this._pages.length){h=this._pages.length;d.proxy(this._overrides.to,this._core)(this._pages[((f%h)+h)%h].start,i)}else{d.proxy(this._overrides.to,this._core)(f,i)}};d.fn.owlCarousel.Constructor.Plugins.Navigation=c})(window.Zepto||window.jQuery,window,document);(function(d,c,a,e){var b=function(f){this._core=f;this._hashes={};this.$element=this._core.$element;this._handlers={"initialized.owl.carousel":d.proxy(function(g){if(g.namespace&&this._core.settings.startPosition==="URLHash"){d(c).trigger("hashchange.owl.navigation")}},this),"prepared.owl.carousel":d.proxy(function(h){if(h.namespace){var g=d(h.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!g){return}this._hashes[g]=h.content}},this),"changed.owl.carousel":d.proxy(function(i){if(i.namespace&&i.property.name==="position"){var h=this._core.items(this._core.relative(this._core.current())),g=d.map(this._hashes,function(j,k){return j===h?k:null}).join();if(!g||c.location.hash.slice(1)===g){return}c.location.hash=g}},this)};this._core.options=d.extend({},b.Defaults,this._core.options);this.$element.on(this._handlers);d(c).on("hashchange.owl.navigation",d.proxy(function(j){var i=c.location.hash.substring(1),h=this._core.$stage.children(),g=this._hashes[i]&&h.index(this._hashes[i]);if(g===e||g===this._core.current()){return}this._core.to(this._core.relative(g),false,true)},this))};b.Defaults={URLhashListener:false};b.prototype.destroy=function(){var f,g;d(c).off("hashchange.owl.navigation");for(f in this._handlers){this._core.$element.off(f,this._handlers[f])}for(g in Object.getOwnPropertyNames(this)){typeof this[g]!="function"&&(this[g]=null)}};d.fn.owlCarousel.Constructor.Plugins.Hash=b})(window.Zepto||window.jQuery,window,document);(function(e,g,i,d){var b=e("<support>").get(0).style,f="Webkit Moz O ms".split(" "),j={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},c={csstransforms:function(){return !!h("transform")},csstransforms3d:function(){return !!h("perspective")},csstransitions:function(){return !!h("transition")},cssanimations:function(){return !!h("animation")}};function h(n,l){var k=false,m=n.charAt(0).toUpperCase()+n.slice(1);e.each((n+" "+f.join(m+" ")+m).split(" "),function(o,p){if(b[p]!==d){k=l?p:true;return false}});return k}function a(k){return h(k,true)}if(c.csstransitions()){e.support.transition=new String(a("transition"));e.support.transition.end=j.transition.end[e.support.transition]}if(c.cssanimations()){e.support.animation=new String(a("animation"));e.support.animation.end=j.animation.end[e.support.animation]}if(c.csstransforms()){e.support.transform=new String(a("transform"));e.support.transform3d=c.csstransforms3d()}})(window.Zepto||window.jQuery,window,document);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/front/js/owl.rows.js ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl2row
3
+ * @since 2.0.2
4
+ */
5
+ ;(function ($, window, document, undefined) {
6
+ Owl2row = function (scope) {
7
+ this.owl = scope;
8
+ this.owl.options = $.extend({}, Owl2row.Defaults, this.owl.options);
9
+ //link callback events with owl carousel here
10
+
11
+ this.handlers = {
12
+ 'initialize.owl.carousel': $.proxy(function (e) {
13
+ if (this.owl.settings.owl2row) {
14
+ this.build2row(this);
15
+ }
16
+ }, this)
17
+ };
18
+
19
+ this.owl.$element.on(this.handlers);
20
+ };
21
+
22
+ Owl2row.Defaults = {
23
+ owl2row: false,
24
+ owl2rowTarget: 'item',
25
+ owl2rowContainer: 'owl2row-item',
26
+ owl2rowDirection: 'utd' // ltr
27
+ };
28
+
29
+ //mehtods:
30
+ Owl2row.prototype.build2row = function(thisScope){
31
+
32
+ var carousel = $(thisScope.owl.$element);
33
+ var carouselItems = carousel.find('.' + thisScope.owl.options.owl2rowTarget);
34
+
35
+ var aEvenElements = [];
36
+ var aOddElements = [];
37
+
38
+ $.each(carouselItems, function (index, item) {
39
+ if ( index % 2 === 0 ) {
40
+ aEvenElements.push(item);
41
+ } else {
42
+ aOddElements.push(item);
43
+ }
44
+ });
45
+
46
+ carousel.empty();
47
+
48
+ switch (thisScope.owl.options.owl2rowDirection) {
49
+ case 'ltr':
50
+ thisScope.leftToright(thisScope, carousel, carouselItems);
51
+ break;
52
+
53
+ default :
54
+ thisScope.upTodown(thisScope, aEvenElements, aOddElements, carousel);
55
+ }
56
+
57
+ };
58
+
59
+ Owl2row.prototype.leftToright = function(thisScope, carousel, carouselItems){
60
+
61
+ var o2wContainerClass = thisScope.owl.options.owl2rowContainer;
62
+ var owlMargin = thisScope.owl.options.margin;
63
+
64
+ var carouselItemsLength = carouselItems.length;
65
+
66
+ var firsArr = [];
67
+ var secondArr = [];
68
+
69
+ //console.log(carouselItemsLength);
70
+
71
+ if (carouselItemsLength %2 === 1) {
72
+ carouselItemsLength = ((carouselItemsLength - 1)/2) + 1;
73
+ } else {
74
+ carouselItemsLength = carouselItemsLength/2;
75
+ }
76
+
77
+ //console.log(carouselItemsLength);
78
+
79
+ $.each(carouselItems, function (index, item) {
80
+
81
+
82
+ if (index < carouselItemsLength) {
83
+ firsArr.push(item);
84
+ } else {
85
+ secondArr.push(item);
86
+ }
87
+ });
88
+
89
+ $.each(firsArr, function (index, item) {
90
+ var rowContainer = $('<div class="' + o2wContainerClass + '"/>');
91
+
92
+ var firstRowElement = firsArr[index];
93
+ firstRowElement.style.marginBottom = owlMargin + 'px';
94
+
95
+ rowContainer
96
+ .append(firstRowElement)
97
+ .append(secondArr[index]);
98
+
99
+ carousel.append(rowContainer);
100
+ });
101
+
102
+ };
103
+
104
+ Owl2row.prototype.upTodown = function(thisScope, aEvenElements, aOddElements, carousel){
105
+
106
+ var o2wContainerClass = thisScope.owl.options.owl2rowContainer;
107
+ var owlMargin = thisScope.owl.options.margin;
108
+
109
+ $.each(aEvenElements, function (index, item) {
110
+
111
+ var rowContainer = $('<div class="' + o2wContainerClass + '"/>');
112
+ var evenElement = aEvenElements[index];
113
+
114
+ evenElement.style.marginBottom = owlMargin + 'px';
115
+
116
+ rowContainer
117
+ .append(evenElement)
118
+ .append(aOddElements[index]);
119
+
120
+ carousel.append(rowContainer);
121
+ });
122
+ };
123
+
124
+ /**
125
+ * Destroys the plugin.
126
+ */
127
+ Owl2row.prototype.destroy = function() {
128
+ var handler, property;
129
+
130
+ for (handler in this.handlers) {
131
+ this.owl.dom.$el.off(handler, this.handlers[handler]);
132
+ }
133
+ for (property in Object.getOwnPropertyNames(this)) {
134
+ typeof this[property] !== 'function' && (this[property] = null);
135
+ }
136
+ };
137
+
138
+ $.fn.owlCarousel.Constructor.Plugins['owl2row'] = Owl2row;
139
+ })( window.Zepto || window.jQuery, window, document );
assets/front/js/owl.rows.min.js ADDED
@@ -0,0 +1 @@
 
1
+ (function(c,b,a,d){Owl2row=function(e){this.owl=e;this.owl.options=c.extend({},Owl2row.Defaults,this.owl.options);this.handlers={"initialize.owl.carousel":c.proxy(function(f){if(this.owl.settings.owl2row){this.build2row(this)}},this)};this.owl.$element.on(this.handlers)};Owl2row.Defaults={owl2row:false,owl2rowTarget:"item",owl2rowContainer:"owl2row-item",owl2rowDirection:"utd"};Owl2row.prototype.build2row=function(i){var h=c(i.owl.$element);var g=h.find("."+i.owl.options.owl2rowTarget);var f=[];var e=[];c.each(g,function(j,k){if(j%2===0){f.push(k)}else{e.push(k)}});h.empty();switch(i.owl.options.owl2rowDirection){case"ltr":i.leftToright(i,h,g);break;default:i.upTodown(i,f,e,h)}};Owl2row.prototype.leftToright=function(l,k,j){var e=l.owl.options.owl2rowContainer;var g=l.owl.options.margin;var f=j.length;var i=[];var h=[];if(f%2===1){f=((f-1)/2)+1}else{f=f/2}c.each(j,function(m,n){if(m<f){i.push(n)}else{h.push(n)}});c.each(i,function(o,p){var n=c('<div class="'+e+'"/>');var m=i[o];m.style.marginBottom=g+"px";n.append(m).append(h[o]);k.append(n)})};Owl2row.prototype.upTodown=function(j,h,g,i){var e=j.owl.options.owl2rowContainer;var f=j.owl.options.margin;c.each(h,function(m,n){var k=c('<div class="'+e+'"/>');var l=h[m];l.style.marginBottom=f+"px";k.append(l).append(g[m]);i.append(k)})};Owl2row.prototype.destroy=function(){var e,f;for(e in this.handlers){this.owl.dom.$el.off(e,this.handlers[e])}for(f in Object.getOwnPropertyNames(this)){typeof this[f]!=="function"&&(this[f]=null)}};c.fn.owlCarousel.Constructor.Plugins.owl2row=Owl2row})(window.Zepto||window.jQuery,window,document);
assets/front/js/scripts.js CHANGED
@@ -6,6 +6,28 @@ jQuery(document).ready(function($)
6
 
7
 
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  $(document).on('click', '.wcps-zoom-colse', function()
10
  {
11
 
6
 
7
 
8
 
9
+
10
+ //$('.wcps-items-cart p').prepend('<input value="1" class="quantity" type="number"> ');
11
+
12
+
13
+
14
+
15
+
16
+ $(document).on('change', '.wcps-items-cart .quantity', function(){
17
+
18
+ quantity = $(this).val();
19
+
20
+ console.log(quantity);
21
+ $(this).next().attr('data-quantity', quantity);
22
+
23
+ })
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
  $(document).on('click', '.wcps-zoom-colse', function()
32
  {
33
 
assets/front/js/scripts.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){a(".wcps-items-cart p").prepend('<input value="1" class="quantity" type="number"> ');a(document).on("change",".wcps-items-cart .quantity",function(){quantity=a(this).val();console.log(quantity);a(this).next().attr("data-quantity",quantity)});a(document).on("click",".wcps-zoom-colse",function(){a(this).parent().fadeOut()});a(document).on("click",".wcps-zoom",function(){var c=a(this).attr("slider-id");var b=a(this).attr("product-id");jQuery.ajax({type:"POST",context:this,url:wcps_ajax.wcps_ajaxurl,data:{action:"wcps_get_item_thumb_url",product_id:b},success:function(d){jQuery(".wcps-zoom-thumb-"+c).fadeIn();jQuery(".wcps-zoom-thumb-"+c+" img").attr("src",d)}})})});
assets/front/js/wcps-builder.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function($) {
2
+
3
+
4
+ });
5
+
6
+
7
+
8
+
9
+
10
+
11
+
assets/global/css/font-awesome.min.css ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /*!
2
+ * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
3
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
assets/global/css/fontawesome-5.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-abacus:before{content:"\f640"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acorn:before{content:"\f6ae"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-alarm-clock:before{content:"\f34e"}.fa-algolia:before{content:"\f36c"}.fa-alicorn:before{content:"\f6b0"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-analytics:before{content:"\f643"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angel:before{content:"\f779"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-crate:before{content:"\f6b1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-alt-down:before{content:"\f354"}.fa-arrow-alt-from-bottom:before{content:"\f346"}.fa-arrow-alt-from-left:before{content:"\f347"}.fa-arrow-alt-from-right:before{content:"\f348"}.fa-arrow-alt-from-top:before{content:"\f349"}.fa-arrow-alt-left:before{content:"\f355"}.fa-arrow-alt-right:before{content:"\f356"}.fa-arrow-alt-square-down:before{content:"\f350"}.fa-arrow-alt-square-left:before{content:"\f351"}.fa-arrow-alt-square-right:before{content:"\f352"}.fa-arrow-alt-square-up:before{content:"\f353"}.fa-arrow-alt-to-bottom:before{content:"\f34a"}.fa-arrow-alt-to-left:before{content:"\f34b"}.fa-arrow-alt-to-right:before{content:"\f34c"}.fa-arrow-alt-to-top:before{content:"\f34d"}.fa-arrow-alt-up:before{content:"\f357"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-from-bottom:before{content:"\f342"}.fa-arrow-from-left:before{content:"\f343"}.fa-arrow-from-right:before{content:"\f344"}.fa-arrow-from-top:before{content:"\f345"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-square-down:before{content:"\f339"}.fa-arrow-square-left:before{content:"\f33a"}.fa-arrow-square-right:before{content:"\f33b"}.fa-arrow-square-up:before{content:"\f33c"}.fa-arrow-to-bottom:before{content:"\f33d"}.fa-arrow-to-left:before{content:"\f33e"}.fa-arrow-to-right:before{content:"\f340"}.fa-arrow-to-top:before{content:"\f341"}.fa-arrow-up:before{content:"\f062"}.fa-arrows:before{content:"\f047"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-arrows-h:before{content:"\f07e"}.fa-arrows-v:before{content:"\f07d"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-atom-alt:before{content:"\f5d3"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-axe:before{content:"\f6b2"}.fa-axe-battle:before{content:"\f6b3"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backpack:before{content:"\f5d4"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-badge:before{content:"\f335"}.fa-badge-check:before{content:"\f336"}.fa-badge-dollar:before{content:"\f645"}.fa-badge-percent:before{content:"\f646"}.fa-badger-honey:before{content:"\f6b4"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ball-pile:before{content:"\f77e"}.fa-ballot:before{content:"\f732"}.fa-ballot-check:before{content:"\f733"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-barcode-alt:before{content:"\f463"}.fa-barcode-read:before{content:"\f464"}.fa-barcode-scan:before{content:"\f465"}.fa-bars:before{content:"\f0c9"}.fa-baseball:before{content:"\f432"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-basketball-hoop:before{content:"\f435"}.fa-bat:before{content:"\f6b5"}.fa-bath:before{content:"\f2cd"}.fa-battery-bolt:before{content:"\f376"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-slash:before{content:"\f377"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-school:before{content:"\f5d5"}.fa-bell-school-slash:before{content:"\f5d6"}.fa-bell-slash:before{content:"\f1f6"}.fa-bells:before{content:"\f77f"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blanket:before{content:"\f498"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bone-break:before{content:"\f5d8"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-alt:before{content:"\f5d9"}.fa-book-dead:before{content:"\f6b7"}.fa-book-heart:before{content:"\f499"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-book-spells:before{content:"\f6b8"}.fa-book-user:before{content:"\f7e7"}.fa-bookmark:before{content:"\f02e"}.fa-books:before{content:"\f5db"}.fa-books-medical:before{content:"\f7e8"}.fa-boot:before{content:"\f782"}.fa-booth-curtain:before{content:"\f734"}.fa-bow-arrow:before{content:"\f6b9"}.fa-bowling-ball:before{content:"\f436"}.fa-bowling-pins:before{content:"\f437"}.fa-box:before{content:"\f466"}.fa-box-alt:before{content:"\f49a"}.fa-box-ballot:before{content:"\f735"}.fa-box-check:before{content:"\f467"}.fa-box-fragile:before{content:"\f49b"}.fa-box-full:before{content:"\f49c"}.fa-box-heart:before{content:"\f49d"}.fa-box-open:before{content:"\f49e"}.fa-box-up:before{content:"\f49f"}.fa-box-usd:before{content:"\f4a0"}.fa-boxes:before{content:"\f468"}.fa-boxes-alt:before{content:"\f4a1"}.fa-boxing-glove:before{content:"\f438"}.fa-brackets:before{content:"\f7e9"}.fa-brackets-curly:before{content:"\f7ea"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-loaf:before{content:"\f7eb"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-browser:before{content:"\f37e"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-bullseye-arrow:before{content:"\f648"}.fa-bullseye-pointer:before{content:"\f649"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-burrito:before{content:"\f7ed"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-bus-school:before{content:"\f5dd"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-cabinet-filing:before{content:"\f64b"}.fa-calculator:before{content:"\f1ec"}.fa-calculator-alt:before{content:"\f64c"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-edit:before{content:"\f333"}.fa-calendar-exclamation:before{content:"\f334"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-star:before{content:"\f736"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-alt:before{content:"\f332"}.fa-camera-retro:before{content:"\f083"}.fa-campfire:before{content:"\f6ba"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candle-holder:before{content:"\f6bc"}.fa-candy-cane:before{content:"\f786"}.fa-candy-corn:before{content:"\f6bd"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-bump:before{content:"\f5e0"}.fa-car-crash:before{content:"\f5e1"}.fa-car-garage:before{content:"\f5e2"}.fa-car-mechanic:before{content:"\f5e3"}.fa-car-side:before{content:"\f5e4"}.fa-car-tilt:before{content:"\f5e5"}.fa-car-wash:before{content:"\f5e6"}.fa-caret-circle-down:before{content:"\f32d"}.fa-caret-circle-left:before{content:"\f32e"}.fa-caret-circle-right:before{content:"\f330"}.fa-caret-circle-up:before{content:"\f331"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cauldron:before{content:"\f6bf"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chair-office:before{content:"\f6c1"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-line-down:before{content:"\f64d"}.fa-chart-network:before{content:"\f78a"}.fa-chart-pie:before{content:"\f200"}.fa-chart-pie-alt:before{content:"\f64e"}.fa-chart-scatter:before{content:"\f7ee"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-cheese-swiss:before{content:"\f7f0"}.fa-cheeseburger:before{content:"\f7f1"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-bishop-alt:before{content:"\f43b"}.fa-chess-board:before{content:"\f43c"}.fa-chess-clock:before{content:"\f43d"}.fa-chess-clock-alt:before{content:"\f43e"}.fa-chess-king:before{content:"\f43f"}.fa-chess-king-alt:before{content:"\f440"}.fa-chess-knight:before{content:"\f441"}.fa-chess-knight-alt:before{content:"\f442"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-pawn-alt:before{content:"\f444"}.fa-chess-queen:before{content:"\f445"}.fa-chess-queen-alt:before{content:"\f446"}.fa-chess-rook:before{content:"\f447"}.fa-chess-rook-alt:before{content:"\f448"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-double-down:before{content:"\f322"}.fa-chevron-double-left:before{content:"\f323"}.fa-chevron-double-right:before{content:"\f324"}.fa-chevron-double-up:before{content:"\f325"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-square-down:before{content:"\f329"}.fa-chevron-square-left:before{content:"\f32a"}.fa-chevron-square-right:before{content:"\f32b"}.fa-chevron-square-up:before{content:"\f32c"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chimney:before{content:"\f78b"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-claw-marks:before{content:"\f6c2"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-list-check:before{content:"\f737"}.fa-clipboard-prescription:before{content:"\f5e8"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-drizzle:before{content:"\f738"}.fa-cloud-hail:before{content:"\f739"}.fa-cloud-hail-mixed:before{content:"\f73a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-rainbow:before{content:"\f73e"}.fa-cloud-showers:before{content:"\f73f"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sleet:before{content:"\f741"}.fa-cloud-snow:before{content:"\f742"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-clouds:before{content:"\f744"}.fa-clouds-moon:before{content:"\f745"}.fa-clouds-sun:before{content:"\f746"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-club:before{content:"\f327"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-merge:before{content:"\f387"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-coffee-togo:before{content:"\f6c5"}.fa-coffin:before{content:"\f6c6"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-alt-check:before{content:"\f4a2"}.fa-comment-alt-dollar:before{content:"\f650"}.fa-comment-alt-dots:before{content:"\f4a3"}.fa-comment-alt-edit:before{content:"\f4a4"}.fa-comment-alt-exclamation:before{content:"\f4a5"}.fa-comment-alt-lines:before{content:"\f4a6"}.fa-comment-alt-medical:before{content:"\f7f4"}.fa-comment-alt-minus:before{content:"\f4a7"}.fa-comment-alt-plus:before{content:"\f4a8"}.fa-comment-alt-slash:before{content:"\f4a9"}.fa-comment-alt-smile:before{content:"\f4aa"}.fa-comment-alt-times:before{content:"\f4ab"}.fa-comment-check:before{content:"\f4ac"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-edit:before{content:"\f4ae"}.fa-comment-exclamation:before{content:"\f4af"}.fa-comment-lines:before{content:"\f4b0"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-minus:before{content:"\f4b1"}.fa-comment-plus:before{content:"\f4b2"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-smile:before{content:"\f4b4"}.fa-comment-times:before{content:"\f4b5"}.fa-comments:before{content:"\f086"}.fa-comments-alt:before{content:"\f4b6"}.fa-comments-alt-dollar:before{content:"\f652"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-slash:before{content:"\f5e9"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-compress-wide:before{content:"\f326"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-container-storage:before{content:"\f4b7"}.fa-contao:before{content:"\f26d"}.fa-conveyor-belt:before{content:"\f46e"}.fa-conveyor-belt-alt:before{content:"\f46f"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-corn:before{content:"\f6c7"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-credit-card-blank:before{content:"\f389"}.fa-credit-card-front:before{content:"\f38a"}.fa-cricket:before{content:"\f449"}.fa-critical-role:before{content:"\f6c9"}.fa-croissant:before{content:"\f7f6"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-crutches:before{content:"\f7f8"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-curling:before{content:"\f44a"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dagger:before{content:"\f6cb"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-debug:before{content:"\f7f9"}.fa-deer:before{content:"\f78e"}.fa-deer-rudolph:before{content:"\f78f"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-desktop-alt:before{content:"\f390"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dewpoint:before{content:"\f748"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diamond:before{content:"\f219"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d10:before{content:"\f6cd"}.fa-dice-d12:before{content:"\f6ce"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d4:before{content:"\f6d0"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-d8:before{content:"\f6d2"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-diploma:before{content:"\f5ea"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-do-not-enter:before{content:"\f5ec"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dog-leashed:before{content:"\f6d4"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-empty:before{content:"\f473"}.fa-dolly-flatbed:before{content:"\f474"}.fa-dolly-flatbed-alt:before{content:"\f475"}.fa-dolly-flatbed-empty:before{content:"\f476"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-circle:before{content:"\f5ed"}.fa-draw-polygon:before{content:"\f5ee"}.fa-draw-square:before{content:"\f5ef"}.fa-dreidel:before{content:"\f792"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick:before{content:"\f6d6"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-duck:before{content:"\f6d8"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-ear:before{content:"\f5f0"}.fa-ear-muffs:before{content:"\f795"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-eclipse:before{content:"\f749"}.fa-eclipse-alt:before{content:"\f74a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-egg-fried:before{content:"\f7fc"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-elephant:before{content:"\f6da"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-h-alt:before{content:"\f39b"}.fa-ellipsis-v:before{content:"\f142"}.fa-ellipsis-v-alt:before{content:"\f39c"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-empty-set:before{content:"\f656"}.fa-engine-warning:before{content:"\f5f2"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-dollar:before{content:"\f657"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange:before{content:"\f0ec"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-square:before{content:"\f321"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows:before{content:"\f31d"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expand-wide:before{content:"\f320"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link:before{content:"\f08e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square:before{content:"\f14c"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-evil:before{content:"\f6db"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-field-hockey:before{content:"\f44c"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-certificate:before{content:"\f5f3"}.fa-file-chart-line:before{content:"\f659"}.fa-file-chart-pie:before{content:"\f65a"}.fa-file-check:before{content:"\f316"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-edit:before{content:"\f31c"}.fa-file-excel:before{content:"\f1c3"}.fa-file-exclamation:before{content:"\f31a"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-minus:before{content:"\f318"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-plus:before{content:"\f319"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-spreadsheet:before{content:"\f65b"}.fa-file-times:before{content:"\f317"}.fa-file-upload:before{content:"\f574"}.fa-file-user:before{content:"\f65c"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-files-medical:before{content:"\f7fd"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-film-alt:before{content:"\f3a0"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-smoke:before{content:"\f74b"}.fa-firefox:before{content:"\f269"}.fa-fireplace:before{content:"\f79a"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fish-cooked:before{content:"\f7fe"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-alt:before{content:"\f74c"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flame:before{content:"\f6df"}.fa-flask:before{content:"\f0c3"}.fa-flask-poison:before{content:"\f6e0"}.fa-flask-potion:before{content:"\f6e1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flower:before{content:"\f7ff"}.fa-flower-daffodil:before{content:"\f800"}.fa-flower-tulip:before{content:"\f801"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-fog:before{content:"\f74e"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-times:before{content:"\f65f"}.fa-folder-tree:before{content:"\f802"}.fa-folders:before{content:"\f660"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-football-helmet:before{content:"\f44f"}.fa-forklift:before{content:"\f47a"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-fragile:before{content:"\f4bb"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-french-fries:before{content:"\f803"}.fa-frog:before{content:"\f52e"}.fa-frosty-head:before{content:"\f79b"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-function:before{content:"\f661"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gas-pump-slash:before{content:"\f5f4"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gift-card:before{content:"\f663"}.fa-gifts:before{content:"\f79c"}.fa-gingerbread-man:before{content:"\f79d"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass:before{content:"\f804"}.fa-glass-champagne:before{content:"\f79e"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glass-whiskey-rocks:before{content:"\f7a1"}.fa-glasses:before{content:"\f530"}.fa-glasses-alt:before{content:"\f5f5"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-globe-snow:before{content:"\f7a3"}.fa-globe-stand:before{content:"\f5f6"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-golf-club:before{content:"\f451"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-h1:before{content:"\f313"}.fa-h2:before{content:"\f314"}.fa-h3:before{content:"\f315"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hammer-war:before{content:"\f6e4"}.fa-hamsa:before{content:"\f665"}.fa-hand-heart:before{content:"\f4bc"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-box:before{content:"\f47b"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-magic:before{content:"\f6e5"}.fa-hand-holding-seedling:before{content:"\f4bf"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-receiving:before{content:"\f47c"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-heart:before{content:"\f4c3"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-usd:before{content:"\f4c5"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt:before{content:"\f4c6"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-santa:before{content:"\f7a7"}.fa-hat-winter:before{content:"\f7a8"}.fa-hat-witch:before{content:"\f6e7"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-head-side:before{content:"\f6e9"}.fa-head-side-brain:before{content:"\f808"}.fa-head-side-medical:before{content:"\f809"}.fa-head-vr:before{content:"\f6ea"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heart-circle:before{content:"\f4c7"}.fa-heart-rate:before{content:"\f5f8"}.fa-heart-square:before{content:"\f4c8"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-helmet-battle:before{content:"\f6eb"}.fa-hexagon:before{content:"\f312"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-mask:before{content:"\f6ee"}.fa-hockey-puck:before{content:"\f453"}.fa-hockey-sticks:before{content:"\f454"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-home-alt:before{content:"\f80a"}.fa-home-heart:before{content:"\f4c9"}.fa-home-lg:before{content:"\f80b"}.fa-home-lg-alt:before{content:"\f80c"}.fa-hood-cloak:before{content:"\f6ef"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hospitals:before{content:"\f80e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-flood:before{content:"\f74f"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-humidity:before{content:"\f750"}.fa-hurricane:before{content:"\f751"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-ice-skate:before{content:"\f7ac"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-inbox-in:before{content:"\f310"}.fa-inbox-out:before{content:"\f311"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-industry-alt:before{content:"\f3b3"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-info-square:before{content:"\f30f"}.fa-inhaler:before{content:"\f5f9"}.fa-instagram:before{content:"\f16d"}.fa-integral:before{content:"\f667"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-intersection:before{content:"\f668"}.fa-inventory:before{content:"\f480"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-island-tropical:before{content:"\f811"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jack-o-lantern:before{content:"\f30e"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-key-skeleton:before{content:"\f6f3"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-keynote:before{content:"\f66c"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kidneys:before{content:"\f5fb"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kite:before{content:"\f6f4"}.fa-kiwi-bird:before{content:"\f535"}.fa-knife-kitchen:before{content:"\f6f5"}.fa-korvue:before{content:"\f42f"}.fa-lambda:before{content:"\f66e"}.fa-lamp:before{content:"\f4ca"}.fa-landmark:before{content:"\f66f"}.fa-landmark-alt:before{content:"\f752"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-layer-minus:before{content:"\f5fe"}.fa-layer-plus:before{content:"\f5ff"}.fa-leaf:before{content:"\f06c"}.fa-leaf-heart:before{content:"\f4cb"}.fa-leaf-maple:before{content:"\f6f6"}.fa-leaf-oak:before{content:"\f6f7"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down:before{content:"\f149"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up:before{content:"\f148"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-lightbulb-dollar:before{content:"\f670"}.fa-lightbulb-exclamation:before{content:"\f671"}.fa-lightbulb-on:before{content:"\f672"}.fa-lightbulb-slash:before{content:"\f673"}.fa-lights-holiday:before{content:"\f7b2"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lips:before{content:"\f600"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location:before{content:"\f601"}.fa-location-arrow:before{content:"\f124"}.fa-location-circle:before{content:"\f602"}.fa-location-slash:before{content:"\f603"}.fa-lock:before{content:"\f023"}.fa-lock-alt:before{content:"\f30d"}.fa-lock-open:before{content:"\f3c1"}.fa-lock-open-alt:before{content:"\f3c2"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-long-arrow-up:before{content:"\f176"}.fa-loveseat:before{content:"\f4cc"}.fa-low-vision:before{content:"\f2a8"}.fa-luchador:before{content:"\f455"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lyft:before{content:"\f3c3"}.fa-mace:before{content:"\f6f8"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailbox:before{content:"\f813"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-mandolin:before{content:"\f6f9"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-marker-alt-slash:before{content:"\f605"}.fa-map-marker-check:before{content:"\f606"}.fa-map-marker-edit:before{content:"\f607"}.fa-map-marker-exclamation:before{content:"\f608"}.fa-map-marker-minus:before{content:"\f609"}.fa-map-marker-plus:before{content:"\f60a"}.fa-map-marker-question:before{content:"\f60b"}.fa-map-marker-slash:before{content:"\f60c"}.fa-map-marker-smile:before{content:"\f60d"}.fa-map-marker-times:before{content:"\f60e"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-meat:before{content:"\f814"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaphone:before{content:"\f675"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-mind-share:before{content:"\f677"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-hexagon:before{content:"\f307"}.fa-minus-octagon:before{content:"\f308"}.fa-minus-square:before{content:"\f146"}.fa-mistletoe:before{content:"\f7b4"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-mobile-android:before{content:"\f3ce"}.fa-mobile-android-alt:before{content:"\f3cf"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monitor-heart-rate:before{content:"\f611"}.fa-monkey:before{content:"\f6fb"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-moon-cloud:before{content:"\f754"}.fa-moon-stars:before{content:"\f755"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mountains:before{content:"\f6fd"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-mug-marshmallows:before{content:"\f7b7"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-narwhal:before{content:"\f6fe"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octagon:before{content:"\f306"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-oil-temp:before{content:"\f614"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-omega:before{content:"\f67a"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-ornament:before{content:"\f7b8"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-brush-alt:before{content:"\f5a9"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-pallet-alt:before{content:"\f483"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-parking-circle:before{content:"\f615"}.fa-parking-circle-slash:before{content:"\f616"}.fa-parking-slash:before{content:"\f617"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paw-alt:before{content:"\f701"}.fa-paw-claws:before{content:"\f702"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pegasus:before{content:"\f703"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil:before{content:"\f040"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-paintbrush:before{content:"\f618"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-pennant:before{content:"\f456"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-person-carry:before{content:"\f4cf"}.fa-person-dolly:before{content:"\f4d0"}.fa-person-dolly-empty:before{content:"\f4d1"}.fa-person-sign:before{content:"\f757"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-office:before{content:"\f67d"}.fa-phone-plus:before{content:"\f4d2"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pi:before{content:"\f67e"}.fa-pie:before{content:"\f705"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pig:before{content:"\f706"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza:before{content:"\f817"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-alt:before{content:"\f3de"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-hexagon:before{content:"\f300"}.fa-plus-octagon:before{content:"\f301"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-podium:before{content:"\f680"}.fa-podium-star:before{content:"\f758"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poll-people:before{content:"\f759"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-popcorn:before{content:"\f819"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-presentation:before{content:"\f685"}.fa-print:before{content:"\f02f"}.fa-print-search:before{content:"\f81a"}.fa-print-slash:before{content:"\f686"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pumpkin:before{content:"\f707"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-question-square:before{content:"\f2fd"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-rabbit:before{content:"\f708"}.fa-rabbit-fast:before{content:"\f709"}.fa-racquet:before{content:"\f45a"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-raindrops:before{content:"\f75c"}.fa-ram:before{content:"\f70a"}.fa-ramp-loading:before{content:"\f4d4"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-rectangle-landscape:before{content:"\f2fa"}.fa-rectangle-portrait:before{content:"\f2fb"}.fa-rectangle-wide:before{content:"\f2fc"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-repeat:before{content:"\f363"}.fa-repeat-1:before{content:"\f365"}.fa-repeat-1-alt:before{content:"\f366"}.fa-repeat-alt:before{content:"\f364"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-retweet-alt:before{content:"\f361"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-rings-wedding:before{content:"\f81b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-route-highway:before{content:"\f61a"}.fa-route-interstate:before{content:"\f61b"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-triangle:before{content:"\f61c"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rv:before{content:"\f7be"}.fa-sack:before{content:"\f81c"}.fa-sack-dollar:before{content:"\f81d"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salad:before{content:"\f81e"}.fa-sandwich:before{content:"\f81f"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-sausage:before{content:"\f820"}.fa-save:before{content:"\f0c7"}.fa-scalpel:before{content:"\f61d"}.fa-scalpel-path:before{content:"\f61e"}.fa-scanner:before{content:"\f488"}.fa-scanner-keyboard:before{content:"\f489"}.fa-scanner-touchscreen:before{content:"\f48a"}.fa-scarecrow:before{content:"\f70d"}.fa-scarf:before{content:"\f7c1"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-scroll-old:before{content:"\f70f"}.fa-scrubber:before{content:"\f2f8"}.fa-scythe:before{content:"\f710"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-all:before{content:"\f367"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-sheep:before{content:"\f711"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield:before{content:"\f132"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-check:before{content:"\f2f7"}.fa-shield-cross:before{content:"\f712"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shipping-timed:before{content:"\f48c"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shish-kebab:before{content:"\f821"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shovel:before{content:"\f713"}.fa-shovel-snow:before{content:"\f7c3"}.fa-shower:before{content:"\f2cc"}.fa-shredder:before{content:"\f68a"}.fa-shuttle-van:before{content:"\f5b6"}.fa-shuttlecock:before{content:"\f45b"}.fa-sickle:before{content:"\f822"}.fa-sigma:before{content:"\f68b"}.fa-sign:before{content:"\f4d9"}.fa-sign-in:before{content:"\f090"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out:before{content:"\f08b"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signal-1:before{content:"\f68c"}.fa-signal-2:before{content:"\f68d"}.fa-signal-3:before{content:"\f68e"}.fa-signal-4:before{content:"\f68f"}.fa-signal-alt:before{content:"\f690"}.fa-signal-alt-1:before{content:"\f691"}.fa-signal-alt-2:before{content:"\f692"}.fa-signal-alt-3:before{content:"\f693"}.fa-signal-alt-slash:before{content:"\f694"}.fa-signal-slash:before{content:"\f695"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-skeleton:before{content:"\f620"}.fa-sketch:before{content:"\f7c6"}.fa-ski-jump:before{content:"\f7c7"}.fa-ski-lift:before{content:"\f7c8"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sledding:before{content:"\f7cb"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-sliders-h-square:before{content:"\f3f0"}.fa-sliders-v:before{content:"\f3f1"}.fa-sliders-v-square:before{content:"\f3f2"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-plus:before{content:"\f5b9"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoke:before{content:"\f760"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snake:before{content:"\f716"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snow-blowing:before{content:"\f761"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowflakes:before{content:"\f7cf"}.fa-snowman:before{content:"\f7d0"}.fa-snowmobile:before{content:"\f7d1"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-soup:before{content:"\f823"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-spade:before{content:"\f2f4"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spider-black-widow:before{content:"\f718"}.fa-spider-web:before{content:"\f719"}.fa-spinner:before{content:"\f110"}.fa-spinner-third:before{content:"\f3f4"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root:before{content:"\f697"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-squirrel:before{content:"\f71a"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-staff:before{content:"\f71b"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-christmas:before{content:"\f7d4"}.fa-star-exclamation:before{content:"\f2f3"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-stars:before{content:"\f762"}.fa-staylinked:before{content:"\f3f5"}.fa-steak:before{content:"\f824"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-steering-wheel:before{content:"\f622"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stocking:before{content:"\f7d5"}.fa-stomach:before{content:"\f623"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-stretcher:before{content:"\f825"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-cloud:before{content:"\f763"}.fa-sun-dust:before{content:"\f764"}.fa-sun-haze:before{content:"\f765"}.fa-sunrise:before{content:"\f766"}.fa-sunset:before{content:"\f767"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sword:before{content:"\f71c"}.fa-swords:before{content:"\f71d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablet-android:before{content:"\f3fb"}.fa-tablet-android-alt:before{content:"\f3fc"}.fa-tablet-rugged:before{content:"\f48f"}.fa-tablets:before{content:"\f490"}.fa-tachometer:before{content:"\f0e4"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tachometer-alt-average:before{content:"\f624"}.fa-tachometer-alt-fast:before{content:"\f625"}.fa-tachometer-alt-fastest:before{content:"\f626"}.fa-tachometer-alt-slow:before{content:"\f627"}.fa-tachometer-alt-slowest:before{content:"\f628"}.fa-tachometer-average:before{content:"\f629"}.fa-tachometer-fast:before{content:"\f62a"}.fa-tachometer-fastest:before{content:"\f62b"}.fa-tachometer-slow:before{content:"\f62c"}.fa-tachometer-slowest:before{content:"\f62d"}.fa-taco:before{content:"\f826"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tally:before{content:"\f69c"}.fa-tanakh:before{content:"\f827"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-tasks-alt:before{content:"\f828"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-frigid:before{content:"\f768"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-hot:before{content:"\f76a"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-tennis-ball:before{content:"\f45e"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-theta:before{content:"\f69e"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-thunderstorm:before{content:"\f76c"}.fa-thunderstorm-moon:before{content:"\f76d"}.fa-thunderstorm-sun:before{content:"\f76e"}.fa-ticket:before{content:"\f145"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tilde:before{content:"\f69f"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-times-hexagon:before{content:"\f2ee"}.fa-times-octagon:before{content:"\f2f0"}.fa-times-square:before{content:"\f2d3"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tire:before{content:"\f631"}.fa-tire-flat:before{content:"\f632"}.fa-tire-pressure-warning:before{content:"\f633"}.fa-tire-rugged:before{content:"\f634"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-alt:before{content:"\f71f"}.fa-tombstone:before{content:"\f720"}.fa-tombstone-alt:before{content:"\f721"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-toothbrush:before{content:"\f635"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-cone:before{content:"\f636"}.fa-traffic-light:before{content:"\f637"}.fa-traffic-light-go:before{content:"\f638"}.fa-traffic-light-slow:before{content:"\f639"}.fa-traffic-light-stop:before{content:"\f63a"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-treasure-chest:before{content:"\f723"}.fa-tree:before{content:"\f1bb"}.fa-tree-alt:before{content:"\f400"}.fa-tree-christmas:before{content:"\f7db"}.fa-tree-decorated:before{content:"\f7dc"}.fa-tree-large:before{content:"\f7dd"}.fa-tree-palm:before{content:"\f82b"}.fa-trees:before{content:"\f724"}.fa-trello:before{content:"\f181"}.fa-triangle:before{content:"\f2ec"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-trophy-alt:before{content:"\f2eb"}.fa-truck:before{content:"\f0d1"}.fa-truck-container:before{content:"\f4dc"}.fa-truck-couch:before{content:"\f4dd"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plow:before{content:"\f7de"}.fa-truck-ramp:before{content:"\f4e0"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-turkey:before{content:"\f725"}.fa-turtle:before{content:"\f726"}.fa-tv:before{content:"\f26c"}.fa-tv-retro:before{content:"\f401"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-unicorn:before{content:"\f727"}.fa-union:before{content:"\f6a2"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usd-circle:before{content:"\f2e8"}.fa-usd-square:before{content:"\f2e9"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-chart:before{content:"\f6a3"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-crown:before{content:"\f6a4"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-hard-hat:before{content:"\f82c"}.fa-user-headset:before{content:"\f82d"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-md-chat:before{content:"\f82e"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-class:before{content:"\f63d"}.fa-users-cog:before{content:"\f509"}.fa-users-crown:before{content:"\f6a5"}.fa-users-medical:before{content:"\f830"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-fork:before{content:"\f2e3"}.fa-utensil-knife:before{content:"\f2e4"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-utensils-alt:before{content:"\f2e6"}.fa-vaadin:before{content:"\f408"}.fa-value-absolute:before{content:"\f6a6"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-plus:before{content:"\f4e1"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volcano:before{content:"\f770"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume:before{content:"\f6a8"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-slash:before{content:"\f2e2"}.fa-volume-up:before{content:"\f028"}.fa-vote-nay:before{content:"\f771"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walker:before{content:"\f831"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-wand:before{content:"\f72a"}.fa-wand-magic:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-warehouse-alt:before{content:"\f495"}.fa-watch:before{content:"\f2e1"}.fa-watch-fitness:before{content:"\f63e"}.fa-water:before{content:"\f773"}.fa-water-lower:before{content:"\f774"}.fa-water-rise:before{content:"\f775"}.fa-webcam:before{content:"\f832"}.fa-webcam-slash:before{content:"\f833"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whale:before{content:"\f72c"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheat:before{content:"\f72d"}.fa-wheelchair:before{content:"\f193"}.fa-whistle:before{content:"\f460"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wifi-1:before{content:"\f6aa"}.fa-wifi-2:before{content:"\f6ab"}.fa-wifi-slash:before{content:"\f6ac"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-wind-warning:before{content:"\f776"}.fa-window:before{content:"\f40e"}.fa-window-alt:before{content:"\f40f"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-windsock:before{content:"\f777"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wreath:before{content:"\f7e2"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:300;font-display:auto;src:url(../webfonts/fa-light-300.eot);src:url(../webfonts/fa-light-300.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.woff) format("woff"),url(../webfonts/fa-light-300.ttf) format("truetype"),url(../webfonts/fa-light-300.svg#fontawesome) format("svg")}.fal{font-weight:300}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fal,.far{font-family:"Font Awesome 5 Pro"}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Pro";font-weight:900}
assets/global/css/style.themes.css CHANGED
@@ -21,7 +21,8 @@
21
 
22
  overflow: hidden;
23
  padding: 0;
24
- perspective: 600px;
 
25
  position: relative;
26
  vertical-align: top;
27
  width: 100%;
@@ -29,20 +30,26 @@
29
 
30
  .skin.flip-x:hover .layer-media {
31
 
32
- transform: rotateX(180deg);
 
 
33
  z-index: 900;
34
  }
35
 
36
 
37
  .skin.flip-x .layer-media {
38
- backface-visibility: hidden;
 
39
  float: none;
40
  height: inherit;
41
  left: 0;
42
  text-align: center;
43
  top: 0;
44
- transform: rotateX(0deg) rotateY(0deg);
45
- transform-style: preserve-3d;
 
 
 
46
  transition: all 0.4s ease-in-out 0s;
47
  width: inherit;
48
  z-index: 900;
@@ -50,20 +57,26 @@
50
 
51
  .skin.flip-x:hover .layer-content {
52
 
53
- transform: rotateX(0deg) rotateY(0deg);
 
 
54
  z-index: 1000;
55
  }
56
 
57
  .skin.flip-x .layer-content {
58
- backface-visibility: hidden;
 
59
  float: none;
60
  height: inherit;
61
  left: 0;
62
  padding: 0;
63
  position: absolute;
64
  top: 0;
65
- transform: rotateX(-179deg);
66
- transform-style: preserve-3d;
 
 
 
67
  transition: all 0.4s ease-in-out 0s;
68
  width: inherit;
69
  z-index: 800;
@@ -79,27 +92,33 @@
79
  .skin.flip-y {
80
  overflow: hidden;
81
  padding: 0;
82
- perspective: 600px;
 
83
  position: relative;
84
  vertical-align: top;
85
  width: 100%;
86
  }
87
 
88
  .skin.flip-y:hover .layer-media {
89
- transform: rotateY(180deg);
 
90
  z-index: 900;
91
  }
92
 
93
 
94
  .skin.flip-y .layer-media {
95
- backface-visibility: hidden;
 
96
  float: none;
97
  height: inherit;
98
  left: 0;
99
  text-align: center;
100
  top: 0;
101
- transform: rotateX(0deg) rotateY(0deg);
102
- transform-style: preserve-3d;
 
 
 
103
  transition: all 0.4s ease-in-out 0s;
104
  width: inherit;
105
  z-index: 900;
@@ -107,19 +126,25 @@
107
 
108
  .skin.flip-y:hover .layer-content {
109
 
110
- transform: rotateX(0deg) rotateY(0deg);
 
 
111
  z-index: 1000;
112
  }
113
 
114
  .skin.flip-y .layer-content {
115
- backface-visibility: hidden;
 
116
  float: none;
117
  height: inherit;
118
  left: 0;
119
  position: absolute;
120
  top: 0;
121
- transform: rotateY(-179deg);
122
- transform-style: preserve-3d;
 
 
 
123
  transition: all 0.4s ease-in-out 0s;
124
  width: inherit;
125
  z-index: 800;
21
 
22
  overflow: hidden;
23
  padding: 0;
24
+ -webkit-perspective: 600px;
25
+ perspective: 600px;
26
  position: relative;
27
  vertical-align: top;
28
  width: 100%;
30
 
31
  .skin.flip-x:hover .layer-media {
32
 
33
+ -webkit-transform: rotateX(180deg);
34
+
35
+ transform: rotateX(180deg);
36
  z-index: 900;
37
  }
38
 
39
 
40
  .skin.flip-x .layer-media {
41
+ -webkit-backface-visibility: hidden;
42
+ backface-visibility: hidden;
43
  float: none;
44
  height: inherit;
45
  left: 0;
46
  text-align: center;
47
  top: 0;
48
+ -webkit-transform: rotateX(0deg) rotateY(0deg);
49
+ transform: rotateX(0deg) rotateY(0deg);
50
+ -webkit-transform-style: preserve-3d;
51
+ transform-style: preserve-3d;
52
+ -webkit-transition: all 0.4s ease-in-out 0s;
53
  transition: all 0.4s ease-in-out 0s;
54
  width: inherit;
55
  z-index: 900;
57
 
58
  .skin.flip-x:hover .layer-content {
59
 
60
+ -webkit-transform: rotateX(0deg) rotateY(0deg);
61
+
62
+ transform: rotateX(0deg) rotateY(0deg);
63
  z-index: 1000;
64
  }
65
 
66
  .skin.flip-x .layer-content {
67
+ -webkit-backface-visibility: hidden;
68
+ backface-visibility: hidden;
69
  float: none;
70
  height: inherit;
71
  left: 0;
72
  padding: 0;
73
  position: absolute;
74
  top: 0;
75
+ -webkit-transform: rotateX(-179deg);
76
+ transform: rotateX(-179deg);
77
+ -webkit-transform-style: preserve-3d;
78
+ transform-style: preserve-3d;
79
+ -webkit-transition: all 0.4s ease-in-out 0s;
80
  transition: all 0.4s ease-in-out 0s;
81
  width: inherit;
82
  z-index: 800;
92
  .skin.flip-y {
93
  overflow: hidden;
94
  padding: 0;
95
+ -webkit-perspective: 600px;
96
+ perspective: 600px;
97
  position: relative;
98
  vertical-align: top;
99
  width: 100%;
100
  }
101
 
102
  .skin.flip-y:hover .layer-media {
103
+ -webkit-transform: rotateY(180deg);
104
+ transform: rotateY(180deg);
105
  z-index: 900;
106
  }
107
 
108
 
109
  .skin.flip-y .layer-media {
110
+ -webkit-backface-visibility: hidden;
111
+ backface-visibility: hidden;
112
  float: none;
113
  height: inherit;
114
  left: 0;
115
  text-align: center;
116
  top: 0;
117
+ -webkit-transform: rotateX(0deg) rotateY(0deg);
118
+ transform: rotateX(0deg) rotateY(0deg);
119
+ -webkit-transform-style: preserve-3d;
120
+ transform-style: preserve-3d;
121
+ -webkit-transition: all 0.4s ease-in-out 0s;
122
  transition: all 0.4s ease-in-out 0s;
123
  width: inherit;
124
  z-index: 900;
126
 
127
  .skin.flip-y:hover .layer-content {
128
 
129
+ -webkit-transform: rotateX(0deg) rotateY(0deg);
130
+
131
+ transform: rotateX(0deg) rotateY(0deg);
132
  z-index: 1000;
133
  }
134
 
135
  .skin.flip-y .layer-content {
136
+ -webkit-backface-visibility: hidden;
137
+ backface-visibility: hidden;
138
  float: none;
139
  height: inherit;
140
  left: 0;
141
  position: absolute;
142
  top: 0;
143
+ -webkit-transform: rotateY(-179deg);
144
+ transform: rotateY(-179deg);
145
+ -webkit-transform-style: preserve-3d;
146
+ transform-style: preserve-3d;
147
+ -webkit-transition: all 0.4s ease-in-out 0s;
148
  transition: all 0.4s ease-in-out 0s;
149
  width: inherit;
150
  z-index: 800;
assets/global/css/style.themes.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @charset "utf-8";.skin.flat{vertical-align:top}.skin.flat .layer-content{padding:5px 10px}.skin.flat .layer-hover{display:none}.skin.flip-x{overflow:hidden;padding:0;-webkit-perspective:600px;perspective:600px;position:relative;vertical-align:top;width:100%}.skin.flip-x:hover .layer-media{-webkit-transform:rotateX(180deg);transform:rotateX(180deg);z-index:900}.skin.flip-x .layer-media{-webkit-backface-visibility:hidden;backface-visibility:hidden;float:none;height:inherit;left:0;text-align:center;top:0;-webkit-transform:rotateX(0) rotateY(0);transform:rotateX(0) rotateY(0);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:all .4s ease-in-out 0;transition:all .4s ease-in-out 0;width:inherit;z-index:900}.skin.flip-x:hover .layer-content{-webkit-transform:rotateX(0) rotateY(0);transform:rotateX(0) rotateY(0);z-index:1000}.skin.flip-x .layer-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;float:none;height:inherit;left:0;padding:0;position:absolute;top:0;-webkit-transform:rotateX(-179deg);transform:rotateX(-179deg);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:all .4s ease-in-out 0;transition:all .4s ease-in-out 0;width:inherit;z-index:800}.skin.flip-x .layer-hover{display:none}.skin.flip-y{overflow:hidden;padding:0;-webkit-perspective:600px;perspective:600px;position:relative;vertical-align:top;width:100%}.skin.flip-y:hover .layer-media{-webkit-transform:rotateY(180deg);transform:rotateY(180deg);z-index:900}.skin.flip-y .layer-media{-webkit-backface-visibility:hidden;backface-visibility:hidden;float:none;height:inherit;left:0;text-align:center;top:0;-webkit-transform:rotateX(0) rotateY(0);transform:rotateX(0) rotateY(0);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:all .4s ease-in-out 0;transition:all .4s ease-in-out 0;width:inherit;z-index:900}.skin.flip-y:hover .layer-content{-webkit-transform:rotateX(0) rotateY(0);transform:rotateX(0) rotateY(0);z-index:1000}.skin.flip-y .layer-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;float:none;height:inherit;left:0;position:absolute;top:0;-webkit-transform:rotateY(-179deg);transform:rotateY(-179deg);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:all .4s ease-in-out 0;transition:all .4s ease-in-out 0;width:inherit;z-index:800}.skin.flip-y .layer-hover{display:none}.skin.zoomin{overflow:hidden;position:relative;vertical-align:top}.skin.zoomin:hover .layer-media{transform:scale(1.5);opacity:0}.skin.zoomin .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.zoomin:hover .layer-content{opacity:1}.skin.zoomin .layer-content{opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.zoomin .layer-hover{display:none}.skin.zoomout{overflow:hidden;position:relative;vertical-align:top}.skin.zoomout:hover .layer-media{transform:scale(0);opacity:0}.skin.zoomout .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.zoomout:hover .layer-content{opacity:1}.skin.zoomout .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.zoomout .layer-hover{display:none}.skin.spinright{overflow:hidden;position:relative;vertical-align:top}.skin.spinright:hover .layer-media{transform:rotate(30deg);opacity:0}.skin.spinright .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.spinright:hover .layer-content{opacity:1}.skin.spinright .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.spinright .layer-hover{display:none}.skin.spinrightzoom{overflow:hidden;position:relative;vertical-align:top}.skin.spinrightzoom:hover .layer-media{opacity:.6;transform:rotate(20deg) scale(1.5)}.skin.spinrightzoom .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.spinrightzoom:hover .layer-content{opacity:1}.skin.spinrightzoom .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.spinrightzoom .layer-hover{display:none}.skin.spinleft{overflow:hidden;position:relative;vertical-align:top}.skin.spinleft:hover .layer-media{transform:rotate(-30deg);opacity:0}.skin.spinleft .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.spinleft:hover .layer-content{opacity:1}.skin.spinleft .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.spinleft .layer-hover{display:none}.skin.spinleftzoom{overflow:hidden;position:relative;vertical-align:top}.skin.spinleftzoom:hover .layer-media{opacity:.7;transform:rotate(-30deg) scale(1.5)}.skin.spinleftzoom .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.spinleftzoom:hover .layer-content{opacity:1}.skin.spinleftzoom .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.spinleftzoom .layer-hover{display:none}.skin.spinrightfast{overflow:hidden;position:relative;vertical-align:top}.skin.spinrightfast:hover .layer-media{transform:rotate(180deg);opacity:0}.skin.spinrightfast .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.spinrightfast:hover .layer-content{opacity:1}.skin.spinrightfast .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.spinrightfast .layer-hover{display:none}.skin.spinleftfast{overflow:hidden;position:relative;vertical-align:top}.skin.spinleftfast:hover .layer-media{transform:rotate(-180deg);opacity:0}.skin.spinleftfast .layer-media{transition:all 1s ease 0;left:0;top:0;width:100%}.skin.spinleftfast:hover .layer-content{opacity:1}.skin.spinleftfast .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.spinleftfast .layer-hover{display:none}.skin.thumbgoleft{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgoleft:hover .layer-media{opacity:0;transform:scale(0.5) translateX(-100%)}.skin.thumbgoleft .layer-media{transition:all 1s ease 0;width:100%}.skin.thumbgoleft:hover .layer-content{opacity:1}.skin.thumbgoleft .layer-content{left:0;opacity:0;position:absolute;top:0;transition:all 1s ease 0}.skin.thumbgoleft .layer-hover{display:none}.skin.thumbgoright{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgoright:hover .layer-media{opacity:0;transform:scale(0.5) translateX(100%)}.skin.thumbgoright .layer-media{transition:all 1s ease 0;width:100%}.skin.thumbgoright:hover .layer-content{opacity:1}.skin.thumbgoright .layer-content{left:0;opacity:0;position:absolute;top:0;transition:all 1s ease 0}.skin.thumbgoright .layer-hover{display:none}.skin.thumbgotop{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgotop:hover .layer-media{opacity:0;top:-100%;transform:translateY(-100%) scale(0.6)}.skin.thumbgotop .layer-media{transition:all 1s ease 0;width:100%}.skin.thumbgotop:hover .layer-content{opacity:1}.skin.thumbgotop .layer-content{left:0;opacity:0;position:absolute;top:0;transition:all 1s ease 0}.skin.thumbgotop .layer-hover{display:none}.skin.thumbgobottom{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgobottom:hover .layer-media{bottom:-100%;opacity:0;transform:scale(0.5) translateY(100%)}.skin.thumbgobottom .layer-media{transition:all 1s ease 0;width:100%}.skin.thumbgobottom:hover .layer-content{opacity:1}.skin.thumbgobottom .layer-content{left:0;opacity:0;position:absolute;top:0;width:100%;transition:all 1s ease 0}.skin.thumbgobottom .layer-hover{display:none}.skin.thumbmiddle{overflow:hidden;position:relative;vertical-align:top}.skin.thumbmiddle:hover .layer-media{transform:scale(0.9);opacity:.3;z-index:9}.skin.thumbmiddle .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.thumbmiddle:hover .layer-content{opacity:1;z-index:10;transform:scale(0.9);padding:5px}.skin.thumbmiddle .layer-content{left:0;opacity:0;position:absolute;top:0;transition:all 1s ease 0;width:100%}.skin.thumbmiddle .layer-hover{display:none}.skin.thumbskew{overflow:hidden;position:relative;vertical-align:top}.skin.thumbskew:hover .layer-media{transform:scale(0.9) skew(5deg);opacity:.3;z-index:9}.skin.thumbskew .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.thumbskew:hover .layer-content{opacity:1;z-index:10;transform:scale(0.9);padding:5px}.skin.thumbskew .layer-content{left:0;opacity:0;position:absolute;top:0;transition:all 1s ease 0;width:100%}.skin.thumbskew .layer-hover{display:none}.skin.contentbottom{overflow:hidden;position:relative;vertical-align:top}.skin.contentbottom:hover .layer-media{z-index:9}.skin.contentbottom .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.contentbottom .layer-content{background:rgba(0,0,0,0.3) none repeat scroll 0 0;bottom:0;color:#fff;left:0;position:absolute;transition:all 1s ease 0;width:100%}.skin.contentbottom .layer-hover{display:none}.skin.contentmiddle{overflow:hidden;position:relative;vertical-align:top}.skin.contentmiddle:hover .layer-media{z-index:9}.skin.contentmiddle .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.contentmiddle .layer-content{background:rgba(0,0,0,0.3) none repeat scroll 0 0;bottom:50%;color:#fff;left:0;position:absolute;transform:translate(0,50%);width:100%}.skin.contentmiddle .layer-hover{display:none}.skin.contentinbottom{overflow:hidden;position:relative;vertical-align:top}.skin.contentinbottom:hover .layer-media{z-index:9}.skin.contentinbottom .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.contentinbottom:hover .layer-content{bottom:0}.skin.contentinbottom .layer-content{background:rgba(0,0,0,0.3) none repeat scroll 0 0;bottom:-100%;color:#fff;left:0;position:absolute;transition:all .5s ease 0;width:100%}.skin.contentinbottom .layer-hover{display:none}.skin.contentinleft{overflow:hidden;position:relative;vertical-align:top}.skin.contentinleft:hover .layer-media{z-index:9}.skin.contentinleft .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.contentinleft:hover .layer-content{left:0}.skin.contentinleft .layer-content{background:rgba(0,0,0,0.3) none repeat scroll 0 0;color:#fff;height:100%;left:-100%;position:absolute;top:0;transition:all .5s ease 0;width:100%}.skin.contentinleft .layer-hover{display:none}.skin.contentinright{overflow:hidden;position:relative;vertical-align:top}.skin.contentinright:hover .layer-media{z-index:9}.skin.contentinright .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.contentinright:hover .layer-content{left:0}.skin.contentinright .layer-content{background:rgba(0,0,0,0.3) none repeat scroll 0 0;color:#fff;height:100%;left:100%;position:absolute;top:0;transition:all .5s ease 0;width:100%}.skin.contentinright .layer-hover{display:none}.skin.thumbgoleftconetntinright{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgoleftconetntinright:hover .layer-media{transform:translateX(-100%)}.skin.thumbgoleftconetntinright .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.thumbgoleftconetntinright:hover .layer-content{left:0}.skin.thumbgoleftconetntinright .layer-content{height:100%;left:100%;position:absolute;top:0;transition:all .5s ease 0;width:100%}.skin.thumbgoleftconetntinright .layer-hover{display:none}.skin.thumbgobottomconetntinright{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgobottomconetntinright:hover .layer-media{transform:translateY(100%)}.skin.thumbgobottomconetntinright .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.thumbgobottomconetntinright:hover .layer-content{left:0}.skin.thumbgobottomconetntinright .layer-content{height:100%;left:100%;position:absolute;top:0;transition:all .5s ease 0;width:100%}.skin.thumbgobottomconetntinright .layer-hover{display:none}.skin.thumbgotopconetntinright{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgotopconetntinright:hover .layer-media{transform:translateY(-100%)}.skin.thumbgotopconetntinright .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.thumbgotopconetntinright:hover .layer-content{left:0}.skin.thumbgotopconetntinright .layer-content{height:100%;left:100%;position:absolute;top:0;transition:all .5s ease 0;width:100%}.skin.thumbgotopconetntinright .layer-hover{display:none}.skin.thumbgorightconetntinright{overflow:hidden;position:relative;vertical-align:top}.skin.thumbgorightconetntinright:hover .layer-media{transform:translateX(100%)}.skin.thumbgorightconetntinright .layer-media{transition:all .4s ease 0;left:0;top:0;width:100%}.skin.thumbgorightconetntinright:hover .layer-content{left:0}.skin.thumbgorightconetntinright .layer-content{height:100%;left:100%;position:absolute;top:0;transition:all .5s ease 0;width:100%}.skin.thumbgorightconetntinright .layer-hover{display:none}.skin.halfthumbleft{overflow:hidden;vertical-align:top}.skin.halfthumbleft .layer-media{display:inline-block;float:left;vertical-align:top;width:49%}.skin.halfthumbleft .layer-content{display:inline-block;float:right;width:49%}.skin.halfthumbleft .layer-hover{display:none}.skin.halfthumbright{overflow:hidden;vertical-align:top}.skin.halfthumbright .layer-media{display:inline-block;float:right;vertical-align:top;width:49%}.skin.halfthumbright .layer-content{display:inline-block;width:49%}.skin.halfthumbright .layer-hover{display:none}.skin.thumbrounded .layer-media{border-radius:50%;overflow:hidden}.skin.thumbrounded .layer-media .thumb{height:240px}.skin.thumbrounded .layer-hover{display:none}
assets/global/images/bg/dark_embroidery.png DELETED
Binary file
assets/global/images/bg/dimension.png DELETED
Binary file
assets/global/images/bg/eight_horns.png DELETED
Binary file
assets/global/images/bg/small_steps.png DELETED
Binary file
assets/global/webfonts/fa-brands-400.eot ADDED
Binary file
assets/global/webfonts/fa-brands-400.svg ADDED
@@ -0,0 +1,3296 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
4
+ <metadata>
5
+ Created by FontForge 20190112 at Tue Feb 12 10:24:59 2019
6
+ By Robert Madole
7
+ Copyright (c) Font Awesome
8
+ </metadata>
9
+ <defs>
10
+ <font id="FontAwesome5Brands-Regular" horiz-adv-x="448" >
11
+ <font-face
12
+ font-family="Font Awesome 5 Brands Regular"
13
+ font-weight="400"
14
+ font-stretch="normal"
15
+ units-per-em="512"
16
+ panose-1="2 0 5 3 0 0 0 0 0 0"
17
+ ascent="448"
18
+ descent="-64"
19
+ bbox="-0.200195 -66.9505 641.5 448.3"
20
+ underline-thickness="25"
21
+ underline-position="-51"
22
+ unicode-range="U+0020-F7E3"
23
+ />
24
+ <missing-glyph />
25
+ <glyph glyph-name="twitter-square" unicode="&#xf081;"
26
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM351.1 257.2c12.8008 9.2998 24 20.8994 32.9004 34c-11.7998 -5.10059 -24.5996 -8.7998 -37.7998 -10.2002
27
+ c13.5996 8.09961 23.8994 20.9004 28.7998 36.0996c-12.5996 -7.5 -26.7998 -13 -41.5996 -15.7998c-12 12.7998 -29 20.7002 -47.9004 20.7002c-40 0 -73.2998 -36.0996 -64 -80.5996c-54.4004 2.7998 -102.9 28.7998 -135.2 68.5996
28
+ c-5.7002 -9.7002 -8.89941 -20.9004 -8.89941 -33.0996v-0.107422c0 -19.3584 13.0811 -43.7715 29.1992 -54.4932c-10.6992 0.400391 -20.8994 3.40039 -29.5996 8.2998v-0.799805c0 -31.8994 22.5 -58.2998 52.5 -64.3994
29
+ c-10.4004 -2.7002 -19.5 -2.7002 -29.5996 -1.2002c8.2998 -26 32.5 -44.9004 61.2998 -45.5c-22.5 -17.6006 -50.7002 -28 -81.4004 -28c-5.39941 0 -10.5 0.200195 -15.7998 0.799805c29 -18.5996 63.5 -29.4004 100.7 -29.4004c120.6 0 186.6 99.9004 186.6 186.601
30
+ c0 2.7998 0 5.7002 -0.200195 8.5z" />
31
+ <glyph glyph-name="facebook-square" unicode="&#xf082;"
32
+ d="M448 368v-352c0 -26.5 -21.5 -48 -48 -48h-85.2998v177.2h60.5996l8.7002 67.5996h-69.2998v43.2002c0 19.5996 5.39941 32.9004 33.5 32.9004h35.7998v60.3994c-6.2002 0.799805 -27.4004 2.7002 -52.2002 2.7002c-51.5996 0 -87 -31.5 -87 -89.4004v-49.8994h-60.7998
33
+ v-67.6006h60.9004v-177.1h-196.9c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48z" />
34
+ <glyph glyph-name="linkedin" unicode="&#xf08c;"
35
+ d="M416 416c17.5996 0 32 -14.5 32 -32.2998v-383.4c0 -17.7998 -14.4004 -32.2998 -32 -32.2998h-384.1c-17.6006 0 -31.9004 14.5 -31.9004 32.2998v383.4c0 17.7998 14.2998 32.2998 31.9004 32.2998h384.1zM135.4 32h0.0996094v213.8h-66.5v-213.8h66.4004zM102.2 275
36
+ c21.2998 0 38.5 17.2002 38.5 38.5c0 21.2002 -17.2998 38.5 -38.5 38.5c-21.2998 0 -38.5 -17.2998 -38.5 -38.5s17.2002 -38.5 38.5 -38.5zM384.3 32v117.2c0 57.5996 -12.5 101.899 -79.7002 101.899c-32.2998 0 -54 -17.6992 -62.8994 -34.5h-0.900391v29.2002h-63.7002
37
+ v-213.8h66.4004v105.8c0 27.9004 5.2998 54.9004 39.9004 54.9004c34 0 34.5 -31.9004 34.5 -56.7002v-104h66.3994z" />
38
+ <glyph glyph-name="github-square" unicode="&#xf092;"
39
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM277.3 32.2998c66 22 110.8 84.9004 110.7 158.3c0 91.8008 -74.4004 161.5 -166.2 161.5s-162 -69.6992 -162 -161.5
40
+ c0 -73.3994 46.2002 -136.199 112.2 -158.3c8.5 -1.5 11.5 3.7002 11.5 8c0 4.10059 -0.200195 26.7002 -0.200195 40.6006c0 0 -46.3994 -10 -56.0996 19.6992c0 0 -7.60059 19.2002 -18.4004 24.2002c0 0 -15.0996 10.4004 1.10059 10.2002
41
+ c0 0 16.3994 -1.2998 25.5 -17.0996c14.5 -25.6006 38.7998 -18.2002 48.2998 -13.9004c1.5 10.5996 5.7998 18 10.5996 22.2998c-37 4.10059 -74.2998 9.5 -74.2998 73.1006c0 18.1992 5 27.2998 15.5996 39c-1.7998 4.39941 -7.39941 22.0996 1.7002 45
42
+ c13.9004 4.2998 45.7002 -17.9004 45.7002 -17.9004c13.2002 3.7002 27.5 5.59961 41.5996 5.59961c14.1006 0 28.4004 -1.89941 41.6006 -5.59961c0 0 31.7998 22.2002 45.7002 17.9004c9.09961 -23 3.39941 -40.7002 1.69922 -45
43
+ c10.6006 -11.7002 17.1006 -20.8008 17.1006 -39c0 -63.9004 -39 -69 -76 -73.1006c6.09961 -5.2002 11.2998 -15.0996 11.2998 -30.7002c0 -22.2998 -0.200195 -49.8994 -0.200195 -55.2998c0 -4.2998 3.10059 -9.5 11.5 -8zM179.2 93.4004
44
+ c-1.90039 -0.400391 -3.7002 0.399414 -3.90039 1.69922c-0.200195 1.5 1.10059 2.80078 3 3.2002c1.90039 0.200195 3.7002 -0.599609 3.90039 -1.89941c0.299805 -1.30078 -1 -2.60059 -3 -3zM169.7 94.2998c0 1.5 -1.7998 2.60059 -3.7002 2.40039
45
+ c-2 0 -3.5 -1.10059 -3.5 -2.40039c0 -1.5 1.5 -2.59961 3.7002 -2.39941c2 0 3.5 1.09961 3.5 2.39941zM156 95.4004c-0.400391 -1.30078 -2.40039 -1.90039 -4.09961 -1.30078c-1.90039 0.400391 -3.2002 1.90039 -2.80078 3.2002
46
+ c0.400391 1.2998 2.40039 1.90039 4.10059 1.5c2 -0.599609 3.2998 -2.09961 2.7998 -3.39941zM143.7 100.8c0.899414 0.799805 0.399414 2.7998 -0.900391 4.10059c-1.5 1.5 -3.39941 1.69922 -4.2998 0.599609c-1 -0.900391 -0.599609 -2.7998 0.900391 -4.09961
47
+ c1.5 -1.5 3.39941 -1.7002 4.2998 -0.600586zM134.6 109.9c1.10059 0.799805 1.10059 2.59961 0 4.09961c-0.899414 1.5 -2.59961 2.2002 -3.69922 1.2998c-1.10059 -0.700195 -1.10059 -2.39941 0 -3.89941c1.09961 -1.5 2.7998 -2.10059 3.69922 -1.5zM128.1 119.6
48
+ c0.900391 0.700195 0.700195 2.2002 -0.399414 3.5c-1.10059 1 -2.60059 1.5 -3.5 0.600586c-0.900391 -0.700195 -0.700195 -2.2002 0.399414 -3.5c1.10059 -1 2.60059 -1.5 3.5 -0.600586zM121.4 127c0.399414 0.799805 -0.200195 1.90039 -1.5 2.59961
49
+ c-1.30078 0.5 -2.40039 0.200195 -2.80078 -0.399414c-0.399414 -0.900391 0.200195 -2 1.5 -2.60059c1.10059 -0.699219 2.40039 -0.5 2.80078 0.400391z" />
50
+ <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="511"
51
+ d="M459.37 296.284c0.325195 -4.54785 0.325195 -9.09766 0.325195 -13.6455c0 -138.72 -105.583 -298.558 -298.559 -298.558c-59.4521 0 -114.68 17.2188 -161.137 47.1055c8.44727 -0.973633 16.5684 -1.29883 25.3398 -1.29883
52
+ c49.0547 0 94.2129 16.5684 130.274 44.832c-46.1318 0.975586 -84.792 31.1885 -98.1123 72.7725c6.49805 -0.974609 12.9951 -1.62402 19.8184 -1.62402c9.4209 0 18.8428 1.2998 27.6133 3.57324c-48.0811 9.74707 -84.1426 51.9795 -84.1426 102.984v1.29883
53
+ c13.9688 -7.79688 30.2139 -12.6699 47.4307 -13.3184c-28.2637 18.8428 -46.7803 51.0049 -46.7803 87.3906c0 19.4922 5.19629 37.3604 14.2939 52.9541c51.6543 -63.6748 129.3 -105.258 216.364 -109.807c-1.62402 7.79688 -2.59863 15.918 -2.59863 24.04
54
+ c0 57.8271 46.7822 104.934 104.934 104.934c30.2139 0 57.502 -12.6699 76.6709 -33.1367c23.7148 4.54785 46.4551 13.3193 66.5986 25.3398c-7.79785 -24.3662 -24.3662 -44.833 -46.1318 -57.8271c21.1172 2.27344 41.584 8.12207 60.4258 16.2432
55
+ c-14.292 -20.791 -32.1611 -39.3086 -52.6279 -54.2529z" />
56
+ <glyph glyph-name="facebook" unicode="&#xf09a;"
57
+ d="M448 391.3v-398.5c0 -13.7002 -11.0996 -24.7002 -24.7002 -24.7002h-114.2v173.4h58.2002l8.7002 67.5996h-67v43.2002c0 19.6006 5.40039 32.9004 33.5 32.9004h35.7998v60.5c-6.2002 0.799805 -27.3994 2.7002 -52.2002 2.7002c-51.5996 0 -87 -31.5 -87 -89.4004
58
+ v-49.9004h-58.3994v-67.5996h58.3994v-173.5h-214.399c-13.6006 0 -24.7002 11.0996 -24.7002 24.7002v398.6c0 13.6006 11.0996 24.7002 24.7002 24.7002h398.5c13.7002 0 24.7998 -11.0996 24.7998 -24.7002z" />
59
+ <glyph glyph-name="github" unicode="&#xf09b;" horiz-adv-x="496"
60
+ d="M165.9 50.5996c0 -2 -2.30078 -3.59961 -5.2002 -3.59961c-3.2998 -0.299805 -5.60059 1.2998 -5.60059 3.59961c0 2 2.30078 3.60059 5.2002 3.60059c3 0.299805 5.60059 -1.2998 5.60059 -3.60059zM134.8 55.0996c0.700195 2 3.60059 3 6.2002 2.30078
61
+ c3 -0.900391 4.90039 -3.2002 4.2998 -5.2002c-0.599609 -2 -3.59961 -3 -6.2002 -2c-3 0.599609 -5 2.89941 -4.2998 4.89941zM179 56.7998c2.90039 0.299805 5.59961 -1 5.90039 -2.89941c0.299805 -2 -1.7002 -3.90039 -4.60059 -4.60059
62
+ c-3 -0.700195 -5.59961 0.600586 -5.89941 2.60059c-0.300781 2.2998 1.69922 4.19922 4.59961 4.89941zM244.8 440c138.7 0 251.2 -105.3 251.2 -244c0 -110.9 -67.7998 -205.8 -167.8 -239c-12.7002 -2.2998 -17.2998 5.59961 -17.2998 12.0996
63
+ c0 8.2002 0.299805 49.9004 0.299805 83.6006c0 23.5 -7.7998 38.5 -17 46.3994c55.8994 6.30078 114.8 14 114.8 110.5c0 27.4004 -9.7998 41.2002 -25.7998 58.9004c2.59961 6.5 11.0996 33.2002 -2.60059 67.9004c-20.8994 6.59961 -69 -27 -69 -27
64
+ c-20 5.59961 -41.5 8.5 -62.7998 8.5s-42.7998 -2.90039 -62.7998 -8.5c0 0 -48.0996 33.5 -69 27c-13.7002 -34.6006 -5.2002 -61.4004 -2.59961 -67.9004c-16 -17.5996 -23.6006 -31.4004 -23.6006 -58.9004c0 -96.1992 56.4004 -104.3 112.3 -110.5
65
+ c-7.19922 -6.59961 -13.6992 -17.6992 -16 -33.6992c-14.2998 -6.60059 -51 -17.7002 -72.8994 20.8994c-13.7002 23.7998 -38.6006 25.7998 -38.6006 25.7998c-24.5 0.300781 -1.59961 -15.3994 -1.59961 -15.3994c16.4004 -7.5 27.7998 -36.6006 27.7998 -36.6006
66
+ c14.7002 -44.7998 84.7002 -29.7998 84.7002 -29.7998c0 -21 0.299805 -55.2002 0.299805 -61.3994c0 -6.5 -4.5 -14.4004 -17.2998 -12.1006c-99.7002 33.4004 -169.5 128.3 -169.5 239.2c0 138.7 106.1 244 244.8 244zM97.2002 95.0996
67
+ c1.2998 1.30078 3.59961 0.600586 5.2002 -1c1.69922 -1.89941 2 -4.19922 0.699219 -5.19922c-1.2998 -1.30078 -3.59961 -0.600586 -5.19922 1c-1.7002 1.89941 -2 4.19922 -0.700195 5.19922zM86.4004 103.2c0.699219 1 2.2998 1.2998 4.2998 0.700195
68
+ c2 -1 3 -2.60059 2.2998 -3.90039c-0.700195 -1.40039 -2.7002 -1.7002 -4.2998 -0.700195c-2 1 -3 2.60059 -2.2998 3.90039zM118.8 67.5996c1.2998 1.60059 4.2998 1.30078 6.5 -1c2 -1.89941 2.60059 -4.89941 1.2998 -6.19922
69
+ c-1.2998 -1.60059 -4.19922 -1.30078 -6.5 1c-2.2998 1.89941 -2.89941 4.89941 -1.2998 6.19922zM107.4 82.2998c1.59961 1.2998 4.19922 0.299805 5.59961 -2c1.59961 -2.2998 1.59961 -4.89941 0 -6.2002c-1.2998 -1 -4 0 -5.59961 2.30078
70
+ c-1.60059 2.2998 -1.60059 4.89941 0 5.89941z" />
71
+ <glyph glyph-name="pinterest" unicode="&#xf0d2;" horiz-adv-x="496"
72
+ d="M496 192c0 -137 -111 -248 -248 -248c-25.5996 0 -50.2002 3.90039 -73.4004 11.0996c10.1006 16.5 25.2002 43.5 30.8008 65c3 11.6006 15.3994 59 15.3994 59c8.10059 -15.3994 31.7002 -28.5 56.7998 -28.5c74.8008 0 128.7 68.8008 128.7 154.301
73
+ c0 81.8994 -66.8994 143.199 -152.899 143.199c-107 0 -163.9 -71.7998 -163.9 -150.1c0 -36.4004 19.4004 -81.7002 50.2998 -96.0996c4.7002 -2.2002 7.2002 -1.2002 8.2998 3.2998c0.800781 3.39941 5 20.2998 6.90039 28.0996
74
+ c0.599609 2.5 0.299805 4.7002 -1.7002 7.10059c-10.0996 12.5 -18.2998 35.2998 -18.2998 56.5996c0 54.7002 41.4004 107.6 112 107.6c60.9004 0 103.6 -41.5 103.6 -100.899c0 -67.1006 -33.8994 -113.601 -78 -113.601c-24.2998 0 -42.5996 20.1006 -36.6992 44.8008
75
+ c7 29.5 20.5 61.2998 20.5 82.5996c0 19 -10.2002 34.9004 -31.4004 34.9004c-24.9004 0 -44.9004 -25.7002 -44.9004 -60.2002c0 -22 7.40039 -36.7998 7.40039 -36.7998s-24.5 -103.801 -29 -123.2c-5 -21.4004 -3 -51.6006 -0.900391 -71.2002
76
+ c-92.1992 36.0996 -157.6 125.9 -157.6 231c0 137 111 248 248 248s248 -111 248 -248z" />
77
+ <glyph glyph-name="pinterest-square" unicode="&#xf0d3;"
78
+ d="M448 368v-352c0 -26.5 -21.5 -48 -48 -48h-245.6c9.7998 16.4004 22.3994 40 27.3994 59.2998c3 11.5 15.2998 58.4004 15.2998 58.4004c8 -15.2998 31.4004 -28.2002 56.3008 -28.2002c74.0996 0 127.399 68.0996 127.399 152.7
79
+ c0 81.0996 -66.2002 141.8 -151.399 141.8c-106 0 -162.2 -71.0996 -162.2 -148.6c0 -36 19.2002 -80.8008 49.7998 -95.1006c4.7002 -2.2002 7.09961 -1.2002 8.2002 3.2998c0.799805 3.40039 5 20.1006 6.7998 27.8008c0.599609 2.5 0.299805 4.59961 -1.7002 7
80
+ c-10.0996 12.2998 -18.2998 34.8994 -18.2998 56c0 54.1992 41 106.6 110.9 106.6c60.2998 0 102.6 -41.0996 102.6 -99.9004c0 -66.3994 -33.5 -112.399 -77.2002 -112.399c-24.0996 0 -42.0996 19.8994 -36.3994 44.3994c6.89941 29.2002 20.2998 60.7002 20.2998 81.8008
81
+ c0 53 -75.5 45.6992 -75.5 -25c0 -21.7002 7.2998 -36.5 7.2998 -36.5c-31.4004 -132.801 -36.0996 -134.5 -29.5996 -192.601l2.19922 -0.799805h-88.5996c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48z" />
82
+ <glyph glyph-name="google-plus-square" unicode="&#xf0d4;"
83
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM164 92c57.7002 0 96 40.5 96 97.5996c0 6.5 -0.599609 11.6006 -1.59961 16.6006h-94.4004v-34.4004h56.9004
84
+ c-2.40039 -14.5996 -17.2002 -43.0996 -56.8008 -43.0996c-34.0996 0 -61.8994 28.2998 -61.8994 63.2002c0 35 27.7998 63.1992 61.8994 63.1992c19.5 0 32.4004 -8.2998 39.8008 -15.3994l27.0996 26.0996c-17.5 16.4004 -40 26.2002 -67 26.2002
85
+ c-55.2998 0 -100 -44.7002 -100 -100s44.7002 -100 100 -100zM384 173.8v29.2002h-29v29h-29.2002v-29h-29v-29.2002h29v-29h29.2002v29h29z" />
86
+ <glyph glyph-name="google-plus-g" unicode="&#xf0d5;" horiz-adv-x="640"
87
+ d="M386.061 219.504c1.83398 -9.69238 3.14355 -19.3838 3.14355 -31.9561c0 -109.753 -73.6055 -187.548 -184.404 -187.548c-106.084 0 -192 85.915 -192 192s85.916 192 192 192c51.8643 0 95.083 -18.8594 128.611 -50.292l-52.126 -50.0303
88
+ c-14.1455 13.6211 -39.0283 29.5996 -76.4854 29.5996c-65.4834 0 -118.92 -54.2217 -118.92 -121.277s53.4365 -121.277 118.92 -121.277c75.9609 0 104.514 54.7451 108.965 82.7734h-108.965v66.0088h181.261v-0.000976562zM571.467 213.067h55.7334v-56.001h-55.7334
89
+ v-55.7334h-56.001v55.7334h-55.7324v56.001h55.7324v55.7324h56.001v-55.7324z" />
90
+ <glyph glyph-name="linkedin-in" unicode="&#xf0e1;"
91
+ d="M100.3 0h-92.8994v299.1h92.8994v-299.1zM53.7998 339.9c-29.7002 0 -53.7998 24.5996 -53.7998 54.2998s24.0996 53.7998 53.7998 53.7998s53.7998 -24.0996 53.7998 -53.7998s-24.0996 -54.2998 -53.7998 -54.2998zM448 0h-92.7002v145.6
92
+ c0 34.7002 -0.700195 79.2002 -48.2998 79.2002c-48.2998 0 -55.7002 -37.7002 -55.7002 -76.7002v-148.1h-92.7998v299.1h89.0996v-40.7998h1.30078c12.3994 23.5 42.6992 48.2998 87.8994 48.2998c94 0 111.3 -61.8994 111.3 -142.3v-164.3h-0.0996094z" />
93
+ <glyph glyph-name="github-alt" unicode="&#xf113;" horiz-adv-x="480"
94
+ d="M186.1 119.3c0 -20.8994 -10.8994 -55.0996 -36.6992 -55.0996c-25.8008 0 -36.7002 34.2002 -36.7002 55.0996c0 20.9004 10.8994 55.1006 36.7002 55.1006c25.7998 0 36.6992 -34.2002 36.6992 -55.1006zM480 169.8c0 -31.8994 -3.2002 -65.7002 -17.5 -95
95
+ c-37.9004 -76.5996 -142.1 -74.7998 -216.7 -74.7998c-75.7998 0 -186.2 -2.7002 -225.6 74.7998c-14.6006 29 -20.2002 63.1006 -20.2002 95c0 41.9004 13.9004 81.5 41.5 113.601c-5.2002 15.7998 -7.7002 32.3994 -7.7002 48.7998
96
+ c0 21.5 4.90039 32.2998 14.6006 51.7998c45.2998 0 74.2998 -9 108.8 -36c29 6.90039 58.7998 10 88.7002 10c27 0 54.1992 -2.90039 80.3994 -9.2002c34 26.7002 63 35.2002 107.8 35.2002c9.80078 -19.5 14.6006 -30.2998 14.6006 -51.7998
97
+ c0 -16.4004 -2.60059 -32.7002 -7.7002 -48.2002c27.5 -32.4004 39 -72.2998 39 -114.2zM415.7 119.3c0 43.9004 -26.7002 82.6006 -73.5 82.6006c-18.9004 0 -37 -3.40039 -56 -6c-14.9004 -2.30078 -29.7998 -3.2002 -45.1006 -3.2002
98
+ c-15.1992 0 -30.0996 0.899414 -45.0996 3.2002c-18.7002 2.59961 -37 6 -56 6c-46.7998 0 -73.5 -38.7002 -73.5 -82.6006c0 -87.7998 80.4004 -101.3 150.4 -101.3h48.1992c70.3008 0 150.601 13.4004 150.601 101.3zM333.1 174.4
99
+ c25.8008 0 36.7002 -34.2002 36.7002 -55.1006c0 -20.8994 -10.8994 -55.0996 -36.7002 -55.0996c-25.7998 0 -36.6992 34.2002 -36.6992 55.0996c0 20.9004 10.8994 55.1006 36.6992 55.1006z" />
100
+ <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="511"
101
+ d="M461.1 5.2998h-97.3994l51.8994 242.7c2.30078 10.2002 0.900391 19.5 -4.39941 25.7002c-5 6.09961 -13.7002 9.59961 -24.2002 9.59961h-49.2998l-59.5 -278h-97.4004l59.5 278h-83.3994l-59.5 -278h-97.4004l59.5 278l-44.5996 95.4004h372.1
102
+ c39.4004 0 75.2998 -16.2998 98.2998 -44.9004c23.2998 -28.5996 31.7998 -67.3994 23.6006 -105.899z" />
103
+ <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="384"
104
+ d="M0 416h384l-34.9004 -395.8l-157.6 -52.2002l-156.6 52.2002zM308.2 288.1l4.39941 47.7002h-241.1l12.7998 -145.6h166.9l-6 -62.2002l-53.7002 -14.5l-53.5 14.5l-3.5 38.0996h-47.7002l6 -75.7998l98.7002 -27.2998h1.09961v0.299805l97.9004 27l13.5996 148.4h-175.6
105
+ l-4.09961 49.3994h183.8z" />
106
+ <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="480"
107
+ d="M480 416l-64 -368l-223.3 -80l-192.7 80l19.5996 94.7998h82l-8 -40.5996l116.4 -44.4004l134.1 44.4004l18.8008 97.0996h-333.4l16 82h333.7l10.5 52.7002h-333.4l16.2998 82h407.4z" />
108
+ <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="383"
109
+ d="M310.204 205.362c46.0059 -11.0283 74.9971 -38.4443 69.3262 -99.8906c-7.24805 -76.5723 -61.5967 -97.0547 -142.896 -101.467v-68.0049h-48.5273v66.7451c-12.29 0 -25.21 0 -38.4443 0.314453v-67.0596h-48.5283v68.0049s-8.88867 0.31543 -97.3701 0.31543
110
+ l9.76758 57.666c34.7305 -0.614258 50.3301 -3.4209 53.2549 16.0703v217.43c-4.60645 24.5664 -24.709 22.1045 -63.0234 21.4268v51.6777c58.748 -0.275391 79.5283 -0.539062 97.3701 0v79.4092h48.5283v-77.833c12.9189 0.31543 25.8389 0.629883 38.4443 0.629883
111
+ v77.2031h48.5273v-79.4092c62.3926 -5.35547 109.492 -24.5781 114.851 -81.9287c4.09668 -41.9102 -13.5508 -67.1201 -41.2803 -81.2998zM150.608 313.447v-96.7402c27.416 0 113.126 -6.30273 113.126 48.2119c0 57.0352 -85.7109 48.5283 -113.126 48.5283z
112
+ M150.608 61.6709c32.7715 0 133.126 -6.93262 133.127 53.2529c0 62.3936 -100.355 53.2549 -133.127 53.2549v-106.508z" />
113
+ <glyph glyph-name="youtube" unicode="&#xf167;" horiz-adv-x="576"
114
+ d="M549.655 323.917c11.4121 -42.8672 11.4121 -132.305 11.4121 -132.305s0 -89.4385 -11.4121 -132.306c-6.28125 -23.6494 -24.7871 -41.5 -48.2842 -47.8203c-42.5908 -11.4863 -213.371 -11.4863 -213.371 -11.4863s-170.78 0 -213.371 11.4863
115
+ c-23.4971 6.32031 -42.0029 24.1709 -48.2842 47.8203c-11.4121 42.8672 -11.4121 132.306 -11.4121 132.306s0 89.4375 11.4121 132.305c6.28125 23.6504 24.7871 42.2754 48.2842 48.5967c42.5908 11.4863 213.371 11.4863 213.371 11.4863s170.781 0 213.371 -11.4863
116
+ c23.4971 -6.32031 42.0029 -24.9463 48.2842 -48.5967zM232.145 110.409l142.739 81.2012l-142.739 81.2051v-162.406z" />
117
+ <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="384"
118
+ d="M162.7 238c-1.7998 -3.2998 -25.2002 -44.4004 -70.1006 -123.5c-4.89941 -8.2998 -10.7998 -12.5 -17.6992 -12.5h-65.1006c-7.7002 0 -12.0996 7.5 -8.5 14.4004l69 121.3c0.200195 0 0.200195 0.0996094 0 0.299805l-43.8994 75.5996
119
+ c-4.30078 7.80078 0.299805 14.1006 8.5 14.1006h65.0996c7.2998 0 13.2998 -4.10059 18 -12.2002zM382.6 401.9l-144 -253v-0.300781l91.6006 -166.6c3.89941 -7.09961 0.200195 -14.0996 -8.5 -14.0996h-65.2002c-7.59961 0 -13.5996 4 -18 12.1992l-92.4004 168.5
120
+ c3.30078 5.80078 51.5 90.8008 144.801 255.2c4.59961 8.10059 10.3994 12.2002 17.5 12.2002h65.6992c8 0 12.3008 -6.7002 8.5 -14.0996z" />
121
+ <glyph glyph-name="xing-square" unicode="&#xf169;"
122
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM140.4 127.8c4.89941 0 9.09961 2.90039 12.5996 9.10059c32.0996 56.5 48.7998 85.8994 50.0996 88.1992l-31.8994 55.3008
123
+ c-3.40039 5.7998 -7.7002 8.69922 -12.9004 8.69922h-46.5996c-5.7998 0 -9 -4.5 -6 -10.0996l31.3994 -54c0.100586 -0.0996094 0.100586 -0.200195 0 -0.200195l-49.2998 -86.7002c-2.7002 -5 0.5 -10.2998 6 -10.2998h46.6006zM360.1 341.9
124
+ c2.80078 5.2998 -0.299805 10.0996 -6 10h-46.8994c-5.10059 0 -9.2002 -2.90039 -12.5 -8.7002c-66.6006 -117.4 -101.101 -178.2 -103.4 -182.3l66 -120.301c3.2002 -5.7998 7.40039 -8.69922 12.9004 -8.69922h46.5996c6.10059 0 8.7998 5 6 10.0996l-65.5 119v0.200195z
125
+ " />
126
+ <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="528"
127
+ d="M264.4 331.7l-132 -84.2998l132 -84.3008l-132 -84.2998l-132.4 85.1006l132.3 84.2998l-132.3 83.5l132.3 84.2998zM131.6 52.2998l132 84.2998l132 -84.2998l-132 -84.2998zM264.4 163.9l132 84.2998l-132 83.5996l131.3 84.2002l132.3 -84.2998l-132.3 -84.2998
128
+ l132.3 -84.2002l-132.3 -84.2998z" />
129
+ <glyph glyph-name="stack-overflow" unicode="&#xf16c;" horiz-adv-x="384"
130
+ d="M290.7 137l-8.2002 -39l-195.7 41l8.2002 39.2998zM341.7 224l-25.5 -30.7998l-153.5 128.3l25.5 30.7998zM310.5 184.3l-16.7998 -36.2998l-181.2 84.5l16.7002 36.5zM262 416l119.3 -160.3l-32 -24l-119.3 160.3zM282.5 88v-39.7002h-200v39.7002h200zM322.2 8v120h40
131
+ v-160h-359.5v160h40v-120h279.5z" />
132
+ <glyph glyph-name="instagram" unicode="&#xf16d;"
133
+ d="M224.1 307c63.6006 0 114.9 -51.2998 114.9 -114.9c0 -63.5996 -51.2998 -114.899 -114.9 -114.899c-63.5996 0 -114.899 51.2998 -114.899 114.899c0 63.6006 51.2998 114.9 114.899 114.9zM224.1 117.4c41.1006 0 74.7002 33.5 74.7002 74.6992
134
+ c0 41.2002 -33.5 74.7002 -74.7002 74.7002c-41.1992 0 -74.6992 -33.5 -74.6992 -74.7002c0 -41.1992 33.5996 -74.6992 74.6992 -74.6992zM370.5 311.7c0 -14.9004 -12 -26.7998 -26.7998 -26.7998c-14.9004 0 -26.7998 12 -26.7998 26.7998s12 26.7998 26.7998 26.7998
135
+ s26.7998 -12 26.7998 -26.7998zM446.6 284.5c2.10059 -37 2.10059 -147.8 0 -184.8c-1.7998 -35.9004 -10 -67.7002 -36.1992 -93.9004c-26.2002 -26.2998 -58 -34.5 -93.9004 -36.2002c-37 -2.09961 -147.9 -2.09961 -184.9 0
136
+ c-35.8994 1.80078 -67.5996 10 -93.8994 36.2002s-34.5 58 -36.2002 93.9004c-2.09961 37 -2.09961 147.899 0 184.899c1.7998 35.9004 9.90039 67.7002 36.2002 93.9004s58.0996 34.4004 93.8994 36.0996c37 2.10059 147.9 2.10059 184.9 0
137
+ c35.9004 -1.7998 67.7002 -10 93.9004 -36.1992c26.2998 -26.2002 34.5 -58 36.1992 -93.9004zM398.8 60c11.7002 29.4004 9 99.5 9 132.1c0 32.6006 2.7002 102.601 -9 132.101c-7.89941 19.7002 -23 34.7998 -42.5996 42.5996c-29.4004 11.6006 -99.5 9 -132.101 9
138
+ c-32.5996 0 -102.6 2.7002 -132.1 -9c-19.7002 -7.89941 -34.7998 -23 -42.5996 -42.5996c-11.6006 -29.4004 -9 -99.5 -9 -132.101c0 -32.5996 -2.7002 -102.6 9 -132.1c7.89941 -19.7002 23 -34.7998 42.5996 -42.5996c29.4004 -11.6006 99.5 -9 132.1 -9
139
+ c32.6006 0 102.601 -2.7002 132.101 9c19.7002 7.89941 34.7998 23 42.5996 42.5996z" />
140
+ <glyph glyph-name="flickr" unicode="&#xf16e;"
141
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM144.5 129c35.0996 0 63.5 28.4004 63.5 63.5s-28.4004 63.5 -63.5 63.5s-63.5 -28.4004 -63.5 -63.5s28.4004 -63.5 63.5 -63.5z
142
+ M303.5 129c35.0996 0 63.5 28.4004 63.5 63.5s-28.4004 63.5 -63.5 63.5s-63.5 -28.4004 -63.5 -63.5s28.4004 -63.5 63.5 -63.5z" />
143
+ <glyph glyph-name="adn" unicode="&#xf170;" horiz-adv-x="496"
144
+ d="M248 280.5l64.9004 -98.7998h-129.801zM496 192c0 -136.9 -111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248s248 -111.1 248 -248zM396.2 109.3l-148.2 223.2l-148.2 -223.2h30.4004l33.5996 51.7002h168.601l33.5996 -51.7002h30.2002z" />
145
+ <glyph glyph-name="bitbucket" unicode="&#xf171;" horiz-adv-x="499"
146
+ d="M16.2002 416.4l466.8 -0.200195c1 0 1.90039 -0.100586 2.7998 -0.200195c8.7002 -1.40039 14.6006 -9.59961 13.2002 -18.2998l-67.9004 -416.8c-1.2998 -7.80078 -8.09961 -13.5 -16 -13.4004h-325.699c-10.6006 0.0996094 -19.6006 7.7998 -21.3008 18.2002
147
+ l-67.8994 412.1c-0.100586 0.900391 -0.200195 1.90039 -0.200195 2.7998c0.0996094 8.90039 7.40039 15.9004 16.2002 15.8008zM302.1 118.6l25.2002 147h-157.3l28.0996 -147h104z" />
148
+ <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="319"
149
+ d="M309.8 -32.2998c-13.5996 -14.5 -50 -31.7002 -97.3994 -31.7002c-120.801 0 -147 88.7998 -147 140.6v144h-47.5c-5.5 0 -10 4.5 -10 10v68c0 7.2002 4.5 13.6006 11.2998 16c62 21.8008 81.5 76 84.2998 117.101c0.799805 11 6.5 16.2998 16.0996 16.2998h70.9004
150
+ c5.5 0 10 -4.5 10 -10v-115.2h83c5.5 0 10 -4.39941 10 -9.89941v-81.7002c0 -5.5 -4.5 -10 -10 -10h-83.4004v-133.2c0 -34.2002 23.7002 -53.5996 68 -35.7998c4.80078 1.89941 9 3.2002 12.7002 2.2002c3.5 -0.900391 5.7998 -3.40039 7.40039 -7.90039l22 -64.2998
151
+ c1.7998 -5 3.2998 -10.6006 -0.400391 -14.5z" />
152
+ <glyph glyph-name="tumblr-square" unicode="&#xf174;"
153
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM317.7 51.7998c2.2998 2.40039 1.2998 5.90039 0.299805 9.10059l-13.7998 40.1992c-1 2.80078 -2.40039 4.40039 -4.60059 4.90039
154
+ c-2.39941 0.599609 -5 -0.200195 -8 -1.40039c-27.6992 -11.0996 -42.5 1 -42.5 22.4004v83.2998h52.1006c3.39941 0 6.2002 2.7998 6.2002 6.2002v51.0996c0 3.40039 -2.80078 6.2002 -6.2002 6.2002h-51.9004v72c0 3.40039 -2.7998 6.2002 -6.2002 6.2002h-44.2998
155
+ c-5.89941 0 -9.5 -3.2998 -10 -10.2002c-1.7998 -25.7002 -13.8994 -59.5 -52.7002 -73.2002c-4.2998 -1.5 -7.09961 -5.5 -7.09961 -10v-42.5c0 -3.39941 2.7998 -6.19922 6.2002 -6.19922h29.7002v-90c0 -32.4004 16.3994 -87.9004 91.8994 -87.9004
156
+ c29.7002 0 52.4004 10.7002 60.9004 19.7998z" />
157
+ <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="376"
158
+ d="M314.7 179.3c0 -1.89941 -3.5 -61.2002 61.7002 -91.8994c-12.2002 -36.8008 -54 -118.601 -102.601 -119.301c-28.0996 0 -44.5996 17.9004 -76.3994 17.9004c-32.8008 0 -50.6006 -17.2998 -75.8008 -17.9004c-48.1992 -1.5 -94.3994 88.5 -107.199 125.2
159
+ c-9.60059 27.9004 -14.4004 55 -14.4004 81.2002c0 88.7002 59.2998 132.3 115.1 133.2c27 0 61.4004 -19.7002 76.4004 -19.7002c14.2002 0 53 23.5 88.5 20.7002c37.5 -2.90039 65.9004 -17.7002 84.7002 -44.6006c-33.6006 -20.3994 -50.2002 -48.0996 -50 -84.7998z
160
+ M258.1 343.5c-19.5996 -22.9004 -43.3994 -36.2998 -69.5 -34.2998c-2.19922 27.5996 8.10059 52.0996 25.6006 71.8994c15.8994 18.5 43.7998 33.5 67.8994 34.9004c0.800781 -10.5996 3.30078 -40.0996 -24 -72.5z" />
161
+ <glyph glyph-name="windows" unicode="&#xf17a;"
162
+ d="M0 354.3l183.6 25.2998v-177.399h-183.6v152.1zM0 29.7002v149.899h183.6v-175.199zM203.8 1.7002v177.899h244.2v-211.6zM203.8 382.3l244.2 33.7002v-213.8h-244.2v180.1z" />
163
+ <glyph glyph-name="android" unicode="&#xf17b;"
164
+ d="M89.5996 243.5v-115.8c0 -15.4004 -12.0996 -27.7002 -27.5 -27.7002c-15.2998 0 -30.0996 12.4004 -30.0996 27.7002v115.8c0 15.0996 14.7998 27.5 30.0996 27.5c15.1006 0 27.5 -12.4004 27.5 -27.5zM100.4 86.5v179.4h247.3v-179.4
165
+ c0 -16.4004 -13.2002 -29.5996 -29.4004 -29.5996h-20.2002v-61.1006c0 -36.7998 -55.5 -36.7002 -55.5 0v61.1006h-37.1992v-61.1006c0 -36.5996 -55.2002 -36.8994 -55.2002 0l-0.299805 61.1006h-19.9004c-16.4004 0 -29.5996 13.1992 -29.5996 29.5996zM348.4 275.6
166
+ h-249.101c0 42.8008 25.6006 80 63.6006 99.4004l-19.1006 35.2998c-2.7998 4.90039 4.2998 8 6.7002 3.7998l19.4004 -35.5996c34.8994 15.5 75 14.7002 108.3 0l19.2998 35.5c2.5 4.2998 9.5 1.09961 6.7002 -3.7998l-19.1006 -35.2002
167
+ c37.7002 -19.4004 63.3008 -56.5996 63.3008 -99.4004zM177.7 331.1c0 5.7002 -4.60059 10.5 -10.5 10.5c-5.7002 0 -10.2002 -4.7998 -10.2002 -10.5c0 -5.69922 4.59961 -10.5 10.2002 -10.5c5.89941 0 10.5 4.80078 10.5 10.5zM291.1 331.1
168
+ c0 5.7002 -4.59961 10.5 -10.1992 10.5c-5.90039 0 -10.5 -4.7998 -10.5 -10.5c0 -5.69922 4.59961 -10.5 10.5 -10.5c5.59961 0 10.1992 4.80078 10.1992 10.5zM385.9 271c15.2998 0 30.0996 -12.0996 30.0996 -27.5v-115.8
169
+ c0 -15.2998 -14.7002 -27.7002 -30.0996 -27.7002c-15.1006 0 -27.5 12.2998 -27.5 27.7002v115.8c0 15.4004 12.3994 27.5 27.5 27.5z" />
170
+ <glyph glyph-name="linux" unicode="&#xf17c;"
171
+ d="M220.8 324.7c-1.09961 0.599609 -3.09961 0.399414 -3.39941 1.7002c-0.200195 0.399414 0.199219 0.899414 0.599609 1.09961c1.59961 0.900391 3.7998 0.599609 5.5 -0.0996094c1.2998 -0.600586 3.40039 -1.5 3.2002 -2.90039
172
+ c-0.100586 -1.09961 -1.7998 -1.5 -2.90039 -1.5c-1.2002 0 -2 1.2002 -3 1.7002zM198.9 323c-1 -0.0996094 -2.7002 0.400391 -2.80078 1.40039c-0.199219 1.39941 1.90039 2.2998 3.2002 2.89941c1.7002 0.700195 3.90039 1 5.5 0.100586
173
+ c0.400391 -0.200195 0.799805 -0.700195 0.600586 -1.10059c-0.400391 -1.2002 -2.40039 -1 -3.5 -1.59961c-1 -0.5 -1.80078 -1.7002 -3 -1.7002zM420 44.2002c11.0996 -12.4004 15.9004 -21.5 15.5 -29.7002c-0.5 -8.2002 -6.5 -13.7998 -13.9004 -18.2998
174
+ c-14.8994 -9 -37.2998 -15.7998 -50.8994 -32.2002c-14.2002 -16.9004 -31.7002 -26.5996 -48.2998 -27.9004c-16.5 -1.2998 -32 6.30078 -40.3008 23v0.100586c-1.09961 2.09961 -1.89941 4.39941 -2.5 6.7002c-21.5 -1.2002 -40.1992 5.2998 -55.0996 4.09961
175
+ c-22 -1.2002 -35.7998 -6.5 -48.2998 -6.59961c-4.7998 -10.6006 -14.2998 -17.6006 -25.9004 -20.2002c-16 -3.7002 -36.0996 0 -55.8994 10.3994c-18.5 9.80078 -42 8.90039 -59.3008 12.5c-8.69922 1.80078 -16.2998 5 -20.0996 12.3008
176
+ c-3.7002 7.2998 -3 17.2998 2.2002 31.6992c1.7002 5.10059 0.399414 12.7002 -0.799805 20.8008c-0.600586 3.89941 -1.2002 7.89941 -1.2002 11.7998c0 4.2998 0.700195 8.5 2.7998 12.3994c4.5 8.5 11.7998 12.1006 18.5 14.5c6.7002 2.40039 12.7998 4 17 8.30078
177
+ c5.2002 5.5 10.0996 14.3994 16.5996 20.1992c-2.59961 17.2002 0.200195 35.4004 6.2002 53.3008c12.6006 37.8994 39.2002 74.1992 58.1006 96.6992c16.0996 22.9004 20.7998 41.3008 22.5 64.7002c1.09961 31.7998 -24.5 135.4 77.8994 135.2
178
+ c80.9004 -0.0996094 76.2998 -85.4004 75.7998 -131.3c-0.299805 -30.1006 16.3008 -50.5 33.4004 -72c15.2002 -18 35.0996 -44.2998 46.5 -74.4004c9.2998 -24.5996 12.9004 -51.7998 3.7002 -79.0996c1.39941 -0.5 2.7998 -1.2002 4.09961 -2
179
+ c1.40039 -0.799805 2.7002 -1.7998 4 -2.90039c6.60059 -5.59961 8.7002 -14.2998 10.5 -22.3994c1.90039 -8.10059 3.60059 -15.7002 7.2002 -19.7002zM223.7 360.7c-3.2002 -7.2002 -3.90039 -14.9004 -2.90039 -21.7998c3.60059 -0.900391 8.90039 -2.40039 13 -4.40039
180
+ c-2.09961 12.2002 4.5 23.5 11.7998 23c8.90039 -0.299805 13.9004 -15.5 9.10059 -27.2998c-0.799805 -1.90039 -2.7998 -3.40039 -3.90039 -4.60059c6.7002 -2.2998 11 -4.09961 12.6006 -4.89941c7.89941 9.5 10.7998 26.2002 4.2998 40.3994
181
+ c-9.7998 21.4004 -34.2002 21.8008 -44 -0.399414zM183 372.2c-18.9004 0 -24 -37.5 -8.40039 -52.1006c7.80078 5.7002 6.90039 4.7002 5.90039 5.5c-8 6.90039 -6.59961 27.4004 1.7998 28.1006c6.2998 0.5 10.7998 -10.7002 9.60059 -19.6006
182
+ c3.09961 2.10059 6.69922 3.60059 10.1992 4.60059c1.7002 19.2998 -9 33.5 -19.0996 33.5zM169.4 311.5c-4.2002 -3.2998 -5.60059 -7.40039 -4.2002 -12.2998c1.5 -4.90039 6.09961 -10.5 14.7002 -15.2998c7.7998 -4.60059 12 -11.5 20 -15
183
+ c2.59961 -1.10059 5.69922 -1.90039 9.59961 -2.10059c18.4004 -1.09961 27.0996 11.2998 38.2002 14.9004c11.7002 3.7002 20.0996 11 22.7002 18.0996c3.19922 8.5 -2.10059 14.7002 -10.5 18.2002c-11.3008 4.90039 -16.3008 5.2002 -22.6006 9.2998
184
+ c-10.2998 6.60059 -18.7998 8.90039 -25.8994 8.90039c-14.4004 0 -23.2002 -9.7998 -27.9004 -14.2002c-0.5 -0.5 -7.90039 -5.90039 -14.0996 -10.5zM172.7 -22.5c2.09961 20.5 -31.5 49 -41 68.9004l-19.6006 35.5996c-6.7998 9.2002 -13.7998 14.7998 -21.8994 16
185
+ c-7.7002 1.2002 -12.6006 -1.40039 -17.7002 -6.90039c-4.7998 -5.09961 -8.7998 -12.2998 -14.2998 -18c-7.7998 -6.5 -9.2998 -6.19922 -19.6006 -9.89941c-6.2998 -2.2002 -11.2998 -4.60059 -14.7998 -11.2998c-2.7002 -5 -2.09961 -12.2002 -0.899414 -20
186
+ c1.19922 -7.90039 3 -16.3008 0.599609 -23.9004v-0.200195c-5 -13.7002 -5 -21.7002 -2.59961 -26.3994c7.89941 -15.4004 46.5996 -6.10059 76.5 -21.9004c31.3994 -16.4004 72.5996 -17.0996 75.2998 18zM171.3 3.40039c37.6006 -25.7002 82.2002 -15.7002 114.3 7.19922
187
+ c3.2002 11 6.30078 21.3008 6.80078 29c0.799805 15.2002 1.59961 28.7002 4.39941 39.9004c3.10059 12.5996 9.2998 23.0996 21.4004 27.2998c2.2998 21.1006 18.7002 21.1006 38.2998 12.5c18.9004 -8.5 26 -16 22.7998 -26.0996c1 0 2 0.0996094 4.2002 0
188
+ c5.2002 16.8994 -14.2998 28 -30.7002 34.7998c2.90039 12 2.40039 24.0996 -0.399414 35.7002c-6 25.2998 -22.6006 47.7998 -35.2002 59c-2.2998 0.0996094 -2.10059 -1.90039 2.59961 -6.5c11.6006 -10.7002 37.1006 -49.2002 23.2998 -84.9004
189
+ c-3.89941 1 -7.59961 1.5 -10.8994 1.40039c-5.2998 29.0996 -17.5 53.2002 -23.6006 64.5996c-11.5 21.4004 -29.5 65.2998 -37.1992 95.7002c-4.5 -6.40039 -12.4004 -11.9004 -22.3008 -15c-4.69922 -1.5 -9.69922 -5.5 -15.8994 -9
190
+ c-13.9004 -8 -30 -8.7998 -42.4004 1.2002c-4.5 3.59961 -8 7.59961 -12.5996 10.2998c-1.60059 0.900391 -5.10059 3.2998 -6.2002 4.09961c-2 -37.7998 -27.2998 -85.2998 -39.2998 -112.699c-8.2998 -19.7002 -13.2002 -40.8008 -13.7998 -61.5
191
+ c-21.8008 29.0996 -5.90039 66.2998 2.59961 82.3994c9.5 17.6006 11 22.5 8.7002 20.7998c-8.60059 -14 -22 -36.2998 -27.2002 -59.1992c-2.7002 -11.9004 -3.2002 -24 0.299805 -35.2002s11.1006 -21.5 24.6006 -29.9004c0 0 24.7998 -14.2998 38.2998 -32.5
192
+ c7.39941 -10 9.7002 -18.7002 7.39941 -24.8994c-2.5 -6.7002 -9.59961 -8.90039 -16.6992 -8.90039c4.7998 -6 10.2998 -13 14.3994 -19.5996zM428.7 14.9004c0.299805 5.09961 -3.10059 13 -13.7002 24.5996c-10 11.2998 -7.2002 33.0996 -17.0996 41.5996
193
+ c-6.90039 6 -13.6006 5.40039 -22.6006 5.10059c-7.7002 -8.7998 -25.7998 -19.6006 -38.3994 -16.2998c-11.5 2.89941 -18 16.2998 -18.8008 29.5c-0.299805 -0.200195 -0.699219 -0.300781 -1 -0.5c-7.09961 -3.90039 -11.0996 -10.8008 -13.6992 -21.1006
194
+ c-2.5 -10.2002 -3.40039 -23.5 -4.2002 -38.7002c-0.700195 -11.7998 -6.2002 -26.3994 -9.90039 -40.5996c-3.5 -13.2002 -5.7998 -25.2002 -1.09961 -36.2998c7.2002 -14.5 19.5 -20.4004 33.7002 -19.2998c14.1992 1.09961 30.3994 9.7998 43.5996 25.5
195
+ c22 26.5996 62.2998 29.6992 63.2002 46.5zM173.3 299.3c-3.5 2.7998 -3.09961 6.60059 -1.7002 6.5c2.40039 -0.299805 2.80078 -3.5 4.30078 -4.89941c2 -1.90039 4.59961 -4.40039 7.69922 -6.90039c6.2002 -4.90039 14.5 -9.7002 24.9004 -9.7002
196
+ s22.5 6 29.9004 10.2002c4.19922 2.40039 9.5 6.59961 13.8994 9.7998c3.40039 2.5 3.2002 5.40039 6 5.10059c2.7998 -0.300781 0.799805 -3.2002 -3.09961 -6.60059c-3.90039 -3.39941 -9.90039 -7.7998 -14.7998 -10.3994
197
+ c-9.30078 -4.90039 -20.2002 -10.8008 -31.8008 -10.8008c-11.5 0 -20.6992 5.40039 -27.2998 10.6006c-3.2998 2.59961 -6 5.2002 -8 7.09961z" />
198
+ <glyph glyph-name="dribbble" unicode="&#xf17d;" horiz-adv-x="512"
199
+ d="M256 440c136.748 0 248 -111.252 248 -248s-111.252 -248 -248 -248s-248 111.252 -248 248s111.252 248 248 248zM419.97 325.634c-4.46582 -6.04102 -39.9629 -51.5459 -118.284 -83.5225c7.43652 -15.2217 12.8652 -27.5732 18.6172 -41.6143
200
+ c70.4844 8.86426 140.519 -5.34082 147.502 -6.81836c-0.46582 49.998 -18.332 95.9092 -47.835 131.955zM396.421 350.13c-52.0947 46.2188 -122.885 63.6816 -190.061 47.4893c5.85449 -7.83984 44.3281 -60.2324 79.04 -124.008
201
+ c75.3232 28.2324 107.211 71.0918 111.021 76.5186zM165.941 383.38c-59.2637 -27.9531 -103.562 -82.585 -117.298 -148.318c9.47461 -0.125 96.7471 -0.503906 195.834 25.8096c-35.0986 62.3926 -72.9512 114.85 -78.5361 122.509zM44.1699 191.677
202
+ c0 -54.4072 20.624 -104.082 54.457 -141.636c34.3369 58.7793 103.932 120.731 180.531 142.306c-5.31738 12.0342 -11.1104 24.0811 -17.1738 35.9492c-105.786 -31.6592 -208.438 -30.3359 -217.706 -30.1455c-0.0654297 -2.15137 -0.108398 -4.30762 -0.108398 -6.47363
203
+ zM125.977 24.5645c62.7539 -48.9355 144.656 -56.8955 212.769 -27.8828c-3.15039 18.585 -15.4492 83.3555 -45.1895 160.639c-85.4004 -29.1348 -145.452 -87.5234 -167.579 -132.756zM374.357 16.0752c47.5215 32.1338 81.3525 83.0371 90.7949 141.978
204
+ c-7.24707 2.28711 -65.5674 19.6816 -131.947 9.05566c27.7061 -76.1367 38.9805 -138.147 41.1523 -151.033z" />
205
+ <glyph glyph-name="skype" unicode="&#xf17e;" horiz-adv-x="447"
206
+ d="M424.7 148.2c14.5996 -18.9004 23.2998 -42.5 23.2002 -68.1006c0 -61.7998 -50.2002 -112 -112 -112c-25.6006 0 -49.2002 8.7002 -68.2002 23.3008c-14.1006 -3 -28.9004 -4.7002 -43.7998 -4.7002c-113.4 0 -205.301 91.7998 -205.301 205.3
207
+ c0 14.9004 1.80078 29.7998 4.7002 43.7998c-14.5996 18.9004 -23.2998 42.5 -23.2998 68.2002c0 61.7998 50.2002 112 112 112c25.7002 0 49.2998 -8.7002 68.2998 -23.4004c14.1006 3 28.9004 4.7002 43.7998 4.7002c113.4 0 205.301 -91.7998 205.301 -205.3
208
+ c0 -14.9004 -1.80078 -29.7998 -4.7002 -43.7998zM230.1 56.7002c54.9004 0 112 27.3994 112 86.5c0 50.7998 -49.2998 68.2998 -90.6992 77.5996c-48.3008 11.2002 -69.1006 13.2002 -69.1006 33c0 15.5 16.2998 22.5 42 22.5c45.7998 0 46.7002 -33.5 75 -33.5
209
+ c18.9004 0 30.2998 14.9004 30.2998 31.7998c0 33.5 -55.6992 55.4004 -110.8 55.4004c-50.5 0 -109.1 -21.9004 -109.1 -81.0996c0 -65.2002 55.2998 -71.8008 117.8 -87.2002c26 -6.40039 42 -9.2998 42 -28c0 -14.9004 -16.5996 -26.2998 -42.2998 -26.2998
210
+ c-54 0 -56.9004 44.8994 -88.1006 44.8994c-20.5 0 -29.5 -14.5996 -29.5 -30.5996c0 -35.7998 54.9004 -65 120.5 -65z" />
211
+ <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="368"
212
+ d="M323.1 445c40 0 50.7002 -22.7998 42.2002 -65.2002l-48.5996 -243c-3.7002 -14.5 -9.2002 -39.7002 -44.2998 -39.7002h-83.4004c-3.40039 0 -3.7002 0.300781 -6.7998 -3.09961c0 0 -2.2002 -2.5 -131.101 -151.9
213
+ c-10.0996 -11.6992 -26.6992 -9.59961 -32.8994 -7.09961c-6.10059 2.40039 -18.2002 9.7998 -18.2002 30.0996v433.801c0 17.7998 12.4004 46.0996 49.9004 46.0996h273.199zM306.8 371.2c2.10059 9.7998 -5.2998 17.5 -13.5 17.5h-219
214
+ c-9.7998 0 -16.5996 -8.90039 -16.5996 -16.6006v-338.8c0 -0.899414 0.899414 -1.2002 1.7998 -0.299805c80.5996 96.9004 89.5 108.3 89.5 108.3c9.2998 10.7998 13 12.6006 26.5 12.6006h73.5c10.0996 0 16 8.59961 16.9004 13.5
215
+ c0.899414 5 9.59961 49.8994 11.3994 58.7998c1.7998 9 -6.5 18.2002 -14.7998 18.2002h-90.4004c-12 0 -20.5996 8.59961 -20.5996 20.5996v13c0 12 8.59961 20.2998 20.5996 20.2998h106.4c7.40039 0 15.7002 6.7002 16.9004 13.2002z" />
216
+ <glyph glyph-name="trello" unicode="&#xf181;" horiz-adv-x="447"
217
+ d="M392.3 416c30.7998 -0.200195 55.7002 -25.2002 55.6006 -56v-336c0 -30.7998 -24.9004 -55.7998 -55.7002 -56h-336.2c-30.9004 0 -56 25.0996 -56 56c0 340 -0.0996094 336 0 336c0 30.9004 25.0996 56 56.0996 56h336.2zM197 76.7002h0.0996094v254.2
218
+ c0 14.8994 -12.0996 26.8994 -26.8994 26.8994h-82.9004c-14.8994 0 -26.8994 -12.0996 -26.8994 -26.8994v-254.2c0.0996094 -14.7998 12.1992 -26.7002 27 -26.6006h82.6992c14.8008 0 26.7002 11.9004 26.9004 26.6006zM390.1 188.7v142.1
219
+ c0 14.9004 -12.0996 26.9004 -26.8994 26.9004h-81.1006c-14.7998 0 -26.7998 -12.1006 -26.7998 -26.9004v-142.1c0 -14.9004 12.1006 -26.9004 26.9004 -26.9004h81c14.8994 0 26.8994 12.1006 26.8994 26.9004z" />
220
+ <glyph glyph-name="gratipay" unicode="&#xf184;" horiz-adv-x="496"
221
+ d="M248 440c136.9 0 248 -111.1 248 -248s-111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248zM362.6 213.6c8.80078 12 19.1006 50.4004 -13.7998 72c-27.7002 18.1006 -54.2002 4.2002 -68.0996 -11.8994c-15.1006 -16.9004 -45.7998 -17.9004 -61.7002 0
222
+ c-13.9004 16.0996 -40.4004 30 -68.5 11.8994c-32.7002 -21.5996 -22.2998 -60.0996 -13.5996 -72l112.699 -152.699z" />
223
+ <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="575"
224
+ d="M545 330.3c-7.40039 -34.2998 -79.2998 -135.5 -79.4004 -135.6c-6.19922 -10 -8.69922 -15 0 -26.2002c3.40039 -4.7998 79.1006 -76.5996 90.3008 -111.5c4.89941 -16.5996 -3.60059 -25 -20.4004 -25h-58.9004c-22.3994 0 -29 17.9004 -69 57.9004
225
+ c-35 33.6992 -50 38.0996 -58.6992 38.0996c-18.8008 0 -15.4004 -6.2998 -15.4004 -73.0996c0 -14.5 -4.59961 -22.9004 -42.0996 -22.9004c-62.4004 0 -131 37.9004 -179.7 107.8c-73.1006 102.4 -93.1006 179.9 -93.1006 195.5c0 8.7998 3.40039 16.7002 20.2002 16.7002
226
+ h58.9004c15.0996 0 20.7998 -6.59961 26.5996 -22.9004c28.7998 -84 77.4004 -157.399 97.4004 -157.399c7.5 0 10.8994 3.5 10.8994 22.5v86.7998c-2.19922 40 -23.3994 43.2998 -23.3994 57.5c0 6.5 5.59961 13.5 15 13.5h92.5996
227
+ c12.4004 0 16.6006 -6.7002 16.6006 -21.7002v-116.7c0 -12.5 5.69922 -16.8994 9.39941 -16.8994c7.5 0 13.7998 4.39941 27.5 18.0996c42.4004 47.4004 72.4004 120.5 72.4004 120.5c3.7002 8.7998 10.5996 16.7002 25.5996 16.7002h58.9004
228
+ c17.7998 0 21.5 -9.2002 17.7998 -21.7002z" />
229
+ <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="511"
230
+ d="M407 270.4c7.59961 24 -13.4004 46.7998 -37.4004 41.6992c-22 -4.7998 -28.7998 28.1006 -7.09961 32.8008c50.0996 10.8994 92.2998 -37.1006 76.5 -84.8008c-6.7998 -21.1992 -38.7998 -10.7998 -32 10.3008zM214.8 1.2998c-106.3 0 -214.8 51.4004 -214.8 136.3
231
+ c0 44.3008 28 95.4004 76.2998 143.7c99.7002 99.7002 203.2 100.9 173.601 5.7002c-4 -13.0996 12.2998 -5.7002 12.2998 -6c79.5 33.5996 140.5 16.7998 114 -51.4004c-3.7002 -9.39941 1.09961 -10.8994 8.2998 -13.0996c135.7 -42.2998 34.7998 -215.2 -169.7 -215.2z
232
+ M358.5 147.6c-5.40039 55.7002 -78.5 94 -163.4 85.7002c-84.7998 -8.59961 -148.8 -60.2998 -143.399 -116c5.39941 -55.7002 78.5 -94 163.399 -85.7002c84.8008 8.60059 148.801 60.3008 143.4 116zM347.9 412.9c102.3 21.5996 189.3 -74.5 157.399 -174.301
233
+ c-8.2998 -25 -44.7998 -12.1992 -37.3994 12c23.0996 71.2002 -39.4004 139.2 -111.7 124c-25.1006 -5.39941 -34.2002 32.7002 -8.2998 38.3008zM269.4 101.9c-17.1006 -38.8008 -66.8008 -60 -109.101 -46.3008c-40.7998 13.1006 -58 53.4004 -40.2998 89.7002
234
+ c17.7002 35.4004 63.0996 55.4004 103.4 45.1006c42 -10.8008 63.0996 -50.2002 46 -88.5zM183.1 131.9c-12.8994 5.39941 -30 -0.300781 -38 -12.9004c-8.2998 -12.9004 -4.2998 -28 8.60059 -34c13.0996 -6 30.7998 -0.299805 39.0996 12.9004
235
+ c8 13.0996 3.7002 28.2998 -9.7002 34zM215.7 145.3c-5.10059 1.7002 -11.4004 -0.599609 -14.2998 -5.39941c-2.90039 -5.10059 -1.40039 -10.6006 3.69922 -12.9004c5.10059 -2 11.7002 0.299805 14.6006 5.40039c2.7998 5.19922 1.09961 10.8994 -4 12.8994z" />
236
+ <glyph glyph-name="renren" unicode="&#xf18b;" horiz-adv-x="512"
237
+ d="M214 278.9c0 -110.4 -61 -205.4 -147.6 -247.4c-36.4004 43.2998 -58.4004 98.7998 -58.4004 159.9c0 122.699 89.0996 224.399 206 244.1v-156.6zM255 -56c-42.9004 0 -83.2998 11 -118.5 30.4004c57.2002 36.0996 103.4 90.6992 118.5 154.6
238
+ c15.5 -63.9004 61.7002 -118.5 118.8 -154.7c-35.0996 -19.2998 -75.5 -30.2998 -118.8 -30.2998zM445.6 31.5c-86.5996 42 -147.6 136.9 -147.6 247.4v156.6c116.9 -19.7002 206 -121.4 206 -244.1c0 -61.1006 -22 -116.601 -58.4004 -159.9z" />
239
+ <glyph glyph-name="pagelines" unicode="&#xf18c;" horiz-adv-x="384"
240
+ d="M384 135.3c-55.0996 -136.7 -187.1 -54 -187.1 -54c-40.5 -81.7998 -107.4 -134.399 -184.601 -134.7c-16.0996 0 -16.5996 24.4004 0 24.4004c64.4004 0.299805 120.5 42.7002 157.2 110.1c-41.0996 -15.8994 -118.6 -27.8994 -161.6 82.2002
241
+ c109 44.9004 159.1 -11.2002 178.3 -45.5c9.89941 24.4004 17 50.9004 21.5996 79.7002c0 0 -139.7 -21.9004 -149.5 98.0996c119.101 47.9004 152.601 -76.6992 152.601 -76.6992c1.59961 16.6992 3.2998 52.5996 3.2998 53.3994c0 0 -106.3 73.7002 -38.1006 165.2
242
+ c124.601 -43 61.4004 -162.4 61.4004 -162.4c0.5 -1.59961 0.5 -23.7998 0 -33.3994c0 0 45.2002 89 136.4 57.5c-4.2002 -134 -141.9 -106.4 -141.9 -106.4c-4.40039 -27.3994 -11.2002 -53.3994 -20 -77.5c0 0 83 91.7998 172 20z" />
243
+ <glyph glyph-name="stack-exchange" unicode="&#xf18d;"
244
+ d="M17.7002 115.7h412.7v-22c0 -37.7002 -29.3008 -68 -65.3008 -68h-19l-86.7998 -89.7002v89.7002h-176.3c-36 0 -65.2998 30.2998 -65.2998 68v22zM17.7002 139.3v85h412.7v-85h-412.7zM17.7002 248.7v85h412.7v-85h-412.7zM365 448
245
+ c36 0 65.2998 -30.2998 65.4004 -67.7002v-22.2998h-412.7v22.2998c0 37.4004 29.2998 67.7002 65.2998 67.7002h282z" />
246
+ <glyph glyph-name="vimeo-square" unicode="&#xf194;"
247
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM383.8 266.4c1.90039 41.5996 -13.5996 63 -46.5 64c-44.2998 1.39941 -74.3994 -23.6006 -90.0996 -75.1006
248
+ c19.5996 8.40039 48.5996 10.6006 45.2002 -22.2002c-0.900391 -11.0996 -8.10059 -27.0996 -21.5 -48.2998c-37.2002 -58.7002 -46.3008 -39.0996 -66.8008 90.5c-5.7998 36.5 -21.0996 53.5 -46 51.1006c-22 -2 -57.1992 -38 -94.0996 -70.4004l15 -19.4004
249
+ c14.2998 10.1006 22.7002 15.1006 25.0996 15.1006c20.8008 0 31.5 -54.1006 56.7002 -146.4c12.9004 -34.3994 28.6006 -51.5996 47.2998 -51.5996c30.1006 0 66.9004 28.2998 110.4 84.7998c42.0996 54.0996 63.9004 96.7998 65.2998 127.9z" />
250
+ <glyph glyph-name="slack" unicode="&#xf198;"
251
+ d="M94.1201 132.9c0 -25.9004 -21.1602 -47.0605 -47.0605 -47.0605c-25.8994 0 -47.0596 21.1602 -47.0596 47.0605c0 25.8994 21.1602 47.0596 47.0596 47.0596h47.0605v-47.0596zM117.84 132.9c0 25.8994 21.1602 47.0596 47.0605 47.0596
252
+ c25.8994 0 47.0596 -21.1602 47.0596 -47.0596v-117.841c0 -25.8994 -21.1602 -47.0596 -47.0596 -47.0596c-25.9004 0 -47.0605 21.1602 -47.0605 47.0596v117.841zM164.9 321.88c-25.9004 0 -47.0605 21.1602 -47.0605 47.0605c0 25.8994 21.1602 47.0596 47.0605 47.0596
253
+ c25.8994 0 47.0596 -21.1602 47.0596 -47.0596v-47.0605h-47.0596zM164.9 298.16c25.8994 0 47.0596 -21.1602 47.0596 -47.0605c0 -25.8994 -21.1602 -47.0596 -47.0596 -47.0596h-117.841c-25.8994 0 -47.0596 21.1602 -47.0596 47.0596
254
+ c0 25.9004 21.1602 47.0605 47.0596 47.0605h117.841zM353.88 251.1c0 25.9004 21.1602 47.0605 47.0605 47.0605c25.8994 0 47.0596 -21.1602 47.0596 -47.0605c0 -25.8994 -21.1602 -47.0596 -47.0596 -47.0596h-47.0605v47.0596zM330.16 251.1
255
+ c0 -25.8994 -21.1602 -47.0596 -47.0605 -47.0596c-25.8994 0 -47.0596 21.1602 -47.0596 47.0596v117.841c0 25.8994 21.1602 47.0596 47.0596 47.0596c25.9004 0 47.0605 -21.1602 47.0605 -47.0596v-117.841zM283.1 62.1201c25.9004 0 47.0605 -21.1602 47.0605 -47.0605
256
+ c0 -25.8994 -21.1602 -47.0596 -47.0605 -47.0596c-25.8994 0 -47.0596 21.1602 -47.0596 47.0596v47.0605h47.0596zM283.1 85.8398c-25.8994 0 -47.0596 21.1602 -47.0596 47.0605c0 25.8994 21.1602 47.0596 47.0596 47.0596h117.841
257
+ c25.8994 0 47.0596 -21.1602 47.0596 -47.0596c0 -25.9004 -21.1602 -47.0605 -47.0596 -47.0605h-117.841z" />
258
+ <glyph glyph-name="wordpress" unicode="&#xf19a;" horiz-adv-x="512"
259
+ d="M61.7002 278.6l101.5 -278c-71 34.4004 -119.9 107.2 -119.9 191.4c0 30.9004 6.60059 60.0996 18.4004 86.5996zM399.6 202.7c0 -18.2002 -7 -39.2998 -16 -68.7002l-21.1992 -70.9004l-76.9004 228.7c12.7998 0.700195 24.2998 2 24.2998 2
260
+ c11.4004 1.2998 10.1006 18.2002 -1.39941 17.5c0 0 -34.5 -2.7002 -56.7002 -2.7002c-20.9004 0 -56 2.7002 -56 2.7002c-11.4004 0.700195 -12.7998 -16.7998 -1.2998 -17.5c0 0 10.7998 -1.2998 22.2998 -2l33.0996 -90.7998l-46.5996 -139.6l-77.5 230.399
261
+ c12.7998 0.700195 24.2998 2 24.2998 2c11.4004 1.2998 10.0996 18.2002 -1.40039 17.5c0 0 -34.5 -2.7002 -56.6992 -2.7002c-4 0 -8.7002 0.100586 -13.7002 0.300781c38.0996 57.7998 103.5 95.8994 177.8 95.8994c55.4004 0 105.8 -21.2002 143.7 -55.8994
262
+ c-1 0.0996094 -1.90039 0.199219 -2.7998 0.199219c-20.9004 0 -35.7002 -18.1992 -35.7002 -37.7998c0 -17.5 10.0996 -32.3994 20.8994 -49.8994c8.10059 -14.2002 17.5 -32.4004 17.5 -58.7002zM259.7 173.4l65.3994 -179.2c0.400391 -1 0.900391 -2 1.5 -2.90039
263
+ c-22.0996 -7.7998 -45.7998 -12.0996 -70.5996 -12.0996c-20.9004 0 -41 3.09961 -60.0996 8.7002zM442.7 294.1c16.5996 -30.2998 26 -65.0996 26 -102.1c0 -78.5 -42.5 -147 -105.8 -183.9l65 187.9c12.1992 30.4004 16.1992 54.5996 16.1992 76.2002
264
+ c0 7.89941 -0.5 15.0996 -1.39941 21.8994zM504 192c0 -136.8 -111.3 -248 -248 -248c-136.8 0 -248 111.3 -248 248c0 136.8 111.2 248 248 248c136.7 0 248 -111.2 248 -248zM492.6 192c0 130.5 -106.199 236.6 -236.6 236.6c-130.5 0 -236.6 -106.1 -236.6 -236.6
265
+ s106.199 -236.6 236.6 -236.6c130.5 0 236.6 106.1 236.6 236.6z" />
266
+ <glyph glyph-name="openid" unicode="&#xf19b;"
267
+ d="M271.5 16l-68 -32c-115 10.2998 -203.5 71.5 -203.5 145.8c0 71.5 82.5 131 191.7 144.3v-43c-71.5 -12.5 -124 -53 -124 -101.3c0 -51 58.5 -93.2998 135.7 -103v340l68 33.2002v-384h0.0996094zM448 157l-131.3 28.5l36.7998 20.7002c-19.5 11.5 -43.5 20 -70 24.7998
268
+ v43c46.2002 -5.5 87.7002 -19.5 120.3 -39.2998l35 19.7998z" />
269
+ <glyph glyph-name="yahoo" unicode="&#xf19e;" horiz-adv-x="447"
270
+ d="M252 156l4 -220c-12.7002 2.2002 -23.5 3.90039 -32.2998 3.90039c-8.40039 0 -19.2002 -1.7002 -32.2998 -3.90039l4 220c-55 94.7998 -110.4 196.8 -174 292c11.8994 -3.09961 23 -3.90039 33.1992 -3.90039c9 0 20.4004 0.800781 34.1006 3.90039
271
+ c40.8994 -72.2002 82.0996 -138.7 135 -225.5c37.2998 61.5996 91.0996 144.1 134.899 225.5c11.1006 -2.90039 22 -3.90039 32.9004 -3.90039c11.5 0 23.2002 1 35 3.90039c-34.4004 -47.9004 -131.6 -216.9 -174.5 -292z" />
272
+ <glyph glyph-name="google" unicode="&#xf1a0;" horiz-adv-x="488"
273
+ d="M488 186.2c0 -141.5 -96.9004 -242.2 -240 -242.2c-137.2 0 -248 110.8 -248 248s110.8 248 248 248c66.7998 0 123 -24.5 166.3 -64.9004l-67.5 -64.8994c-88.2998 85.2002 -252.5 21.2002 -252.5 -118.2c0 -86.5 69.1006 -156.6 153.7 -156.6
274
+ c98.2002 0 135 70.3994 140.8 106.899h-140.8v85.2998h236.1c2.30078 -12.6992 3.90039 -24.8994 3.90039 -41.3994z" />
275
+ <glyph glyph-name="reddit" unicode="&#xf1a1;" horiz-adv-x="512"
276
+ d="M201.5 142.5c-13.7998 0 -24.9004 11.0996 -24.9004 24.5996c0 13.8008 11.1006 24.9004 24.9004 24.9004c13.5996 0 24.5996 -11.0996 24.5996 -24.9004c0 -13.5996 -11.0996 -24.5996 -24.5996 -24.5996zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248
277
+ s111 248 248 248s248 -111 248 -248zM371.7 233.2c-9.40039 0 -17.7002 -3.90039 -23.7998 -10c-22.4004 15.5 -52.6006 25.5 -86.1006 26.5996l17.4004 78.2998l55.3994 -12.5c0 -13.5996 11.1006 -24.5996 24.6006 -24.5996c13.7998 0 24.8994 11.2998 24.8994 24.9004
278
+ c0 13.5996 -11.0996 24.8994 -24.8994 24.8994c-9.7002 0 -18 -5.7998 -22.1006 -13.7998l-61.1992 13.5996c-3 0.800781 -6.10059 -1.39941 -6.90039 -4.39941l-19.0996 -86.4004c-33.2002 -1.39941 -63.1006 -11.2998 -85.5 -26.7998
279
+ c-6.10059 6.40039 -14.7002 10.2002 -24.1006 10.2002c-34.8994 0 -46.2998 -46.9004 -14.3994 -62.7998c-1.10059 -5 -1.7002 -10.2002 -1.7002 -15.5c0 -52.6006 59.2002 -95.2002 132 -95.2002c73.0996 0 132.3 42.5996 132.3 95.2002
280
+ c0 5.2998 -0.599609 10.7998 -1.90039 15.7998c31.3008 16 19.8008 62.5 -14.8994 62.5zM302.8 117c2.2002 2.2002 6.10059 2.2002 8.2998 0c2.5 -2.5 2.5 -6.40039 0 -8.59961c-22.8994 -22.8008 -87.3994 -22.8008 -110.199 0c-2.5 2.19922 -2.5 6.09961 0 8.59961
281
+ c2.19922 2.2002 6.09961 2.2002 8.2998 0c17.5 -17.9004 75.3994 -18.2002 93.5996 0zM310.5 192c13.9004 0 24.9004 -11.0996 24.9004 -24.9004c0 -13.5 -11.1006 -24.5996 -24.9004 -24.5996c-13.5 0 -24.5996 11 -24.5996 24.5996c0 13.8008 11 24.9004 24.5996 24.9004z
282
+ " />
283
+ <glyph glyph-name="reddit-square" unicode="&#xf1a2;"
284
+ d="M283.2 102.5c2.7002 -2.7002 2.7002 -6.7998 0 -9.2002c-24.5 -24.5 -93.7998 -24.5996 -118.4 0c-2.7002 2.40039 -2.7002 6.5 0 9.2002c2.40039 2.40039 6.5 2.40039 8.90039 0c18.7002 -19.2002 81 -19.5996 100.5 0c2.39941 2.2998 6.59961 2.2998 9 0zM191.9 156.3
285
+ c0 -14.5996 -11.9004 -26.5 -26.5 -26.5c-14.9004 0 -26.8008 11.9004 -26.8008 26.5c0 14.9004 11.9004 26.7998 26.8008 26.7998c14.5996 0 26.5 -11.8994 26.5 -26.7998zM282.6 183.1c14.9004 0 26.8008 -11.8994 26.8008 -26.7998
286
+ c0 -14.5996 -11.9004 -26.5 -26.8008 -26.5c-14.5996 0 -26.5 11.9004 -26.5 26.5c0 14.9004 11.9004 26.7998 26.5 26.7998zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM348.3 227.4
287
+ c-10.0996 0 -19 -4.2002 -25.5996 -10.7002c-24.1006 16.7002 -56.5 27.3994 -92.5 28.5996l18.7002 84.2002l59.5 -13.4004c0 -14.5996 11.8994 -26.5 26.5 -26.5c14.8994 0 26.7998 12.2002 26.7998 26.8008c0 14.5996 -11.9004 26.7998 -26.7998 26.7998
288
+ c-10.4004 0 -19.3008 -6.2002 -23.8008 -14.9004l-65.6992 14.6006c-3.30078 0.899414 -6.5 -1.5 -7.40039 -4.80078l-20.5 -92.7998c-35.7002 -1.5 -67.7998 -12.2002 -91.9004 -28.8994c-6.5 6.7998 -15.7998 11 -25.8994 11c-37.5 0 -49.7998 -50.4004 -15.5 -67.5
289
+ c-1.2002 -5.40039 -1.7998 -11 -1.7998 -16.7002c0 -56.5 63.6992 -102.3 141.899 -102.3c78.5 0 142.2 45.7998 142.2 102.3c0 5.7002 -0.599609 11.5996 -2.09961 17c33.5996 17.2002 21.1992 67.2002 -16.1006 67.2002z" />
290
+ <glyph glyph-name="stumbleupon-circle" unicode="&#xf1a3;" horiz-adv-x="512"
291
+ d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 262.5c9.7998 0 17.7998 -8 17.7002 -17.5996v-20.6006l22.8994 -10.7002l34.1006 10.1006v23.7002c0 40.2998 -34 72.5996 -74.7002 72.5996
292
+ c-40.5 0 -74.7002 -32.0996 -74.7002 -72.0996v-108.4c0 -9.90039 -8 -17.7998 -17.7998 -17.7998s-17.7998 7.7998 -17.7998 17.7998v45.7998h-57.2998v-46.5c0 -41.3994 33.5 -74.8994 74.8994 -74.8994c41 0 74.9004 33 74.9004 73.8994v106.9
293
+ c0 9.7998 8 17.7998 17.7998 17.7998zM423.6 138.9c0 0 0 0.5 0.100586 46.3994h-57.2998v-48c0 -9.7002 -8 -17.5996 -17.8008 -17.5996c-9.7998 0 -17.7998 7.7998 -17.7998 17.5996v47.1006l-34.0996 -10.1006l-22.9004 10.7002v-46.7998
294
+ c0 -41 33.7002 -74.2002 74.9004 -74.2002c41.3994 0 74.8994 33.5 74.8994 74.9004z" />
295
+ <glyph glyph-name="stumbleupon" unicode="&#xf1a4;" horiz-adv-x="502"
296
+ d="M502.9 182v-69.7002c0 -62.0996 -50.3008 -112.399 -112.4 -112.399c-61.7998 0 -112.4 49.7998 -112.4 111.3v70.2002l34.3008 -16l51.0996 15.1992v-70.5996c0 -14.7002 12 -26.5 26.7002 -26.5s26.7998 11.7998 26.7998 26.5v72h85.9004zM278.2 240.2v30.8994
297
+ c0 14.7002 -12 26.7002 -26.7002 26.7002s-26.7002 -12 -26.7002 -26.7002v-160.3c0 -61.2998 -50.7998 -110.8 -112.399 -110.8c-62.1006 0 -112.4 50.2998 -112.4 112.3v69.7002h86v-68.5996c0 -14.9004 12 -26.7002 26.7002 -26.7002s26.7002 11.7998 26.7002 26.7002
298
+ v162.399c0 60 51.2998 108.2 112.1 108.2c61 0 112.1 -48.5 112.1 -109v-35.5996l-51.0996 -15.2002z" />
299
+ <glyph glyph-name="delicious" unicode="&#xf1a5;"
300
+ d="M446.5 380c1 -3.7998 1.5 -7.90039 1.59961 -12v-352.1c0 -26.5 -21.5 -48 -48 -48h-352c-4.09961 0 -8.19922 0.5 -12 1.5c-7.69922 2 -14.5996 5.7998 -20.2998 11c-1.2002 1.09961 -2.2998 2.19922 -3.2998 3.2998c-5.2002 5.7002 -9 12.5996 -11 20.2998
301
+ c-1 3.7998 -1.5 7.90039 -1.5 12v352c0 26.5 21.5 48 48 47.9004h352c4.09961 0 8.2002 -0.5 12 -1.5c1.90039 -0.400391 3.7002 -1 5.40039 -1.7002c1.89941 -0.700195 3.69922 -1.5 5.5 -2.5c1.39941 -0.700195 2.69922 -1.5 4 -2.40039
302
+ c1.09961 -0.799805 2.19922 -1.59961 3.2998 -2.5c2.5 -2 4.7998 -4.2998 6.89941 -6.7998c1.7002 -2.09961 3.30078 -4.5 4.7002 -6.90039c1.2998 -2.2998 2.40039 -4.59961 3.2998 -7.09961c0.5 -1.5 1 -3 1.40039 -4.5zM416 16v176h-192v192h-176
303
+ c-8.7998 0 -16 -7.2002 -16 -16v-176h192v-192h176c8.7998 0 16 7.2002 16 16z" />
304
+ <glyph glyph-name="digg" unicode="&#xf1a6;" horiz-adv-x="512"
305
+ d="M81.7002 275.7v76.2998h51v-250.7h-132.7v174.4h81.7002zM81.7002 142.3v92.2998h-30.7998v-92.2998h30.7998zM378.9 275.7h133.1v-243.7h-133.1v40.7998h81.7998v28.5h-81.7998v174.4zM460.7 142.3v92.2998h-30.7998v-92.2998h30.7998zM225.1 101.3v174.4h133.301
306
+ v-243.7h-133.301v40.7998h82.1006v28.5h-82.1006zM276.3 234.6v-92.2998h30.7998v92.2998h-30.7998zM153.3 352h51.2998v-51h-51.2998v51zM153.3 275.7h51.2998v-174.4h-51.2998v174.4z" />
307
+ <glyph glyph-name="pied-piper-pp" unicode="&#xf1a7;"
308
+ d="M205.3 273.4c0 -21.1006 -14.2002 -38.1006 -31.7002 -38.1006c-7.09961 0 -12.7998 1.2002 -17.1992 3.7002v68c4.39941 2.7002 10.0996 4.2002 17.1992 4.2002c17.5 0 31.7002 -16.9004 31.7002 -37.7998zM257.9 206.4c17.3994 0 31.6992 -17 31.6992 -38.1006
309
+ c0 -20.8994 -14.2998 -37.7998 -31.6992 -37.7998c-7.10059 0 -12.8008 1.2002 -17.2002 3.7002v68c4.39941 2.7002 10.0996 4.2002 17.2002 4.2002zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
310
+ c26.5 0 48 -21.5 48 -48zM185 192.9c41 0 74.2002 35.5996 74.2002 79.5996s-33.2002 79.5996 -74.2002 79.5996c-12 0 -24.0996 -3.19922 -34.5996 -8.7998h-45.7002v-206.3l51.7998 10.0996v50.6006c8.59961 -3.10059 18.0996 -4.7998 28.5 -4.7998zM343.4 167.6
311
+ c0 44 -33.2002 79.6006 -73.9004 79.6006c-3.2002 0 -6.40039 -0.200195 -9.59961 -0.700195c-3.7002 -12.5 -10.1006 -23.7998 -19.2002 -33.4004c-13.7998 -15 -32.2002 -23.7998 -51.7998 -24.7998v-156.3l51.7998 10.0996v50.6006
312
+ c8.59961 -3.2002 18.2002 -4.7002 28.7002 -4.7002c40.7998 0 74 35.5996 74 79.5996z" />
313
+ <glyph glyph-name="pied-piper-alt" unicode="&#xf1a8;" horiz-adv-x="576"
314
+ d="M244 202l-27.7002 -5.7002l-1.7002 4.90039c6.7002 0.5 12.7002 3.7002 19.3008 3.7002c3.7998 0 6.89941 -0.900391 10.0996 -2.90039zM379.9 4.09961c9.5 0 28.1992 -45.0996 33 -55.0996c-35.9004 -13.4004 -70.3008 -15.9004 -106 -9.7998l-6.90039 45.0996
315
+ c15.7998 10.2998 60.9004 19.7998 79.9004 19.7998zM340.8 271c-7.59961 3.5 -63.8994 6.40039 -98.7998 -10c6.2998 11.7998 13.2002 17 25.9004 21.7998c27.2998 10.2998 40.1992 30.5 58.8994 51.1006c11.9004 -8.40039 12 -24.6006 31.6006 -23v-21.8008
316
+ l6.2998 -0.299805c37.3994 14.4004 74.7002 30.2002 106.6 54.6006c48.2998 36.7998 52.9004 50 81.2998 100l2 2.59961c-0.599609 -14.0996 -6.2998 -27.2998 -12.3994 -39.9004c-30.5 -63.7998 -78.7002 -100.3 -146.8 -116.699
317
+ c-12.4004 -2.90039 -26.4004 -3.2002 -37.6006 -8.90039c1.40039 -9.7998 13.2002 -18.0996 13.2002 -23c0 -3.40039 -5.5 -7.2002 -7.5 -8.59961c-11.2002 12.8994 -16.0996 19.2998 -22.7002 22.0996zM555.5 448l-0.299805 -1.40039l-0.600586 -0.599609
318
+ l0.300781 0.900391zM496.3 65.9004c20.1006 -34.2002 43.7002 -54.3008 72.7002 -79.9004c-31 -19.2998 -70.4004 -32.2002 -103.5 -47.2002c-55.2002 46.2998 -23 229.9 -111.5 229.9c-3.5 -0.700195 -2.40039 -0.299805 -4.59961 -1.7002
319
+ c1.09961 -1.40039 2.59961 -2.90039 3.69922 -4c23.9004 -20.0996 33.4004 -24.4004 34.8008 -58.5996l0.299805 -9.5c0.799805 -21.6006 -5.5 -42.5 -9.7998 -63.5c-25.9004 0.699219 -51.2002 -11 -77.9004 -2.90039c-0.700195 5.90039 -1.09961 30.9004 0.299805 41.0996
320
+ c1.40039 9.5 33.6006 29.9004 33 43.7002c-5.5 0.600586 -9.2002 -2.59961 -12.3994 -6.89941c-13.3008 -19.5 -47.2002 -41.9004 -71.3008 -41.9004c-16.5996 0 -56.2998 71.5 -76.3994 85.9004c-3.2002 2.2998 -5.2002 5.39941 -7.7998 8.59961
321
+ c-16.1006 -3.7998 -139.4 -32.2002 -147.4 -32.2002c-6 0 -11.5 4.90039 -11.5 10.9004c0 5.5 3.40039 10.7002 8.90039 11.7998l139.6 30.4004c-9.5 17.1992 12.2998 17.5 21.5 20.0996c3.2002 0.799805 6.2998 4 9.5 4c6.2998 0 11.7998 -8.90039 13.7998 -14.0996
322
+ c6.2998 1.39941 45.7002 10.5996 49.4004 10.5996c15.2002 0 15.8994 -20.0996 2.89941 -22.7002l-52.2998 -11.5l-0.299805 -4.59961c-0.299805 -10.1006 45.4004 -60.1006 53.4004 -60.1006c18.0996 0 54.8994 41.7002 54.8994 60.1006
323
+ c0 30.7002 -42.7998 12.5996 -42.7998 33.5996c0 3.5 1.2002 6.60059 2.90039 9.7998l-19.5 5.5c13.0996 13.6006 13.7998 31.7002 10.8994 50.3008c14.7002 2.89941 26.7002 4.59961 41.4004 4.59961c56.8994 0 45.7002 -8.59961 65.5 -54.2998l14.3994 7.2002
324
+ c-2.2998 -34.2002 -36.1992 -17.5 -35.0996 -31l0.299805 -6c74.7002 2.89941 116.101 -58.6006 150 -115.5zM300.1 19.7998h8.90039l2.90039 -23.7998l-11.8008 -3.40039v27.2002zM231.4 170.2l13.7998 3.5l31.2998 -50.9004l-21 -13.7998zM315.8 15.2998
325
+ c22.6006 2.5 32.7002 6.2998 59.5 6.2998c0.299805 -1.39941 0.900391 -3.19922 0.900391 -4.59961c0 -7.5 -49.4004 -12.5996 -58.4004 -14.0996z" />
326
+ <glyph glyph-name="drupal" unicode="&#xf1a9;"
327
+ d="M319.5 333.3c13.5 -8.2998 96.5 -67 96.5 -179.3c0 -112 -88.5 -186 -190.2 -186c-102 0 -193.8 80.2998 -193.8 189.5c0 109 85 167.5 100.8 175.8c18.7002 10.1006 32.2002 15.2998 53.5 32.2998c10.5 8.30078 19.2998 20.2002 22 49.5
328
+ c15.2002 -18.2998 33.5 -39.5 46.5 -48.2998c21.2002 -14 42.5 -19.5 64.7002 -33.5zM322 7.7002c4.2002 4.2002 1.90039 13.0996 -4.2002 8.5c-8.5 -6.2998 -27.5 -14 -54.5 -14c-34.5 0 -51.5 13.2998 -51.5 13.2998c-6.2002 0 -11.2998 -7.2002 -6.5 -12
329
+ c26.6006 -24.5 96.6006 -15.9004 116.7 4.2002zM267.5 60.2998c-6.5 -2.7002 -28.4004 -16.7998 -22.4004 -25c2.40039 -3.2998 5.2002 -1.2998 12.2002 4.7002c7.2002 5.7998 12 11 26.7002 11c25.2998 0 18.0996 -19.9004 26.5 -15.7002
330
+ c9.90039 4.90039 -2.09961 20.9004 -6.2002 23.7002c-7.7998 5.09961 -28.0996 4.90039 -36.7998 1.2998zM360 43c39.0996 -3.2998 64.5 106 15.7998 106c-20 0 -60.5 -41.5 -81.7998 -41.7998c-24.7002 -0.5 -59 49 -108.5 48.5
331
+ c-66.4004 -0.400391 -90.5996 -78.6006 -51.7998 -105.2c57.2002 -38.7002 130.399 42.9004 161.3 42c19.5 -0.700195 49.7998 -48.5 65 -49.5z" />
332
+ <glyph glyph-name="joomla" unicode="&#xf1aa;"
333
+ d="M0.599609 355.9c0 33.2998 26.8008 60.0996 59.8008 60.0996c30 0 54.5 -21.9004 59.1992 -50.2002c32.6006 7.60059 67.1006 -0.599609 96.5 -30l-44.2998 -44.2998c-20.5 20.5 -42.5996 16.2998 -55.3994 3.5c-14.3008 -14.2998 -14.3008 -37.9004 0 -52.2002
334
+ l99.5 -99.5l-44 -44.2998c-87.7002 87.2002 -49.7002 49.7002 -99.8008 99.7002c-26.7998 26.5 -35 64.7998 -24.7998 98.8994c-26.8994 5.80078 -46.7002 29.7002 -46.7002 58.3008zM130.1 239.5c28.5 28.4004 81.3008 80.7998 99.6006 99.9004
335
+ c26.5996 26.5996 64.5 35 98.2998 25.0996c4.09961 29.0996 29.2002 51.5996 59.5 51.5996c33 0 59.7998 -26.8994 59.7998 -60.0996c0 -30.2998 -22.7002 -55.4004 -51.8994 -59.5c9.59961 -33.5996 2.2998 -70 -28.9004 -101.2l-44 44.2998
336
+ c20.5 20.4004 16.2998 42.6006 3.5 55.4004c-14.2998 14.2998 -37.5996 14.2998 -51.9004 0c-10 -10.0996 -89.6992 -89.7998 -99.6992 -99.7998zM396.4 87.2998c29.0996 -4.09961 51.5996 -28.8994 51.5996 -59.0996c0 -33.2998 -26.7998 -60.1006 -59.7998 -60.1006
337
+ c-29.2002 0 -53.4004 20.7002 -58.9004 48.1006c-34.7002 -10.7998 -75.0996 -2.2002 -102.7 28l44 44.2998c20.4004 -20.5 42.6006 -16.2998 55.4004 -3.5c14.2998 14.2998 14.2998 37.5996 0 51.9004l-99.7002 99.6992l44.2998 44.3008
338
+ c104.5 -104.4 87.7002 -87.5 99.5 -99.7002c25.4004 -25.4004 34.5 -61.2002 26.3008 -93.9004zM312.1 140.4c-87.2998 -87.3008 -67.3994 -67.7002 -99.5 -99.7002c-25.6992 -25.4004 -61.5 -34.2002 -94.1992 -26c-6.10059 -26.9004 -30 -46.7002 -58.6006 -46.7002
339
+ c-33 0 -59.7998 26.7998 -59.7998 60.0996c0 28.3008 19.5 52.2002 46.2002 58.2002c-8.5 33.1006 -0.700195 68.1006 29.5 98.2998l44 -44.2998c-20.1006 -20.0996 -16.2998 -42 -3.2002 -55.3994c14.2998 -14.3008 37.5996 -14.3008 51.9004 0
340
+ c49.2998 49.3994 12.6992 13.3994 99.6992 99.7998z" />
341
+ <glyph glyph-name="behance" unicode="&#xf1b4;" horiz-adv-x="576"
342
+ d="M232 210.8c43.5996 -12.2998 64.7002 -45.2002 64.7002 -89.7002c0 -72 -60.5 -102.899 -124.9 -102.899h-171.8v354.399h167.1c60.7002 0 113.301 -17.1992 113.301 -87.7998c0 -35.7998 -16.6006 -58.7998 -48.4004 -74zM77.9004 312.1v-82.6992h79
343
+ c27.7998 0 47.5 12.0996 47.5 42.1992c0 32.6006 -25.3008 40.5 -53.4004 40.5h-73.0996zM161.2 78.4004c31.7002 0 57.5996 11.1992 57.5996 47c0 36.2998 -21.7002 50.5996 -56 50.5996h-84.8994v-97.5996h83.2998zM519.7 319.1h-143.7v34.9004h143.7v-34.9004zM576 142.8
344
+ c0 -4.5 -0.299805 -9 -0.599609 -13.2002h-185.101c0 -41.0996 21.7002 -65.2998 63 -65.2998c21.4004 0 49 11.6006 55.7002 33.5h62.2002c-19.1006 -58.7002 -58.7998 -86.2998 -120.101 -86.2998c-81 0 -131.3 54.7998 -131.3 134.7c0 77 53.1006 135.8 131.3 135.8
345
+ c80.5 0 124.9 -63.2998 124.9 -139.2zM390.4 174h114.699c-3 34 -20.7998 54.7998 -56.1992 54.7998c-33.8008 0 -56.2002 -21.0996 -58.5 -54.7998z" />
346
+ <glyph glyph-name="behance-square" unicode="&#xf1b5;"
347
+ d="M186.5 155c0 -19.2998 -14 -25.4004 -31.2002 -25.4004h-45.0996v52.9004h46c18.5996 -0.0996094 30.2998 -7.7998 30.2998 -27.5zM178.8 237.3c0 -16.2998 -10.7002 -22.8994 -25.7998 -22.8994h-42.7002v44.7998h39.6006c15.1992 0 28.8994 -4.2002 28.8994 -21.9004z
348
+ M311.1 214.1c19.2002 0 28.8008 -11.1992 30.5 -29.6992h-62.1992c1.19922 18.2998 13.3994 29.6992 31.6992 29.6992zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM271.7 263h77.7998
349
+ v18.9004h-77.7998v-18.9004zM228.7 152.7c0 24.0996 -11.4004 44.8994 -35 51.5996c17.2002 8.2002 26.2002 17.7002 26.2002 37c0 38.2002 -28.5 47.5 -61.4004 47.5h-90.5v-192h93.0996c34.9004 0.200195 67.6006 16.9004 67.6006 55.9004zM380 167.5
350
+ c0 41.0996 -24.0996 75.4004 -67.5996 75.4004c-42.4004 0 -71.1006 -31.8008 -71.1006 -73.6006c0 -43.2998 27.2998 -73 71.1006 -73c33.1992 0 54.6992 14.9004 65.0996 46.7998h-33.7002c-3.7002 -11.8994 -18.5996 -18.0996 -30.2002 -18.0996
351
+ c-22.3994 0 -34.0996 13.0996 -34.0996 35.2998h100.2c0.0996094 2.2998 0.299805 4.7998 0.299805 7.2002z" />
352
+ <glyph glyph-name="steam" unicode="&#xf1b6;" horiz-adv-x="496"
353
+ d="M496 192c0 -137 -111.2 -248 -248.4 -248c-113.8 0 -209.6 76.2998 -239 180.4l95.2002 -39.3008c6.40039 -32.0996 34.9004 -56.3994 68.9004 -56.3994c39.2002 0 71.8994 32.3994 70.2002 73.5l84.5 60.2002c52.0996 -1.30078 95.7998 40.8994 95.7998 93.5
354
+ c0 51.5996 -42 93.5 -93.7002 93.5s-93.7002 -42 -93.7002 -93.5v-1.2002l-59.2002 -85.7002c-15.5 0.900391 -30.6992 -3.40039 -43.5 -12.0996l-133.1 55c10.2002 127.699 117.1 228.1 247.6 228.1c137.2 0 248.4 -111 248.4 -248zM155.7 63.7002
355
+ c19.7998 -8.2002 42.5 1.09961 50.7998 21c8.2998 19.7998 -1.09961 42.5 -20.9004 50.7002l-31.5 13c12.2002 4.59961 26 4.7998 38.9004 -0.600586c13 -5.39941 23.0996 -15.5996 28.5 -28.5996s5.2998 -27.2998 -0.0996094 -40.2998
356
+ c-11.2002 -26.8008 -42.1006 -39.6006 -69 -28.4004c-10.2119 4.26953 -22.3975 15.8281 -27.2002 25.7998zM329.5 193.6c-34.4004 0 -62.4004 28 -62.4004 62.3008c0 34.2998 28 62.2998 62.4004 62.2998s62.4004 -28 62.4004 -62.2998
357
+ c0 -34.3008 -27.9004 -62.3008 -62.4004 -62.3008zM329.6 209.2c25.9004 0 46.9004 21 46.9004 46.7998c0 25.9004 -21 46.7998 -46.9004 46.7998c-25.8994 0 -46.8994 -21 -46.8994 -46.7998c0.0996094 -25.7998 21.0996 -46.7998 46.8994 -46.7998z" />
358
+ <glyph glyph-name="steam-square" unicode="&#xf1b7;"
359
+ d="M185.2 91.5c7.7002 18.5 -1 39.7002 -19.6006 47.4004l-29.5 12.1992c11.4004 4.30078 24.3008 4.5 36.4004 -0.5c12.2002 -5.09961 21.5996 -14.5996 26.7002 -26.6992c5 -12.2002 5 -25.6006 -0.100586 -37.7002c-10.5 -25.1006 -39.3994 -37 -64.5996 -26.5
360
+ c-11.5996 4.7998 -20.4004 13.5996 -25.4004 24.2002l28.5 -11.8008c18.6006 -7.7998 39.9004 0.900391 47.6006 19.4004zM400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v112.8l89.0996 -36.8994
361
+ c6 -30 32.7002 -52.7002 64.5 -52.7002c36.6006 0 67.3008 30.2998 65.7002 68.7998l79 56.2998c48.7002 -1.2002 89.6006 38.2998 89.6006 87.5c0 48.2002 -39.3008 87.5 -87.6006 87.5s-87.5996 -39.2998 -87.5996 -87.5v-1.09961l-55.4004 -80.2002
362
+ c-14.5 0.799805 -28.7002 -3.09961 -40.7002 -11.2998l-116.6 48.0996v160.7c0 26.5 21.5 48 48 48h352zM300.3 193.5c-32.2002 0 -58.3994 26.0996 -58.3994 58.2998s26.1992 58.2998 58.3994 58.2998s58.4004 -26.1992 58.4004 -58.2998
363
+ c0 -32.0996 -26.2002 -58.2998 -58.4004 -58.2998zM300.4 208.1c24.1992 0 43.8994 19.6006 43.8994 43.8008c0 24.1992 -19.5996 43.7998 -43.8994 43.7998c-24.2002 0 -43.9004 -19.6006 -43.9004 -43.7998c0 -24.2002 19.7002 -43.8008 43.9004 -43.8008z" />
364
+ <glyph glyph-name="spotify" unicode="&#xf1bc;" horiz-adv-x="496"
365
+ d="M248 440c136.9 0 248 -111.1 248 -248s-111.1 -248 -248 -248s-248 111.1 -248 248s111.1 248 248 248zM348.7 75.0996c8.09961 0 15.2002 6.30078 15.2002 15.4004s-3.60059 12.5996 -9.7002 16.5c-71.4004 42.7002 -155.101 44.2998 -237 26.2002
366
+ c-7.5 -1.60059 -13.6006 -6.5 -13.6006 -16.7998c0 -8.10059 6.10059 -15.8008 15.8008 -15.8008c2.89941 0 8 1.60059 11.8994 2.60059c71.7002 14.7002 144.3 13.0996 206.7 -24.5c3.90039 -2.2998 6.5 -3.60059 10.7002 -3.60059zM375.6 140.7
367
+ c10.9004 0 19.3008 8.7002 19.4004 19.5c0 8.7002 -3.2002 14.8994 -11.2998 19.7002c-49.4004 29.3994 -112.101 45.5 -177 45.5c-41.6006 0 -70 -5.80078 -97.7998 -13.6006c-10.3008 -2.89941 -15.5 -10 -15.5 -20.7002c0 -10.6992 8.69922 -19.3994 19.3994 -19.3994
368
+ c4.5 0 7.10059 1.2998 11.9004 2.59961c82.8994 22.5 176.1 7.60059 238.6 -29.3994c3.60059 -1.90039 7.10059 -4.2002 12.2998 -4.2002zM406.6 216.9c12.2002 0 23.2002 9.69922 23.2002 23.2998c0 11.8994 -5.09961 18.0996 -12.8994 22.5996
369
+ c-55.9004 32.6006 -132.4 47.7998 -205.4 47.7998c-42.9004 0 -82.2998 -4.89941 -117.5 -15.1992c-9 -2.60059 -17.4004 -10.3008 -17.4004 -23.9004c0 -13.2998 10.1006 -23.5996 23.3008 -23.5996c4.7998 0 9.2998 1.59961 12.8994 2.59961
370
+ c82.4004 23 209.7 12.7998 280.9 -29.7002c4.5 -2.59961 7.7002 -3.89941 12.8994 -3.89941z" />
371
+ <glyph glyph-name="deviantart" unicode="&#xf1bd;" horiz-adv-x="320"
372
+ d="M320 354.8l-98.2002 -179.1l7.40039 -9.5h90.7998v-127.7h-160.9l-13.5 -9.2002l-43.6992 -84c-0.300781 0 -8.60059 -8.59961 -9.2002 -9.2002h-92.7002v93.2002l93.2002 179.4l-7.40039 9.2002h-85.7998v127.6h156l13.5 9.2002l43.7002 84
373
+ c0.299805 0 8.59961 8.59961 9.2002 9.2002h97.5996v-93.1006z" />
374
+ <glyph glyph-name="soundcloud" unicode="&#xf1be;" horiz-adv-x="639"
375
+ d="M111.4 191.7l5.7998 -65l-5.7998 -68.2998c-0.300781 -2.5 -2.2002 -4.40039 -4.40039 -4.40039s-4.2002 1.90039 -4.2002 4.40039l-5.59961 68.2998l5.59961 65c0 2.2002 1.90039 4.2002 4.2002 4.2002c2.2002 0 4.09961 -2 4.40039 -4.2002zM132.8 237.3
376
+ c2.5 0 4.7002 -2.2002 4.7002 -5l5.7998 -105.6l-5.7998 -68.2998c0 -2.80078 -2.2002 -5 -4.7002 -5c-2.7998 0 -4.7002 2.19922 -5 5l-5 68.2998l5 105.6c0.299805 2.7998 2.2002 5 5 5zM158.3 261.4c2.7998 0 5.2998 -2.2002 5.2998 -5.30078l5.30078 -130
377
+ l-5.30078 -67.7998c0 -3.09961 -2.5 -5.2998 -5.2998 -5.2998c-3.09961 0 -5.2998 2.2002 -5.59961 5.2998l-4.40039 67.7998l4.40039 130c0.299805 3.10059 2.5 5.30078 5.59961 5.30078zM7.2002 164.8c1.39941 0 2.2002 -1.09961 2.5 -2.5l5.59961 -35.5996l-5.59961 -35
378
+ c-0.299805 -1.40039 -1.10059 -2.5 -2.5 -2.5c-1.40039 0 -2.2002 1.09961 -2.5 2.5l-4.7002 35l4.7002 35.5996c0.299805 1.40039 1.09961 2.5 2.5 2.5zM30.7998 186.7c1.40039 0 2.5 -1.10059 2.7998 -2.5l7.2002 -57.5l-7.2002 -56.4004
379
+ c-0.299805 -1.39941 -1.39941 -2.5 -2.7998 -2.5c-1.39941 0 -2.5 1.10059 -2.5 2.7998l-6.39941 56.1006l6.39941 57.5c0 1.39941 1.10059 2.5 2.5 2.5zM56.0996 198.1c1.7002 0 3.10059 -1.39941 3.10059 -3.2998l6.89941 -68.0996l-6.89941 -65.7998
380
+ c0 -1.7002 -1.40039 -3.10059 -3.10059 -3.10059c-1.59961 0 -3 1.40039 -3.2998 3.10059l-5.7998 65.7998l5.7998 68.0996c0.200195 1.90039 1.60059 3.2998 3.2998 3.2998zM81.4004 200.3c1.89941 0 3.59961 -1.39941 3.89941 -3.59961l6.40039 -70l-6.40039 -67.7998
381
+ c-0.299805 -2.2002 -2 -3.60059 -3.89941 -3.60059c-1.90039 0 -3.60059 1.40039 -3.60059 3.60059l-5.7998 67.7998l5.7998 70c0 2.2002 1.7002 3.59961 3.60059 3.59961zM322.8 311.2c2.5 -1.40039 4.10059 -4.2002 4.5 -7.2002l3.90039 -177.5l-3.90039 -64.2002
382
+ c0 -4.7002 -3.89941 -8.59961 -8.59961 -8.59961s-8.60059 3.89941 -8.90039 8.59961l-1.7002 31.7002l-1.69922 32.5l3.2998 176.7v0.799805c0.200195 2.5 1.39941 5 3.2998 6.7002c1.40039 1.09961 3.40039 1.89941 5.59961 1.89941
383
+ c1.40039 0 3.10059 -0.599609 4.2002 -1.39941zM296.1 295.9c2.2002 -1.40039 3.60059 -3.90039 3.90039 -6.7002l3.2998 -162.8l-3.09961 -58.6006l-0.299805 -6.7002c0 -2.2998 -0.800781 -4.19922 -2.5 -5.59961c-1.40039 -1.40039 -3.40039 -2.5 -5.60059 -2.5
384
+ c-2.5 0 -4.7002 1.2002 -6.39941 3.09961c-1.10059 1.40039 -1.7002 3 -1.7002 4.7002v0.299805c-3.10059 65.3008 -3.10059 65.6006 -3.10059 65.6006l2.80078 160.8l0.299805 1.7002c0 2.7998 1.39941 5.2998 3.59961 6.7002
385
+ c1.2998 0.799805 2.7998 1.39941 4.40039 1.39941c1.59961 0 3 -0.599609 4.39941 -1.39941zM184.7 273.4c3.39941 0 5.89941 -2.80078 6.09961 -6.10059l5 -140.6l-5 -67.2002c-0.299805 -3.2998 -2.7998 -5.7998 -6.09961 -5.7998c-3 0 -5.5 2.5 -5.7998 5.7998
386
+ l-4.40039 67.2002l4.40039 140.6c0 3.2998 2.69922 6.10059 5.7998 6.10059zM561.4 210.6c43.2998 0 78.5996 -35.2998 78.5 -78.8994c0 -43.2998 -35.3008 -78.2998 -78.6006 -78.2998h-218.3c-4.7002 0.599609 -8.59961 4.19922 -8.59961 9.19922v249.7
387
+ c0 4.7998 1.69922 7 7.7998 9.2002c15.2998 6.09961 32.5 9.40039 50.2998 9.40039c72.5 0 131.9 -55.6006 138.3 -126.4c9.5 3.90039 19.7998 6.09961 30.6006 6.09961zM264.7 270.9c4.2002 0 7.2002 -3.30078 7.5 -7.80078l3.89941 -136.699l-3.89941 -65.6006
388
+ c0 -4.2002 -3.2998 -7.5 -7.5 -7.5s-7.5 3.2998 -7.7998 7.5l-3.30078 65.6006l3.30078 136.699c0.299805 4.5 3.59961 7.80078 7.7998 7.80078zM211.1 278.7c3.60059 0 6.40039 -3.10059 6.7002 -6.7002l4.40039 -145.3l-4.40039 -66.9004
389
+ c-0.299805 -3.59961 -3.09961 -6.39941 -6.7002 -6.39941c-3.2998 0 -6.09961 2.7998 -6.39941 6.39941l-3.90039 66.9004l3.90039 145.3c0 3.59961 3.09961 6.7002 6.39941 6.7002zM237.8 275.3c3.90039 0 6.90039 -3 6.90039 -6.89941l4.2002 -141.7l-4.2002 -66.4004
390
+ c0 -3.7998 -3.10059 -6.89941 -6.90039 -6.89941s-6.59961 3 -6.89941 6.89941l-3.90039 66.4004l3.90039 141.7c0 3.7998 3 6.89941 6.89941 6.89941z" />
391
+ <glyph glyph-name="vine" unicode="&#xf1ca;" horiz-adv-x="384"
392
+ d="M384 193.3v-52.0996c-18.4004 -4.2002 -36.9004 -6.10059 -52.0996 -6.10059c-36.9004 -77.3994 -103 -143.8 -125.101 -156.199c-14 -7.90039 -27.0996 -8.40039 -42.7002 0.799805c-27.0996 16.2998 -129.899 100.6 -164.1 365.6h74.5
393
+ c18.7002 -159.1 64.5 -240.7 114.8 -301.8c27.9004 27.9004 54.7998 65.0996 75.6006 106.9c-49.8008 25.2998 -80.1006 80.8994 -80.1006 145.6c0 65.5996 37.7002 115.1 102.2 115.1c114.9 0 106.2 -127.899 81.5996 -181.5c0 0 -46.3994 -9.19922 -63.5 20.5
394
+ c3.40039 11.3008 8.2002 30.8008 8.2002 48.5c0 31.3008 -11.2998 46.6006 -28.3994 46.6006c-18.2002 0 -30.8008 -17.1006 -30.8008 -50c0.100586 -79.2002 59.4004 -118.7 129.9 -101.9z" />
395
+ <glyph glyph-name="codepen" unicode="&#xf1cb;" horiz-adv-x="512"
396
+ d="M502.285 288.296c6.00098 -3.99902 9.71484 -11.1426 9.71582 -18.2852v-155.999c0 -7.14258 -3.71484 -14.2871 -9.71484 -18.2861l-234 -156.021c-8.06055 -4.95996 -16.584 -4.91504 -24.5713 0l-234 156.021c-6.00098 4 -9.71484 11.1436 -9.71484 18.2861v155.999
397
+ c0 7.14258 3.71387 14.2861 9.71387 18.2852l234 156c8.06055 4.95996 16.584 4.91504 24.5713 0zM278 384.869v-102.572l95.4287 -63.7148l76.8574 51.4287zM234 384.869l-172.286 -114.858l76.8574 -51.4287l95.4287 63.7148v102.572zM44 228.868v-73.7139
398
+ l55.1426 36.8564zM234 -0.84668v102.571l-95.4287 63.7158l-76.8574 -51.4297zM256 140.011l77.7148 52l-77.7148 52l-77.7148 -52zM278 -0.84668l172.286 114.857l-76.8574 51.4297l-95.4287 -63.7158v-102.571zM468 155.154v73.7139l-55.1426 -36.8574z" />
399
+ <glyph glyph-name="jsfiddle" unicode="&#xf1cc;" horiz-adv-x="575"
400
+ d="M510.634 210.538c45.6885 -25.334 68.3721 -74.5605 56.832 -122.634c-12.1035 -50.4199 -55.5479 -86.6592 -108.212 -87.293c-84.0303 -1.01172 -168.079 -0.458984 -252.12 -0.480469c-30.3223 -0.00683594 -60.668 -0.492188 -90.959 0.539062
401
+ c-48.0938 1.63672 -91.7764 35.8643 -105.607 81.4326c-14.1289 46.5508 2.18945 94.623 41.9014 124.615c2.54688 1.92383 4.86914 6.52051 4.51465 9.54492c-3.74609 31.8604 7.14453 57.6709 32.6758 76.4082c26.2822 19.2881 55.2285 21.5879 85.3311 9.16699
402
+ c2.36621 -0.975586 4.63965 -2.17773 7.82422 -3.68555c16.5215 27.5332 38.1221 48.6523 65.4922 63.9023c92.8594 51.7402 210.954 8.31152 246.85 -91.6455c5.55762 -15.4766 6.74512 -32.6074 9.09668 -49.0947c0.716797 -5.02832 1.6543 -8.15527 6.38086 -10.7764z
403
+ M531.741 53.6582c39.3135 48.375 22.418 117.668 -35.1426 144.497c-7.43555 3.46582 -9.72559 7.74414 -9.84766 15.8936c-1.87012 125.129 -132.78 187.063 -230.24 132.697c-26.1133 -14.5674 -46.4492 -34.8955 -60.6709 -61.2939
404
+ c-7.59082 -14.0908 -11.9287 -7.97754 -22.1982 -2.52734c-24.6113 13.0635 -49.0469 12.6406 -72.0332 -3.08301c-21.9678 -15.0244 -31.9102 -36.6201 -26.4199 -62.9805c2.4082 -11.5703 -0.914062 -17.0635 -10.0967 -23.1367
405
+ c-38.1895 -25.2578 -53.0879 -74.8604 -34.1855 -116.105c18.4355 -40.2295 51.3135 -59.6631 95.1748 -59.9951c0.700195 -0.00488281 163.728 -0.545898 163.728 0.154297c56.8857 0 113.778 -0.551758 170.652 0.229492
406
+ c28.9375 0.397461 53.0498 13.2178 71.2803 35.6504zM443.952 134.157c-5.84863 -31.1572 -34.6221 -55.0967 -66.666 -55.0957c-16.9531 0.00195312 -32.0586 6.5459 -44.0791 17.7051c-27.6973 25.7139 -71.1406 74.9805 -95.9375 93.3877
407
+ c-20.0557 14.8877 -41.9893 12.333 -60.2715 -3.78223c-49.9961 -44.0713 15.8594 -121.775 67.0625 -77.1885c4.54883 3.95996 7.84082 9.54297 12.7441 12.8447c8.18457 5.50879 20.7666 0.883789 13.168 -10.6221c-17.3574 -26.2842 -49.3301 -38.1973 -78.8623 -29.3008
408
+ c-28.8975 8.70312 -48.8408 35.9678 -48.626 70.1787c1.22461 22.4844 12.3633 43.0596 35.4141 55.9648c22.5742 12.6377 46.3682 13.1455 66.9902 -2.47363c50.791 -38.4756 75.5781 -81.7451 107.296 -101.245c24.5586 -15.0996 54.2549 -7.36328 68.8232 17.5059
409
+ c28.8301 49.209 -34.5918 105.016 -78.8682 63.46c-3.98828 -3.74414 -6.91699 -8.93164 -11.4092 -11.7197c-10.9756 -6.81152 -17.333 4.1123 -12.8096 10.3525c20.7031 28.5537 50.4639 40.4404 83.2715 28.2139c31.4287 -11.7139 49.1074 -44.3662 42.7598 -78.1855z
410
+ " />
411
+ <glyph glyph-name="rebel" unicode="&#xf1d0;" horiz-adv-x="512"
412
+ d="M256.5 -56c-139.3 0 -247.5 116.2 -243.3 254.1c2.7998 79.2002 43.2002 152.2 116.5 200.4c0.299805 0 1.89941 0.599609 1.09961 -0.799805c-5.7998 -5.5 -111.3 -129.8 -14.0996 -226.4c49.7998 -49.5 90 -2.5 90 -2.5c38.5 50.1006 -0.600586 125.9 -0.600586 125.9
413
+ c-10 24.8994 -45.6992 40.0996 -45.6992 40.0996l28.7998 31.7998c24.3994 -10.5 43.2002 -38.6992 43.2002 -38.6992c0.799805 29.5996 -21.9004 61.3994 -21.9004 61.3994l44.5996 50.7002l44.3008 -50.0996c-20.5 -28.8008 -21.9004 -62.6006 -21.9004 -62.6006
414
+ c13.7998 23 43.5 39.2998 43.5 39.2998l28.5 -31.7998c-27.4004 -8.89941 -45.4004 -39.8994 -45.4004 -39.8994c-15.7998 -28.5 -27.0996 -89.4004 0.600586 -127.301c32.3994 -44.5996 87.7002 2.80078 87.7002 2.80078c102.699 91.8994 -10.5 225 -10.5 225
415
+ c-6.10059 5.5 0.799805 2.7998 0.799805 2.7998c50.0996 -36.5 114.6 -84.4004 116.2 -204.8c2 -145.601 -99.9004 -249.4 -242.4 -249.4z" />
416
+ <glyph glyph-name="empire" unicode="&#xf1d1;" horiz-adv-x="496"
417
+ d="M287.6 393.8c-10.7998 2.2002 -22.0996 3.2998 -33.5 3.60059v18.1992c78.1006 -2.19922 146.101 -44 184.601 -106.6l-15.7998 -9.09961c-6.10059 9.69922 -12.7002 18.7998 -20.2002 27.0996l-18 -15.5c-26 29.5996 -61.4004 50.7002 -101.9 58.4004zM53.4004 125.6
418
+ c3.89941 -10.7998 8.2998 -21.0996 13.5996 -31.0996l-15.7998 -9.09961c-17.1006 31.5996 -27.1006 68.0996 -27.1006 106.6s9.90039 75 27.1006 106.5l15.7998 -9.09961c-5.2998 -9.7002 -10 -20.2002 -13.5996 -31l22.6992 -7.7002
419
+ c-6.39941 -18.2998 -9.69922 -38.2002 -9.69922 -58.7002s3.59961 -40.4004 10 -58.7002zM213.1 14l-4.69922 -23.7998c10.7998 -1.90039 22.1992 -3.2998 33.5 -3.60059v-18.2998c-78.1006 2.2998 -146.4 44.2998 -184.9 106.601l16 9.39941
420
+ c5.7998 -9.7002 12.7002 -18.7998 20.2002 -27.3994l18 15.7998c26.0996 -29.6006 61.5 -50.7002 101.899 -58.7002zM93.2998 327.1c-7.5 -8.2998 -14.0996 -17.5 -20.0996 -27.1992l-15.7998 9.09961c38.5 62.5996 106.5 104.4 184.6 106.6v-18.1992
421
+ c-11.4004 -0.300781 -22.7002 -1.40039 -33.5 -3.60059l4.7002 -23.7998c-40.5 -7.7002 -75.9004 -28.7998 -101.9 -58.4004zM402.7 56.9004c7.5 8.59961 14.3994 17.6992 20.0996 27.3994l16.1006 -9.39941c-38.5 -62.3008 -106.801 -104.4 -184.9 -106.601v18.2998
422
+ c11.4004 0.300781 22.7002 1.7002 33.5 3.60059l-4.7002 23.7998c40.5 8 75.9004 29.0996 101.9 58.7002zM496 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM483.8 192c0 130.1 -105.7 235.8 -235.8 235.8
423
+ s-235.8 -105.7 -235.8 -235.8s105.7 -235.8 235.8 -235.8s235.8 105.7 235.8 235.8zM444.8 298.6c17.2002 -31.5996 27.1006 -68.0996 27.1006 -106.6s-9.90039 -75 -27.1006 -106.4l-15.7998 9.10059c5.2998 10 9.7002 20.2002 13.5996 31l-23 7.7002
424
+ c6.40039 18.2998 10 38.1992 10 58.6992s-3.2998 40.4004 -9.69922 58.7002l22.6992 7.7002c-3.59961 10.7998 -8.2998 21.2998 -13.5996 31zM261.8 120.9l13.2998 -66.7002c-8.59961 -1.7002 -17.6992 -2.7998 -27.0996 -2.7998s-18.5 1.09961 -27.0996 2.7998
425
+ l13.2998 66.7002c-16.2998 3.2998 -30.5 11.5996 -40.7002 23.5l-51.2002 -44.8008c-11.8994 13.6006 -21.2998 29.4004 -27.0996 46.8008l64.2002 22.0996c-2.5 7.40039 -3.90039 15.2002 -3.90039 23.5s1.40039 16 3.90039 23.5l-64.5 22.0996
426
+ c6.09961 17.5 15.5 33.2002 27.3994 46.8008l51.2002 -44.8008c10.2998 11.9004 24.4004 20.5 40.7002 23.8008l-13.2998 66.3994c8.59961 2 17.6992 2.7998 27.0996 2.7998s18.5 -0.899414 27.0996 -2.7998l-13.2998 -66.3994
427
+ c16.2998 -3.30078 30.5 -11.9004 40.7002 -23.8008l51.2002 44.8008c11.8994 -13.6006 21.2998 -29.4004 27.3994 -46.8008l-64.5 -22.0996c2.5 -7.40039 3.90039 -15.2002 3.90039 -23.5s-1.40039 -16 -3.90039 -23.5l64.2002 -22.0996
428
+ c-5.7998 -17.5 -15.2002 -33.2002 -27.0996 -46.8008l-51.2002 44.8008c-10.2998 -11.9004 -24.4004 -20.2002 -40.7002 -23.5z" />
429
+ <glyph glyph-name="git-square" unicode="&#xf1d2;"
430
+ d="M140.1 99.5c12.1006 0 29.5 -2.09961 29.5 -17.9004c0 -15.5 -13.8994 -18.7998 -27 -18.7998c-12.2998 0 -30.8994 2 -30.8994 18s15.7002 18.7002 28.3994 18.7002zM115.4 216.1c0 35.2002 43.5996 34.8008 43.5 0.400391c0 -14.5 -5.7002 -24.5 -21.2002 -24.5
431
+ c-15.7002 0 -22.2998 9.2998 -22.2998 24.0996zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM207 274.3c-12.2998 -4.7998 -25.5 -8.39941 -38.9004 -8.39941
432
+ c-38.5 22.0996 -90.6992 -0.900391 -90.6992 -49.5c0 -18 11.5996 -42.9004 29.5996 -48.9004v-0.700195c-13.4004 -5.89941 -17.0996 -36.0996 0.700195 -47v-0.700195c-19.5 -6.39941 -32.2998 -18.7998 -32.2998 -40.1992c0 -36.8008 34.7998 -47 65.3994 -47
433
+ c37.1006 0 64.7998 13.3994 64.7998 54.2998c0 50.3994 -72.0996 31.7998 -72.0996 59.0996c0 9.60059 5.2002 13.4004 14.0996 15.2002c29.6006 5.5 48.2002 28.5996 48.2002 58.7002c0 5.2002 -1.09961 10.2002 -2.89941 15c4.7998 1.09961 9.5 2.2998 14.0996 3.89941
434
+ v36.2002zM263.8 272.5h-39.5996c1.2998 -10.5996 1.09961 -142.6 0 -155.5h39.5996c-1.09961 12.7998 -1.2002 145.1 0 155.5zM268.3 325.8c0 13.4004 -10 26.2002 -24.0996 26.2002c-14.2998 0 -24.6006 -12.5 -24.6006 -26.2002
435
+ c0 -13.5996 10.5 -25.8994 24.6006 -25.8994c13.7002 0 24.0996 12.5 24.0996 25.8994zM372.6 272.5h-36.3994c0 9.7998 -0.400391 19.5996 1.09961 29.5h-40.5c1.2998 -7.2998 1.10059 -13.5996 1.10059 -29.5h-17.1006v-33.9004
436
+ c11.9004 1.90039 12.1006 0.700195 17.1006 0.700195v-0.700195h-0.400391v-62.6992c0 -31.1006 4.5 -61.2002 42.7002 -61.2002c10.7002 0 23 1.7998 32.5 7v35c-5.7002 -3.90039 -13.9004 -5.90039 -20.9004 -5.90039c-13.2002 0 -15.5 12.9004 -15.5 23.4004v65.2002
437
+ c22.7002 0 36.4004 -0.700195 36.4004 -0.700195v33.7998h-0.100586z" />
438
+ <glyph glyph-name="git" unicode="&#xf1d3;"
439
+ d="M18.7998 226.3c0 67.9004 73 100.2 126.8 69.2002c18.8008 0 37.3008 5 54.5 11.7998v-50.5c-6.5 -2.2002 -13 -4 -19.6992 -5.5c2.5 -6.7998 4 -13.7002 4 -21c0 -42.2002 -26 -74.5 -67.5 -82.2002c-12.5 -2.59961 -19.7002 -7.7998 -19.7002 -21.2998
440
+ c0 -38.2998 101 -12.2998 101 -82.7998c0 -57.2998 -38.7002 -76 -90.7002 -76c-42.7002 0 -91.5 14.2998 -91.5 65.7998c0 29.9004 18 47.2002 45.2998 56.2002v1c-25 15.2002 -19.7998 57.5 -1 65.7998v1c-25.2998 8.5 -41.5 43.2002 -41.5 68.5zM106.5 62.5
441
+ c-17.7002 0 -39.7002 -3.7998 -39.7998 -26.0996c0 -22.5 26 -25.2002 43.2998 -25.2002c18.2002 0 37.7002 4.5 37.7002 26.2998c0 22 -24.2002 25 -41.2002 25zM103.3 192c21.7002 0 29.7002 14 29.7002 34.2998c0 48.2998 -61 48.7998 -61 -0.5
442
+ c0 -20.7998 9.2998 -33.7998 31.2998 -33.7998zM432 142.5v-49c-13.2998 -7.2998 -30.5 -9.7998 -45.5 -9.7998c-53.5 0 -59.7998 42.2002 -59.7998 85.7002v87.6992h0.5v1c-7 0 -7.2998 1.60059 -24 -1v47.5h24c0 22.3008 0.299805 31 -1.5 41.2002h56.7002
443
+ c-2 -13.7998 -1.5 -27.5 -1.5 -41.2002h51v-47.5s-19.3008 1 -51 1v-91.0996c0 -14.7998 3.2998 -32.7998 21.7998 -32.7998c9.7998 0 21.2998 2.7998 29.2998 8.2998zM286 379.3c0 -18.7002 -14.5 -36.2002 -33.7998 -36.2002c-19.7998 0 -34.5 17.2002 -34.5 36.2002
444
+ c0 19.2998 14.5 36.7002 34.5 36.7002c19.7998 0 33.7998 -18 33.7998 -36.7002zM279.8 304.8c-1.7998 -14.5996 -1.59961 -199.8 0 -217.8h-55.5c1.60059 18.0996 1.7998 203 0 217.8h55.5z" />
445
+ <glyph glyph-name="hacker-news" unicode="&#xf1d4;"
446
+ d="M0 416h448v-448h-448v448zM21.2002 218.8h-0.200195c0.0996094 0.100586 0.200195 0.299805 0.299805 0.400391c0 -0.100586 0 -0.299805 -0.0996094 -0.400391zM239.2 164.9l80.7998 155.1h-34.7998c-54.7998 -101.2 -48.2998 -98.5996 -60.6006 -125.6
447
+ c-10.0996 24.3994 -6.7998 27.2998 -59.2998 125.6h-37.2998l79.7998 -153.3v-102.7h31.4004v100.9z" />
448
+ <glyph glyph-name="tencent-weibo" unicode="&#xf1d5;" horiz-adv-x="383"
449
+ d="M72.2998 -47.7998c1.40039 -19.9004 -27.5996 -22.2002 -29.7002 -2.90039c-11.5996 129.9 31.1006 239.5 101.4 313.2c-15.5996 34 9.2002 77.0996 50.5996 77.0996c30.3008 0 55.1006 -24.5996 55.1006 -55.0996c0 -44 -49.5 -70.7998 -86.9004 -45.0996
450
+ c-65.7002 -71.3008 -101.399 -169.801 -90.5 -287.2zM192 447.9c92 0 166.6 -74.6006 166.6 -166.5c0 -102.301 -93.2998 -185.5 -204 -162.301c-19 4.7002 -12.5 33.2002 6.60059 29.1006c80.7998 -20.7998 167.7 42.2998 167.7 133.1c0 75.5 -61.5 136.9 -136.9 136.9
451
+ c-101 0 -168.3 -106.601 -122 -199.2c9 -17.9004 -17.5996 -30.7998 -26.2998 -13.4004c-56 108.101 22.3994 242.301 148.3 242.301z" />
452
+ <glyph glyph-name="qq" unicode="&#xf1d6;"
453
+ d="M433.754 27.5547c-11.5264 -1.39258 -44.8604 52.7412 -44.8604 52.7412c0 -31.3447 -16.1357 -72.2471 -51.0508 -101.786c16.8418 -5.19141 54.8428 -19.167 45.8037 -34.4209c-7.31641 -12.3428 -125.511 -7.88086 -159.633 -4.03711
454
+ c-34.1221 -3.84375 -152.315 -8.30566 -159.632 4.03711c-9.04492 15.25 28.918 29.2139 45.7832 34.415c-34.9199 29.5391 -51.0586 70.4453 -51.0586 101.792c0 0 -33.334 -54.1338 -44.8594 -52.7412c-5.37012 0.650391 -12.4238 29.6445 9.34668 99.7041
455
+ c10.2617 33.0244 21.9951 60.4785 40.1445 105.779c-3.05566 116.898 45.2441 214.956 160.262 214.962c113.737 -0.00585938 163.156 -96.1328 160.264 -214.963c18.1182 -45.2227 29.9121 -72.8506 40.1445 -105.778c21.7676 -70.0596 14.7158 -99.0527 9.3457 -99.7041z
456
+ " />
457
+ <glyph glyph-name="weixin" unicode="&#xf1d7;" horiz-adv-x="576"
458
+ d="M385.2 280.4c-92.4004 0 -165.4 -69.1006 -165.3 -154c0 -14.2002 2.19922 -27.9004 6.19922 -40.8008c-6.19922 -0.5 -12.0996 -0.799805 -18.2998 -0.799805c-24.3994 0 -43.7998 4.90039 -68.2002 9.7002l-68 -34.0996l19.3008 58.5996
459
+ c-48.6006 34.0996 -77.9004 78.2002 -77.9004 131.6c0 92.6006 87.5 165.4 194.7 165.4c95.5996 0 179.7 -58.2998 196.3 -136.7c-6.2002 0.799805 -12.4004 1.10059 -18.7998 1.10059zM280.7 333.3c-14.7002 0 -29.2002 -9.7002 -29.2998 -24.3994
460
+ c0 -14.5 14.5 -24.2002 29.2998 -24.2002c14.5 0 24.2002 9.7002 24.2002 24.2002c0 14.6992 -9.7002 24.3994 -24.2002 24.3994zM144.3 284.7c14.7998 0 24.4004 9.59961 24.4004 24.2002c0 14.6992 -9.60059 24.3994 -24.4004 24.3994
461
+ c-14.5 0 -29.2998 -9.59961 -29.2998 -24.3994c0 -14.5 14.7998 -24.2002 29.2998 -24.2002zM563 128.6c0 -43.7998 -29 -82.6992 -68.2002 -112.1l14.7998 -48.5996l-53.3994 29.2998c-19.7002 -4.7998 -39.2998 -9.90039 -58.6006 -9.90039
462
+ c-92.5996 0 -165.399 63.4004 -165.399 141.3c0 77.9004 72.7002 141.301 165.399 141.301c87.5 0 165.4 -63.4004 165.4 -141.301zM343.9 153.1c14.6992 0 24.3994 9.60059 24.3994 19.6006c0 9.59961 -9.59961 19.2998 -24.3994 19.2998
463
+ c-9.60059 0 -19.3008 -9.59961 -19.3008 -19.2998c0 -9.90039 9.60059 -19.6006 19.3008 -19.6006zM451 153.1c14.5 0 24.5 9.60059 24.4004 19.6006c0 9.59961 -9.90039 19.2998 -24.4004 19.2998c-9.59961 0 -19.2998 -9.59961 -19.2998 -19.2998
464
+ c0 -9.90039 9.59961 -19.6006 19.2998 -19.6006z" />
465
+ <glyph glyph-name="slideshare" unicode="&#xf1e7;" horiz-adv-x="512"
466
+ d="M187.7 294.3c34 0 61.7002 -25.7002 61.7002 -57.7002c0 -31.6992 -27.7002 -57.6992 -61.7002 -57.6992s-61.7002 26 -61.7002 57.6992c0 32 27.7002 57.7002 61.7002 57.7002zM331.1 294.3c34.3008 0 61.8008 -25.7002 61.7002 -57.7002
467
+ c0 -31.6992 -27.3994 -57.6992 -61.7002 -57.6992c-34 0 -61.6992 26 -61.6992 57.6992c0 32 27.6992 57.7002 61.6992 57.7002zM487.7 204.3c15.2002 10.5 25.2002 -4 16.0996 -17.7998c-18.2998 -22.5996 -53.2002 -50.2998 -106.3 -72
468
+ c56.2998 -191.7 -137.4 -222.3 -134.3 -124c0 0.700195 -0.299805 53.7998 -0.299805 93.5c-4.30078 0.799805 -8.60059 2 -13.7002 3.09961c0 -40 -0.299805 -95.8994 -0.299805 -96.5996c3.09961 -98.2002 -190.601 -67.5996 -134.301 124.1
469
+ c-53.1992 21.7002 -88 49.4004 -106.3 72c-9.09961 13.7002 0.900391 28.3008 16 17.7002c2 -1.39941 4.2998 -2.89941 6.2998 -4.2998v198.3c0 27.4004 20.6006 49.7002 46 49.7002h359.101c25.3994 0 46 -22.2998 46 -49.7002v-198.3zM457.2 185.1h0.0996094v190.601
470
+ c0 32.7998 -10.5996 45.7002 -40.8994 45.7002h-317.7c-31.7002 0 -40.6006 -10.8008 -40.6006 -45.7002v-192.4c67.7002 -35.3994 125.7 -29.0996 157.4 -28c13.4004 0.299805 22 -2.2998 27.0996 -7.7002c1.7002 -1.59961 10 -9.39941 20.3008 -17.0996
471
+ c1.09961 15.7998 10 25.7998 33.6992 24.9004c32.3008 -1.40039 91.7002 -7.7002 160.601 29.6992z" />
472
+ <glyph glyph-name="twitch" unicode="&#xf1e8;"
473
+ d="M40.0996 416h397.9v-274.2l-117 -117h-87l-56.7998 -56.7998h-60.2002v56.7998h-107v314.3zM397.9 161.9v214h-321v-280.9h90.2998v-56.7998l56.7998 56.7998h107zM331 299v-116.9h-40.0996v116.9h40.0996zM224 299v-116.9h-40.0996v116.9h40.0996z" />
474
+ <glyph glyph-name="yelp" unicode="&#xf1e9;" horiz-adv-x="381"
475
+ d="M41.9004 207.68l99.6191 -48.6094c19.2002 -9.40039 16.2002 -37.5107 -4.5 -42.71l-107.52 -26.8105c-13.4004 -3.39941 -26.71 5.90039 -28.21 19.6006c-3.40039 29.4092 0 58.4092 9 85.3193c4.41016 13.1104 19.3096 19.21 31.6104 13.21zM85.9102 -31.5703
476
+ c-11.4004 7.80078 -13.2998 23.8105 -4.08984 34.0898l74.21 82.4209c14.3096 15.8096 40.5098 5.19922 39.8096 -16.1006l-3.89941 -110.82c-0.410156 -13.7998 -13.0107 -24 -26.6104 -21.6992c-28.6104 4.7998 -55.7197 15.9102 -79.4199 32.1094zM231.24 78.3496
477
+ c-11.2998 18.1104 6.2002 40.4102 26.5098 33.9102l105.42 -34.21c13.0996 -4.2998 19.5 -19.1094 13.5996 -31.6094c-12.3994 -26 -30.3096 -49.1104 -52.71 -67.6104c-10.71 -8.7998 -26.71 -6.2002 -34.0098 5.5zM379.57 210.58
478
+ c5.5 -12.71 -1.30078 -27.3105 -14.6104 -31.21l-106.62 -30.5098c-20.5 -5.90039 -37.0996 17.0098 -25.2002 34.71l62.0107 91.9199c7.70996 11.3994 23.71 13.5 34.0098 4.39941c21.2002 -18.6992 38.6094 -42.1992 50.4102 -69.3096zM61.1104 417.82
479
+ c47 22.3994 89.21 28.2998 112.33 30.0996c13.2998 1.09961 24.5996 -9.5 24.5 -22.7998v-208.34c0 -23.2998 -30.9102 -31.6006 -42.6104 -11.4004l-104.12 180.43c-6.59961 11.5107 -2.09961 26.3105 9.90039 32.0107z" />
480
+ <glyph glyph-name="paypal" unicode="&#xf1ed;" horiz-adv-x="384"
481
+ d="M111.4 152.1c-3.5 -19.1992 -17.4004 -108.699 -21.5 -134c-0.300781 -1.7998 -1 -2.5 -3 -2.5h-74.6006c-7.59961 0 -13.0996 6.60059 -12.0996 13.9004l58.5996 371.9c1.5 9.59961 10.1006 16.8994 20 16.8994c152.3 0 165.101 3.7002 204 -11.3994
482
+ c60.1006 -23.3008 65.6006 -79.5 44 -140.301c-21.5 -62.5996 -72.5 -89.5 -140.1 -90.2998c-43.4004 -0.700195 -69.5 7 -75.2998 -24.2002zM357.1 296c28.4004 -21.2002 30.3008 -57.7998 23.8008 -92.5996c-16.5 -83.5 -71.9004 -112.301 -142.9 -112.301
483
+ c-15 0 -24.7002 2.30078 -29.2998 -19.6992c-15.5 -97.4004 -13.7002 -85.9004 -14.4004 -91.3008c-1.7002 -8.59961 -8.7998 -14.8994 -17.3994 -14.8994h-63.5c-7.10059 0 -11.6006 5.7998 -10.6006 12.8994c0 0 4.5 29.3008 27.1006 169.7
484
+ c0.799805 6.10059 4.7998 9.40039 10.8994 9.40039c54 0 164.601 -9.90039 204.5 103.899c3.7002 11.1006 6.7998 22.2002 8.7998 33.6006c0.5 3.09961 1.2002 2.59961 3 1.2998z" />
485
+ <glyph glyph-name="google-wallet" unicode="&#xf1ee;"
486
+ d="M156.8 321.2c37.6006 -60.6006 64.2002 -113.101 84.2998 -162.5c-8.2998 -33.7998 -18.7998 -66.5 -31.2998 -98.2998c-13.2002 52.2998 -26.5 101.3 -56 148.5c6.5 36.3994 2.2998 73.5996 3 112.3zM109.3 248c5 0 10 -2.5 13 -6.5
487
+ c43.7998 -59.7998 66.2998 -123.8 82.5 -193.5h-103.5c-20 69.5 -49.5 133 -91.7002 187.3c-4 5.2002 0 12.7002 6.5 12.7002h93.2002zM157.1 336h108.7c74.7998 -103 131.2 -230 143.2 -368h-113.7c-8.2002 133.5 -69.7002 260 -138.2 368zM408.9 404.5
488
+ c19 -67.5 31.0996 -139 31.0996 -212.6c0 -69.5 -9.5 -142.5 -25.2998 -203c-10.9004 92.5 -42.4004 184.6 -90.6006 270.8c-4.19922 50.5 -13.2998 99.5 -26.5 146c-1.19922 5.2998 2.5 10.2998 7.80078 10.2998h88.2998c7 0 13.3994 -4.7002 15.2002 -11.5z" />
489
+ <glyph glyph-name="cc-visa" unicode="&#xf1f0;" horiz-adv-x="576"
490
+ d="M470.1 216.7c0 0 7.60059 -37.2002 9.30078 -45h-33.4004c3.2998 8.89941 16 43.5 16 43.5c-0.200195 -0.299805 3.2998 9.09961 5.2998 14.8994zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480
491
+ c26.5 0 48 -21.5 48 -48zM152.5 116.8l63.2002 155.2h-42.5l-39.2998 -106l-4.30078 21.5l-14 71.4004c-2.2998 9.89941 -9.39941 12.6992 -18.1992 13.0996h-64.7002l-0.700195 -3.09961c15.7998 -4 29.9004 -9.80078 42.2002 -17.1006l35.7998 -135h42.5zM246.9 116.6
492
+ l25.1992 155.4h-40.1992l-25.1006 -155.4h40.1006zM386.8 167.4c0.200195 17.6992 -10.5996 31.1992 -33.7002 42.2998c-14.0996 7.09961 -22.6992 11.8994 -22.6992 19.2002c0.199219 6.59961 7.2998 13.3994 23.0996 13.3994
493
+ c13.0996 0.299805 22.7002 -2.7998 29.9004 -5.89941l3.59961 -1.7002l5.5 33.5996c-7.90039 3.10059 -20.5 6.60059 -36 6.60059c-39.7002 0 -67.5996 -21.2002 -67.7998 -51.4004c-0.299805 -22.2998 20 -34.7002 35.2002 -42.2002
494
+ c15.5 -7.59961 20.7998 -12.5996 20.7998 -19.2998c-0.200195 -10.4004 -12.6006 -15.2002 -24.1006 -15.2002c-16 0 -24.5996 2.5 -37.6992 8.2998l-5.30078 2.5l-5.59961 -34.8994c9.40039 -4.2998 26.7998 -8.10059 44.7998 -8.2998
495
+ c42.2002 -0.100586 69.7002 20.7998 70 53zM528 116.6l-32.4004 155.4h-31.0996c-9.59961 0 -16.9004 -2.7998 -21 -12.9004l-59.7002 -142.5h42.2002s6.90039 19.2002 8.40039 23.3008h51.5996c1.2002 -5.5 4.7998 -23.3008 4.7998 -23.3008h37.2002z" />
496
+ <glyph glyph-name="cc-mastercard" unicode="&#xf1f1;" horiz-adv-x="576"
497
+ d="M482.9 37.7002c0 -6.7998 -4.60059 -11.7002 -11.2002 -11.7002c-6.7998 0 -11.2002 5.2002 -11.2002 11.7002s4.40039 11.7002 11.2002 11.7002c6.59961 0 11.2002 -5.2002 11.2002 -11.7002zM172.1 49.4004c6.5 0 10.8008 -5.2002 10.9004 -11.7002
498
+ c0 -6.7998 -4.40039 -11.7002 -10.9004 -11.7002c-7.09961 0 -11.1992 5.2002 -11.1992 11.7002s4.09961 11.7002 11.1992 11.7002zM289.6 49.7002c5.2002 0 8.7002 -3 9.60059 -8.7002h-19.1006c0.800781 5.2002 4.10059 8.7002 9.5 8.7002zM397.4 49.4004
499
+ c6.7998 0 11.1992 -5.2002 11.1992 -11.7002c0 -6.7998 -4.39941 -11.7002 -11.1992 -11.7002c-6.80078 0 -10.9004 5.2002 -10.9004 11.7002s4.09961 11.7002 10.9004 11.7002zM503.3 23.2998c0 -0.299805 0.299805 -0.5 0.299805 -1.09961
500
+ c0 -0.299805 -0.299805 -0.5 -0.299805 -1.10059c-0.299805 -0.299805 -0.299805 -0.5 -0.5 -0.799805c-0.299805 -0.299805 -0.5 -0.5 -1.09961 -0.5c-0.299805 -0.299805 -0.5 -0.299805 -1.10059 -0.299805c-0.299805 0 -0.5 0 -1.09961 0.299805
501
+ c-0.299805 0 -0.5 0.299805 -0.799805 0.5c-0.299805 0.299805 -0.5 0.5 -0.5 0.799805c-0.299805 0.5 -0.299805 0.800781 -0.299805 1.10059c0 0.5 0 0.799805 0.299805 1.09961c0 0.5 0.299805 0.799805 0.5 1.10059c0.299805 0.299805 0.5 0.299805 0.799805 0.5
502
+ c0.5 0.299805 0.799805 0.299805 1.09961 0.299805c0.5 0 0.800781 0 1.10059 -0.299805c0.5 -0.300781 0.799805 -0.300781 1.09961 -0.5c0.299805 -0.200195 0.200195 -0.600586 0.5 -1.10059zM501.1 21.9004c0.5 0 0.5 0.299805 0.800781 0.299805
503
+ c0.299805 0.299805 0.299805 0.5 0.299805 0.799805s0 0.5 -0.299805 0.799805c-0.300781 0 -0.5 0.299805 -1.10059 0.299805h-1.59961v-3.5h0.799805v1.40039h0.299805l1.10059 -1.40039h0.799805zM576 367v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48
504
+ v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM64 227.4c0 -76.5 62.0996 -138.5 138.5 -138.5c27.2002 0 53.9004 8.19922 76.5 23.0996c-72.9004 59.2998 -72.4004 171.2 0 230.5c-22.5996 15 -49.2998 23.0996 -76.5 23.0996
505
+ c-76.4004 0.100586 -138.5 -62 -138.5 -138.199zM288 118.6c70.5 55 70.2002 162.2 0 217.5c-70.2002 -55.2998 -70.5 -162.6 0 -217.5zM145.7 42.2998c0 8.7002 -5.7002 14.4004 -14.7002 14.7002c-4.59961 0 -9.5 -1.40039 -12.7998 -6.5
506
+ c-2.40039 4.09961 -6.5 6.5 -12.2002 6.5c-3.7998 0 -7.59961 -1.40039 -10.5996 -5.40039v4.40039h-8.2002v-36.7002h8.2002c0 18.9004 -2.5 30.2002 9 30.2002c10.1992 0 8.19922 -10.2002 8.19922 -30.2002h7.90039c0 18.2998 -2.5 30.2002 9 30.2002
507
+ c10.2002 0 8.2002 -10 8.2002 -30.2002h8.2002v23h-0.200195zM190.6 56h-7.89941v-4.40039c-2.7002 3.30078 -6.5 5.40039 -11.7002 5.40039c-10.2998 0 -18.2002 -8.2002 -18.2002 -19.2998c0 -11.2002 7.90039 -19.2998 18.2002 -19.2998
508
+ c5.2002 0 9 1.89941 11.7002 5.39941v-4.59961h7.89941v36.7998zM231.1 30.4004c0 15 -22.8994 8.19922 -22.8994 15.1992c0 5.7002 11.8994 4.80078 18.5 1.10059l3.2998 6.5c-9.40039 6.09961 -30.2002 6 -30.2002 -8.2002c0 -14.2998 22.9004 -8.2998 22.9004 -15
509
+ c0 -6.2998 -13.5 -5.7998 -20.7002 -0.799805l-3.5 -6.2998c11.2002 -7.60059 32.5996 -6 32.5996 7.5zM266.5 21.0996l-2.2002 6.80078c-3.7998 -2.10059 -12.2002 -4.40039 -12.2002 4.09961v16.5996h13.1006v7.40039h-13.1006v11.2002h-8.19922v-11.2002h-7.60059
510
+ v-7.2998h7.60059v-16.7002c0 -17.5996 17.2998 -14.4004 22.5996 -10.9004zM279.8 34.5h27.5c0 16.2002 -7.39941 22.5996 -17.3994 22.5996c-10.6006 0 -18.2002 -7.89941 -18.2002 -19.2998c0 -20.5 22.5996 -23.8994 33.7998 -14.2002l-3.7998 6
511
+ c-7.7998 -6.39941 -19.6006 -5.7998 -21.9004 4.90039zM338.9 56c-4.60059 2 -11.6006 1.7998 -15.2002 -4.40039v4.40039h-8.2002v-36.7002h8.2002v20.7002c0 11.5996 9.5 10.0996 12.7998 8.40039zM349.5 37.7002c0 11.3994 11.5996 15.0996 20.7002 8.39941l3.7998 6.5
512
+ c-11.5996 9.10059 -32.7002 4.10059 -32.7002 -15c0 -19.7998 22.4004 -23.7998 32.7002 -15l-3.7998 6.5c-9.2002 -6.5 -20.7002 -2.59961 -20.7002 8.60059zM416.2 56h-8.2002v-4.40039c-8.2998 11 -29.9004 4.80078 -29.9004 -13.8994
513
+ c0 -19.2002 22.4004 -24.7002 29.9004 -13.9004v-4.59961h8.2002v36.7998zM449.9 56c-2.40039 1.2002 -11 2.90039 -15.2002 -4.40039v4.40039h-7.90039v-36.7002h7.90039v20.7002c0 11 9 10.2998 12.7998 8.40039zM490.2 70.9004h-7.90039v-19.3008
514
+ c-8.2002 10.9004 -29.8994 5.10059 -29.8994 -13.8994c0 -19.4004 22.5 -24.6006 29.8994 -13.9004v-4.59961h7.90039v51.7002zM497.8 146v-4.59961h0.799805v4.59961h1.90039v0.799805h-4.59961v-0.799805h1.89941zM504.4 22.2002c0 0.5 0 1.09961 -0.300781 1.59961
515
+ c-0.299805 0.299805 -0.5 0.799805 -0.799805 1.10059c-0.299805 0.299805 -0.799805 0.5 -1.09961 0.799805c-0.5 0 -1.10059 0.299805 -1.60059 0.299805c-0.299805 0 -0.799805 -0.299805 -1.39941 -0.299805c-0.5 -0.299805 -0.799805 -0.5 -1.10059 -0.799805
516
+ c-0.5 -0.300781 -0.799805 -0.800781 -0.799805 -1.10059c-0.299805 -0.5 -0.299805 -1.09961 -0.299805 -1.59961c0 -0.299805 0 -0.799805 0.299805 -1.40039c0 -0.299805 0.299805 -0.799805 0.799805 -1.09961c0.300781 -0.299805 0.5 -0.5 1.10059 -0.799805
517
+ c0.5 -0.300781 1.09961 -0.300781 1.39941 -0.300781c0.5 0 1.10059 0 1.60059 0.300781c0.299805 0.299805 0.799805 0.5 1.09961 0.799805s0.5 0.799805 0.799805 1.09961c0.300781 0.600586 0.300781 1.10059 0.300781 1.40039zM507.6 146.9h-1.39941l-1.60059 -3.5
518
+ l-1.59961 3.5h-1.40039v-5.40039h0.800781v4.09961l1.59961 -3.5h1.09961l1.40039 3.5v-4.09961h1.09961v5.40039zM512 227.4c0 76.1992 -62.0996 138.3 -138.5 138.3c-27.2002 0 -53.9004 -8.2002 -76.5 -23.1006c72.0996 -59.2998 73.2002 -171.5 0 -230.5
519
+ c22.5996 -15 49.5 -23.0996 76.5 -23.0996c76.4004 -0.0996094 138.5 61.9004 138.5 138.4z" />
520
+ <glyph glyph-name="cc-discover" unicode="&#xf1f2;" horiz-adv-x="576"
521
+ d="M520.4 251.9c0 -8.40039 -5.5 -12.8008 -15.8008 -12.8008h-4.69922v24.9004h4.89941c10.1006 0 15.6006 -4.2002 15.6006 -12.0996zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480z
522
+ M483.9 277.1v-82h16v32.8008h2.19922l22.2002 -32.8008h19.6006l-25.8008 34.4004c12.1006 2.5 18.7002 10.5996 18.7002 23.2002c0 28.5 -30.2998 24.3994 -52.8994 24.3994zM428 277v-82h45.2998v13.7998h-29.2998v22.2002h28.2998v13.7998h-28.2998v18.2002h29.2998v14
523
+ h-45.2998zM359.3 277h-17.5l35 -84.2002h8.60059l35.5 84.2002h-17.5l-22.2002 -55.2002zM303.4 280c-24.6006 0 -44.6006 -19.9004 -44.6006 -44.5996c0 -24.6006 19.9004 -44.6006 44.6006 -44.6006c24.5996 0 44.5996 19.9004 44.5996 44.6006
524
+ c0 24.5996 -19.9004 44.5996 -44.5996 44.5996zM254.1 273.9c-30.1992 15 -63.2998 -6.80078 -63.2998 -38c0 -32.5 33.6006 -52.5 63.2998 -38.2002v19c-19.2998 -19.2998 -46.7998 -5.7998 -46.7998 19.2002c0 23.6992 26.7002 39.0996 46.7998 19v19zM156.9 207.6
525
+ c-7.60059 0 -13.8008 3.7002 -17.5 10.8008l-10.3008 -9.90039c17.8008 -26.0996 56.6006 -18.2002 56.6006 11.2998c0 13.1006 -5.40039 19 -23.6006 25.6006c-9.59961 3.39941 -12.2998 5.89941 -12.2998 10.2998c0 8.7002 14.5 14.0996 24.9004 2.5l8.39941 10.7998
526
+ c-19.0996 17.0996 -49.6992 8.90039 -49.6992 -14.2998c0 -11.2998 5.19922 -17.2002 20.1992 -22.7002c25.7002 -9.09961 14.7002 -24.4004 3.30078 -24.4004zM55.4004 195c30.8994 0 44.0996 22.4004 44.0996 40.9004c0 24.0996 -18 41.0996 -44.0996 41.0996h-23.4004
527
+ v-82h23.4004zM122.9 195v82h-16v-82h16zM544 15v145c-33.2998 -20.7998 -226.4 -124.4 -416 -160h401c8.2002 0 15 6.7998 15 15zM74.0996 256.4c5.7002 -5 8.90039 -12.6006 8.90039 -20.5c0 -7.90039 -3.2002 -15.5 -8.90039 -20.7002
528
+ c-4.89941 -4.40039 -11.5996 -6.40039 -21.8994 -6.40039h-4.2002v54.2002h4.2002c10.2998 0 16.7002 -1.7002 21.8994 -6.59961z" />
529
+ <glyph glyph-name="cc-amex" unicode="&#xf1f3;" horiz-adv-x="576"
530
+ d="M325.1 280.2c0.100586 -8 -4.2998 -15.7002 -11.6992 -18.7002c9.5 -3.2998 11 -9.2002 11 -18.4004v-13.5h-16.6006c-0.299805 14.8008 3.60059 25.1006 -14.7998 25.1006h-18v-25.1006h-16.4004v69.3008l39.1006 -0.300781c13.2998 0 27.3994 -2 27.3994 -18.3994z
531
+ M295.7 268.9c5.7002 0 11 1.2998 11 7.89941c0 6.40039 -5.60059 7.40039 -10.7002 7.40039h-21v-15.2998h20.7002zM279 179.4c15.5996 0 27.9004 -5.40039 27.9004 -22.7002c0 -27.9004 -30.4004 -23.2998 -49.3008 -23.2998l-0.0996094 -23.3008h-32.2002l-20.3994 23
532
+ l-21.3008 -23h-65.3994l0.0996094 69.3008h66.5l20.5 -22.8008l21 22.8008h52.7002zM175.2 124.7l19 20.2002l-17.9004 20.1992h-41.7002v-12.5h36.3008v-14.0996h-36.3008v-13.7998h40.6006zM241 116.5v55.5l-25.2998 -27.4004zM278.8 147.5
533
+ c5.90039 0 10.5 2.7998 10.5 9.2002c0 6.09961 -4.59961 8.39941 -10.2002 8.39941h-21.5v-17.5996h21.2002zM247.2 284.2h-38.9004v-12.5h37.7998v-14.1006h-37.7998v-13.7998h38.9004v-14.2998h-55.5v69.2998h55.5v-14.5996zM576 192.6h-0.200195h0.200195zM381.4 160.7
534
+ c-0.100586 -7.60059 -4.2002 -15.2998 -11.9004 -18.4004c9.2002 -3.2998 11 -9.5 11 -18.3994l-0.0996094 -13.8008h-16.6006l0.100586 11.5c0 11.8008 -3.80078 13.8008 -14.8008 13.8008h-17.5996l-0.0996094 -25.3008h-16.6006l0.100586 69.3008h39.3994
535
+ c13 0 27.1006 -2.30078 27.1006 -18.7002zM352.2 149.5c5.59961 0 11 1.2998 11 8.2002c0 6.39941 -5.60059 7.39941 -10.7002 7.39941h-21v-15.5996h20.7002zM179.4 229.5h-16.8008v54.2002l-24 -54.2002h-14.5996l-24 54.2002v-54.2002h-33.7998l-6.40039 15.2998h-34.5
536
+ l-6.39941 -15.2998h-17.9004l29.7002 69.2998h24.5l28.0996 -65.7002v65.7002h27.1006l21.6992 -47l19.7002 47h27.6006v-69.2998zM31.2002 259.2h22.7002l-11.5 27.5996zM508.6 100.3c34.8008 0 54.8008 -2.2002 67.5 6.10059v-90.4004c0 -26.5 -21.5 -48 -48 -48h-480.1
537
+ c-26.5 0 -48 21.5 -48 48v203.7h26.5996c4.2002 10.0996 2.2002 5.2998 6.40039 15.2998h19.2002c4.2002 -10 2.2002 -5.2002 6.39941 -15.2998h52.9004v11.3994c2.2002 -5 1.09961 -2.5 5.09961 -11.3994h29.5c2.40039 5.5 2.60059 5.7998 5.10059 11.3994v-11.3994h135.5
538
+ v25.0996c6.39941 0 8 0.100586 9.7998 -0.200195c0 0 -0.200195 -10.8994 0.0996094 -24.7998h66.5v8.90039c7.40039 -5.90039 17.4004 -8.90039 29.7002 -8.90039h26.7998c4.2002 10.1006 2.2002 5.2998 6.40039 15.2998h19c6.5 -15 0.200195 -0.5 6.59961 -15.2998
539
+ h52.8008v21.9004c11.7998 -19.7002 7.7998 -12.9004 13.1992 -21.9004h41.6006v92h-39.9004v-18.3994c-12.2002 20.1992 -6.2998 10.3994 -11.2002 18.3994h-43.2998v-20.5996c-6.2002 14.5996 -4.59961 10.7998 -8.7998 20.5996h-32.4004
540
+ c-0.399414 0 -2.2998 -0.200195 -2.2998 0.299805h-27.5996c-12.7998 0 -23.1006 -3.19922 -30.7002 -9.2998v9.2998h-39.9004v-5.2998c-10.7998 6.10059 -20.6992 5.10059 -64.3994 5.2998c-0.100586 0 -11.6006 0.100586 -11.6006 0h-103
541
+ c-2.5 -6.09961 -6.7998 -16.3994 -12.5996 -30c-2.7998 6 -11 23.8008 -13.9004 30h-46v-21.0996c-7.39941 17.4004 -4.69922 11 -9 21.0996h-39.6992c-3.40039 -7.89941 -13.7002 -32 -23.1006 -53.8994v109.8c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48v-175.4
542
+ c-37.7002 0.200195 -44 0.900391 -54.2998 -5v5c-45.2998 0 -53.5 1.7002 -64.9004 -5.19922v5.19922h-78.1992v-5.09961c-11.4004 6.5 -21.4004 5.09961 -75.7002 5.09961v-5.59961c-6.2998 3.7002 -14.5 5.59961 -24.2998 5.59961h-58
543
+ c-3.5 -3.7998 -12.5 -13.6992 -15.7002 -17.1992c-12.7002 14.0996 -10.5 11.5996 -15.5 17.1992h-83.1006v-92.2998h82c3.30078 3.5 12.9004 13.9004 16.1006 17.4004c12.7002 -14.2998 10.2998 -11.7002 15.3994 -17.4004h48.9004
544
+ c0 14.7002 0.0996094 8.2998 0.0996094 23c11.5 -0.200195 24.3008 0.200195 34.3008 6.2002c0 -13.9004 -0.100586 -17.0996 -0.100586 -29.2002h39.6006c0 18.5 0.0996094 7.40039 0.0996094 25.2998c6.2002 0 7.7002 0 9.40039 -0.0996094
545
+ c0.0996094 -1.2998 0 0 0 -25.2002c152.8 0 145.899 -1.09961 156.699 4.5v-4.5zM544.9 164.8c-4.60059 0 -9.2002 -0.700195 -9.2002 -6.5c0 -12.2002 28.7998 0.299805 39.2998 -13.5v-25.7998c-4.90039 -7.09961 -14.0996 -8.90039 -22.5 -8.90039h-32l0.0996094 14.8008
546
+ h32c4.10059 0 8.40039 1.2998 8.40039 6.39941c0 14.6006 -42.7002 -5.59961 -42.7002 27.4004c0 14.0996 11 20.7002 23.7998 20.7002h32.9004v-14.6006h-30.0996zM487.9 125c4.09961 0 8.69922 1 8.7998 6.40039c0 14.8994 -42.7002 -5.60059 -42.7002 27.3994
547
+ c0 14.1006 10.7002 20.7002 23.5 20.7002h33.2002v-14.5996h-30.4004c-4.2998 0 -9.2002 -0.800781 -9.2002 -6.40039c0 -15.0996 42.9004 6.90039 42.9004 -26.2998c0 -16.4004 -11.4004 -22 -26.2002 -22h-32.2002l0.100586 14.7998h32.2002zM445.7 165.1h-38.5v-12.5
548
+ h37.7998v-14.0996h-37.9004v-13.7998l38.6006 -0.299805l-0.100586 -14.3008h-55.1992l0.0996094 69.3008h55.2002v-14.3008zM389.4 273.2c0.299805 0.299805 1.69922 1 7.2998 1c1 0 2 -0.100586 3.09961 -0.100586l-7.2998 -16.8994
549
+ c-2.2998 0 -3.2002 0.399414 -3.40039 0.5c-0.199219 0.200195 -1.09961 1.89941 -1.09961 7.89941c0 5.40039 1.09961 7.40039 1.40039 7.60059zM409.8 283.7h-0.0996094h0.0996094zM393.6 298.9h16.1006v-15.2002c-17.4004 0.299805 -33.1006 4.09961 -33.1006 -19.7002
550
+ c0 -11.7998 2.80078 -19.9004 16.1006 -19.9004h7.39941l23.5 54.5h24.8008l27.8994 -65.3994v65.3994h25.2998l29.1006 -48.0996v48.0996h16.8994v-69h-23.5996l-31.2002 51.9004v-51.9004h-33.7002l-6.59961 15.3008h-34.2998l-6.40039 -15.3008h-19.2002
551
+ c-22.7998 0 -33 11.8008 -33 34c0 23.3008 10.5 35.3008 34 35.3008zM435.7 286.8l-11.6006 -27.5996h22.8008zM334.6 298.8h16.9004v-69.2998h-16.9004v69.2998z" />
552
+ <glyph glyph-name="cc-paypal" unicode="&#xf1f4;" horiz-adv-x="576"
553
+ d="M186.3 189.8c0 -12.2002 -9.7002 -21.5 -22 -21.5c-9.2002 0 -16 5.2002 -16 15c0 12.2002 9.5 22 21.7002 22c9.2998 0 16.2998 -5.7002 16.2998 -15.5zM80.5 238.3c11.2998 0 19.7998 -1.5 17.5 -14.8994c-2 -12.7002 -10.5 -14.2002 -21.5 -14.2002l-8.2002 -0.299805
554
+ l4.2998 26.6992c0.200195 1.7002 1.7002 2.7002 3.2002 2.7002h4.7002zM364.5 238.3c8.5 0 18 -0.5 18.0996 -11.0996c0 -15 -9 -18 -22 -18l-8 -0.299805l4.2002 26.6992c0.200195 1.7002 1.40039 2.7002 3.2002 2.7002h4.5zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480
555
+ c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM128.3 232.6c0 21 -16.2002 28 -34.7002 28h-40c-2.5 0 -5 -2 -5.19922 -4.69922l-16.4004 -102.101c-0.299805 -2 1.2002 -4 3.2002 -4h19c2.7002 0 5.2002 2.90039 5.5 5.7002l4.5 26.5996
556
+ c1 7.2002 13.2002 4.7002 18 4.7002c28.5996 0 46.0996 17 46.0996 45.7998zM212.5 223.8h-19c-3.7998 0 -4 -5.5 -4.2002 -8.2002c-5.7998 8.5 -14.2002 10 -23.7002 10c-24.5 0 -43.1992 -21.5 -43.1992 -45.1992c0 -19.5 12.1992 -32.2002 31.6992 -32.2002
557
+ c9 0 20.2002 4.89941 26.5 11.8994c-0.5 -1.5 -1 -4.69922 -1 -6.19922c0 -2.30078 1 -4 3.2002 -4h17.2002c2.7002 0 5 2.89941 5.5 5.69922l10.2002 64.3008c0.299805 1.89941 -1.2002 3.89941 -3.2002 3.89941zM253 125.9l63.7002 92.5996c0.5 0.5 0.5 1 0.5 1.7002
558
+ c0 1.7002 -1.5 3.5 -3.2002 3.5h-19.2002c-1.7002 0 -3.5 -1 -4.5 -2.5l-26.5 -39l-11 37.5c-0.799805 2.2002 -3 4 -5.5 4h-18.7002c-1.69922 0 -3.19922 -1.7998 -3.19922 -3.5c0 -1.2002 19.5 -56.7998 21.1992 -62.1006c-2.69922 -3.7998 -20.5 -28.5996 -20.5 -31.5996
559
+ c0 -1.7998 1.5 -3.2002 3.2002 -3.2002h19.2002c1.7998 0.100586 3.5 1.10059 4.5 2.60059zM412.3 232.6c0 21 -16.2002 28 -34.7002 28h-39.6992c-2.7002 0 -5.2002 -2 -5.5 -4.69922l-16.2002 -102c-0.200195 -2 1.2998 -4 3.2002 -4h20.5c2 0 3.5 1.5 4 3.19922l4.5 29
560
+ c1 7.2002 13.1992 4.7002 18 4.7002c28.3994 0 45.8994 17 45.8994 45.7998zM496.5 223.8h-19c-3.7998 0 -4 -5.5 -4.2998 -8.2002c-5.5 8.5 -14 10 -23.7002 10c-24.5 0 -43.2002 -21.5 -43.2002 -45.1992c0 -19.5 12.2002 -32.2002 31.7002 -32.2002
561
+ c9.2998 0 20.5 4.89941 26.5 11.8994c-0.299805 -1.5 -1 -4.69922 -1 -6.19922c0 -2.30078 1 -4 3.2002 -4h17.2998c2.7002 0 5 2.89941 5.5 5.69922l10.2002 64.3008c0.299805 1.89941 -1.2002 3.89941 -3.2002 3.89941zM544 257.1c0 2 -1.5 3.5 -3.2002 3.5h-18.5
562
+ c-1.5 0 -3 -1.19922 -3.2002 -2.69922l-16.1992 -104l-0.300781 -0.5c0 -1.80078 1.5 -3.5 3.5 -3.5h16.5c2.5 0 5 2.89941 5.2002 5.69922l16.2002 101.2v0.299805zM454 205.3c9.2998 0 16.2998 -5.7002 16.2002 -15.5c0 -12.2998 -9.7002 -21.5 -21.7002 -21.5
563
+ c-9.2002 0 -16.2002 5.2998 -16.2002 15c0 12.2998 9.5 22 21.7002 22z" />
564
+ <glyph glyph-name="cc-stripe" unicode="&#xf1f5;" horiz-adv-x="576"
565
+ d="M492.4 227.2c8.69922 0 18 -6.7002 18 -22.7002h-36.7002c0 16 9.7998 22.7002 18.7002 22.7002zM375 224.6c12.9004 0.100586 21.9004 -14.5 21.9004 -33.0996c0 -19.0996 -8.80078 -33.4004 -21.9004 -33.4004c-8.2998 0 -13.2998 3 -16.7998 6.7002l-0.200195 52.7998
566
+ c3.7002 4.10059 8.7998 7 17 7zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM122.2 166.9c0 42.2998 -54.2998 34.6992 -54.2998 50.6992c0 5.5 4.59961 7.7002 12.0996 7.7002
567
+ c10.7998 0 24.5 -3.2998 35.2998 -9.09961v33.3994c-11.7998 4.7002 -23.5 6.5 -35.2998 6.5c-28.7998 0 -48 -15 -48 -40.1992c0 -39.3008 54 -32.9004 54 -49.9004c0 -6.59961 -5.7002 -8.7002 -13.5996 -8.7002c-11.8008 0 -26.9004 4.90039 -38.9004 11.2998v-33.8994
568
+ c13.2002 -5.7002 26.5996 -8.10059 38.7998 -8.10059c29.6006 0.200195 49.9004 14.7002 49.9004 40.3008zM191 223.5v30.2998h-26.9004v30.7998l-34.6992 -7.39941l-0.200195 -113.9c0 -21 15.7998 -36.5 36.8994 -36.5c11.6006 0 20.2002 2.10059 24.9004 4.7002v28.9004
569
+ c-4.5 -1.80078 -27 -8.30078 -27 12.5996v50.5h27zM265 221.1v32.7002h-0.0996094c-4.7002 1.7002 -21.3008 4.7998 -29.6006 -10.5l-2.2002 10.5h-30.6992v-124.5h35.5v84.4004c8.39941 11 22.5996 8.89941 27.0996 7.39941zM309.1 129.3v124.5h-35.6992v-124.5h35.6992z
570
+ M309.1 272.2v28.8994l-35.6992 -7.59961v-28.9004zM383.2 126.7c25.3994 0.0996094 48.5996 20.5 48.5996 65.5996c0 41.2998 -23.5 63.7998 -48.3994 63.7998c-13.9004 0 -22.9004 -6.59961 -27.8008 -11.0996l-1.7998 8.7998h-31.2998v-165.8l35.5 7.5l0.0996094 40.2002
571
+ c5.10059 -3.7002 12.7002 -9 25.1006 -9zM543.6 178.2c0.100586 2 0.400391 9.39941 0.400391 12.8994c0 36.4004 -17.5996 65.1006 -51.2998 65.1006c-33.7998 0 -54.2998 -28.7002 -54.2998 -64.9004c0 -42.7998 24.1992 -64.5 58.7998 -64.5
572
+ c17 0 29.7002 3.90039 39.3994 9.2002v28.5996c-9.69922 -4.89941 -20.7998 -7.89941 -34.8994 -7.89941c-13.7998 0 -26 4.89941 -27.6006 21.5h69.5z" />
573
+ <glyph glyph-name="lastfm" unicode="&#xf202;" horiz-adv-x="512"
574
+ d="M225.8 80.9004c0 0 -31.7002 -31.1006 -97.8994 -31.1006c-82.2002 0 -127.9 48.1006 -127.9 137.2c0 92.7002 45.7002 147.2 131.8 147.2c117.7 0 129.3 -66.2002 161.3 -163c14 -42.7998 38.7002 -73.9004 97.9004 -73.9004c39.9004 0 61 8.7998 61 30.5
575
+ c0 31.9004 -34.9004 35.1006 -79.7998 45.7002c-48.6006 11.7002 -68 36.9004 -68 76.7998c0 64 51.5996 83.9004 104.399 83.9004c59.8008 0 96.2002 -21.7002 100.9 -74.5l-58.5996 -7c-2.30078 25.2002 -17.5 35.7998 -45.7002 35.7998
576
+ c-25.7998 0 -41.6006 -11.7998 -41.6006 -31.7002c0 -17.5996 7.60059 -28.0996 33.4004 -34c52.2998 -11.5 115 -19.2002 115 -92.0996c0 -58.6006 -49.2998 -80.9004 -122 -80.9004c-101.4 0 -136.6 45.7002 -155.4 102.601
577
+ c-26.0996 81.5996 -34.3994 134.899 -100.899 134.899c-35.7002 0 -72.1006 -25.7998 -72.1006 -97.8994c0 -56.3008 28.7002 -91.5 69.2002 -91.5c45.7002 0 76.2002 34 76.2002 34z" />
578
+ <glyph glyph-name="lastfm-square" unicode="&#xf203;"
579
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM307.8 103.1c45.4004 0 76.2002 13.9004 76.1006 50.6006c0 45.5 -39.1006 50.3994 -71.8008 57.5
580
+ c-16.0996 3.7002 -20.8994 10.2998 -20.8994 21.2998c0 12.5 9.89941 19.7998 26 19.7998c17.5996 0 27.0996 -6.59961 28.5996 -22.3994l36.7002 4.39941c-2.90039 33 -25.5996 46.6006 -63 46.6006c-32.9004 0 -65.2002 -12.4004 -65.2002 -52.4004
581
+ c0 -24.9004 12.1006 -40.7002 42.5 -48c28.1006 -6.59961 49.9004 -8.7002 49.9004 -28.5996c0 -13.6006 -13.2002 -19.1006 -38.1006 -19.1006c-37 0 -52.3994 19.4004 -61.1992 46.2002c-20 60.5 -27.3008 101.9 -100.801 101.9c-53.8994 0 -82.5 -34.1006 -82.5 -92
582
+ c0 -55.7002 28.6006 -85.8008 79.9004 -85.8008c41.4004 0 61.2002 19.4004 61.2002 19.4004l-11.7002 31.9004s-19 -21.3008 -47.5996 -21.3008c-25.3008 0 -43.3008 22 -43.3008 57.2002c0 45.1006 22.7002 61.2002 45.1006 61.2002c41.5 0 46.7002 -33.2998 63 -84.2998
583
+ c11.7002 -35.5 33.7002 -64.1006 97.0996 -64.1006z" />
584
+ <glyph glyph-name="ioxhost" unicode="&#xf208;" horiz-adv-x="640"
585
+ d="M616 288c13.2998 0 24 -10.7002 24 -24c0 -13.2002 -10.7002 -24 -24 -24h-52.7002c3.10059 -15.5 4.7002 -31.5996 4.7002 -48c0 -137 -111 -248 -248 -248c-102.9 0 -191.2 62.7002 -228.7 152h-67.2998c-13.2998 0 -24 10.7002 -24 24c0 13.2002 10.7002 24 24 24
586
+ h52.7002c-3.10059 15.5 -4.7002 31.5996 -4.7002 48c0 137 111 248 248 248c102.9 0 191.2 -62.7002 228.7 -152h67.2998zM520 192c0 16.5996 -2 32.5996 -5.7998 48h-298.2c-13.2998 0 -24 10.7002 -24 24c0 13.2002 10.7002 24 24 24h279.5
587
+ c-33.9004 62 -99.7998 104 -175.5 104c-110.5 0 -200 -89.5 -200 -200c0 -16.5996 2 -32.5996 5.7998 -48h298.2c13.2998 0 24 -10.7002 24 -24c0 -13.2002 -10.7002 -24 -24 -24h-279.5c33.9004 -62 99.7998 -104 175.5 -104c110.5 0 200 89.5 200 200zM216 216h208
588
+ c13.2998 0 24 -10.7002 24 -24c0 -13.2002 -10.7002 -24 -24 -24h-208c-13.2998 0 -24 10.7002 -24 24c0 13.2002 10.7002 24 24 24z" />
589
+ <glyph glyph-name="angellist" unicode="&#xf209;"
590
+ d="M347.1 232.6c48 -11.6992 54.9004 -50.5996 54.9004 -93.6992c0 -114.301 -73.4004 -202.9 -191.4 -202.9c-96.1992 0 -164.6 76.4004 -164.5 148.6c0 37.1006 14.2002 61.7002 51.1006 71.7002c-3.10059 8.2998 -8 20.7998 -8 29.7002
591
+ c0 23.5 24.8994 52.5996 48.2998 52.5996c6.90039 0 13.7002 -2 20 -4.2998c-12.4004 35.2002 -46.5996 126.7 -46.5996 162c0 28.7998 14.5996 51.7002 45.6992 51.7002c40 0 85.4004 -144 95.1006 -172.5c12.5 31.4004 52.5 163.1 97.0996 163.1
592
+ c28 0 43.7002 -22.2998 43.7002 -48.8994c0 -30.2002 -33.7002 -124.5 -45.4004 -157.101zM311.7 340l-33.1006 -93.7002l34 -6c8.5 23.4004 47.1006 128.9 47.1006 148c0 7.10059 -2.2998 16 -10.9004 16c-16 0 -33.0996 -52 -37.0996 -64.2998zM142.3 399.7
593
+ c0 -29.1006 34.6006 -120 45.5 -148.8c7.7002 4.39941 19.7998 2.69922 35.4004 1.39941l-34.6006 100.3c-31.7998 92.8008 -46.2998 59 -46.2998 47.1006zM140 204c-7.7002 0 -20.2998 -13.4004 -20.4004 -21.0996c0 -20.8008 56 -97.7002 76.9004 -97.7002
594
+ c5.7002 0 10.5996 6.2998 10.5996 11.3994c0 12.8008 -37.7998 107.4 -67.0996 107.4zM324.3 17.7002c55.2998 61.5 49.1006 158.6 31 174.7c-24 21.0996 -106 29.0996 -138.3 29.0996c-17.2998 0 -17.4004 -6.40039 -17.4004 -13.0996
595
+ c0 -43.7002 92.9004 -39.7002 120.601 -39.7002c11.2002 0 15.7998 -9.90039 16.8994 -21.1006c-7.39941 -7.39941 -17.6992 -11.6992 -27.3994 -15.3994c-9.40039 -3.40039 -19.1006 -7.10059 -27.1006 -13.1006c-22 -16 -43.6992 -43.3994 -43.6992 -71.6992
596
+ c0 -17.7002 10.5996 -32.9004 10.5996 -50.3008c0 -0.299805 -2 -6.5 -2 -7.39941c-32.5996 2.2998 -40.5996 34.5996 -41.7002 61.7002c-3.39941 -0.900391 -8 -0.600586 -11.7002 -0.600586c5.10059 -17.7998 -11.8994 -42 -38 -42
597
+ c-37.7998 0 -88 57.2002 -58.2998 86.9004c28.7002 -35.9004 35 -51.4004 51.1006 -51.4004c4 0 11.6992 3.40039 11.6992 8.2998c0 12.8008 -42.8994 73.1006 -54.2998 73.1006c-16.7998 0 -37.7002 -24.9004 -20.5996 -68.2998
598
+ c22.5996 -55.7002 69.5 -88.3008 128.899 -88.3008c43.4004 0 80.6006 16.6006 109.7 48.6006zM225.7 143.7c3.2002 -8.2998 6.59961 -16.6006 9.39941 -25.1006c6.30078 7.10059 12.9004 13.7002 20.3008 19.1006c-10 2 -20 2.89941 -29.7002 6z" />
599
+ <glyph glyph-name="buysellads" unicode="&#xf20d;"
600
+ d="M224 297.3l42.9004 -160.7h-85.8008zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM382.7 42.7002l-94.5 298.7h-128.4l-94.5 -298.7h90.7002l111.7 91.5996l24.2002 -91.5996h90.7998z
601
+ " />
602
+ <glyph glyph-name="connectdevelop" unicode="&#xf20e;" horiz-adv-x="576"
603
+ d="M550.5 207c6.69629 -1.33887 11.7861 -7.5 11.7881 -14.7324c0 -7.5 -5.3584 -13.6602 -12.3223 -15l-54.9111 -95.3574c0.536133 -1.60742 0.804688 -3.21387 0.804688 -4.82129c0 -7.23145 -5.09082 -13.3926 -12.0547 -14.7314l-51.6963 -90.2686
604
+ c0.535156 -1.33887 0.802734 -2.67773 0.802734 -4.28516c0 -8.30371 -6.69727 -15.2676 -15.2686 -15.2676c-4.28516 0 -8.30371 1.875 -10.9814 4.82129h-107.144c-2.67871 -3.21484 -6.96484 -5.35742 -11.5176 -5.35742s-8.83887 2.14258 -11.5166 5.35645h-106.875
605
+ c-2.67969 -3.21484 -6.69727 -5.35742 -11.5186 -5.35742c-8.30371 0 -15.2676 6.69727 -15.2676 15.2676c0 1.875 0.535156 3.75 1.07031 5.35742l-51.6963 89.7324c-6.96484 1.33887 -12.0547 7.5 -12.0547 14.7314c0 1.875 0.268555 3.21387 0.804688 4.82129
606
+ l-55.1797 95.3574c-6.96484 1.60742 -12.0537 7.76855 -12.0537 15c0 7.5 5.3584 13.6611 12.5898 15l53.3047 92.1436c0 0.536133 -0.268555 1.07227 -0.268555 1.60645c0 6.16113 3.75098 11.251 9.10742 13.6611l55.9824 97.2334
607
+ c-0.536133 1.33887 -1.07129 3.21387 -1.07129 4.82129c0 8.57129 6.96484 15.2676 15.2676 15.2676c4.82227 0 8.83887 -2.14258 11.7861 -5.625h106.071c2.67871 3.48242 6.69629 5.625 11.5176 5.625s8.83887 -2.14258 11.5176 -5.62402h106.606
608
+ c2.94727 3.48242 6.96484 5.625 11.7861 5.625c8.30371 0 15.2676 -6.69727 15.2676 -15.2676c0 -1.60742 -0.535156 -3.21484 -1.07031 -4.82129l55.4463 -95.8936c8.03613 -0.267578 14.7324 -6.96484 14.7324 -15.001c0 -2.67871 -0.803711 -5.08984 -1.875 -7.23145z
609
+ M153.535 -2.73242v75.8037h-43.6602zM153.535 81.1074v50.624l-44.999 -47.4102c0.535156 -1.07227 1.07129 -2.14355 1.33887 -3.21387h43.6602zM153.535 143.518l0.000976562 92.9463l-50.0889 51.9648c-2.41113 -1.60645 -5.08887 -2.41113 -7.76855 -2.67871
610
+ l-51.9648 -90c0.268555 -1.07227 0.268555 -2.14258 0.268555 -3.48242c0 -1.33887 0 -2.67871 -0.535156 -4.01758l55.7129 -96.4287c1.33887 -0.267578 2.67871 -1.07129 4.01758 -1.60742zM153.535 245.84v72.0527l-43.9277 -15.8037
611
+ c0 -0.267578 0.267578 -0.803711 0.267578 -1.07227c0 -2.94531 -0.803711 -5.62402 -2.14258 -7.7666zM153.535 326.465v59.7324l-43.6602 -75.5361zM480.054 287.357l-0.267578 0.267578l-98.0361 -101.518l63.75 -67.2324l35.3584 167.143zM291.75 92.8926
612
+ l-11.25 -11.7852h22.7676zM291.482 104.143l79.2852 82.2324l-83.0352 87.5889l-79.5537 -84.375zM296.839 98.25l16.875 -17.1426h124.02l5.8916 28.125l-67.5 71.25zM410.411 403.607l-117.053 -124.019l83.0342 -87.5889l97.5 101.25
613
+ c-1.33984 2.14258 -2.14258 4.82129 -2.14258 7.7666v0.536133l-57.8574 100.714c-1.33984 0.268555 -2.41016 0.804688 -3.48145 1.34082zM401.304 405.75h-4.28711l-166.339 -60l57.0547 -60.2676zM277.821 405.75h-103.929l50.8936 -53.5713l148.393 53.5713h-75
614
+ c-2.67871 -2.67773 -6.16016 -4.28516 -10.1787 -4.28516s-7.50098 1.60742 -10.1787 4.28516zM161.572 400.125v-70.7148l54.9111 19.8213l-51.1611 53.8398c-0.730469 -0.25293 -1.93066 -0.613281 -2.67969 -0.804688zM161.572 320.839v-83.3037l40.9814 -42.0527
615
+ l79.5537 84.1064l-59.7324 63.2139zM161.572 228.161v-76.0723l36.4277 38.3037zM161.572 140.303v-59.1953h107.678l17.1426 17.6777l-82.7676 85.9814zM168.536 -21.75h1.33887l91.6074 94.8213h-99.9102v-89.7324l1.07031 -1.60645
616
+ c2.41113 -0.804688 4.28613 -1.875 5.89355 -3.48242zM298.447 -21.75h104.194l-91.6064 94.8213h-38.3037l-91.6074 -94.8213h96.4287c2.68066 2.41016 6.42871 4.28516 10.4473 4.28516s7.76758 -1.875 10.4473 -4.28516zM418.447 -9.96387l17.4121 83.0361h-114.376
617
+ l89.1953 -91.875c1.07227 0.536133 2.14355 1.07031 3.48242 1.33887zM431.303 12.2676l34.8223 60.8037h-21.9639zM466.125 81.1074c0.267578 1.07129 0.803711 2.14258 1.33887 2.94531l-17.1426 18.2139l-4.55371 -21.1592h20.3574zM532.286 188.518
618
+ c-0.268555 1.33984 -0.536133 2.41113 -0.536133 3.75c0 1.60742 0.536133 2.94629 0.802734 4.28516l-45.8027 79.2861l-34.5537 -163.928l20.625 -21.9639c1.33887 0.802734 2.67871 1.33887 4.01758 1.87402z" />
619
+ <glyph glyph-name="dashcube" unicode="&#xf210;"
620
+ d="M326.6 344l102.2 104v-427c0 -50.5 -40.0996 -85 -91.2002 -85h-227.199c-51.1006 0 -91.2002 34.5 -91.2002 85v229.5c0 50.2002 40.0996 93.5 91.2002 93.5h216.199zM153.9 31.5v-0.0996094h223.8l-51.1006 52.2998v123.5c0 17.7002 -14.2998 32.5 -32 32.5h-140.699
621
+ c-17.7002 0 -32.4004 -14.7998 -32.4004 -32.5v-142.9c0 -17.7002 14.7002 -32.7998 32.4004 -32.7998z" />
622
+ <glyph glyph-name="forumbee" unicode="&#xf211;"
623
+ d="M5.7998 138.3c-3.7998 17 -5.7998 34.2002 -5.7998 51.4004c0 123.3 99.7998 223.3 223.1 223.3c16.6006 0 33.3008 -2 49.3008 -5.5c-123.4 -47 -220.5 -145.5 -266.601 -269.2zM398.7 327.5c-151.101 -44 -269.2 -164.4 -312.3 -315.7
624
+ c-17.2002 13.4004 -32.7002 30.9004 -45.2002 49c43.3994 149.9 160.1 267.7 309.7 312c18.0996 -12.5996 34.0996 -27.7998 47.7998 -45.2998zM414.5 74.7998c13.0996 -35.2998 24.2002 -73.2998 33.5 -109.8c-36.0996 9.2998 -72 20.5 -107 33.5996
625
+ c-25.7002 -16 -54.5996 -26.8994 -84.5996 -31.2998c42.5996 79.7002 108.199 147.4 187.6 190.3c-4.09961 -29.0996 -14.2998 -57.6992 -29.5 -82.7998zM444.2 220.3c-113.7 -46.7002 -204.2 -139.399 -250.5 -253.5c-19.6006 2.7002 -38.5 7.60059 -56.6006 15.2002
626
+ c44.9004 138.5 153.4 249.3 291.301 295.1c7.89941 -18.0996 13.1992 -37.2998 15.7998 -56.7998z" />
627
+ <glyph glyph-name="leanpub" unicode="&#xf212;" horiz-adv-x="576"
628
+ d="M386.539 336.515l15.0957 -248.955l-10.9785 0.275391c-36.2324 0.824219 -71.6406 -8.7832 -102.657 -27.9971c-31.0156 19.2139 -66.4238 27.9971 -102.657 27.9971c-45.5635 0 -82.0693 -10.7051 -123.516 -27.7227l31.291 258.288
629
+ c28.5459 11.8027 61.4834 18.1143 92.2256 18.1143c41.1729 0 73.8359 -13.1748 102.657 -42.5439c27.7227 28.2715 59.0127 41.7217 98.5391 42.5439zM569.07 0c-25.5264 0 -47.4854 5.21484 -70.542 15.6445c-34.3105 15.6455 -69.9932 24.9785 -107.871 24.9785
630
+ c-38.9775 0 -74.9346 -12.9014 -102.657 -40.623c-27.7227 27.7227 -63.6797 40.623 -102.657 40.623c-37.8779 0 -73.5605 -9.33301 -107.871 -24.9785c-22.2324 -9.88086 -44.7402 -15.6445 -69.1689 -15.6445h-1.37305l42.5449 349.141
631
+ c39.251 22.2334 87.0117 34.8594 132.301 34.8594c37.0547 0 75.209 -7.68457 106.225 -29.0947c31.0156 21.4102 69.1699 29.0947 106.225 29.0947c45.2891 0 93.0498 -12.626 132.301 -34.8594zM525.702 44.7412l-34.0361 280.246
632
+ c-30.7422 13.999 -67.248 21.4102 -101.009 21.4102c-38.4287 0 -74.3848 -12.0771 -102.657 -38.7021c-28.2725 26.625 -64.2275 38.7021 -102.657 38.7021c-33.7607 0 -70.2666 -7.41113 -101.009 -21.4102l-34.0361 -280.246
633
+ c47.2109 19.4863 82.8945 33.4854 135.045 33.4854c37.6045 0 70.8174 -9.60547 102.657 -29.6436c31.8398 20.0381 65.0518 29.6436 102.657 29.6436c52.1504 0 87.834 -13.999 135.045 -33.4854z" />
634
+ <glyph glyph-name="sellsy" unicode="&#xf213;" horiz-adv-x="640"
635
+ d="M539.71 210.692c55.1572 -13.4834 94.0742 -63.124 94.0732 -119.509c0 -68.0264 -55.4639 -123.184 -123.185 -123.184h-381.197c-67.7217 0 -123.186 55.1572 -123.185 123.185c0 47.4961 27.8848 91.0098 70.7852 111.234
636
+ c-2.14453 7.35449 -3.06543 15.0146 -3.06543 22.3691c0 46.2705 37.6914 83.9609 83.9629 83.9609c20.2227 0 39.835 -7.35449 55.1562 -20.5303c18.3867 74.7695 85.8008 127.781 163.021 127.781c92.542 0 167.924 -75.3818 167.924 -167.924
637
+ c0 -12.5635 -1.22559 -25.127 -4.29004 -37.3838zM199.88 46.4463v110.928c0 8.27344 -7.04688 15.3213 -15.3213 15.3213h-30.9482c-8.27344 0 -15.3213 -7.04785 -15.3213 -15.3213v-110.928c0 -8.27344 7.04688 -15.3213 15.3213 -15.3213h30.9482
638
+ c8.27344 0 15.3213 7.04688 15.3213 15.3213zM289.357 46.4463v131.458c0 8.27246 -7.04883 15.3203 -15.3223 15.3203h-30.9492c-8.27246 0 -15.3213 -7.04688 -15.3213 -15.3203v-131.458c0 -8.27344 7.04688 -15.3213 15.3213 -15.3213h30.9492
639
+ c8.27344 0 15.3223 7.04688 15.3223 15.3213zM378.834 46.4463v162.714c0 8.27246 -7.04688 15.3213 -15.3213 15.3213h-30.9482c-8.27441 0 -15.3223 -7.04785 -15.3223 -15.3213v-162.714c0 -8.27344 7.04785 -15.3213 15.3223 -15.3213h30.9482
640
+ c8.27441 0 15.3213 7.04688 15.3213 15.3213zM465.861 46.4463v224.612c0 8.58008 -7.04785 15.6279 -15.3223 15.6279h-28.4971c-8.27441 0 -15.3213 -7.04883 -15.3213 -15.6279v-224.612c0 -8.27344 7.04688 -15.3213 15.3213 -15.3213h28.4971
641
+ c8.27441 0 15.3223 7.04688 15.3223 15.3213z" />
642
+ <glyph glyph-name="shirtsinbulk" unicode="&#xf214;"
643
+ d="M100 37.7002l4.40039 9.89941l30.5996 -13.3994l-4.40039 -9.90039zM139.4 20.2002l4.39941 9.89941l30.6006 -13.3994l-4.40039 -9.90039zM311.5 34.2002l30.5996 13.3994l4.40039 -9.89941l-30.5996 -13.4004zM179.1 3l4.40039 9.59961l30.2998 -13.3994
644
+ l-4.39941 -9.90039zM60.4004 55.2002l4.39941 9.89941l30.6006 -13.6992l-4.40039 -9.60059zM271.8 16.7002l30.6006 13.3994l4.39941 -9.89941l-30.5996 -13.4004zM232.5 -0.799805l30.5996 13.3994l4.40039 -9.59961l-30.5996 -13.7002zM350.9 51.4004l30.5996 13.6992
645
+ l4.40039 -9.89941l-30.6006 -13.4004zM170 401.4v-10.5h-33.5v10.5h33.5zM122.8 401.4l-0.0996094 -10.5h-33.5v10.5h33.5996zM75.5 401.4l0.0996094 -10.5h-33.2998v10.5h33.2002zM217 401.4v-10.5h-33.2002v10.5h33.2002zM311.5 401.4v-10.5h-33.5v10.5h33.5zM358.8 401.4
646
+ v-10.5h-33.5v10.5h33.5zM264.2 401.4v-10.5h-33.2002v10.5h33.2002zM405.7 401.4v-10.5h-33.2998v10.5h33.2998zM52.7998 96.9004v-33.5h-10.7998v33.5h10.7998zM122.8 312.8l-0.0996094 -10.5h-33.5v10.5h33.5996zM52.7998 302.2v-23h-10.7998v33.5h33.5996v-10.5h-22.7998
647
+ zM221.7 73.5996c-50.2002 0 -91.2998 40.8008 -91.2998 91.3008c0 50.1992 41.0996 91.2998 91.2998 91.2998c50.5 0 91.2998 -41.1006 91.2998 -91.2998c0 -50.5 -40.7998 -91.3008 -91.2998 -91.3008zM173.5 184.7c0 -44.2998 77.5996 -11.9004 77.5996 -38
648
+ c0 -13.1006 -24 -14.2998 -32.6992 -14.2998c-12.3008 0 -29.8008 2.69922 -35.9004 14.8994h-0.900391l-9 -18.3994c14.8008 -9.30078 29.1006 -12.2002 47.2002 -12.2002c19.5 0 51 5.7998 51 31.2002c0 48.0996 -78.5 16.2998 -78.5 37.8994
649
+ c0 13.1006 20.7998 14.9004 29.7998 14.9004c10.8008 0 29.2002 -3.2002 35.6006 -13.1006h0.899414l8.80078 16.9004c-15.1006 6.2002 -27.4004 12 -44.3008 12c-20.0996 0 -49.5996 -6.40039 -49.5996 -31.7998zM52.7998 269.6v-33.5996h-10.7998v33.5996h10.7998z
650
+ M395.2 63.4004v33.5h10.7998v-33.5h-10.7998zM52.7998 140.1v-33.5h-10.7998v33.5h10.7998zM0 444.3h448v-406l-226.3 -98.5996l-221.7 98.5996v406zM418.8 57.2002h0.100586v270.1h-389.7v-270.1l192.8 -85.7002zM418.8 356.5h0.100586v58.5996h-389.7v-58.5996h389.6z
651
+ M52.7998 226.4v-33.5h-10.7998v33.5h10.7998zM52.7998 183.2v-33.5h-10.7998v33.5h10.7998zM170 312.8v-10.5h-33.5v10.5h33.5zM395.2 149.7v33.5h10.7998v-33.5h-10.7998zM395.2 192.9v33.5h10.7998v-33.5h-10.7998zM217 312.8v-10.5h-33.2002v10.5h33.2002zM395.2 236
652
+ v33.5h10.7998v-33.5h-10.7998zM395.2 106.5v33.5h10.7998v-33.5h-10.7998zM264.2 312.8v-10.5h-33.2002v10.5h33.2002zM311.5 312.8v-10.5h-33.5v10.5h33.5zM395.2 279.2l0.0996094 23h-22.7998v10.5h33.5v-33.5h-10.7998zM358.8 312.8v-10.5h-33.5v10.5h33.5z" />
653
+ <glyph glyph-name="simplybuilt" unicode="&#xf215;" horiz-adv-x="512"
654
+ d="M481.2 384c14.7002 0 26.5 -11.7998 26.7002 -26.2998v-331.4c0 -14.5 -11.8008 -26.2998 -26.6006 -26.2998h-450.399c-14.8008 0 -26.6006 11.7998 -26.6006 26.2998v331.4c0 14.5 11.7998 26.2998 26.4004 26.2998h106c14.5996 0 26.5996 -11.7998 26.5996 -26.2998
655
+ v-39.6006h185.3v39.6006c0 14.5 12.1006 26.2998 26.6006 26.2998h106zM149.8 92.2002c36.9004 0 66.6006 29.7002 66.6006 66.3994c0 36.9004 -29.7002 66.6006 -66.6006 66.6006c-36.7002 0 -66.3994 -29.7002 -66.3994 -66.6006
656
+ c0 -36.6992 29.7998 -66.3994 66.3994 -66.3994zM362.2 92.2002c36.5996 0 66.3994 29.7002 66.3994 66.5996c0 36.7002 -29.7998 66.4004 -66.3994 66.4004c-36.9004 0 -66.6006 -29.7998 -66.6006 -66.4004c0 -36.8994 29.7002 -66.5996 66.6006 -66.5996z" />
657
+ <glyph glyph-name="skyatlas" unicode="&#xf216;" horiz-adv-x="640"
658
+ d="M640 118.7c0 -65.9004 -52.5 -114.4 -117.5 -114.4c-165.9 0 -196.6 249.7 -359.7 249.7c-146.899 0 -147.1 -212.2 5.60059 -212.2c42.5 0 90.8994 17.7998 125.3 42.5c5.59961 4.10059 16.8994 16.2998 22.7998 16.2998s10.9004 -5 10.9004 -10.8994
659
+ c0 -7.7998 -13.1006 -19.1006 -18.7002 -24.1006c-40.9004 -35.5996 -100.3 -61.1992 -154.7 -61.1992c-83.4004 -0.100586 -154 59 -154 144.899c0 85.9004 67.5 149.101 152.8 149.101c185.3 0 222.5 -245.9 361.9 -245.9c99.8994 0 94.7998 139.7 3.39941 139.7
660
+ c-17.5 0 -35 -11.6006 -46.8994 -11.6006c-8.40039 0 -15.9004 7.2002 -15.9004 15.6006c0 11.5996 5.2998 23.7002 5.2998 36.2998c0 66.5996 -50.8994 114.7 -116.899 114.7c-53.1006 0 -80 -36.9004 -88.7998 -36.9004c-6.2002 0 -11.2002 5 -11.2002 11.2002
661
+ c0 5.59961 4.09961 10.2998 7.7998 14.4004c25.2998 28.7998 64.7002 43.6992 102.8 43.6992c79.4004 0 139.101 -58.3994 139.101 -137.8c0 -6.89941 -0.300781 -13.7002 -1.2002 -20.5996c11.8994 3.09961 24.0996 4.7002 35.8994 4.7002
662
+ c60.7002 0 111.9 -45.3008 111.9 -107.2z" />
663
+ <glyph glyph-name="pinterest-p" unicode="&#xf231;" horiz-adv-x="384"
664
+ d="M204 441.5c94.2002 0 180 -64.7998 180 -164.1c0 -93.3008 -47.7002 -196.801 -153.9 -196.801c-25.1992 0 -57 12.6006 -69.2998 36c-22.7998 -90.2998 -21 -103.8 -71.3994 -172.8c-5.2002 -1.89941 -3.5 -2.2998 -6.90039 1.5c-1.7998 18.9004 -4.5 37.5 -4.5 56.4004
665
+ c0 61.2002 28.2002 149.7 42 209.1c-7.5 15.2998 -9.59961 33.9004 -9.59961 50.7002c0 80 93.8994 92 93.8994 25.7998c0 -39 -26.3994 -75.5996 -26.3994 -113.399c0 -25.8008 21.2998 -43.8008 46.1992 -43.8008c69 0 90.3008 99.6006 90.3008 152.7
666
+ c0 71.1006 -50.4004 109.8 -118.5 109.8c-79.2002 0 -140.4 -57 -140.4 -137.399c0 -38.7002 23.7002 -58.5 23.7002 -67.7998c0 -7.80078 -5.7002 -35.4004 -15.6006 -35.4004c-24 0 -63.5996 40 -63.5996 110.4c0 110.699 101.4 179.1 204 179.1z" />
667
+ <glyph glyph-name="whatsapp" unicode="&#xf232;"
668
+ d="M380.9 350.9c41.8994 -42 67.0996 -97.7002 67.0996 -157c0 -122.4 -101.8 -222 -224.1 -222h-0.100586c-37.2002 0 -73.7002 9.2998 -106.1 27l-117.7 -30.9004l31.5 115c-19.4004 33.7002 -29.5996 71.9004 -29.5996 111c0 122.4 99.5996 222 222 222
669
+ c59.2998 0 115.1 -23.0996 157 -65.0996zM223.9 9.2998c101.699 0 186.6 82.7998 186.6 184.601c0.0996094 49.2998 -21.2998 95.5996 -56.0996 130.5c-34.8008 34.8994 -81.1006 54.0996 -130.4 54.0996c-101.8 0 -184.6 -82.7998 -184.6 -184.5
670
+ c0 -34.9004 9.69922 -68.7998 28.1992 -98.2002l4.40039 -7l-18.5996 -68.0996l69.7998 18.2998l6.7002 -4c28.2998 -16.7998 60.7998 -25.7002 94 -25.7002zM325.1 147.5c5.5 -2.7002 9.2002 -4.09961 10.5 -6.59961c1.40039 -2.30078 1.40039 -13.4004 -3.19922 -26.4004
671
+ c-4.60059 -13 -26.7002 -24.7998 -37.4004 -26.4004c-17.5996 -2.59961 -31.4004 -1.2998 -66.5996 13.9004c-55.7002 24.0996 -92 80.0996 -94.8008 83.7998c-2.69922 3.7002 -22.5996 30.1006 -22.5996 57.4004s14.2998 40.7002 19.4004 46.2998
672
+ c5.09961 5.5 11.0996 6.90039 14.7998 6.90039s7.39941 0 10.5996 -0.200195c3.40039 -0.200195 8 1.2998 12.5 -9.5c4.60059 -11.1006 15.7002 -38.4004 17.1006 -41.2002c1.39941 -2.7998 2.2998 -6 0.5 -9.7002c-10.6006 -21.2002 -22 -20.5 -16.3008 -30.2998
673
+ c21.5 -36.9004 42.9004 -49.7002 75.5 -66c5.5 -2.7998 8.80078 -2.2998 12 1.40039c3.30078 3.7998 13.9004 16.1992 17.6006 21.7998c3.7002 5.59961 7.39941 4.7002 12.5 2.7998c5.09961 -1.7998 32.3994 -15.2002 37.8994 -18z" />
674
+ <glyph glyph-name="viacoin" unicode="&#xf237;" horiz-adv-x="384"
675
+ d="M384 416l-48 -112h48v-48h-68.5l-13.7998 -32h82.2998v-48h-102.8l-89.2002 -208l-89.2002 208h-102.8v48h82.2998l-13.7998 32h-68.5v48h48l-48 112h64l80.7998 -192h94.5l80.7002 192h64zM192 112l27 64h-54z" />
676
+ <glyph glyph-name="medium" unicode="&#xf23a;"
677
+ d="M0 416h448v-448h-448v448zM372.2 309.9v5h-83.2002l-59.2998 -147.9l-67.4004 148h-87.2998v-5.09961l28.0996 -33.9004c2.80078 -2.5 4.2002 -6.09961 3.80078 -9.7998v-133c0.799805 -4.7998 -0.700195 -9.7002 -4.10059 -13.2002l-31.5996 -38.2998v-5.10059h89.7998
678
+ v5.10059l-31.5996 38.2998c-3.40039 3.5 -5.10059 8.40039 -4.40039 13.2002v115l78.7002 -171.601h9.09961l67.6006 171.601v-136.9c0 -3.59961 0 -4.2998 -2.40039 -6.7002l-24.2998 -23.5996v-4.90039h118v5.10059l-23.5 23
679
+ c-2.10059 1.5 -3.10059 4.09961 -2.7002 6.7002v169.3c-0.400391 2.5 0.599609 5.09961 2.7002 6.7002z" />
680
+ <glyph glyph-name="y-combinator" unicode="&#xf23b;"
681
+ d="M448 416v-448h-448v448h448zM236 160.5l77.5 145.5h-32.7002l-45.7998 -91c-4.7002 -9.2998 -9 -18.2998 -12.7998 -26.7998l-12.2002 26.7998l-45.2002 91h-35l76.7002 -143.8v-94.5h29.5v92.7998z" />
682
+ <glyph glyph-name="optin-monster" unicode="&#xf23c;" horiz-adv-x="576"
683
+ d="M572.6 26.5996c1 -3.5 1.90039 -7 1.7002 -10.6992c0.799805 -31.6006 -44.2998 -64 -73.5 -65.1006c-17.2998 -0.799805 -34.5996 8.40039 -42.7002 23.5c-113.5 -4.09961 -227 -4.89941 -340.199 0c-8.40039 -15.0996 -25.7002 -24 -43 -23.5
684
+ c-28.9004 1.10059 -74 33.5 -73.5 65.1006c0.299805 3.7998 0.799805 7.2998 1.89941 10.7998c-5.59961 9.39941 -4.7998 15.2998 5.40039 11.5996c3.2998 5.2002 7 9.5 11.0996 13.7998c-2.5 10.9004 1.2998 14.1006 11.1006 9.2002c4.5 3.2998 10 6.5 15.8994 9.2002
685
+ c0 15.7998 11.7998 11.2002 17.2998 5.7002c12.5 1.7998 20.2002 -0.700195 26.8008 -5.7002v19.7002c-12.9004 0 -40.6006 11.3994 -45.9004 36.2002c-5 20.7998 2.59961 38.0996 25.0996 47.5996c0.800781 5.90039 8.10059 14 14.9004 15.9004
686
+ c7.59961 1.89941 12.5 -4.60059 14.0996 -10.3008c7.40039 0 17.8008 -1.5 21.1006 -8.09961c5.39941 0.5 11.0996 1.40039 16.5 1.90039c-2.40039 1.89941 -5.10059 3.5 -8.10059 4.59961c-5.09961 8.90039 -13.7998 11.0996 -24.5996 11.5996
687
+ c0 0.800781 0 1.60059 0.299805 2.7002c-19.7998 0.5 -44.0996 5.60059 -54.8994 17.7998c-21.3008 23.6006 -15.9004 83.6006 12.1992 103.5c8.40039 5.7002 21.6006 0.800781 22.7002 -9.69922c2.40039 -20.6006 0.400391 -26.8008 26.2002 -25.9004
688
+ c8.09961 7.7998 16.7998 14.5996 26.5 20c-14.9004 1.2998 -28.9004 -1.59961 -43.7998 -3.7998c12.7002 12.5 23.8994 25.3994 56.7002 42.3994c23.5 11.9004 50 20.8008 76.1992 23.2002c-18.5996 7.90039 -40 11.9004 -59.6992 16.5
689
+ c76.5 16.2002 174.6 22.1006 244.199 -37.5996c18.1006 -15.4004 32.4004 -36.2002 42.7002 -60c39.7998 -4.90039 36.4004 5.5 38.6006 25.0996c1.09961 10.2998 14.2998 15.4004 22.6992 9.5c14.9004 -10.5 22.2002 -30.7998 24.6006 -48.0996
690
+ c2.2002 -17.7998 0.299805 -41.2998 -12.4004 -55.1006c-10.7998 -12.1992 -34.2998 -17.5996 -53.7998 -18.0996v-2.7998c-11.0996 -0.200195 -20.2998 -2.40039 -25.7002 -11.6006c-3 -1.09961 -5.7002 -2.69922 -8.39941 -4.59961
691
+ c5.69922 -0.5 11.3994 -1.40039 16.7998 -1.90039c1.89941 5.60059 12.5996 8.40039 21.0996 8.40039c1.7002 5.40039 6.7998 11.9004 14.1006 10.2998c7.2998 -1.59961 14.0996 -10 14.8994 -15.8994c10.7998 -4.40039 22.1006 -12.2002 25.1006 -25.7002
692
+ c1.89941 -8.10059 1.69922 -15.1006 0.299805 -21.9004c-5.7002 -25.2002 -33.2998 -36.2002 -45.9004 -36.2002c0 -6.69922 0 -13.1992 -0.299805 -19.6992c8.09961 6 16.4004 7.19922 26.7998 5.69922c6 5.90039 17.6006 9.40039 17.6006 -5.69922
693
+ c5.59961 -2.7002 11.2998 -6 15.8994 -9.2002c10.1006 5 13.7002 0.5 10.7998 -9.2002c4.10059 -4.2998 8.10059 -8.90039 11.1006 -13.7998c10.0996 3.59961 11 -2.10059 5.39941 -11.6006zM498.8 280.6c17.2998 -6.69922 26.2002 -22.0996 30.2998 -35.6992
694
+ c1.10059 10.5996 -2.69922 39.5 -13.7998 51.0996c-7.2998 7.2998 -14.0996 5.09961 -14.0996 -0.799805c0 -6.2002 -1.2998 -11.6006 -2.40039 -14.6006zM494.2 273.9c-3.2002 -3.30078 -9.2002 -4.90039 -14.1006 -5.7002c13 -15.7002 17 -41.7002 12.7002 -63
695
+ c10.7998 2.2002 20.5 6.2998 26.2002 12.2002c1.90039 2.19922 3.7998 4.89941 4.90039 7.59961c-1.10059 21.2998 -10.2002 42.7002 -29.7002 48.9004zM470.1 267.1c-3.69922 0 -8.09961 0 -11.7998 0.300781c7.5 -20.6006 12.4004 -42.7002 14.2998 -64.6006
696
+ c3.5 0 7.5 0.299805 11.6006 0.799805c5.89941 24.3008 -0.299805 51.6006 -14.1006 63.5zM47.5 245c4.09961 13.5 13 28.9004 30.2998 35.7002c-1 3 -2.39941 8.39941 -2.39941 14.5996c0 5.90039 -7.10059 8.10059 -14.1006 0.799805
697
+ c-11.3994 -11.5996 -14.8994 -40.5996 -13.7998 -51.0996zM57.2002 217.4c5.7002 -6.2002 15.3994 -10 26.2002 -12.2002c-4.30078 21.3994 -0.300781 47.2998 12.6992 63c-4.89941 0.799805 -10.8994 2.5 -14.0996 5.7002
698
+ c-19.4004 -6.2002 -28.2998 -27.6006 -29.7002 -48.9004c1.40039 -2.7002 3 -5.40039 4.90039 -7.59961zM105.1 202.8c2.40039 22.2002 9.10059 43.7998 19.8008 63.5c-5.2002 -1.09961 -10 -3 -14.9004 -4.89941l-12.2002 -5.10059v0.299805
699
+ c-7.2998 -14.0996 -10 -34.3994 -5.39941 -53c4.59961 -0.5 8.59961 -0.799805 12.6992 -0.799805zM289.1 365.5c-41.8994 0 -76.1992 -34.0996 -76.1992 -75.9004c0 -42.1992 34.2998 -76.1992 76.1992 -76.1992c41.9004 0 76.2002 34 76.2002 76.1992
700
+ c0 41.9004 -34.2998 75.9004 -76.2002 75.9004zM404.7 191.2c-12.9004 0.799805 -26.2002 0.799805 -39.5 1.09961c10 -50.5996 3.2998 -64.7002 16.5 -58.0996c16 8.09961 22.7002 39.2002 23 57zM350.7 192.8c-18.9004 0.299805 -38.1006 0.299805 -57 0v0.299805
701
+ c-0.299805 -5.19922 0.200195 -38.0996 4.2998 -41.0996c11.0996 -5.40039 39.5 -4.59961 51.0996 -1.09961c5.40039 1.59961 2.40039 37 1.60059 41.8994zM278.3 139c4.60059 2.5 2.40039 45.4004 1.2998 53.7002v0.299805
702
+ c-19.3994 -0.299805 -38.5996 -0.299805 -57.7998 -0.799805c-1.89941 -9.2002 -4.59961 -48.9004 1.90039 -51.6006c13 -5.69922 41.5996 -5.09961 54.5996 -1.59961zM171.8 190.1c-5.39941 -19.6992 0.299805 -45.0996 22.2002 -54.8994
703
+ c5.40039 -2.5 8.59961 -2.5 9.7002 4.2998c1.89941 8.7002 2.5 36.7998 4.89941 52.2002c-12.1992 -0.200195 -24.5996 -0.799805 -36.7998 -1.60059zM136.4 158.8c2.39941 -3.7002 1.59961 -9.09961 -8 -12.5c43.7998 -47 92.6992 -85.7002 155.899 -106.5
704
+ c67.5 19.2002 115.601 60 163.2 107c-11.0996 4.2998 -7.7002 10.2998 -7.2998 11.6006c-8.90039 0.799805 -17.9004 1.89941 -26.5 2.69922c-9.5 -33 -36 -52.8994 -46.7998 -31.5996c-2.7002 5.2002 -3.5 11.7002 -4.60059 16.7998
705
+ c-3.7998 -8.39941 -13.2998 -8.09961 -24.5996 -8.89941c-13.2002 -1.10059 -31.6006 -1.30078 -44 3c-3 -12.9004 -11.1006 -12.9004 -26.7998 -14.3008c-14.1006 -1.39941 -48.7002 -4.09961 -54.9004 10.8008c-1.09961 -28.7002 -35.0996 -10 -45.0996 7
706
+ c-3.2002 5.69922 -5.40039 11.3994 -7 17.5996c-7.80078 -0.799805 -15.7002 -1.59961 -23.5 -2.7002zM114.8 -13.7002c0.5 2.5 0.799805 5.2002 0.799805 8.2002c-5.69922 23.2002 -18.5996 49.7002 -33.5 54c-22.3994 6.7002 -68.8994 -23.5 -66.1992 -54.5996
707
+ c12.6992 -19.5 40 -35.7002 59.1992 -36.5c17.8008 -0.800781 35.9004 11.0996 39.7002 28.8994zM106.1 52.2998c9 -16 15.5 -33.2998 16.7002 -51.8994c33.5 19.3994 69.1006 35.6992 105.9 47c-38.7002 20.5 -68.1006 47.7998 -97.2998 77
708
+ c-2.10059 -1.30078 -5.10059 -2.40039 -7.80078 -3.5c-1.59961 -4.90039 8.7002 -5.30078 5.40039 -12.4004c-2.09961 -4.09961 -8.59961 -7.59961 -15.0996 -9.2002c-2.10059 -2.7002 -5.10059 -4.89941 -7.80078 -6.5h-0.299805
709
+ c-0.200195 -13.5 -0.200195 -27 0.299805 -40.5zM443.7 -12.2998c-36.7998 21.2998 -74.1006 41.2998 -115.601 53c-13.7998 -6.2002 -27.8994 -11.2998 -42.1992 -15.4004c-2.10059 -0.799805 -2.10059 -0.799805 -4.30078 0
710
+ c-11.8994 3.7002 -23.2998 8.10059 -34.8994 13.2002c-40.2002 -11.5996 -77.2998 -29.2002 -112.4 -50.7998h-0.299805v-0.299805c0.299805 0 0.299805 0 0.299805 0.299805c103.2 -4.10059 206.4 -3.5 309.4 0zM454.2 0.0996094c1 14.7002 7.2002 35.8008 16.5 51.7002
711
+ l-0.299805 -0.299805c0.5 13.7002 0.799805 27.5 0.799805 41.2998c-3 1.7002 -5.7002 4.10059 -8.10059 6.7998c-6.5 1.30078 -12.8994 5.10059 -15.0996 8.90039c-1.90039 4.09961 1.2998 7.59961 5.90039 10.2998c-0.200195 0.5 -0.5 1.60059 -0.5 2.40039
712
+ c-3 0.799805 -5.40039 1.7998 -7.60059 3.2002c-31.5996 -29.4004 -65.3994 -56.7002 -103.5 -76.7002c38.9004 -11.7002 76 -28.1006 111.9 -47.6006zM560.1 -6.09961c3 31.0996 -43.5 61.3994 -66.1992 54.5c-14.6006 -4.30078 -27.8008 -30.8008 -33.5 -54
713
+ c0 -23.8008 21.1992 -37.9004 40.5 -37c19.1992 0.799805 46.5 17 59.1992 36.5zM372.9 372.8c-35.7002 39.2002 -81.4004 47.7998 -126 23.5c25.1992 56.2002 122.199 48.6006 126 -23.5zM74.7998 40.9004c14.9004 1.89941 24.6006 -19.2002 18.6006 -30.8008
714
+ c-4.80078 -9.69922 -23.7002 -24.0996 -35.9004 -27.2998c-16.5 -4.59961 -32.2002 3.2998 -32.2002 14.9004c0 17.7998 33.7998 41.5996 49.5 43.2002zM290.7 217.1c-30.9004 0 -57.6006 25.7002 -50.2998 59.8008c13.1992 -20.7002 46.5 -12 46.5 11.2998
715
+ c0 10 -7 18.5996 -16.5 21.5996c31.6992 13.7998 72.1992 -8.2002 72.1992 -44.2998c0 -26.7998 -23.2998 -48.4004 -51.8994 -48.4004zM68 -26.0996c-0.5 8.39941 20.2998 23.5 29.2002 25.0996c8.59961 1.59961 12.7002 -11.4004 9.7002 -18.4004
716
+ c-2.7002 -5.69922 -10.5 -13.5 -17.3008 -16.1992c-9.39941 -3.2002 -21.0996 3 -21.5996 9.5zM501.2 40.9004c15.7002 -1.60059 49.5 -25.4004 49.5 -43.2002c0 -11.7002 -15.7002 -19.5 -32.2002 -14.9004c-12.0996 3.2002 -31.2998 17.6006 -36.2002 27.2998
717
+ c-5.7002 11.6006 4 32.7002 18.9004 30.8008zM478.8 -1c8.90039 -1.59961 30 -16.7002 29.1006 -25.0996c-0.200195 -6.5 -12.1006 -12.7002 -21.3008 -9.5c-7 2.69922 -14.8994 10.5 -17.2998 16.1992c-2.89941 7.10059 1.10059 20 9.5 18.4004z" />
718
+ <glyph glyph-name="opencart" unicode="&#xf23d;" horiz-adv-x="639"
719
+ d="M423.3 7.2998c0 -25.2998 -20.2998 -45.5996 -45.5996 -45.5996s-45.7998 20.2998 -45.7998 45.5996s20.5996 45.7998 45.7998 45.7998c25.3994 0 45.5996 -20.5 45.5996 -45.7998zM169.4 53.0996c25.2998 0 45.7998 -20.5 45.7998 -45.7998
720
+ s-20.5 -45.5996 -45.7998 -45.5996c-25.3008 0 -45.6006 20.3994 -45.6006 45.5996s20.2998 45.7998 45.6006 45.7998zM461.1 323.1c302.2 0 169.5 -67.1992 -17.1992 -233.899c59.1992 102.8 262.5 193.899 -70.8008 188.899c-319.8 -4.69922 -338.699 92.5 -373.1 144.2
721
+ c81.9004 -86.3994 158.9 -99.2002 461.1 -99.2002z" />
722
+ <glyph glyph-name="expeditedssl" unicode="&#xf23e;" horiz-adv-x="496"
723
+ d="M248 404.6c117.4 0 212.6 -95.1992 212.6 -212.6s-95.1992 -212.6 -212.6 -212.6s-212.6 95.1992 -212.6 212.6s95.1992 212.6 212.6 212.6zM150.6 271.7h-0.199219v-26.6006c0 -5 3.89941 -8.89941 8.89941 -8.89941h17.7002c5 0 8.90039 3.89941 8.90039 8.89941
724
+ v26.6006c0 82.0996 124 82.0996 124 0v-26.6006c0 -5 3.89941 -8.89941 8.89941 -8.89941h17.7002c5 0 8.90039 3.89941 8.90039 8.89941v26.6006c0 53.7002 -43.7002 97.3994 -97.4004 97.3994s-97.4004 -43.6992 -97.4004 -97.3994zM389.7 68v141.7
725
+ c0 9.7002 -8 17.7002 -17.7002 17.7002h-248c-9.7002 0 -17.7002 -8 -17.7002 -17.7002v-141.7c0 -9.7002 8 -17.7002 17.7002 -17.7002h248c9.7002 0 17.7002 8 17.7002 17.7002zM141.7 205.3v-132.899c0 -2.5 -1.90039 -4.40039 -4.40039 -4.40039h-8.89941
726
+ c-2.5 0 -4.40039 1.90039 -4.40039 4.40039v132.899c0 2.5 1.90039 4.40039 4.40039 4.40039h8.89941c2.5 0 4.40039 -1.90039 4.40039 -4.40039zM283.4 156.6c0 -13 -7.2002 -24.3994 -17.7002 -30.3994v-31.6006c0 -5 -3.90039 -8.89941 -8.90039 -8.89941h-17.7002
727
+ c-5 0 -8.89941 3.89941 -8.89941 8.89941v31.6006c-10.5 6.09961 -17.7002 17.3994 -17.7002 30.3994c0 19.7002 15.7998 35.4004 35.4004 35.4004c19.5996 0 35.5 -15.7998 35.5 -35.4004zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248
728
+ s111 248 248 248zM248 -38.2998c127 0 230.3 103.3 230.3 230.3s-103.3 230.3 -230.3 230.3s-230.3 -103.3 -230.3 -230.3s103.3 -230.3 230.3 -230.3z" />
729
+ <glyph glyph-name="cc-jcb" unicode="&#xf24b;" horiz-adv-x="576"
730
+ d="M431.5 203.7v32.2998c41.2002 0 38.5 -0.200195 38.5 -0.200195c7.2998 -1.2998 13.2998 -7.2998 13.2998 -16c0 -8.7998 -6 -14.5 -13.2998 -15.7998c-1.2002 -0.400391 -3.2998 -0.299805 -38.5 -0.299805zM474.3 183.5c7.5 -1.5 13.5 -8.2998 13.5 -17
731
+ c0 -9 -6 -15.5 -13.5 -17c-2.7998 -0.700195 -3.2002 -0.5 -42.7998 -0.5v35c39.5 0 40 0.200195 42.7998 -0.5zM576 368v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480c26.5 0 48 -21.5 48 -48zM182 255.7h-57
732
+ c0 -67.1006 10.7002 -109.7 -35.7998 -109.7c-19.5 0 -38.7998 5.7002 -57.2002 14.7998v-28c30 -8.2998 68 -8.2998 68 -8.2998c97.9004 0 82 47.7002 82 131.2zM360.5 251.2c-63.4004 16 -165 14.8994 -165 -59.2998c0 -77.1006 108.2 -73.6006 165 -59.2002v28.2998
733
+ c-47.5996 -24.7002 -107.5 -22 -107.5 31s59.7998 55.5996 107.5 31.2002v28zM544 161.5c0 18.5 -16.5 30.5 -38 32v0.799805c19.5 2.7002 30.2998 15.5 30.2998 30.2002c0 19 -15.7002 30 -37 31c0 0 6.2998 0.299805 -120.3 0.299805v-127.5h122.7
734
+ c24.2998 -0.0996094 42.2998 12.9004 42.2998 33.2002z" />
735
+ <glyph glyph-name="cc-diners-club" unicode="&#xf24c;" horiz-adv-x="576"
736
+ d="M239.7 368.1c97.2002 0 175.8 -78.5996 175.8 -175.8c0 -96.8994 -78.5996 -175.8 -175.8 -175.8c-96.9004 0 -175.8 78.9004 -175.8 175.8c0 97.2002 78.8994 175.8 175.8 175.8zM199.8 88.5v207.9c-41.7002 -16.2002 -71.3994 -56.7002 -71.3994 -104.101
737
+ c0 -47.3994 29.6992 -87.8994 71.3994 -103.8zM279.6 88.2002c41.7002 16.2002 71.4004 56.7002 71.4004 104.1c0 47.4004 -29.7002 87.9004 -71.4004 104.101v-208.2zM528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352
738
+ c0 26.5 21.5 48 48 48h480zM329.7 0c105 0 200.7 85.5 200.7 190.2c0 114.6 -95.7002 193.8 -200.7 193.8h-90.2998c-106.2 0 -193.801 -79.2002 -193.801 -193.8c0 -104.7 87.6006 -190.2 193.801 -190.2h90.2998z" />
739
+ <glyph glyph-name="creative-commons" unicode="&#xf25e;" horiz-adv-x="496"
740
+ d="M245.83 233.13l-33.2197 -17.2803c-9.43066 19.5801 -25.2402 19.9307 -27.46 19.9307c-22.1309 0 -33.2207 -14.6104 -33.2207 -43.8398c0 -23.5703 9.20996 -43.8408 33.2207 -43.8408c14.4697 0 24.6494 7.09082 30.5693 21.2607l30.5498 -15.5
741
+ c-6.16992 -11.5107 -25.6895 -38.9805 -65.0996 -38.9805c-22.5996 0 -73.96 10.3203 -73.96 77.0498c0 58.6904 43 77.0605 72.6299 77.0605c30.7197 0.00976562 52.7002 -11.9502 65.9902 -35.8604zM388.88 233.13l-32.7803 -17.2803
742
+ c-9.5 19.7705 -25.7197 19.9307 -27.8994 19.9307c-22.1406 0 -33.2197 -14.6104 -33.2197 -43.8398c0 -23.5508 9.22949 -43.8408 33.2197 -43.8408c14.4502 0 24.6494 7.09082 30.54 21.2607l31 -15.5c-2.10059 -3.75 -21.3906 -38.9805 -65.0898 -38.9805
743
+ c-22.6904 0 -73.96 9.87012 -73.96 77.0498c0 58.6699 42.9697 77.0605 72.6299 77.0605c30.71 0.00976562 52.5801 -11.9502 65.5596 -35.8604zM247.56 439.95c141.82 0 248.44 -110.13 248.44 -248c0 -147.13 -118.51 -248 -248.44 -248
744
+ c-133.96 0 -247.56 109.51 -247.56 248c0 132.939 104.74 248 247.56 248zM248.43 -10.8604c103.16 0 202.83 81.1299 202.84 202.82c0 113.8 -90.2891 203.26 -202.819 203.26c-118.29 0 -203.72 -97.8496 -203.72 -203.27c0 -109.771 91.1592 -202.811 203.699 -202.811z
745
+ " />
746
+ <glyph glyph-name="gg" unicode="&#xf260;" horiz-adv-x="512"
747
+ d="M179.2 217.6l102.399 -102.399l-102.399 -102.4l-179.2 179.2l179.2 179.2l44.7998 -44.7998l-25.5996 -25.6006l-19.2002 19.2002l-128 -128l128 -128l51.5 51.5l-77.1006 76.5zM332.8 371.2l179.2 -179.2l-179.2 -179.2l-44.7998 44.7998l25.5996 25.6006
748
+ l19.2002 -19.2002l128 128l-128 128l-51.5 -51.5l77.1006 -76.5l-25.6006 -25.5996l-102.399 102.399z" />
749
+ <glyph glyph-name="gg-circle" unicode="&#xf261;" horiz-adv-x="514"
750
+ d="M257 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM207.5 65.2002l75 75.2002l-77.2002 77.1992l-24.3994 -24.3994l53.0996 -52.9004l-26.5996 -26.5996l-77.2002 77.2002l77.2002 77.1992l11.0996 -11.0996l24.2002 24.2002
751
+ l-35.2002 35.3994l-125.7 -125.699zM306.5 67.4004l125.7 125.6l-125.7 125.7l-75 -75l77.2002 -77.2002l24.3994 24.4004l-53.0996 52.8994l26.5 26.5l77.2002 -77.2002l-77.2002 -77.1992l-11.0996 11.0996l-24.1006 -24.4004z" />
752
+ <glyph glyph-name="tripadvisor" unicode="&#xf262;" horiz-adv-x="576"
753
+ d="M166.4 167.479c0 -13.2354 -10.7305 -23.9658 -23.9668 -23.9658c-13.2354 0 -23.9658 10.7305 -23.9658 23.9658c0 13.2363 10.7305 23.9668 23.9658 23.9668c13.2363 0 23.9668 -10.7295 23.9668 -23.9668zM431.362 191.435
754
+ c13.2295 0 23.9551 -10.7246 23.9561 -23.9561c0 -13.2305 -10.7266 -23.9551 -23.9561 -23.9551c-13.2314 0 -23.9561 10.7256 -23.9561 23.9551c0 13.2314 10.7256 23.9561 23.9561 23.9561zM520.75 51.9453c-62.667 -49.1045 -153.276 -38.1094 -202.379 24.5586
755
+ l-30.9795 -46.3252l-30.6826 45.9395c-48.2773 -60.3906 -135.622 -71.8916 -197.885 -26.0547c-64.0586 47.1572 -77.7588 137.315 -30.6016 201.373c-5.05762 17.1221 -17.7021 42.7236 -28.2227 57.1475l90.2861 0.0498047
756
+ c48.0039 29.8701 132.851 54.1123 189.389 54.1123c2.11914 0 5.55762 -0.0371094 7.67578 -0.0820312c1.72363 0.0302734 4.52246 0.0556641 6.24609 0.0556641c55.5518 0 138.851 -23.9258 185.936 -53.4043l96.2178 -0.0742188
757
+ c-10.6191 -14.5371 -23.3213 -40.3643 -28.3516 -57.6494c46.793 -62.7471 34.9639 -151.37 -26.6484 -199.646zM259.366 166.239c-0.00683594 63.5566 -51.5352 115.075 -115.092 115.067c-63.5576 -0.00683594 -115.074 -51.5342 -115.068 -115.092
758
+ c0.00683594 -63.5566 51.5352 -115.075 115.092 -115.067c63.5127 0.0742188 114.984 51.5381 115.068 115.052v0.0400391zM287.957 176.694c5.43262 73.4395 65.5098 130.884 139.12 133.021c-35.5576 15.374 -95.8555 27.8506 -134.594 27.8506
759
+ c-1.41699 0 -3.7168 -0.0166016 -5.13379 -0.0380859c-0.953125 0.00878906 -2.50098 0.0166016 -3.45508 0.0166016c-39.2324 0 -100.479 -12.2168 -136.709 -27.2695c74.3447 -1.58203 135.3 -59.4248 140.771 -133.581zM539.663 205.461
760
+ c-21.9922 59.6338 -88.1621 90.1484 -147.795 68.1572c-59.6338 -21.9922 -90.1484 -88.1621 -68.1572 -147.795v-0.0322266c22.0381 -59.6074 88.1982 -90.0908 147.827 -68.1133c59.6152 22.0039 90.1133 88.1621 68.125 147.783zM213.624 167.486v-0.115234
761
+ c-0.0566406 -39.3281 -31.9863 -71.1631 -71.3145 -71.1064c-39.3271 0.0576172 -71.1621 31.9863 -71.1055 71.3145s31.9863 71.1631 71.3135 71.1055c39.2598 -0.115234 71.042 -31.9395 71.1064 -71.1982zM189.112 167.486v0.0839844
762
+ c-0.0517578 25.7832 -20.9941 46.6445 -46.7783 46.5938s-46.6445 -20.9941 -46.5938 -46.7773c0.0507812 -25.7842 20.9941 -46.6445 46.7764 -46.5938c25.7266 0.113281 46.5371 20.9678 46.5957 46.6934zM502.535 167.486
763
+ c-0.0205078 -39.3281 -31.918 -71.2422 -71.2471 -71.2217c-39.3291 0.0214844 -71.1943 31.918 -71.1729 71.2471c0.0195312 39.3281 31.918 71.1943 71.2471 71.1729c39.29 -0.0654297 71.1211 -31.9082 71.1729 -71.1982zM478.031 167.494
764
+ c-0.00878906 25.7842 -20.918 46.6787 -46.7021 46.6699s-46.6787 -20.918 -46.6699 -46.7021s20.918 -46.6777 46.7021 -46.6699c25.7646 0.0458984 46.6357 20.9277 46.6699 46.6934v0.00878906z" />
765
+ <glyph glyph-name="odnoklassniki" unicode="&#xf263;" horiz-adv-x="320"
766
+ d="M275.1 114c-27.3994 -17.4004 -65.0996 -24.2998 -90 -26.9004l20.9004 -20.5996l76.2998 -76.2998c27.9004 -28.6006 -17.5 -73.2998 -45.7002 -45.7002c-19.0996 19.4004 -47.0996 47.4004 -76.2998 76.5996l-76.2998 -76.5
767
+ c-28.2002 -27.5 -73.5996 17.6006 -45.4004 45.7002c19.4004 19.4004 47.1006 47.4004 76.3008 76.2998l20.5996 20.6006c-24.5996 2.59961 -62.9004 9.09961 -90.5996 26.8994c-32.6006 21 -46.9004 33.3008 -34.3008 59c7.40039 14.6006 27.7002 26.9004 54.6006 5.7002
768
+ c0 0 36.2998 -28.8994 94.8994 -28.8994c58.6006 0 94.9004 28.8994 94.9004 28.8994c26.9004 21.1006 47.0996 8.90039 54.5996 -5.7002c12.4004 -25.6992 -1.89941 -38 -34.5 -59.0996zM30.2998 318.3c0 71.7002 58.2998 129.7 129.7 129.7s129.7 -58 129.7 -129.7
769
+ c0 -71.3994 -58.2998 -129.399 -129.7 -129.399s-129.7 58 -129.7 129.399zM96.2998 318.3c0 -35.0996 28.6006 -63.7002 63.7002 -63.7002s63.7002 28.6006 63.7002 63.7002c0 35.4004 -28.6006 64 -63.7002 64s-63.7002 -28.5996 -63.7002 -64z" />
770
+ <glyph glyph-name="odnoklassniki-square" unicode="&#xf264;"
771
+ d="M184.2 270.9c0 22.0996 17.8994 40 39.7998 40s39.7998 -17.9004 39.7998 -40c0 -22 -17.8994 -39.8008 -39.7998 -39.8008s-39.7998 17.9004 -39.7998 39.8008zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
772
+ c26.5 0 48 -21.5 48 -48zM142.9 270.9c0 -44.6006 36.3994 -80.9004 81.0996 -80.9004s81.0996 36.2002 81.0996 80.9004c0 44.7998 -36.3994 81.0996 -81.0996 81.0996s-81.0996 -36.2002 -81.0996 -81.0996zM317.4 180.2
773
+ c-4.60059 9.09961 -17.3008 16.7998 -34.1006 3.59961c0 0 -22.7002 -18 -59.2998 -18s-59.2998 18 -59.2998 18c-16.7998 13.2002 -29.5 5.5 -34.1006 -3.59961c-7.89941 -16.1006 1.10059 -23.7002 21.4004 -37c17.2998 -11.1006 41.2002 -15.2002 56.5996 -16.7998
774
+ l-12.8994 -12.9004c-18.2002 -18 -35.5 -35.5 -47.7002 -47.7002c-17.5996 -17.5996 10.7002 -45.7998 28.4004 -28.5996l47.6992 47.8994c18.2002 -18.1992 35.7002 -35.6992 47.7002 -47.8994c17.6006 -17.2002 46 10.7002 28.6006 28.5996l-47.7002 47.7002l-13 12.9004
775
+ c15.5 1.59961 39.0996 5.89941 56.2002 16.7998c20.3994 13.2998 29.2998 21 21.5 37z" />
776
+ <glyph glyph-name="get-pocket" unicode="&#xf265;"
777
+ d="M407.6 384c22.7002 0 40.4004 -18.2002 40.4004 -40.5996v-135.2c0 -124.7 -99.7998 -224.2 -223.8 -224.2c-124.5 0 -224.2 99.5 -224.2 224.2v135.2c0 22.0996 18.5 40.5996 40.5996 40.5996h367zM245.6 115.5c111.9 107.5 114.801 105.4 114.801 123.2
778
+ c0 16.8994 -13.8008 30.7002 -30.7002 30.7002c-16.9004 0 -14.9004 -2.40039 -105.5 -89.3008c-89.1006 85.5 -88.2002 89.3008 -105.2 89.3008c-16.9004 0 -30.7002 -13.8008 -30.7002 -30.7002c0 -18.1006 1.2002 -14.2998 114.9 -123.2
779
+ c11 -11.0996 30 -11.7998 42.3994 0z" />
780
+ <glyph glyph-name="wikipedia-w" unicode="&#xf266;" horiz-adv-x="640"
781
+ d="M640 396.8l-0.299805 -12.2002c-28.1006 -0.799805 -45 -15.7998 -55.7998 -40.2998c-25 -57.7998 -103.301 -240 -155.301 -358.6h-13.5996l-81.9004 193.1c-32.5 -63.5996 -68.2998 -130 -99.1992 -193.1c-0.300781 -0.299805 -15 0 -15 0.299805
782
+ c-46.9004 109.7 -96.1006 218.6 -143.101 328.6c-11.3994 26.7002 -49.3994 70 -75.5996 69.7002c0 3.10059 -0.299805 10 -0.299805 14.2002h161.899v-13.9004c-19.2002 -1.09961 -52.7998 -13.2998 -43.2998 -34.1992c21.9004 -49.7002 103.6 -240.301 125.6 -288.601
783
+ c15 29.7002 57.8008 109.2 75.3008 142.8c-13.9004 28.3008 -58.6006 133.9 -72.8008 160c-9.69922 17.8008 -36.0996 19.4004 -55.7998 19.7002v13.9004l142.5 -0.299805v-13.1006c-19.3994 -0.599609 -38.0996 -7.7998 -29.3994 -26.0996
784
+ c18.8994 -40 30.5996 -68.1006 48.0996 -104.7c5.59961 10.7998 34.7002 69.4004 48.0996 100.8c8.90039 20.6006 -3.89941 28.6006 -38.5996 29.4004c0.299805 3.59961 0 10.2998 0.299805 13.5996c44.4004 0.299805 111.101 0.299805 123.101 0.600586v-13.6006
785
+ c-22.5 -0.799805 -45.8008 -12.7998 -58.1006 -31.7002l-59.2002 -122.8c6.40039 -16.0996 63.3008 -142.8 69.2002 -156.7l122.4 282.601c-8.60059 23.0996 -36.4004 28.0996 -47.2002 28.2998v13.9004l127.8 -1.10059z" />
786
+ <glyph glyph-name="safari" unicode="&#xf267;" horiz-adv-x="512"
787
+ d="M236.9 191.2c0 9.09961 6.59961 17.7002 16.2998 17.7002c8.89941 0 17.3994 -6.40039 17.3994 -16.1006c0 -9.09961 -6.39941 -17.7002 -16.0996 -17.7002c-9 0 -17.5996 6.7002 -17.5996 16.1006zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248
788
+ s111 248 248 248s248 -111 248 -248zM477.4 192c0 122.3 -99.1006 221.4 -221.4 221.4s-221.4 -99.1006 -221.4 -221.4s99.1006 -221.4 221.4 -221.4s221.4 99.1006 221.4 221.4zM404.9 95.4004c0 -3.60059 13 -10.2002 16.2998 -12.2002
789
+ c-27.4004 -41.5 -69.7998 -71.4004 -117.9 -83.2998l-4.39941 18.5c-0.300781 2.5 -1.90039 2.7998 -4.2002 2.7998c-1.90039 0 -3 -2.7998 -2.7998 -4.2002l4.39941 -18.7998c-13.2998 -2.7998 -26.7998 -4.2002 -40.3994 -4.2002c-36.3008 0 -72 10.2002 -103 29.0996
790
+ c1.69922 2.80078 12.1992 18 12.1992 20.2002c0 1.90039 -1.69922 3.60059 -3.59961 3.60059c-3.90039 0 -12.2002 -16.6006 -14.7002 -19.9004c-41.7998 27.7002 -72 70.5996 -83.5996 119.6l19.0996 4.2002c2.2002 0.600586 2.7998 2.2002 2.7998 4.2002
791
+ c0 1.90039 -2.7998 3 -4.39941 2.7998l-18.7002 -4.2998c-2.5 12.7002 -3.90039 25.5 -3.90039 38.5c0 37.0996 10.5 73.5996 30.2002 104.9c2.7998 -1.7002 16.1006 -10.8008 18.2998 -10.8008c1.90039 0 3.60059 1.40039 3.60059 3.30078
792
+ c0 3.89941 -14.7002 11.2998 -18 13.5996c28.2002 41.2002 71.0996 70.9004 119.8 81.9004l4.2002 -18.5c0.599609 -2.2002 2.2002 -2.80078 4.2002 -2.80078s3 2.80078 2.7998 4.40039l-4.2002 18.2998c12.2002 2.2002 24.5996 3.60059 37.0996 3.60059
793
+ c37.1006 0 73.3008 -10.5 104.9 -30.2002c-1.90039 -2.7998 -10.7998 -15.7998 -10.7998 -18c0 -1.90039 1.39941 -3.60059 3.2998 -3.60059c3.90039 0 11.2998 14.4004 13.2998 17.7002c41 -27.7002 70.2998 -70 81.7002 -118.2l-15.5 -3.2998
794
+ c-2.5 -0.599609 -2.7998 -2.2002 -2.7998 -4.39941c0 -1.90039 2.7998 -3 4.2002 -2.80078l15.7998 3.60059c2.5 -12.7002 3.89941 -25.7002 3.89941 -38.7002c0 -36.2998 -10 -72 -28.7998 -102.7c-2.7998 1.40039 -14.3994 9.7002 -16.5996 9.7002
795
+ c-2.10059 0 -3.7998 -1.7002 -3.7998 -3.59961zM371.7 337.6c-13 -12.1992 -134.2 -123.699 -137.601 -129.5l-96.5996 -160.5c12.7002 11.9004 134.2 124 137.3 129.301z" />
796
+ <glyph glyph-name="chrome" unicode="&#xf268;" horiz-adv-x="495"
797
+ d="M131.5 230.5l-76.4004 117.4c47.6006 59.1992 119 91.7998 192 92.0996c42.3008 0.299805 85.5 -10.5 124.801 -33.2002c43.3994 -25.2002 76.3994 -61.3994 97.3994 -103l-205.3 10.7998c-58.0996 3.40039 -113.4 -29.2998 -132.5 -84.0996zM164.4 192
798
+ c0 46.2998 37.3994 83.5996 83.5996 83.5996s83.5996 -37.3994 83.5996 -83.5996s-37.3994 -83.5996 -83.5996 -83.5996s-83.5996 37.3994 -83.5996 83.5996zM479.3 281.2c43.5 -111.9 0 -241.9 -107.399 -303.9c-43.4004 -25.2002 -91.3008 -35.3994 -137.801 -32.8994
799
+ l112.101 172.399c31.8994 49 31.2998 112.9 -6.60059 157.2zM133.7 144.4c26.2998 -51.7002 81.8994 -83.3008 139.5 -72.5l-63.7002 -124.801c-118.7 18.2002 -209.5 120.9 -209.5 244.9c0 50.0996 14.9004 96.9004 40.4004 135.9z" />
800
+ <glyph glyph-name="firefox" unicode="&#xf269;" horiz-adv-x="480"
801
+ d="M478.1 212.7c1.30078 -7.10059 1.90039 -14.2998 1.90039 -21.6006v-2.7998c-1.40039 -34 -11.5996 -67 -29.5996 -95.8994c-1 -1.5 -1.80078 -2.90039 -2.7002 -4.30078c2.7002 -7.19922 2.59961 -15.0996 -0.400391 -22.1992
802
+ c-5 -19.4004 -16.5996 -36.4004 -32.8994 -48.1006c-10.8008 -8.7002 -22.7002 -16.2002 -35.3008 -22.0996l-1.89941 -0.900391l-1 -0.5c-1.7002 -0.700195 -3.2998 -1.39941 -4.90039 -2.09961c-2.39941 -5.10059 -5.7998 -9.60059 -9.89941 -13.2998
803
+ c-2.5 -3.10059 -30.1006 -35 -113.801 -35c-23.5996 0 -47.1992 3.5 -69.7998 10.2998c0.799805 -0.299805 1.60059 -0.700195 2.40039 -1c-2.60059 0.899414 -5.2002 1.7998 -7.7002 2.7002c-19.0996 5.89941 -37.2002 14.5996 -53.7998 25.7998
804
+ c-40.7002 24.7002 -72.9004 61.2002 -92.2998 104.7c-14.5 31.3994 -21.1006 65.7998 -19.4004 100.3c-2.7998 -8.2998 -5.2002 -16.7002 -7 -25.2998c0 29.1992 5.5 58.0996 16.2002 85.1992c-5.5 -7.89941 -10.2998 -16.2998 -14.2998 -25.0996
805
+ c5.69922 23.0996 14.6992 45.2002 26.7998 65.5996c3.7002 6.10059 7.89941 11.9004 12.7002 17.1006v0.200195c-0.100586 2.69922 0.0996094 5.5 0.5 8.2998c1.5 16.2998 5.69922 32.2002 12.3994 47.0996l0.299805 0.700195c0.100586 0.299805 0 -1 0 -1.7002
806
+ s-0.0996094 -1.2998 0 -1c0.600586 2 1.40039 4 2.30078 5.90039c1 2.09961 2.39941 4.09961 3.89941 5.7998c0.100586 0.0996094 0.200195 0.200195 0.299805 0.400391c0.100586 0.199219 -0.399414 -2 -0.5 -3.10059v-0.5c0.600586 1.2002 1.30078 2.40039 2.2002 4.5
807
+ c2.10059 5.90039 6 11 11.1006 14.5l0.199219 0.100586c-0.299805 -9 1.2002 -17.9004 4.40039 -26.2002v-0.100586c0.299805 -0.399414 0.5 1.30078 0.900391 1.30078c0.0996094 0 0.199219 -0.100586 0.199219 -0.200195
808
+ c0.900391 -1.7998 1.80078 -3.60059 2.7002 -5.2002c1.2998 -2.2002 2.5 -4.2002 3.7002 -6l0.400391 -0.200195l0.199219 0.100586c2.60059 -4.2002 5.90039 -7.80078 9.7002 -10.9004h-0.200195l0.200195 -0.0996094c18.2998 3.59961 37.2002 2 54.6006 -4.7002
809
+ l0.0996094 0.0996094c2.09961 2.60059 4.59961 4.90039 7.2998 6.90039c0 -0.900391 -0.0996094 -1.7998 -0.200195 -2.7002c4 5 9.10059 9 15 11.5c-0.399414 -0.700195 -0.5 -1.40039 -0.5 -2.2002c7.40039 4.2998 15.5 7.40039 23.9004 9
810
+ c1.09961 0 -3.5 -1.7998 -5.09961 -3.09961c3.69922 1.59961 7.69922 2.59961 11.6992 2.7998c6.60059 0.700195 14 -2.09961 12.6006 -2.7002c-2.7998 -1 -5.5 -2.2002 -8.2002 -3.5c-0.799805 -0.700195 3.2002 0.200195 2.40039 -0.5
811
+ c-14 -9.2002 -24.8008 -22.5996 -30.8008 -38.2998v-0.0996094c2.5 -11 11.4004 -19.3008 22.5 -21.1006c31.5 -3 37.5 -5.59961 38.4004 -9.09961v-1.5c-0.0996094 -1 -0.200195 -1.90039 -0.299805 -2.7998c-1.2002 -6.90039 -4.90039 -13.2002 -10.2002 -17.7002
812
+ c-1.40039 -1.2998 -2.90039 -2.5 -4.5 -3.5c-1.09961 -0.700195 -6.40039 -2.7998 -12.7998 -5.60059c-7.90039 -3.19922 -15.5 -7.09961 -22.7002 -11.5996c-1.2998 -0.799805 -2.40039 -1.7002 -3.40039 -2.7002c-0.399414 -0.399414 -1.19922 -1.5 -1.19922 -1.5
813
+ v-0.0996094c0.5 -1.2002 1 -2.40039 1.19922 -3.7002c-1.39941 1.7002 -2.69922 1.09961 -1.89941 -0.5c0.899414 -2.5 1.2998 -5.2002 1.09961 -7.7998c0.200195 -4.7998 -0.700195 -9.60059 -2.59961 -14c-2.10059 1.5 -4.2998 2.89941 -6.60059 4.09961h-0.199219
814
+ c2.5 -1.59961 4.2998 -3.89941 5.39941 -6.59961c0.700195 -2.2002 -0.299805 -2.7002 -0.299805 -2.7002c-1.40039 2 -3.09961 3.59961 -5.2002 4.7002c-3.09961 1.7998 -8.7998 4.7002 -11.3994 5.7998c-0.300781 -0.200195 -0.5 -0.0996094 -0.800781 -0.200195
815
+ c0.800781 -1.2998 2.10059 -3.7998 2.10059 -3.7998s-1.7998 1.09961 -4.7998 2.59961c-3.90039 -1.7998 -7.2002 -4.89941 -9.30078 -8.69922c-3.5 -7.7002 -3.09961 -16.7002 1 -24.1006c4 -6 9.10059 -11.2002 15 -15.2002
816
+ c0.400391 -0.299805 -3.39941 1.10059 -3.09961 0.800781c4.59961 -3.2002 9.40039 -6.10059 14.4004 -8.60059c1.5 -1 -5 1.2002 -3.40039 0.299805c1.40039 -0.899414 2.7998 -1.69922 4.2998 -2.5c22.9004 -12.0996 38.9004 0.400391 56.4004 2.90039
817
+ c16.7998 3 33.7998 -3.59961 44.2002 -17c6 -8.5 -0.600586 -16.7002 -9 -14h-0.200195c-8.60059 2.90039 -19.1006 -4.2998 -36.6006 -14c-17.2998 -8.2998 -36.8994 -10.5996 -55.5996 -6.59961c-4.7998 0.899414 -9.40039 2.09961 -14 3.69922l-2 0.700195
818
+ l0.200195 -0.299805c8.7998 -12.2002 19.8994 -22.5 32.7998 -30.2998c8.7002 -4.40039 17.9004 -7.5 27.4004 -9.2998c8 -1.90039 16.1992 -2.80078 24.5 -2.80078c61 -0.0996094 110.6 49.4004 110.6 110.4c0.0996094 15.9004 -3.09961 31.7998 -9.2998 46.5
819
+ c20.7002 -12.2998 37.5996 -30.2002 48.7998 -51.5c-13.9004 40.5996 -40.2998 56.4004 -64.7002 76.5996c-19.5996 14.8008 -34.7002 34.9004 -43.3994 57.9004c-25.2002 67.7998 33.0996 132.9 33.0996 132.9s-3.59961 -15.1006 27.4004 -44.3008
820
+ c6.39941 -5.89941 16.7998 -14.5 28.8994 -26.6992c1.7002 9.2998 4.2002 18.3994 7.40039 27.2998c2.5 -14.7002 7.7998 -28.7998 15.3994 -41.6006c11.7002 -16.6992 21.9004 -25.5996 30.7002 -40c1.90039 -2.5 3.7998 -5.19922 5.60059 -7.89941
821
+ c5.09961 -7.2002 9.5 -14.7998 13.2998 -22.7998c6 -12 10.7998 -24.5 14.5 -37.4004c3 -10.4004 4.89941 -20.9004 5.7998 -31.5996c2.90039 3.89941 4.7002 5.89941 4.7002 5.89941s0.700195 -2.59961 1.39941 -7.09961zM179.1 310.3
822
+ c-0.5 -1.2002 -0.899414 -2.2998 -1.2998 -3.5c0.400391 1.2002 0.900391 2.40039 1.2998 3.5z" />
823
+ <glyph glyph-name="opera" unicode="&#xf26a;" horiz-adv-x="496"
824
+ d="M313.9 415.3c-170.2 0 -252.601 -223.8 -147.5 -355.1c36.5 -45.4004 88.5996 -75.6006 147.5 -75.6006c36.2998 0 70.2998 11.1006 99.3994 30.4004c-43.7998 -39.2002 -101.899 -63 -165.3 -63c-3.90039 0 -8 0 -11.9004 0.299805
825
+ c-131.5 6.10059 -236.1 114.601 -236.1 247.7c0 137 111 248 248 248h0.799805c63.1006 -0.299805 120.7 -24.0996 164.4 -63.0996c-29 19.3994 -63.1006 30.3994 -99.2998 30.3994zM415.7 17.5996c-40.9004 -24.6992 -90.7002 -23.5996 -132 5.80078
826
+ c56.2002 20.5 97.7002 91.5996 97.7002 176.6c0 84.7002 -41.2002 155.8 -97.4004 176.6c41.7998 29.2002 91.2002 30.3008 132.9 5c105.899 -98.6992 105.5 -265.699 -1.2002 -364z" />
827
+ <glyph glyph-name="internet-explorer" unicode="&#xf26b;" horiz-adv-x="511"
828
+ d="M483.049 288.294c25.1963 -45.4473 33.2578 -97.5811 26.8516 -141.162h-328.792c0 -100.432 144.31 -136.029 196.818 -47.4355h120.833c-32.5645 -91.7285 -119.689 -146.022 -216.813 -146.022c-35.1367 0 -70.2725 0.143555 -101.695 15.5732
829
+ c-87.3975 -44.4941 -180.251 -56.5693 -180.251 42.0059c0 45.8066 23.2461 107.096 43.9922 145.022c35.1357 63.7227 81.4121 124.875 135.687 173.168c-43.7061 -18.8604 -91.125 -66.2959 -121.977 -101.158c25.877 112.787 129.466 193.638 237.098 186.457
830
+ c130.032 59.7939 209.673 34.1445 209.673 -38.5771c0 -27.4326 -10.5684 -63.2959 -21.4238 -87.8711zM64.5586 101.123c-73.001 -152.4 11.5254 -172.244 100.267 -123.304c-46.5635 27.4326 -82.5557 72.1533 -100.267 123.304zM180.536 209.996h207.961
831
+ c-2 55.1514 -50.5635 94.8711 -103.981 94.8711c-53.7041 0 -101.979 -39.7197 -103.979 -94.8711zM365.072 397.596c46.2764 -18.002 85.9824 -57.2939 112.263 -99.5859c7.1416 18.8604 14.5693 47.8643 14.5693 67.8672c0 32.0049 -22.8525 53.7217 -54.2744 53.7217
832
+ c-23.9951 0 -51.1328 -11.7158 -72.5576 -22.0029z" />
833
+ <glyph glyph-name="contao" unicode="&#xf26d;" horiz-adv-x="512"
834
+ d="M45.4004 143c14.3994 -67.0996 26.3994 -129 68.1992 -175h-79.5996c-18.7002 0 -34 15.2002 -34 34v380c0 18.7002 15.2002 34 34 34h57.7002c-13.7998 -12.5996 -26.1006 -27.2002 -36.9004 -43.5996c-45.3994 -70 -27 -146.801 -9.39941 -229.4zM478 416
835
+ c18.7998 0 34 -15.2002 34 -34v-380.1c0 -18.8008 -15.2998 -34 -34 -34h-52.0996c38.6992 38.3994 60.5996 92.0996 57.3994 163.6l-137.399 -29.5996c-1.7002 -32.5 -12.9004 -63.8008 -57.4004 -73.2002c-24.9004 -5.2998 -45.4004 0.599609 -58.2998 11.7002
836
+ c-15.7998 13.5 -28.4004 31 -49.5 131.199c-21.4004 100.5 -17 121.601 -8.2002 140.301c7.2998 15.2998 23.7002 29.2998 48.2998 34.5996c44.7998 9.40039 67.7002 -14.9004 82.6006 -43.9004l137.1 29.3008c-13.5 34.5996 -31.2998 62.6992 -52.7002 84.0996h90.2002z
837
+ " />
838
+ <glyph glyph-name="500px" unicode="&#xf26e;" horiz-adv-x="447"
839
+ d="M103.3 103.7c-6.5 14.2002 -6.89941 18.2998 7.40039 23.0996c25.5996 8 8 -9.2002 43.2002 -49.2002h0.299805v93.9004c1.2002 50.2002 44 92.2002 97.7002 92.2002c53.8994 0 97.6992 -43.5 97.6992 -96.7998c0 -63.4004 -60.7998 -113.2 -128.5 -93.3008
840
+ c-10.5 4.2002 -2.09961 31.7002 8.5 28.6006c53 0 89.4004 10.0996 89.4004 64.3994c0 61 -77.0996 89.6006 -116.9 44.6006c-23.5 -26.4004 -17.5996 -42.1006 -17.5996 -157.601c50.7002 -31 118.3 -22 160.4 20.1006c24.7998 24.7998 38.5 58 38.5 93
841
+ c0 35.2002 -13.8008 68.2002 -38.8008 93.2998c-24.7998 24.7998 -57.7998 38.5 -93.2998 38.5s-68.7998 -13.7998 -93.5 -38.5c-0.299805 -0.299805 -16 -16.5 -21.2002 -23.9004l-0.5 -0.599609c-3.2998 -4.7002 -6.2998 -9.09961 -20.0996 -6.09961
842
+ c-6.90039 1.69922 -14.2998 5.7998 -14.2998 11.7998v186.8c0 5 3.89941 10.5 10.5 10.5h241.3c8.2998 0 8.2998 -11.5996 8.2998 -15.0996c0 -3.90039 0 -15.1006 -8.2998 -15.1006h-223.2v-132.899h0.299805c104.2 109.8 282.801 36 282.801 -108.9
843
+ c0 -178.1 -244.801 -220.3 -310.101 -62.7998zM166.6 364.5c3.80078 18.7998 145.101 50.7998 238.301 -38.2002c8.5 -7.5 -9.5 -22.7998 -14.3008 -22.7998c-6.59961 0 -84.5996 87.9004 -209.399 40.4004c-10 -3.90039 -15.1006 16.3994 -14.6006 20.5996zM393 33.2998
844
+ c8.09961 8 27.5996 -12.5996 20.7002 -20.3994c-135.601 -135.601 -357.601 -52.1006 -381.601 121.3c-1.5 10.7002 28.9004 15.5 28.9004 3.2998c33 -165 222 -214.1 332 -104.2zM213.6 141.4c0 3.39941 2.30078 4.69922 20.4004 22.5996l-18.2002 18.2002
845
+ c-5.59961 5.59961 7.40039 17.2998 12.4004 17.2998c3.09961 0 2.89941 -0.700195 21.5 -19.5l17.8994 17.9004c6.10059 6.09961 22.5 -8.90039 16.2002 -15.7002l-18.2002 -18.2002l17.3008 -17.2998c7.7998 -7.7998 -5.30078 -18.2002 -10.7002 -18.2002
846
+ c-3.2002 0 -2.7002 0.200195 -22.2998 19.5c-19.7002 -19.7002 -18.5 -19.5 -22.3008 -19.5c-2.39941 0 -5.5 1.40039 -8.5 4.40039c-1.19922 1.19922 -5.5 4.5 -5.5 8.5z" />
847
+ <glyph glyph-name="amazon" unicode="&#xf270;" horiz-adv-x="447"
848
+ d="M257.2 285.3c0 39.2998 5.2002 69.2002 -35.5 69.1006c0 0 -37.9004 0 -54.2002 -49.5l-73.5 6.7998c0 49.2998 46.7002 104.3 134.7 104.3c87.7998 0 112.3 -57 112.3 -82.2998v-147.101c0 -27.5 32.2998 -52.7998 32.2998 -52.7998l-56.7998 -56
849
+ c-9.90039 9.2998 -38.7998 36.6006 -45.2998 46.7998c-45.2002 -70.7998 -183.5 -66.2998 -183.5 43.2002c0 102 120.8 115.7 169.5 117.5zM257.2 198.5v40.5996c-33.7002 -1.09961 -84.2002 -10.5996 -84.2002 -57.7998c0 -50.7998 84.2002 -62.7998 84.2002 17.2002z
850
+ M393.2 35c-7.7002 -10 -70 -67 -174.5 -67s-184.5 71.5 -209 101c-6.7998 7.7002 1 11.2998 5.5 8.2998c73.2998 -44.5 187.8 -117.8 372.5 -30.2998c7.5 3.7002 13.2998 -2 5.5 -12zM433 32.7998c-6.5 -15.7998 -16 -26.7998 -21.2002 -31
851
+ c-5.5 -4.5 -9.5 -2.7002 -6.5 3.7998s19.2998 46.5 12.7002 55c-6.5 8.30078 -37 4.30078 -48 3.2002c-10.7998 -1 -13 -2 -14 0.299805c-2.2998 5.7002 21.7002 15.5 37.5 17.5c15.7002 1.80078 41 0.800781 46 -5.69922c3.7002 -5.10059 0 -27.1006 -6.5 -43.1006z" />
852
+ <glyph glyph-name="houzz" unicode="&#xf27c;" horiz-adv-x="414"
853
+ d="M258.9 117.3h-104.601v-149.3h-154.3v448h109.5v-104.5l305.1 -85.5996v-257.9h-155.699v149.3z" />
854
+ <glyph glyph-name="vimeo-v" unicode="&#xf27d;"
855
+ d="M447.8 294.4c-2 -43.6006 -32.3994 -103.301 -91.3994 -179.101c-60.9004 -79.2002 -112.4 -118.8 -154.601 -118.8c-26.0996 0 -48.2002 24.0996 -66.2998 72.2998c-35.2002 129.2 -50.2002 204.9 -79.2998 204.9c-3.40039 0 -15.1006 -7.10059 -35.2002 -21.1006
856
+ l-21 27.2002c51.5996 45.2998 100.9 95.7002 131.8 98.5c34.9004 3.40039 56.2998 -20.5 64.4004 -71.5c28.7002 -181.5 41.3994 -208.899 93.5996 -126.7c18.7002 29.6006 28.7998 52.1006 30.2002 67.6006c4.7998 45.8994 -35.7998 42.7998 -63.2998 31
857
+ c22 72.0996 64.0996 107.1 126.2 105.1c45.7998 -1.2002 67.5 -31.0996 64.8994 -89.3994z" />
858
+ <glyph glyph-name="black-tie" unicode="&#xf27e;"
859
+ d="M0 416h448v-448h-448v448zM316.5 90.7998l-64.5 184l64.4004 86.6006h-184.9l64.5 -86.6006l-64.5 -184l92.5 -88.7002z" />
860
+ <glyph glyph-name="fonticons" unicode="&#xf280;"
861
+ d="M0 416h448v-448h-448v448zM187 275.1c11.9004 0 16.5996 -4.2998 16.2998 -23l50.7002 6.10059c0 44.5996 -30.5996 52.7998 -64.7002 52.7998c-50.7998 0 -77.2998 -20.4004 -77.2998 -70v-21h-28v-37.4004h22.2002c2.89941 0 5.7998 0 5.7998 -2.2998v-111.399
862
+ c0 -5.60059 -1.5 -7.30078 -6.7002 -7.90039l-21.2998 -2v-25.7002h130.7v25.1006l-43.5 4.09961c-5.2002 0.599609 -3.2002 1.5 -3.2002 7.2998v112.9h55.7002l11.0996 37.2998h-67.3994c-2.90039 0 0.599609 2 0.599609 4.40039v23.2998
863
+ c0 17.5 0.599609 27.3994 19 27.3994zM261.3 33.2998h102.601v25.1006l-15.7002 2.59961c-5.5 0.900391 -2.90039 1.5 -2.90039 7.2998v151.7h-80.2002l-6.69922 -29.5l24.1992 -6.40039c3.80078 -1.19922 6.7002 -3.7998 6.7002 -7.89941v-107.9
864
+ c0 -5.59961 -2.39941 -6.7002 -7.59961 -7.2998l-20.4004 -2.59961v-25.1006zM342.1 288.8l21.9004 24.2002l-3.5 9.59961h-27.7002l-15.5 28h-9.2998l-15.5 -28h-27.7002l-3.5 -9.59961l21.7998 -24.2002l-9 -33.2002l7.30078 -7.2998l31.1992 16.6006l31.2002 -16.6006
865
+ l7.2998 7.2998z" />
866
+ <glyph glyph-name="reddit-alien" unicode="&#xf281;" horiz-adv-x="511"
867
+ d="M440.3 244.5c55.2998 0 73.7002 -74.0996 23.7998 -99.7002c2.2002 -7.89941 3.10059 -16.7002 3.10059 -25.0996c0 -83.7998 -94.4004 -151.7 -210.8 -151.7c-115.9 0 -210.301 67.9004 -210.301 151.7c0 8.39941 0.800781 16.7998 2.60059 24.7002
868
+ c-50.9004 25.5 -32.7002 100.1 22.8994 100.1c15 0 28.7002 -6.2002 38.4004 -16.2998c35.7998 24.7002 83.4004 40.5996 136.3 42.7998l30.4004 137.6c1.2998 4.90039 6.09961 8.40039 11 7.10059l97.3994 -21.6006c6.60059 12.7002 19.9004 22 35.3008 22
869
+ c22.0996 0 39.6992 -18.0996 39.6992 -39.6992c0 -21.6006 -17.6992 -39.7002 -39.6992 -39.7002c-21.6006 0 -39.2002 17.5996 -39.2002 39.2002l-88.2002 19.7998l-27.7002 -124.8c53.2998 -1.7002 101.4 -17.6006 137.101 -42.3008
870
+ c9.69922 9.7002 22.8994 15.9004 37.8994 15.9004zM129.4 139.1c0 -21.5996 17.6992 -39.2998 39.6992 -39.1992c21.6006 0 39.2002 17.5996 39.2002 39.1992c0 22.1006 -17.5996 39.7002 -39.2002 39.7002c-22.0996 0 -39.6992 -17.7002 -39.6992 -39.7002zM343.7 45.5996
871
+ c4 3.5 4 9.7002 -0.100586 13.7002c-3.5 3.5 -9.69922 3.5 -13.1992 0c-29 -29 -121.2 -28.5 -149 0c-3.5 3.5 -9.7002 3.5 -13.2002 0c-4 -4 -4 -10.2002 0 -13.7002c36.3994 -36.3994 139.1 -36.3994 175.5 0zM342.9 99.7998c22 0 39.5996 17.7002 39.6992 39.2002
872
+ c0 22.0996 -17.6992 39.7002 -39.6992 39.7002c-21.6006 0 -39.2002 -17.7002 -39.2002 -39.7002c0 -21.5996 17.5996 -39.2002 39.2002 -39.2002z" />
873
+ <glyph glyph-name="edge" unicode="&#xf282;" horiz-adv-x="512"
874
+ d="M25.7139 219.837c0.111328 0.162109 0.230469 0.323242 0.341797 0.485352c-0.0205078 -0.162109 -0.0449219 -0.323242 -0.0644531 -0.485352h-0.277344zM486.286 204.329l0.000976562 -52.0645h-314.073c1.38379 -128.497 191.392 -124.065 272.255 -67.5713v-104.404
875
+ c-47.3555 -28.5244 -156.774 -53.1709 -240.132 -21.3242c-70.6191 27.1406 -119.913 100.528 -120.743 171.977c-1.10742 92.2188 45.6943 153.422 120.742 188.314c-15.7852 -19.9395 -27.9697 -41.54 -34.3389 -78.9258h175.853
876
+ c10.2471 104.957 -99.4189 104.957 -99.4189 104.957c-103.302 -3.58984 -177.945 -63.6543 -220.375 -124.966c14.5615 114.465 92.9062 219.955 232.837 219.678c85.0195 0 157.605 -39.8779 198.593 -113.265c21.0469 -37.9404 28.8008 -78.373 28.8008 -122.405z" />
877
+ <glyph glyph-name="codiepie" unicode="&#xf284;" horiz-adv-x="472"
878
+ d="M422.5 245.1c30.7002 0 33.5 -53.0996 -0.299805 -53.0996h-10.7998v-44.2998h-26.6006v97.3994h37.7002zM472 95.4004c-42.0996 -91.9004 -121.6 -151.4 -224 -151.4c-137 0 -248 111 -248 248s111 248 248 248c97.4004 0 172.8 -53.7002 218.2 -138.4l-186 -108.8z
879
+ M433.5 82.9004l-60.2998 30.6992c-27.1006 -44.2998 -70.4004 -71.3994 -122.4 -71.3994c-82.5 0 -149.2 66.7002 -149.2 148.899c0 82.5 66.7002 149.2 149.2 149.2c48.4004 0 88.9004 -23.5 116.9 -63.3994l59.5 34.5996c-40.7002 62.5996 -104.7 100 -179.2 100
880
+ c-121.2 0 -219.5 -98.2998 -219.5 -219.5s98.2998 -219.5 219.5 -219.5c78.5996 0 146.5 42.0996 185.5 110.4z" />
881
+ <glyph glyph-name="modx" unicode="&#xf285;"
882
+ d="M356 206.2l36.7002 -23.7002v-214.5l-133 83.7998zM440 373l-83.2002 -134.3l-153.5 96.5l23 37.7998h213.7zM351 230.2l-249.8 -57.7002l-46 29v214.5zM97 153.8l249.7 57.7002l-125 -200.5h-213.7z" />
883
+ <glyph glyph-name="fort-awesome" unicode="&#xf286;" horiz-adv-x="511"
884
+ d="M489.2 160.1c2.59961 0 4.59961 -2 4.5 -4.59961v-219.5h-182.9v96c0 72.5996 -109.7 72.5996 -109.7 0v-96h-182.899v219.5c0 2.59961 2 4.59961 4.59961 4.59961h27.4004c2.59961 0 4.59961 -2 4.59961 -4.59961v-32h36.6006v178.3
885
+ c0 2.60059 2 4.60059 4.59961 4.60059h27.4004c2.59961 0 4.59961 -2 4.59961 -4.60059v-32h36.2998v32c0 2.60059 2 4.60059 4.60059 4.60059h27.3994c2.60059 0 4.60059 -2 4.60059 -4.60059v-32h36.5996v32c0 6 8 4.60059 11.7002 4.60059v111.699
886
+ c-5.40039 2.60059 -9.10059 8.30078 -9.10059 14.3008c0 20.7998 31.4004 20.6992 31.4004 0c0 -6 -3.7002 -11.7002 -9.09961 -14.3008v-4.89941c7.69922 1.7998 15.6992 2.89941 23.6992 2.89941c11.7002 0 22.9004 -4.2998 32.6006 -4.2998
887
+ c8.89941 0 18.8994 4.2998 24 4.2998c2.59961 0 4.59961 -2 4.59961 -4.59961v-60c0 -6.90039 -23.0996 -8 -27.7002 -8c-10.5 0 -20.5 4.2998 -31.3994 4.2998c-8.60059 0 -17.4004 -1.39941 -25.7002 -3.39941v-38c3.7002 0 11.7002 1.39941 11.7002 -4.60059v-32h36.5996
888
+ v32c0 2.60059 2 4.60059 4.60059 4.60059h27.3994c2.60059 0 4.60059 -2 4.60059 -4.60059v-32h36.5996v32c0 2.60059 2 4.60059 4.59961 4.60059h27.4004c2.59961 0 4.59961 -2 4.59961 -4.60059v-178.3h36.6006v32c0 2.59961 2 4.59961 4.59961 4.59961h27.4004z
889
+ M201.1 164.6v64c0 2.60059 -2 4.60059 -4.59961 4.60059h-27.4004c-2.59961 0 -4.59961 -2 -4.59961 -4.60059v-64c0 -2.59961 2 -4.59961 4.59961 -4.59961h27.4004c2.59961 0 4.59961 2 4.59961 4.59961zM347.5 164.6v64c0 2.60059 -2 4.60059 -4.59961 4.60059h-27.4004
890
+ c-2.59961 0 -4.59961 -2 -4.59961 -4.60059v-64c0 -2.59961 2 -4.59961 4.59961 -4.59961h27.4004c2.59961 0 4.59961 2 4.59961 4.59961z" />
891
+ <glyph glyph-name="usb" unicode="&#xf287;" horiz-adv-x="641"
892
+ d="M641.5 192c0 -3.09961 -1.7002 -6.09961 -4.5 -7.5l-89.0996 -53.5c-1.40039 -0.799805 -2.80078 -1.40039 -4.5 -1.40039c-1.40039 0 -3.10059 0.300781 -4.5 1.10059c-2.80078 1.7002 -4.5 4.5 -4.5 7.7998v35.5996h-238.7
893
+ c25.2998 -39.5996 40.5 -106.899 69.5996 -106.899h26.7002v26.7998c0 5 3.90039 8.90039 8.90039 8.90039h89.0996c5 0 8.90039 -3.90039 8.90039 -8.90039v-89.0996c0 -5 -3.90039 -8.90039 -8.90039 -8.90039h-89.0996c-5 0 -8.90039 3.90039 -8.90039 8.90039v26.6992
894
+ h-26.7002c-75.3994 0 -81.0996 142.5 -124.7 142.5h-100.3c-8.09961 -30.5996 -35.8994 -53.5 -69 -53.5c-39.2998 0.100586 -71.2998 32.1006 -71.2998 71.4004s32 71.2998 71.2998 71.2998c33.1006 0 61 -22.7998 69 -53.5c39.1006 0 43.9004 -9.5 74.6006 60.4004
895
+ c40.0996 89.0996 58.0996 82.0996 108.899 82.0996c7.5 20.9004 27 35.6006 50.4004 35.6006c29.5 0 53.5 -23.9004 53.5 -53.5c0 -29.6006 -23.9004 -53.5 -53.5 -53.5c-23.4004 0 -42.9004 14.7998 -50.4004 35.5996h-29.7998
896
+ c-29.0996 0 -44.2998 -67.4004 -69.5996 -106.9h310.1v35.6006c0 3.2998 1.7002 6.09961 4.5 7.7998s6.40039 1.40039 8.90039 -0.299805l89.0996 -53.5c2.7998 -1.10059 4.5 -4.10059 4.5 -7.2002z" />
897
+ <glyph glyph-name="product-hunt" unicode="&#xf288;" horiz-adv-x="512"
898
+ d="M326.3 229.2c0 -20.5 -16.7002 -37.2002 -37.2002 -37.2002h-70.2998v74.4004h70.2998c20.5 0 37.2002 -16.7002 37.2002 -37.2002zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM375.9 229.2
899
+ c0 47.8994 -38.9004 86.7998 -86.8008 86.7998h-119.899v-248h49.5996v74.4004h70.2998c47.9004 0 86.8008 38.8994 86.8008 86.7998z" />
900
+ <glyph glyph-name="mixcloud" unicode="&#xf289;" horiz-adv-x="640"
901
+ d="M424.43 228.271c42.3623 -9.1377 74.4805 -47.0693 74.4805 -92.2002c0 -52.3311 -42.6406 -94.6934 -94.9688 -94.6934h-289.614c-62.5752 0 -113.243 50.668 -113.243 112.966c0 56.7598 42.085 103.554 96.6299 111.582
902
+ c22.9814 67.5586 86.9395 114.074 159.205 114.074c87.2158 0 159.205 -66.7266 167.511 -151.729zM403.941 83.7412c29.0713 0 52.6064 23.5352 52.6064 52.3301c0 22.1494 -14.1211 40.9766 -33.502 48.4531c-1.38477 -8.58301 -3.59961 -17.166 -6.36914 -25.4727
903
+ c-8.01367 -25.6484 -49.0898 -14.2266 -40.1465 13.29c4.15332 12.7373 6.36914 26.0264 6.36914 39.5938c0 69.2197 -56.4834 125.702 -125.979 125.702c-49.8379 0 -94.6934 -29.626 -114.628 -73.9258c19.3809 -4.98438 37.3779 -14.9512 52.0527 -29.3486
904
+ c19.9531 -19.9531 -10.2168 -50.1436 -30.1797 -30.1807c-13.29 13.291 -31.0107 20.7666 -49.8379 20.7666c-39.04 0 -70.8809 -31.5645 -70.8809 -70.6045s31.8408 -70.6035 70.8809 -70.6035h289.614zM639.01 136.071c0 -44.0244 -12.7363 -86.3867 -37.1016 -122.657
905
+ c-4.15332 -6.0918 -10.7979 -9.41406 -17.7197 -9.41406c-16.3174 0 -27.1279 18.8262 -17.4434 32.9492c19.3809 29.3486 29.9033 63.6816 29.9033 99.1221c0 35.4395 -10.5215 69.7725 -29.9033 98.8447c-15.6553 22.8311 19.3613 47.2402 35.1631 23.5342
906
+ c24.3662 -35.9932 37.1016 -78.3564 37.1016 -122.379zM568.13 136.071c0 -31.5654 -9.13672 -62.0215 -26.8564 -88.3252c-4.15332 -6.09082 -10.7988 -9.13574 -17.7207 -9.13574c-17.2012 0 -27.0215 18.9785 -17.4424 32.9473
907
+ c13.0127 19.1045 19.6572 41.2559 19.6572 64.5137c0 22.9805 -6.64453 45.4072 -19.6572 64.5117c-15.7617 22.9863 19.0078 47.0947 35.1631 23.5352c17.7188 -26.0264 26.8564 -56.4834 26.8564 -88.0469z" />
908
+ <glyph glyph-name="scribd" unicode="&#xf28a;" horiz-adv-x="384"
909
+ d="M42.2998 195.3c-16.0996 19 -24.7002 45.9004 -24.7998 79.9004c0 100.399 75.2002 153.1 167.2 153.1c98.5996 1.60059 156.8 -49 184.3 -70.5996l-50.5 -72.1006l-37.2998 24.6006l26.8994 38.5996c-36.5 24 -79.3994 36.5 -123 35.7998
910
+ c-50.6992 0.800781 -111.699 -27.1992 -111.699 -76.1992c0 -18.7002 11.1992 -20.7002 28.5996 -15.6006c23.2998 5.2998 41.9004 -0.599609 55.7998 -14c26.4004 -24.2998 23.2002 -67.5996 -0.700195 -91.8994c-29.1992 -29.5 -85.1992 -27.3008 -114.8 8.39941z
911
+ M360 189.4c33.9004 -40.4004 36.7998 -138.2 -20.2998 -189.601c-39.2002 -33.5996 -82.2002 -44.0996 -133.601 -44.0996c-70.2998 -0.299805 -138.199 25.3994 -190.699 72.2002l-15.4004 13.7998l60.7998 71.7998l35.6006 -27.4004l-33.7002 -39.3994
912
+ c41.7002 -30.9004 92.2002 -47.5 144.1 -47.2998c61.9004 0 104.7 23.5 121.4 64.3994c0.899414 4.2002 1.39941 8.40039 1.39941 12.7002c0 18.7002 -11.1992 20.7002 -28.5996 15.5996c-23.2998 -5.2998 -42.2002 0.5 -56.2998 14.4004
913
+ c-12.4004 11.2998 -19.1006 27.5 -18.4004 44.2998c-0.599609 39.2002 32.4004 69.2002 70.5 67.2002c24.2998 0.799805 47.7002 -9.7998 63.2002 -28.5996z" />
914
+ <glyph glyph-name="bluetooth" unicode="&#xf293;"
915
+ d="M292.6 276.9l-42.8994 -42.9004l-0.299805 86zM249.4 57.0996l0.199219 86l42.9004 -42.8994zM416 188.6c0 -205.6 -71.9004 -252.6 -185.1 -252.6c-113.2 0 -198.9 47 -198.9 252.6c0 205.601 83.4004 259.4 196.6 259.4c113.2 0 187.4 -53.9004 187.4 -259.4z
916
+ M257.5 188.6l79.4004 88.6006l-125.101 134.3v-176.9l-73.7998 73.8008l-27 -26.9004l92.7002 -93l-92.7002 -93l26.9004 -26.9004l73.7998 73.8008l2.2998 -170l127.4 127.5z" />
917
+ <glyph glyph-name="bluetooth-b" unicode="&#xf294;" horiz-adv-x="320"
918
+ d="M196.48 187.977l97.9111 -103.333l-148.552 -148.644l-2.71484 198.284l-86.1113 -86.1113l-31.4053 31.4053l108.061 108.398l-108.061 108.399l31.4053 31.4053l86.1113 -86.1113v206.33l145.981 -156.69zM237.34 290.973l-50.3145 50.3174l0.337891 -100.295z
919
+ M187.363 134.96l-0.337891 -100.294l50.3145 50.3164z" />
920
+ <glyph glyph-name="gitlab" unicode="&#xf296;" horiz-adv-x="512"
921
+ d="M105.2 423.1c0 0 56.5 -174.8 56.5996 -174.8h-132l56.5 174.8c3.2002 8.90039 15.7998 8.90039 18.9004 0zM0.900391 160.3l28.7998 88l226.2 -294l-247.9 184c-6.7998 5.10059 -9.7002 14 -7.09961 22zM161.7 248.3h188.6l-94.2998 -294zM511.1 160.3
922
+ c2.5 -8 -0.299805 -16.8994 -7.19922 -22l-247.9 -184l226.3 294zM425.7 423.1l56.5 -174.8h-132l56.5996 174.8c3.2002 8.90039 15.7998 8.90039 18.9004 0z" />
923
+ <glyph glyph-name="wpbeginner" unicode="&#xf297;" horiz-adv-x="511"
924
+ d="M462.799 125.626c56.2109 -64.3076 4.16211 -157.626 -91.8545 -157.626c-39.6025 0 -78.8242 17.6865 -100.143 50.04c-6.88672 -0.356445 -22.7021 -0.356445 -29.5898 0c-21.3643 -32.4209 -60.624 -50.04 -100.143 -50.04
925
+ c-95.4902 0 -148.349 92.9961 -91.8555 157.626c-79.1387 131.851 31.2646 290.374 206.792 290.374c175.632 0 285.87 -158.626 206.793 -290.374zM123.152 208.598h41.5283v58.0752h-41.5283v-58.0752zM340.332 122.526v23.8389
926
+ c-60.5059 -20.915 -132.355 -9.19824 -187.589 33.9707l0.246094 -24.8965c51.1006 -46.3672 131.746 -57.875 187.343 -32.9131zM189.579 208.598h166.058v58.0752h-166.058v-58.0752z" />
927
+ <glyph glyph-name="wpforms" unicode="&#xf298;"
928
+ d="M448 372.8v-361.7c0 -24.2998 -19 -43.1992 -43.2002 -43.1992h-361.6c-23.9004 0.0996094 -43.2002 18.6992 -43.2002 43.2998v361.6c0 24.1006 18.7998 43.2002 43.2002 43.2002h361.7c24 0 43.0996 -18.7998 43.0996 -43.2002zM410.7 11.2002v361.6
929
+ c0 3 -2.60059 5.7998 -5.7998 5.7998h-9.30078l-110.3 -74.5996l-61.2998 49.9004l-61.2002 -49.9004l-110.3 74.7002h-9.2998c-3.2002 0 -5.7998 -2.7998 -5.7998 -5.7998v-361.7c0 -3 2.59961 -5.7998 5.7998 -5.7998h361.7
930
+ c3.19922 -0.100586 5.7998 2.69922 5.7998 5.7998zM150.2 262v-37h-73.5v37h73.5zM150.2 187.6v-37.2998h-73.5v37.2998h73.5zM161.3 334.9l54 43.6992h-118.5zM371.3 262v-37h-196v37h196zM371.3 187.6v-37.2998h-196v37.2998h196zM286.7 334.9l64.5 43.6992h-118.4z
931
+ M371.3 113v-37.2998h-99.3994v37.2998h99.3994z" />
932
+ <glyph glyph-name="envira" unicode="&#xf299;"
933
+ d="M0 416c477.6 0 366.6 -317.3 367.1 -366.3l80.9004 -81.7002h-26l-70.4004 71.2002c-39 -4.2002 -124.399 -34.5 -214.399 37c-90.2002 71.5 -85.2002 157.1 -137.2 339.8zM79.7002 370c-49.7002 23.5 -5.2002 -9.2002 -5.2002 -9.2002
934
+ c45.2002 -31.2002 66 -73.7002 90.2002 -119.899c31.5 -60.2002 79 -139.7 144.2 -167.7c65 -28 34.1992 -12.5 6 8.5c-28.2002 21.2002 -68.2002 87 -91 130.2c-31.7002 60 -61 118.6 -144.2 158.1z" />
935
+ <glyph glyph-name="glide" unicode="&#xf2a5;"
936
+ d="M252.8 299.4c0 -8.80078 -1.59961 -17.7002 -3.39941 -26.4004c-5.80078 -27.7998 -11.6006 -55.7998 -17.3008 -83.5996c-1.39941 -6.30078 -8.2998 -4.90039 -13.6992 -4.90039c-23.8008 0 -30.5 26 -30.5 45.5c0 29.2998 11.1992 68.0996 38.5 83.0996
937
+ c4.2998 2.5 9.19922 4.2002 14.0996 4.2002c11.4004 0 12.2998 -8.2998 12.2998 -17.8994zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM384 181c0 5.09961 -20.7998 37.7002 -25.5 39.5
938
+ c-2.2002 0.900391 -7.2002 2.2998 -9.59961 2.2998c-23.1006 0 -38.7002 -10.5 -58.2002 -21.5l-0.5 0.5c4.2998 29.4004 14.5996 57.2002 14.5996 87.4004c0 44.5996 -23.7998 62.7002 -67.5 62.7002c-71.7002 0 -108 -70.8008 -108 -123.5c0 -54.7002 32 -85 86.2998 -85
939
+ c7.5 0 6.90039 0.599609 6.90039 -2.30078c-10.5 -80.2998 -56.5 -82.8994 -56.5 -58.8994c0 24.3994 28 36.5 28.2998 38c-0.200195 7.59961 -29.2998 17.2002 -36.7002 17.2002c-21.0996 0 -32.6992 -33 -32.6992 -50.6006c0 -32.2998 20.3994 -54.7002 53.2998 -54.7002
940
+ c48.2002 0 83.3994 49.7002 94.2998 91.7002c9.40039 37.7002 7 39.4004 12.2998 42.1006c20 10.0996 35.7998 16.7998 58.4004 16.7998c11.0996 0 19 -2.2998 36.7002 -5.2002c1.7998 -0.0996094 4.09961 1.7002 4.09961 3.5z" />
941
+ <glyph glyph-name="glide-g" unicode="&#xf2a6;" horiz-adv-x="480"
942
+ d="M407.1 236.8c7.5 -2.89941 40.9004 -55.3994 40.9004 -63.3994c0 -2.90039 -3.7998 -5.80078 -6.7002 -5.80078c-28.3994 4.7002 -41.0996 8.40039 -58.8994 8.40039c-36.3008 0 -61.6006 -10.7998 -93.8008 -27c-8.5 -4.2998 -4.59961 -7.09961 -19.6992 -67.5996
943
+ c-17.4004 -67.6006 -74 -145.4 -151.4 -145.4c-52.7002 0 -85.5 36 -85.5 87.9004c0 28.0996 18.5 79.1992 52.4004 79.2998c11.8994 0 58.5996 -15.4004 58.8994 -27.6006c-0.5 -2.39941 -45.5 -21.7998 -45.5 -61c0 -38.5 73.9004 -34.2998 90.7998 94.6006
944
+ c0 4.7998 1 3.7998 -11 3.7998c-87.2998 0 -138.6 48.7002 -138.6 136.6c0 84.7002 58.2998 198.4 173.4 198.4c70.1992 0 108.399 -29.0996 108.399 -100.6c0 -48.5 -16.5 -93.1006 -23.5 -140.4l0.900391 -0.900391c31.2998 17.7002 56.3994 34.5 93.5 34.5
945
+ c3.7998 0 11.8994 -2.39941 15.3994 -3.7998zM231.8 321.2c2.90039 13.8994 5.5 28.0996 5.60059 42.3994c0 15.4004 -1.40039 28.7002 -20 28.7002c-7.80078 0 -15.6006 -2.59961 -22.6006 -6.7002c-43.7998 -24.0996 -61.7998 -86.3994 -61.7998 -133.399
946
+ c0 -31.2998 10.7002 -73.1006 49 -73.1006c8.7002 0 19.7002 -2.39941 22 7.80078c9.2002 44.6992 18.5 89.5996 27.7998 134.3z" />
947
+ <glyph glyph-name="viadeo" unicode="&#xf2a9;" horiz-adv-x="447"
948
+ d="M276.2 297.5v-0.700195c-17.9004 52.6006 -42.6006 103.4 -70.7998 151.2c43.2998 -29.2002 67 -100 70.7998 -150.5zM308.9 175.8c15.0996 3.10059 29.5 9 42.1992 17c24.5 -58.5996 20.2002 -139.7 -36.3994 -201c-67.7998 -73.8994 -191.9 -74.5996 -259.8 0
949
+ c-108.801 117.8 -31.6006 313.7 129.899 313.7c21.2998 0 42.6006 -3.5 62.5 -10.7002c-6.89941 -13.3994 -11.7002 -28.2002 -13.3994 -43.2998c-15.4004 6.5 -32.3008 9.59961 -49.1006 9.59961c-78 0 -135.399 -66.6992 -135.399 -142.3
950
+ c0 -68.7998 45.5996 -126 111.3 -137.399c98.5 38.3994 116.6 188.199 116.6 280c0 11.6992 0 23.6992 -1 35.3994c12.4004 -36.0996 18.9004 -73.8994 18.9004 -112c0 -86.5 -35.1006 -158.399 -109.3 -205.1l-3.80078 -0.299805
951
+ c80 -1.60059 137.801 61.6992 137.801 139.399c0 19.5 -3.40039 38.7998 -11 57zM418.1 436.3c52 -74 20.9004 -208.6 -58.0996 -208.6c-21.2998 0 -40.2002 11.3994 -55 25.7998c35.0996 19.2998 79.4004 49.2002 99.7002 84.9004
952
+ c2.39941 4.7998 6.5 13.6992 7.2002 19.1992c-19.9004 -44.6992 -70.8008 -79.6992 -118.2 -90.6992c-7.5 11.6992 -12 24.6992 -12 38.7998c0 16.5 8.2002 38.5 20.5996 50.5c34.5 32.8994 84.7998 13.5996 115.8 80.0996z" />
953
+ <glyph glyph-name="viadeo-square" unicode="&#xf2aa;"
954
+ d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM280.7 66.7998c35.3994 38.2998 38.0996 89 22.7998 125.601c-7.90039 -4.90039 -16.9004 -8.60059 -26.4004 -10.5
955
+ c4.80078 -11.4004 6.90039 -23.5 6.90039 -35.7002c0 -48.6006 -36.2002 -88.2002 -86.2002 -87.2002l2.40039 0.200195c46.3994 29.2002 68.2998 74.0996 68.2998 128.2c0 23.7998 -4.09961 47.5 -11.7998 70v0.399414c-2.2998 31.6006 -17.1006 75.7998 -44.2002 94.1006
956
+ c17.5996 -29.9004 33 -61.6006 44.2002 -94.5c0.599609 -7.30078 0.599609 -14.8008 0.599609 -22.1006c0 -57.3994 -11.3994 -151 -72.8994 -175c-41 7.2002 -69.5 42.9004 -69.5 85.9004c0 47.2002 35.7998 88.8994 84.5996 88.8994c10.5 0 21 -1.89941 30.7002 -6
957
+ c1.09961 9.5 4.09961 18.7002 8.39941 27.1006c-12.5 4.59961 -25.7998 6.7002 -39.0996 6.7002c-101 0 -149.2 -122.5 -81.2002 -196.101c42.4004 -46.5996 120 -46.2002 162.4 0zM309 214.3c49.4004 0 68.7998 84.1006 36.2998 130.3
958
+ c-19.3994 -41.5 -50.7998 -29.5 -72.3994 -50c-7.7002 -7.5 -12.9004 -21.2998 -12.9004 -31.5996c0 -8.7998 2.7998 -17 7.5 -24.2998c29.7002 6.89941 61.4004 28.7998 73.9004 56.7002c-0.400391 -3.40039 -3 -9 -4.5 -12c-12.7002 -22.3008 -40.4004 -41 -62.3008 -53
959
+ c9.30078 -9 21.1006 -16.1006 34.4004 -16.1006z" />
960
+ <glyph glyph-name="snapchat" unicode="&#xf2ab;" horiz-adv-x="496"
961
+ d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM417.5 101.1c2.2002 5.30078 -0.900391 9.80078 -4.90039 10.8008c-46.2998 7.59961 -67.0996 55.0996 -68 57.0996
962
+ c-0.0996094 0.0996094 -0.0996094 0.200195 -0.199219 0.299805c-2.40039 5 -3 9.2002 -1.60059 12.5c2.60059 6.2998 12.5 9.40039 19 11.5c1.7